nvidia-settings/0000755000175000017500000000000012242423716014033 5ustar albertoalbertonvidia-settings/src/0000775000175000017500000000000012236467170014631 5ustar albertoalbertonvidia-settings/src/image_data/0000775000175000017500000000000012236467170016704 5ustar albertoalbertonvidia-settings/src/image_data/clock.png0000664000175000017500000003453612236467170020520 0ustar albertoalbertoPNG  IHDRx<ڪN>gAMA7tEXtSoftwareAdobe ImageReadyqe<8IDATxtPKq}ghf0!NZ[%)h*hqȬ$.n8(JowGg5|? ?|W8xhoC8䋑JjbGVVi6xBY(H;Mk *l*?BvjKTF*:Q3ttZ3eY˫(裌J/p:16>6,q~ shdx?t􀝌!Ѩ0X^ZYXƪ:bzv].!" 47岃{֎(o  "k2GZ"11KB%(g(pP3i-xhD[ Wj3T6Z=L1"^E=}fԅpp=_b"ye@tyLȬj&v2<^wʩX|OhhV"/bksCxW$*ygsh{Pzv "0 3|FלT*w l=cDL"(Dj#6 Te̴-r.Evz8FU,Ng^4eHĠGzn"XPQQ+8>Hvs 'MB:NL3wk)E~%E4]oX V!,W:[B.4( ?T-Vahs1s).TE $h,~.V dA#Յm؄a k#29/^8{>;_| [,]oIv@*v^FK45ڦ'8DLp|5Է6663%(b6g=; j i,#mFN6wEVد%4 B|9Sefnigv ϸuA'Onii{{` ǾWL0q4==84++AwJ"T!G/O|a* df"?澐ekon[Ӏ?UWˑj ¬o>c8j5 N}rFl+ D(i(CWyQo%-fjS\&H$z j \^x}^,NCC̈́%L&ѦIΙ]RِH$gnut/tnҨ5Y]f%A'VF ܽ7GwJ"qy<Sniljebb~TdDE; cbc) YKc}zp^ $r5jgDrJjd"#"f]&ϐƯ<݊7o@ >^ K¶.kxӤ h$ =B9BVw>T^Ѣa P{xlSH[ O\˿AGᦀo{- OZa%Ȉ 4R B:uvuB{CZ\멖kjj`RPf-6ob ]ߟwfz K6>>"b62cu&t;FgGp$ɰ0K5xL64#K<:IN$h,B<@ěGxC!>.A+zHIM#3g>;CLLL1~Gܝƺg"XAUQ @RzjJB4,1X,/8\>kśg~(RR>#REBkרO(bhHv䛐FHI&UJYh :q^^^ct YD9RȌ7a D6e;is@UUU < Zxφ nRVkKu=@ ]iw=%aZa]e?$ DFf8qxbc 'JU]]-ug@Z s—\}/yy\~Mq13/G~~>fpNS[[p^,L1`SEXYz{QZvL|JrKv 9YT+ Rq-߃{`ҙzYqUl:n]D)YXpʚ?8£IkQHd9ذPJO`VZo,w!|Ts.K>57&h I.Q[靥=Cqqj,$TX(]X(`)A,hYZ֤9J9Ӕ>hRҦ1P6jA]YH yYswy4M3wa=9{?2rܓ_j,a9s*w|DY[qy[wmeF9NG1d>X2B7ˊ1Cqč )y.B;9HyvwM&uEg_P=_h-+3l7-&ԩS{T)ƅ}кh GF,]P W˙+)3{٨ '¢g`Jx8q dKϔK|[# Igemٛri[nԛ6eaԄ0ߒue>*o*.$y)?`$ nh!ʭ݂2(>]iJF_zp]&6.fL6v!X?_կ. 0.->ŸGDG^g~{p $<$ovD#]/&hV 'NTJ$''i$~;`sL=VLjJHNB>wɒ%bM~V͕zcH}sMM? Kh4kk#,=f $Jj%y%٩{wv~Snè1PC c5^1Rh$Ybpq.!-iIqt̟k$^{>'&HYg8>>^ˋ`|@ FNqVW6p]VNwW7nd`{G;OϸHz#ųXz^zULMS8^bs! LhKц5W|S^~Kf2璲!ˊDQFD`UH& .y%(”գ+ewh2DKCn$Hw2{[lǍ*:yݡuI.^KFm J&POıadv`M&SB榌CyԂz;T˜o Jz) 9suޔd ϝJx\4\3.WW=\e 9-,,Dll솆8M(BO4O+/K:==]8vRu5ƍ=DrȰmPu !!x ~&lŪ嫄޿{/\Ԑ5xݑ0M# !'G5rY­߄aQ| MqΞ=ܾm_kkk.vV'E>k N+z!b谡cHs"ZhmI^^2"gԙ̨C<ӡ#U =ؘD #H6l\ףSX,Yl*dGh178um]mH KFjl` ʹv~-Wz'5SH:|P:;ød1X6KYKxļyƆ/Yȓ*/j+nfs_>V<7'>{F+bV#+"S5Z!Ԡ%:p+ܹsT2GE?dg_F?sF= '3jqԗQ}H"34KY;2/(jNl2vHekgB\8| |Z_vpA&< vw _r !oLfܙ/bg: Ԥ]U ZiǎAɌ-I 464!zŌ]<ӤPBC}f KaƤS r,Ԟ:ԧ[3fݻٳޅ$qN~Jϗx)Mr}%Kr <)^|)}@HCO 1upߡE _d+kYn߯]OՠP`QVl(`EE%~@RJ2̜6c[kk8  &=S<9lQKOkp,t| }sj)e/='B^Z n3/N< @dtpػw/̚5KusU.u/Z`'#Mb5GӐ/g]]].eK1<=]al]FOyyx"ng_$Jn[ɾ΁`,V#"h-8nmKjց&ߝb"k{/˞/%-R,7o8aI/(d g'hN:Mkp'gPWcނ@'$+)a}8g6S x/Ul,O[x xO,|ܹ~Jx}Cy & ugnF"gkZ6"3Z]] 2BOT.TOw_i6y4 /~;s*/zPg&Oa䨲fes+\^bvZJ,;fؠ =2Ζ (J֎6Xx $%%A &#WW9+44EՌreM}`v]jFOayy;(Fhuhrf1M]RU⸜wSEIZ:2L=u+6}xyzSZYYXYZAt Μch8\ ;;;={6@F TU*8øjgDcHJRFeIK&9~>5!jmU3iOUWPHFdrjֵICBVEY!5>8$)&GM :+?050QRQBzcUP+׍z(Qrw>s5q0we4I5121ICWFV %&MpIGu<a}RYSnI;-D|͸ښZ&nuu'0UJ ^ԨL''C23tg#PRX040d>DN(_e5O>fZ斓ݵbRGId8C"N t[zҥ&eeaLXQm=QUDQ3h# ^M &&p`~;zlE#-X ͇sg~bUJ?8~bB'tKoDzkayr`/>u$'\m}lY{[JN<^\^tט2AH,"}oYn1Mcrdpt2,G,]ťRq3^t{{XAAA0w-x0%r(**Ʊt=L[9ujhkk5HF-Ƈl0+qd] =~`O 213mPDu>2eeҒ N}՟ikkkxFFy+ yj=@-lԻCK`6X*1 ~˹ H(&E n@()M;NLox}>t~(ò4Ѻ^N0wQrrDF,a]mۧpH.J&lڸN:ǏgS˖-DUȍkP]UqqѰ}ۖ1ɴqlOH,QW5vގ5]C4g0Oq`.έĨmy0g[ .z `GCl:tݺ f1z1 h򫽽5z ȯLUtHHޑ걑$g$oRnG$y{A A{w%W}=ӤXm:D ojbS&YYPu,-(X&y -RgAa]XR|zD Vu#Ȼz=r \aLdXX5QIBB͠`6Rq,- ҽ*W tbR+XLy}8|4NdbDBLpJ nHݷ#b+U{888X'**Az?%v`8m4tò{JETH6WzT$Q(}{f]GŦC>VMrnARr2R̝3gNQw +y>>cBc}c vWHI2IRTi o Қ*x>bF s]m.e@U9D&VU=<˻ܫ5ZZbu޻1!\T>vh/] 9|CC.g:  Bb{dȠT,Z_^^+ƛiR<=d-T'a 2̬i@D4qS|nqd9h$Ω ǬA1i.AŐ8 c&fl? h>^sB-Zf^k;@f(J+"%+BAjZ֥HqAE(}7@,!@B6HHȾ79{Mw|YfՖGkk7&,@0ݜ羛u+OMxM]:u޼|c6vEd.+*ɾmF7q9}Ƭ èw>Nv !v?TeЏ'ȱF!UPdb%k,zpFZ{ʰm pۗGK~%SĦQBv݆Sh C}ft+;jY<4=ٲtQkZu-iv,`p6~/Ν9-(]#0Lc̵ֳY>4Mڷoϑ̛7`}pATݫ/֋^y-*ˡ;(?K{O4eN}}CUHn>VTW_v Tqyy͍M jR[ϞjeUe5ƛ%zޤfYHfS= D0a cc/e\!@QRhpuq8l iH_Sub'3–qrv hЯW>}y{ԺUUWz 6_>eԹcuf:jh4p zj#ē\`@ ʼn[\ϸA)itBZskW.o[t7VLQ_~gB, >^>ah؝w@=D/o lbr^ h\ r2iagq?_bDnN ,p.'&н @GE'E o*A^<+.-&Fb2̿N)I2i=~ZUF^N5vw޾-}=`k3F=(D4Tvޛu$8뵒R[f>M~hTІLQ[Srb",4lB2ArFw 壄2Rn>\5 @yr@zl" ܋ڶ:!p gSzEJJŢR !̴Mɶ!,zlǂJb/v:"gkhp~nt!=6Gm!ΟKcƍ*E`xSQR02),CwA1r(yǴԋv7Mg @A ;F.'۷ =>qs*`ɓ' 'vRΝY4d֌!Z$$ZYOCŜЛMz?Mg /nLdd5`6ne?ڰt`V]KEwYvg],p=4|H9.ٸw"lZGN/,/CrT <==[ Wo!) iA%lB po eu kŴˮ[bwpR=י{07n{})aq(8)mѤj먮VHKIbN3ج细Q #Z0Sϛ%-_vAЖݔBYYlK-$9L#C3/R_Sf_Ҡ5Ć%*G>JRR;FPkk?= !ny2r?w:y9ǎt4/pjr 62M6r`;BQg䈙!GD0BvuH\]LoJ3^iaRT@=pxhS6rr)F6]I)I .`~Ԭѣ?CyG(33O>˗K|РA&r8ndaJ(Ž*ji˿*)Ck3׾1v߾}b0jw@~Fɩx}ytg}NĄKOU r.]Gf D :$}(y#7&IP)עB`3 _ڝ~-kGYNš/{Xo+q k{zo%YO.BB KD4UP }#r&hGKx }iݨ3 ׼_^NI4t2,[:_8yΝ=CCvvnaNݻv|tP)ASaCX:;Va)&rBNV CSYCW.]+W/K.Cdӧ9I^#(rH8}y ]NӚի hڴiʦW$O8NK/"YgF0(B@"4vPJ/ӱ/{\pf7,$لZDzbbbh*k7hSVǧ @yӔ(\uu?nDQQ]v am#&zJư֊VUL-&k>4 Gp`nshi=zҦ͛9I_, Vw e<AQLأ%_0']yQA=A-ˆ3rmUIBLo2%)"KEjdWL[6%77\'cG5:}&yĈn|nSk87E#zIbin(EM%s9TTbҜ &MY0[h)&MyXBlX :)C5ĩpyl7߲GXeěYŴcN:!Ao& ?kh!\BS'.nT\TLa=BW:hj%#"Fg;2 asq~YU&J")ƞa=(o6k>BU5L8@G̚P~WX֞? nh(ʖ.n:0g3ZM]h0L Mr"k5xA0a/_ kl(/c, 27?+Ri߉4:/6;e>!b@`VFS1X+i.RFI/⠍!_u^bDU1M1Qg[TYQUNޕތR]s gyL Z8|rY' S/,蝟R^I ^WVVN \@q!Q}  )^VdR$r/  !/b!K1KN߶)|cq,κZֈ|*W$39JK[`cc9 tm޲Yf`l;+TY^!iGQ1%utc 1l=>^Qx ?,{Ybq3Fi |RnZ}*z?2`ΩZ:{HNѕ'F;)č`9?!3egeiB_-Wi5ϛG 1QuWLP{s =f4ǟeOaF۷n# h_ǞINjߦW[eGOPtddsTT6G',\g'A`cv e+=U ̧LwLpǎKZ<}m uIp,03cϣ$nhPna^~i?z ?sGwѝ");o&hq{6K~*SI`A1l&[Jk 9cѢEry̧icP5$XZ\\DK15%o8Rh0rg;~ޥ.m@c 65keKJokݓ@2 )5U:2CCKG:?UVMgݵeL%h7왳Α$B#/6 1f ,^@Z܁^V/}D?=PlfHQ쇙Uyz%m% Y<Wj.o@Q,xH}ѩeNa)uRp\A{Mb4}8mۏ3s@nݾ-e~dijXoQKb)ZR~#^|E6#?.!/Fu v |5vL~/>mEeE^L,=Уş:IX f5mk^aƈoOfs$FE&+;|m4dPMMgJ9whS[M?~7bYFԊ+ƞl+lbEݚvQ2ǔd ԪfA٘|=y\|}iMo~/U4iDԱ^AR%I(3\`T&Fߴ?HO/\$4z-{k2h(ɢǏ RɈE?*Ǩۨ͌;rl"ӋcǎNsfw}.f"9N=4: ͹Cړ]14Gų:r5vL3k t23ԦJVꉬM_+ :FolG.BW ӿ$(Œlx.֕ NtA:" |L+\K;Zo)S' ҳpYur+.SN]XڋYCuSM6EZI ޵#5sfWC/mZbzwd\qi&:ctv/we&6]<%9cm_m`X{9N.6eˆ|T[deer)υ01?HURuQ5oP4k(;ĩ6)[Rw gN{xZDH/VUWUˤ%LGA$#F#GKyYT͍ڲ WNJa(7`0cr(ҭk5r-fϚ**zwՇu,[~kj.X*ԤcMU詧 I+ N&u @'~`A]c,34D1Œ ZCQ5`M(Mt.}]RGg=J38îiX,EkI>11F$&J0vIBNĝjS>H}õB9 g brn^LCGj,: :tHp}bi}<ׇ>,vR`kJ_SUHqѽ= ^4hEg]AIG+[YɥEƔlp4ͭ lE4:qeݼ.[W[MY;e1o3lod pݿ{o,qg?Czh#E`0 &mCHa4{kWԲ)V1eT#n KkjZè3r7=׬ե"|y$i=Y*Yn ;Θ G,8w/R'i׈w5 g@VǍٝ5FƵܜ+IIyjtV6źMmX^{MoY'ş"7UD#^16j>êXgf,L XWUG1fvA%ȴ򶉃Vѫ@슒ìCJ uctc~638HÜcjp֭7nݺοs<<}w./+k,휬| j:GTAAU-*Q[E7',6Kڂ4J|:R !' 6"v-b,ݤ7ͺ B6jV"a@<3&B  E@Yv l ,gH+qH-6|it0N;kf>P_?à~0KPgA@ر5Ij͆z+1d(@MZ46o`o6ՅUx3j x Wm'լ a/9*ȗpQQ<(핕Uٔg5֊TMB8١eߺe8%IENDB`nvidia-settings/src/image_data/logo.png0000664000175000017500000001143612236467170020357 0ustar albertoalbertoPNG  IHDR6)~ړbKGD pHYs  tIME  1IDATh޽{tU՝?sMȋ@L  J( eb mX:SZh;SZEZ%PDmx̓In7}9gkq}O O2V|~dO˶. &!4!B  Ѕ@q" Hrնw_QGNe払~x}" ,@}b*w=y _IX̊Co1Ei\xAs)p5yČj&0bWu[OKN|'q]].F0~8JfPs^Aك_Y~W>L?q$g6~p Fgވjm7v@vr&׍ȵfh7-^?ݹYrS}vmu7=rry?}[LZaiG﷖fŖmOR_ۊiʺ*)?O^ga`#wު}vK[/5Zǎ]r%K݁=lwsHL +qe:wy#@g_i]K32󴛯׻Q 233).)a({|Ko1p (]g agVAPXHFbbÅFi_`oT}> )7>/nCxv'?.tKÌ벋_c?$a LaK٠%w;/MgeݼbRʚ/,elP(pM5_v+ ⦧&4sZEJwf?綴ś~9T}öz;h@:tuBi~tQtGV#s m禢`rxT.F$\vGRŧr,K?v=w@7n/G#aNwfU>WP^KҦ:fܓaNf5BRBĭy3ΫgxL r?*R јuYȘ ߎ؛!-&2 M'Ou N3IJ"mVT@`0LwGV{fߨ̺͵no5em4uN@?(px"J,!DFĢ1g% v֬;ޖ6h27}oDyk^ Orgǁ^o0nmT-;9bG<6ZNxur73c o`pɗi493Bɨ,mHl}yN8b\R`T+Y-Ο)&5ZyWTqt5E7# 7 @o(1e #$f&%ScaMnET/$"騥_mr3ay%Eu+]BքUr搤j;sfR0~㥷2/tKQxAFد=p'KPJ3op 'Oza\'KBy- .f͚>o<;G: R4Mw޽)eힰy?z{uNaRJrOl|Cl޼RK[$QvNNW-Z ,K_(F۷oTJ+!Ħ|;J)ܬZZZD">B!cB!n{WRJUTTX2w۶mȱ[l9 |ji]hTd޽<Á7衇cAfΜYÇVVV&?D5uԩSsپ}y/jP.QDNgg'7}˖-;aÆX~믿kJ)o8`^Hk̙+))њ?n666xx`1RʈD"gyG[n}lժU5Mdڴixꫯyyy7gϾ=33fw XA"J$ ,زm۶׮]ɓ'QJbŊ[e@ @"O. |<ؿuʆoHuX Lm]z~ p#Gt:DžƮ]b1(..-rթ#DJ9Q)%erN<:q+++#J)3nwiRJ wEikvqjXf60 Ċ~% X0T]]vx;wT3XL< D4MRh(]2M۶VML˲RjB$۶,khŋ?0n8]vwu2q3"" RbѨݍiA8ݷo_e&e-Y侤$O[[NI1MSJ~?P1yitttLӌ !!-xXtuuu/N O}}}vMM D]GD˚ ԡݻw7qĉiiiƦMf766ill<,H<ZB! RSS(((*++[D0d޽-J~/jjj3f̸#==]0 clۦ &L(IOOnppjhtBsHOOGumDTWpXoii!%%eȚӧߩ_zq\$ )XLojjriu]|>0SN-KMMMH)߿0`8֛H$dɒΞ=KGG|b1ӧPVV6ٶmQ\\̙3]֭[[]]}oooX,Tggg\.%8֨:uTرc L^WTUUUmCBz!MӰm;DgϞ GQ5@J:zx|RRR~GGG@)}WᴮHCCCCggsupiZvvvԔFg!HVJ@/` !fEw4T1Y) J&g\7` ! !RCBLB$JJu2vL\ !a!DJg%i!D*Rvy޼X,??tIENDB`nvidia-settings/src/image_data/slimm.png0000664000175000017500000001400512236467170020533 0ustar albertoalbertoPNG  IHDR88;bKGD pHYs  tIME2 wL"IDATh[usﺮ{8q8I@ZA#VPp#RT R^^(B"&D Q! Rrsbvsls}ne^yN AEȔ\?c~97۷O|U'x6;?~\.d{kk1d C_o>>7w)!p΅xdBX&I2WrqGַpFLG#ROϦYCJs#s"44MaWR \!@=mڢ,W[[S)pΝNwor/}odYv2^_(mK۶O|7_X6јplmm1>>si&I25;>9\,NsK)l<#Ych;w+~ݛO<7nX&Zy羮kE!^w4d)Je%)>uQ !!U0Ұ&8|{~1;W{W|ra%xoZ4P@c-Ur5,}m<|`2Mݶ_c Z+D\::h փUI0.PՁa}sAT"2l 2K 4.m7|Vi%eJI.3uk=PH)B @HIZkm$ڢMdgwg=Id.ZL1 9ELW'xΉd}}4 Ѻg]'AaR菣iH#UdJ p^RP0L e@ @HCޫc ywG!M&w^.ׯ]!sRQCA"@ёv![M(Γ%0_TGpzitwƉ1&0, _r+2.Z*0.,j޹k(3^8P>죤$3H:KoBuN$Wku]=8]Apz}X+u;2 Ѣ>x vq) e-k) l*g 6pp}?}x<}cM|h1w=!$ \㽧nj^,Q*e勤b1x,\( ,g<C) ""!L/vR-IRc -d#bj0V_*Ϋ8]=ugo{NVkA$i3uK^8m C4ck{4xGJ[ZZcFSJcaeYV%}NY4DB$5cڂue&c4?h8D :]}q|LH!8gBb}so|MBA9(%H9TvdL$^Z. )˳Cz] R)Nj%i#mx&w_(K4Y Kgkz2RmYkmB㭭-uKEhlK\NI]Y4y+ɝORʥvmcof8ҬP$P.$ CHhDDYyfU£;au8I]ewQN:?&2E;uewj}Ԣ>kkkK`ae\'IzAjX.q2 4Ste4:`|R c4~pxVPu f*4MCûNu齿$:;Jk4Z\.QJ"Ĵ5Um 6m}I_1H5Hf+wx6Ζ)/"O0"gZu#Q1 "֔E9`63a<S%eY(<ːJ5Y..RJM&)%R2-mT>i(~R!p8)RZ4xF!`@YfYFehfIJg jvn}aAl;vxxχx<9GS\zg>ӝDs8ob!$d2-sb!i=੧D%)E   jv6&]YeYhi.jr|Fk9s1.78Ax{b#">y> FkT!iîN~zŪZXKTwX.W, 꺡jmhX@`Y)EQm#;Цem}jZ-pfgZԌO'nݼ骪ޛ0`Ѧmmv>YWYFi?'~g>@_am[lgA-{{Wq4:xZ\޿tKJ饔N)e4Jf8{W[>e(sB.iG6Rnf9UrUaGBZ-Zy.~b{GyF G-H҂EQWlllx J)/_Ug4+P:WAŘBxɮS%ހTUŽ{+n APfi> E!w'޹z^TuEFcֺmܪZʶmDsq_?p8@퍍0Y!{״$(H$,R),MR*|+WlV.^Ӷ&5ƥƘbUW7cҽ^G!eye$$Ih4: wާ'ͭM,|+V%UUQ5u]9(t((˂yS)mYs~~NU5ݿo/o[kKkmbQι9u=:??Z.C,Y__? ,!ޫ[euƍG|{p/ҽ?kx<&IXtpAZKjVY1Fyޥ`80895ѭ[7~o˲𚪪u]MӤ]~3 ~P^$}c?Wva]k=jmֺ~e9!$yQȢ(T F[i@<\g!jRγ,E1SRJgy٫WN<bSm۲X,ғrjK\˜s6&!]2W*AA)RV)eKK)Mem[ V]CzKQi9a!!q"j|)eB)eH+Rs&^b_/IENDB`nvidia-settings/src/image_data/vdpau.png0000664000175000017500000001707012236467170020536 0ustar albertoalbertoPNG  IHDR<!gAMA a pHYs  tIME  '5qIDATx]y|E*KQd .$ 0oԇcFő0):I@"d_zTE߼7~nvWSΩ6.\$0QN*i{'ipCZ/5n̓o^\RwA5x NדnEEOQ-Dqi)+['Dy) u80`+@ӧ۴E^,,o+:s zb*1YhJo䨛~%Z:NTTV/ lȽC&œ;or9Dtf$*"4 (7x|>u;{%]T{}597tZ#cOU^?s~HJ.18N..].ԥs.v\h~R|^i{msapzsLQ]:ń&= z}ut`{ȿ {FڰhE*D7omRk׮nWٍڿJ4h..kCfdᄦ18Sχ%Ň[FGwS޻@-=8>kC⢌ У"ß ;vgߘ^uM5bW#-;ca3hղ7Y477OUrΡ UjpnphaG@f[]ҨQo1'!aC~5C|c LrOGEEw¹@ڔa!!p#YySЯ8f#+ڵm3Z7 U)-=0 $tsqE&i 1 7jv4E>]/c] Àan`q|R/4x | qm)CtehӦ`/K/9zs0;ݻulpW_/O]>pSoi1^5EjiPhYZ= np2D{%eP`Pr%(6lذaF]wO`ahբŐ+Nqt.`C7# ?Nd{ ᏜB@h2 H20n%;xh-hӠ1 icA1!DjxxجǏS p.!"#ꓶࡵO'7D^U:!)y7 ")2ƌw%4ijyCǏ'3g|m[n tXoaJ0bРD?[oL!ZIR0w4g.+^4Ac4McTؔ8]XVV" 5-6m0 ((,EEF6[O7"zxJ/]jX,v@4F1 1,쥠LlR*WgΜ1>}zet B3 rs;vxZj5 iC}R+Æ@R粟SRּ5(..7qM4]ױ}KUU`0P^^5|3}B@ e̯zN4h4>_[nyZ_xi(CTdP[hJK˲W47=tN"N'~/#77炙= `\r.!!( tU}]Va5*J1-MR "t~¢BjcoT6p}#u}D}pY(]Gp@`Æ 6lذaÆ 6l |:u^7]۶ mڼV b::z=~:i@?H~ c 2z?9|=Ev0h4 Q8TW3SyNehL5A!`plҸd8E/BkP}wZ Bă#᮰mg}AԗoOJL eL@@!wc4^P@FP3+LE5BOݶsgq>}pTVT5 %j TSA_Fi\pJKKġfܑlܴiX<1 A BH pąbBr PVOR- [xw}$98؛]D !D$%nS aGU/R)`9K0FN#Dm)PP5r{A N8d ޿rfW@XU\75cMST7&N4sаސiy]D:9%s.B5*-!rLx-[6msknӟmfM! iӦgϞJ˖-CxU{$ѯoii r:~/ʲS@B;VH̷Zl Αo /l5i@[Q|TqaA۳0¢O|^999߂Hfᖙܽ{PL\&%k*ʼ&3~#Pm& Cn'pY k(@ӦjtE[qsr pz2]BA@ `fJ%d֬#r ZW_yRs~̔L V$$+V:Pk^_}\ضs^(mNoaTݽrT"Ed ,ͳܢbQZZ&**+Duu57f짦^]؄veR7]{X Dvv2̎ӷߗV=%k$T?f|.!p8GymDž#ʅ@ږ-?@nճcNDqIBIꔙ%)``@qHJJʂ<yykJZw-.)(\T~կ"~AAwiP>gOFryyD\צm'. @&ji[qm>߹\nR6rMdE֑#GȘR}mR… kG@ey@0 t696I|>ms_[}1!!sku7$H(`Ԩ~X8s`]7 @ee7ҥۢdVvSJjl͝ g&P%3fPQO0PVWOL]K93UWb#׾ٚcJt$0 S%%%ʮ4(H9ƂC &9ބLE֧ H#7$R|`Aډ'@3a1eʔݟ}ם~hwl@gϜi BA= U!(J"$kRL'pдٶ;OA1jZS@ N )8 L5'xرA&__I @DNns'W' kҡ*fvǘm޲5՗@˗ùhIyϵ2)-) LԞ& \ǎ=Ĥ)7n$,so%KO= d>ss[>lQXxlʋpҥB>ynΝ-IHh8@jBiLPJХ[HJPMsZb;9Ha8d" ,$R[ ?!e{T|nNC4 o]AV6"JJJ3=wy.] o+RԖ]t~{[zzx7&W [u>'YǮ @_a8YCdl.~&;wֵ,sGEF5qbe.l{…vmf3r=6dȄMif֝?|]O)k@Gk4wc?_@h0PSEFFA•2,PӶGZ;w܁|+!JK>?/LG2eJ3gnpa΅Y׿رҵXخ+wDW;Fqp.+<\_ j 9goIY;SfHٽ1ܟZYWڵo7Sv0L-+~>qΆ<(g9`ި^+MФI,>/S[@˕S0QZ u3d;tSmK) (-- h ^x?iXH5UAgff(8qbFyy/RUOع;o۞<˯IlgT"T+׃ Bt%#aC:)yZNſ#&&f+#c& P/^i׾[uX?8~aU8d^gj&+Ϳft:+'V8>E:ՈP륉Oj؏['Զ~WCiӦ>ǟzvsLw%sKy _ stʿ?SiFW١C[B4{;oϚ>&5\ׯϜ6mZT޽񧲳>y(dʆM/^Վl5 ϱ83?4t[j]uuS-8GmVi z{N%ԺT*\RO:xslbj=`?HC _J hpjMh#e_.;?!1;;;h2ε?e&4ʹ4…Fddu+e8 stE`ߜfdIk.??Yk3#g&g^VJ_}8 .1@HʴN+yX٩S̓_'Ƕ9 kO]ɗ؈hR<8fܛcƍ jQJ5h1$pSw) z!X\uL C-  OBqMKK{O߾d^T~␁s[e&\NgVWz8xnټknKt8 k­W7wܮ-z `|ӘB=0IH*_%^6'!3EW[YZA@eۿ@fߍ@d̖ LkYV\C5._ս+rٳ=z4oX!JKK}7ŋ wũcܣG ESBR2wӏi{>EK/^ԩL`P,$knw;Ei[+[Ki>L=M^Tt' @^B`ߖ[`犌g%L`GHJA$1hfL4 D0?2/?"''cù +Г&>IJC,r7<.5$СouyY.r!SֶM VZ:U}++족cڴm%8qMt7[tSNQV3a!f;VuUvoAAa՗JvzC[# :BGnQOij.^%8k¥b  TH %GTۣFs@Ϛ1_ÇAw,,6 8xM @8l^M,4g/(xuJUݤ;IENDB`nvidia-settings/src/image_data/crt.png0000664000175000017500000001566712236467170020221 0ustar albertoalbertoPNG  IHDR:<@噣gAMA7tEXtSoftwareAdobe ImageReadyqe<IIDATxb?>"NP>o^}g)رc~!m2={F_9&O ߾}f?f>+>0{qFf6? ! b4mVrԩs `#` Ł? Ĉ/@:>-x_߿1oxϞ=c67ahGo9$~nkbzׯY~G/@_`ѣ;A32 J {/_wg?W߶m? rr @$@`XrA]=};~~>Y ^~ \hu)? ~SNk>x8~4A_!Ea[ ~cx/? J !.iapͷn^&""o_~2|K`bf_`cZlY,-l>}Œo=^+a~7&o< 1: >==bg 0%XWﻮ@kȵ+PXZbv#X_[ yǫLf>𽴏Չۦ 15uhYZ4aM=VνWoSe~zzNi9lua#3i"`4!܍ /1iÅsHʼ1tiw6&o9b9#~rcp VVreY/do+~0LIQRn~}lv|VaJi"i/;XG5t70J}^_\O?~', =T^Wm@ }rMJĵ;t  F8A<X)m!h?DMvgx֭[KjaaVXzwLXIFdžK8E# \ $;;ӅKFTc; J%M -j$dRoCq.MxAawtI2iUR+m&a䩑oN{B!ﳝF7J/QO!f)*B,Bί^Pcnn̕\n&YcIgCN:ɬ2UKBC\ V!W?j۷̙wXrmxDX{\~F/U(gC$SSdʋp?|"Իy~w5OwDnd*HE譫(b 6=T?~P?z-1E޷v)J[6(&H1QxPbb4фh0!F⋢Q^C*$H0BRhKk/Km3H:v9'm*=O~^SƇIM]]=nu>lvSN  U 9==fMnr.fҥk].Ĩ\[[Sxy8H:4,/nt.NS8R\AcfYVVڑrhĆ\XЁةM. ߡ8ys)T^KŅ֯LRVNqjѪj7i'cVV6jiCm ӨVISfk44<&qw[·gѾ~u)ɘ )ن$hdR?XSyL#*Y{ cTYՔ%%Fnkx.<8(ɏ]ȧ o RfeO6?V@`?३XVǣ&bT> yD0!]K $YW9T r )ȹIÚz#9˯Hd۬HlTguw}9~!hϏG̨̈́2 :x =Aŗ xgbN%L8ɸhMf3Qea#+(M7H[/,l1J+b`1?)蔌ñd9/ϟaαь|ZAKg 7 cEclK(uaZh #NQQPX[ o{+7E0 1D1pZFT\2W旇2k\yF ^ J!zPDNk@ /R`TQ0 Ii!Ċ_Ս1H*+;;o7?Isdy ^h6^VdIKC"4" yFyd[60$n9̏bಲ%v0XW2i.<D8SCOO}ǛNlkCTpH]7e+y϶uھ-4r>]2$c)?/@M TW[L\ Q,D5+2>JA8F w Tn;%}9MEKpM+R™Y[gg5p@͛Nr3 Ls ^EHcǎɅź^>{ -Gȣu3-hj:z7w`_ü6#$vEG>:BO652@;a Y:w;hqS;p m D=чEsە` %i_L,z<ߊ(~:sW8ٵMbVۤCBBL\ .HnBZ!VXZhI,ۉ9<}YBCyy>M.5 =fB+:żO(؍3y{:=&6kIR~+` h y/0=y#?ky` ^zM* P&yCMgƨqalOOO8{<>٦,ᡖ~޾.<$bt]mVty@>6˨nv0裍bb~H%B7<W|oUgMeM:M]jo(%7D+娰IBόT2}kߠC5sꝻ}n<0MEU-!|k(֩fW)Lv!6fB$%Rݒ7x` -U\*CB)I f2BXu2}g''t~S4W dWWy^]i~^G:C,̘F~~2%"BgY`Q=#)tc,yTdaZm 7D6tb4e2ĴڦƞhҳGB 7?mY@'9Ej dn nltԛ0 !,(T>ym>\eEMF+":L"i^b`~leo\UY/d0G]Pzaxa>!N%8nZ*r*d@C1CI-\tb:(-z(R=0S)@w-^&˫6T7v?Lf2q4 u Wؼ|Nm#JKne De$q!Ę0l ϰ}xR mIp1&-L5kR&P.> 鬽l&1[ ۳Zvt>u֦a"K,qLRxs^aLp>h6 mlp \=8%)78 CCx-'.l59Z5vI{~fM<>9M$@"$4:b1OǼThsӫHI`tXp0|g}R=jH\VCf*a&eM)opeV. .j:"l*ԃȧzb4>KtxV m6iKY䄨Rw¦i!&zJk#3t:.Wʛo=>{[?kxO)d6J媆. ^IS2~zt1p7yWh-ǨQ:U1Kh(D=:8x+2x@F T^HQONt4ߞ{wFrWb>-R7li34Hi<Ğ\MHh~BuGЁAIgV zZVD0׿"R? _o\PxBa!ZM'NgAWe0Z&hjjJ֘FB۰ᐰ`Th[ kl[Q& v*N[nn]煫Wܞ)a$і4QA|X׽5=‰@ bq~ղ}1U>e󴴴Hn0MNs4;{KLW~jw85}luޡ&48}2Sop(Lx<.Q.Ƀ"s9`@:)P.Rӧ"dm" ch ĵ8$%to/w>|-DC`ޟ ~Zx_aVC˱*]Yc ~O)aee^OhQgvVryzdK ^F/aKnjr_;zd,Pik&_3ܔ`l3"~|g,Pϟ?x{gs/ oI[;ҼY5t1Ϳߣ@xͥ8}{Bp"1MF`$gb5tj[&:J.Y(RSNKtPdjd=F[:1Švem;G,4P#|9̫x pJCkIENDB`nvidia-settings/src/image_data/rj45_input_pixdata.h0000664000175000017500000001335412236467170022600 0ustar albertoalberto/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static guint8 rj45_input_pixdata_pixel_data[] = { 0x95,0x36,0x36,0x36,0xff,0x92,0x00,0x00,0x00,0x00,0x82,0x36,0x36,0x36,0xff, 0x01,0x00,0x00,0x00,0x00,0x86,0x64,0x64,0x64,0xff,0x84,0x00,0x00,0x00,0x00, 0x86,0x36,0x36,0x36,0xff,0x01,0x00,0x00,0x00,0x00,0x82,0x36,0x36,0x36,0xff, 0x02,0x00,0x00,0x00,0x00,0x64,0x64,0x64,0xff,0x84,0x00,0xff,0x00,0xff,0x01, 0x64,0x64,0x64,0xff,0x84,0x50,0x50,0x50,0xff,0x01,0x36,0x36,0x36,0xff,0x84, 0x9e,0xa5,0x8a,0xff,0x02,0x36,0x36,0x36,0xff,0x00,0x00,0x00,0x00,0x82,0x36, 0x36,0x36,0xff,0x02,0x00,0x00,0x00,0x00,0x64,0x64,0x64,0xff,0x84,0x00,0xff, 0x00,0xff,0x01,0x64,0x64,0x64,0xff,0x84,0x66,0x86,0x9e,0xff,0x01,0x36,0x36, 0x36,0xff,0x84,0x9e,0xa5,0x8a,0xff,0x02,0x36,0x36,0x36,0xff,0x00,0x00,0x00, 0x00,0x82,0x36,0x36,0x36,0xff,0x01,0x00,0x00,0x00,0x00,0x86,0x64,0x64,0x64, 0xff,0x84,0x66,0x86,0x9e,0xff,0x86,0x36,0x36,0x36,0xff,0x01,0x00,0x00,0x00, 0x00,0x82,0x36,0x36,0x36,0xff,0x82,0x00,0x00,0x00,0x00,0x01,0x50,0x50,0x50, 0xff,0x8c,0x66,0x86,0x9e,0xff,0x01,0x50,0x50,0x50,0xff,0x82,0x00,0x00,0x00, 0x00,0x82,0x36,0x36,0x36,0xff,0x82,0x00,0x00,0x00,0x00,0x02,0x50,0x50,0x50, 0xff,0x66,0x86,0x9e,0xff,0x89,0xc7,0xd3,0xdc,0xff,0x03,0x4a,0x6a,0x84,0xff, 0x66,0x86,0x9e,0xff,0x50,0x50,0x50,0xff,0x82,0x00,0x00,0x00,0x00,0x82,0x36, 0x36,0x36,0xff,0x82,0x00,0x00,0x00,0x00,0x03,0x50,0x50,0x50,0xff,0x66,0x86, 0x9e,0xff,0xc7,0xd3,0xdc,0xff,0x88,0x8c,0xa4,0xb6,0xff,0x03,0x4a,0x6a,0x84, 0xff,0x66,0x86,0x9e,0xff,0x50,0x50,0x50,0xff,0x82,0x00,0x00,0x00,0x00,0x82, 0x36,0x36,0x36,0xff,0x82,0x00,0x00,0x00,0x00,0x0e,0x50,0x50,0x50,0xff,0x66, 0x86,0x9e,0xff,0xc7,0xd3,0xdc,0xff,0x8c,0xa4,0xb6,0xff,0x76,0x90,0xa4,0xff, 0xa5,0xb7,0xc5,0xff,0xc3,0xcf,0xda,0xff,0xa5,0xb8,0xc5,0xff,0x84,0x9c,0xb0, 0xff,0x65,0x81,0x99,0xff,0x8c,0xa4,0xb6,0xff,0x4a,0x6a,0x84,0xff,0x66,0x86, 0x9e,0xff,0x50,0x50,0x50,0xff,0x82,0x00,0x00,0x00,0x00,0x82,0x36,0x36,0x36, 0xff,0x82,0x00,0x00,0x00,0x00,0x0e,0x50,0x50,0x50,0xff,0x66,0x86,0x9e,0xff, 0xc7,0xd3,0xdc,0xff,0x8c,0xa4,0xb6,0xff,0x76,0x8f,0xa3,0xff,0xb3,0xc2,0xce, 0xff,0xcf,0xd9,0xe2,0xff,0xa8,0xba,0xc7,0xff,0x7f,0x98,0xac,0xff,0x3f,0x5e, 0x79,0xff,0x8c,0xa4,0xb6,0xff,0x4a,0x6a,0x84,0xff,0x66,0x86,0x9e,0xff,0x50, 0x50,0x50,0xff,0x82,0x00,0x00,0x00,0x00,0x82,0x36,0x36,0x36,0xff,0x82,0x00, 0x00,0x00,0x00,0x0e,0x50,0x50,0x50,0xff,0x66,0x86,0x9e,0xff,0xc7,0xd3,0xdc, 0xff,0x8c,0xa4,0xb6,0xff,0x76,0x8f,0xa3,0xff,0xb3,0xc2,0xce,0xff,0xd7,0xdf, 0xe7,0xff,0xa8,0xba,0xc7,0xff,0x7f,0x98,0xac,0xff,0x3f,0x5e,0x79,0xff,0x8c, 0xa4,0xb6,0xff,0x4a,0x6a,0x84,0xff,0x66,0x86,0x9e,0xff,0x50,0x50,0x50,0xff, 0x82,0x00,0x00,0x00,0x00,0x82,0x36,0x36,0x36,0xff,0x82,0x00,0x00,0x00,0x00, 0x01,0x50,0x50,0x50,0xff,0x83,0x66,0x86,0x9e,0xff,0x06,0x76,0x8f,0xa3,0xff, 0xb3,0xc2,0xce,0xff,0xe0,0xe7,0xec,0xff,0xa8,0xba,0xc7,0xff,0x7f,0x98,0xac, 0xff,0x3f,0x5e,0x79,0xff,0x83,0x66,0x86,0x9e,0xff,0x01,0x50,0x50,0x50,0xff, 0x82,0x00,0x00,0x00,0x00,0x82,0x36,0x36,0x36,0xff,0x82,0x00,0x00,0x00,0x00, 0x84,0x50,0x50,0x50,0xff,0x06,0x76,0x8f,0xa3,0xff,0xb3,0xc2,0xce,0xff,0xea, 0xee,0xf2,0xff,0xa8,0xba,0xc7,0xff,0x7f,0x98,0xac,0xff,0x3f,0x5e,0x79,0xff, 0x84,0x50,0x50,0x50,0xff,0x82,0x00,0x00,0x00,0x00,0x82,0x36,0x36,0x36,0xff, 0x86,0x00,0x00,0x00,0x00,0x06,0x76,0x8f,0xa3,0xff,0xb3,0xc2,0xce,0xff,0xf5, 0xf7,0xf9,0xff,0xa8,0xba,0xc7,0xff,0x7f,0x98,0xac,0xff,0x3f,0x5e,0x79,0xff, 0x86,0x00,0x00,0x00,0x00,0x88,0x36,0x36,0x36,0xff,0x06,0x76,0x8f,0xa3,0xff, 0xb3,0xc2,0xce,0xff,0xfe,0xff,0xff,0xff,0xa8,0xba,0xc7,0xff,0x7f,0x98,0xac, 0xff,0x3f,0x5e,0x79,0xff,0x87,0x36,0x36,0x36,0xff,0x87,0x00,0x00,0x00,0x00, 0x06,0x76,0x8f,0xa3,0xff,0xb3,0xc2,0xce,0xff,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0xff,0x7f,0x98,0xac,0xff,0x3f,0x5e,0x79,0xff,0x8e,0x00,0x00,0x00,0x00, 0x06,0x76,0x8f,0xa3,0xff,0xb3,0xc2,0xce,0xff,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0xff,0x7f,0x98,0xac,0xff,0x3f,0x5e,0x79,0xff,0x8e,0x00,0x00,0x00,0x00, 0x06,0x76,0x8f,0xa3,0xff,0xb3,0xc2,0xce,0xff,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0xff,0x7f,0x98,0xac,0xff,0x3f,0x5e,0x79,0xff,0x8e,0x00,0x00,0x00,0x00, 0x06,0x76,0x8f,0xa3,0xf9,0xb3,0xc2,0xce,0xf9,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0xf9,0x7f,0x98,0xac,0xf9,0x3f,0x5e,0x79,0xf9,0x8e,0x00,0x00,0x00,0x00, 0x06,0x76,0x8f,0xa3,0xe8,0xb3,0xc2,0xce,0xe8,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0xe8,0x7f,0x98,0xac,0xe8,0x3f,0x5e,0x79,0xe8,0x8e,0x00,0x00,0x00,0x00, 0x06,0x76,0x8f,0xa3,0xd4,0xb3,0xc2,0xce,0xd4,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0xd4,0x7f,0x98,0xac,0xd4,0x3f,0x5e,0x79,0xd4,0x8e,0x00,0x00,0x00,0x00, 0x06,0x76,0x8f,0xa3,0xbd,0xb3,0xc2,0xce,0xbd,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0xbd,0x7f,0x98,0xac,0xbd,0x3f,0x5e,0x79,0xbd,0x8e,0x00,0x00,0x00,0x00, 0x06,0x76,0x8f,0xa3,0xa4,0xb3,0xc2,0xce,0xa4,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0xa4,0x7f,0x98,0xac,0xa4,0x3f,0x5e,0x79,0xa4,0x8e,0x00,0x00,0x00,0x00, 0x06,0x76,0x8f,0xa3,0x89,0xb3,0xc2,0xce,0x89,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0x89,0x7f,0x98,0xac,0x89,0x3f,0x5e,0x79,0x89,0x8e,0x00,0x00,0x00,0x00, 0x06,0x76,0x8f,0xa3,0x6c,0xb3,0xc2,0xce,0x6c,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0x6c,0x7f,0x98,0xac,0x6c,0x3f,0x5e,0x79,0x6c,0x8e,0x00,0x00,0x00,0x00, 0x06,0x76,0x8f,0xa3,0x4d,0xb3,0xc2,0xce,0x4d,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0x4d,0x7f,0x98,0xac,0x4d,0x3f,0x5e,0x79,0x4d,0x8e,0x00,0x00,0x00,0x00, 0x06,0x76,0x8f,0xa3,0x2c,0xb3,0xc2,0xce,0x2c,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0x2c,0x7f,0x98,0xac,0x2c,0x3f,0x5e,0x79,0x2c,0x87,0x00,0x00,0x00,0x00 }; static const GdkPixdata rj45_input_pixdata = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 1050, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 80, /* rowstride */ 20, /* width */ 28, /* height */ rj45_input_pixdata_pixel_data /* pixel_data */ }; nvidia-settings/src/image_data/thermal.png0000664000175000017500000003645612236467170021064 0ustar albertoalbertoPNG  IHDRn< pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_F2IIDATxڜпKaϣ'r9DYZ]M8T 6DTC`CX h {o[?h뽿7#"'?uu. CJ28CBTBT->fݞ/H$ 4hƚdSi,͟g 556ױI&8N`Wvws+dYY3a@b 5Nc5$1>>ҿKqE& <"(~\-6'Dc ɹɊ*Ay.^|x?mp]*t&hx`ml'Rڕ#% ԔH^mM奰6g830'LLuMsF/T  !l`"OCCZ&|>/4]{`R~k~hs/?gO H]g1ADP ;v a?<@YD=xEvG{1+,IdYƝeB9XaFOLqƟ74TjVU0<(Zr+Qࡢ:Kj[:5OT:fDg)E @};Cԥwy;NJ\9˫t& c/E|bɉ0ݑ0F8pE]]Z-8᰼|5_x2S>M;aF?v]624\D)$]PKHPօn;n7"|յZ [źkn;02YR2&d`$br [}"S{nu<;uwWoT[[|*0`6xu5uHoak{[N@hاG bp8㱆ffyE2 L4E(zj bzAMb%V h\ vuJ@ϧ71o~`oiP*sJ8ГaY>.~LVԔAghT*Jj jƴYa9/owB \+-da:7 .j2)nYt~TNg FŨ0ɂɌ: 1.XBKG ㇷ] 4Y<9'9/{|G~P}}!Fnn. z=DQc $u LR"L/5Un5yҤ!k~0Ke)5%eU3)0"1! cienaqFEEv: ah-6n0[/\VRR"U|j+8S]RP |?SZ.4k6KK!7`oom6g勋A$''"G4BUE"gLV@),XۄMŷO>2s5-ƈ9^)7C0 F35".X tf|s3{<˞bm}]lPT-spx%T[6߅vPQ3#$A;Ͷm=U{2|f ~>5 DQO2v`~=p89gފ]=zd_/h<\g^Ku $Q )j?Ɛ}xt#8y'4 8I8k8Jc4U mVgjj:&x c FQljh {@)@+qǣ)߈#oQ{ F@xpÉZΤDgLvrCVff(aN$΋.f3 B+iKK`׳8=bucqƈtˇ^}CQXT \.(F)JUei0::yqHVW(cfMg9>7|KR4wN# vPAk5nP B[!5ajG˘hVUej U@ BkpZ Ipl'_8'i5gX}.3]px,R}b!زe3ߩ}FGG<}mpxHcP4 yL^A'l2[\ݯ:\[[k-l~aiVIVd%}n{fwpjT !2ՂP8|p1(S|>Z-mnu=(A$FlVd_ o^/7nGn^ ^`% ˌ OjGB!éOs<86= @}vJSB  rfRØ#w2Q|pB3OuS;/{ 7jG&[HA_?2`2%W(N']X|c7uV]GrO[ɜvRn!;712D4 Ydûr%nQOZ\8|{dλ(XQ>V|>ag΄(v e0 I-3R՟m9v7u{q)vd`ې5/ 5uGa퇐e{ Z'(c\\c||PQ,X ` "H)CNޛ_E&+.G5.](?Udd4AuFάLN:j8Bcé;;7;?啘a1E5 !!xjӨ+pӌkj.FZۻp#!+X,݉Yatt75" z *? M%e !7?ycp:#1 dEiE]gFXz(&kPs/%Q2{5u:1^CzK QI'BoC0J"$FqebߞSx<c(x e=JB8U(@EVzF}Г]!i` ǃ]xG:|A}4h&K,ѭYdoyY]1PJ(* NXlVPJ Gpv"ƐHġ+RVS%0;`P4P"[@+[$6?(G---ojͬEYyޙ *A`@R)%2m)kkjwos_uڵ  0>-`^޹爓Iz8R ^V0u6l(cLaZ[[7!ty^v3^ƠT*ᕼP*J8|1@Dyy r'+ ].(Y3ن8#}yʢPp<FD;qoYocDx=.."X> i22 1smrr'NU&|v]uˊTaV7pS PTPk4HLLe_ܹӢUkAR Y_e W^;3+so__?|'\SC 8OEBU?J8b1g}UoZ|R  ~ݺg4׌ HzOx1FFT8ʲkz{c߂[ǿRV),17lfk8kfϣzx9wll,(ppۚ`Nhj#!8 ]/ 1#aN*8U)[-KH)MPT\bnli3d.16f&ċPc#*^Kp31wnr͂eFFG044Z.(70 I^Pʹ~byyqU \b\T\:6>"66`6idw3gr@PKƫ FN4biQQwL*ġ1 ;j?C(S32T^YjdU < :)bcJn,Lr nfܷkW\\䮉ؘPJqEy~DS  bdd:Zfq =À˗5?qbFTbC`HXf(2S P QYqkw` *֤0)"h!t10"px<.\s@EǕ.p'+$/ iYqVÖM \UUU:ahF# AI+LcSV0tF$P C ljG`^rsQ!y$K8VqZm.--Mk{Q3!w"aj:a)`Cptq=,A iBf2.5A EjJ2 B"B._’z/۶}?p"6SV+8}eE&e)7-h!v a"~f4+9хȪ9}GfD>Y 1رѣq16'5cߢ0VяpO ރ83qbc툌D4=fB"(?tΟ˲^{=12J$? f~7'x"bՏW k4PB46#c~:Ilp#yٝ8CT՜MKoDMylٹuJPw? 7,BsK+FFh`tdITuc8ϯv:/OcgŢ8g>߀|!IPW9 V esmܱ /Wl6}}=ذngÁ+ǃ=wmR3 h4r12:9s0-* oQАz'LJ⑗۷;8B[8q ZOSﻺo{o58t nk}%̦5fw8<x,[*Ptm0K&AF\{ueIT@%='sb["ZJ__Ăl֨8hM-m-8\S 7"#"Q~/FqAєdV 6LƜyؾѾ^beqohlIVk5غu$b /16:q[[( $@&LE{N;h{]$m6(uzw^f yEŸxӍ*JZm##cZVEbb"-7OgX[XLdZDBQ:=$4kK>)[whBL2v3yAѶ^Lgb,6#WCUk4MYfXb9nFBbiQ 6&%(3iPRj }|9=ad 7QW =+*zH% P j**!"B8WnڵjL#</ %}2U`S\"2!2~gat,py WV00+a4X͘ajn^CyJ%+*(á7|k\[[-!?R 0dðlp], t$_ `¸$ޫ94^N'9BF$ZaX`I^^7ޚط6ݷ ZLggCVA$\E__o0dݙ6X fLc@vv6>Sh5 W*3{^zN3 -BȨ#3;n[s;(p@(AxQ={(Gv_&:¾l<CC" EFl6cfllp~çNyǏ^S1+;iIdɇ,_21[v #dU6%*KJ%l dwlB6† lL9YHْOɖl99{GHTJ͌Uo.{ܹsoYT1ƤR}iZ֡py )R))sI),˲%(c/{?k"OnǓ;^7_9nbl"LLMɤiBK?͔Qd:SSH6DvR(J*++CEyϟE桝;w~@H)":|ill$>h$R56o:~RPx<0̔ J)4]Le2jUsBQXpH8,a%BL4%{zbǎ/_ 8 K3Yj&f)%E06>TPF]G(gsߋ2Qzّ}8|555;c@K(l$9o=Bׯ89::8H O]}}wO_h846Te(ygݨ 8 Gb3pf15sߏ~<3#?t d={]_o%sJ Ǜ,}䢌&5M?|Wu+ƘۓG#ሴ,Be^6p5jmf~Ԕ7F,-$xs.8(#s8ơs ^s#[x?ZԨ~XhB[@ cP2^Mx1NK*27 Ϸ՞D"Ja[RۣɈ4-jf" BPT\8cdxa^m]Hcǘ >|555ѫx%KSB pFil7֬^uk HBJ KXH$H)PBxsZ&č4#m6+iAڎp8Hq3PF}ͶZBÓa6v= S0BA')񠨰GEܺu}s_K%sJ1s==DiiWk3ȵ\ IvfNJGhiP09G;y=!A)M^bsό47p#+p 7 ?R)0J!'1>9*,U Yiq }KiŴafG'0CH3  bo@iiJKlViv[wi}-AI0NI+;Nwή.({=M 8G ϏB'a>nJC+GGGDGqը(pRc $W$E~3hRL3L'n=@2D<#axu0 c-c``4s}$aL0#TrtْrpuvK~K K w@W8䣯{vzd 5GWz{z~RTTDB!ܹs1 xW%2{ J[vV% j&ɑˆ#s , Dc>IC!$I%6Yejih@6p8խ¡c]²` a X KJXKګycd{ٷB6lؠg=;2<|caAa:kg1Aee%̓ypd.Nߕ-"+1_eijjfQP&7"mA4nmD86QLOM4M{jg(uT YP:5۠BҴd$rLS,XSyXP9Scطw\SS[Un‘vhr/J\KfH)Y&2"Z&^lk:r a, g(8ƭ[1O"46)X!R iH)Xuks[v+h;~ cjrju%Uʴ,L 7]_IB褄LB a)-Pnt+Z?,ȣ>7Bׇښz w&I!2Si12ߴOn`x l۲ 7ifaNrmnf; d ãcE0M{2O'P=R,jSpoa߾rREI!iYC,E^A//O555Ƣo|3,zPR10yBJ̯F^ Yr=h= !|^p6] 5 >/T Ҍ(/CdrsVͫ-_֯r2L21Zg:U^e )C#DH)GI b|rI_RJ,ژÏYTcx[(PBZ‚e(,,@Cr8pv_=W'&_!x N#mX`!܂֊.ڎcM_ǎf0PYQ nA]mZ^~O ̫a)|wvՋ]\v? 7v pMN'1F4A"eIX ݣã{0iZh_ I(B8bx2N_2B ϡ2:8 ~Tſ$!dڵ|sWt7Q011SOc gx!z˪O:SUo_Q]U뽻sNѰRJ|wbl| _ǯa+A)=߽Ox깝۲N6._ݙ &aǦ?p$T*4ax ,PH!mkC`B)犊EOMW pXX<}z%b4ԯG%Ѳ?8Bihh<3 ]zm~5|o/‘VXi x<ٝ_d܅3} Wlwmt7:K8M5'B۶lç$}_qı >@w2ۦ8 a085kb,ù~;I}^R) a >R[ lRgקYŢ~J{2ns%X| T<r֭\D F!@ѣ(ܹsm△Yh3]L:?|A[DbQlۼs]yfz*KvIf*N{5_ۿ|JK2&M{'ML>D#x}^DQ7[z `Y U?_{ W #J_I Krd;)% : RB5GueeXQ/vPFQ!,p9-E"D#pe65w]S ^i|b:Oz|TWWa8Dv  e`^fQ .Y@>ߞ}{Գ;ݗk/| =t984%K002si áL'ax}: m8tCii Tcd{\eSS[+W? Vy} /Gtņ0114!a-5vϤ\7Y8M4+r=·m[bSObwM]L)̚gR5jE[o!1Sm}1{D;4M0L,Ψ'- (fݣ#󣸤%ƞݿ:ԃ+Y޽7Fwqi PY^ {s3li99~ L^ʂs6MExoOp߿܋ 8,VH (37 0BFCY\nTvCgJœfiQMӓ#ji:`C^ȩ[~t^/ ^ǏyWgZJۻ{ /)%hq t]eZ@$A<>iX(dF*f09eIz5ȊHeY=zo+gJ:"%PY5D" l2+2ii]\OrF-W5pή{:_|B2 E:k)LNvtwUΝs={%^oT,7@wY@ ෽RAa攔@4-H$M!`jzIY()&mVKY$0f-<ɮN}R=i9r)m,\4kAI{azzʥ]wݙH$")/Ҿ+MZ&QJHcc#5MӿtM_t<l8dqR@:W±QP\T^ث@,B"G4S\Odי!zHrMAHu[K%"pHb!`@ @2i`%@)E$#?}#xD(-z?Ui` 6x!sW3d9VΙS[t/_y`!H JKiEfFvZvVy<:| ((XD"驘|-tF2` )஡PtVg;K+B`ٲCޑu꺎 H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs  ~tIME ( rIDATx|ieWu޷gzjA#4K !%2X$J8PM!LK*b"qQl<p,hhu5-~oZ9ABNW}uNo;Z߷oӝwmۺQ³}*2-򼈬)뿮eˋwgv'~"~Xk׮3z]wS"/4Ni8ߞq9F$Irc)45g~ +ĹkTuzשS'om Htv_;to^IL`RT҉fWWslC'TThGm- `׽ zT OMo vQY#<4JX Ex5װ$p)Tq`q~JEb7b_G#@V]Z(@J?3'ŠL $کmޯj:qBVW;s7Ei)B4HQ%ƃ EA!*p$PD R Jd FҊ xHv|(/Eϟ=r@ _w?EQ.ٹ(37<5bdPZUA/WH!neK,tkP)# fv.Hp *D>/L+pDحc|{l7'Ic 1LuLs(eXÈbJz=*D APrO˻e(10$xLj8+VeA`&3t`ș&_"'o8R&)$ ,duoO|}~&rNS& T+]x\Ed,L 3#ي\R IE/H"s6۱]< %@R8(Tԗ 5#%X629$܁S¢xeD$%,8!&)V(a 0'~_i~\2`'O>x;nގW:;qgf05)n( _< yD}5+ԗn-"Blq+"@ǠŘqŨ0P"JZm[2̏ M[.կ[wFn_^D13;;dؿ<6k z Cq PU veXITKS1P?m`}} ꍛ&p5?ᐯj^oG[ߺ;?O}4T4fxLp8i i}/TUU)U p`C)gRo! F;'62T_Np&E9 JP:f<" ?v/ GӲ B~VtlB Q>ƾV`BS7(Q[I7&(G^xtKn-gv;'O<$I_"/.6Axs dQ;,Ab4N/uLQa;*@`oM6̂H= LSuyA  h`?(\Z1p0?}KIz _{HE%6%t(J@ zoP@I|#SADZ窙wCjYW VT`Ȅ~6mP ̠="8,ld3Ak "|CE\+ۃ16qA\|8Sf_HľfZ@7ʓY֢֩QܲypxujUxˡu?Tec#6ޯ֎;_8p^%Tm>՛b%@\dCQϺ'U@[l(< LE&&R0Uqdr+^L4}Q >p`X=~t8mmҡt%ҁb?S(!PɽzߢRI@Txt`֡Wr\b47ahjqq0zT}Ћm3DHϞF:=vCJtqGg?hoo窀p+⫬H 0И8&Q0nR8cpeA>j[1Κ)⃗^rPH7_*n~kQWahI !"SG"RW3 daCl\e1of 03*}k86@C (pG6ZmTSO?/7vm8g6Yo}۰t@!ul7 !pa)?ϿƘ̀m_WYxee%L"m'PUp5!nE /@?jp5k}+{ 1C$iJ%]~kzgϞE߇Q,Pp=Q胀B05L24&uV A9.J|\  ::ӫUZ{A?-\ ATH%xꙧݻvm&REvxq\qqW•$v*աflm^ Ǜ"xn㠮MeBQiX*$+v"RzL,[7Ss2a#OaUTO;18pKQozcm3[n,JBbNk! p?9s~=CežuT52^5CsV3$a@{q T'o5D: ^-"sRI% < "Oag#PDH~DƕMD7L k̆ʬiOa^|PqbF@~3{vʊ-/.^%1.N8_6\~af$8rU*(`ȏz VusnuF{X$%" WF/ |"0 C*Ma-NEEHbtss37極_$F>a7I3cɟƺn5&:Qdj8TdDk:)J8 q}y/NDpeb_᪪}™x;q#;.|!ݷoPJ0a $Kؽچ[W̐S' Xk7&KؚJuiO @nV;>wLoo AT*ⅯQ^yӛ~wgg沋˵ş%?9,''JToar#v|1C/ŀ7|Usڬj *9DWTGq4ćc>'>EB c,Qtwady܅kxmn,0ٳg_Cj T\q_|=PQBF^n$ R-#a~Z!xT1LMߤ 5kno/%q wo޷g_Z\p rѠI,&C \|-ws%?1JK [w*O`#A{;yΥ 8d1ZQf=C. }m8D##~p056^ׯnp ``vkxM_Ї>9}7$8lIǗ/+Zْvee8/ea,_Ӱ(㥅-Z<|ڹ ǣzJBkSIRb~V܊g8rK|9X+h1XJKk5Ȳ1ʢԝ;w"2ʲ|055trxif 72>] ޼=h5r!$tZk ccfdYG?Յm۶ ̕כ'i2P}zinvN}YW ˲ܜzǑ-(w"tfff̌kCp8&]j'+ob nƈrr$ܚ ٻ<8p!$AۡmH,ec\}6'ou}h(y}b}ْ>fTْ i%v[[qQ 3* `҆#TþEhB%D23=;v"Mq\I'IR$I*IkG*1*pk,4&$mPB1*$Nt;YJiQb011@k jTŲDPͰp{y MҹEQ?Z[cf"*ԱIQlj]QѲo3QADJTAo&E/ J*Ƿ?ywx}p]TQ˲p(kI~N/,,n<Uśw)A 3b p:NXW->VXXobm=zKVA44pH*mtmqSG 瞪`N1=V<8[x0 1!,]T+KhT*$̮t(.WRЛa*I_*=tWƕţEt*.];QybMy@DGB0)6ljꡠT"2S?MQLڨ-ֆV.FD?ЋWA.\H7x0 M@kKŋHЮZ mwnMezx̛yzB8|(R1;}{NQw?ǓwY]]cw+ўxBaD/C6{ifkn@`POkYxQFJ8:EYGLXU퇇3gc! ӲHb c A0`[ti#_1|BD4z$ zy?P)KfL 6#Ù557pЕt˙ږH "_//yێc4u`G,J+T;|~9O&7ۑ\n7(*258\CWGMvBRD)s# Q8v8'@kՅ4gOϦө%V"QFô"ċ )% G7֕`tBTE%@]47)oe~N7-K?x9s;~Ql^oUPUcC:{p 8y8gE{n٬/37,]ϦT_=% +^PAzgs('1ƱF3Cx~~Qei6( \n;`''/av\)#(0BCF]I,N1ɪvN4\9ϊ=ϯ"G(AhI֕$I4o׋˿PqD8!/29Av=8jtD\REEE[*%rx\ oᛟ%$20MJjtCGOm<2%*Ѫv(rH9d x0MP:4aLԒ[# G$YRR$lKHJdtyFdb4)kgG%SwB 9Ǹ.1!q|N@z lo?D1lu`rjF}.6pr9al="*2[&&HT rTzr Zi^v(XB0bQ:E!^$%R#/eY^B|ZӃەNWG"xyNl:֮^bt Iق}@Jq/>zo;MxvJCY— LMi`)B 7)tY $uC9Q qۉ_NdE8czHhm  <$%N~m=Mk MB ;8ɥvuڵ+[]ҜRctYu"K|NGXrqaAL# SOsf-GaRUS@d#Y2%,UU-[\tj'gA۹nIN›NfN'$ZjTRssqR`ՉkgAK)ha$!vU35NsҬ),e,R'u=@Y9r06V,7emFftZ#z!K(DHlE%, +lKI"!BȆ66q%P$S71GisJFÊx|=Kx@=''Hv8 G$\>oYaX-27DSdI:IQir: Y" Q\ u? ֞Ӆ=Ucê0?1#) w45F=nYig&[f,g8,TuvÆwZw㷸jvssZ HFcUؽ}3]Arb^㕭?/SkZ3Y^"MtFIX^5ҙwQ5[9\||[r%vöW7L&/x~'N5+#Y:;ݻCźcG라$RWW(atΘDpNvӬo?!MDGGNKNg8t+|7=?x<qi?ӹ`UBC}ks3xbݺ-C yBtL̀ΆLgBQr}MMΟl޼9b L^aVC›ۮ_a?nϷ[q_g4)o8rk V=߽G'?eXk<zƲy οw{ԾBqfU<Z+޹w{xƞxe1 Ƹ҄tI+QUE*ݤ>WꦦKW@- @ EFFNi^B j(J_Y=Q0t|DUUΠjQAI|sV0,w-JBOe1O&od/tttҙ8ޜ@_vX<g.fc_%+3h7AZj-Zje墹>ɶ}o>3ǎٹrзvVAB/FO&in`hB/@y]x2Ͽ?5}+ngr4$e$ "֞AFW>NH&*vV\v:Pq0;)5HBW;!>=?~G@kLZ<̒ ]!. p*D? T4)NSG Yr27n wc 8,ـATtne-(g4$8.ebK'H,8zlRmL6Y++14jBfrդobr8T,j"ڕmGcU|PBqQ̨qoe1Ԁy2gǐ/镌5?01Sҍ<@Z-i[V7̹<0'1I@g&DFYօr}y 3Rf'A|F&Y j..hs?^?ol(?9yq-*]R4vJĭu0$F(%sqNX, $[}Z|Ig3)Yh@9v4wc[Ҵ`gc1+GN,A5*wMӮ\]⁅[FVc8ajZڷ쁁l1"GNuZ|>OrLp,9eU2/Xpɶ='UIVB^"cHAs+}Ғ1pUA ͳ&I(z*N$ʀ$"Aqf(FV;$Nd4o [K?.t!4nZ0bM;hױ⤬7>/n\B*8?Q-u-} LJx8h<7u/;i10m~ru/]HT-{RFZ7٫j7+Щght,*=Hr5ԴQ~qryK=e$Ԉɣm4aAmP>tҭ?~օ=B,gCdSȴh׮a86$wBRUBO c67z-Ӵݻ 2|æv? x㭉pXd U塝bHpD"1jbnVq!,`3/4YYЁ]$a~Xo!wMHP,1 ghbeCC< 0ichzs=UUUQ PWz03CV(ϟ Jxk<5xht=,yf2%\QP)賢}\|^o2o9usѬYi iL#L>rMӾTw2nh0拃mڭgkSfuTUKZavZ>YH<"*c?^+Y98\%4ݢ6j;veImSi&PHRm"MM iZ؉Zq"Kbx%YC(RHCR/oνCSD\OaJl{Ysw2釬E۝ . 63DI/e` "WBnL*hmmZ]]lo<'xdh<7te(ZY[]am5_G6@4 .F`sIkH@Cg@>oD;#8qXy2.\,-~kc=uvn=c t'cםׯYtm`,‰T֜"-peol6ѻc^,Kg l5kl\|{ݴ)4]FsiDnG9lp; zi5ŪyR|N@A' eg0̛oU,hc7¢Q \<,DX1+D9;H]]?H#4+y=T{iݲ,W-QzE{Kvmm%X{,qa`vE& WѲZN]gDgti`.t`ЛK4W_0x *%qr֙:H.]vVf<)Jebł㦶UV m,_/3p??T!@k6ӆ|}ñZ(mxТep_\#R>ʰY(Q-'(鰨5LKBIr;cuq0  dq9MuutuVV@*u9)+rdI EYCKhu42-H&i&eaT{}{{|⥋g}95h8oa342itѡ]&J#46Um[c_붩ԋudv_,UM!k(Wm2E)A{=53apMkhס\~GL+,g)PI ]PE32BLB)zˌ `/LMN?0 "PwfU8 l]VMy|^ _0!+ko \< RsU!vhܚp"+G\`1 SaJoe`4ړ$bmZ6q꿼IEr8-ui_xU{ʍ:j5T=A}z-V^"b(MyX d3ofhVAZXLH9DB7Y|f_:=Uy'sFyp~0ߌe[{p$Cq+g)ghu,|˷~Qft l#BY&SS3h:aq&?t&e ).P**fZd*¹0 6*Q"41jJcU!ϦE!`9 DB莪ϵy3"STm-hrBLe/Oڹ,[-ŏɌX?Z_~ZNFzPWEʶ2rz 2%5l|x9E$x0 +BX(YУcP Dt-#cI x@Pw}I+& ZVYhkxiԣ R{jߕXbBF1ǿUx^r^#}txQ״JX2t*-<э.JdJ'[&ʖeAظ/Wd۫љΤJ˅is.&XNJ$KTuJOXhf.PS(,_쟱*/B$9 C #(VZ],a5l:6 g[LA8WV~gݎc~=Z60pƦZ<Ư޺Bå,+ye|œɒ6=`jqQȊld`oNm@kp3ʂXE*02ÆCvK5ч, &8YLO0evpჁ^ЮAF ; :[; ܑ3+ c^A? -/K<ۇ -[ d</#/MaE 6s8q%hfxm3Llk6 +t [a\־aC@ BӁE@0D zyY6 ˆ*ML%q?VUuvWT^j3dx'7 c sŊ1=Svlb ܆=.oixF,?")n=94iE.f(+g(R:&YͶ8e`\@0>0n[eCCc5 rDF&D LϓK/FW 2  R/6{B#"{Xg~6ln[vW2צ`V4ix4E&ΐ i1UְϜSZoA~-hRP<ȍs A:mg9y&ׁVp QX05a[%I75+ij: 'RW8@1(,K_$LJRN/߳6ZV w_'sAQqs"(JiL0dkpPGgyyݛRiOWpQ1h LuMYd}mvJDoyv,uY~XN"=FpUIM§ȸdm;7;o'_e3RyھΤz/UUzdnJ̤3,DTFm)"++/BGbD߳jo68:];N#'Լu?>o9]e:|{']K449uj*uTU[6k0f444DMMz4" [Vshyqqjmjh\ʙb]$W$J8v$+?ĝO/kjjcp)QD:-֍sĕT*<"$ršKWƖ(UWOXf1Е k4}g>|h~#ʈ{ۨʖrfy/]mwts~'~ 8Ÿ*s?&#ErOn\cSyOkNJՄn(_l1{kjh3uFHw߹;IýOόP-\bwuԅ`<2IMMȭy3iwG7z4#7pFӴ*۱DlU9p#D0E9L4|g!OqRsXQceؿ!s9:U/o3,JZ/6IXz'"4!kyhy:q-~:q|QnX|o~|w%%wI:~Yzٟх /}ħ>Ƶ3h32 |x‚^sn&) |L|zѷytL@eUI4ݳg8 :uEU3uVchrRgwe2ֶ23e}a%RlJ9vuwREZc}֭@<(IZb1oHhp0tѻm۝s|OSV,kZ9kVFƼ^"ݬנHчL*&unE__}qVAUBjD\>Z<+bCÔaik -Z |fdx|SFQjin͛ڥu˃}t76{ώkYM ymڴ79 ԩ7,M]|#Wgɗb/46- Cԝ-嘃/9WF;,bsV|3JXkB>]{^ڸjj<0>Lrhh^yD(Y[]wui#{翰j׮rMїٳSO荞ڂfٷB$G(3'룿_< ۢs#ج0[sfPR<D8ٰRsX=P1'7O%}Az9t79 EM*jU\_[!9t>^7 vH-m?[a[\b:fӿ=5Ym=pN/2W-@Sd{9z $8t,S%y{l5VJ޵U;ݵ6ƱyH %%RJREI_Am&VTCҨ RTB*H!B(  oڻ^{_;ν;%"|5ys #rlfpG)}!(d,1Ek Aj[(sutwSp+I%ө~42T&ёdQՊe;]}pϞkD:4W} Z=Jm}Cmev߮];Yx4$40F>Vm0K [n?W;#Smԩ @忥# I؉O 4$q:r()czf6:v)L td=TuA~p2I&d2s(x*dbZmC[ny'ۢ%R6d")6i A擢24.t\;~/#?+%~bfT R6rbl,fIr $(ف0乍gSO=H ?=:0aT+Uud)K6  #_O-(v!0%p?t͗,Ӈ>x7lFd!*x|O84iw(y=J'6DD<ɓ͓5^jƢf6A TO*%:3=פrզzhQ؟4P<(N+8 hY;.^^Cپ%DfmR*`SKhQ*/T.E'+%[ 稩5H?}Kbi@dyrZ@Ug4,ҊhMݢѫqBUְ}D 66A:٨A V],6VKu& Jm'ӖV OG-Rn4y][~.[fΜx,rGL?g?4e N\ECvIRr```KIwa-OCH~" Ŏd%XzIZkRm ^_W j-:k#—b0,5>Ջ nmCCVB|^Sj=l馛n~iE_XyA^5ZrӧinvRʶHgPށM/ZXk.ZXSnsTX% xvJ~1J%ԹN>xͯϤә;IЁ!UL qq>"ڵ3Rw&O-ȭ&ˆ ]hu<]a2(‘]pT"*Ͽ~޽{xM8\[^i]n 6};g([*Ssboul>RPuG$ Eɞ 7뢄H3s@۶m:trڼi{VbDG@оq_ȠvŅ@MS+,<=>>vVD²'Hcי!5zh@/gFd+Y⒠G#iżA= 3YݐC@, I$X$=M$$q&a\x ۔LVxth^S3Ngޯ mJC>m ^;H$ aGSZVvQu00!4ߢŮSgԠɉzkP s=b:rc"/׳Z}K>T'wZRXdp՛v8pmIU }~RV==It.zH AUfJCcmQsݸ j%i(G2X~"\rlƔN_Kmeyw^ , "K5K< &вItR?*J} ojOQ ZI5Uy.W+AL*"Rl_o݅h^T*AdȴJ)m RS1*&WoKцW?‘-q9.iL=_aVy]ЮQ?ƪftWm(^REEDIfêXҕ+ 89N+㪌l=oo 2Y5k?~;5CY.\T rTkl'SJXMY}@8gh"la1W#ePzgb(9tkHbCÝ,ePRkq).H:.ZY;od/ĠFӹqGW1#t7y"Vlc|,NGzJYY4PJP!΍DS©:zNe sL^2A*$jO: UOFɱFсexMP t%(( l9 +jD-N1=ACz4 E1]4pZ53ݑ.Tcm$XzTr"'No .#ۼV֨?ﯳ#I\E3|)w8iR.TMt広֬Np=,\j;ij-.%it5uAȕ\ş=*g<\HCG ?k'|=?wu? ,sSIia72ՎkRW&=p:tn.#a~aỲ1EFW8?z&''18qc~.Z)fM\(*YNEBjtU[})bK/=z{V$S.pKqZқ_juۅ| IA*THnK# 5(YHUiowRyE*M=OT]VgW+Wl1R2qwǭ|`B/_N' P@]`4:MoХ6]-:xϻT,]Ypǎ;AePg ;K-;:()ٹiIyutdu]Dp Ç?s㯼GV* iy}'\Lw wGGb#m8\@@~lœ5,J./۴Hp]'7f٫ekҤUfm et`]RmOKyZ\rŰ{$p*rJ V٥>vJ^`acrO?qRs< tboww~4!iE9,`}ռB[<uJ!h|aaN<7xOǏs@O~| ad뫱fEi.]i\>{_xy54\-hyvclX)>IR'6߬@Ko~bgLYz8_/Konn6o*t48t&@gfin~5U|')xppp޾vmNチ=wZѬOI;gh  p|sK-w[o8D v ʡݥ^:V-) 8SŲ`ύ{ҾUVu1`{cs)F؉pat<)<$[TD9x}/Bd ͌54hAlhtuzv'xumӦ+ݱhwyʂ =g+,@_֪ӧ9unb1+8𵕖|ֱdډ( Gi}SEhŝ;} c  ,u:/$l?;}A/Xa36G7ᱱ #@4D*8=HKtͿ*$V>ǫTܩJe~-$Ι6Aqkܬ)oS^b ͛{{}C1+ևNZnӮ|8Wu!/8[5~?vAZX+>u.uOT٥:5gY kQ[k\v!6&߶au /Й6OhIKG0x7t:SsB-:SlGggzfW+&蕹٥r̓1׶s upNuj*`* GGGFF[2^IcާƎ_^^N1,rVjZB|[ к6/nV*}}]#8rqvW6qZ= Ё!ty]IYkr``>5A\kIi._@A\5Ѷn35ibof!Xgm)ڙ$qل>.Yq)}mk5_#޺N:1nsMnj߶q\ƴNkv]׮)=+_[(CmIENDB`nvidia-settings/src/image_data/png_to_c_header.sh0000775000175000017500000000751212236467170022350 0ustar albertoalberto#!/bin/sh # #/**** BEGIN - Self compiling script ****\ ## ## This script is meant to generate a header file from ## png image data. The process is to take a png file, ## pass it through gdk-pixbuf-csource and then to ## reformat the generated header by generating c code ## that will include the data array part of the ## cdk-pixbuf-csource header and convert/output a non- ## string version of the same data. ## ## NOTE: This file will be duplicated to generate the ## c code and the first three lines will be ## modified to include a starting (c-style) ## comment block to comment out all the ## scripting, leaving the c-code at the bottom. ## This is done to make sure that compilation ## errors/warnings are tied to the right line ## number. set -e ## ## Make sure we were given a png file. ## if [ "$1" = "" ]; then echo "Usage: $0 " exit 1 fi ## ## Figure out what to name the new header file ## PNG=$1 NAME=`echo $PNG | sed 's/.png/_pixdata/i'` HEADER=${NAME}.h TMP_HEADER="$0.tmp.header.h" echo "PNG : $PNG" echo "NAME : $NAME" echo "HEADER : $HEADER" echo "" ## ## Convert the PNG data to a temporary header ## echo "Converting '$PNG' to temp header '$TMP_HEADER' ..." gdk-pixbuf-csource --struct --name=${NAME} $PNG > $TMP_HEADER || exit 1 ## ## Generate header to include for compilation ## INC_HEADER="$0.inc.header.h" echo "Generating include header '$INC_HEADER' ..." echo "static char tmp_pixel_data[] = " > $INC_HEADER sed -n '/[ \t]*\".*$/ p' $TMP_HEADER | sed 's/,$//' >> $INC_HEADER echo ";" >> $INC_HEADER ## ## Generate the code that will include the header above ## TMP_CODE="$0.code.c" echo "Generating conversion code '$TMP_CODE' ..." L=`wc -l < $0` L=`expr $L - 3` # Skip the first three lines! echo "#include \"$INC_HEADER\"" > $TMP_CODE echo "" >> $TMP_CODE echo "/""**" >> $TMP_CODE echo "" >> $TMP_CODE tail -n $L $0 >> $TMP_CODE ## ## Compile ## TMP_BIN="$0.binary" echo "Compiling conversion app '$TMP_BIN' ..." # Compile Flags CFLAGS="-g -Wall" gcc $CFLAGS -o $TMP_BIN $TMP_CODE RET="$?" > /dev/null if [ "$RET" != "0" ]; then echo "Compilation error" exit 1 fi ## ## Execute code to do conversion. ## echo "Converting $TMP_HEADER => ${HEADER}_MID ..." ./$TMP_BIN > ${HEADER}_MID ## ## Generate final header ## echo "Generating final header '$HEADER' ..." head -n 2 $TMP_HEADER > $HEADER echo "static guint8 ${NAME}_pixel_data[] = {" >> $HEADER cat ${HEADER}_MID >> $HEADER echo "" >> $HEADER echo "};" >> $HEADER REGEXP="s/^ \(.*\/\* pixel_data.*\)/ ${NAME}_pixel_data \/\* pixel_data \*\//" # gdk-pixbuf-csource adds 2 extra empty lines so get rid of one of them. L=`wc -l < $TMP_HEADER` M=`tail -n 2 $TMP_HEADER | grep '^[ \t]*$' | wc -l` L=`expr $L - $M` head -n $L $TMP_HEADER | \ sed -n '/^ \"/ !p' | \ sed -n '/^\// !p' | \ sed -e "$REGEXP" >> $HEADER ## ## Cleanup ## rm -rf $TMP_HEADER $INC_HEADER $TMP_CODE ${HEADER}_MID $TMP_BIN echo "" echo "Created '${HEADER}'" exit \***** END - Self compiling script *******/ #include int main(int argc, char **argv) { char *data = tmp_pixel_data; size_t len = sizeof(tmp_pixel_data) -1; // -1 for string terminator '\0' size_t i; int output = 0; printf(" "); for ( i = 0; i < len; i++ ) { printf("0x%.2x", (0xFF & *data)); output++; if ( i+1 < len ) { printf(","); } if ( output >= 15 ) { output = 0; printf("\n "); } data++; } return 0; } nvidia-settings/src/image_data/led_grey.png0000664000175000017500000000675012236467170021214 0ustar albertoalbertoPNG  IHDRh pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3gAMA|Q cHRMz%u0`:o_FIDATx ̿*zbe10 1Edd>m }H"Off~끃;v /(( L>d~:Ǐ!*+nmm_CC|1 F)` /HBpyС[/ocZksZ+Ƙ9Z#ƈ$RJBr! Ix !<["(\r؃-H4"*t o6оHT*"H6y[Lg `_u_8BJ TSŏ8#뺎q3")# }xǺYU-ˢmLt! mo\m"y<RURebjz/\]xM&/i&~.Nϊ8vIIENDB`nvidia-settings/src/image_data/logo_tall_pixdata.h0000664000175000017500000035355512236467170022563 0ustar albertoalberto/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static guint8 logo_tall_pixdata_pixel_data[] = { 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xaa,0xff,0xff,0xff,0x00, 0x87,0x00,0x00,0x00,0x00,0x14,0x26,0x37,0x07,0x00,0x1f,0x2b,0x06,0x00,0x36, 0x4c,0x0d,0x00,0x47,0x64,0x11,0x00,0x3f,0x57,0x11,0x00,0x53,0x72,0x17,0x00, 0x66,0x88,0x1f,0x00,0x5d,0x77,0x25,0x00,0x64,0x7f,0x2a,0x00,0x61,0x75,0x31, 0x00,0x2a,0x33,0x13,0x00,0x3b,0x4a,0x1c,0x00,0x45,0x56,0x21,0x00,0x46,0x57, 0x22,0x00,0x3e,0x4e,0x1e,0x00,0x27,0x31,0x12,0x00,0x69,0x80,0x39,0x00,0x48, 0x59,0x23,0x00,0x36,0x44,0x19,0x00,0x3f,0x4d,0x22,0x00,0x87,0x00,0x00,0x00, 0x00,0x07,0x03,0x06,0x01,0x08,0x41,0x58,0x12,0x66,0x6a,0x81,0x2d,0x78,0x64, 0x7d,0x2b,0x77,0x65,0x7e,0x2b,0x77,0x66,0x7e,0x2d,0x78,0x67,0x7e,0x30,0x79, 0x82,0x68,0x7e,0x31,0x7a,0x1b,0x68,0x7f,0x31,0x7b,0x69,0x80,0x33,0x7b,0x6a, 0x82,0x34,0x7c,0x6c,0x84,0x35,0x7d,0x6d,0x85,0x35,0x7d,0x6f,0x87,0x36,0x7e, 0x6f,0x87,0x38,0x7e,0x71,0x8a,0x37,0x7f,0x72,0x8a,0x38,0x80,0x73,0x8b,0x39, 0x80,0x75,0x8c,0x39,0x81,0x76,0x8f,0x39,0x82,0x77,0x90,0x3a,0x83,0x78,0x91, 0x3a,0x83,0x78,0x92,0x3b,0x84,0x78,0x91,0x3c,0x85,0x79,0x92,0x3c,0x85,0x79, 0x92,0x3d,0x86,0x7e,0x99,0x3e,0x86,0x7f,0x9b,0x3f,0x87,0x83,0xa1,0x3f,0x88, 0x86,0xa7,0x40,0x88,0x85,0xa4,0x40,0x88,0x82,0x9f,0x41,0x89,0x87,0xa6,0x41, 0x89,0x87,0xa8,0x41,0x89,0x87,0xa9,0x41,0x8a,0x82,0x88,0xa9,0x42,0x8b,0x09, 0x88,0xa9,0x42,0x8c,0x8a,0xab,0x43,0x8c,0x8e,0xae,0x44,0x8d,0x8e,0xb0,0x44, 0x8d,0x8e,0xb1,0x42,0x8e,0x8f,0xb2,0x41,0x8e,0x90,0xb5,0x43,0x8f,0x9e,0xc1, 0x48,0x94,0x50,0x6a,0x19,0x65,0x98,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff, 0x00,0x87,0x00,0x00,0x00,0x00,0x15,0x26,0x37,0x07,0x00,0x1f,0x2b,0x06,0x00, 0x36,0x4c,0x0d,0x00,0x47,0x64,0x11,0x00,0x3f,0x57,0x11,0x00,0x53,0x72,0x17, 0x00,0x66,0x88,0x1f,0x00,0x5d,0x77,0x25,0x00,0x64,0x7f,0x2a,0x00,0x61,0x75, 0x31,0x00,0x2a,0x33,0x13,0x00,0x3b,0x4a,0x1c,0x00,0x45,0x56,0x21,0x00,0x46, 0x57,0x22,0x00,0x3e,0x4e,0x1e,0x00,0x27,0x31,0x12,0x00,0x69,0x80,0x39,0x00, 0x48,0x59,0x23,0x00,0x36,0x44,0x19,0x00,0x42,0x52,0x23,0x00,0x02,0x03,0x00, 0x00,0x86,0x00,0x00,0x00,0x00,0x07,0x02,0x07,0x00,0x29,0x8d,0xb2,0x40,0xfb, 0xf6,0xff,0xa8,0xff,0xe7,0xff,0x9c,0xff,0xe8,0xff,0x9d,0xff,0xe8,0xff,0x9f, 0xff,0xe9,0xff,0xa2,0xff,0x83,0xea,0xff,0xa3,0xff,0x83,0xea,0xff,0xa4,0xff, 0x8a,0xea,0xff,0xa5,0xff,0x06,0xea,0xff,0xa6,0xff,0xea,0xff,0xa7,0xff,0xea, 0xff,0xa6,0xff,0xeb,0xff,0xa6,0xff,0xea,0xff,0xa6,0xff,0xe9,0xff,0xa6,0xff, 0x83,0xe9,0xff,0xa8,0xff,0x03,0xea,0xff,0xa7,0xff,0xe8,0xff,0xa7,0xff,0xe8, 0xff,0xa8,0xff,0x83,0xe9,0xff,0xa9,0xff,0x02,0xe8,0xff,0xa9,0xff,0xe9,0xff, 0xa8,0xff,0x82,0xe7,0xff,0xa6,0xff,0x06,0xe6,0xff,0xa5,0xff,0xe5,0xff,0xa3, 0xff,0xe4,0xff,0xa1,0xff,0xf4,0xff,0xad,0xff,0x76,0x90,0x3e,0xc9,0x00,0x00, 0x00,0x02,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x87,0x00,0x00, 0x00,0x00,0x16,0x26,0x37,0x07,0x00,0x1f,0x2b,0x06,0x00,0x36,0x4c,0x0d,0x00, 0x47,0x64,0x11,0x00,0x3f,0x57,0x11,0x00,0x53,0x72,0x17,0x00,0x66,0x88,0x1f, 0x00,0x5d,0x77,0x25,0x00,0x64,0x7f,0x2a,0x00,0x61,0x75,0x31,0x00,0x2a,0x33, 0x13,0x00,0x3b,0x4a,0x1c,0x00,0x45,0x56,0x21,0x00,0x46,0x57,0x22,0x00,0x3e, 0x4e,0x1e,0x00,0x27,0x31,0x12,0x00,0x69,0x80,0x39,0x00,0x48,0x59,0x23,0x00, 0x35,0x43,0x19,0x00,0x41,0x52,0x21,0x00,0x46,0x59,0x1e,0x00,0x23,0x2a,0x14, 0x00,0x85,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x39,0x88,0xab,0x45,0xf2, 0xeb,0xff,0xa9,0xff,0xda,0xff,0x9c,0xff,0x82,0xdb,0xff,0x9c,0xff,0x82,0xdb, 0xff,0x9b,0xff,0x86,0xdb,0xff,0x9c,0xff,0x85,0xdb,0xff,0x9d,0xff,0x83,0xdb, 0xff,0x9c,0xff,0x01,0xdb,0xff,0x9d,0xff,0x84,0xdc,0xff,0x9e,0xff,0x02,0xdc, 0xff,0x9d,0xff,0xdc,0xff,0x9e,0xff,0x83,0xdc,0xff,0x9f,0xff,0x82,0xdc,0xff, 0x9e,0xff,0x85,0xdc,0xff,0x9f,0xff,0x03,0xdc,0xff,0x9e,0xff,0xdc,0xff,0x9d, 0xff,0xdb,0xff,0x9b,0xff,0x82,0xdb,0xff,0x9c,0xff,0x04,0xda,0xff,0x99,0xff, 0xea,0xff,0xa5,0xff,0x79,0x90,0x44,0xc7,0x00,0x00,0x00,0x0f,0x97,0x00,0x00, 0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x17,0x26,0x37, 0x07,0x00,0x1f,0x2b,0x06,0x00,0x36,0x4c,0x0d,0x00,0x47,0x64,0x11,0x00,0x3f, 0x57,0x11,0x00,0x53,0x72,0x17,0x00,0x66,0x88,0x1f,0x00,0x5d,0x77,0x25,0x00, 0x64,0x7f,0x2a,0x00,0x61,0x75,0x31,0x00,0x2a,0x33,0x13,0x00,0x3b,0x4a,0x1c, 0x00,0x45,0x56,0x21,0x00,0x46,0x57,0x22,0x00,0x3e,0x4e,0x1e,0x00,0x27,0x31, 0x12,0x00,0x69,0x80,0x39,0x00,0x48,0x59,0x23,0x00,0x35,0x43,0x19,0x00,0x3d, 0x4c,0x1f,0x00,0x67,0x80,0x32,0x00,0x78,0x93,0x43,0x00,0x22,0x2d,0x0d,0x00, 0x84,0x00,0x00,0x00,0x00,0x06,0x00,0x01,0x00,0x41,0x8c,0xac,0x4a,0xf4,0xeb, 0xff,0xac,0xff,0xdc,0xff,0x9e,0xff,0xdd,0xff,0x9f,0xff,0xdc,0xff,0x9f,0xff, 0x82,0xdd,0xff,0x9f,0xff,0x01,0xdd,0xff,0xa0,0xff,0x87,0xdd,0xff,0xa1,0xff, 0x01,0xdd,0xff,0xa0,0xff,0x82,0xdd,0xff,0xa1,0xff,0x82,0xde,0xff,0xa1,0xff, 0x05,0xdd,0xff,0xa1,0xff,0xde,0xff,0xa1,0xff,0xdd,0xff,0xa1,0xff,0xde,0xff, 0xa1,0xff,0xdd,0xff,0xa1,0xff,0x82,0xdd,0xff,0xa0,0xff,0x0a,0xdd,0xff,0xa1, 0xff,0xdd,0xff,0xa2,0xff,0xdd,0xff,0xa0,0xff,0xdd,0xff,0xa1,0xff,0xdd,0xff, 0xa0,0xff,0xde,0xff,0xa0,0xff,0xde,0xff,0xa2,0xff,0xde,0xff,0xa3,0xff,0xde, 0xff,0xa1,0xff,0xdd,0xff,0xa0,0xff,0x83,0xdd,0xff,0x9f,0xff,0x83,0xdd,0xff, 0xa0,0xff,0x04,0xdc,0xff,0x9e,0xff,0xee,0xff,0xab,0xff,0x7f,0x96,0x4c,0xca, 0x00,0x00,0x00,0x13,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x87, 0x00,0x00,0x00,0x00,0x1f,0x26,0x37,0x07,0x00,0x1f,0x2b,0x06,0x00,0x36,0x4c, 0x0d,0x00,0x47,0x64,0x11,0x00,0x3f,0x57,0x11,0x00,0x53,0x72,0x17,0x00,0x66, 0x88,0x1f,0x00,0x5d,0x77,0x25,0x00,0x64,0x7f,0x2a,0x00,0x61,0x75,0x31,0x00, 0x2a,0x33,0x13,0x00,0x3b,0x4a,0x1c,0x00,0x45,0x56,0x21,0x00,0x46,0x57,0x22, 0x00,0x3e,0x4e,0x1e,0x00,0x27,0x31,0x12,0x00,0x69,0x80,0x39,0x00,0x48,0x59, 0x23,0x00,0x35,0x43,0x19,0x00,0x3d,0x4d,0x1f,0x00,0x63,0x7b,0x30,0x00,0x6d, 0x86,0x3d,0x00,0x6a,0x85,0x33,0x00,0x5b,0x6f,0x34,0x00,0x01,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x41,0x98,0xb4,0x59, 0xf3,0xfb,0xff,0xbf,0xff,0xea,0xff,0xb0,0xff,0x83,0xeb,0xff,0xb1,0xff,0x04, 0xe9,0xff,0xb0,0xff,0xe5,0xff,0xad,0xff,0xe2,0xff,0xa9,0xff,0xdf,0xff,0xa5, 0xff,0x85,0xde,0xff,0xa4,0xff,0x82,0xde,0xff,0xa5,0xff,0x02,0xdf,0xff,0xa5, 0xff,0xde,0xff,0xa5,0xff,0x82,0xde,0xff,0xa4,0xff,0x03,0xde,0xff,0xa5,0xff, 0xdf,0xff,0xa5,0xff,0xde,0xff,0xa5,0xff,0x83,0xde,0xff,0xa4,0xff,0x01,0xdf, 0xff,0xa5,0xff,0x82,0xde,0xff,0xa4,0xff,0x82,0xde,0xff,0xa3,0xff,0x82,0xde, 0xff,0xa4,0xff,0x83,0xde,0xff,0xa3,0xff,0x86,0xde,0xff,0xa2,0xff,0x04,0xdd, 0xff,0xa1,0xff,0xef,0xff,0xaf,0xff,0x85,0x9c,0x54,0xc9,0x00,0x00,0x00,0x12, 0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00, 0x29,0x26,0x37,0x07,0x00,0x1f,0x2b,0x06,0x00,0x36,0x4c,0x0d,0x00,0x47,0x64, 0x11,0x00,0x3f,0x57,0x11,0x00,0x53,0x72,0x17,0x00,0x66,0x88,0x1f,0x00,0x5d, 0x77,0x25,0x00,0x64,0x7f,0x2a,0x00,0x61,0x75,0x31,0x00,0x2a,0x33,0x13,0x00, 0x3b,0x4a,0x1c,0x00,0x45,0x56,0x21,0x00,0x46,0x57,0x22,0x00,0x3e,0x4e,0x1e, 0x00,0x27,0x31,0x12,0x00,0x69,0x80,0x39,0x00,0x48,0x59,0x23,0x00,0x35,0x43, 0x19,0x00,0x3d,0x4d,0x1f,0x00,0x63,0x7b,0x30,0x00,0x6c,0x85,0x3c,0x00,0x6c, 0x86,0x36,0x00,0x7a,0x95,0x45,0x00,0x2e,0x40,0x0c,0x00,0x25,0x2d,0x13,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x38,0x64,0x88,0x20,0xf4,0x8f,0xb4,0x42, 0xff,0x89,0xb2,0x3d,0xff,0x8e,0xb6,0x44,0xff,0x97,0xbd,0x4e,0xff,0xa2,0xc8, 0x5b,0xff,0xb2,0xd7,0x6e,0xff,0xc8,0xea,0x84,0xff,0xdc,0xf8,0x9c,0xff,0xea, 0xff,0xaf,0xff,0xee,0xff,0xb7,0xff,0xe9,0xff,0xb2,0xff,0xe2,0xff,0xab,0xff, 0x82,0xe0,0xff,0xa7,0xff,0x85,0xe0,0xff,0xa8,0xff,0x01,0xe0,0xff,0xa9,0xff, 0x83,0xe0,0xff,0xa8,0xff,0x01,0xe0,0xff,0xa7,0xff,0x84,0xe0,0xff,0xa8,0xff, 0x06,0xe0,0xff,0xa7,0xff,0xdf,0xff,0xa6,0xff,0xe0,0xff,0xa7,0xff,0xe0,0xff, 0xa8,0xff,0xe0,0xff,0xa7,0xff,0xdf,0xff,0xa6,0xff,0x82,0xdf,0xff,0xa5,0xff, 0x03,0xde,0xff,0xa5,0xff,0xdf,0xff,0xa5,0xff,0xdf,0xff,0xa4,0xff,0x82,0xde, 0xff,0xa4,0xff,0x05,0xde,0xff,0xa3,0xff,0xdd,0xff,0xa3,0xff,0xef,0xff,0xb0, 0xff,0x8b,0xa0,0x5b,0xcc,0x00,0x00,0x00,0x13,0x97,0x00,0x00,0x00,0x00,0x82, 0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x1e,0x26,0x37,0x07,0x00,0x1f, 0x2b,0x06,0x00,0x36,0x4c,0x0d,0x00,0x47,0x64,0x11,0x00,0x3f,0x57,0x11,0x00, 0x53,0x72,0x17,0x00,0x66,0x88,0x1f,0x00,0x5d,0x77,0x25,0x00,0x64,0x7f,0x2a, 0x00,0x61,0x75,0x31,0x00,0x2a,0x33,0x13,0x00,0x3b,0x4a,0x1c,0x00,0x45,0x56, 0x21,0x00,0x46,0x57,0x22,0x00,0x3e,0x4e,0x1e,0x00,0x27,0x31,0x12,0x00,0x69, 0x80,0x39,0x00,0x48,0x59,0x23,0x00,0x35,0x43,0x19,0x00,0x3d,0x4d,0x1f,0x00, 0x63,0x7c,0x30,0x00,0x68,0x81,0x39,0x00,0x67,0x81,0x31,0x00,0x6c,0x84,0x3b, 0x00,0x2f,0x45,0x06,0x06,0x95,0xb9,0x4e,0x1b,0x39,0x47,0x1f,0x30,0x12,0x1c, 0x03,0x62,0x35,0x54,0x00,0xf5,0x33,0x58,0x00,0xff,0x83,0x33,0x56,0x00,0xff, 0x0b,0x33,0x57,0x00,0xff,0x34,0x59,0x00,0xff,0x3c,0x62,0x00,0xff,0x4d,0x75, 0x0c,0xff,0x6b,0x94,0x29,0xff,0x95,0xb9,0x50,0xff,0xc3,0xe4,0x82,0xff,0xe5, 0xfe,0xa9,0xff,0xef,0xff,0xba,0xff,0xe8,0xff,0xb3,0xff,0xe2,0xff,0xac,0xff, 0x83,0xe1,0xff,0xab,0xff,0x82,0xe1,0xff,0xac,0xff,0x03,0xe2,0xff,0xac,0xff, 0xe2,0xff,0xab,0xff,0xe1,0xff,0xaa,0xff,0x83,0xe1,0xff,0xab,0xff,0x04,0xe1, 0xff,0xaa,0xff,0xe1,0xff,0xa9,0xff,0xe0,0xff,0xa9,0xff,0xe0,0xff,0xa8,0xff, 0x82,0xe0,0xff,0xa9,0xff,0x88,0xe0,0xff,0xa8,0xff,0x06,0xe0,0xff,0xa7,0xff, 0xe0,0xff,0xa6,0xff,0xdf,0xff,0xa7,0xff,0xf0,0xff,0xb4,0xff,0x91,0xa7,0x62, 0xd0,0x00,0x00,0x00,0x16,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00, 0x87,0x00,0x00,0x00,0x00,0x2e,0x26,0x37,0x07,0x00,0x1f,0x2b,0x06,0x00,0x36, 0x4c,0x0d,0x00,0x47,0x64,0x11,0x00,0x3f,0x57,0x11,0x00,0x53,0x72,0x17,0x00, 0x66,0x88,0x1f,0x00,0x5d,0x77,0x25,0x00,0x64,0x7f,0x2a,0x00,0x61,0x75,0x31, 0x00,0x2a,0x33,0x13,0x00,0x3b,0x4a,0x1c,0x00,0x45,0x56,0x21,0x00,0x46,0x57, 0x22,0x00,0x3e,0x4e,0x1e,0x00,0x27,0x31,0x12,0x00,0x69,0x80,0x39,0x00,0x47, 0x58,0x23,0x00,0x30,0x3e,0x15,0x00,0x33,0x43,0x17,0x00,0x56,0x6f,0x24,0x08, 0x7a,0x95,0x46,0x2e,0x7b,0x91,0x45,0x6c,0xb4,0xd0,0x76,0xa4,0xb0,0xc2,0x7a, 0xc9,0xd8,0xea,0x9e,0xea,0xdb,0xf6,0x98,0xff,0x49,0x72,0x0b,0xff,0x32,0x4e, 0x00,0xf0,0x31,0x4b,0x01,0xe5,0x31,0x4c,0x01,0xe8,0x32,0x4c,0x01,0xea,0x34, 0x4f,0x01,0xef,0x37,0x54,0x01,0xf3,0x3a,0x58,0x01,0xf9,0x3c,0x5c,0x01,0xff, 0x39,0x5c,0x00,0xff,0x35,0x56,0x00,0xff,0x31,0x54,0x00,0xff,0x38,0x5d,0x00, 0xff,0x58,0x7f,0x1a,0xff,0x91,0xb6,0x4f,0xff,0xce,0xeb,0x92,0xff,0xef,0xff, 0xb9,0xff,0xec,0xff,0xba,0xff,0xe3,0xff,0xaf,0xff,0x8a,0xe2,0xff,0xad,0xff, 0x82,0xe2,0xff,0xac,0xff,0x03,0xe2,0xff,0xab,0xff,0xe1,0xff,0xac,0xff,0xe1, 0xff,0xab,0xff,0x83,0xe0,0xff,0xa9,0xff,0x87,0xe0,0xff,0xa8,0xff,0x04,0xdf, 0xff,0xa7,0xff,0xef,0xff,0xb4,0xff,0x96,0xaf,0x67,0xd2,0x00,0x00,0x00,0x18, 0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00, 0x2f,0x26,0x37,0x07,0x00,0x1f,0x2b,0x06,0x00,0x36,0x4c,0x0d,0x00,0x47,0x64, 0x11,0x00,0x3f,0x57,0x11,0x00,0x53,0x72,0x17,0x00,0x66,0x88,0x1f,0x00,0x5d, 0x77,0x25,0x00,0x64,0x7f,0x2a,0x00,0x61,0x75,0x31,0x00,0x2a,0x33,0x13,0x00, 0x3b,0x4a,0x1c,0x00,0x45,0x56,0x21,0x00,0x46,0x57,0x22,0x00,0x3e,0x4e,0x1e, 0x00,0x24,0x2d,0x10,0x00,0x63,0x7a,0x34,0x00,0x41,0x54,0x1b,0x06,0x46,0x53, 0x25,0x3c,0x8f,0xa5,0x5b,0x8e,0xb9,0xca,0x82,0xce,0xe8,0xff,0xad,0xfe,0xf6, 0xff,0xbf,0xff,0xf8,0xff,0xc2,0xff,0xf6,0xff,0xbc,0xff,0xeb,0xfd,0xb1,0xff, 0xca,0xe4,0x89,0xff,0x44,0x6c,0x06,0xff,0x14,0x20,0x00,0xac,0x00,0x00,0x00, 0x50,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x62,0x02,0x04, 0x00,0x6b,0x05,0x09,0x00,0x79,0x0f,0x17,0x00,0x8f,0x19,0x27,0x01,0xad,0x2a, 0x3f,0x01,0xce,0x36,0x52,0x01,0xf0,0x3c,0x5d,0x01,0xff,0x37,0x57,0x00,0xff, 0x2f,0x51,0x00,0xff,0x3c,0x62,0x01,0xff,0x72,0x98,0x32,0xff,0xc1,0xdd,0x82, 0xff,0xef,0xff,0xb8,0xff,0xec,0xff,0xb8,0xff,0x8b,0xe2,0xff,0xad,0xff,0x82, 0xe2,0xff,0xac,0xff,0x02,0xe1,0xff,0xab,0xff,0xe1,0xff,0xaa,0xff,0x82,0xe0, 0xff,0xa9,0xff,0x87,0xe0,0xff,0xa8,0xff,0x04,0xdf,0xff,0xa7,0xff,0xee,0xff, 0xb4,0xff,0x9d,0xb6,0x6c,0xd5,0x00,0x00,0x00,0x1b,0x97,0x00,0x00,0x00,0x00, 0x82,0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x32,0x26,0x37,0x07,0x00, 0x1f,0x2b,0x06,0x00,0x36,0x4c,0x0d,0x00,0x47,0x64,0x11,0x00,0x3f,0x57,0x11, 0x00,0x53,0x72,0x17,0x00,0x66,0x88,0x1f,0x00,0x5d,0x77,0x25,0x00,0x64,0x7f, 0x2a,0x00,0x61,0x75,0x31,0x00,0x2a,0x33,0x13,0x00,0x3b,0x4a,0x1c,0x00,0x45, 0x56,0x21,0x00,0x43,0x54,0x20,0x00,0x31,0x41,0x14,0x00,0x2e,0x3a,0x15,0x18, 0x87,0x9b,0x52,0x71,0xb9,0xca,0x80,0xc9,0xea,0xff,0xaf,0xff,0xfc,0xff,0xc2, 0xff,0xf4,0xff,0xba,0xff,0xd5,0xf2,0x98,0xff,0xad,0xce,0x6d,0xff,0x87,0xad, 0x43,0xff,0x68,0x8f,0x2a,0xff,0x51,0x76,0x13,0xff,0x44,0x69,0x04,0xff,0x3d, 0x5f,0x00,0xff,0x1a,0x2a,0x00,0x9b,0x07,0x0c,0x01,0x1c,0x35,0x46,0x17,0x1c, 0x25,0x34,0x0c,0x16,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0c,0x07,0x0b,0x02, 0x17,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x4b,0x03,0x04, 0x00,0x67,0x11,0x1a,0x00,0x92,0x26,0x39,0x01,0xc6,0x38,0x55,0x01,0xf4,0x3c, 0x5d,0x00,0xff,0x30,0x51,0x00,0xff,0x35,0x59,0x00,0xff,0x6f,0x93,0x2f,0xff, 0xc7,0xe1,0x8a,0xff,0xf2,0xff,0xbb,0xff,0xe8,0xff,0xb4,0xff,0xe1,0xff,0xac, 0xff,0x82,0xe2,0xff,0xad,0xff,0x83,0xe2,0xff,0xac,0xff,0x07,0xe1,0xff,0xab, 0xff,0xe1,0xff,0xaa,0xff,0xe0,0xff,0xaa,0xff,0xe0,0xff,0xa9,0xff,0xe0,0xff, 0xaa,0xff,0xe0,0xff,0xa8,0xff,0xe0,0xff,0xa9,0xff,0x87,0xe0,0xff,0xa8,0xff, 0x06,0xe0,0xff,0xa7,0xff,0xdf,0xff,0xa6,0xff,0xde,0xff,0xa5,0xff,0xed,0xff, 0xb1,0xff,0xa1,0xbd,0x6d,0xd8,0x00,0x00,0x00,0x1e,0x97,0x00,0x00,0x00,0x00, 0x82,0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x38,0x26,0x37,0x07,0x00, 0x1f,0x2b,0x06,0x00,0x36,0x4c,0x0d,0x00,0x47,0x64,0x11,0x00,0x3f,0x57,0x11, 0x00,0x53,0x72,0x17,0x00,0x66,0x88,0x1f,0x00,0x5d,0x77,0x25,0x00,0x64,0x7f, 0x2a,0x00,0x61,0x75,0x31,0x00,0x2a,0x33,0x13,0x00,0x38,0x47,0x1a,0x00,0x39, 0x4a,0x17,0x00,0x4a,0x5c,0x24,0x26,0x86,0x99,0x54,0x8e,0xcf,0xe2,0x93,0xe7, 0xf3,0xff,0xb8,0xff,0xf9,0xff,0xbf,0xff,0xd9,0xf4,0x9c,0xff,0xa0,0xc2,0x5f, 0xff,0x67,0x8e,0x2a,0xff,0x42,0x67,0x04,0xff,0x32,0x56,0x00,0xff,0x30,0x52, 0x00,0xff,0x34,0x55,0x00,0xff,0x39,0x5a,0x00,0xff,0x3e,0x60,0x00,0xff,0x35, 0x59,0x00,0xff,0x90,0xaf,0x53,0xee,0xc8,0xd5,0x93,0xd5,0xc6,0xdb,0x88,0xd2, 0xb8,0xcb,0x7c,0xc4,0x97,0xa8,0x64,0xad,0x84,0x9c,0x54,0x8b,0x6d,0x87,0x36, 0x56,0x23,0x30,0x0d,0x1f,0x16,0x21,0x01,0x04,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x1a,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x45,0x05,0x08,0x00,0x6c,0x1b, 0x29,0x01,0xab,0x34,0x50,0x02,0xe9,0x3c,0x5d,0x01,0xff,0x2f,0x50,0x00,0xff, 0x37,0x5c,0x00,0xff,0x83,0xa5,0x46,0xff,0xde,0xf5,0xa3,0xff,0xef,0xff,0xbb, 0xff,0xe1,0xff,0xab,0xff,0xe0,0xff,0xa8,0xff,0xe1,0xff,0xa9,0xff,0xe0,0xff, 0xa9,0xff,0xe1,0xff,0xa9,0xff,0xe0,0xff,0xa9,0xff,0x87,0xe0,0xff,0xa8,0xff, 0x01,0xdf,0xff,0xa7,0xff,0x82,0xdf,0xff,0xa6,0xff,0x01,0xdf,0xff,0xa5,0xff, 0x83,0xde,0xff,0xa4,0xff,0x82,0xde,0xff,0xa3,0xff,0x03,0xeb,0xff,0xae,0xff, 0xa6,0xc0,0x6f,0xdb,0x00,0x00,0x00,0x21,0x97,0x00,0x00,0x00,0x00,0x82,0xff, 0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x0e,0x26,0x37,0x07,0x00,0x1f,0x2b, 0x06,0x00,0x36,0x4c,0x0d,0x00,0x47,0x64,0x11,0x00,0x3f,0x57,0x11,0x00,0x53, 0x72,0x17,0x00,0x66,0x88,0x1f,0x00,0x5d,0x77,0x25,0x00,0x64,0x7f,0x2a,0x00, 0x61,0x74,0x31,0x00,0x1e,0x26,0x0a,0x00,0x3f,0x4f,0x1d,0x22,0x8c,0x9f,0x58, 0x92,0xd5,0xea,0x97,0xf1,0x82,0xf4,0xff,0xb7,0xff,0x26,0xca,0xe8,0x89,0xff, 0x81,0xa5,0x40,0xff,0x45,0x6b,0x09,0xff,0x2f,0x52,0x00,0xff,0x32,0x52,0x00, 0xff,0x3b,0x5c,0x00,0xff,0x40,0x62,0x01,0xff,0x3d,0x5d,0x01,0xfe,0x35,0x52, 0x01,0xee,0x2b,0x42,0x01,0xd4,0x21,0x31,0x01,0xbd,0x13,0x21,0x00,0xb7,0xae, 0xcb,0x73,0xfb,0xfb,0xff,0xc1,0xff,0xec,0xff,0xb3,0xff,0xee,0xff,0xb5,0xff, 0xf1,0xff,0xb7,0xff,0xf0,0xff,0xb5,0xff,0xe8,0xfc,0xac,0xff,0xd8,0xf2,0x98, 0xf1,0xa0,0xb4,0x67,0xb1,0x5a,0x70,0x2e,0x5e,0x24,0x37,0x0a,0x0e,0x04,0x0b, 0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x38,0x03, 0x04,0x01,0x5f,0x1a,0x27,0x01,0xa8,0x36,0x52,0x02,0xee,0x3b,0x5c,0x00,0xff, 0x2c,0x4d,0x00,0xff,0x4a,0x6f,0x13,0xff,0xb2,0xcf,0x74,0xff,0xef,0xff,0xb6, 0xff,0xe5,0xff,0xae,0xff,0xdf,0xff,0xa6,0xff,0xe0,0xff,0xa7,0xff,0x82,0xdf, 0xff,0xa6,0xff,0x04,0xdf,0xff,0xa5,0xff,0xde,0xff,0xa5,0xff,0xdf,0xff,0xa4, 0xff,0xdf,0xff,0xa5,0xff,0x83,0xdf,0xff,0xa4,0xff,0x83,0xde,0xff,0xa3,0xff, 0x02,0xde,0xff,0xa2,0xff,0xde,0xff,0xa1,0xff,0x83,0xde,0xff,0xa2,0xff,0x04, 0xde,0xff,0xa3,0xff,0xeb,0xff,0xad,0xff,0xaa,0xc2,0x70,0xdd,0x00,0x00,0x00, 0x24,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00, 0x00,0x35,0x26,0x37,0x07,0x00,0x1f,0x2b,0x06,0x00,0x36,0x4c,0x0d,0x00,0x47, 0x64,0x11,0x00,0x3f,0x57,0x11,0x00,0x53,0x72,0x17,0x00,0x66,0x88,0x1f,0x00, 0x5e,0x78,0x25,0x00,0x5e,0x78,0x26,0x00,0x5b,0x6e,0x2d,0x0e,0x75,0x82,0x49, 0x7b,0xd3,0xe6,0x94,0xea,0xef,0xff,0xb0,0xff,0xf1,0xff,0xb2,0xff,0xd3,0xef, 0x91,0xff,0x80,0xa5,0x3f,0xff,0x3c,0x62,0x03,0xff,0x2e,0x4e,0x00,0xff,0x38, 0x57,0x00,0xff,0x40,0x62,0x01,0xff,0x3d,0x5d,0x01,0xfe,0x2f,0x47,0x01,0xdb, 0x1b,0x2a,0x00,0xae,0x0c,0x12,0x00,0x80,0x01,0x02,0x00,0x61,0x00,0x00,0x00, 0x4b,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x62,0xa3,0xc1,0x65,0xf3,0xe3,0xf8, 0xa2,0xff,0xd5,0xf6,0x96,0xff,0xdb,0xf8,0x9d,0xff,0xe3,0xfd,0xa5,0xff,0xea, 0xff,0xae,0xff,0xec,0xff,0xb1,0xff,0xe9,0xff,0xb0,0xff,0xee,0xff,0xb3,0xff, 0xeb,0xff,0xac,0xff,0xc4,0xda,0x84,0xda,0x74,0x8e,0x3e,0x72,0x1f,0x2f,0x07, 0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x1f,0x00,0x00, 0x00,0x36,0x05,0x08,0x01,0x66,0x22,0x33,0x01,0xbd,0x3c,0x5c,0x01,0xff,0x35, 0x55,0x00,0xff,0x2f,0x52,0x00,0xff,0x80,0xa1,0x44,0xff,0xe3,0xfb,0xa6,0xff, 0xe7,0xff,0xad,0xff,0x84,0xde,0xff,0xa3,0xff,0x01,0xdd,0xff,0xa1,0xff,0x85, 0xde,0xff,0xa3,0xff,0x02,0xde,0xff,0xa2,0xff,0xdd,0xff,0xa2,0xff,0x83,0xde, 0xff,0xa2,0xff,0x07,0xdf,0xff,0xa2,0xff,0xde,0xff,0xa1,0xff,0xdc,0xff,0x9e, 0xff,0xdc,0xff,0x9d,0xff,0xe9,0xff,0xa8,0xff,0xad,0xc5,0x72,0xe0,0x00,0x00, 0x00,0x27,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x87,0x00,0x00, 0x00,0x00,0x4b,0x26,0x37,0x07,0x00,0x1f,0x2b,0x06,0x00,0x36,0x4c,0x0d,0x00, 0x47,0x64,0x11,0x00,0x3f,0x57,0x11,0x00,0x53,0x72,0x17,0x00,0x65,0x87,0x1f, 0x00,0x51,0x69,0x1f,0x00,0x80,0x9e,0x3c,0x4e,0xb7,0xce,0x70,0xd1,0xea,0xff, 0x9d,0xff,0xe4,0xff,0x9d,0xff,0xe1,0xff,0x99,0xff,0x9f,0xc3,0x5a,0xff,0x45, 0x6b,0x0b,0xff,0x2c,0x4d,0x00,0xff,0x38,0x57,0x00,0xff,0x41,0x62,0x01,0xff, 0x3a,0x5a,0x01,0xf6,0x23,0x36,0x01,0xbf,0x0c,0x12,0x01,0x7d,0x00,0x00,0x00, 0x50,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x02,0x04, 0x00,0x09,0x01,0x01,0x01,0x00,0x01,0x02,0x00,0x3c,0x45,0x68,0x08,0xf3,0x4a, 0x6e,0x09,0xff,0x45,0x69,0x08,0xff,0x4b,0x6d,0x0e,0xff,0x58,0x7a,0x1e,0xff, 0x74,0x96,0x3b,0xff,0x9f,0xbc,0x60,0xff,0xcc,0xea,0x8b,0xff,0xe6,0xff,0xa0, 0xff,0xe4,0xff,0xa0,0xff,0xe5,0xff,0xa2,0xff,0xe8,0xff,0xa2,0xff,0xb7,0xd3, 0x6e,0xd5,0x4f,0x68,0x1f,0x56,0x12,0x1d,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x3f,0x0f,0x16,0x01,0x86, 0x32,0x4d,0x02,0xe3,0x3c,0x5e,0x00,0xff,0x2a,0x4a,0x00,0xff,0x5a,0x7f,0x22, 0xff,0xd1,0xea,0x8f,0xff,0xeb,0xff,0xae,0xff,0xdd,0xff,0xa1,0xff,0xdc,0xff, 0x9f,0xff,0xdb,0xff,0x99,0xff,0xd9,0xff,0x94,0xff,0xdb,0xff,0x9a,0xff,0xd9, 0xff,0x95,0xff,0xd7,0xff,0x91,0xff,0xd7,0xff,0x90,0xff,0xd6,0xff,0x8e,0xff, 0xd7,0xff,0x8d,0xff,0xd7,0xff,0x8f,0xff,0xd7,0xff,0x90,0xff,0xd7,0xff,0x8f, 0xff,0xd6,0xff,0x8c,0xff,0xd4,0xff,0x85,0xff,0xd1,0xff,0x7f,0xff,0xd0,0xff, 0x7a,0xff,0xd0,0xff,0x7c,0xff,0xdc,0xff,0x89,0xff,0xa9,0xc7,0x61,0xe2,0x00, 0x00,0x00,0x29,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x87,0x00, 0x00,0x00,0x00,0x45,0x26,0x37,0x07,0x00,0x1f,0x2b,0x06,0x00,0x36,0x4c,0x0d, 0x00,0x47,0x64,0x11,0x00,0x40,0x58,0x11,0x00,0x4e,0x6b,0x15,0x00,0x65,0x87, 0x1f,0x17,0x8a,0xa9,0x3b,0x9e,0xd4,0xfe,0x6e,0xff,0xd3,0xff,0x70,0xff,0xd2, 0xff,0x6f,0xff,0xc4,0xf0,0x63,0xff,0x69,0x92,0x21,0xff,0x2e,0x50,0x00,0xff, 0x34,0x51,0x00,0xff,0x3f,0x60,0x01,0xff,0x3d,0x5d,0x02,0xfd,0x22,0x35,0x01, 0xbc,0x08,0x0b,0x01,0x6c,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x11,0x00,0x00,0x00,0x00,0x1c,0x27,0x07,0x00,0x33,0x46,0x11,0x0b,0x44, 0x58,0x18,0x32,0x67,0x85,0x28,0x60,0x1e,0x2c,0x06,0x84,0x38,0x56,0x00,0xf8, 0x3d,0x5f,0x00,0xff,0x3c,0x5e,0x00,0xff,0x3b,0x5c,0x00,0xff,0x38,0x59,0x00, 0xff,0x32,0x53,0x00,0xff,0x2d,0x4f,0x00,0xff,0x3a,0x5b,0x04,0xff,0x69,0x8c, 0x2b,0xff,0xb0,0xd4,0x60,0xff,0xd9,0xff,0x7e,0xff,0xd3,0xff,0x7c,0xff,0xd9, 0xff,0x82,0xff,0xdb,0xff,0x7a,0xff,0x80,0xa0,0x3a,0xa5,0x37,0x53,0x08,0x1a, 0x1f,0x2e,0x06,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x13,0x00,0x00,0x00, 0x2a,0x03,0x04,0x01,0x5b,0x24,0x37,0x01,0xc2,0x3e,0x5f,0x01,0xff,0x2e,0x4e, 0x00,0xff,0x43,0x67,0x0e,0xff,0xb8,0xd8,0x70,0xff,0xe3,0xff,0x93,0xff,0xd2, 0xff,0x83,0xff,0xd0,0xff,0x7b,0xff,0xd1,0xff,0x7d,0xff,0xd0,0xff,0x7a,0xff, 0xce,0xff,0x75,0xff,0xcd,0xff,0x73,0xff,0xcd,0xff,0x72,0xff,0xcc,0xff,0x70, 0xff,0xcb,0xff,0x6e,0xff,0xca,0xff,0x6a,0xff,0xc9,0xff,0x67,0xff,0xc8,0xff, 0x64,0xff,0xc5,0xff,0x5c,0xff,0xc4,0xff,0x5a,0xff,0x82,0xc4,0xff,0x59,0xff, 0x04,0xc5,0xff,0x5c,0xff,0xd0,0xff,0x66,0xff,0xa3,0xc9,0x4b,0xe5,0x00,0x02, 0x00,0x2a,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x87,0x00,0x00, 0x00,0x00,0x45,0x26,0x37,0x07,0x00,0x1f,0x2b,0x06,0x00,0x36,0x4c,0x0d,0x00, 0x46,0x63,0x11,0x00,0x34,0x49,0x0d,0x00,0x6c,0x93,0x20,0x4e,0xa7,0xd6,0x3b, 0xd7,0xca,0xff,0x4e,0xff,0xbe,0xff,0x4a,0xff,0xc7,0xff,0x4e,0xff,0xa8,0xdd, 0x3d,0xff,0x4a,0x72,0x09,0xff,0x2e,0x4c,0x00,0xff,0x3a,0x58,0x00,0xff,0x40, 0x62,0x01,0xff,0x2f,0x48,0x01,0xd9,0x0c,0x13,0x01,0x79,0x00,0x00,0x00,0x39, 0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x06,0x0d,0x13,0x02,0x00,0x3a,0x51,0x0e, 0x11,0x57,0x75,0x1a,0x59,0x88,0xad,0x30,0xa2,0xbe,0xf6,0x4b,0xe2,0xcc,0xf5, 0x5c,0xf9,0xb9,0xe6,0x4d,0xff,0x3f,0x65,0x02,0xff,0x2d,0x45,0x01,0xe2,0x21, 0x31,0x01,0xbf,0x20,0x2f,0x01,0xbe,0x21,0x31,0x01,0xc1,0x27,0x3c,0x01,0xcd, 0x31,0x4b,0x01,0xe2,0x3b,0x5a,0x01,0xfb,0x3c,0x5e,0x00,0xff,0x31,0x51,0x00, 0xff,0x30,0x50,0x00,0xff,0x69,0x8e,0x25,0xff,0xbd,0xea,0x58,0xff,0xce,0xff, 0x61,0xff,0xc7,0xff,0x5f,0xff,0xd4,0xff,0x64,0xff,0xb0,0xe0,0x42,0xd7,0x43, 0x60,0x0f,0x3a,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x08, 0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x41,0x19,0x25,0x01,0x9f,0x3c,0x5c,0x02, 0xfc,0x32,0x52,0x00,0xff,0x35,0x58,0x03,0xff,0xa2,0xcb,0x4c,0xff,0xd7,0xff, 0x72,0xff,0xc9,0xff,0x68,0xff,0xc8,0xff,0x65,0xff,0xc7,0xff,0x61,0xff,0xc4, 0xff,0x5a,0xff,0xc2,0xff,0x54,0xff,0xc0,0xff,0x4f,0xff,0xbf,0xff,0x4e,0xff, 0xbe,0xff,0x4c,0xff,0xbd,0xfe,0x48,0xff,0xbb,0xfd,0x46,0xff,0xba,0xfc,0x43, 0xff,0xba,0xfd,0x43,0xff,0xba,0xfd,0x44,0xff,0x82,0xba,0xfd,0x43,0xff,0x04, 0xbb,0xfd,0x45,0xff,0xc4,0xff,0x4a,0xff,0x9c,0xcb,0x36,0xe6,0x02,0x04,0x00, 0x2c,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00, 0x00,0x4b,0x26,0x37,0x07,0x00,0x1f,0x2b,0x06,0x00,0x34,0x49,0x0d,0x00,0x48, 0x66,0x10,0x09,0x67,0x8b,0x1f,0x8d,0xbe,0xfe,0x40,0xff,0xbb,0xff,0x41,0xff, 0xb2,0xf7,0x3d,0xff,0xbe,0xff,0x42,0xff,0x94,0xcc,0x2a,0xff,0x3b,0x5e,0x01, 0xff,0x32,0x4e,0x00,0xff,0x3c,0x5c,0x01,0xff,0x3d,0x5e,0x02,0xff,0x1e,0x2e, 0x01,0xab,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x09,0x0a, 0x10,0x01,0x00,0x2a,0x3c,0x0a,0x25,0x6f,0x96,0x21,0x89,0xb5,0xee,0x3c,0xe2, 0xc6,0xff,0x47,0xff,0xcf,0xff,0x4c,0xff,0xc0,0xff,0x45,0xff,0xb5,0xf0,0x40, 0xff,0x95,0xc9,0x2c,0xff,0x3c,0x5f,0x00,0xff,0x17,0x23,0x01,0xa5,0x00,0x00, 0x00,0x3a,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x48,0x01, 0x01,0x00,0x59,0x08,0x0b,0x01,0x77,0x1a,0x27,0x01,0xa7,0x31,0x49,0x01,0xdf, 0x3c,0x5d,0x00,0xff,0x2f,0x4d,0x00,0xff,0x3d,0x5f,0x05,0xff,0x96,0xc7,0x30, 0xff,0xc4,0xff,0x47,0xff,0xb9,0xfe,0x42,0xff,0xc4,0xff,0x49,0xff,0xaf,0xe3, 0x3b,0xf3,0x3c,0x57,0x0c,0x5d,0x0c,0x14,0x00,0x00,0x02,0x03,0x00,0x00,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x32,0x10,0x18,0x01,0x86, 0x38,0x56,0x02,0xf3,0x35,0x56,0x00,0xff,0x32,0x51,0x00,0xff,0x97,0xc5,0x37, 0xff,0xc9,0xff,0x50,0xff,0xba,0xfc,0x45,0xff,0xb8,0xfb,0x41,0xff,0xb6,0xfa, 0x3f,0xff,0xb5,0xf9,0x3d,0xff,0xb5,0xf8,0x3d,0xff,0xb4,0xf8,0x3d,0xff,0xb3, 0xf7,0x3d,0xff,0xb2,0xf6,0x3c,0xff,0xb3,0xf6,0x3c,0xff,0xb3,0xf6,0x3d,0xff, 0xb3,0xf7,0x3d,0xff,0xb3,0xf6,0x3c,0xff,0xb3,0xf6,0x3d,0xff,0xb2,0xf6,0x3c, 0xff,0xb2,0xf5,0x3b,0xff,0xba,0xfe,0x3f,0xff,0x98,0xcc,0x30,0xe8,0x03,0x06, 0x00,0x2f,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x87,0x00,0x00, 0x00,0x00,0x3d,0x26,0x38,0x07,0x00,0x1b,0x25,0x05,0x00,0x30,0x43,0x0b,0x21, 0x96,0xcf,0x2b,0xbc,0xb8,0xfd,0x3a,0xff,0xad,0xf1,0x36,0xff,0xaa,0xed,0x35, 0xff,0xb5,0xfb,0x3a,0xff,0x8a,0xc4,0x24,0xff,0x36,0x56,0x00,0xff,0x34,0x50, 0x00,0xff,0x3d,0x5e,0x01,0xff,0x39,0x57,0x01,0xf3,0x12,0x1b,0x01,0x88,0x00, 0x00,0x00,0x31,0x00,0x00,0x00,0x14,0x01,0x02,0x00,0x00,0x31,0x46,0x0a,0x15, 0x80,0xb3,0x22,0x87,0xa7,0xe4,0x33,0xf0,0xc0,0xff,0x3f,0xff,0xbd,0xff,0x40, 0xff,0xa4,0xe4,0x33,0xff,0x73,0xa4,0x1c,0xff,0x4e,0x75,0x0a,0xff,0x3d,0x60, 0x03,0xff,0x3b,0x5c,0x01,0xff,0x3c,0x5d,0x01,0xff,0x13,0x1e,0x00,0x8e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x12, 0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x36,0x01,0x01,0x00, 0x56,0x14,0x1e,0x01,0x97,0x33,0x4f,0x02,0xe7,0x37,0x57,0x00,0xff,0x2f,0x4e, 0x00,0xff,0x7d,0xaf,0x21,0xff,0xbb,0xff,0x3e,0xff,0xb0,0xf4,0x3a,0xff,0xb8, 0xfb,0x3f,0xff,0xb4,0xf5,0x39,0xff,0x48,0x69,0x0e,0x6b,0x0a,0x12,0x00,0x00, 0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x00,0x00, 0x29,0x0b,0x11,0x01,0x76,0x36,0x52,0x02,0xee,0x37,0x57,0x00,0xff,0x32,0x51, 0x00,0xff,0x92,0xca,0x28,0xff,0xb9,0xff,0x3d,0xff,0xae,0xf1,0x39,0xff,0xaf, 0xf2,0x39,0xff,0xae,0xf1,0x38,0xff,0x84,0xac,0xef,0x36,0xff,0x02,0xad,0xf0, 0x37,0xff,0xac,0xef,0x36,0xff,0x82,0xac,0xef,0x35,0xff,0x82,0xab,0xee,0x35, 0xff,0x04,0xac,0xee,0x36,0xff,0xb4,0xfa,0x3a,0xff,0x94,0xcc,0x2b,0xe9,0x05, 0x07,0x00,0x31,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x87,0x00, 0x00,0x00,0x00,0x30,0x1f,0x2d,0x05,0x00,0x3d,0x55,0x0d,0x40,0x93,0xcf,0x27, 0xde,0xae,0xf5,0x31,0xff,0xa3,0xe7,0x2d,0xff,0xa3,0xe6,0x2d,0xff,0xac,0xf2, 0x31,0xff,0x8b,0xc6,0x22,0xff,0x35,0x54,0x00,0xff,0x34,0x51,0x00,0xff,0x3d, 0x5e,0x01,0xff,0x36,0x53,0x01,0xec,0x0b,0x11,0x01,0x70,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x09,0x10,0x17,0x02,0x00,0x3f,0x5b,0x0d,0x4f,0x9a,0xda,0x29, 0xd8,0xb1,0xf7,0x34,0xff,0xb1,0xf8,0x35,0xff,0xa8,0xed,0x30,0xff,0x6f,0xa1, 0x18,0xff,0x3a,0x5b,0x02,0xff,0x30,0x4d,0x00,0xff,0x37,0x56,0x00,0xff,0x3d, 0x5e,0x00,0xff,0x3e,0x60,0x00,0xff,0x3d,0x5f,0x01,0xff,0x55,0x7d,0x0e,0xc9, 0x47,0x67,0x0f,0x59,0x29,0x3e,0x03,0x12,0x0a,0x0f,0x00,0x00,0x03,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0b,0x00,0x00, 0x00,0x1b,0x00,0x00,0x00,0x31,0x03,0x04,0x00,0x5f,0x23,0x36,0x01,0xbf,0x3a, 0x5a,0x01,0xff,0x2e,0x4b,0x00,0xff,0x75,0xa9,0x1c,0xff,0xb0,0xf6,0x36,0xff, 0xa7,0xea,0x31,0xff,0xae,0xf2,0x35,0xff,0xad,0xf3,0x31,0xff,0x3e,0x5d,0x0b, 0x67,0x83,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x24, 0x09,0x0e,0x01,0x6d,0x35,0x52,0x02,0xee,0x36,0x55,0x00,0xff,0x36,0x57,0x02, 0xff,0x92,0xce,0x29,0xff,0xac,0xf1,0x34,0xff,0xa6,0xe9,0x30,0xff,0xa5,0xe8, 0x2f,0xff,0x82,0xa4,0xe7,0x2e,0xff,0x82,0xa5,0xe8,0x2f,0xff,0x84,0xa4,0xe7, 0x2e,0xff,0x06,0xa5,0xe8,0x2e,0xff,0xa5,0xe8,0x2f,0xff,0xa5,0xe7,0x2f,0xff, 0xab,0xf1,0x30,0xff,0x8d,0xc9,0x25,0xea,0x05,0x08,0x00,0x32,0x97,0x00,0x00, 0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x22,0x39,0x53, 0x0b,0x52,0xa0,0xe6,0x25,0xf4,0xa4,0xeb,0x28,0xff,0x9a,0xdd,0x26,0xff,0x9b, 0xde,0x26,0xff,0xa0,0xe5,0x28,0xff,0x8e,0xcc,0x20,0xff,0x3c,0x5d,0x02,0xff, 0x33,0x50,0x00,0xff,0x3c,0x5d,0x01,0xff,0x35,0x53,0x02,0xec,0x0a,0x0e,0x01, 0x65,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x03,0x0f,0x15,0x02,0x04,0x77,0xab, 0x19,0x8a,0xa6,0xed,0x29,0xff,0xa6,0xeb,0x2b,0xff,0xa5,0xea,0x2b,0xff,0x96, 0xd7,0x24,0xff,0x4c,0x74,0x09,0xff,0x2e,0x4a,0x00,0xff,0x39,0x59,0x00,0xff, 0x41,0x63,0x01,0xff,0x37,0x54,0x01,0xef,0x25,0x39,0x01,0xc9,0x1a,0x27,0x01, 0xa8,0x13,0x20,0x00,0xa8,0x8e,0xce,0x22,0xfe,0xb3,0xfc,0x2f,0xff,0x94,0xd6, 0x21,0xe0,0x44,0x63,0x09,0x66,0x24,0x39,0x00,0x00,0x0d,0x15,0x00,0x00,0x82, 0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0a,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x41,0x17,0x24,0x01,0xa2,0x37,0x56,0x00,0xfb,0x2b, 0x45,0x00,0xff,0x84,0xbf,0x1e,0xff,0xa6,0xeb,0x2c,0xff,0x9f,0xe2,0x2a,0xff, 0xa6,0xeb,0x2c,0xff,0xa3,0xea,0x28,0xfe,0x20,0x31,0x05,0x4e,0x83,0x00,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x22,0x0a,0x0f,0x01,0x71, 0x38,0x56,0x02,0xf3,0x2e,0x49,0x00,0xff,0x4e,0x76,0x07,0xff,0xa3,0xe8,0x2a, 0xff,0x9f,0xe2,0x28,0xff,0x9f,0xe2,0x29,0xff,0x83,0x9e,0xe1,0x28,0xff,0x0b, 0x9d,0xe0,0x27,0xff,0x9c,0xdf,0x26,0xff,0x9d,0xe0,0x27,0xff,0x9e,0xe1,0x28, 0xff,0x9f,0xe2,0x29,0xff,0x9e,0xe1,0x28,0xff,0x9d,0xe0,0x27,0xff,0x9b,0xde, 0x25,0xff,0xa2,0xe8,0x28,0xff,0x89,0xc4,0x20,0xeb,0x06,0x09,0x00,0x33,0x97, 0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x22, 0x36,0x4f,0x0a,0x84,0xa3,0xec,0x21,0xff,0x95,0xd7,0x1f,0xff,0x95,0xd8,0x1f, 0xff,0x94,0xd7,0x1f,0xff,0x9d,0xe2,0x23,0xff,0x6d,0xa2,0x0f,0xff,0x2e,0x48, 0x00,0xff,0x3a,0x5a,0x01,0xff,0x38,0x56,0x02,0xf4,0x0b,0x10,0x01,0x6a,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x05,0x10,0x17,0x02,0x17,0x6f,0xa1,0x16,0xb2, 0xa4,0xec,0x24,0xff,0x99,0xdd,0x22,0xff,0x9a,0xde,0x22,0xff,0x89,0xc7,0x1c, 0xff,0x40,0x62,0x03,0xff,0x32,0x4d,0x00,0xff,0x3e,0x5f,0x01,0xff,0x3a,0x59, 0x01,0xf6,0x1c,0x2b,0x01,0xab,0x04,0x06,0x00,0x64,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x36,0x00,0x01,0x00,0x5c,0x7e,0xb7,0x18,0xf3,0xa0,0xe6,0x24,0xff, 0x9f,0xe5,0x26,0xff,0xa1,0xe8,0x23,0xff,0x5a,0x87,0x08,0x9f,0x08,0x0e,0x00, 0x0b,0x84,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x16, 0x00,0x00,0x00,0x2f,0x0d,0x16,0x00,0x91,0x61,0x91,0x0b,0xfe,0x95,0xd8,0x1f, 0xff,0x9b,0xde,0x24,0xff,0x99,0xdb,0x23,0xff,0xa0,0xe6,0x26,0xff,0x7a,0xb5, 0x15,0xff,0x37,0x53,0x03,0xe5,0x0b,0x0e,0x03,0x22,0x83,0x00,0x00,0x00,0x00, 0x06,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x21,0x09,0x0c,0x01,0x76,0x40,0x62, 0x02,0xf7,0x8b,0xcb,0x18,0xff,0x9a,0xdf,0x23,0xff,0x83,0x98,0xdb,0x22,0xff, 0x04,0x97,0xda,0x21,0xff,0x96,0xd9,0x21,0xff,0x95,0xd8,0x1f,0xff,0x97,0xda, 0x21,0xff,0x82,0x98,0xdb,0x22,0xff,0x07,0x97,0xda,0x20,0xff,0x96,0xd9,0x20, 0xff,0x95,0xd8,0x1f,0xff,0x94,0xd7,0x1f,0xff,0x9b,0xe1,0x21,0xff,0x84,0xc0, 0x1a,0xec,0x06,0x0a,0x00,0x34,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff, 0x00,0x86,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x07,0x03,0x05,0x00,0x44, 0x79,0xb3,0x14,0xf0,0x96,0xdc,0x1a,0xff,0x8e,0xd1,0x19,0xff,0x8f,0xd2,0x19, 0xff,0x92,0xd5,0x1a,0xff,0x89,0xca,0x14,0xff,0x43,0x69,0x00,0xff,0x35,0x52, 0x01,0xfe,0x12,0x1b,0x02,0x81,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x00,0x1f,0x2f,0x04,0x57,0x9d,0xe6,0x1c,0xff,0x92,0xd6,0x1b,0xff, 0x91,0xd4,0x1b,0xff,0x97,0xdc,0x1c,0xff,0x51,0x7b,0x07,0xff,0x2e,0x49,0x00, 0xff,0x3f,0x61,0x01,0xff,0x31,0x4a,0x02,0xde,0x0a,0x0f,0x01,0x71,0x00,0x00, 0x00,0x33,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0b,0x03, 0x05,0x00,0x48,0x7a,0xb3,0x14,0xf3,0x99,0xdf,0x1e,0xff,0x91,0xd4,0x1c,0xff, 0x95,0xd9,0x1d,0xff,0x98,0xe0,0x1a,0xff,0x40,0x62,0x04,0xaa,0x03,0x03,0x00, 0x05,0x85,0x00,0x00,0x00,0x00,0x0b,0x10,0x18,0x00,0x19,0x58,0x83,0x0d,0xb6, 0x9c,0xe4,0x1e,0xfe,0x95,0xd8,0x1d,0xff,0x91,0xd4,0x1b,0xff,0x99,0xdf,0x1e, 0xff,0x7f,0xbb,0x15,0xff,0x39,0x58,0x00,0xff,0x35,0x51,0x01,0xf8,0x09,0x0d, 0x01,0x3d,0x00,0x00,0x00,0x01,0x84,0x00,0x00,0x00,0x00,0x05,0x18,0x26,0x01, 0x76,0x84,0xc5,0x13,0xf9,0x99,0xde,0x1d,0xff,0x91,0xd3,0x1b,0xff,0x92,0xd5, 0x1c,0xff,0x84,0x91,0xd4,0x1b,0xff,0x04,0x92,0xd5,0x1b,0xff,0x92,0xd5,0x1c, 0xff,0x91,0xd4,0x1b,0xff,0x8f,0xd2,0x19,0xff,0x82,0x90,0xd3,0x1a,0xff,0x05, 0x8f,0xd2,0x19,0xff,0x8e,0xd1,0x18,0xff,0x95,0xdb,0x1b,0xff,0x80,0xbb,0x15, 0xec,0x07,0x0a,0x00,0x34,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00, 0x86,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x23,0x37, 0x52,0x06,0xab,0x96,0xdf,0x15,0xff,0x8a,0xcc,0x13,0xff,0x89,0xcc,0x14,0xff, 0x8a,0xcd,0x14,0xff,0x8f,0xd4,0x15,0xff,0x62,0x97,0x06,0xff,0x38,0x57,0x00, 0xfe,0x0e,0x15,0x01,0x68,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x02,0x04,0x00,0x3d,0x6e,0xa5,0x0e,0xef,0x93,0xd9,0x16,0xff,0x8a, 0xcd,0x15,0xff,0x90,0xd5,0x16,0xff,0x6e,0xa6,0x0a,0xff,0x35,0x53,0x00,0xff, 0x2b,0x41,0x02,0xd1,0x03,0x04,0x01,0x54,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x05, 0x00,0x41,0x76,0xae,0x10,0xf3,0x93,0xd9,0x18,0xff,0x8c,0xcf,0x16,0xff,0x8c, 0xce,0x16,0xff,0x91,0xd6,0x18,0xff,0x85,0xc8,0x0e,0xff,0x20,0x32,0x00,0x7d, 0x82,0x00,0x00,0x00,0x00,0x0e,0x12,0x1a,0x00,0x00,0x01,0x03,0x00,0x00,0x23, 0x35,0x02,0x1e,0x79,0xb5,0x0e,0xc3,0x98,0xe0,0x18,0xff,0x8e,0xd1,0x17,0xff, 0x8b,0xce,0x16,0xff,0x92,0xd8,0x18,0xff,0x81,0xc0,0x12,0xff,0x3e,0x5f,0x01, 0xff,0x37,0x55,0x01,0xfd,0x12,0x1c,0x01,0x85,0x00,0x00,0x00,0x19,0x00,0x00, 0x00,0x03,0x83,0x00,0x00,0x00,0x00,0x06,0x18,0x26,0x00,0x50,0x7f,0xbf,0x0e, 0xf9,0x94,0xdb,0x18,0xff,0x8b,0xce,0x16,0xff,0x8c,0xcf,0x16,0xff,0x8c,0xcf, 0x17,0xff,0x82,0x8c,0xcf,0x16,0xff,0x01,0x8b,0xce,0x15,0xff,0x82,0x8c,0xcf, 0x16,0xff,0x82,0x8a,0xcd,0x14,0xff,0x82,0x8b,0xce,0x15,0xff,0x82,0x8a,0xcd, 0x14,0xff,0x04,0x89,0xcc,0x13,0xff,0x8f,0xd5,0x15,0xff,0x7b,0xb7,0x11,0xec, 0x07,0x0a,0x00,0x34,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x87, 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x11,0x04,0x06,0x00,0x57,0x74,0xae, 0x0c,0xf3,0x8c,0xd2,0x10,0xff,0x82,0x85,0xc8,0x0f,0xff,0x11,0x88,0xcd,0x10, 0xff,0x79,0xb9,0x0b,0xff,0x4a,0x73,0x00,0xff,0x27,0x3d,0x02,0xbc,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x29,0x38, 0x54,0x04,0xc4,0x90,0xd7,0x11,0xff,0x86,0xc9,0x11,0xff,0x88,0xcc,0x11,0xff, 0x86,0xc9,0x0f,0xff,0x4a,0x72,0x01,0xff,0x15,0x20,0x01,0xa0,0x00,0x00,0x00, 0x12,0x00,0x00,0x00,0x04,0x83,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x02, 0x03,0x05,0x00,0x43,0x71,0xaa,0x0c,0xf3,0x8e,0xd3,0x13,0xff,0x87,0xca,0x11, 0xff,0x88,0xcb,0x11,0xff,0x88,0xca,0x12,0xff,0x8f,0xd5,0x12,0xff,0x62,0x97, 0x05,0xf6,0x09,0x0d,0x00,0x31,0x00,0x00,0x00,0x00,0x0e,0x15,0x00,0x00,0x21, 0x33,0x01,0x3a,0x78,0xb4,0x0e,0xdc,0x91,0xda,0x13,0xff,0x82,0x87,0xca,0x11, 0xff,0x07,0x8e,0xd3,0x13,0xff,0x7e,0xbe,0x0f,0xff,0x40,0x63,0x01,0xff,0x38, 0x57,0x00,0xff,0x1a,0x28,0x01,0xa6,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0e, 0x83,0x00,0x00,0x00,0x00,0x0b,0x1a,0x28,0x01,0x4d,0x7c,0xbb,0x0b,0xf6,0x8f, 0xd6,0x12,0xff,0x87,0xc9,0x11,0xff,0x86,0xc9,0x10,0xff,0x86,0xc9,0x11,0xff, 0x89,0xcd,0x11,0xff,0x8d,0xd4,0x13,0xff,0x8a,0xce,0x13,0xff,0x87,0xca,0x12, 0xff,0x87,0xca,0x11,0xff,0x85,0x86,0xc9,0x10,0xff,0x82,0x85,0xc8,0x0f,0xff, 0x04,0x86,0xc9,0x10,0xff,0x8b,0xd1,0x11,0xff,0x78,0xb4,0x0e,0xed,0x06,0x0a, 0x00,0x35,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x87,0x00,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x26,0x2e,0x46,0x03,0xa8, 0x8c,0xd5,0x0c,0xff,0x82,0xc5,0x0b,0xff,0x82,0xc5,0x0c,0xff,0x81,0xc5,0x0c, 0xff,0x84,0xc9,0x0d,0xff,0x5f,0x93,0x02,0xff,0x42,0x66,0x01,0xfb,0x0b,0x10, 0x01,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x19,0x09, 0x0e,0x00,0x7d,0x73,0xaf,0x0a,0xff,0x88,0xcf,0x0e,0xff,0x82,0xc5,0x0d,0xff, 0x88,0xcd,0x0e,0xff,0x6a,0xa1,0x05,0xff,0x2f,0x48,0x01,0xe3,0x01,0x01,0x01, 0x17,0x84,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x03,0x05,0x00,0x43, 0x6e,0xa8,0x09,0xf3,0x89,0xcf,0x0f,0xff,0x82,0x83,0xc6,0x0d,0xff,0x08,0x84, 0xc6,0x0e,0xff,0x85,0xc9,0x0e,0xff,0x86,0xcc,0x0c,0xff,0x37,0x56,0x01,0xb8, 0x07,0x0b,0x00,0x00,0x39,0x56,0x03,0x56,0x81,0xc2,0x0c,0xf2,0x8c,0xd3,0x10, 0xff,0x82,0x83,0xc6,0x0e,0xff,0x08,0x8a,0xd1,0x0f,0xff,0x7a,0xb8,0x0b,0xff, 0x40,0x62,0x01,0xff,0x39,0x58,0x00,0xff,0x1f,0x31,0x01,0xb8,0x00,0x00,0x00, 0x3a,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x0d, 0x1d,0x2c,0x01,0x50,0x7b,0xbc,0x08,0xf6,0x8b,0xd1,0x0e,0xff,0x82,0xc5,0x0d, 0xff,0x83,0xc6,0x0e,0xff,0x83,0xc5,0x0d,0xff,0x89,0xce,0x0e,0xff,0x7c,0xba, 0x0c,0xff,0x5e,0x8f,0x07,0xff,0x83,0xc6,0x0d,0xff,0x8a,0xcf,0x0e,0xff,0x84, 0xc7,0x0e,0xff,0x83,0xc6,0x0e,0xff,0x82,0x83,0xc6,0x0d,0xff,0x01,0x82,0xc5, 0x0d,0xff,0x82,0x82,0xc5,0x0c,0xff,0x82,0x83,0xc6,0x0d,0xff,0x03,0x88,0xcd, 0x0d,0xff,0x74,0xb0,0x0a,0xec,0x06,0x0a,0x00,0x35,0x97,0x00,0x00,0x00,0x00, 0x82,0xff,0xff,0xff,0x00,0x88,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x14, 0x01,0x02,0x00,0x50,0x62,0x95,0x06,0xea,0x88,0xd0,0x09,0xff,0x7e,0xc1,0x09, 0xff,0x7e,0xc1,0x08,0xff,0x81,0xc6,0x09,0xff,0x76,0xb5,0x06,0xff,0x53,0x81, 0x01,0xff,0x2d,0x45,0x02,0xaa,0x82,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00, 0x0d,0x00,0x00,0x00,0x3f,0x38,0x57,0x02,0xd8,0x85,0xcc,0x09,0xff,0x80,0xc3, 0x09,0xff,0x81,0xc5,0x0a,0xff,0x7f,0xc2,0x08,0xff,0x52,0x7e,0x01,0xff,0x14, 0x1f,0x01,0x73,0x84,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x03,0x05, 0x00,0x42,0x6b,0xa5,0x07,0xf3,0x86,0xcc,0x0a,0xff,0x84,0x80,0xc3,0x0a,0xff, 0x1f,0x85,0xca,0x0c,0xff,0x6d,0xa7,0x05,0xfd,0x52,0x7e,0x03,0xb0,0x84,0xc9, 0x0a,0xf9,0x85,0xca,0x0a,0xff,0x80,0xc2,0x0b,0xff,0x81,0xc4,0x0a,0xff,0x87, 0xcd,0x0b,0xff,0x73,0xae,0x08,0xff,0x3d,0x5f,0x01,0xff,0x3a,0x5a,0x00,0xff, 0x22,0x35,0x01,0xc0,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x16,0x00,0x00,0x00, 0x02,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x36,0x01,0x55,0x7c,0xbd, 0x07,0xf7,0x87,0xce,0x0b,0xff,0x7f,0xc1,0x09,0xff,0x80,0xc3,0x0a,0xff,0x7f, 0xc2,0x09,0xff,0x87,0xcd,0x0a,0xff,0x75,0xb2,0x08,0xff,0x41,0x64,0x02,0xff, 0x33,0x4e,0x00,0xff,0x44,0x69,0x02,0xff,0x6d,0xa7,0x08,0xff,0x86,0xcc,0x0b, 0xff,0x84,0xca,0x0b,0xff,0x82,0x80,0xc3,0x0a,0xff,0x82,0x7f,0xc2,0x09,0xff, 0x82,0x80,0xc3,0x0a,0xff,0x04,0x7f,0xc2,0x09,0xff,0x83,0xc9,0x09,0xff,0x70, 0xab,0x07,0xec,0x06,0x09,0x00,0x34,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff, 0xff,0x00,0x88,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x27,0x19,0x26,0x01,0x8f,0x7e,0xc2,0x05,0xff,0x7e,0xc3,0x06,0xff,0x82,0x7c, 0xbf,0x06,0xff,0x0f,0x7f,0xc4,0x06,0xff,0x64,0x9b,0x02,0xff,0x4d,0x77,0x01, 0xfb,0x10,0x18,0x01,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x1f,0x08,0x0d,0x00,0x83,0x5f,0x93,0x03,0xff,0x83,0xcb,0x07,0xff,0x7c, 0xbf,0x07,0xff,0x80,0xc5,0x07,0xff,0x72,0xb1,0x04,0xff,0x3d,0x5f,0x01,0xe6, 0x03,0x05,0x01,0x1a,0x83,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x03, 0x05,0x00,0x42,0x6a,0xa3,0x06,0xf3,0x83,0xc9,0x08,0xff,0x7d,0xbf,0x07,0xff, 0x82,0x7d,0xc0,0x07,0xff,0x22,0x7e,0xc1,0x08,0xff,0x7d,0xc0,0x07,0xff,0x7f, 0xc3,0x07,0xff,0x83,0xc8,0x07,0xff,0x7f,0xc3,0x08,0xff,0x7c,0xbf,0x07,0xff, 0x7f,0xc3,0x07,0xff,0x84,0xca,0x08,0xff,0x66,0x9c,0x05,0xff,0x3a,0x59,0x01, 0xff,0x3b,0x5b,0x01,0xff,0x22,0x34,0x01,0xbd,0x00,0x00,0x00,0x44,0x00,0x00, 0x00,0x19,0x00,0x00,0x00,0x02,0x06,0x0a,0x00,0x00,0x0f,0x17,0x00,0x00,0x36, 0x53,0x02,0x6d,0x7d,0xc1,0x06,0xfb,0x83,0xc9,0x07,0xff,0x7d,0xbf,0x07,0xff, 0x7d,0xc0,0x07,0xff,0x7e,0xc2,0x07,0xff,0x85,0xcc,0x08,0xff,0x68,0xa0,0x05, 0xff,0x3b,0x5c,0x01,0xff,0x34,0x51,0x01,0xf8,0x3e,0x5f,0x01,0xff,0x3b,0x5b, 0x01,0xff,0x36,0x54,0x00,0xff,0x4d,0x77,0x02,0xff,0x73,0xb0,0x07,0xff,0x84, 0xca,0x08,0xff,0x80,0xc4,0x08,0xff,0x83,0x7d,0xc0,0x07,0xff,0x82,0x7c,0xbf, 0x06,0xff,0x03,0x81,0xc7,0x07,0xff,0x6d,0xa9,0x05,0xeb,0x06,0x09,0x00,0x34, 0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x89,0x00,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x43,0x3f,0x62,0x02,0xce,0x85,0xce, 0x03,0xff,0x82,0x79,0xbc,0x03,0xff,0x10,0x7a,0xbe,0x02,0xff,0x77,0xb8,0x02, 0xff,0x5b,0x8e,0x01,0xff,0x37,0x56,0x02,0xc2,0x03,0x04,0x01,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x3c,0x23,0x35,0x01,0xca,0x71, 0xb0,0x03,0xff,0x7f,0xc5,0x04,0xff,0x7a,0xbd,0x04,0xff,0x7c,0xc1,0x03,0xff, 0x6a,0xa4,0x02,0xff,0x2d,0x46,0x02,0xa7,0x00,0x00,0x01,0x00,0x82,0x00,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x04,0x06,0x00,0x42,0x68,0xa1,0x03,0xf3, 0x7f,0xc6,0x04,0xff,0x7b,0xbd,0x05,0xff,0x82,0x7a,0xbd,0x04,0xff,0x2a,0x7b, 0xbd,0x05,0xff,0x7a,0xbe,0x04,0xff,0x7a,0xbe,0x05,0xff,0x7a,0xbd,0x04,0xff, 0x7b,0xbe,0x05,0xff,0x7f,0xc5,0x05,0xff,0x7c,0xbf,0x05,0xff,0x56,0x84,0x03, 0xff,0x38,0x56,0x01,0xff,0x3d,0x5c,0x01,0xff,0x1d,0x2c,0x01,0xb0,0x00,0x00, 0x00,0x43,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x03,0x01,0x01,0x00,0x00,0x15, 0x21,0x01,0x02,0x55,0x84,0x02,0x89,0x7d,0xc3,0x04,0xff,0x7e,0xc3,0x04,0xff, 0x7a,0xbd,0x04,0xff,0x7b,0xbd,0x05,0xff,0x7d,0xc1,0x04,0xff,0x80,0xc6,0x05, 0xff,0x5c,0x8e,0x03,0xff,0x39,0x59,0x01,0xff,0x2d,0x46,0x01,0xe4,0x08,0x0c, 0x00,0x83,0x10,0x19,0x01,0x93,0x34,0x4e,0x01,0xe4,0x41,0x63,0x01,0xff,0x38, 0x57,0x01,0xff,0x39,0x57,0x01,0xff,0x55,0x83,0x03,0xff,0x78,0xb9,0x05,0xff, 0x80,0xc7,0x05,0xff,0x7b,0xbe,0x04,0xff,0x7a,0xbc,0x04,0xff,0x7a,0xbd,0x04, 0xff,0x79,0xbc,0x03,0xff,0x7e,0xc4,0x03,0xff,0x6b,0xa6,0x03,0xea,0x05,0x08, 0x00,0x32,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x89,0x00,0x00, 0x00,0x00,0x1f,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x23,0x04,0x07,0x01,0x6e, 0x61,0x96,0x01,0xf5,0x7f,0xc7,0x01,0xff,0x76,0xb8,0x01,0xff,0x76,0xb9,0x01, 0xff,0x79,0xbd,0x00,0xff,0x6e,0xaa,0x01,0xff,0x53,0x81,0x01,0xff,0x1f,0x2f, 0x02,0x6a,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x1e,0x03, 0x04,0x00,0x65,0x39,0x58,0x01,0xf0,0x75,0xb7,0x02,0xff,0x7b,0xc0,0x02,0xff, 0x77,0xbb,0x01,0xff,0x7a,0xbe,0x01,0xff,0x67,0x9f,0x01,0xff,0x20,0x31,0x02, 0x76,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x07, 0x00,0x42,0x67,0xa1,0x01,0xf2,0x7c,0xc3,0x02,0xff,0x77,0xba,0x01,0xff,0x78, 0xbb,0x02,0xff,0x78,0xbb,0x01,0xff,0x82,0x78,0xbb,0x02,0xff,0x23,0x79,0xbc, 0x02,0xff,0x7c,0xc1,0x02,0xff,0x7d,0xc3,0x02,0xff,0x69,0xa4,0x02,0xff,0x44, 0x69,0x01,0xff,0x3a,0x58,0x01,0xff,0x3a,0x59,0x02,0xfa,0x17,0x22,0x01,0x99, 0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x03,0x10,0x19,0x01, 0x00,0x21,0x33,0x01,0x18,0x4f,0x7b,0x01,0xad,0x80,0xc8,0x01,0xff,0x7a,0xbe, 0x02,0xff,0x77,0xba,0x02,0xff,0x77,0xbb,0x02,0xff,0x7c,0xc2,0x02,0xff,0x78, 0xba,0x02,0xff,0x4d,0x78,0x02,0xff,0x39,0x58,0x01,0xff,0x29,0x3f,0x01,0xd2, 0x04,0x06,0x00,0x64,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x34,0x02,0x03,0x00, 0x58,0x1b,0x28,0x01,0xa8,0x38,0x56,0x01,0xf1,0x40,0x62,0x01,0xff,0x36,0x55, 0x01,0xff,0x3e,0x5e,0x01,0xff,0x5e,0x93,0x02,0xff,0x7c,0xc0,0x02,0xff,0x7a, 0xc0,0x02,0xff,0x82,0x77,0xba,0x01,0xff,0x03,0x7c,0xc2,0x01,0xff,0x68,0xa2, 0x01,0xe9,0x05,0x07,0x00,0x31,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff, 0x00,0x8a,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x34, 0x17,0x23,0x01,0xa0,0x72,0xb2,0x01,0xff,0x79,0xbc,0x01,0xff,0x74,0xb5,0x01, 0xff,0x75,0xb6,0x01,0xff,0x77,0xb9,0x01,0xff,0x66,0x9f,0x01,0xff,0x45,0x6b, 0x01,0xee,0x11,0x19,0x02,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x2c,0x0c,0x11,0x01,0x8d,0x43,0x67,0x01,0xff,0x73,0xb2,0x01,0xff, 0x7a,0xbd,0x01,0xff,0x76,0xb8,0x01,0xff,0x78,0xbb,0x01,0xff,0x69,0xa3,0x01, 0xfc,0x22,0x35,0x02,0x6b,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x05,0x08, 0x00,0x42,0x69,0xa3,0x01,0xf2,0x7c,0xc1,0x01,0xff,0x76,0xb8,0x01,0xff,0x77, 0xb8,0x01,0xff,0x77,0xb9,0x01,0xff,0x78,0xbb,0x01,0xff,0x7a,0xbf,0x01,0xff, 0x7a,0xbe,0x01,0xff,0x6b,0xa8,0x01,0xff,0x4f,0x7a,0x01,0xff,0x3a,0x5a,0x01, 0xff,0x3d,0x5f,0x01,0xff,0x31,0x4b,0x01,0xde,0x0b,0x10,0x00,0x7b,0x00,0x00, 0x00,0x34,0x00,0x00,0x00,0x14,0x01,0x01,0x00,0x00,0x11,0x1a,0x01,0x00,0x26, 0x3b,0x01,0x41,0x6d,0xa8,0x01,0xda,0x7f,0xc5,0x01,0xff,0x82,0x76,0xb7,0x01, 0xff,0x18,0x76,0xb8,0x01,0xff,0x7b,0xc1,0x01,0xff,0x6d,0xa9,0x01,0xff,0x43, 0x67,0x01,0xff,0x38,0x57,0x01,0xff,0x20,0x31,0x01,0xbb,0x01,0x02,0x00,0x54, 0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x09,0x00,0x00,0x00, 0x1d,0x00,0x00,0x00,0x35,0x05,0x08,0x00,0x68,0x21,0x33,0x01,0xba,0x3c,0x5d, 0x01,0xfa,0x3e,0x5f,0x01,0xff,0x36,0x53,0x01,0xff,0x49,0x71,0x01,0xff,0x6f, 0xad,0x01,0xff,0x77,0xba,0x01,0xff,0x76,0xb6,0x01,0xff,0x7a,0xbe,0x01,0xff, 0x66,0x9e,0x01,0xe8,0x04,0x05,0x00,0x30,0x97,0x00,0x00,0x00,0x00,0x82,0xff, 0xff,0xff,0x00,0x8a,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x19,0x00,0x00,0x00,0x49,0x2d,0x45,0x01,0xcb,0x77,0xba,0x01,0xff,0x73, 0xb4,0x01,0xff,0x71,0xb0,0x01,0xff,0x82,0x73,0xb2,0x01,0xff,0x2f,0x62,0x98, 0x01,0xff,0x38,0x55,0x02,0xc7,0x02,0x02,0x01,0x0a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x12,0x00,0x00,0x00,0x3a,0x14,0x1e,0x01,0xa4,0x43,0x68,0x01,0xff, 0x6b,0xa6,0x01,0xff,0x78,0xba,0x01,0xff,0x73,0xb4,0x01,0xff,0x76,0xb8,0x01, 0xff,0x70,0xae,0x01,0xff,0x3d,0x5f,0x02,0x8f,0x14,0x1e,0x01,0x0b,0x00,0x00, 0x00,0x31,0x5d,0x91,0x01,0xf2,0x75,0xb5,0x01,0xff,0x74,0xb4,0x01,0xff,0x74, 0xb5,0x01,0xff,0x72,0xb1,0x01,0xff,0x6b,0xa6,0x01,0xff,0x5d,0x91,0x01,0xff, 0x49,0x72,0x01,0xff,0x3c,0x5b,0x01,0xff,0x3d,0x5d,0x01,0xff,0x3a,0x5a,0x01, 0xf9,0x1e,0x2e,0x00,0xb3,0x02,0x03,0x00,0x59,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x0d,0x02,0x03,0x00,0x00,0x0b,0x11,0x01,0x07,0x47,0x6f,0x01,0x81,0x74, 0xb5,0x01,0xf7,0x79,0xbc,0x01,0xff,0x73,0xb2,0x01,0xff,0x73,0xb3,0x01,0xff, 0x76,0xb8,0x01,0xff,0x78,0xba,0x01,0xff,0x5c,0x8e,0x01,0xff,0x3d,0x5e,0x01, 0xff,0x36,0x52,0x01,0xf6,0x14,0x20,0x00,0x9a,0x00,0x00,0x00,0x45,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x07,0x82,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x3d,0x0a,0x10, 0x00,0x79,0x2a,0x41,0x01,0xce,0x3a,0x58,0x01,0xf9,0x31,0x4a,0x01,0xff,0x50, 0x7c,0x01,0xff,0x76,0xb7,0x01,0xff,0x73,0xb2,0x01,0xff,0x77,0xb9,0x01,0xff, 0x63,0x99,0x01,0xe6,0x03,0x04,0x00,0x2e,0x97,0x00,0x00,0x00,0x00,0x82,0xff, 0xff,0xff,0x00,0x8b,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x62,0x3e,0x61,0x02,0xe8,0x76,0xb7,0x01,0xff,0x6f, 0xad,0x01,0xff,0x6e,0xab,0x01,0xff,0x6f,0xae,0x01,0xff,0x6f,0xad,0x01,0xff, 0x5e,0x91,0x01,0xff,0x2c,0x43,0x02,0x9c,0x13,0x1d,0x01,0x00,0x01,0x02,0x00, 0x00,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x42,0x17,0x23,0x01,0xaa,0x3d,0x5e, 0x01,0xff,0x5d,0x90,0x01,0xff,0x72,0xb2,0x01,0xff,0x73,0xb2,0x01,0xff,0x73, 0xb1,0x01,0xff,0x77,0xb9,0x01,0xff,0x5c,0x8e,0x01,0xd3,0x21,0x33,0x01,0x8e, 0x3a,0x5a,0x01,0xf5,0x44,0x69,0x01,0xff,0x45,0x6b,0x01,0xff,0x44,0x6a,0x01, 0xff,0x41,0x66,0x01,0xff,0x3d,0x5f,0x01,0xff,0x3c,0x5c,0x01,0xff,0x3e,0x5e, 0x01,0xff,0x39,0x57,0x01,0xf6,0x23,0x37,0x01,0xc1,0x09,0x0d,0x00,0x76,0x00, 0x00,0x00,0x3d,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x00,0x0f,0x18,0x01,0x00, 0x2d,0x47,0x02,0x45,0x62,0x98,0x01,0xcb,0x78,0xba,0x01,0xff,0x72,0xb1,0x01, 0xff,0x70,0xae,0x01,0xff,0x70,0xaf,0x01,0xff,0x75,0xb7,0x01,0xff,0x6c,0xa9, 0x01,0xff,0x4b,0x73,0x01,0xff,0x3a,0x5a,0x01,0xff,0x2f,0x48,0x01,0xe1,0x0a, 0x10,0x00,0x7c,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x03, 0x85,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x1b,0x00,0x00,0x00,0x4c,0x2e,0x46,0x01,0xdc,0x5e,0x92,0x01,0xff, 0x71,0xb0,0x01,0xff,0x6f,0xad,0x01,0xff,0x6f,0xac,0x01,0xff,0x74,0xb4,0x01, 0xff,0x5f,0x93,0x01,0xe4,0x02,0x03,0x00,0x2b,0x97,0x00,0x00,0x00,0x00,0x82, 0xff,0xff,0xff,0x00,0x8c,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x2d,0x04,0x06,0x01,0x7b,0x49,0x70,0x02,0xf4,0x72,0xaf,0x01,0xff, 0x6c,0xa7,0x01,0xff,0x6b,0xa6,0x01,0xff,0x6c,0xa8,0x01,0xff,0x6d,0xa9,0x01, 0xff,0x5b,0x8d,0x01,0xff,0x31,0x4b,0x02,0x82,0x0c,0x12,0x01,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x43,0x13,0x1c,0x01,0x9c,0x34, 0x51,0x01,0xf6,0x4a,0x73,0x01,0xff,0x60,0x95,0x01,0xff,0x6e,0xaa,0x01,0xff, 0x72,0xb1,0x01,0xff,0x6d,0xa9,0x01,0xff,0x42,0x66,0x01,0xff,0x2f,0x48,0x01, 0xe2,0x2d,0x45,0x01,0xdd,0x35,0x51,0x01,0xf4,0x37,0x55,0x01,0xf8,0x37,0x54, 0x01,0xf6,0x33,0x4e,0x01,0xea,0x29,0x3e,0x01,0xcd,0x17,0x24,0x00,0xa6,0x05, 0x08,0x00,0x71,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x25,0x02,0x04,0x00,0x07, 0x13,0x1d,0x01,0x00,0x35,0x54,0x01,0x2d,0x5e,0x92,0x02,0xa2,0x6f,0xac,0x01, 0xfe,0x72,0xb1,0x01,0xff,0x6c,0xa8,0x01,0xff,0x6d,0xa9,0x01,0xff,0x70,0xae, 0x01,0xff,0x71,0xae,0x01,0xff,0x5b,0x8d,0x01,0xff,0x40,0x62,0x01,0xff,0x39, 0x57,0x01,0xff,0x21,0x32,0x01,0xbb,0x02,0x03,0x00,0x5e,0x00,0x00,0x00,0x2e, 0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x00,0x10,0x04, 0x06,0x00,0x00,0x07,0x0b,0x01,0x00,0x06,0x09,0x01,0x00,0x06,0x09,0x00,0x00, 0x02,0x03,0x01,0x00,0x04,0x07,0x01,0x00,0x10,0x19,0x01,0x30,0x3a,0x5a,0x01, 0xc9,0x6a,0xa5,0x01,0xfe,0x72,0xb0,0x01,0xff,0x6d,0xa9,0x01,0xff,0x6c,0xa7, 0x01,0xff,0x6c,0xa8,0x01,0xff,0x71,0xaf,0x01,0xff,0x5b,0x8d,0x01,0xe2,0x02, 0x02,0x00,0x2a,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x8d,0x00, 0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x37,0x0a,0x10,0x01, 0x8c,0x4c,0x74,0x01,0xf9,0x6d,0xa9,0x01,0xff,0x69,0xa2,0x01,0xff,0x67,0xa0, 0x01,0xff,0x68,0xa1,0x01,0xff,0x6b,0xa7,0x01,0xff,0x5a,0x8d,0x01,0xff,0x2c, 0x42,0x03,0x80,0x08,0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19, 0x00,0x00,0x00,0x3c,0x09,0x0d,0x00,0x7b,0x28,0x3d,0x01,0xd4,0x3c,0x5d,0x01, 0xff,0x48,0x6f,0x01,0xff,0x57,0x86,0x01,0xff,0x5d,0x8f,0x01,0xff,0x3f,0x60, 0x01,0xff,0x18,0x27,0x01,0xac,0x00,0x00,0x00,0x56,0x02,0x03,0x00,0x6c,0x03, 0x04,0x00,0x72,0x03,0x04,0x00,0x6f,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x4b, 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x01,0x15,0x21,0x01, 0x05,0x2e,0x47,0x01,0x38,0x5d,0x91,0x01,0x9d,0x6c,0xa8,0x01,0xf4,0x6e,0xab, 0x01,0xff,0x6a,0xa5,0x01,0xff,0x69,0xa3,0x01,0xff,0x6b,0xa6,0x01,0xff,0x6c, 0xa9,0x01,0xff,0x61,0x96,0x01,0xff,0x48,0x6e,0x01,0xff,0x3c,0x5c,0x01,0xff, 0x32,0x4c,0x01,0xe7,0x0f,0x16,0x00,0x8c,0x00,0x00,0x00,0x44,0x00,0x00,0x00, 0x23,0x00,0x00,0x00,0x0a,0x83,0x00,0x00,0x00,0x00,0x11,0x05,0x08,0x00,0x00, 0x26,0x39,0x01,0x00,0x26,0x38,0x01,0x00,0x22,0x33,0x02,0x00,0x25,0x37,0x02, 0x00,0x0b,0x11,0x01,0x09,0x28,0x3e,0x02,0x79,0x5d,0x90,0x01,0xee,0x71,0xb0, 0x01,0xff,0x6b,0xa5,0x01,0xff,0x69,0xa1,0x01,0xff,0x69,0xa3,0x01,0xff,0x69, 0xa2,0x01,0xff,0x69,0xa3,0x01,0xff,0x6d,0xaa,0x01,0xff,0x56,0x87,0x01,0xe0, 0x01,0x01,0x00,0x27,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x8d, 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x15,0x00,0x00, 0x00,0x3c,0x0e,0x15,0x01,0x97,0x48,0x70,0x01,0xfb,0x68,0xa2,0x01,0xff,0x66, 0x9f,0x01,0xff,0x64,0x9b,0x01,0xff,0x65,0x9c,0x01,0xff,0x6a,0xa5,0x01,0xff, 0x5f,0x95,0x01,0xff,0x31,0x4c,0x02,0x8f,0x02,0x03,0x01,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x57,0x12,0x1b, 0x00,0x98,0x2b,0x41,0x01,0xd8,0x39,0x57,0x01,0xfd,0x40,0x63,0x01,0xff,0x41, 0x65,0x01,0xff,0x18,0x24,0x01,0x96,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0f, 0x06,0x0a,0x00,0x13,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x09,0x0e,0x15,0x01, 0x07,0x23,0x37,0x01,0x0f,0x23,0x36,0x01,0x2a,0x3e,0x61,0x01,0x6c,0x57,0x88, 0x01,0xbd,0x69,0xa3,0x01,0xfd,0x6b,0xa6,0x01,0xff,0x67,0xa0,0x01,0xff,0x66, 0x9e,0x01,0xff,0x69,0xa2,0x01,0xff,0x69,0xa4,0x01,0xff,0x60,0x95,0x01,0xff, 0x4b,0x74,0x01,0xff,0x3e,0x5f,0x01,0xff,0x38,0x57,0x01,0xfb,0x20,0x32,0x01, 0xba,0x03,0x04,0x00,0x64,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x17,0x00,0x00, 0x00,0x04,0x82,0x00,0x00,0x00,0x00,0x0c,0x04,0x07,0x00,0x00,0x0e,0x15,0x01, 0x00,0x33,0x4c,0x01,0x00,0x2d,0x43,0x01,0x00,0x23,0x35,0x01,0x00,0x1e,0x2d, 0x02,0x02,0x2f,0x47,0x02,0x55,0x51,0x7e,0x01,0xce,0x6c,0xa8,0x01,0xff,0x6b, 0xa6,0x01,0xff,0x66,0x9e,0x01,0xff,0x66,0x9d,0x01,0xff,0x82,0x66,0x9e,0x01, 0xff,0x05,0x65,0x9d,0x01,0xff,0x65,0x9e,0x01,0xff,0x6a,0xa5,0x01,0xff,0x53, 0x81,0x01,0xdd,0x00,0x00,0x00,0x25,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff, 0xff,0x00,0x8e,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x19,0x00,0x00,0x00,0x3f,0x0e,0x15,0x01,0x96,0x42,0x65,0x01,0xf8,0x63,0x98, 0x01,0xff,0x65,0x9d,0x01,0xff,0x62,0x99,0x01,0xff,0x62,0x98,0x01,0xff,0x67, 0xa1,0x01,0xff,0x66,0x9e,0x01,0xff,0x39,0x58,0x02,0xbb,0x13,0x1c,0x01,0x26, 0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x1f,0x00,0x00,0x00, 0x38,0x00,0x00,0x00,0x58,0x0b,0x10,0x00,0x85,0x1b,0x29,0x00,0xb4,0x2c,0x43, 0x01,0xd3,0x43,0x68,0x01,0xd3,0x36,0x54,0x01,0x85,0x3a,0x5b,0x01,0x6c,0x5a, 0x8d,0x01,0x66,0x3b,0x5d,0x01,0x6f,0x38,0x58,0x01,0x84,0x4e,0x7a,0x01,0xa2, 0x63,0x99,0x02,0xd1,0x66,0x9e,0x01,0xf8,0x6a,0xa5,0x01,0xff,0x68,0xa1,0x01, 0xff,0x64,0x9b,0x01,0xff,0x64,0x9c,0x01,0xff,0x66,0xa0,0x01,0xff,0x65,0x9c, 0x01,0xff,0x5b,0x8d,0x01,0xff,0x4a,0x72,0x01,0xff,0x3f,0x60,0x01,0xff,0x3a, 0x5a,0x01,0xff,0x28,0x3d,0x01,0xd0,0x0b,0x11,0x00,0x80,0x00,0x00,0x00,0x44, 0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x0c,0x82,0x00,0x00,0x00,0x00,0x0b,0x02, 0x03,0x00,0x00,0x10,0x19,0x01,0x00,0x1d,0x2d,0x01,0x00,0x15,0x20,0x02,0x00, 0x31,0x4a,0x01,0x00,0x28,0x3c,0x01,0x03,0x30,0x48,0x01,0x51,0x4e,0x7a,0x01, 0xc0,0x68,0xa2,0x01,0xff,0x69,0xa5,0x01,0xff,0x63,0x9a,0x01,0xff,0x83,0x62, 0x99,0x01,0xff,0x01,0x63,0x99,0x01,0xff,0x82,0x62,0x99,0x01,0xff,0x04,0x63, 0x99,0x01,0xff,0x67,0xa1,0x01,0xff,0x4f,0x7b,0x01,0xdb,0x00,0x00,0x00,0x23, 0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x8f,0x00,0x00,0x00,0x00, 0x1c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x3e,0x0a,0x10, 0x01,0x8c,0x38,0x56,0x01,0xf1,0x5a,0x8d,0x01,0xff,0x64,0x9c,0x01,0xff,0x62, 0x98,0x01,0xff,0x60,0x95,0x01,0xff,0x63,0x9a,0x01,0xff,0x6b,0xa6,0x01,0xff, 0x54,0x82,0x01,0xe6,0x21,0x32,0x02,0x6b,0x02,0x02,0x01,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x30,0x00,0x00, 0x00,0x40,0x02,0x01,0x00,0x66,0x57,0x87,0x01,0xf8,0x6f,0xad,0x01,0xff,0x69, 0xa4,0x01,0xff,0x65,0x9d,0x01,0xff,0x69,0xa3,0x01,0xff,0x6a,0xa5,0x01,0xff, 0x67,0xa1,0x01,0xff,0x64,0x9c,0x01,0xff,0x82,0x64,0x9b,0x01,0xff,0x1b,0x65, 0x9c,0x01,0xff,0x63,0x9a,0x01,0xff,0x5d,0x91,0x01,0xff,0x52,0x7f,0x01,0xff, 0x45,0x6c,0x01,0xff,0x3f,0x61,0x01,0xff,0x3a,0x59,0x01,0xfe,0x29,0x3f,0x01, 0xd2,0x0e,0x16,0x01,0x8b,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x2e,0x00,0x00, 0x00,0x15,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x06, 0x0a,0x00,0x00,0x20,0x31,0x02,0x00,0x21,0x32,0x01,0x00,0x26,0x3a,0x02,0x00, 0x11,0x1b,0x02,0x0f,0x3d,0x5d,0x01,0x5f,0x54,0x82,0x01,0xc5,0x68,0xa1,0x01, 0xff,0x68,0xa2,0x01,0xff,0x61,0x98,0x01,0xff,0x60,0x96,0x01,0xff,0x61,0x97, 0x01,0xff,0x82,0x61,0x96,0x01,0xff,0x08,0x61,0x97,0x01,0xff,0x61,0x96,0x01, 0xff,0x60,0x96,0x01,0xff,0x61,0x97,0x01,0xff,0x60,0x96,0x01,0xff,0x65,0x9e, 0x01,0xff,0x4d,0x77,0x01,0xda,0x00,0x00,0x00,0x21,0x97,0x00,0x00,0x00,0x00, 0x82,0xff,0xff,0xff,0x00,0x90,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x39,0x06,0x09,0x01,0x79,0x2b,0x42,0x01, 0xde,0x50,0x7b,0x01,0xff,0x61,0x95,0x01,0xff,0x63,0x9a,0x01,0xff,0x60,0x96, 0x01,0xff,0x60,0x95,0x01,0xff,0x68,0xa2,0x01,0xff,0x67,0xa1,0x01,0xff,0x46, 0x6d,0x01,0xc7,0x1c,0x2b,0x01,0x59,0x09,0x0d,0x01,0x0b,0x82,0x00,0x00,0x00, 0x00,0x06,0x00,0x00,0x00,0x0b,0x03,0x04,0x00,0x4a,0x53,0x80,0x01,0xf2,0x67, 0xa1,0x01,0xff,0x63,0x9a,0x01,0xff,0x63,0x9b,0x01,0xff,0x82,0x63,0x9a,0x01, 0xff,0x1d,0x62,0x99,0x01,0xff,0x61,0x97,0x01,0xff,0x5d,0x91,0x01,0xff,0x57, 0x87,0x01,0xff,0x4f,0x7a,0x01,0xff,0x47,0x6d,0x01,0xff,0x41,0x64,0x01,0xff, 0x3d,0x5d,0x01,0xff,0x35,0x51,0x01,0xef,0x22,0x35,0x01,0xc1,0x0b,0x11,0x01, 0x84,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x1a,0x00,0x00, 0x00,0x07,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x0b,0x10,0x01,0x00,0x15, 0x1f,0x01,0x00,0x10,0x17,0x01,0x00,0x1f,0x2d,0x01,0x00,0x21,0x32,0x01,0x30, 0x43,0x68,0x02,0x86,0x5a,0x8b,0x02,0xde,0x68,0xa2,0x01,0xff,0x67,0xa0,0x01, 0xff,0x61,0x96,0x01,0xff,0x60,0x95,0x01,0xff,0x60,0x96,0x01,0xff,0x82,0x61, 0x96,0x01,0xff,0x87,0x60,0x95,0x01,0xff,0x03,0x65,0x9d,0x01,0xff,0x4a,0x72, 0x01,0xd6,0x00,0x00,0x00,0x1e,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff, 0x00,0x91,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x12, 0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x61,0x1d,0x2b,0x01,0xbc,0x40,0x63,0x01, 0xfd,0x57,0x88,0x01,0xff,0x62,0x9a,0x01,0xff,0x64,0x9c,0x01,0xff,0x61,0x97, 0x01,0xff,0x63,0x99,0x01,0xff,0x6b,0xa7,0x01,0xff,0x68,0xa2,0x01,0xff,0x54, 0x82,0x01,0xdc,0x32,0x4e,0x01,0x8c,0x25,0x39,0x01,0x49,0x06,0x09,0x01,0x16, 0x03,0x06,0x00,0x3b,0x45,0x6b,0x01,0xf3,0x53,0x80,0x01,0xff,0x50,0x7c,0x01, 0xff,0x4e,0x7a,0x01,0xff,0x4d,0x77,0x01,0xff,0x4b,0x74,0x01,0xff,0x48,0x70, 0x01,0xff,0x45,0x6b,0x01,0xff,0x41,0x65,0x01,0xff,0x3f,0x60,0x01,0xff,0x3b, 0x5a,0x01,0xff,0x33,0x4e,0x01,0xea,0x24,0x38,0x01,0xca,0x14,0x1e,0x01,0x9b, 0x03,0x05,0x00,0x6c,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x2e,0x00,0x00,0x00, 0x1a,0x00,0x00,0x00,0x09,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x0b,0x10, 0x00,0x00,0x04,0x07,0x01,0x00,0x15,0x1f,0x01,0x00,0x18,0x24,0x01,0x26,0x33, 0x4f,0x01,0x6f,0x51,0x7d,0x01,0xc0,0x65,0x9d,0x01,0xf7,0x6c,0xa7,0x01,0xff, 0x67,0x9f,0x01,0xff,0x62,0x97,0x01,0xff,0x85,0x61,0x97,0x01,0xff,0x01,0x61, 0x96,0x01,0xff,0x83,0x60,0x96,0x01,0xff,0x84,0x60,0x95,0x01,0xff,0x03,0x66, 0x9e,0x01,0xff,0x47,0x6e,0x01,0xd3,0x00,0x00,0x00,0x1b,0x97,0x00,0x00,0x00, 0x00,0x82,0xff,0xff,0xff,0x00,0x93,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x4a,0x0c,0x13,0x01,0x8d,0x2c,0x43, 0x01,0xe0,0x47,0x6d,0x01,0xff,0x59,0x89,0x01,0xff,0x64,0x9a,0x01,0xff,0x67, 0x9f,0x01,0xff,0x64,0x9c,0x01,0xff,0x64,0x9b,0x01,0xff,0x69,0xa3,0x01,0xff, 0x6e,0xab,0x01,0xff,0x68,0xa2,0x01,0xff,0x5d,0x91,0x01,0xea,0x38,0x56,0x01, 0xd9,0x34,0x4f,0x01,0xee,0x33,0x4f,0x01,0xed,0x36,0x54,0x01,0xf5,0x36,0x53, 0x01,0xf4,0x35,0x51,0x01,0xf1,0x33,0x4e,0x01,0xeb,0x2f,0x48,0x01,0xe1,0x29, 0x3e,0x01,0xd5,0x20,0x32,0x01,0xc3,0x17,0x23,0x01,0xa5,0x0a,0x0f,0x00,0x87, 0x02,0x03,0x00,0x68,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x37,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x06,0x02,0x03,0x00,0x00,0x06,0x09, 0x00,0x00,0x0a,0x0e,0x01,0x00,0x1e,0x2e,0x01,0x01,0x19,0x26,0x01,0x2a,0x2d, 0x45,0x01,0x66,0x4b,0x74,0x01,0xb6,0x65,0x9b,0x01,0xf2,0x6e,0xac,0x01,0xff, 0x6b,0xa6,0x01,0xff,0x65,0x9c,0x01,0xff,0x84,0x63,0x99,0x01,0xff,0x03,0x62, 0x98,0x01,0xff,0x62,0x99,0x01,0xff,0x63,0x99,0x01,0xff,0x83,0x62,0x98,0x01, 0xff,0x09,0x63,0x99,0x01,0xff,0x62,0x99,0x01,0xff,0x62,0x98,0x01,0xff,0x62, 0x97,0x01,0xff,0x61,0x98,0x01,0xff,0x62,0x97,0x01,0xff,0x68,0xa1,0x01,0xff, 0x46,0x6c,0x01,0xd1,0x00,0x00,0x00,0x19,0x97,0x00,0x00,0x00,0x00,0x82,0xff, 0xff,0xff,0x00,0x04,0x04,0x04,0x04,0x00,0x1e,0x1e,0x1e,0x00,0x0b,0x0b,0x0b, 0x00,0x03,0x03,0x03,0x00,0x90,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x60,0x14,0x1f,0x01, 0xa3,0x2f,0x49,0x01,0xe5,0x45,0x6a,0x01,0xff,0x54,0x82,0x01,0xff,0x60,0x95, 0x01,0xff,0x67,0xa1,0x01,0xff,0x6a,0xa4,0x01,0xff,0x69,0xa3,0x01,0xff,0x6a, 0xa5,0x01,0xff,0x69,0xa4,0x01,0xff,0x44,0x6a,0x01,0xff,0x1c,0x2a,0x01,0xb5, 0x03,0x05,0x00,0x68,0x82,0x05,0x07,0x00,0x75,0x0a,0x04,0x06,0x00,0x71,0x03, 0x04,0x00,0x6a,0x00,0x01,0x00,0x60,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x47, 0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x22,0x00,0x00,0x00, 0x13,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x00,0x09,0x1f,0x30,0x01,0x00, 0x11,0x1a,0x01,0x12,0x26,0x3a,0x01,0x49,0x34,0x50,0x01,0x86,0x57,0x88,0x01, 0xcc,0x66,0x9e,0x01,0xf3,0x71,0xb0,0x01,0xff,0x70,0xae,0x01,0xff,0x69,0xa4, 0x01,0xff,0x82,0x67,0x9f,0x01,0xff,0x83,0x66,0x9e,0x01,0xff,0x89,0x65,0x9c, 0x01,0xff,0x82,0x65,0x9d,0x01,0xff,0x06,0x65,0x9c,0x01,0xff,0x64,0x9b,0x01, 0xff,0x63,0x9a,0x01,0xff,0x6a,0xa5,0x01,0xff,0x44,0x6a,0x01,0xce,0x00,0x00, 0x00,0x16,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x06,0x05,0x05, 0x05,0x00,0x23,0x23,0x23,0x00,0x0d,0x0d,0x0d,0x00,0x08,0x08,0x08,0x00,0x06, 0x06,0x06,0x00,0x02,0x02,0x02,0x00,0x8f,0x00,0x00,0x00,0x00,0x17,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x3f,0x01, 0x02,0x00,0x65,0x12,0x1c,0x01,0x9f,0x28,0x3d,0x01,0xd7,0x3b,0x5b,0x01,0xfb, 0x48,0x70,0x01,0xff,0x54,0x81,0x01,0xff,0x5c,0x8f,0x01,0xff,0x64,0x9d,0x01, 0xff,0x67,0xa0,0x01,0xff,0x42,0x66,0x01,0xff,0x1a,0x28,0x01,0x9f,0x00,0x00, 0x00,0x21,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x23,0x00, 0x00,0x00,0x1f,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x05, 0x82,0x00,0x00,0x00,0x00,0x0f,0x0e,0x16,0x01,0x00,0x09,0x0e,0x00,0x02,0x16, 0x21,0x01,0x28,0x29,0x3e,0x02,0x52,0x31,0x4a,0x01,0x82,0x53,0x81,0x02,0xbb, 0x60,0x96,0x02,0xe6,0x6f,0xad,0x01,0xff,0x77,0xb9,0x01,0xff,0x72,0xb1,0x01, 0xff,0x6e,0xaa,0x01,0xff,0x6a,0xa5,0x01,0xff,0x69,0xa4,0x01,0xff,0x6a,0xa5, 0x01,0xff,0x6a,0xa4,0x01,0xff,0x83,0x69,0xa3,0x01,0xff,0x02,0x68,0xa3,0x01, 0xff,0x69,0xa3,0x01,0xff,0x82,0x68,0xa2,0x01,0xff,0x82,0x68,0xa1,0x01,0xff, 0x01,0x69,0xa2,0x01,0xff,0x83,0x68,0xa2,0x01,0xff,0x01,0x68,0xa1,0x01,0xff, 0x83,0x68,0xa2,0x01,0xff,0x04,0x67,0xa0,0x01,0xff,0x6f,0xab,0x01,0xff,0x44, 0x69,0x01,0xc9,0x00,0x00,0x00,0x14,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff, 0xff,0x00,0x03,0x05,0x05,0x05,0x00,0x22,0x22,0x22,0x00,0x0d,0x0d,0x0d,0x00, 0x82,0x08,0x08,0x08,0x00,0x03,0x07,0x07,0x07,0x00,0x05,0x05,0x05,0x00,0x03, 0x03,0x03,0x00,0x8f,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x11,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x59,0x07, 0x0b,0x00,0x81,0x18,0x23,0x01,0xad,0x26,0x3a,0x01,0xd6,0x33,0x4f,0x01,0xee, 0x3d,0x5e,0x01,0xff,0x45,0x6a,0x01,0xff,0x44,0x6a,0x01,0xff,0x1c,0x2a,0x01, 0x9c,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x02,0x00,0x00,0x01,0x02,0x00,0x00, 0x01,0x06,0x01,0x01,0x01,0x0d,0x09,0x0e,0x01,0x1a,0x1a,0x28,0x02,0x2c,0x2b, 0x41,0x02,0x41,0x1e,0x2e,0x02,0x5c,0x2f,0x49,0x01,0x7f,0x4d,0x78,0x02,0xab, 0x5e,0x92,0x02,0xd5,0x68,0xa1,0x02,0xf1,0x76,0xb6,0x01,0xff,0x7b,0xbf,0x01, 0xff,0x77,0xb9,0x01,0xff,0x75,0xb5,0x01,0xff,0x71,0xaf,0x01,0xff,0x6f,0xac, 0x01,0xff,0x6e,0xac,0x01,0xff,0x83,0x6e,0xab,0x01,0xff,0x01,0x6e,0xac,0x01, 0xff,0x82,0x6e,0xab,0x01,0xff,0x83,0x6d,0xaa,0x01,0xff,0x05,0x6e,0xab,0x01, 0xff,0x6d,0xaa,0x01,0xff,0x6d,0xa9,0x01,0xff,0x6c,0xa9,0x01,0xff,0x6c,0xa8, 0x01,0xff,0x83,0x6d,0xa9,0x01,0xff,0x82,0x6c,0xa8,0x01,0xff,0x82,0x6c,0xa7, 0x01,0xff,0x05,0x6c,0xa8,0x01,0xff,0x6b,0xa7,0x01,0xff,0x74,0xb3,0x01,0xff, 0x44,0x68,0x02,0xc4,0x00,0x00,0x00,0x12,0x97,0x00,0x00,0x00,0x00,0x82,0xff, 0xff,0xff,0x00,0x03,0x05,0x05,0x05,0x00,0x22,0x22,0x22,0x00,0x0d,0x0d,0x0d, 0x00,0x82,0x08,0x08,0x08,0x00,0x01,0x07,0x07,0x07,0x00,0x83,0x06,0x06,0x06, 0x00,0x01,0x02,0x02,0x02,0x00,0x8f,0x00,0x00,0x00,0x00,0x1a,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x31,0x00,0x00, 0x00,0x43,0x00,0x00,0x00,0x57,0x03,0x05,0x00,0x70,0x09,0x0e,0x00,0x89,0x11, 0x1a,0x01,0x9f,0x1c,0x2c,0x01,0xb5,0x51,0x7d,0x01,0xed,0x5d,0x90,0x03,0xdc, 0x55,0x84,0x03,0xd5,0x55,0x82,0x03,0xd4,0x58,0x88,0x03,0xd9,0x5e,0x91,0x02, 0xde,0x65,0x9c,0x02,0xe7,0x6b,0xa8,0x02,0xf4,0x74,0xb4,0x02,0xff,0x7c,0xc1, 0x01,0xff,0x7e,0xc5,0x01,0xff,0x7d,0xc3,0x01,0xff,0x7b,0xbf,0x01,0xff,0x79, 0xbc,0x00,0xff,0x76,0xb7,0x00,0xff,0x74,0xb5,0x00,0xff,0x83,0x74,0xb4,0x01, 0xff,0x01,0x73,0xb3,0x01,0xff,0x82,0x73,0xb4,0x01,0xff,0x85,0x73,0xb3,0x01, 0xff,0x01,0x72,0xb3,0x01,0xff,0x82,0x72,0xb2,0x01,0xff,0x05,0x73,0xb3,0x01, 0xff,0x72,0xb3,0x01,0xff,0x72,0xb1,0x01,0xff,0x71,0xb1,0x01,0xff,0x71,0xb0, 0x01,0xff,0x82,0x72,0xb1,0x01,0xff,0x04,0x72,0xb2,0x01,0xff,0x72,0xb1,0x01, 0xff,0x71,0xb0,0x01,0xff,0x71,0xaf,0x01,0xff,0x82,0x70,0xaf,0x01,0xff,0x04, 0x70,0xae,0x01,0xff,0x78,0xbb,0x01,0xff,0x44,0x69,0x02,0xc1,0x00,0x00,0x00, 0x11,0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x03,0x05,0x05,0x05, 0x00,0x22,0x22,0x22,0x00,0x0d,0x0d,0x0d,0x00,0x82,0x08,0x08,0x08,0x00,0x01, 0x07,0x07,0x07,0x00,0x82,0x06,0x06,0x06,0x00,0x04,0x07,0x07,0x07,0x00,0x06, 0x06,0x06,0x00,0x04,0x04,0x04,0x00,0x01,0x01,0x01,0x00,0x8f,0x00,0x00,0x00, 0x00,0x0a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x3b, 0x00,0x00,0x00,0x5e,0x5b,0x8c,0x02,0xf4,0x89,0xd5,0x04,0xff,0x82,0x82,0xca, 0x05,0xff,0x07,0x82,0xc9,0x04,0xff,0x81,0xc8,0x05,0xff,0x80,0xc6,0x04,0xff, 0x7e,0xc3,0x04,0xff,0x7c,0xc1,0x04,0xff,0x7a,0xbe,0x03,0xff,0x79,0xbd,0x03, 0xff,0x85,0x79,0xbc,0x03,0xff,0x05,0x78,0xbb,0x02,0xff,0x78,0xbc,0x02,0xff, 0x79,0xbc,0x02,0xff,0x78,0xbb,0x02,0xff,0x79,0xbb,0x02,0xff,0x83,0x78,0xbb, 0x02,0xff,0x02,0x77,0xbb,0x02,0xff,0x77,0xba,0x02,0xff,0x82,0x78,0xba,0x02, 0xff,0x06,0x77,0xba,0x01,0xff,0x78,0xba,0x02,0xff,0x77,0xba,0x01,0xff,0x78, 0xba,0x02,0xff,0x78,0xba,0x01,0xff,0x77,0xb9,0x01,0xff,0x82,0x76,0xb9,0x01, 0xff,0x03,0x76,0xb8,0x01,0xff,0x76,0xb9,0x01,0xff,0x77,0xb9,0x01,0xff,0x82, 0x76,0xb8,0x01,0xff,0x82,0x75,0xb7,0x01,0xff,0x04,0x75,0xb6,0x01,0xff,0x7d, 0xc4,0x01,0xff,0x44,0x6a,0x02,0xbf,0x00,0x00,0x00,0x0f,0x97,0x00,0x00,0x00, 0x00,0x82,0xff,0xff,0xff,0x00,0x03,0x05,0x05,0x05,0x00,0x22,0x22,0x22,0x00, 0x0d,0x0d,0x0d,0x00,0x82,0x08,0x08,0x08,0x00,0x01,0x07,0x07,0x07,0x00,0x82, 0x06,0x06,0x06,0x00,0x06,0x07,0x07,0x07,0x00,0x06,0x06,0x06,0x00,0x03,0x03, 0x03,0x00,0x06,0x06,0x06,0x00,0x50,0x50,0x50,0x00,0x1b,0x1b,0x1b,0x00,0x91, 0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x0b,0x01,0x01,0x00,0x46,0x59,0x88,0x05,0xf1,0x86,0xcd,0x09,0xff,0x83, 0x7f,0xc1,0x09,0xff,0x8c,0x7f,0xc2,0x09,0xff,0x88,0x7e,0xc1,0x08,0xff,0x02, 0x7d,0xc0,0x07,0xff,0x7d,0xc1,0x07,0xff,0x83,0x7d,0xc0,0x07,0xff,0x06,0x7c, 0xc0,0x06,0xff,0x7d,0xc0,0x07,0xff,0x7d,0xc0,0x06,0xff,0x7c,0xbf,0x06,0xff, 0x7a,0xbd,0x04,0xff,0x7b,0xbe,0x05,0xff,0x82,0x7a,0xbd,0x05,0xff,0x01,0x7a, 0xbe,0x04,0xff,0x82,0x7b,0xbe,0x05,0xff,0x82,0x7a,0xbd,0x04,0xff,0x04,0x7a, 0xbc,0x04,0xff,0x83,0xcb,0x04,0xff,0x44,0x68,0x02,0xbe,0x00,0x00,0x00,0x0e, 0x97,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x03,0x05,0x05,0x05,0x00, 0x22,0x22,0x22,0x00,0x0d,0x0d,0x0d,0x00,0x82,0x08,0x08,0x08,0x00,0x01,0x07, 0x07,0x07,0x00,0x82,0x06,0x06,0x06,0x00,0x08,0x07,0x07,0x07,0x00,0x06,0x06, 0x06,0x00,0x03,0x03,0x03,0x00,0x01,0x01,0x01,0x00,0x90,0x90,0x90,0x00,0x8e, 0x8e,0x8e,0x00,0x3d,0x3d,0x3d,0x00,0x03,0x03,0x03,0x00,0x92,0x00,0x00,0x00, 0x00,0x03,0x01,0x01,0x00,0x3c,0x59,0x88,0x06,0xf1,0x8c,0xd4,0x0e,0xff,0x82, 0x84,0xc8,0x0d,0xff,0x82,0x85,0xc8,0x0d,0xff,0x87,0x84,0xc8,0x0d,0xff,0x01, 0x85,0xc9,0x0d,0xff,0x84,0x84,0xc8,0x0d,0xff,0x82,0x84,0xc7,0x0c,0xff,0x86, 0x83,0xc7,0x0c,0xff,0x82,0x83,0xc7,0x0b,0xff,0x08,0x82,0xc6,0x0b,0xff,0x81, 0xc5,0x0a,0xff,0x82,0xc5,0x0a,0xff,0x81,0xc6,0x0a,0xff,0x81,0xc5,0x0a,0xff, 0x81,0xc5,0x09,0xff,0x80,0xc4,0x08,0xff,0x80,0xc4,0x09,0xff,0x83,0x7f,0xc3, 0x08,0xff,0x01,0x80,0xc4,0x09,0xff,0x83,0x81,0xc5,0x09,0xff,0x04,0x81,0xc4, 0x09,0xff,0x8a,0xd2,0x0a,0xff,0x43,0x66,0x03,0xbc,0x00,0x00,0x00,0x0d,0x97, 0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x03,0x05,0x05,0x05,0x00,0x22, 0x22,0x22,0x00,0x0d,0x0d,0x0d,0x00,0x82,0x08,0x08,0x08,0x00,0x01,0x07,0x07, 0x07,0x00,0x82,0x06,0x06,0x06,0x00,0x09,0x07,0x07,0x07,0x00,0x06,0x06,0x06, 0x00,0x03,0x03,0x03,0x00,0x01,0x01,0x01,0x00,0x87,0x87,0x87,0x00,0x92,0x92, 0x92,0x00,0x5d,0x5d,0x5d,0x00,0x30,0x30,0x30,0x00,0x1d,0x1d,0x1d,0x00,0x91, 0x00,0x00,0x00,0x00,0x03,0x02,0x02,0x00,0x3c,0x58,0x86,0x04,0xf3,0x88,0xce, 0x0d,0xff,0x82,0x81,0xc4,0x0c,0xff,0x86,0x81,0xc3,0x0c,0xff,0x03,0x81,0xc4, 0x0c,0xff,0x81,0xc4,0x0d,0xff,0x81,0xc3,0x0d,0xff,0x82,0x80,0xc3,0x0c,0xff, 0x82,0x81,0xc4,0x0c,0xff,0x05,0x81,0xc5,0x0c,0xff,0x82,0xc5,0x0c,0xff,0x82, 0xc4,0x0c,0xff,0x81,0xc4,0x0b,0xff,0x81,0xc4,0x0c,0xff,0x82,0x81,0xc4,0x0b, 0xff,0x07,0x80,0xc3,0x0b,0xff,0x80,0xc2,0x0b,0xff,0x80,0xc2,0x0c,0xff,0x7f, 0xc1,0x0c,0xff,0x7f,0xc1,0x0b,0xff,0x7e,0xc1,0x0b,0xff,0x7f,0xc0,0x0a,0xff, 0x82,0x7e,0xc0,0x0b,0xff,0x02,0x7e,0xc0,0x0a,0xff,0x7e,0xc0,0x09,0xff,0x82, 0x7e,0xc1,0x09,0xff,0x0a,0x7e,0xc0,0x09,0xff,0x7d,0xc0,0x09,0xff,0x7e,0xc0, 0x09,0xff,0x7e,0xc0,0x0a,0xff,0x7d,0xbf,0x0a,0xff,0x7e,0xbf,0x0a,0xff,0x7d, 0xbe,0x0a,0xff,0x85,0xcb,0x0a,0xff,0x40,0x62,0x04,0xbd,0x00,0x00,0x00,0x0d, 0x89,0x00,0x00,0x00,0x00,0x02,0x0f,0x0f,0x0f,0x00,0x01,0x01,0x01,0x00,0x8c, 0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x03,0x05,0x05,0x05,0x00,0x22, 0x22,0x22,0x00,0x0d,0x0d,0x0d,0x00,0x82,0x08,0x08,0x08,0x00,0x01,0x07,0x07, 0x07,0x00,0x82,0x06,0x06,0x06,0x00,0x0a,0x07,0x07,0x07,0x00,0x06,0x06,0x06, 0x00,0x03,0x03,0x03,0x00,0x01,0x01,0x01,0x00,0x87,0x87,0x87,0x00,0x90,0x90, 0x90,0x00,0x57,0x57,0x57,0x00,0x37,0x37,0x37,0x00,0x5d,0x5d,0x5d,0x00,0x23, 0x23,0x23,0x00,0x90,0x00,0x00,0x00,0x00,0x03,0x06,0x09,0x00,0x3d,0x3e,0x60, 0x01,0xed,0x46,0x6b,0x01,0xfc,0x82,0x44,0x69,0x01,0xfb,0x01,0x43,0x68,0x01, 0xfb,0x82,0x43,0x67,0x01,0xfb,0x01,0x43,0x68,0x01,0xfb,0x83,0x44,0x69,0x01, 0xfb,0x06,0x44,0x68,0x01,0xfb,0x43,0x67,0x01,0xfb,0x42,0x67,0x01,0xfb,0x43, 0x67,0x01,0xfb,0x44,0x68,0x01,0xfb,0x44,0x69,0x01,0xfb,0x82,0x45,0x6a,0x01, 0xfb,0x01,0x44,0x6a,0x01,0xfb,0x82,0x45,0x6a,0x01,0xfb,0x82,0x44,0x69,0x01, 0xfb,0x17,0x43,0x68,0x01,0xfb,0x43,0x67,0x02,0xfb,0x43,0x67,0x01,0xfb,0x42, 0x66,0x01,0xfb,0x42,0x66,0x02,0xfb,0x41,0x65,0x02,0xfb,0x41,0x65,0x02,0xfa, 0x41,0x65,0x01,0xfa,0x41,0x65,0x02,0xfa,0x42,0x65,0x01,0xfa,0x43,0x66,0x01, 0xfa,0x43,0x67,0x01,0xfa,0x43,0x68,0x01,0xfa,0x43,0x67,0x02,0xfa,0x43,0x67, 0x01,0xfa,0x43,0x66,0x02,0xfa,0x41,0x65,0x01,0xfa,0x41,0x64,0x01,0xfa,0x41, 0x63,0x01,0xfa,0x40,0x63,0x01,0xfb,0x45,0x6b,0x01,0xfc,0x2b,0x41,0x01,0xb8, 0x00,0x00,0x00,0x0e,0x88,0x00,0x00,0x00,0x00,0x03,0x58,0x58,0x58,0x00,0x50, 0x50,0x50,0x00,0x03,0x03,0x03,0x00,0x8c,0x00,0x00,0x00,0x00,0x82,0xff,0xff, 0xff,0x00,0x03,0x05,0x05,0x05,0x00,0x22,0x22,0x22,0x00,0x0d,0x0d,0x0d,0x00, 0x82,0x08,0x08,0x08,0x00,0x01,0x07,0x07,0x07,0x00,0x82,0x06,0x06,0x06,0x00, 0x0a,0x07,0x07,0x07,0x00,0x06,0x06,0x06,0x00,0x03,0x03,0x03,0x00,0x01,0x01, 0x01,0x00,0x87,0x87,0x87,0x00,0x90,0x90,0x90,0x00,0x57,0x57,0x57,0x00,0x33, 0x33,0x33,0x00,0x67,0x67,0x67,0x00,0x33,0x33,0x33,0x00,0x82,0x00,0x00,0x00, 0x00,0x05,0x1a,0x1a,0x1a,0x00,0x74,0x74,0x74,0x00,0x5f,0x5f,0x5f,0x00,0x1f, 0x1f,0x1f,0x00,0x06,0x06,0x06,0x00,0x88,0x00,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x03,0x01,0x02,0x00,0x28,0x09,0x0e,0x00,0x6f,0x09,0x0d,0x00,0x88,0x08, 0x0d,0x00,0x88,0x08,0x0d,0x00,0x87,0x09,0x0d,0x00,0x87,0x82,0x09,0x0d,0x00, 0x88,0x82,0x08,0x0d,0x00,0x87,0x82,0x08,0x0d,0x00,0x88,0x01,0x08,0x0d,0x00, 0x87,0x83,0x09,0x0d,0x00,0x87,0x82,0x08,0x0d,0x00,0x87,0x86,0x08,0x0c,0x00, 0x87,0x87,0x08,0x0d,0x00,0x87,0x84,0x08,0x0d,0x00,0x86,0x86,0x08,0x0c,0x00, 0x86,0x83,0x08,0x0d,0x00,0x86,0x04,0x08,0x0c,0x00,0x88,0x09,0x0d,0x00,0x81, 0x06,0x09,0x00,0x53,0x00,0x00,0x00,0x12,0x87,0x00,0x00,0x00,0x00,0x04,0x55, 0x55,0x55,0x00,0xb3,0xb3,0xb3,0x00,0x4b,0x4b,0x4b,0x00,0x02,0x02,0x02,0x00, 0x8c,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x03,0x05,0x05,0x05,0x00, 0x22,0x22,0x22,0x00,0x0d,0x0d,0x0d,0x00,0x82,0x08,0x08,0x08,0x00,0x01,0x07, 0x07,0x07,0x00,0x82,0x06,0x06,0x06,0x00,0x0a,0x07,0x07,0x07,0x00,0x06,0x06, 0x06,0x00,0x03,0x03,0x03,0x00,0x01,0x01,0x01,0x00,0x87,0x87,0x87,0x00,0x90, 0x90,0x90,0x00,0x57,0x57,0x57,0x00,0x33,0x33,0x33,0x00,0x65,0x65,0x65,0x00, 0x31,0x31,0x31,0x00,0x82,0x00,0x00,0x00,0x00,0x02,0x25,0x25,0x25,0x00,0xac, 0xac,0xac,0x00,0x82,0x9f,0x9f,0x9f,0x00,0x03,0x7b,0x7b,0x7b,0x00,0x6d,0x6d, 0x6d,0x00,0x3b,0x3b,0x3b,0x00,0x86,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x33,0x97,0x00, 0x00,0x00,0x34,0x01,0x00,0x00,0x00,0x33,0x82,0x00,0x00,0x00,0x34,0x82,0x00, 0x00,0x00,0x33,0x8c,0x00,0x00,0x00,0x34,0x82,0x00,0x00,0x00,0x33,0x03,0x00, 0x00,0x00,0x2f,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x08,0x86,0x00,0x00,0x00, 0x00,0x05,0x54,0x54,0x54,0x00,0xab,0xab,0xab,0x00,0xa8,0xa8,0xa8,0x00,0x4a, 0x4a,0x4a,0x00,0x02,0x02,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x82,0xff,0xff, 0xff,0x00,0x03,0x05,0x05,0x05,0x00,0x22,0x22,0x22,0x00,0x0d,0x0d,0x0d,0x00, 0x82,0x08,0x08,0x08,0x00,0x01,0x07,0x07,0x07,0x00,0x82,0x06,0x06,0x06,0x00, 0x0a,0x07,0x07,0x07,0x00,0x06,0x06,0x06,0x00,0x03,0x03,0x03,0x00,0x01,0x01, 0x01,0x00,0x87,0x87,0x87,0x00,0x90,0x90,0x90,0x00,0x57,0x57,0x57,0x00,0x33, 0x33,0x33,0x00,0x65,0x65,0x65,0x00,0x31,0x31,0x31,0x00,0x82,0x00,0x00,0x00, 0x00,0x07,0x23,0x23,0x23,0x00,0xa3,0xa3,0xa3,0x00,0x98,0x98,0x98,0x00,0x97, 0x97,0x97,0x00,0x9c,0x9c,0x9c,0x00,0xac,0xac,0xac,0x00,0x5d,0x5d,0x5d,0x00, 0x87,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x06,0x89,0x00,0x00,0x00,0x07,0xa2,0x00,0x00,0x00,0x06,0x02,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x84,0x00,0x00,0x00,0x00,0x07,0x0c,0x0c, 0x0c,0x00,0x56,0x56,0x56,0x00,0xa9,0xa9,0xa9,0x00,0xa1,0xa1,0xa1,0x00,0xa7, 0xa7,0xa7,0x00,0x4a,0x4a,0x4a,0x00,0x02,0x02,0x02,0x00,0x8c,0x00,0x00,0x00, 0x00,0x82,0xff,0xff,0xff,0x00,0x03,0x05,0x05,0x05,0x00,0x22,0x22,0x22,0x00, 0x0d,0x0d,0x0d,0x00,0x82,0x08,0x08,0x08,0x00,0x01,0x07,0x07,0x07,0x00,0x82, 0x06,0x06,0x06,0x00,0x0a,0x07,0x07,0x07,0x00,0x06,0x06,0x06,0x00,0x03,0x03, 0x03,0x00,0x01,0x01,0x01,0x00,0x87,0x87,0x87,0x00,0x90,0x90,0x90,0x00,0x57, 0x57,0x57,0x00,0x33,0x33,0x33,0x00,0x65,0x65,0x65,0x00,0x31,0x31,0x31,0x00, 0x82,0x00,0x00,0x00,0x00,0x03,0x23,0x23,0x23,0x00,0xa3,0xa3,0xa3,0x00,0x98, 0x98,0x98,0x00,0x82,0x97,0x97,0x97,0x00,0x02,0xa3,0xa3,0xa3,0x00,0x58,0x58, 0x58,0x00,0xb9,0x00,0x00,0x00,0x00,0x09,0x0d,0x0d,0x0d,0x00,0x4d,0x4d,0x4d, 0x00,0x90,0x90,0x90,0x00,0xa8,0xa8,0xa8,0x00,0x9f,0x9f,0x9f,0x00,0xa1,0xa1, 0xa1,0x00,0xa7,0xa7,0xa7,0x00,0x4a,0x4a,0x4a,0x00,0x02,0x02,0x02,0x00,0x8c, 0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x03,0x05,0x05,0x05,0x00,0x22, 0x22,0x22,0x00,0x0d,0x0d,0x0d,0x00,0x82,0x08,0x08,0x08,0x00,0x01,0x07,0x07, 0x07,0x00,0x82,0x06,0x06,0x06,0x00,0x0a,0x07,0x07,0x07,0x00,0x06,0x06,0x06, 0x00,0x03,0x03,0x03,0x00,0x01,0x01,0x01,0x00,0x87,0x87,0x87,0x00,0x90,0x90, 0x90,0x00,0x57,0x57,0x57,0x00,0x33,0x33,0x33,0x00,0x65,0x65,0x65,0x00,0x31, 0x31,0x31,0x00,0x82,0x00,0x00,0x00,0x00,0x03,0x23,0x23,0x23,0x00,0xa3,0xa3, 0xa3,0x00,0x98,0x98,0x98,0x00,0x82,0x97,0x97,0x97,0x00,0x02,0xa3,0xa3,0xa3, 0x00,0x58,0x58,0x58,0x00,0xb8,0x00,0x00,0x00,0x00,0x0a,0x1e,0x1e,0x1e,0x00, 0x9a,0x9a,0x9a,0x00,0xa8,0xa8,0xa8,0x00,0xa2,0xa2,0xa2,0x00,0xa0,0xa0,0xa0, 0x00,0x9e,0x9e,0x9e,0x00,0xa1,0xa1,0xa1,0x00,0xa7,0xa7,0xa7,0x00,0x4a,0x4a, 0x4a,0x00,0x02,0x02,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff, 0x00,0x03,0x05,0x05,0x05,0x00,0x22,0x22,0x22,0x00,0x0d,0x0d,0x0d,0x00,0x82, 0x08,0x08,0x08,0x00,0x01,0x07,0x07,0x07,0x00,0x82,0x06,0x06,0x06,0x00,0x0a, 0x07,0x07,0x07,0x00,0x06,0x06,0x06,0x00,0x03,0x03,0x03,0x00,0x01,0x01,0x01, 0x00,0x87,0x87,0x87,0x00,0x90,0x90,0x90,0x00,0x57,0x57,0x57,0x00,0x33,0x33, 0x33,0x00,0x65,0x65,0x65,0x00,0x31,0x31,0x31,0x00,0x82,0x00,0x00,0x00,0x00, 0x03,0x23,0x23,0x23,0x00,0xa3,0xa3,0xa3,0x00,0x98,0x98,0x98,0x00,0x82,0x97, 0x97,0x97,0x00,0x02,0xa3,0xa3,0xa3,0x00,0x58,0x58,0x58,0x00,0x87,0x00,0x00, 0x00,0x00,0x09,0x3c,0x3c,0x3c,0x00,0x5d,0x5d,0x5d,0x00,0x57,0x57,0x57,0x00, 0x56,0x56,0x56,0x00,0x5d,0x5d,0x5d,0x00,0x47,0x47,0x47,0x00,0x04,0x04,0x04, 0x00,0x2b,0x2b,0x2b,0x00,0x5b,0x5b,0x5b,0x00,0x82,0x57,0x57,0x57,0x00,0x05, 0x58,0x58,0x58,0x00,0x5b,0x5b,0x5b,0x00,0x16,0x16,0x16,0x00,0x00,0x00,0x00, 0x00,0x23,0x23,0x23,0x00,0x82,0x58,0x58,0x58,0x00,0x82,0x57,0x57,0x57,0x00, 0x01,0x56,0x56,0x56,0x00,0x84,0x57,0x57,0x57,0x00,0x06,0x4b,0x4b,0x4b,0x00, 0x38,0x38,0x38,0x00,0x16,0x16,0x16,0x00,0x2a,0x2a,0x2a,0x00,0x14,0x14,0x14, 0x00,0x07,0x07,0x07,0x00,0x84,0x00,0x00,0x00,0x00,0x02,0x26,0x26,0x26,0x00, 0x5d,0x5d,0x5d,0x00,0x82,0x57,0x57,0x57,0x00,0x03,0x58,0x58,0x58,0x00,0x5b, 0x5b,0x5b,0x00,0x13,0x13,0x13,0x00,0x87,0x00,0x00,0x00,0x00,0x02,0x3b,0x3b, 0x3b,0x00,0xb2,0xb2,0xb2,0x00,0x82,0x9e,0x9e,0x9e,0x00,0x06,0xa0,0xa0,0xa0, 0x00,0x9e,0x9e,0x9e,0x00,0xa1,0xa1,0xa1,0x00,0xa7,0xa7,0xa7,0x00,0x4a,0x4a, 0x4a,0x00,0x02,0x02,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff, 0x00,0x03,0x05,0x05,0x05,0x00,0x22,0x22,0x22,0x00,0x0a,0x0a,0x0a,0x00,0x82, 0x05,0x05,0x05,0x00,0x01,0x04,0x04,0x04,0x00,0x82,0x03,0x03,0x03,0x00,0x02, 0x04,0x04,0x04,0x00,0x03,0x03,0x03,0x00,0x82,0x00,0x00,0x00,0x00,0x06,0x87, 0x87,0x87,0x00,0x90,0x90,0x90,0x00,0x57,0x57,0x57,0x00,0x33,0x33,0x33,0x00, 0x65,0x65,0x65,0x00,0x31,0x31,0x31,0x00,0x82,0x00,0x00,0x00,0x00,0x03,0x22, 0x22,0x22,0x00,0xa3,0xa3,0xa3,0x00,0x98,0x98,0x98,0x00,0x82,0x97,0x97,0x97, 0x00,0x02,0xa3,0xa3,0xa3,0x00,0x58,0x58,0x58,0x00,0x87,0x00,0x00,0x00,0x00, 0x09,0x6e,0x6e,0x6e,0x00,0xaa,0xaa,0xaa,0x00,0xa0,0xa0,0xa0,0x00,0x9f,0x9f, 0x9f,0x00,0xaa,0xaa,0xaa,0x00,0x81,0x81,0x81,0x00,0x04,0x04,0x04,0x00,0x4f, 0x4f,0x4f,0x00,0xa8,0xa8,0xa8,0x00,0x82,0xa1,0xa1,0xa1,0x00,0x0b,0xa3,0xa3, 0xa3,0x00,0xa7,0xa7,0xa7,0x00,0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x41, 0x41,0x41,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa1,0xa1,0xa1,0x00, 0xa0,0xa0,0xa0,0x00,0x9f,0x9f,0x9f,0x00,0xa1,0xa1,0xa1,0x00,0x82,0xa0,0xa0, 0xa0,0x00,0x08,0xa1,0xa1,0xa1,0x00,0x89,0x89,0x89,0x00,0x67,0x67,0x67,0x00, 0x28,0x28,0x28,0x00,0x49,0x49,0x49,0x00,0x63,0x63,0x63,0x00,0x42,0x42,0x42, 0x00,0x02,0x02,0x02,0x00,0x83,0x00,0x00,0x00,0x00,0x07,0x46,0x46,0x46,0x00, 0xaa,0xaa,0xaa,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2, 0x00,0xa7,0xa7,0xa7,0x00,0x23,0x23,0x23,0x00,0x87,0x00,0x00,0x00,0x00,0x02, 0x38,0x38,0x38,0x00,0xae,0xae,0xae,0x00,0x82,0x9e,0x9e,0x9e,0x00,0x06,0xa0, 0xa0,0xa0,0x00,0x9e,0x9e,0x9e,0x00,0xa1,0xa1,0xa1,0x00,0xa7,0xa7,0xa7,0x00, 0x4a,0x4a,0x4a,0x00,0x02,0x02,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x82,0xff, 0xff,0xff,0x00,0x06,0x05,0x05,0x05,0x00,0x25,0x25,0x25,0x03,0x16,0x16,0x16, 0x12,0x11,0x11,0x11,0x11,0x10,0x10,0x10,0x12,0x0f,0x0f,0x0f,0x11,0x82,0x0e, 0x0e,0x0e,0x11,0x13,0x0f,0x0f,0x0f,0x11,0x0e,0x0e,0x0e,0x11,0x0b,0x0b,0x0b, 0x11,0x0a,0x0a,0x0a,0x11,0x87,0x87,0x87,0x0e,0x8d,0x8d,0x8d,0x09,0x51,0x51, 0x51,0x00,0x2c,0x2c,0x2c,0x00,0x65,0x65,0x65,0x00,0x30,0x30,0x30,0x00,0x00, 0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x2d,0x2d,0x2d,0x0b,0xa1,0xa1,0xa1,0x10, 0x95,0x95,0x95,0x0e,0x94,0x94,0x94,0x0e,0x93,0x93,0x93,0x0e,0xa2,0xa2,0xa2, 0x10,0x58,0x58,0x58,0x06,0x87,0x00,0x00,0x00,0x00,0x09,0x66,0x66,0x66,0x07, 0x9d,0x9d,0x9d,0x0f,0x93,0x93,0x93,0x0e,0x92,0x92,0x92,0x0e,0x9d,0x9d,0x9d, 0x0e,0x7f,0x7f,0x7f,0x10,0x0e,0x0e,0x0e,0x04,0x4c,0x4c,0x4c,0x05,0x9c,0x9c, 0x9c,0x10,0x82,0x94,0x94,0x94,0x0e,0x0b,0x95,0x95,0x95,0x0e,0x9d,0x9d,0x9d, 0x0f,0x27,0x27,0x27,0x04,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x04,0x98,0x98, 0x98,0x0f,0x96,0x96,0x96,0x0e,0x94,0x94,0x94,0x0e,0x93,0x93,0x93,0x0e,0x92, 0x92,0x92,0x0e,0x94,0x94,0x94,0x0e,0x82,0x93,0x93,0x93,0x0e,0x08,0x94,0x94, 0x94,0x0d,0x7d,0x7d,0x7d,0x09,0x5b,0x5b,0x5b,0x02,0x1c,0x1c,0x1c,0x00,0x40, 0x40,0x40,0x00,0x65,0x65,0x65,0x00,0x45,0x45,0x45,0x00,0x03,0x03,0x03,0x00, 0x83,0x00,0x00,0x00,0x00,0x07,0x43,0x43,0x43,0x07,0xa0,0xa0,0xa0,0x10,0x92, 0x92,0x92,0x0e,0x94,0x94,0x94,0x0e,0x95,0x95,0x95,0x0e,0x9c,0x9c,0x9c,0x0e, 0x22,0x22,0x22,0x03,0x87,0x00,0x00,0x00,0x00,0x0a,0x37,0x37,0x37,0x00,0xb0, 0xb0,0xb0,0x0f,0x9b,0x9b,0x9b,0x0d,0x9c,0x9c,0x9c,0x0d,0x9e,0x9e,0x9e,0x0d, 0x9c,0x9c,0x9c,0x0d,0x9f,0x9f,0x9f,0x0e,0xa5,0xa5,0xa5,0x0d,0x4a,0x4a,0x4a, 0x00,0x02,0x02,0x02,0x00,0x8c,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00, 0x05,0x01,0x01,0x01,0x00,0x2b,0x2b,0x2b,0x33,0xac,0xac,0xac,0xed,0xa9,0xa9, 0xa9,0xec,0xa7,0xa7,0xa7,0xec,0x82,0xa6,0xa6,0xa6,0xeb,0x82,0xa7,0xa7,0xa7, 0xeb,0x82,0xa5,0xa5,0xa5,0xea,0x11,0xa4,0xa4,0xa4,0xeb,0xa8,0xa8,0xa8,0xe6, 0x9a,0x9a,0x9a,0xd6,0x7f,0x7f,0x7f,0xb1,0x64,0x64,0x64,0x7d,0x64,0x64,0x64, 0x2d,0x35,0x35,0x35,0x00,0x09,0x09,0x09,0x00,0x07,0x07,0x07,0x00,0x47,0x47, 0x47,0x61,0xb3,0xb3,0xb3,0xed,0xac,0xac,0xac,0xe6,0xaa,0xaa,0xaa,0xe7,0xad, 0xad,0xad,0xe7,0xa8,0xa8,0xa8,0xec,0x59,0x59,0x59,0xa5,0x00,0x00,0x00,0x01, 0x85,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x01,0x6e,0x6e,0x6e,0xb4,0xb3, 0xb3,0xb3,0xeb,0xa8,0xa8,0xa8,0xe6,0xa9,0xa9,0xa9,0xe6,0xb0,0xb0,0xb0,0xe7, 0x7b,0x7b,0x7b,0xdc,0x1e,0x1e,0x1e,0x16,0x38,0x38,0x38,0x5f,0xa9,0xa9,0xa9, 0xeb,0xab,0xab,0xab,0xe6,0xa9,0xa9,0xa9,0xe6,0xae,0xae,0xae,0xe7,0x9c,0x9c, 0x9c,0xe9,0x20,0x20,0x20,0x4c,0x00,0x00,0x00,0x00,0x2a,0x2a,0x2a,0x47,0x9b, 0x9b,0x9b,0xe8,0xae,0xae,0xae,0xe7,0xa9,0xa9,0xa9,0xe7,0xa8,0xa8,0xa8,0xe7, 0xa8,0xa8,0xa8,0xe6,0xa9,0xa9,0xa9,0xe6,0xa8,0xa8,0xa8,0xe6,0xa9,0xa9,0xa9, 0xe6,0xa7,0xa7,0xa7,0xe2,0x9a,0x9a,0x9a,0xd8,0x89,0x89,0x89,0xc0,0x67,0x67, 0x67,0x99,0x5b,0x5b,0x5b,0x5f,0x5e,0x5e,0x5e,0x11,0x40,0x40,0x40,0x00,0x03, 0x03,0x03,0x00,0x83,0x00,0x00,0x00,0x00,0x07,0x39,0x39,0x39,0x7e,0xa1,0xa1, 0xa1,0xec,0xab,0xab,0xab,0xe5,0xa8,0xa8,0xa8,0xe6,0xac,0xac,0xac,0xe7,0xa4, 0xa4,0xa4,0xe7,0x1b,0x1b,0x1b,0x38,0x87,0x00,0x00,0x00,0x00,0x03,0x3c,0x3c, 0x3c,0x5a,0xa0,0xa0,0xa0,0xe8,0xad,0xad,0xad,0xe4,0x83,0xab,0xab,0xab,0xe4, 0x04,0xad,0xad,0xad,0xe6,0xb2,0xb2,0xb2,0xe2,0x42,0x42,0x42,0x40,0x01,0x01, 0x01,0x00,0x8c,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x05,0x00,0x00, 0x00,0x00,0x1b,0x1b,0x1b,0x46,0xea,0xea,0xea,0xff,0xfd,0xfd,0xfd,0xff,0xfa, 0xfa,0xfa,0xff,0x84,0xfb,0xfb,0xfb,0xff,0x83,0xfa,0xfa,0xfa,0xff,0x10,0xf2, 0xf2,0xf2,0xff,0xea,0xea,0xea,0xff,0xdf,0xdf,0xdf,0xff,0xc2,0xc2,0xc2,0xff, 0x9b,0x9b,0x9b,0xf5,0x67,0x67,0x67,0x8e,0x32,0x32,0x32,0x08,0x00,0x00,0x00, 0x00,0x06,0x06,0x06,0x40,0xc8,0xc8,0xc8,0xfc,0xfc,0xfc,0xfc,0xff,0xf9,0xf9, 0xf9,0xff,0xfd,0xfd,0xfd,0xff,0xc4,0xc4,0xc4,0xff,0x63,0x63,0x63,0xf2,0x09, 0x09,0x09,0x1e,0x85,0x00,0x00,0x00,0x00,0x13,0x07,0x07,0x07,0x29,0x96,0x96, 0x96,0xf8,0xfa,0xfa,0xfa,0xff,0xf7,0xf7,0xf7,0xff,0xf9,0xf9,0xf9,0xff,0xd3, 0xd3,0xd3,0xff,0x3b,0x3b,0x3b,0xcd,0x00,0x00,0x00,0x09,0x21,0x21,0x21,0x7c, 0xd5,0xd5,0xd5,0xff,0xfa,0xfa,0xfa,0xff,0xf7,0xf7,0xf7,0xff,0xfa,0xfa,0xfa, 0xff,0x9a,0x9a,0x9a,0xff,0x15,0x15,0x15,0x60,0x00,0x00,0x00,0x00,0x11,0x11, 0x11,0x59,0xa3,0xa3,0xa3,0xff,0xfb,0xfb,0xfb,0xff,0x82,0xf6,0xf6,0xf6,0xff, 0x01,0xf7,0xf7,0xf7,0xff,0x83,0xf6,0xf6,0xf6,0xff,0x07,0xf5,0xf5,0xf5,0xff, 0xf3,0xf3,0xf3,0xff,0xed,0xed,0xed,0xff,0xe5,0xe5,0xe5,0xff,0xc5,0xc5,0xc5, 0xff,0x96,0x96,0x96,0xdd,0x51,0x51,0x51,0x5f,0x84,0x00,0x00,0x00,0x00,0x07, 0x29,0x29,0x29,0x99,0xa0,0xa0,0xa0,0xff,0xfa,0xfa,0xfa,0xff,0xf7,0xf7,0xf7, 0xff,0xfb,0xfb,0xfb,0xff,0xc0,0xc0,0xc0,0xff,0x0c,0x0c,0x0c,0x4a,0x86,0x00, 0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x04,0x59,0x59,0x59,0xc5,0x9c,0x9c,0x9c, 0xff,0x82,0xf6,0xf6,0xf6,0xff,0x02,0xf5,0xf5,0xf5,0xff,0xf6,0xf6,0xf6,0xff, 0x82,0xf7,0xf7,0xf7,0xff,0x01,0x62,0x62,0x62,0xa4,0x8d,0x00,0x00,0x00,0x00, 0x82,0xff,0xff,0xff,0x00,0x09,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x50,0xea, 0xea,0xea,0xff,0xf9,0xf9,0xf9,0xff,0xf6,0xf6,0xf6,0xff,0xf7,0xf7,0xf7,0xff, 0xf8,0xf8,0xf8,0xff,0xfa,0xfa,0xfa,0xff,0xf9,0xf9,0xf9,0xff,0x82,0xfa,0xfa, 0xfa,0xff,0x11,0xf9,0xf9,0xf9,0xff,0xf8,0xf8,0xf8,0xff,0xf9,0xf9,0xf9,0xff, 0xfe,0xfe,0xfe,0xff,0xfb,0xfb,0xfb,0xff,0xd7,0xd7,0xd7,0xff,0x9f,0x9f,0x9f, 0xff,0x68,0x68,0x68,0xa6,0x09,0x09,0x09,0x06,0x00,0x00,0x00,0x23,0x7f,0x7f, 0x7f,0xd2,0xff,0xff,0xff,0xff,0xfb,0xfb,0xfb,0xff,0xfd,0xfd,0xfd,0xff,0xe0, 0xe0,0xe0,0xff,0x77,0x77,0x77,0xff,0x24,0x24,0x24,0x5d,0x85,0x00,0x00,0x00, 0x00,0x16,0x1f,0x1f,0x1f,0x6d,0xc7,0xc7,0xc7,0xff,0xff,0xff,0xff,0xff,0xfb, 0xfb,0xfb,0xff,0xff,0xff,0xff,0xff,0xa1,0xa1,0xa1,0xff,0x19,0x19,0x19,0x90, 0x00,0x00,0x00,0x0d,0x23,0x23,0x23,0x83,0xdf,0xdf,0xdf,0xff,0xff,0xff,0xff, 0xff,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0x9d,0x9d,0x9d,0xff,0x15,0x15, 0x15,0x68,0x00,0x00,0x00,0x00,0x12,0x12,0x12,0x62,0xa6,0xa6,0xa6,0xff,0xff, 0xff,0xff,0xff,0xfb,0xfb,0xfb,0xff,0xfd,0xfd,0xfd,0xff,0xfe,0xfe,0xfe,0xff, 0x83,0xff,0xff,0xff,0xff,0x08,0xfd,0xfd,0xfd,0xff,0xfc,0xfc,0xfc,0xff,0xfd, 0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xfc,0xfc,0xfc,0xff,0xef,0xef,0xef,0xff, 0xb2,0xb2,0xb2,0xff,0x40,0x40,0x40,0x7c,0x82,0x00,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x02,0x29,0x29,0x29,0x9f,0xa7,0xa7,0xa7,0xff,0xff,0xff,0xff,0xff, 0xfc,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xc9,0xc9,0xc9,0xff,0x0d,0x0d,0x0d, 0x54,0x86,0x00,0x00,0x00,0x00,0x05,0x1c,0x1c,0x1c,0x3c,0x75,0x75,0x75,0xfb, 0xc3,0xc3,0xc3,0xff,0xff,0xff,0xff,0xff,0xf8,0xf8,0xf8,0xff,0x82,0xff,0xff, 0xff,0xff,0x04,0xf8,0xf8,0xf8,0xff,0xff,0xff,0xff,0xff,0xb6,0xb6,0xb6,0xf1, 0x07,0x07,0x07,0x22,0x8c,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x04, 0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x53,0xe2,0xe2,0xe2,0xff,0xec,0xec,0xec, 0xff,0x83,0xe7,0xe7,0xe7,0xff,0x01,0xe8,0xe8,0xe8,0xff,0x83,0xea,0xea,0xea, 0xff,0x0c,0xf0,0xf0,0xf0,0xff,0xf3,0xf3,0xf3,0xff,0xeb,0xeb,0xeb,0xff,0xe8, 0xe8,0xe8,0xff,0xeb,0xeb,0xeb,0xff,0xf3,0xf3,0xf3,0xff,0xce,0xce,0xce,0xff, 0x91,0x91,0x91,0xff,0x36,0x36,0x36,0x69,0x00,0x00,0x00,0x04,0x3f,0x3f,0x3f, 0x98,0xf5,0xf5,0xf5,0xff,0x82,0xeb,0xeb,0xeb,0xff,0x03,0xed,0xed,0xed,0xff, 0x93,0x93,0x93,0xff,0x3d,0x3d,0x3d,0x9f,0x84,0x00,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x01,0x4e,0x4e,0x4e,0xb1,0xe6,0xe6,0xe6,0xff,0xef,0xef,0xef,0xff, 0xed,0xed,0xed,0xff,0xef,0xef,0xef,0xff,0x6b,0x6b,0x6b,0xfa,0x07,0x07,0x07, 0x56,0x00,0x00,0x00,0x08,0x25,0x25,0x25,0x83,0xd9,0xd9,0xd9,0xff,0xf1,0xf1, 0xf1,0xff,0xeb,0xeb,0xeb,0xff,0xf5,0xf5,0xf5,0xff,0x98,0x98,0x98,0xff,0x16, 0x16,0x16,0x69,0x00,0x00,0x00,0x00,0x13,0x13,0x13,0x63,0xa1,0xa1,0xa1,0xff, 0xf7,0xf7,0xf7,0xff,0xeb,0xeb,0xeb,0xff,0xec,0xec,0xec,0xff,0xe5,0xe5,0xe5, 0xff,0xeb,0xeb,0xeb,0xff,0xf1,0xf1,0xf1,0xff,0xf2,0xf2,0xf2,0xff,0xf5,0xf5, 0xf5,0xff,0xfa,0xfa,0xfa,0xff,0xf6,0xf6,0xf6,0xff,0xec,0xec,0xec,0xff,0xeb, 0xeb,0xeb,0xff,0xf2,0xf2,0xf2,0xff,0xee,0xee,0xee,0xff,0xa5,0xa5,0xa5,0xff, 0x28,0x28,0x28,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x2a,0x2a,0x2a, 0xa0,0xa6,0xa6,0xa6,0xff,0xf5,0xf5,0xf5,0xff,0xe9,0xe9,0xe9,0xff,0xf4,0xf4, 0xf4,0xff,0xc3,0xc3,0xc3,0xff,0x0e,0x0e,0x0e,0x55,0x86,0x00,0x00,0x00,0x00, 0x0b,0x48,0x48,0x48,0x98,0x85,0x85,0x85,0xff,0xdf,0xdf,0xdf,0xff,0xed,0xed, 0xed,0xff,0xee,0xee,0xee,0xff,0xc9,0xc9,0xc9,0xff,0xd4,0xd4,0xd4,0xff,0xec, 0xec,0xec,0xff,0xed,0xed,0xed,0xff,0xe7,0xe7,0xe7,0xff,0x3b,0x3b,0x3b,0x76, 0x8c,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x03,0x00,0x00,0x00,0x00, 0x25,0x25,0x25,0x56,0xdc,0xdc,0xdc,0xff,0x82,0xe0,0xe0,0xe0,0xff,0x18,0xd6, 0xd6,0xd6,0xff,0x76,0x76,0x76,0xff,0x69,0x69,0x69,0xf9,0x69,0x69,0x69,0xf2, 0x69,0x69,0x69,0xf3,0x67,0x67,0x67,0xf3,0x70,0x70,0x70,0xf4,0x9d,0x9d,0x9d, 0xff,0xe2,0xe2,0xe2,0xff,0xe4,0xe4,0xe4,0xff,0xde,0xde,0xde,0xff,0xdd,0xdd, 0xdd,0xff,0xed,0xed,0xed,0xff,0xba,0xba,0xba,0xff,0x5d,0x5d,0x5d,0xd5,0x02, 0x02,0x02,0x10,0x0b,0x0b,0x0b,0x57,0xcc,0xcc,0xcc,0xfb,0xe7,0xe7,0xe7,0xff, 0xde,0xde,0xde,0xff,0xe6,0xe6,0xe6,0xff,0xbd,0xbd,0xbd,0xff,0x5a,0x5a,0x5a, 0xd9,0x02,0x02,0x02,0x10,0x83,0x00,0x00,0x00,0x00,0x2c,0x02,0x02,0x02,0x1c, 0x87,0x87,0x87,0xeb,0xec,0xec,0xec,0xff,0xe0,0xe0,0xe0,0xff,0xe6,0xe6,0xe6, 0xff,0xca,0xca,0xca,0xff,0x3e,0x3e,0x3e,0xd6,0x00,0x00,0x00,0x28,0x00,0x00, 0x00,0x03,0x26,0x26,0x26,0x83,0xd3,0xd3,0xd3,0xff,0xe5,0xe5,0xe5,0xff,0xe0, 0xe0,0xe0,0xff,0xea,0xea,0xea,0xff,0x95,0x95,0x95,0xff,0x17,0x17,0x17,0x69, 0x00,0x00,0x00,0x00,0x14,0x14,0x14,0x63,0x9d,0x9d,0x9d,0xff,0xea,0xea,0xea, 0xff,0xe0,0xe0,0xe0,0xff,0xe9,0xe9,0xe9,0xff,0xb1,0xb1,0xb1,0xff,0x3f,0x3f, 0x3f,0xe0,0x3d,0x3d,0x3d,0xc8,0x3e,0x3e,0x3e,0xcd,0x4c,0x4c,0x4c,0xd5,0x78, 0x78,0x78,0xef,0xc0,0xc0,0xc0,0xff,0xed,0xed,0xed,0xff,0xe1,0xe1,0xe1,0xff, 0xe0,0xe0,0xe0,0xff,0xe6,0xe6,0xe6,0xff,0xe2,0xe2,0xe2,0xff,0x6c,0x6c,0x6c, 0xcd,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x2b,0x2b,0x2b,0xa0,0xa5,0xa5, 0xa5,0xff,0xea,0xea,0xea,0xff,0xdf,0xdf,0xdf,0xff,0xe8,0xe8,0xe8,0xff,0xbd, 0xbd,0xbd,0xff,0x0f,0x0f,0x0f,0x55,0x85,0x00,0x00,0x00,0x00,0x0d,0x0b,0x0b, 0x0b,0x18,0x6b,0x6b,0x6b,0xe7,0xa5,0xa5,0xa5,0xff,0xe6,0xe6,0xe6,0xff,0xe0, 0xe0,0xe0,0xff,0xe0,0xe0,0xe0,0xfd,0x61,0x61,0x61,0xf8,0x94,0x94,0x94,0xff, 0xeb,0xeb,0xeb,0xff,0xde,0xde,0xde,0xff,0xed,0xed,0xed,0xff,0x89,0x89,0x89, 0xcf,0x00,0x00,0x00,0x09,0x8b,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00, 0x03,0x00,0x00,0x00,0x00,0x28,0x28,0x28,0x59,0xd7,0xd7,0xd7,0xff,0x82,0xd9, 0xd9,0xd9,0xff,0x18,0xd5,0xd5,0xd5,0xff,0x66,0x66,0x66,0xff,0x28,0x28,0x28, 0xc8,0x03,0x03,0x03,0x6e,0x03,0x03,0x03,0x73,0x03,0x03,0x03,0x74,0x00,0x00, 0x00,0x75,0x03,0x03,0x03,0x87,0x58,0x58,0x58,0xca,0xdb,0xdb,0xdb,0xff,0xda, 0xda,0xda,0xff,0xd7,0xd7,0xd7,0xff,0xdb,0xdb,0xdb,0xff,0xd2,0xd2,0xd2,0xff, 0x6e,0x6e,0x6e,0xfb,0x14,0x14,0x14,0x41,0x00,0x00,0x00,0x24,0x8c,0x8c,0x8c, 0xd8,0xe6,0xe6,0xe6,0xff,0xd7,0xd7,0xd7,0xff,0xdc,0xdc,0xdc,0xff,0xd4,0xd4, 0xd4,0xff,0x75,0x75,0x75,0xfd,0x14,0x14,0x14,0x3d,0x83,0x00,0x00,0x00,0x00, 0x2c,0x18,0x18,0x18,0x55,0xb6,0xb6,0xb6,0xff,0xe1,0xe1,0xe1,0xff,0xd7,0xd7, 0xd7,0xff,0xe3,0xe3,0xe3,0xff,0x9c,0x9c,0x9c,0xff,0x1e,0x1e,0x1e,0x99,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x26,0x26,0x26,0x83,0xce,0xce,0xce,0xff, 0xdd,0xdd,0xdd,0xff,0xd8,0xd8,0xd8,0xff,0xe1,0xe1,0xe1,0xff,0x91,0x91,0x91, 0xff,0x17,0x17,0x17,0x69,0x00,0x00,0x00,0x00,0x15,0x15,0x15,0x63,0x9a,0x9a, 0x9a,0xff,0xe2,0xe2,0xe2,0xff,0xd8,0xd8,0xd8,0xff,0xe0,0xe0,0xe0,0xff,0xc3, 0xc3,0xc3,0xff,0x12,0x12,0x12,0x9e,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x4e, 0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x6e,0x1b,0x1b,0x1b,0xb2,0x92,0x92,0x92, 0xfd,0xe7,0xe7,0xe7,0xff,0xd7,0xd7,0xd7,0xff,0xd8,0xd8,0xd8,0xff,0xe4,0xe4, 0xe4,0xff,0xae,0xae,0xae,0xfe,0x11,0x11,0x11,0x41,0x00,0x00,0x00,0x00,0x2a, 0x2a,0x2a,0xa0,0xa8,0xa8,0xa8,0xff,0xe2,0xe2,0xe2,0xff,0xd7,0xd7,0xd7,0xff, 0xe2,0xe2,0xe2,0xff,0xb9,0xb9,0xb9,0xff,0x10,0x10,0x10,0x55,0x85,0x00,0x00, 0x00,0x00,0x0d,0x30,0x30,0x30,0x67,0x84,0x84,0x84,0xff,0xcb,0xcb,0xcb,0xff, 0xdb,0xdb,0xdb,0xff,0xe4,0xe4,0xe4,0xff,0xa9,0xa9,0xa9,0xea,0x1a,0x1a,0x1a, 0xb2,0x6d,0x6d,0x6d,0xff,0xdf,0xdf,0xdf,0xff,0xd7,0xd7,0xd7,0xff,0xde,0xde, 0xde,0xff,0xc7,0xc7,0xc7,0xff,0x1d,0x1d,0x1d,0x47,0x8b,0x00,0x00,0x00,0x00, 0x82,0xff,0xff,0xff,0x00,0x1d,0x00,0x00,0x00,0x00,0x29,0x29,0x29,0x5b,0xd5, 0xd5,0xd5,0xff,0xd7,0xd7,0xd7,0xff,0xd4,0xd4,0xd4,0xff,0xd6,0xd6,0xd6,0xff, 0x72,0x72,0x72,0xff,0x2c,0x2c,0x2c,0xb3,0x00,0x00,0x00,0x28,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x33,0x00,0x00, 0x00,0x52,0x82,0x82,0x82,0xd9,0xe2,0xe2,0xe2,0xff,0xd4,0xd4,0xd4,0xff,0xd5, 0xd5,0xd5,0xff,0xd8,0xd8,0xd8,0xff,0x7c,0x7c,0x7c,0xff,0x21,0x21,0x21,0x6c, 0x00,0x00,0x00,0x0a,0x49,0x49,0x49,0x9e,0xe2,0xe2,0xe2,0xff,0xd2,0xd2,0xd2, 0xff,0xd5,0xd5,0xd5,0xff,0xda,0xda,0xda,0xff,0x8f,0x8f,0x8f,0xff,0x2f,0x2f, 0x2f,0x7f,0x83,0x00,0x00,0x00,0x00,0x2c,0x41,0x41,0x41,0x97,0xd2,0xd2,0xd2, 0xff,0xd8,0xd8,0xd8,0xff,0xd5,0xd5,0xd5,0xff,0xd9,0xd9,0xd9,0xff,0x6c,0x6c, 0x6c,0xfb,0x09,0x09,0x09,0x5b,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x27, 0x27,0x27,0x84,0xca,0xca,0xca,0xff,0xda,0xda,0xda,0xff,0xd5,0xd5,0xd5,0xff, 0xdc,0xdc,0xdc,0xff,0x8f,0x8f,0x8f,0xff,0x18,0x18,0x18,0x69,0x00,0x00,0x00, 0x00,0x15,0x15,0x15,0x63,0x98,0x98,0x98,0xff,0xdd,0xdd,0xdd,0xff,0xd4,0xd4, 0xd4,0xff,0xdc,0xdc,0xdc,0xff,0xc6,0xc6,0xc6,0xff,0x1c,0x1c,0x1c,0x8a,0x00, 0x00,0x00,0x12,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x42,0x1f,0x1f,0x1f,0xb7,0xaf,0xaf,0xaf,0xff,0xdd,0xdd,0xdd, 0xff,0xd4,0xd4,0xd4,0xff,0xd8,0xd8,0xd8,0xff,0xd3,0xd3,0xd3,0xff,0x30,0x30, 0x30,0x82,0x00,0x00,0x00,0x00,0x2a,0x2a,0x2a,0xa0,0xa9,0xa9,0xa9,0xff,0xdf, 0xdf,0xdf,0xff,0xd3,0xd3,0xd3,0xff,0xdc,0xdc,0xdc,0xff,0xb8,0xb8,0xb8,0xff, 0x10,0x10,0x10,0x55,0x84,0x00,0x00,0x00,0x00,0x0e,0x02,0x02,0x02,0x03,0x5a, 0x5a,0x5a,0xc3,0xa3,0xa3,0xa3,0xff,0xdd,0xdd,0xdd,0xff,0xd4,0xd4,0xd4,0xff, 0xe4,0xe4,0xe4,0xff,0x5f,0x5f,0x5f,0xba,0x00,0x00,0x00,0x63,0x4c,0x4c,0x4c, 0xf0,0xbd,0xbd,0xbd,0xff,0xdd,0xdd,0xdd,0xff,0xd4,0xd4,0xd4,0xff,0xe0,0xe0, 0xe0,0xff,0x60,0x60,0x60,0xa2,0x8b,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff, 0x00,0x02,0x00,0x00,0x00,0x00,0x29,0x29,0x29,0x5c,0x82,0xd3,0xd3,0xd3,0xff, 0x06,0xd2,0xd2,0xd2,0xff,0xd8,0xd8,0xd8,0xff,0x7a,0x7a,0x7a,0xff,0x30,0x30, 0x30,0xaa,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x02, 0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x1c,0x36,0x36,0x36,0x93,0xdb,0xdb, 0xdb,0xff,0x82,0xd3,0xd3,0xd3,0xff,0x26,0xdb,0xdb,0xdb,0xff,0x84,0x84,0x84, 0xff,0x28,0x28,0x28,0x80,0x00,0x00,0x00,0x05,0x10,0x10,0x10,0x5e,0xc6,0xc6, 0xc6,0xfd,0xd8,0xd8,0xd8,0xff,0xd2,0xd2,0xd2,0xff,0xdc,0xdc,0xdc,0xff,0xa8, 0xa8,0xa8,0xff,0x4c,0x4c,0x4c,0xbc,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0e,0x76,0x76,0x76,0xd8,0xdd,0xdd,0xdd,0xff,0xd3,0xd3,0xd3, 0xff,0xd9,0xd9,0xd9,0xff,0xbf,0xbf,0xbf,0xff,0x42,0x42,0x42,0xd9,0x00,0x00, 0x00,0x2b,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x27,0x27,0x27,0x84,0xca, 0xca,0xca,0xff,0xd7,0xd7,0xd7,0xff,0xd3,0xd3,0xd3,0xff,0xdb,0xdb,0xdb,0xff, 0x8e,0x8e,0x8e,0xff,0x18,0x18,0x18,0x69,0x00,0x00,0x00,0x00,0x15,0x15,0x15, 0x63,0x96,0x96,0x96,0xff,0xdb,0xdb,0xdb,0xff,0xd2,0xd2,0xd2,0xff,0xd9,0xd9, 0xd9,0xff,0xc8,0xc8,0xc8,0xff,0x1e,0x1e,0x1e,0x82,0x83,0x00,0x00,0x00,0x00, 0x11,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x15,0x04,0x04,0x04,0x61,0x6a,0x6a, 0x6a,0xf9,0xda,0xda,0xda,0xff,0xd4,0xd4,0xd4,0xff,0xd3,0xd3,0xd3,0xff,0xe1, 0xe1,0xe1,0xff,0x51,0x51,0x51,0xa7,0x00,0x00,0x00,0x04,0x2b,0x2b,0x2b,0xa0, 0xa9,0xa9,0xa9,0xff,0xde,0xde,0xde,0xff,0xd3,0xd3,0xd3,0xff,0xd9,0xd9,0xd9, 0xff,0xb9,0xb9,0xb9,0xff,0x10,0x10,0x10,0x55,0x84,0x00,0x00,0x00,0x00,0x0f, 0x1a,0x1a,0x1a,0x3a,0x79,0x79,0x79,0xfa,0xc8,0xc8,0xc8,0xff,0xd7,0xd7,0xd7, 0xff,0xd6,0xd6,0xd6,0xff,0xce,0xce,0xce,0xfe,0x1f,0x1f,0x1f,0x71,0x00,0x00, 0x00,0x2b,0x33,0x33,0x33,0xbb,0x8e,0x8e,0x8e,0xff,0xe2,0xe2,0xe2,0xff,0xd0, 0xd0,0xd0,0xff,0xdc,0xdc,0xdc,0xff,0xa8,0xa8,0xa8,0xee,0x07,0x07,0x07,0x1f, 0x87,0x00,0x00,0x00,0x00,0x03,0x05,0x05,0x05,0x00,0x0b,0x0b,0x0b,0x00,0x00, 0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x03,0x00,0x00,0x00,0x00,0x29,0x29, 0x29,0x5d,0xd3,0xd3,0xd3,0xff,0x82,0xd2,0xd2,0xd2,0xff,0x04,0xd0,0xd0,0xd0, 0xff,0x79,0x79,0x79,0xff,0x37,0x37,0x37,0xa9,0x00,0x00,0x00,0x04,0x84,0x00, 0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x05,0x1f,0x1f,0x1f,0x68,0xcc,0xcc,0xcc, 0xff,0xd7,0xd7,0xd7,0xff,0xd2,0xd2,0xd2,0xff,0xdc,0xdc,0xdc,0xff,0x86,0x86, 0x86,0xff,0x2b,0x2b,0x2b,0x88,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x2e,0x8f, 0x8f,0x8f,0xdc,0xe0,0xe0,0xe0,0xff,0xd1,0xd1,0xd1,0xff,0xd7,0xd7,0xd7,0xff, 0xc1,0xc1,0xc1,0xff,0x68,0x68,0x68,0xf0,0x09,0x09,0x09,0x23,0x00,0x00,0x00, 0x00,0x0f,0x0f,0x0f,0x3d,0xaa,0xaa,0xaa,0xfb,0xdd,0xdd,0xdd,0xff,0xd1,0xd1, 0xd1,0xff,0xdc,0xdc,0xdc,0xff,0x97,0x97,0x97,0xff,0x22,0x22,0x22,0x9f,0x00, 0x00,0x00,0x13,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x27,0x27,0x27,0x83, 0xca,0xca,0xca,0xff,0xd6,0xd6,0xd6,0xff,0xd2,0xd2,0xd2,0xff,0xda,0xda,0xda, 0xff,0x8d,0x8d,0x8d,0xff,0x18,0x18,0x18,0x69,0x00,0x00,0x00,0x00,0x15,0x15, 0x15,0x63,0x95,0x95,0x95,0xff,0xdc,0xdc,0xdc,0xff,0xd3,0xd3,0xd3,0xff,0xda, 0xda,0xda,0xff,0xbe,0xbe,0xbe,0xff,0x20,0x20,0x20,0x82,0x84,0x00,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x33,0x51,0x51,0x51,0xe4,0xce, 0xce,0xce,0xff,0xd6,0xd6,0xd6,0xff,0xd3,0xd3,0xd3,0xff,0xdf,0xdf,0xdf,0xff, 0x60,0x60,0x60,0xbf,0x00,0x00,0x00,0x0e,0x2c,0x2c,0x2c,0xa0,0xa1,0xa1,0xa1, 0xff,0xdc,0xdc,0xdc,0xff,0xd3,0xd3,0xd3,0xff,0xd9,0xd9,0xd9,0xff,0xbd,0xbd, 0xbd,0xff,0x11,0x11,0x11,0x54,0x84,0x00,0x00,0x00,0x00,0x0b,0x44,0x44,0x44, 0x95,0x96,0x96,0x96,0xff,0xdb,0xdb,0xdb,0xff,0xd0,0xd0,0xd0,0xff,0xe0,0xe0, 0xe0,0xff,0x92,0x92,0x92,0xe0,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x14,0x1b, 0x1b,0x1b,0x73,0x65,0x65,0x65,0xff,0xcf,0xcf,0xcf,0xff,0x82,0xd3,0xd3,0xd3, 0xff,0x02,0xd4,0xd4,0xd4,0xff,0x3b,0x3b,0x3b,0x72,0x86,0x00,0x00,0x00,0x00, 0x04,0x21,0x21,0x21,0x00,0x90,0x90,0x90,0x00,0x1b,0x1b,0x1b,0x00,0x00,0x00, 0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x09,0x00,0x00,0x00,0x00,0x29,0x29,0x29, 0x5d,0xd1,0xd1,0xd1,0xff,0xcf,0xcf,0xcf,0xff,0xd0,0xd0,0xd0,0xff,0xc9,0xc9, 0xc9,0xff,0x76,0x76,0x76,0xff,0x3d,0x3d,0x3d,0xaa,0x00,0x00,0x00,0x05,0x85, 0x00,0x00,0x00,0x00,0x14,0x18,0x18,0x18,0x52,0xc2,0xc2,0xc2,0xfe,0xd5,0xd5, 0xd5,0xff,0xcf,0xcf,0xcf,0xff,0xdc,0xdc,0xdc,0xff,0x87,0x87,0x87,0xff,0x2b, 0x2b,0x2b,0x8a,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x13,0x4c,0x4c,0x4c,0xa4, 0xde,0xde,0xde,0xff,0xd1,0xd1,0xd1,0xff,0xd2,0xd2,0xd2,0xff,0xd3,0xd3,0xd3, 0xff,0x82,0x82,0x82,0xff,0x24,0x24,0x24,0x5b,0x00,0x00,0x00,0x00,0x33,0x33, 0x33,0x80,0xce,0xce,0xce,0xff,0xd7,0xd7,0xd7,0xff,0x82,0xd3,0xd3,0xd3,0xff, 0x03,0x6c,0x6c,0x6c,0xfc,0x0b,0x0b,0x0b,0x60,0x00,0x00,0x00,0x09,0x82,0x00, 0x00,0x00,0x00,0x0f,0x27,0x27,0x27,0x83,0xcc,0xcc,0xcc,0xff,0xd7,0xd7,0xd7, 0xff,0xd3,0xd3,0xd3,0xff,0xda,0xda,0xda,0xff,0x8d,0x8d,0x8d,0xff,0x18,0x18, 0x18,0x69,0x00,0x00,0x00,0x00,0x16,0x16,0x16,0x63,0x95,0x95,0x95,0xff,0xda, 0xda,0xda,0xff,0xd2,0xd2,0xd2,0xff,0xdb,0xdb,0xdb,0xff,0xab,0xab,0xab,0xff, 0x21,0x21,0x21,0x82,0x85,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x22,0x50, 0x50,0x50,0xdc,0xc8,0xc8,0xc8,0xff,0xd7,0xd7,0xd7,0xff,0xd3,0xd3,0xd3,0xff, 0xdb,0xdb,0xdb,0xff,0x60,0x60,0x60,0xc7,0x00,0x00,0x00,0x14,0x2d,0x2d,0x2d, 0xa0,0x9a,0x9a,0x9a,0xff,0xda,0xda,0xda,0xff,0xd1,0xd1,0xd1,0xff,0xd8,0xd8, 0xd8,0xff,0xbf,0xbf,0xbf,0xff,0x11,0x11,0x11,0x54,0x83,0x00,0x00,0x00,0x00, 0x11,0x0c,0x0c,0x0c,0x16,0x69,0x69,0x69,0xe6,0xba,0xba,0xba,0xff,0xd9,0xd9, 0xd9,0xff,0xd0,0xd0,0xd0,0xff,0xdc,0xdc,0xdc,0xff,0x44,0x44,0x44,0x9d,0x00, 0x00,0x00,0x15,0x00,0x00,0x00,0x08,0x05,0x05,0x05,0x3a,0x4a,0x4a,0x4a,0xe6, 0xa6,0xa6,0xa6,0xff,0xda,0xda,0xda,0xff,0xcd,0xcd,0xcd,0xff,0xdb,0xdb,0xdb, 0xff,0x83,0x83,0x83,0xcb,0x00,0x00,0x00,0x07,0x85,0x00,0x00,0x00,0x00,0x04, 0x77,0x77,0x77,0x00,0xab,0xab,0xab,0x00,0x17,0x17,0x17,0x00,0x00,0x00,0x00, 0x00,0x82,0xff,0xff,0xff,0x00,0x09,0x00,0x00,0x00,0x00,0x29,0x29,0x29,0x5d, 0xca,0xca,0xca,0xff,0xcb,0xcb,0xcb,0xff,0xcc,0xcc,0xcc,0xff,0xc5,0xc5,0xc5, 0xff,0x76,0x76,0x76,0xff,0x3f,0x3f,0x3f,0xaa,0x00,0x00,0x00,0x05,0x85,0x00, 0x00,0x00,0x00,0x19,0x17,0x17,0x17,0x4b,0xbd,0xbd,0xbd,0xfc,0xd1,0xd1,0xd1, 0xff,0xcb,0xcb,0xcb,0xff,0xd9,0xd9,0xd9,0xff,0x88,0x88,0x88,0xff,0x2c,0x2c, 0x2c,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x15,0x15,0x15,0x64,0xc2, 0xc2,0xc2,0xff,0xd3,0xd3,0xd3,0xff,0xcd,0xcd,0xcd,0xff,0xd8,0xd8,0xd8,0xff, 0x9f,0x9f,0x9f,0xff,0x3e,0x3e,0x3e,0x9d,0x00,0x00,0x00,0x02,0x69,0x69,0x69, 0xc0,0xda,0xda,0xda,0xff,0xcf,0xcf,0xcf,0xff,0xd4,0xd4,0xd4,0xff,0xba,0xba, 0xba,0xff,0x46,0x46,0x46,0xdd,0x01,0x01,0x01,0x2e,0x00,0x00,0x00,0x04,0x82, 0x00,0x00,0x00,0x00,0x0f,0x27,0x27,0x27,0x83,0xcb,0xcb,0xcb,0xff,0xd4,0xd4, 0xd4,0xff,0xd1,0xd1,0xd1,0xff,0xd8,0xd8,0xd8,0xff,0x8d,0x8d,0x8d,0xff,0x18, 0x18,0x18,0x69,0x00,0x00,0x00,0x00,0x16,0x16,0x16,0x64,0x95,0x95,0x95,0xff, 0xd8,0xd8,0xd8,0xff,0xd0,0xd0,0xd0,0xff,0xd7,0xd7,0xd7,0xff,0xb2,0xb2,0xb2, 0xff,0x22,0x22,0x22,0x83,0x85,0x00,0x00,0x00,0x00,0x0f,0x03,0x03,0x03,0x24, 0x5e,0x5e,0x5e,0xe4,0xcb,0xcb,0xcb,0xff,0xd3,0xd3,0xd3,0xff,0xd0,0xd0,0xd0, 0xff,0xdb,0xdb,0xdb,0xff,0x5e,0x5e,0x5e,0xc2,0x00,0x00,0x00,0x15,0x2d,0x2d, 0x2d,0xa0,0xa0,0xa0,0xa0,0xff,0xd7,0xd7,0xd7,0xff,0xce,0xce,0xce,0xff,0xd4, 0xd4,0xd4,0xff,0xbf,0xbf,0xbf,0xff,0x12,0x12,0x12,0x54,0x83,0x00,0x00,0x00, 0x00,0x07,0x2f,0x2f,0x2f,0x64,0x89,0x89,0x89,0xff,0xd5,0xd5,0xd5,0xff,0xcd, 0xcd,0xcd,0xff,0xd2,0xd2,0xd2,0xff,0xbe,0xbe,0xbe,0xf3,0x0b,0x0b,0x0b,0x48, 0x82,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x29,0x29,0x29,0xa0,0x86, 0x86,0x86,0xff,0xdc,0xdc,0xdc,0xff,0xc7,0xc7,0xc7,0xff,0xd0,0xd0,0xd0,0xff, 0xbb,0xbb,0xbb,0xfe,0x1c,0x1c,0x1c,0x42,0x84,0x00,0x00,0x00,0x00,0x05,0x26, 0x26,0x26,0x00,0xa4,0xa4,0xa4,0x00,0xa0,0xa0,0xa0,0x00,0x17,0x17,0x17,0x00, 0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x09,0x00,0x00,0x00,0x00,0x28, 0x28,0x28,0x5c,0xc0,0xc0,0xc0,0xff,0xbf,0xbf,0xbf,0xff,0xc0,0xc0,0xc0,0xff, 0xbf,0xbf,0xbf,0xff,0x78,0x78,0x78,0xff,0x3f,0x3f,0x3f,0xaa,0x00,0x00,0x00, 0x06,0x85,0x00,0x00,0x00,0x00,0x19,0x18,0x18,0x18,0x49,0xb7,0xb7,0xb7,0xfc, 0xc9,0xc9,0xc9,0xff,0xc1,0xc1,0xc1,0xff,0xd3,0xd3,0xd3,0xff,0x8b,0x8b,0x8b, 0xff,0x2e,0x2e,0x2e,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x34,0x8d,0x8d,0x8d,0xe0,0xd1,0xd1,0xd1,0xff,0xc4,0xc4,0xc4,0xff,0xcc, 0xcc,0xcc,0xff,0xbb,0xbb,0xbb,0xff,0x5b,0x5b,0x5b,0xd1,0x09,0x09,0x09,0x38, 0x9b,0x9b,0x9b,0xf0,0xd0,0xd0,0xd0,0xff,0xc6,0xc6,0xc6,0xff,0xcf,0xcf,0xcf, 0xff,0x99,0x99,0x99,0xff,0x27,0x27,0x27,0xa4,0x00,0x00,0x00,0x13,0x00,0x00, 0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x0f,0x29,0x29,0x29,0x84,0xc6,0xc6,0xc6, 0xff,0xca,0xca,0xca,0xff,0xc8,0xc8,0xc8,0xff,0xd0,0xd0,0xd0,0xff,0x8e,0x8e, 0x8e,0xff,0x19,0x19,0x19,0x69,0x00,0x00,0x00,0x00,0x16,0x16,0x16,0x63,0x96, 0x96,0x96,0xff,0xd0,0xd0,0xd0,0xff,0xc7,0xc7,0xc7,0xff,0xcd,0xcd,0xcd,0xff, 0xc1,0xc1,0xc1,0xff,0x23,0x23,0x23,0x82,0x85,0x00,0x00,0x00,0x00,0x03,0x11, 0x11,0x11,0x45,0x82,0x82,0x82,0xfc,0xce,0xce,0xce,0xff,0x82,0xc7,0xc7,0xc7, 0xff,0x0a,0xd6,0xd6,0xd6,0xff,0x51,0x51,0x51,0xb1,0x00,0x00,0x00,0x12,0x2d, 0x2d,0x2d,0xa1,0xa6,0xa6,0xa6,0xff,0xd1,0xd1,0xd1,0xff,0xc6,0xc6,0xc6,0xff, 0xcb,0xcb,0xcb,0xff,0xbe,0xbe,0xbe,0xff,0x13,0x13,0x13,0x54,0x82,0x00,0x00, 0x00,0x00,0x12,0x01,0x01,0x01,0x02,0x58,0x58,0x58,0xc1,0xad,0xad,0xad,0xff, 0xd1,0xd1,0xd1,0xff,0xc1,0xc1,0xc1,0xff,0xd1,0xd1,0xd1,0xff,0x87,0x87,0x87, 0xde,0x11,0x11,0x11,0x64,0x2a,0x2a,0x2a,0x4b,0x30,0x30,0x30,0x49,0x27,0x27, 0x27,0x4f,0x2e,0x2e,0x2e,0x93,0x64,0x64,0x64,0xff,0xc8,0xc8,0xc8,0xff,0xc2, 0xc2,0xc2,0xff,0xc0,0xc0,0xc0,0xff,0xcb,0xcb,0xcb,0xff,0x5b,0x5b,0x5b,0x9f, 0x84,0x00,0x00,0x00,0x00,0x05,0x3e,0x3e,0x3e,0x00,0xa7,0xa7,0xa7,0x00,0x9f, 0x9f,0x9f,0x00,0x17,0x17,0x17,0x00,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff, 0x00,0x03,0x00,0x00,0x00,0x00,0x26,0x26,0x26,0x5a,0xb1,0xb1,0xb1,0xff,0x82, 0xb0,0xb0,0xb0,0xff,0x04,0xb5,0xb5,0xb5,0xff,0x7b,0x7b,0x7b,0xff,0x40,0x40, 0x40,0xaa,0x00,0x00,0x00,0x06,0x85,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x18, 0x49,0xab,0xab,0xab,0xfc,0xb9,0xb9,0xb9,0xff,0xb1,0xb1,0xb1,0xff,0xc6,0xc6, 0xc6,0xff,0x8c,0x8c,0x8c,0xff,0x2f,0x2f,0x2f,0x8b,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x4f,0x4f,0x4f,0xaa,0xc4,0xc4,0xc4,0xff, 0xb6,0xb6,0xb6,0xff,0xb5,0xb5,0xb5,0xff,0xcb,0xcb,0xcb,0xff,0x7c,0x7c,0x7c, 0xf2,0x37,0x37,0x37,0x9f,0xb8,0xb8,0xb8,0xfe,0xbb,0xbb,0xbb,0xff,0xb8,0xb8, 0xb8,0xff,0xc1,0xc1,0xc1,0xff,0x76,0x76,0x76,0xfe,0x0e,0x0e,0x0e,0x64,0x00, 0x00,0x00,0x09,0x83,0x00,0x00,0x00,0x00,0x23,0x2a,0x2a,0x2a,0x84,0xbd,0xbd, 0xbd,0xff,0xbb,0xbb,0xbb,0xff,0xb9,0xb9,0xb9,0xff,0xc1,0xc1,0xc1,0xff,0x8e, 0x8e,0x8e,0xff,0x1a,0x1a,0x1a,0x69,0x00,0x00,0x00,0x00,0x17,0x17,0x17,0x63, 0x94,0x94,0x94,0xff,0xc1,0xc1,0xc1,0xff,0xb9,0xb9,0xb9,0xff,0xbe,0xbe,0xbe, 0xff,0xc0,0xc0,0xc0,0xff,0x24,0x24,0x24,0x80,0x00,0x00,0x00,0x00,0x0f,0x0f, 0x0f,0x00,0x3f,0x3f,0x3f,0x00,0x1e,0x1e,0x1e,0x00,0x05,0x05,0x05,0x02,0x50, 0x50,0x50,0xb6,0xbd,0xbd,0xbd,0xff,0xc0,0xc0,0xc0,0xff,0xb7,0xb7,0xb7,0xff, 0xba,0xba,0xba,0xff,0xc1,0xc1,0xc1,0xff,0x32,0x32,0x32,0x95,0x00,0x00,0x00, 0x0c,0x2e,0x2e,0x2e,0xa1,0xa8,0xa8,0xa8,0xff,0xc1,0xc1,0xc1,0xff,0xb6,0xb6, 0xb6,0xff,0xba,0xba,0xba,0xff,0xb9,0xb9,0xb9,0xff,0x15,0x15,0x15,0x54,0x82, 0x00,0x00,0x00,0x00,0x13,0x18,0x18,0x18,0x37,0x7d,0x7d,0x7d,0xfa,0xc9,0xc9, 0xc9,0xff,0xb7,0xb7,0xb7,0xff,0xb4,0xb4,0xb4,0xff,0xc2,0xc2,0xc2,0xff,0xa8, 0xa8,0xa8,0xff,0xb1,0xb1,0xb1,0xff,0xc3,0xc3,0xc3,0xff,0xc9,0xc9,0xc9,0xff, 0xc8,0xc8,0xc8,0xff,0xc1,0xc1,0xc1,0xff,0xad,0xad,0xad,0xff,0xc3,0xc3,0xc3, 0xff,0xb7,0xb7,0xb7,0xff,0xb0,0xb0,0xb0,0xff,0xb8,0xb8,0xb8,0xff,0x93,0x93, 0x93,0xec,0x08,0x08,0x08,0x1c,0x82,0x00,0x00,0x00,0x00,0x06,0x08,0x08,0x08, 0x00,0x41,0x41,0x41,0x00,0xa5,0xa5,0xa5,0x00,0x9f,0x9f,0x9f,0x00,0x17,0x17, 0x17,0x00,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x09,0x00,0x00,0x00, 0x00,0x22,0x22,0x22,0x58,0x9e,0x9e,0x9e,0xff,0x9c,0x9c,0x9c,0xff,0x9a,0x9a, 0x9a,0xff,0xa7,0xa7,0xa7,0xff,0x7e,0x7e,0x7e,0xff,0x40,0x40,0x40,0xac,0x00, 0x00,0x00,0x06,0x85,0x00,0x00,0x00,0x00,0x18,0x1a,0x1a,0x1a,0x49,0x9d,0x9d, 0x9d,0xfb,0xa3,0xa3,0xa3,0xff,0x9e,0x9e,0x9e,0xff,0xb4,0xb4,0xb4,0xff,0x8c, 0x8c,0x8c,0xff,0x30,0x30,0x30,0x8c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0a,0x1c,0x1c,0x1c,0x6a,0xa8,0xa8,0xa8,0xff,0xa5,0xa5,0xa5, 0xff,0x9e,0x9e,0x9e,0xff,0xb8,0xb8,0xb8,0xff,0xba,0xba,0xba,0xfe,0xa1,0xa1, 0xa1,0xf9,0xb3,0xb3,0xb3,0xff,0xa1,0xa1,0xa1,0xff,0xa7,0xa7,0xa7,0xff,0xad, 0xad,0xad,0xff,0x50,0x50,0x50,0xdf,0x01,0x01,0x01,0x31,0x00,0x00,0x00,0x04, 0x83,0x00,0x00,0x00,0x00,0x23,0x2c,0x2c,0x2c,0x84,0xaf,0xaf,0xaf,0xff,0xa6, 0xa6,0xa6,0xff,0xa5,0xa5,0xa5,0xff,0xad,0xad,0xad,0xff,0x8d,0x8d,0x8d,0xff, 0x1a,0x1a,0x1a,0x69,0x00,0x00,0x00,0x00,0x19,0x19,0x19,0x63,0x92,0x92,0x92, 0xff,0xac,0xac,0xac,0xff,0xa4,0xa4,0xa4,0xff,0xa9,0xa9,0xa9,0xff,0xb3,0xb3, 0xb3,0xff,0x23,0x23,0x23,0x7f,0x14,0x14,0x14,0x06,0x4a,0x4a,0x4a,0x07,0x5e, 0x5e,0x5e,0x14,0x3f,0x3f,0x3f,0x3b,0x6c,0x6c,0x6c,0xb2,0xba,0xba,0xba,0xff, 0xbf,0xbf,0xbf,0xff,0xa2,0xa2,0xa2,0xff,0xa5,0xa5,0xa5,0xff,0xaa,0xaa,0xaa, 0xff,0x9e,0x9e,0x9e,0xff,0x13,0x13,0x13,0x67,0x00,0x00,0x00,0x09,0x30,0x30, 0x30,0xa1,0xa1,0xa1,0xa1,0xff,0xac,0xac,0xac,0xff,0xa1,0xa1,0xa1,0xff,0xa4, 0xa4,0xa4,0xff,0xb1,0xb1,0xb1,0xff,0x17,0x17,0x17,0x53,0x82,0x00,0x00,0x00, 0x00,0x09,0x42,0x42,0x42,0x91,0xa3,0xa3,0xa3,0xff,0xbd,0xbd,0xbd,0xff,0x9e, 0x9e,0x9e,0xff,0xa2,0xa2,0xa2,0xff,0xa5,0xa5,0xa5,0xff,0xb3,0xb3,0xb3,0xff, 0xb4,0xb4,0xb4,0xff,0xb0,0xb0,0xb0,0xff,0x82,0xaf,0xaf,0xaf,0xff,0x03,0xb1, 0xb1,0xb1,0xff,0xb2,0xb2,0xb2,0xff,0xab,0xab,0xab,0xff,0x82,0x9d,0x9d,0x9d, 0xff,0x03,0x9e,0x9e,0x9e,0xff,0xa3,0xa3,0xa3,0xff,0x39,0x39,0x39,0x6d,0x82, 0x00,0x00,0x00,0x00,0x06,0x22,0x22,0x22,0x00,0x55,0x55,0x55,0x00,0xa2,0xa2, 0xa2,0x00,0x9f,0x9f,0x9f,0x00,0x17,0x17,0x17,0x00,0x00,0x00,0x00,0x00,0x82, 0xff,0xff,0xff,0x00,0x09,0x00,0x00,0x00,0x00,0x1e,0x1e,0x1e,0x54,0x8c,0x8c, 0x8c,0xff,0x87,0x87,0x87,0xff,0x84,0x84,0x84,0xff,0x99,0x99,0x99,0xff,0x83, 0x83,0x83,0xff,0x3f,0x3f,0x3f,0xab,0x00,0x00,0x00,0x06,0x85,0x00,0x00,0x00, 0x00,0x18,0x1c,0x1c,0x1c,0x48,0x91,0x91,0x91,0xfb,0x8c,0x8c,0x8c,0xff,0x89, 0x89,0x89,0xff,0x9f,0x9f,0x9f,0xff,0x8c,0x8c,0x8c,0xff,0x32,0x32,0x32,0x8c, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x02,0x02,0x02, 0x36,0x7f,0x7f,0x7f,0xe4,0x97,0x97,0x97,0xff,0x8c,0x8c,0x8c,0xff,0x8f,0x8f, 0x8f,0xff,0xd8,0xd8,0xd8,0xff,0xd3,0xd3,0xd3,0xff,0x94,0x94,0x94,0xff,0x8d, 0x8d,0x8d,0xff,0x95,0x95,0x95,0xff,0x8e,0x8e,0x8e,0xff,0x30,0x30,0x30,0xa9, 0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x02,0x83,0x00,0x00,0x00,0x00,0x2a,0x2f, 0x2f,0x2f,0x83,0xa3,0xa3,0xa3,0xff,0x90,0x90,0x90,0xff,0x8f,0x8f,0x8f,0xff, 0x97,0x97,0x97,0xff,0x8d,0x8d,0x8d,0xff,0x1d,0x1d,0x1d,0x69,0x00,0x00,0x00, 0x00,0x1b,0x1b,0x1b,0x63,0x90,0x90,0x90,0xff,0x95,0x95,0x95,0xff,0x8f,0x8f, 0x8f,0xff,0x90,0x90,0x90,0xff,0xb9,0xb9,0xb9,0xff,0x90,0x90,0x90,0xe6,0x95, 0x95,0x95,0xcd,0xa1,0xa1,0xa1,0xce,0xa6,0xa6,0xa6,0xde,0xbe,0xbe,0xbe,0xff, 0xcc,0xcc,0xcc,0xff,0xaf,0xaf,0xaf,0xff,0x8b,0x8b,0x8b,0xff,0x90,0x90,0x90, 0xff,0x8e,0x8e,0x8e,0xff,0x9d,0x9d,0x9d,0xff,0x6e,0x6e,0x6e,0xe5,0x00,0x00, 0x00,0x34,0x00,0x00,0x00,0x09,0x33,0x33,0x33,0xa1,0x91,0x91,0x91,0xff,0x93, 0x93,0x93,0xff,0x8d,0x8d,0x8d,0xff,0x8e,0x8e,0x8e,0xff,0xa8,0xa8,0xa8,0xff, 0x1a,0x1a,0x1a,0x52,0x00,0x00,0x00,0x00,0x0a,0x0a,0x0a,0x12,0x6e,0x6e,0x6e, 0xe4,0xb9,0xb9,0xb9,0xff,0x91,0x91,0x91,0xff,0x88,0x88,0x88,0xff,0x8b,0x8b, 0x8b,0xff,0x82,0x90,0x90,0x90,0xff,0x02,0x8f,0x8f,0x8f,0xff,0x90,0x90,0x90, 0xff,0x82,0x8f,0x8f,0x8f,0xff,0x82,0x8e,0x8e,0x8e,0xff,0x0e,0x88,0x88,0x88, 0xff,0x8a,0x8a,0x8a,0xff,0x8b,0x8b,0x8b,0xff,0x8a,0x8a,0x8a,0xff,0x91,0x91, 0x91,0xff,0x6b,0x6b,0x6b,0xc8,0x01,0x01,0x01,0x05,0x00,0x00,0x00,0x00,0x31, 0x31,0x31,0x00,0x4f,0x4f,0x4f,0x00,0xa7,0xa7,0xa7,0x10,0xa0,0xa0,0xa0,0x00, 0x15,0x15,0x15,0x00,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x09,0x00, 0x00,0x00,0x00,0x1d,0x1d,0x1d,0x50,0x7d,0x7d,0x7d,0xff,0x77,0x77,0x77,0xff, 0x74,0x74,0x74,0xff,0x8c,0x8c,0x8c,0xff,0x85,0x85,0x85,0xff,0x3f,0x3f,0x3f, 0xab,0x00,0x00,0x00,0x06,0x85,0x00,0x00,0x00,0x00,0x0f,0x1d,0x1d,0x1d,0x48, 0x88,0x88,0x88,0xfb,0x7a,0x7a,0x7a,0xff,0x76,0x76,0x76,0xff,0x8e,0x8e,0x8e, 0xff,0x8d,0x8d,0x8d,0xff,0x32,0x32,0x32,0x8c,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x17,0x49,0x49,0x49,0xb0,0x8a, 0x8a,0x8a,0xff,0x7c,0x7c,0x7c,0xff,0x7b,0x7b,0x7b,0xff,0x82,0x8f,0x8f,0x8f, 0xff,0x06,0x7b,0x7b,0x7b,0xff,0x7c,0x7c,0x7c,0xff,0x83,0x83,0x83,0xff,0x70, 0x70,0x70,0xff,0x15,0x15,0x15,0x69,0x00,0x00,0x00,0x0a,0x84,0x00,0x00,0x00, 0x00,0x02,0x32,0x32,0x32,0x83,0x9a,0x9a,0x9a,0xff,0x82,0x7c,0x7c,0x7c,0xff, 0x28,0x84,0x84,0x84,0xff,0x8d,0x8d,0x8d,0xff,0x1f,0x1f,0x1f,0x69,0x00,0x00, 0x00,0x00,0x1e,0x1e,0x1e,0x63,0x8f,0x8f,0x8f,0xff,0x82,0x82,0x82,0xff,0x7e, 0x7e,0x7e,0xff,0x7d,0x7d,0x7d,0xff,0xa3,0xa3,0xa3,0xff,0xba,0xba,0xba,0xff, 0xb8,0xb8,0xb8,0xff,0xb7,0xb7,0xb7,0xff,0xb1,0xb1,0xb1,0xff,0x9f,0x9f,0x9f, 0xff,0x84,0x84,0x84,0xff,0x77,0x77,0x77,0xff,0x7d,0x7d,0x7d,0xff,0x7c,0x7c, 0x7c,0xff,0x80,0x80,0x80,0xff,0x86,0x86,0x86,0xff,0x23,0x23,0x23,0x8e,0x00, 0x00,0x00,0x17,0x00,0x00,0x00,0x05,0x37,0x37,0x37,0xa2,0x8b,0x8b,0x8b,0xff, 0x80,0x80,0x80,0xff,0x7c,0x7c,0x7c,0xff,0x7b,0x7b,0x7b,0xff,0xa1,0xa1,0xa1, 0xff,0x1c,0x1c,0x1c,0x52,0x00,0x00,0x00,0x00,0x2d,0x2d,0x2d,0x5f,0x98,0x98, 0x98,0xff,0xa7,0xa7,0xa7,0xff,0x73,0x73,0x73,0xff,0x7c,0x7c,0x7c,0xff,0x7d, 0x7d,0x7d,0xff,0x3d,0x3d,0x3d,0xc7,0x30,0x30,0x30,0xb4,0x82,0x32,0x32,0x32, 0xb6,0x01,0x33,0x33,0x33,0xb6,0x82,0x32,0x32,0x32,0xb6,0x04,0x33,0x33,0x33, 0xb5,0x52,0x52,0x52,0xeb,0x79,0x79,0x79,0xff,0x7e,0x7e,0x7e,0xff,0x82,0x78, 0x78,0x78,0xff,0x09,0x81,0x81,0x81,0xfd,0x1d,0x1d,0x1d,0x3c,0x00,0x00,0x00, 0x00,0x49,0x49,0x49,0x1e,0x84,0x84,0x84,0x91,0x76,0x76,0x76,0x94,0x9d,0x9d, 0x9d,0x7e,0x1f,0x1f,0x1f,0x0a,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00, 0x09,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x4c,0x72,0x72,0x72,0xff,0x6c,0x6c, 0x6c,0xff,0x68,0x68,0x68,0xff,0x80,0x80,0x80,0xff,0x86,0x86,0x86,0xff,0x3f, 0x3f,0x3f,0xac,0x00,0x00,0x00,0x06,0x85,0x00,0x00,0x00,0x00,0x08,0x1b,0x1b, 0x1b,0x48,0x7d,0x7d,0x7d,0xfb,0x6e,0x6e,0x6e,0xff,0x6b,0x6b,0x6b,0xff,0x80, 0x80,0x80,0xff,0x8b,0x8b,0x8b,0xff,0x32,0x32,0x32,0x8c,0x00,0x00,0x00,0x01, 0x82,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0b,0x1e,0x1e,0x1e,0x70,0x79, 0x79,0x79,0xff,0x82,0x70,0x70,0x70,0xff,0x82,0x6b,0x6b,0x6b,0xff,0x06,0x70, 0x70,0x70,0xff,0x6f,0x6f,0x6f,0xff,0x7e,0x7e,0x7e,0xff,0x58,0x58,0x58,0xe3, 0x04,0x04,0x04,0x35,0x00,0x00,0x00,0x05,0x84,0x00,0x00,0x00,0x00,0x0e,0x33, 0x33,0x33,0x83,0x8e,0x8e,0x8e,0xff,0x6e,0x6e,0x6e,0xff,0x70,0x70,0x70,0xff, 0x77,0x77,0x77,0xff,0x8e,0x8e,0x8e,0xff,0x20,0x20,0x20,0x69,0x00,0x00,0x00, 0x00,0x1f,0x1f,0x1f,0x63,0x8f,0x8f,0x8f,0xff,0x76,0x76,0x76,0xff,0x72,0x72, 0x72,0xff,0x73,0x73,0x73,0xff,0x6b,0x6b,0x6b,0xff,0x82,0x69,0x69,0x69,0xff, 0x1c,0x6a,0x6a,0x6a,0xff,0x68,0x68,0x68,0xff,0x6b,0x6b,0x6b,0xff,0x6e,0x6e, 0x6e,0xff,0x71,0x71,0x71,0xff,0x72,0x72,0x72,0xff,0x7a,0x7a,0x7a,0xff,0x7f, 0x7f,0x7f,0xff,0x35,0x35,0x35,0xb4,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x0c, 0x00,0x00,0x00,0x02,0x39,0x39,0x39,0xa2,0x89,0x89,0x89,0xff,0x73,0x73,0x73, 0xff,0x70,0x70,0x70,0xff,0x6d,0x6d,0x6d,0xff,0x9d,0x9d,0x9d,0xff,0x1e,0x1e, 0x1e,0x51,0x00,0x00,0x00,0x00,0x5b,0x5b,0x5b,0xbb,0xaa,0xaa,0xaa,0xff,0x7c, 0x7c,0x7c,0xff,0x6b,0x6b,0x6b,0xff,0x73,0x73,0x73,0xff,0x65,0x65,0x65,0xeb, 0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x43,0x86,0x00,0x00,0x00,0x44,0x0e,0x2b, 0x2b,0x2b,0xaa,0x75,0x75,0x75,0xff,0x7c,0x7c,0x7c,0xff,0x6a,0x6a,0x6a,0xff, 0x6b,0x6b,0x6b,0xff,0x77,0x77,0x77,0xff,0x4e,0x4e,0x4e,0x99,0x01,0x01,0x01, 0x00,0x6d,0x6d,0x6d,0x8d,0x68,0x68,0x68,0xae,0x69,0x69,0x69,0xac,0x6a,0x6a, 0x6a,0xb7,0x5a,0x5a,0x5a,0x6c,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00, 0x09,0x00,0x00,0x00,0x00,0x1b,0x1b,0x1b,0x4d,0x7e,0x7e,0x7e,0xff,0x79,0x79, 0x79,0xff,0x74,0x74,0x74,0xff,0x8a,0x8a,0x8a,0xff,0x91,0x91,0x91,0xff,0x45, 0x45,0x45,0xb3,0x00,0x00,0x00,0x06,0x85,0x00,0x00,0x00,0x00,0x08,0x19,0x19, 0x19,0x4a,0x81,0x81,0x81,0xff,0x79,0x79,0x79,0xff,0x76,0x76,0x76,0xff,0x86, 0x86,0x86,0xff,0x91,0x91,0x91,0xff,0x37,0x37,0x37,0x92,0x00,0x00,0x00,0x02, 0x82,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x03,0x03,0x03,0x3b,0x6a, 0x6a,0x6a,0xee,0x7e,0x7e,0x7e,0xff,0x79,0x79,0x79,0xff,0x82,0x78,0x78,0x78, 0xff,0x06,0x79,0x79,0x79,0xff,0x7a,0x7a,0x7a,0xff,0x88,0x88,0x88,0xff,0x3a, 0x3a,0x3a,0xb0,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x01,0x84,0x00,0x00,0x00, 0x00,0x0b,0x36,0x36,0x36,0x89,0x8e,0x8e,0x8e,0xff,0x78,0x78,0x78,0xff,0x79, 0x79,0x79,0xff,0x7e,0x7e,0x7e,0xff,0x8e,0x8e,0x8e,0xff,0x24,0x24,0x24,0x6e, 0x00,0x00,0x00,0x00,0x23,0x23,0x23,0x67,0x8f,0x8f,0x8f,0xff,0x7d,0x7d,0x7d, 0xff,0x82,0x78,0x78,0x78,0xff,0x04,0x79,0x79,0x79,0xff,0x7a,0x7a,0x7a,0xff, 0x79,0x79,0x79,0xff,0x78,0x78,0x78,0xff,0x82,0x79,0x79,0x79,0xff,0x82,0x7b, 0x7b,0x7b,0xff,0x0a,0x79,0x79,0x79,0xff,0x63,0x63,0x63,0xe9,0x25,0x25,0x25, 0x9d,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x02,0x3f,0x3f,0x3f,0xaa,0x93,0x93,0x93,0xff,0x7a,0x7a,0x7a,0xff,0x82, 0x77,0x77,0x77,0xff,0x0b,0x96,0x96,0x96,0xff,0x19,0x19,0x19,0x4c,0x19,0x19, 0x19,0x3a,0x8e,0x8e,0x8e,0xff,0xa0,0xa0,0xa0,0xff,0x73,0x73,0x73,0xff,0x77, 0x77,0x77,0xff,0x81,0x81,0x81,0xff,0x42,0x42,0x42,0xb3,0x00,0x00,0x00,0x23, 0x00,0x00,0x00,0x12,0x84,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x16,0x12,0x12,0x12,0x60,0x6b,0x6b,0x6b,0xff,0x8e,0x8e,0x8e,0xff, 0x75,0x75,0x75,0xff,0x77,0x77,0x77,0xff,0x78,0x78,0x78,0xff,0x7f,0x7f,0x7f, 0xef,0x0f,0x0f,0x0f,0x25,0x5d,0x5d,0x5d,0x9d,0x55,0x55,0x55,0xa0,0x61,0x61, 0x61,0xc4,0x50,0x50,0x50,0x97,0x4d,0x4d,0x4d,0x89,0x00,0x00,0x00,0x00,0x82, 0xff,0xff,0xff,0x00,0x04,0x00,0x00,0x00,0x01,0x0e,0x0e,0x0e,0x3b,0x44,0x44, 0x44,0xb6,0x42,0x42,0x42,0xc4,0x82,0x41,0x41,0x41,0xc5,0x03,0x45,0x45,0x45, 0xc1,0x29,0x29,0x29,0x7d,0x00,0x00,0x00,0x0b,0x84,0x00,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x01,0x0c,0x0c,0x0c,0x3a,0x42,0x42,0x42,0xb7,0x42,0x42,0x42, 0xc6,0x82,0x41,0x41,0x41,0xc6,0x03,0x46,0x46,0x46,0xc1,0x21,0x21,0x21,0x69, 0x00,0x00,0x00,0x06,0x82,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x1d,0x2c,0x2c,0x2c,0x90,0x48,0x48,0x48,0xc6,0x43,0x43,0x43,0xc7, 0x82,0x43,0x43,0x43,0xc6,0x05,0x43,0x43,0x43,0xc7,0x43,0x43,0x43,0xc8,0x44, 0x44,0x44,0xc2,0x13,0x13,0x13,0x60,0x00,0x00,0x00,0x0d,0x84,0x00,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x04,0x1f,0x1f,0x1f,0x64,0x48,0x48,0x48,0xc3,0x43, 0x43,0x43,0xc8,0x82,0x43,0x43,0x43,0xc9,0x06,0x46,0x46,0x46,0xc1,0x17,0x17, 0x17,0x52,0x00,0x00,0x00,0x04,0x16,0x16,0x16,0x4e,0x47,0x47,0x47,0xc1,0x45, 0x45,0x45,0xca,0x82,0x44,0x44,0x44,0xca,0x85,0x45,0x45,0x45,0xca,0x19,0x43, 0x43,0x43,0xc7,0x3c,0x3c,0x3c,0xc0,0x2f,0x2f,0x2f,0xb1,0x1b,0x1b,0x1b,0x91, 0x01,0x01,0x01,0x64,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x1a,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x29,0x29,0x29,0x7c,0x4e,0x4e, 0x4e,0xc9,0x47,0x47,0x47,0xcd,0x47,0x47,0x47,0xcc,0x48,0x48,0x48,0xcd,0x49, 0x49,0x49,0xc2,0x0d,0x0d,0x0d,0x3f,0x26,0x26,0x26,0x5f,0x54,0x54,0x54,0xc4, 0x46,0x46,0x46,0xcc,0x46,0x46,0x46,0xcd,0x47,0x47,0x47,0xcd,0x4c,0x4c,0x4c, 0xc8,0x13,0x13,0x13,0x61,0x00,0x00,0x00,0x0d,0x86,0x00,0x00,0x00,0x00,0x0f, 0x00,0x00,0x00,0x03,0x01,0x01,0x01,0x2f,0x38,0x38,0x38,0xb0,0x4d,0x4d,0x4d, 0xcf,0x4a,0x4a,0x4a,0xce,0x4b,0x4b,0x4b,0xce,0x4a,0x4a,0x4a,0xcc,0x52,0x52, 0x52,0xc4,0x19,0x19,0x19,0x4a,0x1d,0x1d,0x1d,0x60,0x55,0x55,0x55,0xc6,0x38, 0x38,0x38,0xa0,0x57,0x57,0x57,0xc8,0x0d,0x0d,0x0d,0x43,0x00,0x00,0x00,0x04, 0x82,0xff,0xff,0xff,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x18,0x00, 0x00,0x00,0x37,0x82,0x00,0x00,0x00,0x4b,0x04,0x00,0x00,0x00,0x4c,0x00,0x00, 0x00,0x43,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x0a,0x84,0x00,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x37,0x00,0x00, 0x00,0x4c,0x82,0x00,0x00,0x00,0x4d,0x03,0x00,0x00,0x00,0x42,0x00,0x00,0x00, 0x23,0x00,0x00,0x00,0x08,0x83,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0f, 0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x4e,0x83,0x00,0x00, 0x00,0x4d,0x04,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x23, 0x00,0x00,0x00,0x07,0x84,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x42,0x83,0x00,0x00,0x00,0x4e,0x06,0x00,0x00, 0x00,0x3f,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x3e,0x00,0x00,0x00,0x4f,0x87,0x00,0x00,0x00,0x4e,0x07,0x00,0x00, 0x00,0x4c,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x47,0x82, 0x00,0x00,0x00,0x51,0x02,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x3c,0x82,0x00, 0x00,0x00,0x21,0x02,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x50,0x82,0x00,0x00, 0x00,0x51,0x03,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x07, 0x86,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x16,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x51, 0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x23,0x00,0x00,0x00, 0x21,0x0a,0x0a,0x0a,0x53,0x1c,0x1c,0x1c,0x75,0x03,0x03,0x03,0x44,0x00,0x00, 0x00,0x17,0x00,0x00,0x00,0x05,0x82,0xff,0xff,0xff,0x00,0x04,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x13,0x82,0x00, 0x00,0x00,0x14,0x03,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0b,0x00,0x00,0x00, 0x03,0x84,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x0f,0x83,0x00,0x00,0x00,0x14,0x03,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x02,0x83,0x00,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x13,0x85,0x00,0x00,0x00,0x15, 0x03,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x84,0x00, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x09,0x00,0x00,0x00, 0x12,0x83,0x00,0x00,0x00,0x15,0x05,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x08, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x12,0x88,0x00,0x00, 0x00,0x15,0x05,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0d, 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x84,0x00,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x14,0x83,0x00,0x00,0x00, 0x16,0x04,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x14,0x83,0x00,0x00,0x00,0x16,0x03,0x00,0x00,0x00,0x12,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x01,0x87,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x16,0x83,0x00,0x00,0x00,0x17,0x08, 0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0f,0x00,0x00,0x00, 0x18,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0b,0x00,0x00, 0x00,0x01,0x82,0xff,0xff,0xff,0x00,0xe4,0x00,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xe6,0xff,0xff,0xff,0x00 }; static const GdkPixdata logo_tall_pixdata = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 23130, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 428, /* rowstride */ 107, /* width */ 110, /* height */ logo_tall_pixdata_pixel_data /* pixel_data */ }; nvidia-settings/src/image_data/clock_pixdata.h0000664000175000017500000032712212236467170021671 0ustar albertoalberto/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static guint8 clock_pixdata_pixel_data[] = { 0xb4,0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x04,0x2a,0x2a,0x2c,0x37,0xbe,0xbf,0xc6,0xff,0x59,0x5a,0x5b, 0x92,0x00,0x00,0x00,0x0a,0x82,0x00,0x00,0x00,0x09,0x2d,0x0d,0x0e,0x0e,0x15, 0xa8,0xa9,0xb0,0xf0,0xe3,0xe6,0xe9,0xff,0xa9,0xaa,0xb2,0xff,0x8d,0x8f,0x95, 0xff,0x9b,0x9d,0xa3,0xff,0x81,0x83,0x88,0xff,0x5c,0x5d,0x5f,0xff,0x8c,0x8c, 0x90,0xff,0x81,0x83,0x8a,0xff,0x82,0x83,0x89,0xff,0x43,0x43,0x45,0xa2,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x13,0x89,0x8d,0x92,0xd3,0xc5,0xc7,0xcb,0xff, 0x01,0x01,0x01,0x1d,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x01,0x31,0x32,0x34,0x00,0x1d,0x1e,0x1f,0x00,0x1f,0x1f, 0x20,0x00,0x23,0x23,0x25,0x00,0x15,0x14,0x15,0x00,0x06,0x07,0x07,0x00,0x6f, 0x72,0x78,0x00,0x52,0x53,0x56,0x00,0x1b,0x1c,0x1d,0x00,0x0c,0x0c,0x0d,0x00, 0x00,0x00,0x00,0x00,0x11,0x11,0x12,0x00,0x4d,0x4e,0x52,0x00,0x23,0x23,0x24, 0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x0d,0x00,0x1b,0x1a,0x1d,0x00,0x44,0x46, 0x48,0x00,0x0d,0x0c,0x0c,0x00,0x01,0x01,0x01,0x00,0x11,0x11,0x11,0x00,0x00, 0x00,0x00,0x00,0x23,0x23,0x25,0x00,0x21,0x21,0x24,0x00,0x88,0x00,0x00,0x00, 0x00,0xb4,0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x09,0x83,0x84,0x8a,0xd4,0xc5,0xc7, 0xcc,0xff,0x16,0x18,0x17,0x3e,0x82,0x00,0x00,0x00,0x10,0x2d,0x00,0x00,0x00, 0x11,0x54,0x56,0x59,0x8d,0xde,0xe0,0xe4,0xff,0xcf,0xd2,0xd8,0xff,0x90,0x92, 0x98,0xff,0x5b,0x5b,0x5d,0xff,0x81,0x83,0x87,0xff,0xfc,0xff,0xff,0xff,0xf9, 0xfb,0xfe,0xff,0x9c,0x9d,0xa4,0xff,0x7d,0x7f,0x85,0xff,0x78,0x79,0x7e,0xff, 0x0c,0x0c,0x0d,0x44,0x0d,0x0d,0x0e,0x3a,0xfc,0xfe,0xff,0xff,0x4b,0x4c,0x4f, 0xda,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x02,0x30,0x31,0x33,0x00,0x1c,0x1d,0x1e,0x00,0x1f, 0x1f,0x20,0x00,0x23,0x23,0x25,0x00,0x15,0x14,0x15,0x00,0x06,0x07,0x07,0x00, 0x6f,0x72,0x78,0x00,0x52,0x53,0x56,0x00,0x1b,0x1c,0x1d,0x00,0x0c,0x0c,0x0d, 0x00,0x00,0x00,0x00,0x00,0x11,0x11,0x12,0x00,0x4d,0x4e,0x52,0x00,0x23,0x23, 0x24,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x0d,0x00,0x1b,0x1a,0x1d,0x00,0x44, 0x46,0x48,0x00,0x0d,0x0c,0x0c,0x00,0x01,0x01,0x01,0x00,0x11,0x11,0x11,0x00, 0x00,0x00,0x00,0x00,0x23,0x23,0x25,0x00,0x21,0x21,0x24,0x00,0x88,0x00,0x00, 0x00,0x00,0xb4,0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0c,0x1d,0x1d,0x1e,0x3e,0xae, 0xaf,0xb7,0xff,0x8b,0x8c,0x91,0xdf,0x09,0x09,0x09,0x3d,0x82,0x00,0x00,0x00, 0x19,0x14,0x04,0x04,0x04,0x20,0xaa,0xab,0xb0,0xf4,0x51,0x52,0x52,0xdb,0x2f, 0x2f,0x30,0xaf,0x9b,0x9d,0xa4,0xff,0xb7,0xba,0xc3,0xff,0xc8,0xcb,0xd2,0xff, 0xff,0xff,0xff,0xff,0xcc,0xcf,0xd5,0xff,0x7c,0x7e,0x85,0xff,0x81,0x83,0x88, 0xff,0x40,0x40,0x43,0xb5,0xcf,0xd1,0xd7,0xff,0x9d,0x9e,0xa3,0xff,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x87,0x00,0x00,0x00,0x01,0x11,0x52,0x53, 0x56,0x00,0x1b,0x1c,0x1d,0x00,0x0c,0x0c,0x0d,0x00,0x00,0x00,0x00,0x00,0x11, 0x11,0x12,0x00,0x4d,0x4e,0x52,0x00,0x23,0x23,0x24,0x00,0x00,0x00,0x00,0x00, 0x0c,0x0c,0x0d,0x00,0x1b,0x1a,0x1d,0x00,0x44,0x46,0x48,0x00,0x0d,0x0c,0x0c, 0x00,0x01,0x01,0x01,0x00,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x23,0x23, 0x25,0x00,0x21,0x21,0x24,0x00,0x88,0x00,0x00,0x00,0x00,0xb4,0xff,0xff,0xff, 0x00,0x87,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x07, 0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x14,0x22,0x24,0x25,0x6a,0xd3,0xd5,0xdb, 0xff,0x8e,0x91,0x95,0xec,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x21,0x00,0x00, 0x00,0x23,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x3d,0x95, 0x98,0x9d,0xff,0x9d,0xa0,0xa6,0xff,0xc1,0xc4,0xce,0xff,0xea,0xec,0xf0,0xff, 0xf9,0xfb,0xfe,0xff,0x9f,0xa1,0xa7,0xff,0x7f,0x80,0x86,0xff,0x76,0x78,0x7e, 0xff,0xbb,0xbe,0xc2,0xff,0x10,0x0f,0x11,0x6c,0x00,0x00,0x00,0x2e,0x00,0x00, 0x00,0x23,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x08,0x85,0x00,0x00,0x00,0x07,0x04,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x02, 0x82,0x00,0x00,0x00,0x01,0x0b,0x23,0x23,0x24,0x00,0x00,0x00,0x00,0x00,0x0c, 0x0c,0x0d,0x00,0x1b,0x1a,0x1d,0x00,0x44,0x46,0x48,0x00,0x0d,0x0c,0x0c,0x00, 0x01,0x01,0x01,0x00,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x23,0x23,0x25, 0x00,0x21,0x21,0x24,0x00,0x88,0x00,0x00,0x00,0x00,0xb4,0xff,0xff,0xff,0x00, 0x87,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x1d,0x35,0x36,0x37,0x79, 0xce,0xcf,0xd4,0xff,0x84,0x86,0x8a,0xdf,0x0e,0x0f,0x0e,0x50,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x41,0x36,0x37, 0x3a,0xa4,0x97,0x9c,0xa2,0xff,0xb4,0xb7,0xbf,0xff,0xc5,0xc8,0xd0,0xff,0xff, 0xff,0xff,0xff,0xd0,0xd2,0xd8,0xff,0x85,0x87,0x8d,0xff,0x7d,0x7f,0x83,0xff, 0x3f,0x3f,0x42,0xd1,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x38,0x00,0x00,0x00, 0x2b,0x00,0x00,0x00,0x20,0x06,0x06,0x06,0x28,0x00,0x00,0x00,0x14,0x13,0x13, 0x14,0x3a,0x22,0x23,0x24,0x5a,0x0f,0x10,0x11,0x43,0x10,0x10,0x11,0x37,0x16, 0x15,0x17,0x47,0x09,0x09,0x09,0x33,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0f, 0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x09,0x00,0x00,0x00, 0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x01,0x09, 0x0c,0x0c,0x0d,0x00,0x1b,0x1a,0x1d,0x00,0x44,0x46,0x48,0x00,0x0d,0x0c,0x0c, 0x00,0x01,0x01,0x01,0x00,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x23,0x23, 0x25,0x00,0x21,0x21,0x24,0x00,0x88,0x00,0x00,0x00,0x00,0xb4,0xff,0xff,0xff, 0x00,0x87,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x1a,0x00,0x00,0x00, 0x22,0x24,0x25,0x26,0x70,0xb9,0xbb,0xc1,0xff,0xc6,0xc8,0xcd,0xff,0x78,0x79, 0x7c,0xcb,0x28,0x29,0x2a,0x83,0x05,0x05,0x06,0x4f,0x00,0x00,0x00,0x40,0x00, 0x00,0x00,0x4c,0x8f,0x92,0x98,0xff,0x9c,0x9f,0xa6,0xff,0xc3,0xc5,0xd0,0xff, 0xee,0xf0,0xf5,0xff,0xfe,0xff,0xff,0xff,0x7c,0x7e,0x84,0xff,0x62,0x62,0x65, 0xff,0x0c,0x0c,0x0d,0x87,0x00,0x00,0x00,0x4f,0x1b,0x1b,0x1d,0x82,0x3d,0x3e, 0x41,0xab,0x7e,0x80,0x86,0xff,0x77,0x79,0x80,0xf3,0x95,0x98,0x9f,0xff,0x9d, 0x9e,0xa6,0xff,0x8f,0x93,0x99,0xff,0x9f,0xa1,0xaa,0xff,0xa1,0xa3,0xa9,0xff, 0x90,0x93,0x99,0xff,0x74,0x76,0x7d,0xfc,0x6f,0x72,0x77,0xfb,0x63,0x66,0x6b, 0xee,0x47,0x48,0x4b,0xc0,0x0e,0x0f,0x10,0x4b,0x02,0x02,0x03,0x23,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x01,0x06,0x0d,0x0c, 0x0c,0x00,0x01,0x01,0x01,0x00,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x23, 0x23,0x25,0x00,0x21,0x21,0x24,0x00,0x88,0x00,0x00,0x00,0x00,0xb4,0xff,0xff, 0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x15,0x00,0x00, 0x00,0x1d,0x00,0x00,0x00,0x24,0x06,0x06,0x07,0x4c,0x5c,0x5d,0x62,0xbd,0xb5, 0xb7,0xbe,0xfd,0xd6,0xd8,0xde,0xff,0xbd,0xbe,0xc4,0xff,0xaf,0xb2,0xb7,0xff, 0xc1,0xc2,0xc6,0xfa,0xba,0xbd,0xc1,0xff,0x95,0x98,0x9f,0xff,0xb7,0xba,0xc2, 0xff,0xa0,0xa2,0xaa,0xff,0x80,0x82,0x86,0xff,0x59,0x5b,0x5e,0xff,0x5c,0x5d, 0x60,0xfe,0x4f,0x51,0x55,0xd1,0xa0,0xa2,0xa8,0xff,0xb5,0xb8,0xbe,0xff,0xde, 0xe0,0xe5,0xff,0xef,0xf0,0xf3,0xff,0x88,0xff,0xff,0xff,0xff,0x13,0xf1,0xf1, 0xf4,0xff,0xc8,0xca,0xd1,0xff,0xa9,0xab,0xb2,0xff,0x89,0x8c,0x93,0xff,0x69, 0x6b,0x6f,0xf6,0x32,0x34,0x35,0x9d,0x06,0x06,0x06,0x3a,0x00,0x00,0x00,0x13, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x11,0x11, 0x11,0x00,0x00,0x00,0x00,0x00,0x23,0x23,0x25,0x00,0x21,0x21,0x24,0x00,0x8a, 0x00,0x00,0x00,0x00,0x9e,0xff,0xff,0xff,0x00,0x14,0x00,0x00,0x00,0x01,0x40, 0x40,0x40,0x02,0xc9,0xc8,0xc9,0xa4,0xbc,0xba,0xbb,0xc8,0xbf,0xbd,0xbe,0x76, 0xc3,0xc2,0xc4,0x2d,0x00,0x00,0x00,0x01,0xda,0xd8,0xdb,0x00,0xd9,0xd8,0xda, 0x00,0xe0,0xdf,0xe1,0x00,0xe8,0xe8,0xe9,0x00,0xe3,0xe2,0xe4,0x00,0xe5,0xe4, 0xe6,0x00,0xea,0xea,0xec,0x00,0xef,0xee,0xef,0x00,0xea,0xe9,0xeb,0x00,0xec, 0xec,0xed,0x00,0xef,0xee,0xf0,0x00,0xf0,0xf0,0xf0,0x00,0xeb,0xeb,0xec,0x00, 0x88,0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x1d, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x29,0x02,0x03,0x03,0x47,0x16,0x16,0x17, 0x73,0x3c,0x3d,0x3f,0x9d,0x5f,0x60,0x64,0xc3,0x55,0x56,0x5b,0xc9,0x49,0x4b, 0x4e,0xd3,0x7d,0x7f,0x84,0xff,0x62,0x63,0x67,0xff,0x52,0x55,0x58,0xff,0x6c, 0x6c,0x71,0xff,0x86,0x88,0x8e,0xff,0xbf,0xc1,0xc8,0xff,0xef,0xf0,0xf6,0xff, 0x83,0xff,0xff,0xff,0xff,0x17,0xef,0xf1,0xf4,0xff,0xcf,0xd1,0xd7,0xff,0xc6, 0xc9,0xd0,0xff,0xb3,0xb5,0xbe,0xff,0xb3,0xb5,0xbb,0xff,0xb8,0xba,0xc2,0xff, 0xb4,0xb7,0xc0,0xff,0xbd,0xbf,0xc7,0xff,0xd3,0xd7,0xdd,0xff,0xe7,0xe9,0xed, 0xff,0xfb,0xfb,0xfd,0xff,0xff,0xff,0xff,0xff,0xf4,0xf5,0xfa,0xff,0xcd,0xcf, 0xd5,0xff,0x9a,0x9d,0xa5,0xff,0x6c,0x6e,0x75,0xfc,0x3f,0x40,0x42,0xbf,0x17, 0x16,0x17,0x5c,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x09, 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x01,0x03,0x00, 0x00,0x00,0x00,0x23,0x23,0x25,0x00,0x21,0x21,0x24,0x00,0x8a,0x00,0x00,0x00, 0x00,0x9e,0xff,0xff,0xff,0x00,0x14,0x2b,0x2b,0x2b,0x03,0xd8,0xd8,0xd8,0x62, 0xb6,0xb4,0xb5,0xff,0xc6,0xc4,0xc5,0xff,0xc5,0xc4,0xc5,0xff,0xc7,0xc5,0xc7, 0xf9,0xcb,0xca,0xcc,0xc2,0xcd,0xcb,0xcd,0x75,0xcc,0xcb,0xcd,0x2d,0x00,0x00, 0x00,0x01,0xea,0xea,0xeb,0x00,0xe4,0xe3,0xe5,0x00,0xe5,0xe4,0xe6,0x00,0xea, 0xea,0xec,0x00,0xef,0xee,0xef,0x00,0xea,0xe9,0xeb,0x00,0xec,0xec,0xed,0x00, 0xef,0xee,0xf0,0x00,0xf0,0xf0,0xf0,0x00,0xeb,0xeb,0xec,0x00,0x88,0x00,0x00, 0x00,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x15,0x00,0x00,0x00, 0x1b,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x2e,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x56,0x08,0x08,0x08,0x7f,0x83,0x84,0x8b,0xff,0xc5,0xc7,0xce,0xff, 0x83,0xff,0xff,0xff,0xff,0x1f,0xe0,0xe2,0xe7,0xff,0xaa,0xad,0xb4,0xff,0x96, 0x98,0x9f,0xff,0x86,0x8a,0x91,0xff,0x8e,0x91,0x97,0xff,0x8d,0x90,0x96,0xff, 0x8c,0x8e,0x95,0xff,0x8a,0x8c,0x95,0xff,0x92,0x96,0x9c,0xff,0x95,0x98,0x9f, 0xff,0x91,0x93,0x99,0xff,0x93,0x97,0x9e,0xff,0x9a,0x9d,0xa3,0xff,0xa3,0xa6, 0xae,0xff,0xb2,0xb4,0xbc,0xff,0xca,0xce,0xd5,0xff,0xf3,0xf5,0xf9,0xff,0xff, 0xff,0xff,0xff,0xdc,0xde,0xe6,0xff,0x97,0x99,0xa2,0xff,0x6f,0x72,0x77,0xff, 0x4c,0x4e,0x51,0xc3,0x02,0x01,0x02,0x2d,0x00,0x00,0x00,0x13,0x00,0x00,0x00, 0x0d,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x01,0x23,0x23,0x25,0x00,0x21,0x21,0x24,0x00,0x8a,0x00,0x00,0x00,0x00, 0x9d,0xff,0xff,0xff,0x00,0x05,0x55,0x55,0x55,0x02,0xbe,0xbe,0xbe,0x20,0xbc, 0xbb,0xbb,0xe8,0xc8,0xc5,0xc7,0xff,0xc9,0xc7,0xc8,0xff,0x82,0xcb,0xc9,0xca, 0xff,0x0e,0xca,0xc8,0xc9,0xff,0xc8,0xc6,0xc7,0xff,0xc8,0xc7,0xc8,0xf8,0xcc, 0xcb,0xcc,0xc3,0xd6,0xd6,0xd7,0x72,0xd3,0xd3,0xd5,0x2b,0x00,0x00,0x00,0x01, 0xec,0xec,0xee,0x00,0xf0,0xef,0xf0,0x00,0xea,0xe9,0xeb,0x00,0xec,0xec,0xed, 0x00,0xef,0xee,0xf0,0x00,0xf0,0xf0,0xf0,0x00,0xeb,0xeb,0xec,0x00,0x89,0x00, 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x12,0x00,0x00, 0x00,0x18,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x41,0x3a,0x3b,0x3d,0xa8, 0xc1,0xc4,0xcd,0xff,0xf8,0xf9,0xfd,0xff,0xff,0xff,0xff,0xff,0xfa,0xfb,0xfd, 0xff,0xc2,0xc4,0xcd,0xff,0x8c,0x8f,0x95,0xff,0x78,0x7a,0x82,0xff,0x79,0x7b, 0x82,0xff,0x85,0x87,0x8d,0xff,0x68,0x6b,0x70,0xff,0x7c,0x7e,0x84,0xff,0x7e, 0x7f,0x83,0xff,0x7a,0x7b,0x7e,0xff,0x89,0x89,0x8c,0xff,0x8d,0x8f,0x92,0xff, 0x80,0x82,0x86,0xff,0x80,0x81,0x85,0xff,0x8a,0x8c,0x90,0xff,0x8b,0x8e,0x93, 0xff,0x8c,0x8f,0x98,0xff,0x92,0x94,0x9c,0xff,0x9a,0x9c,0xa5,0xff,0xa2,0xa5, 0xab,0xff,0xbc,0xc1,0xc8,0xff,0xdc,0xdf,0xe7,0xff,0xf1,0xf3,0xfd,0xff,0xcb, 0xcd,0xd6,0xff,0x99,0x9c,0xa2,0xff,0x79,0x7b,0x7f,0xff,0x0c,0x0c,0x0d,0x54, 0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x09,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x21,0x21,0x24,0x00,0x8a,0x00, 0x00,0x00,0x00,0x9c,0xff,0xff,0xff,0x00,0x05,0x00,0x00,0x00,0x01,0x3b,0x3b, 0x3b,0x07,0xca,0xca,0xca,0xaa,0xbf,0xbd,0xbe,0xff,0xcc,0xca,0xcb,0xff,0x83, 0xcb,0xc9,0xcb,0xff,0x82,0xcb,0xc9,0xca,0xff,0x0c,0xca,0xc8,0xca,0xff,0xc8, 0xc6,0xc7,0xff,0xc6,0xc5,0xc6,0xff,0xc7,0xc6,0xc7,0xf8,0xce,0xcc,0xce,0xc4, 0xd7,0xd6,0xd8,0x73,0xde,0xdd,0xde,0x2a,0x00,0x00,0x00,0x01,0xee,0xee,0xef, 0x00,0xf0,0xef,0xf1,0x00,0xf0,0xf0,0xf0,0x00,0xeb,0xeb,0xec,0x00,0x8a,0x00, 0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0f,0x00,0x00, 0x00,0x13,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x2e,0x6c,0x6d,0x72,0xd5,0xce,0xd1,0xda,0xff,0x82,0xff,0xff,0xff, 0xff,0x23,0xce,0xd1,0xd9,0xff,0x88,0x8a,0x92,0xff,0x68,0x6a,0x6f,0xff,0x61, 0x63,0x69,0xff,0x6f,0x71,0x75,0xff,0x73,0x74,0x77,0xff,0x96,0x99,0x99,0xff, 0xd0,0xcf,0xcf,0xff,0xeb,0xeb,0xea,0xff,0xfc,0xfc,0xfc,0xff,0xea,0xea,0xe9, 0xff,0xfa,0xfb,0xfb,0xff,0xf8,0xf8,0xf8,0xff,0xeb,0xeb,0xea,0xff,0xfa,0xfa, 0xfa,0xff,0xff,0xfe,0xfe,0xff,0xe0,0xe0,0xe0,0xff,0xce,0xce,0xcf,0xff,0x9e, 0x9f,0xa1,0xff,0x82,0x83,0x89,0xff,0x87,0x8a,0x91,0xff,0x9e,0xa1,0xa9,0xff, 0xa7,0xab,0xb2,0xff,0xbc,0xbf,0xc7,0xff,0xe9,0xec,0xf5,0xff,0xdf,0xe1,0xe9, 0xff,0xa2,0xa4,0xaa,0xff,0x6d,0x6f,0x73,0xff,0x33,0x36,0x38,0x9d,0x02,0x02, 0x02,0x24,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x8a,0x00,0x00,0x00,0x00,0x9c,0xff,0xff, 0xff,0x00,0x0b,0x24,0x24,0x24,0x04,0xd3,0xd3,0xd3,0x57,0xb6,0xb5,0xb5,0xff, 0xca,0xc8,0xca,0xff,0xcb,0xc9,0xcb,0xff,0xcb,0xca,0xcb,0xff,0xcb,0xc9,0xcb, 0xff,0xcc,0xca,0xcb,0xff,0xcb,0xca,0xcb,0xff,0xcc,0xca,0xcc,0xff,0xca,0xc8, 0xca,0xff,0x83,0xc9,0xc7,0xc8,0xff,0x08,0xc8,0xc6,0xc7,0xff,0xc7,0xc5,0xc7, 0xff,0xc9,0xc8,0xc9,0xf8,0xce,0xcd,0xcf,0xc2,0xd9,0xd8,0xda,0x71,0xe3,0xe2, 0xe4,0x29,0x00,0x00,0x00,0x01,0xed,0xed,0xee,0x00,0x8b,0x00,0x00,0x00,0x00, 0x82,0x00,0x00,0x00,0x01,0x30,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x18, 0x08,0x07,0x08,0x32,0xa2,0xa4,0xaa,0xff,0xe8,0xeb,0xf1,0xff,0xff,0xff,0xff, 0xff,0xfa,0xfb,0xfc,0xff,0x9b,0x9f,0xa5,0xff,0x68,0x6a,0x70,0xff,0x57,0x59, 0x5d,0xff,0x5e,0x60,0x66,0xff,0x92,0x93,0x94,0xff,0xd2,0xd2,0xd2,0xff,0xec, 0xed,0xed,0xff,0xe8,0xe8,0xe8,0xff,0xbe,0xbe,0xbe,0xff,0xaf,0xb0,0xb0,0xff, 0x97,0x96,0x97,0xff,0xa8,0xa6,0xa6,0xff,0x95,0x96,0x96,0xff,0x99,0x9a,0x9a, 0xff,0x71,0x72,0x72,0xff,0xa7,0xa8,0xa8,0xff,0xa9,0xa9,0xa8,0xff,0xb2,0xb3, 0xb2,0xff,0xcd,0xcd,0xcc,0xff,0xeb,0xeb,0xeb,0xff,0xfd,0xfe,0xfd,0xff,0xd4, 0xd5,0xd5,0xff,0x9a,0x9c,0xa0,0xff,0xa0,0xa1,0xaa,0xff,0xaf,0xb2,0xba,0xff, 0xb7,0xba,0xc2,0xff,0xd6,0xd9,0xe1,0xff,0xe3,0xe6,0xef,0xff,0xaa,0xad,0xb2, 0xff,0x7d,0x80,0x84,0xff,0x49,0x4b,0x4d,0xbc,0x00,0x00,0x00,0x1f,0x00,0x00, 0x00,0x14,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,0x89,0x00,0x00,0x00,0x00,0x9b,0xff,0xff,0xff,0x00,0x0e,0x55, 0x55,0x55,0x02,0xac,0xac,0xac,0x19,0xbf,0xbf,0xbf,0xe1,0xc6,0xc3,0xc5,0xff, 0xca,0xc8,0xca,0xff,0xcb,0xc9,0xca,0xff,0xca,0xc9,0xca,0xff,0xcc,0xca,0xcb, 0xff,0xcf,0xce,0xcf,0xff,0xd0,0xcf,0xd0,0xff,0xcd,0xcb,0xcd,0xff,0xca,0xc8, 0xca,0xff,0xca,0xc8,0xc9,0xff,0xc9,0xc8,0xc9,0xff,0x82,0xc9,0xc7,0xc8,0xff, 0x09,0xca,0xc8,0xca,0xff,0xca,0xc8,0xc9,0xff,0xc8,0xc6,0xc7,0xff,0xc7,0xc5, 0xc7,0xff,0xc9,0xc7,0xc8,0xf7,0xd2,0xd0,0xd1,0xc2,0xd7,0xd6,0xd7,0x73,0xe2, 0xe2,0xe3,0x28,0x00,0x00,0x00,0x01,0x8a,0x00,0x00,0x00,0x00,0x32,0x06,0x06, 0x07,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x16,0x94,0x97,0x9e,0xf5, 0xef,0xf0,0xf7,0xff,0xff,0xff,0xff,0xff,0xde,0xe0,0xe7,0xff,0x81,0x83,0x8b, 0xff,0x5d,0x5f,0x64,0xff,0x59,0x5b,0x5e,0xff,0x8a,0x8a,0x8d,0xff,0xdc,0xdd, 0xdd,0xff,0xf3,0xf3,0xf3,0xff,0xa9,0xa8,0xa9,0xff,0xa3,0xa5,0xa5,0xff,0x8f, 0x91,0x91,0xff,0xbb,0xbb,0xbb,0xff,0xc1,0xc1,0xc2,0xff,0xd7,0xd8,0xd8,0xff, 0xe7,0xe8,0xe8,0xff,0xe9,0xe9,0xe9,0xff,0xf6,0xf6,0xf6,0xff,0xac,0xab,0xac, 0xff,0xf3,0xf3,0xf3,0xff,0xd7,0xd8,0xd8,0xff,0xd2,0xd3,0xd3,0xff,0xc0,0xc0, 0xc0,0xff,0xba,0xbc,0xbb,0xff,0xc0,0xbf,0xbf,0xff,0xe3,0xe3,0xe3,0xff,0xfe, 0xfe,0xfe,0xff,0xc3,0xc3,0xc7,0xff,0xab,0xad,0xb2,0xff,0xa9,0xab,0xb4,0xff, 0xae,0xb0,0xb9,0xff,0xc3,0xc8,0xce,0xff,0xe1,0xe4,0xed,0xff,0xb7,0xba,0xc2, 0xff,0x8c,0x8d,0x94,0xff,0x32,0x32,0x34,0xa4,0x04,0x04,0x04,0x32,0x00,0x00, 0x00,0x15,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,0x88,0x00,0x00,0x00,0x00,0x9a,0xff,0xff,0xff,0x00,0x05,0x00, 0x00,0x00,0x01,0x40,0x40,0x40,0x06,0xcf,0xd0,0xd0,0x9e,0xbc,0xba,0xbb,0xff, 0xcc,0xca,0xcb,0xff,0x82,0xca,0xc9,0xca,0xff,0x08,0xcc,0xca,0xcc,0xff,0xcf, 0xcd,0xce,0xff,0xb5,0xb3,0xb4,0xff,0x9f,0x9e,0x9e,0xff,0xb3,0xb1,0xb3,0xff, 0xbc,0xba,0xbb,0xff,0xc1,0xbf,0xc0,0xff,0xc8,0xc6,0xc7,0xff,0x82,0xca,0xc8, 0xc9,0xff,0x02,0xc9,0xc7,0xc9,0xff,0xca,0xc8,0xca,0xff,0x82,0xca,0xc9,0xca, 0xff,0x08,0xca,0xc8,0xc9,0xff,0xc8,0xc6,0xc8,0xff,0xc7,0xc5,0xc7,0xff,0xc9, 0xc8,0xc9,0xf6,0xd1,0xd0,0xd1,0xc2,0xdb,0xda,0xdb,0x75,0xdb,0xdb,0xdc,0x2a, 0x00,0x00,0x00,0x01,0x87,0x00,0x00,0x00,0x00,0x14,0x06,0x06,0x07,0x00,0x1b, 0x1c,0x1d,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07, 0x00,0x00,0x00,0x0f,0x91,0x94,0x9a,0xf6,0xef,0xf2,0xf9,0xff,0xff,0xff,0xff, 0xff,0xd0,0xd2,0xd9,0xff,0x70,0x73,0x78,0xff,0x61,0x63,0x67,0xff,0x54,0x55, 0x5a,0xff,0xb3,0xb1,0xb3,0xff,0xee,0xee,0xee,0xff,0xa6,0xa6,0xa6,0xff,0x7f, 0x7f,0x7f,0xff,0x88,0x89,0x89,0xff,0xd1,0xd5,0xd6,0xff,0xee,0xff,0xff,0xff, 0x86,0xff,0xff,0xff,0xff,0x01,0xc1,0xc1,0xc2,0xff,0x83,0xff,0xff,0xff,0xff, 0x15,0xf7,0xf8,0xf8,0xff,0xf4,0xf5,0xf4,0xff,0xdb,0xdb,0xdc,0xff,0xc4,0xc5, 0xc5,0xff,0xc0,0xc0,0xc0,0xff,0xf8,0xf9,0xf9,0xff,0xfa,0xfb,0xfb,0xff,0xca, 0xca,0xcd,0xff,0x98,0x9a,0xa3,0xff,0xb2,0xb5,0xbd,0xff,0xc6,0xcb,0xd2,0xff, 0xdf,0xe1,0xea,0xff,0xbb,0xbd,0xc4,0xff,0x7c,0x7e,0x81,0xff,0x50,0x50,0x54, 0xc7,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x0b,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x87,0x00,0x00,0x00,0x00, 0x9a,0xff,0xff,0xff,0x00,0x03,0x2b,0x2b,0x2b,0x03,0xd5,0xd5,0xd5,0x4c,0xb5, 0xb5,0xb6,0xfd,0x83,0xca,0xc9,0xca,0xff,0x1a,0xcd,0xca,0xcc,0xff,0xc6,0xc5, 0xc6,0xff,0x82,0x81,0x82,0xff,0x4f,0x4f,0x4f,0xff,0x93,0x92,0x93,0xff,0xbd, 0xbc,0xbe,0xff,0xb6,0xb6,0xb7,0xff,0xaf,0xaf,0xb0,0xff,0xb2,0xb1,0xb3,0xff, 0xb9,0xb8,0xb9,0xff,0xc3,0xc1,0xc2,0xff,0xc9,0xc8,0xc8,0xff,0xcb,0xc9,0xc9, 0xff,0xcb,0xc9,0xca,0xff,0xca,0xc9,0xca,0xff,0xca,0xc8,0xca,0xff,0xcb,0xc9, 0xca,0xff,0xcb,0xca,0xcb,0xff,0xcb,0xc9,0xcb,0xff,0xca,0xc8,0xc9,0xff,0xc7, 0xc6,0xc7,0xff,0xc8,0xc6,0xc7,0xf7,0xd0,0xcf,0xd0,0xc2,0xd7,0xd7,0xd7,0x74, 0xd7,0xd7,0xd7,0x2c,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x01,0x82,0x00, 0x00,0x00,0x00,0x15,0x05,0x05,0x06,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x7c,0x7d,0x83,0xdb,0xdf,0xe2, 0xeb,0xff,0xff,0xff,0xff,0xff,0xd5,0xd7,0xdd,0xff,0x75,0x78,0x7e,0xff,0x62, 0x65,0x69,0xff,0x6b,0x6d,0x70,0xff,0xd6,0xd7,0xd6,0xff,0xff,0xff,0xff,0xff, 0xa2,0xa4,0xa2,0xff,0xaf,0xb1,0xb1,0xff,0xd7,0xdb,0xda,0xff,0x5a,0x68,0x68, 0xff,0xff,0xca,0xc8,0xff,0xff,0x82,0x7d,0xff,0xfe,0xb9,0xb8,0xff,0x84,0xff, 0xff,0xff,0xff,0x03,0xa4,0xa4,0xa4,0xff,0x7c,0x7d,0x7c,0xff,0xda,0xda,0xda, 0xff,0x85,0xff,0xff,0xff,0xff,0x13,0xf8,0xfa,0xfa,0xff,0xe7,0xe7,0xe7,0xff, 0xc7,0xc7,0xc7,0xff,0xd9,0xd9,0xda,0xff,0xff,0xff,0xff,0xff,0xcb,0xca,0xcd, 0xff,0xa8,0xad,0xb3,0xff,0xb9,0xbb,0xc5,0xff,0xc4,0xc7,0xce,0xff,0xdd,0xe0, 0xe8,0xff,0xb0,0xb2,0xbb,0xff,0x8f,0x92,0x99,0xff,0x1f,0x20,0x20,0x83,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x86,0x00,0x00,0x00,0x00,0x99,0xff, 0xff,0xff,0x00,0x24,0x55,0x55,0x55,0x02,0x99,0x99,0x99,0x14,0xc1,0xc0,0xc1, 0xda,0xc3,0xc1,0xc3,0xff,0xcb,0xc9,0xcb,0xff,0xca,0xc9,0xca,0xff,0xcc,0xca, 0xcb,0xff,0xcb,0xc9,0xcb,0xff,0x93,0x92,0x94,0xff,0x6f,0x70,0x71,0xff,0xa1, 0xa1,0xa3,0xff,0xd5,0xd4,0xd5,0xff,0xce,0xcc,0xce,0xff,0xcc,0xca,0xcc,0xff, 0xc8,0xc7,0xc8,0xff,0xc0,0xbf,0xc0,0xff,0xb7,0xb6,0xb8,0xff,0xb1,0xb1,0xb2, 0xff,0xb3,0xb2,0xb3,0xff,0xba,0xb9,0xba,0xff,0xc5,0xc3,0xc4,0xff,0xcb,0xc9, 0xca,0xff,0xcc,0xca,0xcb,0xff,0xcb,0xca,0xcb,0xff,0xcb,0xc9,0xca,0xff,0xcc, 0xca,0xcb,0xff,0xcb,0xc9,0xca,0xff,0xca,0xc8,0xca,0xff,0xc9,0xc7,0xc8,0xff, 0xc5,0xc3,0xc4,0xff,0xc3,0xc1,0xc2,0xff,0xc4,0xc2,0xc3,0xf8,0xca,0xc8,0xc9, 0xc2,0xd3,0xd2,0xd2,0x77,0xcb,0xcb,0xcb,0x2c,0x00,0x00,0x00,0x04,0x83,0x00, 0x00,0x00,0x02,0x13,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0b,0x3d,0x3e,0x41, 0x87,0xd0,0xd5,0xde,0xff,0xff,0xff,0xff,0xff,0xe5,0xe6,0xec,0xff,0x78,0x7b, 0x81,0xff,0x62,0x64,0x69,0xff,0x69,0x6a,0x6d,0xff,0xd6,0xd7,0xd7,0xff,0xd8, 0xd8,0xd9,0xff,0x87,0x87,0x87,0xff,0xbd,0xbe,0xbf,0xff,0xef,0xf3,0xf2,0xff, 0xff,0xc4,0xc1,0xff,0xc6,0x85,0x85,0xff,0xc6,0x8c,0x8d,0xff,0xff,0xef,0xef, 0xff,0xfd,0x8e,0x87,0xff,0x84,0xff,0xff,0xff,0xff,0x04,0xac,0xad,0xad,0xff, 0xbe,0xbd,0xbd,0xff,0x48,0x48,0x48,0xff,0xf6,0xf6,0xf6,0xff,0x85,0xff,0xff, 0xff,0xff,0x12,0xfe,0xfe,0xfe,0xff,0xa7,0xa7,0xa8,0xff,0xde,0xdf,0xdf,0xff, 0xd0,0xd1,0xd0,0xff,0xf3,0xf3,0xf3,0xff,0xe0,0xe2,0xe3,0xff,0xa7,0xaa,0xb1, 0xff,0xaf,0xb3,0xbc,0xff,0xcf,0xd2,0xdb,0xff,0xd9,0xdb,0xe5,0xff,0x9f,0xa2, 0xa8,0xff,0x71,0x72,0x76,0xfd,0x1d,0x1c,0x1d,0x5e,0x00,0x00,0x00,0x1e,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01, 0x86,0x00,0x00,0x00,0x00,0x98,0xff,0xff,0xff,0x00,0x19,0x00,0x00,0x00,0x01, 0x2e,0x2e,0x2e,0x06,0xd1,0xd1,0xd1,0x90,0xb5,0xb3,0xb4,0xff,0xcc,0xcb,0xcc, 0xff,0xcb,0xc9,0xca,0xff,0xca,0xc8,0xca,0xff,0xcd,0xcb,0xcd,0xff,0xab,0xaa, 0xab,0xff,0x80,0x80,0x82,0xff,0x9d,0x9d,0x9e,0xff,0xcd,0xcc,0xcd,0xff,0xcc, 0xcb,0xcc,0xff,0xcc,0xca,0xcb,0xff,0xcb,0xca,0xcb,0xff,0xcc,0xca,0xcb,0xff, 0xcc,0xca,0xcc,0xff,0xcc,0xc9,0xcb,0xff,0xc7,0xc6,0xc7,0xff,0xbf,0xbe,0xbf, 0xff,0xb6,0xb6,0xb7,0xff,0xb2,0xb0,0xb2,0xff,0xb4,0xb3,0xb4,0xff,0xbc,0xbb, 0xbb,0xff,0xc5,0xc3,0xc4,0xff,0x82,0xcb,0xc9,0xca,0xff,0x22,0xca,0xc8,0xc9, 0xff,0xc8,0xc6,0xc7,0xff,0xc7,0xc5,0xc6,0xff,0xc6,0xc4,0xc5,0xff,0xbc,0xbb, 0xbd,0xff,0x84,0x84,0x85,0xff,0xae,0xac,0xad,0xff,0xb8,0xb6,0xb6,0xff,0xba, 0xb8,0xb9,0xf7,0xc5,0xc3,0xc4,0xc2,0xcb,0xca,0xcb,0x76,0xc6,0xc5,0xc6,0x2e, 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x09,0x05,0x05,0x05,0x1c,0xc6,0xca,0xd1, 0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0x83,0x86,0x8d,0xff,0x6a,0x6c, 0x71,0xff,0x5c,0x5e,0x61,0xff,0xdd,0xdd,0xdd,0xff,0xeb,0xec,0xeb,0xff,0xa5, 0xa6,0xa6,0xff,0xcb,0xcb,0xcb,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xa9,0xa8,0xff,0xff,0x95,0x94,0xff,0x82,0x58,0x59,0xff,0xff,0xc9,0xc8, 0xff,0xff,0x79,0x76,0xff,0xff,0xff,0xfd,0xff,0xfd,0xfe,0xfe,0xff,0x83,0xff, 0xff,0xff,0xff,0x03,0xa7,0xa7,0xa7,0xff,0x57,0x58,0x58,0xff,0xfa,0xfa,0xfa, 0xff,0x83,0xff,0xff,0xff,0xff,0x15,0xef,0xef,0xef,0xff,0x5d,0x5c,0x5e,0xff, 0x7e,0x7e,0x7e,0xff,0xff,0xff,0xff,0xff,0xfd,0xfd,0xfe,0xff,0xde,0xdf,0xdf, 0xff,0xce,0xcf,0xcf,0xff,0xff,0xff,0xfe,0xff,0xdc,0xdd,0xdd,0xff,0x9b,0x9e, 0xa6,0xff,0xc3,0xc6,0xd0,0xff,0xd2,0xd4,0xde,0xff,0xc9,0xcd,0xd4,0xff,0x8e, 0x90,0x96,0xff,0x48,0x48,0x4c,0xd1,0x0a,0x0a,0x0b,0x2f,0x00,0x00,0x00,0x1a, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x01,0x85,0x00,0x00,0x00,0x00,0x98,0xff,0xff,0xff,0x00,0x0d,0x33,0x33,0x33, 0x03,0xd1,0xd1,0xd2,0x41,0xb5,0xb4,0xb5,0xf8,0xc9,0xc7,0xc9,0xff,0xcb,0xc9, 0xcb,0xff,0xcb,0xc9,0xca,0xff,0xcd,0xcc,0xcd,0xff,0xbd,0xbb,0xbd,0xff,0x86, 0x86,0x88,0xff,0x8d,0x8e,0x8f,0xff,0xbf,0xbe,0xc0,0xff,0xcf,0xcd,0xce,0xff, 0xcb,0xc9,0xca,0xff,0x82,0xcb,0xc9,0xcb,0xff,0x03,0xcb,0xca,0xcb,0xff,0xcc, 0xc9,0xcb,0xff,0xcc,0xca,0xcb,0xff,0x82,0xcb,0xca,0xcb,0xff,0x1f,0xcb,0xc9, 0xcb,0xff,0xc7,0xc5,0xc7,0xff,0xbe,0xbe,0xbf,0xff,0xb6,0xb5,0xb6,0xff,0xb1, 0xaf,0xb1,0xff,0xb4,0xb3,0xb4,0xff,0xbc,0xbb,0xbb,0xff,0xc4,0xc2,0xc3,0xff, 0xc8,0xc7,0xc7,0xff,0xc6,0xc4,0xc5,0xff,0xc2,0xc0,0xc1,0xff,0x85,0x86,0x87, 0xff,0x80,0x83,0x88,0xff,0x7c,0x7e,0x84,0xff,0x72,0x73,0x77,0xff,0x76,0x75, 0x76,0xff,0x8c,0x8b,0x8c,0xff,0xaf,0xad,0xad,0xff,0xba,0xb9,0xb9,0xf8,0xc1, 0xc0,0xc0,0xc3,0xbf,0xbe,0xbf,0x7d,0x92,0x93,0x98,0xee,0xe6,0xe8,0xf1,0xff, 0xff,0xff,0xff,0xff,0xa3,0xa5,0xac,0xff,0x73,0x75,0x7a,0xff,0x52,0x53,0x58, 0xff,0xce,0xcf,0xcf,0xff,0xed,0xed,0xec,0xff,0xa1,0xa2,0xa3,0xff,0xd6,0xd8, 0xd8,0xff,0x82,0xff,0xff,0xff,0xff,0x0c,0xff,0xf9,0xf8,0xff,0xff,0x72,0x69, 0xff,0xff,0xdb,0xdd,0xff,0xc2,0x53,0x50,0xff,0x9f,0x61,0x5d,0xff,0xd3,0xe0, 0xe3,0xff,0xdb,0xde,0xdd,0xff,0xe4,0xe5,0xe5,0xff,0xdd,0xdd,0xdd,0xff,0xde, 0xde,0xde,0xff,0xff,0xff,0xff,0xff,0xde,0xde,0xde,0xff,0x84,0xff,0xff,0xff, 0xff,0x05,0xcb,0xcb,0xcb,0xff,0x94,0x95,0x95,0xff,0xcd,0xcd,0xcc,0xff,0xc3, 0xc2,0xc3,0xff,0xd5,0xd6,0xd6,0xff,0x82,0xff,0xff,0xff,0xff,0x0f,0xdd,0xdd, 0xdd,0xff,0xd9,0xd9,0xda,0xff,0xf9,0xf8,0xf7,0xff,0xd3,0xd5,0xd7,0xff,0xb0, 0xb3,0xba,0xff,0xc0,0xc5,0xce,0xff,0xdf,0xe2,0xea,0xff,0xae,0xb1,0xb8,0xff, 0x6e,0x70,0x75,0xff,0x42,0x43,0x46,0x9a,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x16,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x85,0x00, 0x00,0x00,0x00,0x95,0xff,0xff,0xff,0x00,0x12,0xcd,0xcb,0xcd,0x00,0xce,0xcb, 0xcc,0x00,0x80,0x80,0x80,0x01,0x90,0x90,0x90,0x10,0xc4,0xc4,0xc4,0xd0,0xbf, 0xbd,0xbf,0xff,0xcc,0xca,0xcc,0xff,0xcb,0xc9,0xca,0xff,0xcd,0xcb,0xcc,0xff, 0xca,0xc8,0xc9,0xff,0x96,0x96,0x97,0xff,0x85,0x85,0x87,0xff,0xaa,0xa9,0xab, 0xff,0xd0,0xcd,0xd0,0xff,0xcb,0xca,0xcb,0xff,0xcb,0xc9,0xcb,0xff,0xcc,0xca, 0xcb,0xff,0xcb,0xc9,0xca,0xff,0x82,0xcb,0xca,0xcb,0xff,0x04,0xcb,0xc9,0xcb, 0xff,0xca,0xc8,0xca,0xff,0xcb,0xc8,0xca,0xff,0xca,0xc8,0xca,0xff,0x82,0xcb, 0xc9,0xca,0xff,0x1b,0xca,0xc9,0xca,0xff,0xc6,0xc5,0xc6,0xff,0xbe,0xbe,0xbe, 0xff,0xb5,0xb4,0xb5,0xff,0xaf,0xaf,0xb0,0xff,0xb1,0xb1,0xb1,0xff,0xb8,0xb6, 0xb7,0xff,0xba,0xb8,0xb9,0xff,0xb5,0xb7,0xbe,0xff,0xb3,0xb5,0xba,0xff,0x85, 0x88,0x8f,0xff,0x7b,0x7e,0x85,0xff,0x7e,0x7f,0x87,0xff,0x77,0x78,0x7c,0xff, 0xaa,0xa8,0xa9,0xff,0xb2,0xb0,0xb1,0xff,0xb0,0xae,0xae,0xff,0x8c,0x8c,0x8c, 0xff,0xcb,0xcd,0xd6,0xff,0xff,0xff,0xff,0xff,0xd3,0xd6,0xde,0xff,0x76,0x79, 0x7f,0xff,0x63,0x65,0x6a,0xff,0xa1,0xa1,0xa1,0xff,0xff,0xff,0xff,0xff,0x8c, 0x8e,0x8f,0xff,0xd0,0xd1,0xd1,0xff,0x84,0xff,0xff,0xff,0xff,0x0a,0xff,0xec, 0xeb,0xff,0xf2,0xa5,0xa4,0xff,0xd9,0xe6,0xe8,0xff,0x64,0x6d,0x6c,0xff,0xff, 0xee,0xf0,0xff,0xff,0xff,0xff,0xff,0xf6,0xf7,0xf7,0xff,0xf0,0xf0,0xf0,0xff, 0xf5,0xf5,0xf5,0xff,0xd9,0xd9,0xda,0xff,0x85,0xff,0xff,0xff,0xff,0x17,0xd7, 0xd7,0xd7,0xff,0x9e,0x9e,0x9e,0xff,0x78,0x7a,0x79,0xff,0x9e,0x9e,0x9e,0xff, 0xd3,0xd3,0xd3,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xff,0xfe,0xfd,0xfe, 0xff,0xe8,0xea,0xea,0xff,0xd8,0xd9,0xd9,0xff,0xff,0xff,0xff,0xff,0xba,0xbd, 0xc0,0xff,0xb9,0xbd,0xc5,0xff,0xd3,0xd6,0xdf,0xff,0xd4,0xd5,0xdf,0xff,0x95, 0x97,0x9d,0xff,0x58,0x59,0x5d,0xf0,0x14,0x14,0x15,0x3c,0x00,0x00,0x00,0x1f, 0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x01,0x84,0x00,0x00,0x00,0x00,0x95,0xff,0xff,0xff,0x00,0x0e,0xce,0xcc,0xcd, 0x00,0x00,0x00,0x00,0x01,0x33,0x33,0x33,0x05,0xd2,0xd2,0xd3,0x85,0xb7,0xb6, 0xb7,0xff,0xcd,0xcb,0xcc,0xff,0xca,0xc8,0xca,0xff,0xcb,0xc9,0xcb,0xff,0xce, 0xcc,0xcd,0xff,0xad,0xad,0xae,0xff,0x86,0x86,0x87,0xff,0x9b,0x9b,0x9d,0xff, 0xc8,0xc6,0xc8,0xff,0xcd,0xcc,0xcd,0xff,0x82,0xcb,0xca,0xcb,0xff,0x06,0xcb, 0xc9,0xcb,0xff,0xcb,0xc9,0xca,0xff,0xcb,0xc8,0xca,0xff,0xcb,0xc9,0xca,0xff, 0xca,0xc9,0xca,0xff,0xca,0xc8,0xca,0xff,0x83,0xca,0xc8,0xc9,0xff,0x03,0xc9, 0xc8,0xc8,0xff,0xc9,0xc7,0xc8,0xff,0xc9,0xc8,0xc9,0xff,0x82,0xca,0xc8,0xc9, 0xff,0x05,0xc4,0xc3,0xc4,0xff,0xba,0xb9,0xba,0xff,0xad,0xac,0xad,0xff,0x99, 0x98,0x9a,0xff,0xf3,0xf7,0xfc,0xff,0x82,0xff,0xff,0xff,0xff,0x0f,0xe0,0xe2, 0xe4,0xff,0xbd,0xbd,0xc3,0xff,0x96,0x99,0xa0,0xff,0x64,0x65,0x68,0xff,0x6f, 0x6e,0x70,0xff,0x9d,0x9c,0x9c,0xff,0x9a,0x9b,0xa2,0xff,0xec,0xee,0xf6,0xff, 0xff,0xff,0xff,0xff,0x96,0x97,0xa0,0xff,0x73,0x74,0x7a,0xff,0x64,0x63,0x68, 0xff,0xff,0xff,0xff,0xff,0x86,0x86,0x86,0xff,0xcf,0xcf,0xcf,0xff,0x83,0xff, 0xff,0xff,0xff,0x01,0xfe,0xfe,0xfd,0xff,0x82,0xff,0xff,0xff,0xff,0x0b,0xda, 0xdd,0xdf,0xff,0xff,0xff,0xff,0xff,0xc0,0x8d,0x92,0xff,0xb3,0x85,0x89,0xff, 0xff,0xff,0xff,0xff,0xe9,0xea,0xe9,0xff,0xed,0xed,0xee,0xff,0xff,0xff,0xff, 0xff,0xef,0xef,0xef,0xff,0xdd,0xdd,0xdd,0xff,0xf2,0xf2,0xf3,0xff,0x84,0xff, 0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xff,0xb6,0xb6,0xb6,0xff,0xfc,0xfc,0xfc, 0xff,0x84,0xff,0xff,0xff,0xff,0x0f,0xf5,0xf5,0xf5,0xff,0xe3,0xe4,0xe3,0xff, 0xea,0xeb,0xea,0xff,0xee,0xee,0xf0,0xff,0xbb,0xbd,0xc4,0xff,0xc0,0xc3,0xcb, 0xff,0xe1,0xe4,0xed,0xff,0xb3,0xb5,0xbe,0xff,0x74,0x77,0x7b,0xff,0x3f,0x3f, 0x42,0xa4,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x84,0x00,0x00,0x00,0x00,0x95,0xff,0xff, 0xff,0x00,0x0f,0xce,0xcb,0xcd,0x00,0x33,0x33,0x33,0x03,0xcf,0xcf,0xcf,0x38, 0xb8,0xb7,0xb8,0xf6,0xc6,0xc5,0xc6,0xff,0xca,0xc8,0xc9,0xff,0xca,0xc9,0xca, 0xff,0xcd,0xcb,0xcc,0xff,0xbe,0xbc,0xbd,0xff,0x8e,0x8f,0x90,0xff,0x95,0x95, 0x96,0xff,0xbc,0xbb,0xbc,0xff,0xd0,0xce,0xcf,0xff,0xcb,0xca,0xcb,0xff,0xcc, 0xca,0xcb,0xff,0x83,0xcb,0xc9,0xca,0xff,0x02,0xcb,0xc8,0xca,0xff,0xcb,0xc9, 0xca,0xff,0x83,0xca,0xc8,0xc9,0xff,0x02,0xca,0xc7,0xc9,0xff,0xc9,0xc7,0xc8, 0xff,0x82,0xc8,0xc6,0xc7,0xff,0x01,0xc8,0xc6,0xc6,0xff,0x82,0xc8,0xc6,0xc7, 0xff,0x19,0xc7,0xc5,0xc6,0xff,0xc4,0xc2,0xc3,0xff,0xbd,0xbb,0xbc,0xff,0x84, 0x85,0x88,0xff,0x9c,0x9e,0xa6,0xff,0xa6,0xa9,0xb1,0xff,0xc8,0xca,0xd1,0xff, 0xf2,0xf3,0xf5,0xff,0xff,0xff,0xff,0xff,0xf4,0xf5,0xf7,0xff,0xb2,0xb4,0xb9, 0xff,0x8b,0x8d,0x94,0xff,0x6b,0x6d,0x72,0xff,0xba,0xbe,0xc7,0xff,0xff,0xff, 0xff,0xff,0xcf,0xd3,0xda,0xff,0x7e,0x82,0x88,0xff,0x59,0x5c,0x60,0xff,0xd4, 0xd5,0xd5,0xff,0xda,0xda,0xda,0xff,0x8c,0x8d,0x8d,0xff,0xe0,0xe0,0xe1,0xff, 0xf9,0xf9,0xf9,0xff,0xeb,0xeb,0xec,0xff,0xa2,0xa2,0xa2,0xff,0x82,0xff,0xff, 0xff,0xff,0x01,0xd2,0xd3,0xd3,0xff,0x82,0xff,0xff,0xff,0xff,0x02,0xff,0xef, 0xf1,0xff,0x6d,0x72,0x71,0xff,0x83,0xff,0xff,0xff,0xff,0x04,0xf2,0xf2,0xf2, 0xff,0xc9,0xca,0xca,0xff,0xfd,0xfd,0xfd,0xff,0xde,0xde,0xde,0xff,0x88,0xff, 0xff,0xff,0xff,0x01,0xfe,0xfe,0xfe,0xff,0x83,0xff,0xff,0xff,0xff,0x0f,0xef, 0xef,0xef,0xff,0xd5,0xd5,0xd5,0xff,0xff,0xff,0xff,0xff,0xd8,0xd8,0xdb,0xff, 0xb1,0xb5,0xbe,0xff,0xd8,0xdb,0xe4,0xff,0xd3,0xd5,0xdd,0xff,0x8f,0x8f,0x97, 0xff,0x58,0x59,0x5c,0xee,0x10,0x10,0x10,0x3e,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x12,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x83, 0x00,0x00,0x00,0x00,0x95,0xff,0xff,0xff,0x00,0x11,0x00,0x00,0x00,0x01,0x78, 0x78,0x78,0x0d,0xc5,0xc5,0xc6,0xc7,0xbc,0xbb,0xbc,0xff,0xcb,0xc9,0xca,0xff, 0xc9,0xc8,0xc9,0xff,0xcc,0xca,0xcb,0xff,0xc9,0xc7,0xc8,0xff,0x9e,0x9d,0x9e, 0xff,0x8c,0x8d,0x8e,0xff,0xa9,0xa9,0xaa,0xff,0xcd,0xcb,0xcd,0xff,0xcc,0xca, 0xcb,0xff,0xca,0xc9,0xca,0xff,0xca,0xc8,0xca,0xff,0xcb,0xc8,0xca,0xff,0xcb, 0xc9,0xcb,0xff,0x82,0xcb,0xc9,0xca,0xff,0x02,0xcb,0xc8,0xca,0xff,0xcb,0xc8, 0xc9,0xff,0x82,0xca,0xc8,0xc9,0xff,0x2b,0xca,0xc7,0xc9,0xff,0xca,0xc8,0xc8, 0xff,0xc8,0xc7,0xc7,0xff,0xc8,0xc6,0xc7,0xff,0xc7,0xc6,0xc6,0xff,0xc7,0xc5, 0xc6,0xff,0xc6,0xc5,0xc5,0xff,0xc5,0xc3,0xc4,0xff,0xc1,0xbf,0xc0,0xff,0xba, 0xb8,0xb8,0xff,0x88,0x8b,0x91,0xff,0x9e,0x9f,0xa5,0xff,0x99,0x9a,0xa0,0xff, 0x94,0x96,0x9d,0xff,0x97,0x9a,0xa0,0xff,0xa7,0xaa,0xb1,0xff,0xbe,0xc0,0xc7, 0xff,0xe6,0xe7,0xeb,0xff,0xff,0xff,0xff,0xff,0xb3,0xb5,0xbb,0xff,0xd5,0xd9, 0xe2,0xff,0xff,0xff,0xff,0xff,0x99,0x9b,0xa4,0xff,0x73,0x76,0x7a,0xff,0x6f, 0x71,0x74,0xff,0xff,0xff,0xff,0xff,0x93,0x93,0x93,0xff,0xde,0xde,0xde,0xff, 0xce,0xce,0xce,0xff,0xc1,0xc2,0xc2,0xff,0xb6,0xb6,0xb6,0xff,0x2e,0x2e,0x2d, 0xff,0xba,0xbb,0xbb,0xff,0xdd,0xdd,0xdd,0xff,0xfb,0xfa,0xfa,0xff,0xd2,0xd2, 0xd2,0xff,0xd7,0xd7,0xd7,0xff,0xff,0xff,0xff,0xff,0xb7,0xb8,0xb8,0xff,0xb2, 0xb3,0xb3,0xff,0xf5,0xf6,0xf8,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfe,0xff, 0x82,0xff,0xff,0xff,0xff,0x05,0xeb,0xeb,0xeb,0xff,0xf2,0xf2,0xf2,0xff,0xff, 0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xfe,0xfe,0xff,0xff,0x82,0xff,0xff,0xff, 0xff,0x01,0xfe,0xff,0xfe,0xff,0x84,0xff,0xff,0xff,0xff,0x10,0xd7,0xd7,0xd7, 0xff,0xff,0xff,0xff,0xff,0xee,0xf0,0xf0,0xff,0xbb,0xbc,0xbb,0xff,0xff,0xff, 0xff,0xff,0xbf,0xc2,0xc6,0xff,0xc6,0xca,0xd3,0xff,0xe7,0xea,0xf2,0xff,0xa6, 0xaa,0xb0,0xff,0x6f,0x71,0x76,0xff,0x21,0x21,0x22,0x7c,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x01,0x83,0x00,0x00,0x00,0x00,0x94,0xff,0xff,0xff,0x00,0x04,0x00,0x00,0x00, 0x01,0x39,0x39,0x39,0x05,0xd7,0xd7,0xd7,0x79,0xb4,0xb3,0xb4,0xff,0x83,0xca, 0xc8,0xc9,0xff,0x07,0xcc,0xca,0xcb,0xff,0xb1,0xaf,0xb0,0xff,0x8c,0x8d,0x8e, 0xff,0x9e,0x9e,0x9f,0xff,0xc5,0xc3,0xc5,0xff,0xcd,0xcb,0xcc,0xff,0xcb,0xc9, 0xcb,0xff,0x82,0xca,0xc8,0xca,0xff,0x01,0xcc,0xc9,0xcb,0xff,0x83,0xcb,0xc9, 0xca,0xff,0x02,0xca,0xc8,0xc9,0xff,0xca,0xc9,0xc9,0xff,0x84,0xca,0xc8,0xc9, 0xff,0x01,0xc9,0xc7,0xc9,0xff,0x82,0xc9,0xc7,0xc8,0xff,0x1f,0xc8,0xc6,0xc7, 0xff,0xc7,0xc6,0xc7,0xff,0xc5,0xc3,0xc3,0xff,0xc1,0xbf,0xbf,0xff,0xb7,0xb5, 0xb6,0xff,0x5d,0x5e,0x5f,0xff,0x6b,0x6c,0x70,0xff,0x88,0x8a,0x90,0xff,0x98, 0x9b,0xa0,0xff,0x9d,0xa1,0xa8,0xff,0xa2,0xa4,0xac,0xff,0x99,0x9b,0xa1,0xff, 0x99,0x9b,0xa2,0xff,0xa6,0xa8,0xad,0xff,0xa4,0xa6,0xae,0xff,0xef,0xf0,0xf7, 0xff,0xea,0xed,0xf2,0xff,0x89,0x8b,0x91,0xff,0x5b,0x5d,0x63,0xff,0xd0,0xd0, 0xd0,0xff,0xcf,0xcf,0xcf,0xff,0xb9,0xb9,0xb9,0xff,0xff,0xff,0xff,0xff,0x82, 0x82,0x82,0xff,0x47,0x46,0x46,0xff,0xd3,0xd2,0xd3,0xff,0xef,0xef,0xf0,0xff, 0xbe,0xbe,0xbf,0xff,0xdc,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xdc,0xde,0xde, 0xff,0x83,0xff,0xff,0xff,0xff,0x0c,0x13,0x14,0x13,0xff,0x50,0x46,0x38,0xff, 0xe8,0xe9,0xec,0xff,0xff,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xff,0xcd,0xcc,0xcd, 0xff,0xe6,0xe6,0xe6,0xff,0xf6,0xf6,0xf6,0xff,0xff,0xff,0xff,0xff,0xfe,0xff, 0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xfe,0xfe,0xff,0x84,0xff,0xff,0xff,0xff, 0x12,0xf5,0xf5,0xf5,0xff,0x56,0x56,0x57,0xff,0xe7,0xe7,0xe7,0xff,0xdc,0xdc, 0xdc,0xff,0xb9,0xb9,0xba,0xff,0xc7,0xc8,0xc7,0xff,0xff,0xff,0xff,0xff,0xd3, 0xd5,0xd8,0xff,0xbe,0xc1,0xcb,0xff,0xe0,0xe4,0xed,0xff,0xc5,0xc8,0xcf,0xff, 0x84,0x86,0x8d,0xff,0x35,0x36,0x38,0xb9,0x00,0x00,0x00,0x32,0x00,0x00,0x00, 0x1e,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x83,0x00, 0x00,0x00,0x00,0x94,0xff,0xff,0xff,0x00,0x0d,0x40,0x40,0x40,0x02,0xcd,0xcc, 0xcd,0x2e,0xb9,0xb8,0xb9,0xf1,0xc4,0xc3,0xc4,0xff,0xca,0xc8,0xc9,0xff,0xcb, 0xc8,0xca,0xff,0xcc,0xca,0xcb,0xff,0xc3,0xc2,0xc2,0xff,0x94,0x94,0x95,0xff, 0x97,0x98,0x99,0xff,0xb6,0xb5,0xb6,0xff,0xcf,0xcd,0xcf,0xff,0xcb,0xc9,0xcb, 0xff,0x82,0xcb,0xc9,0xca,0xff,0x09,0xcb,0xc9,0xcb,0xff,0xcb,0xc9,0xca,0xff, 0xcb,0xca,0xca,0xff,0xcb,0xc9,0xca,0xff,0xca,0xc9,0xca,0xff,0xcb,0xc9,0xc9, 0xff,0xcb,0xc8,0xc9,0xff,0xca,0xc9,0xca,0xff,0xca,0xc8,0xc9,0xff,0x82,0xca, 0xc8,0xc8,0xff,0x01,0xc9,0xc7,0xc9,0xff,0x83,0xc9,0xc7,0xc8,0xff,0x24,0xc8, 0xc6,0xc8,0xff,0xc6,0xc4,0xc6,0xff,0xc2,0xc0,0xc1,0xff,0xb9,0xb7,0xb8,0xff, 0xad,0xab,0xac,0xff,0x9e,0x9d,0x9e,0xff,0x71,0x6f,0x70,0xff,0x58,0x59,0x5b, 0xff,0x69,0x6b,0x6f,0xff,0x58,0x59,0x5c,0xff,0x58,0x58,0x59,0xff,0x62,0x63, 0x66,0xff,0x7e,0x80,0x85,0xff,0xbe,0xc1,0xcb,0xff,0xfe,0xff,0xff,0xff,0xba, 0xbd,0xc5,0xff,0x7e,0x80,0x87,0xff,0x67,0x67,0x6b,0xff,0xff,0xff,0xff,0xff, 0x9b,0x9c,0x9c,0xff,0xe1,0xe1,0xe1,0xff,0xff,0xff,0xff,0xff,0xf1,0xf2,0xf3, 0xff,0xf7,0xf8,0xf8,0xff,0x95,0x96,0x95,0xff,0xcc,0xcc,0xcc,0xff,0xa0,0xa0, 0xa0,0xff,0xd8,0xd8,0xd8,0xff,0xff,0xff,0xff,0xff,0xf3,0xf3,0xf3,0xff,0xe4, 0xe5,0xe4,0xff,0xff,0xff,0xff,0xff,0xe7,0xe7,0xe8,0xff,0x08,0x00,0x00,0xff, 0x4e,0x37,0x12,0xff,0xb2,0xb2,0xb2,0xff,0x82,0xff,0xff,0xff,0xff,0x05,0xf6, 0xf6,0xf6,0xff,0xf0,0xf0,0xf0,0xff,0xe9,0xe9,0xe9,0xff,0xff,0xff,0xff,0xff, 0xff,0xfe,0xff,0xff,0x82,0xff,0xff,0xff,0xff,0x01,0xff,0xfe,0xff,0xff,0x82, 0xff,0xff,0xff,0xff,0x13,0xee,0xee,0xee,0xff,0xbd,0xbe,0xbe,0xff,0x76,0x77, 0x77,0xff,0x9b,0x9b,0x9b,0xff,0x82,0x82,0x82,0xff,0xff,0xff,0xff,0xff,0xe4, 0xe4,0xe5,0xff,0xea,0xea,0xeb,0xff,0xed,0xec,0xee,0xff,0xbb,0xbe,0xc5,0xff, 0xdd,0xe0,0xe9,0xff,0xdc,0xdf,0xe8,0xff,0x8b,0x8f,0x95,0xff,0x63,0x64,0x68, 0xf5,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x14,0x00,0x00, 0x00,0x09,0x00,0x00,0x00,0x03,0x83,0x00,0x00,0x00,0x00,0x93,0xff,0xff,0xff, 0x00,0x05,0x00,0x00,0x00,0x01,0x30,0x30,0x30,0x08,0xcc,0xcb,0xcc,0xbc,0xbc, 0xba,0xbb,0xff,0xcb,0xca,0xcb,0xff,0x82,0xcb,0xc9,0xca,0xff,0x08,0xcc,0xca, 0xcb,0xff,0xa3,0xa2,0xa4,0xff,0x92,0x93,0x95,0xff,0xab,0xab,0xad,0xff,0xcd, 0xcb,0xcd,0xff,0xcd,0xcb,0xcc,0xff,0xcc,0xca,0xcc,0xff,0xcb,0xca,0xcb,0xff, 0x82,0xcb,0xc9,0xcb,0xff,0x02,0xcc,0xc9,0xcb,0xff,0xcc,0xca,0xcb,0xff,0x82, 0xcb,0xc9,0xca,0xff,0x04,0xcb,0xc8,0xca,0xff,0xcb,0xc9,0xca,0xff,0xca,0xc8, 0xc9,0xff,0xcb,0xc8,0xc9,0xff,0x82,0xca,0xc8,0xc9,0xff,0x03,0xc9,0xc7,0xc8, 0xff,0xc9,0xc7,0xc9,0xff,0xc8,0xc7,0xc7,0xff,0x82,0xc9,0xc7,0xc7,0xff,0x18, 0xc6,0xc5,0xc6,0xff,0xc3,0xc1,0xc2,0xff,0xbc,0xba,0xbb,0xff,0xb3,0xb0,0xb2, 0xff,0xa5,0xa4,0xa5,0xff,0x98,0x96,0x97,0xff,0x8d,0x8c,0x8d,0xff,0x7a,0x78, 0x79,0xff,0x80,0x7f,0x7f,0xff,0x7d,0x7b,0x7c,0xff,0x7a,0x79,0x7a,0xff,0x62, 0x63,0x65,0xff,0xd0,0xd3,0xdc,0xff,0xff,0xff,0xff,0xff,0xa1,0xa3,0xac,0xff, 0x70,0x72,0x79,0xff,0x92,0x94,0x96,0xff,0xf8,0xf8,0xf8,0xff,0xac,0xac,0xac, 0xff,0xf9,0xf9,0xf9,0xff,0xff,0xff,0xff,0xff,0xf2,0xf0,0xf0,0xff,0xb1,0xb2, 0xb1,0xff,0xb6,0xb5,0xb5,0xff,0x82,0xff,0xff,0xff,0xff,0x04,0xea,0xea,0xeb, 0xff,0xdd,0xde,0xde,0xff,0xc0,0xc0,0xc0,0xff,0xf0,0xf0,0xf0,0xff,0x82,0xff, 0xff,0xff,0xff,0x08,0x78,0x78,0x77,0xff,0x15,0x16,0x18,0xff,0xe7,0xe7,0xe7, 0xff,0xff,0xff,0xff,0xff,0xfc,0xfc,0xfc,0xff,0xf3,0xf3,0xf3,0xff,0xff,0xff, 0xff,0xff,0xef,0xef,0xef,0xff,0x82,0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xfe, 0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xfe,0xff,0x83,0xff,0xff,0xff,0xff,0x13, 0xb7,0xb7,0xb7,0xff,0xd3,0xd3,0xd3,0xff,0x6d,0x6e,0x6e,0xff,0xb0,0xb0,0xb0, 0xff,0xff,0xff,0xff,0xff,0xf3,0xf3,0xf3,0xff,0xdb,0xdc,0xdc,0xff,0xff,0xff, 0xff,0xff,0xa7,0xab,0xb2,0xff,0xdd,0xe1,0xea,0xff,0xe6,0xe9,0xf3,0xff,0x9d, 0x9f,0xa5,0xff,0x7b,0x7c,0x81,0xff,0x0a,0x0a,0x0a,0x65,0x00,0x00,0x00,0x2b, 0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x01,0x82,0x00,0x00,0x00,0x00,0x92,0xff,0xff,0xff,0x00,0x04,0x00,0x00,0x00, 0x01,0x40,0x40,0x40,0x04,0xd8,0xd7,0xd8,0x6b,0xba,0xb8,0xb9,0xff,0x83,0xcb, 0xc9,0xca,0xff,0x08,0xcc,0xca,0xcb,0xff,0xb6,0xb4,0xb5,0xff,0x8c,0x8c,0x8e, 0xff,0xa3,0xa3,0xa5,0xff,0xc1,0xbf,0xc1,0xff,0xcf,0xcd,0xcf,0xff,0xcc,0xca, 0xcb,0xff,0xcc,0xca,0xcc,0xff,0x82,0xcc,0xca,0xcb,0xff,0x03,0xcc,0xc9,0xca, 0xff,0xcb,0xc9,0xcb,0xff,0xcc,0xc9,0xca,0xff,0x83,0xcb,0xc9,0xca,0xff,0x06, 0xcb,0xc8,0xca,0xff,0xca,0xc9,0xc9,0xff,0xca,0xc8,0xca,0xff,0xc9,0xc7,0xc9, 0xff,0xc9,0xc8,0xc8,0xff,0xc9,0xc7,0xc9,0xff,0x82,0xc9,0xc7,0xc8,0xff,0x16, 0xc9,0xc6,0xc8,0xff,0xc8,0xc6,0xc8,0xff,0xc7,0xc5,0xc5,0xff,0xc4,0xc2,0xc3, 0xff,0xbf,0xbd,0xbe,0xff,0xb9,0xb7,0xb8,0xff,0xaf,0xae,0xaf,0xff,0xa5,0xa4, 0xa5,0xff,0x9e,0x9d,0x9d,0xff,0x97,0x95,0x96,0xff,0x90,0x8f,0x90,0xff,0x8a, 0x89,0x8a,0xff,0x86,0x84,0x84,0xff,0x7f,0x80,0x84,0xff,0xd8,0xdb,0xe3,0xff, 0xf8,0xfa,0xff,0xff,0x97,0x9a,0x9f,0xff,0x63,0x65,0x6a,0xff,0xcf,0xcf,0xd0, 0xff,0xc7,0xc7,0xc7,0xff,0xc8,0xc8,0xc8,0xff,0xf7,0xf8,0xf8,0xff,0x86,0xff, 0xff,0xff,0xff,0x05,0xf4,0xf4,0xf3,0xff,0xf4,0xf4,0xf4,0xff,0xfc,0xfc,0xfc, 0xff,0xfd,0xfe,0xfe,0xff,0xfe,0xfe,0xfe,0xff,0x82,0xff,0xff,0xff,0xff,0x07, 0xb8,0xb8,0xb9,0xff,0x8b,0x8c,0x8b,0xff,0xff,0xff,0xff,0xff,0xd2,0xd2,0xd2, 0xff,0xe1,0xe2,0xe2,0xff,0xf1,0xf2,0xf1,0xff,0xf8,0xf9,0xf9,0xff,0x84,0xff, 0xff,0xff,0xff,0x06,0xff,0xfe,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xfe,0xff, 0xff,0xff,0xff,0xff,0xff,0xe0,0xe0,0xe0,0xff,0xd2,0xd1,0xd1,0xff,0x83,0xff, 0xff,0xff,0xff,0x0e,0xf8,0xf8,0xf9,0xff,0xdc,0xdb,0xdb,0xff,0xfb,0xfb,0xfb, 0xff,0xc7,0xc8,0xcd,0xff,0xc5,0xc8,0xd1,0xff,0xf2,0xf5,0xff,0xff,0xa8,0xac, 0xb2,0xff,0x77,0x79,0x7f,0xff,0x1d,0x1d,0x1d,0x95,0x00,0x00,0x00,0x31,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01, 0x82,0x00,0x00,0x00,0x00,0x92,0xff,0xff,0xff,0x00,0x10,0x40,0x40,0x40,0x02, 0xc3,0xc3,0xc3,0x26,0xc0,0xbf,0xc0,0xeb,0xc4,0xc2,0xc3,0xff,0xcb,0xca,0xcb, 0xff,0xcb,0xc9,0xca,0xff,0xcc,0xc9,0xcb,0xff,0xc6,0xc4,0xc6,0xff,0x97,0x98, 0x99,0xff,0x99,0x9a,0x9c,0xff,0xb7,0xb6,0xb8,0xff,0xcf,0xcd,0xce,0xff,0xcc, 0xca,0xcb,0xff,0xcc,0xca,0xcc,0xff,0xcc,0xca,0xcb,0xff,0xcc,0xca,0xcc,0xff, 0x82,0xcc,0xca,0xcb,0xff,0x03,0xcb,0xca,0xca,0xff,0xcb,0xc9,0xca,0xff,0xcb, 0xc9,0xcb,0xff,0x83,0xcb,0xc9,0xca,0xff,0x01,0xcb,0xc8,0xc9,0xff,0x82,0xca, 0xc8,0xc9,0xff,0x82,0xc9,0xc8,0xc8,0xff,0x17,0xc9,0xc7,0xc8,0xff,0xca,0xc7, 0xc8,0xff,0xc9,0xc7,0xc8,0xff,0xc9,0xc7,0xc7,0xff,0xc7,0xc5,0xc6,0xff,0xc6, 0xc5,0xc5,0xff,0xc3,0xc1,0xc2,0xff,0xbf,0xbd,0xbe,0xff,0xb8,0xb6,0xb7,0xff, 0xb3,0xb0,0xb1,0xff,0xad,0xab,0xac,0xff,0xa8,0xa6,0xa7,0xff,0xa2,0xa1,0xa2, 0xff,0x9d,0x9c,0x9c,0xff,0x95,0x94,0x94,0xff,0xa0,0xa2,0xa9,0xff,0xdc,0xe0, 0xe8,0xff,0xe1,0xe4,0xec,0xff,0x8e,0x90,0x96,0xff,0x62,0x63,0x67,0xff,0xfd, 0xfd,0xfd,0xff,0xb3,0xb4,0xb3,0xff,0xe1,0xe1,0xe1,0xff,0x84,0xff,0xff,0xff, 0xff,0x01,0xf3,0xf3,0xf3,0xff,0x83,0xff,0xff,0xff,0xff,0x04,0xe4,0xe4,0xe4, 0xff,0xff,0xff,0xff,0xff,0xc8,0xc8,0xc9,0xff,0xef,0xee,0xef,0xff,0x83,0xff, 0xff,0xff,0xff,0x07,0x4c,0x4c,0x4c,0xff,0xef,0xef,0xef,0xff,0xf9,0xf9,0xf9, 0xff,0xfd,0xfe,0xfe,0xff,0xe0,0xe0,0xe1,0xff,0xff,0xff,0xff,0xff,0xfe,0xff, 0xff,0xff,0x82,0xff,0xff,0xfe,0xff,0x02,0xfe,0xfe,0xff,0xff,0xff,0xff,0xfe, 0xff,0x82,0xff,0xfe,0xff,0xff,0x86,0xff,0xff,0xff,0xff,0x0e,0xfc,0xfe,0xfc, 0xff,0xde,0xdf,0xdf,0xff,0xf2,0xf3,0xf2,0xff,0xd6,0xd8,0xda,0xff,0xc2,0xc7, 0xd0,0xff,0xee,0xf2,0xfb,0xff,0xb8,0xbb,0xc3,0xff,0x7f,0x81,0x86,0xff,0x2c, 0x2c,0x2e,0xb2,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x12, 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x00,0x91,0xff, 0xff,0xff,0x00,0x10,0x00,0x00,0x00,0x01,0x37,0x37,0x37,0x07,0xd1,0xd1,0xd2, 0xb1,0xbc,0xba,0xbb,0xff,0xcc,0xc9,0xcb,0xff,0xcb,0xc9,0xca,0xff,0xca,0xc9, 0xc9,0xff,0xcc,0xca,0xcb,0xff,0xa9,0xa8,0xa9,0xff,0x92,0x92,0x94,0xff,0xac, 0xac,0xae,0xff,0xc9,0xc7,0xc9,0xff,0xce,0xcb,0xcd,0xff,0xcd,0xcb,0xcc,0xff, 0xcc,0xca,0xcb,0xff,0xcc,0xca,0xcc,0xff,0x82,0xcc,0xca,0xcb,0xff,0x03,0xcb, 0xca,0xcb,0xff,0xcc,0xca,0xca,0xff,0xcc,0xca,0xcb,0xff,0x83,0xcb,0xc9,0xca, 0xff,0x03,0xca,0xc9,0xca,0xff,0xca,0xc9,0xc9,0xff,0xca,0xc8,0xca,0xff,0x82, 0xca,0xc8,0xc9,0xff,0x01,0xca,0xc7,0xc9,0xff,0x83,0xc9,0xc7,0xc8,0xff,0x14, 0xc8,0xc7,0xc8,0xff,0xc8,0xc5,0xc7,0xff,0xc6,0xc4,0xc6,0xff,0xc5,0xc3,0xc4, 0xff,0xc3,0xc1,0xc1,0xff,0xbe,0xbd,0xbe,0xff,0xbb,0xba,0xba,0xff,0xb8,0xb6, 0xb7,0xff,0xb5,0xb3,0xb4,0xff,0xb0,0xaf,0xaf,0xff,0xaa,0xa8,0xa8,0xff,0x9d, 0x9c,0x9d,0xff,0xc1,0xc5,0xcd,0xff,0xde,0xe1,0xea,0xff,0xd2,0xd4,0xde,0xff, 0x8c,0x8f,0x95,0xff,0x5e,0x5f,0x62,0xff,0xff,0xff,0xff,0xff,0xab,0xad,0xad, 0xff,0xe6,0xe6,0xe7,0xff,0x82,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xff, 0x40,0x40,0x40,0xff,0x83,0x83,0x84,0xff,0x83,0xff,0xff,0xff,0xff,0x0b,0xea, 0xec,0xec,0xff,0xed,0xed,0xec,0xff,0xdf,0xdf,0xdf,0xff,0xff,0xff,0xff,0xff, 0xe9,0xea,0xea,0xff,0xa9,0xa9,0xaa,0xff,0xff,0xff,0xff,0xff,0x95,0x95,0x95, 0xff,0x83,0x83,0x83,0xff,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xff,0x83,0xff, 0xff,0xff,0xff,0x07,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe, 0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xfe,0xff,0x86,0xff,0xff,0xff,0xff,0x0d,0xe0,0xe0,0xe1,0xff,0xe6,0xe5,0xe6, 0xff,0xeb,0xeb,0xed,0xff,0xb1,0xb5,0xbf,0xff,0xf6,0xfa,0xff,0xff,0xc1,0xc4, 0xc9,0xff,0x80,0x82,0x87,0xff,0x48,0x48,0x4b,0xdb,0x00,0x00,0x00,0x3c,0x00, 0x00,0x00,0x26,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x02, 0x82,0x00,0x00,0x00,0x00,0x91,0xff,0xff,0xff,0x00,0x0f,0x24,0x24,0x24,0x04, 0xd9,0xd9,0xd9,0x5f,0xbb,0xba,0xbb,0xff,0xca,0xc8,0xc9,0xff,0xcb,0xc9,0xcb, 0xff,0xca,0xc8,0xc9,0xff,0xcd,0xcb,0xcc,0xff,0xbd,0xbb,0xbd,0xff,0x8f,0x90, 0x91,0xff,0xa7,0xa8,0xa9,0xff,0xbf,0xbf,0xbf,0xff,0xcf,0xcd,0xce,0xff,0xcc, 0xca,0xcc,0xff,0xcc,0xca,0xcb,0xff,0xcc,0xca,0xcc,0xff,0x85,0xcc,0xca,0xcb, 0xff,0x06,0xcb,0xc9,0xcb,0xff,0xcb,0xca,0xca,0xff,0xcb,0xc9,0xca,0xff,0xcb, 0xc9,0xc9,0xff,0xcb,0xc9,0xca,0xff,0xcb,0xc8,0xc9,0xff,0x82,0xca,0xc8,0xc9, 0xff,0x02,0xc9,0xc8,0xc9,0xff,0xca,0xc8,0xc9,0xff,0x83,0xc9,0xc7,0xc8,0xff, 0x1a,0xc9,0xc6,0xc8,0xff,0xc9,0xc6,0xc7,0xff,0xc7,0xc5,0xc6,0xff,0xc8,0xc5, 0xc6,0xff,0xc5,0xc4,0xc5,0xff,0xc5,0xc3,0xc4,0xff,0xc2,0xc0,0xc1,0xff,0xc2, 0xc0,0xc0,0xff,0xbf,0xbd,0xbe,0xff,0xbb,0xb9,0xb9,0xff,0xb3,0xb0,0xb2,0xff, 0x98,0x97,0x98,0xff,0xb5,0xb8,0xc1,0xff,0xdc,0xe0,0xe9,0xff,0xcc,0xcd,0xd6, 0xff,0x84,0x87,0x8d,0xff,0x75,0x77,0x7a,0xff,0xff,0xff,0xfe,0xff,0xac,0xad, 0xad,0xff,0xf1,0xf3,0xf3,0xff,0xdb,0xdb,0xdb,0xff,0x73,0x73,0x74,0xff,0xdd, 0xde,0xdd,0xff,0xa0,0xa0,0xa0,0xff,0xdc,0xdc,0xdc,0xff,0xa2,0xa2,0xa1,0xff, 0x83,0xff,0xff,0xff,0xff,0x05,0xec,0xec,0xec,0xff,0xdf,0xdf,0xdf,0xff,0xff, 0xff,0xff,0xff,0xeb,0xeb,0xeb,0xff,0xe2,0xe3,0xe2,0xff,0x82,0xff,0xff,0xff, 0xff,0x03,0x29,0x2a,0x2a,0xff,0x41,0x43,0x45,0xff,0x95,0x95,0x96,0xff,0x84, 0xff,0xff,0xff,0xff,0x07,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xfe,0xff, 0xfe,0xff,0xfe,0xff,0xff,0xff,0xff,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xfe, 0xfe,0xff,0xff,0x84,0xff,0xff,0xff,0xff,0x0e,0xff,0xff,0xfe,0xff,0xec,0xeb, 0xeb,0xff,0xe3,0xe5,0xe4,0xff,0xf7,0xf8,0xf7,0xff,0xba,0xbe,0xc6,0xff,0xf1, 0xf6,0xfe,0xff,0xd0,0xd3,0xdb,0xff,0x7d,0x7f,0x85,0xff,0x4f,0x50,0x53,0xe5, 0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x18,0x00,0x00,0x00, 0x0b,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x00,0x90,0xff,0xff,0xff,0x00, 0x04,0x55,0x55,0x55,0x02,0xb9,0xb9,0xb9,0x20,0xc6,0xc5,0xc6,0xe6,0xc2,0xc0, 0xc2,0xff,0x82,0xcb,0xc9,0xca,0xff,0x06,0xcc,0xca,0xcc,0xff,0xc9,0xc7,0xc8, 0xff,0x98,0x98,0x99,0xff,0x9d,0x9e,0x9f,0xff,0xb7,0xb6,0xb7,0xff,0xcd,0xcb, 0xcd,0xff,0x82,0xcc,0xca,0xcb,0xff,0x04,0xcd,0xcb,0xcc,0xff,0xcc,0xca,0xcc, 0xff,0xcd,0xca,0xcc,0xff,0xcc,0xcb,0xcc,0xff,0x82,0xcc,0xca,0xcb,0xff,0x03, 0xcb,0xca,0xcb,0xff,0xcc,0xca,0xcb,0xff,0xcb,0xca,0xca,0xff,0x83,0xcb,0xc9, 0xca,0xff,0x0b,0xca,0xc8,0xca,0xff,0xcb,0xc8,0xca,0xff,0xca,0xc8,0xc9,0xff, 0xca,0xc8,0xc8,0xff,0xca,0xc7,0xc8,0xff,0xc9,0xc7,0xc8,0xff,0xca,0xc7,0xc8, 0xff,0xc9,0xc7,0xc8,0xff,0xc8,0xc7,0xc8,0xff,0xc8,0xc6,0xc7,0xff,0xc9,0xc6, 0xc8,0xff,0x82,0xc8,0xc6,0xc7,0xff,0x15,0xc6,0xc5,0xc6,0xff,0xc6,0xc4,0xc4, 0xff,0xc5,0xc3,0xc4,0xff,0xc5,0xc4,0xc4,0xff,0xc0,0xbe,0xbf,0xff,0xb8,0xb6, 0xb6,0xff,0xa8,0xa7,0xa8,0xff,0xc6,0xc9,0xd3,0xff,0xde,0xe1,0xea,0xff,0xcc, 0xcf,0xd7,0xff,0x83,0x86,0x8a,0xff,0x79,0x7a,0x7e,0xff,0xff,0xff,0xff,0xff, 0x81,0x82,0x82,0xff,0xcb,0xcb,0xcb,0xff,0xa5,0xa5,0xa5,0xff,0x70,0x70,0x70, 0xff,0xa3,0xa1,0xa3,0xff,0x4b,0x4b,0x4b,0xff,0xa7,0xa7,0xa7,0xff,0xd4,0xd4, 0xd3,0xff,0x84,0xff,0xff,0xff,0xff,0x0a,0xef,0xef,0xef,0xff,0xe7,0xe7,0xe7, 0xff,0xea,0xe9,0xe9,0xff,0xf9,0xf8,0xf9,0xff,0xe4,0xe5,0xe5,0xff,0xd5,0xd6, 0xd6,0xff,0x00,0x00,0x00,0xff,0x76,0x5a,0x31,0xff,0x1d,0x10,0x00,0xff,0xcd, 0xcf,0xd0,0xff,0x85,0xff,0xff,0xff,0xff,0x03,0xfe,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xfe,0xff,0xff,0x84,0xff,0xff,0xff,0xff,0x10,0xb8,0xb8,0xb8, 0xff,0xec,0xec,0xec,0xff,0xff,0xff,0xff,0xff,0xe5,0xe6,0xe5,0xff,0xde,0xdd, 0xdd,0xff,0xfb,0xfb,0xfc,0xff,0xaf,0xb3,0xbc,0xff,0xfc,0xff,0xff,0xff,0xd7, 0xd9,0xde,0xff,0x80,0x82,0x87,0xff,0x63,0x64,0x68,0xff,0x00,0x00,0x00,0x44, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x0c,0x00,0x00,0x00, 0x04,0x82,0x00,0x00,0x00,0x00,0x8f,0xff,0xff,0xff,0x00,0x1f,0x00,0x00,0x00, 0x01,0x3b,0x3b,0x3b,0x07,0xd5,0xd4,0xd5,0xa4,0xbc,0xbb,0xbc,0xff,0xcb,0xca, 0xcb,0xff,0xcb,0xc9,0xca,0xff,0xcd,0xca,0xcb,0xff,0xcd,0xcb,0xcd,0xff,0xae, 0xad,0xae,0xff,0x94,0x94,0x96,0xff,0xb1,0xb1,0xb2,0xff,0xc7,0xc6,0xc7,0xff, 0xcd,0xcb,0xcc,0xff,0xcc,0xca,0xcb,0xff,0xcc,0xca,0xcc,0xff,0xcd,0xca,0xcc, 0xff,0xcd,0xcb,0xcc,0xff,0xcd,0xcb,0xcb,0xff,0xcc,0xcb,0xcc,0xff,0xcc,0xcb, 0xcb,0xff,0xcc,0xca,0xcb,0xff,0xcb,0xc9,0xcb,0xff,0xcb,0xca,0xcb,0xff,0xcb, 0xc9,0xcb,0xff,0xcc,0xc9,0xca,0xff,0xcb,0xc9,0xca,0xff,0xca,0xc8,0xca,0xff, 0xcb,0xc9,0xca,0xff,0xcb,0xc8,0xc9,0xff,0xcb,0xc9,0xc9,0xff,0xca,0xc8,0xc9, 0xff,0x82,0xc9,0xc8,0xc9,0xff,0x83,0xc9,0xc7,0xc8,0xff,0x82,0xc8,0xc7,0xc8, 0xff,0x10,0xc8,0xc6,0xc8,0xff,0xc8,0xc6,0xc6,0xff,0xc8,0xc6,0xc7,0xff,0xc7, 0xc6,0xc7,0xff,0xc7,0xc6,0xc6,0xff,0xc6,0xc4,0xc5,0xff,0xc2,0xc0,0xc1,0xff, 0xba,0xb9,0xba,0xff,0x9b,0x99,0x9a,0xff,0xb7,0xb9,0xc1,0xff,0xde,0xe1,0xe9, 0xff,0xcc,0xce,0xd6,0xff,0x84,0x86,0x8e,0xff,0x81,0x82,0x86,0xff,0xff,0xff, 0xff,0xff,0xc7,0xc8,0xc8,0xff,0x82,0xff,0xff,0xff,0xff,0x04,0xc2,0xc3,0xc3, 0xff,0x92,0x91,0x92,0xff,0xf2,0xf2,0xf2,0xff,0xfd,0xfd,0xfd,0xff,0x82,0xff, 0xff,0xff,0xff,0x01,0xfe,0xfe,0xff,0xff,0x82,0xff,0xff,0xfe,0xff,0x82,0xff, 0xff,0xff,0xff,0x82,0xf5,0xf5,0xf5,0xff,0x06,0xff,0xff,0xff,0xff,0xb2,0xb3, 0xb7,0xff,0x3b,0x2c,0x17,0xff,0xca,0xa7,0x74,0xff,0x3f,0x30,0x1a,0xff,0xbc, 0xbe,0xbf,0xff,0x83,0xff,0xff,0xff,0xff,0x82,0xfe,0xff,0xff,0xff,0x02,0xff, 0xff,0xff,0xff,0xfe,0xfe,0xff,0xff,0x83,0xff,0xff,0xff,0xff,0x12,0xd7,0xd7, 0xd8,0xff,0x7a,0x7a,0x7a,0xff,0xe3,0xe4,0xe4,0xff,0x92,0x92,0x92,0xff,0xff, 0xff,0xff,0xff,0xf0,0xf0,0xf0,0xff,0xe5,0xe7,0xe6,0xff,0xff,0xff,0xff,0xff, 0xb6,0xb9,0xc1,0xff,0xfb,0xfe,0xff,0xff,0xdb,0xdd,0xe4,0xff,0x7c,0x7d,0x83, 0xff,0x50,0x51,0x55,0xee,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x2f,0x00,0x00, 0x00,0x1b,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0x00,0x00, 0x8f,0xff,0xff,0xff,0x00,0x0d,0x24,0x24,0x24,0x04,0xd9,0xd9,0xda,0x53,0xbf, 0xbe,0xc0,0xfe,0xc8,0xc7,0xc8,0xff,0xcb,0xc9,0xca,0xff,0xca,0xc9,0xca,0xff, 0xcc,0xca,0xcb,0xff,0xc0,0xbf,0xc0,0xff,0x90,0x90,0x92,0xff,0xa9,0xaa,0xac, 0xff,0xbd,0xbc,0xbd,0xff,0xce,0xcb,0xcd,0xff,0xcb,0xc9,0xcb,0xff,0x82,0xcc, 0xca,0xcb,0xff,0x82,0xcd,0xcb,0xcc,0xff,0x02,0xcd,0xca,0xcc,0xff,0xcc,0xcb, 0xcc,0xff,0x84,0xcc,0xca,0xcb,0xff,0x06,0xcb,0xca,0xca,0xff,0xcb,0xc9,0xcb, 0xff,0xcb,0xc9,0xca,0xff,0xcb,0xc8,0xca,0xff,0xcb,0xc9,0xca,0xff,0xcb,0xc9, 0xc9,0xff,0x82,0xca,0xc8,0xc9,0xff,0x07,0xc9,0xc8,0xc8,0xff,0xc9,0xc8,0xc9, 0xff,0xca,0xc7,0xc8,0xff,0xc9,0xc7,0xc8,0xff,0xc8,0xc7,0xc8,0xff,0xc9,0xc6, 0xc8,0xff,0xc9,0xc6,0xc7,0xff,0x82,0xc8,0xc6,0xc7,0xff,0x12,0xc8,0xc6,0xc6, 0xff,0xc7,0xc6,0xc7,0xff,0xc7,0xc6,0xc6,0xff,0xc6,0xc4,0xc5,0xff,0xc2,0xc0, 0xc1,0xff,0xbb,0xb9,0xba,0xff,0xad,0xaa,0xac,0xff,0xb8,0xbd,0xc4,0xff,0xd1, 0xd4,0xde,0xff,0xd0,0xd2,0xdb,0xff,0x85,0x88,0x8e,0xff,0x8d,0x8e,0x92,0xff, 0xff,0xff,0xff,0xff,0xcf,0xd0,0xd0,0xff,0xfb,0xfc,0xfc,0xff,0xff,0xff,0xff, 0xff,0xce,0xce,0xce,0xff,0xfb,0xfb,0xfb,0xff,0x83,0xff,0xff,0xff,0xff,0x03, 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0x86,0xff,0xff, 0xff,0xff,0x05,0xf3,0xf4,0xf5,0xff,0x6c,0x6b,0x6b,0xff,0x1c,0x16,0x0d,0xff, 0x00,0x00,0x00,0xff,0xe1,0xe2,0xe4,0xff,0x84,0xff,0xff,0xff,0xff,0x01,0xfe, 0xff,0xff,0xff,0x84,0xff,0xff,0xff,0xff,0x13,0x69,0x69,0x69,0xff,0xa4,0xa4, 0xa4,0xff,0x94,0x94,0x95,0xff,0xf3,0xf4,0xf3,0xff,0xb6,0xb5,0xb6,0xff,0xc8, 0xca,0xca,0xff,0xb9,0xb9,0xba,0xff,0xba,0xba,0xba,0xff,0xff,0xff,0xff,0xff, 0xad,0xb2,0xbb,0xff,0xff,0xff,0xff,0xff,0xd1,0xd4,0xd9,0xff,0x7b,0x7e,0x83, 0xff,0x52,0x52,0x56,0xec,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x30,0x00,0x00, 0x00,0x1c,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x05,0x82,0x00,0x00,0x00,0x00, 0x8e,0xff,0xff,0xff,0x00,0x04,0x55,0x55,0x55,0x02,0xad,0xad,0xad,0x19,0xc8, 0xc7,0xc8,0xdf,0xc3,0xc1,0xc2,0xff,0x82,0xcb,0xc9,0xcb,0xff,0x07,0xcc,0xca, 0xcc,0xff,0xcb,0xc9,0xca,0xff,0x9f,0x9f,0x9f,0xff,0x9f,0x9f,0xa1,0xff,0xb7, 0xb7,0xb8,0xff,0xcc,0xca,0xcb,0xff,0xcb,0xc9,0xca,0xff,0x82,0xcb,0xc9,0xcb, 0xff,0x06,0xcc,0xca,0xcc,0xff,0xcd,0xcb,0xcc,0xff,0xcc,0xcb,0xcc,0xff,0xcd, 0xcb,0xcc,0xff,0xcc,0xca,0xcb,0xff,0xcc,0xca,0xcc,0xff,0x83,0xcc,0xca,0xcb, 0xff,0x82,0xcb,0xc9,0xcb,0xff,0x82,0xcb,0xc9,0xca,0xff,0x02,0xcb,0xc8,0xca, 0xff,0xcb,0xc9,0xc9,0xff,0x82,0xca,0xc8,0xc9,0xff,0x08,0xa8,0xa8,0xa8,0xff, 0x74,0x76,0x74,0xff,0xa3,0xa3,0xa2,0xff,0xca,0xc7,0xc8,0xff,0xc9,0xc7,0xc8, 0xff,0xc9,0xc6,0xc7,0xff,0xc8,0xc6,0xc8,0xff,0xc9,0xc6,0xc7,0xff,0x82,0xc8, 0xc6,0xc7,0xff,0x0e,0xc8,0xc5,0xc6,0xff,0xc7,0xc6,0xc6,0xff,0xc6,0xc4,0xc6, 0xff,0xc2,0xc0,0xc1,0xff,0xba,0xb9,0xba,0xff,0x9b,0x99,0x99,0xff,0xb2,0xb5, 0xbe,0xff,0xd1,0xd4,0xdc,0xff,0xcf,0xd2,0xd9,0xff,0x92,0x93,0x9a,0xff,0x74, 0x75,0x79,0xff,0xff,0xff,0xff,0xff,0xbf,0xbf,0xbf,0xff,0xf5,0xf3,0xf5,0xff, 0x86,0xff,0xff,0xff,0xff,0x02,0xfe,0xfe,0xfe,0xff,0xfe,0xff,0xfe,0xff,0x82, 0xff,0xff,0xff,0xff,0x83,0xfe,0xff,0xff,0xff,0x84,0xff,0xff,0xff,0xff,0x03, 0xfb,0xfd,0xfe,0xff,0x33,0x33,0x34,0xff,0xd5,0xd6,0xd6,0xff,0x82,0xff,0xff, 0xff,0xff,0x01,0xfe,0xfe,0xff,0xff,0x82,0xfe,0xff,0xff,0xff,0x01,0xff,0xff, 0xfe,0xff,0x82,0xff,0xff,0xff,0xff,0x14,0xe3,0xe3,0xe3,0xff,0xfc,0xfc,0xfc, 0xff,0x5e,0x60,0x5e,0xff,0xcf,0xd0,0xcf,0xff,0x79,0x79,0x79,0xff,0xb7,0xb7, 0xb7,0xff,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xff,0xde,0xdf,0xdd,0xff,0xf3, 0xf4,0xf5,0xff,0xba,0xbe,0xc8,0xff,0xff,0xff,0xff,0xff,0xc4,0xc6,0xcd,0xff, 0x79,0x7b,0x80,0xff,0x4b,0x4c,0x4e,0xe8,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x05,0x82,0x00, 0x00,0x00,0x00,0x8d,0xff,0xff,0xff,0x00,0x16,0x00,0x00,0x00,0x01,0x40,0x40, 0x40,0x06,0xd8,0xd8,0xd8,0x98,0xbc,0xba,0xbc,0xff,0xca,0xc8,0xc9,0xff,0xca, 0xc8,0xca,0xff,0xcc,0xca,0xcb,0xff,0xcd,0xcb,0xcc,0xff,0xb3,0xb2,0xb3,0xff, 0x94,0x95,0x96,0xff,0xb8,0xb7,0xb9,0xff,0xc4,0xc2,0xc4,0xff,0xcd,0xcb,0xcc, 0xff,0xcb,0xc8,0xca,0xff,0xcb,0xc9,0xca,0xff,0xcc,0xca,0xcb,0xff,0xcd,0xcb, 0xcd,0xff,0xcd,0xcb,0xcc,0xff,0xcd,0xca,0xcc,0xff,0xcc,0xcb,0xcc,0xff,0xcc, 0xca,0xcc,0xff,0xcd,0xca,0xcb,0xff,0x82,0xcc,0xca,0xcb,0xff,0x21,0xca,0xc7, 0xc9,0xff,0xc9,0xc7,0xc8,0xff,0xc3,0xc2,0xc2,0xff,0xb0,0xaf,0xaf,0xff,0xb5, 0xb4,0xb4,0xff,0xb6,0xb5,0xb5,0xff,0xb9,0xb7,0xb8,0xff,0xc9,0xc8,0xc8,0xff, 0xca,0xc8,0xca,0xff,0x80,0x81,0x7f,0xff,0x1e,0x24,0x1e,0xff,0x1e,0x25,0x1e, 0xff,0x26,0x2c,0x26,0xff,0x68,0x6b,0x68,0xff,0xb9,0xb8,0xb8,0xff,0xc8,0xc7, 0xc8,0xff,0xc9,0xc6,0xc7,0xff,0xc8,0xc6,0xc7,0xff,0xc7,0xc6,0xc6,0xff,0xc8, 0xc5,0xc6,0xff,0xc7,0xc6,0xc6,0xff,0xc6,0xc4,0xc6,0xff,0xc2,0xc0,0xc1,0xff, 0xbb,0xb9,0xba,0xff,0xaf,0xad,0xad,0xff,0xab,0xae,0xb6,0xff,0xc0,0xc3,0xcb, 0xff,0xd8,0xda,0xe3,0xff,0x92,0x95,0x9c,0xff,0x7d,0x7f,0x84,0xff,0xf2,0xf2, 0xf3,0xff,0xd5,0xd5,0xd5,0xff,0xe8,0xe8,0xe8,0xff,0x87,0xff,0xff,0xff,0xff, 0x08,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff, 0xfe,0xff,0xfe,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xfe,0xff,0xfe, 0xfe,0xff,0xff,0x83,0xff,0xff,0xff,0xff,0x07,0xa6,0xa6,0xa6,0xff,0x5e,0x5e, 0x5e,0xff,0xfb,0xfa,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff, 0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0x84,0xff,0xff,0xff,0xff,0x03,0xd7,0xd7, 0xd7,0xff,0x56,0x58,0x57,0xff,0xc5,0xc4,0xc4,0xff,0x82,0xff,0xff,0xff,0xff, 0x0e,0xfd,0xfd,0xfd,0xff,0xdf,0xdf,0xdf,0xff,0xea,0xea,0xea,0xff,0xeb,0xec, 0xed,0xff,0xca,0xce,0xd8,0xff,0xff,0xff,0xff,0xff,0xb4,0xb7,0xbf,0xff,0x74, 0x76,0x7c,0xff,0x3b,0x3c,0x3e,0xd4,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x04,0x82,0x00,0x00, 0x00,0x00,0x8d,0xff,0xff,0xff,0x00,0x0c,0x2b,0x2b,0x2b,0x03,0xd9,0xd9,0xd9, 0x48,0xbe,0xbd,0xbe,0xfc,0xc7,0xc5,0xc6,0xff,0xca,0xc8,0xc9,0xff,0xcb,0xc9, 0xca,0xff,0xcc,0xca,0xcc,0xff,0xc4,0xc3,0xc4,0xff,0x92,0x92,0x93,0xff,0xb0, 0xaf,0xb2,0xff,0xbe,0xbd,0xbf,0xff,0xcd,0xcb,0xcc,0xff,0x82,0xcb,0xc9,0xca, 0xff,0x01,0xcb,0xc9,0xcb,0xff,0x84,0xcd,0xcb,0xcc,0xff,0x0b,0xcc,0xcb,0xcc, 0xff,0xcc,0xca,0xcb,0xff,0xc5,0xc3,0xc4,0xff,0xa2,0xa2,0xa1,0xff,0x76,0x78, 0x75,0xff,0x4e,0x51,0x4d,0xff,0x33,0x39,0x33,0xff,0x23,0x29,0x23,0xff,0x21, 0x28,0x21,0xff,0x22,0x29,0x22,0xff,0x24,0x2a,0x24,0xff,0x82,0x1e,0x25,0x1e, 0xff,0x03,0x4a,0x4e,0x49,0xff,0x88,0x8a,0x88,0xff,0x28,0x2e,0x28,0xff,0x84, 0x1e,0x24,0x1e,0xff,0x03,0x2d,0x33,0x2d,0xff,0x82,0x84,0x82,0xff,0xc9,0xc6, 0xc7,0xff,0x82,0xc8,0xc6,0xc6,0xff,0x0e,0xc8,0xc6,0xc7,0xff,0xc7,0xc5,0xc6, 0xff,0xc3,0xc1,0xc2,0xff,0xba,0xb9,0xba,0xff,0xab,0xaa,0xab,0xff,0x89,0x8a, 0x8f,0xff,0xc6,0xca,0xd2,0xff,0xd8,0xdb,0xe2,0xff,0xa8,0xab,0xb1,0xff,0x6e, 0x70,0x75,0xff,0xed,0xee,0xee,0xff,0xd2,0xd2,0xd2,0xff,0xe8,0xe9,0xe8,0xff, 0xfc,0xfe,0xfc,0xff,0x84,0xff,0xff,0xff,0xff,0x01,0xc1,0xc1,0xc2,0xff,0x82, 0xff,0xff,0xff,0xff,0x02,0xff,0xff,0xfe,0xff,0xfe,0xfe,0xff,0xff,0x82,0xff, 0xff,0xff,0xff,0x01,0xfe,0xfe,0xfe,0xff,0x82,0xff,0xff,0xff,0xff,0x01,0xfe, 0xfe,0xfe,0xff,0x83,0xff,0xff,0xff,0xff,0x02,0x1f,0x1f,0x1f,0xff,0xc4,0xc4, 0xc4,0xff,0x88,0xff,0xff,0xff,0xff,0x01,0xf1,0xf1,0xf1,0xff,0x85,0xff,0xff, 0xff,0xff,0x0d,0xd7,0xd8,0xd8,0xff,0xfb,0xfa,0xfa,0xff,0xd4,0xd5,0xd8,0xff, 0xdb,0xdf,0xe8,0xff,0xff,0xff,0xff,0xff,0xa0,0xa2,0xa9,0xff,0x71,0x74,0x79, 0xff,0x2b,0x2b,0x2c,0xbb,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x2e,0x00,0x00, 0x00,0x1b,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0x00,0x00, 0x8c,0xff,0xff,0xff,0x00,0x06,0x55,0x55,0x55,0x02,0x95,0x95,0x95,0x13,0xce, 0xcd,0xce,0xd6,0xc0,0xbf,0xc0,0xff,0xc9,0xc8,0xc9,0xff,0xc8,0xc6,0xc8,0xff, 0x82,0xcb,0xc9,0xca,0xff,0x09,0xa2,0xa1,0xa2,0xff,0x9f,0x9f,0xa0,0xff,0xbd, 0xbc,0xbd,0xff,0xca,0xc8,0xc9,0xff,0xcb,0xc9,0xcb,0xff,0xcb,0xc9,0xca,0xff, 0xcc,0xca,0xcb,0xff,0xcd,0xca,0xcc,0xff,0xcd,0xcb,0xcd,0xff,0x85,0xcd,0xcb, 0xcc,0xff,0x06,0x54,0x58,0x54,0xff,0x21,0x27,0x21,0xff,0x1e,0x25,0x1e,0xff, 0x28,0x2e,0x28,0xff,0x62,0x65,0x62,0xff,0x9e,0x9f,0x9e,0xff,0x82,0xc0,0xbe, 0xbf,0xff,0x08,0xc9,0xc8,0xc8,0xff,0xc4,0xc2,0xc2,0xff,0xa6,0xa7,0xa6,0xff, 0x59,0x5c,0x58,0xff,0xb1,0xb0,0xb0,0xff,0xc9,0xc8,0xc9,0xff,0x92,0x92,0x91, 0xff,0x25,0x2b,0x25,0xff,0x85,0x1e,0x24,0x1e,0xff,0x0f,0x3a,0x3f,0x3a,0xff, 0x98,0x99,0x98,0xff,0xc7,0xc6,0xc6,0xff,0xc8,0xc5,0xc6,0xff,0xc3,0xc1,0xc3, 0xff,0xbc,0xba,0xbb,0xff,0xb0,0xaf,0xaf,0xff,0x7b,0x7b,0x7f,0xff,0xb9,0xbc, 0xc5,0xff,0xd6,0xd9,0xe0,0xff,0xb7,0xb9,0xc2,0xff,0x71,0x73,0x79,0xff,0xbb, 0xbc,0xbe,0xff,0xeb,0xeb,0xeb,0xff,0xd8,0xd8,0xd8,0xff,0x83,0xff,0xff,0xff, 0xff,0x04,0xd7,0xd7,0xd6,0xff,0x6a,0x6a,0x6a,0xff,0x72,0x72,0x72,0xff,0xce, 0xcd,0xcd,0xff,0x82,0xff,0xff,0xff,0xff,0x02,0xfe,0xff,0xff,0xff,0xfe,0xfe, 0xff,0xff,0x82,0xff,0xff,0xff,0xff,0x02,0xff,0xfe,0xff,0xff,0xff,0xff,0xfe, 0xff,0x82,0xff,0xfe,0xff,0xff,0x82,0xff,0xff,0xff,0xff,0x03,0x9d,0x9d,0x9d, 0xff,0x35,0x35,0x35,0xff,0xf8,0xf8,0xf7,0xff,0x84,0xff,0xff,0xff,0xff,0x01, 0xff,0xfe,0xfe,0xff,0x84,0xff,0xff,0xff,0xff,0x11,0xf7,0xf6,0xf7,0xff,0xff, 0xff,0xff,0xff,0xfe,0xfe,0xff,0xff,0xf6,0xf6,0xf6,0xff,0xc9,0xca,0xca,0xff, 0xff,0xff,0xff,0xff,0xb6,0xb8,0xbf,0xff,0xf8,0xfb,0xff,0xff,0xff,0xff,0xff, 0xff,0x87,0x8a,0x8f,0xff,0x6c,0x6d,0x72,0xff,0x07,0x07,0x08,0x7c,0x00,0x00, 0x00,0x43,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x04,0x00, 0x00,0x00,0x01,0x2e,0x2e,0x2e,0x06,0xda,0xda,0xda,0x8c,0xbc,0xba,0xbc,0xff, 0x82,0xc9,0xc8,0xc9,0xff,0x22,0xca,0xc8,0xc9,0xff,0xcc,0xca,0xcb,0xff,0xb4, 0xb3,0xb4,0xff,0x93,0x93,0x94,0xff,0xba,0xba,0xbc,0xff,0xc2,0xc1,0xc2,0xff, 0xcd,0xcb,0xcc,0xff,0xcc,0xc9,0xcb,0xff,0xcc,0xca,0xcb,0xff,0xcd,0xcb,0xcc, 0xff,0xce,0xcc,0xcc,0xff,0xcd,0xcb,0xcc,0xff,0xcd,0xcb,0xcd,0xff,0xcd,0xcb, 0xcc,0xff,0xcd,0xcb,0xcb,0xff,0xcc,0xcb,0xcb,0xff,0xcd,0xca,0xcb,0xff,0x4a, 0x4e,0x4a,0xff,0x1e,0x25,0x1e,0xff,0x3c,0x41,0x3c,0xff,0xcb,0xca,0xcb,0xff, 0xc8,0xc5,0xc7,0xff,0xb3,0xb3,0xb3,0xff,0x92,0x93,0x92,0xff,0x7a,0x7c,0x79, 0xff,0x68,0x6b,0x68,0xff,0x81,0x83,0x80,0xff,0x8f,0x90,0x8f,0xff,0x1e,0x25, 0x1e,0xff,0x20,0x27,0x20,0xff,0x52,0x56,0x51,0xff,0xc5,0xc3,0xc4,0xff,0xaf, 0xae,0xad,0xff,0x31,0x36,0x31,0xff,0x86,0x1e,0x24,0x1e,0xff,0x14,0x21,0x27, 0x21,0xff,0x50,0x54,0x50,0xff,0xa9,0xa8,0xa8,0xff,0xbd,0xbb,0xbc,0xff,0xb2, 0xb0,0xb1,0xff,0x82,0x81,0x82,0xff,0xbf,0xc4,0xcc,0xff,0xc8,0xcb,0xd3,0xff, 0xcd,0xd1,0xd9,0xff,0x84,0x86,0x8c,0xff,0x95,0x95,0x9a,0xff,0xff,0xff,0xff, 0xff,0xd0,0xd2,0xd2,0xff,0xf4,0xf3,0xf3,0xff,0xff,0xff,0xff,0xff,0x7c,0x7c, 0x7c,0xff,0xa8,0xa8,0xa8,0xff,0xae,0xae,0xae,0xff,0xc4,0xc4,0xc4,0xff,0x8d, 0x8d,0x8d,0xff,0x83,0xff,0xff,0xff,0xff,0x02,0xfe,0xff,0xfe,0xff,0xfe,0xff, 0xff,0xff,0x83,0xff,0xff,0xff,0xff,0x82,0xfe,0xff,0xff,0xff,0x83,0xff,0xff, 0xff,0xff,0x01,0xcd,0xce,0xce,0xff,0x82,0xff,0xff,0xff,0xff,0x82,0xff,0xff, 0xfe,0xff,0x84,0xff,0xff,0xff,0xff,0x03,0xfe,0xfd,0xfe,0xff,0x7c,0x7d,0x7d, 0xff,0xfb,0xfc,0xfc,0xff,0x82,0xff,0xff,0xff,0xff,0x0e,0xdd,0xdd,0xdd,0xff, 0xce,0xce,0xcf,0xff,0xff,0xff,0xff,0xff,0xad,0xb1,0xba,0xff,0xff,0xff,0xff, 0xff,0xe5,0xe7,0xed,0xff,0x76,0x78,0x7f,0xff,0x6b,0x6d,0x70,0xff,0x00,0x00, 0x00,0x57,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x17,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x00,0x8b,0xfe,0xfe, 0xfe,0x00,0x10,0x33,0x33,0x33,0x03,0xd4,0xd4,0xd4,0x3e,0xc5,0xc3,0xc4,0xf8, 0xc6,0xc4,0xc5,0xff,0xc9,0xc7,0xc9,0xff,0xca,0xc8,0xc9,0xff,0xcb,0xc9,0xca, 0xff,0xc6,0xc4,0xc5,0xff,0x93,0x93,0x95,0xff,0xb3,0xb2,0xb5,0xff,0xc1,0xc0, 0xc2,0xff,0xcd,0xcb,0xcd,0xff,0xcc,0xc9,0xcb,0xff,0xcc,0xca,0xcc,0xff,0xcc, 0xca,0xcb,0xff,0xcd,0xca,0xcc,0xff,0x82,0xcd,0xcc,0xcd,0xff,0x0c,0xcd,0xcb, 0xcc,0xff,0xcd,0xcc,0xcc,0xff,0xcd,0xcb,0xcc,0xff,0xcc,0xcb,0xcc,0xff,0xcd, 0xcb,0xcb,0xff,0x4e,0x52,0x4d,0xff,0x1e,0x25,0x1e,0xff,0x5a,0x5e,0x5a,0xff, 0xcc,0xc9,0xca,0xff,0x6e,0x71,0x6e,0xff,0x20,0x26,0x20,0xff,0x23,0x29,0x23, 0xff,0x82,0x3d,0x42,0x3d,0xff,0x09,0x44,0x49,0x44,0xff,0xa3,0xa3,0xa2,0xff, 0xc8,0xc7,0xc7,0xff,0x7d,0x7f,0x7d,0xff,0x1e,0x24,0x1e,0xff,0x39,0x3e,0x38, 0xff,0xc3,0xc2,0xc3,0xff,0xbe,0xbd,0xbd,0xff,0x28,0x2e,0x28,0xff,0x88,0x1e, 0x24,0x1e,0xff,0x11,0x21,0x27,0x21,0xff,0x5f,0x61,0x5e,0xff,0x90,0x8e,0x8f, 0xff,0x9e,0xa1,0xa8,0xff,0xb9,0xbb,0xc3,0xff,0xd9,0xdc,0xe4,0xff,0x9c,0x9f, 0xa6,0xff,0x85,0x87,0x8c,0xff,0xe6,0xe6,0xe6,0xff,0xe0,0xe2,0xe1,0xff,0xec, 0xeb,0xeb,0xff,0xff,0xff,0xff,0xff,0x6a,0x6c,0x6b,0xff,0xd0,0xd0,0xd0,0xff, 0x6f,0x6f,0x70,0xff,0xc0,0xc0,0xc0,0xff,0x8f,0x8f,0x8f,0xff,0x82,0xff,0xff, 0xff,0xff,0x05,0xfe,0xfe,0xff,0xff,0xff,0xfe,0xfe,0xff,0xff,0xfe,0xff,0xff, 0xff,0xff,0xfe,0xff,0xfe,0xfe,0xff,0xff,0x8a,0xff,0xff,0xff,0xff,0x18,0xf9, 0xf9,0xf9,0xff,0xe4,0xe4,0xe4,0xff,0xff,0xff,0xff,0xff,0xfd,0xfd,0xfb,0xff, 0x6c,0x6a,0x6b,0xff,0x88,0x88,0x88,0xff,0x81,0x81,0x81,0xff,0x6c,0x6c,0x6b, 0xff,0xea,0xea,0xea,0xff,0xff,0xff,0xff,0xff,0xd4,0xd5,0xd5,0xff,0xf4,0xf4, 0xf3,0xff,0xe6,0xe4,0xe6,0xff,0xd6,0xdb,0xe3,0xff,0xff,0xff,0xff,0xff,0xbc, 0xbd,0xc6,0xff,0x71,0x73,0x78,0xff,0x52,0x52,0x55,0xf5,0x00,0x00,0x00,0x51, 0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x14,0x00,0x00,0x00, 0x08,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x00,0x8a,0xff,0xff,0xff,0x00, 0x0e,0x80,0x80,0x80,0x01,0x76,0x76,0x76,0x0d,0xd2,0xd1,0xd2,0xcc,0xbf,0xbd, 0xbf,0xff,0xc9,0xc7,0xc8,0xff,0xc9,0xc7,0xc9,0xff,0xca,0xc8,0xc9,0xff,0xcb, 0xca,0xcb,0xff,0xa8,0xa7,0xa8,0xff,0xa0,0xa0,0xa2,0xff,0xc2,0xc2,0xc3,0xff, 0xc8,0xc7,0xc8,0xff,0xcd,0xcb,0xcd,0xff,0xcd,0xca,0xcc,0xff,0x82,0xcd,0xcb, 0xcc,0xff,0x04,0xce,0xcc,0xcd,0xff,0xcd,0xcb,0xcd,0xff,0xce,0xcb,0xcc,0xff, 0xcd,0xcb,0xcd,0xff,0x82,0xcd,0xcb,0xcc,0xff,0x14,0xcd,0xca,0xcc,0xff,0xcc, 0xcb,0xcc,0xff,0x58,0x5c,0x58,0xff,0x1e,0x25,0x1e,0xff,0x57,0x5a,0x56,0xff, 0xcc,0xca,0xcb,0xff,0x5c,0x5f,0x5c,0xff,0x1f,0x26,0x1f,0xff,0x85,0x86,0x83, 0xff,0xc9,0xc6,0xc7,0xff,0xc9,0xc7,0xc8,0xff,0x8d,0x8e,0x8c,0xff,0x59,0x5d, 0x59,0xff,0xcb,0xc9,0xc9,0xff,0xc8,0xc6,0xc8,0xff,0x93,0x94,0x93,0xff,0x1e, 0x24,0x1e,0xff,0x49,0x4e,0x49,0xff,0xca,0xc7,0xc8,0xff,0xbb,0xba,0xba,0xff, 0x88,0x1e,0x24,0x1e,0xff,0x0f,0x1d,0x23,0x1d,0xff,0x1c,0x22,0x1c,0xff,0x30, 0x34,0x30,0xff,0x82,0x83,0x88,0xff,0xbc,0xc0,0xc9,0xff,0xd1,0xd5,0xdd,0xff, 0xbc,0xbe,0xc5,0xff,0x7b,0x7d,0x84,0xff,0xc5,0xc6,0xc7,0xff,0xe8,0xea,0xe8, 0xff,0xae,0xaf,0xad,0xff,0xb5,0xb7,0xb6,0xff,0xbe,0xbf,0xbf,0xff,0xdb,0xdb, 0xdb,0xff,0xd9,0xd9,0xd9,0xff,0x89,0xff,0xff,0xff,0xff,0x03,0xfe,0xfe,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0x82,0xff,0xff,0xff,0xff,0x01, 0xfe,0xff,0xff,0xff,0x82,0xff,0xff,0xff,0xff,0x1a,0xfa,0xfb,0xfa,0xff,0xdc, 0xdc,0xdc,0xff,0xf7,0xf7,0xf7,0xff,0xfb,0xfb,0xfb,0xff,0xff,0xff,0xff,0xff, 0xad,0xad,0xad,0xff,0xf0,0xf0,0xf0,0xff,0x4d,0x4e,0x4e,0xff,0xff,0xff,0xff, 0xff,0x78,0x78,0x79,0xff,0xc8,0xc8,0xc8,0xff,0xe5,0xe5,0xe7,0xff,0xcc,0xce, 0xcd,0xff,0xff,0xff,0xff,0xff,0xac,0xb0,0xb7,0xff,0xfd,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x87,0x89,0x91,0xff,0x6a,0x6b,0x70,0xff,0x25,0x25,0x27,0xb9, 0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x11,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x89, 0xff,0xff,0xff,0x00,0x11,0x00,0x00,0x00,0x01,0x33,0x33,0x33,0x05,0xdf,0xde, 0xdf,0x7f,0xc3,0xc1,0xc2,0xff,0xc9,0xc6,0xc8,0xff,0xc9,0xc7,0xc8,0xff,0xca, 0xc8,0xc9,0xff,0xcc,0xca,0xcc,0xff,0xbb,0xb9,0xba,0xff,0x92,0x93,0x94,0xff, 0xc3,0xc2,0xc4,0xff,0xc5,0xc4,0xc5,0xff,0xcf,0xcc,0xce,0xff,0xcd,0xcb,0xcc, 0xff,0xce,0xcc,0xcd,0xff,0xce,0xcb,0xcd,0xff,0xce,0xcc,0xcd,0xff,0x82,0xce, 0xcc,0xcc,0xff,0x01,0xcd,0xcb,0xcd,0xff,0x84,0xcd,0xcb,0xcc,0xff,0x15,0xcd, 0xca,0xcc,0xff,0x82,0x85,0x82,0xff,0x21,0x27,0x21,0xff,0x3e,0x43,0x3d,0xff, 0xca,0xc8,0xc9,0xff,0x77,0x79,0x77,0xff,0x1e,0x25,0x1e,0xff,0x99,0x99,0x98, 0xff,0xc9,0xc7,0xc8,0xff,0xc7,0xc5,0xc6,0xff,0x31,0x37,0x31,0xff,0x1e,0x25, 0x1e,0xff,0x8c,0x8d,0x8c,0xff,0xc8,0xc6,0xc7,0xff,0xca,0xc8,0xc9,0xff,0x45, 0x4a,0x44,0xff,0x1e,0x24,0x1e,0xff,0xa6,0xa5,0xa5,0xff,0xc9,0xc7,0xc8,0xff, 0x6f,0x72,0x6f,0xff,0x20,0x27,0x20,0xff,0x86,0x1e,0x24,0x1e,0xff,0x0c,0x1d, 0x23,0x1d,0xff,0x1c,0x22,0x1b,0xff,0x9a,0x99,0x99,0xff,0x7b,0x7b,0x7d,0xff, 0xaf,0xb3,0xbb,0xff,0xbf,0xc2,0xca,0xff,0xd7,0xda,0xe2,0xff,0x92,0x94,0x9b, 0xff,0x91,0x93,0x98,0xff,0xe3,0xe3,0xe5,0xff,0xd4,0xd4,0xd4,0xff,0xef,0xef, 0xef,0xff,0x8c,0xff,0xff,0xff,0xff,0x04,0xfe,0xfe,0xff,0xff,0xff,0xff,0xfe, 0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0x82,0xff,0xff,0xff,0xff,0x05, 0xfa,0xfa,0xfb,0xff,0xd2,0xd2,0xd3,0xff,0xee,0xee,0xee,0xff,0xe9,0xea,0xe9, 0xff,0xd2,0xd2,0xd2,0xff,0x83,0xff,0xff,0xff,0xff,0x14,0x98,0x98,0x98,0xff, 0x83,0x83,0x83,0xff,0x91,0x93,0x93,0xff,0xd6,0xd6,0xd6,0xff,0xf5,0xf5,0xf6, 0xff,0xd4,0xd4,0xd4,0xff,0xec,0xed,0xed,0xff,0xef,0xf0,0xf1,0xff,0xc7,0xcb, 0xd4,0xff,0xff,0xff,0xff,0xff,0xd6,0xd9,0xdf,0xff,0x72,0x76,0x7b,0xff,0x66, 0x67,0x6a,0xff,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x2f, 0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x05,0x00,0x00,0x00, 0x01,0x82,0x00,0x00,0x00,0x00,0x89,0xff,0xff,0xff,0x00,0x0e,0x33,0x33,0x33, 0x03,0xd0,0xd0,0xd0,0x35,0xcc,0xca,0xcb,0xf4,0xc4,0xc2,0xc3,0xff,0xc9,0xc8, 0xc9,0xff,0xca,0xc8,0xc9,0xff,0xcc,0xca,0xcb,0xff,0xc9,0xc7,0xc8,0xff,0x98, 0x98,0x99,0xff,0xb6,0xb5,0xb8,0xff,0xc6,0xc5,0xc7,0xff,0xcd,0xcb,0xcd,0xff, 0xcf,0xcd,0xce,0xff,0xce,0xcc,0xcd,0xff,0x82,0xcd,0xcb,0xcd,0xff,0x05,0xce, 0xcb,0xcc,0xff,0xce,0xcb,0xcd,0xff,0xce,0xcb,0xcc,0xff,0xcd,0xcb,0xcd,0xff, 0xce,0xcb,0xcc,0xff,0x84,0xcd,0xcb,0xcc,0xff,0x11,0xc2,0xc1,0xc2,0xff,0x2d, 0x33,0x2d,0xff,0x22,0x28,0x22,0xff,0xc0,0xbf,0xbf,0xff,0xa8,0xa8,0xa7,0xff, 0x25,0x2b,0x24,0xff,0x5c,0x5f,0x5b,0xff,0xca,0xc9,0xc9,0xff,0x66,0x69,0x65, 0xff,0x22,0x28,0x22,0xff,0x1e,0x25,0x1e,0xff,0x80,0x82,0x80,0xff,0xbd,0xbb, 0xbc,0xff,0x9a,0x9a,0x99,0xff,0x63,0x66,0x62,0xff,0x1f,0x25,0x1f,0xff,0x55, 0x59,0x55,0xff,0x82,0xc2,0xc0,0xc1,0xff,0x01,0x2f,0x35,0x2f,0xff,0x86,0x1e, 0x24,0x1e,0xff,0x0d,0x1d,0x23,0x1d,0xff,0x67,0x6a,0x67,0xff,0xac,0xab,0xac, 0xff,0x9f,0x9d,0x9e,0xff,0xa4,0xa6,0xae,0xff,0xb6,0xb9,0xc1,0xff,0xd2,0xd6, 0xde,0xff,0xbe,0xc0,0xc8,0xff,0x7f,0x81,0x88,0xff,0xc3,0xc4,0xc6,0xff,0xf5, 0xf5,0xf4,0xff,0xd9,0xd9,0xda,0xff,0xf3,0xf5,0xf5,0xff,0x87,0xff,0xff,0xff, 0xff,0x02,0x9e,0x9e,0x9e,0xff,0xb1,0xb2,0xb2,0xff,0x86,0xff,0xff,0xff,0xff, 0x02,0xf9,0xf9,0xf9,0xff,0xe9,0xe9,0xe9,0xff,0x82,0xee,0xee,0xee,0xff,0x03, 0xd6,0xd6,0xd7,0xff,0xf5,0xf5,0xf6,0xff,0xfd,0xfe,0xfe,0xff,0x83,0xff,0xff, 0xff,0xff,0x08,0xb9,0xb9,0xb9,0xff,0xe0,0xde,0xe0,0xff,0xff,0xff,0xff,0xff, 0xf7,0xf7,0xf7,0xff,0xaa,0xaa,0xaa,0xff,0xa7,0xa9,0xa8,0xff,0xff,0xff,0xff, 0xff,0xab,0xad,0xb5,0xff,0x82,0xff,0xff,0xff,0xff,0x09,0x98,0x9a,0xa2,0xff, 0x6a,0x6b,0x70,0xff,0x46,0x46,0x48,0xeb,0x00,0x00,0x00,0x54,0x00,0x00,0x00, 0x3e,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0a,0x00,0x00, 0x00,0x03,0x83,0x00,0x00,0x00,0x00,0x88,0xff,0xff,0xff,0x00,0x04,0x00,0x00, 0x00,0x01,0x30,0x30,0x30,0x08,0xd9,0xd8,0xd9,0xc2,0xc0,0xbe,0xc0,0xff,0x82, 0xc9,0xc7,0xc9,0xff,0x07,0xcb,0xc9,0xca,0xff,0xce,0xcb,0xcd,0xff,0xae,0xad, 0xaf,0xff,0x9f,0x9f,0xa1,0xff,0xcb,0xca,0xcc,0xff,0xc9,0xc6,0xc9,0xff,0xd0, 0xcd,0xcf,0xff,0x82,0xce,0xcc,0xce,0xff,0x82,0xce,0xcc,0xcd,0xff,0x08,0xcd, 0xcc,0xcd,0xff,0xce,0xcc,0xcd,0xff,0xcd,0xcc,0xcd,0xff,0xcd,0xcb,0xcc,0xff, 0xce,0xcb,0xcc,0xff,0xcd,0xcb,0xcc,0xff,0xce,0xcb,0xcc,0xff,0xcc,0xcb,0xcc, 0xff,0x82,0xcd,0xcb,0xcc,0xff,0x08,0x45,0x4a,0x44,0xff,0x1e,0x25,0x1e,0xff, 0x92,0x93,0x92,0xff,0xcc,0xca,0xca,0xff,0x46,0x4b,0x46,0xff,0x1f,0x26,0x1f, 0xff,0x90,0x91,0x8f,0xff,0x33,0x38,0x33,0xff,0x82,0x1e,0x25,0x1e,0xff,0x09, 0x20,0x27,0x20,0xff,0x29,0x2f,0x29,0xff,0x20,0x27,0x20,0xff,0x1e,0x24,0x1e, 0xff,0x33,0x39,0x33,0xff,0x75,0x78,0x75,0xff,0xc0,0xbf,0xbf,0xff,0xc9,0xc7, 0xc8,0xff,0x4b,0x4f,0x4b,0xff,0x86,0x1e,0x24,0x1e,0xff,0x0e,0x2a,0x2f,0x2a, 0xff,0xab,0xaa,0xaa,0xff,0xb6,0xb4,0xb4,0xff,0xa9,0xa6,0xa8,0xff,0x78,0x78, 0x7b,0xff,0xab,0xad,0xb5,0xff,0xbb,0xbd,0xc5,0xff,0xdc,0xe0,0xe8,0xff,0x9f, 0xa2,0xa8,0xff,0x8b,0x8d,0x92,0xff,0xde,0xdd,0xde,0xff,0xee,0xef,0xee,0xff, 0xe0,0xe1,0xe1,0xff,0xf1,0xf2,0xf2,0xff,0x84,0xff,0xff,0xff,0xff,0x05,0xac, 0xac,0xae,0xff,0xa4,0xa5,0xa4,0xff,0xda,0xda,0xd8,0xff,0x93,0x93,0x93,0xff, 0xf3,0xf3,0xf3,0xff,0x84,0xff,0xff,0xff,0xff,0x05,0xf4,0xf4,0xf3,0xff,0xec, 0xec,0xed,0xff,0xfc,0xfc,0xfc,0xff,0xee,0xee,0xee,0xff,0xf3,0xf3,0xf3,0xff, 0x89,0xff,0xff,0xff,0xff,0x10,0xe6,0xe6,0xe7,0xff,0xca,0xca,0xca,0xff,0xfc, 0xfc,0xfd,0xff,0xd8,0xd9,0xdc,0xff,0xd4,0xd7,0xdf,0xff,0xff,0xff,0xff,0xff, 0xde,0xe0,0xe7,0xff,0x6e,0x71,0x76,0xff,0x66,0x67,0x6c,0xff,0x05,0x05,0x05, 0x76,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x21,0x00,0x00, 0x00,0x12,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x83,0x00,0x00,0x00,0x00, 0x87,0xff,0xff,0xff,0x00,0x0e,0x00,0x00,0x00,0x01,0x40,0x40,0x40,0x04,0xdf, 0xde,0xdf,0x72,0xc2,0xc0,0xc2,0xff,0xc6,0xc4,0xc6,0xff,0xc8,0xc6,0xc7,0xff, 0xc9,0xc7,0xc8,0xff,0xcc,0xca,0xcc,0xff,0xc0,0xbf,0xc0,0xff,0x95,0x95,0x97, 0xff,0xc7,0xc6,0xc9,0xff,0xc5,0xc4,0xc6,0xff,0xd0,0xce,0xcf,0xff,0xcf,0xcd, 0xcf,0xff,0x82,0xcf,0xcd,0xce,0xff,0x83,0xce,0xcc,0xcd,0xff,0x03,0xce,0xcb, 0xcd,0xff,0xce,0xcc,0xcd,0xff,0xce,0xcc,0xcc,0xff,0x83,0xcd,0xcb,0xcc,0xff, 0x01,0xcd,0xca,0xcc,0xff,0x82,0xcd,0xcb,0xcc,0xff,0x14,0xb1,0xb0,0xb0,0xff, 0x34,0x39,0x34,0xff,0x27,0x2d,0x26,0xff,0xb0,0xaf,0xaf,0xff,0xcb,0xc9,0xca, 0xff,0x40,0x46,0x40,0xff,0x92,0x93,0x92,0xff,0x6c,0x6f,0x6c,0xff,0x3c,0x40, 0x3b,0xff,0x29,0x2f,0x29,0xff,0x35,0x3a,0x34,0xff,0x3f,0x43,0x3e,0xff,0x6f, 0x71,0x6e,0xff,0xaf,0xae,0xae,0xff,0xc7,0xc6,0xc7,0xff,0xca,0xc7,0xc9,0xff, 0xb4,0xb3,0xb3,0xff,0x75,0x78,0x75,0xff,0x42,0x47,0x42,0xff,0x22,0x28,0x22, 0xff,0x85,0x1e,0x24,0x1e,0xff,0x0f,0x8f,0x8f,0x8e,0xff,0xc2,0xc0,0xc1,0xff, 0xb9,0xb8,0xb9,0xff,0xae,0xab,0xad,0xff,0x98,0x97,0x97,0xff,0x9d,0xa0,0xa6, 0xff,0xb0,0xb3,0xba,0xff,0xcb,0xcd,0xd5,0xff,0xce,0xd0,0xda,0xff,0x88,0x8a, 0x91,0xff,0x9a,0x9b,0x9f,0xff,0xff,0xff,0xff,0xff,0xd4,0xd4,0xd4,0xff,0xe4, 0xe4,0xe5,0xff,0xfb,0xfa,0xfa,0xff,0x82,0xff,0xff,0xff,0xff,0x06,0xe2,0xe1, 0xe0,0xff,0xd2,0xd4,0xd4,0xff,0x6e,0x6e,0x6e,0xff,0x77,0x77,0x78,0xff,0xd2, 0xd1,0xd2,0xff,0xbd,0xbc,0xbe,0xff,0x84,0xff,0xff,0xff,0xff,0x03,0xfa,0xfa, 0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0x84,0xff,0xff,0xff,0xff, 0x0b,0x89,0x8a,0x8a,0xff,0x69,0x69,0x69,0xff,0xce,0xcd,0xcd,0xff,0xff,0xff, 0xff,0xff,0xf0,0xf0,0xf1,0xff,0xff,0xff,0xff,0xff,0xf1,0xf1,0xf1,0xff,0xcc, 0xcd,0xcd,0xff,0xe7,0xe8,0xe8,0xff,0xff,0xff,0xff,0xff,0xb0,0xb3,0xbd,0xff, 0x82,0xff,0xff,0xff,0xff,0x0a,0x86,0x89,0x90,0xff,0x68,0x69,0x6e,0xff,0x45, 0x44,0x47,0xe6,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x2d, 0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x05,0x00,0x00,0x00, 0x01,0x83,0x00,0x00,0x00,0x00,0x87,0xff,0xff,0xff,0x00,0x0d,0x40,0x40,0x40, 0x02,0xc9,0xc9,0xc9,0x2a,0xcd,0xcc,0xcd,0xf0,0xbf,0xbe,0xbf,0xff,0xc8,0xc6, 0xc7,0xff,0xc9,0xc7,0xc8,0xff,0xcb,0xc9,0xcb,0xff,0xcc,0xca,0xcb,0xff,0x9c, 0x9c,0x9d,0xff,0xb5,0xb4,0xb6,0xff,0xcc,0xcb,0xcd,0xff,0xcc,0xca,0xcc,0xff, 0xd0,0xce,0xcf,0xff,0x82,0xcf,0xcd,0xcf,0xff,0x01,0xcf,0xcc,0xce,0xff,0x82, 0xce,0xcc,0xcd,0xff,0x04,0xcd,0xcc,0xcd,0xff,0xce,0xcc,0xcd,0xff,0xce,0xcc, 0xcc,0xff,0xce,0xcc,0xcd,0xff,0x86,0xcd,0xcb,0xcc,0xff,0x12,0xcc,0xca,0xcb, 0xff,0x8d,0x8d,0x8c,0xff,0x29,0x2f,0x29,0xff,0x33,0x39,0x33,0xff,0xae,0xae, 0xae,0xff,0x7e,0x7f,0x7d,0xff,0x70,0x73,0x70,0xff,0xb2,0xb1,0xb1,0xff,0xca, 0xc8,0xc9,0xff,0xcb,0xc9,0xca,0xff,0xca,0xc9,0xc9,0xff,0xc0,0xbe,0xc0,0xff, 0xbc,0xbb,0xbb,0xff,0x9f,0x9f,0x9e,0xff,0x65,0x68,0x64,0xff,0x35,0x3a,0x35, 0xff,0x25,0x2b,0x25,0xff,0x20,0x26,0x1f,0xff,0x86,0x1e,0x24,0x1e,0xff,0x17, 0x4e,0x51,0x4d,0xff,0xb1,0xb0,0xaf,0xff,0xc3,0xc1,0xc2,0xff,0xbd,0xba,0xbc, 0xff,0xb3,0xb1,0xb3,0xff,0xa5,0xa4,0xa5,0xff,0x75,0x77,0x79,0xff,0xa4,0xa6, 0xae,0xff,0xa9,0xac,0xb3,0xff,0xdb,0xdc,0xe6,0xff,0xbb,0xbd,0xc4,0xff,0x79, 0x7b,0x81,0xff,0xba,0xbb,0xbf,0xff,0xea,0xeb,0xeb,0xff,0xd8,0xd8,0xd8,0xff, 0xdc,0xdd,0xde,0xff,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xd3,0xd3,0xd3, 0xff,0x74,0x74,0x73,0xff,0x88,0x88,0x8a,0xff,0xa8,0xa8,0xa8,0xff,0x9c,0x9d, 0x9c,0xff,0x83,0xff,0xff,0xff,0xff,0x03,0xfb,0xfb,0xfb,0xff,0x37,0x37,0x38, 0xff,0xfc,0xfb,0xfb,0xff,0x84,0xff,0xff,0xff,0xff,0x19,0x97,0x96,0x97,0xff, 0x6b,0x6b,0x6c,0xff,0xac,0xac,0xad,0xff,0xd7,0xd7,0xd7,0xff,0x95,0x95,0x95, 0xff,0xdb,0xdb,0xdc,0xff,0xf4,0xf4,0xf4,0xff,0xf1,0xf1,0xf1,0xff,0xd2,0xd3, 0xd2,0xff,0xda,0xdc,0xdb,0xff,0xff,0xff,0xff,0xff,0xa9,0xab,0xb4,0xff,0xfd, 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xb5,0xb7,0xbe,0xff,0x63,0x65,0x6b,0xff, 0x61,0x63,0x66,0xff,0x02,0x02,0x02,0x68,0x00,0x00,0x00,0x4e,0x00,0x00,0x00, 0x39,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x01,0x83,0x00,0x00,0x00,0x00,0x86,0xfd,0xfd,0xfd, 0x00,0x0d,0x00,0x00,0x00,0x01,0x33,0x33,0x33,0x08,0xdc,0xdb,0xdc,0xb6,0xbd, 0xbb,0xbd,0xff,0xc6,0xc5,0xc6,0xff,0xc8,0xc6,0xc8,0xff,0xca,0xc8,0xca,0xff, 0xcd,0xcb,0xcc,0xff,0xb2,0xb1,0xb2,0xff,0x9a,0x9a,0x9c,0xff,0xd1,0xd0,0xd2, 0xff,0xc8,0xc6,0xc8,0xff,0xd1,0xcf,0xd0,0xff,0x82,0xcf,0xcd,0xcf,0xff,0x01, 0xcf,0xcd,0xce,0xff,0x84,0xce,0xcc,0xcd,0xff,0x02,0xce,0xcb,0xcd,0xff,0xcd, 0xcb,0xcd,0xff,0x82,0xce,0xcb,0xcd,0xff,0x01,0xce,0xcb,0xcc,0xff,0x82,0xcd, 0xcb,0xcc,0xff,0x16,0xcc,0xcb,0xcc,0xff,0xcd,0xca,0xcc,0xff,0xcd,0xcb,0xcc, 0xff,0xcd,0xca,0xcb,0xff,0xa5,0xa5,0xa4,0xff,0x37,0x3c,0x37,0xff,0x48,0x4c, 0x47,0xff,0x5a,0x5e,0x5a,0xff,0x2a,0x30,0x2a,0xff,0x1e,0x25,0x1e,0xff,0x29, 0x2f,0x28,0xff,0x2d,0x33,0x2d,0xff,0x27,0x2d,0x27,0xff,0x25,0x2c,0x25,0xff, 0x20,0x27,0x20,0xff,0x1e,0x24,0x1e,0xff,0x20,0x26,0x1f,0xff,0x1e,0x25,0x1e, 0xff,0x2e,0x33,0x2d,0xff,0x6d,0x6f,0x6c,0xff,0x72,0x74,0x71,0xff,0x32,0x38, 0x32,0xff,0x84,0x1e,0x24,0x1e,0xff,0x14,0x8d,0x8f,0x8d,0xff,0xc7,0xc4,0xc6, 0xff,0xc5,0xc3,0xc4,0xff,0xc1,0xbf,0xc0,0xff,0xb8,0xb6,0xb7,0xff,0xac,0xaa, 0xab,0xff,0x9d,0x9b,0x9c,0xff,0x78,0x7a,0x7e,0xff,0xb1,0xb4,0xbb,0xff,0xb5, 0xb8,0xc0,0xff,0xde,0xe1,0xe9,0xff,0xad,0xb0,0xb7,0xff,0x80,0x83,0x8a,0xff, 0xc1,0xc2,0xc4,0xff,0xff,0xff,0xff,0xff,0xd4,0xd5,0xd5,0xff,0xdd,0xdd,0xdd, 0xff,0xfc,0xfc,0xfc,0xff,0xea,0xea,0xea,0xff,0xee,0xed,0xed,0xff,0x84,0xff, 0xff,0xff,0xff,0x06,0xf3,0xf3,0xf2,0xff,0x5b,0x5b,0x5b,0xff,0xa5,0xa5,0xa5, 0xff,0x84,0x84,0x83,0xff,0x6a,0x6b,0x6b,0xff,0xc9,0xc9,0xc8,0xff,0x82,0xff, 0xff,0xff,0xff,0x19,0xbc,0xbc,0xbc,0xff,0xd0,0xd0,0xd0,0xff,0x72,0x72,0x72, 0xff,0x75,0x76,0x75,0xff,0x86,0x86,0x86,0xff,0xa1,0xa1,0xa1,0xff,0xff,0xff, 0xff,0xff,0xea,0xea,0xea,0xff,0xd7,0xd8,0xd7,0xff,0xe1,0xe0,0xe0,0xff,0xff, 0xff,0xff,0xff,0xa3,0xa7,0xac,0xff,0xed,0xf0,0xf5,0xff,0xff,0xff,0xff,0xff, 0xda,0xdc,0xe5,0xff,0x6b,0x6d,0x73,0xff,0x63,0x65,0x68,0xff,0x1e,0x1e,0x1e, 0xac,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x2e,0x00,0x00, 0x00,0x1c,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x84, 0x00,0x00,0x00,0x00,0x85,0xfe,0xfe,0xfe,0x00,0x0f,0x00,0x00,0x00,0x01,0x40, 0x40,0x40,0x04,0xe0,0xdf,0xe0,0x67,0xc4,0xc3,0xc5,0xff,0xc1,0xc0,0xc1,0xff, 0xc5,0xc4,0xc6,0xff,0xc9,0xc7,0xc9,0xff,0xcc,0xca,0xcb,0xff,0xc4,0xc2,0xc4, 0xff,0x91,0x91,0x93,0xff,0xc8,0xc7,0xc9,0xff,0xca,0xc9,0xca,0xff,0xcf,0xcd, 0xcf,0xff,0xd0,0xce,0xcf,0xff,0xcf,0xcd,0xce,0xff,0x88,0xce,0xcc,0xcd,0xff, 0x04,0xce,0xcb,0xcc,0xff,0xcd,0xcc,0xcd,0xff,0xcd,0xcb,0xcc,0xff,0xcd,0xcc, 0xcc,0xff,0x82,0xcd,0xcb,0xcc,0xff,0x02,0xcc,0xca,0xcc,0xff,0xcd,0xca,0xcc, 0xff,0x82,0xcc,0xca,0xcb,0xff,0x0e,0xba,0xb9,0xb9,0xff,0x91,0x92,0x90,0xff, 0xae,0xad,0xae,0xff,0xcb,0xca,0xca,0xff,0xb4,0xb2,0xb2,0xff,0x84,0x86,0x83, 0xff,0x69,0x6b,0x68,0xff,0x5b,0x5e,0x5a,0xff,0x55,0x59,0x54,0xff,0x5d,0x61, 0x5d,0xff,0x73,0x75,0x72,0xff,0x95,0x96,0x94,0xff,0xbd,0xbc,0xbd,0xff,0xc9, 0xc8,0xc8,0xff,0x82,0xc9,0xc7,0xc8,0xff,0x01,0x78,0x7a,0x77,0xff,0x83,0x1e, 0x24,0x1e,0xff,0x14,0x66,0x69,0x65,0xff,0xc6,0xc3,0xc4,0xff,0xc7,0xc5,0xc6, 0xff,0xc5,0xc3,0xc4,0xff,0xc3,0xc0,0xc2,0xff,0xbd,0xbb,0xbb,0xff,0xb3,0xb2, 0xb3,0xff,0xa5,0xa5,0xa5,0xff,0x7b,0x79,0x7a,0xff,0x8e,0x91,0x95,0xff,0x9e, 0xa1,0xa8,0xff,0xb6,0xb9,0xc0,0xff,0xe4,0xe6,0xef,0xff,0xb0,0xb2,0xba,0xff, 0x7f,0x81,0x87,0xff,0xca,0xcb,0xcc,0xff,0xf6,0xf6,0xf6,0xff,0xdc,0xdb,0xdb, 0xff,0xd3,0xd4,0xd4,0xff,0xb0,0xb1,0xb1,0xff,0x85,0xff,0xff,0xff,0xff,0x06, 0xc8,0xc9,0xc9,0xff,0xe0,0xe0,0xe0,0xff,0x57,0x57,0x57,0xff,0xdf,0xe0,0xdf, 0xff,0x49,0x49,0x49,0xff,0xd5,0xd5,0xd5,0xff,0x83,0xff,0xff,0xff,0xff,0x18, 0xe2,0xe2,0xe2,0xff,0x7d,0x7d,0x7d,0xff,0xce,0xce,0xce,0xff,0xb2,0xb2,0xb3, 0xff,0xfe,0xfe,0xfe,0xff,0xe6,0xe6,0xe7,0xff,0xc9,0xc9,0xc9,0xff,0xe3,0xe4, 0xe4,0xff,0xff,0xff,0xff,0xff,0xb2,0xb4,0xbb,0xff,0xea,0xec,0xf2,0xff,0xff, 0xff,0xff,0xff,0xf4,0xf6,0xf9,0xff,0x72,0x74,0x7b,0xff,0x5e,0x5f,0x65,0xff, 0x4a,0x4b,0x4d,0xef,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x4b,0x00,0x00,0x00, 0x36,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x01,0x84,0x00,0x00,0x00,0x00,0x85,0xfe,0xfe,0xfe, 0x00,0x1a,0x40,0x40,0x40,0x02,0xbf,0xbf,0xc0,0x23,0xd0,0xcf,0xd1,0xea,0xbc, 0xbb,0xbc,0xff,0xc6,0xc4,0xc6,0xff,0xc7,0xc5,0xc7,0xff,0xc9,0xc7,0xc9,0xff, 0xcd,0xcb,0xcc,0xff,0xa0,0xa0,0xa1,0xff,0xae,0xae,0xb0,0xff,0xd4,0xd2,0xd4, 0xff,0xcb,0xc9,0xca,0xff,0xd1,0xce,0xd0,0xff,0xcf,0xcd,0xcf,0xff,0xcf,0xcc, 0xce,0xff,0xce,0xcc,0xcd,0xff,0xcf,0xcc,0xcd,0xff,0xcd,0xcb,0xcc,0xff,0xcc, 0xca,0xcb,0xff,0xcc,0xcb,0xcc,0xff,0xcd,0xcb,0xcc,0xff,0xce,0xcc,0xcd,0xff, 0xcd,0xcc,0xcd,0xff,0xce,0xcc,0xcd,0xff,0xcd,0xcc,0xcc,0xff,0xcd,0xcb,0xcd, 0xff,0x82,0xcd,0xcb,0xcc,0xff,0x0f,0xcd,0xcb,0xcb,0xff,0xcd,0xcb,0xcc,0xff, 0xcd,0xca,0xcc,0xff,0xcd,0xcb,0xcb,0xff,0xcd,0xca,0xcb,0xff,0xa2,0xa2,0xa2, 0xff,0x3a,0x3f,0x39,0xff,0x1e,0x25,0x1e,0xff,0x38,0x3d,0x38,0xff,0x7b,0x7d, 0x7a,0xff,0xa1,0xa0,0x9f,0xff,0xbd,0xbc,0xbd,0xff,0xcb,0xc9,0xc9,0xff,0xca, 0xc8,0xca,0xff,0xca,0xc9,0xc9,0xff,0x82,0xca,0xc8,0xc9,0xff,0x1f,0xc9,0xc8, 0xc9,0xff,0xca,0xc8,0xc8,0xff,0xca,0xc7,0xc8,0xff,0xc9,0xc7,0xc8,0xff,0xc5, 0xc3,0xc4,0xff,0x66,0x69,0x65,0xff,0x1e,0x24,0x1e,0xff,0x39,0x3e,0x39,0xff, 0x9e,0x9e,0x9d,0xff,0xc7,0xc6,0xc7,0xff,0xc7,0xc6,0xc6,0xff,0xc7,0xc5,0xc6, 0xff,0xc5,0xc3,0xc4,0xff,0xc1,0xbf,0xc0,0xff,0xb9,0xb8,0xb9,0xff,0xae,0xac, 0xad,0xff,0xa0,0x9e,0x9f,0xff,0x78,0x78,0x78,0xff,0xa1,0xa5,0xab,0xff,0xa3, 0xa6,0xad,0xff,0xbf,0xc2,0xc9,0xff,0xe7,0xe9,0xf2,0xff,0xba,0xbe,0xc5,0xff, 0x86,0x88,0x8e,0xff,0xa2,0xa4,0xa8,0xff,0xf9,0xf8,0xf8,0xff,0xcf,0xce,0xce, 0xff,0xd4,0xd4,0xd5,0xff,0xdb,0xdc,0xdc,0xff,0xf9,0xfa,0xf9,0xff,0xfd,0xfe, 0xfe,0xff,0x83,0xff,0xff,0xff,0xff,0x1f,0xec,0xec,0xec,0xff,0x43,0x43,0x43, 0xff,0xca,0xca,0xcb,0xff,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xfb,0xfb, 0xfa,0xff,0xea,0xea,0xea,0xff,0xe2,0xe2,0xe2,0xff,0xce,0xce,0xce,0xff,0xd7, 0xd7,0xd7,0xff,0xff,0xff,0xff,0xff,0xae,0xae,0xae,0xff,0xd2,0xd3,0xd1,0xff, 0xd1,0xd1,0xd1,0xff,0xff,0xff,0xff,0xff,0xf4,0xf4,0xf5,0xff,0xb3,0xb7,0xbd, 0xff,0xf5,0xf8,0xfc,0xff,0xff,0xff,0xff,0xff,0xf5,0xf6,0xfa,0xff,0x75,0x77, 0x7e,0xff,0x5e,0x60,0x64,0xff,0x5d,0x5e,0x60,0xff,0x00,0x00,0x00,0x62,0x00, 0x00,0x00,0x51,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x1a, 0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x85,0x00,0x00, 0x00,0x00,0x84,0xfb,0xfb,0xfb,0x00,0x12,0x00,0x00,0x00,0x01,0x37,0x37,0x37, 0x07,0xdd,0xdc,0xde,0xab,0xbb,0xba,0xbb,0xff,0xc3,0xc2,0xc3,0xff,0xc6,0xc4, 0xc6,0xff,0xc9,0xc7,0xc9,0xff,0xcb,0xc9,0xca,0xff,0xb8,0xb7,0xb8,0xff,0x95, 0x95,0x96,0xff,0xd6,0xd4,0xd7,0xff,0xc9,0xc8,0xc9,0xff,0xd2,0xcf,0xd1,0xff, 0xd0,0xce,0xd0,0xff,0xcf,0xcd,0xce,0xff,0xce,0xcc,0xcd,0xff,0xcf,0xcd,0xce, 0xff,0xce,0xcc,0xcd,0xff,0x83,0xcc,0xca,0xcb,0xff,0x07,0xcb,0xc9,0xcb,0xff, 0xcc,0xca,0xcb,0xff,0xcc,0xca,0xcc,0xff,0xcd,0xcb,0xcc,0xff,0xcd,0xcc,0xcc, 0xff,0xcd,0xcb,0xcc,0xff,0xcd,0xcc,0xcc,0xff,0x84,0xcd,0xcb,0xcc,0xff,0x82, 0xcc,0xca,0xcb,0xff,0x02,0xba,0xb9,0xb9,0xff,0x5f,0x63,0x5f,0xff,0x83,0x1e, 0x25,0x1e,0xff,0x82,0x21,0x27,0x20,0xff,0x0d,0x25,0x2c,0x25,0xff,0x3d,0x42, 0x3d,0xff,0x49,0x4d,0x49,0xff,0x57,0x5b,0x57,0xff,0x65,0x68,0x64,0xff,0x62, 0x65,0x61,0xff,0x68,0x6a,0x67,0xff,0x60,0x63,0x60,0xff,0x4f,0x53,0x4e,0xff, 0x37,0x3c,0x37,0xff,0x20,0x27,0x20,0xff,0x1e,0x24,0x1e,0xff,0x6c,0x6e,0x6b, 0xff,0x82,0xc8,0xc6,0xc7,0xff,0x1b,0xc7,0xc5,0xc6,0xff,0xc7,0xc6,0xc6,0xff, 0xc7,0xc5,0xc5,0xff,0xc2,0xc1,0xc1,0xff,0xbe,0xbc,0xbd,0xff,0xb6,0xb4,0xb5, 0xff,0xab,0xa8,0xaa,0xff,0x9c,0x9a,0x9b,0xff,0x66,0x66,0x68,0xff,0xa4,0xa7, 0xae,0xff,0x98,0x9b,0xa2,0xff,0xb5,0xb7,0xbf,0xff,0xec,0xf0,0xf9,0xff,0xd2, 0xd5,0xdc,0xff,0x8a,0x8d,0x93,0xff,0x83,0x84,0x8b,0xff,0xde,0xdf,0xe1,0xff, 0xff,0xff,0xff,0xff,0xde,0xdd,0xde,0xff,0xd6,0xd7,0xd7,0xff,0xde,0xdd,0xdd, 0xff,0xed,0xee,0xee,0xff,0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xcb,0xcb, 0xcb,0xff,0xfc,0xfd,0xfd,0xff,0xdb,0xdb,0xdb,0xff,0x83,0xff,0xff,0xff,0xff, 0x19,0xf1,0xf1,0xf1,0xff,0xf4,0xf4,0xf4,0xff,0xf9,0xf9,0xf9,0xff,0xe1,0xe2, 0xe2,0xff,0xd1,0xd1,0xd1,0xff,0xae,0xaf,0xaf,0xff,0xe1,0xe0,0xe0,0xff,0xff, 0xff,0xff,0xff,0xd3,0xd4,0xd7,0xff,0xa9,0xac,0xb5,0xff,0xfa,0xfb,0xfc,0xff, 0xff,0xff,0xff,0xff,0xef,0xf0,0xf3,0xff,0x7c,0x80,0x85,0xff,0x5a,0x5e,0x61, 0xff,0x58,0x57,0x5c,0xfe,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x55,0x00,0x00, 0x00,0x43,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x85,0x00,0x00,0x00, 0x00,0x84,0xfe,0xfe,0xfe,0x00,0x0e,0x24,0x24,0x24,0x04,0xdd,0xdd,0xdd,0x5b, 0xc3,0xc2,0xc3,0xff,0xc0,0xbf,0xc0,0xff,0xc6,0xc4,0xc6,0xff,0xc7,0xc6,0xc7, 0xff,0xca,0xc8,0xca,0xff,0xc6,0xc4,0xc5,0xff,0x92,0x92,0x94,0xff,0xc2,0xc1, 0xc3,0xff,0xcf,0xcd,0xd0,0xff,0xce,0xcc,0xce,0xff,0xd0,0xcd,0xd0,0xff,0xcf, 0xcd,0xcf,0xff,0x83,0xcf,0xcd,0xce,0xff,0x84,0xcc,0xca,0xcb,0xff,0x04,0xcb, 0xc9,0xcb,0xff,0xcc,0xc9,0xcb,0xff,0xcb,0xc9,0xca,0xff,0xcb,0xca,0xca,0xff, 0x82,0xcc,0xca,0xcb,0xff,0x01,0xcd,0xca,0xcc,0xff,0x84,0xcd,0xcb,0xcc,0xff, 0x01,0xcd,0xcb,0xcb,0xff,0x82,0xcd,0xca,0xcb,0xff,0x04,0xcc,0xca,0xcb,0xff, 0xcc,0xca,0xca,0xff,0xab,0xab,0xaa,0xff,0x47,0x4b,0x47,0xff,0x87,0x1e,0x25, 0x1e,0xff,0x86,0x1e,0x24,0x1e,0xff,0x2b,0x45,0x49,0x44,0xff,0xbe,0xbc,0xbd, 0xff,0xc8,0xc6,0xc7,0xff,0xc7,0xc6,0xc7,0xff,0xc7,0xc5,0xc6,0xff,0xc7,0xc5, 0xc7,0xff,0xc6,0xc4,0xc5,0xff,0xc5,0xc3,0xc4,0xff,0xc2,0xc0,0xc0,0xff,0xbc, 0xb9,0xba,0xff,0xb3,0xb1,0xb2,0xff,0xa7,0xa5,0xa6,0xff,0x98,0x97,0x98,0xff, 0x68,0x67,0x69,0xff,0xa2,0xa4,0xab,0xff,0x9f,0xa1,0xa9,0xff,0xab,0xae,0xb4, 0xff,0xe8,0xea,0xf2,0xff,0xe8,0xea,0xf3,0xff,0x9f,0xa3,0xaa,0xff,0x80,0x82, 0x86,0xff,0xad,0xaf,0xb2,0xff,0xe3,0xe3,0xe4,0xff,0xf9,0xf9,0xf9,0xff,0xe7, 0xe8,0xe8,0xff,0xd9,0xd9,0xd8,0xff,0xd6,0xd6,0xd8,0xff,0xd6,0xd6,0xd6,0xff, 0xe0,0xe0,0xe0,0xff,0xd0,0xd1,0xd1,0xff,0xc5,0xc6,0xc6,0xff,0xe2,0xe2,0xe4, 0xff,0xe5,0xe6,0xe6,0xff,0xda,0xdb,0xda,0xff,0xd3,0xd3,0xd3,0xff,0xd1,0xd1, 0xd1,0xff,0xd2,0xd2,0xd1,0xff,0xd6,0xd4,0xd4,0xff,0xf8,0xf9,0xf7,0xff,0xff, 0xff,0xff,0xff,0xe4,0xe5,0xe7,0xff,0x97,0x9a,0xa2,0xff,0xd5,0xd8,0xdf,0xff, 0x82,0xff,0xff,0xff,0xff,0x0d,0xd8,0xda,0xe0,0xff,0x75,0x77,0x7d,0xff,0x54, 0x57,0x5b,0xff,0x5b,0x5c,0x5f,0xff,0x03,0x03,0x03,0x70,0x00,0x00,0x00,0x58, 0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x23,0x00,0x00,0x00, 0x15,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x86,0x00, 0x00,0x00,0x00,0x83,0xff,0xff,0xff,0x00,0x14,0x55,0x55,0x55,0x02,0xb6,0xb6, 0xb6,0x1b,0xd4,0xd3,0xd4,0xe3,0xbc,0xba,0xbc,0xff,0xc5,0xc4,0xc6,0xff,0xc7, 0xc5,0xc7,0xff,0xc8,0xc6,0xc8,0xff,0xc9,0xc7,0xc9,0xff,0xa4,0xa3,0xa4,0xff, 0xa3,0xa3,0xa6,0xff,0xda,0xd8,0xda,0xff,0xc9,0xc7,0xc9,0xff,0xd0,0xce,0xd0, 0xff,0xcf,0xcd,0xce,0xff,0xd0,0xce,0xcf,0xff,0xcf,0xcd,0xce,0xff,0xd0,0xcd, 0xcf,0xff,0xcd,0xcb,0xcc,0xff,0xcc,0xca,0xcb,0xff,0xcc,0xc9,0xcb,0xff,0x83, 0xcc,0xca,0xcb,0xff,0x02,0xcb,0xca,0xcb,0xff,0xcb,0xca,0xca,0xff,0x82,0xcc, 0xc9,0xca,0xff,0x04,0xcb,0xca,0xca,0xff,0xcc,0xca,0xca,0xff,0xcc,0xc9,0xca, 0xff,0xcc,0xca,0xca,0xff,0x82,0xcd,0xca,0xcb,0xff,0x03,0xcd,0xca,0xcc,0xff, 0xcc,0xcb,0xcb,0xff,0xcd,0xca,0xcb,0xff,0x82,0xcc,0xca,0xcb,0xff,0x05,0xcc, 0xc9,0xca,0xff,0xcc,0xca,0xca,0xff,0xc8,0xc5,0xc7,0xff,0x91,0x92,0x90,0xff, 0x33,0x38,0x33,0xff,0x85,0x1e,0x25,0x1e,0xff,0x84,0x1e,0x24,0x1e,0xff,0x1a, 0x29,0x2f,0x29,0xff,0x7b,0x7e,0x7b,0xff,0xc9,0xc6,0xc7,0xff,0xc8,0xc6,0xc7, 0xff,0xc8,0xc5,0xc7,0xff,0xc7,0xc5,0xc7,0xff,0xc7,0xc6,0xc7,0xff,0xc7,0xc5, 0xc6,0xff,0xc6,0xc4,0xc5,0xff,0xc5,0xc2,0xc4,0xff,0xc0,0xbe,0xc0,0xff,0xba, 0xb8,0xba,0xff,0xb0,0xae,0xaf,0xff,0xa5,0xa3,0xa4,0xff,0x95,0x94,0x94,0xff, 0x60,0x5f,0x60,0xff,0x9a,0x9c,0xa2,0xff,0x9d,0xa0,0xa6,0xff,0x98,0x9b,0xa1, 0xff,0xd4,0xd6,0xdc,0xff,0xf4,0xf6,0xfc,0xff,0xd7,0xd9,0xde,0xff,0x96,0x9a, 0xa0,0xff,0x7e,0x80,0x87,0xff,0x8e,0x8f,0x95,0xff,0xd5,0xd6,0xd8,0xff,0x82, 0xff,0xff,0xff,0xff,0x0f,0xf0,0xee,0xee,0xff,0xe4,0xe4,0xe3,0xff,0xcd,0xcd, 0xcd,0xff,0xcf,0xce,0xce,0xff,0xdc,0xde,0xdc,0xff,0xce,0xce,0xcd,0xff,0xe0, 0xde,0xdf,0xff,0xe7,0xe7,0xe6,0xff,0xef,0xf0,0xef,0xff,0xff,0xff,0xff,0xff, 0xf4,0xf4,0xf5,0xff,0xcf,0xd0,0xd3,0xff,0x91,0x93,0x9b,0xff,0xc9,0xcb,0xd2, 0xff,0xfc,0xfd,0xff,0xff,0x82,0xff,0xff,0xff,0xff,0x0e,0xaf,0xb1,0xb8,0xff, 0x60,0x61,0x68,0xff,0x53,0x55,0x59,0xff,0x62,0x62,0x65,0xff,0x05,0x05,0x06, 0x72,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x36,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x86,0x00,0x00,0x00,0x00,0x82,0xff,0xfe, 0xff,0x00,0x0d,0x00,0x00,0x00,0x01,0x40,0x40,0x40,0x06,0xe0,0xdf,0xe0,0xa0, 0xbb,0xba,0xbc,0xff,0xc4,0xc2,0xc4,0xff,0xc6,0xc4,0xc6,0xff,0xc7,0xc5,0xc6, 0xff,0xc7,0xc5,0xc7,0xff,0xb7,0xb6,0xb8,0xff,0x90,0x90,0x92,0xff,0xd4,0xd3, 0xd6,0xff,0xcb,0xc9,0xcb,0xff,0xcf,0xcc,0xce,0xff,0x82,0xcf,0xcd,0xce,0xff, 0x03,0xd0,0xce,0xcf,0xff,0xd0,0xcd,0xce,0xff,0xcd,0xcb,0xcc,0xff,0x83,0xcc, 0xca,0xcb,0xff,0x01,0xcc,0xc9,0xcb,0xff,0x83,0xcc,0xca,0xcb,0xff,0x07,0xcb, 0xca,0xcb,0xff,0xcb,0xc9,0xcb,0xff,0xcc,0xc9,0xcb,0xff,0xcb,0xc9,0xca,0xff, 0xcc,0xc9,0xcb,0xff,0xcc,0xc9,0xca,0xff,0xcb,0xc9,0xca,0xff,0x82,0xcc,0xc9, 0xca,0xff,0x02,0xcb,0xc9,0xca,0xff,0xcc,0xca,0xca,0xff,0x85,0xcc,0xca,0xcb, 0xff,0x82,0xcb,0xc9,0xca,0xff,0x04,0xcb,0xc9,0xc9,0xff,0xc3,0xc1,0xc2,0xff, 0x76,0x78,0x75,0xff,0x21,0x27,0x20,0xff,0x83,0x1e,0x25,0x1e,0xff,0x83,0x1e, 0x24,0x1e,0xff,0x02,0x45,0x49,0x44,0xff,0xc9,0xc6,0xc7,0xff,0x83,0xc8,0xc6, 0xc7,0xff,0x03,0xc7,0xc5,0xc7,0xff,0xc7,0xc6,0xc6,0xff,0xc7,0xc5,0xc6,0xff, 0x82,0xc6,0xc4,0xc5,0xff,0x1f,0xc3,0xc1,0xc3,0xff,0xbf,0xbe,0xbe,0xff,0xb8, 0xb6,0xb7,0xff,0xae,0xac,0xad,0xff,0xa2,0xa1,0xa1,0xff,0x96,0x94,0x95,0xff, 0x6c,0x6a,0x6b,0xff,0x7f,0x80,0x83,0xff,0x9c,0x9f,0xa5,0xff,0x90,0x94,0x9a, 0xff,0xac,0xaf,0xb5,0xff,0xec,0xed,0xf5,0xff,0xff,0xff,0xff,0xff,0xde,0xdf, 0xe4,0xff,0xad,0xb0,0xb6,0xff,0x89,0x8b,0x93,0xff,0x76,0x7b,0x80,0xff,0x87, 0x89,0x8e,0xff,0x9e,0xa1,0xa4,0xff,0xc3,0xc4,0xc7,0xff,0xd8,0xd8,0xda,0xff, 0xec,0xed,0xed,0xff,0xf4,0xf3,0xf4,0xff,0xea,0xeb,0xec,0xff,0xe9,0xe9,0xea, 0xff,0xd0,0xd1,0xd2,0xff,0xb6,0xb7,0xbb,0xff,0xa7,0xab,0xb1,0xff,0x9f,0xa1, 0xa9,0xff,0xd2,0xd5,0xdb,0xff,0xfd,0xfe,0xff,0xff,0x82,0xff,0xff,0xff,0xff, 0x0f,0xcb,0xcc,0xd3,0xff,0x7b,0x7f,0x84,0xff,0x5b,0x5d,0x61,0xff,0x54,0x55, 0x59,0xff,0x3b,0x3b,0x3e,0xd7,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x48,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x19, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x01,0x87,0x00,0x00,0x00,0x00,0x82,0xff,0xfe,0xff,0x00,0x0e,0x2b,0x2b,0x2b, 0x03,0xdd,0xdc,0xdc,0x50,0xc8,0xc6,0xc8,0xfe,0xbf,0xbe,0xbf,0xff,0xc4,0xc3, 0xc4,0xff,0xc7,0xc5,0xc6,0xff,0xc5,0xc4,0xc5,0xff,0xc2,0xc1,0xc2,0xff,0x92, 0x91,0x93,0xff,0xc2,0xc2,0xc3,0xff,0xdc,0xda,0xdc,0xff,0xcb,0xc9,0xcb,0xff, 0xd0,0xcd,0xcf,0xff,0xd1,0xce,0xd0,0xff,0x82,0xd0,0xce,0xcf,0xff,0x01,0xce, 0xcc,0xcd,0xff,0x84,0xcc,0xca,0xcb,0xff,0x02,0xcb,0xca,0xcb,0xff,0xcc,0xca, 0xcb,0xff,0x82,0xcc,0xca,0xca,0xff,0x03,0xcc,0xca,0xcb,0xff,0xcc,0xc9,0xca, 0xff,0xcc,0xca,0xca,0xff,0x82,0xcc,0xc9,0xca,0xff,0x83,0xcb,0xc9,0xca,0xff, 0x82,0xcc,0xc9,0xca,0xff,0x03,0xcb,0xc9,0xca,0xff,0xcc,0xc9,0xca,0xff,0xcb, 0xc8,0xc9,0xff,0x82,0xcb,0xc9,0xca,0xff,0x01,0xcc,0xc9,0xcb,0xff,0x82,0xcb, 0xc9,0xca,0xff,0x07,0xca,0xc9,0xca,0xff,0xcb,0xc9,0xc9,0xff,0xcb,0xc8,0xc9, 0xff,0xca,0xc8,0xca,0xff,0xbe,0xbd,0xbd,0xff,0x5d,0x60,0x5c,0xff,0x1e,0x25, 0x1e,0xff,0x82,0x1e,0x24,0x1e,0xff,0x03,0x28,0x2e,0x28,0xff,0xa9,0xa7,0xa8, 0xff,0xc9,0xc7,0xc7,0xff,0x82,0xc8,0xc6,0xc8,0xff,0x14,0xc8,0xc6,0xc6,0xff, 0xc8,0xc6,0xc7,0xff,0xc7,0xc6,0xc6,0xff,0xc7,0xc5,0xc6,0xff,0xc7,0xc5,0xc7, 0xff,0xc6,0xc4,0xc4,0xff,0xc5,0xc3,0xc3,0xff,0xc3,0xc1,0xc2,0xff,0xbe,0xbd, 0xbd,0xff,0xb7,0xb4,0xb5,0xff,0xae,0xac,0xad,0xff,0xa1,0x9f,0xa0,0xff,0xa4, 0xa2,0xa3,0xff,0xa2,0xa1,0xa1,0xff,0x5b,0x5b,0x5e,0xff,0xa7,0xaa,0xaf,0xff, 0x9c,0x9f,0xa5,0xff,0x8d,0x8f,0x97,0xff,0xac,0xaf,0xb6,0xff,0xe2,0xe2,0xe8, 0xff,0x82,0xff,0xff,0xff,0xff,0x0c,0xec,0xec,0xf0,0xff,0xc9,0xcc,0xd1,0xff, 0xb5,0xb7,0xbe,0xff,0xa2,0xa4,0xac,0xff,0x8c,0x90,0x99,0xff,0x8e,0x92,0x98, 0xff,0x8d,0x8f,0x95,0xff,0x97,0x99,0xa1,0xff,0xa0,0xa5,0xac,0xff,0xb6,0xba, 0xc0,0xff,0xe5,0xe7,0xec,0xff,0xf4,0xf5,0xf8,0xff,0x83,0xff,0xff,0xff,0xff, 0x10,0xc7,0xca,0xcf,0xff,0x86,0x8a,0x91,0xff,0x64,0x66,0x6a,0xff,0x51,0x53, 0x58,0xff,0x49,0x4a,0x4d,0xff,0x27,0x27,0x27,0xa9,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0x55,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x27, 0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x01,0x88,0x00,0x00,0x00,0x00,0x0d,0xff,0xff,0xff,0x00, 0x55,0x55,0x55,0x02,0x9e,0x9e,0x9e,0x15,0xd5,0xd5,0xd5,0xda,0xbd,0xbb,0xbd, 0xff,0xc5,0xc4,0xc5,0xff,0xc6,0xc4,0xc6,0xff,0xc6,0xc4,0xc5,0xff,0xc4,0xc3, 0xc4,0xff,0xc1,0xbf,0xc1,0xff,0x9d,0x9d,0x9f,0xff,0xf8,0xf7,0xf8,0xff,0xe2, 0xe0,0xe2,0xff,0x82,0xd1,0xce,0xd0,0xff,0x02,0xd1,0xcf,0xd0,0xff,0xd1,0xce, 0xd0,0xff,0x82,0xd0,0xce,0xcf,0xff,0x02,0xce,0xcc,0xcd,0xff,0xcb,0xca,0xcb, 0xff,0x84,0xcc,0xca,0xcb,0xff,0x0a,0xcc,0xc9,0xcb,0xff,0xcb,0xc9,0xcb,0xff, 0xcc,0xc9,0xcb,0xff,0xcc,0xca,0xca,0xff,0xcc,0xc9,0xcb,0xff,0xcb,0xca,0xca, 0xff,0xcb,0xc9,0xcb,0xff,0xcc,0xc9,0xca,0xff,0xcb,0xc9,0xca,0xff,0xcc,0xc9, 0xca,0xff,0x83,0xcb,0xc9,0xca,0xff,0x82,0xcb,0xc9,0xc9,0xff,0x05,0xcb,0xc8, 0xca,0xff,0xcb,0xc8,0xc9,0xff,0xcb,0xc8,0xca,0xff,0xcb,0xc8,0xc9,0xff,0xcc, 0xc9,0xca,0xff,0x82,0xcb,0xc9,0xca,0xff,0x02,0xcb,0xc8,0xca,0xff,0xcb,0xc8, 0xc9,0xff,0x82,0xca,0xc8,0xc9,0xff,0x07,0xc8,0xc6,0xc7,0xff,0xa7,0xa8,0xa6, 0xff,0x46,0x4b,0x46,0xff,0x5f,0x63,0x5f,0xff,0xc9,0xc7,0xc8,0xff,0xc8,0xc7, 0xc8,0xff,0xc9,0xc6,0xc7,0xff,0x82,0xc8,0xc6,0xc7,0xff,0x03,0xc7,0xc5,0xc7, 0xff,0xc8,0xc5,0xc7,0xff,0xc7,0xc5,0xc7,0xff,0x82,0xc7,0xc5,0xc6,0xff,0x12, 0xc6,0xc4,0xc5,0xff,0xc5,0xc3,0xc3,0xff,0xc1,0xc0,0xc0,0xff,0xbc,0xba,0xbb, 0xff,0xb7,0xb5,0xb5,0xff,0xae,0xad,0xad,0xff,0xc6,0xc4,0xc5,0xff,0x9a,0x98, 0x9a,0xff,0x6f,0x6e,0x6e,0xff,0x5c,0x5c,0x5c,0xff,0x74,0x75,0x78,0xff,0x98, 0x9a,0xa0,0xff,0x8b,0x8e,0x95,0xff,0x87,0x8b,0x91,0xff,0x9d,0x9f,0xa6,0xff, 0xbe,0xc0,0xc7,0xff,0xd9,0xdd,0xdf,0xff,0xfa,0xf9,0xfc,0xff,0x89,0xff,0xff, 0xff,0xff,0x13,0xf9,0xf9,0xfb,0xff,0xd3,0xd4,0xdb,0xff,0xa5,0xa8,0xad,0xff, 0x74,0x76,0x7d,0xff,0x66,0x68,0x6d,0xff,0x61,0x63,0x69,0xff,0x50,0x51,0x53, 0xff,0x41,0x41,0x42,0xd3,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x5c,0x00,0x00, 0x00,0x50,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x19,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x01,0x89,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x2e, 0x2e,0x2e,0x06,0xdf,0xdf,0xe0,0x94,0xc1,0xbf,0xc1,0xff,0xc5,0xc3,0xc5,0xff, 0xc6,0xc4,0xc6,0xff,0xc7,0xc5,0xc7,0xff,0xc8,0xc6,0xc8,0xff,0xc6,0xc4,0xc6, 0xff,0xd8,0xd6,0xd8,0xff,0xf9,0xf9,0xfa,0xff,0xff,0xff,0xff,0xff,0xfb,0xfa, 0xfb,0xff,0xea,0xe8,0xea,0xff,0xdc,0xda,0xdc,0xff,0xd3,0xd1,0xd2,0xff,0x82, 0xd1,0xce,0xd0,0xff,0x09,0xd1,0xcf,0xd0,0xff,0xd1,0xce,0xcf,0xff,0xcf,0xcd, 0xce,0xff,0xce,0xcc,0xcd,0xff,0xcc,0xca,0xcb,0xff,0xcc,0xca,0xca,0xff,0xcc, 0xca,0xcb,0xff,0xcc,0xc9,0xcb,0xff,0xcb,0xca,0xcb,0xff,0x82,0xcc,0xc9,0xcb, 0xff,0x04,0xcc,0xc9,0xca,0xff,0xcc,0xc9,0xcb,0xff,0xcc,0xc9,0xca,0xff,0xcb, 0xc9,0xca,0xff,0x82,0xcc,0xc9,0xca,0xff,0x82,0xcb,0xc9,0xca,0xff,0x0c,0xcc, 0xc9,0xca,0xff,0xcb,0xc9,0xca,0xff,0xcc,0xc8,0xc9,0xff,0xcb,0xc8,0xca,0xff, 0xcb,0xc9,0xca,0xff,0xcb,0xc8,0xc9,0xff,0xcb,0xc9,0xc9,0xff,0xcb,0xc8,0xca, 0xff,0xca,0xc9,0xc9,0xff,0xcb,0xc8,0xc9,0xff,0xca,0xc9,0xca,0xff,0xcb,0xc8, 0xc9,0xff,0x82,0xca,0xc8,0xc9,0xff,0x02,0xc9,0xc8,0xc8,0xff,0xca,0xc8,0xc9, 0xff,0x83,0xc9,0xc7,0xc8,0xff,0x03,0xc8,0xc7,0xc8,0xff,0xc8,0xc6,0xc7,0xff, 0xc9,0xc6,0xc7,0xff,0x82,0xc8,0xc6,0xc7,0xff,0x02,0xc8,0xc5,0xc7,0xff,0xc8, 0xc6,0xc7,0xff,0x83,0xc7,0xc5,0xc6,0xff,0x2c,0xc5,0xc3,0xc3,0xff,0xc3,0xc0, 0xc1,0xff,0xc1,0xbf,0xc0,0xff,0xba,0xb8,0xb9,0xff,0xcd,0xcc,0xcd,0xff,0xce, 0xcc,0xcd,0xff,0x8a,0x89,0x8a,0xff,0x8b,0x8b,0x8b,0xff,0x96,0x94,0x96,0xff, 0x89,0x88,0x89,0xff,0x64,0x64,0x65,0xff,0x65,0x66,0x68,0xff,0x86,0x87,0x8c, 0xff,0x89,0x8c,0x91,0xff,0x85,0x88,0x8d,0xff,0x85,0x87,0x8f,0xff,0x92,0x95, 0x9b,0xff,0x9a,0x9c,0xa5,0xff,0xa6,0xa8,0xae,0xff,0xbb,0xbd,0xc4,0xff,0xbb, 0xbd,0xc3,0xff,0xb7,0xb9,0xc1,0xff,0xb6,0xb8,0xbf,0xff,0xb0,0xb3,0xb8,0xff, 0x96,0x9a,0xa1,0xff,0x87,0x89,0x90,0xff,0x7b,0x7e,0x84,0xff,0x6b,0x6d,0x72, 0xff,0x71,0x71,0x76,0xff,0x78,0x7a,0x7f,0xff,0x53,0x54,0x57,0xf8,0x36,0x35, 0x36,0xce,0x02,0x02,0x02,0x69,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x55,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x22, 0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x01,0x8a,0x00,0x00,0x00,0x00,0x0b,0x2b,0x2b,0x2b,0x03, 0xda,0xda,0xda,0x45,0xcc,0xca,0xcc,0xfc,0xcd,0xcb,0xcd,0xff,0xd2,0xd0,0xd2, 0xff,0xcc,0xca,0xcc,0xff,0xcc,0xca,0xcb,0xff,0xcc,0xca,0xcc,0xff,0xcd,0xca, 0xcc,0xff,0xd4,0xd2,0xd3,0xff,0xfc,0xfc,0xfc,0xff,0x83,0xff,0xff,0xff,0xff, 0x07,0xfb,0xfa,0xfb,0xff,0xf1,0xef,0xf1,0xff,0xe4,0xe1,0xe3,0xff,0xd8,0xd5, 0xd7,0xff,0xd2,0xd0,0xd1,0xff,0xd0,0xce,0xcf,0xff,0xd0,0xcd,0xcf,0xff,0x82, 0xd0,0xce,0xcf,0xff,0x02,0xce,0xcc,0xcd,0xff,0xcd,0xca,0xcc,0xff,0x82,0xcc, 0xca,0xcb,0xff,0x09,0xcc,0xc9,0xca,0xff,0xcb,0xc9,0xca,0xff,0xcc,0xca,0xcb, 0xff,0xcc,0xca,0xca,0xff,0xcb,0xca,0xcb,0xff,0xcc,0xc9,0xca,0xff,0xcb,0xc9, 0xca,0xff,0xcc,0xc9,0xca,0xff,0xcc,0xc9,0xc9,0xff,0x83,0xcb,0xc9,0xca,0xff, 0x02,0xcc,0xc9,0xc9,0xff,0xcb,0xc9,0xca,0xff,0x83,0xcb,0xc9,0xc9,0xff,0x03, 0xcb,0xc8,0xc9,0xff,0xcb,0xc8,0xca,0xff,0xca,0xc8,0xc9,0xff,0x82,0xcb,0xc8, 0xc9,0xff,0x02,0xcb,0xc8,0xc8,0xff,0xca,0xc8,0xc9,0xff,0x82,0xca,0xc7,0xc9, 0xff,0x01,0xca,0xc7,0xc8,0xff,0x82,0xc9,0xc7,0xc8,0xff,0x02,0xc8,0xc6,0xc8, 0xff,0xc9,0xc6,0xc7,0xff,0x82,0xc8,0xc6,0xc7,0xff,0x03,0xc7,0xc6,0xc7,0xff, 0xc7,0xc6,0xc6,0xff,0xc8,0xc5,0xc6,0xff,0x82,0xc7,0xc5,0xc6,0xff,0x2b,0xc7, 0xc4,0xc6,0xff,0xc5,0xc3,0xc3,0xff,0xc4,0xc2,0xc3,0xff,0xc3,0xc1,0xc2,0xff, 0xc4,0xc3,0xc4,0xff,0xe8,0xe6,0xe7,0xff,0xb4,0xb2,0xb4,0xff,0x92,0x91,0x91, 0xff,0xaa,0xa7,0xa8,0xff,0xa3,0xa1,0xa2,0xff,0x99,0x97,0x98,0xff,0x90,0x8f, 0x90,0xff,0x88,0x87,0x87,0xff,0x84,0x82,0x83,0xff,0x49,0x49,0x4a,0xfe,0x60, 0x61,0x65,0xf1,0x82,0x84,0x8a,0xff,0x92,0x93,0x9a,0xff,0x8b,0x8d,0x92,0xff, 0x84,0x86,0x8c,0xff,0x81,0x83,0x88,0xff,0x80,0x81,0x87,0xff,0x7f,0x81,0x86, 0xff,0x7a,0x7c,0x82,0xff,0x80,0x82,0x88,0xff,0x84,0x85,0x8c,0xff,0x7a,0x7c, 0x7f,0xff,0x78,0x7a,0x7e,0xff,0x65,0x65,0x69,0xff,0x38,0x38,0x3a,0xd3,0x14, 0x14,0x15,0x9d,0x01,0x01,0x01,0x65,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x55, 0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x35,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x07,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x01,0x89,0x00,0x00,0x00, 0x00,0x0e,0x80,0x80,0x80,0x01,0x89,0x89,0x89,0x11,0xd8,0xd7,0xd8,0xd1,0xcd, 0xcb,0xcc,0xff,0x8e,0x8e,0x8e,0xff,0x6b,0x6b,0x6c,0xff,0xc9,0xc7,0xc9,0xff, 0xd5,0xd3,0xd4,0xff,0xd2,0xd0,0xd2,0xff,0xd1,0xce,0xd0,0xff,0xd2,0xcf,0xd1, 0xff,0xe1,0xdf,0xe0,0xff,0xf4,0xf3,0xf4,0xff,0xfa,0xfa,0xfa,0xff,0x83,0xff, 0xff,0xff,0xff,0x05,0xff,0xfe,0xfe,0xff,0xf7,0xf6,0xf7,0xff,0xec,0xea,0xec, 0xff,0xe0,0xdc,0xde,0xff,0xd5,0xd2,0xd4,0xff,0x82,0xd0,0xce,0xcf,0xff,0x09, 0xd1,0xce,0xcf,0xff,0xd1,0xcd,0xcf,0xff,0xd0,0xcd,0xce,0xff,0xce,0xcc,0xcd, 0xff,0xcc,0xca,0xca,0xff,0xcc,0xc9,0xca,0xff,0xcc,0xca,0xcb,0xff,0xcc,0xc9, 0xca,0xff,0xcb,0xca,0xca,0xff,0x83,0xcb,0xc9,0xca,0xff,0x04,0xcb,0xc9,0xc9, 0xff,0xcc,0xc9,0xca,0xff,0xcb,0xc8,0xca,0xff,0xcc,0xc8,0xca,0xff,0x82,0xcb, 0xc9,0xca,0xff,0x83,0xcb,0xc8,0xc9,0xff,0x02,0xcb,0xc8,0xca,0xff,0xcb,0xc8, 0xc9,0xff,0x82,0xca,0xc8,0xc9,0xff,0x07,0xcb,0xc8,0xc9,0xff,0xca,0xc7,0xc9, 0xff,0xcb,0xc8,0xc9,0xff,0xcb,0xc7,0xc9,0xff,0xca,0xc8,0xc8,0xff,0xc9,0xc7, 0xc9,0xff,0xc9,0xc8,0xc8,0xff,0x82,0xc9,0xc7,0xc8,0xff,0x01,0xc9,0xc7,0xc7, 0xff,0x83,0xc8,0xc6,0xc7,0xff,0x02,0xc8,0xc5,0xc6,0xff,0xc8,0xc5,0xc7,0xff, 0x82,0xc7,0xc5,0xc6,0xff,0x2b,0xc7,0xc5,0xc5,0xff,0xc5,0xc3,0xc4,0xff,0xc7, 0xc4,0xc5,0xff,0xc2,0xc0,0xc0,0xff,0xe0,0xdf,0xe0,0xff,0xdb,0xd9,0xda,0xff, 0x9e,0x9d,0x9e,0xff,0xac,0xaa,0xaa,0xff,0xba,0xb8,0xb9,0xff,0xb1,0xaf,0xaf, 0xff,0xa8,0xa7,0xa8,0xff,0xa0,0x9e,0x9f,0xff,0x9a,0x98,0x99,0xff,0x8f,0x8e, 0x8e,0xff,0x35,0x35,0x35,0xda,0x15,0x15,0x15,0x86,0x0c,0x0c,0x0c,0x85,0x0a, 0x0a,0x0a,0x88,0x1c,0x1b,0x1c,0xa2,0x2f,0x2e,0x30,0xba,0x35,0x36,0x39,0xc6, 0x4e,0x4f,0x51,0xe0,0x3f,0x3f,0x41,0xda,0x33,0x33,0x34,0xc8,0x3e,0x3e,0x40, 0xd8,0x20,0x20,0x21,0xb6,0x0d,0x0d,0x0e,0x8d,0x04,0x04,0x04,0x7f,0x00,0x00, 0x00,0x62,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x51,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x2c, 0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x0a,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x82,0x19, 0x19,0x1a,0x00,0x88,0x00,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x01,0x33,0x33, 0x33,0x05,0xe9,0xe7,0xe8,0x87,0xcd,0xcb,0xcd,0xff,0xd2,0xd0,0xd1,0xff,0x6b, 0x6b,0x6b,0xff,0x5c,0x5d,0x5d,0xff,0xcc,0xca,0xcc,0xff,0xda,0xd8,0xd9,0xff, 0xd7,0xd5,0xd6,0xff,0xd6,0xd4,0xd6,0xff,0xd6,0xd3,0xd5,0xff,0xd5,0xd3,0xd4, 0xff,0xd5,0xd2,0xd4,0xff,0xd2,0xd0,0xd1,0xff,0xdc,0xdb,0xdb,0xff,0xeb,0xe9, 0xea,0xff,0xf7,0xf5,0xf7,0xff,0x82,0xff,0xfe,0xff,0xff,0x06,0xff,0xfd,0xfe, 0xff,0xfc,0xfb,0xfc,0xff,0xf4,0xf2,0xf3,0xff,0xe7,0xe4,0xe6,0xff,0xdb,0xd8, 0xda,0xff,0xd4,0xd1,0xd3,0xff,0x82,0xd1,0xcf,0xd0,0xff,0x05,0xd2,0xcf,0xd0, 0xff,0xd1,0xce,0xcf,0xff,0xce,0xcc,0xcd,0xff,0xcd,0xcb,0xcb,0xff,0xcb,0xca, 0xca,0xff,0x84,0xcb,0xc9,0xca,0xff,0x82,0xcc,0xc9,0xca,0xff,0x03,0xcb,0xc9, 0xca,0xff,0xcb,0xc8,0xca,0xff,0xcb,0xc9,0xca,0xff,0x82,0xcb,0xc9,0xc9,0xff, 0x02,0xca,0xc8,0xca,0xff,0xca,0xc9,0xc9,0xff,0x82,0xcb,0xc8,0xc9,0xff,0x04, 0xcb,0xc7,0xc9,0xff,0xca,0xc8,0xc9,0xff,0xcb,0xc8,0xc9,0xff,0xcb,0xc7,0xc8, 0xff,0x82,0xca,0xc8,0xc9,0xff,0x02,0xca,0xc8,0xc8,0xff,0xca,0xc7,0xc8,0xff, 0x82,0xca,0xc8,0xc8,0xff,0x01,0xc9,0xc7,0xc8,0xff,0x84,0xc8,0xc6,0xc7,0xff, 0x1a,0xc8,0xc6,0xc6,0xff,0xc8,0xc5,0xc7,0xff,0xc7,0xc5,0xc7,0xff,0xc7,0xc5, 0xc6,0xff,0xc6,0xc4,0xc4,0xff,0xc7,0xc5,0xc5,0xff,0xc5,0xc3,0xc4,0xff,0xce, 0xcc,0xcc,0xff,0xf0,0xee,0xef,0xff,0xb6,0xb4,0xb5,0xff,0xa2,0xa1,0xa2,0xff, 0xc1,0xbf,0xc0,0xff,0xbf,0xbd,0xbe,0xff,0xbb,0xb9,0xba,0xff,0xb6,0xb4,0xb5, 0xff,0xaf,0xad,0xae,0xff,0xb2,0xb0,0xb1,0xff,0x6e,0x6d,0x6d,0xfa,0x24,0x24, 0x24,0x91,0x16,0x16,0x16,0x65,0x0a,0x0a,0x0a,0x55,0x03,0x03,0x03,0x4f,0x00, 0x00,0x00,0x50,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x59, 0x82,0x00,0x00,0x00,0x5a,0x12,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x56,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x49, 0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x33,0x00,0x00,0x00, 0x2a,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x13,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,0x8b,0x00,0x00,0x00,0x00,0x07,0x40,0x40,0x40,0x02,0x3b,0x3b, 0x3b,0x0d,0xe2,0xe1,0xe2,0xd5,0xe8,0xe6,0xe8,0xff,0xdf,0xdc,0xde,0xff,0xd5, 0xd3,0xd5,0xff,0xd6,0xd4,0xd5,0xff,0x82,0xd9,0xd7,0xd9,0xff,0x04,0xdb,0xd8, 0xda,0xff,0xda,0xd8,0xda,0xff,0xda,0xd7,0xd9,0xff,0xd7,0xd5,0xd6,0xff,0x82, 0xd5,0xd2,0xd3,0xff,0x0e,0xd2,0xd0,0xd1,0xff,0xd1,0xcf,0xcf,0xff,0xd3,0xd0, 0xd2,0xff,0xdc,0xda,0xdc,0xff,0xee,0xeb,0xed,0xff,0xf9,0xf8,0xf9,0xff,0xfe, 0xfd,0xfe,0xff,0xfe,0xfe,0xff,0xff,0xfd,0xfc,0xfd,0xff,0xf9,0xf8,0xf9,0xff, 0xf1,0xef,0xf0,0xff,0xe4,0xe1,0xe3,0xff,0xd8,0xd6,0xd7,0xff,0xd3,0xd0,0xd1, 0xff,0x83,0xd1,0xcf,0xd0,0xff,0x02,0xd0,0xcd,0xce,0xff,0xce,0xcb,0xcc,0xff, 0x83,0xcb,0xc9,0xca,0xff,0x82,0xcb,0xc8,0xca,0xff,0x02,0xcb,0xc9,0xca,0xff, 0xcb,0xc8,0xca,0xff,0x82,0xcb,0xc8,0xc9,0xff,0x01,0xcb,0xc9,0xca,0xff,0x83, 0xcb,0xc8,0xc9,0xff,0x0b,0xca,0xc8,0xc9,0xff,0xcb,0xc8,0xc9,0xff,0xcb,0xc7, 0xc9,0xff,0xca,0xc8,0xc9,0xff,0xcb,0xc8,0xc8,0xff,0xca,0xc8,0xc9,0xff,0xca, 0xc7,0xc9,0xff,0xcb,0xc7,0xc8,0xff,0xca,0xc8,0xc8,0xff,0xca,0xc7,0xc9,0xff, 0xca,0xc8,0xc8,0xff,0x83,0xca,0xc7,0xc8,0xff,0x01,0xc9,0xc7,0xc8,0xff,0x82, 0xc8,0xc6,0xc6,0xff,0x19,0xc7,0xc6,0xc7,0xff,0xc7,0xc6,0xc6,0xff,0xc6,0xc4, 0xc5,0xff,0xc7,0xc5,0xc5,0xff,0xc7,0xc5,0xc6,0xff,0xc3,0xc1,0xc2,0xff,0xe8, 0xe6,0xe7,0xff,0xdb,0xd8,0xd9,0xff,0xa1,0xa0,0xa1,0xff,0xba,0xb8,0xb9,0xff, 0xc7,0xc5,0xc6,0xff,0xc4,0xc2,0xc3,0xff,0xc3,0xc1,0xc2,0xff,0xbe,0xbd,0xbd, 0xff,0xbe,0xbc,0xbd,0xff,0xac,0xaa,0xab,0xff,0x3f,0x3f,0x3e,0xc1,0x24,0x24, 0x24,0x5e,0x16,0x16,0x16,0x45,0x08,0x08,0x08,0x36,0x02,0x02,0x02,0x34,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x42, 0x82,0x00,0x00,0x00,0x44,0x0f,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x3e,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x31, 0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x1f,0x00,0x00,0x00, 0x19,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x01,0x8c,0x00,0x00,0x00, 0x00,0x10,0x39,0x39,0x39,0x05,0x37,0x37,0x37,0x17,0x8e,0x8e,0x8d,0xe2,0x93, 0x93,0x92,0xff,0xc0,0xbe,0xbf,0xff,0xe0,0xdf,0xe0,0xff,0xea,0xe7,0xe9,0xff, 0xe2,0xe0,0xe2,0xff,0xdb,0xd9,0xda,0xff,0xda,0xd7,0xda,0xff,0xdc,0xd9,0xdb, 0xff,0xdb,0xd9,0xdb,0xff,0xda,0xd7,0xd9,0xff,0xd8,0xd5,0xd7,0xff,0xd7,0xd4, 0xd5,0xff,0xd5,0xd3,0xd4,0xff,0x82,0xd5,0xd2,0xd3,0xff,0x1b,0xd2,0xcf,0xd0, 0xff,0xd0,0xce,0xce,0xff,0xd3,0xd1,0xd2,0xff,0xdf,0xdd,0xde,0xff,0xf0,0xed, 0xef,0xff,0xfb,0xf9,0xfb,0xff,0xfe,0xfd,0xfe,0xff,0xfd,0xfc,0xfd,0xff,0xfc, 0xfb,0xfc,0xff,0xf6,0xf4,0xf5,0xff,0xeb,0xe9,0xeb,0xff,0xdf,0xdd,0xde,0xff, 0xd5,0xd3,0xd4,0xff,0xd2,0xcf,0xd0,0xff,0xd1,0xcf,0xd0,0xff,0xd1,0xce,0xcf, 0xff,0xd0,0xce,0xcf,0xff,0xce,0xcb,0xcc,0xff,0xcb,0xc9,0xc9,0xff,0xcb,0xc8, 0xca,0xff,0xcb,0xc9,0xca,0xff,0xcb,0xc8,0xca,0xff,0xcb,0xc8,0xc9,0xff,0xcb, 0xc9,0xc9,0xff,0xcb,0xc8,0xca,0xff,0xcb,0xc8,0xc9,0xff,0xcb,0xc9,0xc9,0xff, 0x83,0xcb,0xc8,0xc9,0xff,0x82,0xca,0xc8,0xc9,0xff,0x08,0xca,0xc7,0xc9,0xff, 0xca,0xc8,0xc9,0xff,0xcb,0xc7,0xc8,0xff,0xcb,0xc8,0xc9,0xff,0xca,0xc8,0xc8, 0xff,0xca,0xc7,0xc8,0xff,0xca,0xc8,0xc9,0xff,0xca,0xc7,0xc9,0xff,0x82,0xca, 0xc7,0xc8,0xff,0x01,0xca,0xc7,0xc9,0xff,0x82,0xca,0xc7,0xc8,0xff,0x01,0xc9, 0xc7,0xc8,0xff,0x82,0xc7,0xc5,0xc5,0xff,0x08,0xc7,0xc5,0xc6,0xff,0xc8,0xc5, 0xc6,0xff,0xc4,0xc2,0xc2,0xff,0xd4,0xd3,0xd4,0xff,0xf1,0xee,0xef,0xff,0xb1, 0xb0,0xb1,0xff,0xa8,0xa7,0xa7,0xff,0xc8,0xc6,0xc7,0xff,0x82,0xc7,0xc5,0xc6, 0xff,0x0d,0xc6,0xc4,0xc5,0xff,0xc4,0xc2,0xc3,0xff,0xca,0xc8,0xc9,0xff,0x71, 0x71,0x70,0xf2,0x33,0x33,0x33,0x6c,0x27,0x27,0x27,0x40,0x18,0x18,0x18,0x27, 0x08,0x08,0x08,0x1f,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x23,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x2b,0x82,0x00,0x00,0x00,0x2c,0x0f, 0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x28,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x19,0x00,0x00, 0x00,0x15,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01, 0x8e,0x00,0x00,0x00,0x00,0x0c,0x37,0x37,0x37,0x07,0x38,0x38,0x38,0x1e,0x69, 0x69,0x67,0x70,0x63,0x62,0x60,0xc9,0x67,0x66,0x65,0xf5,0x7a,0x79,0x79,0xff, 0xa2,0xa1,0xa2,0xff,0xcc,0xcb,0xcc,0xff,0xe7,0xe4,0xe6,0xff,0xea,0xe7,0xe9, 0xff,0xe2,0xdf,0xe1,0xff,0xdc,0xd9,0xdb,0xff,0x82,0xda,0xd7,0xd9,0xff,0x03, 0xd9,0xd7,0xd9,0xff,0xd8,0xd6,0xd7,0xff,0xd7,0xd4,0xd5,0xff,0x82,0xd5,0xd2, 0xd4,0xff,0x0f,0xd6,0xd3,0xd5,0xff,0xd5,0xd3,0xd4,0xff,0xd2,0xd0,0xd1,0xff, 0xd0,0xce,0xcf,0xff,0xd7,0xd5,0xd5,0xff,0xe3,0xe1,0xe3,0xff,0xf2,0xf0,0xf2, 0xff,0xfb,0xfa,0xfc,0xff,0xfd,0xfb,0xfd,0xff,0xfc,0xfb,0xfc,0xff,0xf8,0xf6, 0xf7,0xff,0xf0,0xee,0xf0,0xff,0xe6,0xe3,0xe4,0xff,0xdb,0xd8,0xd9,0xff,0xd3, 0xd0,0xd2,0xff,0x83,0xd0,0xce,0xcf,0xff,0x05,0xcf,0xcc,0xcd,0xff,0xcc,0xca, 0xca,0xff,0xcb,0xc8,0xca,0xff,0xcb,0xc9,0xca,0xff,0xcb,0xc8,0xc9,0xff,0x82, 0xcb,0xc8,0xca,0xff,0x02,0xcb,0xc8,0xc9,0xff,0xca,0xc9,0xc9,0xff,0x83,0xca, 0xc8,0xc9,0xff,0x82,0xca,0xc7,0xc8,0xff,0x02,0xcb,0xc8,0xc9,0xff,0xcb,0xc7, 0xc9,0xff,0x82,0xca,0xc8,0xc9,0xff,0x82,0xca,0xc7,0xc9,0xff,0x04,0xcb,0xc8, 0xc9,0xff,0xca,0xc7,0xc9,0xff,0xca,0xc7,0xc8,0xff,0xca,0xc7,0xc9,0xff,0x82, 0xca,0xc7,0xc8,0xff,0x01,0xc8,0xc5,0xc6,0xff,0x82,0xc7,0xc5,0xc6,0xff,0x24, 0xc8,0xc5,0xc6,0xff,0xc7,0xc5,0xc6,0xff,0xc4,0xc2,0xc3,0xff,0xed,0xeb,0xed, 0xff,0xd3,0xd1,0xd2,0xff,0x9c,0x9b,0x9c,0xff,0xbf,0xbd,0xbe,0xff,0xc9,0xc6, 0xc7,0xff,0xc9,0xc7,0xc8,0xff,0xc8,0xc7,0xc8,0xff,0xc7,0xc5,0xc6,0xff,0xcd, 0xcb,0xcc,0xff,0xae,0xac,0xad,0xff,0x40,0x40,0x3f,0xa8,0x33,0x33,0x33,0x46, 0x2c,0x2c,0x2c,0x25,0x1c,0x1c,0x1c,0x13,0x00,0x00,0x00,0x0e,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x17,0x00,0x00, 0x00,0x18,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x19,0x00, 0x00,0x00,0x18,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x12, 0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x09,0x00,0x00,0x00, 0x07,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x01,0x90, 0x00,0x00,0x00,0x00 }; static const GdkPixdata clock_pixdata = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 21109, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 480, /* rowstride */ 120, /* width */ 60, /* height */ clock_pixdata_pixel_data /* pixel_data */ }; nvidia-settings/src/image_data/nvidia_icon_pixdata.h0000775000175000017500000015617712236467170023075 0ustar albertoalberto/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static guint8 nvidia_icon_pixdata_pixel_data[] = { 0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00, 0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00, 0xe6,0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x01,0x97,0x00,0x00,0x00,0x02, 0x82,0x00,0x00,0x00,0x01,0x9b,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x03, 0x3c,0x5b,0x04,0x38,0xa4,0xd5,0x4a,0xa3,0xbb,0xea,0x64,0xa5,0xbb,0xea,0x65, 0xa5,0xbb,0xea,0x65,0xa6,0xbd,0xea,0x6a,0xa6,0xbf,0xea,0x6e,0xa7,0xbf,0xea, 0x6f,0xa7,0x82,0xbf,0xea,0x6f,0xa8,0x08,0xbf,0xea,0x70,0xa9,0xbf,0xeb,0x71, 0xaa,0xc0,0xeb,0x71,0xaa,0xc0,0xeb,0x72,0xaa,0xc0,0xeb,0x72,0xab,0xc1,0xec, 0x73,0xac,0xc1,0xec,0x72,0xad,0xc1,0xec,0x73,0xad,0x82,0xc2,0xec,0x74,0xae, 0x0a,0xc2,0xec,0x73,0xb0,0xc2,0xec,0x73,0xb1,0xc3,0xed,0x74,0xb1,0xc3,0xed, 0x76,0xb2,0xc3,0xec,0x76,0xb2,0xc3,0xec,0x76,0xb3,0xc3,0xec,0x77,0xb3,0xc3, 0xec,0x78,0xb3,0xc4,0xed,0x79,0xb4,0xc3,0xec,0x78,0xb5,0x82,0xc4,0xec,0x79, 0xb5,0x82,0xc4,0xec,0x79,0xb6,0x0f,0xc4,0xec,0x7a,0xb6,0xc4,0xec,0x79,0xb7, 0xc4,0xec,0x7a,0xb7,0xc4,0xec,0x7a,0xb8,0xc3,0xec,0x79,0xb8,0xc3,0xec,0x79, 0xb9,0xc4,0xec,0x79,0xb9,0xc4,0xed,0x79,0xba,0xc3,0xed,0x77,0xba,0xc2,0xed, 0x74,0xbb,0xc3,0xed,0x74,0xbb,0xc2,0xee,0x73,0xbc,0x9f,0xcc,0x4e,0xb3,0x0e, 0x14,0x01,0x0c,0x00,0x00,0x00,0x01,0x9a,0x00,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x0a,0x37,0x54,0x01,0x78,0xbc,0xe5,0x72,0xff,0x82,0xd9,0xff,0x95,0xff, 0x06,0xd9,0xff,0x96,0xff,0xda,0xff,0x98,0xff,0xda,0xff,0x99,0xff,0xdb,0xff, 0x99,0xff,0xda,0xff,0x99,0xff,0xdb,0xff,0x99,0xff,0x8d,0xdb,0xff,0x9a,0xff, 0x04,0xdb,0xff,0x9b,0xff,0xdc,0xff,0x9b,0xff,0xdb,0xff,0x9b,0xff,0xdc,0xff, 0x9b,0xff,0x82,0xdb,0xff,0x9b,0xff,0x83,0xdc,0xff,0x9d,0xff,0x83,0xdc,0xff, 0x9c,0xff,0x83,0xdd,0xff,0x9e,0xff,0x82,0xdc,0xff,0x9d,0xff,0x83,0xdb,0xff, 0x9a,0xff,0x06,0xda,0xff,0x99,0xff,0xda,0xff,0x98,0xff,0xd9,0xff,0x97,0xff, 0xb0,0xd8,0x67,0xf8,0x0a,0x0f,0x01,0x21,0x00,0x00,0x00,0x04,0x99,0x00,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x11,0x31,0x4b,0x01,0x86, 0xc1,0xe8,0x7a,0xff,0xdb,0xff,0x9b,0xff,0xdc,0xff,0x9c,0xff,0xdc,0xff,0x9b, 0xff,0x86,0xdc,0xff,0x9c,0xff,0x86,0xdc,0xff,0x9d,0xff,0x02,0xdc,0xff,0x9e, 0xff,0xdd,0xff,0x9e,0xff,0x82,0xdc,0xff,0x9e,0xff,0x02,0xdc,0xff,0x9d,0xff, 0xdd,0xff,0x9e,0xff,0x84,0xdd,0xff,0x9f,0xff,0x01,0xdd,0xff,0x9e,0xff,0x87, 0xdd,0xff,0x9f,0xff,0x01,0xdd,0xff,0xa0,0xff,0x84,0xdd,0xff,0x9f,0xff,0x01, 0xdd,0xff,0x9e,0xff,0x83,0xdc,0xff,0x9d,0xff,0x05,0xdb,0xff,0x9b,0xff,0xdb, 0xff,0x9a,0xff,0xb6,0xdc,0x70,0xf9,0x08,0x0c,0x00,0x31,0x00,0x00,0x00,0x06, 0x99,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x14,0x2f, 0x48,0x01,0x8a,0xc6,0xeb,0x81,0xff,0xdd,0xff,0x9f,0xff,0x86,0xdd,0xff,0xa0, 0xff,0x82,0xdd,0xff,0xa1,0xff,0x02,0xde,0xff,0xa1,0xff,0xdd,0xff,0xa1,0xff, 0x8a,0xde,0xff,0xa1,0xff,0x01,0xde,0xff,0xa2,0xff,0x82,0xde,0xff,0xa1,0xff, 0x82,0xdd,0xff,0xa1,0xff,0x82,0xde,0xff,0xa2,0xff,0x82,0xde,0xff,0xa1,0xff, 0x02,0xdd,0xff,0xa0,0xff,0xdd,0xff,0xa1,0xff,0x82,0xde,0xff,0xa3,0xff,0x03, 0xde,0xff,0xa2,0xff,0xdd,0xff,0xa1,0xff,0xdd,0xff,0xa0,0xff,0x83,0xdd,0xff, 0x9f,0xff,0x83,0xdd,0xff,0xa0,0xff,0x04,0xdd,0xff,0x9f,0xff,0xbd,0xe2,0x79, 0xf9,0x08,0x0c,0x00,0x34,0x00,0x00,0x00,0x07,0x99,0x00,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x14,0x2f,0x48,0x01,0x8b,0xca,0xed,0x89, 0xff,0x86,0xde,0xff,0xa3,0xff,0x03,0xde,0xff,0xa4,0xff,0xde,0xff,0xa3,0xff, 0xde,0xff,0xa4,0xff,0x83,0xdf,0xff,0xa4,0xff,0x8b,0xdf,0xff,0xa5,0xff,0x01, 0xde,0xff,0xa4,0xff,0x82,0xdf,0xff,0xa4,0xff,0x03,0xdf,0xff,0xa6,0xff,0xdf, 0xff,0xa4,0xff,0xde,0xff,0xa4,0xff,0x82,0xde,0xff,0xa3,0xff,0x02,0xde,0xff, 0xa4,0xff,0xdf,0xff,0xa4,0xff,0x8b,0xde,0xff,0xa3,0xff,0x03,0xc3,0xe7,0x81, 0xf9,0x08,0x0b,0x00,0x35,0x00,0x00,0x00,0x07,0x99,0x00,0x00,0x00,0x00,0x0c, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x14,0x2d,0x45,0x01,0x8b,0x71,0x9b,0x25, 0xff,0x79,0xa3,0x2c,0xff,0x7b,0xa7,0x2d,0xff,0x81,0xac,0x34,0xff,0x8a,0xb5, 0x3e,0xff,0x97,0xc2,0x4b,0xff,0xa9,0xd2,0x5e,0xff,0xbf,0xe4,0x7a,0xff,0xd6, 0xf8,0x99,0xff,0x86,0xe0,0xff,0xa8,0xff,0x01,0xe0,0xff,0xa9,0xff,0x83,0xe0, 0xff,0xa8,0xff,0x83,0xe0,0xff,0xa9,0xff,0x88,0xe0,0xff,0xa8,0xff,0x01,0xe0, 0xff,0xa7,0xff,0x83,0xe0,0xff,0xa8,0xff,0x02,0xe0,0xff,0xa7,0xff,0xdf,0xff, 0xa6,0xff,0x84,0xdf,0xff,0xa5,0xff,0x01,0xde,0xff,0xa4,0xff,0x82,0xdf,0xff, 0xa4,0xff,0x82,0xde,0xff,0xa4,0xff,0x03,0xc8,0xeb,0x88,0xfa,0x0b,0x10,0x00, 0x37,0x00,0x00,0x00,0x07,0x96,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01, 0x01,0x02,0x00,0x03,0x52,0x73,0x0f,0x0c,0x8a,0xb2,0x39,0x29,0x68,0x8d,0x23, 0x56,0x31,0x4a,0x05,0xa0,0x3c,0x5c,0x01,0xff,0x85,0x3b,0x5b,0x01,0xff,0x07, 0x3c,0x5d,0x01,0xff,0x41,0x64,0x01,0xff,0x4a,0x71,0x03,0xff,0x66,0x90,0x1b, 0xff,0x92,0xba,0x48,0xff,0xbd,0xe2,0x7b,0xff,0xde,0xfd,0xa5,0xff,0x82,0xe1, 0xff,0xab,0xff,0x07,0xe1,0xff,0xac,0xff,0xe2,0xff,0xac,0xff,0xe1,0xff,0xab, 0xff,0xe1,0xff,0xac,0xff,0xe2,0xff,0xac,0xff,0xe1,0xff,0xac,0xff,0xe2,0xff, 0xac,0xff,0x85,0xe1,0xff,0xab,0xff,0x82,0xe1,0xff,0xaa,0xff,0x83,0xe0,0xff, 0xa9,0xff,0x01,0xe1,0xff,0xa9,0xff,0x89,0xe0,0xff,0xa8,0xff,0x83,0xe0,0xff, 0xa7,0xff,0x03,0xcd,0xee,0x8f,0xfc,0x10,0x19,0x00,0x3c,0x00,0x00,0x00,0x07, 0x92,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x01,0x04,0x05,0x00,0x03,0x73, 0x9a,0x26,0x19,0xb8,0xdc,0x6f,0x5b,0xca,0xec,0x88,0x98,0xd1,0xf2,0x91,0xce, 0xd8,0xf9,0x9b,0xf4,0xe0,0xfe,0xa7,0xff,0x9f,0xc5,0x5a,0xff,0x3c,0x5c,0x01, 0xff,0x34,0x50,0x01,0xe2,0x32,0x4d,0x01,0xdd,0x33,0x4e,0x01,0xdd,0x34,0x4f, 0x01,0xe1,0x35,0x52,0x01,0xe9,0x38,0x56,0x01,0xf3,0x3b,0x5b,0x01,0xfd,0x82, 0x3b,0x5b,0x01,0xff,0x82,0x3b,0x5a,0x01,0xff,0x04,0x40,0x63,0x01,0xff,0x57, 0x7f,0x0f,0xff,0x90,0xb8,0x4a,0xff,0xcb,0xec,0x8e,0xff,0x8d,0xe2,0xff,0xad, 0xff,0x82,0xe2,0xff,0xac,0xff,0x03,0xe1,0xff,0xab,0xff,0xe1,0xff,0xac,0xff, 0xe1,0xff,0xab,0xff,0x83,0xe0,0xff,0xa9,0xff,0x89,0xe0,0xff,0xa8,0xff,0x03, 0xd2,0xf3,0x95,0xfd,0x14,0x20,0x00,0x41,0x00,0x00,0x00,0x08,0x8f,0x00,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x83,0xa7,0x39,0x1e, 0xc1,0xe3,0x7c,0x73,0xd0,0xf2,0x91,0xc4,0xdc,0xfc,0xa1,0xfb,0xe0,0xff,0xa9, 0xff,0x83,0xe1,0xff,0xaa,0xff,0x14,0xd8,0xf7,0x9d,0xff,0x90,0xb6,0x4a,0xff, 0x37,0x55,0x01,0xff,0x0b,0x11,0x01,0x79,0x00,0x00,0x00,0x5d,0x00,0x00,0x00, 0x5a,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x64,0x04,0x06, 0x00,0x70,0x14,0x1e,0x01,0x8a,0x23,0x35,0x01,0xac,0x2f,0x47,0x01,0xcf,0x38, 0x56,0x01,0xf3,0x3b,0x5a,0x01,0xff,0x3a,0x59,0x01,0xff,0x3a,0x5a,0x01,0xff, 0x43,0x67,0x01,0xff,0x75,0x9c,0x2e,0xff,0xbe,0xe0,0x7f,0xff,0x8b,0xe2,0xff, 0xad,0xff,0x84,0xe2,0xff,0xac,0xff,0x01,0xe1,0xff,0xab,0xff,0x82,0xe1,0xff, 0xaa,0xff,0x8a,0xe0,0xff,0xa8,0xff,0x03,0xd5,0xf6,0x99,0xfe,0x1b,0x2a,0x01, 0x46,0x00,0x00,0x00,0x08,0x8d,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x01, 0x2f,0x40,0x0a,0x07,0xb1,0xd4,0x69,0x4c,0xce,0xef,0x8d,0xb3,0xdc,0xfc,0xa1, 0xf9,0xe0,0xff,0xa8,0xff,0xe0,0xff,0xa9,0xff,0xdc,0xfb,0xa2,0xff,0xbb,0xdf, 0x7a,0xff,0x96,0xbc,0x50,0xff,0x73,0x9b,0x2c,0xff,0x55,0x7c,0x0e,0xff,0x45, 0x6a,0x03,0xff,0x40,0x63,0x01,0xff,0x38,0x56,0x01,0xff,0x12,0x1b,0x01,0x5a, 0x03,0x05,0x00,0x27,0x01,0x02,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x22,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x35,0x00,0x00, 0x00,0x43,0x00,0x00,0x00,0x54,0x03,0x04,0x00,0x67,0x19,0x26,0x01,0x93,0x2d, 0x45,0x01,0xca,0x39,0x57,0x01,0xf7,0x82,0x3a,0x59,0x01,0xff,0x03,0x3f,0x62, 0x01,0xff,0x71,0x98,0x2c,0xff,0xc4,0xe5,0x88,0xff,0x85,0xe2,0xff,0xad,0xff, 0x82,0xe2,0xff,0xac,0xff,0x02,0xe1,0xff,0xac,0xff,0xe1,0xff,0xab,0xff,0x82, 0xe1,0xff,0xaa,0xff,0x03,0xe0,0xff,0xa9,0xff,0xe1,0xff,0xa9,0xff,0xe0,0xff, 0xa9,0xff,0x88,0xe0,0xff,0xa8,0xff,0x02,0xe0,0xff,0xa7,0xff,0xdf,0xff,0xa6, 0xff,0x82,0xdf,0xff,0xa5,0xff,0x03,0xd6,0xf8,0x99,0xff,0x21,0x32,0x02,0x4b, 0x00,0x00,0x00,0x09,0x8b,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x01,0x43, 0x59,0x13,0x0a,0xbb,0xde,0x74,0x65,0xd2,0xf4,0x91,0xd5,0xdf,0xff,0xa5,0xff, 0xdf,0xff,0xa6,0xff,0xdf,0xfe,0xa5,0xff,0xb8,0xdc,0x76,0xff,0x80,0xa7,0x39, 0xff,0x4f,0x75,0x0a,0xff,0x40,0x62,0x01,0xff,0x3c,0x5c,0x01,0xff,0x84,0x3b, 0x5b,0x01,0xff,0x16,0x41,0x63,0x02,0xff,0xcb,0xee,0x8a,0xf2,0xd5,0xf6,0x97, 0xee,0xd3,0xf5,0x93,0xe6,0xcf,0xf1,0x8e,0xd4,0xc9,0xec,0x88,0xb4,0xbd,0xe1, 0x79,0x88,0x99,0xc2,0x4e,0x51,0x30,0x47,0x08,0x18,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x19,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x51, 0x08,0x0c,0x01,0x70,0x25,0x39,0x01,0xb1,0x37,0x54,0x01,0xf0,0x3a,0x59,0x01, 0xff,0x39,0x58,0x01,0xff,0x42,0x65,0x03,0xff,0x86,0xab,0x42,0xff,0xd8,0xf6, 0x9f,0xff,0x82,0xe1,0xff,0xab,0xff,0x82,0xe0,0xff,0xa9,0xff,0x02,0xe0,0xff, 0xa8,0xff,0xe0,0xff,0xa9,0xff,0x87,0xe0,0xff,0xa8,0xff,0x82,0xe0,0xff,0xa7, 0xff,0x82,0xdf,0xff,0xa6,0xff,0x01,0xdf,0xff,0xa5,0xff,0x82,0xde,0xff,0xa4, 0xff,0x84,0xde,0xff,0xa3,0xff,0x03,0xd8,0xfa,0x9b,0xff,0x28,0x3a,0x07,0x4f, 0x00,0x00,0x00,0x0a,0x89,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x37, 0x49,0x0f,0x09,0xbc,0xde,0x73,0x64,0xd4,0xf6,0x93,0xdf,0x82,0xde,0xff,0xa3, 0xff,0x04,0xd9,0xfb,0x9c,0xff,0xa1,0xc7,0x5c,0xff,0x5c,0x83,0x15,0xff,0x3f, 0x62,0x01,0xff,0x84,0x3b,0x5b,0x01,0xff,0x06,0x3a,0x5a,0x01,0xfb,0x34,0x50, 0x01,0xe3,0x2d,0x45,0x01,0xc9,0x26,0x3a,0x01,0xb7,0x35,0x51,0x04,0xcd,0xda, 0xfa,0x9e,0xff,0x86,0xe0,0xff,0xa7,0xff,0x0f,0xd5,0xf8,0x96,0xf4,0xc5,0xeb, 0x80,0xac,0x9c,0xc7,0x4c,0x4e,0x13,0x1d,0x01,0x0c,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x18,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x46,0x04,0x06,0x00,0x66, 0x25,0x38,0x01,0xae,0x37,0x55,0x01,0xf4,0x39,0x58,0x01,0xff,0x3a,0x59,0x01, 0xff,0x51,0x76,0x10,0xff,0xb2,0xd5,0x72,0xff,0x82,0xe0,0xff,0xa8,0xff,0x82, 0xe0,0xff,0xa7,0xff,0x01,0xdf,0xff,0xa6,0xff,0x82,0xdf,0xff,0xa5,0xff,0x82, 0xde,0xff,0xa4,0xff,0x01,0xdf,0xff,0xa4,0xff,0x82,0xde,0xff,0xa4,0xff,0x85, 0xde,0xff,0xa3,0xff,0x85,0xde,0xff,0xa2,0xff,0x04,0xde,0xff,0xa1,0xff,0xd9, 0xfb,0x9a,0xff,0x2e,0x42,0x0a,0x53,0x00,0x00,0x00,0x0a,0x87,0x00,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x01,0x03,0x05,0x00,0x04,0xb0,0xd2,0x67,0x4a,0xd2, 0xf5,0x8e,0xd2,0x82,0xdd,0xff,0x9f,0xff,0x05,0xdb,0xfe,0x9d,0xff,0xa7,0xcd, 0x61,0xff,0x56,0x7d,0x11,0xff,0x3d,0x5e,0x01,0xff,0x3b,0x5a,0x01,0xff,0x82, 0x3b,0x5b,0x01,0xff,0x0c,0x39,0x57,0x01,0xf3,0x2d,0x44,0x01,0xc6,0x1c,0x2b, 0x01,0x97,0x06,0x09,0x00,0x6d,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x4f,0x00, 0x00,0x00,0x52,0x2f,0x47,0x06,0xa1,0xd6,0xf7,0x97,0xff,0xd8,0xf9,0x9a,0xff, 0xd9,0xfa,0x9c,0xff,0xdd,0xfe,0xa1,0xff,0x85,0xde,0xff,0xa3,0xff,0x11,0xdd, 0xfe,0xa1,0xff,0xca,0xf1,0x85,0xd6,0xa3,0xcf,0x53,0x5e,0x20,0x31,0x02,0x0a, 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x27,0x00,0x00,0x00, 0x45,0x09,0x0e,0x01,0x6d,0x2c,0x43,0x01,0xc4,0x39,0x58,0x01,0xfd,0x39,0x58, 0x01,0xff,0x3d,0x5f,0x02,0xff,0x83,0xa8,0x41,0xff,0xda,0xfb,0x9e,0xff,0xde, 0xff,0xa3,0xff,0xde,0xff,0xa4,0xff,0x82,0xde,0xff,0xa3,0xff,0x04,0xde,0xff, 0xa2,0xff,0xdd,0xff,0xa0,0xff,0xde,0xff,0xa1,0xff,0xde,0xff,0xa2,0xff,0x83, 0xdd,0xff,0xa1,0xff,0x82,0xdd,0xff,0xa0,0xff,0x85,0xdd,0xff,0x9f,0xff,0x01, 0xdc,0xff,0x9e,0xff,0x82,0xdc,0xff,0x9c,0xff,0x03,0xd9,0xfc,0x98,0xff,0x34, 0x4a,0x0e,0x57,0x00,0x00,0x00,0x0b,0x86,0x00,0x00,0x00,0x00,0x1f,0x00,0x00, 0x00,0x02,0x87,0xac,0x39,0x21,0xc4,0xef,0x71,0xad,0xd6,0xfe,0x8d,0xfe,0xd7, 0xff,0x90,0xff,0xd8,0xff,0x91,0xff,0xc2,0xe9,0x7c,0xff,0x69,0x90,0x22,0xff, 0x3e,0x5f,0x01,0xff,0x3a,0x5a,0x01,0xff,0x3b,0x5a,0x01,0xff,0x3b,0x5b,0x01, 0xff,0x35,0x51,0x01,0xe1,0x20,0x31,0x01,0x9f,0x05,0x07,0x00,0x65,0x00,0x00, 0x00,0x4c,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x24,0x2b,0x41,0x01,0x90,0x47,0x6b,0x06,0xff, 0x44,0x67,0x03,0xff,0x44,0x68,0x05,0xff,0x4c,0x70,0x0c,0xff,0x60,0x84,0x1f, 0xff,0x81,0xa5,0x41,0xff,0xac,0xd0,0x6b,0xff,0xd6,0xfa,0x94,0xff,0xda,0xff, 0x98,0xff,0x82,0xda,0xff,0x97,0xff,0x25,0xd9,0xfe,0x94,0xff,0xc0,0xed,0x6f, 0xcb,0x86,0xb6,0x30,0x3d,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x13,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x4d,0x19,0x26,0x01,0x8c,0x35, 0x52,0x01,0xeb,0x39,0x58,0x01,0xff,0x3a,0x59,0x01,0xff,0x61,0x86,0x1f,0xff, 0xcc,0xee,0x8c,0xff,0xdd,0xff,0xa0,0xff,0xdd,0xff,0x9f,0xff,0xdc,0xff,0x9d, 0xff,0xdb,0xff,0x99,0xff,0xd9,0xff,0x93,0xff,0xdb,0xff,0x99,0xff,0xd9,0xff, 0x95,0xff,0xd8,0xff,0x91,0xff,0xd7,0xff,0x90,0xff,0xd7,0xff,0x8e,0xff,0xd6, 0xff,0x8c,0xff,0xd6,0xff,0x8d,0xff,0xd7,0xff,0x8f,0xff,0xd6,0xff,0x8e,0xff, 0xd6,0xff,0x8b,0xff,0xd4,0xff,0x86,0xff,0xd1,0xff,0x7f,0xff,0xcf,0xff,0x79, 0xff,0xd0,0xff,0x7b,0xff,0xd1,0xff,0x7e,0xff,0xd0,0xfd,0x7f,0xff,0x39,0x50, 0x11,0x5b,0x00,0x00,0x00,0x0b,0x84,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00, 0x01,0x06,0x08,0x01,0x05,0xa8,0xdb,0x45,0x64,0xc4,0xfa,0x61,0xee,0xc9,0xff, 0x69,0xff,0xca,0xff,0x6b,0xff,0xca,0xfe,0x6b,0xff,0x95,0xc3,0x40,0xff,0x46, 0x6a,0x04,0xff,0x3a,0x5a,0x01,0xff,0x3a,0x59,0x01,0xff,0x3b,0x5a,0x01,0xff, 0x36,0x52,0x01,0xe5,0x1d,0x2c,0x01,0x94,0x00,0x01,0x00,0x56,0x00,0x00,0x00, 0x3b,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x0b,0x00,0x00, 0x00,0x07,0x44,0x63,0x0a,0x10,0x93,0xc5,0x34,0x3b,0x61,0x89,0x19,0x6e,0x34, 0x4c,0x08,0xaa,0x87,0x3b,0x5b,0x01,0xff,0x03,0x45,0x67,0x08,0xff,0x7f,0xa6, 0x37,0xff,0xc0,0xee,0x6c,0xff,0x82,0xcf,0xff,0x78,0xff,0x0a,0xce,0xff,0x77, 0xff,0xc8,0xfa,0x6d,0xfc,0xa3,0xd8,0x43,0x8c,0x33,0x4d,0x04,0x0d,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x38,0x08, 0x0b,0x01,0x65,0x2e,0x46,0x02,0xcb,0x82,0x39,0x58,0x01,0xff,0x18,0x4d,0x70, 0x0e,0xff,0xb7,0xdf,0x6e,0xff,0xd5,0xff,0x88,0xff,0xd3,0xff,0x83,0xff,0xd0, 0xff,0x7c,0xff,0xd1,0xff,0x7d,0xff,0xd0,0xff,0x7a,0xff,0xce,0xff,0x75,0xff, 0xcd,0xff,0x73,0xff,0xcd,0xff,0x72,0xff,0xcc,0xff,0x71,0xff,0xcb,0xff,0x6f, 0xff,0xcb,0xff,0x6c,0xff,0xc9,0xff,0x69,0xff,0xc9,0xff,0x67,0xff,0xc7,0xff, 0x62,0xff,0xc5,0xff,0x5e,0xff,0xc5,0xff,0x5d,0xff,0xc5,0xff,0x5c,0xff,0xc5, 0xff,0x5e,0xff,0xc6,0xff,0x61,0xff,0xc6,0xfd,0x63,0xff,0x3c,0x56,0x0f,0x5f, 0x00,0x00,0x00,0x0c,0x83,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x02,0x78, 0xa5,0x22,0x1f,0xae,0xed,0x3b,0xb2,0xbb,0xfd,0x46,0xff,0xbd,0xfe,0x49,0xff, 0xbe,0xfe,0x4b,0xff,0xba,0xf9,0x48,0xff,0x72,0xa1,0x1d,0xff,0x3d,0x5f,0x01, 0xff,0x82,0x3a,0x59,0x01,0xff,0x1a,0x3a,0x58,0x01,0xf8,0x27,0x3b,0x01,0xaa, 0x03,0x04,0x00,0x59,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x1d,0x00,0x00,0x00, 0x0d,0x00,0x00,0x00,0x07,0x78,0xa7,0x1e,0x23,0xa7,0xe3,0x38,0x75,0xb4,0xf1, 0x45,0xc0,0xbd,0xfa,0x4f,0xf5,0xc4,0xff,0x59,0xff,0x7d,0xad,0x26,0xff,0x39, 0x58,0x01,0xff,0x30,0x49,0x01,0xd2,0x2b,0x42,0x01,0xc3,0x2a,0x41,0x01,0xc1, 0x2c,0x44,0x01,0xc8,0x31,0x4c,0x01,0xd9,0x38,0x56,0x01,0xf1,0x3b,0x5b,0x01, 0xff,0x3a,0x5a,0x01,0xff,0x3a,0x59,0x01,0xff,0x40,0x61,0x04,0xff,0x82,0xad, 0x33,0xff,0xc2,0xfa,0x5e,0xff,0x82,0xc5,0xff,0x5e,0xff,0x03,0xc4,0xff,0x5b, 0xff,0xac,0xe8,0x3f,0xc9,0x63,0x90,0x12,0x25,0x82,0x00,0x00,0x00,0x03,0x14, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x28,0x01,0x01,0x00,0x50,0x25,0x38,0x02, 0xa8,0x38,0x57,0x01,0xfc,0x38,0x57,0x01,0xff,0x42,0x64,0x05,0xff,0xa4,0xd3, 0x4e,0xff,0xca,0xff,0x6b,0xff,0xc9,0xff,0x69,0xff,0xc8,0xff,0x65,0xff,0xc7, 0xff,0x63,0xff,0xc5,0xff,0x5d,0xff,0xc2,0xff,0x56,0xff,0xc0,0xff,0x52,0xff, 0xbf,0xff,0x4f,0xff,0xbf,0xfe,0x4d,0xff,0xbe,0xfe,0x4b,0xff,0xbc,0xfd,0x49, 0xff,0xbb,0xfd,0x46,0xff,0x82,0xbb,0xfd,0x45,0xff,0x07,0xba,0xfd,0x45,0xff, 0xba,0xfd,0x44,0xff,0xbb,0xfd,0x46,0xff,0xbc,0xfd,0x48,0xff,0xbb,0xfc,0x47, 0xff,0x3e,0x5a,0x0c,0x62,0x00,0x00,0x00,0x0c,0x82,0x00,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x04,0x91,0xc9,0x2a,0x4e,0xae,0xf0,0x39,0xea,0xb3,0xf6,0x3d, 0xff,0x82,0xb4,0xf7,0x3e,0xff,0x03,0xad,0xee,0x3a,0xff,0x5d,0x8a,0x0e,0xff, 0x3b,0x5b,0x01,0xff,0x82,0x3a,0x59,0x01,0xff,0x09,0x35,0x51,0x01,0xe1,0x13, 0x1d,0x01,0x76,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x0d, 0x08,0x0c,0x01,0x08,0x8d,0xc5,0x26,0x44,0xaa,0xea,0x37,0xb3,0xb5,0xf8,0x3f, 0xfa,0x82,0xb8,0xfb,0x42,0xff,0x0d,0xb9,0xfc,0x43,0xff,0xb3,0xf5,0x3f,0xff, 0x72,0xa4,0x19,0xff,0x36,0x53,0x01,0xff,0x0d,0x13,0x01,0x72,0x00,0x00,0x00, 0x4f,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x58,0x01,0x02, 0x00,0x65,0x13,0x1d,0x01,0x88,0x29,0x3f,0x01,0xbd,0x38,0x55,0x01,0xf3,0x82, 0x39,0x58,0x01,0xff,0x16,0x53,0x79,0x0d,0xff,0xa7,0xe4,0x3a,0xff,0xb9,0xfc, 0x44,0xff,0xb9,0xfc,0x43,0xff,0xb9,0xfc,0x44,0xff,0xab,0xec,0x38,0xe6,0x71, 0xa3,0x17,0x3c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08, 0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x43,0x1c,0x2b,0x01,0x8e,0x37,0x55,0x01, 0xf6,0x38,0x57,0x01,0xff,0x3f,0x60,0x03,0xff,0x99,0xcd,0x39,0xff,0xbe,0xfd, 0x4c,0xff,0xbb,0xfc,0x48,0xff,0xb9,0xfb,0x43,0xff,0xb7,0xfa,0x41,0xff,0xb6, 0xf9,0x40,0xff,0x82,0xb5,0xf8,0x3f,0xff,0x82,0xb4,0xf7,0x3e,0xff,0x01,0xb3, 0xf6,0x3d,0xff,0x82,0xb4,0xf7,0x3e,0xff,0x85,0xb3,0xf6,0x3d,0xff,0x07,0xb4, 0xf7,0x3d,0xff,0x41,0x5e,0x0d,0x65,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x01, 0x23,0x31,0x06,0x09,0x99,0xd5,0x2a,0x83,0xaa,0xed,0x34,0xfd,0x83,0xac,0xef, 0x36,0xff,0x23,0xa4,0xe5,0x32,0xff,0x55,0x7e,0x0a,0xff,0x3a,0x59,0x01,0xff, 0x39,0x58,0x01,0xff,0x3a,0x59,0x01,0xff,0x2f,0x48,0x02,0xc5,0x05,0x08,0x01, 0x57,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x08,0x81,0xb6, 0x1f,0x38,0xa3,0xe3,0x30,0xbf,0xae,0xf1,0x38,0xff,0xaf,0xf2,0x39,0xff,0xb0, 0xf3,0x3a,0xff,0x96,0xd2,0x2c,0xff,0x6b,0x9b,0x17,0xff,0x4b,0x71,0x07,0xff, 0x3e,0x5f,0x01,0xff,0x3d,0x5f,0x01,0xff,0x36,0x52,0x01,0xff,0x12,0x1a,0x01, 0x51,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x15,0x00,0x00, 0x00,0x1b,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x4b,0x06, 0x08,0x01,0x6a,0x26,0x3a,0x01,0xb4,0x38,0x56,0x01,0xf8,0x38,0x57,0x01,0xff, 0x41,0x63,0x04,0xff,0x93,0xce,0x2c,0xff,0x83,0xb1,0xf4,0x3b,0xff,0x0c,0xa8, 0xe9,0x33,0xf1,0x73,0xa7,0x17,0x49,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x3a,0x16,0x22,0x01, 0x7e,0x36,0x54,0x01,0xf1,0x38,0x57,0x01,0xff,0x3e,0x5f,0x03,0xff,0x92,0xcd, 0x2b,0xff,0x82,0xb0,0xf3,0x3a,0xff,0x03,0xaf,0xf2,0x39,0xff,0xae,0xf1,0x38, 0xff,0xad,0xf0,0x37,0xff,0x82,0xac,0xef,0x36,0xff,0x82,0xad,0xf0,0x37,0xff, 0x86,0xac,0xef,0x36,0xff,0x07,0xad,0xf0,0x37,0xff,0xad,0xf0,0x36,0xff,0x42, 0x5f,0x0d,0x67,0x00,0x00,0x00,0x0d,0x57,0x7a,0x12,0x15,0x9a,0xd9,0x27,0xb6, 0xa3,0xe6,0x2d,0xff,0x83,0xa4,0xe7,0x2e,0xff,0x11,0x9f,0xe1,0x2c,0xff,0x54, 0x7d,0x0a,0xff,0x39,0x59,0x01,0xff,0x39,0x58,0x01,0xff,0x39,0x58,0x01,0xfe, 0x2b,0x41,0x02,0xb1,0x01,0x01,0x00,0x48,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x0b,0x45,0x64,0x0c,0x12,0x94,0xd2,0x24,0x92,0xa5,0xe7,0x2f,0xfb,0xa7,0xea, 0x31,0xff,0xa8,0xeb,0x32,0xff,0x98,0xd6,0x2a,0xff,0x5b,0x86,0x0e,0xff,0x3d, 0x5d,0x01,0xff,0x84,0x3b,0x5b,0x01,0xff,0x04,0x3f,0x61,0x02,0xff,0x71,0xa4, 0x17,0x92,0x62,0x92,0x0d,0x30,0x04,0x05,0x01,0x04,0x82,0x00,0x00,0x00,0x02, 0x1a,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x15,0x00,0x00, 0x00,0x2a,0x00,0x00,0x00,0x49,0x0f,0x17,0x01,0x79,0x32,0x4d,0x01,0xdd,0x38, 0x57,0x01,0xff,0x3d,0x5d,0x02,0xff,0x8c,0xc7,0x25,0xff,0xa9,0xec,0x33,0xff, 0xa8,0xeb,0x32,0xff,0xa9,0xec,0x33,0xff,0xa0,0xe2,0x2c,0xf4,0x6c,0x9e,0x12, 0x47,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x12,0x00,0x00,0x00,0x34,0x14,0x1e,0x01,0x77,0x36,0x54,0x01,0xf1,0x38, 0x57,0x01,0xff,0x40,0x61,0x03,0xff,0x94,0xd1,0x28,0xff,0xa8,0xeb,0x32,0xff, 0x82,0xa6,0xe9,0x30,0xff,0x83,0xa5,0xe8,0x2f,0xff,0x02,0xa6,0xe9,0x30,0xff, 0xa5,0xe8,0x2f,0xff,0x83,0xa4,0xe7,0x2e,0xff,0x82,0xa5,0xe8,0x2f,0xff,0x06, 0xa6,0xe9,0x30,0xff,0xa5,0xe8,0x2f,0xff,0xa4,0xe7,0x2e,0xff,0x43,0x61,0x0c, 0x69,0x00,0x00,0x00,0x0d,0x96,0xd7,0x22,0xd1,0x82,0x9c,0xdf,0x26,0xff,0x01, 0x9c,0xe0,0x27,0xff,0x82,0x9d,0xe0,0x27,0xff,0x02,0x5d,0x8a,0x0d,0xff,0x39, 0x59,0x01,0xff,0x82,0x39,0x58,0x01,0xff,0x06,0x29,0x3f,0x02,0xaa,0x00,0x00, 0x00,0x40,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x09,0x6e,0xa1,0x15,0x30,0x97, 0xd9,0x24,0xd5,0x82,0x9f,0xe2,0x29,0xff,0x04,0x9f,0xe3,0x29,0xff,0x7d,0xb4, 0x1b,0xff,0x41,0x63,0x03,0xff,0x3a,0x5a,0x01,0xff,0x82,0x3b,0x5b,0x01,0xff, 0x09,0x37,0x55,0x01,0xed,0x2d,0x44,0x01,0xc8,0x25,0x38,0x01,0xb4,0x3b,0x5b, 0x04,0xcf,0xa0,0xe3,0x2a,0xff,0x9e,0xe0,0x28,0xfd,0x8f,0xcf,0x1d,0xb7,0x5c, 0x8a,0x08,0x28,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x33,0x03, 0x05,0x00,0x5d,0x2c,0x43,0x01,0xc4,0x38,0x57,0x01,0xff,0x3f,0x60,0x03,0xff, 0x93,0xd1,0x24,0xff,0x82,0xa1,0xe4,0x2b,0xff,0x0d,0xa0,0xe3,0x2a,0xff,0x98, 0xd9,0x25,0xef,0x47,0x6d,0x05,0x35,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x32,0x16,0x21,0x01, 0x79,0x37,0x55,0x01,0xf5,0x38,0x57,0x01,0xff,0x4d,0x74,0x07,0xff,0x9e,0xe1, 0x28,0xff,0x84,0x9f,0xe2,0x29,0xff,0x85,0x9e,0xe1,0x28,0xff,0x82,0x9f,0xe2, 0x29,0xff,0x08,0x9e,0xe1,0x28,0xff,0x9c,0xdf,0x26,0xff,0x9d,0xe0,0x27,0xff, 0x9d,0xe1,0x27,0xff,0x42,0x61,0x0a,0x6b,0x00,0x00,0x00,0x0d,0x92,0xd4,0x1d, 0xff,0x95,0xd8,0x1f,0xff,0x83,0x96,0xd9,0x20,0xff,0x0a,0x8a,0xc9,0x1a,0xff, 0x3d,0x5e,0x01,0xff,0x38,0x57,0x01,0xff,0x39,0x58,0x01,0xff,0x2c,0x43,0x02, 0xb3,0x00,0x01,0x00,0x3e,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x08,0x78,0xaf, 0x16,0x4d,0x94,0xd7,0x20,0xf0,0x82,0x98,0xdb,0x22,0xff,0x0c,0x99,0xdc,0x23, 0xff,0x6e,0xa1,0x12,0xff,0x3b,0x5b,0x01,0xff,0x3a,0x59,0x01,0xff,0x3a,0x5a, 0x01,0xff,0x36,0x54,0x01,0xe8,0x1e,0x2e,0x01,0x99,0x01,0x02,0x00,0x60,0x00, 0x00,0x00,0x4f,0x00,0x00,0x00,0x51,0x33,0x4e,0x04,0x9f,0x98,0xdb,0x22,0xff, 0x82,0x99,0xdc,0x23,0xff,0x04,0x8d,0xcd,0x1b,0xef,0x52,0x7d,0x05,0x57,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x16,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x26,0x01,0x01,0x00,0x51,0x2b, 0x41,0x01,0xbd,0x63,0x94,0x0b,0xff,0x96,0xd9,0x21,0xff,0x9a,0xdd,0x24,0xff, 0x9a,0xdd,0x23,0xff,0x99,0xdc,0x23,0xff,0x76,0xae,0x15,0xff,0x39,0x56,0x03, 0xd0,0x0d,0x12,0x04,0x12,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x34,0x1a,0x28,0x01,0x85,0x3d, 0x5f,0x01,0xfa,0x81,0xbe,0x15,0xff,0x98,0xdb,0x22,0xff,0x83,0x99,0xdc,0x23, 0xff,0x82,0x98,0xdb,0x22,0xff,0x01,0x97,0xda,0x21,0xff,0x84,0x98,0xdb,0x22, 0xff,0x01,0x97,0xda,0x21,0xff,0x82,0x96,0xd9,0x20,0xff,0x05,0x95,0xd8,0x1f, 0xff,0x97,0xda,0x21,0xff,0x41,0x61,0x09,0x6c,0x00,0x00,0x00,0x0e,0x70,0xa5, 0x11,0xd7,0x82,0x90,0xd3,0x1a,0xff,0x01,0x8f,0xd2,0x19,0xff,0x82,0x90,0xd3, 0x1a,0xff,0x08,0x55,0x83,0x04,0xff,0x37,0x55,0x01,0xff,0x31,0x4b,0x02,0xcf, 0x02,0x02,0x00,0x42,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x05,0x01,0x01,0x00, 0x10,0x7c,0xb6,0x15,0xdc,0x83,0x92,0xd5,0x1c,0xff,0x0c,0x81,0xbe,0x15,0xff, 0x3a,0x5a,0x01,0xff,0x39,0x58,0x01,0xff,0x3a,0x59,0x01,0xff,0x2d,0x44,0x01, 0xbf,0x05,0x07,0x00,0x5e,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x22,0x00,0x00, 0x00,0x16,0x00,0x00,0x00,0x24,0x37,0x54,0x04,0x90,0x92,0xd5,0x1c,0xff,0x83, 0x93,0xd6,0x1d,0xff,0x03,0x7d,0xba,0x11,0xfb,0x3e,0x5f,0x02,0x5c,0x00,0x00, 0x00,0x06,0x83,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x0a,0x19,0x26,0x01,0x33,0x72,0xa9,0x10,0xca,0x92,0xd5,0x1c,0xff,0x83,0x93, 0xd6,0x1d,0xff,0x05,0x7f,0xba,0x15,0xff,0x3e,0x5f,0x01,0xff,0x37,0x54,0x01, 0xf2,0x19,0x25,0x01,0x34,0x00,0x00,0x00,0x05,0x82,0x00,0x00,0x00,0x00,0x07, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x16,0x27,0x3c,0x01,0x6c,0x78,0xb3,0x10, 0xf9,0x91,0xd4,0x1b,0xff,0x92,0xd5,0x1c,0xff,0x93,0xd6,0x1d,0xff,0x82,0x92, 0xd5,0x1c,0xff,0x82,0x91,0xd4,0x1b,0xff,0x83,0x92,0xd5,0x1c,0xff,0x83,0x91, 0xd4,0x1b,0xff,0x83,0x90,0xd3,0x1a,0xff,0x05,0x91,0xd4,0x1b,0xff,0x40,0x5f, 0x07,0x6d,0x00,0x00,0x00,0x0e,0x34,0x4e,0x05,0x88,0x89,0xcb,0x14,0xff,0x83, 0x8a,0xcd,0x14,0xff,0x09,0x8b,0xce,0x15,0xff,0x72,0xac,0x0b,0xff,0x41,0x65, 0x01,0xff,0x2c,0x43,0x01,0xb8,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x1e,0x52,0x7b,0x09,0xb0,0x82,0x8c,0xcf,0x16, 0xff,0x0d,0x8b,0xce,0x15,0xff,0x88,0xca,0x14,0xff,0x45,0x6b,0x01,0xff,0x38, 0x56,0x01,0xfe,0x27,0x3b,0x02,0xa9,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x23, 0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x16,0x38,0x55,0x03,0x8a,0x8d,0xcf,0x17,0xff,0x84,0x8d,0xd0,0x17,0xff,0x03, 0x65,0x9a,0x07,0xf1,0x29,0x3e,0x02,0x34,0x00,0x00,0x00,0x04,0x82,0x00,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x51,0x7b,0x05,0x27,0x81,0xc0,0x11,0xd1, 0x8c,0xcf,0x16,0xff,0x82,0x8d,0xd0,0x17,0xff,0x07,0x8e,0xd1,0x18,0xff,0x7f, 0xbd,0x12,0xff,0x43,0x66,0x02,0xff,0x38,0x56,0x01,0xfd,0x1f,0x30,0x01,0x88, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x05,0x82,0x00,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x04,0x37,0x55,0x02,0x3d,0x74,0xaf,0x0c,0xee,0x83,0x8c,0xcf,0x16, 0xff,0x83,0x8d,0xd0,0x17,0xff,0x01,0x8c,0xcf,0x16,0xff,0x82,0x8d,0xd0,0x17, 0xff,0x04,0x8b,0xce,0x15,0xff,0x8c,0xcf,0x16,0xff,0x8b,0xce,0x15,0xff,0x8c, 0xcf,0x15,0xff,0x82,0x8b,0xce,0x15,0xff,0x01,0x8a,0xcd,0x14,0xff,0x82,0x8b, 0xce,0x15,0xff,0x06,0x3f,0x5e,0x06,0x6d,0x00,0x00,0x00,0x0e,0x01,0x02,0x00, 0x46,0x69,0x9e,0x0b,0xde,0x86,0xc9,0x10,0xff,0x86,0xc9,0x0f,0xff,0x82,0x86, 0xc9,0x10,0xff,0x09,0x82,0xc4,0x0e,0xff,0x52,0x7f,0x01,0xff,0x39,0x58,0x01, 0xf7,0x16,0x20,0x02,0x27,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x1e,0x1e,0x2d,0x01,0x7b,0x7b,0xb8,0x0e,0xff,0x83,0x87,0xca,0x11,0xff, 0x0b,0x64,0x99,0x06,0xff,0x35,0x51,0x01,0xf7,0x07,0x0b,0x01,0x4f,0x00,0x00, 0x00,0x1a,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x16,0x37,0x53,0x03,0x8b,0x88,0xca,0x12,0xff, 0x84,0x88,0xcb,0x12,0xff,0x07,0x82,0xc4,0x0f,0xff,0x4d,0x77,0x02,0xc4,0x04, 0x06,0x01,0x10,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x60,0x91,0x06,0x3e, 0x81,0xc2,0x0f,0xe6,0x83,0x88,0xcb,0x12,0xff,0x0c,0x89,0xcc,0x13,0xff,0x7d, 0xbc,0x0f,0xff,0x44,0x69,0x02,0xff,0x38,0x57,0x01,0xff,0x26,0x3a,0x01,0xaa, 0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x04,0x3e,0x5f,0x02,0x36,0x74,0xb0,0x0a,0xe8,0x82,0x88, 0xcb,0x12,0xff,0x82,0x87,0xca,0x11,0xff,0x01,0x88,0xcb,0x12,0xff,0x83,0x89, 0xcc,0x13,0xff,0x01,0x87,0xca,0x12,0xff,0x83,0x87,0xca,0x11,0xff,0x02,0x86, 0xc9,0x10,0xff,0x87,0xca,0x11,0xff,0x82,0x86,0xc9,0x10,0xff,0x83,0x87,0xca, 0x11,0xff,0x05,0x3d,0x5d,0x05,0x6d,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x29, 0x2b,0x42,0x03,0x87,0x7f,0xc0,0x0b,0xfe,0x84,0x82,0xc5,0x0c,0xff,0x0f,0x6a, 0xa2,0x05,0xff,0x48,0x6f,0x01,0xff,0x33,0x4d,0x02,0x83,0x00,0x00,0x00,0x07, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x13,0x02,0x02,0x00,0x49,0x52,0x7d,0x05, 0xe4,0x84,0xc7,0x0d,0xff,0x83,0xc6,0x0d,0xff,0x84,0xc6,0x0e,0xff,0x7b,0xbb, 0x0b,0xff,0x46,0x6b,0x01,0xff,0x28,0x3d,0x02,0x7b,0x00,0x00,0x00,0x0b,0x83, 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x16,0x36,0x52, 0x02,0x8a,0x82,0x84,0xc7,0x0e,0xff,0x01,0x83,0xc6,0x0d,0xff,0x83,0x84,0xc7, 0x0e,0xff,0x06,0x6f,0xaa,0x07,0xff,0x3b,0x5a,0x02,0x6c,0x00,0x00,0x00,0x0c, 0x68,0x9e,0x06,0x5d,0x81,0xc2,0x0c,0xf5,0x85,0xc8,0x0f,0xff,0x82,0x84,0xc7, 0x0e,0xff,0x0d,0x85,0xc8,0x0f,0xff,0x79,0xb6,0x0c,0xff,0x45,0x6a,0x02,0xff, 0x38,0x57,0x01,0xff,0x2b,0x42,0x01,0xbd,0x01,0x01,0x00,0x49,0x00,0x00,0x00, 0x1a,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x44,0x68, 0x02,0x39,0x73,0xb0,0x08,0xe8,0x83,0xc6,0x0d,0xff,0x84,0x84,0xc7,0x0e,0xff, 0x03,0x83,0xc5,0x0e,0xff,0x6b,0xa1,0x09,0xff,0x83,0xc6,0x0e,0xff,0x84,0x84, 0xc7,0x0e,0xff,0x88,0x83,0xc6,0x0d,0xff,0x05,0x3c,0x5b,0x04,0x6d,0x00,0x00, 0x00,0x0e,0x00,0x00,0x00,0x14,0x00,0x01,0x00,0x46,0x59,0x88,0x06,0xd1,0x84, 0x7f,0xc2,0x09,0xff,0x0a,0x7c,0xbd,0x08,0xff,0x56,0x86,0x01,0xff,0x43,0x67, 0x01,0xe8,0x18,0x23,0x02,0x1b,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x30,0x24,0x37,0x01,0x9b,0x71,0xad,0x07,0xff,0x7f,0xc2,0x09,0xff, 0x82,0x80,0xc3,0x0a,0xff,0x04,0x64,0x9a,0x03,0xff,0x39,0x58,0x01,0xdc,0x08, 0x0b,0x01,0x15,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x16,0x35,0x51,0x02,0x8a,0x80,0xc3,0x0a,0xff,0x84, 0x81,0xc4,0x0b,0xff,0x82,0x80,0xc3,0x0a,0xff,0x03,0x5b,0x8d,0x02,0xea,0x65, 0x9c,0x05,0x93,0x7f,0xc1,0x0a,0xfc,0x84,0x81,0xc4,0x0b,0xff,0x0e,0x73,0xae, 0x09,0xff,0x42,0x66,0x02,0xff,0x38,0x58,0x01,0xff,0x2d,0x45,0x01,0xc5,0x02, 0x03,0x00,0x4f,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x05,0x4a,0x72,0x02,0x3d,0x74,0xb1,0x06,0xea,0x81,0xc4,0x0b, 0xff,0x80,0xc3,0x0a,0xff,0x81,0xc4,0x0b,0xff,0x82,0x80,0xc3,0x0a,0xff,0x06, 0x7d,0xbd,0x0b,0xff,0x4e,0x77,0x04,0xff,0x3c,0x5c,0x01,0xff,0x4b,0x74,0x03, 0xff,0x73,0xaf,0x09,0xff,0x81,0xc5,0x0b,0xff,0x83,0x81,0xc4,0x0b,0xff,0x05, 0x80,0xc3,0x0a,0xff,0x7f,0xc2,0x09,0xff,0x80,0xc3,0x0a,0xff,0x81,0xc4,0x0b, 0xff,0x81,0xc3,0x0b,0xff,0x82,0x7f,0xc2,0x09,0xff,0x06,0x39,0x58,0x03,0x6c, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x28,0x14,0x1e,0x01, 0x73,0x72,0xaf,0x06,0xf9,0x84,0x7c,0xbf,0x06,0xff,0x09,0x6c,0xa7,0x04,0xff, 0x50,0x7c,0x01,0xff,0x3e,0x60,0x02,0x84,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x1a,0x03,0x04,0x00,0x52,0x44,0x68,0x02,0xe8,0x7b,0xbd, 0x07,0xff,0x82,0x7d,0xc0,0x07,0xff,0x04,0x79,0xbb,0x06,0xff,0x53,0x81,0x01, 0xff,0x30,0x49,0x02,0x77,0x00,0x00,0x00,0x07,0x82,0x00,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x16,0x35,0x51,0x02,0x8a,0x7d,0xc0,0x08, 0xff,0x7e,0xc1,0x08,0xff,0x7d,0xc0,0x07,0xff,0x84,0x7e,0xc1,0x08,0xff,0x02, 0x7b,0xbd,0x07,0xff,0x7e,0xc0,0x08,0xff,0x84,0x7e,0xc1,0x08,0xff,0x0c,0x68, 0xa0,0x05,0xff,0x3f,0x60,0x01,0xff,0x39,0x58,0x01,0xff,0x2d,0x45,0x01,0xc5, 0x01,0x02,0x00,0x51,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x08,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x06,0x53,0x80,0x02,0x4c,0x75,0xb5,0x05,0xf0,0x7d,0xc0, 0x07,0xff,0x84,0x7e,0xc1,0x08,0xff,0x08,0x74,0xb2,0x07,0xff,0x45,0x6a,0x02, 0xff,0x3b,0x5b,0x01,0xfe,0x3c,0x5c,0x01,0xff,0x3b,0x5b,0x01,0xff,0x3d,0x5d, 0x01,0xff,0x55,0x83,0x03,0xff,0x77,0xb6,0x08,0xff,0x83,0x7e,0xc1,0x08,0xff, 0x02,0x7d,0xc1,0x07,0xff,0x7e,0xc1,0x08,0xff,0x82,0x7d,0xc0,0x07,0xff,0x0a, 0x7c,0xbf,0x06,0xff,0x7d,0xc0,0x07,0xff,0x38,0x56,0x02,0x6b,0x00,0x00,0x00, 0x0e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x42,0x3b,0x5b, 0x02,0xb1,0x79,0xbb,0x04,0xff,0x7a,0xbd,0x04,0xff,0x82,0x79,0xbc,0x03,0xff, 0x15,0x79,0xbb,0x03,0xff,0x5e,0x92,0x01,0xff,0x4b,0x74,0x01,0xf1,0x29,0x3d, 0x03,0x28,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x31,0x1c, 0x2b,0x01,0x8f,0x58,0x87,0x03,0xfe,0x7a,0xbd,0x04,0xff,0x7b,0xbe,0x05,0xff, 0x7a,0xbd,0x04,0xff,0x70,0xae,0x03,0xff,0x4c,0x76,0x01,0xf0,0x24,0x37,0x02, 0x2e,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x16,0x35,0x51,0x02,0x8a,0x7b,0xbd,0x05,0xff,0x8a,0x7b,0xbe,0x05,0xff, 0x0c,0x7a,0xbb,0x05,0xff,0x5a,0x8a,0x03,0xff,0x3c,0x5c,0x01,0xff,0x39,0x58, 0x01,0xfe,0x2a,0x40,0x01,0xba,0x01,0x02,0x00,0x51,0x00,0x00,0x00,0x22,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x01,0x01,0x00,0x08,0x5d,0x90,0x02,0x69, 0x76,0xb7,0x04,0xf8,0x84,0x7b,0xbe,0x05,0xff,0x07,0x7c,0xbf,0x06,0xff,0x6a, 0xa4,0x04,0xff,0x3e,0x60,0x01,0xff,0x37,0x55,0x01,0xf7,0x1a,0x28,0x01,0xa4, 0x21,0x33,0x01,0xac,0x39,0x57,0x01,0xf2,0x82,0x3b,0x5b,0x01,0xff,0x07,0x3f, 0x61,0x01,0xff,0x5c,0x8e,0x04,0xff,0x79,0xba,0x06,0xff,0x7c,0xbf,0x06,0xff, 0x7b,0xbe,0x05,0xff,0x7a,0xbd,0x04,0xff,0x7b,0xbe,0x05,0xff,0x83,0x7a,0xbd, 0x04,0xff,0x07,0x36,0x54,0x02,0x6a,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x22,0x04,0x06,0x00,0x5d,0x56,0x86,0x02, 0xe5,0x83,0x77,0xba,0x01,0xff,0x0a,0x77,0xb9,0x01,0xff,0x71,0xb1,0x01,0xff, 0x56,0x85,0x01,0xff,0x42,0x65,0x02,0xad,0x01,0x01,0x00,0x09,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x4a,0x2f,0x47,0x01,0xc9,0x62,0x99, 0x02,0xff,0x83,0x78,0xbb,0x02,0xff,0x07,0x6b,0xa6,0x01,0xff,0x4d,0x77,0x01, 0xcb,0x18,0x24,0x02,0x15,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x16,0x36,0x53,0x01,0x8a,0x86,0x78,0xbb,0x02,0xff,0x82,0x79,0xbc,0x03, 0xff,0x0e,0x78,0xbb,0x02,0xff,0x79,0xbc,0x03,0xff,0x6d,0xaa,0x03,0xff,0x49, 0x71,0x01,0xff,0x3b,0x5a,0x01,0xff,0x39,0x58,0x01,0xfb,0x23,0x35,0x01,0xa4, 0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x08,0x00,0x00,0x00, 0x03,0x18,0x24,0x01,0x0e,0x66,0x9f,0x02,0x93,0x77,0xb9,0x02,0xfd,0x84,0x78, 0xbb,0x02,0xff,0x0a,0x78,0xbb,0x03,0xff,0x5c,0x8e,0x02,0xff,0x3b,0x5a,0x01, 0xff,0x35,0x52,0x01,0xed,0x13,0x1e,0x01,0x84,0x00,0x00,0x00,0x4f,0x00,0x00, 0x00,0x4b,0x09,0x0d,0x00,0x6b,0x2b,0x41,0x01,0xbd,0x3a,0x5a,0x01,0xfa,0x82, 0x3b,0x5b,0x01,0xff,0x03,0x43,0x68,0x01,0xff,0x64,0x9b,0x02,0xff,0x79,0xbb, 0x03,0xff,0x84,0x78,0xbb,0x02,0xff,0x09,0x77,0xba,0x02,0xff,0x34,0x50,0x01, 0x69,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x36,0x18,0x24,0x01,0x86,0x66,0x9e,0x01,0xfc,0x82, 0x75,0xb6,0x01,0xff,0x0c,0x75,0xb7,0x01,0xff,0x75,0xb6,0x01,0xff,0x69,0xa3, 0x01,0xff,0x4f,0x7a,0x01,0xff,0x38,0x55,0x02,0x5e,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x27,0x08,0x0c,0x01,0x65,0x37,0x54,0x01,0xe9, 0x65,0x9e,0x01,0xff,0x76,0xb7,0x01,0xff,0x82,0x76,0xb8,0x01,0xff,0x07,0x6b, 0xa6,0x01,0xff,0x52,0x7e,0x01,0xb7,0x18,0x24,0x02,0x11,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x16,0x37,0x56,0x01,0x8a,0x76,0xb7,0x01,0xff,0x86,0x76,0xb8, 0x01,0xff,0x10,0x76,0xb9,0x01,0xff,0x70,0xaf,0x01,0xff,0x55,0x84,0x01,0xff, 0x3e,0x5f,0x01,0xff,0x3b,0x5b,0x01,0xff,0x37,0x54,0x01,0xeb,0x17,0x23,0x01, 0x87,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x04,0x46,0x6d,0x02,0x26,0x6d,0xaa,0x01,0xc3,0x76,0xb7,0x01,0xff,0x76, 0xb8,0x01,0xff,0x76,0xb9,0x01,0xff,0x82,0x76,0xb8,0x01,0xff,0x12,0x73,0xb4, 0x01,0xff,0x4e,0x78,0x01,0xff,0x39,0x59,0x01,0xff,0x32,0x4d,0x01,0xdd,0x0b, 0x11,0x01,0x71,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x15, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x4a,0x0f,0x17,0x01,0x79,0x2f,0x49,0x01, 0xcd,0x3b,0x5b,0x01,0xfe,0x3b,0x5b,0x01,0xff,0x3c,0x5c,0x01,0xff,0x4e,0x79, 0x01,0xff,0x71,0xb0,0x01,0xff,0x76,0xb8,0x01,0xff,0x83,0x76,0xb7,0x01,0xff, 0x02,0x31,0x4c,0x01,0x66,0x00,0x00,0x00,0x0d,0x82,0x00,0x00,0x00,0x00,0x13, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x49,0x2d,0x45,0x01, 0xb3,0x6c,0xa7,0x01,0xff,0x73,0xb2,0x01,0xff,0x72,0xb1,0x01,0xff,0x72,0xb2, 0x01,0xff,0x72,0xb1,0x01,0xff,0x63,0x99,0x01,0xff,0x48,0x6f,0x01,0xed,0x2d, 0x44,0x03,0x2c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x35, 0x12,0x1b,0x01,0x7c,0x39,0x59,0x01,0xf4,0x60,0x95,0x01,0xff,0x74,0xb3,0x01, 0xff,0x82,0x73,0xb3,0x01,0xff,0x18,0x6e,0xab,0x01,0xff,0x5c,0x8e,0x01,0xc5, 0x37,0x54,0x02,0x25,0x00,0x00,0x00,0x19,0x39,0x58,0x01,0x8a,0x73,0xb3,0x01, 0xff,0x74,0xb4,0x01,0xff,0x74,0xb5,0x01,0xff,0x75,0xb5,0x01,0xff,0x74,0xb5, 0x01,0xff,0x72,0xb1,0x01,0xff,0x65,0x9e,0x01,0xff,0x51,0x7e,0x01,0xff,0x3f, 0x60,0x01,0xff,0x3b,0x5b,0x01,0xff,0x3b,0x5a,0x01,0xfd,0x2c,0x43,0x01,0xc2, 0x07,0x0a,0x00,0x66,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x16,0x00,0x00,0x00, 0x06,0x02,0x03,0x00,0x08,0x60,0x94,0x02,0x5e,0x70,0xaf,0x01,0xec,0x82,0x74, 0xb4,0x01,0xff,0x17,0x74,0xb5,0x01,0xff,0x74,0xb4,0x01,0xff,0x74,0xb5,0x01, 0xff,0x68,0xa1,0x01,0xff,0x43,0x68,0x01,0xff,0x39,0x58,0x01,0xfe,0x2a,0x40, 0x01,0xbe,0x03,0x04,0x00,0x5f,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x16, 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x51,0x18,0x24,0x01,0x8a,0x35,0x51,0x01, 0xe2,0x3b,0x5b,0x01,0xff,0x3a,0x59,0x01,0xff,0x45,0x6b,0x01,0xff,0x71,0xb0, 0x01,0xff,0x74,0xb4,0x01,0xff,0x82,0x73,0xb3,0x01,0xff,0x02,0x2e,0x47,0x01, 0x63,0x00,0x00,0x00,0x0d,0x83,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x07, 0x00,0x00,0x00,0x24,0x02,0x02,0x00,0x5a,0x3c,0x5c,0x01,0xd7,0x6c,0xa8,0x01, 0xff,0x82,0x6f,0xad,0x01,0xff,0x26,0x70,0xad,0x01,0xff,0x6e,0xab,0x01,0xff, 0x5e,0x92,0x01,0xff,0x43,0x68,0x01,0xce,0x1e,0x2d,0x02,0x15,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x3e,0x16,0x21,0x01,0x88,0x38,0x57, 0x01,0xf5,0x53,0x81,0x01,0xff,0x6e,0xac,0x01,0xff,0x70,0xaf,0x01,0xff,0x70, 0xae,0x01,0xff,0x70,0xad,0x01,0xff,0x68,0xa2,0x01,0xed,0x4f,0x7a,0x01,0x84, 0x2e,0x47,0x01,0x97,0x43,0x67,0x01,0xff,0x4c,0x76,0x01,0xff,0x50,0x7b,0x01, 0xff,0x4e,0x79,0x01,0xff,0x48,0x6f,0x01,0xff,0x3f,0x62,0x01,0xff,0x3c,0x5d, 0x01,0xff,0x3b,0x5b,0x01,0xff,0x3b,0x5b,0x01,0xfd,0x31,0x4b,0x01,0xd4,0x14, 0x1f,0x01,0x85,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x07,0x49,0x72,0x02,0x24,0x6a,0xa4,0x01,0xae,0x70,0xaf,0x01, 0xfe,0x70,0xaf,0x01,0xff,0x71,0xb0,0x01,0xff,0x82,0x71,0xaf,0x01,0xff,0x09, 0x70,0xaf,0x01,0xff,0x56,0x86,0x01,0xff,0x3c,0x5c,0x01,0xff,0x38,0x57,0x01, 0xf7,0x1e,0x2e,0x01,0x9d,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x02,0x83,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x38,0x03,0x04, 0x00,0x5f,0x2c,0x44,0x01,0xc7,0x47,0x6d,0x01,0xff,0x68,0xa1,0x01,0xff,0x84, 0x70,0xae,0x01,0xff,0x02,0x2b,0x42,0x01,0x60,0x00,0x00,0x00,0x0d,0x83,0x00, 0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0c,0x00,0x00,0x00, 0x30,0x09,0x0e,0x01,0x6d,0x43,0x67,0x01,0xea,0x6a,0xa5,0x01,0xff,0x6c,0xa7, 0x01,0xff,0x6c,0xa8,0x01,0xff,0x6c,0xa7,0x01,0xff,0x6b,0xa6,0x01,0xff,0x5b, 0x8e,0x01,0xff,0x41,0x63,0x02,0xb4,0x11,0x19,0x03,0x0d,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x41,0x12,0x1c,0x01,0x82,0x35,0x52,0x01, 0xeb,0x44,0x69,0x01,0xff,0x5f,0x93,0x01,0xff,0x6d,0xa8,0x01,0xff,0x82,0x6d, 0xa9,0x01,0xff,0x03,0x57,0x87,0x01,0xff,0x3c,0x5c,0x01,0xfe,0x39,0x58,0x01, 0xf5,0x84,0x3c,0x5c,0x01,0xff,0x0b,0x3c,0x5c,0x01,0xfd,0x36,0x53,0x01,0xe8, 0x2a,0x40,0x01,0xbe,0x11,0x1a,0x01,0x82,0x00,0x00,0x00,0x55,0x00,0x00,0x00, 0x36,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x0b,0x2c,0x45,0x02,0x13,0x65,0x9c, 0x01,0x7d,0x6c,0xa8,0x01,0xf1,0x82,0x6d,0xaa,0x01,0xff,0x83,0x6e,0xab,0x01, 0xff,0x09,0x66,0x9e,0x01,0xff,0x46,0x6d,0x01,0xff,0x3b,0x5a,0x01,0xff,0x32, 0x4d,0x01,0xdd,0x10,0x18,0x01,0x7c,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x1f, 0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x86,0x00,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x04,0x01,0x01,0x00,0x14,0x2b,0x42,0x01,0x85,0x54,0x83,0x01,0xf8, 0x6c,0xa8,0x01,0xff,0x84,0x6d,0xa9,0x01,0xff,0x03,0x6c,0xa8,0x01,0xff,0x28, 0x3e,0x01,0x5d,0x00,0x00,0x00,0x0c,0x84,0x00,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x3a,0x11,0x19,0x01,0x7f,0x45, 0x6b,0x01,0xf3,0x67,0xa0,0x01,0xff,0x83,0x68,0xa2,0x01,0xff,0x1d,0x68,0xa1, 0x01,0xff,0x5b,0x8e,0x01,0xff,0x40,0x62,0x02,0xa9,0x15,0x1f,0x02,0x0d,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x3d,0x08,0x0b,0x00,0x6e, 0x2d,0x45,0x01,0xcc,0x3b,0x5b,0x01,0xfe,0x45,0x6b,0x01,0xff,0x58,0x88,0x01, 0xff,0x66,0x9e,0x01,0xff,0x55,0x83,0x01,0xff,0x38,0x55,0x01,0xff,0x0c,0x13, 0x01,0x89,0x0b,0x11,0x01,0x81,0x17,0x23,0x01,0x92,0x19,0x27,0x01,0x96,0x15, 0x20,0x01,0x8c,0x07,0x0b,0x00,0x75,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x4c, 0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x0f,0x33,0x50,0x01, 0x17,0x63,0x9a,0x01,0x74,0x69,0xa3,0x01,0xe3,0x82,0x6a,0xa5,0x01,0xff,0x0d, 0x6b,0xa5,0x01,0xff,0x6a,0xa4,0x01,0xff,0x6a,0xa5,0x01,0xff,0x68,0xa2,0x01, 0xff,0x52,0x7e,0x01,0xff,0x3d,0x5d,0x01,0xff,0x3a,0x58,0x01,0xfa,0x25,0x39, 0x01,0xb0,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x16,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x86,0x00,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x03,0x29,0x3e,0x02,0x28,0x4b,0x73,0x01,0xb9,0x64,0x9b,0x01,0xff,0x69, 0xa4,0x01,0xff,0x6a,0xa4,0x01,0xff,0x6a,0xa5,0x01,0xff,0x83,0x6a,0xa4,0x01, 0xff,0x03,0x69,0xa3,0x01,0xff,0x25,0x39,0x01,0x5a,0x00,0x00,0x00,0x0c,0x85, 0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x16,0x00,0x00, 0x00,0x42,0x15,0x20,0x01,0x8a,0x44,0x68,0x01,0xf7,0x63,0x99,0x01,0xff,0x83, 0x65,0x9d,0x01,0xff,0x0f,0x66,0x9e,0x01,0xff,0x5e,0x92,0x01,0xff,0x41,0x64, 0x02,0xb3,0x1f,0x2f,0x02,0x13,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x13,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x59,0x18,0x25,0x01,0x94,0x33,0x4e,0x01,0xde, 0x3b,0x5b,0x01,0xfe,0x3d,0x5e,0x01,0xff,0x41,0x64,0x01,0xff,0x36,0x53,0x01, 0xff,0x10,0x18,0x01,0x63,0x82,0x00,0x00,0x00,0x39,0x0c,0x00,0x00,0x00,0x3b, 0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x23,0x00,0x00,0x00, 0x18,0x0b,0x11,0x00,0x13,0x57,0x87,0x02,0x3e,0x64,0x9b,0x01,0x95,0x67,0xa0, 0x01,0xec,0x67,0x9f,0x01,0xff,0x67,0xa0,0x01,0xff,0x67,0x9f,0x01,0xff,0x82, 0x67,0xa0,0x01,0xff,0x0a,0x66,0x9e,0x01,0xff,0x56,0x85,0x01,0xff,0x40,0x63, 0x01,0xff,0x3b,0x5b,0x01,0xff,0x33,0x4e,0x01,0xdd,0x12,0x1c,0x01,0x83,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x03, 0x86,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x1d,0x2c,0x02,0x13,0x48, 0x6f,0x02,0x84,0x5e,0x91,0x01,0xf3,0x67,0xa0,0x01,0xff,0x86,0x67,0x9f,0x01, 0xff,0x04,0x66,0x9f,0x01,0xff,0x66,0x9d,0x01,0xff,0x21,0x33,0x01,0x55,0x00, 0x00,0x00,0x0b,0x86,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x1a,0x00,0x00,0x00,0x45,0x16,0x22,0x01,0x8d,0x3f,0x62,0x01,0xf5,0x5e, 0x92,0x01,0xff,0x63,0x99,0x01,0xff,0x83,0x63,0x9a,0x01,0xff,0x16,0x62,0x99, 0x01,0xff,0x47,0x6e,0x01,0xcf,0x2d,0x44,0x02,0x2b,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x60, 0x14,0x1f,0x01,0x8d,0x2a,0x41,0x01,0xc3,0x36,0x53,0x01,0xea,0x3b,0x5b,0x01, 0xfe,0x3d,0x5e,0x01,0x7f,0x3a,0x59,0x01,0x3d,0x2c,0x44,0x02,0x29,0x2d,0x46, 0x01,0x28,0x46,0x6d,0x01,0x33,0x5a,0x8c,0x01,0x4a,0x61,0x97,0x01,0x70,0x64, 0x9b,0x01,0xa2,0x65,0x9d,0x01,0xe1,0x65,0x9c,0x01,0xff,0x85,0x64,0x9b,0x01, 0xff,0x0b,0x62,0x99,0x01,0xff,0x54,0x82,0x01,0xff,0x41,0x64,0x01,0xff,0x3c, 0x5c,0x01,0xff,0x38,0x55,0x01,0xef,0x20,0x31,0x01,0xa4,0x01,0x01,0x00,0x5e, 0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x01,0x85,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x1a,0x27,0x02,0x0f, 0x4b,0x74,0x02,0x71,0x5d,0x91,0x01,0xe5,0x66,0x9e,0x01,0xff,0x83,0x64,0x9b, 0x01,0xff,0x01,0x64,0x9a,0x01,0xff,0x82,0x64,0x9b,0x01,0xff,0x01,0x63,0x9a, 0x01,0xff,0x82,0x64,0x9b,0x01,0xff,0x03,0x63,0x99,0x01,0xff,0x1e,0x2e,0x01, 0x52,0x00,0x00,0x00,0x0b,0x87,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x46,0x13,0x1c,0x01,0x87,0x3a,0x59,0x01, 0xef,0x57,0x86,0x01,0xff,0x84,0x61,0x97,0x01,0xff,0x0d,0x65,0x9d,0x01,0xff, 0x54,0x82,0x01,0xf1,0x39,0x57,0x02,0x6c,0x0e,0x15,0x01,0x0a,0x00,0x00,0x00, 0x07,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x3c,0x00,0x00, 0x00,0x53,0x00,0x00,0x00,0x68,0x26,0x3b,0x01,0xa8,0x62,0x99,0x01,0xff,0x66, 0x9e,0x01,0xff,0x82,0x66,0x9f,0x01,0xfe,0x02,0x65,0x9c,0x01,0xff,0x62,0x99, 0x01,0xff,0x87,0x62,0x98,0x01,0xff,0x0b,0x5b,0x8d,0x01,0xff,0x4d,0x77,0x01, 0xff,0x3f,0x61,0x01,0xff,0x3c,0x5c,0x01,0xff,0x38,0x56,0x01,0xf1,0x25,0x38, 0x01,0xb1,0x04,0x07,0x00,0x6b,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x03,0x84,0x00,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x2b,0x40,0x02,0x17,0x52,0x7f,0x01,0x79,0x5f, 0x94,0x01,0xe5,0x65,0x9d,0x01,0xff,0x84,0x61,0x97,0x01,0xff,0x82,0x62,0x97, 0x01,0xff,0x82,0x61,0x97,0x01,0xff,0x01,0x62,0x98,0x01,0xff,0x82,0x61,0x97, 0x01,0xff,0x03,0x60,0x95,0x01,0xff,0x1c,0x2a,0x01,0x4e,0x00,0x00,0x00,0x0b, 0x88,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x1a,0x00, 0x00,0x00,0x42,0x0c,0x12,0x00,0x79,0x33,0x4e,0x01,0xe0,0x4b,0x75,0x01,0xff, 0x5f,0x93,0x01,0xff,0x83,0x60,0x96,0x01,0xff,0x0c,0x62,0x99,0x01,0xff,0x62, 0x98,0x01,0xff,0x4e,0x78,0x01,0xca,0x32,0x4d,0x02,0x4a,0x08,0x0c,0x01,0x08, 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x19,0x00,0x00,0x00, 0x33,0x28,0x3d,0x01,0x94,0x60,0x94,0x01,0xff,0x61,0x96,0x01,0xff,0x87,0x61, 0x97,0x01,0xff,0x0e,0x5f,0x94,0x01,0xff,0x58,0x89,0x01,0xff,0x4e,0x79,0x01, 0xff,0x43,0x67,0x01,0xff,0x3d,0x5d,0x01,0xff,0x3c,0x5c,0x01,0xff,0x35,0x52, 0x01,0xe6,0x22,0x34,0x01,0xab,0x05,0x07,0x00,0x6c,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01, 0x83,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x05,0x07,0x00,0x05,0x3e, 0x60,0x02,0x32,0x5b,0x8c,0x01,0x98,0x63,0x99,0x01,0xf1,0x64,0x9b,0x01,0xff, 0x82,0x60,0x96,0x01,0xff,0x86,0x61,0x96,0x01,0xff,0x83,0x60,0x96,0x01,0xff, 0x82,0x60,0x95,0x01,0xff,0x03,0x5e,0x92,0x01,0xfe,0x18,0x24,0x01,0x4a,0x00, 0x00,0x00,0x0a,0x89,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x16,0x00,0x00,0x00,0x3a,0x03,0x05,0x00,0x68,0x29,0x3f,0x01,0xc0,0x40, 0x63,0x01,0xfd,0x56,0x85,0x01,0xff,0x61,0x96,0x01,0xff,0x83,0x61,0x97,0x01, 0xff,0x09,0x64,0x9c,0x01,0xff,0x62,0x98,0x01,0xff,0x54,0x82,0x01,0xce,0x3d, 0x5e,0x02,0x6e,0x22,0x34,0x02,0x1d,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x1a, 0x2b,0x42,0x01,0x8a,0x57,0x87,0x01,0xff,0x82,0x5a,0x8c,0x01,0xff,0x07,0x59, 0x8a,0x01,0xff,0x57,0x88,0x01,0xff,0x54,0x83,0x01,0xff,0x50,0x7c,0x01,0xff, 0x4b,0x74,0x01,0xff,0x44,0x69,0x01,0xff,0x3e,0x60,0x01,0xff,0x82,0x3c,0x5d, 0x01,0xff,0x09,0x38,0x56,0x01,0xef,0x2b,0x42,0x01,0xc5,0x15,0x20,0x01,0x8f, 0x00,0x01,0x00,0x63,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x2d,0x00,0x00,0x00, 0x16,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x00,0x08, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x2e,0x47,0x02,0x1e,0x54,0x82,0x02, 0x72,0x61,0x96,0x01,0xc8,0x66,0x9e,0x01,0xfd,0x63,0x9a,0x01,0xff,0x62,0x97, 0x01,0xff,0x85,0x61,0x97,0x01,0xff,0x02,0x61,0x96,0x01,0xff,0x60,0x96,0x01, 0xff,0x86,0x60,0x95,0x01,0xff,0x04,0x60,0x96,0x01,0xff,0x5d,0x91,0x01,0xfd, 0x14,0x1d,0x01,0x45,0x00,0x00,0x00,0x09,0x8a,0x00,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x57, 0x17,0x23,0x01,0x94,0x36,0x53,0x01,0xe9,0x46,0x6c,0x01,0xff,0x59,0x8a,0x01, 0xff,0x62,0x98,0x01,0xff,0x83,0x63,0x99,0x01,0xff,0x06,0x63,0x9a,0x01,0xff, 0x68,0xa2,0x01,0xff,0x60,0x95,0x01,0xfb,0x5b,0x8d,0x01,0xcd,0x4e,0x78,0x01, 0xa0,0x32,0x4d,0x01,0xbe,0x84,0x3d,0x5e,0x01,0xff,0x83,0x3c,0x5d,0x01,0xff, 0x0c,0x3b,0x5b,0x01,0xfa,0x37,0x54,0x01,0xea,0x2f,0x49,0x01,0xd1,0x24,0x38, 0x01,0xb2,0x12,0x1b,0x01,0x8a,0x01,0x01,0x00,0x68,0x00,0x00,0x00,0x53,0x00, 0x00,0x00,0x3c,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x08, 0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x01,0x06,0x00,0x00,0x00,0x04,0x26, 0x39,0x02,0x18,0x4d,0x78,0x02,0x65,0x5f,0x93,0x01,0xbc,0x66,0x9e,0x01,0xfa, 0x67,0x9f,0x01,0xff,0x82,0x63,0x9a,0x01,0xff,0x83,0x63,0x99,0x01,0xff,0x87, 0x62,0x98,0x01,0xff,0x01,0x62,0x97,0x01,0xff,0x85,0x61,0x97,0x01,0xff,0x03, 0x5d,0x91,0x01,0xfc,0x10,0x18,0x01,0x40,0x00,0x00,0x00,0x09,0x8b,0x00,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x22, 0x00,0x00,0x00,0x45,0x03,0x05,0x00,0x6c,0x24,0x37,0x01,0xb3,0x39,0x58,0x01, 0xf3,0x46,0x6c,0x01,0xff,0x56,0x86,0x01,0xff,0x63,0x9a,0x01,0xff,0x85,0x65, 0x9d,0x01,0xff,0x1b,0x58,0x88,0x01,0xff,0x39,0x58,0x01,0xff,0x1e,0x2e,0x01, 0xa9,0x1d,0x2c,0x01,0xa3,0x1f,0x2f,0x01,0xa7,0x1e,0x2e,0x01,0xa5,0x1c,0x2b, 0x01,0x9f,0x17,0x23,0x01,0x95,0x0e,0x15,0x00,0x85,0x04,0x07,0x00,0x73,0x00, 0x00,0x00,0x66,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x3a, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x0d,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x0e,0x15,0x01,0x08,0x34,0x4f, 0x02,0x33,0x52,0x7f,0x01,0x79,0x5f,0x94,0x01,0xbf,0x66,0x9e,0x01,0xf6,0x6b, 0xa6,0x01,0xff,0x67,0x9f,0x01,0xff,0x82,0x66,0x9e,0x01,0xff,0x03,0x65,0x9d, 0x01,0xff,0x64,0x9c,0x01,0xff,0x65,0x9d,0x01,0xff,0x83,0x64,0x9b,0x01,0xff, 0x01,0x63,0x9a,0x01,0xff,0x82,0x64,0x9b,0x01,0xff,0x83,0x63,0x9b,0x01,0xff, 0x82,0x64,0x9b,0x01,0xff,0x01,0x63,0x9a,0x01,0xff,0x83,0x63,0x99,0x01,0xff, 0x03,0x5e,0x92,0x01,0xfb,0x0c,0x11,0x01,0x3b,0x00,0x00,0x00,0x08,0x8c,0x00, 0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x15,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x51,0x06,0x09,0x00,0x74,0x25,0x38, 0x01,0xb5,0x37,0x55,0x01,0xed,0x3f,0x62,0x01,0xff,0x4c,0x76,0x01,0xff,0x59, 0x8b,0x01,0xff,0x64,0x9b,0x01,0xff,0x69,0xa2,0x01,0xff,0x69,0xa3,0x01,0xff, 0x5a,0x8b,0x01,0xff,0x38,0x55,0x01,0xff,0x0f,0x16,0x01,0x70,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x43,0x00,0x00, 0x00,0x3e,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x07, 0x00,0x00,0x00,0x05,0x09,0x0e,0x01,0x08,0x2c,0x43,0x02,0x2d,0x47,0x6e,0x02, 0x64,0x5a,0x8b,0x02,0xa1,0x62,0x98,0x01,0xe2,0x6c,0xa7,0x01,0xff,0x6d,0xa9, 0x01,0xff,0x6a,0xa4,0x01,0xff,0x69,0xa4,0x01,0xff,0x82,0x69,0xa3,0x01,0xff, 0x05,0x68,0xa2,0x01,0xff,0x68,0xa1,0x01,0xff,0x67,0xa1,0x01,0xff,0x67,0xa0, 0x01,0xff,0x68,0xa0,0x01,0xff,0x83,0x67,0xa0,0x01,0xff,0x01,0x67,0x9f,0x01, 0xff,0x83,0x67,0xa0,0x01,0xff,0x82,0x67,0x9f,0x01,0xff,0x83,0x67,0xa0,0x01, 0xff,0x06,0x67,0x9f,0x01,0xff,0x66,0x9e,0x01,0xff,0x66,0x9d,0x01,0xff,0x60, 0x94,0x01,0xf9,0x08,0x0b,0x00,0x37,0x00,0x00,0x00,0x08,0x8e,0x00,0x00,0x00, 0x00,0x23,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x1a,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x50,0x01,0x02,0x00,0x6b,0x19,0x26,0x01,0x9a, 0x2d,0x45,0x01,0xcc,0x39,0x57,0x01,0xf2,0x3d,0x5f,0x01,0xff,0x43,0x67,0x01, 0xff,0x4b,0x75,0x01,0xff,0x4c,0x75,0x01,0xff,0x38,0x56,0x01,0xff,0x14,0x1e, 0x01,0x53,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x0f,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x09, 0x00,0x00,0x00,0x08,0x14,0x1e,0x02,0x0f,0x29,0x3e,0x02,0x2a,0x3d,0x5d,0x02, 0x54,0x52,0x7e,0x02,0x85,0x5e,0x91,0x02,0xbb,0x64,0x9b,0x02,0xee,0x6e,0xab, 0x01,0xff,0x71,0xb1,0x01,0xff,0x6f,0xad,0x01,0xff,0x6e,0xac,0x01,0xff,0x6e, 0xab,0x01,0xff,0x6d,0xaa,0x01,0xff,0x82,0x6d,0xa9,0x01,0xff,0x83,0x6c,0xa8, 0x01,0xff,0x01,0x6c,0xa7,0x01,0xff,0x83,0x6b,0xa7,0x01,0xff,0x02,0x6c,0xa8, 0x01,0xff,0x6b,0xa7,0x01,0xff,0x87,0x6b,0xa6,0x01,0xff,0x85,0x6a,0xa5,0x01, 0xff,0x04,0x6a,0xa4,0x01,0xff,0x62,0x97,0x01,0xf7,0x04,0x06,0x01,0x33,0x00, 0x00,0x00,0x07,0x90,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x0a,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x44,0x00, 0x00,0x00,0x5b,0x02,0x03,0x00,0x6f,0x12,0x1c,0x01,0x8e,0x23,0x36,0x01,0xb1, 0x2d,0x45,0x01,0xcc,0x33,0x4f,0x01,0xe0,0x39,0x57,0x01,0xf4,0x45,0x6b,0x02, 0xad,0x48,0x6e,0x02,0x81,0x46,0x6c,0x02,0x74,0x47,0x6d,0x02,0x76,0x4c,0x75, 0x02,0x80,0x52,0x7f,0x03,0x8e,0x58,0x88,0x03,0xa3,0x5d,0x90,0x03,0xbb,0x61, 0x97,0x02,0xda,0x67,0x9f,0x02,0xf4,0x6f,0xac,0x02,0xfe,0x75,0xb6,0x02,0xff, 0x75,0xb5,0x01,0xff,0x74,0xb4,0x01,0xff,0x74,0xb3,0x01,0xff,0x73,0xb3,0x01, 0xff,0x73,0xb2,0x01,0xff,0x72,0xb2,0x01,0xff,0x72,0xb1,0x01,0xff,0x86,0x71, 0xb0,0x01,0xff,0x82,0x71,0xaf,0x01,0xff,0x02,0x70,0xaf,0x01,0xff,0x70,0xae, 0x01,0xff,0x82,0x70,0xaf,0x01,0xff,0x01,0x71,0xaf,0x01,0xff,0x82,0x70,0xae, 0x01,0xff,0x01,0x6f,0xad,0x01,0xff,0x83,0x70,0xae,0x01,0xff,0x82,0x6f,0xad, 0x01,0xff,0x82,0x6f,0xac,0x01,0xff,0x01,0x6e,0xac,0x01,0xff,0x82,0x6e,0xab, 0x01,0xff,0x03,0x63,0x9a,0x01,0xf5,0x02,0x03,0x01,0x31,0x00,0x00,0x00,0x07, 0x92,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x3e, 0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x68,0x22,0x34,0x01, 0xa4,0x71,0xaf,0x03,0xff,0x7a,0xbd,0x04,0xff,0x82,0x7a,0xbe,0x04,0xff,0x01, 0x7a,0xbd,0x04,0xff,0x82,0x79,0xbc,0x03,0xff,0x83,0x78,0xbb,0x02,0xff,0x02, 0x78,0xba,0x02,0xff,0x77,0xba,0x02,0xff,0x82,0x77,0xba,0x01,0xff,0x84,0x77, 0xb9,0x01,0xff,0x01,0x76,0xb9,0x01,0xff,0x87,0x76,0xb8,0x01,0xff,0x82,0x76, 0xb7,0x01,0xff,0x83,0x75,0xb7,0x01,0xff,0x01,0x76,0xb7,0x01,0xff,0x82,0x75, 0xb6,0x01,0xff,0x03,0x74,0xb5,0x01,0xff,0x75,0xb6,0x01,0xff,0x75,0xb5,0x01, 0xff,0x82,0x75,0xb6,0x01,0xff,0x01,0x74,0xb5,0x01,0xff,0x82,0x74,0xb4,0x01, 0xff,0x83,0x73,0xb3,0x01,0xff,0x03,0x66,0x9e,0x01,0xf4,0x02,0x03,0x01,0x2f, 0x00,0x00,0x00,0x06,0x94,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x14, 0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x31,0x25,0x39,0x01,0x92,0x72,0xb0,0x06, 0xff,0x8c,0x7d,0xc0,0x07,0xff,0x87,0x7c,0xbf,0x06,0xff,0x02,0x7b,0xbe,0x05, 0xff,0x7c,0xbf,0x06,0xff,0x86,0x7b,0xbe,0x05,0xff,0x86,0x7a,0xbd,0x04,0xff, 0x86,0x79,0xbc,0x03,0xff,0x83,0x78,0xbb,0x02,0xff,0x82,0x78,0xba,0x02,0xff, 0x03,0x67,0xa0,0x02,0xf3,0x01,0x02,0x00,0x2e,0x00,0x00,0x00,0x06,0x98,0x00, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x16,0x28,0x3e,0x01,0x87,0x74,0xb1,0x08,0xff,0x91,0x81,0xc4,0x0b,0xff,0x89, 0x80,0xc3,0x0a,0xff,0x82,0x7f,0xc2,0x09,0xff,0x85,0x7e,0xc1,0x08,0xff,0x82, 0x7d,0xc0,0x07,0xff,0x83,0x7c,0xbf,0x06,0xff,0x86,0x7d,0xc0,0x07,0xff,0x03, 0x69,0xa1,0x05,0xf2,0x01,0x02,0x00,0x2d,0x00,0x00,0x00,0x06,0x99,0x00,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x13,0x29,0x3f,0x01,0x85, 0x73,0xb0,0x09,0xff,0x94,0x83,0xc6,0x0d,0xff,0x87,0x82,0xc5,0x0c,0xff,0x03, 0x81,0xc4,0x0b,0xff,0x80,0xc3,0x0a,0xff,0x81,0xc4,0x0b,0xff,0x83,0x80,0xc3, 0x0a,0xff,0x86,0x7f,0xc2,0x09,0xff,0x85,0x80,0xc3,0x0a,0xff,0x03,0x68,0x9f, 0x06,0xf1,0x01,0x01,0x00,0x2c,0x00,0x00,0x00,0x06,0x99,0x00,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x13,0x29,0x40,0x01,0x84,0x59,0x89, 0x04,0xff,0x82,0x61,0x94,0x05,0xff,0x02,0x61,0x94,0x06,0xff,0x60,0x93,0x06, 0xff,0x82,0x60,0x92,0x06,0xff,0x01,0x61,0x94,0x06,0xff,0x82,0x61,0x95,0x06, 0xff,0x14,0x61,0x94,0x06,0xff,0x60,0x93,0x06,0xff,0x5f,0x92,0x06,0xff,0x5f, 0x91,0x06,0xff,0x5f,0x92,0x06,0xff,0x61,0x94,0x06,0xff,0x61,0x95,0x06,0xff, 0x62,0x95,0x06,0xff,0x62,0x96,0x06,0xff,0x62,0x95,0x06,0xff,0x62,0x96,0x06, 0xff,0x62,0x95,0x06,0xff,0x61,0x95,0x05,0xff,0x61,0x94,0x05,0xff,0x60,0x93, 0x05,0xff,0x60,0x92,0x05,0xff,0x5f,0x92,0x05,0xff,0x5e,0x91,0x05,0xff,0x5e, 0x90,0x05,0xff,0x5e,0x8f,0x05,0xff,0x83,0x5d,0x8f,0x05,0xff,0x02,0x5e,0x8f, 0x05,0xff,0x5e,0x90,0x05,0xff,0x84,0x5f,0x92,0x04,0xff,0x04,0x5e,0x90,0x04, 0xff,0x5d,0x8f,0x05,0xff,0x5d,0x8e,0x05,0xff,0x5c,0x8e,0x05,0xff,0x82,0x5c, 0x8d,0x04,0xff,0x03,0x50,0x7b,0x03,0xf1,0x01,0x01,0x00,0x2c,0x00,0x00,0x00, 0x05,0x99,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x11, 0x1f,0x2f,0x01,0x66,0x2e,0x47,0x01,0xc1,0x8a,0x2d,0x45,0x01,0xc9,0x01,0x2d, 0x44,0x01,0xc9,0x83,0x2d,0x45,0x01,0xc9,0x04,0x2d,0x44,0x01,0xc9,0x2d,0x45, 0x01,0xc9,0x2c,0x44,0x01,0xc9,0x2d,0x45,0x01,0xc9,0x82,0x2c,0x44,0x01,0xc8, 0x01,0x2c,0x44,0x01,0xc9,0x8f,0x2c,0x44,0x01,0xc8,0x01,0x2c,0x43,0x01,0xc8, 0x82,0x2c,0x44,0x01,0xc8,0x84,0x2c,0x43,0x01,0xc8,0x04,0x2c,0x44,0x01,0xc6, 0x2e,0x46,0x01,0xae,0x00,0x01,0x00,0x28,0x00,0x00,0x00,0x05,0x9a,0x00,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x4f, 0xab,0x00,0x00,0x00,0x5b,0x04,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x03,0x9a,0x00,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x1c,0x89, 0x00,0x00,0x00,0x1d,0xa1,0x00,0x00,0x00,0x1c,0x04,0x00,0x00,0x00,0x1b,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x9b,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x01,0xad,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00, 0x01,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00, 0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00, 0x00,0xcb,0x00,0x00,0x00,0x00 }; static const GdkPixdata nvidia_icon_pixdata = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 10776, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 304, /* rowstride */ 76, /* width */ 76, /* height */ nvidia_icon_pixdata_pixel_data /* pixel_data */ }; nvidia-settings/src/image_data/display_config_pixdata.h0000664000175000017500000045743312236467170023601 0ustar albertoalberto/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static guint8 display_config_pixdata_pixel_data[] = { 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0x8d,0xff,0xff,0xff,0x00,0x8e,0x00,0x00,0x00,0x00, 0x26,0xcc,0xcb,0xd4,0x00,0xce,0xcf,0xd6,0x00,0xd2,0xd2,0xda,0x00,0xd9,0xd9, 0xe0,0x00,0xb4,0xb5,0xbf,0x00,0xb5,0xb5,0xbf,0x00,0xb7,0xb7,0xc2,0x00,0xb6, 0xb6,0xc3,0x00,0xbb,0xbb,0xc4,0x00,0xbe,0xbe,0xc6,0x00,0xc1,0xc2,0xca,0x00, 0xc7,0xc7,0xcf,0x00,0xcc,0xcc,0xd3,0x00,0xd3,0xd3,0xdb,0x00,0xa9,0xa9,0xb3, 0x00,0xac,0xac,0xb5,0x00,0xab,0xab,0xb4,0x00,0xac,0xac,0xb4,0x00,0xb3,0xb3, 0xbb,0x00,0xb5,0xb6,0xbd,0x00,0xb9,0xb9,0xc1,0x00,0xbf,0xbe,0xc6,0x00,0xc4, 0xc4,0xcc,0x00,0xcb,0xcb,0xd3,0x00,0x9c,0x9c,0xa5,0x00,0x9e,0x9d,0xa5,0x0b, 0x98,0x97,0x9f,0x1f,0x98,0x98,0xa0,0x38,0xa1,0xa3,0xaa,0x52,0xa4,0xa5,0xac, 0x6b,0xb0,0xae,0xb6,0x77,0xbc,0xbc,0xc4,0x7f,0xc8,0xc8,0xcf,0x84,0xc3,0xc2, 0xc9,0x8a,0xd0,0xd0,0xd6,0x9e,0xca,0xca,0xd1,0x76,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x02,0x84,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x00,0x8e,0x00, 0x00,0x00,0x00,0x1f,0xcc,0xcb,0xd4,0x00,0xce,0xcf,0xd6,0x00,0xd2,0xd2,0xda, 0x00,0xd9,0xd9,0xe0,0x00,0xb4,0xb5,0xbf,0x00,0xb5,0xb5,0xbf,0x00,0xb6,0xb6, 0xc1,0x00,0xb5,0xb5,0xc2,0x00,0xba,0xba,0xc3,0x00,0xbd,0xbd,0xc5,0x00,0xc0, 0xc1,0xc9,0x00,0xc6,0xc6,0xce,0x00,0xcc,0xcc,0xd3,0x00,0xd2,0xd2,0xda,0x00, 0xa7,0xa7,0xb2,0x00,0xa9,0xa9,0xb3,0x06,0xa8,0xa8,0xb1,0x19,0xa6,0xa6,0xae, 0x31,0xaf,0xaf,0xb7,0x4b,0xaf,0xb0,0xb6,0x69,0xb4,0xb4,0xbc,0x86,0xbb,0xba, 0xc2,0x9e,0xc0,0xc0,0xc7,0xbb,0xc8,0xc8,0xd0,0xd3,0xd0,0xd1,0xd8,0xe9,0xd9, 0xd9,0xe0,0xfb,0xe1,0xe1,0xe8,0xff,0xe7,0xe7,0xee,0xff,0xeb,0xeb,0xf3,0xff, 0xee,0xee,0xf7,0xff,0xf0,0xf0,0xf8,0xff,0x82,0xef,0xef,0xf8,0xff,0x06,0xef, 0xef,0xf9,0xff,0xf1,0xf1,0xfc,0xff,0xda,0xda,0xe3,0xdf,0x00,0x00,0x00,0x0f, 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x83,0x00,0x00,0x00,0x00,0x8b,0xff, 0xff,0xff,0x00,0x8b,0x00,0x00,0x00,0x00,0x02,0xbc,0xbc,0xc4,0x00,0xc9,0xc8, 0xd0,0x00,0x82,0xc8,0xc8,0xd0,0x00,0x18,0xd1,0xd1,0xd8,0x00,0xad,0xab,0xb5, 0x00,0xb7,0xb7,0xbf,0x00,0xa1,0xa2,0xab,0x00,0xa2,0xa2,0xab,0x00,0xab,0xac, 0xb4,0x00,0xb8,0xb8,0xbe,0x00,0xc0,0xc1,0xc8,0x00,0xbc,0xbc,0xc4,0x00,0xc4, 0xc4,0xcb,0x00,0x97,0x97,0xa1,0x02,0xa7,0xa6,0xae,0x11,0xab,0xab,0xb3,0x21, 0x94,0x94,0x9c,0x35,0x9f,0x9e,0xa6,0x4f,0xa9,0xa7,0xaf,0x6d,0xb4,0xb7,0xbc, 0x8a,0xc4,0xc4,0xca,0xa5,0xd3,0xd2,0xd9,0xb2,0xe2,0xe3,0xe9,0xb9,0xee,0xee, 0xf4,0xc9,0xb7,0xb7,0xbe,0x63,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x83, 0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x85,0x00,0x00,0x00,0x00,0x01, 0x40,0x3f,0x49,0x00,0x82,0x40,0x40,0x4a,0x00,0x09,0x3f,0x3f,0x49,0x00,0x4c, 0x4d,0x5b,0x00,0x55,0x55,0x64,0x00,0x50,0x50,0x5e,0x00,0x4f,0x4f,0x5f,0x00, 0x50,0x50,0x5f,0x00,0x4a,0x4a,0x58,0x00,0x4a,0x49,0x57,0x00,0x47,0x47,0x54, 0x00,0x82,0x49,0x49,0x56,0x00,0x25,0x4b,0x4b,0x5a,0x00,0x4c,0x4b,0x59,0x00, 0x4a,0x4a,0x58,0x00,0x4c,0x4c,0x5a,0x00,0x47,0x47,0x55,0x00,0x48,0x48,0x56, 0x00,0x45,0x46,0x51,0x00,0x45,0x45,0x53,0x00,0x47,0x47,0x55,0x00,0x48,0x48, 0x55,0x00,0x47,0x48,0x55,0x00,0x47,0x47,0x54,0x00,0x48,0x48,0x55,0x00,0x43, 0x43,0x50,0x00,0x46,0x47,0x52,0x00,0x45,0x45,0x50,0x0a,0x3e,0x3e,0x4b,0x1e, 0x40,0x40,0x4c,0x3c,0x42,0x42,0x4e,0x55,0x42,0x43,0x4e,0x70,0x42,0x42,0x4e, 0x8c,0x42,0x42,0x4f,0xab,0x44,0x43,0x4f,0xc3,0x42,0x44,0x50,0xd8,0x43,0x43, 0x50,0xf0,0x44,0x44,0x51,0xf9,0x43,0x43,0x50,0xe2,0x43,0x42,0x4e,0xce,0x42, 0x42,0x4f,0xb8,0x43,0x43,0x50,0x9b,0x44,0x44,0x50,0x7d,0x42,0x42,0x4f,0x60, 0x46,0x45,0x54,0x4a,0x4c,0x4b,0x59,0x2c,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x83,0xff,0xff,0xff,0x00,0x8e,0x00,0x00,0x00,0x00, 0x14,0xcc,0xca,0xd4,0x00,0xcd,0xcf,0xd5,0x00,0xd2,0xd2,0xda,0x00,0xd8,0xd8, 0xdf,0x00,0xb2,0xb3,0xbd,0x00,0xb3,0xb3,0xbd,0x03,0xb4,0xb4,0xbf,0x16,0xaf, 0xaf,0xbb,0x2d,0xb5,0xb5,0xbe,0x45,0xb7,0xb7,0xbf,0x64,0xbb,0xbc,0xc4,0x80, 0xc2,0xc2,0xca,0x9d,0xc8,0xc8,0xcf,0xb7,0xce,0xce,0xd6,0xd0,0xd7,0xd7,0xde, 0xe5,0xde,0xde,0xe6,0xf8,0xe5,0xe5,0xeb,0xff,0xe9,0xe9,0xf1,0xff,0xec,0xec, 0xf4,0xff,0xef,0xf0,0xf8,0xff,0x82,0xf2,0xf3,0xfb,0xff,0x11,0xf3,0xf4,0xfe, 0xff,0xf2,0xf2,0xfc,0xff,0xf1,0xf1,0xfc,0xff,0xf0,0xf0,0xfb,0xff,0xee,0xee, 0xf9,0xff,0xec,0xec,0xf7,0xff,0xeb,0xeb,0xf6,0xff,0xea,0xea,0xf5,0xff,0xe9, 0xe9,0xf4,0xff,0xe8,0xe8,0xf3,0xff,0xe9,0xe9,0xf4,0xff,0xe8,0xe9,0xf2,0xff, 0xe9,0xe9,0xf5,0xff,0xce,0xce,0xd8,0xde,0x00,0x00,0x00,0x21,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x05,0x83,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00, 0x8b,0x00,0x00,0x00,0x00,0x1d,0xbb,0xbb,0xc3,0x00,0xc8,0xc7,0xcf,0x00,0xc8, 0xc8,0xd0,0x00,0xc7,0xc7,0xd0,0x00,0xd0,0xd0,0xd7,0x00,0xab,0xaa,0xb3,0x00, 0xb5,0xb5,0xbd,0x01,0x9e,0x9f,0xa8,0x0e,0x9b,0x9b,0xa3,0x24,0xa3,0xa4,0xab, 0x3f,0xb1,0xb1,0xb8,0x56,0xba,0xbb,0xc2,0x6f,0xb7,0xb7,0xbf,0x8c,0xc0,0xc0, 0xc6,0xac,0xc9,0xc9,0xd1,0xc3,0xd2,0xd2,0xd9,0xd6,0xdb,0xdb,0xe3,0xe9,0xe2, 0xe2,0xeb,0xfa,0xe8,0xe8,0xf0,0xff,0xeb,0xec,0xf5,0xff,0xef,0xee,0xf8,0xff, 0xef,0xef,0xf7,0xff,0xef,0xef,0xf8,0xff,0xef,0xee,0xf8,0xff,0xea,0xea,0xf6, 0xff,0xbd,0xbd,0xc6,0xa4,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x02,0x82,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x85,0x00,0x00, 0x00,0x00,0x01,0x40,0x3f,0x49,0x00,0x82,0x40,0x40,0x4a,0x00,0x09,0x3f,0x3f, 0x49,0x00,0x4c,0x4d,0x5b,0x00,0x55,0x55,0x64,0x00,0x50,0x50,0x5e,0x00,0x4f, 0x4f,0x5f,0x00,0x50,0x50,0x5f,0x00,0x4a,0x4a,0x58,0x00,0x4a,0x49,0x57,0x00, 0x46,0x47,0x53,0x00,0x82,0x49,0x49,0x56,0x00,0x12,0x4b,0x4b,0x5a,0x00,0x4c, 0x4b,0x59,0x00,0x4a,0x4a,0x58,0x00,0x4c,0x4c,0x5a,0x00,0x46,0x46,0x54,0x00, 0x48,0x48,0x56,0x02,0x44,0x45,0x51,0x0f,0x42,0x42,0x50,0x27,0x45,0x45,0x53, 0x44,0x46,0x46,0x52,0x5f,0x45,0x46,0x53,0x79,0x45,0x45,0x52,0x98,0x46,0x46, 0x53,0xb5,0x47,0x47,0x55,0xcb,0x48,0x48,0x56,0xdf,0x48,0x49,0x57,0xf3,0x49, 0x49,0x56,0xff,0x49,0x49,0x57,0xff,0x82,0x48,0x48,0x57,0xff,0x11,0x4a,0x49, 0x58,0xff,0x4b,0x4b,0x59,0xff,0x4d,0x4c,0x5b,0xff,0x4f,0x4f,0x60,0xff,0x55, 0x55,0x63,0xff,0x59,0x59,0x69,0xff,0x60,0x5f,0x6e,0xff,0x66,0x65,0x74,0xff, 0x6a,0x6b,0x7b,0xff,0x71,0x71,0x80,0xff,0x76,0x76,0x86,0xff,0x7c,0x7c,0x8a, 0xff,0x7f,0x81,0x90,0xff,0x7f,0x7f,0x8d,0xf7,0x43,0x43,0x4b,0x17,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x02,0x83,0xff,0xff,0xff,0x00,0x8a,0x00,0x00,0x00, 0x00,0x10,0xc1,0xc2,0xca,0x11,0xbf,0xbf,0xcb,0x2a,0xc1,0xc1,0xc8,0x41,0xc4, 0xc4,0xcc,0x5d,0xc7,0xc6,0xcf,0x79,0xca,0xcb,0xd2,0x96,0xce,0xce,0xd5,0xb5, 0xd4,0xd4,0xdb,0xcf,0xda,0xda,0xe1,0xe0,0xe2,0xe2,0xe8,0xf4,0xe6,0xe6,0xed, 0xff,0xeb,0xeb,0xf2,0xff,0xee,0xef,0xf6,0xff,0xf2,0xf2,0xfa,0xff,0xf4,0xf3, 0xfc,0xff,0xf4,0xf4,0xfc,0xff,0x82,0xf4,0xf4,0xfe,0xff,0x07,0xf3,0xf3,0xfd, 0xff,0xf2,0xf2,0xfc,0xff,0xef,0xef,0xfa,0xff,0xee,0xee,0xf9,0xff,0xed,0xec, 0xf8,0xff,0xec,0xeb,0xf7,0xff,0xeb,0xeb,0xf6,0xff,0x83,0xea,0xea,0xf5,0xff, 0x0f,0xec,0xec,0xf7,0xff,0xee,0xee,0xf9,0xff,0xf1,0xf1,0xfb,0xff,0xf4,0xf3, 0xfe,0xff,0xf6,0xf5,0xff,0xff,0xf8,0xf6,0xff,0xff,0xf6,0xf4,0xfd,0xff,0xf3, 0xf1,0xf6,0xff,0xeb,0xe9,0xf2,0xff,0xde,0xde,0xe7,0xff,0xe6,0xe6,0xf2,0xff, 0xd3,0xd3,0xdd,0xec,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x18,0x00,0x00,0x00, 0x08,0x83,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x88,0x00,0x00,0x00, 0x00,0x10,0xb4,0xb4,0xbb,0x09,0xa2,0xa2,0xab,0x1d,0xab,0xac,0xb2,0x37,0xb7, 0xb7,0xbf,0x50,0xc3,0xc2,0xca,0x68,0xc3,0xc3,0xcb,0x82,0xc4,0xc4,0xcc,0xa2, 0xcd,0xcd,0xd2,0xbd,0xd6,0xd6,0xde,0xd2,0xdf,0xdf,0xe6,0xe6,0xe6,0xe6,0xed, 0xf8,0xeb,0xeb,0xf3,0xff,0xee,0xee,0xf7,0xff,0xef,0xef,0xf9,0xff,0xf1,0xf1, 0xfb,0xff,0xf5,0xf5,0xfe,0xff,0x82,0xf7,0xf7,0xff,0xff,0x0e,0xf9,0xf7,0xfe, 0xff,0xf9,0xf8,0xfd,0xff,0xf8,0xf6,0xf9,0xff,0xf5,0xf2,0xf3,0xff,0xf0,0xec, 0xea,0xff,0xe8,0xe4,0xe2,0xff,0xdd,0xda,0xd9,0xff,0xcf,0xce,0xcf,0xff,0xbf, 0xbd,0xc1,0xff,0xd6,0xd6,0xe1,0xff,0xb5,0xb5,0xbe,0xae,0x00,0x00,0x00,0x1f, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0x00,0x00,0x8c,0xff, 0xff,0xff,0x00,0x85,0x00,0x00,0x00,0x00,0x01,0x40,0x3f,0x49,0x00,0x82,0x40, 0x40,0x4a,0x00,0x12,0x3f,0x3f,0x49,0x00,0x4c,0x4d,0x5b,0x00,0x55,0x55,0x64, 0x00,0x50,0x50,0x5e,0x00,0x4f,0x4f,0x5f,0x00,0x50,0x50,0x5f,0x00,0x49,0x49, 0x57,0x00,0x49,0x48,0x56,0x07,0x46,0x46,0x53,0x17,0x47,0x47,0x53,0x32,0x47, 0x47,0x54,0x4d,0x49,0x49,0x58,0x69,0x4a,0x49,0x57,0x84,0x48,0x48,0x56,0xa4, 0x4a,0x4a,0x58,0xbf,0x4c,0x4c,0x5a,0xd3,0x4c,0x4c,0x5a,0xe7,0x4d,0x4d,0x5b, 0xfb,0x83,0x4d,0x4d,0x5b,0xff,0x13,0x4d,0x4d,0x5d,0xff,0x4f,0x4f,0x5e,0xff, 0x50,0x50,0x5f,0xff,0x51,0x51,0x60,0xff,0x53,0x54,0x63,0xff,0x57,0x56,0x66, 0xff,0x5c,0x5b,0x6b,0xff,0x60,0x60,0x6f,0xff,0x65,0x65,0x75,0xff,0x6a,0x6a, 0x7a,0xff,0x6f,0x6f,0x7f,0xff,0x73,0x73,0x84,0xff,0x78,0x78,0x87,0xff,0x7b, 0x7b,0x8a,0xff,0x7e,0x7e,0x8c,0xff,0x7e,0x7e,0x8d,0xff,0x7f,0x80,0x8d,0xff, 0x80,0x80,0x8e,0xff,0x7f,0x7f,0x8d,0xff,0x82,0x7d,0x7d,0x8b,0xff,0x06,0x7d, 0x7c,0x8a,0xff,0x7a,0x7b,0x87,0xff,0x79,0x79,0x86,0xf3,0x21,0x21,0x25,0x26, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x04,0x83,0xff,0xff,0xff,0x00,0x89,0x00, 0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x01,0xca,0xca,0xd2,0xdd,0xe5,0xe5,0xee, 0xff,0xe9,0xe9,0xf3,0xff,0xf3,0xf3,0xf9,0xff,0xe3,0xe4,0xeb,0xff,0xf2,0xf2, 0xf8,0xff,0xfd,0xfe,0xff,0xff,0xf6,0xf6,0xff,0xff,0xf4,0xf4,0xfe,0xff,0xf2, 0xf2,0xfd,0xff,0xf1,0xf1,0xfc,0xff,0xef,0xf0,0xfb,0xff,0xed,0xee,0xfa,0xff, 0xec,0xec,0xf9,0xff,0xeb,0xeb,0xf8,0xff,0xeb,0xeb,0xf7,0xff,0xea,0xea,0xf7, 0xff,0x82,0xeb,0xeb,0xf6,0xff,0x18,0xed,0xed,0xf8,0xff,0xef,0xee,0xf9,0xff, 0xf1,0xf1,0xfd,0xff,0xf4,0xf4,0xff,0xff,0xf8,0xf7,0xff,0xff,0xf8,0xf8,0xff, 0xff,0xf8,0xf6,0xff,0xff,0xf4,0xf2,0xfa,0xff,0xee,0xec,0xf1,0xff,0xe3,0xe1, 0xe3,0xff,0xd8,0xd5,0xd3,0xff,0xc7,0xc4,0xc1,0xff,0xb5,0xb3,0xaf,0xff,0xa2, 0x9f,0x9b,0xff,0x90,0x8f,0x8e,0xff,0x7d,0x7d,0x82,0xff,0x6b,0x6d,0x7f,0xff, 0x6f,0x70,0x73,0xff,0xc4,0xc2,0xca,0xff,0xe5,0xe5,0xf1,0xff,0xd6,0xd7,0xe1, 0xf5,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x09,0x83,0x00, 0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x28,0x00,0x00,0x00,0x00,0xb3,0xb3, 0xba,0x35,0xd2,0xd2,0xdc,0x67,0xca,0xca,0xd4,0x7d,0xc8,0xc7,0xcf,0x9a,0xd2, 0xd2,0xd7,0xb6,0xd6,0xd7,0xdd,0xcb,0xde,0xde,0xe5,0xdd,0xe3,0xe3,0xeb,0xf2, 0xe9,0xe9,0xf1,0xff,0xeb,0xeb,0xf3,0xff,0xec,0xec,0xf5,0xff,0xec,0xec,0xf6, 0xff,0xed,0xed,0xf8,0xff,0xef,0xee,0xf8,0xff,0xf0,0xef,0xf9,0xff,0xf5,0xf4, 0xfe,0xff,0xf7,0xf6,0xff,0xff,0xf8,0xf5,0xfd,0xff,0xf7,0xf3,0xfa,0xff,0xf2, 0xef,0xf3,0xff,0xed,0xe9,0xec,0xff,0xe8,0xe4,0xe5,0xff,0xde,0xda,0xdc,0xff, 0xd1,0xcd,0xd0,0xff,0xc2,0xbf,0xc4,0xff,0xb1,0xb2,0xbd,0xff,0xa1,0xa3,0xb6, 0xff,0x8f,0x95,0xb1,0xff,0x86,0x8e,0xb3,0xff,0x8f,0x97,0xbe,0xff,0x97,0x9d, 0xbf,0xff,0xad,0xb0,0xc4,0xff,0xcb,0xca,0xcc,0xff,0xab,0xae,0xc1,0xff,0xc2, 0xc0,0xc2,0xff,0xb4,0xb4,0xbb,0xc0,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x15, 0x00,0x00,0x00,0x06,0x82,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x85, 0x00,0x00,0x00,0x00,0x01,0x3f,0x3f,0x49,0x00,0x82,0x40,0x40,0x4a,0x00,0x24, 0x3f,0x3f,0x49,0x00,0x4c,0x4d,0x5a,0x4a,0x54,0x54,0x62,0x78,0x4f,0x4f,0x5d, 0x90,0x4d,0x4d,0x5e,0xaf,0x4f,0x4f,0x5e,0xc7,0x50,0x50,0x5f,0xd9,0x50,0x50, 0x5f,0xee,0x51,0x51,0x60,0xff,0x4f,0x4f,0x5e,0xff,0x4f,0x50,0x5f,0xff,0x50, 0x50,0x5e,0xff,0x50,0x4f,0x5f,0xff,0x51,0x51,0x61,0xff,0x52,0x53,0x62,0xff, 0x54,0x54,0x63,0xff,0x56,0x56,0x65,0xff,0x58,0x58,0x6a,0xff,0x5c,0x5d,0x6d, 0xff,0x60,0x60,0x71,0xff,0x65,0x65,0x75,0xff,0x68,0x68,0x7a,0xff,0x6d,0x6d, 0x7d,0xff,0x70,0x70,0x80,0xff,0x73,0x73,0x84,0xff,0x76,0x76,0x85,0xff,0x78, 0x77,0x87,0xff,0x78,0x79,0x88,0xff,0x7a,0x79,0x88,0xff,0x78,0x78,0x86,0xff, 0x77,0x78,0x86,0xff,0x77,0x77,0x85,0xff,0x77,0x77,0x84,0xff,0x76,0x76,0x84, 0xff,0x76,0x75,0x83,0xff,0x76,0x75,0x82,0xff,0x83,0x76,0x75,0x83,0xff,0x09, 0x76,0x75,0x82,0xff,0x75,0x75,0x81,0xff,0x75,0x75,0x82,0xff,0x71,0x71,0x7d, 0xff,0x74,0x75,0x82,0xff,0x78,0x78,0x84,0xf1,0x13,0x13,0x15,0x37,0x00,0x00, 0x00,0x18,0x00,0x00,0x00,0x08,0x83,0xff,0xff,0xff,0x00,0x89,0x00,0x00,0x00, 0x00,0x2c,0x00,0x00,0x00,0x04,0xb5,0xb5,0xbe,0xda,0xdb,0xdb,0xe6,0xff,0xdf, 0xdf,0xea,0xff,0xea,0xe8,0xf4,0xff,0xd6,0xd6,0xde,0xff,0xe5,0xe5,0xf0,0xff, 0xf7,0xf7,0xff,0xff,0xec,0xec,0xf8,0xff,0xec,0xec,0xf7,0xff,0xeb,0xeb,0xf6, 0xff,0xee,0xee,0xf8,0xff,0xf0,0xef,0xfa,0xff,0xf2,0xf2,0xfd,0xff,0xf5,0xf5, 0xff,0xff,0xf9,0xf8,0xff,0xff,0xfa,0xfa,0xff,0xff,0xfa,0xf8,0xff,0xff,0xf7, 0xf5,0xfe,0xff,0xf1,0xef,0xf7,0xff,0xe6,0xe2,0xe9,0xff,0xd8,0xd5,0xd8,0xff, 0xc6,0xc2,0xc3,0xff,0xb3,0xaf,0xaf,0xff,0x9d,0x9a,0x9a,0xff,0x89,0x86,0x87, 0xff,0x78,0x78,0x7b,0xff,0x67,0x69,0x73,0xff,0x5d,0x62,0x72,0xff,0x5d,0x66, 0x7f,0xff,0x65,0x6f,0x91,0xff,0x71,0x7d,0xa8,0xff,0x82,0x8e,0xbe,0xff,0x91, 0x9d,0xcd,0xff,0x98,0xa2,0xd0,0xff,0xa4,0xae,0xd9,0xff,0xa4,0xae,0xd6,0xff, 0x54,0x5b,0x7a,0xff,0xd0,0xcf,0xcf,0xff,0xe6,0xe6,0xf1,0xff,0xdb,0xdc,0xe5, 0xfb,0x12,0x12,0x13,0x46,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x0a,0x83,0x00, 0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x28,0x00,0x00,0x00,0x01,0xa8,0xa8, 0xb1,0xaf,0xd1,0xd1,0xdc,0xff,0xe4,0xe5,0xee,0xff,0xe6,0xe6,0xec,0xff,0xf6, 0xf7,0xff,0xff,0xed,0xed,0xf8,0xff,0xf1,0xf0,0xfb,0xff,0xf2,0xf1,0xfa,0xff, 0xf2,0xf0,0xf8,0xff,0xf1,0xed,0xf5,0xff,0xee,0xe9,0xef,0xff,0xe8,0xe2,0xe8, 0xff,0xe2,0xdd,0xe1,0xff,0xd9,0xd3,0xd8,0xff,0xcf,0xca,0xd0,0xff,0xc3,0xc0, 0xc6,0xff,0xb5,0xb5,0xbf,0xff,0xa5,0xa9,0xb8,0xff,0x96,0x9e,0xb3,0xff,0x92, 0x9d,0xb7,0xff,0x97,0xa4,0xbf,0xff,0xa3,0xb0,0xcd,0xff,0xb2,0xbf,0xd9,0xff, 0xc4,0xcc,0xe2,0xff,0xc9,0xd0,0xe4,0xff,0xc3,0xc9,0xe5,0xff,0xc0,0xc7,0xe4, 0xff,0xbe,0xc8,0xe4,0xff,0xb9,0xc5,0xe0,0xff,0xab,0xb8,0xd7,0xff,0x96,0xa6, 0xcb,0xff,0x87,0x98,0xc5,0xff,0x77,0x8d,0xc6,0xff,0x61,0x7b,0xc2,0xff,0xc3, 0xc1,0xc0,0xff,0xb6,0xb6,0xbe,0xce,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x19, 0x00,0x00,0x00,0x07,0x82,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x85, 0x00,0x00,0x00,0x00,0x01,0x4c,0x4c,0x59,0x00,0x82,0x3c,0x3c,0x46,0x00,0x11, 0x00,0x00,0x00,0x02,0x49,0x49,0x56,0xe7,0x55,0x55,0x64,0xff,0x56,0x57,0x67, 0xff,0x5a,0x59,0x69,0xff,0x5b,0x5a,0x6c,0xff,0x5d,0x5d,0x6f,0xff,0x60,0x60, 0x71,0xff,0x5a,0x59,0x6b,0xff,0x60,0x60,0x70,0xff,0x63,0x63,0x73,0xff,0x65, 0x65,0x76,0xff,0x68,0x67,0x7a,0xff,0x6c,0x6a,0x7c,0xff,0x6e,0x6e,0x7e,0xff, 0x70,0x70,0x80,0xff,0x71,0x71,0x81,0xff,0x83,0x72,0x72,0x81,0xff,0x05,0x72, 0x72,0x80,0xff,0x71,0x71,0x7e,0xff,0x6f,0x6f,0x7d,0xff,0x6f,0x6f,0x7c,0xff, 0x6e,0x6e,0x7c,0xff,0x82,0x6f,0x6f,0x7c,0xff,0x15,0x6f,0x6f,0x7d,0xff,0x70, 0x70,0x7e,0xff,0x72,0x72,0x7f,0xff,0x73,0x71,0x7f,0xff,0x72,0x72,0x7e,0xff, 0x71,0x6f,0x7a,0xff,0x6f,0x6d,0x76,0xff,0x6b,0x68,0x6f,0xff,0x68,0x65,0x66, 0xff,0x62,0x5d,0x5d,0xff,0x5d,0x5a,0x55,0xff,0x58,0x55,0x4f,0xff,0x54,0x53, 0x50,0xff,0x5c,0x5a,0x5a,0xff,0x4b,0x4b,0x51,0xff,0x50,0x50,0x5e,0xff,0x75, 0x75,0x84,0xff,0x77,0x77,0x83,0xf2,0x0e,0x0e,0x0f,0x43,0x00,0x00,0x00,0x1f, 0x00,0x00,0x00,0x0a,0x83,0xff,0xff,0xff,0x00,0x89,0x00,0x00,0x00,0x00,0x2c, 0x00,0x00,0x00,0x06,0xa7,0xa5,0xad,0xc0,0xda,0xda,0xe5,0xff,0xdc,0xdc,0xe8, 0xff,0xe7,0xe7,0xf1,0xff,0xd7,0xd8,0xdf,0xff,0xe2,0xe1,0xed,0xff,0xf8,0xf7, 0xff,0xff,0xec,0xec,0xf9,0xff,0xec,0xec,0xf8,0xff,0xf4,0xf2,0xfb,0xff,0xeb, 0xe8,0xef,0xff,0xdd,0xda,0xde,0xff,0xcb,0xc6,0xca,0xff,0xb5,0xb0,0xb2,0xff, 0x9f,0x9b,0x9c,0xff,0x88,0x85,0x87,0xff,0x76,0x74,0x77,0xff,0x66,0x66,0x6c, 0xff,0x59,0x5d,0x67,0xff,0x58,0x61,0x70,0xff,0x63,0x6e,0x83,0xff,0x74,0x83, 0x9c,0xff,0x87,0x97,0xb4,0xff,0x9c,0xac,0xca,0xff,0xad,0xbc,0xd9,0xff,0xb9, 0xc6,0xe1,0xff,0xbd,0xc9,0xe4,0xff,0xbb,0xc6,0xe0,0xff,0xb3,0xbe,0xd9,0xff, 0xa5,0xb3,0xd2,0xff,0x93,0xa4,0xcc,0xff,0x82,0x97,0xc7,0xff,0x70,0x89,0xc2, 0xff,0x5d,0x79,0xba,0xff,0x55,0x74,0xba,0xff,0x4e,0x6e,0xb9,0xff,0x44,0x51, 0x86,0xff,0xcb,0xc8,0xc6,0xff,0xe7,0xe7,0xf1,0xff,0xdf,0xdf,0xe9,0xff,0x23, 0x23,0x24,0x4e,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x0b,0x83,0x00,0x00,0x00, 0x00,0x8b,0xff,0xff,0xff,0x00,0x28,0x00,0x00,0x00,0x03,0x8f,0x90,0x98,0x90, 0xc9,0xc9,0xd5,0xff,0xde,0xde,0xe8,0xff,0xdc,0xdc,0xe3,0xff,0xf1,0xf1,0xfa, 0xff,0xde,0xdd,0xe7,0xff,0xc4,0xc2,0xc8,0xff,0xb6,0xb7,0xbf,0xff,0xa5,0xa9, 0xb7,0xff,0x96,0x9d,0xb1,0xff,0x8a,0x96,0xb0,0xff,0x85,0x95,0xb3,0xff,0x85, 0x97,0xb8,0xff,0x87,0x9e,0xc4,0xff,0x9a,0xb0,0xd3,0xff,0x98,0xb0,0xd9,0xff, 0x99,0xb2,0xde,0xff,0xa4,0xbc,0xe8,0xff,0xb4,0xc7,0xea,0xff,0xbe,0xcd,0xe8, 0xff,0xc0,0xcb,0xe2,0xff,0xba,0xc5,0xda,0xff,0xb2,0xbd,0xd2,0xff,0xa0,0xb0, 0xd0,0xff,0x91,0xa3,0xc9,0xff,0x83,0x96,0xc5,0xff,0x75,0x8b,0xc3,0xff,0x65, 0x7e,0xbe,0xff,0x5c,0x7a,0xc0,0xff,0x55,0x73,0xba,0xff,0x4f,0x70,0xba,0xff, 0x4d,0x6e,0xb8,0xff,0x4c,0x6c,0xb9,0xff,0x48,0x68,0xbb,0xff,0xb7,0xb6,0xb8, 0xff,0xc7,0xc7,0xce,0xdb,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x1a,0x00,0x00, 0x00,0x08,0x82,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x85,0x00,0x00, 0x00,0x00,0x05,0x4c,0x4c,0x59,0x00,0x48,0x46,0x54,0x00,0x3b,0x3b,0x46,0x00, 0x00,0x00,0x00,0x04,0x44,0x44,0x51,0xd9,0x82,0x4e,0x4e,0x5d,0xff,0x0a,0x50, 0x50,0x5f,0xff,0x52,0x52,0x61,0xff,0x55,0x55,0x65,0xff,0x56,0x56,0x65,0xff, 0x50,0x50,0x5f,0xff,0x73,0x73,0x86,0xff,0x6f,0x70,0x7f,0xff,0x6c,0x6c,0x7c, 0xff,0x6d,0x6d,0x7b,0xff,0x6c,0x6c,0x7a,0xff,0x84,0x6b,0x6b,0x78,0xff,0x03, 0x6b,0x6b,0x79,0xff,0x6c,0x6c,0x7a,0xff,0x6e,0x6d,0x7c,0xff,0x82,0x6f,0x6f, 0x7d,0xff,0x19,0x6f,0x6f,0x7c,0xff,0x6d,0x6b,0x79,0xff,0x69,0x67,0x72,0xff, 0x65,0x61,0x6a,0xff,0x5e,0x59,0x60,0xff,0x56,0x50,0x53,0xff,0x4f,0x4a,0x4a, 0xff,0x49,0x44,0x43,0xff,0x46,0x42,0x40,0xff,0x41,0x40,0x41,0xff,0x40,0x43, 0x49,0xff,0x55,0x59,0x67,0xff,0x70,0x75,0x89,0xff,0x8b,0x8f,0xa6,0xff,0x97, 0x9b,0xb3,0xff,0xa2,0xa6,0xba,0xff,0xc7,0xc7,0xd1,0xff,0xc2,0xc1,0xc1,0xff, 0x32,0x30,0x2c,0xff,0x52,0x51,0x5f,0xff,0x76,0x76,0x83,0xff,0x75,0x75,0x81, 0xf1,0x0b,0x0b,0x0c,0x47,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x0c,0x83,0xff, 0xff,0xff,0x00,0x89,0x00,0x00,0x00,0x00,0x22,0x27,0x27,0x28,0x0a,0xaa,0xa9, 0xb1,0xc1,0xd6,0xd6,0xe0,0xff,0xda,0xda,0xe6,0xff,0xe3,0xe3,0xee,0xff,0xd7, 0xd7,0xe0,0xff,0xdf,0xdf,0xe8,0xff,0xf7,0xf7,0xff,0xff,0xf0,0xf0,0xfc,0xff, 0xe6,0xe6,0xee,0xff,0x5b,0x5d,0x65,0xff,0x46,0x4d,0x5d,0xff,0x51,0x5a,0x6f, 0xff,0x64,0x70,0x88,0xff,0x7a,0x89,0xa3,0xff,0x8d,0x9e,0xb7,0xff,0xa8,0xb6, 0xcb,0xff,0xae,0xc1,0xd6,0xff,0xbd,0xcb,0xdf,0xff,0xca,0xd4,0xe5,0xff,0xc4, 0xcd,0xdf,0xff,0xb8,0xc1,0xd5,0xff,0xa8,0xb4,0xcd,0xff,0x95,0xa5,0xc6,0xff, 0x84,0x96,0xbf,0xff,0x72,0x88,0xba,0xff,0x65,0x7e,0xb7,0xff,0x59,0x74,0xb4, 0xff,0x50,0x6e,0xb3,0xff,0x4b,0x6b,0xb3,0xff,0x4a,0x6b,0xb5,0xff,0x4a,0x6b, 0xb7,0xff,0x49,0x6b,0xb9,0xff,0x4b,0x6c,0xba,0xff,0x82,0x4c,0x6d,0xba,0xff, 0x08,0x4c,0x6c,0xb9,0xff,0x43,0x54,0x93,0xff,0xbf,0xbd,0xb9,0xff,0xea,0xe9, 0xf3,0xff,0xe0,0xe0,0xea,0xff,0x36,0x36,0x38,0x58,0x00,0x00,0x00,0x22,0x00, 0x00,0x00,0x0c,0x83,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x28,0x00, 0x00,0x00,0x05,0x85,0x84,0x8c,0x7e,0xc7,0xc7,0xd2,0xff,0xdc,0xdc,0xe6,0xff, 0xd9,0xda,0xe0,0xff,0xfa,0xf8,0xfc,0xff,0xb8,0xbe,0xd9,0xff,0x5d,0x7d,0xc5, 0xff,0x69,0x91,0xd5,0xff,0x7d,0xa0,0xe1,0xff,0x9d,0xb7,0xe6,0xff,0xad,0xbf, 0xdf,0xff,0xb6,0xc5,0xdb,0xff,0xbf,0xc4,0xcc,0xff,0xba,0xc4,0xd6,0xff,0xd5, 0xd7,0xe0,0xff,0xbc,0xc2,0xd3,0xff,0xaa,0xb6,0xcc,0xff,0x98,0xa7,0xc5,0xff, 0x88,0x98,0xbe,0xff,0x7a,0x8d,0xb8,0xff,0x6a,0x80,0xb5,0xff,0x5f,0x77,0xb0, 0xff,0x59,0x72,0xae,0xff,0x53,0x6e,0xb1,0xff,0x52,0x6d,0xb2,0xff,0x4d,0x6b, 0xb2,0xff,0x4c,0x6b,0xb2,0xff,0x4a,0x6c,0xb5,0xff,0x4b,0x6d,0xb7,0xff,0x4c, 0x6c,0xb7,0xff,0x4d,0x6d,0xb9,0xff,0x4d,0x6e,0xb9,0xff,0x4c,0x6d,0xb7,0xff, 0x4c,0x6c,0xbd,0xff,0xb1,0xaf,0xb4,0xff,0xcd,0xcc,0xd3,0xe5,0x00,0x00,0x00, 0x3b,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x08,0x82,0x00,0x00,0x00,0x00,0x8c, 0xff,0xff,0xff,0x00,0x85,0x00,0x00,0x00,0x00,0x33,0x4c,0x4c,0x59,0x00,0x48, 0x46,0x54,0x00,0x40,0x40,0x4c,0x00,0x00,0x00,0x00,0x07,0x41,0x41,0x4c,0xd5, 0x4f,0x4f,0x5e,0xff,0x4e,0x4f,0x5d,0xff,0x50,0x50,0x5f,0xff,0x51,0x51,0x60, 0xff,0x54,0x54,0x63,0xff,0x52,0x52,0x5f,0xff,0x4d,0x4d,0x5b,0xff,0x6b,0x6b, 0x7b,0xff,0x66,0x66,0x75,0xff,0x65,0x65,0x73,0xff,0x6b,0x6b,0x79,0xff,0x6e, 0x6e,0x7c,0xff,0x6d,0x6d,0x79,0xff,0x6c,0x6c,0x77,0xff,0x6a,0x68,0x73,0xff, 0x66,0x63,0x6d,0xff,0x61,0x5d,0x63,0xff,0x56,0x52,0x57,0xff,0x4e,0x4a,0x4e, 0xff,0x4d,0x48,0x49,0xff,0x53,0x4d,0x4d,0xff,0x5b,0x57,0x56,0xff,0x66,0x64, 0x66,0xff,0x79,0x79,0x7b,0xff,0x8a,0x8c,0x92,0xff,0x94,0x98,0xa4,0xff,0x96, 0xa0,0xb2,0xff,0x95,0xa2,0xbc,0xff,0x92,0xa1,0xc5,0xff,0x90,0xa1,0xcc,0xff, 0x96,0xa7,0xd0,0xff,0x88,0x9e,0xce,0xff,0x7a,0x91,0xca,0xff,0x6b,0x85,0xc3, 0xff,0x5c,0x78,0xbf,0xff,0x4e,0x6d,0xb9,0xff,0x48,0x6b,0xb8,0xff,0x40,0x64, 0xb5,0xff,0x3e,0x63,0xb6,0xff,0x31,0x2e,0x26,0xff,0x55,0x54,0x61,0xff,0x76, 0x76,0x84,0xff,0x73,0x73,0x7f,0xf1,0x0b,0x0b,0x0c,0x47,0x00,0x00,0x00,0x21, 0x00,0x00,0x00,0x0b,0x83,0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x2f, 0xde,0xe0,0xe9,0x43,0xc8,0xc8,0xd1,0xab,0xcf,0xce,0xd5,0xf6,0xc5,0xc5,0xce, 0xff,0xd0,0xd2,0xdc,0xff,0xd7,0xd7,0xe1,0xff,0xe0,0xe0,0xea,0xff,0xd7,0xd7, 0xe0,0xff,0xdb,0xdb,0xe5,0xff,0xf7,0xf6,0xfe,0xff,0xf2,0xf1,0xfc,0xff,0xe2, 0xde,0xe2,0xff,0xa8,0xae,0xc8,0xff,0xb9,0xbb,0xcc,0xff,0xaf,0xb8,0xc9,0xff, 0xac,0xb5,0xc8,0xff,0x9a,0xa5,0xbc,0xff,0x88,0x97,0xb4,0xff,0x81,0x90,0xb0, 0xff,0x75,0x87,0xb0,0xff,0x6a,0x7f,0xac,0xff,0x65,0x7a,0xab,0xff,0x5c,0x72, 0xa8,0xff,0x57,0x6f,0xa7,0xff,0x52,0x6c,0xa7,0xff,0x51,0x6a,0xa7,0xff,0x50, 0x69,0xa9,0xff,0x4e,0x69,0xa9,0xff,0x4f,0x6b,0xab,0xff,0x4f,0x6b,0xad,0xff, 0x50,0x6c,0xb0,0xff,0x4f,0x6c,0xb1,0xff,0x4e,0x6c,0xb3,0xff,0x4e,0x6d,0xb5, 0xff,0x4f,0x6f,0xb8,0xff,0x4f,0x70,0xb9,0xff,0x4e,0x6f,0xb8,0xff,0x4c,0x6e, 0xb8,0xff,0x4c,0x6d,0xb7,0xff,0x42,0x56,0x9d,0xff,0xb4,0xb1,0xab,0xff,0xea, 0xea,0xf4,0xff,0xe3,0xe3,0xed,0xff,0x3e,0x3e,0x41,0x5f,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x8b,0xff, 0xff,0xff,0x00,0x1e,0x00,0x00,0x00,0x06,0x71,0x6f,0x76,0x6f,0xc3,0xc3,0xcd, 0xff,0xda,0xda,0xe4,0xff,0xd7,0xd6,0xde,0xff,0xf9,0xf6,0xf9,0xff,0xc1,0xc3, 0xdc,0xff,0xc7,0x9d,0xa0,0xff,0xad,0xb9,0xc3,0xff,0xa8,0xb1,0xc2,0xff,0x9e, 0xa7,0xc0,0xff,0x8b,0x98,0xb6,0xff,0x7a,0x8a,0xaf,0xff,0x71,0x82,0xab,0xff, 0x68,0x79,0xa7,0xff,0x5b,0x72,0xa4,0xff,0x54,0x6b,0xa2,0xff,0x4f,0x68,0xa1, 0xff,0x49,0x65,0xa1,0xff,0x48,0x64,0xa2,0xff,0x48,0x65,0xa3,0xff,0x48,0x63, 0xa5,0xff,0x4b,0x67,0xa7,0xff,0x4c,0x68,0xa7,0xff,0x4e,0x68,0xab,0xff,0x4e, 0x69,0xac,0xff,0x4f,0x6c,0xaf,0xff,0x4e,0x6c,0xb0,0xff,0x4c,0x6b,0xb2,0xff, 0x4c,0x6b,0xb4,0xff,0x82,0x4d,0x6d,0xb5,0xff,0x08,0x4b,0x6c,0xb5,0xff,0x4b, 0x6b,0xb4,0xff,0x49,0x68,0xb7,0xff,0xa6,0xa6,0xae,0xff,0xd6,0xd5,0xdc,0xec, 0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x09,0x82,0x00,0x00, 0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x83,0x00,0x00,0x00,0x00,0x07,0x39,0x39, 0x44,0x02,0x4d,0x4f,0x5b,0x13,0x4b,0x4b,0x57,0x3d,0x47,0x46,0x53,0x73,0x3f, 0x3f,0x4c,0xab,0x37,0x37,0x41,0xd7,0x45,0x45,0x51,0xff,0x82,0x4e,0x4e,0x5d, 0xff,0x2c,0x50,0x50,0x5e,0xff,0x51,0x51,0x5f,0xff,0x53,0x53,0x63,0xff,0x4f, 0x51,0x60,0xff,0x4c,0x4c,0x5b,0xff,0x6a,0x6a,0x7b,0xff,0x68,0x68,0x75,0xff, 0x68,0x68,0x77,0xff,0x51,0x4f,0x57,0xff,0x3d,0x3a,0x3b,0xff,0x39,0x36,0x39, 0xff,0x34,0x34,0x39,0xff,0x34,0x36,0x3e,0xff,0x3c,0x41,0x4b,0xff,0x4d,0x54, 0x5f,0xff,0x65,0x6f,0x81,0xff,0x6d,0x7e,0x99,0xff,0x8e,0x9d,0xb5,0xff,0xa0, 0xac,0xc5,0xff,0x9c,0xaa,0xc6,0xff,0x96,0xa5,0xc2,0xff,0x8c,0x9c,0xbe,0xff, 0x81,0x92,0xba,0xff,0x75,0x88,0xb7,0xff,0x6b,0x82,0xb3,0xff,0x63,0x7d,0xb2, 0xff,0x5d,0x77,0xb2,0xff,0x56,0x72,0xb1,0xff,0x4c,0x69,0xaf,0xff,0x46,0x66, 0xb1,0xff,0x46,0x65,0xb3,0xff,0x44,0x67,0xb4,0xff,0x44,0x69,0xb6,0xff,0x46, 0x69,0xb7,0xff,0x47,0x69,0xb7,0xff,0x48,0x6b,0xb7,0xff,0x49,0x6b,0xb7,0xff, 0x2f,0x2d,0x26,0xff,0x54,0x53,0x62,0xff,0x77,0x77,0x84,0xff,0x6f,0x6f,0x7c, 0xf0,0x07,0x07,0x07,0x46,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x0b,0x83,0xff, 0xff,0xff,0x00,0x84,0x00,0x00,0x00,0x00,0x32,0xe6,0xe6,0xee,0x1b,0xdb,0xd9, 0xe2,0x7e,0xc3,0xc2,0xca,0xe0,0xb5,0xb5,0xbc,0xff,0xb2,0xb2,0xb9,0xff,0xbd, 0xbb,0xc2,0xff,0xbe,0xbe,0xc6,0xff,0xce,0xd0,0xda,0xff,0xd4,0xd4,0xde,0xff, 0xdd,0xdd,0xe8,0xff,0xd6,0xd6,0xdf,0xff,0xd6,0xd6,0xe0,0xff,0xf6,0xf5,0xfd, 0xff,0xf0,0xf0,0xfb,0xff,0xe9,0xe4,0xe6,0xff,0x62,0x77,0xa8,0xff,0x5d,0x72, 0x9f,0xff,0x5b,0x70,0xa0,0xff,0x57,0x6d,0x9f,0xff,0x5f,0x75,0xa5,0xff,0x62, 0x77,0xa8,0xff,0x63,0x78,0xa9,0xff,0x64,0x79,0xaa,0xff,0x65,0x7c,0xab,0xff, 0x66,0x7c,0xad,0xff,0x64,0x7b,0xad,0xff,0x63,0x79,0xad,0xff,0x60,0x77,0xac, 0xff,0x5c,0x73,0xac,0xff,0x59,0x72,0xad,0xff,0x56,0x70,0xad,0xff,0x54,0x6e, 0xac,0xff,0x53,0x6e,0xad,0xff,0x51,0x6d,0xae,0xff,0x4e,0x6c,0xaf,0xff,0x4c, 0x6a,0xb0,0xff,0x4c,0x6b,0xb2,0xff,0x4d,0x6b,0xb4,0xff,0x4c,0x6d,0xb6,0xff, 0x4c,0x6c,0xb6,0xff,0x49,0x6b,0xb5,0xff,0x49,0x6a,0xb4,0xff,0x41,0x59,0xa7, 0xff,0xa7,0xa4,0x9e,0xff,0xea,0xea,0xf5,0xff,0xe4,0xe4,0xee,0xff,0x52,0x51, 0x55,0x6c,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x01,0x82, 0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x0e,0x00,0x00,0x00,0x05,0x66, 0x66,0x6c,0x5c,0xc0,0xc0,0xca,0xff,0xd8,0xd8,0xe1,0xff,0xd4,0xd4,0xdc,0xff, 0xf5,0xf2,0xf7,0xff,0xbe,0xc2,0xd7,0xff,0x50,0x63,0x93,0xff,0x42,0x5b,0x90, 0xff,0x3d,0x55,0x8f,0xff,0x40,0x59,0x92,0xff,0x42,0x5b,0x94,0xff,0x48,0x61, 0x99,0xff,0x4c,0x64,0x9d,0xff,0x82,0x51,0x6b,0xa0,0xff,0x18,0x54,0x6d,0xa2, 0xff,0x54,0x6d,0xa5,0xff,0x56,0x6f,0xa6,0xff,0x58,0x70,0xa9,0xff,0x56,0x70, 0xaa,0xff,0x56,0x71,0xa9,0xff,0x56,0x70,0xad,0xff,0x55,0x70,0xae,0xff,0x54, 0x70,0xaf,0xff,0x53,0x6f,0xaf,0xff,0x53,0x6e,0xb1,0xff,0x52,0x70,0xb2,0xff, 0x50,0x6f,0xb3,0xff,0x51,0x70,0xb4,0xff,0x4f,0x6f,0xb6,0xff,0x4f,0x6f,0xb8, 0xff,0x4c,0x6c,0xb5,0xff,0x4b,0x6b,0xb4,0xff,0x49,0x69,0xb6,0xff,0x9d,0x9f, 0xac,0xff,0xd7,0xd5,0xdb,0xf2,0x10,0x10,0x11,0x43,0x00,0x00,0x00,0x1e,0x00, 0x00,0x00,0x0a,0x82,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x2e,0x00, 0x00,0x00,0x00,0x3d,0x3d,0x46,0x7a,0x45,0x43,0x51,0xc1,0x32,0x32,0x3a,0xe4, 0x36,0x36,0x3f,0xfe,0x37,0x38,0x42,0xff,0x36,0x36,0x3f,0xff,0x33,0x33,0x3c, 0xff,0x31,0x31,0x3a,0xff,0x44,0x44,0x50,0xff,0x4e,0x4e,0x5c,0xff,0x4e,0x4d, 0x5b,0xff,0x4f,0x4f,0x5d,0xff,0x50,0x50,0x5e,0xff,0x53,0x53,0x62,0xff,0x51, 0x51,0x5f,0xff,0x4c,0x4c,0x5b,0xff,0x69,0x69,0x79,0xff,0x68,0x68,0x78,0xff, 0x66,0x63,0x6d,0xff,0x36,0x3e,0x57,0xff,0xbd,0xa1,0xa4,0xff,0x96,0x9d,0xaa, 0xff,0x8d,0x96,0xab,0xff,0x7f,0x8d,0xa7,0xff,0x67,0x7a,0xa0,0xff,0x50,0x64, 0x90,0xff,0x40,0x59,0x8d,0xff,0x30,0x4d,0x89,0xff,0x20,0x3d,0x83,0xff,0x15, 0x32,0x7f,0xff,0x0a,0x2d,0x7d,0xff,0x06,0x2b,0x7e,0xff,0x09,0x2e,0x81,0xff, 0x0f,0x33,0x87,0xff,0x17,0x3a,0x8c,0xff,0x1f,0x41,0x91,0xff,0x26,0x48,0x97, 0xff,0x2d,0x4e,0x9c,0xff,0x35,0x54,0xa0,0xff,0x3a,0x5b,0xa5,0xff,0x3e,0x5d, 0xa9,0xff,0x41,0x62,0xae,0xff,0x44,0x66,0xb1,0xff,0x46,0x67,0xb4,0xff,0x48, 0x6a,0xb5,0xff,0x82,0x49,0x6a,0xb5,0xff,0x08,0x4a,0x6b,0xb6,0xff,0x2c,0x2b, 0x22,0xff,0x55,0x55,0x62,0xff,0x74,0x74,0x82,0xff,0x70,0x6f,0x7b,0xef,0x06, 0x06,0x07,0x45,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x0b,0x83,0xff,0xff,0xff, 0x00,0x82,0x00,0x00,0x00,0x00,0x04,0xd8,0xd9,0xe2,0x41,0xac,0xac,0xb2,0xb1, 0xb7,0xb7,0xbe,0xff,0xb4,0xb5,0xbc,0xff,0x82,0xb7,0xb7,0xbe,0xff,0x2e,0xb4, 0xb4,0xbb,0xff,0xb6,0xb6,0xbd,0xff,0xb9,0xb9,0xc2,0xff,0xcd,0xcd,0xd8,0xff, 0xd2,0xd2,0xdc,0xff,0xdb,0xdb,0xe6,0xff,0xd5,0xd5,0xdf,0xff,0xd3,0xd3,0xdd, 0xff,0xf4,0xf5,0xfb,0xff,0xf0,0xef,0xfb,0xff,0xed,0xe9,0xec,0xff,0x5e,0x74, 0xa3,0xff,0x5c,0x71,0x9f,0xff,0x6e,0x81,0xab,0xff,0x84,0x96,0xb8,0xff,0x68, 0x7b,0xa8,0xff,0x6c,0x80,0xac,0xff,0x6d,0x80,0xad,0xff,0x6d,0x82,0xae,0xff, 0x6c,0x81,0xaf,0xff,0x6b,0x81,0xb0,0xff,0x69,0x7f,0xb0,0xff,0x66,0x7d,0xb0, 0xff,0x62,0x7b,0xb0,0xff,0x60,0x79,0xaf,0xff,0x5d,0x77,0xaf,0xff,0x59,0x75, 0xaf,0xff,0x58,0x73,0xb0,0xff,0x55,0x72,0xb0,0xff,0x53,0x70,0xb1,0xff,0x52, 0x6f,0xb3,0xff,0x51,0x6e,0xb4,0xff,0x50,0x6e,0xb5,0xff,0x50,0x6e,0xb6,0xff, 0x50,0x6f,0xb8,0xff,0x4f,0x70,0xba,0xff,0x4d,0x6e,0xb8,0xff,0x4c,0x6e,0xb8, 0xff,0x46,0x63,0xb4,0xff,0x99,0x96,0x90,0xff,0xec,0xec,0xf5,0xff,0xe4,0xe4, 0xef,0xff,0x67,0x68,0x6c,0x77,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x28,0x00, 0x00,0x00,0x04,0x54,0x54,0x59,0x49,0xb9,0xb7,0xc2,0xf8,0xd7,0xd7,0xe1,0xff, 0xd2,0xd2,0xda,0xff,0xf3,0xf0,0xf5,0xff,0xbf,0xc3,0xd7,0xff,0x31,0x4d,0x88, 0xff,0x3d,0x56,0x8d,0xff,0x60,0x7b,0xac,0xff,0x41,0x5b,0x92,0xff,0x49,0x61, 0x98,0xff,0x53,0x6b,0x9f,0xff,0x58,0x6d,0xa1,0xff,0x5b,0x72,0xa5,0xff,0x5f, 0x76,0xa7,0xff,0x60,0x77,0xa9,0xff,0x61,0x79,0xac,0xff,0x61,0x78,0xaf,0xff, 0x60,0x77,0xae,0xff,0x5e,0x78,0xae,0xff,0x5f,0x76,0xaf,0xff,0x5b,0x76,0xb0, 0xff,0x5a,0x74,0xb0,0xff,0x58,0x73,0xb1,0xff,0x55,0x73,0xb1,0xff,0x53,0x72, 0xb3,0xff,0x54,0x70,0xb3,0xff,0x52,0x71,0xb5,0xff,0x53,0x72,0xb7,0xff,0x52, 0x71,0xb8,0xff,0x52,0x72,0xba,0xff,0x50,0x70,0xb8,0xff,0x4e,0x6e,0xb8,0xff, 0x4c,0x6d,0xb8,0xff,0x90,0x92,0xa6,0xff,0xde,0xdd,0xe2,0xf7,0x27,0x27,0x29, 0x4c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x0a,0x82,0x00,0x00,0x00,0x00,0x8c, 0xff,0xff,0xff,0x00,0x11,0x00,0x00,0x00,0x02,0x37,0x36,0x40,0xf7,0x3d,0x3d, 0x48,0xff,0x2b,0x2b,0x33,0xff,0x34,0x34,0x3d,0xff,0x37,0x37,0x41,0xff,0x37, 0x38,0x40,0xff,0x36,0x36,0x40,0xff,0x32,0x33,0x3a,0xff,0x43,0x43,0x4e,0xff, 0x4e,0x4e,0x5c,0xff,0x4c,0x4c,0x5b,0xff,0x4e,0x4e,0x5c,0xff,0x4f,0x4f,0x5d, 0xff,0x52,0x52,0x61,0xff,0x51,0x50,0x5f,0xff,0x4b,0x4b,0x5a,0xff,0x82,0x68, 0x68,0x78,0xff,0x1b,0x61,0x5d,0x63,0xff,0x52,0x62,0x8c,0xff,0x00,0x29,0x72, 0xff,0x05,0x25,0x70,0xff,0x00,0x1d,0x6d,0xff,0x08,0x29,0x74,0xff,0x10,0x31, 0x77,0xff,0x15,0x32,0x7e,0xff,0x17,0x37,0x80,0xff,0x1d,0x3c,0x81,0xff,0x1f, 0x40,0x86,0xff,0x24,0x43,0x88,0xff,0x29,0x48,0x8c,0xff,0x2d,0x4d,0x91,0xff, 0x31,0x4d,0x92,0xff,0x33,0x52,0x96,0xff,0x35,0x52,0x99,0xff,0x37,0x54,0x9b, 0xff,0x38,0x57,0x9e,0xff,0x3a,0x59,0xa0,0xff,0x3c,0x5b,0xa3,0xff,0x3e,0x5b, 0xa6,0xff,0x40,0x60,0xa8,0xff,0x41,0x63,0xa9,0xff,0x43,0x64,0xac,0xff,0x43, 0x63,0xb0,0xff,0x45,0x66,0xb1,0xff,0x82,0x46,0x67,0xb2,0xff,0x08,0x45,0x66, 0xb2,0xff,0x2b,0x2a,0x22,0xff,0x55,0x55,0x62,0xff,0x73,0x73,0x80,0xff,0x6e, 0x6e,0x7c,0xee,0x04,0x04,0x05,0x44,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x0b, 0x83,0xff,0xff,0xff,0x00,0x08,0x00,0x00,0x00,0x01,0xab,0xac,0xb3,0xba,0xcf, 0xcf,0xd7,0xff,0x99,0x98,0x9e,0xff,0xb0,0xaf,0xb6,0xff,0xb9,0xb9,0xc2,0xff, 0xb8,0xb8,0xbf,0xff,0xb6,0xb6,0xbd,0xff,0x82,0xb3,0xb3,0xba,0xff,0x2c,0xb5, 0xb5,0xbd,0xff,0xcb,0xcb,0xd5,0xff,0xd0,0xd0,0xdb,0xff,0xd9,0xd9,0xe4,0xff, 0xd6,0xd6,0xe1,0xff,0xd1,0xd1,0xdb,0xff,0xf3,0xf3,0xfa,0xff,0xf0,0xf0,0xfb, 0xff,0xf0,0xec,0xf1,0xff,0x65,0x77,0xa2,0xff,0x5e,0x72,0x9f,0xff,0x81,0x91, 0xb3,0xff,0xa4,0xb1,0xc3,0xff,0x6b,0x7d,0xa9,0xff,0x70,0x82,0xad,0xff,0x70, 0x84,0xaf,0xff,0x71,0x84,0xaf,0xff,0x6f,0x83,0xaf,0xff,0x6d,0x83,0xb0,0xff, 0x6b,0x81,0xb0,0xff,0x69,0x7f,0xb0,0xff,0x65,0x7c,0xb0,0xff,0x62,0x7b,0xb0, 0xff,0x5e,0x78,0xaf,0xff,0x5b,0x75,0xaf,0xff,0x57,0x74,0xaf,0xff,0x56,0x71, 0xb0,0xff,0x54,0x70,0xb1,0xff,0x51,0x6e,0xb1,0xff,0x50,0x6e,0xb3,0xff,0x50, 0x6e,0xb5,0xff,0x50,0x6e,0xb6,0xff,0x51,0x70,0xb8,0xff,0x51,0x72,0xbb,0xff, 0x50,0x71,0xbb,0xff,0x4f,0x70,0xbb,0xff,0x4b,0x69,0xb9,0xff,0x8c,0x89,0x84, 0xff,0xec,0xec,0xf6,0xff,0xe5,0xe5,0xf0,0xff,0x69,0x69,0x6e,0x81,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x00, 0x8b,0xff,0xff,0xff,0x00,0x28,0x00,0x00,0x00,0x04,0x42,0x42,0x46,0x35,0xad, 0xad,0xb7,0xe9,0xd5,0xd5,0xdf,0xff,0xd3,0xd3,0xda,0xff,0xed,0xec,0xf2,0xff, 0xc2,0xc6,0xd7,0xff,0x38,0x51,0x89,0xff,0x56,0x6c,0x99,0xff,0xb5,0xc4,0xd1, 0xff,0x4f,0x66,0x98,0xff,0x4e,0x67,0x9b,0xff,0x5c,0x71,0xa3,0xff,0x5d,0x71, 0xa3,0xff,0x5f,0x77,0xa8,0xff,0x61,0x77,0xa9,0xff,0x63,0x79,0xaa,0xff,0x63, 0x7a,0xac,0xff,0x63,0x7a,0xad,0xff,0x62,0x78,0xae,0xff,0x61,0x79,0xad,0xff, 0x5f,0x78,0xae,0xff,0x5d,0x76,0xb0,0xff,0x5b,0x75,0xb0,0xff,0x58,0x75,0xb2, 0xff,0x55,0x73,0xb2,0xff,0x54,0x71,0xb2,0xff,0x55,0x72,0xb3,0xff,0x55,0x72, 0xb4,0xff,0x52,0x70,0xb8,0xff,0x53,0x73,0xb8,0xff,0x54,0x73,0xbb,0xff,0x51, 0x71,0xb9,0xff,0x4d,0x6e,0xb7,0xff,0x4f,0x6d,0xb6,0xff,0x86,0x8a,0xa6,0xff, 0xe0,0xdf,0xe3,0xfc,0x34,0x34,0x36,0x55,0x00,0x00,0x00,0x21,0x00,0x00,0x00, 0x0b,0x82,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x2d,0x00,0x00,0x00, 0x05,0x34,0x34,0x3e,0xde,0x3b,0x3b,0x46,0xff,0x2b,0x2b,0x32,0xff,0x33,0x33, 0x3c,0xff,0x37,0x37,0x42,0xff,0x36,0x36,0x3f,0xff,0x35,0x35,0x3e,0xff,0x32, 0x32,0x3b,0xff,0x42,0x42,0x4d,0xff,0x4d,0x4d,0x5b,0xff,0x4c,0x4c,0x5a,0xff, 0x4d,0x4c,0x5b,0xff,0x4e,0x4e,0x5c,0xff,0x51,0x51,0x60,0xff,0x50,0x50,0x5e, 0xff,0x4b,0x4b,0x59,0xff,0x65,0x65,0x77,0xff,0x68,0x68,0x76,0xff,0x61,0x5e, 0x63,0xff,0x4c,0x5b,0x7f,0xff,0x13,0x30,0x72,0xff,0x14,0x2f,0x73,0xff,0x55, 0x70,0x9a,0xff,0x20,0x3e,0x7e,0xff,0x1e,0x3a,0x7d,0xff,0x23,0x3d,0x81,0xff, 0x24,0x41,0x84,0xff,0x26,0x44,0x87,0xff,0x27,0x47,0x8a,0xff,0x2a,0x48,0x8b, 0xff,0x2c,0x4c,0x8f,0xff,0x2f,0x50,0x92,0xff,0x30,0x51,0x95,0xff,0x33,0x53, 0x98,0xff,0x35,0x53,0x9a,0xff,0x37,0x55,0x9c,0xff,0x38,0x59,0x9f,0xff,0x3b, 0x5a,0xa2,0xff,0x3d,0x5d,0xa5,0xff,0x40,0x60,0xa8,0xff,0x42,0x62,0xaa,0xff, 0x43,0x66,0xad,0xff,0x45,0x66,0xb1,0xff,0x49,0x6a,0xb3,0xff,0x82,0x4a,0x6b, 0xb6,0xff,0x09,0x49,0x6a,0xb5,0xff,0x4a,0x6b,0xb4,0xff,0x2b,0x28,0x23,0xff, 0x55,0x54,0x61,0xff,0x72,0x72,0x80,0xff,0x6d,0x6d,0x7a,0xed,0x00,0x00,0x00, 0x41,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x0b,0x83,0xff,0xff,0xff,0x00,0x36, 0x00,0x00,0x00,0x03,0x93,0x93,0x99,0xba,0xca,0xca,0xd1,0xff,0x96,0x97,0x9c, 0xff,0xac,0xac,0xb3,0xff,0xb8,0xb8,0xbf,0xff,0xb6,0xb6,0xbc,0xff,0xb4,0xb4, 0xbb,0xff,0xb1,0xb1,0xb9,0xff,0xb2,0xb2,0xb8,0xff,0xb3,0xb3,0xba,0xff,0xc9, 0xc9,0xd3,0xff,0xcf,0xcf,0xda,0xff,0xd8,0xd8,0xe3,0xff,0xd6,0xd7,0xe1,0xff, 0xce,0xce,0xd8,0xff,0xf1,0xf1,0xf8,0xff,0xf0,0xf0,0xfa,0xff,0xf3,0xf0,0xf4, 0xff,0x69,0x7a,0x9f,0xff,0x64,0x77,0xa2,0xff,0x71,0x81,0xa7,0xff,0x7a,0x88, 0xa9,0xff,0x74,0x85,0xae,0xff,0x72,0x85,0xae,0xff,0x74,0x86,0xb0,0xff,0x73, 0x86,0xb1,0xff,0x71,0x85,0xb1,0xff,0x70,0x84,0xb1,0xff,0x6d,0x83,0xb1,0xff, 0x6a,0x81,0xb0,0xff,0x67,0x7e,0xb0,0xff,0x62,0x7a,0xaf,0xff,0x5f,0x79,0xaf, 0xff,0x5b,0x75,0xae,0xff,0x59,0x73,0xae,0xff,0x56,0x72,0xaf,0xff,0x53,0x6f, 0xb0,0xff,0x51,0x6f,0xb1,0xff,0x50,0x6e,0xb2,0xff,0x4f,0x6e,0xb3,0xff,0x4d, 0x6b,0xb3,0xff,0x4e,0x6e,0xb6,0xff,0x4f,0x70,0xb9,0xff,0x4e,0x6f,0xb8,0xff, 0x4b,0x6d,0xb7,0xff,0x49,0x69,0xb7,0xff,0x7f,0x7e,0x7d,0xff,0xec,0xeb,0xf4, 0xff,0xe4,0xe4,0xef,0xff,0x81,0x81,0x87,0x8c,0x00,0x00,0x00,0x2b,0x00,0x00, 0x00,0x11,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff, 0x00,0x2a,0x00,0x00,0x00,0x02,0x4c,0x4c,0x4f,0x28,0xa5,0xa5,0xae,0xdc,0xd3, 0xd3,0xde,0xff,0xd3,0xd3,0xdb,0xff,0xe9,0xe9,0xee,0xff,0xc9,0xcb,0xdb,0xff, 0x42,0x5c,0x93,0xff,0x48,0x5d,0x8e,0xff,0x65,0x77,0x9b,0xff,0x55,0x6b,0x98, 0xff,0x53,0x6c,0x9c,0xff,0x5b,0x6f,0xa1,0xff,0x5e,0x74,0xa4,0xff,0x62,0x77, 0xa7,0xff,0x63,0x78,0xaa,0xff,0x65,0x7a,0xaa,0xff,0x64,0x7a,0xab,0xff,0x64, 0x7a,0xac,0xff,0x63,0x7c,0xae,0xff,0x61,0x7a,0xae,0xff,0x5f,0x77,0xad,0xff, 0x5d,0x76,0xaf,0xff,0x5b,0x75,0xaf,0xff,0x59,0x74,0xb1,0xff,0x57,0x73,0xb1, 0xff,0x54,0x71,0xb2,0xff,0x52,0x71,0xb1,0xff,0x50,0x6d,0xaf,0xff,0x4f,0x6a, 0xb1,0xff,0x50,0x6d,0xb2,0xff,0x4e,0x6e,0xb5,0xff,0x4e,0x6e,0xb6,0xff,0x4b, 0x6c,0xb5,0xff,0x4b,0x6b,0xb4,0xff,0x7a,0x82,0xa6,0xff,0xe5,0xe3,0xe6,0xff, 0x43,0x43,0x46,0x5d,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0c,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x2e,0x00,0x00,0x00,0x08, 0x32,0x32,0x3b,0xd8,0x3b,0x3b,0x45,0xff,0x2a,0x2a,0x31,0xff,0x32,0x32,0x3b, 0xff,0x36,0x36,0x41,0xff,0x35,0x35,0x3e,0xff,0x33,0x33,0x3c,0xff,0x30,0x30, 0x37,0xff,0x41,0x41,0x4c,0xff,0x4d,0x4d,0x5b,0xff,0x4b,0x4b,0x5a,0xff,0x4c, 0x4c,0x5a,0xff,0x4d,0x4d,0x5b,0xff,0x50,0x50,0x5f,0xff,0x4f,0x4f,0x5d,0xff, 0x4a,0x4a,0x59,0xff,0x63,0x64,0x75,0xff,0x67,0x67,0x76,0xff,0x62,0x5e,0x63, 0xff,0x4b,0x58,0x78,0xff,0x16,0x32,0x72,0xff,0x10,0x2c,0x70,0xff,0xbb,0xcd, 0xd4,0xff,0x2e,0x49,0x83,0xff,0x1a,0x39,0x7b,0xff,0x20,0x3d,0x7f,0xff,0x22, 0x40,0x82,0xff,0x24,0x40,0x85,0xff,0x27,0x44,0x87,0xff,0x28,0x47,0x89,0xff, 0x2b,0x49,0x8b,0xff,0x2c,0x4c,0x8f,0xff,0x2f,0x4f,0x94,0xff,0x32,0x52,0x97, 0xff,0x33,0x54,0x99,0xff,0x35,0x56,0x9c,0xff,0x38,0x57,0x9e,0xff,0x3a,0x59, 0xa1,0xff,0x3c,0x5c,0xa4,0xff,0x3f,0x5f,0xa7,0xff,0x41,0x62,0xaa,0xff,0x44, 0x65,0xae,0xff,0x47,0x68,0xb1,0xff,0x49,0x6c,0xb3,0xff,0x4c,0x6d,0xb5,0xff, 0x83,0x4b,0x6c,0xb7,0xff,0x07,0x2a,0x28,0x23,0xff,0x54,0x54,0x60,0xff,0x73, 0x73,0x80,0xff,0x6b,0x6b,0x78,0xeb,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x0a,0x83,0xff,0xff,0xff,0x00,0x0d,0x00,0x00,0x00,0x05,0x88, 0x88,0x8c,0x98,0xc6,0xc6,0xce,0xff,0x98,0x98,0x9e,0xff,0xa6,0xa6,0xac,0xff, 0xb7,0xb7,0xbe,0xff,0xb4,0xb4,0xbb,0xff,0xb2,0xb2,0xb9,0xff,0xb0,0xb0,0xb8, 0xff,0xb0,0xaf,0xb5,0xff,0xb1,0xb1,0xb8,0xff,0xc5,0xc5,0xd0,0xff,0xcf,0xcf, 0xd9,0xff,0x82,0xd7,0xd7,0xe2,0xff,0x27,0xca,0xca,0xd6,0xff,0xef,0xef,0xf5, 0xff,0xef,0xf0,0xfa,0xff,0xf7,0xf3,0xfb,0xff,0x71,0x7f,0x9f,0xff,0x66,0x7a, 0xa3,0xff,0x6b,0x7e,0xa7,0xff,0x6f,0x81,0xab,0xff,0x73,0x85,0xae,0xff,0x76, 0x87,0xaf,0xff,0x76,0x88,0xb0,0xff,0x76,0x88,0xb1,0xff,0x73,0x86,0xb1,0xff, 0x72,0x85,0xb1,0xff,0x70,0x84,0xb1,0xff,0x6c,0x82,0xb1,0xff,0x69,0x7f,0xb0, 0xff,0x64,0x7b,0xae,0xff,0x5f,0x78,0xae,0xff,0x5b,0x75,0xad,0xff,0x58,0x73, 0xad,0xff,0x56,0x71,0xae,0xff,0x53,0x70,0xae,0xff,0x50,0x6e,0xaf,0xff,0x4d, 0x6a,0xad,0xff,0x4b,0x67,0xad,0xff,0x49,0x67,0xae,0xff,0x49,0x68,0xb0,0xff, 0x49,0x69,0xb2,0xff,0x4a,0x6b,0xb4,0xff,0x4b,0x6d,0xb7,0xff,0x4d,0x6d,0xbb, 0xff,0x74,0x74,0x78,0xff,0xeb,0xe9,0xf2,0xff,0xe6,0xe6,0xf0,0xff,0x81,0x80, 0x87,0x97,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x04,0x82, 0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x2a,0x00,0x00,0x00,0x02,0x48, 0x48,0x4c,0x1d,0x9e,0x9e,0xa6,0xce,0xd1,0xd1,0xdc,0xff,0xd3,0xd3,0xdb,0xff, 0xe4,0xe4,0xeb,0xff,0xcf,0xcf,0xdc,0xff,0x4a,0x64,0x9a,0xff,0x40,0x56,0x8c, 0xff,0x3b,0x51,0x89,0xff,0x4f,0x65,0x96,0xff,0x59,0x6d,0x9d,0xff,0x5c,0x6f, 0xa1,0xff,0x60,0x75,0xa4,0xff,0x63,0x77,0xa6,0xff,0x64,0x78,0xa7,0xff,0x64, 0x7a,0xa8,0xff,0x65,0x7a,0xaa,0xff,0x64,0x7b,0xab,0xff,0x63,0x7c,0xae,0xff, 0x62,0x7a,0xae,0xff,0x61,0x79,0xad,0xff,0x5d,0x78,0xae,0xff,0x5b,0x77,0xae, 0xff,0x5a,0x74,0xaf,0xff,0x57,0x71,0xaf,0xff,0x53,0x6e,0xae,0xff,0x4f,0x6d, 0xad,0xff,0x4d,0x69,0xab,0xff,0x4d,0x6b,0xae,0xff,0x4c,0x6b,0xb0,0xff,0x49, 0x6b,0xb2,0xff,0x4d,0x6c,0xb5,0xff,0x4e,0x6e,0xb7,0xff,0x4d,0x6d,0xb6,0xff, 0x74,0x7e,0xa8,0xff,0xe7,0xe5,0xe6,0xff,0x43,0x43,0x45,0x65,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8c,0xff, 0xff,0xff,0x00,0x38,0x00,0x00,0x00,0x0a,0x32,0x32,0x3b,0xd6,0x3b,0x3b,0x45, 0xff,0x2a,0x29,0x32,0xff,0x30,0x31,0x39,0xff,0x37,0x37,0x40,0xff,0x34,0x34, 0x3e,0xff,0x33,0x33,0x3d,0xff,0x2f,0x2f,0x36,0xff,0x3f,0x40,0x4a,0xff,0x4d, 0x4d,0x5a,0xff,0x4b,0x4b,0x59,0xff,0x4b,0x4b,0x5a,0xff,0x4d,0x4d,0x5b,0xff, 0x4f,0x50,0x5e,0xff,0x4e,0x4d,0x5c,0xff,0x4a,0x4a,0x58,0xff,0x63,0x63,0x73, 0xff,0x67,0x67,0x75,0xff,0x61,0x5e,0x64,0xff,0x4b,0x56,0x74,0xff,0x13,0x30, 0x70,0xff,0x1c,0x37,0x74,0xff,0x2c,0x40,0x70,0xff,0x20,0x3a,0x76,0xff,0x1d, 0x39,0x7b,0xff,0x1f,0x3c,0x7e,0xff,0x21,0x3e,0x81,0xff,0x24,0x40,0x84,0xff, 0x25,0x42,0x85,0xff,0x27,0x46,0x88,0xff,0x2a,0x48,0x8b,0xff,0x2b,0x4c,0x8f, 0xff,0x2e,0x4e,0x92,0xff,0x31,0x50,0x94,0xff,0x32,0x51,0x98,0xff,0x34,0x53, 0x9a,0xff,0x36,0x55,0x9c,0xff,0x39,0x5a,0x9f,0xff,0x3b,0x5c,0xa2,0xff,0x3d, 0x5d,0xa5,0xff,0x41,0x61,0xa9,0xff,0x43,0x63,0xac,0xff,0x44,0x65,0xae,0xff, 0x47,0x68,0xb1,0xff,0x49,0x6a,0xb5,0xff,0x4a,0x6b,0xb6,0xff,0x48,0x69,0xb4, 0xff,0x45,0x66,0xb1,0xff,0x2a,0x27,0x24,0xff,0x54,0x54,0x60,0xff,0x73,0x73, 0x80,0xff,0x65,0x64,0x70,0xeb,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x0a,0x83,0xff,0xff,0xff,0x00,0x36,0x00,0x00,0x00,0x06,0x7c,0x7c, 0x80,0x87,0xc4,0xc4,0xcc,0xff,0x9c,0x9c,0xa2,0xff,0xa1,0xa1,0xa6,0xff,0xb6, 0xb6,0xbd,0xff,0xb2,0xb2,0xb9,0xff,0xb1,0xb1,0xb8,0xff,0xb0,0xb0,0xb6,0xff, 0xaf,0xaf,0xb6,0xff,0xaf,0xb0,0xb7,0xff,0xc3,0xc3,0xcc,0xff,0xcf,0xcf,0xd9, 0xff,0xd6,0xd6,0xe1,0xff,0xd7,0xd7,0xe3,0xff,0xc9,0xc9,0xd5,0xff,0xec,0xec, 0xf3,0xff,0xef,0xf0,0xfa,0xff,0xf8,0xf6,0xfd,0xff,0x78,0x82,0x9c,0xff,0x68, 0x7a,0xa3,0xff,0x6d,0x7f,0xa6,0xff,0x77,0x86,0xab,0xff,0x74,0x86,0xac,0xff, 0x76,0x87,0xae,0xff,0x76,0x87,0xaf,0xff,0x75,0x86,0xaf,0xff,0x73,0x86,0xaf, 0xff,0x71,0x84,0xaf,0xff,0x6f,0x82,0xaf,0xff,0x6b,0x7f,0xad,0xff,0x66,0x7c, 0xad,0xff,0x64,0x7b,0xad,0xff,0x60,0x78,0xae,0xff,0x5b,0x75,0xac,0xff,0x58, 0x73,0xac,0xff,0x55,0x71,0xad,0xff,0x52,0x6c,0xab,0xff,0x4e,0x69,0xa9,0xff, 0x4b,0x67,0xa9,0xff,0x4a,0x68,0xac,0xff,0x4b,0x6a,0xb0,0xff,0x4b,0x6a,0xb2, 0xff,0x4b,0x6b,0xb4,0xff,0x4e,0x6e,0xb7,0xff,0x4e,0x6f,0xba,0xff,0x4d,0x6e, 0xb9,0xff,0x68,0x6a,0x75,0xff,0xe9,0xe8,0xee,0xff,0xe4,0xe4,0xef,0xff,0x92, 0x92,0x98,0xa4,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04, 0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x20,0x00,0x00,0x00,0x01, 0x29,0x28,0x2b,0x13,0x93,0x92,0x9a,0xc1,0xd0,0xd0,0xdc,0xff,0xd5,0xd5,0xdc, 0xff,0xe1,0xe0,0xe8,0xff,0xd6,0xd5,0xe0,0xff,0x4c,0x65,0x9c,0xff,0x48,0x5d, 0x8d,0xff,0x5e,0x6e,0x93,0xff,0x57,0x6b,0x98,0xff,0x51,0x66,0x98,0xff,0x5e, 0x72,0x9e,0xff,0x5e,0x72,0xa1,0xff,0x62,0x76,0xa4,0xff,0x64,0x78,0xa7,0xff, 0x65,0x7a,0xa7,0xff,0x64,0x7a,0xa8,0xff,0x65,0x7a,0xaa,0xff,0x64,0x7a,0xab, 0xff,0x61,0x79,0xac,0xff,0x61,0x79,0xae,0xff,0x5d,0x78,0xae,0xff,0x5b,0x74, 0xae,0xff,0x57,0x71,0xac,0xff,0x54,0x6f,0xab,0xff,0x51,0x6b,0xa8,0xff,0x4f, 0x69,0xa8,0xff,0x4f,0x6b,0xac,0xff,0x4f,0x6d,0xb0,0xff,0x4e,0x6d,0xb2,0xff, 0x4e,0x6e,0xb3,0xff,0x83,0x4d,0x6d,0xb6,0xff,0x07,0x69,0x76,0xa7,0xff,0xe6, 0xe3,0xe4,0xff,0x58,0x58,0x5c,0x6f,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x0e, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x0b,0x00, 0x00,0x00,0x0a,0x30,0x30,0x38,0xd1,0x3a,0x3a,0x46,0xff,0x2a,0x2b,0x32,0xff, 0x30,0x31,0x38,0xff,0x35,0x35,0x3e,0xff,0x34,0x34,0x3e,0xff,0x33,0x33,0x3c, 0xff,0x2f,0x2e,0x36,0xff,0x3f,0x3f,0x4a,0xff,0x4c,0x4d,0x5a,0xff,0x82,0x4b, 0x4b,0x59,0xff,0x2b,0x4d,0x4d,0x5b,0xff,0x4f,0x4f,0x5d,0xff,0x4d,0x4d,0x5b, 0xff,0x49,0x49,0x57,0xff,0x62,0x62,0x72,0xff,0x67,0x67,0x75,0xff,0x60,0x5d, 0x65,0xff,0x4a,0x54,0x72,0xff,0x12,0x30,0x70,0xff,0x14,0x31,0x72,0xff,0x10, 0x2e,0x72,0xff,0x16,0x33,0x77,0xff,0x1d,0x38,0x7a,0xff,0x1f,0x3a,0x7c,0xff, 0x20,0x3d,0x7f,0xff,0x22,0x3f,0x81,0xff,0x23,0x40,0x83,0xff,0x26,0x44,0x86, 0xff,0x28,0x46,0x89,0xff,0x2b,0x4a,0x8e,0xff,0x2d,0x4d,0x91,0xff,0x2f,0x4f, 0x93,0xff,0x31,0x51,0x95,0xff,0x33,0x54,0x98,0xff,0x35,0x54,0x9c,0xff,0x38, 0x57,0x9e,0xff,0x3a,0x5b,0xa1,0xff,0x3d,0x5c,0xa4,0xff,0x3d,0x5d,0xa5,0xff, 0x3d,0x5a,0xa5,0xff,0x3d,0x5f,0xa8,0xff,0x3e,0x60,0xab,0xff,0x41,0x62,0xae, 0xff,0x43,0x65,0xb0,0xff,0x46,0x67,0xb2,0xff,0x49,0x6a,0xb5,0xff,0x29,0x27, 0x24,0xff,0x55,0x54,0x60,0xff,0x71,0x72,0x7f,0xff,0x68,0x69,0x73,0xea,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x0a,0x83,0xff,0xff,0xff, 0x00,0x09,0x00,0x00,0x00,0x06,0x76,0x76,0x7c,0x73,0xc1,0xc2,0xca,0xff,0xa0, 0xa0,0xa7,0xff,0x9b,0x9b,0xa1,0xff,0xb6,0xb5,0xbd,0xff,0xb0,0xb0,0xb7,0xff, 0xb1,0xb1,0xb7,0xff,0xaf,0xaf,0xb5,0xff,0x82,0xae,0xae,0xb5,0xff,0x2b,0xc0, 0xc0,0xca,0xff,0xce,0xce,0xd8,0xff,0xd5,0xd5,0xe0,0xff,0xd8,0xd8,0xe3,0xff, 0xc7,0xc7,0xd2,0xff,0xe8,0xe8,0xf0,0xff,0xf0,0xf0,0xfa,0xff,0xf7,0xf5,0xfe, 0xff,0x82,0x88,0x9d,0xff,0x66,0x78,0xa0,0xff,0x73,0x82,0xa5,0xff,0xbf,0xb4, 0xa6,0xff,0x7d,0x8a,0xa9,0xff,0x73,0x85,0xae,0xff,0x76,0x88,0xaf,0xff,0x76, 0x88,0xb0,0xff,0x75,0x87,0xb0,0xff,0x73,0x86,0xb0,0xff,0x70,0x83,0xb0,0xff, 0x6c,0x81,0xae,0xff,0x67,0x7c,0xac,0xff,0x61,0x77,0xa9,0xff,0x5f,0x77,0xab, 0xff,0x5b,0x74,0xab,0xff,0x57,0x70,0xaa,0xff,0x52,0x6b,0xa8,0xff,0x4e,0x68, 0xa6,0xff,0x4c,0x66,0xa7,0xff,0x4b,0x67,0xa9,0xff,0x4b,0x6a,0xae,0xff,0x4c, 0x6a,0xb1,0xff,0x4d,0x6b,0xb3,0xff,0x4b,0x6b,0xb4,0xff,0x4b,0x6a,0xb4,0xff, 0x49,0x6b,0xb5,0xff,0x4a,0x6b,0xb5,0xff,0x5e,0x62,0x74,0xff,0xe7,0xe6,0xea, 0xff,0xe5,0xe5,0xef,0xff,0x97,0x98,0x9e,0xae,0x00,0x00,0x00,0x30,0x00,0x00, 0x00,0x15,0x00,0x00,0x00,0x05,0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff, 0x00,0x2a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0a,0x89,0x89,0x90,0xb2,0xcf, 0xcf,0xda,0xff,0xd5,0xd4,0xdc,0xff,0xdf,0xde,0xe4,0xff,0xdd,0xda,0xe3,0xff, 0x4b,0x65,0x9c,0xff,0x56,0x65,0x8b,0xff,0xaa,0x9f,0x96,0xff,0x78,0x80,0x98, 0xff,0x45,0x5c,0x94,0xff,0x60,0x74,0x9f,0xff,0x5f,0x73,0xa3,0xff,0x62,0x76, 0xa5,0xff,0x63,0x79,0xa8,0xff,0x65,0x7a,0xa8,0xff,0x65,0x7b,0xa9,0xff,0x65, 0x7a,0xaa,0xff,0x63,0x78,0xa9,0xff,0x61,0x77,0xa9,0xff,0x60,0x76,0xaa,0xff, 0x5d,0x73,0xab,0xff,0x59,0x70,0xa9,0xff,0x55,0x6d,0xa6,0xff,0x51,0x6c,0xa6, 0xff,0x50,0x6a,0xa9,0xff,0x50,0x6b,0xac,0xff,0x4e,0x6d,0xb0,0xff,0x4f,0x6f, 0xb0,0xff,0x4d,0x6d,0xb1,0xff,0x4c,0x6b,0xb1,0xff,0x4c,0x69,0xb1,0xff,0x4a, 0x6a,0xb3,0xff,0x4c,0x6d,0xb6,0xff,0x63,0x71,0xa9,0xff,0xe7,0xe3,0xe3,0xff, 0x5d,0x5d,0x62,0x7b,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x0f,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x38,0x00,0x00,0x00,0x09, 0x2e,0x2e,0x37,0xc9,0x3a,0x3a,0x44,0xff,0x2c,0x2c,0x33,0xff,0x2f,0x2f,0x38, 0xff,0x36,0x34,0x3f,0xff,0x33,0x33,0x3c,0xff,0x32,0x32,0x3b,0xff,0x2f,0x2f, 0x36,0xff,0x3e,0x3e,0x49,0xff,0x4c,0x4c,0x5a,0xff,0x4b,0x4b,0x58,0xff,0x4b, 0x4b,0x5a,0xff,0x4c,0x4c,0x5a,0xff,0x4f,0x4e,0x5d,0xff,0x4d,0x4d,0x5c,0xff, 0x49,0x4a,0x57,0xff,0x61,0x60,0x70,0xff,0x65,0x66,0x75,0xff,0x61,0x5e,0x66, 0xff,0x49,0x53,0x6e,0xff,0x12,0x2e,0x6f,0xff,0x13,0x30,0x71,0xff,0x0c,0x2b, 0x71,0xff,0x16,0x32,0x75,0xff,0x1a,0x35,0x77,0xff,0x1c,0x37,0x78,0xff,0x1d, 0x3d,0x7b,0xff,0x1f,0x3d,0x7e,0xff,0x21,0x3e,0x80,0xff,0x23,0x41,0x82,0xff, 0x26,0x43,0x85,0xff,0x29,0x46,0x88,0xff,0x2b,0x48,0x8c,0xff,0x2d,0x4e,0x92, 0xff,0x30,0x51,0x95,0xff,0x32,0x52,0x97,0xff,0x35,0x55,0x9a,0xff,0x37,0x56, 0x9d,0xff,0x37,0x58,0x9e,0xff,0x39,0x57,0x9e,0xff,0x3a,0x59,0xa0,0xff,0x3c, 0x58,0xa4,0xff,0x40,0x60,0xa8,0xff,0x42,0x63,0xac,0xff,0x45,0x66,0xaf,0xff, 0x47,0x68,0xb4,0xff,0x4c,0x6d,0xb8,0xff,0x4d,0x6e,0xb9,0xff,0x29,0x26,0x23, 0xff,0x54,0x54,0x60,0xff,0x6f,0x6f,0x7c,0xff,0x6a,0x6a,0x76,0xe9,0x00,0x00, 0x00,0x40,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x0a,0x83,0xff,0xff,0xff,0x00, 0x36,0x00,0x00,0x00,0x06,0x66,0x65,0x6a,0x5e,0xc0,0xc0,0xc8,0xff,0xa4,0xa4, 0xab,0xff,0x9b,0x9b,0xa0,0xff,0xbb,0xba,0xc2,0xff,0xb6,0xb6,0xbd,0xff,0xb2, 0xb2,0xb9,0xff,0xaf,0xaf,0xb6,0xff,0xab,0xab,0xb2,0xff,0xad,0xac,0xb3,0xff, 0xbe,0xbe,0xc7,0xff,0xcd,0xcd,0xd7,0xff,0xd2,0xd2,0xde,0xff,0xd9,0xd9,0xe4, 0xff,0xc6,0xc6,0xd0,0xff,0xe5,0xe5,0xed,0xff,0xf0,0xf0,0xf9,0xff,0xf6,0xf5, 0xff,0xff,0x8e,0x91,0xa1,0xff,0x65,0x77,0x9f,0xff,0x6f,0x80,0xa7,0xff,0x8e, 0x92,0xa5,0xff,0x7d,0x8a,0xaa,0xff,0x73,0x86,0xad,0xff,0x75,0x86,0xaf,0xff, 0x74,0x86,0xaf,0xff,0x73,0x85,0xaf,0xff,0x72,0x84,0xb0,0xff,0x6e,0x82,0xaf, 0xff,0x6b,0x80,0xae,0xff,0x67,0x7d,0xad,0xff,0x61,0x77,0xaa,0xff,0x5d,0x74, 0xa8,0xff,0x59,0x71,0xa8,0xff,0x54,0x6c,0xa5,0xff,0x50,0x69,0xa4,0xff,0x4d, 0x66,0xa5,0xff,0x4d,0x68,0xa8,0xff,0x4c,0x6a,0xac,0xff,0x4a,0x6b,0xae,0xff, 0x4a,0x69,0xae,0xff,0x48,0x67,0xad,0xff,0x47,0x66,0xad,0xff,0x47,0x67,0xb1, 0xff,0x4a,0x6b,0xb5,0xff,0x4e,0x6f,0xb9,0xff,0x56,0x5b,0x75,0xff,0xe4,0xe2, 0xe6,0xff,0xe4,0xe4,0xee,0xff,0xa1,0xa3,0xa9,0xba,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x06,0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff, 0xff,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x81,0x81,0x87,0x9e, 0xcc,0xcc,0xd7,0xff,0xd3,0xd3,0xdd,0xff,0xda,0xdb,0xe1,0xff,0xe5,0xe2,0xe9, 0xff,0x52,0x6b,0x9e,0xff,0x4c,0x5e,0x88,0xff,0x7c,0x80,0x8f,0xff,0x6e,0x78, 0x95,0xff,0x48,0x63,0x9b,0xff,0x5d,0x70,0x9f,0xff,0x5f,0x74,0xa3,0xff,0x62, 0x77,0xa4,0xff,0x63,0x78,0xa6,0xff,0x65,0x78,0xa8,0xff,0x82,0x65,0x7a,0xaa, 0xff,0x17,0x62,0x78,0xa9,0xff,0x5e,0x74,0xa6,0xff,0x5e,0x73,0xa7,0xff,0x59, 0x70,0xa6,0xff,0x55,0x6d,0xa6,0xff,0x53,0x6c,0xa7,0xff,0x52,0x6c,0xa9,0xff, 0x51,0x6b,0xa9,0xff,0x50,0x6d,0xae,0xff,0x4f,0x6b,0xad,0xff,0x4c,0x69,0xac, 0xff,0x4a,0x68,0xac,0xff,0x4a,0x68,0xae,0xff,0x4b,0x6a,0xb0,0xff,0x4d,0x6d, 0xb4,0xff,0x4e,0x6e,0xb8,0xff,0x5c,0x6c,0xaa,0xff,0xe3,0xe0,0xde,0xff,0x73, 0x73,0x78,0x88,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x38,0x00,0x00,0x00,0x09,0x2d, 0x2e,0x35,0xc3,0x3a,0x3a,0x43,0xff,0x2b,0x2b,0x33,0xff,0x2f,0x2f,0x38,0xff, 0x34,0x36,0x3f,0xff,0x32,0x32,0x3b,0xff,0x32,0x32,0x3a,0xff,0x2e,0x2e,0x37, 0xff,0x3d,0x3d,0x48,0xff,0x4c,0x4c,0x5a,0xff,0x4b,0x4b,0x58,0xff,0x4b,0x4b, 0x59,0xff,0x4c,0x4c,0x5a,0xff,0x4e,0x4e,0x5d,0xff,0x4e,0x4e,0x5c,0xff,0x48, 0x48,0x56,0xff,0x60,0x5f,0x6f,0xff,0x65,0x65,0x74,0xff,0x62,0x5f,0x67,0xff, 0x48,0x51,0x6a,0xff,0x11,0x2c,0x68,0xff,0x09,0x26,0x6a,0xff,0xde,0xba,0x7c, 0xff,0x29,0x3f,0x71,0xff,0x14,0x30,0x73,0xff,0x1a,0x34,0x77,0xff,0x1c,0x3b, 0x79,0xff,0x1e,0x3c,0x7d,0xff,0x21,0x3e,0x7f,0xff,0x23,0x40,0x82,0xff,0x25, 0x42,0x85,0xff,0x26,0x44,0x86,0xff,0x28,0x45,0x88,0xff,0x2c,0x49,0x8c,0xff, 0x30,0x4f,0x93,0xff,0x32,0x50,0x96,0xff,0x32,0x52,0x97,0xff,0x33,0x51,0x98, 0xff,0x35,0x52,0x99,0xff,0x36,0x53,0x9a,0xff,0x39,0x58,0x9f,0xff,0x3e,0x5e, 0xa6,0xff,0x41,0x64,0xaa,0xff,0x44,0x66,0xad,0xff,0x48,0x67,0xaf,0xff,0x46, 0x66,0xb2,0xff,0x45,0x66,0xb1,0xff,0x46,0x67,0xb2,0xff,0x27,0x25,0x21,0xff, 0x54,0x54,0x60,0xff,0x6e,0x6f,0x7b,0xff,0x66,0x66,0x73,0xe8,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x0a,0x83,0xff,0xff,0xff,0x00,0x36, 0x00,0x00,0x00,0x04,0x63,0x62,0x66,0x4c,0xbd,0xbd,0xc5,0xff,0xa7,0xa7,0xae, 0xff,0x96,0x96,0x9c,0xff,0xb9,0xb9,0xc0,0xff,0xb2,0xb2,0xb9,0xff,0xaf,0xaf, 0xb6,0xff,0xac,0xad,0xb3,0xff,0xaa,0xaa,0xb1,0xff,0xac,0xac,0xb2,0xff,0xbb, 0xbb,0xc4,0xff,0xcc,0xcc,0xd6,0xff,0xd1,0xd1,0xdd,0xff,0xd9,0xd9,0xe4,0xff, 0xc5,0xc4,0xcf,0xff,0xe2,0xe2,0xe9,0xff,0xf0,0xef,0xf9,0xff,0xf6,0xf5,0xff, 0xff,0x9b,0x9c,0xa6,0xff,0x61,0x74,0x9e,0xff,0x6c,0x7e,0xa3,0xff,0x6e,0x80, 0xa8,0xff,0x70,0x82,0xa9,0xff,0x72,0x84,0xac,0xff,0x72,0x85,0xac,0xff,0x73, 0x84,0xad,0xff,0x71,0x83,0xad,0xff,0x70,0x82,0xad,0xff,0x6d,0x80,0xad,0xff, 0x69,0x7d,0xac,0xff,0x65,0x7b,0xab,0xff,0x5e,0x75,0xa7,0xff,0x5a,0x70,0xa5, 0xff,0x56,0x6d,0xa4,0xff,0x52,0x6a,0xa3,0xff,0x50,0x69,0xa4,0xff,0x4d,0x6a, 0xa7,0xff,0x4c,0x6a,0xa9,0xff,0x4a,0x69,0xaa,0xff,0x48,0x67,0xa9,0xff,0x45, 0x63,0xa8,0xff,0x46,0x64,0xaa,0xff,0x47,0x67,0xaf,0xff,0x4a,0x6a,0xb3,0xff, 0x4b,0x6b,0xb6,0xff,0x4b,0x6c,0xb6,0xff,0x50,0x57,0x75,0xff,0xe1,0xdf,0xe1, 0xff,0xe4,0xe4,0xee,0xff,0xa5,0xa7,0xad,0xc3,0x00,0x00,0x00,0x34,0x00,0x00, 0x00,0x18,0x00,0x00,0x00,0x06,0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff, 0x00,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x70,0x70,0x78,0x88,0xc8, 0xc8,0xd4,0xff,0xd3,0xd2,0xdc,0xff,0xd7,0xd6,0xde,0xff,0xef,0xec,0xef,0xff, 0x5c,0x71,0xa1,0xff,0x3b,0x52,0x86,0xff,0x39,0x53,0x89,0xff,0x48,0x5d,0x90, 0xff,0x5b,0x6f,0x9b,0xff,0x58,0x6c,0x9b,0xff,0x5e,0x72,0xa0,0xff,0x60,0x74, 0xa2,0xff,0x62,0x75,0xa5,0xff,0x62,0x77,0xa6,0xff,0x63,0x78,0xa8,0xff,0x62, 0x77,0xa7,0xff,0x5f,0x74,0xa6,0xff,0x5c,0x71,0xa4,0xff,0x5a,0x6f,0xa3,0xff, 0x58,0x6d,0xa4,0xff,0x56,0x6d,0xa4,0xff,0x53,0x6e,0xa7,0xff,0x52,0x6d,0xab, 0xff,0x4f,0x6b,0xa9,0xff,0x4e,0x6a,0xaa,0xff,0x4a,0x67,0xa8,0xff,0x49,0x66, 0xa8,0xff,0x49,0x67,0xa8,0xff,0x4b,0x6a,0xaf,0xff,0x4b,0x6c,0xb3,0xff,0x4f, 0x70,0xb6,0xff,0x4c,0x6c,0xb4,0xff,0x55,0x68,0xac,0xff,0xe0,0xde,0xda,0xff, 0x7a,0x79,0x7f,0x92,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x12,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x0e,0x00,0x00,0x00,0x09, 0x2e,0x2f,0x37,0xbd,0x39,0x39,0x43,0xff,0x2a,0x2b,0x32,0xff,0x2e,0x2e,0x37, 0xff,0x36,0x37,0x40,0xff,0x33,0x33,0x3c,0xff,0x31,0x31,0x39,0xff,0x2b,0x2d, 0x33,0xff,0x3c,0x3c,0x46,0xff,0x4b,0x4b,0x5b,0xff,0x4a,0x4a,0x57,0xff,0x4b, 0x4b,0x59,0xff,0x4c,0x4c,0x5a,0xff,0x82,0x4e,0x4e,0x5c,0xff,0x28,0x48,0x48, 0x56,0xff,0x5e,0x5e,0x6d,0xff,0x65,0x65,0x73,0xff,0x62,0x60,0x67,0xff,0x47, 0x4e,0x66,0xff,0x10,0x2c,0x68,0xff,0x0c,0x2e,0x70,0xff,0x84,0x69,0x56,0xff, 0x26,0x3c,0x71,0xff,0x16,0x34,0x78,0xff,0x1a,0x37,0x79,0xff,0x1e,0x39,0x7b, 0xff,0x20,0x3c,0x7e,0xff,0x20,0x3e,0x80,0xff,0x24,0x3f,0x83,0xff,0x25,0x42, 0x86,0xff,0x28,0x46,0x89,0xff,0x29,0x47,0x8a,0xff,0x2a,0x46,0x89,0xff,0x2c, 0x49,0x8d,0xff,0x2e,0x4e,0x92,0xff,0x2f,0x4c,0x92,0xff,0x31,0x4e,0x94,0xff, 0x33,0x50,0x98,0xff,0x37,0x55,0x9c,0xff,0x3b,0x5d,0xa2,0xff,0x3e,0x5e,0xa6, 0xff,0x40,0x5f,0xab,0xff,0x42,0x62,0xaa,0xff,0x41,0x61,0xaa,0xff,0x41,0x63, 0xab,0xff,0x45,0x66,0xb1,0xff,0x49,0x6a,0xb7,0xff,0x26,0x25,0x21,0xff,0x55, 0x54,0x61,0xff,0x6e,0x6e,0x7b,0xff,0x63,0x63,0x6f,0xe7,0x00,0x00,0x00,0x40, 0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x0a,0x83,0xff,0xff,0xff,0x00,0x36,0x00, 0x00,0x00,0x04,0x52,0x52,0x55,0x38,0xba,0xba,0xc1,0xff,0xab,0xab,0xb2,0xff, 0x91,0x91,0x95,0xff,0xb5,0xb5,0xbc,0xff,0xaf,0xaf,0xb6,0xff,0xae,0xae,0xb5, 0xff,0xac,0xac,0xb3,0xff,0xab,0xab,0xb2,0xff,0xac,0xac,0xb2,0xff,0xb9,0xb9, 0xc1,0xff,0xca,0xcb,0xd4,0xff,0xd0,0xd0,0xda,0xff,0xd8,0xd8,0xe3,0xff,0xc4, 0xc4,0xd0,0xff,0xdd,0xdd,0xe6,0xff,0xef,0xef,0xf8,0xff,0xf4,0xf4,0xff,0xff, 0xa8,0xa7,0xac,0xff,0x5d,0x70,0x9a,0xff,0x63,0x75,0x9d,0xff,0x79,0x88,0xa8, 0xff,0x73,0x83,0xa7,0xff,0x6d,0x7f,0xa6,0xff,0x6f,0x81,0xa8,0xff,0x6e,0x7f, 0xa9,0xff,0x6c,0x7f,0xa9,0xff,0x6b,0x7f,0xaa,0xff,0x68,0x7c,0xa9,0xff,0x66, 0x7a,0xa8,0xff,0x60,0x76,0xa5,0xff,0x5c,0x72,0xa3,0xff,0x57,0x6e,0xa2,0xff, 0x54,0x6b,0xa1,0xff,0x51,0x6a,0xa3,0xff,0x4f,0x6a,0xa5,0xff,0x4d,0x6a,0xa7, 0xff,0x49,0x67,0xa6,0xff,0x46,0x63,0xa4,0xff,0x44,0x60,0xa3,0xff,0x44,0x61, 0xa6,0xff,0x47,0x66,0xac,0xff,0x47,0x67,0xaf,0xff,0x49,0x68,0xb2,0xff,0x49, 0x6a,0xb4,0xff,0x48,0x67,0xb3,0xff,0x49,0x52,0x78,0xff,0xdd,0xdb,0xdb,0xff, 0xe3,0xe3,0xee,0xff,0xb1,0xb1,0xb9,0xcf,0x00,0x00,0x00,0x36,0x00,0x00,0x00, 0x19,0x00,0x00,0x00,0x07,0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00, 0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x68,0x69,0x6d,0x75,0xc5,0xc5, 0xd1,0xff,0xd0,0xd2,0xda,0xff,0xd4,0xd3,0xda,0xff,0xf4,0xef,0xf2,0xff,0x5d, 0x72,0x9e,0xff,0x40,0x55,0x83,0xff,0x5c,0x6e,0x97,0xff,0x5e,0x71,0x99,0xff, 0x45,0x5a,0x8c,0xff,0x57,0x6a,0x97,0xff,0x57,0x6e,0x9b,0xff,0x5c,0x71,0x9e, 0xff,0x5e,0x72,0xa0,0xff,0x5e,0x74,0xa2,0xff,0x5f,0x74,0xa2,0xff,0x5e,0x72, 0xa2,0xff,0x5b,0x70,0xa3,0xff,0x59,0x6f,0xa2,0xff,0x56,0x6c,0xa1,0xff,0x55, 0x6b,0xa2,0xff,0x55,0x6c,0xa4,0xff,0x52,0x6f,0xa8,0xff,0x4f,0x6b,0xa7,0xff, 0x4b,0x68,0xa5,0xff,0x49,0x66,0xa4,0xff,0x47,0x64,0xa5,0xff,0x47,0x64,0xa6, 0xff,0x4a,0x67,0xab,0xff,0x4b,0x6a,0xaf,0xff,0x4c,0x6b,0xb1,0xff,0x4b,0x6b, 0xb2,0xff,0x48,0x69,0xb0,0xff,0x4e,0x63,0xac,0xff,0xda,0xd7,0xd3,0xff,0x89, 0x88,0x8f,0x9f,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x0e,0x00,0x00,0x00,0x08,0x2c, 0x2c,0x33,0xba,0x39,0x38,0x44,0xff,0x2a,0x2a,0x32,0xff,0x2d,0x2c,0x34,0xff, 0x35,0x33,0x3c,0xff,0x33,0x33,0x3b,0xff,0x32,0x32,0x3a,0xff,0x2e,0x2e,0x36, 0xff,0x3b,0x3b,0x46,0xff,0x4b,0x4b,0x59,0xff,0x4a,0x4a,0x57,0xff,0x4b,0x4b, 0x59,0xff,0x4b,0x4b,0x5a,0xff,0x82,0x4d,0x4d,0x5b,0xff,0x28,0x49,0x49,0x55, 0xff,0x5d,0x5d,0x6c,0xff,0x64,0x64,0x72,0xff,0x63,0x60,0x69,0xff,0x46,0x4b, 0x61,0xff,0x0c,0x28,0x68,0xff,0x20,0x3b,0x74,0xff,0x0b,0x2c,0x71,0xff,0x1b, 0x39,0x73,0xff,0x1a,0x35,0x75,0xff,0x19,0x36,0x76,0xff,0x1c,0x38,0x79,0xff, 0x1e,0x3b,0x7d,0xff,0x1f,0x3c,0x7f,0xff,0x22,0x3e,0x81,0xff,0x24,0x41,0x84, 0xff,0x27,0x44,0x87,0xff,0x28,0x46,0x89,0xff,0x28,0x44,0x88,0xff,0x29,0x46, 0x89,0xff,0x2b,0x48,0x8c,0xff,0x2e,0x4a,0x91,0xff,0x30,0x4e,0x94,0xff,0x34, 0x52,0x99,0xff,0x37,0x56,0x9d,0xff,0x3b,0x5a,0xa1,0xff,0x3b,0x5a,0xa2,0xff, 0x3c,0x58,0xa2,0xff,0x3c,0x5b,0xa2,0xff,0x42,0x62,0xaa,0xff,0x46,0x67,0xb0, 0xff,0x48,0x69,0xb2,0xff,0x4c,0x6d,0xb6,0xff,0x24,0x23,0x20,0xff,0x56,0x54, 0x61,0xff,0x6d,0x6d,0x7a,0xff,0x64,0x65,0x70,0xe6,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x1f,0x00,0x00,0x00,0x0a,0x83,0xff,0xff,0xff,0x00,0x36,0x00,0x00, 0x00,0x03,0x47,0x47,0x4a,0x29,0xb4,0xb4,0xbd,0xff,0xaf,0xaf,0xb6,0xff,0x8d, 0x8d,0x92,0xff,0xb4,0xb5,0xbb,0xff,0xb0,0xaf,0xb6,0xff,0xae,0xae,0xb5,0xff, 0xad,0xad,0xb4,0xff,0xab,0xab,0xb1,0xff,0xaa,0xaa,0xb0,0xff,0xb5,0xb5,0xbd, 0xff,0xc9,0xc9,0xd3,0xff,0xcf,0xcf,0xd9,0xff,0xd8,0xd8,0xe3,0xff,0xc6,0xc6, 0xd0,0xff,0xd9,0xd9,0xe2,0xff,0xef,0xef,0xf8,0xff,0xf1,0xf0,0xfc,0xff,0xb8, 0xb5,0xb8,0xff,0x57,0x6c,0x99,0xff,0x5c,0x6e,0x98,0xff,0x98,0xa2,0xb5,0xff, 0x7e,0x8b,0xa9,0xff,0x66,0x78,0xa0,0xff,0x69,0x7b,0xa3,0xff,0x69,0x7c,0xa4, 0xff,0x68,0x7b,0xa5,0xff,0x65,0x79,0xa4,0xff,0x63,0x78,0xa4,0xff,0x5f,0x75, 0xa3,0xff,0x5b,0x71,0xa2,0xff,0x58,0x6f,0xa1,0xff,0x55,0x6c,0xa1,0xff,0x51, 0x68,0xa0,0xff,0x4f,0x68,0xa1,0xff,0x4d,0x68,0xa4,0xff,0x4a,0x67,0xa4,0xff, 0x46,0x61,0xa1,0xff,0x43,0x5e,0xa0,0xff,0x42,0x5e,0xa2,0xff,0x44,0x64,0xa8, 0xff,0x45,0x65,0xab,0xff,0x47,0x66,0xad,0xff,0x47,0x67,0xaf,0xff,0x47,0x67, 0xb1,0xff,0x44,0x64,0xaf,0xff,0x46,0x50,0x80,0xff,0xd9,0xd7,0xd5,0xff,0xe3, 0xe3,0xee,0xff,0xb7,0xb7,0xbf,0xd7,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1a, 0x00,0x00,0x00,0x08,0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x76,0x76,0x7c,0x65,0xbd,0xbd,0xc7, 0xff,0xce,0xd0,0xda,0xff,0xd1,0xd1,0xd8,0xff,0xf3,0xee,0xf1,0xff,0x60,0x74, 0xa1,0xff,0x3e,0x53,0x83,0xff,0x7f,0x88,0xa1,0xff,0x7d,0x87,0xa3,0xff,0x3d, 0x4c,0x7d,0xff,0x54,0x68,0x94,0xff,0x53,0x69,0x95,0xff,0x57,0x6c,0x98,0xff, 0x59,0x6e,0x9c,0xff,0x59,0x6f,0x9d,0xff,0x5a,0x6e,0x9e,0xff,0x59,0x6f,0x9e, 0xff,0x58,0x6e,0xa0,0xff,0x56,0x6b,0xa0,0xff,0x54,0x6a,0xa0,0xff,0x52,0x69, 0x9f,0xff,0x51,0x69,0xa1,0xff,0x4f,0x68,0xa4,0xff,0x4c,0x65,0xa2,0xff,0x49, 0x62,0xa1,0xff,0x46,0x61,0xa2,0xff,0x48,0x62,0xa4,0xff,0x47,0x67,0xa7,0xff, 0x48,0x67,0xab,0xff,0x47,0x66,0xab,0xff,0x49,0x68,0xae,0xff,0x47,0x67,0xae, 0xff,0x46,0x67,0xae,0xff,0x4a,0x61,0xae,0xff,0xd6,0xd2,0xcf,0xff,0x90,0x91, 0x97,0xa8,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x0e,0x00,0x00,0x00,0x08,0x29,0x28, 0x2f,0xb2,0x38,0x38,0x44,0xff,0x2b,0x2b,0x33,0xff,0x2d,0x2e,0x34,0xff,0x35, 0x35,0x3e,0xff,0x32,0x32,0x3b,0xff,0x31,0x31,0x39,0xff,0x2e,0x2e,0x36,0xff, 0x3a,0x3a,0x45,0xff,0x4a,0x4a,0x58,0xff,0x4a,0x4a,0x57,0xff,0x4b,0x4b,0x58, 0xff,0x4b,0x4b,0x59,0xff,0x82,0x4d,0x4d,0x5b,0xff,0x28,0x48,0x48,0x54,0xff, 0x5c,0x5c,0x6b,0xff,0x64,0x64,0x71,0xff,0x63,0x60,0x68,0xff,0x44,0x49,0x5d, 0xff,0x0d,0x27,0x63,0xff,0x0e,0x28,0x65,0xff,0x12,0x2d,0x6b,0xff,0x0f,0x2c, 0x6d,0xff,0x14,0x30,0x71,0xff,0x17,0x33,0x74,0xff,0x1a,0x36,0x77,0xff,0x1c, 0x38,0x7a,0xff,0x1e,0x3a,0x7c,0xff,0x20,0x3d,0x7f,0xff,0x23,0x3f,0x82,0xff, 0x24,0x41,0x83,0xff,0x25,0x42,0x83,0xff,0x27,0x43,0x86,0xff,0x28,0x44,0x88, 0xff,0x2b,0x47,0x8b,0xff,0x2f,0x4c,0x92,0xff,0x31,0x53,0x97,0xff,0x34,0x56, 0x9a,0xff,0x37,0x57,0x9c,0xff,0x38,0x55,0x9c,0xff,0x37,0x56,0x9e,0xff,0x3a, 0x59,0x9f,0xff,0x3f,0x5e,0xa6,0xff,0x43,0x63,0xac,0xff,0x44,0x65,0xae,0xff, 0x47,0x67,0xb0,0xff,0x44,0x66,0xb0,0xff,0x26,0x23,0x20,0xff,0x56,0x55,0x61, 0xff,0x6c,0x6c,0x79,0xff,0x65,0x65,0x71,0xe5,0x00,0x00,0x00,0x3f,0x00,0x00, 0x00,0x1f,0x00,0x00,0x00,0x0a,0x83,0xff,0xff,0xff,0x00,0x06,0x00,0x00,0x00, 0x02,0x32,0x32,0x34,0x1a,0xb0,0xb0,0xb7,0xfc,0xb3,0xb3,0xba,0xff,0x8c,0x8c, 0x91,0xff,0xb2,0xb2,0xb9,0xff,0x82,0xae,0xae,0xb5,0xff,0x2e,0xac,0xac,0xb3, 0xff,0xa8,0xa8,0xaf,0xff,0xab,0xab,0xb1,0xff,0xb3,0xb3,0xbb,0xff,0xc7,0xc7, 0xd0,0xff,0xcd,0xcd,0xd7,0xff,0xd7,0xd7,0xe1,0xff,0xc6,0xc6,0xcf,0xff,0xd4, 0xd4,0xde,0xff,0xee,0xee,0xf7,0xff,0xef,0xef,0xfa,0xff,0xc6,0xc2,0xc4,0xff, 0x53,0x68,0x97,0xff,0x5a,0x6f,0x99,0xff,0x6d,0x7c,0x9f,0xff,0x6f,0x7f,0xa3, 0xff,0x62,0x75,0x9f,0xff,0x64,0x77,0xa0,0xff,0x65,0x77,0xa1,0xff,0x62,0x75, 0xa0,0xff,0x62,0x75,0xa1,0xff,0x5e,0x73,0xa0,0xff,0x5b,0x70,0xa0,0xff,0x58, 0x6e,0xa0,0xff,0x53,0x6b,0x9e,0xff,0x52,0x69,0x9e,0xff,0x4d,0x65,0x9d,0xff, 0x4b,0x63,0x9d,0xff,0x49,0x63,0x9e,0xff,0x47,0x61,0x9e,0xff,0x44,0x5e,0x9e, 0xff,0x41,0x5c,0x9f,0xff,0x42,0x5f,0xa4,0xff,0x43,0x62,0xa8,0xff,0x43,0x62, 0xa9,0xff,0x44,0x64,0xab,0xff,0x45,0x65,0xae,0xff,0x44,0x64,0xad,0xff,0x43, 0x62,0xad,0xff,0x40,0x4e,0x83,0xff,0xd3,0xd1,0xce,0xff,0xe4,0xe4,0xed,0xff, 0xbd,0xbd,0xc6,0xe1,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x1c,0x00,0x00,0x00, 0x08,0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x2a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x05,0x67,0x68,0x6c,0x55,0xb9,0xb9,0xc3,0xff,0xce,0xce, 0xd9,0xff,0xcd,0xcc,0xd4,0xff,0xf2,0xee,0xf1,0xff,0x66,0x78,0xa3,0xff,0x38, 0x4e,0x81,0xff,0x61,0x72,0x94,0xff,0x64,0x73,0x97,0xff,0x39,0x50,0x87,0xff, 0x4e,0x62,0x91,0xff,0x4f,0x65,0x93,0xff,0x52,0x67,0x95,0xff,0x53,0x68,0x98, 0xff,0x53,0x68,0x99,0xff,0x54,0x6a,0x9a,0xff,0x54,0x6b,0x9b,0xff,0x53,0x6a, 0x9c,0xff,0x51,0x68,0x9d,0xff,0x51,0x67,0x9d,0xff,0x4f,0x67,0x9d,0xff,0x4b, 0x65,0x9d,0xff,0x4a,0x63,0x9d,0xff,0x47,0x5f,0x9c,0xff,0x45,0x5e,0x9b,0xff, 0x46,0x60,0xa1,0xff,0x46,0x63,0xa5,0xff,0x46,0x66,0xa7,0xff,0x45,0x66,0xa8, 0xff,0x46,0x66,0xa9,0xff,0x47,0x66,0xac,0xff,0x45,0x65,0xab,0xff,0x45,0x64, 0xac,0xff,0x46,0x5e,0xb0,0xff,0xcf,0xcb,0xc8,0xff,0x9f,0x9f,0xa5,0xb4,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00, 0x8c,0xff,0xff,0xff,0x00,0x03,0x00,0x00,0x00,0x08,0x28,0x28,0x2f,0xaa,0x38, 0x38,0x43,0xff,0x82,0x2b,0x2b,0x33,0xff,0x33,0x35,0x35,0x3e,0xff,0x32,0x32, 0x3b,0xff,0x31,0x31,0x3a,0xff,0x2e,0x2d,0x36,0xff,0x3a,0x3a,0x44,0xff,0x4a, 0x4a,0x57,0xff,0x49,0x49,0x57,0xff,0x4b,0x4b,0x58,0xff,0x4b,0x4b,0x59,0xff, 0x4d,0x4d,0x5b,0xff,0x4c,0x4c,0x5a,0xff,0x48,0x47,0x54,0xff,0x5b,0x59,0x6a, 0xff,0x63,0x62,0x71,0xff,0x63,0x60,0x68,0xff,0x43,0x47,0x58,0xff,0x0d,0x27, 0x62,0xff,0x04,0x1e,0x5e,0xff,0xb9,0xbb,0xb9,0xff,0x1f,0x38,0x6d,0xff,0x11, 0x2b,0x6a,0xff,0x16,0x31,0x6f,0xff,0x18,0x34,0x6f,0xff,0x18,0x35,0x75,0xff, 0x1b,0x38,0x77,0xff,0x1d,0x3a,0x7a,0xff,0x20,0x3c,0x7d,0xff,0x21,0x3e,0x7e, 0xff,0x23,0x40,0x81,0xff,0x25,0x42,0x84,0xff,0x28,0x43,0x86,0xff,0x2a,0x46, 0x8a,0xff,0x2d,0x4d,0x91,0xff,0x32,0x50,0x98,0xff,0x33,0x54,0x97,0xff,0x33, 0x51,0x97,0xff,0x35,0x52,0x97,0xff,0x37,0x55,0x9c,0xff,0x3c,0x5b,0xa3,0xff, 0x3d,0x60,0xa7,0xff,0x40,0x61,0xa9,0xff,0x44,0x64,0xac,0xff,0x46,0x66,0xaf, 0xff,0x43,0x62,0xad,0xff,0x25,0x23,0x20,0xff,0x56,0x54,0x61,0xff,0x6b,0x6b, 0x78,0xff,0x64,0x64,0x70,0xe5,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x1f,0x00, 0x00,0x00,0x0a,0x83,0xff,0xff,0xff,0x00,0x36,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x0e,0xaa,0xaa,0xb1,0xf2,0xb5,0xb6,0xbc,0xff,0x8b,0x8b,0x90,0xff,0xb1, 0xb0,0xb8,0xff,0xb0,0xb0,0xb6,0xff,0xad,0xad,0xb4,0xff,0xac,0xac,0xb3,0xff, 0xa9,0xa9,0xb0,0xff,0xaa,0xaa,0xb0,0xff,0xb1,0xb1,0xb9,0xff,0xc5,0xc5,0xce, 0xff,0xcb,0xcb,0xd5,0xff,0xd5,0xd5,0xe0,0xff,0xc6,0xc6,0xd0,0xff,0xd1,0xd1, 0xda,0xff,0xef,0xef,0xf6,0xff,0xed,0xed,0xf7,0xff,0xd0,0xcc,0xcc,0xff,0x4e, 0x62,0x91,0xff,0x57,0x6b,0x96,0xff,0x5a,0x6e,0x98,0xff,0x5e,0x71,0x9c,0xff, 0x5e,0x72,0x9d,0xff,0x5f,0x73,0x9f,0xff,0x5e,0x72,0x9d,0xff,0x5d,0x71,0x9c, 0xff,0x5b,0x70,0x9c,0xff,0x59,0x6e,0x9c,0xff,0x57,0x6c,0x9c,0xff,0x53,0x69, 0x9c,0xff,0x4f,0x67,0x9a,0xff,0x4c,0x65,0x9a,0xff,0x4a,0x62,0x9a,0xff,0x47, 0x60,0x9b,0xff,0x45,0x5f,0x9a,0xff,0x42,0x5d,0x9a,0xff,0x42,0x5c,0x9b,0xff, 0x41,0x5d,0x9d,0xff,0x41,0x61,0xa3,0xff,0x41,0x61,0xa5,0xff,0x41,0x61,0xa7, 0xff,0x43,0x63,0xaa,0xff,0x42,0x64,0xab,0xff,0x41,0x5f,0xaa,0xff,0x41,0x62, 0xab,0xff,0x3e,0x4e,0x8b,0xff,0xd0,0xce,0xca,0xff,0xe3,0xe3,0xee,0xff,0xc5, 0xc5,0xcf,0xe8,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x09, 0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x2a,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x56,0x56,0x5b,0x42,0xb7,0xb7,0xc0,0xff,0xcc,0xcc,0xd6, 0xff,0xc8,0xc9,0xd2,0xff,0xf0,0xed,0xf1,0xff,0x68,0x79,0xa3,0xff,0x33,0x4b, 0x7f,0xff,0x36,0x4f,0x81,0xff,0x3b,0x54,0x85,0xff,0x43,0x59,0x8c,0xff,0x48, 0x5c,0x8d,0xff,0x4a,0x5e,0x8e,0xff,0x4d,0x62,0x91,0xff,0x4f,0x65,0x93,0xff, 0x4f,0x65,0x96,0xff,0x4e,0x65,0x98,0xff,0x4f,0x66,0x98,0xff,0x4e,0x65,0x98, 0xff,0x4c,0x65,0x98,0xff,0x4b,0x63,0x9a,0xff,0x4a,0x61,0x9a,0xff,0x48,0x61, 0x99,0xff,0x46,0x60,0x9b,0xff,0x44,0x5e,0x9c,0xff,0x43,0x5d,0x9b,0xff,0x44, 0x60,0xa0,0xff,0x44,0x61,0xa4,0xff,0x43,0x62,0xa4,0xff,0x44,0x62,0xa6,0xff, 0x45,0x64,0xa9,0xff,0x44,0x63,0xa9,0xff,0x43,0x61,0xa8,0xff,0x43,0x62,0xa9, 0xff,0x43,0x5d,0xb3,0xff,0xc9,0xc7,0xc4,0xff,0xa5,0xa5,0xab,0xbf,0x00,0x00, 0x00,0x34,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x8c, 0xff,0xff,0xff,0x00,0x38,0x00,0x00,0x00,0x08,0x2b,0x2b,0x32,0xa4,0x38,0x38, 0x41,0xff,0x2d,0x2d,0x33,0xff,0x2b,0x2b,0x32,0xff,0x35,0x35,0x3e,0xff,0x32, 0x32,0x3a,0xff,0x31,0x31,0x3a,0xff,0x2d,0x2e,0x35,0xff,0x38,0x37,0x41,0xff, 0x4a,0x4a,0x57,0xff,0x49,0x49,0x56,0xff,0x4a,0x4a,0x57,0xff,0x4b,0x4b,0x59, 0xff,0x4c,0x4c,0x5b,0xff,0x4c,0x4c,0x5a,0xff,0x47,0x47,0x53,0xff,0x58,0x58, 0x69,0xff,0x62,0x62,0x70,0xff,0x62,0x60,0x69,0xff,0x42,0x45,0x55,0xff,0x0d, 0x29,0x67,0xff,0x05,0x23,0x63,0xff,0x57,0x64,0x84,0xff,0x16,0x2f,0x69,0xff, 0x12,0x2c,0x6a,0xff,0x16,0x30,0x6e,0xff,0x18,0x34,0x70,0xff,0x19,0x35,0x72, 0xff,0x19,0x35,0x74,0xff,0x1c,0x37,0x77,0xff,0x1d,0x3a,0x79,0xff,0x20,0x3d, 0x7c,0xff,0x23,0x40,0x81,0xff,0x24,0x41,0x84,0xff,0x26,0x43,0x86,0xff,0x28, 0x44,0x88,0xff,0x2b,0x49,0x8c,0xff,0x2e,0x4d,0x91,0xff,0x2f,0x4c,0x93,0xff, 0x31,0x4e,0x94,0xff,0x33,0x51,0x97,0xff,0x38,0x57,0x9e,0xff,0x3a,0x5a,0xa2, 0xff,0x3e,0x5d,0xa5,0xff,0x3f,0x60,0xa8,0xff,0x42,0x62,0xaa,0xff,0x41,0x62, 0xaa,0xff,0x43,0x63,0xac,0xff,0x25,0x23,0x1f,0xff,0x57,0x57,0x61,0xff,0x6a, 0x6a,0x78,0xff,0x62,0x61,0x6e,0xe3,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x1e, 0x00,0x00,0x00,0x0a,0x83,0xff,0xff,0xff,0x00,0x36,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x0c,0xa2,0xa1,0xa9,0xe5,0xb9,0xb9,0xc0,0xff,0x8b,0x8b,0x90,0xff, 0xae,0xae,0xb4,0xff,0xaf,0xaf,0xb4,0xff,0xac,0xac,0xb3,0xff,0xab,0xac,0xb2, 0xff,0xa9,0xa9,0xb0,0xff,0xab,0xaa,0xb0,0xff,0xae,0xaf,0xb6,0xff,0xc3,0xc3, 0xcc,0xff,0xc9,0xca,0xd4,0xff,0xd3,0xd3,0xde,0xff,0xc7,0xc8,0xd1,0xff,0xcd, 0xcd,0xd5,0xff,0xed,0xed,0xf5,0xff,0xea,0xea,0xf5,0xff,0xd9,0xd5,0xd7,0xff, 0x49,0x5d,0x8b,0xff,0x50,0x65,0x92,0xff,0x53,0x68,0x94,0xff,0x55,0x69,0x96, 0xff,0x56,0x6a,0x97,0xff,0x57,0x6a,0x97,0xff,0x58,0x6b,0x97,0xff,0x56,0x6a, 0x98,0xff,0x55,0x69,0x98,0xff,0x54,0x68,0x98,0xff,0x52,0x68,0x98,0xff,0x4f, 0x66,0x9a,0xff,0x4c,0x64,0x99,0xff,0x49,0x62,0x98,0xff,0x46,0x5f,0x96,0xff, 0x43,0x5d,0x97,0xff,0x41,0x5c,0x98,0xff,0x40,0x5b,0x98,0xff,0x3f,0x5a,0x9a, 0xff,0x3f,0x5d,0x9e,0xff,0x3e,0x5c,0xa0,0xff,0x3f,0x5e,0xa3,0xff,0x40,0x5f, 0xa6,0xff,0x40,0x60,0xa8,0xff,0x40,0x5f,0xa6,0xff,0x3f,0x5d,0xa7,0xff,0x40, 0x61,0xaa,0xff,0x3b,0x4c,0x8d,0xff,0xcb,0xc8,0xc4,0xff,0xe3,0xe3,0xee,0xff, 0xc9,0xc9,0xd4,0xf0,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x1e,0x00,0x00,0x00, 0x09,0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x2a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x03,0x3d,0x3d,0x40,0x2e,0xb3,0xb3,0xbc,0xff,0xca,0xca, 0xd4,0xff,0xc7,0xc6,0xd0,0xff,0xef,0xec,0xf0,0xff,0x6a,0x7a,0xa2,0xff,0x31, 0x49,0x7d,0xff,0x31,0x49,0x7f,0xff,0x36,0x50,0x82,0xff,0x3f,0x55,0x86,0xff, 0x40,0x55,0x87,0xff,0x45,0x59,0x89,0xff,0x46,0x5c,0x8c,0xff,0x47,0x5f,0x8f, 0xff,0x49,0x5f,0x92,0xff,0x49,0x61,0x94,0xff,0x4c,0x62,0x96,0xff,0x4c,0x62, 0x98,0xff,0x49,0x60,0x96,0xff,0x46,0x5f,0x96,0xff,0x45,0x5d,0x97,0xff,0x45, 0x5d,0x98,0xff,0x41,0x5c,0x97,0xff,0x42,0x5b,0x99,0xff,0x42,0x5e,0x9c,0xff, 0x42,0x60,0x9f,0xff,0x41,0x61,0xa1,0xff,0x42,0x60,0xa3,0xff,0x42,0x60,0xa6, 0xff,0x42,0x61,0xa7,0xff,0x42,0x60,0xa5,0xff,0x42,0x5e,0xa6,0xff,0x42,0x62, 0xa8,0xff,0x41,0x5b,0xb6,0xff,0xc2,0xbf,0xbd,0xff,0xad,0xae,0xb5,0xca,0x00, 0x00,0x00,0x36,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00, 0x8c,0xff,0xff,0xff,0x00,0x38,0x00,0x00,0x00,0x07,0x29,0x2a,0x2e,0x9e,0x38, 0x38,0x42,0xff,0x2d,0x2d,0x33,0xff,0x2a,0x2a,0x31,0xff,0x35,0x35,0x3e,0xff, 0x32,0x32,0x3a,0xff,0x31,0x31,0x39,0xff,0x2e,0x2e,0x35,0xff,0x38,0x38,0x40, 0xff,0x49,0x49,0x56,0xff,0x48,0x48,0x56,0xff,0x4a,0x4a,0x57,0xff,0x4b,0x4b, 0x58,0xff,0x4c,0x4c,0x5a,0xff,0x4c,0x4b,0x5a,0xff,0x46,0x46,0x53,0xff,0x57, 0x57,0x67,0xff,0x61,0x61,0x70,0xff,0x61,0x5f,0x6a,0xff,0x41,0x44,0x53,0xff, 0x0e,0x2a,0x67,0xff,0x0d,0x2a,0x66,0xff,0x19,0x33,0x6b,0xff,0x10,0x2c,0x6c, 0xff,0x10,0x30,0x6d,0xff,0x14,0x33,0x72,0xff,0x17,0x32,0x70,0xff,0x18,0x33, 0x71,0xff,0x18,0x34,0x74,0xff,0x1a,0x37,0x76,0xff,0x1d,0x38,0x79,0xff,0x1e, 0x3b,0x7b,0xff,0x21,0x3e,0x7e,0xff,0x23,0x40,0x81,0xff,0x24,0x42,0x85,0xff, 0x27,0x43,0x87,0xff,0x29,0x46,0x8a,0xff,0x2b,0x4a,0x8e,0xff,0x2d,0x4b,0x8e, 0xff,0x2f,0x4e,0x92,0xff,0x33,0x51,0x97,0xff,0x37,0x5a,0x9e,0xff,0x3a,0x59, 0xa1,0xff,0x3c,0x5d,0xa3,0xff,0x3f,0x60,0xa6,0xff,0x41,0x61,0xa9,0xff,0x3f, 0x5c,0xa7,0xff,0x3f,0x61,0xab,0xff,0x24,0x22,0x1c,0xff,0x58,0x57,0x63,0xff, 0x6a,0x6a,0x77,0xff,0x5f,0x5f,0x6b,0xe3,0x00,0x00,0x00,0x3f,0x00,0x00,0x00, 0x1e,0x00,0x00,0x00,0x0a,0x83,0xff,0xff,0xff,0x00,0x36,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0b,0x9b,0x9b,0xa0,0xd5,0xba,0xbb,0xc2,0xff,0x8b,0x8b,0x90, 0xff,0xab,0xab,0xb2,0xff,0xaf,0xaf,0xb6,0xff,0xac,0xac,0xb3,0xff,0xab,0xab, 0xb2,0xff,0xa9,0xa9,0xb0,0xff,0xab,0xab,0xb0,0xff,0xad,0xad,0xb4,0xff,0xc1, 0xc1,0xca,0xff,0xc8,0xc8,0xd2,0xff,0xd2,0xd2,0xdc,0xff,0xc8,0xc7,0xd2,0xff, 0xc7,0xc7,0xd1,0xff,0xed,0xed,0xf4,0xff,0xe8,0xe8,0xf4,0xff,0xe3,0xdf,0xe1, 0xff,0x47,0x59,0x86,0xff,0x4c,0x61,0x8f,0xff,0x4e,0x62,0x8f,0xff,0x4e,0x61, 0x8e,0xff,0x50,0x64,0x90,0xff,0x51,0x64,0x91,0xff,0x50,0x64,0x92,0xff,0x51, 0x65,0x94,0xff,0x50,0x65,0x94,0xff,0x4d,0x63,0x94,0xff,0x4d,0x64,0x97,0xff, 0x4c,0x63,0x99,0xff,0x49,0x61,0x98,0xff,0x46,0x5e,0x96,0xff,0x42,0x5c,0x94, 0xff,0x40,0x5a,0x95,0xff,0x3e,0x59,0x95,0xff,0x3c,0x57,0x96,0xff,0x3c,0x57, 0x97,0xff,0x3d,0x5c,0x9d,0xff,0x3d,0x5c,0x9f,0xff,0x3d,0x5b,0xa0,0xff,0x3d, 0x5e,0xa3,0xff,0x3d,0x5f,0xa5,0xff,0x3d,0x5b,0xa2,0xff,0x3d,0x5d,0xa4,0xff, 0x3f,0x5e,0xa8,0xff,0x39,0x4b,0x8e,0xff,0xc5,0xc2,0xbd,0xff,0xe4,0xe3,0xee, 0xff,0xd0,0xd0,0xda,0xf7,0x05,0x05,0x05,0x41,0x00,0x00,0x00,0x1f,0x00,0x00, 0x00,0x0a,0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x2a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x2a,0x2a,0x2c,0x1e,0xac,0xac,0xb4,0xfa,0xca, 0xc9,0xd4,0xff,0xc5,0xc4,0xce,0xff,0xeb,0xea,0xec,0xff,0x6f,0x7d,0xa3,0xff, 0x2e,0x46,0x7b,0xff,0x31,0x49,0x7a,0xff,0x34,0x4b,0x7b,0xff,0x37,0x4c,0x7e, 0xff,0x3c,0x50,0x83,0xff,0x3e,0x55,0x86,0xff,0x40,0x57,0x88,0xff,0x41,0x58, 0x8b,0xff,0x43,0x5a,0x8d,0xff,0x46,0x5d,0x91,0xff,0x47,0x5e,0x96,0xff,0x46, 0x5e,0x95,0xff,0x45,0x5c,0x94,0xff,0x42,0x5b,0x92,0xff,0x41,0x5a,0x94,0xff, 0x40,0x59,0x94,0xff,0x3e,0x57,0x93,0xff,0x3d,0x57,0x94,0xff,0x3f,0x5b,0x99, 0xff,0x41,0x5e,0x9d,0xff,0x3f,0x5e,0x9f,0xff,0x3f,0x5c,0xa1,0xff,0x3f,0x5e, 0xa3,0xff,0x3e,0x5d,0xa3,0xff,0x3f,0x5a,0x9f,0xff,0x3f,0x5e,0xa3,0xff,0x41, 0x5e,0xa6,0xff,0x3f,0x5a,0xb6,0xff,0xbb,0xba,0xb9,0xff,0xb1,0xb2,0xb7,0xd5, 0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x00,0x8c,0xff,0xff,0xff,0x00,0x15,0x00,0x00,0x00,0x07,0x25,0x25,0x2b,0x95, 0x39,0x38,0x42,0xff,0x2d,0x2d,0x35,0xff,0x2a,0x29,0x31,0xff,0x34,0x34,0x3d, 0xff,0x32,0x31,0x3b,0xff,0x31,0x31,0x39,0xff,0x2e,0x2e,0x35,0xff,0x36,0x36, 0x40,0xff,0x49,0x49,0x55,0xff,0x48,0x48,0x55,0xff,0x49,0x49,0x57,0xff,0x4b, 0x4b,0x58,0xff,0x4b,0x4b,0x5a,0xff,0x4c,0x4c,0x5a,0xff,0x46,0x46,0x54,0xff, 0x56,0x56,0x65,0xff,0x61,0x61,0x6f,0xff,0x61,0x60,0x6a,0xff,0x42,0x44,0x51, 0xff,0x82,0x0e,0x2a,0x67,0xff,0x21,0x09,0x26,0x68,0xff,0x0e,0x2b,0x6b,0xff, 0x13,0x2e,0x6c,0xff,0x14,0x2f,0x6b,0xff,0x16,0x2f,0x6c,0xff,0x16,0x31,0x71, 0xff,0x17,0x33,0x72,0xff,0x19,0x36,0x75,0xff,0x1b,0x37,0x77,0xff,0x1e,0x3b, 0x7b,0xff,0x20,0x3d,0x7d,0xff,0x22,0x3f,0x80,0xff,0x24,0x41,0x83,0xff,0x27, 0x42,0x85,0xff,0x29,0x45,0x88,0xff,0x2a,0x47,0x8b,0xff,0x2c,0x49,0x8d,0xff, 0x30,0x4d,0x93,0xff,0x34,0x53,0x9a,0xff,0x36,0x57,0x9d,0xff,0x38,0x58,0xa0, 0xff,0x3b,0x5a,0xa1,0xff,0x3c,0x5e,0xa4,0xff,0x3c,0x5d,0xa5,0xff,0x3e,0x5d, 0xa5,0xff,0x40,0x60,0xa8,0xff,0x24,0x21,0x1a,0xff,0x58,0x58,0x64,0xff,0x6a, 0x6a,0x77,0xff,0x5b,0x5b,0x67,0xe1,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x1e, 0x00,0x00,0x00,0x0a,0x83,0xff,0xff,0xff,0x00,0x36,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0a,0x93,0x93,0x98,0xc4,0xbb,0xbb,0xc2,0xff,0x8e,0x8e,0x92,0xff, 0xa9,0xa9,0xaf,0xff,0xae,0xae,0xb5,0xff,0xab,0xab,0xb2,0xff,0xac,0xac,0xb3, 0xff,0xa9,0xa9,0xaf,0xff,0xab,0xab,0xb1,0xff,0xac,0xac,0xb3,0xff,0xbd,0xbd, 0xc6,0xff,0xc6,0xc6,0xd0,0xff,0xd0,0xd0,0xda,0xff,0xc8,0xc7,0xd2,0xff,0xc4, 0xc4,0xce,0xff,0xeb,0xeb,0xf2,0xff,0xe7,0xe6,0xf1,0xff,0xe9,0xe6,0xe8,0xff, 0x46,0x56,0x80,0xff,0x44,0x59,0x89,0xff,0x46,0x5a,0x88,0xff,0x47,0x5b,0x89, 0xff,0x48,0x5c,0x8a,0xff,0x49,0x5d,0x8c,0xff,0x4a,0x5e,0x8d,0xff,0x49,0x5e, 0x8d,0xff,0x49,0x5e,0x8f,0xff,0x49,0x60,0x92,0xff,0x48,0x5f,0x94,0xff,0x46, 0x5e,0x94,0xff,0x42,0x5b,0x92,0xff,0x40,0x58,0x90,0xff,0x3e,0x58,0x90,0xff, 0x3c,0x57,0x91,0xff,0x3b,0x56,0x92,0xff,0x3a,0x55,0x93,0xff,0x38,0x54,0x94, 0xff,0x39,0x56,0x97,0xff,0x3a,0x59,0x9c,0xff,0x3b,0x5b,0x9e,0xff,0x3b,0x5c, 0xa1,0xff,0x3b,0x59,0xa0,0xff,0x3a,0x58,0xa0,0xff,0x3c,0x5b,0xa2,0xff,0x3d, 0x5c,0xa6,0xff,0x38,0x4c,0x93,0xff,0xc2,0xbe,0xb9,0xff,0xe5,0xe5,0xee,0xff, 0xd3,0xd3,0xdd,0xfd,0x19,0x18,0x1a,0x4a,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x0a,0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x2a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x0c,0x0c,0x0d,0x11,0xa4,0xa4,0xad,0xef,0xc8,0xc8, 0xd2,0xff,0xc3,0xc3,0xcd,0xff,0xe7,0xe5,0xea,0xff,0x73,0x81,0xa4,0xff,0x29, 0x41,0x76,0xff,0x2b,0x42,0x76,0xff,0x2e,0x45,0x78,0xff,0x31,0x47,0x7b,0xff, 0x35,0x4b,0x7f,0xff,0x38,0x4e,0x81,0xff,0x3c,0x51,0x83,0xff,0x3d,0x54,0x87, 0xff,0x3d,0x55,0x8b,0xff,0x40,0x58,0x8f,0xff,0x41,0x59,0x91,0xff,0x40,0x57, 0x8f,0xff,0x3f,0x56,0x8e,0xff,0x3e,0x56,0x8f,0xff,0x3d,0x57,0x90,0xff,0x3b, 0x56,0x91,0xff,0x3a,0x53,0x90,0xff,0x3a,0x53,0x92,0xff,0x3a,0x56,0x94,0xff, 0x3c,0x57,0x97,0xff,0x3d,0x5b,0x9d,0xff,0x3d,0x5c,0x9e,0xff,0x3c,0x5c,0xa0, 0xff,0x3c,0x59,0xa0,0xff,0x3b,0x57,0x9e,0xff,0x3d,0x5c,0xa1,0xff,0x3f,0x5e, 0xa5,0xff,0x3d,0x58,0xb6,0xff,0xb1,0xaf,0xb3,0xff,0xbe,0xbd,0xc3,0xe0,0x00, 0x00,0x00,0x3a,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x8c,0xff,0xff,0xff,0x00,0x0a,0x00,0x00,0x00,0x06,0x23,0x23,0x29,0x8a,0x37, 0x39,0x42,0xff,0x2e,0x2e,0x35,0xff,0x2a,0x29,0x30,0xff,0x34,0x34,0x3d,0xff, 0x32,0x32,0x3a,0xff,0x31,0x31,0x39,0xff,0x2e,0x2e,0x36,0xff,0x35,0x35,0x3f, 0xff,0x82,0x48,0x48,0x55,0xff,0x09,0x49,0x49,0x56,0xff,0x4a,0x4a,0x57,0xff, 0x4b,0x4b,0x59,0xff,0x4c,0x4b,0x59,0xff,0x46,0x46,0x53,0xff,0x55,0x55,0x64, 0xff,0x60,0x61,0x6e,0xff,0x61,0x60,0x69,0xff,0x43,0x44,0x51,0xff,0x83,0x0e, 0x2a,0x67,0xff,0x20,0x10,0x2b,0x65,0xff,0x11,0x2b,0x66,0xff,0x13,0x2b,0x68, 0xff,0x15,0x2f,0x6c,0xff,0x16,0x31,0x6e,0xff,0x17,0x33,0x70,0xff,0x1a,0x36, 0x73,0xff,0x1b,0x37,0x77,0xff,0x1f,0x3c,0x7d,0xff,0x21,0x3e,0x82,0xff,0x22, 0x3f,0x80,0xff,0x23,0x40,0x81,0xff,0x25,0x41,0x83,0xff,0x27,0x43,0x86,0xff, 0x2a,0x46,0x89,0xff,0x2b,0x47,0x8e,0xff,0x2f,0x4c,0x90,0xff,0x34,0x55,0x99, 0xff,0x35,0x54,0x9b,0xff,0x37,0x56,0x9d,0xff,0x3a,0x59,0xa0,0xff,0x3c,0x5c, 0xa5,0xff,0x3b,0x5a,0xa1,0xff,0x3d,0x5c,0xa4,0xff,0x3f,0x5d,0xa7,0xff,0x24, 0x21,0x19,0xff,0x58,0x58,0x65,0xff,0x69,0x69,0x76,0xff,0x5b,0x5b,0x66,0xe0, 0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x0a,0x83,0xff,0xff, 0xff,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x89,0x89,0x90,0xb0, 0xbc,0xbc,0xc4,0xff,0x8f,0x90,0x95,0xff,0xa4,0xa4,0xaa,0xff,0xae,0xae,0xb5, 0xff,0xac,0xac,0xb3,0xff,0xab,0xab,0xb1,0xff,0xaa,0xa9,0xb0,0xff,0x82,0xab, 0xab,0xb2,0xff,0x0b,0xbb,0xbb,0xc4,0xff,0xc5,0xc5,0xce,0xff,0xce,0xce,0xd8, 0xff,0xc8,0xc9,0xd2,0xff,0xc0,0xc2,0xcb,0xff,0xe8,0xe8,0xf0,0xff,0xe5,0xe5, 0xf0,0xff,0xed,0xeb,0xef,0xff,0x47,0x55,0x7b,0xff,0x3e,0x52,0x83,0xff,0x3f, 0x54,0x84,0xff,0x82,0x40,0x55,0x85,0xff,0x1d,0x42,0x56,0x86,0xff,0x43,0x57, 0x88,0xff,0x42,0x57,0x89,0xff,0x42,0x59,0x8d,0xff,0x43,0x59,0x8f,0xff,0x42, 0x59,0x8f,0xff,0x3f,0x57,0x8d,0xff,0x3c,0x55,0x8c,0xff,0x3a,0x53,0x8d,0xff, 0x39,0x54,0x8e,0xff,0x39,0x53,0x8f,0xff,0x37,0x52,0x8f,0xff,0x36,0x51,0x90, 0xff,0x35,0x52,0x91,0xff,0x36,0x52,0x93,0xff,0x37,0x54,0x97,0xff,0x38,0x58, 0x9c,0xff,0x3a,0x5a,0x9e,0xff,0x38,0x55,0x9c,0xff,0x39,0x56,0x9e,0xff,0x39, 0x58,0xa0,0xff,0x3c,0x5b,0xa4,0xff,0x37,0x4b,0x95,0xff,0xbd,0xba,0xb4,0xff, 0xe5,0xe5,0xef,0xff,0xd5,0xd5,0xdf,0xff,0x2a,0x2a,0x2c,0x53,0x00,0x00,0x00, 0x22,0x00,0x00,0x00,0x0b,0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00, 0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0c,0x9c,0x9c, 0xa4,0xe1,0xc5,0xc5,0xd0,0xff,0xc1,0xc1,0xcb,0xff,0xe3,0xe2,0xe6,0xff,0x7d, 0x87,0xa7,0xff,0x26,0x3d,0x72,0xff,0x28,0x3f,0x73,0xff,0x2a,0x41,0x75,0xff, 0x2c,0x43,0x77,0xff,0x2e,0x45,0x7a,0xff,0x33,0x49,0x7c,0xff,0x35,0x4c,0x80, 0xff,0x36,0x4e,0x85,0xff,0x3a,0x51,0x89,0xff,0x3a,0x52,0x8a,0xff,0x82,0x39, 0x52,0x89,0xff,0x16,0x39,0x51,0x8a,0xff,0x38,0x53,0x8a,0xff,0x39,0x53,0x8c, 0xff,0x39,0x52,0x8d,0xff,0x37,0x50,0x8f,0xff,0x36,0x51,0x8f,0xff,0x36,0x51, 0x91,0xff,0x37,0x51,0x93,0xff,0x39,0x57,0x98,0xff,0x3a,0x59,0x9b,0xff,0x3a, 0x57,0x9c,0xff,0x39,0x55,0x9c,0xff,0x3a,0x58,0x9e,0xff,0x3b,0x57,0x9f,0xff, 0x3d,0x5b,0xa3,0xff,0x3c,0x58,0xb5,0xff,0xaa,0xaa,0xb0,0xff,0xc3,0xc2,0xc6, 0xe8,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x08,0x00,0x00, 0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x06,0x00,0x00,0x00,0x06,0x27,0x28,0x2e, 0x84,0x37,0x36,0x41,0xff,0x2e,0x2e,0x36,0xff,0x29,0x29,0x30,0xff,0x34,0x34, 0x3d,0xff,0x82,0x31,0x31,0x39,0xff,0x02,0x2e,0x2d,0x36,0xff,0x37,0x37,0x3f, 0xff,0x82,0x47,0x47,0x54,0xff,0x20,0x48,0x48,0x56,0xff,0x49,0x49,0x57,0xff, 0x4b,0x4b,0x58,0xff,0x4b,0x4b,0x59,0xff,0x45,0x45,0x51,0xff,0x53,0x54,0x63, 0xff,0x5f,0x60,0x6e,0xff,0x62,0x60,0x69,0xff,0x44,0x44,0x4f,0xff,0x0e,0x2a, 0x67,0xff,0x0e,0x29,0x65,0xff,0x0d,0x27,0x62,0xff,0x0e,0x28,0x63,0xff,0x0f, 0x2a,0x65,0xff,0x12,0x2b,0x67,0xff,0x14,0x2f,0x6b,0xff,0x15,0x30,0x6d,0xff, 0x16,0x32,0x6f,0xff,0x18,0x34,0x73,0xff,0x1c,0x38,0x7a,0xff,0x1f,0x3b,0x7d, 0xff,0x20,0x3c,0x7e,0xff,0x20,0x3d,0x7e,0xff,0x21,0x3e,0x80,0xff,0x24,0x41, 0x82,0xff,0x25,0x42,0x85,0xff,0x28,0x45,0x88,0xff,0x2a,0x46,0x8a,0xff,0x2d, 0x4b,0x8e,0xff,0x32,0x50,0x98,0xff,0x33,0x53,0x9c,0xff,0x37,0x57,0x9c,0xff, 0x82,0x38,0x57,0x9e,0xff,0x0a,0x39,0x58,0x9f,0xff,0x3c,0x5b,0xa2,0xff,0x3e, 0x5c,0xa6,0xff,0x25,0x23,0x1a,0xff,0x5a,0x59,0x67,0xff,0x68,0x68,0x75,0xff, 0x5b,0x5b,0x66,0xdf,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x1e,0x00,0x00,0x00, 0x09,0x83,0xff,0xff,0xff,0x00,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08, 0x80,0x80,0x85,0x9d,0xbd,0xbd,0xc4,0xff,0x91,0x91,0x97,0xff,0x9f,0xa1,0xa5, 0xff,0xaf,0xaf,0xb6,0xff,0xac,0xac,0xb2,0xff,0xab,0xab,0xb2,0xff,0xaa,0xaa, 0xb0,0xff,0xac,0xab,0xb2,0xff,0xaa,0xaa,0xb2,0xff,0xb8,0xb8,0xc1,0xff,0xc3, 0xc3,0xce,0xff,0xcc,0xcd,0xd6,0xff,0xc9,0xc9,0xd3,0xff,0xbd,0xbd,0xc7,0xff, 0xe5,0xe6,0xed,0xff,0xe5,0xe5,0xf0,0xff,0xf0,0xef,0xf4,0xff,0x4e,0x59,0x79, 0xff,0x38,0x4d,0x7f,0xff,0x39,0x4e,0x80,0xff,0x83,0x3a,0x4f,0x80,0xff,0x1c, 0x3a,0x50,0x83,0xff,0x3c,0x54,0x87,0xff,0x3c,0x55,0x8a,0xff,0x3c,0x54,0x8b, 0xff,0x3a,0x51,0x88,0xff,0x39,0x51,0x88,0xff,0x37,0x50,0x88,0xff,0x36,0x50, 0x89,0xff,0x35,0x4f,0x8a,0xff,0x34,0x4f,0x8b,0xff,0x33,0x4f,0x8d,0xff,0x34, 0x4f,0x8e,0xff,0x33,0x4e,0x8f,0xff,0x33,0x50,0x90,0xff,0x33,0x50,0x92,0xff, 0x35,0x52,0x95,0xff,0x35,0x52,0x98,0xff,0x35,0x52,0x9a,0xff,0x37,0x54,0x9d, 0xff,0x38,0x56,0x9e,0xff,0x3b,0x59,0xa2,0xff,0x36,0x4c,0x97,0xff,0xb8,0xb4, 0xaf,0xff,0xe6,0xe6,0xf1,0xff,0xd6,0xd6,0xe0,0xff,0x37,0x37,0x3a,0x5c,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x0c,0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff, 0xff,0x00,0x82,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x0b,0x94,0x93,0x9b, 0xd3,0xc3,0xc3,0xcd,0xff,0xc0,0xc2,0xca,0xff,0xde,0xdd,0xe2,0xff,0x86,0x90, 0xab,0xff,0x23,0x3b,0x71,0xff,0x24,0x3b,0x71,0xff,0x26,0x3d,0x72,0xff,0x28, 0x3f,0x73,0xff,0x2a,0x41,0x74,0xff,0x2c,0x44,0x79,0xff,0x2e,0x47,0x7f,0xff, 0x31,0x4a,0x84,0xff,0x34,0x4c,0x84,0xff,0x33,0x4c,0x82,0xff,0x33,0x4c,0x83, 0xff,0x32,0x4c,0x85,0xff,0x33,0x4d,0x86,0xff,0x34,0x4d,0x87,0xff,0x34,0x4e, 0x88,0xff,0x34,0x4e,0x8b,0xff,0x34,0x4d,0x8b,0xff,0x33,0x4e,0x8c,0xff,0x33, 0x50,0x91,0xff,0x33,0x4f,0x90,0xff,0x33,0x4f,0x94,0xff,0x36,0x54,0x96,0xff, 0x37,0x52,0x97,0xff,0x37,0x52,0x99,0xff,0x38,0x55,0x9c,0xff,0x3a,0x57,0x9e, 0xff,0x3d,0x59,0xa2,0xff,0x3d,0x59,0xb4,0xff,0xa0,0x9f,0xaa,0xff,0xcb,0xc9, 0xcd,0xf0,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x15,0x00,0x00,0x00,0x06,0x26,0x26, 0x2d,0x7d,0x36,0x36,0x3f,0xff,0x2e,0x2e,0x36,0xff,0x28,0x28,0x2f,0xff,0x34, 0x34,0x3d,0xff,0x32,0x32,0x3a,0xff,0x30,0x30,0x38,0xff,0x2e,0x2e,0x36,0xff, 0x35,0x34,0x3e,0xff,0x46,0x46,0x54,0xff,0x47,0x47,0x53,0xff,0x48,0x48,0x55, 0xff,0x49,0x49,0x57,0xff,0x4b,0x4a,0x58,0xff,0x4a,0x4a,0x57,0xff,0x45,0x45, 0x52,0xff,0x52,0x52,0x62,0xff,0x5e,0x5e,0x6d,0xff,0x61,0x5f,0x68,0xff,0x44, 0x45,0x4e,0xff,0x84,0x0d,0x27,0x62,0xff,0x07,0x0f,0x29,0x64,0xff,0x11,0x2b, 0x67,0xff,0x11,0x2c,0x69,0xff,0x14,0x2e,0x6c,0xff,0x15,0x31,0x70,0xff,0x19, 0x35,0x76,0xff,0x1c,0x37,0x79,0xff,0x82,0x1d,0x39,0x79,0xff,0x16,0x1f,0x3c, 0x7b,0xff,0x20,0x3f,0x7d,0xff,0x23,0x40,0x80,0xff,0x24,0x41,0x83,0xff,0x26, 0x43,0x86,0xff,0x29,0x45,0x88,0xff,0x2c,0x48,0x8c,0xff,0x2f,0x4c,0x92,0xff, 0x33,0x51,0x97,0xff,0x36,0x57,0x9b,0xff,0x37,0x59,0x9f,0xff,0x36,0x51,0x9a, 0xff,0x38,0x57,0x9e,0xff,0x3b,0x5a,0xa1,0xff,0x3c,0x5c,0xa4,0xff,0x26,0x24, 0x1d,0xff,0x5a,0x59,0x67,0xff,0x67,0x67,0x74,0xff,0x57,0x57,0x62,0xdd,0x00, 0x00,0x00,0x3e,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x09,0x83,0xff,0xff,0xff, 0x00,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x79,0x79,0x7e,0x88,0xbc, 0xbc,0xc2,0xff,0x95,0x95,0x9b,0xff,0x9d,0x9d,0xa3,0xff,0xaf,0xaf,0xb6,0xff, 0xac,0xac,0xb2,0xff,0xab,0xab,0xb2,0xff,0xab,0xab,0xb1,0xff,0xac,0xac,0xb2, 0xff,0xab,0xab,0xb2,0xff,0xb5,0xb5,0xbe,0xff,0xc1,0xc1,0xcb,0xff,0xcb,0xcb, 0xd5,0xff,0xc9,0xc9,0xd3,0xff,0xbb,0xbb,0xc4,0xff,0xe3,0xe3,0xeb,0xff,0xe6, 0xe6,0xf0,0xff,0xf2,0xf1,0xf6,0xff,0x58,0x5f,0x7a,0xff,0x31,0x47,0x7b,0xff, 0x33,0x49,0x7c,0xff,0x82,0x34,0x4a,0x7d,0xff,0x04,0x34,0x4b,0x7e,0xff,0x35, 0x4c,0x81,0xff,0x35,0x4d,0x83,0xff,0x35,0x4e,0x84,0xff,0x82,0x34,0x4c,0x82, 0xff,0x19,0x33,0x4d,0x84,0xff,0x32,0x4b,0x84,0xff,0x31,0x4c,0x85,0xff,0x30, 0x4b,0x86,0xff,0x31,0x4c,0x88,0xff,0x30,0x4c,0x89,0xff,0x2f,0x4b,0x8b,0xff, 0x30,0x4c,0x8d,0xff,0x30,0x4c,0x8e,0xff,0x31,0x4e,0x91,0xff,0x32,0x4e,0x93, 0xff,0x34,0x50,0x96,0xff,0x33,0x51,0x98,0xff,0x35,0x52,0x9a,0xff,0x37,0x54, 0x9d,0xff,0x39,0x57,0xa0,0xff,0x36,0x4c,0x99,0xff,0xb4,0xb2,0xab,0xff,0xe6, 0xe6,0xf1,0xff,0xd7,0xd7,0xe1,0xff,0x45,0x45,0x48,0x66,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x8b,0xff,0xff, 0xff,0x00,0x82,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x0a,0x8a,0x8a,0x92, 0xc5,0xc1,0xc1,0xca,0xff,0xc1,0xc1,0xcb,0xff,0xd8,0xd7,0xde,0xff,0x94,0x9b, 0xb3,0xff,0x21,0x39,0x71,0xff,0x21,0x39,0x6f,0xff,0x22,0x3a,0x70,0xff,0x24, 0x3b,0x71,0xff,0x26,0x3d,0x72,0xff,0x27,0x41,0x77,0xff,0x29,0x43,0x7e,0xff, 0x2c,0x46,0x7e,0xff,0x2e,0x46,0x7d,0xff,0x2e,0x46,0x7e,0xff,0x2d,0x46,0x80, 0xff,0x2e,0x4a,0x82,0xff,0x2e,0x48,0x84,0xff,0x30,0x49,0x85,0xff,0x2f,0x4a, 0x85,0xff,0x31,0x4b,0x88,0xff,0x30,0x4a,0x89,0xff,0x30,0x4b,0x8a,0xff,0x31, 0x4d,0x8d,0xff,0x32,0x4e,0x8f,0xff,0x33,0x4f,0x93,0xff,0x36,0x50,0x93,0xff, 0x39,0x53,0x96,0xff,0x39,0x56,0x9b,0xff,0x39,0x58,0x9b,0xff,0x38,0x55,0x9c, 0xff,0x3a,0x58,0xa0,0xff,0x39,0x57,0xb2,0xff,0x97,0x99,0xa9,0xff,0xce,0xcc, 0xd0,0xf4,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x15,0x00,0x00,0x00,0x05,0x21,0x22, 0x27,0x76,0x37,0x36,0x3f,0xff,0x2e,0x2e,0x36,0xff,0x28,0x28,0x2f,0xff,0x34, 0x34,0x3c,0xff,0x31,0x31,0x3a,0xff,0x31,0x31,0x38,0xff,0x2d,0x2e,0x36,0xff, 0x34,0x34,0x3d,0xff,0x46,0x46,0x53,0xff,0x46,0x47,0x53,0xff,0x47,0x48,0x54, 0xff,0x48,0x48,0x56,0xff,0x4a,0x4a,0x57,0xff,0x49,0x49,0x56,0xff,0x44,0x45, 0x51,0xff,0x52,0x51,0x61,0xff,0x5e,0x5e,0x6d,0xff,0x5f,0x5f,0x68,0xff,0x43, 0x44,0x4d,0xff,0x84,0x0d,0x27,0x62,0xff,0x1f,0x0e,0x28,0x63,0xff,0x0f,0x29, 0x64,0xff,0x10,0x2b,0x68,0xff,0x14,0x2f,0x6d,0xff,0x15,0x32,0x71,0xff,0x18, 0x33,0x74,0xff,0x1a,0x35,0x75,0xff,0x1b,0x37,0x74,0xff,0x1b,0x37,0x77,0xff, 0x1d,0x3a,0x79,0xff,0x1f,0x3c,0x7b,0xff,0x21,0x3e,0x7e,0xff,0x23,0x40,0x81, 0xff,0x25,0x42,0x84,0xff,0x28,0x44,0x87,0xff,0x2a,0x47,0x8a,0xff,0x2c,0x4a, 0x8d,0xff,0x2f,0x4d,0x90,0xff,0x33,0x50,0x97,0xff,0x34,0x51,0x97,0xff,0x35, 0x52,0x99,0xff,0x37,0x55,0x9c,0xff,0x39,0x58,0x9f,0xff,0x3c,0x5b,0xa3,0xff, 0x28,0x25,0x1d,0xff,0x5a,0x5a,0x68,0xff,0x66,0x66,0x73,0xff,0x55,0x54,0x5f, 0xdb,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x09,0x83,0xff, 0xff,0xff,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x72,0x72,0x77, 0x72,0xba,0xba,0xc1,0xff,0x99,0x99,0x9f,0xff,0x98,0x97,0x9d,0xff,0xaf,0xb1, 0xb7,0xff,0x82,0xab,0xac,0xb2,0xff,0x10,0xab,0xab,0xb1,0xff,0xab,0xab,0xb2, 0xff,0xaa,0xaa,0xb0,0xff,0xb3,0xb3,0xbc,0xff,0xbf,0xbf,0xc9,0xff,0xc9,0xc9, 0xd3,0xff,0xca,0xca,0xd4,0xff,0xb9,0xb9,0xc2,0xff,0xdf,0xde,0xe7,0xff,0xe6, 0xe6,0xf0,0xff,0xf2,0xf2,0xf9,0xff,0x63,0x6a,0x7e,0xff,0x2c,0x43,0x78,0xff, 0x2d,0x44,0x78,0xff,0x2e,0x45,0x79,0xff,0x2f,0x46,0x7b,0xff,0x82,0x2e,0x47, 0x7d,0xff,0x1d,0x2f,0x47,0x7e,0xff,0x2e,0x46,0x7d,0xff,0x2e,0x46,0x7c,0xff, 0x2f,0x47,0x7e,0xff,0x2e,0x47,0x7f,0xff,0x2e,0x47,0x81,0xff,0x2e,0x47,0x83, 0xff,0x2c,0x48,0x83,0xff,0x2d,0x48,0x85,0xff,0x2e,0x4a,0x8a,0xff,0x2e,0x4b, 0x89,0xff,0x2d,0x49,0x8a,0xff,0x2f,0x4b,0x8c,0xff,0x2f,0x4b,0x8e,0xff,0x30, 0x4d,0x91,0xff,0x31,0x4f,0x93,0xff,0x33,0x50,0x96,0xff,0x33,0x51,0x98,0xff, 0x35,0x52,0x9b,0xff,0x38,0x55,0x9e,0xff,0x34,0x4d,0x9c,0xff,0xb3,0xb1,0xaa, 0xff,0xe6,0xe6,0xf1,0xff,0xd7,0xd7,0xe1,0xff,0x51,0x50,0x55,0x70,0x00,0x00, 0x00,0x26,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x8b, 0xff,0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x09,0x7c, 0x7c,0x82,0xb6,0xbf,0xbf,0xc9,0xff,0xbf,0xbf,0xca,0xff,0xd3,0xd3,0xd9,0xff, 0xa2,0xa8,0xbb,0xff,0x22,0x39,0x73,0xff,0x1d,0x35,0x6c,0xff,0x1f,0x37,0x6d, 0xff,0x21,0x3a,0x70,0xff,0x22,0x3b,0x73,0xff,0x22,0x3c,0x75,0xff,0x25,0x3d, 0x78,0xff,0x27,0x40,0x77,0xff,0x28,0x40,0x77,0xff,0x28,0x40,0x79,0xff,0x28, 0x42,0x7c,0xff,0x29,0x45,0x80,0xff,0x29,0x46,0x7f,0xff,0x2b,0x46,0x81,0xff, 0x2c,0x47,0x82,0xff,0x2d,0x48,0x86,0xff,0x2e,0x4a,0x8a,0xff,0x2e,0x49,0x89, 0xff,0x30,0x4a,0x8a,0xff,0x2f,0x4c,0x8d,0xff,0x2f,0x4b,0x8e,0xff,0x2f,0x4c, 0x90,0xff,0x2f,0x4d,0x92,0xff,0x2e,0x4d,0x94,0xff,0x32,0x51,0x98,0xff,0x34, 0x53,0x9b,0xff,0x2f,0x50,0x9d,0xff,0x2c,0x4c,0xae,0xff,0x8a,0x8d,0xa3,0xff, 0xd4,0xd2,0xd5,0xfa,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x0a,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x15,0x00,0x00,0x00,0x05, 0x21,0x21,0x28,0x6a,0x36,0x36,0x3f,0xff,0x2f,0x2f,0x37,0xff,0x28,0x28,0x2e, 0xff,0x34,0x34,0x3c,0xff,0x31,0x31,0x3a,0xff,0x30,0x31,0x39,0xff,0x2e,0x2e, 0x36,0xff,0x34,0x33,0x3d,0xff,0x45,0x45,0x52,0xff,0x46,0x46,0x52,0xff,0x47, 0x47,0x54,0xff,0x48,0x48,0x55,0xff,0x49,0x49,0x57,0xff,0x49,0x49,0x56,0xff, 0x44,0x44,0x51,0xff,0x51,0x51,0x5f,0xff,0x5e,0x5e,0x6c,0xff,0x61,0x5f,0x68, 0xff,0x45,0x44,0x4c,0xff,0x85,0x0d,0x27,0x62,0xff,0x1e,0x0e,0x28,0x62,0xff, 0x11,0x2c,0x69,0xff,0x12,0x2f,0x70,0xff,0x14,0x30,0x70,0xff,0x17,0x32,0x70, 0xff,0x17,0x33,0x70,0xff,0x19,0x35,0x72,0xff,0x1c,0x38,0x75,0xff,0x1c,0x39, 0x78,0xff,0x1e,0x3a,0x7a,0xff,0x20,0x3d,0x7d,0xff,0x22,0x3f,0x80,0xff,0x24, 0x41,0x83,0xff,0x28,0x43,0x86,0xff,0x29,0x46,0x89,0xff,0x2b,0x47,0x8c,0xff, 0x2d,0x4a,0x90,0xff,0x30,0x4d,0x93,0xff,0x32,0x4f,0x95,0xff,0x33,0x53,0x98, 0xff,0x36,0x54,0x9b,0xff,0x39,0x55,0x9e,0xff,0x3a,0x59,0xa1,0xff,0x27,0x24, 0x1d,0xff,0x5b,0x5a,0x68,0xff,0x67,0x67,0x74,0xff,0x4e,0x4e,0x58,0xd9,0x00, 0x00,0x00,0x3d,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x09,0x83,0xff,0xff,0xff, 0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x69,0x69,0x6d,0x5e,0xb9, 0xb8,0xbf,0xff,0x9e,0x9e,0xa2,0xff,0x94,0x94,0x9a,0xff,0xaf,0xaf,0xb7,0xff, 0xac,0xac,0xb2,0xff,0xab,0xab,0xb2,0xff,0x82,0xab,0xab,0xb1,0xff,0x0d,0xaa, 0xaa,0xb0,0xff,0xb0,0xb0,0xb8,0xff,0xbd,0xbd,0xc7,0xff,0xc7,0xc7,0xd1,0xff, 0xca,0xca,0xd4,0xff,0xb7,0xb7,0xc0,0xff,0xdb,0xdb,0xe4,0xff,0xe8,0xe7,0xf1, 0xff,0xf0,0xf0,0xf8,0xff,0x72,0x76,0x83,0xff,0x27,0x3e,0x75,0xff,0x29,0x40, 0x75,0xff,0x29,0x41,0x78,0xff,0x83,0x29,0x43,0x7a,0xff,0x82,0x28,0x40,0x76, 0xff,0x1b,0x29,0x41,0x79,0xff,0x29,0x41,0x7a,0xff,0x29,0x42,0x7b,0xff,0x28, 0x43,0x7d,0xff,0x28,0x43,0x7f,0xff,0x28,0x44,0x80,0xff,0x29,0x46,0x83,0xff, 0x2c,0x49,0x89,0xff,0x2c,0x48,0x8a,0xff,0x2b,0x48,0x88,0xff,0x2b,0x47,0x89, 0xff,0x2c,0x49,0x8c,0xff,0x2e,0x4c,0x8e,0xff,0x2e,0x4b,0x91,0xff,0x2c,0x48, 0x91,0xff,0x29,0x47,0x92,0xff,0x2f,0x4d,0x99,0xff,0x32,0x50,0x9c,0xff,0x36, 0x4f,0xa3,0xff,0xad,0xab,0xa5,0xff,0xe8,0xe7,0xf2,0xff,0xd8,0xd8,0xe2,0xff, 0x5f,0x5f,0x63,0x7c,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x0f,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00, 0x28,0x00,0x00,0x00,0x08,0x73,0x73,0x78,0xa3,0xbc,0xbc,0xc5,0xff,0xc0,0xbf, 0xcb,0xff,0xce,0xce,0xd5,0xff,0xaf,0xb4,0xc3,0xff,0x20,0x38,0x72,0xff,0x1b, 0x33,0x6b,0xff,0x1c,0x35,0x6e,0xff,0x1d,0x37,0x71,0xff,0x1d,0x37,0x72,0xff, 0x1d,0x39,0x72,0xff,0x1f,0x38,0x70,0xff,0x22,0x3b,0x73,0xff,0x22,0x3c,0x74, 0xff,0x24,0x3e,0x75,0xff,0x23,0x3f,0x78,0xff,0x25,0x3f,0x7a,0xff,0x26,0x40, 0x7b,0xff,0x28,0x42,0x7e,0xff,0x2b,0x48,0x82,0xff,0x2e,0x4a,0x88,0xff,0x32, 0x4c,0x8c,0xff,0x2f,0x4b,0x8a,0xff,0x2a,0x45,0x86,0xff,0x25,0x42,0x86,0xff, 0x1f,0x3e,0x83,0xff,0x18,0x37,0x83,0xff,0x0f,0x31,0x81,0xff,0x0d,0x30,0x83, 0xff,0x1b,0x3d,0x8c,0xff,0x33,0x52,0x9b,0xff,0x3e,0x59,0x9d,0xff,0x45,0x60, 0xae,0xff,0x7b,0x80,0x9f,0xff,0xd7,0xd5,0xd8,0xfe,0x00,0x00,0x00,0x42,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff, 0x00,0x15,0x00,0x00,0x00,0x05,0x27,0x27,0x2d,0x65,0x35,0x35,0x3e,0xff,0x30, 0x2f,0x38,0xff,0x28,0x28,0x2e,0xff,0x32,0x34,0x3c,0xff,0x31,0x31,0x3a,0xff, 0x30,0x31,0x39,0xff,0x2e,0x2e,0x37,0xff,0x34,0x33,0x3d,0xff,0x45,0x45,0x51, 0xff,0x45,0x45,0x52,0xff,0x47,0x47,0x53,0xff,0x48,0x48,0x55,0xff,0x49,0x49, 0x57,0xff,0x49,0x49,0x56,0xff,0x44,0x43,0x50,0xff,0x50,0x50,0x5e,0xff,0x5d, 0x5d,0x6b,0xff,0x60,0x5e,0x68,0xff,0x45,0x44,0x4b,0xff,0x84,0x0d,0x27,0x62, 0xff,0x1f,0x0d,0x27,0x63,0xff,0x0e,0x29,0x66,0xff,0x0e,0x2b,0x6a,0xff,0x11, 0x2f,0x6c,0xff,0x13,0x2f,0x6c,0xff,0x15,0x2f,0x6c,0xff,0x16,0x32,0x6f,0xff, 0x16,0x33,0x72,0xff,0x19,0x36,0x75,0xff,0x1c,0x37,0x77,0xff,0x1e,0x39,0x7a, 0xff,0x1f,0x3b,0x7c,0xff,0x21,0x3e,0x7f,0xff,0x23,0x40,0x82,0xff,0x26,0x43, 0x85,0xff,0x28,0x44,0x87,0xff,0x2a,0x47,0x8a,0xff,0x2c,0x49,0x8f,0xff,0x2d, 0x4b,0x91,0xff,0x30,0x4e,0x94,0xff,0x33,0x50,0x96,0xff,0x35,0x52,0x99,0xff, 0x37,0x55,0x9c,0xff,0x3a,0x57,0x9f,0xff,0x2a,0x28,0x20,0xff,0x5b,0x5b,0x69, 0xff,0x66,0x66,0x73,0xff,0x51,0x51,0x5a,0xd8,0x00,0x00,0x00,0x3d,0x00,0x00, 0x00,0x1d,0x00,0x00,0x00,0x09,0x83,0xff,0xff,0xff,0x00,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x04,0x5e,0x60,0x62,0x4a,0xb5,0xb5,0xbc,0xff,0xa2,0xa2, 0xa8,0xff,0x92,0x92,0x96,0xff,0xb0,0xb0,0xb7,0xff,0x82,0xab,0xab,0xb2,0xff, 0x0e,0xab,0xab,0xb1,0xff,0xaa,0xab,0xb1,0xff,0xab,0xab,0xb2,0xff,0xad,0xad, 0xb6,0xff,0xbc,0xbc,0xc5,0xff,0xc5,0xc5,0xcf,0xff,0xca,0xca,0xd4,0xff,0xb5, 0xb5,0xbe,0xff,0xd8,0xd8,0xe1,0xff,0xeb,0xea,0xf4,0xff,0xef,0xed,0xf7,0xff, 0x84,0x86,0x8b,0xff,0x25,0x3c,0x77,0xff,0x24,0x3c,0x74,0xff,0x83,0x25,0x3f, 0x77,0xff,0x1e,0x23,0x3b,0x73,0xff,0x22,0x3a,0x71,0xff,0x23,0x3b,0x73,0xff, 0x25,0x3c,0x75,0xff,0x25,0x3d,0x76,0xff,0x25,0x3d,0x77,0xff,0x25,0x3f,0x7a, 0xff,0x25,0x40,0x7b,0xff,0x26,0x41,0x7e,0xff,0x28,0x43,0x82,0xff,0x29,0x46, 0x86,0xff,0x29,0x46,0x87,0xff,0x25,0x43,0x86,0xff,0x20,0x41,0x85,0xff,0x1e, 0x3d,0x84,0xff,0x22,0x40,0x88,0xff,0x2f,0x4c,0x90,0xff,0x45,0x5f,0x9d,0xff, 0x64,0x79,0xad,0xff,0x55,0x6a,0x9a,0xff,0x7e,0x8a,0xa3,0xff,0x6f,0x76,0x91, 0xff,0xa6,0xa4,0xa1,0xff,0xe8,0xe8,0xf3,0xff,0xd9,0xd9,0xe3,0xff,0x64,0x64, 0x69,0x86,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x08,0x66,0x66,0x6c,0x8d,0xb9,0xb8,0xc2,0xff,0xc0,0xc0,0xcb,0xff, 0xca,0xca,0xd2,0xff,0xc1,0xc3,0xcc,0xff,0x1f,0x38,0x72,0xff,0x18,0x31,0x6b, 0xff,0x19,0x34,0x6d,0xff,0x19,0x34,0x70,0xff,0x1b,0x36,0x6e,0xff,0x1a,0x34, 0x6a,0xff,0x1a,0x33,0x6a,0xff,0x1c,0x36,0x6e,0xff,0x22,0x39,0x71,0xff,0x26, 0x3f,0x76,0xff,0x29,0x45,0x7b,0xff,0x2b,0x47,0x7f,0xff,0x29,0x43,0x7d,0xff, 0x22,0x3c,0x7a,0xff,0x1c,0x39,0x79,0xff,0x17,0x35,0x7a,0xff,0x11,0x30,0x79, 0xff,0x0e,0x30,0x7a,0xff,0x11,0x33,0x7c,0xff,0x1e,0x3b,0x81,0xff,0x29,0x46, 0x88,0xff,0x32,0x4c,0x8e,0xff,0x37,0x52,0x94,0xff,0x45,0x5f,0x9c,0xff,0x43, 0x5e,0xa4,0xff,0x3f,0x57,0xa8,0xff,0x61,0x73,0xb3,0xff,0x65,0x73,0xb6,0xff, 0x7f,0x81,0x9f,0xff,0xd6,0xd5,0xd8,0xff,0x00,0x00,0x00,0x43,0x00,0x00,0x00, 0x21,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x15, 0x00,0x00,0x00,0x04,0x27,0x27,0x2d,0x60,0x35,0x35,0x3d,0xff,0x30,0x30,0x38, 0xff,0x27,0x27,0x2e,0xff,0x34,0x34,0x3c,0xff,0x31,0x31,0x3a,0xff,0x31,0x31, 0x39,0xff,0x2e,0x2e,0x37,0xff,0x33,0x33,0x3c,0xff,0x44,0x44,0x50,0xff,0x44, 0x44,0x51,0xff,0x46,0x46,0x53,0xff,0x47,0x47,0x54,0xff,0x48,0x48,0x56,0xff, 0x49,0x49,0x56,0xff,0x43,0x43,0x51,0xff,0x4f,0x4f,0x5d,0xff,0x5c,0x5c,0x6a, 0xff,0x60,0x5e,0x68,0xff,0x46,0x45,0x4b,0xff,0x83,0x0d,0x27,0x62,0xff,0x20, 0x0d,0x28,0x63,0xff,0x0e,0x2a,0x66,0xff,0x0e,0x2a,0x67,0xff,0x0f,0x2b,0x68, 0xff,0x10,0x2c,0x69,0xff,0x10,0x2c,0x68,0xff,0x14,0x2e,0x6b,0xff,0x16,0x30, 0x6d,0xff,0x17,0x33,0x70,0xff,0x17,0x36,0x73,0xff,0x1b,0x36,0x76,0xff,0x1c, 0x39,0x78,0xff,0x1f,0x3b,0x7d,0xff,0x23,0x3f,0x81,0xff,0x24,0x41,0x83,0xff, 0x23,0x40,0x80,0xff,0x27,0x43,0x86,0xff,0x28,0x46,0x89,0xff,0x2b,0x48,0x8c, 0xff,0x2d,0x4a,0x90,0xff,0x30,0x4f,0x93,0xff,0x32,0x4e,0x96,0xff,0x34,0x52, 0x99,0xff,0x35,0x53,0x9b,0xff,0x39,0x56,0x9e,0xff,0x2c,0x29,0x21,0xff,0x5b, 0x5b,0x69,0xff,0x65,0x64,0x71,0xff,0x53,0x53,0x5f,0xd6,0x00,0x00,0x00,0x3c, 0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x09,0x83,0xff,0xff,0xff,0x00,0x09,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x51,0x51,0x54,0x38,0xb1,0xb1,0xb9,0xff, 0xa9,0xa9,0xaf,0xff,0x8f,0x8f,0x94,0xff,0xb0,0xb0,0xb7,0xff,0xac,0xab,0xb2, 0xff,0xab,0xab,0xb2,0xff,0x83,0xaa,0xaa,0xb1,0xff,0x0a,0xab,0xab,0xb3,0xff, 0xba,0xba,0xc3,0xff,0xc3,0xc3,0xcc,0xff,0xc9,0xc9,0xd3,0xff,0xb4,0xb4,0xbd, 0xff,0xd4,0xd4,0xdb,0xff,0xeb,0xeb,0xf4,0xff,0xec,0xec,0xf7,0xff,0x96,0x96, 0x96,0xff,0x21,0x3b,0x79,0xff,0x82,0x20,0x3b,0x74,0xff,0x20,0x21,0x3c,0x74, 0xff,0x1f,0x38,0x70,0xff,0x1f,0x37,0x6f,0xff,0x1e,0x36,0x6f,0xff,0x1d,0x35, 0x6e,0xff,0x1f,0x38,0x71,0xff,0x20,0x39,0x73,0xff,0x20,0x39,0x74,0xff,0x20, 0x39,0x75,0xff,0x1c,0x38,0x75,0xff,0x1a,0x36,0x76,0xff,0x18,0x36,0x7a,0xff, 0x1a,0x38,0x7d,0xff,0x26,0x43,0x85,0xff,0x3d,0x57,0x93,0xff,0x5d,0x73,0xa4, 0xff,0x80,0x91,0xb4,0xff,0xa5,0xb0,0xc8,0xff,0xc7,0xcc,0xd8,0xff,0xd0,0xd2, 0xdb,0xff,0xc3,0xc4,0xce,0xff,0x7c,0x80,0x8c,0xff,0x7f,0x7e,0x7d,0xff,0x8a, 0x88,0x85,0xff,0xd3,0xd3,0xdc,0xff,0xdf,0xde,0xe8,0xff,0xda,0xda,0xe6,0xff, 0x75,0x75,0x7b,0x92,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x12,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00, 0x28,0x00,0x00,0x00,0x07,0x66,0x65,0x6b,0x78,0xb2,0xb2,0xbc,0xff,0xbf,0xbf, 0xca,0xff,0xc5,0xc5,0xce,0xff,0xd2,0xd2,0xd7,0xff,0x1f,0x39,0x73,0xff,0x17, 0x32,0x6c,0xff,0x16,0x31,0x6f,0xff,0x17,0x34,0x6f,0xff,0x1c,0x36,0x6e,0xff, 0x1b,0x35,0x6b,0xff,0x1c,0x35,0x6d,0xff,0x19,0x32,0x6a,0xff,0x14,0x2d,0x69, 0xff,0x0e,0x29,0x67,0xff,0x0b,0x27,0x65,0xff,0x0b,0x26,0x68,0xff,0x0a,0x26, 0x6a,0xff,0x0e,0x2d,0x6e,0xff,0x16,0x32,0x77,0xff,0x18,0x34,0x7a,0xff,0x18, 0x32,0x7b,0xff,0x1d,0x3b,0x82,0xff,0x31,0x50,0x90,0xff,0x53,0x6a,0xaa,0xff, 0x70,0x83,0xc0,0xff,0x87,0x96,0xcc,0xff,0x9e,0xa8,0xd2,0xff,0xa5,0xae,0xd5, 0xff,0x7f,0x89,0xb7,0xff,0x79,0x7f,0xa3,0xff,0xa0,0xa0,0xb0,0xff,0xc1,0xc2, 0xa5,0xff,0xce,0xd0,0xc1,0xff,0xc3,0xc2,0xce,0xff,0x00,0x00,0x00,0x44,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff, 0x00,0x15,0x00,0x00,0x00,0x04,0x23,0x23,0x2a,0x5a,0x34,0x35,0x3d,0xff,0x30, 0x30,0x38,0xff,0x27,0x26,0x2d,0xff,0x34,0x34,0x3c,0xff,0x31,0x32,0x3a,0xff, 0x31,0x31,0x3a,0xff,0x2f,0x2f,0x37,0xff,0x33,0x33,0x3c,0xff,0x44,0x44,0x50, 0xff,0x44,0x44,0x51,0xff,0x46,0x46,0x52,0xff,0x47,0x47,0x54,0xff,0x48,0x48, 0x55,0xff,0x48,0x48,0x56,0xff,0x43,0x43,0x4f,0xff,0x4e,0x4e,0x5d,0xff,0x5b, 0x5b,0x69,0xff,0x5f,0x5e,0x69,0xff,0x46,0x46,0x4a,0xff,0x82,0x0d,0x27,0x62, 0xff,0x01,0x0e,0x28,0x64,0xff,0x83,0x0e,0x2a,0x67,0xff,0x1d,0x0e,0x28,0x64, 0xff,0x0f,0x29,0x64,0xff,0x10,0x2b,0x67,0xff,0x12,0x2d,0x69,0xff,0x15,0x2f, 0x6b,0xff,0x17,0x31,0x6f,0xff,0x18,0x35,0x71,0xff,0x1b,0x37,0x74,0xff,0x1a, 0x37,0x76,0xff,0x1e,0x3a,0x7c,0xff,0x23,0x3f,0x84,0xff,0x24,0x41,0x83,0xff, 0x25,0x42,0x84,0xff,0x27,0x43,0x84,0xff,0x2a,0x46,0x88,0xff,0x2a,0x46,0x8a, 0xff,0x25,0x42,0x8a,0xff,0x1d,0x3c,0x88,0xff,0x0f,0x33,0x84,0xff,0x14,0x38, 0x8a,0xff,0x2a,0x4c,0x98,0xff,0x45,0x61,0xa0,0xff,0x2d,0x2b,0x22,0xff,0x5b, 0x5b,0x6a,0xff,0x64,0x64,0x71,0xff,0x51,0x51,0x5b,0xd4,0x00,0x00,0x00,0x3c, 0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x09,0x83,0xff,0xff,0xff,0x00,0x38,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x0a,0x0b,0x0c,0x13,0x6a,0x6a,0x6e,0xb6, 0xa9,0xaa,0xaf,0xff,0x87,0x87,0x8b,0xff,0xb1,0xb1,0xb8,0xff,0xab,0xab,0xb2, 0xff,0xab,0xab,0xb1,0xff,0xaa,0xaa,0xb1,0xff,0xaa,0xaa,0xb0,0xff,0xaa,0xaa, 0xb1,0xff,0xa9,0xa9,0xb2,0xff,0xb8,0xb7,0xc1,0xff,0xc0,0xbf,0xc9,0xff,0xc8, 0xc8,0xd2,0xff,0xb4,0xb4,0xbd,0xff,0xcf,0xcf,0xd7,0xff,0xec,0xec,0xf4,0xff, 0xeb,0xea,0xf5,0xff,0xa6,0xa5,0xa2,0xff,0x20,0x39,0x7b,0xff,0x1c,0x37,0x71, 0xff,0x1d,0x38,0x71,0xff,0x1c,0x35,0x6e,0xff,0x1c,0x34,0x6d,0xff,0x1b,0x34, 0x6d,0xff,0x1a,0x33,0x6c,0xff,0x16,0x2f,0x69,0xff,0x11,0x2a,0x67,0xff,0x10, 0x2a,0x68,0xff,0x12,0x2c,0x6a,0xff,0x1d,0x36,0x72,0xff,0x32,0x4a,0x81,0xff, 0x53,0x68,0x97,0xff,0x79,0x89,0xae,0xff,0xa2,0xac,0xc4,0xff,0xc3,0xc8,0xd5, 0xff,0xd1,0xd4,0xdf,0xff,0xc4,0xc6,0xd2,0xff,0xaa,0xaa,0xb4,0xff,0x92,0x93, 0x95,0xff,0x92,0x90,0x8b,0xff,0xa4,0xa1,0x99,0xff,0xc0,0xbe,0xba,0xff,0xdb, 0xd9,0xdb,0xff,0xe6,0xe6,0xee,0xff,0xe8,0xe8,0xf3,0xff,0xd7,0xd6,0xe9,0xff, 0xd3,0xd2,0xdf,0xff,0xd9,0xd9,0xe3,0xff,0x79,0x79,0x80,0x9d,0x00,0x00,0x00, 0x2e,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x8b,0xff, 0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x06,0x6a,0x6a, 0x6f,0x68,0xad,0xad,0xb6,0xff,0xbf,0xbf,0xc9,0xff,0xc2,0xc2,0xcb,0xff,0xdf, 0xdd,0xdf,0xff,0x1e,0x37,0x74,0xff,0x14,0x2f,0x6c,0xff,0x15,0x30,0x6b,0xff, 0x14,0x2d,0x68,0xff,0x11,0x2b,0x65,0xff,0x0d,0x28,0x62,0xff,0x0b,0x27,0x60, 0xff,0x09,0x22,0x5b,0xff,0x09,0x1e,0x56,0xff,0x09,0x17,0x52,0xff,0x08,0x0f, 0x4d,0xff,0x08,0x13,0x52,0xff,0x08,0x23,0x63,0xff,0x29,0x45,0x7e,0xff,0x59, 0x6d,0xa0,0xff,0x7f,0x8e,0xb9,0xff,0x94,0x9e,0xc4,0xff,0x94,0xa1,0xcb,0xff, 0x84,0x92,0xc7,0xff,0x7c,0x86,0xbc,0xff,0x87,0x8d,0xb3,0xff,0xa3,0xa6,0xb6, 0xff,0xbe,0xbc,0xbe,0xff,0xcf,0xcc,0xc7,0xff,0xd8,0xd5,0xd0,0xff,0xdc,0xda, 0xda,0xff,0xd7,0xd5,0xdb,0xff,0xce,0xd5,0xa9,0xff,0xc5,0xc6,0xb7,0xff,0xbd, 0xbc,0xca,0xff,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x0b, 0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x17,0x00,0x00,0x00,0x04,0x1e, 0x1e,0x23,0x57,0x33,0x33,0x3d,0xff,0x31,0x31,0x39,0xff,0x26,0x27,0x2d,0xff, 0x33,0x33,0x3d,0xff,0x31,0x32,0x3a,0xff,0x32,0x31,0x3a,0xff,0x2f,0x2f,0x37, 0xff,0x32,0x32,0x3c,0xff,0x44,0x44,0x4f,0xff,0x44,0x44,0x50,0xff,0x45,0x45, 0x52,0xff,0x47,0x47,0x53,0xff,0x47,0x47,0x55,0xff,0x48,0x48,0x55,0xff,0x42, 0x42,0x4f,0xff,0x4d,0x4d,0x5b,0xff,0x5b,0x5a,0x68,0xff,0x5f,0x5d,0x69,0xff, 0x48,0x46,0x49,0xff,0x0d,0x27,0x62,0xff,0x0e,0x28,0x64,0xff,0x83,0x0e,0x2a, 0x67,0xff,0x1e,0x0d,0x28,0x63,0xff,0x0d,0x27,0x62,0xff,0x0e,0x28,0x63,0xff, 0x0f,0x29,0x65,0xff,0x11,0x2c,0x68,0xff,0x14,0x2f,0x6b,0xff,0x15,0x30,0x6d, 0xff,0x18,0x34,0x70,0xff,0x1b,0x36,0x73,0xff,0x1d,0x38,0x78,0xff,0x20,0x3d, 0x7d,0xff,0x1e,0x3b,0x7f,0xff,0x17,0x35,0x7d,0xff,0x0b,0x2d,0x79,0xff,0x00, 0x20,0x71,0xff,0x00,0x22,0x72,0xff,0x1a,0x38,0x82,0xff,0x47,0x5e,0x98,0xff, 0x77,0x89,0xb2,0xff,0x98,0xa6,0xc2,0xff,0x87,0x95,0xc7,0xff,0x5f,0x71,0xcb, 0xff,0x23,0x2c,0x58,0xff,0x2b,0x29,0x25,0xff,0x59,0x59,0x68,0xff,0x64,0x64, 0x70,0xff,0x4d,0x4d,0x57,0xd4,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x08,0x83,0xff,0xff,0xff,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x22,0x37,0x37,0x39,0x8d,0x76, 0x77,0x7a,0xff,0xb0,0xb1,0xb7,0xff,0xad,0xad,0xb3,0xff,0xab,0xab,0xb1,0xff, 0x83,0xa9,0xa9,0xaf,0xff,0x2c,0xa8,0xa8,0xb0,0xff,0xb6,0xb6,0xbf,0xff,0xbe, 0xbe,0xc7,0xff,0xc8,0xc8,0xd1,0xff,0xb5,0xb5,0xbc,0xff,0xc9,0xc9,0xd2,0xff, 0xeb,0xeb,0xf4,0xff,0xe8,0xe8,0xf3,0xff,0xb6,0xb2,0xad,0xff,0x1e,0x38,0x79, 0xff,0x18,0x34,0x6f,0xff,0x16,0x2e,0x6a,0xff,0x10,0x29,0x66,0xff,0x0e,0x27, 0x63,0xff,0x0d,0x27,0x64,0xff,0x16,0x2f,0x6a,0xff,0x2a,0x41,0x76,0xff,0x4a, 0x5c,0x88,0xff,0x72,0x80,0xa1,0xff,0x9d,0xa6,0xbc,0xff,0xc0,0xc5,0xd1,0xff, 0xd4,0xd6,0xe0,0xff,0xca,0xcd,0xdb,0xff,0xac,0xae,0xbc,0xff,0x8b,0x8c,0x94, 0xff,0x7b,0x7a,0x79,0xff,0x95,0x93,0x8b,0xff,0xb6,0xb3,0xad,0xff,0xd2,0xd0, 0xd0,0xff,0xe2,0xe2,0xe7,0xff,0xe6,0xe6,0xf0,0xff,0xe4,0xe3,0xed,0xff,0xde, 0xdd,0xe7,0xff,0xd9,0xd9,0xe3,0xff,0xd8,0xd7,0xe2,0xff,0xd4,0xd4,0xde,0xff, 0xdd,0xe2,0xbd,0xff,0xd3,0xd5,0xd0,0xff,0xd2,0xd2,0xdf,0xff,0x86,0x86,0x8d, 0xa8,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00,0x28,0x00,0x00, 0x00,0x05,0x5d,0x5e,0x62,0x57,0xa9,0xa9,0xb2,0xff,0xbf,0xbf,0xc8,0xff,0xbd, 0xbe,0xc7,0xff,0xec,0xe9,0xe7,0xff,0x1e,0x39,0x74,0xff,0x0c,0x27,0x65,0xff, 0x06,0x21,0x5e,0xff,0x06,0x1a,0x51,0xff,0x06,0x0b,0x47,0xff,0x07,0x07,0x42, 0xff,0x07,0x0b,0x46,0xff,0x07,0x24,0x5d,0xff,0x2e,0x44,0x77,0xff,0x55,0x66, 0x8e,0xff,0x76,0x7e,0xa1,0xff,0x8a,0x91,0xb1,0xff,0x7d,0x8e,0xc0,0xff,0x77, 0x86,0xc4,0xff,0x77,0x84,0xbb,0xff,0x8e,0x95,0xb9,0xff,0xae,0xb0,0xbd,0xff, 0xc0,0xbf,0xc0,0xff,0xca,0xc7,0xc3,0xff,0xd5,0xd2,0xce,0xff,0xdc,0xda,0xda, 0xff,0xdd,0xdc,0xde,0xff,0xdc,0xdb,0xe2,0xff,0xdc,0xdb,0xe4,0xff,0xde,0xde, 0xe6,0xff,0xdd,0xdd,0xe6,0xff,0xbc,0xbc,0xc6,0xff,0xa1,0x9f,0xae,0xff,0xba, 0xba,0xc5,0xff,0xbc,0xbb,0xc5,0xff,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x22, 0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x16,0x00, 0x00,0x00,0x03,0x13,0x13,0x16,0x33,0x2c,0x2c,0x35,0xfe,0x31,0x31,0x3b,0xff, 0x26,0x26,0x2d,0xff,0x33,0x33,0x3c,0xff,0x32,0x32,0x3a,0xff,0x31,0x31,0x3a, 0xff,0x30,0x30,0x37,0xff,0x32,0x32,0x3b,0xff,0x42,0x42,0x4e,0xff,0x43,0x43, 0x4f,0xff,0x44,0x44,0x51,0xff,0x46,0x46,0x53,0xff,0x47,0x47,0x54,0xff,0x47, 0x47,0x55,0xff,0x42,0x42,0x4e,0xff,0x4d,0x4c,0x5a,0xff,0x5a,0x59,0x68,0xff, 0x5f,0x5d,0x69,0xff,0x48,0x47,0x48,0xff,0x0e,0x29,0x66,0xff,0x83,0x0e,0x2a, 0x67,0xff,0x01,0x0d,0x27,0x64,0xff,0x83,0x0d,0x27,0x62,0xff,0x1b,0x0e,0x29, 0x64,0xff,0x12,0x2c,0x68,0xff,0x12,0x2d,0x6a,0xff,0x10,0x2c,0x69,0xff,0x07, 0x23,0x65,0xff,0x00,0x1b,0x61,0xff,0x00,0x17,0x61,0xff,0x00,0x23,0x6b,0xff, 0x1c,0x39,0x7c,0xff,0x42,0x5b,0x92,0xff,0x66,0x79,0xa6,0xff,0x7e,0x8f,0xb2, 0xff,0x7f,0x91,0xc4,0xff,0x6a,0x7e,0xd9,0xff,0x4d,0x62,0xd0,0xff,0x3d,0x4c, 0x9f,0xff,0x36,0x40,0x78,0xff,0x2e,0x34,0x56,0xff,0x2c,0x2c,0x34,0xff,0x2a, 0x29,0x24,0xff,0x4b,0x4b,0x57,0xff,0x5d,0x5d,0x6a,0xff,0x63,0x63,0x6e,0xff, 0x4d,0x4f,0x59,0xd2,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x1c,0x00,0x00,0x00, 0x08,0x83,0xff,0xff,0xff,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x30,0x47,0x46,0x49, 0x89,0xb7,0xb7,0xbe,0xfe,0xa8,0xa8,0xae,0xff,0xab,0xab,0xb1,0xff,0xaa,0xaa, 0xb0,0xff,0xa8,0xa8,0xae,0xff,0xaa,0xa9,0xaf,0xff,0xa6,0xa6,0xad,0xff,0xb4, 0xb4,0xbd,0xff,0xbc,0xbc,0xc5,0xff,0xc6,0xc7,0xd0,0xff,0xb4,0xb4,0xbd,0xff, 0xc3,0xc3,0xcd,0xff,0xe9,0xe9,0xf2,0xff,0xe7,0xe7,0xf1,0xff,0xc0,0xbd,0xb7, 0xff,0x16,0x2e,0x73,0xff,0x16,0x2f,0x6a,0xff,0x29,0x3f,0x75,0xff,0x4a,0x5d, 0x88,0xff,0x6f,0x7c,0x9f,0xff,0x96,0xa1,0xb8,0xff,0xbe,0xc2,0xce,0xff,0xd4, 0xd7,0xdf,0xff,0xcf,0xd1,0xe1,0xff,0xb5,0xb8,0xcc,0xff,0x95,0x97,0xa9,0xff, 0x80,0x82,0x8a,0xff,0x84,0x83,0x81,0xff,0x9b,0x98,0x90,0xff,0xb8,0xb6,0xb2, 0xff,0xd3,0xd1,0xd3,0xff,0xe3,0xe1,0xe8,0xff,0xe6,0xe5,0xef,0xff,0xdf,0xdf, 0xea,0xff,0xda,0xda,0xe5,0xff,0xda,0xda,0xe3,0xff,0xdd,0xdd,0xe6,0xff,0xe0, 0xe0,0xe9,0xff,0xe4,0xe4,0xed,0xff,0xe6,0xe6,0xef,0xff,0xe0,0xe0,0xec,0xff, 0xce,0xce,0xd6,0xff,0xbf,0xc4,0xa4,0xff,0xcc,0xcc,0xcc,0xff,0xcf,0xcf,0xdb, 0xff,0x90,0x90,0x96,0xb2,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x16,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x82,0x00,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x04,0x4b,0x4b,0x4e,0x46,0xa5,0xa6,0xae,0xff,0xbd, 0xbd,0xc7,0xff,0xba,0xbb,0xc4,0xff,0xea,0xe7,0xe6,0xff,0x0d,0x27,0x65,0xff, 0x04,0x21,0x5f,0xff,0x17,0x31,0x68,0xff,0x31,0x48,0x75,0xff,0x4c,0x53,0x80, 0xff,0x5e,0x61,0x89,0xff,0x64,0x70,0xa0,0xff,0x69,0x7c,0xba,0xff,0x76,0x84, 0xc4,0xff,0x86,0x92,0xc0,0xff,0x9e,0xa4,0xc2,0xff,0xad,0xb0,0xc1,0xff,0xb6, 0xb6,0xbc,0xff,0xc5,0xc1,0xc0,0xff,0xd5,0xd2,0xce,0xff,0xdf,0xdc,0xdb,0xff, 0xdf,0xdd,0xdf,0xff,0xdb,0xda,0xe1,0xff,0xdc,0xdc,0xe5,0xff,0xdf,0xde,0xe7, 0xff,0xe0,0xe0,0xea,0xff,0xe0,0xe0,0xeb,0xff,0xde,0xde,0xe9,0xff,0xda,0xda, 0xe4,0xff,0xd5,0xd5,0xdf,0xff,0xd4,0xd2,0xde,0xff,0xba,0xb8,0xc3,0xff,0xaa, 0xab,0xb2,0xff,0xce,0xce,0xd6,0xff,0xbd,0xbd,0xc7,0xff,0x00,0x00,0x00,0x44, 0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x00,0x8c,0xff,0xff, 0xff,0x00,0x15,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x10,0x0e,0x0e,0x11,0x56, 0x2b,0x2b,0x34,0xf8,0x23,0x23,0x29,0xff,0x33,0x33,0x3c,0xff,0x32,0x32,0x3a, 0xff,0x31,0x31,0x3a,0xff,0x30,0x30,0x39,0xff,0x32,0x31,0x3a,0xff,0x42,0x41, 0x4d,0xff,0x43,0x43,0x4f,0xff,0x44,0x44,0x50,0xff,0x45,0x45,0x52,0xff,0x46, 0x46,0x53,0xff,0x47,0x47,0x54,0xff,0x42,0x41,0x4d,0xff,0x4b,0x4c,0x59,0xff, 0x59,0x59,0x67,0xff,0x5f,0x5d,0x67,0xff,0x49,0x48,0x47,0xff,0x83,0x0e,0x2a, 0x67,0xff,0x20,0x0d,0x27,0x63,0xff,0x0d,0x27,0x62,0xff,0x0c,0x26,0x61,0xff, 0x09,0x23,0x60,0xff,0x03,0x1d,0x5c,0xff,0x00,0x16,0x56,0xff,0x00,0x15,0x56, 0xff,0x03,0x1f,0x5e,0xff,0x18,0x32,0x6e,0xff,0x32,0x4b,0x7e,0xff,0x43,0x58, 0x89,0xff,0x55,0x67,0x97,0xff,0x60,0x75,0xb1,0xff,0x67,0x7b,0xd1,0xff,0x5c, 0x73,0xd8,0xff,0x5a,0x6b,0xc2,0xff,0x54,0x60,0x9e,0xff,0x3f,0x46,0x6c,0xff, 0x2e,0x2f,0x3a,0xff,0x31,0x2e,0x29,0xff,0x39,0x37,0x2e,0xff,0x48,0x45,0x41, 0xff,0x59,0x57,0x5a,0xff,0x67,0x66,0x70,0xff,0x6f,0x6f,0x80,0xff,0x6e,0x6e, 0x7c,0xff,0x66,0x66,0x72,0xff,0x60,0x60,0x6c,0xff,0x50,0x50,0x59,0xd0,0x00, 0x00,0x00,0x3b,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x08,0x83,0xff,0xff,0xff, 0x00,0x82,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0c, 0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x31,0x50,0x50,0x54,0x5f,0xa5,0xa5,0xac, 0xdd,0xa4,0xa5,0xab,0xff,0xa7,0xa8,0xae,0xff,0xa7,0xa7,0xae,0xff,0xa9,0xa9, 0xaf,0xff,0xa5,0xa5,0xac,0xff,0xb1,0xb1,0xba,0xff,0xba,0xba,0xc3,0xff,0xc5, 0xc5,0xd0,0xff,0xb5,0xb4,0xbd,0xff,0xbd,0xbd,0xc6,0xff,0xe5,0xe6,0xee,0xff, 0xe5,0xe5,0xf0,0xff,0xca,0xc9,0xc3,0xff,0x70,0x7b,0xa4,0xff,0xa1,0xa9,0xbe, 0xff,0xd1,0xd4,0xe1,0xff,0xce,0xd1,0xe2,0xff,0xb6,0xba,0xd0,0xff,0x9a,0x9d, 0xb1,0xff,0x82,0x84,0x91,0xff,0x82,0x82,0x82,0xff,0x96,0x94,0x8c,0xff,0xb7, 0xb4,0xac,0xff,0xd2,0xd0,0xcd,0xff,0xe2,0xe0,0xe4,0xff,0xe6,0xe6,0xee,0xff, 0xe5,0xe5,0xef,0xff,0xe1,0xe1,0xec,0xff,0xdd,0xdd,0xe7,0xff,0xdb,0xdb,0xe5, 0xff,0xdf,0xdf,0xe8,0xff,0xe5,0xe5,0xee,0xff,0xe8,0xe8,0xf1,0xff,0xe9,0xe9, 0xf2,0xff,0xe7,0xe7,0xf1,0xff,0xe4,0xe4,0xee,0xff,0xe0,0xde,0xe8,0xff,0xda, 0xda,0xe5,0xff,0xd6,0xd6,0xe0,0xff,0xb7,0xb7,0xc1,0xff,0xbf,0xbf,0xcb,0xff, 0xd4,0xd3,0xde,0xff,0xd6,0xd5,0xe0,0xff,0xae,0xae,0xb6,0xc8,0x00,0x00,0x00, 0x34,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x8b,0xff, 0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x03,0x3d,0x3d, 0x41,0x34,0xa3,0xa3,0xab,0xff,0xbb,0xba,0xc4,0xff,0xb7,0xb7,0xc1,0xff,0xe7, 0xe4,0xe4,0xff,0x1f,0x36,0x70,0xff,0x47,0x5b,0x8a,0xff,0x71,0x7f,0xb3,0xff, 0x86,0x93,0xc1,0xff,0xa1,0xa9,0xcb,0xff,0xab,0xb1,0xcd,0xff,0xa4,0xa8,0xbe, 0xff,0xa9,0xa9,0xb4,0xff,0xc1,0xbe,0xbe,0xff,0xd3,0xd0,0xcc,0xff,0xdc,0xda, 0xd8,0xff,0xe0,0xde,0xe0,0xff,0xe0,0xdf,0xe5,0xff,0xe1,0xe1,0xe8,0xff,0xdd, 0xdd,0xe6,0xff,0xd7,0xd5,0xdf,0xff,0xe1,0xe1,0xe9,0xff,0xe8,0xe8,0xef,0xff, 0xdf,0xdf,0xe9,0xff,0xda,0xda,0xe5,0xff,0xd6,0xd6,0xe0,0xff,0xd5,0xd4,0xdf, 0xff,0xd5,0xd5,0xdf,0xff,0xd0,0xd0,0xda,0xff,0xcb,0xcb,0xd4,0xff,0xba,0xba, 0xc3,0xff,0x92,0x92,0x99,0xf3,0x5f,0x5f,0x63,0xd9,0x43,0x43,0x46,0xb6,0x13, 0x13,0x14,0x8a,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x0a, 0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x38,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x1f,0x0a,0x0b,0x0d,0x5e,0x1d,0x1d,0x20,0xfc, 0x34,0x34,0x3e,0xff,0x32,0x32,0x3a,0xff,0x31,0x31,0x3a,0xff,0x30,0x30,0x39, 0xff,0x31,0x31,0x39,0xff,0x41,0x41,0x4c,0xff,0x43,0x43,0x4e,0xff,0x44,0x44, 0x50,0xff,0x44,0x44,0x52,0xff,0x46,0x46,0x52,0xff,0x47,0x47,0x53,0xff,0x41, 0x41,0x4d,0xff,0x4b,0x4b,0x58,0xff,0x59,0x59,0x67,0xff,0x5d,0x5c,0x67,0xff, 0x49,0x48,0x46,0xff,0x0d,0x2a,0x67,0xff,0x0d,0x29,0x67,0xff,0x09,0x24,0x60, 0xff,0x07,0x22,0x5e,0xff,0x06,0x21,0x5e,0xff,0x0a,0x24,0x5f,0xff,0x10,0x2a, 0x64,0xff,0x15,0x2e,0x67,0xff,0x20,0x31,0x68,0xff,0x28,0x3c,0x70,0xff,0x43, 0x58,0x95,0xff,0x5f,0x73,0xbb,0xff,0x62,0x76,0xc7,0xff,0x77,0x87,0xcd,0xff, 0x70,0x7d,0xbb,0xff,0x4d,0x57,0x88,0xff,0x33,0x37,0x51,0xff,0x33,0x33,0x36, 0xff,0x38,0x35,0x2e,0xff,0x41,0x3d,0x35,0xff,0x4c,0x4a,0x48,0xff,0x59,0x57, 0x5d,0xff,0x63,0x63,0x70,0xff,0x6c,0x6c,0x7b,0xff,0x70,0x70,0x7f,0xff,0x62, 0x62,0x6d,0xff,0x56,0x56,0x5e,0xff,0x4e,0x4e,0x52,0xff,0x44,0x44,0x45,0xff, 0x55,0x55,0x5c,0xff,0x5f,0x5f,0x6d,0xff,0x4e,0x4e,0x56,0xcf,0x00,0x00,0x00, 0x3b,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x08,0x83,0xff,0xff,0xff,0x00,0x82, 0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x0c,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x42,0x97, 0x97,0x9c,0xae,0xa6,0xa5,0xac,0xff,0xa7,0xa7,0xad,0xff,0xa9,0xa7,0xad,0xff, 0xa3,0xa3,0xa9,0xff,0xaf,0xaf,0xb8,0xff,0xb8,0xb8,0xc1,0xff,0xc3,0xc3,0xcc, 0xff,0xb5,0xb5,0xbe,0xff,0xb8,0xb8,0xc1,0xff,0xe3,0xe3,0xec,0xff,0xe3,0xe3, 0xee,0xff,0xd4,0xd2,0xd9,0xff,0x48,0x49,0x55,0xff,0x5a,0x5c,0x71,0xff,0x7c, 0x7c,0x7c,0xff,0x9e,0x9c,0x94,0xff,0xbd,0xba,0xb4,0xff,0xd4,0xd1,0xcf,0xff, 0xe2,0xe0,0xe3,0xff,0xe7,0xe7,0xee,0xff,0xe6,0xe6,0xee,0xff,0xe1,0xdf,0xea, 0xff,0xdc,0xdc,0xe7,0xff,0xdb,0xdb,0xe5,0xff,0xe1,0xe1,0xe8,0xff,0xe4,0xe4, 0xed,0xff,0xe3,0xe3,0xec,0xff,0xe4,0xe4,0xec,0xff,0xed,0xed,0xf4,0xff,0xea, 0xea,0xf4,0xff,0xe5,0xe5,0xef,0xff,0xdf,0xdf,0xea,0xff,0xda,0xda,0xe5,0xff, 0xd6,0xd6,0xe0,0xff,0xd4,0xd4,0xdd,0xff,0xd1,0xd1,0xdc,0xff,0xd2,0xd2,0xdc, 0xff,0xd3,0xd3,0xde,0xff,0xd1,0xd1,0xdb,0xff,0xb6,0xb6,0xbd,0xff,0xbe,0xbe, 0xc7,0xff,0x94,0x93,0x9b,0xf0,0x52,0x52,0x56,0xa0,0x00,0x00,0x00,0x35,0x00, 0x00,0x00,0x18,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff, 0x00,0x82,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x02,0x2f,0x2f,0x32,0x24, 0x9e,0x9e,0xa6,0xff,0xb8,0xb8,0xc1,0xff,0xb5,0xb5,0xbe,0xff,0xdf,0xde,0xe6, 0xff,0xa8,0xae,0xb5,0xff,0x9c,0xa0,0xbc,0xff,0xa2,0xa4,0xb3,0xff,0xbe,0xbd, 0xbe,0xff,0xd3,0xd0,0xcc,0xff,0xdd,0xda,0xd7,0xff,0xe0,0xde,0xdf,0xff,0xe0, 0xde,0xe2,0xff,0xe0,0xdf,0xe7,0xff,0xe1,0xe2,0xea,0xff,0xe4,0xe4,0xed,0xff, 0xe5,0xe6,0xf0,0xff,0xe6,0xe6,0xf0,0xff,0xe6,0xe6,0xf1,0xff,0xbe,0xbe,0xc8, 0xff,0xc8,0xc8,0xd1,0xff,0xf0,0xf0,0xf7,0xff,0xe7,0xe7,0xf0,0xff,0x82,0xd5, 0xd5,0xe1,0xff,0x0e,0xcd,0xcd,0xd7,0xff,0xb6,0xb6,0xbf,0xff,0x85,0x85,0x8d, 0xea,0x61,0x61,0x65,0xc6,0x28,0x28,0x2a,0xa1,0x0c,0x0c,0x0d,0x7c,0x03,0x03, 0x03,0x62,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x48,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00, 0x8c,0xff,0xff,0xff,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x13,0x00,0x00,0x00,0x2a,0x13,0x14,0x15,0x88,0x34,0x33,0x3e,0xff, 0x82,0x31,0x31,0x3a,0xff,0x30,0x30,0x31,0x39,0xff,0x30,0x30,0x39,0xff,0x40, 0x40,0x4b,0xff,0x42,0x42,0x4d,0xff,0x43,0x43,0x4f,0xff,0x44,0x44,0x50,0xff, 0x45,0x46,0x52,0xff,0x47,0x47,0x53,0xff,0x41,0x41,0x4c,0xff,0x4a,0x4a,0x58, 0xff,0x58,0x58,0x66,0xff,0x5e,0x5c,0x67,0xff,0x4b,0x48,0x48,0xff,0x0b,0x28, 0x66,0xff,0x05,0x20,0x5e,0xff,0x00,0x16,0x55,0xff,0x01,0x13,0x56,0xff,0x0a, 0x24,0x60,0xff,0x32,0x47,0x80,0xff,0x5b,0x6e,0xa3,0xff,0x77,0x86,0xbb,0xff, 0x91,0x9d,0xcd,0xff,0x7f,0x8c,0xc7,0xff,0x55,0x60,0x9b,0xff,0x38,0x3f,0x65, 0xff,0x37,0x38,0x42,0xff,0x39,0x36,0x32,0xff,0x3d,0x3b,0x31,0xff,0x48,0x46, 0x41,0xff,0x53,0x51,0x54,0xff,0x5e,0x5d,0x64,0xff,0x66,0x66,0x73,0xff,0x6c, 0x6c,0x7a,0xff,0x6f,0x6f,0x7f,0xff,0x71,0x71,0x80,0xff,0x6f,0x6f,0x7c,0xff, 0x6b,0x6b,0x7d,0xff,0x61,0x61,0x6e,0xff,0x30,0x31,0x2f,0xff,0x38,0x38,0x36, 0xff,0x3f,0x3f,0x3e,0xff,0x3f,0x3f,0x3b,0xff,0x50,0x50,0x57,0xff,0x5e,0x5e, 0x6b,0xff,0x4b,0x4b,0x55,0xce,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x08,0x83,0xff,0xff,0xff,0x00,0x84,0x00,0x00,0x00,0x00,0x23,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x28, 0x00,0x00,0x00,0x3b,0x67,0x66,0x6b,0x73,0xa6,0xa6,0xad,0xe6,0xaf,0xaf,0xb5, 0xff,0xa4,0xa4,0xaa,0xff,0xad,0xad,0xb5,0xff,0xb6,0xb6,0xbf,0xff,0xc1,0xc1, 0xca,0xff,0xb6,0xb6,0xbf,0xff,0xb3,0xb3,0xbc,0xff,0xe0,0xe0,0xe8,0xff,0xdf, 0xdf,0xea,0xff,0xdc,0xdc,0xe7,0xff,0xd5,0xd5,0xda,0xff,0xe2,0xe1,0xe6,0xff, 0xea,0xe9,0xf1,0xff,0xe6,0xe7,0xf0,0xff,0xe0,0xdf,0xea,0xff,0xdb,0xdb,0xe5, 0xff,0xda,0xda,0xe4,0xff,0xdd,0xde,0xe7,0xff,0xe3,0xe3,0xec,0xff,0xe8,0xe8, 0xf0,0xff,0xec,0xec,0xf5,0xff,0xed,0xed,0xf7,0xff,0xf0,0xf0,0xfa,0xff,0xd3, 0xd3,0xdd,0xff,0xc6,0xc6,0xcf,0xff,0xeb,0xeb,0xf4,0xff,0xf9,0xf9,0xff,0xff, 0xda,0xda,0xe4,0xff,0x82,0xd5,0xd5,0xdf,0xff,0x0f,0xd7,0xd7,0xe1,0xff,0xd7, 0xd6,0xe1,0xff,0xd3,0xd3,0xdd,0xff,0xc4,0xc4,0xcd,0xff,0xa6,0xa6,0xad,0xfe, 0x76,0x76,0x7b,0xe4,0x4c,0x4c,0x50,0xc0,0x21,0x21,0x22,0x96,0x06,0x06,0x06, 0x71,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x2f,0x00,0x00, 0x00,0x16,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00, 0x82,0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x02,0x18,0x18,0x19,0x17,0x96, 0x95,0x9e,0xf4,0xb8,0xb8,0xc0,0xff,0xb4,0xb4,0xbd,0xff,0xd3,0xd3,0xde,0xff, 0xd7,0xd6,0xdf,0xff,0xe1,0xde,0xe0,0xff,0xe0,0xde,0xe1,0xff,0xd7,0xd7,0xe0, 0xff,0xda,0xd9,0xe3,0xff,0xe4,0xe3,0xed,0xff,0xe6,0xe6,0xf1,0xff,0x82,0xe8, 0xe8,0xf3,0xff,0x19,0xe3,0xe3,0xee,0xff,0xde,0xdf,0xea,0xff,0xda,0xda,0xe5, 0xff,0xd6,0xd6,0xe1,0xff,0xd3,0xd2,0xde,0xff,0xbf,0xbe,0xc8,0xff,0xc4,0xc4, 0xcd,0xff,0xc0,0xc0,0xc8,0xff,0xa4,0xa4,0xac,0xf6,0x71,0x71,0x78,0xdd,0x41, 0x41,0x44,0xba,0x15,0x15,0x15,0x95,0x0e,0x0e,0x0e,0x72,0x00,0x00,0x00,0x5b, 0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x4d,0x00,0x00,0x00, 0x48,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x30,0x00,0x00, 0x00,0x21,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x8c, 0xff,0xff,0xff,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x17,0x0d,0x0d,0x0f,0x44,0x33,0x33,0x3c,0xff,0x82, 0x31,0x31,0x39,0xff,0x30,0x2e,0x30,0x38,0xff,0x30,0x30,0x39,0xff,0x40,0x40, 0x4b,0xff,0x41,0x41,0x4d,0xff,0x43,0x43,0x4f,0xff,0x44,0x44,0x50,0xff,0x45, 0x45,0x52,0xff,0x47,0x47,0x53,0xff,0x40,0x40,0x4c,0xff,0x48,0x48,0x56,0xff, 0x58,0x58,0x66,0xff,0x5d,0x5c,0x67,0xff,0x4c,0x4a,0x46,0xff,0x2a,0x3f,0x72, 0xff,0x60,0x71,0x96,0xff,0x8e,0x9a,0xb3,0xff,0xa1,0xab,0xcb,0xff,0x82,0x8e, 0xc8,0xff,0x56,0x62,0xa1,0xff,0x3b,0x42,0x6e,0xff,0x3a,0x3d,0x4c,0xff,0x3c, 0x3b,0x3a,0xff,0x41,0x3f,0x36,0xff,0x48,0x43,0x3d,0xff,0x51,0x4e,0x4c,0xff, 0x59,0x57,0x5d,0xff,0x61,0x5f,0x6c,0xff,0x67,0x67,0x76,0xff,0x6c,0x6c,0x7a, 0xff,0x6e,0x6e,0x7d,0xff,0x6e,0x6e,0x7c,0xff,0x6b,0x6b,0x79,0xff,0x68,0x68, 0x77,0xff,0x65,0x65,0x72,0xff,0x61,0x62,0x70,0xff,0x5f,0x5f,0x6d,0xff,0x78, 0x79,0x6e,0xff,0x5a,0x5a,0x5e,0xff,0x36,0x37,0x37,0xff,0x42,0x42,0x41,0xff, 0x42,0x42,0x43,0xff,0x42,0x42,0x44,0xff,0x50,0x50,0x59,0xff,0x5e,0x5e,0x6a, 0xff,0x45,0x45,0x4f,0xcd,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x1c,0x00,0x00, 0x00,0x08,0x83,0xff,0xff,0xff,0x00,0x85,0x00,0x00,0x00,0x00,0x33,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x45,0x4e,0x50,0x51,0xaf,0x8e,0x8f,0x93,0xf5, 0xae,0xae,0xb7,0xff,0xb4,0xb4,0xbe,0xff,0xbf,0xbf,0xc8,0xff,0xb6,0xb8,0xbf, 0xff,0xb0,0xb0,0xb9,0xff,0xdb,0xdb,0xe4,0xff,0xdd,0xdd,0xe8,0xff,0xd9,0xd9, 0xe4,0xff,0xdb,0xdb,0xe6,0xff,0xda,0xda,0xe4,0xff,0xd7,0xd7,0xe1,0xff,0xdc, 0xdc,0xe6,0xff,0xe8,0xe8,0xf1,0xff,0xec,0xed,0xf5,0xff,0xef,0xef,0xf8,0xff, 0xf0,0xf0,0xf9,0xff,0xee,0xed,0xf8,0xff,0xea,0xea,0xf5,0xff,0xe4,0xe4,0xef, 0xff,0xe0,0xe0,0xeb,0xff,0xdf,0xde,0xea,0xff,0xca,0xca,0xd3,0xff,0xcd,0xcd, 0xd7,0xff,0xdb,0xdb,0xe4,0xff,0xda,0xda,0xe4,0xff,0xd6,0xd6,0xe1,0xff,0xd1, 0xd1,0xdc,0xff,0xbd,0xbd,0xc5,0xff,0x97,0x97,0x9e,0xf7,0x60,0x60,0x65,0xd7, 0x31,0x31,0x33,0xb2,0x0f,0x0f,0x0f,0x8a,0x00,0x00,0x00,0x68,0x00,0x00,0x00, 0x5a,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x4c,0x00,0x00, 0x00,0x44,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x82,0x00,0x00, 0x00,0x00,0x28,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0d,0x8f,0x8f,0x97,0xe7, 0xb3,0xb3,0xbd,0xff,0xb1,0xb1,0xba,0xff,0xcf,0xcf,0xda,0xff,0xd2,0xd2,0xdd, 0xff,0xce,0xce,0xd9,0xff,0xd0,0xd0,0xd9,0xff,0xcd,0xcd,0xd7,0xff,0xd5,0xd5, 0xe0,0xff,0xe5,0xe5,0xf1,0xff,0xde,0xdf,0xeb,0xff,0xda,0xdb,0xe6,0xff,0xd7, 0xd7,0xe2,0xff,0xd3,0xd4,0xde,0xff,0xce,0xce,0xd9,0xff,0xc6,0xc4,0xcf,0xff, 0xb8,0xb8,0xc3,0xff,0xab,0xaa,0xb3,0xff,0x9f,0x9f,0xa7,0xff,0x95,0x94,0x9b, 0xff,0x9c,0x9d,0xa2,0xff,0x1c,0x1c,0x1c,0x9b,0x00,0x00,0x00,0x5d,0x00,0x00, 0x00,0x57,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x3f,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x16,0x00,0x00,0x00, 0x0e,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x8c,0xff, 0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x0a,0x16,0x16,0x1a,0x3c,0x36,0x37,0x41,0xff,0x34,0x35,0x3d,0xff,0x31, 0x30,0x39,0xff,0x82,0x30,0x30,0x38,0xff,0x2e,0x3f,0x3f,0x4b,0xff,0x40,0x41, 0x4c,0xff,0x42,0x42,0x4e,0xff,0x43,0x43,0x4f,0xff,0x44,0x44,0x51,0xff,0x46, 0x46,0x52,0xff,0x40,0x40,0x4b,0xff,0x47,0x47,0x55,0xff,0x57,0x57,0x66,0xff, 0x5a,0x5a,0x68,0xff,0x50,0x50,0x51,0xff,0x3b,0x43,0x6a,0xff,0x41,0x4a,0x80, 0xff,0x40,0x42,0x57,0xff,0x41,0x41,0x40,0xff,0x44,0x42,0x39,0xff,0x49,0x47, 0x3d,0xff,0x50,0x4e,0x4c,0xff,0x58,0x56,0x5a,0xff,0x5d,0x5d,0x67,0xff,0x64, 0x64,0x71,0xff,0x67,0x68,0x77,0xff,0x6b,0x69,0x7a,0xff,0x6a,0x6c,0x7a,0xff, 0x69,0x69,0x77,0xff,0x67,0x66,0x75,0xff,0x63,0x63,0x71,0xff,0x61,0x61,0x6e, 0xff,0x5e,0x5e,0x6b,0xff,0x5c,0x5c,0x69,0xff,0x5b,0x5b,0x67,0xff,0x58,0x58, 0x65,0xff,0x54,0x54,0x61,0xff,0x54,0x54,0x5e,0xff,0x8b,0x8f,0x60,0xff,0x56, 0x57,0x57,0xff,0x44,0x44,0x4c,0xff,0x4e,0x4e,0x56,0xff,0x52,0x52,0x5d,0xff, 0x55,0x55,0x61,0xff,0x59,0x58,0x65,0xff,0x63,0x64,0x70,0xff,0x3d,0x3d,0x45, 0xd4,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x08,0x83,0xff, 0xff,0xff,0x00,0x86,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x2b,0x1a, 0x1a,0x1b,0x6c,0x77,0x77,0x7d,0xe6,0xae,0xae,0xb7,0xff,0xb2,0xb2,0xbc,0xff, 0xbd,0xbd,0xc6,0xff,0xb8,0xb8,0xc1,0xff,0xad,0xad,0xb6,0xff,0xd7,0xd8,0xe1, 0xff,0xdc,0xdc,0xe6,0xff,0x82,0xd6,0xd6,0xe0,0xff,0x22,0xd5,0xd5,0xe0,0xff, 0xd3,0xd3,0xdd,0xff,0xe1,0xe1,0xeb,0xff,0xf0,0xf0,0xfb,0xff,0xe8,0xea,0xf5, 0xff,0xe5,0xe5,0xf0,0xff,0xe1,0xe1,0xec,0xff,0xdd,0xdd,0xe8,0xff,0xdb,0xdb, 0xe5,0xff,0xda,0xda,0xe5,0xff,0xdc,0xdc,0xe6,0xff,0xdd,0xdd,0xe8,0xff,0xda, 0xda,0xe5,0xff,0xd0,0xd0,0xda,0xff,0xb7,0xb6,0xbf,0xff,0x90,0x90,0x98,0xff, 0x61,0x60,0x66,0xed,0x1e,0x1e,0x20,0xac,0x09,0x09,0x09,0x8c,0x00,0x00,0x00, 0x6a,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x50,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x2e,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x11, 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x8b,0xff,0xff, 0xff,0x00,0x83,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x0c,0x88,0x89,0x90, 0xd9,0xb0,0xb1,0xba,0xff,0xaf,0xaf,0xb9,0xff,0xca,0xcb,0xd6,0xff,0xd1,0xd1, 0xdc,0xff,0xce,0xce,0xda,0xff,0xd1,0xd1,0xdb,0xff,0xd1,0xd1,0xdc,0xff,0xd1, 0xd1,0xdd,0xff,0xd1,0xd1,0xdc,0xff,0xca,0xcb,0xd5,0xff,0xc4,0xc4,0xcd,0xff, 0xb4,0xb3,0xbe,0xff,0xa5,0xa5,0xac,0xff,0x98,0x98,0x9d,0xff,0x90,0x90,0x95, 0xff,0x8d,0x8f,0x93,0xff,0x8f,0x8f,0x94,0xff,0x95,0x95,0x9a,0xff,0x9b,0x9b, 0xa0,0xff,0xa5,0xa5,0xab,0xff,0x68,0x68,0x6b,0xd8,0x07,0x07,0x07,0x71,0x00, 0x00,0x00,0x43,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x26, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x15,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff, 0x00,0x83,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x04,0x0e,0x0e,0x10,0x25, 0x2d,0x2d,0x34,0xee,0x38,0x38,0x41,0xff,0x37,0x37,0x42,0xff,0x32,0x32,0x3b, 0xff,0x31,0x31,0x39,0xff,0x3e,0x3f,0x4a,0xff,0x40,0x40,0x4c,0xff,0x42,0x42, 0x4d,0xff,0x43,0x43,0x4e,0xff,0x44,0x44,0x50,0xff,0x45,0x45,0x52,0xff,0x3f, 0x40,0x4b,0xff,0x47,0x46,0x54,0xff,0x55,0x54,0x62,0xff,0x58,0x58,0x66,0xff, 0x55,0x55,0x62,0xff,0x4d,0x4a,0x4a,0xff,0x4f,0x4c,0x4b,0xff,0x56,0x54,0x59, 0xff,0x5a,0x58,0x62,0xff,0x5c,0x5c,0x6a,0xff,0x62,0x63,0x72,0xff,0x66,0x66, 0x76,0xff,0x67,0x67,0x75,0xff,0x66,0x66,0x75,0xff,0x63,0x63,0x73,0xff,0x61, 0x61,0x6f,0xff,0x5f,0x5f,0x6c,0xff,0x5c,0x5b,0x69,0xff,0x5a,0x5b,0x67,0xff, 0x59,0x59,0x65,0xff,0x57,0x57,0x64,0xff,0x54,0x54,0x60,0xff,0x51,0x52,0x5e, 0xff,0x4f,0x4f,0x5b,0xff,0x4e,0x4e,0x59,0xff,0x4e,0x4e,0x58,0xff,0x4e,0x4f, 0x59,0xff,0x4f,0x50,0x5c,0xff,0x4b,0x4a,0x5e,0xff,0x55,0x55,0x63,0xff,0x58, 0x57,0x63,0xff,0x4e,0x4e,0x5b,0xff,0x4a,0x4a,0x56,0xff,0x4e,0x4c,0x59,0xff, 0x56,0x55,0x61,0xff,0x40,0x40,0x49,0xf0,0x18,0x18,0x1a,0xa1,0x00,0x00,0x00, 0x39,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x08,0x83,0xff,0xff,0xff,0x00,0x87, 0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x0a,0x5a,0x58,0x5d,0x99,0xa4,0xa3,0xab,0xff,0x9b,0x9a,0xa2,0xff,0xa6, 0xa6,0xaf,0xff,0xb0,0xb0,0xb9,0xff,0xba,0xba,0xc3,0xff,0xb9,0xb9,0xc2,0xff, 0xaa,0xaa,0xb3,0xff,0xd3,0xd3,0xdd,0xff,0xdb,0xda,0xe5,0xff,0x83,0xd4,0xd4, 0xde,0xff,0x1f,0xd2,0xd3,0xdd,0xff,0xd9,0xd9,0xe3,0xff,0xdf,0xdf,0xea,0xff, 0xdc,0xdc,0xe6,0xff,0xdc,0xdc,0xe8,0xff,0xde,0xde,0xea,0xff,0xdf,0xdf,0xea, 0xff,0xd9,0xd9,0xe4,0xff,0xc8,0xc8,0xd1,0xff,0xaa,0xaa,0xb2,0xff,0x84,0x83, 0x8a,0xff,0x5c,0x5c,0x5f,0xff,0x3a,0x3a,0x3c,0xff,0x16,0x16,0x16,0xff,0x0e, 0x0f,0x0f,0xff,0x7a,0x7a,0x7f,0xf8,0x1f,0x1f,0x20,0x97,0x00,0x00,0x00,0x55, 0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x3b,0x00,0x00,0x00, 0x33,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x1e,0x00,0x00, 0x00,0x19,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x00,0x8b,0xff,0xff, 0xff,0x00,0x83,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x0a,0x85,0x85,0x8c, 0xd5,0xbf,0xbe,0xc7,0xff,0xbf,0xbf,0xc9,0xff,0xd4,0xd4,0xe0,0xff,0xe5,0xe3, 0xf0,0xff,0xdd,0xdd,0xe9,0xff,0xcb,0xcb,0xd6,0xff,0xb6,0xb6,0xbf,0xff,0xa9, 0xa9,0xb1,0xff,0xae,0xae,0xb6,0xff,0xa1,0xa1,0xa8,0xff,0x91,0x91,0x95,0xff, 0x90,0x8f,0x94,0xff,0x92,0x93,0x96,0xff,0x96,0x95,0x9a,0xff,0x9c,0x9c,0xa1, 0xff,0x9a,0x9b,0xa0,0xff,0x9d,0x9d,0xa2,0xff,0x9e,0x9e,0xa3,0xff,0x99,0x99, 0x9f,0xff,0x98,0x98,0x9c,0xff,0xaa,0xac,0xb3,0xff,0xb5,0xb3,0xbe,0xff,0x68, 0x68,0x6d,0xb9,0x03,0x03,0x04,0x3f,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x05,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x01,0x86,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00, 0x83,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0d,0x02, 0x02,0x02,0x37,0x0c,0x0b,0x0d,0x99,0x1b,0x1a,0x1f,0xda,0x29,0x2a,0x2f,0xf9, 0x31,0x31,0x39,0xff,0x3e,0x3e,0x4a,0xff,0x40,0x40,0x4c,0xff,0x41,0x41,0x4c, 0xff,0x43,0x43,0x4e,0xff,0x43,0x44,0x4f,0xff,0x44,0x44,0x51,0xff,0x3f,0x3f, 0x4a,0xff,0x46,0x47,0x53,0xff,0x53,0x53,0x62,0xff,0x54,0x54,0x61,0xff,0x57, 0x57,0x64,0xff,0x5e,0x5e,0x6c,0xff,0x55,0x55,0x65,0xff,0x51,0x51,0x61,0xff, 0x56,0x56,0x67,0xff,0x64,0x64,0x73,0xff,0x5d,0x5d,0x6c,0xff,0x5a,0x5a,0x68, 0xff,0x59,0x59,0x66,0xff,0x57,0x57,0x65,0xff,0x57,0x57,0x64,0xff,0x55,0x55, 0x62,0xff,0x54,0x54,0x60,0xff,0x51,0x51,0x5c,0xff,0x4e,0x4e,0x5a,0xff,0x4d, 0x4d,0x58,0xff,0x4b,0x4c,0x57,0xff,0x4c,0x4c,0x57,0xff,0x4e,0x4e,0x59,0xff, 0x52,0x52,0x5d,0xff,0x56,0x56,0x62,0xff,0x5b,0x5b,0x68,0xff,0x5e,0x5e,0x6c, 0xff,0x61,0x61,0x6e,0xff,0x60,0x5f,0x6c,0xff,0x5a,0x5a,0x64,0xff,0x5c,0x5d, 0x69,0xff,0x8a,0x8a,0x92,0xff,0x98,0x98,0xa0,0xff,0xd4,0xd4,0xda,0xff,0x60, 0x60,0x63,0xd6,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x33, 0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x07,0x83,0xff,0xff,0xff,0x00,0x89,0x00, 0x00,0x00,0x00,0x18,0x22,0x22,0x24,0x31,0xbe,0xbe,0xc6,0xff,0xaa,0xa9,0xb1, 0xff,0x9c,0x9c,0xa2,0xff,0xa5,0xa5,0xad,0xff,0xb0,0xb0,0xb9,0xff,0xb8,0xb8, 0xc1,0xff,0xba,0xba,0xc3,0xff,0xa8,0xa8,0xb0,0xff,0xcf,0xcf,0xd9,0xff,0xda, 0xda,0xe4,0xff,0xd2,0xd2,0xdc,0xff,0xd3,0xd3,0xde,0xff,0xd5,0xd4,0xe0,0xff, 0xd8,0xd8,0xe2,0xff,0xdb,0xdb,0xe6,0xff,0xd5,0xd5,0xe0,0xff,0xcf,0xcf,0xda, 0xff,0xc2,0xc2,0xcc,0xff,0xa2,0xa2,0xa9,0xff,0x79,0x79,0x7e,0xff,0x4e,0x4e, 0x52,0xff,0x2b,0x2b,0x2d,0xff,0x11,0x11,0x12,0xff,0x84,0x00,0x00,0x00,0xff, 0x0f,0x71,0x71,0x76,0xff,0xcd,0xcd,0xd8,0xff,0xa8,0xa8,0xaf,0xf3,0x01,0x01, 0x01,0x4f,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x17,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0a, 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x01,0x84,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x83,0x00,0x00,0x00, 0x00,0x1d,0x00,0x00,0x00,0x09,0x1b,0x1b,0x1c,0x57,0x3b,0x3b,0x3e,0xa7,0x58, 0x58,0x5d,0xcb,0x85,0x85,0x8c,0xe5,0x68,0x68,0x6e,0xd1,0x1f,0x1f,0x21,0xa1, 0x49,0x49,0x4d,0xcc,0xac,0xab,0xb2,0xff,0xab,0xab,0xb1,0xff,0xc0,0xc0,0xc7, 0xff,0xab,0xab,0xaf,0xff,0x9c,0x9c,0xa1,0xff,0x9f,0x9f,0xa4,0xff,0x9c,0x9c, 0xa1,0xff,0x9e,0x9e,0xa3,0xff,0x97,0x97,0x9c,0xff,0x94,0x94,0x99,0xff,0x91, 0x92,0x96,0xff,0x8c,0x8c,0x90,0xff,0x92,0x92,0x98,0xff,0x98,0x98,0x9d,0xff, 0xbc,0xbc,0xc7,0xff,0xdd,0xdd,0xea,0xff,0xf1,0xf1,0xff,0xff,0xd1,0xd1,0xda, 0xf2,0x27,0x27,0x28,0x57,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x03,0x8a,0x00, 0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x83,0x00,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x36, 0x00,0x00,0x00,0x5e,0x01,0x01,0x00,0x89,0x0f,0x0f,0x12,0xcb,0x3f,0x3f,0x4a, 0xff,0x82,0x40,0x40,0x4c,0xff,0x06,0x42,0x42,0x4d,0xff,0x43,0x43,0x4f,0xff, 0x44,0x44,0x50,0xff,0x3f,0x3f,0x4a,0xff,0x46,0x44,0x53,0xff,0x52,0x53,0x60, 0xff,0x82,0x53,0x53,0x60,0xff,0x23,0x59,0x59,0x69,0xff,0x91,0x91,0x9e,0xff, 0xb5,0xb5,0xbd,0xff,0xe6,0xe6,0xe8,0xff,0xf8,0xf8,0xfa,0xff,0x5c,0x5c,0x68, 0xff,0x49,0x49,0x57,0xff,0x4e,0x4e,0x5a,0xff,0x4c,0x4c,0x58,0xff,0x4b,0x4b, 0x55,0xff,0x48,0x4a,0x55,0xff,0x4b,0x4b,0x57,0xff,0x4d,0x4d,0x58,0xff,0x4f, 0x4f,0x5a,0xff,0x52,0x51,0x5d,0xff,0x58,0x58,0x64,0xff,0x5c,0x5d,0x69,0xff, 0x60,0x60,0x6d,0xff,0x62,0x62,0x6e,0xff,0x5d,0x5d,0x6b,0xff,0x52,0x52,0x5d, 0xff,0x40,0x40,0x4a,0xf4,0x31,0x31,0x36,0xe2,0x1d,0x1c,0x20,0xcc,0x12,0x12, 0x14,0xbf,0x2d,0x2d,0x30,0xc6,0x64,0x64,0x65,0xc7,0x54,0x54,0x54,0xbe,0x2c, 0x2c,0x2b,0xa5,0x02,0x02,0x02,0x71,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x3d, 0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x04,0x83,0xff,0xff, 0xff,0x00,0x88,0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x01,0x1a,0x1a,0x1a, 0x51,0xb1,0xb2,0xbb,0xff,0xbd,0xbd,0xc7,0xff,0xa5,0xa5,0xad,0xff,0x97,0x97, 0x9e,0xff,0xa7,0xa7,0xb0,0xff,0xb7,0xb7,0xc0,0xff,0xbf,0xbf,0xc8,0xff,0xab, 0xab,0xb2,0xff,0xce,0xce,0xd8,0xff,0xdf,0xdf,0xe9,0xff,0xd8,0xd7,0xe2,0xff, 0xd5,0xd6,0xe1,0xff,0xce,0xce,0xd7,0xff,0xbf,0xbf,0xc8,0xff,0xa9,0xa9,0xb1, 0xff,0x95,0x96,0x9d,0xff,0x88,0x88,0x8e,0xff,0x24,0x24,0x26,0xff,0x0a,0x0a, 0x09,0xff,0x83,0x00,0x00,0x00,0xff,0x0f,0x08,0x08,0x07,0xff,0x25,0x25,0x27, 0xff,0x4f,0x4e,0x52,0xff,0x7a,0x7a,0x80,0xff,0xaa,0xaa,0xb3,0xff,0xdd,0xdc, 0xe7,0xff,0xee,0xee,0xf8,0xff,0xa0,0xa0,0xa8,0xf9,0x02,0x02,0x02,0x58,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x89,0x00,0x00,0x00,0x00,0x8b,0xff, 0xff,0xff,0x00,0x83,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x17,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x59,0x00, 0x00,0x00,0x76,0x16,0x16,0x17,0x9b,0x6d,0x6d,0x72,0xe1,0xb7,0xb7,0xbe,0xff, 0xb3,0xb3,0xba,0xff,0xc1,0xc1,0xc9,0xff,0xb0,0xb0,0xb6,0xff,0x9a,0x9a,0x9f, 0xff,0x94,0x94,0x9a,0xff,0x93,0x92,0x96,0xff,0x8c,0x8c,0x92,0xff,0x90,0x90, 0x94,0xff,0x9c,0x9c,0xa3,0xff,0xa8,0xa7,0xb0,0xff,0xc0,0xbf,0xca,0xff,0xd5, 0xd5,0xe2,0xff,0xe7,0xe7,0xf5,0xff,0xf2,0xf2,0xfe,0xff,0xf7,0xf7,0xff,0xff, 0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xfc,0xfc,0xff,0x32,0x31,0x32, 0x61,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x03,0x89,0x00,0x00,0x00,0x00,0x8c, 0xff,0xff,0xff,0x00,0x84,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x47, 0x06,0x06,0x05,0x96,0x3c,0x3c,0x48,0xff,0x40,0x40,0x4c,0xff,0x40,0x40,0x4b, 0xff,0x41,0x41,0x4c,0xff,0x43,0x43,0x4e,0xff,0x44,0x43,0x50,0xff,0x3e,0x3e, 0x49,0xff,0x45,0x45,0x52,0xff,0x52,0x52,0x5f,0xff,0x53,0x52,0x5f,0xff,0x4e, 0x4e,0x5b,0xff,0x50,0x50,0x60,0xff,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff, 0xef,0xef,0xf0,0xff,0xba,0xba,0xbe,0xff,0x47,0x48,0x53,0xff,0x41,0x42,0x4c, 0xff,0x47,0x47,0x51,0xff,0x4d,0x4b,0x57,0xff,0x51,0x50,0x5d,0xff,0x55,0x55, 0x62,0xff,0x5a,0x5a,0x67,0xff,0x5d,0x5d,0x6a,0xff,0x60,0x60,0x6e,0xff,0x61, 0x60,0x6f,0xff,0x59,0x59,0x67,0xff,0x4d,0x4d,0x59,0xff,0x3a,0x38,0x42,0xf1, 0x23,0x23,0x28,0xd8,0x10,0x0f,0x12,0xba,0x04,0x04,0x04,0x9d,0x00,0x00,0x00, 0x83,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x5d,0x82,0x00, 0x00,0x00,0x5b,0x08,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x4f,0x00,0x00,0x00, 0x47,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x15,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x02,0x83,0xff,0xff,0xff,0x00,0x88,0x00,0x00,0x00, 0x00,0x26,0x00,0x00,0x00,0x02,0x14,0x14,0x14,0x64,0x77,0x79,0x7e,0xff,0xaa, 0xaa,0xb2,0xff,0xb5,0xb5,0xbe,0xff,0xa1,0xa1,0xa9,0xff,0x95,0x95,0x9c,0xff, 0x96,0x96,0x9c,0xff,0x9e,0x9e,0xa4,0xff,0x95,0x95,0x9c,0xff,0xb6,0xb6,0xbe, 0xff,0xc2,0xc2,0xcb,0xff,0xa9,0xa9,0xb1,0xff,0x99,0x9a,0xa1,0xff,0x84,0x83, 0x89,0xff,0x77,0x75,0x7b,0xff,0x78,0x78,0x7e,0xff,0x86,0x86,0x8c,0xff,0x2c, 0x2c,0x2e,0xff,0x00,0x00,0x00,0xff,0x0c,0x0c,0x0d,0xff,0x2c,0x2c,0x2e,0xff, 0x58,0x58,0x5c,0xff,0x8a,0x8a,0x91,0xff,0xb9,0xb8,0xc3,0xff,0xdb,0xdb,0xe7, 0xff,0xf1,0xf1,0xfd,0xff,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xee,0xee, 0xf6,0xff,0xb7,0xb7,0xbf,0xff,0x6d,0x6d,0x72,0xf8,0x04,0x04,0x04,0x5d,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x01,0x0e,0x0e,0x0e,0x00, 0x0c,0x0c,0x0c,0x00,0x8a,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x83, 0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0e,0x0e,0x0e, 0x0f,0x44,0x6f,0x6f,0x74,0xc3,0x8e,0x8e,0x95,0xec,0xa5,0xa5,0xae,0xff,0xaf, 0xaf,0xb9,0xff,0xaa,0xaa,0xb4,0xff,0xa8,0xa8,0xb1,0xff,0xb2,0xb2,0xba,0xff, 0xbf,0xbf,0xc6,0xff,0xa5,0xa5,0xab,0xff,0x90,0x90,0x95,0xff,0xa3,0xa3,0xaa, 0xff,0xb1,0xb3,0xbb,0xff,0xc6,0xc4,0xd0,0xff,0xdb,0xdb,0xe7,0xff,0xea,0xe9, 0xf6,0xff,0xf5,0xf5,0xff,0xff,0xfc,0xfc,0xff,0xff,0xfe,0xfe,0xff,0xff,0x86, 0xff,0xff,0xff,0xff,0x04,0xfa,0xfa,0xfa,0xfb,0x11,0x11,0x12,0x3d,0x00,0x00, 0x00,0x0a,0x00,0x00,0x00,0x02,0x88,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff, 0x00,0x84,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x27,0x08,0x08,0x08, 0x84,0x3d,0x3e,0x49,0xff,0x82,0x3f,0x3f,0x4c,0xff,0x2b,0x40,0x40,0x4c,0xff, 0x42,0x42,0x4d,0xff,0x43,0x43,0x50,0xff,0x3e,0x3e,0x4a,0xff,0x43,0x43,0x51, 0xff,0x51,0x51,0x5e,0xff,0x52,0x52,0x5e,0xff,0x4f,0x4f,0x5b,0xff,0x47,0x46, 0x52,0xff,0x6e,0x6e,0x77,0xff,0x57,0x57,0x62,0xff,0x3c,0x3b,0x46,0xff,0x35, 0x36,0x41,0xff,0x46,0x47,0x53,0xff,0x52,0x52,0x5e,0xff,0x59,0x59,0x66,0xff, 0x5d,0x5d,0x6b,0xff,0x60,0x60,0x6d,0xff,0x5f,0x5f,0x6c,0xff,0x57,0x57,0x64, 0xff,0x4b,0x4a,0x55,0xfd,0x35,0x35,0x3d,0xee,0x1f,0x1f,0x24,0xd3,0x0d,0x0d, 0x0d,0xb3,0x02,0x02,0x02,0x95,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x6a,0x00, 0x00,0x00,0x5f,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x46, 0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x39,0x00,0x00,0x00, 0x38,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x2b,0x00,0x00, 0x00,0x1f,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x00,0x83,0xff,0xff,0xff,0x00,0x88,0x00,0x00,0x00,0x00,0x17,0x00, 0x00,0x00,0x03,0x12,0x12,0x11,0x61,0x75,0x75,0x7a,0xff,0x87,0x87,0x8d,0xff, 0x93,0x93,0x9a,0xff,0xa5,0xa5,0xad,0xff,0xab,0xab,0xb3,0xff,0xa8,0xa9,0xb1, 0xff,0xa4,0xa3,0xac,0xff,0xa0,0xa0,0xa6,0xff,0x9b,0x9b,0xa3,0xff,0x9a,0x9a, 0xa2,0xff,0x9e,0x9f,0xa7,0xff,0xa5,0xa5,0xad,0xff,0xa9,0xa9,0xb2,0xff,0xa9, 0xa9,0xb1,0xff,0xa4,0xa4,0xac,0xff,0x7a,0x7a,0x80,0xff,0x61,0x61,0x66,0xff, 0x99,0x98,0x9f,0xff,0xc7,0xc7,0xd1,0xff,0xe7,0xe7,0xf2,0xff,0xfa,0xfa,0xff, 0xff,0x82,0xff,0xff,0xff,0xff,0x0d,0xfe,0xff,0xff,0xff,0xf4,0xf4,0xf9,0xff, 0xe1,0xe0,0xe5,0xff,0xbe,0xbe,0xc3,0xff,0x92,0x92,0x99,0xff,0x8e,0x8d,0x94, 0xff,0x6f,0x6f,0x74,0xf5,0x02,0x02,0x02,0x5a,0x00,0x00,0x00,0x23,0x00,0x00, 0x00,0x0c,0x00,0x00,0x00,0x01,0x0c,0x0c,0x0b,0x00,0x0a,0x0a,0x09,0x00,0x8a, 0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x83,0x00,0x00,0x00,0x00,0x0f, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x07,0x2d,0x2d,0x30,0x7c,0xa6,0xa6,0xae, 0xff,0xa7,0xa7,0xaf,0xff,0xb6,0xb6,0xbf,0xff,0xc6,0xc6,0xd0,0xff,0xd0,0xd0, 0xda,0xff,0xd5,0xd5,0xe0,0xff,0xd6,0xd6,0xe2,0xff,0xda,0xda,0xe6,0xff,0xd3, 0xd3,0xdf,0xff,0xe1,0xe1,0xed,0xff,0xf2,0xf2,0xfd,0xff,0xfb,0xfa,0xff,0xff, 0x8a,0xff,0xff,0xff,0xff,0x07,0xf9,0xf9,0xfa,0xff,0xef,0xef,0xf2,0xff,0xe8, 0xe8,0xee,0xff,0x36,0x36,0x39,0x8e,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x07, 0x00,0x00,0x00,0x01,0x87,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x85, 0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x07,0x01,0x01,0x01,0x15,0x06,0x06,0x06,0x68,0x39,0x39,0x43,0xff,0x44, 0x44,0x50,0xff,0x44,0x44,0x51,0xff,0x42,0x42,0x4f,0xff,0x42,0x42,0x4e,0xff, 0x43,0x43,0x4f,0xff,0x3d,0x3d,0x48,0xff,0x43,0x42,0x50,0xff,0x50,0x50,0x5d, 0xff,0x50,0x50,0x5c,0xff,0x4f,0x4f,0x5b,0xff,0x47,0x47,0x53,0xff,0x3f,0x3f, 0x4c,0xff,0x43,0x44,0x50,0xff,0x4d,0x4d,0x5b,0xff,0x57,0x57,0x65,0xff,0x5c, 0x5c,0x6a,0xff,0x5b,0x5b,0x68,0xff,0x53,0x53,0x5f,0xff,0x44,0x44,0x4d,0xfa, 0x30,0x30,0x36,0xe8,0x19,0x19,0x1d,0xcb,0x0a,0x0a,0x0a,0xae,0x01,0x01,0x01, 0x92,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x5c,0x00,0x00, 0x00,0x52,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x3e,0x00, 0x00,0x00,0x36,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x23, 0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x1b,0x00,0x00,0x00, 0x1a,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x00,0x83,0xff,0xff,0xff, 0x00,0x88,0x00,0x00,0x00,0x00,0x26,0x03,0x03,0x03,0x04,0x04,0x04,0x03,0x30, 0x39,0x3a,0x3c,0xc1,0x8f,0x8e,0x95,0xff,0x9a,0x9a,0xa2,0xff,0x95,0x95,0x9c, 0xff,0x94,0x94,0x9b,0xff,0x97,0x97,0x9e,0xff,0x9b,0x9a,0xa2,0xff,0x9f,0x9f, 0xa6,0xff,0xa3,0xa3,0xac,0xff,0xa9,0xa9,0xb2,0xff,0xb0,0xb0,0xb9,0xff,0xb9, 0xb9,0xc1,0xff,0xc0,0xc0,0xcb,0xff,0xca,0xca,0xd5,0xff,0xd5,0xd5,0xdf,0xff, 0xdf,0xdf,0xe9,0xff,0xee,0xee,0xf8,0xff,0xf1,0xf1,0xfa,0xff,0xec,0xec,0xf5, 0xff,0xe6,0xe6,0xef,0xff,0xde,0xde,0xe6,0xff,0xd4,0xd4,0xda,0xff,0xc9,0xc9, 0xd0,0xff,0xba,0xbc,0xc4,0xff,0xae,0xae,0xb6,0xff,0xa6,0xa4,0xae,0xff,0xa3, 0xa3,0xac,0xff,0xa4,0xa4,0xab,0xff,0x8f,0x8f,0x95,0xff,0x20,0x20,0x21,0xac, 0x01,0x01,0x00,0x4a,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x0d,0x00,0x00,0x00, 0x01,0x08,0x08,0x07,0x00,0x08,0x08,0x06,0x00,0x8a,0x00,0x00,0x00,0x00,0x8b, 0xff,0xff,0xff,0x00,0x84,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x04,0x2e, 0x2f,0x30,0x88,0xa3,0xa3,0xac,0xff,0x9e,0x9e,0xa7,0xff,0xa0,0xa0,0xa9,0xff, 0xad,0xad,0xb6,0xff,0xc4,0xc4,0xcf,0xff,0xe0,0xe0,0xe9,0xff,0xf4,0xf4,0xfb, 0xff,0x8b,0xff,0xff,0xff,0xff,0x0b,0xf8,0xf8,0xfa,0xff,0xe9,0xe9,0xec,0xff, 0xd4,0xd4,0xdb,0xff,0xc3,0xc3,0xcc,0xff,0xb1,0xb1,0xbb,0xff,0x9b,0x9b,0xa4, 0xff,0x7b,0x7b,0x82,0xf7,0x0e,0x0e,0x0f,0x78,0x00,0x00,0x00,0x21,0x00,0x00, 0x00,0x0c,0x00,0x00,0x00,0x02,0x87,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff, 0x00,0x85,0x00,0x00,0x00,0x00,0x82,0x06,0x06,0x06,0x00,0x28,0x00,0x00,0x00, 0x01,0x02,0x02,0x02,0x09,0x03,0x03,0x02,0x34,0x06,0x06,0x06,0x86,0x14,0x14, 0x17,0xc6,0x29,0x29,0x31,0xee,0x3e,0x3d,0x48,0xff,0x45,0x46,0x52,0xff,0x3f, 0x3f,0x4b,0xff,0x39,0x39,0x44,0xff,0x42,0x43,0x4e,0xff,0x4f,0x4f,0x5b,0xff, 0x4e,0x4e,0x5a,0xff,0x4b,0x4b,0x57,0xff,0x44,0x45,0x53,0xff,0x49,0x4a,0x57, 0xff,0x55,0x55,0x62,0xff,0x4f,0x4f,0x5a,0xff,0x3f,0x3f,0x49,0xf8,0x2a,0x2a, 0x30,0xe4,0x14,0x14,0x18,0xc5,0x07,0x06,0x07,0xa8,0x01,0x01,0x00,0x8c,0x00, 0x00,0x00,0x76,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x51, 0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x3c,0x00,0x00,0x00, 0x35,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x1a,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x09,0x82,0x00,0x00,0x00,0x08,0x04,0x00,0x00, 0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x83, 0x00,0x00,0x00,0x00,0x83,0xff,0xff,0xff,0x00,0x88,0x00,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x15,0x01,0x01,0x01,0x42,0x1e,0x1e,0x1f, 0xa6,0x65,0x65,0x69,0xec,0x97,0x97,0x9d,0xff,0x82,0xa6,0xa6,0xae,0xff,0x01, 0xa1,0xa2,0xa9,0xff,0x82,0x9d,0x9d,0xa5,0xff,0x19,0x9e,0xa0,0xa7,0xff,0xa4, 0xa4,0xab,0xff,0xaa,0xaa,0xb2,0xff,0xb0,0xb0,0xb8,0xff,0xb6,0xb6,0xbf,0xff, 0xbd,0xbd,0xc6,0xff,0xc2,0xc2,0xcd,0xff,0xc4,0xc4,0xce,0xff,0xc5,0xc5,0xcf, 0xff,0xc4,0xc4,0xce,0xff,0xc2,0xc2,0xcc,0xff,0xbe,0xbe,0xc8,0xff,0xbc,0xbc, 0xc6,0xff,0xc1,0xc1,0xcb,0xff,0xc5,0xc7,0xd0,0xff,0xc6,0xc6,0xcf,0xff,0xbc, 0xbd,0xc6,0xff,0x9c,0x9c,0xa3,0xff,0x55,0x55,0x59,0xe0,0x0e,0x0e,0x0e,0x9e, 0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x1f,0x00,0x00,0x00, 0x0b,0x00,0x00,0x00,0x01,0x82,0x0d,0x0d,0x0d,0x00,0x8a,0x00,0x00,0x00,0x00, 0x8b,0xff,0xff,0xff,0x00,0x84,0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x04, 0x04,0x04,0x04,0x4d,0x37,0x36,0x39,0xbe,0x67,0x67,0x6d,0xee,0x96,0x96,0x9e, 0xff,0xb9,0xb9,0xc3,0xff,0xcc,0xcc,0xd6,0xff,0xd6,0xd5,0xe0,0xff,0xdc,0xdc, 0xe8,0xff,0xe4,0xe3,0xee,0xff,0xec,0xec,0xf3,0xff,0xf3,0xf3,0xf9,0xff,0xfa, 0xfa,0xfe,0xff,0x83,0xff,0xff,0xff,0xff,0x0f,0xf9,0xf9,0xfa,0xff,0xeb,0xeb, 0xee,0xff,0xd6,0xd6,0xdd,0xff,0xc4,0xc4,0xcd,0xff,0xb0,0xb0,0xba,0xff,0x9a, 0x9a,0xa3,0xff,0x7a,0x7a,0x82,0xf7,0x4f,0x4f,0x55,0xe1,0x26,0x26,0x28,0xc0, 0x08,0x08,0x08,0x9f,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x45,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x03,0x87,0x00,0x00,0x00,0x00,0x8c, 0xff,0xff,0xff,0x00,0x85,0x00,0x00,0x00,0x00,0x83,0x06,0x06,0x06,0x00,0x25, 0x00,0x00,0x00,0x04,0x02,0x02,0x02,0x16,0x01,0x01,0x01,0x32,0x00,0x00,0x00, 0x57,0x00,0x00,0x00,0x79,0x03,0x03,0x03,0xa2,0x11,0x12,0x15,0xd2,0x64,0x64, 0x6d,0xff,0x4f,0x50,0x5a,0xff,0x3c,0x3c,0x49,0xff,0x46,0x45,0x53,0xff,0x40, 0x40,0x4e,0xff,0x4c,0x4c,0x59,0xff,0x7d,0x7d,0x86,0xff,0x71,0x71,0x7a,0xff, 0x10,0x10,0x12,0xc2,0x05,0x05,0x04,0xa2,0x00,0x00,0x00,0x87,0x00,0x00,0x00, 0x74,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x50,0x00,0x00, 0x00,0x48,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x34,0x00, 0x00,0x00,0x2d,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x19, 0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0b,0x00,0x00,0x00, 0x08,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x82,0x00, 0x00,0x00,0x01,0x83,0x00,0x00,0x00,0x00,0x82,0x04,0x04,0x04,0x00,0x01,0x06, 0x06,0x06,0x00,0x83,0x00,0x00,0x00,0x00,0x83,0xff,0xff,0xff,0x00,0x88,0x00, 0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0a,0x01,0x01,0x01, 0x1e,0x01,0x01,0x01,0x3e,0x00,0x00,0x00,0x6b,0x0f,0x0f,0x0f,0x9c,0x32,0x32, 0x34,0xc6,0x5d,0x5d,0x61,0xe5,0x81,0x81,0x88,0xf8,0x99,0x9b,0xa2,0xff,0xa8, 0xa8,0xb1,0xff,0xb5,0xb4,0xbd,0xff,0xbf,0xbf,0xc9,0xff,0xc9,0xc9,0xd3,0xff, 0xd3,0xd3,0xdd,0xff,0xda,0xda,0xe4,0xff,0xe0,0xe0,0xeb,0xff,0xe5,0xe5,0xf1, 0xff,0x82,0xe6,0xe6,0xf2,0xff,0x10,0xe4,0xe4,0xef,0xff,0xdf,0xdf,0xeb,0xff, 0xd3,0xd3,0xde,0xff,0xc2,0xc2,0xcc,0xff,0xad,0xad,0xb5,0xff,0x85,0x87,0x8d, 0xf2,0x55,0x55,0x59,0xdb,0x28,0x28,0x29,0xbd,0x07,0x07,0x07,0x95,0x00,0x00, 0x00,0x70,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x82,0x0d,0x0d,0x0d, 0x00,0x8a,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x84,0x00,0x00,0x00, 0x00,0x1f,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x3b,0x00, 0x00,0x00,0x69,0x02,0x02,0x01,0x92,0x1a,0x1a,0x1a,0xb7,0x46,0x46,0x49,0xd3, 0x77,0x78,0x7e,0xeb,0xa9,0xa9,0xb1,0xf8,0xce,0xce,0xd9,0xff,0xe4,0xe4,0xf1, 0xff,0xf0,0xf0,0xff,0xff,0xf9,0xf9,0xff,0xff,0xfc,0xfc,0xff,0xff,0xff,0xff, 0xff,0xff,0xd9,0xd9,0xe2,0xff,0xb2,0xb2,0xbc,0xff,0x9e,0x9e,0xa7,0xff,0x80, 0x80,0x8a,0xfb,0x54,0x54,0x59,0xe4,0x27,0x27,0x29,0xc2,0x09,0x09,0x08,0xa1, 0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x5c,0x00,0x00,0x00, 0x52,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x02,0x87,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff, 0x00,0x85,0x00,0x00,0x00,0x00,0x83,0x06,0x06,0x06,0x00,0x22,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x3d,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x79,0x6a,0x6a,0x6b,0xd4,0xa3, 0xa3,0xac,0xfc,0x58,0x58,0x62,0xff,0x7b,0x7b,0x86,0xff,0xcf,0xcf,0xd4,0xff, 0xc8,0xc7,0xce,0xff,0xcc,0xca,0xcd,0xf2,0x3a,0x3a,0x3b,0xb3,0x00,0x00,0x00, 0x68,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x47,0x00,0x00, 0x00,0x41,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x13, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x83,0x06, 0x06,0x06,0x00,0x01,0x02,0x02,0x02,0x00,0x84,0x00,0x00,0x00,0x00,0x82,0x04, 0x04,0x04,0x00,0x01,0x06,0x06,0x06,0x00,0x83,0x00,0x00,0x00,0x00,0x83,0xff, 0xff,0xff,0x00,0x88,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x32,0x01, 0x01,0x01,0x46,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x6d,0x02,0x02,0x02,0x82, 0x0a,0x0a,0x0a,0x96,0x15,0x15,0x16,0xa7,0x25,0x25,0x25,0xb7,0x36,0x36,0x38, 0xc4,0x47,0x47,0x4a,0xce,0x54,0x54,0x58,0xd5,0x5f,0x5f,0x64,0xd8,0x64,0x64, 0x69,0xda,0x65,0x65,0x69,0xda,0x5f,0x5f,0x64,0xd8,0x56,0x57,0x5a,0xd3,0x48, 0x48,0x4c,0xcc,0x37,0x37,0x39,0xc1,0x23,0x23,0x24,0xb4,0x11,0x11,0x12,0xa3, 0x05,0x05,0x04,0x91,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x6c,0x00,0x00,0x00, 0x5f,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x3c,0x00,0x00, 0x00,0x2c,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x03,0x83, 0x0d,0x0d,0x0d,0x00,0x8a,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x84, 0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x1e,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x63,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x85,0x06,0x06,0x06,0x9b, 0x16,0x16,0x18,0xae,0x35,0x35,0x37,0xc1,0x59,0x59,0x5e,0xd4,0x7a,0x7a,0x82, 0xe4,0x9e,0x9e,0xa7,0xf0,0x6c,0x6b,0x73,0xe8,0x2e,0x2d,0x30,0xc7,0x0c,0x0c, 0x0d,0xa7,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x5d,0x00, 0x00,0x00,0x53,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x3f, 0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x12,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x87,0x00,0x00,0x00,0x00,0x8c, 0xff,0xff,0xff,0x00,0x85,0x00,0x00,0x00,0x00,0x83,0x06,0x06,0x06,0x00,0x1c, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0b,0x00,0x00,0x00, 0x15,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x29,0x01,0x01,0x01,0x42,0x00,0x00, 0x00,0x63,0x05,0x05,0x05,0x8a,0x0d,0x0d,0x0e,0xa1,0x1c,0x1c,0x1d,0xa8,0x24, 0x24,0x24,0xa4,0x10,0x10,0x0f,0x97,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x5d, 0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x33,0x00,0x00,0x00, 0x2a,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x17,0x00,0x00, 0x00,0x12,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x01,0x82,0x06,0x06, 0x06,0x00,0x02,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x83,0x06,0x06,0x06, 0x00,0x01,0x02,0x02,0x02,0x00,0x84,0x00,0x00,0x00,0x00,0x82,0x04,0x04,0x04, 0x00,0x01,0x06,0x06,0x06,0x00,0x83,0x00,0x00,0x00,0x00,0x83,0xff,0xff,0xff, 0x00,0x89,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x4f,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x60,0x00, 0x00,0x00,0x64,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x68, 0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x61,0x00,0x00,0x00, 0x5d,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x4e,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x0b, 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x83,0x0d,0x0d,0x0d,0x00,0x8a,0x00, 0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x84,0x00,0x00,0x00,0x00,0x1e,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x1b, 0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x36,0x00,0x00,0x00, 0x3c,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x51,0x00,0x00, 0x00,0x59,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x73,0x00, 0x00,0x00,0x6c,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x4e, 0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x38,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x1a,0x00,0x00, 0x00,0x14,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x88, 0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x85,0x00,0x00,0x00,0x00,0x84, 0x06,0x06,0x06,0x00,0x19,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x07,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x1c,0x01, 0x01,0x01,0x2e,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x53, 0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x4a,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x18,0x00,0x00, 0x00,0x11,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x05,0x05,0x05,0x00, 0x82,0x06,0x06,0x06,0x00,0x02,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x82, 0x06,0x06,0x06,0x00,0x02,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x83,0x06, 0x06,0x06,0x00,0x01,0x02,0x02,0x02,0x00,0x84,0x00,0x00,0x00,0x00,0x82,0x04, 0x04,0x04,0x00,0x01,0x06,0x06,0x06,0x00,0x83,0x00,0x00,0x00,0x00,0x83,0xff, 0xff,0xff,0x00,0x8a,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x15,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x2e, 0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x38,0x00,0x00,0x00, 0x3b,0x00,0x00,0x00,0x3c,0x83,0x00,0x00,0x00,0x3e,0x0f,0x00,0x00,0x00,0x3d, 0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x38,0x00,0x00,0x00, 0x34,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x26,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x8e,0x00,0x00,0x00, 0x00,0x8b,0xff,0xff,0xff,0x00,0x85,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0f,0x00,0x00, 0x00,0x14,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x2a,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x38, 0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x41,0x00,0x00,0x00, 0x3e,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x22,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x01,0x89,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00,0x8b, 0x00,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x1f,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x18,0x00,0x00,0x00, 0x0e,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x01,0x9b,0x00,0x00,0x00,0x00,0x83,0xff,0xff,0xff,0x00,0x8c,0x00,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x14,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x1b,0x00,0x00, 0x00,0x1d,0x00,0x00,0x00,0x1f,0x83,0x00,0x00,0x00,0x20,0x0d,0x00,0x00,0x00, 0x1f,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x1b,0x00,0x00, 0x00,0x18,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x01,0x90,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x86, 0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x18, 0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x1f,0x82,0x00,0x00,0x00,0x22,0x0a,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x11, 0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x05,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x8c,0x00,0x00,0x00,0x00,0x8c, 0xff,0xff,0xff,0x00,0x8d,0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x12, 0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x15,0x00,0x00,0x00, 0x12,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x01,0x9e,0x00,0x00,0x00,0x00,0x83,0xff,0xff,0xff,0x00,0x8f,0x00,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x08,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0a,0x83,0x00,0x00,0x00,0x0b,0x82, 0x00,0x00,0x00,0x0a,0x05,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x08,0x00,0x00, 0x00,0x07,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0x00,0x02, 0x01,0x00,0x00,0x00,0x01,0x93,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00, 0x8a,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x06,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x08,0x00,0x00,0x00,0x0a,0x82,0x00,0x00,0x00,0x0c,0x06,0x00,0x00,0x00,0x0b, 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x01,0x90,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0x00, 0x8f,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0xa0,0x00,0x00, 0x00,0x00,0x83,0xff,0xff,0xff,0x00,0x95,0x00,0x00,0x00,0x00,0x8a,0x00,0x00, 0x00,0x01,0x99,0x00,0x00,0x00,0x00,0x8b,0xff,0xff,0xff,0x00,0x90,0x00,0x00, 0x00,0x00,0x86,0x00,0x00,0x00,0x01,0x94,0x00,0x00,0x00,0x00,0x8c,0xff,0xff, 0xff,0x00,0xb8,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xb6,0xff,0xff, 0xff,0x00 }; static const GdkPixdata display_config_pixdata = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 29807, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 720, /* rowstride */ 180, /* width */ 60, /* height */ display_config_pixdata_pixel_data /* pixel_data */ }; nvidia-settings/src/image_data/nvidia_icon.png0000775000175000017500000001536712236467170021713 0ustar albertoalbertoPNG  IHDRLLǗQ+tIME ּIDATxytW{5^ɲqlDZ;8@`AhCh Mg1{4sBH!C(y,[lǭ+]ɲ@0o֪UN:9`FfdFfdFfdFfdFfdFf{Q=/.?_HwXϪ1S> ,B)&pP@.!w 0Z^[&DD ,IƟ)%hWj:֒o헄u wcu;*_ax0?YY&!42 R&`d,Tia g10W&jӨ»Ԕ;˄"h )J)pBj],:/ ^3aM \ q bPS7!(^e LTc3=_0ƒ`R}B0h kk (yU3:H9W6 k2j 2}qK/ ]aI][Kܵi* @(jPP%KthL?dsF2ŝO$n3/70e0{`aյo-女 C /Rˏsho1Ni[)P KM#MadS34Sιj[o))|W$\2V qFF3pxNH,OZՔ̢1RμP I9ulS-[x|VZ ׼ AG!CkVa5L-wᄊnGc,3dh9?JG{à F)iOGdD3d wHb̴jTX)gYj8ΗrRsӝ,8R&IΫUL=A(P@[o}1SѢP ѶlGNTj<:Z؃Y;{r,1riǿ=f#nWaD$ulvPd4|Vـf4wy)kL$xz¡ҹax8u'3KMҝIp&`dYJ/4Cp?}[N2h❇/޳{bx*nV0b =waY)Ј`b9Fwp|O|_yxmÕok%RT Eoo> '$}'zY^3tV(^zD}2b\tQ#K.aɒ|քfKPvloܷP 4^6^ݖRhY=Ɓ4Y hg "\%&@a"Z|Ηzd:?چe vģذ itc&y4IC;YNJ2k‘WlXׯ,2>Y;鶴5<$P4ԲG({[39bHi$hl4N6F~30sX߉d(c/ص7;S<ֺC6mO{vwGo «p_᠝aDm|AaM4yۗ񦥘>W{:wn;6E@R,ƸAnpn`%uZ&h4YO{ʄLV*&{؜_~zcַv,nQ|~2MI9e1ã[Rg!Rsm;-Mi O6h\VF[̉Qvqy`2qhλv q@?ZAEL/_][;o=O{Fuܕä4&̓U.V8dǿԸAu?μ>Qk@w-?kG;: p !PUK6-OiMӒ`sNq,ޯTqOeC۶Q vk磩1uZKeC ۶ɿGl55`=yb_~ ])hه:ioN{.ps;@0w?\xխ߅5؞A3ep#=?\я\uWhMO;K'h*TUViX8gn3w,H0dTwlֺNƙ22 B ˴ײl\xndˉ}~qK%㎫&p3xw#6W][8%LM/C9S`g>ƣˢ*&NPJZqyf0 @ҵ7m%Uf{o1.L&ښFKG{E˭aQx y ȼ5Ûo,eI8^+nPV#s/ -.&\2IY #RYNIC=v?54p/ t{fWlPq(]zew|< .tV/P-ν$:@g5 :1\"U~ϝJӁ8un_=:{0VJQwq$Aњ6`"78vto8 އ V>1|Ȭd=io-Z{}zG]_խ6ߥmm? M[^W 5Xt -$[k=Rs鼧w֓S'rl{$gSZmRVJ6T58 . pm2'/)o Qm3[,oZ~/|[+ ?(R8C})^|xĈ0oo0Xy_je{G!oe6lu&/9f"Sqm-ZgCZ"Sڲj똼zc|Xkh!Q -P;dGfEs.VW,XkF׀@>}4#-uKFy?"hG >|h<k5Vhi5+~\GshP)^ĵ|gkiio8}'%SX-/eVa,R fQjؐHYݥruM HC 3&5kuS!5gﵪg2 v~a$ /5?'C4=wOk]cm.YUh+O9ϦC<բ,yN v=';~3}L.ޠ6Z1ǽL"HL 7S#=åfy-!TȦuiVU`&6ouB0GIQT3V(,is8TLt5JKu֛FvÚ=gӢ*qHD*UPiڀ;';䀙,0,_"x@)Ya281)h)R.Q8Ҏi/X+sqgiXM 4?{\.Nq~y%!A n|f&t٦$&@FԀvYEAk`E\ϟn~Z[{ @ʟ]Fz #= .zo70LcV\Y<x4ond皶ʷ3Iv7MzLV)u*RN$9]ku;ɜ^NI|A"b(e >BڕnHāt*N2PCJWT>,.;\To^<g@=Am?կ ً(5P(biRl@> &dn}{ZLUF"#zMS^' Ens |+:6QnVe-4\6brVDcRBVh?.T.\6?_|| Ekwz$`7w68YF:x^s =*K7Eh|ɂ9;D L*ʫVA;4)΁$GX;ų(.T^;/5?+[cH1 .6ymnpsf$Se= &Xko7]" FvePعsIVv'ג@sI"C GmAj(* O~Gj>bsUi5~rmuLř:93smp293$ 򴍜imcg_>^t^g,\јU=4Hɫd= N&7 'Dų+VpKl*!T<3*q8@Mq5a8+1D) 6ݻGM@MC H@"`{7?~>1|,β{>e%-J ߿cbbbϯ߿3x鷑(q=kPT[ ?qe3H0112pq3132O^pI%@  *J\z_O?`@wE)?; \@b$OT@C?Z@8Aěo~Q'?2|_0ܺ~f?~`ސd_` J~ǰr*_;;-?}fP}떰Wmy+׮wvq9nxToN%1gϟ3*+w@ {M}ރ +@.,btyݳiŚu%LܾW)P& r0<~±Sw.˖^YGP']@@AG[Xh833$ x _~屓~d83HgW7?/<+r?pvF(? ÁeO_EiqH=4eY5b8?pnn^^@`t ׂ\o;!tB 7#[ˆ)%0 Tx!P2C Hu {;Zر&(:;Hjc*Xآ/QKQgm}TZD⻦JIjۂ((b~IG?f7L\ v2lvν3;)*P?o%adUE[&+",b:ғf2`C=l7{+ ϭDQ:ʔW4TǺl.U*X4Śxl49e][?dwB߼PJ_ O ah)sq13W۽Pa 9b3]JP9l?`b8~{?t0K+ی,$mnJX|XCEh|q&&K3)(AR˜D3eAƃ &6+m]{}=톼IINss߻{:d3tLxބ7M%SY[w3 RfQ?̞˫~ڙm{z[@S7T8 iH$r?N aB}ц.ɖh48k1x`6y-27ߩ' $xNqVq9#_ &` p 0W ptc=AfTc7BO~"p?@DT ೉d+t졁V55]Y߽g  C: d"u ױkFz7a pzS[[#`I&7> nHEZ--:HBZ].|h2v Gx5곉R}魱PdeUߡ(9x#Np:ΕɤÛYpml` 7el[t*ߎM;J!@dMBa{O][lxk˾˓~b~VUc]JQ ;GwܣraDM,6='SW_WpԔJfh6Ga~y9Ĉ+~q9v.xAJȴ>ruUa}RV֮Lm|H#>(x,\51T,uCLIg|<:8ϩx*J)1%D4Vgd(4C 3Pgǎ2dѦot^ڤS}}}$,3=5{<%&>]i  ]4l,a񷳬rPŨNR sWjCſeVI|% HxmNm0/ҹo;k 59~'ڣ̗:T 2uOoc›&SM6"I$Q $`lqBH@δe2U@Q[iXZf " *i!|Lk[4.I6>z uδwg{{9@'9^W<=TFc*e`Re[+eMOCTX,oYիt]x)N|MM,7Rоoy%O$Mj6OCMuhWף=3p0^M k^nNM 1cXmMM_;#6fW?lfY`X]~H$`|mLЕ͏Λ?]ݻWV&ɕfӶ̫v%ؐb'b>(x|͛\ȉpa,Ud0-^pmcQB& QˍXEpD48Y,gB`eK&d

72PꮒT:_kkk_@{{{&"$uKt9Nw#.[9VM=\v[?L߽|j񢅯q#$J(׻ymn3!;Μ`fٛkx[]]=fHvnN.f1@{#*/AMT D%y>}\IwrߍB΁%_(--zeƢ"3i,>̳~硇zp~~P ޝrşN-D`#@I;IC긮+;ېs9ÏJo_cC6I. `Ԇ@Q%XTKt'o@TD2txtJII?ٳg/νԩSoߺmE%7(b:\\r_K{}=;&`G\ y&qnN?2G!)$hXt.wIs^*!CJ9b%é7kvmlL ЕNJ~ I[>WTa#c-&Ceт',\X'x_^VṔ'>g pZ;xnС~e/,97b\=& 7;3tiXoo/VH\Q. Zizk s ^H{}}}m|"+*M9Z0 /凂{z?o4:MM6Cxy#]wAcM 3ʦM*/[~};Tu)P-k֬y}H!Rkk$}rfsŞcӦOrv WRn-&ÏW6j;vۆ^/ϟ@W(`"]|EEKJ X"<2q_z|fȶ&6:4}\t]~G- c>4<}ڴILmmmuߵn'teBD1Lf)Oǎz ^n:F^IAޢt.yԻjjjLO3 n;R~l~e~.b78 $ՈM, 9*S02ɓ'9N5*,(lL߸ ]I19gɂ$;Ӄ[ͿwpfXN&1@zx]J~[[}mъ780 qu!JCzU'@T*6‚ɘ W֒t6޽{Ȣḏ!y (#dg@TvA*Waa}^ aA6?*-m97., j)Q>FeLƦwc+Z1ËW.\ 55@rI{L <`dWҌ ;ۿAjE#aY8g{ ?1=vnN k~`h to_3}Ⱥu[.ê < yۙ_N>~֯͜XY *̐//3#1Ç_ vN[ؒ;#߄ Gk~o_`cSely7G_H?85Q˛+1\[l-k߾!Mü<6l3>y0maY-f| ?t UG.;/oSeY^]'``fdm|OLP!Cf#@,$(s-KfCh`#CrGB+ 0+BZAilA1$riб1iνB|8~#Ш[n$d.(aeRVWHJkS%ɍeA]F+oXe~ٶZ{@h(;1~%2Z(aW/ii]YkUrh"U8LgRF2 m#˄+9y$A) H4>uҸU#|nBNn$^QFiC.EzUe5c.efH2KsuMϔq;o]z2i/Wq̞WpKukJ)_{-] |/rA]G~8S8Tzf[2[mI7"ybmXSM}s/44{~rdt72G7Ը~xg{+ g=)aKY5G\l<)kiPuy>-Sz,4-ʮٟ-{b.nbv_߱D{/_ j$NkZ9PW,5ŨZDZuJf9m}fI07./CLvfΧۉ I")KUu}k3Tؙj8^8Q.Gʫ5(2 ?+˺xI .xMTԩ1lj&u҈,_ٌVR6@ cȚŸ.eYw9o?83̜3><{-`˝,N;y$]0uO\b0!=vI4{B Z;} m<؉S&t#c)'½-oPkq.~4^n ӑ| ꆹφ 9Q2R_ 2@Z`=--e}RP>Olj1/޲jf+b)u@C ER೪sl{>k8NoIi-9,79T1CbdrZLfGEOZ#c,滰((r=$;{ٯV,-*\FS<j(8 j*NN/.X(y)˘E(,G$azvRyU:-[ưvSkk¿ q/Eٗ?ȾPov9=9Y3md1tݎ`9&)̟XaQ![8KJS2|Ƚ8{W&O*SX<z GL J@ Q z4H!eHX&ZA,UQ`ttG %pfqoHzs̬t5RΎDŽ ╸gif$-.D>UG O  \ ~~ pcx'٠F8, x0vfW$FvV,>w:Mem?V)`W޻XMWQ[ighIX nEPA#C6Wloi} d]FV$@! ض1 oso%Ct: 3LVH}OuutgXa=..C!7<* Rsy'Ƹc!Sסg |R.wƙlݣIh-_9x<9@+ۻtBG5\qyh/!nXKEσ2_@]tH=˱=k6Xo4lJVGe@ lC|8PWͳL@L U@ Uw吐 Z$#+.~eҍTݴ\J"By ZPXJM}w +i<ʫs+e'gCS zhdr览J 8?S_l!ALXvK*- O4VÅsgCHOá B 7_U0UTþ5gh`͸9./0=,G'f%%H$G0$)<'~R|ZҸs&p ^7`/Vn}5! ܩ.;}pCnI!sH NFVZfGZσXkNL@#1OJ Y\Ox)d!0} )&qDGQ1^JAfj XO)fJcE"Qƿ,ڶ~QFo&NFCf:ZgvEnYŲlɶlY$W'v/$B/!@0!Ch_ .`VA.r,KZՕNy!N0j}߽?* a N_lhp5\ aUHÅ-bL^*^PɨԒY!k*~Kc`$H\7oZ`Oɛw59#SX0Ax猪JьTS]H^1tKjӏjp ăNFk%BIȫoaK W3 y{vGJw*PEX?'KrF/~2Zq`g3aB%FE,dD`ghDZEcY}2\dg2FI!tpG4б ,'֜3Yk#ŝ9]6*Aϕ|=B֘* :` ӆI~28 ~`0mZShM\i2$aiV`$n(* =YM_V(H_6`>gmh""҇9XKBh#PY^U@p- YH FםF@YCp,|pVEY5 {eXTuY9i,/+`\an%&fңѸѲ`f$uC;a$VdV@@{Km=%:Pqge6$ws#g%3I)&2ZBͧa\A$~?E$~y|ֻ_XV>) q>bVGmg헒u@2^ >,/?}fMnzlf I&I^;F :u$LDCr/f<98 _ THn?ܷ3u}_c dufȍD|߬U_;?[ՠ9*V/ -]#f%ʧN"xw[:W d`~5&cAx gzV$tg0,̟_R׭}mo޼mJWdUÇ`lʏ"OJR\]pp:[/\3g{\ur* Ъ2NZ: W*M9$KOQ3#k `MӪ+uw<yٙ0jTRǏ^h#XnTRʔԤH_x.ΟEhJ`0M"CU!'_GB%z`(iʊyiƴ?jNkLNU,.5M0BX$cY}H/s!]tgQ墱 $Xp ;rc 't,ipqFClg<~2-05_^Si_S f'OVm Ӧeev zU"IO&x.H8hpxXNx"(nU{ D 9`uzQH&?:W0>np/练cM` "U0Yly[B0j۸Lz31AXB?feGTV3ÛԽ0|cbj/@f{)c`)0IVwp5r=o/!qP̟9]49e91mE^"9@WYȎT׻C!F_8y1d6j)Qƅ&spK'z:31˥wʨg\Oj]Ty9,CPf?4QB<[G%ᗷ.厛<}Ak]r'l`ea9iV oj;AD$ %aHFXiM!]p7!q!({h@yok^Qh\Bș<|R ƈV* E$Q.X RQ٤c4G2Љ!OGc=X^J2ls7VUdk.k^>ffky|+Z?|XduNKɚ2x@GR83x'+D d0^y\h}&Qk0Y$x~ʃln=&/K5]F 0l"204vkx3&D/\C@-=fGnGj h\uc^! 3\6P^<`*DLsw\Sz؞])ڲ9y,'UoX fdq#(/Hy] ;__VhaNEeq;=i#Yc^_a2[`rQp%oYРt.{H*hܙŔ³~8s{?SA)9^eRj D cQWSL CIҖc\S\=9$j*[F+zV0e&%m7?nę:FX&|(#EdsٞRq-& Mm6yHGDs{J ǍmTÃ-f^wgyu~o66'Zfd#=SQ&~Hgoۙn I.-[s8,uyS^3wWcb 8ViwW찢ڂa IvR4.v-:9~h[N_ɏ&yv>_2'.WVLh,  F `un}(/`p ~ZDN::KiIYE~5Їв: ) CiÐ%ڙQi108{9%59:8ռh;몲jIeM+iL$ d 3 $)aunlJbI$YvϹɍdײַ{콿oo_ua|xX(&שnhk)^y{1VQe X[(p{c3],L!b O0z(?7oR% ItUBN|Y~䂮ff_FNM>W>1d#MPcgG<:Ց7@pV &L=~'`83 $gjIzVL1YtMJ8v{}IkĜ)4Y"%GmpziPcҢ!a Ǧ9]AbqT{Ul]aa>e_NΒixm$<16 B:-?@kF:,3`56z_6M/A w}VR2X ;l8!?BE%GI)kh[ o/{ܼ :BU1Ƭň)@6/z }cجf1%^K`~kC36eN0@ 9,8Os?oqń Bùj?VDȢt i ޸i:l_\B@M-7m?8*%Bx/8tj>!y I)9P G:PS6x*7F6*P_b0 O8԰Dx޲k sg5HS$d %2FMN-7ץo Ve;>ixiߎ_oX?62xl!瞳2P.$#1^)JI㪔(R<ȉbFyF]JDSvCNvKp/]mVZfMdQo9sgޛ |ݯg=/2.,tiZiJZ2|ns[?/PlÆ5m7WX?iUspN>&y)kf ?aѰͱlro|t,ί[lm$I _Dp:烆A% tdBOG/{?W3O9\ɿ^F2+٩$PBǠxUՆqt~X`cfuQO8R2uqK <&wqqٚ#=x?4^,$=l&xthGU2kW ]:%r +(?b8Fd~5zYm٠S]q-5,C/q GWD BU)σipUȒszehs"n*KM̆fG-#%^1zmyic&uئ}­H&FSRTZ+H:B*_kkƖ;5/%ك64 v@uӧZ2\/k's(BH @&X]t@Es 岂AZָ塅[{EW'«$uc3K7(0*ٺD9Vw)]XiuWkzB.m c*3K"%H7 I'edE}k`a}WXPذ~!<7g,;eB;}w\aD^,, F!PKψ;{K3a`ۭs4M]lMqLa/^1mÿ)=ԷD(r$Ɍ'n/:1P8_\<ǯh{e T\(1 jVg9Q҅/.'vAN,k mbt?spsS<:j1M9e5$rϰ *)dyj%j~!#?Y*|4JP?q>3 #cybɆ͔No()&Q։Qe極s7f$@dGF#q& Q`:6&m=NžL  ߟF=qnd4׫@e_Sڼ]'ͶwXxL1XD3:4#c3RcR.ȵ*2P/:c=85ΨVEs]p P"F/ 4M0& Y bc" JY M 1zVAjP=DMɩ-V V16yF~B<;QKG?HJ\*6gf:+k/K.MYи6r\ J&=k N6k٤zk0*A0q~4t{/j[`o G`1I&~m~T1]t+(SA?cw"䜂+u"/[#@XQ{՜[؏uƧꎜ*(*$f6vB"2>&g94'XoGRa`V:A8񙈪qeX\4 ٚHX:8K35 Ѿ=>E[?YrKܴ8Xp)Gq5>BиCi6L\ZV:N\̓<"If%)b1rAcDɘk?x NpXc/4|cڰr6mζ2Ne2zʓ믫졳k`8 ln"^EPjZ؄Mȭœy.x04 p`9)]]8 w_gEcTE3m| 7\N5v\څAfրՄ`-Clx[jdC-Bf*_ bC]lߊCGwmsbU? {Ay`}\(p "G3U4y͖1 6 ?|ƛ֭_ݱ_"E3KĐ1͵rML>|E685JWmW6CIPq$v1 =# ~њ_.7d/"1!% rL9g*?=W`#ek:^uOG΃ _qa`MU{fוtz2O KB> GH1#ZL\2`z!9^!!B[v'0"tـO$L T*{(sjܺ-vjBfߴ  wMӎ_TG} #{+ n#/7O=PB$l/_s0,_wLs_XWJ@)pɉx@֛&r[EF,?ϤH<`fn;`"+5]_(3gCsFׯ_ۙӧ]^VBu5 IJ2c 3Ms 4'IۡPh7ԝCpo*++ۧr(I(!D 4pvBpY$iI7[:狈$=jx`[x64%@ۋU@THEQ|^D09hFUՃo!͚o >W8jڵ7uvvm(/sضm5nļy P"C4Ȋ JbGsNq`2dUM; >s{B@>oKΙ:KUUppPB9o~joe^ŋ.C.c i ""_ȃEQuȲ B i7i1BHNUpUA_mll9gK.Dzg>}WUW9@wXqaݾTQp@ UUdY%~#VLP*d~M_$3o`sqȢE@xUv9\bPT-XaxGb{Xaf2( D@UTHd×T+jg0 s B"諄fΜFg+Vŋ, ,@)i8xFFF1g`<˝6;? 0eIg/ AUU10s@BVӵx|(JN#BȢEUVʊ &!@ՅVTTT!ɒ]mQo#>Oܛ)NɠP(PCUUg8oN,731Ji.UU\[[}!sErd0 (BU( AA( Gθ!R& DdYR_~YEYp_V::2rC,աhTWcƴi| ڹ0 8WI<0=J`&, V DA?]):Ɂ5Q~ $qi>r|!MMM¯WtW/KJJv``-'ZQUU:DQq7"  E zM|KrEU=(PWJK@ʼnz^'w$Wd6 v%BlY$I(D93l04C)͆Hl.e"ӎde`XܢࠄA}m-$;yr^ lp C,#~ᏹg"BsuN6i UU!K P!h`BL3'J滿}׏;Ɯ?妓O7ǢQAzP]]Ȳd"UOE3p$W`P|:p_r8dI$In3#JC!=d(  (|p8-Z(l~jq*wyg)0 ɶSFG6T9qNBD7qrycsO"8$d5Lӄȸ׀1qWhRg_Ijʔ)Di 8+%%s}Rq^u^.y'A+ىm;ADI?sOǁ'c%8Ci6}*0}tTy?Qщ-[6Hla@dgg'!֭#MMM}{Z4.gJg8c&¡Z gD`&G0$IT@$DZX~-TE][݂X,#}2$9 @4CUeN%-;Pjq"ow{s~4t"09oqc]sg(VK&EGg'Behj7Găl.6m9'׋Q0n)/]4^st]G:F6Ŧ-i&b1,u9^O?-AA5&/`pI$IBāh}}jk{s~Rz0Lss3DqXUSSSw^I;B}ꩧW5O|>.L:,#,&B<&tEZ# ߼W^{ fJ T)|w`ksO;'}=H4M:|(Xz[CT7JdBlpB( @}}=DQѣ MSa&a>QJm۶#|~!0F?]b-[Fn|A!@7N9H$X< Elʊ[{ԂunEi!8w88xUlں~Ga=_}W/ӧobe!k Vc͋k~CEEM4UC]MFFF&p8P RfzϞEYignjiNὣGq $I;wdʲHSS/_%{Z݁D*N\a$G&0w\4ӌ7ƒKpnwbuti$G<G5;v|i|`ti'}#?q_ރٳf{L&ҙbh>t3 ${{{wL&Av *CqxLSU>rSʚ/8?9vޅO?]テd_ǨvWa:ap ߃G( f<^wAEy%}0^ q5Ca `a# CtߊUW?L&1ܜ;wEeetuvŬJYԪ2QWWL:m+rOOJCPna4uxPZZGW^BH!<g( `&sģ1|ƥ$ ;܅=]wm*˫Ov8:S*R)S8G[[b(dIF(B(r,xc[{2L)LCHSSzovw$J(L]XrP7D?0&H K:~sfxq6{}}8|]`<1|!UPY^g`ۖeϯ}~e)Z$ujk<굝A ysHʪ*8~Luuu`h9kطmuk 4G2L bCWL{0@tZT{ɤA qdiƽZ?[q{$ǚנ55z̞9 W]q5%|&ke87r5+AW@ L۝KVS_d"gΠ$Tt9gD@*];gٷ!C3;!;w$K,~V[&`phT W,84EYy=0ŸMY>  g}xBۢ$PhHiBdds9C_?-2̛;$wj>1ơ:%%8|Fcy`Z}2E17Iٔe˖{{zunPm<.XH؞d'O}E552"GGW'V~?!bo̚u $XdŽ)NYf!HPYYn߻A~1440$coٲe3BJL:\6M*-())EuUFFFqڜ~K8 aW_v7L `pxp+P(+._ L n mٱX `s3 kz;v69:: !d2Q1R_n]4gթRU9΍`h.]ccc%)mxdr"'79"P͛͏S'k:=r;w( nq4pI\v٥Pt-;c|"Z <u o@c,X~[#J`3uuwqg *"Nx0Mr!8~8B݊l}ck*9"?|X U7tSi6{8JUS]vY /@dI-8[]E C;y@$&!dB̅Ca]{tgVcJL6">FCTBkH$={_Wc--h9~%X 8Bs?,K.Dڰᕟt~r3 s#G&3)7U4G^d{ַN}NpacѠdB4l߱p5Sj-pk_?:q~y+GӴΝ;?CD?T7nxpp8 IGð J#1>d2|!o'CdniF;77};QI\8E&/>SY;h)v}& (n8Bb(J)JKl%nD4vo09wD y\>smm-24}׷A VJDMfZ{%(E:F*%4]GiI B pz(J[[`oU h@L-EP)'/q!Y71Lb2 8a혒$ bwcl1\twujjj+{DLQTVU"tqݠS0:6s#ȤӠ .ɲp$p8 EJiPAp;r&-< ܮroFם&,0dJJKQVZ=9EO<(!d>\6o='ID "$Iδ7P A xoq`Ak+&1:wjFIENDB`nvidia-settings/src/image_data/sdi_shared_sync_bnc.png0000664000175000017500000001745112236467170023405 0ustar albertoalbertoPNG  IHDR<obKGD pHYs  tIME 0q IDATx{x?3kf]VZ@p E*`KQ )Vm]۞nX+=Vmi[{tZn/էR/H"@ !ufǬ!g?g{g;; UBP*T UBP*T UBP*T UBB[ȡ` H$ $YoKa[*6>ow>41G.DvkT%R@ `N1nX $TPUˤxlэlnT|g F̙ !ebf2I6[RD#<ҦcwfTeSi}G~)ʃq=sPFϷ٥8 ~Dm=v@ p"likGXhC1Eb(BM )5SS-qN~ 0Bp(p˂k\4yB4$Iy  |~RhURfyM??!>x?c};&O۷ӿѓ#>i&K`HwطˁT]]y!r]F|p'M(8/,WUy*pjY,hF*` :Wixϔ3tex޵n @<*R4c [w%KǓKlv/W_yl6+'TS8rdAn 3_]Y7 !vbjaJ|JM'>p N# %>|sԿ$IzxᅗJ9k88~k݂nχ$IΝe)PRNp^;R(E35|B||` .! Sb 3dY0fYF3<0b/عs';w_Fq4 !/8sU* ?,X |~y׬[w%j*9s"I[J[YSHttd;upXIl_]]hnnrww_A|ԩAjEw Ӂ*mԸ zY E|D64'˅* tD: #D 1$`c2㓉z*p\lvۏpqLJD |+4^f._q*I\p$'NtagwxiӦ147 dHuǦMc"{L6X,N,{هӧ $q~q My[1"mBt2cQEeFQ'#C E$NKy6ܤ)$Cq07@o>Ͳe˘2e 6@ (TWiiܹbWl;H/(UVj*/_nBiXvz|>wqPUK qXS" /?a,]z!rSεOsXh!Kȕ^Rq`E㰪_ha-W!/8'X0ҙļykǹϥZ0LGŖ$P N0A}>=SÇyZm#_+`(:BnȆ#u p:ձi&/d2E2`Ɋ+"L59d.!$^/3fB[lH$r3s0z6m"1qbC^~&!JbT")!s3P^/?7iqaV/Y֭[Y~=wf߾}!XdΝKK,9g.55xD(t;WR*=3lܸ4ؒ;^ؘ tÀB؄G]Hb-沱O|l[XҁsV?ϮognRA5ªUrRY>^v?7s#oJiH\ql|1}w/2}zCCC,Zw4M$6n܈$IYfΟ1c$DMWEzo}[tvvrmL&W03b2{vM)^ -ARKP t6Un3wjAS=7s BG0k!O~b="HjIM^+ N_K" )g-!RJ钦ih.iN"22vt9z/i?#IPSSn#LaÆZ }dYt 2$x܌Jv EQuB4M۹$I., v\a\.@0u#IR:,{Q!{[CՔS{ "uqh2ӁY1eٚ ̐VKot viuӌT$^miFhLg'\ӧ?rIA$-:.#D^:CXdYXa: gײ,c",6m2/B$E'=,qsӜ?^{؏/)-Ň=bB#"?QW-sNr(`ͭcTΦb^vЙD圠p>FS-˪JP(E ˍifq|)KʌmO2=2Xyg>Svzǃjj֭Yf 7|oK.as9#x1Į]xٽ\.. ͊.c֬Y5U=H20R^x^KϾ=4B$!Kx@DSfO1;qJNC.tt444IC50E4]T;{KC㛥WH]5X-qGiZdIY V_Wx_vKlޜ25~(OjO50sh5[*ªZۍNjRHN;D9Y0p 444pEL:H0)M32w\Z[[5k--p=c|,? - 7r`^_5y͞=3bM)`[Y0n.=Sbs~=u W_ݺ+p-&3frUI\bw`HeNT}f a@RRcN|nE)`~㪲EAUl6MEet=@&Lg̙-l䪫9GcZ3gNꪫ~ơCPUY\Y`nwbjuY3o(@6_[[Gh}J0 xm?DR)g==چ,_R,<H$E℆@S $hT"I8vSUUE(>u 5^ZLc >HwШR `2/>D(&fye2-R3^ᰆ58 0RCzP@ \R:{ŸXza"e s5o{,կ~ݎalٲGmCy]tছnA-$I6no<~?xy^~>R)-[a.WSS3p4 RM - ʟ>-C<?$4r\X,"cXPwF:E[JH̗2ά3TKKK|E᱔t]uݐX2 MӅ$ ϑ}g ;v`݄æ-vٸq#۶mcʔ)R1@_ȫq2X|geݻpD^ RWMLH;rJ}iM/2Z0s5Ϛޟ9Zl+m%g;!si:.ҀԲ T e &I*a`<3s?iJ4dϤ˵e F#+OGҟw)s*3JCJ[ߞ 4d`rk610(tű+ns=ٔ攃\)5\Jw\8qCC!eϟBKN8=x)4u2Ǧ4V1Zp2t ‘#T'K/.o, vx#c -ҵ{~<73F^S># c x3RB${%nmDP.[%or(-A+(-1q3150iL>$rܿ[O%`~LCv^$o|_d3rВ2ߔۜuITɡ#4?ǥ2ƔzA- )+u` >'0 '(|l>6Qc^/i{=IENDB`nvidia-settings/src/image_data/solaris_pixdata.h0000664000175000017500000032026712236467170022255 0ustar albertoalberto/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static guint8 solaris_pixdata_pixel_data[] = { 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xb1,0xff,0xff,0xff,0x00, 0xd1,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x01,0x83,0x00,0x00,0x00,0x02, 0x83,0x00,0x00,0x00,0x01,0xfe,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x02,0xd9,0x1f,0x26,0x23,0xbe,0x1b,0x22,0x14,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x01,0x87,0x00,0x00,0x00,0x00,0x85,0x00,0x00,0x00, 0x01,0xf1,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0xb4,0x1a,0x20,0x15,0xea,0x22,0x2a,0xc1,0xe3,0x21,0x28,0x75,0x82,0x00,0x00, 0x00,0x09,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x01,0x84,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x01,0x84, 0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x01,0xef,0x00,0x00,0x00,0x00,0x0c, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0xb9,0x1b,0x21, 0x29,0xec,0x22,0x2a,0xf0,0xe8,0x21,0x29,0xc3,0x7e,0x12,0x16,0x1e,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,0x83,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x03,0xe9,0x21,0x29,0x82,0x82,0x00,0x00,0x00,0x05, 0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x01,0xe0,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x85,0x00,0x00, 0x00,0x02,0x82,0x00,0x00,0x00,0x01,0x85,0x00,0x00,0x00,0x00,0x0d,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0e,0xdc, 0x20,0x27,0x8a,0xed,0x22,0x2a,0xff,0xe7,0x21,0x29,0xd4,0x00,0x00,0x00,0x16, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0xe4,0x21,0x28,0x64,0xe6,0x21,0x29, 0x93,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0xde,0x00,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x05,0x83,0x00,0x00,0x00,0x06,0x04,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x83,0x00, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x0a,0x00,0x00,0x00,0x11,0x8c,0x14,0x19,0x36,0x82,0xed,0x22,0x2a,0xff,0x06, 0xd3,0x1e,0x25,0x90,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x11,0x00,0x00,0x00, 0x0a,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x0b, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0xb9,0x1b,0x21, 0x29,0xed,0x22,0x2a,0xff,0xcb,0x1d,0x24,0x4b,0x00,0x00,0x00,0x0d,0x00,0x00, 0x00,0x0a,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0xde, 0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0xe3,0x21, 0x28,0x43,0xea,0x22,0x2a,0xb1,0xe9,0x21,0x29,0xc2,0xdf,0x20,0x28,0x77,0xb1, 0x19,0x1f,0x2b,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x08, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x01,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0a, 0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1d,0x82,0xed,0x22,0x2a,0xff,0x06,0xea, 0x22,0x2a,0xf2,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x0f, 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0f, 0xed,0x22,0x2a,0xff,0xe6,0x21,0x29,0xc5,0x00,0x00,0x00,0x14,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0xde,0x00, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x06,0x00,0x00,0x00,0x0a,0xdd,0x20,0x27,0x78,0x82,0xed,0x22,0x2a,0xff,0x06, 0xe4,0x21,0x28,0xb6,0x70,0x10,0x14,0x22,0x00,0x00,0x00,0x0f,0x00,0x00,0x00, 0x0b,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x83,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x14,0x7d,0x12,0x16, 0x3d,0x83,0xed,0x22,0x2a,0xff,0x0b,0x86,0x13,0x18,0x55,0x00,0x00,0x00,0x22, 0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x0d,0x6d,0x10,0x13,0x23,0x82,0xed,0x22,0x2a,0xff,0x05,0x85,0x13,0x18, 0x39,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x03,0xdd,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x05,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x13,0xcc, 0x1d,0x24,0x70,0x82,0xed,0x22,0x2a,0xff,0x06,0xeb,0x22,0x2a,0xf1,0xa5,0x18, 0x1d,0x45,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x0a,0x00,0x00,0x00,0x15,0xd0,0x1e,0x25,0x92,0x83,0xed,0x22,0x2a,0xff, 0x0b,0xa1,0x17,0x1c,0x76,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x1a,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x11,0xcc,0x1d,0x24,0x70, 0x82,0xed,0x22,0x2a,0xff,0x06,0xa5,0x18,0x1d,0x5c,0x00,0x00,0x00,0x1e,0x00, 0x00,0x00,0x15,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01, 0x85,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x01,0xd5,0x00,0x00,0x00,0x00, 0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x1e,0xe1,0x20,0x28,0xc9,0x82, 0xed,0x22,0x2a,0xff,0x0b,0xe5,0x21,0x29,0xd7,0x00,0x00,0x00,0x1f,0x00,0x00, 0x00,0x15,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0x63,0x0e,0x12,0x26, 0xea,0x22,0x2a,0xf2,0x83,0xed,0x22,0x2a,0xff,0x0b,0xbe,0x1b,0x22,0xa0,0x00, 0x00,0x00,0x30,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x0c,0x63,0x0e,0x12,0x26,0xe9,0x21,0x29,0xe3,0x82,0xed,0x22,0x2a,0xff,0x06, 0x97,0x16,0x1b,0x64,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x19,0x00,0x00,0x00, 0x0e,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x83, 0x00,0x00,0x00,0x01,0x83,0x00,0x00,0x00,0x02,0x83,0x00,0x00,0x00,0x01,0xd2, 0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x1f,0xac, 0x19,0x1e,0x6e,0x83,0xed,0x22,0x2a,0xff,0x09,0xb9,0x1b,0x21,0x7b,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0f,0xe2,0x20,0x28,0xb8, 0x84,0xed,0x22,0x2a,0xff,0x0a,0x81,0x13,0x17,0x75,0x00,0x00,0x00,0x35,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x73,0x11,0x14,0x21,0xe6,0x21,0x29, 0xd5,0x83,0xed,0x22,0x2a,0xff,0x06,0x8f,0x15,0x19,0x6a,0x00,0x00,0x00,0x2b, 0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x01,0x82,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x03,0xe8,0x21,0x29,0x62,0x00,0x00,0x00,0x04,0x82,0x00,0x00, 0x00,0x03,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0xd2,0x00,0x00,0x00, 0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x1e,0x9c,0x16,0x1c,0x61, 0x83,0xed,0x22,0x2a,0xff,0x08,0xe6,0x21,0x29,0xe6,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x0a,0xc0,0x1c,0x22,0x4f,0x85,0xed,0x22,0x2a,0xff,0x09,0x7d, 0x12,0x16,0x79,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x15, 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x09,0xce,0x1e,0x25, 0x5c,0xeb,0x22,0x2a,0xf1,0x84,0xed,0x22,0x2a,0xff,0x06,0x58,0x0d,0x10,0x56, 0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x11,0x00,0x00,0x00, 0x06,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0xec,0x22,0x2a,0xd0,0x00,0x00,0x00, 0x08,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x02,0xd3,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x1c,0x9e,0x17, 0x1c,0x60,0x84,0xed,0x22,0x2a,0xff,0x07,0x5f,0x0e,0x11,0x50,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x0e,0xe3,0x21,0x28,0xb7,0x85,0xed,0x22,0x2a,0xff,0x07,0xa9,0x18,0x1e, 0x9d,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x17,0x00,0x00, 0x00,0x0e,0x00,0x00,0x00,0x0c,0xe3,0x21,0x28,0xa6,0x85,0xed,0x22,0x2a,0xff, 0x12,0xd8,0x1f,0x26,0xd2,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x30,0x00,0x00, 0x00,0x1f,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06, 0x9e,0x17,0x1c,0x18,0xed,0x22,0x2a,0xff,0x83,0x13,0x17,0x1d,0x00,0x00,0x00, 0x0b,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0xc6,0x00, 0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x02,0x01,0x00, 0x00,0x00,0x03,0x84,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x03,0x82,0x00, 0x00,0x00,0x02,0x83,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x0c,0x00,0x00,0x00,0x19,0xc3,0x1c,0x23,0x88,0x84,0xed,0x22,0x2a,0xff, 0x06,0xcc,0x1d,0x24,0xb8,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x1d,0x00,0x00, 0x00,0x12,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x14,0x86,0xed,0x22,0x2a,0xff, 0x06,0xc5,0x1c,0x23,0xbf,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x1b,0x00,0x00,0x00,0x13,0xd8,0x1f,0x26,0x7b,0x86,0xed,0x22,0x2a,0xff, 0x13,0x8c,0x14,0x19,0x87,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x2f,0x00,0x00, 0x00,0x1d,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0a, 0xd3,0x1e,0x25,0x5a,0xed,0x22,0x2a,0xff,0xbe,0x1b,0x22,0x50,0x00,0x00,0x00, 0x11,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x01,0xc5,0x00,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x09,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x0a,0x00,0x00,0x00,0x17,0xdc,0x20,0x27,0xbc,0x85,0xed,0x22,0x2a,0xff,0x05, 0x77,0x11,0x15,0x60,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x19,0x00,0x00,0x00, 0x15,0x00,0x00,0x00,0x1a,0x86,0xed,0x22,0x2a,0xff,0x06,0xe7,0x21,0x29,0xf5, 0x30,0x07,0x09,0x4f,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x21,0x88,0x13,0x18, 0x38,0xeb,0x22,0x2a,0xf1,0x85,0xed,0x22,0x2a,0xff,0x07,0xe1,0x20,0x28,0xeb, 0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x2b,0x00,0x00,0x00, 0x1a,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0x00,0x01,0x0b, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x10,0xe6,0x21,0x29, 0xc5,0xed,0x22,0x2a,0xff,0xb1,0x19,0x1f,0x56,0x00,0x00,0x00,0x18,0x00,0x00, 0x00,0x11,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0xc5, 0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0xe6,0x21, 0x29,0x63,0xe9,0x21,0x29,0xb2,0xec,0x22,0x2a,0xf0,0x82,0xed,0x22,0x2a,0xff, 0x0c,0xec,0x22,0x2a,0xf0,0xe4,0x21,0x28,0xb6,0xca,0x1d,0x24,0x5e,0x00,0x00, 0x00,0x11,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x17, 0xe1,0x20,0x28,0xc9,0x85,0xed,0x22,0x2a,0xff,0x05,0xdf,0x20,0x28,0xdc,0x3c, 0x09,0x0b,0x3f,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x22, 0x87,0xed,0x22,0x2a,0xff,0x04,0xba,0x1b,0x21,0xa3,0x00,0x00,0x00,0x33,0x00, 0x00,0x00,0x27,0xc9,0x1d,0x24,0x84,0x86,0xed,0x22,0x2a,0xff,0x0c,0xc1,0x1c, 0x22,0xc3,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x27,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x12,0xdf,0x20,0x28, 0xa9,0x82,0xed,0x22,0x2a,0xff,0x06,0xa3,0x17,0x1d,0x5d,0x00,0x00,0x00,0x1f, 0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x01,0xc4,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x06,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0a,0xbb,0x1b,0x21,0x3d,0xda,0x1f, 0x27,0x8b,0xeb,0x22,0x2a,0xf1,0x83,0xed,0x22,0x2a,0xff,0x04,0xe4,0x21,0x28, 0xc7,0x62,0x0e,0x11,0x27,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0b,0x82,0x00, 0x00,0x00,0x06,0x03,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x18,0xe0,0x20,0x28, 0xca,0x86,0xed,0x22,0x2a,0xff,0x05,0xe0,0x20,0x28,0xdb,0x84,0x13,0x17,0x56, 0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x28,0xe3,0x21,0x28,0xd8,0x86,0xed,0x22, 0x2a,0xff,0x04,0xe9,0x21,0x29,0xf3,0x7c,0x12,0x16,0x5c,0x00,0x00,0x00,0x2c, 0xcc,0x1d,0x24,0x95,0x86,0xed,0x22,0x2a,0xff,0x0b,0xae,0x19,0x1f,0xaf,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x14, 0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0b,0x7e,0x12,0x16, 0x1e,0xd1,0x1e,0x25,0x6d,0xe6,0x21,0x29,0xd5,0x83,0xed,0x22,0x2a,0xff,0x06, 0x3f,0x09,0x0b,0x3c,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x19,0x00,0x00,0x00, 0x0f,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0xc4,0x00,0x00,0x00,0x00,0x09, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x08,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x1c,0x77,0x11, 0x15,0x40,0xe5,0x21,0x29,0xd7,0x83,0xed,0x22,0x2a,0xff,0x08,0xe5,0x21,0x29, 0xd7,0x55,0x0c,0x0f,0x2d,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x09,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x19,0xdc,0x20,0x27,0xbc,0x88, 0xed,0x22,0x2a,0xff,0x0d,0xc9,0x1d,0x24,0x97,0x00,0x00,0x00,0x2c,0xa6,0x18, 0x1d,0x72,0xce,0x1e,0x25,0xb7,0xb5,0x1a,0x20,0xa7,0x97,0x16,0x1b,0x97,0x71, 0x10,0x14,0x86,0x72,0x10,0x14,0x85,0x8b,0x14,0x19,0x88,0xbd,0x1b,0x21,0xa1, 0xaf,0x19,0x1f,0x82,0x00,0x00,0x00,0x2f,0xc9,0x1d,0x24,0x97,0x86,0xed,0x22, 0x2a,0xff,0x08,0xb0,0x19,0x1f,0xad,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x33, 0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x16,0xa2,0x17,0x1d,0x2f,0xe0,0x20,0x28, 0x97,0xea,0x22,0x2a,0xe2,0x85,0xed,0x22,0x2a,0xff,0x07,0xd6,0x1f,0x26,0xc2, 0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1a,0x00,0x00,0x00, 0x0f,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0xc4,0x00,0x00,0x00,0x00,0x82, 0x00,0x00,0x00,0x01,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x0b,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x26,0x81, 0x13,0x17,0x58,0x84,0xed,0x22,0x2a,0xff,0x07,0xd6,0x1f,0x26,0xb0,0x00,0x00, 0x00,0x22,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x1a,0xbb,0x1b,0x21,0x7a,0x85,0xed,0x22,0x2a,0xff,0x13,0xe7,0x21, 0x29,0xf5,0xc9,0x1d,0x24,0xbc,0x9b,0x16,0x1c,0x7a,0x3d,0x09,0x0b,0x3e,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x42, 0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x4d,0x00,0x00,0x00, 0x45,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x2c,0x69,0x0f, 0x13,0x48,0xa1,0x17,0x1c,0x76,0xcb,0x1d,0x24,0xba,0xe2,0x20,0x28,0xea,0x83, 0xed,0x22,0x2a,0xff,0x05,0xb2,0x1a,0x20,0xaa,0x00,0x00,0x00,0x43,0x00,0x00, 0x00,0x30,0x00,0x00,0x00,0x23,0xd6,0x1f,0x26,0x8e,0x88,0xed,0x22,0x2a,0xff, 0x07,0x70,0x10,0x14,0x66,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x28,0x00,0x00, 0x00,0x19,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0xc5, 0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x17,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x2f,0xcf,0x1e,0x25,0xb6,0x84,0xed,0x22,0x2a, 0xff,0x07,0xd4,0x1e,0x26,0xb2,0x4c,0x0b,0x0e,0x32,0x00,0x00,0x00,0x1b,0x00, 0x00,0x00,0x19,0x00,0x00,0x00,0x1e,0x44,0x0a,0x0c,0x38,0xe5,0x21,0x29,0xe7, 0x82,0xed,0x22,0x2a,0xff,0x1c,0xe7,0x21,0x29,0xf5,0xab,0x19,0x1e,0xb1,0x26, 0x05,0x07,0x64,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x2c,0x00,0x00,0x00, 0x31,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x38,0x00,0x00, 0x00,0x33,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x28,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x4c, 0x88,0x13,0x18,0x8c,0xcc,0x1d,0x24,0xcc,0xed,0x22,0x2a,0xff,0xd0,0x1e,0x25, 0xc7,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x30,0xd4,0x1e,0x26,0xa0,0x88,0xed, 0x22,0x2a,0xff,0x08,0x9d,0x17,0x1c,0x91,0x00,0x00,0x00,0x44,0x00,0x00,0x00, 0x36,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0b,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x01,0xc5,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x0a,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x2a,0xac, 0x19,0x1e,0x84,0x85,0xed,0x22,0x2a,0xff,0x23,0xe6,0x21,0x29,0xe6,0xb0,0x19, 0x1f,0x6c,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x2d,0x78, 0x11,0x15,0x5f,0xe4,0x21,0x28,0xe8,0xb2,0x1a,0x20,0xaa,0x26,0x05,0x07,0x63, 0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x41,0x00,0x00,0x00, 0x33,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x1c,0x00,0x00, 0x00,0x1d,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x1b, 0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x4a,0x50,0x0b, 0x0e,0x5f,0xd9,0x1f,0x27,0xd0,0x00,0x00,0x00,0x39,0x66,0x0f,0x12,0x4a,0x88, 0xed,0x22,0x2a,0xff,0x08,0x97,0x16,0x1b,0x97,0x00,0x00,0x00,0x4e,0x00,0x00, 0x00,0x40,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x83,0x00,0x00,0x00,0x00,0x85,0x00,0x00, 0x00,0x01,0xbe,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x07,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x15,0x00,0x00,0x00,0x23,0x93,0x15,0x1a,0x67,0x87,0xed,0x22,0x2a, 0xff,0x11,0xe6,0x21,0x29,0xe5,0xd6,0x1f,0x26,0xb0,0xc9,0x1d,0x24,0x97,0x00, 0x00,0x00,0x36,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x47, 0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x32,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x12,0x00,0x00, 0x00,0x11,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13,0x82,0x00,0x00,0x00,0x14, 0x02,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x11,0x82,0x00,0x00,0x00,0x10,0x05, 0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x31,0x82,0x00,0x00,0x00,0x36,0x03,0x00,0x00,0x00,0x34, 0x00,0x00,0x00,0x31,0xc9,0x1d,0x24,0x97,0x87,0xed,0x22,0x2a,0xff,0x0a,0xac, 0x19,0x1e,0xb0,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x37, 0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0c,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x84, 0x00,0x00,0x00,0x02,0x83,0x00,0x00,0x00,0x01,0xbf,0x00,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00, 0x0d,0x00,0x00,0x00,0x1a,0x43,0x0a,0x0c,0x39,0x88,0xed,0x22,0x2a,0xff,0x0f, 0xea,0x22,0x2a,0xf2,0x97,0x16,0x1b,0x65,0x00,0x00,0x00,0x30,0x00,0x00,0x00, 0x32,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x30,0x00,0x00, 0x00,0x2a,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x08, 0x83,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x08,0x0b,0x00,0x00,0x00,0x0a, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x19,0x00,0x00,0x00, 0x1f,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x26,0x00,0x00, 0x00,0x27,0x89,0x14,0x18,0x53,0xe2,0x20,0x28,0xd9,0x85,0xed,0x22,0x2a,0xff, 0x09,0xd0,0x1e,0x25,0xd9,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x4f,0x00,0x00, 0x00,0x3e,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x01,0x09,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0xe9,0x21,0x29,0x91,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x01,0xc0,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x24, 0xdd,0x20,0x27,0xcd,0x86,0xed,0x22,0x2a,0xff,0x0e,0xde,0x20,0x27,0xdd,0x33, 0x07,0x09,0x4a,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x27, 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x1d,0x00,0x00,0x00, 0x19,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x06,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0x00,0x03,0x86,0x00,0x00,0x00, 0x02,0x0d,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x13, 0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x1d,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x31,0xce,0x1e,0x25,0xb7,0x84,0xed,0x22,0x2a,0xff,0x09, 0x6d,0x10,0x13,0x8b,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x43,0x00,0x00,0x00, 0x31,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x01,0x09,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x06,0xdc,0x20,0x27,0x45,0xe8,0x21,0x29,0xa2,0x00,0x00, 0x00,0x09,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,0xba,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x01,0x04,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x1e,0xa6,0x18,0x1d,0x72, 0x85,0xed,0x22,0x2a,0xff,0x0e,0xda,0x1f,0x27,0xe1,0x2a,0x06,0x07,0x5b,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x1c, 0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0f,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x02,0x82,0x00,0x00,0x00,0x01,0x87,0x00,0x00,0x00,0x00,0x82,0x00,0x00, 0x00,0x01,0x0c,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0b,0x00,0x00,0x00, 0x0e,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x3a,0x9f,0x17,0x1c,0x8f,0x82,0xed,0x22,0x2a,0xff,0x09,0xe1,0x20,0x28, 0xeb,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x37,0x00,0x00, 0x00,0x26,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x05,0x82,0x00,0x00,0x00,0x04,0x0a,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x09,0x8c,0x14,0x19,0x1b,0xeb,0x22,0x2a,0xe1,0xdf,0x20,0x28,0x88,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x02,0xb6,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x04, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x05,0x83,0x00,0x00,0x00,0x06,0x08,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0d,0x00,0x00,0x00, 0x19,0x00,0x00,0x00,0x2a,0xce,0x1e,0x25,0xb7,0x83,0xed,0x22,0x2a,0xff,0x0c, 0xd9,0x1f,0x27,0xe2,0x25,0x05,0x07,0x66,0x00,0x00,0x00,0x4c,0x00,0x00,0x00, 0x3b,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x13,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x01,0x8d,0x00,0x00,0x00,0x00,0x82,0x00, 0x00,0x00,0x01,0x13,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x13,0x00,0x00, 0x00,0x1f,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x3e,0x9f,0x17,0x1c,0x8f,0xed, 0x22,0x2a,0xff,0xc5,0x1c,0x23,0xbf,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x3e, 0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x16,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x0d,0x82,0x00,0x00,0x00,0x0c,0x0b,0x00,0x00,0x00,0x0d, 0x00,0x00,0x00,0x0f,0x9b,0x16,0x1c,0x31,0xe8,0x21,0x29,0xd3,0xed,0x22,0x2a, 0xff,0xc3,0x1c,0x23,0x61,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x0b,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0xb5,0x00,0x00,0x00,0x00, 0x1f,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x06,0x00,0x00,0x00,0x09,0xb4,0x1a,0x20,0x2a,0xcd,0x1d,0x24,0x4a,0xc8, 0x1d,0x23,0x4c,0xc5,0x1c,0x23,0x4d,0x7b,0x12,0x16,0x1f,0x00,0x00,0x00,0x0e, 0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x08,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x35,0xc3,0x1c, 0x23,0xae,0xed,0x22,0x2a,0xff,0xe7,0x21,0x29,0xf5,0x44,0x0a,0x0c,0x70,0x00, 0x00,0x00,0x51,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x22, 0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x01,0x92,0x00,0x00,0x00,0x00, 0x82,0x00,0x00,0x00,0x01,0x0e,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x2f, 0x00,0x00,0x00,0x3a,0xbd,0x1b,0x21,0xa1,0xbb,0x1b,0x21,0xa2,0x00,0x00,0x00, 0x3f,0x00,0x00,0x00,0x35,0x9e,0x17,0x1c,0x60,0xd7,0x1f,0x26,0x9e,0xe5,0x21, 0x29,0xc6,0x82,0xe6,0x21,0x29,0xc5,0x04,0xdc,0x20,0x27,0x9a,0xd9,0x1f,0x26, 0x8c,0xd7,0x1f,0x26,0x8d,0xde,0x20,0x27,0xaa,0x82,0xed,0x22,0x2a,0xff,0x07, 0xeb,0x22,0x2a,0xf1,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x1c,0x00,0x00,0x00, 0x14,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0xb4,0x00, 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x06,0xd6,0x1f,0x26,0x47,0xe8,0x21,0x29,0xc3,0x85,0xed, 0x22,0x2a,0xff,0x03,0xe2,0x20,0x28,0xb8,0xaa,0x18,0x1e,0x43,0x00,0x00,0x00, 0x14,0x82,0x00,0x00,0x00,0x11,0x0f,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x1f, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x3c,0x2e,0x07,0x08,0x53,0x4d,0x0b,0x0e, 0x62,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x34,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x97,0x00,0x00,0x00,0x00,0x0b,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x15,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x31, 0x62,0x0e,0x11,0x4e,0x00,0x00,0x00,0x35,0xd5,0x1f,0x26,0xb1,0x8b,0xed,0x22, 0x2a,0xff,0x07,0xc8,0x1d,0x23,0x98,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x21, 0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x02,0xb4,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02, 0xb4,0x1a,0x20,0x15,0xe9,0x21,0x29,0xb2,0xed,0x22,0x2a,0xff,0xea,0x22,0x2a, 0xe2,0x87,0xed,0x22,0x2a,0xff,0x10,0xdb,0x1f,0x27,0xac,0xbc,0x1b,0x21,0x65, 0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x00,0x00,0x00, 0x2a,0xa5,0x18,0x1d,0x73,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x3c,0x00,0x00, 0x00,0x38,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00, 0x01,0x98,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x13,0x00,0x00,0x00, 0x1a,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x28,0xd1,0x1e,0x25,0xa2,0x8b,0xed, 0x22,0x2a,0xff,0x08,0xda,0x1f,0x27,0xcf,0x00,0x00,0x00,0x38,0x00,0x00,0x00, 0x2e,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x01,0xb4,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0xdc,0x20,0x27,0x45,0xc4,0x1c,0x23,0x3a,0x00,0x00, 0x00,0x13,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x25,0xa9,0x18,0x1e,0x70,0xe6, 0x21,0x29,0xe6,0x87,0xed,0x22,0x2a,0xff,0x82,0xea,0x22,0x2a,0xf2,0x0b,0xed, 0x22,0x2a,0xff,0xdb,0x1f,0x27,0xbd,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x2c, 0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x16,0x00,0x00,0x00, 0x0e,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x9b,0x00, 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x15,0x00,0x00, 0x00,0x1e,0xce,0x1e,0x25,0x93,0x8a,0xed,0x22,0x2a,0xff,0x09,0xca,0x1d,0x24, 0xbb,0x30,0x07,0x09,0x4f,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x1e,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x01,0xb3,0x00,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x15,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x31, 0x35,0x08,0x09,0x47,0xdf,0x20,0x28,0xdc,0x89,0xed,0x22,0x2a,0xff,0x09,0x69, 0x0f,0x13,0x48,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x1b, 0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x01,0x9d,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x0d,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x22,0xe3,0x21,0x28,0xd8,0x87,0xed, 0x22,0x2a,0xff,0x0a,0xcc,0x1d,0x24,0xcc,0x77,0x11,0x15,0x80,0x00,0x00,0x00, 0x4c,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x26,0x00,0x00, 0x00,0x19,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02,0xb4, 0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x18,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x36, 0x55,0x0c,0x0f,0x5a,0xe8,0x21,0x29,0xf4,0x87,0xed,0x22,0x2a,0xff,0x09,0xcf, 0x1e,0x25,0xb6,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1d, 0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x01,0x9f,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00, 0x12,0x00,0x00,0x00,0x1f,0x99,0x16,0x1b,0x63,0x85,0xed,0x22,0x2a,0xff,0x0c, 0xc8,0x1d,0x23,0xd0,0x40,0x09,0x0b,0x76,0x00,0x00,0x00,0x59,0x00,0x00,0x00, 0x4f,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x1d,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x01,0xb5,0x00,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x12,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x2c, 0x00,0x00,0x00,0x39,0xba,0x1b,0x21,0xa3,0x87,0xed,0x22,0x2a,0xff,0x07,0x51, 0x0c,0x0e,0x5e,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x19, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x82,0x00,0x00, 0x00,0x01,0xa0,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x1a,0x00,0x00, 0x00,0x2c,0xda,0x1f,0x27,0xcf,0x83,0xed,0x22,0x2a,0xff,0x0d,0x8d,0x14,0x19, 0xa1,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x4e,0x00,0x00, 0x00,0x42,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x13,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x01,0xb5,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x08, 0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x16,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x3c,0xde,0x20,0x27,0xdd,0x85,0xed, 0x22,0x2a,0xff,0x08,0xcc,0x1d,0x24,0xcc,0x00,0x00,0x00,0x4b,0x00,0x00,0x00, 0x38,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0b,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x01,0xa3,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x15,0x00,0x00, 0x00,0x25,0x8e,0x14,0x19,0x6b,0x82,0xed,0x22,0x2a,0xff,0x0d,0x93,0x15,0x1a, 0x9b,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x48,0x00,0x00, 0x00,0x3b,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1a,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x01,0xb6,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x0b, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x13,0x00,0x00, 0x00,0x1e,0x00,0x00,0x00,0x2d,0x33,0x07,0x09,0x4a,0xdd,0x20,0x27,0xde,0x84, 0xed,0x22,0x2a,0xff,0x08,0x96,0x15,0x1b,0x98,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x35,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,0xa3,0x00,0x00,0x00,0x00,0x14,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x2e,0xe5,0x21,0x29,0xe7,0xd1,0x1e,0x25,0xc6, 0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x41,0x00,0x00,0x00, 0x35,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x15,0x00,0x00, 0x00,0x0e,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,0xb9,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x01,0x09,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x12, 0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x40,0xb4,0x1a,0x20, 0xa8,0xe1,0x20,0x28,0xeb,0x82,0xed,0x22,0x2a,0xff,0x07,0x29,0x06,0x07,0x5d, 0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x1c,0x00,0x00,0x00, 0x0f,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0xa5,0x00,0x00,0x00,0x00,0x12, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0b,0x00,0x00,0x00, 0x16,0x00,0x00,0x00,0x23,0xce,0x1e,0x25,0xa4,0x5b,0x0d,0x10,0x53,0x00,0x00, 0x00,0x3c,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x23,0x00, 0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0xbf,0x00,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0b, 0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x30,0x00,0x00,0x00, 0x3e,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4c,0x00,0x00, 0x00,0x43,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x15,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0xa5,0x00,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x0f,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x1e,0x00,0x00,0x00, 0x15,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x01,0x94,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00, 0x01,0x8c,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x01,0x84,0x00,0x00,0x00, 0x02,0x83,0x00,0x00,0x00,0x01,0x8e,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x15,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x35,0x00, 0x00,0x00,0x3a,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x26, 0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x03,0x88,0x00,0x00,0x00,0x01,0x90,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00, 0x01,0x86,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x16,0x82,0x00,0x00, 0x00,0x1b,0x06,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0c, 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x85,0x00,0x00, 0x00,0x01,0x8e,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x06,0x83,0x00,0x00,0x00,0x07,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x82,0x00, 0x00,0x00,0x01,0x85,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x04,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x07, 0x84,0x00,0x00,0x00,0x08,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x01,0x83,0x00,0x00, 0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x03,0x84,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x13,0x00,0x00, 0x00,0x1b,0x00,0x00,0x00,0x22,0x82,0x00,0x00,0x00,0x25,0x06,0x00,0x00,0x00, 0x21,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x06,0x83,0x00,0x00,0x00,0x07,0x07,0x00,0x00,0x00, 0x08,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x01, 0x83,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x02, 0x84,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x83,0x00,0x00,0x00,0x06,0x02,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x03,0x83,0x00,0x00,0x00,0x02,0x85,0x00,0x00,0x00, 0x03,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x0c,0x82,0x00,0x00,0x00,0x0f,0x05,0x00,0x00,0x00,0x0d,0x00,0x00, 0x00,0x0b,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x83, 0x00,0x00,0x00,0x07,0x82,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x04,0x84,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x02,0x82,0x00, 0x00,0x00,0x01,0x83,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x0b,0xdd,0xdd,0xdd,0x4a,0xd7,0xd7,0xd7,0x4c,0x82,0xd4,0xd4,0xd4, 0x4d,0x09,0xc2,0xc2,0xc2,0x3f,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0b,0xcf,0xcf,0xcf,0x3b,0xde,0xde,0xde, 0x5c,0xee,0xee,0xee,0x89,0xed,0xed,0xed,0x8a,0xe3,0xe3,0xe3,0x6c,0xc2,0xc2, 0xc2,0x3f,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x84,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x0a,0x82,0x00,0x00,0x00,0x0c,0x03,0x00,0x00,0x00,0x0a,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x05,0x82,0x00,0x00,0x00,0x04,0x05,0x00,0x00,0x00, 0x06,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x13,0x00,0x00, 0x00,0x16,0x82,0x00,0x00,0x00,0x17,0x05,0x00,0x00,0x00,0x14,0x00,0x00,0x00, 0x11,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0f,0xd7,0xd7,0xd7,0x4c,0x82,0xd4, 0xd4,0xd4,0x4d,0x82,0xd1,0xd1,0xd1,0x4e,0x0f,0xd4,0xd4,0xd4,0x4d,0x80,0x80, 0x80,0x20,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x08,0x83,0x00,0x00,0x00,0x09,0x82, 0x00,0x00,0x00,0x08,0x0c,0x00,0x00,0x00,0x09,0x9d,0x9d,0x9d,0x1a,0xe5,0xe5, 0xe5,0x59,0xf2,0xf2,0xf2,0x87,0xe9,0xe9,0xe9,0x69,0x8d,0x8d,0x8d,0x1d,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x08,0x82,0x00,0x00,0x00,0x0a,0x0d,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x08,0x00,0x00,0x00, 0x09,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0c,0xbe,0xbe, 0xbe,0x2b,0xda,0xda,0xda,0x4b,0x83,0xd4,0xd4,0xd4,0x4d,0x0c,0x80,0x80,0x80, 0x20,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x0b,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02, 0x82,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x08,0xdd,0xdd,0xdd,0x4a,0xf7,0xf7,0xf7,0xb5, 0x86,0xff,0xff,0xff,0xff,0x08,0xfd,0xfd,0xfd,0xf1,0xf4,0xf4,0xf4,0xb7,0xdf, 0xdf,0xdf,0x6e,0x80,0x80,0x80,0x20,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x07, 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x01,0x06,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x08,0xbe,0xbe,0xbe,0x2b, 0xf4,0xf4,0xf4,0xa6,0xfe,0xfe,0xfe,0xf0,0x86,0xff,0xff,0xff,0xff,0x0c,0xfd, 0xfd,0xfd,0xf1,0xef,0xef,0xef,0xaa,0x9d,0x9d,0x9d,0x34,0x00,0x00,0x00,0x11, 0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0xf5,0xf5, 0xf5,0x85,0x84,0xff,0xff,0xff,0xff,0x04,0xed,0xed,0xed,0x8a,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x06,0x82,0x00,0x00,0x00,0x03,0x09, 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0a,0x00,0x00,0x00, 0x0d,0x00,0x00,0x00,0x10,0x78,0x78,0x78,0x22,0xe1,0xe1,0xe1,0x6d,0xf1,0xf1, 0xf1,0xa8,0xf9,0xf9,0xf9,0xd4,0x88,0xff,0xff,0xff,0xff,0x07,0xf9,0xf9,0xf9, 0xd4,0xdd,0xdd,0xdd,0x6f,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0e,0x00,0x00, 0x00,0x09,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0xfb,0xfb,0xfb,0xc2,0xfa,0xfa, 0xfa,0xc3,0x82,0xf8,0xf8,0xf8,0xc4,0x05,0xe3,0xe3,0xe3,0x6c,0x00,0x00,0x00, 0x12,0x00,0x00,0x00,0x11,0xdb,0xdb,0xdb,0x5d,0xfe,0xfe,0xfe,0xf0,0x83,0xff, 0xff,0xff,0xff,0x07,0xf1,0xf1,0xf1,0xa8,0x00,0x00,0x00,0x13,0x00,0x00,0x00, 0x0e,0x00,0x00,0x00,0x0b,0xd7,0xd7,0xd7,0x39,0xfb,0xfb,0xfb,0xc2,0xfa,0xfa, 0xfa,0xc3,0x82,0xf8,0xf8,0xf8,0xc4,0x04,0xf1,0xf1,0xf1,0x97,0x00,0x00,0x00, 0x0f,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x07,0x82,0x00,0x00,0x00,0x05,0x05, 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x09,0x92,0x92,0x92,0x1c,0xf0,0xf0,0xf0, 0x88,0xfc,0xfc,0xfc,0xe2,0x86,0xff,0xff,0xff,0xff,0x11,0xf8,0xf8,0xf8,0xd5, 0xeb,0xeb,0xeb,0x9b,0xb7,0xb7,0xb7,0x43,0xf3,0xf3,0xf3,0xa7,0xf4,0xf4,0xf4, 0xa6,0xf6,0xf6,0xf6,0xa5,0xf8,0xf8,0xf8,0xb4,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0a, 0xf6,0xf6,0xf6,0xa5,0x8b,0xff,0xff,0xff,0xff,0x0a,0xd9,0xd9,0xd9,0x71,0x00, 0x00,0x00,0x13,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x0a,0xf3,0xf3,0xf3,0x96,0x8b,0xff,0xff,0xff,0xff,0x0a,0xfd,0xfd,0xfd,0xf1, 0xd5,0xd5,0xd5,0x73,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0f,0x00,0x00,0x00, 0x09,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x09,0xf0,0xf0,0xf0,0x88,0x84,0xff,0xff,0xff,0xff,0x0b,0xe1,0xe1,0xe1, 0x91,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x0a,0xf8,0xf8,0xf8,0xb4,0x8e,0xff,0xff,0xff, 0xff,0x09,0xec,0xec,0xec,0xac,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0b,0x84,0xff,0xff,0xff,0xff,0x03,0xe1, 0xe1,0xe1,0x91,0x00,0x00,0x00,0x21,0xd5,0xd5,0xd5,0x73,0x85,0xff,0xff,0xff, 0xff,0x05,0xdd,0xdd,0xdd,0x94,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x16,0x00, 0x00,0x00,0x12,0xd4,0xd4,0xd4,0x4d,0x84,0xff,0xff,0xff,0xff,0x09,0xf5,0xf5, 0xf5,0xc7,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x08,0xcf,0xcf,0xcf,0x3b, 0xfe,0xfe,0xfe,0xf0,0x8a,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xd6,0xe1, 0xe1,0xe1,0x91,0xe4,0xe4,0xe4,0x8f,0x82,0xff,0xff,0xff,0xff,0x09,0x00,0x00, 0x00,0x12,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0a, 0xf4,0xf4,0xf4,0xa6,0x8c,0xff,0xff,0xff,0xff,0x09,0x99,0x99,0x99,0x50,0x00, 0x00,0x00,0x1b,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x9d,0x9d,0x9d,0x1a,0xfa,0xfa,0xfa, 0xd3,0x8e,0xff,0xff,0xff,0xff,0x08,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00,0x1a, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x08,0x00,0x00,0x00,0x0e,0xe9,0xe9,0xe9,0x8c,0x84,0xff,0xff,0xff,0xff,0x0b, 0xd5,0xd5,0xd5,0x99,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x19,0x00,0x00,0x00, 0x0e,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0b,0xfd,0xfd,0xfd,0xe1,0x8f, 0xff,0xff,0xff,0xff,0x04,0xdd,0xdd,0xdd,0x94,0x00,0x00,0x00,0x1c,0x00,0x00, 0x00,0x11,0x00,0x00,0x00,0x09,0x82,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x00, 0x09,0x00,0x00,0x00,0x11,0x84,0xff,0xff,0xff,0xff,0x02,0xd3,0xd3,0xd3,0x9b, 0xbf,0xbf,0xbf,0x80,0x86,0xff,0xff,0xff,0xff,0x05,0xc9,0xc9,0xc9,0x8e,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x19,0xc5,0xc5,0xc5,0x53, 0x84,0xff,0xff,0xff,0xff,0x08,0xf0,0xf0,0xf0,0xcb,0x00,0x00,0x00,0x27,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x09, 0xcf,0xcf,0xcf,0x3b,0xfe,0xfe,0xfe,0xf0,0x8b,0xff,0xff,0xff,0xff,0x0d,0xe3, 0xe3,0xe3,0xb3,0xa7,0xa7,0xa7,0x62,0xae,0xae,0xae,0x5e,0xe1,0xe1,0xe1,0x91, 0xd5,0xd5,0xd5,0x73,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x0a,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x08,0xd7,0xd7,0xd7,0x4c,0x85,0xff,0xff,0xff,0xff,0x0c,0xfa,0xfa,0xfa, 0xf4,0xcc,0xcc,0xcc,0xb3,0xc1,0xc1,0xc1,0xa9,0xc2,0xc2,0xc2,0xa8,0xc3,0xc3, 0xc3,0xa7,0xc7,0xc7,0xc7,0xa4,0xea,0xea,0xea,0xd0,0xff,0xff,0xff,0xff,0x00, 0x00,0x00,0x2e,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0b, 0x82,0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x00,0x0b,0xf3,0xf3,0xf3,0xa7,0x85, 0xff,0xff,0xff,0xff,0x05,0xfa,0xfa,0xfa,0xf4,0xcc,0xcc,0xcc,0xb3,0xc1,0xc1, 0xc1,0xa9,0xc0,0xc0,0xc0,0xaa,0xed,0xed,0xed,0xdf,0x86,0xff,0xff,0xff,0xff, 0x07,0xac,0xac,0xac,0x5f,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x0a,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x13,0xe4,0xe4,0xe4,0x8f,0x84, 0xff,0xff,0xff,0xff,0x0b,0xcc,0xcc,0xcc,0xa0,0x00,0x00,0x00,0x31,0x00,0x00, 0x00,0x1f,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0e, 0xf1,0xf1,0xf1,0xa8,0x82,0xff,0xff,0xff,0xff,0x08,0xf6,0xf6,0xf6,0xe7,0xea, 0xea,0xea,0xd0,0xd0,0xd0,0xd0,0xaf,0xc6,0xc6,0xc6,0xa5,0xc5,0xc5,0xc5,0xa6, 0xd7,0xd7,0xd7,0xbd,0xe7,0xe7,0xe7,0xd3,0xf3,0xf3,0xf3,0xea,0x85,0xff,0xff, 0xff,0xff,0x08,0xfb,0xfb,0xfb,0xf3,0x4a,0x4a,0x4a,0x37,0x00,0x00,0x00,0x1b, 0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x16,0x84,0xff,0xff,0xff,0xff,0x01,0xf5,0xf5,0xf5,0xe8, 0x87,0xff,0xff,0xff,0xff,0x05,0x94,0x94,0x94,0x6e,0x00,0x00,0x00,0x2f,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x1e,0xb7,0xb7,0xb7,0x59,0x84,0xff,0xff,0xff, 0xff,0x04,0xeb,0xeb,0xeb,0xcf,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x15,0x82,0x00,0x00,0x00,0x0f,0x01,0xf7,0xf7,0xf7,0xc5,0x85,0xff, 0xff,0xff,0xff,0x14,0xe6,0xe6,0xe6,0xd4,0xc1,0xc1,0xc1,0xa9,0xc2,0xc2,0xc2, 0xa8,0xc3,0xc3,0xc3,0xa7,0xc5,0xc5,0xc5,0xa6,0xda,0xda,0xda,0xba,0xf6,0xf6, 0xf6,0xe7,0xc5,0xc5,0xc5,0x91,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x11, 0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x0d,0xf1,0xf1,0xf1,0xa8,0x84,0xff,0xff,0xff,0xff,0x10, 0xf3,0xf3,0xf3,0xea,0x28,0x28,0x28,0x65,0x00,0x00,0x00,0x57,0x00,0x00,0x00, 0x53,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x47,0x00,0x00, 0x00,0x41,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x09, 0xd4,0xd4,0xd4,0x4d,0x85,0xff,0xff,0xff,0xff,0x07,0xd3,0xd3,0xd3,0xc0,0x2a, 0x2a,0x2a,0x62,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x52, 0x00,0x00,0x00,0x53,0xb3,0xb3,0xb3,0xa0,0x85,0xff,0xff,0xff,0xff,0x07,0xf2, 0xf2,0xf2,0xda,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x16,0xe0,0xe0,0xe0,0x92,0x84,0xff,0xff, 0xff,0xff,0x16,0xc6,0xc6,0xc6,0xa5,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x10,0xc2,0xc2, 0xc2,0x54,0xdd,0xdd,0xdd,0x94,0x69,0x69,0x69,0x4e,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x45,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x4b, 0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x53,0xbe,0xbe,0xbe, 0xac,0x85,0xff,0xff,0xff,0xff,0x07,0xbc,0xbc,0xbc,0x82,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x08,0x00,0x00,0x00, 0x0e,0x00,0x00,0x00,0x1a,0x88,0xff,0xff,0xff,0xff,0x09,0xf9,0xf9,0xf9,0xf5, 0xc8,0xc8,0xc8,0xb6,0xc0,0xc0,0xc0,0xaa,0xe0,0xe0,0xe0,0xc7,0x7c,0x7c,0x7c, 0x63,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x21,0xb1,0xb1, 0xb1,0x5c,0x84,0xff,0xff,0xff,0xff,0x06,0xe8,0xe8,0xe8,0xd2,0x00,0x00,0x00, 0x3c,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x13,0xbc,0xbc, 0xbc,0x41,0x85,0xff,0xff,0xff,0xff,0x15,0xa0,0xa0,0xa0,0x99,0x00,0x00,0x00, 0x59,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x4d,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x3a,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x1d, 0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0a,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x11,0xf8,0xf8, 0xf8,0xd5,0x84,0xff,0xff,0xff,0xff,0x10,0x9d,0x9d,0x9d,0x9c,0x00,0x00,0x00, 0x5c,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x44,0x00,0x00, 0x00,0x3f,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0b, 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0f,0xf9,0xf9,0xf9,0xd4,0x84,0xff,0xff, 0xff,0xff,0x09,0xe4,0xe4,0xe4,0xd6,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x55, 0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x48,0x00,0x00,0x00,0x4e,0xcb,0xcb,0xcb,0xb4,0x85,0xff,0xff,0xff,0xff,0x06, 0x9d,0x9d,0x9d,0x68,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x16,0x00,0x00,0x00, 0x13,0x00,0x00,0x00,0x1a,0xdd,0xdd,0xdd,0x94,0x84,0xff,0xff,0xff,0xff,0x0f, 0xc2,0xc2,0xc2,0xa8,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x27,0x00,0x00,0x00, 0x16,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x19,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x3d, 0x83,0x00,0x00,0x00,0x3f,0x05,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x43,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x51,0xf3,0xf3,0xf3,0xea,0x84,0xff,0xff,0xff, 0xff,0x07,0xcb,0xcb,0xcb,0xa1,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x0f,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x1d, 0x87,0xff,0xff,0xff,0xff,0x07,0xd1,0xd1,0xd1,0xc2,0x28,0x28,0x28,0x65,0x00, 0x00,0x00,0x57,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x3a, 0x00,0x00,0x00,0x2b,0x82,0x00,0x00,0x00,0x21,0x01,0xae,0xae,0xae,0x5e,0x84, 0xff,0xff,0xff,0xff,0x06,0xe6,0xe6,0xe6,0xd4,0x00,0x00,0x00,0x42,0x00,0x00, 0x00,0x2c,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x18,0xd9,0xd9,0xd9,0x71,0x84, 0xff,0xff,0xff,0xff,0x15,0xeb,0xeb,0xeb,0xe1,0x00,0x00,0x00,0x5f,0x00,0x00, 0x00,0x57,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x3d,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x1c,0x00,0x00,0x00, 0x16,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x15,0x85, 0xff,0xff,0xff,0xff,0x0f,0x8b,0x8b,0x8b,0x93,0x00,0x00,0x00,0x58,0x00,0x00, 0x00,0x4a,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x1c, 0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0a,0x00,0x00,0x00, 0x0c,0xbc,0xbc,0xbc,0x41,0x85,0xff,0xff,0xff,0xff,0x09,0x48,0x48,0x48,0x72, 0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x3f,0x00,0x00,0x00, 0x37,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x3e,0x31,0x31, 0x31,0x54,0x85,0xff,0xff,0xff,0xff,0x06,0xde,0xde,0xde,0xb7,0x00,0x00,0x00, 0x2d,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1d,0xdb,0xdb, 0xdb,0x95,0x84,0xff,0xff,0xff,0xff,0x11,0xc0,0xc0,0xc0,0xaa,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0a,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x2e,0x00,0x00,0x00, 0x2d,0x82,0x00,0x00,0x00,0x2c,0x04,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x38, 0x00,0x00,0x00,0x43,0xe7,0xe7,0xe7,0xd3,0x84,0xff,0xff,0xff,0xff,0x07,0xe8, 0xe8,0xe8,0xd2,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x13, 0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x1f,0x86,0xff,0xff, 0xff,0xff,0x0b,0xc3,0xc3,0xc3,0xbb,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x56, 0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x39,0x00,0x00,0x00, 0x2d,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x1e,0xae,0xae, 0xae,0x5e,0x84,0xff,0xff,0xff,0xff,0x06,0xe5,0xe5,0xe5,0xd5,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x1c,0xe3,0xe3, 0xe3,0x90,0x84,0xff,0xff,0xff,0xff,0x11,0xea,0xea,0xea,0xe2,0x00,0x00,0x00, 0x5e,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x38,0x00,0x00, 0x00,0x30,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x13, 0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x05,0x82,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x18, 0xf9,0xf9,0xf9,0xe4,0x84,0xff,0xff,0xff,0xff,0x0b,0xeb,0xeb,0xeb,0xe1,0x2b, 0x2b,0x2b,0x5e,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x26, 0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x17,0x00,0x00,0x00, 0x14,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0c,0x82,0x00,0x00,0x00,0x09,0x02, 0x00,0x00,0x00,0x0f,0xeb,0xeb,0xeb,0x9b,0x84,0xff,0xff,0xff,0xff,0x0b,0xeb, 0xeb,0xeb,0xe1,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x3c, 0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x23,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x3a,0xe1,0xe1,0xe1,0xc6,0x84,0xff, 0xff,0xff,0xff,0x06,0xef,0xef,0xef,0xdd,0x00,0x00,0x00,0x36,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x1f,0xdb,0xdb,0xdb,0x95,0x84,0xff, 0xff,0xff,0xff,0x0e,0xc0,0xc0,0xc0,0xaa,0x00,0x00,0x00,0x40,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x1b, 0x82,0x00,0x00,0x00,0x1c,0x83,0x00,0x00,0x00,0x1b,0x04,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x35,0xea,0xea,0xea,0xd0,0x84,0xff,0xff, 0xff,0xff,0x07,0xe6,0xe6,0xe6,0xd4,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x27, 0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x12,0x00,0x00,0x00, 0x1f,0x85,0xff,0xff,0xff,0xff,0x0c,0xdf,0xdf,0xdf,0xda,0x00,0x00,0x00,0x61, 0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x3c,0x00,0x00,0x00, 0x31,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x16,0x00,0x00, 0x00,0x15,0x00,0x00,0x00,0x1a,0xaf,0xaf,0xaf,0x5d,0x84,0xff,0xff,0xff,0xff, 0x06,0xe5,0xe5,0xe5,0xd5,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x2f,0x00,0x00, 0x00,0x22,0x00,0x00,0x00,0x1f,0xd7,0xd7,0xd7,0x85,0x85,0xff,0xff,0xff,0xff, 0x15,0xa0,0xa0,0xa0,0x99,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x39,0x00,0x00, 0x00,0x2b,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x18,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0d, 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x05,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x0c,0x00,0x00,0x00,0x1a,0xec,0xec,0xec,0xbd,0x85,0xff,0xff,0xff,0xff, 0x09,0xed,0xed,0xed,0xdf,0x92,0x92,0x92,0x70,0x00,0x00,0x00,0x2f,0x00,0x00, 0x00,0x22,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x09,0x82,0x00,0x00,0x00,0x06,0x03,0x00,0x00, 0x00,0x09,0x00,0x00,0x00,0x13,0xf5,0xf5,0xf5,0xc7,0x84,0xff,0xff,0xff,0xff, 0x0b,0xbb,0xbb,0xbb,0xaf,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x40,0x00,0x00, 0x00,0x2e,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x2c,0xc2,0xc2,0xc2,0x93, 0x85,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x2b,0x82, 0x00,0x00,0x00,0x21,0x01,0xda,0xda,0xda,0x96,0x84,0xff,0xff,0xff,0xff,0x0f, 0xc0,0xc0,0xc0,0xaa,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x17,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x11, 0x82,0x00,0x00,0x00,0x12,0x06,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x14,0x00, 0x00,0x00,0x19,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x2f,0xeb,0xeb,0xeb,0xcf, 0x84,0xff,0xff,0xff,0xff,0x07,0xe5,0xe5,0xe5,0xd5,0x00,0x00,0x00,0x42,0x00, 0x00,0x00,0x2a,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x13, 0x00,0x00,0x00,0x1f,0x85,0xff,0xff,0xff,0xff,0x0c,0x5d,0x5d,0x5d,0x84,0x00, 0x00,0x00,0x58,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x2a, 0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x11,0x00,0x00,0x00, 0x0d,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x17,0xb1,0xb1,0xb1,0x5c,0x84,0xff, 0xff,0xff,0xff,0x06,0xe5,0xe5,0xe5,0xd5,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x20,0xaf,0xaf,0xaf,0x5d,0x86,0xff, 0xff,0xff,0xff,0x0d,0xc7,0xc7,0xc7,0xa4,0x00,0x00,0x00,0x37,0x00,0x00,0x00, 0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x83,0x00,0x00,0x00, 0x01,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x19,0xc7, 0xc7,0xc7,0x7b,0x87,0xff,0xff,0xff,0xff,0x0b,0xef,0xef,0xef,0xcc,0xcc,0xcc, 0xcc,0x78,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x16,0x85,0xff,0xff,0xff,0xff,0x0b,0x8f, 0x8f,0x8f,0x8f,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x23, 0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x0a,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x21,0xa0,0xa0,0xa0,0x66,0x85,0xff, 0xff,0xff,0xff,0x05,0x59,0x59,0x59,0x5c,0x00,0x00,0x00,0x30,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x24,0xda,0xda,0xda,0x96,0x84,0xff,0xff,0xff,0xff,0x06, 0xc0,0xc0,0xc0,0xaa,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x29,0x00,0x00,0x00, 0x17,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x00,0x0f, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x06,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0e,0x00,0x00, 0x00,0x10,0xd1,0xd1,0xd1,0x4e,0xd9,0xd9,0xd9,0x5e,0xeb,0xeb,0xeb,0x8b,0xe6, 0xe6,0xe6,0x8e,0xe0,0xe0,0xe0,0x92,0xd7,0xd7,0xd7,0x98,0xf6,0xf6,0xf6,0xe7, 0x84,0xff,0xff,0xff,0xff,0x07,0xe5,0xe5,0xe5,0xd5,0x00,0x00,0x00,0x44,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x13, 0x00,0x00,0x00,0x1f,0x85,0xff,0xff,0xff,0xff,0x0c,0x00,0x00,0x00,0x60,0x00, 0x00,0x00,0x4d,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x1b, 0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x08,0x00,0x00,0x00, 0x07,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x15,0xb1,0xb1,0xb1,0x5c,0x84,0xff, 0xff,0xff,0xff,0x07,0xe5,0xe5,0xe5,0xd5,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x2f,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x26,0xf7,0xf7, 0xf7,0xe6,0x86,0xff,0xff,0xff,0xff,0x0b,0xfb,0xfb,0xfb,0xf3,0xe0,0xe0,0xe0, 0xa3,0x86,0x86,0x86,0x3d,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x11,0x00,0x00, 0x00,0x0c,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x84,0x00,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x27,0xdf, 0xdf,0xdf,0xb6,0x88,0xff,0xff,0xff,0xff,0x05,0xfc,0xfc,0xfc,0xf2,0xe8,0xe8, 0xe8,0x9d,0x9a,0x9a,0x9a,0x35,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0c,0x82, 0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x1a,0x85,0xff, 0xff,0xff,0xff,0x0b,0x7e,0x7e,0x7e,0x82,0x00,0x00,0x00,0x44,0x00,0x00,0x00, 0x2e,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x19,0x75, 0x75,0x75,0x46,0x85,0xff,0xff,0xff,0xff,0x05,0x89,0x89,0x89,0x77,0x00,0x00, 0x00,0x34,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x26,0xd8,0xd8,0xd8,0x97,0x84, 0xff,0xff,0xff,0xff,0x06,0xc0,0xc0,0xc0,0xaa,0x00,0x00,0x00,0x40,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x03,0x82, 0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0b,0xe9,0xe9,0xe9,0x69,0xf7, 0xf7,0xf7,0xb5,0x8c,0xff,0xff,0xff,0xff,0x07,0xe4,0xe4,0xe4,0xd6,0x00,0x00, 0x00,0x45,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x13,0x00,0x00,0x00,0x1f,0x85,0xff,0xff,0xff,0xff,0x07,0x00,0x00, 0x00,0x59,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0x00, 0x03,0x03,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x14,0xb3,0xb3,0xb3,0x5b,0x84, 0xff,0xff,0xff,0xff,0x07,0xe5,0xe5,0xe5,0xd5,0x00,0x00,0x00,0x46,0x00,0x00, 0x00,0x2f,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x22,0xa2, 0xa2,0xa2,0x65,0x89,0xff,0xff,0xff,0xff,0x07,0xf4,0xf4,0xf4,0xc8,0xce,0xce, 0xce,0x63,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x01,0x83,0x00,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x12, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x33,0xd2,0xd2,0xd2,0xae,0x89,0xff,0xff, 0xff,0xff,0x07,0xfc,0xfc,0xfc,0xf2,0xe3,0xe3,0xe3,0x90,0x00,0x00,0x00,0x18, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x13,0xbc,0xbc,0xbc, 0x57,0x85,0xff,0xff,0xff,0xff,0x0b,0x2b,0x2b,0x2b,0x60,0x00,0x00,0x00,0x3f, 0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0a,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x15,0x00,0x00,0x00,0x27,0x85,0xff,0xff,0xff,0xff,0x05,0x86,0x86,0x86, 0x7a,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x27,0xd8,0xd8, 0xd8,0x97,0x84,0xff,0xff,0xff,0xff,0x0d,0xc0,0xc0,0xc0,0xaa,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0a,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x07,0xcf,0xcf,0xcf,0x3b,0xfa,0xfa,0xfa,0xd3, 0x8e,0xff,0xff,0xff,0xff,0x07,0xe4,0xe4,0xe4,0xd6,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x2e,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13, 0x00,0x00,0x00,0x1f,0x85,0xff,0xff,0xff,0xff,0x0c,0x00,0x00,0x00,0x53,0x00, 0x00,0x00,0x3c,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0a, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x13,0xb3,0xb3,0xb3,0x5b,0x84,0xff, 0xff,0xff,0xff,0x09,0xe5,0xe5,0xe5,0xd5,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x2f,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x1d,0x00,0x00, 0x00,0x2a,0x93,0x93,0x93,0x6f,0xf4,0xf4,0xf4,0xe9,0x89,0xff,0xff,0xff,0xff, 0x06,0xf4,0xf4,0xf4,0xc8,0x92,0x92,0x92,0x38,0x00,0x00,0x00,0x13,0x00,0x00, 0x00,0x0c,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x01, 0x82,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x3a, 0x89,0x89,0x89,0x77,0xe5,0xe5,0xe5,0xd5,0x89,0xff,0xff,0xff,0xff,0x05,0xe9, 0xe9,0xe9,0xae,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x1a, 0xb3,0xb3,0xb3,0x5b,0x85,0xff,0xff,0xff,0xff,0x0b,0x00,0x00,0x00,0x53,0x00, 0x00,0x00,0x3b,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x09, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x08,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x23,0x85,0xff,0xff,0xff,0xff,0x05, 0x6d,0x6d,0x6d,0x70,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x2b,0x00,0x00,0x00, 0x28,0xd8,0xd8,0xd8,0x97,0x84,0xff,0xff,0xff,0xff,0x0c,0xc0,0xc0,0xc0,0xaa, 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x17,0x00,0x00,0x00, 0x0a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x07,0xcf,0xcf,0xcf,0x3b,0xfe,0xfe,0xfe,0xf0,0x87, 0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xdd,0xf4,0xf4,0xf4,0xe9,0x86,0xff, 0xff,0xff,0xff,0x07,0xe4,0xe4,0xe4,0xd6,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x2e,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13,0x00,0x00, 0x00,0x1f,0x85,0xff,0xff,0xff,0xff,0x06,0x00,0x00,0x00,0x50,0x00,0x00,0x00, 0x37,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x08,0x00,0x00,0x00,0x13,0xb3,0xb3,0xb3,0x5b,0x84,0xff,0xff,0xff,0xff,0x0b, 0xe5,0xe5,0xe5,0xd5,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x2f,0x00,0x00,0x00, 0x1e,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x21,0x00,0x00, 0x00,0x32,0x33,0x33,0x33,0x50,0xc1,0xc1,0xc1,0xa9,0xf9,0xf9,0xf9,0xf5,0x88, 0xff,0xff,0xff,0xff,0x07,0xfc,0xfc,0xfc,0xf2,0xa3,0xa3,0xa3,0x4b,0x00,0x00, 0x00,0x16,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x2b,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x48,0x81,0x81,0x81,0x7f, 0xe4,0xe4,0xe4,0xd6,0x88,0xff,0xff,0xff,0xff,0x04,0xd2,0xd2,0xd2,0x88,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x22,0x97,0x97,0x97,0x51,0x85,0xff,0xff,0xff, 0xff,0x0b,0x83,0x83,0x83,0x7d,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x13,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x12,0x00,0x00,0x00, 0x22,0x85,0xff,0xff,0xff,0xff,0x05,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x39, 0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x28,0xd8,0xd8,0xd8,0x97,0x84,0xff,0xff, 0xff,0xff,0x0b,0xc0,0xc0,0xc0,0xaa,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x92,0x92,0x92,0x1c,0xfe,0xfe, 0xfe,0xf0,0x84,0xff,0xff,0xff,0xff,0x03,0xf4,0xf4,0xf4,0xe9,0xaa,0xaa,0xaa, 0x90,0x52,0x52,0x52,0x63,0x82,0x00,0x00,0x00,0x4c,0x03,0x00,0x00,0x00,0x4f, 0x00,0x00,0x00,0x54,0xe4,0xe4,0xe4,0xd6,0x84,0xff,0xff,0xff,0xff,0x07,0xe4, 0xe4,0xe4,0xd6,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x1b, 0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1f,0x85,0xff,0xff, 0xff,0xff,0x05,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x06,0x83,0x00,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x13,0xb3,0xb3,0xb3,0x5b, 0x84,0xff,0xff,0xff,0xff,0x0d,0xe5,0xe5,0xe5,0xd5,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x2e,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x34,0x00,0x00,0x00, 0x42,0x2d,0x2d,0x2d,0x5a,0xbe,0xbe,0xbe,0xac,0xf9,0xf9,0xf9,0xf5,0x87,0xff, 0xff,0xff,0xff,0x14,0xf8,0xf8,0xf8,0xe5,0x00,0x00,0x00,0x23,0x00,0x00,0x00, 0x16,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x1d, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x42,0x00,0x00,0x00, 0x4d,0x4c,0x4c,0x4c,0x6b,0xdb,0xdb,0xdb,0xcc,0x86,0xff,0xff,0xff,0xff,0x04, 0xf7,0xf7,0xf7,0xe6,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x2b,0x00,0x00,0x00, 0x2f,0x85,0xff,0xff,0xff,0xff,0x0b,0x83,0x83,0x83,0x7d,0x00,0x00,0x00,0x39, 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x08,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x11,0xa3,0xa3,0xa3,0x4b,0x84,0xff,0xff,0xff,0xff,0x06,0xf2,0xf2,0xf2, 0xeb,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x28,0xd8,0xd8,0xd8,0x97,0x84,0xff,0xff,0xff,0xff,0x0a,0xc0,0xc0,0xc0, 0xaa,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x17,0x00,0x00, 0x00,0x0a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x0b,0xed,0xed,0xed,0x8a,0x84,0xff,0xff,0xff,0xff,0x09,0xed,0xed, 0xed,0xdf,0x2b,0x2b,0x2b,0x5f,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x4c,0x00, 0x00,0x00,0x48,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x4e, 0xe5,0xe5,0xe5,0xd5,0x84,0xff,0xff,0xff,0xff,0x07,0xe4,0xe4,0xe4,0xd6,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x12, 0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1f,0x85,0xff,0xff,0xff,0xff,0x05,0x00, 0x00,0x00,0x4d,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x05,0x83,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x13,0xb3,0xb3,0xb3,0x5b,0x84,0xff,0xff,0xff, 0xff,0x0f,0xe5,0xe5,0xe5,0xd5,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0e, 0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x30,0x00,0x00,0x00, 0x3d,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x52,0xa1,0xa1,0xa1,0x98,0xf9,0xf9, 0xf9,0xf5,0x86,0xff,0xff,0xff,0xff,0x06,0xc1,0xc1,0xc1,0x7f,0x00,0x00,0x00, 0x21,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x11,0x00,0x00, 0x00,0x1a,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x3a,0x00, 0x00,0x00,0x44,0x00,0x00,0x00,0x4f,0x91,0x91,0x91,0x8d,0xf9,0xf9,0xf9,0xf5, 0x85,0xff,0xff,0xff,0xff,0x04,0x7e,0x7e,0x7e,0x61,0x00,0x00,0x00,0x33,0x00, 0x00,0x00,0x34,0xfb,0xfb,0xfb,0xf3,0x84,0xff,0xff,0xff,0xff,0x0b,0xc1,0xc1, 0xc1,0xa9,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x14,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x12,0xc6,0xc6,0xc6,0x67,0x84,0xff,0xff, 0xff,0xff,0x06,0xdb,0xdb,0xdb,0xcc,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x35, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x26,0xd8,0xd8,0xd8,0x97,0x84,0xff,0xff, 0xff,0xff,0x0a,0xc0,0xc0,0xc0,0xaa,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x10,0xfd,0xfd,0xfd,0xf1,0x84,0xff, 0xff,0xff,0xff,0x09,0x4a,0x4a,0x4a,0x6e,0x00,0x00,0x00,0x54,0x00,0x00,0x00, 0x4b,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x37,0x00,0x00, 0x00,0x39,0x00,0x00,0x00,0x41,0xe8,0xe8,0xe8,0xd2,0x84,0xff,0xff,0xff,0xff, 0x07,0xe4,0xe4,0xe4,0xd6,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x2e,0x00,0x00, 0x00,0x1b,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1f,0x85, 0xff,0xff,0xff,0xff,0x05,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x33,0x00,0x00, 0x00,0x1f,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x05,0x83,0x00,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x13,0xb3,0xb3, 0xb3,0x5b,0x84,0xff,0xff,0xff,0xff,0x05,0xe5,0xe5,0xe5,0xd5,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x0e,0x82,0x00, 0x00,0x00,0x08,0x09,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x16,0x00,0x00,0x00, 0x1f,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x3f,0x00,0x00, 0x00,0x4a,0x2b,0x2b,0x2b,0x5f,0xdb,0xdb,0xdb,0xcc,0x85,0xff,0xff,0xff,0xff, 0x06,0xde,0xde,0xde,0xb7,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x1a,0x00,0x00, 0x00,0x0e,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x83,0x00,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x26,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x49, 0xb3,0xb3,0xb3,0xa0,0x85,0xff,0xff,0xff,0xff,0x04,0x8d,0x8d,0x8d,0x74,0x00, 0x00,0x00,0x3a,0x00,0x00,0x00,0x37,0xe5,0xe5,0xe5,0xc3,0x84,0xff,0xff,0xff, 0xff,0x0b,0xe6,0xe6,0xe6,0xd4,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x14,0xe5,0xe5,0xe5, 0x9f,0x84,0xff,0xff,0xff,0xff,0x06,0xa2,0xa2,0xa2,0x97,0x00,0x00,0x00,0x47, 0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x25,0xda,0xda,0xda, 0x96,0x84,0xff,0xff,0xff,0xff,0x05,0xc0,0xc0,0xc0,0xaa,0x00,0x00,0x00,0x40, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0a,0x82,0x00,0x00, 0x00,0x03,0x02,0x00,0x00,0x00,0x0a,0xbc,0xbc,0xbc,0x41,0x84,0xff,0xff,0xff, 0xff,0x0a,0xeb,0xeb,0xeb,0xe1,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x4e,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x26, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x33,0xeb,0xeb,0xeb,0xcf,0x84,0xff,0xff, 0xff,0xff,0x07,0xe4,0xe4,0xe4,0xd6,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x2e, 0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00, 0x1f,0x85,0xff,0xff,0xff,0xff,0x05,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x33, 0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x05,0x83,0x00,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x13, 0xb3,0xb3,0xb3,0x5b,0x84,0xff,0xff,0xff,0xff,0x11,0xe5,0xe5,0xe5,0xd5,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x0d, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x0b,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x21,0x00,0x00, 0x00,0x2b,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x43,0x2d,0x2d,0x2d,0x5b,0xf9, 0xf9,0xf9,0xf5,0x84,0xff,0xff,0xff,0xff,0x06,0xe8,0xe8,0xe8,0xd2,0x00,0x00, 0x00,0x35,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x02,0x83,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x0a,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0a, 0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x1e,0x00,0x00,0x00, 0x2a,0x00,0x00,0x00,0x38,0x89,0x89,0x89,0x77,0x85,0xff,0xff,0xff,0xff,0x04, 0x87,0x87,0x87,0x79,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x39,0xb5,0xb5,0xb5, 0x87,0x85,0xff,0xff,0xff,0xff,0x0a,0x5a,0x5a,0x5a,0x5b,0x00,0x00,0x00,0x2d, 0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x05,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0x6b,0x6b,0x6b,0x26,0xfc,0xfc, 0xfc,0xf2,0x84,0xff,0xff,0xff,0xff,0x06,0x2b,0x2b,0x2b,0x5f,0x00,0x00,0x00, 0x41,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x22,0xda,0xda, 0xda,0x96,0x84,0xff,0xff,0xff,0xff,0x09,0xc0,0xc0,0xc0,0xaa,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0b,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0d,0xc5,0xc5,0xc5,0x53,0x84, 0xff,0xff,0xff,0xff,0x0a,0xeb,0xeb,0xeb,0xe1,0x00,0x00,0x00,0x57,0x00,0x00, 0x00,0x45,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x1a,0x00, 0x00,0x00,0x17,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x29,0xec,0xec,0xec,0xce, 0x84,0xff,0xff,0xff,0xff,0x07,0xe4,0xe4,0xe4,0xd6,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x2e,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13, 0x00,0x00,0x00,0x1f,0x85,0xff,0xff,0xff,0xff,0x05,0x00,0x00,0x00,0x4d,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x05, 0x83,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x13,0xb3,0xb3,0xb3,0x5b,0x84,0xff,0xff,0xff,0xff,0x11,0xe5,0xe5, 0xe5,0xd5,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x1b,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0d,0x00,0x00,0x00, 0x12,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x31,0x00,0x00, 0x00,0x41,0xe7,0xe7,0xe7,0xd3,0x84,0xff,0xff,0xff,0xff,0x07,0xe6,0xe6,0xe6, 0xd4,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x15,0x00,0x00, 0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01, 0x0c,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x2e, 0xcd,0xcd,0xcd,0x9f,0x85,0xff,0xff,0xff,0xff,0x04,0x2d,0x2d,0x2d,0x5a,0x00, 0x00,0x00,0x3e,0x00,0x00,0x00,0x37,0x3a,0x3a,0x3a,0x46,0x85,0xff,0xff,0xff, 0xff,0x09,0xe0,0xe0,0xe0,0xc7,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x22,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0a, 0x00,0x00,0x00,0x12,0xe8,0xe8,0xe8,0x9d,0x84,0xff,0xff,0xff,0xff,0x07,0xd2, 0xd2,0xd2,0xc1,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x28, 0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x20,0xdb,0xdb,0xdb,0x95,0x84,0xff,0xff, 0xff,0xff,0x09,0xbf,0xbf,0xbf,0xab,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x2b, 0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x05,0x00,0x00,0x00, 0x07,0x00,0x00,0x00,0x10,0xbc,0xbc,0xbc,0x57,0x85,0xff,0xff,0xff,0xff,0x09, 0x4e,0x4e,0x4e,0x69,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x2d,0x00,0x00,0x00, 0x1e,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x19,0x7e,0x7e, 0x7e,0x41,0xf7,0xf7,0xf7,0xe6,0x84,0xff,0xff,0xff,0xff,0x07,0xe4,0xe4,0xe4, 0xd6,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x1b,0x00,0x00, 0x00,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1f,0x85,0xff,0xff,0xff,0xff, 0x05,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x1f,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x05,0x83,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x13,0xb3,0xb3,0xb3,0x5b,0x84,0xff, 0xff,0xff,0xff,0x11,0xe5,0xe5,0xe5,0xd5,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x2e,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x19, 0x00,0x00,0x00,0x26,0x3d,0x3d,0x3d,0x43,0xfa,0xfa,0xfa,0xf4,0x84,0xff,0xff, 0xff,0xff,0x0e,0xcb,0xcb,0xcb,0xb4,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x28, 0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0xf0,0xf0, 0xf0,0x55,0xc7,0xc7,0xc7,0x29,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0d,0x82, 0x00,0x00,0x00,0x0e,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x14,0x00,0x00, 0x00,0x1d,0xb9,0xb9,0xb9,0x6e,0x85,0xff,0xff,0xff,0xff,0x06,0xe4,0xe4,0xe4, 0xd6,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x33,0x00,0x00, 0x00,0x34,0xde,0xde,0xde,0xb7,0x85,0xff,0xff,0xff,0xff,0x07,0xde,0xde,0xde, 0xb7,0x45,0x45,0x45,0x3b,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x15,0x00,0x00, 0x00,0x11,0x75,0x75,0x75,0x23,0xea,0xea,0xea,0x9c,0x84,0xff,0xff,0xff,0xff, 0x08,0xf9,0xf9,0xf9,0xf5,0x4c,0x4c,0x4c,0x6c,0x00,0x00,0x00,0x47,0x00,0x00, 0x00,0x33,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x1e,0xdb, 0xdb,0xdb,0x95,0x84,0xff,0xff,0xff,0xff,0x09,0xdc,0xdc,0xdc,0xcb,0x00,0x00, 0x00,0x46,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x14,0x84,0x84,0x84,0x3e, 0x85,0xff,0xff,0xff,0xff,0x08,0xdd,0xdd,0xdd,0xca,0x35,0x35,0x35,0x4d,0x00, 0x00,0x00,0x2e,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x16,0x71,0x71,0x71,0x24, 0xe6,0xe6,0xe6,0x8e,0xfc,0xfc,0xfc,0xf2,0x85,0xff,0xff,0xff,0xff,0x07,0xe4, 0xe4,0xe4,0xd6,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x1b, 0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1f,0x85,0xff,0xff, 0xff,0xff,0x05,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x1f, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x05,0x83,0x00,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x13,0xb3,0xb3,0xb3,0x5b, 0x84,0xff,0xff,0xff,0xff,0x10,0xe5,0xe5,0xe5,0xd5,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x2e,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x10,0xcc,0xcc,0xcc,0x28, 0xf0,0xf0,0xf0,0x55,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0c,0x00,0x00,0x00, 0x0d,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x11,0x00,0x00, 0x00,0x18,0x52,0x52,0x52,0x32,0xf3,0xf3,0xf3,0xd9,0x85,0xff,0xff,0xff,0xff, 0x0f,0x6a,0x6a,0x6a,0x74,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x28,0x00,0x00, 0x00,0x16,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0xfb,0xfb,0xfb,0xc2, 0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xf0,0xf7,0xf7,0xf7,0xc5,0xed,0xed,0xed, 0x9a,0x82,0xe7,0xe7,0xe7,0x8d,0x02,0xe6,0xe6,0xe6,0x8e,0xf7,0xf7,0xf7,0xd6, 0x86,0xff,0xff,0xff,0xff,0x03,0x7d,0x7d,0x7d,0x83,0x00,0x00,0x00,0x47,0x00, 0x00,0x00,0x35,0x82,0x00,0x00,0x00,0x2c,0x02,0x3c,0x3c,0x3c,0x44,0xfa,0xfa, 0xfa,0xf4,0x85,0xff,0xff,0xff,0xff,0x05,0xfb,0xfb,0xfb,0xf3,0xec,0xec,0xec, 0xbd,0xe0,0xe0,0xe0,0x92,0xed,0xed,0xed,0xab,0xfd,0xfd,0xfd,0xf1,0x85,0xff, 0xff,0xff,0xff,0x08,0xb0,0xb0,0xb0,0xa2,0x00,0x00,0x00,0x4f,0x00,0x00,0x00, 0x3e,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x16,0x00,0x00, 0x00,0x1b,0xdd,0xdd,0xdd,0x94,0x85,0xff,0xff,0xff,0xff,0x09,0xce,0xce,0xce, 0xb1,0x99,0x99,0x99,0x6b,0xd4,0xd4,0xd4,0x87,0xeb,0xeb,0xeb,0x9b,0xe3,0xe3, 0xe3,0x6c,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x24,0xf7, 0xf7,0xf7,0xe6,0x85,0xff,0xff,0xff,0xff,0x05,0xf5,0xf5,0xf5,0xe8,0xda,0xda, 0xda,0xa7,0xdb,0xdb,0xdb,0x95,0xf0,0xf0,0xf0,0xba,0xfd,0xfd,0xfd,0xf1,0x87, 0xff,0xff,0xff,0xff,0x07,0xe4,0xe4,0xe4,0xd6,0x00,0x00,0x00,0x46,0x00,0x00, 0x00,0x2e,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13,0x00, 0x00,0x00,0x1f,0x85,0xff,0xff,0xff,0xff,0x05,0x00,0x00,0x00,0x4d,0x00,0x00, 0x00,0x33,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x05,0x83, 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00, 0x00,0x13,0xb3,0xb3,0xb3,0x5b,0x84,0xff,0xff,0xff,0xff,0x06,0xe5,0xe5,0xe5, 0xd5,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x1e,0x00,0x00, 0x00,0x13,0xe3,0xe3,0xe3,0x5a,0x82,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7, 0xc5,0xf4,0xf4,0xf4,0xb7,0x83,0xe7,0xe7,0xe7,0x8d,0x02,0xf1,0xf1,0xf1,0xb9, 0xfc,0xfc,0xfc,0xf2,0x85,0xff,0xff,0xff,0xff,0x0b,0xda,0xda,0xda,0xcd,0x00, 0x00,0x00,0x50,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x14, 0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x8e,0xff,0xff,0xff,0xff,0x04, 0x9e,0x9e,0x9e,0x9b,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x3f,0x00,0x00,0x00, 0x2d,0x82,0x00,0x00,0x00,0x23,0x03,0x00,0x00,0x00,0x2c,0x7d,0x7d,0x7d,0x62, 0xfa,0xfa,0xfa,0xf4,0x8d,0xff,0xff,0xff,0xff,0x09,0xd2,0xd2,0xd2,0xc1,0x00, 0x00,0x00,0x53,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x21, 0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x18,0xd5,0xd5,0xd5, 0x86,0x89,0xff,0xff,0xff,0xff,0x05,0xf5,0xf5,0xf5,0xc7,0x00,0x00,0x00,0x1b, 0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x25,0xb0,0xb0,0xb0,0x74,0x8c,0xff,0xff, 0xff,0xff,0x02,0xfa,0xfa,0xfa,0xf4,0xf2,0xf2,0xf2,0xeb,0x83,0xff,0xff,0xff, 0xff,0x07,0xe4,0xe4,0xe4,0xd6,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x1b,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1f, 0x85,0xff,0xff,0xff,0xff,0x05,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x33,0x00, 0x00,0x00,0x1f,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x05,0x83,0x00,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x13,0xb3, 0xb3,0xb3,0x5b,0x84,0xff,0xff,0xff,0xff,0x06,0xe5,0xe5,0xe5,0xd5,0x00,0x00, 0x00,0x46,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x16,0xed, 0xed,0xed,0x8a,0x8d,0xff,0xff,0xff,0xff,0x0d,0xeb,0xeb,0xeb,0xe1,0x2a,0x2a, 0x2a,0x62,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x1f,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0f,0xfd,0xfd,0xfd, 0xf1,0x8b,0xff,0xff,0xff,0xff,0x0c,0xf9,0xf9,0xf9,0xf5,0x9e,0x9e,0x9e,0x9b, 0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x33,0x00,0x00,0x00, 0x23,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x21,0x00,0x00, 0x00,0x31,0x78,0x78,0x78,0x66,0xf4,0xf4,0xf4,0xe9,0x8a,0xff,0xff,0xff,0xff, 0x07,0xf9,0xf9,0xf9,0xf5,0xa2,0xa2,0xa2,0x97,0x00,0x00,0x00,0x53,0x00,0x00, 0x00,0x48,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x18,0x82, 0x00,0x00,0x00,0x0e,0x03,0x00,0x00,0x00,0x15,0x52,0x52,0x52,0x32,0xfb,0xfb, 0xfb,0xf3,0x88,0xff,0xff,0xff,0xff,0x06,0xfc,0xfc,0xfc,0xf2,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x30,0xde,0xde, 0xde,0xb7,0x8a,0xff,0xff,0xff,0xff,0x03,0xe7,0xe7,0xe7,0xd3,0x4d,0x4d,0x4d, 0x6a,0xdb,0xdb,0xdb,0xcc,0x83,0xff,0xff,0xff,0xff,0x07,0xe6,0xe6,0xe6,0xd4, 0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x19,0x00,0x00,0x00, 0x11,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x1d,0x85,0xff,0xff,0xff,0xff,0x05, 0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x1d,0x00,0x00,0x00, 0x0f,0x00,0x00,0x00,0x05,0x83,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x12,0xb7,0xb7,0xb7,0x59,0x84,0xff,0xff, 0xff,0xff,0x06,0xe6,0xe6,0xe6,0xd4,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x2c, 0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x18,0xe4,0xe4,0xe4,0x7d,0x8c,0xff,0xff, 0xff,0xff,0x11,0xe3,0xe3,0xe3,0xd7,0x29,0x29,0x29,0x63,0x00,0x00,0x00,0x4d, 0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x18,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x1c,0xac, 0xac,0xac,0x5f,0xda,0xda,0xda,0xa7,0xeb,0xeb,0xeb,0xcf,0x86,0xff,0xff,0xff, 0xff,0x08,0xf3,0xf3,0xf3,0xea,0xbd,0xbd,0xbd,0xad,0x29,0x29,0x29,0x63,0x00, 0x00,0x00,0x52,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x27, 0x00,0x00,0x00,0x19,0x82,0x00,0x00,0x00,0x11,0x06,0x00,0x00,0x00,0x17,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x34,0x33,0x33,0x33,0x50,0xb6,0xb6,0xb6,0x9d, 0xf3,0xf3,0xf3,0xea,0x86,0xff,0xff,0xff,0xff,0x0f,0xf3,0xf3,0xf3,0xea,0xbf, 0xbf,0xbf,0xab,0x2b,0x2b,0x2b,0x60,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x47, 0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x1c,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x12,0x00,0x00, 0x00,0x20,0x8a,0x8a,0x8a,0x59,0xf5,0xf5,0xf5,0xe8,0x86,0xff,0xff,0xff,0xff, 0x03,0xeb,0xeb,0xeb,0xcf,0xcb,0xcb,0xcb,0x8d,0x00,0x00,0x00,0x29,0x82,0x00, 0x00,0x00,0x22,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x37,0xbc,0xbc,0xbc, 0x98,0xf3,0xf3,0xf3,0xea,0x86,0xff,0xff,0xff,0xff,0x05,0xe0,0xe0,0xe0,0xc7, 0x86,0x86,0x86,0x7a,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x52,0xa3,0xa3,0xa3, 0x96,0x82,0xe4,0xe4,0xe4,0xd6,0x12,0xe5,0xe5,0xe5,0xd5,0xcf,0xcf,0xcf,0xb0, 0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x17,0x00,0x00,0x00, 0x0f,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x1a,0xf1,0xf1,0xf1,0xca,0xeb,0xeb, 0xeb,0xcf,0xe7,0xe7,0xe7,0xd3,0xe6,0xe6,0xe6,0xd4,0xe7,0xe7,0xe7,0xd3,0x00, 0x00,0x00,0x41,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x0d, 0x00,0x00,0x00,0x05,0x83,0x00,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x11,0xa8,0xa8,0xa8,0x49,0xf0,0xf0,0xf0,0xcb, 0xea,0xea,0xea,0xd0,0xe7,0xe7,0xe7,0xd3,0xe6,0xe6,0xe6,0xd4,0xcf,0xcf,0xcf, 0xb0,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00, 0x00,0x17,0x00,0x00,0x00,0x1a,0x82,0x82,0x82,0x3f,0xc1,0xc1,0xc1,0x7f,0xe6, 0xe6,0xe6,0xc2,0xf6,0xf6,0xf6,0xe7,0x85,0xff,0xff,0xff,0xff,0x22,0xfa,0xfa, 0xfa,0xf4,0xdc,0xdc,0xdc,0xcb,0x7d,0x7d,0x7d,0x83,0x00,0x00,0x00,0x56,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x1e, 0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x34,0x00, 0x00,0x00,0x3e,0x00,0x00,0x00,0x46,0x54,0x54,0x54,0x61,0x87,0x87,0x87,0x79, 0x86,0x86,0x86,0x7a,0x84,0x84,0x84,0x7c,0x00,0x00,0x00,0x52,0x00,0x00,0x00, 0x53,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x42,0x00,0x00, 0x00,0x36,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x10,0x82, 0x00,0x00,0x00,0x0a,0x1d,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x18,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x4b,0x4f, 0x4f,0x4f,0x67,0x81,0x81,0x81,0x7f,0x80,0x80,0x80,0x80,0x81,0x81,0x81,0x7f, 0x82,0x82,0x82,0x7e,0x4e,0x4e,0x4e,0x68,0x00,0x00,0x00,0x51,0x00,0x00,0x00, 0x4f,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x37,0x00,0x00, 0x00,0x2a,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x19, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x3b,0x71,0x71,0x71,0x6c,0x81,0x81,0x81, 0x7f,0x82,0x7e,0x7e,0x7e,0x82,0x13,0x6a,0x6a,0x6a,0x73,0x00,0x00,0x00,0x4b, 0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x2a,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x38,0x00,0x00,0x00,0x46,0x83,0x83,0x83,0x7d,0x7f,0x7f,0x7f,0x81,0x7e, 0x7e,0x7e,0x82,0x80,0x80,0x80,0x80,0x6a,0x6a,0x6a,0x73,0x00,0x00,0x00,0x4f, 0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x49,0x82,0x00,0x00,0x00,0x47,0x01,0x00, 0x00,0x00,0x49,0x82,0x00,0x00,0x00,0x4c,0x12,0x00,0x00,0x00,0x48,0x00,0x00, 0x00,0x3f,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x14,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x42,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x16,0x00,0x00, 0x00,0x0b,0x00,0x00,0x00,0x04,0x83,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x1a,0x00,0x00, 0x00,0x2a,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x45,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x18, 0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x21,0x00,0x00,0x00, 0x2f,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x48,0x88,0x88, 0x88,0x78,0x86,0x86,0x86,0x7a,0x84,0x84,0x84,0x7c,0x4e,0x4e,0x4e,0x68,0x00, 0x00,0x00,0x53,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x47, 0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x21,0x00,0x00,0x00, 0x14,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x82,0x00, 0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x2b,0x00,0x00, 0x00,0x34,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x44,0x00, 0x00,0x00,0x46,0x82,0x00,0x00,0x00,0x47,0x08,0x00,0x00,0x00,0x45,0x00,0x00, 0x00,0x40,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x09,0x82,0x00,0x00,0x00, 0x05,0x2c,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x18,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x40, 0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x4a,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x40,0x00,0x00, 0x00,0x39,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x1b,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x12,0x00,0x00,0x00, 0x1f,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x43,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x42,0x00, 0x00,0x00,0x3a,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1a, 0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x1d,0x00,0x00,0x00, 0x28,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x46,0x82,0x00, 0x00,0x00,0x4a,0x05,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x45,0x00,0x00,0x00, 0x41,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x38,0x82,0x00,0x00,0x00,0x36,0x82, 0x00,0x00,0x00,0x38,0x12,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x30,0x00,0x00, 0x00,0x26,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x2a, 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x33,0x00,0x00,0x00, 0x2a,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x03,0x83,0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x2c,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x31,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x26,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x42,0x00,0x00, 0x00,0x45,0x82,0x00,0x00,0x00,0x47,0x0b,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x43,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x1f,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x15,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x2b, 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x34,0x00,0x00,0x00, 0x35,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0x00,0x02,0x09,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x14,0x00, 0x00,0x00,0x1d,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x31, 0x00,0x00,0x00,0x35,0x82,0x00,0x00,0x00,0x36,0x13,0x00,0x00,0x00,0x34,0x00, 0x00,0x00,0x31,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x1e, 0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x09,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x06,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x1e,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x33,0x82,0x00,0x00,0x00, 0x35,0x05,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x23,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x12,0x82,0x00,0x00,0x00,0x0e,0x15,0x00,0x00, 0x00,0x12,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x31,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x35, 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x2a,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x23,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x19,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x0a,0x82,0x00,0x00,0x00,0x07,0x0b,0x00,0x00, 0x00,0x0b,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x13, 0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x83,0x00,0x00, 0x00,0x00,0x15,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07, 0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x1d,0x00,0x00,0x00, 0x22,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x19,0x00,0x00, 0x00,0x11,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x12,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x28, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x33,0x82,0x00,0x00, 0x00,0x34,0x0a,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x28, 0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x12,0x00,0x00,0x00, 0x0b,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x83,0x00, 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x11,0x00,0x00, 0x00,0x16,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x20,0x82, 0x00,0x00,0x00,0x21,0x09,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x1e,0x00,0x00, 0x00,0x1a,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00, 0x01,0x09,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x1a, 0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21,0x82,0x00,0x00,0x00,0x22,0x2b,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x16, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x1f,0x00,0x00,0x00, 0x1b,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0b,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x21, 0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x1f,0x00,0x00,0x00, 0x1c,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x13,0x00,0x00, 0x00,0x12,0x00,0x00,0x00,0x13,0x82,0x00,0x00,0x00,0x14,0x04,0x00,0x00,0x00, 0x12,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x06,0x82,0x00, 0x00,0x00,0x04,0x0b,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0b,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x14,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,0x83,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x11,0x82,0x00,0x00,0x00,0x14,0x0d,0x00,0x00,0x00,0x13,0x00,0x00, 0x00,0x0f,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x14, 0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x1f,0x00,0x00,0x00, 0x20,0x82,0x00,0x00,0x00,0x21,0x09,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x1c, 0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0d,0x00,0x00,0x00, 0x09,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x85,0x00, 0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0a,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x10,0x83,0x00,0x00,0x00,0x11, 0x06,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0a,0x00,0x00, 0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x01, 0x82,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x07,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0a,0x00,0x00,0x00, 0x0d,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x11,0x82,0x00,0x00,0x00,0x12,0x07, 0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0d,0x00,0x00,0x00, 0x0a,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x82,0x00, 0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x06,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0c, 0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x11,0x82,0x00,0x00,0x00,0x12,0x0d,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x08, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0d,0x00,0x00, 0x00,0x0f,0x00,0x00,0x00,0x11,0x82,0x00,0x00,0x00,0x12,0x04,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0a,0x83,0x00, 0x00,0x00,0x08,0x83,0x00,0x00,0x00,0x09,0x03,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x02,0x0b,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x0a,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x84,0x00,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x08,0x82,0x00,0x00,0x00,0x0a,0x03,0x00,0x00, 0x00,0x09,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x05,0x83,0x00,0x00,0x00,0x03, 0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x0b,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x10,0x83,0x00,0x00,0x00,0x11, 0x08,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0b,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,0x88,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x05,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x06,0x82,0x00,0x00,0x00,0x07,0x05,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02, 0x82,0x00,0x00,0x00,0x01,0x86,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01, 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x06,0x84,0x00,0x00,0x00,0x07,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x01,0x85, 0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0x00,0x06,0x82,0x00,0x00, 0x00,0x07,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x83,0x00,0x00,0x00,0x01,0x04,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06, 0x83,0x00,0x00,0x00,0x07,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x83,0x00,0x00,0x00,0x02,0x83,0x00,0x00, 0x00,0x03,0x82,0x00,0x00,0x00,0x02,0x84,0x00,0x00,0x00,0x01,0x01,0x00,0x00, 0x00,0x02,0x85,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x02,0x82,0x00,0x00, 0x00,0x01,0x86,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x01,0x00,0x00, 0x00,0x02,0x84,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x02,0x84,0x00,0x00, 0x00,0x01,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x05,0x82,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00,0x07,0x82, 0x00,0x00,0x00,0x06,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x82,0x00, 0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x01,0x8f,0x00,0x00,0x00,0x00,0x87,0x00, 0x00,0x00,0x01,0x8e,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x01,0x8c,0x00, 0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x01,0x86,0x00,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x01,0xac,0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x01,0x8b,0x00, 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff, 0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff, 0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff, 0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff, 0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff, 0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff, 0xff,0xff,0x00,0x89,0xff,0xff,0xff,0x00 }; static const GdkPixdata solaris_pixdata = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 20438, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 540, /* rowstride */ 135, /* width */ 110, /* height */ solaris_pixdata_pixel_data /* pixel_data */ }; nvidia-settings/src/image_data/sdi_pixdata.h0000664000175000017500000040411412236467170021352 0ustar albertoalberto/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static guint8 sdi_pixdata_pixel_data[] = { 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xab,0xff,0xff,0xff,0x00, 0x08,0xef,0xef,0xf2,0x12,0xef,0xef,0xf3,0x36,0xef,0xef,0xf3,0x59,0xef,0xef, 0xf3,0x7d,0xef,0xef,0xf3,0xa0,0xf0,0xf0,0xf3,0xc4,0xf0,0xf0,0xf3,0xe8,0xf0, 0xf0,0xf4,0xff,0x84,0xf1,0xf1,0xf4,0xff,0x01,0xf1,0xf1,0xf5,0xff,0x84,0xf2, 0xf2,0xf5,0xff,0x01,0xf3,0xf3,0xf5,0xff,0x84,0xf3,0xf3,0xf6,0xff,0x01,0xf4, 0xf4,0xf6,0xff,0x82,0xf4,0xf4,0xf7,0xff,0x84,0xf5,0xf5,0xf7,0xff,0x01,0xf5, 0xf5,0xf8,0xff,0x84,0xf6,0xf6,0xf8,0xff,0x85,0xf7,0xf7,0xf9,0xff,0x01,0xf8, 0xf8,0xf9,0xff,0x82,0xf8,0xf8,0xfa,0xff,0x83,0xf9,0xf9,0xfa,0xff,0x82,0xf9, 0xf9,0xfb,0xff,0x83,0xfa,0xfa,0xfb,0xff,0x01,0xfb,0xfb,0xfb,0xff,0x84,0xfb, 0xfb,0xfc,0xff,0x01,0xfc,0xfc,0xfc,0xff,0x83,0xfc,0xfc,0xfd,0xff,0x83,0xfd, 0xfd,0xfd,0xff,0x82,0xfd,0xfd,0xfe,0xff,0x83,0xfe,0xfe,0xfe,0xff,0x8b,0xff, 0xff,0xff,0xff,0x82,0xfe,0xfe,0xff,0xff,0x84,0xfe,0xfe,0xfe,0xff,0x82,0xfd, 0xfd,0xfe,0xff,0x85,0xfd,0xfd,0xfd,0xff,0x83,0xfc,0xfc,0xfd,0xff,0x85,0xfb, 0xfb,0xfc,0xff,0x83,0xfa,0xfa,0xfb,0xff,0x83,0xf9,0xf9,0xfb,0xff,0x82,0xf9, 0xf9,0xfa,0xff,0x02,0xf8,0xf8,0xfa,0xff,0xf8,0xf8,0xf9,0xff,0x84,0xf7,0xf7, 0xf9,0xff,0x83,0xf6,0xf6,0xf8,0xff,0x83,0xf5,0xf5,0xf7,0xff,0x82,0xf4,0xf4, 0xf7,0xff,0x0f,0xf4,0xf4,0xf6,0xff,0xf3,0xf3,0xf6,0xff,0xf3,0xf3,0xf6,0xfc, 0xf3,0xf3,0xf5,0xe9,0xf2,0xf2,0xf5,0xd5,0xf2,0xf2,0xf5,0xc0,0xf1,0xf1,0xf5, 0xab,0xf1,0xf1,0xf4,0x96,0xf1,0xf1,0xf4,0x81,0xf0,0xf0,0xf4,0x6c,0xf0,0xf0, 0xf3,0x57,0xef,0xef,0xf3,0x42,0xef,0xef,0xf3,0x2d,0xef,0xef,0xf3,0x18,0xef, 0xef,0xf2,0x04,0xbb,0xff,0xff,0xff,0x00,0x09,0xcd,0xcd,0xdb,0x12,0xcd,0xcd, 0xdc,0x36,0xd2,0xd2,0xdf,0x60,0xd7,0xd7,0xe2,0x98,0xcf,0xcf,0xdd,0xa0,0xcf, 0xcf,0xdd,0xc4,0xcf,0xcf,0xdd,0xe8,0xd0,0xd0,0xdd,0xff,0xd0,0xd0,0xde,0xff, 0x82,0xd1,0xd1,0xde,0xff,0x82,0xd2,0xd2,0xdf,0xff,0x02,0xd3,0xd3,0xdf,0xff, 0xd3,0xd3,0xe0,0xff,0x82,0xd4,0xd4,0xe0,0xff,0x02,0xd5,0xd5,0xe0,0xff,0xd5, 0xd5,0xe1,0xff,0x82,0xd6,0xd6,0xe1,0xff,0x83,0xd7,0xd7,0xe2,0xff,0x82,0xd8, 0xd8,0xe3,0xff,0x82,0xd9,0xd9,0xe3,0xff,0x82,0xda,0xda,0xe4,0xff,0x02,0xdb, 0xdb,0xe4,0xff,0xdb,0xdb,0xe5,0xff,0x82,0xdc,0xdc,0xe5,0xff,0x82,0xdd,0xdd, 0xe6,0xff,0x82,0xde,0xde,0xe6,0xff,0x83,0xdf,0xdf,0xe7,0xff,0x82,0xe0,0xe0, 0xe8,0xff,0x02,0xe1,0xe1,0xe8,0xff,0xe1,0xe1,0xe9,0xff,0x82,0xe2,0xe2,0xe9, 0xff,0x02,0xe3,0xe3,0xe9,0xff,0xe3,0xe3,0xea,0xff,0x82,0xe4,0xe4,0xea,0xff, 0x82,0xe5,0xe5,0xeb,0xff,0x82,0xe6,0xe6,0xeb,0xff,0x83,0xe7,0xe7,0xec,0xff, 0x82,0xe8,0xe8,0xed,0xff,0x02,0xe9,0xe9,0xed,0xff,0xe9,0xe9,0xee,0xff,0x82, 0xea,0xea,0xee,0xff,0x82,0xeb,0xeb,0xef,0xff,0x82,0xec,0xec,0xef,0xff,0x82, 0xed,0xed,0xf0,0xff,0x02,0xee,0xee,0xf0,0xff,0xee,0xee,0xf1,0xff,0x83,0xef, 0xef,0xf1,0xff,0x82,0xf0,0xf0,0xf2,0xff,0x02,0xf1,0xf1,0xf2,0xff,0xf1,0xf1, 0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x82,0xf3,0xf3,0xf4,0xff,0x82,0xf4,0xf4, 0xf4,0xff,0x87,0xf5,0xf5,0xf5,0xff,0x01,0xf4,0xf4,0xf5,0xff,0x85,0xf4,0xf4, 0xf4,0xff,0x82,0xf3,0xf3,0xf4,0xff,0x82,0xf3,0xf3,0xf3,0xff,0x82,0xf2,0xf2, 0xf3,0xff,0x82,0xf2,0xf2,0xf2,0xff,0x83,0xf1,0xf1,0xf2,0xff,0x83,0xf0,0xf0, 0xf1,0xff,0x83,0xef,0xef,0xf0,0xff,0x01,0xee,0xee,0xf0,0xff,0x82,0xee,0xee, 0xef,0xff,0x02,0xed,0xed,0xef,0xff,0xed,0xed,0xee,0xff,0x82,0xec,0xec,0xee, 0xff,0x0e,0xec,0xec,0xed,0xff,0xeb,0xeb,0xed,0xfc,0xeb,0xeb,0xed,0xe9,0xea, 0xea,0xec,0xd5,0xea,0xea,0xec,0xc0,0xea,0xea,0xec,0xab,0xe9,0xe9,0xeb,0x96, 0xe9,0xe9,0xeb,0x81,0xe8,0xe8,0xeb,0x6c,0xe8,0xe8,0xea,0x57,0xe7,0xe7,0xea, 0x42,0xe7,0xe7,0xe9,0x2d,0xe6,0xe6,0xe9,0x18,0xe6,0xe6,0xe9,0x04,0xbb,0xff, 0xff,0xff,0x00,0x07,0xef,0xef,0xf4,0x39,0xee,0xee,0xf3,0x9f,0xec,0xec,0xf2, 0xe7,0xe6,0xe6,0xee,0xf3,0xde,0xde,0xe8,0xe9,0xd4,0xd4,0xe0,0xd6,0xd0,0xd0, 0xde,0xe8,0x83,0xd1,0xd1,0xde,0xff,0x82,0xd2,0xd2,0xdf,0xff,0x82,0xd3,0xd3, 0xdf,0xff,0x83,0xd4,0xd4,0xe0,0xff,0x82,0xd5,0xd5,0xe1,0xff,0x82,0xd6,0xd6, 0xe1,0xff,0x82,0xd7,0xd7,0xe2,0xff,0x02,0xd8,0xd8,0xe2,0xff,0xd8,0xd8,0xe3, 0xff,0x82,0xd9,0xd9,0xe3,0xff,0x82,0xda,0xda,0xe4,0xff,0x82,0xdb,0xdb,0xe4, 0xff,0x83,0xdc,0xdc,0xe5,0xff,0x82,0xdd,0xdd,0xe6,0xff,0x02,0xde,0xde,0xe6, 0xff,0xde,0xde,0xe7,0xff,0x82,0xdf,0xdf,0xe7,0xff,0x02,0xe0,0xe0,0xe7,0xff, 0xe0,0xe0,0xe8,0xff,0x82,0xe1,0xe1,0xe8,0xff,0x82,0xe2,0xe2,0xe9,0xff,0x02, 0xe3,0xe3,0xe9,0xff,0xe3,0xe3,0xea,0xff,0x83,0xe4,0xe4,0xea,0xff,0x82,0xe5, 0xe5,0xeb,0xff,0x02,0xe6,0xe6,0xeb,0xff,0xe6,0xe6,0xec,0xff,0x82,0xe7,0xe7, 0xec,0xff,0x82,0xe8,0xe8,0xed,0xff,0x82,0xe9,0xe9,0xed,0xff,0x82,0xea,0xea, 0xee,0xff,0x02,0xeb,0xeb,0xee,0xff,0xeb,0xeb,0xef,0xff,0x82,0xec,0xec,0xef, 0xff,0x01,0xec,0xec,0xf0,0xff,0x82,0xed,0xed,0xf0,0xff,0x02,0xee,0xee,0xf0, 0xff,0xee,0xee,0xf1,0xff,0x82,0xef,0xef,0xf1,0xff,0x82,0xf0,0xf0,0xf2,0xff, 0x02,0xf1,0xf1,0xf2,0xff,0xf1,0xf1,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x02, 0xf3,0xf3,0xf3,0xff,0xf3,0xf3,0xf4,0xff,0x82,0xf4,0xf4,0xf4,0xff,0x87,0xf5, 0xf5,0xf5,0xff,0x01,0xf4,0xf4,0xf5,0xff,0x85,0xf4,0xf4,0xf4,0xff,0x82,0xf3, 0xf3,0xf4,0xff,0x83,0xf3,0xf3,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x01,0xf2, 0xf2,0xf2,0xff,0x83,0xf1,0xf1,0xf2,0xff,0x01,0xf1,0xf1,0xf1,0xff,0x83,0xf0, 0xf0,0xf1,0xff,0x82,0xef,0xef,0xf0,0xff,0x01,0xee,0xee,0xf0,0xff,0x82,0xee, 0xee,0xef,0xff,0x01,0xed,0xed,0xef,0xff,0x82,0xed,0xed,0xee,0xff,0x10,0xec, 0xec,0xee,0xff,0xec,0xec,0xed,0xff,0xeb,0xeb,0xed,0xff,0xeb,0xeb,0xec,0xfc, 0xea,0xea,0xec,0xe9,0xea,0xea,0xec,0xd5,0xe9,0xe9,0xeb,0xc0,0xe9,0xe9,0xeb, 0xab,0xe8,0xe8,0xeb,0x96,0xe8,0xe8,0xea,0x81,0xe7,0xe7,0xea,0x6c,0xe7,0xe7, 0xe9,0x57,0xe6,0xe6,0xe9,0x42,0xe6,0xe6,0xe9,0x2d,0xe5,0xe5,0xe8,0x18,0xe5, 0xe5,0xe8,0x04,0xb8,0xff,0xff,0xff,0x00,0x0a,0xff,0xff,0xff,0x07,0xff,0xff, 0xff,0x51,0xff,0xff,0xff,0xad,0xfb,0xfb,0xfc,0xe1,0xf4,0xf4,0xf7,0xe8,0xed, 0xed,0xf2,0xee,0xe7,0xe7,0xee,0xf3,0xe1,0xe1,0xea,0xf8,0xd8,0xd8,0xe3,0xe8, 0xd1,0xd1,0xde,0xe8,0x82,0xd2,0xd2,0xde,0xff,0x82,0xd2,0xd2,0xdf,0xff,0x02, 0xd3,0xd3,0xdf,0xff,0xd3,0xd3,0xe0,0xff,0x82,0xd4,0xd4,0xe0,0xff,0x82,0xd5, 0xd5,0xe1,0xff,0x82,0xd6,0xd6,0xe1,0xff,0x82,0xd7,0xd7,0xe2,0xff,0x02,0xd8, 0xd8,0xe2,0xff,0xd8,0xd8,0xe3,0xff,0x82,0xd9,0xd9,0xe3,0xff,0x83,0xda,0xda, 0xe4,0xff,0x02,0xdb,0xdb,0xe4,0xff,0xdb,0xdb,0xe5,0xff,0x82,0xdc,0xdc,0xe5, 0xff,0x82,0xdd,0xdd,0xe6,0xff,0x02,0xde,0xde,0xe6,0xff,0xde,0xde,0xe7,0xff, 0x82,0xdf,0xdf,0xe7,0xff,0x02,0xe0,0xe0,0xe7,0xff,0xe0,0xe0,0xe8,0xff,0x82, 0xe1,0xe1,0xe8,0xff,0x83,0xe2,0xe2,0xe9,0xff,0x82,0xe3,0xe3,0xea,0xff,0x82, 0xe4,0xe4,0xea,0xff,0x82,0xe5,0xe5,0xeb,0xff,0x02,0xe6,0xe6,0xeb,0xff,0xe6, 0xe6,0xec,0xff,0x82,0xe7,0xe7,0xec,0xff,0x82,0xe8,0xe8,0xed,0xff,0x82,0xe9, 0xe9,0xed,0xff,0x83,0xea,0xea,0xee,0xff,0x82,0xeb,0xeb,0xef,0xff,0x82,0xec, 0xec,0xef,0xff,0x82,0xed,0xed,0xf0,0xff,0x02,0xee,0xee,0xf0,0xff,0xee,0xee, 0xf1,0xff,0x82,0xef,0xef,0xf1,0xff,0x82,0xf0,0xf0,0xf2,0xff,0x02,0xf1,0xf1, 0xf2,0xff,0xf1,0xf1,0xf3,0xff,0x83,0xf2,0xf2,0xf3,0xff,0x82,0xf3,0xf3,0xf4, 0xff,0x02,0xf4,0xf4,0xf4,0xff,0xf4,0xf4,0xf5,0xff,0x87,0xf5,0xf5,0xf5,0xff, 0x85,0xf4,0xf4,0xf4,0xff,0x82,0xf3,0xf3,0xf4,0xff,0x83,0xf3,0xf3,0xf3,0xff, 0x82,0xf2,0xf2,0xf3,0xff,0x01,0xf2,0xf2,0xf2,0xff,0x83,0xf1,0xf1,0xf2,0xff, 0x01,0xf1,0xf1,0xf1,0xff,0x83,0xf0,0xf0,0xf1,0xff,0x83,0xef,0xef,0xf0,0xff, 0x82,0xee,0xee,0xef,0xff,0x82,0xed,0xed,0xef,0xff,0x01,0xed,0xed,0xee,0xff, 0x82,0xec,0xec,0xee,0xff,0x82,0xeb,0xeb,0xed,0xff,0x0e,0xea,0xea,0xec,0xff, 0xea,0xea,0xec,0xfc,0xe9,0xe9,0xeb,0xe9,0xe9,0xe9,0xeb,0xd5,0xe8,0xe8,0xeb, 0xc0,0xe8,0xe8,0xea,0xab,0xe7,0xe7,0xea,0x96,0xe7,0xe7,0xea,0x81,0xe6,0xe6, 0xe9,0x6c,0xe6,0xe6,0xe9,0x57,0xe5,0xe5,0xe8,0x42,0xe5,0xe5,0xe8,0x2d,0xe4, 0xe4,0xe8,0x18,0xe4,0xe4,0xe7,0x04,0x84,0xff,0xff,0xff,0x00,0x87,0x00,0x00, 0x00,0x00,0x19,0xff,0xff,0xff,0x06,0xc2,0xda,0xc2,0x50,0xb4,0xd1,0xb4,0x59, 0xb1,0xcf,0xb1,0x59,0xad,0xcd,0xad,0x59,0xaa,0xcc,0xaa,0x59,0xa8,0xca,0xa8, 0x59,0xa4,0xc8,0xa4,0x59,0xa1,0xc6,0xa1,0x59,0x9e,0xc4,0x9e,0x59,0x9b,0xc2, 0x9b,0x59,0x98,0xc1,0x98,0x59,0x95,0xbf,0x95,0x59,0x92,0xbd,0x92,0x59,0x8f, 0xbb,0x8f,0x59,0x8c,0xb9,0x8c,0x59,0x62,0xa0,0x62,0x76,0x55,0x98,0x55,0x80, 0x6e,0xa7,0x6e,0x99,0x6b,0xa5,0x6b,0x99,0x67,0xa3,0x67,0x99,0x64,0xa1,0x64, 0x99,0x60,0x9f,0x60,0x99,0x5d,0x9d,0x5d,0x99,0x5a,0x9b,0x5a,0x73,0x8d,0x00, 0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x0c,0xff,0xff,0xff,0x1f,0xff,0xff, 0xff,0x75,0xff,0xff,0xff,0xc5,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb,0xfb, 0xfb,0xfc,0xe1,0xf4,0xf4,0xf7,0xe8,0xed,0xed,0xf2,0xee,0xe7,0xe7,0xee,0xf3, 0xe1,0xe1,0xea,0xf8,0xd9,0xd9,0xe3,0xeb,0xd2,0xd2,0xdf,0xe8,0x82,0xd2,0xd2, 0xdf,0xff,0x02,0xd3,0xd3,0xdf,0xff,0xd3,0xd3,0xe0,0xff,0x82,0xd4,0xd4,0xe0, 0xff,0x02,0xd5,0xd5,0xe0,0xff,0xd5,0xd5,0xe1,0xff,0x82,0xd6,0xd6,0xe1,0xff, 0x82,0xd7,0xd7,0xe2,0xff,0x01,0xd8,0xd8,0xe2,0xff,0x82,0xd8,0xd8,0xe3,0xff, 0x82,0xd9,0xd9,0xe3,0xff,0x82,0xda,0xda,0xe4,0xff,0x02,0xdb,0xdb,0xe4,0xff, 0xdb,0xdb,0xe5,0xff,0x82,0xdc,0xdc,0xe5,0xff,0x82,0xdd,0xdd,0xe6,0xff,0x82, 0xde,0xde,0xe6,0xff,0x82,0xdf,0xdf,0xe7,0xff,0x01,0xe0,0xe0,0xe7,0xff,0x82, 0xe0,0xe0,0xe8,0xff,0x02,0xe1,0xe1,0xe8,0xff,0xe1,0xe1,0xe9,0xff,0x82,0xe2, 0xe2,0xe9,0xff,0x02,0xe3,0xe3,0xe9,0xff,0xe3,0xe3,0xea,0xff,0x82,0xe4,0xe4, 0xea,0xff,0x82,0xe5,0xe5,0xeb,0xff,0x02,0xe6,0xe6,0xeb,0xff,0xe6,0xe6,0xec, 0xff,0x82,0xe7,0xe7,0xec,0xff,0x01,0xe8,0xe8,0xec,0xff,0x82,0xe8,0xe8,0xed, 0xff,0x02,0xe9,0xe9,0xed,0xff,0xe9,0xe9,0xee,0xff,0x82,0xea,0xea,0xee,0xff, 0x82,0xeb,0xeb,0xef,0xff,0x82,0xec,0xec,0xef,0xff,0x82,0xed,0xed,0xf0,0xff, 0x02,0xee,0xee,0xf0,0xff,0xee,0xee,0xf1,0xff,0x82,0xef,0xef,0xf1,0xff,0x83, 0xf0,0xf0,0xf2,0xff,0x02,0xf1,0xf1,0xf2,0xff,0xf1,0xf1,0xf3,0xff,0x82,0xf2, 0xf2,0xf3,0xff,0x82,0xf3,0xf3,0xf4,0xff,0x02,0xf4,0xf4,0xf4,0xff,0xf4,0xf4, 0xf5,0xff,0x87,0xf5,0xf5,0xf5,0xff,0x01,0xf4,0xf4,0xf5,0xff,0x85,0xf4,0xf4, 0xf4,0xff,0x01,0xf3,0xf3,0xf4,0xff,0x83,0xf3,0xf3,0xf3,0xff,0x82,0xf2,0xf2, 0xf3,0xff,0x82,0xf2,0xf2,0xf2,0xff,0x82,0xf1,0xf1,0xf2,0xff,0x01,0xf1,0xf1, 0xf1,0xff,0x83,0xf0,0xf0,0xf1,0xff,0x83,0xef,0xef,0xf0,0xff,0x01,0xee,0xee, 0xf0,0xff,0x82,0xee,0xee,0xef,0xff,0x02,0xed,0xed,0xef,0xff,0xed,0xed,0xee, 0xff,0x82,0xec,0xec,0xee,0xff,0x01,0xec,0xec,0xed,0xff,0x82,0xeb,0xeb,0xed, 0xff,0x0f,0xea,0xea,0xec,0xff,0xe9,0xe9,0xec,0xff,0xe9,0xe9,0xeb,0xfc,0xe9, 0xe9,0xeb,0xe9,0xe8,0xe8,0xea,0xd5,0xe8,0xe8,0xea,0xc0,0xe7,0xe7,0xea,0xab, 0xe7,0xe7,0xe9,0x96,0xe6,0xe6,0xe9,0x81,0xe6,0xe6,0xe8,0x6c,0xe5,0xe5,0xe8, 0x57,0xe5,0xe5,0xe8,0x42,0xe4,0xe4,0xe7,0x2d,0xe4,0xe4,0xe7,0x18,0xe3,0xe3, 0xe6,0x04,0x84,0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x19,0xff,0xff, 0xff,0x20,0xa1,0xc6,0xa1,0xe2,0x95,0xbf,0x95,0xff,0x6f,0xa8,0x6f,0xff,0x6e, 0xab,0x6e,0xff,0x64,0xa1,0x64,0xff,0x62,0xa5,0x62,0xff,0x59,0x9a,0x59,0xff, 0x59,0x9f,0x59,0xff,0x56,0x9b,0x56,0xff,0x5a,0x9a,0x5a,0xff,0x6e,0xa7,0x6e, 0xff,0x6a,0xa4,0x6a,0xff,0x66,0xa2,0x66,0xff,0x81,0xb3,0x81,0xff,0x71,0x95, 0x71,0xff,0x6f,0x94,0x6f,0xff,0x6d,0x92,0x6d,0xff,0x6a,0x91,0x6a,0xff,0x68, 0x8f,0x68,0xff,0x66,0x8e,0x66,0xff,0x3d,0x7f,0x3d,0xff,0x40,0x8b,0x40,0xff, 0x3c,0x88,0x3c,0xff,0x76,0xac,0x76,0xff,0x82,0xff,0xff,0xff,0xbf,0x01,0xff, 0xff,0xff,0x60,0x8a,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x0f,0xff, 0xff,0xff,0x05,0xff,0xff,0xff,0x43,0xff,0xff,0xff,0x97,0xff,0xff,0xff,0xcc, 0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff, 0xdb,0xfb,0xfb,0xfc,0xe1,0xf4,0xf4,0xf7,0xe8,0xee,0xee,0xf3,0xee,0xe7,0xe7, 0xee,0xf3,0xe2,0xe2,0xea,0xf8,0xd9,0xd9,0xe4,0xeb,0xd3,0xd3,0xdf,0xe8,0x82, 0xd3,0xd3,0xdf,0xff,0x03,0xd4,0xd4,0xe0,0xff,0x00,0x00,0x00,0xff,0xaa,0xaa, 0xb3,0xff,0x82,0xd5,0xd5,0xe1,0xff,0x06,0x64,0x64,0x69,0xff,0x39,0x39,0x3c, 0xff,0x0e,0x0e,0x0f,0xff,0xd7,0xd7,0xe2,0xff,0xd8,0xd8,0xe2,0xff,0xd8,0xd8, 0xe3,0xff,0x82,0xd9,0xd9,0xe3,0xff,0x04,0x00,0x00,0x00,0xff,0xda,0xda,0xe4, 0xff,0xdb,0xdb,0xe4,0xff,0xdb,0xdb,0xe5,0xff,0x82,0xdc,0xdc,0xe5,0xff,0x02, 0x58,0x58,0x5c,0xff,0x00,0x00,0x00,0xff,0x82,0xde,0xde,0xe6,0xff,0x01,0xde, 0xde,0xe7,0xff,0x82,0xdf,0xdf,0xe7,0xff,0x82,0xe0,0xe0,0xe8,0xff,0x08,0xe1, 0xe1,0xe8,0xff,0x00,0x00,0x00,0xff,0xb5,0xb5,0xba,0xff,0xe2,0xe2,0xe9,0xff, 0xe3,0xe3,0xe9,0xff,0x6a,0x6a,0x6d,0xff,0x3d,0x3d,0x3e,0xff,0x0f,0x0f,0x10, 0xff,0x82,0xe5,0xe5,0xeb,0xff,0x82,0xe6,0xe6,0xeb,0xff,0x03,0xe6,0xe6,0xec, 0xff,0x00,0x00,0x00,0xff,0xe7,0xe7,0xec,0xff,0x82,0xe8,0xe8,0xed,0xff,0x06, 0xe9,0xe9,0xed,0xff,0xe9,0xe9,0xee,0xff,0x6d,0x6d,0x6f,0xff,0x00,0x00,0x00, 0xff,0x6e,0x6e,0x6f,0xff,0xeb,0xeb,0xef,0xff,0x82,0xec,0xec,0xef,0xff,0x82, 0xed,0xed,0xf0,0xff,0x01,0xee,0xee,0xf0,0xff,0x82,0xee,0xee,0xf1,0xff,0x02, 0xef,0xef,0xf1,0xff,0x70,0x70,0x70,0xff,0x82,0x00,0x00,0x00,0xff,0x04,0x81, 0x81,0x81,0xff,0xf1,0xf1,0xf3,0xff,0xf2,0xf2,0xf3,0xff,0x00,0x00,0x00,0xff, 0x82,0x10,0x10,0x10,0xff,0x05,0x00,0x00,0x00,0xff,0x41,0x41,0x41,0xff,0xd4, 0xd4,0xd4,0xff,0xf5,0xf5,0xf5,0xff,0x00,0x00,0x00,0xff,0x84,0xf5,0xf5,0xf5, 0xff,0x01,0xf4,0xf4,0xf5,0xff,0x85,0xf4,0xf4,0xf4,0xff,0x01,0x41,0x41,0x41, 0xff,0x82,0x00,0x00,0x00,0xff,0x01,0x71,0x71,0x71,0xff,0x82,0xf2,0xf2,0xf3, 0xff,0x02,0xd2,0xd2,0xd2,0xff,0x30,0x30,0x30,0xff,0x82,0x10,0x10,0x10,0xff, 0x03,0x40,0x40,0x41,0xff,0xd0,0xd0,0xd1,0xff,0xf0,0xf0,0xf1,0xff,0x82,0x00, 0x00,0x00,0xff,0x82,0xef,0xef,0xf0,0xff,0x06,0xee,0xee,0xf0,0xff,0x20,0x20, 0x20,0xff,0x00,0x00,0x00,0xff,0xed,0xed,0xef,0xff,0xed,0xed,0xee,0xff,0x00, 0x00,0x00,0xff,0x82,0x10,0x10,0x10,0xff,0x02,0x00,0x00,0x00,0xff,0x6e,0x6e, 0x6f,0xff,0x83,0xea,0xea,0xec,0xff,0x0e,0xe9,0xe9,0xeb,0xff,0xe8,0xe8,0xeb, 0xfc,0xe8,0xe8,0xea,0xe9,0xe7,0xe7,0xea,0xd5,0xe7,0xe7,0xe9,0xc0,0xe6,0xe6, 0xe9,0xab,0xe6,0xe6,0xe9,0x96,0xe5,0xe5,0xe8,0x81,0xe5,0xe5,0xe8,0x6c,0xe4, 0xe4,0xe7,0x57,0xe4,0xe4,0xe7,0x42,0xe3,0xe3,0xe7,0x2d,0xe3,0xe3,0xe6,0x18, 0xe2,0xe2,0xe6,0x04,0x84,0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x0f, 0xe7,0xf0,0xe7,0x43,0x98,0xc0,0x98,0xff,0x91,0xbd,0x91,0xff,0x4c,0x93,0x4c, 0xff,0x4e,0x9d,0x4e,0xff,0x3f,0x8a,0x3f,0xff,0x3f,0x95,0x3f,0xff,0x33,0x81, 0x33,0xff,0x37,0x8d,0x37,0xff,0x35,0x89,0x35,0xff,0x41,0x89,0x41,0xff,0x6d, 0xa6,0x6d,0xff,0x69,0xa4,0x69,0xff,0x65,0xa1,0x65,0xff,0xa0,0xc5,0xa0,0xff, 0x86,0x2c,0x2f,0x2c,0xff,0x04,0x22,0x3d,0x22,0xff,0x3f,0x8a,0x3f,0xff,0x3a, 0x88,0x3a,0xff,0x69,0xa4,0x69,0xff,0x82,0xff,0xff,0xff,0xff,0x01,0xff,0xff, 0xff,0xaf,0x8a,0x00,0x00,0x00,0x00,0x11,0xff,0xff,0xff,0x16,0xff,0xff,0xff, 0x64,0xff,0xff,0xff,0xb0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff, 0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff, 0xff,0xff,0xdb,0xfb,0xfb,0xfc,0xe1,0xf4,0xf4,0xf7,0xe8,0xee,0xee,0xf3,0xee, 0xe8,0xe8,0xef,0xf3,0xe3,0xe3,0xea,0xf8,0xda,0xda,0xe4,0xeb,0xd4,0xd4,0xe0, 0xe8,0x83,0xd4,0xd4,0xe0,0xff,0x08,0x39,0x39,0x3c,0xff,0x66,0x66,0x66,0xff, 0xde,0xde,0xe7,0xff,0xd6,0xd6,0xe1,0xff,0x1d,0x1d,0x1e,0xff,0x9d,0x9d,0xa1, 0xff,0xf5,0xf5,0xf7,0xff,0xfc,0xfc,0xfd,0xff,0x82,0xd9,0xd9,0xe3,0xff,0x82, 0xda,0xda,0xe4,0xff,0x03,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xdb,0xdb, 0xe5,0xff,0x82,0xdc,0xdc,0xe5,0xff,0x04,0x76,0x76,0x7b,0xff,0x3b,0x3b,0x3d, 0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x82,0xdf,0xdf,0xe7,0xff,0x02, 0xe0,0xe0,0xe7,0xff,0xe0,0xe0,0xe8,0xff,0x82,0xe1,0xe1,0xe8,0xff,0x0b,0xe2, 0xe2,0xe9,0xff,0x3c,0x3c,0x3e,0xff,0x66,0x66,0x66,0xff,0xe9,0xe9,0xee,0xff, 0xe3,0xe3,0xea,0xff,0x1e,0x1e,0x1f,0xff,0xa1,0xa1,0xa3,0xff,0xf8,0xf8,0xfa, 0xff,0xfd,0xfd,0xfe,0xff,0xe6,0xe6,0xeb,0xff,0xe6,0xe6,0xec,0xff,0x82,0xe7, 0xe7,0xec,0xff,0x02,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x82,0xe9,0xe9, 0xed,0xff,0x82,0xea,0xea,0xee,0xff,0x05,0x00,0x00,0x00,0xff,0xf6,0xf6,0xf8, 0xff,0x00,0x00,0x00,0xff,0xf6,0xf6,0xf8,0xff,0xec,0xec,0xf0,0xff,0x82,0xed, 0xed,0xf0,0xff,0x02,0xee,0xee,0xf0,0xff,0xee,0xee,0xf1,0xff,0x82,0xef,0xef, 0xf1,0xff,0x09,0xf0,0xf0,0xf2,0xff,0x00,0x00,0x00,0xff,0xd7,0xd7,0xd8,0xff, 0xdd,0xdd,0xdd,0xff,0x44,0x44,0x44,0xff,0xf8,0xf8,0xf9,0xff,0xf3,0xf3,0xf3, 0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x82,0xfe,0xfe,0xfe,0xff,0x05, 0x22,0x22,0x22,0xff,0x54,0x54,0x54,0xff,0xf6,0xf6,0xf6,0xff,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0x82,0xf5,0xf5,0xf5,0xff,0x85,0xf4,0xf4,0xf4,0xff, 0x12,0xf3,0xf3,0xf4,0xff,0x61,0x61,0x62,0xff,0x41,0x41,0x41,0xff,0xfc,0xfc, 0xfc,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xc7,0xc7,0xc7,0xff,0xf2, 0xf2,0xf2,0xff,0x40,0x40,0x41,0xff,0x61,0x61,0x62,0xff,0xfc,0xfc,0xfc,0xff, 0xfe,0xfe,0xfe,0xff,0x55,0x55,0x55,0xff,0x54,0x54,0x54,0xff,0xf2,0xf2,0xf3, 0xff,0x00,0x00,0x00,0xff,0x22,0x22,0x22,0xff,0xaa,0xaa,0xaa,0xff,0x82,0xee, 0xee,0xef,0xff,0x82,0x00,0x00,0x00,0xff,0x08,0xff,0xff,0xff,0xff,0xec,0xec, 0xee,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xff,0xcb, 0xcb,0xcb,0xff,0x00,0x00,0x00,0xff,0xf5,0xf5,0xf6,0xff,0x82,0xe9,0xe9,0xeb, 0xff,0x0e,0xe8,0xe8,0xea,0xff,0xe7,0xe7,0xea,0xfc,0xe7,0xe7,0xe9,0xe9,0xe6, 0xe6,0xe9,0xd5,0xe6,0xe6,0xe9,0xc0,0xe5,0xe5,0xe8,0xab,0xe5,0xe5,0xe8,0x96, 0xe4,0xe4,0xe7,0x81,0xe4,0xe4,0xe7,0x6c,0xe3,0xe3,0xe7,0x57,0xe3,0xe3,0xe6, 0x42,0xe2,0xe2,0xe6,0x2d,0xe2,0xe2,0xe5,0x18,0xe1,0xe1,0xe5,0x04,0x84,0xff, 0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x0f,0xc1,0xd9,0xc1,0x83,0x97,0xc0, 0x97,0xff,0x87,0xba,0x87,0xff,0x4a,0x92,0x4a,0xff,0x4c,0x9b,0x4c,0xff,0x3d, 0x89,0x3d,0xff,0x3d,0x94,0x3d,0xff,0x32,0x81,0x32,0xff,0x36,0x8c,0x36,0xff, 0x34,0x88,0x34,0xff,0x47,0x8b,0x47,0xff,0x6c,0xa6,0x6c,0xff,0x68,0xa3,0x68, 0xff,0x63,0xa0,0x63,0xff,0xa0,0xc5,0xa0,0xff,0x86,0x2c,0x2f,0x2c,0xff,0x04, 0x20,0x37,0x20,0xff,0x3d,0x89,0x3d,0xff,0x39,0x87,0x39,0xff,0x35,0x84,0x35, 0xff,0x83,0xff,0xff,0xff,0xff,0x88,0x00,0x00,0x00,0x00,0x1d,0xff,0xff,0xff, 0x38,0xff,0xff,0xff,0x80,0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff, 0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff, 0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb, 0xfb,0xfb,0xfc,0xe1,0xf5,0xf5,0xf8,0xe8,0xee,0xee,0xf3,0xee,0xe8,0xe8,0xef, 0xf3,0xe3,0xe3,0xeb,0xf8,0xdc,0xdc,0xe5,0xee,0xd4,0xd4,0xe0,0xe8,0xd5,0xd5, 0xe1,0xff,0xd5,0xd5,0xe0,0xff,0xd5,0xd5,0xe1,0xff,0x8f,0x8f,0x96,0xff,0x00, 0x00,0x00,0xff,0xef,0xef,0xf3,0xff,0xba,0xba,0xc4,0xff,0x00,0x00,0x00,0xff, 0xfa,0xfa,0xfb,0xff,0x00,0x00,0x00,0xff,0x82,0xd9,0xd9,0xe3,0xff,0x06,0x91, 0x91,0x98,0xff,0x0f,0x0f,0x0f,0xff,0x2c,0x2c,0x2e,0xff,0x00,0x00,0x00,0xff, 0xff,0xff,0xff,0xff,0xdc,0xdc,0xe5,0xff,0x82,0xdd,0xdd,0xe6,0xff,0x06,0xde, 0xde,0xe6,0xff,0xed,0xed,0xf2,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff, 0xe0,0xe0,0xe7,0xff,0xe0,0xe0,0xe8,0xff,0x82,0xe1,0xe1,0xe8,0xff,0x01,0xe1, 0xe1,0xe9,0xff,0x82,0xe2,0xe2,0xe9,0xff,0x0f,0x97,0x97,0x9b,0xff,0x00,0x00, 0x00,0xff,0xf4,0xf4,0xf7,0xff,0xc6,0xc6,0xcb,0xff,0x00,0x00,0x00,0xff,0xfc, 0xfc,0xfc,0xff,0x00,0x00,0x00,0xff,0xe6,0xe6,0xec,0xff,0xe7,0xe7,0xec,0xff, 0x9a,0x9a,0x9d,0xff,0x0f,0x0f,0x10,0xff,0x2e,0x2e,0x2f,0xff,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xe9,0xe9,0xee,0xff,0x82,0xea,0xea,0xee,0xff,0x82, 0xeb,0xeb,0xef,0xff,0x06,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff, 0xff,0xff,0xed,0xed,0xf0,0xff,0xee,0xee,0xf0,0xff,0xee,0xee,0xf1,0xff,0x82, 0xef,0xef,0xf1,0xff,0x82,0xf0,0xf0,0xf2,0xff,0x03,0xf1,0xf1,0xf2,0xff,0x00, 0x00,0x00,0xff,0x88,0x88,0x88,0xff,0x82,0xf4,0xf4,0xf5,0xff,0x04,0xfc,0xfc, 0xfc,0xff,0xf3,0xf3,0xf4,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x82, 0xf5,0xf5,0xf5,0xff,0x06,0xa3,0xa3,0xa3,0xff,0x11,0x11,0x11,0xff,0xfc,0xfc, 0xfc,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xf4,0xf4,0xf5,0xff,0x85, 0xf4,0xf4,0xf4,0xff,0x2f,0xf3,0xf3,0xf4,0xff,0xf3,0xf3,0xf3,0xff,0x10,0x10, 0x10,0xff,0xc8,0xc8,0xc8,0xff,0xfc,0xfc,0xfc,0xff,0xf2,0xf2,0xf3,0xff,0xf2, 0xf2,0xf2,0xff,0xff,0xff,0xff,0xff,0xf4,0xf4,0xf5,0xff,0x00,0x00,0x00,0xff, 0xda,0xda,0xda,0xff,0xf9,0xf9,0xf9,0xff,0xf0,0xf0,0xf1,0xff,0xc0,0xc0,0xc1, 0xff,0x00,0x00,0x00,0xff,0xfa,0xfa,0xfa,0xff,0x00,0x00,0x00,0xff,0x77,0x77, 0x77,0xff,0x43,0x43,0x43,0xff,0xf3,0xf3,0xf4,0xff,0x7e,0x7e,0x7f,0xff,0x5f, 0x5f,0x5f,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xeb,0xeb,0xed,0xff, 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xea,0xea,0xec,0xff,0x9c,0x9c,0x9d, 0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe8,0xe8,0xeb,0xff,0xe8,0xe8, 0xea,0xff,0xe7,0xe7,0xea,0xff,0xe7,0xe7,0xe9,0xfc,0xe6,0xe6,0xe9,0xe9,0xe6, 0xe6,0xe8,0xd5,0xe5,0xe5,0xe8,0xc0,0xe5,0xe5,0xe8,0xab,0xe4,0xe4,0xe7,0x96, 0xe3,0xe3,0xe7,0x81,0xe3,0xe3,0xe6,0x6c,0xe2,0xe2,0xe6,0x57,0xe2,0xe2,0xe5, 0x42,0xe1,0xe1,0xe5,0x2d,0xe1,0xe1,0xe5,0x18,0xe0,0xe0,0xe4,0x04,0x84,0xff, 0xff,0xff,0x00,0x86,0x00,0x00,0x00,0x00,0x10,0xff,0xff,0xff,0x06,0xb1,0xcf, 0xb1,0xbc,0x96,0xbf,0x96,0xff,0x7a,0xb6,0x7a,0xff,0x48,0x90,0x48,0xff,0x4a, 0x9a,0x4a,0xff,0x3b,0x88,0x3b,0xff,0x3b,0x93,0x3b,0xff,0x32,0x80,0x32,0xff, 0x36,0x8b,0x36,0xff,0x34,0x86,0x34,0xff,0x4d,0x8d,0x4d,0xff,0x6b,0xa5,0x6b, 0xff,0x66,0xa2,0x66,0xff,0x62,0xa0,0x62,0xff,0x9f,0xc4,0x9f,0xff,0x85,0x2c, 0x2f,0x2c,0xff,0x06,0x2c,0x2e,0x2c,0xff,0x1c,0x25,0x1c,0xff,0x3c,0x89,0x3c, 0xff,0x38,0x86,0x38,0xff,0x34,0x83,0x34,0xff,0x9c,0xb0,0x9c,0xff,0x82,0xbf, 0xbf,0xbf,0xff,0x01,0xbf,0xbf,0xbf,0x40,0x84,0x00,0x00,0x00,0x00,0x16,0xff, 0xff,0xff,0x0f,0xff,0xff,0xff,0x52,0xff,0xff,0xff,0x9b,0xff,0xff,0xff,0xaf, 0xff,0xff,0xff,0xb3,0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff,0xff, 0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff,0xff, 0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb,0xfb, 0xfb,0xfc,0xe1,0xf5,0xf5,0xf8,0xe8,0xef,0xef,0xf3,0xee,0xe9,0xe9,0xef,0xf3, 0xe3,0xe3,0xeb,0xf8,0xdc,0xdc,0xe5,0xee,0xd5,0xd5,0xe1,0xe8,0x83,0xd6,0xd6, 0xe1,0xff,0x0f,0xd7,0xd7,0xe2,0xff,0x00,0x00,0x00,0xff,0xdd,0xdd,0xdd,0xff, 0x65,0x65,0x6a,0xff,0x4a,0x4a,0x4d,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xda,0xda,0xe4,0xff,0x00,0x00,0x00,0xff,0xb9,0xb9, 0xbe,0xff,0xdb,0xdb,0xdb,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xdd, 0xdd,0xe6,0xff,0x82,0xde,0xde,0xe6,0xff,0x82,0xdf,0xdf,0xe7,0xff,0x05,0x00, 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe0,0xe0,0xe8,0xff,0xe1,0xe1,0xe8,0xff, 0xe1,0xe1,0xe9,0xff,0x82,0xe2,0xe2,0xe9,0xff,0x11,0xe3,0xe3,0xe9,0xff,0xe3, 0xe3,0xea,0xff,0xe4,0xe4,0xea,0xff,0x00,0x00,0x00,0xff,0xdd,0xdd,0xdd,0xff, 0x6b,0x6b,0x6e,0xff,0x4e,0x4e,0x4f,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xe7,0xe7,0xec,0xff,0x00,0x00,0x00,0xff,0xc0,0xc0, 0xc2,0xff,0xdc,0xdc,0xdc,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xea, 0xea,0xee,0xff,0x82,0xeb,0xeb,0xef,0xff,0x82,0xec,0xec,0xef,0xff,0x04,0x6f, 0x6f,0x70,0xff,0x5f,0x5f,0x60,0xff,0xff,0xff,0xff,0xff,0xee,0xee,0xf1,0xff, 0x83,0xef,0xef,0xf1,0xff,0x82,0xf0,0xf0,0xf2,0xff,0x0a,0xf1,0xf1,0xf2,0xff, 0xf1,0xf1,0xf3,0xff,0xa1,0xa1,0xa2,0xff,0x22,0x22,0x22,0xff,0x00,0x00,0x00, 0xff,0x82,0x82,0x82,0xff,0xf4,0xf4,0xf4,0xff,0xf4,0xf4,0xf5,0xff,0x00,0x00, 0x00,0xff,0xff,0xff,0xff,0xff,0x83,0xf5,0xf5,0xf5,0xff,0x04,0x00,0x00,0x00, 0xff,0xfe,0xfe,0xfe,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x84,0xf4, 0xf4,0xf4,0xff,0x01,0xf3,0xf3,0xf4,0xff,0x83,0xf3,0xf3,0xf3,0xff,0x04,0x00, 0x00,0x00,0xff,0xfe,0xfe,0xfe,0xff,0xf5,0xf5,0xf5,0xff,0xf2,0xf2,0xf2,0xff, 0x83,0xf1,0xf1,0xf2,0xff,0x03,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xf2, 0xf2,0xf3,0xff,0x82,0xef,0xef,0xf0,0xff,0x21,0x00,0x00,0x00,0xff,0xff,0xff, 0xff,0xff,0x00,0x00,0x00,0xff,0xdd,0xdd,0xdd,0xff,0x00,0x00,0x00,0xff,0xfa, 0xfa,0xfa,0xff,0x2f,0x2f,0x30,0xff,0xc4,0xc4,0xc5,0xff,0x00,0x00,0x00,0xff, 0xff,0xff,0xff,0xff,0xeb,0xeb,0xed,0xff,0x00,0x00,0x00,0xff,0x11,0x11,0x11, 0xff,0x10,0x10,0x10,0xff,0x00,0x00,0x00,0xff,0x80,0x80,0x81,0xff,0xff,0xff, 0xff,0xff,0xe8,0xe8,0xea,0xff,0xe7,0xe7,0xea,0xff,0xe6,0xe6,0xe9,0xff,0xe6, 0xe6,0xe9,0xfc,0xe5,0xe5,0xe8,0xe9,0xe5,0xe5,0xe8,0xd5,0xe4,0xe4,0xe7,0xc0, 0xe4,0xe4,0xe7,0xab,0xe3,0xe3,0xe6,0x96,0xe3,0xe3,0xe6,0x81,0xe2,0xe2,0xe6, 0x6c,0xe1,0xe1,0xe5,0x57,0xe1,0xe1,0xe5,0x42,0xe0,0xe0,0xe4,0x2d,0xe0,0xe0, 0xe4,0x18,0xdf,0xdf,0xe3,0x04,0x84,0xff,0xff,0xff,0x00,0x86,0x00,0x00,0x00, 0x00,0x10,0xff,0xff,0xff,0x20,0xa1,0xc6,0xa1,0xe2,0x94,0xbe,0x94,0xff,0x6f, 0xb3,0x6f,0xff,0x46,0x8f,0x46,0xff,0x48,0x99,0x48,0xff,0x39,0x87,0x39,0xff, 0x3a,0x92,0x3a,0xff,0x32,0x7f,0x32,0xff,0x35,0x8a,0x35,0xff,0x34,0x85,0x34, 0xff,0x4d,0x8d,0x4d,0xff,0x6a,0xa4,0x6a,0xff,0x65,0xa2,0x65,0xff,0x61,0x9f, 0x61,0xff,0x9e,0xc4,0x9e,0xff,0x85,0x2c,0x2f,0x2c,0xff,0x06,0x2c,0x2e,0x2c, 0xff,0x20,0x27,0x20,0xff,0x32,0x73,0x32,0xff,0x37,0x85,0x37,0xff,0x33,0x83, 0x33,0xff,0xa4,0xc8,0xa4,0xff,0x82,0xff,0xff,0xff,0xff,0x01,0xff,0xff,0xff, 0x8f,0x82,0x00,0x00,0x00,0x00,0x18,0xff,0xff,0xff,0x2b,0xff,0xff,0xff,0x6b, 0xff,0xff,0xff,0xa2,0xff,0xff,0xff,0xa6,0xff,0xff,0xff,0xab,0xff,0xff,0xff, 0xaf,0xff,0xff,0xff,0xb3,0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff, 0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff, 0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb, 0xfc,0xfc,0xfc,0xe1,0xf5,0xf5,0xf8,0xe8,0xef,0xef,0xf3,0xee,0xe9,0xe9,0xef, 0xf3,0xe4,0xe4,0xec,0xf8,0xdd,0xdd,0xe6,0xee,0xd6,0xd6,0xe1,0xe8,0x82,0xd6, 0xd6,0xe2,0xff,0x82,0xd7,0xd7,0xe2,0xff,0x0f,0x3a,0x3a,0x3c,0xff,0x77,0x77, 0x77,0xff,0x2c,0x2c,0x2e,0xff,0xbe,0xbe,0xc2,0xff,0xf3,0xf3,0xf6,0xff,0x00, 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xdb,0xdb,0xe5,0xff,0x00,0x00,0x00,0xff, 0xff,0xff,0xff,0xff,0xe4,0xe4,0xea,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff, 0xff,0xde,0xde,0xe6,0xff,0xde,0xde,0xe7,0xff,0x82,0xdf,0xdf,0xe7,0xff,0x04, 0xe0,0xe0,0xe8,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe1,0xe1,0xe8, 0xff,0x82,0xe2,0xe2,0xe9,0xff,0x02,0xe3,0xe3,0xe9,0xff,0xe3,0xe3,0xea,0xff, 0x82,0xe4,0xe4,0xea,0xff,0x0f,0xe5,0xe5,0xeb,0xff,0x3d,0x3d,0x3f,0xff,0x77, 0x77,0x77,0xff,0x2f,0x2f,0x30,0xff,0xc2,0xc2,0xc5,0xff,0xf7,0xf7,0xf9,0xff, 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe8,0xe8,0xed,0xff,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xee,0xee,0xf1,0xff,0x00,0x00,0x00,0xff,0xff,0xff, 0xff,0xff,0xeb,0xeb,0xef,0xff,0x82,0xec,0xec,0xef,0xff,0x05,0xed,0xed,0xf0, 0xff,0xcd,0xcd,0xd0,0xff,0x10,0x10,0x10,0xff,0xf7,0xf7,0xf8,0xff,0xf8,0xf8, 0xf9,0xff,0x82,0xef,0xef,0xf1,0xff,0x82,0xf0,0xf0,0xf2,0xff,0x02,0xf1,0xf1, 0xf2,0xff,0xf1,0xf1,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x08,0xf3,0xf3,0xf4, 0xff,0xf7,0xf7,0xf8,0xff,0xa9,0xa9,0xa9,0xff,0x00,0x00,0x00,0xff,0xfa,0xfa, 0xfa,0xff,0xf5,0xf5,0xf5,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x82, 0xf5,0xf5,0xf5,0xff,0x05,0xc4,0xc4,0xc4,0xff,0x00,0x00,0x00,0xff,0xff,0xff, 0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x82,0xf4,0xf4,0xf4,0xff, 0x82,0xf3,0xf3,0xf4,0xff,0x82,0xf3,0xf3,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff, 0x02,0x00,0x00,0x00,0xff,0xcc,0xcc,0xcc,0xff,0x83,0xf1,0xf1,0xf2,0xff,0x82, 0xf0,0xf0,0xf1,0xff,0x02,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x82,0xef, 0xef,0xf0,0xff,0x22,0xbe,0xbe,0xc0,0xff,0x10,0x10,0x10,0xff,0xff,0xff,0xff, 0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x20,0x20,0x20,0xff,0xaa,0xaa, 0xaa,0xff,0x10,0x10,0x10,0xff,0xfb,0xfb,0xfb,0xff,0x00,0x00,0x00,0xff,0xff, 0xff,0xff,0xff,0xea,0xea,0xec,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff, 0xfe,0xfe,0xfe,0xff,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xf2,0xf2,0xf4, 0xff,0xe7,0xe7,0xe9,0xff,0xe6,0xe6,0xe9,0xff,0xe5,0xe5,0xe8,0xff,0xe5,0xe5, 0xe8,0xfc,0xe4,0xe4,0xe7,0xe9,0xe4,0xe4,0xe7,0xd5,0xe3,0xe3,0xe7,0xc0,0xe3, 0xe3,0xe6,0xab,0xe2,0xe2,0xe6,0x96,0xe2,0xe2,0xe5,0x81,0xe1,0xe1,0xe5,0x6c, 0xe0,0xe0,0xe4,0x57,0xe0,0xe0,0xe4,0x42,0xdf,0xdf,0xe3,0x2d,0xdf,0xdf,0xe3, 0x18,0xde,0xde,0xe3,0x04,0x84,0xff,0xff,0xff,0x00,0x86,0x00,0x00,0x00,0x00, 0x10,0xe7,0xf0,0xe7,0x43,0x97,0xc0,0x97,0xff,0x93,0xbe,0x93,0xff,0x5a,0xa4, 0x5a,0xff,0x45,0x8e,0x45,0xff,0x46,0x99,0x46,0xff,0x37,0x86,0x37,0xff,0x39, 0x91,0x39,0xff,0x31,0x7d,0x31,0xff,0x35,0x89,0x35,0xff,0x33,0x83,0x33,0xff, 0x4c,0x8c,0x4c,0xff,0x68,0xa4,0x68,0xff,0x64,0xa1,0x64,0xff,0x60,0x9e,0x60, 0xff,0x9d,0xc4,0x9d,0xff,0x85,0x2c,0x2f,0x2c,0xff,0x06,0x2b,0x2e,0x2b,0xff, 0x23,0x29,0x23,0xff,0x2e,0x6c,0x2e,0xff,0x36,0x85,0x36,0xff,0x31,0x82,0x31, 0xff,0x6f,0xa8,0x6f,0xff,0x82,0xff,0xff,0xff,0xff,0x1b,0xff,0xff,0xff,0xc2, 0xff,0xff,0xff,0x42,0xff,0xff,0xff,0x81,0xff,0xff,0xff,0x99,0xff,0xff,0xff, 0x9d,0xff,0xff,0xff,0xa2,0xff,0xff,0xff,0xa6,0xff,0xff,0xff,0xab,0xff,0xff, 0xff,0xaf,0xff,0xff,0xff,0xb3,0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff, 0xff,0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc, 0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff, 0xdb,0xfc,0xfc,0xfd,0xe1,0xf5,0xf5,0xf8,0xe8,0xef,0xef,0xf4,0xee,0xe9,0xe9, 0xf0,0xf3,0xe4,0xe4,0xec,0xf8,0xde,0xde,0xe7,0xf1,0xd7,0xd7,0xe2,0xe8,0x82, 0xd7,0xd7,0xe2,0xff,0x0f,0xd8,0xd8,0xe2,0xff,0xd8,0xd8,0xe3,0xff,0x91,0x91, 0x97,0xff,0x21,0x21,0x21,0xff,0x10,0x10,0x10,0xff,0xf8,0xf8,0xfa,0xff,0xe2, 0xe2,0xe9,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xdc,0xdc,0xe5,0xff, 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xc0,0xc0,0xc7,0xff,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0x82,0xdf,0xdf,0xe7,0xff,0x07,0xe0,0xe0,0xe7,0xff, 0xe0,0xe0,0xe8,0xff,0xe1,0xe1,0xe8,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff, 0xff,0xe2,0xe2,0xe9,0xff,0xe3,0xe3,0xe9,0xff,0x82,0xe3,0xe3,0xea,0xff,0x82, 0xe4,0xe4,0xea,0xff,0x82,0xe5,0xe5,0xeb,0xff,0x0f,0x99,0x99,0x9d,0xff,0x21, 0x21,0x21,0xff,0x10,0x10,0x10,0xff,0xfa,0xfa,0xfb,0xff,0xed,0xed,0xf1,0xff, 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe9,0xe9,0xed,0xff,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xcc,0xcc,0xce,0xff,0x00,0x00,0x00,0xff,0xff,0xff, 0xff,0xff,0xec,0xec,0xef,0xff,0xec,0xec,0xf0,0xff,0x82,0xed,0xed,0xf0,0xff, 0x04,0x30,0x30,0x30,0xff,0x80,0x80,0x82,0xff,0xfe,0xfe,0xfe,0xff,0xef,0xef, 0xf1,0xff,0x82,0xf0,0xf0,0xf2,0xff,0x02,0xf1,0xf1,0xf2,0xff,0xf1,0xf1,0xf3, 0xff,0x82,0xf2,0xf2,0xf3,0xff,0x0a,0xf3,0xf3,0xf3,0xff,0xf3,0xf3,0xf4,0xff, 0x00,0x00,0x00,0xff,0xf4,0xf4,0xf4,0xff,0xd3,0xd3,0xd4,0xff,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xf5,0xf5,0xf5,0xff,0x00,0x00,0x00,0xff,0xff,0xff, 0xff,0xff,0x82,0xf5,0xf5,0xf5,0xff,0x05,0x21,0x21,0x21,0xff,0x52,0x52,0x52, 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x82,0xf3, 0xf3,0xf4,0xff,0x83,0xf3,0xf3,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x1b,0xf2, 0xf2,0xf2,0xff,0x50,0x50,0x51,0xff,0x55,0x55,0x55,0xff,0xf4,0xf4,0xf5,0xff, 0xf1,0xf1,0xf1,0xff,0x20,0x20,0x20,0xff,0xd0,0xd0,0xd1,0xff,0xf0,0xf0,0xf1, 0xff,0x30,0x30,0x30,0xff,0x66,0x66,0x66,0xff,0xef,0xef,0xf0,0xff,0xee,0xee, 0xef,0xff,0x4f,0x4f,0x50,0xff,0x60,0x60,0x61,0xff,0xfe,0xfe,0xfe,0xff,0x00, 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x6e,0x6e,0x6f,0xff,0x11,0x11,0x11,0xff, 0x61,0x61,0x61,0xff,0xfe,0xfe,0xfe,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff, 0xff,0xe9,0xe9,0xeb,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe8,0xe8, 0xea,0xff,0x82,0xe7,0xe7,0xea,0xff,0x82,0xe6,0xe6,0xe9,0xff,0x0f,0xe5,0xe5, 0xe8,0xff,0xe4,0xe4,0xe7,0xff,0xe4,0xe4,0xe7,0xfc,0xe3,0xe3,0xe7,0xe9,0xe3, 0xe3,0xe6,0xd5,0xe2,0xe2,0xe6,0xc0,0xe2,0xe2,0xe5,0xab,0xe1,0xe1,0xe5,0x96, 0xe1,0xe1,0xe4,0x81,0xe0,0xe0,0xe4,0x6c,0xe0,0xe0,0xe4,0x57,0xdf,0xdf,0xe3, 0x42,0xde,0xde,0xe3,0x2d,0xde,0xde,0xe2,0x18,0xdd,0xdd,0xe2,0x04,0x84,0xff, 0xff,0xff,0x00,0x86,0x00,0x00,0x00,0x00,0x10,0xc4,0xdb,0xc4,0x89,0x96,0xbf, 0x96,0xff,0x8c,0xbb,0x8c,0xff,0x53,0x9f,0x53,0xff,0x43,0x8d,0x43,0xff,0x44, 0x98,0x44,0xff,0x36,0x84,0x36,0xff,0x38,0x90,0x38,0xff,0x30,0x7c,0x30,0xff, 0x34,0x87,0x34,0xff,0x32,0x82,0x32,0xff,0x52,0x8e,0x52,0xff,0x6c,0xa8,0x6c, 0xff,0x77,0xb3,0x77,0xff,0x72,0xb1,0x72,0xff,0xa8,0xcf,0xa8,0xff,0x84,0x2d, 0x30,0x2d,0xff,0x24,0x2d,0x2f,0x2d,0xff,0x2c,0x2f,0x2c,0xff,0x2a,0x2e,0x2a, 0xff,0x28,0x5f,0x28,0xff,0x3f,0x9d,0x3f,0xff,0x3a,0x9a,0x3a,0xff,0x2e,0x85, 0x2e,0xff,0x57,0x99,0x57,0x66,0xff,0xff,0xff,0x58,0xff,0xff,0xff,0x88,0xff, 0xff,0xff,0x90,0xff,0xff,0xff,0x94,0xff,0xff,0xff,0x99,0xff,0xff,0xff,0x9d, 0xff,0xff,0xff,0xa2,0xff,0xff,0xff,0xa6,0xff,0xff,0xff,0xab,0xff,0xff,0xff, 0xaf,0xff,0xff,0xff,0xb3,0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff, 0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff, 0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb, 0xfc,0xfc,0xfd,0xe1,0xf5,0xf5,0xf8,0xe8,0xf0,0xf0,0xf4,0xee,0xea,0xea,0xf0, 0xf3,0xe5,0xe5,0xec,0xf8,0xdf,0xdf,0xe7,0xf1,0xd8,0xd8,0xe2,0xe8,0x82,0xd8, 0xd8,0xe3,0xff,0x83,0xd9,0xd9,0xe3,0xff,0x0e,0x00,0x00,0x00,0xff,0x64,0x64, 0x64,0xff,0xfd,0xfd,0xfd,0xff,0xdb,0xdb,0xe5,0xff,0x00,0x00,0x00,0xff,0xff, 0xff,0xff,0xff,0xdd,0xdd,0xe6,0xff,0x67,0x67,0x6b,0xff,0x33,0x33,0x33,0xff, 0x4a,0x4a,0x4d,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe0,0xe0,0xe7, 0xff,0x00,0x00,0x00,0xff,0x82,0xe1,0xe1,0xe8,0xff,0x05,0xe1,0xe1,0xe9,0xff, 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe3,0xe3,0xe9,0xff,0xe3,0xe3,0xea, 0xff,0x82,0xe4,0xe4,0xea,0xff,0x82,0xe5,0xe5,0xeb,0xff,0x17,0xe6,0xe6,0xeb, 0xff,0xe6,0xe6,0xec,0xff,0xe7,0xe7,0xec,0xff,0x00,0x00,0x00,0xff,0x65,0x65, 0x65,0xff,0xfd,0xfd,0xfe,0xff,0xe9,0xe9,0xed,0xff,0x00,0x00,0x00,0xff,0xff, 0xff,0xff,0xff,0xea,0xea,0xee,0xff,0x6d,0x6d,0x6f,0xff,0x33,0x33,0x33,0xff, 0x4e,0x4e,0x50,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xed,0xed,0xf0, 0xff,0x00,0x00,0x00,0xff,0xee,0xee,0xf0,0xff,0xee,0xee,0xf1,0xff,0x00,0x00, 0x00,0xff,0x11,0x11,0x11,0xff,0x10,0x10,0x11,0xff,0xf0,0xf0,0xf2,0xff,0x82, 0xf1,0xf1,0xf2,0xff,0x01,0xf1,0xf1,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x82, 0xf3,0xf3,0xf4,0xff,0x10,0xf4,0xf4,0xf4,0xff,0x62,0x62,0x62,0xff,0x11,0x11, 0x11,0xff,0x10,0x10,0x10,0xff,0x83,0x83,0x83,0xff,0xff,0xff,0xff,0xff,0xf5, 0xf5,0xf5,0xff,0x00,0x00,0x00,0xff,0x11,0x11,0x11,0xff,0x10,0x10,0x10,0xff, 0x00,0x00,0x00,0xff,0x31,0x31,0x31,0xff,0xdc,0xdc,0xdc,0xff,0xfb,0xfb,0xfb, 0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x83,0xf3,0xf3,0xf3,0xff,0x82, 0xf2,0xf2,0xf3,0xff,0x82,0xf2,0xf2,0xf2,0xff,0x03,0xf1,0xf1,0xf2,0xff,0xd1, 0xd1,0xd2,0xff,0x32,0x32,0x32,0xff,0x82,0x00,0x00,0x00,0xff,0x19,0x70,0x70, 0x70,0xff,0xfd,0xfd,0xfd,0xff,0xf1,0xf1,0xf2,0xff,0xcf,0xcf,0xd0,0xff,0x32, 0x32,0x32,0xff,0x00,0x00,0x00,0xff,0x10,0x10,0x10,0xff,0x3f,0x3f,0x40,0xff, 0xf9,0xf9,0xf9,0xff,0xf7,0xf7,0xf8,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff, 0xff,0xcc,0xcc,0xcd,0xff,0x00,0x00,0x00,0xff,0xcb,0xcb,0xcb,0xff,0xf7,0xf7, 0xf7,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe8,0xe8,0xeb,0xff,0x00, 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe7,0xe7,0xea,0xff,0xe7,0xe7,0xe9,0xff, 0xe6,0xe6,0xe9,0xff,0xe6,0xe6,0xe8,0xff,0x82,0xe5,0xe5,0xe8,0xff,0x0e,0xe4, 0xe4,0xe7,0xff,0xe3,0xe3,0xe6,0xfc,0xe2,0xe2,0xe6,0xe9,0xe2,0xe2,0xe5,0xd5, 0xe1,0xe1,0xe5,0xc0,0xe1,0xe1,0xe5,0xab,0xe0,0xe0,0xe4,0x96,0xe0,0xe0,0xe4, 0x81,0xdf,0xdf,0xe3,0x6c,0xdf,0xdf,0xe3,0x57,0xde,0xde,0xe2,0x42,0xdd,0xdd, 0xe2,0x2d,0xdd,0xdd,0xe1,0x18,0xdc,0xdc,0xe1,0x04,0x84,0xff,0xff,0xff,0x00, 0x85,0x00,0x00,0x00,0x00,0x1d,0xff,0xff,0xff,0x0d,0xb1,0xcf,0xb1,0xbc,0x95, 0xbf,0x95,0xff,0x82,0xb8,0x82,0xff,0x51,0x9e,0x51,0xff,0x41,0x8b,0x41,0xff, 0x42,0x97,0x42,0xff,0x34,0x83,0x34,0xff,0x38,0x8f,0x38,0xff,0x30,0x7b,0x30, 0xff,0x34,0x86,0x34,0xff,0x32,0x81,0x32,0xff,0x57,0x90,0x57,0xff,0x70,0xac, 0x70,0xff,0x89,0xc6,0x89,0xff,0x8c,0xc8,0x8c,0xff,0xa5,0xd1,0xa5,0xff,0x86, 0xa5,0x87,0xff,0x80,0xa0,0x81,0xff,0x79,0x9b,0x7a,0xff,0x72,0x96,0x74,0xff, 0x6b,0x90,0x6d,0xff,0x64,0x8b,0x66,0xff,0x5c,0x85,0x5e,0xff,0x53,0x91,0x56, 0xff,0x4d,0xab,0x4e,0xff,0x42,0xb3,0x42,0xff,0x33,0x94,0x33,0xff,0xf2,0xf7, 0xf2,0xff,0x82,0xff,0xff,0xff,0xff,0x1a,0xff,0xff,0xff,0xb3,0xff,0xff,0xff, 0x94,0xff,0xff,0xff,0x99,0xff,0xff,0xff,0x9d,0xff,0xff,0xff,0xa2,0xff,0xff, 0xff,0xa6,0xff,0xff,0xff,0xab,0xff,0xff,0xff,0xaf,0xff,0xff,0xff,0xb3,0xff, 0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff,0xff,0xc4, 0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff,0xff, 0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb,0xfc,0xfc,0xfd,0xe1,0xf6,0xf6, 0xf8,0xe8,0xf0,0xf0,0xf4,0xee,0xea,0xea,0xf0,0xf3,0xe5,0xe5,0xec,0xf8,0xdf, 0xdf,0xe8,0xf1,0xd8,0xd8,0xe3,0xe8,0x83,0xd9,0xd9,0xe3,0xff,0x82,0xda,0xda, 0xe4,0xff,0x06,0xdb,0xdb,0xe4,0xff,0xff,0xff,0xff,0xff,0xf1,0xf1,0xf5,0xff, 0xdc,0xdc,0xe5,0xff,0xdd,0xdd,0xe5,0xff,0xff,0xff,0xff,0xff,0x82,0xde,0xde, 0xe6,0xff,0x07,0xf0,0xf0,0xf4,0xff,0xf9,0xf9,0xfa,0xff,0xf4,0xf4,0xf7,0xff, 0xff,0xff,0xff,0xff,0xe0,0xe0,0xe8,0xff,0xe1,0xe1,0xe8,0xff,0xff,0xff,0xff, 0xff,0x82,0xe2,0xe2,0xe9,0xff,0x02,0xe3,0xe3,0xe9,0xff,0xff,0xff,0xff,0xff, 0x82,0xe4,0xe4,0xea,0xff,0x82,0xe5,0xe5,0xeb,0xff,0x82,0xe6,0xe6,0xeb,0xff, 0x83,0xe7,0xe7,0xec,0xff,0x0f,0xe8,0xe8,0xed,0xff,0xff,0xff,0xff,0xff,0xf6, 0xf6,0xf8,0xff,0xe9,0xe9,0xee,0xff,0xea,0xea,0xee,0xff,0xff,0xff,0xff,0xff, 0xeb,0xeb,0xee,0xff,0xeb,0xeb,0xef,0xff,0xf6,0xf6,0xf8,0xff,0xfb,0xfb,0xfc, 0xff,0xf9,0xf9,0xfa,0xff,0xff,0xff,0xff,0xff,0xee,0xee,0xf0,0xff,0xee,0xee, 0xf1,0xff,0xff,0xff,0xff,0xff,0x82,0xef,0xef,0xf1,0xff,0x01,0xff,0xff,0xff, 0xff,0x82,0xfe,0xfe,0xfe,0xff,0x01,0xf1,0xf1,0xf3,0xff,0x82,0xf2,0xf2,0xf3, 0xff,0x82,0xf3,0xf3,0xf4,0xff,0x82,0xf4,0xf4,0xf4,0xff,0x82,0xf5,0xf5,0xf5, 0xff,0x01,0xfb,0xfb,0xfb,0xff,0x82,0xfe,0xfe,0xfe,0xff,0x04,0xfa,0xfa,0xfa, 0xff,0xf5,0xf5,0xf5,0xff,0xf4,0xf4,0xf5,0xff,0xff,0xff,0xff,0xff,0x82,0xfe, 0xfe,0xfe,0xff,0x06,0xff,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xff,0xf5,0xf5,0xf5, 0xff,0xf3,0xf3,0xf3,0xff,0xff,0xff,0xff,0xff,0xf3,0xf3,0xf3,0xff,0x82,0xf2, 0xf2,0xf3,0xff,0x82,0xf2,0xf2,0xf2,0xff,0x83,0xf1,0xf1,0xf2,0xff,0x03,0xf0, 0xf0,0xf1,0xff,0xf2,0xf2,0xf3,0xff,0xfc,0xfc,0xfc,0xff,0x82,0xff,0xff,0xff, 0xff,0x14,0xf8,0xf8,0xf8,0xff,0xee,0xee,0xf0,0xff,0xee,0xee,0xef,0xff,0xf0, 0xf0,0xf1,0xff,0xfb,0xfb,0xfc,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xff, 0xfa,0xfa,0xfa,0xff,0xec,0xec,0xed,0xff,0xeb,0xeb,0xed,0xff,0xff,0xff,0xff, 0xff,0xea,0xea,0xec,0xff,0xed,0xed,0xef,0xff,0xff,0xff,0xff,0xff,0xed,0xed, 0xef,0xff,0xe9,0xe9,0xeb,0xff,0xff,0xff,0xff,0xff,0xe8,0xe8,0xea,0xff,0xe7, 0xe7,0xea,0xff,0xff,0xff,0xff,0xff,0x82,0xe6,0xe6,0xe9,0xff,0x82,0xe5,0xe5, 0xe8,0xff,0x82,0xe4,0xe4,0xe7,0xff,0x0e,0xe3,0xe3,0xe6,0xff,0xe2,0xe2,0xe6, 0xfc,0xe1,0xe1,0xe5,0xe9,0xe1,0xe1,0xe5,0xd5,0xe0,0xe0,0xe4,0xc0,0xe0,0xe0, 0xe4,0xab,0xdf,0xdf,0xe3,0x96,0xdf,0xdf,0xe3,0x81,0xde,0xde,0xe2,0x6c,0xde, 0xde,0xe2,0x57,0xdd,0xdd,0xe1,0x42,0xdc,0xdc,0xe1,0x2d,0xdc,0xdc,0xe0,0x18, 0xdb,0xdb,0xe0,0x04,0x84,0xff,0xff,0xff,0x00,0x85,0x00,0x00,0x00,0x00,0x1d, 0xff,0xff,0xff,0x26,0xa1,0xc6,0xa1,0xe2,0x94,0xbe,0x94,0xff,0x78,0xb5,0x78, 0xff,0x4f,0x9d,0x4f,0xff,0x3f,0x8b,0x3f,0xff,0x40,0x96,0x40,0xff,0x33,0x82, 0x33,0xff,0x37,0x8e,0x37,0xff,0x2f,0x7a,0x2f,0xff,0x34,0x84,0x34,0xff,0x31, 0x80,0x31,0xff,0x57,0x90,0x57,0xff,0x6f,0xab,0x6f,0xff,0xa3,0xcf,0xa3,0xff, 0xbd,0xc7,0xbd,0xff,0xb2,0xb7,0xb3,0xff,0xc7,0xc7,0xc7,0xff,0xe4,0xe4,0xe4, 0xff,0xf0,0xf0,0xf0,0xff,0xf7,0xf7,0xf8,0xff,0xd1,0xd1,0xd4,0xff,0xb3,0xb3, 0xb6,0xff,0x85,0x85,0x89,0xff,0x5c,0x5c,0x61,0xff,0x54,0x58,0x5a,0xff,0x49, 0x74,0x4e,0xff,0x35,0x96,0x35,0xff,0x8c,0xa6,0x8c,0xff,0x82,0xbf,0xbf,0xbf, 0xff,0x1a,0xc6,0xc6,0xc6,0xd5,0xff,0xff,0xff,0x94,0xff,0xff,0xff,0x99,0xff, 0xff,0xff,0x9d,0xff,0xff,0xff,0xa2,0xff,0xff,0xff,0xa6,0xff,0xff,0xff,0xab, 0xff,0xff,0xff,0xaf,0xff,0xff,0xff,0xb3,0xff,0xff,0xff,0xb8,0xff,0xff,0xff, 0xbc,0xff,0xff,0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff, 0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff, 0xff,0xff,0xdb,0xfc,0xfc,0xfd,0xe1,0xf6,0xf6,0xf8,0xe8,0xf0,0xf0,0xf4,0xee, 0xeb,0xeb,0xf0,0xf3,0xe6,0xe6,0xed,0xf8,0xe0,0xe0,0xe8,0xf4,0xd9,0xd9,0xe3, 0xe8,0x83,0xda,0xda,0xe4,0xff,0x02,0xdb,0xdb,0xe4,0xff,0xdb,0xdb,0xe5,0xff, 0x82,0xdc,0xdc,0xe5,0xff,0x01,0xc0,0xc0,0xc6,0xff,0x83,0x0f,0x0f,0x0f,0xff, 0x01,0xc0,0xc0,0xc8,0xff,0x82,0xdf,0xdf,0xe7,0xff,0x82,0xe0,0xe0,0xe8,0xff, 0x82,0xe1,0xe1,0xe8,0xff,0x82,0xe2,0xe2,0xe9,0xff,0x02,0xc5,0xc5,0xca,0xff, 0xe3,0xe3,0xea,0xff,0x82,0xe4,0xe4,0xea,0xff,0x83,0xe5,0xe5,0xeb,0xff,0x02, 0xe6,0xe6,0xeb,0xff,0xe6,0xe6,0xec,0xff,0x82,0xe7,0xe7,0xec,0xff,0x82,0xe8, 0xe8,0xed,0xff,0x82,0xe9,0xe9,0xed,0xff,0x06,0x3e,0x3e,0x3f,0xff,0x10,0x10, 0x10,0xff,0x00,0x00,0x00,0xff,0x2f,0x2f,0x30,0xff,0xcd,0xcd,0xcf,0xff,0xec, 0xec,0xef,0xff,0x83,0xed,0xed,0xf0,0xff,0x82,0xee,0xee,0xf1,0xff,0x82,0xef, 0xef,0xf1,0xff,0x04,0xd0,0xd0,0xd2,0xff,0xf0,0xf0,0xf2,0xff,0xf1,0xf1,0xf2, 0xff,0xf1,0xf1,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x02,0xf3,0xf3,0xf3,0xff, 0xf3,0xf3,0xf4,0xff,0x82,0xf4,0xf4,0xf4,0xff,0x01,0x72,0x72,0x72,0xff,0x82, 0x00,0x00,0x00,0xff,0x01,0x83,0x83,0x83,0xff,0x83,0xf5,0xf5,0xf5,0xff,0x01, 0xf4,0xf4,0xf5,0xff,0x85,0xf4,0xf4,0xf4,0xff,0x82,0xf3,0xf3,0xf4,0xff,0x82, 0xf3,0xf3,0xf3,0xff,0x83,0xf2,0xf2,0xf3,0xff,0x01,0xf2,0xf2,0xf2,0xff,0x83, 0xf1,0xf1,0xf2,0xff,0x84,0xf0,0xf0,0xf1,0xff,0x01,0x9f,0x9f,0xa0,0xff,0x82, 0x10,0x10,0x10,0xff,0x03,0x00,0x00,0x00,0xff,0x9f,0x9f,0x9f,0xff,0xed,0xed, 0xef,0xff,0x82,0xed,0xed,0xee,0xff,0x02,0xec,0xec,0xee,0xff,0xec,0xec,0xed, 0xff,0x82,0xeb,0xeb,0xed,0xff,0x83,0xea,0xea,0xec,0xff,0x82,0xe9,0xe9,0xeb, 0xff,0x04,0xe8,0xe8,0xeb,0xff,0xe8,0xe8,0xea,0xff,0xe7,0xe7,0xea,0xff,0xe7, 0xe7,0xe9,0xff,0x82,0xe6,0xe6,0xe9,0xff,0x82,0xe5,0xe5,0xe8,0xff,0x82,0xe4, 0xe4,0xe7,0xff,0x10,0xe3,0xe3,0xe7,0xff,0xe3,0xe3,0xe6,0xff,0xe2,0xe2,0xe5, 0xff,0xe1,0xe1,0xe5,0xfc,0xe1,0xe1,0xe4,0xe9,0xe0,0xe0,0xe4,0xd5,0xdf,0xdf, 0xe3,0xc0,0xdf,0xdf,0xe3,0xab,0xde,0xde,0xe2,0x96,0xde,0xde,0xe2,0x81,0xdd, 0xdd,0xe2,0x6c,0xdc,0xdc,0xe1,0x57,0xdc,0xdc,0xe1,0x42,0xdb,0xdb,0xe0,0x2d, 0xdb,0xdb,0xe0,0x18,0xda,0xda,0xdf,0x04,0x84,0xff,0xff,0xff,0x00,0x85,0x00, 0x00,0x00,0x00,0x11,0xe9,0xf2,0xe9,0x49,0x97,0xc0,0x97,0xff,0x93,0xbd,0x93, 0xff,0x5c,0x9c,0x5c,0xff,0x44,0x8d,0x44,0xff,0x3e,0x89,0x3e,0xff,0x41,0x8b, 0x41,0xff,0x5b,0x9a,0x5b,0xff,0x5a,0x97,0x5a,0xff,0x58,0x94,0x58,0xff,0x42, 0x82,0x42,0xff,0x2c,0x71,0x2c,0xff,0x58,0x96,0x58,0xff,0x78,0xaf,0x78,0xff, 0xb9,0xbd,0xb9,0xff,0xae,0xae,0xaf,0xff,0xef,0xef,0xef,0xff,0x82,0xff,0xff, 0xff,0xff,0x0a,0xf7,0xf7,0xf8,0xff,0xe8,0xe8,0xea,0xff,0xd5,0xd5,0xd8,0xff, 0xc0,0xc0,0xc4,0xff,0xa8,0xa8,0xae,0xff,0x84,0x84,0x8b,0xff,0x5c,0x5c,0x61, 0xff,0x51,0x51,0x57,0xff,0x36,0x48,0x3a,0xff,0x90,0xb5,0x90,0xff,0x82,0xff, 0xff,0xff,0xff,0x1e,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0x94,0xff,0xff,0xff, 0x99,0xff,0xff,0xff,0x9d,0xff,0xff,0xff,0xa2,0xff,0xff,0xff,0xa6,0xff,0xff, 0xff,0xab,0xff,0xff,0xff,0xaf,0xff,0xff,0xff,0xb3,0xff,0xff,0xff,0xb8,0xff, 0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8, 0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff, 0xd8,0xff,0xff,0xff,0xdb,0xfc,0xfc,0xfd,0xe1,0xf6,0xf6,0xf8,0xe8,0xf0,0xf0, 0xf5,0xee,0xeb,0xeb,0xf1,0xf3,0xe6,0xe6,0xed,0xf8,0xe1,0xe1,0xe9,0xf5,0xda, 0xda,0xe4,0xe8,0xdb,0xdb,0xe4,0xff,0xda,0xda,0xe4,0xff,0xdb,0xdb,0xe4,0xff, 0xdb,0xdb,0xe5,0xff,0x82,0xdc,0xdc,0xe5,0xff,0x08,0xdd,0xdd,0xe6,0xff,0x3b, 0x3b,0x3d,0xff,0x69,0x69,0x6d,0xff,0xfd,0xfd,0xfd,0xff,0x87,0x87,0x87,0xff, 0x33,0x33,0x33,0xff,0xe4,0xe4,0xea,0xff,0xe0,0xe0,0xe8,0xff,0x82,0xe1,0xe1, 0xe8,0xff,0x82,0xe2,0xe2,0xe9,0xff,0x05,0xe3,0xe3,0xe9,0xff,0xe3,0xe3,0xea, 0xff,0x00,0x00,0x00,0xff,0xe8,0xe8,0xed,0xff,0xe4,0xe4,0xea,0xff,0x82,0xe5, 0xe5,0xeb,0xff,0x02,0xe6,0xe6,0xeb,0xff,0xe6,0xe6,0xec,0xff,0x82,0xe7,0xe7, 0xec,0xff,0x82,0xe8,0xe8,0xed,0xff,0x82,0xe9,0xe9,0xed,0xff,0x0b,0xea,0xea, 0xee,0xff,0x4e,0x4e,0x4f,0xff,0x2f,0x2f,0x30,0xff,0xfa,0xfa,0xfb,0xff,0xfe, 0xfe,0xfe,0xff,0x66,0x66,0x66,0xff,0x32,0x32,0x32,0xff,0xef,0xef,0xf2,0xff, 0xed,0xed,0xf0,0xff,0xee,0xee,0xf0,0xff,0xee,0xee,0xf1,0xff,0x82,0xef,0xef, 0xf1,0xff,0x82,0xf0,0xf0,0xf2,0xff,0x02,0x00,0x00,0x00,0xff,0xf3,0xf3,0xf5, 0xff,0x82,0xf2,0xf2,0xf3,0xff,0x01,0xf3,0xf3,0xf3,0xff,0x82,0xf3,0xf3,0xf4, 0xff,0x09,0xf4,0xf4,0xf4,0xff,0xf4,0xf4,0xf5,0xff,0xf5,0xf5,0xf5,0xff,0x00, 0x00,0x00,0xff,0xd9,0xd9,0xd9,0xff,0xdd,0xdd,0xdd,0xff,0x44,0x44,0x44,0xff, 0xfa,0xfa,0xfa,0xff,0xf5,0xf5,0xf5,0xff,0x85,0xf4,0xf4,0xf4,0xff,0x82,0xf3, 0xf3,0xf4,0xff,0x83,0xf3,0xf3,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x01,0xf2, 0xf2,0xf2,0xff,0x83,0xf1,0xf1,0xf2,0xff,0x01,0xf1,0xf1,0xf1,0xff,0x83,0xf0, 0xf0,0xf1,0xff,0x82,0xef,0xef,0xf0,0xff,0x06,0x00,0x00,0x00,0xff,0xc3,0xc3, 0xc3,0xff,0xfe,0xfe,0xfe,0xff,0x87,0x87,0x87,0xff,0x44,0x44,0x44,0xff,0xf3, 0xf3,0xf4,0xff,0x82,0xec,0xec,0xee,0xff,0x83,0xeb,0xeb,0xed,0xff,0x82,0xea, 0xea,0xec,0xff,0x82,0xe9,0xe9,0xeb,0xff,0x02,0xe8,0xe8,0xeb,0xff,0xe8,0xe8, 0xea,0xff,0x82,0xe7,0xe7,0xea,0xff,0x82,0xe6,0xe6,0xe9,0xff,0x82,0xe5,0xe5, 0xe8,0xff,0x14,0xe4,0xe4,0xe8,0xff,0xe4,0xe4,0xe7,0xff,0xe3,0xe3,0xe7,0xff, 0xe3,0xe3,0xe6,0xff,0xe2,0xe2,0xe6,0xff,0xe2,0xe2,0xe5,0xff,0xe1,0xe1,0xe4, 0xff,0xe0,0xe0,0xe4,0xfc,0xe0,0xe0,0xe4,0xe9,0xdf,0xdf,0xe3,0xd5,0xde,0xde, 0xe3,0xc0,0xde,0xde,0xe2,0xab,0xdd,0xdd,0xe2,0x96,0xdd,0xdd,0xe1,0x81,0xdc, 0xdc,0xe1,0x6c,0xdb,0xdb,0xe0,0x57,0xdb,0xdb,0xe0,0x42,0xda,0xda,0xdf,0x2d, 0xda,0xda,0xdf,0x18,0xd9,0xd9,0xde,0x04,0x84,0xff,0xff,0xff,0x00,0x85,0x00, 0x00,0x00,0x00,0x0e,0xc3,0xdb,0xc3,0x89,0x96,0xbf,0x96,0xff,0x92,0xbd,0x92, 0xff,0x4e,0x93,0x4e,0xff,0x43,0x8c,0x43,0xff,0x3c,0x88,0x3c,0xff,0x59,0x9a, 0x59,0xff,0x84,0xb3,0x84,0xff,0x83,0xb0,0x83,0xff,0x82,0xae,0x82,0xff,0x4c, 0x88,0x4c,0xff,0x2b,0x6f,0x2b,0xff,0x5b,0x98,0x5b,0xff,0x7f,0xaa,0x7f,0xff, 0x82,0xb2,0xb2,0xb2,0xff,0x29,0xfa,0xfa,0xfa,0xff,0xff,0xff,0xff,0xff,0xf7, 0xf7,0xf8,0xff,0xe8,0xe8,0xea,0xff,0xd5,0xd5,0xd8,0xff,0xc0,0xc0,0xc4,0xff, 0xa8,0xa8,0xae,0xff,0x8e,0x8e,0x96,0xff,0x6d,0x6d,0x75,0xff,0x52,0x52,0x56, 0xff,0x5c,0x5c,0x61,0xff,0x51,0x51,0x57,0xff,0x0d,0x2d,0x0d,0xff,0xbb,0xd6, 0xbb,0x9d,0xff,0xff,0xff,0x8b,0xff,0xff,0xff,0x90,0xff,0xff,0xff,0x94,0xff, 0xff,0xff,0x99,0xff,0xff,0xff,0x9d,0xff,0xff,0xff,0xa2,0xff,0xff,0xff,0xa6, 0xff,0xff,0xff,0xab,0xff,0xff,0xff,0xaf,0xff,0xff,0xff,0xb3,0xff,0xff,0xff, 0xb8,0xff,0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff, 0xff,0xc8,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff, 0xff,0xff,0xd8,0xff,0xff,0xff,0xdb,0xfc,0xfc,0xfd,0xe1,0xf6,0xf6,0xf9,0xe8, 0xf1,0xf1,0xf5,0xee,0xeb,0xeb,0xf1,0xf3,0xe7,0xe7,0xee,0xf8,0xe1,0xe1,0xe9, 0xf5,0xdb,0xdb,0xe4,0xe8,0x82,0xdb,0xdb,0xe5,0xff,0x82,0xdc,0xdc,0xe5,0xff, 0x82,0xdd,0xdd,0xe6,0xff,0x09,0xde,0xde,0xe6,0xff,0x00,0x00,0x00,0xff,0xf6, 0xf6,0xf9,0xff,0xf0,0xf0,0xf4,0xff,0xe0,0xe0,0xe7,0xff,0x00,0x00,0x00,0xff, 0xf9,0xf9,0xfa,0xff,0xe1,0xe1,0xe8,0xff,0x00,0x00,0x00,0xff,0x82,0xe2,0xe2, 0xe9,0xff,0x08,0x00,0x00,0x00,0xff,0xe3,0xe3,0xea,0xff,0x6a,0x6a,0x6d,0xff, 0x00,0x00,0x00,0xff,0x55,0x55,0x55,0xff,0xe5,0xe5,0xeb,0xff,0xe6,0xe6,0xeb, 0xff,0xe6,0xe6,0xec,0xff,0x82,0xe7,0xe7,0xec,0xff,0x01,0xe8,0xe8,0xec,0xff, 0x82,0xe8,0xe8,0xed,0xff,0x02,0xe9,0xe9,0xed,0xff,0xe9,0xe9,0xee,0xff,0x82, 0xea,0xea,0xee,0xff,0x11,0x00,0x00,0x00,0xff,0xc6,0xc6,0xc8,0xff,0xfb,0xfb, 0xfc,0xff,0xec,0xec,0xef,0xff,0xed,0xed,0xf0,0xff,0x00,0x00,0x00,0xff,0xfc, 0xfc,0xfc,0xff,0xee,0xee,0xf1,0xff,0x00,0x00,0x00,0xff,0xef,0xef,0xf1,0xff, 0xf0,0xf0,0xf2,0xff,0x00,0x00,0x00,0xff,0xf1,0xf1,0xf2,0xff,0x70,0x70,0x71, 0xff,0x00,0x00,0x00,0xff,0x55,0x55,0x55,0xff,0xf2,0xf2,0xf3,0xff,0x82,0xf3, 0xf3,0xf4,0xff,0x02,0xf4,0xf4,0xf4,0xff,0xf4,0xf4,0xf5,0xff,0x83,0xf5,0xf5, 0xf5,0xff,0x02,0x00,0x00,0x00,0xff,0x88,0x88,0x88,0xff,0x82,0xf6,0xf6,0xf6, 0xff,0x0e,0xfc,0xfc,0xfc,0xff,0x41,0x41,0x41,0xff,0x72,0x72,0x72,0xff,0xf4, 0xf4,0xf4,0xff,0xc3,0xc3,0xc3,0xff,0x00,0x00,0x00,0xff,0xf3,0xf3,0xf4,0xff, 0x00,0x00,0x00,0xff,0x51,0x51,0x51,0xff,0x20,0x20,0x20,0xff,0x00,0x00,0x00, 0xff,0x71,0x71,0x71,0xff,0xf2,0xf2,0xf2,0xff,0x81,0x81,0x81,0xff,0x82,0x30, 0x30,0x30,0xff,0x01,0x60,0x60,0x60,0xff,0x83,0xf0,0xf0,0xf1,0xff,0x83,0xef, 0xef,0xf0,0xff,0x17,0xee,0xee,0xf0,0xff,0x00,0x00,0x00,0xff,0x66,0x66,0x66, 0xff,0xd1,0xd1,0xd2,0xff,0xed,0xed,0xee,0xff,0xf5,0xf5,0xf6,0xff,0xfa,0xfa, 0xfa,0xff,0x00,0x00,0x00,0xff,0xbc,0xbc,0xbe,0xff,0xeb,0xeb,0xed,0xff,0x6d, 0x6d,0x6e,0xff,0x3e,0x3e,0x3f,0xff,0xe9,0xe9,0xec,0xff,0x00,0x00,0x00,0xff, 0x2e,0x2e,0x2f,0xff,0x00,0x00,0x00,0xff,0x4d,0x4d,0x4e,0xff,0xe7,0xe7,0xea, 0xff,0x9a,0x9a,0x9b,0xff,0x1f,0x1f,0x1f,0xff,0x3d,0x3d,0x3e,0xff,0x4c,0x4c, 0x4d,0xff,0xe5,0xe5,0xe8,0xff,0x82,0xe4,0xe4,0xe7,0xff,0x03,0xe3,0xe3,0xe6, 0xff,0xe2,0xe2,0xe6,0xff,0xe2,0xe2,0xe5,0xff,0x82,0xe1,0xe1,0xe5,0xff,0x0e, 0xe0,0xe0,0xe4,0xff,0xdf,0xdf,0xe3,0xfc,0xdf,0xdf,0xe3,0xe9,0xde,0xde,0xe2, 0xd5,0xdd,0xdd,0xe2,0xc0,0xdd,0xdd,0xe1,0xab,0xdc,0xdc,0xe1,0x96,0xdc,0xdc, 0xe0,0x81,0xdb,0xdb,0xe0,0x6c,0xda,0xda,0xdf,0x57,0xda,0xda,0xdf,0x42,0xd9, 0xd9,0xde,0x2d,0xd8,0xd8,0xde,0x18,0xd8,0xd8,0xdd,0x04,0x84,0xff,0xff,0xff, 0x00,0x84,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0x0d,0xb1,0xcf,0xb1,0xbc, 0x95,0xbf,0x95,0xff,0x84,0xb4,0x84,0xff,0x48,0x90,0x48,0xff,0x41,0x8b,0x41, 0xff,0x3a,0x87,0x3a,0xff,0x62,0x9f,0x62,0xff,0x84,0xb2,0x84,0xff,0x83,0xb0, 0x83,0xff,0x82,0xad,0x82,0xff,0x41,0x81,0x41,0xff,0x2a,0x6e,0x2a,0xff,0x66, 0xa2,0x66,0xff,0x74,0x93,0x74,0xff,0x82,0xb2,0xb2,0xb2,0xff,0x0d,0x30,0x30, 0x30,0xff,0xab,0xab,0xab,0xff,0xe8,0xe8,0xea,0xff,0xd5,0xd5,0xd8,0xff,0xc0, 0xc0,0xc4,0xff,0xa8,0xa8,0xae,0xff,0x8e,0x8e,0x96,0xff,0x60,0x60,0x67,0xff, 0x1a,0x1a,0x1c,0xff,0x1b,0x1b,0x1c,0xff,0x66,0x66,0x6b,0xff,0x5c,0x5c,0x61, 0xff,0x06,0x17,0x06,0xff,0x83,0xff,0xff,0xff,0xff,0x19,0xff,0xff,0xff,0xc3, 0xff,0xff,0xff,0x99,0xff,0xff,0xff,0x9d,0xff,0xff,0xff,0xa2,0xff,0xff,0xff, 0xa6,0xff,0xff,0xff,0xab,0xff,0xff,0xff,0xaf,0xff,0xff,0xff,0xb3,0xff,0xff, 0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff,0xff,0xc4,0xff, 0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4, 0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb,0xfc,0xfc,0xfd,0xe1,0xf6,0xf6,0xf9, 0xe8,0xf1,0xf1,0xf5,0xee,0xec,0xec,0xf1,0xf3,0xe8,0xe8,0xee,0xf8,0xe2,0xe2, 0xea,0xf7,0xdc,0xdc,0xe5,0xe8,0x82,0xdc,0xdc,0xe5,0xff,0x02,0xdd,0xdd,0xe5, 0xff,0xdd,0xdd,0xe6,0xff,0x82,0xde,0xde,0xe6,0xff,0x03,0xde,0xde,0xe7,0xff, 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x82,0xe0,0xe0,0xe8,0xff,0x0d,0x00, 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe2,0xe2,0xe9,0xff,0x00,0x00,0x00,0xff, 0xff,0xff,0xff,0xff,0xe3,0xe3,0xea,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff, 0xff,0xe5,0xe5,0xeb,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xf7,0xf7, 0xf8,0xff,0xe6,0xe6,0xec,0xff,0x82,0xe7,0xe7,0xec,0xff,0x82,0xe8,0xe8,0xed, 0xff,0x02,0xe9,0xe9,0xed,0xff,0xe9,0xe9,0xee,0xff,0x82,0xea,0xea,0xee,0xff, 0x13,0xeb,0xeb,0xee,0xff,0xeb,0xeb,0xef,0xff,0x00,0x00,0x00,0xff,0xff,0xff, 0xff,0xff,0xf1,0xf1,0xf3,0xff,0xed,0xed,0xf0,0xff,0xee,0xee,0xf0,0xff,0x00, 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xef,0xef,0xf1,0xff,0x00,0x00,0x00,0xff, 0xff,0xff,0xff,0xff,0xf0,0xf0,0xf2,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff, 0xff,0xf2,0xf2,0xf3,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xfb,0xfb, 0xfb,0xff,0x82,0xf4,0xf4,0xf4,0xff,0x85,0xf5,0xf5,0xf5,0xff,0x16,0xa3,0xa3, 0xa3,0xff,0x22,0x22,0x22,0xff,0x00,0x00,0x00,0xff,0x82,0x82,0x82,0xff,0xf4, 0xf4,0xf4,0xff,0xc3,0xc3,0xc3,0xff,0x11,0x11,0x11,0xff,0xfa,0xfa,0xfa,0xff, 0x61,0x61,0x62,0xff,0x72,0x72,0x73,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00, 0xff,0xaa,0xaa,0xaa,0xff,0xfb,0xfb,0xfb,0xff,0xdb,0xdb,0xdb,0xff,0x00,0x00, 0x00,0xff,0xf8,0xf8,0xf9,0xff,0x00,0x00,0x00,0xff,0xd7,0xd7,0xd7,0xff,0xfc, 0xfc,0xfc,0xff,0x65,0x65,0x65,0xff,0xf9,0xf9,0xf9,0xff,0x83,0xef,0xef,0xf0, 0xff,0x01,0xee,0xee,0xf0,0xff,0x82,0xee,0xee,0xef,0xff,0x02,0xbe,0xbe,0xbf, 0xff,0x33,0x33,0x33,0xff,0x82,0x00,0x00,0x00,0xff,0x12,0x9d,0x9d,0x9e,0xff, 0xeb,0xeb,0xed,0xff,0x5e,0x5e,0x5f,0xff,0x66,0x66,0x66,0xff,0xee,0xee,0xf0, 0xff,0x1f,0x1f,0x1f,0xff,0xc4,0xc4,0xc5,0xff,0xf9,0xf9,0xfa,0xff,0x00,0x00, 0x00,0xff,0xdd,0xdd,0xdd,0xff,0xfa,0xfa,0xfb,0xff,0x00,0x00,0x00,0xff,0xf7, 0xf7,0xf8,0xff,0x0f,0x0f,0x10,0xff,0xbe,0xbe,0xc0,0xff,0xfc,0xfc,0xfc,0xff, 0x53,0x53,0x53,0xff,0xf6,0xf6,0xf7,0xff,0x82,0xe3,0xe3,0xe6,0xff,0x01,0xe2, 0xe2,0xe6,0xff,0x82,0xe1,0xe1,0xe5,0xff,0x82,0xe0,0xe0,0xe4,0xff,0x0e,0xdf, 0xdf,0xe3,0xff,0xde,0xde,0xe2,0xfc,0xde,0xde,0xe2,0xe9,0xdd,0xdd,0xe1,0xd5, 0xdc,0xdc,0xe1,0xc0,0xdc,0xdc,0xe0,0xab,0xdb,0xdb,0xe0,0x96,0xdb,0xdb,0xdf, 0x81,0xda,0xda,0xdf,0x6c,0xd9,0xd9,0xde,0x57,0xd9,0xd9,0xde,0x42,0xd8,0xd8, 0xdd,0x2d,0xd7,0xd7,0xdd,0x18,0xd7,0xd7,0xdd,0x04,0x84,0xff,0xff,0xff,0x00, 0x84,0x00,0x00,0x00,0x00,0x12,0xff,0xff,0xff,0x26,0xa0,0xc5,0xa0,0xe2,0x94, 0xbe,0x94,0xff,0x76,0xac,0x76,0xff,0x46,0x8e,0x46,0xff,0x3f,0x8a,0x3f,0xff, 0x38,0x86,0x38,0xff,0x70,0xa7,0x70,0xff,0x83,0xb1,0x83,0xff,0x82,0xaf,0x82, 0xff,0x81,0xac,0x81,0xff,0x41,0x7f,0x41,0xff,0x2a,0x6d,0x2a,0xff,0x65,0xa1, 0x65,0xff,0x4d,0x73,0x4d,0xff,0xa7,0xa7,0xa7,0xff,0xb2,0xb2,0xb2,0xff,0x43, 0x43,0x43,0xff,0x82,0x00,0x00,0x00,0xff,0x03,0x32,0x32,0x33,0xff,0x2c,0x2c, 0x2e,0xff,0x26,0x26,0x28,0xff,0x83,0x00,0x00,0x00,0xff,0x05,0x3d,0x3d,0x3f, 0xff,0x70,0x70,0x75,0xff,0x60,0x60,0x65,0xff,0x02,0x07,0x02,0xff,0xd5,0xe5, 0xd5,0xff,0x82,0xff,0xff,0xff,0xff,0x19,0xff,0xff,0xff,0xdd,0xff,0xff,0xff, 0x99,0xff,0xff,0xff,0x9d,0xff,0xff,0xff,0xa2,0xff,0xff,0xff,0xa6,0xff,0xff, 0xff,0xab,0xff,0xff,0xff,0xaf,0xff,0xff,0xff,0xb3,0xff,0xff,0xff,0xb8,0xff, 0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8, 0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff, 0xd8,0xff,0xff,0xff,0xdb,0xfc,0xfc,0xfd,0xe1,0xf6,0xf6,0xf9,0xe8,0xf2,0xf2, 0xf5,0xee,0xed,0xed,0xf2,0xf3,0xe8,0xe8,0xee,0xf8,0xe3,0xe3,0xea,0xf8,0xdd, 0xdd,0xe5,0xe8,0x83,0xdd,0xdd,0xe6,0xff,0x02,0xde,0xde,0xe6,0xff,0xde,0xde, 0xe7,0xff,0x82,0xdf,0xdf,0xe7,0xff,0x02,0x00,0x00,0x00,0xff,0xff,0xff,0xff, 0xff,0x82,0xe1,0xe1,0xe8,0xff,0x0b,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff, 0xe3,0xe3,0xe9,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe4,0xe4,0xea, 0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe5,0xe5,0xeb,0xff,0x00,0x00, 0x00,0xff,0xff,0xff,0xff,0xff,0x82,0xe7,0xe7,0xec,0xff,0x82,0xe8,0xe8,0xed, 0xff,0x82,0xe9,0xe9,0xed,0xff,0x82,0xea,0xea,0xee,0xff,0x02,0xeb,0xeb,0xee, 0xff,0xeb,0xeb,0xef,0xff,0x82,0xec,0xec,0xef,0xff,0x12,0x10,0x10,0x10,0xff, 0xcc,0xcc,0xcc,0xff,0xed,0xed,0xf0,0xff,0xee,0xee,0xf0,0xff,0xce,0xce,0xd1, 0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xf0,0xf0,0xf2,0xff,0x00,0x00, 0x00,0xff,0xff,0xff,0xff,0xff,0xf1,0xf1,0xf3,0xff,0x00,0x00,0x00,0xff,0xff, 0xff,0xff,0xff,0xf3,0xf3,0xf3,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff, 0xf4,0xf4,0xf4,0xff,0xf4,0xf4,0xf5,0xff,0x86,0xf5,0xf5,0xf5,0xff,0x18,0xf4, 0xf4,0xf5,0xff,0xf8,0xf8,0xf8,0xff,0xa9,0xa9,0xa9,0xff,0x00,0x00,0x00,0xff, 0xf9,0xf9,0xf9,0xff,0xf4,0xf4,0xf4,0xff,0x00,0x00,0x00,0xff,0xcb,0xcb,0xcb, 0xff,0x10,0x10,0x10,0xff,0xd9,0xd9,0xd9,0xff,0xf9,0xf9,0xf9,0xff,0x00,0x00, 0x00,0xff,0xff,0xff,0xff,0xff,0xf6,0xf6,0xf6,0xff,0xf1,0xf1,0xf2,0xff,0x00, 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff, 0xf2,0xf2,0xf3,0xff,0xf0,0xf0,0xf1,0xff,0xf9,0xf9,0xf9,0xff,0xef,0xef,0xf0, 0xff,0xee,0xee,0xf0,0xff,0x82,0xee,0xee,0xef,0xff,0x01,0xed,0xed,0xef,0xff, 0x82,0xed,0xed,0xee,0xff,0x1a,0xf0,0xf0,0xf1,0xff,0xfb,0xfb,0xfc,0xff,0x88, 0x88,0x88,0xff,0x00,0x00,0x00,0xff,0xf1,0xf1,0xf2,0xff,0xcb,0xcb,0xcd,0xff, 0x00,0x00,0x00,0xff,0xc5,0xc5,0xc6,0xff,0x10,0x10,0x10,0xff,0xfc,0xfc,0xfc, 0xff,0xed,0xed,0xee,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe9,0xe9, 0xec,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xfd, 0xfd,0xfd,0xff,0xe9,0xe9,0xec,0xff,0xe3,0xe3,0xe7,0xff,0xf6,0xf6,0xf7,0xff, 0xe2,0xe2,0xe6,0xff,0xe2,0xe2,0xe5,0xff,0xe1,0xe1,0xe5,0xff,0xe1,0xe1,0xe4, 0xff,0xe0,0xe0,0xe4,0xff,0x82,0xdf,0xdf,0xe3,0xff,0x0e,0xde,0xde,0xe2,0xff, 0xdd,0xdd,0xe2,0xfc,0xdd,0xdd,0xe1,0xe9,0xdc,0xdc,0xe1,0xd5,0xdb,0xdb,0xe0, 0xc0,0xdb,0xdb,0xe0,0xab,0xda,0xda,0xdf,0x96,0xd9,0xd9,0xdf,0x81,0xd9,0xd9, 0xde,0x6c,0xd8,0xd8,0xde,0x57,0xd8,0xd8,0xdd,0x42,0xd7,0xd7,0xdd,0x2d,0xd6, 0xd6,0xdc,0x18,0xd6,0xd6,0xdc,0x04,0x84,0xff,0xff,0xff,0x00,0x84,0x00,0x00, 0x00,0x00,0x1f,0xe9,0xf2,0xe9,0x49,0x97,0xc0,0x97,0xff,0x93,0xbd,0x93,0xff, 0x68,0xa3,0x68,0xff,0x44,0x8d,0x44,0xff,0x3d,0x89,0x3d,0xff,0x36,0x85,0x36, 0xff,0x67,0x9a,0x67,0xff,0x6a,0x97,0x6a,0xff,0x69,0x95,0x69,0xff,0x67,0x92, 0x67,0xff,0x31,0x74,0x31,0xff,0x2a,0x6c,0x2a,0xff,0x64,0xa1,0x64,0xff,0x6a, 0xa5,0x6a,0xff,0x39,0x46,0x39,0xff,0x7a,0x7a,0x7a,0xff,0xb2,0xb2,0xb2,0xff, 0x91,0x91,0x91,0xff,0x59,0x59,0x59,0xff,0x2c,0x2c,0x2c,0xff,0x2b,0x2b,0x2b, 0xff,0x29,0x29,0x2a,0xff,0x28,0x28,0x28,0xff,0x4b,0x4b,0x4c,0xff,0x72,0x72, 0x74,0xff,0x83,0x83,0x86,0xff,0x5b,0x5b,0x5e,0xff,0x15,0x15,0x16,0xff,0x10, 0x3d,0x10,0xff,0x7c,0xa3,0x7c,0xff,0x82,0xbf,0xbf,0xbf,0xff,0x19,0xbd,0xbd, 0xbd,0xf8,0xff,0xff,0xff,0x99,0xff,0xff,0xff,0x9d,0xff,0xff,0xff,0xa2,0xff, 0xff,0xff,0xa6,0xff,0xff,0xff,0xab,0xff,0xff,0xff,0xaf,0xff,0xff,0xff,0xb3, 0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff,0xff, 0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff, 0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb,0xfc,0xfc,0xfd,0xe1,0xf7, 0xf7,0xf9,0xe8,0xf2,0xf2,0xf5,0xee,0xed,0xed,0xf2,0xf3,0xe8,0xe8,0xee,0xf8, 0xe4,0xe4,0xeb,0xf8,0xdd,0xdd,0xe6,0xe8,0x82,0xde,0xde,0xe6,0xff,0x01,0xde, 0xde,0xe7,0xff,0x82,0xdf,0xdf,0xe7,0xff,0x11,0xe0,0xe0,0xe7,0xff,0xe0,0xe0, 0xe8,0xff,0x2d,0x2d,0x2e,0xff,0x88,0x88,0x88,0xff,0xe2,0xe2,0xe9,0xff,0x79, 0x79,0x7c,0xff,0x2d,0x2d,0x2f,0xff,0xff,0xff,0xff,0xff,0xe3,0xe3,0xea,0xff, 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xb7,0xb7,0xbc,0xff,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xe6,0xe6,0xec,0xff,0x00,0x00,0x00,0xff,0xff,0xff, 0xff,0xff,0x82,0xe8,0xe8,0xed,0xff,0x82,0xe9,0xe9,0xed,0xff,0x83,0xea,0xea, 0xee,0xff,0x82,0xeb,0xeb,0xef,0xff,0x82,0xec,0xec,0xef,0xff,0x11,0xed,0xed, 0xf0,0xff,0x4f,0x4f,0x50,0xff,0x55,0x55,0x55,0xff,0xf1,0xf1,0xf4,0xff,0xef, 0xef,0xf1,0xff,0x60,0x60,0x60,0xff,0x41,0x41,0x41,0xff,0xff,0xff,0xff,0xff, 0xf1,0xf1,0xf2,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xc2,0xc2,0xc2, 0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xf3,0xf3,0xf4,0xff,0x00,0x00, 0x00,0xff,0xff,0xff,0xff,0xff,0x87,0xf5,0xf5,0xf5,0xff,0x0e,0xf4,0xf4,0xf5, 0xff,0x00,0x00,0x00,0xff,0xf4,0xf4,0xf4,0xff,0xd3,0xd3,0xd3,0xff,0x00,0x00, 0x00,0xff,0xff,0xff,0xff,0xff,0xf3,0xf3,0xf4,0xff,0x61,0x61,0x61,0xff,0x33, 0x33,0x33,0xff,0x31,0x31,0x31,0xff,0xfe,0xfe,0xfe,0xff,0xf4,0xf4,0xf5,0xff, 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x82,0xf1,0xf1,0xf2,0xff,0x07,0x00, 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xdd,0xdd,0xdd,0xff, 0xcf,0xcf,0xd0,0xff,0x30,0x30,0x30,0xff,0xef,0xef,0xf0,0xff,0x82,0xee,0xee, 0xef,0xff,0x82,0xed,0xed,0xef,0xff,0x1a,0xed,0xed,0xee,0xff,0xec,0xec,0xee, 0xff,0x00,0x00,0x00,0xff,0xcc,0xcc,0xcd,0xff,0xeb,0xeb,0xed,0xff,0x9d,0x9d, 0x9e,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe9,0xe9,0xeb,0xff,0x1f, 0x1f,0x20,0xff,0x33,0x33,0x33,0xff,0x6f,0x6f,0x6f,0xff,0xfd,0xfd,0xfe,0xff, 0xe7,0xe7,0xea,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe5,0xe5,0xe8, 0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f,0xff,0xaa,0xaa, 0xaa,0xff,0xe3,0xe3,0xe6,0xff,0x1e,0x1e,0x1f,0xff,0xe2,0xe2,0xe5,0xff,0xe1, 0xe1,0xe5,0xff,0xe1,0xe1,0xe4,0xff,0x82,0xe0,0xe0,0xe4,0xff,0x11,0xdf,0xdf, 0xe3,0xff,0xde,0xde,0xe3,0xff,0xde,0xde,0xe2,0xff,0xdd,0xdd,0xe1,0xff,0xdc, 0xdc,0xe1,0xfc,0xdb,0xdb,0xe0,0xe9,0xdb,0xdb,0xe0,0xd5,0xda,0xda,0xdf,0xc0, 0xda,0xda,0xdf,0xab,0xd9,0xd9,0xde,0x96,0xd8,0xd8,0xde,0x81,0xd8,0xd8,0xdd, 0x6c,0xd7,0xd7,0xdd,0x57,0xd6,0xd6,0xdc,0x42,0xd6,0xd6,0xdc,0x2d,0xd5,0xd5, 0xdb,0x18,0xd5,0xd5,0xdb,0x04,0x84,0xff,0xff,0xff,0x00,0x84,0x00,0x00,0x00, 0x00,0x1f,0xc6,0xdc,0xc6,0x8f,0x96,0xbf,0x96,0xff,0x91,0xbd,0x91,0xff,0x5a, 0x9b,0x5a,0xff,0x42,0x8c,0x42,0xff,0x3b,0x88,0x3b,0xff,0x35,0x84,0x35,0xff, 0x84,0xb3,0x84,0xff,0x83,0xb0,0x83,0xff,0x82,0xae,0x82,0xff,0x81,0xab,0x81, 0xff,0x2b,0x6f,0x2b,0xff,0x2d,0x6e,0x2d,0xff,0x62,0xa0,0x62,0xff,0x71,0xb1, 0x71,0xff,0x76,0xb7,0x76,0xff,0x3c,0x61,0x3c,0xff,0x1c,0x30,0x1c,0xff,0x1b, 0x30,0x1b,0xff,0x19,0x2f,0x19,0xff,0x18,0x2f,0x18,0xff,0x17,0x2e,0x17,0xff, 0x15,0x2e,0x15,0xff,0x14,0x2e,0x14,0xff,0x12,0x2d,0x12,0xff,0x11,0x2d,0x11, 0xff,0x0f,0x2c,0x0f,0xff,0x0e,0x2b,0x0e,0xff,0x1e,0x6a,0x1e,0xff,0x29,0x9d, 0x29,0xff,0x71,0xa8,0x71,0xff,0x83,0xff,0xff,0xff,0xff,0x18,0xff,0xff,0xff, 0xb3,0xff,0xff,0xff,0x9d,0xff,0xff,0xff,0xa2,0xff,0xff,0xff,0xa6,0xff,0xff, 0xff,0xab,0xff,0xff,0xff,0xaf,0xff,0xff,0xff,0xb3,0xff,0xff,0xff,0xb8,0xff, 0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8, 0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff, 0xd8,0xff,0xff,0xff,0xdb,0xfc,0xfc,0xfd,0xe1,0xf7,0xf7,0xf9,0xe8,0xf2,0xf2, 0xf5,0xee,0xee,0xee,0xf2,0xf3,0xe9,0xe9,0xef,0xf8,0xe5,0xe5,0xeb,0xfa,0xde, 0xde,0xe6,0xe8,0x83,0xdf,0xdf,0xe7,0xff,0x01,0xe0,0xe0,0xe7,0xff,0x82,0xe0, 0xe0,0xe8,0xff,0x13,0xe1,0xe1,0xe8,0xff,0xc3,0xc3,0xca,0xff,0x21,0x21,0x21, 0xff,0x10,0x10,0x10,0xff,0x0f,0x0f,0x10,0xff,0xd0,0xd0,0xd3,0xff,0xfa,0xfa, 0xfb,0xff,0xe4,0xe4,0xea,0xff,0x4c,0x4c,0x4e,0xff,0x00,0x00,0x00,0xff,0x3d, 0x3d,0x3f,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xe7,0xe7,0xec,0xff, 0x00,0x00,0x00,0xff,0x11,0x11,0x11,0xff,0xe8,0xe8,0xed,0xff,0xe9,0xe9,0xed, 0xff,0xe9,0xe9,0xee,0xff,0x82,0xea,0xea,0xee,0xff,0x82,0xeb,0xeb,0xef,0xff, 0x82,0xec,0xec,0xef,0xff,0x82,0xed,0xed,0xf0,0xff,0x11,0xee,0xee,0xf0,0xff, 0xce,0xce,0xd1,0xff,0x32,0x32,0x32,0xff,0x11,0x11,0x11,0xff,0x00,0x00,0x00, 0xff,0x30,0x30,0x30,0xff,0xd8,0xd8,0xd9,0xff,0xfb,0xfb,0xfc,0xff,0xf1,0xf1, 0xf3,0xff,0x51,0x51,0x51,0xff,0x00,0x00,0x00,0xff,0x41,0x41,0x41,0xff,0x00, 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xf4,0xf4,0xf5,0xff,0x21,0x21,0x21,0xff, 0x00,0x00,0x00,0xff,0x85,0xf5,0xf5,0xf5,0xff,0x01,0xf4,0xf4,0xf5,0xff,0x82, 0xf4,0xf4,0xf4,0xff,0x19,0x62,0x62,0x62,0xff,0x11,0x11,0x11,0xff,0x10,0x10, 0x10,0xff,0x83,0x83,0x83,0xff,0xff,0xff,0xff,0xff,0xf3,0xf3,0xf3,0xff,0xd3, 0xd3,0xd3,0xff,0x00,0x00,0x00,0xff,0x86,0x86,0x87,0xff,0xfc,0xfc,0xfc,0xff, 0xf2,0xf2,0xf2,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xf1,0xf1,0xf1, 0xff,0xf0,0xf0,0xf1,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x7f,0x7f, 0x80,0xff,0x11,0x11,0x11,0xff,0x10,0x10,0x10,0xff,0x80,0x80,0x81,0xff,0xfc, 0xfc,0xfc,0xff,0xee,0xee,0xef,0xff,0xed,0xed,0xef,0xff,0xed,0xed,0xee,0xff, 0x82,0xec,0xec,0xee,0xff,0x17,0xec,0xec,0xed,0xff,0x6e,0x6e,0x6f,0xff,0x11, 0x11,0x11,0xff,0x10,0x10,0x10,0xff,0x1f,0x1f,0x1f,0xff,0xa0,0xa0,0xa1,0xff, 0xff,0xff,0xff,0xff,0xe8,0xe8,0xeb,0xff,0x7c,0x7c,0x7d,0xff,0x00,0x00,0x00, 0xff,0xfa,0xfa,0xfb,0xff,0xf4,0xf4,0xf5,0xff,0xe6,0xe6,0xe9,0xff,0x00,0x00, 0x00,0xff,0xff,0xff,0xff,0xff,0xe5,0xe5,0xe8,0xff,0x00,0x00,0x00,0xff,0xff, 0xff,0xff,0xff,0x97,0x97,0x99,0xff,0x11,0x11,0x11,0xff,0x1f,0x1f,0x20,0xff, 0x69,0x69,0x6b,0xff,0xfb,0xfb,0xfc,0xff,0x82,0xe0,0xe0,0xe4,0xff,0x82,0xdf, 0xdf,0xe3,0xff,0x11,0xde,0xde,0xe2,0xff,0xdd,0xdd,0xe2,0xff,0xdd,0xdd,0xe1, 0xff,0xdc,0xdc,0xe0,0xff,0xdb,0xdb,0xe0,0xfc,0xda,0xda,0xdf,0xe9,0xda,0xda, 0xdf,0xd5,0xd9,0xd9,0xde,0xc0,0xd9,0xd9,0xde,0xab,0xd8,0xd8,0xdd,0x96,0xd7, 0xd7,0xdd,0x81,0xd7,0xd7,0xdc,0x6c,0xd6,0xd6,0xdc,0x57,0xd5,0xd5,0xdb,0x42, 0xd5,0xd5,0xdb,0x2d,0xd4,0xd4,0xda,0x18,0xd3,0xd3,0xda,0x04,0x84,0xff,0xff, 0xff,0x00,0x83,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0x13,0xb0,0xcf,0xb0, 0xbc,0x95,0xbe,0x95,0xff,0x90,0xbc,0x90,0xff,0x47,0x8f,0x47,0xff,0x40,0x8b, 0x40,0xff,0x3a,0x87,0x3a,0xff,0x43,0x8c,0x43,0xff,0x83,0xb2,0x83,0xff,0x83, 0xaf,0x83,0xff,0x82,0xad,0x82,0xff,0x80,0xaa,0x80,0xff,0x2a,0x6e,0x2a,0xff, 0x38,0x78,0x38,0xff,0x61,0x9f,0x61,0xff,0x6f,0xb0,0x6f,0xff,0x7c,0xc2,0x7c, 0xff,0x90,0xcd,0x90,0xff,0x8e,0xbf,0x8e,0xff,0x73,0xa7,0x73,0xff,0x87,0xbe, 0x87,0xff,0x6b,0xa5,0x6b,0xff,0x7f,0xbc,0x7f,0xff,0x7c,0xbb,0x7c,0xff,0x78, 0xba,0x78,0xff,0x74,0xb9,0x74,0xff,0x71,0xb7,0x71,0xff,0x55,0x9e,0x55,0xff, 0x69,0xb4,0x69,0xff,0x2f,0xa9,0x2f,0xff,0x29,0xa5,0x29,0xff,0x45,0x8e,0x45, 0xff,0x83,0xff,0xff,0xff,0xff,0x18,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0x9d, 0xff,0xff,0xff,0xa2,0xff,0xff,0xff,0xa6,0xff,0xff,0xff,0xab,0xff,0xff,0xff, 0xaf,0xff,0xff,0xff,0xb3,0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff, 0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff, 0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb, 0xfc,0xfc,0xfd,0xe1,0xf7,0xf7,0xf9,0xe8,0xf2,0xf2,0xf6,0xee,0xee,0xee,0xf2, 0xf3,0xea,0xea,0xef,0xf8,0xe6,0xe6,0xec,0xfb,0xdf,0xdf,0xe7,0xe8,0x82,0xdf, 0xdf,0xe7,0xff,0x82,0xe0,0xe0,0xe8,0xff,0x82,0xe1,0xe1,0xe8,0xff,0x82,0xe2, 0xe2,0xe9,0xff,0x02,0xe7,0xe7,0xec,0xff,0xfb,0xfb,0xfc,0xff,0x82,0xfd,0xfd, 0xfe,0xff,0x07,0xe8,0xe8,0xee,0xff,0xe5,0xe5,0xeb,0xff,0xe6,0xe6,0xeb,0xff, 0xf7,0xf7,0xf8,0xff,0xff,0xff,0xff,0xff,0xf9,0xf9,0xfa,0xff,0xff,0xff,0xff, 0xff,0x82,0xe8,0xe8,0xed,0xff,0x02,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xff, 0x82,0xea,0xea,0xee,0xff,0x02,0xeb,0xeb,0xee,0xff,0xeb,0xeb,0xef,0xff,0x82, 0xec,0xec,0xef,0xff,0x82,0xed,0xed,0xf0,0xff,0x01,0xee,0xee,0xf0,0xff,0x82, 0xee,0xee,0xf1,0xff,0x0d,0xef,0xef,0xf1,0xff,0xf1,0xf1,0xf3,0xff,0xfc,0xfc, 0xfc,0xff,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xfc,0xfc,0xfd,0xff,0xf4, 0xf4,0xf5,0xff,0xf2,0xf2,0xf3,0xff,0xf3,0xf3,0xf4,0xff,0xfb,0xfb,0xfb,0xff, 0xff,0xff,0xff,0xff,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0x82,0xf5,0xf5, 0xf5,0xff,0x02,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0x82,0xf5,0xf5,0xf5, 0xff,0x01,0xf4,0xf4,0xf5,0xff,0x85,0xf4,0xf4,0xf4,0xff,0x01,0xfa,0xfa,0xfb, 0xff,0x82,0xfe,0xfe,0xfe,0xff,0x06,0xf9,0xf9,0xf9,0xff,0xf2,0xf2,0xf3,0xff, 0xd2,0xd2,0xd3,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xf8,0xf8,0xf8, 0xff,0x82,0xf1,0xf1,0xf2,0xff,0x01,0xff,0xff,0xff,0xff,0x82,0xf0,0xf0,0xf1, 0xff,0x04,0xef,0xef,0xf1,0xff,0xff,0xff,0xff,0xff,0xef,0xef,0xf0,0xff,0xf6, 0xf6,0xf7,0xff,0x82,0xfe,0xfe,0xfe,0xff,0x01,0xf5,0xf5,0xf6,0xff,0x82,0xed, 0xed,0xee,0xff,0x02,0xec,0xec,0xee,0xff,0xec,0xec,0xed,0xff,0x82,0xeb,0xeb, 0xed,0xff,0x02,0xea,0xea,0xec,0xff,0xf5,0xf5,0xf6,0xff,0x82,0xfe,0xfe,0xfe, 0xff,0x07,0xfc,0xfc,0xfc,0xff,0xf0,0xf0,0xf2,0xff,0xe8,0xe8,0xea,0xff,0x7b, 0x7b,0x7d,0xff,0x41,0x41,0x41,0xff,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe9,0xff, 0x82,0xe5,0xe5,0xe8,0xff,0x09,0xff,0xff,0xff,0xff,0xe4,0xe4,0xe7,0xff,0xe3, 0xe3,0xe6,0xff,0xff,0xff,0xff,0xff,0xe2,0xe2,0xe6,0xff,0xec,0xec,0xee,0xff, 0xfd,0xfd,0xfd,0xff,0xfb,0xfb,0xfb,0xff,0xf1,0xf1,0xf2,0xff,0x82,0xdf,0xdf, 0xe3,0xff,0x82,0xde,0xde,0xe2,0xff,0x11,0xdd,0xdd,0xe1,0xff,0xdc,0xdc,0xe1, 0xff,0xdc,0xdc,0xe0,0xff,0xdb,0xdb,0xe0,0xff,0xda,0xda,0xdf,0xfc,0xd9,0xd9, 0xdf,0xe9,0xd9,0xd9,0xde,0xd5,0xd8,0xd8,0xdd,0xc0,0xd7,0xd7,0xdd,0xab,0xd7, 0xd7,0xdc,0x96,0xd6,0xd6,0xdc,0x81,0xd5,0xd5,0xdb,0x6c,0xd5,0xd5,0xdb,0x57, 0xd4,0xd4,0xda,0x42,0xd4,0xd4,0xda,0x2d,0xd3,0xd3,0xd9,0x18,0xd2,0xd2,0xd9, 0x04,0x84,0xff,0xff,0xff,0x00,0x83,0x00,0x00,0x00,0x00,0x3b,0xff,0xff,0xff, 0x2d,0xa0,0xc5,0xa0,0xe2,0x93,0xbe,0x93,0xff,0x82,0xb3,0x82,0xff,0x45,0x8e, 0x45,0xff,0x3e,0x8a,0x3e,0xff,0x38,0x86,0x38,0xff,0x4c,0x91,0x4c,0xff,0x83, 0xb1,0x83,0xff,0x82,0xaf,0x82,0xff,0x81,0xac,0x81,0xff,0x6b,0x9b,0x6b,0xff, 0x2a,0x6d,0x2a,0xff,0x37,0x77,0x37,0xff,0x60,0x9e,0x60,0xff,0x6e,0xb0,0x6e, 0xff,0x7b,0xc2,0x7b,0xff,0x8f,0xcc,0x8f,0xff,0x8d,0xbf,0x8d,0xff,0x72,0xa6, 0x72,0xff,0x86,0xbd,0x86,0xff,0x6a,0xa4,0x6a,0xff,0x7f,0xbb,0x7f,0xff,0x7b, 0xba,0x7b,0xff,0x77,0xb9,0x77,0xff,0x73,0xb8,0x73,0xff,0x70,0xb7,0x70,0xff, 0x54,0x9d,0x54,0xff,0x68,0xb3,0x68,0xff,0x41,0xb0,0x41,0xff,0x28,0xa4,0x28, 0xff,0x1b,0x7e,0x1b,0xff,0xe0,0xec,0xe0,0xf0,0xff,0xff,0xff,0xe3,0xff,0xff, 0xff,0xe4,0xff,0xff,0xff,0xd2,0xff,0xff,0xff,0x9d,0xff,0xff,0xff,0xa2,0xff, 0xff,0xff,0xa6,0xff,0xff,0xff,0xab,0xff,0xff,0xff,0xaf,0xff,0xff,0xff,0xb3, 0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff,0xff, 0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff, 0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb,0xfc,0xfc,0xfd,0xe1,0xf7, 0xf7,0xf9,0xe8,0xf3,0xf3,0xf6,0xee,0xee,0xee,0xf3,0xf3,0xea,0xea,0xef,0xf8, 0xe6,0xe6,0xec,0xfb,0xe0,0xe0,0xe7,0xe8,0x82,0xe0,0xe0,0xe8,0xff,0x82,0xe1, 0xe1,0xe8,0xff,0x82,0xe2,0xe2,0xe9,0xff,0x01,0xe3,0xe3,0xe9,0xff,0x82,0xe3, 0xe3,0xea,0xff,0x82,0xe4,0xe4,0xea,0xff,0x82,0xe5,0xe5,0xeb,0xff,0x02,0xe6, 0xe6,0xeb,0xff,0xe6,0xe6,0xec,0xff,0x82,0xe7,0xe7,0xec,0xff,0x82,0xe8,0xe8, 0xed,0xff,0x82,0xe9,0xe9,0xed,0xff,0x82,0xea,0xea,0xee,0xff,0x01,0xeb,0xeb, 0xee,0xff,0x82,0xeb,0xeb,0xef,0xff,0x02,0xec,0xec,0xef,0xff,0xec,0xec,0xf0, 0xff,0x82,0xed,0xed,0xf0,0xff,0x02,0xee,0xee,0xf0,0xff,0xee,0xee,0xf1,0xff, 0x82,0xef,0xef,0xf1,0xff,0x82,0xf0,0xf0,0xf2,0xff,0x02,0xf1,0xf1,0xf2,0xff, 0xf1,0xf1,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x02,0xf3,0xf3,0xf3,0xff,0xf3, 0xf3,0xf4,0xff,0x82,0xf4,0xf4,0xf4,0xff,0x01,0xf4,0xf4,0xf5,0xff,0x87,0xf5, 0xf5,0xf5,0xff,0x85,0xf4,0xf4,0xf4,0xff,0x82,0xf3,0xf3,0xf4,0xff,0x83,0xf3, 0xf3,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x05,0x71,0x71,0x71,0xff,0x41,0x41, 0x41,0xff,0xff,0xff,0xff,0xff,0xf1,0xf1,0xf2,0xff,0xf1,0xf1,0xf1,0xff,0x83, 0xf0,0xf0,0xf1,0xff,0x83,0xef,0xef,0xf0,0xff,0x82,0xee,0xee,0xef,0xff,0x01, 0xed,0xed,0xef,0xff,0x82,0xed,0xed,0xee,0xff,0x82,0xec,0xec,0xee,0xff,0x82, 0xeb,0xeb,0xed,0xff,0x01,0xeb,0xeb,0xec,0xff,0x82,0xea,0xea,0xec,0xff,0x82, 0xe9,0xe9,0xeb,0xff,0x02,0xe8,0xe8,0xeb,0xff,0xe8,0xe8,0xea,0xff,0x82,0xe7, 0xe7,0xea,0xff,0x04,0x2e,0x2e,0x2f,0xff,0xa1,0xa1,0xa2,0xff,0xf8,0xf8,0xf9, 0xff,0xe5,0xe5,0xe8,0xff,0x82,0xe4,0xe4,0xe7,0xff,0x07,0xe3,0xe3,0xe7,0xff, 0xe3,0xe3,0xe6,0xff,0xe2,0xe2,0xe6,0xff,0xe2,0xe2,0xe5,0xff,0xe1,0xe1,0xe5, 0xff,0xe1,0xe1,0xe4,0xff,0xe0,0xe0,0xe4,0xff,0x82,0xdf,0xdf,0xe3,0xff,0x05, 0xde,0xde,0xe3,0xff,0xde,0xde,0xe2,0xff,0xdd,0xdd,0xe2,0xff,0xdd,0xdd,0xe1, 0xff,0xdc,0xdc,0xe1,0xff,0x82,0xdb,0xdb,0xe0,0xff,0x0e,0xda,0xda,0xdf,0xff, 0xd9,0xd9,0xde,0xfc,0xd8,0xd8,0xde,0xe9,0xd8,0xd8,0xdd,0xd5,0xd7,0xd7,0xdd, 0xc0,0xd6,0xd6,0xdc,0xab,0xd6,0xd6,0xdc,0x96,0xd5,0xd5,0xdb,0x81,0xd4,0xd4, 0xda,0x6c,0xd4,0xd4,0xda,0x57,0xd3,0xd3,0xd9,0x42,0xd2,0xd2,0xd9,0x2d,0xd2, 0xd2,0xd8,0x18,0xd1,0xd1,0xd8,0x04,0x84,0xff,0xff,0xff,0x00,0x83,0x00,0x00, 0x00,0x00,0x3b,0xcc,0xe0,0xcc,0x50,0x97,0xc0,0x97,0xff,0x92,0xbd,0x92,0xff, 0x70,0xa8,0x70,0xff,0x43,0x8d,0x43,0xff,0x3c,0x89,0x3c,0xff,0x36,0x85,0x36, 0xff,0x47,0x8d,0x47,0xff,0x5a,0x96,0x5a,0xff,0x58,0x93,0x58,0xff,0x57,0x90, 0x57,0xff,0x4b,0x85,0x4b,0xff,0x29,0x6c,0x29,0xff,0x36,0x76,0x36,0xff,0x5f, 0x9e,0x5f,0xff,0x6d,0xaf,0x6d,0xff,0x79,0xc2,0x79,0xff,0x8d,0xcc,0x8d,0xff, 0x8c,0xbf,0x8c,0xff,0x71,0xa6,0x71,0xff,0x85,0xbd,0x85,0xff,0x69,0xa4,0x69, 0xff,0x7d,0xbb,0x7d,0xff,0x7a,0xba,0x7a,0xff,0x76,0xb9,0x76,0xff,0x72,0xb8, 0x72,0xff,0x6f,0xb7,0x6f,0xff,0x53,0x9d,0x53,0xff,0x67,0xb2,0x67,0xff,0x3b, 0x9f,0x3b,0xff,0x26,0xa3,0x26,0xff,0x1b,0x86,0x1b,0xff,0x37,0x86,0x37,0xe2, 0xff,0xff,0xff,0x90,0xff,0xff,0xff,0x94,0xff,0xff,0xff,0x99,0xff,0xff,0xff, 0x9d,0xff,0xff,0xff,0xa2,0xff,0xff,0xff,0xa6,0xff,0xff,0xff,0xab,0xff,0xff, 0xff,0xaf,0xff,0xff,0xff,0xb3,0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff, 0xff,0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc, 0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff, 0xdb,0xfc,0xfc,0xfd,0xe1,0xf7,0xf7,0xf9,0xe8,0xf3,0xf3,0xf6,0xee,0xef,0xef, 0xf3,0xf3,0xeb,0xeb,0xef,0xf8,0xe7,0xe7,0xed,0xfb,0xe1,0xe1,0xe8,0xe9,0x82, 0xe1,0xe1,0xe8,0xff,0x01,0xe1,0xe1,0xe9,0xff,0x82,0xe2,0xe2,0xe9,0xff,0x02, 0xe3,0xe3,0xe9,0xff,0xe3,0xe3,0xea,0xff,0x82,0xe4,0xe4,0xea,0xff,0x82,0xe5, 0xe5,0xeb,0xff,0x02,0xe6,0xe6,0xeb,0xff,0xe6,0xe6,0xec,0xff,0x82,0xe7,0xe7, 0xec,0xff,0x02,0xe8,0xe8,0xec,0xff,0xe8,0xe8,0xed,0xff,0x82,0xe9,0xe9,0xed, 0xff,0x01,0xe9,0xe9,0xee,0xff,0x82,0xea,0xea,0xee,0xff,0x82,0xeb,0xeb,0xef, 0xff,0x82,0xec,0xec,0xef,0xff,0x82,0xed,0xed,0xf0,0xff,0x02,0xee,0xee,0xf0, 0xff,0xee,0xee,0xf1,0xff,0x82,0xef,0xef,0xf1,0xff,0x82,0xf0,0xf0,0xf2,0xff, 0x82,0xf1,0xf1,0xf2,0xff,0x01,0xf1,0xf1,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff, 0x82,0xf3,0xf3,0xf4,0xff,0x02,0xf4,0xf4,0xf4,0xff,0xf4,0xf4,0xf5,0xff,0x87, 0xf5,0xf5,0xf5,0xff,0x01,0xf4,0xf4,0xf5,0xff,0x85,0xf4,0xf4,0xf4,0xff,0x01, 0xf3,0xf3,0xf4,0xff,0x83,0xf3,0xf3,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x82, 0xf2,0xf2,0xf2,0xff,0x03,0xf1,0xf1,0xf2,0xff,0xf8,0xf8,0xf9,0xff,0xfb,0xfb, 0xfb,0xff,0x83,0xf0,0xf0,0xf1,0xff,0x83,0xef,0xef,0xf0,0xff,0x02,0xee,0xee, 0xf0,0xff,0xee,0xee,0xef,0xff,0x82,0xed,0xed,0xef,0xff,0x01,0xed,0xed,0xee, 0xff,0x82,0xec,0xec,0xee,0xff,0x01,0xec,0xec,0xed,0xff,0x82,0xeb,0xeb,0xed, 0xff,0x82,0xea,0xea,0xec,0xff,0x04,0xe9,0xe9,0xec,0xff,0xe9,0xe9,0xeb,0xff, 0xe8,0xe8,0xeb,0xff,0xe8,0xe8,0xea,0xff,0x82,0xe7,0xe7,0xea,0xff,0x82,0xe6, 0xe6,0xe9,0xff,0x08,0xe5,0xe5,0xe8,0xff,0xfa,0xfa,0xfa,0xff,0xed,0xed,0xf0, 0xff,0xe4,0xe4,0xe7,0xff,0xe3,0xe3,0xe7,0xff,0xe3,0xe3,0xe6,0xff,0xe2,0xe2, 0xe6,0xff,0xe2,0xe2,0xe5,0xff,0x82,0xe1,0xe1,0xe5,0xff,0x82,0xe0,0xe0,0xe4, 0xff,0x06,0xdf,0xdf,0xe3,0xff,0xde,0xde,0xe3,0xff,0xde,0xde,0xe2,0xff,0xdd, 0xdd,0xe2,0xff,0xdd,0xdd,0xe1,0xff,0xdc,0xdc,0xe1,0xff,0x82,0xdb,0xdb,0xe0, 0xff,0x82,0xda,0xda,0xdf,0xff,0x0e,0xd8,0xd8,0xde,0xff,0xd8,0xd8,0xdd,0xfc, 0xd7,0xd7,0xdd,0xe9,0xd7,0xd7,0xdc,0xd5,0xd6,0xd6,0xdc,0xc0,0xd5,0xd5,0xdb, 0xab,0xd5,0xd5,0xdb,0x96,0xd4,0xd4,0xda,0x81,0xd3,0xd3,0xd9,0x6c,0xd3,0xd3, 0xd9,0x57,0xd2,0xd2,0xd8,0x42,0xd1,0xd1,0xd8,0x2d,0xd0,0xd0,0xd7,0x18,0xd0, 0xd0,0xd7,0x04,0x84,0xff,0xff,0xff,0x00,0x83,0x00,0x00,0x00,0x00,0x3b,0xce, 0xe1,0xce,0x86,0x95,0xbf,0x95,0xff,0x91,0xbc,0x91,0xff,0x6a,0x92,0x6a,0xff, 0x63,0x81,0x63,0xff,0x50,0x6f,0x50,0xff,0x5d,0x7d,0x5d,0xff,0x5b,0x7c,0x5b, 0xff,0x5a,0x7a,0x5a,0xff,0x58,0x78,0x58,0xff,0x47,0x67,0x47,0xff,0x55,0x75, 0x55,0xff,0x54,0x73,0x54,0xff,0x3c,0x5f,0x3c,0xff,0x58,0x93,0x58,0xff,0x6e, 0xb1,0x6e,0xff,0x77,0xc1,0x77,0xff,0x83,0xc7,0x83,0xff,0x81,0xbf,0x81,0xff, 0x6d,0xad,0x6d,0xff,0x78,0xbc,0x78,0xff,0x64,0xab,0x64,0xff,0x6f,0xba,0x6f, 0xff,0x6b,0xb9,0x6b,0xff,0x66,0xb8,0x66,0xff,0x62,0xb6,0x62,0xff,0x5d,0xb4, 0x5d,0xff,0x49,0xa2,0x49,0xff,0x60,0xaf,0x60,0xff,0x39,0x99,0x39,0xff,0x24, 0xa2,0x24,0xff,0x1b,0x8e,0x1b,0xff,0x11,0x6f,0x11,0xff,0xff,0xff,0xff,0x90, 0xff,0xff,0xff,0x94,0xff,0xff,0xff,0x99,0xff,0xff,0xff,0x9d,0xff,0xff,0xff, 0xa2,0xff,0xff,0xff,0xa6,0xff,0xff,0xff,0xab,0xff,0xff,0xff,0xaf,0xff,0xff, 0xff,0xb3,0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff, 0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0, 0xff,0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb,0xfc,0xfc,0xfd, 0xe1,0xf8,0xf8,0xf9,0xe8,0xf3,0xf3,0xf6,0xee,0xef,0xef,0xf3,0xf3,0xeb,0xeb, 0xf0,0xf8,0xe8,0xe8,0xed,0xfb,0xe1,0xe1,0xe9,0xe9,0x83,0xe2,0xe2,0xe9,0xff, 0x02,0xe3,0xe3,0xe9,0xff,0xe3,0xe3,0xea,0xff,0x82,0xe4,0xe4,0xea,0xff,0x82, 0xe5,0xe5,0xeb,0xff,0x82,0xe6,0xe6,0xeb,0xff,0x09,0xad,0xad,0xb1,0xff,0x48, 0x48,0x49,0xff,0x0e,0x0e,0x0e,0xff,0x1d,0x1d,0x1d,0xff,0x2d,0x2d,0x2d,0xff, 0x3c,0x3c,0x3c,0xff,0x7c,0x7c,0x7d,0xff,0xc6,0xc6,0xc9,0xff,0xea,0xea,0xee, 0xff,0x82,0xeb,0xeb,0xef,0xff,0x82,0xec,0xec,0xef,0xff,0x82,0xed,0xed,0xf0, 0xff,0x02,0xee,0xee,0xf0,0xff,0xee,0xee,0xf1,0xff,0x83,0xef,0xef,0xf1,0xff, 0x82,0xf0,0xf0,0xf2,0xff,0x02,0xf1,0xf1,0xf2,0xff,0xf1,0xf1,0xf3,0xff,0x82, 0xf2,0xf2,0xf3,0xff,0x09,0xf3,0xf3,0xf4,0xff,0xb6,0xb6,0xb7,0xff,0x4c,0x4c, 0x4c,0xff,0x0e,0x0e,0x0e,0xff,0x1d,0x1d,0x1d,0xff,0x2d,0x2d,0x2d,0xff,0x3c, 0x3c,0x3c,0xff,0x80,0x80,0x80,0xff,0xce,0xce,0xce,0xff,0x82,0xf5,0xf5,0xf5, 0xff,0x01,0xf4,0xf4,0xf5,0xff,0x85,0xf4,0xf4,0xf4,0xff,0x01,0xf3,0xf3,0xf4, 0xff,0x83,0xf3,0xf3,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x82,0xf2,0xf2,0xf2, 0xff,0x83,0xf1,0xf1,0xf2,0xff,0x0b,0xb4,0xb4,0xb5,0xff,0x4a,0x4a,0x4b,0xff, 0x0e,0x0e,0x0e,0xff,0x1d,0x1d,0x1d,0xff,0x2d,0x2d,0x2d,0xff,0x3c,0x3c,0x3c, 0xff,0x7d,0x7d,0x7e,0xff,0xc9,0xc9,0xca,0xff,0xee,0xee,0xef,0xff,0xed,0xed, 0xef,0xff,0xed,0xed,0xee,0xff,0x82,0xec,0xec,0xee,0xff,0x01,0xec,0xec,0xed, 0xff,0x82,0xeb,0xeb,0xed,0xff,0x82,0xea,0xea,0xec,0xff,0x01,0xe9,0xe9,0xec, 0xff,0x82,0xe9,0xe9,0xeb,0xff,0x82,0xe8,0xe8,0xea,0xff,0x02,0xe7,0xe7,0xea, 0xff,0xe7,0xe7,0xe9,0xff,0x82,0xe6,0xe6,0xe9,0xff,0x09,0xe5,0xe5,0xe8,0xff, 0xac,0xac,0xae,0xff,0x47,0x47,0x48,0xff,0x0e,0x0e,0x0e,0xff,0x1d,0x1d,0x1d, 0xff,0x2d,0x2d,0x2d,0xff,0x3c,0x3c,0x3c,0xff,0x79,0x79,0x7b,0xff,0xbf,0xbf, 0xc2,0xff,0x82,0xe0,0xe0,0xe4,0xff,0x82,0xdf,0xdf,0xe3,0xff,0x06,0xde,0xde, 0xe2,0xff,0xdd,0xdd,0xe2,0xff,0xdd,0xdd,0xe1,0xff,0xdc,0xdc,0xe1,0xff,0xdc, 0xdc,0xe0,0xff,0xdb,0xdb,0xe0,0xff,0x82,0xda,0xda,0xdf,0xff,0x82,0xd9,0xd9, 0xde,0xff,0x0e,0xd7,0xd7,0xdd,0xff,0xd7,0xd7,0xdc,0xfc,0xd6,0xd6,0xdc,0xe9, 0xd5,0xd5,0xdb,0xd5,0xd5,0xd5,0xdb,0xc0,0xd4,0xd4,0xda,0xab,0xd3,0xd3,0xda, 0x96,0xd3,0xd3,0xd9,0x81,0xd2,0xd2,0xd9,0x6c,0xd1,0xd1,0xd8,0x57,0xd1,0xd1, 0xd7,0x42,0xd0,0xd0,0xd7,0x2d,0xcf,0xcf,0xd6,0x18,0xcf,0xcf,0xd6,0x04,0x84, 0xff,0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00,0x3c,0xff,0xff,0xff,0x13,0xb5, 0xd2,0xb5,0xb3,0x94,0xbe,0x94,0xff,0x90,0xbc,0x90,0xff,0xae,0xb7,0xb2,0xff, 0x63,0x63,0x77,0xff,0x58,0x58,0x6c,0xff,0x4d,0x4d,0x61,0xff,0x42,0x42,0x56, 0xff,0x39,0x39,0x4c,0xff,0x31,0x31,0x43,0xff,0x29,0x29,0x3a,0xff,0x21,0x21, 0x30,0xff,0x19,0x19,0x27,0xff,0x0a,0x0a,0x10,0xff,0x45,0x75,0x45,0xff,0x73, 0xb8,0x73,0xff,0x76,0xc1,0x76,0xff,0x8b,0xcb,0x8b,0xff,0x8a,0xbf,0x8a,0xff, 0x6f,0xa6,0x6f,0xff,0x83,0xbd,0x83,0xff,0x67,0xa3,0x67,0xff,0x7b,0xbb,0x7b, 0xff,0x78,0xba,0x78,0xff,0x74,0xb9,0x74,0xff,0x70,0xb7,0x70,0xff,0x6c,0xb6, 0x6c,0xff,0x51,0x9c,0x51,0xff,0x65,0xb1,0x65,0xff,0x35,0x8e,0x35,0xff,0x23, 0xa1,0x23,0xff,0x1b,0x95,0x1b,0xff,0x10,0x6e,0x10,0xff,0xb9,0xd4,0xb9,0xa5, 0xff,0xff,0xff,0x94,0xff,0xff,0xff,0x99,0xff,0xff,0xff,0x9d,0xff,0xff,0xff, 0xa2,0xff,0xff,0xff,0xa6,0xff,0xff,0xff,0xab,0xff,0xff,0xff,0xaf,0xff,0xff, 0xff,0xb3,0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff, 0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0, 0xff,0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb,0xfc,0xfc,0xfd, 0xe1,0xf8,0xf8,0xfa,0xe8,0xf3,0xf3,0xf6,0xee,0xf0,0xf0,0xf3,0xf3,0xec,0xec, 0xf0,0xf8,0xe8,0xe8,0xee,0xfb,0xe2,0xe2,0xe9,0xe9,0x82,0xe3,0xe3,0xe9,0xff, 0x01,0xe3,0xe3,0xea,0xff,0x82,0xe4,0xe4,0xea,0xff,0x83,0xe5,0xe5,0xeb,0xff, 0x06,0xe6,0xe6,0xeb,0xff,0xe6,0xe6,0xec,0xff,0x65,0x65,0x67,0xff,0x00,0x00, 0x00,0xff,0x05,0x05,0x05,0xff,0x02,0x02,0x02,0xff,0x82,0x00,0x00,0x00,0xff, 0x04,0x04,0x04,0x04,0xff,0x22,0x22,0x22,0xff,0x5d,0x5d,0x5d,0xff,0xa4,0xa4, 0xa6,0xff,0x82,0xec,0xec,0xef,0xff,0x83,0xed,0xed,0xf0,0xff,0x82,0xee,0xee, 0xf1,0xff,0x82,0xef,0xef,0xf1,0xff,0x82,0xf0,0xf0,0xf2,0xff,0x02,0xf1,0xf1, 0xf2,0xff,0xf1,0xf1,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x82,0xf3,0xf3,0xf4, 0xff,0x04,0x6a,0x6a,0x6a,0xff,0x00,0x00,0x00,0xff,0x05,0x05,0x05,0xff,0x02, 0x02,0x02,0xff,0x82,0x00,0x00,0x00,0xff,0x04,0x04,0x04,0x04,0xff,0x22,0x22, 0x22,0xff,0x5d,0x5d,0x5d,0xff,0xa7,0xa7,0xa8,0xff,0x85,0xf4,0xf4,0xf4,0xff, 0x82,0xf3,0xf3,0xf4,0xff,0x82,0xf3,0xf3,0xf3,0xff,0x83,0xf2,0xf2,0xf3,0xff, 0x01,0xf2,0xf2,0xf2,0xff,0x83,0xf1,0xf1,0xf2,0xff,0x05,0xf0,0xf0,0xf1,0xff, 0x68,0x68,0x69,0xff,0x00,0x00,0x00,0xff,0x05,0x05,0x05,0xff,0x02,0x02,0x02, 0xff,0x82,0x00,0x00,0x00,0xff,0x07,0x04,0x04,0x04,0xff,0x22,0x22,0x22,0xff, 0x5d,0x5d,0x5d,0xff,0xa5,0xa5,0xa5,0xff,0xed,0xed,0xee,0xff,0xec,0xec,0xee, 0xff,0xec,0xec,0xed,0xff,0x82,0xeb,0xeb,0xed,0xff,0x83,0xea,0xea,0xec,0xff, 0x82,0xe9,0xe9,0xeb,0xff,0x04,0xe8,0xe8,0xeb,0xff,0xe8,0xe8,0xea,0xff,0xe7, 0xe7,0xea,0xff,0xe7,0xe7,0xe9,0xff,0x82,0xe6,0xe6,0xe9,0xff,0x82,0xe5,0xe5, 0xe8,0xff,0x04,0x63,0x63,0x65,0xff,0x00,0x00,0x00,0xff,0x05,0x05,0x05,0xff, 0x02,0x02,0x02,0xff,0x82,0x00,0x00,0x00,0xff,0x05,0x04,0x04,0x04,0xff,0x22, 0x22,0x22,0xff,0x5d,0x5d,0x5d,0xff,0xa0,0xa0,0xa1,0xff,0xdf,0xdf,0xe3,0xff, 0x82,0xde,0xde,0xe2,0xff,0x01,0xdd,0xdd,0xe1,0xff,0x82,0xdc,0xdc,0xe1,0xff, 0x82,0xdb,0xdb,0xe0,0xff,0x13,0xda,0xda,0xdf,0xff,0xd9,0xd9,0xdf,0xff,0xd9, 0xd9,0xde,0xff,0xd8,0xd8,0xdd,0xff,0xd7,0xd7,0xdd,0xff,0xd6,0xd6,0xdc,0xff, 0xd6,0xd6,0xdb,0xfc,0xd5,0xd5,0xdb,0xe9,0xd4,0xd4,0xda,0xd5,0xd4,0xd4,0xda, 0xc0,0xd3,0xd3,0xd9,0xab,0xd2,0xd2,0xd9,0x96,0xd1,0xd1,0xd8,0x81,0xd1,0xd1, 0xd8,0x6c,0xd0,0xd0,0xd7,0x57,0xcf,0xcf,0xd6,0x42,0xcf,0xcf,0xd6,0x2d,0xce, 0xce,0xd5,0x18,0xcd,0xcd,0xd5,0x04,0x84,0xff,0xff,0xff,0x00,0x82,0x00,0x00, 0x00,0x00,0x3e,0xff,0xff,0xff,0x2d,0xa3,0xc7,0xa3,0xd9,0x93,0xbe,0x93,0xff, 0x8f,0xbb,0x8f,0xff,0xb1,0xb1,0xb7,0xff,0x6e,0x6e,0x82,0xff,0x63,0x63,0x77, 0xff,0x58,0x58,0x6c,0xff,0x4d,0x4d,0x61,0xff,0x42,0x42,0x56,0xff,0x39,0x39, 0x4c,0xff,0x31,0x31,0x43,0xff,0x29,0x29,0x3a,0xff,0x21,0x21,0x30,0xff,0x0e, 0x0e,0x15,0xff,0x44,0x75,0x44,0xff,0x71,0xb8,0x71,0xff,0x74,0xc0,0x74,0xff, 0x83,0xbf,0x83,0xff,0x8a,0xbe,0x8a,0xff,0x6e,0xa5,0x6e,0xff,0x82,0xbc,0x82, 0xff,0x66,0xa3,0x66,0xff,0x7a,0xba,0x7a,0xff,0x77,0xb9,0x77,0xff,0x73,0xb8, 0x73,0xff,0x6f,0xb7,0x6f,0xff,0x6c,0xb5,0x6c,0xff,0x50,0x9b,0x50,0xff,0x64, 0xb0,0x64,0xff,0x48,0x96,0x48,0xff,0x21,0xa0,0x21,0xff,0x1b,0x9c,0x1b,0xff, 0x0f,0x6d,0x0f,0xff,0x72,0xa9,0x72,0xc1,0xff,0xff,0xff,0x94,0xff,0xff,0xff, 0x99,0xff,0xff,0xff,0x9d,0xff,0xff,0xff,0xa2,0xff,0xff,0xff,0xa6,0xff,0xff, 0xff,0xab,0xff,0xff,0xff,0xaf,0xff,0xff,0xff,0xb3,0xff,0xff,0xff,0xb8,0xff, 0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8, 0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff, 0xd8,0xff,0xff,0xff,0xdb,0xfd,0xfd,0xfd,0xe1,0xf8,0xf8,0xfa,0xe8,0xf4,0xf4, 0xf6,0xee,0xf0,0xf0,0xf4,0xf3,0xec,0xec,0xf1,0xf8,0xe9,0xe9,0xee,0xfb,0xe3, 0xe3,0xea,0xea,0xe4,0xe4,0xea,0xff,0xe3,0xe3,0xea,0xff,0x82,0xe4,0xe4,0xea, 0xff,0x82,0xe5,0xe5,0xeb,0xff,0x08,0xe6,0xe6,0xeb,0xff,0xe6,0xe6,0xec,0xff, 0xe7,0xe7,0xec,0xff,0x56,0x56,0x58,0xff,0x00,0x00,0x00,0xff,0x09,0x09,0x09, 0xff,0x40,0x40,0x40,0xff,0x78,0x78,0x78,0xff,0x82,0x7f,0x7f,0x7f,0xff,0x05, 0x78,0x78,0x78,0xff,0x40,0x40,0x40,0xff,0x07,0x07,0x07,0xff,0x6f,0x6f,0x6f, 0xff,0xbd,0xbd,0xbe,0xff,0x82,0xed,0xed,0xf0,0xff,0x02,0xee,0xee,0xf0,0xff, 0xee,0xee,0xf1,0xff,0x82,0xef,0xef,0xf1,0xff,0x82,0xf0,0xf0,0xf2,0xff,0x02, 0xf1,0xf1,0xf2,0xff,0xf1,0xf1,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x01,0xf3, 0xf3,0xf3,0xff,0x82,0xf3,0xf3,0xf4,0xff,0x05,0x5b,0x5b,0x5b,0xff,0x00,0x00, 0x00,0xff,0x01,0x0b,0x01,0xff,0x00,0x4d,0x00,0xff,0x00,0x90,0x00,0xff,0x82, 0x00,0x99,0x00,0xff,0x05,0x00,0x90,0x00,0xff,0x00,0x4d,0x00,0xff,0x07,0x07, 0x07,0xff,0x6f,0x6f,0x6f,0xff,0xc0,0xc0,0xc0,0xff,0x82,0xf4,0xf4,0xf4,0xff, 0x82,0xf3,0xf3,0xf4,0xff,0x83,0xf3,0xf3,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff, 0x01,0xf2,0xf2,0xf2,0xff,0x83,0xf1,0xf1,0xf2,0xff,0x07,0xf1,0xf1,0xf1,0xff, 0xf0,0xf0,0xf1,0xff,0x59,0x59,0x5a,0xff,0x00,0x00,0x00,0xff,0x0e,0x0e,0x01, 0xff,0x65,0x65,0x00,0xff,0xbd,0xbd,0x00,0xff,0x82,0xc9,0xc9,0x00,0xff,0x05, 0xbd,0xbd,0x00,0xff,0x65,0x65,0x00,0xff,0x07,0x07,0x07,0xff,0x6f,0x6f,0x6f, 0xff,0xbd,0xbd,0xbd,0xff,0x83,0xeb,0xeb,0xed,0xff,0x82,0xea,0xea,0xec,0xff, 0x82,0xe9,0xe9,0xeb,0xff,0x02,0xe8,0xe8,0xeb,0xff,0xe8,0xe8,0xea,0xff,0x82, 0xe7,0xe7,0xea,0xff,0x82,0xe6,0xe6,0xe9,0xff,0x82,0xe5,0xe5,0xe8,0xff,0x06, 0xe4,0xe4,0xe7,0xff,0x55,0x55,0x56,0xff,0x00,0x00,0x00,0xff,0x11,0x01,0x01, 0xff,0x80,0x00,0x00,0xff,0xf0,0x00,0x00,0xff,0x82,0xff,0x00,0x00,0xff,0x08, 0xf0,0x00,0x00,0xff,0x80,0x00,0x00,0xff,0x07,0x07,0x07,0xff,0x6f,0x6f,0x6f, 0xff,0xb6,0xb6,0xb8,0xff,0xdd,0xdd,0xe2,0xff,0xdd,0xdd,0xe1,0xff,0xdc,0xdc, 0xe1,0xff,0x82,0xdb,0xdb,0xe0,0xff,0x82,0xda,0xda,0xdf,0xff,0x13,0xd9,0xd9, 0xde,0xff,0xd8,0xd8,0xde,0xff,0xd8,0xd8,0xdd,0xff,0xd7,0xd7,0xdd,0xff,0xd6, 0xd6,0xdc,0xff,0xd5,0xd5,0xdb,0xff,0xd4,0xd4,0xda,0xfc,0xd4,0xd4,0xda,0xe9, 0xd3,0xd3,0xd9,0xd5,0xd2,0xd2,0xd9,0xc0,0xd2,0xd2,0xd8,0xab,0xd1,0xd1,0xd8, 0x96,0xd0,0xd0,0xd7,0x81,0xd0,0xd0,0xd7,0x6c,0xcf,0xcf,0xd6,0x57,0xce,0xce, 0xd5,0x42,0xcd,0xcd,0xd5,0x2d,0xcd,0xcd,0xd4,0x18,0xcc,0xcc,0xd4,0x04,0x84, 0xff,0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00,0x3c,0xff,0xff,0xff,0x46,0x96, 0xbf,0x96,0xff,0x92,0xbd,0x92,0xff,0x92,0xbb,0x92,0xff,0x99,0xb6,0x99,0xff, 0xa5,0xbd,0xa5,0xff,0x93,0xac,0x93,0xff,0xa1,0xbb,0xa1,0xff,0x9f,0xb9,0x9f, 0xff,0x9d,0xb8,0x9d,0xff,0x9b,0xb7,0x9b,0xff,0x89,0xa5,0x89,0xff,0x96,0xb4, 0x96,0xff,0x94,0xb3,0x94,0xff,0x64,0x8c,0x64,0xff,0x55,0x91,0x55,0xff,0x70, 0xb7,0x70,0xff,0x73,0xc0,0x73,0xff,0x7e,0xb9,0x7e,0xff,0x89,0xbe,0x89,0xff, 0x6c,0xa5,0x6c,0xff,0x81,0xbc,0x81,0xff,0x65,0xa3,0x65,0xff,0x79,0xba,0x79, 0xff,0x76,0xb9,0x76,0xff,0x72,0xb8,0x72,0xff,0x6e,0xb7,0x6e,0xff,0x6a,0xb5, 0x6a,0xff,0x4f,0x9a,0x4f,0xff,0x63,0xb0,0x63,0xff,0x47,0x96,0x47,0xff,0x2e, 0xa5,0x2e,0xff,0x1a,0x9b,0x1a,0xff,0x10,0x78,0x10,0xff,0x48,0x90,0x48,0xd5, 0xff,0xff,0xff,0x94,0xff,0xff,0xff,0x99,0xff,0xff,0xff,0x9d,0xff,0xff,0xff, 0xa2,0xff,0xff,0xff,0xa6,0xff,0xff,0xff,0xab,0xff,0xff,0xff,0xaf,0xff,0xff, 0xff,0xb3,0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff, 0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0, 0xff,0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb,0xfd,0xfd,0xfd, 0xe1,0xf8,0xf8,0xfa,0xe8,0xf4,0xf4,0xf7,0xee,0xf0,0xf0,0xf4,0xf3,0xed,0xed, 0xf1,0xf8,0xe9,0xe9,0xef,0xfb,0xe4,0xe4,0xea,0xeb,0x82,0xe4,0xe4,0xea,0xff, 0x82,0xe5,0xe5,0xeb,0xff,0x02,0xe6,0xe6,0xeb,0xff,0xe6,0xe6,0xec,0xff,0x82, 0xe7,0xe7,0xec,0xff,0x0f,0xae,0xae,0xb1,0xff,0x00,0x00,0x00,0xff,0x09,0x09, 0x09,0xff,0x68,0x68,0x68,0xff,0x7f,0x7f,0x7f,0xff,0xb2,0xbe,0xaf,0xff,0xc8, 0xda,0xc5,0xff,0xbd,0xcc,0xba,0xff,0xaa,0xb4,0xa8,0xff,0x95,0x9a,0x94,0xff, 0x68,0x68,0x68,0xff,0x09,0x09,0x09,0xff,0x93,0x93,0x93,0xff,0xe0,0xe0,0xe2, 0xff,0xee,0xee,0xf1,0xff,0x82,0xef,0xef,0xf1,0xff,0x82,0xf0,0xf0,0xf2,0xff, 0x82,0xf1,0xf1,0xf2,0xff,0x01,0xf1,0xf1,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff, 0x82,0xf3,0xf3,0xf4,0xff,0x10,0xf4,0xf4,0xf4,0xff,0xb7,0xb7,0xb8,0xff,0x00, 0x00,0x00,0xff,0x01,0x0b,0x01,0xff,0x00,0x7d,0x00,0xff,0x00,0x99,0x00,0xff, 0x71,0xcb,0x6f,0xff,0xa4,0xe2,0xa0,0xff,0x8b,0xd7,0x88,0xff,0x60,0xc4,0x5e, 0xff,0x31,0xaf,0x30,0xff,0x00,0x7d,0x00,0xff,0x09,0x09,0x09,0xff,0x93,0x93, 0x93,0xff,0xe5,0xe5,0xe5,0xff,0xf3,0xf3,0xf4,0xff,0x83,0xf3,0xf3,0xf3,0xff, 0x82,0xf2,0xf2,0xf3,0xff,0x82,0xf2,0xf2,0xf2,0xff,0x82,0xf1,0xf1,0xf2,0xff, 0x01,0xf1,0xf1,0xf1,0xff,0x82,0xf0,0xf0,0xf1,0xff,0x0e,0xb4,0xb4,0xb5,0xff, 0x00,0x00,0x00,0xff,0x0e,0x0e,0x01,0xff,0xa4,0xa4,0x00,0xff,0xc9,0xc9,0x00, 0xff,0xd7,0xe4,0x6f,0xff,0xde,0xef,0xa0,0xff,0xdb,0xea,0x88,0xff,0xd5,0xe0, 0x5e,0xff,0xcf,0xd4,0x30,0xff,0xa4,0xa4,0x00,0xff,0x09,0x09,0x09,0xff,0x93, 0x93,0x93,0xff,0xde,0xde,0xdf,0xff,0x82,0xea,0xea,0xec,0xff,0x03,0xe9,0xe9, 0xec,0xff,0xe9,0xe9,0xeb,0xff,0xe8,0xe8,0xeb,0xff,0x82,0xe8,0xe8,0xea,0xff, 0x04,0xe7,0xe7,0xea,0xff,0xe7,0xe7,0xe9,0xff,0xe6,0xe6,0xe9,0xff,0xe6,0xe6, 0xe8,0xff,0x82,0xe5,0xe5,0xe8,0xff,0x11,0xe4,0xe4,0xe7,0xff,0xaa,0xaa,0xad, 0xff,0x00,0x00,0x00,0xff,0x11,0x01,0x01,0xff,0xd0,0x00,0x00,0xff,0xff,0x00, 0x00,0xff,0xff,0x99,0x99,0xff,0xff,0xce,0xce,0xff,0xff,0xb5,0xb5,0xff,0xff, 0x84,0x84,0xff,0xff,0x47,0x47,0xff,0xd0,0x00,0x00,0xff,0x09,0x09,0x09,0xff, 0x93,0x93,0x93,0xff,0xd3,0xd3,0xd6,0xff,0xdc,0xdc,0xe0,0xff,0xdb,0xdb,0xe0, 0xff,0x82,0xda,0xda,0xdf,0xff,0x15,0xd9,0xd9,0xde,0xff,0xd8,0xd8,0xde,0xff, 0xd8,0xd8,0xdd,0xff,0xd7,0xd7,0xdd,0xff,0xd7,0xd7,0xdc,0xff,0xd6,0xd6,0xdc, 0xff,0xd5,0xd5,0xdb,0xff,0xd4,0xd4,0xda,0xff,0xd3,0xd3,0xda,0xfc,0xd3,0xd3, 0xd9,0xe9,0xd2,0xd2,0xd8,0xd5,0xd1,0xd1,0xd8,0xc0,0xd0,0xd0,0xd7,0xab,0xd0, 0xd0,0xd7,0x96,0xcf,0xcf,0xd6,0x81,0xce,0xce,0xd6,0x6c,0xce,0xce,0xd5,0x57, 0xcd,0xcd,0xd4,0x42,0xcc,0xcc,0xd4,0x2d,0xcb,0xcb,0xd3,0x18,0xcb,0xcb,0xd3, 0x04,0x84,0xff,0xff,0xff,0x00,0x3e,0xe7,0xe7,0xec,0xbf,0xe9,0xe9,0xee,0xbf, 0xe8,0xea,0xeb,0xe2,0x85,0x90,0x8a,0xff,0xbe,0xc9,0xc0,0xff,0xd8,0xe3,0xda, 0xff,0xce,0xd0,0xd0,0xff,0xe6,0xe6,0xe8,0xff,0xd6,0xd6,0xd8,0xff,0xe7,0xe7, 0xe9,0xff,0xe8,0xe8,0xe9,0xff,0xe8,0xe8,0xea,0xff,0xe9,0xe9,0xeb,0xff,0xda, 0xda,0xdb,0xff,0xea,0xea,0xeb,0xff,0xeb,0xeb,0xec,0xff,0xd7,0xdf,0xd8,0xff, 0xd3,0xe3,0xd4,0xff,0xd9,0xeb,0xda,0xff,0xda,0xee,0xdb,0xff,0xe0,0xec,0xe0, 0xff,0xe4,0xef,0xe4,0xff,0xdb,0xe7,0xdb,0xff,0xe2,0xee,0xe2,0xff,0xd9,0xe6, 0xd9,0xff,0xe0,0xed,0xe0,0xff,0xdf,0xec,0xdf,0xff,0xdd,0xeb,0xde,0xff,0xdc, 0xea,0xdc,0xff,0xda,0xe9,0xdb,0xff,0xd1,0xe0,0xd2,0xff,0xd7,0xe7,0xd8,0xff, 0xce,0xdd,0xcf,0xff,0xc7,0xe3,0xc8,0xff,0xbd,0xde,0xbf,0xff,0xba,0xd4,0xbc, 0xff,0xc5,0xd7,0xc8,0xf8,0xf2,0xf2,0xf5,0xe4,0xf1,0xf1,0xf4,0xe5,0xf0,0xf0, 0xf3,0xe6,0xf0,0xf0,0xf3,0xe2,0xf0,0xf0,0xf4,0xc8,0xfa,0xfa,0xfb,0xb0,0xff, 0xff,0xff,0xaf,0xff,0xff,0xff,0xb3,0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc, 0xff,0xff,0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff, 0xcc,0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff, 0xff,0xdb,0xfd,0xfd,0xfd,0xe1,0xf8,0xf8,0xfa,0xe8,0xf5,0xf5,0xf7,0xee,0xf1, 0xf1,0xf4,0xf3,0xee,0xee,0xf1,0xf8,0xea,0xea,0xef,0xfb,0xe5,0xe5,0xeb,0xeb, 0x82,0xe5,0xe5,0xeb,0xff,0x82,0xe6,0xe6,0xeb,0xff,0x83,0xe7,0xe7,0xec,0xff, 0x06,0xe8,0xe8,0xed,0xff,0x48,0x48,0x49,0xff,0x05,0x05,0x05,0xff,0x40,0x40, 0x40,0xff,0x7f,0x7f,0x7f,0xff,0xb9,0xc7,0xb6,0xff,0x82,0xe6,0xff,0xe1,0xff, 0x07,0xd8,0xee,0xd4,0xff,0xc2,0xd3,0xbf,0xff,0xac,0xb7,0xaa,0xff,0x96,0x9b, 0x95,0xff,0x40,0x40,0x40,0xff,0x44,0x44,0x44,0xff,0xd3,0xd3,0xd4,0xff,0x82, 0xef,0xef,0xf1,0xff,0x82,0xf0,0xf0,0xf2,0xff,0x02,0xf1,0xf1,0xf2,0xff,0xf1, 0xf1,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x82,0xf3,0xf3,0xf4,0xff,0x82,0xf4, 0xf4,0xf4,0xff,0x06,0xf5,0xf5,0xf5,0xff,0x4c,0x4c,0x4c,0xff,0x05,0x05,0x05, 0xff,0x00,0x4d,0x00,0xff,0x00,0x99,0x00,0xff,0x82,0xd3,0x7f,0xff,0x82,0xe6, 0xff,0xe1,0xff,0x07,0xc7,0xf1,0xc3,0xff,0x96,0xdc,0x93,0xff,0x64,0xc6,0x62, 0xff,0x32,0xaf,0x31,0xff,0x00,0x4d,0x00,0xff,0x44,0x44,0x44,0xff,0xd5,0xd5, 0xd5,0xff,0x82,0xf3,0xf3,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x82,0xf2,0xf2, 0xf2,0xff,0x83,0xf1,0xf1,0xf2,0xff,0x83,0xf0,0xf0,0xf1,0xff,0x06,0xef,0xef, 0xf0,0xff,0x4a,0x4a,0x4a,0xff,0x05,0x05,0x05,0xff,0x65,0x65,0x00,0xff,0xc9, 0xc9,0x00,0xff,0xd9,0xe7,0x7f,0xff,0x82,0xe6,0xff,0xe1,0xff,0x08,0xe2,0xf8, 0xc3,0xff,0xdc,0xec,0x93,0xff,0xd6,0xe1,0x62,0xff,0xcf,0xd5,0x31,0xff,0x65, 0x65,0x00,0xff,0x44,0x44,0x44,0xff,0xd2,0xd2,0xd2,0xff,0xe9,0xe9,0xec,0xff, 0x82,0xe9,0xe9,0xeb,0xff,0x04,0xe8,0xe8,0xeb,0xff,0xe8,0xe8,0xea,0xff,0xe7, 0xe7,0xea,0xff,0xe7,0xe7,0xe9,0xff,0x82,0xe6,0xe6,0xe9,0xff,0x82,0xe5,0xe5, 0xe8,0xff,0x82,0xe4,0xe4,0xe7,0xff,0x06,0xe3,0xe3,0xe6,0xff,0x46,0x46,0x47, 0xff,0x05,0x05,0x05,0xff,0x80,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0xab, 0xab,0xff,0x82,0xff,0xff,0xff,0xff,0x07,0xff,0xeb,0xeb,0xff,0xff,0xc1,0xc1, 0xff,0xff,0x89,0x89,0xff,0xff,0x49,0x49,0xff,0x80,0x00,0x00,0xff,0x44,0x44, 0x44,0xff,0xcd,0xcd,0xcf,0xff,0x82,0xda,0xda,0xdf,0xff,0x82,0xd9,0xd9,0xde, 0xff,0x04,0xd8,0xd8,0xdd,0xff,0xd7,0xd7,0xdd,0xff,0xd7,0xd7,0xdc,0xff,0xd6, 0xd6,0xdc,0xff,0x82,0xd5,0xd5,0xdb,0xff,0x0f,0xd4,0xd4,0xda,0xff,0xd3,0xd3, 0xd9,0xff,0xd2,0xd2,0xd9,0xfc,0xd1,0xd1,0xd8,0xe9,0xd1,0xd1,0xd7,0xd5,0xd0, 0xd0,0xd7,0xc0,0xcf,0xcf,0xd6,0xab,0xcf,0xcf,0xd6,0x96,0xce,0xce,0xd5,0x81, 0xcd,0xcd,0xd5,0x6c,0xcc,0xcc,0xd4,0x57,0xcc,0xcc,0xd3,0x42,0xcb,0xcb,0xd3, 0x2d,0xca,0xca,0xd2,0x18,0xca,0xca,0xd2,0x04,0x84,0xff,0xff,0xff,0x00,0x3e, 0xeb,0xeb,0xef,0xff,0xc3,0xc3,0xd1,0xff,0xcb,0xcb,0xd7,0xff,0x85,0x85,0x8a, 0xff,0xab,0xab,0xb5,0xff,0xb8,0xb8,0xc3,0xff,0xd3,0xd3,0xde,0xff,0xd9,0xd9, 0xe3,0xff,0xdb,0xdb,0xe4,0xff,0xdd,0xdd,0xe5,0xff,0xdf,0xdf,0xe7,0xff,0xe1, 0xe1,0xe8,0xff,0xe3,0xe3,0xe9,0xff,0xe5,0xe5,0xea,0xff,0xe7,0xe7,0xec,0xff, 0xe9,0xe9,0xed,0xff,0xeb,0xeb,0xee,0xff,0xed,0xed,0xf0,0xff,0xef,0xef,0xf1, 0xff,0xf1,0xf1,0xf2,0xff,0xf3,0xf3,0xf3,0xff,0xf4,0xf4,0xf5,0xff,0xf5,0xf5, 0xf5,0xff,0xf4,0xf4,0xf4,0xff,0xf3,0xf3,0xf4,0xff,0xf3,0xf3,0xf3,0xff,0xf1, 0xf1,0xf2,0xff,0xf0,0xf0,0xf1,0xff,0xef,0xef,0xf0,0xff,0xed,0xed,0xee,0xff, 0xeb,0xeb,0xed,0xff,0xe9,0xe9,0xec,0xff,0xe7,0xe7,0xea,0xff,0xe5,0xe5,0xe8, 0xff,0xe3,0xe3,0xe6,0xff,0xe1,0xe1,0xe5,0xff,0xde,0xde,0xe3,0xff,0xdc,0xdc, 0xe1,0xff,0xd9,0xd9,0xdf,0xff,0xd7,0xd7,0xdc,0xff,0xd6,0xd6,0xdd,0xff,0xe0, 0xe0,0xe6,0xff,0xe5,0xe5,0xeb,0xff,0xe1,0xe1,0xe7,0xe6,0xe2,0xe2,0xe9,0xd0, 0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff,0xff, 0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff, 0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb,0xfd,0xfd,0xfd,0xe1,0xf9, 0xf9,0xfa,0xe8,0xf5,0xf5,0xf7,0xee,0xf1,0xf1,0xf4,0xf3,0xee,0xee,0xf2,0xf8, 0xeb,0xeb,0xef,0xfb,0xe5,0xe5,0xeb,0xeb,0x82,0xe6,0xe6,0xeb,0xff,0x01,0xe6, 0xe6,0xec,0xff,0x82,0xe7,0xe7,0xec,0xff,0x82,0xe8,0xe8,0xed,0xff,0x0f,0xe9, 0xe9,0xed,0xff,0x0e,0x0e,0x0e,0xff,0x02,0x02,0x02,0xff,0x78,0x78,0x78,0xff, 0x9d,0xa4,0x9b,0xff,0xc8,0xda,0xc5,0xff,0xe2,0xfa,0xdd,0xff,0xe4,0xfd,0xdf, 0xff,0xd9,0xef,0xd5,0xff,0xc8,0xda,0xc5,0xff,0xb5,0xc2,0xb2,0xff,0xa1,0xa9, 0x9f,0xff,0x84,0x87,0x83,0xff,0x0c,0x0c,0x0c,0xff,0xd6,0xd6,0xd6,0xff,0x82, 0xf0,0xf0,0xf2,0xff,0x02,0xf1,0xf1,0xf2,0xff,0xf1,0xf1,0xf3,0xff,0x82,0xf2, 0xf2,0xf3,0xff,0x02,0xf3,0xf3,0xf3,0xff,0xf3,0xf3,0xf4,0xff,0x82,0xf4,0xf4, 0xf4,0xff,0x83,0xf5,0xf5,0xf5,0xff,0x0f,0x0e,0x0e,0x0e,0xff,0x02,0x02,0x02, 0xff,0x00,0x90,0x00,0xff,0x42,0xb6,0x41,0xff,0xa4,0xe2,0xa0,0xff,0xdd,0xfb, 0xd8,0xff,0xe2,0xfd,0xdd,0xff,0xc9,0xf2,0xc5,0xff,0xa4,0xe2,0xa0,0xff,0x79, 0xcf,0x76,0xff,0x4b,0xba,0x49,0xff,0x1a,0x9b,0x19,0xff,0x0c,0x0c,0x0c,0xff, 0xd6,0xd6,0xd6,0xff,0xf3,0xf3,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x01,0xf2, 0xf2,0xf2,0xff,0x83,0xf1,0xf1,0xf2,0xff,0x01,0xf1,0xf1,0xf1,0xff,0x83,0xf0, 0xf0,0xf1,0xff,0x82,0xef,0xef,0xf0,0xff,0x13,0x0e,0x0e,0x0e,0xff,0x02,0x02, 0x02,0xff,0xbd,0xbd,0x00,0xff,0xd1,0xd9,0x41,0xff,0xde,0xef,0xa0,0xff,0xe5, 0xfd,0xd8,0xff,0xe5,0xfe,0xdd,0xff,0xe2,0xf8,0xc5,0xff,0xde,0xef,0xa0,0xff, 0xd8,0xe5,0x76,0xff,0xd2,0xdb,0x49,0xff,0xc1,0xc4,0x19,0xff,0x0c,0x0c,0x0c, 0xff,0xd6,0xd6,0xd6,0xff,0xe9,0xe9,0xeb,0xff,0xe8,0xe8,0xeb,0xff,0xe8,0xe8, 0xea,0xff,0xe7,0xe7,0xea,0xff,0xe7,0xe7,0xe9,0xff,0x82,0xe6,0xe6,0xe9,0xff, 0x82,0xe5,0xe5,0xe8,0xff,0x82,0xe4,0xe4,0xe7,0xff,0x19,0xe3,0xe3,0xe7,0xff, 0xe3,0xe3,0xe6,0xff,0xe2,0xe2,0xe6,0xff,0x0e,0x0e,0x0e,0xff,0x02,0x02,0x02, 0xff,0xf0,0x00,0x00,0xff,0xff,0x5e,0x5e,0xff,0xff,0xcd,0xcd,0xff,0xff,0xf8, 0xf8,0xff,0xff,0xfb,0xfb,0xff,0xff,0xec,0xec,0xff,0xff,0xcd,0xcd,0xff,0xff, 0xa1,0xa1,0xff,0xff,0x6a,0x6a,0xff,0xf0,0x27,0x27,0xff,0x0c,0x0c,0x0c,0xff, 0xd6,0xd6,0xd6,0xff,0xd9,0xd9,0xdf,0xff,0xd9,0xd9,0xde,0xff,0xd8,0xd8,0xde, 0xff,0xd8,0xd8,0xdd,0xff,0xd7,0xd7,0xdc,0xff,0xd6,0xd6,0xdc,0xff,0xd6,0xd6, 0xdb,0xff,0xd5,0xd5,0xdb,0xff,0x82,0xd4,0xd4,0xda,0xff,0x0f,0xd3,0xd3,0xd9, 0xff,0xd2,0xd2,0xd8,0xff,0xd1,0xd1,0xd8,0xfc,0xd0,0xd0,0xd7,0xe9,0xcf,0xcf, 0xd6,0xd5,0xcf,0xcf,0xd6,0xc0,0xce,0xce,0xd5,0xab,0xcd,0xcd,0xd5,0x96,0xcd, 0xcd,0xd4,0x81,0xcc,0xcc,0xd4,0x6c,0xcb,0xcb,0xd3,0x57,0xca,0xca,0xd2,0x42, 0xca,0xca,0xd2,0x2d,0xc9,0xc9,0xd1,0x18,0xc8,0xc8,0xd1,0x04,0x84,0xff,0xff, 0xff,0x00,0x14,0xef,0xef,0xf3,0xff,0xc8,0xc8,0xd5,0xff,0xd2,0xd2,0xdc,0xff, 0x8c,0x8c,0x8f,0xff,0xad,0xad,0xb7,0xff,0xb5,0xb5,0xbe,0xff,0xbf,0xbf,0xc7, 0xff,0xd4,0xd4,0xdd,0xff,0x80,0x80,0x85,0xff,0x60,0x60,0x62,0xff,0x66,0x66, 0x68,0xff,0x88,0x88,0x8b,0xff,0x96,0x96,0x99,0xff,0x97,0x97,0x9a,0xff,0x98, 0x98,0x9b,0xff,0xec,0xec,0xef,0xff,0x89,0x89,0x8b,0xff,0x65,0x65,0x65,0xff, 0x6b,0x6b,0x6b,0xff,0x91,0x91,0x91,0xff,0x83,0x9f,0x9f,0x9f,0xff,0x27,0xf3, 0xf3,0xf3,0xff,0x8c,0x8c,0x8c,0xff,0x65,0x65,0x65,0xff,0x6a,0x6a,0x6a,0xff, 0x8d,0x8d,0x8e,0xff,0x99,0x99,0x9b,0xff,0x98,0x98,0x9a,0xff,0x97,0x97,0x99, 0xff,0xe6,0xe6,0xe9,0xff,0x84,0x84,0x86,0xff,0x61,0x61,0x62,0xff,0x65,0x65, 0x66,0xff,0x84,0x84,0x87,0xff,0x8e,0x8e,0x91,0xff,0x8c,0x8c,0x90,0xff,0x8a, 0x8a,0x8e,0xff,0xd2,0xd2,0xd8,0xff,0xcf,0xcf,0xd6,0xff,0xcc,0xcc,0xd3,0xff, 0xca,0xca,0xd2,0xff,0xd6,0xd6,0xdd,0xff,0xc2,0xc2,0xd0,0xff,0xff,0xff,0xff, 0xb8,0xff,0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff, 0xff,0xc8,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff, 0xff,0xff,0xd8,0xff,0xff,0xff,0xdb,0xfd,0xfd,0xfd,0xe1,0xf9,0xf9,0xfa,0xe8, 0xf5,0xf5,0xf7,0xee,0xf2,0xf2,0xf5,0xf3,0xee,0xee,0xf2,0xf8,0xeb,0xeb,0xef, 0xfb,0xe6,0xe6,0xec,0xec,0x83,0xe7,0xe7,0xec,0xff,0x82,0xe8,0xe8,0xed,0xff, 0x82,0xe9,0xe9,0xed,0xff,0x11,0xea,0xea,0xee,0xff,0x1d,0x1d,0x1d,0xff,0x00, 0x00,0x00,0xff,0x7f,0x7f,0x7f,0xff,0xa4,0xad,0xa2,0xff,0xc2,0xd3,0xbf,0xff, 0xd3,0xe8,0xcf,0xff,0xd7,0xec,0xd2,0xff,0xd1,0xe4,0xcd,0xff,0xc5,0xd6,0xc1, 0xff,0xb5,0xc2,0xb3,0xff,0xa4,0xad,0xa2,0xff,0x91,0x95,0x90,0xff,0x00,0x00, 0x00,0xff,0xe5,0xe5,0xe5,0xff,0xf1,0xf1,0xf2,0xff,0xf1,0xf1,0xf3,0xff,0x82, 0xf2,0xf2,0xf3,0xff,0x01,0xf3,0xf3,0xf3,0xff,0x82,0xf3,0xf3,0xf4,0xff,0x02, 0xf4,0xf4,0xf4,0xff,0xf4,0xf4,0xf5,0xff,0x84,0xf5,0xf5,0xf5,0xff,0x10,0x1d, 0x1d,0x1d,0xff,0x00,0x00,0x00,0xff,0x00,0x99,0x00,0xff,0x52,0xbd,0x50,0xff, 0x96,0xdc,0x93,0xff,0xbc,0xec,0xb8,0xff,0xc4,0xf0,0xc0,0xff,0xb6,0xea,0xb2, 0xff,0x9b,0xde,0x98,0xff,0x79,0xcf,0x76,0xff,0x52,0xbd,0x50,0xff,0x28,0xab, 0x27,0xff,0x00,0x00,0x00,0xff,0xe5,0xe5,0xe5,0xff,0xf2,0xf2,0xf3,0xff,0xf2, 0xf2,0xf2,0xff,0x83,0xf1,0xf1,0xf2,0xff,0x01,0xf1,0xf1,0xf1,0xff,0x83,0xf0, 0xf0,0xf1,0xff,0x83,0xef,0xef,0xf0,0xff,0x10,0xee,0xee,0xef,0xff,0x1d,0x1d, 0x1d,0xff,0x00,0x00,0x00,0xff,0xc9,0xc9,0x00,0xff,0xd3,0xdc,0x50,0xff,0xdc, 0xec,0x93,0xff,0xe1,0xf5,0xb8,0xff,0xe2,0xf7,0xc0,0xff,0xe0,0xf4,0xb2,0xff, 0xdd,0xed,0x98,0xff,0xd8,0xe5,0x76,0xff,0xd3,0xdc,0x50,0xff,0xce,0xd2,0x27, 0xff,0x00,0x00,0x00,0xff,0xe5,0xe5,0xe5,0xff,0xe8,0xe8,0xea,0xff,0x82,0xe7, 0xe7,0xea,0xff,0x82,0xe6,0xe6,0xe9,0xff,0x82,0xe5,0xe5,0xe8,0xff,0x18,0xe4, 0xe4,0xe8,0xff,0xe4,0xe4,0xe7,0xff,0xe3,0xe3,0xe7,0xff,0xe3,0xe3,0xe6,0xff, 0xe2,0xe2,0xe6,0xff,0xe2,0xe2,0xe5,0xff,0xe1,0xe1,0xe5,0xff,0x1d,0x1d,0x1d, 0xff,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x72,0x72,0xff,0xff,0xc1, 0xc1,0xff,0xff,0xe3,0xe3,0xff,0xff,0xe9,0xe9,0xff,0xff,0xde,0xde,0xff,0xff, 0xc6,0xc6,0xff,0xff,0xa1,0xa1,0xff,0xff,0x72,0x72,0xff,0xff,0x3a,0x3a,0xff, 0x00,0x00,0x00,0xff,0xe5,0xe5,0xe5,0xff,0xd8,0xd8,0xde,0xff,0xd8,0xd8,0xdd, 0xff,0xd7,0xd7,0xdd,0xff,0x82,0xd6,0xd6,0xdc,0xff,0x01,0xd5,0xd5,0xdb,0xff, 0x82,0xd4,0xd4,0xda,0xff,0x11,0xd3,0xd3,0xd9,0xff,0xd2,0xd2,0xd9,0xff,0xd2, 0xd2,0xd8,0xff,0xd0,0xd0,0xd7,0xff,0xd0,0xd0,0xd7,0xfc,0xcf,0xcf,0xd6,0xe9, 0xce,0xce,0xd5,0xd5,0xce,0xce,0xd5,0xc0,0xcd,0xcd,0xd4,0xab,0xcc,0xcc,0xd4, 0x96,0xcb,0xcb,0xd3,0x81,0xcb,0xcb,0xd3,0x6c,0xca,0xca,0xd2,0x57,0xc9,0xc9, 0xd1,0x42,0xc8,0xc8,0xd1,0x2d,0xc8,0xc8,0xd0,0x18,0xc7,0xc7,0xd0,0x04,0x84, 0xff,0xff,0xff,0x00,0x3e,0xf3,0xf3,0xf6,0xff,0xd9,0xd9,0xe1,0xff,0xe2,0xe2, 0xe9,0xff,0x92,0x92,0x94,0xff,0xb0,0xb0,0xb8,0xff,0xb8,0xb8,0xc0,0xff,0xc0, 0xc0,0xc8,0xff,0xc8,0xc8,0xcf,0xff,0x5d,0x5d,0x5f,0xff,0xae,0xae,0xb0,0xff, 0xbe,0xbe,0xc0,0xff,0x75,0x75,0x77,0xff,0xac,0xac,0xaf,0xff,0xae,0xae,0xb1, 0xff,0xaf,0xaf,0xb1,0xff,0xef,0xef,0xf1,0xff,0x65,0x65,0x65,0xff,0xb3,0xb3, 0xb3,0xff,0xc2,0xc2,0xc3,0xff,0x79,0x79,0x79,0xff,0xb4,0xb4,0xb4,0xff,0xb3, 0xb3,0xb4,0xff,0xb3,0xb3,0xb3,0xff,0xf1,0xf1,0xf2,0xff,0x64,0x64,0x65,0xff, 0xb1,0xb1,0xb1,0xff,0xc0,0xc0,0xc0,0xff,0x76,0x76,0x77,0xff,0xab,0xab,0xad, 0xff,0xaa,0xaa,0xac,0xff,0xa8,0xa8,0xab,0xff,0xe2,0xe2,0xe6,0xff,0x60,0x60, 0x61,0xff,0xac,0xac,0xad,0xff,0xbb,0xbb,0xbc,0xff,0x71,0x71,0x72,0xff,0x9d, 0x9d,0xa2,0xff,0x9b,0x9b,0xa0,0xff,0x99,0x99,0x9e,0xff,0xcc,0xcc,0xd4,0xff, 0xc9,0xc9,0xd1,0xff,0xc6,0xc6,0xcf,0xff,0xc3,0xc3,0xcc,0xff,0xbf,0xbf,0xc9, 0xff,0x94,0x94,0x9e,0xff,0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff, 0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff, 0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb, 0xfd,0xfd,0xfd,0xe1,0xf9,0xf9,0xfa,0xe8,0xf5,0xf5,0xf8,0xee,0xf2,0xf2,0xf5, 0xf3,0xef,0xef,0xf3,0xf8,0xec,0xec,0xf0,0xfb,0xe7,0xe7,0xec,0xec,0x82,0xe8, 0xe8,0xec,0xff,0x82,0xe8,0xe8,0xed,0xff,0x02,0xe9,0xe9,0xed,0xff,0xe9,0xe9, 0xee,0xff,0x82,0xea,0xea,0xee,0xff,0x0f,0x2d,0x2d,0x2d,0xff,0x00,0x00,0x00, 0xff,0x7f,0x7f,0x7f,0xff,0xa0,0xa8,0x9e,0xff,0xb7,0xc5,0xb4,0xff,0xc4,0xd5, 0xc1,0xff,0xc8,0xda,0xc5,0xff,0xc5,0xd6,0xc2,0xff,0xbc,0xcb,0xb9,0xff,0xb0, 0xbc,0xae,0xff,0xa1,0xaa,0xa0,0xff,0x91,0x95,0x90,0xff,0x00,0x00,0x00,0xff, 0xf5,0xf5,0xf5,0xff,0xf1,0xf1,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x82,0xf3, 0xf3,0xf4,0xff,0x02,0xf4,0xf4,0xf4,0xff,0xf4,0xf4,0xf5,0xff,0x86,0xf5,0xf5, 0xf5,0xff,0x0f,0x2d,0x2d,0x2d,0xff,0x00,0x00,0x00,0xff,0x00,0x99,0x00,0xff, 0x49,0xb9,0x47,0xff,0x7d,0xd0,0x7a,0xff,0x9b,0xde,0x97,0xff,0xa4,0xe2,0xa0, 0xff,0x9c,0xde,0x99,0xff,0x89,0xd6,0x86,0xff,0x6e,0xca,0x6b,0xff,0x4d,0xbb, 0x4b,0xff,0x28,0xab,0x27,0xff,0x00,0x00,0x00,0xff,0xf5,0xf5,0xf5,0xff,0xf2, 0xf2,0xf2,0xff,0x82,0xf1,0xf1,0xf2,0xff,0x01,0xf1,0xf1,0xf1,0xff,0x83,0xf0, 0xf0,0xf1,0xff,0x83,0xef,0xef,0xf0,0xff,0x01,0xee,0xee,0xf0,0xff,0x82,0xee, 0xee,0xef,0xff,0x12,0x2d,0x2d,0x2d,0xff,0x00,0x00,0x00,0xff,0xc9,0xc9,0x00, 0xff,0xd2,0xda,0x47,0xff,0xd9,0xe6,0x7a,0xff,0xdc,0xed,0x97,0xff,0xde,0xef, 0xa0,0xff,0xdd,0xee,0x99,0xff,0xda,0xe9,0x86,0xff,0xd7,0xe3,0x6b,0xff,0xd3, 0xdb,0x4b,0xff,0xce,0xd2,0x27,0xff,0x00,0x00,0x00,0xff,0xf5,0xf5,0xf5,0xff, 0xe7,0xe7,0xea,0xff,0xe7,0xe7,0xe9,0xff,0xe6,0xe6,0xe9,0xff,0xe6,0xe6,0xe8, 0xff,0x82,0xe5,0xe5,0xe8,0xff,0x82,0xe4,0xe4,0xe7,0xff,0x03,0xe3,0xe3,0xe6, 0xff,0xe2,0xe2,0xe6,0xff,0xe2,0xe2,0xe5,0xff,0x82,0xe1,0xe1,0xe5,0xff,0x12, 0xe0,0xe0,0xe4,0xff,0x2d,0x2d,0x2d,0xff,0x00,0x00,0x00,0xff,0xff,0x00,0x00, 0xff,0xff,0x67,0x67,0xff,0xff,0xa6,0xa6,0xff,0xff,0xc5,0xc5,0xff,0xff,0xcd, 0xcd,0xff,0xff,0xc6,0xc6,0xff,0xff,0xb3,0xb3,0xff,0xff,0x94,0x94,0xff,0xff, 0x6c,0x6c,0xff,0xff,0x3a,0x3a,0xff,0x00,0x00,0x00,0xff,0xf5,0xf5,0xf5,0xff, 0xd7,0xd7,0xdd,0xff,0xd7,0xd7,0xdc,0xff,0xd6,0xd6,0xdc,0xff,0x82,0xd5,0xd5, 0xdb,0xff,0x14,0xd4,0xd4,0xda,0xff,0xd3,0xd3,0xda,0xff,0xd3,0xd3,0xd9,0xff, 0xd2,0xd2,0xd8,0xff,0xd1,0xd1,0xd8,0xff,0xd0,0xd0,0xd7,0xff,0xcf,0xcf,0xd6, 0xff,0xce,0xce,0xd6,0xfc,0xce,0xce,0xd5,0xe9,0xcd,0xcd,0xd4,0xd5,0xcc,0xcc, 0xd4,0xc0,0xcc,0xcc,0xd3,0xab,0xcb,0xcb,0xd3,0x96,0xca,0xca,0xd2,0x81,0xc9, 0xc9,0xd1,0x6c,0xc9,0xc9,0xd1,0x57,0xc8,0xc8,0xd0,0x42,0xc7,0xc7,0xd0,0x2d, 0xc6,0xc6,0xcf,0x18,0xc6,0xc6,0xcf,0x04,0x84,0xff,0xff,0xff,0x00,0x3e,0xf7, 0xf7,0xf9,0xff,0xea,0xea,0xee,0xff,0xf3,0xf3,0xf6,0xff,0x98,0x98,0x98,0xff, 0xb3,0xb3,0xba,0xff,0xbb,0xbb,0xc2,0xff,0xc3,0xc3,0xca,0xff,0xcb,0xcb,0xd1, 0xff,0x5f,0x5f,0x61,0xff,0x9d,0x9d,0x9e,0xff,0xac,0xac,0xad,0xff,0x78,0x78, 0x79,0xff,0xc4,0xc3,0xc6,0xff,0x9f,0x9b,0x9d,0xff,0xc7,0xc7,0xc8,0xff,0xf3, 0xf3,0xf4,0xff,0x6b,0x6b,0x6b,0xff,0xa4,0xa4,0xa4,0xff,0xb0,0xb0,0xb0,0xff, 0x7b,0x7b,0x7b,0xff,0xc8,0xc8,0xc9,0xff,0xa1,0x9d,0x9e,0xff,0xc7,0xc6,0xc7, 0xff,0xee,0xee,0xef,0xff,0x68,0x68,0x68,0xff,0xa1,0xa1,0xa2,0xff,0xac,0xac, 0xad,0xff,0x76,0x76,0x77,0xff,0xbd,0xbd,0xc0,0xff,0x97,0x94,0x96,0xff,0xba, 0xb9,0xbd,0xff,0xde,0xde,0xe2,0xff,0x62,0x62,0x63,0xff,0x9b,0x9b,0x9d,0xff, 0xa7,0xa7,0xa8,0xff,0x6f,0x6f,0x72,0xff,0xac,0xac,0xb2,0xff,0x8a,0x86,0x8b, 0xff,0xa8,0xa7,0xae,0xff,0xc7,0xc7,0xd0,0xff,0xc4,0xc4,0xcd,0xff,0xc0,0xc0, 0xca,0xff,0xbd,0xbd,0xc7,0xff,0xb9,0xb9,0xc4,0xff,0x79,0x79,0x80,0xff,0xff, 0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff,0xff,0xc4, 0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff,0xff, 0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb,0xfd,0xfd,0xfd,0xe1,0xf9,0xf9, 0xfa,0xe8,0xf6,0xf6,0xf8,0xee,0xf3,0xf3,0xf5,0xf3,0xef,0xef,0xf3,0xf8,0xec, 0xec,0xf0,0xfb,0xe8,0xe8,0xed,0xec,0x82,0xe8,0xe8,0xed,0xff,0x02,0xe9,0xe9, 0xed,0xff,0xe9,0xe9,0xee,0xff,0x82,0xea,0xea,0xee,0xff,0x11,0xeb,0xeb,0xee, 0xff,0xeb,0xeb,0xef,0xff,0x3c,0x3c,0x3c,0xff,0x04,0x04,0x04,0xff,0x78,0x78, 0x78,0xff,0x97,0x9d,0x96,0xff,0xaa,0xb4,0xa8,0xff,0xb5,0xc2,0xb3,0xff,0xba, 0xc8,0xb7,0xff,0xb8,0xc6,0xb5,0xff,0xb2,0xbe,0xaf,0xff,0xa8,0xb2,0xa6,0xff, 0x9c,0xa3,0x9a,0xff,0x85,0x88,0x85,0xff,0x0e,0x0e,0x0e,0xff,0xff,0xff,0xff, 0xff,0xf2,0xf2,0xf3,0xff,0x82,0xf3,0xf3,0xf4,0xff,0x82,0xf4,0xf4,0xf4,0xff, 0x87,0xf5,0xf5,0xf5,0xff,0x0f,0xf4,0xf4,0xf5,0xff,0x3c,0x3c,0x3c,0xff,0x04, 0x04,0x04,0xff,0x00,0x90,0x00,0xff,0x35,0xb1,0x34,0xff,0x60,0xc3,0x5e,0xff, 0x79,0xcf,0x76,0xff,0x83,0xd3,0x80,0xff,0x7f,0xd1,0x7c,0xff,0x71,0xcb,0x6f, 0xff,0x5c,0xc2,0x5a,0xff,0x40,0xb5,0x3f,0xff,0x1e,0x9d,0x1d,0xff,0x0e,0x0e, 0x0e,0xff,0xff,0xff,0xff,0xff,0x82,0xf1,0xf1,0xf2,0xff,0x83,0xf0,0xf0,0xf1, 0xff,0x83,0xef,0xef,0xf0,0xff,0x01,0xee,0xee,0xf0,0xff,0x82,0xee,0xee,0xef, 0xff,0x10,0xed,0xed,0xef,0xff,0xed,0xed,0xee,0xff,0x3c,0x3c,0x3c,0xff,0x04, 0x04,0x04,0xff,0xbd,0xbd,0x00,0xff,0xd0,0xd5,0x34,0xff,0xd5,0xdf,0x5e,0xff, 0xd8,0xe5,0x76,0xff,0xd9,0xe8,0x80,0xff,0xd9,0xe7,0x7c,0xff,0xd7,0xe4,0x6f, 0xff,0xd5,0xde,0x5a,0xff,0xd1,0xd8,0x3f,0xff,0xc1,0xc4,0x1d,0xff,0x0e,0x0e, 0x0e,0xff,0xff,0xff,0xff,0xff,0x82,0xe6,0xe6,0xe9,0xff,0x82,0xe5,0xe5,0xe8, 0xff,0x82,0xe4,0xe4,0xe7,0xff,0x82,0xe3,0xe3,0xe6,0xff,0x01,0xe2,0xe2,0xe6, 0xff,0x82,0xe1,0xe1,0xe5,0xff,0x82,0xe0,0xe0,0xe4,0xff,0x10,0xdf,0xdf,0xe3, 0xff,0x3c,0x3c,0x3c,0xff,0x04,0x04,0x04,0xff,0xf0,0x00,0x00,0xff,0xff,0x4c, 0x4c,0xff,0xff,0x84,0x84,0xff,0xff,0xa1,0xa1,0xff,0xff,0xac,0xac,0xff,0xff, 0xa8,0xa8,0xff,0xff,0x99,0x99,0xff,0xff,0x7f,0x7f,0xff,0xff,0x5b,0x5b,0xff, 0xf0,0x2c,0x2c,0xff,0x0e,0x0e,0x0e,0xff,0xff,0xff,0xff,0xff,0xd6,0xd6,0xdc, 0xff,0x82,0xd5,0xd5,0xdb,0xff,0x16,0xd4,0xd4,0xda,0xff,0xd3,0xd3,0xda,0xff, 0xd3,0xd3,0xd9,0xff,0xd2,0xd2,0xd9,0xff,0xd1,0xd1,0xd8,0xff,0xd1,0xd1,0xd7, 0xff,0xd0,0xd0,0xd7,0xff,0xcf,0xcf,0xd6,0xff,0xce,0xce,0xd5,0xff,0xcd,0xcd, 0xd5,0xfc,0xcc,0xcc,0xd4,0xe9,0xcc,0xcc,0xd3,0xd5,0xcb,0xcb,0xd3,0xc0,0xca, 0xca,0xd2,0xab,0xca,0xca,0xd2,0x96,0xc9,0xc9,0xd1,0x81,0xc8,0xc8,0xd0,0x6c, 0xc7,0xc7,0xd0,0x57,0xc7,0xc7,0xcf,0x42,0xc6,0xc6,0xcf,0x2d,0xc5,0xc5,0xce, 0x18,0xc4,0xc4,0xcd,0x04,0x84,0xff,0xff,0xff,0x00,0x40,0xfb,0xfb,0xfc,0xff, 0xfa,0xfa,0xfb,0xff,0xfd,0xfd,0xfd,0xff,0x96,0x96,0x97,0xff,0xb6,0xb6,0xbc, 0xff,0xbe,0xbe,0xc4,0xff,0xc6,0xc6,0xcb,0xff,0xce,0xce,0xd3,0xff,0xbb,0xbb, 0xbf,0xff,0x9f,0x9f,0xa1,0xff,0xa8,0xa8,0xaa,0xff,0xd2,0xd2,0xd4,0xff,0x63, 0x49,0x49,0xff,0xa6,0x49,0x49,0xff,0x77,0x4a,0x4a,0xff,0xf5,0xf5,0xf5,0xff, 0xd5,0xd5,0xd5,0xff,0xac,0xac,0xac,0xff,0xae,0xae,0xae,0xff,0xd4,0xd4,0xd4, 0xff,0x63,0x48,0x49,0xff,0xa5,0x48,0x48,0xff,0x75,0x48,0x48,0xff,0xeb,0xeb, 0xed,0xff,0xcb,0xcb,0xcd,0xff,0xa3,0xa3,0xa5,0xff,0xa5,0xa5,0xa7,0xff,0xc7, 0xc7,0xca,0xff,0x5e,0x44,0x45,0xff,0xa0,0x43,0x45,0xff,0x70,0x42,0x44,0xff, 0xd9,0xd9,0xdf,0xff,0xbb,0xbb,0xc0,0xff,0x97,0x97,0x9b,0xff,0x98,0x98,0x9c, 0xff,0xb5,0xb5,0xbb,0xff,0x58,0x3d,0x40,0xff,0x99,0x3c,0x3f,0xff,0x69,0x3b, 0x3e,0xff,0xc1,0xc1,0xcb,0xff,0xbe,0xbe,0xc8,0xff,0xba,0xba,0xc5,0xff,0xb7, 0xb7,0xc2,0xff,0xb3,0xb3,0xbf,0xff,0x7b,0x7b,0x82,0xff,0xff,0xff,0xff,0xb8, 0xff,0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff, 0xc8,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff, 0xff,0xd8,0xff,0xff,0xff,0xdb,0xfd,0xfd,0xfd,0xe1,0xf9,0xf9,0xfb,0xe8,0xf6, 0xf6,0xf8,0xee,0xf3,0xf3,0xf5,0xf3,0xf0,0xf0,0xf3,0xf8,0xed,0xed,0xf1,0xfb, 0xe9,0xe9,0xed,0xed,0xe9,0xe9,0xee,0xff,0xe9,0xe9,0xed,0xff,0x82,0xea,0xea, 0xee,0xff,0x02,0xeb,0xeb,0xee,0xff,0xeb,0xeb,0xef,0xff,0x82,0xec,0xec,0xef, 0xff,0x0f,0x7d,0x7d,0x7e,0xff,0x22,0x22,0x22,0xff,0x40,0x40,0x40,0xff,0x8c, 0x8f,0x8b,0xff,0x9c,0xa3,0x9b,0xff,0xa6,0xb0,0xa4,0xff,0xab,0xb5,0xa8,0xff, 0xaa,0xb5,0xa8,0xff,0xa6,0xaf,0xa4,0xff,0x9e,0xa5,0x9c,0xff,0x94,0x99,0x93, 0xff,0x44,0x45,0x44,0xff,0x5f,0x5f,0x5f,0xff,0xfb,0xfb,0xfb,0xff,0xf3,0xf3, 0xf4,0xff,0x82,0xf4,0xf4,0xf4,0xff,0x01,0xf4,0xf4,0xf5,0xff,0x86,0xf5,0xf5, 0xf5,0xff,0x01,0xf4,0xf4,0xf5,0xff,0x82,0xf4,0xf4,0xf4,0xff,0x0f,0x7f,0x7f, 0x7f,0xff,0x22,0x22,0x22,0xff,0x00,0x4d,0x00,0xff,0x1c,0xa5,0x1b,0xff,0x41, 0xb6,0x3f,0xff,0x57,0xc0,0x55,0xff,0x61,0xc4,0x5f,0xff,0x60,0xc4,0x5e,0xff, 0x56,0xbf,0x54,0xff,0x45,0xb8,0x44,0xff,0x2e,0xad,0x2d,0xff,0x09,0x51,0x09, 0xff,0x5f,0x5f,0x5f,0xff,0xfb,0xfb,0xfb,0xff,0xf1,0xf1,0xf1,0xff,0x83,0xf0, 0xf0,0xf1,0xff,0x82,0xef,0xef,0xf0,0xff,0x01,0xee,0xee,0xf0,0xff,0x82,0xee, 0xee,0xef,0xff,0x01,0xed,0xed,0xef,0xff,0x82,0xed,0xed,0xee,0xff,0x0f,0xec, 0xec,0xee,0xff,0x7d,0x7d,0x7d,0xff,0x22,0x22,0x22,0xff,0x65,0x65,0x00,0xff, 0xcd,0xd0,0x1b,0xff,0xd1,0xd8,0x3f,0xff,0xd4,0xde,0x55,0xff,0xd5,0xe0,0x5f, 0xff,0xd5,0xe0,0x5e,0xff,0xd4,0xdd,0x54,0xff,0xd2,0xd9,0x44,0xff,0xcf,0xd4, 0x2d,0xff,0x66,0x67,0x09,0xff,0x5f,0x5f,0x5f,0xff,0xf7,0xf7,0xf8,0xff,0x82, 0xe5,0xe5,0xe8,0xff,0x82,0xe4,0xe4,0xe7,0xff,0x07,0xe3,0xe3,0xe7,0xff,0xe3, 0xe3,0xe6,0xff,0xe2,0xe2,0xe6,0xff,0xe2,0xe2,0xe5,0xff,0xe1,0xe1,0xe5,0xff, 0xe1,0xe1,0xe4,0xff,0xe0,0xe0,0xe4,0xff,0x82,0xdf,0xdf,0xe3,0xff,0x10,0xde, 0xde,0xe3,0xff,0x79,0x79,0x7a,0xff,0x22,0x22,0x22,0xff,0x80,0x00,0x00,0xff, 0xff,0x29,0x29,0xff,0xff,0x5c,0x5c,0xff,0xff,0x79,0x79,0xff,0xff,0x86,0x86, 0xff,0xff,0x84,0x84,0xff,0xff,0x78,0x78,0xff,0xff,0x62,0x62,0xff,0xff,0x43, 0x43,0xff,0x80,0x0e,0x0e,0xff,0x5f,0x5f,0x5f,0xff,0xf2,0xf2,0xf4,0xff,0xd5, 0xd5,0xdb,0xff,0x82,0xd4,0xd4,0xda,0xff,0x05,0xd3,0xd3,0xd9,0xff,0xd2,0xd2, 0xd9,0xff,0xd2,0xd2,0xd8,0xff,0xd1,0xd1,0xd8,0xff,0xd0,0xd0,0xd7,0xff,0x82, 0xcf,0xcf,0xd6,0xff,0x0f,0xce,0xce,0xd5,0xff,0xcd,0xcd,0xd4,0xff,0xcc,0xcc, 0xd4,0xfc,0xcb,0xcb,0xd3,0xe9,0xca,0xca,0xd2,0xd5,0xca,0xca,0xd2,0xc0,0xc9, 0xc9,0xd1,0xab,0xc8,0xc8,0xd1,0x96,0xc7,0xc7,0xd0,0x81,0xc7,0xc7,0xcf,0x6c, 0xc6,0xc6,0xcf,0x57,0xc5,0xc5,0xce,0x42,0xc4,0xc4,0xce,0x2d,0xc4,0xc4,0xcd, 0x18,0xc3,0xc3,0xcc,0x04,0x84,0xff,0xff,0xff,0x00,0x3e,0xff,0xff,0xff,0xff, 0xfa,0xfa,0xfb,0xff,0xf2,0xf2,0xf5,0xff,0x90,0x90,0x93,0xff,0xb9,0xb9,0xbe, 0xff,0xc1,0xc1,0xc5,0xff,0xc9,0xc9,0xcd,0xff,0xd1,0xd1,0xd5,0xff,0xda,0xda, 0xdd,0xff,0xe3,0xe3,0xe5,0xff,0xec,0xec,0xed,0xff,0xf2,0xf2,0xf3,0xff,0x74, 0x54,0x55,0xff,0xb4,0x4a,0x4a,0xff,0x8a,0x55,0x55,0xff,0xf4,0xf4,0xf4,0xff, 0xf3,0xf3,0xf3,0xff,0xf2,0xf2,0xf2,0xff,0xf0,0xf0,0xf1,0xff,0xef,0xef,0xf0, 0xff,0x72,0x52,0x52,0xff,0xb2,0x47,0x48,0xff,0x87,0x51,0x52,0xff,0xe8,0xe8, 0xea,0xff,0xe6,0xe6,0xe9,0xff,0xe4,0xe4,0xe7,0xff,0xe2,0xe2,0xe5,0xff,0xdf, 0xdf,0xe3,0xff,0x6c,0x4c,0x4e,0xff,0xac,0x42,0x43,0xff,0x80,0x4a,0x4c,0xff, 0xd5,0xd5,0xdb,0xff,0xd2,0xd2,0xd8,0xff,0xcf,0xcf,0xd6,0xff,0xcc,0xcc,0xd3, 0xff,0xc9,0xc9,0xd1,0xff,0x64,0x44,0x48,0xff,0xa5,0x3b,0x3e,0xff,0x78,0x42, 0x45,0xff,0xbb,0xbb,0xc6,0xff,0xb8,0xb8,0xc3,0xff,0xb4,0xb4,0xc0,0xff,0xb0, 0xb0,0xbd,0xff,0xa2,0xa2,0xae,0xff,0x7d,0x7d,0x84,0xff,0xff,0xff,0xff,0xb8, 0xff,0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff, 0xc8,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff, 0xff,0xd8,0xff,0xff,0xff,0xdb,0xfd,0xfd,0xfe,0xe1,0xf9,0xf9,0xfb,0xe8,0xf6, 0xf6,0xf8,0xee,0xf3,0xf3,0xf6,0xf3,0xf1,0xf1,0xf3,0xf8,0xee,0xee,0xf1,0xfb, 0xea,0xea,0xee,0xed,0x83,0xea,0xea,0xee,0xff,0x82,0xeb,0xeb,0xef,0xff,0x82, 0xec,0xec,0xef,0xff,0x11,0xed,0xed,0xf0,0xff,0xc8,0xc8,0xcb,0xff,0x5d,0x5d, 0x5d,0xff,0x07,0x07,0x07,0xff,0x68,0x68,0x68,0xff,0x8e,0x91,0x8d,0xff,0x97, 0x9d,0x96,0xff,0x9c,0xa3,0x9a,0xff,0x9c,0xa3,0x9b,0xff,0x99,0x9f,0x98,0xff, 0x93,0x97,0x92,0xff,0x71,0x72,0x70,0xff,0x0f,0x0f,0x0f,0xff,0xdf,0xdf,0xdf, 0xff,0xf6,0xf6,0xf7,0xff,0xf4,0xf4,0xf4,0xff,0xf4,0xf4,0xf5,0xff,0x87,0xf5, 0xf5,0xf5,0xff,0x01,0xf4,0xf4,0xf5,0xff,0x83,0xf4,0xf4,0xf4,0xff,0x0e,0xce, 0xce,0xce,0xff,0x5d,0x5d,0x5d,0xff,0x07,0x07,0x07,0xff,0x00,0x7d,0x00,0xff, 0x21,0xa8,0x20,0xff,0x36,0xb1,0x34,0xff,0x40,0xb5,0x3f,0xff,0x41,0xb6,0x40, 0xff,0x3a,0xb3,0x39,0xff,0x2c,0xac,0x2b,0xff,0x14,0x86,0x14,0xff,0x0f,0x0f, 0x0f,0xff,0xdf,0xdf,0xdf,0xff,0xf4,0xf4,0xf5,0xff,0x82,0xf0,0xf0,0xf1,0xff, 0x83,0xef,0xef,0xf0,0xff,0x82,0xee,0xee,0xef,0xff,0x82,0xed,0xed,0xef,0xff, 0x01,0xed,0xed,0xee,0xff,0x82,0xec,0xec,0xee,0xff,0x17,0xeb,0xeb,0xed,0xff, 0xc7,0xc7,0xc8,0xff,0x5d,0x5d,0x5d,0xff,0x07,0x07,0x07,0xff,0xa4,0xa4,0x00, 0xff,0xcd,0xd1,0x20,0xff,0xd0,0xd6,0x34,0xff,0xd1,0xd8,0x3f,0xff,0xd1,0xd8, 0x40,0xff,0xd0,0xd7,0x39,0xff,0xcf,0xd3,0x2b,0xff,0xa6,0xa9,0x14,0xff,0x0f, 0x0f,0x0f,0xff,0xdf,0xdf,0xdf,0xff,0xec,0xec,0xee,0xff,0xe4,0xe4,0xe8,0xff, 0xe4,0xe4,0xe7,0xff,0xe3,0xe3,0xe7,0xff,0xe3,0xe3,0xe6,0xff,0xe2,0xe2,0xe6, 0xff,0xe2,0xe2,0xe5,0xff,0xe1,0xe1,0xe5,0xff,0xe1,0xe1,0xe4,0xff,0x82,0xe0, 0xe0,0xe4,0xff,0x17,0xdf,0xdf,0xe3,0xff,0xde,0xde,0xe3,0xff,0xde,0xde,0xe2, 0xff,0xdd,0xdd,0xe2,0xff,0xbc,0xbc,0xbf,0xff,0x5d,0x5d,0x5d,0xff,0x07,0x07, 0x07,0xff,0xd0,0x00,0x00,0xff,0xff,0x30,0x30,0xff,0xff,0x4d,0x4d,0xff,0xff, 0x5b,0x5b,0xff,0xff,0x5c,0x5c,0xff,0xff,0x53,0x53,0xff,0xff,0x40,0x40,0xff, 0xd0,0x1d,0x1d,0xff,0x0f,0x0f,0x0f,0xff,0xdf,0xdf,0xdf,0xff,0xdf,0xdf,0xe4, 0xff,0xd4,0xd4,0xda,0xff,0xd3,0xd3,0xd9,0xff,0xd2,0xd2,0xd9,0xff,0xd2,0xd2, 0xd8,0xff,0xd1,0xd1,0xd8,0xff,0x82,0xd0,0xd0,0xd7,0xff,0x01,0xcf,0xcf,0xd6, 0xff,0x82,0xce,0xce,0xd5,0xff,0x0f,0xcd,0xcd,0xd4,0xff,0xcb,0xcb,0xd3,0xff, 0xcb,0xcb,0xd3,0xfc,0xca,0xca,0xd2,0xe9,0xc9,0xc9,0xd1,0xd5,0xc8,0xc8,0xd1, 0xc0,0xc8,0xc8,0xd0,0xab,0xc7,0xc7,0xd0,0x96,0xc6,0xc6,0xcf,0x81,0xc5,0xc5, 0xce,0x6c,0xc5,0xc5,0xce,0x57,0xc4,0xc4,0xcd,0x42,0xc3,0xc3,0xcc,0x2d,0xc2, 0xc2,0xcc,0x18,0xc2,0xc2,0xcb,0x04,0x84,0xff,0xff,0xff,0x00,0x3e,0xfc,0xfc, 0xfd,0xff,0xeb,0xeb,0xf0,0xff,0xe0,0xe0,0xe7,0xff,0x88,0x88,0x8c,0xff,0xbc, 0xbc,0xc0,0xff,0xc4,0xc4,0xc7,0xff,0xcc,0xcc,0xcf,0xff,0xd5,0xd5,0xd7,0xff, 0xdd,0xdd,0xdf,0xff,0xe6,0xe6,0xe7,0xff,0xef,0xef,0xf0,0xff,0xf5,0xf5,0xf5, 0xff,0xe0,0xdf,0xdf,0xff,0xd1,0xc9,0xca,0xff,0xe0,0xde,0xde,0xff,0xf2,0xf2, 0xf3,0xff,0xf1,0xf1,0xf2,0xff,0xf0,0xf0,0xf1,0xff,0xee,0xee,0xef,0xff,0xec, 0xec,0xee,0xff,0xd7,0xd6,0xd8,0xff,0xc7,0xc0,0xc2,0xff,0xd4,0xd2,0xd5,0xff, 0xe5,0xe5,0xe8,0xff,0xe2,0xe2,0xe6,0xff,0xe0,0xe0,0xe4,0xff,0xdd,0xdd,0xe2, 0xff,0xdb,0xdb,0xe0,0xff,0xc6,0xc5,0xca,0xff,0xb7,0xb0,0xb5,0xff,0xc2,0xc0, 0xc6,0xff,0xd0,0xd0,0xd7,0xff,0xcd,0xcd,0xd4,0xff,0xca,0xca,0xd2,0xff,0xc6, 0xc6,0xcf,0xff,0xc3,0xc3,0xcc,0xff,0xaf,0xaf,0xb8,0xff,0xa2,0x9b,0xa4,0xff, 0xaa,0xa8,0xb3,0xff,0xb5,0xb5,0xc1,0xff,0xb1,0xb1,0xbe,0xff,0xa0,0xa0,0xaa, 0xff,0x8e,0x8e,0x95,0xff,0x87,0x87,0x8c,0xfa,0xa5,0xa5,0xa9,0xe2,0xff,0xff, 0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff,0xff,0xc4,0xff, 0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4, 0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb,0xfd,0xfd,0xfe,0xe1,0xfa,0xfa,0xfb, 0xe8,0xf7,0xf7,0xf8,0xee,0xf4,0xf4,0xf6,0xf3,0xf1,0xf1,0xf4,0xf8,0xef,0xef, 0xf2,0xfb,0xea,0xea,0xee,0xed,0x83,0xeb,0xeb,0xef,0xff,0x82,0xec,0xec,0xef, 0xff,0x82,0xed,0xed,0xf0,0xff,0x0f,0xee,0xee,0xf0,0xff,0xee,0xee,0xf1,0xff, 0xad,0xad,0xae,0xff,0x6f,0x6f,0x6f,0xff,0x09,0x09,0x09,0xff,0x40,0x40,0x40, 0xff,0x80,0x82,0x7f,0xff,0x8d,0x90,0x8c,0xff,0x8e,0x91,0x8d,0xff,0x83,0x86, 0x83,0xff,0x43,0x44,0x43,0xff,0x0f,0x0f,0x0f,0xff,0xcf,0xcf,0xcf,0xff,0xfa, 0xfa,0xfa,0xff,0xf4,0xf4,0xf5,0xff,0x87,0xf5,0xf5,0xf5,0xff,0x01,0xf4,0xf4, 0xf5,0xff,0x85,0xf4,0xf4,0xf4,0xff,0x0e,0xf3,0xf3,0xf4,0xff,0xaf,0xaf,0xaf, 0xff,0x6f,0x6f,0x6f,0xff,0x09,0x09,0x09,0xff,0x00,0x4d,0x00,0xff,0x13,0x98, 0x12,0xff,0x1e,0xa6,0x1e,0xff,0x21,0xa8,0x20,0xff,0x1a,0x9b,0x19,0xff,0x09, 0x50,0x08,0xff,0x0f,0x0f,0x0f,0xff,0xcf,0xcf,0xcf,0xff,0xf8,0xf8,0xf9,0xff, 0xf0,0xf0,0xf1,0xff,0x83,0xef,0xef,0xf0,0xff,0x01,0xee,0xee,0xf0,0xff,0x82, 0xee,0xee,0xef,0xff,0x02,0xed,0xed,0xef,0xff,0xed,0xed,0xee,0xff,0x82,0xec, 0xec,0xee,0xff,0x01,0xec,0xec,0xed,0xff,0x82,0xeb,0xeb,0xed,0xff,0x0d,0xea, 0xea,0xec,0xff,0xab,0xab,0xac,0xff,0x6f,0x6f,0x6f,0xff,0x09,0x09,0x09,0xff, 0x65,0x65,0x00,0xff,0xc0,0xc2,0x12,0xff,0xcd,0xd0,0x1e,0xff,0xcd,0xd1,0x20, 0xff,0xc0,0xc4,0x19,0xff,0x66,0x67,0x08,0xff,0x0f,0x0f,0x0f,0xff,0xcf,0xcf, 0xcf,0xff,0xf4,0xf4,0xf5,0xff,0x82,0xe4,0xe4,0xe7,0xff,0x01,0xe3,0xe3,0xe6, 0xff,0x82,0xe2,0xe2,0xe6,0xff,0x82,0xe1,0xe1,0xe5,0xff,0x82,0xe0,0xe0,0xe4, 0xff,0x82,0xdf,0xdf,0xe3,0xff,0x2b,0xde,0xde,0xe2,0xff,0xdd,0xdd,0xe2,0xff, 0xdd,0xdd,0xe1,0xff,0xdc,0xdc,0xe1,0xff,0xdc,0xdc,0xe0,0xff,0xa4,0xa4,0xa6, 0xff,0x6f,0x6f,0x6f,0xff,0x09,0x09,0x09,0xff,0x80,0x00,0x00,0xff,0xf0,0x1b, 0x1b,0xff,0xff,0x2d,0x2d,0xff,0xff,0x30,0x30,0xff,0xf0,0x27,0x27,0xff,0x80, 0x0d,0x0d,0xff,0x0f,0x0f,0x0f,0xff,0xcf,0xcf,0xcf,0xff,0xec,0xec,0xef,0xff, 0xd3,0xd3,0xda,0xff,0xd3,0xd3,0xd9,0xff,0xd2,0xd2,0xd8,0xff,0xd1,0xd1,0xd8, 0xff,0xd1,0xd1,0xd7,0xff,0xd0,0xd0,0xd7,0xff,0xcf,0xcf,0xd6,0xff,0xce,0xce, 0xd6,0xff,0xce,0xce,0xd5,0xff,0xcd,0xcd,0xd4,0xff,0xcc,0xcc,0xd4,0xff,0xcc, 0xcc,0xd3,0xff,0xca,0xca,0xd2,0xff,0xc9,0xc9,0xd2,0xfc,0xc9,0xc9,0xd1,0xe9, 0xc8,0xc8,0xd0,0xd5,0xc7,0xc7,0xd0,0xc0,0xc6,0xc6,0xcf,0xab,0xc6,0xc6,0xce, 0x96,0xc5,0xc5,0xce,0x81,0xc4,0xc4,0xcd,0x6c,0xc3,0xc3,0xcd,0x57,0xc3,0xc3, 0xcc,0x42,0xc2,0xc2,0xcb,0x2d,0xc1,0xc1,0xcb,0x18,0xc0,0xc0,0xca,0x04,0x84, 0xff,0xff,0xff,0x00,0x0b,0xf8,0xf8,0xfa,0xff,0x88,0x88,0x8c,0xff,0x81,0x81, 0x87,0xff,0x7e,0x7e,0x84,0xff,0x8a,0x8a,0x90,0xff,0x8d,0x8d,0x93,0xff,0x90, 0x90,0x96,0xff,0x93,0x93,0x98,0xff,0x96,0x96,0x9b,0xff,0x9a,0x9a,0x9e,0xff, 0x9d,0x9d,0xa1,0xff,0x82,0x9f,0x9f,0xa3,0xff,0x03,0xa0,0xa0,0xa4,0xff,0xa1, 0xa1,0xa5,0xff,0xa2,0xa2,0xa5,0xff,0x82,0xa3,0xa3,0xa6,0xff,0x82,0xa4,0xa4, 0xa7,0xff,0x02,0xa5,0xa5,0xa7,0xff,0xa5,0xa5,0xa8,0xff,0x82,0xa6,0xa6,0xa8, 0xff,0x82,0xa7,0xa7,0xa9,0xff,0x83,0xa8,0xa8,0xa9,0xff,0x21,0xa7,0xa7,0xa9, 0xff,0xa6,0xa6,0xa8,0xff,0xa4,0xa4,0xa7,0xff,0xa3,0xa3,0xa6,0xff,0xa1,0xa1, 0xa4,0xff,0xa0,0xa0,0xa3,0xff,0x9e,0x9e,0xa1,0xff,0x9c,0x9c,0xa0,0xff,0x9a, 0x9a,0x9e,0xff,0x98,0x98,0x9d,0xff,0x95,0x95,0x9b,0xff,0x93,0x93,0x98,0xf9, 0xaa,0xaa,0xac,0xdd,0xcd,0xcd,0xcf,0xc5,0xff,0xff,0xff,0xaf,0xff,0xff,0xff, 0xb3,0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff, 0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff, 0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb,0xfd,0xfd,0xfe,0xe1, 0xfa,0xfa,0xfb,0xe8,0xf7,0xf7,0xf9,0xee,0xf4,0xf4,0xf6,0xf3,0xf1,0xf1,0xf4, 0xf8,0xef,0xef,0xf2,0xfb,0xeb,0xeb,0xef,0xee,0x83,0xec,0xec,0xef,0xff,0x83, 0xed,0xed,0xf0,0xff,0x82,0xee,0xee,0xf1,0xff,0x82,0xef,0xef,0xf1,0xff,0x04, 0xbe,0xbe,0xbf,0xff,0x93,0x93,0x93,0xff,0x44,0x44,0x44,0xff,0x0c,0x0c,0x0c, 0xff,0x82,0x00,0x00,0x00,0xff,0x04,0x0e,0x0e,0x0e,0xff,0x5f,0x5f,0x5f,0xff, 0xdf,0xdf,0xdf,0xff,0xfa,0xfa,0xfa,0xff,0x87,0xf5,0xf5,0xf5,0xff,0x01,0xf4, 0xf4,0xf5,0xff,0x85,0xf4,0xf4,0xf4,0xff,0x82,0xf3,0xf3,0xf4,0xff,0x82,0xf3, 0xf3,0xf3,0xff,0x04,0xbf,0xbf,0xc0,0xff,0x93,0x93,0x93,0xff,0x44,0x44,0x44, 0xff,0x0c,0x0c,0x0c,0xff,0x82,0x00,0x00,0x00,0xff,0x05,0x0e,0x0e,0x0e,0xff, 0x5f,0x5f,0x5f,0xff,0xdf,0xdf,0xdf,0xff,0xf8,0xf8,0xf9,0xff,0xef,0xef,0xf1, 0xff,0x82,0xef,0xef,0xf0,0xff,0x01,0xee,0xee,0xf0,0xff,0x82,0xee,0xee,0xef, 0xff,0x01,0xed,0xed,0xef,0xff,0x82,0xed,0xed,0xee,0xff,0x02,0xec,0xec,0xee, 0xff,0xec,0xec,0xed,0xff,0x82,0xeb,0xeb,0xed,0xff,0x83,0xea,0xea,0xec,0xff, 0x05,0xe9,0xe9,0xeb,0xff,0xbb,0xbb,0xbc,0xff,0x93,0x93,0x93,0xff,0x44,0x44, 0x44,0xff,0x0c,0x0c,0x0c,0xff,0x82,0x00,0x00,0x00,0xff,0x05,0x0e,0x0e,0x0e, 0xff,0x5f,0x5f,0x5f,0xff,0xdf,0xdf,0xdf,0xff,0xf3,0xf3,0xf5,0xff,0xe4,0xe4, 0xe7,0xff,0x82,0xe3,0xe3,0xe6,0xff,0x03,0xe2,0xe2,0xe6,0xff,0xe2,0xe2,0xe5, 0xff,0xe1,0xe1,0xe5,0xff,0x82,0xe0,0xe0,0xe4,0xff,0x82,0xdf,0xdf,0xe3,0xff, 0x82,0xde,0xde,0xe2,0xff,0x0a,0xdd,0xdd,0xe1,0xff,0xdc,0xdc,0xe1,0xff,0xdc, 0xdc,0xe0,0xff,0xdb,0xdb,0xe0,0xff,0xdb,0xdb,0xdf,0xff,0xda,0xda,0xdf,0xff, 0xb4,0xb4,0xb6,0xff,0x93,0x93,0x93,0xff,0x44,0x44,0x44,0xff,0x0c,0x0c,0x0c, 0xff,0x82,0x00,0x00,0x00,0xff,0x09,0x0e,0x0e,0x0e,0xff,0x5f,0x5f,0x5f,0xff, 0xdf,0xdf,0xdf,0xff,0xec,0xec,0xef,0xff,0xd3,0xd3,0xd9,0xff,0xd2,0xd2,0xd9, 0xff,0xd1,0xd1,0xd8,0xff,0xd1,0xd1,0xd7,0xff,0xd0,0xd0,0xd7,0xff,0x82,0xcf, 0xcf,0xd6,0xff,0x14,0xce,0xce,0xd5,0xff,0xcd,0xcd,0xd5,0xff,0xcc,0xcc,0xd4, 0xff,0xcc,0xcc,0xd3,0xff,0xcb,0xcb,0xd3,0xff,0xca,0xca,0xd2,0xff,0xc9,0xc9, 0xd1,0xff,0xc8,0xc8,0xd0,0xfc,0xc7,0xc7,0xd0,0xe9,0xc7,0xc7,0xcf,0xd5,0xc6, 0xc6,0xcf,0xc0,0xc5,0xc5,0xce,0xab,0xc4,0xc4,0xcd,0x96,0xc3,0xc3,0xcd,0x81, 0xc3,0xc3,0xcc,0x6c,0xc2,0xc2,0xcb,0x57,0xc1,0xc1,0xcb,0x42,0xc0,0xc0,0xca, 0x2d,0xc0,0xc0,0xca,0x18,0xbf,0xbf,0xc9,0x04,0x87,0xff,0xff,0xff,0x00,0x01, 0xff,0xff,0xff,0x02,0x82,0xff,0xff,0xff,0x03,0x38,0xff,0xff,0xff,0x06,0xff, 0xff,0xff,0x09,0xff,0xff,0xff,0x0a,0xff,0xff,0xff,0x0d,0xff,0xff,0xff,0x13, 0xff,0xff,0xff,0x16,0xff,0xff,0xff,0x17,0xff,0xff,0xff,0x22,0xff,0xff,0xff, 0x26,0xff,0xff,0xff,0x29,0xff,0xff,0xff,0x32,0xff,0xff,0xff,0x3b,0xff,0xff, 0xff,0x3f,0xff,0xff,0xff,0x43,0xff,0xff,0xff,0x47,0xff,0xff,0xff,0x4c,0xff, 0xff,0xff,0x50,0xff,0xff,0xff,0x54,0xff,0xff,0xff,0x59,0xff,0xff,0xff,0x5d, 0xff,0xff,0xff,0x62,0xff,0xff,0xff,0x66,0xff,0xff,0xff,0x6b,0xff,0xff,0xff, 0x6f,0xff,0xff,0xff,0x74,0xff,0xff,0xff,0x79,0xff,0xff,0xff,0x7d,0xff,0xff, 0xff,0x82,0xff,0xff,0xff,0x86,0xff,0xff,0xff,0x8b,0xff,0xff,0xff,0x90,0xff, 0xff,0xff,0x94,0xff,0xff,0xff,0x99,0xff,0xff,0xff,0x9d,0xff,0xff,0xff,0xa2, 0xff,0xff,0xff,0xa6,0xff,0xff,0xff,0xab,0xff,0xff,0xff,0xaf,0xff,0xff,0xff, 0xb3,0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff,0xff,0xc0,0xff,0xff, 0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff, 0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb,0xfd,0xfd,0xfe,0xe1, 0xfa,0xfa,0xfb,0xe8,0xf7,0xf7,0xf9,0xee,0xf5,0xf5,0xf6,0xf3,0xf2,0xf2,0xf5, 0xf8,0xf0,0xf0,0xf3,0xfb,0xec,0xec,0xef,0xee,0x82,0xec,0xec,0xf0,0xff,0x82, 0xed,0xed,0xf0,0xff,0x02,0xee,0xee,0xf0,0xff,0xee,0xee,0xf1,0xff,0x82,0xef, 0xef,0xf1,0xff,0x82,0xf0,0xf0,0xf2,0xff,0x09,0xf1,0xf1,0xf2,0xff,0xe2,0xe2, 0xe4,0xff,0xd4,0xd4,0xd5,0xff,0xd6,0xd6,0xd6,0xff,0xe5,0xe5,0xe5,0xff,0xf5, 0xf5,0xf5,0xff,0xff,0xff,0xff,0xff,0xfc,0xfc,0xfc,0xff,0xf7,0xf7,0xf8,0xff, 0x87,0xf5,0xf5,0xf5,0xff,0x85,0xf4,0xf4,0xf4,0xff,0x82,0xf3,0xf3,0xf4,0xff, 0x83,0xf3,0xf3,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x08,0xe3,0xe3,0xe3,0xff, 0xd4,0xd4,0xd4,0xff,0xd6,0xd6,0xd6,0xff,0xe5,0xe5,0xe5,0xff,0xf5,0xf5,0xf5, 0xff,0xff,0xff,0xff,0xff,0xfa,0xfa,0xfb,0xff,0xf4,0xf4,0xf5,0xff,0x83,0xef, 0xef,0xf0,0xff,0x82,0xee,0xee,0xef,0xff,0x82,0xed,0xed,0xef,0xff,0x01,0xed, 0xed,0xee,0xff,0x82,0xec,0xec,0xee,0xff,0x82,0xeb,0xeb,0xed,0xff,0x01,0xeb, 0xeb,0xec,0xff,0x82,0xea,0xea,0xec,0xff,0x82,0xe9,0xe9,0xeb,0xff,0x11,0xe8, 0xe8,0xeb,0xff,0xe8,0xe8,0xea,0xff,0xdb,0xdb,0xdd,0xff,0xd1,0xd1,0xd2,0xff, 0xd6,0xd6,0xd6,0xff,0xe5,0xe5,0xe5,0xff,0xf5,0xf5,0xf5,0xff,0xff,0xff,0xff, 0xff,0xf7,0xf7,0xf8,0xff,0xeb,0xeb,0xed,0xff,0xe3,0xe3,0xe7,0xff,0xe3,0xe3, 0xe6,0xff,0xe2,0xe2,0xe6,0xff,0xe2,0xe2,0xe5,0xff,0xe1,0xe1,0xe5,0xff,0xe1, 0xe1,0xe4,0xff,0xe0,0xe0,0xe4,0xff,0x82,0xdf,0xdf,0xe3,0xff,0x05,0xde,0xde, 0xe3,0xff,0xde,0xde,0xe2,0xff,0xdd,0xdd,0xe2,0xff,0xdd,0xdd,0xe1,0xff,0xdc, 0xdc,0xe1,0xff,0x82,0xdb,0xdb,0xe0,0xff,0x0f,0xda,0xda,0xdf,0xff,0xd9,0xd9, 0xdf,0xff,0xd9,0xd9,0xde,0xff,0xd8,0xd8,0xde,0xff,0xd0,0xd0,0xd3,0xff,0xcc, 0xcc,0xce,0xff,0xd6,0xd6,0xd6,0xff,0xe5,0xe5,0xe5,0xff,0xf5,0xf5,0xf5,0xff, 0xff,0xff,0xff,0xff,0xf2,0xf2,0xf4,0xff,0xde,0xde,0xe3,0xff,0xd2,0xd2,0xd9, 0xff,0xd2,0xd2,0xd8,0xff,0xd1,0xd1,0xd8,0xff,0x82,0xd0,0xd0,0xd7,0xff,0x06, 0xcf,0xcf,0xd6,0xff,0xce,0xce,0xd5,0xff,0xcd,0xcd,0xd5,0xff,0xcd,0xcd,0xd4, 0xff,0xcc,0xcc,0xd4,0xff,0xcb,0xcb,0xd3,0xff,0x82,0xca,0xca,0xd2,0xff,0x0f, 0xc9,0xc9,0xd1,0xff,0xc8,0xc8,0xd0,0xff,0xc7,0xc7,0xcf,0xfc,0xc6,0xc6,0xcf, 0xe9,0xc5,0xc5,0xce,0xd5,0xc4,0xc4,0xce,0xc0,0xc4,0xc4,0xcd,0xab,0xc3,0xc3, 0xcc,0x96,0xc2,0xc2,0xcc,0x81,0xc1,0xc1,0xcb,0x6c,0xc1,0xc1,0xca,0x57,0xc0, 0xc0,0xca,0x42,0xbf,0xbf,0xc9,0x2d,0xbe,0xbe,0xc8,0x18,0xbe,0xbe,0xc8,0x04, 0x97,0xff,0xff,0xff,0x00,0x2b,0xff,0xff,0xff,0x04,0xff,0xff,0xff,0x0e,0xff, 0xff,0xff,0x0f,0xff,0xff,0xff,0x10,0xff,0xff,0xff,0x22,0xff,0xff,0xff,0x24, 0xff,0xff,0xff,0x25,0xff,0xff,0xff,0x35,0xff,0xff,0xff,0x3d,0xff,0xff,0xff, 0x40,0xff,0xff,0xff,0x4c,0xff,0xff,0xff,0x5d,0xff,0xff,0xff,0x61,0xff,0xff, 0xff,0x67,0xff,0xff,0xff,0x82,0xff,0xff,0xff,0x86,0xff,0xff,0xff,0x8b,0xff, 0xff,0xff,0x90,0xff,0xff,0xff,0x94,0xff,0xff,0xff,0x99,0xff,0xff,0xff,0x9d, 0xff,0xff,0xff,0xa2,0xff,0xff,0xff,0xa6,0xff,0xff,0xff,0xab,0xff,0xff,0xff, 0xaf,0xff,0xff,0xff,0xb3,0xff,0xff,0xff,0xb8,0xff,0xff,0xff,0xbc,0xff,0xff, 0xff,0xc0,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xcc,0xff, 0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff,0xd8,0xff,0xff,0xff,0xdb, 0xfd,0xfd,0xfe,0xe1,0xfa,0xfa,0xfb,0xe8,0xf8,0xf8,0xf9,0xee,0xf5,0xf5,0xf7, 0xf3,0xf3,0xf3,0xf5,0xf8,0xf0,0xf0,0xf3,0xfb,0xed,0xed,0xf0,0xee,0x82,0xed, 0xed,0xf0,0xff,0x02,0xee,0xee,0xf0,0xff,0xee,0xee,0xf1,0xff,0x82,0xef,0xef, 0xf1,0xff,0x82,0xf0,0xf0,0xf2,0xff,0x82,0xf1,0xf1,0xf2,0xff,0x01,0xf1,0xf1, 0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff,0x82,0xf3,0xf3,0xf4,0xff,0x02,0xf4,0xf4, 0xf4,0xff,0xf4,0xf4,0xf5,0xff,0x87,0xf5,0xf5,0xf5,0xff,0x01,0xf4,0xf4,0xf5, 0xff,0x85,0xf4,0xf4,0xf4,0xff,0x01,0xf3,0xf3,0xf4,0xff,0x83,0xf3,0xf3,0xf3, 0xff,0x82,0xf2,0xf2,0xf3,0xff,0x82,0xf2,0xf2,0xf2,0xff,0x82,0xf1,0xf1,0xf2, 0xff,0x01,0xf1,0xf1,0xf1,0xff,0x83,0xf0,0xf0,0xf1,0xff,0x83,0xef,0xef,0xf0, 0xff,0x01,0xee,0xee,0xf0,0xff,0x82,0xee,0xee,0xef,0xff,0x02,0xed,0xed,0xef, 0xff,0xed,0xed,0xee,0xff,0x82,0xec,0xec,0xee,0xff,0x01,0xec,0xec,0xed,0xff, 0x82,0xeb,0xeb,0xed,0xff,0x82,0xea,0xea,0xec,0xff,0x04,0xe9,0xe9,0xec,0xff, 0xe9,0xe9,0xeb,0xff,0xe8,0xe8,0xeb,0xff,0xe8,0xe8,0xea,0xff,0x82,0xe7,0xe7, 0xea,0xff,0x02,0xe7,0xe7,0xe9,0xff,0xe6,0xe6,0xe9,0xff,0x82,0xe5,0xe5,0xe8, 0xff,0x06,0xe4,0xe4,0xe8,0xff,0xe4,0xe4,0xe7,0xff,0xe3,0xe3,0xe7,0xff,0xe3, 0xe3,0xe6,0xff,0xe2,0xe2,0xe6,0xff,0xe2,0xe2,0xe5,0xff,0x82,0xe1,0xe1,0xe5, 0xff,0x82,0xe0,0xe0,0xe4,0xff,0x06,0xdf,0xdf,0xe3,0xff,0xde,0xde,0xe3,0xff, 0xde,0xde,0xe2,0xff,0xdd,0xdd,0xe2,0xff,0xdd,0xdd,0xe1,0xff,0xdc,0xdc,0xe1, 0xff,0x82,0xdb,0xdb,0xe0,0xff,0x82,0xda,0xda,0xdf,0xff,0x04,0xd9,0xd9,0xde, 0xff,0xd8,0xd8,0xde,0xff,0xd8,0xd8,0xdd,0xff,0xd7,0xd7,0xdd,0xff,0x82,0xd6, 0xd6,0xdc,0xff,0x82,0xd5,0xd5,0xdb,0xff,0x05,0xd4,0xd4,0xda,0xff,0xd3,0xd3, 0xd9,0xff,0xd2,0xd2,0xd9,0xff,0xd2,0xd2,0xd8,0xff,0xd1,0xd1,0xd8,0xff,0x82, 0xd0,0xd0,0xd7,0xff,0x05,0xcf,0xcf,0xd6,0xff,0xce,0xce,0xd6,0xff,0xce,0xce, 0xd5,0xff,0xcd,0xcd,0xd4,0xff,0xcc,0xcc,0xd4,0xff,0x82,0xcb,0xcb,0xd3,0xff, 0x12,0xca,0xca,0xd2,0xff,0xc9,0xc9,0xd1,0xff,0xc8,0xc8,0xd1,0xff,0xc8,0xc8, 0xd0,0xff,0xc6,0xc6,0xcf,0xff,0xc5,0xc5,0xce,0xfc,0xc5,0xc5,0xce,0xe9,0xc4, 0xc4,0xcd,0xd5,0xc3,0xc3,0xcc,0xc0,0xc2,0xc2,0xcc,0xab,0xc2,0xc2,0xcb,0x96, 0xc1,0xc1,0xcb,0x81,0xc0,0xc0,0xca,0x6c,0xbf,0xbf,0xc9,0x57,0xbe,0xbe,0xc9, 0x42,0xbe,0xbe,0xc8,0x2d,0xbd,0xbd,0xc7,0x18,0xbc,0xbc,0xc7,0x04,0xa8,0xff, 0xff,0xff,0x00,0x1b,0xff,0xff,0xff,0x18,0xff,0xff,0xff,0x1e,0xff,0xff,0xff, 0x1f,0xff,0xff,0xff,0x30,0xff,0xff,0xff,0x41,0xff,0xff,0xff,0x42,0xff,0xff, 0xff,0x4c,0xff,0xff,0xff,0x69,0xff,0xff,0xff,0x6b,0xff,0xff,0xff,0x6e,0xff, 0xff,0xff,0x94,0xff,0xff,0xff,0x9a,0xff,0xff,0xff,0x9d,0xff,0xff,0xff,0xba, 0xff,0xff,0xff,0xcc,0xff,0xff,0xff,0xd0,0xff,0xff,0xff,0xd4,0xff,0xff,0xff, 0xd8,0xff,0xff,0xff,0xdb,0xfd,0xfd,0xfe,0xe1,0xfa,0xfa,0xfb,0xe8,0xf8,0xf8, 0xf9,0xee,0xf5,0xf5,0xf7,0xf3,0xf3,0xf3,0xf5,0xf8,0xf1,0xf1,0xf3,0xfb,0xef, 0xef,0xf0,0xf0,0xee,0xee,0xf1,0xff,0x82,0xef,0xef,0xf1,0xff,0x83,0xf0,0xf0, 0xf2,0xff,0x02,0xf1,0xf1,0xf2,0xff,0xf1,0xf1,0xf3,0xff,0x82,0xf2,0xf2,0xf3, 0xff,0x82,0xf3,0xf3,0xf4,0xff,0x02,0xf4,0xf4,0xf4,0xff,0xf4,0xf4,0xf5,0xff, 0x87,0xf5,0xf5,0xf5,0xff,0x01,0xf4,0xf4,0xf5,0xff,0x85,0xf4,0xf4,0xf4,0xff, 0x01,0xf3,0xf3,0xf4,0xff,0x83,0xf3,0xf3,0xf3,0xff,0x82,0xf2,0xf2,0xf3,0xff, 0x82,0xf2,0xf2,0xf2,0xff,0x83,0xf1,0xf1,0xf2,0xff,0x83,0xf0,0xf0,0xf1,0xff, 0x83,0xef,0xef,0xf0,0xff,0x01,0xee,0xee,0xf0,0xff,0x82,0xee,0xee,0xef,0xff, 0x02,0xed,0xed,0xef,0xff,0xed,0xed,0xee,0xff,0x82,0xec,0xec,0xee,0xff,0x01, 0xec,0xec,0xed,0xff,0x82,0xeb,0xeb,0xed,0xff,0x82,0xea,0xea,0xec,0xff,0x01, 0xe9,0xe9,0xec,0xff,0x82,0xe9,0xe9,0xeb,0xff,0x04,0xe8,0xe8,0xeb,0xff,0xe8, 0xe8,0xea,0xff,0xe7,0xe7,0xea,0xff,0xe7,0xe7,0xe9,0xff,0x82,0xe6,0xe6,0xe9, 0xff,0x82,0xe5,0xe5,0xe8,0xff,0x82,0xe4,0xe4,0xe7,0xff,0x82,0xe3,0xe3,0xe6, 0xff,0x01,0xe2,0xe2,0xe6,0xff,0x82,0xe1,0xe1,0xe5,0xff,0x82,0xe0,0xe0,0xe4, 0xff,0x82,0xdf,0xdf,0xe3,0xff,0x06,0xde,0xde,0xe2,0xff,0xdd,0xdd,0xe2,0xff, 0xdd,0xdd,0xe1,0xff,0xdc,0xdc,0xe1,0xff,0xdc,0xdc,0xe0,0xff,0xdb,0xdb,0xe0, 0xff,0x82,0xda,0xda,0xdf,0xff,0x82,0xd9,0xd9,0xde,0xff,0x04,0xd8,0xd8,0xdd, 0xff,0xd7,0xd7,0xdd,0xff,0xd7,0xd7,0xdc,0xff,0xd6,0xd6,0xdc,0xff,0x82,0xd5, 0xd5,0xdb,0xff,0x07,0xd4,0xd4,0xda,0xff,0xd3,0xd3,0xda,0xff,0xd3,0xd3,0xd9, 0xff,0xd2,0xd2,0xd9,0xff,0xd1,0xd1,0xd8,0xff,0xd1,0xd1,0xd7,0xff,0xd0,0xd0, 0xd7,0xff,0x82,0xcf,0xcf,0xd6,0xff,0x0a,0xce,0xce,0xd5,0xff,0xcd,0xcd,0xd5, 0xff,0xcc,0xcc,0xd4,0xff,0xcc,0xcc,0xd3,0xff,0xcb,0xcb,0xd3,0xff,0xca,0xca, 0xd2,0xff,0xc9,0xc9,0xd2,0xff,0xc9,0xc9,0xd1,0xff,0xc8,0xc8,0xd0,0xff,0xc7, 0xc7,0xd0,0xff,0x82,0xc6,0xc6,0xcf,0xff,0x0e,0xc5,0xc5,0xce,0xff,0xc4,0xc4, 0xcd,0xfc,0xc3,0xc3,0xcd,0xe9,0xc3,0xc3,0xcc,0xd5,0xc2,0xc2,0xcb,0xc0,0xc1, 0xc1,0xcb,0xab,0xc0,0xc0,0xca,0x96,0xbf,0xbf,0xc9,0x81,0xbf,0xbf,0xc9,0x6c, 0xbe,0xbe,0xc8,0x57,0xbd,0xbd,0xc7,0x42,0xbc,0xbc,0xc7,0x2d,0xbb,0xbb,0xc6, 0x18,0xbb,0xbb,0xc6,0x04,0xb8,0xff,0xff,0xff,0x00,0x0a,0xff,0xff,0xff,0x0f, 0xff,0xff,0xff,0x2b,0xff,0xff,0xff,0x2c,0xd7,0xd7,0xd9,0x3e,0xc3,0xc3,0xc7, 0x7d,0x9e,0x9e,0xa3,0x7e,0x8b,0x8b,0x92,0x94,0x84,0x84,0x8b,0xb2,0x77,0x77, 0x80,0xc5,0x77,0x77,0x7f,0xe8,0x82,0x77,0x77,0x7f,0xff,0x82,0x78,0x78,0x80, 0xff,0x83,0x79,0x79,0x80,0xff,0x82,0x7a,0x7a,0x81,0xff,0x01,0x7a,0x7a,0x82, 0xff,0x82,0x7b,0x7b,0x82,0xff,0x01,0x7c,0x7c,0x82,0xff,0x82,0x7c,0x7c,0x83, 0xff,0x83,0x7d,0x7d,0x83,0xff,0x03,0x7d,0x7d,0x84,0xff,0x7e,0x7e,0x84,0xff, 0x7e,0x7e,0x85,0xff,0x83,0x7f,0x7f,0x85,0xff,0x83,0x80,0x80,0x86,0xff,0x82, 0x81,0x81,0x86,0xff,0x82,0x82,0x82,0x87,0xff,0x01,0x82,0x82,0x88,0xff,0x83, 0x83,0x83,0x88,0xff,0x02,0x83,0x83,0x89,0xff,0x84,0x84,0x89,0xff,0x83,0x85, 0x85,0x89,0xff,0x02,0x85,0x85,0x8a,0xff,0x86,0x86,0x8a,0xff,0x82,0x86,0x86, 0x8b,0xff,0x82,0x87,0x87,0x8b,0xff,0x83,0x88,0x88,0x8c,0xff,0x82,0x89,0x89, 0x8c,0xff,0x82,0x89,0x89,0x8d,0xff,0x01,0x8a,0x8a,0x8e,0xff,0x83,0x8b,0x8b, 0x8e,0xff,0x01,0x8b,0x8b,0x8f,0xff,0x83,0x8c,0x8c,0x8f,0xff,0x03,0x8d,0x8d, 0x8f,0xff,0x8d,0x8d,0x90,0xff,0x8e,0x8e,0x90,0xff,0x82,0x8e,0x8e,0x91,0xff, 0x82,0x8f,0x8f,0x91,0xff,0x01,0x8f,0x8f,0x92,0xff,0x82,0x90,0x90,0x92,0xff, 0x82,0x91,0x91,0x92,0xff,0x82,0x91,0x91,0x93,0xff,0x83,0x92,0x92,0x94,0xff, 0x02,0x93,0x93,0x94,0xff,0x93,0x93,0x95,0xff,0x83,0x94,0x94,0x95,0xff,0x01, 0x95,0x95,0x95,0xff,0x82,0x95,0x95,0x96,0xff,0x82,0x96,0x96,0x97,0xff,0x82, 0x97,0x97,0x97,0xff,0x01,0x97,0x97,0x98,0xff,0x84,0x98,0x98,0x98,0xff,0x85, 0x99,0x99,0x99,0xff,0x01,0x98,0x98,0x99,0xff,0x86,0x98,0x98,0x98,0xff,0x82, 0x97,0x97,0x98,0xff,0x83,0x97,0x97,0x97,0xff,0x82,0x96,0x96,0x97,0xff,0x0f, 0x95,0x95,0x97,0xff,0x95,0x95,0x96,0xff,0x95,0x95,0x96,0xfc,0x95,0x95,0x96, 0xe9,0x94,0x94,0x95,0xd5,0x94,0x94,0x95,0xc0,0x94,0x94,0x95,0xab,0x94,0x94, 0x95,0x96,0x93,0x93,0x94,0x81,0x92,0x92,0x94,0x6c,0x92,0x92,0x94,0x57,0x92, 0x92,0x94,0x42,0x92,0x92,0x93,0x2d,0x91,0x91,0x93,0x18,0x91,0x91,0x93,0x04, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xea,0xff,0xff,0xff,0x00 }; static const GdkPixdata sdi_pixdata = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 25540, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 780, /* rowstride */ 195, /* width */ 60, /* height */ sdi_pixdata_pixel_data /* pixel_data */ }; nvidia-settings/src/image_data/opengl.png0000664000175000017500000002024712236467170020703 0ustar albertoalbertoPNG  IHDRm<-gAMA7tEXtSoftwareAdobe ImageReadyqe< 9IDATxb?9 ]z9~=:A6𴣷0Ph&qHD+7 T .˚=Vb/ة?}gxP4mթ1Oa ;(wZ<T.7<6ػ9H{rK[}( {cada UYvM' l`bA| @TiGn]qpqjǞ+7Aqe 4 bU xdZ00<'[˗\<< :64Hd#/FBP< w 26'8qsO?=wC5@)zskg^gBPZeڵ#' ' T P?xX E@lsNI0o!$s% 4p7nُk2?a+2b M,M1H.yъ ^5CH_urFx@:(. ^@ 0ԙcW=P @E- '4{Մ#~G/9bqG/O 21\|P ĕP'j]䖔It-Nߟ, ĿX1(~YuaXT r??@5?bM@ p+Ks˪<ޕw?^9v= ; -qpеrv3!nN_Jw"(@nYSFZ2g3:07MuMe(%cw+ 1|ǏũgTMi@ J@| #(_RGEIiA E@?Ԛ5Pb ~@Js P `qI U//^ů_?΍+N]~njM"K/^ރ@\ZPs-7ܲWTb0N޸߿3-vK+x!Gei@ 5c;*# gX5ÂMP,F[?>}0H4Au ^ J,P_-Qe>#r kh߲DO'O55.X#*)-=*@}Ae%Ќ6·}:ܒf߰p1p~|}8mv%s Hf4?"\IDǠ AfCQi)ʙ{+ּ>8>ėϰ @A&hMe9ԅdT=lv(waB2$\@ ~W($@toy01 cK/`K-<%&.#R`đA`wk72_YU\P ZªvXrU Qyʝ5?44x&֚ϟ\Uh P D$h3T@] VQ2Wshߞص +(@WH~*,ϟXOR ZT 6YnϺjh[P !|ֹ5+\M|#e eh|w^aAtW,Ÿh(t Sgmɵalz-[Cx)4` X`)@jBgϭ7%}l]wk;_oee>JJg0$N:h=4*i0!Qzj-;yS޾װEv0&7eVǞ,6nTAosǼkS!(l)ܿ<8s?JՅ2S=Y#R[.욹5cz=*m_h%lk,+k)@ +`4B$rlh4+鴴g?M!EUs׷.[)fc˓]`ӡoR1Bw00hVàF"Θ+=WgM!NFaj=*`O{z{}h2lLuyM(zsO:_!",$*cxt|T,Q~N}2ٜZ֕,k ACqǑJ 'Dtl)-h|찺8_(Jy}\2SI`3_GD{r@lr'CCe~-ֲ7=]zcyAw =krl-7תj4s !UL4Tg"$e֪UR ;?xd~A; 3 I.).lɘςaԀ&dQSk&$y@*}lXcҒz? uMM}e{}nhh0>$_$~q,oe8)p!N qRn^@A*DT)JDHEB KEハnj˶-9O%$MUmx.2H O22$NWvۼ:=(  )RkkM 仩Jn_oTB}Cti'PVپz=YSgn=كc}2c>.=vmHWKXќbrްrk0QmR}mB~ưAcֹ12Tltp~2D HpGIEbIw55JsvyCW`,}ʊ'*ʯJlKݟ}ńN=D-FٙT?ؾSr/FВY+&?P.uѴU+ީSF+ǯ:G =yG0jA ' N=,`IOD}w\T6`袵\2g+\$!n5jX(Wߜg/׺ O6]1hA4*U2,7_|[_Ed| dT]*,?/VwؐAuCvPM4}qӄH4ZVR۩WfXD2'H iT%aq:˂۶7jU qEaFM,&Y֪ )ojkGʃC' @PS~,Mr73m s\ \Y+hhxaر: *ԗ*~]Y (69ዓ0@dv$cJ[{l;ѭG%]ݿ 1,q4O7FNk_}iaLVԘv]'ڱkz!jYO.bnvr <ʞtT.9&3'L؜sMQZŴe%BKzi'Ŏ_Eخ}۱mrWÉ |=YOI}GY}'6~Q(Dl:9n:yn zPdwfUUUʗ:ͫD֙B܂vOLo76=7FmjD}eǖ^y;M9h;D/}cْ +W@@VݍܣlI'fC 02XMcn/I?5oGfg|? sĆVѯr fflMƚaII|/FZθV$?jT$ 18,eP3mn0q=4XSs8*⒊hJXQ`2-C1p j=_ MyeXhsFܪ~,"2N=(Px¼G?]:w<49O|X@B$&3U^;y d# V9^t<#L.VTqI;Vh:(4v+ k9n e/-٨?àurP`@߸x; )F8EcPae k4qq`[-Pu4u=}xl~h,O%J qb(8/+7Joڥ:u@B.񺺆l5+&,߈đˢ~lEM}/_VRR^ )    TT7//""* 3q ď@ u\s+adؾkϵ9 fd+*{O'x_@IXDi¤ 7ofx4CbR /`3r;uw ppr& r { HsZ;ߺu >Cc['Þm[rnݹ=˗.XRQC!,4AKMg RR wcPVVQt1(K2*2zm Nn AaG@uY`}]l; a ť'O``eccbggx Cx`rRӏ{o:{'_f898,[j^`34913, @JKT{ 2<}xaⴙ {!$$xݻ l@4@!`D/)/,$'0۱mÇǎLH >^Qf_2tU62;xGV˖. '^)i/XS"0&yQ sL ?fug5eE`# ںz޺{zU}Ӈ b 'سAVVa{\o`8~ [:?0m?_ja`sq3t 4ۄDDiH0U0y(X4eT6@UU5? ,, |<| d03cp~$6cd^_:c~Y?`g>3O@PLHHaՏ@e?SPhWJKXݻMo߼f` XPK2S ؉eW t?}۶_lastb*0#=SwcA[G7po5\I00%_/*-d$(hI) a@/ivykn Vbi ڀji /_mK[Ep ,W[ Y0ܡtbJA0%"0%,(13d]PYSd !8607 hox;==<ݝ皿$ QԚaMі? |?3){öS`vέ^ =Y!Z ]tvz:y8 9<>ۘ (+}A6&إTM& i6 'BWu-4\^ B'!+O@otKU5$E" PVVECPPbⱀqEcAjou#=d20D 2|W(:!oɶ'|45=&'khMMN#D|:+#4*ɶ@ݽHyϳx2K#"_o0;}2 D1q.cgWTV_vkTQ6 xA7z\\VÉR=̬fV{~bc7\.׺n'گȣin֍ 7&|Gsrَ}{ҡ vM rYTT_%($tmss4c/Y|;L`og7j U,W`"W$ iu@,Jtd8}]<q'V+GXɡhs8.eJNe*ƍ1*0P܃Ux1^^32m_OЇ2=!Lc@B$偏J G Ҙ-64 RRn&HIM.su8tZ3v<;&8 2hdR !>.yf>Q¿дٞdRшUGǭO ̫y QL@*c2_\:Aɓ IpDxLd=UΎ>UD*' iii (lJ焈Du$2$,u7W}[ݺ'D悳:vw1k OK믾j`""߬)ٔQ;0wA@͕+EpQP)o oWL&&00Qh9(||6)Be-'QUnI۶l,v/ i5 !Z;ݔ{pp028ddF$6lk_bDX]ZZN9Sv.yLw]+^vCXdB׀ ۭ ~|E96>.b1tཌྷM7lS}cm#B4%NԞV%b%tI囆}KTr AREx,Qsؔ {P)o5=6g!Xl,*"h[F-015 f3\iD2Bّ6ߏM2XZRrkn4|Qx-/36$¥0MQw:,5b[SBM T~@\0F`@ B\;k5Lm`'H267u';"yg04;ݩQ}Oxi][{>Zk7fe_Ua3e[g h?*+]λ} $j&h\$iFbHb9tfv|ncV5uMt?"$28O Z($6gG"Οxom|lx4B~BaаT.QF'hguRN#3Vvq,ll6HSjg~l PF5yfKK"!= $ (,l."Z{j=3=RS;mKTk]`qaY I 2VO=?;怐|{.3o곾?`O)P_w뗒C6QJH7ܹs[KkbuUko\fllF2VΞ-|=4\aE-_+ِjZZ]>+˓lbX`ieI%(D}:Jq./@ 7i'[FkӃGxnjgŷ*CWk!>>"Gb)?!`aa/,y.2:1>9*$w=x]~,5 QцgfH$rDܰLVK~F0sbuBlme Z%oc:!`/DnJH˄oHψ~ʀ Tvw]}{,)>M@ŗ_*id}v%DB}Yu E`fnLŌ“wXbbmTh5 fpGNU,`W a n"P*&B_Ok<=I0kmQ1)hEmqz1vk|b̙9M{و@ʔIw9Ml`{'`ӦMUggQmmms cn<5/{;!N191B.=njOƸ-G=$ԩA$0*^QQQϕI~2NMG(v"nj>dtmo/]*Y`ޠǯV0%i"I8Tp ]Jl/ر1BGDMOR!\ 4*yL2 CfϞ 9=^{ClLDFb1W\a^`'NrX`>b;F6` mmmT o#LqWI<*3Vz{{w9zlRgN؉<]r;ۭe兞^r ɩ=hi4B~"KK >zLa%u`8w._cc NⳂs''N|Ą̌9Uh($#;J3c&7bbGmLcdɿRO9Fi4@=Mv FmNBrۙ czWч2 ONN>GG-[ !;}Tr]R}d2ؽ{w-.&uYW7bp,\Df<˱r#!A"f0]+m+&@#n0Ac 94–7ٸܔHӨ1+Њ}]3Z}ww_\S/qccôo!|5LU;JKN.88ڳ#~*nq _\Rޭ[$UF#Ylgcbc!a8:X"Fo.d C[kۿ~9J?X"ide`O)#).i9g+-l|1"2f\Lhk&ouݑ><b"eyЅ~%K&u2N>K؀f䐐PE1Ne7lٚ)nD3:ܘ]=fk?\L4WlD"H`A uZYQ^Gɗ^> @ndD4pCe͸?8+wJS&@NqgρVtM$;^D gc÷܆e0{t05o˫jdr9uX~\r0o^ݻ^ZNhlr7^& c&<""\fƐ^;TwW0 _-7gNQ.Y5g_>^$EO PX$Q(,,`²%?n46@:w@Z͹}Ns>>Ԩaepظաof}|V͌-KICD)1X?ZCLr.}nKF)`;99%9ORKKlPUUeF=rx?&m3\wIZO P:> Sfg`fΟ#FFXGPh鳐3fuA@|O!l(Xyp왦s#.N4.ҖָnK\It۹Q^~M"5mqy!ـqC1Qp2a^F&( ܿlp$Pv|)Y\ zX5'[=A7iɽZ8t܆i G4 1KtǚGawيbΟ;*ۉX"]_;c&<޵ӂF]ܻ{7 \AAF`L'~_^V\{K xd}}u|Qmr.DjhԷ5ϝP*u knt;=ӔB< kE\,6W;@a|h8$oЊ?Cܰ{9\Skb'o@0K Ym (;IENDB`nvidia-settings/src/image_data/dfp.png0000664000175000017500000001276012236467170020171 0ustar albertoalbertoPNG  IHDR*<gKKgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?6"Ν۷_>}gaIXv:ï~ %4%~|o8F 1\ >| qu{212h3`#XboCCB)Ă0#60ܿcǁ7ogzI{DgP3ˋ/?}3Ñ< ,gϞ>w12s 00:M>oz?>>&2+6}hN38Ĉ+p0ܽ NR  cx, L )N}8?us3Ɋ00gd`2ß6woV`g=qý?Xٸ~?`ouɡ& ^|dq>n~ ːhДA`:}3;ДΜ9͐7,{7o>( 0'60 6iBvpqKZԮ'!d.(袢 pbm.y{} =~[>߈Pҷb֨[V[zb|Zv,ۅ/(qTck Ìݩ(}pBQ]a !7՝mp@[ 8G>l$nS`.h9`E/FH9kg"L"NEt̓ө@#MҒ@&$A5/ FsۥǛqؗU8np7Ǽg'4+a Bu\pQazfcdӏ[r(C,쬌&Lj~ ߨ0z l0^@w= zr Nos)e"/+R*:_)6 {}R׭VNQ=54 )@A&KbKF?B.L aaF X"S4=ՔUD4ͫE{=w&Iɂiylnn! KcqqYsD_]}N蕚V-뼻3i+2iR$H$IÉTXvx.^ % ;٨_܂X9( ho $ h9Rq7YA9g$lRrk]73B?h48ej1`BYeڬZ0tUYɐLl2sh~czQQqTc:v\*NU0“L& *&e rzzrjs&TD2X2>‘]!1EHe`768 YZQc&z:/Z&$VGlHʋʲ{K,*y_dla$rdͶסcePmvpIl&X<@`5=yvciUαЂ꪿0?[Z '}o;ikg'lNMMCCMZ֣:};kZL d{R\BK:]\^۸0~fFoYTND&&8 v\I -$ċ.C7]0n)]i٤!P)]ChS;NjƊUz4;W#+ .Ysty|w|('!TB~{! \wwOcާ O~KNzm?2FpO xhccHAuH=ZYzBp+JO,[xC #C$A21S_|ŦH,ACqȞB/iyu$v;*Thdߞ)3ox*BGrʐMxPHo`@nm\/k񮸾qY#z :?Qfac ɂ8}Vv>ߎ ֬ވfS( zbWpז1 BILHp@Sl{\!1Dױ" n:(6 ժc?EqبjBt$D KͶ!JF#DDJ=i RF766yh=oЯ+u <|3jo,E^#g'nV8+jo"~#1z-R (+n# $ :SnLTX> {Bjnąo9o8Lпjۨ,.,qMq3 c<+Io~!qOGJOvu]d4]6yrsBx,[(7Q \+tT6ZE `@$DyK n*)/`Sm3 (%R\M# .uLժRlQWWN D(Ҿ6RAyL!)a0TtԢ톁E#t4R6NC}#h_fֵg b l~]!oxtՠ4h !H_~f: [0!#e: I sDԥP5H8_dǷn_YD_̀dL].X=|ǭ[_<BQ'sGRMo0J9ܢ "<>/hnsMpL{[7'}a\AB!'wy|l=3sE7kJS)$OBx<=$_E!JP0\$ Jss?q>.@?rezL=+ښք{gg?1O}U uEGmJ$c s,'vL7?)?kqGxu{{ǧtHBò-9@Z΅U#E p$ .41)EbHHE{7{Y"#'@ #{;?}?';C}-7Vi evu9f'Lf: 3~βI2˖)f12 Mg1'֭x$5vWǩ BL6 '̴YbM ֊$E /S@}"$WDiJ8r\m8DI\= |c5=#Or*wzp/bى5yh~-f9TE|K)$G&˰#ǀmM?NN-ȈߡITi(UmM `&7tpheeCSq+1JpHS[')*2b>Οr@h:;o8/ uLX=KB{0DưrvI!IiPcN`w%1 FۭVB.2Ҫ/Nkg]C"2 bgQUx5Oiu&Cx@m4{@ǁ>Nk6; ^Χ~TUj),E" 1eȪqaLA),Ơ?33S8m%ؽGMsS<1x PR ;UIX07d8=*Eq d KVwn cKnzRQV[\i19lRU_3݇uEM }(!/SdC6.W)kJ,L8˚(WټYfjqBs^91n'ΎT.vBD1NAjYi(δ4S@Nc5T,X*Fl ̉ߚGڣ&5=(= ͸#slQ󨌋fiֶ0O16,5*cH)Q[( ^j.vP0S'݇`V-W1[t@wvv tA'PΙe$f145GV]Qhyy`ccml]ܳlj4e>U7o.G+l: BTqis\DףvC&q p^IGGXl{#HZ7 hz=@9^[3SܕG8#GtpjfՙIR׏X5 BGn%"U48(*VlrXup-ۙs}1|iYaOrnEvur v|thY&IbHL*61خM)`db 욃cDӖYi^*-mS+H&VqW''? ']:UdՖFZi*yw=TRgI[]>]oFW}8c A0axC̤Lt|~mF 1Af)68 Ic% Wëf-m,p1IBFN@ZDJeUF(룅sE8q#e qNue\-W(pMм)'cmO `0L$b Br>TMfuڮ3BFQrB0|Upoa^+廩YOP%n7" F|" әuΟ\U;oP=M U*H(T~3; 0!&N0 N  UQA$$-þcspeY~TTJiNr}Zs\ZUQ/OBx/{Xz;4b݃Z0$=<}J H% 뷟.h2$ JD+!b451R}CT H 5}#ltyQN=]|S}[6h:a *i4_1bBz銃-h8ו/M[Q,*mup{; )y̧"GHu݀'$X &*193 fժ<MmK9&Er3a*T1 Ȏa74K}s=M&2ߡ͑o7]P"NaZuEA ǫTiAf)mAx]!Ƀ<g2 Tbb=pdj4"E2A- cCبf}6'P$#s7Q'6˿Lx[ #$ 촢A_ m8pbL_*(cmtGGAE4/(U KYt$?2qe(d7 [Fw۰aQli[eI>'?zn|e#Ms=Nh N'^}}ЄHV%y= Ʉ=S%C?ߚSBNGdhh|I~n,+17\gYPR*ܦĺ]U+ Kcrs.3F[j`SiyTix?lKŢ4DNOS"-V^eH;uC¶|JֿP'X@EMLCa"ޣWcxYC&ӎǿ8+BR ^oY N.dW2gHtR?cm>&Rl?G =F`qܸ@?'Knj;\85I_:ӃDMc!L'0~<$ɬ᭞**oYY pj_ǩ)mGAhF:2ahOWrooG{G_CVPfq?~m=el5[T*,[t8̔&7Վ>Eb$Р, BjqbA<5z<b"%l(g16/a\4M%8ELI9j) l_:wGD+ uxUuXE|g&rIö;=1k ,ٳggwY BFf2H&64MѦSѱuqt_^~WgiD aRdmڦr! ׳H`v>oY*R=OxLhp[GG* 0}d7-w83x_KD@u70 ['¡'dvݷ'_8q]poW'A  9*F_V$gDA!¥JS˳?EPw$W}"WBrqNZ]l-ɡX@4G}Kǹ6KT;@c?s 5J4 ͯfY'Ld WaǢ#,cj I OM;f+tNj^qAsⶏ^?42:y/j9 buZTedLQ-bp9vA=x)'$8wf&D$I6F t6"L_+ӷsn!c4~*f&fgr9kSTfN8:Ȃ*PVp)MPH{ąiEDu&6JҲBLÈEJ%Zݒ^V!BP~j'_־5X=U\m1ku\zl|?5=x!n@VWX YPl+5wVoK5lgnC3~u??Bc8PITw5_,Rnz|idn9[CG{Iܷ gW'"5Pys\iq͌G`|5(@2 ĨSj|J"]3*"q9+6Lc#]>`\jrŠʰ) xE\ >ȃ޻gV]7W$Jkks ; q,? *ӣiހBm>j]YbvcO~}#R3 xoɊ#rk'ٲ}19>I?=TQmlX]Vk%9zEZ*N(cP,hcЛ;$7OcmHFv~&Wݹ/WlC0}!7'0 Zt[:6:O)qTgmi8Ѐ=%h_߆>mzYTdXFypUM8R&aq;$.Y'єS~>{vmZ\-!~MvRpEu$LD{Q7IB>q^5ri,]=.}ChM>$[LMec܎&ދyRZ >乞*{l|y۳9l=Kuz tH2mE$rd- o8 ᎪQk{݇/"[ts cHOūֶxaʽz\G7ʠT̢y54# æYvUxy.ڃ𹯽HHa y mUhZu|T[VұvjG3t2XFPy( Ј!䝰>;wPcM;;SDC0Œg}V%]L0fA$&淨Kϣ[PW wӧ#ȴ5gӨc' S ]䥏SҬlDwry5W>lYSJ u(]lu9d=)lQ`]SS .M}5j4B9Ez.. G``R<6l=VkGoHsKzd&Lf-IԙW[[Gn-ORq\<%g9]d 9R-ʦtRR:߽x?C"LM&Ϭ)VlLAäÉMM zhoZHҸeW?7204Og) Ю񀂧2@P][vô@""Uz8Eu#0ֵ#WQm*M[֮uCTh&@=Ո&DӴ({%K&yk /}AzgןK!6e¬9cn6b|U4,.NkOge/meSjFFTcVIՕ.5hV* >xc G}ݔC2y8&jFڱỳƗz! 'E Qȼ飞3 Ь 2}A9Ͻg]`:UD=ЈE0IB9ȭ+ 4f9Gpk'|ω Ŝoya(8!QY9}*\ڿ8rDAƚ̋$Ѝ%lgJ; Sl2}=0I 'U^۸X]yg EK^ۮ:٩drh6.`mhs#Лi(0L5^F jϠm=cU9]۷O>JG?~yc@4i2P*+R "%K"-飞x1µy 'ANZdm&"s۾ށL{nZLqWԵ¢?'*YBϞCC=T'40JsŲ%Hdq Z 9O !<uXB)q w%K}u9MfY^ۗP~ Ww#~XB i; րLgl&C#D%[xbQWa-^&+X)K4 ن䞸]o Tow^&!Zo̶9ʤ(јcC' dܩ'68иYa4NoOWܼn&炃^XUsgkV:|0p1r~VX'yRUGkuק*2Z]Q"548B<ٌZQx !Wa)n̽ 乒\ ꚺ| ^WzM ^kn@8udZu{Z/_#p:rӸt+qC/<&轃CƤ c<›\(M( TC @5vJ>ݹ:fv~Y#}w ] OI88{ŤxuZ[gQae`dķ>u/!%ϼ/T.WDac≈2DچAFzJKq3<>Onc R`]Կ~҂:$K*\Ȅԃ5!KĬB3 ?6L9Gˈ01\"CUQ?̼>6 b9I;}~hEr&xex`S P9ӏۨnlx_E {ݣ5dE1a5504އWG`@OǪip5wA'X~FimwG :HLh+F@0#4ẍ́aK|C~B<(FFlKmLr5dyh`*lȗ8t1Tu<ȆIݻiF{0/{G-=N.XEׂY8+s5}K|,0\h5bZhD,jє:Lj3RJU5*ț` VxSU+2:e+'sхu$Cti-O&bd[-|S{To&% $lyeڰfCӦ' Ee^8ahlMd%:>8U%=QyHmL7JJCj]P|Xx|Ł̐,V955'F=5/S1zێƁ8esY>4axV}=LFxKR}UeKDu/D.۔/Ż[J#l0ۀ{mч>d~>Mao*F, VΗœfS-BKe*OP Ki螿R3Rc:H2*"{vi!wD!y/f`S0[E3פ/8>¹fRo +LcAGtħ,^tcWr'_ZwL_-.j3veO* O:@QڂBkZ}Mx@tF6 S*Q.Ӟ] 9]TQF76SʗVM 5Y|55OyJdr*ҬQ9T6S\ RbRy(Uth'M0tx('GJ+Puj" "Pad (T.SX"&`tlvHÏW-)K']il\qwۓ˛"E$KElG"؉s5uѠMPESCZ͇A"E>ESAi6q qXUG,EoryswԖ!mMБ{o3fkB ͯl˦xR|}e eūK'V)AS)ٕ 1q?5&0ca}i9xCՅ<ܸ1 F5ڐ@qb9膆$- Č M8N\g֝oOG*ES"x X, F Dtvu@?Z-qic^ɶ[_e`2]7~CKK6PqЅ+V:|CŌXB"ۇdQWeW.1T@j`ydC׸X9˳p\ c4|i~=F{TJ"0{%ČaŦE Bˀ Ka -^g u@[ 9~z/:/VhI%S_E#SãمRG*70V+[4EM8+oUp飸%4evg&c~+h% 91uPhA \EF#b^] 0HZ*T[3ׯm(hOmeN.]ҭE}+-[sng{jl[c3u4,S\G X+`Vq$edj$D{s(, 2o<ص\ ^!`$C"jA xv%z,̍bXQ|:mCod$@ʀ%&E~ ~ #F`C!CI.J\ɐZڂgoY}?>}f{»26k47^`G;|:(lTKEg<.A7G( \vg.lĸKcp>/q ucuS1B N zm<78[E !̠i2+uI.N!2a `#rBDpYDGl_gīr%'s/WiAqbEN4 IY3qA~o:1l#BZ(]X0?G5р2kx}uhzVAz(_iOk&C*$wcCx͞^vžم *֪e.tLOƄya?ðӨ8-A6*rN&VşQymP.COh%me?3Lza}~fCnj J=Hq"Us uzȄ A'zhr FPB&l٨ >0F=6ӐPw֍\\7CE9ߥ)kO\7$aUJ3ڱ~\pޚ/<0\v=O%^j“!&d&7FHYtAS z 3=fXYfC1 ֘XDvu+NP4b h4F&Qwn=<5__=WsJǢVaȈK! "x|Ez0"3c`4)Bz2b"Yffe# 1FPxx]ts?G T: }#O|z`ai6Bg=f9o&"O`%FqHJ~cJUyao{{o!|{Yvܲ#-oDm^x䁩GGݱOWO a;u a%|Pij RFa2&F,,^ɸ<ؐ9>FbCPL"Y7?պ g>Ix-P/hd| ",L-ס{+@c GIh4LnAye]{!ih:0QFG3-Ȥ: l4v) 8>_k{'.ĥ[е0wd-zLN7q%xQc˥n+E?"^3c]*<NT%ya0mh6:T9g3r<6s4>KױBeAeXɭK/CjiakQ"uH;$% mːpˡN2qtܢJ) ޫcl`/Dv>?R^-vvYr [.9RT$LfR\sx !u th MI-Jh34&X(/z4ƞMޥ?HϩA G o+/_{vHg`={CoM` X]a RYc4pP -X:ža ; ^uPCz.zEBz9:'_S~%fpg6\wS+y37 L&C"a! V!'XCHOFxUO,`M*hT pUxGW/ `av /xN&O~=k[(1H"{ 񊮟^|3aZ=3F^UX H--v]&TQI7b>fhY *;0 BX;p.Xpi $Ҕ&+_a u}MI+`#r2 nÉϠ!_ENR \4T֋KH:/T 2YmCte4 :~x"6} C凲{!h֦~'I(ZQu\%Kj-zЀܢp ʐL\%X/HC |eZbeDԹ4`rI i'L2è Dwy_G EOiMR[$ihnj=r|䓿|ZS6W>`4 Y)}iwr63s#b?*}h|u,%)@>j""ڬeM՗߀S l%*UBF# hWiYyy 8Mrc iF^Ҁo<缈UHDlD@1.g̡P!&s {[`|&,,‹}g52ܞ+ 3PTYSW!f!d7t2LL.?.F6(`MbW%$[gQ$@sD#Zb- P +Ão7۶*UZ@#h؀j* T5b{1CÙr}qW{&&Ǝ*\ܣq]S9?2r$yb~r I:9wېiy:|S0i|*ܺ#0}{XDzIq84R6#2Sk/ (0xoc.11:bBQLy*BЅyW܋^\&$65y`#vW{6TCrM|ɎJ}B0J T49DR(LtdА4!F?OL_Q1ɷ͚?̏$2A|(19/uʷZ|V?ѫKO A)"W#B(TRI1\H-!x:8 -}YxJupwTٛd<4q4jmڮBb6 o^N+\ǁl3C/by*jBj$䉼 T'eDR]YP>ã05> GC'ERLB %4$kP G# =(f~`;Eh|iI+kxBƃ5 x D5tj%T;iۭUlF'C&FL,J ^hB@INjTIEx0=R&ʑ@& ܊+}&'5B 4+E {'fGG-ؕaOWʥu1ȶ'?z{^+#ラj4ă_dn-egQz]h,uR74=P vu#MtL/'޻6o%ڼGRݢs7LzRLD}bgHgIrO7ւl1"9.$tʈ̇Ưs =֜cDQŲC:`UqUH0~C7/aOMx^Cun\^gE18n-4\];z[;*JtʴAVp98(gj}@?8a1=BՒʣ0!߿bɿg^k-=@o6"lD7?2mS^4:6 >4uNQxXOH-#uWRǨ6$ܘzK8x5㦼l+-xM#z̴4[t:>:+ K!T4&xn1dץT~XWH(ic7u9sﵡlB{d9 B4o5GNkOwt}U_Tv`奋ǒO!~DKN26p! }ɶX!5-,i0`F̃!Wo3vM"K=\^UEqCVߖ߫Vk+jg6Is[Ţ aC -LTvs E:$PH%HEqT\+ D. 4ʹrP|D=AXC)Js/$R̃S1ʥ yh'@QqAQܪд?%X^MT =.x6SS̩H #yp+Cs&GOgIENDB`nvidia-settings/src/image_data/rj45_input.png0000664000175000017500000000074412236467170021422 0ustar albertoalbertoPNG  IHDRaڟ`bKGDdddO pHYs  tIME ZqIDATxڭJPĘ&؂T:unPuq">@ZZIIsp9s9!L $P%<,KS8(Hyb0<FzwsdA"g+(.B à4vm[Z L-ZY=>BOGNmFs6uL&S<F@P՚%YlwZHSsx7ҵ(}LH"p SN@M -oqtMͽ/I(H"<4* B@ef|! 9^8xaㅁ/lR.wIENDB`nvidia-settings/src/image_data/antialias_pixdata.h0000664000175000017500000027156412236467170022553 0ustar albertoalberto/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static guint8 antialias_pixdata_pixel_data[] = { 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xec,0xff,0xff,0xff,0x00,0x0a,0x94,0x94,0x94,0x17,0x8e,0x8e,0x8e,0x43,0x79, 0x79,0x79,0x6a,0x7a,0x7a,0x7a,0x7a,0x85,0x85,0x85,0x8c,0x83,0x83,0x83,0x88, 0x72,0x72,0x72,0x77,0x70,0x70,0x70,0x65,0x71,0x71,0x71,0x3e,0x67,0x67,0x67, 0x12,0xf6,0xff,0xff,0xff,0x00,0x05,0xa0,0xa0,0xa0,0x31,0x9b,0x9b,0x9b,0xaa, 0xb0,0xb0,0xb0,0xe8,0xcc,0xcc,0xcc,0xfa,0xda,0xda,0xda,0xff,0x82,0xde,0xde, 0xde,0xff,0x09,0xdd,0xdd,0xdd,0xff,0xdc,0xdc,0xdc,0xff,0xde,0xde,0xde,0xff, 0xdf,0xdf,0xdf,0xff,0xdd,0xdd,0xdd,0xfe,0xce,0xce,0xce,0xf8,0xa5,0xa5,0xa5, 0xe1,0x80,0x80,0x80,0x93,0x6a,0x6a,0x6a,0x1d,0xf1,0xff,0xff,0xff,0x00,0x14, 0x6d,0x6d,0x6d,0x77,0x9c,0x9c,0x9c,0xd9,0xc6,0xc6,0xc6,0xfc,0xc5,0xc5,0xc5, 0xff,0xb8,0xb8,0xb8,0xff,0xa2,0xa2,0xa2,0xff,0x87,0x87,0x87,0xfe,0x75,0x75, 0x75,0xfa,0x6c,0x6c,0x6c,0xf4,0x68,0x68,0x68,0xf1,0x68,0x68,0x68,0xf0,0x6b, 0x6b,0x6b,0xf6,0x73,0x73,0x73,0xfa,0x82,0x82,0x82,0xff,0x98,0x98,0x98,0xff, 0xb7,0xb7,0xb7,0xff,0xd0,0xd0,0xd0,0xff,0xce,0xce,0xce,0xf9,0xa7,0xa7,0xa7, 0xcb,0x8a,0x8a,0x8a,0x5d,0xed,0xff,0xff,0xff,0x00,0x18,0x6c,0x6c,0x6c,0x4a, 0x80,0x80,0x80,0xdc,0xbc,0xbc,0xbc,0xff,0xdc,0xdc,0xdc,0xff,0xa4,0xa4,0xa4, 0xff,0x66,0x66,0x66,0xfa,0x5c,0x5c,0x5c,0xe2,0x6d,0x6d,0x6d,0xc1,0x96,0x96, 0x96,0x92,0xc0,0xc0,0xc0,0x79,0xd2,0xd2,0xd2,0x73,0xda,0xda,0xda,0x71,0xdc, 0xdc,0xdc,0x6d,0xcf,0xcf,0xcf,0x72,0xbc,0xbc,0xbc,0x79,0x9a,0x9a,0x9a,0x96, 0x7a,0x7a,0x7a,0xc7,0x60,0x60,0x60,0xea,0x59,0x59,0x59,0xfd,0x96,0x96,0x96, 0xff,0xdb,0xdb,0xdb,0xff,0xdd,0xdd,0xdd,0xff,0x9e,0x9e,0x9e,0xc5,0x9a,0x9a, 0x9a,0x2c,0xea,0xff,0xff,0xff,0x00,0x1a,0x79,0x79,0x79,0xb1,0xb7,0xb7,0xb7, 0xfd,0xe1,0xe1,0xe1,0xff,0x8c,0x8c,0x8c,0xff,0x5e,0x5e,0x5e,0xec,0x71,0x71, 0x71,0xac,0xbf,0xbf,0xbf,0x71,0xe4,0xe4,0xe4,0x71,0xf0,0xf0,0xf0,0x78,0xf2, 0xf2,0xf2,0x7f,0xf2,0xf2,0xf2,0x84,0xf3,0xf3,0xf3,0x86,0xf3,0xf3,0xf3,0x88, 0xf3,0xf3,0xf3,0x86,0xf1,0xf1,0xf1,0x82,0xef,0xef,0xef,0x7d,0xeb,0xeb,0xeb, 0x74,0xe5,0xe5,0xe5,0x6a,0xd7,0xd7,0xd7,0x63,0xb1,0xb1,0xb1,0x75,0x89,0x89, 0x89,0xb5,0x67,0x67,0x67,0xf4,0x7f,0x7f,0x7f,0xff,0xe8,0xe8,0xe8,0xff,0xdf, 0xdf,0xdf,0xf9,0xb2,0xb2,0xb2,0x8c,0xe7,0xff,0xff,0xff,0x00,0x0b,0x58,0x58, 0x58,0x26,0x8e,0x8e,0x8e,0xd7,0xd2,0xd2,0xd2,0xff,0xba,0xba,0xba,0xff,0x6e, 0x6e,0x6e,0xf0,0x72,0x72,0x72,0xa5,0xce,0xce,0xce,0x6c,0xeb,0xeb,0xeb,0x71, 0xf2,0xf2,0xf2,0x7b,0xf4,0xf4,0xf4,0x86,0xf5,0xf5,0xf5,0x8d,0x82,0xf4,0xf4, 0xf4,0x8f,0x82,0xf4,0xf4,0xf4,0x90,0x0f,0xf3,0xf3,0xf3,0x8f,0xf3,0xf3,0xf3, 0x8e,0xf2,0xf2,0xf2,0x8c,0xf1,0xf1,0xf1,0x8a,0xf0,0xf0,0xf0,0x85,0xed,0xed, 0xed,0x7b,0xe5,0xe5,0xe5,0x6a,0xd6,0xd6,0xd6,0x5c,0xae,0xae,0xae,0x6d,0x83, 0x83,0x83,0xbc,0x76,0x76,0x76,0xf8,0xba,0xba,0xba,0xff,0xec,0xec,0xec,0xff, 0xc6,0xc6,0xc6,0xb8,0xd1,0xd1,0xd1,0x0c,0xde,0xff,0xff,0xff,0x00,0x86,0x00, 0x00,0x00,0x00,0x20,0x7b,0x7b,0x7b,0x28,0xa1,0xa1,0xa1,0xe6,0xe3,0xe3,0xe3, 0xff,0x98,0x98,0x98,0xff,0x61,0x61,0x61,0xcf,0xb0,0xb0,0xb0,0x70,0xe8,0xe8, 0xe8,0x6a,0xf2,0xf2,0xf2,0x79,0xf4,0xf4,0xf4,0x85,0xf4,0xf4,0xf4,0x88,0xf4, 0xf4,0xf4,0x8a,0xf5,0xf5,0xf5,0x8d,0xf4,0xf4,0xf4,0x8f,0xf5,0xf5,0xf5,0x90, 0xf4,0xf4,0xf4,0x91,0xf4,0xf4,0xf4,0x90,0xf4,0xf4,0xf4,0x8f,0xf3,0xf3,0xf3, 0x8f,0xf2,0xf2,0xf2,0x8d,0xf0,0xf0,0xf0,0x8a,0xef,0xef,0xef,0x87,0xed,0xed, 0xed,0x85,0xea,0xea,0xea,0x83,0xe6,0xe6,0xe6,0x7c,0xdb,0xdb,0xdb,0x69,0xbc, 0xbc,0xbc,0x57,0x97,0x97,0x97,0x78,0x70,0x70,0x70,0xe6,0xa6,0xa6,0xa6,0xff, 0xf1,0xf1,0xf1,0xff,0xce,0xce,0xce,0xce,0xdf,0xdf,0xdf,0x0e,0x99,0x00,0x00, 0x00,0x00,0xc4,0xff,0xff,0xff,0x00,0x85,0x00,0x00,0x00,0x00,0x21,0x9e,0x9e, 0x9e,0x14,0xb1,0xb1,0xb1,0xf0,0xe1,0xe1,0xe1,0xff,0x8c,0x8c,0x8c,0xfe,0x72, 0x73,0x73,0xa5,0xc2,0xc2,0xc2,0x68,0xec,0xec,0xec,0x72,0xf2,0xf2,0xf2,0x81, 0xf3,0xf3,0xf3,0x82,0xf3,0xf3,0xf3,0x85,0xf3,0xf3,0xf3,0x88,0xf4,0xf4,0xf4, 0x8a,0xf5,0xf5,0xf5,0x8d,0xf4,0xf4,0xf4,0x8f,0xf5,0xf5,0xf5,0x90,0xf5,0xf5, 0xf5,0x91,0xf4,0xf4,0xf4,0x91,0xf4,0xf4,0xf4,0x90,0xf3,0xf3,0xf3,0x8f,0xf1, 0xf1,0xf1,0x8d,0xef,0xef,0xef,0x8a,0xed,0xed,0xed,0x88,0xec,0xec,0xec,0x86, 0xe8,0xe8,0xe8,0x83,0xe5,0xe5,0xe5,0x81,0xe1,0xe1,0xe1,0x80,0xd8,0xd8,0xd8, 0x7b,0xc0,0xc0,0xc0,0x61,0x9a,0x9a,0x9a,0x58,0x84,0x84,0x84,0xc1,0x9d,0x9d, 0x9d,0xff,0xef,0xef,0xef,0xff,0xc5,0xc5,0xc5,0xda,0x99,0x00,0x00,0x00,0x00, 0xc4,0xff,0xff,0xff,0x00,0x84,0x00,0x00,0x00,0x00,0x08,0xae,0xae,0xae,0x17, 0xba,0xba,0xba,0xd9,0xe5,0xe5,0xe5,0xff,0x92,0x92,0x92,0xfa,0x74,0x75,0x74, 0xa5,0xbe,0xc5,0xc0,0x82,0xe6,0xe6,0xe6,0x76,0xee,0xee,0xee,0x7f,0x82,0xf2, 0xf2,0xf2,0x81,0x1a,0xf3,0xf3,0xf3,0x85,0xf3,0xf3,0xf3,0x87,0xf4,0xf4,0xf4, 0x8a,0xf4,0xf4,0xf4,0x8d,0xf4,0xf4,0xf4,0x8f,0xf5,0xf5,0xf5,0x8f,0xf5,0xf5, 0xf5,0x91,0xf4,0xf4,0xf4,0x91,0xf3,0xf3,0xf3,0x90,0xf2,0xf2,0xf2,0x8f,0xf0, 0xf0,0xf0,0x8d,0xee,0xee,0xee,0x8b,0xee,0xee,0xee,0x88,0xea,0xea,0xea,0x86, 0xe7,0xe7,0xe7,0x83,0xe4,0xe4,0xe4,0x81,0xdd,0xdd,0xdd,0x81,0xd7,0xd7,0xd7, 0x82,0xd0,0xd0,0xd0,0x81,0xbc,0xbc,0xbc,0x6b,0x90,0x90,0x90,0x58,0x81,0x81, 0x81,0xc1,0xaf,0xaf,0xaf,0xfe,0xf4,0xf4,0xf4,0xff,0xc7,0xc7,0xc7,0xb4,0xd2, 0xd2,0xd2,0x04,0x97,0x00,0x00,0x00,0x00,0xc4,0xff,0xff,0xff,0x00,0x84,0x00, 0x00,0x00,0x00,0x24,0xb7,0xb7,0xb7,0xb2,0xde,0xde,0xde,0xff,0x9f,0x9f,0x9f, 0xfe,0x74,0x7d,0x79,0xba,0x9a,0xbf,0xac,0xde,0xb0,0xd5,0xc2,0xff,0xbd,0xd8, 0xc8,0xef,0xc0,0xdb,0xcb,0xef,0xc3,0xde,0xce,0xef,0xdd,0xe9,0xe2,0xb2,0xdf, 0xea,0xe3,0xb5,0xe1,0xeb,0xe4,0xb6,0xf4,0xf4,0xf4,0x8a,0xf4,0xf4,0xf4,0x8c, 0xf5,0xf5,0xf5,0x8e,0xf5,0xf5,0xf5,0x8f,0xf5,0xf5,0xf5,0x90,0xf4,0xf4,0xf4, 0x90,0xf3,0xf3,0xf3,0x90,0xf2,0xf2,0xf2,0x8e,0xf2,0xf2,0xf2,0x8c,0xf0,0xf0, 0xf0,0x89,0xec,0xec,0xec,0x87,0xea,0xea,0xea,0x83,0xe6,0xe6,0xe6,0x81,0xe5, 0xe5,0xe5,0x7f,0xde,0xde,0xde,0x7f,0xd7,0xd7,0xd7,0x81,0xd0,0xd0,0xd0,0x82, 0xca,0xca,0xca,0x84,0xb9,0xb9,0xb9,0x71,0x81,0x81,0x81,0x59,0x81,0x81,0x81, 0xc9,0xc1,0xc1,0xc1,0xff,0xe9,0xe9,0xe9,0xff,0xa9,0xa9,0xa9,0x83,0x97,0x00, 0x00,0x00,0x00,0xc4,0xff,0xff,0xff,0x00,0x83,0x00,0x00,0x00,0x00,0x26,0xb6, 0xb6,0xb6,0x57,0xd7,0xd7,0xd7,0xfe,0xcb,0xcb,0xcb,0xff,0x77,0x7c,0x7a,0xb6, 0x95,0xb8,0xa5,0xd3,0xac,0xd2,0xbe,0xff,0xb1,0xd5,0xc2,0xff,0xbc,0xd7,0xc7, 0xef,0xbf,0xda,0xca,0xef,0xc2,0xdd,0xcd,0xef,0xdd,0xe9,0xe2,0xb2,0xde,0xe9, 0xe2,0xb3,0xdf,0xea,0xe3,0xb6,0xf3,0xf3,0xf3,0x89,0xf4,0xf4,0xf4,0x89,0xf4, 0xf4,0xf4,0x88,0xf4,0xf4,0xf4,0x86,0xf3,0xf3,0xf3,0x84,0xf3,0xf3,0xf3,0x83, 0xf1,0xf1,0xf1,0x83,0xf0,0xf0,0xf0,0x82,0xf0,0xf0,0xf0,0x80,0xef,0xef,0xef, 0x81,0xee,0xee,0xee,0x80,0xeb,0xeb,0xeb,0x80,0xe9,0xe9,0xe9,0x7f,0xe6,0xe6, 0xe6,0x7d,0xdf,0xdf,0xdf,0x7e,0xd9,0xd9,0xd9,0x7f,0xd1,0xd1,0xd1,0x81,0xca, 0xca,0xca,0x83,0xc6,0xc6,0xc6,0x85,0xae,0xae,0xae,0x71,0x74,0x74,0x74,0x5f, 0x84,0x84,0x84,0xd7,0xe8,0xe8,0xe8,0xff,0xd4,0xd4,0xd4,0xf7,0x74,0x74,0x74, 0x21,0x96,0x00,0x00,0x00,0x00,0xc4,0xff,0xff,0xff,0x00,0x82,0x00,0x00,0x00, 0x00,0x28,0x8e,0x8e,0x8e,0x0a,0xbf,0xbf,0xbf,0xee,0xd7,0xd7,0xd7,0xff,0x80, 0x80,0x80,0xe2,0x8f,0xb0,0xa0,0xbb,0xa5,0xcc,0xb8,0xff,0xad,0xd1,0xbf,0xff, 0xaf,0xd4,0xc1,0xff,0xbb,0xd6,0xc6,0xef,0xbe,0xd9,0xc9,0xef,0xc0,0xdc,0xcc, 0xef,0xda,0xe7,0xdf,0xad,0xd9,0xe6,0xde,0xaa,0xd6,0xe4,0xdb,0xa7,0xed,0xed, 0xed,0x6a,0xed,0xed,0xed,0x68,0xed,0xed,0xed,0x66,0xec,0xec,0xec,0x65,0xec, 0xec,0xec,0x64,0xeb,0xeb,0xeb,0x63,0xe9,0xe9,0xe9,0x61,0xe7,0xe7,0xe7,0x5f, 0xe5,0xe5,0xe5,0x5d,0xe5,0xe5,0xe5,0x5b,0xdf,0xdf,0xdf,0x5b,0xde,0xde,0xde, 0x5c,0xdf,0xdf,0xdf,0x61,0xe0,0xe0,0xe0,0x69,0xdb,0xdb,0xdb,0x73,0xd9,0xd9, 0xd9,0x7b,0xd3,0xd3,0xd3,0x7f,0xcc,0xcc,0xcc,0x80,0xc8,0xc8,0xc8,0x82,0xc2, 0xc2,0xc2,0x84,0x9d,0x9d,0x9d,0x6a,0x6e,0x6e,0x6e,0x6f,0x98,0x98,0x98,0xf9, 0xf2,0xf2,0xf2,0xff,0x96,0x96,0x96,0xd0,0x00,0x00,0x00,0x02,0x95,0x00,0x00, 0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x8b,0x00,0x00,0x00,0x00,0x20,0x9a,0xb8, 0xff,0x09,0x96,0xaf,0xf0,0x27,0x9b,0xb1,0xfc,0x4a,0xa5,0xbf,0xf8,0x6e,0xa3, 0xc6,0xfc,0x99,0x9e,0xc1,0xfe,0xd5,0x8d,0xb1,0xff,0xfb,0x88,0xab,0xfe,0xfb, 0x8c,0xb1,0xfd,0xd2,0x87,0xa9,0xf6,0x90,0x8c,0xaa,0xf2,0x61,0x85,0xa7,0xe4, 0x37,0x74,0x8b,0xc6,0x0f,0x00,0x00,0x00,0x01,0x89,0xaf,0xff,0x00,0x86,0xae, 0xf9,0x00,0x84,0xae,0xfe,0x00,0x92,0xb3,0xff,0x00,0x99,0xb2,0xff,0x00,0x7d, 0xa6,0xfd,0x00,0x8e,0xa8,0xf5,0x00,0xc3,0xce,0xef,0x00,0xc1,0xcd,0xef,0x00, 0xc0,0xce,0xf2,0x00,0xc1,0xd4,0xfa,0x00,0xb1,0x45,0x35,0x00,0xb1,0x4b,0x3d, 0x00,0xb6,0x52,0x3f,0x00,0xba,0x53,0x3e,0x00,0xd1,0x6c,0x59,0x00,0xd4,0x96, 0x7e,0x00,0xd3,0x94,0x7c,0x00,0x83,0xd3,0x93,0x7c,0x00,0x1f,0xd3,0x93,0x7b, 0x00,0xd4,0x91,0x7a,0x00,0xd5,0x8e,0x77,0x00,0xb1,0xd7,0xc0,0x00,0xb3,0xd4, 0xbd,0x00,0xb1,0xd6,0xbd,0x00,0xac,0xd8,0xbb,0x00,0xb0,0xda,0xbf,0x00,0xb6, 0xe0,0xc8,0x00,0xb9,0xe2,0xca,0x00,0xb1,0xdf,0xc4,0x00,0xb7,0xdf,0xc6,0x00, 0xb0,0xdc,0xc6,0x00,0xa7,0xdb,0xc2,0x00,0xb9,0xe0,0xcb,0x03,0xb4,0xdb,0xc7, 0x1b,0xa3,0xd2,0xb7,0x2b,0xa5,0xd1,0xb4,0x2c,0xb7,0xd6,0xc2,0x1c,0x7b,0x7b, 0x7b,0x68,0xe2,0xe2,0xe2,0xff,0xae,0xae,0xae,0xfa,0x8c,0x9d,0x96,0xa4,0xab, 0xd0,0xc0,0xf9,0xac,0xd1,0xc1,0xff,0xae,0xd3,0xc2,0xff,0xb0,0xd5,0xc4,0xff, 0xac,0xd2,0xbe,0xff,0xa9,0xd2,0xbd,0xff,0xa4,0xd1,0xb9,0xff,0x9b,0xc8,0xac, 0xff,0x82,0x97,0xc6,0xaa,0xff,0x1b,0xb4,0xcf,0xbc,0xcd,0xb7,0xd1,0xbf,0xce, 0xb9,0xd3,0xc1,0xcf,0xec,0xec,0xec,0x63,0xec,0xec,0xec,0x65,0xea,0xea,0xea, 0x65,0xe9,0xe9,0xe9,0x5c,0xe6,0xe6,0xe6,0x58,0xe3,0xe3,0xe3,0x55,0xdf,0xdf, 0xdf,0x50,0xd6,0xd6,0xd6,0x4a,0xcf,0xcf,0xcf,0x46,0xca,0xca,0xca,0x41,0xbf, 0xbf,0xbf,0x42,0xbb,0xbb,0xbb,0x4a,0xbf,0xbf,0xbf,0x57,0xc7,0xc7,0xc7,0x69, 0xcc,0xcc,0xcc,0x77,0xcb,0xcb,0xcb,0x7e,0xc6,0xc6,0xc6,0x81,0xbc,0xbc,0xbc, 0x80,0x82,0x82,0x82,0x61,0x76,0x76,0x76,0xac,0xc4,0xc4,0xc4,0xff,0xe0,0xe0, 0xe0,0xfe,0x4f,0x4f,0x4f,0x3c,0x00,0x00,0x00,0x03,0x94,0x00,0x00,0x00,0x00, 0x85,0xff,0xff,0xff,0x00,0x85,0x00,0x00,0x00,0x00,0x27,0x98,0xab,0xfb,0x0d, 0x8e,0xaa,0xf9,0x2e,0x8a,0xad,0xf8,0x50,0x92,0xaa,0xf8,0x73,0x8a,0xaa,0xfb, 0x9f,0x80,0xaa,0xf9,0xd2,0x7a,0xa7,0xff,0xf8,0x74,0xa5,0xff,0xff,0x72,0xa4, 0xff,0xff,0x6e,0xa4,0xff,0xff,0x6b,0xa0,0xff,0xff,0x6b,0xa1,0xff,0xff,0x6e, 0xa4,0xff,0xff,0x70,0xa5,0xff,0xff,0x6e,0xa3,0xff,0xff,0x72,0xa4,0xff,0xff, 0x75,0xa6,0xff,0xff,0x78,0xa9,0xff,0xff,0x7e,0xa8,0xff,0xfa,0x84,0xaa,0xfb, 0xcf,0x86,0xaa,0xf6,0x95,0x81,0xa7,0xee,0x67,0x7c,0xa3,0xee,0x3c,0x7c,0x97, 0xd7,0x13,0x00,0x00,0x00,0x01,0x7e,0xa7,0xfe,0x00,0x8f,0xa9,0xf6,0x00,0xc4, 0xcf,0xf0,0x00,0xc2,0xce,0xf0,0x00,0xc1,0xcf,0xf3,0x00,0xc1,0xd5,0xfb,0x00, 0xb1,0x46,0x36,0x00,0xb1,0x4b,0x3d,0x00,0xb6,0x52,0x40,0x00,0x00,0x00,0x00, 0x01,0xd0,0x6d,0x5a,0x8c,0xc3,0x8b,0x76,0x24,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x01,0x82,0xd5,0x95,0x7e,0x00,0x3d,0xd5,0x95,0x7d,0x00,0xd5,0x92,0x7b, 0x00,0xd6,0x8e,0x76,0x00,0xb2,0xd6,0xbf,0x00,0xb3,0xd4,0xbd,0x00,0xb1,0xd6, 0xbd,0x00,0xac,0xd8,0xbb,0x00,0xb0,0xda,0xbf,0x00,0xb7,0xe0,0xc8,0x00,0xb9, 0xe2,0xca,0x00,0xb1,0xdf,0xc4,0x00,0xaf,0xd5,0xbe,0x16,0xb0,0xd9,0xc5,0x62, 0xa7,0xd8,0xc0,0xb3,0x9b,0xd7,0xba,0xf2,0x95,0xd7,0xb7,0xff,0x92,0xd4,0xb4, 0xff,0x95,0xd3,0xaf,0xff,0x95,0xd0,0xae,0xff,0xbd,0xc2,0xbf,0xfe,0xe0,0xe0, 0xe0,0xff,0x88,0x8c,0x8a,0xdc,0x9a,0xbb,0xad,0xd6,0xb4,0xd6,0xc8,0xff,0xac, 0xd1,0xc0,0xff,0xad,0xd2,0xc1,0xff,0xa6,0xcf,0xbc,0xff,0x95,0xc5,0xab,0xff, 0x8f,0xc4,0xa8,0xff,0x8f,0xc6,0xa9,0xff,0x90,0xc1,0xa3,0xff,0x93,0xc4,0xa6, 0xff,0x96,0xc6,0xa9,0xff,0xb3,0xcf,0xbc,0xcb,0xb7,0xd1,0xbf,0xcd,0xba,0xd4, 0xc2,0xce,0xef,0xef,0xef,0x60,0xef,0xef,0xef,0x63,0xec,0xec,0xec,0x64,0xea, 0xea,0xea,0x5a,0xe7,0xe7,0xe7,0x57,0xe5,0xe5,0xe5,0x52,0xde,0xde,0xde,0x4e, 0xd3,0xd3,0xd3,0x48,0xce,0xce,0xce,0x43,0xc7,0xc7,0xc7,0x3f,0xb7,0xb7,0xb7, 0x3f,0xa6,0xa6,0xa6,0x40,0x9a,0x9a,0x9a,0x40,0x94,0x94,0x94,0x43,0x9f,0x9f, 0x9f,0x4e,0xb3,0xb3,0xb3,0x61,0xc4,0xc4,0xc4,0x77,0xc5,0xc5,0xc5,0x81,0xaf, 0xaf,0xaf,0x77,0x62,0x62,0x62,0x60,0x94,0x94,0x94,0xe9,0xfb,0xfb,0xfb,0xff, 0x85,0x85,0x85,0xbf,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x93,0x00,0x00, 0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x09,0x00,0x00,0x00,0x00,0x8e,0xac,0xed, 0x43,0x7e,0xa3,0xfb,0x78,0x82,0xac,0xfa,0xa4,0x80,0xac,0xfe,0xd8,0x7d,0xab, 0xff,0xfd,0x78,0xa8,0xff,0xff,0x72,0xa9,0xff,0xff,0x6d,0xa6,0xff,0xff,0x82, 0x6c,0xa2,0xff,0xff,0x04,0x6e,0xa4,0xff,0xff,0x6d,0xa4,0xff,0xff,0x6c,0xa5, 0xff,0xff,0x6e,0xa3,0xff,0xff,0x82,0x70,0xa6,0xff,0xff,0x5a,0x70,0xa5,0xff, 0xff,0x71,0xa6,0xff,0xff,0x70,0xa5,0xff,0xff,0x70,0xa6,0xff,0xff,0x72,0xa6, 0xff,0xff,0x74,0xa8,0xff,0xff,0x75,0xa9,0xff,0xff,0x74,0xad,0xff,0xff,0x77, 0xaf,0xff,0xff,0x7f,0xb1,0xff,0xff,0x80,0xb4,0xff,0xff,0x85,0xb3,0xff,0xff, 0x84,0xac,0xfb,0xd5,0x7e,0xa5,0xf7,0x9b,0x8b,0xa4,0xed,0x68,0x22,0x24,0x29, 0x06,0x00,0x00,0x00,0x02,0xc3,0xd3,0xf7,0x00,0xc2,0xd8,0xff,0x00,0xb1,0x47, 0x38,0x00,0xb1,0x4b,0x3e,0x00,0xb5,0x53,0x40,0x00,0xb3,0x53,0x3f,0x51,0xcf, 0x34,0x1b,0xff,0xb6,0x4a,0x37,0x9d,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x01,0xb5,0x56,0x50,0x00,0xb5,0x55,0x4e,0x00,0xb6,0x51,0x4b, 0x00,0xb2,0xdb,0xc3,0x00,0xb2,0xd5,0xbe,0x00,0xb3,0xd3,0xbc,0x00,0xb1,0xd6, 0xbd,0x00,0xac,0xd8,0xbb,0x00,0xb0,0xda,0xbf,0x00,0xb7,0xe0,0xc8,0x00,0xad, 0xd3,0xbc,0x0e,0xb2,0xdd,0xc2,0x86,0x9b,0xdc,0xba,0xf9,0x8f,0xd9,0xb9,0xff, 0x8e,0xd9,0xb9,0xff,0x8c,0xd8,0xb5,0xff,0x8b,0xd8,0xb7,0xff,0x8b,0xd8,0xb6, 0xff,0x87,0xd3,0xae,0xff,0x91,0xc0,0xa9,0xff,0xc7,0xc7,0xc7,0xff,0xa7,0xa8, 0xa8,0xff,0x87,0xaa,0x98,0xff,0xaa,0xcf,0xbf,0xff,0xb3,0xd6,0xc7,0xff,0xa3, 0xcc,0xb9,0xff,0x97,0xc6,0xb1,0xff,0x8f,0xc3,0xab,0xff,0x86,0xbd,0x9f,0xff, 0x89,0xc0,0xa3,0xff,0x8d,0xc3,0xa6,0xff,0x8e,0xbf,0xa1,0xff,0x92,0xc3,0xa5, 0xff,0x95,0xc6,0xa8,0xff,0xb3,0xcf,0xbc,0xcb,0xb8,0xd3,0xc1,0xcc,0xbc,0xd6, 0xc4,0xcd,0xf7,0xf7,0xf7,0x5e,0xf6,0xf6,0xf6,0x61,0xf1,0xf1,0xf1,0x61,0xee, 0xee,0xee,0x59,0xe9,0xe9,0xe9,0x55,0xe5,0xe5,0xe5,0x51,0xe0,0xe0,0xe0,0x4b, 0xd4,0xd4,0xd4,0x45,0xcd,0xcd,0xcd,0x40,0xc6,0xc6,0xc6,0x3c,0xb2,0xb2,0xb2, 0x3d,0xa3,0xa3,0xa3,0x3e,0x96,0x96,0x96,0x3f,0x8c,0x8c,0x8c,0x40,0x85,0x85, 0x85,0x41,0x81,0x81,0x81,0x42,0x95,0x95,0x95,0x4f,0xae,0xae,0xae,0x67,0xb8, 0xb8,0xb8,0x7a,0x81,0x81,0x81,0x63,0x79,0x79,0x79,0xb5,0xc5,0xc5,0xc5,0xff, 0xc6,0xc6,0xc6,0xfc,0x2b,0x2b,0x2b,0x39,0x00,0x00,0x00,0x05,0x93,0x00,0x00, 0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x6c,0x00,0x00,0x00,0x02,0x65,0x8d,0xd6, 0xcd,0x2f,0x77,0xf6,0xff,0x38,0x7e,0xfc,0xff,0x49,0x8a,0xfa,0xff,0x54,0x94, 0xfb,0xff,0x5b,0x9b,0xfe,0xff,0x67,0xa4,0xff,0xff,0x6b,0xaa,0xff,0xff,0x6e, 0xaa,0xff,0xff,0x70,0xab,0xff,0xff,0x72,0xa8,0xff,0xff,0x70,0xa7,0xff,0xff, 0x6d,0xa4,0xff,0xff,0x6c,0xa6,0xff,0xff,0x6e,0xa6,0xff,0xff,0x71,0xa8,0xff, 0xff,0x70,0xa8,0xff,0xff,0x71,0xaa,0xff,0xff,0x73,0xac,0xff,0xff,0x75,0xae, 0xff,0xff,0x75,0xb0,0xff,0xff,0x74,0xad,0xff,0xff,0x73,0xaa,0xff,0xff,0x6c, 0xa4,0xff,0xff,0x63,0x9c,0xf9,0xff,0x5b,0x91,0xf1,0xff,0x55,0x86,0xe4,0xff, 0x4b,0x77,0xd8,0xff,0x44,0x66,0xcf,0xff,0x3d,0x5c,0xb4,0xff,0x4f,0x5f,0xa3, 0xff,0x3c,0x40,0x4f,0x22,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x03,0xb3,0x45, 0x34,0x00,0xb2,0x4a,0x3b,0x00,0xb1,0x4c,0x40,0x00,0x9d,0x49,0x39,0x0f,0xce, 0x3d,0x24,0xf1,0xd3,0x37,0x23,0xff,0xc9,0x40,0x2d,0xfc,0x4b,0x25,0x23,0x2e, 0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x04,0xb7,0x59,0x52,0x00,0xb7,0x57,0x51, 0x00,0xb7,0x52,0x4c,0x00,0xb3,0xdb,0xc3,0x00,0xb3,0xd5,0xbe,0x00,0xb3,0xd3, 0xbc,0x00,0xb1,0xd6,0xbd,0x00,0xad,0xd8,0xbb,0x00,0xb1,0xda,0xbf,0x00,0xb5, 0xdd,0xc6,0x43,0x9f,0xdc,0xb9,0xe7,0x93,0xd9,0xba,0xff,0x91,0xdd,0xbd,0xff, 0x95,0xde,0xbf,0xff,0x97,0xdf,0xc2,0xff,0x98,0xde,0xc1,0xff,0x9b,0xe0,0xc4, 0xff,0x9b,0xe1,0xc3,0xff,0x96,0xdd,0xbc,0xff,0xa3,0xb7,0xae,0xff,0xde,0xde, 0xde,0xff,0x8c,0x9d,0x94,0xff,0x97,0xbc,0xab,0xff,0xb7,0xd7,0xc9,0xff,0xad, 0xd1,0xc2,0xff,0x91,0xc1,0xab,0xff,0x8e,0xc0,0xaa,0xff,0x90,0xc2,0xac,0xff, 0x85,0xbb,0xa0,0xff,0x87,0xbe,0xa3,0xff,0x8a,0xc1,0xa6,0xff,0x85,0xbb,0x9d, 0xff,0x8a,0xc0,0xa2,0xff,0x8f,0xc4,0xa6,0xff,0x8c,0xbd,0x9e,0xff,0x92,0xc2, 0xa3,0xff,0x96,0xc4,0xa7,0xff,0xbb,0xd3,0xc3,0xd0,0xbc,0xd3,0xc4,0xd1,0xbb, 0xd2,0xc3,0xd1,0xf3,0xf3,0xf3,0x58,0xeb,0xeb,0xeb,0x54,0xe8,0xe8,0xe8,0x4f, 0xdf,0xdf,0xdf,0x48,0xd4,0xd4,0xd4,0x41,0xce,0xce,0xce,0x3c,0xc2,0xc2,0xc2, 0x3a,0xae,0xae,0xae,0x3a,0xa0,0xa0,0xa0,0x3b,0x93,0x93,0x93,0x3c,0x8c,0x8c, 0x8c,0x3d,0x86,0x86,0x86,0x3e,0x7d,0x7d,0x7d,0x3f,0x70,0x70,0x70,0x41,0x6a, 0x6a,0x6a,0x43,0x8b,0x8b,0x8b,0x57,0x8f,0x8f,0x8f,0x62,0x60,0x60,0x60,0x6e, 0x93,0x93,0x93,0xf9,0xf1,0xf1,0xf1,0xff,0x4c,0x4c,0x4c,0x94,0x00,0x00,0x00, 0x0b,0x00,0x00,0x00,0x03,0x92,0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00, 0x52,0x00,0x00,0x00,0x05,0x85,0xab,0xec,0xc9,0x23,0x6e,0xf3,0xff,0x2c,0x75, 0xf4,0xff,0x2e,0x71,0xf2,0xff,0x2c,0x72,0xf2,0xff,0x2e,0x72,0xf8,0xff,0x34, 0x73,0xfd,0xff,0x3f,0x81,0xfe,0xff,0x4d,0x8e,0xff,0xff,0x5a,0x99,0xff,0xff, 0x64,0xa1,0xff,0xff,0x6c,0xa7,0xff,0xff,0x71,0xad,0xff,0xff,0x6d,0xab,0xff, 0xff,0x6e,0xad,0xff,0xff,0x73,0xaf,0xff,0xff,0x6f,0xab,0xff,0xff,0x69,0xa5, 0xff,0xff,0x60,0x9a,0xfc,0xff,0x5b,0x91,0xf4,0xff,0x56,0x82,0xeb,0xff,0x4a, 0x74,0xdf,0xff,0x3c,0x65,0xd3,0xff,0x32,0x5a,0xc4,0xff,0x32,0x54,0xb9,0xff, 0x31,0x50,0xb1,0xff,0x2d,0x4c,0xad,0xff,0x2b,0x4b,0xa7,0xff,0x32,0x4f,0xa5, 0xff,0x3b,0x51,0xa3,0xff,0x4f,0x5b,0x96,0xfd,0x1f,0x23,0x2b,0x37,0x00,0x00, 0x00,0x15,0x00,0x00,0x00,0x07,0xb4,0x48,0x37,0x00,0xb1,0x4b,0x3d,0x00,0x00, 0x00,0x00,0x01,0xc0,0x3e,0x2a,0xaa,0xce,0x35,0x1b,0xff,0xd1,0x36,0x24,0xff, 0xce,0x3c,0x23,0xff,0x9e,0x3c,0x2d,0xae,0x00,0x00,0x00,0x1e,0x00,0x00,0x00, 0x0a,0x00,0x00,0x00,0x01,0xb1,0x5c,0x42,0x00,0xb1,0x56,0x3c,0x00,0xb3,0xda, 0xc3,0x00,0xb3,0xd5,0xbe,0x00,0xb3,0xd3,0xbc,0x00,0xb1,0xd6,0xbd,0x00,0xad, 0xd8,0xbb,0x00,0xaf,0xd6,0xbc,0x67,0x9d,0xdc,0xba,0xff,0x91,0xdb,0xb6,0xff, 0x95,0xde,0xbf,0xff,0x9a,0xe0,0xc3,0xff,0xa0,0xe2,0xc8,0xff,0xa7,0xe8,0xcf, 0xff,0xaf,0xec,0xd5,0xff,0xb5,0xf0,0xd9,0xff,0xb7,0xf0,0xdb,0xff,0xb2,0xed, 0xd8,0xff,0xb3,0xb8,0xb6,0xff,0xd9,0xd9,0xd9,0xff,0x89,0xa7,0x99,0xff,0xa1, 0xc5,0xb5,0xff,0xa4,0xcb,0xba,0xff,0x9c,0xc8,0xb5,0xff,0x8b,0xbd,0xa6,0xff, 0x8d,0xbf,0xa9,0xff,0x8f,0xc1,0xab,0xff,0x83,0xba,0x9f,0xff,0x85,0xbc,0xa1, 0xff,0x88,0xbf,0xa4,0xff,0x83,0xb9,0x9a,0xff,0x88,0xbe,0xa0,0xff,0x8e,0xc4, 0xa6,0xff,0x8c,0xbe,0x9e,0xff,0x93,0xc2,0xa4,0xff,0x98,0xc5,0xa8,0xff,0x82, 0xbc,0xd3,0xc4,0xd1,0x19,0xbb,0xd3,0xc4,0xd0,0xfa,0xfa,0xfa,0x55,0xef,0xef, 0xef,0x4f,0xe9,0xe9,0xe9,0x4b,0xde,0xde,0xde,0x43,0xd6,0xd6,0xd6,0x3d,0xce, 0xce,0xce,0x39,0xbd,0xbd,0xbd,0x37,0xab,0xab,0xab,0x38,0x94,0x94,0x94,0x39, 0x83,0x83,0x83,0x39,0x87,0x87,0x87,0x3a,0x7b,0x7b,0x7b,0x3b,0x6f,0x6f,0x6f, 0x3d,0x6a,0x6a,0x6a,0x3d,0x67,0x67,0x67,0x3f,0x60,0x60,0x60,0x42,0x64,0x64, 0x64,0x49,0x54,0x54,0x54,0x50,0x7b,0x7b,0x7b,0xbf,0xf0,0xf0,0xf0,0xff,0x86, 0x86,0x86,0xd6,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01, 0x91,0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x18,0x00,0x00,0x00,0x08, 0x86,0xaa,0xea,0xc9,0x24,0x6e,0xf5,0xff,0x2f,0x75,0xfa,0xff,0x31,0x76,0xf8, 0xff,0x2f,0x75,0xf6,0xff,0x2e,0x72,0xf4,0xff,0x30,0x70,0xf8,0xff,0x2e,0x6e, 0xfa,0xff,0x2c,0x6e,0xfc,0xff,0x2c,0x70,0xff,0xff,0x2e,0x75,0xff,0xff,0x36, 0x7c,0xff,0xff,0x4d,0x92,0xff,0xff,0x5e,0x9f,0xff,0xff,0x5a,0x92,0xf9,0xff, 0x50,0x7d,0xea,0xff,0x3f,0x67,0xdb,0xff,0x35,0x59,0xce,0xff,0x34,0x54,0xc3, 0xff,0x32,0x54,0xbf,0xff,0x31,0x4d,0xb8,0xff,0x32,0x4b,0xb3,0xff,0x33,0x4e, 0xb2,0xff,0x82,0x34,0x51,0xb0,0xff,0x53,0x30,0x50,0xb1,0xff,0x2f,0x4f,0xb2, 0xff,0x30,0x50,0xaf,0xff,0x35,0x51,0xaa,0xff,0x3d,0x52,0xa7,0xff,0x51,0x5d, 0x9d,0xfd,0x15,0x17,0x1d,0x4d,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x0c,0xde, 0x79,0x7b,0x00,0xd7,0x6b,0x66,0x00,0xc4,0x54,0x41,0x57,0xcf,0x2d,0x1a,0xff, 0xcf,0x2e,0x1c,0xff,0xcc,0x32,0x1b,0xff,0xd0,0x35,0x21,0xff,0xc2,0x3d,0x23, 0xfd,0x3d,0x22,0x19,0x42,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x04,0xb1,0x5b, 0x42,0x00,0xb1,0x54,0x3b,0x00,0xb3,0xd9,0xc2,0x00,0xb3,0xd4,0xbd,0x00,0xb3, 0xd3,0xbc,0x00,0xb2,0xd6,0xbe,0x00,0xa9,0xd1,0xb6,0x62,0x9a,0xd7,0xaf,0xff, 0x8f,0xda,0xb1,0xff,0x96,0xdd,0xbc,0xff,0x9a,0xe0,0xc2,0xff,0xa3,0xe4,0xc9, 0xff,0xb0,0xec,0xd5,0xff,0xbb,0xf8,0xe0,0xff,0xc0,0xf8,0xe2,0xff,0xc1,0xf4, 0xe0,0xff,0xbf,0xf5,0xde,0xff,0xb2,0xe2,0xcf,0xff,0xc5,0xc5,0xc5,0xff,0xc0, 0xc0,0xc0,0xff,0x8e,0xb4,0xa3,0xff,0x9b,0xc5,0xb3,0xff,0x99,0xc5,0xb2,0xff, 0x9a,0xc7,0xb3,0xff,0x8b,0xbc,0xa6,0xff,0x8d,0xbe,0xa8,0xff,0x8e,0xc0,0xaa, 0xff,0x81,0xb8,0x9d,0xff,0x84,0xbb,0xa0,0xff,0x86,0xbe,0xa2,0xff,0x80,0xb7, 0x98,0xff,0x85,0xbc,0x9d,0xff,0x8c,0xc3,0xa4,0xff,0x8b,0xbe,0x9d,0xff,0x92, 0xc2,0xa3,0xff,0x98,0xc5,0xa8,0xff,0xbd,0xd4,0xc5,0xd1,0xbe,0xd4,0xc6,0xd1, 0xba,0xd2,0xc3,0xd0,0xfe,0xfe,0xfe,0x50,0xf4,0xf4,0xf4,0x4a,0xea,0xea,0xea, 0x45,0xe1,0xe1,0xe1,0x3d,0xda,0xda,0xda,0x37,0xcf,0xcf,0xcf,0x33,0xb9,0xb9, 0xb9,0x33,0x9b,0x9b,0x9b,0x33,0x86,0x86,0x86,0x34,0x7e,0x7e,0x7e,0x34,0x7a, 0x7a,0x7a,0x35,0x73,0x73,0x73,0x37,0x72,0x72,0x72,0x3a,0x6f,0x6f,0x6f,0x3b, 0x6a,0x6a,0x6a,0x3d,0x64,0x64,0x64,0x3d,0x5f,0x5f,0x5f,0x40,0x53,0x53,0x53, 0x45,0x6a,0x6a,0x6a,0x8a,0xdb,0xdb,0xdb,0xff,0xa8,0xa8,0xa8,0xf0,0x01,0x01, 0x01,0x1b,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x03,0x91,0x00,0x00,0x00,0x00, 0x85,0xff,0xff,0xff,0x00,0x6e,0x00,0x00,0x00,0x0a,0x81,0xa5,0xe7,0xcc,0x26, 0x6f,0xf4,0xff,0x30,0x78,0xfc,0xff,0x30,0x76,0xf8,0xff,0x2e,0x75,0xf7,0xff, 0x30,0x74,0xf7,0xff,0x31,0x70,0xf9,0xff,0x32,0x72,0xfc,0xff,0x31,0x73,0xfd, 0xff,0x2e,0x74,0xff,0xff,0x2f,0x72,0xff,0xff,0x2c,0x6f,0xff,0xff,0x2b,0x70, 0xff,0xff,0x2e,0x6e,0xfe,0xff,0x33,0x55,0xdc,0xff,0x36,0x4e,0xc0,0xff,0x35, 0x4f,0xbe,0xff,0x38,0x50,0xc1,0xff,0x38,0x51,0xc1,0xff,0x38,0x51,0xbc,0xff, 0x3a,0x52,0xbd,0xff,0x39,0x53,0xbb,0xff,0x37,0x53,0xb8,0xff,0x35,0x51,0xb4, 0xff,0x33,0x51,0xb3,0xff,0x31,0x4f,0xb2,0xff,0x31,0x4e,0xae,0xff,0x2f,0x50, 0xab,0xff,0x34,0x51,0xab,0xff,0x3c,0x54,0xa8,0xff,0x50,0x5b,0x9b,0xfe,0x11, 0x14,0x19,0x5b,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x01, 0xb8,0x5c,0x58,0x15,0xca,0x37,0x22,0xf5,0xcd,0x2f,0x21,0xff,0xcb,0x32,0x19, 0xff,0xcc,0x31,0x1c,0xff,0xce,0x36,0x22,0xff,0xcb,0x35,0x1e,0xff,0xa6,0x4b, 0x37,0xb9,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x01,0xb4, 0xde,0xc7,0x00,0xb3,0xd7,0xc0,0x00,0xb3,0xd4,0xbd,0x00,0xb4,0xd3,0xbd,0x00, 0xac,0xcf,0xb8,0x32,0x98,0xd5,0xaa,0xff,0x90,0xd5,0xa9,0xff,0x92,0xd8,0xb1, 0xff,0x99,0xdc,0xbc,0xff,0xa1,0xe2,0xc5,0xff,0xad,0xea,0xcf,0xff,0xba,0xf3, 0xdc,0xff,0xbf,0xf5,0xe0,0xff,0xbe,0xf4,0xdf,0xff,0xbc,0xf1,0xdc,0xff,0xb5, 0xef,0xd6,0xff,0xa0,0xc3,0xb3,0xff,0xce,0xce,0xce,0xff,0xa4,0xa9,0xa6,0xff, 0x8c,0xb6,0xa3,0xff,0x90,0xbc,0xa8,0xff,0x91,0xbd,0xaa,0xff,0x93,0xbf,0xab, 0xff,0x89,0xb9,0xa1,0xff,0x8a,0xbb,0xa3,0xff,0x8c,0xbd,0xa4,0xff,0x7f,0xb5, 0x97,0xff,0x81,0xb7,0x99,0xff,0x83,0xb9,0x9b,0xff,0x7b,0xb2,0x92,0xff,0x80, 0xb7,0x96,0xff,0x87,0xbe,0x9d,0xff,0x86,0xba,0x9a,0xff,0x8d,0xbf,0xa0,0xff, 0x93,0xc2,0xa5,0xff,0x92,0xb9,0x9e,0xff,0x93,0xba,0x9f,0xff,0x8f,0xb8,0x9c, 0xff,0xca,0xd9,0xce,0x96,0xc3,0xd3,0xc7,0x93,0xbc,0xcc,0xc0,0x91,0xe6,0xe6, 0xe6,0x36,0xde,0xde,0xde,0x31,0xc2,0xc2,0xc2,0x2f,0xa2,0xa2,0xa2,0x2f,0x8f, 0x8f,0x8f,0x2f,0x85,0x85,0x85,0x2f,0x7f,0x7f,0x7f,0x31,0x7c,0x7c,0x7c,0x32, 0x78,0x78,0x78,0x34,0x78,0x78,0x78,0x36,0x74,0x74,0x74,0x37,0x6f,0x6f,0x6f, 0x38,0x69,0x69,0x69,0x3a,0x63,0x63,0x63,0x3c,0x58,0x58,0x58,0x40,0x5a,0x5a, 0x5a,0x60,0xbe,0xbe,0xbe,0xfd,0xca,0xca,0xca,0xfc,0x14,0x14,0x14,0x3b,0x00, 0x00,0x00,0x13,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x90,0x00,0x00,0x00, 0x00,0x85,0xff,0xff,0xff,0x00,0x09,0x00,0x00,0x00,0x0b,0x80,0xa4,0xe9,0xcf, 0x26,0x6f,0xf1,0xff,0x30,0x78,0xf5,0xff,0x31,0x76,0xf7,0xff,0x2f,0x75,0xf8, 0xff,0x2f,0x75,0xf9,0xff,0x32,0x73,0xfa,0xff,0x33,0x73,0xfc,0xff,0x82,0x32, 0x72,0xfd,0xff,0x63,0x30,0x72,0xfd,0xff,0x2e,0x73,0xfd,0xff,0x2e,0x76,0xff, 0xff,0x2f,0x6d,0xfc,0xff,0x36,0x57,0xd7,0xff,0x39,0x55,0xc1,0xff,0x39,0x54, 0xc3,0xff,0x3a,0x52,0xc1,0xff,0x3b,0x51,0xbe,0xff,0x3c,0x52,0xbb,0xff,0x3c, 0x52,0xba,0xff,0x3a,0x51,0xb7,0xff,0x38,0x51,0xb4,0xff,0x36,0x4e,0xb3,0xff, 0x34,0x4f,0xb1,0xff,0x32,0x4e,0xaf,0xff,0x30,0x4d,0xad,0xff,0x31,0x4c,0xac, 0xff,0x36,0x4e,0xa8,0xff,0x3c,0x52,0xa6,0xff,0x4e,0x5a,0x98,0xff,0x10,0x13, 0x1a,0x62,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0xc5, 0x45,0x39,0xb3,0xcb,0x2b,0x14,0xff,0xce,0x2c,0x1d,0xff,0xcd,0x2c,0x1d,0xff, 0xcc,0x30,0x1b,0xff,0xd0,0x37,0x1f,0xff,0xc5,0x35,0x20,0xff,0xc5,0x41,0x25, 0xff,0x44,0x23,0x1a,0x48,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0xb4,0xdc, 0xc5,0x00,0xb3,0xd6,0xbf,0x00,0xb4,0xd4,0xbd,0x00,0x00,0x00,0x00,0x02,0x98, 0xcc,0xa4,0xd9,0x89,0xcf,0x9d,0xff,0x8b,0xd4,0xa8,0xff,0x8f,0xd7,0xb4,0xff, 0x9a,0xdd,0xbd,0xff,0xa7,0xe6,0xc9,0xff,0xb1,0xee,0xd3,0xff,0xb6,0xf1,0xd7, 0xff,0xb8,0xef,0xd9,0xff,0xb3,0xec,0xd5,0xff,0xb6,0xef,0xd8,0xff,0xb0,0xec, 0xd0,0xff,0x96,0xaa,0xa1,0xff,0xcb,0xcb,0xcb,0xff,0x8a,0x95,0x90,0xff,0x8e, 0xb8,0xa4,0xff,0x8f,0xbb,0xa7,0xff,0x90,0xbc,0xa8,0xff,0x92,0xbf,0xab,0xff, 0x87,0xb8,0xa0,0xff,0x8a,0xbb,0xa2,0xff,0x8c,0xbd,0xa4,0xff,0x7f,0xb4,0x96, 0xff,0x80,0xb6,0x97,0xff,0x81,0xb8,0x99,0xff,0x79,0xb0,0x90,0xff,0x7d,0xb4, 0x93,0xff,0x83,0xba,0x99,0xff,0x81,0xb6,0x95,0xff,0x87,0xbb,0x9b,0xff,0x8d, 0xbf,0xa0,0xff,0x8b,0xb5,0x98,0xff,0x8c,0xb5,0x99,0xff,0x88,0xb3,0x95,0xff, 0xc4,0xd4,0xc8,0x92,0xbf,0xcf,0xc3,0x8e,0xba,0xcb,0xbe,0x8c,0xe5,0xe5,0xe5, 0x2f,0xc8,0xc8,0xc8,0x2c,0xa9,0xa9,0xa9,0x2c,0x98,0x98,0x98,0x2b,0x8e,0x8e, 0x8e,0x2b,0x86,0x86,0x86,0x2b,0x83,0x83,0x83,0x2c,0x82,0x82,0x82,0x2e,0x7d, 0x7d,0x7d,0x30,0x7d,0x7d,0x7d,0x32,0x79,0x79,0x79,0x33,0x73,0x73,0x73,0x35, 0x6d,0x6d,0x6d,0x36,0x66,0x66,0x66,0x37,0x5e,0x5e,0x5e,0x3b,0x54,0x54,0x54, 0x4c,0xa2,0xa2,0xa2,0xf4,0xdd,0xdd,0xdd,0xff,0x26,0x26,0x26,0x71,0x00,0x00, 0x00,0x1a,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x02,0x90,0x00,0x00,0x00,0x00, 0x85,0xff,0xff,0xff,0x00,0x1a,0x00,0x00,0x00,0x0b,0x7f,0xa5,0xe7,0xcf,0x27, 0x71,0xf1,0xff,0x2f,0x78,0xf3,0xff,0x30,0x76,0xf4,0xff,0x2f,0x75,0xf6,0xff, 0x2f,0x75,0xf7,0xff,0x30,0x75,0xf9,0xff,0x32,0x72,0xf9,0xff,0x33,0x71,0xf9, 0xff,0x33,0x72,0xf9,0xff,0x31,0x72,0xf7,0xff,0x31,0x72,0xf8,0xff,0x32,0x76, 0xff,0xff,0x32,0x6d,0xfd,0xff,0x37,0x57,0xd6,0xff,0x3b,0x53,0xbd,0xff,0x3c, 0x54,0xbd,0xff,0x3d,0x52,0xbd,0xff,0x3e,0x50,0xbb,0xff,0x3e,0x50,0xb8,0xff, 0x3d,0x50,0xb7,0xff,0x3a,0x4f,0xb3,0xff,0x3a,0x50,0xb3,0xff,0x37,0x4d,0xb1, 0xff,0x33,0x4c,0xaf,0xff,0x82,0x2f,0x4b,0xac,0xff,0x52,0x34,0x4b,0xaa,0xff, 0x37,0x4d,0xa4,0xff,0x3d,0x50,0xa0,0xff,0x4f,0x59,0x98,0xff,0x0f,0x14,0x1b, 0x62,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x10,0xca,0x53,0x45,0x61,0xc7,0x2d, 0x1a,0xff,0xcc,0x2b,0x1f,0xff,0xcb,0x2d,0x18,0xff,0xcb,0x2d,0x1a,0xff,0xcc, 0x2e,0x18,0xff,0xd0,0x36,0x1f,0xff,0xcb,0x37,0x21,0xff,0xcc,0x38,0x1c,0xff, 0xa3,0x43,0x2b,0xbe,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x0b,0x00,0x00,0x00, 0x01,0xb5,0xd1,0xbb,0x00,0xb6,0xd0,0xb9,0x00,0xa0,0xc4,0xa9,0x67,0x87,0xc5, 0x97,0xff,0x87,0xca,0x9e,0xff,0x8c,0xd0,0xaa,0xff,0x90,0xd4,0xb1,0xff,0x97, 0xda,0xb8,0xff,0xa4,0xe1,0xc5,0xff,0xab,0xe6,0xcc,0xff,0xae,0xea,0xcf,0xff, 0xad,0xe8,0xce,0xff,0xb0,0xea,0xcf,0xff,0xac,0xe7,0xce,0xff,0xa7,0xe3,0xc7, 0xff,0x89,0x98,0x91,0xff,0xca,0xca,0xca,0xff,0x82,0x94,0x8c,0xff,0x8f,0xb9, 0xa5,0xff,0x8e,0xba,0xa7,0xff,0x8f,0xbb,0xa8,0xff,0x91,0xbd,0xaa,0xff,0x87, 0xb8,0xa0,0xff,0x8a,0xba,0xa2,0xff,0x8c,0xbc,0xa4,0xff,0x7f,0xb4,0x96,0xff, 0x80,0xb6,0x97,0xff,0x81,0xb7,0x98,0xff,0x78,0xaf,0x8f,0xff,0x7a,0xb1,0x91, 0xff,0x7e,0xb6,0x95,0xff,0x7a,0xb0,0x8e,0xff,0x7f,0xb5,0x94,0xff,0x85,0xb9, 0x99,0xff,0x82,0xaf,0x90,0xff,0x82,0xae,0x8f,0xff,0x7f,0xad,0x8d,0xff,0xbe, 0xcf,0xc2,0x8c,0xb9,0xcb,0xbe,0x8a,0xb4,0xc7,0xb9,0x88,0xcc,0xcc,0xcc,0x2b, 0xb1,0xb1,0xb1,0x29,0xa3,0xa3,0xa3,0x27,0x96,0x96,0x96,0x27,0x8f,0x8f,0x8f, 0x28,0x88,0x88,0x88,0x28,0x87,0x87,0x87,0x29,0x87,0x87,0x87,0x2a,0x86,0x86, 0x86,0x2d,0x85,0x85,0x85,0x2f,0x83,0x83,0x83,0x30,0x7b,0x7b,0x7b,0x32,0x73, 0x73,0x73,0x33,0x6a,0x6a,0x6a,0x34,0x63,0x63,0x63,0x35,0x58,0x58,0x58,0x42, 0x92,0x92,0x92,0xe9,0xe2,0xe2,0xe2,0xff,0x2b,0x2b,0x2b,0x8c,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x04,0x90,0x00,0x00,0x00,0x00,0x85, 0xff,0xff,0xff,0x00,0x6e,0x00,0x00,0x00,0x0b,0x7d,0xa3,0xe5,0xd0,0x28,0x6f, 0xf1,0xff,0x2f,0x79,0xf2,0xff,0x2f,0x76,0xf3,0xff,0x30,0x75,0xf4,0xff,0x2f, 0x75,0xf6,0xff,0x30,0x76,0xf9,0xff,0x32,0x75,0xfa,0xff,0x31,0x74,0xfa,0xff, 0x30,0x75,0xfa,0xff,0x31,0x73,0xfa,0xff,0x32,0x73,0xfa,0xff,0x32,0x76,0xff, 0xff,0x2d,0x6f,0xff,0xff,0x36,0x57,0xd6,0xff,0x3f,0x54,0xbd,0xff,0x3d,0x52, 0xba,0xff,0x3d,0x50,0xb9,0xff,0x3d,0x4f,0xb6,0xff,0x3e,0x50,0xb7,0xff,0x3c, 0x4f,0xb4,0xff,0x3b,0x4f,0xb2,0xff,0x3a,0x4f,0xb1,0xff,0x37,0x4c,0xae,0xff, 0x34,0x4b,0xae,0xff,0x33,0x4b,0xac,0xff,0x33,0x4b,0xaa,0xff,0x35,0x4b,0xa6, 0xff,0x39,0x4c,0xa1,0xff,0x3d,0x4c,0xa0,0xff,0x4b,0x57,0x96,0xff,0x0f,0x13, 0x1b,0x62,0x00,0x00,0x00,0x2d,0x7a,0x37,0x2a,0x27,0xcb,0x2f,0x1d,0xfa,0xcb, 0x2b,0x1b,0xff,0xca,0x2d,0x1c,0xff,0xcc,0x2d,0x1a,0xff,0xce,0x2c,0x1a,0xff, 0xcd,0x2b,0x19,0xff,0xcd,0x33,0x1c,0xff,0xcf,0x3a,0x26,0xff,0xc6,0x34,0x1e, 0xff,0xca,0x42,0x22,0xff,0x4c,0x22,0x1b,0x4e,0x00,0x00,0x00,0x14,0x00,0x00, 0x00,0x04,0xb5,0xd4,0xbd,0x00,0x00,0x00,0x00,0x02,0x93,0xbe,0x9a,0xe3,0x7e, 0xc0,0x93,0xff,0x83,0xc7,0x98,0xff,0x8b,0xcc,0xa3,0xff,0x8f,0xd0,0xab,0xff, 0x94,0xd4,0xb1,0xff,0x9b,0xda,0xba,0xff,0xa0,0xde,0xc2,0xff,0xa2,0xe1,0xc3, 0xff,0xa7,0xe4,0xc7,0xff,0xa8,0xe2,0xc7,0xff,0xa5,0xe0,0xc4,0xff,0xa0,0xdb, 0xc0,0xff,0x85,0x91,0x8c,0xff,0xc9,0xc9,0xc9,0xff,0x7b,0x93,0x86,0xff,0x86, 0xb0,0x9c,0xff,0x81,0xb0,0x9a,0xff,0x82,0xb1,0x9b,0xff,0x84,0xb3,0x9d,0xff, 0x7f,0xb0,0x96,0xff,0x82,0xb1,0x98,0xff,0x84,0xb3,0x9a,0xff,0x79,0xac,0x8e, 0xff,0x79,0xad,0x8f,0xff,0x79,0xae,0x90,0xff,0x6f,0xa5,0x85,0xff,0x70,0xa7, 0x86,0xff,0x73,0xaa,0x89,0xff,0x6d,0xa6,0x84,0xff,0x71,0xaa,0x88,0xff,0x75, 0xae,0x8c,0xff,0x6b,0xa1,0x7f,0xff,0x6a,0xa1,0x7f,0xff,0x6a,0xa0,0x7f,0xff, 0x82,0xa2,0x88,0xee,0x7f,0xa0,0x86,0xee,0x7c,0x9c,0x82,0xee,0xc2,0xc2,0xc2, 0x32,0xb7,0xb7,0xb7,0x32,0xab,0xab,0xab,0x30,0x96,0x96,0x96,0x27,0x90,0x90, 0x90,0x27,0x8b,0x8b,0x8b,0x27,0x8d,0x8d,0x8d,0x29,0x8c,0x8c,0x8c,0x2a,0x90, 0x90,0x90,0x2d,0x90,0x90,0x90,0x30,0x8b,0x8b,0x8b,0x31,0x81,0x81,0x81,0x32, 0x77,0x77,0x77,0x2f,0x6d,0x6d,0x6d,0x30,0x66,0x66,0x66,0x31,0x5d,0x5d,0x5d, 0x3c,0x87,0x87,0x87,0xe2,0xe6,0xe6,0xe6,0xff,0x3b,0x3b,0x3b,0xa5,0x00,0x00, 0x00,0x25,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x06,0x90,0x00,0x00,0x00,0x00, 0x85,0xff,0xff,0xff,0x00,0x6e,0x00,0x00,0x00,0x0b,0x7d,0xa2,0xe6,0xd2,0x2b, 0x71,0xee,0xff,0x30,0x79,0xf3,0xff,0x30,0x77,0xf3,0xff,0x2f,0x75,0xf4,0xff, 0x30,0x76,0xf7,0xff,0x30,0x76,0xf9,0xff,0x2f,0x75,0xf9,0xff,0x30,0x76,0xfb, 0xff,0x2f,0x76,0xfb,0xff,0x31,0x75,0xfb,0xff,0x31,0x75,0xfc,0xff,0x31,0x77, 0xff,0xff,0x2e,0x6f,0xff,0xff,0x36,0x59,0xd6,0xff,0x40,0x51,0xbc,0xff,0x3f, 0x50,0xba,0xff,0x40,0x4f,0xb6,0xff,0x40,0x4f,0xb5,0xff,0x3e,0x4e,0xb6,0xff, 0x3e,0x4e,0xb4,0xff,0x3d,0x4e,0xb3,0xff,0x3a,0x4d,0xb1,0xff,0x38,0x4e,0xb0, 0xff,0x34,0x4b,0xad,0xff,0x33,0x4a,0xaa,0xff,0x34,0x49,0xa6,0xff,0x37,0x49, 0xa1,0xff,0x3b,0x4a,0xa1,0xff,0x3f,0x4b,0xa2,0xff,0x49,0x54,0x95,0xff,0x0c, 0x0e,0x13,0x5f,0x00,0x00,0x00,0x2e,0xc7,0x41,0x2d,0xbf,0xce,0x27,0x18,0xff, 0xcf,0x29,0x19,0xff,0xcb,0x2b,0x19,0xff,0xcb,0x2a,0x18,0xff,0xcc,0x2a,0x18, 0xff,0xcd,0x2c,0x18,0xff,0xce,0x31,0x18,0xff,0xd0,0x36,0x1e,0xff,0xc3,0x31, 0x17,0xff,0xc8,0x39,0x20,0xff,0xa8,0x3d,0x2d,0xc4,0x00,0x00,0x00,0x22,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x02,0xa2,0xbb,0xa6,0x42,0x81,0xb7,0x88,0xff, 0x7c,0xbb,0x8a,0xff,0x83,0xc2,0x93,0xff,0x88,0xc8,0x9d,0xff,0x8c,0xcd,0xa5, 0xff,0x8e,0xd0,0xaa,0xff,0x92,0xd1,0xae,0xff,0x94,0xd4,0xb5,0xff,0x95,0xd7, 0xb5,0xff,0x97,0xd7,0xb8,0xff,0x97,0xd5,0xb6,0xff,0x94,0xd1,0xb2,0xff,0x8e, 0xce,0xae,0xff,0x81,0x8d,0x87,0xff,0xc8,0xc8,0xc8,0xff,0x76,0x92,0x82,0xff, 0x88,0xb2,0x9e,0xff,0x82,0xb1,0x9a,0xff,0x83,0xb2,0x9b,0xff,0x85,0xb4,0x9d, 0xff,0x7f,0xaf,0x95,0xff,0x82,0xb1,0x98,0xff,0x85,0xb4,0x9b,0xff,0x7a,0xac, 0x8f,0xff,0x7a,0xad,0x8f,0xff,0x7a,0xae,0x90,0xff,0x6f,0xa5,0x85,0xff,0x70, 0xa7,0x86,0xff,0x71,0xa9,0x87,0xff,0x6a,0xa3,0x81,0xff,0x6b,0xa5,0x83,0xff, 0x6e,0xa8,0x86,0xff,0x64,0x9b,0x79,0xff,0x66,0x9d,0x7b,0xff,0x67,0x9e,0x7c, 0xff,0x82,0xa1,0x88,0xee,0x7f,0x9f,0x86,0xee,0x7d,0x9d,0x83,0xee,0xc1,0xc1, 0xc1,0x35,0xb5,0xb5,0xb5,0x32,0xac,0xac,0xac,0x32,0x9b,0x9b,0x9b,0x29,0x95, 0x95,0x95,0x26,0x95,0x95,0x95,0x28,0x94,0x94,0x94,0x29,0x96,0x96,0x96,0x2c, 0x99,0x99,0x99,0x2f,0x98,0x98,0x98,0x31,0x94,0x94,0x94,0x32,0x89,0x89,0x89, 0x32,0x7e,0x7e,0x7e,0x30,0x6f,0x6f,0x6f,0x2f,0x68,0x68,0x68,0x2f,0x62,0x62, 0x62,0x36,0x8c,0x8c,0x8c,0xda,0xe5,0xe5,0xe5,0xff,0x3d,0x3d,0x3d,0xa9,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x08,0x90,0x00,0x00,0x00, 0x00,0x85,0xff,0xff,0xff,0x00,0x08,0x00,0x00,0x00,0x0b,0x7c,0xa2,0xe7,0xd4, 0x2c,0x71,0xed,0xff,0x30,0x79,0xf0,0xff,0x31,0x79,0xf2,0xff,0x30,0x77,0xf2, 0xff,0x31,0x77,0xf5,0xff,0x31,0x77,0xf7,0xff,0x82,0x30,0x76,0xf9,0xff,0x51, 0x31,0x77,0xfb,0xff,0x31,0x74,0xfe,0xff,0x31,0x73,0xff,0xff,0x30,0x76,0xff, 0xff,0x2e,0x6e,0xfe,0xff,0x39,0x57,0xd3,0xff,0x40,0x51,0xb8,0xff,0x40,0x52, 0xb9,0xff,0x42,0x51,0xb6,0xff,0x44,0x4f,0xb4,0xff,0x41,0x4e,0xb2,0xff,0x42, 0x4e,0xb0,0xff,0x3f,0x4f,0xae,0xff,0x3a,0x4d,0xae,0xff,0x36,0x4c,0xad,0xff, 0x34,0x4b,0xa9,0xff,0x34,0x49,0xaa,0xff,0x34,0x48,0xa5,0xff,0x39,0x49,0xa0, 0xff,0x3c,0x48,0x9e,0xff,0x41,0x4a,0x99,0xff,0x46,0x50,0x91,0xff,0x00,0x00, 0x00,0x56,0x96,0x55,0x43,0x7a,0xcf,0x26,0x1b,0xff,0xcb,0x26,0x1b,0xff,0xcb, 0x28,0x19,0xff,0xcb,0x28,0x1a,0xff,0xca,0x27,0x19,0xff,0xcb,0x29,0x18,0xff, 0xcd,0x2c,0x18,0xff,0xcb,0x2e,0x17,0xff,0xcf,0x38,0x23,0xff,0xc6,0x2d,0x19, 0xff,0xc8,0x33,0x1d,0xff,0xc9,0x3b,0x1d,0xff,0x59,0x20,0x16,0x54,0x00,0x00, 0x00,0x15,0x00,0x00,0x00,0x06,0x9e,0xbc,0xa1,0x84,0x7c,0xac,0x77,0xff,0x7d, 0xb4,0x81,0xff,0x81,0xbb,0x8d,0xff,0x84,0xc1,0x94,0xff,0x86,0xc6,0x9d,0xff, 0x87,0xca,0xa2,0xff,0x8c,0xcb,0xa5,0xff,0x8b,0xcc,0xa8,0xff,0x89,0xcd,0xa9, 0xff,0x88,0xcd,0xab,0xff,0x88,0xcb,0xa8,0xff,0x87,0xc8,0xa4,0xff,0x85,0xc6, 0xa5,0xff,0x7a,0x8b,0x82,0xff,0xcd,0xcd,0xcd,0xff,0x71,0x8b,0x7c,0xff,0x85, 0xb0,0x9b,0xff,0x83,0xb1,0x9b,0xff,0x84,0xb2,0x9c,0xff,0x84,0xb3,0x9d,0xff, 0x7f,0xae,0x95,0xff,0x83,0xb2,0x98,0xff,0x85,0xb4,0x9b,0xff,0x7a,0xac,0x8f, 0xff,0x7b,0xae,0x90,0xff,0x7a,0xae,0x90,0xff,0x70,0xa6,0x85,0xff,0x70,0xa6, 0x86,0xff,0x70,0xa8,0x86,0xff,0x69,0xa2,0x80,0xff,0x6a,0xa4,0x81,0xff,0x6c, 0xa6,0x84,0xff,0x62,0x99,0x77,0xff,0x67,0x9d,0x7c,0xff,0x6b,0xa0,0x80,0xff, 0x86,0xa5,0x8d,0xef,0x85,0xa4,0x8b,0xef,0x81,0xa1,0x88,0xee,0xc8,0xc8,0xc8, 0x37,0xb9,0xb9,0xb9,0x35,0xb0,0xb0,0xb0,0x33,0x82,0x9f,0x9f,0x9f,0x2a,0x12, 0x9c,0x9c,0x9c,0x2b,0x9d,0x9d,0x9d,0x2b,0x9e,0x9e,0x9e,0x2e,0xa1,0xa1,0xa1, 0x31,0x9f,0x9f,0x9f,0x33,0x9c,0x9c,0x9c,0x34,0x91,0x91,0x91,0x32,0x81,0x81, 0x81,0x2f,0x74,0x74,0x74,0x2f,0x6a,0x6a,0x6a,0x2e,0x65,0x65,0x65,0x34,0x95, 0x95,0x95,0xdf,0xe3,0xe3,0xe3,0xff,0x34,0x34,0x34,0x93,0x00,0x00,0x00,0x2c, 0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x01,0x8f,0x00,0x00, 0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x6f,0x00,0x00,0x00,0x0b,0x79,0xa0,0xe5, 0xd7,0x2e,0x73,0xed,0xff,0x32,0x7a,0xf1,0xff,0x32,0x7a,0xf3,0xff,0x32,0x79, 0xf4,0xff,0x31,0x78,0xf6,0xff,0x32,0x78,0xf9,0xff,0x31,0x77,0xfa,0xff,0x31, 0x76,0xfa,0xff,0x31,0x77,0xfa,0xff,0x30,0x76,0xfd,0xff,0x31,0x75,0xfd,0xff, 0x31,0x79,0xff,0xff,0x30,0x6f,0xff,0xff,0x3e,0x57,0xd3,0xff,0x44,0x4f,0xb4, 0xff,0x43,0x50,0xb5,0xff,0x44,0x50,0xb6,0xff,0x44,0x4f,0xb3,0xff,0x43,0x4e, 0xb1,0xff,0x44,0x4f,0xb0,0xff,0x41,0x4e,0xad,0xff,0x3d,0x4c,0xac,0xff,0x38, 0x4a,0xad,0xff,0x35,0x4b,0xa9,0xff,0x34,0x48,0xa9,0xff,0x36,0x44,0xa3,0xff, 0x3a,0x47,0x9e,0xff,0x3e,0x47,0x9b,0xff,0x3f,0x4a,0x99,0xff,0x3f,0x53,0x92, 0xf8,0x44,0x30,0x37,0x7d,0xd2,0x34,0x1e,0xf6,0xcb,0x26,0x16,0xff,0xcb,0x28, 0x19,0xff,0xcb,0x27,0x18,0xff,0xc9,0x28,0x1a,0xff,0xca,0x29,0x17,0xff,0xca, 0x28,0x17,0xff,0xcb,0x2b,0x19,0xff,0xcc,0x2c,0x19,0xff,0xcf,0x3b,0x25,0xff, 0xc1,0x2a,0x17,0xff,0xc3,0x2d,0x1c,0xff,0xc9,0x30,0x19,0xff,0xa7,0x34,0x20, 0xc8,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0f,0x9a,0xb7,0x98,0xc1,0x74,0xa0, 0x66,0xff,0x77,0xad,0x73,0xff,0x7d,0xb4,0x86,0xff,0x7e,0xba,0x8b,0xff,0x80, 0xbf,0x95,0xff,0x7f,0xc1,0x99,0xff,0x83,0xc3,0x9c,0xff,0x83,0xc3,0x9d,0xff, 0x80,0xc3,0x9f,0xff,0x7d,0xc3,0x9d,0xff,0x7c,0xc2,0x9a,0xff,0x7c,0xc3,0x99, 0xff,0x78,0xbf,0x97,0xff,0x6c,0x82,0x75,0xff,0xd2,0xd2,0xd2,0xff,0x76,0x8a, 0x7e,0xff,0x74,0xa2,0x8a,0xff,0x72,0xa3,0x87,0xff,0x75,0xa6,0x8a,0xff,0x75, 0xa7,0x8b,0xff,0x71,0xa3,0x85,0xff,0x75,0xa7,0x8a,0xff,0x79,0xaa,0x8d,0xff, 0x70,0xa3,0x84,0xff,0x71,0xa4,0x85,0xff,0x70,0xa5,0x85,0xff,0x69,0xa0,0x7f, 0xff,0x69,0xa1,0x7f,0xff,0x69,0xa2,0x7f,0xff,0x5f,0x99,0x76,0xff,0x61,0x9a, 0x78,0xff,0x63,0x9c,0x7a,0xff,0x61,0x96,0x75,0xff,0x67,0x9a,0x7a,0xff,0x6c, 0x9d,0x7f,0xff,0x6d,0x95,0x78,0xff,0x6c,0x94,0x76,0xff,0x68,0x91,0x72,0xff, 0xba,0xc3,0xba,0x73,0xaf,0xb9,0xaf,0x71,0xa9,0xb3,0xa9,0x6f,0xa8,0xa8,0xa8, 0x2e,0xa6,0xa6,0xa6,0x2e,0xa6,0xa6,0xa6,0x2d,0xa7,0xa7,0xa7,0x2f,0xa8,0xa8, 0xa8,0x32,0xa9,0xa9,0xa9,0x34,0xa8,0xa8,0xa8,0x36,0xa1,0xa1,0xa1,0x35,0x94, 0x94,0x94,0x33,0x85,0x85,0x85,0x30,0x77,0x77,0x77,0x2e,0x6d,0x6d,0x6d,0x2d, 0x68,0x68,0x68,0x34,0xa3,0xa3,0xa3,0xe7,0xe0,0xe0,0xe0,0xff,0x2a,0x2a,0x2a, 0x7b,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x02,0x8f,0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x6f,0x00,0x00, 0x00,0x0b,0x78,0x9f,0xe4,0xd7,0x30,0x76,0xee,0xff,0x32,0x79,0xf1,0xff,0x32, 0x79,0xf2,0xff,0x31,0x79,0xf3,0xff,0x32,0x79,0xf5,0xff,0x31,0x77,0xf8,0xff, 0x32,0x79,0xfb,0xff,0x30,0x77,0xfa,0xff,0x31,0x78,0xfa,0xff,0x32,0x78,0xfd, 0xff,0x33,0x78,0xfd,0xff,0x32,0x7a,0xff,0xff,0x30,0x6e,0xfe,0xff,0x3e,0x56, 0xd2,0xff,0x46,0x50,0xb5,0xff,0x44,0x51,0xb6,0xff,0x46,0x50,0xb6,0xff,0x46, 0x4e,0xb1,0xff,0x45,0x4e,0xaf,0xff,0x45,0x4e,0xae,0xff,0x43,0x4d,0xab,0xff, 0x3e,0x4c,0xab,0xff,0x38,0x4b,0xac,0xff,0x33,0x4a,0xaa,0xff,0x36,0x47,0xa9, 0xff,0x38,0x46,0xa1,0xff,0x3b,0x46,0x9d,0xff,0x40,0x46,0x99,0xff,0x3e,0x48, 0x9d,0xff,0x49,0x55,0x96,0xf9,0xaf,0x39,0x2f,0xe4,0xd0,0x22,0x0f,0xff,0xcd, 0x23,0x1a,0xff,0xc8,0x26,0x1a,0xff,0xc9,0x26,0x17,0xff,0xc9,0x26,0x19,0xff, 0xca,0x29,0x17,0xff,0xcb,0x29,0x17,0xff,0xcd,0x2a,0x19,0xff,0xce,0x2a,0x1a, 0xff,0xd1,0x3a,0x24,0xff,0xc2,0x29,0x1a,0xff,0xc0,0x21,0x16,0xff,0xc3,0x27, 0x19,0xff,0xc4,0x2b,0x19,0xff,0x4f,0x1b,0x11,0x54,0x00,0x00,0x00,0x1c,0x8a, 0xa2,0x7c,0xea,0x6e,0x95,0x58,0xff,0x70,0xa4,0x68,0xff,0x74,0xa9,0x75,0xff, 0x77,0xb0,0x7f,0xff,0x78,0xb6,0x8a,0xff,0x7a,0xb9,0x91,0xff,0x7b,0xbb,0x94, 0xff,0x79,0xbb,0x94,0xff,0x76,0xbb,0x94,0xff,0x76,0xbb,0x92,0xff,0x72,0xb8, 0x8e,0xff,0x6d,0xb3,0x8a,0xff,0x66,0xac,0x80,0xff,0x5a,0x82,0x69,0xff,0xd1, 0xd1,0xd1,0xff,0x92,0x9d,0x96,0xff,0x6f,0x9d,0x84,0xff,0x72,0xa3,0x87,0xff, 0x74,0xa6,0x89,0xff,0x75,0xa7,0x8a,0xff,0x70,0xa3,0x85,0xff,0x75,0xa7,0x8a, 0xff,0x79,0xaa,0x8d,0xff,0x72,0xa4,0x85,0xff,0x72,0xa5,0x86,0xff,0x72,0xa7, 0x87,0xff,0x6b,0xa2,0x80,0xff,0x6a,0xa2,0x80,0xff,0x6a,0xa3,0x80,0xff,0x61, 0x9a,0x77,0xff,0x63,0x9c,0x79,0xff,0x67,0xa0,0x7d,0xff,0x66,0x99,0x79,0xff, 0x6c,0x9d,0x7e,0xff,0x72,0xa0,0x83,0xff,0x74,0x99,0x7e,0xff,0x72,0x98,0x7c, 0xff,0x6f,0x96,0x79,0xff,0xc1,0xc9,0xc1,0x78,0xb7,0xc0,0xb7,0x74,0xae,0xb7, 0xae,0x72,0xb4,0xb4,0xb4,0x32,0xb0,0xb0,0xb0,0x32,0xaf,0xaf,0xaf,0x32,0xb0, 0xb0,0xb0,0x33,0xb0,0xb0,0xb0,0x35,0xb0,0xb0,0xb0,0x38,0xae,0xae,0xae,0x39, 0xa6,0xa6,0xa6,0x38,0x97,0x97,0x97,0x34,0x85,0x85,0x85,0x30,0x78,0x78,0x78, 0x2e,0x6f,0x6f,0x6f,0x2d,0x6c,0x6c,0x6c,0x35,0xc6,0xc6,0xc6,0xf3,0xce,0xce, 0xce,0xfe,0x13,0x13,0x13,0x4d,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x1f,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x02,0x8f,0x00,0x00,0x00,0x00,0x85,0xff,0xff, 0xff,0x00,0x6f,0x00,0x00,0x00,0x0b,0x7a,0xa2,0xe3,0xd8,0x34,0x78,0xef,0xff, 0x35,0x7d,0xf1,0xff,0x33,0x7a,0xf1,0xff,0x31,0x7a,0xf3,0xff,0x30,0x79,0xf3, 0xff,0x32,0x7a,0xf7,0xff,0x33,0x79,0xf9,0xff,0x33,0x79,0xfb,0xff,0x33,0x79, 0xfd,0xff,0x34,0x79,0xfd,0xff,0x35,0x7a,0xfe,0xff,0x33,0x7b,0xff,0xff,0x31, 0x6e,0xff,0xff,0x3e,0x57,0xd1,0xff,0x46,0x50,0xb4,0xff,0x46,0x51,0xb6,0xff, 0x46,0x50,0xb3,0xff,0x47,0x50,0xaf,0xff,0x46,0x50,0xae,0xff,0x46,0x51,0xae, 0xff,0x45,0x4e,0xa8,0xff,0x3f,0x4b,0xa9,0xff,0x38,0x49,0xa9,0xff,0x33,0x48, 0xa8,0xff,0x37,0x45,0xa3,0xff,0x39,0x44,0x9e,0xff,0x3f,0x44,0x9c,0xff,0x3f, 0x46,0x9a,0xff,0x38,0x4d,0x9e,0xff,0x84,0x3e,0x5f,0xff,0xd4,0x23,0x13,0xff, 0xca,0x23,0x1a,0xff,0xc9,0x24,0x17,0xff,0xcb,0x25,0x1a,0xff,0xca,0x27,0x1b, 0xff,0xcc,0x28,0x1a,0xff,0xcb,0x27,0x17,0xff,0xcb,0x29,0x17,0xff,0xcd,0x2b, 0x1a,0xff,0xcc,0x2a,0x1a,0xff,0xd2,0x38,0x24,0xff,0xce,0x35,0x23,0xff,0xba, 0x16,0x11,0xff,0xbb,0x1b,0x13,0xff,0xbc,0x19,0x12,0xff,0xa5,0x1e,0x1c,0xc6, 0x00,0x00,0x00,0x2d,0x72,0x7e,0x53,0xf8,0x68,0x88,0x4f,0xff,0x6e,0x9b,0x64, 0xff,0x6f,0xa3,0x6c,0xff,0x6f,0xa8,0x75,0xff,0x6e,0xab,0x7b,0xff,0x71,0xaf, 0x81,0xff,0x70,0xb0,0x83,0xff,0x6f,0xb1,0x86,0xff,0x6c,0xb0,0x86,0xff,0x6c, 0xaf,0x84,0xff,0x69,0xad,0x82,0xff,0x61,0xa5,0x7b,0xff,0x60,0xa5,0x7b,0xff, 0x57,0x91,0x6d,0xff,0xc1,0xc1,0xc1,0xff,0xb7,0xbc,0xb9,0xff,0x67,0x95,0x7c, 0xff,0x72,0xa3,0x87,0xff,0x73,0xa5,0x88,0xff,0x74,0xa6,0x8a,0xff,0x70,0xa3, 0x84,0xff,0x75,0xa7,0x89,0xff,0x7a,0xab,0x8e,0xff,0x73,0xa5,0x86,0xff,0x74, 0xa7,0x88,0xff,0x74,0xa8,0x88,0xff,0x6d,0xa3,0x82,0xff,0x6c,0xa4,0x82,0xff, 0x6d,0xa5,0x83,0xff,0x64,0x9c,0x7a,0xff,0x67,0x9f,0x7d,0xff,0x6b,0xa2,0x81, 0xff,0x69,0x9c,0x7c,0xff,0x6f,0x9f,0x82,0xff,0x75,0xa3,0x87,0xff,0x78,0x9c, 0x81,0xff,0x76,0x9b,0x80,0xff,0x73,0x98,0x7c,0xff,0xc5,0xcc,0xc5,0x7c,0xbd, 0xc5,0xbd,0x77,0xb4,0xbd,0xb4,0x75,0xbd,0xbd,0xbd,0x36,0xb9,0xb9,0xb9,0x35, 0xb7,0xb7,0xb7,0x36,0xb7,0xb7,0xb7,0x38,0xb8,0xb8,0xb8,0x3a,0xb7,0xb7,0xb7, 0x3b,0xb3,0xb3,0xb3,0x3c,0xa9,0xa9,0xa9,0x3a,0x98,0x98,0x98,0x34,0x85,0x85, 0x85,0x30,0x7a,0x7a,0x7a,0x2f,0x71,0x71,0x71,0x2d,0x72,0x72,0x72,0x45,0xe3, 0xe3,0xe3,0xfe,0xb4,0xb4,0xb4,0xf4,0x03,0x03,0x03,0x31,0x00,0x00,0x00,0x31, 0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x02,0x8f,0x00,0x00, 0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x4c,0x00,0x00,0x00,0x0b,0x7a,0xa2,0xe1, 0xda,0x35,0x78,0xed,0xff,0x37,0x7e,0xf2,0xff,0x35,0x7c,0xf2,0xff,0x34,0x7c, 0xf3,0xff,0x34,0x7b,0xf6,0xff,0x33,0x7a,0xf7,0xff,0x34,0x7a,0xf8,0xff,0x37, 0x7b,0xfc,0xff,0x3a,0x79,0xff,0xff,0x33,0x79,0xfc,0xff,0x34,0x7a,0xfd,0xff, 0x36,0x7b,0xff,0xff,0x2d,0x6f,0xff,0xff,0x3d,0x56,0xcf,0xff,0x48,0x51,0xb3, 0xff,0x47,0x51,0xb5,0xff,0x49,0x4f,0xb1,0xff,0x49,0x50,0xaf,0xff,0x48,0x50, 0xb0,0xff,0x47,0x4f,0xae,0xff,0x45,0x4e,0xab,0xff,0x3f,0x4b,0xa8,0xff,0x36, 0x49,0xa8,0xff,0x36,0x46,0xa7,0xff,0x3a,0x45,0xa1,0xff,0x3b,0x45,0x9c,0xff, 0x40,0x43,0x99,0xff,0x34,0x4a,0x9f,0xff,0x66,0x3e,0x7a,0xff,0xd2,0x21,0x17, 0xff,0xcf,0x20,0x1b,0xff,0xcd,0x20,0x18,0xff,0xca,0x24,0x19,0xff,0xcc,0x24, 0x19,0xff,0xcd,0x25,0x17,0xff,0xcd,0x25,0x19,0xff,0xcd,0x25,0x18,0xff,0xce, 0x29,0x18,0xff,0xcc,0x2c,0x19,0xff,0xcb,0x2a,0x19,0xff,0xd2,0x37,0x20,0xff, 0xd4,0x40,0x2d,0xff,0xb6,0x11,0x13,0xff,0xb5,0x10,0x12,0xff,0xb1,0x0b,0x15, 0xff,0xba,0x08,0x10,0xff,0x4e,0x1c,0x1f,0x6b,0x60,0x63,0x34,0xeb,0x61,0x7c, 0x42,0xff,0x64,0x8e,0x58,0xff,0x67,0x99,0x62,0xff,0x69,0xa0,0x6e,0xff,0x66, 0xa3,0x71,0xff,0x68,0xa6,0x74,0xff,0x68,0xa7,0x77,0xff,0x67,0xa8,0x7c,0xff, 0x62,0xa6,0x7a,0xff,0x63,0xa6,0x79,0xff,0x61,0xa4,0x79,0xff,0x5d,0xa0,0x76, 0xff,0x59,0x9d,0x72,0xff,0x57,0x99,0x6f,0xff,0x9d,0xa0,0x9e,0xff,0xdb,0xdc, 0xdc,0xff,0x5b,0x87,0x6d,0xff,0x62,0x94,0x75,0xff,0x64,0x96,0x77,0xff,0x64, 0x98,0x78,0xff,0x62,0x95,0x77,0xff,0x68,0x9a,0x7c,0xff,0x6d,0x9f,0x81,0xff, 0x6b,0x9c,0x7f,0xff,0x6c,0x9f,0x81,0xff,0x6c,0xa0,0x81,0xff,0x82,0x63,0x99, 0x7a,0xff,0x21,0x64,0x9a,0x7b,0xff,0x5e,0x95,0x75,0xff,0x60,0x97,0x77,0xff, 0x63,0x9a,0x7b,0xff,0x65,0x96,0x78,0xff,0x6b,0x9a,0x7d,0xff,0x70,0x9d,0x81, 0xff,0x74,0x98,0x7f,0xff,0x74,0x98,0x7e,0xff,0x70,0x95,0x7b,0xff,0xa7,0xb5, 0xa3,0xa5,0x9f,0xae,0x9b,0xa2,0x99,0xa8,0x95,0xa1,0xc3,0xc3,0xc3,0x3b,0xc0, 0xc0,0xc0,0x3a,0xbe,0xbe,0xbe,0x3a,0xbf,0xbf,0xbf,0x3b,0xbe,0xbe,0xbe,0x3e, 0xbb,0xbb,0xbb,0x3f,0xb7,0xb7,0xb7,0x3e,0xaa,0xaa,0xaa,0x3b,0x99,0x99,0x99, 0x34,0x87,0x87,0x87,0x30,0x79,0x79,0x79,0x2e,0x74,0x74,0x74,0x2d,0x7d,0x7d, 0x7d,0x73,0xf8,0xf8,0xf8,0xff,0x96,0x96,0x96,0xde,0x00,0x00,0x00,0x2f,0x00, 0x00,0x00,0x31,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x02, 0x8f,0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x55,0x00,0x00,0x00,0x0b, 0x7c,0xa2,0xe4,0xda,0x37,0x7b,0xed,0xff,0x38,0x7e,0xf2,0xff,0x34,0x7d,0xf2, 0xff,0x34,0x7e,0xef,0xff,0x34,0x7b,0xf7,0xff,0x35,0x7b,0xfb,0xff,0x35,0x7c, 0xf9,0xff,0x36,0x7c,0xfd,0xff,0x37,0x7c,0xfe,0xff,0x34,0x7b,0xfe,0xff,0x36, 0x7b,0xfe,0xff,0x37,0x7b,0xff,0xff,0x2d,0x70,0xff,0xff,0x3f,0x57,0xd0,0xff, 0x4b,0x51,0xb2,0xff,0x49,0x51,0xb3,0xff,0x4b,0x4f,0xb0,0xff,0x4b,0x50,0xaf, 0xff,0x4a,0x4f,0xad,0xff,0x4a,0x4f,0xae,0xff,0x49,0x4e,0xae,0xff,0x41,0x4b, 0xa9,0xff,0x3b,0x48,0xa7,0xff,0x38,0x45,0xa4,0xff,0x3a,0x43,0x9f,0xff,0x3c, 0x43,0x9e,0xff,0x38,0x47,0x9d,0xff,0x4a,0x45,0x94,0xff,0xbb,0x27,0x2c,0xff, 0xd1,0x1e,0x0d,0xff,0xcb,0x1e,0x1c,0xff,0xca,0x22,0x17,0xff,0xcb,0x23,0x18, 0xff,0xcc,0x24,0x19,0xff,0xcd,0x24,0x16,0xff,0xcc,0x25,0x17,0xff,0xce,0x26, 0x18,0xff,0xcd,0x28,0x16,0xff,0xcc,0x2a,0x17,0xff,0xcc,0x2a,0x19,0xff,0xce, 0x32,0x1c,0xff,0xd3,0x3a,0x28,0xff,0xb9,0x0f,0x14,0xff,0xb5,0x09,0x12,0xff, 0xb1,0x00,0x18,0xff,0xb1,0x00,0x14,0xff,0x8f,0x0c,0x19,0xd3,0x66,0x43,0x19, 0xdf,0x5c,0x70,0x39,0xff,0x5c,0x7f,0x4e,0xff,0x5e,0x89,0x57,0xff,0x60,0x92, 0x63,0xff,0x60,0x98,0x68,0xff,0x63,0x9c,0x6c,0xff,0x62,0x9f,0x70,0xff,0x62, 0xa0,0x74,0xff,0x62,0xa2,0x76,0xff,0x60,0x9f,0x73,0xff,0x58,0x98,0x6e,0xff, 0x57,0x97,0x6f,0xff,0x50,0x93,0x6a,0xff,0x49,0x8d,0x66,0xff,0x74,0x84,0x7a, 0xff,0xef,0xef,0xef,0xff,0x66,0x85,0x73,0xff,0x5f,0x8e,0x71,0xff,0x63,0x96, 0x77,0xff,0x64,0x97,0x78,0xff,0x61,0x95,0x76,0xff,0x66,0x99,0x7a,0xff,0x6c, 0x9e,0x80,0xff,0x6b,0x9d,0x7f,0xff,0x6e,0xa0,0x82,0xff,0x6f,0xa2,0x83,0xff, 0x66,0x9a,0x7c,0xff,0x66,0x9b,0x7c,0xff,0x68,0x9e,0x7f,0xff,0x60,0x97,0x77, 0xff,0x62,0x98,0x79,0xff,0x66,0x9c,0x7d,0xff,0x66,0x97,0x79,0xff,0x6b,0x9a, 0x7d,0xff,0x70,0x9d,0x82,0xff,0x82,0x73,0x97,0x7e,0xff,0x13,0x70,0x96,0x7b, 0xff,0xa8,0xb6,0xa5,0xa5,0xa1,0xb0,0x9e,0xa4,0x9b,0xab,0x98,0xa2,0xc7,0xc7, 0xc7,0x3f,0xc5,0xc5,0xc5,0x3d,0xc3,0xc3,0xc3,0x3e,0xc3,0xc3,0xc3,0x40,0xc2, 0xc2,0xc2,0x41,0xc0,0xc0,0xc0,0x40,0xb9,0xb9,0xb9,0x40,0xab,0xab,0xab,0x39, 0x9a,0x9a,0x9a,0x33,0x84,0x84,0x84,0x2e,0x7c,0x7c,0x7c,0x2e,0x78,0x78,0x78, 0x2f,0x96,0x96,0x96,0xb1,0xff,0xff,0xff,0xff,0x5d,0x5d,0x5d,0xa7,0x82,0x00, 0x00,0x00,0x31,0x03,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x09,0x00,0x00,0x00, 0x01,0x8f,0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x6e,0x00,0x00,0x00, 0x0c,0x7b,0x9e,0xe3,0xde,0x39,0x7c,0xee,0xff,0x3d,0x7f,0xf5,0xff,0x38,0x7e, 0xf4,0xff,0x38,0x80,0xf2,0xff,0x38,0x7b,0xf8,0xff,0x38,0x7c,0xff,0xff,0x37, 0x7c,0xfc,0xff,0x37,0x7c,0xfe,0xff,0x37,0x7d,0xfd,0xff,0x36,0x7b,0xff,0xff, 0x37,0x7c,0xff,0xff,0x35,0x7d,0xff,0xff,0x2e,0x6f,0xfe,0xff,0x40,0x58,0xd0, 0xff,0x4b,0x52,0xb0,0xff,0x4b,0x51,0xb0,0xff,0x4c,0x50,0xaf,0xff,0x4b,0x4f, 0xab,0xff,0x4b,0x4f,0xaa,0xff,0x4b,0x50,0xab,0xff,0x4a,0x4d,0xa8,0xff,0x42, 0x4a,0xa7,0xff,0x3b,0x47,0xa6,0xff,0x39,0x45,0xa2,0xff,0x3c,0x42,0x9b,0xff, 0x3b,0x43,0x9b,0xff,0x35,0x49,0x9e,0xff,0x91,0x31,0x56,0xff,0xd8,0x1b,0x0e, 0xff,0xca,0x1e,0x17,0xff,0xca,0x21,0x19,0xff,0xca,0x22,0x18,0xff,0xca,0x22, 0x17,0xff,0xcb,0x23,0x18,0xff,0xcc,0x24,0x17,0xff,0xcd,0x25,0x18,0xff,0xce, 0x26,0x18,0xff,0xcd,0x27,0x18,0xff,0xca,0x29,0x18,0xff,0xcd,0x2a,0x1c,0xff, 0xcc,0x2d,0x1c,0xff,0xcd,0x35,0x21,0xff,0xb8,0x0a,0x12,0xff,0xb4,0x03,0x16, 0xff,0xae,0x00,0x17,0xff,0xaa,0x00,0x16,0xff,0x9a,0x00,0x0c,0xff,0x5c,0x26, 0x08,0xf2,0x5a,0x5e,0x28,0xff,0x59,0x73,0x43,0xff,0x58,0x7f,0x4a,0xff,0x57, 0x85,0x53,0xff,0x57,0x8c,0x5b,0xff,0x59,0x91,0x61,0xff,0x5b,0x94,0x65,0xff, 0x59,0x94,0x68,0xff,0x58,0x95,0x6b,0xff,0x56,0x95,0x6a,0xff,0x4f,0x90,0x66, 0xff,0x4c,0x8b,0x64,0xff,0x48,0x8c,0x63,0xff,0x45,0x88,0x5f,0xff,0x4a,0x6f, 0x58,0xff,0xd2,0xd2,0xd2,0xff,0x96,0xa5,0x9c,0xff,0x58,0x86,0x6a,0xff,0x62, 0x95,0x76,0xff,0x62,0x96,0x76,0xff,0x5f,0x94,0x74,0xff,0x64,0x98,0x79,0xff, 0x6a,0x9d,0x7e,0xff,0x69,0x9c,0x7e,0xff,0x6f,0xa1,0x83,0xff,0x71,0xa4,0x85, 0xff,0x69,0x9c,0x7f,0xff,0x69,0x9d,0x7f,0xff,0x6a,0x9f,0x81,0xff,0x63,0x99, 0x7a,0xff,0x64,0x9a,0x7b,0xff,0x67,0x9c,0x7d,0xff,0x66,0x96,0x78,0xff,0x6b, 0x9a,0x7d,0xff,0x6e,0x9d,0x80,0xff,0x72,0x97,0x7d,0xff,0x71,0x97,0x7c,0xff, 0x6f,0x95,0x7a,0xff,0xa8,0xb6,0xa4,0xa5,0xa2,0xb0,0x9e,0xa4,0x9d,0xac,0x9a, 0xa4,0xca,0xca,0xca,0x41,0xc9,0xc9,0xc9,0x42,0xc8,0xc8,0xc8,0x42,0xc8,0xc8, 0xc8,0x43,0xc7,0xc7,0xc7,0x44,0xc2,0xc2,0xc2,0x43,0xb7,0xb7,0xb7,0x3e,0xa7, 0xa7,0xa7,0x37,0x95,0x95,0x95,0x32,0x85,0x85,0x85,0x2e,0x7c,0x7c,0x7c,0x2d, 0x77,0x77,0x77,0x42,0xd1,0xd1,0xd1,0xf5,0xd2,0xd2,0xd2,0xfe,0x38,0x38,0x38, 0x59,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x19,0x00,0x00, 0x00,0x07,0x90,0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x55,0x00,0x00, 0x00,0x0c,0x79,0x9d,0xdf,0xdf,0x3c,0x7d,0xed,0xff,0x3d,0x80,0xf4,0xff,0x39, 0x7e,0xf4,0xff,0x3a,0x7f,0xf3,0xff,0x37,0x7d,0xf6,0xff,0x38,0x7d,0xfc,0xff, 0x37,0x7c,0xfc,0xff,0x38,0x7d,0xfe,0xff,0x38,0x7d,0xff,0xff,0x37,0x7e,0xff, 0xff,0x38,0x7e,0xff,0xff,0x37,0x7f,0xff,0xff,0x2e,0x6e,0xfe,0xff,0x42,0x58, 0xcf,0xff,0x4d,0x52,0xb3,0xff,0x4a,0x51,0xb3,0xff,0x4b,0x50,0xaf,0xff,0x4b, 0x4f,0xac,0xff,0x4b,0x4e,0xaa,0xff,0x4a,0x4e,0xa9,0xff,0x48,0x4c,0xa6,0xff, 0x42,0x4a,0xa7,0xff,0x3b,0x49,0xa8,0xff,0x3a,0x45,0x9f,0xff,0x3b,0x43,0x9a, 0xff,0x35,0x45,0x9d,0xff,0x65,0x3d,0x78,0xff,0xd0,0x1b,0x15,0xff,0xce,0x1b, 0x17,0xff,0xcb,0x20,0x1a,0xff,0xc9,0x22,0x18,0xff,0xc8,0x22,0x17,0xff,0xc9, 0x23,0x18,0xff,0xca,0x24,0x19,0xff,0xcc,0x25,0x19,0xff,0xcd,0x26,0x19,0xff, 0xce,0x26,0x1a,0xff,0xcd,0x27,0x1a,0xff,0xcc,0x29,0x1b,0xff,0xcb,0x29,0x1c, 0xff,0xcc,0x2b,0x1c,0xff,0xd1,0x35,0x24,0xff,0xb5,0x07,0x11,0xff,0xaf,0x00, 0x17,0xff,0xab,0x00,0x16,0xff,0xa9,0x00,0x14,0xff,0x9e,0x00,0x11,0xff,0x57, 0x1c,0x06,0xff,0x4f,0x45,0x12,0xff,0x53,0x66,0x33,0xff,0x57,0x72,0x42,0xff, 0x51,0x7c,0x48,0xff,0x4e,0x81,0x50,0xff,0x4d,0x86,0x56,0xff,0x4f,0x88,0x59, 0xff,0x4f,0x8a,0x5d,0xff,0x50,0x8d,0x61,0xff,0x4d,0x8c,0x61,0xff,0x4a,0x8a, 0x61,0xff,0x48,0x89,0x5f,0xff,0x44,0x87,0x5e,0xff,0x42,0x85,0x5c,0xff,0x3f, 0x7c,0x57,0xff,0x9b,0x9e,0x9c,0xff,0xe5,0xe6,0xe5,0xff,0x5a,0x82,0x69,0xff, 0x56,0x89,0x69,0xff,0x56,0x8a,0x69,0xff,0x51,0x86,0x67,0xff,0x55,0x8a,0x6b, 0xff,0x5a,0x8f,0x70,0xff,0x5a,0x8f,0x6f,0xff,0x61,0x95,0x76,0xff,0x64,0x98, 0x79,0xff,0x61,0x94,0x78,0xff,0x63,0x96,0x7a,0xff,0x63,0x97,0x7a,0xff,0x5e, 0x91,0x73,0xff,0x5f,0x92,0x74,0xff,0x61,0x94,0x76,0xff,0x65,0x90,0x75,0xff, 0x67,0x92,0x78,0xff,0x6a,0x94,0x7a,0xff,0x82,0x6f,0x92,0x79,0xff,0x17,0x6e, 0x91,0x77,0xff,0x99,0xa8,0x96,0xb1,0x95,0xa4,0x92,0xb1,0x92,0xa2,0x8f,0xb1, 0xce,0xce,0xce,0x45,0xcc,0xcc,0xcc,0x45,0xcc,0xcc,0xcc,0x46,0xcb,0xcb,0xcb, 0x46,0xc9,0xc9,0xc9,0x46,0xc0,0xc0,0xc0,0x42,0xb4,0xb4,0xb4,0x3c,0xa2,0xa2, 0xa2,0x35,0x92,0x92,0x92,0x30,0x85,0x85,0x85,0x2e,0x7f,0x7f,0x7f,0x2e,0x98, 0x98,0x98,0x92,0xff,0xff,0xff,0xff,0x9b,0x9b,0x9b,0xda,0x00,0x00,0x00,0x2b, 0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x14,0x00,0x00,0x00, 0x05,0x90,0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x08,0x00,0x00,0x00, 0x0c,0x75,0x9a,0xe3,0xdf,0x3c,0x7e,0xf2,0xff,0x3d,0x81,0xf6,0xff,0x39,0x7f, 0xf5,0xff,0x38,0x7e,0xf3,0xff,0x37,0x7e,0xf6,0xff,0x37,0x7d,0xfa,0xff,0x82, 0x38,0x7d,0xfd,0xff,0x33,0x38,0x7c,0xff,0xff,0x3a,0x7d,0xff,0xff,0x3a,0x7e, 0xff,0xff,0x39,0x7f,0xff,0xff,0x2e,0x6e,0xfd,0xff,0x41,0x58,0xce,0xff,0x4d, 0x51,0xb4,0xff,0x4c,0x50,0xb4,0xff,0x4d,0x50,0xae,0xff,0x4d,0x4e,0xab,0xff, 0x4c,0x4f,0xab,0xff,0x4a,0x4d,0xa9,0xff,0x47,0x4c,0xa6,0xff,0x3f,0x4a,0xa5, 0xff,0x39,0x48,0xa5,0xff,0x38,0x45,0x9b,0xff,0x3a,0x44,0x98,0xff,0x48,0x42, 0x89,0xff,0xbb,0x1e,0x2a,0xff,0xce,0x19,0x0d,0xff,0xc8,0x1c,0x18,0xff,0xc9, 0x1f,0x17,0xff,0xc8,0x22,0x17,0xff,0xc8,0x23,0x18,0xff,0xca,0x24,0x1a,0xff, 0xca,0x25,0x1a,0xff,0xcc,0x25,0x19,0xff,0xcd,0x25,0x19,0xff,0xce,0x26,0x1a, 0xff,0xcd,0x26,0x1a,0xff,0xcd,0x28,0x1b,0xff,0xcd,0x29,0x1b,0xff,0xcd,0x2a, 0x1a,0xff,0xd4,0x34,0x23,0xff,0xba,0x10,0x15,0xff,0xad,0x00,0x13,0xff,0xad, 0x00,0x15,0xff,0xac,0x00,0x18,0xff,0xa2,0x00,0x12,0xff,0x5d,0x10,0x0d,0xff, 0x3e,0x2c,0x06,0xff,0x4f,0x51,0x21,0xff,0x52,0x65,0x37,0xff,0x4e,0x70,0x3f, 0xff,0x4e,0x76,0x48,0xff,0x49,0x7c,0x4e,0xff,0x49,0x82,0x52,0xff,0x48,0x84, 0x55,0xff,0x48,0x86,0x58,0xff,0x48,0x87,0x5a,0xff,0x46,0x84,0x5c,0xff,0x82, 0x43,0x82,0x5a,0xff,0x11,0x42,0x81,0x59,0xff,0x3f,0x7e,0x56,0xff,0x53,0x71, 0x5f,0xff,0xef,0xef,0xef,0xff,0x98,0xa7,0x9e,0xff,0x51,0x7e,0x62,0xff,0x55, 0x8a,0x68,0xff,0x51,0x86,0x67,0xff,0x53,0x88,0x69,0xff,0x56,0x8c,0x6d,0xff, 0x56,0x8c,0x6c,0xff,0x5e,0x93,0x74,0xff,0x63,0x97,0x79,0xff,0x65,0x97,0x7b, 0xff,0x67,0x99,0x7d,0xff,0x66,0x99,0x7c,0xff,0x61,0x93,0x75,0xff,0x82,0x62, 0x94,0x76,0xff,0x03,0x64,0x8f,0x75,0xff,0x67,0x91,0x78,0xff,0x69,0x93,0x79, 0xff,0x82,0x6e,0x91,0x77,0xff,0x17,0x6c,0x8f,0x76,0xff,0x98,0xa7,0x95,0xb2, 0x95,0xa4,0x92,0xb1,0x93,0xa3,0x90,0xb1,0xcf,0xcf,0xcf,0x48,0xce,0xce,0xce, 0x49,0xcd,0xcd,0xcd,0x4a,0xcc,0xcc,0xcc,0x49,0xc5,0xc5,0xc5,0x46,0xbc,0xbc, 0xbc,0x40,0xac,0xac,0xac,0x38,0x9a,0x9a,0x9a,0x32,0x8c,0x8c,0x8c,0x2e,0x88, 0x88,0x88,0x2e,0x81,0x81,0x81,0x33,0xd2,0xd2,0xd2,0xe8,0xe9,0xe9,0xe9,0xff, 0x69,0x69,0x69,0x66,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x36,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x03,0x90,0x00,0x00,0x00,0x00,0x85, 0xff,0xff,0xff,0x00,0x13,0x00,0x00,0x00,0x0c,0x72,0x9a,0xe1,0xe2,0x3b,0x7f, 0xf2,0xff,0x40,0x81,0xf6,0xff,0x3b,0x80,0xf6,0xff,0x36,0x7f,0xf4,0xff,0x37, 0x7f,0xf8,0xff,0x37,0x7e,0xf9,0xff,0x37,0x7d,0xfc,0xff,0x39,0x7e,0xfe,0xff, 0x37,0x7c,0xff,0xff,0x39,0x7e,0xff,0xff,0x3c,0x82,0xff,0xff,0x39,0x82,0xff, 0xff,0x32,0x6e,0xfc,0xff,0x41,0x5a,0xcd,0xff,0x4f,0x51,0xb3,0xff,0x4d,0x52, 0xb1,0xff,0x4f,0x52,0xaf,0xff,0x82,0x4f,0x4f,0xab,0xff,0x0d,0x4d,0x4f,0xa9, 0xff,0x49,0x4d,0xa6,0xff,0x3f,0x4a,0xa2,0xff,0x39,0x48,0xa2,0xff,0x37,0x44, 0x9c,0xff,0x37,0x48,0x93,0xff,0x93,0x25,0x4a,0xff,0xd4,0x13,0x08,0xff,0xc8, 0x1b,0x19,0xff,0xc7,0x1b,0x18,0xff,0xc8,0x1e,0x17,0xff,0xc8,0x22,0x17,0xff, 0xc9,0x23,0x18,0xff,0x82,0xcb,0x23,0x18,0xff,0x1a,0xcb,0x24,0x17,0xff,0xcc, 0x24,0x18,0xff,0xcc,0x25,0x18,0xff,0xcc,0x25,0x19,0xff,0xcb,0x27,0x19,0xff, 0xcb,0x29,0x1b,0xff,0xce,0x29,0x1c,0xff,0xd4,0x33,0x22,0xff,0xc2,0x1d,0x1f, 0xff,0xad,0x00,0x13,0xff,0xac,0x00,0x15,0xff,0xa9,0x00,0x16,0xff,0xa7,0x00, 0x11,0xff,0x6d,0x0e,0x13,0xff,0x36,0x1c,0x05,0xff,0x44,0x3c,0x0d,0xff,0x4b, 0x55,0x27,0xff,0x4f,0x64,0x37,0xff,0x4d,0x6f,0x43,0xff,0x4a,0x73,0x47,0xff, 0x47,0x7a,0x4c,0xff,0x42,0x7e,0x50,0xff,0x44,0x80,0x54,0xff,0x45,0x82,0x59, 0xff,0x45,0x82,0x58,0xff,0x42,0x80,0x55,0xff,0x82,0x40,0x7f,0x57,0xff,0x15, 0x3c,0x7a,0x53,0xff,0x3c,0x74,0x52,0xff,0xb1,0xb2,0xb1,0xff,0xe6,0xe7,0xe7, 0xff,0x63,0x85,0x6f,0xff,0x54,0x86,0x67,0xff,0x50,0x85,0x66,0xff,0x51,0x87, 0x68,0xff,0x54,0x8b,0x6b,0xff,0x52,0x89,0x69,0xff,0x5a,0x90,0x70,0xff,0x63, 0x97,0x78,0xff,0x64,0x97,0x7b,0xff,0x68,0x99,0x7e,0xff,0x68,0x9a,0x7f,0xff, 0x63,0x94,0x77,0xff,0x64,0x95,0x78,0xff,0x65,0x96,0x79,0xff,0x66,0x90,0x76, 0xff,0x67,0x91,0x77,0xff,0x68,0x92,0x78,0xff,0x82,0x6c,0x8f,0x76,0xff,0x17, 0x6c,0x8e,0x75,0xff,0x97,0xa7,0x95,0xb3,0x96,0xa5,0x93,0xb3,0x95,0xa4,0x92, 0xb3,0xd1,0xd1,0xd1,0x4b,0xd0,0xd0,0xd0,0x4c,0xce,0xce,0xce,0x4b,0xca,0xca, 0xca,0x47,0xc1,0xc1,0xc1,0x42,0xb3,0xb3,0xb3,0x3b,0xa3,0xa3,0xa3,0x34,0x96, 0x96,0x96,0x2f,0x8c,0x8c,0x8c,0x2e,0x87,0x87,0x87,0x2f,0xa4,0xa4,0xa4,0x97, 0xf2,0xf2,0xf2,0xff,0xa0,0xa0,0xa0,0xe5,0x00,0x00,0x00,0x23,0x00,0x00,0x00, 0x37,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x02,0x90,0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x25,0x00,0x00, 0x00,0x0c,0x70,0x97,0xdf,0xe2,0x40,0x7e,0xef,0xff,0x3d,0x82,0xf1,0xff,0x3e, 0x82,0xf5,0xff,0x3b,0x80,0xf6,0xff,0x3a,0x80,0xf6,0xff,0x39,0x7f,0xf9,0xff, 0x3a,0x7f,0xfc,0xff,0x3a,0x80,0xfe,0xff,0x3b,0x80,0xff,0xff,0x3a,0x7f,0xff, 0xff,0x3c,0x83,0xff,0xff,0x39,0x81,0xff,0xff,0x31,0x6e,0xfb,0xff,0x44,0x5a, 0xd1,0xff,0x52,0x54,0xb6,0xff,0x50,0x54,0xb4,0xff,0x4d,0x51,0xae,0xff,0x4d, 0x52,0xac,0xff,0x4e,0x51,0xac,0xff,0x50,0x4f,0xa9,0xff,0x49,0x4d,0xa7,0xff, 0x41,0x4a,0xa3,0xff,0x39,0x47,0xa2,0xff,0x35,0x48,0x9f,0xff,0x65,0x38,0x70, 0xff,0xcf,0x0c,0x14,0xff,0xc8,0x15,0x0e,0xff,0xc5,0x1b,0x18,0xff,0xc8,0x1d, 0x18,0xff,0xc9,0x20,0x18,0xff,0xc8,0x21,0x16,0xff,0xca,0x23,0x18,0xff,0xcb, 0x23,0x17,0xff,0xcb,0x23,0x18,0xff,0xcc,0x24,0x17,0xff,0x83,0xcc,0x25,0x18, 0xff,0x27,0xce,0x27,0x1a,0xff,0xcd,0x27,0x1a,0xff,0xce,0x28,0x1b,0xff,0xd0, 0x32,0x1d,0xff,0xc8,0x26,0x1f,0xff,0xad,0x00,0x14,0xff,0xab,0x00,0x17,0xff, 0xa9,0x00,0x16,0xff,0xaa,0x00,0x11,0xff,0x80,0x0b,0x12,0xff,0x39,0x1a,0x0f, 0xff,0x3a,0x25,0x05,0xff,0x41,0x48,0x16,0xff,0x47,0x58,0x2a,0xff,0x48,0x64, 0x37,0xff,0x48,0x6d,0x41,0xff,0x47,0x73,0x47,0xff,0x44,0x77,0x4b,0xff,0x44, 0x7b,0x50,0xff,0x44,0x7e,0x54,0xff,0x44,0x7e,0x55,0xff,0x40,0x7c,0x52,0xff, 0x3f,0x7d,0x54,0xff,0x3e,0x7c,0x54,0xff,0x3b,0x79,0x51,0xff,0x3b,0x76,0x4e, 0xff,0x4f,0x6d,0x5a,0xff,0xe0,0xe0,0xe0,0xff,0xc9,0xcf,0xcb,0xff,0x4a,0x74, 0x59,0xff,0x45,0x79,0x5b,0xff,0x46,0x7c,0x5d,0xff,0x48,0x7f,0x5f,0xff,0x47, 0x7f,0x60,0xff,0x4f,0x86,0x67,0xff,0x57,0x8d,0x6f,0xff,0x5a,0x8d,0x6f,0xff, 0x60,0x91,0x75,0xff,0x64,0x94,0x78,0xff,0x82,0x64,0x91,0x76,0xff,0x04,0x65, 0x92,0x77,0xff,0x6a,0x8f,0x76,0xff,0x69,0x8f,0x76,0xff,0x6a,0x90,0x76,0xff, 0x82,0x70,0x90,0x78,0xff,0x16,0x6f,0x8f,0x78,0xff,0x9b,0xa8,0x98,0xb1,0x9a, 0xa7,0x97,0xb1,0x99,0xa6,0x96,0xb1,0xd1,0xd1,0xd1,0x4e,0xd0,0xd0,0xd0,0x4b, 0xcc,0xcc,0xcc,0x49,0xc4,0xc4,0xc4,0x43,0xb9,0xb9,0xb9,0x3c,0xaa,0xaa,0xaa, 0x36,0x9b,0x9b,0x9b,0x31,0x94,0x94,0x94,0x2f,0x8d,0x8d,0x8d,0x2d,0x90,0x90, 0x90,0x43,0xf4,0xf4,0xf4,0xfb,0xcc,0xcc,0xcc,0xfd,0x55,0x55,0x55,0x4b,0x00, 0x00,0x00,0x2d,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x15, 0x00,0x00,0x00,0x05,0x91,0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x26, 0x00,0x00,0x00,0x0c,0x6d,0x92,0xde,0xe5,0x3e,0x81,0xf2,0xff,0x3d,0x83,0xf1, 0xff,0x3f,0x82,0xf8,0xff,0x3e,0x81,0xfa,0xff,0x3b,0x7f,0xf6,0xff,0x3b,0x7f, 0xf7,0xff,0x3c,0x7f,0xfb,0xff,0x3e,0x7f,0xfe,0xff,0x40,0x80,0xfd,0xff,0x3b, 0x7f,0xfe,0xff,0x3b,0x81,0xff,0xff,0x3a,0x84,0xff,0xff,0x30,0x6f,0xfe,0xff, 0x44,0x5a,0xd3,0xff,0x51,0x56,0xbb,0xff,0x53,0x56,0xb7,0xff,0x50,0x53,0xae, 0xff,0x4c,0x52,0xac,0xff,0x4e,0x51,0xac,0xff,0x51,0x51,0xa8,0xff,0x4d,0x4d, 0xa6,0xff,0x40,0x4a,0xa7,0xff,0x37,0x4a,0xa1,0xff,0x40,0x45,0x8d,0xff,0xb5, 0x10,0x23,0xff,0xcc,0x0b,0x0f,0xff,0xc9,0x12,0x19,0xff,0xc5,0x1b,0x15,0xff, 0xc8,0x1e,0x16,0xff,0xc9,0x20,0x18,0xff,0xc8,0x22,0x17,0xff,0xca,0x23,0x18, 0xff,0xcb,0x23,0x19,0xff,0xca,0x23,0x18,0xff,0xcb,0x24,0x17,0xff,0xcb,0x25, 0x18,0xff,0x82,0xcc,0x25,0x19,0xff,0x2d,0xcd,0x26,0x1a,0xff,0xcd,0x25,0x19, 0xff,0xcb,0x27,0x1b,0xff,0xcf,0x2d,0x1c,0xff,0xc9,0x25,0x1f,0xff,0xae,0x00, 0x13,0xff,0xab,0x00,0x16,0xff,0xa8,0x00,0x14,0xff,0xab,0x00,0x12,0xff,0x8f, 0x04,0x12,0xff,0x51,0x1e,0x18,0xff,0x33,0x1c,0x06,0xff,0x3a,0x34,0x0c,0xff, 0x42,0x4d,0x20,0xff,0x44,0x59,0x2e,0xff,0x48,0x67,0x3c,0xff,0x47,0x6e,0x44, 0xff,0x46,0x74,0x4a,0xff,0x44,0x78,0x4d,0xff,0x43,0x7a,0x4f,0xff,0x43,0x7c, 0x53,0xff,0x41,0x7b,0x54,0xff,0x3f,0x7a,0x53,0xff,0x3e,0x7a,0x54,0xff,0x3d, 0x79,0x52,0xff,0x3b,0x75,0x4f,0xff,0x38,0x72,0x4c,0xff,0x7b,0x86,0x7f,0xff, 0xf9,0xf9,0xf9,0xff,0x93,0xa5,0x98,0xff,0x47,0x73,0x58,0xff,0x46,0x7c,0x5d, 0xff,0x48,0x7f,0x5f,0xff,0x48,0x80,0x61,0xff,0x4c,0x84,0x65,0xff,0x52,0x89, 0x6a,0xff,0x54,0x89,0x6a,0xff,0x5a,0x8d,0x70,0xff,0x61,0x92,0x75,0xff,0x63, 0x90,0x75,0xff,0x65,0x91,0x77,0xff,0x67,0x93,0x79,0xff,0x6a,0x90,0x77,0xff, 0x6b,0x90,0x77,0xff,0x6b,0x91,0x78,0xff,0x83,0x70,0x90,0x79,0xff,0x15,0x9c, 0xa9,0x99,0xb1,0x9b,0xa8,0x98,0xb1,0x9a,0xa6,0x96,0xb1,0xcf,0xcf,0xcf,0x4d, 0xca,0xca,0xca,0x48,0xc4,0xc4,0xc4,0x43,0xbb,0xbb,0xbb,0x3c,0xad,0xad,0xad, 0x37,0xa0,0xa0,0xa0,0x31,0x96,0x96,0x96,0x2f,0x93,0x93,0x93,0x2e,0x8f,0x8f, 0x8f,0x33,0xd7,0xd7,0xd7,0xdb,0xec,0xec,0xec,0xff,0x81,0x81,0x81,0x9d,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x22, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x02,0x91,0x00,0x00,0x00,0x00,0x85,0xff, 0xff,0xff,0x00,0x22,0x00,0x00,0x00,0x0c,0x67,0x8c,0xde,0xeb,0x3b,0x82,0xf3, 0xff,0x3e,0x81,0xf2,0xff,0x3f,0x83,0xf4,0xff,0x3e,0x83,0xf6,0xff,0x3c,0x7f, 0xf6,0xff,0x3c,0x7f,0xf5,0xff,0x3d,0x80,0xf9,0xff,0x3f,0x81,0xfe,0xff,0x3f, 0x82,0xfc,0xff,0x3c,0x81,0xfd,0xff,0x3c,0x81,0xff,0xff,0x3d,0x83,0xff,0xff, 0x30,0x72,0xfb,0xff,0x43,0x5c,0xd2,0xff,0x4f,0x58,0xb9,0xff,0x54,0x58,0xba, 0xff,0x55,0x56,0xb3,0xff,0x50,0x53,0xac,0xff,0x4e,0x52,0xac,0xff,0x4f,0x51, 0xa6,0xff,0x4a,0x4f,0xa6,0xff,0x40,0x4b,0xab,0xff,0x31,0x4f,0xa3,0xff,0x8a, 0x1f,0x4c,0xff,0xcd,0x00,0x05,0xff,0xc5,0x10,0x13,0xff,0xc6,0x16,0x1c,0xff, 0xc6,0x1c,0x16,0xff,0xc9,0x1e,0x15,0xff,0xc8,0x20,0x16,0xff,0xc7,0x22,0x17, 0xff,0xc8,0x23,0x18,0xff,0x82,0xc9,0x23,0x18,0xff,0x82,0xc9,0x24,0x19,0xff, 0x01,0xc8,0x23,0x18,0xff,0x82,0xca,0x25,0x1a,0xff,0x44,0xcc,0x26,0x1b,0xff, 0xcb,0x28,0x1b,0xff,0xce,0x2a,0x1c,0xff,0xcf,0x2a,0x25,0xff,0xad,0x01,0x12, 0xff,0xa9,0x00,0x13,0xff,0xa8,0x00,0x14,0xff,0xaa,0x00,0x14,0xff,0x9e,0x00, 0x12,0xff,0x6b,0x18,0x14,0xff,0x51,0x2c,0x18,0xff,0x3d,0x22,0x05,0xff,0x37, 0x3e,0x13,0xff,0x41,0x53,0x27,0xff,0x46,0x60,0x36,0xff,0x48,0x6b,0x42,0xff, 0x47,0x71,0x48,0xff,0x46,0x75,0x4c,0xff,0x49,0x7a,0x50,0xff,0x45,0x79,0x51, 0xff,0x42,0x7a,0x52,0xff,0x42,0x79,0x53,0xff,0x40,0x79,0x53,0xff,0x3e,0x78, 0x50,0xff,0x3d,0x75,0x4f,0xff,0x3c,0x71,0x4d,0xff,0x39,0x64,0x48,0xff,0x9d, 0xa1,0x9e,0xff,0xf7,0xf7,0xf7,0xff,0x82,0x99,0x8a,0xff,0x47,0x77,0x5a,0xff, 0x4a,0x81,0x61,0xff,0x48,0x81,0x61,0xff,0x49,0x82,0x62,0xff,0x4c,0x85,0x65, 0xff,0x4d,0x84,0x64,0xff,0x53,0x88,0x69,0xff,0x59,0x8d,0x6f,0xff,0x5d,0x8b, 0x6f,0xff,0x61,0x8f,0x74,0xff,0x63,0x90,0x76,0xff,0x6a,0x8f,0x76,0xff,0x6b, 0x90,0x77,0xff,0x6b,0x90,0x78,0xff,0x70,0x90,0x78,0xff,0x70,0x90,0x79,0xff, 0x70,0x90,0x78,0xff,0x9b,0xa8,0x98,0xb1,0x98,0xa5,0x95,0xb0,0x95,0xa3,0x92, 0xaf,0xc8,0xc8,0xc8,0x46,0xc0,0xc0,0xc0,0x41,0xb6,0xb6,0xb6,0x3a,0xac,0xac, 0xac,0x35,0xa2,0xa2,0xa2,0x30,0x9a,0x9a,0x9a,0x2f,0x97,0x97,0x97,0x2e,0x93, 0x93,0x93,0x32,0xc6,0xc6,0xc6,0xc3,0xf5,0xf5,0xf5,0xff,0x9e,0x9e,0x9e,0xeb, 0x8e,0x8e,0x8e,0x79,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x39,0x00,0x00,0x00, 0x2e,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x91,0x00, 0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x27,0x00,0x00,0x00,0x0c,0x77,0x9d, 0xdd,0xe5,0x43,0x82,0xf5,0xff,0x40,0x84,0xf6,0xff,0x3b,0x85,0xf7,0xff,0x3d, 0x82,0xf8,0xff,0x3f,0x81,0xf9,0xff,0x3c,0x80,0xf7,0xff,0x39,0x82,0xf7,0xff, 0x39,0x82,0xfa,0xff,0x3c,0x83,0xfd,0xff,0x3b,0x82,0xfd,0xff,0x41,0x83,0xff, 0xff,0x40,0x83,0xff,0xff,0x30,0x73,0xff,0xff,0x41,0x60,0xd3,0xff,0x52,0x5b, 0xbb,0xff,0x52,0x5b,0xb6,0xff,0x54,0x5a,0xb6,0xff,0x54,0x57,0xb3,0xff,0x52, 0x55,0xaf,0xff,0x52,0x50,0xac,0xff,0x4b,0x4e,0xaa,0xff,0x36,0x51,0xaf,0xff, 0x61,0x33,0x79,0xff,0xc4,0x00,0x0d,0xff,0xc4,0x04,0x10,0xff,0xc5,0x12,0x17, 0xff,0xc5,0x19,0x18,0xff,0xc6,0x1b,0x17,0xff,0xc8,0x1d,0x17,0xff,0xc8,0x1e, 0x17,0xff,0xca,0x21,0x19,0xff,0xcb,0x23,0x19,0xff,0xcb,0x23,0x18,0xff,0xcb, 0x24,0x19,0xff,0xca,0x24,0x19,0xff,0xc8,0x22,0x18,0xff,0xca,0x25,0x1a,0xff, 0x82,0xcb,0x25,0x1a,0xff,0x2c,0xcc,0x25,0x19,0xff,0xcb,0x26,0x1a,0xff,0xcb, 0x29,0x1b,0xff,0xcf,0x2c,0x21,0xff,0xb3,0x04,0x11,0xff,0xab,0x00,0x14,0xff, 0xac,0x00,0x16,0xff,0xac,0x00,0x19,0xff,0xa7,0x00,0x15,0xff,0x7d,0x10,0x0f, 0xff,0x62,0x31,0x1b,0xff,0x65,0x2e,0x17,0xfd,0x3a,0x28,0x07,0xfd,0x32,0x44, 0x1a,0xff,0x42,0x5e,0x34,0xff,0x4c,0x6e,0x46,0xff,0x4a,0x73,0x49,0xff,0x47, 0x76,0x4d,0xff,0x48,0x78,0x4e,0xff,0x46,0x79,0x51,0xff,0x44,0x7a,0x51,0xff, 0x43,0x79,0x51,0xff,0x42,0x77,0x53,0xff,0x40,0x77,0x51,0xff,0x3f,0x75,0x4f, 0xff,0x3e,0x73,0x4e,0xff,0x3c,0x6e,0x4b,0xff,0x3b,0x64,0x48,0xff,0xb2,0xb2, 0xb2,0xff,0xf4,0xf4,0xf4,0xff,0x78,0x93,0x7f,0xff,0x49,0x79,0x5b,0xff,0x44, 0x7a,0x5a,0xff,0x46,0x7c,0x5b,0xff,0x46,0x7d,0x5c,0xff,0x48,0x7b,0x5c,0xff, 0x4c,0x7e,0x60,0xff,0x51,0x82,0x64,0xff,0x56,0x82,0x67,0xff,0x5b,0x86,0x6b, 0xff,0x5f,0x89,0x6f,0xff,0x66,0x89,0x70,0xff,0x68,0x8a,0x72,0xff,0x69,0x8b, 0x73,0xff,0x82,0x70,0x8e,0x76,0xff,0x15,0x70,0x8d,0x76,0xff,0xa2,0xab,0x9f, 0x98,0x9e,0xa8,0x9b,0x97,0x9a,0xa4,0x97,0x94,0xb9,0xb9,0xb9,0x3c,0xad,0xad, 0xad,0x38,0xa6,0xa6,0xa6,0x33,0x9f,0x9f,0x9f,0x30,0x9b,0x9b,0x9b,0x2f,0x99, 0x99,0x99,0x2e,0x96,0x96,0x96,0x31,0xbc,0xbc,0xbc,0xb2,0xf3,0xf3,0xf3,0xff, 0xae,0xae,0xae,0xff,0xa7,0xa7,0xa7,0xfd,0xd1,0xd1,0xd1,0xfb,0x5b,0x5b,0x5b, 0x5e,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x02,0x92,0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x24,0x00,0x00, 0x00,0x0b,0x59,0x62,0x6b,0x3d,0x41,0x57,0x88,0xa2,0x50,0x75,0xc6,0xdf,0x46, 0x85,0xef,0xff,0x3e,0x84,0xf7,0xff,0x3f,0x82,0xfb,0xff,0x3c,0x81,0xf4,0xff, 0x3a,0x82,0xf8,0xff,0x3b,0x83,0xf8,0xff,0x3a,0x82,0xfa,0xff,0x3a,0x83,0xfc, 0xff,0x3f,0x83,0xff,0xff,0x42,0x83,0xff,0xff,0x34,0x75,0xff,0xff,0x43,0x62, 0xd5,0xff,0x53,0x5f,0xc1,0xff,0x4f,0x5d,0xbb,0xff,0x53,0x5b,0xbb,0xff,0x54, 0x5a,0xb9,0xff,0x53,0x5a,0xb4,0xff,0x53,0x56,0xaf,0xff,0x47,0x56,0xb0,0xff, 0x48,0x49,0xa0,0xff,0xb1,0x08,0x27,0xff,0xc6,0x01,0x0c,0xff,0xc2,0x0e,0x14, 0xff,0xc3,0x14,0x18,0xff,0xc5,0x1a,0x19,0xff,0xc7,0x1e,0x19,0xff,0xc8,0x1f, 0x18,0xff,0xca,0x21,0x1b,0xff,0xca,0x22,0x19,0xff,0xcc,0x24,0x19,0xff,0xca, 0x22,0x17,0xff,0xcb,0x22,0x17,0xff,0x82,0xca,0x23,0x18,0xff,0x45,0xca,0x22, 0x17,0xff,0xcb,0x23,0x18,0xff,0xcd,0x25,0x18,0xff,0xca,0x25,0x18,0xff,0xca, 0x28,0x19,0xff,0xcb,0x28,0x1b,0xff,0xd0,0x2d,0x20,0xff,0xbb,0x0f,0x19,0xff, 0xaa,0x00,0x16,0xff,0xac,0x00,0x12,0xff,0xaf,0x00,0x16,0xff,0xac,0x00,0x13, 0xff,0x8e,0x0b,0x10,0xff,0x62,0x26,0x15,0xff,0x67,0x2f,0x18,0xfe,0x61,0x43, 0x36,0xdb,0x42,0x4b,0x31,0xf6,0x3a,0x56,0x30,0xff,0x4d,0x6d,0x45,0xff,0x49, 0x73,0x4a,0xff,0x46,0x76,0x4e,0xff,0x48,0x78,0x4d,0xff,0x45,0x7b,0x4f,0xff, 0x42,0x7a,0x50,0xff,0x42,0x78,0x4f,0xff,0x41,0x77,0x53,0xff,0x40,0x77,0x52, 0xff,0x3f,0x76,0x50,0xff,0x3c,0x73,0x4e,0xff,0x3d,0x6e,0x4b,0xff,0x3a,0x6a, 0x49,0xff,0x3b,0x5e,0x45,0xff,0x9c,0x9e,0x9d,0xff,0xfd,0xfd,0xfd,0xff,0x8d, 0x98,0x91,0xe2,0x41,0x6b,0x52,0xdd,0x46,0x7c,0x5b,0xff,0x45,0x7c,0x5b,0xff, 0x46,0x79,0x5a,0xff,0x48,0x7b,0x5c,0xff,0x4a,0x7d,0x5f,0xff,0x4e,0x7c,0x5f, 0xff,0x52,0x7f,0x63,0xff,0x55,0x81,0x66,0xff,0x5d,0x81,0x67,0xff,0x5e,0x82, 0x69,0xff,0x60,0x84,0x6b,0xff,0x68,0x87,0x6e,0xff,0x67,0x87,0x6e,0xff,0x66, 0x86,0x6d,0xff,0x97,0xa2,0x94,0x92,0x93,0x9e,0x91,0x91,0x90,0x9b,0x8d,0x8f, 0xa6,0xa6,0xa6,0x33,0x9e,0x9e,0x9e,0x31,0x9c,0x9c,0x9c,0x2f,0x9a,0x9a,0x9a, 0x2f,0x9a,0x9a,0x9a,0x2e,0x99,0x99,0x99,0x34,0xc3,0xc3,0xc3,0xcc,0xf3,0xf3, 0xf3,0xff,0xa3,0xa3,0xa3,0xff,0xdf,0xdf,0xdf,0xff,0x9f,0x9f,0x9f,0xff,0xad, 0xad,0xad,0xff,0xbf,0xbf,0xbf,0xee,0x90,0x90,0x90,0x8e,0x04,0x04,0x04,0x17, 0x1a,0x1a,0x1a,0x12,0x93,0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x55, 0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x3b,0x00,0x00,0x00, 0x55,0x1f,0x26,0x36,0x7c,0x42,0x5a,0x92,0xba,0x4b,0x74,0xcc,0xe6,0x46,0x83, 0xec,0xff,0x3e,0x83,0xf6,0xff,0x3c,0x83,0xf7,0xff,0x40,0x82,0xfa,0xff,0x3d, 0x81,0xf9,0xff,0x40,0x82,0xfd,0xff,0x41,0x84,0xfe,0xff,0x34,0x76,0xff,0xff, 0x44,0x65,0xd8,0xff,0x53,0x60,0xc3,0xff,0x4f,0x60,0xc1,0xff,0x51,0x5d,0xc1, 0xff,0x51,0x5e,0xc0,0xff,0x50,0x5e,0xbf,0xff,0x52,0x5c,0xbb,0xff,0x47,0x61, 0xc1,0xff,0x88,0x21,0x57,0xff,0xc7,0x00,0x01,0xff,0xc5,0x0a,0x14,0xff,0xc1, 0x13,0x18,0xff,0xc5,0x18,0x1a,0xff,0xc6,0x1c,0x19,0xff,0xc7,0x20,0x18,0xff, 0xc8,0x21,0x18,0xff,0xc8,0x21,0x19,0xff,0xca,0x23,0x19,0xff,0xcb,0x23,0x18, 0xff,0xca,0x22,0x17,0xff,0xc9,0x23,0x18,0xff,0xca,0x22,0x17,0xff,0xcb,0x23, 0x18,0xff,0xcc,0x23,0x18,0xff,0xca,0x23,0x17,0xff,0xcc,0x24,0x17,0xff,0xcc, 0x25,0x17,0xff,0xca,0x26,0x18,0xff,0xcb,0x26,0x1b,0xff,0xd1,0x2e,0x1c,0xff, 0xc2,0x15,0x1d,0xff,0xaa,0x00,0x12,0xff,0xaf,0x00,0x16,0xff,0xae,0x00,0x16, 0xff,0xad,0x00,0x16,0xff,0x9c,0x07,0x10,0xff,0x6e,0x1e,0x12,0xff,0x55,0x28, 0x10,0xff,0x52,0x32,0x2a,0xc6,0x2b,0x2b,0x27,0x88,0x43,0x51,0x35,0xe5,0x3e, 0x56,0x32,0xff,0x43,0x69,0x41,0xff,0x43,0x71,0x47,0xff,0x45,0x75,0x4d,0xff, 0x44,0x76,0x4f,0xff,0x43,0x78,0x4c,0xff,0x41,0x75,0x4c,0xff,0x40,0x74,0x50, 0xff,0x3e,0x74,0x4d,0xff,0x3d,0x72,0x4b,0xff,0x3c,0x70,0x4c,0xff,0x38,0x6a, 0x47,0xff,0x31,0x61,0x3f,0xff,0x2d,0x56,0x36,0xff,0x33,0x43,0x33,0xef,0x84, 0x85,0x84,0xf8,0xe6,0xe6,0xe6,0xff,0xcf,0xd1,0xd0,0xdf,0x58,0x7b,0x66,0xbf, 0x48,0x7d,0x5d,0xf8,0x45,0x79,0x5a,0xff,0x47,0x7b,0x5c,0xff,0x48,0x7b,0x5c, 0xff,0x49,0x79,0x5b,0xff,0x4b,0x7a,0x5d,0xff,0x4e,0x7c,0x60,0xff,0x55,0x7b, 0x60,0xff,0x56,0x7c,0x61,0xff,0x57,0x7c,0x62,0xff,0x82,0x5f,0x80,0x66,0xff, 0x16,0x5e,0x7f,0x65,0xff,0x8d,0x99,0x8a,0x8d,0x8b,0x96,0x87,0x8d,0x89,0x95, 0x86,0x8b,0x9e,0x9e,0x9e,0x30,0x9b,0x9b,0x9b,0x30,0x9c,0x9c,0x9c,0x30,0xa0, 0xa0,0xa0,0x32,0x9e,0x9e,0x9e,0x6e,0xca,0xca,0xca,0xe5,0xe0,0xe0,0xe0,0xff, 0x8b,0x8b,0x8b,0xee,0x61,0x61,0x61,0xfe,0x98,0x98,0x98,0xff,0xe7,0xe7,0xe7, 0xff,0xaa,0xaa,0xaa,0xff,0xac,0xac,0xac,0xff,0xad,0xad,0xad,0xf1,0x31,0x31, 0x31,0xc4,0x41,0x41,0x41,0xc4,0x2e,0x2e,0x2e,0x22,0x00,0x00,0x00,0x01,0x91, 0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x53,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x4a, 0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x61,0x21,0x2d,0x41,0x85,0x4a,0x5f,0x99, 0xc1,0x51,0x77,0xce,0xeb,0x49,0x83,0xec,0xff,0x3f,0x82,0xf9,0xff,0x3e,0x84, 0xff,0xff,0x41,0x85,0xff,0xff,0x32,0x7b,0xff,0xff,0x41,0x6b,0xdd,0xff,0x4f, 0x66,0xc9,0xff,0x4e,0x64,0xc4,0xff,0x51,0x62,0xc0,0xff,0x52,0x63,0xbb,0xff, 0x56,0x68,0xba,0xff,0x53,0x67,0xb5,0xf4,0x73,0x42,0x7d,0xf6,0xc3,0x00,0x09, 0xff,0xc6,0x09,0x15,0xff,0xc1,0x10,0x18,0xff,0xc3,0x17,0x18,0xff,0xc6,0x1b, 0x1b,0xff,0xc8,0x1e,0x1a,0xff,0xc9,0x21,0x19,0xff,0xc9,0x23,0x17,0xff,0xc9, 0x22,0x18,0xff,0xca,0x23,0x1a,0xff,0xca,0x23,0x19,0xff,0xcb,0x24,0x19,0xff, 0xc8,0x24,0x19,0xff,0xc8,0x22,0x17,0xff,0xcc,0x23,0x18,0xff,0xcc,0x24,0x18, 0xff,0xca,0x24,0x17,0xff,0xcb,0x24,0x17,0xff,0xcb,0x24,0x19,0xff,0xca,0x26, 0x1a,0xff,0xcc,0x26,0x1c,0xff,0xcd,0x2d,0x1c,0xff,0xc6,0x1d,0x1e,0xff,0xaf, 0x00,0x16,0xff,0xae,0x00,0x16,0xff,0xb1,0x00,0x1a,0xff,0xac,0x00,0x17,0xff, 0xa6,0x04,0x14,0xff,0x7c,0x18,0x12,0xff,0x4e,0x25,0x13,0xf8,0x09,0x04,0x02, 0x7a,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x62,0x2d,0x33,0x21,0xad,0x34,0x45, 0x29,0xee,0x33,0x55,0x33,0xff,0x39,0x61,0x3b,0xff,0x3b,0x69,0x3e,0xff,0x39, 0x6b,0x42,0xff,0x38,0x69,0x44,0xff,0x37,0x68,0x45,0xff,0x35,0x65,0x41,0xff, 0x31,0x5f,0x3c,0xff,0x2d,0x57,0x37,0xff,0x29,0x49,0x2c,0xff,0x21,0x36,0x20, 0xf0,0x18,0x20,0x11,0xbb,0x00,0x00,0x00,0x7f,0x09,0x09,0x09,0x7e,0x57,0x57, 0x57,0xe7,0xc2,0xc2,0xc2,0xff,0xf2,0xf2,0xf2,0xf7,0xa6,0xb5,0xac,0xaf,0x4f, 0x77,0x5c,0xc1,0x4a,0x77,0x59,0xff,0x4a,0x78,0x59,0xff,0x4c,0x75,0x59,0xff, 0x4c,0x75,0x5a,0xff,0x4e,0x76,0x5b,0xff,0x52,0x78,0x5d,0xff,0x82,0x53,0x78, 0x5d,0xff,0x01,0x65,0x83,0x69,0xfe,0x82,0x65,0x82,0x68,0xfe,0x01,0x96,0x9b, 0x96,0x4e,0x82,0x94,0x9a,0x94,0x4e,0x13,0x9f,0x9f,0x9f,0x31,0x9c,0x9c,0x9c, 0x33,0x9f,0x9f,0x9f,0x47,0xa1,0xa1,0xa1,0xac,0xe9,0xe9,0xe9,0xfe,0xcb,0xcb, 0xcb,0xff,0x80,0x80,0x80,0xb9,0x38,0x38,0x38,0x98,0x5e,0x5e,0x5e,0xfe,0x5d, 0x5d,0x5d,0xff,0x97,0x97,0x97,0xff,0xf2,0xf2,0xf2,0xff,0x8c,0x8c,0x8c,0xff, 0x26,0x26,0x26,0xff,0x38,0x38,0x38,0xff,0x4d,0x4d,0x4d,0xff,0x46,0x46,0x46, 0xc9,0x2d,0x2d,0x2d,0x24,0x00,0x00,0x00,0x03,0x90,0x00,0x00,0x00,0x00,0x85, 0xff,0xff,0xff,0x00,0x24,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x0f,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x3e,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x62, 0x2a,0x36,0x46,0x8c,0x52,0x65,0x95,0xc6,0x53,0x7b,0xd1,0xee,0x45,0x86,0xf1, 0xff,0x36,0x7b,0xf9,0xff,0x41,0x6c,0xd4,0xff,0x55,0x69,0xbe,0xff,0x5b,0x6b, 0xb3,0xf9,0x5c,0x66,0x99,0xe1,0x54,0x5b,0x80,0xc3,0x32,0x39,0x4a,0x9a,0x00, 0x00,0x00,0x73,0x8e,0x2c,0x31,0xc4,0xc8,0x18,0x15,0xff,0xc8,0x12,0x17,0xff, 0xc5,0x11,0x14,0xff,0xc7,0x16,0x19,0xff,0xc5,0x1d,0x1d,0xff,0xc6,0x1e,0x1b, 0xff,0xc8,0x20,0x18,0xff,0xc9,0x23,0x19,0xff,0xc8,0x23,0x19,0xff,0xc7,0x24, 0x19,0xff,0xc8,0x24,0x1b,0xff,0xc9,0x24,0x1a,0xff,0xc8,0x23,0x18,0xff,0x82, 0xc9,0x23,0x18,0xff,0x82,0xc9,0x24,0x19,0xff,0x2a,0xc9,0x25,0x19,0xff,0xca, 0x26,0x1a,0xff,0xcb,0x26,0x1a,0xff,0xca,0x26,0x1b,0xff,0xcc,0x29,0x1c,0xff, 0xc8,0x25,0x1f,0xff,0xb1,0x00,0x17,0xff,0xb0,0x00,0x16,0xff,0xae,0x00,0x17, 0xff,0xb1,0x00,0x19,0xff,0xad,0x00,0x16,0xff,0x86,0x16,0x12,0xff,0x26,0x14, 0x0b,0xa2,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x45,0x00, 0x00,0x00,0x4b,0x00,0x00,0x00,0x5b,0x1a,0x1f,0x12,0x98,0x1b,0x21,0x10,0xcb, 0x1d,0x26,0x18,0xe5,0x20,0x31,0x1e,0xf5,0x20,0x35,0x1f,0xfd,0x1e,0x34,0x1e, 0xfd,0x1a,0x2d,0x19,0xf5,0x17,0x22,0x14,0xe4,0x13,0x18,0x0c,0xcc,0x0a,0x0e, 0x05,0xa2,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x68,0x00, 0x00,0x00,0x5a,0x00,0x00,0x00,0x45,0x30,0x30,0x30,0x8f,0x71,0x71,0x71,0xf7, 0xd3,0xd3,0xd3,0xff,0xf5,0xf5,0xf5,0xf3,0xb6,0xc0,0xb9,0xc0,0x57,0x7c,0x63, 0xb9,0x4f,0x76,0x5b,0xed,0x4e,0x76,0x5b,0xff,0x4e,0x77,0x5b,0xff,0x82,0x52, 0x77,0x5c,0xff,0x01,0x51,0x77,0x5c,0xff,0x82,0x64,0x81,0x67,0xfe,0x19,0x64, 0x82,0x68,0xfe,0x96,0x9b,0x96,0x4f,0x95,0x9b,0x95,0x51,0x95,0x9a,0x95,0x52, 0xae,0xae,0xae,0x4e,0xf1,0xf1,0xf1,0xc8,0xf0,0xf0,0xf0,0xfb,0xd1,0xd1,0xd1, 0xff,0x8d,0x8d,0x8d,0xe9,0x6f,0x6f,0x6f,0x5b,0x00,0x00,0x00,0x18,0x01,0x01, 0x01,0x2c,0x1f,0x1f,0x1f,0x84,0x4e,0x4e,0x4e,0xf2,0x7c,0x7c,0x7c,0xff,0xb4, 0xb4,0xb4,0xff,0x8d,0x8d,0x8d,0xff,0x99,0x99,0x99,0xff,0x30,0x30,0x30,0xff, 0x3b,0x3b,0x3b,0xff,0x4b,0x4b,0x4b,0xff,0x43,0x43,0x43,0xce,0x28,0x28,0x28, 0x28,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x8e,0x00,0x00,0x00,0x00,0x85, 0xff,0xff,0xff,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x14,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x40, 0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x63,0x33,0x41,0x4b, 0x94,0x5e,0x6e,0x8c,0xc8,0x55,0x5f,0x76,0xc5,0x3d,0x43,0x4f,0x9e,0x0a,0x0a, 0x0d,0x77,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x62,0x00, 0x00,0x00,0x5c,0x0f,0x0a,0x09,0x61,0x76,0x61,0x52,0xa4,0x8d,0x4d,0x43,0xd2, 0xbc,0x45,0x3e,0xf4,0xc4,0x2b,0x24,0xff,0xc5,0x21,0x16,0xff,0xca,0x1f,0x19, 0xff,0xc6,0x21,0x1c,0xff,0xc9,0x25,0x1b,0xff,0xc7,0x23,0x1a,0xff,0xc8,0x23, 0x1b,0xff,0xc9,0x25,0x1b,0xff,0xc8,0x24,0x1b,0xff,0xc8,0x24,0x1a,0xff,0xc7, 0x24,0x19,0xff,0xc7,0x25,0x1c,0xff,0xc6,0x25,0x1a,0xff,0xc7,0x25,0x1a,0xff, 0xca,0x25,0x1d,0xff,0xcb,0x27,0x1e,0xff,0xcb,0x26,0x1d,0xff,0xca,0x25,0x1d, 0xff,0xca,0x27,0x1b,0xff,0xca,0x26,0x1d,0xff,0xb3,0x01,0x15,0xff,0xb2,0x00, 0x17,0xff,0xaf,0x00,0x14,0xff,0xb3,0x01,0x19,0xff,0xb6,0x06,0x18,0xff,0x66, 0x1b,0x18,0xd3,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x33, 0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x3a,0x00,0x00,0x00, 0x4b,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x68,0x00,0x00, 0x00,0x6d,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x6c,0x00, 0x00,0x00,0x68,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x4f, 0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x2f,0x00,0x00,0x00, 0x24,0x23,0x23,0x23,0x35,0x3f,0x3f,0x3f,0xaa,0x76,0x76,0x76,0xf3,0xb1,0xb1, 0xb1,0xff,0xe3,0xe3,0xe3,0xf9,0xeb,0xec,0xeb,0xdf,0xcd,0xd4,0xcf,0xca,0x9b, 0xad,0xa1,0xc8,0x7b,0x94,0x82,0xd4,0x6a,0x88,0x72,0xe5,0x5e,0x80,0x68,0xf4, 0x6d,0x88,0x70,0xfd,0x7a,0x92,0x7d,0xf5,0x89,0x9d,0x8b,0xe8,0xd4,0xd5,0xd4, 0x99,0xeb,0xec,0xeb,0xc3,0xe4,0xe4,0xe4,0xe7,0xdb,0xdb,0xdb,0xfd,0xba,0xba, 0xba,0xff,0x97,0x97,0x97,0xe9,0x7e,0x7e,0x7e,0x8e,0x2b,0x2b,0x2b,0x1d,0x00, 0x00,0x00,0x1d,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x4e, 0x25,0x25,0x25,0xbd,0x74,0x74,0x74,0xfc,0x52,0x52,0x52,0xff,0x4e,0x4e,0x4e, 0xff,0xe0,0xe0,0xe0,0xff,0xa5,0xa5,0xa5,0xff,0x2c,0x2c,0x2c,0xff,0x3d,0x3d, 0x3d,0xff,0x4c,0x4c,0x4c,0xff,0x41,0x41,0x41,0xcf,0x28,0x28,0x28,0x2e,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x8d,0x00,0x00,0x00,0x00,0x85,0xff,0xff, 0xff,0x00,0x84,0x00,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x15,0x00,0x00, 0x00,0x1d,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x4e,0x00,0x00,0x00,0x58,0x82,0x00,0x00,0x00,0x5f,0x2e,0x00,0x00, 0x00,0x5a,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x55, 0x00,0x00,0x00,0x64,0x52,0x39,0x34,0x95,0x8f,0x57,0x4d,0xc6,0xa9,0x41,0x37, 0xe9,0xc4,0x34,0x2b,0xff,0xc9,0x28,0x1b,0xff,0xc9,0x21,0x12,0xff,0xcb,0x22, 0x16,0xff,0xca,0x23,0x19,0xff,0xc8,0x23,0x1c,0xff,0xc7,0x23,0x1d,0xff,0xc7, 0x22,0x18,0xff,0xc9,0x25,0x1a,0xff,0xc7,0x24,0x1a,0xff,0xc7,0x24,0x1b,0xff, 0xc8,0x25,0x1c,0xff,0xc9,0x25,0x1d,0xff,0xca,0x26,0x1d,0xff,0xca,0x25,0x1d, 0xff,0xca,0x25,0x1c,0xff,0xcc,0x28,0x20,0xff,0xbc,0x09,0x1c,0xff,0xb3,0x00, 0x19,0xff,0xb4,0x01,0x19,0xff,0xbb,0x09,0x13,0xff,0x9c,0x27,0x25,0xf7,0x0b, 0x06,0x05,0x77,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x1c, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x1a,0x00,0x00,0x00, 0x28,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x4a,0x00,0x00, 0x00,0x4f,0x82,0x00,0x00,0x00,0x51,0x31,0x00,0x00,0x00,0x4e,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x2a,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x1f,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x1c,0x03,0x03,0x03,0x17,0x22,0x22,0x22,0x83, 0x4c,0x4c,0x4c,0xe0,0x7d,0x7d,0x7d,0xfb,0xab,0xab,0xab,0xff,0xc9,0xc9,0xc9, 0xff,0xde,0xde,0xde,0xff,0xe8,0xe8,0xe8,0xfc,0xe9,0xe9,0xe9,0xfa,0xe7,0xe7, 0xe7,0xfb,0xe7,0xe7,0xe7,0xfe,0xe2,0xe2,0xe2,0xff,0xce,0xce,0xce,0xff,0xb6, 0xb6,0xb6,0xff,0x8d,0x8d,0x8d,0xf8,0x60,0x60,0x60,0xcf,0x6b,0x6b,0x6b,0x5a, 0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x30,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x43,0x02,0x02, 0x02,0x5a,0x26,0x26,0x26,0xe6,0x1f,0x1f,0x1f,0xff,0x14,0x14,0x14,0xff,0x54, 0x54,0x54,0xff,0xda,0xda,0xda,0xff,0xa4,0xa4,0xa4,0xff,0x29,0x29,0x29,0xff, 0x3e,0x3e,0x3e,0xff,0x4b,0x4b,0x4b,0xff,0x42,0x42,0x42,0xce,0x1f,0x1f,0x1f, 0x30,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x8c,0x00,0x00,0x00,0x00,0x85, 0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x15, 0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x34,0x82,0x00,0x00, 0x00,0x3b,0x17,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x19,0x00,0x00,0x00, 0x24,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x50,0x00,0x00, 0x00,0x5a,0x00,0x00,0x00,0x63,0x33,0x2b,0x25,0x80,0x70,0x49,0x3e,0xb6,0xa4, 0x51,0x49,0xdc,0xb6,0x3b,0x2f,0xfb,0xc2,0x2e,0x23,0xff,0xcc,0x21,0x18,0xff, 0xc8,0x20,0x17,0xff,0xc8,0x22,0x1a,0xff,0xc7,0x24,0x1a,0xff,0xca,0x26,0x1b, 0xff,0xc8,0x27,0x1c,0xff,0x83,0xc8,0x25,0x1c,0xff,0x0c,0xc9,0x27,0x1d,0xff, 0xc9,0x27,0x1b,0xff,0xcc,0x2a,0x1c,0xff,0xbf,0x18,0x19,0xff,0xb1,0x06,0x15, 0xff,0xbd,0x0c,0x12,0xff,0xae,0x26,0x1e,0xff,0x47,0x30,0x2a,0xa1,0x00,0x00, 0x00,0x62,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x0d,0x82, 0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x00,0x00, 0x00,0x16,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x27,0x82, 0x00,0x00,0x00,0x28,0x05,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x23,0x00,0x00, 0x00,0x1d,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0e,0x82,0x00,0x00,0x00,0x09, 0x03,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x1d,0x82,0x00, 0x00,0x00,0x21,0x12,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x18,0x14,0x14,0x14, 0x23,0x23,0x23,0x23,0x46,0x39,0x39,0x39,0x79,0x4e,0x4e,0x4e,0x9f,0x5b,0x5b, 0x5b,0xb1,0x60,0x60,0x60,0xc3,0x5f,0x5f,0x5f,0xc2,0x5c,0x5c,0x5c,0xad,0x5a, 0x5a,0x5a,0x9e,0x5e,0x5e,0x5e,0x74,0x56,0x56,0x56,0x3f,0x23,0x23,0x23,0x1a, 0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x2e,0x82,0x00,0x00,0x00,0x35,0x12,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x26, 0x00,0x00,0x00,0x27,0x06,0x06,0x06,0x4a,0x18,0x18,0x18,0xec,0x33,0x33,0x33, 0xff,0x24,0x24,0x24,0xff,0x12,0x12,0x12,0xff,0x4f,0x4f,0x4f,0xff,0xd1,0xd1, 0xd1,0xff,0x9e,0x9e,0x9e,0xff,0x2b,0x2b,0x2b,0xff,0x3c,0x3c,0x3c,0xff,0x4b, 0x4b,0x4b,0xff,0x40,0x40,0x40,0xd2,0x1d,0x1d,0x1d,0x2f,0x00,0x00,0x00,0x07, 0x00,0x00,0x00,0x01,0x8b,0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x8a, 0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x09,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x15,0x82,0x00,0x00,0x00,0x19, 0x2e,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0b,0x00,0x00, 0x00,0x07,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x35, 0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x57,0x00,0x00,0x00, 0x60,0x13,0x0f,0x0d,0x6f,0x68,0x4e,0x49,0xa5,0x8d,0x4b,0x43,0xd0,0xaf,0x41, 0x31,0xf2,0xc2,0x31,0x23,0xff,0xc9,0x25,0x1d,0xff,0xcc,0x25,0x1b,0xff,0xca, 0x27,0x1a,0xff,0xca,0x26,0x1b,0xff,0xc9,0x25,0x1d,0xff,0xc7,0x28,0x1d,0xff, 0xc7,0x29,0x1e,0xff,0xca,0x29,0x1d,0xff,0xcd,0x2c,0x1d,0xff,0xc5,0x23,0x1d, 0xff,0xbc,0x0e,0x13,0xff,0xb9,0x1e,0x1b,0xff,0x7f,0x54,0x4a,0xd0,0x00,0x00, 0x00,0x69,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x13,0x00, 0x00,0x00,0x05,0x7c,0x87,0x6c,0x00,0x42,0x4c,0x31,0x00,0x46,0x4b,0x35,0x00, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x08,0x00,0x00,0x00, 0x0b,0x00,0x00,0x00,0x0c,0x82,0x00,0x00,0x00,0x0d,0x0c,0x00,0x00,0x00,0x0c, 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x0a,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x21,0x82, 0x00,0x00,0x00,0x24,0x05,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x1f,0x00,0x00, 0x00,0x1b,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x17,0x82,0x00,0x00,0x00,0x15, 0x07,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x1b,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x30,0x82, 0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x19,0x82,0x00,0x00,0x00,0x0f,0x10,0x00,0x00,0x00,0x1c,0x08,0x08,0x08, 0x69,0x19,0x19,0x19,0xe7,0x33,0x33,0x33,0xff,0x21,0x21,0x21,0xff,0x14,0x14, 0x14,0xff,0x4d,0x4d,0x4d,0xff,0xca,0xca,0xca,0xff,0x95,0x95,0x95,0xff,0x2a, 0x2a,0x2a,0xff,0x3e,0x3e,0x3e,0xff,0x4a,0x4a,0x4a,0xff,0x41,0x41,0x41,0xd2, 0x1e,0x1e,0x1e,0x32,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x8a,0x00,0x00, 0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x8b,0x00,0x00,0x00,0x00,0x04,0x67,0x83, 0xc6,0x00,0x71,0x83,0x9b,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x82, 0x00,0x00,0x00,0x06,0x2e,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x73,0x7c, 0xb2,0x00,0x70,0x80,0xab,0x00,0x7f,0x72,0x8c,0x00,0xba,0x79,0x70,0x00,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0f, 0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x27,0x00,0x00,0x00, 0x32,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x53,0x00,0x00, 0x00,0x5d,0x00,0x00,0x00,0x65,0x40,0x36,0x30,0x90,0x7f,0x48,0x41,0xc2,0xa4, 0x45,0x35,0xe6,0xbe,0x3e,0x2e,0xff,0xc8,0x2c,0x21,0xff,0xcc,0x25,0x1b,0xff, 0xca,0x25,0x19,0xff,0xc9,0x26,0x1b,0xff,0xc9,0x28,0x1e,0xff,0xc9,0x2c,0x1e, 0xff,0xc5,0x29,0x23,0xff,0xc2,0x17,0x16,0xff,0x9c,0x45,0x38,0xf5,0x0d,0x0c, 0x0b,0x74,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1a,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x7a,0x84,0x69,0x00,0x42,0x4b,0x31,0x00, 0x46,0x4b,0x34,0x00,0x31,0x3c,0x23,0x00,0x24,0x2e,0x17,0x00,0x0c,0x07,0x03, 0x00,0x0e,0x0d,0x08,0x00,0x0b,0x13,0x09,0x00,0x89,0x00,0x00,0x00,0x00,0x08, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x0d,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x22,0x00,0x00, 0x00,0x26,0x85,0x00,0x00,0x00,0x28,0x82,0x00,0x00,0x00,0x29,0x1e,0x00,0x00, 0x00,0x2c,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x31,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x28,0x0a,0x0a, 0x0a,0x7b,0x1a,0x1a,0x1a,0xf0,0x34,0x34,0x34,0xff,0x20,0x20,0x20,0xff,0x11, 0x11,0x11,0xff,0x4b,0x4b,0x4b,0xff,0xc3,0xc3,0xc3,0xff,0x92,0x92,0x92,0xff, 0x28,0x28,0x28,0xff,0x3e,0x3e,0x3e,0xff,0x4a,0x4a,0x4a,0xff,0x40,0x40,0x40, 0xcf,0x1f,0x1f,0x1f,0x34,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x89,0x00, 0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0x8b,0x00,0x00,0x00,0x00,0x34,0x67, 0x83,0xc6,0x00,0x71,0x83,0x9b,0x00,0x69,0x87,0xa3,0x00,0x75,0x8b,0xb7,0x00, 0x6f,0x7f,0xa2,0x00,0x7e,0x8b,0xa8,0x00,0x7f,0x84,0xa9,0x00,0x66,0x72,0xb1, 0x00,0x73,0x7c,0xb2,0x00,0x70,0x80,0xab,0x00,0x7f,0x72,0x8c,0x00,0xba,0x79, 0x70,0x00,0xb8,0x93,0x7d,0x00,0xaa,0x54,0x49,0x00,0xc9,0xb5,0xa3,0x00,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0d, 0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x2e,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x4f,0x00,0x00, 0x00,0x59,0x00,0x00,0x00,0x62,0x23,0x1e,0x18,0x7b,0x69,0x45,0x3a,0xb3,0xa0, 0x49,0x3d,0xd9,0xc1,0x47,0x36,0xf9,0xc9,0x35,0x27,0xff,0xc8,0x25,0x1c,0xff, 0xc9,0x26,0x1a,0xff,0xcb,0x26,0x1d,0xff,0xb0,0x2d,0x23,0xff,0x4b,0x40,0x39, 0x9d,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x23,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x02,0xb7,0xa9,0x9c,0x00,0x79,0x83,0x68,0x00,0x41, 0x4b,0x31,0x00,0x46,0x4b,0x34,0x00,0x31,0x3c,0x23,0x00,0x24,0x2e,0x17,0x00, 0x0c,0x07,0x03,0x00,0x0e,0x0d,0x08,0x00,0x0b,0x13,0x09,0x00,0x8b,0x00,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07, 0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x19,0x00,0x00,0x00, 0x1e,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x27,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x2a,0x83,0x00,0x00,0x00,0x2b,0x08,0x00,0x00,0x00, 0x28,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x1b,0x00,0x00, 0x00,0x15,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x82, 0x00,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00, 0x00,0x1d,0x00,0x00,0x00,0x42,0x04,0x04,0x04,0x83,0x17,0x17,0x17,0xf2,0x32, 0x32,0x32,0xff,0x22,0x22,0x22,0xff,0x10,0x10,0x10,0xff,0x47,0x47,0x47,0xff, 0xba,0xba,0xba,0xff,0x8d,0x8d,0x8d,0xff,0x2b,0x2b,0x2b,0xff,0x3d,0x3d,0x3d, 0xff,0x49,0x49,0x49,0xff,0x42,0x42,0x42,0xd3,0x1f,0x1f,0x1f,0x35,0x00,0x00, 0x00,0x0a,0x00,0x00,0x00,0x02,0x88,0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff, 0x00,0x8b,0x00,0x00,0x00,0x00,0x34,0x67,0x83,0xc6,0x00,0x71,0x83,0x9b,0x00, 0x69,0x87,0xa3,0x00,0x75,0x8b,0xb7,0x00,0x6f,0x7f,0xa2,0x00,0x7e,0x8b,0xa8, 0x00,0x7f,0x84,0xa9,0x00,0x66,0x72,0xb1,0x00,0x73,0x7c,0xb2,0x00,0x70,0x80, 0xab,0x00,0x7f,0x72,0x8c,0x00,0xba,0x79,0x70,0x00,0xb8,0x93,0x7d,0x00,0xaa, 0x54,0x49,0x00,0xc9,0xb5,0xa3,0x00,0xac,0x73,0x67,0x00,0xbb,0x6a,0x5e,0x00, 0xa8,0x83,0x73,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x07,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x18,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x40,0x00, 0x00,0x00,0x4b,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x5f,0x0e,0x0b,0x0a,0x6c, 0x65,0x47,0x41,0xa0,0x9a,0x4d,0x40,0xce,0xbf,0x48,0x39,0xf1,0xc5,0x2f,0x21, 0xff,0x88,0x47,0x41,0xcc,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x4e,0x00,0x00, 0x00,0x2d,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x05,0xb3,0xa6,0x98,0x00,0xb6, 0xa8,0x9b,0x00,0x79,0x82,0x67,0x00,0x41,0x4b,0x30,0x00,0x46,0x4b,0x34,0x00, 0x31,0x3c,0x23,0x00,0x24,0x2e,0x17,0x00,0x0c,0x07,0x03,0x00,0x0e,0x0d,0x08, 0x00,0x0b,0x13,0x09,0x00,0x8d,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x09,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x15,0x00,0x00, 0x00,0x18,0x82,0x00,0x00,0x00,0x19,0x08,0x00,0x00,0x00,0x18,0x00,0x00,0x00, 0x17,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x09,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x85,0x00,0x00,0x00,0x00, 0x13,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x2b,0x00,0x00, 0x00,0x4e,0x05,0x05,0x05,0x92,0x19,0x19,0x19,0xed,0x32,0x32,0x32,0xff,0x20, 0x20,0x20,0xff,0x13,0x13,0x13,0xff,0x45,0x45,0x45,0xff,0xb3,0xb3,0xb3,0xff, 0x84,0x84,0x84,0xff,0x2a,0x2a,0x2a,0xff,0x3e,0x3e,0x3e,0xff,0x49,0x49,0x49, 0xff,0x41,0x41,0x41,0xd4,0x18,0x18,0x18,0x39,0x00,0x00,0x00,0x0b,0x00,0x00, 0x00,0x02,0x87,0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0xa0,0x00,0x00, 0x00,0x00,0x15,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x16,0x00,0x00,0x00, 0x1d,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x3c,0x00,0x00, 0x00,0x48,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x64,0x00, 0x00,0x00,0x69,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x36, 0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x99,0x00,0x00, 0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0x00,0x06,0x82,0x00,0x00,0x00,0x07, 0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x01,0x89,0x00,0x00,0x00,0x00,0x13,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x51,0x06,0x06, 0x06,0x93,0x19,0x19,0x19,0xf2,0x34,0x34,0x34,0xff,0x1f,0x1f,0x1f,0xff,0x0f, 0x0f,0x0f,0xff,0x44,0x44,0x44,0xff,0xab,0xab,0xab,0xff,0x81,0x81,0x81,0xff, 0x28,0x28,0x28,0xff,0x3e,0x3e,0x3e,0xff,0x49,0x49,0x49,0xff,0x41,0x41,0x41, 0xd3,0x16,0x16,0x16,0x3b,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x02,0x86,0x00, 0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0xa4,0x00,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0d, 0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x23,0x00,0x00,0x00, 0x2d,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x4a,0x00,0x00, 0x00,0x47,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x02,0xb1,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x06,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x53,0x04, 0x04,0x04,0x8e,0x16,0x16,0x16,0xf2,0x31,0x31,0x31,0xff,0x20,0x20,0x20,0xff, 0x0f,0x0f,0x0f,0xff,0x40,0x40,0x40,0xff,0xa3,0xa3,0xa3,0xff,0x7b,0x7b,0x7b, 0xff,0x29,0x29,0x29,0xff,0x3d,0x3d,0x3d,0xff,0x49,0x49,0x49,0xff,0x3e,0x3e, 0x3e,0xd7,0x18,0x18,0x18,0x39,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x02,0x85, 0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0xa7,0x00,0x00,0x00,0x00,0x0c, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x0b,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1f,0x00,0x00, 0x00,0x23,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x04,0xb3,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x06,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x54,0x04, 0x04,0x04,0x96,0x18,0x18,0x18,0xee,0x31,0x31,0x31,0xff,0x1e,0x1e,0x1e,0xff, 0x11,0x11,0x11,0xff,0x3e,0x3e,0x3e,0xff,0x9c,0x9c,0x9c,0xff,0x73,0x73,0x73, 0xff,0x29,0x29,0x29,0xff,0x3e,0x3e,0x3e,0xff,0x48,0x48,0x48,0xff,0x3f,0x3f, 0x3f,0xd7,0x17,0x17,0x17,0x3f,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x04,0x84, 0x00,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0xab,0x00,0x00,0x00,0x00,0x08, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x08,0x00,0x00,0x00, 0x0b,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x01,0xb4,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x53,0x06,0x06, 0x06,0x97,0x18,0x18,0x18,0xf2,0x33,0x33,0x33,0xff,0x1e,0x1e,0x1e,0xff,0x0e, 0x0e,0x0e,0xff,0x3d,0x3d,0x3d,0xff,0x95,0x95,0x95,0xff,0x70,0x70,0x70,0xff, 0x27,0x27,0x27,0xff,0x3e,0x3e,0x3e,0xff,0x48,0x48,0x48,0xff,0x3e,0x3e,0x3e, 0xd5,0x16,0x16,0x16,0x41,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x04,0x83,0x00, 0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x00,0xe9,0x00,0x00,0x00,0x00,0x13,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x54, 0x03,0x03,0x03,0x93,0x17,0x17,0x17,0xf3,0x31,0x31,0x31,0xff,0x1e,0x1e,0x1e, 0xff,0x0d,0x0d,0x0d,0xff,0x39,0x39,0x39,0xff,0x8d,0x8d,0x8d,0xff,0x6a,0x6a, 0x6a,0xff,0x28,0x28,0x28,0xff,0x3d,0x3d,0x3d,0xff,0x47,0x47,0x47,0xff,0x3c, 0x3c,0x3c,0xd9,0x11,0x11,0x11,0x45,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x05, 0x82,0x00,0x00,0x00,0x00,0xc4,0xff,0xff,0xff,0x00,0xaa,0x00,0x00,0x00,0x00, 0x16,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x12,0x00,0x00, 0x00,0x2f,0x00,0x00,0x00,0x56,0x05,0x05,0x05,0x99,0x17,0x17,0x17,0xee,0x30, 0x30,0x30,0xff,0x1d,0x1d,0x1d,0xff,0x0f,0x0f,0x0f,0xff,0x37,0x37,0x37,0xff, 0x87,0x87,0x87,0xff,0x64,0x64,0x64,0xff,0x28,0x28,0x28,0xff,0x3e,0x3e,0x3e, 0xff,0x47,0x47,0x47,0xff,0x3b,0x3b,0x3b,0xdb,0x15,0x15,0x15,0x4a,0x00,0x00, 0x00,0x15,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00 }; static const GdkPixdata antialias_pixdata = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 18209, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 524, /* rowstride */ 131, /* width */ 60, /* height */ antialias_pixdata_pixel_data /* pixel_data */ }; nvidia-settings/src/image_data/rj45_output_pixdata.h0000664000175000017500000001361312236467170022777 0ustar albertoalberto/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static guint8 rj45_output_pixdata_pixel_data[] = { 0x95,0x36,0x36,0x36,0xff,0x92,0x36,0x36,0x36,0x00,0x82,0x36,0x36,0x36,0xff, 0x01,0x36,0x36,0x36,0x00,0x86,0x64,0x64,0x64,0xff,0x83,0xff,0xff,0xff,0x00, 0x01,0x36,0x36,0x36,0x00,0x86,0x36,0x36,0x36,0xff,0x01,0x36,0x36,0x36,0x00, 0x82,0x36,0x36,0x36,0xff,0x02,0x36,0x36,0x36,0x00,0x64,0x64,0x64,0xff,0x84, 0x79,0x9e,0x79,0xff,0x01,0x64,0x64,0x64,0xff,0x84,0x50,0x50,0x50,0xff,0x01, 0x36,0x36,0x36,0xff,0x84,0xff,0xcc,0x02,0xff,0x02,0x36,0x36,0x36,0xff,0xff, 0xff,0xff,0x00,0x82,0x36,0x36,0x36,0xff,0x02,0x36,0x36,0x36,0x00,0x64,0x64, 0x64,0xff,0x84,0x79,0x9e,0x79,0xff,0x01,0x64,0x64,0x64,0xff,0x84,0x66,0x86, 0x9e,0xff,0x01,0x36,0x36,0x36,0xff,0x84,0xff,0xcc,0x02,0xff,0x02,0x36,0x36, 0x36,0xff,0xff,0xff,0xff,0x00,0x82,0x36,0x36,0x36,0xff,0x01,0x36,0x36,0x36, 0x00,0x86,0x64,0x64,0x64,0xff,0x84,0x66,0x86,0x9e,0xff,0x86,0x36,0x36,0x36, 0xff,0x01,0xff,0xff,0xff,0x00,0x82,0x36,0x36,0x36,0xff,0x03,0x36,0x36,0x36, 0x00,0xff,0xff,0xff,0x00,0x50,0x50,0x50,0xff,0x8c,0x66,0x86,0x9e,0xff,0x01, 0x50,0x50,0x50,0xff,0x82,0xff,0xff,0xff,0x00,0x82,0x36,0x36,0x36,0xff,0x04, 0x36,0x36,0x36,0x00,0xff,0xff,0xff,0x00,0x50,0x50,0x50,0xff,0x66,0x86,0x9e, 0xff,0x89,0xc7,0xd3,0xdc,0xff,0x03,0x4a,0x6a,0x84,0xff,0x66,0x86,0x9e,0xff, 0x50,0x50,0x50,0xff,0x82,0xff,0xff,0xff,0x00,0x82,0x36,0x36,0x36,0xff,0x05, 0x36,0x36,0x36,0x00,0xff,0xff,0xff,0x00,0x50,0x50,0x50,0xff,0x66,0x86,0x9e, 0xff,0xc7,0xd3,0xdc,0xff,0x88,0x8c,0xa4,0xb6,0xff,0x03,0x4a,0x6a,0x84,0xff, 0x66,0x86,0x9e,0xff,0x50,0x50,0x50,0xff,0x82,0xff,0xff,0xff,0x00,0x82,0x36, 0x36,0x36,0xff,0x10,0x36,0x36,0x36,0x00,0xff,0xff,0xff,0x00,0x50,0x50,0x50, 0xff,0x66,0x86,0x9e,0xff,0xc7,0xd3,0xdc,0xff,0x8c,0xa4,0xb6,0xff,0x76,0x90, 0xa4,0xff,0xa5,0xb7,0xc5,0xff,0xc3,0xcf,0xda,0xff,0xa5,0xb8,0xc5,0xff,0x84, 0x9c,0xb0,0xff,0x65,0x81,0x99,0xff,0x8c,0xa4,0xb6,0xff,0x4a,0x6a,0x84,0xff, 0x66,0x86,0x9e,0xff,0x50,0x50,0x50,0xff,0x82,0xff,0xff,0xff,0x00,0x82,0x36, 0x36,0x36,0xff,0x10,0x36,0x36,0x36,0x00,0xff,0xff,0xff,0x00,0x50,0x50,0x50, 0xff,0x66,0x86,0x9e,0xff,0xc7,0xd3,0xdc,0xff,0x8c,0xa4,0xb6,0xff,0x76,0x8f, 0xa3,0xff,0xb3,0xc2,0xce,0xff,0xcf,0xd9,0xe2,0xff,0xa8,0xba,0xc7,0xff,0x7f, 0x98,0xac,0xff,0x3f,0x5e,0x79,0xff,0x8c,0xa4,0xb6,0xff,0x4a,0x6a,0x84,0xff, 0x66,0x86,0x9e,0xff,0x50,0x50,0x50,0xff,0x82,0xff,0xff,0xff,0x00,0x82,0x36, 0x36,0x36,0xff,0x10,0x36,0x36,0x36,0x00,0xff,0xff,0xff,0x00,0x50,0x50,0x50, 0xff,0x66,0x86,0x9e,0xff,0xc7,0xd3,0xdc,0xff,0x8c,0xa4,0xb6,0xff,0x76,0x8f, 0xa3,0xff,0xb3,0xc2,0xce,0xff,0xd7,0xdf,0xe7,0xff,0xa8,0xba,0xc7,0xff,0x7f, 0x98,0xac,0xff,0x3f,0x5e,0x79,0xff,0x8c,0xa4,0xb6,0xff,0x4a,0x6a,0x84,0xff, 0x66,0x86,0x9e,0xff,0x50,0x50,0x50,0xff,0x82,0xff,0xff,0xff,0x00,0x82,0x36, 0x36,0x36,0xff,0x03,0x36,0x36,0x36,0x00,0xff,0xff,0xff,0x00,0x50,0x50,0x50, 0xff,0x83,0x66,0x86,0x9e,0xff,0x06,0x76,0x8f,0xa3,0xff,0xb3,0xc2,0xce,0xff, 0xe0,0xe7,0xec,0xff,0xa8,0xba,0xc7,0xff,0x7f,0x98,0xac,0xff,0x3f,0x5e,0x79, 0xff,0x83,0x66,0x86,0x9e,0xff,0x01,0x50,0x50,0x50,0xff,0x82,0xff,0xff,0xff, 0x00,0x82,0x36,0x36,0x36,0xff,0x02,0x36,0x36,0x36,0x00,0xff,0xff,0xff,0x00, 0x84,0x50,0x50,0x50,0xff,0x06,0x76,0x8f,0xa3,0xff,0xb3,0xc2,0xce,0xff,0xea, 0xee,0xf2,0xff,0xa8,0xba,0xc7,0xff,0x7f,0x98,0xac,0xff,0x3f,0x5e,0x79,0xff, 0x84,0x50,0x50,0x50,0xff,0x82,0x36,0x36,0x36,0x00,0x82,0x36,0x36,0x36,0xff, 0x86,0x36,0x36,0x36,0x00,0x06,0x76,0x8f,0xa3,0xff,0xb3,0xc2,0xce,0xff,0xf5, 0xf7,0xf9,0xff,0xa8,0xba,0xc7,0xff,0x7f,0x98,0xac,0xff,0x3f,0x5e,0x79,0xff, 0x86,0x36,0x36,0x36,0x00,0x88,0x36,0x36,0x36,0xff,0x06,0x76,0x8f,0xa3,0xff, 0xb3,0xc2,0xce,0xff,0xfe,0xff,0xff,0xff,0xa8,0xba,0xc7,0xff,0x7f,0x98,0xac, 0xff,0x3f,0x5e,0x79,0xff,0x87,0x36,0x36,0x36,0xff,0x87,0xff,0xff,0xff,0x00, 0x06,0x76,0x8f,0xa3,0xff,0xb3,0xc2,0xce,0xff,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0xff,0x7f,0x98,0xac,0xff,0x3f,0x5e,0x79,0xff,0x8e,0xff,0xff,0xff,0x00, 0x06,0x76,0x8f,0xa3,0xff,0xb3,0xc2,0xce,0xff,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0xff,0x7f,0x98,0xac,0xff,0x3f,0x5e,0x79,0xff,0x8e,0xff,0xff,0xff,0x00, 0x06,0x76,0x8f,0xa3,0xff,0xb3,0xc2,0xce,0xff,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0xff,0x7f,0x98,0xac,0xff,0x3f,0x5e,0x79,0xff,0x8e,0xff,0xff,0xff,0x00, 0x06,0x76,0x8f,0xa3,0xf9,0xb3,0xc2,0xce,0xf9,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0xf9,0x7f,0x98,0xac,0xf9,0x3f,0x5e,0x79,0xf9,0x8e,0xff,0xff,0xff,0x00, 0x06,0x76,0x8f,0xa3,0xe8,0xb3,0xc2,0xce,0xe8,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0xe8,0x7f,0x98,0xac,0xe8,0x3f,0x5e,0x79,0xe8,0x8e,0xff,0xff,0xff,0x00, 0x06,0x76,0x8f,0xa3,0xd4,0xb3,0xc2,0xce,0xd4,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0xd4,0x7f,0x98,0xac,0xd4,0x3f,0x5e,0x79,0xd4,0x8e,0xff,0xff,0xff,0x00, 0x06,0x76,0x8f,0xa3,0xbd,0xb3,0xc2,0xce,0xbd,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0xbd,0x7f,0x98,0xac,0xbd,0x3f,0x5e,0x79,0xbd,0x8e,0xff,0xff,0xff,0x00, 0x06,0x76,0x8f,0xa3,0xa4,0xb3,0xc2,0xce,0xa4,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0xa4,0x7f,0x98,0xac,0xa4,0x3f,0x5e,0x79,0xa4,0x8e,0xff,0xff,0xff,0x00, 0x06,0x76,0x8f,0xa3,0x89,0xb3,0xc2,0xce,0x89,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0x89,0x7f,0x98,0xac,0x89,0x3f,0x5e,0x79,0x89,0x8e,0xff,0xff,0xff,0x00, 0x06,0x76,0x8f,0xa3,0x6c,0xb3,0xc2,0xce,0x6c,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0x6c,0x7f,0x98,0xac,0x6c,0x3f,0x5e,0x79,0x6c,0x8e,0xff,0xff,0xff,0x00, 0x06,0x76,0x8f,0xa3,0x4d,0xb3,0xc2,0xce,0x4d,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0x4d,0x7f,0x98,0xac,0x4d,0x3f,0x5e,0x79,0x4d,0x8e,0xff,0xff,0xff,0x00, 0x06,0x76,0x8f,0xa3,0x2c,0xb3,0xc2,0xce,0x2c,0xff,0xff,0xff,0xff,0xa8,0xba, 0xc7,0x2c,0x7f,0x98,0xac,0x2c,0x3f,0x5e,0x79,0x2c,0x87,0xff,0xff,0xff,0x00 }; static const GdkPixdata rj45_output_pixdata = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 1080, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 80, /* rowstride */ 20, /* width */ 28, /* height */ rj45_output_pixdata_pixel_data /* pixel_data */ }; nvidia-settings/src/image_data/svp_3dvp.png0000664000175000017500000001141512236467170021160 0ustar albertoalbertoPNG  IHDR<<:rsRGBbKGD pHYs  tIME LjIDAThy]W}ǿgw6x{؎8 ! JUUK+T TjOBZ!!(J&HCL'vggy3{yyq `;K{}o=gg{Lt$"(Hp0G& m ,krWq|OEÙL&9/[kgl^k4sI,h+ι:-]-n 2X9hdJ]X s +@x3t!>Nkx$SJoFDƘ5RʭRb s^0Lk'㍳U,mEz_Ss$_T;H? hb[&?[R5Af(6,~!h~VR\]Ba0ͮRsU1LDDBWTMz6ăӓIin-6I:wv:{K*dj@syh>n~_M[Т^AEQ1ϯ RJ=AZEY9>ֻ, ɣ߶|{y|mp$ԍ3\aw_hB8l6~&ܺكCR80C=af~DROW.cOqxy<5PZ1஦߷POgKwNvn#I!1ιrR,J,7\}r\~s*>-K)ޝϰ,}äc jMmw& nz=넧۶EM[NDIF_lř|>;^{}uJfLuiF<,UԹG ~ 'Xέ' m)T.T?jK.i,c0 zliiR էLM8t7lPrUo|~OB/0b᪵ڳ X&f7FQ/#t'V ,!Ѽ1Tv= .>aK1ODXܡu>'Yu-جA8-?nƘq(>¦ɘ>0YxWj1]ru-mRDDIXCͤ ;2WH@=N>LNOuoY{6ܹnКzTvV3^' V븄 yIp蘄 "CDXWqb8 bE9"vx~8޹II+U1r܍QC~o]}d9*%RVWj+K&c>tZ<|`r1RRy<mR&dJRx ڗ$KdZ[kB'qܷmvdgǮ&> o;vt[jQlDCxnAv=l+Oz=V-] c2@ s3a~PJy%\q=cLDSDt3t$sZ%}\Hpz@oojι¨\p$ ĂMotϝ`LWlg)\Wo8V/&9 v 5ap'ndf(j?YԿSO=윫65*r`[3uӞGDh4tlw !{x9hbc 19AbIQl޼9׭d•,Vgh"ϒuWU,oڮwgY1*_=35o/pfnOTLl5?ӑ ~97E]Agq"DsRQ 9=== ɔafV(s9T:3;䗖HVx~x9mnWfwU7܌Nf~PRdak:EZn> ؁f絀cmvoYk_ (Be|8@D "H)Q(0<<̽b1- Fժ S-?Z.KzQG g亽3 B C xG鄓ҡΒ{$XkOYk}J1֒rK9T*BkMecȦ c`ógW.%֯xf a}@L_4+ c n p_[9AӖY }cS8XkB Kٽj"ߍ3̵پ-KԵ6H(ZW1g4(aKJYh/KsƧ L3S866-km-_uu/Ռۙ9 0 o pOcaeڵ/t)Zɓ?=z#S4mݱ]ʰ95cG1)p>8^:sfH<@ZZ*`ReRT:mo& 5aҎʫ%QQeYEE[u6;m!] |6YT[g\Rog!oچx.* !h{?a98_( pF@ݡ `/f!&بqܣD4777g߶Q swK!ooe0Fs kιӋ8 UTUJy&6Z֖sM'1ܱ[s}A|s1}#Ǿ`N) 33ZRRo\.#>Txs.\.kfCHe2JIҐ?G&ĩKl8DGЫ$)%RfJ)pιr6y{`y !sdُ)r%v ddP(1\)byZד0c,fwq?l{'pa˖-zUv u,`KZkK)E;8\.eϭڵkwDhߒ̫L{k_z= ?&T"›Faxw>kWycdh6{ci^)TA@ ex (H0ЩFRF#y!F1TKZk/8-$g[[ZRRJH)!8 l-9$)$i;֚G1/yKƘJ-/`({ fdalin)411bf @1 F7Aן J׮]xҥ֮\ w_p7g1X6x8L]>GV0g& -y.޼f+Cr|@z_~?g?YvܤI V`d?t PJ@b:`y",<6q&$ӲY~33Iq҄elEńb@c_0,߱u@i9edԬe"AXi#;S72<{.(.8z(Î;Xg.Y!$, p`.ߵOXX~`^bVsk 7:ȯ?;}W/ZQQ{gggbvp,88820123ۿrO_3|O$ʞ [o]d `::ּc G ?fqoCuCPYGCcg{%&"#ns c!7M#4ZE[LF R 7_g`efc077~>03 _azP_rέ ZZV_oG@IʘY3(//Gd DܹgV^ #G#'v4 ||`9,~Bإ;}[_~Q4 $". ֝ݧ C򽔼ä~`Q'Ro`@:u"p6?x򿕕NVSMjBAU]܌wZLLL~A}g5ok9% aq gcc7wuWYs IUu mmm4 jcڪsۖ~@-~cCkQ2uR"0E7tS1_fKhbl:~[6L&'X ZhY 㹗 Mz{ssya7En'-a5Y^XRb-VKf Y>Ν4fxmى6r_=ǀ?]fmm?J =k|^Qe !.|QeI^xwZy"L^A)a'lnR !q'ţ*H!XX67 n>JҢ Wul-sF`&7YJZ9;9 eThP)xfb,)6œ.]^-15=nC݃ _: chmjĕf;#owENa;*A߸vwZC4F"BGUl|woB%nDGt&jfdZӮ6|XrSC=t9NޥD0јAaydYҡT*JF!gƍX`s<3ej~؞~ ?^l?s:9j -qy{ ,ey(4A㫒+!ш1IԎmStҦ ::c3#ډcQ1Q3vXCTTPAX˲vaws/߮+3gv}wTIqGM͛XK\LB!<@Ѥ31o\%/2&^t#ХN Z"AVdꔽ3.@K}F*&&N}J-8ljsp|vtyũio*uvlMD ܻMnLRj>Bnd"}raj:`o˸/|(Oň_XxChN.*vx[+JinsYXW }gnk;=6x2B!CGqʱd B}܀ ;P\hSEsR)|>V]f\4^[ HOO!ۅkvoKIԨҏ(}~{QscCݻv 51+gw RǻN)BD K u 9,}}ppG1Wi(&Y *XYprrqb%ܐt@»PoIdffM?XWwĻ8N99'+~ָ pښq/@cc9U"ʼL撒WVՐv|C<Vhw!BmK\.J:bn ښPy~5l7!,q{G;.x<|EP*DG >Μ9 euFF~:өR*UJKNzb^xKki\9OառVg`WN '1+m!ՠUiG攟ր=) /zǛMm'gX1 @x۷&vU)gj#m@nXfƍKBVO˖J;1]"ԐU&C&%D#`8wcȠܐKQ0f?^V>ݍ0DEGHeDc&2TbuQvF:L#hD߇;$'WDmʒڭ]&C (H}#6|hBkiA1hxN‘Gp=R/:}ߩVX>?GܘX$EiwBCuP( Fcxp?TTL-3ٽI=M({&kLR!<(* ARbƾCRlm!)HGP9 +|d|5i@`.oht-]}?:?.^ȍ3?}ת&寒Li20 ܌#g7~A(G8$H=UlݰyYi xK֕u}6l\Eq1c l'r־6 ]꒥+t c (|hnǹgQ[WUo-s"w(Zx̜\sf#3]LK=qTH$BB))0hӰmzi O.XpqeeiB3RxqMIs~+g8NAc͛$6{^N2Ssћv]9,C]#}->B8>xz{Ø2qX́SU>xO*)!5 ``DPZ 'S/bܸ1cO= N$y6j΂Vy[o6Mɘ 1Ur2!f@H]`r5 :~W?2tPG" *|ܐ0M}wp,eEEl|:]<$% SH+ I z~fAY)Q 赞$9( 2ۜx<}N8!qKIL|^f\N›o,;zڰoꕆp}Vkl-Vi %M 8qGBa*!{sqxױaZ=~ІýW?Yu_^;B|8oV_[u{3xJ^9m TjkKCL\q*Fj$Qc0C6Xkӏ=9?V0cf3G26 eepAT܁eKC yJs;(PGD:Fi_J2jZΜE^~X\^.,\0?7n4ޔg(dWk^H )(^*3mO|#1Ès "L6.7``i)\n)>|8YT9vO~~|)=PR v2`;lG NэoE 7c˫kjRLotYRtI+fϞ=@Ҭp# J58dTqz%ml鋯!9bp4hH&(#GuݑH8VQ1RQkk7eKVb<Giŝ|e<.Hzg=;P;:ߗ\XRUJ+$]uEŕًzҚ(5 '4*u*Zr6Yp551olWu ƕNT q\p JH֮ fZ_ψ۰נ@Y^%vC^--ڜQ2rCzUUUݢׅB(#F#$zϒen٠S?mput!NG(B,)5ѢVʡHBH틼/LE0G0gqnߊ9s^\fV-_>:L@qaaS'SC __S ų9^v1IYTPiv] W%&O6@WAKs GAA0+{ 5"/5dqg`&J$HxC GytT}"ni݈W_#F9}pN&ℽsdR V&:yCOK+֠GIUWT9A"ˢeG{X@<"+VZ l Ĩ[LMBvBhnios0cgشi#p\HJߤW4xofBH$pB&ţ=q棏 qbkF6y%\-5|&RY+/+#rqi/3Xd/@PR~$sqh%x~/zSfwgO  oߚ P o출7쒧Jx*#Rs:Kd&?D'e>1Q]Mp]UQh|K<͌nkjn/^eoJ8ܪC dž߮z\zʶ<K|~J/[/["Ny EP)f\NQѣ$rG:0`ݤ߃TDK9Ϩ]G}F }PI۷Uٯm;ZSs6,>wy d椟ZJ#5_aO(._Wmm`Hq{Ԙ5wg"jd 22+~KfŎⅯ,k+:I[s٭h[qǘŘ(~B TP8 VηmȻtSq2Cm.[$%XKOjļU 8bCc$9L?UgYG &{u7ӊ#^S_cy)oD!̛2ۇߴDg)! `L}‘!5cPVc/Ib:\JWr=w,`0zVr%iaw')g/%/cs)thΟՄlKرwtxW cVט{饵i(uj)BC>ǎ|j*%FHBi!x}޿r&VNi9}}eЃx9;s"D)X|Fx`bqa#ʚB!+Ґ})ړh#F8Ny=Y6LNĹgTX+VQS|{Op׮7jmXM@)EHW)n{[:q=N`ԫYf{jv¥d4&ځKMp<} H<Nxv_EÁG&=~$=NpWʈiE3B9Y- .zzP{V%I\J$&ln2IENDB`nvidia-settings/src/image_data/penguin.png0000664000175000017500000004221512236467170021063 0ustar albertoalbertoPNG  IHDRhnBf*gAMA7tEXtSoftwareAdobe ImageReadyqe<DIDATxڔRM,Qmݪv[mHZ"gT\$.DpDB$;'.N4iiV}kj%|63ɣ o1: %PNzI۫$$Za9O" z1'U7 \*b֨i4s?I jno`?޵Nlxbfe\L am>ʉv@ksA*G@%.SZ t8Û'WaK{L*4c@P_?@]4 BBiPaE jm9;nq{wy |#WFrKbd.{ґizdzPVb&n/|:~T% NVΞo cUc ӞcpNϐF3J'6QGMq+J}mP 0 0rz?/O65~¹@@HfY(ɶ0MΎCj()@^d &g*®hן½N"T:-We6.e D.`|{,ܿfU4Jt? gi~8gqoO^ !-FYF6뱎ee9b8_xtb D)%f\%]4PEVM&a1Jm*NÆz4XQt&=Ƥњ (]B6(]v홠 3cp *l^*# &jxf "i`_JT<}`fzXV z Q- cX>AJxg9B #t\H,B=?z18T*@@!aT6jd g~JO2'Ʉ./}8x\owsm߁abTs5؎8^s%O퇮[M<(oҀ6ђs]~Щx"K|7:K)qgfgvfwgfw[X ֖ L%bL"h$_#Th*Fj Am) 6|53;3ٙ%cLv2=؛C˸7빋Im伫C^<3YTu'dd".E'9V={Yn(XMvR8߀+GAֆM(EF>{dm{-`GyL4咈5 uέrHsPZp.,Qz4D;HI=HSlZw=ohf̭çm>޸V]yIwvŦ@MZb-Q',@  0/{vƏzd\--+#8ÿOq_i_W].\ƼDpGXf(; hDX-5,S.4 g3Mio9),D`9NBnL˺Bzj&UٹDLsIMyVN33_L[ Z'9Oͽβ~3;hÅa"T:3K# sz_$-j]=2JEd0d֨4Y5Xc r}]aBL`'+:NwC_] 7'E}}] + ApbNkii+4Zgqj[)Lli:@gD@;S" @C$@LBrrr\1}d.5H sa^Wnlz~c2XO:d @t8Q*=^)ᢷ?܈#q}ơL3/fݛQf:?wuwhT4P: #9z9a(ftSS9mN@ sؚBݢn{Hifr9w-흈F_񥸜*&uYp\у1eeJݨ:.[~tۤ]|H!Xa@ SD}қ30W3S(+hZEF)GDNr.D64+C x.U:K$ %B5"Wt(>(lod//%vChoGC겣~~hT;K;ƒ5a-dED;vPBKxd] w#z~%'AS5Ĩ5G.ן/p=}|nDZ)>7eZ! nv#L`hEo|L:M2DxM ʠ8T&ӝBaX}9 _tc$`~DDYGC ;3?lel& Ξ:l2~jz*1(~6 zKHaO'%m&!P>u2"@n`Pd3ZО2) &Ϥ0oDǕ4ڠQ1fT4Պ+Ri=viYcݎVZڥdqi0d@F4 Cbxj+[p8a^"^"# rv|R%pe2 Mێ #5dq4Z!_}wQo`H$&qsH|/$]cO.C5ϳ<z`%S7)|cHT3A01kTWy;9߸ m2:E1H T$C46$&K|#S)bh5m:͹mn0:bc &֒%( S@Q؇ SF)ĢaՕ,)wD_"fyj\]?"Fоs%(O!5u: 9`Twe1ZG_OZ!9mm[V^R* OQ`1g׉7@3Y Yej,YϜ>~gWX) | A&<5ڠZmgk6\݌9B(<^ovb"3l x<OU%_,B^{Y 賚 糛28;濇h!;)2B2SW>&JB'ޜDP$;1(Iߏ0k|[CeC)6DZMҌxvi88uIm:~4NjmlvML]?₃0=ݽޞ+XNg̎@V^Z||hKiۣm_ $ ],HӒ*bwJ rH@)i}K>iLui y^5[ҘF.̃*CdH d]`|rAUtV\\g-iZ>Jx/TJ)H-+O)cJ?Lqa#AaX+~˴TlW'^9pGǙWNM'Gv6w掵\3ِ#y3_3)kf )!4^!OqC <$L86ckac2z跾%>Ox@GR?Ӈ4;^S $k|oOV\n&$?Ɨ~'SV}4DqI }hggl/7@ ވH*JȔIC$eqJzP0K*4(])YY;~jSE>e@8dl^f4;uvΚ-'J.3jj1ml8xX6 ?**)>mM{Zi/d5 cRܐY*XBFs߮,Q эH ~q+u }}X: ٻk~SyW:|e 1͙ Eˋ`o?yIqx!亳T0ͣ$j+<~8:zf֡\2s_pbA %&֨œCS֌R[kٕYWacĨ֓I( >U} ~؅?Obp̗Pq@S=D;A0q۫Ek;rovOg\~C'L>Irgj ӏtN&6:](׀X-v&T0z3QHQvH ͠3NDZcxWirp!:|%%I ]dXCvD%Ι͋!CG)'U__}.Xm[.DYTG:U_(Gl>B v9/%k?o!oہO@|t+ض w"պFGp8趋{F_#J mNԚ:W^E)ƒ'_= yIýJj':Sp X (&S:GCn,/q) ֎e !y馛p۰5=@Քil L1#[ T`z)! ӛ4y˟7BpˢTl8Ǟ@?OfB£|7I Zwɺ&N=kCb*QSqYX9@%9AD^\UFB"J/g`G(!AbA zvO"W t^Ǥb@`yň7?\UYwwFY(brTW<"3; m] >#ՙid5$lu,I2wOQ6헭@l?QUU~'JffS%FWEBALtQYjZA^)ewo3JT2I;ʫ#T\`6j (z}X5?n~/?sm?X 5*xP3ۤ jYeAI`HnZ/80:Ε̳֮˲5Ӵpfe;sf"K5I-s9h N!љ)2/"9tGkF%iАanRhe}6bj^TVF 5łWjoYGZdMoޭyw#hxasS?MN]] }Rt! $>U QȦ fgd 81`C8u/|Q퐹lnH&Mw܉ɨt2U9$>U ôK2+%qxrLa3cz:7$p(q}c+ǚi kN:c~wt AB |*|=p^F d9AZSvXnz8@DX &W; զon都d4^YN"(C:wH:`ծ㓶${p(3;L~C$ѭNIf<r$ P7ۿw 9\>G&NPL(WCZ0L~ $kFTj%X29D y VT(DƀI P i~%u\Vmm K ֮}o h٢5Y)Q0%29`XK:{wɄLsKur0G فgDrPN;` ̌ ]l0[VdBCWEsTk%$+=sPЎɜw2q({+k;' ;I<܋WL]qK*~to{Ai> e[591wy:񪉘5S",a^~Jt$h`'g^v7p5D-$3䳬f^SQ;%0W4O=.SM`f҆ 7vn·~rStz-ʥN# SЃB"u?MMp6m堼E2lL"CxhS8t"@ PrWPA,ܹQ7kFF yis$* {]?f. F Uu(5։-đ52/+'D{p҉ٺP}l;;%!'~]HYgV/+ LHy)U#H%qUWbz$I8ekV]#GA Psb7qGRDcO"qthv؝-mZF8Px2v{ ʛNCθ*@[_d \[;zYoS߻YڿUa4.m; ,Cq$8  v~l9 ։مx%X`.i;0s63nJ^Kwy5<^CG膳4e  tÛpg[ Jz{>7w&SG@YT\ayBh(KE1ʊWFV%kHm3Q #EGD}+Ă}MjUG=Lg&g" cA\x/ugqr ɟpb3FIoI'ŠJ ]B6j{*c`68@?c?YuŜbf&N< -e*pn <8 37t>Y_?~ueE\DbsEr`W]Iz9K rmCJS vBTh¥Cgp@XEkȝ֭/ڰpEm=6G{&` ٍA36\4sg.^}OV$RuXZg[R HTUѴ pdWp79Z XVA*!ˊR)dQRYrG鶿#Yh#Y< fs:థxLXw`?ʊko#T3d>aA*5;{L6, {0C:EED\Zi+| P DY`y$KpzUqt֖Ǹ5wL=>^X 4F^7ߥ f/1rv#"y*c5 p  C5 d2CXx>L\+נZ\L<E,⑍ơ64fp=([,r`26;fADn}E Ösu9OVqͷZ7z(M+Ƕȅ)HwZR4-p8;B2F~x#ʬM*Wgf̘A Tc Z @oXD4b 4їD##9H\IrwB8R#Y^=1ϙb"I:2]KF9H 3y|T,D'gbo/JedI3ϛT:ju_g,-ZOlz}=iJΟbvk?NϬ k w;`gc#æG^h1P m3%<,2q~Б&Y++RK6†3ҧؘwֱS? "5݂݁h{{2w8_"+;A2c;j5 >,Y8b)YGʿ\#3ۿ}g6Gv)ADpIBf0J|cEJ 4B=diɮN(G By|Ipkuq@HZ i !HAK`k\ Y)L( iBBQu6lU@rd7=D kj?Be\I$f<̿{BtFDŋ >vA {QPmmr0ł,8*L2(>y)O h{^%xĀNX $D M-/~$wCsq̍YzhiWmOɊ}Ɍ7\Nu݀QXP_zg..#z jblb-^k% j\KN췖>/liZ1@|fE>N.1s|Yjz$,cPDѺ_*P'vp*%v-K"oĖ?N֡ϱB \A{!:vml,X񹫣JxdXhDa˒V^YȲEeZ,w!V :"䢖M!q+x.U?b1bwOGL8&"ms i޸юnxlN-UTz5D+g65PBb:9 `IRD姮ȚĹP1dF0>ppW.lB.\rd+ɀpA/Ws%|;+q _hwO|\Ơip@!_~#nu.ڭ}%/HtbRi>lMlwXH R)0  SfΊATr?EJ}mZ,DSl9LE.M:01z\c EhϞ8qjQ:2Um}yH&Sx⏦ٳi)2iK6hFAx\u3ݗ/+c [=*#c9LQy{a۫#'o~iQpō)ڼJ;JQ- p-)GD!=\^ [H"TIZ^tĹ,A^# =,-H$8~feX'{R=+oؼ3Eip[sϫP5ycA:glrdZ.d/>5׬⊂\N=!Ӣ;\u,L+wY93`a=er)d8&upJ\bt%[F1!;OڿA-=<^{rGcN=B'rcqހ~<)c2l\XQ?'κZɁ)S%(\?UrheYVV]A_B^WlhZXYM il)?ԟr/[.ut!!@:L:+FD]-@;2JؖB~Ɩ/D|]`zR YyTg_t̓uz +&p^%]p~]/cih1yr3ɂMqG.愻m7\ m>8][ff܂|ѽϲG JEb2kQڤd@zxcb)hf+ѦVs`d, ]1"ٕhmcSs}o͇;C!|uq&oyT-l_2qD=~IENDB`nvidia-settings/src/image_data/glx_pixdata.h0000664000175000017500000012657712236467170021403 0ustar albertoalberto/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static guint8 glx_pixdata_pixel_data[] = { 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00, 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0x9d,0xff,0xff,0xff,0x00, 0x85,0x00,0x00,0x00,0x00,0x2f,0xea,0xea,0xeb,0x23,0xe8,0xe9,0xe9,0x7a,0xe8, 0xe9,0xe9,0xbd,0xe3,0xe4,0xe5,0xcf,0xe4,0xe5,0xe5,0xff,0xe0,0xe1,0xe2,0xff, 0xdd,0xde,0xdf,0xff,0xd8,0xda,0xdb,0xff,0xd5,0xd6,0xd7,0xff,0xd0,0xd2,0xd4, 0xff,0xcc,0xce,0xd0,0xff,0xc8,0xca,0xcc,0xff,0xc4,0xc7,0xc8,0xff,0xc0,0xc4, 0xc5,0xff,0xbc,0xc0,0xc1,0xff,0xb9,0xbd,0xbe,0xff,0xb6,0xb9,0xbc,0xff,0xb3, 0xb8,0xba,0xff,0xb1,0xb6,0xb8,0xff,0xac,0xb1,0xb2,0xc0,0xa9,0xae,0xb0,0x9f, 0xa6,0xaa,0xac,0x6d,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x01,0xba,0xbe,0xc0,0x00,0xbe,0xc1,0xc3,0x00,0xc2,0xc5,0xc7,0x00,0x00,0x00, 0x00,0x01,0xc2,0xc4,0xc5,0x35,0xcc,0xce,0xcf,0xbd,0xcf,0xd1,0xd2,0xbe,0xd2, 0xd4,0xd5,0xbf,0xd6,0xd8,0xd9,0xbf,0xda,0xdb,0xdc,0xbf,0xdd,0xdf,0xe0,0xbf, 0xd7,0xd9,0xd9,0x6d,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x01,0xf2,0xf2,0xf2,0x00,0xf4,0xf5,0xf5,0x00,0xf7,0xf7,0xf7,0x00,0xf9,0xf9, 0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0x85, 0xfe,0xfe,0xfe,0x00,0x1a,0x00,0x00,0x00,0x01,0xf2,0xf2,0xf2,0x35,0xf8,0xf8, 0xf8,0xbd,0xf5,0xf6,0xf5,0xbe,0xf3,0xf3,0xf3,0xbf,0xf1,0xf1,0xf1,0xbf,0xef, 0xef,0xef,0xbf,0xec,0xed,0xed,0xbf,0xea,0xeb,0xeb,0xbf,0xe7,0xe8,0xe8,0xbf, 0xda,0xdb,0xdc,0x6d,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x01,0xdc,0xde,0xdf,0x00,0xd9,0xdb,0xdc,0x00,0xd5,0xd8,0xd9,0x00,0xd1,0xd5, 0xd6,0x00,0xce,0xd1,0xd2,0x00,0xca,0xcd,0xcf,0x00,0xc7,0xca,0xcb,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xba,0xbe,0xc1,0x8a,0xb8,0xbd,0xbf,0xbd, 0xb5,0xba,0xbc,0xbe,0x85,0xb2,0xb7,0xb9,0xbf,0x05,0xb2,0xb7,0xb9,0xae,0x77, 0x7a,0x7c,0x1a,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00, 0x82,0xff,0xff,0xff,0x00,0x83,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x01, 0xec,0xed,0xed,0x8a,0xee,0xee,0xef,0xff,0xeb,0xeb,0xec,0xff,0xe7,0xe8,0xe9, 0xff,0xe4,0xe5,0xe5,0xff,0xe0,0xe1,0xe2,0xff,0xdc,0xde,0xdf,0xff,0xd8,0xda, 0xdb,0xff,0xd4,0xd6,0xd7,0xff,0xd0,0xd2,0xd4,0xff,0xcc,0xce,0xcf,0xff,0xc7, 0xcb,0xcb,0xff,0xc4,0xc7,0xc8,0xff,0xc0,0xc3,0xc5,0xff,0xbc,0xc0,0xc1,0xff, 0xb9,0xbd,0xbe,0xff,0xb6,0xba,0xbb,0xff,0xb4,0xb8,0xb9,0xff,0xb1,0xb6,0xb8, 0xff,0x82,0xb0,0xb5,0xb7,0xff,0x1a,0xb1,0xb6,0xb8,0xff,0xb2,0xb7,0xb9,0xff, 0xb0,0xb5,0xb7,0xe2,0x8a,0x8c,0x8e,0x44,0x00,0x00,0x00,0x0a,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x01,0xc6,0xc9,0xca,0x00,0x00,0x00,0x00,0x01,0xbb,0xbd, 0xbe,0x4b,0xd2,0xd4,0xd6,0xff,0xd6,0xd8,0xd9,0xff,0xda,0xdc,0xdd,0xff,0xde, 0xdf,0xe0,0xff,0xe2,0xe3,0xe3,0xff,0xe5,0xe7,0xe7,0xff,0xc4,0xc5,0xc5,0x8d, 0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x03,0xf4,0xf5,0xf5, 0x00,0xf7,0xf7,0xf7,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfc,0xfc, 0xfc,0x00,0xfd,0xfd,0xfd,0x00,0x84,0xfe,0xfe,0xfe,0x00,0x1b,0xfe,0xfd,0xfe, 0x00,0xfd,0xfd,0xfd,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0xe3,0xe3, 0xe3,0x70,0xf7,0xf8,0xf8,0xff,0xf6,0xf6,0xf6,0xff,0xf4,0xf4,0xf4,0xff,0xf1, 0xf2,0xf2,0xff,0xef,0xf0,0xf0,0xff,0xec,0xed,0xed,0xff,0xe9,0xeb,0xeb,0xff, 0xe6,0xe7,0xe8,0xff,0x98,0x9a,0x9a,0x4c,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x01,0xd6,0xd8,0xd9,0x00,0xd1,0xd5,0xd5,0x00,0xce,0xd1, 0xd2,0x00,0xca,0xcd,0xce,0x00,0xc7,0xca,0xcc,0x00,0xc4,0xc7,0xc8,0x00,0x00, 0x00,0x00,0x01,0xb7,0xbb,0xbd,0x7b,0xbb,0xbf,0xc1,0xff,0xb8,0xbd,0xbe,0xff, 0x85,0xb6,0xbb,0xbd,0xff,0x06,0xb4,0xb9,0xbb,0xf1,0x6d,0x70,0x71,0x55,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00, 0x82,0xff,0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x01, 0xed,0xed,0xed,0xad,0xee,0xee,0xef,0xff,0xeb,0xeb,0xec,0xff,0xe7,0xe8,0xe8, 0xff,0xe4,0xe5,0xe5,0xff,0xe0,0xe1,0xe2,0xff,0xdc,0xde,0xde,0xff,0xd8,0xda, 0xda,0xff,0xd4,0xd6,0xd7,0xff,0xd0,0xd2,0xd3,0xff,0xcc,0xce,0xcf,0xff,0xc8, 0xca,0xcb,0xff,0xc4,0xc7,0xc8,0xff,0xc0,0xc4,0xc5,0xff,0xbc,0xc0,0xc1,0xff, 0xb9,0xbd,0xbe,0xff,0xb6,0xba,0xbc,0xff,0xb3,0xb8,0xb9,0xff,0xb1,0xb6,0xb8, 0xff,0xb0,0xb6,0xb7,0xff,0xb0,0xb5,0xb7,0xff,0xb1,0xb6,0xb8,0xff,0xb2,0xb7, 0xb9,0xff,0xb4,0xb9,0xbb,0xff,0xb7,0xbb,0xbd,0xff,0xb8,0xbb,0xbd,0xf2,0x67, 0x68,0x6a,0x3f,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x04,0xca,0xcd,0xce,0x00, 0x00,0x00,0x00,0x03,0xae,0xaf,0xb1,0x52,0xd6,0xd8,0xd9,0xff,0xda,0xdc,0xdd, 0xff,0xde,0xdf,0xe0,0xff,0xe2,0xe3,0xe3,0xff,0xe5,0xe7,0xe7,0xff,0xe9,0xe9, 0xea,0xff,0xaa,0xab,0xab,0xa5,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x19,0x00, 0x00,0x00,0x06,0xf7,0xf7,0xf7,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfb,0x00, 0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0x85,0xfe,0xfe,0xfe,0x00,0x1a,0xfd, 0xfd,0xfd,0x00,0xfc,0xfc,0xfc,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0a, 0x00,0x00,0x00,0x1d,0xb7,0xb7,0xb7,0x89,0xf3,0xf4,0xf4,0xff,0xf1,0xf2,0xf2, 0xff,0xef,0xf0,0xf0,0xff,0xec,0xed,0xed,0xff,0xe9,0xea,0xeb,0xff,0xe6,0xe8, 0xe8,0xff,0xe3,0xe5,0xe5,0xff,0xdc,0xdd,0xde,0xf3,0x84,0x85,0x86,0x55,0x00, 0x00,0x00,0x12,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0xce,0xd1,0xd2,0x00, 0xca,0xce,0xcf,0x00,0xc7,0xca,0xcb,0x00,0xc4,0xc7,0xc8,0x00,0x00,0x00,0x00, 0x01,0xb6,0xba,0xbb,0x6a,0xba,0xbe,0xc1,0xff,0xb8,0xbd,0xbe,0xff,0x85,0xb6, 0xbb,0xbd,0xff,0x07,0xb1,0xb6,0xb8,0xf5,0x47,0x49,0x4a,0x82,0x00,0x00,0x00, 0x4f,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x01,0x82,0xff,0xff,0xff,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0xe7,0xe8,0xe8,0x6a,0xed,0xee,0xef,0xff,0xeb,0xeb,0xec,0xff,0xe7,0xe8, 0xe8,0xff,0xe3,0xe5,0xe5,0xff,0xe0,0xe1,0xe2,0xff,0xdc,0xde,0xde,0xff,0xd8, 0xda,0xdb,0xff,0xd4,0xd6,0xd7,0xff,0xd0,0xd2,0xd3,0xff,0xcb,0xce,0xcf,0xff, 0xc8,0xca,0xcb,0xff,0xc4,0xc7,0xc8,0xff,0xc0,0xc3,0xc5,0xff,0xbc,0xc0,0xc1, 0xff,0xb9,0xbd,0xbe,0xff,0xb6,0xb9,0xbb,0xff,0xb4,0xb8,0xb9,0xff,0xb1,0xb6, 0xb8,0xff,0xb1,0xb6,0xb7,0xff,0xb0,0xb5,0xb7,0xff,0xb1,0xb6,0xb8,0xff,0xb2, 0xb7,0xb9,0xff,0xb5,0xb9,0xbb,0xff,0xb8,0xbc,0xbd,0xff,0xbb,0xbe,0xc0,0xff, 0xbe,0xc2,0xc3,0xff,0xa4,0xa7,0xa9,0xb5,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0xa5,0xa7,0xa8,0x58,0xda,0xdc, 0xdd,0xff,0xde,0xe0,0xe0,0xff,0xe2,0xe3,0xe3,0xff,0xe6,0xe7,0xe7,0xff,0xe9, 0xea,0xea,0xff,0xec,0xed,0xed,0xff,0x9a,0x9a,0x9a,0xb9,0x00,0x00,0x00,0x4f, 0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x08,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfb, 0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0x85,0xfe,0xfe,0xfe,0x00,0x1a, 0xfd,0xfd,0xfd,0x00,0xfc,0xfc,0xfc,0x00,0xfb,0xfb,0xfb,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x3e,0xb4,0xb4, 0xb4,0xb7,0xef,0xf0,0xf0,0xff,0xec,0xed,0xed,0xff,0xe9,0xea,0xeb,0xff,0xe6, 0xe7,0xe8,0xff,0xe3,0xe5,0xe5,0xff,0xdf,0xe1,0xe2,0xff,0xdc,0xde,0xdf,0xff, 0xd5,0xd7,0xd8,0xf3,0x41,0x41,0x42,0x38,0x00,0x00,0x00,0x0f,0x00,0x00,0x00, 0x04,0xca,0xcd,0xcf,0x00,0xc7,0xca,0xcb,0x00,0xc4,0xc7,0xc8,0x00,0x00,0x00, 0x00,0x01,0xb3,0xb6,0xb8,0x48,0xba,0xbf,0xc0,0xff,0xb8,0xbd,0xbf,0xff,0x86, 0xb6,0xbb,0xbd,0xff,0x07,0x54,0x57,0x57,0xb8,0x00,0x00,0x00,0x7f,0x00,0x00, 0x00,0x5b,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x04,0xe8,0xe9,0xea,0xd0,0xea,0xeb,0xec,0xff,0xe7,0xe8,0xe9,0xff,0xe3, 0xe5,0xe5,0xff,0xe0,0xe1,0xe2,0xff,0xdc,0xde,0xde,0xff,0xd8,0xda,0xdb,0xff, 0xd4,0xd6,0xd7,0xff,0xd0,0xd2,0xd3,0xff,0xcb,0xce,0xcf,0xff,0xc7,0xca,0xcb, 0xff,0xc4,0xc7,0xc8,0xff,0xc0,0xc3,0xc4,0xff,0xbc,0xc0,0xc1,0xff,0xb9,0xbd, 0xbe,0xff,0xb5,0xba,0xbc,0xff,0xb4,0xb8,0xb9,0xff,0xb1,0xb6,0xb8,0xff,0xb0, 0xb6,0xb7,0xff,0xb0,0xb5,0xb7,0xff,0xb1,0xb6,0xb8,0xff,0xb2,0xb7,0xb9,0xff, 0xb4,0xb9,0xbb,0xff,0xb8,0xbb,0xbd,0xff,0xbb,0xbe,0xc0,0xff,0xbe,0xc1,0xc3, 0xff,0xc2,0xc6,0xc6,0xff,0xba,0xbc,0xbd,0xec,0x00,0x00,0x00,0x41,0x00,0x00, 0x00,0x1a,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05,0xa3,0xa5,0xa6,0x5b,0xdf, 0xe0,0xe0,0xff,0xe2,0xe3,0xe4,0xff,0xe6,0xe7,0xe7,0xff,0xe9,0xea,0xea,0xff, 0xec,0xed,0xed,0xff,0xef,0xf0,0xf0,0xff,0x94,0x94,0x95,0xc3,0x00,0x00,0x00, 0x5b,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x0a,0xfa,0xfa,0xfb,0x00,0xfc,0xfc, 0xfc,0x00,0xfd,0xfd,0xfd,0x00,0x85,0xfe,0xfe,0xfe,0x00,0x1a,0xfd,0xfd,0xfd, 0x00,0xfc,0xfc,0xfc,0x00,0xfb,0xfb,0xfb,0x00,0xf9,0xf9,0xfa,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x57,0xb0,0xb1,0xb1,0xcd,0xe9,0xea,0xeb,0xff,0xe6,0xe7,0xe8,0xff, 0xe3,0xe4,0xe5,0xff,0xdf,0xe1,0xe2,0xff,0xdc,0xde,0xdf,0xff,0xd9,0xdb,0xdc, 0xff,0xd5,0xd7,0xd9,0xff,0xc1,0xc4,0xc5,0xdc,0x43,0x44,0x44,0x34,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x02,0xc3,0xc7,0xc8,0x00,0x00,0x00,0x00,0x01,0xb3, 0xb6,0xb8,0x36,0xb9,0xbe,0xc0,0xef,0xb8,0xbd,0xbe,0xff,0x86,0xb6,0xbb,0xbd, 0xff,0x08,0x59,0x5c,0x5d,0xd0,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x79,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x12,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x09,0xea,0xeb,0xeb,0xff,0xe7,0xe8,0xe8,0xff,0xe3,0xe5,0xe5,0xff, 0xe0,0xe1,0xe1,0xff,0xdc,0xdd,0xde,0xff,0xd8,0xda,0xda,0xff,0xd4,0xd6,0xd7, 0xff,0xc4,0xc7,0xc8,0xfb,0x6f,0x70,0x71,0xdb,0x43,0x44,0x44,0xc9,0x43,0x44, 0x44,0xc7,0x42,0x43,0x44,0xc5,0x41,0x42,0x43,0xc4,0x3f,0x41,0x42,0xc4,0x3e, 0x40,0x41,0xc4,0x3e,0x3f,0x40,0xc4,0x83,0x3d,0x3f,0x3f,0xc4,0x1a,0x3d,0x3f, 0x3f,0xc5,0x6e,0x72,0x73,0xdb,0xb4,0xb9,0xbb,0xff,0xb7,0xbb,0xbd,0xff,0xbb, 0xbe,0xc0,0xff,0xbe,0xc2,0xc3,0xff,0xc2,0xc5,0xc7,0xff,0xc6,0xc9,0xca,0xff, 0xca,0xcd,0xce,0xff,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x2a,0x00,0x00,0x00, 0x0b,0x00,0x00,0x00,0x06,0xa6,0xa7,0xa8,0x5b,0xe2,0xe3,0xe4,0xff,0xe6,0xe7, 0xe7,0xff,0xe9,0xea,0xea,0xff,0xec,0xed,0xed,0xff,0xef,0xf0,0xf0,0xff,0xf2, 0xf2,0xf3,0xff,0x94,0x94,0x94,0xc5,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x0a,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0x85,0xfe,0xfe, 0xfe,0x00,0x1a,0xfd,0xfd,0xfd,0x00,0xfc,0xfc,0xfc,0x00,0xfa,0xfb,0xfb,0x00, 0xf9,0xf9,0xf9,0x00,0xf7,0xf8,0xf8,0x00,0xf5,0xf6,0xf6,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x35,0x00,0x00, 0x00,0x60,0xa9,0xa9,0xaa,0xd1,0xe3,0xe5,0xe5,0xff,0xdf,0xe1,0xe2,0xff,0xdc, 0xde,0xdf,0xff,0xd9,0xdb,0xdc,0xff,0xd5,0xd7,0xd9,0xff,0xd1,0xd4,0xd5,0xff, 0xcd,0xd1,0xd2,0xff,0xbd,0xbf,0xc0,0xdb,0x00,0x00,0x00,0x22,0x00,0x00,0x00, 0x0b,0x00,0x00,0x00,0x02,0xad,0xb1,0xb3,0x25,0xb9,0xbe,0xc0,0xef,0xb8,0xbd, 0xbe,0xff,0x86,0xb6,0xbb,0xbd,0xff,0x09,0x58,0x5a,0x5b,0xd4,0x00,0x00,0x00, 0xa4,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x2d,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x82, 0xff,0xff,0xff,0x00,0x0d,0x00,0x00,0x00,0x01,0xbb,0xbb,0xbb,0x40,0xe7,0xe8, 0xe8,0xff,0xe3,0xe5,0xe5,0xff,0xe0,0xe1,0xe2,0xff,0xdc,0xdd,0xde,0xff,0xd8, 0xda,0xdb,0xff,0xd4,0xd6,0xd7,0xff,0xd0,0xd2,0xd3,0xff,0x24,0x24,0x25,0xbf, 0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x90,0x88,0x00,0x00, 0x00,0x8b,0x19,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x92,0x82,0x85,0x87,0xd8, 0xbb,0xbe,0xc0,0xff,0xbe,0xc2,0xc4,0xff,0xc2,0xc5,0xc7,0xff,0xc6,0xc9,0xca, 0xff,0xca,0xcd,0xce,0xff,0xce,0xd0,0xd2,0xff,0x00,0x00,0x00,0x70,0x00,0x00, 0x00,0x36,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x06,0xa9,0xaa,0xab,0x5b,0xe6, 0xe7,0xe7,0xff,0xe9,0xea,0xea,0xff,0xec,0xed,0xed,0xff,0xef,0xf0,0xf0,0xff, 0xf2,0xf3,0xf3,0xff,0xf4,0xf5,0xf5,0xff,0x95,0x95,0x95,0xc5,0x00,0x00,0x00, 0x5e,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x0a,0xfd,0xfd,0xfd,0x00,0x85,0xfe, 0xfe,0xfe,0x00,0x1a,0xfd,0xfd,0xfd,0x00,0xfc,0xfc,0xfc,0x00,0xfb,0xfb,0xfb, 0x00,0xf9,0xf9,0xf9,0x00,0xf7,0xf8,0xf8,0x00,0xf5,0xf6,0xf6,0x00,0xf3,0xf4, 0xf4,0x00,0xf1,0xf2,0xf2,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x18,0x00,0x00,0x00,0x38,0x23,0x23,0x23,0x6e,0xc5,0xc6,0xc7,0xe8, 0xdc,0xde,0xdf,0xff,0xd9,0xdb,0xdc,0xff,0xd5,0xd8,0xd9,0xff,0xd1,0xd4,0xd5, 0xff,0xce,0xd1,0xd1,0xff,0xca,0xcd,0xce,0xff,0xc6,0xca,0xcb,0xff,0xa7,0xa9, 0xaa,0xb4,0x00,0x00,0x00,0x1f,0x73,0x75,0x77,0x1c,0xb6,0xbb,0xbe,0xcf,0xb8, 0xbd,0xbe,0xff,0x86,0xb6,0xbb,0xbd,0xff,0x08,0x7b,0x7e,0x7f,0xe3,0x00,0x00, 0x00,0xa6,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x13,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00, 0x00,0x82,0xff,0xff,0xff,0x00,0x0e,0x00,0x00,0x00,0x01,0xbb,0xbb,0xbb,0x54, 0xe3,0xe5,0xe5,0xff,0xdf,0xe1,0xe2,0xff,0xdc,0xde,0xde,0xff,0xd8,0xda,0xda, 0xff,0xd4,0xd6,0xd7,0xff,0xd0,0xd2,0xd3,0xff,0x96,0x98,0x99,0xe7,0x00,0x00, 0x00,0xa4,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x59,0x00, 0x00,0x00,0x52,0x87,0x00,0x00,0x00,0x51,0x18,0x00,0x00,0x00,0x52,0x00,0x00, 0x00,0x5e,0x6f,0x71,0x72,0xac,0x9d,0xa1,0xa2,0xe2,0x9d,0x9f,0xa1,0xe8,0x9d, 0x9f,0xa0,0xec,0xa0,0xa2,0xa3,0xec,0xa3,0xa5,0xa6,0xec,0xab,0xad,0xae,0xe6, 0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x13,0x00,0x00,0x00, 0x06,0xac,0xad,0xad,0x5b,0xe9,0xea,0xeb,0xff,0xec,0xed,0xed,0xff,0xef,0xf0, 0xf0,0xff,0xf2,0xf3,0xf3,0xff,0xf4,0xf5,0xf5,0xff,0xf7,0xf7,0xf7,0xff,0x96, 0x96,0x96,0xc5,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x0a, 0x85,0xfe,0xfe,0xfe,0x00,0x1a,0xfd,0xfd,0xfd,0x00,0xfc,0xfc,0xfc,0x00,0xfa, 0xfb,0xfb,0x00,0xf9,0xf9,0xf9,0x00,0xf7,0xf8,0xf8,0x00,0xf5,0xf6,0xf6,0x00, 0xf3,0xf4,0xf4,0x00,0xf1,0xf2,0xf2,0x00,0xef,0xef,0xf0,0x00,0xec,0xed,0xed, 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x19,0x00,0x00, 0x00,0x3b,0x21,0x21,0x21,0x71,0xbd,0xc0,0xc0,0xe9,0xd5,0xd8,0xd8,0xff,0xd1, 0xd4,0xd5,0xff,0xcd,0xd1,0xd2,0xff,0xca,0xcd,0xce,0xff,0xc7,0xca,0xcb,0xff, 0xc4,0xc7,0xc8,0xff,0xc0,0xc4,0xc6,0xff,0xa2,0xa5,0xa6,0xb3,0xb3,0xb8,0xb8, 0xd4,0xb8,0xbd,0xbe,0xff,0x86,0xb6,0xbb,0xbd,0xff,0x08,0x7b,0x7e,0x7f,0xe3, 0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x5d,0x00,0x00,0x00, 0x33,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x83,0x00, 0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x0e,0x00,0x00,0x00,0x03,0xae,0xae, 0xaf,0x59,0xe0,0xe1,0xe2,0xff,0xdc,0xdd,0xde,0xff,0xd8,0xda,0xda,0xff,0xd4, 0xd6,0xd7,0xff,0xcf,0xd2,0xd3,0xff,0xcb,0xce,0xcf,0xff,0x70,0x72,0x73,0xd3, 0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x3a,0x00,0x00,0x00, 0x26,0x00,0x00,0x00,0x22,0x87,0x00,0x00,0x00,0x20,0x18,0x00,0x00,0x00,0x22, 0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x6a,0x00,0x00,0x00, 0x89,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x9e,0x00,0x00, 0x00,0x8c,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x06,0xaf,0xaf,0xaf,0x5b,0xec,0xed,0xed,0xff,0xef,0xf0,0xf0,0xff, 0xf2,0xf2,0xf3,0xff,0xf5,0xf5,0xf5,0xff,0xf7,0xf7,0xf7,0xff,0xf9,0xf9,0xf9, 0xff,0x97,0x98,0x98,0xc5,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x29,0x00,0x00, 0x00,0x0a,0x83,0xfe,0xfe,0xfe,0x00,0x1b,0xfe,0xfe,0xfd,0x00,0xfd,0xfd,0xfd, 0x00,0xfc,0xfc,0xfc,0x00,0xfa,0xfb,0xfb,0x00,0xf9,0xf9,0xf9,0x00,0xf7,0xf8, 0xf8,0x00,0xf5,0xf6,0xf6,0x00,0xf3,0xf4,0xf4,0x00,0xf1,0xf1,0xf2,0x00,0xef, 0xef,0xf0,0x00,0xec,0xed,0xed,0x00,0xe9,0xea,0xea,0x00,0xe6,0xe7,0xe7,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x1c,0x00,0x00,0x00, 0x40,0x1e,0x1e,0x1e,0x77,0xb6,0xb9,0xb9,0xea,0xcd,0xd1,0xd2,0xff,0xca,0xcd, 0xce,0xff,0xc7,0xca,0xcb,0xff,0xc3,0xc7,0xc8,0xff,0xc0,0xc4,0xc6,0xff,0xbd, 0xc1,0xc3,0xff,0xba,0xbf,0xc0,0xff,0xb8,0xbd,0xbe,0xff,0x86,0xb6,0xbb,0xbd, 0xff,0x08,0x7b,0x7e,0x7f,0xe3,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x8b,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x01,0x84,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x2d, 0x00,0x00,0x00,0x04,0xa8,0xa9,0xa9,0x5b,0xdc,0xdd,0xde,0xff,0xd8,0xda,0xda, 0xff,0xd4,0xd6,0xd6,0xff,0xcf,0xd2,0xd3,0xff,0xcb,0xcd,0xcf,0xff,0xc7,0xca, 0xcb,0xff,0x72,0x74,0x75,0xcc,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07, 0xa9,0xad,0xae,0x6b,0xa8,0xac,0xae,0x7d,0xa7,0xac,0xae,0x7e,0xa6,0xaa,0xac, 0x80,0xa8,0xac,0xae,0x80,0xab,0xae,0xb1,0x80,0xae,0xb2,0xb2,0x80,0xac,0xaf, 0xb1,0x84,0xa3,0xa6,0xa7,0x8e,0x95,0x97,0x98,0x9e,0x8b,0x8d,0x8d,0xad,0x88, 0x8a,0x8a,0xb5,0x89,0x8a,0x8a,0xb8,0x8b,0x8c,0x8d,0xb8,0x94,0x95,0x95,0xb0, 0x49,0x49,0x49,0x68,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x0e,0x00,0x00,0x00, 0x06,0xb1,0xb2,0xb2,0x5b,0xef,0xf0,0xf0,0xff,0xf2,0xf3,0xf3,0xff,0xf5,0xf5, 0xf5,0xff,0xf7,0xf7,0xf7,0xff,0xf9,0xf9,0xf9,0xff,0xfa,0xfb,0xfb,0xff,0x98, 0x98,0x98,0xc5,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x0a, 0x82,0xfe,0xfe,0xfe,0x00,0x1b,0xfe,0xfe,0xfd,0x00,0xfd,0xfd,0xfd,0x00,0xfc, 0xfc,0xfc,0x00,0xfa,0xfb,0xfb,0x00,0xf9,0xf9,0xf9,0x00,0xf7,0xf8,0xf8,0x00, 0xf5,0xf6,0xf6,0x00,0xf3,0xf4,0xf4,0x00,0xf1,0xf2,0xf2,0x00,0xef,0xef,0xf0, 0x00,0xeb,0xec,0xed,0x00,0xe9,0xea,0xea,0x00,0xe6,0xe7,0xe7,0x00,0xe3,0xe4, 0xe5,0x00,0xdf,0xe1,0xe1,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x1f,0x00,0x00,0x00,0x43,0x4a,0x4b,0x4c,0x8d,0xc2,0xc5,0xc6,0xf8, 0xc6,0xca,0xcb,0xff,0xc3,0xc7,0xc8,0xff,0xc0,0xc4,0xc5,0xff,0xbd,0xc1,0xc3, 0xff,0xba,0xbe,0xc0,0xff,0xb8,0xbd,0xbe,0xff,0x86,0xb6,0xbb,0xbd,0xff,0x08, 0x9a,0x9e,0xa0,0xf1,0x11,0x12,0x12,0xb2,0x00,0x00,0x00,0x8e,0x00,0x00,0x00, 0x64,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x01,0x85,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x0c,0x00,0x00, 0x00,0x05,0xa5,0xa6,0xa6,0x5b,0xd8,0xda,0xda,0xff,0xd4,0xd6,0xd6,0xff,0xcf, 0xd2,0xd3,0xff,0xcb,0xce,0xcf,0xff,0xc7,0xca,0xcb,0xff,0xc3,0xc6,0xc7,0xff, 0x72,0x74,0x75,0xc8,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x2e,0x00,0x00,0x00, 0x0d,0x82,0x00,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x04,0xad,0xb2,0xb5,0xbe, 0xb1,0xb6,0xb8,0xff,0xb3,0xb8,0xb9,0xff,0xb4,0xb9,0xbb,0xff,0xb8,0xbc,0xbd, 0xff,0xbb,0xbe,0xc1,0xff,0xbe,0xc2,0xc4,0xff,0xc2,0xc6,0xc7,0xff,0xc7,0xc9, 0xcb,0xff,0xca,0xcd,0xce,0xff,0xcf,0xd1,0xd2,0xff,0xd3,0xd5,0xd6,0xff,0xd7, 0xd9,0xda,0xff,0xdb,0xdd,0xdd,0xff,0xdf,0xe0,0xe1,0xff,0x86,0x86,0x87,0x73, 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x07,0xb4,0xb4,0xb4, 0x5b,0xf2,0xf3,0xf3,0xff,0xf5,0xf5,0xf5,0xff,0xf7,0xf7,0xf7,0xff,0xf9,0xf9, 0xf9,0xff,0xfa,0xfa,0xfb,0xff,0xfc,0xfc,0xfc,0xff,0x99,0x99,0x99,0xc5,0x00, 0x00,0x00,0x5e,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x0a,0xfe,0xfe,0xfe,0x00, 0xfd,0xfd,0xfe,0x00,0xfd,0xfd,0xfd,0x00,0xfc,0xfc,0xfc,0x00,0xfa,0xfb,0xfb, 0x00,0xf9,0xf9,0xf9,0x00,0xf7,0xf8,0xf8,0x00,0xf5,0xf6,0xf6,0x00,0xf3,0xf4, 0xf4,0x00,0xf1,0xf2,0xf2,0x00,0xee,0xef,0xef,0x00,0xec,0xec,0xed,0x00,0xe9, 0xea,0xea,0x00,0xe6,0xe7,0xe8,0x00,0xe3,0xe4,0xe5,0x00,0xdf,0xe1,0xe1,0x00, 0xdc,0xde,0xdf,0x00,0xd8,0xda,0xdb,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x0b,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x46,0x47,0x48,0x48,0x8f,0xbb,0xbf, 0xc0,0xf8,0xc0,0xc4,0xc5,0xff,0xbd,0xc1,0xc2,0xff,0xba,0xbe,0xc0,0xff,0xb8, 0xbc,0xbe,0xff,0x86,0xb6,0xbb,0xbd,0xff,0x08,0x9a,0x9e,0xa0,0xf1,0x11,0x12, 0x12,0xb3,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x3c,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x86,0x00,0x00,0x00, 0x00,0x82,0xff,0xff,0xff,0x00,0x0c,0x00,0x00,0x00,0x06,0xa2,0xa3,0xa3,0x5b, 0xd3,0xd6,0xd6,0xff,0xcf,0xd2,0xd3,0xff,0xcb,0xcd,0xce,0xff,0xc7,0xca,0xcb, 0xff,0xc3,0xc6,0xc7,0xff,0xbf,0xc3,0xc4,0xff,0x70,0x73,0x74,0xc6,0x00,0x00, 0x00,0x5f,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x0a,0x82,0x00,0x00,0x00,0x00, 0x1f,0x00,0x00,0x00,0x08,0xab,0xb0,0xb2,0xc2,0xb2,0xb7,0xb9,0xff,0xb5,0xb9, 0xbb,0xff,0xb8,0xbc,0xbd,0xff,0xbb,0xbf,0xc1,0xff,0xbf,0xc2,0xc4,0xff,0xc2, 0xc6,0xc7,0xff,0xc6,0xc9,0xca,0xff,0xcb,0xcd,0xce,0xff,0xcf,0xd1,0xd2,0xff, 0xd3,0xd5,0xd6,0xff,0xd7,0xd9,0xda,0xff,0xdb,0xdd,0xdd,0xff,0xdf,0xe0,0xe1, 0xff,0xe2,0xe4,0xe4,0xff,0x7c,0x7d,0x7e,0x7e,0x00,0x00,0x00,0x2d,0x00,0x00, 0x00,0x12,0x00,0x00,0x00,0x08,0xb5,0xb6,0xb6,0x5b,0xf5,0xf5,0xf5,0xff,0xf7, 0xf7,0xf7,0xff,0xf9,0xf9,0xf9,0xff,0xfa,0xfb,0xfb,0xff,0xfc,0xfc,0xfc,0xff, 0xfd,0xfd,0xfd,0xff,0x99,0x99,0x99,0xc5,0x00,0x00,0x00,0x5e,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x0a,0x82,0xfd,0xfd,0xfd,0x00,0x19,0xfc,0xfc,0xfc,0x00, 0xfa,0xfb,0xfb,0x00,0xf9,0xf9,0xf9,0x00,0xf7,0xf8,0xf8,0x00,0xf5,0xf6,0xf6, 0x00,0xf3,0xf4,0xf4,0x00,0xf1,0xf2,0xf2,0x00,0xef,0xef,0xef,0x00,0xeb,0xec, 0xed,0x00,0xe9,0xe9,0xea,0x00,0xe5,0xe7,0xe7,0x00,0xe3,0xe4,0xe5,0x00,0xdf, 0xe1,0xe1,0x00,0xdc,0xdd,0xdf,0x00,0xd8,0xda,0xdb,0x00,0xd5,0xd7,0xd8,0x00, 0xd1,0xd4,0xd5,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0d,0x00,0x00,0x00, 0x25,0x25,0x26,0x26,0x59,0xab,0xae,0xaf,0xe5,0xbd,0xc1,0xc2,0xff,0xba,0xbe, 0xc0,0xff,0xb8,0xbd,0xbe,0xff,0x87,0xb6,0xbb,0xbd,0xff,0x07,0x7b,0x7f,0x80, 0xe1,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x41,0x00,0x00, 0x00,0x1c,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x87,0x00,0x00,0x00,0x00, 0x82,0xff,0xff,0xff,0x00,0x0c,0x00,0x00,0x00,0x06,0x9e,0xa0,0xa0,0x5b,0xcf, 0xd2,0xd3,0xff,0xcb,0xce,0xcf,0xff,0xc7,0xca,0xcb,0xff,0xc3,0xc6,0xc7,0xff, 0xc0,0xc2,0xc4,0xff,0xbb,0xc0,0xc1,0xff,0x6f,0x72,0x73,0xc5,0x00,0x00,0x00, 0x5e,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x0a,0x82,0x00,0x00,0x00,0x00,0x39, 0x00,0x00,0x00,0x0c,0xa8,0xae,0xaf,0xc6,0xb5,0xb9,0xbb,0xff,0xb8,0xbc,0xbe, 0xff,0xbb,0xbf,0xc1,0xff,0xbe,0xc2,0xc4,0xff,0xc2,0xc6,0xc7,0xff,0xc7,0xc9, 0xcb,0xff,0xca,0xcd,0xce,0xff,0xce,0xd1,0xd2,0xff,0xd3,0xd5,0xd6,0xff,0xd7, 0xd9,0xda,0xff,0xdb,0xdd,0xdd,0xff,0xdf,0xe0,0xe1,0xff,0xe3,0xe3,0xe4,0xff, 0xe6,0xe7,0xe7,0xff,0x6d,0x6d,0x6e,0x92,0x00,0x00,0x00,0x3e,0x00,0x00,0x00, 0x19,0x00,0x00,0x00,0x0a,0xb8,0xb8,0xb8,0x5b,0xf7,0xf7,0xf7,0xff,0xf9,0xf9, 0xf9,0xff,0xfb,0xfb,0xfb,0xff,0xfc,0xfc,0xfc,0xff,0xfd,0xfd,0xfd,0xff,0xfe, 0xfe,0xfe,0xff,0x99,0x99,0x99,0xc5,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x29, 0x00,0x00,0x00,0x0a,0xfd,0xfd,0xfd,0x00,0xfc,0xfc,0xfc,0x00,0xfb,0xfb,0xfb, 0x00,0xf9,0xf9,0xf9,0x00,0xf7,0xf8,0xf8,0x00,0xf5,0xf6,0xf6,0x00,0xf3,0xf4, 0xf4,0x00,0xf1,0xf2,0xf2,0x00,0xee,0xef,0xef,0x00,0xeb,0xec,0xed,0x00,0xe8, 0xea,0xea,0x00,0xe5,0xe7,0xe7,0x00,0xe2,0xe4,0xe5,0x00,0xdf,0xe1,0xe1,0x00, 0xdc,0xdd,0xdf,0x00,0xd8,0xda,0xdb,0x00,0xd5,0xd7,0xd8,0x00,0xd1,0xd4,0xd5, 0x00,0xcd,0xd0,0xd1,0x00,0xc9,0xcd,0xce,0x00,0x00,0x00,0x00,0x03,0x67,0x69, 0x6a,0x20,0xb7,0xbb,0xbc,0xd6,0xbd,0xc1,0xc3,0xff,0xb9,0xbe,0xc0,0xff,0xb8, 0xbd,0xbe,0xff,0x89,0xb6,0xbb,0xbd,0xff,0x05,0x86,0x8a,0x8b,0xcf,0x00,0x00, 0x00,0x55,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x01,0x88, 0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x0c,0x00,0x00,0x00,0x06,0x9b, 0x9d,0x9e,0x5b,0xcb,0xce,0xce,0xff,0xc7,0xca,0xcb,0xff,0xc2,0xc6,0xc7,0xff, 0xbf,0xc3,0xc4,0xff,0xbb,0xbf,0xc1,0xff,0xb8,0xbc,0xbe,0xff,0x6d,0x70,0x71, 0xc5,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x0a,0x82,0x00, 0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x0f,0xa9,0xad,0xaf,0xc8,0xb8,0xbc,0xbe, 0xff,0xbb,0xbf,0xc1,0xff,0xbf,0xc2,0xc4,0xff,0xc2,0xc6,0xc7,0xff,0xc6,0xc9, 0xca,0xff,0xcb,0xcd,0xce,0xff,0xcf,0xd1,0xd2,0xff,0xd3,0xd5,0xd6,0xff,0xd7, 0xd9,0xda,0xff,0xdb,0xdd,0xdd,0xff,0xdf,0xe0,0xe1,0xff,0xe3,0xe4,0xe5,0xff, 0xe6,0xe7,0xe8,0xff,0xe9,0xeb,0xeb,0xff,0x63,0x63,0x63,0xa3,0x00,0x00,0x00, 0x4c,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x0b,0xb9,0xba,0xba,0x5b,0xf9,0xf9, 0xf9,0xff,0xfb,0xfb,0xfb,0xff,0xfc,0xfc,0xfc,0xff,0xfd,0xfd,0xfd,0xff,0x82, 0xfe,0xfe,0xfe,0xff,0x1d,0x99,0x99,0x99,0xc5,0x00,0x00,0x00,0x5e,0x00,0x00, 0x00,0x29,0x00,0x00,0x00,0x0a,0xfc,0xfc,0xfc,0x00,0xfb,0xfb,0xfb,0x00,0xf9, 0xf9,0xf9,0x00,0xf7,0xf8,0xf8,0x00,0xf5,0xf6,0xf6,0x00,0xf3,0xf4,0xf4,0x00, 0xf1,0xf2,0xf2,0x00,0xee,0xef,0xef,0x00,0xeb,0xec,0xed,0x00,0xe8,0xea,0xea, 0x00,0xe5,0xe7,0xe7,0x00,0xe3,0xe4,0xe5,0x00,0xdf,0xe1,0xe1,0x00,0xdc,0xdd, 0xde,0x00,0xd8,0xda,0xdb,0x00,0xd5,0xd7,0xd8,0x00,0xd1,0xd4,0xd5,0x00,0xcd, 0xd0,0xd2,0x00,0xca,0xcd,0xce,0x00,0xc6,0xc9,0xcb,0x00,0xa5,0xa9,0xaa,0x14, 0xbd,0xc1,0xc2,0xcf,0xbc,0xc1,0xc2,0xff,0xba,0xbe,0xc0,0xff,0xb8,0xbc,0xbe, 0xff,0x8b,0xb6,0xbb,0xbd,0xff,0x04,0x96,0x9a,0x9c,0xba,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x01,0x88,0x00,0x00,0x00,0x00,0x82,0xff, 0xff,0xff,0x00,0x0c,0x00,0x00,0x00,0x06,0x98,0x9a,0x9a,0x5b,0xc7,0xc9,0xcb, 0xff,0xc3,0xc6,0xc7,0xff,0xbf,0xc2,0xc4,0xff,0xbb,0xbf,0xc1,0xff,0xb8,0xbc, 0xbe,0xff,0xb6,0xb9,0xbb,0xff,0x80,0x84,0x85,0xd4,0x00,0x00,0x00,0x5e,0x00, 0x00,0x00,0x2a,0x00,0x00,0x00,0x0a,0x82,0x00,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x8d,0x00, 0x00,0x00,0xa5,0x83,0x00,0x00,0x00,0xaa,0x10,0x00,0x00,0x00,0xab,0x79,0x7a, 0x7a,0xd4,0xdb,0xdd,0xdd,0xff,0xdf,0xe0,0xe1,0xff,0xe3,0xe4,0xe4,0xff,0xe7, 0xe7,0xe8,0xff,0xea,0xea,0xeb,0xff,0xed,0xed,0xee,0xff,0x60,0x60,0x60,0xaa, 0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x0b,0xbb,0xbb,0xbb, 0x5b,0xfb,0xfb,0xfb,0xff,0xfc,0xfc,0xfc,0xff,0xfd,0xfd,0xfd,0xff,0x83,0xfe, 0xfe,0xfe,0xff,0x1c,0x99,0x99,0x99,0xc5,0x00,0x00,0x00,0x5e,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x0a,0xfa,0xfb,0xfb,0x00,0xf9,0xf9,0xf9,0x00,0xf7,0xf8, 0xf8,0x00,0xf5,0xf6,0xf6,0x00,0xf3,0xf3,0xf4,0x00,0xf1,0xf1,0xf2,0x00,0xee, 0xef,0xef,0x00,0xeb,0xec,0xed,0x00,0xe8,0xe9,0xea,0x00,0xe5,0xe7,0xe8,0x00, 0xe2,0xe4,0xe5,0x00,0xdf,0xe1,0xe1,0x00,0xdc,0xdd,0xde,0x00,0xd8,0xda,0xdb, 0x00,0xd5,0xd7,0xd8,0x00,0xd1,0xd4,0xd4,0x00,0xcd,0xd0,0xd1,0x00,0xc9,0xcd, 0xce,0x00,0xc6,0xca,0xcb,0x00,0xae,0xb2,0xb3,0x13,0xbe,0xc2,0xc3,0xce,0xbd, 0xc1,0xc2,0xff,0xb9,0xbe,0xc0,0xff,0xb8,0xbc,0xbe,0xff,0x84,0xb6,0xbb,0xbd, 0xff,0x02,0x63,0x66,0x67,0xdb,0x8f,0x93,0x95,0xed,0x87,0xb6,0xbb,0xbd,0xff, 0x04,0x9d,0xa1,0xa3,0xb1,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x08,0x00,0x00, 0x00,0x01,0x87,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x0c,0x00,0x00, 0x00,0x06,0x95,0x97,0x98,0x5b,0xc2,0xc6,0xc7,0xff,0xbf,0xc2,0xc4,0xff,0xbb, 0xc0,0xc1,0xff,0xb8,0xbc,0xbe,0xff,0xb5,0xb9,0xbb,0xff,0xb3,0xb7,0xb9,0xff, 0xaa,0xaf,0xb1,0xf8,0x1c,0x1c,0x1d,0x6d,0x00,0x00,0x00,0x2d,0x00,0x00,0x00, 0x0c,0x82,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x23, 0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x7c,0x83,0x00,0x00, 0x00,0x7f,0x0f,0x00,0x00,0x00,0x83,0xa0,0xa1,0xa1,0xd2,0xdf,0xe0,0xe1,0xff, 0xe3,0xe4,0xe4,0xff,0xe7,0xe7,0xe8,0xff,0xe9,0xeb,0xeb,0xff,0xed,0xed,0xee, 0xff,0xf0,0xf1,0xf1,0xff,0x61,0x61,0x61,0xaa,0x00,0x00,0x00,0x51,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x0b,0xbc,0xbc,0xbc,0x5b,0xfc,0xfc,0xfc,0xff,0xfd, 0xfd,0xfd,0xff,0x84,0xfe,0xfe,0xfe,0xff,0x1b,0x99,0x99,0x99,0xc5,0x00,0x00, 0x00,0x5e,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x0a,0xf9,0xf9,0xf9,0x00,0xf7, 0xf8,0xf8,0x00,0xf5,0xf6,0xf6,0x00,0xf3,0xf4,0xf4,0x00,0xf1,0xf1,0xf2,0x00, 0xee,0xef,0xef,0x00,0xeb,0xec,0xed,0x00,0xe8,0xe9,0xea,0x00,0xe5,0xe7,0xe7, 0x00,0xe2,0xe3,0xe4,0x00,0xdf,0xe1,0xe1,0x00,0xdc,0xdd,0xde,0x00,0xd8,0xda, 0xdb,0x00,0xd5,0xd7,0xd8,0x00,0xd1,0xd4,0xd5,0x00,0xcd,0xd0,0xd1,0x00,0xca, 0xcd,0xce,0x00,0xc6,0xca,0xcb,0x00,0xad,0xb2,0xb3,0x13,0xbe,0xc2,0xc3,0xce, 0xbd,0xc1,0xc2,0xff,0xb9,0xbe,0xc0,0xff,0xb8,0xbc,0xbe,0xff,0x84,0xb6,0xbb, 0xbd,0xff,0x04,0x7b,0x7e,0x7f,0xe3,0x00,0x00,0x00,0xaf,0x12,0x12,0x13,0xad, 0x9c,0xa1,0xa2,0xee,0x87,0xb6,0xbb,0xbd,0xff,0x04,0x9e,0xa3,0xa5,0xb0,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x86,0x00,0x00,0x00, 0x00,0x82,0xff,0xff,0xff,0x00,0x13,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x1f, 0xbf,0xc2,0xc4,0xff,0xbb,0xbf,0xc1,0xff,0xb8,0xbc,0xbe,0xff,0xb5,0xb9,0xbb, 0xff,0xb3,0xb8,0xb9,0xff,0xb1,0xb6,0xb8,0xff,0xb0,0xb5,0xb7,0xff,0x98,0x9c, 0x9e,0xd9,0x5d,0x60,0x61,0x61,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x25, 0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x3d,0x82,0x00,0x00,0x00,0x40,0x0f,0x2f, 0x30,0x30,0x4e,0xa4,0xa6,0xa6,0x9f,0xdf,0xe0,0xe1,0xff,0xe3,0xe4,0xe5,0xff, 0xe7,0xe7,0xe8,0xff,0xe9,0xeb,0xeb,0xff,0xed,0xed,0xee,0xff,0xf0,0xf1,0xf1, 0xff,0xf3,0xf3,0xf3,0xff,0x62,0x62,0x62,0xaa,0x00,0x00,0x00,0x51,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x0b,0xbd,0xbd,0xbd,0x5b,0xfd,0xfd,0xfd,0xff,0x84, 0xfe,0xfe,0xfe,0xff,0x1b,0xfd,0xfe,0xfe,0xff,0xd0,0xd0,0xd0,0xe3,0xae,0xae, 0xae,0xac,0xcd,0xce,0xce,0x91,0xe5,0xe5,0xe5,0x81,0xed,0xee,0xee,0x7c,0xeb, 0xec,0xec,0x7c,0xe9,0xea,0xea,0x7c,0xe8,0xe8,0xe8,0x7c,0xe5,0xe6,0xe6,0x7c, 0xe2,0xe3,0xe4,0x7c,0xdf,0xe0,0xe1,0x7c,0xdc,0xde,0xde,0x7c,0xd9,0xdb,0xdc, 0x7c,0xd6,0xd8,0xd8,0x7c,0xd3,0xd4,0xd5,0x7c,0xca,0xcb,0xcc,0x49,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0xc9,0xcd,0xce,0x00,0xc6, 0xc9,0xca,0x00,0xad,0xb1,0xb3,0x13,0xbe,0xc2,0xc3,0xce,0xbc,0xc1,0xc2,0xff, 0xb9,0xbe,0xc0,0xff,0xb7,0xbc,0xbe,0xff,0x84,0xb6,0xbb,0xbd,0xff,0x06,0x7b, 0x7e,0x7f,0xe3,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x81, 0x16,0x17,0x17,0x8d,0x9e,0xa2,0xa4,0xeb,0x87,0xb6,0xbb,0xbd,0xff,0x04,0x9e, 0xa3,0xa5,0xb0,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01, 0x85,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x07,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x1c,0xb3,0xb7,0xb8,0xe7,0xb8,0xbc,0xbe,0xff,0xb5,0xb9,0xbb, 0xff,0xb3,0xb8,0xb9,0xff,0xb1,0xb6,0xb8,0xff,0x82,0xb0,0xb5,0xb7,0xff,0x1a, 0xb1,0xb6,0xb8,0xff,0xb3,0xb8,0xb9,0xff,0xb5,0xb9,0xbb,0xff,0xb8,0xbc,0xbe, 0xff,0xbb,0xbf,0xc1,0xff,0xbf,0xc2,0xc4,0xff,0xc3,0xc6,0xc7,0xff,0xc7,0xca, 0xcb,0xff,0xcb,0xcd,0xce,0xff,0xcf,0xd1,0xd2,0xff,0xd3,0xd6,0xd6,0xff,0xd7, 0xd9,0xda,0xff,0xdb,0xdd,0xdd,0xff,0xdf,0xe1,0xe1,0xff,0xe3,0xe4,0xe5,0xff, 0xe7,0xe8,0xe8,0xff,0xea,0xeb,0xeb,0xff,0xed,0xed,0xee,0xff,0xf0,0xf0,0xf1, 0xff,0xf3,0xf3,0xf3,0xff,0xf5,0xf5,0xf6,0xff,0x1d,0x1d,0x1d,0x92,0x00,0x00, 0x00,0x4f,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x0a,0xbe,0xbe,0xbe,0x5b,0x84, 0xfe,0xfe,0xfe,0xff,0x1b,0xfd,0xfd,0xfe,0xff,0xfd,0xfd,0xfd,0xff,0xfb,0xfc, 0xfc,0xff,0xfa,0xfa,0xfb,0xff,0xf9,0xf9,0xf9,0xff,0xf7,0xf7,0xf8,0xff,0xf5, 0xf6,0xf6,0xff,0xf3,0xf3,0xf4,0xff,0xf1,0xf1,0xf1,0xff,0xee,0xef,0xef,0xff, 0xeb,0xec,0xec,0xff,0xe8,0xe9,0xea,0xff,0xe5,0xe7,0xe7,0xff,0xe2,0xe4,0xe4, 0xff,0xdf,0xe1,0xe1,0xff,0xdc,0xdd,0xde,0xff,0xd8,0xda,0xdb,0xff,0xb9,0xbc, 0xbd,0x88,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x02,0xc6, 0xc9,0xcb,0x00,0xad,0xb1,0xb3,0x13,0xbe,0xc2,0xc3,0xce,0xbd,0xc1,0xc2,0xff, 0xb9,0xbe,0xc0,0xff,0xb7,0xbc,0xbe,0xff,0x84,0xb6,0xbb,0xbd,0xff,0x08,0x9a, 0x9e,0xa0,0xf1,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x68, 0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x54,0x2e,0x30,0x30,0x85,0xaf,0xb4,0xb6, 0xf8,0x87,0xb6,0xbb,0xbd,0xff,0x04,0x9e,0xa3,0xa5,0xb0,0x00,0x00,0x00,0x1a, 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x84,0x00,0x00,0x00,0x00,0x82,0xff, 0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x17,0x8e,0x91,0x93, 0x9a,0xb5,0xb9,0xbb,0xff,0xb2,0xb8,0xb9,0xff,0xb1,0xb6,0xb8,0xff,0xb1,0xb5, 0xb7,0xff,0xb0,0xb5,0xb7,0xff,0xb1,0xb6,0xb8,0xff,0xb3,0xb8,0xb9,0xff,0xb5, 0xb9,0xbb,0xff,0xb8,0xbc,0xbe,0xff,0xbb,0xc0,0xc1,0xff,0xbf,0xc2,0xc4,0xff, 0xc3,0xc6,0xc7,0xff,0xc7,0xca,0xcb,0xff,0xcb,0xcd,0xcf,0xff,0xcf,0xd1,0xd2, 0xff,0xd3,0xd6,0xd6,0xff,0xd7,0xd9,0xda,0xff,0xdb,0xdd,0xdd,0xff,0xdf,0xe1, 0xe1,0xff,0xe3,0xe4,0xe5,0xff,0xe7,0xe7,0xe8,0xff,0xea,0xeb,0xeb,0xff,0xed, 0xee,0xee,0xff,0xf0,0xf1,0xf1,0xff,0xf3,0xf3,0xf3,0xff,0xf5,0xf5,0xf6,0xff, 0xe0,0xe1,0xe1,0xf4,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x4c,0x00,0x00,0x00, 0x1d,0x00,0x00,0x00,0x0a,0xbe,0xbe,0xbe,0x5b,0x83,0xfe,0xfe,0xfe,0xff,0x1b, 0xfd,0xfe,0xfd,0xff,0xfd,0xfd,0xfd,0xff,0xfc,0xfc,0xfc,0xff,0xfa,0xfb,0xfb, 0xff,0xf9,0xf9,0xf9,0xff,0xf7,0xf7,0xf8,0xff,0xf5,0xf5,0xf6,0xff,0xf3,0xf3, 0xf4,0xff,0xf0,0xf1,0xf1,0xff,0xee,0xef,0xef,0xff,0xeb,0xec,0xec,0xff,0xe8, 0xe9,0xea,0xff,0xe5,0xe7,0xe7,0xff,0xe2,0xe3,0xe4,0xff,0xdf,0xe0,0xe1,0xff, 0xdb,0xdd,0xde,0xff,0xd8,0xda,0xdb,0xff,0xd5,0xd7,0xd7,0xff,0x9d,0xa0,0xa0, 0x9e,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x05,0xad,0xb1, 0xb3,0x13,0xbe,0xc1,0xc3,0xce,0xbd,0xc1,0xc2,0xff,0xb9,0xbe,0xc0,0xff,0xb7, 0xbc,0xbe,0xff,0x84,0xb6,0xbb,0xbd,0xff,0x0a,0x9a,0x9e,0xa0,0xf1,0x11,0x12, 0x12,0xb2,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x46,0x41,0x43,0x43,0x8f, 0xaf,0xb4,0xb6,0xf8,0x87,0xb6,0xbb,0xbd,0xff,0x04,0x9e,0xa3,0xa5,0xb0,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x83,0x00,0x00,0x00, 0x00,0x82,0xff,0xff,0xff,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10, 0x2e,0x2f,0x30,0x43,0xa1,0xa5,0xa7,0xe2,0xb1,0xb6,0xb8,0xff,0x82,0xb0,0xb5, 0xb7,0xff,0x1c,0xb1,0xb6,0xb8,0xff,0xb3,0xb8,0xb9,0xff,0xb6,0xb9,0xbb,0xff, 0xb8,0xbc,0xbe,0xff,0xbb,0xbf,0xc1,0xff,0xbf,0xc3,0xc4,0xff,0xc3,0xc6,0xc7, 0xff,0xc7,0xca,0xcb,0xff,0xcb,0xce,0xce,0xff,0xcf,0xd1,0xd2,0xff,0xd3,0xd6, 0xd6,0xff,0xd7,0xda,0xda,0xff,0xdb,0xdd,0xde,0xff,0xdf,0xe1,0xe1,0xff,0xe3, 0xe4,0xe5,0xff,0xe7,0xe7,0xe8,0xff,0xea,0xeb,0xeb,0xff,0xed,0xee,0xee,0xff, 0xf0,0xf1,0xf1,0xff,0xf3,0xf3,0xf3,0xff,0xf5,0xf5,0xf6,0xff,0xf7,0xf8,0xf8, 0xff,0x8e,0x8e,0x8e,0xd1,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x43,0x00,0x00, 0x00,0x18,0x00,0x00,0x00,0x08,0xbe,0xbe,0xbe,0x5b,0x82,0xfe,0xfe,0xfe,0xff, 0x82,0xfd,0xfd,0xfd,0xff,0x19,0xfc,0xfc,0xfc,0xff,0xfa,0xfb,0xfb,0xff,0xf9, 0xf9,0xf9,0xff,0xf7,0xf7,0xf8,0xff,0xf5,0xf5,0xf6,0xff,0xf3,0xf4,0xf4,0xff, 0xf1,0xf1,0xf1,0xff,0xee,0xef,0xef,0xff,0xeb,0xec,0xec,0xff,0xe8,0xe9,0xea, 0xff,0xe5,0xe7,0xe7,0xff,0xe2,0xe3,0xe4,0xff,0xdf,0xe1,0xe1,0xff,0xdb,0xdd, 0xde,0xff,0xd8,0xda,0xdb,0xff,0xd4,0xd7,0xd7,0xff,0xd0,0xd3,0xd4,0xff,0x88, 0x8a,0x8b,0xb4,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x20,0x7f,0x82,0x83,0x1a, 0xbe,0xc2,0xc3,0xce,0xbc,0xc1,0xc2,0xff,0xb9,0xbe,0xc0,0xff,0xb7,0xbc,0xbe, 0xff,0x84,0xb6,0xbb,0xbd,0xff,0x0c,0x9a,0x9e,0xa0,0xf1,0x11,0x12,0x12,0xb4, 0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x3f,0x00,0x00,0x00, 0x1c,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x4a,0x40,0x41,0x42,0x92,0xaf,0xb4,0xb6,0xf8,0x87,0xb6,0xbb,0xbd,0xff, 0x04,0x9e,0xa3,0xa5,0xb0,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x08,0x00,0x00, 0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x3f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x26,0x4a,0x4c,0x4d,0x79,0x9b, 0x9f,0xa1,0xe8,0xb1,0xb5,0xb7,0xff,0xb1,0xb6,0xb8,0xff,0xb3,0xb8,0xb9,0xff, 0xb6,0xba,0xbb,0xff,0xb8,0xbc,0xbe,0xff,0xbb,0xbf,0xc1,0xff,0xbf,0xc3,0xc4, 0xff,0xc4,0xc7,0xc8,0xff,0xc7,0xca,0xcb,0xff,0xcb,0xce,0xcf,0xff,0xcf,0xd1, 0xd3,0xff,0xd4,0xd6,0xd6,0xff,0xd8,0xd9,0xda,0xff,0xdb,0xdd,0xde,0xff,0xdf, 0xe1,0xe1,0xff,0xe3,0xe4,0xe5,0xff,0xe7,0xe8,0xe8,0xff,0xea,0xeb,0xeb,0xff, 0xed,0xee,0xee,0xff,0xf0,0xf0,0xf1,0xff,0xf2,0xf3,0xf3,0xff,0xf5,0xf6,0xf6, 0xff,0xf7,0xf7,0xf8,0xff,0xc5,0xc5,0xc5,0xec,0x00,0x00,0x00,0x9d,0x00,0x00, 0x00,0x6f,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x07,0xbe, 0xbe,0xbe,0x5b,0xfe,0xfe,0xfe,0xff,0xfd,0xfd,0xfe,0xff,0xfd,0xfd,0xfd,0xff, 0xfc,0xfc,0xfc,0xff,0xfa,0xfa,0xfa,0xff,0xf9,0xf9,0xf9,0xff,0xf7,0xf7,0xf8, 0xff,0xf5,0xf6,0xf6,0xff,0xf3,0xf3,0xf4,0xff,0xf1,0xf1,0xf1,0xff,0xee,0xef, 0xef,0xff,0xeb,0xec,0xec,0xff,0xe8,0xe9,0xea,0xff,0xe5,0xe7,0xe7,0xff,0xe2, 0xe3,0xe4,0xff,0xdf,0xe0,0xe1,0xff,0xdb,0xdd,0xde,0xff,0xd7,0xda,0xdb,0xff, 0xd4,0xd7,0xd7,0xff,0xd1,0xd3,0xd4,0xff,0xcd,0xd0,0xd1,0xff,0x7c,0x7e,0x7e, 0xc1,0x00,0x00,0x00,0x58,0x3c,0x3d,0x3e,0x37,0xbb,0xc0,0xc1,0xd0,0xbc,0xc1, 0xc2,0xff,0xb9,0xbe,0xc0,0xff,0xb7,0xbc,0xbe,0xff,0x84,0xb6,0xbb,0xbd,0xff, 0x0d,0xad,0xb1,0xb3,0xfb,0x30,0x31,0x32,0xc1,0x00,0x00,0x00,0x97,0x00,0x00, 0x00,0x70,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x27, 0x00,0x00,0x00,0x4f,0x6a,0x6d,0x6e,0xb0,0x88,0xb6,0xbb,0xbd,0xff,0x05,0x9e, 0xa3,0xa5,0xb0,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x6a, 0x5f,0x62,0x63,0xbe,0x86,0x8a,0x8b,0xe3,0xb6,0xb9,0xbc,0xff,0xb8,0xbd,0xbe, 0xff,0xbb,0xbf,0xc1,0xff,0xbf,0xc2,0xc4,0xff,0xc3,0xc6,0xc8,0xff,0xc7,0xca, 0xcb,0xff,0xcb,0xce,0xcf,0xff,0xcf,0xd2,0xd3,0xff,0xd4,0xd6,0xd6,0xff,0xd8, 0xda,0xda,0xff,0xdc,0xdd,0xde,0xff,0xdf,0xe1,0xe1,0xff,0xe3,0xe4,0xe5,0xff, 0xe7,0xe8,0xe8,0xff,0xea,0xeb,0xeb,0xff,0xed,0xed,0xee,0xff,0xf0,0xf1,0xf1, 0xff,0xf3,0xf3,0xf3,0xff,0xf5,0xf5,0xf6,0xff,0xb5,0xb5,0xb5,0xe9,0x78,0x78, 0x78,0xd3,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x55,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x06,0xbe,0xbe,0xbe,0x5b, 0x82,0xfd,0xfd,0xfd,0xff,0x19,0xfc,0xfc,0xfc,0xff,0xfa,0xfa,0xfb,0xff,0xf9, 0xf9,0xf9,0xff,0xf7,0xf7,0xf8,0xff,0xf5,0xf6,0xf6,0xff,0xf3,0xf3,0xf3,0xff, 0xf0,0xf1,0xf1,0xff,0xee,0xef,0xef,0xff,0xeb,0xec,0xec,0xff,0xe8,0xe9,0xea, 0xff,0xe5,0xe7,0xe7,0xff,0xe2,0xe3,0xe4,0xff,0xdf,0xe0,0xe1,0xff,0xdb,0xdd, 0xde,0xff,0xd8,0xda,0xdb,0xff,0xd4,0xd7,0xd7,0xff,0xd0,0xd3,0xd4,0xff,0xcd, 0xd0,0xd1,0xff,0xc9,0xcc,0xce,0xff,0x77,0x79,0x79,0xc6,0x1f,0x20,0x20,0x6b, 0xb6,0xbb,0xbc,0xd6,0xbc,0xc1,0xc2,0xff,0xb9,0xbe,0xc0,0xff,0xb7,0xbd,0xbe, 0xff,0x84,0xb6,0xbb,0xbd,0xff,0x08,0xae,0xb1,0xb3,0xfb,0x30,0x31,0x32,0xc1, 0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x46,0x00,0x00,0x00, 0x22,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x02,0x82,0xb6,0xbb,0xbd,0x00,0x05, 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x2a,0x00,0x00,0x00, 0x52,0x68,0x6b,0x6c,0xb2,0x88,0xb6,0xbb,0xbd,0xff,0x04,0x9e,0xa3,0xa5,0xb0, 0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x82,0xff,0xff, 0xff,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0a, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x68,0x00,0x00,0x00, 0x87,0x00,0x00,0x00,0x9a,0x12,0x13,0x13,0xab,0x43,0x44,0x45,0xc1,0x44,0x45, 0x45,0xc4,0x45,0x46,0x46,0xc4,0x46,0x47,0x47,0xc4,0x48,0x48,0x49,0xc4,0x49, 0x4a,0x4a,0xc4,0x4a,0x4b,0x4b,0xc4,0x4c,0x4c,0x4d,0xc4,0x4d,0x4e,0x4e,0xc4, 0x4e,0x4f,0x4f,0xc4,0x50,0x50,0x50,0xc4,0x51,0x51,0x51,0xc4,0x52,0x52,0x52, 0xc4,0x53,0x53,0x53,0xc4,0x54,0x54,0x54,0xc4,0x00,0x00,0x00,0xae,0x00,0x00, 0x00,0xaa,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x82,0x00, 0x00,0x00,0x5e,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x48,0x00,0x00,0x00, 0x7c,0x00,0x00,0x00,0x9c,0x91,0x00,0x00,0x00,0xaa,0x09,0x00,0x00,0x00,0xa0, 0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x39,0x00,0x00,0x00, 0x3b,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x9a,0x00,0x00, 0x00,0xa6,0x82,0x00,0x00,0x00,0xa9,0x08,0x00,0x00,0x00,0xa5,0x00,0x00,0x00, 0x95,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x02,0xb7,0xbb,0xbd,0x00,0x82,0xb6,0xbb,0xbd,0x00, 0x11,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x11,0x00,0x00, 0x00,0x2e,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x9b,0x00, 0x00,0x00,0xa7,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0xa3, 0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x4f,0x00,0x00,0x00, 0x29,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x03,0x82,0xff,0xff,0xff,0x00,0x82, 0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x1f,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x68,0x00, 0x00,0x00,0x79,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x8a, 0x8b,0x00,0x00,0x00,0x8b,0x0f,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x87,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x50, 0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x08,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x36,0x00,0x00, 0x00,0x5c,0x00,0x00,0x00,0x75,0x91,0x00,0x00,0x00,0x7f,0x08,0x00,0x00,0x00, 0x78,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x34,0x00,0x00, 0x00,0x3d,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x7c,0x83, 0x00,0x00,0x00,0x7f,0x06,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x67,0x00,0x00, 0x00,0x48,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x03,0x85, 0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x13,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x6d,0x00, 0x00,0x00,0x7b,0x83,0x00,0x00,0x00,0x7f,0x06,0x00,0x00,0x00,0x79,0x00,0x00, 0x00,0x6a,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x13,0x00, 0x00,0x00,0x04,0x82,0xff,0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x14, 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x3d,0x00,0x00,0x00, 0x45,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x4f,0x8b,0x00,0x00,0x00,0x51,0x0f, 0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x43,0x00,0x00,0x00, 0x3c,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x13,0x00,0x00, 0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x3a, 0x91,0x00,0x00,0x00,0x40,0x08,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x31,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x31, 0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x3f,0x83,0x00,0x00,0x00,0x40,0x06,0x00, 0x00,0x00,0x3b,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x0e, 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x86,0x00,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x3d,0x83,0x00,0x00,0x00,0x40,0x06,0x00, 0x00,0x00,0x3f,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x1c, 0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x03,0x82,0xff,0xff,0xff,0x00,0x84,0x00, 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x08,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x19,0x00,0x00, 0x00,0x1d,0x00,0x00,0x00,0x1f,0x8b,0x00,0x00,0x00,0x20,0x08,0x00,0x00,0x00, 0x1f,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x13,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x82, 0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x09,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x13,0x91,0x00,0x00,0x00,0x15, 0x06,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0d,0x00,0x00, 0x00,0x0b,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x12,0x85,0x00,0x00,0x00,0x15, 0x05,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x08,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x01,0x88,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x13,0x84,0x00,0x00,0x00,0x15,0x05,0x00,0x00,0x00,0x14,0x00,0x00,0x00, 0x11,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x82,0xff, 0xff,0xff,0x00,0x88,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x8b,0x00,0x00,0x00,0x06, 0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x01,0xc2,0x00,0x00,0x00,0x00,0x82,0xff,0xff,0xff,0x00,0xdd,0x00,0x00, 0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff, 0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff, 0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff, 0xff,0x00,0xdc,0xff,0xff,0xff,0x00 }; static const GdkPixdata glx_pixdata = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 8467, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 380, /* rowstride */ 95, /* width */ 60, /* height */ glx_pixdata_pixel_data /* pixel_data */ }; nvidia-settings/src/image_data/led_green.png0000664000175000017500000000710312236467170021337 0ustar albertoalbertoPNG  IHDRh pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3gAMA|Q cHRMz%u0`:o_F`IDATxb?CNbT/"z f ktik3Y=ʰ 9/B?e```b?ÿ n\|& ooq vuf`f{pӕX0sp1~n>s/Xw/-o}ipmˑ ^i DT⥳.orɊn>o=f܃- _>1vA)G?|ө3Zw]Ġ ͠l am kke````apGLm e+!v?h٩ TwgVߵsGNuFJ=*%?a{ݣ`(o%& s)Hj4/ ހcJP( .tOlXMFCŁ;:-u%<9w>IɭfwUOL]rR4KNvtgQP \A=lATYHٗ$}; 2 UGH݁V ?i=VdFCm ۶z~{FJݾ4?K%I49u(V)$QjjH@hק~U fv->Us1ai̠S @XhҖZ"aR# [x5O9/.H.No"6R_vv5jl .>`V 0Ve3y dIENDB`nvidia-settings/src/image_data/solaris.png0000664000175000017500000003767012236467170021103 0ustar albertoalbertoPNG  IHDRnz0 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_F4IDATxڬkQy)mR@Ғʇ:?ppq!ZRgpA&Ci[[OZhsy srr߹1`_>߀.c,'1KBQ}4AgQdP }EcTȡ-hjh jh "h)4A"= BD m .]*vOKo: XfʱxC} 9W5D8dS}[m]EfC9eh 5f=`xZB>+\E)"ZznOkJmu^࣭R\` .ò9$08ZTJL&3h+TD#J$@B83Ms!odrݶC %{Wȅ|ȝh.DU~"Тo̗OHa ]1g2KXѫ![Bѱn{$^.]2Lq?vp \jǃlYD<yf?/>Ϸ/f]gycLb׮FCֻ2ƴ_:L)}?_@Gh2׫zhΞזm4ۀyfnpà f` ̱O #_k6Ѧk n<y&pJ',Ƅql,avà ݕsiX 67 Z) s =$i``:p:T}dV8-i 8T{\:$ՀXOY:&''JҴFf'=KZN1ǝ *C.m靘4_,GmnH41挤7֍1ZV- ŅIz"U V.oH*  i8o8gxx*80 lR1>[3 nl?wlN"^[I#vnx{$f^۪盤kvڴQCɭCeZf)!>LZ*}scAADbdnd7Mn5͏6&†@.={|>wg;Qi'"R𠀑<(o[Ц,L|55|Q}&o0!(5G7 2ծSZMN]8'-G96"5nh-mrP8} n];f>Ev ME-|?FX ˇTkݩm,OD kQ\W;Ǭbc aiZ 2Ղx$-N\F@%QDI*(B`!+ `%/ƱqDR`Vvlgaz.^{׻޽30ق*%!t5̝3wν<5t~iL+dZ!;4r':Y;i%[dȵ!{^ga-/!Nf+jla(:)&?N͔`#)R|؀,CQ-?i(ǖ445n(<6}R~W0N+`!nSH3߹ʯACQߟxl(jOW$nYx@潶kH={B{}f56;!}k_o ~Ae^ga?Er Y2"-u^Y׾wI0"}uts E:LΜHum}[xl #X} !Kf0QD4_MH-\x Sd7W8WS֯>fDbXֵrF t= ï oH: ׿(kwnuHֵ-עO8mI.|? uɺOUa(j EwPj;Cd]˒umk?KzY%\h^4Ǒm -6Ⱥke]&ĎbzQdσWumkɺVuwgPDrKb<\LRVlHsVf?~TKd7 c;V46|nЯm'&&Zջn3p'%G"dzD"B`0Y.]ZFF"L5E/&HD"gΜ) B-Hu-QCUoPOD?"ʔGNy$vÙ=NDhfڲey!( Yq===>ә(ݿ$I1^AD@QA̘#55u$I+ #X,|/$id˵R1(=BD߳Ϯ[.p8vS5ًGCc<_cccoݰD4M{@;6dMh|h4Ͳ[z_ft]KKx<P(Wۍ7VNDpa"}N0kKD%D}~lTUUm'J"*^c>m۪kjj꺺칹-*"miiyʉl`133}DTFDe|cVW[QQJD+A> ED`ss,;J"Zvg&{w#O<Ν;g֚kjjO>Ggڌ?>lhh8wކÇĔΓбgϞb,_]|sM.̴y\`C;vv׮]/''n$& `HZ5ѺD)T0jOL_*L[b /)Tx=& ii&tC!1m߆=ܮr|5UI7p0!PaX!G^r[(S$maTlF(S-TCϻB#]m\o Ռ3_N蕓2H$pmLH+iU]W0J_99Sd6m_)t}vt1$\KZ ?FCZY+V_&HN91דJW$ae7V2Zg VLT;sss1x, 9r$ꑭ#D ~4@&UEo }ݺub28p8 ;Σv(ᵵ c |jۏZ,0Zܹs!z]QdjǃBM(6Vctt6mZcl({W{դ>8;:Ǖg۶mOLEQBYj6]VV|rr>z(DS:s}V2x蟗~b2<X,org281b = suEEtI@EEQl---}?)5Dcs#P^cl* g2攕?pg4SQSSӿ\-o5|pb.02-X1cvB8?SNUUIv\233w\SvvaÆ8cn'/-)++k7nZ~KcxҤI{Vu n[M#d2mf" Je^mܵ*$ I 6;v5Q( wЭM%kŋoq C)y#O<9:o$PLKKJJ{8d];vK@x<Ƙbww2i(ͱx'N|tZp(EEEĠ;XUWWwʧcbή 2RJQQQk׮xjY E7nXvDDij_érs @>uTF+hѢR!  ;͟)))/_~H˖-{ReeebzFFF|]4I]F^hF%B`h9LNx8_G*֠2vH\\(//\^cLv7Xmڼys5^9M@#*x7Εy<,;rl6G&LX¥eSLܾ0ɲm஻z\l82N>  Znmmonwc^^ޑk(f}ֶmR0=-k Ju7clxddZ6N164vׯ_9OGf}ڵ>{N@HHH J ooo:KRyլ/-"\}n$jcccWƮVHWҋs0V鼴酅nݺ16O>ꛉŭI7_ƍCSCJг0|7o19@< n9_sziӦMKv5"UTn7~~7:#HYŴhٰaá/5x R_pBZ <~M$WG4 C#H^xR92YGV nef < kڇsR۩ z6![^B~!>w-μ9s9O~5'?8~O~p?'? OO>RMBҘbH!$ ?n/Q7PRSM pQ0e)'6okvM"x4 :!Y\0YDDϑ`B!u+q|ꭒ @>ak@.~Y3<0?6@4VB0ZY9Yg@2늰##"bN ;zJVW}蓴͈T&xV&DC7C1. u9j“RyȘ(@RhcW]=nAn#4PLAQ5U0Bsl6+I2 D(t7 #SE0L}#sBij  j|Z\a >y ޞW>6wуn~jFw)Ct[]s ,6YFDjrEŅQc)"XG3Le ɟ,8T0K{=A@$:?j욨_V:{Oz<h- {"mKckkiU %rwf:0n Fc&C+K(|,g x1bOƮolg\:kK[:ڷѾuOOP2\; GmLH.l+H S@[wK4WI7K*80sQW; E}#-nщ K$ Ok_XOubl;a|1USkZD̼[S/k\6G׸}ev_er@ᵇZv-Z9d7\΋ ay7䊶P1T Shy| }DO9s fv!ͱ|K/,TX$汑 AΎmP=ڼ1vfcgԃ'_M;Z<724uw7O 7bD\xOSqNN񵢹Uͭ 9܌i|xp{w^ݚ]Tm*y z$obzܱ*;O nMrRS_ܾmh{}aksynx3࣌l,eXV&봢gTcr__3ESzEl _+Yep/:9I;ͺ8`I͵I,q.)Nl74!ahi^r6^ZX U5*YzYI"qRIp4'$I,K'BNj]'Q+3gj Hj^Yr)h h>f 4nm-KI{:mUϚ2Hm3Һ\=&+OvIZ̖/-ms{OKd(jJcTJc6>ByCDLr$Wt䊎v]0I/;z뾴\ofuvfuG@˞+FULaVr6Nohŷ8%?k/'_蛿kP>ծ]A8@:292t:&:2O-OjTr-hmzNV.wi^Tin9pp1;ȗ~]ӠP \΋kL3#b8Pm '۵%{:7ܵKV.rn-'\2=up\ 4ff%:OV&T1Ŭ:q\֋/.))ӧ?>w\`(HJJ:N^< cH$Z9SNhx0B:X駟2$_O'U8 p cN?Bv`(+++ٳ?sGW^=+- Dr̛7/NBq KD T#Gj/14{f 8]Bv꭭UΜ9Qmmv]ҥo?J{B!/́e2٫ٳgP(|*##c_VV3f|wԩ Bh"ǐ"`q^$-biZBB񌌌fee{vI$~ ޽{> t8a^E _JDM y(:::?==}Ǵiޟ>}{)))ψBy\|ы/[n! ^^^I!ZO2>dl.K`^4mhlF-+*1cOM!!!N>}/1l:ܬ"# &\Mj's+)0 TnRr/LZɓ'omnn>G^^ZF톀'v`@`1V /h:Fy'#@2kB«WjM:jHwbcO= 6AF۷oB w#XO-2~ҥK㝝1K*!N?38im}ܶG}4 k>#= if)++:`0<~ظRRD#,Fְ}d[ɲRGDe>0|g?Sz~1rmll|~֭R"0bscpS!2***#wy0Oh^&s%:vL_wUFU88@,[씯&L΋(5p]t/_t:/#cܙv(11qddbcc'''?3 8Kkh+#YaZ+u߷sgVk;&>/KaX,"@R?~7Bh:BhK/Yժ|Rt5ƸyO-Z4`p|$ש56lPuݖ~ZxkO +!pͻÔH$Ae-)..>I?@w-';7 mڴR ,Pnaa᛾:a„6n8n[r½gƌ}wϜ937 BVZUŵrrrVDU<ȷ}Yﻉn6%7nj{+B9Ǐ_ƖVw: 85yNM3gnkW^}`ǎ/-Q 8zNxd .tjժȻ5nܷuȻ</k(mK0-I;I[Y5UUUƍ[+ Fq={6Zl`oZn+܇hZ+igsrr644 b***PVo5kVx#׮]޾cΝմ󫪪bOM!J2 ,..62럝8 `޽R&r|ƍW\.+jsFq;ƸcuQQQ+***Juje̘1o0Ɨ j=F^xСCkr .|1.#|5be5a&L)'d2Og[/V̛7-X Bh&7!C~KfΜ窪*Zh,QvYnݙY} Ϲ쨨U'OcY/}ݷC,v섄 6l(ҥKIRtȑ#8qfb0KQ󢢢.[y?l<.sѢEx8::'N|y 1plܸ.++룸߅<Be#fS ¼c>_PPpLMޱyvoy0Di%zcX2A:&FWP !4^":`bx327Yl[굥 %5$ӇKIa12^\#,CWnj13}j=2\O&lgܮ6'?߂j'%̴Dz mG=:O39]ZhL୚872iof@+bo%'|6Y4J ! Sȍ1jN} {B˗^޾m]>㫭i;wo}X9ay&?'?8~O?12]`IENDB`nvidia-settings/src/image_data/sdi.png0000664000175000017500000003052412236467170020175 0ustar albertoalbertoPNG  IHDR<>gAMA7tEXtSoftwareAdobe ImageReadyqe<0IDATxڼOA R$PJ[T J*:CAgb,54jb'ʑKsÂ;n]{efwfcK$ ) E."ĿC+ EHީVөX%]Ng@'iRUF)B3OnM]CR vXy})!)$dCC#pJz)85]| G@b OCK̋}is%}AʫXXFGi<VU(lr!y]בNgX|t$lȨi]L$BO!r,yƃXPNB"PE-ib L`g[J(t癟/DyLdwcCG pB$`̼_'Q*}zfrWqGG*nD"֗3kݛ.#++Yp#]D:;壢xCD6ƣ*Ӱ61=#xj= ࿠Oر&(CpUWik*-"E;`LͲBf0!>,>,F! (51PڍV;k>i!{{oνtA8 YNkxF>K{lc2ql~2{*K"D2 (!g(ێi &0߇[޺Ikxq5 NJĄ?3L*Ϲ A!5~H P(V9*bn`X̒zUet x̡<w'knbyfىBAҮJl;vlGnK,$5kt:',"T+܇.|K4x3RZKo06SЫWo}a~gkjj hD \tn;E/:Y6iNG {k.gضǏy3P`<F^^3P63H )K8N vBxBee%6U7(|$.6݇pQHL`[A$>T=݁ҲܠOMʁ@@G*_rNu4O{1K;LQ0\a{/J Gbǚy_v"M 6݆3gNcܤtiWdhDUU2JCoo6eޔ"l?x?Ih{{i_bs lcV,/E_X-, ofiӺnuj׫OPP,u_Qרjh-:~>Mk#R)͹< 0|XV9%u'a2) ~VzTZk7j0ڵSfuuunnvl0yWRdSE9Q9D?{yRFԚ ||hXI'DKދKkνsE5OATNjڋ=pr.me2e2r%M2JasfIlj,V8ߌygݖl-> ($J,7>>Hk#Drs`ٲ7!(lF˳gO9ύ qc:DD n.);-}蘀y't~DR!yd2MHRjiD6QlJ Qpp +ȡ8ʦOЍ/h5jbbeӑ KgIJ||d_IVY%> U>YH.YAYjØցN7cұdlpp0r JJ.d !mmmܦ*?WmnMIhII Uh^^>g!r:3RæMYeY~/<* f s*G`Cj!wM.$˒aU Ç"{j-|Q/WO-|y"HM&?“xbC) PJAN6 (0 iP̣ d~ IH$PTTٴsz=(J<GVsCV{gXt)tnn KMMA^ un0Ã& Amn1Σ;Um}m`0l3#TWao^fDT@4 }/͙iuBnaw\[022_r>?/z!Cw1B/}*6;CqrbxAABY$NrJCï@kDZA`l&C_uJjχB`0"q73?400t#$A(~A0M ia-ƠOzZ|*E/PKihD2Z4#N0kUɨj}TyX[Ӥ1LDJ D(""/y,˲ݞs{wݻ(Ng?ݽw;s~:%) $$?%`/1Tה{۳qϓ$TJ$ )ZWTDx3"bTFj jVQ~r5:v2Q:*QNZ2icFff7hN8Ѽ*;G1:sZ^99+ټ:s$sXo*Amg{l7KQ!a<#c̘!&4+o'e޽ <g3].l-R'yM3!a ܹ7^n\WU!r?5x}U^aKӑ6Ω2GxHJ=Z~6m vaia\1q!wO/O& 6VuejE38:&磣g8uTflˤf͚)S^Je6nIII4a"_εk֬aEP\\5FcŊ4z`ƒ irUR@QC؈08{<|Ih.kQG !&&&빓V(/~S (-GpXKcIu#OUGP n߹s'#7 oG8?_( @lnnIT@MC]]v-Ex8$pR"mTn*X nS0***Rr:ENΪjӦuvU{㖜)S"K͛aѢEW(4Bp^cW$nbiHMM_}^gΜkՐx՝wU\ȠH%0&d ?u޹s ,,n߾$'Cq6Q'.u:gG5NGy㫫}Bj!VT%o$H͟Q7m.qIL/R2TzliP*9voY5Q:HMM-J]# 6~z$:uA55mT7Q.R j 6@@D±o@hv!/" ^x&M%%$nraGp=Y*5@6תН<'DHI.(mF5=n|ۺu46>\aAn*9[ߤ Î̛gJPS,PMc&#O`9v-?k$A7zDHX} jȗbӧxD/X0Ana#枖JX%m+XX(V OOcրڬV3f&INH%$ի qq!J -&G7:B! ͛AA#`Μِn-m) H{8S2=yۏ3lm\R2^75Bkka><UEe7A`p1pAS'Xܠ]x\Um`thzՅpZ 4 %MZXzy0_vג'lu=ee.z hh>{/}jg |DDŽ[P-py-n'LEN<Λ7XG;""B---%vMr6ww=t R5s!^Giꄲ[YBiZO@d\uzO a}V Z!~:q&Y,PRYi&ۗnGː *su HICV,_M0{"X'N~G=* ,?pv%)pH%hgKVff6j^-3??Or_zz5:Ġ 6ApOvttT}_pG$5^8)9,ǡ"n75&eğآ\`tɹ^i㥹a=F~9!z8#fhU(E3iIJW\ޮ&WGҦC qtsj;]+]>H&/ GA k$8xNs8$swQdL¾}@1!y S *jq7Sex>*,gzD@" d,w~vwWKݺws|NT&D[EGh(3D[E!ڢ- mKvtt A_05 ʷNw[k_d8)={wV=p(Ao:yũ/a#cM&Koo0Z$1-8&=bBKxr3oCrM "=DC49/C$ft':*ּ*+U=qJEEEma%7[.PF,^$=!@Q@ =>xc, u;:|3۶9s:h nm'?'v @7Gf ~g0;3hnhUMY`Rzg%nF_)9M:ERV%lh l "PkFY!zCHJ>엂=RR|D2b~WLͤґɣWFN呣A-WG Vօ<*9*/^LV~FVmI'* 8[ҭX'#l8!?#ˣ|*HG,}:]#c}I0U5zQ4=n~$؊*bʕ+RW)a}"Y hld_AŷS7S9K5{_B (U,**BG.f9pfGvxb1ghqF4䕓 O\9!\u:iq3Cvr6 f馺:]:JatK#gC0YM:zt:CT| .V8&6\mRcRAk+$Yg|?GbϏDWTof'|_ڵ0aTpRa_;e JJ]3vJ1)e;pVdQ^e۽ Cs:&KvIfCsomTV]ko*y*|@Q }ͥ9sr( /<϶ʖ} h_yy%R"u,f`yU٘,LA{>瑉u.=)yf ]cDa5}$%5ȭ&=ydz^(>|:|P3u4 bVtR;-onku wP>Y}9^sPňYإfqQ⌮NWS.  8@rP^,_JIxĶxQaj^M(}8ر6h^hJTpE"T誖> > Y2L]O6WMQO T1a%ސc7Y*Gt4mt7Wyy9sOrwCsOB h߾2ݮzxzU7'O &Ps WxfT>: 0ѫl׵jx)i1b 3k#b#վHl@FRS6[P- ڦf7!7te:zGis&D$N~Ņ X[gw5Kҥ2:{\ڹw4QܘX꺙 gE/Pˌ~씚!36f}6v$Up?:jQ(*j>K&;)5>U^+K"s]N_u/R_CD_oYGWe7Q\b>Ħ*d%:f8I9X[_WGkQ 1N,xbu %}x8wP&@Mb%|߂H H uԾM ?ᆎQN^;xɥltW^~3jYgU}ЗqrPZf:i2Sx(I)-ɿ??̶nj9^Zb\D4LtMV=Hd)l_Fжw/!sP El^ z3:x1*tEw6=j@я v}agdW-Jo2f9VC dP\*3~0A?kִI;\jv-rŰ`^ 9J t')I>10#MvARɳ?X'8/?4biFXjj,*ab KXGE$Bw[[7 E6ÄWz-ھ-meh(3D[E!ڢ-T_fݸeIENDB`nvidia-settings/src/image_data/vcs_pixdata.h0000664000175000017500000040231212236467170021364 0ustar albertoalberto/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static guint8 vcs_pixdata_pixel_data[] = { 0x87,0xff,0xff,0xbe,0x00,0x8a,0x00,0x00,0x00,0x00,0x5a,0xff,0xff,0xbe,0x01, 0xff,0xff,0xbe,0x02,0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe, 0x09,0xff,0xff,0xbe,0x0e,0xff,0xff,0xbe,0x14,0xff,0xff,0xbe,0x1c,0xff,0xff, 0xbe,0x26,0xff,0xff,0xbe,0x32,0xff,0xff,0xbe,0x3f,0xff,0xff,0xbe,0x4d,0xff, 0xff,0xbe,0x5b,0xff,0xff,0xbe,0x69,0xf3,0xf6,0xb9,0x81,0xc4,0xcd,0xa5,0xb6, 0x8f,0xa1,0x8c,0xec,0x78,0x8d,0x81,0xfe,0x76,0x8b,0x7e,0xff,0x71,0x8a,0x7c, 0xff,0x6f,0x89,0x7b,0xff,0x6f,0x86,0x7a,0xff,0x70,0x84,0x7a,0xff,0x6b,0x7c, 0x6e,0xff,0x5e,0x6e,0x63,0xff,0x65,0x74,0x6b,0xff,0x6b,0x80,0x73,0xff,0x67, 0x82,0x73,0xff,0x69,0x7f,0x73,0xff,0x6d,0x7d,0x71,0xff,0x6d,0x7d,0x72,0xff, 0x5e,0x6e,0x6b,0xff,0x27,0x34,0x2d,0xff,0x18,0x1e,0x10,0xff,0x1c,0x25,0x15, 0xff,0x1f,0x2e,0x19,0xff,0x47,0x50,0x47,0xff,0x09,0x10,0x02,0xff,0x07,0x10, 0x00,0xff,0x08,0x10,0x00,0xff,0x07,0x11,0x00,0xff,0x09,0x11,0x00,0xff,0x0a, 0x13,0x00,0xff,0x0d,0x17,0x00,0xff,0x14,0x1c,0x03,0xff,0x14,0x1c,0x05,0xff, 0x16,0x1e,0x0a,0xff,0x1c,0x25,0x13,0xff,0x2a,0x32,0x25,0xff,0x33,0x3b,0x35, 0xff,0x33,0x3d,0x3c,0xff,0x34,0x40,0x3b,0xff,0x37,0x44,0x3d,0xff,0x3b,0x49, 0x42,0xff,0x2b,0x35,0x2b,0xff,0x25,0x2f,0x1c,0xff,0x27,0x31,0x1b,0xff,0x29, 0x31,0x21,0xff,0x26,0x30,0x1d,0xff,0x28,0x32,0x23,0xff,0x28,0x32,0x21,0xff, 0x28,0x34,0x21,0xff,0x28,0x34,0x23,0xff,0x28,0x34,0x21,0xff,0x26,0x30,0x23, 0xff,0x24,0x2e,0x1c,0xff,0x24,0x2d,0x1c,0xff,0x23,0x2d,0x1a,0xff,0x21,0x2a, 0x15,0xff,0x20,0x2a,0x15,0xff,0x1a,0x24,0x0f,0xff,0x15,0x21,0x08,0xff,0x0b, 0x19,0x00,0xff,0x17,0x23,0x06,0xff,0x24,0x2b,0x1c,0xff,0x39,0x43,0x37,0xff, 0x59,0x62,0x52,0xff,0x5b,0x62,0x58,0xff,0x5d,0x6e,0x5d,0xff,0x6c,0x87,0x6e, 0xff,0x8f,0xad,0x8b,0xff,0xae,0xbb,0x9b,0xac,0xff,0xff,0xbe,0x44,0xff,0xff, 0xbe,0x35,0xff,0xff,0xbe,0x27,0xff,0xff,0xbe,0x1c,0xff,0xff,0xbe,0x12,0xff, 0xff,0xbe,0x0b,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe,0x02,0x8d,0xff,0xff,0xbe, 0x00,0x89,0x00,0x00,0x00,0x00,0x3c,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe,0x02, 0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe,0x09,0xff,0xff,0xbe, 0x0e,0xff,0xff,0xbe,0x14,0xff,0xff,0xbe,0x1d,0xff,0xff,0xbe,0x27,0xff,0xff, 0xbe,0x33,0xff,0xff,0xbe,0x41,0xff,0xff,0xbe,0x50,0xff,0xff,0xbe,0x5f,0xff, 0xff,0xbe,0x6f,0xef,0xf2,0xb9,0x8a,0xc2,0xcf,0xa4,0xb9,0x8d,0xa2,0x8d,0xeb, 0x79,0x90,0x84,0xfe,0x77,0x8c,0x7f,0xff,0x73,0x8a,0x7c,0xff,0x70,0x89,0x7c, 0xff,0x70,0x88,0x7c,0xff,0x6e,0x86,0x7a,0xff,0x66,0x7a,0x6e,0xff,0x5e,0x6d, 0x62,0xff,0x67,0x77,0x6c,0xff,0x6d,0x80,0x74,0xff,0x6d,0x81,0x74,0xff,0x69, 0x81,0x76,0xff,0x69,0x80,0x73,0xff,0x6f,0x7c,0x72,0xff,0x6e,0x7e,0x72,0xff, 0x5e,0x70,0x6d,0xff,0x29,0x38,0x35,0xff,0x17,0x21,0x12,0xff,0x22,0x29,0x1a, 0xff,0x07,0x0a,0x00,0xff,0x43,0x52,0x40,0xff,0x2f,0x39,0x2f,0xff,0x05,0x0f, 0x00,0xff,0x07,0x12,0x00,0xff,0x07,0x13,0x00,0xff,0x09,0x12,0x00,0xff,0x08, 0x12,0x00,0xff,0x09,0x12,0x00,0xff,0x16,0x17,0x04,0xff,0x17,0x1c,0x0d,0xff, 0x18,0x1d,0x10,0xff,0x1c,0x22,0x13,0xff,0x1f,0x2a,0x1d,0xff,0x2e,0x37,0x2b, 0xff,0x35,0x3c,0x37,0xff,0x38,0x3e,0x3b,0xff,0x38,0x41,0x3c,0xff,0x3b,0x47, 0x40,0xff,0x31,0x3b,0x31,0xff,0x2a,0x34,0x26,0xff,0x2d,0x38,0x2a,0xff,0x2b, 0x35,0x27,0xff,0x2b,0x35,0x29,0xff,0x82,0x2b,0x37,0x2a,0xff,0x1d,0x2e,0x3b, 0x30,0xff,0x2e,0x3b,0x36,0xff,0x34,0x3e,0x2e,0xff,0x32,0x3d,0x30,0xff,0x30, 0x3b,0x2b,0xff,0x2d,0x3b,0x2b,0xff,0x2b,0x36,0x2a,0xff,0x28,0x34,0x2a,0xff, 0x26,0x34,0x28,0xff,0x26,0x2d,0x23,0xff,0x20,0x2a,0x1c,0xff,0x12,0x1e,0x06, 0xff,0x1c,0x23,0x0d,0xff,0x24,0x2d,0x23,0xff,0x39,0x43,0x37,0xff,0x56,0x61, 0x4e,0xff,0x5b,0x61,0x58,0xff,0x5d,0x6a,0x59,0xff,0x66,0x7f,0x66,0xff,0x83, 0x9c,0x83,0xff,0xba,0xcc,0xac,0xc5,0xff,0xff,0xbe,0x4c,0xff,0xff,0xbe,0x3b, 0xff,0xff,0xbe,0x2c,0xff,0xff,0xbe,0x1f,0xff,0xff,0xbe,0x14,0xff,0xff,0xbe, 0x0c,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe,0x02,0x8d,0xff,0xff,0xbe,0x00,0x88, 0x00,0x00,0x00,0x00,0x5c,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe,0x02,0xff,0xff, 0xbe,0x03,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe,0x09,0xff,0xff,0xbe,0x0e,0xff, 0xff,0xbe,0x14,0xff,0xff,0xbe,0x1d,0xff,0xff,0xbe,0x27,0xff,0xff,0xbe,0x34, 0xff,0xff,0xbe,0x42,0xff,0xff,0xbe,0x52,0xff,0xff,0xbe,0x62,0xff,0xff,0xbe, 0x73,0xf2,0xf4,0xbb,0x8e,0xc2,0xcf,0xa5,0xbb,0x91,0xa7,0x8d,0xeb,0x7c,0x93, 0x84,0xfe,0x78,0x8f,0x82,0xff,0x76,0x8b,0x7e,0xff,0x71,0x8a,0x7b,0xff,0x72, 0x8a,0x7c,0xff,0x6f,0x85,0x7a,0xff,0x61,0x76,0x6a,0xff,0x5d,0x70,0x64,0xff, 0x67,0x7c,0x70,0xff,0x6f,0x80,0x74,0xff,0x6b,0x81,0x74,0xff,0x6e,0x80,0x73, 0xff,0x6b,0x81,0x74,0xff,0x68,0x80,0x73,0xff,0x6a,0x7e,0x73,0xff,0x6d,0x80, 0x74,0xff,0x5d,0x6f,0x6c,0xff,0x2b,0x38,0x35,0xff,0x16,0x1d,0x10,0xff,0x22, 0x2b,0x1c,0xff,0x07,0x0a,0x00,0xff,0x16,0x23,0x0a,0xff,0x58,0x67,0x5c,0xff, 0x1b,0x21,0x15,0xff,0x07,0x10,0x00,0xff,0x07,0x12,0x00,0xff,0x08,0x11,0x00, 0xff,0x07,0x0f,0x00,0xff,0x07,0x11,0x00,0xff,0x0d,0x12,0x00,0xff,0x13,0x1a, 0x06,0xff,0x1d,0x23,0x13,0xff,0x1d,0x22,0x17,0xff,0x1e,0x25,0x18,0xff,0x2c, 0x33,0x26,0xff,0x33,0x3c,0x30,0xff,0x36,0x3d,0x36,0xff,0x37,0x3d,0x37,0xff, 0x3b,0x42,0x39,0xff,0x35,0x3f,0x31,0xff,0x30,0x3b,0x2b,0xff,0x31,0x3b,0x2d, 0xff,0x30,0x3c,0x2c,0xff,0x32,0x3c,0x2d,0xff,0x34,0x3e,0x30,0xff,0x30,0x40, 0x34,0xff,0x36,0x40,0x39,0xff,0x37,0x42,0x3e,0xff,0x34,0x40,0x36,0xff,0x36, 0x42,0x3d,0xff,0x39,0x42,0x39,0xff,0x34,0x40,0x36,0xff,0x34,0x42,0x34,0xff, 0x34,0x3e,0x34,0xff,0x34,0x3e,0x37,0xff,0x2e,0x3d,0x34,0xff,0x28,0x34,0x2e, 0xff,0x17,0x21,0x0d,0xff,0x20,0x24,0x0f,0xff,0x26,0x2e,0x23,0xff,0x39,0x42, 0x36,0xff,0x54,0x5f,0x4e,0xff,0x59,0x61,0x56,0xff,0x5f,0x68,0x59,0xff,0x61, 0x7a,0x5d,0xff,0x7d,0x98,0x7d,0xff,0xbb,0xcb,0xb2,0xd4,0xff,0xff,0xbe,0x53, 0xff,0xff,0xbe,0x40,0xff,0xff,0xbe,0x2f,0xff,0xff,0xbe,0x21,0xff,0xff,0xbe, 0x16,0xff,0xff,0xbe,0x0d,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe,0x03,0x8d,0xff, 0xff,0xbe,0x00,0x87,0x00,0x00,0x00,0x00,0x5d,0xff,0xff,0xbe,0x01,0xff,0xff, 0xbe,0x02,0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe,0x09,0xff, 0xff,0xbe,0x0e,0xff,0xff,0xbe,0x14,0xff,0xff,0xbe,0x1d,0xff,0xff,0xbe,0x27, 0xff,0xff,0xbe,0x34,0xff,0xff,0xbe,0x42,0xff,0xff,0xbe,0x53,0xff,0xff,0xbe, 0x64,0xff,0xff,0xbe,0x75,0xf8,0xfd,0xc0,0x8e,0xca,0xd6,0xad,0xbd,0x93,0xa8, 0x90,0xea,0x7e,0x94,0x84,0xfe,0x7a,0x92,0x84,0xff,0x77,0x8f,0x82,0xff,0x76, 0x8b,0x7d,0xff,0x71,0x8b,0x7c,0xff,0x6d,0x86,0x78,0xff,0x60,0x76,0x6b,0xff, 0x5f,0x6e,0x67,0xff,0x6a,0x7e,0x71,0xff,0x6e,0x83,0x78,0xff,0x6e,0x82,0x78, 0xff,0x6d,0x82,0x77,0xff,0x6a,0x83,0x77,0xff,0x69,0x82,0x73,0xff,0x67,0x80, 0x73,0xff,0x68,0x81,0x74,0xff,0x6c,0x80,0x74,0xff,0x5e,0x6e,0x6c,0xff,0x2d, 0x3b,0x38,0xff,0x17,0x1d,0x0f,0xff,0x23,0x2d,0x1d,0xff,0x08,0x0f,0x00,0xff, 0x07,0x10,0x00,0xff,0x2f,0x3c,0x24,0xff,0x52,0x5d,0x5b,0xff,0x1b,0x26,0x1d, 0xff,0x11,0x1a,0x08,0xff,0x0a,0x11,0x00,0xff,0x07,0x11,0x00,0xff,0x09,0x14, 0x00,0xff,0x09,0x12,0x00,0xff,0x0a,0x13,0x00,0xff,0x17,0x23,0x0c,0xff,0x1d, 0x26,0x17,0xff,0x1f,0x27,0x1e,0xff,0x2b,0x33,0x26,0xff,0x32,0x3c,0x31,0xff, 0x33,0x3b,0x33,0xff,0x35,0x3d,0x34,0xff,0x38,0x40,0x36,0xff,0x33,0x3d,0x30, 0xff,0x2f,0x3c,0x2d,0xff,0x32,0x3f,0x2f,0xff,0x37,0x3f,0x31,0xff,0x35,0x40, 0x30,0xff,0x34,0x43,0x34,0xff,0x37,0x42,0x3e,0xff,0x37,0x45,0x40,0xff,0x3b, 0x49,0x42,0xff,0x34,0x45,0x43,0xff,0x3e,0x49,0x43,0xff,0x3d,0x49,0x43,0xff, 0x3b,0x47,0x43,0xff,0x37,0x47,0x40,0xff,0x34,0x47,0x42,0xff,0x36,0x47,0x43, 0xff,0x34,0x47,0x42,0xff,0x2d,0x3e,0x39,0xff,0x17,0x26,0x14,0xff,0x17,0x26, 0x0f,0xff,0x26,0x30,0x23,0xff,0x37,0x43,0x34,0xff,0x50,0x5f,0x4d,0xff,0x58, 0x62,0x52,0xff,0x52,0x62,0x54,0xff,0x74,0x91,0x75,0xff,0xc4,0xcd,0xb9,0xe4, 0xdf,0xe8,0xb8,0x8d,0xff,0xff,0xbe,0x59,0xff,0xff,0xbe,0x44,0xff,0xff,0xbe, 0x32,0xff,0xff,0xbe,0x23,0xff,0xff,0xbe,0x17,0xff,0xff,0xbe,0x0e,0xff,0xff, 0xbe,0x07,0xff,0xff,0xbe,0x03,0x8d,0xff,0xff,0xbe,0x00,0x86,0x00,0x00,0x00, 0x00,0x5f,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe,0x02,0xff,0xff,0xbe,0x03,0xff, 0xff,0xbe,0x05,0xff,0xff,0xbe,0x09,0xff,0xff,0xbe,0x0e,0xff,0xff,0xbe,0x14, 0xff,0xff,0xbe,0x1d,0xff,0xff,0xbe,0x27,0xff,0xff,0xbe,0x34,0xff,0xff,0xbe, 0x43,0xff,0xff,0xbe,0x53,0xff,0xff,0xbe,0x64,0xff,0xff,0xbe,0x77,0xf4,0xfa, 0xbf,0x90,0xcd,0xda,0xb0,0xbe,0x97,0xaf,0x95,0xea,0x7e,0x97,0x86,0xfe,0x7b, 0x93,0x85,0xff,0x79,0x91,0x83,0xff,0x77,0x8e,0x81,0xff,0x74,0x8b,0x7d,0xff, 0x6b,0x83,0x76,0xff,0x5e,0x76,0x69,0xff,0x5f,0x74,0x6b,0xff,0x6c,0x7f,0x78, 0xff,0x6f,0x86,0x7a,0xff,0x71,0x82,0x79,0xff,0x6e,0x83,0x78,0xff,0x6d,0x84, 0x78,0xff,0x6d,0x82,0x76,0xff,0x69,0x81,0x74,0xff,0x67,0x80,0x74,0xff,0x69, 0x80,0x72,0xff,0x6e,0x7e,0x73,0xff,0x60,0x6f,0x6c,0xff,0x2e,0x3d,0x3b,0xff, 0x16,0x1c,0x10,0xff,0x21,0x2d,0x21,0xff,0x06,0x0e,0x00,0xff,0x07,0x11,0x00, 0xff,0x07,0x16,0x00,0xff,0x40,0x56,0x3a,0xff,0x55,0x67,0x69,0xff,0x36,0x40, 0x40,0xff,0x20,0x2e,0x27,0xff,0x0f,0x1b,0x0d,0xff,0x0c,0x14,0x02,0xff,0x0e, 0x19,0x01,0xff,0x10,0x1a,0x03,0xff,0x18,0x20,0x10,0xff,0x1f,0x26,0x1b,0xff, 0x1e,0x27,0x1d,0xff,0x26,0x30,0x25,0xff,0x33,0x3d,0x37,0xff,0x31,0x39,0x38, 0xff,0x35,0x3c,0x38,0xff,0x38,0x3d,0x3b,0xff,0x30,0x3d,0x31,0xff,0x2f,0x3e, 0x2f,0xff,0x34,0x42,0x31,0xff,0x33,0x41,0x31,0xff,0x32,0x45,0x35,0xff,0x34, 0x43,0x3d,0xff,0x39,0x47,0x40,0xff,0x37,0x47,0x45,0xff,0x36,0x4b,0x43,0xff, 0x37,0x4b,0x45,0xff,0x3e,0x4d,0x47,0xff,0x3d,0x4d,0x49,0xff,0x37,0x4d,0x47, 0xff,0x36,0x4d,0x47,0xff,0x39,0x4e,0x4b,0xff,0x39,0x4e,0x49,0xff,0x36,0x4b, 0x47,0xff,0x30,0x45,0x42,0xff,0x15,0x24,0x17,0xff,0x17,0x24,0x12,0xff,0x28, 0x32,0x24,0xff,0x34,0x45,0x36,0xff,0x4d,0x5f,0x4d,0xff,0x50,0x5b,0x4b,0xff, 0x63,0x77,0x64,0xff,0xc6,0xd1,0xb5,0xc9,0xff,0xff,0xbe,0x80,0xff,0xff,0xbe, 0x74,0xff,0xff,0xbe,0x5d,0xff,0xff,0xbe,0x47,0xff,0xff,0xbe,0x34,0xff,0xff, 0xbe,0x25,0xff,0xff,0xbe,0x18,0xff,0xff,0xbe,0x0e,0xff,0xff,0xbe,0x07,0xff, 0xff,0xbe,0x03,0xff,0xff,0xbe,0x01,0x8c,0xff,0xff,0xbe,0x00,0x85,0x00,0x00, 0x00,0x00,0x45,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe,0x02,0xff,0xff,0xbe,0x03, 0xff,0xff,0xbe,0x05,0xff,0xff,0xbe,0x09,0xff,0xff,0xbe,0x0e,0xff,0xff,0xbe, 0x14,0xff,0xff,0xbe,0x1d,0xff,0xff,0xbe,0x27,0xff,0xff,0xbe,0x34,0xff,0xff, 0xbe,0x43,0xff,0xff,0xbe,0x53,0xff,0xff,0xbe,0x65,0xff,0xff,0xbe,0x77,0xf5, 0xfa,0xbd,0x91,0xcc,0xda,0xaf,0xbf,0x9d,0xb2,0x95,0xea,0x80,0x99,0x87,0xfe, 0x7d,0x96,0x88,0xff,0x7b,0x92,0x85,0xff,0x79,0x90,0x83,0xff,0x74,0x8b,0x7f, 0xff,0x6b,0x81,0x74,0xff,0x5e,0x76,0x68,0xff,0x62,0x78,0x6b,0xff,0x6c,0x82, 0x78,0xff,0x6f,0x86,0x7a,0xff,0x70,0x89,0x7b,0xff,0x70,0x88,0x7c,0xff,0x6e, 0x86,0x7b,0xff,0x6d,0x84,0x7a,0xff,0x6e,0x82,0x78,0xff,0x6a,0x82,0x76,0xff, 0x68,0x82,0x73,0xff,0x68,0x82,0x74,0xff,0x69,0x84,0x76,0xff,0x5d,0x77,0x6f, 0xff,0x32,0x3f,0x3c,0xff,0x17,0x1c,0x0b,0xff,0x27,0x39,0x2a,0xff,0x12,0x1d, 0x0d,0xff,0x08,0x10,0x00,0xff,0x07,0x10,0x00,0xff,0x10,0x1e,0x03,0xff,0x4e, 0x67,0x4e,0xff,0x4d,0x61,0x5f,0xff,0x52,0x67,0x64,0xff,0x48,0x56,0x56,0xff, 0x29,0x34,0x32,0xff,0x19,0x22,0x16,0xff,0x16,0x1c,0x0d,0xff,0x14,0x1d,0x09, 0xff,0x1c,0x25,0x13,0xff,0x1f,0x2a,0x1e,0xff,0x25,0x2e,0x20,0xff,0x35,0x3d, 0x33,0xff,0x33,0x39,0x36,0xff,0x32,0x3a,0x37,0xff,0x36,0x3d,0x39,0xff,0x35, 0x3f,0x31,0xff,0x34,0x40,0x32,0xff,0x32,0x3f,0x31,0xff,0x35,0x46,0x35,0xff, 0x33,0x47,0x3c,0xff,0x37,0x47,0x45,0xff,0x37,0x49,0x43,0xff,0x37,0x47,0x45, 0xff,0x3d,0x4d,0x49,0xff,0x39,0x4d,0x47,0xff,0x82,0x3b,0x4e,0x4b,0xff,0x0d, 0x39,0x4e,0x49,0xff,0x3d,0x4e,0x4d,0xff,0x40,0x50,0x4e,0xff,0x3e,0x54,0x4d, 0xff,0x3b,0x4e,0x4b,0xff,0x32,0x43,0x40,0xff,0x1c,0x2a,0x17,0xff,0x1a,0x26, 0x12,0xff,0x2a,0x34,0x28,0xff,0x36,0x42,0x34,0xff,0x4e,0x59,0x4b,0xff,0x4b, 0x50,0x43,0xff,0xae,0xd4,0xa4,0xf7,0x82,0xff,0xff,0xbe,0x80,0x0a,0xff,0xff, 0xbe,0x78,0xff,0xff,0xbe,0x60,0xff,0xff,0xbe,0x4a,0xff,0xff,0xbe,0x36,0xff, 0xff,0xbe,0x26,0xff,0xff,0xbe,0x19,0xff,0xff,0xbe,0x0f,0xff,0xff,0xbe,0x07, 0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x01,0x8c,0xff,0xff,0xbe,0x00,0x84,0x00, 0x00,0x00,0x00,0x61,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe,0x02,0xff,0xff,0xbe, 0x03,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe,0x09,0xff,0xff,0xbe,0x0e,0xff,0xff, 0xbe,0x14,0xff,0xff,0xbe,0x1d,0xff,0xff,0xbe,0x27,0xff,0xff,0xbe,0x34,0xff, 0xff,0xbe,0x43,0xff,0xff,0xbe,0x53,0xff,0xff,0xbe,0x65,0xff,0xff,0xbe,0x77, 0xf7,0xfa,0xc0,0x91,0xcd,0xdc,0xb1,0xc0,0x9d,0xb4,0x97,0xea,0x82,0x9a,0x86, 0xfe,0x7e,0x98,0x85,0xff,0x7e,0x96,0x88,0xff,0x7b,0x91,0x85,0xff,0x74,0x8b, 0x7d,0xff,0x6b,0x7c,0x70,0xff,0x62,0x71,0x67,0xff,0x68,0x77,0x6c,0xff,0x6f, 0x80,0x77,0xff,0x71,0x84,0x7a,0xff,0x6f,0x8a,0x7c,0xff,0x70,0x89,0x7c,0xff, 0x70,0x88,0x7b,0xff,0x6f,0x85,0x7a,0xff,0x6e,0x85,0x7a,0xff,0x6e,0x82,0x78, 0xff,0x6a,0x82,0x76,0xff,0x68,0x82,0x74,0xff,0x68,0x80,0x74,0xff,0x69,0x83, 0x74,0xff,0x5f,0x77,0x70,0xff,0x33,0x42,0x3f,0xff,0x16,0x1d,0x08,0xff,0x23, 0x39,0x23,0xff,0x32,0x42,0x36,0xff,0x13,0x19,0x08,0xff,0x06,0x0e,0x00,0xff, 0x07,0x0e,0x00,0xff,0x13,0x1d,0x06,0xff,0x32,0x3f,0x2a,0xff,0x2f,0x3e,0x2f, 0xff,0x51,0x68,0x5c,0xff,0x64,0x86,0x82,0xff,0x57,0x6a,0x6b,0xff,0x34,0x3f, 0x3f,0xff,0x1c,0x23,0x18,0xff,0x13,0x1d,0x07,0xff,0x1b,0x24,0x11,0xff,0x21, 0x2b,0x1f,0xff,0x31,0x3a,0x2d,0xff,0x33,0x3b,0x2f,0xff,0x2f,0x3a,0x30,0xff, 0x34,0x3b,0x36,0xff,0x33,0x3d,0x31,0xff,0x2f,0x43,0x32,0xff,0x2f,0x45,0x36, 0xff,0x33,0x46,0x38,0xff,0x39,0x43,0x40,0xff,0x34,0x47,0x40,0xff,0x36,0x4b, 0x40,0xff,0x39,0x4d,0x40,0xff,0x40,0x4e,0x49,0xff,0x3b,0x4e,0x49,0xff,0x3b, 0x4d,0x45,0xff,0x39,0x4e,0x47,0xff,0x3d,0x54,0x4b,0xff,0x40,0x56,0x4e,0xff, 0x40,0x54,0x4e,0xff,0x3e,0x52,0x4d,0xff,0x3e,0x4e,0x4d,0xff,0x36,0x47,0x43, 0xff,0x1e,0x2a,0x17,0xff,0x1c,0x28,0x0d,0xff,0x2a,0x34,0x2d,0xff,0x37,0x40, 0x36,0xff,0x4e,0x59,0x4b,0xff,0x45,0x52,0x43,0xff,0xb1,0xd9,0xa6,0xfb,0xf8, 0xfc,0xc0,0x8a,0xff,0xff,0xbe,0x80,0xff,0xff,0xbe,0x7c,0xff,0xff,0xbe,0x63, 0xff,0xff,0xbe,0x4c,0xff,0xff,0xbe,0x38,0xff,0xff,0xbe,0x28,0xff,0xff,0xbe, 0x1a,0xff,0xff,0xbe,0x0f,0xff,0xff,0xbe,0x08,0xff,0xff,0xbe,0x03,0xff,0xff, 0xbe,0x01,0x8c,0xff,0xff,0xbe,0x00,0x83,0x00,0x00,0x00,0x00,0x4a,0xff,0xff, 0xbe,0x01,0xff,0xff,0xbe,0x02,0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x05,0xff, 0xff,0xbe,0x09,0xff,0xff,0xbe,0x0e,0xff,0xff,0xbe,0x14,0xff,0xff,0xbe,0x1d, 0xff,0xff,0xbe,0x27,0xff,0xff,0xbe,0x34,0xff,0xff,0xbe,0x43,0xff,0xff,0xbe, 0x53,0xff,0xff,0xbe,0x65,0xff,0xff,0xbe,0x77,0xf7,0xfa,0xc0,0x91,0xd1,0xdd, 0xb3,0xbf,0xa1,0xb7,0x9b,0xea,0x83,0x9d,0x89,0xfe,0x80,0x9a,0x88,0xff,0x7f, 0x98,0x85,0xff,0x7d,0x93,0x85,0xff,0x77,0x8b,0x7f,0xff,0x69,0x7b,0x6e,0xff, 0x63,0x73,0x68,0xff,0x6a,0x79,0x6e,0xff,0x6f,0x82,0x77,0xff,0x70,0x88,0x7b, 0xff,0x6f,0x89,0x7b,0xff,0x70,0x8a,0x7c,0xff,0x70,0x8a,0x7b,0xff,0x70,0x88, 0x7a,0xff,0x70,0x85,0x7a,0xff,0x6f,0x85,0x7a,0xff,0x6e,0x84,0x77,0xff,0x6b, 0x82,0x76,0xff,0x68,0x82,0x74,0xff,0x68,0x80,0x74,0xff,0x68,0x82,0x73,0xff, 0x60,0x79,0x70,0xff,0x33,0x46,0x41,0xff,0x15,0x1c,0x0b,0xff,0x21,0x2f,0x19, 0xff,0x2b,0x3c,0x26,0xff,0x36,0x3f,0x31,0xff,0x0b,0x10,0x00,0xff,0x0b,0x0e, 0x00,0xff,0x0a,0x0b,0x00,0xff,0x0f,0x12,0x00,0xff,0x19,0x20,0x09,0xff,0x1b, 0x23,0x15,0xff,0x32,0x40,0x2f,0xff,0x5f,0x77,0x66,0xff,0x78,0x97,0x95,0xff, 0x61,0x76,0x7e,0xff,0x34,0x41,0x3e,0xff,0x18,0x1e,0x0f,0xff,0x18,0x1f,0x0f, 0xff,0x2d,0x33,0x27,0xff,0x34,0x3d,0x2f,0xff,0x2f,0x38,0x2d,0xff,0x31,0x3b, 0x31,0xff,0x31,0x3c,0x2e,0xff,0x32,0x41,0x32,0xff,0x31,0x45,0x3b,0xff,0x35, 0x48,0x3c,0xff,0x35,0x4a,0x39,0xff,0x30,0x45,0x37,0xff,0x36,0x4b,0x3b,0xff, 0x36,0x4e,0x3b,0xff,0x3b,0x4d,0x49,0xff,0x39,0x4d,0x4b,0xff,0x37,0x4b,0x3e, 0xff,0x3d,0x50,0x40,0xff,0x3e,0x52,0x47,0xff,0x82,0x40,0x52,0x4e,0xff,0x16, 0x3e,0x52,0x4e,0xff,0x3d,0x50,0x4b,0xff,0x36,0x45,0x43,0xff,0x1c,0x28,0x15, 0xff,0x1c,0x28,0x0f,0xff,0x2b,0x34,0x2a,0xff,0x37,0x42,0x34,0xff,0x4d,0x58, 0x4b,0xff,0x4e,0x5d,0x4b,0xff,0x76,0x94,0x7f,0xff,0xc9,0xd6,0xc4,0xef,0xff, 0xff,0xbe,0x80,0xff,0xff,0xbe,0x7f,0xff,0xff,0xbe,0x66,0xff,0xff,0xbe,0x4f, 0xff,0xff,0xbe,0x3a,0xff,0xff,0xbe,0x29,0xff,0xff,0xbe,0x1b,0xff,0xff,0xbe, 0x10,0xff,0xff,0xbe,0x08,0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x01,0x8c,0xff, 0xff,0xbe,0x00,0x82,0x00,0x00,0x00,0x00,0x43,0xff,0xff,0xbe,0x01,0xff,0xff, 0xbe,0x02,0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe,0x09,0xff, 0xff,0xbe,0x0e,0xff,0xff,0xbe,0x14,0xff,0xff,0xbe,0x1d,0xff,0xff,0xbe,0x27, 0xff,0xff,0xbe,0x34,0xff,0xff,0xbe,0x43,0xff,0xff,0xbe,0x53,0xff,0xff,0xbe, 0x65,0xff,0xff,0xbe,0x77,0xf7,0xfa,0xc0,0x91,0xd2,0xdf,0xb5,0xc0,0xa3,0xba, 0x9c,0xea,0x88,0xa0,0x8b,0xfe,0x83,0x9d,0x8a,0xff,0x81,0x9a,0x89,0xff,0x7d, 0x96,0x86,0xff,0x74,0x8b,0x7d,0xff,0x69,0x7c,0x6f,0xff,0x66,0x74,0x69,0xff, 0x6d,0x7c,0x71,0xff,0x70,0x84,0x79,0xff,0x6f,0x88,0x7b,0xff,0x71,0x8a,0x7b, 0xff,0x70,0x8a,0x7b,0xff,0x71,0x8a,0x7b,0xff,0x70,0x8a,0x7b,0xff,0x6f,0x89, 0x7b,0xff,0x70,0x86,0x7b,0xff,0x6f,0x85,0x7a,0xff,0x6e,0x82,0x78,0xff,0x6b, 0x82,0x76,0xff,0x69,0x82,0x74,0xff,0x66,0x80,0x73,0xff,0x69,0x80,0x73,0xff, 0x62,0x79,0x72,0xff,0x37,0x47,0x43,0xff,0x13,0x1c,0x0b,0xff,0x27,0x30,0x21, 0xff,0x0b,0x13,0x05,0xff,0x45,0x5b,0x4a,0xff,0x17,0x25,0x0f,0xff,0x0c,0x10, 0x00,0xff,0x09,0x0e,0x00,0xff,0x09,0x0d,0x00,0xff,0x0c,0x12,0x00,0xff,0x12, 0x16,0x01,0xff,0x14,0x19,0x04,0xff,0x1c,0x20,0x0e,0xff,0x32,0x3c,0x2b,0xff, 0x5a,0x6e,0x5f,0xff,0x75,0x8c,0x8c,0xff,0x5c,0x6d,0x6f,0xff,0x26,0x36,0x2b, 0xff,0x20,0x2d,0x1f,0xff,0x31,0x3b,0x2f,0xff,0x2f,0x37,0x2a,0xff,0x31,0x3b, 0x2e,0xff,0x31,0x3a,0x2e,0xff,0x32,0x3e,0x32,0xff,0x32,0x4b,0x38,0xff,0x37, 0x4a,0x38,0xff,0x32,0x4a,0x37,0xff,0x82,0x34,0x4b,0x37,0xff,0x1e,0x34,0x4e, 0x3b,0xff,0x39,0x4d,0x45,0xff,0x3b,0x4e,0x49,0xff,0x39,0x4e,0x42,0xff,0x3d, 0x4e,0x49,0xff,0x40,0x50,0x4d,0xff,0x40,0x52,0x4e,0xff,0x43,0x54,0x4e,0xff, 0x3e,0x54,0x4e,0xff,0x3d,0x50,0x4b,0xff,0x36,0x45,0x42,0xff,0x1e,0x28,0x15, 0xff,0x19,0x24,0x0d,0xff,0x2a,0x34,0x2a,0xff,0x36,0x42,0x34,0xff,0x4d,0x54, 0x45,0xff,0x50,0x61,0x4e,0xff,0x89,0xa4,0x94,0xff,0xa4,0xc8,0xc1,0xff,0xd8, 0xe6,0xc9,0xd7,0xff,0xff,0xbe,0x80,0xff,0xff,0xbe,0x69,0xff,0xff,0xbe,0x51, 0xff,0xff,0xbe,0x3c,0xff,0xff,0xbe,0x2b,0xff,0xff,0xbe,0x1c,0xff,0xff,0xbe, 0x11,0xff,0xff,0xbe,0x09,0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x01,0x8c,0xff, 0xff,0xbe,0x00,0x1b,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe, 0x02,0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe,0x09,0xff,0xff, 0xbe,0x0d,0xff,0xff,0xbe,0x14,0xff,0xff,0xbe,0x1d,0xff,0xff,0xbe,0x27,0xff, 0xff,0xbe,0x34,0xff,0xff,0xbe,0x43,0xff,0xff,0xbe,0x53,0xff,0xff,0xbe,0x65, 0xff,0xff,0xbe,0x77,0xf7,0xfc,0xc3,0x91,0xd4,0xe2,0xb8,0xbf,0xa7,0xbc,0x9e, 0xea,0x8a,0xa3,0x8d,0xfe,0x86,0xa0,0x8c,0xff,0x83,0x9c,0x8b,0xff,0x7d,0x96, 0x86,0xff,0x73,0x8a,0x7d,0xff,0x68,0x7c,0x6e,0xff,0x67,0x79,0x6c,0xff,0x6d, 0x80,0x74,0xff,0x72,0x85,0x7a,0xff,0x82,0x72,0x89,0x7b,0xff,0x48,0x72,0x8b, 0x7c,0xff,0x72,0x8a,0x7c,0xff,0x72,0x8a,0x7b,0xff,0x71,0x8a,0x7b,0xff,0x70, 0x89,0x7b,0xff,0x70,0x85,0x7b,0xff,0x6f,0x85,0x7a,0xff,0x6d,0x83,0x78,0xff, 0x6c,0x82,0x76,0xff,0x69,0x81,0x74,0xff,0x67,0x81,0x72,0xff,0x68,0x81,0x74, 0xff,0x60,0x79,0x71,0xff,0x38,0x4a,0x4a,0xff,0x13,0x1c,0x0b,0xff,0x2a,0x32, 0x23,0xff,0x03,0x09,0x00,0xff,0x2c,0x3a,0x24,0xff,0x41,0x51,0x43,0xff,0x0b, 0x13,0x00,0xff,0x0b,0x14,0x00,0xff,0x08,0x11,0x00,0xff,0x09,0x10,0x00,0xff, 0x0c,0x14,0x00,0xff,0x07,0x0d,0x00,0xff,0x12,0x16,0x01,0xff,0x0e,0x15,0x01, 0xff,0x17,0x1d,0x05,0xff,0x2c,0x33,0x1b,0xff,0x45,0x55,0x3d,0xff,0x4f,0x5d, 0x4f,0xff,0x2e,0x3a,0x2e,0xff,0x2f,0x39,0x2e,0xff,0x2d,0x35,0x28,0xff,0x31, 0x39,0x2c,0xff,0x31,0x38,0x2c,0xff,0x32,0x40,0x32,0xff,0x32,0x4b,0x34,0xff, 0x31,0x48,0x33,0xff,0x33,0x49,0x37,0xff,0x32,0x4b,0x36,0xff,0x34,0x49,0x39, 0xff,0x36,0x4d,0x42,0xff,0x36,0x4e,0x3e,0xff,0x3d,0x52,0x4b,0xff,0x39,0x4e, 0x49,0xff,0x3e,0x4e,0x4d,0xff,0x40,0x50,0x4d,0xff,0x40,0x54,0x4d,0xff,0x3e, 0x54,0x4e,0xff,0x3e,0x58,0x4e,0xff,0x3d,0x4e,0x4b,0xff,0x36,0x4b,0x42,0xff, 0x17,0x2a,0x15,0xff,0x15,0x24,0x0d,0xff,0x2b,0x36,0x2a,0xff,0x37,0x40,0x34, 0xff,0x4d,0x52,0x45,0xff,0x54,0x64,0x50,0xff,0x9c,0xbf,0xad,0xff,0xab,0xc8, 0xc6,0xff,0xc7,0xf5,0xda,0xff,0xe7,0xf4,0xc6,0xae,0xff,0xff,0xbe,0x6c,0xff, 0xff,0xbe,0x53,0xff,0xff,0xbe,0x3e,0xff,0xff,0xbe,0x2c,0xff,0xff,0xbe,0x1e, 0xff,0xff,0xbe,0x12,0xff,0xff,0xbe,0x0a,0xff,0xff,0xbe,0x04,0xff,0xff,0xbe, 0x01,0x8c,0xff,0xff,0xbe,0x00,0x65,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe,0x02, 0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe,0x09,0xff,0xff,0xbe, 0x0d,0xff,0xff,0xbe,0x14,0xff,0xff,0xbe,0x1d,0xff,0xff,0xbe,0x27,0xff,0xff, 0xbe,0x34,0xff,0xff,0xbe,0x43,0xff,0xff,0xbe,0x53,0xff,0xff,0xbe,0x65,0xff, 0xff,0xbe,0x77,0xf7,0xfc,0xc3,0x91,0xd6,0xe2,0xb9,0xc0,0xa6,0xbd,0xa0,0xea, 0x8b,0xa5,0x8e,0xfe,0x89,0xa3,0x8d,0xff,0x85,0xa0,0x8b,0xff,0x7e,0x98,0x84, 0xff,0x71,0x8a,0x79,0xff,0x68,0x7d,0x6f,0xff,0x68,0x7b,0x6f,0xff,0x6f,0x82, 0x78,0xff,0x73,0x8a,0x7d,0xff,0x76,0x8b,0x7f,0xff,0x74,0x8a,0x7d,0xff,0x76, 0x8b,0x7f,0xff,0x74,0x8a,0x7d,0xff,0x74,0x8b,0x7d,0xff,0x72,0x8a,0x7c,0xff, 0x71,0x8a,0x7b,0xff,0x70,0x8a,0x7b,0xff,0x70,0x85,0x7a,0xff,0x6f,0x84,0x79, 0xff,0x6e,0x83,0x78,0xff,0x6d,0x82,0x77,0xff,0x69,0x82,0x74,0xff,0x68,0x81, 0x74,0xff,0x67,0x81,0x73,0xff,0x62,0x7a,0x72,0xff,0x3b,0x4b,0x4b,0xff,0x11, 0x18,0x0f,0xff,0x2b,0x34,0x29,0xff,0x08,0x0f,0x00,0xff,0x0c,0x14,0x02,0xff, 0x50,0x5c,0x4e,0xff,0x25,0x2d,0x20,0xff,0x0a,0x13,0x00,0xff,0x0a,0x14,0x00, 0xff,0x07,0x11,0x00,0xff,0x05,0x10,0x00,0xff,0x04,0x0f,0x00,0xff,0x0e,0x17, 0x00,0xff,0x0e,0x14,0x00,0xff,0x0e,0x13,0x00,0xff,0x11,0x17,0x00,0xff,0x1e, 0x25,0x11,0xff,0x25,0x2c,0x23,0xff,0x25,0x2e,0x22,0xff,0x33,0x3d,0x2f,0xff, 0x2f,0x38,0x2a,0xff,0x2f,0x38,0x2c,0xff,0x30,0x36,0x29,0xff,0x32,0x3e,0x30, 0xff,0x31,0x45,0x36,0xff,0x31,0x4c,0x3a,0xff,0x32,0x4c,0x35,0xff,0x32,0x49, 0x37,0xff,0x34,0x47,0x40,0xff,0x36,0x4b,0x3e,0xff,0x3b,0x4e,0x42,0xff,0x3e, 0x52,0x4d,0xff,0x3d,0x50,0x4e,0xff,0x3d,0x54,0x4d,0xff,0x3d,0x52,0x4e,0xff, 0x3b,0x52,0x4b,0xff,0x3e,0x52,0x4d,0xff,0x40,0x52,0x4e,0xff,0x3b,0x50,0x4b, 0xff,0x32,0x4b,0x42,0xff,0x15,0x2b,0x17,0xff,0x17,0x23,0x0d,0xff,0x2b,0x37, 0x2d,0xff,0x37,0x40,0x34,0xff,0x4d,0x4e,0x45,0xff,0x58,0x66,0x54,0xff,0xa9, 0xcf,0xbd,0xff,0xbb,0xe1,0xd2,0xff,0xa6,0xc8,0xc1,0xff,0xd8,0xe2,0xd5,0xf4, 0xfa,0xfc,0xbd,0x74,0xff,0xff,0xbe,0x56,0xff,0xff,0xbe,0x41,0xff,0xff,0xbe, 0x2f,0xff,0xff,0xbe,0x1f,0xff,0xff,0xbe,0x13,0xff,0xff,0xbe,0x0a,0xff,0xff, 0xbe,0x05,0xff,0xff,0xbe,0x01,0x8b,0xff,0xff,0xbe,0x00,0x66,0xff,0xff,0xbe, 0x01,0xff,0xff,0xbe,0x02,0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x05,0xff,0xff, 0xbe,0x09,0xff,0xff,0xbe,0x0d,0xff,0xff,0xbe,0x14,0xff,0xff,0xbe,0x1c,0xff, 0xff,0xbe,0x27,0xff,0xff,0xbe,0x34,0xff,0xff,0xbe,0x42,0xff,0xff,0xbe,0x53, 0xff,0xff,0xbe,0x65,0xff,0xff,0xbe,0x77,0xf7,0xfc,0xc3,0x91,0xd7,0xe4,0xbb, 0xbf,0xab,0xc1,0xa4,0xea,0x8c,0xa7,0x90,0xfe,0x89,0xa4,0x8e,0xff,0x88,0xa2, 0x8c,0xff,0x80,0x99,0x84,0xff,0x72,0x89,0x77,0xff,0x69,0x7d,0x6e,0xff,0x6c, 0x7e,0x71,0xff,0x72,0x84,0x79,0xff,0x77,0x8a,0x7e,0xff,0x77,0x8d,0x80,0xff, 0x77,0x8e,0x81,0xff,0x77,0x8b,0x7f,0xff,0x76,0x8c,0x80,0xff,0x74,0x8a,0x7e, 0xff,0x73,0x89,0x7b,0xff,0x73,0x89,0x7c,0xff,0x72,0x89,0x7b,0xff,0x70,0x8a, 0x7b,0xff,0x70,0x86,0x7a,0xff,0x6f,0x85,0x79,0xff,0x6e,0x83,0x78,0xff,0x6a, 0x83,0x77,0xff,0x68,0x81,0x74,0xff,0x68,0x80,0x74,0xff,0x66,0x80,0x72,0xff, 0x62,0x7b,0x72,0xff,0x3d,0x4e,0x4c,0xff,0x12,0x18,0x0f,0xff,0x2d,0x37,0x27, 0xff,0x09,0x10,0x00,0xff,0x06,0x0c,0x00,0xff,0x1d,0x29,0x16,0xff,0x54,0x66, 0x59,0xff,0x18,0x20,0x13,0xff,0x0b,0x13,0x00,0xff,0x08,0x11,0x00,0xff,0x07, 0x10,0x00,0xff,0x07,0x12,0x00,0xff,0x06,0x12,0x00,0xff,0x0a,0x11,0x00,0xff, 0x0a,0x12,0x00,0xff,0x08,0x11,0x00,0xff,0x1b,0x24,0x14,0xff,0x28,0x31,0x29, 0xff,0x27,0x31,0x23,0xff,0x31,0x3b,0x2e,0xff,0x2b,0x35,0x27,0xff,0x2e,0x38, 0x2a,0xff,0x30,0x38,0x2b,0xff,0x32,0x3c,0x2f,0xff,0x32,0x47,0x3a,0xff,0x33, 0x45,0x3c,0xff,0x33,0x49,0x3c,0xff,0x34,0x4d,0x39,0xff,0x36,0x49,0x40,0xff, 0x34,0x4d,0x40,0xff,0x39,0x4d,0x45,0xff,0x40,0x50,0x4b,0xff,0x3e,0x52,0x4e, 0xff,0x40,0x56,0x4e,0xff,0x3e,0x58,0x4e,0xff,0x3d,0x54,0x4d,0xff,0x3e,0x52, 0x4d,0xff,0x40,0x50,0x4b,0xff,0x3d,0x52,0x4e,0xff,0x34,0x4b,0x47,0xff,0x1e, 0x2a,0x17,0xff,0x1c,0x26,0x0b,0xff,0x2b,0x37,0x2d,0xff,0x36,0x40,0x34,0xff, 0x49,0x4e,0x43,0xff,0x58,0x66,0x54,0xff,0xad,0xdc,0xbf,0xff,0xc4,0xf0,0xd9, 0xff,0xb2,0xd2,0xc8,0xff,0xca,0xef,0xdc,0xfe,0xec,0xf2,0xb9,0x80,0xff,0xff, 0xbe,0x59,0xff,0xff,0xbe,0x43,0xff,0xff,0xbe,0x31,0xff,0xff,0xbe,0x21,0xff, 0xff,0xbe,0x15,0xff,0xff,0xbe,0x0b,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe,0x02, 0x8b,0xff,0xff,0xbe,0x00,0x22,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe,0x03,0xff, 0xff,0xbe,0x05,0xff,0xff,0xbe,0x08,0xff,0xff,0xbe,0x0d,0xff,0xff,0xbe,0x14, 0xff,0xff,0xbe,0x1c,0xff,0xff,0xbe,0x27,0xff,0xff,0xbe,0x33,0xff,0xff,0xbe, 0x42,0xff,0xff,0xbe,0x53,0xff,0xff,0xbe,0x64,0xff,0xff,0xbe,0x77,0xf5,0xfa, 0xc0,0x91,0xd7,0xe5,0xbc,0xbf,0xad,0xc4,0xa5,0xea,0x8f,0xa9,0x91,0xfe,0x8b, 0xa5,0x8e,0xff,0x88,0xa2,0x8c,0xff,0x7f,0x99,0x83,0xff,0x73,0x89,0x77,0xff, 0x6b,0x7d,0x6f,0xff,0x6e,0x7f,0x73,0xff,0x76,0x89,0x7c,0xff,0x78,0x8e,0x81, 0xff,0x78,0x8d,0x80,0xff,0x77,0x8f,0x81,0xff,0x77,0x90,0x82,0xff,0x77,0x8f, 0x81,0xff,0x77,0x8e,0x80,0xff,0x74,0x8c,0x7e,0xff,0x73,0x8a,0x7b,0xff,0x73, 0x8a,0x7c,0xff,0x71,0x8a,0x7b,0xff,0x82,0x70,0x86,0x7a,0xff,0x1c,0x6e,0x85, 0x7a,0xff,0x6d,0x83,0x78,0xff,0x6a,0x82,0x77,0xff,0x68,0x82,0x73,0xff,0x68, 0x81,0x74,0xff,0x67,0x80,0x72,0xff,0x64,0x7a,0x74,0xff,0x3e,0x52,0x54,0xff, 0x12,0x18,0x0e,0xff,0x2d,0x36,0x27,0xff,0x09,0x0f,0x00,0xff,0x0c,0x14,0x00, 0xff,0x09,0x10,0x00,0xff,0x3d,0x51,0x37,0xff,0x55,0x73,0x6f,0xff,0x26,0x32, 0x2d,0xff,0x12,0x1a,0x0c,0xff,0x07,0x0f,0x00,0xff,0x05,0x0d,0x00,0xff,0x08, 0x12,0x00,0xff,0x08,0x13,0x00,0xff,0x0a,0x14,0x00,0xff,0x09,0x13,0x00,0xff, 0x18,0x22,0x0b,0xff,0x25,0x2e,0x23,0xff,0x2a,0x30,0x25,0xff,0x33,0x3b,0x2f, 0xff,0x2a,0x35,0x27,0xff,0x82,0x2e,0x36,0x29,0xff,0x24,0x34,0x3c,0x2f,0xff, 0x36,0x47,0x3a,0xff,0x33,0x43,0x3a,0xff,0x32,0x45,0x3b,0xff,0x34,0x49,0x36, 0xff,0x34,0x4e,0x3d,0xff,0x36,0x4e,0x47,0xff,0x36,0x4e,0x45,0xff,0x3e,0x4e, 0x4b,0xff,0x3b,0x4e,0x49,0xff,0x43,0x56,0x4e,0xff,0x3e,0x58,0x4e,0xff,0x3d, 0x54,0x4e,0xff,0x3d,0x52,0x4e,0xff,0x42,0x56,0x4e,0xff,0x3e,0x54,0x4e,0xff, 0x39,0x4b,0x47,0xff,0x1c,0x28,0x17,0xff,0x19,0x26,0x0d,0xff,0x2b,0x37,0x2a, 0xff,0x36,0x40,0x32,0xff,0x47,0x4d,0x42,0xff,0x54,0x66,0x56,0xff,0xa9,0xd2, 0xb6,0xff,0xa4,0xbf,0xaf,0xff,0x83,0xa2,0x96,0xff,0xc5,0xd3,0xbf,0xe2,0xff, 0xff,0xbe,0x75,0xff,0xff,0xbe,0x5c,0xff,0xff,0xbe,0x46,0xff,0xff,0xbe,0x32, 0xff,0xff,0xbe,0x23,0xff,0xff,0xbe,0x16,0xff,0xff,0xbe,0x0c,0xff,0xff,0xbe, 0x05,0xff,0xff,0xbe,0x02,0x8a,0xff,0xff,0xbe,0x00,0x1b,0xff,0xff,0xbe,0x01, 0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe,0x08,0xff,0xff,0xbe, 0x0c,0xff,0xff,0xbe,0x13,0xff,0xff,0xbe,0x1b,0xff,0xff,0xbe,0x26,0xff,0xff, 0xbe,0x33,0xff,0xff,0xbe,0x42,0xff,0xff,0xbe,0x52,0xff,0xff,0xbe,0x64,0xff, 0xff,0xbe,0x77,0xf2,0xf8,0xbc,0x8f,0xd3,0xdf,0xb7,0xbf,0xaf,0xc2,0xa5,0xea, 0x91,0xad,0x93,0xfe,0x8d,0xa8,0x90,0xff,0x89,0xa2,0x8c,0xff,0x7f,0x97,0x83, 0xff,0x72,0x86,0x76,0xff,0x6d,0x7e,0x71,0xff,0x71,0x81,0x76,0xff,0x79,0x8b, 0x7e,0xff,0x7a,0x91,0x81,0xff,0x7a,0x92,0x83,0xff,0x78,0x90,0x82,0xff,0x82, 0x77,0x90,0x82,0xff,0x4a,0x76,0x90,0x82,0xff,0x77,0x8e,0x80,0xff,0x74,0x8b, 0x7e,0xff,0x73,0x8b,0x7c,0xff,0x73,0x8a,0x7b,0xff,0x70,0x8a,0x7b,0xff,0x6f, 0x88,0x7c,0xff,0x6f,0x85,0x7a,0xff,0x6e,0x85,0x7a,0xff,0x6d,0x82,0x78,0xff, 0x6b,0x82,0x76,0xff,0x67,0x82,0x74,0xff,0x67,0x81,0x73,0xff,0x68,0x7f,0x73, 0xff,0x65,0x7a,0x72,0xff,0x42,0x58,0x59,0xff,0x10,0x19,0x0b,0xff,0x2e,0x38, 0x2a,0xff,0x18,0x20,0x0f,0xff,0x08,0x11,0x00,0xff,0x04,0x0b,0x00,0xff,0x0c, 0x13,0x04,0xff,0x5a,0x73,0x5c,0xff,0x5d,0x76,0x76,0xff,0x4b,0x5b,0x5e,0xff, 0x2d,0x3c,0x33,0xff,0x13,0x1c,0x11,0xff,0x0a,0x15,0x03,0xff,0x08,0x13,0x00, 0xff,0x0a,0x13,0x00,0xff,0x08,0x13,0x00,0xff,0x0f,0x1b,0x03,0xff,0x20,0x29, 0x18,0xff,0x25,0x2e,0x23,0xff,0x2f,0x3b,0x2c,0xff,0x2a,0x37,0x27,0xff,0x2c, 0x36,0x27,0xff,0x2c,0x35,0x29,0xff,0x30,0x3c,0x2d,0xff,0x32,0x44,0x3a,0xff, 0x33,0x46,0x3a,0xff,0x2e,0x49,0x35,0xff,0x32,0x4b,0x3b,0xff,0x34,0x49,0x3d, 0xff,0x36,0x4d,0x42,0xff,0x36,0x4d,0x45,0xff,0x39,0x4e,0x47,0xff,0x39,0x4e, 0x4b,0xff,0x3e,0x4e,0x4d,0xff,0x3e,0x50,0x4b,0xff,0x39,0x50,0x4b,0xff,0x40, 0x52,0x4d,0xff,0x42,0x56,0x50,0xff,0x40,0x56,0x50,0xff,0x34,0x4b,0x45,0xff, 0x1e,0x2b,0x1a,0xff,0x17,0x24,0x0d,0xff,0x2d,0x37,0x2b,0xff,0x36,0x3e,0x32, 0xff,0x49,0x4e,0x45,0xff,0x4e,0x5b,0x4e,0xff,0x56,0x6a,0x5b,0xff,0x85,0x9f, 0x84,0xfe,0xbe,0xca,0xb0,0xd5,0xff,0xff,0xbe,0x80,0xff,0xff,0xbe,0x77,0xff, 0xff,0xbe,0x5e,0xff,0xff,0xbe,0x47,0xff,0xff,0xbe,0x34,0xff,0xff,0xbe,0x24, 0xff,0xff,0xbe,0x17,0xff,0xff,0xbe,0x0d,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe, 0x02,0x89,0xff,0xff,0xbe,0x00,0x68,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe,0x02, 0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x07,0xff,0xff,0xbe,0x0b,0xff,0xff,0xbe, 0x12,0xff,0xff,0xbe,0x1a,0xff,0xff,0xbe,0x25,0xff,0xff,0xbe,0x32,0xff,0xff, 0xbe,0x40,0xff,0xff,0xbe,0x51,0xff,0xff,0xbe,0x63,0xff,0xff,0xbe,0x76,0xf4, 0xf6,0xbc,0x8d,0xd0,0xde,0xb3,0xbb,0xac,0xc2,0xa6,0xe8,0x94,0xaf,0x96,0xfe, 0x8f,0xab,0x93,0xff,0x8b,0xa4,0x8d,0xff,0x7f,0x96,0x81,0xff,0x73,0x85,0x76, 0xff,0x6f,0x7e,0x71,0xff,0x74,0x82,0x79,0xff,0x7c,0x8b,0x80,0xff,0x7e,0x92, 0x83,0xff,0x7c,0x94,0x83,0xff,0x7b,0x92,0x84,0xff,0x7a,0x90,0x84,0xff,0x78, 0x90,0x84,0xff,0x78,0x90,0x83,0xff,0x77,0x90,0x83,0xff,0x76,0x8e,0x80,0xff, 0x74,0x8b,0x7e,0xff,0x73,0x8b,0x7c,0xff,0x73,0x89,0x7a,0xff,0x71,0x88,0x7a, 0xff,0x72,0x88,0x7b,0xff,0x6e,0x84,0x7b,0xff,0x6d,0x84,0x7a,0xff,0x71,0x7f, 0x76,0xff,0x6e,0x80,0x73,0xff,0x67,0x82,0x74,0xff,0x67,0x81,0x74,0xff,0x67, 0x80,0x72,0xff,0x64,0x7c,0x72,0xff,0x48,0x5c,0x5c,0xff,0x10,0x1c,0x0e,0xff, 0x27,0x3b,0x26,0xff,0x30,0x42,0x30,0xff,0x16,0x1e,0x0f,0xff,0x06,0x0e,0x00, 0xff,0x07,0x0a,0x00,0xff,0x18,0x1f,0x09,0xff,0x3f,0x4f,0x3d,0xff,0x3e,0x4b, 0x43,0xff,0x63,0x79,0x73,0xff,0x62,0x7c,0x7c,0xff,0x3d,0x52,0x4f,0xff,0x20, 0x2e,0x23,0xff,0x13,0x1d,0x0d,0xff,0x0c,0x17,0x01,0xff,0x0b,0x14,0x00,0xff, 0x16,0x1f,0x06,0xff,0x23,0x2c,0x1f,0xff,0x2f,0x39,0x2c,0xff,0x2b,0x37,0x27, 0xff,0x2a,0x36,0x27,0xff,0x2c,0x36,0x28,0xff,0x2d,0x39,0x2b,0xff,0x34,0x45, 0x34,0xff,0x33,0x48,0x35,0xff,0x32,0x4a,0x3b,0xff,0x34,0x49,0x40,0xff,0x32, 0x43,0x3d,0xff,0x36,0x4e,0x3d,0xff,0x36,0x4b,0x43,0xff,0x39,0x50,0x49,0xff, 0x37,0x4e,0x47,0xff,0x39,0x4e,0x47,0xff,0x39,0x4e,0x49,0xff,0x3d,0x50,0x4b, 0xff,0x3e,0x54,0x4e,0xff,0x43,0x56,0x50,0xff,0x3b,0x52,0x4b,0xff,0x34,0x4b, 0x43,0xff,0x1e,0x2a,0x1a,0xff,0x1c,0x26,0x0d,0xff,0x2b,0x37,0x2e,0xff,0x34, 0x3e,0x34,0xff,0x47,0x4e,0x43,0xff,0x4e,0x58,0x47,0xff,0x66,0x7b,0x66,0xff, 0xb4,0xd9,0xb9,0xfe,0xe1,0xec,0xbd,0xa6,0xff,0xff,0xbe,0x80,0xff,0xff,0xbe, 0x7a,0xff,0xff,0xbe,0x60,0xff,0xff,0xbe,0x49,0xff,0xff,0xbe,0x35,0xff,0xff, 0xbe,0x25,0xff,0xff,0xbe,0x17,0xff,0xff,0xbe,0x0d,0xff,0xff,0xbe,0x06,0xff, 0xff,0xbe,0x02,0x89,0xff,0xff,0xbe,0x00,0x68,0xff,0xff,0xbe,0x01,0xff,0xff, 0xbe,0x03,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe,0x0a,0xff,0xff,0xbe,0x10,0xff, 0xff,0xbe,0x18,0xff,0xff,0xbe,0x22,0xff,0xff,0xbe,0x2f,0xff,0xff,0xbe,0x3e, 0xff,0xff,0xbe,0x4f,0xff,0xff,0xbe,0x62,0xff,0xff,0xbe,0x75,0xf7,0xfa,0xbd, 0x8b,0xd6,0xe1,0xb7,0xb9,0xb1,0xc6,0xa7,0xe6,0x95,0xb0,0x99,0xfd,0x8f,0xab, 0x94,0xff,0x8c,0xa5,0x90,0xff,0x81,0x93,0x82,0xff,0x76,0x84,0x76,0xff,0x71, 0x80,0x73,0xff,0x77,0x84,0x79,0xff,0x7d,0x8c,0x80,0xff,0x7f,0x92,0x85,0xff, 0x7e,0x94,0x86,0xff,0x7d,0x96,0x86,0xff,0x7c,0x93,0x86,0xff,0x7b,0x91,0x84, 0xff,0x79,0x90,0x84,0xff,0x78,0x90,0x83,0xff,0x77,0x90,0x83,0xff,0x77,0x8e, 0x82,0xff,0x77,0x8c,0x7f,0xff,0x73,0x8a,0x7b,0xff,0x73,0x89,0x7a,0xff,0x76, 0x84,0x7a,0xff,0x74,0x84,0x79,0xff,0x6f,0x85,0x7a,0xff,0x6e,0x84,0x7b,0xff, 0x70,0x7f,0x77,0xff,0x6d,0x80,0x73,0xff,0x68,0x82,0x74,0xff,0x68,0x82,0x73, 0xff,0x69,0x7f,0x73,0xff,0x68,0x7a,0x73,0xff,0x4a,0x63,0x61,0xff,0x12,0x19, 0x0d,0xff,0x25,0x34,0x23,0xff,0x20,0x32,0x1d,0xff,0x37,0x47,0x3a,0xff,0x0b, 0x12,0x00,0xff,0x0c,0x10,0x00,0xff,0x07,0x0e,0x00,0xff,0x14,0x1d,0x05,0xff, 0x1e,0x25,0x10,0xff,0x22,0x2d,0x1d,0xff,0x43,0x52,0x46,0xff,0x71,0x91,0x82, 0xff,0x81,0xa0,0xa2,0xff,0x61,0x7e,0x80,0xff,0x3e,0x4e,0x48,0xff,0x1f,0x2c, 0x1d,0xff,0x0f,0x1c,0x03,0xff,0x1f,0x25,0x10,0xff,0x2f,0x36,0x2c,0xff,0x2f, 0x37,0x28,0xff,0x2c,0x36,0x27,0xff,0x2b,0x38,0x28,0xff,0x2f,0x37,0x2a,0xff, 0x34,0x44,0x32,0xff,0x30,0x46,0x33,0xff,0x32,0x49,0x33,0xff,0x34,0x4b,0x34, 0xff,0x32,0x49,0x34,0xff,0x36,0x4d,0x3b,0xff,0x36,0x4d,0x45,0xff,0x37,0x4d, 0x49,0xff,0x39,0x4d,0x47,0xff,0x37,0x4e,0x45,0xff,0x37,0x4d,0x45,0xff,0x3e, 0x52,0x4d,0xff,0x3e,0x58,0x4e,0xff,0x40,0x54,0x4e,0xff,0x3e,0x50,0x4b,0xff, 0x37,0x4b,0x43,0xff,0x23,0x2b,0x17,0xff,0x1a,0x28,0x0b,0xff,0x2e,0x39,0x2b, 0xff,0x36,0x3e,0x32,0xff,0x49,0x4e,0x40,0xff,0x4e,0x59,0x47,0xff,0x6c,0x7f, 0x64,0xff,0x85,0x9e,0x8d,0xff,0xcf,0xe1,0xcd,0xf9,0xf8,0xfc,0xbe,0x85,0xff, 0xff,0xbe,0x7c,0xff,0xff,0xbe,0x62,0xff,0xff,0xbe,0x4b,0xff,0xff,0xbe,0x37, 0xff,0xff,0xbe,0x26,0xff,0xff,0xbe,0x18,0xff,0xff,0xbe,0x0e,0xff,0xff,0xbe, 0x06,0xff,0xff,0xbe,0x02,0x89,0xff,0xff,0xbe,0x00,0x1b,0xff,0xff,0xbe,0x02, 0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x08,0xff,0xff,0xbe,0x0d,0xff,0xff,0xbe, 0x15,0xff,0xff,0xbe,0x1f,0xff,0xff,0xbe,0x2b,0xff,0xff,0xbe,0x3b,0xff,0xff, 0xbe,0x4c,0xff,0xff,0xbe,0x5f,0xff,0xff,0xbe,0x72,0xfa,0xfc,0xbe,0x89,0xd8, 0xe4,0xb8,0xb5,0xb6,0xc9,0xaa,0xe4,0x9b,0xb4,0x9c,0xfc,0x91,0xae,0x96,0xff, 0x8c,0xa6,0x8f,0xff,0x82,0x97,0x83,0xff,0x76,0x86,0x77,0xff,0x72,0x81,0x76, 0xff,0x78,0x88,0x7c,0xff,0x7d,0x8f,0x7f,0xff,0x7f,0x96,0x82,0xff,0x7e,0x97, 0x84,0xff,0x7d,0x97,0x85,0xff,0x7d,0x96,0x88,0xff,0x7c,0x93,0x86,0xff,0x82, 0x7b,0x92,0x84,0xff,0x4b,0x79,0x90,0x82,0xff,0x76,0x90,0x81,0xff,0x77,0x8e, 0x80,0xff,0x77,0x8c,0x7f,0xff,0x73,0x8a,0x7c,0xff,0x71,0x8a,0x7b,0xff,0x70, 0x89,0x7b,0xff,0x70,0x88,0x7a,0xff,0x6e,0x86,0x7b,0xff,0x6f,0x84,0x79,0xff, 0x6d,0x82,0x77,0xff,0x6a,0x83,0x74,0xff,0x6c,0x80,0x73,0xff,0x6c,0x80,0x72, 0xff,0x69,0x80,0x76,0xff,0x68,0x7b,0x74,0xff,0x4e,0x68,0x64,0xff,0x0f,0x18, 0x0a,0xff,0x2d,0x38,0x27,0xff,0x0b,0x13,0x02,0xff,0x47,0x52,0x43,0xff,0x1d, 0x25,0x14,0xff,0x09,0x11,0x00,0xff,0x0a,0x13,0x00,0xff,0x09,0x12,0x00,0xff, 0x0d,0x15,0x00,0xff,0x0f,0x16,0x02,0xff,0x13,0x1b,0x0a,0xff,0x23,0x2c,0x1b, 0xff,0x45,0x54,0x49,0xff,0x76,0x93,0x8a,0xff,0x8c,0xb3,0xb1,0xff,0x70,0x8f, 0x95,0xff,0x36,0x43,0x43,0xff,0x16,0x1f,0x0d,0xff,0x27,0x31,0x21,0xff,0x2f, 0x34,0x28,0xff,0x29,0x33,0x25,0xff,0x2b,0x35,0x26,0xff,0x2a,0x35,0x28,0xff, 0x31,0x44,0x32,0xff,0x33,0x46,0x33,0xff,0x30,0x43,0x33,0xff,0x34,0x49,0x39, 0xff,0x30,0x49,0x34,0xff,0x34,0x4b,0x39,0xff,0x34,0x49,0x40,0xff,0x3b,0x4d, 0x4b,0xff,0x3b,0x50,0x4b,0xff,0x37,0x4e,0x40,0xff,0x3d,0x4e,0x45,0xff,0x3b, 0x4e,0x4e,0xff,0x40,0x54,0x4e,0xff,0x40,0x50,0x4d,0xff,0x3b,0x4e,0x4d,0xff, 0x34,0x49,0x42,0xff,0x23,0x2b,0x1a,0xff,0x19,0x23,0x0a,0xff,0x2e,0x39,0x2a, 0xff,0x34,0x3d,0x30,0xff,0x47,0x4e,0x40,0xff,0x4d,0x58,0x47,0xff,0x6c,0x83, 0x6e,0xff,0x8b,0xa9,0x98,0xff,0x98,0xb4,0xaf,0xff,0xcd,0xdb,0xc6,0xe4,0xff, 0xff,0xbe,0x7f,0xff,0xff,0xbe,0x64,0xff,0xff,0xbe,0x4d,0xff,0xff,0xbe,0x39, 0xff,0xff,0xbe,0x27,0xff,0xff,0xbe,0x19,0xff,0xff,0xbe,0x0f,0xff,0xff,0xbe, 0x07,0xff,0xff,0xbe,0x02,0x88,0xff,0xff,0xbe,0x00,0x2a,0xff,0xff,0xbe,0x01, 0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe,0x0b,0xff,0xff,0xbe, 0x12,0xff,0xff,0xbe,0x1b,0xff,0xff,0xbe,0x27,0xff,0xff,0xbe,0x35,0xff,0xff, 0xbe,0x47,0xff,0xff,0xbe,0x5a,0xff,0xff,0xbe,0x6e,0xf6,0xfa,0xbe,0x88,0xda, 0xe5,0xb8,0xb2,0xba,0xca,0xaa,0xe1,0x9f,0xb5,0x9e,0xfc,0x96,0xb0,0x98,0xff, 0x8f,0xa7,0x8f,0xff,0x82,0x97,0x81,0xff,0x78,0x8a,0x77,0xff,0x74,0x86,0x76, 0xff,0x7a,0x8b,0x7b,0xff,0x80,0x91,0x81,0xff,0x80,0x96,0x81,0xff,0x7e,0x98, 0x84,0xff,0x7d,0x99,0x85,0xff,0x7d,0x98,0x84,0xff,0x7e,0x97,0x84,0xff,0x7d, 0x94,0x85,0xff,0x7b,0x92,0x84,0xff,0x7a,0x92,0x84,0xff,0x79,0x91,0x82,0xff, 0x76,0x8f,0x82,0xff,0x77,0x8e,0x80,0xff,0x76,0x8c,0x7f,0xff,0x73,0x8b,0x7d, 0xff,0x70,0x8a,0x7c,0xff,0x6f,0x8a,0x7b,0xff,0x6f,0x89,0x7b,0xff,0x6f,0x85, 0x7a,0xff,0x6e,0x85,0x7a,0xff,0x6e,0x84,0x77,0xff,0x6b,0x82,0x77,0xff,0x82, 0x69,0x82,0x74,0xff,0x26,0x68,0x82,0x73,0xff,0x65,0x7f,0x73,0xff,0x4e,0x6a, 0x68,0xff,0x10,0x19,0x0b,0xff,0x2d,0x3a,0x2d,0xff,0x08,0x0f,0x00,0xff,0x24, 0x2e,0x19,0xff,0x46,0x51,0x46,0xff,0x0c,0x13,0x01,0xff,0x0c,0x14,0x00,0xff, 0x08,0x11,0x00,0xff,0x07,0x0d,0x00,0xff,0x08,0x10,0x00,0xff,0x0d,0x12,0x00, 0xff,0x0e,0x16,0x01,0xff,0x15,0x1c,0x08,0xff,0x21,0x29,0x18,0xff,0x38,0x44, 0x36,0xff,0x5a,0x6f,0x65,0xff,0x6c,0x81,0x7d,0xff,0x3d,0x4b,0x47,0xff,0x26, 0x2f,0x23,0xff,0x2d,0x34,0x27,0xff,0x27,0x31,0x24,0xff,0x29,0x31,0x26,0xff, 0x2a,0x35,0x25,0xff,0x31,0x47,0x32,0xff,0x2e,0x46,0x33,0xff,0x2e,0x43,0x35, 0xff,0x32,0x45,0x3b,0xff,0x30,0x49,0x34,0xff,0x36,0x4b,0x3d,0xff,0x3b,0x45, 0x37,0xff,0x37,0x4d,0x3e,0xff,0x37,0x52,0x4b,0xff,0x39,0x50,0x45,0xff,0x3d, 0x50,0x4d,0xff,0x3b,0x52,0x4b,0xff,0x82,0x3e,0x54,0x4d,0xff,0x15,0x3b,0x4e, 0x4b,0xff,0x37,0x47,0x42,0xff,0x1e,0x2b,0x19,0xff,0x17,0x23,0x0a,0xff,0x2d, 0x37,0x2a,0xff,0x34,0x3d,0x2e,0xff,0x47,0x4e,0x40,0xff,0x4e,0x59,0x47,0xff, 0x7f,0x9c,0x85,0xff,0xa0,0xc1,0xb6,0xff,0x9e,0xbd,0xb8,0xff,0xb5,0xe9,0xcb, 0xff,0xe6,0xf1,0xc3,0xa8,0xff,0xff,0xbe,0x66,0xff,0xff,0xbe,0x4f,0xff,0xff, 0xbe,0x3a,0xff,0xff,0xbe,0x29,0xff,0xff,0xbe,0x1b,0xff,0xff,0xbe,0x0f,0xff, 0xff,0xbe,0x07,0xff,0xff,0xbe,0x03,0x88,0xff,0xff,0xbe,0x00,0x3c,0xff,0xff, 0xbe,0x01,0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x07,0xff,0xff,0xbe,0x0d,0xff, 0xff,0xbe,0x16,0xff,0xff,0xbe,0x21,0xff,0xff,0xbe,0x2f,0xff,0xff,0xbe,0x3f, 0xff,0xff,0xbe,0x53,0xff,0xff,0xbe,0x68,0xfc,0xfc,0xbe,0x83,0xdd,0xe8,0xba, 0xaf,0xbc,0xcd,0xaf,0xe0,0xa3,0xb6,0x9f,0xfb,0x9a,0xb0,0x99,0xff,0x91,0xa9, 0x92,0xff,0x84,0x99,0x83,0xff,0x78,0x89,0x77,0xff,0x76,0x88,0x76,0xff,0x7c, 0x8d,0x7c,0xff,0x81,0x92,0x80,0xff,0x83,0x94,0x83,0xff,0x81,0x96,0x83,0xff, 0x7f,0x98,0x85,0xff,0x7f,0x99,0x86,0xff,0x7e,0x99,0x84,0xff,0x7e,0x97,0x82, 0xff,0x7d,0x94,0x85,0xff,0x7b,0x92,0x84,0xff,0x7a,0x91,0x83,0xff,0x79,0x91, 0x83,0xff,0x77,0x8f,0x83,0xff,0x77,0x8e,0x80,0xff,0x76,0x8c,0x7f,0xff,0x73, 0x8b,0x7d,0xff,0x71,0x8a,0x7b,0xff,0x6f,0x89,0x7a,0xff,0x6f,0x89,0x7b,0xff, 0x71,0x83,0x7a,0xff,0x6e,0x84,0x7a,0xff,0x6d,0x82,0x77,0xff,0x6c,0x82,0x77, 0xff,0x6a,0x82,0x76,0xff,0x68,0x82,0x76,0xff,0x68,0x80,0x72,0xff,0x67,0x7c, 0x72,0xff,0x50,0x69,0x69,0xff,0x11,0x18,0x0a,0xff,0x2e,0x3a,0x2d,0xff,0x0d, 0x12,0x02,0xff,0x0c,0x12,0x01,0xff,0x4c,0x58,0x46,0xff,0x24,0x2d,0x1e,0xff, 0x0a,0x13,0x00,0xff,0x0d,0x14,0x00,0xff,0x0a,0x0f,0x00,0xff,0x07,0x0f,0x00, 0xff,0x0b,0x12,0x00,0xff,0x0e,0x14,0x00,0xff,0x13,0x1a,0x00,0xff,0x82,0x13, 0x17,0x03,0xff,0x2b,0x1d,0x1e,0x0b,0xff,0x29,0x31,0x23,0xff,0x31,0x3d,0x31, 0xff,0x2c,0x36,0x29,0xff,0x2d,0x35,0x27,0xff,0x27,0x31,0x24,0xff,0x29,0x31, 0x24,0xff,0x28,0x34,0x25,0xff,0x32,0x44,0x31,0xff,0x33,0x3d,0x30,0xff,0x2e, 0x3c,0x2b,0xff,0x2a,0x34,0x20,0xff,0x23,0x30,0x17,0xff,0x24,0x34,0x1a,0xff, 0x2a,0x37,0x21,0xff,0x2a,0x3b,0x23,0xff,0x2e,0x45,0x32,0xff,0x37,0x45,0x36, 0xff,0x3d,0x4e,0x3e,0xff,0x3b,0x4e,0x40,0xff,0x3d,0x4e,0x47,0xff,0x3b,0x4e, 0x4e,0xff,0x3e,0x4e,0x4d,0xff,0x34,0x43,0x40,0xff,0x1c,0x2d,0x17,0xff,0x17, 0x24,0x06,0xff,0x2e,0x37,0x2a,0xff,0x34,0x3e,0x30,0xff,0x43,0x4e,0x3e,0xff, 0x4d,0x59,0x47,0xff,0x90,0xb2,0x98,0xff,0xad,0xd2,0xc6,0xff,0xab,0xcf,0xc4, 0xff,0xa0,0xc1,0xbd,0xff,0xc5,0xd4,0xb7,0xce,0xff,0xff,0xbe,0x68,0xff,0xff, 0xbe,0x50,0xff,0xff,0xbe,0x3c,0xff,0xff,0xbe,0x2a,0xff,0xff,0xbe,0x1c,0xff, 0xff,0xbe,0x10,0xff,0xff,0xbe,0x08,0xff,0xff,0xbe,0x03,0x88,0xff,0xff,0xbe, 0x00,0x20,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x09,0xff, 0xff,0xbe,0x11,0xff,0xff,0xbe,0x1a,0xff,0xff,0xbe,0x27,0xff,0xff,0xbe,0x37, 0xff,0xff,0xbe,0x49,0xff,0xff,0xbe,0x5f,0xff,0xff,0xc0,0x78,0xe6,0xee,0xbd, 0xa9,0xc4,0xd3,0xb2,0xdc,0xa8,0xb9,0xa2,0xfa,0x9e,0xb0,0x9c,0xff,0x96,0xa9, 0x93,0xff,0x86,0x9a,0x85,0xff,0x79,0x8a,0x79,0xff,0x77,0x88,0x77,0xff,0x7c, 0x8e,0x7c,0xff,0x82,0x93,0x82,0xff,0x84,0x96,0x84,0xff,0x84,0x96,0x85,0xff, 0x81,0x97,0x84,0xff,0x7f,0x99,0x85,0xff,0x7f,0x97,0x84,0xff,0x7c,0x92,0x7f, 0xff,0x7b,0x93,0x7f,0xff,0x7d,0x94,0x85,0xff,0x7b,0x92,0x84,0xff,0x7a,0x91, 0x83,0xff,0x79,0x90,0x83,0xff,0x77,0x8e,0x81,0xff,0x82,0x76,0x8c,0x7f,0xff, 0x47,0x74,0x8a,0x7c,0xff,0x71,0x8a,0x7b,0xff,0x70,0x8a,0x7b,0xff,0x70,0x89, 0x7b,0xff,0x71,0x84,0x7a,0xff,0x6e,0x84,0x7a,0xff,0x6f,0x82,0x78,0xff,0x70, 0x80,0x74,0xff,0x6e,0x7f,0x73,0xff,0x6e,0x7e,0x73,0xff,0x6c,0x7d,0x72,0xff, 0x69,0x7c,0x74,0xff,0x51,0x6c,0x6b,0xff,0x11,0x18,0x08,0xff,0x31,0x3a,0x29, 0xff,0x0f,0x15,0x03,0xff,0x09,0x0f,0x00,0xff,0x19,0x25,0x13,0xff,0x4d,0x5f, 0x54,0xff,0x10,0x19,0x07,0xff,0x0d,0x14,0x00,0xff,0x0c,0x11,0x00,0xff,0x07, 0x0f,0x00,0xff,0x06,0x0d,0x00,0xff,0x0a,0x0e,0x00,0xff,0x09,0x10,0x00,0xff, 0x08,0x0e,0x00,0xff,0x08,0x09,0x00,0xff,0x0f,0x17,0x00,0xff,0x25,0x2e,0x1f, 0xff,0x22,0x2a,0x1f,0xff,0x29,0x34,0x24,0xff,0x2f,0x35,0x2a,0xff,0x27,0x2f, 0x22,0xff,0x28,0x31,0x24,0xff,0x26,0x32,0x23,0xff,0x2d,0x3f,0x2d,0xff,0x33, 0x43,0x35,0xff,0x26,0x2e,0x1c,0xff,0x2a,0x39,0x1e,0xff,0x45,0x58,0x40,0xff, 0x34,0x42,0x2b,0xff,0x24,0x37,0x1a,0xff,0x23,0x32,0x15,0xff,0x23,0x2d,0x17, 0xff,0x1e,0x2d,0x14,0xff,0x20,0x30,0x10,0xff,0x21,0x2e,0x14,0xff,0x24,0x34, 0x1c,0xff,0x32,0x40,0x30,0xff,0x3d,0x4b,0x42,0xff,0x32,0x42,0x42,0xff,0x21, 0x2b,0x19,0xff,0x19,0x24,0x06,0xff,0x2e,0x36,0x2a,0xff,0x34,0x3e,0x30,0xff, 0x43,0x4d,0x3d,0xff,0x4b,0x59,0x45,0xff,0x96,0xbd,0xa0,0xff,0xb6,0xde,0xd2, 0xff,0xa2,0xc1,0xbb,0xff,0x93,0xb6,0xa6,0xff,0xcb,0xd6,0xab,0xae,0xff,0xff, 0xbe,0x6a,0xff,0xff,0xbe,0x52,0xff,0xff,0xbe,0x3d,0xff,0xff,0xbe,0x2b,0xff, 0xff,0xbe,0x1c,0xff,0xff,0xbe,0x11,0xff,0xff,0xbe,0x08,0xff,0xff,0xbe,0x03, 0x88,0xff,0xff,0xbe,0x00,0x6a,0xff,0xff,0xbe,0x02,0xff,0xff,0xbe,0x05,0xff, 0xff,0xbe,0x0b,0xff,0xff,0xbe,0x14,0xff,0xff,0xbe,0x1f,0xff,0xff,0xbe,0x2d, 0xff,0xff,0xbe,0x3e,0xff,0xff,0xbe,0x52,0xff,0xff,0xbe,0x69,0xf3,0xf8,0xbd, 0x91,0xd0,0xde,0xb9,0xd0,0xac,0xbe,0xa7,0xf7,0xa0,0xb2,0x9e,0xff,0x99,0xab, 0x97,0xff,0x89,0x9c,0x88,0xff,0x7b,0x8c,0x7a,0xff,0x78,0x89,0x78,0xff,0x7d, 0x8f,0x7d,0xff,0x81,0x94,0x81,0xff,0x84,0x98,0x85,0xff,0x84,0x99,0x86,0xff, 0x82,0x99,0x86,0xff,0x7f,0x99,0x85,0xff,0x7e,0x96,0x82,0xff,0x7a,0x8d,0x7b, 0xff,0x76,0x89,0x77,0xff,0x7a,0x8f,0x7f,0xff,0x7d,0x94,0x86,0xff,0x7b,0x92, 0x84,0xff,0x7a,0x91,0x83,0xff,0x78,0x90,0x83,0xff,0x76,0x8f,0x80,0xff,0x76, 0x8c,0x7f,0xff,0x76,0x8b,0x7e,0xff,0x74,0x8a,0x7a,0xff,0x71,0x89,0x7b,0xff, 0x6f,0x8a,0x7b,0xff,0x70,0x88,0x7a,0xff,0x70,0x86,0x7a,0xff,0x6f,0x83,0x78, 0xff,0x72,0x7f,0x78,0xff,0x70,0x7f,0x74,0xff,0x6c,0x81,0x73,0xff,0x6b,0x80, 0x74,0xff,0x6a,0x81,0x73,0xff,0x66,0x7e,0x73,0xff,0x51,0x6b,0x6a,0xff,0x11, 0x19,0x08,0xff,0x32,0x39,0x2a,0xff,0x0d,0x16,0x03,0xff,0x10,0x13,0x00,0xff, 0x05,0x0c,0x00,0xff,0x3a,0x51,0x3b,0xff,0x45,0x55,0x4e,0xff,0x15,0x1c,0x0d, 0xff,0x0d,0x12,0x00,0xff,0x06,0x0f,0x00,0xff,0x07,0x0d,0x00,0xff,0x0a,0x0e, 0x00,0xff,0x09,0x0e,0x00,0xff,0x09,0x12,0x00,0xff,0x0b,0x12,0x00,0xff,0x0b, 0x15,0x00,0xff,0x21,0x29,0x18,0xff,0x27,0x2f,0x25,0xff,0x2c,0x38,0x2a,0xff, 0x30,0x37,0x28,0xff,0x27,0x31,0x21,0xff,0x28,0x30,0x23,0xff,0x25,0x30,0x23, 0xff,0x2c,0x40,0x2f,0xff,0x33,0x4a,0x38,0xff,0x32,0x40,0x2e,0xff,0x2a,0x36, 0x1c,0xff,0x4b,0x59,0x43,0xff,0x58,0x64,0x59,0xff,0x52,0x5b,0x4d,0xff,0x4e, 0x56,0x45,0xff,0x49,0x4e,0x43,0xff,0x40,0x4b,0x3d,0xff,0x39,0x45,0x34,0xff, 0x2e,0x37,0x26,0xff,0x28,0x32,0x1e,0xff,0x2b,0x37,0x26,0xff,0x36,0x42,0x34, 0xff,0x34,0x45,0x42,0xff,0x23,0x2d,0x1c,0xff,0x1c,0x23,0x08,0xff,0x2d,0x36, 0x2a,0xff,0x34,0x3e,0x30,0xff,0x42,0x4b,0x3e,0xff,0x49,0x58,0x47,0xff,0x74, 0x94,0x7f,0xff,0x78,0x92,0x81,0xff,0x80,0x99,0x83,0xfe,0xbf,0xcd,0xb3,0xd6, 0xff,0xff,0xbe,0x80,0xff,0xff,0xbe,0x6b,0xff,0xff,0xbe,0x53,0xff,0xff,0xbe, 0x3e,0xff,0xff,0xbe,0x2c,0xff,0xff,0xbe,0x1d,0xff,0xff,0xbe,0x11,0xff,0xff, 0xbe,0x09,0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x01,0x87,0xff,0xff,0xbe,0x00, 0x3c,0xff,0xff,0xbe,0x02,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe,0x0d,0xff,0xff, 0xbe,0x16,0xff,0xff,0xbe,0x23,0xff,0xff,0xbe,0x32,0xff,0xff,0xbe,0x45,0xff, 0xff,0xbe,0x5a,0xff,0xff,0xc0,0x75,0xe9,0xf0,0xbc,0x9e,0xbd,0xce,0xb0,0xe6, 0xa5,0xb8,0xa2,0xfe,0x9d,0xaf,0x9a,0xff,0x8e,0xa0,0x8b,0xff,0x7d,0x8e,0x7c, 0xff,0x78,0x89,0x78,0xff,0x7d,0x8f,0x7d,0xff,0x83,0x96,0x83,0xff,0x84,0x99, 0x85,0xff,0x85,0x9b,0x86,0xff,0x84,0x9b,0x88,0xff,0x80,0x98,0x84,0xff,0x7a, 0x91,0x7e,0xff,0x79,0x8c,0x7b,0xff,0x7a,0x8a,0x79,0xff,0x7c,0x8f,0x7e,0xff, 0x7e,0x93,0x84,0xff,0x7d,0x94,0x86,0xff,0x7b,0x92,0x84,0xff,0x7a,0x91,0x84, 0xff,0x77,0x90,0x83,0xff,0x76,0x8f,0x81,0xff,0x76,0x8d,0x7f,0xff,0x74,0x8a, 0x7e,0xff,0x73,0x89,0x7a,0xff,0x70,0x8a,0x7b,0xff,0x6f,0x8a,0x7b,0xff,0x70, 0x88,0x7a,0xff,0x70,0x85,0x7a,0xff,0x6f,0x82,0x79,0xff,0x70,0x81,0x77,0xff, 0x6e,0x82,0x78,0xff,0x6a,0x82,0x76,0xff,0x69,0x82,0x76,0xff,0x68,0x81,0x74, 0xff,0x67,0x7e,0x71,0xff,0x53,0x6c,0x68,0xff,0x11,0x19,0x08,0xff,0x2e,0x3b, 0x2d,0xff,0x18,0x28,0x16,0xff,0x08,0x12,0x00,0xff,0x04,0x0b,0x00,0xff,0x0c, 0x19,0x04,0xff,0x65,0x80,0x71,0xff,0x51,0x63,0x65,0xff,0x2b,0x36,0x2f,0xff, 0x14,0x1d,0x0d,0xff,0x07,0x12,0x01,0xff,0x06,0x11,0x00,0xff,0x08,0x11,0x00, 0xff,0x82,0x09,0x13,0x00,0xff,0x06,0x0a,0x14,0x00,0xff,0x1a,0x25,0x0d,0xff, 0x27,0x2e,0x22,0xff,0x2a,0x34,0x27,0xff,0x30,0x37,0x28,0xff,0x25,0x2e,0x21, 0xff,0x82,0x26,0x30,0x23,0xff,0x19,0x2d,0x44,0x32,0xff,0x37,0x4f,0x3f,0xff, 0x33,0x49,0x3e,0xff,0x17,0x2a,0x0d,0xff,0x10,0x21,0x00,0xff,0x21,0x2d,0x15, 0xff,0x2a,0x34,0x23,0xff,0x26,0x2e,0x1e,0xff,0x24,0x2b,0x21,0xff,0x28,0x2d, 0x21,0xff,0x2a,0x32,0x21,0xff,0x2a,0x32,0x23,0xff,0x2a,0x34,0x28,0xff,0x32, 0x3e,0x2e,0xff,0x36,0x43,0x34,0xff,0x36,0x45,0x40,0xff,0x21,0x30,0x1c,0xff, 0x17,0x23,0x06,0xff,0x2b,0x36,0x28,0xff,0x34,0x3d,0x34,0xff,0x40,0x49,0x3e, 0xff,0x4b,0x54,0x45,0xff,0x4e,0x5d,0x4d,0xff,0x58,0x6a,0x5b,0xff,0xd1,0xdd, 0xcd,0xf2,0x82,0xff,0xff,0xbe,0x80,0x09,0xff,0xff,0xbe,0x6d,0xff,0xff,0xbe, 0x54,0xff,0xff,0xbe,0x3f,0xff,0xff,0xbe,0x2d,0xff,0xff,0xbe,0x1e,0xff,0xff, 0xbe,0x12,0xff,0xff,0xbe,0x09,0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x01,0x87, 0xff,0xff,0xbe,0x00,0x12,0xff,0xff,0xbe,0x02,0xff,0xff,0xbe,0x07,0xff,0xff, 0xbe,0x0e,0xff,0xff,0xbe,0x19,0xff,0xff,0xbe,0x26,0xff,0xff,0xbe,0x37,0xff, 0xff,0xbe,0x4a,0xff,0xff,0xbe,0x61,0xf8,0xfc,0xbb,0x80,0xe1,0xe9,0xb9,0xa6, 0xb4,0xc6,0xaa,0xeb,0xa1,0xb5,0x9f,0xfe,0x93,0xa6,0x91,0xff,0x80,0x91,0x7f, 0xff,0x78,0x8a,0x78,0xff,0x7d,0x8f,0x7d,0xff,0x83,0x96,0x83,0xff,0x86,0x99, 0x86,0xff,0x82,0x86,0x9b,0x88,0xff,0x0e,0x85,0x99,0x86,0xff,0x79,0x8c,0x7b, 0xff,0x6f,0x82,0x72,0xff,0x7b,0x8d,0x7f,0xff,0x7f,0x91,0x82,0xff,0x80,0x94, 0x81,0xff,0x7e,0x96,0x82,0xff,0x7c,0x93,0x84,0xff,0x7b,0x92,0x84,0xff,0x79, 0x90,0x84,0xff,0x77,0x90,0x82,0xff,0x76,0x8f,0x80,0xff,0x76,0x8d,0x7f,0xff, 0x74,0x8a,0x7e,0xff,0x82,0x71,0x8a,0x7b,0xff,0x46,0x70,0x8a,0x7b,0xff,0x6f, 0x88,0x7b,0xff,0x6f,0x86,0x7b,0xff,0x6e,0x85,0x7a,0xff,0x6d,0x85,0x7a,0xff, 0x6f,0x81,0x74,0xff,0x6c,0x80,0x74,0xff,0x6a,0x82,0x76,0xff,0x6d,0x7e,0x72, 0xff,0x69,0x7c,0x70,0xff,0x56,0x6e,0x6e,0xff,0x11,0x17,0x0b,0xff,0x29,0x38, 0x27,0xff,0x2f,0x46,0x39,0xff,0x1d,0x26,0x14,0xff,0x09,0x10,0x00,0xff,0x07, 0x0b,0x00,0xff,0x1f,0x2d,0x17,0xff,0x5a,0x72,0x66,0xff,0x52,0x66,0x62,0xff, 0x5a,0x70,0x6c,0xff,0x36,0x46,0x3d,0xff,0x1c,0x27,0x17,0xff,0x11,0x18,0x08, 0xff,0x0c,0x14,0x00,0xff,0x08,0x13,0x00,0xff,0x08,0x14,0x00,0xff,0x0e,0x1d, 0x01,0xff,0x21,0x2c,0x19,0xff,0x2a,0x34,0x27,0xff,0x2f,0x37,0x2b,0xff,0x25, 0x2e,0x21,0xff,0x28,0x30,0x23,0xff,0x26,0x30,0x23,0xff,0x2c,0x44,0x31,0xff, 0x35,0x4a,0x37,0xff,0x2e,0x40,0x32,0xff,0x19,0x28,0x12,0xff,0x15,0x26,0x03, 0xff,0x23,0x2e,0x12,0xff,0x2b,0x30,0x26,0xff,0x2a,0x34,0x23,0xff,0x3d,0x4e, 0x24,0xff,0x39,0x4e,0x1c,0xff,0x32,0x42,0x1a,0xff,0x2b,0x36,0x1c,0xff,0x2a, 0x32,0x20,0xff,0x2e,0x3d,0x2b,0xff,0x32,0x45,0x34,0xff,0x36,0x45,0x3d,0xff, 0x24,0x2d,0x1a,0xff,0x17,0x23,0x05,0xff,0x2d,0x36,0x26,0xff,0x32,0x3d,0x30, 0xff,0x40,0x49,0x3d,0xff,0x4b,0x52,0x43,0xff,0x5f,0x6a,0x58,0xff,0x6e,0x89, 0x74,0xff,0xa2,0xc7,0xac,0xff,0xd8,0xe5,0xbd,0xb7,0xff,0xff,0xbe,0x80,0xff, 0xff,0xbe,0x6f,0xff,0xff,0xbe,0x56,0xff,0xff,0xbe,0x41,0xff,0xff,0xbe,0x2e, 0xff,0xff,0xbe,0x1f,0xff,0xff,0xbe,0x13,0xff,0xff,0xbe,0x0a,0xff,0xff,0xbe, 0x04,0xff,0xff,0xbe,0x01,0x87,0xff,0xff,0xbe,0x00,0x6a,0xff,0xff,0xbe,0x03, 0xff,0xff,0xbe,0x08,0xff,0xff,0xbe,0x10,0xff,0xff,0xbe,0x1b,0xff,0xff,0xbe, 0x29,0xff,0xff,0xbe,0x3a,0xff,0xff,0xbe,0x4e,0xff,0xff,0xbe,0x66,0xf9,0xfc, 0xbd,0x85,0xdc,0xe2,0xb5,0xac,0xaf,0xc1,0xa5,0xed,0x99,0xad,0x97,0xfe,0x85, 0x98,0x83,0xff,0x79,0x8b,0x79,0xff,0x7c,0x8f,0x7c,0xff,0x83,0x97,0x84,0xff, 0x88,0x98,0x89,0xff,0x89,0x99,0x89,0xff,0x89,0x9a,0x8a,0xff,0x88,0x9b,0x8a, 0xff,0x86,0x98,0x86,0xff,0x74,0x85,0x76,0xff,0x6a,0x7f,0x70,0xff,0x7a,0x91, 0x82,0xff,0x7e,0x96,0x84,0xff,0x7e,0x94,0x81,0xff,0x7d,0x94,0x84,0xff,0x7b, 0x92,0x84,0xff,0x7b,0x92,0x85,0xff,0x7a,0x90,0x84,0xff,0x77,0x90,0x82,0xff, 0x76,0x8e,0x80,0xff,0x77,0x8e,0x80,0xff,0x76,0x8c,0x80,0xff,0x73,0x8b,0x7d, 0xff,0x72,0x8a,0x7b,0xff,0x70,0x8a,0x7b,0xff,0x70,0x88,0x7b,0xff,0x70,0x85, 0x7a,0xff,0x6f,0x86,0x7b,0xff,0x6d,0x85,0x7a,0xff,0x70,0x80,0x76,0xff,0x6c, 0x80,0x73,0xff,0x6c,0x81,0x76,0xff,0x6d,0x7f,0x73,0xff,0x68,0x7c,0x71,0xff, 0x55,0x6e,0x70,0xff,0x0f,0x17,0x0b,0xff,0x29,0x34,0x23,0xff,0x24,0x33,0x1e, 0xff,0x3f,0x4d,0x3a,0xff,0x0f,0x17,0x01,0xff,0x09,0x12,0x00,0xff,0x04,0x0b, 0x00,0xff,0x1f,0x2a,0x13,0xff,0x2c,0x38,0x29,0xff,0x3f,0x51,0x45,0xff,0x6e, 0x8b,0x82,0xff,0x75,0x91,0x8f,0xff,0x51,0x67,0x63,0xff,0x33,0x40,0x39,0xff, 0x1f,0x2c,0x1f,0xff,0x14,0x1e,0x0b,0xff,0x0b,0x17,0x00,0xff,0x17,0x23,0x0a, 0xff,0x27,0x33,0x26,0xff,0x2f,0x38,0x2b,0xff,0x25,0x2e,0x21,0xff,0x28,0x30, 0x23,0xff,0x25,0x2f,0x22,0xff,0x2a,0x40,0x2c,0xff,0x30,0x4a,0x33,0xff,0x32, 0x3e,0x2d,0xff,0x1c,0x2a,0x14,0xff,0x14,0x24,0x03,0xff,0x1c,0x2a,0x0b,0xff, 0x30,0x3e,0x21,0xff,0x49,0x66,0x20,0xff,0x6a,0xad,0x12,0xff,0x8b,0xe6,0x12, 0xff,0x9e,0xff,0x17,0xff,0x5b,0x85,0x17,0xff,0x23,0x2a,0x20,0xff,0x2d,0x39, 0x2a,0xff,0x34,0x45,0x37,0xff,0x34,0x47,0x37,0xff,0x23,0x30,0x1e,0xff,0x17, 0x23,0x06,0xff,0x2b,0x36,0x24,0xff,0x32,0x3d,0x2e,0xff,0x3e,0x49,0x3d,0xff, 0x4b,0x4e,0x45,0xff,0x5f,0x6a,0x4e,0xff,0x70,0x87,0x6c,0xff,0x85,0x9c,0x96, 0xff,0xbb,0xdc,0xc0,0xf9,0xfe,0xff,0xbe,0x80,0xff,0xff,0xbe,0x71,0xff,0xff, 0xbe,0x58,0xff,0xff,0xbe,0x42,0xff,0xff,0xbe,0x30,0xff,0xff,0xbe,0x20,0xff, 0xff,0xbe,0x14,0xff,0xff,0xbe,0x0a,0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x01, 0x87,0xff,0xff,0xbe,0x00,0x6a,0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x08,0xff, 0xff,0xbe,0x10,0xff,0xff,0xbe,0x1c,0xff,0xff,0xbe,0x2b,0xff,0xff,0xbe,0x3c, 0xff,0xff,0xbe,0x51,0xff,0xff,0xbe,0x69,0xfa,0xfa,0xbb,0x86,0xd7,0xdf,0xb4, 0xb2,0xa8,0xb8,0x9f,0xf0,0x8d,0x9f,0x8b,0xff,0x7c,0x8e,0x7c,0xff,0x7c,0x8e, 0x7d,0xff,0x84,0x97,0x83,0xff,0x89,0x9b,0x89,0xff,0x8b,0x9b,0x8b,0xff,0x8a, 0x9a,0x8a,0xff,0x88,0x9b,0x8a,0xff,0x86,0x9c,0x8a,0xff,0x84,0x97,0x85,0xff, 0x74,0x86,0x76,0xff,0x70,0x83,0x77,0xff,0x73,0x8b,0x7d,0xff,0x79,0x8f,0x7f, 0xff,0x7e,0x94,0x83,0xff,0x7d,0x94,0x86,0xff,0x7b,0x92,0x85,0xff,0x7b,0x92, 0x84,0xff,0x7a,0x91,0x84,0xff,0x77,0x90,0x82,0xff,0x76,0x90,0x81,0xff,0x77, 0x8e,0x80,0xff,0x76,0x8d,0x80,0xff,0x74,0x8a,0x7c,0xff,0x72,0x8a,0x7b,0xff, 0x71,0x8a,0x7b,0xff,0x70,0x8a,0x7b,0xff,0x70,0x85,0x7a,0xff,0x6f,0x85,0x7b, 0xff,0x6e,0x85,0x7a,0xff,0x6e,0x83,0x77,0xff,0x6c,0x81,0x76,0xff,0x6a,0x82, 0x76,0xff,0x68,0x82,0x74,0xff,0x66,0x7e,0x70,0xff,0x58,0x70,0x70,0xff,0x0f, 0x19,0x0b,0xff,0x2b,0x38,0x27,0xff,0x0f,0x19,0x06,0xff,0x3a,0x4b,0x3a,0xff, 0x24,0x2f,0x1d,0xff,0x0c,0x18,0x00,0xff,0x09,0x14,0x00,0xff,0x09,0x13,0x00, 0xff,0x12,0x1b,0x07,0xff,0x18,0x1d,0x0d,0xff,0x24,0x31,0x1f,0xff,0x46,0x57, 0x4d,0xff,0x74,0x97,0x8e,0xff,0x8d,0xb7,0xb2,0xff,0x7b,0x9b,0x9e,0xff,0x55, 0x67,0x67,0xff,0x26,0x33,0x2c,0xff,0x12,0x1e,0x07,0xff,0x24,0x2c,0x1b,0xff, 0x2d,0x37,0x2b,0xff,0x24,0x2e,0x21,0xff,0x26,0x2e,0x21,0xff,0x28,0x2d,0x22, 0xff,0x2d,0x3f,0x2a,0xff,0x33,0x48,0x35,0xff,0x2e,0x3e,0x2e,0xff,0x1c,0x2b, 0x12,0xff,0x14,0x23,0x03,0xff,0x24,0x32,0x0f,0xff,0x5f,0x92,0x1c,0xff,0x54, 0x8b,0x0d,0xff,0x50,0x87,0x0b,0xff,0x52,0x96,0x06,0xff,0x9a,0xff,0x0d,0xff, 0x68,0xa2,0x19,0xff,0x23,0x28,0x1e,0xff,0x2e,0x39,0x2a,0xff,0x34,0x42,0x37, 0xff,0x34,0x49,0x43,0xff,0x24,0x30,0x21,0xff,0x17,0x23,0x06,0xff,0x2a,0x34, 0x23,0xff,0x34,0x3b,0x32,0xff,0x40,0x47,0x3b,0xff,0x45,0x4e,0x43,0xff,0x59, 0x72,0x5b,0xff,0x7f,0x9c,0x85,0xff,0x92,0xaf,0xa6,0xff,0x90,0xb3,0xa9,0xff, 0xd0,0xe0,0xc1,0xd2,0xff,0xff,0xbe,0x74,0xff,0xff,0xbe,0x5a,0xff,0xff,0xbe, 0x44,0xff,0xff,0xbe,0x31,0xff,0xff,0xbe,0x21,0xff,0xff,0xbe,0x15,0xff,0xff, 0xbe,0x0b,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe,0x01,0x87,0xff,0xff,0xbe,0x00, 0x6a,0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x08,0xff,0xff,0xbe,0x11,0xff,0xff, 0xbe,0x1d,0xff,0xff,0xbe,0x2c,0xff,0xff,0xbe,0x3e,0xff,0xff,0xbe,0x53,0xff, 0xff,0xbe,0x6b,0xf7,0xf7,0xba,0x88,0xcf,0xd9,0xaf,0xb8,0x9a,0xad,0x94,0xf3, 0x7f,0x92,0x7e,0xff,0x7d,0x8e,0x7c,0xff,0x84,0x96,0x84,0xff,0x8a,0x9b,0x89, 0xff,0x8c,0x9e,0x8a,0xff,0x8c,0x9e,0x8b,0xff,0x8b,0x9c,0x8b,0xff,0x89,0x9a, 0x8a,0xff,0x88,0x99,0x89,0xff,0x7d,0x8e,0x7d,0xff,0x6c,0x7e,0x6e,0xff,0x72, 0x82,0x78,0xff,0x73,0x89,0x7b,0xff,0x70,0x88,0x79,0xff,0x7c,0x93,0x83,0xff, 0x7d,0x94,0x88,0xff,0x7b,0x92,0x85,0xff,0x7b,0x92,0x84,0xff,0x79,0x91,0x84, 0xff,0x77,0x90,0x83,0xff,0x76,0x90,0x83,0xff,0x76,0x90,0x81,0xff,0x76,0x8c, 0x7f,0xff,0x74,0x8a,0x7d,0xff,0x73,0x8b,0x7d,0xff,0x71,0x8a,0x7b,0xff,0x70, 0x8a,0x7b,0xff,0x70,0x86,0x7b,0xff,0x71,0x82,0x78,0xff,0x6e,0x84,0x7a,0xff, 0x70,0x81,0x74,0xff,0x71,0x7d,0x73,0xff,0x6c,0x7f,0x73,0xff,0x69,0x80,0x73, 0xff,0x68,0x7c,0x6e,0xff,0x59,0x73,0x71,0xff,0x12,0x18,0x0e,0xff,0x31,0x3a, 0x2a,0xff,0x0e,0x16,0x05,0xff,0x1d,0x2a,0x13,0xff,0x48,0x58,0x4b,0xff,0x0f, 0x19,0x04,0xff,0x0e,0x19,0x01,0xff,0x09,0x11,0x00,0xff,0x06,0x0d,0x00,0xff, 0x0a,0x0f,0x00,0xff,0x11,0x14,0x02,0xff,0x14,0x1c,0x0a,0xff,0x22,0x29,0x1c, 0xff,0x3f,0x4f,0x43,0xff,0x6c,0x84,0x7f,0xff,0x8f,0xb2,0xab,0xff,0x7c,0x95, 0x97,0xff,0x38,0x49,0x43,0xff,0x1e,0x27,0x19,0xff,0x2b,0x34,0x28,0xff,0x22, 0x2e,0x21,0xff,0x24,0x2e,0x21,0xff,0x25,0x2d,0x22,0xff,0x2d,0x3f,0x29,0xff, 0x33,0x46,0x33,0xff,0x2e,0x3e,0x30,0xff,0x1c,0x2a,0x0d,0xff,0x15,0x21,0x03, 0xff,0x1e,0x2b,0x0a,0xff,0x5b,0x83,0x1a,0xff,0x66,0xa4,0x0a,0xff,0x66,0xb2, 0x0d,0xff,0x58,0x96,0x0d,0xff,0x5f,0x9e,0x06,0xff,0x5f,0x90,0x1a,0xff,0x23, 0x2b,0x21,0xff,0x2d,0x37,0x2a,0xff,0x32,0x3d,0x30,0xff,0x34,0x47,0x42,0xff, 0x24,0x34,0x23,0xff,0x17,0x23,0x06,0xff,0x2a,0x34,0x23,0xff,0x32,0x3b,0x30, 0xff,0x40,0x45,0x3b,0xff,0x43,0x4e,0x40,0xff,0x66,0x7f,0x70,0xff,0x92,0xb4, 0xa9,0xff,0x98,0xb6,0xb2,0xff,0x90,0xab,0xa6,0xff,0xd5,0xe5,0xd8,0xfb,0xfa, 0xfd,0xbe,0x7b,0xff,0xff,0xbe,0x5c,0xff,0xff,0xbe,0x46,0xff,0xff,0xbe,0x33, 0xff,0xff,0xbe,0x23,0xff,0xff,0xbe,0x16,0xff,0xff,0xbe,0x0c,0xff,0xff,0xbe, 0x05,0xff,0xff,0xbe,0x01,0x87,0xff,0xff,0xbe,0x00,0x43,0xff,0xff,0xbe,0x03, 0xff,0xff,0xbe,0x08,0xff,0xff,0xbe,0x11,0xff,0xff,0xbe,0x1d,0xff,0xff,0xbe, 0x2c,0xff,0xff,0xbe,0x3e,0xff,0xff,0xbe,0x53,0xff,0xff,0xbe,0x6c,0xf6,0xf6, 0xbb,0x88,0xc8,0xd4,0xa9,0xbc,0x8c,0xa0,0x88,0xf5,0x7c,0x8f,0x7c,0xff,0x83, 0x96,0x82,0xff,0x8c,0x9f,0x8a,0xff,0x8c,0x9f,0x8c,0xff,0x8c,0x9f,0x8b,0xff, 0x8c,0x9e,0x8c,0xff,0x8b,0x9c,0x8b,0xff,0x8b,0x9b,0x8b,0xff,0x86,0x98,0x88, 0xff,0x74,0x88,0x76,0xff,0x69,0x7c,0x6d,0xff,0x6e,0x7f,0x73,0xff,0x73,0x89, 0x7c,0xff,0x6c,0x81,0x74,0xff,0x7a,0x8e,0x81,0xff,0x7e,0x94,0x88,0xff,0x7c, 0x93,0x85,0xff,0x7c,0x92,0x84,0xff,0x7a,0x91,0x84,0xff,0x78,0x90,0x83,0xff, 0x77,0x8f,0x82,0xff,0x76,0x90,0x81,0xff,0x76,0x8c,0x7f,0xff,0x74,0x8a,0x7d, 0xff,0x73,0x89,0x7b,0xff,0x72,0x8a,0x7b,0xff,0x70,0x8a,0x7b,0xff,0x70,0x86, 0x7b,0xff,0x71,0x82,0x79,0xff,0x6e,0x84,0x79,0xff,0x70,0x81,0x74,0xff,0x6d, 0x80,0x73,0xff,0x69,0x82,0x74,0xff,0x6a,0x80,0x73,0xff,0x68,0x7b,0x6f,0xff, 0x5b,0x75,0x70,0xff,0x12,0x1a,0x0b,0xff,0x2f,0x3a,0x26,0xff,0x11,0x1a,0x07, 0xff,0x0c,0x13,0x00,0xff,0x49,0x55,0x41,0xff,0x29,0x30,0x24,0xff,0x0f,0x15, 0x00,0xff,0x0d,0x14,0x00,0xff,0x09,0x11,0x00,0xff,0x0a,0x11,0x00,0xff,0x07, 0x0d,0x00,0xff,0x10,0x14,0x00,0xff,0x1c,0x22,0x08,0xff,0x13,0x1a,0x05,0xff, 0x1b,0x21,0x12,0xff,0x2c,0x34,0x1f,0xff,0x42,0x53,0x40,0xff,0x52,0x5f,0x54, 0xff,0x31,0x3d,0x33,0xff,0x2a,0x34,0x27,0xff,0x82,0x24,0x2e,0x21,0xff,0x25, 0x25,0x2d,0x22,0xff,0x2c,0x3b,0x29,0xff,0x30,0x46,0x33,0xff,0x30,0x40,0x2e, 0xff,0x1a,0x2a,0x0b,0xff,0x17,0x23,0x05,0xff,0x1e,0x26,0x03,0xff,0x30,0x3b, 0x17,0xff,0x54,0x78,0x1c,0xff,0x54,0x98,0x0f,0xff,0x54,0xa2,0x0a,0xff,0x70, 0xc1,0x0a,0xff,0x78,0xb2,0x17,0xff,0x28,0x2a,0x1c,0xff,0x32,0x34,0x2a,0xff, 0x32,0x3d,0x2b,0xff,0x32,0x49,0x36,0xff,0x28,0x36,0x23,0xff,0x17,0x24,0x03, 0xff,0x28,0x34,0x21,0xff,0x32,0x3d,0x2e,0xff,0x40,0x45,0x37,0xff,0x42,0x4d, 0x40,0xff,0x6c,0x85,0x74,0xff,0xa0,0xbf,0xb8,0xff,0x9c,0xbb,0xb4,0xff,0x92, 0xa6,0xa6,0xff,0xbf,0xe1,0xbf,0xfa,0xfb,0xfe,0xbd,0x7b,0xff,0xff,0xbe,0x5e, 0xff,0xff,0xbe,0x47,0xff,0xff,0xbe,0x34,0xff,0xff,0xbe,0x24,0xff,0xff,0xbe, 0x16,0xff,0xff,0xbe,0x0c,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe,0x02,0x87,0xff, 0xff,0xbe,0x00,0x6a,0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x08,0xff,0xff,0xbe, 0x11,0xff,0xff,0xbe,0x1d,0xff,0xff,0xbe,0x2b,0xff,0xff,0xbe,0x3e,0xff,0xff, 0xbe,0x53,0xff,0xff,0xbe,0x6b,0xf6,0xfa,0xbc,0x8a,0xc5,0xd3,0xa8,0xc1,0x86, 0x98,0x81,0xf6,0x80,0x92,0x7f,0xff,0x8a,0x9d,0x89,0xff,0x8f,0xa3,0x8d,0xff, 0x8f,0xa2,0x8d,0xff,0x8d,0x9f,0x8c,0xff,0x8c,0x9e,0x8b,0xff,0x8c,0x9d,0x8c, 0xff,0x8c,0x9c,0x8c,0xff,0x82,0x96,0x84,0xff,0x6f,0x84,0x72,0xff,0x6e,0x80, 0x72,0xff,0x71,0x83,0x78,0xff,0x6f,0x82,0x77,0xff,0x67,0x7b,0x6f,0xff,0x76, 0x8b,0x7f,0xff,0x7e,0x96,0x86,0xff,0x7d,0x96,0x83,0xff,0x7c,0x93,0x84,0xff, 0x7b,0x92,0x83,0xff,0x79,0x90,0x83,0xff,0x79,0x8c,0x82,0xff,0x78,0x8d,0x80, 0xff,0x74,0x8b,0x7e,0xff,0x73,0x8a,0x7c,0xff,0x71,0x8a,0x7a,0xff,0x71,0x8a, 0x7b,0xff,0x70,0x8a,0x7b,0xff,0x70,0x86,0x7a,0xff,0x6f,0x85,0x79,0xff,0x6e, 0x84,0x78,0xff,0x6d,0x82,0x78,0xff,0x6b,0x82,0x76,0xff,0x68,0x82,0x74,0xff, 0x69,0x80,0x73,0xff,0x67,0x7b,0x6f,0xff,0x5b,0x70,0x6e,0xff,0x13,0x1c,0x0d, 0xff,0x2e,0x3a,0x26,0xff,0x11,0x1d,0x08,0xff,0x0c,0x10,0x00,0xff,0x21,0x28, 0x12,0xff,0x4f,0x5f,0x52,0xff,0x10,0x19,0x04,0xff,0x0b,0x13,0x00,0xff,0x0c, 0x11,0x00,0xff,0x0a,0x11,0x00,0xff,0x07,0x0d,0x00,0xff,0x08,0x11,0x00,0xff, 0x0a,0x13,0x00,0xff,0x0a,0x12,0x00,0xff,0x17,0x20,0x07,0xff,0x2d,0x35,0x19, 0xff,0x25,0x2e,0x1f,0xff,0x1f,0x27,0x19,0xff,0x26,0x2f,0x19,0xff,0x30,0x3a, 0x2a,0xff,0x22,0x2a,0x21,0xff,0x28,0x2c,0x21,0xff,0x28,0x2d,0x22,0xff,0x29, 0x3b,0x25,0xff,0x30,0x48,0x31,0xff,0x32,0x41,0x2e,0xff,0x19,0x26,0x08,0xff, 0x17,0x20,0x03,0xff,0x23,0x2b,0x08,0xff,0x2b,0x34,0x1e,0xff,0x2a,0x2d,0x21, 0xff,0x42,0x5d,0x19,0xff,0x58,0x83,0x19,0xff,0x66,0xa0,0x17,0xff,0x4e,0x74, 0x12,0xff,0x28,0x26,0x17,0xff,0x32,0x34,0x2a,0xff,0x2a,0x3d,0x2a,0xff,0x32, 0x47,0x37,0xff,0x2a,0x36,0x26,0xff,0x17,0x24,0x05,0xff,0x28,0x34,0x1e,0xff, 0x32,0x3b,0x2e,0xff,0x3e,0x45,0x36,0xff,0x42,0x4d,0x40,0xff,0x6a,0x83,0x70, 0xff,0xa9,0xc4,0xbb,0xff,0x87,0xa2,0x9e,0xff,0x75,0x95,0x83,0xff,0xcd,0xdc, 0xb6,0xc1,0xff,0xff,0xbe,0x79,0xff,0xff,0xbe,0x5f,0xff,0xff,0xbe,0x48,0xff, 0xff,0xbe,0x35,0xff,0xff,0xbe,0x24,0xff,0xff,0xbe,0x17,0xff,0xff,0xbe,0x0d, 0xff,0xff,0xbe,0x06,0xff,0xff,0xbe,0x02,0x87,0xff,0xff,0xbe,0x00,0x43,0xff, 0xff,0xbe,0x02,0xff,0xff,0xbe,0x08,0xff,0xff,0xbe,0x10,0xff,0xff,0xbe,0x1c, 0xff,0xff,0xbe,0x2b,0xff,0xff,0xbe,0x3c,0xff,0xff,0xbe,0x51,0xff,0xff,0xbe, 0x6a,0xf4,0xf6,0xb9,0x8a,0xc8,0xd4,0xa8,0xbd,0x8c,0x9e,0x86,0xf5,0x89,0x9a, 0x86,0xff,0x8f,0xa2,0x8c,0xff,0x91,0xa5,0x8d,0xff,0x90,0xa5,0x8e,0xff,0x8e, 0xa0,0x8c,0xff,0x8c,0x9f,0x8b,0xff,0x8c,0x9e,0x8c,0xff,0x8c,0x9d,0x8c,0xff, 0x7f,0x91,0x80,0xff,0x6c,0x80,0x70,0xff,0x6a,0x7c,0x6f,0xff,0x6c,0x7e,0x72, 0xff,0x67,0x7a,0x6d,0xff,0x64,0x77,0x69,0xff,0x77,0x89,0x7c,0xff,0x80,0x96, 0x84,0xff,0x7e,0x96,0x82,0xff,0x7c,0x93,0x84,0xff,0x7b,0x93,0x81,0xff,0x78, 0x91,0x82,0xff,0x78,0x8e,0x83,0xff,0x77,0x8d,0x80,0xff,0x77,0x8b,0x7f,0xff, 0x72,0x8a,0x7c,0xff,0x70,0x8a,0x7b,0xff,0x71,0x8a,0x7b,0xff,0x70,0x89,0x7b, 0xff,0x70,0x86,0x7b,0xff,0x6f,0x85,0x79,0xff,0x6c,0x83,0x77,0xff,0x6b,0x82, 0x76,0xff,0x69,0x82,0x74,0xff,0x68,0x82,0x74,0xff,0x69,0x80,0x73,0xff,0x67, 0x7c,0x73,0xff,0x59,0x73,0x73,0xff,0x11,0x1a,0x0e,0xff,0x2e,0x38,0x26,0xff, 0x12,0x1b,0x09,0xff,0x0c,0x13,0x00,0xff,0x04,0x0a,0x00,0xff,0x3b,0x4c,0x3b, 0xff,0x3c,0x4e,0x41,0xff,0x0a,0x14,0x02,0xff,0x09,0x11,0x00,0xff,0x07,0x10, 0x00,0xff,0x06,0x0d,0x00,0xff,0x08,0x0e,0x00,0xff,0x08,0x10,0x00,0xff,0x08, 0x0e,0x00,0xff,0x09,0x12,0x01,0xff,0x0f,0x1d,0x05,0xff,0x1f,0x2c,0x18,0xff, 0x27,0x2e,0x23,0xff,0x27,0x2f,0x23,0xff,0x30,0x37,0x28,0xff,0x82,0x24,0x2c, 0x21,0xff,0x25,0x25,0x2d,0x22,0xff,0x29,0x3a,0x27,0xff,0x2c,0x46,0x2e,0xff, 0x2b,0x41,0x2b,0xff,0x20,0x2b,0x12,0xff,0x12,0x1c,0x00,0xff,0x47,0x56,0x3d, 0xff,0x72,0x87,0x7a,0xff,0x5f,0x76,0x6c,0xff,0x58,0x6c,0x64,0xff,0x5b,0x74, 0x66,0xff,0x4e,0x66,0x5f,0xff,0x40,0x5d,0x4e,0xff,0x4d,0x59,0x4e,0xff,0x2e, 0x34,0x28,0xff,0x2e,0x3b,0x2a,0xff,0x2d,0x43,0x34,0xff,0x26,0x37,0x26,0xff, 0x19,0x28,0x03,0xff,0x24,0x32,0x1a,0xff,0x30,0x3b,0x2e,0xff,0x3d,0x45,0x37, 0xff,0x45,0x4e,0x40,0xff,0x52,0x61,0x50,0xff,0x56,0x6a,0x5b,0xff,0x6d,0x87, 0x74,0xff,0xc5,0xd3,0xb2,0xc8,0xff,0xff,0xbe,0x80,0xff,0xff,0xbe,0x7a,0xff, 0xff,0xbe,0x60,0xff,0xff,0xbe,0x49,0xff,0xff,0xbe,0x36,0xff,0xff,0xbe,0x25, 0xff,0xff,0xbe,0x17,0xff,0xff,0xbe,0x0d,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe, 0x02,0x87,0xff,0xff,0xbe,0x00,0x3a,0xff,0xff,0xbe,0x02,0xff,0xff,0xbe,0x07, 0xff,0xff,0xbe,0x0f,0xff,0xff,0xbe,0x1b,0xff,0xff,0xbe,0x29,0xff,0xff,0xbe, 0x3b,0xff,0xff,0xbe,0x50,0xff,0xff,0xbe,0x67,0xf9,0xfd,0xbc,0x83,0xd6,0xdd, 0xad,0xaa,0x9c,0xad,0x91,0xeb,0x8f,0xa3,0x8c,0xfe,0x91,0xa6,0x8e,0xff,0x91, 0xa7,0x8e,0xff,0x91,0xa6,0x8e,0xff,0x8e,0xa2,0x8c,0xff,0x8c,0xa2,0x8b,0xff, 0x8a,0xa0,0x8c,0xff,0x8a,0x9f,0x8c,0xff,0x7d,0x8e,0x7d,0xff,0x6d,0x80,0x71, 0xff,0x69,0x7c,0x6d,0xff,0x66,0x78,0x6b,0xff,0x66,0x78,0x6a,0xff,0x65,0x79, 0x6a,0xff,0x70,0x84,0x77,0xff,0x7b,0x91,0x82,0xff,0x7e,0x96,0x86,0xff,0x7d, 0x94,0x85,0xff,0x7a,0x93,0x83,0xff,0x78,0x90,0x82,0xff,0x76,0x90,0x82,0xff, 0x77,0x8e,0x80,0xff,0x77,0x8c,0x7f,0xff,0x73,0x8a,0x7b,0xff,0x71,0x8a,0x7b, 0xff,0x70,0x8a,0x7b,0xff,0x70,0x88,0x7a,0xff,0x70,0x85,0x7b,0xff,0x6e,0x85, 0x7a,0xff,0x6c,0x82,0x77,0xff,0x6a,0x82,0x76,0xff,0x68,0x82,0x74,0xff,0x67, 0x82,0x74,0xff,0x68,0x7f,0x73,0xff,0x68,0x7b,0x70,0xff,0x5d,0x74,0x74,0xff, 0x12,0x1a,0x10,0xff,0x2e,0x38,0x27,0xff,0x20,0x2c,0x1d,0xff,0x08,0x13,0x01, 0xff,0x03,0x0b,0x00,0xff,0x0e,0x19,0x07,0xff,0x65,0x80,0x6f,0xff,0x3d,0x4d, 0x46,0xff,0x18,0x21,0x11,0xff,0x08,0x15,0x00,0xff,0x06,0x0d,0x00,0xff,0x82, 0x08,0x0e,0x00,0xff,0x2e,0x08,0x10,0x00,0xff,0x08,0x11,0x00,0xff,0x07,0x0f, 0x00,0xff,0x14,0x20,0x08,0xff,0x27,0x2e,0x23,0xff,0x29,0x33,0x26,0xff,0x30, 0x38,0x28,0xff,0x25,0x2e,0x1f,0xff,0x26,0x2b,0x21,0xff,0x25,0x2d,0x22,0xff, 0x2a,0x3b,0x29,0xff,0x2c,0x43,0x30,0xff,0x2b,0x40,0x27,0xff,0x2a,0x36,0x1c, 0xff,0x15,0x23,0x03,0xff,0x3e,0x4e,0x37,0xff,0x4e,0x68,0x5b,0xff,0x72,0x8b, 0x7d,0xff,0x62,0x87,0x78,0xff,0x6e,0x96,0x85,0xff,0x74,0x9a,0x89,0xff,0x74, 0x98,0x89,0xff,0x7a,0x98,0x8b,0xff,0x40,0x4d,0x3d,0xff,0x2a,0x39,0x28,0xff, 0x2e,0x45,0x36,0xff,0x2a,0x37,0x28,0xff,0x19,0x24,0x06,0xff,0x24,0x30,0x17, 0xff,0x32,0x39,0x2e,0xff,0x39,0x43,0x36,0xff,0x45,0x4e,0x40,0xff,0x4b,0x54, 0x47,0xff,0x56,0x62,0x50,0xff,0x78,0x93,0x80,0xff,0xcc,0xda,0xc1,0xe2,0xff, 0xff,0xbe,0x80,0xff,0xff,0xbe,0x7c,0xff,0xff,0xbe,0x62,0xff,0xff,0xbe,0x4b, 0xff,0xff,0xbe,0x37,0xff,0xff,0xbe,0x26,0xff,0xff,0xbe,0x18,0xff,0xff,0xbe, 0x0e,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe,0x02,0x87,0xff,0xff,0xbe,0x00,0x3b, 0xff,0xff,0xbe,0x02,0xff,0xff,0xbe,0x07,0xff,0xff,0xbe,0x0e,0xff,0xff,0xbe, 0x19,0xff,0xff,0xbe,0x28,0xff,0xff,0xbe,0x39,0xff,0xff,0xbe,0x4d,0xff,0xff, 0xbe,0x65,0xff,0xff,0xbe,0x7f,0xe8,0xed,0xb5,0x95,0xb0,0xbf,0x9e,0xdb,0x97, 0xaa,0x93,0xfb,0x92,0xa8,0x8f,0xff,0x91,0xa7,0x8e,0xff,0x91,0xa7,0x8f,0xff, 0x8f,0xa4,0x8d,0xff,0x8d,0xa2,0x8c,0xff,0x8c,0xa2,0x8c,0xff,0x8b,0xa0,0x8c, 0xff,0x7c,0x8f,0x7d,0xff,0x6f,0x81,0x73,0xff,0x6b,0x7e,0x6f,0xff,0x6d,0x7e, 0x71,0xff,0x6d,0x7e,0x6f,0xff,0x71,0x82,0x74,0xff,0x6c,0x80,0x73,0xff,0x73, 0x8b,0x7e,0xff,0x7e,0x94,0x88,0xff,0x7d,0x94,0x84,0xff,0x7b,0x92,0x82,0xff, 0x7a,0x8f,0x82,0xff,0x77,0x8f,0x83,0xff,0x77,0x8e,0x80,0xff,0x76,0x8b,0x7f, 0xff,0x74,0x8a,0x7d,0xff,0x72,0x8b,0x7c,0xff,0x71,0x89,0x7b,0xff,0x72,0x84, 0x79,0xff,0x70,0x85,0x7a,0xff,0x6e,0x84,0x79,0xff,0x6c,0x82,0x77,0xff,0x69, 0x82,0x76,0xff,0x68,0x82,0x74,0xff,0x68,0x82,0x73,0xff,0x69,0x7f,0x73,0xff, 0x69,0x7a,0x71,0xff,0x5e,0x74,0x74,0xff,0x13,0x1c,0x11,0xff,0x2b,0x35,0x23, 0xff,0x38,0x47,0x39,0xff,0x1b,0x23,0x12,0xff,0x05,0x0c,0x00,0xff,0x03,0x0b, 0x00,0xff,0x26,0x38,0x20,0xff,0x6e,0x83,0x81,0xff,0x4f,0x60,0x60,0xff,0x35, 0x47,0x3e,0xff,0x19,0x25,0x14,0xff,0x0e,0x16,0x04,0xff,0x82,0x08,0x0e,0x00, 0xff,0x2d,0x08,0x11,0x00,0xff,0x0a,0x12,0x00,0xff,0x0d,0x18,0x01,0xff,0x21, 0x2c,0x1a,0xff,0x27,0x2f,0x26,0xff,0x2d,0x37,0x28,0xff,0x22,0x2a,0x1e,0xff, 0x28,0x28,0x21,0xff,0x26,0x2a,0x22,0xff,0x29,0x3d,0x29,0xff,0x2b,0x43,0x33, 0xff,0x29,0x40,0x29,0xff,0x20,0x2d,0x10,0xff,0x1a,0x23,0x03,0xff,0x1c,0x28, 0x06,0xff,0x20,0x2b,0x0f,0xff,0x32,0x37,0x28,0xff,0x2a,0x34,0x26,0xff,0x30, 0x3d,0x2d,0xff,0x34,0x3e,0x2a,0xff,0x32,0x3e,0x2b,0xff,0x2d,0x3d,0x2e,0xff, 0x36,0x42,0x34,0xff,0x2a,0x3b,0x2a,0xff,0x2e,0x45,0x37,0xff,0x2b,0x39,0x30, 0xff,0x19,0x26,0x0a,0xff,0x20,0x2d,0x17,0xff,0x30,0x3b,0x2d,0xff,0x37,0x42, 0x32,0xff,0x43,0x4e,0x40,0xff,0x4e,0x59,0x4e,0xff,0x5f,0x6c,0x5b,0xff,0x6a, 0x87,0x74,0xff,0x92,0xba,0xa5,0xff,0xdf,0xeb,0xc0,0xae,0xff,0xff,0xbe,0x7e, 0xff,0xff,0xbe,0x63,0xff,0xff,0xbe,0x4c,0xff,0xff,0xbe,0x38,0xff,0xff,0xbe, 0x27,0xff,0xff,0xbe,0x19,0xff,0xff,0xbe,0x0e,0xff,0xff,0xbe,0x07,0xff,0xff, 0xbe,0x02,0x87,0xff,0xff,0xbe,0x00,0x4e,0xff,0xff,0xbe,0x02,0xff,0xff,0xbe, 0x06,0xff,0xff,0xbe,0x0d,0xff,0xff,0xbe,0x18,0xff,0xff,0xbe,0x26,0xff,0xff, 0xbe,0x37,0xff,0xff,0xbe,0x4b,0xff,0xff,0xbe,0x62,0xff,0xff,0xbe,0x7c,0xed, 0xf2,0xb9,0x8e,0xbb,0xc8,0xa3,0xd2,0x99,0xad,0x95,0xf9,0x93,0xa8,0x90,0xff, 0x91,0xa7,0x8f,0xff,0x92,0xa8,0x90,0xff,0x91,0xa6,0x8f,0xff,0x8f,0xa3,0x8d, 0xff,0x8e,0xa0,0x8d,0xff,0x8e,0x9f,0x8d,0xff,0x80,0x91,0x80,0xff,0x73,0x84, 0x77,0xff,0x6b,0x7d,0x71,0xff,0x6e,0x80,0x72,0xff,0x6e,0x7e,0x6f,0xff,0x77, 0x88,0x78,0xff,0x69,0x7d,0x6d,0xff,0x74,0x8c,0x7c,0xff,0x7e,0x96,0x84,0xff, 0x7d,0x96,0x81,0xff,0x7b,0x92,0x81,0xff,0x7a,0x8f,0x81,0xff,0x77,0x90,0x83, 0xff,0x76,0x8c,0x80,0xff,0x74,0x8a,0x7e,0xff,0x74,0x8a,0x7d,0xff,0x73,0x8a, 0x7b,0xff,0x70,0x89,0x7a,0xff,0x73,0x85,0x7a,0xff,0x6f,0x85,0x7b,0xff,0x6e, 0x84,0x79,0xff,0x6e,0x80,0x74,0xff,0x69,0x81,0x74,0xff,0x68,0x82,0x74,0xff, 0x67,0x82,0x74,0xff,0x69,0x7f,0x72,0xff,0x67,0x7b,0x71,0xff,0x5d,0x78,0x78, 0xff,0x15,0x1d,0x11,0xff,0x2b,0x37,0x23,0xff,0x22,0x36,0x1e,0xff,0x39,0x45, 0x33,0xff,0x0c,0x13,0x00,0xff,0x08,0x0e,0x00,0xff,0x06,0x0c,0x00,0xff,0x27, 0x3d,0x26,0xff,0x3e,0x54,0x46,0xff,0x5f,0x75,0x6f,0xff,0x66,0x7e,0x7a,0xff, 0x46,0x57,0x4f,0xff,0x28,0x34,0x28,0xff,0x17,0x21,0x0e,0xff,0x0c,0x1c,0x03, 0xff,0x0c,0x15,0x00,0xff,0x08,0x14,0x00,0xff,0x19,0x23,0x0b,0xff,0x27,0x2f, 0x26,0xff,0x2d,0x38,0x28,0xff,0x24,0x2c,0x19,0xff,0x29,0x2b,0x1a,0xff,0x28, 0x2a,0x20,0xff,0x2a,0x38,0x27,0xff,0x2b,0x41,0x29,0xff,0x2b,0x40,0x29,0xff, 0x24,0x2e,0x17,0xff,0x1c,0x24,0x03,0xff,0x20,0x26,0x05,0xff,0x21,0x2d,0x0f, 0xff,0x26,0x30,0x17,0xff,0x82,0x28,0x30,0x17,0xff,0x1a,0x24,0x2e,0x15,0xff, 0x24,0x2e,0x17,0xff,0x21,0x2d,0x17,0xff,0x28,0x30,0x21,0xff,0x2e,0x39,0x26, 0xff,0x30,0x43,0x34,0xff,0x2b,0x3d,0x30,0xff,0x19,0x24,0x0a,0xff,0x1e,0x2a, 0x12,0xff,0x2e,0x37,0x2d,0xff,0x37,0x40,0x32,0xff,0x45,0x4e,0x40,0xff,0x4d, 0x58,0x49,0xff,0x5f,0x78,0x61,0xff,0x78,0x98,0x81,0xff,0x7f,0x9c,0x96,0xff, 0xcf,0xdb,0xce,0xf5,0xff,0xff,0xbe,0x80,0xff,0xff,0xbe,0x65,0xff,0xff,0xbe, 0x4e,0xff,0xff,0xbe,0x39,0xff,0xff,0xbe,0x28,0xff,0xff,0xbe,0x1a,0xff,0xff, 0xbe,0x0f,0xff,0xff,0xbe,0x07,0xff,0xff,0xbe,0x02,0x87,0xff,0xff,0xbe,0x00, 0x17,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe,0x0d,0xff,0xff, 0xbe,0x17,0xff,0xff,0xbe,0x25,0xff,0xff,0xbe,0x35,0xff,0xff,0xbe,0x49,0xff, 0xff,0xbe,0x60,0xff,0xff,0xbe,0x7a,0xed,0xf2,0xb9,0x8e,0xbd,0xca,0xa5,0xd1, 0x9b,0xae,0x96,0xf9,0x93,0xa8,0x90,0xff,0x91,0xa7,0x8f,0xff,0x92,0xa8,0x90, 0xff,0x92,0xa7,0x90,0xff,0x90,0xa5,0x8e,0xff,0x8e,0xa2,0x8d,0xff,0x8f,0xa2, 0x8d,0xff,0x84,0x97,0x83,0xff,0x79,0x8a,0x7c,0xff,0x70,0x81,0x76,0xff,0x6e, 0x80,0x71,0xff,0x82,0x72,0x84,0x74,0xff,0x51,0x6c,0x7f,0x6e,0xff,0x7c,0x92, 0x7f,0xff,0x7f,0x97,0x83,0xff,0x7d,0x94,0x80,0xff,0x7c,0x90,0x81,0xff,0x7a, 0x8e,0x82,0xff,0x79,0x8e,0x82,0xff,0x76,0x8d,0x80,0xff,0x74,0x8a,0x7d,0xff, 0x72,0x89,0x7a,0xff,0x71,0x8a,0x7b,0xff,0x71,0x89,0x7b,0xff,0x71,0x86,0x7a, 0xff,0x6f,0x84,0x7a,0xff,0x6d,0x83,0x78,0xff,0x70,0x7f,0x73,0xff,0x6b,0x7f, 0x76,0xff,0x67,0x81,0x74,0xff,0x67,0x80,0x73,0xff,0x6a,0x7e,0x72,0xff,0x68, 0x7b,0x71,0xff,0x5d,0x78,0x78,0xff,0x13,0x1d,0x10,0xff,0x2d,0x39,0x25,0xff, 0x12,0x1f,0x0a,0xff,0x3a,0x48,0x36,0xff,0x20,0x29,0x14,0xff,0x09,0x11,0x00, 0xff,0x07,0x0e,0x00,0xff,0x07,0x11,0x00,0xff,0x1c,0x27,0x13,0xff,0x21,0x2d, 0x1e,0xff,0x42,0x54,0x48,0xff,0x71,0x8f,0x88,0xff,0x81,0xa2,0xa0,0xff,0x66, 0x7e,0x7a,0xff,0x47,0x59,0x50,0xff,0x30,0x3b,0x2f,0xff,0x1a,0x25,0x11,0xff, 0x10,0x1e,0x01,0xff,0x23,0x2c,0x1e,0xff,0x2f,0x37,0x28,0xff,0x25,0x31,0x17, 0xff,0x28,0x31,0x19,0xff,0x2a,0x2a,0x1c,0xff,0x2f,0x34,0x29,0xff,0x29,0x43, 0x29,0xff,0x2b,0x41,0x2b,0xff,0x23,0x30,0x14,0xff,0x20,0x2d,0x0a,0xff,0x2a, 0x36,0x1c,0xff,0x34,0x3e,0x2b,0xff,0x32,0x3e,0x28,0xff,0x36,0x40,0x2a,0xff, 0x36,0x40,0x2d,0xff,0x37,0x42,0x30,0xff,0x39,0x43,0x30,0xff,0x37,0x43,0x30, 0xff,0x40,0x4b,0x3b,0xff,0x36,0x40,0x32,0xff,0x30,0x42,0x30,0xff,0x2e,0x3d, 0x2a,0xff,0x1c,0x26,0x0a,0xff,0x20,0x2a,0x12,0xff,0x2e,0x39,0x2d,0xff,0x36, 0x40,0x32,0xff,0x45,0x4d,0x40,0xff,0x4e,0x58,0x4b,0xff,0x70,0x8b,0x7b,0xff, 0x87,0xa4,0x92,0xff,0x87,0xa4,0x9a,0xff,0x92,0xb7,0xa5,0xff,0xe6,0xf1,0xc5, 0xad,0xff,0xff,0xbe,0x67,0xff,0xff,0xbe,0x4f,0xff,0xff,0xbe,0x3b,0xff,0xff, 0xbe,0x29,0xff,0xff,0xbe,0x1b,0xff,0xff,0xbe,0x10,0xff,0xff,0xbe,0x07,0xff, 0xff,0xbe,0x03,0x87,0xff,0xff,0xbe,0x00,0x0e,0xff,0xff,0xbe,0x01,0xff,0xff, 0xbe,0x05,0xff,0xff,0xbe,0x0c,0xff,0xff,0xbe,0x16,0xff,0xff,0xbe,0x23,0xff, 0xff,0xbe,0x34,0xff,0xff,0xbe,0x47,0xff,0xff,0xbe,0x5e,0xff,0xff,0xbe,0x78, 0xed,0xf2,0xba,0x8f,0xbc,0xca,0xa5,0xd3,0x9b,0xad,0x97,0xf9,0x93,0xa8,0x91, 0xff,0x92,0xa8,0x90,0xff,0x82,0x93,0xa8,0x90,0xff,0x12,0x92,0xa6,0x8f,0xff, 0x90,0xa4,0x8e,0xff,0x8f,0xa4,0x8e,0xff,0x88,0x9b,0x89,0xff,0x7b,0x8d,0x7d, 0xff,0x74,0x85,0x77,0xff,0x71,0x84,0x71,0xff,0x78,0x8a,0x79,0xff,0x70,0x81, 0x71,0xff,0x77,0x8a,0x7a,0xff,0x7f,0x97,0x83,0xff,0x7f,0x94,0x84,0xff,0x7f, 0x91,0x82,0xff,0x7e,0x8e,0x81,0xff,0x7c,0x8d,0x81,0xff,0x7c,0x8a,0x80,0xff, 0x77,0x8b,0x7f,0xff,0x76,0x8b,0x7e,0xff,0x82,0x73,0x89,0x7a,0xff,0x12,0x70, 0x89,0x7b,0xff,0x72,0x83,0x79,0xff,0x72,0x80,0x78,0xff,0x6e,0x82,0x77,0xff, 0x6f,0x7f,0x73,0xff,0x6d,0x80,0x73,0xff,0x68,0x81,0x73,0xff,0x68,0x7f,0x72, 0xff,0x6c,0x7d,0x71,0xff,0x68,0x7a,0x70,0xff,0x5b,0x76,0x76,0xff,0x12,0x1d, 0x12,0xff,0x2d,0x39,0x27,0xff,0x12,0x19,0x0b,0xff,0x1f,0x28,0x14,0xff,0x41, 0x50,0x3c,0xff,0x0c,0x13,0x00,0xff,0x09,0x13,0x00,0xff,0x82,0x07,0x0f,0x00, 0xff,0x32,0x0d,0x15,0x06,0xff,0x16,0x1c,0x0c,0xff,0x22,0x2a,0x1b,0xff,0x42, 0x54,0x47,0xff,0x78,0x96,0x8a,0xff,0x90,0xb3,0xa7,0xff,0x7e,0xa1,0x9c,0xff, 0x56,0x6a,0x66,0xff,0x22,0x2d,0x1f,0xff,0x19,0x23,0x13,0xff,0x2d,0x34,0x27, 0xff,0x22,0x2a,0x1c,0xff,0x23,0x2e,0x1e,0xff,0x26,0x28,0x1e,0xff,0x2c,0x34, 0x29,0xff,0x2b,0x41,0x2c,0xff,0x2c,0x43,0x32,0xff,0x20,0x30,0x17,0xff,0x1c, 0x2a,0x08,0xff,0x1c,0x2a,0x0d,0xff,0x1c,0x28,0x0d,0xff,0x19,0x2a,0x12,0xff, 0x1e,0x2b,0x12,0xff,0x1c,0x2b,0x14,0xff,0x21,0x2d,0x14,0xff,0x20,0x2d,0x0f, 0xff,0x1e,0x2a,0x10,0xff,0x2b,0x36,0x24,0xff,0x34,0x4d,0x3e,0xff,0x30,0x47, 0x39,0xff,0x30,0x3b,0x2b,0xff,0x1c,0x28,0x0b,0xff,0x1e,0x28,0x10,0xff,0x30, 0x39,0x2d,0xff,0x34,0x3e,0x30,0xff,0x42,0x4b,0x3e,0xff,0x50,0x59,0x4e,0xff, 0x81,0x9e,0x90,0xff,0x8d,0xad,0xa2,0xff,0x89,0xa9,0x9c,0xff,0x87,0xa6,0x9c, 0xff,0xd5,0xe3,0xc0,0xcb,0xff,0xff,0xbe,0x68,0xff,0xff,0xbe,0x51,0xff,0xff, 0xbe,0x3c,0xff,0xff,0xbe,0x2a,0xff,0xff,0xbe,0x1c,0xff,0xff,0xbe,0x10,0xff, 0xff,0xbe,0x08,0xff,0xff,0xbe,0x03,0x87,0xff,0xff,0xbe,0x00,0x0e,0xff,0xff, 0xbe,0x01,0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x0b,0xff,0xff,0xbe,0x15,0xff, 0xff,0xbe,0x22,0xff,0xff,0xbe,0x33,0xff,0xff,0xbe,0x46,0xff,0xff,0xbe,0x5c, 0xff,0xff,0xbe,0x76,0xef,0xf4,0xba,0x8f,0xc3,0xd1,0xaa,0xd0,0x9b,0xad,0x96, 0xf9,0x92,0xa8,0x90,0xff,0x93,0xa7,0x91,0xff,0x82,0x94,0xa7,0x91,0xff,0x5a, 0x93,0xa7,0x90,0xff,0x90,0xa6,0x8d,0xff,0x90,0xa5,0x8e,0xff,0x8c,0x9e,0x8b, 0xff,0x7c,0x8d,0x7d,0xff,0x77,0x86,0x77,0xff,0x78,0x89,0x77,0xff,0x76,0x88, 0x78,0xff,0x76,0x88,0x7a,0xff,0x80,0x91,0x83,0xff,0x81,0x96,0x84,0xff,0x80, 0x93,0x83,0xff,0x80,0x90,0x83,0xff,0x7d,0x8e,0x82,0xff,0x78,0x8e,0x82,0xff, 0x78,0x8c,0x83,0xff,0x78,0x8b,0x7f,0xff,0x74,0x8b,0x7e,0xff,0x74,0x88,0x7a, 0xff,0x76,0x85,0x79,0xff,0x70,0x88,0x7c,0xff,0x72,0x83,0x7a,0xff,0x70,0x81, 0x78,0xff,0x6e,0x83,0x78,0xff,0x6e,0x7f,0x73,0xff,0x6f,0x7e,0x72,0xff,0x6b, 0x80,0x74,0xff,0x68,0x80,0x73,0xff,0x6b,0x7d,0x71,0xff,0x67,0x7a,0x6d,0xff, 0x5b,0x76,0x79,0xff,0x13,0x1d,0x12,0xff,0x2b,0x35,0x25,0xff,0x16,0x1e,0x0f, 0xff,0x0e,0x13,0x01,0xff,0x4b,0x57,0x44,0xff,0x1f,0x2c,0x13,0xff,0x0a,0x13, 0x00,0xff,0x0a,0x12,0x00,0xff,0x07,0x10,0x00,0xff,0x06,0x0c,0x00,0xff,0x06, 0x0d,0x00,0xff,0x0d,0x15,0x03,0xff,0x1b,0x22,0x0e,0xff,0x1e,0x27,0x13,0xff, 0x35,0x43,0x2f,0xff,0x58,0x70,0x63,0xff,0x72,0x8c,0x84,0xff,0x5e,0x6f,0x6b, 0xff,0x2c,0x36,0x2c,0xff,0x28,0x30,0x23,0xff,0x25,0x2e,0x16,0xff,0x26,0x31, 0x14,0xff,0x23,0x2d,0x1b,0xff,0x2a,0x34,0x22,0xff,0x29,0x3f,0x29,0xff,0x2b, 0x40,0x2e,0xff,0x2a,0x3d,0x26,0xff,0x2a,0x3b,0x23,0xff,0x2a,0x39,0x26,0xff, 0x30,0x3d,0x2e,0xff,0x34,0x40,0x34,0xff,0x34,0x43,0x36,0xff,0x30,0x47,0x34, 0xff,0x32,0x45,0x32,0xff,0x30,0x40,0x2a,0xff,0x2d,0x3d,0x28,0xff,0x2e,0x40, 0x2e,0xff,0x34,0x4e,0x3e,0xff,0x34,0x4d,0x3b,0xff,0x32,0x40,0x2e,0xff,0x1c, 0x26,0x0a,0xff,0x1c,0x2a,0x0d,0xff,0x2e,0x39,0x2a,0xff,0x34,0x3d,0x2e,0xff, 0x42,0x4b,0x40,0xff,0x4d,0x59,0x4b,0xff,0x85,0xa6,0x8d,0xff,0x96,0xb6,0xa6, 0xff,0x83,0x9e,0x94,0xff,0x98,0xbd,0x9e,0xfe,0xe2,0xee,0xbb,0xa1,0xff,0xff, 0xbe,0x6a,0xff,0xff,0xbe,0x52,0xff,0xff,0xbe,0x3d,0xff,0xff,0xbe,0x2b,0xff, 0xff,0xbe,0x1c,0xff,0xff,0xbe,0x11,0xff,0xff,0xbe,0x08,0xff,0xff,0xbe,0x03, 0x88,0xff,0xff,0xbe,0x00,0x0d,0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x0b,0xff, 0xff,0xbe,0x15,0xff,0xff,0xbe,0x21,0xff,0xff,0xbe,0x32,0xff,0xff,0xbe,0x45, 0xff,0xff,0xbe,0x5b,0xff,0xff,0xbe,0x74,0xfa,0xfc,0xbd,0x88,0xd0,0xde,0xb1, 0xbb,0xa0,0xb3,0x97,0xf3,0x92,0xa7,0x8f,0xff,0x93,0xa7,0x91,0xff,0x82,0x93, 0xa8,0x90,0xff,0x01,0x93,0xa7,0x90,0xff,0x82,0x90,0xa6,0x8d,0xff,0x57,0x8e, 0xa2,0x8d,0xff,0x83,0x96,0x83,0xff,0x77,0x88,0x77,0xff,0x76,0x88,0x77,0xff, 0x79,0x8d,0x7d,0xff,0x7e,0x93,0x83,0xff,0x81,0x94,0x83,0xff,0x7f,0x96,0x84, 0xff,0x7e,0x93,0x85,0xff,0x7e,0x90,0x83,0xff,0x7b,0x8f,0x82,0xff,0x78,0x8f, 0x82,0xff,0x76,0x8f,0x81,0xff,0x76,0x8d,0x7f,0xff,0x74,0x8a,0x7e,0xff,0x73, 0x88,0x7a,0xff,0x73,0x85,0x7a,0xff,0x70,0x86,0x7b,0xff,0x70,0x85,0x7a,0xff, 0x6e,0x84,0x7a,0xff,0x6d,0x82,0x77,0xff,0x6a,0x82,0x74,0xff,0x69,0x81,0x74, 0xff,0x68,0x81,0x74,0xff,0x66,0x80,0x72,0xff,0x66,0x7f,0x71,0xff,0x65,0x7b, 0x70,0xff,0x5d,0x76,0x76,0xff,0x12,0x1d,0x12,0xff,0x25,0x34,0x23,0xff,0x18, 0x1f,0x11,0xff,0x06,0x10,0x00,0xff,0x1d,0x2f,0x18,0xff,0x3e,0x51,0x41,0xff, 0x09,0x14,0x00,0xff,0x08,0x13,0x00,0xff,0x07,0x11,0x00,0xff,0x07,0x10,0x00, 0xff,0x06,0x12,0x00,0xff,0x08,0x10,0x00,0xff,0x10,0x1b,0x04,0xff,0x0d,0x17, 0x01,0xff,0x13,0x1b,0x01,0xff,0x17,0x1d,0x0b,0xff,0x20,0x29,0x1a,0xff,0x2e, 0x3a,0x28,0xff,0x2e,0x3b,0x27,0xff,0x30,0x3a,0x2a,0xff,0x24,0x2c,0x14,0xff, 0x23,0x2c,0x17,0xff,0x23,0x2a,0x1c,0xff,0x25,0x34,0x20,0xff,0x25,0x3d,0x25, 0xff,0x29,0x3c,0x2b,0xff,0x2a,0x3e,0x2d,0xff,0x2a,0x3e,0x2b,0xff,0x2b,0x40, 0x2b,0xff,0x2a,0x42,0x2a,0xff,0x2d,0x45,0x2e,0xff,0x2d,0x45,0x32,0xff,0x2e, 0x47,0x34,0xff,0x2e,0x49,0x36,0xff,0x2e,0x45,0x34,0xff,0x30,0x47,0x34,0xff, 0x34,0x49,0x36,0xff,0x34,0x4b,0x3b,0xff,0x32,0x47,0x40,0xff,0x2a,0x3e,0x2e, 0xff,0x1c,0x26,0x12,0xff,0x1c,0x24,0x0f,0xff,0x2d,0x36,0x2b,0xff,0x32,0x3d, 0x2d,0xff,0x43,0x4d,0x3d,0xff,0x49,0x56,0x47,0xff,0x7d,0x98,0x81,0xff,0x78, 0x96,0x89,0xff,0x79,0x98,0x7f,0xfe,0xc9,0xd6,0xb2,0xc2,0xff,0xff,0xbe,0x80, 0xff,0xff,0xbe,0x6b,0xff,0xff,0xbe,0x52,0xff,0xff,0xbe,0x3d,0xff,0xff,0xbe, 0x2b,0xff,0xff,0xbe,0x1d,0xff,0xff,0xbe,0x11,0xff,0xff,0xbe,0x08,0xff,0xff, 0xbe,0x03,0x88,0xff,0xff,0xbe,0x00,0x3c,0xff,0xff,0xbe,0x04,0xff,0xff,0xbe, 0x0a,0xff,0xff,0xbe,0x14,0xff,0xff,0xbe,0x21,0xff,0xff,0xbe,0x31,0xff,0xff, 0xbe,0x44,0xff,0xff,0xbe,0x5a,0xff,0xff,0xbe,0x73,0xfc,0xff,0xbd,0x82,0xdd, 0xe6,0xb5,0xa6,0xa8,0xba,0x9c,0xea,0x94,0xa8,0x90,0xfe,0x93,0xa7,0x91,0xff, 0x92,0xa7,0x90,0xff,0x93,0xa8,0x90,0xff,0x92,0xa8,0x90,0xff,0x90,0xa6,0x8e, 0xff,0x90,0xa5,0x8d,0xff,0x8f,0xa3,0x8d,0xff,0x8a,0x9c,0x8a,0xff,0x76,0x86, 0x76,0xff,0x72,0x83,0x72,0xff,0x80,0x92,0x81,0xff,0x81,0x93,0x81,0xff,0x7f, 0x92,0x7f,0xff,0x7e,0x93,0x81,0xff,0x7e,0x92,0x84,0xff,0x7d,0x90,0x81,0xff, 0x7a,0x8f,0x82,0xff,0x79,0x8d,0x82,0xff,0x78,0x8d,0x80,0xff,0x76,0x8d,0x7f, 0xff,0x73,0x89,0x7b,0xff,0x70,0x8a,0x7b,0xff,0x70,0x86,0x7a,0xff,0x71,0x83, 0x7a,0xff,0x6f,0x85,0x7a,0xff,0x70,0x80,0x77,0xff,0x6b,0x81,0x76,0xff,0x68, 0x82,0x74,0xff,0x6a,0x7f,0x74,0xff,0x68,0x7e,0x71,0xff,0x64,0x80,0x71,0xff, 0x67,0x7f,0x71,0xff,0x67,0x79,0x6d,0xff,0x5b,0x78,0x74,0xff,0x15,0x1e,0x13, 0xff,0x29,0x32,0x21,0xff,0x18,0x1f,0x10,0xff,0x09,0x13,0x00,0xff,0x05,0x11, 0x00,0xff,0x43,0x54,0x49,0xff,0x22,0x2d,0x1d,0xff,0x05,0x11,0x00,0xff,0x07, 0x12,0x00,0xff,0x07,0x11,0x00,0xff,0x05,0x0d,0x00,0xff,0x08,0x0e,0x00,0xff, 0x06,0x0d,0x00,0xff,0x08,0x10,0x00,0xff,0x82,0x08,0x0f,0x00,0xff,0x04,0x1c, 0x25,0x0f,0xff,0x25,0x2d,0x1f,0xff,0x20,0x2a,0x1b,0xff,0x2b,0x35,0x27,0xff, 0x82,0x21,0x29,0x1a,0xff,0x1b,0x22,0x28,0x1c,0xff,0x23,0x32,0x22,0xff,0x22, 0x3d,0x24,0xff,0x27,0x3e,0x2b,0xff,0x2b,0x40,0x2d,0xff,0x2a,0x3e,0x2a,0xff, 0x2e,0x40,0x2a,0xff,0x32,0x40,0x2a,0xff,0x2b,0x42,0x2d,0xff,0x2e,0x43,0x32, 0xff,0x2e,0x43,0x34,0xff,0x2a,0x49,0x32,0xff,0x2d,0x49,0x34,0xff,0x30,0x49, 0x37,0xff,0x2e,0x4b,0x36,0xff,0x30,0x49,0x39,0xff,0x2d,0x45,0x39,0xff,0x2e, 0x3d,0x2b,0xff,0x20,0x2a,0x17,0xff,0x17,0x23,0x0d,0xff,0x2a,0x34,0x2a,0xff, 0x2e,0x3b,0x2b,0xff,0x43,0x4d,0x3b,0xff,0x49,0x52,0x43,0xff,0x4e,0x5b,0x4d, 0xff,0x4e,0x64,0x56,0xff,0xad,0xd0,0xa1,0xf6,0x82,0xff,0xff,0xbe,0x80,0x08, 0xff,0xff,0xbe,0x6c,0xff,0xff,0xbe,0x53,0xff,0xff,0xbe,0x3e,0xff,0xff,0xbe, 0x2c,0xff,0xff,0xbe,0x1d,0xff,0xff,0xbe,0x11,0xff,0xff,0xbe,0x09,0xff,0xff, 0xbe,0x03,0x88,0xff,0xff,0xbe,0x00,0x17,0xff,0xff,0xbe,0x04,0xff,0xff,0xbe, 0x0a,0xff,0xff,0xbe,0x14,0xff,0xff,0xbe,0x20,0xff,0xff,0xbe,0x30,0xff,0xff, 0xbe,0x43,0xff,0xff,0xbe,0x59,0xff,0xff,0xbe,0x72,0xfc,0xfc,0xbd,0x82,0xde, 0xe7,0xb4,0xa1,0xab,0xbb,0x9e,0xe8,0x94,0xa8,0x8f,0xfd,0x93,0xa8,0x90,0xff, 0x91,0xa7,0x8f,0xff,0x92,0xa8,0x90,0xff,0x91,0xa7,0x8f,0xff,0x90,0xa5,0x8e, 0xff,0x90,0xa4,0x8d,0xff,0x8e,0xa0,0x8d,0xff,0x8b,0x9c,0x8b,0xff,0x7d,0x8e, 0x7d,0xff,0x7a,0x8b,0x7a,0xff,0x82,0x93,0x81,0xff,0x82,0x80,0x93,0x80,0xff, 0x20,0x7f,0x93,0x80,0xff,0x7e,0x90,0x83,0xff,0x7f,0x8e,0x82,0xff,0x7d,0x8d, 0x81,0xff,0x7b,0x8b,0x81,0xff,0x79,0x8a,0x80,0xff,0x77,0x8b,0x7f,0xff,0x76, 0x88,0x7b,0xff,0x76,0x86,0x79,0xff,0x74,0x83,0x78,0xff,0x71,0x83,0x79,0xff, 0x6f,0x85,0x7b,0xff,0x72,0x7f,0x77,0xff,0x6f,0x7e,0x72,0xff,0x6d,0x7e,0x73, 0xff,0x6c,0x7d,0x72,0xff,0x6a,0x7c,0x70,0xff,0x69,0x7c,0x70,0xff,0x6a,0x7b, 0x71,0xff,0x68,0x77,0x6d,0xff,0x60,0x76,0x74,0xff,0x15,0x1e,0x13,0xff,0x23, 0x32,0x21,0xff,0x1d,0x26,0x18,0xff,0x08,0x10,0x00,0xff,0x07,0x0f,0x00,0xff, 0x1f,0x2a,0x18,0xff,0x53,0x67,0x5e,0xff,0x18,0x21,0x10,0xff,0x0a,0x13,0x00, 0xff,0x07,0x10,0x00,0xff,0x07,0x0d,0x00,0xff,0x83,0x08,0x0e,0x00,0xff,0x2e, 0x08,0x12,0x00,0xff,0x08,0x0f,0x00,0xff,0x18,0x25,0x0b,0xff,0x28,0x2e,0x25, 0xff,0x29,0x31,0x26,0xff,0x2a,0x35,0x27,0xff,0x21,0x2a,0x16,0xff,0x21,0x2b, 0x16,0xff,0x23,0x2b,0x16,0xff,0x27,0x32,0x1d,0xff,0x25,0x3d,0x25,0xff,0x29, 0x41,0x29,0xff,0x28,0x40,0x28,0xff,0x2a,0x3e,0x28,0xff,0x2a,0x40,0x28,0xff, 0x2d,0x40,0x28,0xff,0x2a,0x40,0x2e,0xff,0x30,0x43,0x32,0xff,0x2d,0x42,0x30, 0xff,0x30,0x47,0x32,0xff,0x30,0x4b,0x34,0xff,0x32,0x4b,0x37,0xff,0x34,0x47, 0x36,0xff,0x30,0x49,0x36,0xff,0x2a,0x40,0x30,0xff,0x2b,0x40,0x2a,0xff,0x1e, 0x2d,0x14,0xff,0x12,0x23,0x08,0xff,0x2a,0x32,0x23,0xff,0x2e,0x3b,0x2a,0xff, 0x40,0x4b,0x3b,0xff,0x49,0x50,0x43,0xff,0x50,0x59,0x4d,0xff,0x5f,0x74,0x62, 0xff,0x76,0x94,0x7e,0xff,0xc8,0xd6,0xb5,0xc7,0xff,0xff,0xbe,0x80,0xff,0xff, 0xbe,0x6d,0xff,0xff,0xbe,0x55,0xff,0xff,0xbe,0x40,0xff,0xff,0xbe,0x2d,0xff, 0xff,0xbe,0x1e,0xff,0xff,0xbe,0x12,0xff,0xff,0xbe,0x09,0xff,0xff,0xbe,0x03, 0xff,0xff,0xbe,0x01,0x87,0xff,0xff,0xbe,0x00,0x0d,0xff,0xff,0xbe,0x04,0xff, 0xff,0xbe,0x0a,0xff,0xff,0xbe,0x13,0xff,0xff,0xbe,0x20,0xff,0xff,0xbe,0x30, 0xff,0xff,0xbe,0x43,0xff,0xff,0xbe,0x59,0xff,0xff,0xbe,0x72,0xfa,0xfc,0xbb, 0x83,0xde,0xe5,0xb2,0xa2,0xa7,0xb9,0x9b,0xe9,0x92,0xa7,0x8e,0xfe,0x92,0xa8, 0x90,0xff,0x83,0x91,0xa7,0x8f,0xff,0x5a,0x90,0xa5,0x8e,0xff,0x8f,0xa4,0x8d, 0xff,0x8e,0xa0,0x8d,0xff,0x8b,0x9b,0x8b,0xff,0x86,0x97,0x86,0xff,0x84,0x96, 0x84,0xff,0x83,0x94,0x83,0xff,0x80,0x94,0x80,0xff,0x7f,0x93,0x7f,0xff,0x7f, 0x91,0x80,0xff,0x7e,0x8e,0x81,0xff,0x7f,0x8d,0x81,0xff,0x7d,0x8d,0x7e,0xff, 0x7b,0x8c,0x80,0xff,0x78,0x8b,0x80,0xff,0x78,0x89,0x7d,0xff,0x76,0x88,0x7a, 0xff,0x74,0x85,0x7a,0xff,0x74,0x83,0x7a,0xff,0x70,0x84,0x7a,0xff,0x6e,0x84, 0x79,0xff,0x6e,0x81,0x77,0xff,0x6f,0x7f,0x73,0xff,0x6d,0x7d,0x72,0xff,0x6b, 0x7d,0x71,0xff,0x68,0x7d,0x71,0xff,0x68,0x7c,0x70,0xff,0x69,0x7b,0x6f,0xff, 0x69,0x79,0x6d,0xff,0x61,0x74,0x74,0xff,0x15,0x1d,0x12,0xff,0x1f,0x2e,0x1d, 0xff,0x2f,0x3f,0x35,0xff,0x10,0x19,0x08,0xff,0x04,0x0b,0x00,0xff,0x05,0x0c, 0x00,0xff,0x44,0x55,0x42,0xff,0x5b,0x6c,0x6a,0xff,0x27,0x32,0x25,0xff,0x12, 0x1b,0x08,0xff,0x0a,0x12,0x00,0xff,0x06,0x0e,0x00,0xff,0x05,0x0e,0x00,0xff, 0x07,0x0e,0x00,0xff,0x08,0x11,0x00,0xff,0x08,0x12,0x00,0xff,0x0f,0x1c,0x03, 0xff,0x23,0x2d,0x1f,0xff,0x29,0x31,0x26,0xff,0x2a,0x34,0x25,0xff,0x21,0x2a, 0x11,0xff,0x21,0x2b,0x16,0xff,0x22,0x2b,0x13,0xff,0x23,0x34,0x1b,0xff,0x29, 0x3f,0x2b,0xff,0x26,0x40,0x26,0xff,0x2a,0x40,0x2a,0xff,0x28,0x3e,0x2a,0xff, 0x2a,0x40,0x26,0xff,0x28,0x40,0x2a,0xff,0x2b,0x42,0x32,0xff,0x2d,0x43,0x30, 0xff,0x2d,0x45,0x32,0xff,0x34,0x4b,0x39,0xff,0x34,0x49,0x39,0xff,0x34,0x49, 0x36,0xff,0x32,0x49,0x36,0xff,0x2e,0x47,0x32,0xff,0x2b,0x45,0x2e,0xff,0x2b, 0x42,0x30,0xff,0x1e,0x2b,0x17,0xff,0x14,0x23,0x05,0xff,0x28,0x32,0x23,0xff, 0x2d,0x3b,0x2a,0xff,0x40,0x49,0x39,0xff,0x47,0x50,0x43,0xff,0x50,0x5b,0x50, 0xff,0x5d,0x74,0x61,0xff,0x6a,0x83,0x74,0xff,0xa7,0xd0,0xa9,0xfb,0xf3,0xf8, 0xbc,0x8b,0xff,0xff,0xbe,0x6f,0xff,0xff,0xbe,0x57,0xff,0xff,0xbe,0x41,0xff, 0xff,0xbe,0x2e,0xff,0xff,0xbe,0x1f,0xff,0xff,0xbe,0x13,0xff,0xff,0xbe,0x0a, 0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x01,0x87,0xff,0xff,0xbe,0x00,0x0c,0xff, 0xff,0xbe,0x04,0xff,0xff,0xbe,0x0a,0xff,0xff,0xbe,0x13,0xff,0xff,0xbe,0x20, 0xff,0xff,0xbe,0x30,0xff,0xff,0xbe,0x43,0xff,0xff,0xbe,0x59,0xff,0xff,0xbe, 0x72,0xfc,0xfc,0xbb,0x83,0xdd,0xe5,0xb3,0xa3,0xa6,0xb8,0x9a,0xea,0x91,0xa7, 0x8e,0xfe,0x84,0x91,0xa7,0x8f,0xff,0x2c,0x90,0xa5,0x8e,0xff,0x8f,0xa2,0x8d, 0xff,0x8d,0x9e,0x8c,0xff,0x88,0x99,0x88,0xff,0x84,0x96,0x84,0xff,0x7f,0x90, 0x7f,0xff,0x7c,0x8d,0x7e,0xff,0x7d,0x90,0x7e,0xff,0x76,0x8a,0x78,0xff,0x73, 0x85,0x76,0xff,0x72,0x84,0x78,0xff,0x7b,0x8e,0x80,0xff,0x7a,0x8e,0x80,0xff, 0x79,0x8b,0x80,0xff,0x77,0x8c,0x80,0xff,0x76,0x8a,0x7c,0xff,0x73,0x89,0x7a, 0xff,0x6f,0x89,0x7b,0xff,0x72,0x85,0x7a,0xff,0x71,0x82,0x79,0xff,0x6e,0x84, 0x7a,0xff,0x6b,0x84,0x77,0xff,0x6a,0x81,0x73,0xff,0x6a,0x7d,0x71,0xff,0x6b, 0x7c,0x70,0xff,0x68,0x7c,0x70,0xff,0x67,0x7a,0x6e,0xff,0x68,0x7a,0x6d,0xff, 0x68,0x78,0x6d,0xff,0x61,0x74,0x74,0xff,0x13,0x1f,0x15,0xff,0x1f,0x2d,0x1a, 0xff,0x27,0x3e,0x27,0xff,0x2a,0x39,0x27,0xff,0x07,0x10,0x00,0xff,0x07,0x0c, 0x00,0xff,0x0f,0x19,0x07,0xff,0x53,0x6a,0x5f,0xff,0x54,0x67,0x67,0xff,0x50, 0x5d,0x5a,0xff,0x2c,0x3b,0x2c,0xff,0x17,0x22,0x0e,0xff,0x0a,0x16,0x03,0xff, 0x07,0x10,0x00,0xff,0x82,0x07,0x0f,0x00,0xff,0x2c,0x08,0x14,0x00,0xff,0x1f, 0x2a,0x16,0xff,0x29,0x2f,0x26,0xff,0x2a,0x32,0x25,0xff,0x21,0x29,0x17,0xff, 0x20,0x29,0x19,0xff,0x22,0x2b,0x16,0xff,0x23,0x32,0x1b,0xff,0x22,0x3f,0x29, 0xff,0x27,0x3e,0x29,0xff,0x2a,0x3d,0x2a,0xff,0x26,0x3d,0x2a,0xff,0x28,0x3e, 0x2a,0xff,0x2a,0x3d,0x2b,0xff,0x2a,0x40,0x2d,0xff,0x2a,0x42,0x2a,0xff,0x2b, 0x47,0x32,0xff,0x32,0x49,0x37,0xff,0x32,0x47,0x36,0xff,0x34,0x4b,0x3b,0xff, 0x2e,0x49,0x39,0xff,0x2b,0x45,0x30,0xff,0x2d,0x42,0x34,0xff,0x2a,0x40,0x30, 0xff,0x20,0x2d,0x17,0xff,0x12,0x21,0x03,0xff,0x26,0x30,0x21,0xff,0x2b,0x37, 0x2a,0xff,0x3e,0x47,0x37,0xff,0x47,0x50,0x43,0xff,0x52,0x64,0x54,0xff,0x66, 0x83,0x6c,0xff,0x78,0x8d,0x81,0xff,0x76,0x92,0x87,0xff,0xc6,0xd4,0xb5,0xd0, 0xff,0xff,0xbe,0x71,0xff,0xff,0xbe,0x58,0xff,0xff,0xbe,0x42,0xff,0xff,0xbe, 0x30,0xff,0xff,0xbe,0x20,0xff,0xff,0xbe,0x14,0xff,0xff,0xbe,0x0a,0xff,0xff, 0xbe,0x04,0xff,0xff,0xbe,0x01,0x87,0xff,0xff,0xbe,0x00,0x0c,0xff,0xff,0xbe, 0x04,0xff,0xff,0xbe,0x0a,0xff,0xff,0xbe,0x14,0xff,0xff,0xbe,0x20,0xff,0xff, 0xbe,0x30,0xff,0xff,0xbe,0x43,0xff,0xff,0xbe,0x59,0xff,0xff,0xbe,0x72,0xfc, 0xfc,0xbe,0x83,0xdb,0xe3,0xb2,0xa4,0xa5,0xb5,0x98,0xec,0x8f,0xa3,0x8c,0xfe, 0x82,0x90,0xa6,0x8e,0xff,0x5c,0x90,0xa7,0x8e,0xff,0x90,0xa6,0x8e,0xff,0x90, 0xa3,0x8e,0xff,0x8b,0x9d,0x89,0xff,0x83,0x96,0x83,0xff,0x7c,0x8e,0x7c,0xff, 0x70,0x82,0x71,0xff,0x64,0x76,0x67,0xff,0x67,0x78,0x6b,0xff,0x71,0x83,0x74, 0xff,0x67,0x7b,0x6a,0xff,0x63,0x74,0x66,0xff,0x62,0x76,0x69,0xff,0x7a,0x8e, 0x81,0xff,0x7a,0x8e,0x82,0xff,0x78,0x8c,0x80,0xff,0x76,0x8b,0x7f,0xff,0x74, 0x8b,0x7d,0xff,0x73,0x89,0x7a,0xff,0x73,0x86,0x7a,0xff,0x71,0x85,0x79,0xff, 0x70,0x83,0x79,0xff,0x70,0x80,0x77,0xff,0x6e,0x7f,0x73,0xff,0x68,0x82,0x73, 0xff,0x68,0x7f,0x72,0xff,0x6a,0x7b,0x70,0xff,0x68,0x7b,0x70,0xff,0x67,0x7a, 0x6d,0xff,0x68,0x7a,0x6d,0xff,0x67,0x79,0x6c,0xff,0x60,0x73,0x74,0xff,0x16, 0x1e,0x17,0xff,0x25,0x2e,0x1d,0xff,0x18,0x26,0x12,0xff,0x3c,0x43,0x36,0xff, 0x18,0x20,0x0b,0xff,0x09,0x12,0x00,0xff,0x04,0x0c,0x00,0xff,0x15,0x22,0x11, 0xff,0x34,0x41,0x38,0xff,0x45,0x5c,0x53,0xff,0x6a,0x8b,0x80,0xff,0x5f,0x7b, 0x73,0xff,0x3d,0x51,0x45,0xff,0x29,0x37,0x24,0xff,0x19,0x23,0x13,0xff,0x11, 0x19,0x07,0xff,0x0a,0x16,0x00,0xff,0x17,0x22,0x0b,0xff,0x29,0x31,0x26,0xff, 0x27,0x32,0x23,0xff,0x1f,0x29,0x16,0xff,0x21,0x29,0x1a,0xff,0x22,0x2a,0x1b, 0xff,0x27,0x32,0x1d,0xff,0x25,0x3d,0x25,0xff,0x26,0x3c,0x26,0xff,0x26,0x3d, 0x2a,0xff,0x28,0x3b,0x2a,0xff,0x2a,0x3e,0x2a,0xff,0x2b,0x40,0x2a,0xff,0x2a, 0x3e,0x24,0xff,0x2b,0x42,0x2e,0xff,0x2b,0x43,0x30,0xff,0x34,0x49,0x37,0xff, 0x30,0x47,0x34,0xff,0x30,0x49,0x36,0xff,0x2d,0x47,0x34,0xff,0x2e,0x45,0x34, 0xff,0x2b,0x40,0x30,0xff,0x2a,0x40,0x2d,0xff,0x23,0x2e,0x1a,0xff,0x12,0x21, 0x05,0xff,0x24,0x2d,0x1e,0xff,0x2b,0x36,0x2a,0xff,0x3d,0x43,0x36,0xff,0x43, 0x4e,0x42,0xff,0x56,0x70,0x5d,0xff,0x74,0x94,0x81,0xff,0x7d,0x96,0x8b,0xff, 0x70,0x85,0x81,0xff,0xcb,0xd9,0xbf,0xf3,0xff,0xff,0xbe,0x73,0xff,0xff,0xbe, 0x5a,0xff,0xff,0xbe,0x44,0xff,0xff,0xbe,0x31,0xff,0xff,0xbe,0x21,0xff,0xff, 0xbe,0x14,0xff,0xff,0xbe,0x0b,0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x01,0x87, 0xff,0xff,0xbe,0x00,0x0c,0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x0a,0xff,0xff, 0xbe,0x14,0xff,0xff,0xbe,0x21,0xff,0xff,0xbe,0x30,0xff,0xff,0xbe,0x43,0xff, 0xff,0xbe,0x5a,0xff,0xff,0xbe,0x73,0xfc,0xfc,0xbe,0x83,0xd9,0xe2,0xb0,0xa6, 0xa2,0xb4,0x97,0xed,0x8f,0xa3,0x8d,0xfe,0x83,0x90,0xa6,0x8e,0xff,0x41,0x90, 0xa4,0x8d,0xff,0x8f,0xa2,0x8d,0xff,0x84,0x97,0x84,0xff,0x78,0x89,0x78,0xff, 0x6c,0x7e,0x6e,0xff,0x62,0x73,0x65,0xff,0x59,0x6a,0x5e,0xff,0x5f,0x70,0x64, 0xff,0x67,0x79,0x6b,0xff,0x62,0x74,0x67,0xff,0x5d,0x6f,0x61,0xff,0x58,0x6a, 0x5f,0xff,0x77,0x88,0x7d,0xff,0x7c,0x8c,0x81,0xff,0x78,0x8b,0x80,0xff,0x77, 0x8a,0x7f,0xff,0x77,0x88,0x7b,0xff,0x74,0x88,0x79,0xff,0x76,0x84,0x7a,0xff, 0x73,0x82,0x79,0xff,0x6f,0x83,0x79,0xff,0x71,0x7f,0x76,0xff,0x70,0x7d,0x73, 0xff,0x6a,0x7f,0x73,0xff,0x66,0x80,0x73,0xff,0x69,0x7d,0x71,0xff,0x67,0x7d, 0x70,0xff,0x65,0x7c,0x6f,0xff,0x66,0x7c,0x6c,0xff,0x65,0x7c,0x6f,0xff,0x61, 0x73,0x74,0xff,0x17,0x1f,0x17,0xff,0x29,0x2f,0x1f,0xff,0x18,0x1d,0x10,0xff, 0x23,0x2e,0x1b,0xff,0x36,0x43,0x2f,0xff,0x0a,0x11,0x00,0xff,0x0a,0x12,0x00, 0xff,0x07,0x0d,0x00,0xff,0x15,0x1c,0x09,0xff,0x1b,0x26,0x15,0xff,0x28,0x36, 0x2b,0xff,0x52,0x6b,0x62,0xff,0x81,0xa2,0x98,0xff,0x7e,0x9e,0x9a,0xff,0x60, 0x79,0x75,0xff,0x45,0x57,0x4c,0xff,0x26,0x33,0x23,0xff,0x15,0x1f,0x09,0xff, 0x26,0x2f,0x21,0xff,0x27,0x32,0x20,0xff,0x21,0x2c,0x11,0xff,0x21,0x2b,0x16, 0xff,0x20,0x2a,0x1b,0xff,0x25,0x31,0x20,0xff,0x27,0x3d,0x29,0xff,0x27,0x3c, 0x24,0xff,0x2a,0x3b,0x26,0xff,0x26,0x3d,0x28,0xff,0x2a,0x40,0x2a,0xff,0x2a, 0x3e,0x26,0xff,0x2b,0x40,0x28,0xff,0x2e,0x42,0x2d,0xff,0x2e,0x43,0x30,0xff, 0x2e,0x47,0x30,0xff,0x82,0x2e,0x49,0x34,0xff,0x18,0x2d,0x45,0x30,0xff,0x2e, 0x47,0x32,0xff,0x2e,0x40,0x2e,0xff,0x2b,0x40,0x2d,0xff,0x26,0x32,0x1c,0xff, 0x14,0x21,0x02,0xff,0x24,0x2d,0x1c,0xff,0x2b,0x36,0x2b,0xff,0x39,0x43,0x36, 0xff,0x43,0x4e,0x40,0xff,0x59,0x6e,0x5f,0xff,0x7b,0x9c,0x8d,0xff,0x7b,0x9c, 0x90,0xff,0x70,0x87,0x81,0xff,0xc2,0xd9,0xbb,0xf5,0xff,0xff,0xbe,0x74,0xff, 0xff,0xbe,0x5b,0xff,0xff,0xbe,0x45,0xff,0xff,0xbe,0x32,0xff,0xff,0xbe,0x22, 0xff,0xff,0xbe,0x15,0xff,0xff,0xbe,0x0b,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe, 0x01,0x87,0xff,0xff,0xbe,0x00,0x6a,0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x0b, 0xff,0xff,0xbe,0x14,0xff,0xff,0xbe,0x21,0xff,0xff,0xbe,0x31,0xff,0xff,0xbe, 0x44,0xff,0xff,0xbe,0x5b,0xff,0xff,0xbe,0x74,0xf9,0xfd,0xbc,0x83,0xd9,0xe2, 0xaf,0xa8,0xa0,0xb3,0x98,0xee,0x90,0xa5,0x8d,0xfe,0x91,0xa7,0x8f,0xff,0x91, 0xa6,0x8e,0xff,0x8f,0xa4,0x8d,0xff,0x8f,0xa2,0x8d,0xff,0x8f,0xa0,0x8d,0xff, 0x83,0x96,0x82,0xff,0x72,0x83,0x73,0xff,0x64,0x72,0x67,0xff,0x5e,0x6e,0x63, 0xff,0x5b,0x6d,0x61,0xff,0x60,0x72,0x65,0xff,0x5f,0x71,0x63,0xff,0x5d,0x70, 0x65,0xff,0x5b,0x70,0x61,0xff,0x58,0x6b,0x5f,0xff,0x72,0x82,0x79,0xff,0x7a, 0x8b,0x80,0xff,0x79,0x8a,0x7f,0xff,0x79,0x86,0x7c,0xff,0x78,0x85,0x79,0xff, 0x73,0x86,0x7a,0xff,0x71,0x85,0x7a,0xff,0x72,0x83,0x79,0xff,0x70,0x80,0x77, 0xff,0x6c,0x82,0x74,0xff,0x6e,0x7e,0x74,0xff,0x6d,0x7d,0x71,0xff,0x68,0x7f, 0x73,0xff,0x69,0x7d,0x70,0xff,0x68,0x7d,0x70,0xff,0x65,0x7d,0x70,0xff,0x65, 0x7d,0x6f,0xff,0x64,0x7b,0x71,0xff,0x60,0x73,0x73,0xff,0x17,0x21,0x16,0xff, 0x25,0x31,0x1e,0xff,0x19,0x22,0x12,0xff,0x08,0x13,0x02,0xff,0x48,0x55,0x44, 0xff,0x12,0x1e,0x07,0xff,0x07,0x14,0x00,0xff,0x07,0x12,0x00,0xff,0x05,0x0d, 0x00,0xff,0x0c,0x15,0x02,0xff,0x12,0x1e,0x0b,0xff,0x15,0x22,0x12,0xff,0x29, 0x36,0x28,0xff,0x52,0x66,0x5b,0xff,0x7b,0x97,0x92,0xff,0x85,0xad,0xa5,0xff, 0x66,0x82,0x7c,0xff,0x2c,0x3a,0x2e,0xff,0x21,0x2c,0x21,0xff,0x25,0x30,0x22, 0xff,0x1e,0x27,0x11,0xff,0x21,0x2c,0x13,0xff,0x22,0x2a,0x16,0xff,0x22,0x2f, 0x1d,0xff,0x21,0x3c,0x22,0xff,0x24,0x3b,0x23,0xff,0x28,0x3b,0x24,0xff,0x28, 0x3e,0x24,0xff,0x24,0x3d,0x24,0xff,0x26,0x3d,0x24,0xff,0x2a,0x40,0x2a,0xff, 0x2d,0x43,0x2d,0xff,0x2e,0x42,0x2b,0xff,0x2d,0x42,0x30,0xff,0x2e,0x47,0x34, 0xff,0x2d,0x45,0x30,0xff,0x2d,0x45,0x34,0xff,0x2d,0x47,0x34,0xff,0x2d,0x42, 0x34,0xff,0x2e,0x3d,0x2d,0xff,0x26,0x30,0x1e,0xff,0x12,0x20,0x02,0xff,0x20, 0x2a,0x17,0xff,0x2a,0x32,0x2b,0xff,0x37,0x40,0x34,0xff,0x45,0x4e,0x40,0xff, 0x56,0x6a,0x59,0xff,0x7f,0x9e,0x8b,0xff,0x74,0x90,0x85,0xff,0x73,0x95,0x81, 0xff,0xd4,0xe3,0xbc,0xc0,0xff,0xff,0xbe,0x76,0xff,0xff,0xbe,0x5c,0xff,0xff, 0xbe,0x46,0xff,0xff,0xbe,0x33,0xff,0xff,0xbe,0x22,0xff,0xff,0xbe,0x15,0xff, 0xff,0xbe,0x0c,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe,0x01,0x87,0xff,0xff,0xbe, 0x00,0x0f,0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x0b,0xff,0xff,0xbe,0x15,0xff, 0xff,0xbe,0x22,0xff,0xff,0xbe,0x32,0xff,0xff,0xbe,0x45,0xff,0xff,0xbe,0x5c, 0xff,0xff,0xbe,0x75,0xfd,0xfd,0xbc,0x83,0xd8,0xdf,0xae,0xaa,0x9f,0xb2,0x95, 0xf0,0x91,0xa7,0x8e,0xff,0x91,0xa6,0x8e,0xff,0x90,0xa6,0x8d,0xff,0x8f,0xa3, 0x8c,0xff,0x82,0x8e,0xa2,0x8c,0xff,0x35,0x83,0x97,0x82,0xff,0x71,0x82,0x72, 0xff,0x60,0x6e,0x64,0xff,0x5c,0x6c,0x61,0xff,0x5d,0x6e,0x63,0xff,0x60,0x72, 0x65,0xff,0x5e,0x71,0x61,0xff,0x5a,0x6e,0x62,0xff,0x5a,0x6f,0x62,0xff,0x61, 0x74,0x66,0xff,0x72,0x83,0x78,0xff,0x7a,0x8a,0x7f,0xff,0x78,0x89,0x7d,0xff, 0x78,0x85,0x79,0xff,0x76,0x85,0x79,0xff,0x77,0x84,0x7a,0xff,0x73,0x84,0x79, 0xff,0x6e,0x85,0x7b,0xff,0x6f,0x82,0x77,0xff,0x6f,0x7f,0x72,0xff,0x6a,0x81, 0x74,0xff,0x6a,0x7e,0x73,0xff,0x6b,0x7c,0x70,0xff,0x6a,0x7b,0x70,0xff,0x69, 0x7a,0x6f,0xff,0x67,0x79,0x6c,0xff,0x67,0x79,0x6d,0xff,0x67,0x77,0x71,0xff, 0x60,0x73,0x73,0xff,0x17,0x21,0x17,0xff,0x21,0x2f,0x1c,0xff,0x1b,0x24,0x13, 0xff,0x04,0x0a,0x00,0xff,0x31,0x3d,0x29,0xff,0x2e,0x3b,0x2a,0xff,0x09,0x13, 0x00,0xff,0x09,0x14,0x01,0xff,0x07,0x12,0x00,0xff,0x07,0x0d,0x00,0xff,0x05, 0x12,0x00,0xff,0x09,0x14,0x01,0xff,0x13,0x1b,0x06,0xff,0x17,0x20,0x0a,0xff, 0x24,0x2c,0x1f,0xff,0x38,0x47,0x3f,0xff,0x56,0x6a,0x61,0xff,0x54,0x66,0x60, 0xff,0x33,0x3b,0x34,0xff,0x22,0x2d,0x1d,0xff,0x1c,0x27,0x0f,0xff,0x20,0x2b, 0x13,0xff,0x22,0x2b,0x13,0xff,0x25,0x31,0x1b,0xff,0x82,0x22,0x37,0x22,0xff, 0x22,0x26,0x37,0x26,0xff,0x23,0x37,0x23,0xff,0x28,0x39,0x24,0xff,0x28,0x3b, 0x26,0xff,0x2a,0x3e,0x2b,0xff,0x2b,0x40,0x2e,0xff,0x2a,0x40,0x2a,0xff,0x30, 0x45,0x30,0xff,0x2a,0x40,0x30,0xff,0x2d,0x42,0x32,0xff,0x2b,0x40,0x30,0xff, 0x2d,0x45,0x34,0xff,0x2e,0x43,0x2e,0xff,0x2d,0x40,0x2d,0xff,0x26,0x34,0x21, 0xff,0x0d,0x20,0x03,0xff,0x1c,0x2a,0x12,0xff,0x2a,0x32,0x2a,0xff,0x36,0x40, 0x30,0xff,0x45,0x4e,0x40,0xff,0x50,0x64,0x50,0xff,0x68,0x83,0x72,0xff,0x62, 0x74,0x67,0xff,0xbe,0xcd,0xae,0xd8,0xff,0xff,0xbe,0x80,0xff,0xff,0xbe,0x77, 0xff,0xff,0xbe,0x5d,0xff,0xff,0xbe,0x47,0xff,0xff,0xbe,0x33,0xff,0xff,0xbe, 0x23,0xff,0xff,0xbe,0x16,0xff,0xff,0xbe,0x0c,0xff,0xff,0xbe,0x05,0xff,0xff, 0xbe,0x01,0x86,0xff,0xff,0xbe,0x00,0x10,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe, 0x05,0xff,0xff,0xbe,0x0c,0xff,0xff,0xbe,0x16,0xff,0xff,0xbe,0x23,0xff,0xff, 0xbe,0x33,0xff,0xff,0xbe,0x47,0xff,0xff,0xbe,0x5d,0xff,0xff,0xbe,0x77,0xf9, 0xf9,0xbd,0x85,0xd6,0xde,0xae,0xac,0x9d,0xaf,0x96,0xf2,0x90,0xa6,0x8e,0xff, 0x91,0xa6,0x8e,0xff,0x90,0xa5,0x8d,0xff,0x8f,0xa2,0x8d,0xff,0x82,0x8d,0xa0, 0x8c,0xff,0x59,0x82,0x96,0x82,0xff,0x70,0x82,0x71,0xff,0x61,0x71,0x65,0xff, 0x5f,0x70,0x65,0xff,0x5f,0x6e,0x65,0xff,0x5e,0x6f,0x65,0xff,0x64,0x77,0x67, 0xff,0x5a,0x6c,0x60,0xff,0x5b,0x6f,0x63,0xff,0x6b,0x7c,0x70,0xff,0x73,0x83, 0x79,0xff,0x78,0x89,0x7e,0xff,0x76,0x89,0x7d,0xff,0x76,0x86,0x79,0xff,0x77, 0x84,0x79,0xff,0x77,0x82,0x7a,0xff,0x71,0x84,0x7a,0xff,0x6e,0x83,0x78,0xff, 0x72,0x7e,0x74,0xff,0x70,0x7d,0x73,0xff,0x6e,0x7d,0x72,0xff,0x6c,0x7d,0x71, 0xff,0x6a,0x7d,0x71,0xff,0x6a,0x7b,0x71,0xff,0x68,0x7a,0x6f,0xff,0x67,0x78, 0x6c,0xff,0x67,0x78,0x6a,0xff,0x68,0x78,0x6a,0xff,0x60,0x73,0x71,0xff,0x17, 0x23,0x17,0xff,0x25,0x2e,0x1c,0xff,0x1d,0x24,0x15,0xff,0x06,0x0e,0x00,0xff, 0x0e,0x1a,0x05,0xff,0x45,0x52,0x47,0xff,0x14,0x1b,0x08,0xff,0x0b,0x13,0x00, 0xff,0x09,0x12,0x00,0xff,0x07,0x0d,0x00,0xff,0x07,0x11,0x00,0xff,0x06,0x11, 0x00,0xff,0x08,0x11,0x00,0xff,0x09,0x13,0x00,0xff,0x0c,0x17,0x01,0xff,0x14, 0x1e,0x05,0xff,0x1d,0x25,0x17,0xff,0x22,0x2c,0x1c,0xff,0x29,0x33,0x24,0xff, 0x27,0x32,0x1d,0xff,0x21,0x29,0x0f,0xff,0x21,0x29,0x11,0xff,0x22,0x2f,0x13, 0xff,0x25,0x32,0x1b,0xff,0x22,0x35,0x25,0xff,0x24,0x37,0x23,0xff,0x24,0x37, 0x20,0xff,0x26,0x36,0x23,0xff,0x2b,0x37,0x2a,0xff,0x28,0x3e,0x2a,0xff,0x2e, 0x3d,0x28,0xff,0x2a,0x3e,0x2a,0xff,0x2b,0x42,0x2e,0xff,0x2b,0x40,0x2a,0xff, 0x2e,0x40,0x2e,0xff,0x2a,0x40,0x2e,0xff,0x2d,0x45,0x30,0xff,0x2e,0x42,0x32, 0xff,0x30,0x43,0x30,0xff,0x2a,0x42,0x2a,0xff,0x28,0x34,0x21,0xff,0x14,0x20, 0x03,0xff,0x1c,0x2a,0x0d,0xff,0x28,0x30,0x26,0xff,0x34,0x3e,0x2e,0xff,0x45, 0x4e,0x42,0xff,0x49,0x52,0x45,0xff,0x49,0x5d,0x4e,0xff,0x5e,0x76,0x67,0xff, 0xc4,0xd2,0xbb,0xe2,0xff,0xff,0xbe,0x80,0xff,0xff,0xbe,0x78,0xff,0xff,0xbe, 0x5e,0xff,0xff,0xbe,0x48,0xff,0xff,0xbe,0x34,0xff,0xff,0xbe,0x24,0xff,0xff, 0xbe,0x17,0xff,0xff,0xbe,0x0c,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe,0x01,0x86, 0xff,0xff,0xbe,0x00,0x0c,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe,0x05,0xff,0xff, 0xbe,0x0c,0xff,0xff,0xbe,0x17,0xff,0xff,0xbe,0x24,0xff,0xff,0xbe,0x35,0xff, 0xff,0xbe,0x48,0xff,0xff,0xbe,0x5f,0xff,0xff,0xbe,0x79,0xf9,0xfc,0xbd,0x85, 0xd3,0xdd,0xae,0xae,0x9a,0xae,0x94,0xf3,0x82,0x8f,0xa4,0x8d,0xff,0x02,0x8f, 0xa3,0x8d,0xff,0x8e,0xa2,0x8c,0xff,0x82,0x8c,0xa0,0x8c,0xff,0x42,0x83,0x96, 0x83,0xff,0x74,0x88,0x74,0xff,0x6b,0x7e,0x6d,0xff,0x6c,0x7d,0x70,0xff,0x68, 0x76,0x6a,0xff,0x65,0x74,0x6a,0xff,0x70,0x81,0x73,0xff,0x61,0x71,0x65,0xff, 0x63,0x74,0x6a,0xff,0x68,0x7b,0x6d,0xff,0x64,0x77,0x69,0xff,0x74,0x85,0x7b, 0xff,0x76,0x89,0x7d,0xff,0x76,0x88,0x7b,0xff,0x77,0x84,0x79,0xff,0x76,0x82, 0x79,0xff,0x70,0x83,0x7a,0xff,0x6e,0x83,0x78,0xff,0x71,0x7e,0x73,0xff,0x6e, 0x7d,0x73,0xff,0x6e,0x7d,0x72,0xff,0x6c,0x7d,0x71,0xff,0x6b,0x7b,0x71,0xff, 0x6a,0x7b,0x71,0xff,0x68,0x7a,0x6f,0xff,0x67,0x79,0x6c,0xff,0x67,0x79,0x6b, 0xff,0x67,0x77,0x6b,0xff,0x60,0x73,0x70,0xff,0x1c,0x21,0x19,0xff,0x25,0x2d, 0x1c,0xff,0x1f,0x27,0x19,0xff,0x05,0x0e,0x00,0xff,0x04,0x0c,0x00,0xff,0x30, 0x40,0x2c,0xff,0x35,0x45,0x33,0xff,0x09,0x11,0x00,0xff,0x08,0x11,0x00,0xff, 0x07,0x12,0x00,0xff,0x07,0x11,0x00,0xff,0x06,0x10,0x00,0xff,0x08,0x0e,0x00, 0xff,0x07,0x0e,0x00,0xff,0x05,0x0d,0x00,0xff,0x0f,0x19,0x04,0xff,0x26,0x30, 0x23,0xff,0x25,0x2f,0x23,0xff,0x29,0x34,0x26,0xff,0x25,0x30,0x1a,0xff,0x1e, 0x27,0x0f,0xff,0x1c,0x29,0x11,0xff,0x22,0x2d,0x16,0xff,0x25,0x34,0x1d,0xff, 0x24,0x35,0x1b,0xff,0x26,0x37,0x1d,0xff,0x23,0x37,0x1c,0xff,0x24,0x39,0x23, 0xff,0x2a,0x3b,0x26,0xff,0x28,0x3e,0x2b,0xff,0x26,0x3e,0x26,0xff,0x2d,0x40, 0x26,0xff,0x2a,0x40,0x2a,0xff,0x2a,0x3e,0x2e,0xff,0x2a,0x40,0x2a,0xff,0x2e, 0x43,0x30,0xff,0x2d,0x42,0x32,0xff,0x82,0x34,0x40,0x30,0xff,0x15,0x2b,0x40, 0x2d,0xff,0x2a,0x34,0x24,0xff,0x14,0x1e,0x06,0xff,0x1a,0x26,0x0d,0xff,0x28, 0x32,0x23,0xff,0x30,0x3b,0x2b,0xff,0x45,0x4e,0x40,0xff,0x4b,0x52,0x42,0xff, 0x4e,0x5b,0x4b,0xff,0x58,0x6a,0x5d,0xff,0x84,0xad,0x8d,0xfe,0xe3,0xee,0xb9, 0x9f,0xff,0xff,0xbe,0x7a,0xff,0xff,0xbe,0x60,0xff,0xff,0xbe,0x49,0xff,0xff, 0xbe,0x36,0xff,0xff,0xbe,0x25,0xff,0xff,0xbe,0x17,0xff,0xff,0xbe,0x0d,0xff, 0xff,0xbe,0x06,0xff,0xff,0xbe,0x02,0x86,0xff,0xff,0xbe,0x00,0x1a,0xff,0xff, 0xbe,0x01,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe,0x0d,0xff,0xff,0xbe,0x18,0xff, 0xff,0xbe,0x26,0xff,0xff,0xbe,0x36,0xff,0xff,0xbe,0x4a,0xff,0xff,0xbe,0x61, 0xff,0xff,0xbe,0x7c,0xfa,0xfa,0xbb,0x86,0xcc,0xd9,0xac,0xb7,0x98,0xaa,0x92, 0xf4,0x8f,0xa2,0x8d,0xff,0x8f,0xa2,0x8c,0xff,0x8f,0xa2,0x8d,0xff,0x8e,0xa0, 0x8c,0xff,0x8c,0x9f,0x8c,0xff,0x8c,0x9e,0x8c,0xff,0x8a,0x9b,0x8a,0xff,0x84, 0x96,0x84,0xff,0x7f,0x90,0x80,0xff,0x7e,0x8f,0x7f,0xff,0x7b,0x8c,0x7c,0xff, 0x78,0x8b,0x7b,0xff,0x7c,0x8e,0x80,0xff,0x76,0x85,0x79,0xff,0x82,0x77,0x86, 0x7c,0xff,0x1e,0x72,0x83,0x78,0xff,0x77,0x86,0x7c,0xff,0x78,0x86,0x7b,0xff, 0x78,0x85,0x7a,0xff,0x76,0x84,0x79,0xff,0x73,0x82,0x79,0xff,0x71,0x81,0x78, 0xff,0x71,0x7f,0x78,0xff,0x71,0x7e,0x73,0xff,0x6e,0x7d,0x73,0xff,0x6e,0x7d, 0x72,0xff,0x6c,0x7d,0x71,0xff,0x6a,0x7c,0x71,0xff,0x69,0x7a,0x6e,0xff,0x66, 0x7b,0x6f,0xff,0x66,0x7b,0x6c,0xff,0x65,0x79,0x6b,0xff,0x63,0x7b,0x71,0xff, 0x60,0x73,0x73,0xff,0x1c,0x1f,0x19,0xff,0x22,0x29,0x17,0xff,0x33,0x3e,0x2f, 0xff,0x0c,0x17,0x04,0xff,0x04,0x0b,0x00,0xff,0x10,0x19,0x07,0xff,0x5a,0x6b, 0x5a,0xff,0x26,0x31,0x1f,0xff,0x09,0x13,0x00,0xff,0x07,0x0d,0x00,0xff,0x06, 0x0d,0x00,0xff,0x82,0x08,0x0e,0x00,0xff,0x2f,0x07,0x0e,0x00,0xff,0x05,0x0d, 0x00,0xff,0x0f,0x17,0x03,0xff,0x23,0x2c,0x1f,0xff,0x2a,0x30,0x25,0xff,0x2c, 0x38,0x2a,0xff,0x20,0x2a,0x15,0xff,0x1e,0x2a,0x11,0xff,0x1c,0x29,0x11,0xff, 0x22,0x2d,0x15,0xff,0x25,0x34,0x1d,0xff,0x24,0x37,0x1b,0xff,0x1d,0x35,0x1c, 0xff,0x23,0x36,0x20,0xff,0x24,0x39,0x20,0xff,0x28,0x3d,0x24,0xff,0x28,0x3b, 0x24,0xff,0x26,0x3d,0x23,0xff,0x28,0x40,0x26,0xff,0x24,0x3d,0x24,0xff,0x2b, 0x3e,0x2d,0xff,0x2a,0x40,0x2a,0xff,0x32,0x42,0x2e,0xff,0x34,0x40,0x2d,0xff, 0x34,0x40,0x30,0xff,0x2b,0x40,0x30,0xff,0x2a,0x40,0x2e,0xff,0x2a,0x34,0x26, 0xff,0x15,0x21,0x06,0xff,0x17,0x23,0x0a,0xff,0x26,0x2e,0x23,0xff,0x2e,0x37, 0x2a,0xff,0x45,0x4e,0x40,0xff,0x49,0x50,0x43,0xff,0x54,0x5f,0x4e,0xff,0x61, 0x76,0x62,0xff,0x5f,0x76,0x72,0xff,0xca,0xd9,0xc6,0xea,0xff,0xff,0xbe,0x7c, 0xff,0xff,0xbe,0x62,0xff,0xff,0xbe,0x4b,0xff,0xff,0xbe,0x37,0xff,0xff,0xbe, 0x26,0xff,0xff,0xbe,0x18,0xff,0xff,0xbe,0x0e,0xff,0xff,0xbe,0x06,0xff,0xff, 0xbe,0x02,0x86,0xff,0xff,0xbe,0x00,0x10,0xff,0xff,0xbe,0x02,0xff,0xff,0xbe, 0x06,0xff,0xff,0xbe,0x0e,0xff,0xff,0xbe,0x19,0xff,0xff,0xbe,0x27,0xff,0xff, 0xbe,0x38,0xff,0xff,0xbe,0x4c,0xff,0xff,0xbe,0x64,0xff,0xff,0xbe,0x7e,0xeb, 0xef,0xb6,0x91,0xb6,0xc3,0xa1,0xcf,0x8e,0x9f,0x8c,0xf8,0x8d,0x9e,0x8b,0xff, 0x8e,0xa2,0x8c,0xff,0x8e,0xa0,0x8c,0xff,0x8d,0xa0,0x8c,0xff,0x83,0x8c,0x9e, 0x8b,0xff,0x58,0x8a,0x9b,0x8a,0xff,0x86,0x97,0x85,0xff,0x83,0x94,0x83,0xff, 0x82,0x93,0x82,0xff,0x80,0x93,0x80,0xff,0x7f,0x91,0x80,0xff,0x7e,0x8e,0x80, 0xff,0x7d,0x8c,0x80,0xff,0x7c,0x8b,0x81,0xff,0x7a,0x8a,0x7f,0xff,0x79,0x88, 0x7c,0xff,0x78,0x85,0x7a,0xff,0x78,0x83,0x7a,0xff,0x74,0x83,0x7a,0xff,0x71, 0x82,0x79,0xff,0x72,0x7f,0x77,0xff,0x70,0x7f,0x74,0xff,0x6d,0x80,0x76,0xff, 0x6f,0x7e,0x72,0xff,0x6e,0x7d,0x73,0xff,0x68,0x7f,0x73,0xff,0x66,0x7f,0x72, 0xff,0x66,0x7d,0x70,0xff,0x65,0x7d,0x71,0xff,0x63,0x7c,0x6d,0xff,0x63,0x7a, 0x6a,0xff,0x66,0x77,0x6c,0xff,0x60,0x74,0x74,0xff,0x18,0x23,0x1c,0xff,0x19, 0x2a,0x16,0xff,0x2e,0x42,0x2f,0xff,0x23,0x2e,0x1f,0xff,0x06,0x0f,0x00,0xff, 0x04,0x0b,0x00,0xff,0x2d,0x3b,0x28,0xff,0x5f,0x72,0x70,0xff,0x2e,0x38,0x2c, 0xff,0x16,0x20,0x0f,0xff,0x0a,0x12,0x00,0xff,0x05,0x0d,0x00,0xff,0x05,0x0e, 0x00,0xff,0x08,0x0e,0x00,0xff,0x05,0x11,0x00,0xff,0x08,0x14,0x00,0xff,0x1f, 0x26,0x1a,0xff,0x28,0x31,0x25,0xff,0x2e,0x34,0x26,0xff,0x1d,0x2a,0x10,0xff, 0x1e,0x29,0x11,0xff,0x1c,0x29,0x11,0xff,0x22,0x2f,0x16,0xff,0x27,0x32,0x1b, 0xff,0x21,0x31,0x17,0xff,0x1f,0x33,0x18,0xff,0x20,0x34,0x23,0xff,0x24,0x30, 0x23,0xff,0x20,0x36,0x1c,0xff,0x23,0x34,0x1e,0xff,0x23,0x34,0x21,0xff,0x20, 0x34,0x21,0xff,0x23,0x37,0x26,0xff,0x23,0x39,0x24,0xff,0x24,0x3e,0x2a,0xff, 0x28,0x3e,0x2a,0xff,0x2d,0x40,0x2d,0xff,0x2a,0x3e,0x2a,0xff,0x2a,0x42,0x2a, 0xff,0x2a,0x40,0x2b,0xff,0x2b,0x36,0x28,0xff,0x17,0x20,0x0a,0xff,0x17,0x23, 0x0a,0xff,0x26,0x30,0x23,0xff,0x2d,0x34,0x2a,0xff,0x42,0x4e,0x40,0xff,0x47, 0x50,0x43,0xff,0x56,0x66,0x58,0xff,0x66,0x83,0x6a,0xff,0x64,0x7a,0x76,0xff, 0x9a,0xc7,0xa8,0xfe,0xf6,0xfa,0xbe,0x89,0xff,0xff,0xbe,0x64,0xff,0xff,0xbe, 0x4d,0xff,0xff,0xbe,0x39,0xff,0xff,0xbe,0x27,0xff,0xff,0xbe,0x19,0xff,0xff, 0xbe,0x0f,0xff,0xff,0xbe,0x07,0xff,0xff,0xbe,0x02,0x86,0xff,0xff,0xbe,0x00, 0x11,0xff,0xff,0xbe,0x02,0xff,0xff,0xbe,0x07,0xff,0xff,0xbe,0x0f,0xff,0xff, 0xbe,0x1a,0xff,0xff,0xbe,0x28,0xff,0xff,0xbe,0x3a,0xff,0xff,0xbe,0x4e,0xff, 0xff,0xbe,0x66,0xf9,0xfd,0xbc,0x83,0xd5,0xdd,0xac,0xa6,0x9a,0xaa,0x90,0xe8, 0x80,0x8f,0x82,0xfe,0x85,0x98,0x88,0xff,0x8b,0x9d,0x8b,0xff,0x8d,0x9f,0x8c, 0xff,0x8c,0xa0,0x8b,0xff,0x8c,0x9e,0x8a,0xff,0x82,0x8c,0x9d,0x8a,0xff,0x58, 0x89,0x9a,0x8a,0xff,0x85,0x97,0x85,0xff,0x83,0x94,0x83,0xff,0x81,0x94,0x81, 0xff,0x7f,0x92,0x7f,0xff,0x7f,0x90,0x7f,0xff,0x7e,0x8e,0x7f,0xff,0x7d,0x8c, 0x80,0xff,0x7c,0x8b,0x81,0xff,0x7a,0x8a,0x7f,0xff,0x79,0x86,0x7c,0xff,0x76, 0x86,0x7a,0xff,0x76,0x84,0x7b,0xff,0x74,0x82,0x79,0xff,0x71,0x81,0x78,0xff, 0x72,0x7f,0x78,0xff,0x71,0x7e,0x76,0xff,0x6e,0x80,0x73,0xff,0x6f,0x7e,0x72, 0xff,0x6b,0x7f,0x74,0xff,0x66,0x80,0x73,0xff,0x68,0x7c,0x70,0xff,0x67,0x7a, 0x6c,0xff,0x65,0x7c,0x70,0xff,0x64,0x7b,0x6c,0xff,0x64,0x7a,0x6b,0xff,0x64, 0x79,0x6e,0xff,0x60,0x73,0x74,0xff,0x19,0x23,0x1c,0xff,0x1a,0x2b,0x18,0xff, 0x1a,0x2e,0x1b,0xff,0x31,0x3f,0x30,0xff,0x11,0x19,0x07,0xff,0x04,0x10,0x00, 0xff,0x07,0x13,0x01,0xff,0x3d,0x53,0x43,0xff,0x4f,0x60,0x5e,0xff,0x51,0x5f, 0x5d,0xff,0x35,0x43,0x35,0xff,0x17,0x29,0x16,0xff,0x0c,0x1b,0x05,0xff,0x07, 0x13,0x00,0xff,0x05,0x0f,0x00,0xff,0x03,0x0c,0x00,0xff,0x18,0x23,0x14,0xff, 0x28,0x31,0x28,0xff,0x26,0x2e,0x1b,0xff,0x1d,0x2a,0x10,0xff,0x1e,0x29,0x11, 0xff,0x1e,0x2b,0x11,0xff,0x22,0x2b,0x18,0xff,0x23,0x31,0x1b,0xff,0x1b,0x30, 0x17,0xff,0x1a,0x30,0x14,0xff,0x1a,0x2b,0x17,0xff,0x20,0x30,0x1c,0xff,0x23, 0x39,0x26,0xff,0x2b,0x3e,0x30,0xff,0x2b,0x40,0x30,0xff,0x34,0x45,0x3b,0xff, 0x30,0x49,0x3e,0xff,0x36,0x4d,0x42,0xff,0x30,0x47,0x3d,0xff,0x30,0x47,0x3e, 0xff,0x2d,0x42,0x3d,0xff,0x2a,0x40,0x32,0xff,0x23,0x3b,0x28,0xff,0x28,0x3d, 0x2a,0xff,0x26,0x37,0x26,0xff,0x17,0x23,0x0d,0xff,0x12,0x20,0x06,0xff,0x28, 0x2d,0x20,0xff,0x2b,0x34,0x2a,0xff,0x42,0x4e,0x40,0xff,0x47,0x50,0x43,0xff, 0x50,0x66,0x54,0xff,0x6a,0x85,0x78,0xff,0x66,0x7f,0x7a,0xff,0x7e,0xa4,0x8d, 0xff,0xe3,0xec,0xb7,0x99,0xff,0xff,0xbe,0x66,0xff,0xff,0xbe,0x4f,0xff,0xff, 0xbe,0x3a,0xff,0xff,0xbe,0x29,0xff,0xff,0xbe,0x1a,0xff,0xff,0xbe,0x0f,0xff, 0xff,0xbe,0x07,0xff,0xff,0xbe,0x02,0x86,0xff,0xff,0xbe,0x00,0x6b,0xff,0xff, 0xbe,0x02,0xff,0xff,0xbe,0x07,0xff,0xff,0xbe,0x10,0xff,0xff,0xbe,0x1b,0xff, 0xff,0xbe,0x2a,0xff,0xff,0xbe,0x3b,0xff,0xff,0xbe,0x50,0xff,0xff,0xbe,0x68, 0xf9,0xf9,0xbb,0x85,0xd2,0xdb,0xac,0xad,0x95,0xa5,0x8e,0xee,0x7e,0x8e,0x80, 0xfe,0x7e,0x8f,0x82,0xff,0x84,0x94,0x88,0xff,0x8a,0x9b,0x8b,0xff,0x8c,0x9e, 0x8b,0xff,0x8c,0x9d,0x8b,0xff,0x8b,0x9c,0x8b,0xff,0x8b,0x9c,0x8a,0xff,0x89, 0x99,0x89,0xff,0x85,0x96,0x85,0xff,0x82,0x93,0x82,0xff,0x80,0x93,0x80,0xff, 0x7f,0x91,0x7f,0xff,0x7f,0x8f,0x7e,0xff,0x7d,0x8e,0x7f,0xff,0x7c,0x8c,0x80, 0xff,0x7b,0x8b,0x80,0xff,0x79,0x89,0x7e,0xff,0x78,0x86,0x7b,0xff,0x76,0x86, 0x7a,0xff,0x73,0x86,0x7b,0xff,0x71,0x84,0x7a,0xff,0x70,0x82,0x79,0xff,0x71, 0x7f,0x77,0xff,0x72,0x7e,0x74,0xff,0x70,0x7e,0x72,0xff,0x6a,0x81,0x74,0xff, 0x67,0x81,0x74,0xff,0x66,0x80,0x73,0xff,0x67,0x7c,0x70,0xff,0x68,0x7b,0x6f, 0xff,0x66,0x7b,0x6f,0xff,0x66,0x79,0x6b,0xff,0x63,0x79,0x6c,0xff,0x65,0x79, 0x72,0xff,0x61,0x74,0x74,0xff,0x19,0x23,0x1c,0xff,0x1c,0x2d,0x18,0xff,0x1a, 0x24,0x16,0xff,0x23,0x2e,0x1d,0xff,0x28,0x36,0x23,0xff,0x07,0x10,0x00,0xff, 0x06,0x0c,0x00,0xff,0x0d,0x18,0x09,0xff,0x2c,0x3a,0x2f,0xff,0x3b,0x4c,0x47, 0xff,0x64,0x7e,0x78,0xff,0x64,0x7d,0x77,0xff,0x45,0x59,0x4e,0xff,0x2b,0x3b, 0x2d,0xff,0x1d,0x2b,0x17,0xff,0x0f,0x1d,0x08,0xff,0x18,0x25,0x14,0xff,0x27, 0x2f,0x25,0xff,0x1d,0x27,0x10,0xff,0x1b,0x2a,0x0c,0xff,0x1e,0x2a,0x11,0xff, 0x1e,0x29,0x11,0xff,0x20,0x2a,0x16,0xff,0x22,0x2f,0x18,0xff,0x18,0x2b,0x12, 0xff,0x1f,0x33,0x1f,0xff,0x3e,0x4e,0x40,0xff,0x43,0x50,0x45,0xff,0x43,0x50, 0x4d,0xff,0x42,0x4e,0x4d,0xff,0x3e,0x47,0x42,0xff,0x3b,0x45,0x3d,0xff,0x3b, 0x42,0x3e,0xff,0x2a,0x34,0x2a,0xff,0x30,0x3b,0x32,0xff,0x3b,0x43,0x3e,0xff, 0x39,0x47,0x43,0xff,0x34,0x47,0x43,0xff,0x36,0x45,0x40,0xff,0x36,0x47,0x40, 0xff,0x2a,0x3b,0x2d,0xff,0x17,0x24,0x0d,0xff,0x0d,0x1e,0x03,0xff,0x26,0x2b, 0x1c,0xff,0x2b,0x32,0x26,0xff,0x40,0x4b,0x3e,0xff,0x47,0x50,0x45,0xff,0x4e, 0x59,0x4e,0xff,0x68,0x7f,0x74,0xff,0x64,0x7a,0x6c,0xff,0x90,0xb6,0x91,0xf9, 0xfc,0xfc,0xbd,0x82,0xff,0xff,0xbe,0x68,0xff,0xff,0xbe,0x50,0xff,0xff,0xbe, 0x3b,0xff,0xff,0xbe,0x2a,0xff,0xff,0xbe,0x1b,0xff,0xff,0xbe,0x10,0xff,0xff, 0xbe,0x08,0xff,0xff,0xbe,0x03,0x86,0xff,0xff,0xbe,0x00,0x6b,0xff,0xff,0xbe, 0x03,0xff,0xff,0xbe,0x08,0xff,0xff,0xbe,0x11,0xff,0xff,0xbe,0x1d,0xff,0xff, 0xbe,0x2c,0xff,0xff,0xbe,0x3e,0xff,0xff,0xbe,0x53,0xff,0xff,0xbe,0x6b,0xf9, 0xf9,0xbb,0x85,0xd3,0xdd,0xae,0xae,0x9c,0xaf,0x93,0xee,0x84,0x97,0x84,0xfe, 0x7e,0x8f,0x81,0xff,0x7d,0x8d,0x82,0xff,0x82,0x92,0x85,0xff,0x86,0x98,0x88, 0xff,0x89,0x9a,0x89,0xff,0x8a,0x9a,0x8a,0xff,0x8a,0x9a,0x89,0xff,0x88,0x99, 0x88,0xff,0x84,0x96,0x84,0xff,0x82,0x93,0x82,0xff,0x80,0x92,0x80,0xff,0x7e, 0x90,0x7e,0xff,0x7e,0x8e,0x7d,0xff,0x7e,0x8d,0x7e,0xff,0x7c,0x8b,0x80,0xff, 0x7a,0x8a,0x80,0xff,0x78,0x88,0x7d,0xff,0x78,0x85,0x7a,0xff,0x77,0x86,0x79, 0xff,0x72,0x89,0x7a,0xff,0x6f,0x88,0x7b,0xff,0x71,0x83,0x79,0xff,0x71,0x7f, 0x77,0xff,0x71,0x7e,0x73,0xff,0x6e,0x80,0x73,0xff,0x6b,0x81,0x74,0xff,0x69, 0x7f,0x74,0xff,0x69,0x7e,0x72,0xff,0x65,0x7e,0x70,0xff,0x65,0x7d,0x70,0xff, 0x66,0x7b,0x6e,0xff,0x63,0x7b,0x6a,0xff,0x62,0x7a,0x6d,0xff,0x66,0x78,0x73, 0xff,0x61,0x74,0x73,0xff,0x1a,0x26,0x1d,0xff,0x1d,0x2a,0x17,0xff,0x1d,0x24, 0x18,0xff,0x09,0x17,0x04,0xff,0x3f,0x4e,0x3c,0xff,0x0f,0x15,0x01,0xff,0x08, 0x10,0x00,0xff,0x05,0x0b,0x00,0xff,0x09,0x15,0x06,0xff,0x1a,0x23,0x15,0xff, 0x22,0x2d,0x22,0xff,0x48,0x59,0x53,0xff,0x70,0x8e,0x89,0xff,0x78,0x98,0x96, 0xff,0x5b,0x77,0x6c,0xff,0x3b,0x51,0x45,0xff,0x25,0x30,0x25,0xff,0x1e,0x27, 0x17,0xff,0x18,0x26,0x0c,0xff,0x1a,0x2a,0x0c,0xff,0x1c,0x2c,0x0c,0xff,0x1a, 0x2b,0x0c,0xff,0x1e,0x2b,0x11,0xff,0x22,0x2d,0x16,0xff,0x17,0x2b,0x12,0xff, 0x24,0x33,0x22,0xff,0x37,0x40,0x3d,0xff,0x2e,0x3d,0x37,0xff,0x2d,0x36,0x34, 0xff,0x30,0x36,0x34,0xff,0x34,0x39,0x34,0xff,0x32,0x3d,0x34,0xff,0x36,0x40, 0x36,0xff,0x1e,0x28,0x17,0xff,0x2a,0x32,0x23,0xff,0x39,0x40,0x37,0xff,0x32, 0x3e,0x36,0xff,0x2d,0x40,0x37,0xff,0x2e,0x40,0x37,0xff,0x37,0x43,0x42,0xff, 0x36,0x3e,0x39,0xff,0x15,0x24,0x10,0xff,0x08,0x19,0x02,0xff,0x23,0x2b,0x1c, 0xff,0x28,0x32,0x24,0xff,0x40,0x49,0x3d,0xff,0x4d,0x50,0x49,0xff,0x4d,0x54, 0x49,0xff,0x59,0x6c,0x58,0xff,0x6e,0x8d,0x72,0xff,0xc8,0xd7,0xaf,0xbf,0xff, 0xff,0xbe,0x80,0xff,0xff,0xbe,0x6a,0xff,0xff,0xbe,0x52,0xff,0xff,0xbe,0x3d, 0xff,0xff,0xbe,0x2b,0xff,0xff,0xbe,0x1c,0xff,0xff,0xbe,0x11,0xff,0xff,0xbe, 0x08,0xff,0xff,0xbe,0x03,0x85,0xff,0xff,0xbe,0x00,0x62,0xff,0xff,0xbe,0x01, 0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x0a,0xff,0xff,0xbe,0x13,0xff,0xff,0xbe, 0x1f,0xff,0xff,0xbe,0x2f,0xff,0xff,0xbe,0x41,0xff,0xff,0xbe,0x56,0xff,0xff, 0xbe,0x6f,0xf9,0xfc,0xbd,0x85,0xd6,0xe0,0xae,0xac,0xa0,0xb3,0x95,0xed,0x8b, 0x9f,0x8a,0xfe,0x85,0x98,0x85,0xff,0x7d,0x91,0x82,0xff,0x7b,0x8d,0x81,0xff, 0x7f,0x8e,0x81,0xff,0x83,0x92,0x84,0xff,0x85,0x97,0x88,0xff,0x86,0x98,0x86, 0xff,0x85,0x97,0x85,0xff,0x83,0x94,0x83,0xff,0x81,0x93,0x81,0xff,0x7f,0x91, 0x7f,0xff,0x7e,0x8f,0x7e,0xff,0x7d,0x8d,0x7e,0xff,0x7d,0x8c,0x7f,0xff,0x7b, 0x8a,0x80,0xff,0x79,0x8a,0x7f,0xff,0x79,0x86,0x7c,0xff,0x78,0x85,0x79,0xff, 0x77,0x85,0x79,0xff,0x71,0x89,0x7b,0xff,0x70,0x88,0x7c,0xff,0x71,0x82,0x79, 0xff,0x71,0x80,0x78,0xff,0x6e,0x80,0x74,0xff,0x6b,0x81,0x74,0xff,0x6f,0x7d, 0x73,0xff,0x6c,0x7c,0x71,0xff,0x6a,0x7d,0x71,0xff,0x65,0x7e,0x71,0xff,0x66, 0x7c,0x6e,0xff,0x66,0x7b,0x6c,0xff,0x64,0x7b,0x6b,0xff,0x62,0x7a,0x6c,0xff, 0x63,0x7c,0x72,0xff,0x60,0x76,0x71,0xff,0x1c,0x26,0x1d,0xff,0x22,0x29,0x17, 0xff,0x1f,0x26,0x19,0xff,0x02,0x08,0x00,0xff,0x3a,0x44,0x2f,0xff,0x24,0x2a, 0x18,0xff,0x09,0x10,0x00,0xff,0x08,0x10,0x00,0xff,0x06,0x0c,0x00,0xff,0x07, 0x0f,0x01,0xff,0x0d,0x19,0x07,0xff,0x15,0x1d,0x0e,0xff,0x25,0x2e,0x20,0xff, 0x45,0x52,0x48,0xff,0x62,0x7f,0x75,0xff,0x67,0x80,0x80,0xff,0x2b,0x31,0x25, 0xff,0x19,0x23,0x0a,0xff,0x1b,0x27,0x0a,0xff,0x1f,0x27,0x0d,0xff,0x1e,0x2a, 0x0c,0xff,0x20,0x2c,0x0c,0xff,0x22,0x2f,0x0e,0xff,0x20,0x2d,0x15,0xff,0x10, 0x27,0x08,0xff,0x17,0x29,0x14,0xff,0x2a,0x32,0x24,0xff,0x23,0x32,0x1c,0xff, 0x2a,0x3b,0x23,0xff,0x2a,0x3b,0x26,0xff,0x2a,0x3b,0x28,0xff,0x23,0x36,0x21, 0xff,0x24,0x2d,0x1e,0xff,0x39,0x40,0x34,0xff,0x2d,0x3b,0x30,0xff,0x30,0x4b, 0x2b,0xff,0x4b,0x61,0x43,0xff,0x4e,0x66,0x49,0xff,0x47,0x66,0x42,0xff,0x28, 0x34,0x23,0xff,0x34,0x3e,0x3b,0xff,0x1a,0x26,0x19,0xff,0x0a,0x14,0x00,0xff, 0x1e,0x2a,0x15,0xff,0x26,0x30,0x23,0xff,0x3e,0x45,0x3b,0xff,0x4e,0x52,0x49, 0xff,0x4e,0x58,0x49,0xff,0x4e,0x61,0x4d,0xff,0xae,0xc5,0x9c,0xe7,0x82,0xff, 0xff,0xbe,0x80,0x09,0xff,0xff,0xbe,0x6d,0xff,0xff,0xbe,0x55,0xff,0xff,0xbe, 0x3f,0xff,0xff,0xbe,0x2d,0xff,0xff,0xbe,0x1e,0xff,0xff,0xbe,0x12,0xff,0xff, 0xbe,0x09,0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x01,0x83,0xff,0xff,0xbe,0x00, 0x6e,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe,0x02,0xff,0xff,0xbe,0x05,0xff,0xff, 0xbe,0x0c,0xff,0xff,0xbe,0x15,0xff,0xff,0xbe,0x22,0xff,0xff,0xbe,0x31,0xff, 0xff,0xbe,0x44,0xff,0xff,0xbe,0x5a,0xff,0xff,0xbe,0x72,0xf9,0xfd,0xbc,0x83, 0xd9,0xe4,0xb0,0xa6,0xa2,0xb6,0x95,0xeb,0x8d,0xa0,0x89,0xfe,0x8b,0x9e,0x89, 0xff,0x86,0x9a,0x86,0xff,0x82,0x93,0x83,0xff,0x7f,0x8e,0x80,0xff,0x7e,0x8d, 0x81,0xff,0x7f,0x90,0x83,0xff,0x81,0x93,0x85,0xff,0x81,0x94,0x84,0xff,0x7f, 0x94,0x82,0xff,0x7f,0x93,0x81,0xff,0x7f,0x91,0x7f,0xff,0x7e,0x8f,0x7e,0xff, 0x7c,0x8c,0x7e,0xff,0x7c,0x8b,0x80,0xff,0x7b,0x8a,0x80,0xff,0x79,0x8a,0x7f, 0xff,0x79,0x86,0x7b,0xff,0x78,0x85,0x79,0xff,0x77,0x85,0x79,0xff,0x73,0x88, 0x7a,0xff,0x72,0x84,0x7b,0xff,0x72,0x81,0x78,0xff,0x6f,0x81,0x77,0xff,0x6c, 0x82,0x77,0xff,0x6b,0x81,0x74,0xff,0x6c,0x7e,0x73,0xff,0x6b,0x7e,0x72,0xff, 0x66,0x7f,0x71,0xff,0x65,0x7f,0x71,0xff,0x65,0x7e,0x72,0xff,0x66,0x7b,0x6d, 0xff,0x67,0x79,0x6b,0xff,0x64,0x7b,0x6c,0xff,0x63,0x7b,0x72,0xff,0x61,0x74, 0x71,0xff,0x1d,0x26,0x1f,0xff,0x1e,0x29,0x17,0xff,0x22,0x28,0x1b,0xff,0x02, 0x06,0x00,0xff,0x18,0x20,0x10,0xff,0x3e,0x4c,0x3a,0xff,0x0b,0x15,0x01,0xff, 0x09,0x11,0x00,0xff,0x07,0x0d,0x00,0xff,0x06,0x0d,0x00,0xff,0x05,0x0a,0x00, 0xff,0x09,0x12,0x00,0xff,0x17,0x1e,0x06,0xff,0x18,0x1e,0x0a,0xff,0x1f,0x25, 0x17,0xff,0x2f,0x35,0x2c,0xff,0x21,0x25,0x11,0xff,0x1f,0x25,0x0a,0xff,0x20, 0x27,0x0c,0xff,0x20,0x27,0x0f,0xff,0x21,0x27,0x0e,0xff,0x23,0x29,0x0e,0xff, 0x22,0x2d,0x11,0xff,0x20,0x2d,0x11,0xff,0x0d,0x1a,0x00,0xff,0x1c,0x29,0x12, 0xff,0x28,0x32,0x23,0xff,0x39,0x42,0x28,0xff,0x61,0x76,0x4e,0xff,0x5f,0x72, 0x4e,0xff,0x5d,0x72,0x4e,0xff,0x45,0x52,0x32,0xff,0x1c,0x23,0x0d,0xff,0x30, 0x39,0x2e,0xff,0x3e,0x49,0x39,0xff,0x56,0x64,0x49,0xff,0x5f,0x72,0x58,0xff, 0x50,0x64,0x4e,0xff,0x4d,0x59,0x43,0xff,0x37,0x40,0x2a,0xff,0x34,0x3d,0x34, 0xff,0x20,0x28,0x1c,0xff,0x0b,0x14,0x00,0xff,0x1c,0x28,0x12,0xff,0x26,0x2e, 0x23,0xff,0x3b,0x47,0x39,0xff,0x4d,0x52,0x47,0xff,0x50,0x58,0x4b,0xff,0x58, 0x5d,0x4d,0xff,0x85,0xa2,0x7a,0xfa,0xe0,0xe8,0xb7,0x9b,0xff,0xff,0xbe,0x80, 0xff,0xff,0xbe,0x71,0xff,0xff,0xbe,0x58,0xff,0xff,0xbe,0x42,0xff,0xff,0xbe, 0x30,0xff,0xff,0xbe,0x20,0xff,0xff,0xbe,0x14,0xff,0xff,0xbe,0x0b,0xff,0xff, 0xbe,0x04,0xff,0xff,0xbe,0x01,0x82,0xff,0xff,0xbe,0x00,0x82,0xff,0xff,0xbe, 0x01,0x0d,0xff,0xff,0xbe,0x03,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe,0x0d,0xff, 0xff,0xbe,0x17,0xff,0xff,0xbe,0x24,0xff,0xff,0xbe,0x33,0xff,0xff,0xbe,0x46, 0xff,0xff,0xbe,0x5b,0xff,0xff,0xbe,0x73,0xfc,0xfc,0xbd,0x82,0xe0,0xe5,0xb2, 0x9f,0xa5,0xb6,0x96,0xe8,0x8c,0xa0,0x8a,0xfd,0x82,0x8c,0x9f,0x8a,0xff,0x5e, 0x8b,0x9d,0x88,0xff,0x86,0x99,0x85,0xff,0x83,0x93,0x83,0xff,0x80,0x91,0x83, 0xff,0x7d,0x91,0x83,0xff,0x79,0x8f,0x82,0xff,0x7a,0x90,0x82,0xff,0x7c,0x90, 0x82,0xff,0x7d,0x8f,0x81,0xff,0x7c,0x8e,0x7f,0xff,0x7b,0x8c,0x7e,0xff,0x7b, 0x8b,0x7f,0xff,0x7a,0x8a,0x7f,0xff,0x79,0x8a,0x7e,0xff,0x79,0x86,0x7b,0xff, 0x79,0x85,0x7a,0xff,0x78,0x85,0x79,0xff,0x77,0x85,0x79,0xff,0x73,0x83,0x79, 0xff,0x71,0x81,0x79,0xff,0x70,0x82,0x78,0xff,0x6d,0x82,0x77,0xff,0x6a,0x82, 0x76,0xff,0x68,0x82,0x76,0xff,0x66,0x81,0x73,0xff,0x66,0x80,0x72,0xff,0x65, 0x7f,0x71,0xff,0x67,0x7b,0x71,0xff,0x66,0x7a,0x6e,0xff,0x63,0x7c,0x6c,0xff, 0x61,0x7d,0x6d,0xff,0x63,0x7b,0x72,0xff,0x61,0x76,0x73,0xff,0x1c,0x29,0x1f, 0xff,0x17,0x26,0x16,0xff,0x20,0x28,0x1a,0xff,0x04,0x0a,0x00,0xff,0x02,0x09, 0x00,0xff,0x38,0x49,0x38,0xff,0x1f,0x29,0x14,0xff,0x08,0x11,0x00,0xff,0x07, 0x0f,0x00,0xff,0x04,0x0c,0x00,0xff,0x07,0x12,0x00,0xff,0x10,0x1b,0x01,0xff, 0x13,0x1e,0x05,0xff,0x1a,0x23,0x12,0xff,0x20,0x28,0x13,0xff,0x18,0x1f,0x0a, 0xff,0x1d,0x20,0x0a,0xff,0x1a,0x25,0x0b,0xff,0x19,0x27,0x0c,0xff,0x20,0x27, 0x0c,0xff,0x21,0x27,0x0c,0xff,0x21,0x28,0x0c,0xff,0x22,0x2b,0x13,0xff,0x1d, 0x29,0x0e,0xff,0x0a,0x12,0x00,0xff,0x17,0x23,0x0d,0xff,0x40,0x49,0x39,0xff, 0x45,0x4e,0x37,0xff,0x14,0x23,0x12,0xff,0x19,0x24,0x14,0xff,0x0f,0x1a,0x0b, 0xff,0x1c,0x26,0x0f,0xff,0x32,0x34,0x21,0xff,0x2a,0x36,0x2a,0xff,0x58,0x61, 0x4e,0xff,0x23,0x2a,0x12,0xff,0x0b,0x17,0x03,0xff,0x10,0x17,0x08,0xff,0x14, 0x1c,0x0d,0xff,0x3b,0x42,0x2a,0xff,0x34,0x40,0x32,0xff,0x1e,0x2a,0x1a,0xff, 0x0a,0x14,0x00,0xff,0x1a,0x26,0x0b,0xff,0x28,0x2d,0x20,0xff,0x3d,0x43,0x34, 0xff,0x4e,0x52,0x47,0xff,0x4e,0x59,0x4d,0xff,0x59,0x62,0x56,0xff,0x58,0x68, 0x58,0xff,0x90,0xb0,0x8b,0xfd,0xe4,0xee,0xcc,0xbf,0xff,0xff,0xbe,0x73,0xff, 0xff,0xbe,0x5b,0xff,0xff,0xbe,0x45,0xff,0xff,0xbe,0x32,0xff,0xff,0xbe,0x22, 0xff,0xff,0xbe,0x15,0xff,0xff,0xbe,0x0c,0xff,0xff,0xbe,0x05,0xff,0xff,0xbe, 0x02,0x82,0xff,0xff,0xbe,0x00,0x6f,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe,0x02, 0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x07,0xff,0xff,0xbe,0x0e,0xff,0xff,0xbe, 0x18,0xff,0xff,0xbe,0x25,0xff,0xff,0xbe,0x35,0xff,0xff,0xbe,0x47,0xff,0xff, 0xbe,0x5c,0xff,0xff,0xbe,0x72,0xff,0xff,0xbd,0x80,0xe6,0xeb,0xb3,0x97,0xac, 0xbe,0x9c,0xe2,0x91,0xa6,0x90,0xfd,0x90,0xa5,0x8e,0xff,0x90,0xa4,0x8e,0xff, 0x8e,0xa3,0x8c,0xff,0x8d,0xa2,0x8b,0xff,0x8b,0x9e,0x8a,0xff,0x89,0x9b,0x89, 0xff,0x83,0x97,0x86,0xff,0x7c,0x92,0x82,0xff,0x7b,0x8f,0x82,0xff,0x79,0x8d, 0x81,0xff,0x77,0x8c,0x7f,0xff,0x76,0x8b,0x7e,0xff,0x77,0x8b,0x7d,0xff,0x78, 0x89,0x7e,0xff,0x79,0x89,0x7e,0xff,0x79,0x89,0x7d,0xff,0x79,0x86,0x7b,0xff, 0x78,0x85,0x79,0xff,0x76,0x85,0x79,0xff,0x72,0x89,0x7a,0xff,0x6f,0x88,0x7a, 0xff,0x70,0x81,0x78,0xff,0x70,0x81,0x77,0xff,0x6d,0x83,0x77,0xff,0x6b,0x82, 0x77,0xff,0x68,0x82,0x76,0xff,0x67,0x81,0x74,0xff,0x66,0x80,0x72,0xff,0x65, 0x7f,0x71,0xff,0x66,0x7e,0x71,0xff,0x65,0x7c,0x73,0xff,0x62,0x7c,0x72,0xff, 0x62,0x7a,0x71,0xff,0x68,0x78,0x72,0xff,0x61,0x78,0x73,0xff,0x1c,0x29,0x23, 0xff,0x17,0x25,0x13,0xff,0x1d,0x28,0x18,0xff,0x01,0x08,0x00,0xff,0x01,0x06, 0x00,0xff,0x13,0x23,0x12,0xff,0x3c,0x49,0x39,0xff,0x09,0x11,0x00,0xff,0x07, 0x11,0x00,0xff,0x0f,0x1c,0x0a,0xff,0x13,0x22,0x12,0xff,0x19,0x22,0x12,0xff, 0x1b,0x23,0x11,0xff,0x18,0x24,0x0e,0xff,0x17,0x24,0x0b,0xff,0x18,0x24,0x0a, 0xff,0x18,0x23,0x0b,0xff,0x19,0x25,0x0b,0xff,0x20,0x24,0x0c,0xff,0x20,0x27, 0x0c,0xff,0x1c,0x27,0x0f,0xff,0x1c,0x26,0x0f,0xff,0x1e,0x2a,0x11,0xff,0x18, 0x23,0x0d,0xff,0x06,0x0d,0x00,0xff,0x17,0x21,0x0d,0xff,0x32,0x40,0x32,0xff, 0x4e,0x5b,0x3b,0xff,0x43,0x4d,0x36,0xff,0x43,0x4e,0x36,0xff,0x45,0x52,0x40, 0xff,0x37,0x42,0x2d,0xff,0x20,0x2b,0x14,0xff,0x2d,0x36,0x2a,0xff,0x43,0x4e, 0x40,0xff,0x7b,0x81,0x5b,0xff,0x6c,0x7a,0x5b,0xff,0x7a,0x81,0x66,0xff,0x70, 0x7a,0x64,0xff,0x34,0x40,0x32,0xff,0x32,0x3d,0x30,0xff,0x21,0x2a,0x1a,0xff, 0x06,0x12,0x00,0xff,0x12,0x21,0x08,0xff,0x24,0x2b,0x1c,0xff,0x37,0x3e,0x34, 0xff,0x4e,0x52,0x4b,0xff,0x4e,0x59,0x4b,0xff,0x59,0x64,0x4e,0xff,0x5f,0x72, 0x59,0xff,0x6a,0x7b,0x64,0xff,0xce,0xdb,0xc1,0xf4,0xff,0xff,0xbe,0x74,0xff, 0xff,0xbe,0x5b,0xff,0xff,0xbe,0x46,0xff,0xff,0xbe,0x33,0xff,0xff,0xbe,0x23, 0xff,0xff,0xbe,0x16,0xff,0xff,0xbe,0x0c,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe, 0x02,0x82,0xff,0xff,0xbe,0x00,0x2a,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe,0x02, 0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x08,0xff,0xff,0xbe,0x0f,0xff,0xff,0xbe, 0x19,0xff,0xff,0xbe,0x26,0xff,0xff,0xbe,0x35,0xff,0xff,0xbe,0x47,0xff,0xff, 0xbe,0x5b,0xff,0xff,0xbe,0x70,0xff,0xff,0xbe,0x80,0xec,0xf0,0xb9,0x92,0xba, 0xcc,0xa8,0xd7,0x99,0xb0,0x99,0xfa,0x94,0xad,0x94,0xff,0x96,0xab,0x94,0xff, 0x92,0xaa,0x92,0xff,0x8f,0xa9,0x91,0xff,0x8d,0xa7,0x90,0xff,0x8c,0xa5,0x8f, 0xff,0x8a,0xa3,0x8d,0xff,0x84,0x9d,0x8a,0xff,0x81,0x98,0x8a,0xff,0x7d,0x93, 0x86,0xff,0x7a,0x90,0x82,0xff,0x76,0x8d,0x7f,0xff,0x72,0x8a,0x7c,0xff,0x71, 0x84,0x7a,0xff,0x74,0x84,0x7b,0xff,0x76,0x84,0x7b,0xff,0x76,0x84,0x7a,0xff, 0x76,0x84,0x79,0xff,0x72,0x86,0x7a,0xff,0x70,0x8a,0x7b,0xff,0x6f,0x86,0x7b, 0xff,0x70,0x82,0x78,0xff,0x70,0x81,0x77,0xff,0x6d,0x82,0x77,0xff,0x6b,0x82, 0x77,0xff,0x68,0x82,0x74,0xff,0x67,0x81,0x73,0xff,0x82,0x66,0x80,0x72,0xff, 0x43,0x66,0x7e,0x71,0xff,0x65,0x7c,0x72,0xff,0x64,0x7c,0x73,0xff,0x63,0x7a, 0x73,0xff,0x68,0x78,0x73,0xff,0x62,0x78,0x73,0xff,0x1e,0x27,0x23,0xff,0x16, 0x23,0x10,0xff,0x38,0x49,0x35,0xff,0x1e,0x2c,0x19,0xff,0x20,0x2c,0x19,0xff, 0x1f,0x30,0x1e,0xff,0x45,0x5c,0x52,0xff,0x36,0x45,0x37,0xff,0x29,0x38,0x27, 0xff,0x27,0x2f,0x23,0xff,0x1c,0x22,0x16,0xff,0x1b,0x22,0x0e,0xff,0x16,0x22, 0x0a,0xff,0x1a,0x20,0x09,0xff,0x17,0x22,0x0b,0xff,0x17,0x24,0x0a,0xff,0x18, 0x25,0x0a,0xff,0x19,0x25,0x0b,0xff,0x1d,0x23,0x0d,0xff,0x20,0x27,0x0f,0xff, 0x21,0x27,0x0c,0xff,0x21,0x28,0x0c,0xff,0x22,0x28,0x10,0xff,0x1a,0x23,0x09, 0xff,0x06,0x0d,0x00,0xff,0x17,0x21,0x0b,0xff,0x26,0x34,0x2a,0xff,0x50,0x5d, 0x4e,0xff,0x89,0x94,0x83,0xff,0x78,0x81,0x76,0xff,0x76,0x81,0x78,0xff,0x56, 0x5d,0x58,0xff,0x2b,0x37,0x2a,0xff,0x32,0x39,0x2e,0xff,0x30,0x3b,0x2d,0xff, 0x4b,0x54,0x47,0xff,0x4d,0x58,0x54,0xff,0x47,0x4e,0x47,0xff,0x40,0x4d,0x3e, 0xff,0x37,0x42,0x3d,0xff,0x34,0x3e,0x32,0xff,0x1a,0x24,0x15,0xff,0x06,0x10, 0x00,0xff,0x15,0x20,0x08,0xff,0x23,0x2a,0x19,0xff,0x34,0x3d,0x2e,0xff,0x4e, 0x52,0x49,0xff,0x4e,0x59,0x4b,0xff,0x5b,0x64,0x4e,0xff,0x66,0x72,0x59,0xff, 0x70,0x83,0x66,0xff,0xc2,0xd4,0xb2,0xf2,0xff,0xff,0xbe,0x72,0xff,0xff,0xbe, 0x5a,0xff,0xff,0xbe,0x45,0xff,0xff,0xbe,0x33,0xff,0xff,0xbe,0x23,0xff,0xff, 0xbe,0x17,0xff,0xff,0xbe,0x0d,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe,0x02,0x82, 0xff,0xff,0xbe,0x00,0x6f,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe,0x03,0xff,0xff, 0xbe,0x05,0xff,0xff,0xbe,0x09,0xff,0xff,0xbe,0x10,0xff,0xff,0xbe,0x1a,0xff, 0xff,0xbe,0x26,0xff,0xff,0xbe,0x35,0xff,0xff,0xbe,0x46,0xff,0xff,0xbe,0x59, 0xff,0xff,0xbe,0x6d,0xff,0xff,0xbe,0x80,0xf6,0xfa,0xc0,0x8a,0xd2,0xe1,0xb6, 0xc0,0xad,0xc4,0xa6,0xec,0x98,0xb1,0x99,0xfd,0x96,0xae,0x99,0xff,0x93,0xae, 0x98,0xff,0x91,0xad,0x96,0xff,0x8f,0xaa,0x93,0xff,0x8d,0xa9,0x92,0xff,0x8c, 0xa7,0x90,0xff,0x89,0xa3,0x8f,0xff,0x86,0x9f,0x8f,0xff,0x83,0x9b,0x8e,0xff, 0x81,0x98,0x8b,0xff,0x7d,0x94,0x86,0xff,0x7a,0x91,0x83,0xff,0x76,0x8c,0x80, 0xff,0x73,0x89,0x7e,0xff,0x71,0x84,0x7c,0xff,0x72,0x80,0x7b,0xff,0x71,0x7f, 0x76,0xff,0x70,0x82,0x77,0xff,0x72,0x83,0x78,0xff,0x71,0x83,0x7a,0xff,0x6e, 0x84,0x79,0xff,0x6e,0x82,0x78,0xff,0x6d,0x82,0x77,0xff,0x6c,0x82,0x77,0xff, 0x69,0x82,0x76,0xff,0x68,0x82,0x74,0xff,0x67,0x81,0x73,0xff,0x65,0x7f,0x71, 0xff,0x65,0x7e,0x73,0xff,0x66,0x7c,0x73,0xff,0x65,0x7c,0x73,0xff,0x64,0x7a, 0x73,0xff,0x68,0x79,0x73,0xff,0x62,0x76,0x76,0xff,0x1e,0x29,0x22,0xff,0x16, 0x1e,0x0b,0xff,0x51,0x65,0x53,0xff,0x68,0x82,0x6c,0xff,0x63,0x7e,0x69,0xff, 0x5d,0x76,0x64,0xff,0x57,0x75,0x67,0xff,0x5a,0x74,0x6e,0xff,0x30,0x3a,0x36, 0xff,0x1b,0x20,0x0f,0xff,0x19,0x1f,0x07,0xff,0x1c,0x1e,0x09,0xff,0x18,0x1f, 0x09,0xff,0x1c,0x20,0x0a,0xff,0x19,0x22,0x09,0xff,0x17,0x24,0x0b,0xff,0x18, 0x25,0x0a,0xff,0x1a,0x25,0x0b,0xff,0x20,0x26,0x0c,0xff,0x22,0x27,0x0d,0xff, 0x21,0x27,0x0c,0xff,0x23,0x29,0x0c,0xff,0x1e,0x28,0x0c,0xff,0x15,0x1d,0x03, 0xff,0x03,0x08,0x00,0xff,0x08,0x0e,0x00,0xff,0x1c,0x28,0x15,0xff,0x1a,0x28, 0x17,0xff,0x17,0x23,0x15,0xff,0x17,0x23,0x17,0xff,0x15,0x28,0x14,0xff,0x1a, 0x2b,0x1c,0xff,0x20,0x32,0x21,0xff,0x1e,0x36,0x1e,0xff,0x1c,0x37,0x20,0xff, 0x1a,0x34,0x21,0xff,0x1c,0x36,0x23,0xff,0x21,0x36,0x24,0xff,0x20,0x39,0x24, 0xff,0x23,0x40,0x2b,0xff,0x34,0x3e,0x32,0xff,0x2b,0x37,0x2a,0xff,0x23,0x30, 0x20,0xff,0x30,0x3e,0x2b,0xff,0x26,0x2d,0x21,0xff,0x2b,0x36,0x28,0xff,0x4d, 0x52,0x47,0xff,0x4e,0x58,0x49,0xff,0x59,0x62,0x52,0xff,0x68,0x74,0x64,0xff, 0x76,0x85,0x6e,0xff,0xaa,0xcb,0x94,0xf2,0xff,0xff,0xbe,0x6f,0xff,0xff,0xbe, 0x58,0xff,0xff,0xbe,0x43,0xff,0xff,0xbe,0x32,0xff,0xff,0xbe,0x23,0xff,0xff, 0xbe,0x16,0xff,0xff,0xbe,0x0d,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe,0x02,0x82, 0xff,0xff,0xbe,0x00,0x6f,0xff,0xff,0xbe,0x01,0xff,0xff,0xbe,0x03,0xff,0xff, 0xbe,0x06,0xff,0xff,0xbe,0x0a,0xff,0xff,0xbe,0x11,0xff,0xff,0xbe,0x1b,0xff, 0xff,0xbe,0x27,0xff,0xff,0xbe,0x35,0xff,0xff,0xbe,0x45,0xff,0xff,0xbe,0x56, 0xfb,0xfb,0xbd,0x6c,0xfa,0xfc,0xc1,0x87,0xf2,0xf8,0xc1,0x97,0xe4,0xf0,0xc1, 0xb2,0xc6,0xd9,0xb5,0xd6,0x9b,0xb1,0x97,0xf5,0x81,0x99,0x85,0xfe,0x85,0x9e, 0x8d,0xff,0x89,0xa3,0x90,0xff,0x8a,0xa4,0x90,0xff,0x8a,0xa4,0x91,0xff,0x8a, 0xa4,0x93,0xff,0x89,0xa3,0x91,0xff,0x88,0xa0,0x91,0xff,0x84,0x9d,0x8f,0xff, 0x83,0x9a,0x8e,0xff,0x81,0x98,0x8b,0xff,0x7f,0x97,0x8a,0xff,0x7d,0x94,0x88, 0xff,0x7a,0x92,0x85,0xff,0x77,0x8e,0x81,0xff,0x76,0x8a,0x7f,0xff,0x72,0x86, 0x7b,0xff,0x6f,0x84,0x78,0xff,0x6c,0x81,0x77,0xff,0x69,0x81,0x79,0xff,0x69, 0x80,0x77,0xff,0x6c,0x80,0x72,0xff,0x6c,0x82,0x76,0xff,0x6d,0x81,0x76,0xff, 0x6d,0x80,0x73,0xff,0x69,0x81,0x78,0xff,0x67,0x81,0x76,0xff,0x66,0x7f,0x72, 0xff,0x65,0x7f,0x76,0xff,0x65,0x7e,0x76,0xff,0x65,0x7c,0x73,0xff,0x64,0x7c, 0x72,0xff,0x65,0x7b,0x6e,0xff,0x62,0x78,0x74,0xff,0x1e,0x29,0x22,0xff,0x15, 0x1d,0x0b,0xff,0x4c,0x60,0x4e,0xff,0x66,0x7f,0x6a,0xff,0x67,0x85,0x6d,0xff, 0x66,0x81,0x6a,0xff,0x59,0x7a,0x67,0xff,0x4a,0x65,0x5d,0xff,0x2b,0x32,0x2e, 0xff,0x1e,0x20,0x0d,0xff,0x1b,0x1f,0x07,0xff,0x1c,0x20,0x05,0xff,0x1b,0x1f, 0x05,0xff,0x1c,0x20,0x09,0xff,0x1c,0x22,0x05,0xff,0x1d,0x22,0x05,0xff,0x1a, 0x25,0x0b,0xff,0x19,0x27,0x09,0xff,0x20,0x26,0x0c,0xff,0x20,0x27,0x0c,0xff, 0x21,0x27,0x0f,0xff,0x1e,0x29,0x0c,0xff,0x2a,0x37,0x1b,0xff,0x3b,0x4d,0x38, 0xff,0x35,0x4a,0x3a,0xff,0x30,0x49,0x37,0xff,0x34,0x4d,0x34,0xff,0x3b,0x56, 0x43,0xff,0x47,0x61,0x4e,0xff,0x4b,0x68,0x59,0xff,0x54,0x74,0x62,0xff,0x5d, 0x7a,0x6e,0xff,0x61,0x7f,0x74,0xff,0x61,0x81,0x70,0xff,0x61,0x7b,0x6e,0xff, 0x5d,0x74,0x6e,0xff,0x59,0x70,0x6a,0xff,0x59,0x6a,0x64,0xff,0x56,0x66,0x64, 0xff,0x50,0x66,0x62,0xff,0x4e,0x61,0x5b,0xff,0x4b,0x5b,0x59,0xff,0x47,0x54, 0x52,0xff,0x45,0x52,0x4e,0xff,0x50,0x64,0x5d,0xff,0x3b,0x4d,0x43,0xff,0x49, 0x50,0x43,0xff,0x4e,0x59,0x4b,0xff,0x56,0x5f,0x50,0xff,0x5b,0x68,0x5b,0xff, 0x6c,0x7f,0x66,0xff,0xb6,0xcf,0xa5,0xf1,0xff,0xff,0xbe,0x69,0xff,0xff,0xbe, 0x54,0xff,0xff,0xbe,0x41,0xff,0xff,0xbe,0x30,0xff,0xff,0xbe,0x22,0xff,0xff, 0xbe,0x16,0xff,0xff,0xbe,0x0d,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe,0x02,0x82, 0xff,0xff,0xbe,0x00,0x16,0xff,0xff,0xbe,0x02,0xff,0xff,0xbe,0x03,0xff,0xff, 0xbe,0x06,0xff,0xff,0xbe,0x0b,0xff,0xff,0xbe,0x12,0xff,0xff,0xbe,0x1b,0xff, 0xff,0xbe,0x26,0xff,0xff,0xbe,0x33,0xff,0xff,0xc1,0x44,0xf3,0xfb,0xc3,0x64, 0xe9,0xf2,0xc1,0x8c,0xe2,0xee,0xc5,0xb4,0xdb,0xe8,0xc1,0xc7,0xd7,0xe6,0xbf, 0xc5,0xce,0xdf,0xb4,0xc6,0xa2,0xb4,0x93,0xe0,0x79,0x8a,0x71,0xec,0x74,0x87, 0x75,0xf5,0x76,0x8d,0x7e,0xfb,0x84,0x9b,0x8c,0xf9,0x83,0x9b,0x8e,0xfe,0x85, 0x9c,0x90,0xff,0x82,0x85,0x9e,0x90,0xff,0x57,0x84,0x9c,0x90,0xff,0x83,0x9a, 0x8f,0xff,0x82,0x99,0x8c,0xff,0x81,0x99,0x8c,0xff,0x7f,0x97,0x8a,0xff,0x7d, 0x94,0x88,0xff,0x7c,0x93,0x85,0xff,0x79,0x91,0x83,0xff,0x76,0x8e,0x80,0xff, 0x74,0x8b,0x7e,0xff,0x71,0x89,0x7c,0xff,0x6c,0x86,0x7d,0xff,0x6c,0x81,0x7a, 0xff,0x68,0x80,0x77,0xff,0x66,0x7f,0x76,0xff,0x64,0x7e,0x72,0xff,0x66,0x7b, 0x71,0xff,0x63,0x7d,0x76,0xff,0x64,0x7f,0x76,0xff,0x66,0x80,0x76,0xff,0x66, 0x7f,0x77,0xff,0x64,0x7e,0x78,0xff,0x65,0x7d,0x77,0xff,0x65,0x7d,0x74,0xff, 0x64,0x7d,0x70,0xff,0x61,0x78,0x73,0xff,0x1e,0x2a,0x22,0xff,0x17,0x1e,0x0d, 0xff,0x4e,0x60,0x4e,0xff,0x64,0x7f,0x68,0xff,0x67,0x80,0x69,0xff,0x64,0x7f, 0x68,0xff,0x59,0x77,0x67,0xff,0x4e,0x68,0x61,0xff,0x2c,0x33,0x2c,0xff,0x1c, 0x20,0x0d,0xff,0x17,0x21,0x07,0xff,0x16,0x22,0x08,0xff,0x18,0x22,0x04,0xff, 0x1c,0x23,0x07,0xff,0x1d,0x25,0x0b,0xff,0x1e,0x25,0x0e,0xff,0x1f,0x25,0x0b, 0xff,0x1f,0x25,0x09,0xff,0x1b,0x26,0x0a,0xff,0x1d,0x27,0x0a,0xff,0x1c,0x27, 0x0c,0xff,0x1a,0x24,0x09,0xff,0x39,0x47,0x34,0xff,0x81,0xa2,0x9c,0xff,0x8a, 0xa8,0xa1,0xff,0x87,0xa8,0xa0,0xff,0x81,0xa2,0x9c,0xff,0x83,0xa2,0x9e,0xff, 0x85,0xa2,0xa0,0xff,0x83,0x9e,0x9c,0xff,0x7f,0x9c,0x96,0xff,0x78,0x98,0x92, 0xff,0x70,0x90,0x8d,0xff,0x68,0x85,0x81,0xff,0x64,0x7a,0x76,0xff,0x5d,0x70, 0x6a,0xff,0x56,0x66,0x66,0xff,0x52,0x62,0x5d,0xff,0x4e,0x5d,0x58,0xff,0x4b, 0x58,0x50,0xff,0x4b,0x54,0x4e,0xff,0x45,0x52,0x4d,0xff,0x47,0x50,0x47,0xff, 0x45,0x4e,0x45,0xff,0x4d,0x5b,0x50,0xff,0x4e,0x59,0x4e,0xff,0x4b,0x52,0x45, 0xff,0x4e,0x5b,0x4d,0xff,0x54,0x61,0x50,0xff,0x54,0x64,0x56,0xff,0x52,0x6a, 0x54,0xff,0x70,0x8f,0x6e,0xfe,0xc3,0xd2,0xb4,0xbb,0xff,0xff,0xbe,0x4e,0xff, 0xff,0xbe,0x3d,0xff,0xff,0xbe,0x2d,0xff,0xff,0xbe,0x20,0xff,0xff,0xbe,0x15, 0xff,0xff,0xbe,0x0d,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe,0x02,0x82,0xff,0xff, 0xbe,0x00,0x6f,0xff,0xff,0xbe,0x02,0xff,0xff,0xbe,0x04,0xff,0xff,0xbe,0x07, 0xff,0xff,0xbe,0x0b,0xff,0xff,0xbe,0x11,0xff,0xff,0xbe,0x1a,0xff,0xff,0xbe, 0x24,0xff,0xff,0xc2,0x33,0xe8,0xf5,0xc9,0x6f,0xd8,0xea,0xc9,0xaa,0xce,0xe0, 0xc0,0xc4,0xd0,0xe0,0xb8,0xb9,0xd1,0xe1,0xb7,0xb7,0xcf,0xdf,0xb5,0xc0,0xcb, 0xdb,0xb0,0xc2,0xc8,0xd6,0xa9,0xbc,0xc0,0xcb,0x9b,0xae,0xa9,0xb7,0x91,0xc2, 0x94,0xa7,0x86,0xd7,0xa4,0xb7,0x9b,0xd7,0x9d,0xb4,0x9c,0xea,0x8e,0xa5,0x95, 0xf8,0x86,0x9e,0x90,0xff,0x85,0x9d,0x8f,0xff,0x85,0x9d,0x90,0xff,0x83,0x9b, 0x8f,0xff,0x82,0x99,0x8d,0xff,0x80,0x99,0x8d,0xff,0x7f,0x97,0x8b,0xff,0x7e, 0x96,0x89,0xff,0x7e,0x96,0x88,0xff,0x7b,0x92,0x84,0xff,0x77,0x90,0x82,0xff, 0x76,0x8e,0x80,0xff,0x74,0x8b,0x7f,0xff,0x71,0x8a,0x7f,0xff,0x6f,0x88,0x7d, 0xff,0x6e,0x85,0x7d,0xff,0x6c,0x83,0x7e,0xff,0x68,0x81,0x7a,0xff,0x65,0x7f, 0x77,0xff,0x63,0x7c,0x73,0xff,0x62,0x7a,0x70,0xff,0x60,0x79,0x6f,0xff,0x61, 0x79,0x71,0xff,0x62,0x7c,0x72,0xff,0x64,0x7d,0x74,0xff,0x64,0x7d,0x76,0xff, 0x65,0x7e,0x74,0xff,0x5e,0x7c,0x74,0xff,0x1e,0x2a,0x23,0xff,0x19,0x1d,0x0f, 0xff,0x4e,0x60,0x4f,0xff,0x64,0x7d,0x66,0xff,0x69,0x80,0x69,0xff,0x63,0x7d, 0x6c,0xff,0x59,0x77,0x6f,0xff,0x4d,0x66,0x5f,0xff,0x2b,0x33,0x2b,0xff,0x19, 0x20,0x0b,0xff,0x16,0x1f,0x09,0xff,0x17,0x23,0x0e,0xff,0x1b,0x26,0x13,0xff, 0x21,0x2a,0x1c,0xff,0x20,0x2a,0x1b,0xff,0x19,0x25,0x0f,0xff,0x18,0x25,0x0b, 0xff,0x1c,0x25,0x0b,0xff,0x19,0x29,0x0c,0xff,0x18,0x2a,0x0a,0xff,0x1a,0x29, 0x0c,0xff,0x20,0x24,0x0c,0xff,0x2a,0x35,0x22,0xff,0x5f,0x78,0x6e,0xff,0x65, 0x7a,0x78,0xff,0x59,0x6b,0x67,0xff,0x52,0x62,0x5d,0xff,0x4e,0x5d,0x56,0xff, 0x47,0x58,0x4d,0xff,0x47,0x4b,0x43,0xff,0x3e,0x45,0x3e,0xff,0x34,0x42,0x39, 0xff,0x30,0x3d,0x34,0xff,0x30,0x37,0x32,0xff,0x30,0x34,0x2d,0xff,0x2a,0x34, 0x28,0xff,0x2b,0x34,0x2a,0xff,0x2e,0x37,0x2a,0xff,0x2e,0x36,0x2a,0xff,0x30, 0x39,0x2b,0xff,0x34,0x3e,0x30,0xff,0x37,0x40,0x34,0xff,0x39,0x42,0x34,0xff, 0x3d,0x49,0x37,0xff,0x42,0x4e,0x3b,0xff,0x45,0x4e,0x42,0xff,0x4d,0x50,0x49, 0xff,0x4e,0x59,0x4b,0xff,0x54,0x61,0x50,0xff,0x56,0x66,0x58,0xff,0x56,0x72, 0x5b,0xff,0x52,0x66,0x52,0xff,0xa6,0xca,0x99,0xee,0xff,0xff,0xbe,0x47,0xff, 0xff,0xbe,0x37,0xff,0xff,0xbe,0x29,0xff,0xff,0xbe,0x1d,0xff,0xff,0xbe,0x14, 0xff,0xff,0xbe,0x0c,0xff,0xff,0xbe,0x06,0xff,0xff,0xbe,0x02,0x82,0xff,0xff, 0xbe,0x00 }; static const GdkPixdata vcs_pixdata = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 25367, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 452, /* rowstride */ 113, /* width */ 60, /* height */ vcs_pixdata_pixel_data /* pixel_data */ }; nvidia-settings/src/image_data/antialias.png0000664000175000017500000003170412236467170021364 0ustar albertoalbertoPNG  IHDR<29PgAMA7tEXtSoftwareAdobe ImageReadyqe<3VIDATxb?Xsν?1$A.!O>G>ٳږfdgy 2 j{&@Ď@lq%Te@PqSfff/_Ύbbbn6 /$$$  FJ id>@`C|SN5#"Qџ,w0gppjnY%ϗ-a|_ 'þ0DO4韛I'''f20}a`0%1j:?*޽{p]۳2"NFN6&n6v2|a5Х92>e`~)wA! @zZI `Z(  bիW?wH $$?4yФ @?@ު/48;KtC#{!^z-CѠZyX,zE襄ԕARsiuS)~9_ӛ0mD"7FPV/ɲ|.͎Bt:m[5Ul0P8襎O*~lKUhN6 Z/Fc{F+z 7:pK(>ˡ"Wl6r8vDը-4yGql6fՏ¾#:wGw OӻuyWIpbIJ`P zP?B*sMK8[Pa *2VNŁEa7cwZwUoPЁv VڡvaqqIdI|Oۉt7x!?ψC NOOqi<_?6 wzzz:::|04UIbݻn;ܕrLLLXO\y~0jR)-$1uS* l_&e}}8V| }6gqTq٬b=!\ßmkT*;;;KX\WDam˘ "(Fji `B5%ߝ9Z3/YR*:L\GEp;D^~Cg},oPx!@r,߶oωk7143u, FUwϧ昩H-b׫m ZA3R~)uuuzKK w,K6gӉцBe3O'*3?)(+ rD'@]]deD&-8Or#=Ά8 ^-"@ji} -/c-Z` P(0 ÊFǨY/J!NH- $!BI &^E W בxyZtȋB0r^]ݑ1 tHjaP-(c~͓C+:җ!f7X1QָJ 5_HU]'?Ndi8Jqb~0G̞zvaoɍl$;p.bdruVO#o} ɳԉ[ (yqc>AgWZykfk7UUн{O2|GsuCwf-FQߜycv]h3>BK/ 5UjԨ1.0&$W>" /\^44*P@+ږvǴyaLԠFt=sw~}gΊRֵy $͑Ht:~qڈhkkXfׯOXyc( Bȣf:;;o| T_.k׮cG=M_8FEdS0_ eS@ ۷V`J G0_^+ .)2e0t}㌾k?~E7"+jϣ*a&VNG1i(2`L"fdq8?R_&H]|n~*z.R4pN-?f0*0G:hoݰaCsGGGB>PQIP(SR) }Lú8eRtjB@E}o{긶үuJhʮd#qe="cCv)+dRQT{#>9̏@TPcV ^d6f"iD-ٲe9^2oǯcT$T;Ir\-S{8FIkzqb-R6ش=Avʞ7=0FW*υTʢ*"# jy:oJ}-d(%6C(^ɴMc?iBKxB@J`P8".m۶m mnǼlr`Y ` NLPNt񓑪ĪrbqbX( lQ^(<1L` o#$'ARifϞ>3M*bEDK$˖-{O w2!uDf((HEہA4<=:҂d#=? $ A*Qf)_2J [[ "$KCnѝԙ܃FIe TO2VH2lc1^9Di!B' auŽHno᠗ bESIg)W^ Cquy}Yy4ǽ\9tX9XF<'ީ3'A<js) w(amY\Ù9sf;[O8aZy1 ϧiix- f]aeǧ#ɎwKODXD.w|R2bm&oK||dqOiJ T bJN/z֮]n|" ykjXu/{#.&nK{֭[6muU$ݻw/<ӡdt]F}ME+.[b@c#`` ad-?y枝Be,$oLUaOþ }BT666ҥKi1w^$Oķgԟh%g0[;>pg|. /)1c577"%Y? w{[^Bh6I1 3ڂ ":A À0.`QvKl D@P ( K}n}k5:wͻogw}MQ{1ۚ5k&zy@1JmYvm;¢E5kA$ޓ`P{!ȭ;t7s1I5j۶mD$hҥKwaC&]S(˩ժU9qZ)zŊCϟdʕW^$l7SMH$kzСa֭555k~;yT%`&ٹs瑒狊jkk}kCEEEc}ϞzcCԽ;-rȋq(V0Mj4n"!)ʀH2߰K3{Y$LK'l,("V$ *2O )e/\pᵥC~90!Nh2+aI (ggYX) HŵpnT>>KJJ0长MZw_4/gh^kvLb%H34m4|.tpRAr,Mp|NgΜ9H$>}aÆU#,́Tr sY8Y3 JV8)J#K-,zerMm{cШ7KphK_j Zkޤdz\)#ð.t4ԆTciq$G{GT? Ѷ R=XP/0 /_>\gZ$Y2*N-ejjIFFID!h(+y򸡥HX5O/IZp-jqEz^9i#vkBE]tM0p$&t-gzVIleyL`5[^%V1fZx JZF{qY]E_KJb̖xD8$Kh$Y삤4ޓj %۫):p>3cߙ7cA4<`HCn[hDzlٶv6XH)rEn5`pRVB9~ 6k(|RNAzMQJs]N;d\CE[- W3 "< wA.cb8f` N8`u,bc2#3Yf7} >HAge>q⪓[mImE&6kw["A:) R<drqU5:;( R$1Iq4xt`#xv\2,4h/ wݴC苘FSJ{5w|9< g侁n`'x7f[$C;4ޙsdk0c(4ṳ$R.шRgI@6-QInUXG) S,$N5vܑHj555 Bq޼yvatM:N_:f}땣vg#5k@MR,O"X6즔[|mU+bBktm:%?ᮓi ǘ("( `W1C80vԩ-Zd7N1cƳ#G8|/[EIӖ+'~\6SD&_Q#^dP `9ǘJ~4-JG(XS"O:luEjP㢋.q́WJ^{#U^ׯw?c[~ҥKG1{xqѣ|^8ܿgon^ >M;/硆 }Ǐgk%KPqq1544Tkhx x=]>8 ӏPx'p`CVX+o #G E"8O(4&yTf>]*ڛ={H$8s q]ŋTWWR8!K!.`^cuŪR镸E^+G0+F|%D(`oݺ5Vo1dɒzTzm' '2-˲Qd/K޴W(Yl*D]ṰOvXwum7m)st{Ӟ_q)\D< A}m7~/=Yw<=>ͱisDQ鐑xd>Ą]?[ȕ9D/\\ go#ٍF5j?TQ_vXM}>*oR b! d2Z 8~p/_-Ѧ:Ė@d20'$V3>GG|o}^뮻>BoLR0 oLET((“idFm/Pma(uH?.| @CŔ` Y}9G裞֟7{e9 h3|=D\bJ-T˳{ߑԕ-PqyW;r!MwΟ`˺ LAXCH$@ڎEe{hChL(,:qVF@`r"UX\+/ [%9?ɋ .`< , Pw1(/4=5LTl!ӦMާ>a7*EdDeqdr/jyPE:yAyTѰZ2(۝eۃ'BԊ[fG..BMQ' XsQ[YϦ3>\c[Cp3H3Qi`qUdR8rHo,K :t:abɌQG8ПB¥fq2 X ?DA]Q[&^`Z}PZn~nmٔ9y>v]"[  Py0!Ow˼k>صZ'߻Ac I!)f-YFȩy]XB6|M (jLUV侵"wuE%9S- T4B<05gbBآjߑE|yy9(BQh h*Wa>0C@=M|h!5enD *VAtjHP/PM` nJYAv[&3bݖ0e+]~o/[IBf "Z8*q' #V04V}=G_/& \I z|Qg4Tu)K7IԬK' _T b)B.xo8a8p%5EvJ* iN0gA @񗓕EjHƪ J!bOݖ?&uS3-pO®oֻP2LU#@&+`4yUSvbq/F/ܱfՕaw% GJ BPݢb$8Mol9]CEer1ȐBܵ ;E-_ң<ї몒ey\&f V=GXHbwReJ^ q\x&m@TiMǶa >xTeq .4Aߩ)-Rv£ooU:sɰHܱJIM3o#A3.N%UhTXdB4$;b)?s Ĕ6lX{yƍ(eUsNe`ᕬ.[K%+=`t`iXgؼAӈ(l?°K,//sb3ݺ} Y؟bcHǑW,j 4m*SP'%}jCW)4H!5%ˈÀp1<<2r_ 9 3F?whY[?} h% H.DjKvecy t!24×> ,X9`X:pCa:Ic… WڵKW.[ rN> ^ {ly,&>ƪ?ǂHFl _U$\4B7_ 'ԤcB <%+=`(VctP^ܐh K;jbj_%/ Vd< Ǐt>BaeVqO@b|2YSZSSSeCC\p3f$9+Dcݯ~;њWfيh4V/W$Wr&u&I3.}YmrVJOL$J1~S=CTKM;gYΟMjLgxz/_@ ֗8b`W&@CɰKIxXo:"W*ޝ(-4R`|8 kjj<9Ml§WVVVnͮR^ۼys )c]&OWHooԪ|۸O:th?`L߿{AgQ'"/<״bfDӇ@W`*ҁHXjKΟ|USǺ3GXV]7MUׂS=瞑ʆmLg+ 7߸aTWNQz C1o2wyw%sKf3T[Xk*0Y%bNF2d#F7qwoA>(1)L-lq6+ 60(%*dcrҨ7JeqDoQFk6HV  ~t>E`$K+Oˮycm)Yvw2X1nM7hO;Y"Ѝmbd/S;U5KFs[lUJ_җ5z)Q55ܹsAggdOßKV2\bop.}?ó>+`kϞ=cPlW{=JWU}"P`Q`8ɜb6b>@ݍE&MnZZZ %&kڴrN b_9(>Fr2ŵ>* *u y&˖ ((=J\ޔIENDB`nvidia-settings/src/image_data/x.png0000664000175000017500000002517612236467170017674 0ustar albertoalbertoPNG  IHDRe<DfgAMA7tEXtSoftwareAdobe ImageReadyqe<*IDATxڔP=,A}s;(CT]q_"A.:ТЈ)H$$zBq"H̎L23{ 5̤-io )3T |^^Ug(|aSC#pUBmDPS40@VO4jer{xLO=-- ;v; 2(PJӰ؎+JŌŎQm5 X=aXPɅ%Q-2'>`G+5=_m'H65+'_75 )D DQf%+ڬڊ"[i!~v le#V KXd+K;-1 YGBsS^ۯ<cS L=Fcbu!%NrřY^\d2?֗Zx[ϗsNSR!k dKobscQp/@ r9)zɳG!Z|uSUrHgc\_"s*?JlZXp ޻Սx>^?9n6fp502P!ס=rA * ͛1 8?ˀͦHuQI[At᪠ 6hQAV` m1ʌ?8 ws0]{ιjNN>gwdB9*P"vʹX{=HCUsW.w@8x*^ m@*cahIߗOMhh#}n `Yꥦ='-dxZ8*LNV(DNX4:4(]y"t]b2h/QRȲ)qnVI%lf Jkh'u+o28n7ݏFf)66;h?%#+/({hyQ//H@ !1t@H|yZK=v,"#xa삂M6B>/\@/޿WCHY>MXYOb>B#/x&gӉU.'E?;ۦ+޺!eI-iFhi$A]҂J!ڇ(z@IJ4*bô@VKuۙgk/|9?;9%C<^W@ dL~e噜h)ؖKտ:Z^g$󏽁q]tuzcL"{V?sED$gm8C-nÆ \H ?!Gl H= ˃_8E4 T詙~02L­**6Fb1pM(n٦t:C5f㲑XUPɰ&f:4}uzg/P] 8 + Np:Lk%}'H(LA@(PB9ݑ^p}\wtt;c$5qm1o |a63$(9EDP*e|Uෝ0ʒ4ƚK5Y_]g?n3#Ђ1? aCe*HTyӔTh>z4J=2>xi0 .pX 郉*f<]D1QhXlb $0A[[e 1pæXKraQAYae&.]44JAlR,yq>"k4M3NUGvCs;DCVMq5<Ҍ='HCsjzz(uH06ݱ\9 mO&}t'{ww(#]W`05FM1LcL2-?0v,4:gf1*<0ˮvG+T2UĂ3")JHú)Wp_2<~2 oUeԤ#/eƟǽ81P#%3lSZe32#t1?Mmksme6j:4Iu@&p{{qOkw{<|Pڸmf\"% \31 ֣IRRgܫie$NEji,Ɖ '5>tq!ֵWQjL6ۦAz 2U<݊յVgk=mƿRlQ)'g:ʊ*~+4LҌivg,p ;7Ȋw^cنEֽ|{feu1gKPvqPzЇ-ݰ>/}/QSŒ'T~GaXB vD#`R a5if`-pB n}^ ,|k)3?2|@|M r~ldfY=A`sF_tȽOn8@UsdjH8&Q (@H UE&Imc.XU,:1%k k9,2EhX|*J|Zƒ4ä)![{ {ݟUPeNEa geLr7-&Jځ;<FVF<#dcE YD- dI8 _7]XS(K&)X=.WLyaVIdft>4N++HOrg"ct{4IV3 حi*)M)QBF?$d7n7W?m]/~wݳ J`JfȚnTd(jUՂNsG; Y1I \~#UԕD>* dwLtXFoH|Gaz 6z|c|8ۮCq~*${4|Q`[yKې/Kݔr57z8nYʮt-NXr7e Ajc2qmU /.k+œJf'U]|n|TW,1?vsfϞmbq,=?.ݱj k(LύŌ"u j$Rb*Cq 4h㋢&[iGO$V?Qm_wv'.k(?Óۼ&"ǑiNhxH \\∕ baR5"Zi4x/ ߙ̜UU ƃ{ɂ1b !׍>+.~GEү`.eX1c4J;D8ve?z^LĐMwu-Z|ŌY?^wDFL1" tӭ-nH~ 1c=CpMܙv|<K`eIԫ,m!܁3Iy9wٝ&]6FqE7KEQbjRrUh u!'9nq]AFe83v +򐺰E {+dRbPo*1Օ$'\kzXybk3TB nc RIh+=!I 8PpJ'DN/5ϟF5V:lYFuޖS]yDCH&U$"\:3V( K{*c.@4%)A@IPnYS `O_JX>>}=^[).sn on? d)ː@~8{5-#ҙWg{ $xQ-68˽̰\͌\ }M1Ýix6`}Š͜W݃ΞAQ[tu _rzNy}L^㥐E0FD0c RM1yz]P25B5L΁e[ ڡB@p?NN>WϜv`8r=B{'kźXm \C_Z2L+̄54]O¿ax4DMWR97~Nd^_*.c 4Qп hbhLvJUS͉A<7ܿ_hԺv4ҸJj o\tOJzgwj>dj_ysPXZjXܦ"J :jj[!>uYd+'9\ l)3Xk`C X!bBnnnBQQ`7pwuD^A؀D[0XY|+@;U}L&<& yPXi"t]?TPVURS0i-m ̛'_o[mC 鄆[@P:n8"-|Hd7`ӕ()>^g/|hA 6.=q0| ##Z(/$ٍ,cW#L{K3Z켍HS??>"7bhTI(a W% "{?8[&%(fO[GdώpDdq499 ȗX[yGLr*=0uD9 t8MYQ$ނ7?4X=3 $"=ÛU'jN\"[Iul=NHJrppO2 c4]aZXŪ^jk"ւ%{ a_^=h#<68R;ĬHq!D nGT'bOXD=qԱZѰ+) 0hWp1y0D{0 dNсs5+y9^B8s+آ{Ip{?~ZvAs[w'^Ĩ/5g+2,B+Ȼ2o< N][;;Kٰ"RIA4#(0. EDa[WB]pESP 0ȕ&)dE1'-n0"sb(]U~ZETϿǷl{m@0u͐=&j:RZ৞Ú =v[,mޑm|^cpUw\7f+)'> YWtNtŴf"n&au#suhBh>eHɋ8 cF켚ڋ5s= ,-5#num0%maB~c-\_1aҡ0驉ϙ`S\.ҫpǴǬxzkunjߞ4dTFVܵ{cT~!;nNJ NqHgԮCD:>4p¥2HQ\>J4f"WL/@hjr42 Q5+>D;=`_=קazz`#P X/]ɉ6ot%=:Nv45 U.4HJ>jь\2UԜ;/‡lGAAuJbz($Y! k@R\֡5 E'csd7ј9 auUaKHi be!΃Rm(M/1n(MiVÚUKxC&zMo P_κxVVVy<džZZƿ?}^농z{;_/GcT!_݊ט26CbhBߣB %KLEA1-M_WB c-*$ Yv|"6 遂rGwb@U6Jxh[6j999gJJJ|30W]=}͡m+mj69jk0Tuwh}iMO;Ӡ [6y PQy2FK#Ş jqU*)S\C*ц G(Ƥ'l:Aڶ^W" a,KCZ )2{xnدa>ݥ9?{rJ%!;|mx7"{D:Nv fv5_全5ރ@bQ{M.U^ #9[Rv DQS1ըXcq&x|seopTii3nj{Grfjh^ǯ)YU~y;0nјhF$~cdz^FaHĤ":: ֋fRrDFE";:ص :*"(y)܎Y챪Y>AK~#Jfn; 9M zNhԣ$3:!Xi<7BuQŅ:X/<_<ث3vo8I, nΈIcf68Ƥ̃p% _tF{bVzh7n8,1ߵ|Dy~(ao^hw}d!S_|+ .⠨,M˜,/giM w󶋟]:_X uݳ"Z\">WQs'4[TSzMh+:P ^[[L2hJ&sk ш @4R@bQ!+䎒SCLtpxE=Dž^H]M&AII=۟ƕ6sgE_Jr0tF=Ar0JLaE^6@t' &G,Ll+ z8fW@4j`drR.ʼ#ˍr6_4̛?үv\VbZ3s,tsӀo=/7d ħ,^ (H|I +`a.QY` F)QFX`Ʊ$ÐL7dSLkg-\Koݳ5tК_skr* Kr믍 j}k} Ϣ5}r[A`撨%@J!R3I/ )kF_xIICUAnf@jrq||WWo=.\A]c4A59d{WߌvL6͕?SfͼrߺF[_O=sz4JC+ \D+e c."XvD#b>#F'k@|]e^ɴzOI!* 2`xA:4|p| \ePz]P -]n Х j)D\~\7o޼`YYYZJJ Q-_R:RM9={G\l j~ г\'G= 8cȸLJŠ&fJ_H '4rͿqC' 3P#eG +cs}oXj#p%oh;5 r35=AʎQFQ׼|ً~n<ܷ:{:#tܜ-]ѢO,^([S5';Ac@7-c"+kGOp9f1GuR=gaCalq/Ƀw߄ٳ˸A<$xqճg/CM޴ Zdpc>x`t6I~rMst%ʒu;lkYD/[OkX$exϞ;l xb)?Bo&e?Iq;!;˽懍W1Fq[ˡ3.@]};4:i e8@th8YvhΞ="%i_J=0ⶅ I}w\Gn隷i}2yq(IGY[8P<2r 'q}<%EeGGDT:rzN,1k=is^W_Y7s^aX>a‰NG .'lYA]wP4P>V~V%lԣK 9kլcawtc'@clOVվč$&&2I^oԆШqtj 0=xTץ"ָi(b9i.4 Y^9O5w/3XIENDB`nvidia-settings/src/image_data/background_tall_pixdata.h0000664000175000017500000354662112236467170023743 0ustar albertoalberto/* GdkPixbuf RGB C-Source image dump 1-byte-run-length-encoded */ static guint8 background_tall_pixdata_pixel_data[] = { 0x04,0x2b,0x5b,0x0e,0x2c,0x5b,0x0e,0x2b,0x5a,0x0d,0x2c,0x5b,0x0e,0x83,0x2c, 0x5a,0x0e,0x06,0x2b,0x5b,0x0e,0x2b,0x5a,0x0e,0x2c,0x5a,0x0e,0x2c,0x5b,0x0f, 0x2b,0x5b,0x0e,0x2b,0x5a,0x0e,0x82,0x2c,0x5a,0x0e,0x82,0x2b,0x5b,0x0e,0x83, 0x2b,0x5a,0x0e,0x01,0x2a,0x5a,0x0d,0x82,0x2b,0x5b,0x0e,0x02,0x2b,0x5a,0x0e, 0x2b,0x59,0x0d,0x82,0x2c,0x5a,0x0e,0x05,0x2b,0x59,0x0e,0x2a,0x5a,0x0d,0x2c, 0x5a,0x0e,0x2b,0x59,0x0e,0x2b,0x59,0x0d,0x82,0x2a,0x59,0x0d,0x01,0x2a,0x59, 0x0e,0x82,0x2a,0x5a,0x0e,0x04,0x2a,0x59,0x0e,0x2a,0x5a,0x0e,0x2a,0x5a,0x0d, 0x2b,0x59,0x0e,0x84,0x2a,0x59,0x0e,0x83,0x2a,0x59,0x0d,0x82,0x2a,0x59,0x0e, 0x04,0x2a,0x59,0x0f,0x2b,0x59,0x0f,0x2a,0x59,0x0f,0x2b,0x59,0x0e,0x82,0x2a, 0x59,0x0e,0x82,0x2b,0x59,0x0f,0x01,0x2a,0x59,0x0e,0x83,0x29,0x59,0x0f,0x02, 0x2b,0x59,0x10,0x2a,0x59,0x0e,0x82,0x2a,0x58,0x10,0x03,0x29,0x57,0x10,0x2a, 0x57,0x10,0x2a,0x58,0x0f,0x82,0x2a,0x58,0x10,0x05,0x2a,0x57,0x10,0x29,0x57, 0x10,0x2a,0x57,0x11,0x2a,0x58,0x11,0x2a,0x57,0x10,0x82,0x29,0x57,0x11,0x03, 0x2a,0x57,0x10,0x2a,0x56,0x11,0x29,0x56,0x0f,0x82,0x2a,0x57,0x11,0x07,0x29, 0x57,0x11,0x2a,0x58,0x12,0x2a,0x57,0x12,0x2b,0x57,0x12,0x2a,0x56,0x12,0x29, 0x56,0x12,0x2a,0x56,0x12,0x82,0x2a,0x57,0x12,0x0b,0x28,0x55,0x12,0x27,0x53, 0x10,0x26,0x52,0x0f,0x24,0x51,0x0f,0x25,0x50,0x0e,0x23,0x50,0x0e,0x22,0x4e, 0x0d,0x20,0x4c,0x0c,0x1f,0x4b,0x0b,0x1f,0x4a,0x0b,0x1f,0x49,0x0b,0x83,0x1e, 0x48,0x0a,0x01,0x1c,0x47,0x09,0x84,0x1d,0x47,0x0a,0x04,0x1d,0x47,0x0b,0x1e, 0x47,0x0a,0x1d,0x47,0x0b,0x1c,0x47,0x09,0x82,0x1d,0x47,0x0a,0x84,0x1d,0x47, 0x0b,0x01,0x1c,0x46,0x0a,0x82,0x1d,0x47,0x0b,0x83,0x1c,0x46,0x0a,0x01,0x1b, 0x45,0x09,0x83,0x1c,0x46,0x0a,0x82,0x1b,0x45,0x09,0x82,0x1b,0x44,0x09,0x01, 0x1a,0x44,0x09,0x85,0x1b,0x44,0x09,0x82,0x1a,0x43,0x08,0x03,0x1a,0x44,0x09, 0x1a,0x43,0x08,0x1a,0x43,0x09,0x82,0x1a,0x43,0x08,0x82,0x19,0x42,0x08,0x02, 0x1a,0x43,0x08,0x18,0x41,0x07,0x82,0x19,0x42,0x08,0x03,0x19,0x43,0x08,0x18, 0x42,0x07,0x19,0x42,0x08,0x83,0x18,0x41,0x07,0x01,0x17,0x40,0x07,0x82,0x18, 0x41,0x08,0x82,0x17,0x40,0x07,0x01,0x18,0x41,0x08,0x82,0x17,0x40,0x07,0x01, 0x17,0x40,0x06,0x82,0x16,0x3f,0x06,0x04,0x17,0x40,0x07,0x16,0x3f,0x06,0x15, 0x3e,0x06,0x16,0x3e,0x06,0x82,0x16,0x3e,0x07,0x01,0x15,0x3e,0x06,0x82,0x15, 0x3d,0x05,0x08,0x14,0x3d,0x05,0x15,0x3d,0x05,0x15,0x3e,0x06,0x15,0x3d,0x06, 0x15,0x3e,0x06,0x15,0x3d,0x05,0x14,0x3d,0x05,0x15,0x3e,0x06,0x82,0x15,0x3d, 0x06,0x03,0x14,0x3d,0x05,0x15,0x3d,0x06,0x14,0x3d,0x05,0x82,0x14,0x3c,0x04, 0x01,0x15,0x3d,0x05,0x82,0x14,0x3c,0x04,0x03,0x14,0x3d,0x05,0x15,0x3d,0x05, 0x15,0x3c,0x05,0x82,0x14,0x3c,0x04,0x05,0x14,0x3b,0x04,0x14,0x3c,0x05,0x13, 0x3c,0x04,0x14,0x3c,0x05,0x14,0x3d,0x05,0x83,0x14,0x3c,0x05,0x82,0x13,0x3c, 0x04,0x03,0x15,0x3c,0x05,0x13,0x3c,0x04,0x14,0x3b,0x04,0x82,0x13,0x3a,0x04, 0x02,0x14,0x3b,0x04,0x14,0x3c,0x05,0x82,0x13,0x3b,0x04,0x82,0x13,0x3b,0x05, 0x01,0x14,0x3b,0x04,0x82,0x13,0x3b,0x04,0x02,0x13,0x3b,0x05,0x13,0x3a,0x04, 0x83,0x12,0x3a,0x04,0x02,0x13,0x3a,0x04,0x12,0x3a,0x03,0x83,0x12,0x3a,0x04, 0x01,0x13,0x3a,0x04,0x82,0x12,0x3a,0x04,0x01,0x13,0x3a,0x04,0x82,0x12,0x3a, 0x04,0x02,0x13,0x3a,0x04,0x12,0x3a,0x03,0x82,0x12,0x3a,0x04,0x02,0x12,0x3a, 0x03,0x13,0x3a,0x05,0x83,0x12,0x3a,0x04,0x01,0x12,0x3b,0x04,0x82,0x12,0x3a, 0x04,0x83,0x12,0x3a,0x03,0x01,0x11,0x3a,0x03,0x82,0x11,0x3b,0x03,0x03,0x12, 0x3b,0x04,0x11,0x3a,0x04,0x12,0x3a,0x04,0x82,0x12,0x3b,0x04,0x83,0x13,0x3b, 0x04,0x04,0x12,0x3b,0x04,0x12,0x3c,0x04,0x11,0x3c,0x04,0x12,0x3b,0x03,0x82, 0x12,0x3c,0x04,0x02,0x12,0x3b,0x03,0x12,0x3c,0x04,0x82,0x12,0x3d,0x04,0x01, 0x13,0x3c,0x03,0x86,0x12,0x3d,0x04,0x0b,0x13,0x3c,0x03,0x13,0x3d,0x04,0x12, 0x3d,0x04,0x13,0x3c,0x03,0x13,0x3d,0x04,0x13,0x3c,0x04,0x12,0x3d,0x04,0x11, 0x3c,0x04,0x12,0x3d,0x04,0x11,0x3c,0x04,0x12,0x3b,0x04,0x82,0x11,0x3b,0x03, 0x06,0x11,0x3a,0x04,0x11,0x39,0x03,0x11,0x39,0x04,0x10,0x38,0x03,0x0f,0x37, 0x02,0x10,0x37,0x03,0x82,0x0f,0x36,0x03,0x01,0x10,0x36,0x04,0x82,0x0f,0x35, 0x04,0x82,0x0f,0x35,0x02,0x82,0x0e,0x34,0x02,0x82,0x0e,0x34,0x03,0x02,0x0d, 0x33,0x02,0x0e,0x34,0x03,0x82,0x0e,0x32,0x02,0x84,0x0e,0x32,0x03,0x03,0x0d, 0x31,0x03,0x0d,0x31,0x02,0x0d,0x31,0x03,0x84,0x0e,0x31,0x03,0x82,0x0d,0x31, 0x03,0x82,0x0d,0x30,0x02,0x03,0x0d,0x2f,0x02,0x0d,0x30,0x03,0x0d,0x30,0x02, 0x87,0x0d,0x2f,0x02,0x83,0x0d,0x2e,0x02,0x01,0x0d,0x2d,0x02,0x82,0x0d,0x2e, 0x02,0x07,0x0c,0x2d,0x02,0x0d,0x2c,0x02,0x0c,0x2c,0x02,0x0c,0x2d,0x02,0x0c, 0x2c,0x01,0x0b,0x2c,0x01,0x0b,0x2c,0x02,0x82,0x0c,0x2c,0x02,0x82,0x0c,0x2c, 0x01,0x83,0x0c,0x2b,0x02,0x85,0x0b,0x2a,0x02,0x03,0x0b,0x2a,0x01,0x0c,0x2a, 0x02,0x0b,0x2a,0x02,0x82,0x0a,0x29,0x01,0x82,0x0b,0x29,0x01,0x82,0x0b,0x29, 0x02,0x82,0x0a,0x29,0x02,0x84,0x0a,0x28,0x01,0x01,0x0a,0x27,0x01,0x82,0x0b, 0x28,0x02,0x03,0x0a,0x27,0x01,0x0a,0x28,0x01,0x0a,0x28,0x02,0x82,0x0b,0x28, 0x02,0x02,0x0a,0x27,0x02,0x0a,0x27,0x01,0x82,0x0b,0x27,0x02,0x01,0x0a,0x27, 0x02,0x83,0x0a,0x26,0x01,0x82,0x0a,0x25,0x02,0x03,0x0a,0x26,0x03,0x09,0x25, 0x01,0x09,0x25,0x02,0x82,0x09,0x25,0x01,0x01,0x0a,0x25,0x02,0x87,0x09,0x24, 0x01,0x86,0x09,0x23,0x01,0x09,0x09,0x22,0x01,0x08,0x23,0x01,0x09,0x22,0x01, 0x09,0x22,0x02,0x08,0x21,0x01,0x09,0x22,0x01,0x08,0x22,0x01,0x08,0x21,0x00, 0x08,0x22,0x01,0x83,0x08,0x21,0x01,0x87,0x08,0x20,0x01,0x89,0x08,0x1f,0x01, 0x04,0x07,0x1e,0x00,0x08,0x1e,0x01,0x07,0x1d,0x01,0x07,0x1e,0x00,0x82,0x07, 0x1e,0x01,0x83,0x07,0x1d,0x01,0x82,0x07,0x1d,0x00,0x01,0x07,0x1d,0x01,0x82, 0x07,0x1d,0x00,0x83,0x07,0x1c,0x00,0x01,0x06,0x1b,0x00,0x84,0x07,0x1c,0x00, 0x83,0x06,0x1b,0x00,0x87,0x06,0x1a,0x00,0x82,0x05,0x1a,0x00,0x88,0x05,0x19, 0x00,0x82,0x05,0x18,0x00,0x01,0x05,0x19,0x00,0x8b,0x05,0x18,0x00,0x85,0x04, 0x17,0x00,0x82,0x05,0x16,0x00,0x84,0x04,0x16,0x00,0x82,0x05,0x16,0x00,0x89, 0x04,0x16,0x00,0x8a,0x04,0x15,0x00,0x02,0x05,0x15,0x00,0x04,0x15,0x00,0x88, 0x04,0x14,0x00,0x11,0x05,0x14,0x00,0x04,0x13,0x00,0x04,0x14,0x00,0x05,0x14, 0x00,0x04,0x13,0x00,0x05,0x13,0x00,0x05,0x13,0x01,0x05,0x14,0x01,0x05,0x15, 0x00,0x06,0x16,0x01,0x06,0x17,0x01,0x07,0x17,0x01,0x08,0x17,0x02,0x08,0x18, 0x03,0x08,0x17,0x04,0x09,0x17,0x04,0x08,0x17,0x04,0x83,0x08,0x16,0x04,0x06, 0x07,0x15,0x03,0x08,0x15,0x04,0x08,0x15,0x03,0x08,0x15,0x04,0x08,0x15,0x03, 0x07,0x14,0x03,0x82,0x08,0x14,0x04,0x01,0x07,0x14,0x03,0x82,0x08,0x14,0x04, 0x05,0x07,0x14,0x04,0x08,0x14,0x04,0x08,0x14,0x03,0x07,0x14,0x03,0x08,0x14, 0x04,0x82,0x07,0x13,0x03,0x02,0x07,0x13,0x04,0x08,0x13,0x04,0x83,0x07,0x13, 0x04,0x84,0x07,0x12,0x04,0x01,0x07,0x12,0x03,0x84,0x07,0x11,0x04,0x01,0x07, 0x11,0x03,0x82,0x07,0x11,0x04,0x82,0x06,0x10,0x03,0x01,0x06,0x10,0x04,0x83, 0x06,0x10,0x03,0x83,0x06,0x0f,0x03,0x01,0x05,0x0f,0x03,0x84,0x05,0x0e,0x03, 0x84,0x05,0x0d,0x03,0x82,0x05,0x0d,0x02,0x02,0x05,0x0d,0x03,0x05,0x0d,0x02, 0x82,0x05,0x0c,0x02,0x82,0x04,0x0c,0x02,0x87,0x04,0x0b,0x02,0x85,0x04,0x0a, 0x02,0x85,0x04,0x09,0x02,0x88,0x03,0x08,0x01,0x83,0x03,0x07,0x01,0x82,0x02, 0x07,0x01,0x85,0x02,0x06,0x01,0x83,0x02,0x05,0x01,0x82,0x02,0x05,0x00,0x01, 0x02,0x04,0x00,0x87,0x01,0x04,0x00,0x85,0x01,0x03,0x00,0x86,0x00,0x02,0x00, 0x85,0x00,0x01,0x00,0xdf,0x00,0x00,0x00,0x84,0x2d,0x5d,0x0f,0x02,0x2e,0x5d, 0x0f,0x2e,0x5e,0x0f,0x82,0x2d,0x5d,0x0f,0x03,0x2d,0x5e,0x0f,0x2c,0x5d,0x0f, 0x2d,0x5c,0x0e,0x82,0x2c,0x5d,0x0f,0x01,0x2e,0x5d,0x0f,0x82,0x2d,0x5d,0x0f, 0x84,0x2c,0x5d,0x0f,0x05,0x2c,0x5c,0x0e,0x2d,0x5d,0x0f,0x2c,0x5d,0x0f,0x2c, 0x5c,0x0e,0x2c,0x5c,0x0f,0x82,0x2c,0x5d,0x0f,0x02,0x2b,0x5c,0x0e,0x2c,0x5c, 0x0e,0x82,0x2c,0x5c,0x0f,0x01,0x2c,0x5c,0x0e,0x82,0x2b,0x5c,0x0e,0x02,0x2c, 0x5c,0x0f,0x2c,0x5b,0x0e,0x82,0x2b,0x5c,0x0e,0x82,0x2c,0x5c,0x0f,0x02,0x2c, 0x5b,0x0e,0x2a,0x5b,0x0d,0x82,0x2b,0x5c,0x0f,0x05,0x2b,0x5b,0x0f,0x2b,0x5b, 0x0e,0x2c,0x5c,0x0f,0x2b,0x5b,0x0e,0x2b,0x5c,0x0f,0x82,0x2c,0x5b,0x0f,0x05, 0x2c,0x5b,0x10,0x2b,0x5b,0x10,0x2b,0x5b,0x0f,0x2c,0x5b,0x10,0x2c,0x5b,0x0f, 0x82,0x2c,0x5a,0x10,0x04,0x2c,0x5b,0x0f,0x2c,0x5b,0x10,0x2b,0x5b,0x10,0x2a, 0x5a,0x10,0x82,0x2c,0x5a,0x11,0x05,0x2b,0x5a,0x10,0x2c,0x5b,0x11,0x2b,0x5a, 0x10,0x2c,0x5a,0x11,0x2c,0x5b,0x11,0x82,0x2c,0x5a,0x10,0x03,0x2c,0x5a,0x11, 0x2b,0x5a,0x10,0x2b,0x59,0x11,0x82,0x2b,0x59,0x10,0x82,0x2b,0x59,0x11,0x06, 0x2b,0x5a,0x10,0x2b,0x59,0x11,0x2a,0x59,0x10,0x2a,0x59,0x11,0x2b,0x58,0x11, 0x2a,0x58,0x11,0x82,0x2a,0x59,0x11,0x07,0x2a,0x58,0x11,0x2a,0x59,0x12,0x2b, 0x59,0x12,0x2a,0x58,0x11,0x2a,0x59,0x12,0x2a,0x58,0x12,0x2a,0x59,0x12,0x82, 0x2a,0x58,0x12,0x0d,0x2b,0x59,0x13,0x2b,0x58,0x12,0x2b,0x59,0x13,0x2a,0x58, 0x12,0x2a,0x57,0x12,0x2a,0x56,0x12,0x2a,0x56,0x13,0x29,0x55,0x12,0x27,0x54, 0x11,0x28,0x54,0x11,0x27,0x52,0x10,0x25,0x51,0x0f,0x24,0x4f,0x0e,0x82,0x21, 0x4e,0x0d,0x05,0x20,0x4c,0x0c,0x1f,0x4b,0x0c,0x1f,0x49,0x0a,0x1d,0x48,0x0a, 0x1d,0x47,0x0a,0x82,0x1d,0x48,0x0a,0x01,0x1e,0x48,0x0b,0x82,0x1e,0x49,0x0a, 0x82,0x1e,0x48,0x0b,0x83,0x1d,0x48,0x0b,0x06,0x1d,0x48,0x0a,0x1e,0x48,0x0b, 0x1d,0x48,0x0b,0x1d,0x47,0x0a,0x1d,0x48,0x0b,0x1d,0x47,0x0a,0x82,0x1c,0x46, 0x0a,0x02,0x1c,0x47,0x0a,0x1d,0x47,0x0a,0x82,0x1c,0x46,0x0a,0x0b,0x1c,0x47, 0x0a,0x1b,0x46,0x0a,0x1c,0x45,0x0a,0x1c,0x46,0x0a,0x1c,0x45,0x0a,0x1b,0x45, 0x09,0x1c,0x46,0x0a,0x1b,0x45,0x0a,0x1b,0x45,0x09,0x1b,0x44,0x09,0x1a,0x44, 0x08,0x82,0x1a,0x44,0x09,0x02,0x1b,0x44,0x09,0x1a,0x44,0x08,0x82,0x1a,0x43, 0x08,0x02,0x19,0x44,0x08,0x19,0x43,0x08,0x82,0x1a,0x43,0x08,0x82,0x19,0x43, 0x08,0x02,0x19,0x42,0x08,0x19,0x43,0x09,0x82,0x19,0x42,0x08,0x82,0x18,0x42, 0x08,0x01,0x18,0x41,0x07,0x82,0x17,0x41,0x07,0x04,0x18,0x41,0x07,0x17,0x40, 0x06,0x17,0x41,0x07,0x18,0x41,0x07,0x83,0x17,0x40,0x06,0x82,0x16,0x3f,0x06, 0x05,0x15,0x3f,0x06,0x16,0x3f,0x06,0x15,0x3f,0x06,0x16,0x3f,0x06,0x16,0x3f, 0x05,0x82,0x15,0x3e,0x05,0x01,0x15,0x3f,0x06,0x82,0x15,0x3e,0x05,0x02,0x14, 0x3d,0x05,0x15,0x3e,0x06,0x82,0x15,0x3e,0x05,0x02,0x15,0x3f,0x06,0x14,0x3d, 0x05,0x83,0x15,0x3d,0x05,0x01,0x15,0x3e,0x05,0x82,0x14,0x3d,0x05,0x05,0x15, 0x3e,0x05,0x15,0x3d,0x05,0x15,0x3e,0x05,0x14,0x3d,0x05,0x15,0x3d,0x05,0x83, 0x14,0x3d,0x05,0x82,0x15,0x3e,0x05,0x01,0x14,0x3e,0x05,0x82,0x14,0x3d,0x05, 0x03,0x15,0x3e,0x05,0x14,0x3c,0x04,0x14,0x3d,0x04,0x83,0x14,0x3c,0x04,0x01, 0x14,0x3c,0x05,0x82,0x14,0x3c,0x04,0x03,0x14,0x3c,0x05,0x12,0x3b,0x04,0x14, 0x3c,0x04,0x82,0x14,0x3d,0x05,0x02,0x13,0x3b,0x05,0x13,0x3b,0x04,0x82,0x13, 0x3c,0x05,0x02,0x13,0x3b,0x05,0x13,0x3c,0x04,0x82,0x13,0x3b,0x05,0x82,0x13, 0x3c,0x05,0x82,0x13,0x3b,0x05,0x02,0x13,0x3c,0x05,0x13,0x3b,0x05,0x82,0x12, 0x3b,0x04,0x82,0x13,0x3b,0x04,0x07,0x13,0x3b,0x05,0x13,0x3b,0x04,0x13,0x3b, 0x03,0x14,0x3a,0x05,0x13,0x3b,0x04,0x12,0x3b,0x04,0x13,0x3b,0x05,0x82,0x12, 0x3b,0x04,0x82,0x13,0x3b,0x04,0x03,0x13,0x3b,0x03,0x12,0x3a,0x03,0x12,0x3b, 0x03,0x82,0x11,0x3c,0x03,0x03,0x12,0x3c,0x04,0x12,0x3b,0x03,0x13,0x3b,0x05, 0x83,0x12,0x3b,0x03,0x82,0x13,0x3c,0x04,0x01,0x12,0x3c,0x04,0x82,0x12,0x3c, 0x03,0x0a,0x13,0x3d,0x03,0x13,0x3d,0x04,0x13,0x3c,0x04,0x13,0x3c,0x03,0x13, 0x3d,0x04,0x12,0x3d,0x04,0x13,0x3d,0x04,0x14,0x3e,0x04,0x12,0x3d,0x04,0x12, 0x3d,0x03,0x82,0x13,0x3e,0x04,0x02,0x12,0x3e,0x03,0x14,0x3e,0x04,0x82,0x13, 0x3d,0x03,0x03,0x13,0x3f,0x05,0x12,0x3d,0x03,0x13,0x3d,0x03,0x82,0x13,0x3d, 0x04,0x03,0x12,0x3c,0x03,0x12,0x3e,0x04,0x12,0x3d,0x04,0x83,0x12,0x3c,0x03, 0x05,0x12,0x3b,0x04,0x12,0x3a,0x04,0x11,0x3a,0x03,0x11,0x3a,0x04,0x10,0x39, 0x03,0x82,0x10,0x38,0x03,0x05,0x0f,0x38,0x03,0x10,0x38,0x04,0x0f,0x37,0x03, 0x0f,0x36,0x03,0x10,0x36,0x03,0x82,0x0f,0x36,0x03,0x08,0x0e,0x35,0x02,0x0e, 0x34,0x02,0x0f,0x35,0x02,0x0f,0x35,0x03,0x0e,0x34,0x03,0x0e,0x34,0x02,0x0e, 0x34,0x03,0x0f,0x33,0x02,0x83,0x0f,0x33,0x03,0x04,0x0e,0x33,0x03,0x0d,0x32, 0x02,0x0c,0x31,0x02,0x0d,0x31,0x02,0x84,0x0e,0x31,0x02,0x83,0x0d,0x31,0x03, 0x02,0x0e,0x30,0x02,0x0d,0x31,0x03,0x83,0x0d,0x30,0x02,0x03,0x0d,0x2f,0x02, 0x0d,0x2f,0x01,0x0e,0x30,0x03,0x82,0x0d,0x2f,0x02,0x01,0x0c,0x2e,0x01,0x82, 0x0d,0x2f,0x02,0x01,0x0d,0x2e,0x02,0x82,0x0d,0x2f,0x02,0x83,0x0c,0x2e,0x02, 0x04,0x0d,0x2e,0x02,0x0c,0x2d,0x01,0x0c,0x2d,0x02,0x0d,0x2e,0x02,0x84,0x0c, 0x2d,0x02,0x01,0x0c,0x2c,0x01,0x84,0x0c,0x2c,0x02,0x02,0x0c,0x2c,0x01,0x0a, 0x2b,0x01,0x82,0x0b,0x2a,0x01,0x07,0x0a,0x2b,0x02,0x0c,0x2a,0x02,0x0b,0x2a, 0x03,0x0b,0x2b,0x02,0x0b,0x2a,0x02,0x0b,0x29,0x01,0x0c,0x2a,0x02,0x83,0x0b, 0x2a,0x02,0x05,0x0a,0x29,0x01,0x0b,0x29,0x02,0x0a,0x29,0x01,0x0b,0x29,0x02, 0x0a,0x28,0x01,0x82,0x0b,0x29,0x02,0x82,0x0a,0x28,0x01,0x82,0x0a,0x28,0x02, 0x02,0x0a,0x29,0x02,0x0b,0x28,0x02,0x82,0x0b,0x27,0x02,0x82,0x0a,0x27,0x02, 0x03,0x0a,0x27,0x01,0x0a,0x26,0x01,0x0a,0x27,0x02,0x83,0x0a,0x26,0x02,0x01, 0x0a,0x26,0x01,0x82,0x0a,0x26,0x02,0x02,0x0a,0x25,0x01,0x0a,0x25,0x02,0x84, 0x0a,0x25,0x01,0x03,0x0a,0x24,0x01,0x09,0x24,0x02,0x09,0x24,0x01,0x82,0x0a, 0x24,0x01,0x84,0x09,0x24,0x01,0x02,0x09,0x23,0x01,0x0a,0x23,0x02,0x82,0x09, 0x23,0x01,0x05,0x09,0x22,0x01,0x0a,0x23,0x02,0x09,0x23,0x02,0x09,0x22,0x01, 0x09,0x22,0x00,0x82,0x09,0x22,0x01,0x03,0x08,0x21,0x01,0x09,0x22,0x01,0x08, 0x21,0x00,0x82,0x09,0x21,0x01,0x84,0x08,0x20,0x01,0x82,0x08,0x1f,0x01,0x01, 0x08,0x20,0x01,0x85,0x08,0x1f,0x01,0x03,0x07,0x1f,0x00,0x08,0x1f,0x01,0x07, 0x1e,0x00,0x85,0x07,0x1e,0x01,0x01,0x07,0x1d,0x01,0x82,0x07,0x1d,0x00,0x01, 0x07,0x1d,0x01,0x83,0x07,0x1d,0x00,0x82,0x06,0x1c,0x00,0x83,0x07,0x1c,0x00, 0x83,0x06,0x1c,0x00,0x82,0x06,0x1b,0x00,0x01,0x06,0x1b,0x01,0x82,0x06,0x1b, 0x00,0x02,0x06,0x1a,0x00,0x06,0x1b,0x00,0x82,0x06,0x1a,0x00,0x02,0x05,0x1a, 0x00,0x06,0x1a,0x00,0x83,0x05,0x1a,0x00,0x06,0x05,0x19,0x00,0x06,0x1a,0x00, 0x05,0x19,0x00,0x05,0x1a,0x00,0x05,0x19,0x00,0x05,0x18,0x00,0x88,0x05,0x19, 0x00,0x02,0x05,0x18,0x00,0x05,0x19,0x00,0x84,0x05,0x18,0x00,0x02,0x04,0x17, 0x00,0x05,0x17,0x00,0x82,0x05,0x18,0x00,0x84,0x05,0x17,0x00,0x03,0x05,0x16, 0x00,0x05,0x17,0x00,0x04,0x16,0x00,0x86,0x05,0x16,0x00,0x02,0x05,0x15,0x00, 0x04,0x15,0x00,0x82,0x05,0x15,0x00,0x82,0x04,0x15,0x00,0x82,0x05,0x15,0x00, 0x84,0x04,0x15,0x00,0x88,0x05,0x15,0x00,0x02,0x04,0x15,0x00,0x05,0x15,0x00, 0x86,0x05,0x14,0x00,0x01,0x05,0x14,0x01,0x83,0x05,0x14,0x00,0x08,0x04,0x14, 0x00,0x05,0x14,0x00,0x05,0x15,0x00,0x06,0x16,0x01,0x06,0x17,0x01,0x07,0x17, 0x01,0x07,0x17,0x02,0x09,0x18,0x03,0x85,0x09,0x17,0x04,0x82,0x08,0x16,0x04, 0x01,0x08,0x15,0x04,0x83,0x07,0x15,0x04,0x02,0x08,0x15,0x03,0x07,0x15,0x03, 0x83,0x07,0x14,0x03,0x82,0x08,0x14,0x04,0x04,0x07,0x14,0x03,0x07,0x14,0x04, 0x08,0x14,0x03,0x07,0x14,0x03,0x82,0x07,0x14,0x04,0x01,0x07,0x13,0x03,0x83, 0x07,0x13,0x04,0x05,0x07,0x13,0x03,0x07,0x12,0x03,0x07,0x12,0x04,0x07,0x12, 0x03,0x07,0x12,0x04,0x82,0x07,0x12,0x03,0x02,0x07,0x11,0x04,0x07,0x12,0x04, 0x83,0x07,0x11,0x03,0x86,0x06,0x10,0x03,0x83,0x06,0x0f,0x03,0x04,0x05,0x0f, 0x03,0x06,0x0f,0x03,0x05,0x0f,0x03,0x06,0x0f,0x03,0x83,0x05,0x0e,0x03,0x82, 0x05,0x0d,0x02,0x82,0x05,0x0d,0x03,0x82,0x05,0x0d,0x02,0x84,0x05,0x0c,0x02, 0x82,0x05,0x0b,0x02,0x84,0x04,0x0b,0x02,0x87,0x04,0x0a,0x02,0x83,0x04,0x09, 0x02,0x82,0x03,0x09,0x01,0x85,0x03,0x08,0x01,0x84,0x03,0x07,0x01,0x82,0x02, 0x07,0x01,0x85,0x02,0x06,0x01,0x82,0x02,0x05,0x01,0x83,0x02,0x05,0x00,0x01, 0x02,0x05,0x01,0x82,0x01,0x05,0x00,0x85,0x01,0x04,0x00,0x85,0x01,0x03,0x00, 0x85,0x00,0x02,0x00,0x86,0x00,0x01,0x00,0xdf,0x00,0x00,0x00,0x06,0x2e,0x60, 0x0f,0x2e,0x5f,0x0f,0x2e,0x60,0x0f,0x2f,0x60,0x10,0x2f,0x5f,0x10,0x30,0x60, 0x11,0x82,0x2e,0x5f,0x10,0x01,0x2f,0x60,0x10,0x87,0x2e,0x5f,0x10,0x04,0x2f, 0x5f,0x10,0x2e,0x5f,0x0f,0x2e,0x5f,0x10,0x2e,0x60,0x0f,0x82,0x2e,0x5f,0x10, 0x04,0x2e,0x5f,0x0f,0x2d,0x5f,0x10,0x2e,0x5f,0x10,0x2d,0x5f,0x0e,0x82,0x2d, 0x5e,0x0f,0x03,0x2e,0x5f,0x10,0x2d,0x5e,0x0f,0x2d,0x5e,0x10,0x84,0x2d,0x5e, 0x0f,0x83,0x2e,0x5e,0x0f,0x82,0x2d,0x5e,0x0f,0x02,0x2d,0x5e,0x0e,0x2e,0x5e, 0x0f,0x82,0x2d,0x5e,0x0f,0x02,0x2d,0x5e,0x10,0x2d,0x5e,0x0f,0x83,0x2c,0x5e, 0x0f,0x08,0x2d,0x5d,0x10,0x2d,0x5d,0x0f,0x2d,0x5d,0x10,0x2d,0x5e,0x10,0x2c, 0x5e,0x10,0x2d,0x5e,0x12,0x2d,0x5d,0x11,0x2c,0x5d,0x11,0x82,0x2d,0x5d,0x0f, 0x07,0x2d,0x5d,0x10,0x2c,0x5d,0x11,0x2c,0x5d,0x10,0x2d,0x5d,0x11,0x2d,0x5d, 0x12,0x2d,0x5d,0x11,0x2e,0x5e,0x11,0x82,0x2d,0x5c,0x11,0x01,0x2d,0x5d,0x12, 0x82,0x2d,0x5c,0x11,0x01,0x2c,0x5d,0x12,0x85,0x2d,0x5c,0x12,0x05,0x2c,0x5b, 0x12,0x2c,0x5b,0x11,0x2c,0x5b,0x12,0x2d,0x5b,0x12,0x2d,0x5b,0x13,0x83,0x2c, 0x5a,0x12,0x01,0x2c,0x5b,0x13,0x82,0x2c,0x5b,0x12,0x01,0x2c,0x5b,0x14,0x82, 0x2b,0x5a,0x12,0x05,0x2c,0x5a,0x13,0x2c,0x5b,0x14,0x2c,0x5a,0x13,0x2b,0x59, 0x12,0x2b,0x59,0x13,0x82,0x2c,0x59,0x14,0x01,0x2b,0x59,0x12,0x83,0x2c,0x59, 0x13,0x04,0x2c,0x59,0x14,0x2b,0x58,0x13,0x2c,0x59,0x13,0x2b,0x59,0x12,0x84, 0x2b,0x58,0x13,0x07,0x2b,0x58,0x14,0x2a,0x57,0x13,0x29,0x56,0x12,0x26,0x54, 0x11,0x25,0x52,0x10,0x23,0x4f,0x0e,0x21,0x4c,0x0c,0x82,0x1f,0x4b,0x0c,0x01, 0x1f,0x4a,0x0b,0x83,0x1e,0x49,0x0b,0x03,0x1e,0x49,0x0c,0x1f,0x4a,0x0b,0x1e, 0x4a,0x0b,0x82,0x1f,0x4a,0x0b,0x82,0x1e,0x4a,0x0b,0x04,0x1e,0x49,0x0b,0x1e, 0x48,0x0b,0x1c,0x49,0x0b,0x1d,0x49,0x0b,0x82,0x1d,0x48,0x0b,0x03,0x1d,0x48, 0x0a,0x1d,0x48,0x0b,0x1d,0x48,0x0a,0x82,0x1c,0x47,0x0a,0x01,0x1d,0x48,0x0b, 0x82,0x1c,0x47,0x0a,0x05,0x1b,0x46,0x09,0x1c,0x46,0x0a,0x1c,0x46,0x09,0x1b, 0x45,0x09,0x1c,0x46,0x09,0x82,0x1b,0x45,0x09,0x01,0x1b,0x46,0x09,0x82,0x1a, 0x45,0x09,0x82,0x1a,0x45,0x08,0x82,0x1b,0x45,0x08,0x82,0x1a,0x44,0x08,0x01, 0x19,0x44,0x09,0x85,0x19,0x44,0x08,0x03,0x19,0x43,0x07,0x19,0x43,0x08,0x19, 0x43,0x07,0x82,0x19,0x43,0x08,0x84,0x18,0x42,0x07,0x82,0x17,0x41,0x06,0x01, 0x17,0x40,0x07,0x82,0x16,0x40,0x06,0x01,0x16,0x3f,0x06,0x82,0x16,0x40,0x06, 0x09,0x16,0x3f,0x06,0x16,0x40,0x05,0x16,0x40,0x06,0x16,0x3f,0x06,0x15,0x3f, 0x06,0x15,0x3f,0x05,0x16,0x3f,0x06,0x15,0x3f,0x06,0x15,0x3f,0x05,0x86,0x15, 0x3e,0x05,0x82,0x15,0x3f,0x05,0x06,0x15,0x3f,0x06,0x15,0x3e,0x05,0x16,0x3f, 0x06,0x14,0x3e,0x05,0x14,0x3d,0x05,0x14,0x3e,0x05,0x82,0x15,0x3f,0x06,0x09, 0x15,0x3f,0x05,0x15,0x3f,0x06,0x14,0x3f,0x05,0x14,0x3e,0x05,0x15,0x3e,0x05, 0x14,0x3e,0x05,0x14,0x3d,0x05,0x15,0x3f,0x06,0x13,0x3d,0x04,0x82,0x14,0x3e, 0x05,0x01,0x15,0x3e,0x05,0x83,0x14,0x3d,0x05,0x05,0x14,0x3e,0x05,0x14,0x3d, 0x04,0x13,0x3d,0x04,0x14,0x3e,0x05,0x14,0x3d,0x06,0x82,0x13,0x3d,0x05,0x85, 0x13,0x3c,0x05,0x82,0x13,0x3d,0x05,0x02,0x13,0x3c,0x05,0x12,0x3c,0x04,0x82, 0x13,0x3c,0x05,0x82,0x13,0x3d,0x04,0x03,0x12,0x3c,0x04,0x13,0x3c,0x04,0x14, 0x3d,0x04,0x82,0x13,0x3c,0x03,0x03,0x13,0x3b,0x04,0x13,0x3c,0x04,0x13,0x3c, 0x05,0x83,0x12,0x3c,0x04,0x05,0x13,0x3c,0x04,0x12,0x3c,0x04,0x13,0x3d,0x04, 0x12,0x3c,0x03,0x13,0x3d,0x04,0x82,0x12,0x3d,0x04,0x83,0x13,0x3d,0x04,0x03, 0x13,0x3c,0x04,0x13,0x3d,0x04,0x12,0x3c,0x03,0x82,0x12,0x3d,0x04,0x01,0x12, 0x3d,0x03,0x84,0x13,0x3e,0x04,0x82,0x13,0x3d,0x04,0x82,0x13,0x3e,0x04,0x04, 0x13,0x3e,0x03,0x14,0x3f,0x04,0x12,0x3f,0x04,0x12,0x3e,0x03,0x82,0x14,0x3f, 0x04,0x82,0x13,0x3e,0x03,0x82,0x14,0x3f,0x04,0x01,0x13,0x3e,0x04,0x82,0x13, 0x3e,0x03,0x06,0x12,0x3d,0x03,0x12,0x3d,0x04,0x13,0x3e,0x04,0x14,0x3f,0x05, 0x12,0x3f,0x04,0x13,0x3e,0x04,0x82,0x12,0x3d,0x03,0x03,0x12,0x3c,0x03,0x12, 0x3b,0x04,0x11,0x3a,0x03,0x82,0x11,0x3a,0x04,0x82,0x11,0x39,0x03,0x03,0x10, 0x38,0x03,0x10,0x38,0x04,0x10,0x38,0x03,0x85,0x10,0x37,0x03,0x03,0x0f,0x36, 0x03,0x0f,0x36,0x02,0x0f,0x36,0x04,0x83,0x0f,0x35,0x03,0x03,0x0e,0x34,0x02, 0x0e,0x34,0x03,0x0e,0x34,0x02,0x83,0x0e,0x34,0x03,0x02,0x0d,0x33,0x02,0x0d, 0x32,0x03,0x82,0x0e,0x32,0x02,0x01,0x0e,0x32,0x03,0x83,0x0d,0x32,0x02,0x82, 0x0d,0x32,0x03,0x08,0x0d,0x31,0x02,0x0e,0x31,0x02,0x0e,0x32,0x03,0x0e,0x31, 0x03,0x0d,0x31,0x02,0x0c,0x30,0x01,0x0c,0x31,0x02,0x0c,0x30,0x02,0x82,0x0d, 0x30,0x02,0x83,0x0d,0x2f,0x02,0x01,0x0d,0x30,0x03,0x83,0x0c,0x2f,0x02,0x82, 0x0c,0x2e,0x02,0x01,0x0c,0x2e,0x01,0x82,0x0c,0x2e,0x02,0x82,0x0c,0x2d,0x01, 0x02,0x0c,0x2d,0x02,0x0c,0x2e,0x02,0x83,0x0c,0x2d,0x02,0x82,0x0c,0x2c,0x02, 0x02,0x0c,0x2c,0x01,0x0b,0x2c,0x02,0x82,0x0b,0x2c,0x01,0x0a,0x0c,0x2b,0x02, 0x0b,0x2a,0x01,0x0c,0x2b,0x03,0x0c,0x2b,0x02,0x0b,0x2a,0x01,0x0b,0x2b,0x02, 0x0b,0x2a,0x02,0x0b,0x2a,0x01,0x0c,0x2a,0x02,0x0b,0x2a,0x02,0x82,0x0c,0x2a, 0x02,0x0d,0x0a,0x2a,0x02,0x0b,0x29,0x02,0x0b,0x2a,0x02,0x0b,0x29,0x02,0x0b, 0x29,0x01,0x0a,0x29,0x01,0x0a,0x29,0x02,0x0b,0x29,0x02,0x0a,0x28,0x01,0x0b, 0x29,0x02,0x0b,0x28,0x02,0x0a,0x28,0x01,0x0b,0x27,0x01,0x82,0x0b,0x28,0x02, 0x05,0x0a,0x27,0x01,0x0b,0x27,0x02,0x0b,0x28,0x02,0x0a,0x27,0x02,0x09,0x27, 0x02,0x82,0x0a,0x27,0x02,0x82,0x0b,0x26,0x02,0x04,0x0c,0x26,0x01,0x09,0x25, 0x01,0x0a,0x25,0x01,0x0a,0x26,0x02,0x85,0x0a,0x25,0x01,0x01,0x09,0x24,0x00, 0x83,0x09,0x25,0x01,0x01,0x0a,0x25,0x01,0x82,0x09,0x24,0x01,0x03,0x09,0x23, 0x01,0x0a,0x23,0x01,0x09,0x23,0x00,0x83,0x09,0x23,0x01,0x06,0x09,0x22,0x01, 0x08,0x22,0x00,0x09,0x23,0x00,0x09,0x22,0x01,0x08,0x22,0x00,0x08,0x22,0x01, 0x82,0x08,0x21,0x01,0x01,0x09,0x21,0x01,0x82,0x08,0x21,0x01,0x01,0x09,0x21, 0x01,0x85,0x08,0x20,0x01,0x07,0x08,0x1f,0x01,0x08,0x20,0x01,0x07,0x1f,0x00, 0x08,0x1f,0x01,0x07,0x1f,0x01,0x07,0x1f,0x00,0x07,0x1f,0x01,0x82,0x08,0x1f, 0x01,0x82,0x07,0x1f,0x01,0x83,0x07,0x1e,0x00,0x82,0x07,0x1e,0x01,0x02,0x07, 0x1d,0x00,0x07,0x1e,0x00,0x86,0x07,0x1d,0x00,0x82,0x07,0x1c,0x00,0x84,0x06, 0x1c,0x00,0x85,0x06,0x1b,0x00,0x01,0x06,0x1a,0x00,0x82,0x06,0x1b,0x00,0x01, 0x06,0x1a,0x00,0x88,0x06,0x19,0x00,0x83,0x05,0x19,0x00,0x87,0x06,0x19,0x00, 0x83,0x05,0x19,0x00,0x85,0x05,0x18,0x00,0x01,0x06,0x18,0x00,0x89,0x05,0x17, 0x00,0x83,0x05,0x16,0x00,0x85,0x04,0x16,0x00,0x86,0x04,0x15,0x00,0x02,0x05, 0x15,0x00,0x04,0x15,0x00,0x86,0x05,0x15,0x00,0x01,0x04,0x14,0x00,0x8b,0x05, 0x14,0x00,0x02,0x05,0x13,0x00,0x05,0x14,0x00,0x82,0x05,0x13,0x00,0x03,0x05, 0x13,0x01,0x05,0x14,0x01,0x05,0x15,0x00,0x82,0x06,0x17,0x01,0x01,0x07,0x17, 0x02,0x82,0x08,0x17,0x03,0x02,0x09,0x17,0x04,0x09,0x18,0x05,0x82,0x09,0x17, 0x04,0x04,0x08,0x17,0x04,0x09,0x17,0x04,0x08,0x16,0x04,0x08,0x15,0x04,0x82, 0x07,0x15,0x03,0x83,0x07,0x14,0x03,0x01,0x08,0x14,0x04,0x82,0x07,0x14,0x03, 0x04,0x07,0x14,0x04,0x07,0x14,0x03,0x07,0x13,0x03,0x07,0x14,0x03,0x86,0x07, 0x13,0x03,0x01,0x07,0x12,0x04,0x85,0x07,0x12,0x03,0x82,0x07,0x12,0x04,0x01, 0x07,0x12,0x03,0x85,0x06,0x11,0x03,0x85,0x06,0x10,0x03,0x84,0x06,0x0f,0x03, 0x84,0x06,0x0e,0x03,0x02,0x05,0x0e,0x03,0x05,0x0d,0x03,0x84,0x05,0x0d,0x02, 0x84,0x05,0x0c,0x02,0x82,0x04,0x0c,0x02,0x01,0x05,0x0c,0x02,0x85,0x04,0x0b, 0x02,0x85,0x04,0x0a,0x02,0x05,0x04,0x09,0x02,0x03,0x09,0x01,0x04,0x09,0x02, 0x03,0x09,0x02,0x03,0x09,0x01,0x85,0x03,0x08,0x01,0x84,0x03,0x07,0x01,0x82, 0x02,0x07,0x01,0x86,0x02,0x06,0x01,0x01,0x02,0x06,0x00,0x82,0x02,0x05,0x01, 0x82,0x02,0x05,0x00,0x82,0x01,0x05,0x00,0x85,0x01,0x04,0x00,0x85,0x01,0x03, 0x00,0x85,0x00,0x02,0x00,0x86,0x00,0x01,0x00,0xdf,0x00,0x00,0x00,0x01,0x30, 0x63,0x11,0x82,0x30,0x62,0x10,0x01,0x30,0x63,0x11,0x82,0x30,0x61,0x0f,0x03, 0x2f,0x61,0x10,0x2f,0x61,0x11,0x2f,0x62,0x10,0x82,0x30,0x62,0x10,0x84,0x2f, 0x62,0x10,0x0b,0x30,0x62,0x12,0x31,0x62,0x11,0x2f,0x61,0x0f,0x30,0x62,0x11, 0x2f,0x62,0x10,0x2f,0x61,0x0f,0x2f,0x60,0x10,0x2f,0x62,0x10,0x2e,0x61,0x10, 0x2f,0x61,0x10,0x2f,0x61,0x0f,0x82,0x2f,0x60,0x10,0x01,0x30,0x61,0x10,0x87, 0x2f,0x60,0x10,0x04,0x30,0x61,0x10,0x2f,0x60,0x10,0x2e,0x60,0x0f,0x2f,0x60, 0x10,0x82,0x2f,0x60,0x0f,0x84,0x2f,0x60,0x10,0x06,0x2e,0x60,0x0f,0x2e,0x5f, 0x0f,0x2f,0x60,0x10,0x2f,0x60,0x0f,0x2f,0x60,0x10,0x2f,0x5f,0x10,0x82,0x2f, 0x60,0x10,0x04,0x2f,0x61,0x11,0x2e,0x5f,0x10,0x2e,0x60,0x10,0x2f,0x60,0x10, 0x82,0x2f,0x5f,0x11,0x09,0x2e,0x5f,0x11,0x2e,0x5f,0x12,0x2f,0x5f,0x12,0x2f, 0x5f,0x11,0x2f,0x5f,0x10,0x2f,0x5f,0x11,0x2f,0x60,0x12,0x2f,0x5f,0x13,0x2f, 0x5e,0x12,0x83,0x2e,0x5f,0x13,0x02,0x2f,0x5e,0x12,0x2e,0x5e,0x12,0x82,0x2f, 0x5e,0x12,0x04,0x2f,0x5e,0x13,0x2d,0x5e,0x12,0x2e,0x5e,0x12,0x2e,0x5e,0x13, 0x82,0x2f,0x5e,0x13,0x03,0x2e,0x5c,0x13,0x2f,0x5d,0x14,0x2e,0x5d,0x14,0x82, 0x2d,0x5d,0x13,0x04,0x2d,0x5e,0x14,0x2c,0x5d,0x14,0x2d,0x5d,0x14,0x2e,0x5d, 0x15,0x82,0x2d,0x5d,0x14,0x08,0x2d,0x5c,0x14,0x2e,0x5d,0x15,0x2e,0x5c,0x14, 0x2c,0x5b,0x13,0x2d,0x5c,0x14,0x2c,0x5b,0x14,0x2d,0x5c,0x14,0x2d,0x5b,0x14, 0x82,0x2c,0x5a,0x14,0x01,0x2b,0x5a,0x14,0x82,0x2c,0x5a,0x15,0x02,0x2b,0x59, 0x14,0x2c,0x5b,0x14,0x82,0x2b,0x5a,0x13,0x82,0x2c,0x5a,0x14,0x13,0x2b,0x5a, 0x15,0x2b,0x5a,0x14,0x2d,0x5b,0x15,0x2d,0x59,0x15,0x2c,0x58,0x14,0x2b,0x57, 0x13,0x28,0x56,0x11,0x27,0x56,0x11,0x24,0x52,0x0f,0x22,0x50,0x0e,0x21,0x4e, 0x0d,0x20,0x4c,0x0c,0x1f,0x4c,0x0c,0x1e,0x4a,0x0b,0x1d,0x4a,0x0b,0x1e,0x4b, 0x0c,0x20,0x4c,0x0c,0x1e,0x4b,0x0b,0x1f,0x4b,0x0b,0x84,0x1f,0x4a,0x0c,0x04, 0x1f,0x4c,0x0c,0x1f,0x4a,0x0c,0x1e,0x49,0x0b,0x1f,0x4a,0x0c,0x82,0x1e,0x49, 0x0b,0x06,0x1d,0x49,0x0a,0x1e,0x49,0x0b,0x1d,0x49,0x0a,0x1d,0x49,0x0b,0x1d, 0x48,0x0a,0x1d,0x49,0x0a,0x83,0x1c,0x48,0x0a,0x82,0x1c,0x47,0x09,0x01,0x1b, 0x47,0x0a,0x82,0x1b,0x47,0x09,0x01,0x1c,0x47,0x09,0x82,0x1c,0x46,0x09,0x02, 0x1b,0x46,0x08,0x1b,0x46,0x09,0x83,0x1a,0x45,0x08,0x83,0x1a,0x46,0x08,0x82, 0x1a,0x45,0x08,0x01,0x1a,0x46,0x07,0x82,0x19,0x44,0x07,0x01,0x19,0x44,0x08, 0x83,0x18,0x43,0x07,0x02,0x17,0x42,0x07,0x18,0x43,0x07,0x82,0x17,0x42,0x07, 0x09,0x17,0x43,0x08,0x17,0x42,0x07,0x17,0x41,0x07,0x17,0x42,0x06,0x17,0x41, 0x06,0x17,0x42,0x07,0x17,0x41,0x07,0x16,0x40,0x06,0x17,0x41,0x07,0x83,0x16, 0x40,0x06,0x07,0x16,0x41,0x06,0x15,0x3f,0x05,0x16,0x40,0x06,0x16,0x40,0x07, 0x15,0x3f,0x06,0x15,0x3f,0x05,0x15,0x3f,0x06,0x82,0x15,0x40,0x06,0x02,0x16, 0x3f,0x06,0x14,0x3e,0x05,0x82,0x15,0x3e,0x05,0x0c,0x15,0x3f,0x05,0x16,0x3f, 0x06,0x15,0x3e,0x05,0x15,0x3f,0x05,0x16,0x40,0x06,0x15,0x40,0x05,0x15,0x3f, 0x05,0x15,0x3e,0x06,0x14,0x3e,0x05,0x15,0x3e,0x05,0x14,0x3e,0x05,0x15,0x3e, 0x05,0x82,0x15,0x3f,0x05,0x03,0x14,0x3e,0x05,0x15,0x3f,0x05,0x15,0x3e,0x05, 0x82,0x14,0x3e,0x04,0x82,0x14,0x3e,0x05,0x04,0x14,0x3d,0x04,0x14,0x3e,0x06, 0x14,0x3f,0x06,0x14,0x3e,0x06,0x83,0x14,0x3e,0x04,0x06,0x14,0x3e,0x05,0x14, 0x3d,0x05,0x13,0x3d,0x04,0x14,0x3d,0x05,0x15,0x3e,0x05,0x14,0x3e,0x04,0x82, 0x14,0x3d,0x04,0x04,0x13,0x3e,0x04,0x14,0x3e,0x05,0x13,0x3d,0x05,0x13,0x3d, 0x04,0x82,0x13,0x3d,0x05,0x04,0x13,0x3d,0x04,0x13,0x3e,0x04,0x13,0x3d,0x04, 0x13,0x3d,0x05,0x82,0x14,0x3d,0x05,0x01,0x13,0x3d,0x04,0x82,0x14,0x3d,0x05, 0x02,0x13,0x3d,0x04,0x13,0x3e,0x04,0x82,0x13,0x3d,0x03,0x82,0x13,0x3e,0x04, 0x01,0x14,0x3e,0x04,0x82,0x13,0x3e,0x04,0x03,0x13,0x3d,0x04,0x13,0x3d,0x03, 0x13,0x3e,0x04,0x82,0x14,0x3e,0x04,0x03,0x13,0x3e,0x03,0x14,0x3f,0x04,0x13, 0x40,0x05,0x82,0x13,0x3e,0x03,0x82,0x13,0x3e,0x04,0x05,0x14,0x3e,0x04,0x14, 0x3f,0x03,0x14,0x3f,0x04,0x13,0x3f,0x03,0x14,0x3f,0x03,0x84,0x14,0x3f,0x04, 0x0d,0x13,0x3e,0x03,0x14,0x3f,0x03,0x14,0x3f,0x04,0x14,0x3f,0x05,0x13,0x3e, 0x03,0x13,0x3e,0x02,0x14,0x3f,0x04,0x14,0x3e,0x04,0x13,0x3e,0x04,0x13,0x3e, 0x03,0x13,0x3f,0x04,0x13,0x3e,0x04,0x11,0x3e,0x03,0x82,0x12,0x3e,0x03,0x04, 0x13,0x3d,0x05,0x12,0x3d,0x04,0x11,0x3b,0x04,0x11,0x3b,0x03,0x82,0x11,0x3a, 0x03,0x01,0x10,0x38,0x02,0x83,0x10,0x38,0x03,0x07,0x11,0x37,0x03,0x10,0x37, 0x03,0x10,0x38,0x03,0x10,0x37,0x03,0x0f,0x37,0x04,0x0f,0x37,0x03,0x10,0x37, 0x04,0x86,0x0f,0x36,0x03,0x02,0x0f,0x35,0x02,0x0e,0x35,0x02,0x82,0x0f,0x35, 0x03,0x04,0x0e,0x34,0x02,0x0f,0x35,0x03,0x0e,0x34,0x03,0x0e,0x34,0x02,0x82, 0x0e,0x33,0x03,0x0e,0x0d,0x32,0x02,0x0e,0x33,0x02,0x0e,0x33,0x03,0x0d,0x32, 0x02,0x0f,0x32,0x03,0x0e,0x31,0x02,0x0d,0x31,0x02,0x0d,0x32,0x03,0x0d,0x31, 0x02,0x0d,0x32,0x02,0x0d,0x31,0x03,0x0e,0x31,0x02,0x0e,0x31,0x03,0x0e,0x30, 0x02,0x83,0x0d,0x30,0x02,0x03,0x0c,0x30,0x01,0x0c,0x30,0x02,0x0c,0x2f,0x02, 0x85,0x0d,0x2f,0x02,0x02,0x0c,0x2f,0x02,0x0c,0x2e,0x02,0x82,0x0c,0x2d,0x02, 0x83,0x0c,0x2e,0x02,0x82,0x0c,0x2d,0x02,0x0c,0x0c,0x2c,0x02,0x0b,0x2d,0x01, 0x0b,0x2e,0x02,0x0c,0x2d,0x02,0x0c,0x2c,0x02,0x0a,0x2c,0x01,0x0b,0x2b,0x02, 0x0c,0x2b,0x01,0x0b,0x2c,0x02,0x0b,0x2b,0x02,0x0b,0x2b,0x01,0x0b,0x2b,0x02, 0x82,0x0c,0x2b,0x02,0x04,0x0b,0x2a,0x01,0x0a,0x2a,0x01,0x0a,0x2a,0x02,0x0c, 0x2a,0x02,0x83,0x0b,0x29,0x01,0x04,0x0b,0x29,0x02,0x0b,0x2a,0x02,0x0b,0x29, 0x01,0x0a,0x29,0x01,0x82,0x0b,0x29,0x02,0x02,0x0a,0x29,0x02,0x0a,0x28,0x01, 0x82,0x0b,0x28,0x01,0x01,0x0a,0x28,0x01,0x82,0x0b,0x28,0x02,0x82,0x0a,0x27, 0x02,0x04,0x0b,0x28,0x01,0x0a,0x27,0x02,0x0a,0x27,0x01,0x0a,0x27,0x02,0x82, 0x0a,0x27,0x01,0x02,0x0a,0x26,0x01,0x0a,0x27,0x02,0x83,0x0a,0x26,0x01,0x01, 0x0a,0x25,0x01,0x82,0x0a,0x26,0x01,0x83,0x09,0x25,0x01,0x06,0x09,0x26,0x01, 0x0a,0x25,0x01,0x09,0x24,0x01,0x09,0x24,0x00,0x09,0x24,0x01,0x0a,0x24,0x02, 0x86,0x09,0x23,0x01,0x05,0x09,0x24,0x01,0x09,0x23,0x01,0x08,0x22,0x01,0x09, 0x22,0x01,0x08,0x22,0x01,0x83,0x08,0x21,0x01,0x82,0x08,0x21,0x00,0x84,0x08, 0x21,0x01,0x84,0x08,0x20,0x01,0x82,0x08,0x1f,0x01,0x05,0x08,0x20,0x01,0x08, 0x20,0x00,0x08,0x1f,0x00,0x07,0x1f,0x01,0x07,0x1f,0x00,0x82,0x07,0x1f,0x01, 0x82,0x08,0x1f,0x01,0x82,0x07,0x1e,0x00,0x05,0x07,0x1f,0x00,0x07,0x1e,0x01, 0x07,0x1e,0x00,0x07,0x1d,0x00,0x07,0x1e,0x00,0x87,0x07,0x1d,0x00,0x02,0x07, 0x1c,0x00,0x07,0x1c,0x01,0x82,0x07,0x1c,0x00,0x06,0x06,0x1b,0x00,0x07,0x1b, 0x00,0x06,0x1b,0x00,0x07,0x1b,0x00,0x06,0x1b,0x00,0x07,0x1b,0x00,0x86,0x06, 0x1a,0x00,0x83,0x06,0x19,0x00,0x02,0x06,0x1a,0x00,0x05,0x19,0x00,0x85,0x06, 0x19,0x00,0x05,0x05,0x19,0x00,0x06,0x19,0x00,0x05,0x19,0x00,0x05,0x18,0x00, 0x05,0x19,0x00,0x83,0x05,0x18,0x00,0x06,0x04,0x18,0x00,0x04,0x17,0x00,0x05, 0x17,0x00,0x05,0x18,0x00,0x05,0x17,0x00,0x05,0x18,0x00,0x83,0x05,0x17,0x00, 0x01,0x06,0x17,0x00,0x85,0x05,0x17,0x00,0x01,0x05,0x16,0x00,0x82,0x04,0x16, 0x00,0x01,0x05,0x16,0x00,0x82,0x04,0x16,0x00,0x04,0x04,0x15,0x00,0x04,0x16, 0x00,0x04,0x15,0x00,0x05,0x16,0x00,0x82,0x04,0x16,0x00,0x01,0x04,0x15,0x00, 0x82,0x05,0x15,0x00,0x83,0x04,0x15,0x00,0x01,0x05,0x15,0x00,0x82,0x04,0x15, 0x00,0x84,0x05,0x15,0x00,0x85,0x05,0x14,0x00,0x01,0x04,0x14,0x00,0x82,0x05, 0x14,0x00,0x01,0x05,0x14,0x01,0x86,0x05,0x14,0x00,0x08,0x06,0x16,0x01,0x06, 0x17,0x00,0x07,0x17,0x01,0x07,0x17,0x02,0x08,0x17,0x03,0x08,0x17,0x04,0x09, 0x17,0x05,0x08,0x17,0x04,0x83,0x09,0x17,0x04,0x82,0x08,0x17,0x04,0x04,0x08, 0x16,0x04,0x07,0x15,0x03,0x07,0x15,0x04,0x07,0x15,0x03,0x88,0x07,0x14,0x03, 0x84,0x07,0x13,0x03,0x02,0x07,0x13,0x04,0x07,0x13,0x03,0x87,0x07,0x12,0x03, 0x86,0x07,0x11,0x03,0x83,0x07,0x10,0x03,0x01,0x06,0x10,0x03,0x87,0x06,0x0f, 0x03,0x03,0x06,0x0e,0x02,0x05,0x0e,0x02,0x06,0x0e,0x03,0x82,0x05,0x0e,0x03, 0x84,0x05,0x0d,0x02,0x83,0x05,0x0c,0x02,0x02,0x04,0x0c,0x02,0x05,0x0c,0x02, 0x86,0x04,0x0b,0x02,0x82,0x04,0x0a,0x02,0x01,0x04,0x0a,0x01,0x82,0x04,0x0a, 0x02,0x04,0x04,0x09,0x01,0x03,0x09,0x01,0x03,0x09,0x02,0x03,0x09,0x01,0x86, 0x03,0x08,0x01,0x83,0x03,0x07,0x01,0x02,0x02,0x07,0x01,0x03,0x07,0x01,0x83, 0x02,0x07,0x01,0x85,0x02,0x06,0x01,0x82,0x02,0x05,0x00,0x01,0x02,0x05,0x01, 0x82,0x01,0x05,0x00,0x85,0x01,0x04,0x00,0x85,0x01,0x03,0x00,0x85,0x00,0x02, 0x00,0x86,0x00,0x01,0x00,0xdf,0x00,0x00,0x00,0x84,0x32,0x65,0x11,0x82,0x31, 0x64,0x10,0x04,0x33,0x66,0x12,0x31,0x64,0x10,0x31,0x64,0x11,0x32,0x65,0x12, 0x86,0x31,0x64,0x11,0x82,0x31,0x64,0x10,0x83,0x31,0x64,0x11,0x82,0x30,0x63, 0x10,0x02,0x31,0x64,0x11,0x30,0x63,0x10,0x83,0x31,0x64,0x11,0x03,0x31,0x63, 0x10,0x31,0x63,0x11,0x31,0x64,0x11,0x84,0x30,0x63,0x10,0x0f,0x31,0x63,0x10, 0x30,0x62,0x10,0x30,0x62,0x11,0x31,0x63,0x12,0x31,0x63,0x11,0x30,0x62,0x11, 0x31,0x63,0x11,0x30,0x62,0x11,0x30,0x63,0x11,0x31,0x63,0x11,0x30,0x62,0x10, 0x2f,0x62,0x11,0x31,0x61,0x11,0x30,0x62,0x11,0x2f,0x61,0x10,0x82,0x30,0x63, 0x12,0x82,0x30,0x62,0x11,0x03,0x31,0x62,0x11,0x31,0x62,0x12,0x30,0x62,0x11, 0x82,0x31,0x62,0x12,0x06,0x30,0x61,0x12,0x31,0x62,0x12,0x30,0x62,0x12,0x2f, 0x61,0x13,0x2f,0x61,0x12,0x31,0x62,0x13,0x82,0x2f,0x61,0x12,0x01,0x30,0x62, 0x13,0x82,0x2f,0x61,0x14,0x83,0x30,0x61,0x14,0x08,0x30,0x60,0x13,0x30,0x60, 0x14,0x30,0x61,0x14,0x30,0x60,0x14,0x2f,0x60,0x13,0x30,0x60,0x14,0x2f,0x5f, 0x14,0x30,0x60,0x14,0x84,0x2f,0x5f,0x14,0x0c,0x30,0x5f,0x15,0x2f,0x5e,0x14, 0x2f,0x5f,0x14,0x30,0x60,0x16,0x2f,0x5f,0x15,0x2e,0x5e,0x15,0x2f,0x5f,0x15, 0x2e,0x5e,0x15,0x2e,0x5e,0x14,0x2e,0x5e,0x15,0x2f,0x5f,0x15,0x2e,0x5e,0x15, 0x83,0x2e,0x5e,0x14,0x82,0x2d,0x5c,0x14,0x01,0x2d,0x5c,0x15,0x82,0x2e,0x5d, 0x15,0x05,0x2c,0x5c,0x14,0x2d,0x5c,0x15,0x2e,0x5d,0x14,0x2d,0x5c,0x14,0x2c, 0x5b,0x14,0x83,0x2d,0x5c,0x14,0x02,0x2c,0x5b,0x14,0x2c,0x5b,0x15,0x82,0x2c, 0x5b,0x14,0x03,0x2c,0x5b,0x15,0x2b,0x5a,0x14,0x2d,0x5c,0x16,0x82,0x2c,0x5b, 0x14,0x06,0x2b,0x5a,0x14,0x2a,0x59,0x14,0x28,0x56,0x13,0x26,0x54,0x11,0x24, 0x51,0x0e,0x23,0x50,0x0d,0x83,0x20,0x4d,0x0c,0x83,0x1f,0x4c,0x0b,0x02,0x1f, 0x4c,0x0a,0x20,0x4c,0x0a,0x82,0x1f,0x4c,0x0c,0x02,0x1f,0x4b,0x0c,0x1e,0x4b, 0x0b,0x84,0x1e,0x4b,0x0a,0x01,0x1e,0x4a,0x0b,0x83,0x1d,0x49,0x0a,0x03,0x1e, 0x4a,0x0b,0x1d,0x49,0x0a,0x1e,0x4a,0x0a,0x83,0x1d,0x48,0x0a,0x03,0x1c,0x48, 0x0a,0x1d,0x49,0x0a,0x1d,0x48,0x0a,0x83,0x1c,0x48,0x09,0x05,0x1c,0x47,0x0a, 0x1c,0x48,0x0a,0x1b,0x47,0x08,0x1b,0x47,0x09,0x1a,0x47,0x09,0x82,0x1a,0x46, 0x08,0x08,0x1a,0x46,0x09,0x1b,0x46,0x09,0x1a,0x46,0x08,0x1a,0x45,0x09,0x1a, 0x46,0x09,0x19,0x45,0x08,0x18,0x45,0x07,0x19,0x45,0x08,0x82,0x19,0x44,0x08, 0x82,0x18,0x44,0x07,0x08,0x19,0x44,0x08,0x18,0x43,0x07,0x17,0x43,0x06,0x18, 0x43,0x07,0x17,0x43,0x06,0x18,0x43,0x07,0x17,0x42,0x07,0x16,0x41,0x06,0x82, 0x16,0x42,0x07,0x01,0x16,0x42,0x06,0x87,0x16,0x41,0x06,0x83,0x15,0x40,0x05, 0x03,0x15,0x41,0x06,0x15,0x40,0x06,0x14,0x3f,0x05,0x84,0x15,0x40,0x05,0x01, 0x16,0x40,0x06,0x82,0x15,0x3f,0x05,0x82,0x15,0x40,0x06,0x83,0x14,0x3f,0x05, 0x02,0x15,0x3f,0x06,0x14,0x3f,0x04,0x82,0x15,0x40,0x05,0x82,0x14,0x3f,0x05, 0x82,0x15,0x3f,0x05,0x01,0x14,0x3f,0x05,0x82,0x15,0x3f,0x05,0x01,0x15,0x40, 0x05,0x82,0x14,0x3f,0x05,0x01,0x14,0x3f,0x04,0x83,0x14,0x3e,0x04,0x01,0x14, 0x3e,0x05,0x82,0x14,0x3e,0x04,0x04,0x14,0x3e,0x05,0x15,0x3f,0x05,0x14,0x3e, 0x04,0x13,0x3e,0x03,0x82,0x14,0x3e,0x05,0x04,0x14,0x3e,0x04,0x14,0x3f,0x04, 0x14,0x3d,0x03,0x13,0x3e,0x03,0x83,0x14,0x3e,0x04,0x03,0x13,0x3e,0x03,0x14, 0x3e,0x03,0x14,0x3f,0x04,0x82,0x13,0x3d,0x04,0x0e,0x14,0x3f,0x04,0x14,0x3e, 0x04,0x14,0x3e,0x05,0x14,0x3e,0x04,0x13,0x3e,0x03,0x14,0x3e,0x04,0x14,0x3e, 0x03,0x14,0x3d,0x03,0x14,0x3e,0x04,0x14,0x3f,0x04,0x13,0x3e,0x05,0x14,0x3f, 0x04,0x13,0x3e,0x03,0x14,0x3e,0x03,0x82,0x14,0x3e,0x04,0x04,0x13,0x3f,0x03, 0x14,0x41,0x04,0x14,0x3f,0x04,0x13,0x3e,0x03,0x83,0x14,0x3f,0x04,0x82,0x14, 0x40,0x04,0x03,0x15,0x40,0x05,0x13,0x40,0x03,0x14,0x40,0x04,0x82,0x14,0x41, 0x03,0x04,0x14,0x41,0x04,0x14,0x42,0x04,0x13,0x40,0x04,0x14,0x40,0x04,0x83, 0x14,0x40,0x03,0x03,0x14,0x3f,0x03,0x14,0x3f,0x04,0x13,0x3f,0x03,0x83,0x14, 0x3e,0x04,0x84,0x13,0x3e,0x03,0x82,0x12,0x3c,0x03,0x01,0x12,0x3b,0x03,0x82, 0x12,0x3c,0x03,0x01,0x11,0x3b,0x03,0x83,0x11,0x3a,0x03,0x03,0x11,0x39,0x03, 0x10,0x39,0x03,0x11,0x39,0x04,0x82,0x10,0x38,0x03,0x01,0x11,0x39,0x04,0x82, 0x10,0x38,0x03,0x05,0x11,0x38,0x04,0x10,0x37,0x03,0x10,0x37,0x04,0x10,0x37, 0x03,0x0f,0x36,0x02,0x82,0x0f,0x36,0x03,0x0d,0x0e,0x35,0x03,0x0f,0x36,0x02, 0x0f,0x35,0x02,0x0f,0x34,0x03,0x10,0x35,0x03,0x0f,0x34,0x03,0x0f,0x33,0x02, 0x0f,0x34,0x04,0x0e,0x34,0x03,0x0e,0x33,0x03,0x0f,0x33,0x03,0x0e,0x32,0x02, 0x0d,0x33,0x01,0x82,0x0d,0x33,0x02,0x01,0x0d,0x32,0x02,0x82,0x0e,0x32,0x02, 0x01,0x0f,0x33,0x03,0x82,0x0d,0x31,0x02,0x03,0x0e,0x31,0x02,0x0e,0x32,0x03, 0x0d,0x31,0x02,0x83,0x0d,0x30,0x01,0x0b,0x0d,0x30,0x02,0x0c,0x30,0x02,0x0e, 0x30,0x02,0x0c,0x30,0x02,0x0d,0x30,0x02,0x0c,0x2f,0x01,0x0c,0x2f,0x02,0x0d, 0x2f,0x02,0x0d,0x2e,0x02,0x0c,0x2f,0x02,0x0c,0x2e,0x02,0x83,0x0c,0x2d,0x02, 0x03,0x0c,0x2d,0x01,0x0b,0x2e,0x01,0x0d,0x2e,0x02,0x82,0x0b,0x2d,0x02,0x01, 0x0a,0x2c,0x01,0x82,0x0c,0x2c,0x02,0x05,0x0b,0x2b,0x02,0x0c,0x2c,0x03,0x0c, 0x2c,0x02,0x0c,0x2b,0x02,0x0b,0x2b,0x01,0x82,0x0b,0x2b,0x02,0x01,0x0c,0x2b, 0x02,0x82,0x0b,0x2b,0x02,0x04,0x0b,0x2a,0x01,0x0b,0x2a,0x02,0x0a,0x29,0x01, 0x0b,0x29,0x02,0x82,0x0b,0x2a,0x02,0x01,0x0b,0x29,0x01,0x82,0x0b,0x29,0x02, 0x83,0x0a,0x29,0x01,0x82,0x0b,0x29,0x02,0x04,0x0a,0x29,0x01,0x0b,0x29,0x02, 0x0a,0x28,0x01,0x0b,0x29,0x02,0x82,0x0a,0x28,0x01,0x02,0x0a,0x28,0x02,0x0a, 0x28,0x01,0x82,0x0a,0x27,0x01,0x05,0x0a,0x27,0x00,0x0a,0x27,0x01,0x0a,0x27, 0x02,0x0a,0x26,0x01,0x0a,0x27,0x02,0x82,0x0a,0x26,0x01,0x01,0x09,0x26,0x01, 0x83,0x0a,0x26,0x01,0x01,0x0a,0x26,0x00,0x83,0x0a,0x25,0x01,0x03,0x09,0x25, 0x01,0x0a,0x25,0x02,0x0a,0x25,0x01,0x82,0x0a,0x24,0x01,0x05,0x09,0x23,0x01, 0x0a,0x24,0x01,0x09,0x24,0x01,0x09,0x23,0x01,0x0a,0x23,0x02,0x82,0x09,0x23, 0x01,0x83,0x09,0x22,0x01,0x01,0x09,0x23,0x01,0x82,0x09,0x22,0x01,0x02,0x08, 0x21,0x01,0x09,0x22,0x01,0x84,0x09,0x21,0x01,0x01,0x08,0x21,0x00,0x85,0x08, 0x20,0x01,0x01,0x08,0x1f,0x01,0x82,0x08,0x20,0x01,0x82,0x08,0x1f,0x01,0x01, 0x07,0x1e,0x00,0x83,0x08,0x1f,0x01,0x02,0x07,0x1f,0x00,0x08,0x1f,0x01,0x82, 0x08,0x1e,0x00,0x85,0x07,0x1e,0x00,0x02,0x08,0x1e,0x01,0x07,0x1d,0x01,0x84, 0x07,0x1d,0x00,0x05,0x07,0x1c,0x00,0x07,0x1d,0x00,0x07,0x1c,0x00,0x07,0x1d, 0x00,0x06,0x1c,0x00,0x86,0x06,0x1b,0x00,0x82,0x06,0x1a,0x00,0x01,0x06,0x1b, 0x00,0x85,0x06,0x1a,0x00,0x01,0x05,0x1a,0x00,0x82,0x06,0x1a,0x00,0x85,0x05, 0x19,0x00,0x8c,0x05,0x18,0x00,0x83,0x05,0x17,0x00,0x04,0x05,0x16,0x00,0x05, 0x17,0x00,0x04,0x17,0x00,0x05,0x17,0x00,0x88,0x04,0x16,0x00,0x85,0x04,0x15, 0x00,0x02,0x05,0x15,0x00,0x05,0x16,0x00,0x82,0x04,0x15,0x00,0x06,0x05,0x15, 0x00,0x04,0x14,0x00,0x05,0x15,0x00,0x04,0x14,0x00,0x04,0x15,0x00,0x05,0x15, 0x00,0x82,0x04,0x14,0x00,0x01,0x05,0x14,0x00,0x84,0x04,0x14,0x00,0x88,0x05, 0x14,0x00,0x82,0x05,0x14,0x01,0x09,0x05,0x13,0x01,0x04,0x13,0x00,0x05,0x14, 0x00,0x06,0x14,0x00,0x06,0x15,0x00,0x06,0x17,0x00,0x07,0x17,0x01,0x08,0x18, 0x02,0x09,0x17,0x03,0x84,0x09,0x17,0x04,0x02,0x09,0x16,0x04,0x09,0x17,0x04, 0x82,0x09,0x16,0x04,0x01,0x09,0x15,0x03,0x82,0x08,0x15,0x03,0x02,0x07,0x14, 0x03,0x08,0x14,0x03,0x84,0x07,0x14,0x03,0x03,0x07,0x14,0x04,0x07,0x13,0x03, 0x08,0x13,0x03,0x86,0x07,0x13,0x03,0x82,0x07,0x12,0x03,0x01,0x07,0x13,0x03, 0x85,0x07,0x12,0x03,0x83,0x07,0x11,0x03,0x02,0x06,0x11,0x03,0x07,0x11,0x03, 0x84,0x06,0x10,0x03,0x85,0x06,0x0f,0x03,0x02,0x05,0x0e,0x03,0x05,0x0e,0x02, 0x82,0x06,0x0e,0x03,0x01,0x05,0x0d,0x03,0x83,0x05,0x0d,0x02,0x82,0x05,0x0c, 0x02,0x01,0x04,0x0c,0x02,0x82,0x05,0x0c,0x02,0x01,0x05,0x0b,0x02,0x84,0x04, 0x0b,0x02,0x86,0x04,0x0a,0x02,0x82,0x03,0x0a,0x02,0x85,0x03,0x09,0x01,0x84, 0x03,0x08,0x01,0x02,0x03,0x07,0x01,0x03,0x08,0x01,0x85,0x02,0x07,0x01,0x85, 0x02,0x06,0x01,0x83,0x02,0x05,0x00,0x82,0x01,0x05,0x00,0x85,0x01,0x04,0x00, 0x85,0x01,0x03,0x00,0x85,0x00,0x02,0x00,0x86,0x00,0x01,0x00,0xdf,0x00,0x00, 0x00,0x0f,0x34,0x67,0x12,0x32,0x66,0x11,0x33,0x67,0x12,0x32,0x66,0x11,0x33, 0x66,0x11,0x33,0x67,0x12,0x32,0x66,0x11,0x33,0x66,0x11,0x33,0x67,0x12,0x32, 0x66,0x11,0x33,0x66,0x11,0x33,0x67,0x12,0x32,0x66,0x11,0x33,0x66,0x12,0x32, 0x66,0x12,0x83,0x32,0x66,0x11,0x83,0x32,0x66,0x12,0x04,0x32,0x66,0x11,0x32, 0x66,0x12,0x33,0x66,0x12,0x32,0x66,0x11,0x83,0x32,0x66,0x12,0x84,0x32,0x66, 0x11,0x0a,0x32,0x66,0x12,0x32,0x66,0x11,0x31,0x65,0x11,0x32,0x66,0x11,0x31, 0x65,0x11,0x32,0x64,0x11,0x32,0x65,0x12,0x31,0x66,0x12,0x32,0x66,0x11,0x32, 0x64,0x10,0x82,0x31,0x65,0x11,0x82,0x30,0x64,0x11,0x08,0x31,0x64,0x11,0x32, 0x64,0x11,0x31,0x65,0x12,0x31,0x64,0x11,0x31,0x65,0x12,0x31,0x64,0x11,0x30, 0x64,0x11,0x31,0x64,0x12,0x82,0x32,0x64,0x12,0x02,0x32,0x65,0x12,0x32,0x64, 0x12,0x82,0x31,0x63,0x12,0x01,0x32,0x64,0x12,0x82,0x31,0x64,0x13,0x0d,0x31, 0x65,0x13,0x31,0x63,0x13,0x31,0x64,0x14,0x30,0x63,0x13,0x31,0x64,0x14,0x31, 0x64,0x15,0x32,0x63,0x15,0x31,0x63,0x14,0x31,0x63,0x13,0x31,0x62,0x14,0x32, 0x63,0x15,0x31,0x63,0x14,0x31,0x63,0x15,0x85,0x31,0x62,0x14,0x83,0x31,0x62, 0x15,0x03,0x30,0x61,0x14,0x30,0x61,0x15,0x31,0x62,0x16,0x82,0x30,0x61,0x15, 0x01,0x31,0x62,0x16,0x82,0x30,0x61,0x15,0x82,0x2f,0x60,0x15,0x03,0x30,0x61, 0x17,0x2f,0x60,0x16,0x30,0x61,0x15,0x83,0x2f,0x60,0x16,0x09,0x2f,0x60,0x15, 0x2f,0x5f,0x16,0x2e,0x5f,0x15,0x2f,0x5f,0x16,0x30,0x60,0x17,0x2e,0x5f,0x16, 0x2f,0x5e,0x16,0x2f,0x5f,0x15,0x2e,0x5e,0x15,0x82,0x2f,0x5e,0x16,0x01,0x2e, 0x5e,0x14,0x82,0x2e,0x5e,0x16,0x01,0x2d,0x5d,0x15,0x82,0x2d,0x5c,0x14,0x04, 0x2d,0x5d,0x15,0x2d,0x5c,0x15,0x2c,0x5b,0x14,0x2d,0x5c,0x15,0x82,0x2c,0x5c, 0x14,0x0a,0x2d,0x5c,0x15,0x2c,0x5b,0x14,0x2c,0x5b,0x15,0x2c,0x5c,0x16,0x2d, 0x5b,0x15,0x2b,0x5a,0x14,0x29,0x58,0x12,0x28,0x57,0x12,0x27,0x55,0x11,0x23, 0x51,0x0e,0x82,0x22,0x4f,0x0e,0x04,0x20,0x4d,0x0d,0x1f,0x4d,0x0b,0x1f,0x4c, 0x0b,0x1f,0x4c,0x0c,0x82,0x20,0x4d,0x0d,0x84,0x1f,0x4c,0x0c,0x82,0x1e,0x4c, 0x0a,0x82,0x1e,0x4b,0x0b,0x04,0x1e,0x4b,0x0a,0x1e,0x4c,0x0a,0x1f,0x4c,0x0b, 0x1e,0x4b,0x0b,0x82,0x1e,0x4a,0x0b,0x82,0x1d,0x49,0x0a,0x04,0x1c,0x4a,0x0b, 0x1d,0x4a,0x0c,0x1d,0x49,0x0b,0x1d,0x49,0x0a,0x82,0x1d,0x49,0x09,0x02,0x1c, 0x49,0x09,0x1b,0x48,0x08,0x82,0x1c,0x48,0x08,0x82,0x1b,0x47,0x09,0x01,0x1b, 0x47,0x08,0x82,0x1a,0x46,0x09,0x01,0x1a,0x46,0x07,0x84,0x1a,0x46,0x08,0x01, 0x19,0x45,0x08,0x82,0x1a,0x46,0x08,0x82,0x19,0x45,0x08,0x83,0x18,0x44,0x07, 0x03,0x18,0x44,0x06,0x17,0x43,0x07,0x17,0x44,0x07,0x82,0x17,0x44,0x06,0x03, 0x17,0x43,0x07,0x17,0x42,0x06,0x17,0x43,0x07,0x82,0x16,0x42,0x06,0x02,0x17, 0x43,0x07,0x16,0x42,0x06,0x82,0x16,0x41,0x05,0x83,0x16,0x42,0x06,0x04,0x16, 0x41,0x06,0x16,0x41,0x05,0x16,0x42,0x06,0x16,0x41,0x05,0x82,0x15,0x41,0x05, 0x82,0x15,0x40,0x05,0x82,0x15,0x41,0x05,0x82,0x15,0x40,0x05,0x03,0x15,0x41, 0x05,0x15,0x40,0x05,0x15,0x41,0x05,0x83,0x15,0x40,0x05,0x01,0x14,0x40,0x04, 0x82,0x15,0x3f,0x04,0x01,0x14,0x40,0x04,0x83,0x15,0x40,0x05,0x82,0x14,0x41, 0x05,0x83,0x14,0x40,0x04,0x02,0x14,0x3f,0x04,0x15,0x3f,0x05,0x82,0x15,0x3f, 0x04,0x04,0x14,0x3e,0x04,0x15,0x3f,0x04,0x14,0x3f,0x03,0x14,0x3f,0x04,0x82, 0x14,0x3f,0x05,0x03,0x14,0x40,0x04,0x13,0x40,0x04,0x13,0x3f,0x03,0x82,0x14, 0x3f,0x05,0x02,0x13,0x3f,0x03,0x14,0x3f,0x05,0x83,0x14,0x40,0x04,0x06,0x13, 0x3e,0x04,0x13,0x3e,0x05,0x14,0x3f,0x05,0x13,0x3f,0x03,0x14,0x3f,0x05,0x15, 0x3f,0x04,0x82,0x14,0x3f,0x04,0x04,0x14,0x40,0x04,0x14,0x3f,0x03,0x14,0x3f, 0x04,0x13,0x40,0x04,0x82,0x14,0x3f,0x04,0x01,0x13,0x40,0x04,0x83,0x14,0x40, 0x04,0x02,0x14,0x3f,0x03,0x13,0x40,0x03,0x83,0x14,0x40,0x04,0x16,0x14,0x3f, 0x03,0x15,0x40,0x04,0x15,0x41,0x04,0x14,0x41,0x04,0x14,0x3f,0x03,0x15,0x41, 0x04,0x14,0x42,0x04,0x13,0x42,0x03,0x15,0x42,0x03,0x15,0x41,0x04,0x14,0x42, 0x04,0x13,0x41,0x04,0x14,0x41,0x04,0x15,0x42,0x03,0x15,0x41,0x04,0x15,0x41, 0x05,0x14,0x40,0x04,0x13,0x40,0x04,0x14,0x40,0x04,0x15,0x40,0x04,0x14,0x40, 0x04,0x13,0x40,0x04,0x83,0x13,0x3f,0x03,0x04,0x14,0x3f,0x04,0x12,0x3d,0x03, 0x11,0x3c,0x02,0x12,0x3d,0x04,0x82,0x12,0x3c,0x03,0x82,0x12,0x3b,0x03,0x82, 0x11,0x3a,0x03,0x83,0x11,0x3a,0x04,0x82,0x10,0x39,0x03,0x04,0x11,0x3a,0x04, 0x10,0x39,0x03,0x10,0x38,0x03,0x10,0x39,0x03,0x83,0x10,0x38,0x03,0x82,0x0f, 0x37,0x02,0x01,0x0f,0x37,0x04,0x82,0x0f,0x37,0x03,0x04,0x0e,0x36,0x02,0x0e, 0x36,0x03,0x0e,0x35,0x02,0x0f,0x35,0x03,0x83,0x0e,0x35,0x02,0x82,0x0e,0x35, 0x03,0x01,0x0f,0x34,0x03,0x84,0x0e,0x33,0x02,0x01,0x0e,0x32,0x02,0x82,0x0e, 0x32,0x01,0x04,0x0e,0x32,0x02,0x0e,0x31,0x02,0x0e,0x31,0x01,0x0e,0x32,0x02, 0x85,0x0e,0x31,0x02,0x02,0x0d,0x30,0x02,0x0d,0x31,0x02,0x82,0x0e,0x30,0x02, 0x84,0x0d,0x30,0x02,0x03,0x0e,0x30,0x02,0x0d,0x30,0x02,0x0d,0x2f,0x02,0x83, 0x0d,0x2e,0x02,0x02,0x0d,0x2e,0x01,0x0c,0x2e,0x02,0x82,0x0d,0x2e,0x01,0x03, 0x0d,0x2d,0x02,0x0c,0x2d,0x02,0x0b,0x2d,0x02,0x82,0x0c,0x2c,0x01,0x01,0x0c, 0x2d,0x01,0x83,0x0c,0x2c,0x02,0x01,0x0b,0x2c,0x01,0x83,0x0c,0x2c,0x02,0x01, 0x0c,0x2c,0x01,0x82,0x0b,0x2b,0x01,0x02,0x0c,0x2b,0x02,0x0b,0x2a,0x01,0x82, 0x0b,0x2b,0x02,0x82,0x0b,0x2a,0x01,0x82,0x0b,0x2a,0x02,0x03,0x0b,0x29,0x01, 0x0c,0x2a,0x02,0x0b,0x2a,0x02,0x82,0x0b,0x29,0x01,0x82,0x0b,0x29,0x02,0x82, 0x0b,0x28,0x01,0x82,0x0a,0x28,0x01,0x05,0x0b,0x29,0x02,0x0b,0x28,0x02,0x0b, 0x28,0x01,0x0b,0x27,0x01,0x0b,0x28,0x02,0x82,0x0a,0x27,0x00,0x01,0x0a,0x27, 0x01,0x82,0x0a,0x27,0x02,0x02,0x0a,0x26,0x01,0x0a,0x27,0x01,0x82,0x0a,0x26, 0x01,0x09,0x0a,0x27,0x01,0x0a,0x26,0x01,0x09,0x25,0x01,0x09,0x26,0x01,0x0a, 0x26,0x01,0x09,0x25,0x01,0x0a,0x24,0x01,0x0a,0x25,0x01,0x0a,0x24,0x01,0x86, 0x09,0x24,0x01,0x01,0x09,0x23,0x01,0x82,0x09,0x23,0x00,0x02,0x09,0x23,0x01, 0x08,0x23,0x00,0x85,0x09,0x22,0x01,0x03,0x08,0x21,0x01,0x09,0x21,0x01,0x08, 0x21,0x00,0x83,0x08,0x21,0x01,0x03,0x09,0x21,0x01,0x08,0x20,0x01,0x08,0x20, 0x00,0x83,0x08,0x20,0x01,0x01,0x08,0x1f,0x00,0x85,0x08,0x1f,0x01,0x01,0x07, 0x1f,0x00,0x82,0x08,0x1e,0x00,0x82,0x07,0x1e,0x00,0x82,0x08,0x1e,0x01,0x01, 0x07,0x1e,0x00,0x89,0x07,0x1d,0x00,0x01,0x07,0x1c,0x00,0x85,0x06,0x1c,0x00, 0x02,0x06,0x1b,0x00,0x06,0x1c,0x01,0x82,0x06,0x1b,0x00,0x01,0x06,0x1b,0x01, 0x84,0x06,0x1a,0x00,0x02,0x06,0x1b,0x00,0x05,0x1a,0x00,0x83,0x06,0x1a,0x00, 0x01,0x05,0x1a,0x00,0x83,0x05,0x19,0x00,0x04,0x06,0x19,0x00,0x05,0x19,0x00, 0x05,0x18,0x00,0x05,0x19,0x00,0x84,0x05,0x18,0x00,0x01,0x05,0x19,0x00,0x86, 0x05,0x18,0x00,0x82,0x05,0x17,0x00,0x01,0x05,0x18,0x00,0x82,0x04,0x17,0x00, 0x82,0x04,0x16,0x00,0x01,0x04,0x17,0x00,0x85,0x04,0x16,0x00,0x82,0x04,0x15, 0x00,0x01,0x04,0x16,0x00,0x82,0x04,0x15,0x00,0x01,0x04,0x16,0x00,0x85,0x04, 0x15,0x00,0x01,0x04,0x14,0x00,0x82,0x04,0x15,0x00,0x82,0x04,0x14,0x00,0x01, 0x04,0x15,0x00,0x83,0x04,0x14,0x00,0x03,0x04,0x15,0x00,0x05,0x14,0x00,0x04, 0x14,0x00,0x82,0x05,0x14,0x00,0x05,0x04,0x14,0x00,0x05,0x14,0x00,0x04,0x14, 0x00,0x05,0x14,0x00,0x04,0x14,0x00,0x82,0x05,0x14,0x00,0x01,0x05,0x13,0x01, 0x83,0x04,0x13,0x00,0x0e,0x05,0x14,0x00,0x06,0x15,0x00,0x06,0x16,0x01,0x07, 0x17,0x01,0x07,0x18,0x01,0x08,0x17,0x02,0x09,0x17,0x04,0x0a,0x18,0x05,0x09, 0x17,0x04,0x09,0x16,0x04,0x08,0x17,0x04,0x08,0x16,0x03,0x09,0x17,0x04,0x09, 0x16,0x03,0x82,0x09,0x16,0x04,0x03,0x08,0x15,0x04,0x08,0x15,0x03,0x08,0x14, 0x03,0x82,0x07,0x14,0x03,0x82,0x07,0x13,0x03,0x82,0x07,0x14,0x03,0x85,0x07, 0x13,0x03,0x86,0x07,0x12,0x03,0x02,0x07,0x11,0x03,0x07,0x12,0x03,0x82,0x07, 0x11,0x03,0x01,0x06,0x11,0x03,0x82,0x07,0x11,0x03,0x84,0x06,0x10,0x03,0x85, 0x06,0x0f,0x03,0x02,0x06,0x0e,0x03,0x05,0x0e,0x03,0x82,0x05,0x0e,0x02,0x03, 0x05,0x0e,0x03,0x05,0x0e,0x02,0x05,0x0e,0x03,0x85,0x05,0x0d,0x02,0x01,0x05, 0x0c,0x02,0x83,0x04,0x0c,0x02,0x85,0x04,0x0b,0x02,0x82,0x04,0x0a,0x02,0x01, 0x03,0x0a,0x02,0x82,0x03,0x0a,0x01,0x85,0x03,0x09,0x01,0x86,0x03,0x08,0x01, 0x85,0x02,0x07,0x01,0x83,0x02,0x06,0x01,0x02,0x02,0x06,0x00,0x02,0x06,0x01, 0x82,0x02,0x05,0x01,0x01,0x02,0x05,0x00,0x82,0x01,0x05,0x00,0x85,0x01,0x04, 0x00,0x85,0x01,0x03,0x00,0x85,0x00,0x02,0x00,0x86,0x00,0x01,0x00,0xdf,0x00, 0x00,0x00,0x82,0x34,0x69,0x13,0x03,0x34,0x68,0x12,0x34,0x69,0x13,0x35,0x69, 0x13,0x83,0x34,0x69,0x13,0x02,0x35,0x69,0x12,0x34,0x68,0x11,0x82,0x34,0x69, 0x13,0x82,0x33,0x68,0x12,0x02,0x33,0x67,0x11,0x34,0x68,0x12,0x87,0x33,0x68, 0x12,0x03,0x33,0x67,0x11,0x34,0x68,0x12,0x33,0x68,0x12,0x83,0x33,0x67,0x11, 0x82,0x33,0x67,0x12,0x02,0x32,0x67,0x11,0x33,0x68,0x13,0x83,0x33,0x67,0x12, 0x02,0x33,0x68,0x13,0x32,0x66,0x11,0x82,0x32,0x67,0x12,0x03,0x33,0x67,0x12, 0x32,0x67,0x12,0x33,0x67,0x12,0x82,0x32,0x67,0x12,0x07,0x33,0x68,0x13,0x33, 0x67,0x14,0x33,0x66,0x12,0x33,0x66,0x13,0x32,0x66,0x12,0x32,0x67,0x12,0x32, 0x66,0x11,0x82,0x32,0x66,0x13,0x82,0x33,0x66,0x13,0x05,0x33,0x67,0x13,0x32, 0x66,0x13,0x33,0x65,0x14,0x33,0x65,0x13,0x32,0x66,0x13,0x82,0x32,0x66,0x14, 0x01,0x32,0x65,0x13,0x82,0x32,0x65,0x14,0x82,0x32,0x65,0x15,0x02,0x32,0x65, 0x14,0x32,0x64,0x15,0x82,0x33,0x65,0x15,0x85,0x32,0x64,0x15,0x01,0x31,0x64, 0x15,0x82,0x32,0x64,0x15,0x82,0x32,0x64,0x16,0x09,0x32,0x63,0x16,0x32,0x64, 0x16,0x33,0x64,0x17,0x32,0x63,0x16,0x32,0x64,0x17,0x32,0x64,0x16,0x32,0x63, 0x17,0x32,0x64,0x17,0x32,0x63,0x17,0x83,0x31,0x63,0x16,0x82,0x32,0x63,0x17, 0x02,0x31,0x63,0x16,0x32,0x63,0x18,0x82,0x31,0x62,0x17,0x05,0x31,0x63,0x17, 0x31,0x62,0x17,0x31,0x61,0x17,0x31,0x62,0x17,0x30,0x61,0x17,0x82,0x31,0x62, 0x17,0x01,0x32,0x62,0x18,0x82,0x30,0x61,0x16,0x04,0x30,0x60,0x17,0x30,0x60, 0x16,0x30,0x60,0x17,0x2f,0x60,0x16,0x82,0x2f,0x60,0x17,0x04,0x30,0x60,0x16, 0x2e,0x5e,0x15,0x2f,0x5f,0x16,0x2f,0x60,0x17,0x86,0x2e,0x5e,0x16,0x86,0x2d, 0x5d,0x15,0x0c,0x2c,0x5c,0x14,0x2d,0x5b,0x14,0x2c,0x5b,0x13,0x2b,0x5a,0x13, 0x27,0x55,0x11,0x26,0x54,0x10,0x24,0x52,0x0e,0x23,0x51,0x0d,0x20,0x4e,0x0c, 0x20,0x4e,0x0b,0x1f,0x4d,0x0a,0x1f,0x4d,0x0c,0x82,0x20,0x4d,0x0c,0x83,0x1f, 0x4d,0x0c,0x01,0x20,0x4d,0x0c,0x82,0x1f,0x4c,0x0b,0x03,0x1f,0x4c,0x0c,0x1e, 0x4b,0x0b,0x1e,0x4c,0x0b,0x82,0x1f,0x4c,0x0b,0x01,0x1e,0x4c,0x0b,0x82,0x1e, 0x4b,0x0a,0x06,0x1d,0x4b,0x0a,0x1d,0x4b,0x09,0x1d,0x4b,0x0a,0x1c,0x4a,0x09, 0x1c,0x49,0x0a,0x1d,0x4a,0x09,0x83,0x1c,0x49,0x09,0x02,0x1b,0x48,0x09,0x1b, 0x48,0x0a,0x82,0x1b,0x48,0x08,0x04,0x1b,0x48,0x09,0x1b,0x48,0x08,0x1b,0x48, 0x0a,0x1b,0x48,0x08,0x82,0x1a,0x47,0x08,0x01,0x1a,0x47,0x07,0x82,0x1a,0x47, 0x09,0x01,0x19,0x46,0x07,0x82,0x19,0x46,0x08,0x01,0x19,0x45,0x07,0x83,0x18, 0x45,0x06,0x02,0x18,0x45,0x07,0x18,0x45,0x06,0x83,0x18,0x44,0x07,0x85,0x17, 0x43,0x06,0x01,0x16,0x42,0x05,0x83,0x17,0x43,0x06,0x01,0x16,0x42,0x06,0x82, 0x17,0x43,0x06,0x02,0x16,0x42,0x05,0x17,0x43,0x06,0x82,0x16,0x41,0x05,0x07, 0x16,0x42,0x05,0x16,0x42,0x06,0x16,0x42,0x05,0x15,0x41,0x05,0x16,0x42,0x05, 0x15,0x41,0x04,0x16,0x42,0x05,0x82,0x15,0x41,0x05,0x01,0x16,0x42,0x05,0x83, 0x16,0x41,0x05,0x01,0x16,0x42,0x05,0x82,0x15,0x41,0x05,0x06,0x15,0x40,0x05, 0x15,0x42,0x05,0x14,0x41,0x04,0x15,0x41,0x04,0x14,0x40,0x04,0x15,0x41,0x04, 0x83,0x15,0x40,0x05,0x02,0x15,0x40,0x04,0x15,0x40,0x05,0x82,0x15,0x40,0x04, 0x08,0x14,0x40,0x04,0x15,0x40,0x05,0x15,0x40,0x04,0x14,0x41,0x04,0x15,0x40, 0x04,0x14,0x41,0x04,0x15,0x40,0x05,0x14,0x40,0x05,0x83,0x14,0x3f,0x04,0x01, 0x14,0x3f,0x03,0x82,0x14,0x3f,0x04,0x01,0x14,0x3f,0x05,0x82,0x14,0x40,0x05, 0x03,0x15,0x40,0x04,0x14,0x40,0x04,0x14,0x40,0x03,0x82,0x14,0x41,0x04,0x04, 0x15,0x41,0x04,0x14,0x41,0x04,0x15,0x41,0x04,0x14,0x41,0x04,0x82,0x14,0x40, 0x04,0x05,0x15,0x41,0x04,0x15,0x40,0x04,0x15,0x41,0x04,0x15,0x42,0x05,0x14, 0x42,0x04,0x83,0x15,0x42,0x04,0x82,0x15,0x41,0x04,0x01,0x15,0x42,0x04,0x83, 0x15,0x42,0x03,0x83,0x14,0x43,0x04,0x08,0x15,0x42,0x04,0x14,0x43,0x04,0x14, 0x42,0x03,0x14,0x43,0x04,0x14,0x41,0x02,0x15,0x42,0x04,0x15,0x42,0x05,0x15, 0x42,0x04,0x83,0x14,0x41,0x04,0x01,0x14,0x40,0x03,0x83,0x14,0x41,0x04,0x82, 0x13,0x40,0x03,0x01,0x13,0x3f,0x02,0x84,0x13,0x3e,0x03,0x82,0x12,0x3d,0x04, 0x03,0x12,0x3c,0x03,0x11,0x3c,0x03,0x12,0x3b,0x04,0x82,0x11,0x3b,0x04,0x82, 0x11,0x3a,0x03,0x82,0x11,0x3a,0x04,0x83,0x10,0x39,0x03,0x04,0x10,0x38,0x03, 0x11,0x39,0x03,0x10,0x38,0x03,0x0f,0x37,0x02,0x82,0x0f,0x37,0x03,0x82,0x0f, 0x37,0x02,0x82,0x0f,0x37,0x03,0x84,0x0f,0x36,0x03,0x03,0x0f,0x35,0x03,0x0f, 0x36,0x03,0x0f,0x35,0x03,0x82,0x0e,0x34,0x02,0x02,0x0f,0x34,0x03,0x0f,0x34, 0x02,0x84,0x0f,0x33,0x02,0x82,0x0e,0x32,0x02,0x0a,0x0e,0x33,0x03,0x0e,0x32, 0x03,0x0d,0x33,0x02,0x0d,0x32,0x03,0x0d,0x32,0x02,0x0e,0x32,0x02,0x0f,0x32, 0x03,0x0c,0x32,0x02,0x0e,0x31,0x02,0x0e,0x30,0x02,0x82,0x0e,0x31,0x02,0x01, 0x0c,0x31,0x02,0x82,0x0d,0x31,0x02,0x03,0x0d,0x30,0x02,0x0c,0x30,0x02,0x0d, 0x30,0x02,0x83,0x0d,0x2f,0x02,0x04,0x0d,0x2f,0x01,0x0d,0x2f,0x02,0x0b,0x2e, 0x01,0x0c,0x2f,0x01,0x83,0x0c,0x2e,0x01,0x03,0x0b,0x2e,0x02,0x0c,0x2e,0x01, 0x0c,0x2e,0x02,0x83,0x0b,0x2d,0x01,0x82,0x0b,0x2c,0x01,0x05,0x0c,0x2c,0x02, 0x0c,0x2d,0x01,0x0b,0x2c,0x01,0x0b,0x2b,0x01,0x0c,0x2b,0x02,0x82,0x0b,0x2b, 0x01,0x02,0x0b,0x2b,0x02,0x0c,0x2b,0x02,0x82,0x0b,0x2b,0x02,0x82,0x0b,0x2b, 0x01,0x82,0x0b,0x2a,0x01,0x83,0x0b,0x2a,0x02,0x01,0x0b,0x29,0x02,0x82,0x0b, 0x29,0x01,0x85,0x0b,0x29,0x02,0x02,0x0b,0x28,0x02,0x0a,0x28,0x01,0x82,0x0b, 0x28,0x01,0x01,0x0a,0x28,0x02,0x86,0x0a,0x27,0x01,0x84,0x0a,0x26,0x01,0x01, 0x0a,0x26,0x02,0x82,0x0a,0x26,0x01,0x03,0x0a,0x25,0x02,0x0a,0x25,0x01,0x09, 0x25,0x01,0x82,0x09,0x24,0x01,0x82,0x08,0x25,0x01,0x82,0x09,0x24,0x01,0x01, 0x09,0x23,0x00,0x82,0x09,0x24,0x01,0x02,0x09,0x23,0x01,0x08,0x23,0x01,0x84, 0x09,0x22,0x01,0x01,0x08,0x22,0x01,0x82,0x09,0x22,0x01,0x83,0x08,0x21,0x01, 0x03,0x09,0x21,0x01,0x08,0x21,0x01,0x08,0x20,0x01,0x82,0x08,0x21,0x01,0x86, 0x08,0x20,0x01,0x82,0x08,0x20,0x00,0x84,0x07,0x1f,0x00,0x82,0x08,0x1f,0x01, 0x01,0x08,0x1e,0x01,0x84,0x07,0x1e,0x00,0x01,0x07,0x1e,0x01,0x84,0x07,0x1d, 0x00,0x86,0x07,0x1c,0x00,0x08,0x06,0x1c,0x00,0x06,0x1c,0x01,0x06,0x1b,0x00, 0x06,0x1b,0x01,0x06,0x1b,0x00,0x06,0x1a,0x00,0x06,0x1b,0x00,0x06,0x1a,0x00, 0x82,0x05,0x1a,0x00,0x83,0x06,0x1a,0x00,0x01,0x06,0x19,0x00,0x86,0x05,0x19, 0x00,0x01,0x04,0x18,0x00,0x86,0x05,0x19,0x00,0x02,0x05,0x18,0x00,0x05,0x19, 0x00,0x86,0x05,0x18,0x00,0x01,0x04,0x18,0x00,0x85,0x04,0x17,0x00,0x82,0x04, 0x16,0x00,0x82,0x04,0x17,0x00,0x84,0x04,0x16,0x00,0x02,0x04,0x15,0x00,0x04, 0x16,0x00,0x83,0x04,0x15,0x00,0x01,0x04,0x16,0x00,0x8a,0x04,0x15,0x00,0x82, 0x05,0x15,0x00,0x82,0x04,0x14,0x00,0x82,0x05,0x15,0x00,0x03,0x04,0x15,0x00, 0x05,0x15,0x00,0x04,0x15,0x00,0x83,0x05,0x14,0x00,0x02,0x04,0x14,0x00,0x05, 0x14,0x00,0x83,0x04,0x14,0x00,0x82,0x04,0x13,0x00,0x03,0x05,0x14,0x01,0x05, 0x14,0x00,0x06,0x16,0x00,0x82,0x07,0x17,0x01,0x03,0x07,0x18,0x01,0x08,0x18, 0x03,0x09,0x17,0x03,0x83,0x09,0x17,0x04,0x82,0x08,0x17,0x03,0x02,0x08,0x17, 0x04,0x09,0x16,0x04,0x82,0x08,0x16,0x04,0x82,0x08,0x15,0x03,0x83,0x07,0x14, 0x03,0x88,0x07,0x13,0x03,0x87,0x07,0x12,0x03,0x82,0x06,0x11,0x03,0x82,0x07, 0x11,0x03,0x82,0x06,0x11,0x03,0x85,0x06,0x10,0x03,0x84,0x06,0x0f,0x03,0x05, 0x06,0x0f,0x02,0x05,0x0e,0x02,0x05,0x0e,0x03,0x05,0x0e,0x02,0x05,0x0e,0x03, 0x84,0x05,0x0d,0x02,0x03,0x05,0x0c,0x02,0x04,0x0c,0x02,0x05,0x0c,0x02,0x83, 0x04,0x0c,0x02,0x84,0x04,0x0b,0x02,0x82,0x04,0x0a,0x02,0x03,0x04,0x0a,0x01, 0x04,0x0a,0x02,0x03,0x0a,0x02,0x85,0x03,0x09,0x01,0x86,0x03,0x08,0x01,0x85, 0x02,0x07,0x01,0x82,0x02,0x06,0x01,0x82,0x02,0x06,0x00,0x01,0x02,0x06,0x01, 0x83,0x02,0x05,0x00,0x82,0x01,0x05,0x00,0x85,0x01,0x04,0x00,0x85,0x01,0x03, 0x00,0x85,0x00,0x02,0x00,0x86,0x00,0x01,0x00,0xdf,0x00,0x00,0x00,0x82,0x35, 0x6a,0x12,0x02,0x36,0x6b,0x12,0x35,0x6a,0x12,0x82,0x36,0x6b,0x12,0x02,0x35, 0x6a,0x12,0x35,0x6a,0x11,0x82,0x36,0x6b,0x12,0x04,0x35,0x6a,0x12,0x36,0x6b, 0x12,0x35,0x6a,0x13,0x35,0x6a,0x12,0x82,0x35,0x6b,0x13,0x02,0x36,0x6b,0x13, 0x35,0x6a,0x13,0x84,0x35,0x6a,0x12,0x01,0x35,0x6a,0x13,0x82,0x34,0x69,0x12, 0x03,0x35,0x6a,0x12,0x35,0x6a,0x13,0x35,0x6a,0x12,0x82,0x34,0x69,0x12,0x82, 0x34,0x6a,0x12,0x01,0x34,0x69,0x11,0x82,0x34,0x6a,0x12,0x02,0x34,0x69,0x12, 0x34,0x69,0x13,0x82,0x33,0x69,0x12,0x82,0x34,0x69,0x12,0x03,0x33,0x68,0x12, 0x34,0x69,0x13,0x34,0x69,0x12,0x82,0x34,0x69,0x13,0x02,0x33,0x68,0x12,0x34, 0x69,0x12,0x82,0x35,0x68,0x12,0x03,0x34,0x69,0x12,0x34,0x68,0x13,0x34,0x69, 0x14,0x82,0x34,0x68,0x13,0x03,0x33,0x68,0x13,0x34,0x69,0x14,0x34,0x68,0x14, 0x82,0x33,0x68,0x13,0x82,0x34,0x68,0x14,0x02,0x34,0x68,0x15,0x34,0x67,0x13, 0x85,0x33,0x67,0x15,0x04,0x33,0x66,0x14,0x34,0x67,0x15,0x35,0x68,0x16,0x34, 0x67,0x16,0x82,0x34,0x66,0x16,0x02,0x34,0x67,0x16,0x33,0x66,0x16,0x82,0x33, 0x67,0x16,0x02,0x34,0x66,0x16,0x33,0x66,0x16,0x82,0x33,0x65,0x17,0x02,0x33, 0x65,0x15,0x33,0x65,0x17,0x82,0x33,0x65,0x16,0x01,0x34,0x66,0x17,0x82,0x33, 0x65,0x17,0x04,0x33,0x65,0x18,0x33,0x65,0x17,0x33,0x65,0x16,0x33,0x65,0x18, 0x82,0x32,0x64,0x17,0x0a,0x32,0x64,0x16,0x33,0x65,0x18,0x32,0x63,0x17,0x33, 0x64,0x18,0x33,0x65,0x18,0x32,0x64,0x17,0x32,0x63,0x17,0x33,0x64,0x18,0x32, 0x64,0x17,0x32,0x63,0x18,0x82,0x31,0x63,0x17,0x01,0x32,0x63,0x17,0x82,0x31, 0x62,0x17,0x04,0x31,0x62,0x16,0x31,0x62,0x18,0x30,0x62,0x17,0x31,0x63,0x17, 0x82,0x30,0x62,0x16,0x03,0x30,0x61,0x16,0x30,0x62,0x16,0x30,0x62,0x17,0x82, 0x30,0x61,0x15,0x08,0x30,0x60,0x16,0x2f,0x60,0x16,0x2f,0x5f,0x15,0x2e,0x5f, 0x15,0x2e,0x5e,0x15,0x30,0x60,0x17,0x2e,0x5f,0x17,0x2e,0x5e,0x16,0x83,0x2d, 0x5e,0x15,0x83,0x2e,0x5e,0x15,0x82,0x2d,0x5e,0x16,0x0b,0x2d,0x5d,0x15,0x2c, 0x5c,0x15,0x29,0x59,0x13,0x28,0x58,0x12,0x26,0x56,0x10,0x25,0x55,0x0f,0x23, 0x52,0x0e,0x21,0x4f,0x0d,0x20,0x4e,0x0c,0x20,0x4f,0x0b,0x1f,0x4e,0x0a,0x82, 0x20,0x4e,0x0c,0x03,0x20,0x4f,0x0c,0x20,0x4e,0x0c,0x1f,0x4e,0x0b,0x82,0x20, 0x4e,0x0c,0x07,0x1f,0x4e,0x0b,0x1f,0x4d,0x0b,0x1e,0x4d,0x0a,0x1e,0x4e,0x0b, 0x1e,0x4c,0x0a,0x1e,0x4d,0x0a,0x1e,0x4d,0x0b,0x82,0x1e,0x4b,0x0b,0x82,0x1d, 0x4b,0x09,0x01,0x1e,0x4b,0x0b,0x82,0x1c,0x4a,0x09,0x01,0x1d,0x4a,0x0a,0x83, 0x1c,0x4a,0x09,0x04,0x1b,0x49,0x08,0x1c,0x49,0x09,0x1b,0x48,0x08,0x1c,0x49, 0x09,0x83,0x1b,0x49,0x08,0x04,0x1b,0x48,0x09,0x1a,0x48,0x08,0x19,0x47,0x07, 0x1a,0x48,0x08,0x82,0x19,0x47,0x07,0x03,0x19,0x46,0x07,0x18,0x46,0x07,0x19, 0x47,0x07,0x82,0x18,0x46,0x06,0x82,0x19,0x46,0x08,0x01,0x18,0x45,0x07,0x88, 0x17,0x44,0x06,0x01,0x16,0x43,0x06,0x82,0x17,0x44,0x06,0x02,0x16,0x43,0x05, 0x17,0x44,0x06,0x82,0x17,0x43,0x06,0x04,0x15,0x42,0x05,0x16,0x43,0x05,0x15, 0x42,0x05,0x15,0x42,0x04,0x82,0x16,0x43,0x05,0x02,0x16,0x42,0x05,0x15,0x42, 0x05,0x82,0x16,0x43,0x05,0x83,0x16,0x42,0x05,0x01,0x15,0x42,0x05,0x84,0x15, 0x41,0x05,0x83,0x15,0x42,0x04,0x01,0x15,0x41,0x04,0x83,0x15,0x41,0x05,0x02, 0x15,0x41,0x04,0x15,0x41,0x05,0x82,0x14,0x40,0x03,0x01,0x14,0x41,0x04,0x82, 0x14,0x40,0x03,0x06,0x14,0x41,0x04,0x15,0x41,0x04,0x14,0x41,0x05,0x14,0x40, 0x04,0x14,0x41,0x05,0x15,0x41,0x05,0x83,0x15,0x41,0x04,0x01,0x14,0x41,0x03, 0x82,0x14,0x40,0x04,0x02,0x14,0x41,0x05,0x14,0x41,0x04,0x82,0x15,0x41,0x04, 0x01,0x13,0x41,0x03,0x82,0x14,0x41,0x04,0x04,0x14,0x42,0x04,0x15,0x42,0x04, 0x14,0x42,0x04,0x15,0x42,0x04,0x82,0x14,0x41,0x03,0x82,0x14,0x42,0x04,0x82, 0x15,0x43,0x04,0x85,0x14,0x42,0x04,0x08,0x15,0x43,0x03,0x15,0x43,0x04,0x15, 0x43,0x03,0x15,0x43,0x04,0x14,0x43,0x03,0x15,0x43,0x04,0x16,0x43,0x04,0x15, 0x43,0x03,0x82,0x14,0x43,0x03,0x84,0x15,0x43,0x04,0x01,0x15,0x42,0x04,0x82, 0x15,0x42,0x03,0x83,0x14,0x42,0x04,0x01,0x14,0x42,0x03,0x82,0x14,0x42,0x04, 0x03,0x13,0x41,0x03,0x14,0x41,0x03,0x13,0x40,0x03,0x82,0x13,0x3f,0x03,0x82, 0x13,0x3f,0x04,0x82,0x12,0x3e,0x03,0x05,0x12,0x3d,0x02,0x11,0x3d,0x03,0x11, 0x3c,0x04,0x11,0x3b,0x03,0x11,0x3c,0x04,0x82,0x11,0x3b,0x03,0x02,0x11,0x3b, 0x04,0x10,0x3b,0x03,0x84,0x11,0x3a,0x03,0x02,0x10,0x39,0x03,0x10,0x3a,0x03, 0x84,0x0f,0x38,0x02,0x01,0x10,0x39,0x04,0x82,0x0f,0x38,0x03,0x82,0x0f,0x37, 0x03,0x04,0x10,0x38,0x04,0x0f,0x37,0x03,0x0f,0x36,0x03,0x0f,0x36,0x02,0x82, 0x0e,0x36,0x03,0x04,0x0f,0x36,0x03,0x0e,0x36,0x03,0x0e,0x35,0x02,0x0f,0x34, 0x02,0x82,0x0e,0x35,0x03,0x0b,0x0f,0x34,0x03,0x0e,0x33,0x02,0x0e,0x34,0x02, 0x0f,0x34,0x03,0x0e,0x33,0x03,0x0d,0x34,0x02,0x0d,0x33,0x03,0x0d,0x33,0x02, 0x0e,0x32,0x02,0x0e,0x33,0x02,0x0d,0x32,0x01,0x82,0x0e,0x32,0x02,0x0f,0x0e, 0x31,0x02,0x0c,0x31,0x02,0x0c,0x30,0x01,0x0d,0x31,0x02,0x0c,0x31,0x02,0x0c, 0x30,0x02,0x0c,0x31,0x02,0x0d,0x31,0x02,0x0d,0x30,0x02,0x0c,0x2f,0x02,0x0d, 0x2f,0x03,0x0d,0x30,0x01,0x0d,0x2f,0x01,0x0c,0x2f,0x01,0x0d,0x2f,0x01,0x83, 0x0c,0x2f,0x01,0x82,0x0c,0x2e,0x01,0x01,0x0c,0x2f,0x02,0x82,0x0b,0x2e,0x01, 0x02,0x0c,0x2e,0x01,0x0c,0x2d,0x02,0x83,0x0b,0x2c,0x01,0x08,0x0c,0x2d,0x01, 0x0c,0x2d,0x02,0x0c,0x2c,0x02,0x0c,0x2c,0x01,0x0c,0x2c,0x02,0x0b,0x2c,0x02, 0x0b,0x2b,0x01,0x0b,0x2b,0x02,0x82,0x0b,0x2c,0x01,0x0d,0x0c,0x2c,0x02,0x0b, 0x2b,0x01,0x0b,0x2b,0x02,0x0c,0x2b,0x02,0x0b,0x2a,0x01,0x0a,0x29,0x01,0x0b, 0x2a,0x01,0x0b,0x29,0x01,0x0a,0x29,0x01,0x0b,0x2a,0x02,0x0b,0x29,0x02,0x0a, 0x29,0x01,0x0b,0x2a,0x01,0x82,0x0b,0x2a,0x02,0x01,0x0b,0x28,0x01,0x83,0x0a, 0x28,0x01,0x02,0x09,0x27,0x00,0x09,0x28,0x01,0x85,0x0a,0x27,0x01,0x02,0x09, 0x26,0x01,0x0a,0x27,0x00,0x82,0x09,0x26,0x01,0x82,0x0a,0x26,0x01,0x08,0x0a, 0x25,0x01,0x09,0x25,0x01,0x0a,0x26,0x01,0x09,0x25,0x01,0x09,0x24,0x01,0x09, 0x25,0x01,0x09,0x25,0x02,0x09,0x24,0x00,0x83,0x09,0x24,0x01,0x01,0x08,0x24, 0x01,0x83,0x09,0x24,0x01,0x01,0x08,0x23,0x01,0x82,0x09,0x23,0x01,0x82,0x09, 0x22,0x01,0x01,0x09,0x23,0x01,0x83,0x08,0x22,0x01,0x88,0x08,0x21,0x01,0x82, 0x08,0x20,0x01,0x82,0x08,0x20,0x00,0x01,0x08,0x20,0x01,0x83,0x07,0x1f,0x00, 0x85,0x08,0x1f,0x01,0x02,0x07,0x1e,0x00,0x08,0x1e,0x01,0x82,0x07,0x1e,0x00, 0x03,0x07,0x1e,0x01,0x07,0x1d,0x00,0x06,0x1d,0x00,0x86,0x07,0x1d,0x00,0x01, 0x07,0x1c,0x00,0x82,0x06,0x1c,0x00,0x01,0x07,0x1c,0x00,0x82,0x06,0x1c,0x00, 0x01,0x06,0x1b,0x00,0x82,0x06,0x1b,0x01,0x03,0x06,0x1b,0x00,0x05,0x1b,0x00, 0x06,0x1b,0x00,0x83,0x06,0x1a,0x00,0x84,0x05,0x1a,0x00,0x8b,0x05,0x19,0x00, 0x85,0x05,0x18,0x00,0x03,0x04,0x18,0x00,0x04,0x17,0x00,0x05,0x18,0x00,0x83, 0x04,0x17,0x00,0x02,0x04,0x16,0x00,0x05,0x17,0x00,0x83,0x04,0x17,0x00,0x86, 0x04,0x16,0x00,0x8a,0x04,0x15,0x00,0x01,0x04,0x14,0x00,0x85,0x04,0x15,0x00, 0x8e,0x04,0x14,0x00,0x82,0x04,0x13,0x00,0x01,0x05,0x13,0x00,0x83,0x04,0x13, 0x00,0x07,0x04,0x14,0x00,0x05,0x15,0x00,0x06,0x16,0x00,0x06,0x16,0x01,0x07, 0x17,0x02,0x07,0x16,0x02,0x08,0x18,0x03,0x82,0x09,0x17,0x04,0x01,0x09,0x16, 0x04,0x83,0x08,0x16,0x03,0x82,0x08,0x16,0x04,0x01,0x09,0x15,0x04,0x82,0x08, 0x15,0x04,0x01,0x08,0x14,0x03,0x83,0x07,0x14,0x03,0x01,0x06,0x13,0x03,0x82, 0x07,0x13,0x03,0x03,0x06,0x12,0x03,0x07,0x12,0x03,0x07,0x13,0x03,0x82,0x06, 0x12,0x03,0x82,0x07,0x12,0x03,0x01,0x06,0x12,0x03,0x83,0x06,0x11,0x03,0x82, 0x07,0x11,0x03,0x82,0x06,0x11,0x03,0x85,0x06,0x10,0x03,0x83,0x06,0x0f,0x03, 0x03,0x06,0x0f,0x02,0x05,0x0f,0x03,0x05,0x0e,0x03,0x82,0x05,0x0e,0x02,0x01, 0x05,0x0e,0x03,0x86,0x05,0x0d,0x02,0x85,0x04,0x0c,0x02,0x84,0x04,0x0b,0x02, 0x82,0x04,0x0a,0x02,0x01,0x04,0x0a,0x01,0x82,0x03,0x0a,0x01,0x85,0x03,0x09, 0x01,0x85,0x03,0x08,0x01,0x84,0x02,0x07,0x01,0x86,0x02,0x06,0x01,0x83,0x02, 0x05,0x00,0x82,0x01,0x05,0x00,0x85,0x01,0x04,0x00,0x85,0x01,0x03,0x00,0x86, 0x00,0x02,0x00,0x85,0x00,0x01,0x00,0xdf,0x00,0x00,0x00,0x82,0x36,0x6c,0x13, 0x01,0x37,0x6d,0x13,0x82,0x36,0x6c,0x13,0x82,0x37,0x6d,0x13,0x01,0x36,0x6c, 0x12,0x86,0x36,0x6c,0x13,0x09,0x36,0x6d,0x14,0x36,0x6d,0x13,0x36,0x6c,0x14, 0x36,0x6c,0x13,0x35,0x6b,0x13,0x36,0x6c,0x13,0x36,0x6c,0x14,0x36,0x6c,0x12, 0x36,0x6c,0x14,0x83,0x35,0x6b,0x13,0x82,0x36,0x6c,0x13,0x82,0x35,0x6b,0x13, 0x82,0x35,0x6c,0x13,0x01,0x35,0x6b,0x12,0x82,0x35,0x6c,0x13,0x02,0x34,0x6a, 0x12,0x35,0x6b,0x12,0x82,0x34,0x6b,0x12,0x02,0x35,0x6b,0x13,0x35,0x6b,0x12, 0x83,0x34,0x6a,0x13,0x82,0x35,0x6b,0x13,0x08,0x34,0x6a,0x12,0x35,0x6b,0x13, 0x36,0x6a,0x13,0x35,0x6b,0x13,0x34,0x6a,0x14,0x35,0x6a,0x14,0x35,0x6a,0x15, 0x34,0x6a,0x14,0x83,0x35,0x6a,0x14,0x04,0x34,0x6a,0x14,0x34,0x69,0x14,0x34, 0x6a,0x14,0x35,0x6a,0x15,0x82,0x34,0x6a,0x14,0x01,0x35,0x69,0x14,0x83,0x34, 0x69,0x16,0x85,0x35,0x69,0x16,0x0e,0x35,0x68,0x17,0x35,0x69,0x17,0x35,0x68, 0x17,0x34,0x68,0x16,0x35,0x68,0x17,0x33,0x68,0x17,0x34,0x68,0x17,0x35,0x68, 0x17,0x34,0x68,0x17,0x34,0x67,0x17,0x35,0x68,0x18,0x35,0x69,0x18,0x35,0x68, 0x18,0x35,0x68,0x19,0x82,0x34,0x67,0x17,0x02,0x34,0x67,0x18,0x33,0x66,0x17, 0x82,0x34,0x67,0x19,0x82,0x35,0x68,0x19,0x82,0x34,0x67,0x18,0x05,0x33,0x66, 0x18,0x34,0x67,0x19,0x33,0x66,0x18,0x33,0x66,0x19,0x34,0x67,0x1a,0x82,0x33, 0x66,0x19,0x06,0x34,0x66,0x19,0x34,0x67,0x19,0x33,0x65,0x19,0x32,0x65,0x18, 0x33,0x65,0x18,0x34,0x66,0x19,0x82,0x33,0x65,0x18,0x83,0x32,0x64,0x18,0x01, 0x32,0x65,0x18,0x82,0x31,0x64,0x17,0x82,0x32,0x64,0x18,0x04,0x31,0x63,0x17, 0x31,0x63,0x18,0x31,0x62,0x17,0x31,0x62,0x18,0x83,0x30,0x62,0x18,0x01,0x30, 0x61,0x17,0x86,0x2f,0x61,0x17,0x07,0x2f,0x60,0x17,0x2e,0x5f,0x16,0x2d,0x5f, 0x16,0x2e,0x5f,0x15,0x2d,0x5f,0x15,0x2e,0x5f,0x15,0x2d,0x5f,0x15,0x82,0x2e, 0x5f,0x16,0x0e,0x2d,0x5f,0x16,0x2e,0x5f,0x16,0x2d,0x5e,0x16,0x2b,0x5c,0x15, 0x2a,0x5b,0x14,0x2a,0x5a,0x12,0x26,0x55,0x0f,0x24,0x54,0x0e,0x22,0x52,0x0d, 0x21,0x51,0x0b,0x20,0x4f,0x0c,0x1f,0x4d,0x0b,0x20,0x4e,0x0c,0x21,0x4f,0x0d, 0x85,0x20,0x4f,0x0c,0x82,0x1f,0x4e,0x0b,0x02,0x1e,0x4d,0x0b,0x1f,0x4d,0x0b, 0x82,0x1e,0x4d,0x0a,0x06,0x1e,0x4c,0x0a,0x1e,0x4d,0x0a,0x1e,0x4c,0x0b,0x1d, 0x4b,0x0a,0x1e,0x4c,0x0b,0x1e,0x4c,0x0a,0x82,0x1d,0x4b,0x09,0x83,0x1d,0x4b, 0x0a,0x01,0x1c,0x4a,0x09,0x83,0x1b,0x49,0x08,0x01,0x1c,0x4a,0x0a,0x82,0x1b, 0x49,0x09,0x83,0x1a,0x48,0x08,0x08,0x19,0x47,0x07,0x1a,0x48,0x08,0x18,0x46, 0x06,0x19,0x47,0x07,0x19,0x46,0x08,0x18,0x46,0x07,0x19,0x46,0x08,0x19,0x47, 0x08,0x82,0x18,0x46,0x07,0x03,0x19,0x46,0x08,0x18,0x46,0x07,0x18,0x46,0x06, 0x82,0x18,0x46,0x07,0x82,0x17,0x45,0x07,0x03,0x17,0x45,0x06,0x17,0x44,0x06, 0x17,0x45,0x06,0x82,0x17,0x44,0x06,0x83,0x16,0x43,0x06,0x83,0x16,0x43,0x05, 0x01,0x16,0x42,0x05,0x84,0x16,0x43,0x06,0x03,0x16,0x42,0x05,0x15,0x42,0x05, 0x15,0x42,0x06,0x84,0x16,0x42,0x06,0x83,0x16,0x42,0x05,0x02,0x15,0x41,0x04, 0x16,0x42,0x06,0x83,0x15,0x41,0x05,0x04,0x15,0x41,0x04,0x16,0x42,0x05,0x15, 0x41,0x05,0x14,0x41,0x04,0x83,0x15,0x42,0x04,0x02,0x14,0x42,0x04,0x15,0x41, 0x05,0x82,0x15,0x42,0x06,0x02,0x14,0x42,0x05,0x15,0x42,0x05,0x83,0x15,0x42, 0x04,0x01,0x15,0x41,0x05,0x82,0x15,0x42,0x06,0x82,0x15,0x42,0x05,0x02,0x15, 0x43,0x05,0x15,0x41,0x04,0x83,0x15,0x42,0x04,0x0a,0x14,0x42,0x04,0x15,0x42, 0x04,0x15,0x42,0x03,0x15,0x42,0x04,0x15,0x42,0x05,0x15,0x43,0x05,0x15,0x43, 0x04,0x15,0x43,0x03,0x15,0x43,0x04,0x16,0x43,0x05,0x83,0x15,0x43,0x05,0x02, 0x15,0x43,0x04,0x15,0x43,0x03,0x82,0x15,0x43,0x04,0x08,0x14,0x43,0x03,0x15, 0x43,0x04,0x15,0x45,0x04,0x15,0x43,0x04,0x16,0x43,0x04,0x15,0x43,0x04,0x14, 0x45,0x04,0x15,0x45,0x05,0x82,0x16,0x44,0x04,0x01,0x15,0x43,0x03,0x83,0x15, 0x42,0x04,0x82,0x15,0x43,0x04,0x03,0x14,0x42,0x04,0x15,0x43,0x04,0x15,0x43, 0x05,0x82,0x14,0x42,0x04,0x01,0x15,0x42,0x04,0x83,0x14,0x41,0x03,0x03,0x13, 0x3f,0x04,0x14,0x40,0x04,0x13,0x3f,0x03,0x82,0x13,0x3e,0x03,0x06,0x12,0x3e, 0x04,0x12,0x3d,0x04,0x12,0x3d,0x05,0x12,0x3c,0x03,0x11,0x3b,0x04,0x12,0x3c, 0x04,0x82,0x11,0x3c,0x04,0x82,0x12,0x3b,0x04,0x04,0x11,0x3b,0x04,0x12,0x3b, 0x03,0x11,0x3a,0x03,0x11,0x3a,0x04,0x82,0x10,0x39,0x03,0x03,0x11,0x3a,0x04, 0x10,0x39,0x03,0x10,0x38,0x04,0x85,0x10,0x38,0x03,0x82,0x10,0x37,0x03,0x01, 0x0f,0x37,0x03,0x83,0x0f,0x37,0x04,0x09,0x0f,0x36,0x03,0x0f,0x35,0x03,0x10, 0x35,0x03,0x0f,0x36,0x03,0x0e,0x35,0x03,0x10,0x35,0x03,0x0f,0x34,0x03,0x0f, 0x35,0x03,0x0f,0x34,0x03,0x83,0x0e,0x34,0x03,0x82,0x0f,0x33,0x03,0x01,0x0e, 0x34,0x03,0x84,0x0f,0x33,0x03,0x01,0x0e,0x32,0x03,0x83,0x0e,0x32,0x02,0x01, 0x0d,0x31,0x03,0x82,0x0d,0x31,0x02,0x04,0x0e,0x31,0x02,0x0e,0x31,0x03,0x0d, 0x30,0x03,0x0d,0x30,0x02,0x82,0x0d,0x2f,0x02,0x01,0x0d,0x2f,0x03,0x83,0x0d, 0x2f,0x02,0x02,0x0d,0x2f,0x03,0x0c,0x2f,0x02,0x84,0x0c,0x2e,0x02,0x05,0x0c, 0x2d,0x02,0x0d,0x2e,0x03,0x0c,0x2d,0x02,0x0c,0x2d,0x01,0x0c,0x2d,0x02,0x85, 0x0c,0x2c,0x02,0x03,0x0d,0x2c,0x03,0x0c,0x2c,0x02,0x0c,0x2c,0x01,0x83,0x0b, 0x2b,0x01,0x01,0x0b,0x2b,0x02,0x82,0x0c,0x2b,0x02,0x01,0x0b,0x2a,0x01,0x82, 0x0b,0x2a,0x02,0x02,0x0b,0x29,0x01,0x0b,0x2a,0x02,0x83,0x0b,0x2a,0x01,0x02, 0x0a,0x2a,0x01,0x0c,0x2a,0x02,0x82,0x0b,0x29,0x02,0x06,0x0b,0x28,0x01,0x0b, 0x28,0x02,0x0a,0x28,0x01,0x0a,0x29,0x02,0x0b,0x28,0x02,0x0a,0x27,0x01,0x82, 0x0a,0x27,0x02,0x82,0x0a,0x27,0x01,0x82,0x0a,0x27,0x02,0x05,0x0a,0x26,0x01, 0x0a,0x26,0x02,0x0a,0x27,0x02,0x0a,0x26,0x01,0x09,0x26,0x01,0x82,0x0a,0x25, 0x02,0x01,0x0a,0x25,0x01,0x82,0x0a,0x25,0x02,0x82,0x09,0x25,0x01,0x82,0x09, 0x25,0x02,0x01,0x09,0x24,0x01,0x84,0x09,0x24,0x02,0x01,0x09,0x23,0x01,0x82, 0x09,0x24,0x02,0x82,0x09,0x23,0x01,0x84,0x09,0x22,0x01,0x05,0x08,0x22,0x01, 0x09,0x22,0x02,0x09,0x23,0x02,0x09,0x22,0x01,0x09,0x22,0x02,0x84,0x09,0x21, 0x01,0x02,0x08,0x20,0x01,0x08,0x21,0x01,0x87,0x08,0x20,0x01,0x84,0x08,0x1f, 0x01,0x04,0x07,0x1f,0x01,0x08,0x1f,0x01,0x07,0x1e,0x01,0x08,0x1e,0x01,0x83, 0x07,0x1e,0x01,0x87,0x07,0x1d,0x01,0x85,0x07,0x1c,0x01,0x02,0x06,0x1b,0x01, 0x07,0x1c,0x01,0x82,0x06,0x1b,0x00,0x82,0x07,0x1b,0x01,0x03,0x06,0x1b,0x00, 0x07,0x1b,0x01,0x06,0x1b,0x00,0x85,0x06,0x1a,0x00,0x82,0x06,0x19,0x00,0x01, 0x05,0x19,0x00,0x86,0x06,0x19,0x00,0x04,0x05,0x19,0x00,0x05,0x18,0x00,0x06, 0x19,0x00,0x06,0x18,0x00,0x84,0x05,0x18,0x00,0x02,0x05,0x17,0x00,0x04,0x17, 0x00,0x88,0x05,0x17,0x00,0x03,0x04,0x16,0x00,0x05,0x17,0x00,0x05,0x16,0x00, 0x83,0x04,0x16,0x00,0x86,0x04,0x15,0x00,0x01,0x05,0x15,0x00,0x83,0x04,0x15, 0x00,0x82,0x05,0x15,0x00,0x01,0x04,0x15,0x00,0x84,0x05,0x15,0x00,0x82,0x05, 0x14,0x00,0x82,0x05,0x15,0x00,0x84,0x05,0x14,0x00,0x01,0x05,0x14,0x01,0x85, 0x05,0x14,0x00,0x82,0x05,0x14,0x01,0x83,0x05,0x13,0x01,0x06,0x05,0x14,0x01, 0x06,0x15,0x01,0x07,0x16,0x01,0x07,0x17,0x01,0x08,0x17,0x02,0x08,0x17,0x03, 0x83,0x09,0x17,0x04,0x01,0x08,0x16,0x04,0x82,0x09,0x16,0x04,0x05,0x08,0x15, 0x04,0x09,0x15,0x04,0x08,0x15,0x04,0x09,0x16,0x04,0x09,0x15,0x04,0x82,0x08, 0x15,0x04,0x82,0x08,0x14,0x04,0x82,0x07,0x13,0x03,0x82,0x07,0x13,0x04,0x01, 0x07,0x13,0x03,0x87,0x07,0x12,0x03,0x86,0x07,0x11,0x03,0x02,0x06,0x10,0x03, 0x07,0x10,0x03,0x83,0x06,0x10,0x03,0x86,0x06,0x0f,0x03,0x01,0x06,0x0e,0x03, 0x83,0x05,0x0e,0x03,0x85,0x05,0x0d,0x03,0x84,0x05,0x0c,0x02,0x01,0x04,0x0c, 0x02,0x84,0x04,0x0b,0x02,0x85,0x04,0x0a,0x02,0x82,0x04,0x09,0x02,0x82,0x03, 0x09,0x02,0x01,0x03,0x09,0x01,0x82,0x03,0x08,0x02,0x83,0x03,0x08,0x01,0x85, 0x03,0x07,0x01,0x86,0x02,0x06,0x01,0x84,0x02,0x05,0x01,0x83,0x02,0x04,0x01, 0x83,0x01,0x04,0x00,0x85,0x01,0x03,0x00,0x83,0x01,0x02,0x00,0x82,0x00,0x02, 0x00,0x85,0x00,0x01,0x00,0xdd,0x00,0x00,0x00,0x83,0x38,0x6e,0x13,0x83,0x37, 0x6e,0x13,0x02,0x38,0x6e,0x13,0x37,0x6e,0x13,0x83,0x38,0x6e,0x13,0x01,0x37, 0x6e,0x13,0x82,0x38,0x6e,0x14,0x03,0x37,0x6e,0x13,0x37,0x6f,0x13,0x37,0x6d, 0x12,0x82,0x37,0x6d,0x13,0x0a,0x37,0x6e,0x14,0x38,0x6e,0x13,0x37,0x6e,0x13, 0x37,0x6e,0x14,0x36,0x6d,0x13,0x37,0x6e,0x14,0x37,0x6d,0x13,0x37,0x6d,0x12, 0x37,0x6e,0x13,0x37,0x6d,0x12,0x82,0x37,0x6d,0x13,0x03,0x36,0x6d,0x13,0x36, 0x6e,0x13,0x37,0x6d,0x13,0x84,0x36,0x6d,0x13,0x05,0x37,0x6d,0x13,0x36,0x6e, 0x13,0x36,0x6c,0x12,0x36,0x6d,0x13,0x37,0x6d,0x14,0x82,0x36,0x6c,0x13,0x06, 0x36,0x6d,0x14,0x37,0x6c,0x14,0x37,0x6d,0x14,0x36,0x6c,0x12,0x36,0x6c,0x13, 0x36,0x6c,0x14,0x85,0x36,0x6c,0x15,0x01,0x37,0x6d,0x15,0x86,0x36,0x6c,0x15, 0x01,0x37,0x6b,0x15,0x82,0x36,0x6c,0x16,0x07,0x36,0x6b,0x17,0x36,0x6b,0x16, 0x37,0x6b,0x17,0x37,0x6c,0x17,0x37,0x6b,0x17,0x36,0x6a,0x16,0x36,0x6a,0x17, 0x82,0x37,0x6b,0x18,0x83,0x36,0x6a,0x17,0x82,0x36,0x6a,0x18,0x82,0x36,0x6a, 0x17,0x07,0x36,0x69,0x19,0x36,0x6a,0x18,0x35,0x69,0x17,0x35,0x69,0x18,0x35, 0x68,0x17,0x36,0x69,0x19,0x36,0x69,0x18,0x82,0x34,0x68,0x18,0x05,0x35,0x68, 0x19,0x35,0x69,0x19,0x35,0x68,0x19,0x35,0x69,0x19,0x35,0x68,0x1a,0x82,0x35, 0x69,0x1a,0x06,0x34,0x68,0x19,0x35,0x68,0x1a,0x35,0x69,0x1a,0x35,0x68,0x1a, 0x34,0x68,0x19,0x35,0x67,0x19,0x83,0x34,0x68,0x19,0x05,0x34,0x67,0x19,0x35, 0x67,0x19,0x34,0x66,0x19,0x34,0x67,0x19,0x35,0x67,0x1a,0x83,0x33,0x66,0x19, 0x03,0x34,0x67,0x19,0x33,0x66,0x19,0x33,0x65,0x17,0x82,0x33,0x66,0x18,0x01, 0x32,0x64,0x18,0x82,0x33,0x65,0x19,0x82,0x32,0x65,0x17,0x82,0x32,0x64,0x16, 0x03,0x31,0x64,0x16,0x31,0x63,0x17,0x32,0x64,0x17,0x83,0x31,0x63,0x17,0x03, 0x30,0x62,0x16,0x2f,0x61,0x15,0x2f,0x61,0x16,0x83,0x2f,0x61,0x17,0x02,0x2e, 0x60,0x16,0x2f,0x61,0x17,0x83,0x2e,0x60,0x16,0x01,0x2e,0x60,0x15,0x82,0x2f, 0x61,0x16,0x0a,0x2e,0x60,0x15,0x2e,0x5f,0x15,0x2f,0x5f,0x17,0x2d,0x5e,0x15, 0x2c,0x5d,0x14,0x2a,0x5a,0x13,0x27,0x57,0x10,0x26,0x56,0x0f,0x24,0x54,0x0f, 0x22,0x52,0x0c,0x82,0x20,0x50,0x0c,0x85,0x1f,0x4f,0x0b,0x02,0x1f,0x4e,0x0b, 0x1e,0x4e,0x0a,0x84,0x1f,0x4e,0x0b,0x01,0x1e,0x4d,0x0b,0x82,0x1e,0x4d,0x0a, 0x0c,0x1d,0x4d,0x09,0x1e,0x4d,0x0a,0x1e,0x4d,0x0b,0x1d,0x4d,0x0a,0x1d,0x4c, 0x0a,0x1e,0x4c,0x09,0x1d,0x4c,0x0a,0x1c,0x4b,0x09,0x1d,0x4b,0x09,0x1c,0x4b, 0x0a,0x1c,0x4a,0x09,0x1b,0x4a,0x09,0x85,0x1b,0x49,0x08,0x01,0x1a,0x48,0x08, 0x82,0x1b,0x49,0x08,0x02,0x1a,0x48,0x08,0x1a,0x48,0x07,0x82,0x19,0x47,0x08, 0x83,0x19,0x46,0x07,0x05,0x18,0x46,0x06,0x19,0x46,0x07,0x18,0x46,0x07,0x17, 0x45,0x07,0x16,0x45,0x06,0x82,0x17,0x45,0x06,0x04,0x18,0x46,0x07,0x17,0x45, 0x06,0x18,0x46,0x07,0x17,0x45,0x06,0x85,0x16,0x44,0x05,0x01,0x15,0x43,0x05, 0x83,0x16,0x44,0x05,0x01,0x16,0x44,0x06,0x82,0x16,0x44,0x05,0x14,0x16,0x43, 0x06,0x15,0x43,0x05,0x15,0x42,0x05,0x15,0x43,0x06,0x15,0x42,0x05,0x16,0x44, 0x06,0x16,0x44,0x05,0x16,0x44,0x06,0x15,0x43,0x06,0x16,0x43,0x06,0x16,0x43, 0x05,0x16,0x43,0x06,0x15,0x42,0x05,0x15,0x42,0x04,0x16,0x43,0x05,0x15,0x43, 0x06,0x16,0x44,0x05,0x14,0x42,0x04,0x15,0x43,0x04,0x16,0x43,0x05,0x82,0x15, 0x42,0x05,0x02,0x14,0x42,0x05,0x15,0x42,0x05,0x83,0x15,0x43,0x04,0x82,0x15, 0x42,0x05,0x82,0x15,0x43,0x06,0x82,0x15,0x42,0x05,0x03,0x14,0x43,0x04,0x15, 0x43,0x04,0x14,0x42,0x03,0x82,0x15,0x42,0x04,0x05,0x14,0x43,0x04,0x15,0x43, 0x05,0x15,0x44,0x05,0x15,0x44,0x04,0x15,0x44,0x05,0x82,0x15,0x43,0x04,0x01, 0x16,0x44,0x05,0x83,0x15,0x44,0x05,0x0e,0x14,0x45,0x05,0x15,0x44,0x05,0x16, 0x44,0x05,0x15,0x44,0x05,0x15,0x44,0x03,0x15,0x44,0x04,0x16,0x45,0x04,0x15, 0x45,0x04,0x16,0x44,0x04,0x16,0x45,0x04,0x15,0x45,0x04,0x16,0x45,0x04,0x16, 0x44,0x05,0x15,0x44,0x04,0x82,0x16,0x45,0x04,0x82,0x15,0x44,0x04,0x05,0x15, 0x44,0x05,0x15,0x44,0x04,0x15,0x44,0x05,0x15,0x44,0x04,0x15,0x44,0x05,0x82, 0x15,0x43,0x04,0x82,0x14,0x43,0x04,0x02,0x15,0x43,0x04,0x14,0x42,0x04,0x82, 0x14,0x42,0x03,0x0b,0x13,0x41,0x03,0x13,0x40,0x04,0x14,0x41,0x04,0x13,0x40, 0x03,0x13,0x3f,0x03,0x14,0x40,0x04,0x13,0x3f,0x03,0x13,0x3e,0x04,0x12,0x3d, 0x04,0x12,0x3e,0x04,0x12,0x3d,0x03,0x82,0x12,0x3e,0x05,0x01,0x11,0x3d,0x04, 0x82,0x11,0x3c,0x04,0x02,0x11,0x3b,0x03,0x12,0x3c,0x03,0x84,0x11,0x3b,0x04, 0x82,0x10,0x3a,0x03,0x01,0x0f,0x39,0x03,0x82,0x10,0x3a,0x03,0x83,0x10,0x39, 0x03,0x04,0x10,0x38,0x03,0x0f,0x38,0x02,0x10,0x38,0x03,0x10,0x37,0x02,0x84, 0x10,0x37,0x03,0x82,0x10,0x36,0x03,0x83,0x0f,0x36,0x03,0x02,0x10,0x36,0x03, 0x0f,0x35,0x03,0x82,0x0e,0x36,0x03,0x0a,0x0e,0x35,0x03,0x0f,0x35,0x03,0x0e, 0x35,0x03,0x0e,0x33,0x02,0x0f,0x34,0x03,0x0e,0x33,0x02,0x0f,0x34,0x03,0x0e, 0x34,0x03,0x0e,0x33,0x03,0x0e,0x34,0x03,0x82,0x0e,0x33,0x02,0x83,0x0d,0x32, 0x02,0x82,0x0d,0x32,0x03,0x06,0x0c,0x31,0x02,0x0e,0x30,0x02,0x0d,0x30,0x03, 0x0c,0x30,0x03,0x0c,0x30,0x02,0x0c,0x2f,0x01,0x82,0x0d,0x2f,0x02,0x01,0x0c, 0x2f,0x02,0x83,0x0d,0x2f,0x02,0x01,0x0c,0x2f,0x02,0x82,0x0c,0x2e,0x02,0x03, 0x0c,0x2f,0x03,0x0b,0x2e,0x02,0x0b,0x2d,0x01,0x83,0x0c,0x2d,0x02,0x01,0x0c, 0x2c,0x02,0x82,0x0c,0x2d,0x02,0x82,0x0c,0x2c,0x02,0x03,0x0c,0x2d,0x01,0x0c, 0x2d,0x02,0x0c,0x2c,0x01,0x83,0x0b,0x2b,0x02,0x05,0x0b,0x2b,0x01,0x0a,0x2b, 0x02,0x0b,0x2b,0x02,0x0c,0x2b,0x02,0x0b,0x2b,0x02,0x82,0x0c,0x2b,0x02,0x03, 0x0b,0x2b,0x01,0x0b,0x2a,0x01,0x0b,0x2a,0x02,0x82,0x0b,0x29,0x02,0x02,0x0c, 0x2b,0x02,0x0b,0x2a,0x02,0x83,0x0b,0x29,0x02,0x02,0x0a,0x28,0x02,0x0a,0x28, 0x01,0x82,0x0a,0x28,0x02,0x01,0x0a,0x28,0x01,0x82,0x0b,0x28,0x02,0x82,0x0a, 0x27,0x02,0x01,0x0a,0x27,0x01,0x82,0x0a,0x27,0x02,0x03,0x0a,0x26,0x01,0x0a, 0x27,0x02,0x0a,0x26,0x01,0x82,0x0a,0x26,0x02,0x03,0x0a,0x25,0x01,0x09,0x25, 0x01,0x0a,0x25,0x01,0x84,0x09,0x25,0x01,0x82,0x09,0x24,0x01,0x01,0x09,0x24, 0x02,0x82,0x09,0x24,0x01,0x03,0x09,0x24,0x02,0x09,0x24,0x01,0x08,0x23,0x00, 0x84,0x09,0x23,0x01,0x01,0x08,0x22,0x01,0x83,0x09,0x23,0x02,0x83,0x09,0x22, 0x01,0x82,0x09,0x21,0x01,0x82,0x08,0x21,0x01,0x03,0x08,0x21,0x02,0x08,0x20, 0x01,0x08,0x21,0x01,0x86,0x08,0x20,0x01,0x83,0x08,0x1f,0x01,0x82,0x07,0x1f, 0x01,0x03,0x08,0x1f,0x01,0x07,0x1e,0x01,0x08,0x1f,0x01,0x83,0x07,0x1e,0x01, 0x01,0x08,0x1e,0x01,0x84,0x07,0x1e,0x01,0x01,0x06,0x1c,0x01,0x82,0x07,0x1d, 0x01,0x03,0x07,0x1c,0x01,0x07,0x1c,0x00,0x06,0x1c,0x00,0x82,0x06,0x1c,0x01, 0x02,0x06,0x1c,0x00,0x07,0x1c,0x01,0x82,0x06,0x1c,0x01,0x84,0x06,0x1b,0x00, 0x84,0x06,0x1a,0x00,0x01,0x06,0x19,0x00,0x82,0x05,0x1a,0x00,0x82,0x06,0x1a, 0x00,0x03,0x06,0x19,0x00,0x06,0x1a,0x00,0x05,0x19,0x00,0x82,0x06,0x19,0x00, 0x03,0x05,0x19,0x00,0x06,0x19,0x01,0x05,0x19,0x00,0x82,0x05,0x18,0x00,0x02, 0x05,0x17,0x00,0x05,0x18,0x00,0x88,0x05,0x17,0x00,0x01,0x05,0x16,0x00,0x82, 0x04,0x16,0x00,0x01,0x04,0x15,0x00,0x83,0x04,0x16,0x00,0x82,0x05,0x15,0x00, 0x86,0x04,0x15,0x00,0x01,0x04,0x14,0x00,0x82,0x04,0x15,0x00,0x82,0x05,0x15, 0x00,0x82,0x04,0x15,0x00,0x01,0x05,0x15,0x00,0x83,0x05,0x14,0x00,0x01,0x05, 0x15,0x00,0x82,0x05,0x14,0x00,0x02,0x04,0x14,0x00,0x05,0x14,0x01,0x82,0x04, 0x14,0x00,0x82,0x05,0x14,0x00,0x01,0x05,0x13,0x00,0x82,0x05,0x13,0x01,0x82, 0x05,0x13,0x00,0x04,0x05,0x14,0x00,0x04,0x13,0x00,0x05,0x13,0x01,0x05,0x12, 0x00,0x82,0x05,0x13,0x01,0x05,0x05,0x14,0x01,0x06,0x15,0x01,0x06,0x16,0x01, 0x07,0x16,0x02,0x07,0x16,0x03,0x83,0x09,0x16,0x04,0x03,0x08,0x16,0x04,0x09, 0x16,0x04,0x08,0x16,0x04,0x86,0x08,0x15,0x04,0x84,0x08,0x14,0x04,0x82,0x07, 0x13,0x03,0x87,0x07,0x12,0x03,0x84,0x07,0x11,0x03,0x82,0x06,0x11,0x03,0x02, 0x06,0x10,0x03,0x07,0x10,0x03,0x84,0x06,0x10,0x03,0x85,0x06,0x0f,0x03,0x84, 0x06,0x0e,0x03,0x83,0x05,0x0d,0x03,0x02,0x05,0x0d,0x02,0x05,0x0d,0x03,0x84, 0x05,0x0c,0x02,0x02,0x04,0x0c,0x02,0x05,0x0b,0x02,0x83,0x04,0x0b,0x02,0x85, 0x04,0x0a,0x02,0x82,0x04,0x09,0x02,0x82,0x03,0x09,0x02,0x01,0x03,0x09,0x01, 0x82,0x03,0x08,0x02,0x83,0x03,0x08,0x01,0x85,0x03,0x07,0x01,0x85,0x02,0x06, 0x01,0x85,0x02,0x05,0x01,0x83,0x02,0x04,0x01,0x83,0x01,0x04,0x00,0x85,0x01, 0x03,0x00,0x83,0x01,0x02,0x00,0x82,0x00,0x02,0x00,0x85,0x00,0x01,0x00,0xdd, 0x00,0x00,0x00,0x03,0x39,0x70,0x14,0x38,0x6f,0x13,0x39,0x71,0x15,0x82,0x38, 0x6f,0x13,0x03,0x39,0x70,0x14,0x38,0x6f,0x13,0x39,0x70,0x14,0x83,0x38,0x70, 0x14,0x01,0x38,0x6f,0x13,0x82,0x38,0x70,0x15,0x01,0x38,0x6f,0x13,0x82,0x38, 0x70,0x14,0x02,0x39,0x70,0x14,0x38,0x6f,0x13,0x82,0x38,0x70,0x14,0x02,0x38, 0x6f,0x13,0x38,0x6f,0x14,0x83,0x37,0x6f,0x14,0x83,0x38,0x6f,0x13,0x82,0x37, 0x6f,0x14,0x02,0x38,0x6f,0x14,0x37,0x6f,0x13,0x84,0x37,0x6f,0x14,0x01,0x37, 0x6e,0x13,0x83,0x37,0x6f,0x14,0x03,0x36,0x6f,0x13,0x36,0x6e,0x14,0x38,0x6e, 0x14,0x82,0x37,0x6e,0x14,0x02,0x37,0x6d,0x14,0x37,0x6e,0x13,0x83,0x37,0x6e, 0x14,0x82,0x37,0x6e,0x16,0x84,0x37,0x6e,0x15,0x83,0x36,0x6d,0x15,0x09,0x37, 0x6e,0x15,0x37,0x6e,0x16,0x36,0x6d,0x15,0x37,0x6d,0x15,0x37,0x6e,0x16,0x37, 0x6e,0x17,0x37,0x6d,0x18,0x37,0x6d,0x17,0x37,0x6c,0x17,0x82,0x38,0x6d,0x18, 0x03,0x36,0x6c,0x18,0x36,0x6d,0x17,0x37,0x6d,0x17,0x84,0x37,0x6c,0x18,0x01, 0x37,0x6c,0x19,0x82,0x37,0x6c,0x18,0x01,0x38,0x6d,0x19,0x83,0x37,0x6c,0x18, 0x01,0x37,0x6b,0x19,0x82,0x36,0x6b,0x19,0x04,0x37,0x6b,0x19,0x36,0x6b,0x19, 0x37,0x6b,0x1a,0x36,0x6b,0x1a,0x82,0x36,0x6a,0x19,0x04,0x36,0x6b,0x1a,0x36, 0x69,0x1a,0x36,0x6a,0x19,0x35,0x69,0x1a,0x82,0x36,0x69,0x1a,0x07,0x35,0x69, 0x1a,0x36,0x6a,0x1a,0x36,0x69,0x1a,0x35,0x68,0x19,0x35,0x69,0x1a,0x36,0x6a, 0x1a,0x35,0x69,0x19,0x82,0x35,0x68,0x19,0x01,0x35,0x68,0x1a,0x82,0x36,0x69, 0x1a,0x82,0x35,0x68,0x1a,0x03,0x34,0x67,0x19,0x34,0x68,0x19,0x34,0x67,0x18, 0x82,0x34,0x67,0x19,0x02,0x34,0x68,0x18,0x34,0x66,0x19,0x82,0x33,0x66,0x19, 0x09,0x34,0x66,0x19,0x35,0x67,0x1a,0x33,0x66,0x18,0x32,0x65,0x18,0x32,0x66, 0x18,0x33,0x66,0x19,0x32,0x64,0x17,0x32,0x65,0x18,0x32,0x66,0x18,0x82,0x31, 0x64,0x18,0x02,0x32,0x64,0x18,0x31,0x64,0x18,0x83,0x31,0x63,0x17,0x09,0x30, 0x62,0x16,0x30,0x62,0x17,0x30,0x63,0x18,0x30,0x62,0x17,0x2f,0x62,0x17,0x30, 0x62,0x17,0x30,0x62,0x16,0x2f,0x62,0x16,0x2f,0x61,0x15,0x82,0x30,0x61,0x16, 0x12,0x2f,0x61,0x16,0x2f,0x61,0x17,0x2f,0x60,0x16,0x2e,0x61,0x16,0x2f,0x61, 0x17,0x2e,0x60,0x17,0x2c,0x5d,0x14,0x2a,0x5b,0x13,0x29,0x5b,0x12,0x27,0x59, 0x10,0x24,0x54,0x0e,0x23,0x53,0x0d,0x21,0x52,0x0b,0x20,0x50,0x0b,0x1f,0x4f, 0x0a,0x20,0x50,0x0b,0x1f,0x4f,0x0b,0x1f,0x4f,0x0c,0x82,0x20,0x50,0x0b,0x82, 0x1f,0x4f,0x0b,0x82,0x1f,0x4f,0x0a,0x0b,0x1e,0x4e,0x0a,0x1f,0x4e,0x0b,0x1f, 0x4f,0x0a,0x1e,0x4e,0x0a,0x1f,0x4f,0x0a,0x1d,0x4e,0x09,0x1d,0x4d,0x09,0x1d, 0x4d,0x0a,0x1c,0x4c,0x09,0x1c,0x4b,0x09,0x1c,0x4c,0x0a,0x83,0x1c,0x4b,0x08, 0x01,0x1b,0x4a,0x09,0x83,0x1b,0x4a,0x08,0x82,0x1b,0x4a,0x09,0x04,0x1b,0x4a, 0x08,0x19,0x48,0x07,0x1a,0x49,0x07,0x1a,0x48,0x08,0x82,0x19,0x48,0x08,0x09, 0x18,0x48,0x06,0x18,0x48,0x07,0x19,0x47,0x07,0x18,0x48,0x07,0x18,0x47,0x07, 0x17,0x47,0x06,0x18,0x47,0x07,0x18,0x46,0x06,0x17,0x46,0x06,0x82,0x18,0x46, 0x06,0x83,0x17,0x46,0x06,0x84,0x17,0x45,0x06,0x87,0x16,0x45,0x05,0x03,0x16, 0x44,0x05,0x16,0x44,0x06,0x15,0x43,0x05,0x82,0x16,0x44,0x05,0x83,0x16,0x44, 0x06,0x0f,0x17,0x45,0x06,0x16,0x44,0x05,0x15,0x43,0x05,0x16,0x43,0x04,0x16, 0x44,0x05,0x15,0x43,0x05,0x15,0x44,0x04,0x16,0x43,0x05,0x15,0x43,0x04,0x17, 0x43,0x04,0x16,0x43,0x05,0x16,0x44,0x06,0x15,0x43,0x05,0x16,0x43,0x04,0x16, 0x44,0x05,0x82,0x15,0x44,0x04,0x01,0x15,0x43,0x05,0x83,0x16,0x44,0x06,0x82, 0x16,0x43,0x05,0x03,0x15,0x44,0x04,0x16,0x44,0x05,0x15,0x42,0x03,0x82,0x15, 0x44,0x04,0x06,0x16,0x44,0x05,0x15,0x44,0x04,0x16,0x44,0x05,0x15,0x44,0x04, 0x16,0x44,0x05,0x15,0x45,0x04,0x83,0x15,0x45,0x05,0x82,0x16,0x44,0x04,0x04, 0x14,0x45,0x04,0x15,0x45,0x04,0x16,0x45,0x05,0x16,0x46,0x05,0x83,0x16,0x45, 0x04,0x02,0x15,0x47,0x04,0x16,0x45,0x04,0x82,0x16,0x46,0x04,0x05,0x15,0x46, 0x04,0x15,0x45,0x04,0x15,0x44,0x04,0x16,0x46,0x05,0x15,0x46,0x05,0x82,0x16, 0x45,0x05,0x01,0x16,0x46,0x04,0x82,0x16,0x45,0x04,0x07,0x15,0x45,0x04,0x15, 0x44,0x04,0x15,0x43,0x05,0x15,0x44,0x04,0x15,0x45,0x05,0x16,0x44,0x05,0x15, 0x44,0x04,0x83,0x15,0x43,0x04,0x01,0x13,0x43,0x03,0x82,0x14,0x41,0x04,0x01, 0x14,0x41,0x03,0x83,0x14,0x40,0x03,0x02,0x14,0x3f,0x04,0x12,0x3e,0x03,0x82, 0x12,0x3f,0x04,0x04,0x12,0x3e,0x03,0x12,0x3f,0x04,0x12,0x3e,0x03,0x12,0x3d, 0x03,0x82,0x12,0x3d,0x04,0x0a,0x12,0x3c,0x03,0x12,0x3c,0x04,0x11,0x3c,0x04, 0x12,0x3c,0x04,0x11,0x3b,0x03,0x11,0x3b,0x02,0x11,0x3b,0x04,0x11,0x3b,0x05, 0x10,0x3b,0x03,0x11,0x3b,0x04,0x83,0x11,0x3a,0x03,0x01,0x11,0x39,0x03,0x82, 0x10,0x38,0x03,0x04,0x0f,0x38,0x02,0x0f,0x38,0x03,0x10,0x37,0x03,0x11,0x38, 0x04,0x82,0x11,0x37,0x04,0x05,0x10,0x37,0x03,0x0f,0x37,0x04,0x0f,0x37,0x02, 0x0f,0x37,0x03,0x0f,0x37,0x02,0x82,0x0e,0x36,0x03,0x03,0x0e,0x36,0x02,0x0e, 0x36,0x03,0x10,0x35,0x03,0x82,0x0e,0x34,0x02,0x01,0x0e,0x35,0x03,0x82,0x0f, 0x34,0x03,0x03,0x0d,0x34,0x02,0x0e,0x33,0x02,0x0e,0x34,0x03,0x82,0x0d,0x33, 0x02,0x83,0x0e,0x33,0x02,0x01,0x0d,0x32,0x02,0x82,0x0c,0x32,0x02,0x01,0x0d, 0x32,0x02,0x83,0x0d,0x31,0x02,0x02,0x0c,0x31,0x02,0x0c,0x30,0x02,0x82,0x0d, 0x30,0x02,0x84,0x0c,0x30,0x02,0x07,0x0d,0x30,0x02,0x0b,0x2f,0x01,0x0c,0x30, 0x03,0x0c,0x2f,0x03,0x0d,0x30,0x02,0x0c,0x2f,0x02,0x0c,0x2f,0x03,0x82,0x0c, 0x2e,0x02,0x82,0x0b,0x2e,0x01,0x02,0x0d,0x2f,0x02,0x0c,0x2e,0x01,0x83,0x0c, 0x2e,0x02,0x04,0x0b,0x2c,0x01,0x0b,0x2c,0x02,0x0c,0x2c,0x02,0x0b,0x2b,0x02, 0x82,0x0c,0x2c,0x02,0x82,0x0b,0x2b,0x02,0x82,0x0c,0x2c,0x02,0x05,0x0b,0x2b, 0x01,0x0c,0x2b,0x01,0x0c,0x2a,0x02,0x0a,0x29,0x01,0x0b,0x29,0x01,0x82,0x0b, 0x2b,0x02,0x84,0x0b,0x29,0x02,0x03,0x0a,0x28,0x02,0x0a,0x29,0x02,0x0b,0x29, 0x02,0x82,0x0a,0x28,0x02,0x02,0x0a,0x28,0x01,0x0a,0x28,0x02,0x82,0x0b,0x28, 0x02,0x02,0x0a,0x28,0x02,0x09,0x27,0x02,0x82,0x0a,0x27,0x01,0x03,0x0a,0x26, 0x01,0x0a,0x26,0x02,0x0a,0x27,0x02,0x84,0x0a,0x26,0x01,0x02,0x09,0x25,0x01, 0x0a,0x25,0x02,0x82,0x09,0x25,0x01,0x01,0x08,0x24,0x01,0x82,0x09,0x25,0x02, 0x01,0x09,0x24,0x01,0x82,0x09,0x25,0x02,0x82,0x09,0x24,0x01,0x01,0x09,0x24, 0x02,0x82,0x09,0x23,0x01,0x03,0x08,0x23,0x01,0x09,0x23,0x02,0x08,0x23,0x01, 0x83,0x09,0x23,0x02,0x83,0x09,0x22,0x01,0x82,0x08,0x22,0x01,0x01,0x08,0x22, 0x02,0x82,0x08,0x21,0x01,0x02,0x09,0x21,0x02,0x08,0x21,0x01,0x82,0x08,0x20, 0x01,0x06,0x08,0x20,0x00,0x08,0x21,0x01,0x08,0x20,0x01,0x07,0x1f,0x01,0x08, 0x20,0x01,0x08,0x1f,0x01,0x82,0x07,0x1f,0x01,0x01,0x08,0x1f,0x01,0x82,0x07, 0x1f,0x01,0x83,0x07,0x1e,0x01,0x84,0x07,0x1d,0x01,0x03,0x07,0x1d,0x00,0x07, 0x1d,0x01,0x06,0x1d,0x01,0x85,0x07,0x1c,0x01,0x02,0x06,0x1b,0x01,0x06,0x1b, 0x00,0x82,0x06,0x1c,0x01,0x84,0x06,0x1b,0x00,0x88,0x06,0x1a,0x00,0x05,0x05, 0x19,0x00,0x06,0x1a,0x01,0x06,0x19,0x00,0x05,0x19,0x00,0x06,0x19,0x00,0x84, 0x05,0x19,0x00,0x02,0x05,0x18,0x00,0x05,0x18,0x01,0x85,0x05,0x18,0x00,0x83, 0x05,0x17,0x00,0x82,0x05,0x18,0x00,0x83,0x05,0x17,0x00,0x82,0x05,0x16,0x00, 0x86,0x04,0x16,0x00,0x8b,0x04,0x15,0x00,0x83,0x05,0x15,0x00,0x83,0x04,0x15, 0x00,0x01,0x05,0x15,0x00,0x82,0x05,0x14,0x00,0x82,0x04,0x14,0x00,0x01,0x05, 0x14,0x01,0x82,0x04,0x14,0x00,0x84,0x05,0x14,0x00,0x01,0x05,0x14,0x01,0x82, 0x05,0x13,0x00,0x82,0x05,0x13,0x01,0x82,0x04,0x13,0x00,0x05,0x05,0x13,0x01, 0x05,0x13,0x00,0x05,0x15,0x01,0x06,0x15,0x01,0x06,0x16,0x01,0x82,0x07,0x17, 0x02,0x04,0x08,0x16,0x04,0x09,0x17,0x05,0x08,0x16,0x04,0x09,0x16,0x04,0x84, 0x08,0x16,0x04,0x01,0x08,0x15,0x04,0x82,0x08,0x15,0x03,0x83,0x08,0x14,0x04, 0x02,0x08,0x14,0x03,0x08,0x14,0x04,0x83,0x07,0x13,0x03,0x01,0x07,0x12,0x03, 0x82,0x06,0x12,0x03,0x03,0x07,0x12,0x03,0x06,0x12,0x03,0x07,0x11,0x03,0x87, 0x06,0x11,0x03,0x84,0x06,0x10,0x03,0x03,0x06,0x0f,0x03,0x06,0x10,0x03,0x06, 0x0f,0x03,0x84,0x06,0x0e,0x03,0x01,0x05,0x0e,0x03,0x82,0x05,0x0d,0x03,0x01, 0x05,0x0d,0x02,0x82,0x05,0x0d,0x03,0x83,0x05,0x0c,0x02,0x02,0x04,0x0c,0x02, 0x05,0x0b,0x02,0x83,0x04,0x0b,0x02,0x85,0x04,0x0a,0x02,0x83,0x04,0x09,0x02, 0x04,0x03,0x09,0x02,0x03,0x09,0x01,0x03,0x08,0x01,0x03,0x08,0x02,0x84,0x03, 0x08,0x01,0x83,0x03,0x07,0x01,0x01,0x02,0x07,0x01,0x86,0x02,0x06,0x01,0x85, 0x02,0x05,0x01,0x01,0x02,0x04,0x01,0x82,0x01,0x04,0x01,0x82,0x01,0x04,0x00, 0x85,0x01,0x03,0x00,0x83,0x01,0x02,0x00,0x82,0x00,0x02,0x00,0x85,0x00,0x01, 0x00,0xdd,0x00,0x00,0x00,0x06,0x3a,0x72,0x14,0x3a,0x72,0x15,0x39,0x71,0x14, 0x39,0x71,0x13,0x3a,0x72,0x14,0x39,0x71,0x14,0x82,0x39,0x71,0x13,0x01,0x39, 0x71,0x15,0x84,0x39,0x71,0x14,0x02,0x39,0x71,0x13,0x3a,0x72,0x14,0x82,0x39, 0x71,0x14,0x0d,0x3a,0x72,0x14,0x39,0x71,0x13,0x39,0x71,0x14,0x39,0x71,0x13, 0x38,0x70,0x13,0x39,0x71,0x14,0x38,0x70,0x14,0x39,0x71,0x15,0x38,0x70,0x14, 0x37,0x70,0x13,0x38,0x71,0x13,0x39,0x71,0x13,0x39,0x71,0x14,0x82,0x38,0x70, 0x14,0x05,0x38,0x70,0x12,0x38,0x71,0x13,0x38,0x71,0x14,0x38,0x70,0x14,0x39, 0x70,0x14,0x82,0x38,0x70,0x14,0x04,0x37,0x6f,0x13,0x38,0x70,0x14,0x38,0x71, 0x14,0x38,0x70,0x13,0x82,0x38,0x70,0x15,0x05,0x38,0x70,0x13,0x39,0x6f,0x13, 0x39,0x71,0x14,0x38,0x70,0x16,0x38,0x70,0x14,0x83,0x38,0x70,0x15,0x02,0x38, 0x70,0x16,0x38,0x6f,0x15,0x83,0x37,0x6f,0x15,0x0b,0x38,0x6f,0x16,0x39,0x70, 0x17,0x38,0x70,0x16,0x37,0x6f,0x15,0x38,0x6f,0x16,0x38,0x70,0x17,0x38,0x6f, 0x16,0x37,0x6f,0x15,0x39,0x6f,0x17,0x39,0x6f,0x18,0x38,0x6e,0x17,0x82,0x39, 0x6f,0x18,0x04,0x37,0x6e,0x19,0x37,0x6e,0x18,0x38,0x6f,0x18,0x38,0x6d,0x17, 0x83,0x38,0x6d,0x19,0x82,0x38,0x6d,0x18,0x85,0x38,0x6d,0x19,0x07,0x37,0x6c, 0x19,0x38,0x6d,0x1a,0x38,0x6d,0x19,0x37,0x6c,0x19,0x36,0x6b,0x19,0x38,0x6d, 0x1b,0x38,0x6c,0x1b,0x82,0x37,0x6c,0x1a,0x10,0x38,0x6c,0x1b,0x37,0x6c,0x1b, 0x37,0x6c,0x1a,0x37,0x6b,0x1b,0x38,0x6b,0x1b,0x38,0x6b,0x1a,0x37,0x6b,0x1a, 0x38,0x6b,0x1b,0x37,0x6b,0x1b,0x36,0x6a,0x1a,0x36,0x6c,0x1b,0x37,0x6c,0x1b, 0x36,0x6a,0x1a,0x37,0x6b,0x1b,0x36,0x6a,0x1a,0x36,0x6a,0x1b,0x83,0x36,0x6a, 0x1a,0x82,0x36,0x6a,0x1b,0x08,0x35,0x6a,0x1a,0x35,0x68,0x1a,0x36,0x69,0x1b, 0x35,0x69,0x19,0x35,0x6a,0x19,0x36,0x6a,0x1a,0x35,0x69,0x19,0x35,0x68,0x1a, 0x83,0x34,0x68,0x1a,0x05,0x34,0x68,0x1b,0x33,0x67,0x1a,0x34,0x67,0x19,0x33, 0x67,0x19,0x32,0x67,0x18,0x82,0x33,0x68,0x19,0x01,0x33,0x67,0x19,0x82,0x32, 0x67,0x17,0x0d,0x33,0x67,0x19,0x33,0x66,0x18,0x32,0x66,0x18,0x32,0x65,0x17, 0x31,0x65,0x18,0x32,0x66,0x19,0x31,0x65,0x18,0x31,0x64,0x17,0x30,0x63,0x19, 0x31,0x64,0x17,0x32,0x64,0x17,0x31,0x63,0x18,0x31,0x62,0x17,0x82,0x30,0x63, 0x16,0x05,0x30,0x63,0x17,0x2f,0x62,0x17,0x2f,0x62,0x16,0x2f,0x61,0x15,0x30, 0x62,0x18,0x82,0x2f,0x62,0x18,0x02,0x30,0x62,0x18,0x2f,0x62,0x17,0x82,0x2f, 0x60,0x16,0x05,0x2e,0x5f,0x15,0x2a,0x5b,0x12,0x27,0x58,0x10,0x26,0x57,0x10, 0x21,0x52,0x0b,0x82,0x20,0x51,0x0b,0x83,0x1f,0x50,0x0a,0x82,0x20,0x51,0x0c, 0x07,0x1e,0x4f,0x0a,0x1f,0x4f,0x0b,0x1e,0x50,0x0a,0x1f,0x50,0x0a,0x1e,0x4f, 0x0a,0x1e,0x4f,0x09,0x1e,0x4e,0x09,0x82,0x1e,0x4e,0x0a,0x03,0x1d,0x4d,0x09, 0x1d,0x4c,0x0a,0x1d,0x4d,0x09,0x82,0x1d,0x4c,0x09,0x04,0x1c,0x4b,0x09,0x1b, 0x4b,0x08,0x1c,0x4b,0x09,0x1c,0x4b,0x08,0x83,0x1b,0x4b,0x08,0x05,0x1b,0x4a, 0x08,0x1b,0x4b,0x08,0x1a,0x4a,0x08,0x1a,0x4a,0x07,0x19,0x49,0x08,0x84,0x19, 0x49,0x07,0x06,0x18,0x48,0x07,0x18,0x48,0x06,0x19,0x48,0x07,0x18,0x47,0x06, 0x18,0x48,0x07,0x18,0x48,0x06,0x84,0x18,0x47,0x06,0x03,0x18,0x46,0x06,0x18, 0x46,0x05,0x18,0x47,0x06,0x82,0x17,0x46,0x05,0x82,0x17,0x46,0x06,0x82,0x17, 0x46,0x05,0x82,0x15,0x45,0x04,0x01,0x16,0x45,0x05,0x83,0x17,0x45,0x05,0x01, 0x16,0x44,0x04,0x83,0x15,0x44,0x05,0x03,0x17,0x46,0x05,0x16,0x44,0x04,0x16, 0x44,0x05,0x82,0x17,0x45,0x05,0x03,0x16,0x45,0x06,0x16,0x45,0x05,0x15,0x44, 0x05,0x82,0x16,0x44,0x05,0x83,0x15,0x44,0x05,0x88,0x15,0x45,0x04,0x06,0x15, 0x44,0x04,0x17,0x43,0x05,0x15,0x45,0x04,0x16,0x45,0x05,0x15,0x44,0x04,0x15, 0x45,0x04,0x82,0x16,0x45,0x05,0x0f,0x16,0x44,0x04,0x15,0x44,0x04,0x14,0x46, 0x05,0x15,0x46,0x04,0x15,0x45,0x04,0x16,0x45,0x04,0x16,0x45,0x05,0x15,0x46, 0x05,0x16,0x46,0x05,0x17,0x46,0x04,0x14,0x46,0x04,0x17,0x47,0x05,0x17,0x46, 0x05,0x16,0x46,0x05,0x16,0x46,0x04,0x82,0x17,0x47,0x04,0x01,0x15,0x48,0x04, 0x82,0x15,0x47,0x04,0x08,0x16,0x46,0x04,0x17,0x46,0x04,0x16,0x46,0x04,0x14, 0x47,0x05,0x16,0x48,0x06,0x16,0x46,0x05,0x17,0x47,0x04,0x16,0x46,0x04,0x84, 0x16,0x46,0x05,0x82,0x16,0x45,0x05,0x01,0x15,0x46,0x05,0x82,0x15,0x45,0x04, 0x02,0x16,0x45,0x05,0x15,0x44,0x04,0x82,0x14,0x44,0x03,0x04,0x14,0x44,0x04, 0x13,0x43,0x04,0x14,0x42,0x04,0x14,0x43,0x04,0x82,0x14,0x41,0x04,0x04,0x13, 0x41,0x03,0x13,0x40,0x03,0x12,0x40,0x04,0x12,0x3f,0x03,0x84,0x12,0x3f,0x04, 0x02,0x12,0x3e,0x03,0x12,0x3e,0x04,0x82,0x12,0x3d,0x04,0x82,0x11,0x3c,0x03, 0x05,0x11,0x3c,0x04,0x11,0x3c,0x03,0x11,0x3c,0x02,0x11,0x3c,0x03,0x11,0x3c, 0x05,0x82,0x11,0x3c,0x04,0x0a,0x11,0x3b,0x04,0x12,0x3c,0x04,0x11,0x3b,0x03, 0x11,0x3a,0x03,0x11,0x3a,0x04,0x11,0x39,0x04,0x10,0x3a,0x03,0x10,0x3a,0x04, 0x0f,0x38,0x04,0x0f,0x39,0x03,0x83,0x10,0x39,0x04,0x03,0x10,0x38,0x04,0x10, 0x39,0x03,0x10,0x38,0x03,0x83,0x0f,0x38,0x03,0x04,0x0f,0x37,0x02,0x0e,0x36, 0x03,0x10,0x36,0x03,0x0f,0x34,0x02,0x83,0x0f,0x36,0x03,0x06,0x0f,0x35,0x03, 0x0f,0x33,0x02,0x0e,0x35,0x02,0x0e,0x35,0x03,0x0e,0x35,0x02,0x0e,0x34,0x02, 0x82,0x0f,0x34,0x02,0x06,0x0e,0x33,0x02,0x0d,0x32,0x02,0x0e,0x32,0x03,0x0e, 0x32,0x02,0x0d,0x33,0x02,0x0e,0x33,0x03,0x82,0x0d,0x32,0x02,0x01,0x0e,0x31, 0x02,0x83,0x0d,0x31,0x02,0x03,0x0d,0x32,0x02,0x0d,0x31,0x02,0x0c,0x30,0x02, 0x82,0x0d,0x30,0x02,0x09,0x0c,0x2f,0x01,0x0c,0x30,0x01,0x0c,0x2f,0x01,0x0d, 0x2f,0x01,0x0c,0x30,0x02,0x0d,0x2f,0x01,0x0c,0x2e,0x02,0x0c,0x2f,0x01,0x0c, 0x2f,0x02,0x83,0x0c,0x2e,0x01,0x82,0x0c,0x2e,0x02,0x82,0x0c,0x2e,0x01,0x83, 0x0c,0x2d,0x01,0x83,0x0c,0x2c,0x02,0x04,0x0c,0x2d,0x01,0x0b,0x2c,0x01,0x0b, 0x2b,0x01,0x0c,0x2c,0x02,0x82,0x0c,0x2b,0x01,0x01,0x0c,0x2a,0x01,0x83,0x0c, 0x2a,0x02,0x01,0x0b,0x2a,0x02,0x82,0x0b,0x2a,0x01,0x01,0x0b,0x29,0x02,0x82, 0x0a,0x29,0x02,0x08,0x0a,0x28,0x02,0x0a,0x29,0x01,0x0b,0x29,0x02,0x0a,0x29, 0x02,0x0b,0x29,0x02,0x0a,0x29,0x01,0x0b,0x29,0x02,0x0a,0x28,0x02,0x82,0x0a, 0x28,0x01,0x09,0x0b,0x28,0x02,0x0a,0x27,0x01,0x0a,0x27,0x02,0x0a,0x28,0x02, 0x0a,0x27,0x01,0x09,0x27,0x01,0x09,0x26,0x01,0x09,0x26,0x02,0x09,0x25,0x01, 0x82,0x0a,0x26,0x02,0x03,0x09,0x25,0x01,0x0a,0x25,0x02,0x09,0x25,0x01,0x82, 0x09,0x25,0x02,0x82,0x08,0x24,0x01,0x02,0x09,0x24,0x01,0x09,0x24,0x00,0x83, 0x09,0x24,0x01,0x83,0x08,0x23,0x01,0x01,0x09,0x24,0x02,0x82,0x09,0x23,0x02, 0x01,0x08,0x22,0x01,0x82,0x09,0x22,0x01,0x83,0x08,0x22,0x01,0x02,0x08,0x22, 0x02,0x08,0x22,0x01,0x83,0x08,0x21,0x01,0x01,0x08,0x22,0x02,0x82,0x08,0x21, 0x01,0x85,0x08,0x20,0x01,0x02,0x08,0x1f,0x01,0x08,0x20,0x01,0x83,0x07,0x1f, 0x01,0x87,0x07,0x1e,0x01,0x03,0x07,0x1d,0x01,0x06,0x1d,0x00,0x07,0x1d,0x00, 0x82,0x06,0x1c,0x00,0x82,0x06,0x1c,0x01,0x82,0x07,0x1c,0x01,0x08,0x07,0x1d, 0x01,0x06,0x1c,0x00,0x06,0x1b,0x00,0x06,0x1c,0x00,0x06,0x1b,0x00,0x06,0x1c, 0x00,0x06,0x1a,0x00,0x06,0x1b,0x00,0x84,0x06,0x1a,0x00,0x01,0x06,0x1b,0x00, 0x82,0x05,0x1a,0x00,0x83,0x06,0x1a,0x00,0x03,0x05,0x1a,0x01,0x05,0x19,0x00, 0x05,0x19,0x01,0x82,0x05,0x19,0x00,0x8d,0x05,0x18,0x00,0x82,0x05,0x17,0x00, 0x03,0x04,0x17,0x00,0x05,0x17,0x00,0x04,0x16,0x00,0x82,0x05,0x17,0x00,0x02, 0x04,0x17,0x00,0x04,0x16,0x00,0x8d,0x04,0x15,0x00,0x82,0x05,0x15,0x00,0x82, 0x04,0x15,0x00,0x84,0x04,0x14,0x00,0x83,0x05,0x14,0x00,0x82,0x04,0x14,0x00, 0x82,0x05,0x14,0x00,0x82,0x04,0x13,0x00,0x03,0x05,0x13,0x01,0x04,0x13,0x00, 0x05,0x13,0x00,0x82,0x04,0x13,0x00,0x03,0x05,0x13,0x00,0x04,0x13,0x00,0x05, 0x13,0x01,0x82,0x05,0x12,0x01,0x06,0x05,0x13,0x01,0x05,0x14,0x01,0x06,0x15, 0x01,0x06,0x16,0x01,0x07,0x17,0x01,0x07,0x17,0x02,0x82,0x08,0x17,0x03,0x03, 0x08,0x16,0x04,0x09,0x17,0x04,0x08,0x16,0x04,0x83,0x08,0x15,0x03,0x01,0x08, 0x15,0x04,0x83,0x08,0x14,0x04,0x03,0x07,0x14,0x03,0x08,0x14,0x03,0x08,0x14, 0x04,0x82,0x08,0x13,0x03,0x02,0x07,0x13,0x03,0x07,0x13,0x04,0x82,0x07,0x12, 0x03,0x86,0x06,0x11,0x03,0x82,0x06,0x10,0x03,0x01,0x06,0x11,0x03,0x84,0x06, 0x10,0x03,0x85,0x06,0x0f,0x03,0x01,0x06,0x0e,0x03,0x84,0x05,0x0e,0x03,0x83, 0x05,0x0d,0x03,0x82,0x05,0x0d,0x02,0x82,0x05,0x0c,0x02,0x82,0x04,0x0c,0x02, 0x83,0x04,0x0b,0x02,0x84,0x04,0x0a,0x02,0x83,0x04,0x09,0x02,0x82,0x03,0x09, 0x02,0x82,0x03,0x08,0x02,0x83,0x03,0x08,0x01,0x83,0x03,0x07,0x01,0x82,0x02, 0x07,0x01,0x86,0x02,0x06,0x01,0x84,0x02,0x05,0x01,0x01,0x02,0x04,0x01,0x84, 0x01,0x04,0x01,0x86,0x01,0x03,0x00,0x83,0x01,0x02,0x00,0x82,0x00,0x02,0x00, 0x85,0x00,0x01,0x00,0xdd,0x00,0x00,0x00,0x06,0x3a,0x73,0x14,0x3a,0x73,0x15, 0x3a,0x73,0x14,0x3a,0x73,0x15,0x3a,0x73,0x14,0x39,0x72,0x14,0x82,0x39,0x73, 0x15,0x83,0x3a,0x73,0x14,0x02,0x39,0x72,0x15,0x3a,0x74,0x16,0x82,0x3a,0x73, 0x14,0x08,0x3a,0x72,0x14,0x3a,0x73,0x14,0x39,0x72,0x14,0x3a,0x74,0x15,0x39, 0x73,0x14,0x38,0x72,0x13,0x3a,0x74,0x16,0x39,0x72,0x15,0x82,0x39,0x72,0x14, 0x0d,0x38,0x71,0x14,0x3a,0x71,0x14,0x39,0x72,0x15,0x39,0x72,0x14,0x39,0x73, 0x15,0x38,0x72,0x13,0x39,0x72,0x13,0x39,0x72,0x14,0x39,0x72,0x15,0x39,0x72, 0x14,0x39,0x72,0x13,0x39,0x73,0x14,0x38,0x72,0x14,0x82,0x38,0x71,0x14,0x05, 0x39,0x72,0x15,0x38,0x71,0x14,0x39,0x72,0x14,0x3a,0x73,0x15,0x39,0x72,0x14, 0x83,0x38,0x71,0x14,0x03,0x39,0x70,0x16,0x38,0x71,0x16,0x39,0x72,0x15,0x82, 0x38,0x72,0x15,0x0b,0x39,0x72,0x15,0x39,0x71,0x16,0x38,0x70,0x15,0x39,0x70, 0x16,0x39,0x6f,0x16,0x3a,0x70,0x17,0x38,0x70,0x16,0x39,0x72,0x17,0x38,0x70, 0x16,0x38,0x70,0x17,0x39,0x71,0x18,0x82,0x39,0x70,0x17,0x82,0x3a,0x70,0x18, 0x06,0x39,0x6f,0x17,0x39,0x70,0x17,0x3a,0x70,0x18,0x38,0x70,0x17,0x38,0x6f, 0x18,0x38,0x70,0x18,0x82,0x38,0x70,0x19,0x82,0x39,0x6f,0x19,0x04,0x38,0x6e, 0x18,0x38,0x6e,0x19,0x39,0x6f,0x19,0x3a,0x70,0x1a,0x82,0x39,0x6f,0x19,0x0c, 0x3a,0x70,0x1b,0x39,0x6e,0x1b,0x38,0x6e,0x1a,0x39,0x6e,0x1c,0x38,0x6e,0x1a, 0x39,0x6e,0x1a,0x39,0x6e,0x1b,0x38,0x6f,0x1c,0x38,0x6e,0x1b,0x39,0x6f,0x1c, 0x38,0x6f,0x1c,0x38,0x6d,0x1b,0x82,0x38,0x6d,0x1c,0x03,0x39,0x6d,0x1c,0x39, 0x6e,0x1d,0x37,0x6d,0x1b,0x84,0x38,0x6e,0x1c,0x82,0x37,0x6c,0x1b,0x82,0x38, 0x6d,0x1c,0x03,0x37,0x6c,0x1b,0x37,0x6b,0x1b,0x38,0x6c,0x1c,0x82,0x37,0x6c, 0x1b,0x03,0x36,0x6b,0x1b,0x36,0x6b,0x1a,0x37,0x6b,0x1c,0x82,0x36,0x6b,0x1a, 0x03,0x38,0x6b,0x1b,0x36,0x6b,0x1a,0x37,0x6b,0x1b,0x82,0x36,0x6a,0x19,0x82, 0x35,0x6a,0x19,0x06,0x36,0x6a,0x1b,0x35,0x6a,0x1b,0x34,0x69,0x19,0x35,0x6a, 0x19,0x34,0x69,0x18,0x34,0x69,0x19,0x82,0x35,0x69,0x19,0x02,0x34,0x68,0x19, 0x33,0x67,0x18,0x82,0x33,0x67,0x19,0x01,0x34,0x68,0x1a,0x83,0x33,0x67,0x18, 0x01,0x32,0x66,0x17,0x85,0x32,0x66,0x18,0x82,0x31,0x65,0x18,0x02,0x30,0x64, 0x17,0x31,0x64,0x17,0x82,0x30,0x64,0x17,0x04,0x31,0x65,0x18,0x2f,0x63,0x16, 0x30,0x63,0x18,0x2e,0x62,0x16,0x82,0x2f,0x63,0x17,0x83,0x2f,0x62,0x17,0x01, 0x2f,0x63,0x16,0x82,0x2f,0x63,0x17,0x0a,0x2d,0x61,0x15,0x2a,0x5e,0x13,0x28, 0x5a,0x12,0x23,0x54,0x0e,0x22,0x53,0x0d,0x20,0x51,0x0b,0x1e,0x50,0x0a,0x20, 0x51,0x0b,0x1f,0x51,0x0b,0x1f,0x51,0x0a,0x82,0x20,0x51,0x0b,0x01,0x1e,0x50, 0x09,0x82,0x1f,0x50,0x0b,0x05,0x1e,0x4f,0x09,0x1f,0x4f,0x0b,0x1e,0x4f,0x0a, 0x1d,0x4d,0x0a,0x1e,0x4e,0x0b,0x82,0x1e,0x4e,0x0a,0x82,0x1d,0x4d,0x09,0x82, 0x1c,0x4c,0x09,0x02,0x1b,0x4b,0x08,0x1d,0x4d,0x0a,0x82,0x1c,0x4c,0x09,0x06, 0x1c,0x4b,0x0a,0x19,0x4a,0x08,0x1a,0x4b,0x09,0x19,0x4a,0x07,0x19,0x4a,0x08, 0x19,0x4a,0x07,0x82,0x19,0x49,0x07,0x04,0x1b,0x4a,0x09,0x19,0x49,0x07,0x1a, 0x4a,0x08,0x18,0x49,0x07,0x85,0x18,0x48,0x06,0x04,0x19,0x49,0x07,0x18,0x48, 0x06,0x17,0x47,0x05,0x19,0x48,0x07,0x82,0x17,0x47,0x06,0x01,0x17,0x47,0x05, 0x82,0x18,0x47,0x06,0x02,0x17,0x46,0x05,0x17,0x47,0x05,0x84,0x17,0x46,0x05, 0x01,0x17,0x47,0x05,0x87,0x17,0x46,0x05,0x83,0x16,0x46,0x05,0x0c,0x17,0x46, 0x05,0x16,0x44,0x04,0x16,0x45,0x05,0x16,0x46,0x06,0x16,0x46,0x05,0x16,0x46, 0x04,0x16,0x45,0x05,0x16,0x45,0x04,0x17,0x46,0x05,0x17,0x44,0x04,0x16,0x45, 0x04,0x15,0x44,0x05,0x82,0x15,0x46,0x05,0x82,0x16,0x45,0x05,0x01,0x16,0x44, 0x04,0x83,0x16,0x46,0x04,0x05,0x16,0x47,0x04,0x16,0x46,0x04,0x16,0x45,0x04, 0x16,0x46,0x05,0x15,0x45,0x04,0x82,0x15,0x46,0x04,0x84,0x16,0x47,0x05,0x82, 0x16,0x47,0x04,0x02,0x16,0x48,0x05,0x17,0x48,0x05,0x82,0x17,0x47,0x05,0x82, 0x17,0x47,0x04,0x82,0x16,0x47,0x04,0x06,0x16,0x48,0x04,0x15,0x48,0x05,0x16, 0x48,0x04,0x16,0x48,0x03,0x17,0x49,0x04,0x17,0x48,0x04,0x82,0x16,0x47,0x04, 0x01,0x17,0x48,0x04,0x83,0x17,0x47,0x05,0x06,0x17,0x48,0x04,0x16,0x47,0x05, 0x15,0x46,0x04,0x16,0x46,0x05,0x16,0x47,0x05,0x15,0x47,0x04,0x82,0x16,0x47, 0x05,0x08,0x15,0x46,0x04,0x14,0x43,0x03,0x14,0x43,0x05,0x16,0x44,0x05,0x14, 0x43,0x04,0x14,0x42,0x03,0x14,0x43,0x04,0x14,0x42,0x04,0x82,0x13,0x42,0x03, 0x82,0x14,0x41,0x03,0x82,0x13,0x41,0x04,0x02,0x12,0x40,0x03,0x12,0x3f,0x03, 0x82,0x13,0x3f,0x04,0x11,0x12,0x3e,0x04,0x13,0x3f,0x03,0x14,0x3e,0x04,0x13, 0x3d,0x04,0x12,0x3e,0x04,0x12,0x3d,0x04,0x12,0x3e,0x04,0x11,0x3e,0x04,0x11, 0x3d,0x04,0x12,0x3e,0x04,0x12,0x3d,0x03,0x11,0x3d,0x03,0x12,0x3c,0x04,0x12, 0x3b,0x03,0x12,0x3b,0x02,0x11,0x3c,0x04,0x10,0x3b,0x03,0x85,0x10,0x3a,0x03, 0x02,0x10,0x39,0x03,0x10,0x3a,0x03,0x82,0x10,0x39,0x03,0x01,0x0f,0x39,0x04, 0x84,0x10,0x38,0x03,0x04,0x0e,0x37,0x03,0x0f,0x37,0x03,0x10,0x37,0x03,0x0e, 0x37,0x03,0x84,0x0f,0x37,0x03,0x07,0x0f,0x36,0x03,0x0e,0x36,0x02,0x0e,0x36, 0x03,0x0e,0x33,0x02,0x0f,0x35,0x03,0x0e,0x35,0x03,0x0f,0x35,0x03,0x82,0x0d, 0x34,0x02,0x02,0x0d,0x33,0x02,0x0e,0x33,0x02,0x82,0x0e,0x32,0x02,0x03,0x0d, 0x32,0x02,0x0d,0x33,0x02,0x0e,0x33,0x02,0x84,0x0d,0x32,0x02,0x04,0x0e,0x32, 0x02,0x0c,0x31,0x02,0x0c,0x30,0x01,0x0c,0x31,0x02,0x82,0x0d,0x30,0x01,0x03, 0x0d,0x31,0x02,0x0c,0x30,0x02,0x0d,0x30,0x01,0x82,0x0c,0x30,0x02,0x01,0x0d, 0x30,0x02,0x82,0x0c,0x2f,0x01,0x08,0x0c,0x2e,0x02,0x0c,0x2f,0x02,0x0c,0x2f, 0x03,0x0b,0x2e,0x01,0x0c,0x2f,0x02,0x0c,0x2e,0x02,0x0c,0x2e,0x01,0x0c,0x2d, 0x01,0x82,0x0c,0x2d,0x02,0x14,0x0c,0x2e,0x01,0x0c,0x2e,0x02,0x0c,0x2c,0x02, 0x0c,0x2d,0x01,0x0c,0x2c,0x02,0x0b,0x2c,0x02,0x0b,0x2c,0x01,0x0c,0x2c,0x01, 0x0c,0x2d,0x02,0x0b,0x2c,0x01,0x0c,0x2b,0x01,0x0b,0x2c,0x02,0x0a,0x2c,0x02, 0x0b,0x2a,0x02,0x0a,0x2a,0x02,0x0a,0x2c,0x01,0x0b,0x2b,0x02,0x0b,0x2a,0x01, 0x0b,0x2a,0x02,0x0b,0x29,0x02,0x83,0x0a,0x29,0x01,0x09,0x0b,0x28,0x02,0x0b, 0x28,0x01,0x0b,0x29,0x02,0x0b,0x28,0x02,0x0b,0x29,0x01,0x0b,0x28,0x01,0x0a, 0x28,0x02,0x0b,0x28,0x02,0x0a,0x28,0x02,0x84,0x0a,0x27,0x01,0x01,0x09,0x27, 0x01,0x82,0x09,0x26,0x01,0x84,0x0a,0x26,0x01,0x03,0x0a,0x25,0x01,0x0a,0x26, 0x01,0x0a,0x25,0x01,0x84,0x09,0x25,0x01,0x01,0x09,0x24,0x01,0x82,0x0a,0x24, 0x02,0x01,0x09,0x24,0x01,0x82,0x09,0x23,0x01,0x01,0x09,0x24,0x02,0x83,0x09, 0x23,0x01,0x82,0x08,0x23,0x01,0x01,0x09,0x23,0x01,0x83,0x09,0x21,0x01,0x01, 0x08,0x22,0x01,0x82,0x08,0x21,0x01,0x02,0x09,0x21,0x01,0x09,0x21,0x02,0x82, 0x09,0x21,0x01,0x83,0x08,0x20,0x01,0x05,0x07,0x1f,0x01,0x08,0x20,0x01,0x07, 0x20,0x01,0x07,0x20,0x00,0x08,0x20,0x01,0x85,0x07,0x1f,0x01,0x84,0x07,0x1e, 0x01,0x01,0x06,0x1d,0x01,0x82,0x06,0x1d,0x00,0x01,0x07,0x1d,0x01,0x82,0x06, 0x1d,0x00,0x82,0x06,0x1d,0x01,0x02,0x07,0x1d,0x01,0x07,0x1c,0x01,0x83,0x06, 0x1c,0x00,0x86,0x06,0x1b,0x00,0x84,0x06,0x1a,0x00,0x02,0x06,0x1a,0x01,0x06, 0x19,0x00,0x82,0x05,0x19,0x00,0x01,0x05,0x19,0x01,0x85,0x05,0x19,0x00,0x88, 0x05,0x18,0x00,0x02,0x05,0x18,0x01,0x05,0x18,0x00,0x82,0x05,0x17,0x00,0x02, 0x04,0x16,0x00,0x05,0x17,0x00,0x8b,0x04,0x16,0x00,0x8c,0x04,0x15,0x00,0x82, 0x04,0x14,0x00,0x04,0x04,0x15,0x00,0x04,0x14,0x00,0x05,0x15,0x01,0x05,0x15, 0x00,0x86,0x04,0x14,0x00,0x03,0x04,0x13,0x00,0x05,0x14,0x00,0x05,0x13,0x00, 0x82,0x04,0x13,0x00,0x04,0x05,0x13,0x01,0x04,0x13,0x00,0x05,0x13,0x00,0x04, 0x13,0x00,0x82,0x04,0x13,0x01,0x01,0x05,0x12,0x01,0x82,0x05,0x13,0x01,0x03, 0x05,0x14,0x01,0x06,0x15,0x01,0x06,0x16,0x01,0x82,0x07,0x16,0x02,0x01,0x09, 0x16,0x03,0x83,0x09,0x16,0x04,0x02,0x08,0x15,0x04,0x08,0x15,0x03,0x82,0x08, 0x15,0x04,0x03,0x08,0x15,0x03,0x08,0x15,0x04,0x08,0x14,0x03,0x83,0x07,0x14, 0x03,0x82,0x08,0x14,0x04,0x01,0x07,0x13,0x04,0x82,0x07,0x13,0x03,0x82,0x07, 0x12,0x03,0x01,0x06,0x12,0x03,0x82,0x06,0x11,0x03,0x82,0x06,0x10,0x03,0x01, 0x06,0x11,0x03,0x84,0x06,0x10,0x03,0x85,0x06,0x0f,0x03,0x86,0x05,0x0e,0x03, 0x04,0x05,0x0d,0x03,0x05,0x0d,0x02,0x05,0x0d,0x03,0x05,0x0d,0x02,0x83,0x05, 0x0c,0x02,0x82,0x04,0x0c,0x02,0x85,0x04,0x0b,0x02,0x83,0x04,0x0a,0x02,0x01, 0x03,0x0a,0x02,0x84,0x03,0x09,0x02,0x83,0x03,0x08,0x01,0x84,0x03,0x07,0x01, 0x01,0x02,0x07,0x01,0x86,0x02,0x06,0x01,0x84,0x02,0x05,0x01,0x02,0x01,0x05, 0x01,0x02,0x04,0x01,0x82,0x01,0x04,0x01,0x82,0x01,0x04,0x00,0x85,0x01,0x03, 0x00,0x83,0x01,0x02,0x00,0x82,0x00,0x02,0x00,0x85,0x00,0x01,0x00,0xdd,0x00, 0x00,0x00,0x03,0x3b,0x75,0x15,0x3b,0x74,0x14,0x3a,0x74,0x14,0x82,0x3b,0x74, 0x14,0x01,0x3a,0x74,0x14,0x82,0x3b,0x74,0x16,0x83,0x3a,0x74,0x14,0x06,0x3a, 0x74,0x15,0x3a,0x74,0x14,0x3b,0x74,0x14,0x3b,0x75,0x15,0x3a,0x74,0x15,0x3a, 0x73,0x13,0x82,0x3a,0x74,0x14,0x82,0x39,0x74,0x13,0x03,0x3a,0x74,0x15,0x3a, 0x73,0x14,0x39,0x72,0x14,0x82,0x39,0x74,0x14,0x0f,0x3a,0x74,0x14,0x3a,0x73, 0x14,0x39,0x72,0x14,0x3a,0x73,0x14,0x3a,0x73,0x13,0x3a,0x72,0x13,0x3a,0x74, 0x15,0x39,0x72,0x14,0x3a,0x73,0x14,0x3a,0x74,0x14,0x39,0x72,0x13,0x38,0x72, 0x13,0x39,0x72,0x14,0x3b,0x73,0x15,0x3a,0x73,0x16,0x82,0x3a,0x72,0x14,0x03, 0x3a,0x73,0x14,0x39,0x72,0x14,0x39,0x72,0x15,0x82,0x39,0x72,0x14,0x06,0x3a, 0x72,0x16,0x38,0x72,0x14,0x39,0x72,0x15,0x39,0x73,0x16,0x38,0x72,0x15,0x39, 0x72,0x15,0x82,0x39,0x72,0x16,0x82,0x3a,0x71,0x17,0x01,0x3a,0x72,0x17,0x82, 0x38,0x71,0x16,0x05,0x39,0x72,0x17,0x3a,0x72,0x17,0x3a,0x71,0x17,0x3b,0x72, 0x18,0x3b,0x72,0x19,0x82,0x39,0x72,0x18,0x0a,0x3b,0x72,0x18,0x3a,0x71,0x18, 0x3a,0x72,0x19,0x39,0x71,0x19,0x3a,0x71,0x18,0x3a,0x71,0x19,0x3a,0x71,0x18, 0x3b,0x71,0x1a,0x3a,0x70,0x19,0x39,0x70,0x19,0x82,0x3a,0x71,0x1a,0x10,0x3a, 0x70,0x19,0x3a,0x70,0x1a,0x3a,0x71,0x1a,0x3b,0x71,0x1b,0x3a,0x70,0x1a,0x39, 0x6f,0x1a,0x3a,0x70,0x1b,0x3a,0x70,0x1c,0x3a,0x70,0x1b,0x3a,0x6f,0x1a,0x39, 0x6f,0x1b,0x38,0x6f,0x1b,0x3a,0x6f,0x1b,0x3a,0x70,0x1d,0x38,0x70,0x1b,0x3a, 0x70,0x1c,0x82,0x3a,0x70,0x1d,0x82,0x39,0x6f,0x1d,0x02,0x38,0x6e,0x1b,0x39, 0x6f,0x1d,0x82,0x3a,0x6f,0x1d,0x06,0x38,0x70,0x1d,0x38,0x6e,0x1b,0x38,0x6f, 0x1c,0x39,0x6e,0x1c,0x39,0x6e,0x1d,0x3a,0x6f,0x1d,0x82,0x39,0x6f,0x1d,0x03, 0x38,0x6e,0x1b,0x37,0x6d,0x1b,0x37,0x6d,0x1d,0x82,0x38,0x6e,0x1c,0x82,0x37, 0x6c,0x1c,0x04,0x38,0x6e,0x1b,0x37,0x6d,0x1b,0x38,0x6d,0x1b,0x37,0x6d,0x1b, 0x82,0x38,0x6d,0x1b,0x04,0x37,0x6c,0x1a,0x36,0x6b,0x1a,0x36,0x6b,0x1b,0x36, 0x6a,0x1a,0x82,0x37,0x6c,0x1a,0x02,0x36,0x6b,0x1b,0x36,0x6a,0x1a,0x82,0x35, 0x6a,0x1a,0x01,0x36,0x6a,0x1a,0x82,0x35,0x6a,0x1a,0x01,0x35,0x69,0x19,0x82, 0x34,0x69,0x19,0x0e,0x35,0x69,0x19,0x35,0x69,0x1a,0x34,0x69,0x1a,0x33,0x68, 0x19,0x33,0x67,0x18,0x33,0x68,0x18,0x33,0x68,0x1a,0x34,0x68,0x19,0x33,0x67, 0x19,0x33,0x67,0x18,0x33,0x66,0x19,0x33,0x68,0x19,0x31,0x66,0x17,0x31,0x66, 0x18,0x82,0x32,0x65,0x18,0x05,0x31,0x65,0x19,0x31,0x66,0x18,0x30,0x65,0x17, 0x2f,0x63,0x17,0x30,0x64,0x18,0x82,0x2f,0x63,0x17,0x01,0x30,0x64,0x18,0x82, 0x2f,0x63,0x17,0x14,0x30,0x64,0x18,0x31,0x64,0x17,0x2f,0x62,0x16,0x2f,0x62, 0x17,0x2b,0x5e,0x13,0x26,0x59,0x10,0x23,0x55,0x0e,0x22,0x54,0x0c,0x1f,0x51, 0x0a,0x20,0x52,0x0c,0x1e,0x50,0x0a,0x1f,0x51,0x0b,0x20,0x52,0x0b,0x20,0x51, 0x0b,0x20,0x51,0x0c,0x1f,0x50,0x0b,0x1f,0x50,0x0a,0x1f,0x50,0x09,0x1e,0x4f, 0x0a,0x1f,0x50,0x0b,0x83,0x1e,0x4f,0x0a,0x0d,0x1f,0x50,0x0a,0x1e,0x4e,0x08, 0x1d,0x4e,0x0a,0x1d,0x4d,0x09,0x1c,0x4d,0x09,0x1b,0x4c,0x08,0x1c,0x4d,0x09, 0x1b,0x4d,0x09,0x1a,0x4c,0x08,0x1c,0x4d,0x09,0x1c,0x4c,0x0a,0x1b,0x4c,0x09, 0x1a,0x4b,0x08,0x83,0x1a,0x4a,0x08,0x03,0x1a,0x4b,0x08,0x19,0x4b,0x08,0x19, 0x49,0x06,0x86,0x19,0x4a,0x07,0x02,0x19,0x49,0x06,0x18,0x49,0x06,0x82,0x18, 0x48,0x06,0x82,0x18,0x49,0x06,0x01,0x18,0x48,0x06,0x84,0x17,0x47,0x05,0x01, 0x18,0x47,0x05,0x82,0x17,0x47,0x05,0x09,0x16,0x46,0x04,0x17,0x46,0x04,0x17, 0x46,0x05,0x17,0x46,0x04,0x17,0x46,0x05,0x18,0x47,0x05,0x17,0x46,0x05,0x17, 0x47,0x05,0x16,0x46,0x04,0x82,0x17,0x47,0x05,0x03,0x17,0x46,0x04,0x17,0x46, 0x05,0x16,0x46,0x05,0x82,0x17,0x47,0x05,0x01,0x16,0x46,0x05,0x82,0x17,0x46, 0x04,0x06,0x16,0x46,0x04,0x17,0x47,0x05,0x17,0x46,0x04,0x17,0x46,0x06,0x17, 0x46,0x05,0x16,0x46,0x05,0x83,0x16,0x46,0x04,0x02,0x17,0x46,0x05,0x16,0x47, 0x05,0x83,0x17,0x47,0x05,0x01,0x17,0x46,0x05,0x86,0x16,0x46,0x04,0x01,0x17, 0x47,0x05,0x82,0x17,0x48,0x05,0x01,0x15,0x48,0x04,0x82,0x16,0x47,0x04,0x82, 0x17,0x47,0x04,0x01,0x17,0x48,0x05,0x82,0x17,0x48,0x04,0x0a,0x15,0x48,0x04, 0x16,0x47,0x04,0x17,0x49,0x05,0x18,0x49,0x05,0x17,0x49,0x04,0x16,0x47,0x03, 0x17,0x49,0x04,0x17,0x48,0x04,0x16,0x49,0x04,0x16,0x49,0x05,0x84,0x17,0x48, 0x05,0x04,0x17,0x47,0x04,0x17,0x46,0x05,0x16,0x46,0x04,0x16,0x47,0x03,0x82, 0x17,0x48,0x05,0x06,0x16,0x47,0x04,0x14,0x45,0x03,0x14,0x45,0x04,0x16,0x46, 0x04,0x15,0x44,0x04,0x14,0x43,0x03,0x82,0x14,0x44,0x04,0x01,0x15,0x44,0x04, 0x82,0x14,0x43,0x04,0x03,0x13,0x43,0x04,0x13,0x42,0x03,0x13,0x42,0x04,0x82, 0x13,0x41,0x04,0x03,0x14,0x41,0x04,0x13,0x40,0x04,0x13,0x3f,0x03,0x83,0x13, 0x3f,0x04,0x01,0x12,0x3f,0x04,0x83,0x12,0x3e,0x03,0x82,0x12,0x3e,0x04,0x01, 0x12,0x3d,0x03,0x82,0x12,0x3d,0x04,0x82,0x11,0x3c,0x03,0x02,0x11,0x3c,0x04, 0x11,0x3c,0x03,0x82,0x11,0x3c,0x04,0x04,0x10,0x3c,0x03,0x11,0x3b,0x03,0x11, 0x3b,0x04,0x11,0x3b,0x03,0x82,0x10,0x3a,0x03,0x07,0x10,0x3a,0x04,0x11,0x3a, 0x04,0x10,0x38,0x03,0x0f,0x38,0x03,0x10,0x38,0x03,0x11,0x38,0x04,0x0f,0x38, 0x03,0x82,0x10,0x38,0x03,0x01,0x10,0x37,0x03,0x85,0x0f,0x37,0x03,0x01,0x0f, 0x36,0x02,0x82,0x0f,0x35,0x02,0x01,0x0f,0x35,0x03,0x82,0x0e,0x35,0x03,0x82, 0x0e,0x35,0x02,0x82,0x0d,0x34,0x02,0x07,0x0e,0x33,0x03,0x0f,0x34,0x02,0x0e, 0x35,0x02,0x0d,0x34,0x02,0x0e,0x33,0x02,0x0d,0x33,0x02,0x0e,0x33,0x02,0x82, 0x0d,0x33,0x02,0x0a,0x0f,0x33,0x03,0x0d,0x32,0x02,0x0d,0x31,0x02,0x0c,0x31, 0x02,0x0d,0x30,0x01,0x0d,0x31,0x01,0x0c,0x30,0x02,0x0c,0x31,0x03,0x0d,0x31, 0x02,0x0c,0x30,0x02,0x83,0x0c,0x30,0x01,0x01,0x0c,0x30,0x02,0x82,0x0d,0x2f, 0x03,0x08,0x0c,0x2e,0x02,0x0c,0x2f,0x01,0x0d,0x2f,0x02,0x0c,0x2f,0x02,0x0b, 0x2e,0x01,0x0c,0x2f,0x02,0x0b,0x2e,0x01,0x0b,0x2e,0x02,0x82,0x0c,0x2e,0x02, 0x85,0x0c,0x2d,0x02,0x83,0x0c,0x2d,0x01,0x08,0x0c,0x2c,0x01,0x0c,0x2c,0x02, 0x0b,0x2c,0x02,0x0a,0x2c,0x02,0x0b,0x2b,0x02,0x0a,0x2c,0x01,0x0b,0x2c,0x01, 0x0b,0x2b,0x02,0x84,0x0b,0x2a,0x02,0x01,0x0b,0x29,0x02,0x82,0x0a,0x29,0x01, 0x02,0x0a,0x29,0x02,0x0a,0x28,0x02,0x82,0x0b,0x29,0x02,0x02,0x0a,0x28,0x01, 0x0a,0x29,0x01,0x83,0x0a,0x28,0x01,0x84,0x0a,0x27,0x01,0x01,0x09,0x26,0x00, 0x82,0x0a,0x27,0x01,0x03,0x09,0x26,0x01,0x0a,0x26,0x01,0x09,0x26,0x01,0x82, 0x0a,0x26,0x01,0x02,0x0a,0x25,0x02,0x09,0x26,0x01,0x83,0x09,0x25,0x01,0x83, 0x09,0x24,0x01,0x03,0x09,0x24,0x02,0x09,0x23,0x01,0x09,0x24,0x02,0x83,0x09, 0x23,0x02,0x83,0x09,0x23,0x01,0x82,0x09,0x22,0x01,0x83,0x09,0x22,0x02,0x01, 0x08,0x22,0x01,0x82,0x09,0x21,0x01,0x03,0x08,0x21,0x01,0x09,0x22,0x01,0x09, 0x21,0x01,0x82,0x08,0x21,0x01,0x05,0x08,0x20,0x01,0x08,0x21,0x01,0x08,0x20, 0x01,0x08,0x20,0x00,0x08,0x20,0x01,0x85,0x08,0x1f,0x01,0x01,0x07,0x1e,0x00, 0x82,0x07,0x1e,0x01,0x82,0x07,0x1e,0x00,0x01,0x08,0x1e,0x01,0x82,0x06,0x1d, 0x00,0x02,0x07,0x1e,0x01,0x06,0x1e,0x01,0x82,0x06,0x1d,0x00,0x03,0x07,0x1d, 0x01,0x06,0x1d,0x01,0x06,0x1c,0x01,0x82,0x06,0x1b,0x00,0x02,0x06,0x1c,0x01, 0x06,0x1c,0x00,0x82,0x06,0x1b,0x00,0x82,0x06,0x1b,0x01,0x83,0x06,0x1b,0x00, 0x01,0x06,0x1a,0x00,0x82,0x06,0x1a,0x01,0x05,0x06,0x1a,0x00,0x05,0x1a,0x00, 0x05,0x1a,0x01,0x05,0x19,0x00,0x05,0x1a,0x01,0x85,0x05,0x19,0x00,0x01,0x06, 0x19,0x01,0x87,0x05,0x18,0x00,0x82,0x05,0x17,0x00,0x82,0x04,0x17,0x00,0x82, 0x05,0x17,0x00,0x83,0x04,0x17,0x00,0x02,0x05,0x17,0x00,0x04,0x17,0x00,0x85, 0x04,0x16,0x00,0x01,0x05,0x16,0x00,0x83,0x04,0x16,0x00,0x86,0x04,0x15,0x00, 0x82,0x04,0x14,0x00,0x01,0x04,0x15,0x00,0x8b,0x04,0x14,0x00,0x03,0x04,0x13, 0x00,0x05,0x13,0x00,0x04,0x13,0x01,0x83,0x04,0x13,0x00,0x01,0x04,0x13,0x01, 0x82,0x04,0x13,0x00,0x01,0x05,0x13,0x01,0x84,0x04,0x12,0x01,0x03,0x05,0x12, 0x01,0x05,0x13,0x01,0x05,0x14,0x01,0x82,0x06,0x16,0x01,0x02,0x06,0x16,0x02, 0x08,0x16,0x03,0x82,0x09,0x16,0x04,0x05,0x09,0x15,0x04,0x08,0x16,0x04,0x08, 0x16,0x03,0x09,0x15,0x03,0x08,0x15,0x03,0x82,0x08,0x15,0x04,0x82,0x08,0x14, 0x04,0x82,0x08,0x14,0x03,0x01,0x07,0x13,0x03,0x84,0x08,0x13,0x03,0x01,0x08, 0x12,0x03,0x82,0x07,0x12,0x03,0x83,0x06,0x11,0x03,0x87,0x06,0x10,0x03,0x82, 0x06,0x0f,0x03,0x84,0x05,0x0f,0x03,0x82,0x05,0x0e,0x03,0x82,0x05,0x0d,0x03, 0x82,0x05,0x0d,0x02,0x82,0x05,0x0c,0x02,0x83,0x04,0x0c,0x02,0x85,0x04,0x0b, 0x02,0x83,0x04,0x0a,0x02,0x82,0x03,0x0a,0x02,0x83,0x03,0x09,0x02,0x01,0x03, 0x09,0x01,0x85,0x03,0x08,0x01,0x02,0x03,0x07,0x01,0x02,0x07,0x01,0x86,0x02, 0x06,0x01,0x85,0x02,0x05,0x01,0x01,0x02,0x04,0x01,0x83,0x01,0x04,0x01,0x01, 0x01,0x04,0x00,0x85,0x01,0x03,0x00,0x83,0x01,0x02,0x00,0x82,0x00,0x02,0x00, 0x85,0x00,0x01,0x00,0xdd,0x00,0x00,0x00,0x03,0x3b,0x75,0x14,0x3b,0x76,0x15, 0x3c,0x76,0x15,0x86,0x3b,0x76,0x15,0x82,0x3b,0x75,0x14,0x05,0x3b,0x75,0x15, 0x3a,0x76,0x14,0x3b,0x75,0x14,0x3b,0x76,0x15,0x3b,0x76,0x16,0x82,0x3b,0x75, 0x15,0x0a,0x3b,0x75,0x14,0x3a,0x76,0x14,0x3a,0x75,0x14,0x3a,0x74,0x15,0x3b, 0x75,0x15,0x3a,0x74,0x15,0x3a,0x76,0x15,0x3a,0x75,0x14,0x3a,0x74,0x14,0x3b, 0x75,0x14,0x83,0x3a,0x74,0x14,0x02,0x3b,0x75,0x14,0x3b,0x75,0x15,0x84,0x3a, 0x74,0x14,0x03,0x3a,0x74,0x15,0x3a,0x74,0x14,0x39,0x73,0x14,0x85,0x3a,0x74, 0x14,0x82,0x39,0x73,0x15,0x02,0x39,0x73,0x14,0x3b,0x73,0x15,0x82,0x39,0x73, 0x15,0x82,0x3a,0x74,0x15,0x02,0x3a,0x73,0x15,0x3a,0x73,0x16,0x82,0x3a,0x74, 0x17,0x01,0x39,0x73,0x16,0x83,0x3b,0x73,0x16,0x04,0x39,0x73,0x16,0x3a,0x73, 0x17,0x3a,0x74,0x17,0x3b,0x73,0x18,0x82,0x39,0x73,0x17,0x06,0x3a,0x73,0x19, 0x3a,0x74,0x19,0x39,0x72,0x19,0x3a,0x73,0x1a,0x3a,0x73,0x19,0x3a,0x72,0x18, 0x83,0x3b,0x73,0x19,0x82,0x3b,0x72,0x1a,0x07,0x3a,0x72,0x1a,0x3b,0x72,0x1b, 0x3a,0x72,0x1a,0x3b,0x72,0x1b,0x3b,0x73,0x1b,0x3b,0x72,0x1b,0x3a,0x72,0x1a, 0x82,0x3a,0x71,0x1b,0x02,0x3a,0x71,0x1c,0x3a,0x71,0x1b,0x82,0x3a,0x70,0x1c, 0x05,0x3a,0x71,0x1c,0x3b,0x71,0x1c,0x3b,0x71,0x1d,0x3a,0x71,0x1c,0x3b,0x72, 0x1d,0x86,0x3a,0x71,0x1d,0x01,0x39,0x70,0x1c,0x83,0x3a,0x71,0x1d,0x82,0x3a, 0x70,0x1d,0x82,0x39,0x70,0x1d,0x04,0x3a,0x70,0x1d,0x39,0x70,0x1d,0x3a,0x70, 0x1d,0x39,0x70,0x1c,0x82,0x39,0x6f,0x1c,0x01,0x38,0x6e,0x1d,0x82,0x39,0x6e, 0x1c,0x82,0x39,0x6f,0x1c,0x84,0x39,0x6e,0x1c,0x01,0x38,0x6e,0x1b,0x82,0x38, 0x6d,0x1b,0x01,0x37,0x6c,0x1b,0x82,0x38,0x6d,0x1b,0x03,0x37,0x6c,0x1b,0x38, 0x6d,0x1c,0x37,0x6c,0x1b,0x82,0x36,0x6c,0x1b,0x02,0x36,0x6c,0x19,0x36,0x6b, 0x1a,0x83,0x35,0x6b,0x1a,0x03,0x36,0x6b,0x1a,0x35,0x6b,0x1b,0x34,0x6a,0x1a, 0x82,0x35,0x6a,0x1a,0x0a,0x34,0x6a,0x1a,0x34,0x6a,0x19,0x33,0x68,0x19,0x34, 0x69,0x19,0x33,0x68,0x1a,0x33,0x68,0x19,0x34,0x69,0x19,0x33,0x68,0x18,0x32, 0x67,0x17,0x33,0x68,0x19,0x82,0x33,0x67,0x19,0x82,0x32,0x67,0x19,0x01,0x32, 0x67,0x18,0x82,0x31,0x66,0x17,0x82,0x31,0x66,0x19,0x18,0x30,0x65,0x17,0x2f, 0x64,0x17,0x30,0x65,0x17,0x30,0x64,0x16,0x31,0x65,0x16,0x2f,0x64,0x16,0x30, 0x65,0x17,0x31,0x66,0x19,0x2f,0x62,0x16,0x2f,0x64,0x18,0x29,0x5d,0x13,0x27, 0x5a,0x10,0x23,0x55,0x0d,0x21,0x53,0x0b,0x20,0x53,0x0a,0x1f,0x52,0x0a,0x20, 0x52,0x0b,0x1f,0x51,0x0b,0x20,0x52,0x0b,0x20,0x52,0x09,0x21,0x53,0x0a,0x20, 0x52,0x0a,0x20,0x51,0x0a,0x1e,0x4f,0x09,0x82,0x1f,0x50,0x0b,0x02,0x1e,0x50, 0x0b,0x1e,0x51,0x0a,0x82,0x1d,0x4f,0x09,0x03,0x1d,0x4e,0x08,0x1c,0x4e,0x09, 0x1c,0x4d,0x08,0x82,0x1c,0x4e,0x09,0x82,0x1c,0x4d,0x08,0x01,0x1b,0x4d,0x09, 0x82,0x1b,0x4c,0x09,0x03,0x1b,0x4c,0x08,0x1b,0x4c,0x09,0x1a,0x4c,0x08,0x82, 0x1b,0x4c,0x08,0x83,0x1a,0x4b,0x08,0x02,0x1b,0x4c,0x08,0x1a,0x4b,0x07,0x85, 0x19,0x49,0x06,0x04,0x19,0x49,0x07,0x19,0x4b,0x07,0x18,0x49,0x06,0x18,0x48, 0x05,0x85,0x17,0x48,0x05,0x82,0x16,0x47,0x04,0x01,0x17,0x47,0x04,0x82,0x16, 0x47,0x04,0x01,0x17,0x47,0x05,0x85,0x17,0x48,0x05,0x04,0x16,0x47,0x04,0x16, 0x47,0x05,0x17,0x47,0x05,0x17,0x47,0x04,0x82,0x17,0x47,0x05,0x82,0x16,0x47, 0x04,0x04,0x17,0x49,0x05,0x17,0x48,0x05,0x17,0x47,0x04,0x18,0x46,0x04,0x82, 0x17,0x47,0x04,0x05,0x17,0x48,0x05,0x16,0x48,0x04,0x16,0x47,0x04,0x17,0x47, 0x04,0x16,0x48,0x05,0x83,0x17,0x48,0x05,0x03,0x18,0x48,0x05,0x16,0x48,0x04, 0x17,0x47,0x05,0x83,0x17,0x48,0x05,0x02,0x16,0x47,0x04,0x17,0x48,0x05,0x82, 0x16,0x48,0x04,0x83,0x17,0x49,0x05,0x01,0x17,0x48,0x05,0x83,0x17,0x49,0x05, 0x83,0x16,0x48,0x04,0x01,0x17,0x49,0x05,0x82,0x17,0x49,0x04,0x04,0x16,0x48, 0x04,0x17,0x49,0x05,0x16,0x4a,0x04,0x15,0x49,0x04,0x82,0x17,0x49,0x05,0x01, 0x16,0x48,0x05,0x82,0x16,0x48,0x04,0x05,0x16,0x48,0x05,0x17,0x48,0x05,0x16, 0x48,0x04,0x17,0x49,0x05,0x17,0x48,0x05,0x82,0x15,0x47,0x04,0x0a,0x16,0x47, 0x04,0x15,0x47,0x05,0x15,0x47,0x03,0x15,0x46,0x04,0x16,0x45,0x04,0x15,0x45, 0x04,0x15,0x44,0x04,0x15,0x45,0x04,0x14,0x44,0x03,0x15,0x43,0x04,0x82,0x14, 0x43,0x03,0x08,0x14,0x42,0x03,0x14,0x41,0x04,0x14,0x42,0x04,0x14,0x41,0x03, 0x14,0x42,0x03,0x14,0x41,0x04,0x13,0x40,0x03,0x13,0x40,0x04,0x82,0x13,0x41, 0x05,0x02,0x13,0x3f,0x03,0x13,0x40,0x04,0x82,0x13,0x3f,0x03,0x82,0x12,0x3e, 0x03,0x02,0x13,0x3e,0x04,0x13,0x3d,0x04,0x82,0x11,0x3e,0x03,0x82,0x11,0x3c, 0x03,0x02,0x12,0x3e,0x04,0x10,0x3c,0x03,0x82,0x11,0x3c,0x03,0x01,0x11,0x3c, 0x04,0x83,0x10,0x3b,0x03,0x05,0x10,0x3a,0x04,0x11,0x3b,0x04,0x11,0x3a,0x03, 0x10,0x3a,0x03,0x0f,0x39,0x03,0x86,0x10,0x39,0x03,0x03,0x0f,0x38,0x03,0x10, 0x37,0x03,0x10,0x38,0x03,0x83,0x0f,0x38,0x03,0x01,0x0f,0x37,0x03,0x82,0x0f, 0x36,0x02,0x06,0x0e,0x36,0x02,0x0e,0x36,0x03,0x0e,0x35,0x02,0x0e,0x36,0x02, 0x0f,0x35,0x03,0x0f,0x34,0x02,0x82,0x0e,0x35,0x03,0x01,0x0e,0x34,0x02,0x82, 0x0e,0x33,0x02,0x10,0x0e,0x34,0x02,0x0e,0x33,0x02,0x0d,0x33,0x02,0x0e,0x33, 0x02,0x0d,0x33,0x02,0x0e,0x33,0x02,0x0d,0x33,0x02,0x0e,0x32,0x02,0x0d,0x32, 0x01,0x0e,0x32,0x02,0x0b,0x30,0x01,0x0d,0x31,0x01,0x0d,0x31,0x02,0x0c,0x30, 0x02,0x0d,0x30,0x02,0x0c,0x30,0x01,0x82,0x0d,0x30,0x02,0x82,0x0d,0x30,0x01, 0x02,0x0d,0x2f,0x01,0x0c,0x30,0x02,0x82,0x0c,0x2f,0x02,0x01,0x0c,0x2e,0x01, 0x82,0x0d,0x2f,0x02,0x82,0x0c,0x2f,0x02,0x82,0x0c,0x2e,0x02,0x0a,0x0c,0x2d, 0x02,0x0c,0x2d,0x01,0x0d,0x2c,0x01,0x0b,0x2c,0x01,0x0b,0x2c,0x02,0x0d,0x2d, 0x02,0x0c,0x2d,0x01,0x0b,0x2c,0x01,0x0b,0x2c,0x02,0x0a,0x2c,0x02,0x82,0x0b, 0x2c,0x02,0x05,0x0a,0x2c,0x02,0x0b,0x2c,0x02,0x0c,0x2c,0x02,0x0b,0x2b,0x02, 0x0a,0x2b,0x02,0x85,0x0b,0x2a,0x02,0x01,0x0a,0x29,0x01,0x82,0x0b,0x2a,0x01, 0x82,0x0a,0x29,0x02,0x02,0x0b,0x29,0x02,0x09,0x29,0x01,0x82,0x0a,0x28,0x01, 0x82,0x0a,0x27,0x01,0x02,0x0a,0x28,0x02,0x0a,0x27,0x01,0x82,0x09,0x27,0x01, 0x05,0x0a,0x27,0x01,0x09,0x27,0x02,0x0a,0x26,0x01,0x0a,0x27,0x01,0x0a,0x26, 0x01,0x83,0x09,0x26,0x01,0x83,0x09,0x26,0x02,0x86,0x09,0x24,0x01,0x84,0x09, 0x23,0x01,0x03,0x09,0x23,0x02,0x09,0x22,0x01,0x09,0x23,0x02,0x82,0x09,0x22, 0x01,0x83,0x08,0x22,0x01,0x83,0x09,0x22,0x01,0x03,0x08,0x21,0x01,0x09,0x22, 0x01,0x09,0x21,0x01,0x83,0x08,0x21,0x01,0x86,0x08,0x20,0x01,0x02,0x08,0x1f, 0x01,0x07,0x1f,0x01,0x82,0x08,0x1f,0x01,0x82,0x07,0x1e,0x00,0x03,0x08,0x1f, 0x01,0x07,0x1e,0x01,0x07,0x1e,0x00,0x82,0x07,0x1e,0x01,0x83,0x07,0x1d,0x01, 0x01,0x07,0x1c,0x01,0x84,0x06,0x1c,0x00,0x02,0x07,0x1c,0x01,0x07,0x1c,0x00, 0x83,0x06,0x1b,0x00,0x03,0x06,0x1b,0x01,0x07,0x1b,0x00,0x06,0x1b,0x00,0x82, 0x06,0x1b,0x01,0x82,0x06,0x1a,0x00,0x82,0x05,0x1a,0x00,0x03,0x06,0x1a,0x00, 0x05,0x1a,0x00,0x06,0x1a,0x00,0x82,0x05,0x1a,0x00,0x82,0x05,0x19,0x00,0x01, 0x06,0x1a,0x01,0x82,0x05,0x19,0x00,0x82,0x05,0x19,0x01,0x02,0x05,0x19,0x00, 0x05,0x17,0x00,0x83,0x05,0x18,0x00,0x01,0x05,0x18,0x01,0x83,0x05,0x17,0x00, 0x02,0x04,0x16,0x00,0x05,0x17,0x00,0x83,0x04,0x17,0x00,0x8a,0x04,0x16,0x00, 0x8b,0x04,0x15,0x00,0x89,0x04,0x14,0x00,0x88,0x04,0x13,0x00,0x82,0x04,0x13, 0x01,0x83,0x04,0x13,0x00,0x82,0x04,0x12,0x01,0x09,0x04,0x13,0x00,0x05,0x13, 0x00,0x05,0x14,0x00,0x05,0x15,0x01,0x06,0x15,0x01,0x07,0x16,0x01,0x07,0x16, 0x02,0x08,0x16,0x03,0x08,0x16,0x04,0x82,0x08,0x15,0x04,0x01,0x08,0x15,0x03, 0x82,0x08,0x15,0x04,0x02,0x08,0x15,0x03,0x07,0x14,0x03,0x83,0x08,0x14,0x03, 0x04,0x08,0x14,0x04,0x08,0x13,0x03,0x07,0x13,0x03,0x08,0x13,0x03,0x83,0x07, 0x13,0x03,0x02,0x07,0x12,0x03,0x07,0x12,0x04,0x82,0x07,0x11,0x03,0x85,0x06, 0x10,0x03,0x83,0x06,0x0f,0x03,0x84,0x05,0x0f,0x03,0x82,0x05,0x0e,0x03,0x02, 0x05,0x0e,0x02,0x05,0x0e,0x03,0x84,0x05,0x0d,0x02,0x82,0x04,0x0c,0x02,0x01, 0x05,0x0c,0x02,0x85,0x04,0x0b,0x02,0x84,0x04,0x0a,0x02,0x01,0x03,0x0a,0x02, 0x83,0x03,0x09,0x02,0x01,0x03,0x09,0x01,0x85,0x03,0x08,0x01,0x82,0x03,0x07, 0x01,0x83,0x02,0x07,0x01,0x82,0x02,0x06,0x01,0x86,0x02,0x05,0x01,0x05,0x02, 0x04,0x01,0x01,0x04,0x01,0x01,0x04,0x00,0x01,0x04,0x01,0x01,0x04,0x00,0x85, 0x01,0x03,0x00,0x83,0x01,0x02,0x00,0x82,0x00,0x02,0x00,0x85,0x00,0x01,0x00, 0xdd,0x00,0x00,0x00,0x01,0x3d,0x78,0x16,0x83,0x3c,0x76,0x14,0x83,0x3c,0x77, 0x15,0x04,0x3c,0x76,0x14,0x3b,0x76,0x15,0x3c,0x76,0x14,0x3c,0x77,0x15,0x82, 0x3c,0x76,0x14,0x03,0x3c,0x78,0x16,0x3d,0x78,0x16,0x3c,0x76,0x16,0x82,0x3b, 0x76,0x15,0x82,0x3c,0x76,0x14,0x82,0x3a,0x75,0x13,0x02,0x3c,0x76,0x14,0x3a, 0x75,0x14,0x83,0x3b,0x76,0x14,0x03,0x3c,0x76,0x14,0x3a,0x75,0x13,0x3a,0x76, 0x15,0x82,0x3a,0x76,0x14,0x01,0x3a,0x76,0x15,0x82,0x3a,0x75,0x14,0x82,0x3a, 0x76,0x14,0x82,0x3a,0x76,0x15,0x01,0x3b,0x76,0x15,0x82,0x3a,0x76,0x14,0x01, 0x3b,0x76,0x15,0x82,0x3a,0x75,0x14,0x82,0x3a,0x75,0x16,0x0d,0x39,0x75,0x15, 0x3c,0x75,0x16,0x3a,0x75,0x16,0x3a,0x75,0x15,0x3a,0x75,0x16,0x3a,0x75,0x15, 0x3a,0x74,0x16,0x39,0x75,0x16,0x3b,0x75,0x17,0x3a,0x73,0x16,0x3b,0x74,0x17, 0x3a,0x75,0x17,0x3a,0x76,0x17,0x82,0x3a,0x75,0x17,0x82,0x3c,0x74,0x17,0x02, 0x3b,0x74,0x18,0x3a,0x73,0x17,0x82,0x3a,0x75,0x18,0x01,0x3a,0x74,0x18,0x83, 0x3a,0x74,0x19,0x01,0x3c,0x74,0x19,0x82,0x3b,0x74,0x19,0x01,0x3a,0x73,0x18, 0x82,0x3b,0x73,0x1a,0x01,0x3a,0x73,0x1a,0x82,0x3b,0x73,0x1a,0x82,0x3c,0x74, 0x1b,0x06,0x3b,0x73,0x1a,0x3b,0x73,0x1c,0x3c,0x73,0x1c,0x3b,0x73,0x1c,0x3a, 0x72,0x1b,0x3b,0x73,0x1d,0x82,0x3c,0x72,0x1d,0x82,0x3c,0x73,0x1d,0x1e,0x3c, 0x72,0x1d,0x3b,0x73,0x1d,0x3c,0x73,0x1d,0x3b,0x71,0x1d,0x3a,0x71,0x1d,0x3a, 0x72,0x1d,0x3c,0x73,0x1d,0x3a,0x72,0x1c,0x3b,0x73,0x1e,0x3a,0x73,0x1e,0x3a, 0x73,0x1f,0x3c,0x70,0x1d,0x3b,0x71,0x1e,0x3a,0x71,0x1d,0x39,0x70,0x1d,0x3a, 0x71,0x1e,0x3b,0x71,0x1e,0x3a,0x71,0x1d,0x3a,0x70,0x1d,0x3c,0x72,0x1e,0x3a, 0x71,0x1d,0x3a,0x70,0x1d,0x3a,0x71,0x1d,0x39,0x70,0x1d,0x39,0x70,0x1e,0x39, 0x70,0x1c,0x39,0x71,0x1c,0x3a,0x70,0x1d,0x38,0x6f,0x1b,0x39,0x70,0x1c,0x82, 0x38,0x6f,0x1c,0x82,0x39,0x70,0x1c,0x05,0x39,0x6f,0x1c,0x39,0x6f,0x1d,0x38, 0x6f,0x1b,0x39,0x6f,0x1c,0x38,0x6e,0x1c,0x82,0x37,0x6d,0x1b,0x82,0x38,0x6e, 0x1c,0x01,0x38,0x6e,0x1a,0x82,0x37,0x6d,0x1a,0x01,0x37,0x6d,0x1b,0x83,0x37, 0x6d,0x1a,0x0d,0x35,0x6b,0x1a,0x36,0x6c,0x1b,0x37,0x6d,0x1a,0x35,0x6b,0x1a, 0x36,0x6c,0x1a,0x34,0x6a,0x19,0x35,0x6b,0x19,0x33,0x69,0x18,0x34,0x6a,0x19, 0x34,0x6a,0x18,0x35,0x6b,0x19,0x34,0x6a,0x19,0x34,0x6a,0x1a,0x83,0x33,0x69, 0x19,0x01,0x34,0x6a,0x1a,0x83,0x33,0x69,0x19,0x02,0x32,0x68,0x18,0x31,0x66, 0x18,0x82,0x32,0x67,0x19,0x03,0x31,0x66,0x18,0x32,0x66,0x19,0x32,0x65,0x18, 0x82,0x2f,0x65,0x17,0x02,0x31,0x66,0x17,0x30,0x66,0x16,0x82,0x31,0x66,0x18, 0x09,0x32,0x66,0x19,0x31,0x65,0x17,0x2e,0x62,0x15,0x2b,0x5f,0x14,0x25,0x58, 0x0f,0x22,0x55,0x0c,0x20,0x53,0x0b,0x1e,0x50,0x0b,0x1f,0x52,0x0b,0x82,0x21, 0x53,0x0c,0x0d,0x1f,0x52,0x0b,0x21,0x53,0x0c,0x1f,0x52,0x0b,0x1f,0x51,0x0a, 0x1f,0x52,0x0b,0x1f,0x53,0x0a,0x1e,0x51,0x08,0x1e,0x50,0x09,0x1f,0x51,0x0a, 0x1e,0x50,0x0a,0x1d,0x4f,0x09,0x1d,0x4f,0x0b,0x1d,0x4e,0x0a,0x85,0x1c,0x4e, 0x08,0x82,0x1b,0x4d,0x07,0x83,0x1c,0x4e,0x08,0x82,0x1b,0x4d,0x07,0x83,0x1a, 0x4c,0x08,0x04,0x1a,0x4b,0x07,0x1a,0x4c,0x08,0x1a,0x4b,0x07,0x19,0x4a,0x06, 0x82,0x19,0x4b,0x07,0x03,0x1a,0x4b,0x08,0x19,0x4a,0x07,0x19,0x4a,0x06,0x82, 0x18,0x4a,0x06,0x85,0x18,0x49,0x06,0x82,0x17,0x49,0x05,0x03,0x17,0x48,0x04, 0x18,0x48,0x05,0x17,0x49,0x05,0x82,0x18,0x49,0x06,0x03,0x17,0x49,0x05,0x17, 0x48,0x06,0x17,0x48,0x04,0x82,0x17,0x48,0x06,0x02,0x18,0x48,0x05,0x17,0x48, 0x04,0x82,0x17,0x48,0x06,0x01,0x17,0x48,0x04,0x82,0x17,0x49,0x05,0x01,0x17, 0x48,0x04,0x82,0x17,0x49,0x05,0x04,0x17,0x48,0x04,0x17,0x49,0x05,0x17,0x49, 0x04,0x17,0x49,0x05,0x82,0x17,0x48,0x04,0x03,0x16,0x49,0x04,0x16,0x48,0x04, 0x17,0x48,0x04,0x82,0x17,0x49,0x05,0x82,0x17,0x49,0x04,0x03,0x17,0x48,0x04, 0x17,0x49,0x05,0x17,0x49,0x04,0x82,0x17,0x4a,0x05,0x02,0x16,0x4a,0x05,0x17, 0x4a,0x05,0x83,0x17,0x49,0x04,0x83,0x17,0x4a,0x05,0x0a,0x18,0x4a,0x06,0x17, 0x49,0x04,0x16,0x49,0x04,0x17,0x4a,0x05,0x17,0x49,0x04,0x18,0x49,0x05,0x17, 0x4a,0x05,0x17,0x49,0x04,0x16,0x4a,0x04,0x17,0x49,0x04,0x82,0x17,0x4a,0x05, 0x03,0x17,0x49,0x05,0x17,0x4a,0x06,0x16,0x49,0x04,0x82,0x17,0x4a,0x06,0x82, 0x16,0x49,0x05,0x04,0x17,0x49,0x05,0x16,0x49,0x04,0x17,0x49,0x05,0x16,0x47, 0x05,0x82,0x16,0x47,0x04,0x02,0x15,0x47,0x03,0x16,0x46,0x04,0x83,0x15,0x45, 0x04,0x82,0x15,0x44,0x03,0x02,0x14,0x44,0x03,0x14,0x43,0x04,0x83,0x14,0x43, 0x03,0x83,0x14,0x42,0x04,0x01,0x14,0x42,0x03,0x83,0x13,0x40,0x04,0x82,0x13, 0x40,0x03,0x83,0x12,0x40,0x03,0x01,0x12,0x3f,0x03,0x82,0x13,0x3e,0x04,0x05, 0x12,0x3e,0x04,0x12,0x3f,0x04,0x12,0x3d,0x02,0x11,0x3d,0x02,0x12,0x3e,0x03, 0x84,0x11,0x3d,0x03,0x83,0x11,0x3c,0x03,0x01,0x11,0x3b,0x03,0x82,0x12,0x3b, 0x03,0x02,0x11,0x3c,0x03,0x10,0x3c,0x03,0x83,0x11,0x3a,0x03,0x03,0x10,0x3a, 0x03,0x11,0x39,0x03,0x10,0x39,0x03,0x83,0x0f,0x39,0x03,0x06,0x0f,0x38,0x03, 0x0f,0x37,0x02,0x10,0x38,0x03,0x0f,0x38,0x02,0x10,0x37,0x02,0x0f,0x38,0x03, 0x82,0x0f,0x37,0x03,0x82,0x0e,0x37,0x02,0x82,0x0f,0x37,0x03,0x03,0x0e,0x35, 0x02,0x0d,0x34,0x02,0x0e,0x35,0x02,0x83,0x0e,0x34,0x02,0x82,0x0d,0x34,0x02, 0x01,0x0e,0x34,0x02,0x82,0x0d,0x33,0x02,0x02,0x0d,0x34,0x02,0x0e,0x33,0x02, 0x82,0x0d,0x32,0x01,0x83,0x0e,0x32,0x02,0x01,0x0d,0x31,0x01,0x83,0x0c,0x31, 0x01,0x05,0x0c,0x30,0x01,0x0e,0x31,0x02,0x0d,0x30,0x01,0x0d,0x31,0x02,0x0c, 0x31,0x02,0x82,0x0c,0x30,0x02,0x82,0x0c,0x2f,0x01,0x83,0x0c,0x2f,0x02,0x01, 0x0c,0x2f,0x01,0x82,0x0c,0x2e,0x02,0x05,0x0d,0x2e,0x02,0x0c,0x2d,0x02,0x0d, 0x2d,0x02,0x0b,0x2d,0x01,0x0c,0x2d,0x02,0x82,0x0c,0x2d,0x01,0x01,0x0c,0x2d, 0x02,0x82,0x0c,0x2c,0x02,0x01,0x0b,0x2d,0x02,0x83,0x0b,0x2c,0x02,0x01,0x0b, 0x2b,0x02,0x82,0x0b,0x2c,0x02,0x04,0x0b,0x2a,0x02,0x0b,0x2b,0x02,0x0b,0x2a, 0x02,0x0b,0x2a,0x03,0x83,0x0b,0x2a,0x02,0x01,0x0b,0x29,0x02,0x82,0x0b,0x29, 0x01,0x02,0x0b,0x29,0x02,0x0b,0x29,0x01,0x82,0x0a,0x28,0x01,0x82,0x0a,0x28, 0x02,0x01,0x09,0x27,0x01,0x83,0x0a,0x28,0x01,0x01,0x0a,0x27,0x02,0x82,0x09, 0x27,0x01,0x05,0x09,0x26,0x00,0x09,0x26,0x01,0x09,0x27,0x02,0x09,0x26,0x02, 0x09,0x26,0x01,0x83,0x09,0x25,0x01,0x82,0x09,0x25,0x02,0x02,0x09,0x24,0x01, 0x09,0x25,0x02,0x83,0x09,0x24,0x01,0x05,0x09,0x23,0x01,0x09,0x24,0x01,0x09, 0x23,0x01,0x09,0x24,0x01,0x09,0x23,0x02,0x83,0x08,0x23,0x01,0x01,0x09,0x23, 0x02,0x82,0x09,0x23,0x01,0x87,0x08,0x22,0x01,0x02,0x08,0x21,0x00,0x08,0x20, 0x01,0x82,0x08,0x21,0x01,0x83,0x08,0x20,0x01,0x01,0x07,0x1f,0x01,0x83,0x08, 0x1f,0x01,0x01,0x07,0x1f,0x01,0x87,0x07,0x1e,0x01,0x01,0x07,0x1d,0x00,0x82, 0x07,0x1d,0x01,0x04,0x06,0x1d,0x00,0x07,0x1d,0x01,0x06,0x1c,0x00,0x07,0x1d, 0x01,0x82,0x07,0x1c,0x01,0x83,0x06,0x1c,0x00,0x07,0x06,0x1c,0x01,0x06,0x1b, 0x00,0x07,0x1c,0x00,0x07,0x1b,0x01,0x06,0x1b,0x01,0x06,0x1a,0x00,0x06,0x1b, 0x00,0x87,0x06,0x1a,0x00,0x87,0x06,0x19,0x00,0x01,0x05,0x19,0x00,0x82,0x05, 0x18,0x00,0x01,0x06,0x18,0x00,0x83,0x05,0x18,0x00,0x08,0x05,0x17,0x00,0x04, 0x17,0x00,0x05,0x17,0x00,0x06,0x18,0x00,0x05,0x17,0x00,0x04,0x17,0x00,0x05, 0x17,0x00,0x04,0x16,0x00,0x84,0x04,0x17,0x00,0x86,0x04,0x16,0x00,0x84,0x04, 0x15,0x00,0x90,0x04,0x14,0x00,0x8c,0x04,0x13,0x00,0x82,0x04,0x12,0x00,0x84, 0x04,0x12,0x01,0x04,0x04,0x13,0x01,0x06,0x14,0x01,0x06,0x15,0x01,0x06,0x16, 0x01,0x82,0x07,0x16,0x02,0x82,0x08,0x16,0x04,0x03,0x08,0x15,0x03,0x08,0x15, 0x04,0x08,0x15,0x03,0x83,0x08,0x14,0x03,0x01,0x08,0x14,0x04,0x86,0x08,0x13, 0x03,0x01,0x07,0x13,0x03,0x84,0x07,0x12,0x03,0x82,0x07,0x11,0x03,0x02,0x06, 0x11,0x03,0x06,0x10,0x03,0x87,0x06,0x0f,0x03,0x83,0x06,0x0e,0x03,0x02,0x05, 0x0e,0x02,0x06,0x0e,0x03,0x85,0x05,0x0d,0x02,0x02,0x04,0x0c,0x02,0x05,0x0c, 0x02,0x83,0x04,0x0c,0x02,0x84,0x04,0x0b,0x02,0x82,0x04,0x0a,0x02,0x01,0x03, 0x0a,0x02,0x83,0x03,0x09,0x02,0x01,0x03,0x09,0x01,0x86,0x03,0x08,0x01,0x01, 0x03,0x07,0x01,0x83,0x02,0x07,0x01,0x85,0x02,0x06,0x01,0x82,0x02,0x05,0x01, 0x01,0x02,0x04,0x01,0x83,0x01,0x04,0x01,0x82,0x01,0x04,0x00,0x85,0x01,0x03, 0x00,0x83,0x01,0x02,0x00,0x82,0x00,0x02,0x00,0x85,0x00,0x01,0x00,0xdd,0x00, 0x00,0x00,0x82,0x3d,0x78,0x15,0x83,0x3c,0x78,0x15,0x01,0x3c,0x77,0x14,0x82, 0x3d,0x78,0x15,0x01,0x3c,0x78,0x16,0x82,0x3c,0x78,0x15,0x82,0x3c,0x77,0x14, 0x82,0x3c,0x78,0x15,0x04,0x3c,0x78,0x16,0x3b,0x77,0x14,0x3c,0x77,0x14,0x3c, 0x78,0x15,0x85,0x3c,0x77,0x14,0x01,0x3b,0x77,0x14,0x84,0x3c,0x77,0x14,0x0a, 0x3c,0x78,0x15,0x3c,0x78,0x16,0x3b,0x78,0x15,0x3b,0x76,0x13,0x3b,0x76,0x14, 0x3c,0x77,0x15,0x3d,0x78,0x15,0x3b,0x77,0x14,0x39,0x76,0x14,0x3b,0x76,0x14, 0x85,0x3b,0x77,0x15,0x83,0x3b,0x77,0x16,0x05,0x3b,0x76,0x15,0x3b,0x76,0x14, 0x3b,0x77,0x16,0x3b,0x76,0x15,0x3b,0x77,0x16,0x82,0x3b,0x76,0x16,0x02,0x3a, 0x76,0x16,0x3b,0x77,0x16,0x83,0x3b,0x76,0x17,0x02,0x3b,0x75,0x16,0x3b,0x74, 0x16,0x83,0x3b,0x76,0x17,0x82,0x3c,0x75,0x18,0x82,0x3b,0x76,0x19,0x0c,0x3b, 0x76,0x18,0x3b,0x76,0x19,0x3b,0x75,0x19,0x3b,0x76,0x1a,0x3c,0x75,0x1a,0x3c, 0x75,0x19,0x3b,0x75,0x19,0x3c,0x76,0x1a,0x3c,0x75,0x1a,0x3b,0x74,0x1a,0x3c, 0x75,0x1b,0x3b,0x74,0x1a,0x84,0x3c,0x75,0x1b,0x04,0x3b,0x73,0x1b,0x3c,0x75, 0x1c,0x3c,0x74,0x1c,0x3b,0x73,0x1b,0x82,0x3b,0x73,0x1c,0x82,0x3c,0x73,0x1d, 0x02,0x3c,0x74,0x1d,0x3b,0x73,0x1c,0x82,0x3c,0x74,0x1d,0x83,0x3c,0x73,0x1e, 0x05,0x3c,0x75,0x1e,0x3c,0x74,0x1d,0x3c,0x74,0x1e,0x3b,0x73,0x1e,0x39,0x71, 0x1c,0x82,0x3c,0x73,0x1f,0x03,0x3c,0x73,0x1e,0x3b,0x72,0x1e,0x3c,0x73,0x1e, 0x83,0x3b,0x72,0x1e,0x0b,0x3b,0x72,0x1d,0x3b,0x72,0x1e,0x3b,0x72,0x1d,0x3b, 0x72,0x1e,0x3a,0x72,0x1d,0x3a,0x72,0x1e,0x3a,0x71,0x1e,0x3a,0x72,0x1d,0x3b, 0x72,0x1e,0x39,0x71,0x1c,0x3a,0x72,0x1d,0x84,0x39,0x71,0x1c,0x0f,0x3a,0x71, 0x1c,0x39,0x70,0x1d,0x39,0x70,0x1b,0x39,0x71,0x1c,0x39,0x70,0x1d,0x39,0x70, 0x1c,0x39,0x70,0x1d,0x39,0x70,0x1b,0x38,0x6f,0x1c,0x39,0x70,0x1c,0x38,0x6e, 0x1b,0x38,0x6f,0x1c,0x38,0x6e,0x1b,0x37,0x6e,0x1b,0x38,0x6f,0x1c,0x83,0x37, 0x6e,0x1b,0x14,0x36,0x6d,0x1b,0x37,0x6d,0x1a,0x37,0x6e,0x1c,0x37,0x6d,0x1a, 0x36,0x6d,0x1b,0x36,0x6c,0x19,0x37,0x6d,0x1b,0x36,0x6d,0x1a,0x36,0x6e,0x1a, 0x36,0x6c,0x1a,0x35,0x6c,0x1a,0x35,0x6c,0x1b,0x34,0x6b,0x1a,0x35,0x6c,0x1b, 0x35,0x6c,0x1a,0x34,0x6b,0x19,0x35,0x6c,0x1b,0x33,0x6a,0x19,0x33,0x69,0x19, 0x34,0x6b,0x1a,0x82,0x33,0x69,0x1a,0x1c,0x32,0x69,0x18,0x33,0x68,0x18,0x33, 0x68,0x19,0x32,0x68,0x19,0x31,0x67,0x19,0x32,0x68,0x19,0x32,0x67,0x18,0x2f, 0x65,0x16,0x30,0x66,0x17,0x31,0x65,0x17,0x32,0x67,0x18,0x31,0x66,0x17,0x32, 0x66,0x18,0x31,0x65,0x19,0x31,0x65,0x17,0x2e,0x62,0x15,0x29,0x5e,0x12,0x26, 0x5a,0x0f,0x21,0x55,0x0b,0x1f,0x53,0x09,0x1f,0x52,0x0a,0x20,0x53,0x0b,0x1f, 0x52,0x0a,0x20,0x53,0x0b,0x20,0x53,0x0a,0x1f,0x53,0x0b,0x1f,0x53,0x0a,0x1f, 0x51,0x0b,0x82,0x1e,0x51,0x0a,0x01,0x1f,0x51,0x0b,0x82,0x1e,0x50,0x0a,0x02, 0x1c,0x4f,0x08,0x1d,0x50,0x09,0x82,0x1c,0x50,0x09,0x01,0x1d,0x50,0x09,0x82, 0x1c,0x4f,0x08,0x01,0x1d,0x50,0x09,0x83,0x1c,0x4f,0x08,0x01,0x1b,0x4e,0x07, 0x83,0x1b,0x4e,0x08,0x03,0x1b,0x4d,0x08,0x1a,0x4c,0x07,0x1b,0x4e,0x08,0x84, 0x1a,0x4c,0x07,0x08,0x19,0x4b,0x06,0x1a,0x4c,0x08,0x19,0x4b,0x07,0x19,0x4b, 0x06,0x18,0x4a,0x06,0x19,0x4a,0x06,0x18,0x4a,0x06,0x17,0x4a,0x05,0x83,0x18, 0x4a,0x06,0x01,0x17,0x4a,0x05,0x82,0x18,0x49,0x05,0x04,0x17,0x4a,0x05,0x18, 0x4a,0x06,0x17,0x4a,0x05,0x17,0x49,0x06,0x82,0x17,0x4a,0x05,0x82,0x18,0x49, 0x05,0x01,0x17,0x49,0x05,0x82,0x17,0x49,0x06,0x03,0x17,0x49,0x05,0x17,0x49, 0x06,0x18,0x49,0x06,0x83,0x17,0x4a,0x05,0x04,0x17,0x49,0x05,0x17,0x4a,0x05, 0x17,0x49,0x05,0x17,0x4a,0x05,0x82,0x17,0x49,0x05,0x06,0x17,0x4a,0x05,0x16, 0x4a,0x05,0x17,0x49,0x05,0x17,0x4a,0x05,0x18,0x4a,0x06,0x17,0x4a,0x05,0x82, 0x16,0x4a,0x04,0x03,0x17,0x49,0x04,0x17,0x4a,0x05,0x18,0x4a,0x05,0x82,0x17, 0x4b,0x05,0x01,0x16,0x4a,0x04,0x82,0x17,0x4a,0x05,0x83,0x17,0x4b,0x05,0x82, 0x17,0x4a,0x05,0x04,0x17,0x4a,0x03,0x17,0x4a,0x05,0x17,0x4b,0x05,0x17,0x4a, 0x05,0x82,0x17,0x4b,0x05,0x01,0x17,0x4a,0x05,0x83,0x16,0x4b,0x05,0x04,0x17, 0x4b,0x05,0x17,0x4a,0x05,0x18,0x4b,0x06,0x17,0x49,0x05,0x82,0x17,0x4a,0x05, 0x02,0x16,0x4b,0x06,0x16,0x4a,0x05,0x82,0x17,0x49,0x05,0x01,0x16,0x48,0x05, 0x82,0x16,0x47,0x05,0x02,0x17,0x48,0x05,0x15,0x48,0x03,0x82,0x16,0x47,0x05, 0x09,0x15,0x46,0x04,0x15,0x45,0x03,0x16,0x46,0x04,0x15,0x45,0x03,0x14,0x45, 0x03,0x15,0x45,0x05,0x14,0x44,0x05,0x15,0x44,0x03,0x14,0x43,0x03,0x83,0x14, 0x42,0x03,0x01,0x14,0x42,0x04,0x82,0x14,0x42,0x05,0x01,0x13,0x41,0x05,0x82, 0x13,0x41,0x03,0x82,0x12,0x41,0x03,0x07,0x13,0x41,0x04,0x13,0x40,0x03,0x12, 0x40,0x03,0x12,0x3f,0x04,0x14,0x3f,0x05,0x12,0x3f,0x04,0x12,0x3f,0x03,0x82, 0x11,0x3f,0x03,0x01,0x11,0x3d,0x03,0x82,0x12,0x3e,0x04,0x83,0x12,0x3d,0x04, 0x04,0x11,0x3d,0x03,0x11,0x3c,0x03,0x11,0x3b,0x02,0x11,0x3b,0x03,0x82,0x10, 0x3c,0x03,0x82,0x12,0x3b,0x03,0x03,0x11,0x3b,0x03,0x10,0x3a,0x02,0x11,0x39, 0x02,0x82,0x10,0x3a,0x03,0x82,0x10,0x3b,0x03,0x01,0x10,0x39,0x03,0x82,0x10, 0x38,0x03,0x09,0x10,0x38,0x02,0x0f,0x38,0x03,0x0f,0x38,0x02,0x10,0x38,0x03, 0x0f,0x37,0x02,0x0f,0x38,0x03,0x0f,0x37,0x02,0x0f,0x36,0x02,0x0f,0x36,0x03, 0x82,0x0f,0x37,0x02,0x82,0x0f,0x36,0x03,0x05,0x0f,0x35,0x02,0x0e,0x35,0x02, 0x0e,0x34,0x02,0x0d,0x35,0x02,0x0e,0x34,0x02,0x83,0x0d,0x34,0x02,0x83,0x0e, 0x33,0x01,0x82,0x0e,0x33,0x02,0x05,0x0d,0x32,0x02,0x0d,0x32,0x01,0x0d,0x33, 0x02,0x0d,0x32,0x02,0x0e,0x32,0x02,0x82,0x0d,0x32,0x02,0x01,0x0d,0x31,0x01, 0x82,0x0c,0x31,0x01,0x01,0x0c,0x31,0x02,0x83,0x0d,0x31,0x02,0x07,0x0d,0x30, 0x02,0x0c,0x30,0x02,0x0d,0x30,0x02,0x0c,0x2f,0x01,0x0c,0x2e,0x02,0x0c,0x2f, 0x01,0x0d,0x2f,0x02,0x82,0x0d,0x2e,0x02,0x82,0x0c,0x2e,0x02,0x03,0x0c,0x2e, 0x01,0x0c,0x2d,0x01,0x0b,0x2d,0x01,0x82,0x0c,0x2d,0x02,0x01,0x0c,0x2c,0x02, 0x83,0x0b,0x2c,0x02,0x01,0x0b,0x2c,0x01,0x82,0x0b,0x2c,0x02,0x06,0x0c,0x2c, 0x02,0x0b,0x2c,0x01,0x0b,0x2a,0x01,0x0b,0x2b,0x02,0x0b,0x2a,0x02,0x0b,0x2a, 0x01,0x82,0x0b,0x2a,0x02,0x04,0x0b,0x29,0x01,0x0b,0x2a,0x02,0x0c,0x2a,0x02, 0x0b,0x29,0x01,0x83,0x0a,0x29,0x01,0x82,0x0a,0x28,0x01,0x82,0x0b,0x28,0x01, 0x04,0x0a,0x28,0x01,0x0a,0x28,0x02,0x09,0x28,0x02,0x0a,0x28,0x01,0x83,0x0a, 0x27,0x01,0x82,0x0a,0x27,0x02,0x03,0x0a,0x26,0x01,0x0a,0x27,0x02,0x0a,0x26, 0x01,0x82,0x09,0x25,0x01,0x85,0x0a,0x25,0x02,0x01,0x0a,0x24,0x02,0x82,0x09, 0x24,0x01,0x03,0x08,0x24,0x00,0x09,0x24,0x02,0x09,0x23,0x01,0x83,0x08,0x23, 0x01,0x83,0x09,0x23,0x01,0x01,0x09,0x22,0x01,0x85,0x08,0x22,0x01,0x85,0x08, 0x21,0x01,0x85,0x08,0x20,0x01,0x82,0x07,0x20,0x01,0x01,0x08,0x1f,0x01,0x84, 0x07,0x1f,0x01,0x03,0x08,0x1f,0x01,0x07,0x1e,0x01,0x07,0x1e,0x00,0x82,0x07, 0x1e,0x01,0x01,0x06,0x1d,0x00,0x82,0x07,0x1d,0x01,0x82,0x06,0x1c,0x00,0x07, 0x07,0x1c,0x01,0x06,0x1c,0x00,0x06,0x1c,0x01,0x06,0x1c,0x00,0x06,0x1b,0x00, 0x06,0x1c,0x01,0x06,0x1b,0x00,0x83,0x06,0x1b,0x01,0x05,0x06,0x1b,0x00,0x06, 0x1a,0x00,0x06,0x1b,0x00,0x07,0x1b,0x01,0x06,0x1b,0x00,0x88,0x06,0x1a,0x00, 0x83,0x05,0x19,0x00,0x02,0x06,0x19,0x00,0x05,0x19,0x00,0x83,0x05,0x18,0x00, 0x02,0x06,0x18,0x00,0x05,0x18,0x00,0x87,0x05,0x17,0x00,0x01,0x05,0x16,0x00, 0x82,0x05,0x17,0x00,0x89,0x05,0x16,0x00,0x01,0x05,0x15,0x00,0x88,0x04,0x15, 0x00,0x82,0x04,0x14,0x00,0x82,0x05,0x14,0x00,0x82,0x04,0x14,0x00,0x07,0x05, 0x14,0x00,0x04,0x14,0x00,0x05,0x14,0x00,0x04,0x14,0x00,0x04,0x13,0x00,0x05, 0x13,0x00,0x04,0x13,0x00,0x82,0x05,0x14,0x00,0x06,0x04,0x13,0x00,0x05,0x13, 0x00,0x04,0x13,0x00,0x04,0x12,0x01,0x05,0x12,0x00,0x05,0x12,0x01,0x82,0x05, 0x12,0x00,0x83,0x04,0x12,0x00,0x83,0x05,0x12,0x00,0x09,0x05,0x12,0x01,0x05, 0x13,0x01,0x06,0x14,0x01,0x06,0x15,0x01,0x06,0x15,0x02,0x07,0x15,0x02,0x08, 0x15,0x03,0x08,0x16,0x04,0x08,0x15,0x03,0x82,0x08,0x15,0x04,0x86,0x08,0x14, 0x03,0x01,0x08,0x13,0x03,0x88,0x07,0x12,0x03,0x83,0x07,0x11,0x03,0x03,0x06, 0x10,0x03,0x06,0x10,0x02,0x06,0x0f,0x02,0x85,0x06,0x0f,0x03,0x02,0x06,0x0e, 0x03,0x05,0x0e,0x02,0x82,0x06,0x0e,0x03,0x85,0x05,0x0d,0x02,0x85,0x05,0x0c, 0x02,0x82,0x05,0x0b,0x02,0x82,0x04,0x0b,0x02,0x82,0x04,0x0a,0x02,0x83,0x03, 0x0a,0x02,0x01,0x03,0x09,0x01,0x85,0x03,0x08,0x01,0x82,0x03,0x07,0x01,0x83, 0x02,0x07,0x01,0x85,0x02,0x06,0x01,0x84,0x02,0x05,0x01,0x01,0x01,0x05,0x01, 0x83,0x01,0x04,0x00,0x85,0x01,0x03,0x00,0x83,0x01,0x02,0x00,0x82,0x00,0x02, 0x00,0x85,0x00,0x01,0x00,0xdd,0x00,0x00,0x00,0x02,0x3d,0x79,0x15,0x3e,0x7a, 0x15,0x82,0x3c,0x7a,0x15,0x03,0x3d,0x7a,0x15,0x3e,0x7a,0x15,0x3e,0x7a,0x16, 0x82,0x3d,0x79,0x15,0x82,0x3c,0x79,0x14,0x07,0x3e,0x7a,0x17,0x3e,0x7a,0x15, 0x3c,0x79,0x14,0x3c,0x78,0x14,0x3d,0x79,0x16,0x3c,0x79,0x14,0x3c,0x78,0x14, 0x85,0x3c,0x79,0x14,0x04,0x3d,0x79,0x16,0x3c,0x78,0x14,0x3c,0x79,0x14,0x3b, 0x79,0x15,0x83,0x3c,0x78,0x14,0x03,0x3c,0x78,0x15,0x3b,0x78,0x14,0x3c,0x78, 0x14,0x82,0x3c,0x78,0x15,0x03,0x3c,0x78,0x14,0x3b,0x78,0x13,0x3b,0x78,0x14, 0x82,0x3c,0x78,0x15,0x01,0x3b,0x79,0x15,0x82,0x3b,0x78,0x14,0x82,0x3b,0x78, 0x15,0x83,0x3b,0x77,0x15,0x09,0x3b,0x77,0x14,0x3b,0x78,0x15,0x3b,0x77,0x15, 0x3b,0x78,0x17,0x3c,0x78,0x17,0x3b,0x77,0x17,0x3b,0x78,0x17,0x3b,0x77,0x17, 0x3c,0x77,0x17,0x82,0x3b,0x77,0x17,0x82,0x3b,0x78,0x17,0x09,0x3b,0x77,0x17, 0x3c,0x76,0x17,0x3c,0x77,0x17,0x3c,0x77,0x18,0x3c,0x78,0x19,0x3b,0x77,0x18, 0x3c,0x78,0x19,0x3b,0x77,0x18,0x3c,0x77,0x19,0x82,0x3b,0x76,0x19,0x01,0x3c, 0x75,0x1a,0x84,0x3c,0x76,0x1b,0x03,0x3c,0x75,0x1a,0x3d,0x77,0x1c,0x3c,0x75, 0x1b,0x83,0x3c,0x76,0x1b,0x85,0x3c,0x75,0x1c,0x82,0x3b,0x74,0x1c,0x02,0x3c, 0x75,0x1d,0x3c,0x74,0x1d,0x83,0x3c,0x75,0x1d,0x02,0x3d,0x76,0x1f,0x3c,0x75, 0x1f,0x82,0x3b,0x74,0x1d,0x01,0x3c,0x75,0x1e,0x82,0x3c,0x74,0x1d,0x82,0x3c, 0x74,0x1e,0x02,0x3c,0x75,0x1e,0x3b,0x74,0x1d,0x82,0x3c,0x75,0x1e,0x01,0x3b, 0x74,0x1d,0x83,0x3c,0x75,0x1e,0x01,0x3c,0x74,0x1e,0x82,0x3c,0x74,0x1f,0x01, 0x3c,0x74,0x1e,0x82,0x3b,0x74,0x1e,0x02,0x3b,0x73,0x1d,0x3b,0x73,0x1f,0x82, 0x3b,0x74,0x1e,0x03,0x3a,0x73,0x1d,0x3b,0x73,0x1d,0x3b,0x74,0x1e,0x82,0x3a, 0x73,0x1d,0x02,0x3b,0x73,0x1f,0x3b,0x72,0x1e,0x82,0x3b,0x73,0x1d,0x04,0x3a, 0x71,0x1d,0x39,0x70,0x1c,0x39,0x71,0x1b,0x3a,0x71,0x1c,0x83,0x3a,0x71,0x1d, 0x04,0x39,0x70,0x1c,0x38,0x6f,0x1b,0x38,0x70,0x1c,0x3a,0x71,0x1d,0x82,0x38, 0x6f,0x1b,0x03,0x38,0x70,0x1c,0x38,0x6f,0x1b,0x37,0x6e,0x1a,0x82,0x38,0x6f, 0x1b,0x83,0x37,0x6f,0x1c,0x04,0x36,0x6f,0x1a,0x37,0x6f,0x1c,0x37,0x6e,0x1b, 0x35,0x6c,0x19,0x82,0x36,0x6d,0x1b,0x01,0x36,0x6d,0x1a,0x82,0x35,0x6c,0x19, 0x01,0x36,0x6d,0x1a,0x82,0x34,0x6b,0x19,0x06,0x35,0x6c,0x1b,0x33,0x6b,0x19, 0x33,0x6a,0x18,0x33,0x6b,0x19,0x34,0x6a,0x17,0x34,0x6a,0x18,0x82,0x32,0x69, 0x19,0x82,0x33,0x68,0x19,0x01,0x33,0x68,0x18,0x82,0x32,0x68,0x18,0x02,0x32, 0x67,0x18,0x31,0x66,0x17,0x82,0x31,0x67,0x17,0x09,0x31,0x66,0x17,0x32,0x67, 0x18,0x33,0x69,0x19,0x32,0x68,0x18,0x31,0x66,0x17,0x2d,0x62,0x14,0x29,0x5e, 0x12,0x25,0x59,0x0e,0x21,0x55,0x0b,0x82,0x1f,0x52,0x0a,0x0c,0x20,0x54,0x0b, 0x20,0x54,0x0c,0x1f,0x52,0x0b,0x20,0x53,0x0b,0x20,0x53,0x0a,0x20,0x54,0x0b, 0x1f,0x52,0x0a,0x1f,0x52,0x09,0x1d,0x51,0x09,0x1e,0x51,0x0a,0x1e,0x52,0x0a, 0x1f,0x52,0x0a,0x82,0x1e,0x51,0x0a,0x82,0x1d,0x51,0x09,0x02,0x1d,0x50,0x09, 0x1d,0x51,0x09,0x82,0x1d,0x50,0x09,0x0c,0x1c,0x50,0x08,0x1d,0x50,0x0a,0x1c, 0x4f,0x09,0x1b,0x4e,0x08,0x1c,0x4d,0x08,0x1c,0x4f,0x09,0x1b,0x4e,0x08,0x1a, 0x4d,0x07,0x19,0x4c,0x07,0x1a,0x4c,0x07,0x19,0x4c,0x06,0x19,0x4d,0x07,0x84, 0x19,0x4c,0x06,0x83,0x18,0x4b,0x06,0x82,0x19,0x4c,0x06,0x83,0x18,0x4a,0x05, 0x83,0x17,0x4a,0x05,0x03,0x18,0x4a,0x06,0x18,0x4b,0x05,0x17,0x4a,0x05,0x83, 0x18,0x49,0x05,0x07,0x18,0x49,0x06,0x17,0x49,0x06,0x17,0x4a,0x05,0x18,0x49, 0x06,0x18,0x4a,0x06,0x18,0x4b,0x05,0x17,0x4a,0x05,0x82,0x17,0x49,0x06,0x01, 0x18,0x4b,0x05,0x82,0x17,0x4a,0x05,0x08,0x18,0x49,0x05,0x17,0x4a,0x05,0x18, 0x4b,0x05,0x17,0x4a,0x05,0x16,0x4a,0x04,0x18,0x49,0x05,0x17,0x4a,0x05,0x18, 0x4b,0x05,0x82,0x17,0x4b,0x05,0x02,0x17,0x4a,0x05,0x18,0x4b,0x06,0x86,0x18, 0x4b,0x05,0x85,0x17,0x4b,0x05,0x05,0x18,0x4c,0x04,0x18,0x4c,0x05,0x17,0x4b, 0x05,0x17,0x4b,0x03,0x18,0x4c,0x04,0x82,0x17,0x4b,0x05,0x02,0x18,0x4c,0x05, 0x17,0x4b,0x04,0x83,0x17,0x4b,0x05,0x03,0x18,0x4b,0x05,0x17,0x4a,0x05,0x17, 0x4a,0x04,0x82,0x18,0x4b,0x05,0x0d,0x18,0x4c,0x06,0x18,0x4a,0x05,0x17,0x4a, 0x04,0x17,0x4b,0x05,0x17,0x49,0x04,0x16,0x4a,0x04,0x15,0x48,0x03,0x16,0x48, 0x05,0x16,0x47,0x04,0x17,0x48,0x05,0x16,0x47,0x05,0x14,0x47,0x03,0x16,0x47, 0x05,0x83,0x15,0x46,0x04,0x01,0x14,0x45,0x05,0x82,0x14,0x44,0x04,0x82,0x14, 0x44,0x03,0x82,0x14,0x43,0x04,0x03,0x14,0x43,0x05,0x14,0x43,0x04,0x13,0x43, 0x03,0x83,0x14,0x42,0x04,0x02,0x13,0x41,0x03,0x14,0x41,0x04,0x82,0x13,0x41, 0x03,0x03,0x13,0x40,0x05,0x14,0x40,0x05,0x13,0x40,0x03,0x82,0x12,0x40,0x03, 0x0b,0x12,0x3f,0x04,0x12,0x40,0x05,0x12,0x3f,0x04,0x11,0x3f,0x03,0x11,0x3e, 0x03,0x12,0x3e,0x03,0x11,0x3e,0x03,0x12,0x3e,0x04,0x12,0x3e,0x03,0x12,0x3d, 0x03,0x11,0x3d,0x03,0x82,0x11,0x3c,0x03,0x82,0x12,0x3c,0x03,0x03,0x11,0x3c, 0x03,0x10,0x3b,0x03,0x11,0x3c,0x03,0x83,0x11,0x3b,0x03,0x82,0x10,0x3a,0x03, 0x10,0x10,0x3a,0x02,0x0f,0x3a,0x02,0x10,0x39,0x02,0x0f,0x38,0x02,0x0f,0x38, 0x03,0x10,0x38,0x03,0x0f,0x37,0x02,0x0f,0x38,0x03,0x0f,0x37,0x03,0x0f,0x36, 0x02,0x0e,0x37,0x02,0x0f,0x38,0x03,0x0f,0x37,0x02,0x0e,0x36,0x02,0x0f,0x36, 0x03,0x0e,0x36,0x03,0x83,0x0e,0x36,0x02,0x06,0x0e,0x34,0x02,0x0d,0x35,0x02, 0x0e,0x35,0x03,0x0e,0x35,0x02,0x0e,0x34,0x02,0x0f,0x34,0x02,0x82,0x0e,0x34, 0x02,0x01,0x0e,0x35,0x02,0x82,0x0e,0x33,0x02,0x82,0x0d,0x33,0x02,0x82,0x0e, 0x33,0x02,0x82,0x0c,0x33,0x02,0x09,0x0c,0x32,0x02,0x0c,0x31,0x01,0x0c,0x31, 0x02,0x0d,0x31,0x02,0x0d,0x31,0x01,0x0e,0x31,0x02,0x0d,0x30,0x01,0x0d,0x31, 0x02,0x0c,0x31,0x02,0x83,0x0c,0x30,0x02,0x01,0x0c,0x2f,0x02,0x82,0x0c,0x2e, 0x02,0x02,0x0d,0x2f,0x02,0x0c,0x2f,0x02,0x82,0x0c,0x2e,0x01,0x02,0x0c,0x2e, 0x02,0x0c,0x2e,0x01,0x82,0x0c,0x2d,0x02,0x01,0x0b,0x2d,0x02,0x84,0x0c,0x2d, 0x02,0x82,0x0c,0x2c,0x02,0x83,0x0b,0x2b,0x02,0x83,0x0b,0x2b,0x01,0x82,0x0b, 0x2a,0x02,0x02,0x0a,0x2a,0x01,0x0b,0x2a,0x02,0x83,0x0b,0x2a,0x01,0x02,0x0a, 0x2a,0x01,0x0a,0x29,0x01,0x82,0x0a,0x28,0x01,0x07,0x0a,0x29,0x01,0x0a,0x28, 0x01,0x09,0x29,0x01,0x0a,0x28,0x02,0x09,0x28,0x01,0x0a,0x28,0x01,0x0a,0x28, 0x02,0x83,0x0a,0x27,0x01,0x06,0x0a,0x26,0x01,0x0a,0x27,0x02,0x0a,0x26,0x02, 0x09,0x26,0x01,0x09,0x25,0x01,0x09,0x26,0x02,0x82,0x0a,0x26,0x02,0x86,0x09, 0x25,0x01,0x82,0x09,0x24,0x01,0x01,0x09,0x24,0x02,0x83,0x09,0x24,0x01,0x02, 0x09,0x23,0x00,0x09,0x23,0x01,0x82,0x09,0x22,0x01,0x01,0x09,0x23,0x01,0x85, 0x09,0x22,0x01,0x82,0x08,0x22,0x01,0x83,0x08,0x21,0x01,0x01,0x09,0x21,0x01, 0x83,0x08,0x21,0x01,0x02,0x08,0x20,0x01,0x07,0x20,0x01,0x82,0x08,0x20,0x01, 0x84,0x07,0x1f,0x01,0x03,0x08,0x1f,0x01,0x07,0x1e,0x00,0x07,0x1d,0x01,0x83, 0x06,0x1d,0x00,0x82,0x07,0x1d,0x01,0x0b,0x06,0x1c,0x00,0x07,0x1d,0x01,0x06, 0x1c,0x01,0x07,0x1d,0x01,0x06,0x1c,0x00,0x07,0x1c,0x01,0x06,0x1c,0x01,0x06, 0x1c,0x00,0x06,0x1b,0x00,0x06,0x1b,0x01,0x06,0x1c,0x00,0x87,0x06,0x1b,0x00, 0x02,0x06,0x1a,0x00,0x06,0x1b,0x01,0x82,0x06,0x1a,0x00,0x83,0x06,0x19,0x00, 0x83,0x05,0x19,0x00,0x87,0x05,0x18,0x00,0x8a,0x05,0x17,0x00,0x05,0x05,0x16, 0x00,0x05,0x17,0x00,0x04,0x16,0x00,0x05,0x17,0x00,0x05,0x16,0x00,0x83,0x04, 0x15,0x00,0x02,0x05,0x15,0x00,0x05,0x16,0x00,0x86,0x04,0x15,0x00,0x89,0x04, 0x14,0x00,0x82,0x04,0x13,0x00,0x82,0x05,0x13,0x00,0x82,0x05,0x14,0x00,0x88, 0x04,0x13,0x00,0x01,0x05,0x13,0x00,0x82,0x04,0x12,0x00,0x01,0x05,0x12,0x00, 0x82,0x04,0x12,0x00,0x0a,0x04,0x11,0x01,0x03,0x11,0x01,0x04,0x12,0x00,0x05, 0x12,0x01,0x05,0x13,0x01,0x06,0x14,0x01,0x06,0x15,0x01,0x07,0x15,0x01,0x07, 0x15,0x02,0x08,0x15,0x03,0x84,0x08,0x14,0x03,0x82,0x08,0x14,0x04,0x82,0x07, 0x13,0x03,0x01,0x08,0x13,0x03,0x84,0x07,0x13,0x03,0x86,0x07,0x12,0x03,0x82, 0x07,0x11,0x03,0x82,0x06,0x10,0x03,0x01,0x06,0x0f,0x03,0x82,0x06,0x0f,0x02, 0x01,0x05,0x0f,0x02,0x82,0x06,0x0e,0x02,0x02,0x06,0x0e,0x03,0x05,0x0e,0x03, 0x83,0x05,0x0e,0x02,0x82,0x05,0x0d,0x02,0x85,0x05,0x0c,0x02,0x82,0x05,0x0b, 0x02,0x82,0x04,0x0b,0x02,0x83,0x04,0x0a,0x02,0x82,0x03,0x0a,0x02,0x01,0x03, 0x09,0x02,0x84,0x03,0x09,0x01,0x01,0x03,0x08,0x01,0x82,0x03,0x07,0x01,0x84, 0x02,0x07,0x01,0x85,0x02,0x06,0x01,0x83,0x02,0x05,0x01,0x01,0x01,0x05,0x01, 0x83,0x01,0x04,0x00,0x85,0x01,0x03,0x00,0x83,0x01,0x02,0x00,0x82,0x00,0x02, 0x00,0x85,0x00,0x01,0x00,0xdd,0x00,0x00,0x00,0x83,0x3e,0x7b,0x15,0x82,0x3e, 0x7b,0x16,0x01,0x3e,0x7b,0x15,0x82,0x3e,0x7b,0x16,0x82,0x3e,0x7b,0x15,0x02, 0x3d,0x7a,0x15,0x3e,0x7b,0x16,0x83,0x3d,0x7a,0x15,0x04,0x3d,0x7a,0x16,0x3d, 0x7a,0x15,0x3d,0x7a,0x14,0x3d,0x7a,0x15,0x82,0x3d,0x7b,0x15,0x04,0x3d,0x7a, 0x16,0x3e,0x7b,0x16,0x3d,0x7a,0x15,0x3d,0x7a,0x14,0x82,0x3c,0x7a,0x15,0x06, 0x3b,0x7a,0x15,0x3c,0x79,0x13,0x3d,0x7a,0x15,0x3d,0x7a,0x16,0x3c,0x79,0x15, 0x3d,0x7a,0x14,0x82,0x3d,0x7a,0x16,0x13,0x3d,0x7a,0x14,0x3c,0x79,0x13,0x3d, 0x7a,0x15,0x3c,0x79,0x15,0x3b,0x78,0x14,0x3c,0x7a,0x15,0x3b,0x7a,0x15,0x3c, 0x79,0x16,0x3b,0x78,0x15,0x3c,0x79,0x16,0x3c,0x79,0x15,0x3c,0x79,0x16,0x3d, 0x78,0x16,0x3c,0x79,0x15,0x3b,0x79,0x16,0x3b,0x78,0x15,0x3a,0x78,0x16,0x3c, 0x78,0x17,0x3d,0x78,0x16,0x82,0x3c,0x78,0x17,0x83,0x3b,0x78,0x16,0x84,0x3c, 0x78,0x17,0x02,0x3b,0x78,0x17,0x3b,0x78,0x18,0x82,0x3b,0x77,0x17,0x02,0x3d, 0x78,0x1a,0x3c,0x77,0x19,0x82,0x3d,0x78,0x1a,0x04,0x3c,0x78,0x1a,0x3d,0x77, 0x1a,0x3c,0x76,0x1a,0x3d,0x77,0x1a,0x82,0x3d,0x77,0x1b,0x08,0x3c,0x76,0x1a, 0x3b,0x76,0x1a,0x3c,0x76,0x1a,0x3d,0x77,0x1b,0x3e,0x78,0x1c,0x3d,0x77,0x1b, 0x3d,0x76,0x1c,0x3d,0x77,0x1d,0x82,0x3d,0x76,0x1c,0x05,0x3d,0x77,0x1d,0x3d, 0x75,0x1d,0x3d,0x76,0x1d,0x3d,0x77,0x1e,0x3d,0x75,0x1d,0x82,0x3d,0x76,0x1d, 0x01,0x3d,0x76,0x1e,0x82,0x3d,0x77,0x1f,0x82,0x3c,0x76,0x1e,0x82,0x3d,0x76, 0x1e,0x82,0x3d,0x75,0x1e,0x82,0x3f,0x76,0x1f,0x02,0x3d,0x75,0x1e,0x3c,0x76, 0x1e,0x82,0x3d,0x76,0x1e,0x04,0x3d,0x77,0x1f,0x3d,0x76,0x1e,0x3c,0x74,0x1d, 0x3d,0x76,0x1e,0x82,0x3d,0x74,0x1f,0x04,0x3c,0x75,0x1e,0x3d,0x75,0x1e,0x3c, 0x74,0x1f,0x3b,0x74,0x1f,0x83,0x3d,0x75,0x1e,0x01,0x3b,0x74,0x1e,0x82,0x3c, 0x75,0x1e,0x01,0x3b,0x74,0x1e,0x83,0x3b,0x73,0x1e,0x07,0x3b,0x74,0x1d,0x3b, 0x73,0x1d,0x3b,0x73,0x1e,0x3c,0x74,0x1f,0x3b,0x74,0x1d,0x3b,0x73,0x1d,0x3a, 0x72,0x1d,0x82,0x3b,0x73,0x1e,0x02,0x3a,0x72,0x1d,0x39,0x71,0x1c,0x82,0x3a, 0x72,0x1d,0x82,0x39,0x71,0x1c,0x08,0x39,0x71,0x1d,0x39,0x71,0x1c,0x38,0x70, 0x1c,0x39,0x71,0x1a,0x37,0x6f,0x1b,0x39,0x71,0x1b,0x39,0x71,0x1d,0x38,0x70, 0x1b,0x86,0x37,0x6f,0x1b,0x05,0x36,0x6e,0x1a,0x36,0x6e,0x1b,0x35,0x6d,0x19, 0x36,0x6e,0x1a,0x36,0x6e,0x1b,0x82,0x37,0x6d,0x1b,0x82,0x36,0x6e,0x1b,0x13, 0x34,0x6c,0x19,0x36,0x6c,0x1a,0x35,0x6b,0x19,0x35,0x6c,0x1b,0x33,0x6a,0x19, 0x34,0x6a,0x19,0x35,0x6b,0x19,0x34,0x6a,0x18,0x35,0x6b,0x19,0x33,0x6a,0x17, 0x33,0x6a,0x19,0x34,0x6a,0x1a,0x33,0x69,0x18,0x33,0x6a,0x19,0x32,0x67,0x17, 0x32,0x68,0x18,0x32,0x68,0x17,0x33,0x69,0x19,0x32,0x67,0x17,0x82,0x33,0x69, 0x19,0x0c,0x32,0x68,0x18,0x2f,0x65,0x16,0x2e,0x63,0x16,0x27,0x5d,0x0f,0x25, 0x5a,0x0e,0x21,0x56,0x0b,0x1e,0x53,0x09,0x1f,0x53,0x0a,0x1e,0x52,0x09,0x1f, 0x53,0x09,0x20,0x54,0x0a,0x1f,0x53,0x0b,0x82,0x1e,0x52,0x0a,0x84,0x1f,0x53, 0x0a,0x03,0x1e,0x52,0x0a,0x1e,0x53,0x0a,0x1d,0x51,0x09,0x83,0x1e,0x52,0x09, 0x83,0x1d,0x51,0x09,0x82,0x1d,0x51,0x08,0x82,0x1b,0x4e,0x07,0x82,0x1b,0x4e, 0x08,0x82,0x1a,0x4e,0x07,0x01,0x1b,0x4e,0x08,0x82,0x1a,0x4d,0x06,0x82,0x1a, 0x4e,0x07,0x02,0x19,0x4d,0x06,0x1a,0x4d,0x07,0x82,0x19,0x4d,0x06,0x01,0x19, 0x4c,0x06,0x82,0x19,0x4b,0x06,0x01,0x19,0x4c,0x06,0x82,0x18,0x4b,0x05,0x04, 0x19,0x4b,0x05,0x18,0x4a,0x05,0x19,0x4b,0x05,0x18,0x4a,0x05,0x83,0x17,0x4b, 0x05,0x03,0x17,0x4a,0x06,0x18,0x4a,0x06,0x17,0x4a,0x04,0x82,0x17,0x4a,0x05, 0x08,0x17,0x4b,0x05,0x17,0x4a,0x04,0x18,0x4a,0x06,0x17,0x4a,0x06,0x17,0x4b, 0x05,0x17,0x4a,0x04,0x17,0x4c,0x05,0x19,0x4b,0x05,0x83,0x17,0x4b,0x05,0x01, 0x16,0x4b,0x04,0x82,0x17,0x4a,0x04,0x82,0x17,0x4b,0x05,0x83,0x17,0x4c,0x05, 0x82,0x18,0x4b,0x05,0x02,0x17,0x4b,0x05,0x18,0x4b,0x05,0x82,0x19,0x4c,0x05, 0x0a,0x18,0x4b,0x05,0x17,0x4c,0x05,0x18,0x4d,0x05,0x17,0x4c,0x05,0x17,0x4b, 0x04,0x17,0x4c,0x05,0x18,0x4d,0x05,0x17,0x4b,0x04,0x18,0x4d,0x04,0x19,0x4d, 0x05,0x82,0x17,0x4c,0x05,0x04,0x18,0x4b,0x05,0x17,0x4b,0x04,0x18,0x4b,0x05, 0x19,0x4d,0x04,0x83,0x18,0x4b,0x05,0x02,0x17,0x4c,0x05,0x18,0x4d,0x05,0x82, 0x19,0x4c,0x06,0x06,0x18,0x4a,0x04,0x18,0x4b,0x05,0x17,0x4c,0x05,0x16,0x4b, 0x04,0x17,0x4b,0x04,0x17,0x4a,0x04,0x82,0x16,0x48,0x04,0x82,0x16,0x49,0x05, 0x01,0x16,0x48,0x05,0x82,0x16,0x47,0x04,0x02,0x15,0x47,0x05,0x15,0x46,0x03, 0x83,0x15,0x46,0x05,0x82,0x15,0x46,0x04,0x01,0x15,0x45,0x03,0x83,0x14,0x44, 0x04,0x02,0x13,0x44,0x04,0x14,0x43,0x04,0x82,0x15,0x43,0x05,0x83,0x13,0x42, 0x03,0x84,0x13,0x41,0x03,0x06,0x12,0x40,0x03,0x13,0x41,0x05,0x12,0x3f,0x03, 0x12,0x40,0x04,0x11,0x3f,0x03,0x12,0x3f,0x03,0x82,0x12,0x3f,0x04,0x01,0x11, 0x3f,0x03,0x82,0x12,0x3f,0x03,0x02,0x12,0x3f,0x04,0x12,0x3e,0x03,0x82,0x11, 0x3d,0x03,0x82,0x12,0x3d,0x03,0x83,0x11,0x3d,0x03,0x02,0x11,0x3b,0x03,0x11, 0x3d,0x03,0x82,0x11,0x3c,0x03,0x04,0x11,0x3b,0x03,0x10,0x3b,0x02,0x11,0x3a, 0x03,0x10,0x3a,0x02,0x82,0x0f,0x3a,0x03,0x84,0x0f,0x39,0x03,0x04,0x0e,0x38, 0x02,0x0f,0x39,0x03,0x0f,0x37,0x03,0x0f,0x38,0x02,0x82,0x0f,0x38,0x03,0x82, 0x0e,0x36,0x02,0x01,0x0e,0x37,0x02,0x82,0x0e,0x36,0x02,0x82,0x0e,0x35,0x02, 0x01,0x0d,0x35,0x02,0x82,0x0e,0x35,0x02,0x03,0x0d,0x33,0x01,0x0e,0x33,0x01, 0x0d,0x34,0x01,0x82,0x0e,0x34,0x02,0x06,0x0d,0x34,0x02,0x0d,0x33,0x01,0x0e, 0x33,0x01,0x0d,0x33,0x02,0x0e,0x33,0x02,0x0e,0x32,0x02,0x82,0x0e,0x33,0x02, 0x0b,0x0d,0x32,0x01,0x0c,0x31,0x01,0x0d,0x32,0x02,0x0c,0x31,0x01,0x0d,0x31, 0x03,0x0d,0x31,0x02,0x0d,0x31,0x01,0x0d,0x30,0x01,0x0e,0x31,0x02,0x0d,0x31, 0x02,0x0c,0x30,0x02,0x82,0x0b,0x2f,0x02,0x02,0x0d,0x30,0x02,0x0b,0x2f,0x01, 0x82,0x0d,0x2f,0x02,0x82,0x0c,0x2e,0x01,0x01,0x0d,0x2e,0x01,0x82,0x0c,0x2e, 0x02,0x82,0x0c,0x2e,0x01,0x02,0x0d,0x2e,0x02,0x0c,0x2d,0x01,0x82,0x0c,0x2d, 0x02,0x02,0x0b,0x2c,0x01,0x0c,0x2d,0x01,0x82,0x0b,0x2c,0x02,0x84,0x0b,0x2b, 0x01,0x82,0x0b,0x2b,0x02,0x0b,0x0a,0x2a,0x01,0x0b,0x2b,0x01,0x0b,0x2a,0x01, 0x0a,0x2a,0x01,0x0a,0x29,0x01,0x0b,0x2a,0x01,0x0a,0x29,0x02,0x0a,0x29,0x01, 0x09,0x29,0x00,0x0a,0x28,0x01,0x09,0x29,0x01,0x82,0x0a,0x28,0x01,0x01,0x0a, 0x27,0x02,0x84,0x0a,0x27,0x01,0x82,0x0a,0x27,0x02,0x82,0x09,0x26,0x01,0x02, 0x09,0x27,0x01,0x0a,0x26,0x01,0x85,0x09,0x26,0x01,0x01,0x0a,0x26,0x01,0x82, 0x09,0x25,0x02,0x02,0x09,0x25,0x01,0x0a,0x25,0x01,0x82,0x09,0x25,0x01,0x82, 0x09,0x24,0x01,0x87,0x09,0x23,0x01,0x85,0x08,0x22,0x01,0x82,0x08,0x21,0x01, 0x04,0x09,0x21,0x01,0x08,0x21,0x01,0x07,0x21,0x01,0x08,0x21,0x01,0x83,0x07, 0x20,0x01,0x01,0x09,0x20,0x01,0x82,0x07,0x1f,0x01,0x01,0x07,0x1f,0x00,0x82, 0x07,0x1f,0x01,0x01,0x07,0x1e,0x00,0x84,0x07,0x1e,0x01,0x84,0x07,0x1d,0x01, 0x01,0x06,0x1c,0x00,0x82,0x06,0x1d,0x00,0x06,0x06,0x1d,0x01,0x06,0x1c,0x01, 0x06,0x1c,0x00,0x06,0x1b,0x00,0x06,0x1c,0x01,0x06,0x1c,0x00,0x85,0x06,0x1b, 0x00,0x01,0x06,0x1b,0x01,0x82,0x06,0x1b,0x00,0x01,0x07,0x1b,0x01,0x83,0x06, 0x1a,0x00,0x02,0x06,0x1a,0x01,0x06,0x1a,0x00,0x82,0x05,0x19,0x00,0x82,0x06, 0x19,0x00,0x85,0x05,0x19,0x00,0x83,0x05,0x18,0x00,0x8a,0x05,0x17,0x00,0x86, 0x05,0x16,0x00,0x82,0x04,0x16,0x00,0x88,0x04,0x15,0x00,0x86,0x04,0x14,0x00, 0x82,0x04,0x13,0x00,0x01,0x03,0x13,0x00,0x8a,0x04,0x13,0x00,0x02,0x04,0x12, 0x00,0x05,0x12,0x00,0x82,0x04,0x12,0x00,0x01,0x05,0x12,0x00,0x83,0x04,0x12, 0x00,0x02,0x04,0x12,0x01,0x04,0x11,0x00,0x82,0x04,0x11,0x01,0x82,0x04,0x11, 0x00,0x0a,0x05,0x12,0x01,0x05,0x13,0x01,0x05,0x14,0x00,0x06,0x15,0x01,0x06, 0x15,0x02,0x07,0x15,0x03,0x08,0x15,0x03,0x09,0x15,0x04,0x08,0x14,0x03,0x07, 0x14,0x03,0x83,0x08,0x14,0x03,0x01,0x08,0x13,0x03,0x83,0x07,0x13,0x03,0x87, 0x07,0x12,0x03,0x84,0x07,0x11,0x03,0x82,0x06,0x10,0x03,0x82,0x06,0x0f,0x02, 0x86,0x05,0x0e,0x02,0x84,0x05,0x0d,0x02,0x83,0x05,0x0c,0x02,0x01,0x05,0x0b, 0x02,0x83,0x04,0x0b,0x02,0x82,0x04,0x0a,0x02,0x83,0x03,0x0a,0x02,0x85,0x03, 0x09,0x01,0x82,0x03,0x08,0x01,0x82,0x03,0x07,0x01,0x82,0x02,0x07,0x01,0x85, 0x02,0x06,0x01,0x84,0x02,0x05,0x01,0x82,0x01,0x05,0x01,0x82,0x01,0x04,0x00, 0x85,0x01,0x03,0x00,0x83,0x01,0x02,0x00,0x82,0x00,0x02,0x00,0x85,0x00,0x01, 0x00,0xdd,0x00,0x00,0x00,0x83,0x3f,0x7d,0x16,0x84,0x3e,0x7c,0x15,0x02,0x3d, 0x7c,0x15,0x3e,0x7d,0x15,0x82,0x3e,0x7c,0x15,0x82,0x3e,0x7c,0x16,0x83,0x3e, 0x7c,0x15,0x02,0x3e,0x7c,0x16,0x3e,0x7c,0x17,0x84,0x3d,0x7c,0x16,0x08,0x3e, 0x7c,0x16,0x3d,0x7a,0x15,0x3e,0x7b,0x14,0x3d,0x7a,0x15,0x3d,0x7c,0x15,0x3d, 0x7c,0x16,0x3d,0x7a,0x14,0x3d,0x7b,0x14,0x82,0x3d,0x7c,0x15,0x0f,0x3d,0x7c, 0x14,0x3c,0x7a,0x14,0x3c,0x7b,0x15,0x3d,0x7c,0x14,0x3c,0x7a,0x13,0x3c,0x7b, 0x15,0x3d,0x7c,0x15,0x3b,0x7a,0x14,0x3c,0x7b,0x15,0x3d,0x7c,0x15,0x3d,0x7b, 0x17,0x3c,0x7a,0x15,0x3c,0x7a,0x16,0x3c,0x7b,0x15,0x3d,0x7a,0x16,0x84,0x3c, 0x7a,0x15,0x05,0x3b,0x79,0x16,0x3d,0x7a,0x18,0x3d,0x79,0x17,0x3d,0x7a,0x17, 0x3d,0x79,0x16,0x82,0x3c,0x79,0x17,0x01,0x3d,0x7a,0x18,0x83,0x3c,0x79,0x17, 0x02,0x3d,0x7a,0x18,0x3d,0x79,0x17,0x82,0x3c,0x79,0x18,0x06,0x3c,0x79,0x19, 0x3d,0x78,0x19,0x3d,0x79,0x19,0x3e,0x79,0x1a,0x3c,0x78,0x19,0x3c,0x79,0x1b, 0x82,0x3d,0x78,0x1b,0x01,0x3d,0x78,0x1a,0x82,0x3d,0x78,0x1b,0x03,0x3c,0x77, 0x1a,0x3e,0x79,0x1c,0x3e,0x78,0x1b,0x83,0x3d,0x78,0x1b,0x82,0x3e,0x78,0x1d, 0x83,0x3d,0x77,0x1c,0x01,0x3d,0x76,0x1d,0x82,0x3d,0x78,0x1e,0x08,0x3d,0x76, 0x1c,0x3c,0x78,0x1d,0x3d,0x78,0x1f,0x3f,0x78,0x20,0x3d,0x77,0x1e,0x3e,0x77, 0x1f,0x3e,0x78,0x1f,0x3e,0x77,0x1f,0x82,0x3d,0x76,0x1f,0x04,0x3d,0x77,0x1f, 0x3d,0x76,0x1f,0x3e,0x77,0x1f,0x3e,0x78,0x20,0x82,0x3d,0x76,0x1f,0x01,0x3d, 0x76,0x1e,0x82,0x3d,0x76,0x1f,0x82,0x3d,0x76,0x1e,0x0a,0x3d,0x76,0x1f,0x3e, 0x75,0x1e,0x3d,0x76,0x1f,0x3c,0x76,0x1e,0x3d,0x76,0x1e,0x3c,0x75,0x1f,0x3c, 0x76,0x1f,0x3d,0x75,0x1f,0x3d,0x76,0x1e,0x3c,0x75,0x1e,0x82,0x3d,0x76,0x1e, 0x05,0x3c,0x75,0x1e,0x3e,0x77,0x1f,0x3c,0x74,0x1e,0x3b,0x74,0x1e,0x3d,0x75, 0x1f,0x82,0x3c,0x75,0x1d,0x02,0x3d,0x75,0x1f,0x3c,0x75,0x1f,0x82,0x3c,0x75, 0x1d,0x08,0x3b,0x74,0x1c,0x3a,0x74,0x1c,0x3b,0x75,0x1e,0x3a,0x74,0x1e,0x3b, 0x74,0x1e,0x3a,0x73,0x1d,0x3a,0x72,0x1c,0x3a,0x73,0x1d,0x82,0x3a,0x73,0x1e, 0x08,0x39,0x72,0x1d,0x3a,0x73,0x1d,0x3a,0x72,0x1e,0x3a,0x73,0x1d,0x39,0x72, 0x1d,0x3a,0x72,0x1c,0x39,0x71,0x1c,0x38,0x70,0x1c,0x83,0x38,0x71,0x1c,0x09, 0x38,0x70,0x1b,0x38,0x71,0x1c,0x37,0x70,0x1b,0x38,0x70,0x1c,0x38,0x70,0x1b, 0x36,0x6e,0x19,0x37,0x70,0x1b,0x38,0x6e,0x1b,0x37,0x6e,0x1b,0x82,0x36,0x6f, 0x1b,0x10,0x37,0x70,0x1c,0x36,0x6d,0x1a,0x36,0x6e,0x1b,0x35,0x6e,0x1a,0x34, 0x6d,0x19,0x36,0x6e,0x1b,0x36,0x6d,0x1a,0x36,0x6d,0x19,0x36,0x6d,0x1b,0x35, 0x6c,0x1a,0x35,0x6b,0x18,0x35,0x6b,0x19,0x33,0x6a,0x19,0x34,0x6a,0x19,0x33, 0x6a,0x18,0x34,0x6b,0x19,0x83,0x33,0x6a,0x19,0x82,0x32,0x68,0x17,0x10,0x32, 0x69,0x18,0x31,0x69,0x17,0x32,0x6a,0x18,0x32,0x6a,0x19,0x32,0x6a,0x18,0x2f, 0x66,0x16,0x2c,0x62,0x15,0x27,0x5c,0x10,0x22,0x56,0x0c,0x20,0x55,0x0c,0x1f, 0x53,0x0b,0x1e,0x52,0x0a,0x1f,0x54,0x0a,0x1e,0x53,0x09,0x1f,0x53,0x0a,0x1f, 0x54,0x0a,0x83,0x1f,0x53,0x0a,0x02,0x1e,0x53,0x0a,0x1f,0x53,0x0a,0x84,0x1e, 0x53,0x09,0x01,0x1e,0x52,0x09,0x83,0x1d,0x51,0x08,0x03,0x1c,0x51,0x08,0x1e, 0x50,0x09,0x1c,0x50,0x08,0x83,0x1b,0x4f,0x08,0x03,0x1c,0x4f,0x08,0x1a,0x4e, 0x06,0x1b,0x4f,0x07,0x82,0x1b,0x4f,0x08,0x03,0x19,0x4e,0x06,0x1b,0x4f,0x08, 0x1a,0x4e,0x07,0x87,0x19,0x4d,0x06,0x04,0x1a,0x4d,0x06,0x19,0x4c,0x05,0x19, 0x4c,0x06,0x18,0x4b,0x05,0x83,0x18,0x4c,0x05,0x82,0x18,0x4b,0x06,0x82,0x18, 0x4b,0x05,0x01,0x17,0x4b,0x04,0x83,0x18,0x4c,0x05,0x08,0x17,0x4b,0x05,0x18, 0x4b,0x06,0x18,0x4c,0x05,0x17,0x4b,0x04,0x18,0x4c,0x05,0x18,0x4b,0x04,0x18, 0x4c,0x05,0x17,0x4c,0x05,0x82,0x18,0x4c,0x05,0x02,0x18,0x4b,0x04,0x18,0x4c, 0x05,0x82,0x17,0x4c,0x05,0x82,0x17,0x4d,0x05,0x82,0x18,0x4d,0x05,0x02,0x17, 0x4c,0x04,0x19,0x4d,0x05,0x83,0x18,0x4c,0x05,0x07,0x17,0x4c,0x04,0x18,0x4d, 0x05,0x19,0x4e,0x06,0x18,0x4d,0x05,0x19,0x4d,0x05,0x18,0x4c,0x05,0x18,0x4d, 0x05,0x82,0x18,0x4d,0x04,0x03,0x18,0x4d,0x05,0x18,0x4c,0x05,0x19,0x4d,0x05, 0x82,0x18,0x4d,0x05,0x03,0x18,0x4d,0x04,0x18,0x4d,0x05,0x18,0x4c,0x04,0x83, 0x18,0x4c,0x05,0x05,0x17,0x4c,0x04,0x18,0x4c,0x06,0x18,0x4c,0x05,0x18,0x4d, 0x05,0x18,0x4c,0x06,0x82,0x17,0x4b,0x04,0x09,0x17,0x49,0x04,0x17,0x49,0x05, 0x17,0x4a,0x05,0x16,0x4a,0x05,0x17,0x4a,0x05,0x16,0x49,0x05,0x15,0x48,0x04, 0x16,0x47,0x04,0x15,0x48,0x05,0x84,0x15,0x47,0x04,0x07,0x14,0x45,0x03,0x14, 0x45,0x04,0x15,0x46,0x04,0x15,0x46,0x02,0x15,0x44,0x04,0x15,0x45,0x04,0x14, 0x45,0x03,0x82,0x14,0x44,0x03,0x0b,0x14,0x45,0x04,0x14,0x44,0x04,0x13,0x44, 0x04,0x13,0x42,0x03,0x15,0x42,0x04,0x14,0x42,0x04,0x14,0x43,0x04,0x13,0x42, 0x04,0x13,0x41,0x04,0x14,0x41,0x05,0x14,0x40,0x04,0x83,0x13,0x40,0x04,0x01, 0x12,0x40,0x04,0x82,0x12,0x3f,0x04,0x82,0x13,0x3f,0x04,0x02,0x11,0x40,0x03, 0x11,0x3e,0x04,0x82,0x12,0x3e,0x04,0x04,0x13,0x3e,0x03,0x11,0x3d,0x02,0x11, 0x3e,0x02,0x12,0x3e,0x04,0x82,0x11,0x3e,0x04,0x82,0x11,0x3d,0x03,0x09,0x13, 0x3c,0x04,0x11,0x3c,0x04,0x10,0x3b,0x03,0x11,0x3c,0x04,0x10,0x3c,0x02,0x10, 0x3a,0x02,0x11,0x3a,0x02,0x0f,0x3a,0x02,0x10,0x3a,0x03,0x82,0x11,0x39,0x02, 0x05,0x10,0x39,0x02,0x0f,0x38,0x03,0x10,0x39,0x03,0x10,0x39,0x02,0x0f,0x39, 0x03,0x83,0x0f,0x38,0x02,0x04,0x0f,0x36,0x02,0x0e,0x38,0x01,0x0f,0x38,0x02, 0x0f,0x38,0x03,0x82,0x0f,0x37,0x02,0x02,0x0f,0x36,0x02,0x0e,0x36,0x02,0x82, 0x0f,0x36,0x03,0x82,0x0e,0x35,0x02,0x0e,0x0f,0x35,0x02,0x0d,0x35,0x02,0x0d, 0x34,0x01,0x0e,0x33,0x02,0x0d,0x34,0x02,0x0d,0x33,0x02,0x0e,0x35,0x02,0x0f, 0x35,0x03,0x0f,0x33,0x02,0x0e,0x33,0x02,0x0d,0x32,0x01,0x0e,0x33,0x02,0x0d, 0x32,0x02,0x0d,0x31,0x02,0x82,0x0d,0x32,0x02,0x0a,0x0d,0x31,0x02,0x0d,0x31, 0x01,0x0c,0x32,0x01,0x0c,0x31,0x01,0x0d,0x30,0x02,0x0d,0x30,0x01,0x0c,0x31, 0x02,0x0d,0x30,0x01,0x0d,0x2f,0x01,0x0c,0x30,0x02,0x82,0x0d,0x2f,0x02,0x03, 0x0d,0x2e,0x01,0x0c,0x2e,0x01,0x0c,0x2f,0x01,0x84,0x0c,0x2e,0x01,0x04,0x0c, 0x2d,0x02,0x0c,0x2d,0x01,0x0b,0x2c,0x01,0x0c,0x2d,0x02,0x83,0x0c,0x2d,0x01, 0x06,0x0c,0x2c,0x01,0x0b,0x2b,0x02,0x0c,0x2b,0x02,0x0b,0x2b,0x01,0x0a,0x2b, 0x02,0x0c,0x2b,0x01,0x83,0x0b,0x2b,0x01,0x03,0x0a,0x2b,0x01,0x0a,0x2a,0x01, 0x0a,0x2a,0x02,0x82,0x0a,0x2a,0x01,0x01,0x09,0x2a,0x01,0x82,0x0a,0x29,0x01, 0x02,0x0a,0x28,0x01,0x0a,0x28,0x02,0x82,0x0a,0x28,0x01,0x02,0x0a,0x28,0x02, 0x0a,0x27,0x01,0x82,0x0a,0x28,0x02,0x06,0x0a,0x27,0x02,0x0a,0x26,0x01,0x0a, 0x27,0x01,0x09,0x27,0x01,0x09,0x26,0x00,0x09,0x26,0x01,0x82,0x0a,0x27,0x01, 0x82,0x09,0x26,0x01,0x06,0x09,0x26,0x02,0x09,0x25,0x01,0x09,0x26,0x01,0x09, 0x25,0x01,0x09,0x26,0x01,0x09,0x25,0x01,0x83,0x09,0x24,0x01,0x87,0x09,0x23, 0x01,0x01,0x08,0x22,0x01,0x82,0x08,0x23,0x01,0x01,0x08,0x22,0x01,0x83,0x09, 0x22,0x01,0x83,0x08,0x21,0x01,0x02,0x08,0x20,0x01,0x08,0x21,0x01,0x82,0x08, 0x20,0x01,0x01,0x07,0x20,0x01,0x82,0x08,0x20,0x01,0x83,0x07,0x1f,0x01,0x04, 0x08,0x1f,0x01,0x06,0x1f,0x01,0x07,0x1e,0x01,0x06,0x1e,0x00,0x82,0x07,0x1e, 0x01,0x08,0x08,0x1e,0x01,0x06,0x1e,0x00,0x06,0x1e,0x01,0x06,0x1d,0x00,0x06, 0x1d,0x01,0x06,0x1d,0x00,0x06,0x1c,0x01,0x06,0x1c,0x00,0x82,0x06,0x1c,0x01, 0x82,0x06,0x1c,0x00,0x82,0x06,0x1c,0x01,0x02,0x06,0x1b,0x00,0x06,0x1b,0x01, 0x82,0x06,0x1b,0x00,0x01,0x06,0x1b,0x01,0x82,0x06,0x1b,0x00,0x82,0x06,0x1a, 0x00,0x01,0x06,0x1b,0x00,0x82,0x06,0x1a,0x00,0x83,0x05,0x19,0x00,0x04,0x06, 0x19,0x00,0x05,0x19,0x00,0x06,0x19,0x01,0x05,0x19,0x00,0x84,0x05,0x18,0x00, 0x01,0x05,0x17,0x00,0x82,0x05,0x18,0x00,0x8b,0x05,0x17,0x00,0x83,0x04,0x16, 0x00,0x85,0x04,0x15,0x00,0x82,0x05,0x15,0x00,0x84,0x04,0x15,0x00,0x83,0x04, 0x14,0x00,0x01,0x04,0x13,0x00,0x83,0x04,0x14,0x00,0x02,0x04,0x13,0x00,0x04, 0x14,0x00,0x8c,0x04,0x13,0x00,0x84,0x04,0x12,0x00,0x82,0x04,0x11,0x00,0x03, 0x04,0x12,0x00,0x04,0x11,0x00,0x04,0x11,0x01,0x83,0x04,0x11,0x00,0x03,0x04, 0x11,0x01,0x05,0x13,0x01,0x05,0x14,0x01,0x82,0x06,0x14,0x01,0x02,0x08,0x15, 0x03,0x08,0x14,0x03,0x84,0x08,0x14,0x04,0x02,0x08,0x13,0x04,0x08,0x14,0x04, 0x82,0x08,0x13,0x04,0x01,0x07,0x13,0x03,0x82,0x08,0x13,0x03,0x02,0x08,0x12, 0x03,0x07,0x12,0x03,0x86,0x07,0x11,0x03,0x01,0x07,0x10,0x03,0x82,0x06,0x10, 0x03,0x01,0x06,0x10,0x04,0x82,0x06,0x0f,0x03,0x83,0x05,0x0e,0x02,0x85,0x05, 0x0d,0x02,0x84,0x05,0x0c,0x02,0x01,0x04,0x0c,0x02,0x83,0x04,0x0b,0x02,0x84, 0x04,0x0a,0x02,0x82,0x04,0x09,0x02,0x83,0x03,0x09,0x01,0x84,0x03,0x08,0x01, 0x83,0x02,0x07,0x01,0x85,0x02,0x06,0x01,0x83,0x02,0x05,0x01,0x82,0x01,0x05, 0x01,0x85,0x01,0x04,0x00,0x82,0x01,0x03,0x00,0x83,0x01,0x02,0x00,0x82,0x00, 0x02,0x00,0x85,0x00,0x01,0x00,0xdd,0x00,0x00,0x00,0x03,0x40,0x7e,0x16,0x3f, 0x7d,0x15,0x3f,0x7e,0x17,0x82,0x3f,0x7d,0x16,0x01,0x3f,0x7e,0x17,0x82,0x3e, 0x7e,0x16,0x08,0x3d,0x7d,0x15,0x3e,0x7e,0x16,0x3e,0x7d,0x16,0x40,0x7d,0x15, 0x3f,0x7e,0x16,0x3e,0x7d,0x15,0x40,0x7d,0x15,0x3e,0x7e,0x15,0x82,0x3e,0x7d, 0x16,0x04,0x3f,0x7d,0x16,0x3d,0x7c,0x15,0x3e,0x7d,0x16,0x3f,0x7d,0x15,0x82, 0x3d,0x7c,0x14,0x01,0x3f,0x7c,0x14,0x82,0x3d,0x7d,0x15,0x03,0x3e,0x7d,0x15, 0x3f,0x7e,0x16,0x3d,0x7d,0x14,0x82,0x3d,0x7d,0x16,0x09,0x3d,0x7c,0x14,0x3d, 0x7b,0x16,0x3d,0x7d,0x15,0x3d,0x7c,0x15,0x3c,0x7c,0x15,0x3d,0x7b,0x15,0x3d, 0x7c,0x16,0x3d,0x7d,0x15,0x3c,0x7b,0x14,0x82,0x3d,0x7d,0x15,0x08,0x3d,0x7c, 0x15,0x3d,0x7d,0x15,0x3d,0x7c,0x15,0x3e,0x7b,0x15,0x3d,0x7b,0x15,0x3d,0x7c, 0x15,0x3d,0x7b,0x16,0x3c,0x7a,0x16,0x82,0x3d,0x7b,0x17,0x04,0x3d,0x7c,0x16, 0x3c,0x7b,0x16,0x3c,0x7b,0x17,0x3e,0x7b,0x17,0x82,0x3d,0x7b,0x17,0x01,0x3d, 0x7b,0x18,0x82,0x3c,0x7a,0x17,0x82,0x3d,0x7a,0x18,0x06,0x3d,0x7b,0x19,0x3c, 0x7a,0x19,0x3e,0x7a,0x19,0x3d,0x7a,0x19,0x3e,0x7a,0x1a,0x3e,0x7a,0x19,0x83, 0x3d,0x7a,0x19,0x04,0x3e,0x7a,0x1a,0x3d,0x79,0x1a,0x3e,0x7a,0x1b,0x3f,0x7a, 0x1c,0x82,0x3d,0x79,0x1a,0x02,0x3f,0x7a,0x1c,0x3e,0x7a,0x1b,0x84,0x3d,0x78, 0x1c,0x03,0x3d,0x78,0x1d,0x3d,0x78,0x1c,0x3d,0x78,0x1a,0x84,0x3d,0x78,0x1d, 0x08,0x3d,0x78,0x1e,0x3e,0x78,0x1d,0x3d,0x77,0x1d,0x3d,0x78,0x1d,0x3f,0x78, 0x1f,0x3f,0x7a,0x20,0x3d,0x78,0x1e,0x3e,0x78,0x1f,0x82,0x3d,0x77,0x1e,0x02, 0x3e,0x78,0x1f,0x3f,0x77,0x1f,0x82,0x3d,0x78,0x1f,0x02,0x3d,0x77,0x1e,0x3e, 0x78,0x20,0x82,0x3e,0x78,0x1f,0x03,0x3d,0x78,0x1f,0x3e,0x78,0x21,0x3d,0x78, 0x1f,0x82,0x3d,0x77,0x1e,0x01,0x3e,0x78,0x1e,0x82,0x3d,0x77,0x1e,0x02,0x3d, 0x77,0x20,0x3e,0x78,0x1f,0x85,0x3d,0x77,0x1e,0x09,0x3e,0x78,0x1f,0x3d,0x77, 0x1e,0x3c,0x77,0x1e,0x3b,0x77,0x1e,0x3d,0x77,0x20,0x3c,0x75,0x1e,0x3c,0x76, 0x1d,0x3d,0x77,0x1e,0x3d,0x75,0x1e,0x82,0x3c,0x75,0x1e,0x03,0x3e,0x76,0x1f, 0x3c,0x75,0x1e,0x3d,0x76,0x1f,0x83,0x3c,0x75,0x1e,0x05,0x3b,0x74,0x1d,0x3a, 0x75,0x1d,0x3d,0x75,0x1e,0x3a,0x74,0x1d,0x3a,0x73,0x1c,0x82,0x3a,0x74,0x1d, 0x03,0x3a,0x73,0x1c,0x3a,0x73,0x1d,0x3a,0x72,0x1d,0x84,0x3a,0x73,0x1d,0x02, 0x39,0x73,0x1d,0x39,0x72,0x1c,0x82,0x38,0x71,0x1b,0x84,0x38,0x71,0x1c,0x09, 0x39,0x71,0x1c,0x38,0x70,0x1c,0x38,0x6f,0x1b,0x36,0x6f,0x1c,0x38,0x6f,0x1b, 0x37,0x70,0x1c,0x36,0x6f,0x1a,0x35,0x6e,0x1a,0x36,0x70,0x1b,0x83,0x36,0x6f, 0x1a,0x09,0x35,0x6c,0x1a,0x35,0x6d,0x1a,0x35,0x6c,0x19,0x35,0x6d,0x1a,0x35, 0x6c,0x1a,0x35,0x6c,0x19,0x33,0x6a,0x19,0x34,0x6b,0x19,0x33,0x6c,0x19,0x84, 0x33,0x6a,0x19,0x82,0x33,0x6a,0x18,0x10,0x32,0x6a,0x18,0x32,0x69,0x19,0x32, 0x69,0x17,0x33,0x6a,0x19,0x32,0x69,0x19,0x31,0x68,0x17,0x2f,0x66,0x16,0x2b, 0x62,0x13,0x24,0x5b,0x0d,0x22,0x58,0x0c,0x20,0x55,0x09,0x1d,0x52,0x08,0x1e, 0x53,0x0b,0x1f,0x54,0x0a,0x1e,0x54,0x09,0x20,0x55,0x0b,0x82,0x1f,0x54,0x09, 0x08,0x20,0x55,0x0b,0x1f,0x54,0x0a,0x1e,0x53,0x09,0x20,0x55,0x0b,0x1f,0x54, 0x0a,0x1e,0x54,0x09,0x1e,0x53,0x09,0x1d,0x52,0x09,0x82,0x1d,0x51,0x09,0x83, 0x1c,0x51,0x08,0x85,0x1c,0x50,0x08,0x82,0x1a,0x4f,0x07,0x0b,0x1b,0x50,0x08, 0x1b,0x50,0x07,0x1a,0x50,0x07,0x1a,0x4e,0x07,0x1b,0x50,0x08,0x1a,0x4e,0x07, 0x19,0x4d,0x05,0x1a,0x4f,0x07,0x1a,0x4e,0x06,0x19,0x4e,0x05,0x19,0x4e,0x06, 0x82,0x19,0x4d,0x05,0x02,0x19,0x4c,0x05,0x19,0x4c,0x06,0x82,0x17,0x4b,0x05, 0x07,0x18,0x4c,0x06,0x18,0x4e,0x05,0x17,0x4b,0x05,0x19,0x4d,0x07,0x17,0x4b, 0x05,0x18,0x4c,0x06,0x19,0x4d,0x07,0x87,0x17,0x4b,0x05,0x03,0x18,0x4c,0x06, 0x19,0x4d,0x07,0x17,0x4c,0x04,0x82,0x18,0x4e,0x05,0x02,0x18,0x4d,0x04,0x17, 0x4c,0x04,0x82,0x18,0x4e,0x05,0x05,0x19,0x4e,0x05,0x18,0x4e,0x05,0x17,0x4d, 0x04,0x19,0x4d,0x05,0x18,0x4d,0x04,0x82,0x19,0x4d,0x05,0x01,0x18,0x4e,0x05, 0x84,0x19,0x4e,0x05,0x01,0x19,0x4d,0x05,0x83,0x19,0x4e,0x05,0x82,0x19,0x4e, 0x04,0x1d,0x19,0x4d,0x05,0x18,0x4d,0x03,0x19,0x4e,0x04,0x19,0x4e,0x05,0x17, 0x4d,0x04,0x19,0x4c,0x05,0x1a,0x4b,0x05,0x18,0x4d,0x04,0x16,0x4e,0x04,0x18, 0x4d,0x05,0x18,0x4e,0x05,0x18,0x4d,0x07,0x17,0x4d,0x04,0x17,0x4c,0x04,0x17, 0x4b,0x05,0x17,0x4c,0x04,0x16,0x4a,0x04,0x17,0x4b,0x04,0x17,0x4b,0x05,0x17, 0x4a,0x05,0x16,0x49,0x04,0x16,0x4a,0x04,0x16,0x49,0x04,0x16,0x49,0x05,0x15, 0x47,0x04,0x16,0x49,0x04,0x16,0x48,0x04,0x16,0x49,0x05,0x16,0x47,0x04,0x82, 0x15,0x46,0x03,0x05,0x15,0x47,0x05,0x16,0x46,0x05,0x15,0x44,0x04,0x15,0x46, 0x05,0x15,0x45,0x04,0x82,0x15,0x44,0x04,0x01,0x15,0x46,0x04,0x82,0x14,0x44, 0x03,0x01,0x16,0x44,0x04,0x82,0x13,0x43,0x03,0x82,0x13,0x43,0x05,0x83,0x13, 0x42,0x04,0x03,0x13,0x42,0x05,0x13,0x41,0x04,0x12,0x42,0x03,0x82,0x12,0x41, 0x03,0x09,0x13,0x41,0x04,0x13,0x40,0x04,0x13,0x40,0x03,0x12,0x3f,0x02,0x13, 0x40,0x04,0x12,0x3f,0x04,0x12,0x3f,0x02,0x11,0x3f,0x04,0x12,0x3f,0x03,0x82, 0x12,0x3f,0x04,0x01,0x10,0x3e,0x03,0x82,0x12,0x3d,0x03,0x06,0x12,0x3d,0x04, 0x13,0x3d,0x04,0x11,0x3d,0x03,0x10,0x3c,0x04,0x11,0x3b,0x03,0x10,0x3c,0x04, 0x82,0x12,0x3b,0x04,0x06,0x0f,0x3b,0x02,0x0f,0x3a,0x03,0x0f,0x3a,0x02,0x11, 0x3a,0x03,0x10,0x3a,0x03,0x10,0x39,0x02,0x82,0x10,0x3a,0x04,0x01,0x0f,0x39, 0x03,0x82,0x0f,0x39,0x02,0x03,0x0f,0x38,0x02,0x10,0x38,0x03,0x10,0x39,0x04, 0x82,0x0f,0x36,0x02,0x01,0x10,0x37,0x02,0x82,0x0e,0x37,0x02,0x83,0x0e,0x36, 0x02,0x82,0x0e,0x35,0x01,0x11,0x0e,0x36,0x02,0x0e,0x35,0x01,0x0e,0x35,0x02, 0x0f,0x35,0x02,0x0e,0x34,0x01,0x0d,0x34,0x02,0x0e,0x34,0x02,0x0d,0x35,0x02, 0x0d,0x33,0x02,0x0e,0x33,0x02,0x0e,0x34,0x03,0x0f,0x33,0x02,0x0e,0x33,0x01, 0x0e,0x33,0x02,0x0e,0x32,0x02,0x0e,0x32,0x01,0x0e,0x31,0x01,0x82,0x0e,0x32, 0x02,0x02,0x0c,0x31,0x01,0x0d,0x32,0x02,0x82,0x0e,0x31,0x02,0x06,0x0d,0x31, 0x01,0x0d,0x30,0x02,0x0d,0x2f,0x02,0x0e,0x31,0x02,0x0d,0x31,0x02,0x0c,0x2f, 0x02,0x82,0x0c,0x2f,0x01,0x06,0x0b,0x2f,0x01,0x0c,0x2f,0x02,0x0d,0x2f,0x02, 0x0d,0x2e,0x02,0x0c,0x2e,0x02,0x0c,0x2d,0x02,0x82,0x0c,0x2e,0x01,0x01,0x0b, 0x2d,0x01,0x82,0x0b,0x2d,0x02,0x06,0x0b,0x2c,0x02,0x0b,0x2c,0x01,0x0c,0x2d, 0x01,0x0c,0x2b,0x02,0x0a,0x2c,0x02,0x0b,0x2c,0x01,0x83,0x0b,0x2b,0x01,0x82, 0x0b,0x2a,0x01,0x01,0x0a,0x2b,0x01,0x82,0x0b,0x2b,0x01,0x06,0x0b,0x2a,0x00, 0x0a,0x29,0x01,0x09,0x2a,0x02,0x0a,0x29,0x01,0x0a,0x28,0x01,0x09,0x29,0x00, 0x82,0x09,0x29,0x01,0x01,0x0a,0x28,0x01,0x83,0x09,0x28,0x01,0x01,0x0a,0x28, 0x01,0x82,0x0a,0x27,0x02,0x01,0x09,0x26,0x01,0x82,0x0a,0x27,0x02,0x07,0x09, 0x27,0x01,0x09,0x27,0x02,0x09,0x26,0x01,0x09,0x27,0x02,0x09,0x26,0x02,0x09, 0x25,0x01,0x09,0x25,0x02,0x85,0x09,0x25,0x01,0x84,0x09,0x24,0x01,0x01,0x09, 0x24,0x02,0x82,0x09,0x23,0x01,0x05,0x08,0x22,0x01,0x08,0x23,0x01,0x08,0x22, 0x01,0x09,0x23,0x01,0x09,0x22,0x01,0x83,0x08,0x22,0x01,0x84,0x08,0x21,0x01, 0x01,0x08,0x20,0x01,0x82,0x08,0x21,0x01,0x83,0x08,0x20,0x01,0x05,0x07,0x20, 0x00,0x08,0x20,0x01,0x08,0x1f,0x01,0x07,0x1f,0x01,0x07,0x1e,0x00,0x85,0x07, 0x1e,0x01,0x82,0x07,0x1d,0x00,0x01,0x07,0x1d,0x01,0x82,0x07,0x1d,0x00,0x82, 0x07,0x1d,0x01,0x16,0x07,0x1c,0x01,0x06,0x1c,0x00,0x07,0x1c,0x01,0x07,0x1c, 0x00,0x06,0x1c,0x00,0x07,0x1c,0x00,0x06,0x1b,0x00,0x07,0x1c,0x00,0x06,0x1c, 0x00,0x06,0x1b,0x00,0x07,0x1b,0x00,0x07,0x1b,0x01,0x06,0x1a,0x00,0x07,0x1a, 0x00,0x06,0x1a,0x00,0x06,0x1a,0x01,0x05,0x1a,0x01,0x05,0x1a,0x00,0x06,0x1a, 0x00,0x05,0x1a,0x00,0x06,0x1a,0x00,0x06,0x19,0x01,0x85,0x05,0x19,0x00,0x86, 0x05,0x18,0x00,0x82,0x05,0x17,0x00,0x01,0x05,0x18,0x01,0x84,0x05,0x17,0x00, 0x86,0x04,0x16,0x00,0x82,0x05,0x16,0x00,0x82,0x04,0x16,0x00,0x88,0x04,0x15, 0x00,0x02,0x04,0x14,0x00,0x04,0x13,0x00,0x82,0x04,0x14,0x00,0x8d,0x04,0x13, 0x00,0x8b,0x04,0x12,0x00,0x84,0x04,0x11,0x00,0x08,0x04,0x10,0x00,0x04,0x11, 0x00,0x05,0x12,0x01,0x05,0x13,0x00,0x05,0x13,0x01,0x07,0x14,0x01,0x07,0x14, 0x02,0x08,0x15,0x04,0x82,0x08,0x14,0x04,0x01,0x08,0x13,0x03,0x82,0x08,0x14, 0x04,0x04,0x08,0x13,0x03,0x08,0x13,0x04,0x07,0x12,0x03,0x08,0x13,0x04,0x82, 0x08,0x13,0x03,0x83,0x07,0x12,0x03,0x02,0x08,0x12,0x03,0x07,0x11,0x03,0x82, 0x07,0x10,0x03,0x01,0x07,0x11,0x03,0x84,0x07,0x10,0x03,0x01,0x07,0x0f,0x03, 0x82,0x06,0x0f,0x02,0x82,0x05,0x0e,0x02,0x82,0x05,0x0d,0x02,0x85,0x05,0x0c, 0x02,0x01,0x04,0x0c,0x02,0x85,0x04,0x0b,0x02,0x83,0x04,0x0a,0x02,0x82,0x04, 0x09,0x01,0x82,0x03,0x09,0x01,0x84,0x03,0x08,0x01,0x01,0x02,0x08,0x01,0x84, 0x02,0x07,0x01,0x83,0x02,0x06,0x01,0x83,0x02,0x05,0x01,0x82,0x01,0x05,0x01, 0x84,0x01,0x04,0x00,0x83,0x01,0x03,0x00,0x83,0x01,0x02,0x00,0x82,0x00,0x02, 0x00,0x85,0x00,0x01,0x00,0xdd,0x00,0x00,0x00,0x82,0x3f,0x7f,0x15,0x03,0x3f, 0x7f,0x17,0x3e,0x7f,0x16,0x3f,0x7e,0x16,0x83,0x3f,0x7f,0x17,0x03,0x3f,0x7e, 0x15,0x40,0x7d,0x16,0x3f,0x7e,0x16,0x82,0x3f,0x7f,0x15,0x04,0x3f,0x7e,0x15, 0x3e,0x7d,0x15,0x3e,0x7d,0x14,0x3f,0x7e,0x15,0x82,0x3e,0x7d,0x14,0x03,0x3f, 0x7e,0x15,0x40,0x7f,0x17,0x3f,0x7e,0x16,0x82,0x3e,0x7d,0x15,0x05,0x3e,0x7f, 0x15,0x3e,0x7f,0x16,0x3e,0x7d,0x15,0x3e,0x7e,0x15,0x3e,0x7e,0x14,0x83,0x3e, 0x7e,0x15,0x04,0x3e,0x7d,0x14,0x3e,0x7e,0x15,0x3d,0x7f,0x14,0x3f,0x7c,0x15, 0x82,0x3e,0x7d,0x15,0x0a,0x3e,0x7d,0x17,0x3e,0x7d,0x14,0x3c,0x7c,0x15,0x3d, 0x7c,0x14,0x3e,0x7d,0x15,0x3f,0x7c,0x15,0x3e,0x7c,0x15,0x3d,0x7c,0x15,0x3d, 0x7d,0x16,0x3e,0x7f,0x17,0x82,0x3e,0x7d,0x16,0x01,0x3d,0x7c,0x15,0x84,0x3d, 0x7c,0x17,0x02,0x3c,0x7c,0x17,0x3f,0x7c,0x17,0x82,0x3d,0x7c,0x17,0x02,0x3e, 0x7c,0x18,0x3d,0x7c,0x17,0x83,0x3d,0x7c,0x18,0x04,0x3c,0x7b,0x18,0x3e,0x7c, 0x19,0x3e,0x7b,0x19,0x3d,0x7a,0x18,0x82,0x3e,0x7a,0x19,0x04,0x3c,0x7a,0x19, 0x3d,0x7b,0x19,0x3f,0x7b,0x1b,0x3f,0x7c,0x1c,0x82,0x3e,0x7a,0x1b,0x01,0x3f, 0x7b,0x1b,0x83,0x3e,0x7a,0x1b,0x01,0x3e,0x7a,0x1c,0x82,0x3e,0x7a,0x1b,0x84, 0x3e,0x7a,0x1c,0x01,0x3e,0x79,0x1d,0x82,0x3f,0x7a,0x1e,0x82,0x3e,0x7a,0x1e, 0x09,0x3f,0x7a,0x1f,0x3f,0x79,0x1f,0x3f,0x7a,0x1f,0x3e,0x7a,0x1f,0x3e,0x79, 0x1e,0x3e,0x7a,0x1f,0x3f,0x7a,0x1f,0x3f,0x7a,0x20,0x3f,0x79,0x1f,0x83,0x3e, 0x79,0x1f,0x01,0x3c,0x79,0x1f,0x84,0x3e,0x79,0x1f,0x03,0x3f,0x79,0x1f,0x3e, 0x79,0x1f,0x3e,0x78,0x20,0x83,0x3e,0x79,0x1f,0x04,0x3f,0x79,0x1f,0x3e,0x79, 0x1f,0x3e,0x77,0x1f,0x3e,0x78,0x20,0x86,0x3e,0x79,0x1f,0x01,0x3e,0x78,0x20, 0x82,0x3d,0x78,0x1e,0x0b,0x3e,0x79,0x1f,0x3d,0x77,0x1f,0x3c,0x76,0x1e,0x3e, 0x78,0x1e,0x3e,0x79,0x1f,0x3d,0x77,0x1e,0x3c,0x76,0x1e,0x3d,0x78,0x1f,0x3e, 0x77,0x1f,0x3c,0x76,0x1e,0x3d,0x77,0x1f,0x82,0x3c,0x76,0x1e,0x03,0x3d,0x77, 0x1f,0x3b,0x76,0x1e,0x3a,0x75,0x1c,0x83,0x3c,0x76,0x1e,0x06,0x3b,0x75,0x1d, 0x3c,0x76,0x1e,0x3b,0x75,0x1d,0x3b,0x74,0x1e,0x3c,0x74,0x1e,0x3b,0x74,0x1e, 0x82,0x39,0x73,0x1c,0x01,0x3a,0x74,0x1d,0x85,0x39,0x73,0x1c,0x06,0x38,0x72, 0x1b,0x39,0x73,0x1c,0x38,0x72,0x1b,0x3a,0x74,0x1d,0x38,0x72,0x1c,0x36,0x70, 0x1b,0x82,0x37,0x71,0x1b,0x03,0x38,0x72,0x1c,0x37,0x71,0x1b,0x36,0x70,0x1b, 0x82,0x37,0x71,0x1b,0x03,0x36,0x70,0x1b,0x35,0x6f,0x19,0x35,0x6f,0x1b,0x82, 0x36,0x6f,0x1b,0x1b,0x35,0x6e,0x1a,0x34,0x6d,0x19,0x35,0x6e,0x1a,0x35,0x6f, 0x1b,0x34,0x6d,0x1a,0x33,0x6d,0x19,0x34,0x6d,0x1a,0x35,0x6c,0x19,0x33,0x6b, 0x18,0x34,0x6c,0x19,0x35,0x6c,0x19,0x33,0x6d,0x19,0x32,0x6c,0x18,0x32,0x6b, 0x18,0x32,0x6c,0x18,0x33,0x6c,0x18,0x32,0x6a,0x17,0x33,0x6b,0x18,0x33,0x6a, 0x18,0x33,0x6a,0x19,0x34,0x6c,0x1b,0x32,0x69,0x18,0x31,0x68,0x17,0x28,0x5e, 0x0f,0x25,0x5b,0x0e,0x21,0x58,0x0b,0x1e,0x55,0x08,0x82,0x1e,0x55,0x0a,0x01, 0x1f,0x55,0x0a,0x82,0x20,0x56,0x0b,0x83,0x1f,0x55,0x0a,0x83,0x1f,0x54,0x0b, 0x02,0x1d,0x52,0x09,0x1e,0x53,0x0a,0x82,0x1d,0x53,0x08,0x02,0x1d,0x52,0x09, 0x1c,0x52,0x08,0x82,0x1c,0x51,0x08,0x01,0x1d,0x52,0x09,0x84,0x1b,0x50,0x08, 0x87,0x1b,0x50,0x07,0x82,0x19,0x4f,0x06,0x02,0x18,0x4d,0x05,0x1a,0x4e,0x06, 0x82,0x19,0x4d,0x05,0x82,0x19,0x4d,0x07,0x82,0x18,0x4d,0x06,0x05,0x18,0x4d, 0x05,0x18,0x4c,0x05,0x18,0x4d,0x06,0x18,0x4c,0x05,0x18,0x4d,0x06,0x86,0x18, 0x4c,0x05,0x82,0x17,0x4c,0x05,0x05,0x18,0x4c,0x05,0x18,0x4d,0x06,0x18,0x4d, 0x04,0x18,0x4d,0x05,0x18,0x4f,0x05,0x82,0x18,0x4d,0x05,0x08,0x18,0x4f,0x05, 0x18,0x4e,0x05,0x18,0x4d,0x04,0x18,0x4e,0x04,0x18,0x4f,0x05,0x19,0x4e,0x05, 0x18,0x4d,0x04,0x18,0x4d,0x05,0x82,0x18,0x4f,0x05,0x82,0x18,0x4e,0x04,0x01, 0x18,0x4f,0x05,0x82,0x19,0x4e,0x05,0x02,0x18,0x4f,0x05,0x18,0x4e,0x04,0x82, 0x18,0x4f,0x05,0x06,0x19,0x4f,0x05,0x19,0x4e,0x05,0x18,0x4e,0x03,0x18,0x4f, 0x05,0x19,0x4e,0x05,0x18,0x4d,0x05,0x82,0x18,0x4d,0x04,0x05,0x19,0x4e,0x05, 0x18,0x4f,0x05,0x19,0x4f,0x06,0x17,0x4d,0x03,0x18,0x4c,0x05,0x82,0x18,0x4d, 0x05,0x06,0x17,0x4c,0x05,0x17,0x4c,0x04,0x17,0x4b,0x04,0x17,0x4c,0x04,0x17, 0x4b,0x03,0x17,0x4b,0x05,0x82,0x17,0x4a,0x04,0x04,0x17,0x4b,0x05,0x17,0x49, 0x04,0x15,0x49,0x05,0x16,0x49,0x04,0x82,0x17,0x49,0x04,0x82,0x16,0x48,0x04, 0x03,0x15,0x48,0x04,0x16,0x48,0x05,0x15,0x47,0x05,0x82,0x15,0x46,0x04,0x85, 0x15,0x46,0x05,0x09,0x15,0x46,0x04,0x15,0x45,0x05,0x15,0x44,0x04,0x14,0x43, 0x04,0x14,0x43,0x03,0x14,0x43,0x04,0x13,0x43,0x04,0x14,0x43,0x04,0x14,0x42, 0x03,0x82,0x14,0x43,0x04,0x04,0x13,0x42,0x03,0x12,0x42,0x03,0x13,0x41,0x03, 0x14,0x42,0x04,0x82,0x13,0x40,0x03,0x0c,0x13,0x41,0x04,0x14,0x40,0x03,0x12, 0x3f,0x04,0x11,0x40,0x02,0x12,0x40,0x04,0x12,0x3f,0x03,0x11,0x3f,0x04,0x13, 0x3e,0x03,0x12,0x3f,0x03,0x11,0x3f,0x03,0x11,0x3e,0x03,0x12,0x3d,0x03,0x82, 0x11,0x3e,0x03,0x02,0x12,0x3d,0x03,0x10,0x3c,0x03,0x82,0x11,0x3d,0x04,0x07, 0x11,0x3c,0x02,0x10,0x3b,0x02,0x11,0x3c,0x03,0x10,0x3b,0x02,0x10,0x3b,0x03, 0x0f,0x3b,0x03,0x11,0x39,0x02,0x82,0x11,0x3a,0x02,0x03,0x0f,0x3a,0x02,0x0f, 0x39,0x02,0x0f,0x39,0x03,0x82,0x0f,0x39,0x02,0x1b,0x0e,0x39,0x02,0x0f,0x38, 0x02,0x10,0x38,0x03,0x0f,0x37,0x02,0x0f,0x36,0x02,0x10,0x38,0x03,0x0f,0x38, 0x04,0x0f,0x38,0x02,0x10,0x37,0x02,0x0e,0x36,0x02,0x0f,0x36,0x02,0x0e,0x36, 0x01,0x0f,0x36,0x02,0x0e,0x35,0x02,0x0e,0x36,0x02,0x0e,0x35,0x02,0x0e,0x36, 0x02,0x0d,0x35,0x01,0x0e,0x34,0x02,0x0d,0x34,0x02,0x0d,0x33,0x02,0x0e,0x33, 0x02,0x0d,0x33,0x02,0x0c,0x33,0x01,0x0e,0x33,0x02,0x0d,0x33,0x02,0x0e,0x33, 0x01,0x82,0x0d,0x33,0x02,0x01,0x0c,0x33,0x02,0x82,0x0c,0x32,0x02,0x02,0x0d, 0x31,0x01,0x0e,0x32,0x02,0x82,0x0d,0x31,0x02,0x02,0x0d,0x31,0x01,0x0d,0x31, 0x02,0x83,0x0c,0x31,0x02,0x82,0x0c,0x30,0x02,0x0b,0x0b,0x2f,0x01,0x0c,0x2f, 0x01,0x0d,0x2f,0x02,0x0c,0x2e,0x02,0x0b,0x2e,0x01,0x0c,0x2f,0x01,0x0c,0x2f, 0x02,0x0b,0x2e,0x01,0x0b,0x2e,0x02,0x0c,0x2e,0x02,0x0b,0x2c,0x01,0x82,0x0b, 0x2d,0x01,0x08,0x0b,0x2e,0x02,0x0b,0x2d,0x01,0x0b,0x2c,0x01,0x0c,0x2c,0x01, 0x0c,0x2c,0x02,0x0c,0x2b,0x01,0x0b,0x2b,0x01,0x0a,0x2b,0x01,0x82,0x0b,0x2b, 0x01,0x02,0x0a,0x2a,0x00,0x0a,0x2b,0x01,0x82,0x0b,0x2a,0x01,0x03,0x0b,0x29, 0x01,0x0a,0x2a,0x01,0x0a,0x29,0x01,0x82,0x0b,0x29,0x01,0x03,0x09,0x29,0x01, 0x0a,0x29,0x01,0x0b,0x29,0x01,0x84,0x0a,0x28,0x01,0x88,0x0a,0x26,0x01,0x04, 0x0b,0x27,0x02,0x0a,0x26,0x01,0x09,0x25,0x01,0x0a,0x26,0x02,0x82,0x0a,0x25, 0x01,0x02,0x09,0x25,0x01,0x0a,0x25,0x01,0x83,0x09,0x25,0x01,0x83,0x09,0x24, 0x01,0x03,0x08,0x23,0x01,0x09,0x23,0x01,0x09,0x24,0x01,0x82,0x08,0x23,0x01, 0x01,0x09,0x23,0x01,0x84,0x08,0x22,0x01,0x89,0x08,0x21,0x01,0x04,0x07,0x20, 0x01,0x07,0x1f,0x00,0x07,0x20,0x01,0x07,0x1f,0x01,0x82,0x07,0x1e,0x00,0x85, 0x07,0x1e,0x01,0x82,0x07,0x1e,0x00,0x01,0x07,0x1e,0x01,0x82,0x07,0x1d,0x01, 0x82,0x07,0x1c,0x01,0x02,0x07,0x1c,0x00,0x07,0x1d,0x00,0x83,0x07,0x1c,0x00, 0x02,0x07,0x1c,0x01,0x06,0x1c,0x00,0x82,0x06,0x1b,0x01,0x82,0x07,0x1b,0x00, 0x83,0x06,0x1b,0x00,0x06,0x05,0x1b,0x00,0x06,0x1b,0x00,0x06,0x1a,0x00,0x05, 0x19,0x00,0x06,0x1a,0x00,0x06,0x19,0x00,0x84,0x05,0x19,0x00,0x88,0x05,0x18, 0x00,0x02,0x05,0x17,0x00,0x05,0x18,0x00,0x86,0x05,0x17,0x00,0x83,0x04,0x17, 0x00,0x01,0x05,0x17,0x00,0x84,0x04,0x16,0x00,0x87,0x04,0x15,0x00,0x8a,0x04, 0x14,0x00,0x83,0x04,0x13,0x00,0x01,0x04,0x12,0x00,0x83,0x04,0x13,0x00,0x8b, 0x04,0x12,0x00,0x01,0x04,0x11,0x01,0x87,0x04,0x11,0x00,0x07,0x04,0x10,0x00, 0x04,0x11,0x00,0x05,0x12,0x01,0x05,0x13,0x01,0x06,0x14,0x01,0x07,0x14,0x01, 0x08,0x15,0x04,0x83,0x08,0x14,0x04,0x05,0x08,0x14,0x03,0x08,0x14,0x04,0x08, 0x13,0x03,0x07,0x12,0x03,0x08,0x12,0x04,0x83,0x08,0x12,0x03,0x82,0x07,0x12, 0x03,0x85,0x07,0x11,0x03,0x02,0x07,0x10,0x03,0x07,0x0f,0x02,0x82,0x07,0x10, 0x03,0x05,0x06,0x0f,0x03,0x07,0x0f,0x03,0x06,0x0f,0x03,0x06,0x0e,0x03,0x05, 0x0e,0x02,0x82,0x05,0x0d,0x02,0x84,0x05,0x0c,0x02,0x01,0x04,0x0c,0x02,0x85, 0x04,0x0b,0x02,0x84,0x04,0x0a,0x02,0x82,0x04,0x0a,0x01,0x01,0x03,0x09,0x01, 0x84,0x03,0x08,0x01,0x01,0x02,0x08,0x01,0x85,0x02,0x07,0x01,0x82,0x02,0x06, 0x01,0x83,0x02,0x05,0x01,0x82,0x01,0x05,0x01,0x01,0x01,0x04,0x01,0x84,0x01, 0x04,0x00,0x82,0x01,0x03,0x00,0x83,0x01,0x02,0x00,0x82,0x00,0x02,0x00,0x85, 0x00,0x01,0x00,0xdd,0x00,0x00,0x00,0x04,0x3f,0x7f,0x15,0x40,0x80,0x16,0x41, 0x81,0x17,0x3f,0x81,0x16,0x82,0x40,0x80,0x16,0x82,0x3f,0x7f,0x16,0x01,0x3f, 0x80,0x15,0x82,0x40,0x80,0x17,0x05,0x3e,0x7f,0x14,0x3f,0x7f,0x14,0x3f,0x7f, 0x16,0x3e,0x7f,0x16,0x3e,0x7f,0x14,0x84,0x3f,0x7f,0x14,0x83,0x3f,0x7f,0x16, 0x07,0x3e,0x7e,0x15,0x3f,0x80,0x15,0x40,0x7e,0x16,0x3f,0x7d,0x14,0x3f,0x7f, 0x16,0x3e,0x7f,0x16,0x3f,0x7f,0x16,0x82,0x3e,0x7e,0x15,0x03,0x3e,0x7f,0x14, 0x3e,0x7e,0x15,0x3e,0x7f,0x14,0x82,0x3f,0x7f,0x16,0x03,0x3f,0x7d,0x16,0x3e, 0x7e,0x16,0x3e,0x7e,0x15,0x84,0x3e,0x7e,0x16,0x01,0x3f,0x7d,0x16,0x83,0x3e, 0x7e,0x16,0x01,0x3d,0x7d,0x15,0x82,0x3e,0x7e,0x16,0x02,0x3e,0x7e,0x17,0x3f, 0x7d,0x17,0x82,0x3e,0x7d,0x17,0x02,0x3c,0x7c,0x16,0x3f,0x7e,0x18,0x83,0x3e, 0x7d,0x17,0x02,0x3e,0x7d,0x19,0x3d,0x7c,0x18,0x82,0x3c,0x7c,0x17,0x07,0x3e, 0x7c,0x18,0x3f,0x7d,0x18,0x3f,0x7c,0x1a,0x3e,0x7c,0x19,0x3d,0x7c,0x19,0x3d, 0x7c,0x1a,0x3e,0x7c,0x1a,0x82,0x3e,0x7c,0x1b,0x02,0x3f,0x7c,0x1b,0x3e,0x7b, 0x1b,0x82,0x3e,0x7b,0x1a,0x82,0x3e,0x7b,0x1b,0x02,0x3d,0x7c,0x1b,0x3f,0x7b, 0x1d,0x82,0x3f,0x7c,0x1c,0x82,0x3e,0x7b,0x1d,0x82,0x3f,0x7b,0x1d,0x02,0x3e, 0x7b,0x1d,0x3f,0x7b,0x1e,0x82,0x3e,0x7a,0x1d,0x03,0x3e,0x7b,0x1d,0x3e,0x7b, 0x1f,0x3f,0x7a,0x1f,0x82,0x3f,0x7b,0x1f,0x82,0x3e,0x7b,0x1f,0x01,0x3f,0x7b, 0x1f,0x82,0x3f,0x7b,0x20,0x01,0x3f,0x7a,0x1f,0x82,0x3e,0x7a,0x1f,0x01,0x3f, 0x7b,0x20,0x82,0x3f,0x7a,0x1f,0x82,0x3f,0x7b,0x20,0x82,0x3e,0x7a,0x1f,0x03, 0x3d,0x7b,0x1f,0x3e,0x79,0x1f,0x3e,0x7a,0x20,0x82,0x3e,0x7a,0x1f,0x01,0x3e, 0x79,0x1f,0x82,0x3e,0x79,0x20,0x01,0x3e,0x79,0x1f,0x82,0x3e,0x7a,0x1f,0x82, 0x3e,0x79,0x1f,0x84,0x3e,0x79,0x20,0x04,0x3d,0x79,0x1e,0x3e,0x79,0x20,0x3e, 0x78,0x1f,0x3d,0x79,0x1e,0x83,0x3e,0x79,0x1f,0x01,0x3d,0x79,0x1e,0x82,0x3d, 0x79,0x1f,0x01,0x3e,0x78,0x1f,0x82,0x3d,0x78,0x1f,0x01,0x3e,0x78,0x1f,0x83, 0x3c,0x78,0x1e,0x07,0x3c,0x78,0x1f,0x3d,0x78,0x1f,0x3c,0x76,0x1d,0x3c,0x78, 0x1e,0x3c,0x76,0x1d,0x3b,0x76,0x1e,0x3c,0x77,0x1f,0x84,0x3b,0x76,0x1e,0x04, 0x3a,0x75,0x1d,0x3b,0x75,0x1d,0x3b,0x76,0x1e,0x3a,0x75,0x1d,0x82,0x3b,0x73, 0x1c,0x09,0x39,0x74,0x1c,0x39,0x73,0x1c,0x38,0x72,0x1a,0x39,0x73,0x1c,0x39, 0x73,0x1d,0x38,0x73,0x1c,0x38,0x72,0x1c,0x39,0x74,0x1d,0x38,0x72,0x1c,0x82, 0x37,0x72,0x1b,0x07,0x37,0x71,0x1c,0x36,0x71,0x1a,0x38,0x72,0x1c,0x37,0x71, 0x1c,0x35,0x70,0x19,0x36,0x71,0x1a,0x35,0x6f,0x1a,0x82,0x36,0x70,0x1c,0x07, 0x37,0x71,0x1c,0x36,0x70,0x1b,0x35,0x6f,0x1a,0x35,0x6f,0x1b,0x35,0x6f,0x1a, 0x34,0x6e,0x19,0x34,0x6e,0x1a,0x83,0x33,0x6d,0x19,0x25,0x32,0x6c,0x17,0x33, 0x6d,0x19,0x35,0x6d,0x19,0x34,0x6c,0x19,0x33,0x6c,0x18,0x33,0x6c,0x17,0x33, 0x6b,0x17,0x33,0x6c,0x18,0x33,0x6d,0x19,0x35,0x6d,0x19,0x33,0x6b,0x17,0x35, 0x6d,0x1a,0x32,0x6a,0x19,0x2e,0x66,0x14,0x2b,0x62,0x13,0x24,0x5c,0x0d,0x21, 0x58,0x0c,0x20,0x56,0x0a,0x1f,0x55,0x09,0x1f,0x56,0x0a,0x1f,0x56,0x08,0x20, 0x57,0x0b,0x20,0x56,0x0a,0x1f,0x54,0x0a,0x20,0x56,0x09,0x1f,0x55,0x08,0x1f, 0x55,0x09,0x1d,0x54,0x09,0x1c,0x53,0x08,0x1d,0x54,0x09,0x1d,0x53,0x09,0x1d, 0x53,0x08,0x1e,0x54,0x0a,0x1c,0x51,0x07,0x1d,0x53,0x09,0x1d,0x53,0x08,0x1b, 0x51,0x07,0x83,0x1c,0x51,0x07,0x02,0x1c,0x53,0x08,0x1b,0x52,0x07,0x83,0x1c, 0x51,0x07,0x05,0x1a,0x50,0x07,0x1a,0x50,0x06,0x1a,0x4e,0x07,0x1b,0x51,0x07, 0x1a,0x50,0x07,0x82,0x19,0x4f,0x05,0x83,0x19,0x4e,0x05,0x03,0x1a,0x4e,0x05, 0x1a,0x4f,0x07,0x19,0x4e,0x07,0x82,0x19,0x4e,0x06,0x02,0x18,0x4d,0x05,0x19, 0x4d,0x05,0x84,0x18,0x4d,0x05,0x04,0x17,0x4d,0x05,0x17,0x4c,0x04,0x19,0x4e, 0x06,0x18,0x4d,0x05,0x82,0x18,0x4e,0x04,0x02,0x18,0x4f,0x05,0x18,0x4e,0x04, 0x82,0x19,0x4e,0x05,0x01,0x18,0x4f,0x05,0x82,0x18,0x4e,0x04,0x02,0x18,0x4f, 0x05,0x19,0x4e,0x05,0x83,0x19,0x50,0x05,0x82,0x18,0x4f,0x04,0x02,0x19,0x50, 0x05,0x18,0x4f,0x04,0x82,0x19,0x50,0x05,0x01,0x19,0x4f,0x05,0x83,0x19,0x4e, 0x05,0x83,0x19,0x50,0x05,0x02,0x18,0x4f,0x04,0x17,0x4e,0x04,0x82,0x18,0x4f, 0x05,0x02,0x17,0x4f,0x05,0x18,0x4f,0x05,0x83,0x18,0x4e,0x04,0x82,0x18,0x4f, 0x05,0x07,0x19,0x50,0x05,0x18,0x4d,0x05,0x18,0x4e,0x04,0x19,0x4d,0x05,0x18, 0x4c,0x04,0x17,0x4b,0x03,0x18,0x4c,0x05,0x83,0x17,0x4b,0x05,0x01,0x17,0x4a, 0x04,0x82,0x16,0x4a,0x04,0x82,0x17,0x4a,0x04,0x03,0x16,0x49,0x04,0x16,0x48, 0x04,0x15,0x48,0x03,0x83,0x16,0x48,0x04,0x02,0x15,0x47,0x03,0x15,0x47,0x04, 0x82,0x15,0x46,0x04,0x05,0x14,0x45,0x04,0x15,0x47,0x05,0x15,0x47,0x04,0x14, 0x46,0x04,0x15,0x45,0x04,0x86,0x14,0x44,0x04,0x82,0x14,0x43,0x04,0x82,0x13, 0x42,0x03,0x83,0x14,0x42,0x04,0x01,0x13,0x42,0x04,0x82,0x13,0x41,0x03,0x05, 0x13,0x3f,0x04,0x14,0x41,0x03,0x12,0x40,0x04,0x13,0x40,0x03,0x14,0x3f,0x04, 0x82,0x13,0x41,0x04,0x03,0x13,0x41,0x03,0x12,0x3f,0x03,0x13,0x3f,0x04,0x82, 0x11,0x3e,0x03,0x0a,0x12,0x3f,0x04,0x11,0x3e,0x02,0x11,0x3d,0x02,0x11,0x3e, 0x03,0x11,0x3d,0x03,0x10,0x3c,0x02,0x11,0x3d,0x03,0x10,0x3d,0x02,0x10,0x3c, 0x02,0x11,0x3c,0x02,0x82,0x11,0x3b,0x02,0x83,0x10,0x3b,0x02,0x82,0x10,0x3a, 0x02,0x01,0x10,0x3b,0x02,0x84,0x0f,0x39,0x02,0x01,0x0e,0x38,0x02,0x83,0x10, 0x38,0x02,0x0c,0x0f,0x38,0x02,0x0e,0x37,0x02,0x0f,0x36,0x02,0x0e,0x37,0x02, 0x0f,0x36,0x02,0x0e,0x36,0x02,0x10,0x37,0x03,0x0f,0x37,0x03,0x0f,0x35,0x02, 0x0e,0x36,0x03,0x0f,0x36,0x03,0x0d,0x35,0x02,0x82,0x0e,0x34,0x02,0x02,0x0d, 0x34,0x02,0x0e,0x34,0x02,0x82,0x0e,0x35,0x02,0x04,0x0d,0x33,0x01,0x0d,0x34, 0x02,0x0e,0x34,0x02,0x0d,0x33,0x02,0x82,0x0d,0x32,0x02,0x84,0x0e,0x32,0x02, 0x03,0x0d,0x32,0x02,0x0d,0x31,0x02,0x0c,0x30,0x01,0x82,0x0d,0x31,0x02,0x03, 0x0c,0x31,0x02,0x0c,0x30,0x02,0x0d,0x30,0x01,0x82,0x0c,0x30,0x02,0x04,0x0d, 0x2f,0x01,0x0b,0x2f,0x02,0x0d,0x2e,0x01,0x0d,0x2f,0x01,0x82,0x0b,0x2f,0x01, 0x82,0x0c,0x2e,0x02,0x05,0x0b,0x2e,0x01,0x0c,0x2e,0x01,0x0b,0x2e,0x01,0x0c, 0x2e,0x01,0x0b,0x2d,0x01,0x82,0x0b,0x2c,0x00,0x82,0x0b,0x2c,0x01,0x06,0x0b, 0x2b,0x01,0x0b,0x2b,0x02,0x0b,0x2b,0x01,0x0a,0x2c,0x01,0x0a,0x2b,0x01,0x0b, 0x2b,0x01,0x82,0x0a,0x2a,0x01,0x05,0x0a,0x2b,0x01,0x0b,0x29,0x01,0x09,0x29, 0x01,0x09,0x2a,0x01,0x0a,0x29,0x01,0x82,0x0b,0x29,0x01,0x01,0x0a,0x28,0x01, 0x85,0x0a,0x29,0x01,0x02,0x09,0x28,0x01,0x09,0x28,0x02,0x83,0x0a,0x27,0x01, 0x02,0x0a,0x26,0x01,0x0a,0x27,0x01,0x82,0x0a,0x26,0x01,0x03,0x09,0x26,0x01, 0x0a,0x26,0x02,0x0a,0x25,0x01,0x82,0x0a,0x26,0x01,0x85,0x09,0x25,0x01,0x01, 0x09,0x24,0x01,0x82,0x08,0x23,0x01,0x01,0x08,0x24,0x01,0x85,0x08,0x23,0x01, 0x01,0x08,0x22,0x00,0x84,0x08,0x22,0x01,0x06,0x08,0x21,0x01,0x08,0x22,0x01, 0x08,0x21,0x01,0x07,0x21,0x01,0x08,0x21,0x01,0x07,0x20,0x00,0x82,0x08,0x20, 0x01,0x04,0x07,0x20,0x00,0x08,0x20,0x01,0x07,0x1f,0x00,0x07,0x1f,0x01,0x82, 0x08,0x1f,0x01,0x82,0x07,0x1f,0x00,0x83,0x07,0x1e,0x00,0x04,0x07,0x1e,0x01, 0x07,0x1d,0x01,0x07,0x1d,0x00,0x07,0x1d,0x01,0x83,0x06,0x1d,0x00,0x82,0x07, 0x1d,0x00,0x82,0x07,0x1c,0x00,0x01,0x06,0x1c,0x00,0x82,0x06,0x1c,0x01,0x82, 0x07,0x1c,0x00,0x82,0x06,0x1c,0x00,0x03,0x06,0x1b,0x00,0x05,0x1b,0x00,0x06, 0x1b,0x00,0x85,0x06,0x1a,0x00,0x01,0x05,0x1a,0x00,0x84,0x05,0x19,0x00,0x01, 0x05,0x18,0x00,0x82,0x05,0x19,0x00,0x83,0x05,0x18,0x00,0x88,0x05,0x17,0x00, 0x04,0x04,0x16,0x00,0x04,0x17,0x00,0x05,0x17,0x00,0x05,0x16,0x00,0x86,0x04, 0x16,0x00,0x83,0x04,0x15,0x00,0x89,0x04,0x14,0x00,0x8d,0x04,0x13,0x00,0x83, 0x04,0x12,0x00,0x8c,0x04,0x11,0x00,0x84,0x04,0x10,0x00,0x04,0x04,0x11,0x01, 0x05,0x12,0x00,0x05,0x13,0x00,0x06,0x13,0x01,0x82,0x07,0x14,0x02,0x82,0x08, 0x14,0x04,0x82,0x08,0x13,0x04,0x08,0x08,0x13,0x03,0x07,0x13,0x03,0x08,0x13, 0x04,0x07,0x13,0x04,0x07,0x13,0x03,0x08,0x13,0x04,0x07,0x11,0x03,0x07,0x11, 0x04,0x84,0x07,0x11,0x03,0x84,0x07,0x10,0x03,0x04,0x06,0x0f,0x02,0x06,0x10, 0x03,0x06,0x0f,0x02,0x06,0x0e,0x02,0x82,0x06,0x0e,0x03,0x01,0x05,0x0e,0x02, 0x83,0x05,0x0d,0x02,0x01,0x05,0x0c,0x02,0x82,0x04,0x0c,0x02,0x84,0x04,0x0b, 0x02,0x82,0x04,0x0a,0x02,0x83,0x04,0x0a,0x01,0x02,0x04,0x09,0x01,0x03,0x09, 0x01,0x84,0x03,0x08,0x01,0x01,0x02,0x08,0x01,0x85,0x02,0x07,0x01,0x82,0x02, 0x06,0x01,0x83,0x02,0x05,0x01,0x82,0x01,0x05,0x01,0x85,0x01,0x04,0x00,0x82, 0x01,0x03,0x00,0x83,0x01,0x02,0x00,0x82,0x00,0x02,0x00,0x85,0x00,0x01,0x00, 0xdd,0x00,0x00,0x00,0x01,0x41,0x80,0x16,0x82,0x41,0x81,0x17,0x82,0x40,0x82, 0x16,0x06,0x40,0x81,0x15,0x3f,0x81,0x16,0x3e,0x80,0x15,0x40,0x81,0x15,0x3f, 0x81,0x16,0x40,0x81,0x16,0x82,0x41,0x81,0x16,0x03,0x40,0x81,0x16,0x40,0x80, 0x16,0x3f,0x82,0x15,0x83,0x40,0x81,0x15,0x01,0x40,0x80,0x15,0x83,0x3f,0x80, 0x15,0x05,0x40,0x80,0x16,0x40,0x81,0x16,0x40,0x80,0x16,0x3f,0x80,0x15,0x40, 0x80,0x16,0x82,0x3e,0x80,0x15,0x82,0x3f,0x80,0x15,0x01,0x3e,0x80,0x15,0x82, 0x3f,0x80,0x15,0x08,0x3e,0x7f,0x15,0x3e,0x80,0x15,0x40,0x7e,0x16,0x3e,0x7f, 0x16,0x3e,0x7f,0x15,0x3e,0x80,0x15,0x3e,0x7f,0x15,0x3e,0x80,0x15,0x82,0x3e, 0x7f,0x16,0x05,0x3f,0x80,0x16,0x3f,0x80,0x15,0x3e,0x7f,0x15,0x3e,0x7f,0x16, 0x3e,0x7e,0x15,0x82,0x3e,0x7e,0x16,0x01,0x3f,0x7e,0x16,0x82,0x3e,0x7e,0x16, 0x02,0x3d,0x7d,0x16,0x3e,0x7e,0x18,0x82,0x3e,0x7e,0x17,0x01,0x3e,0x7e,0x18, 0x82,0x3e,0x7e,0x19,0x02,0x3e,0x7e,0x18,0x3e,0x7e,0x19,0x82,0x3f,0x7d,0x18, 0x01,0x3f,0x7d,0x19,0x82,0x3e,0x7d,0x19,0x0d,0x3e,0x7d,0x1b,0x3e,0x7e,0x1a, 0x3e,0x7e,0x1b,0x3e,0x7d,0x19,0x3e,0x7d,0x1b,0x40,0x7d,0x1b,0x3f,0x7d,0x1b, 0x3e,0x7c,0x1a,0x40,0x7e,0x1c,0x3f,0x7e,0x1d,0x3e,0x7d,0x1b,0x40,0x7d,0x1b, 0x40,0x7d,0x1d,0x82,0x3f,0x7c,0x1d,0x01,0x3e,0x7b,0x1c,0x82,0x3f,0x7c,0x1e, 0x06,0x40,0x7d,0x1d,0x40,0x7d,0x1e,0x3f,0x7c,0x1e,0x3e,0x7b,0x1d,0x40,0x7d, 0x1e,0x3f,0x7c,0x1e,0x82,0x3e,0x7b,0x1e,0x04,0x3f,0x7c,0x1f,0x3e,0x7b,0x1e, 0x3f,0x7b,0x1e,0x40,0x7b,0x1f,0x82,0x3f,0x7b,0x20,0x82,0x3f,0x7b,0x1f,0x02, 0x3d,0x7b,0x1f,0x3f,0x7b,0x1f,0x82,0x40,0x7b,0x20,0x05,0x3f,0x7b,0x1f,0x3f, 0x7b,0x20,0x3e,0x7b,0x1f,0x3e,0x7d,0x20,0x3e,0x7c,0x20,0x82,0x3f,0x7b,0x1f, 0x06,0x3e,0x7b,0x1f,0x3e,0x7a,0x1e,0x3e,0x7b,0x1f,0x3e,0x7b,0x20,0x3e,0x7a, 0x20,0x3e,0x7a,0x1e,0x82,0x3e,0x7b,0x20,0x01,0x3e,0x7a,0x1e,0x82,0x3e,0x7b, 0x1f,0x83,0x3e,0x7b,0x20,0x01,0x3f,0x7b,0x1f,0x82,0x3e,0x7a,0x20,0x83,0x3e, 0x7a,0x1e,0x05,0x3e,0x7a,0x20,0x3e,0x7b,0x1f,0x3e,0x7a,0x20,0x3e,0x7b,0x20, 0x3f,0x7a,0x20,0x83,0x3e,0x79,0x1f,0x01,0x3d,0x79,0x1e,0x82,0x3e,0x7b,0x20, 0x02,0x3d,0x7a,0x1f,0x3e,0x79,0x1f,0x83,0x3d,0x78,0x1e,0x05,0x3d,0x78,0x1f, 0x3d,0x78,0x20,0x3d,0x78,0x1e,0x3c,0x77,0x1d,0x3c,0x77,0x1e,0x82,0x3b,0x76, 0x1d,0x82,0x3c,0x77,0x1e,0x07,0x3b,0x77,0x1e,0x3c,0x75,0x1d,0x3a,0x75,0x1d, 0x3b,0x76,0x1d,0x3b,0x77,0x1e,0x3a,0x75,0x1d,0x3b,0x76,0x1d,0x83,0x3a,0x75, 0x1c,0x06,0x3b,0x76,0x1d,0x38,0x74,0x1c,0x38,0x72,0x1b,0x38,0x74,0x1c,0x38, 0x73,0x1d,0x36,0x72,0x1a,0x82,0x38,0x74,0x1c,0x06,0x36,0x72,0x1a,0x37,0x72, 0x1b,0x37,0x70,0x1b,0x38,0x72,0x1c,0x37,0x72,0x1c,0x36,0x71,0x1b,0x82,0x36, 0x70,0x1b,0x01,0x35,0x70,0x1b,0x82,0x36,0x70,0x1b,0x02,0x35,0x70,0x1a,0x35, 0x6f,0x19,0x83,0x35,0x6f,0x1a,0x02,0x34,0x6f,0x19,0x35,0x6e,0x19,0x82,0x35, 0x6d,0x19,0x82,0x36,0x6f,0x1a,0x14,0x33,0x6c,0x18,0x32,0x6c,0x17,0x33,0x6d, 0x18,0x33,0x6c,0x17,0x33,0x6c,0x18,0x32,0x6d,0x18,0x34,0x6f,0x19,0x33,0x6e, 0x19,0x32,0x6a,0x17,0x30,0x69,0x15,0x2c,0x64,0x12,0x27,0x60,0x10,0x24,0x5d, 0x0e,0x20,0x57,0x0a,0x1f,0x57,0x0a,0x1f,0x56,0x09,0x1e,0x55,0x08,0x1e,0x55, 0x0a,0x20,0x56,0x0b,0x1f,0x56,0x09,0x82,0x1e,0x55,0x09,0x82,0x1e,0x55,0x0a, 0x08,0x1e,0x54,0x0a,0x1d,0x54,0x09,0x1d,0x55,0x09,0x1e,0x55,0x0a,0x1d,0x55, 0x09,0x1c,0x53,0x08,0x1e,0x54,0x09,0x1d,0x55,0x09,0x82,0x1c,0x53,0x08,0x82, 0x1d,0x53,0x08,0x82,0x1c,0x52,0x07,0x82,0x1b,0x52,0x07,0x03,0x1b,0x50,0x08, 0x19,0x50,0x06,0x1b,0x51,0x07,0x82,0x1a,0x50,0x06,0x01,0x19,0x50,0x06,0x82, 0x1a,0x4f,0x06,0x01,0x19,0x4f,0x05,0x83,0x19,0x50,0x06,0x07,0x19,0x4f,0x07, 0x19,0x4f,0x06,0x19,0x4f,0x07,0x19,0x4f,0x06,0x19,0x4e,0x06,0x18,0x4d,0x05, 0x18,0x4e,0x06,0x82,0x18,0x4d,0x05,0x83,0x18,0x4e,0x06,0x02,0x19,0x4e,0x04, 0x18,0x4f,0x06,0x83,0x18,0x4f,0x04,0x01,0x19,0x50,0x06,0x82,0x19,0x4f,0x05, 0x02,0x18,0x50,0x05,0x18,0x4e,0x04,0x82,0x19,0x50,0x06,0x02,0x19,0x50,0x05, 0x18,0x50,0x04,0x82,0x19,0x50,0x05,0x01,0x18,0x50,0x04,0x82,0x19,0x50,0x05, 0x02,0x18,0x50,0x04,0x19,0x4f,0x05,0x82,0x19,0x50,0x06,0x0c,0x18,0x50,0x05, 0x18,0x4f,0x04,0x19,0x4f,0x04,0x18,0x50,0x04,0x18,0x50,0x05,0x19,0x50,0x06, 0x18,0x50,0x05,0x17,0x50,0x05,0x18,0x50,0x05,0x19,0x4f,0x05,0x19,0x4f,0x04, 0x19,0x50,0x05,0x82,0x18,0x50,0x05,0x01,0x19,0x50,0x06,0x82,0x18,0x4e,0x04, 0x04,0x19,0x4e,0x04,0x19,0x4f,0x05,0x18,0x4d,0x04,0x18,0x4c,0x04,0x83,0x17, 0x4c,0x04,0x03,0x18,0x4c,0x06,0x16,0x4b,0x04,0x16,0x4c,0x03,0x82,0x17,0x4a, 0x04,0x03,0x16,0x4a,0x04,0x15,0x49,0x04,0x15,0x48,0x03,0x83,0x16,0x49,0x04, 0x01,0x15,0x48,0x03,0x83,0x15,0x47,0x04,0x0c,0x15,0x46,0x04,0x15,0x47,0x04, 0x14,0x46,0x03,0x15,0x47,0x03,0x16,0x46,0x05,0x15,0x47,0x05,0x15,0x46,0x04, 0x14,0x44,0x03,0x15,0x44,0x03,0x14,0x44,0x04,0x14,0x45,0x04,0x14,0x44,0x04, 0x85,0x13,0x43,0x03,0x82,0x13,0x43,0x04,0x01,0x14,0x43,0x04,0x83,0x13,0x42, 0x04,0x04,0x14,0x41,0x04,0x13,0x41,0x03,0x12,0x40,0x04,0x13,0x41,0x04,0x82, 0x13,0x40,0x03,0x02,0x13,0x40,0x04,0x12,0x40,0x03,0x82,0x12,0x3f,0x03,0x03, 0x11,0x40,0x03,0x10,0x3e,0x03,0x13,0x3e,0x03,0x82,0x12,0x3e,0x03,0x05,0x10, 0x3d,0x03,0x12,0x3e,0x03,0x11,0x3e,0x03,0x10,0x3d,0x03,0x11,0x3b,0x02,0x82, 0x10,0x3c,0x03,0x83,0x10,0x3b,0x03,0x82,0x10,0x3a,0x03,0x14,0x12,0x3b,0x03, 0x11,0x3a,0x03,0x11,0x3a,0x04,0x10,0x3a,0x03,0x0f,0x3a,0x03,0x0e,0x38,0x02, 0x0f,0x39,0x03,0x10,0x3a,0x03,0x0f,0x39,0x03,0x0f,0x39,0x04,0x0e,0x38,0x02, 0x0f,0x38,0x03,0x0f,0x37,0x03,0x0f,0x36,0x01,0x0f,0x38,0x03,0x10,0x38,0x03, 0x10,0x37,0x02,0x0d,0x37,0x01,0x0f,0x36,0x01,0x0e,0x36,0x02,0x82,0x0f,0x36, 0x03,0x04,0x0d,0x35,0x01,0x0e,0x34,0x01,0x0d,0x35,0x03,0x0d,0x35,0x01,0x82, 0x0e,0x35,0x03,0x09,0x0f,0x33,0x02,0x0d,0x34,0x03,0x0e,0x33,0x02,0x0d,0x33, 0x02,0x0d,0x33,0x03,0x0e,0x33,0x02,0x0e,0x33,0x01,0x0d,0x32,0x01,0x0d,0x32, 0x02,0x82,0x0e,0x32,0x03,0x04,0x0d,0x31,0x01,0x0c,0x31,0x02,0x0d,0x32,0x02, 0x0c,0x31,0x02,0x82,0x0d,0x31,0x02,0x01,0x0d,0x30,0x02,0x82,0x0d,0x30,0x01, 0x02,0x0c,0x30,0x01,0x0c,0x30,0x02,0x83,0x0c,0x2f,0x01,0x09,0x0c,0x2e,0x02, 0x0d,0x2e,0x01,0x0c,0x2e,0x01,0x0c,0x2f,0x01,0x0c,0x2e,0x01,0x0d,0x2d,0x02, 0x0c,0x2d,0x01,0x0a,0x2d,0x01,0x0b,0x2d,0x02,0x82,0x0c,0x2c,0x01,0x02,0x0b, 0x2c,0x01,0x0c,0x2c,0x01,0x82,0x0b,0x2b,0x01,0x01,0x0a,0x2c,0x01,0x82,0x0b, 0x2b,0x01,0x03,0x0a,0x2c,0x01,0x0a,0x2b,0x01,0x0b,0x2a,0x01,0x83,0x0a,0x2a, 0x01,0x01,0x0b,0x2a,0x01,0x82,0x0a,0x2a,0x01,0x02,0x0a,0x29,0x01,0x0b,0x2a, 0x01,0x83,0x0a,0x29,0x01,0x82,0x0a,0x28,0x01,0x04,0x0a,0x27,0x01,0x0a,0x27, 0x02,0x0a,0x28,0x01,0x0a,0x27,0x01,0x82,0x09,0x27,0x01,0x02,0x0a,0x27,0x01, 0x09,0x26,0x00,0x82,0x0a,0x26,0x01,0x04,0x09,0x26,0x01,0x0a,0x26,0x01,0x09, 0x26,0x01,0x09,0x25,0x00,0x83,0x09,0x25,0x01,0x86,0x09,0x24,0x01,0x01,0x09, 0x23,0x01,0x82,0x08,0x23,0x01,0x83,0x09,0x23,0x01,0x82,0x09,0x22,0x01,0x03, 0x09,0x21,0x01,0x09,0x22,0x01,0x08,0x21,0x01,0x82,0x07,0x21,0x01,0x83,0x08, 0x21,0x01,0x02,0x07,0x21,0x01,0x07,0x20,0x01,0x82,0x07,0x20,0x00,0x04,0x07, 0x20,0x01,0x08,0x20,0x01,0x07,0x20,0x01,0x07,0x1f,0x00,0x82,0x07,0x1f,0x01, 0x01,0x07,0x1e,0x00,0x83,0x07,0x1e,0x01,0x02,0x07,0x1e,0x00,0x07,0x1e,0x01, 0x82,0x07,0x1e,0x00,0x84,0x07,0x1d,0x00,0x01,0x06,0x1c,0x00,0x82,0x06,0x1c, 0x01,0x04,0x06,0x1b,0x01,0x06,0x1b,0x00,0x06,0x1c,0x00,0x06,0x1c,0x01,0x84, 0x06,0x1b,0x00,0x84,0x06,0x1a,0x00,0x02,0x06,0x1a,0x01,0x06,0x1a,0x00,0x84, 0x06,0x19,0x00,0x02,0x05,0x19,0x00,0x06,0x19,0x00,0x82,0x05,0x18,0x00,0x01, 0x06,0x18,0x01,0x82,0x05,0x18,0x00,0x01,0x06,0x18,0x00,0x82,0x05,0x18,0x00, 0x83,0x05,0x17,0x00,0x03,0x05,0x16,0x00,0x04,0x17,0x00,0x04,0x16,0x00,0x83, 0x05,0x16,0x00,0x01,0x04,0x16,0x00,0x82,0x05,0x16,0x00,0x88,0x04,0x15,0x00, 0x85,0x04,0x14,0x00,0x8b,0x04,0x13,0x00,0x02,0x04,0x12,0x00,0x04,0x13,0x00, 0x87,0x04,0x12,0x00,0x03,0x04,0x11,0x00,0x03,0x12,0x00,0x04,0x12,0x00,0x84, 0x04,0x11,0x00,0x02,0x04,0x10,0x00,0x04,0x11,0x00,0x86,0x04,0x10,0x00,0x04, 0x04,0x11,0x00,0x05,0x12,0x00,0x05,0x13,0x01,0x06,0x13,0x01,0x83,0x07,0x13, 0x03,0x04,0x08,0x13,0x04,0x07,0x13,0x03,0x08,0x13,0x04,0x07,0x12,0x03,0x82, 0x08,0x13,0x04,0x84,0x07,0x12,0x03,0x82,0x07,0x11,0x03,0x86,0x07,0x10,0x03, 0x01,0x07,0x0f,0x03,0x85,0x06,0x0f,0x03,0x01,0x06,0x0e,0x03,0x82,0x06,0x0d, 0x03,0x01,0x04,0x0c,0x03,0x82,0x04,0x0c,0x02,0x83,0x04,0x0b,0x02,0x82,0x04, 0x0a,0x02,0x03,0x04,0x0a,0x01,0x04,0x0a,0x02,0x04,0x0a,0x01,0x82,0x04,0x09, 0x01,0x83,0x03,0x09,0x01,0x82,0x03,0x08,0x01,0x85,0x03,0x07,0x01,0x01,0x03, 0x06,0x01,0x83,0x02,0x06,0x01,0x01,0x02,0x05,0x01,0x82,0x01,0x05,0x01,0x85, 0x01,0x04,0x00,0x85,0x01,0x03,0x00,0x82,0x00,0x02,0x00,0x85,0x00,0x01,0x00, 0xdd,0x00,0x00,0x00,0x06,0x41,0x82,0x17,0x41,0x83,0x17,0x40,0x83,0x17,0x40, 0x83,0x15,0x41,0x83,0x16,0x41,0x82,0x15,0x82,0x40,0x82,0x16,0x01,0x41,0x83, 0x16,0x82,0x40,0x81,0x15,0x02,0x41,0x83,0x16,0x40,0x84,0x16,0x82,0x40,0x82, 0x16,0x06,0x3f,0x82,0x15,0x41,0x82,0x17,0x40,0x82,0x16,0x41,0x82,0x17,0x40, 0x82,0x16,0x40,0x81,0x15,0x82,0x40,0x82,0x15,0x02,0x41,0x82,0x15,0x40,0x81, 0x15,0x82,0x3f,0x82,0x15,0x05,0x3e,0x80,0x16,0x40,0x81,0x15,0x40,0x82,0x16, 0x40,0x83,0x17,0x3f,0x82,0x15,0x82,0x3f,0x80,0x15,0x05,0x40,0x82,0x17,0x40, 0x80,0x15,0x40,0x81,0x15,0x40,0x81,0x17,0x3e,0x81,0x15,0x82,0x40,0x81,0x15, 0x03,0x3f,0x80,0x15,0x40,0x80,0x15,0x40,0x80,0x16,0x82,0x3e,0x80,0x15,0x04, 0x3e,0x80,0x14,0x3e,0x82,0x15,0x3f,0x80,0x16,0x3e,0x80,0x15,0x82,0x3f,0x80, 0x17,0x03,0x3e,0x7f,0x17,0x3e,0x80,0x15,0x3e,0x7f,0x16,0x84,0x3e,0x7f,0x17, 0x84,0x3e,0x7f,0x19,0x02,0x3e,0x80,0x19,0x40,0x7f,0x17,0x82,0x40,0x7f,0x19, 0x05,0x3e,0x7e,0x19,0x3e,0x7f,0x1a,0x3e,0x7e,0x19,0x3d,0x7d,0x1a,0x3e,0x7f, 0x1b,0x82,0x3e,0x7f,0x1a,0x01,0x40,0x7f,0x1c,0x82,0x40,0x7e,0x1b,0x01,0x40, 0x7f,0x1c,0x82,0x3e,0x7f,0x1c,0x01,0x40,0x7e,0x1c,0x82,0x3f,0x7d,0x1c,0x82, 0x40,0x7e,0x1c,0x01,0x40,0x7d,0x1d,0x82,0x40,0x7d,0x1e,0x01,0x40,0x7e,0x1d, 0x82,0x40,0x7d,0x1e,0x02,0x40,0x7e,0x1f,0x40,0x7d,0x1e,0x84,0x3f,0x7d,0x1f, 0x02,0x40,0x7c,0x1f,0x40,0x7d,0x1f,0x82,0x40,0x7d,0x20,0x82,0x40,0x7c,0x1f, 0x02,0x3d,0x7c,0x1f,0x3f,0x7c,0x1f,0x82,0x40,0x7d,0x20,0x01,0x3e,0x7c,0x1f, 0x82,0x3f,0x7c,0x1f,0x04,0x40,0x7c,0x1f,0x3f,0x7b,0x20,0x40,0x7c,0x1f,0x3f, 0x7c,0x1f,0x82,0x3e,0x7b,0x1e,0x04,0x3e,0x7c,0x1f,0x3f,0x7c,0x20,0x3f,0x7b, 0x20,0x3e,0x7b,0x1e,0x83,0x3e,0x7c,0x1f,0x01,0x3f,0x7c,0x1f,0x82,0x3e,0x7c, 0x1f,0x82,0x3e,0x7b,0x1f,0x01,0x40,0x7c,0x1f,0x82,0x3e,0x7a,0x1f,0x82,0x3e, 0x7c,0x1f,0x03,0x3e,0x7b,0x1f,0x3e,0x7a,0x1f,0x3e,0x7c,0x1f,0x82,0x3e,0x7c, 0x20,0x05,0x3f,0x7b,0x20,0x3e,0x7a,0x1f,0x3f,0x7a,0x1f,0x3e,0x7a,0x1f,0x3d, 0x7a,0x1f,0x82,0x3e,0x7b,0x1f,0x01,0x3d,0x7a,0x1f,0x82,0x3e,0x7a,0x1f,0x05, 0x3d,0x79,0x1e,0x3d,0x78,0x1d,0x3d,0x78,0x1f,0x3d,0x79,0x1f,0x3e,0x7a,0x1f, 0x82,0x3d,0x79,0x1e,0x82,0x3d,0x78,0x1f,0x07,0x3e,0x7a,0x20,0x3d,0x79,0x1e, 0x3d,0x78,0x1d,0x3b,0x77,0x1d,0x3c,0x78,0x1e,0x3d,0x78,0x1f,0x3a,0x75,0x1c, 0x83,0x3b,0x77,0x1d,0x04,0x39,0x75,0x1b,0x3a,0x75,0x1c,0x3b,0x77,0x1d,0x3a, 0x76,0x1d,0x82,0x39,0x75,0x1c,0x01,0x3a,0x75,0x1e,0x82,0x38,0x74,0x1c,0x03, 0x39,0x75,0x1c,0x38,0x74,0x1c,0x3a,0x74,0x1c,0x82,0x38,0x72,0x1c,0x01,0x39, 0x73,0x1c,0x82,0x37,0x72,0x1c,0x01,0x36,0x72,0x1c,0x82,0x36,0x72,0x1b,0x83, 0x37,0x72,0x1c,0x82,0x36,0x71,0x1a,0x03,0x35,0x70,0x1a,0x35,0x71,0x1a,0x36, 0x70,0x1a,0x85,0x35,0x6f,0x19,0x03,0x33,0x6f,0x19,0x32,0x6d,0x17,0x35,0x6f, 0x19,0x82,0x33,0x6e,0x18,0x02,0x32,0x6d,0x17,0x33,0x6e,0x19,0x82,0x33,0x6d, 0x19,0x01,0x33,0x6c,0x18,0x82,0x34,0x6d,0x19,0x04,0x30,0x69,0x16,0x2b,0x64, 0x13,0x27,0x5e,0x0f,0x22,0x5a,0x0c,0x84,0x1e,0x55,0x09,0x82,0x1f,0x56,0x0a, 0x82,0x1d,0x54,0x09,0x02,0x1d,0x55,0x09,0x1e,0x56,0x0a,0x82,0x1d,0x56,0x09, 0x04,0x1d,0x55,0x07,0x1e,0x56,0x0a,0x1d,0x56,0x09,0x1c,0x54,0x08,0x83,0x1d, 0x54,0x08,0x04,0x1c,0x53,0x07,0x1c,0x54,0x07,0x1b,0x53,0x07,0x1c,0x53,0x07, 0x83,0x1b,0x52,0x07,0x83,0x1a,0x51,0x06,0x82,0x1b,0x52,0x07,0x84,0x1a,0x51, 0x06,0x01,0x19,0x50,0x05,0x82,0x19,0x50,0x06,0x01,0x19,0x4f,0x06,0x82,0x18, 0x4e,0x05,0x01,0x19,0x4f,0x06,0x82,0x18,0x4e,0x05,0x08,0x17,0x4e,0x04,0x18, 0x4e,0x05,0x19,0x50,0x04,0x18,0x4f,0x04,0x18,0x50,0x04,0x19,0x50,0x04,0x18, 0x4f,0x04,0x17,0x4e,0x03,0x82,0x19,0x50,0x04,0x03,0x19,0x50,0x05,0x19,0x51, 0x05,0x19,0x50,0x04,0x83,0x19,0x50,0x05,0x82,0x19,0x51,0x04,0x03,0x1a,0x52, 0x06,0x19,0x51,0x05,0x18,0x50,0x04,0x82,0x19,0x51,0x04,0x82,0x19,0x50,0x05, 0x17,0x18,0x50,0x04,0x19,0x51,0x04,0x19,0x51,0x05,0x1a,0x50,0x05,0x19,0x51, 0x04,0x17,0x51,0x04,0x19,0x51,0x05,0x18,0x50,0x04,0x19,0x51,0x05,0x19,0x51, 0x06,0x19,0x50,0x04,0x18,0x52,0x05,0x18,0x50,0x04,0x19,0x50,0x04,0x1a,0x50, 0x05,0x19,0x4f,0x04,0x17,0x4e,0x03,0x17,0x50,0x04,0x18,0x50,0x04,0x18,0x4e, 0x04,0x18,0x4e,0x05,0x17,0x4d,0x04,0x18,0x4d,0x05,0x82,0x17,0x4c,0x04,0x0c, 0x17,0x4c,0x05,0x17,0x4b,0x04,0x17,0x4c,0x05,0x18,0x4c,0x05,0x17,0x4b,0x04, 0x17,0x4b,0x06,0x16,0x4a,0x05,0x16,0x4a,0x04,0x17,0x4b,0x04,0x16,0x49,0x04, 0x17,0x4a,0x04,0x16,0x49,0x04,0x82,0x15,0x48,0x04,0x01,0x15,0x47,0x04,0x83, 0x15,0x48,0x04,0x0c,0x15,0x48,0x03,0x16,0x48,0x04,0x16,0x47,0x05,0x15,0x47, 0x04,0x14,0x45,0x03,0x15,0x45,0x03,0x14,0x45,0x04,0x14,0x46,0x06,0x14,0x45, 0x04,0x14,0x44,0x03,0x14,0x45,0x04,0x14,0x44,0x04,0x82,0x14,0x43,0x03,0x82, 0x14,0x44,0x04,0x02,0x13,0x44,0x04,0x13,0x43,0x03,0x82,0x14,0x43,0x04,0x08, 0x13,0x42,0x04,0x13,0x41,0x03,0x12,0x41,0x04,0x12,0x41,0x03,0x12,0x40,0x02, 0x13,0x40,0x03,0x12,0x40,0x03,0x12,0x41,0x04,0x83,0x12,0x40,0x04,0x83,0x12, 0x3f,0x03,0x06,0x11,0x3e,0x03,0x12,0x3d,0x03,0x13,0x3e,0x04,0x12,0x3e,0x03, 0x11,0x3e,0x03,0x11,0x3d,0x03,0x82,0x10,0x3d,0x03,0x03,0x11,0x3d,0x04,0x12, 0x3d,0x05,0x11,0x3d,0x04,0x84,0x11,0x3b,0x02,0x06,0x11,0x3a,0x03,0x10,0x3b, 0x03,0x11,0x3b,0x04,0x11,0x3a,0x03,0x10,0x39,0x03,0x10,0x3a,0x03,0x82,0x0f, 0x3a,0x03,0x03,0x0f,0x39,0x04,0x11,0x39,0x03,0x0f,0x39,0x03,0x82,0x0f,0x38, 0x03,0x07,0x0f,0x37,0x01,0x0f,0x38,0x03,0x0f,0x38,0x02,0x0f,0x38,0x03,0x0e, 0x37,0x02,0x0f,0x36,0x03,0x0f,0x36,0x02,0x82,0x0e,0x36,0x03,0x0a,0x0e,0x35, 0x01,0x0e,0x36,0x02,0x0e,0x35,0x01,0x0e,0x35,0x02,0x0e,0x33,0x01,0x0d,0x34, 0x02,0x0e,0x34,0x02,0x0d,0x33,0x02,0x0d,0x34,0x01,0x0e,0x34,0x02,0x83,0x0e, 0x33,0x01,0x82,0x0e,0x33,0x02,0x82,0x0d,0x32,0x01,0x82,0x0e,0x32,0x02,0x10, 0x0d,0x31,0x01,0x0c,0x31,0x01,0x0d,0x31,0x01,0x0d,0x30,0x01,0x0c,0x30,0x01, 0x0d,0x30,0x01,0x0c,0x30,0x02,0x0d,0x30,0x02,0x0c,0x2f,0x01,0x0c,0x30,0x01, 0x0c,0x2f,0x01,0x0b,0x2f,0x01,0x0d,0x2f,0x02,0x0c,0x2e,0x01,0x0b,0x2f,0x02, 0x0c,0x2e,0x02,0x82,0x0c,0x2d,0x01,0x01,0x0b,0x2e,0x02,0x82,0x0c,0x2d,0x01, 0x02,0x0a,0x2d,0x01,0x0c,0x2d,0x01,0x83,0x0b,0x2c,0x01,0x01,0x0c,0x2c,0x02, 0x83,0x0b,0x2b,0x01,0x01,0x0a,0x2b,0x01,0x82,0x0a,0x2a,0x01,0x82,0x0a,0x2b, 0x01,0x82,0x0b,0x2a,0x01,0x01,0x0a,0x2a,0x01,0x84,0x0a,0x29,0x01,0x02,0x09, 0x29,0x01,0x0a,0x29,0x01,0x85,0x0a,0x28,0x01,0x06,0x0a,0x27,0x01,0x09,0x27, 0x01,0x0a,0x27,0x01,0x0a,0x27,0x02,0x09,0x27,0x01,0x0a,0x27,0x01,0x83,0x09, 0x26,0x01,0x84,0x09,0x25,0x01,0x01,0x0a,0x25,0x01,0x82,0x09,0x25,0x01,0x84, 0x09,0x24,0x01,0x01,0x08,0x23,0x00,0x82,0x09,0x24,0x01,0x01,0x09,0x23,0x01, 0x84,0x08,0x22,0x01,0x04,0x09,0x22,0x01,0x08,0x22,0x01,0x07,0x21,0x01,0x08, 0x22,0x01,0x82,0x08,0x21,0x01,0x03,0x07,0x21,0x01,0x07,0x20,0x01,0x08,0x20, 0x01,0x84,0x07,0x20,0x01,0x82,0x07,0x1f,0x00,0x03,0x07,0x1f,0x01,0x07,0x1f, 0x00,0x07,0x1f,0x01,0x82,0x07,0x1e,0x01,0x02,0x07,0x1d,0x00,0x07,0x1e,0x00, 0x82,0x07,0x1e,0x01,0x02,0x07,0x1d,0x00,0x07,0x1d,0x01,0x82,0x07,0x1d,0x00, 0x01,0x06,0x1c,0x00,0x82,0x07,0x1c,0x01,0x01,0x06,0x1c,0x01,0x86,0x06,0x1c, 0x00,0x82,0x06,0x1b,0x00,0x87,0x06,0x1a,0x00,0x84,0x06,0x19,0x00,0x83,0x05, 0x19,0x00,0x86,0x05,0x18,0x00,0x83,0x05,0x17,0x00,0x82,0x04,0x17,0x00,0x82, 0x05,0x17,0x00,0x01,0x04,0x17,0x00,0x82,0x04,0x16,0x00,0x89,0x04,0x15,0x00, 0x88,0x04,0x14,0x00,0x82,0x04,0x13,0x00,0x01,0x03,0x13,0x00,0x83,0x04,0x12, 0x00,0x01,0x04,0x13,0x00,0x88,0x04,0x12,0x00,0x01,0x03,0x12,0x00,0x83,0x04, 0x12,0x00,0x8b,0x04,0x11,0x00,0x82,0x04,0x10,0x00,0x09,0x04,0x0f,0x00,0x03, 0x0f,0x00,0x04,0x11,0x00,0x04,0x12,0x00,0x05,0x12,0x00,0x06,0x14,0x01,0x06, 0x13,0x01,0x07,0x14,0x03,0x08,0x14,0x04,0x83,0x08,0x13,0x04,0x04,0x07,0x12, 0x03,0x07,0x12,0x04,0x07,0x12,0x03,0x07,0x12,0x04,0x86,0x07,0x11,0x03,0x83, 0x07,0x10,0x03,0x02,0x06,0x0f,0x03,0x07,0x10,0x03,0x84,0x06,0x0f,0x03,0x83, 0x06,0x0e,0x03,0x82,0x06,0x0d,0x03,0x01,0x05,0x0c,0x02,0x82,0x04,0x0c,0x02, 0x02,0x04,0x0b,0x02,0x04,0x0a,0x01,0x83,0x04,0x0a,0x02,0x02,0x04,0x0a,0x01, 0x04,0x09,0x01,0x84,0x03,0x09,0x01,0x82,0x03,0x08,0x01,0x85,0x03,0x07,0x01, 0x85,0x02,0x06,0x01,0x82,0x01,0x05,0x01,0x01,0x01,0x04,0x01,0x84,0x01,0x04, 0x00,0x85,0x01,0x03,0x00,0x82,0x00,0x02,0x00,0x85,0x00,0x01,0x00,0xdd,0x00, 0x00,0x00,0x06,0x42,0x84,0x16,0x41,0x84,0x16,0x40,0x84,0x16,0x40,0x84,0x15, 0x41,0x84,0x16,0x41,0x83,0x15,0x82,0x42,0x84,0x17,0x07,0x41,0x84,0x16,0x42, 0x84,0x17,0x40,0x82,0x16,0x40,0x83,0x16,0x41,0x83,0x15,0x40,0x82,0x16,0x40, 0x84,0x16,0x82,0x40,0x83,0x16,0x02,0x40,0x84,0x16,0x40,0x83,0x16,0x82,0x40, 0x82,0x16,0x01,0x41,0x83,0x16,0x82,0x41,0x83,0x15,0x07,0x42,0x82,0x15,0x40, 0x83,0x16,0x3f,0x83,0x16,0x40,0x82,0x15,0x41,0x81,0x15,0x3f,0x81,0x15,0x40, 0x83,0x16,0x82,0x40,0x82,0x16,0x07,0x3f,0x81,0x15,0x40,0x82,0x16,0x40,0x81, 0x15,0x40,0x83,0x16,0x3f,0x82,0x16,0x3f,0x82,0x15,0x40,0x82,0x16,0x83,0x3f, 0x81,0x16,0x01,0x40,0x81,0x16,0x83,0x3f,0x81,0x16,0x02,0x3f,0x82,0x16,0x3f, 0x82,0x18,0x82,0x3f,0x81,0x16,0x02,0x3f,0x81,0x15,0x3f,0x80,0x16,0x82,0x3f, 0x80,0x17,0x04,0x3f,0x81,0x17,0x3e,0x7f,0x16,0x3f,0x80,0x17,0x3f,0x81,0x18, 0x82,0x3f,0x80,0x17,0x83,0x3f,0x80,0x18,0x04,0x40,0x7f,0x17,0x40,0x7f,0x19, 0x40,0x81,0x19,0x3f,0x7f,0x19,0x82,0x3f,0x80,0x1a,0x02,0x3e,0x7f,0x1a,0x40, 0x7f,0x19,0x82,0x3f,0x80,0x1b,0x82,0x40,0x7f,0x1b,0x08,0x40,0x7f,0x1c,0x40, 0x7f,0x1b,0x3f,0x7f,0x1b,0x40,0x81,0x1d,0x40,0x7f,0x1d,0x40,0x7f,0x1c,0x40, 0x7f,0x1b,0x40,0x7f,0x1d,0x82,0x40,0x7e,0x1d,0x02,0x3f,0x7e,0x1d,0x3f,0x7d, 0x1e,0x85,0x40,0x7e,0x1e,0x82,0x40,0x7e,0x1f,0x01,0x3f,0x7f,0x1f,0x83,0x40, 0x7e,0x1f,0x82,0x3f,0x7d,0x1f,0x82,0x40,0x7d,0x1f,0x02,0x3f,0x7d,0x1f,0x40, 0x7e,0x20,0x82,0x3f,0x7d,0x1f,0x02,0x3f,0x7d,0x20,0x40,0x7d,0x21,0x83,0x40, 0x7c,0x20,0x01,0x40,0x7e,0x20,0x84,0x3f,0x7d,0x1f,0x82,0x40,0x7c,0x20,0x82, 0x40,0x7e,0x20,0x01,0x40,0x7d,0x1f,0x83,0x40,0x7e,0x20,0x83,0x3f,0x7c,0x20, 0x01,0x40,0x7d,0x1f,0x83,0x3f,0x7c,0x20,0x04,0x3e,0x7c,0x1f,0x3f,0x7c,0x21, 0x40,0x7c,0x20,0x3f,0x7c,0x1e,0x82,0x3f,0x7c,0x20,0x84,0x3f,0x7b,0x1f,0x01, 0x3e,0x7c,0x1f,0x82,0x3d,0x7b,0x1e,0x82,0x3f,0x7b,0x1f,0x05,0x3e,0x7a,0x1e, 0x3f,0x7b,0x1f,0x3e,0x7a,0x1e,0x3d,0x7a,0x1e,0x3e,0x7a,0x20,0x84,0x3e,0x7a, 0x1e,0x0b,0x3d,0x79,0x1d,0x3d,0x7a,0x1e,0x3e,0x7a,0x1e,0x3b,0x78,0x1c,0x3d, 0x79,0x1e,0x3b,0x79,0x1e,0x3c,0x7a,0x1e,0x3b,0x78,0x1d,0x3c,0x79,0x1e,0x3b, 0x77,0x1d,0x3b,0x78,0x1d,0x83,0x3b,0x77,0x1d,0x02,0x3a,0x77,0x1c,0x3a,0x77, 0x1d,0x82,0x3b,0x77,0x1e,0x01,0x3a,0x76,0x1d,0x84,0x39,0x75,0x1c,0x82,0x38, 0x74,0x1c,0x82,0x39,0x75,0x1d,0x02,0x38,0x74,0x1d,0x37,0x73,0x1b,0x82,0x38, 0x74,0x1c,0x06,0x38,0x74,0x1b,0x38,0x74,0x1d,0x38,0x74,0x1c,0x37,0x73,0x1b, 0x38,0x74,0x1c,0x36,0x72,0x1a,0x83,0x36,0x72,0x1b,0x22,0x37,0x71,0x1b,0x36, 0x71,0x19,0x36,0x71,0x1a,0x36,0x70,0x19,0x34,0x70,0x19,0x35,0x6f,0x19,0x34, 0x6e,0x18,0x35,0x71,0x1a,0x33,0x6f,0x18,0x33,0x6f,0x19,0x33,0x6d,0x18,0x35, 0x6f,0x19,0x34,0x6e,0x18,0x33,0x6d,0x18,0x32,0x6c,0x17,0x32,0x6c,0x16,0x33, 0x6d,0x18,0x34,0x6e,0x19,0x33,0x6d,0x18,0x32,0x6c,0x16,0x2f,0x69,0x15,0x28, 0x62,0x10,0x21,0x5a,0x0c,0x1e,0x55,0x09,0x1d,0x55,0x09,0x1e,0x55,0x09,0x1e, 0x56,0x09,0x1f,0x57,0x09,0x1f,0x57,0x0b,0x1e,0x55,0x09,0x1f,0x57,0x0a,0x20, 0x58,0x09,0x1e,0x56,0x08,0x1e,0x56,0x09,0x82,0x1e,0x55,0x09,0x01,0x1e,0x56, 0x09,0x82,0x1d,0x55,0x08,0x02,0x1e,0x55,0x09,0x1d,0x55,0x08,0x82,0x1c,0x55, 0x08,0x0a,0x1b,0x54,0x06,0x1d,0x53,0x08,0x1c,0x54,0x08,0x1b,0x53,0x07,0x1b, 0x52,0x06,0x1b,0x53,0x07,0x1c,0x54,0x08,0x1b,0x53,0x07,0x1b,0x52,0x06,0x1a, 0x52,0x06,0x82,0x1b,0x52,0x06,0x03,0x1a,0x52,0x06,0x19,0x51,0x05,0x1a,0x51, 0x07,0x82,0x19,0x50,0x06,0x01,0x18,0x4f,0x04,0x83,0x19,0x50,0x06,0x05,0x18, 0x4f,0x03,0x19,0x50,0x04,0x19,0x51,0x05,0x19,0x50,0x04,0x19,0x52,0x05,0x83, 0x18,0x50,0x04,0x08,0x19,0x50,0x04,0x18,0x50,0x04,0x19,0x50,0x04,0x18,0x51, 0x04,0x19,0x51,0x05,0x19,0x50,0x04,0x18,0x50,0x04,0x19,0x50,0x04,0x82,0x18, 0x51,0x04,0x82,0x19,0x52,0x05,0x01,0x19,0x52,0x06,0x82,0x19,0x52,0x04,0x02, 0x18,0x51,0x04,0x19,0x52,0x05,0x83,0x19,0x52,0x04,0x06,0x19,0x51,0x04,0x19, 0x52,0x05,0x19,0x52,0x06,0x19,0x52,0x05,0x18,0x50,0x04,0x19,0x50,0x04,0x82, 0x19,0x51,0x05,0x03,0x18,0x50,0x03,0x19,0x52,0x05,0x19,0x51,0x05,0x82,0x19, 0x50,0x04,0x01,0x18,0x50,0x03,0x83,0x18,0x50,0x04,0x18,0x17,0x4d,0x04,0x18, 0x4e,0x04,0x18,0x4d,0x04,0x16,0x4c,0x03,0x17,0x4d,0x04,0x18,0x4d,0x04,0x18, 0x4d,0x05,0x16,0x4c,0x04,0x17,0x4b,0x04,0x16,0x4b,0x04,0x17,0x4b,0x04,0x16, 0x4a,0x03,0x16,0x4b,0x04,0x17,0x4b,0x04,0x17,0x4a,0x04,0x16,0x4a,0x03,0x16, 0x4a,0x04,0x15,0x48,0x04,0x16,0x48,0x04,0x15,0x49,0x04,0x16,0x4a,0x05,0x16, 0x48,0x04,0x16,0x48,0x03,0x15,0x48,0x04,0x82,0x16,0x47,0x04,0x07,0x15,0x48, 0x05,0x15,0x47,0x04,0x15,0x46,0x04,0x15,0x46,0x05,0x15,0x47,0x06,0x14,0x46, 0x04,0x14,0x45,0x03,0x82,0x15,0x45,0x04,0x82,0x14,0x44,0x03,0x09,0x15,0x45, 0x04,0x14,0x45,0x04,0x14,0x44,0x04,0x13,0x44,0x04,0x15,0x44,0x05,0x14,0x43, 0x04,0x13,0x43,0x04,0x13,0x42,0x03,0x15,0x42,0x04,0x82,0x13,0x42,0x03,0x07, 0x12,0x42,0x03,0x12,0x40,0x03,0x13,0x41,0x04,0x13,0x42,0x04,0x12,0x42,0x04, 0x14,0x40,0x04,0x13,0x40,0x04,0x84,0x11,0x3f,0x03,0x02,0x12,0x3f,0x03,0x12, 0x40,0x04,0x82,0x11,0x3f,0x03,0x83,0x11,0x3d,0x02,0x01,0x11,0x3e,0x03,0x83, 0x11,0x3d,0x03,0x01,0x10,0x3c,0x02,0x84,0x10,0x3b,0x03,0x09,0x0f,0x3a,0x02, 0x11,0x3a,0x03,0x11,0x3b,0x04,0x11,0x3a,0x03,0x10,0x39,0x02,0x10,0x39,0x03, 0x11,0x38,0x03,0x10,0x3a,0x03,0x10,0x38,0x03,0x82,0x0e,0x39,0x03,0x06,0x0f, 0x39,0x03,0x10,0x39,0x03,0x0f,0x36,0x02,0x10,0x36,0x02,0x0f,0x37,0x03,0x0e, 0x37,0x02,0x82,0x0f,0x36,0x02,0x82,0x10,0x37,0x03,0x02,0x0e,0x36,0x02,0x0f, 0x35,0x02,0x83,0x0d,0x35,0x02,0x08,0x0d,0x35,0x01,0x0e,0x35,0x02,0x0e,0x35, 0x03,0x0d,0x34,0x02,0x0e,0x33,0x01,0x0e,0x34,0x02,0x0e,0x33,0x02,0x0f,0x34, 0x03,0x82,0x0e,0x33,0x02,0x02,0x0d,0x33,0x02,0x0e,0x32,0x02,0x82,0x0c,0x32, 0x02,0x01,0x0d,0x32,0x01,0x84,0x0c,0x32,0x02,0x01,0x0d,0x31,0x02,0x82,0x0d, 0x30,0x01,0x03,0x0d,0x30,0x02,0x0c,0x30,0x02,0x0d,0x30,0x02,0x82,0x0c,0x2f, 0x01,0x03,0x0c,0x30,0x03,0x0c,0x2e,0x02,0x0c,0x2e,0x01,0x82,0x0b,0x2e,0x01, 0x82,0x0c,0x2e,0x01,0x01,0x0b,0x2d,0x01,0x82,0x0c,0x2d,0x01,0x01,0x0b,0x2d, 0x01,0x82,0x0b,0x2c,0x01,0x03,0x0b,0x2b,0x01,0x0c,0x2b,0x03,0x0b,0x2d,0x02, 0x82,0x0b,0x2b,0x01,0x05,0x0b,0x2a,0x01,0x0b,0x2b,0x01,0x0a,0x2c,0x02,0x0b, 0x2a,0x01,0x0b,0x29,0x01,0x83,0x0b,0x2a,0x01,0x08,0x09,0x2a,0x01,0x09,0x29, 0x01,0x0a,0x2a,0x01,0x09,0x29,0x01,0x09,0x28,0x01,0x09,0x2a,0x01,0x0a,0x29, 0x01,0x09,0x28,0x00,0x83,0x09,0x28,0x01,0x01,0x0a,0x28,0x01,0x82,0x0a,0x27, 0x01,0x86,0x09,0x26,0x01,0x01,0x0a,0x26,0x02,0x87,0x09,0x25,0x01,0x83,0x09, 0x24,0x01,0x82,0x09,0x23,0x01,0x0a,0x08,0x23,0x01,0x09,0x23,0x01,0x08,0x23, 0x01,0x09,0x22,0x01,0x08,0x22,0x01,0x08,0x21,0x01,0x08,0x22,0x01,0x08,0x21, 0x01,0x08,0x22,0x01,0x08,0x21,0x00,0x82,0x08,0x21,0x01,0x01,0x09,0x21,0x01, 0x83,0x08,0x21,0x01,0x05,0x08,0x20,0x01,0x08,0x20,0x00,0x08,0x1f,0x00,0x08, 0x1f,0x01,0x08,0x1f,0x00,0x82,0x08,0x1f,0x01,0x82,0x07,0x1e,0x00,0x01,0x08, 0x1e,0x01,0x83,0x07,0x1e,0x00,0x03,0x07,0x1e,0x01,0x07,0x1d,0x00,0x06,0x1d, 0x00,0x82,0x07,0x1d,0x01,0x82,0x06,0x1c,0x00,0x03,0x07,0x1d,0x01,0x06,0x1c, 0x00,0x06,0x1b,0x00,0x82,0x06,0x1c,0x00,0x03,0x06,0x1c,0x01,0x06,0x1b,0x00, 0x06,0x1b,0x01,0x84,0x06,0x1b,0x00,0x84,0x06,0x1a,0x00,0x83,0x06,0x19,0x00, 0x82,0x05,0x19,0x00,0x86,0x05,0x18,0x00,0x84,0x04,0x17,0x00,0x83,0x05,0x17, 0x00,0x82,0x05,0x16,0x00,0x87,0x04,0x16,0x00,0x86,0x04,0x15,0x00,0x85,0x04, 0x14,0x00,0x82,0x04,0x13,0x00,0x82,0x03,0x13,0x00,0x83,0x04,0x13,0x00,0x01, 0x03,0x13,0x00,0x82,0x04,0x13,0x00,0x84,0x04,0x12,0x00,0x04,0x04,0x11,0x00, 0x03,0x12,0x00,0x03,0x11,0x00,0x04,0x12,0x00,0x88,0x04,0x11,0x00,0x02,0x03, 0x11,0x00,0x04,0x11,0x00,0x83,0x04,0x10,0x00,0x01,0x03,0x10,0x00,0x82,0x04, 0x10,0x00,0x01,0x03,0x0f,0x00,0x82,0x04,0x10,0x00,0x05,0x04,0x11,0x00,0x04, 0x13,0x00,0x05,0x13,0x00,0x06,0x13,0x02,0x08,0x13,0x03,0x83,0x08,0x13,0x04, 0x02,0x08,0x12,0x03,0x08,0x13,0x03,0x82,0x08,0x12,0x03,0x82,0x08,0x11,0x03, 0x04,0x07,0x11,0x03,0x06,0x10,0x03,0x07,0x11,0x03,0x07,0x10,0x03,0x84,0x06, 0x10,0x03,0x83,0x06,0x0f,0x03,0x84,0x06,0x0e,0x03,0x02,0x06,0x0d,0x03,0x05, 0x0d,0x03,0x82,0x06,0x0d,0x03,0x03,0x05,0x0c,0x03,0x05,0x0c,0x02,0x05,0x0c, 0x03,0x82,0x04,0x0b,0x02,0x82,0x04,0x0a,0x01,0x85,0x03,0x09,0x01,0x85,0x03, 0x08,0x01,0x82,0x03,0x07,0x01,0x02,0x02,0x06,0x01,0x03,0x06,0x01,0x83,0x02, 0x06,0x01,0x03,0x02,0x05,0x01,0x01,0x05,0x01,0x01,0x04,0x01,0x84,0x01,0x04, 0x00,0x85,0x01,0x03,0x00,0x82,0x00,0x02,0x00,0x85,0x00,0x01,0x00,0xdd,0x00, 0x00,0x00,0x03,0x42,0x85,0x16,0x43,0x86,0x17,0x42,0x85,0x17,0x82,0x42,0x86, 0x17,0x83,0x41,0x85,0x17,0x02,0x41,0x85,0x15,0x42,0x84,0x17,0x82,0x41,0x84, 0x16,0x04,0x43,0x84,0x15,0x41,0x84,0x16,0x40,0x84,0x15,0x40,0x85,0x17,0x82, 0x41,0x85,0x17,0x82,0x40,0x84,0x16,0x83,0x40,0x83,0x15,0x05,0x41,0x84,0x16, 0x40,0x86,0x15,0x40,0x84,0x16,0x3f,0x83,0x15,0x40,0x84,0x15,0x83,0x3f,0x83, 0x15,0x08,0x40,0x84,0x15,0x40,0x83,0x17,0x40,0x83,0x15,0x41,0x84,0x17,0x3f, 0x83,0x15,0x3f,0x84,0x15,0x40,0x83,0x16,0x40,0x83,0x15,0x82,0x3f,0x82,0x15, 0x02,0x3f,0x83,0x16,0x40,0x84,0x15,0x82,0x3f,0x83,0x16,0x0a,0x40,0x82,0x17, 0x40,0x81,0x17,0x40,0x81,0x16,0x3f,0x81,0x17,0x3f,0x82,0x15,0x40,0x83,0x16, 0x3f,0x82,0x15,0x40,0x82,0x17,0x41,0x81,0x18,0x40,0x81,0x17,0x86,0x3f,0x81, 0x17,0x86,0x3f,0x81,0x18,0x82,0x3f,0x80,0x19,0x82,0x40,0x80,0x1b,0x01,0x40, 0x7f,0x1a,0x82,0x3f,0x81,0x1b,0x06,0x40,0x7f,0x1a,0x40,0x7f,0x1b,0x40,0x80, 0x1c,0x40,0x7f,0x1b,0x3f,0x80,0x1b,0x40,0x81,0x1d,0x82,0x3f,0x81,0x1c,0x03, 0x40,0x7f,0x1c,0x40,0x7f,0x1e,0x3f,0x7e,0x1d,0x84,0x40,0x7f,0x1d,0x02,0x40, 0x7e,0x1d,0x41,0x7f,0x1e,0x82,0x40,0x7f,0x1e,0x83,0x40,0x7f,0x1f,0x02,0x40, 0x7e,0x1f,0x40,0x7f,0x1f,0x84,0x40,0x7e,0x1f,0x05,0x3f,0x7e,0x1f,0x40,0x7e, 0x1f,0x41,0x7f,0x20,0x40,0x7e,0x1f,0x41,0x7f,0x20,0x82,0x40,0x7e,0x21,0x01, 0x40,0x7f,0x21,0x82,0x40,0x7e,0x21,0x04,0x40,0x7f,0x20,0x3f,0x7e,0x20,0x40, 0x7e,0x21,0x40,0x7e,0x1f,0x82,0x40,0x7d,0x20,0x01,0x3f,0x7c,0x1f,0x82,0x40, 0x7e,0x1f,0x01,0x3f,0x7e,0x1f,0x82,0x40,0x7d,0x20,0x02,0x40,0x7e,0x21,0x40, 0x7d,0x20,0x82,0x3f,0x7e,0x20,0x02,0x3f,0x7e,0x1f,0x40,0x7d,0x20,0x82,0x40, 0x7e,0x21,0x05,0x3f,0x7e,0x20,0x40,0x7d,0x21,0x3f,0x7c,0x21,0x3f,0x7c,0x1f, 0x3f,0x7c,0x1d,0x85,0x3f,0x7c,0x1f,0x82,0x3e,0x7c,0x1f,0x82,0x3f,0x7c,0x1f, 0x06,0x3e,0x7b,0x1e,0x3d,0x7b,0x1d,0x3f,0x7c,0x1f,0x3f,0x7d,0x1f,0x3d,0x7c, 0x1e,0x3d,0x7b,0x1f,0x82,0x3e,0x7b,0x1e,0x05,0x3e,0x7b,0x1f,0x3f,0x7c,0x20, 0x3d,0x7b,0x1f,0x3d,0x7a,0x1e,0x3e,0x7b,0x1e,0x82,0x3d,0x7b,0x1d,0x83,0x3d, 0x7b,0x1f,0x04,0x3b,0x78,0x1c,0x3c,0x79,0x1f,0x3d,0x7b,0x20,0x3c,0x79,0x1f, 0x82,0x3b,0x79,0x1d,0x03,0x3c,0x79,0x1d,0x3b,0x79,0x1e,0x3b,0x78,0x1d,0x82, 0x3a,0x77,0x1c,0x09,0x3b,0x78,0x1d,0x3a,0x77,0x1e,0x3b,0x79,0x1e,0x3b,0x78, 0x1d,0x39,0x76,0x1d,0x3a,0x76,0x1d,0x3a,0x77,0x1d,0x3a,0x76,0x1d,0x38,0x74, 0x1c,0x84,0x38,0x75,0x1c,0x06,0x38,0x74,0x1c,0x37,0x74,0x1b,0x36,0x73,0x1a, 0x38,0x75,0x1c,0x36,0x73,0x1a,0x37,0x74,0x1b,0x82,0x38,0x74,0x1c,0x01,0x36, 0x73,0x1a,0x82,0x37,0x74,0x1b,0x82,0x37,0x72,0x1a,0x0c,0x37,0x72,0x1c,0x38, 0x72,0x1c,0x36,0x72,0x1a,0x33,0x70,0x18,0x35,0x71,0x19,0x37,0x72,0x1a,0x36, 0x71,0x19,0x33,0x70,0x17,0x35,0x6f,0x18,0x35,0x70,0x18,0x33,0x6e,0x18,0x34, 0x6f,0x18,0x83,0x33,0x6e,0x18,0x07,0x34,0x71,0x1a,0x35,0x70,0x1a,0x33,0x6e, 0x19,0x2e,0x68,0x15,0x27,0x60,0x0e,0x1f,0x58,0x09,0x1d,0x57,0x09,0x82,0x1d, 0x56,0x09,0x05,0x1f,0x57,0x09,0x1d,0x56,0x08,0x1f,0x58,0x0a,0x1f,0x58,0x08, 0x1e,0x57,0x08,0x82,0x1e,0x56,0x09,0x01,0x1e,0x58,0x09,0x82,0x1d,0x56,0x08, 0x02,0x1e,0x56,0x09,0x1d,0x56,0x08,0x82,0x1c,0x56,0x08,0x01,0x1c,0x54,0x07, 0x84,0x1c,0x54,0x08,0x84,0x1c,0x54,0x07,0x83,0x1b,0x53,0x06,0x82,0x1a,0x53, 0x06,0x04,0x1a,0x51,0x06,0x19,0x51,0x06,0x1a,0x51,0x06,0x19,0x51,0x06,0x82, 0x1a,0x51,0x06,0x06,0x1a,0x52,0x05,0x19,0x51,0x04,0x1a,0x52,0x05,0x19,0x51, 0x04,0x18,0x51,0x04,0x18,0x52,0x04,0x82,0x18,0x51,0x04,0x83,0x19,0x51,0x04, 0x82,0x18,0x50,0x03,0x82,0x19,0x51,0x04,0x01,0x1a,0x52,0x05,0x83,0x19,0x53, 0x05,0x82,0x19,0x53,0x04,0x82,0x18,0x52,0x04,0x01,0x19,0x53,0x04,0x82,0x19, 0x53,0x05,0x82,0x19,0x53,0x04,0x02,0x19,0x53,0x05,0x18,0x52,0x04,0x83,0x19, 0x51,0x04,0x01,0x18,0x52,0x04,0x82,0x1a,0x52,0x05,0x82,0x19,0x51,0x04,0x05, 0x19,0x51,0x06,0x19,0x51,0x04,0x18,0x51,0x05,0x19,0x53,0x05,0x19,0x51,0x04, 0x82,0x18,0x51,0x04,0x04,0x18,0x4f,0x03,0x17,0x4e,0x04,0x18,0x4f,0x04,0x18, 0x4e,0x04,0x82,0x17,0x4e,0x04,0x82,0x18,0x4e,0x04,0x0b,0x17,0x4e,0x04,0x18, 0x4d,0x04,0x17,0x4d,0x04,0x17,0x4c,0x04,0x16,0x4c,0x04,0x17,0x4c,0x04,0x16, 0x4b,0x03,0x17,0x4b,0x04,0x17,0x4a,0x04,0x16,0x4a,0x04,0x15,0x49,0x04,0x83, 0x15,0x4a,0x04,0x0a,0x15,0x48,0x04,0x17,0x4a,0x04,0x15,0x49,0x04,0x17,0x48, 0x04,0x15,0x47,0x04,0x15,0x49,0x05,0x14,0x48,0x04,0x15,0x47,0x04,0x14,0x46, 0x04,0x15,0x47,0x05,0x82,0x14,0x47,0x04,0x02,0x15,0x46,0x04,0x14,0x45,0x03, 0x83,0x15,0x45,0x04,0x0b,0x14,0x46,0x04,0x14,0x45,0x04,0x15,0x44,0x04,0x13, 0x44,0x04,0x13,0x45,0x04,0x14,0x44,0x04,0x15,0x45,0x03,0x14,0x44,0x04,0x14, 0x42,0x03,0x13,0x42,0x04,0x13,0x44,0x04,0x82,0x13,0x42,0x04,0x82,0x12,0x42, 0x03,0x03,0x15,0x42,0x04,0x12,0x40,0x03,0x12,0x40,0x02,0x82,0x13,0x41,0x04, 0x03,0x12,0x40,0x03,0x10,0x40,0x03,0x11,0x40,0x03,0x84,0x12,0x3f,0x03,0x01, 0x11,0x3e,0x03,0x82,0x11,0x3e,0x02,0x01,0x11,0x3d,0x03,0x82,0x10,0x3d,0x02, 0x03,0x11,0x3d,0x04,0x10,0x3c,0x03,0x10,0x3b,0x03,0x82,0x10,0x3d,0x03,0x0f, 0x10,0x3b,0x03,0x10,0x3a,0x03,0x11,0x3a,0x03,0x10,0x3a,0x03,0x0f,0x3a,0x01, 0x10,0x3a,0x03,0x0f,0x3a,0x03,0x10,0x39,0x02,0x0e,0x3a,0x03,0x10,0x3a,0x03, 0x10,0x3b,0x03,0x0f,0x39,0x03,0x10,0x39,0x03,0x10,0x38,0x03,0x0f,0x37,0x02, 0x82,0x0f,0x38,0x03,0x03,0x0e,0x37,0x02,0x0f,0x36,0x02,0x10,0x38,0x03,0x82, 0x0e,0x36,0x02,0x03,0x0d,0x36,0x01,0x0e,0x36,0x03,0x0d,0x36,0x02,0x82,0x0e, 0x36,0x02,0x03,0x0e,0x36,0x03,0x0e,0x35,0x03,0x0e,0x34,0x02,0x82,0x0e,0x34, 0x01,0x03,0x0e,0x34,0x03,0x0e,0x33,0x02,0x0e,0x34,0x02,0x82,0x0e,0x33,0x02, 0x83,0x0d,0x33,0x02,0x83,0x0d,0x32,0x02,0x06,0x0d,0x31,0x02,0x0d,0x31,0x01, 0x0d,0x31,0x02,0x0d,0x31,0x01,0x0c,0x30,0x01,0x0d,0x31,0x02,0x83,0x0d,0x30, 0x02,0x05,0x0d,0x2f,0x01,0x0c,0x2f,0x01,0x0b,0x30,0x01,0x0c,0x30,0x01,0x0b, 0x2f,0x01,0x82,0x0c,0x2e,0x01,0x02,0x0c,0x2f,0x01,0x0c,0x2e,0x01,0x83,0x0b, 0x2c,0x01,0x06,0x0b,0x2d,0x01,0x0b,0x2c,0x01,0x0c,0x2c,0x01,0x0b,0x2c,0x01, 0x0b,0x2b,0x01,0x0c,0x2c,0x02,0x82,0x0b,0x2b,0x01,0x05,0x0b,0x2b,0x00,0x0b, 0x2b,0x01,0x0b,0x2b,0x02,0x0b,0x2a,0x00,0x0b,0x2b,0x01,0x82,0x0b,0x2a,0x01, 0x01,0x0b,0x29,0x01,0x82,0x0a,0x29,0x01,0x04,0x0b,0x29,0x01,0x0a,0x29,0x02, 0x0b,0x29,0x01,0x09,0x27,0x00,0x82,0x0a,0x28,0x01,0x03,0x09,0x28,0x01,0x0a, 0x29,0x01,0x0a,0x28,0x00,0x82,0x0a,0x27,0x01,0x83,0x09,0x27,0x01,0x87,0x09, 0x26,0x01,0x84,0x09,0x25,0x01,0x84,0x09,0x24,0x01,0x02,0x08,0x23,0x01,0x09, 0x22,0x01,0x84,0x08,0x22,0x01,0x01,0x09,0x22,0x01,0x83,0x08,0x22,0x01,0x82, 0x08,0x21,0x00,0x86,0x08,0x21,0x01,0x01,0x08,0x1f,0x00,0x82,0x08,0x20,0x01, 0x02,0x08,0x1f,0x01,0x08,0x20,0x01,0x82,0x07,0x1f,0x00,0x83,0x07,0x1e,0x00, 0x03,0x07,0x1d,0x00,0x07,0x1e,0x01,0x07,0x1d,0x01,0x82,0x06,0x1d,0x00,0x82, 0x07,0x1d,0x00,0x02,0x07,0x1d,0x01,0x07,0x1c,0x00,0x87,0x06,0x1c,0x00,0x01, 0x06,0x1c,0x01,0x82,0x06,0x1b,0x00,0x86,0x06,0x1a,0x00,0x82,0x06,0x19,0x00, 0x03,0x06,0x1a,0x00,0x06,0x19,0x00,0x05,0x19,0x00,0x86,0x05,0x18,0x00,0x02, 0x05,0x17,0x00,0x05,0x18,0x00,0x82,0x05,0x17,0x00,0x02,0x04,0x17,0x00,0x05, 0x17,0x00,0x82,0x04,0x17,0x00,0x85,0x04,0x16,0x00,0x88,0x04,0x15,0x00,0x85, 0x04,0x14,0x00,0x83,0x04,0x13,0x00,0x03,0x03,0x13,0x00,0x04,0x13,0x00,0x03, 0x13,0x00,0x83,0x04,0x13,0x00,0x82,0x03,0x12,0x00,0x82,0x04,0x12,0x00,0x82, 0x03,0x12,0x00,0x02,0x04,0x12,0x00,0x03,0x12,0x00,0x82,0x04,0x12,0x00,0x01, 0x03,0x11,0x00,0x82,0x04,0x11,0x00,0x02,0x03,0x11,0x00,0x04,0x11,0x00,0x82, 0x03,0x10,0x00,0x01,0x04,0x11,0x00,0x82,0x04,0x10,0x00,0x84,0x03,0x10,0x00, 0x03,0x04,0x10,0x00,0x03,0x10,0x00,0x04,0x0f,0x00,0x82,0x03,0x0f,0x00,0x82, 0x04,0x10,0x00,0x82,0x04,0x12,0x00,0x04,0x06,0x13,0x01,0x07,0x13,0x02,0x08, 0x13,0x03,0x08,0x13,0x04,0x82,0x08,0x12,0x03,0x04,0x07,0x12,0x03,0x08,0x12, 0x03,0x07,0x12,0x03,0x08,0x12,0x03,0x83,0x07,0x11,0x03,0x83,0x07,0x10,0x03, 0x82,0x06,0x10,0x03,0x83,0x06,0x0f,0x03,0x83,0x06,0x0e,0x03,0x82,0x06,0x0d, 0x03,0x83,0x05,0x0d,0x03,0x03,0x05,0x0c,0x02,0x05,0x0c,0x03,0x05,0x0c,0x02, 0x82,0x04,0x0b,0x02,0x02,0x04,0x0a,0x02,0x04,0x0a,0x01,0x84,0x03,0x09,0x01, 0x85,0x03,0x08,0x01,0x82,0x03,0x07,0x01,0x85,0x02,0x06,0x01,0x02,0x02,0x05, 0x01,0x01,0x05,0x01,0x85,0x01,0x04,0x00,0x85,0x01,0x03,0x00,0x82,0x00,0x02, 0x00,0x85,0x00,0x01,0x00,0xdd,0x00,0x00,0x00,0x82,0x42,0x87,0x16,0x82,0x42, 0x87,0x17,0x01,0x43,0x87,0x17,0x82,0x42,0x85,0x16,0x03,0x42,0x86,0x17,0x42, 0x86,0x16,0x41,0x85,0x16,0x82,0x42,0x86,0x17,0x03,0x41,0x85,0x16,0x41,0x86, 0x16,0x42,0x85,0x16,0x82,0x41,0x85,0x16,0x82,0x41,0x86,0x16,0x82,0x40,0x85, 0x15,0x01,0x42,0x85,0x16,0x82,0x41,0x84,0x15,0x02,0x40,0x86,0x14,0x42,0x85, 0x16,0x82,0x41,0x85,0x16,0x04,0x40,0x85,0x15,0x41,0x86,0x16,0x41,0x85,0x16, 0x41,0x84,0x15,0x82,0x40,0x85,0x15,0x12,0x40,0x84,0x16,0x41,0x85,0x16,0x40, 0x85,0x16,0x3f,0x83,0x16,0x40,0x84,0x16,0x42,0x83,0x16,0x3f,0x83,0x16,0x40, 0x83,0x14,0x41,0x84,0x15,0x40,0x85,0x15,0x40,0x83,0x14,0x40,0x83,0x16,0x3f, 0x83,0x17,0x40,0x83,0x17,0x40,0x83,0x16,0x40,0x83,0x17,0x3f,0x82,0x16,0x40, 0x83,0x17,0x82,0x41,0x83,0x17,0x02,0x41,0x82,0x17,0x41,0x82,0x18,0x82,0x3f, 0x82,0x17,0x08,0x40,0x83,0x17,0x3f,0x83,0x17,0x40,0x83,0x17,0x40,0x83,0x19, 0x3f,0x82,0x18,0x3f,0x81,0x19,0x3f,0x82,0x18,0x40,0x83,0x19,0x82,0x3f,0x82, 0x19,0x0a,0x41,0x82,0x1a,0x41,0x81,0x1b,0x41,0x82,0x19,0x41,0x80,0x1b,0x41, 0x81,0x1b,0x41,0x82,0x1b,0x42,0x82,0x1c,0x41,0x82,0x1b,0x41,0x81,0x1b,0x40, 0x80,0x1b,0x82,0x41,0x81,0x1b,0x06,0x3e,0x80,0x1b,0x3f,0x81,0x1e,0x41,0x81, 0x1d,0x42,0x82,0x1e,0x40,0x80,0x1c,0x41,0x80,0x1e,0x83,0x41,0x80,0x1f,0x82, 0x41,0x7f,0x1e,0x82,0x3f,0x7f,0x1e,0x04,0x41,0x7f,0x1e,0x40,0x80,0x1e,0x41, 0x81,0x20,0x41,0x7f,0x1f,0x82,0x41,0x80,0x20,0x02,0x41,0x7f,0x1f,0x42,0x80, 0x20,0x82,0x41,0x80,0x20,0x02,0x41,0x7f,0x21,0x41,0x81,0x20,0x82,0x40,0x7f, 0x1f,0x06,0x40,0x7f,0x20,0x40,0x7e,0x20,0x41,0x7e,0x20,0x3f,0x7e,0x20,0x41, 0x80,0x21,0x41,0x80,0x20,0x82,0x3f,0x7e,0x20,0x01,0x41,0x7f,0x1f,0x82,0x41, 0x7f,0x21,0x04,0x41,0x7e,0x20,0x41,0x7f,0x1f,0x41,0x80,0x20,0x40,0x7f,0x20, 0x82,0x41,0x7e,0x20,0x02,0x41,0x7f,0x21,0x41,0x7e,0x20,0x82,0x40,0x7f,0x20, 0x08,0x41,0x80,0x20,0x41,0x7f,0x1f,0x40,0x7e,0x1e,0x3f,0x7e,0x1e,0x3f,0x7d, 0x1f,0x3f,0x7d,0x20,0x41,0x7d,0x21,0x40,0x7e,0x20,0x82,0x40,0x7e,0x1e,0x02, 0x3f,0x7e,0x20,0x40,0x7f,0x20,0x82,0x3f,0x7e,0x1f,0x02,0x40,0x7f,0x22,0x3f, 0x7e,0x21,0x83,0x40,0x7e,0x20,0x05,0x3f,0x7c,0x1e,0x3e,0x7d,0x1e,0x3f,0x7e, 0x1f,0x3f,0x7e,0x20,0x3e,0x7d,0x20,0x83,0x3f,0x7c,0x20,0x01,0x3e,0x7c,0x1f, 0x82,0x3f,0x7c,0x20,0x01,0x3e,0x7c,0x1f,0x82,0x3e,0x7c,0x1e,0x01,0x3d,0x7b, 0x1e,0x82,0x3e,0x7c,0x1f,0x13,0x3d,0x7b,0x1f,0x3c,0x7a,0x1e,0x3d,0x7b,0x20, 0x3c,0x7b,0x1f,0x3d,0x7b,0x1e,0x3c,0x7a,0x1d,0x3d,0x7b,0x20,0x3c,0x7a,0x1e, 0x3b,0x79,0x1e,0x3b,0x79,0x1d,0x3b,0x79,0x1e,0x3a,0x78,0x1d,0x3a,0x77,0x1e, 0x3d,0x79,0x1e,0x3c,0x78,0x1d,0x3b,0x77,0x1c,0x3d,0x79,0x1f,0x3b,0x77,0x1c, 0x3a,0x76,0x1c,0x82,0x3a,0x77,0x1d,0x01,0x38,0x76,0x1c,0x82,0x3a,0x77,0x1d, 0x05,0x37,0x74,0x1b,0x38,0x75,0x1c,0x38,0x76,0x1d,0x39,0x76,0x1d,0x38,0x75, 0x1c,0x82,0x38,0x75,0x1b,0x02,0x37,0x76,0x1c,0x36,0x75,0x1b,0x82,0x38,0x75, 0x1b,0x04,0x36,0x74,0x1b,0x38,0x74,0x1a,0x38,0x73,0x1b,0x37,0x74,0x1b,0x82, 0x36,0x73,0x1a,0x82,0x35,0x72,0x19,0x0b,0x38,0x73,0x1b,0x35,0x72,0x19,0x35, 0x70,0x18,0x36,0x72,0x19,0x35,0x70,0x17,0x35,0x70,0x18,0x34,0x71,0x18,0x35, 0x72,0x1a,0x33,0x70,0x18,0x31,0x6d,0x17,0x33,0x70,0x18,0x82,0x33,0x6f,0x16, 0x0a,0x35,0x70,0x19,0x2e,0x6a,0x14,0x2c,0x67,0x14,0x26,0x61,0x0f,0x20,0x59, 0x0b,0x1e,0x57,0x08,0x1d,0x57,0x08,0x1e,0x58,0x0a,0x1e,0x58,0x08,0x20,0x5a, 0x0b,0x82,0x1f,0x59,0x0a,0x01,0x1d,0x59,0x0a,0x82,0x1e,0x58,0x0a,0x02,0x1f, 0x58,0x0a,0x1e,0x57,0x09,0x82,0x1d,0x56,0x08,0x01,0x1d,0x55,0x08,0x82,0x1c, 0x55,0x07,0x06,0x1d,0x55,0x08,0x1d,0x56,0x08,0x1d,0x55,0x07,0x1c,0x55,0x07, 0x1d,0x55,0x08,0x1d,0x54,0x07,0x82,0x1c,0x55,0x07,0x83,0x1b,0x54,0x06,0x82, 0x1b,0x52,0x06,0x82,0x1b,0x53,0x07,0x08,0x1a,0x52,0x06,0x1a,0x53,0x05,0x19, 0x52,0x05,0x1b,0x53,0x06,0x1a,0x53,0x05,0x19,0x52,0x05,0x1a,0x53,0x05,0x19, 0x53,0x05,0x82,0x19,0x52,0x05,0x01,0x19,0x53,0x05,0x83,0x19,0x52,0x04,0x03, 0x18,0x52,0x04,0x19,0x52,0x04,0x19,0x52,0x05,0x84,0x19,0x53,0x05,0x03,0x19, 0x53,0x04,0x1a,0x54,0x05,0x18,0x52,0x03,0x82,0x19,0x53,0x04,0x82,0x18,0x52, 0x04,0x83,0x19,0x53,0x05,0x0b,0x17,0x52,0x04,0x19,0x52,0x05,0x1b,0x51,0x05, 0x19,0x52,0x05,0x18,0x52,0x04,0x19,0x53,0x05,0x1a,0x53,0x05,0x19,0x52,0x05, 0x19,0x52,0x04,0x19,0x51,0x05,0x19,0x52,0x05,0x82,0x19,0x51,0x05,0x04,0x19, 0x52,0x03,0x19,0x52,0x06,0x19,0x52,0x04,0x18,0x50,0x03,0x82,0x18,0x50,0x05, 0x06,0x18,0x4f,0x05,0x17,0x4f,0x04,0x17,0x50,0x05,0x18,0x4f,0x05,0x17,0x4e, 0x04,0x16,0x4d,0x05,0x83,0x17,0x4d,0x04,0x06,0x17,0x4e,0x05,0x17,0x4d,0x05, 0x16,0x4c,0x03,0x19,0x4b,0x04,0x17,0x4b,0x05,0x16,0x4a,0x04,0x82,0x16,0x4b, 0x05,0x11,0x17,0x4c,0x06,0x15,0x4a,0x03,0x16,0x49,0x03,0x17,0x4b,0x04,0x16, 0x49,0x04,0x17,0x48,0x04,0x15,0x49,0x04,0x16,0x4b,0x05,0x14,0x49,0x04,0x16, 0x47,0x04,0x16,0x46,0x05,0x15,0x48,0x06,0x14,0x47,0x05,0x15,0x48,0x05,0x15, 0x47,0x04,0x14,0x46,0x03,0x16,0x47,0x05,0x82,0x15,0x46,0x04,0x04,0x14,0x46, 0x04,0x16,0x46,0x04,0x14,0x45,0x03,0x14,0x44,0x04,0x82,0x14,0x45,0x04,0x07, 0x14,0x45,0x03,0x16,0x45,0x04,0x15,0x44,0x03,0x13,0x44,0x04,0x14,0x43,0x04, 0x13,0x44,0x04,0x13,0x43,0x03,0x82,0x12,0x42,0x03,0x10,0x14,0x42,0x03,0x14, 0x41,0x04,0x13,0x43,0x03,0x14,0x42,0x03,0x14,0x41,0x03,0x13,0x41,0x04,0x12, 0x42,0x04,0x12,0x40,0x03,0x12,0x3f,0x03,0x12,0x41,0x02,0x12,0x40,0x05,0x11, 0x3f,0x04,0x11,0x3f,0x03,0x12,0x3f,0x04,0x11,0x3f,0x03,0x11,0x3d,0x02,0x82, 0x11,0x3e,0x04,0x82,0x11,0x3d,0x04,0x14,0x12,0x3d,0x04,0x12,0x3d,0x03,0x11, 0x3c,0x02,0x10,0x3d,0x02,0x11,0x3c,0x03,0x10,0x3b,0x03,0x10,0x3c,0x02,0x10, 0x3c,0x04,0x10,0x3b,0x02,0x0f,0x3a,0x03,0x11,0x3a,0x03,0x10,0x3b,0x03,0x11, 0x3a,0x03,0x10,0x3a,0x02,0x0f,0x3a,0x02,0x0f,0x3a,0x03,0x0f,0x39,0x03,0x0f, 0x3a,0x03,0x0f,0x39,0x01,0x0f,0x3a,0x02,0x83,0x0f,0x38,0x03,0x02,0x0f,0x37, 0x02,0x0e,0x37,0x02,0x82,0x0f,0x37,0x03,0x05,0x0d,0x36,0x01,0x0f,0x37,0x03, 0x0f,0x36,0x03,0x0f,0x36,0x01,0x0e,0x35,0x03,0x83,0x0f,0x35,0x03,0x07,0x0f, 0x34,0x03,0x0e,0x33,0x03,0x0d,0x33,0x01,0x0f,0x33,0x01,0x0f,0x34,0x02,0x0e, 0x34,0x02,0x0e,0x33,0x02,0x83,0x0d,0x33,0x02,0x02,0x0c,0x32,0x01,0x0d,0x32, 0x02,0x82,0x0d,0x31,0x01,0x08,0x0e,0x32,0x02,0x0d,0x31,0x01,0x0d,0x30,0x01, 0x0d,0x31,0x02,0x0d,0x31,0x01,0x0c,0x31,0x02,0x0d,0x30,0x02,0x0b,0x30,0x01, 0x82,0x0d,0x2f,0x01,0x82,0x0b,0x2f,0x02,0x01,0x0d,0x2e,0x01,0x82,0x0c,0x2f, 0x01,0x83,0x0b,0x2e,0x01,0x08,0x0d,0x2e,0x01,0x0b,0x2e,0x01,0x0b,0x2d,0x01, 0x0c,0x2e,0x01,0x0b,0x2d,0x02,0x0b,0x2c,0x01,0x0b,0x2d,0x02,0x0c,0x2d,0x01, 0x82,0x0b,0x2c,0x01,0x04,0x0b,0x2b,0x01,0x0b,0x2c,0x01,0x0b,0x2b,0x00,0x0a, 0x2a,0x01,0x82,0x0b,0x2a,0x01,0x82,0x0a,0x2a,0x01,0x82,0x0b,0x2a,0x01,0x82, 0x0b,0x29,0x01,0x84,0x0a,0x29,0x01,0x03,0x0a,0x28,0x01,0x0a,0x28,0x00,0x0a, 0x29,0x01,0x82,0x09,0x28,0x01,0x82,0x09,0x27,0x01,0x84,0x0a,0x27,0x01,0x01, 0x0a,0x26,0x01,0x82,0x09,0x25,0x01,0x82,0x0a,0x25,0x01,0x83,0x09,0x25,0x01, 0x02,0x09,0x24,0x01,0x08,0x23,0x01,0x84,0x09,0x23,0x01,0x02,0x08,0x23,0x00, 0x09,0x23,0x01,0x82,0x08,0x22,0x01,0x01,0x09,0x22,0x01,0x83,0x08,0x22,0x01, 0x82,0x08,0x21,0x00,0x04,0x08,0x21,0x01,0x08,0x21,0x00,0x07,0x20,0x00,0x08, 0x21,0x01,0x82,0x08,0x20,0x00,0x83,0x08,0x20,0x01,0x01,0x07,0x1f,0x00,0x82, 0x07,0x1e,0x01,0x02,0x07,0x1e,0x00,0x08,0x1f,0x01,0x82,0x07,0x1e,0x00,0x85, 0x07,0x1e,0x01,0x01,0x07,0x1e,0x00,0x82,0x06,0x1d,0x00,0x03,0x07,0x1d,0x01, 0x06,0x1d,0x00,0x07,0x1d,0x01,0x82,0x06,0x1c,0x00,0x03,0x06,0x1c,0x01,0x06, 0x1c,0x00,0x06,0x1c,0x01,0x86,0x06,0x1b,0x00,0x82,0x06,0x1a,0x00,0x03,0x06, 0x19,0x01,0x06,0x19,0x00,0x05,0x19,0x00,0x82,0x06,0x19,0x00,0x01,0x05,0x19, 0x00,0x83,0x05,0x18,0x00,0x02,0x06,0x19,0x00,0x05,0x18,0x00,0x86,0x05,0x17, 0x00,0x8a,0x05,0x16,0x00,0x83,0x04,0x15,0x00,0x05,0x05,0x14,0x00,0x04,0x14, 0x00,0x05,0x14,0x00,0x04,0x14,0x00,0x03,0x14,0x00,0x83,0x04,0x14,0x00,0x03, 0x03,0x14,0x00,0x04,0x14,0x00,0x04,0x13,0x00,0x84,0x03,0x13,0x00,0x02,0x03, 0x12,0x00,0x04,0x12,0x00,0x86,0x03,0x12,0x00,0x01,0x04,0x12,0x00,0x85,0x03, 0x11,0x00,0x01,0x04,0x11,0x00,0x82,0x03,0x11,0x00,0x01,0x04,0x11,0x00,0x83, 0x03,0x11,0x00,0x02,0x04,0x11,0x00,0x04,0x10,0x00,0x84,0x03,0x10,0x00,0x02, 0x03,0x0f,0x00,0x04,0x0f,0x00,0x83,0x03,0x0f,0x00,0x08,0x04,0x0f,0x00,0x05, 0x11,0x00,0x05,0x12,0x00,0x06,0x12,0x01,0x06,0x13,0x02,0x07,0x12,0x03,0x08, 0x13,0x04,0x08,0x12,0x04,0x83,0x08,0x12,0x03,0x02,0x07,0x11,0x03,0x08,0x11, 0x03,0x84,0x07,0x11,0x03,0x82,0x06,0x10,0x03,0x85,0x06,0x0f,0x03,0x82,0x06, 0x0e,0x03,0x82,0x06,0x0d,0x03,0x05,0x05,0x0d,0x03,0x05,0x0d,0x02,0x05,0x0c, 0x02,0x05,0x0c,0x03,0x05,0x0c,0x02,0x84,0x05,0x0b,0x02,0x02,0x04,0x0a,0x02, 0x04,0x0a,0x01,0x82,0x03,0x09,0x01,0x85,0x03,0x08,0x01,0x82,0x03,0x07,0x01, 0x85,0x02,0x06,0x01,0x02,0x02,0x05,0x01,0x01,0x05,0x01,0x83,0x01,0x05,0x00, 0x82,0x01,0x04,0x00,0x85,0x01,0x03,0x00,0x83,0x00,0x02,0x00,0x84,0x00,0x01, 0x00,0xdd,0x00,0x00,0x00,0x0b,0x42,0x87,0x15,0x43,0x87,0x16,0x43,0x87,0x17, 0x41,0x85,0x15,0x42,0x87,0x16,0x42,0x88,0x17,0x43,0x89,0x18,0x42,0x87,0x16, 0x43,0x87,0x16,0x41,0x87,0x16,0x41,0x86,0x17,0x82,0x42,0x87,0x16,0x03,0x42, 0x86,0x15,0x41,0x86,0x15,0x42,0x87,0x16,0x82,0x41,0x87,0x16,0x01,0x41,0x86, 0x15,0x82,0x41,0x87,0x16,0x01,0x42,0x87,0x16,0x83,0x41,0x86,0x15,0x82,0x41, 0x87,0x16,0x02,0x40,0x84,0x14,0x41,0x86,0x15,0x82,0x41,0x85,0x15,0x01,0x3f, 0x85,0x15,0x83,0x41,0x86,0x15,0x82,0x41,0x85,0x15,0x04,0x41,0x86,0x15,0x40, 0x85,0x16,0x41,0x85,0x16,0x40,0x85,0x16,0x85,0x41,0x85,0x16,0x0b,0x40,0x84, 0x15,0x40,0x85,0x16,0x3f,0x84,0x15,0x3f,0x84,0x16,0x40,0x84,0x17,0x40,0x84, 0x16,0x41,0x83,0x16,0x41,0x84,0x16,0x40,0x84,0x17,0x3f,0x83,0x16,0x41,0x84, 0x17,0x84,0x40,0x84,0x17,0x02,0x3f,0x83,0x18,0x40,0x84,0x18,0x82,0x3f,0x83, 0x18,0x09,0x40,0x84,0x18,0x3f,0x82,0x19,0x40,0x83,0x1a,0x41,0x84,0x1a,0x3f, 0x82,0x1a,0x40,0x83,0x1b,0x42,0x83,0x1c,0x3f,0x82,0x1b,0x40,0x83,0x1b,0x82, 0x41,0x82,0x1b,0x03,0x3f,0x82,0x1a,0x40,0x83,0x1c,0x41,0x84,0x1c,0x82,0x3f, 0x82,0x1b,0x82,0x40,0x82,0x1d,0x06,0x41,0x81,0x1c,0x40,0x80,0x1c,0x41,0x81, 0x1c,0x41,0x82,0x1e,0x42,0x82,0x1f,0x41,0x82,0x1e,0x82,0x41,0x81,0x1f,0x01, 0x41,0x82,0x1f,0x83,0x41,0x81,0x1f,0x01,0x42,0x82,0x1f,0x82,0x40,0x82,0x1f, 0x01,0x41,0x81,0x1f,0x83,0x41,0x80,0x1f,0x03,0x42,0x82,0x21,0x42,0x82,0x20, 0x41,0x81,0x20,0x82,0x41,0x80,0x1f,0x06,0x41,0x80,0x21,0x42,0x80,0x21,0x41, 0x80,0x21,0x40,0x80,0x20,0x41,0x7f,0x20,0x41,0x80,0x21,0x83,0x40,0x80,0x20, 0x06,0x41,0x81,0x21,0x41,0x81,0x20,0x40,0x82,0x20,0x41,0x80,0x1f,0x3f,0x80, 0x20,0x41,0x80,0x21,0x82,0x41,0x7f,0x20,0x02,0x40,0x80,0x20,0x41,0x80,0x21, 0x83,0x40,0x80,0x20,0x82,0x40,0x7e,0x1f,0x0b,0x41,0x7f,0x21,0x41,0x7f,0x20, 0x40,0x7e,0x1f,0x41,0x7f,0x20,0x40,0x80,0x21,0x40,0x80,0x20,0x3f,0x7f,0x1f, 0x3f,0x7e,0x1f,0x40,0x80,0x21,0x3f,0x7e,0x20,0x3f,0x7f,0x1f,0x82,0x3f,0x80, 0x20,0x02,0x41,0x80,0x21,0x3e,0x7e,0x1e,0x84,0x3f,0x7e,0x1f,0x05,0x3f,0x7f, 0x1f,0x3e,0x7e,0x1e,0x40,0x7e,0x1f,0x3f,0x7d,0x1f,0x3f,0x7e,0x20,0x82,0x3e, 0x7d,0x1f,0x03,0x3f,0x7e,0x20,0x3f,0x7d,0x1f,0x3d,0x7c,0x1e,0x82,0x3e,0x7d, 0x1f,0x82,0x3d,0x7c,0x1e,0x01,0x3e,0x7d,0x1f,0x82,0x3d,0x7d,0x1e,0x06,0x3d, 0x7d,0x1f,0x3d,0x7b,0x1f,0x3d,0x7c,0x1f,0x3d,0x7b,0x1f,0x3c,0x7b,0x1e,0x3c, 0x7b,0x1d,0x82,0x3d,0x7b,0x1d,0x07,0x3b,0x7a,0x1c,0x3b,0x7a,0x1d,0x3c,0x7b, 0x1e,0x3d,0x7a,0x1e,0x3b,0x79,0x1d,0x3b,0x7a,0x1d,0x3a,0x79,0x1c,0x82,0x3c, 0x79,0x1e,0x02,0x3a,0x78,0x1d,0x3b,0x79,0x1e,0x82,0x3a,0x77,0x1d,0x02,0x3a, 0x78,0x1c,0x39,0x77,0x1c,0x82,0x3b,0x77,0x1d,0x83,0x39,0x77,0x1c,0x0d,0x38, 0x75,0x1b,0x38,0x76,0x1c,0x38,0x77,0x1c,0x37,0x76,0x1c,0x39,0x77,0x1d,0x38, 0x74,0x1a,0x3a,0x75,0x1c,0x38,0x75,0x1c,0x36,0x74,0x1a,0x38,0x74,0x1a,0x38, 0x74,0x1b,0x36,0x72,0x18,0x36,0x74,0x1a,0x82,0x34,0x72,0x1a,0x83,0x37,0x73, 0x1a,0x06,0x36,0x74,0x1a,0x34,0x72,0x18,0x34,0x72,0x19,0x34,0x70,0x18,0x33, 0x6e,0x16,0x34,0x70,0x18,0x82,0x33,0x6f,0x17,0x0c,0x34,0x70,0x18,0x33,0x70, 0x18,0x34,0x72,0x18,0x34,0x70,0x16,0x2c,0x68,0x11,0x25,0x60,0x0e,0x20,0x5b, 0x0a,0x1e,0x58,0x09,0x1f,0x58,0x0a,0x1f,0x59,0x08,0x1f,0x59,0x0a,0x1f,0x5a, 0x0a,0x83,0x1f,0x59,0x08,0x01,0x1e,0x59,0x09,0x83,0x1d,0x58,0x08,0x02,0x1d, 0x56,0x08,0x1d,0x57,0x08,0x83,0x1d,0x58,0x08,0x01,0x1c,0x57,0x07,0x84,0x1c, 0x56,0x07,0x03,0x1c,0x55,0x07,0x1c,0x56,0x07,0x1c,0x55,0x07,0x84,0x1a,0x54, 0x05,0x0c,0x1a,0x53,0x05,0x1a,0x54,0x05,0x1b,0x54,0x06,0x1a,0x53,0x07,0x19, 0x52,0x04,0x1b,0x54,0x06,0x1a,0x54,0x05,0x19,0x52,0x05,0x1a,0x54,0x05,0x1a, 0x52,0x04,0x18,0x51,0x05,0x19,0x54,0x05,0x82,0x18,0x52,0x05,0x02,0x1a,0x53, 0x05,0x19,0x52,0x05,0x84,0x1a,0x53,0x05,0x03,0x19,0x52,0x04,0x1a,0x53,0x05, 0x1a,0x55,0x06,0x82,0x19,0x52,0x04,0x04,0x1a,0x53,0x05,0x19,0x52,0x04,0x1a, 0x53,0x05,0x19,0x52,0x04,0x82,0x1a,0x53,0x05,0x83,0x1a,0x54,0x05,0x82,0x19, 0x54,0x05,0x12,0x18,0x53,0x04,0x19,0x54,0x05,0x18,0x52,0x05,0x18,0x53,0x03, 0x1a,0x53,0x05,0x19,0x54,0x05,0x19,0x52,0x05,0x1a,0x52,0x06,0x18,0x52,0x05, 0x19,0x52,0x05,0x18,0x53,0x04,0x1a,0x51,0x04,0x19,0x51,0x03,0x19,0x51,0x05, 0x18,0x50,0x05,0x18,0x4f,0x04,0x19,0x50,0x05,0x18,0x4f,0x04,0x82,0x18,0x4f, 0x05,0x04,0x17,0x4e,0x04,0x16,0x4d,0x03,0x17,0x4e,0x04,0x16,0x4d,0x03,0x82, 0x18,0x4e,0x05,0x03,0x16,0x4c,0x03,0x17,0x4b,0x05,0x16,0x4b,0x04,0x84,0x16, 0x4b,0x05,0x82,0x16,0x4a,0x05,0x02,0x15,0x4a,0x03,0x16,0x4a,0x05,0x82,0x16, 0x49,0x04,0x02,0x15,0x4b,0x05,0x15,0x49,0x04,0x82,0x15,0x48,0x04,0x03,0x15, 0x47,0x05,0x15,0x46,0x04,0x15,0x48,0x05,0x82,0x15,0x47,0x04,0x19,0x15,0x48, 0x05,0x14,0x46,0x04,0x14,0x46,0x03,0x15,0x46,0x04,0x15,0x46,0x03,0x14,0x45, 0x03,0x15,0x46,0x05,0x13,0x46,0x04,0x13,0x45,0x04,0x15,0x45,0x04,0x14,0x45, 0x03,0x15,0x44,0x03,0x13,0x43,0x03,0x13,0x44,0x03,0x14,0x44,0x03,0x14,0x44, 0x05,0x13,0x43,0x04,0x13,0x43,0x03,0x13,0x42,0x03,0x12,0x42,0x03,0x13,0x43, 0x03,0x13,0x42,0x02,0x13,0x42,0x03,0x13,0x42,0x04,0x11,0x41,0x03,0x82,0x13, 0x41,0x04,0x04,0x12,0x41,0x05,0x13,0x41,0x04,0x11,0x3f,0x03,0x12,0x40,0x03, 0x83,0x11,0x3f,0x03,0x0a,0x12,0x3f,0x03,0x12,0x3e,0x03,0x12,0x3d,0x02,0x11, 0x3e,0x03,0x11,0x3d,0x02,0x11,0x3d,0x03,0x11,0x3e,0x03,0x10,0x3d,0x02,0x10, 0x3d,0x04,0x10,0x3d,0x02,0x82,0x11,0x3d,0x03,0x01,0x10,0x3b,0x02,0x82,0x11, 0x3b,0x03,0x02,0x10,0x3b,0x03,0x11,0x3b,0x03,0x82,0x10,0x3a,0x03,0x02,0x10, 0x3b,0x03,0x11,0x3a,0x03,0x82,0x0f,0x3a,0x03,0x0f,0x10,0x38,0x02,0x0f,0x38, 0x01,0x11,0x39,0x03,0x0f,0x38,0x03,0x10,0x38,0x03,0x0f,0x38,0x03,0x0f,0x37, 0x02,0x0f,0x38,0x03,0x0f,0x37,0x03,0x0f,0x36,0x02,0x0f,0x36,0x03,0x0e,0x36, 0x02,0x0e,0x37,0x03,0x0e,0x36,0x02,0x0e,0x36,0x03,0x82,0x0f,0x35,0x02,0x03, 0x0e,0x34,0x01,0x0e,0x33,0x01,0x0f,0x34,0x02,0x82,0x0e,0x34,0x02,0x82,0x0e, 0x33,0x01,0x06,0x0e,0x34,0x02,0x0d,0x33,0x01,0x0d,0x32,0x01,0x0d,0x33,0x02, 0x0c,0x33,0x01,0x0d,0x33,0x02,0x82,0x0c,0x31,0x01,0x06,0x0d,0x32,0x02,0x0c, 0x31,0x01,0x0d,0x31,0x01,0x0c,0x31,0x01,0x0d,0x31,0x02,0x0c,0x30,0x01,0x82, 0x0d,0x30,0x01,0x82,0x0c,0x2f,0x01,0x08,0x0b,0x2f,0x01,0x0c,0x30,0x01,0x0b, 0x2f,0x01,0x0c,0x2d,0x02,0x0c,0x2e,0x01,0x0c,0x2e,0x02,0x0b,0x2e,0x03,0x0b, 0x2f,0x01,0x84,0x0b,0x2d,0x01,0x83,0x0c,0x2c,0x01,0x02,0x0c,0x2d,0x01,0x0b, 0x2d,0x01,0x82,0x0a,0x2c,0x01,0x05,0x0a,0x2b,0x00,0x0a,0x2c,0x01,0x0c,0x2b, 0x02,0x0b,0x2a,0x01,0x0b,0x2a,0x00,0x83,0x0b,0x2a,0x01,0x83,0x0a,0x2a,0x01, 0x03,0x0b,0x2a,0x02,0x0a,0x28,0x02,0x09,0x29,0x01,0x85,0x0a,0x28,0x01,0x04, 0x09,0x28,0x01,0x0a,0x27,0x01,0x09,0x26,0x01,0x09,0x27,0x01,0x82,0x0a,0x26, 0x01,0x82,0x09,0x26,0x01,0x01,0x0a,0x26,0x01,0x83,0x09,0x25,0x01,0x83,0x08, 0x25,0x01,0x82,0x09,0x24,0x01,0x02,0x08,0x24,0x01,0x08,0x24,0x00,0x82,0x08, 0x23,0x01,0x01,0x09,0x23,0x01,0x82,0x08,0x23,0x01,0x02,0x08,0x22,0x01,0x08, 0x23,0x01,0x82,0x08,0x21,0x00,0x83,0x08,0x21,0x01,0x04,0x07,0x21,0x01,0x08, 0x21,0x01,0x08,0x20,0x01,0x08,0x20,0x00,0x82,0x08,0x20,0x01,0x03,0x07,0x1f, 0x00,0x07,0x20,0x00,0x07,0x1f,0x00,0x84,0x07,0x1f,0x01,0x82,0x07,0x1e,0x00, 0x82,0x07,0x1e,0x01,0x02,0x07,0x1d,0x00,0x07,0x1e,0x01,0x82,0x07,0x1d,0x00, 0x83,0x07,0x1d,0x01,0x82,0x07,0x1d,0x00,0x01,0x07,0x1c,0x01,0x83,0x07,0x1c, 0x00,0x01,0x06,0x1c,0x01,0x83,0x06,0x1b,0x00,0x88,0x06,0x1a,0x00,0x01,0x06, 0x19,0x00,0x82,0x05,0x19,0x00,0x82,0x05,0x18,0x00,0x02,0x06,0x18,0x00,0x05, 0x19,0x00,0x83,0x05,0x18,0x00,0x82,0x05,0x17,0x00,0x02,0x05,0x16,0x00,0x05, 0x17,0x00,0x85,0x05,0x16,0x00,0x01,0x04,0x16,0x00,0x82,0x05,0x16,0x00,0x83, 0x04,0x15,0x00,0x01,0x05,0x15,0x00,0x86,0x04,0x15,0x00,0x84,0x04,0x14,0x00, 0x82,0x04,0x13,0x00,0x83,0x03,0x13,0x00,0x02,0x03,0x12,0x00,0x03,0x13,0x00, 0x84,0x03,0x12,0x00,0x89,0x03,0x11,0x00,0x82,0x03,0x10,0x00,0x01,0x03,0x11, 0x00,0x84,0x03,0x10,0x00,0x82,0x04,0x10,0x00,0x88,0x03,0x0f,0x00,0x0a,0x03, 0x0e,0x00,0x03,0x0f,0x00,0x04,0x0f,0x00,0x05,0x11,0x00,0x05,0x12,0x00,0x07, 0x13,0x01,0x07,0x13,0x03,0x08,0x12,0x03,0x08,0x12,0x04,0x08,0x12,0x03,0x85, 0x07,0x11,0x03,0x82,0x07,0x10,0x03,0x83,0x07,0x0f,0x03,0x83,0x06,0x0f,0x03, 0x84,0x06,0x0e,0x03,0x82,0x05,0x0d,0x02,0x82,0x05,0x0c,0x02,0x01,0x05,0x0c, 0x03,0x82,0x05,0x0c,0x02,0x83,0x05,0x0b,0x02,0x82,0x04,0x0a,0x02,0x02,0x04, 0x0a,0x01,0x04,0x09,0x01,0x84,0x03,0x08,0x01,0x83,0x03,0x07,0x01,0x82,0x02, 0x07,0x01,0x82,0x02,0x06,0x01,0x01,0x02,0x05,0x01,0x82,0x01,0x05,0x01,0x82, 0x01,0x05,0x00,0x82,0x01,0x04,0x00,0x85,0x01,0x03,0x00,0x82,0x00,0x02,0x00, 0x85,0x00,0x01,0x00,0xdd,0x00,0x00,0x00,0x83,0x43,0x89,0x17,0x02,0x43,0x87, 0x16,0x44,0x89,0x17,0x85,0x43,0x89,0x17,0x05,0x43,0x87,0x17,0x42,0x87,0x15, 0x43,0x89,0x17,0x43,0x89,0x16,0x41,0x87,0x15,0x82,0x43,0x87,0x16,0x83,0x42, 0x88,0x16,0x01,0x41,0x87,0x15,0x82,0x42,0x88,0x16,0x01,0x42,0x87,0x17,0x82, 0x41,0x87,0x15,0x82,0x42,0x87,0x15,0x85,0x41,0x87,0x15,0x82,0x41,0x86,0x15, 0x82,0x41,0x87,0x15,0x82,0x41,0x86,0x15,0x04,0x40,0x86,0x15,0x41,0x86,0x16, 0x40,0x85,0x15,0x40,0x84,0x16,0x83,0x41,0x86,0x15,0x04,0x40,0x85,0x15,0x40, 0x84,0x16,0x41,0x86,0x15,0x40,0x84,0x16,0x82,0x40,0x86,0x17,0x09,0x3f,0x85, 0x16,0x41,0x85,0x17,0x42,0x84,0x17,0x41,0x83,0x16,0x40,0x84,0x17,0x41,0x85, 0x17,0x40,0x84,0x18,0x3f,0x84,0x16,0x40,0x84,0x18,0x82,0x40,0x84,0x19,0x06, 0x41,0x84,0x1a,0x41,0x85,0x17,0x41,0x85,0x19,0x40,0x84,0x19,0x40,0x84,0x1b, 0x41,0x84,0x1b,0x82,0x40,0x84,0x1b,0x03,0x41,0x84,0x19,0x40,0x84,0x1b,0x3f, 0x82,0x1c,0x82,0x41,0x83,0x1b,0x01,0x40,0x83,0x1d,0x84,0x41,0x84,0x1c,0x0c, 0x40,0x83,0x1d,0x3f,0x82,0x1c,0x41,0x82,0x1c,0x41,0x82,0x1d,0x42,0x83,0x1d, 0x42,0x83,0x1e,0x41,0x84,0x1e,0x41,0x82,0x1d,0x41,0x82,0x1e,0x42,0x83,0x1e, 0x41,0x82,0x1f,0x41,0x82,0x1e,0x83,0x41,0x81,0x1f,0x07,0x41,0x82,0x20,0x41, 0x82,0x1f,0x42,0x83,0x20,0x41,0x82,0x1f,0x41,0x82,0x1e,0x41,0x81,0x1f,0x42, 0x82,0x20,0x83,0x41,0x81,0x1f,0x02,0x41,0x80,0x1e,0x41,0x80,0x20,0x82,0x41, 0x81,0x20,0x06,0x41,0x82,0x21,0x43,0x82,0x22,0x42,0x81,0x21,0x41,0x82,0x21, 0x41,0x81,0x20,0x40,0x80,0x20,0x82,0x41,0x81,0x20,0x82,0x41,0x82,0x21,0x01, 0x3f,0x81,0x20,0x82,0x41,0x80,0x20,0x01,0x42,0x81,0x21,0x82,0x41,0x82,0x21, 0x82,0x41,0x80,0x20,0x01,0x41,0x81,0x1f,0x84,0x41,0x81,0x20,0x83,0x40,0x80, 0x20,0x06,0x3f,0x80,0x20,0x3f,0x80,0x1f,0x41,0x80,0x20,0x40,0x80,0x21,0x3f, 0x80,0x20,0x41,0x81,0x20,0x82,0x3f,0x80,0x1f,0x02,0x40,0x80,0x20,0x3f,0x80, 0x1f,0x82,0x3f,0x7f,0x20,0x01,0x40,0x80,0x21,0x82,0x3f,0x7f,0x1e,0x02,0x3f, 0x80,0x1f,0x41,0x80,0x21,0x82,0x3f,0x7e,0x1f,0x01,0x3e,0x7d,0x1e,0x82,0x3f, 0x7e,0x20,0x06,0x3e,0x7d,0x1e,0x3f,0x7e,0x1f,0x3f,0x7f,0x20,0x3e,0x7d,0x1e, 0x3d,0x7c,0x1d,0x3d,0x7d,0x1e,0x83,0x3e,0x7d,0x1e,0x06,0x3d,0x7d,0x1e,0x3e, 0x7d,0x1e,0x3c,0x7d,0x1d,0x3d,0x7c,0x1d,0x3d,0x7d,0x1e,0x3d,0x7c,0x1d,0x83, 0x3d,0x7c,0x1e,0x01,0x3c,0x7b,0x1e,0x82,0x3d,0x7c,0x1e,0x82,0x3c,0x7b,0x1e, 0x03,0x3b,0x7a,0x1d,0x3b,0x7a,0x1e,0x3b,0x79,0x1d,0x85,0x3b,0x79,0x1e,0x04, 0x3a,0x79,0x1d,0x3a,0x78,0x1d,0x3b,0x78,0x1e,0x3b,0x79,0x1d,0x82,0x3b,0x78, 0x1d,0x0b,0x3b,0x78,0x1e,0x3a,0x79,0x1d,0x39,0x77,0x1d,0x38,0x76,0x1b,0x37, 0x75,0x1b,0x39,0x77,0x1d,0x38,0x77,0x1c,0x39,0x75,0x1b,0x38,0x76,0x1b,0x37, 0x75,0x1b,0x38,0x76,0x1b,0x82,0x37,0x75,0x1b,0x02,0x35,0x74,0x19,0x34,0x73, 0x18,0x82,0x36,0x75,0x1a,0x82,0x36,0x74,0x19,0x02,0x35,0x74,0x19,0x34,0x73, 0x19,0x82,0x36,0x72,0x19,0x01,0x34,0x70,0x17,0x82,0x34,0x71,0x18,0x13,0x33, 0x70,0x17,0x32,0x71,0x17,0x31,0x70,0x15,0x34,0x72,0x17,0x36,0x73,0x1a,0x35, 0x72,0x19,0x31,0x6e,0x15,0x2b,0x67,0x12,0x24,0x60,0x0c,0x20,0x5b,0x0a,0x1d, 0x58,0x0a,0x1e,0x59,0x09,0x20,0x5c,0x0a,0x20,0x5a,0x0b,0x1e,0x59,0x09,0x1e, 0x5a,0x09,0x1e,0x5a,0x0a,0x1e,0x5a,0x08,0x1d,0x58,0x08,0x82,0x1e,0x59,0x09, 0x09,0x1e,0x58,0x07,0x1e,0x58,0x08,0x1e,0x58,0x09,0x1e,0x58,0x0a,0x1e,0x59, 0x09,0x1d,0x58,0x07,0x1d,0x57,0x07,0x1e,0x58,0x09,0x1d,0x57,0x07,0x84,0x1c, 0x56,0x07,0x01,0x1c,0x55,0x08,0x83,0x1b,0x55,0x06,0x05,0x1b,0x55,0x05,0x1b, 0x54,0x07,0x1b,0x55,0x05,0x1b,0x57,0x07,0x1a,0x55,0x05,0x83,0x1a,0x54,0x05, 0x01,0x19,0x53,0x04,0x83,0x18,0x53,0x03,0x0c,0x19,0x53,0x04,0x19,0x53,0x05, 0x1a,0x54,0x05,0x19,0x54,0x04,0x19,0x55,0x05,0x1a,0x54,0x05,0x19,0x53,0x03, 0x19,0x53,0x04,0x19,0x55,0x05,0x19,0x54,0x04,0x18,0x53,0x03,0x1a,0x54,0x05, 0x82,0x19,0x53,0x04,0x01,0x18,0x53,0x03,0x83,0x19,0x55,0x05,0x02,0x19,0x54, 0x04,0x19,0x55,0x05,0x83,0x19,0x53,0x04,0x04,0x1a,0x54,0x05,0x19,0x54,0x06, 0x19,0x55,0x05,0x1a,0x54,0x05,0x82,0x19,0x53,0x05,0x02,0x1a,0x53,0x06,0x19, 0x53,0x05,0x82,0x19,0x52,0x05,0x82,0x19,0x51,0x05,0x01,0x18,0x51,0x04,0x82, 0x18,0x51,0x05,0x04,0x18,0x50,0x04,0x18,0x4f,0x04,0x18,0x50,0x05,0x17,0x4f, 0x04,0x82,0x17,0x4e,0x03,0x05,0x17,0x4f,0x04,0x17,0x4e,0x04,0x18,0x4e,0x04, 0x19,0x4f,0x05,0x17,0x4d,0x03,0x83,0x17,0x4d,0x05,0x82,0x17,0x4c,0x05,0x14, 0x16,0x4c,0x05,0x16,0x4d,0x05,0x15,0x4c,0x05,0x17,0x4b,0x05,0x16,0x4b,0x05, 0x16,0x4a,0x04,0x17,0x4a,0x04,0x15,0x4a,0x03,0x14,0x48,0x03,0x15,0x48,0x03, 0x17,0x49,0x04,0x16,0x49,0x06,0x15,0x48,0x05,0x15,0x49,0x05,0x16,0x48,0x05, 0x14,0x48,0x03,0x15,0x48,0x05,0x15,0x47,0x05,0x14,0x47,0x03,0x16,0x47,0x04, 0x82,0x15,0x46,0x04,0x82,0x15,0x46,0x05,0x0c,0x14,0x46,0x05,0x14,0x46,0x04, 0x15,0x45,0x03,0x15,0x44,0x03,0x15,0x44,0x05,0x14,0x44,0x03,0x13,0x44,0x03, 0x14,0x44,0x05,0x13,0x43,0x03,0x12,0x44,0x03,0x13,0x44,0x05,0x13,0x43,0x04, 0x82,0x12,0x43,0x03,0x0b,0x13,0x44,0x03,0x13,0x43,0x04,0x13,0x41,0x03,0x13, 0x42,0x04,0x12,0x41,0x03,0x12,0x41,0x02,0x12,0x42,0x04,0x12,0x41,0x02,0x12, 0x41,0x03,0x12,0x40,0x03,0x12,0x3f,0x03,0x82,0x13,0x3f,0x04,0x02,0x12,0x3e, 0x02,0x12,0x3e,0x03,0x82,0x11,0x3e,0x02,0x0f,0x12,0x3f,0x03,0x11,0x3e,0x03, 0x11,0x3d,0x03,0x10,0x3d,0x03,0x10,0x3e,0x03,0x10,0x3d,0x03,0x11,0x3d,0x03, 0x12,0x3c,0x03,0x10,0x3d,0x04,0x10,0x3c,0x03,0x11,0x3b,0x03,0x10,0x3b,0x02, 0x10,0x3a,0x02,0x11,0x3b,0x03,0x10,0x3b,0x03,0x82,0x10,0x3a,0x03,0x04,0x0f, 0x3a,0x03,0x11,0x3a,0x03,0x10,0x3a,0x02,0x0f,0x39,0x02,0x82,0x10,0x3a,0x03, 0x08,0x0f,0x39,0x03,0x0e,0x38,0x02,0x0f,0x39,0x03,0x0f,0x38,0x03,0x0e,0x38, 0x01,0x10,0x38,0x02,0x10,0x38,0x03,0x10,0x37,0x03,0x83,0x0e,0x37,0x03,0x02, 0x0e,0x36,0x03,0x0e,0x35,0x01,0x82,0x0e,0x35,0x02,0x03,0x0e,0x36,0x03,0x0e, 0x35,0x02,0x0d,0x34,0x01,0x82,0x0e,0x34,0x01,0x05,0x0e,0x35,0x02,0x0d,0x34, 0x01,0x0e,0x34,0x02,0x0e,0x33,0x02,0x0e,0x32,0x02,0x82,0x0d,0x32,0x02,0x06, 0x0c,0x32,0x01,0x0c,0x31,0x01,0x0d,0x31,0x01,0x0e,0x32,0x02,0x0c,0x31,0x01, 0x0c,0x30,0x01,0x82,0x0d,0x30,0x01,0x82,0x0c,0x30,0x01,0x05,0x0c,0x2f,0x01, 0x0c,0x2f,0x00,0x0c,0x2f,0x01,0x0b,0x2d,0x01,0x0b,0x2e,0x00,0x82,0x0c,0x2f, 0x02,0x05,0x0b,0x2e,0x00,0x0b,0x2d,0x00,0x0c,0x2e,0x01,0x0b,0x2e,0x02,0x0b, 0x2d,0x01,0x84,0x0c,0x2d,0x01,0x0d,0x0b,0x2d,0x01,0x0b,0x2c,0x01,0x0c,0x2d, 0x01,0x0a,0x2c,0x01,0x0b,0x2c,0x02,0x0b,0x2b,0x01,0x0a,0x2b,0x01,0x0b,0x2b, 0x01,0x0b,0x2a,0x01,0x0a,0x2a,0x01,0x0b,0x2a,0x01,0x0a,0x2b,0x01,0x0a,0x2a, 0x01,0x82,0x0a,0x29,0x01,0x03,0x0b,0x29,0x02,0x09,0x29,0x01,0x0b,0x28,0x01, 0x82,0x0a,0x28,0x01,0x03,0x0a,0x27,0x00,0x0a,0x29,0x01,0x09,0x29,0x01,0x83, 0x0a,0x27,0x01,0x01,0x09,0x27,0x01,0x82,0x0a,0x27,0x01,0x83,0x0a,0x26,0x01, 0x02,0x09,0x26,0x01,0x0a,0x26,0x01,0x83,0x09,0x25,0x01,0x02,0x09,0x24,0x01, 0x09,0x25,0x01,0x84,0x09,0x24,0x01,0x83,0x09,0x23,0x01,0x82,0x08,0x22,0x00, 0x02,0x09,0x22,0x00,0x09,0x22,0x01,0x82,0x08,0x22,0x01,0x03,0x07,0x21,0x00, 0x07,0x21,0x01,0x08,0x21,0x01,0x82,0x08,0x20,0x00,0x82,0x08,0x20,0x01,0x03, 0x07,0x20,0x00,0x08,0x20,0x00,0x08,0x20,0x01,0x82,0x07,0x20,0x01,0x01,0x07, 0x1f,0x00,0x82,0x07,0x1e,0x00,0x02,0x07,0x1e,0x01,0x07,0x1e,0x00,0x82,0x07, 0x1e,0x01,0x82,0x07,0x1e,0x00,0x01,0x07,0x1d,0x00,0x82,0x07,0x1d,0x01,0x02, 0x07,0x1e,0x01,0x07,0x1d,0x00,0x83,0x07,0x1d,0x01,0x01,0x07,0x1c,0x00,0x88, 0x06,0x1b,0x00,0x82,0x06,0x1a,0x00,0x82,0x05,0x1a,0x00,0x82,0x06,0x19,0x00, 0x85,0x05,0x19,0x00,0x04,0x06,0x19,0x00,0x05,0x18,0x00,0x05,0x19,0x00,0x05, 0x18,0x00,0x87,0x05,0x17,0x00,0x82,0x04,0x17,0x00,0x82,0x05,0x16,0x00,0x02, 0x05,0x15,0x00,0x05,0x16,0x00,0x82,0x04,0x15,0x00,0x82,0x05,0x15,0x00,0x01, 0x04,0x14,0x00,0x84,0x04,0x15,0x00,0x01,0x05,0x15,0x00,0x82,0x04,0x14,0x00, 0x83,0x04,0x13,0x00,0x01,0x03,0x13,0x00,0x82,0x04,0x13,0x00,0x89,0x03,0x12, 0x00,0x85,0x03,0x11,0x00,0x8e,0x03,0x10,0x00,0x84,0x03,0x0f,0x00,0x84,0x03, 0x0e,0x00,0x82,0x04,0x10,0x00,0x82,0x05,0x12,0x01,0x02,0x07,0x12,0x02,0x07, 0x12,0x03,0x82,0x08,0x12,0x03,0x02,0x07,0x12,0x03,0x07,0x11,0x03,0x86,0x07, 0x10,0x03,0x03,0x06,0x10,0x03,0x06,0x0f,0x03,0x07,0x0f,0x03,0x85,0x06,0x0e, 0x03,0x82,0x05,0x0d,0x03,0x84,0x05,0x0c,0x02,0x83,0x05,0x0b,0x02,0x01,0x05, 0x0a,0x02,0x83,0x04,0x0a,0x02,0x01,0x04,0x09,0x01,0x82,0x03,0x09,0x01,0x01, 0x03,0x08,0x01,0x82,0x03,0x07,0x01,0x83,0x02,0x07,0x01,0x82,0x02,0x06,0x01, 0x01,0x02,0x05,0x01,0x83,0x01,0x05,0x01,0x01,0x01,0x05,0x00,0x83,0x01,0x04, 0x00,0x84,0x01,0x03,0x00,0x83,0x00,0x02,0x00,0x85,0x00,0x01,0x00,0xdc,0x00, 0x00,0x00,0x02,0x44,0x8b,0x18,0x43,0x8b,0x18,0x82,0x43,0x8a,0x17,0x04,0x45, 0x8a,0x18,0x43,0x8a,0x16,0x43,0x8a,0x15,0x44,0x8a,0x16,0x82,0x43,0x8a,0x16, 0x82,0x43,0x89,0x16,0x82,0x43,0x8a,0x16,0x04,0x42,0x89,0x16,0x43,0x89,0x16, 0x44,0x8a,0x17,0x42,0x89,0x16,0x82,0x42,0x88,0x17,0x02,0x41,0x88,0x14,0x41, 0x88,0x15,0x82,0x43,0x88,0x17,0x04,0x43,0x8a,0x17,0x42,0x89,0x16,0x43,0x88, 0x16,0x42,0x89,0x16,0x83,0x41,0x88,0x14,0x02,0x42,0x88,0x15,0x41,0x88,0x14, 0x82,0x41,0x87,0x16,0x03,0x42,0x88,0x17,0x41,0x88,0x15,0x41,0x87,0x14,0x83, 0x41,0x87,0x16,0x02,0x41,0x86,0x16,0x41,0x86,0x17,0x82,0x41,0x86,0x16,0x06, 0x41,0x86,0x15,0x41,0x86,0x16,0x40,0x85,0x16,0x41,0x87,0x16,0x41,0x86,0x17, 0x41,0x87,0x18,0x82,0x40,0x86,0x16,0x82,0x41,0x86,0x17,0x06,0x41,0x84,0x16, 0x3f,0x86,0x16,0x41,0x86,0x17,0x41,0x86,0x18,0x41,0x86,0x17,0x40,0x85,0x18, 0x82,0x40,0x84,0x19,0x03,0x41,0x84,0x19,0x40,0x84,0x19,0x3f,0x84,0x18,0x82, 0x40,0x84,0x19,0x0c,0x41,0x85,0x1a,0x41,0x85,0x1b,0x40,0x84,0x1a,0x41,0x84, 0x1a,0x41,0x86,0x1c,0x40,0x84,0x1a,0x42,0x84,0x1b,0x43,0x84,0x1d,0x40,0x84, 0x1b,0x41,0x85,0x1b,0x41,0x84,0x1d,0x42,0x84,0x1b,0x83,0x41,0x85,0x1d,0x01, 0x41,0x84,0x1d,0x82,0x42,0x84,0x1d,0x82,0x40,0x84,0x1d,0x11,0x42,0x84,0x1e, 0x41,0x83,0x1d,0x42,0x84,0x1e,0x42,0x84,0x1f,0x41,0x83,0x1f,0x42,0x84,0x1f, 0x41,0x83,0x1f,0x41,0x82,0x1e,0x43,0x83,0x20,0x41,0x82,0x1f,0x43,0x84,0x20, 0x41,0x85,0x20,0x42,0x84,0x1f,0x41,0x82,0x1f,0x42,0x82,0x21,0x41,0x80,0x1f, 0x41,0x82,0x1f,0x82,0x42,0x82,0x1f,0x02,0x42,0x82,0x21,0x41,0x82,0x21,0x82, 0x41,0x82,0x20,0x01,0x41,0x81,0x20,0x82,0x41,0x82,0x20,0x02,0x41,0x82,0x21, 0x40,0x81,0x21,0x82,0x41,0x82,0x20,0x82,0x41,0x82,0x21,0x08,0x3f,0x82,0x20, 0x41,0x82,0x21,0x41,0x81,0x20,0x41,0x82,0x21,0x41,0x82,0x20,0x40,0x81,0x1f, 0x41,0x80,0x1f,0x41,0x81,0x20,0x82,0x41,0x82,0x21,0x02,0x41,0x82,0x20,0x40, 0x81,0x1f,0x82,0x41,0x82,0x20,0x0a,0x40,0x81,0x1f,0x41,0x82,0x20,0x40,0x81, 0x21,0x41,0x81,0x20,0x41,0x80,0x1f,0x40,0x80,0x1f,0x40,0x81,0x21,0x41,0x82, 0x21,0x40,0x81,0x1f,0x3f,0x7f,0x1f,0x84,0x3f,0x80,0x20,0x07,0x40,0x81,0x21, 0x3f,0x80,0x20,0x3f,0x80,0x1f,0x3f,0x80,0x20,0x3f,0x7e,0x1f,0x3f,0x7f,0x1f, 0x40,0x80,0x20,0x83,0x3f,0x7e,0x1f,0x06,0x3f,0x7f,0x1f,0x3f,0x7e,0x1f,0x3f, 0x80,0x20,0x3e,0x7f,0x1f,0x3d,0x7e,0x1e,0x3f,0x7e,0x1f,0x82,0x3f,0x7f,0x1f, 0x03,0x3f,0x7e,0x1f,0x3f,0x7d,0x1d,0x3f,0x7e,0x1f,0x82,0x3e,0x7e,0x1e,0x0d, 0x3f,0x7e,0x1f,0x3d,0x7d,0x1f,0x3e,0x7e,0x1f,0x3d,0x7d,0x1e,0x3d,0x7d,0x1f, 0x3d,0x7d,0x1e,0x3d,0x7d,0x1f,0x3d,0x7d,0x1e,0x3d,0x7d,0x1f,0x3d,0x7d,0x1e, 0x3b,0x7b,0x1d,0x3d,0x7d,0x1e,0x3b,0x7b,0x1d,0x82,0x3b,0x7b,0x1e,0x01,0x3c, 0x7b,0x1f,0x83,0x3b,0x7a,0x1d,0x02,0x39,0x79,0x1c,0x39,0x79,0x1d,0x82,0x39, 0x79,0x1c,0x02,0x3b,0x79,0x1c,0x39,0x79,0x1d,0x82,0x39,0x79,0x1c,0x01,0x3a, 0x79,0x1d,0x82,0x39,0x79,0x1d,0x01,0x39,0x78,0x1c,0x82,0x3a,0x77,0x1c,0x06, 0x39,0x78,0x1c,0x38,0x78,0x1c,0x38,0x77,0x1b,0x38,0x75,0x1a,0x37,0x76,0x1a, 0x36,0x75,0x1a,0x82,0x37,0x76,0x1a,0x04,0x35,0x74,0x18,0x36,0x75,0x19,0x36, 0x75,0x1a,0x35,0x74,0x1a,0x82,0x37,0x74,0x1a,0x0a,0x34,0x73,0x19,0x36,0x73, 0x19,0x36,0x73,0x1a,0x36,0x73,0x19,0x34,0x73,0x19,0x32,0x71,0x16,0x34,0x73, 0x19,0x33,0x72,0x18,0x32,0x71,0x15,0x34,0x73,0x16,0x82,0x35,0x74,0x18,0x05, 0x31,0x70,0x14,0x2b,0x6a,0x0e,0x21,0x5d,0x0c,0x1d,0x59,0x08,0x1e,0x5a,0x09, 0x82,0x1f,0x5b,0x0a,0x83,0x1f,0x5b,0x09,0x02,0x1e,0x5a,0x09,0x1f,0x5b,0x09, 0x82,0x1d,0x58,0x07,0x07,0x20,0x5b,0x09,0x1f,0x59,0x09,0x1d,0x59,0x08,0x1f, 0x5b,0x0a,0x1d,0x58,0x08,0x1e,0x59,0x09,0x1d,0x57,0x07,0x82,0x1c,0x57,0x07, 0x07,0x1c,0x56,0x06,0x1c,0x55,0x07,0x1c,0x56,0x08,0x1a,0x54,0x06,0x1c,0x56, 0x08,0x1d,0x57,0x07,0x1b,0x55,0x05,0x82,0x1b,0x55,0x07,0x82,0x1b,0x57,0x06, 0x83,0x1b,0x55,0x05,0x02,0x1a,0x55,0x05,0x19,0x54,0x05,0x82,0x1a,0x55,0x05, 0x03,0x1a,0x54,0x04,0x19,0x54,0x03,0x1a,0x55,0x05,0x82,0x19,0x55,0x04,0x01, 0x1a,0x55,0x05,0x84,0x19,0x55,0x04,0x04,0x18,0x54,0x03,0x1a,0x55,0x05,0x1a, 0x56,0x05,0x1a,0x55,0x05,0x83,0x19,0x55,0x04,0x02,0x1a,0x55,0x05,0x1a,0x54, 0x04,0x82,0x1a,0x54,0x05,0x83,0x1a,0x54,0x04,0x82,0x1a,0x54,0x05,0x06,0x1a, 0x55,0x06,0x1a,0x54,0x05,0x1a,0x55,0x06,0x1a,0x55,0x07,0x19,0x53,0x05,0x18, 0x54,0x05,0x84,0x18,0x52,0x04,0x82,0x18,0x52,0x05,0x01,0x19,0x52,0x06,0x82, 0x18,0x50,0x05,0x02,0x18,0x50,0x04,0x17,0x4f,0x03,0x82,0x18,0x50,0x05,0x07, 0x18,0x4f,0x05,0x16,0x4e,0x04,0x18,0x4f,0x04,0x17,0x4e,0x03,0x18,0x4d,0x05, 0x17,0x4d,0x05,0x16,0x4e,0x05,0x82,0x16,0x4c,0x04,0x06,0x16,0x4e,0x05,0x16, 0x4c,0x05,0x16,0x4b,0x04,0x17,0x4d,0x05,0x16,0x4a,0x04,0x17,0x4a,0x03,0x83, 0x16,0x4a,0x04,0x05,0x16,0x49,0x03,0x14,0x48,0x03,0x16,0x4a,0x05,0x16,0x49, 0x05,0x15,0x4a,0x05,0x82,0x15,0x49,0x04,0x02,0x15,0x49,0x05,0x16,0x48,0x05, 0x82,0x14,0x48,0x03,0x02,0x14,0x47,0x03,0x16,0x47,0x04,0x82,0x15,0x47,0x04, 0x82,0x16,0x46,0x03,0x12,0x14,0x45,0x03,0x16,0x46,0x04,0x15,0x45,0x03,0x14, 0x46,0x03,0x15,0x46,0x04,0x13,0x44,0x03,0x13,0x43,0x02,0x14,0x45,0x03,0x12, 0x44,0x03,0x13,0x43,0x03,0x14,0x44,0x03,0x14,0x43,0x03,0x14,0x43,0x04,0x13, 0x43,0x03,0x13,0x43,0x04,0x14,0x43,0x05,0x12,0x41,0x03,0x14,0x41,0x03,0x84, 0x12,0x41,0x03,0x06,0x12,0x40,0x03,0x12,0x41,0x03,0x13,0x3f,0x03,0x12,0x3f, 0x02,0x12,0x3e,0x02,0x11,0x3f,0x02,0x82,0x12,0x3f,0x03,0x01,0x11,0x3e,0x02, 0x82,0x11,0x3e,0x04,0x04,0x10,0x3e,0x04,0x11,0x3f,0x03,0x12,0x3d,0x02,0x12, 0x3c,0x02,0x82,0x11,0x3d,0x04,0x05,0x11,0x3d,0x03,0x10,0x3c,0x02,0x12,0x3c, 0x04,0x11,0x3b,0x03,0x0e,0x3a,0x01,0x82,0x10,0x3b,0x03,0x06,0x0f,0x3a,0x01, 0x11,0x3b,0x03,0x10,0x3b,0x02,0x0f,0x3a,0x03,0x10,0x3a,0x03,0x0e,0x39,0x03, 0x82,0x0f,0x39,0x03,0x02,0x10,0x39,0x03,0x0f,0x39,0x03,0x82,0x0f,0x38,0x01, 0x06,0x10,0x38,0x01,0x0f,0x36,0x01,0x0f,0x37,0x02,0x0e,0x36,0x01,0x0e,0x37, 0x02,0x0e,0x37,0x03,0x82,0x0f,0x36,0x02,0x07,0x0d,0x36,0x02,0x0e,0x36,0x02, 0x0d,0x35,0x01,0x0e,0x36,0x02,0x0e,0x35,0x02,0x0e,0x34,0x01,0x0d,0x34,0x02, 0x83,0x0e,0x34,0x02,0x0a,0x0d,0x33,0x01,0x0e,0x33,0x02,0x0e,0x34,0x02,0x0d, 0x33,0x01,0x0e,0x34,0x02,0x0e,0x33,0x02,0x0e,0x32,0x02,0x0c,0x32,0x01,0x0d, 0x32,0x01,0x0c,0x30,0x00,0x83,0x0d,0x31,0x01,0x10,0x0d,0x30,0x02,0x0d,0x30, 0x00,0x0c,0x30,0x01,0x0c,0x2f,0x01,0x0c,0x2e,0x00,0x0c,0x2f,0x01,0x0c,0x2e, 0x01,0x0c,0x2e,0x00,0x0d,0x2f,0x01,0x0d,0x2e,0x01,0x0d,0x2e,0x02,0x0c,0x2d, 0x01,0x0c,0x2e,0x02,0x0c,0x2e,0x01,0x0c,0x2d,0x01,0x0c,0x2d,0x02,0x82,0x0b, 0x2c,0x01,0x0f,0x0c,0x2d,0x01,0x0b,0x2c,0x01,0x0c,0x2c,0x02,0x0b,0x2c,0x01, 0x0b,0x2a,0x01,0x0b,0x2b,0x01,0x0b,0x2b,0x00,0x0b,0x2a,0x01,0x0b,0x2b,0x02, 0x0c,0x2c,0x01,0x0b,0x2b,0x01,0x0a,0x2a,0x01,0x09,0x29,0x01,0x0b,0x2a,0x00, 0x0b,0x2a,0x01,0x85,0x0b,0x29,0x01,0x06,0x09,0x29,0x01,0x0a,0x27,0x01,0x09, 0x27,0x01,0x0a,0x27,0x01,0x0a,0x28,0x01,0x0a,0x27,0x01,0x82,0x09,0x27,0x01, 0x03,0x0a,0x27,0x01,0x0b,0x27,0x01,0x0a,0x27,0x01,0x82,0x09,0x26,0x01,0x82, 0x09,0x25,0x01,0x01,0x0a,0x25,0x01,0x82,0x09,0x25,0x01,0x02,0x09,0x24,0x00, 0x09,0x25,0x01,0x82,0x09,0x24,0x01,0x01,0x08,0x24,0x01,0x82,0x08,0x23,0x00, 0x01,0x09,0x23,0x00,0x83,0x09,0x23,0x01,0x01,0x08,0x22,0x00,0x82,0x08,0x22, 0x01,0x03,0x08,0x21,0x01,0x08,0x21,0x00,0x07,0x21,0x00,0x82,0x08,0x21,0x01, 0x82,0x07,0x21,0x00,0x83,0x07,0x20,0x01,0x84,0x07,0x1f,0x01,0x01,0x07,0x1f, 0x00,0x82,0x07,0x1f,0x01,0x82,0x07,0x1e,0x00,0x82,0x07,0x1e,0x01,0x84,0x07, 0x1d,0x01,0x01,0x07,0x1d,0x00,0x82,0x07,0x1d,0x01,0x08,0x07,0x1c,0x01,0x06, 0x1c,0x00,0x06,0x1c,0x01,0x06,0x1c,0x00,0x06,0x1b,0x00,0x07,0x1c,0x00,0x07, 0x1c,0x01,0x06,0x1c,0x00,0x82,0x05,0x1a,0x00,0x02,0x06,0x1a,0x00,0x07,0x1a, 0x01,0x82,0x06,0x1a,0x00,0x82,0x05,0x1a,0x00,0x82,0x05,0x19,0x00,0x04,0x06, 0x19,0x00,0x05,0x19,0x00,0x05,0x18,0x00,0x05,0x19,0x00,0x85,0x05,0x18,0x00, 0x85,0x05,0x17,0x00,0x86,0x05,0x16,0x00,0x03,0x04,0x16,0x00,0x05,0x15,0x00, 0x04,0x15,0x00,0x82,0x05,0x15,0x00,0x88,0x04,0x14,0x00,0x82,0x03,0x13,0x00, 0x01,0x04,0x13,0x00,0x87,0x03,0x12,0x00,0x02,0x03,0x11,0x00,0x03,0x12,0x00, 0x84,0x03,0x11,0x00,0x8d,0x03,0x10,0x00,0x02,0x03,0x0f,0x00,0x03,0x10,0x00, 0x83,0x03,0x0f,0x00,0x87,0x03,0x0e,0x00,0x05,0x03,0x0f,0x00,0x04,0x10,0x00, 0x05,0x11,0x00,0x05,0x11,0x01,0x07,0x12,0x02,0x83,0x07,0x12,0x03,0x01,0x07, 0x11,0x03,0x85,0x07,0x10,0x03,0x83,0x07,0x0f,0x03,0x01,0x07,0x0e,0x03,0x84, 0x06,0x0e,0x03,0x01,0x05,0x0d,0x03,0x83,0x05,0x0d,0x02,0x82,0x05,0x0c,0x02, 0x84,0x05,0x0b,0x02,0x01,0x04,0x0b,0x01,0x83,0x04,0x0a,0x01,0x01,0x04,0x09, 0x01,0x82,0x03,0x09,0x01,0x82,0x03,0x08,0x01,0x01,0x03,0x07,0x01,0x82,0x02, 0x07,0x01,0x82,0x02,0x06,0x01,0x82,0x02,0x05,0x01,0x82,0x01,0x05,0x01,0x01, 0x01,0x05,0x00,0x83,0x01,0x04,0x00,0x84,0x01,0x03,0x00,0x01,0x01,0x02,0x00, 0x82,0x00,0x02,0x00,0x84,0x00,0x01,0x00,0xdd,0x00,0x00,0x00,0x03,0x44,0x8c, 0x17,0x43,0x8c,0x17,0x44,0x8c,0x17,0x82,0x45,0x8b,0x17,0x82,0x43,0x8b,0x17, 0x05,0x44,0x8a,0x17,0x45,0x8c,0x18,0x42,0x8a,0x15,0x43,0x8b,0x17,0x44,0x8c, 0x17,0x82,0x44,0x8a,0x17,0x06,0x43,0x8a,0x16,0x42,0x8a,0x15,0x43,0x8a,0x16, 0x42,0x8a,0x15,0x42,0x89,0x17,0x43,0x8a,0x17,0x82,0x43,0x89,0x15,0x09,0x43, 0x8a,0x17,0x43,0x89,0x17,0x41,0x89,0x15,0x43,0x89,0x15,0x42,0x8a,0x16,0x41, 0x8a,0x15,0x43,0x89,0x17,0x42,0x88,0x16,0x41,0x88,0x15,0x82,0x42,0x88,0x16, 0x82,0x41,0x88,0x16,0x06,0x43,0x89,0x17,0x42,0x88,0x16,0x41,0x88,0x15,0x41, 0x88,0x16,0x42,0x88,0x16,0x41,0x87,0x15,0x82,0x42,0x88,0x17,0x82,0x41,0x86, 0x16,0x83,0x41,0x87,0x17,0x01,0x41,0x88,0x15,0x82,0x41,0x87,0x17,0x01,0x41, 0x86,0x16,0x82,0x41,0x87,0x17,0x03,0x41,0x86,0x17,0x41,0x88,0x17,0x42,0x89, 0x19,0x82,0x41,0x87,0x17,0x03,0x41,0x86,0x17,0x40,0x86,0x16,0x41,0x86,0x18, 0x82,0x41,0x86,0x19,0x03,0x42,0x86,0x19,0x40,0x85,0x19,0x41,0x86,0x19,0x84, 0x41,0x86,0x1a,0x01,0x43,0x86,0x1c,0x82,0x41,0x86,0x1a,0x07,0x42,0x85,0x1b, 0x43,0x86,0x1b,0x40,0x85,0x1a,0x40,0x84,0x1c,0x42,0x85,0x1b,0x42,0x84,0x1c, 0x41,0x85,0x1c,0x82,0x40,0x84,0x1c,0x01,0x41,0x85,0x1c,0x82,0x43,0x85,0x1d, 0x04,0x41,0x85,0x1e,0x40,0x84,0x1d,0x42,0x84,0x1e,0x41,0x84,0x1e,0x86,0x42, 0x84,0x1f,0x08,0x42,0x84,0x20,0x42,0x84,0x1f,0x43,0x85,0x20,0x41,0x86,0x20, 0x42,0x84,0x20,0x41,0x83,0x1f,0x43,0x83,0x21,0x42,0x82,0x20,0x82,0x41,0x83, 0x1f,0x02,0x42,0x83,0x1f,0x42,0x84,0x20,0x83,0x42,0x84,0x21,0x03,0x42,0x82, 0x20,0x41,0x83,0x20,0x41,0x82,0x20,0x82,0x41,0x83,0x20,0x82,0x41,0x82,0x20, 0x05,0x41,0x83,0x20,0x41,0x82,0x20,0x40,0x84,0x20,0x41,0x83,0x20,0x41,0x82, 0x20,0x82,0x41,0x83,0x20,0x01,0x42,0x82,0x20,0x83,0x41,0x82,0x20,0x82,0x41, 0x82,0x21,0x03,0x41,0x82,0x20,0x41,0x83,0x20,0x42,0x82,0x20,0x83,0x41,0x82, 0x21,0x01,0x41,0x83,0x20,0x82,0x3f,0x81,0x1e,0x03,0x40,0x82,0x1f,0x41,0x83, 0x20,0x42,0x82,0x20,0x82,0x41,0x81,0x20,0x01,0x40,0x80,0x20,0x82,0x3f,0x81, 0x20,0x01,0x3f,0x80,0x1f,0x82,0x40,0x82,0x20,0x84,0x40,0x80,0x20,0x06,0x41, 0x81,0x20,0x40,0x80,0x20,0x3f,0x7f,0x1e,0x3f,0x80,0x1f,0x3f,0x7f,0x1e,0x3e, 0x80,0x1e,0x83,0x3f,0x81,0x20,0x0d,0x3e,0x80,0x1e,0x3d,0x7e,0x1d,0x3e,0x7e, 0x1e,0x40,0x7e,0x20,0x3f,0x7f,0x1e,0x3d,0x7e,0x1d,0x3e,0x7e,0x1e,0x3f,0x7f, 0x1e,0x3e,0x7e,0x1f,0x3d,0x7e,0x1e,0x3c,0x7d,0x1d,0x3e,0x7e,0x1f,0x3d,0x7d, 0x20,0x82,0x3d,0x7d,0x1e,0x82,0x3d,0x7e,0x1e,0x04,0x3c,0x7d,0x1d,0x3d,0x7d, 0x1e,0x3d,0x7e,0x1e,0x3d,0x7d,0x1e,0x82,0x3b,0x7b,0x1e,0x0c,0x3a,0x7a,0x1c, 0x3b,0x7b,0x1e,0x3d,0x7d,0x1f,0x3b,0x7b,0x1d,0x3b,0x7b,0x1e,0x3b,0x7c,0x1e, 0x3b,0x7b,0x1d,0x3b,0x7b,0x1e,0x3a,0x7a,0x1d,0x39,0x79,0x1c,0x3a,0x7a,0x1c, 0x3b,0x7b,0x1e,0x83,0x39,0x79,0x1c,0x01,0x3a,0x78,0x1c,0x83,0x38,0x78,0x1b, 0x02,0x39,0x79,0x1c,0x3b,0x79,0x1c,0x82,0x39,0x79,0x1c,0x01,0x38,0x78,0x1b, 0x84,0x37,0x77,0x1a,0x01,0x37,0x75,0x1a,0x84,0x35,0x75,0x19,0x05,0x35,0x73, 0x19,0x36,0x74,0x19,0x33,0x73,0x18,0x34,0x74,0x19,0x35,0x75,0x18,0x82,0x34, 0x74,0x17,0x01,0x35,0x75,0x19,0x82,0x33,0x73,0x17,0x0e,0x36,0x76,0x19,0x37, 0x77,0x19,0x35,0x76,0x17,0x2f,0x6d,0x13,0x2a,0x67,0x10,0x22,0x5e,0x0c,0x1e, 0x5a,0x09,0x1d,0x5a,0x06,0x1e,0x5a,0x0a,0x20,0x5c,0x0b,0x20,0x5c,0x07,0x20, 0x5c,0x09,0x1f,0x5c,0x08,0x1e,0x5b,0x09,0x84,0x1e,0x5a,0x09,0x02,0x1e,0x5a, 0x08,0x1e,0x5a,0x09,0x83,0x1d,0x58,0x07,0x03,0x1c,0x58,0x07,0x1c,0x56,0x07, 0x1c,0x57,0x08,0x82,0x1b,0x56,0x07,0x0d,0x1b,0x56,0x05,0x1a,0x56,0x05,0x1c, 0x56,0x07,0x1c,0x57,0x08,0x1c,0x57,0x06,0x1b,0x58,0x06,0x1b,0x56,0x05,0x1c, 0x56,0x07,0x1c,0x57,0x06,0x1a,0x56,0x05,0x1a,0x56,0x06,0x1a,0x56,0x05,0x1a, 0x56,0x04,0x82,0x1a,0x55,0x04,0x02,0x1a,0x57,0x05,0x1a,0x56,0x05,0x82,0x19, 0x56,0x04,0x01,0x19,0x54,0x05,0x82,0x1a,0x54,0x05,0x02,0x19,0x56,0x04,0x19, 0x54,0x03,0x86,0x1a,0x55,0x04,0x01,0x1a,0x56,0x05,0x82,0x19,0x54,0x05,0x02, 0x1a,0x54,0x05,0x1a,0x55,0x06,0x83,0x1a,0x55,0x04,0x83,0x19,0x54,0x05,0x05, 0x19,0x56,0x04,0x1a,0x56,0x05,0x19,0x54,0x03,0x19,0x55,0x05,0x19,0x54,0x05, 0x85,0x19,0x52,0x04,0x04,0x19,0x52,0x05,0x19,0x51,0x05,0x17,0x50,0x05,0x19, 0x52,0x05,0x82,0x18,0x50,0x05,0x08,0x17,0x50,0x05,0x17,0x4f,0x05,0x17,0x4e, 0x04,0x17,0x4f,0x05,0x17,0x4e,0x03,0x17,0x4d,0x04,0x17,0x4c,0x03,0x16,0x4c, 0x03,0x82,0x17,0x4c,0x04,0x01,0x16,0x4d,0x04,0x82,0x16,0x4c,0x04,0x06,0x17, 0x4c,0x04,0x15,0x4c,0x04,0x15,0x4b,0x03,0x17,0x4b,0x03,0x16,0x4b,0x04,0x15, 0x4b,0x04,0x82,0x16,0x4b,0x04,0x82,0x17,0x4b,0x05,0x09,0x15,0x4a,0x05,0x15, 0x49,0x03,0x16,0x4b,0x05,0x15,0x4a,0x04,0x16,0x49,0x04,0x16,0x49,0x05,0x15, 0x49,0x05,0x15,0x48,0x03,0x15,0x47,0x03,0x82,0x15,0x48,0x04,0x03,0x15,0x47, 0x04,0x15,0x47,0x03,0x17,0x47,0x04,0x83,0x15,0x47,0x03,0x04,0x14,0x47,0x03, 0x14,0x45,0x03,0x15,0x46,0x03,0x15,0x46,0x04,0x82,0x13,0x44,0x03,0x12,0x14, 0x45,0x03,0x15,0x45,0x03,0x13,0x43,0x03,0x12,0x43,0x03,0x13,0x44,0x04,0x13, 0x43,0x03,0x14,0x43,0x02,0x15,0x41,0x05,0x13,0x41,0x03,0x13,0x42,0x05,0x13, 0x43,0x04,0x12,0x42,0x03,0x11,0x41,0x02,0x12,0x41,0x02,0x13,0x41,0x02,0x13, 0x40,0x03,0x11,0x3f,0x02,0x12,0x40,0x03,0x82,0x12,0x3f,0x03,0x08,0x11,0x3f, 0x02,0x12,0x3f,0x03,0x11,0x3f,0x04,0x11,0x3e,0x03,0x13,0x3e,0x04,0x11,0x3d, 0x02,0x10,0x3d,0x01,0x11,0x3e,0x03,0x82,0x11,0x3f,0x03,0x82,0x11,0x3d,0x02, 0x82,0x11,0x3d,0x03,0x02,0x10,0x3b,0x03,0x10,0x3b,0x01,0x82,0x10,0x3b,0x02, 0x83,0x10,0x3b,0x03,0x03,0x0f,0x3b,0x03,0x10,0x3a,0x03,0x0f,0x3a,0x03,0x83, 0x0f,0x39,0x03,0x04,0x0f,0x39,0x01,0x10,0x38,0x01,0x0f,0x37,0x01,0x10,0x37, 0x03,0x83,0x0f,0x38,0x03,0x0b,0x0f,0x37,0x02,0x0f,0x36,0x01,0x0e,0x37,0x02, 0x0d,0x36,0x01,0x0f,0x35,0x01,0x0e,0x36,0x02,0x0f,0x35,0x01,0x0f,0x35,0x03, 0x0d,0x35,0x02,0x0f,0x35,0x02,0x0e,0x35,0x02,0x82,0x0d,0x34,0x02,0x02,0x0e, 0x33,0x02,0x0f,0x33,0x02,0x82,0x0d,0x34,0x02,0x82,0x0d,0x33,0x02,0x02,0x0d, 0x32,0x01,0x0e,0x33,0x02,0x82,0x0d,0x32,0x01,0x02,0x0e,0x31,0x01,0x0d,0x32, 0x01,0x82,0x0d,0x31,0x01,0x01,0x0d,0x30,0x01,0x83,0x0c,0x30,0x01,0x82,0x0b, 0x30,0x01,0x03,0x0d,0x30,0x01,0x0c,0x2f,0x01,0x0d,0x2f,0x01,0x82,0x0c,0x2e, 0x01,0x06,0x0b,0x2e,0x00,0x0c,0x2e,0x01,0x0c,0x2f,0x03,0x0c,0x2e,0x02,0x0b, 0x2d,0x01,0x0c,0x2e,0x01,0x82,0x0b,0x2d,0x01,0x04,0x0c,0x2d,0x02,0x0c,0x2c, 0x02,0x0b,0x2c,0x01,0x0d,0x2d,0x02,0x82,0x0b,0x2c,0x02,0x05,0x0b,0x2c,0x01, 0x0b,0x2b,0x01,0x0b,0x2a,0x01,0x0b,0x2b,0x02,0x0b,0x2b,0x01,0x82,0x0b,0x2a, 0x01,0x01,0x0a,0x2a,0x00,0x82,0x0b,0x2a,0x01,0x0b,0x0a,0x2a,0x01,0x0a,0x28, 0x01,0x09,0x28,0x01,0x09,0x28,0x00,0x0a,0x28,0x01,0x0b,0x29,0x01,0x0a,0x28, 0x01,0x09,0x27,0x01,0x09,0x28,0x01,0x0a,0x27,0x01,0x0a,0x28,0x01,0x87,0x09, 0x26,0x01,0x83,0x09,0x25,0x01,0x83,0x09,0x24,0x01,0x82,0x09,0x24,0x00,0x06, 0x09,0x24,0x01,0x09,0x23,0x00,0x09,0x24,0x01,0x09,0x23,0x01,0x08,0x23,0x00, 0x08,0x22,0x00,0x84,0x08,0x22,0x01,0x82,0x08,0x21,0x01,0x82,0x07,0x21,0x00, 0x83,0x07,0x20,0x01,0x01,0x07,0x20,0x00,0x83,0x07,0x20,0x01,0x02,0x07,0x1f, 0x01,0x07,0x1f,0x00,0x87,0x07,0x1e,0x00,0x82,0x07,0x1e,0x01,0x83,0x07,0x1d, 0x00,0x01,0x07,0x1c,0x01,0x83,0x06,0x1c,0x00,0x83,0x06,0x1b,0x00,0x03,0x07, 0x1c,0x01,0x06,0x1b,0x00,0x05,0x1a,0x00,0x82,0x06,0x1a,0x00,0x02,0x05,0x1a, 0x00,0x06,0x1a,0x00,0x82,0x05,0x1a,0x00,0x82,0x05,0x19,0x00,0x01,0x06,0x19, 0x00,0x82,0x05,0x19,0x00,0x01,0x06,0x19,0x00,0x82,0x05,0x19,0x00,0x03,0x05, 0x18,0x00,0x05,0x19,0x00,0x05,0x18,0x00,0x87,0x05,0x17,0x00,0x82,0x05,0x16, 0x00,0x03,0x04,0x16,0x00,0x05,0x16,0x00,0x04,0x16,0x00,0x82,0x05,0x15,0x00, 0x84,0x04,0x15,0x00,0x01,0x05,0x15,0x00,0x82,0x04,0x15,0x00,0x02,0x04,0x14, 0x00,0x03,0x14,0x00,0x83,0x03,0x13,0x00,0x01,0x04,0x13,0x00,0x84,0x03,0x13, 0x00,0x83,0x03,0x12,0x00,0x8c,0x03,0x11,0x00,0x88,0x03,0x10,0x00,0x87,0x03, 0x0f,0x00,0x83,0x03,0x0e,0x00,0x83,0x03,0x0d,0x00,0x82,0x03,0x0f,0x00,0x03, 0x04,0x11,0x00,0x05,0x11,0x01,0x06,0x11,0x01,0x83,0x07,0x11,0x03,0x02,0x07, 0x10,0x03,0x07,0x11,0x03,0x83,0x07,0x10,0x03,0x01,0x07,0x0f,0x03,0x84,0x06, 0x0f,0x03,0x02,0x06,0x0e,0x03,0x05,0x0d,0x02,0x83,0x05,0x0d,0x03,0x02,0x05, 0x0d,0x02,0x05,0x0c,0x02,0x84,0x05,0x0b,0x02,0x82,0x04,0x0b,0x02,0x04,0x04, 0x0a,0x02,0x04,0x09,0x01,0x03,0x09,0x01,0x04,0x09,0x01,0x82,0x03,0x09,0x01, 0x83,0x03,0x08,0x01,0x82,0x03,0x07,0x01,0x03,0x02,0x07,0x01,0x02,0x06,0x01, 0x02,0x05,0x01,0x83,0x01,0x05,0x01,0x01,0x01,0x05,0x00,0x82,0x01,0x04,0x00, 0x85,0x01,0x03,0x00,0x01,0x01,0x02,0x00,0x82,0x00,0x02,0x00,0x85,0x00,0x01, 0x00,0xdc,0x00,0x00,0x00,0x83,0x44,0x8c,0x17,0x82,0x44,0x8b,0x16,0x01,0x43, 0x8c,0x16,0x82,0x44,0x8c,0x17,0x01,0x45,0x8c,0x17,0x82,0x44,0x8c,0x17,0x01, 0x43,0x8c,0x16,0x82,0x43,0x8a,0x15,0x02,0x43,0x8b,0x15,0x44,0x8c,0x17,0x83, 0x43,0x8b,0x15,0x82,0x43,0x8c,0x16,0x07,0x43,0x8b,0x15,0x42,0x8a,0x15,0x42, 0x8a,0x16,0x42,0x89,0x14,0x43,0x8a,0x15,0x43,0x8b,0x15,0x41,0x8a,0x15,0x82, 0x43,0x8a,0x17,0x03,0x41,0x89,0x15,0x43,0x8a,0x16,0x42,0x89,0x15,0x82,0x41, 0x89,0x15,0x82,0x43,0x8a,0x16,0x82,0x41,0x89,0x15,0x01,0x41,0x88,0x15,0x82, 0x42,0x8a,0x16,0x02,0x42,0x88,0x17,0x41,0x88,0x16,0x82,0x42,0x88,0x17,0x82, 0x41,0x88,0x16,0x0a,0x42,0x89,0x15,0x41,0x87,0x15,0x41,0x88,0x16,0x42,0x88, 0x17,0x41,0x87,0x15,0x41,0x87,0x16,0x41,0x88,0x17,0x41,0x89,0x17,0x40,0x88, 0x16,0x41,0x87,0x16,0x83,0x41,0x88,0x17,0x0b,0x41,0x87,0x17,0x41,0x86,0x19, 0x41,0x88,0x18,0x42,0x86,0x19,0x41,0x86,0x19,0x40,0x86,0x18,0x41,0x86,0x1a, 0x41,0x87,0x1b,0x3f,0x85,0x19,0x40,0x86,0x19,0x41,0x87,0x1b,0x82,0x41,0x86, 0x1a,0x0a,0x40,0x86,0x1a,0x41,0x86,0x1a,0x41,0x86,0x1b,0x41,0x86,0x1c,0x43, 0x86,0x1b,0x43,0x86,0x1d,0x41,0x86,0x1c,0x40,0x85,0x1b,0x41,0x86,0x1c,0x41, 0x86,0x1d,0x82,0x42,0x85,0x1c,0x0a,0x42,0x85,0x1d,0x41,0x86,0x1d,0x42,0x87, 0x1d,0x42,0x87,0x1f,0x43,0x86,0x1e,0x43,0x86,0x1f,0x42,0x85,0x1f,0x42,0x84, 0x1f,0x41,0x84,0x1f,0x43,0x85,0x20,0x82,0x43,0x86,0x1f,0x06,0x43,0x86,0x20, 0x43,0x85,0x20,0x42,0x84,0x1f,0x41,0x84,0x1f,0x42,0x84,0x1f,0x43,0x85,0x20, 0x83,0x42,0x84,0x1f,0x01,0x42,0x84,0x21,0x82,0x41,0x84,0x20,0x82,0x42,0x84, 0x21,0x02,0x42,0x84,0x1f,0x41,0x83,0x1f,0x84,0x41,0x84,0x20,0x02,0x42,0x84, 0x21,0x43,0x84,0x21,0x82,0x42,0x84,0x21,0x82,0x41,0x84,0x20,0x04,0x42,0x84, 0x21,0x42,0x83,0x20,0x41,0x82,0x1f,0x41,0x83,0x1f,0x82,0x41,0x82,0x21,0x01, 0x42,0x83,0x21,0x82,0x41,0x83,0x1f,0x01,0x42,0x83,0x20,0x82,0x41,0x82,0x21, 0x09,0x40,0x82,0x1f,0x41,0x84,0x20,0x41,0x83,0x1e,0x41,0x84,0x20,0x42,0x84, 0x21,0x41,0x84,0x20,0x41,0x82,0x1f,0x41,0x82,0x20,0x41,0x82,0x21,0x82,0x41, 0x82,0x20,0x04,0x41,0x83,0x21,0x3f,0x82,0x1f,0x41,0x82,0x1f,0x41,0x82,0x20, 0x83,0x40,0x81,0x1f,0x82,0x41,0x82,0x20,0x02,0x41,0x82,0x21,0x41,0x82,0x20, 0x82,0x40,0x81,0x1f,0x03,0x3f,0x80,0x1f,0x40,0x81,0x1f,0x3f,0x80,0x1e,0x82, 0x3e,0x80,0x1e,0x03,0x3d,0x80,0x1d,0x3f,0x80,0x1f,0x3f,0x80,0x20,0x86,0x3e, 0x7f,0x1f,0x03,0x3d,0x7e,0x1e,0x3f,0x80,0x1f,0x3d,0x7e,0x1f,0x82,0x3d,0x7e, 0x1d,0x04,0x3d,0x7e,0x1e,0x3d,0x7e,0x1f,0x3d,0x7d,0x1f,0x3d,0x7e,0x1d,0x82, 0x3d,0x7e,0x1e,0x02,0x3d,0x7d,0x1f,0x3c,0x7c,0x1e,0x82,0x3d,0x7d,0x1f,0x06, 0x3c,0x7c,0x1e,0x3b,0x7c,0x1d,0x3d,0x7d,0x1f,0x3c,0x7e,0x1f,0x3b,0x7c,0x1d, 0x3b,0x7c,0x1e,0x85,0x3b,0x7b,0x1d,0x09,0x3a,0x7a,0x1d,0x39,0x7a,0x1c,0x3b, 0x7b,0x1d,0x3a,0x7a,0x1d,0x3b,0x79,0x1c,0x3a,0x78,0x1b,0x3b,0x7a,0x1d,0x39, 0x79,0x1b,0x38,0x78,0x1a,0x82,0x39,0x79,0x1b,0x82,0x38,0x78,0x1b,0x82,0x37, 0x78,0x1a,0x01,0x38,0x76,0x1b,0x82,0x37,0x78,0x1a,0x02,0x36,0x76,0x19,0x35, 0x76,0x19,0x82,0x34,0x74,0x18,0x1c,0x35,0x75,0x19,0x36,0x76,0x1a,0x35,0x75, 0x17,0x34,0x74,0x18,0x35,0x75,0x17,0x36,0x76,0x18,0x35,0x76,0x18,0x36,0x76, 0x18,0x35,0x76,0x16,0x33,0x75,0x16,0x37,0x78,0x18,0x37,0x78,0x19,0x37,0x77, 0x19,0x34,0x74,0x16,0x31,0x71,0x13,0x29,0x67,0x0f,0x23,0x60,0x0d,0x1d,0x58, 0x08,0x1f,0x5b,0x08,0x20,0x5c,0x0a,0x1f,0x5c,0x09,0x1f,0x5d,0x0a,0x1f,0x5d, 0x09,0x21,0x5d,0x09,0x1f,0x5b,0x08,0x1e,0x5a,0x08,0x1e,0x5b,0x08,0x1f,0x5b, 0x09,0x84,0x1e,0x5a,0x08,0x08,0x1d,0x59,0x07,0x1c,0x57,0x07,0x1d,0x59,0x09, 0x1b,0x57,0x07,0x1b,0x57,0x05,0x1c,0x58,0x06,0x1b,0x57,0x05,0x1c,0x58,0x06, 0x83,0x1b,0x57,0x05,0x04,0x1c,0x57,0x07,0x1c,0x58,0x06,0x1b,0x58,0x05,0x1a, 0x57,0x06,0x84,0x1b,0x57,0x05,0x01,0x1b,0x58,0x05,0x83,0x1a,0x57,0x05,0x06, 0x19,0x55,0x05,0x1a,0x55,0x05,0x1b,0x56,0x06,0x1a,0x57,0x05,0x19,0x57,0x04, 0x1a,0x56,0x04,0x82,0x19,0x55,0x03,0x82,0x1a,0x56,0x04,0x03,0x19,0x55,0x03, 0x1a,0x56,0x04,0x19,0x55,0x03,0x83,0x19,0x55,0x05,0x82,0x19,0x55,0x03,0x09, 0x1a,0x56,0x04,0x1a,0x55,0x05,0x19,0x56,0x05,0x19,0x55,0x05,0x1a,0x57,0x05, 0x19,0x57,0x04,0x19,0x55,0x03,0x19,0x57,0x04,0x19,0x55,0x05,0x86,0x19,0x53, 0x04,0x01,0x19,0x53,0x05,0x82,0x18,0x52,0x05,0x01,0x19,0x52,0x06,0x82,0x17, 0x51,0x05,0x02,0x17,0x4f,0x04,0x17,0x50,0x05,0x82,0x17,0x4f,0x04,0x83,0x17, 0x4f,0x05,0x82,0x17,0x4e,0x05,0x82,0x15,0x4d,0x03,0x83,0x16,0x4d,0x04,0x09, 0x17,0x4d,0x05,0x16,0x4d,0x04,0x16,0x4d,0x05,0x16,0x4b,0x04,0x17,0x4b,0x03, 0x15,0x4b,0x03,0x16,0x49,0x03,0x15,0x4a,0x03,0x16,0x4b,0x04,0x82,0x17,0x4b, 0x05,0x05,0x16,0x4a,0x04,0x16,0x49,0x04,0x17,0x49,0x03,0x15,0x49,0x04,0x15, 0x49,0x03,0x82,0x15,0x48,0x03,0x83,0x15,0x49,0x04,0x1a,0x15,0x48,0x03,0x14, 0x47,0x03,0x15,0x49,0x03,0x15,0x48,0x04,0x14,0x47,0x03,0x15,0x47,0x04,0x15, 0x47,0x03,0x14,0x46,0x03,0x13,0x45,0x03,0x15,0x44,0x03,0x14,0x45,0x03,0x13, 0x45,0x03,0x13,0x45,0x04,0x14,0x45,0x05,0x14,0x45,0x03,0x13,0x44,0x03,0x13, 0x45,0x03,0x13,0x43,0x02,0x13,0x43,0x03,0x12,0x43,0x02,0x13,0x43,0x04,0x12, 0x42,0x05,0x12,0x41,0x03,0x13,0x41,0x04,0x13,0x41,0x03,0x11,0x41,0x02,0x82, 0x12,0x41,0x03,0x82,0x12,0x40,0x03,0x01,0x12,0x41,0x03,0x82,0x12,0x40,0x03, 0x03,0x13,0x3f,0x04,0x12,0x3e,0x03,0x11,0x3e,0x03,0x82,0x11,0x3f,0x03,0x07, 0x11,0x3e,0x03,0x11,0x3f,0x03,0x11,0x3d,0x02,0x11,0x3e,0x03,0x11,0x3d,0x02, 0x11,0x3d,0x03,0x10,0x3d,0x03,0x82,0x11,0x3d,0x03,0x03,0x0f,0x3b,0x01,0x0f, 0x3b,0x03,0x10,0x3b,0x03,0x82,0x0f,0x3b,0x03,0x0d,0x10,0x3a,0x03,0x0f,0x3b, 0x03,0x10,0x3b,0x03,0x0f,0x3a,0x03,0x0f,0x38,0x01,0x0f,0x3a,0x02,0x10,0x3a, 0x03,0x0f,0x39,0x03,0x0f,0x38,0x02,0x10,0x38,0x03,0x0f,0x37,0x02,0x10,0x38, 0x03,0x0e,0x37,0x01,0x83,0x0f,0x37,0x02,0x82,0x0e,0x37,0x02,0x04,0x0d,0x35, 0x01,0x0e,0x37,0x02,0x0e,0x35,0x02,0x0d,0x35,0x01,0x82,0x0e,0x35,0x02,0x0a, 0x0f,0x35,0x02,0x0d,0x33,0x01,0x0d,0x34,0x01,0x0e,0x35,0x02,0x0d,0x35,0x02, 0x0e,0x34,0x03,0x0d,0x35,0x03,0x0d,0x33,0x01,0x0c,0x32,0x01,0x0d,0x33,0x01, 0x83,0x0d,0x32,0x01,0x01,0x0c,0x31,0x01,0x82,0x0d,0x31,0x01,0x05,0x0c,0x31, 0x01,0x0d,0x31,0x02,0x0c,0x31,0x01,0x0c,0x30,0x02,0x0c,0x31,0x01,0x82,0x0b, 0x30,0x01,0x04,0x0b,0x2f,0x00,0x0b,0x2e,0x00,0x0c,0x2f,0x01,0x0d,0x2f,0x02, 0x82,0x0c,0x2f,0x01,0x03,0x0c,0x2e,0x02,0x0b,0x2d,0x01,0x0c,0x2e,0x01,0x82, 0x0b,0x2d,0x01,0x82,0x0c,0x2d,0x01,0x01,0x0b,0x2d,0x01,0x83,0x0b,0x2c,0x01, 0x01,0x0b,0x2b,0x02,0x83,0x0b,0x2b,0x01,0x06,0x0a,0x2b,0x01,0x0b,0x2b,0x01, 0x0b,0x2a,0x00,0x0a,0x2a,0x01,0x0a,0x2b,0x01,0x0b,0x2b,0x01,0x82,0x0a,0x29, 0x01,0x04,0x0b,0x29,0x01,0x0b,0x2a,0x01,0x0b,0x29,0x01,0x09,0x29,0x01,0x82, 0x0a,0x28,0x01,0x03,0x09,0x28,0x00,0x09,0x27,0x01,0x09,0x27,0x00,0x85,0x09, 0x27,0x01,0x02,0x0a,0x26,0x01,0x09,0x26,0x01,0x83,0x09,0x25,0x01,0x02,0x09, 0x25,0x00,0x09,0x24,0x00,0x82,0x09,0x25,0x01,0x05,0x09,0x24,0x00,0x08,0x24, 0x00,0x08,0x23,0x00,0x09,0x24,0x01,0x09,0x23,0x01,0x82,0x08,0x23,0x00,0x82, 0x08,0x23,0x01,0x82,0x08,0x22,0x01,0x82,0x08,0x21,0x01,0x02,0x07,0x21,0x00, 0x08,0x21,0x00,0x82,0x08,0x21,0x01,0x03,0x07,0x21,0x01,0x07,0x20,0x01,0x07, 0x21,0x01,0x83,0x07,0x20,0x01,0x01,0x07,0x1f,0x01,0x84,0x07,0x1f,0x00,0x01, 0x07,0x1e,0x00,0x84,0x07,0x1e,0x01,0x01,0x07,0x1d,0x01,0x83,0x07,0x1d,0x00, 0x01,0x07,0x1d,0x01,0x82,0x07,0x1d,0x00,0x01,0x07,0x1c,0x00,0x82,0x06,0x1b, 0x00,0x03,0x06,0x1c,0x00,0x06,0x1b,0x00,0x05,0x1b,0x00,0x82,0x06,0x1b,0x00, 0x82,0x06,0x1a,0x00,0x82,0x05,0x1a,0x00,0x02,0x06,0x19,0x00,0x06,0x1a,0x00, 0x82,0x06,0x19,0x00,0x01,0x05,0x19,0x00,0x82,0x06,0x19,0x00,0x01,0x05,0x19, 0x00,0x84,0x05,0x18,0x00,0x86,0x05,0x17,0x00,0x84,0x05,0x16,0x00,0x03,0x04, 0x16,0x00,0x04,0x15,0x00,0x05,0x15,0x00,0x82,0x04,0x15,0x00,0x01,0x05,0x15, 0x00,0x83,0x04,0x15,0x00,0x83,0x04,0x14,0x00,0x01,0x03,0x14,0x00,0x88,0x03, 0x13,0x00,0x83,0x03,0x12,0x00,0x89,0x03,0x11,0x00,0x87,0x03,0x10,0x00,0x8a, 0x03,0x0f,0x00,0x84,0x03,0x0e,0x00,0x85,0x03,0x0d,0x00,0x82,0x03,0x0f,0x00, 0x03,0x05,0x10,0x00,0x05,0x11,0x01,0x07,0x11,0x02,0x82,0x07,0x11,0x03,0x02, 0x07,0x10,0x03,0x06,0x0f,0x03,0x82,0x07,0x0f,0x03,0x83,0x06,0x0f,0x03,0x03, 0x06,0x0e,0x03,0x05,0x0e,0x03,0x05,0x0d,0x02,0x82,0x05,0x0d,0x03,0x82,0x05, 0x0d,0x02,0x82,0x05,0x0c,0x02,0x85,0x05,0x0b,0x02,0x82,0x04,0x0a,0x01,0x82, 0x04,0x09,0x01,0x82,0x03,0x09,0x01,0x83,0x03,0x08,0x01,0x84,0x03,0x07,0x01, 0x02,0x02,0x06,0x01,0x02,0x05,0x01,0x83,0x01,0x05,0x00,0x82,0x01,0x04,0x00, 0x85,0x01,0x03,0x00,0x01,0x01,0x02,0x00,0x82,0x00,0x02,0x00,0x85,0x00,0x01, 0x00,0xdc,0x00,0x00,0x00,0x03,0x44,0x8c,0x16,0x45,0x8c,0x16,0x45,0x8e,0x17, 0x82,0x45,0x8d,0x17,0x82,0x44,0x8d,0x16,0x01,0x43,0x8c,0x15,0x82,0x44,0x8d, 0x16,0x82,0x44,0x8c,0x16,0x82,0x44,0x8d,0x16,0x02,0x42,0x8b,0x14,0x43,0x8b, 0x15,0x84,0x43,0x8c,0x16,0x01,0x44,0x8d,0x16,0x82,0x43,0x8c,0x15,0x82,0x43, 0x8c,0x17,0x82,0x43,0x8b,0x16,0x06,0x43,0x8a,0x16,0x42,0x8a,0x16,0x43,0x8b, 0x16,0x42,0x8a,0x16,0x43,0x8a,0x16,0x41,0x8a,0x15,0x82,0x43,0x8a,0x16,0x82, 0x42,0x8a,0x16,0x82,0x43,0x8a,0x16,0x04,0x41,0x8a,0x15,0x42,0x8a,0x16,0x41, 0x8a,0x15,0x41,0x89,0x16,0x82,0x41,0x88,0x16,0x08,0x41,0x8a,0x16,0x42,0x8a, 0x17,0x41,0x89,0x16,0x43,0x89,0x16,0x41,0x88,0x16,0x42,0x89,0x17,0x41,0x8a, 0x16,0x41,0x89,0x16,0x83,0x42,0x89,0x17,0x02,0x42,0x89,0x18,0x41,0x88,0x18, 0x82,0x42,0x89,0x18,0x09,0x41,0x88,0x18,0x41,0x87,0x18,0x41,0x88,0x19,0x42, 0x88,0x1a,0x41,0x87,0x18,0x41,0x88,0x19,0x41,0x87,0x18,0x41,0x88,0x19,0x42, 0x88,0x1b,0x83,0x41,0x88,0x1a,0x01,0x42,0x88,0x1b,0x82,0x41,0x88,0x1a,0x07, 0x41,0x87,0x1c,0x41,0x87,0x1a,0x41,0x88,0x1b,0x41,0x86,0x1d,0x43,0x88,0x1c, 0x40,0x86,0x1b,0x41,0x86,0x1c,0x82,0x41,0x87,0x1c,0x05,0x42,0x86,0x1c,0x42, 0x86,0x1d,0x43,0x86,0x1e,0x41,0x87,0x1e,0x41,0x86,0x1d,0x82,0x41,0x87,0x1e, 0x01,0x42,0x86,0x1e,0x82,0x43,0x86,0x1f,0x0a,0x42,0x85,0x1f,0x43,0x86,0x20, 0x41,0x87,0x1e,0x43,0x86,0x1f,0x43,0x86,0x20,0x43,0x85,0x1f,0x43,0x84,0x20, 0x41,0x84,0x1e,0x42,0x85,0x1f,0x42,0x86,0x1e,0x82,0x43,0x86,0x20,0x03,0x42, 0x85,0x20,0x43,0x86,0x21,0x42,0x85,0x20,0x82,0x41,0x84,0x20,0x03,0x42,0x85, 0x20,0x42,0x85,0x1f,0x42,0x85,0x20,0x82,0x41,0x84,0x20,0x83,0x42,0x85,0x20, 0x01,0x43,0x84,0x20,0x82,0x41,0x84,0x20,0x01,0x42,0x85,0x20,0x82,0x41,0x84, 0x20,0x02,0x41,0x83,0x1f,0x42,0x84,0x20,0x84,0x42,0x85,0x20,0x82,0x41,0x84, 0x20,0x82,0x42,0x85,0x20,0x85,0x41,0x84,0x20,0x82,0x42,0x85,0x20,0x02,0x41, 0x84,0x20,0x43,0x84,0x22,0x83,0x41,0x83,0x20,0x01,0x42,0x84,0x21,0x82,0x41, 0x83,0x1f,0x01,0x41,0x82,0x20,0x82,0x41,0x83,0x20,0x05,0x41,0x82,0x20,0x42, 0x84,0x21,0x41,0x82,0x20,0x40,0x82,0x1f,0x41,0x83,0x20,0x82,0x40,0x82,0x1f, 0x08,0x41,0x82,0x20,0x41,0x82,0x21,0x3f,0x81,0x20,0x3f,0x80,0x1f,0x3f,0x82, 0x1e,0x3e,0x81,0x1e,0x3e,0x80,0x1f,0x3f,0x81,0x20,0x82,0x3f,0x80,0x1f,0x01, 0x3f,0x81,0x20,0x82,0x3e,0x80,0x1e,0x83,0x3f,0x80,0x1f,0x01,0x3d,0x7f,0x1e, 0x83,0x3e,0x80,0x1e,0x06,0x3e,0x7f,0x20,0x3d,0x7e,0x1f,0x3d,0x7e,0x1e,0x3e, 0x80,0x1e,0x3d,0x7f,0x1e,0x3e,0x7f,0x20,0x82,0x3d,0x7e,0x1e,0x04,0x3d,0x7e, 0x1f,0x3d,0x7e,0x1e,0x3c,0x7d,0x1e,0x3b,0x7c,0x1c,0x82,0x3b,0x7c,0x1d,0x01, 0x3d,0x7e,0x1f,0x83,0x3c,0x7d,0x1e,0x06,0x3b,0x7c,0x1c,0x3c,0x7c,0x1c,0x3d, 0x7c,0x1e,0x3b,0x7c,0x1d,0x3b,0x7d,0x1e,0x3b,0x7c,0x1d,0x83,0x3b,0x7a,0x1c, 0x84,0x3a,0x7b,0x1c,0x82,0x39,0x7a,0x1c,0x02,0x39,0x7a,0x1b,0x38,0x79,0x1a, 0x82,0x39,0x78,0x1a,0x85,0x37,0x78,0x1a,0x01,0x36,0x77,0x1a,0x82,0x37,0x78, 0x19,0x04,0x36,0x77,0x18,0x37,0x78,0x19,0x37,0x78,0x17,0x37,0x78,0x18,0x82, 0x37,0x7a,0x18,0x13,0x35,0x78,0x18,0x35,0x78,0x16,0x37,0x79,0x19,0x35,0x77, 0x16,0x35,0x78,0x16,0x3a,0x7b,0x1c,0x39,0x7a,0x1b,0x36,0x75,0x17,0x2e,0x6d, 0x10,0x28,0x66,0x0f,0x21,0x5f,0x0b,0x1e,0x5b,0x0a,0x1e,0x5b,0x08,0x1f,0x5c, 0x07,0x22,0x5f,0x08,0x20,0x5d,0x08,0x1e,0x5b,0x08,0x1f,0x5d,0x09,0x1f,0x5b, 0x08,0x83,0x1e,0x5b,0x08,0x02,0x1f,0x5b,0x09,0x1e,0x5b,0x08,0x82,0x1e,0x5a, 0x08,0x84,0x1d,0x59,0x07,0x05,0x1c,0x59,0x06,0x1c,0x58,0x06,0x1c,0x59,0x06, 0x1c,0x58,0x06,0x1b,0x57,0x05,0x82,0x1b,0x59,0x06,0x82,0x1c,0x58,0x06,0x04, 0x1c,0x59,0x06,0x1c,0x58,0x06,0x1b,0x57,0x05,0x1c,0x58,0x06,0x82,0x1b,0x59, 0x06,0x01,0x1a,0x57,0x04,0x82,0x1a,0x55,0x05,0x02,0x1a,0x56,0x06,0x1a,0x57, 0x04,0x82,0x1a,0x58,0x05,0x84,0x1a,0x57,0x04,0x03,0x19,0x57,0x04,0x1a,0x57, 0x04,0x1b,0x57,0x05,0x82,0x1a,0x56,0x06,0x09,0x1a,0x57,0x06,0x1a,0x56,0x04, 0x1a,0x55,0x05,0x1a,0x56,0x06,0x19,0x55,0x04,0x1a,0x55,0x05,0x19,0x55,0x04, 0x1a,0x57,0x06,0x1a,0x57,0x04,0x82,0x19,0x56,0x05,0x06,0x1a,0x55,0x05,0x18, 0x55,0x04,0x18,0x53,0x04,0x19,0x54,0x04,0x1a,0x54,0x05,0x18,0x54,0x04,0x82, 0x19,0x53,0x04,0x04,0x18,0x52,0x04,0x17,0x51,0x03,0x18,0x51,0x05,0x17,0x51, 0x04,0x82,0x18,0x51,0x05,0x02,0x18,0x51,0x06,0x18,0x51,0x05,0x83,0x18,0x50, 0x04,0x02,0x16,0x4f,0x03,0x17,0x4f,0x04,0x82,0x16,0x4f,0x04,0x01,0x17,0x4d, 0x04,0x82,0x19,0x4e,0x05,0x82,0x16,0x4d,0x04,0x0a,0x16,0x4b,0x03,0x17,0x4d, 0x05,0x16,0x4d,0x04,0x17,0x4d,0x05,0x17,0x4c,0x05,0x17,0x4b,0x04,0x16,0x4b, 0x04,0x18,0x4b,0x04,0x16,0x4a,0x04,0x16,0x4b,0x04,0x82,0x16,0x4a,0x04,0x02, 0x16,0x4b,0x04,0x15,0x4b,0x04,0x82,0x15,0x49,0x04,0x09,0x16,0x49,0x04,0x16, 0x4a,0x04,0x16,0x49,0x04,0x15,0x49,0x04,0x14,0x49,0x04,0x16,0x47,0x04,0x15, 0x48,0x02,0x15,0x47,0x04,0x15,0x47,0x05,0x83,0x14,0x47,0x04,0x02,0x13,0x46, 0x03,0x14,0x46,0x04,0x82,0x14,0x45,0x03,0x0e,0x14,0x46,0x04,0x14,0x45,0x04, 0x14,0x45,0x03,0x14,0x44,0x03,0x13,0x45,0x02,0x13,0x44,0x02,0x14,0x44,0x04, 0x12,0x43,0x03,0x12,0x43,0x04,0x12,0x43,0x03,0x13,0x43,0x04,0x12,0x42,0x03, 0x13,0x42,0x04,0x12,0x41,0x02,0x82,0x13,0x42,0x04,0x01,0x12,0x41,0x03,0x82, 0x12,0x41,0x02,0x05,0x12,0x40,0x03,0x11,0x3f,0x02,0x13,0x3f,0x03,0x11,0x3f, 0x02,0x11,0x3f,0x04,0x82,0x12,0x3f,0x04,0x0f,0x12,0x3f,0x03,0x12,0x3e,0x02, 0x11,0x3f,0x04,0x11,0x3e,0x02,0x11,0x3e,0x03,0x11,0x3e,0x04,0x10,0x3d,0x04, 0x10,0x3d,0x02,0x12,0x3d,0x04,0x11,0x3d,0x04,0x11,0x3b,0x03,0x10,0x3c,0x02, 0x10,0x3b,0x02,0x11,0x3c,0x04,0x11,0x3b,0x03,0x83,0x10,0x3b,0x03,0x08,0x11, 0x3a,0x03,0x10,0x3a,0x02,0x10,0x3b,0x03,0x0f,0x3a,0x03,0x0f,0x39,0x03,0x10, 0x39,0x03,0x0f,0x37,0x02,0x10,0x39,0x03,0x82,0x0f,0x39,0x02,0x06,0x10,0x37, 0x02,0x0f,0x38,0x02,0x0e,0x38,0x02,0x0f,0x38,0x02,0x0e,0x37,0x02,0x0d,0x37, 0x02,0x82,0x0e,0x37,0x02,0x01,0x10,0x36,0x03,0x83,0x0e,0x35,0x02,0x07,0x0f, 0x35,0x02,0x0e,0x35,0x02,0x0e,0x34,0x01,0x0d,0x34,0x02,0x0f,0x34,0x02,0x0e, 0x35,0x02,0x0c,0x34,0x02,0x82,0x0e,0x33,0x02,0x06,0x0d,0x33,0x02,0x0c,0x33, 0x01,0x0c,0x32,0x02,0x0d,0x32,0x01,0x0d,0x31,0x02,0x0e,0x32,0x02,0x83,0x0c, 0x31,0x02,0x01,0x0d,0x31,0x02,0x83,0x0c,0x31,0x02,0x08,0x0c,0x30,0x01,0x0c, 0x2f,0x02,0x0c,0x2e,0x02,0x0c,0x2f,0x02,0x0c,0x2f,0x01,0x0c,0x2e,0x02,0x0c, 0x2e,0x01,0x0c,0x2e,0x02,0x82,0x0c,0x2e,0x01,0x82,0x0b,0x2d,0x01,0x04,0x0a, 0x2c,0x00,0x0c,0x2c,0x01,0x0c,0x2d,0x01,0x0c,0x2c,0x01,0x82,0x0b,0x2b,0x01, 0x82,0x0b,0x2c,0x01,0x03,0x0b,0x2b,0x01,0x0b,0x2c,0x01,0x0a,0x2b,0x01,0x82, 0x0b,0x2a,0x01,0x82,0x0b,0x2a,0x02,0x0e,0x0c,0x2a,0x02,0x0b,0x2a,0x01,0x0a, 0x2a,0x01,0x0b,0x29,0x02,0x0b,0x2a,0x01,0x0a,0x28,0x02,0x0b,0x29,0x02,0x0a, 0x28,0x02,0x0a,0x28,0x01,0x0a,0x28,0x00,0x0a,0x28,0x01,0x0a,0x28,0x02,0x0a, 0x27,0x02,0x0a,0x27,0x01,0x83,0x0a,0x26,0x01,0x05,0x0a,0x26,0x02,0x0a,0x26, 0x01,0x0a,0x26,0x02,0x0a,0x26,0x01,0x0a,0x25,0x01,0x82,0x09,0x25,0x01,0x07, 0x08,0x25,0x01,0x09,0x25,0x01,0x08,0x24,0x00,0x09,0x24,0x01,0x09,0x24,0x00, 0x08,0x24,0x00,0x08,0x23,0x00,0x82,0x08,0x23,0x01,0x02,0x08,0x22,0x01,0x08, 0x22,0x00,0x82,0x08,0x22,0x01,0x82,0x08,0x22,0x00,0x82,0x08,0x21,0x01,0x01, 0x08,0x21,0x00,0x86,0x08,0x20,0x01,0x82,0x08,0x1f,0x01,0x03,0x08,0x1f,0x00, 0x07,0x1f,0x01,0x07,0x1e,0x00,0x84,0x07,0x1e,0x01,0x84,0x07,0x1e,0x00,0x01, 0x07,0x1d,0x01,0x82,0x06,0x1c,0x00,0x01,0x07,0x1c,0x00,0x83,0x06,0x1c,0x00, 0x02,0x07,0x1c,0x01,0x06,0x1c,0x00,0x82,0x06,0x1b,0x00,0x87,0x06,0x1a,0x00, 0x02,0x06,0x19,0x00,0x06,0x1a,0x00,0x83,0x06,0x19,0x00,0x83,0x06,0x18,0x00, 0x83,0x05,0x18,0x00,0x84,0x05,0x17,0x00,0x88,0x05,0x16,0x00,0x01,0x04,0x15, 0x00,0x82,0x04,0x16,0x00,0x84,0x04,0x15,0x00,0x85,0x04,0x14,0x00,0x83,0x04, 0x13,0x00,0x02,0x04,0x12,0x00,0x04,0x13,0x00,0x85,0x04,0x12,0x00,0x02,0x03, 0x11,0x00,0x04,0x11,0x00,0x84,0x03,0x11,0x00,0x82,0x03,0x10,0x00,0x82,0x04, 0x10,0x00,0x01,0x03,0x10,0x00,0x82,0x04,0x10,0x00,0x01,0x03,0x10,0x00,0x85, 0x03,0x0f,0x00,0x01,0x03,0x0e,0x00,0x83,0x03,0x0f,0x00,0x02,0x03,0x0e,0x00, 0x04,0x0e,0x00,0x82,0x03,0x0e,0x00,0x01,0x04,0x0e,0x00,0x82,0x03,0x0e,0x00, 0x03,0x03,0x0d,0x00,0x03,0x0e,0x00,0x02,0x0d,0x00,0x82,0x03,0x0d,0x00,0x0c, 0x04,0x0e,0x00,0x04,0x0f,0x00,0x04,0x10,0x00,0x05,0x10,0x01,0x06,0x10,0x02, 0x07,0x10,0x04,0x07,0x10,0x03,0x07,0x10,0x04,0x07,0x10,0x03,0x06,0x0f,0x03, 0x07,0x0f,0x03,0x06,0x0f,0x03,0x85,0x06,0x0e,0x03,0x82,0x06,0x0d,0x02,0x02, 0x05,0x0c,0x02,0x06,0x0c,0x02,0x83,0x05,0x0c,0x02,0x02,0x05,0x0b,0x02,0x04, 0x0b,0x02,0x84,0x04,0x0a,0x02,0x83,0x04,0x09,0x02,0x82,0x04,0x08,0x02,0x02, 0x03,0x08,0x02,0x03,0x08,0x01,0x82,0x03,0x07,0x01,0x01,0x03,0x06,0x01,0x83, 0x02,0x06,0x01,0x01,0x02,0x05,0x00,0x82,0x02,0x04,0x00,0x83,0x01,0x04,0x00, 0x82,0x01,0x03,0x00,0x01,0x01,0x02,0x00,0x84,0x00,0x02,0x00,0x83,0x00,0x01, 0x00,0xdc,0x00,0x00,0x00,0x01,0x46,0x8f,0x17,0x85,0x45,0x8f,0x17,0x02,0x44, 0x8e,0x16,0x45,0x8d,0x16,0x82,0x45,0x8f,0x17,0x06,0x45,0x8e,0x17,0x45,0x8d, 0x16,0x43,0x8d,0x15,0x43,0x8d,0x17,0x43,0x8c,0x16,0x45,0x8d,0x16,0x82,0x43, 0x8d,0x15,0x05,0x44,0x8d,0x17,0x43,0x8d,0x17,0x44,0x8e,0x16,0x43,0x8d,0x15, 0x43,0x8c,0x16,0x83,0x43,0x8d,0x17,0x82,0x43,0x8c,0x16,0x02,0x42,0x8b,0x15, 0x43,0x8c,0x16,0x83,0x42,0x8b,0x15,0x82,0x43,0x8c,0x16,0x82,0x42,0x8b,0x15, 0x01,0x43,0x8b,0x15,0x82,0x43,0x8c,0x16,0x82,0x42,0x8b,0x15,0x01,0x42,0x8a, 0x16,0x82,0x41,0x89,0x15,0x05,0x43,0x8a,0x17,0x42,0x8b,0x17,0x41,0x8a,0x15, 0x42,0x8a,0x17,0x43,0x8a,0x17,0x82,0x41,0x8a,0x16,0x0d,0x42,0x8b,0x17,0x41, 0x8a,0x17,0x42,0x8a,0x18,0x42,0x8a,0x17,0x41,0x89,0x17,0x41,0x88,0x17,0x41, 0x88,0x19,0x42,0x8a,0x18,0x41,0x89,0x17,0x41,0x89,0x19,0x42,0x89,0x19,0x42, 0x8a,0x18,0x41,0x88,0x1a,0x82,0x41,0x8a,0x19,0x82,0x42,0x89,0x19,0x02,0x43, 0x88,0x19,0x41,0x88,0x19,0x82,0x41,0x88,0x1a,0x08,0x41,0x87,0x1b,0x41,0x88, 0x1a,0x41,0x88,0x1b,0x42,0x88,0x1d,0x42,0x89,0x1b,0x41,0x88,0x1a,0x41,0x88, 0x1c,0x42,0x88,0x1d,0x82,0x41,0x88,0x1c,0x01,0x42,0x88,0x1e,0x82,0x43,0x88, 0x1e,0x03,0x42,0x88,0x1e,0x41,0x88,0x1d,0x41,0x87,0x1e,0x82,0x41,0x88,0x1f, 0x01,0x42,0x86,0x1e,0x82,0x43,0x88,0x1f,0x84,0x43,0x87,0x1f,0x82,0x43,0x86, 0x1f,0x01,0x43,0x87,0x20,0x83,0x43,0x86,0x1f,0x05,0x41,0x87,0x1f,0x43,0x86, 0x1f,0x43,0x85,0x20,0x43,0x86,0x21,0x43,0x87,0x21,0x84,0x43,0x86,0x21,0x03, 0x43,0x87,0x21,0x43,0x86,0x21,0x42,0x86,0x20,0x82,0x43,0x86,0x21,0x03,0x42, 0x86,0x20,0x43,0x85,0x20,0x43,0x86,0x21,0x82,0x42,0x86,0x20,0x01,0x40,0x86, 0x1f,0x82,0x43,0x86,0x21,0x07,0x43,0x85,0x20,0x42,0x86,0x20,0x41,0x85,0x1f, 0x42,0x86,0x20,0x43,0x86,0x21,0x42,0x86,0x20,0x41,0x85,0x1f,0x83,0x42,0x86, 0x20,0x08,0x41,0x85,0x21,0x41,0x84,0x1f,0x41,0x85,0x1f,0x42,0x86,0x20,0x42, 0x86,0x21,0x42,0x86,0x20,0x41,0x85,0x21,0x41,0x84,0x20,0x82,0x42,0x86,0x21, 0x08,0x41,0x85,0x21,0x41,0x84,0x20,0x42,0x84,0x1f,0x41,0x84,0x1f,0x41,0x84, 0x20,0x43,0x85,0x21,0x42,0x84,0x21,0x40,0x82,0x1f,0x82,0x41,0x83,0x1f,0x02, 0x40,0x82,0x1f,0x41,0x84,0x20,0x82,0x41,0x83,0x1f,0x02,0x40,0x83,0x21,0x3f, 0x82,0x20,0x82,0x3f,0x81,0x1f,0x06,0x3f,0x82,0x20,0x3f,0x83,0x1f,0x3f,0x82, 0x1f,0x3f,0x81,0x1f,0x3f,0x82,0x1f,0x3f,0x81,0x1f,0x82,0x3f,0x82,0x1f,0x83, 0x3f,0x81,0x1f,0x0a,0x3e,0x81,0x1f,0x3e,0x80,0x1e,0x3f,0x81,0x1f,0x3e,0x80, 0x1e,0x3e,0x80,0x1f,0x3d,0x80,0x1f,0x3d,0x7f,0x1f,0x3e,0x80,0x1f,0x3d,0x80, 0x1d,0x3d,0x7e,0x1e,0x82,0x3f,0x80,0x20,0x04,0x3d,0x7f,0x1f,0x3e,0x80,0x1f, 0x3f,0x81,0x1f,0x3e,0x80,0x1e,0x83,0x3d,0x7e,0x1e,0x03,0x3d,0x7e,0x1f,0x3b, 0x7d,0x1d,0x3c,0x7e,0x1d,0x83,0x3d,0x7e,0x1e,0x82,0x3b,0x7d,0x1d,0x01,0x3d, 0x7e,0x1f,0x83,0x3c,0x7e,0x1e,0x04,0x3b,0x7d,0x1d,0x3c,0x7e,0x1e,0x3b,0x7d, 0x1d,0x3a,0x7c,0x1d,0x82,0x3a,0x7c,0x1c,0x83,0x39,0x7b,0x1b,0x01,0x38,0x7a, 0x1b,0x82,0x3a,0x7a,0x1b,0x21,0x38,0x7a,0x1b,0x38,0x7a,0x1a,0x37,0x79,0x1b, 0x38,0x7a,0x1b,0x36,0x78,0x19,0x37,0x79,0x19,0x36,0x78,0x18,0x34,0x75,0x17, 0x38,0x7a,0x1a,0x38,0x7b,0x1b,0x37,0x7a,0x1a,0x36,0x7a,0x19,0x38,0x7b,0x19, 0x36,0x7a,0x19,0x36,0x7a,0x17,0x38,0x7b,0x19,0x36,0x7a,0x15,0x35,0x78,0x16, 0x36,0x79,0x17,0x34,0x78,0x15,0x36,0x78,0x17,0x39,0x7b,0x1b,0x37,0x79,0x19, 0x34,0x76,0x16,0x30,0x6f,0x13,0x27,0x66,0x0e,0x20,0x5e,0x0a,0x1d,0x5a,0x06, 0x1f,0x5c,0x08,0x21,0x5e,0x0a,0x20,0x5e,0x0a,0x20,0x5d,0x0a,0x1f,0x5c,0x09, 0x83,0x1f,0x5c,0x08,0x82,0x1e,0x5b,0x08,0x01,0x1d,0x5a,0x06,0x82,0x1f,0x5c, 0x08,0x07,0x1e,0x5b,0x08,0x1d,0x5a,0x06,0x1d,0x5a,0x07,0x1d,0x5a,0x06,0x1f, 0x5c,0x08,0x1d,0x5a,0x07,0x1d,0x5a,0x06,0x82,0x1c,0x5a,0x06,0x83,0x1d,0x5a, 0x06,0x06,0x1b,0x5a,0x06,0x1b,0x58,0x04,0x1c,0x59,0x06,0x1b,0x5a,0x06,0x1b, 0x59,0x05,0x1a,0x57,0x04,0x82,0x1b,0x58,0x04,0x82,0x1a,0x58,0x04,0x01,0x1b, 0x59,0x05,0x83,0x1a,0x58,0x04,0x83,0x19,0x58,0x04,0x01,0x1a,0x57,0x04,0x82, 0x1a,0x56,0x05,0x83,0x19,0x57,0x05,0x82,0x1a,0x56,0x05,0x82,0x19,0x56,0x04, 0x82,0x1a,0x56,0x05,0x05,0x1a,0x58,0x06,0x19,0x57,0x05,0x19,0x55,0x04,0x18, 0x56,0x04,0x1a,0x57,0x06,0x82,0x19,0x55,0x04,0x06,0x19,0x54,0x04,0x19,0x55, 0x04,0x19,0x54,0x05,0x19,0x53,0x05,0x17,0x52,0x04,0x17,0x52,0x03,0x86,0x18, 0x52,0x05,0x07,0x17,0x51,0x03,0x18,0x50,0x04,0x18,0x51,0x05,0x17,0x50,0x04, 0x18,0x4e,0x04,0x19,0x4f,0x04,0x17,0x4f,0x04,0x82,0x17,0x4e,0x04,0x83,0x17, 0x4d,0x04,0x15,0x16,0x4d,0x04,0x17,0x4d,0x04,0x16,0x4c,0x04,0x17,0x4d,0x04, 0x16,0x4d,0x04,0x16,0x4b,0x04,0x16,0x4d,0x04,0x16,0x4b,0x04,0x15,0x4b,0x04, 0x16,0x4c,0x04,0x17,0x4b,0x04,0x15,0x4b,0x04,0x16,0x4b,0x04,0x15,0x4b,0x04, 0x15,0x4a,0x04,0x14,0x49,0x03,0x15,0x49,0x04,0x16,0x4a,0x04,0x15,0x4a,0x04, 0x15,0x49,0x04,0x15,0x48,0x03,0x82,0x15,0x48,0x04,0x01,0x14,0x47,0x04,0x82, 0x15,0x47,0x04,0x18,0x14,0x47,0x03,0x13,0x47,0x04,0x14,0x47,0x03,0x14,0x47, 0x04,0x14,0x46,0x03,0x14,0x45,0x03,0x14,0x45,0x04,0x12,0x45,0x02,0x14,0x47, 0x04,0x14,0x46,0x03,0x13,0x45,0x04,0x13,0x44,0x03,0x13,0x44,0x04,0x12,0x43, 0x04,0x12,0x43,0x03,0x13,0x43,0x04,0x12,0x43,0x05,0x12,0x44,0x02,0x13,0x44, 0x03,0x13,0x43,0x02,0x12,0x42,0x03,0x12,0x43,0x04,0x12,0x41,0x03,0x12,0x41, 0x02,0x84,0x12,0x41,0x03,0x08,0x12,0x41,0x04,0x12,0x40,0x04,0x11,0x3f,0x04, 0x11,0x40,0x03,0x11,0x3f,0x02,0x12,0x3e,0x03,0x11,0x3f,0x04,0x11,0x3f,0x03, 0x82,0x11,0x3e,0x02,0x0b,0x10,0x3f,0x03,0x10,0x3d,0x04,0x11,0x3d,0x03,0x10, 0x3d,0x04,0x12,0x3d,0x04,0x11,0x3d,0x03,0x10,0x3d,0x02,0x10,0x3c,0x02,0x10, 0x3c,0x03,0x10,0x3b,0x03,0x10,0x3c,0x03,0x82,0x10,0x3b,0x03,0x02,0x10,0x3c, 0x04,0x10,0x3a,0x03,0x82,0x0f,0x3a,0x02,0x0d,0x10,0x3a,0x02,0x0f,0x3a,0x03, 0x0f,0x39,0x03,0x0f,0x38,0x03,0x0e,0x38,0x02,0x10,0x38,0x02,0x0f,0x38,0x02, 0x0f,0x39,0x03,0x0f,0x38,0x02,0x0e,0x38,0x02,0x0e,0x37,0x02,0x0e,0x38,0x02, 0x0f,0x36,0x02,0x83,0x0e,0x36,0x02,0x82,0x0f,0x36,0x02,0x83,0x0e,0x35,0x02, 0x06,0x0e,0x34,0x02,0x0e,0x35,0x02,0x0d,0x34,0x02,0x0e,0x34,0x02,0x0e,0x33, 0x02,0x0d,0x34,0x03,0x82,0x0d,0x33,0x02,0x02,0x0e,0x33,0x02,0x0e,0x32,0x02, 0x82,0x0d,0x32,0x02,0x01,0x0c,0x31,0x02,0x84,0x0d,0x31,0x02,0x01,0x0c,0x31, 0x01,0x82,0x0c,0x30,0x02,0x01,0x0b,0x30,0x01,0x83,0x0c,0x30,0x02,0x82,0x0c, 0x2f,0x02,0x82,0x0c,0x2e,0x02,0x83,0x0b,0x2e,0x01,0x0c,0x0b,0x2d,0x00,0x0c, 0x2e,0x01,0x0c,0x2d,0x01,0x0a,0x2c,0x01,0x0b,0x2d,0x01,0x0c,0x2c,0x02,0x0b, 0x2c,0x00,0x0b,0x2c,0x01,0x0c,0x2c,0x01,0x0b,0x2c,0x02,0x0b,0x2b,0x01,0x0b, 0x2a,0x00,0x82,0x0b,0x2a,0x02,0x0c,0x0c,0x2a,0x01,0x0a,0x2a,0x01,0x0a,0x2a, 0x00,0x0a,0x2a,0x01,0x0b,0x2a,0x02,0x0a,0x2a,0x01,0x0a,0x2a,0x02,0x0a,0x29, 0x02,0x0a,0x2a,0x01,0x0a,0x28,0x02,0x0a,0x28,0x01,0x09,0x28,0x00,0x82,0x0a, 0x28,0x01,0x04,0x0a,0x27,0x01,0x0a,0x26,0x01,0x09,0x27,0x01,0x09,0x27,0x02, 0x83,0x0a,0x26,0x01,0x83,0x0a,0x25,0x01,0x84,0x09,0x25,0x01,0x03,0x09,0x24, 0x00,0x08,0x24,0x00,0x09,0x24,0x01,0x83,0x08,0x23,0x01,0x01,0x09,0x23,0x01, 0x82,0x08,0x23,0x01,0x82,0x08,0x22,0x00,0x03,0x08,0x21,0x00,0x08,0x21,0x01, 0x08,0x21,0x00,0x82,0x08,0x21,0x01,0x82,0x08,0x20,0x01,0x01,0x07,0x20,0x00, 0x82,0x08,0x20,0x01,0x02,0x08,0x1f,0x01,0x08,0x20,0x01,0x82,0x07,0x1f,0x00, 0x82,0x07,0x1f,0x01,0x03,0x07,0x1e,0x00,0x06,0x1e,0x00,0x07,0x1d,0x00,0x82, 0x07,0x1e,0x00,0x84,0x06,0x1d,0x00,0x01,0x07,0x1d,0x00,0x84,0x06,0x1c,0x00, 0x01,0x07,0x1c,0x00,0x86,0x06,0x1b,0x00,0x83,0x06,0x1a,0x00,0x02,0x06,0x19, 0x00,0x06,0x1a,0x00,0x85,0x06,0x19,0x00,0x01,0x05,0x19,0x00,0x85,0x05,0x18, 0x00,0x87,0x05,0x17,0x00,0x01,0x04,0x16,0x00,0x83,0x05,0x16,0x00,0x82,0x04, 0x16,0x00,0x01,0x05,0x15,0x00,0x85,0x04,0x15,0x00,0x83,0x04,0x14,0x00,0x84, 0x04,0x13,0x00,0x02,0x04,0x12,0x00,0x03,0x12,0x00,0x84,0x04,0x12,0x00,0x01, 0x03,0x11,0x00,0x82,0x04,0x11,0x00,0x83,0x03,0x11,0x00,0x88,0x03,0x10,0x00, 0x87,0x03,0x0f,0x00,0x84,0x03,0x0e,0x00,0x01,0x02,0x0e,0x00,0x84,0x03,0x0e, 0x00,0x84,0x03,0x0d,0x00,0x83,0x03,0x0c,0x00,0x03,0x03,0x0d,0x00,0x04,0x0e, 0x00,0x04,0x0f,0x00,0x82,0x05,0x10,0x01,0x04,0x06,0x10,0x03,0x07,0x10,0x03, 0x07,0x10,0x04,0x06,0x0f,0x03,0x84,0x06,0x0e,0x03,0x02,0x06,0x0e,0x02,0x06, 0x0e,0x03,0x82,0x06,0x0d,0x02,0x02,0x05,0x0c,0x02,0x06,0x0c,0x02,0x83,0x05, 0x0c,0x02,0x83,0x04,0x0b,0x02,0x84,0x04,0x0a,0x02,0x82,0x04,0x09,0x02,0x82, 0x04,0x08,0x02,0x01,0x03,0x08,0x01,0x82,0x03,0x08,0x02,0x02,0x03,0x07,0x01, 0x03,0x06,0x01,0x84,0x02,0x06,0x01,0x02,0x02,0x05,0x01,0x02,0x04,0x00,0x83, 0x01,0x04,0x00,0x82,0x01,0x03,0x00,0x01,0x01,0x02,0x00,0x84,0x00,0x02,0x00, 0x83,0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x02,0x46,0x8f,0x17,0x45,0x90,0x17, 0x82,0x45,0x8f,0x16,0x82,0x45,0x90,0x17,0x04,0x44,0x8f,0x15,0x45,0x8f,0x15, 0x45,0x8e,0x15,0x44,0x8f,0x15,0x82,0x45,0x8f,0x16,0x82,0x45,0x8e,0x17,0x01, 0x43,0x8d,0x16,0x82,0x44,0x8f,0x15,0x82,0x44,0x8e,0x17,0x02,0x44,0x8d,0x16, 0x44,0x8e,0x17,0x82,0x43,0x8d,0x16,0x05,0x44,0x8e,0x17,0x44,0x8d,0x16,0x44, 0x8e,0x17,0x45,0x8e,0x17,0x45,0x8d,0x16,0x83,0x43,0x8d,0x15,0x01,0x42,0x8d, 0x15,0x83,0x43,0x8d,0x15,0x01,0x42,0x8c,0x15,0x83,0x43,0x8d,0x15,0x06,0x43, 0x8c,0x15,0x43,0x8d,0x16,0x43,0x8c,0x17,0x42,0x8b,0x15,0x42,0x8b,0x16,0x43, 0x8b,0x17,0x82,0x43,0x8b,0x16,0x01,0x41,0x8b,0x15,0x83,0x41,0x8b,0x16,0x05, 0x43,0x8c,0x17,0x43,0x8b,0x16,0x41,0x8a,0x15,0x41,0x8b,0x17,0x41,0x8b,0x16, 0x82,0x42,0x8b,0x17,0x82,0x41,0x89,0x16,0x08,0x42,0x8b,0x17,0x41,0x8b,0x17, 0x41,0x8a,0x17,0x42,0x8b,0x17,0x41,0x8b,0x19,0x41,0x8a,0x18,0x41,0x8b,0x19, 0x42,0x8a,0x1a,0x82,0x43,0x89,0x1a,0x08,0x42,0x8a,0x1a,0x42,0x8b,0x1a,0x42, 0x8a,0x1b,0x42,0x8a,0x1a,0x40,0x88,0x19,0x41,0x89,0x1a,0x43,0x8b,0x1c,0x43, 0x8a,0x1d,0x82,0x42,0x8a,0x1b,0x82,0x42,0x89,0x1c,0x82,0x41,0x88,0x1d,0x01, 0x42,0x89,0x1e,0x83,0x43,0x8a,0x1e,0x01,0x41,0x88,0x1d,0x82,0x42,0x89,0x1e, 0x01,0x43,0x88,0x1e,0x82,0x43,0x88,0x1f,0x83,0x43,0x87,0x1f,0x82,0x43,0x88, 0x20,0x02,0x44,0x88,0x20,0x43,0x88,0x20,0x82,0x43,0x87,0x1f,0x03,0x43,0x88, 0x21,0x42,0x88,0x20,0x43,0x88,0x20,0x82,0x43,0x86,0x20,0x01,0x42,0x86,0x20, 0x82,0x43,0x87,0x20,0x06,0x43,0x87,0x1f,0x43,0x88,0x21,0x43,0x87,0x20,0x43, 0x87,0x22,0x43,0x88,0x22,0x43,0x87,0x22,0x83,0x42,0x86,0x20,0x83,0x43,0x87, 0x20,0x06,0x41,0x87,0x20,0x43,0x87,0x20,0x43,0x88,0x21,0x43,0x87,0x20,0x42, 0x86,0x20,0x42,0x86,0x21,0x83,0x43,0x86,0x21,0x01,0x42,0x85,0x20,0x82,0x42, 0x85,0x1f,0x06,0x42,0x86,0x20,0x43,0x87,0x22,0x42,0x86,0x21,0x42,0x86,0x20, 0x43,0x86,0x21,0x41,0x86,0x20,0x82,0x42,0x86,0x21,0x01,0x41,0x86,0x20,0x83, 0x42,0x86,0x21,0x02,0x41,0x85,0x20,0x42,0x85,0x1f,0x82,0x42,0x86,0x21,0x05, 0x41,0x86,0x20,0x41,0x84,0x1f,0x43,0x86,0x21,0x42,0x85,0x20,0x41,0x84,0x20, 0x82,0x41,0x84,0x1f,0x02,0x41,0x84,0x20,0x42,0x85,0x20,0x83,0x3f,0x83,0x20, 0x03,0x40,0x83,0x20,0x41,0x84,0x20,0x41,0x84,0x1f,0x82,0x40,0x83,0x20,0x83, 0x3f,0x82,0x1f,0x05,0x40,0x83,0x20,0x3e,0x82,0x1e,0x3f,0x82,0x1f,0x3e,0x82, 0x1f,0x3e,0x82,0x1e,0x82,0x3f,0x83,0x20,0x01,0x3e,0x81,0x1e,0x82,0x3e,0x82, 0x20,0x02,0x3d,0x81,0x1f,0x3e,0x81,0x20,0x83,0x3d,0x80,0x1e,0x08,0x3e,0x80, 0x1f,0x3d,0x80,0x1e,0x3d,0x80,0x1d,0x3e,0x81,0x1e,0x3d,0x80,0x1d,0x3e,0x81, 0x1e,0x3c,0x80,0x1e,0x3d,0x80,0x1e,0x82,0x3c,0x7e,0x1e,0x82,0x3c,0x80,0x1e, 0x82,0x3c,0x7f,0x1e,0x09,0x3a,0x7e,0x1d,0x3b,0x7d,0x1d,0x3c,0x7f,0x1e,0x3c, 0x7e,0x1e,0x3b,0x7d,0x1d,0x3d,0x80,0x1f,0x3c,0x7e,0x1d,0x3c,0x7d,0x1c,0x3a, 0x7e,0x1c,0x82,0x3a,0x7c,0x1c,0x07,0x3a,0x7d,0x1c,0x3a,0x7c,0x1c,0x3a,0x7d, 0x1c,0x3b,0x7d,0x1d,0x3a,0x7d,0x1c,0x3a,0x7a,0x1a,0x3b,0x7b,0x1c,0x82,0x3a, 0x7c,0x1c,0x03,0x38,0x7a,0x1b,0x38,0x7b,0x1c,0x38,0x7b,0x1a,0x82,0x38,0x7a, 0x1a,0x19,0x37,0x79,0x19,0x38,0x7b,0x1a,0x36,0x7a,0x17,0x38,0x7c,0x1a,0x38, 0x7b,0x18,0x39,0x7d,0x1a,0x37,0x7b,0x1a,0x37,0x7b,0x19,0x39,0x7d,0x18,0x38, 0x7b,0x18,0x39,0x7d,0x18,0x36,0x7c,0x18,0x36,0x7b,0x1a,0x38,0x7d,0x17,0x36, 0x7a,0x17,0x34,0x77,0x16,0x36,0x79,0x16,0x39,0x7c,0x17,0x38,0x7c,0x19,0x35, 0x77,0x18,0x2b,0x6a,0x10,0x25,0x63,0x0e,0x1f,0x5d,0x08,0x1e,0x5b,0x07,0x1e, 0x5c,0x08,0x82,0x20,0x5d,0x09,0x14,0x1f,0x5d,0x08,0x1f,0x5e,0x09,0x1f,0x5d, 0x08,0x1e,0x5b,0x07,0x1e,0x5d,0x08,0x1e,0x5d,0x07,0x1e,0x5d,0x08,0x1f,0x5d, 0x08,0x1d,0x5b,0x06,0x1f,0x5d,0x08,0x20,0x5d,0x08,0x1e,0x5b,0x06,0x1e,0x5b, 0x07,0x1e,0x5d,0x07,0x1d,0x5c,0x06,0x1c,0x5b,0x06,0x1e,0x5c,0x07,0x1e,0x5b, 0x06,0x1e,0x5b,0x07,0x1d,0x5c,0x06,0x82,0x1c,0x5a,0x06,0x02,0x1c,0x5b,0x06, 0x1d,0x5b,0x06,0x82,0x1c,0x5a,0x06,0x05,0x1b,0x5a,0x05,0x1a,0x59,0x04,0x1a, 0x58,0x04,0x1c,0x59,0x05,0x1a,0x58,0x04,0x82,0x1b,0x59,0x04,0x01,0x1a,0x58, 0x04,0x82,0x1a,0x58,0x05,0x83,0x1a,0x57,0x05,0x02,0x1a,0x56,0x04,0x19,0x57, 0x04,0x82,0x1a,0x56,0x04,0x0d,0x1a,0x56,0x06,0x1a,0x56,0x04,0x1b,0x57,0x05, 0x1a,0x58,0x05,0x1a,0x56,0x04,0x1a,0x57,0x05,0x1a,0x58,0x05,0x18,0x55,0x03, 0x18,0x56,0x04,0x1a,0x57,0x05,0x19,0x55,0x04,0x19,0x55,0x05,0x18,0x54,0x04, 0x83,0x19,0x54,0x05,0x03,0x17,0x53,0x04,0x18,0x54,0x04,0x18,0x53,0x04,0x82, 0x18,0x53,0x05,0x05,0x18,0x52,0x05,0x17,0x52,0x04,0x17,0x52,0x03,0x18,0x52, 0x03,0x17,0x50,0x05,0x82,0x17,0x51,0x06,0x01,0x17,0x50,0x06,0x82,0x16,0x50, 0x05,0x82,0x15,0x4e,0x04,0x02,0x17,0x4e,0x04,0x17,0x4f,0x04,0x82,0x16,0x4e, 0x04,0x01,0x15,0x4e,0x04,0x82,0x16,0x4e,0x04,0x05,0x15,0x4e,0x04,0x16,0x4e, 0x04,0x15,0x4e,0x05,0x16,0x4c,0x05,0x16,0x4d,0x04,0x82,0x15,0x4c,0x04,0x07, 0x15,0x4d,0x04,0x15,0x4c,0x04,0x15,0x4d,0x04,0x15,0x4c,0x04,0x15,0x49,0x03, 0x15,0x4a,0x04,0x16,0x4b,0x05,0x82,0x15,0x49,0x04,0x01,0x15,0x4a,0x04,0x82, 0x15,0x49,0x04,0x02,0x14,0x49,0x04,0x15,0x49,0x04,0x83,0x15,0x48,0x04,0x01, 0x15,0x47,0x03,0x82,0x15,0x47,0x04,0x02,0x14,0x47,0x04,0x15,0x48,0x05,0x82, 0x15,0x47,0x04,0x03,0x14,0x45,0x03,0x13,0x45,0x04,0x13,0x46,0x02,0x82,0x13, 0x46,0x04,0x05,0x13,0x45,0x05,0x14,0x45,0x06,0x13,0x43,0x03,0x12,0x43,0x04, 0x13,0x43,0x03,0x82,0x13,0x43,0x04,0x01,0x13,0x43,0x03,0x82,0x13,0x43,0x04, 0x05,0x12,0x41,0x02,0x12,0x41,0x03,0x13,0x43,0x04,0x12,0x42,0x02,0x11,0x41, 0x02,0x82,0x12,0x41,0x04,0x82,0x11,0x41,0x03,0x0d,0x11,0x3f,0x04,0x13,0x3f, 0x04,0x11,0x40,0x04,0x11,0x3f,0x03,0x11,0x3f,0x02,0x11,0x3f,0x03,0x11,0x3e, 0x04,0x12,0x3d,0x04,0x10,0x3e,0x04,0x11,0x3c,0x02,0x12,0x3e,0x02,0x11,0x3e, 0x03,0x10,0x3c,0x02,0x82,0x11,0x3c,0x03,0x84,0x10,0x3c,0x03,0x03,0x11,0x3c, 0x03,0x11,0x3a,0x02,0x10,0x3b,0x02,0x82,0x0f,0x3b,0x02,0x06,0x0f,0x3a,0x03, 0x0f,0x39,0x03,0x10,0x39,0x02,0x10,0x3a,0x03,0x0f,0x37,0x01,0x11,0x38,0x02, 0x82,0x10,0x38,0x02,0x05,0x11,0x38,0x02,0x0f,0x37,0x02,0x0f,0x38,0x02,0x0f, 0x37,0x02,0x0e,0x36,0x02,0x82,0x0f,0x37,0x02,0x82,0x0e,0x36,0x02,0x08,0x0f, 0x36,0x02,0x0f,0x35,0x02,0x0e,0x36,0x02,0x0d,0x35,0x02,0x0e,0x34,0x02,0x0e, 0x35,0x02,0x0f,0x34,0x02,0x0e,0x33,0x02,0x83,0x0d,0x34,0x02,0x03,0x0d,0x32, 0x02,0x0e,0x33,0x02,0x0d,0x32,0x02,0x82,0x0d,0x31,0x02,0x03,0x0d,0x32,0x02, 0x0d,0x30,0x01,0x0e,0x31,0x02,0x85,0x0d,0x31,0x02,0x82,0x0c,0x30,0x02,0x02, 0x0d,0x31,0x02,0x0c,0x2f,0x01,0x82,0x0c,0x2f,0x02,0x0d,0x0b,0x2e,0x01,0x0b, 0x2f,0x01,0x0c,0x2f,0x02,0x0d,0x2f,0x01,0x0d,0x2e,0x02,0x0c,0x2e,0x02,0x0b, 0x2e,0x01,0x0b,0x2d,0x01,0x0b,0x2d,0x02,0x0b,0x2c,0x02,0x0c,0x2d,0x01,0x0c, 0x2d,0x02,0x0b,0x2d,0x02,0x82,0x0c,0x2c,0x01,0x82,0x0a,0x2a,0x01,0x05,0x0b, 0x2b,0x01,0x0b,0x2b,0x02,0x0b,0x2b,0x01,0x0a,0x2a,0x00,0x0a,0x2a,0x02,0x82, 0x0a,0x2a,0x01,0x05,0x0a,0x29,0x02,0x0a,0x29,0x01,0x0a,0x29,0x00,0x0a,0x2a, 0x01,0x0a,0x29,0x01,0x82,0x0a,0x29,0x02,0x01,0x0a,0x28,0x02,0x82,0x09,0x27, 0x01,0x01,0x09,0x27,0x02,0x82,0x0a,0x27,0x01,0x82,0x09,0x27,0x02,0x10,0x09, 0x27,0x01,0x08,0x26,0x01,0x09,0x25,0x01,0x09,0x25,0x00,0x09,0x25,0x01,0x0a, 0x25,0x01,0x09,0x24,0x01,0x09,0x25,0x01,0x09,0x24,0x01,0x08,0x24,0x00,0x08, 0x23,0x01,0x08,0x23,0x00,0x08,0x24,0x01,0x08,0x23,0x01,0x08,0x22,0x01,0x08, 0x23,0x01,0x83,0x08,0x22,0x01,0x03,0x08,0x22,0x00,0x08,0x21,0x01,0x08,0x22, 0x01,0x84,0x08,0x21,0x01,0x82,0x08,0x20,0x01,0x03,0x08,0x20,0x00,0x07,0x20, 0x01,0x07,0x1f,0x00,0x83,0x07,0x1f,0x01,0x83,0x07,0x1e,0x00,0x83,0x07,0x1e, 0x01,0x01,0x06,0x1d,0x00,0x82,0x07,0x1d,0x00,0x84,0x06,0x1c,0x00,0x82,0x07, 0x1c,0x00,0x03,0x06,0x1c,0x00,0x06,0x1b,0x00,0x06,0x1c,0x00,0x84,0x06,0x1b, 0x00,0x02,0x06,0x1a,0x00,0x05,0x1a,0x00,0x82,0x06,0x1a,0x00,0x08,0x06,0x19, 0x00,0x06,0x1a,0x00,0x06,0x19,0x00,0x06,0x1a,0x00,0x05,0x19,0x00,0x05,0x18, 0x00,0x06,0x19,0x00,0x05,0x19,0x00,0x82,0x05,0x18,0x00,0x87,0x05,0x17,0x00, 0x01,0x04,0x16,0x00,0x83,0x05,0x16,0x00,0x01,0x04,0x16,0x00,0x82,0x05,0x15, 0x00,0x87,0x04,0x15,0x00,0x01,0x04,0x14,0x00,0x88,0x04,0x13,0x00,0x83,0x04, 0x12,0x00,0x01,0x04,0x11,0x00,0x8a,0x03,0x11,0x00,0x83,0x03,0x10,0x00,0x88, 0x03,0x0f,0x00,0x88,0x03,0x0e,0x00,0x82,0x02,0x0d,0x00,0x83,0x03,0x0d,0x00, 0x01,0x02,0x0d,0x00,0x83,0x03,0x0d,0x00,0x01,0x04,0x0e,0x00,0x82,0x04,0x0f, 0x00,0x02,0x05,0x0f,0x01,0x06,0x0f,0x02,0x85,0x06,0x0f,0x03,0x82,0x06,0x0e, 0x02,0x82,0x06,0x0d,0x02,0x83,0x05,0x0d,0x02,0x82,0x05,0x0c,0x02,0x82,0x04, 0x0b,0x02,0x84,0x04,0x0a,0x02,0x83,0x04,0x09,0x02,0x01,0x04,0x08,0x02,0x84, 0x03,0x08,0x02,0x82,0x03,0x07,0x01,0x84,0x02,0x06,0x01,0x82,0x02,0x05,0x01, 0x82,0x02,0x04,0x00,0x01,0x01,0x04,0x00,0x82,0x01,0x03,0x00,0x01,0x01,0x02, 0x00,0x84,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x02,0x45, 0x91,0x15,0x45,0x8f,0x17,0x82,0x45,0x90,0x16,0x04,0x46,0x91,0x17,0x45,0x90, 0x18,0x45,0x90,0x16,0x45,0x91,0x16,0x82,0x45,0x91,0x18,0x04,0x44,0x90,0x17, 0x43,0x8e,0x16,0x44,0x8f,0x15,0x45,0x90,0x16,0x83,0x45,0x8f,0x16,0x03,0x44, 0x8f,0x16,0x43,0x8f,0x16,0x43,0x8e,0x16,0x82,0x44,0x8f,0x16,0x03,0x44,0x8f, 0x15,0x43,0x8f,0x15,0x44,0x8f,0x16,0x82,0x43,0x8e,0x16,0x84,0x43,0x8d,0x15, 0x03,0x43,0x8e,0x16,0x43,0x8d,0x15,0x44,0x8e,0x16,0x82,0x43,0x8e,0x16,0x01, 0x43,0x8d,0x15,0x82,0x43,0x8d,0x16,0x01,0x42,0x8b,0x15,0x82,0x43,0x8d,0x16, 0x0c,0x42,0x8d,0x16,0x43,0x8d,0x16,0x40,0x8b,0x14,0x43,0x8d,0x16,0x43,0x8c, 0x16,0x43,0x8d,0x16,0x43,0x8c,0x16,0x42,0x8b,0x16,0x41,0x8c,0x15,0x41,0x8c, 0x16,0x42,0x8d,0x16,0x41,0x8c,0x16,0x82,0x42,0x8d,0x16,0x08,0x43,0x8d,0x18, 0x42,0x8b,0x17,0x42,0x8c,0x18,0x40,0x8b,0x15,0x43,0x8c,0x16,0x42,0x8b,0x17, 0x42,0x8c,0x18,0x41,0x8b,0x17,0x82,0x41,0x8a,0x18,0x83,0x42,0x8a,0x18,0x82, 0x43,0x8a,0x1a,0x03,0x42,0x8a,0x1a,0x42,0x8c,0x1a,0x42,0x8a,0x1a,0x82,0x41, 0x8a,0x1a,0x0f,0x44,0x8a,0x1b,0x45,0x8b,0x1c,0x44,0x8a,0x1b,0x43,0x89,0x1c, 0x43,0x8a,0x1d,0x43,0x8b,0x1b,0x42,0x8a,0x1c,0x43,0x8a,0x1e,0x42,0x8a,0x1c, 0x42,0x8a,0x1d,0x43,0x89,0x1f,0x43,0x88,0x1d,0x41,0x89,0x1e,0x43,0x8a,0x1f, 0x44,0x8a,0x1f,0x83,0x43,0x89,0x1f,0x82,0x43,0x88,0x1f,0x02,0x43,0x88,0x21, 0x42,0x89,0x1f,0x82,0x43,0x88,0x1f,0x09,0x44,0x89,0x20,0x43,0x88,0x1f,0x43, 0x87,0x20,0x44,0x89,0x21,0x43,0x89,0x23,0x43,0x8a,0x21,0x41,0x88,0x20,0x43, 0x88,0x20,0x43,0x86,0x1f,0x82,0x43,0x88,0x1f,0x01,0x43,0x87,0x20,0x83,0x43, 0x88,0x20,0x01,0x43,0x88,0x21,0x82,0x43,0x86,0x1f,0x0a,0x44,0x88,0x21,0x43, 0x88,0x20,0x41,0x88,0x20,0x43,0x88,0x22,0x43,0x86,0x1f,0x44,0x88,0x21,0x43, 0x86,0x21,0x43,0x88,0x21,0x43,0x88,0x20,0x43,0x88,0x21,0x82,0x41,0x88,0x20, 0x05,0x42,0x87,0x1f,0x43,0x88,0x21,0x42,0x87,0x21,0x43,0x86,0x21,0x41,0x86, 0x20,0x82,0x43,0x88,0x21,0x01,0x41,0x86,0x20,0x82,0x43,0x87,0x21,0x0d,0x43, 0x86,0x21,0x43,0x86,0x1f,0x42,0x87,0x21,0x41,0x88,0x21,0x43,0x86,0x21,0x41, 0x86,0x20,0x43,0x88,0x21,0x42,0x86,0x22,0x41,0x86,0x20,0x43,0x88,0x21,0x42, 0x86,0x21,0x42,0x86,0x20,0x42,0x87,0x1f,0x82,0x42,0x87,0x21,0x82,0x40,0x86, 0x1f,0x02,0x41,0x86,0x20,0x40,0x86,0x1f,0x82,0x41,0x86,0x20,0x82,0x40,0x86, 0x1f,0x83,0x40,0x85,0x1f,0x03,0x40,0x85,0x21,0x3e,0x85,0x20,0x3f,0x84,0x1f, 0x82,0x40,0x84,0x1f,0x0e,0x3f,0x83,0x1f,0x3f,0x82,0x20,0x3e,0x83,0x1f,0x3e, 0x82,0x1e,0x3e,0x83,0x1f,0x3f,0x84,0x1f,0x3f,0x83,0x1f,0x40,0x84,0x1f,0x3f, 0x83,0x1f,0x3e,0x82,0x1e,0x3e,0x81,0x1d,0x3f,0x82,0x20,0x3e,0x83,0x20,0x3c, 0x7f,0x1d,0x83,0x3e,0x81,0x1f,0x0a,0x3d,0x80,0x1e,0x3e,0x81,0x1f,0x3c,0x81, 0x1e,0x3e,0x82,0x1f,0x3d,0x81,0x1f,0x3e,0x81,0x1f,0x3d,0x80,0x1e,0x3e,0x81, 0x1f,0x3d,0x80,0x1e,0x3e,0x81,0x1f,0x82,0x3d,0x80,0x1e,0x04,0x3c,0x80,0x1e, 0x3b,0x7e,0x1d,0x3c,0x7f,0x1d,0x3d,0x80,0x1e,0x83,0x3c,0x7f,0x1d,0x05,0x3c, 0x80,0x1d,0x3c,0x7f,0x1e,0x3c,0x7f,0x1d,0x3c,0x7f,0x1e,0x3c,0x7f,0x1d,0x82, 0x3b,0x7e,0x1d,0x02,0x3c,0x7f,0x1d,0x3a,0x7d,0x1b,0x83,0x39,0x7c,0x1a,0x01, 0x3a,0x7d,0x1b,0x82,0x39,0x7c,0x1a,0x01,0x3a,0x7d,0x1a,0x84,0x38,0x7b,0x19, 0x02,0x39,0x7c,0x1a,0x38,0x7d,0x1a,0x82,0x3a,0x7e,0x1b,0x21,0x38,0x7c,0x18, 0x3a,0x7e,0x1a,0x39,0x7e,0x18,0x38,0x7d,0x1a,0x3a,0x7f,0x17,0x39,0x7d,0x19, 0x38,0x7d,0x17,0x3a,0x7d,0x18,0x38,0x7b,0x19,0x37,0x7a,0x1a,0x38,0x79,0x17, 0x35,0x79,0x16,0x36,0x7b,0x16,0x39,0x7d,0x18,0x3a,0x7d,0x1b,0x3a,0x7e,0x1a, 0x31,0x74,0x12,0x2c,0x6c,0x11,0x23,0x61,0x0b,0x1e,0x5c,0x07,0x1d,0x5b,0x06, 0x1f,0x5c,0x08,0x1f,0x5e,0x08,0x20,0x5e,0x09,0x1f,0x5c,0x09,0x1f,0x5e,0x08, 0x1f,0x5d,0x08,0x1f,0x5e,0x08,0x20,0x5e,0x08,0x1f,0x5d,0x07,0x1d,0x5b,0x06, 0x1e,0x5e,0x07,0x1f,0x5e,0x08,0x82,0x1e,0x5c,0x07,0x02,0x1e,0x5d,0x05,0x1f, 0x5e,0x06,0x82,0x1d,0x5b,0x06,0x05,0x1e,0x5c,0x06,0x1e,0x5c,0x07,0x1f,0x5d, 0x08,0x1d,0x5b,0x06,0x1d,0x5c,0x06,0x82,0x1c,0x5b,0x06,0x09,0x1b,0x5b,0x04, 0x1c,0x5b,0x05,0x1b,0x5b,0x04,0x1c,0x5a,0x05,0x1b,0x59,0x04,0x1a,0x59,0x04, 0x1c,0x59,0x06,0x1a,0x57,0x04,0x1b,0x59,0x04,0x82,0x1a,0x58,0x05,0x03,0x1a, 0x57,0x04,0x19,0x58,0x04,0x1a,0x59,0x05,0x83,0x1a,0x57,0x04,0x82,0x19,0x57, 0x04,0x01,0x18,0x57,0x04,0x84,0x1a,0x57,0x04,0x03,0x19,0x57,0x04,0x1a,0x57, 0x04,0x19,0x57,0x04,0x82,0x1a,0x57,0x04,0x04,0x19,0x56,0x05,0x19,0x55,0x04, 0x18,0x54,0x02,0x18,0x55,0x03,0x83,0x18,0x54,0x04,0x01,0x17,0x52,0x04,0x82, 0x18,0x54,0x05,0x82,0x18,0x52,0x04,0x04,0x18,0x51,0x04,0x18,0x52,0x06,0x19, 0x52,0x06,0x18,0x52,0x06,0x83,0x17,0x51,0x04,0x82,0x16,0x50,0x04,0x82,0x17, 0x4f,0x04,0x01,0x18,0x4f,0x06,0x82,0x17,0x4e,0x04,0x08,0x17,0x4e,0x05,0x16, 0x4d,0x04,0x17,0x4e,0x04,0x15,0x4e,0x03,0x16,0x4e,0x05,0x15,0x4c,0x02,0x16, 0x4d,0x04,0x16,0x4d,0x05,0x82,0x15,0x4c,0x04,0x82,0x16,0x4c,0x04,0x83,0x15, 0x4c,0x04,0x03,0x16,0x4c,0x04,0x14,0x4b,0x04,0x14,0x49,0x04,0x82,0x15,0x49, 0x04,0x0c,0x15,0x4a,0x04,0x14,0x49,0x03,0x15,0x4a,0x04,0x15,0x49,0x04,0x14, 0x49,0x04,0x14,0x48,0x03,0x16,0x49,0x03,0x14,0x47,0x04,0x14,0x47,0x03,0x15, 0x48,0x02,0x14,0x47,0x04,0x15,0x47,0x04,0x82,0x14,0x47,0x04,0x14,0x16,0x47, 0x03,0x14,0x47,0x03,0x14,0x46,0x03,0x14,0x47,0x04,0x14,0x46,0x04,0x15,0x45, 0x04,0x14,0x45,0x04,0x13,0x45,0x04,0x12,0x45,0x02,0x14,0x44,0x02,0x14,0x43, 0x02,0x13,0x43,0x02,0x13,0x44,0x02,0x14,0x43,0x02,0x13,0x43,0x02,0x12,0x43, 0x03,0x12,0x42,0x03,0x12,0x44,0x04,0x13,0x41,0x02,0x13,0x42,0x04,0x82,0x11, 0x40,0x04,0x82,0x11,0x40,0x02,0x82,0x12,0x40,0x03,0x82,0x11,0x40,0x03,0x02, 0x11,0x3f,0x02,0x11,0x3e,0x03,0x83,0x11,0x3f,0x04,0x14,0x11,0x3e,0x02,0x11, 0x3e,0x04,0x10,0x3e,0x03,0x10,0x3d,0x03,0x11,0x3c,0x03,0x10,0x3c,0x03,0x11, 0x3d,0x04,0x11,0x3c,0x03,0x11,0x3c,0x02,0x12,0x3d,0x02,0x11,0x3c,0x04,0x0f, 0x3c,0x03,0x11,0x3a,0x03,0x0f,0x3a,0x03,0x0f,0x3b,0x03,0x0f,0x3c,0x01,0x10, 0x3a,0x02,0x0f,0x3b,0x02,0x0f,0x3a,0x02,0x0f,0x3a,0x03,0x82,0x0f,0x3a,0x02, 0x82,0x0f,0x39,0x02,0x05,0x10,0x39,0x03,0x0f,0x38,0x01,0x0f,0x39,0x03,0x0f, 0x38,0x04,0x0e,0x38,0x02,0x83,0x0e,0x37,0x02,0x03,0x0d,0x37,0x02,0x0f,0x37, 0x02,0x0e,0x36,0x02,0x84,0x0e,0x35,0x02,0x02,0x0f,0x35,0x02,0x0f,0x34,0x02, 0x82,0x0d,0x34,0x02,0x02,0x0c,0x33,0x00,0x0d,0x34,0x02,0x82,0x0d,0x33,0x02, 0x82,0x0d,0x32,0x02,0x02,0x0d,0x31,0x01,0x0d,0x32,0x02,0x85,0x0d,0x31,0x02, 0x06,0x0d,0x30,0x02,0x0c,0x30,0x02,0x0d,0x31,0x02,0x0d,0x30,0x02,0x0c,0x2f, 0x02,0x0c,0x30,0x02,0x82,0x0d,0x2f,0x01,0x01,0x0c,0x2f,0x02,0x82,0x0c,0x2f, 0x01,0x07,0x0b,0x2e,0x01,0x0d,0x2f,0x02,0x0b,0x2e,0x02,0x0c,0x2d,0x01,0x0b, 0x2d,0x01,0x0b,0x2d,0x02,0x0c,0x2d,0x01,0x82,0x0c,0x2c,0x01,0x83,0x0b,0x2c, 0x01,0x04,0x0c,0x2c,0x02,0x0b,0x2c,0x01,0x0c,0x2c,0x02,0x0b,0x2a,0x00,0x83, 0x0b,0x2a,0x01,0x01,0x0b,0x2a,0x02,0x82,0x0b,0x29,0x01,0x07,0x0a,0x2a,0x02, 0x0b,0x29,0x02,0x0b,0x28,0x02,0x0b,0x29,0x01,0x0a,0x28,0x01,0x0b,0x29,0x02, 0x0a,0x29,0x02,0x82,0x0a,0x28,0x01,0x04,0x09,0x28,0x01,0x0a,0x27,0x00,0x0a, 0x27,0x01,0x0a,0x27,0x02,0x83,0x09,0x26,0x01,0x82,0x08,0x26,0x02,0x0f,0x0a, 0x26,0x00,0x08,0x26,0x01,0x09,0x25,0x01,0x08,0x24,0x00,0x09,0x23,0x01,0x09, 0x24,0x02,0x09,0x23,0x00,0x08,0x23,0x00,0x09,0x23,0x01,0x08,0x23,0x00,0x08, 0x23,0x01,0x08,0x23,0x02,0x08,0x22,0x01,0x08,0x23,0x02,0x08,0x22,0x00,0x82, 0x08,0x22,0x01,0x83,0x08,0x21,0x00,0x04,0x08,0x21,0x01,0x08,0x21,0x00,0x08, 0x20,0x01,0x07,0x20,0x01,0x85,0x08,0x1f,0x01,0x03,0x07,0x1f,0x01,0x06,0x1f, 0x00,0x07,0x1f,0x01,0x82,0x08,0x1f,0x01,0x03,0x07,0x1e,0x00,0x07,0x1e,0x01, 0x07,0x1d,0x00,0x86,0x06,0x1d,0x00,0x01,0x06,0x1c,0x00,0x82,0x06,0x1b,0x00, 0x01,0x06,0x1c,0x01,0x82,0x06,0x1b,0x00,0x86,0x06,0x1a,0x00,0x82,0x06,0x19, 0x00,0x83,0x06,0x18,0x00,0x86,0x05,0x18,0x00,0x01,0x05,0x17,0x00,0x83,0x04, 0x17,0x00,0x02,0x05,0x17,0x00,0x04,0x17,0x00,0x87,0x04,0x16,0x00,0x84,0x04, 0x15,0x00,0x88,0x04,0x14,0x00,0x84,0x04,0x13,0x00,0x83,0x04,0x12,0x00,0x03, 0x04,0x11,0x00,0x03,0x11,0x00,0x04,0x11,0x00,0x83,0x03,0x11,0x00,0x02,0x03, 0x10,0x00,0x03,0x11,0x00,0x83,0x03,0x10,0x00,0x85,0x03,0x0f,0x00,0x01,0x02, 0x0f,0x00,0x83,0x03,0x0f,0x00,0x01,0x02,0x0e,0x00,0x82,0x03,0x0e,0x00,0x03, 0x02,0x0d,0x00,0x03,0x0e,0x00,0x03,0x0d,0x00,0x85,0x02,0x0d,0x00,0x82,0x03, 0x0d,0x00,0x0c,0x02,0x0d,0x00,0x03,0x0d,0x00,0x02,0x0d,0x00,0x02,0x0c,0x00, 0x03,0x0c,0x00,0x02,0x0b,0x00,0x02,0x0c,0x00,0x03,0x0d,0x00,0x04,0x0e,0x00, 0x04,0x0f,0x00,0x04,0x0f,0x01,0x05,0x0f,0x02,0x82,0x06,0x0f,0x03,0x82,0x06, 0x0e,0x03,0x03,0x06,0x0d,0x02,0x06,0x0d,0x03,0x06,0x0d,0x02,0x83,0x05,0x0d, 0x02,0x82,0x05,0x0c,0x02,0x01,0x05,0x0b,0x02,0x84,0x04,0x0b,0x02,0x82,0x04, 0x0a,0x02,0x82,0x04,0x09,0x02,0x82,0x04,0x08,0x02,0x82,0x03,0x08,0x02,0x83, 0x03,0x07,0x01,0x84,0x02,0x06,0x01,0x82,0x02,0x05,0x01,0x84,0x02,0x04,0x00, 0x82,0x01,0x03,0x00,0x84,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xdc,0x00,0x00, 0x00,0x09,0x45,0x93,0x15,0x45,0x91,0x17,0x45,0x91,0x16,0x45,0x8f,0x14,0x46, 0x91,0x16,0x47,0x91,0x17,0x46,0x92,0x17,0x45,0x91,0x16,0x45,0x90,0x17,0x82, 0x45,0x91,0x17,0x82,0x44,0x8f,0x16,0x01,0x45,0x91,0x15,0x82,0x45,0x91,0x16, 0x02,0x46,0x91,0x17,0x45,0x91,0x17,0x82,0x44,0x91,0x17,0x83,0x44,0x8f,0x16, 0x0a,0x44,0x91,0x15,0x44,0x8f,0x16,0x43,0x8f,0x15,0x44,0x8f,0x15,0x43,0x8f, 0x15,0x44,0x8f,0x16,0x44,0x8f,0x15,0x43,0x8e,0x14,0x43,0x8f,0x15,0x44,0x8f, 0x15,0x84,0x43,0x8f,0x15,0x02,0x43,0x8e,0x16,0x43,0x8f,0x17,0x85,0x43,0x8e, 0x16,0x01,0x41,0x8d,0x14,0x82,0x42,0x8d,0x15,0x04,0x43,0x8d,0x16,0x43,0x8e, 0x17,0x42,0x8d,0x16,0x43,0x8e,0x16,0x82,0x43,0x8e,0x17,0x09,0x41,0x8d,0x15, 0x42,0x8d,0x16,0x41,0x8d,0x15,0x42,0x8d,0x16,0x41,0x8c,0x17,0x42,0x8d,0x17, 0x43,0x8d,0x18,0x43,0x8d,0x16,0x43,0x8d,0x18,0x82,0x43,0x8d,0x17,0x09,0x43, 0x8d,0x19,0x43,0x8c,0x19,0x42,0x8b,0x18,0x42,0x8d,0x19,0x41,0x8c,0x18,0x43, 0x8c,0x19,0x43,0x8c,0x1a,0x42,0x8b,0x1a,0x43,0x8e,0x1b,0x82,0x43,0x8d,0x1b, 0x84,0x43,0x8c,0x1b,0x0b,0x42,0x8a,0x1b,0x43,0x8a,0x1b,0x43,0x8b,0x1e,0x43, 0x8b,0x1c,0x43,0x8d,0x1b,0x43,0x8b,0x1c,0x42,0x8a,0x1d,0x43,0x8b,0x1e,0x44, 0x8a,0x1f,0x42,0x8a,0x1e,0x44,0x8a,0x1f,0x82,0x45,0x8b,0x20,0x82,0x43,0x8a, 0x1e,0x82,0x43,0x89,0x1f,0x02,0x42,0x8a,0x1f,0x43,0x89,0x1f,0x82,0x42,0x8a, 0x1f,0x82,0x44,0x8a,0x20,0x03,0x43,0x8a,0x20,0x43,0x89,0x20,0x43,0x8a,0x21, 0x82,0x43,0x89,0x20,0x82,0x44,0x8a,0x21,0x07,0x44,0x88,0x20,0x43,0x89,0x20, 0x44,0x8a,0x21,0x43,0x89,0x20,0x42,0x88,0x1f,0x43,0x88,0x20,0x43,0x89,0x20, 0x82,0x43,0x88,0x20,0x82,0x43,0x89,0x20,0x02,0x43,0x88,0x22,0x43,0x88,0x20, 0x82,0x43,0x88,0x21,0x03,0x43,0x88,0x20,0x43,0x89,0x20,0x43,0x89,0x22,0x82, 0x43,0x88,0x20,0x02,0x43,0x89,0x20,0x43,0x89,0x22,0x82,0x42,0x88,0x20,0x01, 0x43,0x89,0x22,0x82,0x43,0x88,0x21,0x82,0x42,0x88,0x20,0x03,0x43,0x88,0x21, 0x43,0x87,0x20,0x41,0x87,0x20,0x82,0x42,0x88,0x20,0x02,0x42,0x89,0x22,0x41, 0x87,0x20,0x82,0x42,0x88,0x20,0x0b,0x41,0x86,0x20,0x42,0x86,0x20,0x43,0x87, 0x20,0x40,0x86,0x20,0x43,0x88,0x21,0x42,0x88,0x1f,0x42,0x88,0x20,0x43,0x88, 0x21,0x41,0x86,0x1f,0x40,0x85,0x20,0x41,0x87,0x20,0x82,0x42,0x88,0x20,0x05, 0x41,0x86,0x1f,0x40,0x86,0x1f,0x41,0x86,0x21,0x40,0x85,0x20,0x40,0x86,0x20, 0x82,0x41,0x86,0x21,0x01,0x3f,0x84,0x1f,0x82,0x40,0x85,0x20,0x07,0x41,0x86, 0x20,0x40,0x85,0x20,0x3f,0x84,0x1f,0x3e,0x83,0x1e,0x3f,0x84,0x1f,0x40,0x86, 0x20,0x3f,0x84,0x1f,0x82,0x40,0x84,0x1f,0x82,0x40,0x83,0x20,0x06,0x3e,0x81, 0x1e,0x3e,0x82,0x1f,0x3f,0x84,0x20,0x3e,0x81,0x1e,0x3e,0x82,0x1f,0x3e,0x81, 0x1e,0x83,0x3e,0x82,0x1f,0x04,0x3d,0x81,0x1e,0x3e,0x81,0x1e,0x3e,0x83,0x1f, 0x3e,0x82,0x1f,0x83,0x3d,0x81,0x1e,0x01,0x3e,0x81,0x1e,0x82,0x3c,0x80,0x1d, 0x82,0x3e,0x81,0x1f,0x82,0x3c,0x80,0x1e,0x83,0x3d,0x81,0x1e,0x01,0x3c,0x80, 0x1e,0x82,0x3b,0x7f,0x1c,0x02,0x3d,0x81,0x1e,0x3c,0x80,0x1e,0x82,0x3b,0x7f, 0x1c,0x03,0x3c,0x7f,0x1d,0x3a,0x7e,0x1b,0x3b,0x7f,0x1c,0x84,0x3a,0x7e,0x1b, 0x01,0x39,0x7d,0x1b,0x82,0x3b,0x7f,0x1b,0x01,0x38,0x7c,0x19,0x82,0x39,0x7d, 0x1a,0x02,0x3a,0x7e,0x1b,0x3a,0x7f,0x1b,0x82,0x38,0x7d,0x19,0x09,0x39,0x7e, 0x19,0x3b,0x80,0x1b,0x39,0x7f,0x18,0x3c,0x81,0x1a,0x39,0x7f,0x18,0x39,0x7f, 0x19,0x38,0x7e,0x17,0x37,0x7c,0x18,0x39,0x7d,0x17,0x82,0x37,0x7c,0x17,0x0f, 0x39,0x7f,0x17,0x37,0x7c,0x17,0x37,0x7c,0x19,0x38,0x7d,0x18,0x37,0x7c,0x19, 0x3a,0x7f,0x1c,0x3a,0x80,0x19,0x39,0x7b,0x18,0x34,0x78,0x17,0x29,0x6c,0x0e, 0x22,0x61,0x0b,0x1e,0x5c,0x08,0x1d,0x5b,0x07,0x20,0x5d,0x09,0x1f,0x5f,0x08, 0x82,0x20,0x5f,0x09,0x01,0x20,0x5e,0x09,0x82,0x1e,0x5d,0x07,0x06,0x1f,0x5e, 0x07,0x20,0x60,0x07,0x20,0x5f,0x09,0x1e,0x5d,0x07,0x1e,0x5c,0x08,0x1e,0x5c, 0x06,0x82,0x1e,0x5e,0x06,0x06,0x1d,0x5c,0x05,0x1e,0x5d,0x07,0x1f,0x5e,0x07, 0x1e,0x5d,0x06,0x1e,0x5d,0x07,0x1b,0x5c,0x05,0x82,0x1d,0x5d,0x06,0x82,0x1c, 0x5c,0x06,0x82,0x1c,0x5b,0x05,0x05,0x1b,0x5a,0x04,0x1c,0x5a,0x06,0x1b,0x59, 0x05,0x1b,0x5a,0x04,0x1a,0x59,0x03,0x83,0x1a,0x58,0x04,0x01,0x19,0x58,0x04, 0x83,0x19,0x57,0x04,0x05,0x1a,0x58,0x04,0x19,0x57,0x04,0x19,0x59,0x06,0x19, 0x57,0x03,0x19,0x57,0x04,0x83,0x19,0x57,0x05,0x0c,0x19,0x57,0x04,0x1a,0x58, 0x04,0x19,0x57,0x02,0x19,0x57,0x04,0x19,0x56,0x04,0x19,0x55,0x06,0x18,0x55, 0x04,0x19,0x55,0x04,0x19,0x55,0x03,0x19,0x55,0x04,0x18,0x55,0x04,0x17,0x53, 0x04,0x82,0x19,0x55,0x05,0x82,0x17,0x53,0x04,0x05,0x18,0x52,0x04,0x19,0x53, 0x04,0x19,0x50,0x04,0x19,0x51,0x04,0x17,0x51,0x04,0x82,0x17,0x50,0x04,0x0c, 0x18,0x51,0x04,0x18,0x50,0x04,0x19,0x50,0x04,0x17,0x50,0x05,0x17,0x50,0x04, 0x17,0x4d,0x04,0x17,0x4e,0x04,0x17,0x4f,0x04,0x17,0x4f,0x05,0x17,0x4f,0x06, 0x17,0x4e,0x04,0x17,0x4f,0x06,0x82,0x16,0x4d,0x04,0x06,0x16,0x4e,0x05,0x15, 0x4d,0x04,0x16,0x4e,0x05,0x17,0x4d,0x05,0x17,0x4c,0x05,0x16,0x4d,0x04,0x82, 0x16,0x4c,0x04,0x03,0x15,0x4c,0x04,0x15,0x4b,0x04,0x15,0x4a,0x04,0x82,0x16, 0x4b,0x04,0x83,0x16,0x4a,0x04,0x16,0x15,0x4a,0x04,0x14,0x4a,0x04,0x14,0x49, 0x03,0x15,0x4a,0x03,0x14,0x48,0x04,0x17,0x48,0x04,0x14,0x49,0x02,0x14,0x48, 0x04,0x14,0x49,0x04,0x14,0x48,0x04,0x14,0x47,0x04,0x14,0x48,0x02,0x17,0x47, 0x05,0x14,0x47,0x02,0x13,0x47,0x02,0x14,0x47,0x04,0x15,0x45,0x04,0x13,0x45, 0x03,0x13,0x46,0x04,0x14,0x45,0x02,0x13,0x43,0x02,0x13,0x44,0x03,0x82,0x14, 0x45,0x04,0x02,0x13,0x44,0x02,0x13,0x43,0x03,0x82,0x12,0x43,0x03,0x05,0x12, 0x44,0x04,0x14,0x43,0x03,0x13,0x43,0x04,0x12,0x41,0x04,0x12,0x42,0x04,0x82, 0x12,0x41,0x02,0x01,0x12,0x40,0x02,0x83,0x12,0x41,0x03,0x03,0x12,0x40,0x03, 0x11,0x40,0x02,0x12,0x40,0x04,0x82,0x11,0x3f,0x04,0x82,0x12,0x3f,0x03,0x09, 0x12,0x3f,0x04,0x11,0x3e,0x03,0x10,0x3e,0x03,0x11,0x3d,0x03,0x12,0x3e,0x03, 0x11,0x3c,0x03,0x10,0x3c,0x02,0x12,0x3c,0x02,0x10,0x3d,0x03,0x82,0x10,0x3c, 0x02,0x82,0x10,0x3c,0x03,0x04,0x10,0x3c,0x02,0x0f,0x3a,0x02,0x10,0x3b,0x02, 0x0f,0x3a,0x02,0x82,0x10,0x3a,0x02,0x04,0x10,0x3a,0x03,0x10,0x39,0x02,0x0f, 0x39,0x02,0x10,0x39,0x02,0x82,0x0f,0x39,0x02,0x01,0x0e,0x38,0x02,0x83,0x10, 0x37,0x02,0x03,0x0e,0x37,0x02,0x0f,0x37,0x02,0x0e,0x37,0x01,0x82,0x0e,0x37, 0x02,0x01,0x0d,0x35,0x02,0x82,0x0e,0x35,0x02,0x82,0x0f,0x35,0x02,0x82,0x0d, 0x35,0x02,0x85,0x0d,0x33,0x02,0x03,0x0e,0x33,0x02,0x0d,0x32,0x02,0x0c,0x32, 0x01,0x82,0x0d,0x32,0x02,0x82,0x0d,0x31,0x01,0x82,0x0d,0x31,0x02,0x03,0x0b, 0x30,0x01,0x0d,0x31,0x02,0x0d,0x30,0x02,0x83,0x0c,0x30,0x02,0x04,0x0c,0x30, 0x01,0x0b,0x2f,0x01,0x0c,0x2e,0x01,0x0c,0x2f,0x01,0x82,0x0d,0x2f,0x02,0x03, 0x0d,0x2e,0x01,0x0d,0x2f,0x02,0x0c,0x2e,0x02,0x82,0x0c,0x2e,0x01,0x04,0x0c, 0x2d,0x01,0x0b,0x2d,0x01,0x0c,0x2e,0x02,0x0b,0x2d,0x02,0x83,0x0b,0x2c,0x01, 0x02,0x0b,0x2b,0x01,0x0b,0x2b,0x02,0x82,0x0b,0x2b,0x01,0x05,0x0a,0x2b,0x01, 0x0b,0x2b,0x01,0x0a,0x2a,0x02,0x09,0x29,0x00,0x0a,0x29,0x02,0x82,0x0b,0x29, 0x02,0x82,0x0b,0x29,0x01,0x82,0x0a,0x29,0x01,0x0f,0x0a,0x27,0x01,0x09,0x28, 0x01,0x0b,0x28,0x01,0x0b,0x27,0x01,0x0a,0x28,0x01,0x09,0x27,0x01,0x09,0x27, 0x00,0x09,0x26,0x01,0x09,0x27,0x01,0x0a,0x26,0x01,0x09,0x25,0x00,0x09,0x26, 0x00,0x0a,0x25,0x01,0x09,0x25,0x01,0x09,0x25,0x00,0x82,0x09,0x25,0x01,0x09, 0x09,0x25,0x02,0x09,0x24,0x02,0x09,0x24,0x01,0x08,0x23,0x00,0x09,0x23,0x00, 0x09,0x23,0x01,0x09,0x22,0x00,0x09,0x23,0x00,0x09,0x22,0x01,0x83,0x08,0x22, 0x00,0x83,0x09,0x22,0x01,0x01,0x08,0x21,0x01,0x83,0x08,0x20,0x01,0x82,0x07, 0x20,0x01,0x82,0x08,0x20,0x01,0x83,0x07,0x1f,0x01,0x01,0x07,0x1e,0x01,0x82, 0x07,0x1e,0x00,0x05,0x07,0x1e,0x01,0x07,0x1e,0x00,0x06,0x1e,0x00,0x07,0x1e, 0x01,0x06,0x1e,0x00,0x83,0x06,0x1d,0x00,0x82,0x06,0x1c,0x00,0x85,0x06,0x1b, 0x00,0x01,0x06,0x1a,0x00,0x82,0x06,0x1b,0x00,0x02,0x05,0x1a,0x00,0x06,0x1a, 0x00,0x86,0x06,0x19,0x00,0x04,0x05,0x19,0x00,0x06,0x19,0x00,0x05,0x19,0x00, 0x05,0x18,0x00,0x83,0x05,0x17,0x00,0x82,0x04,0x17,0x00,0x84,0x05,0x17,0x00, 0x01,0x04,0x16,0x00,0x82,0x04,0x17,0x00,0x01,0x04,0x16,0x00,0x82,0x04,0x15, 0x00,0x02,0x05,0x15,0x00,0x04,0x15,0x00,0x8a,0x04,0x14,0x00,0x82,0x04,0x13, 0x00,0x83,0x04,0x12,0x00,0x01,0x03,0x12,0x00,0x83,0x04,0x12,0x00,0x83,0x03, 0x11,0x00,0x89,0x03,0x10,0x00,0x06,0x03,0x0f,0x00,0x02,0x0f,0x00,0x03,0x0f, 0x00,0x02,0x0f,0x00,0x03,0x0e,0x00,0x02,0x0e,0x00,0x82,0x03,0x0e,0x00,0x88, 0x02,0x0d,0x00,0x01,0x03,0x0d,0x00,0x83,0x02,0x0d,0x00,0x04,0x03,0x0d,0x00, 0x02,0x0d,0x00,0x03,0x0c,0x00,0x02,0x0c,0x00,0x83,0x02,0x0b,0x00,0x01,0x02, 0x0c,0x00,0x82,0x04,0x0d,0x00,0x03,0x04,0x0e,0x00,0x04,0x0e,0x02,0x06,0x0e, 0x02,0x82,0x06,0x0e,0x03,0x83,0x06,0x0d,0x02,0x82,0x05,0x0d,0x02,0x01,0x05, 0x0c,0x02,0x82,0x05,0x0b,0x02,0x83,0x04,0x0b,0x02,0x83,0x04,0x0a,0x02,0x84, 0x04,0x09,0x02,0x02,0x03,0x08,0x01,0x03,0x08,0x02,0x83,0x03,0x07,0x01,0x84, 0x02,0x06,0x01,0x82,0x02,0x05,0x01,0x83,0x02,0x04,0x00,0x82,0x01,0x04,0x00, 0x82,0x01,0x03,0x00,0x83,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xdc,0x00,0x00, 0x00,0x06,0x46,0x93,0x15,0x46,0x92,0x17,0x46,0x93,0x16,0x45,0x92,0x15,0x45, 0x93,0x17,0x46,0x92,0x17,0x82,0x46,0x91,0x15,0x02,0x45,0x91,0x17,0x45,0x91, 0x16,0x82,0x45,0x91,0x17,0x01,0x45,0x91,0x16,0x82,0x44,0x90,0x15,0x05,0x45, 0x91,0x16,0x45,0x91,0x17,0x45,0x91,0x16,0x44,0x91,0x16,0x45,0x91,0x16,0x83, 0x44,0x90,0x15,0x05,0x44,0x91,0x16,0x44,0x90,0x15,0x46,0x91,0x17,0x45,0x91, 0x17,0x45,0x90,0x15,0x82,0x45,0x91,0x16,0x04,0x44,0x90,0x15,0x42,0x90,0x15, 0x44,0x90,0x17,0x44,0x90,0x15,0x82,0x43,0x8f,0x15,0x01,0x44,0x90,0x15,0x83, 0x43,0x8f,0x15,0x83,0x42,0x8f,0x15,0x83,0x43,0x8f,0x16,0x04,0x42,0x8f,0x15, 0x43,0x8f,0x16,0x42,0x8f,0x16,0x42,0x8e,0x15,0x83,0x42,0x8f,0x16,0x04,0x42, 0x8e,0x15,0x42,0x8f,0x16,0x42,0x8e,0x15,0x42,0x8d,0x15,0x83,0x42,0x8d,0x17, 0x01,0x41,0x8c,0x15,0x83,0x42,0x8d,0x17,0x06,0x41,0x8c,0x17,0x42,0x8c,0x18, 0x42,0x8d,0x17,0x43,0x8f,0x1a,0x41,0x8c,0x19,0x42,0x8c,0x1a,0x82,0x42,0x8e, 0x1a,0x01,0x43,0x8d,0x1a,0x85,0x42,0x8c,0x1a,0x04,0x42,0x8c,0x1c,0x42,0x8b, 0x1b,0x44,0x8b,0x1d,0x45,0x8c,0x1c,0x82,0x42,0x8c,0x1c,0x01,0x43,0x8c,0x1c, 0x82,0x42,0x8c,0x1d,0x01,0x44,0x8d,0x1f,0x82,0x44,0x8b,0x1f,0x04,0x43,0x8a, 0x1e,0x44,0x8b,0x1f,0x43,0x8a,0x1e,0x44,0x8b,0x1f,0x82,0x45,0x8c,0x1f,0x02, 0x43,0x8c,0x20,0x44,0x8a,0x1f,0x82,0x43,0x8c,0x20,0x01,0x44,0x8a,0x1f,0x82, 0x42,0x8b,0x1f,0x03,0x44,0x8a,0x21,0x42,0x8b,0x21,0x44,0x8a,0x21,0x83,0x43, 0x8a,0x20,0x06,0x44,0x8a,0x21,0x43,0x8a,0x20,0x42,0x8a,0x20,0x43,0x8a,0x20, 0x42,0x89,0x1f,0x43,0x8a,0x20,0x84,0x44,0x8a,0x21,0x0d,0x43,0x8c,0x21,0x42, 0x8a,0x21,0x42,0x89,0x21,0x44,0x89,0x21,0x42,0x88,0x1f,0x45,0x8a,0x22,0x44, 0x8a,0x21,0x43,0x8a,0x20,0x42,0x8a,0x20,0x43,0x88,0x1f,0x42,0x89,0x21,0x43, 0x8a,0x21,0x42,0x88,0x20,0x82,0x42,0x89,0x21,0x02,0x43,0x8a,0x21,0x44,0x8a, 0x22,0x82,0x42,0x89,0x21,0x01,0x43,0x8a,0x21,0x84,0x42,0x89,0x21,0x82,0x42, 0x88,0x20,0x0d,0x43,0x8a,0x20,0x42,0x88,0x20,0x42,0x88,0x21,0x43,0x8a,0x21, 0x42,0x89,0x21,0x42,0x87,0x21,0x43,0x88,0x21,0x42,0x89,0x21,0x41,0x88,0x1f, 0x42,0x87,0x1f,0x42,0x88,0x21,0x42,0x87,0x21,0x41,0x87,0x21,0x82,0x41,0x88, 0x1f,0x82,0x42,0x87,0x21,0x82,0x41,0x86,0x20,0x82,0x41,0x87,0x21,0x03,0x40, 0x86,0x20,0x3f,0x85,0x1f,0x41,0x86,0x20,0x85,0x40,0x85,0x1f,0x03,0x40,0x86, 0x20,0x40,0x85,0x21,0x40,0x85,0x1f,0x82,0x3f,0x83,0x1f,0x02,0x3e,0x84,0x1f, 0x40,0x84,0x20,0x84,0x3e,0x83,0x1f,0x02,0x3f,0x83,0x1f,0x3e,0x83,0x1f,0x82, 0x3f,0x83,0x1f,0x04,0x3e,0x83,0x1f,0x3e,0x82,0x1e,0x3e,0x83,0x1f,0x3d,0x83, 0x1e,0x82,0x3e,0x83,0x1f,0x01,0x3e,0x82,0x1e,0x82,0x3e,0x83,0x1f,0x04,0x3e, 0x82,0x1e,0x3e,0x82,0x1f,0x3d,0x81,0x1e,0x3e,0x83,0x1f,0x83,0x3d,0x81,0x1e, 0x84,0x3c,0x80,0x1d,0x01,0x3b,0x80,0x1c,0x83,0x3c,0x80,0x1d,0x01,0x3b,0x80, 0x1c,0x82,0x3c,0x80,0x1d,0x05,0x3b,0x80,0x1c,0x3c,0x80,0x1d,0x3a,0x7e,0x1b, 0x3b,0x80,0x1c,0x39,0x7e,0x1a,0x83,0x3b,0x80,0x1c,0x01,0x39,0x7e,0x1a,0x83, 0x3a,0x7e,0x1a,0x1d,0x3b,0x80,0x1c,0x39,0x7f,0x1a,0x3b,0x80,0x1a,0x3a,0x80, 0x1a,0x39,0x7f,0x1a,0x3b,0x81,0x19,0x3b,0x82,0x1a,0x3c,0x82,0x1c,0x39,0x7f, 0x1a,0x3a,0x80,0x1a,0x39,0x7f,0x1b,0x38,0x7e,0x16,0x39,0x80,0x17,0x38,0x80, 0x17,0x38,0x7e,0x16,0x39,0x7f,0x19,0x3a,0x80,0x1a,0x37,0x7d,0x18,0x38,0x7e, 0x19,0x38,0x7e,0x1a,0x37,0x7f,0x17,0x37,0x7c,0x17,0x3b,0x80,0x1a,0x39,0x7f, 0x19,0x38,0x7a,0x1a,0x30,0x72,0x14,0x2a,0x6b,0x0e,0x23,0x61,0x09,0x1f,0x5d, 0x09,0x82,0x1f,0x5e,0x07,0x01,0x1f,0x5f,0x07,0x82,0x20,0x5f,0x09,0x03,0x1f, 0x60,0x09,0x1f,0x5f,0x07,0x1e,0x5e,0x09,0x83,0x1e,0x5f,0x07,0x82,0x1f,0x5f, 0x07,0x04,0x1d,0x5e,0x07,0x1f,0x5f,0x07,0x20,0x5f,0x08,0x1e,0x5d,0x06,0x83, 0x1f,0x5e,0x07,0x05,0x1e,0x5d,0x06,0x1c,0x5d,0x05,0x1c,0x5c,0x07,0x1d,0x5d, 0x06,0x1c,0x5c,0x05,0x83,0x1c,0x5b,0x04,0x02,0x1c,0x5c,0x05,0x1b,0x5a,0x04, 0x88,0x1a,0x59,0x04,0x03,0x1a,0x58,0x05,0x19,0x59,0x05,0x19,0x58,0x04,0x84, 0x1a,0x58,0x05,0x06,0x19,0x58,0x04,0x18,0x57,0x02,0x18,0x56,0x02,0x18,0x56, 0x04,0x19,0x57,0x04,0x19,0x56,0x04,0x82,0x18,0x55,0x04,0x01,0x17,0x54,0x03, 0x82,0x18,0x55,0x04,0x01,0x17,0x54,0x04,0x82,0x18,0x55,0x04,0x04,0x17,0x54, 0x04,0x17,0x53,0x04,0x18,0x53,0x04,0x19,0x53,0x04,0x82,0x18,0x52,0x04,0x01, 0x17,0x52,0x04,0x82,0x17,0x52,0x05,0x0e,0x16,0x51,0x04,0x17,0x51,0x03,0x17, 0x51,0x04,0x18,0x50,0x03,0x17,0x51,0x04,0x16,0x50,0x03,0x16,0x50,0x04,0x17, 0x50,0x04,0x17,0x4e,0x03,0x16,0x4e,0x04,0x17,0x50,0x04,0x17,0x4e,0x05,0x17, 0x4f,0x06,0x17,0x4e,0x05,0x82,0x16,0x4e,0x05,0x03,0x15,0x4e,0x04,0x15,0x4c, 0x04,0x16,0x4c,0x03,0x82,0x16,0x4d,0x04,0x85,0x16,0x4c,0x04,0x05,0x15,0x4c, 0x04,0x15,0x4b,0x04,0x17,0x4c,0x04,0x16,0x4b,0x04,0x15,0x4b,0x04,0x82,0x15, 0x4a,0x04,0x82,0x15,0x4a,0x03,0x03,0x15,0x4a,0x04,0x15,0x4a,0x03,0x16,0x4a, 0x05,0x82,0x15,0x49,0x04,0x28,0x17,0x48,0x05,0x15,0x49,0x03,0x15,0x48,0x04, 0x14,0x47,0x02,0x14,0x48,0x03,0x14,0x47,0x04,0x13,0x46,0x03,0x14,0x46,0x04, 0x14,0x47,0x03,0x14,0x46,0x04,0x15,0x45,0x04,0x13,0x45,0x03,0x14,0x45,0x04, 0x13,0x45,0x04,0x13,0x45,0x03,0x14,0x43,0x03,0x13,0x44,0x03,0x13,0x45,0x04, 0x13,0x43,0x02,0x13,0x44,0x02,0x13,0x43,0x04,0x13,0x42,0x03,0x14,0x42,0x04, 0x13,0x42,0x03,0x13,0x42,0x04,0x13,0x42,0x03,0x12,0x41,0x04,0x12,0x42,0x03, 0x11,0x41,0x02,0x12,0x40,0x02,0x11,0x40,0x02,0x12,0x40,0x04,0x11,0x40,0x04, 0x11,0x40,0x02,0x12,0x40,0x03,0x11,0x3f,0x02,0x12,0x3e,0x02,0x11,0x3f,0x02, 0x10,0x3e,0x03,0x12,0x3e,0x03,0x82,0x11,0x3e,0x03,0x08,0x12,0x3d,0x02,0x10, 0x3c,0x02,0x10,0x3e,0x03,0x10,0x3d,0x02,0x10,0x3c,0x02,0x10,0x3d,0x03,0x0f, 0x3c,0x03,0x0f,0x3b,0x03,0x82,0x10,0x3b,0x02,0x02,0x10,0x3a,0x02,0x0f,0x3a, 0x02,0x83,0x10,0x3b,0x02,0x02,0x0f,0x3b,0x02,0x0f,0x3a,0x02,0x82,0x0f,0x39, 0x02,0x05,0x10,0x38,0x02,0x10,0x37,0x02,0x10,0x38,0x01,0x10,0x37,0x01,0x0f, 0x37,0x02,0x83,0x0f,0x38,0x02,0x01,0x0e,0x37,0x02,0x83,0x0e,0x36,0x02,0x02, 0x0e,0x35,0x02,0x0f,0x36,0x03,0x82,0x0e,0x36,0x02,0x01,0x0e,0x35,0x02,0x83, 0x0d,0x34,0x02,0x84,0x0e,0x34,0x02,0x82,0x0d,0x34,0x02,0x83,0x0e,0x32,0x02, 0x06,0x0d,0x32,0x01,0x0c,0x32,0x02,0x0e,0x32,0x02,0x0d,0x32,0x02,0x0c,0x30, 0x02,0x0b,0x31,0x02,0x82,0x0c,0x30,0x02,0x03,0x0b,0x2f,0x01,0x0d,0x30,0x02, 0x0b,0x2f,0x01,0x83,0x0d,0x2f,0x02,0x04,0x0c,0x2e,0x01,0x0b,0x2d,0x00,0x0b, 0x2d,0x01,0x0c,0x2e,0x01,0x82,0x0b,0x2d,0x01,0x82,0x0b,0x2d,0x02,0x83,0x0b, 0x2d,0x01,0x08,0x0b,0x2c,0x01,0x0b,0x2d,0x02,0x0b,0x2c,0x01,0x0b,0x2b,0x01, 0x0a,0x2b,0x01,0x0b,0x2b,0x02,0x0b,0x2b,0x01,0x0a,0x2a,0x02,0x82,0x0b,0x2a, 0x02,0x09,0x0b,0x2a,0x01,0x0a,0x29,0x00,0x0b,0x29,0x01,0x0b,0x2a,0x01,0x0a, 0x28,0x02,0x0b,0x28,0x02,0x0a,0x28,0x01,0x0b,0x28,0x01,0x0a,0x28,0x01,0x82, 0x0b,0x28,0x01,0x06,0x09,0x28,0x00,0x09,0x27,0x00,0x09,0x28,0x01,0x09,0x27, 0x01,0x09,0x26,0x00,0x09,0x26,0x01,0x82,0x09,0x26,0x02,0x82,0x09,0x26,0x01, 0x02,0x09,0x24,0x00,0x09,0x25,0x01,0x83,0x09,0x24,0x01,0x02,0x09,0x23,0x00, 0x09,0x23,0x01,0x82,0x09,0x23,0x00,0x85,0x09,0x23,0x01,0x03,0x09,0x22,0x01, 0x08,0x21,0x00,0x08,0x21,0x01,0x83,0x08,0x21,0x00,0x82,0x07,0x20,0x00,0x03, 0x08,0x20,0x00,0x08,0x20,0x01,0x07,0x20,0x01,0x82,0x07,0x1f,0x01,0x01,0x08, 0x1f,0x01,0x84,0x07,0x1f,0x01,0x83,0x07,0x1e,0x00,0x83,0x07,0x1d,0x00,0x85, 0x07,0x1c,0x00,0x01,0x06,0x1c,0x00,0x83,0x07,0x1b,0x00,0x01,0x06,0x1b,0x00, 0x83,0x06,0x1a,0x00,0x02,0x05,0x1a,0x00,0x06,0x1a,0x00,0x83,0x06,0x19,0x00, 0x83,0x05,0x19,0x00,0x83,0x05,0x18,0x00,0x01,0x05,0x17,0x00,0x82,0x04,0x17, 0x00,0x83,0x05,0x17,0x00,0x01,0x04,0x16,0x00,0x82,0x05,0x17,0x00,0x03,0x04, 0x16,0x00,0x04,0x15,0x00,0x04,0x16,0x00,0x83,0x04,0x15,0x00,0x01,0x05,0x15, 0x00,0x83,0x04,0x15,0x00,0x02,0x04,0x14,0x00,0x04,0x15,0x00,0x84,0x04,0x14, 0x00,0x85,0x04,0x13,0x00,0x01,0x03,0x12,0x00,0x82,0x04,0x12,0x00,0x02,0x03, 0x11,0x00,0x04,0x12,0x00,0x82,0x03,0x11,0x00,0x87,0x03,0x10,0x00,0x01,0x02, 0x10,0x00,0x82,0x03,0x10,0x00,0x82,0x02,0x0f,0x00,0x04,0x02,0x0e,0x00,0x03, 0x0e,0x00,0x02,0x0e,0x00,0x03,0x0e,0x00,0x83,0x02,0x0e,0x00,0x02,0x03,0x0e, 0x00,0x02,0x0e,0x00,0x82,0x02,0x0d,0x00,0x01,0x03,0x0e,0x00,0x84,0x02,0x0d, 0x00,0x86,0x02,0x0c,0x00,0x85,0x02,0x0b,0x00,0x01,0x03,0x0c,0x00,0x82,0x04, 0x0e,0x00,0x06,0x04,0x0e,0x01,0x05,0x0e,0x02,0x06,0x0e,0x03,0x06,0x0e,0x02, 0x06,0x0d,0x02,0x05,0x0d,0x02,0x83,0x05,0x0c,0x02,0x82,0x05,0x0b,0x02,0x82, 0x04,0x0b,0x02,0x83,0x04,0x0a,0x02,0x84,0x04,0x09,0x02,0x03,0x03,0x08,0x01, 0x03,0x08,0x02,0x03,0x08,0x01,0x82,0x03,0x07,0x01,0x82,0x02,0x07,0x01,0x82, 0x02,0x06,0x01,0x82,0x02,0x05,0x01,0x83,0x02,0x04,0x00,0x82,0x01,0x04,0x00, 0x82,0x01,0x03,0x00,0x01,0x01,0x02,0x00,0x83,0x00,0x02,0x00,0x01,0x00,0x01, 0x00,0xdd,0x00,0x00,0x00,0x01,0x47,0x95,0x17,0x82,0x46,0x93,0x17,0x01,0x46, 0x94,0x16,0x82,0x45,0x92,0x16,0x03,0x45,0x93,0x15,0x46,0x94,0x16,0x46,0x93, 0x17,0x83,0x45,0x92,0x16,0x82,0x46,0x93,0x17,0x03,0x45,0x92,0x16,0x45,0x91, 0x16,0x45,0x92,0x16,0x86,0x45,0x91,0x16,0x03,0x44,0x92,0x16,0x45,0x91,0x16, 0x44,0x92,0x16,0x84,0x45,0x91,0x16,0x03,0x43,0x91,0x15,0x44,0x91,0x15,0x45, 0x91,0x16,0x82,0x44,0x91,0x15,0x0b,0x43,0x90,0x14,0x44,0x91,0x15,0x43,0x90, 0x14,0x44,0x91,0x15,0x45,0x91,0x16,0x44,0x91,0x16,0x43,0x90,0x16,0x42,0x8f, 0x15,0x43,0x90,0x16,0x44,0x91,0x16,0x42,0x8f,0x15,0x82,0x43,0x90,0x16,0x02, 0x42,0x8f,0x16,0x42,0x8f,0x15,0x82,0x42,0x8f,0x16,0x85,0x43,0x8f,0x16,0x02, 0x42,0x8e,0x16,0x43,0x8f,0x17,0x82,0x42,0x8e,0x16,0x0e,0x41,0x8d,0x17,0x42, 0x8f,0x18,0x42,0x8e,0x18,0x42,0x8f,0x17,0x43,0x8e,0x18,0x43,0x8e,0x1a,0x43, 0x8f,0x1b,0x42,0x8e,0x18,0x43,0x8e,0x18,0x42,0x8f,0x1a,0x42,0x8e,0x1b,0x43, 0x8e,0x1a,0x42,0x8d,0x19,0x42,0x8d,0x1a,0x82,0x43,0x8e,0x1b,0x01,0x42,0x8e, 0x1b,0x82,0x42,0x8e,0x1c,0x04,0x44,0x8c,0x1b,0x45,0x8e,0x1b,0x43,0x8d,0x1d, 0x43,0x8d,0x1f,0x82,0x43,0x8d,0x1d,0x09,0x43,0x8d,0x1f,0x42,0x8c,0x1b,0x44, 0x8c,0x1e,0x45,0x8c,0x1f,0x44,0x8c,0x1e,0x43,0x8d,0x1f,0x44,0x8e,0x20,0x43, 0x8d,0x1f,0x44,0x8c,0x1e,0x82,0x45,0x8c,0x20,0x0a,0x42,0x8b,0x1e,0x42,0x8c, 0x1f,0x45,0x8c,0x20,0x44,0x8d,0x20,0x42,0x8c,0x1f,0x43,0x8a,0x20,0x42,0x8b, 0x20,0x45,0x8c,0x21,0x42,0x8c,0x1f,0x42,0x8c,0x20,0x82,0x44,0x8b,0x20,0x02, 0x45,0x8c,0x21,0x43,0x8a,0x20,0x87,0x44,0x8b,0x20,0x09,0x44,0x8b,0x22,0x42, 0x8b,0x22,0x42,0x88,0x20,0x42,0x88,0x21,0x44,0x8b,0x22,0x43,0x8a,0x20,0x45, 0x8c,0x22,0x43,0x8a,0x21,0x43,0x8a,0x20,0x82,0x44,0x8b,0x22,0x86,0x43,0x8a, 0x21,0x04,0x44,0x8b,0x22,0x43,0x89,0x20,0x42,0x8a,0x20,0x43,0x8a,0x21,0x82, 0x42,0x8a,0x20,0x18,0x43,0x89,0x20,0x43,0x89,0x22,0x42,0x88,0x21,0x44,0x8a, 0x21,0x45,0x8c,0x21,0x42,0x8a,0x20,0x41,0x8a,0x22,0x43,0x8a,0x21,0x42,0x89, 0x20,0x42,0x88,0x21,0x42,0x87,0x1f,0x42,0x8a,0x20,0x42,0x88,0x21,0x42,0x87, 0x20,0x42,0x88,0x21,0x43,0x89,0x22,0x42,0x88,0x21,0x41,0x88,0x1f,0x42,0x8a, 0x20,0x41,0x87,0x20,0x40,0x87,0x20,0x41,0x87,0x20,0x42,0x88,0x21,0x42,0x87, 0x20,0x84,0x41,0x87,0x20,0x08,0x40,0x86,0x1f,0x42,0x87,0x20,0x40,0x86,0x1f, 0x40,0x87,0x20,0x40,0x86,0x1f,0x40,0x86,0x20,0x40,0x85,0x20,0x40,0x85,0x1e, 0x82,0x40,0x85,0x20,0x09,0x3e,0x85,0x1f,0x3e,0x83,0x1e,0x3f,0x84,0x1f,0x40, 0x85,0x20,0x3e,0x85,0x1f,0x3d,0x84,0x1e,0x3e,0x85,0x1f,0x3f,0x84,0x1f,0x3e, 0x83,0x1e,0x84,0x3f,0x84,0x1f,0x01,0x3d,0x83,0x1d,0x82,0x3e,0x83,0x1e,0x03, 0x3d,0x82,0x1d,0x3f,0x84,0x1f,0x3d,0x82,0x1d,0x82,0x3e,0x83,0x1f,0x01,0x3d, 0x82,0x1d,0x82,0x3e,0x83,0x1e,0x84,0x3d,0x82,0x1e,0x82,0x3d,0x82,0x1d,0x82, 0x3d,0x82,0x1e,0x07,0x3b,0x80,0x1c,0x3c,0x81,0x1d,0x3d,0x82,0x1d,0x3d,0x82, 0x1e,0x3c,0x81,0x1d,0x3b,0x80,0x1c,0x3d,0x82,0x1e,0x84,0x3d,0x82,0x1d,0x05, 0x3c,0x82,0x1d,0x3a,0x80,0x1b,0x3b,0x80,0x1b,0x3a,0x7f,0x1a,0x3c,0x82,0x1b, 0x83,0x3a,0x80,0x19,0x01,0x3b,0x82,0x1b,0x84,0x3b,0x81,0x1a,0x0f,0x3b,0x82, 0x18,0x3a,0x80,0x1b,0x3c,0x82,0x1d,0x3a,0x81,0x18,0x3a,0x80,0x19,0x38,0x7f, 0x19,0x3a,0x82,0x19,0x39,0x80,0x18,0x3a,0x80,0x18,0x3a,0x80,0x19,0x37,0x7d, 0x18,0x39,0x7f,0x18,0x38,0x7f,0x19,0x36,0x7d,0x17,0x38,0x7d,0x18,0x82,0x38, 0x7f,0x18,0x18,0x39,0x7e,0x1a,0x38,0x7d,0x1b,0x39,0x7e,0x1b,0x36,0x79,0x17, 0x30,0x71,0x11,0x27,0x68,0x0c,0x21,0x61,0x09,0x1e,0x5d,0x08,0x1f,0x5f,0x07, 0x20,0x60,0x08,0x20,0x60,0x09,0x20,0x60,0x08,0x20,0x5f,0x09,0x20,0x60,0x07, 0x1e,0x5e,0x06,0x1f,0x60,0x07,0x20,0x61,0x07,0x1f,0x60,0x07,0x1d,0x5f,0x07, 0x1f,0x5f,0x07,0x20,0x60,0x08,0x20,0x60,0x07,0x1e,0x5e,0x07,0x1d,0x5d,0x06, 0x82,0x1d,0x5d,0x04,0x0b,0x1e,0x5e,0x07,0x1d,0x5c,0x08,0x1d,0x5d,0x06,0x1d, 0x5d,0x05,0x1c,0x5c,0x04,0x1b,0x5b,0x05,0x1c,0x5b,0x06,0x1d,0x5d,0x05,0x1c, 0x5c,0x04,0x1b,0x5b,0x05,0x1b,0x5a,0x04,0x82,0x1b,0x5b,0x05,0x01,0x19,0x58, 0x03,0x82,0x1b,0x5a,0x04,0x83,0x19,0x58,0x04,0x82,0x1a,0x59,0x05,0x0e,0x19, 0x58,0x04,0x1a,0x59,0x05,0x19,0x58,0x04,0x1a,0x59,0x05,0x18,0x58,0x02,0x18, 0x56,0x03,0x18,0x57,0x04,0x19,0x58,0x04,0x19,0x57,0x03,0x18,0x56,0x02,0x18, 0x56,0x04,0x17,0x54,0x02,0x18,0x55,0x04,0x18,0x56,0x04,0x83,0x18,0x55,0x04, 0x02,0x18,0x53,0x03,0x18,0x53,0x04,0x82,0x17,0x53,0x03,0x09,0x18,0x54,0x04, 0x18,0x53,0x04,0x17,0x53,0x03,0x17,0x53,0x05,0x16,0x53,0x05,0x16,0x53,0x04, 0x16,0x51,0x03,0x18,0x53,0x04,0x18,0x53,0x03,0x82,0x18,0x51,0x04,0x02,0x17, 0x51,0x02,0x18,0x51,0x04,0x82,0x16,0x50,0x03,0x02,0x16,0x51,0x05,0x16,0x4e, 0x03,0x82,0x17,0x4f,0x04,0x82,0x17,0x50,0x04,0x01,0x16,0x4f,0x04,0x83,0x17, 0x4e,0x04,0x01,0x16,0x4e,0x04,0x82,0x16,0x4d,0x04,0x06,0x17,0x4e,0x05,0x16, 0x4c,0x04,0x16,0x4d,0x04,0x15,0x4c,0x03,0x16,0x4c,0x04,0x18,0x4c,0x04,0x82, 0x16,0x4c,0x04,0x82,0x16,0x4b,0x04,0x0c,0x15,0x4a,0x03,0x14,0x4a,0x03,0x15, 0x4b,0x04,0x16,0x4b,0x04,0x15,0x49,0x03,0x15,0x49,0x04,0x16,0x4a,0x04,0x15, 0x49,0x03,0x15,0x4a,0x03,0x14,0x49,0x04,0x14,0x49,0x03,0x13,0x48,0x02,0x82, 0x14,0x47,0x02,0x06,0x13,0x47,0x02,0x13,0x46,0x02,0x13,0x46,0x03,0x14,0x45, 0x02,0x13,0x45,0x03,0x14,0x46,0x04,0x82,0x13,0x45,0x03,0x82,0x13,0x45,0x04, 0x82,0x13,0x45,0x02,0x82,0x13,0x44,0x03,0x01,0x13,0x43,0x03,0x82,0x13,0x42, 0x03,0x82,0x12,0x42,0x02,0x01,0x11,0x41,0x03,0x82,0x12,0x42,0x03,0x02,0x12, 0x41,0x02,0x11,0x41,0x02,0x82,0x11,0x40,0x02,0x0b,0x12,0x41,0x03,0x13,0x41, 0x04,0x11,0x40,0x02,0x12,0x3e,0x02,0x11,0x40,0x02,0x11,0x3f,0x02,0x11,0x3f, 0x03,0x10,0x3d,0x02,0x11,0x3f,0x03,0x12,0x3d,0x02,0x11,0x3d,0x02,0x82,0x12, 0x3d,0x03,0x0b,0x11,0x3c,0x02,0x11,0x3d,0x04,0x11,0x3d,0x03,0x10,0x3d,0x03, 0x10,0x3d,0x02,0x10,0x3c,0x02,0x11,0x3b,0x02,0x10,0x3b,0x02,0x0f,0x3c,0x02, 0x10,0x3b,0x02,0x10,0x3c,0x02,0x82,0x0f,0x3b,0x02,0x82,0x10,0x3b,0x03,0x03, 0x0f,0x3a,0x02,0x10,0x39,0x02,0x11,0x38,0x02,0x82,0x10,0x38,0x02,0x04,0x0f, 0x38,0x02,0x0f,0x39,0x02,0x0f,0x38,0x02,0x0f,0x38,0x03,0x82,0x0e,0x38,0x02, 0x04,0x0e,0x37,0x02,0x0e,0x36,0x02,0x0f,0x36,0x02,0x0e,0x37,0x02,0x82,0x0e, 0x36,0x02,0x82,0x0e,0x35,0x02,0x01,0x0e,0x34,0x02,0x84,0x0e,0x35,0x02,0x02, 0x0e,0x33,0x02,0x0d,0x33,0x01,0x82,0x0d,0x33,0x02,0x02,0x0e,0x33,0x02,0x0e, 0x32,0x02,0x83,0x0c,0x32,0x02,0x82,0x0c,0x31,0x02,0x04,0x0d,0x32,0x02,0x0c, 0x31,0x01,0x0c,0x30,0x01,0x0c,0x31,0x01,0x82,0x0c,0x31,0x02,0x03,0x0d,0x30, 0x02,0x0c,0x2f,0x01,0x0d,0x2f,0x02,0x82,0x0c,0x2e,0x01,0x82,0x0c,0x2e,0x02, 0x02,0x0b,0x2e,0x01,0x0c,0x2e,0x01,0x82,0x0c,0x2e,0x02,0x82,0x0b,0x2d,0x01, 0x04,0x0c,0x2d,0x02,0x0c,0x2d,0x01,0x0c,0x2c,0x02,0x0c,0x2c,0x01,0x82,0x0b, 0x2c,0x01,0x03,0x0a,0x2b,0x01,0x0a,0x2b,0x02,0x0b,0x2b,0x01,0x83,0x0a,0x2a, 0x01,0x07,0x0a,0x29,0x01,0x0b,0x29,0x01,0x09,0x29,0x01,0x09,0x29,0x02,0x0a, 0x29,0x01,0x0b,0x29,0x01,0x0a,0x29,0x01,0x82,0x09,0x28,0x01,0x0c,0x0a,0x28, 0x00,0x0a,0x27,0x00,0x09,0x27,0x00,0x09,0x27,0x02,0x0a,0x27,0x01,0x0a,0x26, 0x02,0x09,0x27,0x02,0x09,0x26,0x02,0x09,0x26,0x01,0x09,0x25,0x01,0x08,0x26, 0x01,0x09,0x26,0x00,0x82,0x09,0x25,0x00,0x01,0x09,0x25,0x01,0x83,0x09,0x24, 0x01,0x03,0x09,0x23,0x00,0x09,0x23,0x01,0x08,0x23,0x00,0x82,0x09,0x23,0x01, 0x83,0x09,0x22,0x01,0x82,0x08,0x22,0x01,0x02,0x08,0x21,0x00,0x08,0x22,0x01, 0x82,0x08,0x21,0x00,0x0a,0x08,0x20,0x00,0x08,0x20,0x01,0x07,0x21,0x01,0x08, 0x20,0x01,0x07,0x20,0x00,0x07,0x20,0x01,0x08,0x20,0x01,0x07,0x1f,0x00,0x07, 0x1e,0x00,0x07,0x1f,0x01,0x83,0x07,0x1e,0x00,0x84,0x07,0x1d,0x00,0x82,0x06, 0x1c,0x00,0x01,0x07,0x1d,0x00,0x82,0x07,0x1c,0x00,0x01,0x07,0x1b,0x00,0x85, 0x06,0x1b,0x00,0x04,0x06,0x1a,0x00,0x05,0x1a,0x00,0x06,0x19,0x00,0x06,0x1a, 0x00,0x83,0x06,0x19,0x00,0x02,0x05,0x18,0x00,0x05,0x19,0x00,0x86,0x05,0x18, 0x00,0x84,0x05,0x17,0x00,0x02,0x04,0x16,0x00,0x05,0x16,0x00,0x83,0x04,0x16, 0x00,0x01,0x05,0x16,0x00,0x83,0x04,0x16,0x00,0x83,0x04,0x15,0x00,0x85,0x04, 0x14,0x00,0x85,0x04,0x13,0x00,0x83,0x03,0x12,0x00,0x03,0x03,0x11,0x00,0x03, 0x12,0x00,0x04,0x12,0x00,0x86,0x03,0x11,0x00,0x84,0x03,0x10,0x00,0x83,0x02, 0x0f,0x00,0x02,0x03,0x0f,0x00,0x02,0x0f,0x00,0x89,0x02,0x0e,0x00,0x86,0x02, 0x0d,0x00,0x88,0x02,0x0c,0x00,0x85,0x02,0x0b,0x00,0x01,0x03,0x0c,0x00,0x82, 0x03,0x0d,0x00,0x03,0x04,0x0e,0x01,0x04,0x0d,0x02,0x05,0x0d,0x02,0x82,0x06, 0x0d,0x02,0x82,0x05,0x0c,0x02,0x01,0x04,0x0c,0x02,0x84,0x04,0x0b,0x02,0x01, 0x04,0x0a,0x02,0x85,0x04,0x09,0x02,0x02,0x04,0x08,0x02,0x03,0x08,0x01,0x83, 0x03,0x07,0x01,0x82,0x02,0x07,0x01,0x82,0x02,0x06,0x01,0x82,0x02,0x05,0x01, 0x84,0x02,0x04,0x00,0x01,0x01,0x04,0x00,0x82,0x01,0x03,0x00,0x01,0x01,0x02, 0x00,0x83,0x00,0x02,0x00,0x82,0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x07,0x47, 0x96,0x16,0x47,0x94,0x17,0x46,0x93,0x16,0x45,0x93,0x16,0x44,0x92,0x15,0x45, 0x93,0x16,0x47,0x95,0x16,0x82,0x47,0x94,0x17,0x01,0x46,0x93,0x16,0x83,0x45, 0x93,0x16,0x03,0x46,0x93,0x16,0x45,0x93,0x16,0x45,0x91,0x16,0x84,0x45,0x93, 0x16,0x83,0x44,0x92,0x15,0x09,0x44,0x92,0x16,0x45,0x93,0x16,0x45,0x92,0x15, 0x44,0x93,0x15,0x44,0x92,0x15,0x44,0x91,0x16,0x43,0x92,0x16,0x44,0x91,0x16, 0x43,0x92,0x16,0x84,0x44,0x91,0x14,0x82,0x43,0x91,0x15,0x04,0x44,0x91,0x16, 0x44,0x92,0x16,0x44,0x91,0x16,0x43,0x91,0x15,0x82,0x42,0x90,0x14,0x02,0x43, 0x91,0x15,0x42,0x90,0x14,0x82,0x44,0x91,0x16,0x05,0x43,0x91,0x16,0x42,0x90, 0x15,0x43,0x91,0x16,0x42,0x90,0x15,0x43,0x8f,0x15,0x82,0x43,0x8f,0x16,0x07, 0x43,0x8f,0x15,0x42,0x90,0x15,0x42,0x8e,0x16,0x42,0x8f,0x18,0x42,0x8e,0x17, 0x44,0x8f,0x19,0x42,0x8e,0x17,0x82,0x43,0x8e,0x18,0x02,0x42,0x8e,0x19,0x42, 0x8e,0x17,0x82,0x43,0x8e,0x18,0x04,0x42,0x8e,0x19,0x42,0x8d,0x19,0x42,0x8e, 0x19,0x42,0x8f,0x18,0x82,0x42,0x8e,0x19,0x02,0x43,0x8e,0x1a,0x44,0x8f,0x1b, 0x82,0x42,0x8e,0x19,0x82,0x43,0x8f,0x1b,0x02,0x44,0x8f,0x1b,0x43,0x8e,0x1c, 0x82,0x44,0x8e,0x1e,0x04,0x42,0x8c,0x1e,0x42,0x8d,0x1e,0x44,0x8e,0x1e,0x43, 0x8e,0x1e,0x82,0x45,0x8e,0x1e,0x03,0x43,0x8e,0x1e,0x42,0x8d,0x1e,0x43,0x8d, 0x1f,0x82,0x42,0x8c,0x1e,0x82,0x45,0x8d,0x20,0x01,0x43,0x8d,0x1f,0x82,0x44, 0x8c,0x1f,0x05,0x43,0x8d,0x1f,0x42,0x8c,0x1e,0x44,0x8c,0x21,0x43,0x8d,0x21, 0x44,0x8c,0x1f,0x82,0x43,0x8d,0x1f,0x83,0x44,0x8c,0x21,0x04,0x44,0x8c,0x20, 0x45,0x8c,0x21,0x44,0x8c,0x20,0x43,0x8d,0x21,0x82,0x44,0x8c,0x21,0x82,0x44, 0x8c,0x20,0x82,0x44,0x8c,0x21,0x03,0x44,0x8b,0x21,0x44,0x8a,0x1f,0x43,0x8b, 0x1f,0x82,0x44,0x8c,0x21,0x08,0x43,0x8b,0x21,0x43,0x8a,0x22,0x43,0x8b,0x21, 0x41,0x8a,0x20,0x42,0x8b,0x21,0x43,0x8b,0x21,0x44,0x8c,0x21,0x42,0x8a,0x20, 0x83,0x43,0x8b,0x21,0x02,0x44,0x8a,0x21,0x42,0x8a,0x20,0x82,0x43,0x8b,0x21, 0x82,0x42,0x8a,0x20,0x06,0x44,0x8a,0x22,0x42,0x89,0x21,0x42,0x8b,0x21,0x42, 0x8c,0x1f,0x43,0x8b,0x21,0x42,0x89,0x21,0x82,0x42,0x89,0x1f,0x04,0x42,0x89, 0x21,0x40,0x89,0x1f,0x42,0x89,0x21,0x43,0x8a,0x22,0x83,0x42,0x89,0x21,0x82, 0x41,0x88,0x20,0x02,0x42,0x89,0x21,0x42,0x8a,0x20,0x83,0x42,0x89,0x21,0x82, 0x40,0x87,0x1f,0x83,0x42,0x88,0x20,0x08,0x41,0x87,0x1f,0x42,0x88,0x20,0x3f, 0x87,0x1e,0x40,0x87,0x1f,0x3f,0x87,0x1e,0x40,0x87,0x21,0x40,0x86,0x20,0x40, 0x87,0x1e,0x82,0x40,0x86,0x20,0x82,0x3f,0x86,0x1f,0x05,0x3f,0x85,0x1f,0x40, 0x86,0x20,0x3e,0x85,0x1e,0x3f,0x86,0x1f,0x3e,0x85,0x1e,0x85,0x3f,0x84,0x1e, 0x16,0x3f,0x84,0x1f,0x3e,0x84,0x1e,0x3f,0x84,0x1f,0x3e,0x84,0x1e,0x3d,0x82, 0x1c,0x3e,0x84,0x1e,0x3d,0x83,0x1e,0x3f,0x84,0x1f,0x3d,0x83,0x1e,0x3f,0x85, 0x1f,0x3f,0x84,0x1e,0x3e,0x84,0x1e,0x3d,0x84,0x1d,0x3d,0x84,0x1e,0x3e,0x84, 0x1e,0x3d,0x83,0x1e,0x3d,0x82,0x1d,0x3d,0x83,0x1d,0x3f,0x84,0x1e,0x3e,0x84, 0x1e,0x3d,0x82,0x1c,0x3d,0x83,0x1e,0x82,0x3e,0x84,0x1e,0x07,0x3d,0x82,0x1d, 0x3c,0x82,0x1c,0x3d,0x83,0x1e,0x3d,0x83,0x1d,0x3d,0x82,0x1c,0x3d,0x83,0x1d, 0x3b,0x82,0x1c,0x83,0x3c,0x83,0x1c,0x04,0x3b,0x82,0x1c,0x3d,0x84,0x1c,0x3c, 0x83,0x1b,0x3d,0x84,0x1c,0x82,0x3a,0x82,0x19,0x1a,0x3c,0x83,0x1b,0x3e,0x86, 0x1c,0x3c,0x83,0x1b,0x3b,0x82,0x1a,0x3d,0x85,0x1b,0x3c,0x83,0x1b,0x3a,0x82, 0x19,0x3f,0x87,0x1c,0x3b,0x82,0x1c,0x3a,0x81,0x19,0x39,0x82,0x1b,0x3a,0x82, 0x17,0x3a,0x80,0x1a,0x39,0x80,0x19,0x3a,0x82,0x17,0x3b,0x82,0x19,0x38,0x7f, 0x17,0x38,0x7e,0x18,0x38,0x7f,0x19,0x39,0x7f,0x19,0x3a,0x80,0x1a,0x39,0x80, 0x18,0x35,0x7b,0x16,0x38,0x7b,0x18,0x39,0x7c,0x18,0x3b,0x81,0x1d,0x82,0x35, 0x7b,0x17,0x16,0x2d,0x70,0x11,0x26,0x68,0x0c,0x21,0x61,0x0b,0x1e,0x5f,0x07, 0x20,0x5f,0x07,0x20,0x60,0x07,0x20,0x60,0x08,0x1f,0x60,0x07,0x21,0x61,0x09, 0x1f,0x60,0x0a,0x20,0x62,0x09,0x20,0x62,0x08,0x1e,0x60,0x07,0x1f,0x60,0x07, 0x20,0x60,0x08,0x1f,0x60,0x07,0x1e,0x5f,0x07,0x1f,0x60,0x07,0x1e,0x5f,0x06, 0x1e,0x5f,0x07,0x1c,0x5c,0x06,0x1e,0x5e,0x06,0x82,0x1d,0x5e,0x05,0x82,0x1c, 0x5c,0x06,0x01,0x1c,0x5d,0x05,0x83,0x1c,0x5b,0x05,0x09,0x1c,0x5b,0x07,0x1b, 0x5b,0x06,0x19,0x59,0x03,0x1b,0x5b,0x05,0x1a,0x5a,0x04,0x19,0x59,0x05,0x1a, 0x5a,0x05,0x19,0x59,0x05,0x1a,0x5a,0x05,0x83,0x19,0x59,0x05,0x02,0x18,0x58, 0x03,0x19,0x59,0x05,0x82,0x19,0x59,0x03,0x82,0x19,0x59,0x05,0x01,0x19,0x57, 0x05,0x82,0x19,0x57,0x04,0x03,0x18,0x56,0x03,0x19,0x56,0x04,0x18,0x56,0x04, 0x82,0x17,0x55,0x03,0x03,0x18,0x56,0x04,0x19,0x55,0x04,0x19,0x54,0x04,0x82, 0x18,0x55,0x04,0x82,0x18,0x53,0x03,0x01,0x17,0x52,0x02,0x83,0x16,0x53,0x05, 0x83,0x16,0x52,0x03,0x04,0x17,0x51,0x05,0x18,0x51,0x04,0x17,0x51,0x03,0x16, 0x51,0x05,0x82,0x16,0x50,0x02,0x03,0x16,0x51,0x05,0x17,0x50,0x04,0x16,0x4f, 0x02,0x82,0x16,0x4f,0x03,0x01,0x15,0x4f,0x02,0x82,0x17,0x4f,0x04,0x04,0x16, 0x4f,0x04,0x16,0x4f,0x05,0x16,0x4e,0x05,0x16,0x4d,0x05,0x82,0x16,0x4e,0x05, 0x03,0x16,0x4c,0x03,0x15,0x4d,0x03,0x16,0x4f,0x04,0x85,0x16,0x4c,0x04,0x0c, 0x16,0x4c,0x05,0x16,0x4c,0x03,0x15,0x4c,0x03,0x16,0x4b,0x05,0x15,0x4a,0x03, 0x14,0x49,0x02,0x14,0x4a,0x04,0x15,0x4b,0x05,0x15,0x4a,0x03,0x15,0x49,0x03, 0x14,0x49,0x04,0x14,0x49,0x02,0x83,0x14,0x48,0x02,0x01,0x14,0x47,0x02,0x82, 0x14,0x47,0x04,0x0f,0x14,0x47,0x03,0x14,0x46,0x03,0x14,0x47,0x04,0x14,0x46, 0x03,0x14,0x45,0x03,0x14,0x47,0x04,0x14,0x46,0x04,0x14,0x45,0x04,0x13,0x46, 0x02,0x14,0x45,0x04,0x13,0x44,0x03,0x14,0x44,0x04,0x14,0x42,0x02,0x14,0x43, 0x03,0x12,0x43,0x02,0x82,0x13,0x43,0x04,0x04,0x12,0x43,0x03,0x12,0x44,0x04, 0x13,0x43,0x04,0x12,0x42,0x03,0x82,0x11,0x41,0x02,0x14,0x12,0x42,0x03,0x13, 0x42,0x04,0x12,0x41,0x03,0x11,0x40,0x02,0x12,0x40,0x04,0x11,0x40,0x04,0x11, 0x40,0x02,0x0f,0x3f,0x01,0x11,0x3f,0x02,0x11,0x3f,0x03,0x13,0x3f,0x03,0x12, 0x3e,0x02,0x12,0x3e,0x03,0x11,0x3d,0x03,0x11,0x3e,0x04,0x11,0x3d,0x03,0x10, 0x3d,0x03,0x0f,0x3d,0x02,0x11,0x3d,0x02,0x11,0x3c,0x02,0x82,0x10,0x3d,0x02, 0x04,0x10,0x3c,0x02,0x10,0x3d,0x02,0x0f,0x3c,0x02,0x0f,0x3b,0x02,0x83,0x0f, 0x3a,0x02,0x02,0x10,0x3a,0x02,0x0f,0x3a,0x02,0x82,0x10,0x39,0x02,0x01,0x0f, 0x39,0x02,0x82,0x0f,0x38,0x02,0x01,0x10,0x38,0x03,0x83,0x0f,0x38,0x02,0x07, 0x0e,0x37,0x02,0x0f,0x38,0x02,0x0e,0x37,0x02,0x0e,0x36,0x02,0x0f,0x35,0x02, 0x0f,0x36,0x02,0x0e,0x36,0x02,0x85,0x0e,0x35,0x02,0x02,0x0f,0x34,0x02,0x0e, 0x33,0x02,0x82,0x0d,0x34,0x02,0x03,0x0d,0x33,0x02,0x0c,0x32,0x02,0x0d,0x32, 0x02,0x83,0x0c,0x32,0x02,0x82,0x0d,0x32,0x02,0x08,0x0c,0x32,0x01,0x0d,0x31, 0x02,0x0c,0x31,0x01,0x0d,0x32,0x02,0x0c,0x31,0x02,0x0c,0x30,0x01,0x0b,0x30, 0x01,0x0c,0x30,0x01,0x82,0x0c,0x30,0x02,0x01,0x0c,0x30,0x01,0x82,0x0c,0x2f, 0x01,0x01,0x0b,0x2e,0x01,0x82,0x0c,0x2e,0x02,0x03,0x0c,0x2d,0x01,0x0c,0x2d, 0x02,0x0c,0x2d,0x01,0x82,0x0b,0x2d,0x01,0x82,0x0c,0x2d,0x02,0x04,0x0c,0x2c, 0x01,0x0b,0x2b,0x02,0x0c,0x2b,0x01,0x0b,0x2c,0x02,0x85,0x0a,0x2b,0x01,0x05, 0x0a,0x2a,0x02,0x0a,0x29,0x02,0x0a,0x2a,0x01,0x0b,0x2a,0x02,0x0b,0x29,0x01, 0x84,0x0a,0x28,0x01,0x0a,0x09,0x28,0x01,0x09,0x27,0x00,0x0a,0x28,0x00,0x0a, 0x27,0x00,0x09,0x27,0x00,0x0a,0x27,0x00,0x0a,0x27,0x02,0x0a,0x26,0x00,0x09, 0x26,0x00,0x09,0x26,0x01,0x82,0x0a,0x26,0x01,0x05,0x08,0x25,0x01,0x0a,0x24, 0x01,0x0a,0x25,0x01,0x09,0x25,0x01,0x0a,0x24,0x00,0x82,0x09,0x23,0x01,0x82, 0x08,0x23,0x00,0x82,0x09,0x23,0x01,0x02,0x08,0x22,0x00,0x09,0x23,0x01,0x83, 0x08,0x22,0x01,0x01,0x08,0x21,0x01,0x83,0x08,0x21,0x00,0x08,0x08,0x21,0x01, 0x07,0x21,0x01,0x07,0x21,0x00,0x08,0x20,0x01,0x07,0x20,0x01,0x07,0x1f,0x00, 0x07,0x1e,0x00,0x07,0x1f,0x01,0x83,0x07,0x1e,0x01,0x83,0x07,0x1e,0x00,0x84, 0x07,0x1d,0x00,0x01,0x06,0x1c,0x00,0x83,0x07,0x1c,0x00,0x03,0x06,0x1c,0x00, 0x07,0x1c,0x01,0x06,0x1c,0x00,0x82,0x06,0x1b,0x00,0x02,0x05,0x1a,0x00,0x05, 0x19,0x00,0x83,0x06,0x19,0x00,0x86,0x05,0x19,0x00,0x82,0x05,0x18,0x00,0x86, 0x05,0x17,0x00,0x84,0x05,0x16,0x00,0x01,0x04,0x16,0x00,0x82,0x05,0x16,0x00, 0x01,0x04,0x16,0x00,0x82,0x04,0x15,0x00,0x01,0x05,0x14,0x00,0x88,0x04,0x14, 0x00,0x82,0x04,0x13,0x00,0x01,0x03,0x12,0x00,0x82,0x04,0x12,0x00,0x01,0x03, 0x12,0x00,0x82,0x04,0x12,0x00,0x87,0x03,0x11,0x00,0x83,0x03,0x10,0x00,0x89, 0x02,0x0f,0x00,0x02,0x02,0x0e,0x00,0x03,0x0e,0x00,0x82,0x02,0x0e,0x00,0x87, 0x02,0x0d,0x00,0x88,0x02,0x0c,0x00,0x84,0x02,0x0b,0x00,0x83,0x02,0x0a,0x00, 0x05,0x02,0x0b,0x00,0x02,0x0c,0x00,0x03,0x0c,0x00,0x04,0x0c,0x00,0x05,0x0d, 0x02,0x85,0x05,0x0c,0x02,0x83,0x05,0x0b,0x02,0x84,0x04,0x0a,0x02,0x82,0x04, 0x09,0x02,0x02,0x04,0x08,0x02,0x03,0x08,0x01,0x83,0x03,0x07,0x01,0x82,0x02, 0x07,0x01,0x82,0x02,0x06,0x01,0x82,0x02,0x05,0x01,0x82,0x02,0x05,0x00,0x82, 0x02,0x04,0x00,0x83,0x01,0x03,0x00,0x01,0x01,0x02,0x00,0x83,0x00,0x02,0x00, 0x82,0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x0c,0x47,0x95,0x15,0x47,0x95,0x18, 0x47,0x95,0x17,0x46,0x96,0x17,0x45,0x95,0x17,0x47,0x95,0x17,0x47,0x96,0x15, 0x47,0x95,0x17,0x46,0x96,0x17,0x45,0x95,0x16,0x45,0x93,0x15,0x46,0x94,0x16, 0x83,0x45,0x93,0x15,0x01,0x46,0x94,0x16,0x82,0x45,0x93,0x15,0x82,0x45,0x93, 0x17,0x83,0x45,0x93,0x15,0x83,0x44,0x93,0x16,0x06,0x47,0x93,0x17,0x44,0x93, 0x16,0x44,0x92,0x15,0x45,0x93,0x17,0x44,0x94,0x17,0x44,0x93,0x16,0x82,0x44, 0x92,0x14,0x82,0x44,0x93,0x15,0x02,0x44,0x92,0x15,0x43,0x91,0x15,0x82,0x44, 0x92,0x15,0x01,0x44,0x93,0x16,0x82,0x44,0x92,0x15,0x83,0x43,0x91,0x15,0x82, 0x44,0x92,0x16,0x82,0x43,0x91,0x15,0x82,0x44,0x92,0x16,0x01,0x43,0x91,0x15, 0x84,0x43,0x90,0x17,0x01,0x43,0x90,0x18,0x83,0x42,0x90,0x17,0x01,0x43,0x90, 0x18,0x83,0x43,0x8f,0x17,0x01,0x42,0x8e,0x18,0x82,0x43,0x8f,0x19,0x01,0x44, 0x90,0x1a,0x82,0x43,0x8f,0x19,0x03,0x43,0x8f,0x1a,0x41,0x8e,0x18,0x42,0x8e, 0x19,0x82,0x43,0x8f,0x1a,0x02,0x42,0x8e,0x19,0x43,0x8e,0x1b,0x82,0x44,0x90, 0x1a,0x82,0x43,0x8e,0x1b,0x82,0x44,0x8f,0x1c,0x01,0x44,0x8f,0x1d,0x82,0x42, 0x8e,0x1d,0x03,0x43,0x8e,0x1f,0x45,0x8e,0x1d,0x43,0x8e,0x1c,0x82,0x44,0x8f, 0x1f,0x82,0x43,0x8e,0x1f,0x07,0x45,0x8e,0x1f,0x44,0x8d,0x1f,0x44,0x8c,0x1e, 0x45,0x8e,0x1f,0x44,0x8f,0x20,0x43,0x8e,0x1f,0x44,0x8d,0x20,0x82,0x43,0x8e, 0x20,0x04,0x44,0x8d,0x20,0x43,0x8e,0x20,0x45,0x8e,0x1f,0x44,0x8d,0x1f,0x82, 0x43,0x8e,0x20,0x0a,0x45,0x8e,0x21,0x44,0x8b,0x1f,0x44,0x8d,0x20,0x43,0x8e, 0x20,0x44,0x8e,0x21,0x42,0x8d,0x1f,0x44,0x8d,0x20,0x44,0x8c,0x1f,0x44,0x8c, 0x21,0x44,0x8d,0x22,0x82,0x44,0x8c,0x21,0x0b,0x44,0x8d,0x20,0x44,0x8c,0x1f, 0x45,0x8c,0x22,0x44,0x8b,0x20,0x43,0x8a,0x1f,0x43,0x8b,0x22,0x44,0x8c,0x21, 0x41,0x8b,0x20,0x42,0x8c,0x21,0x41,0x8b,0x20,0x44,0x8d,0x22,0x82,0x43,0x8b, 0x20,0x01,0x44,0x8c,0x21,0x82,0x44,0x8d,0x22,0x85,0x43,0x8b,0x20,0x06,0x44, 0x8b,0x22,0x42,0x8a,0x21,0x41,0x8b,0x20,0x42,0x8b,0x1f,0x44,0x8c,0x21,0x43, 0x8b,0x22,0x82,0x44,0x8c,0x21,0x03,0x42,0x8a,0x21,0x44,0x8c,0x21,0x42,0x8a, 0x21,0x82,0x41,0x89,0x20,0x84,0x42,0x8a,0x21,0x02,0x41,0x89,0x20,0x42,0x8b, 0x1f,0x82,0x41,0x89,0x20,0x01,0x42,0x8a,0x21,0x82,0x41,0x89,0x1f,0x02,0x42, 0x8a,0x21,0x41,0x89,0x20,0x82,0x41,0x89,0x21,0x02,0x41,0x89,0x1f,0x40,0x88, 0x20,0x82,0x3f,0x87,0x1f,0x0b,0x41,0x89,0x21,0x41,0x89,0x22,0x41,0x88,0x21, 0x40,0x86,0x1f,0x41,0x87,0x20,0x3f,0x87,0x1f,0x3e,0x86,0x1e,0x3e,0x84,0x1d, 0x3f,0x86,0x1f,0x40,0x88,0x20,0x40,0x86,0x1f,0x82,0x3f,0x86,0x1f,0x01,0x40, 0x86,0x1f,0x83,0x3f,0x85,0x1e,0x01,0x3f,0x85,0x1f,0x82,0x3e,0x84,0x1e,0x03, 0x3f,0x85,0x1f,0x3c,0x83,0x1c,0x3d,0x83,0x1d,0x82,0x3f,0x85,0x1f,0x01,0x3d, 0x83,0x1d,0x83,0x3e,0x84,0x1d,0x03,0x3d,0x85,0x1d,0x3e,0x86,0x1e,0x3f,0x85, 0x1f,0x82,0x3d,0x83,0x1d,0x03,0x3f,0x85,0x1e,0x3e,0x84,0x1d,0x3d,0x83,0x1c, 0x82,0x3e,0x84,0x1d,0x01,0x3d,0x83,0x1d,0x83,0x3c,0x83,0x1c,0x0c,0x3e,0x84, 0x1e,0x3d,0x83,0x1c,0x3e,0x84,0x1d,0x3d,0x83,0x1c,0x3c,0x83,0x1c,0x3b,0x83, 0x1b,0x3c,0x83,0x1c,0x3c,0x84,0x1b,0x3d,0x85,0x1c,0x3c,0x84,0x1b,0x3d,0x85, 0x1c,0x3f,0x86,0x1d,0x83,0x3c,0x84,0x1b,0x24,0x3c,0x85,0x1a,0x3d,0x85,0x1c, 0x3c,0x85,0x1a,0x3a,0x82,0x1a,0x3e,0x86,0x1b,0x3c,0x85,0x1a,0x3b,0x83,0x1a, 0x3b,0x85,0x1a,0x3c,0x85,0x1a,0x3d,0x87,0x1c,0x3c,0x84,0x19,0x3c,0x83,0x1a, 0x39,0x83,0x1a,0x39,0x81,0x18,0x3b,0x83,0x1a,0x3c,0x84,0x1b,0x39,0x81,0x1a, 0x38,0x82,0x1a,0x38,0x7f,0x1a,0x3a,0x7e,0x19,0x39,0x81,0x15,0x3a,0x7f,0x17, 0x39,0x7b,0x18,0x39,0x7d,0x19,0x38,0x7c,0x17,0x38,0x7c,0x18,0x39,0x7d,0x17, 0x39,0x7e,0x17,0x38,0x7e,0x18,0x32,0x77,0x15,0x2c,0x71,0x13,0x23,0x68,0x0b, 0x1d,0x5e,0x07,0x1e,0x5e,0x07,0x1f,0x61,0x07,0x22,0x64,0x07,0x82,0x20,0x63, 0x08,0x02,0x21,0x64,0x09,0x20,0x63,0x09,0x86,0x1f,0x61,0x07,0x06,0x1f,0x60, 0x06,0x1e,0x5f,0x06,0x1c,0x5d,0x06,0x1d,0x5e,0x05,0x1d,0x5e,0x07,0x1c,0x5d, 0x06,0x83,0x1c,0x5c,0x05,0x03,0x1b,0x5c,0x06,0x1b,0x5d,0x05,0x1b,0x5c,0x05, 0x82,0x1a,0x5b,0x05,0x02,0x1b,0x5c,0x05,0x1a,0x5a,0x03,0x83,0x1a,0x5b,0x05, 0x82,0x1a,0x5a,0x03,0x05,0x19,0x59,0x04,0x1a,0x5a,0x05,0x19,0x59,0x04,0x18, 0x59,0x03,0x19,0x5b,0x03,0x83,0x19,0x59,0x04,0x82,0x18,0x57,0x03,0x07,0x19, 0x58,0x04,0x18,0x56,0x03,0x17,0x56,0x02,0x18,0x57,0x04,0x17,0x56,0x02,0x17, 0x55,0x02,0x17,0x56,0x03,0x82,0x18,0x56,0x04,0x82,0x18,0x54,0x03,0x82,0x19, 0x54,0x04,0x03,0x18,0x54,0x03,0x18,0x54,0x05,0x17,0x53,0x05,0x82,0x17,0x52, 0x04,0x04,0x17,0x52,0x03,0x19,0x51,0x05,0x17,0x52,0x03,0x17,0x53,0x05,0x82, 0x17,0x51,0x05,0x82,0x17,0x50,0x04,0x01,0x16,0x51,0x05,0x83,0x17,0x50,0x05, 0x07,0x15,0x4f,0x03,0x15,0x4f,0x04,0x17,0x4f,0x05,0x16,0x4f,0x04,0x16,0x4f, 0x05,0x15,0x4f,0x04,0x16,0x4e,0x04,0x82,0x15,0x4d,0x04,0x02,0x15,0x4f,0x05, 0x16,0x4d,0x03,0x82,0x16,0x4f,0x04,0x07,0x16,0x4d,0x03,0x15,0x4c,0x04,0x17, 0x4d,0x04,0x16,0x4c,0x04,0x15,0x4c,0x03,0x15,0x4a,0x03,0x15,0x4c,0x04,0x82, 0x15,0x4c,0x03,0x09,0x15,0x4b,0x03,0x16,0x4c,0x04,0x15,0x4a,0x04,0x16,0x4b, 0x05,0x15,0x4c,0x03,0x15,0x49,0x02,0x15,0x4a,0x02,0x14,0x49,0x02,0x15,0x49, 0x02,0x82,0x14,0x48,0x03,0x03,0x15,0x49,0x05,0x16,0x47,0x04,0x14,0x47,0x03, 0x83,0x15,0x47,0x04,0x02,0x14,0x47,0x04,0x15,0x46,0x04,0x82,0x14,0x47,0x04, 0x0a,0x14,0x46,0x04,0x13,0x47,0x04,0x14,0x46,0x04,0x13,0x45,0x03,0x14,0x45, 0x04,0x12,0x43,0x02,0x12,0x44,0x02,0x12,0x44,0x04,0x13,0x44,0x04,0x12,0x43, 0x04,0x84,0x12,0x42,0x02,0x03,0x12,0x41,0x04,0x12,0x41,0x02,0x12,0x42,0x03, 0x84,0x12,0x41,0x03,0x03,0x12,0x40,0x03,0x12,0x41,0x04,0x11,0x40,0x02,0x83, 0x11,0x3f,0x03,0x14,0x12,0x3e,0x02,0x12,0x3f,0x02,0x12,0x3e,0x02,0x12,0x3f, 0x03,0x12,0x3d,0x03,0x0f,0x3d,0x02,0x11,0x3e,0x03,0x11,0x3d,0x02,0x12,0x3c, 0x02,0x11,0x3c,0x02,0x12,0x3c,0x02,0x11,0x3c,0x02,0x10,0x3c,0x02,0x0f,0x3c, 0x02,0x10,0x3c,0x02,0x11,0x3b,0x02,0x10,0x3c,0x03,0x10,0x3b,0x02,0x0f,0x3c, 0x02,0x10,0x3b,0x03,0x82,0x11,0x3a,0x03,0x02,0x10,0x39,0x02,0x0f,0x39,0x02, 0x82,0x10,0x39,0x03,0x01,0x0f,0x37,0x02,0x83,0x0f,0x38,0x02,0x83,0x0e,0x37, 0x02,0x01,0x0f,0x36,0x02,0x83,0x0f,0x37,0x02,0x82,0x0e,0x35,0x02,0x03,0x0e, 0x34,0x02,0x0d,0x34,0x02,0x0e,0x34,0x02,0x82,0x0f,0x34,0x02,0x0b,0x0e,0x34, 0x02,0x0d,0x33,0x02,0x0d,0x34,0x02,0x0f,0x34,0x02,0x0d,0x34,0x02,0x0d,0x33, 0x02,0x0d,0x32,0x02,0x0e,0x32,0x02,0x0d,0x33,0x02,0x0d,0x32,0x01,0x0e,0x32, 0x02,0x82,0x0d,0x32,0x01,0x0b,0x0c,0x31,0x01,0x0d,0x32,0x02,0x0d,0x31,0x02, 0x0b,0x30,0x01,0x0c,0x30,0x01,0x0c,0x31,0x02,0x0c,0x30,0x01,0x0c,0x2f,0x01, 0x0d,0x30,0x02,0x0c,0x2f,0x01,0x0c,0x2f,0x02,0x82,0x0c,0x2e,0x01,0x06,0x0d, 0x2e,0x02,0x0c,0x2e,0x01,0x0b,0x2e,0x02,0x0c,0x2e,0x02,0x0b,0x2d,0x01,0x0b, 0x2d,0x02,0x82,0x0c,0x2c,0x01,0x01,0x0b,0x2c,0x01,0x83,0x0b,0x2c,0x02,0x08, 0x0a,0x2c,0x01,0x0b,0x2c,0x01,0x0b,0x2b,0x02,0x0a,0x2a,0x01,0x0a,0x2a,0x02, 0x0a,0x2a,0x00,0x0a,0x2a,0x02,0x0a,0x2a,0x01,0x82,0x0b,0x2a,0x01,0x83,0x0a, 0x28,0x01,0x03,0x09,0x27,0x01,0x0a,0x28,0x00,0x0a,0x28,0x01,0x82,0x0a,0x27, 0x00,0x06,0x0a,0x27,0x01,0x0a,0x27,0x02,0x0a,0x26,0x00,0x09,0x27,0x01,0x0a, 0x26,0x02,0x0a,0x26,0x01,0x82,0x0a,0x25,0x01,0x85,0x09,0x24,0x01,0x82,0x09, 0x24,0x00,0x04,0x0a,0x24,0x01,0x09,0x23,0x00,0x08,0x22,0x00,0x09,0x23,0x01, 0x86,0x08,0x22,0x01,0x01,0x08,0x21,0x00,0x82,0x07,0x21,0x00,0x02,0x07,0x21, 0x01,0x08,0x21,0x01,0x82,0x07,0x1f,0x00,0x01,0x07,0x1f,0x01,0x84,0x07,0x1f, 0x00,0x82,0x07,0x1e,0x00,0x83,0x07,0x1e,0x01,0x82,0x07,0x1d,0x01,0x82,0x06, 0x1c,0x00,0x82,0x07,0x1c,0x00,0x01,0x06,0x1b,0x00,0x82,0x06,0x1c,0x00,0x83, 0x06,0x1a,0x00,0x03,0x05,0x1a,0x00,0x06,0x1a,0x00,0x06,0x1a,0x01,0x83,0x05, 0x1a,0x00,0x83,0x05,0x19,0x00,0x83,0x05,0x18,0x00,0x02,0x05,0x17,0x00,0x05, 0x18,0x00,0x88,0x05,0x17,0x00,0x04,0x05,0x16,0x00,0x05,0x15,0x00,0x05,0x16, 0x00,0x05,0x15,0x00,0x87,0x04,0x15,0x00,0x84,0x04,0x14,0x00,0x82,0x03,0x13, 0x00,0x02,0x04,0x13,0x00,0x03,0x12,0x00,0x82,0x04,0x12,0x00,0x02,0x03,0x12, 0x00,0x04,0x12,0x00,0x82,0x03,0x12,0x00,0x85,0x03,0x11,0x00,0x82,0x03,0x10, 0x00,0x01,0x02,0x10,0x00,0x89,0x02,0x0f,0x00,0x01,0x02,0x0e,0x00,0x82,0x03, 0x0e,0x00,0x01,0x02,0x0e,0x00,0x8a,0x02,0x0d,0x00,0x83,0x02,0x0c,0x00,0x85, 0x02,0x0b,0x00,0x87,0x02,0x0a,0x00,0x01,0x02,0x0b,0x00,0x82,0x03,0x0c,0x00, 0x01,0x04,0x0d,0x01,0x83,0x05,0x0c,0x02,0x82,0x05,0x0b,0x02,0x01,0x05,0x0a, 0x02,0x84,0x04,0x0a,0x02,0x82,0x04,0x09,0x02,0x02,0x03,0x08,0x02,0x03,0x08, 0x01,0x83,0x03,0x07,0x01,0x01,0x02,0x07,0x01,0x83,0x02,0x06,0x01,0x82,0x02, 0x05,0x01,0x82,0x02,0x05,0x00,0x82,0x02,0x04,0x00,0x01,0x01,0x04,0x00,0x82, 0x01,0x03,0x00,0x01,0x01,0x02,0x00,0x83,0x00,0x02,0x00,0x82,0x00,0x01,0x00, 0xdc,0x00,0x00,0x00,0x01,0x47,0x98,0x16,0x82,0x46,0x95,0x16,0x82,0x48,0x96, 0x17,0x0f,0x46,0x95,0x16,0x45,0x95,0x14,0x46,0x96,0x15,0x46,0x97,0x15,0x46, 0x97,0x17,0x47,0x96,0x17,0x46,0x95,0x16,0x46,0x95,0x17,0x46,0x95,0x16,0x46, 0x95,0x15,0x45,0x95,0x15,0x46,0x95,0x14,0x45,0x94,0x15,0x45,0x94,0x16,0x46, 0x95,0x17,0x82,0x46,0x95,0x15,0x01,0x45,0x94,0x15,0x82,0x45,0x94,0x16,0x02, 0x44,0x93,0x15,0x44,0x95,0x16,0x82,0x45,0x94,0x16,0x82,0x44,0x93,0x14,0x01, 0x45,0x94,0x15,0x82,0x44,0x93,0x14,0x01,0x45,0x94,0x16,0x82,0x44,0x93,0x15, 0x01,0x44,0x92,0x15,0x82,0x44,0x93,0x15,0x01,0x44,0x93,0x14,0x82,0x44,0x93, 0x15,0x02,0x43,0x92,0x14,0x43,0x92,0x15,0x82,0x44,0x93,0x15,0x03,0x44,0x93, 0x16,0x44,0x93,0x15,0x43,0x92,0x14,0x82,0x44,0x93,0x15,0x01,0x43,0x92,0x15, 0x83,0x43,0x91,0x16,0x03,0x44,0x92,0x17,0x44,0x91,0x18,0x43,0x90,0x17,0x82, 0x43,0x91,0x16,0x01,0x43,0x91,0x18,0x82,0x42,0x90,0x17,0x01,0x43,0x90,0x18, 0x82,0x44,0x90,0x18,0x83,0x43,0x90,0x18,0x03,0x44,0x90,0x19,0x44,0x91,0x1a, 0x43,0x90,0x19,0x84,0x44,0x90,0x1a,0x82,0x44,0x90,0x1c,0x03,0x44,0x90,0x1a, 0x44,0x90,0x1d,0x44,0x90,0x1c,0x82,0x44,0x90,0x1d,0x03,0x44,0x90,0x1c,0x43, 0x8f,0x1c,0x43,0x8f,0x1d,0x83,0x44,0x90,0x1d,0x02,0x44,0x90,0x1f,0x44,0x90, 0x20,0x82,0x44,0x8f,0x1f,0x02,0x46,0x90,0x1f,0x44,0x8e,0x1d,0x82,0x45,0x8e, 0x1f,0x03,0x43,0x8e,0x1e,0x42,0x8d,0x1d,0x44,0x8d,0x20,0x82,0x44,0x8f,0x20, 0x82,0x44,0x8d,0x20,0x07,0x45,0x8d,0x20,0x44,0x8d,0x1f,0x44,0x8f,0x20,0x44, 0x90,0x21,0x45,0x8e,0x20,0x44,0x8d,0x1f,0x43,0x8d,0x21,0x83,0x44,0x8d,0x1f, 0x82,0x44,0x8d,0x20,0x83,0x44,0x8d,0x21,0x02,0x46,0x8d,0x20,0x45,0x8e,0x22, 0x82,0x43,0x8e,0x20,0x07,0x44,0x8d,0x23,0x44,0x8d,0x21,0x44,0x8c,0x20,0x44, 0x8c,0x22,0x45,0x8e,0x22,0x42,0x8d,0x20,0x42,0x8b,0x1f,0x82,0x44,0x8d,0x20, 0x82,0x43,0x8c,0x20,0x82,0x44,0x8d,0x20,0x01,0x43,0x8c,0x20,0x82,0x44,0x8d, 0x20,0x82,0x43,0x8c,0x20,0x0b,0x44,0x8d,0x20,0x43,0x8d,0x23,0x44,0x8d,0x21, 0x44,0x8d,0x20,0x44,0x8c,0x22,0x41,0x8c,0x21,0x44,0x8d,0x21,0x44,0x8d,0x20, 0x42,0x8b,0x20,0x44,0x8c,0x20,0x44,0x8d,0x20,0x82,0x41,0x8a,0x20,0x01,0x44, 0x8c,0x22,0x83,0x43,0x8b,0x21,0x02,0x41,0x8a,0x20,0x42,0x8b,0x20,0x82,0x41, 0x8a,0x20,0x08,0x43,0x8b,0x21,0x42,0x8b,0x22,0x41,0x89,0x1f,0x41,0x8a,0x20, 0x41,0x89,0x1f,0x41,0x8a,0x21,0x41,0x89,0x20,0x41,0x88,0x20,0x82,0x40,0x88, 0x20,0x01,0x41,0x89,0x20,0x82,0x40,0x88,0x20,0x13,0x41,0x88,0x20,0x3e,0x85, 0x1d,0x3f,0x88,0x1f,0x40,0x88,0x20,0x3f,0x88,0x1f,0x3f,0x86,0x1e,0x3e,0x85, 0x1d,0x3e,0x87,0x1f,0x41,0x88,0x20,0x40,0x87,0x1f,0x3f,0x86,0x1e,0x41,0x88, 0x20,0x3e,0x85,0x1d,0x3f,0x86,0x1e,0x3f,0x86,0x1f,0x40,0x87,0x20,0x3e,0x85, 0x1e,0x3f,0x86,0x1f,0x41,0x88,0x20,0x82,0x3e,0x85,0x1e,0x82,0x3f,0x86,0x1f, 0x82,0x3e,0x85,0x1e,0x02,0x3f,0x86,0x1f,0x3e,0x85,0x1e,0x82,0x3d,0x85,0x1d, 0x03,0x3e,0x85,0x1d,0x3e,0x85,0x1e,0x3f,0x86,0x1f,0x82,0x3e,0x85,0x1d,0x05, 0x3d,0x84,0x1d,0x3e,0x85,0x1d,0x3d,0x84,0x1d,0x3e,0x85,0x1d,0x3e,0x85,0x1e, 0x83,0x3e,0x85,0x1d,0x08,0x3e,0x85,0x1e,0x3c,0x83,0x1c,0x3d,0x84,0x1d,0x3c, 0x85,0x1c,0x3e,0x86,0x1d,0x3e,0x86,0x1c,0x3d,0x85,0x1b,0x3e,0x86,0x1c,0x82, 0x3e,0x87,0x1d,0x09,0x3e,0x86,0x1c,0x3d,0x85,0x1b,0x3c,0x87,0x1c,0x3b,0x86, 0x1b,0x3b,0x86,0x1a,0x3e,0x88,0x1c,0x3c,0x88,0x19,0x3c,0x85,0x1b,0x3c,0x88, 0x19,0x82,0x3b,0x86,0x1a,0x03,0x3c,0x88,0x19,0x3d,0x88,0x1b,0x3b,0x87,0x18, 0x82,0x3b,0x85,0x19,0x19,0x3b,0x83,0x19,0x3b,0x83,0x1b,0x39,0x82,0x16,0x39, 0x82,0x19,0x3b,0x83,0x19,0x39,0x84,0x18,0x3a,0x81,0x19,0x39,0x80,0x18,0x3b, 0x82,0x1b,0x39,0x80,0x1a,0x37,0x7c,0x17,0x39,0x80,0x18,0x3b,0x7f,0x18,0x39, 0x7d,0x18,0x3a,0x7f,0x1a,0x36,0x7d,0x16,0x36,0x7d,0x15,0x37,0x80,0x18,0x38, 0x80,0x18,0x39,0x81,0x19,0x36,0x7d,0x17,0x2b,0x71,0x10,0x20,0x63,0x08,0x1d, 0x60,0x05,0x20,0x63,0x08,0x82,0x21,0x64,0x08,0x02,0x20,0x64,0x08,0x22,0x64, 0x0a,0x82,0x22,0x64,0x09,0x02,0x20,0x62,0x08,0x1e,0x60,0x06,0x82,0x20,0x62, 0x08,0x03,0x1e,0x60,0x06,0x1d,0x5f,0x07,0x1e,0x5f,0x08,0x82,0x1d,0x5f,0x07, 0x01,0x1d,0x5e,0x06,0x82,0x1d,0x5f,0x07,0x02,0x1c,0x5d,0x07,0x1b,0x5e,0x05, 0x83,0x1b,0x5c,0x05,0x05,0x1b,0x5c,0x04,0x1a,0x5b,0x03,0x1b,0x5c,0x06,0x1c, 0x5c,0x06,0x1b,0x5c,0x04,0x82,0x19,0x5a,0x02,0x08,0x19,0x5a,0x04,0x1b,0x5c, 0x05,0x19,0x5a,0x04,0x18,0x59,0x03,0x19,0x5c,0x05,0x19,0x59,0x05,0x18,0x59, 0x03,0x19,0x59,0x04,0x82,0x19,0x59,0x02,0x04,0x19,0x59,0x04,0x18,0x57,0x05, 0x18,0x57,0x04,0x18,0x58,0x04,0x84,0x18,0x57,0x03,0x01,0x18,0x56,0x03,0x82, 0x18,0x55,0x03,0x03,0x18,0x55,0x05,0x18,0x55,0x03,0x17,0x54,0x02,0x82,0x17, 0x54,0x05,0x02,0x16,0x52,0x03,0x17,0x53,0x04,0x82,0x18,0x54,0x05,0x1c,0x17, 0x52,0x04,0x18,0x51,0x03,0x16,0x51,0x05,0x17,0x53,0x05,0x17,0x52,0x05,0x16, 0x51,0x04,0x16,0x51,0x02,0x15,0x51,0x03,0x18,0x51,0x05,0x16,0x51,0x05,0x15, 0x51,0x04,0x17,0x50,0x05,0x16,0x4f,0x04,0x15,0x4f,0x03,0x15,0x4f,0x04,0x16, 0x50,0x05,0x16,0x4f,0x05,0x15,0x4e,0x04,0x15,0x4f,0x04,0x15,0x4f,0x05,0x16, 0x4e,0x05,0x15,0x4d,0x04,0x15,0x4f,0x04,0x16,0x4e,0x03,0x15,0x4c,0x04,0x17, 0x4e,0x04,0x16,0x4d,0x04,0x15,0x4c,0x03,0x82,0x15,0x4c,0x04,0x0a,0x16,0x4e, 0x04,0x14,0x4c,0x03,0x16,0x4c,0x05,0x16,0x4c,0x03,0x16,0x49,0x03,0x15,0x4a, 0x03,0x15,0x4b,0x03,0x15,0x4b,0x04,0x14,0x4a,0x03,0x15,0x4c,0x04,0x82,0x14, 0x49,0x03,0x06,0x15,0x49,0x04,0x14,0x49,0x03,0x15,0x47,0x03,0x14,0x48,0x03, 0x14,0x49,0x04,0x15,0x48,0x04,0x82,0x14,0x47,0x03,0x83,0x14,0x47,0x04,0x05, 0x14,0x46,0x04,0x13,0x47,0x04,0x14,0x46,0x04,0x13,0x46,0x02,0x13,0x45,0x02, 0x82,0x13,0x45,0x03,0x07,0x13,0x44,0x03,0x13,0x44,0x04,0x13,0x45,0x04,0x13, 0x44,0x05,0x13,0x43,0x04,0x12,0x44,0x02,0x12,0x43,0x04,0x82,0x13,0x43,0x04, 0x04,0x12,0x42,0x02,0x11,0x42,0x02,0x12,0x41,0x04,0x13,0x42,0x03,0x82,0x11, 0x41,0x02,0x07,0x12,0x41,0x03,0x12,0x41,0x04,0x11,0x40,0x03,0x11,0x40,0x02, 0x12,0x41,0x04,0x13,0x3f,0x02,0x12,0x3e,0x02,0x82,0x11,0x3f,0x02,0x05,0x12, 0x3e,0x03,0x11,0x3d,0x03,0x10,0x3e,0x02,0x11,0x3e,0x01,0x13,0x3e,0x02,0x83, 0x12,0x3d,0x02,0x82,0x10,0x3d,0x02,0x02,0x10,0x3c,0x02,0x11,0x3b,0x02,0x83, 0x10,0x3b,0x02,0x08,0x0f,0x3a,0x02,0x10,0x3a,0x02,0x11,0x3b,0x02,0x10,0x3a, 0x02,0x10,0x3b,0x03,0x10,0x3a,0x03,0x10,0x39,0x02,0x0f,0x38,0x02,0x82,0x10, 0x38,0x02,0x04,0x0f,0x38,0x03,0x0e,0x37,0x02,0x0e,0x39,0x02,0x10,0x39,0x03, 0x82,0x0f,0x38,0x02,0x03,0x0e,0x37,0x02,0x0e,0x36,0x02,0x0e,0x37,0x02,0x82, 0x0e,0x36,0x02,0x01,0x0d,0x36,0x02,0x82,0x0e,0x36,0x02,0x06,0x0f,0x35,0x02, 0x0e,0x34,0x02,0x0e,0x35,0x02,0x0d,0x35,0x02,0x0e,0x33,0x02,0x0d,0x34,0x02, 0x82,0x0d,0x33,0x02,0x01,0x0e,0x33,0x02,0x83,0x0d,0x33,0x02,0x0e,0x0d,0x32, 0x01,0x0d,0x33,0x02,0x0d,0x32,0x02,0x0c,0x31,0x01,0x0d,0x31,0x01,0x0c,0x31, 0x02,0x0d,0x31,0x02,0x0c,0x30,0x01,0x0c,0x31,0x01,0x0c,0x30,0x01,0x0d,0x31, 0x02,0x0d,0x30,0x02,0x0c,0x30,0x02,0x0c,0x2f,0x02,0x82,0x0c,0x2e,0x02,0x07, 0x0b,0x2e,0x02,0x0b,0x2e,0x01,0x0b,0x2e,0x02,0x0c,0x2e,0x02,0x0b,0x2e,0x01, 0x0b,0x2d,0x02,0x0c,0x2e,0x02,0x82,0x0a,0x2c,0x01,0x08,0x0c,0x2c,0x02,0x0b, 0x2b,0x01,0x0a,0x2b,0x01,0x0b,0x2c,0x02,0x0b,0x2b,0x02,0x0a,0x2b,0x01,0x0b, 0x2b,0x01,0x0a,0x2a,0x01,0x82,0x0b,0x2a,0x01,0x82,0x0a,0x2a,0x02,0x0a,0x0a, 0x29,0x00,0x0a,0x28,0x00,0x0a,0x29,0x01,0x0a,0x28,0x01,0x0a,0x28,0x00,0x0a, 0x28,0x01,0x0a,0x28,0x00,0x09,0x28,0x00,0x09,0x27,0x02,0x0a,0x28,0x02,0x82, 0x0a,0x27,0x01,0x0a,0x0a,0x26,0x00,0x09,0x26,0x00,0x0a,0x26,0x00,0x0a,0x26, 0x02,0x09,0x25,0x00,0x09,0x24,0x01,0x08,0x25,0x02,0x0a,0x25,0x02,0x09,0x24, 0x01,0x08,0x24,0x00,0x82,0x09,0x24,0x00,0x01,0x09,0x23,0x00,0x82,0x09,0x23, 0x01,0x03,0x08,0x23,0x01,0x09,0x23,0x01,0x08,0x23,0x01,0x83,0x08,0x22,0x01, 0x84,0x08,0x21,0x00,0x01,0x08,0x20,0x01,0x83,0x08,0x20,0x00,0x82,0x08,0x1f, 0x00,0x01,0x07,0x1f,0x00,0x82,0x08,0x1f,0x00,0x82,0x08,0x1e,0x00,0x04,0x07, 0x1e,0x01,0x07,0x1d,0x00,0x07,0x1d,0x01,0x07,0x1d,0x00,0x82,0x07,0x1d,0x01, 0x04,0x07,0x1c,0x00,0x07,0x1c,0x01,0x07,0x1c,0x00,0x06,0x1c,0x00,0x84,0x06, 0x1b,0x00,0x02,0x06,0x1a,0x00,0x06,0x1b,0x01,0x84,0x05,0x1a,0x00,0x03,0x05, 0x19,0x00,0x06,0x1a,0x00,0x06,0x19,0x00,0x8a,0x05,0x18,0x00,0x83,0x05,0x17, 0x00,0x82,0x05,0x16,0x00,0x83,0x05,0x15,0x00,0x82,0x04,0x15,0x00,0x83,0x05, 0x15,0x00,0x01,0x05,0x14,0x00,0x83,0x04,0x14,0x00,0x84,0x04,0x13,0x00,0x04, 0x03,0x13,0x00,0x04,0x13,0x00,0x03,0x13,0x00,0x04,0x13,0x00,0x84,0x03,0x12, 0x00,0x84,0x03,0x11,0x00,0x83,0x03,0x10,0x00,0x05,0x02,0x10,0x00,0x03,0x10, 0x00,0x02,0x10,0x00,0x03,0x10,0x00,0x02,0x10,0x00,0x84,0x02,0x0f,0x00,0x83, 0x02,0x0e,0x00,0x8b,0x02,0x0d,0x00,0x82,0x02,0x0c,0x00,0x85,0x02,0x0b,0x00, 0x87,0x02,0x0a,0x00,0x82,0x02,0x09,0x00,0x82,0x02,0x0a,0x00,0x05,0x02,0x0b, 0x00,0x03,0x0c,0x00,0x04,0x0b,0x00,0x05,0x0c,0x02,0x05,0x0b,0x02,0x83,0x05, 0x0a,0x02,0x83,0x04,0x0a,0x02,0x82,0x04,0x09,0x02,0x03,0x03,0x08,0x02,0x03, 0x08,0x01,0x03,0x08,0x02,0x82,0x03,0x08,0x01,0x01,0x03,0x07,0x01,0x83,0x02, 0x06,0x01,0x04,0x02,0x05,0x01,0x02,0x05,0x00,0x02,0x05,0x01,0x02,0x05,0x00, 0x82,0x02,0x04,0x00,0x01,0x01,0x04,0x00,0x82,0x01,0x03,0x00,0x82,0x01,0x02, 0x00,0x82,0x00,0x02,0x00,0x82,0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x04,0x49, 0x99,0x15,0x48,0x98,0x17,0x47,0x97,0x16,0x47,0x98,0x15,0x82,0x47,0x97,0x16, 0x01,0x46,0x97,0x14,0x82,0x48,0x98,0x16,0x04,0x47,0x97,0x16,0x46,0x96,0x16, 0x46,0x96,0x17,0x46,0x95,0x16,0x83,0x46,0x97,0x16,0x02,0x46,0x97,0x14,0x46, 0x95,0x15,0x82,0x45,0x95,0x16,0x82,0x45,0x96,0x15,0x82,0x45,0x95,0x14,0x06, 0x46,0x95,0x16,0x45,0x95,0x16,0x44,0x94,0x15,0x44,0x94,0x13,0x45,0x95,0x14, 0x46,0x95,0x15,0x82,0x45,0x95,0x14,0x01,0x44,0x94,0x15,0x82,0x45,0x95,0x16, 0x01,0x43,0x93,0x14,0x83,0x44,0x94,0x15,0x01,0x45,0x95,0x16,0x82,0x45,0x95, 0x14,0x82,0x43,0x93,0x14,0x02,0x43,0x95,0x15,0x45,0x95,0x16,0x82,0x43,0x93, 0x14,0x02,0x44,0x92,0x15,0x44,0x92,0x14,0x82,0x43,0x93,0x15,0x01,0x43,0x92, 0x14,0x83,0x43,0x92,0x16,0x01,0x43,0x94,0x17,0x82,0x43,0x92,0x18,0x08,0x43, 0x92,0x16,0x44,0x93,0x17,0x43,0x92,0x16,0x45,0x92,0x19,0x45,0x91,0x17,0x43, 0x92,0x17,0x44,0x92,0x18,0x43,0x91,0x19,0x82,0x43,0x92,0x19,0x01,0x45,0x92, 0x1a,0x83,0x43,0x91,0x19,0x05,0x44,0x92,0x19,0x43,0x92,0x19,0x43,0x92,0x1a, 0x44,0x92,0x1a,0x44,0x91,0x1c,0x82,0x43,0x90,0x1b,0x02,0x42,0x8f,0x19,0x42, 0x8f,0x1b,0x82,0x43,0x90,0x1c,0x05,0x43,0x8f,0x1c,0x43,0x90,0x1c,0x44,0x91, 0x1c,0x43,0x90,0x1b,0x43,0x90,0x1e,0x82,0x44,0x91,0x1f,0x06,0x43,0x8f,0x1f, 0x44,0x90,0x1f,0x43,0x90,0x1e,0x45,0x8f,0x1e,0x45,0x8f,0x1c,0x46,0x8f,0x1f, 0x82,0x43,0x8f,0x1f,0x06,0x44,0x90,0x1f,0x43,0x91,0x21,0x43,0x8f,0x20,0x45, 0x8f,0x20,0x44,0x90,0x1f,0x45,0x8d,0x21,0x82,0x45,0x8f,0x20,0x08,0x44,0x8e, 0x1f,0x45,0x8f,0x21,0x43,0x8f,0x20,0x43,0x8f,0x1f,0x44,0x8e,0x21,0x44,0x8e, 0x1f,0x43,0x8d,0x1f,0x44,0x8e,0x1f,0x82,0x45,0x8f,0x21,0x04,0x46,0x8f,0x22, 0x45,0x8f,0x21,0x43,0x8e,0x21,0x43,0x8e,0x22,0x83,0x43,0x8f,0x21,0x03,0x45, 0x8f,0x21,0x46,0x8e,0x21,0x44,0x8d,0x20,0x84,0x45,0x8f,0x21,0x09,0x44,0x8e, 0x21,0x43,0x8d,0x20,0x43,0x8c,0x21,0x44,0x8e,0x21,0x42,0x8d,0x20,0x44,0x8e, 0x21,0x43,0x8d,0x20,0x43,0x8d,0x21,0x43,0x8d,0x20,0x83,0x44,0x8e,0x21,0x03, 0x41,0x8d,0x1f,0x41,0x8d,0x21,0x44,0x8e,0x21,0x82,0x43,0x8c,0x21,0x02,0x44, 0x8d,0x20,0x43,0x8b,0x1f,0x82,0x42,0x8b,0x20,0x82,0x43,0x8d,0x1f,0x02,0x43, 0x8d,0x20,0x43,0x8d,0x21,0x83,0x42,0x8b,0x20,0x09,0x43,0x8b,0x20,0x41,0x8a, 0x1f,0x42,0x8b,0x20,0x41,0x8a,0x1f,0x41,0x8a,0x21,0x40,0x8a,0x20,0x41,0x8a, 0x21,0x41,0x8a,0x1f,0x40,0x8a,0x1f,0x82,0x41,0x8a,0x21,0x82,0x40,0x88,0x1f, 0x01,0x3f,0x88,0x1f,0x82,0x40,0x8a,0x20,0x0a,0x40,0x89,0x1f,0x41,0x89,0x20, 0x40,0x88,0x1f,0x40,0x89,0x1f,0x3f,0x88,0x1f,0x40,0x8a,0x20,0x41,0x89,0x20, 0x3f,0x87,0x1f,0x3f,0x88,0x1f,0x40,0x88,0x1f,0x82,0x40,0x87,0x1f,0x09,0x41, 0x89,0x20,0x40,0x87,0x1f,0x40,0x88,0x1f,0x3f,0x88,0x1f,0x3e,0x87,0x1f,0x3f, 0x87,0x1e,0x40,0x87,0x1f,0x40,0x88,0x20,0x3f,0x87,0x1f,0x82,0x3e,0x86,0x1e, 0x82,0x3f,0x87,0x1f,0x82,0x3e,0x86,0x1e,0x82,0x3f,0x87,0x1f,0x82,0x3e,0x86, 0x1e,0x02,0x3f,0x87,0x1f,0x3e,0x85,0x1d,0x84,0x3e,0x86,0x1e,0x82,0x3c,0x84, 0x1c,0x84,0x3e,0x86,0x1e,0x03,0x3e,0x85,0x1d,0x3e,0x86,0x1e,0x3b,0x83,0x1b, 0x82,0x3d,0x86,0x1c,0x82,0x3e,0x87,0x1c,0x03,0x3d,0x86,0x1b,0x3e,0x88,0x1b, 0x3e,0x89,0x1c,0x83,0x3d,0x88,0x1c,0x11,0x3e,0x89,0x1d,0x3d,0x88,0x1b,0x3c, 0x87,0x1a,0x40,0x8c,0x1c,0x3e,0x89,0x1c,0x3e,0x8a,0x1c,0x3b,0x87,0x1b,0x3e, 0x8a,0x19,0x3e,0x8b,0x1b,0x3b,0x87,0x1b,0x3c,0x85,0x1a,0x3e,0x87,0x1a,0x3c, 0x87,0x1c,0x3c,0x84,0x1b,0x3d,0x86,0x1b,0x3b,0x84,0x1a,0x3b,0x83,0x1a,0x82, 0x3a,0x81,0x19,0x02,0x3b,0x83,0x1a,0x39,0x81,0x18,0x82,0x39,0x81,0x19,0x05, 0x3b,0x82,0x1a,0x38,0x81,0x18,0x3a,0x81,0x19,0x39,0x81,0x19,0x37,0x7f,0x16, 0x82,0x39,0x81,0x19,0x08,0x38,0x7f,0x19,0x38,0x7e,0x16,0x3a,0x7f,0x18,0x36, 0x81,0x17,0x3b,0x84,0x1b,0x36,0x7e,0x17,0x2f,0x73,0x12,0x27,0x6b,0x0d,0x82, 0x1f,0x62,0x07,0x82,0x21,0x65,0x09,0x0b,0x21,0x65,0x08,0x21,0x65,0x07,0x21, 0x63,0x08,0x1f,0x61,0x08,0x1e,0x5f,0x07,0x1f,0x61,0x06,0x1f,0x62,0x07,0x1e, 0x5f,0x07,0x1f,0x61,0x06,0x1e,0x5f,0x07,0x1f,0x60,0x08,0x83,0x1d,0x5f,0x06, 0x0a,0x1c,0x5e,0x07,0x1c,0x5f,0x05,0x1c,0x5d,0x05,0x1c,0x5d,0x06,0x1c,0x5c, 0x05,0x1b,0x5d,0x05,0x1b,0x5d,0x04,0x19,0x5b,0x02,0x1b,0x5c,0x03,0x1a,0x5c, 0x03,0x82,0x1b,0x5d,0x04,0x82,0x1a,0x5c,0x05,0x03,0x19,0x5a,0x03,0x19,0x5b, 0x04,0x19,0x5c,0x04,0x84,0x19,0x5a,0x04,0x02,0x19,0x59,0x03,0x18,0x58,0x02, 0x82,0x19,0x58,0x03,0x03,0x17,0x57,0x02,0x18,0x57,0x03,0x19,0x58,0x04,0x83, 0x18,0x57,0x03,0x06,0x19,0x56,0x03,0x18,0x55,0x02,0x17,0x55,0x04,0x18,0x56, 0x03,0x16,0x54,0x02,0x17,0x54,0x02,0x82,0x18,0x54,0x05,0x0a,0x17,0x54,0x04, 0x17,0x53,0x04,0x16,0x54,0x02,0x16,0x54,0x04,0x16,0x53,0x04,0x16,0x53,0x02, 0x17,0x54,0x05,0x16,0x51,0x02,0x16,0x52,0x01,0x17,0x54,0x04,0x82,0x16,0x51, 0x04,0x07,0x15,0x51,0x03,0x16,0x51,0x05,0x16,0x50,0x04,0x18,0x4f,0x04,0x18, 0x51,0x05,0x16,0x50,0x04,0x17,0x50,0x05,0x83,0x16,0x4f,0x04,0x05,0x16,0x50, 0x05,0x16,0x4f,0x04,0x16,0x4e,0x04,0x17,0x4f,0x05,0x16,0x4f,0x03,0x82,0x15, 0x4c,0x02,0x05,0x16,0x4e,0x03,0x16,0x4d,0x03,0x16,0x4d,0x04,0x15,0x4d,0x03, 0x14,0x4e,0x03,0x82,0x15,0x4c,0x03,0x07,0x16,0x4c,0x02,0x15,0x4b,0x05,0x14, 0x4b,0x05,0x15,0x4b,0x02,0x15,0x4c,0x04,0x16,0x4a,0x04,0x15,0x4c,0x03,0x82, 0x15,0x4a,0x04,0x82,0x14,0x49,0x03,0x07,0x16,0x48,0x03,0x15,0x49,0x04,0x15, 0x4a,0x05,0x14,0x49,0x04,0x13,0x47,0x02,0x13,0x49,0x03,0x14,0x49,0x05,0x82, 0x15,0x46,0x03,0x82,0x13,0x46,0x03,0x0c,0x13,0x46,0x02,0x14,0x46,0x02,0x15, 0x47,0x03,0x14,0x47,0x03,0x13,0x45,0x02,0x13,0x45,0x03,0x12,0x45,0x02,0x13, 0x46,0x03,0x13,0x43,0x04,0x12,0x43,0x03,0x13,0x44,0x04,0x12,0x44,0x04,0x82, 0x13,0x43,0x04,0x17,0x13,0x43,0x03,0x11,0x43,0x02,0x12,0x43,0x03,0x13,0x40, 0x02,0x11,0x41,0x03,0x12,0x42,0x03,0x13,0x40,0x02,0x12,0x41,0x03,0x11,0x40, 0x02,0x13,0x40,0x04,0x11,0x41,0x03,0x12,0x40,0x02,0x13,0x40,0x03,0x11,0x3f, 0x04,0x10,0x3f,0x03,0x12,0x3f,0x03,0x12,0x3e,0x03,0x11,0x3f,0x02,0x10,0x3f, 0x01,0x11,0x3f,0x02,0x10,0x3e,0x02,0x10,0x3e,0x03,0x12,0x3e,0x03,0x82,0x10, 0x3e,0x02,0x06,0x10,0x3d,0x02,0x10,0x3c,0x02,0x10,0x3d,0x02,0x10,0x3c,0x02, 0x10,0x3d,0x02,0x10,0x3c,0x03,0x82,0x10,0x3b,0x02,0x04,0x10,0x3c,0x01,0x0f, 0x3b,0x02,0x10,0x3b,0x03,0x10,0x3a,0x02,0x82,0x10,0x39,0x02,0x0c,0x0f,0x38, 0x02,0x10,0x38,0x02,0x0e,0x38,0x03,0x0e,0x39,0x01,0x10,0x39,0x03,0x0f,0x38, 0x02,0x0e,0x38,0x02,0x0e,0x38,0x03,0x0e,0x37,0x02,0x0e,0x38,0x02,0x0e,0x37, 0x02,0x0e,0x37,0x01,0x83,0x0e,0x36,0x02,0x87,0x0e,0x35,0x02,0x82,0x0e,0x33, 0x02,0x83,0x0e,0x34,0x02,0x83,0x0d,0x32,0x02,0x03,0x0e,0x32,0x02,0x0c,0x31, 0x02,0x0e,0x32,0x02,0x82,0x0d,0x32,0x02,0x04,0x0e,0x30,0x02,0x0d,0x30,0x01, 0x0e,0x30,0x02,0x0d,0x2f,0x01,0x83,0x0d,0x2f,0x02,0x0c,0x0b,0x2f,0x01,0x0c, 0x2f,0x01,0x0b,0x2f,0x02,0x0b,0x2e,0x01,0x0c,0x2f,0x02,0x0b,0x2e,0x02,0x0b, 0x2e,0x01,0x0b,0x2d,0x02,0x0b,0x2d,0x01,0x0b,0x2d,0x02,0x0b,0x2d,0x01,0x0b, 0x2b,0x01,0x82,0x0c,0x2d,0x02,0x04,0x0b,0x2c,0x02,0x0b,0x2b,0x01,0x0b,0x2a, 0x01,0x0b,0x2b,0x02,0x82,0x0b,0x2a,0x01,0x82,0x0b,0x2a,0x02,0x03,0x0a,0x2a, 0x00,0x09,0x2a,0x00,0x0a,0x2a,0x01,0x82,0x0a,0x2a,0x00,0x15,0x0a,0x29,0x02, 0x0a,0x29,0x01,0x0a,0x28,0x01,0x09,0x27,0x02,0x0a,0x27,0x00,0x0a,0x28,0x00, 0x0b,0x27,0x02,0x09,0x27,0x00,0x0a,0x27,0x00,0x0a,0x26,0x00,0x09,0x26,0x00, 0x09,0x26,0x01,0x0a,0x26,0x02,0x09,0x26,0x01,0x09,0x25,0x01,0x0a,0x25,0x02, 0x08,0x24,0x00,0x09,0x24,0x00,0x0a,0x25,0x01,0x09,0x24,0x01,0x08,0x23,0x00, 0x82,0x09,0x24,0x01,0x07,0x09,0x23,0x01,0x08,0x23,0x01,0x08,0x22,0x01,0x09, 0x22,0x01,0x08,0x22,0x01,0x08,0x21,0x01,0x08,0x22,0x01,0x83,0x08,0x21,0x00, 0x01,0x08,0x21,0x01,0x83,0x08,0x20,0x00,0x02,0x07,0x20,0x00,0x08,0x20,0x00, 0x82,0x08,0x1f,0x00,0x01,0x07,0x1f,0x00,0x82,0x08,0x1f,0x00,0x06,0x07,0x1f, 0x00,0x07,0x1e,0x01,0x08,0x1f,0x01,0x07,0x1e,0x01,0x07,0x1d,0x00,0x07,0x1d, 0x01,0x82,0x07,0x1c,0x00,0x83,0x06,0x1c,0x00,0x82,0x06,0x1b,0x00,0x05,0x06, 0x1a,0x00,0x05,0x1b,0x00,0x06,0x1b,0x01,0x06,0x1a,0x01,0x05,0x1a,0x00,0x89, 0x05,0x19,0x00,0x82,0x05,0x18,0x00,0x84,0x05,0x17,0x00,0x88,0x05,0x16,0x00, 0x01,0x04,0x16,0x00,0x83,0x05,0x15,0x00,0x82,0x05,0x14,0x00,0x84,0x04,0x14, 0x00,0x02,0x04,0x13,0x00,0x03,0x13,0x00,0x82,0x04,0x13,0x00,0x82,0x03,0x13, 0x00,0x01,0x04,0x12,0x00,0x83,0x03,0x12,0x00,0x84,0x03,0x11,0x00,0x83,0x03, 0x10,0x00,0x01,0x02,0x10,0x00,0x83,0x03,0x10,0x00,0x84,0x02,0x0f,0x00,0x88, 0x02,0x0e,0x00,0x84,0x02,0x0d,0x00,0x84,0x02,0x0c,0x00,0x89,0x02,0x0b,0x00, 0x85,0x02,0x0a,0x00,0x82,0x02,0x09,0x00,0x04,0x02,0x08,0x00,0x02,0x09,0x00, 0x02,0x0a,0x00,0x02,0x0b,0x00,0x82,0x03,0x0b,0x00,0x02,0x04,0x0b,0x01,0x04, 0x0b,0x02,0x82,0x05,0x0b,0x02,0x04,0x04,0x0a,0x02,0x04,0x09,0x02,0x03,0x09, 0x02,0x04,0x09,0x02,0x84,0x03,0x08,0x01,0x82,0x02,0x07,0x01,0x83,0x02,0x06, 0x01,0x82,0x02,0x05,0x01,0x83,0x02,0x05,0x00,0x01,0x02,0x04,0x00,0x83,0x01, 0x03,0x00,0x01,0x01,0x02,0x00,0x83,0x00,0x02,0x00,0x82,0x00,0x01,0x00,0xdc, 0x00,0x00,0x00,0x0d,0x48,0x98,0x17,0x48,0x98,0x16,0x47,0x98,0x14,0x47,0x98, 0x16,0x46,0x98,0x16,0x46,0x9a,0x16,0x48,0x99,0x15,0x47,0x98,0x16,0x46,0x98, 0x17,0x47,0x99,0x18,0x47,0x98,0x17,0x47,0x98,0x16,0x46,0x98,0x15,0x82,0x46, 0x97,0x15,0x02,0x46,0x98,0x14,0x46,0x97,0x15,0x82,0x46,0x96,0x16,0x07,0x46, 0x96,0x17,0x45,0x95,0x16,0x46,0x96,0x16,0x45,0x95,0x15,0x46,0x96,0x14,0x46, 0x98,0x17,0x45,0x97,0x16,0x82,0x44,0x96,0x15,0x06,0x45,0x97,0x16,0x45,0x95, 0x15,0x46,0x96,0x16,0x44,0x95,0x14,0x45,0x95,0x15,0x46,0x96,0x16,0x82,0x44, 0x96,0x15,0x05,0x46,0x96,0x16,0x45,0x95,0x15,0x46,0x96,0x16,0x44,0x96,0x15, 0x44,0x95,0x16,0x82,0x44,0x96,0x15,0x05,0x45,0x95,0x15,0x44,0x95,0x14,0x45, 0x95,0x15,0x45,0x95,0x16,0x43,0x95,0x15,0x83,0x43,0x94,0x14,0x0f,0x44,0x95, 0x15,0x45,0x95,0x17,0x44,0x94,0x18,0x43,0x92,0x15,0x44,0x95,0x15,0x44,0x94, 0x17,0x43,0x94,0x16,0x43,0x93,0x17,0x43,0x95,0x18,0x44,0x94,0x17,0x45,0x94, 0x17,0x43,0x95,0x18,0x43,0x93,0x17,0x43,0x92,0x18,0x43,0x93,0x19,0x82,0x43, 0x92,0x18,0x0a,0x44,0x94,0x1a,0x44,0x92,0x19,0x43,0x93,0x19,0x43,0x92,0x18, 0x43,0x92,0x1a,0x43,0x93,0x19,0x43,0x92,0x19,0x43,0x91,0x1a,0x44,0x92,0x1a, 0x43,0x92,0x19,0x82,0x43,0x92,0x1a,0x06,0x44,0x92,0x1d,0x43,0x91,0x1c,0x46, 0x91,0x1e,0x46,0x90,0x1d,0x45,0x90,0x1c,0x43,0x91,0x1c,0x82,0x43,0x92,0x1c, 0x11,0x46,0x8f,0x1d,0x44,0x92,0x1e,0x43,0x91,0x1d,0x45,0x90,0x1d,0x44,0x92, 0x1e,0x43,0x91,0x1d,0x46,0x8f,0x1e,0x45,0x8f,0x1e,0x45,0x92,0x20,0x46,0x91, 0x20,0x45,0x8f,0x20,0x46,0x91,0x21,0x45,0x8f,0x20,0x46,0x90,0x20,0x45,0x8f, 0x20,0x46,0x8f,0x1e,0x46,0x91,0x21,0x83,0x45,0x8f,0x20,0x82,0x43,0x90,0x20, 0x0b,0x45,0x8f,0x20,0x45,0x8f,0x21,0x45,0x8f,0x1e,0x46,0x90,0x22,0x44,0x8f, 0x20,0x45,0x8f,0x20,0x45,0x8f,0x21,0x44,0x8f,0x20,0x45,0x8f,0x20,0x44,0x8f, 0x20,0x45,0x8f,0x20,0x82,0x45,0x8f,0x21,0x0a,0x44,0x8f,0x20,0x45,0x8f,0x21, 0x44,0x8f,0x20,0x44,0x8f,0x1f,0x45,0x8f,0x20,0x43,0x8f,0x21,0x44,0x8f,0x1f, 0x46,0x8f,0x21,0x44,0x8d,0x21,0x44,0x8e,0x22,0x83,0x44,0x8f,0x20,0x01,0x45, 0x8f,0x21,0x82,0x44,0x8e,0x22,0x05,0x45,0x8f,0x21,0x44,0x8f,0x20,0x44,0x8e, 0x22,0x46,0x8f,0x23,0x44,0x8d,0x21,0x82,0x43,0x8d,0x21,0x07,0x44,0x8e,0x22, 0x43,0x8e,0x20,0x44,0x8d,0x20,0x45,0x8e,0x20,0x44,0x8e,0x22,0x42,0x8e,0x21, 0x43,0x8d,0x21,0x82,0x43,0x8c,0x20,0x04,0x45,0x8e,0x22,0x43,0x8c,0x20,0x41, 0x8b,0x1f,0x42,0x8c,0x20,0x82,0x43,0x8c,0x20,0x0c,0x43,0x8d,0x21,0x42,0x8c, 0x21,0x43,0x8c,0x22,0x43,0x8c,0x20,0x41,0x8a,0x1e,0x43,0x8c,0x20,0x42,0x8c, 0x20,0x43,0x8c,0x20,0x42,0x8b,0x1f,0x40,0x8a,0x1e,0x40,0x8a,0x20,0x41,0x8b, 0x20,0x83,0x40,0x8a,0x20,0x01,0x40,0x89,0x1f,0x82,0x40,0x89,0x20,0x02,0x40, 0x88,0x1e,0x40,0x8a,0x20,0x82,0x40,0x88,0x1e,0x02,0x41,0x89,0x20,0x3f,0x89, 0x1f,0x82,0x3e,0x88,0x1d,0x05,0x40,0x8a,0x20,0x40,0x88,0x1e,0x40,0x88,0x1f, 0x3e,0x86,0x1d,0x3f,0x87,0x1e,0x82,0x3f,0x89,0x1e,0x01,0x3f,0x89,0x1f,0x82, 0x3f,0x87,0x1e,0x82,0x3e,0x86,0x1d,0x0c,0x3f,0x87,0x1e,0x3e,0x86,0x1d,0x3d, 0x85,0x1c,0x3f,0x87,0x1e,0x40,0x88,0x1f,0x3e,0x86,0x1d,0x3f,0x87,0x1e,0x3d, 0x85,0x1c,0x3d,0x86,0x1d,0x3e,0x86,0x1d,0x3d,0x85,0x1c,0x3e,0x86,0x1d,0x85, 0x3d,0x86,0x1d,0x0c,0x3d,0x87,0x1d,0x3e,0x88,0x1d,0x3e,0x86,0x1f,0x3d,0x85, 0x1b,0x3e,0x88,0x1d,0x3e,0x88,0x1c,0x3d,0x86,0x1c,0x3d,0x87,0x1d,0x3d,0x89, 0x1c,0x3e,0x8a,0x1d,0x3d,0x89,0x1c,0x3e,0x88,0x1c,0x82,0x3e,0x8a,0x1d,0x04, 0x3d,0x89,0x1a,0x3e,0x8a,0x1c,0x3d,0x89,0x1b,0x3d,0x89,0x19,0x82,0x3e,0x8a, 0x1c,0x02,0x3d,0x89,0x19,0x40,0x8c,0x1a,0x82,0x3f,0x8c,0x1b,0x03,0x40,0x8c, 0x1c,0x3b,0x87,0x1a,0x3d,0x89,0x1b,0x82,0x3d,0x88,0x1a,0x0b,0x3e,0x89,0x1a, 0x3a,0x84,0x1a,0x3c,0x86,0x1a,0x3c,0x84,0x1a,0x3a,0x83,0x19,0x3c,0x85,0x19, 0x3d,0x85,0x1b,0x39,0x81,0x18,0x3a,0x82,0x19,0x3a,0x83,0x1a,0x3c,0x84,0x1a, 0x82,0x3a,0x82,0x19,0x82,0x39,0x81,0x18,0x03,0x3a,0x83,0x1a,0x38,0x82,0x18, 0x3a,0x82,0x19,0x82,0x37,0x80,0x17,0x0b,0x3c,0x86,0x1b,0x3c,0x86,0x1c,0x40, 0x89,0x1f,0x3a,0x83,0x17,0x31,0x79,0x14,0x24,0x6b,0x0d,0x20,0x64,0x08,0x1f, 0x63,0x06,0x20,0x65,0x08,0x20,0x63,0x08,0x20,0x63,0x07,0x82,0x20,0x62,0x08, 0x03,0x20,0x63,0x07,0x1e,0x62,0x08,0x20,0x63,0x07,0x82,0x1e,0x60,0x07,0x0a, 0x1f,0x61,0x08,0x1d,0x60,0x06,0x1e,0x60,0x07,0x1d,0x60,0x06,0x1e,0x61,0x05, 0x1d,0x5f,0x05,0x1e,0x5f,0x08,0x1d,0x5d,0x06,0x1c,0x5e,0x06,0x1c,0x5e,0x05, 0x82,0x1a,0x5d,0x05,0x02,0x1b,0x5d,0x05,0x1b,0x5c,0x05,0x83,0x1b,0x5d,0x05, 0x82,0x1a,0x5c,0x04,0x82,0x19,0x5b,0x03,0x04,0x17,0x59,0x03,0x19,0x5a,0x05, 0x19,0x5a,0x03,0x1a,0x5a,0x04,0x82,0x19,0x5a,0x03,0x82,0x18,0x58,0x04,0x08, 0x18,0x59,0x05,0x18,0x58,0x05,0x17,0x56,0x03,0x19,0x59,0x04,0x18,0x58,0x03, 0x1a,0x57,0x04,0x19,0x58,0x04,0x17,0x57,0x02,0x82,0x18,0x55,0x04,0x0e,0x17, 0x54,0x03,0x17,0x56,0x05,0x17,0x54,0x03,0x17,0x54,0x04,0x18,0x55,0x05,0x17, 0x54,0x04,0x18,0x52,0x03,0x17,0x54,0x04,0x17,0x53,0x04,0x17,0x52,0x03,0x18, 0x54,0x05,0x17,0x53,0x04,0x17,0x53,0x05,0x18,0x51,0x04,0x82,0x16,0x51,0x03, 0x82,0x17,0x51,0x04,0x08,0x16,0x50,0x03,0x15,0x4f,0x02,0x17,0x51,0x04,0x17, 0x51,0x03,0x16,0x51,0x04,0x15,0x4f,0x05,0x17,0x50,0x05,0x16,0x51,0x03,0x82, 0x16,0x4f,0x04,0x0a,0x16,0x4e,0x02,0x17,0x4f,0x04,0x16,0x4e,0x02,0x17,0x4d, 0x03,0x15,0x4d,0x03,0x17,0x4d,0x04,0x15,0x4e,0x04,0x17,0x4c,0x04,0x14,0x4d, 0x03,0x15,0x4e,0x04,0x82,0x15,0x4c,0x03,0x07,0x15,0x4d,0x04,0x16,0x4c,0x04, 0x16,0x4c,0x03,0x16,0x4c,0x02,0x15,0x4b,0x03,0x15,0x4d,0x05,0x14,0x4a,0x02, 0x82,0x15,0x4b,0x04,0x05,0x14,0x49,0x02,0x14,0x4a,0x03,0x15,0x4a,0x04,0x14, 0x49,0x03,0x16,0x4a,0x03,0x82,0x14,0x4a,0x04,0x84,0x14,0x49,0x04,0x82,0x14, 0x48,0x04,0x01,0x13,0x46,0x02,0x82,0x14,0x47,0x02,0x06,0x13,0x46,0x05,0x14, 0x47,0x02,0x14,0x46,0x04,0x14,0x46,0x02,0x13,0x46,0x03,0x12,0x44,0x02,0x82, 0x13,0x45,0x03,0x01,0x12,0x44,0x02,0x83,0x13,0x44,0x03,0x16,0x13,0x43,0x03, 0x12,0x44,0x03,0x13,0x44,0x03,0x12,0x43,0x02,0x12,0x43,0x03,0x12,0x43,0x04, 0x12,0x43,0x03,0x11,0x42,0x02,0x11,0x43,0x02,0x13,0x42,0x03,0x11,0x41,0x02, 0x11,0x40,0x02,0x12,0x41,0x03,0x12,0x40,0x03,0x12,0x40,0x02,0x13,0x40,0x03, 0x11,0x40,0x02,0x12,0x40,0x03,0x11,0x3f,0x02,0x12,0x3d,0x02,0x11,0x3e,0x02, 0x12,0x3e,0x02,0x82,0x12,0x3d,0x03,0x84,0x10,0x3d,0x02,0x01,0x0f,0x3c,0x02, 0x83,0x10,0x3c,0x02,0x06,0x10,0x3b,0x01,0x10,0x3c,0x02,0x10,0x3b,0x02,0x0f, 0x3a,0x02,0x10,0x3a,0x02,0x0f,0x39,0x02,0x82,0x10,0x39,0x02,0x02,0x0f,0x38, 0x02,0x0e,0x3a,0x03,0x82,0x0e,0x38,0x02,0x06,0x0e,0x39,0x03,0x0d,0x37,0x01, 0x10,0x37,0x02,0x0e,0x38,0x02,0x0e,0x37,0x02,0x0d,0x36,0x02,0x85,0x0e,0x37, 0x02,0x82,0x0e,0x36,0x02,0x82,0x0e,0x35,0x02,0x03,0x0e,0x34,0x02,0x0d,0x34, 0x02,0x0f,0x35,0x02,0x84,0x0e,0x34,0x02,0x0a,0x0d,0x33,0x02,0x0d,0x33,0x01, 0x0e,0x33,0x02,0x0e,0x34,0x02,0x0e,0x33,0x02,0x0d,0x32,0x02,0x0c,0x31,0x02, 0x0d,0x32,0x02,0x0d,0x31,0x02,0x0c,0x31,0x02,0x82,0x0c,0x31,0x01,0x0f,0x0d, 0x31,0x02,0x0d,0x30,0x02,0x0d,0x2f,0x01,0x0c,0x30,0x02,0x0d,0x2f,0x01,0x0c, 0x2f,0x02,0x0c,0x2e,0x02,0x0d,0x2e,0x02,0x0b,0x2e,0x01,0x0c,0x2f,0x02,0x0c, 0x2e,0x02,0x0b,0x2e,0x02,0x0b,0x2e,0x01,0x0b,0x2e,0x02,0x0b,0x2d,0x01,0x82, 0x0b,0x2c,0x01,0x09,0x0d,0x2d,0x02,0x0b,0x2c,0x02,0x0b,0x2b,0x01,0x0c,0x2b, 0x01,0x0b,0x2b,0x01,0x0b,0x2b,0x02,0x0b,0x2b,0x01,0x0a,0x2a,0x01,0x0b,0x2a, 0x02,0x82,0x0b,0x2a,0x01,0x03,0x0a,0x2a,0x00,0x0a,0x29,0x00,0x09,0x28,0x00, 0x84,0x0a,0x28,0x01,0x01,0x09,0x28,0x00,0x83,0x0a,0x27,0x00,0x0e,0x09,0x26, 0x00,0x09,0x27,0x01,0x0a,0x26,0x02,0x09,0x26,0x01,0x08,0x26,0x00,0x0a,0x26, 0x01,0x09,0x25,0x01,0x09,0x25,0x00,0x09,0x25,0x01,0x08,0x24,0x02,0x08,0x25, 0x01,0x08,0x23,0x01,0x08,0x24,0x00,0x08,0x24,0x01,0x82,0x08,0x23,0x01,0x01, 0x09,0x23,0x01,0x82,0x08,0x23,0x01,0x83,0x08,0x22,0x01,0x01,0x08,0x21,0x01, 0x82,0x08,0x21,0x00,0x86,0x08,0x20,0x00,0x05,0x08,0x1f,0x01,0x07,0x1f,0x00, 0x07,0x1e,0x00,0x07,0x1f,0x00,0x08,0x1f,0x00,0x82,0x07,0x1e,0x00,0x01,0x08, 0x1e,0x00,0x82,0x07,0x1d,0x01,0x02,0x07,0x1d,0x00,0x06,0x1d,0x00,0x83,0x06, 0x1c,0x00,0x01,0x05,0x1b,0x00,0x83,0x06,0x1b,0x00,0x87,0x05,0x1a,0x00,0x02, 0x05,0x19,0x00,0x05,0x18,0x00,0x82,0x05,0x19,0x00,0x82,0x05,0x18,0x00,0x88, 0x05,0x17,0x00,0x03,0x05,0x16,0x00,0x05,0x17,0x00,0x05,0x16,0x00,0x85,0x05, 0x15,0x00,0x83,0x05,0x14,0x00,0x84,0x04,0x14,0x00,0x84,0x04,0x13,0x00,0x03, 0x03,0x13,0x00,0x04,0x13,0x00,0x03,0x12,0x00,0x82,0x04,0x12,0x00,0x87,0x03, 0x11,0x00,0x02,0x03,0x10,0x00,0x03,0x11,0x00,0x82,0x03,0x10,0x00,0x01,0x02, 0x10,0x00,0x83,0x02,0x0f,0x00,0x88,0x02,0x0e,0x00,0x84,0x02,0x0d,0x00,0x83, 0x02,0x0c,0x00,0x8b,0x02,0x0b,0x00,0x83,0x02,0x0a,0x00,0x83,0x02,0x09,0x00, 0x85,0x02,0x08,0x00,0x01,0x02,0x09,0x00,0x82,0x02,0x0a,0x00,0x03,0x03,0x0b, 0x01,0x04,0x0b,0x02,0x04,0x0a,0x02,0x82,0x04,0x09,0x02,0x01,0x03,0x08,0x01, 0x82,0x03,0x08,0x02,0x82,0x03,0x08,0x01,0x02,0x03,0x07,0x01,0x02,0x07,0x01, 0x83,0x02,0x06,0x01,0x02,0x02,0x05,0x00,0x02,0x05,0x01,0x82,0x02,0x05,0x00, 0x02,0x02,0x04,0x00,0x01,0x04,0x00,0x83,0x01,0x03,0x00,0x01,0x01,0x02,0x00, 0x83,0x00,0x02,0x00,0x82,0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x01,0x48,0x9a, 0x17,0x82,0x48,0x9a,0x15,0x07,0x48,0x9a,0x17,0x48,0x99,0x16,0x46,0x99,0x15, 0x47,0x98,0x15,0x46,0x97,0x15,0x46,0x99,0x15,0x48,0x99,0x16,0x82,0x46,0x99, 0x15,0x82,0x47,0x98,0x15,0x09,0x45,0x98,0x15,0x47,0x98,0x15,0x45,0x98,0x16, 0x45,0x98,0x15,0x45,0x97,0x16,0x47,0x98,0x17,0x46,0x97,0x16,0x46,0x97,0x17, 0x47,0x98,0x15,0x83,0x45,0x98,0x16,0x82,0x45,0x97,0x15,0x03,0x46,0x97,0x16, 0x45,0x97,0x15,0x46,0x97,0x16,0x82,0x45,0x97,0x15,0x03,0x45,0x96,0x15,0x45, 0x97,0x15,0x45,0x98,0x16,0x82,0x45,0x97,0x15,0x02,0x46,0x97,0x16,0x45,0x97, 0x15,0x82,0x44,0x96,0x15,0x82,0x44,0x97,0x15,0x02,0x45,0x96,0x15,0x43,0x96, 0x14,0x82,0x44,0x96,0x15,0x03,0x45,0x96,0x15,0x44,0x96,0x15,0x43,0x95,0x15, 0x82,0x44,0x95,0x15,0x0e,0x44,0x94,0x16,0x43,0x94,0x15,0x43,0x95,0x15,0x44, 0x94,0x16,0x44,0x94,0x18,0x43,0x94,0x15,0x44,0x94,0x16,0x43,0x94,0x17,0x42, 0x93,0x16,0x44,0x94,0x16,0x43,0x94,0x18,0x45,0x94,0x19,0x44,0x94,0x19,0x44, 0x93,0x18,0x82,0x43,0x94,0x18,0x0c,0x44,0x93,0x18,0x43,0x94,0x18,0x42,0x93, 0x18,0x42,0x91,0x19,0x44,0x93,0x18,0x44,0x93,0x19,0x44,0x92,0x1b,0x45,0x94, 0x1a,0x44,0x93,0x19,0x44,0x92,0x1b,0x45,0x94,0x1b,0x44,0x92,0x1b,0x82,0x45, 0x93,0x1d,0x01,0x45,0x91,0x1c,0x82,0x44,0x92,0x1c,0x06,0x43,0x91,0x1b,0x45, 0x94,0x1e,0x45,0x91,0x1e,0x44,0x93,0x1e,0x45,0x94,0x1f,0x44,0x92,0x1e,0x82, 0x44,0x93,0x1e,0x0b,0x44,0x91,0x1e,0x43,0x91,0x1e,0x45,0x92,0x1f,0x44,0x91, 0x1e,0x43,0x91,0x1e,0x45,0x92,0x1f,0x44,0x91,0x20,0x44,0x91,0x1e,0x45,0x91, 0x1e,0x46,0x91,0x1f,0x44,0x91,0x20,0x83,0x45,0x91,0x20,0x09,0x43,0x91,0x1f, 0x44,0x91,0x20,0x43,0x91,0x1f,0x45,0x90,0x21,0x45,0x91,0x20,0x46,0x91,0x21, 0x45,0x90,0x21,0x43,0x8e,0x1f,0x45,0x90,0x1f,0x83,0x45,0x90,0x21,0x0b,0x45, 0x90,0x1f,0x43,0x90,0x21,0x44,0x8f,0x20,0x43,0x8e,0x1f,0x45,0x90,0x21,0x44, 0x91,0x21,0x45,0x91,0x21,0x45,0x90,0x21,0x42,0x90,0x1e,0x45,0x90,0x21,0x45, 0x91,0x21,0x82,0x44,0x8f,0x20,0x02,0x44,0x8e,0x21,0x44,0x8f,0x20,0x82,0x45, 0x90,0x21,0x82,0x44,0x8e,0x21,0x82,0x45,0x91,0x21,0x04,0x43,0x8e,0x21,0x44, 0x8e,0x21,0x45,0x8e,0x20,0x43,0x8e,0x21,0x82,0x44,0x8f,0x20,0x06,0x43,0x8e, 0x1f,0x44,0x8f,0x20,0x45,0x8e,0x21,0x45,0x8f,0x22,0x42,0x8e,0x21,0x42,0x8d, 0x20,0x84,0x44,0x8e,0x21,0x01,0x43,0x8e,0x21,0x82,0x42,0x8d,0x20,0x01,0x43, 0x8d,0x20,0x82,0x43,0x8e,0x21,0x02,0x42,0x8d,0x21,0x43,0x8d,0x20,0x82,0x44, 0x8e,0x21,0x0a,0x43,0x8e,0x21,0x41,0x8b,0x1e,0x42,0x8d,0x20,0x42,0x8d,0x21, 0x41,0x8b,0x20,0x42,0x8c,0x21,0x41,0x8b,0x20,0x42,0x8c,0x21,0x41,0x8b,0x20, 0x3f,0x8a,0x1e,0x82,0x40,0x8b,0x1f,0x03,0x3f,0x8a,0x1e,0x40,0x8b,0x1f,0x3f, 0x8a,0x1e,0x82,0x3f,0x88,0x1e,0x04,0x40,0x8b,0x1f,0x3f,0x8a,0x1e,0x3f,0x89, 0x1e,0x3f,0x8a,0x1e,0x84,0x3f,0x88,0x1e,0x82,0x3e,0x88,0x1e,0x87,0x3f,0x88, 0x1e,0x04,0x3e,0x87,0x1d,0x3f,0x88,0x1e,0x3c,0x85,0x1b,0x3e,0x87,0x1d,0x82, 0x3f,0x88,0x1e,0x82,0x3e,0x87,0x1d,0x01,0x3d,0x86,0x1c,0x82,0x3e,0x87,0x1d, 0x02,0x3d,0x86,0x1c,0x3f,0x88,0x1e,0x82,0x3e,0x87,0x1d,0x04,0x3d,0x86,0x1c, 0x3f,0x88,0x1e,0x3e,0x87,0x1c,0x3d,0x86,0x1b,0x82,0x3d,0x88,0x1c,0x02,0x3f, 0x89,0x1e,0x3f,0x8a,0x1d,0x82,0x3c,0x89,0x1b,0x82,0x3e,0x88,0x1b,0x0f,0x3f, 0x8a,0x1d,0x3e,0x8b,0x1d,0x3c,0x88,0x19,0x3e,0x8b,0x1b,0x3f,0x8b,0x1c,0x3e, 0x8b,0x1d,0x3f,0x8b,0x1c,0x3f,0x8d,0x1a,0x3f,0x8d,0x1b,0x40,0x8d,0x1e,0x3f, 0x8b,0x1e,0x3d,0x8a,0x1e,0x3d,0x8a,0x1b,0x3c,0x88,0x1b,0x3c,0x88,0x19,0x82, 0x3f,0x89,0x1c,0x02,0x3e,0x88,0x1b,0x3d,0x88,0x1d,0x82,0x3c,0x86,0x1b,0x04, 0x3d,0x88,0x1c,0x3b,0x85,0x1a,0x3c,0x87,0x1b,0x3a,0x85,0x19,0x82,0x3c,0x86, 0x1b,0x01,0x3c,0x85,0x1b,0x82,0x39,0x82,0x18,0x27,0x3a,0x83,0x19,0x3b,0x84, 0x1a,0x3a,0x83,0x19,0x3b,0x84,0x19,0x3c,0x85,0x1a,0x3a,0x83,0x18,0x39,0x82, 0x19,0x3c,0x86,0x1e,0x39,0x82,0x1a,0x3b,0x84,0x1a,0x3e,0x88,0x1b,0x3c,0x85, 0x1a,0x3a,0x83,0x1b,0x34,0x7b,0x13,0x27,0x6f,0x0f,0x21,0x66,0x08,0x20,0x65, 0x07,0x21,0x65,0x08,0x21,0x65,0x09,0x20,0x63,0x07,0x1f,0x63,0x06,0x1f,0x62, 0x08,0x1e,0x61,0x07,0x1f,0x63,0x06,0x20,0x64,0x05,0x20,0x63,0x07,0x1e,0x61, 0x07,0x1f,0x62,0x08,0x1e,0x61,0x07,0x1f,0x62,0x08,0x1e,0x60,0x06,0x1d,0x5f, 0x05,0x1d,0x60,0x06,0x1e,0x60,0x06,0x1d,0x60,0x06,0x1c,0x5f,0x05,0x1b,0x5e, 0x06,0x1c,0x5f,0x06,0x1c,0x5d,0x06,0x82,0x1b,0x5d,0x05,0x02,0x1b,0x5e,0x06, 0x1a,0x5d,0x04,0x83,0x1b,0x5d,0x05,0x82,0x19,0x5b,0x05,0x02,0x19,0x5b,0x03, 0x19,0x5a,0x03,0x82,0x18,0x5a,0x03,0x03,0x18,0x59,0x04,0x18,0x57,0x03,0x18, 0x59,0x04,0x82,0x18,0x58,0x04,0x01,0x18,0x57,0x04,0x82,0x18,0x58,0x03,0x03, 0x18,0x56,0x03,0x18,0x58,0x05,0x18,0x56,0x04,0x82,0x18,0x55,0x03,0x04,0x18, 0x57,0x05,0x17,0x56,0x04,0x17,0x54,0x03,0x18,0x55,0x04,0x82,0x18,0x54,0x04, 0x04,0x17,0x55,0x04,0x17,0x54,0x04,0x17,0x53,0x03,0x18,0x55,0x05,0x82,0x17, 0x54,0x04,0x02,0x18,0x52,0x02,0x16,0x53,0x04,0x84,0x16,0x51,0x03,0x07,0x15, 0x50,0x03,0x16,0x51,0x03,0x16,0x50,0x03,0x17,0x52,0x05,0x15,0x4f,0x04,0x16, 0x50,0x04,0x16,0x51,0x03,0x82,0x15,0x4f,0x03,0x0b,0x17,0x50,0x03,0x16,0x51, 0x04,0x15,0x51,0x03,0x15,0x4f,0x04,0x15,0x4e,0x03,0x15,0x4f,0x04,0x15,0x4e, 0x04,0x16,0x4e,0x04,0x15,0x4e,0x03,0x16,0x4f,0x05,0x16,0x4e,0x04,0x82,0x15, 0x4d,0x03,0x82,0x16,0x4d,0x03,0x06,0x15,0x4c,0x03,0x15,0x4b,0x03,0x16,0x4d, 0x05,0x16,0x4c,0x05,0x15,0x4b,0x03,0x15,0x4b,0x04,0x82,0x15,0x4b,0x03,0x03, 0x15,0x4b,0x06,0x15,0x4b,0x03,0x15,0x4a,0x03,0x82,0x15,0x4b,0x04,0x01,0x15, 0x4b,0x05,0x82,0x15,0x49,0x03,0x83,0x14,0x48,0x03,0x08,0x13,0x48,0x02,0x14, 0x48,0x04,0x15,0x48,0x03,0x13,0x47,0x05,0x14,0x47,0x02,0x14,0x46,0x03,0x15, 0x46,0x02,0x14,0x46,0x03,0x83,0x13,0x45,0x03,0x01,0x12,0x45,0x03,0x83,0x13, 0x45,0x03,0x05,0x14,0x45,0x04,0x13,0x44,0x03,0x12,0x43,0x03,0x14,0x43,0x03, 0x14,0x42,0x03,0x86,0x12,0x42,0x03,0x09,0x12,0x41,0x03,0x12,0x42,0x03,0x12, 0x41,0x03,0x12,0x40,0x03,0x11,0x3f,0x02,0x10,0x3f,0x01,0x13,0x3f,0x03,0x12, 0x3f,0x03,0x11,0x3f,0x02,0x82,0x12,0x3e,0x02,0x06,0x11,0x3e,0x02,0x10,0x3d, 0x03,0x12,0x3d,0x03,0x11,0x3e,0x03,0x12,0x3e,0x04,0x11,0x3d,0x03,0x82,0x0f, 0x3c,0x03,0x05,0x11,0x3b,0x03,0x11,0x3c,0x03,0x11,0x3c,0x02,0x0f,0x3d,0x03, 0x10,0x3c,0x03,0x82,0x0f,0x3b,0x03,0x14,0x0f,0x3a,0x02,0x11,0x3a,0x03,0x11, 0x39,0x03,0x0f,0x39,0x02,0x10,0x39,0x03,0x0f,0x39,0x02,0x0f,0x39,0x03,0x0f, 0x38,0x02,0x0f,0x37,0x02,0x0e,0x38,0x02,0x0f,0x39,0x03,0x0f,0x38,0x03,0x0e, 0x37,0x03,0x0f,0x37,0x02,0x0f,0x38,0x03,0x0e,0x37,0x03,0x0f,0x37,0x03,0x0f, 0x36,0x03,0x0f,0x37,0x03,0x0d,0x36,0x02,0x82,0x0d,0x35,0x02,0x01,0x0e,0x35, 0x02,0x82,0x0e,0x36,0x03,0x82,0x0e,0x35,0x03,0x02,0x0d,0x33,0x01,0x0f,0x35, 0x03,0x82,0x0e,0x34,0x03,0x13,0x0e,0x33,0x03,0x0d,0x33,0x02,0x0e,0x33,0x03, 0x0c,0x32,0x02,0x0d,0x32,0x03,0x0d,0x32,0x02,0x0d,0x33,0x02,0x0d,0x32,0x02, 0x0d,0x31,0x02,0x0d,0x32,0x02,0x0d,0x32,0x03,0x0c,0x30,0x01,0x0d,0x30,0x02, 0x0c,0x30,0x02,0x0c,0x30,0x01,0x0c,0x2f,0x01,0x0c,0x2f,0x02,0x0d,0x2f,0x02, 0x0c,0x2f,0x01,0x82,0x0c,0x2f,0x02,0x03,0x0b,0x2e,0x01,0x0c,0x2e,0x01,0x0c, 0x2e,0x02,0x83,0x0c,0x2d,0x01,0x82,0x0b,0x2d,0x01,0x01,0x0b,0x2c,0x01,0x82, 0x0c,0x2c,0x02,0x05,0x0b,0x2c,0x02,0x0b,0x2c,0x01,0x0b,0x2b,0x01,0x0a,0x2a, 0x01,0x0b,0x2b,0x01,0x82,0x0b,0x2a,0x00,0x0a,0x0b,0x2a,0x01,0x0c,0x2a,0x02, 0x0b,0x29,0x01,0x0a,0x28,0x00,0x0b,0x29,0x01,0x0b,0x28,0x01,0x09,0x28,0x00, 0x0a,0x28,0x01,0x0b,0x28,0x01,0x0a,0x27,0x01,0x82,0x09,0x27,0x00,0x04,0x09, 0x27,0x01,0x0a,0x26,0x01,0x09,0x27,0x01,0x0a,0x26,0x01,0x82,0x09,0x25,0x01, 0x05,0x0a,0x25,0x02,0x09,0x24,0x02,0x09,0x24,0x01,0x09,0x24,0x02,0x09,0x24, 0x00,0x83,0x09,0x24,0x01,0x82,0x09,0x23,0x01,0x04,0x08,0x23,0x01,0x09,0x21, 0x00,0x09,0x22,0x01,0x08,0x21,0x00,0x83,0x09,0x21,0x01,0x82,0x08,0x21,0x00, 0x02,0x08,0x20,0x00,0x08,0x20,0x01,0x82,0x08,0x20,0x00,0x05,0x07,0x1f,0x00, 0x08,0x1f,0x00,0x07,0x1f,0x00,0x07,0x1f,0x01,0x07,0x1e,0x00,0x82,0x08,0x1e, 0x00,0x82,0x07,0x1e,0x00,0x08,0x07,0x1d,0x00,0x06,0x1d,0x00,0x07,0x1d,0x00, 0x06,0x1c,0x00,0x07,0x1d,0x00,0x06,0x1c,0x00,0x06,0x1b,0x00,0x06,0x1c,0x00, 0x84,0x06,0x1b,0x00,0x84,0x06,0x1a,0x00,0x01,0x06,0x19,0x00,0x82,0x05,0x19, 0x00,0x01,0x06,0x19,0x00,0x83,0x05,0x18,0x00,0x83,0x06,0x18,0x00,0x01,0x05, 0x18,0x00,0x86,0x05,0x17,0x00,0x03,0x05,0x16,0x00,0x05,0x15,0x00,0x05,0x16, 0x00,0x84,0x05,0x15,0x00,0x84,0x04,0x15,0x00,0x04,0x04,0x14,0x00,0x04,0x13, 0x00,0x04,0x14,0x00,0x04,0x13,0x00,0x83,0x03,0x13,0x00,0x03,0x04,0x13,0x00, 0x03,0x12,0x00,0x04,0x12,0x00,0x85,0x03,0x12,0x00,0x83,0x03,0x11,0x00,0x85, 0x03,0x10,0x00,0x87,0x03,0x0f,0x00,0x83,0x03,0x0e,0x00,0x84,0x03,0x0d,0x00, 0x82,0x03,0x0c,0x00,0x86,0x02,0x0c,0x00,0x01,0x03,0x0c,0x00,0x82,0x02,0x0c, 0x00,0x83,0x02,0x0b,0x00,0x84,0x02,0x0a,0x00,0x86,0x02,0x09,0x00,0x83,0x01, 0x08,0x00,0x01,0x02,0x08,0x00,0x82,0x02,0x09,0x00,0x04,0x03,0x0a,0x00,0x03, 0x09,0x00,0x03,0x0a,0x01,0x04,0x09,0x02,0x82,0x03,0x09,0x02,0x01,0x03,0x09, 0x01,0x82,0x03,0x08,0x01,0x82,0x03,0x07,0x01,0x84,0x03,0x06,0x01,0x01,0x02, 0x06,0x00,0x82,0x02,0x05,0x00,0x82,0x02,0x04,0x00,0x85,0x01,0x03,0x00,0x82, 0x00,0x02,0x00,0x82,0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x0a,0x48,0x9c,0x17, 0x49,0x9c,0x15,0x48,0x9c,0x15,0x48,0x99,0x15,0x47,0x99,0x15,0x48,0x9b,0x16, 0x47,0x99,0x15,0x47,0x99,0x16,0x48,0x9b,0x16,0x47,0x9a,0x15,0x86,0x46,0x99, 0x15,0x09,0x47,0x9a,0x15,0x46,0x99,0x16,0x45,0x99,0x15,0x46,0x99,0x16,0x45, 0x99,0x15,0x46,0x99,0x16,0x47,0x9a,0x17,0x46,0x99,0x15,0x46,0x99,0x16,0x82, 0x45,0x99,0x15,0x83,0x46,0x98,0x15,0x03,0x47,0x99,0x16,0x46,0x98,0x15,0x45, 0x99,0x15,0x82,0x45,0x97,0x15,0x08,0x45,0x98,0x15,0x45,0x97,0x15,0x45,0x96, 0x14,0x45,0x97,0x15,0x45,0x98,0x15,0x45,0x97,0x15,0x46,0x98,0x16,0x45,0x98, 0x15,0x82,0x44,0x97,0x14,0x03,0x45,0x98,0x15,0x44,0x97,0x14,0x44,0x96,0x15, 0x82,0x43,0x96,0x14,0x02,0x44,0x96,0x15,0x44,0x96,0x14,0x82,0x45,0x96,0x15, 0x06,0x43,0x96,0x14,0x43,0x96,0x15,0x44,0x95,0x15,0x45,0x96,0x18,0x45,0x96, 0x16,0x44,0x95,0x15,0x82,0x43,0x94,0x16,0x05,0x45,0x96,0x18,0x44,0x95,0x19, 0x42,0x93,0x17,0x43,0x94,0x18,0x45,0x94,0x19,0x83,0x44,0x93,0x18,0x82,0x44, 0x95,0x19,0x02,0x45,0x94,0x19,0x45,0x95,0x19,0x83,0x45,0x94,0x19,0x13,0x45, 0x93,0x1b,0x44,0x93,0x1a,0x45,0x94,0x19,0x45,0x93,0x1b,0x43,0x92,0x19,0x45, 0x93,0x1c,0x45,0x94,0x1d,0x44,0x93,0x1c,0x44,0x94,0x1c,0x45,0x93,0x1c,0x46, 0x93,0x1e,0x46,0x93,0x1c,0x44,0x93,0x1c,0x45,0x93,0x1c,0x45,0x92,0x1d,0x45, 0x93,0x1e,0x44,0x93,0x1e,0x44,0x92,0x1e,0x44,0x92,0x1f,0x82,0x44,0x92,0x1e, 0x83,0x45,0x93,0x1f,0x01,0x44,0x92,0x1e,0x82,0x45,0x93,0x1f,0x82,0x44,0x92, 0x1f,0x01,0x45,0x91,0x1f,0x82,0x46,0x92,0x20,0x82,0x44,0x92,0x1f,0x03,0x45, 0x92,0x22,0x44,0x91,0x21,0x44,0x92,0x1f,0x82,0x45,0x91,0x21,0x09,0x47,0x93, 0x21,0x46,0x92,0x20,0x43,0x90,0x20,0x44,0x92,0x1f,0x45,0x90,0x20,0x43,0x90, 0x20,0x44,0x90,0x1f,0x45,0x90,0x20,0x45,0x91,0x21,0x82,0x44,0x91,0x21,0x02, 0x45,0x91,0x21,0x44,0x91,0x21,0x82,0x45,0x91,0x21,0x0e,0x44,0x90,0x1f,0x42, 0x90,0x1f,0x43,0x90,0x22,0x45,0x90,0x22,0x44,0x90,0x1f,0x46,0x92,0x22,0x45, 0x90,0x22,0x43,0x8e,0x20,0x44,0x90,0x1f,0x45,0x91,0x21,0x44,0x8f,0x21,0x43, 0x8e,0x20,0x45,0x90,0x20,0x44,0x91,0x21,0x82,0x44,0x90,0x1f,0x06,0x45,0x90, 0x20,0x44,0x8f,0x21,0x44,0x8e,0x20,0x43,0x8e,0x20,0x45,0x90,0x22,0x43,0x90, 0x22,0x82,0x44,0x8f,0x21,0x02,0x43,0x90,0x22,0x42,0x90,0x21,0x82,0x43,0x8e, 0x20,0x01,0x42,0x90,0x21,0x83,0x43,0x8e,0x20,0x82,0x42,0x8d,0x1f,0x07,0x44, 0x8e,0x20,0x41,0x8d,0x1f,0x42,0x8d,0x21,0x43,0x8e,0x20,0x42,0x8d,0x21,0x41, 0x8d,0x20,0x41,0x8c,0x1f,0x82,0x42,0x8d,0x21,0x03,0x41,0x8d,0x20,0x41,0x8c, 0x1e,0x41,0x8d,0x1f,0x82,0x41,0x8d,0x20,0x05,0x40,0x8b,0x1f,0x41,0x8c,0x1f, 0x40,0x8b,0x1f,0x41,0x8c,0x20,0x41,0x8b,0x20,0x83,0x3f,0x8a,0x1e,0x07,0x40, 0x8b,0x1f,0x40,0x8a,0x1e,0x3e,0x87,0x1c,0x3f,0x89,0x1e,0x40,0x8a,0x1f,0x3e, 0x8a,0x1e,0x3e,0x89,0x1d,0x82,0x3f,0x89,0x1e,0x82,0x3e,0x88,0x1d,0x82,0x3f, 0x89,0x1e,0x02,0x41,0x8a,0x1f,0x3f,0x89,0x1e,0x82,0x3e,0x88,0x1d,0x01,0x40, 0x8a,0x1f,0x82,0x3e,0x87,0x1c,0x82,0x3e,0x88,0x1d,0x82,0x3e,0x87,0x1c,0x02, 0x3e,0x88,0x1d,0x3e,0x87,0x1c,0x84,0x3e,0x88,0x1d,0x83,0x3e,0x87,0x1c,0x03, 0x3d,0x88,0x1c,0x3c,0x87,0x1c,0x3e,0x89,0x1b,0x82,0x3e,0x8a,0x1d,0x82,0x3e, 0x89,0x1b,0x0f,0x3e,0x8a,0x1c,0x40,0x8b,0x1d,0x3e,0x8a,0x1c,0x3e,0x8b,0x1c, 0x3e,0x8c,0x1d,0x3e,0x8c,0x1c,0x3f,0x8d,0x1c,0x3e,0x8b,0x1b,0x3f,0x8d,0x1b, 0x41,0x90,0x1b,0x40,0x8e,0x1a,0x41,0x90,0x1d,0x41,0x8f,0x1b,0x3e,0x8b,0x1b, 0x3e,0x8b,0x1e,0x82,0x3e,0x8b,0x1c,0x11,0x3f,0x8a,0x1c,0x3e,0x8a,0x1c,0x3d, 0x88,0x1c,0x3e,0x8a,0x1d,0x3e,0x89,0x1b,0x3d,0x88,0x1c,0x3e,0x8a,0x1e,0x3b, 0x87,0x1b,0x3b,0x87,0x1a,0x3e,0x89,0x1c,0x3b,0x86,0x19,0x3b,0x87,0x1b,0x3b, 0x84,0x19,0x3b,0x85,0x1a,0x39,0x83,0x18,0x3b,0x85,0x1a,0x3d,0x87,0x1c,0x83, 0x3d,0x87,0x1b,0x01,0x3b,0x84,0x19,0x82,0x3b,0x87,0x1a,0x0e,0x3b,0x84,0x19, 0x3b,0x86,0x18,0x3b,0x85,0x19,0x3b,0x84,0x1b,0x3b,0x83,0x1c,0x39,0x82,0x1b, 0x32,0x7a,0x15,0x2a,0x70,0x0f,0x22,0x68,0x0a,0x1f,0x63,0x08,0x1f,0x64,0x06, 0x22,0x67,0x09,0x21,0x65,0x07,0x21,0x65,0x08,0x82,0x20,0x64,0x0a,0x01,0x1f, 0x64,0x06,0x82,0x20,0x64,0x06,0x84,0x1f,0x64,0x06,0x02,0x1f,0x62,0x07,0x1e, 0x61,0x06,0x82,0x1c,0x60,0x05,0x06,0x1d,0x61,0x06,0x1c,0x5f,0x06,0x1c,0x5e, 0x06,0x1b,0x5d,0x04,0x1b,0x5e,0x05,0x1c,0x5f,0x06,0x82,0x1a,0x5e,0x04,0x05, 0x1b,0x5e,0x05,0x1a,0x5e,0x04,0x1a,0x5e,0x05,0x1b,0x5e,0x05,0x1a,0x5d,0x04, 0x83,0x19,0x5b,0x03,0x05,0x1a,0x5a,0x05,0x19,0x58,0x03,0x17,0x58,0x03,0x17, 0x59,0x03,0x17,0x57,0x03,0x82,0x18,0x59,0x04,0x01,0x19,0x57,0x04,0x82,0x18, 0x58,0x04,0x03,0x18,0x56,0x03,0x17,0x55,0x03,0x18,0x56,0x03,0x82,0x18,0x56, 0x04,0x02,0x17,0x55,0x03,0x18,0x56,0x04,0x82,0x17,0x54,0x03,0x02,0x17,0x56, 0x04,0x18,0x56,0x05,0x82,0x17,0x55,0x04,0x03,0x16,0x54,0x03,0x17,0x54,0x04, 0x17,0x53,0x02,0x82,0x16,0x54,0x04,0x02,0x17,0x53,0x04,0x16,0x52,0x03,0x85, 0x16,0x51,0x03,0x01,0x17,0x51,0x05,0x82,0x16,0x51,0x03,0x05,0x16,0x52,0x05, 0x15,0x50,0x03,0x16,0x50,0x03,0x17,0x52,0x05,0x15,0x51,0x03,0x83,0x15,0x50, 0x04,0x01,0x15,0x4f,0x04,0x84,0x15,0x4e,0x03,0x82,0x16,0x4e,0x04,0x01,0x15, 0x4d,0x03,0x82,0x15,0x4e,0x03,0x01,0x15,0x4d,0x03,0x82,0x15,0x4c,0x03,0x05, 0x15,0x4b,0x03,0x15,0x4c,0x03,0x15,0x4c,0x04,0x15,0x4b,0x03,0x14,0x4a,0x02, 0x83,0x15,0x4b,0x03,0x82,0x14,0x4b,0x03,0x03,0x14,0x4a,0x03,0x15,0x4b,0x05, 0x14,0x49,0x03,0x82,0x14,0x48,0x02,0x0b,0x13,0x49,0x02,0x13,0x48,0x03,0x15, 0x47,0x03,0x12,0x48,0x03,0x15,0x48,0x03,0x14,0x48,0x04,0x14,0x46,0x03,0x12, 0x45,0x02,0x13,0x46,0x04,0x13,0x45,0x03,0x13,0x46,0x03,0x83,0x12,0x45,0x03, 0x07,0x13,0x45,0x03,0x12,0x45,0x03,0x13,0x45,0x03,0x12,0x44,0x03,0x13,0x42, 0x02,0x13,0x43,0x03,0x12,0x43,0x03,0x82,0x12,0x42,0x02,0x04,0x12,0x42,0x03, 0x12,0x43,0x03,0x12,0x41,0x02,0x11,0x41,0x02,0x82,0x12,0x42,0x03,0x06,0x12, 0x41,0x03,0x10,0x40,0x01,0x11,0x40,0x02,0x12,0x41,0x03,0x12,0x40,0x03,0x11, 0x40,0x03,0x82,0x12,0x3f,0x03,0x04,0x12,0x3e,0x02,0x10,0x3f,0x02,0x11,0x3e, 0x03,0x10,0x3e,0x03,0x82,0x11,0x3e,0x03,0x0b,0x10,0x3d,0x03,0x11,0x3c,0x03, 0x11,0x3b,0x03,0x11,0x3c,0x03,0x10,0x3c,0x02,0x12,0x3c,0x03,0x10,0x3d,0x03, 0x0f,0x3d,0x02,0x10,0x3c,0x02,0x0f,0x3c,0x02,0x0f,0x3b,0x02,0x82,0x0f,0x3b, 0x03,0x05,0x10,0x3a,0x03,0x10,0x3b,0x03,0x0f,0x3a,0x03,0x0e,0x38,0x02,0x0f, 0x39,0x02,0x82,0x0f,0x39,0x03,0x01,0x0e,0x38,0x02,0x84,0x0f,0x38,0x03,0x07, 0x0f,0x37,0x02,0x0e,0x37,0x02,0x0f,0x37,0x03,0x0e,0x36,0x02,0x0f,0x37,0x03, 0x0e,0x36,0x02,0x0d,0x35,0x02,0x82,0x0e,0x36,0x03,0x01,0x0e,0x35,0x03,0x82, 0x0e,0x34,0x01,0x06,0x0d,0x35,0x02,0x0d,0x34,0x02,0x0e,0x35,0x03,0x0e,0x34, 0x03,0x0d,0x34,0x02,0x0e,0x34,0x03,0x82,0x0d,0x32,0x03,0x0a,0x0c,0x32,0x01, 0x0d,0x33,0x02,0x0d,0x32,0x01,0x0c,0x32,0x01,0x0c,0x32,0x02,0x0c,0x31,0x02, 0x0c,0x32,0x02,0x0d,0x32,0x01,0x0d,0x32,0x03,0x0c,0x31,0x02,0x82,0x0d,0x30, 0x02,0x0a,0x0c,0x30,0x02,0x0d,0x2f,0x02,0x0c,0x2f,0x01,0x0c,0x2f,0x02,0x0c, 0x2f,0x01,0x0c,0x2f,0x02,0x0c,0x2e,0x02,0x0c,0x2d,0x01,0x0c,0x2e,0x01,0x0c, 0x2e,0x02,0x83,0x0b,0x2d,0x01,0x03,0x0b,0x2c,0x01,0x0b,0x2c,0x02,0x0b,0x2b, 0x02,0x82,0x0b,0x2c,0x01,0x82,0x0b,0x2b,0x01,0x04,0x0c,0x2b,0x01,0x0b,0x2a, 0x01,0x0c,0x2a,0x01,0x0b,0x2a,0x01,0x82,0x0b,0x29,0x01,0x82,0x0a,0x28,0x00, 0x84,0x0a,0x28,0x01,0x04,0x09,0x28,0x01,0x0a,0x28,0x01,0x09,0x27,0x01,0x0a, 0x27,0x00,0x82,0x09,0x26,0x00,0x06,0x09,0x25,0x01,0x0a,0x25,0x01,0x09,0x26, 0x02,0x09,0x25,0x01,0x09,0x25,0x00,0x09,0x25,0x02,0x82,0x09,0x25,0x01,0x82, 0x09,0x24,0x01,0x82,0x09,0x23,0x01,0x02,0x08,0x24,0x01,0x08,0x23,0x01,0x83, 0x09,0x22,0x01,0x06,0x07,0x22,0x00,0x08,0x22,0x00,0x09,0x22,0x01,0x08,0x21, 0x00,0x07,0x21,0x00,0x09,0x21,0x02,0x83,0x08,0x20,0x00,0x06,0x08,0x1f,0x00, 0x07,0x1f,0x00,0x07,0x1f,0x01,0x08,0x1f,0x01,0x07,0x1f,0x00,0x06,0x1f,0x00, 0x84,0x07,0x1e,0x00,0x82,0x06,0x1d,0x00,0x02,0x06,0x1c,0x00,0x07,0x1c,0x01, 0x84,0x06,0x1c,0x00,0x83,0x06,0x1b,0x00,0x84,0x06,0x1a,0x00,0x01,0x06,0x19, 0x00,0x85,0x05,0x19,0x00,0x82,0x06,0x19,0x00,0x02,0x06,0x18,0x00,0x05,0x18, 0x00,0x86,0x05,0x17,0x00,0x03,0x05,0x16,0x00,0x05,0x15,0x00,0x05,0x16,0x00, 0x85,0x05,0x15,0x00,0x01,0x04,0x15,0x00,0x82,0x04,0x14,0x00,0x02,0x05,0x14, 0x00,0x04,0x14,0x00,0x86,0x04,0x13,0x00,0x86,0x03,0x12,0x00,0x84,0x03,0x11, 0x00,0x86,0x03,0x10,0x00,0x86,0x03,0x0f,0x00,0x84,0x03,0x0e,0x00,0x83,0x03, 0x0d,0x00,0x01,0x02,0x0c,0x00,0x83,0x03,0x0c,0x00,0x85,0x02,0x0c,0x00,0x85, 0x02,0x0b,0x00,0x84,0x02,0x0a,0x00,0x87,0x02,0x09,0x00,0x82,0x01,0x08,0x00, 0x83,0x01,0x07,0x00,0x01,0x02,0x08,0x00,0x82,0x02,0x09,0x00,0x03,0x03,0x09, 0x00,0x03,0x09,0x01,0x03,0x09,0x02,0x83,0x03,0x08,0x01,0x83,0x03,0x07,0x01, 0x82,0x03,0x06,0x01,0x06,0x03,0x06,0x00,0x02,0x06,0x00,0x02,0x05,0x01,0x02, 0x05,0x00,0x02,0x04,0x00,0x01,0x04,0x00,0x84,0x01,0x03,0x00,0x01,0x00,0x03, 0x00,0x82,0x00,0x02,0x00,0x82,0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x03,0x49, 0x9d,0x17,0x49,0x9c,0x15,0x47,0x9b,0x15,0x82,0x49,0x9c,0x16,0x02,0x47,0x9b, 0x15,0x49,0x9c,0x16,0x82,0x48,0x9b,0x16,0x03,0x47,0x9b,0x15,0x47,0x99,0x14, 0x48,0x9b,0x16,0x82,0x47,0x9c,0x16,0x0b,0x47,0x9a,0x16,0x47,0x9b,0x16,0x47, 0x9c,0x16,0x47,0x9b,0x16,0x47,0x9a,0x15,0x47,0x99,0x16,0x46,0x99,0x15,0x47, 0x99,0x14,0x47,0x99,0x16,0x47,0x9a,0x15,0x47,0x99,0x16,0x83,0x46,0x99,0x15, 0x82,0x45,0x98,0x14,0x82,0x46,0x99,0x15,0x01,0x45,0x99,0x15,0x82,0x46,0x99, 0x15,0x0a,0x44,0x99,0x14,0x45,0x99,0x15,0x46,0x99,0x15,0x45,0x98,0x14,0x45, 0x99,0x15,0x45,0x98,0x15,0x44,0x97,0x14,0x44,0x96,0x13,0x44,0x99,0x14,0x45, 0x99,0x15,0x82,0x44,0x99,0x14,0x01,0x46,0x99,0x16,0x82,0x44,0x97,0x14,0x83, 0x45,0x97,0x16,0x0e,0x45,0x98,0x15,0x44,0x97,0x14,0x44,0x97,0x17,0x44,0x96, 0x16,0x44,0x95,0x13,0x44,0x98,0x16,0x45,0x97,0x18,0x45,0x96,0x16,0x44,0x96, 0x17,0x45,0x95,0x19,0x44,0x96,0x17,0x45,0x97,0x1a,0x44,0x96,0x17,0x45,0x95, 0x17,0x82,0x45,0x95,0x19,0x01,0x44,0x95,0x18,0x82,0x44,0x96,0x19,0x05,0x44, 0x95,0x19,0x45,0x95,0x1a,0x46,0x96,0x1a,0x45,0x95,0x1a,0x44,0x95,0x19,0x82, 0x45,0x95,0x1b,0x03,0x45,0x96,0x1a,0x45,0x95,0x1b,0x44,0x94,0x1a,0x83,0x44, 0x94,0x1c,0x01,0x44,0x95,0x1c,0x82,0x44,0x93,0x1b,0x10,0x46,0x93,0x1c,0x44, 0x94,0x1c,0x44,0x93,0x1b,0x47,0x94,0x1d,0x47,0x94,0x1e,0x44,0x94,0x1d,0x45, 0x94,0x1f,0x46,0x92,0x1e,0x44,0x92,0x1d,0x44,0x93,0x1e,0x45,0x94,0x1f,0x44, 0x93,0x1e,0x45,0x94,0x20,0x44,0x92,0x1f,0x44,0x92,0x1d,0x44,0x93,0x1e,0x82, 0x44,0x93,0x20,0x03,0x46,0x92,0x20,0x45,0x92,0x1f,0x46,0x92,0x20,0x84,0x44, 0x93,0x20,0x82,0x44,0x92,0x21,0x0e,0x45,0x92,0x1f,0x44,0x91,0x20,0x44,0x92, 0x21,0x44,0x93,0x20,0x43,0x91,0x20,0x44,0x91,0x20,0x44,0x92,0x20,0x45,0x92, 0x20,0x46,0x92,0x21,0x45,0x92,0x20,0x44,0x92,0x20,0x44,0x92,0x22,0x46,0x92, 0x23,0x44,0x90,0x21,0x82,0x46,0x92,0x21,0x01,0x44,0x92,0x20,0x82,0x43,0x91, 0x20,0x03,0x45,0x92,0x20,0x44,0x90,0x21,0x45,0x92,0x20,0x82,0x45,0x91,0x22, 0x82,0x44,0x91,0x20,0x04,0x44,0x90,0x21,0x44,0x8f,0x20,0x45,0x92,0x20,0x44, 0x92,0x20,0x82,0x44,0x91,0x20,0x02,0x43,0x91,0x20,0x44,0x90,0x21,0x82,0x44, 0x8f,0x20,0x01,0x44,0x90,0x21,0x82,0x44,0x8f,0x20,0x06,0x44,0x90,0x21,0x42, 0x90,0x20,0x41,0x8f,0x20,0x44,0x90,0x21,0x45,0x91,0x22,0x42,0x90,0x20,0x82, 0x44,0x8f,0x20,0x84,0x43,0x8f,0x20,0x05,0x42,0x8e,0x20,0x41,0x8d,0x20,0x42, 0x8e,0x1f,0x41,0x8d,0x1e,0x43,0x8f,0x21,0x82,0x41,0x8d,0x20,0x01,0x42,0x8e, 0x20,0x83,0x42,0x8e,0x1f,0x01,0x41,0x8d,0x1e,0x82,0x41,0x8d,0x20,0x05,0x42, 0x8e,0x20,0x41,0x8c,0x20,0x40,0x8c,0x1f,0x41,0x8c,0x20,0x41,0x8c,0x1f,0x82, 0x41,0x8d,0x20,0x82,0x41,0x8c,0x1f,0x02,0x40,0x8a,0x1d,0x3f,0x8b,0x1d,0x82, 0x3e,0x8a,0x1d,0x03,0x3d,0x88,0x1c,0x3e,0x88,0x1d,0x3f,0x89,0x1d,0x82,0x40, 0x8a,0x1e,0x08,0x3f,0x89,0x1d,0x3e,0x88,0x1d,0x40,0x8a,0x1e,0x3e,0x88,0x1d, 0x3f,0x89,0x1d,0x40,0x8a,0x1e,0x3e,0x88,0x1d,0x3f,0x89,0x1d,0x82,0x3e,0x88, 0x1d,0x01,0x3f,0x89,0x1f,0x82,0x3e,0x88,0x1e,0x82,0x3f,0x89,0x1d,0x82,0x3e, 0x88,0x1d,0x05,0x3f,0x89,0x1d,0x3e,0x88,0x1d,0x3d,0x87,0x1d,0x3d,0x88,0x1c, 0x3e,0x88,0x1d,0x82,0x3e,0x8a,0x1b,0x05,0x3d,0x89,0x1a,0x3d,0x89,0x1c,0x3e, 0x8a,0x1d,0x3d,0x89,0x1c,0x3f,0x8b,0x1c,0x83,0x40,0x8c,0x1d,0x11,0x3e,0x8a, 0x1b,0x40,0x8c,0x1d,0x3f,0x8d,0x1c,0x3e,0x8c,0x1b,0x42,0x91,0x1d,0x40,0x8f, 0x1b,0x3f,0x8d,0x1c,0x41,0x8f,0x1c,0x41,0x90,0x1b,0x40,0x8e,0x1d,0x41,0x8f, 0x1d,0x3d,0x8b,0x1b,0x3f,0x8d,0x1c,0x40,0x8e,0x1d,0x3d,0x8c,0x1a,0x3f,0x8c, 0x1a,0x3f,0x8b,0x1d,0x82,0x3f,0x8b,0x1c,0x0f,0x40,0x8c,0x1d,0x3b,0x87,0x1a, 0x3e,0x8a,0x1d,0x3d,0x88,0x1b,0x3d,0x89,0x1c,0x3e,0x8a,0x1d,0x3d,0x88,0x1c, 0x3b,0x85,0x19,0x3f,0x89,0x1d,0x3c,0x86,0x1a,0x3a,0x84,0x17,0x3a,0x86,0x19, 0x3c,0x88,0x1b,0x3b,0x87,0x1a,0x3f,0x89,0x1d,0x82,0x3e,0x88,0x1c,0x12,0x3c, 0x88,0x1b,0x3d,0x88,0x1c,0x3d,0x87,0x1b,0x3c,0x86,0x1a,0x3a,0x85,0x1a,0x39, 0x83,0x19,0x38,0x82,0x16,0x3b,0x85,0x1a,0x39,0x82,0x1a,0x37,0x7e,0x19,0x2d, 0x74,0x10,0x23,0x68,0x09,0x1f,0x63,0x09,0x20,0x64,0x08,0x21,0x66,0x08,0x20, 0x65,0x07,0x21,0x66,0x08,0x20,0x65,0x09,0x83,0x20,0x65,0x07,0x05,0x1f,0x63, 0x07,0x20,0x65,0x07,0x1f,0x64,0x06,0x1f,0x63,0x07,0x1d,0x61,0x06,0x82,0x1e, 0x62,0x06,0x04,0x1c,0x60,0x06,0x1d,0x61,0x06,0x1d,0x60,0x06,0x1d,0x5f,0x06, 0x82,0x1c,0x60,0x06,0x02,0x1b,0x5f,0x05,0x1a,0x5e,0x04,0x82,0x1b,0x5f,0x05, 0x83,0x1a,0x5e,0x04,0x82,0x1a,0x5c,0x03,0x0c,0x1a,0x5d,0x04,0x1a,0x5b,0x03, 0x1a,0x5a,0x04,0x18,0x5b,0x04,0x17,0x58,0x03,0x18,0x58,0x03,0x16,0x58,0x03, 0x17,0x58,0x03,0x18,0x58,0x03,0x17,0x57,0x03,0x16,0x58,0x03,0x19,0x58,0x04, 0x82,0x18,0x57,0x03,0x82,0x17,0x56,0x03,0x02,0x16,0x55,0x03,0x18,0x57,0x04, 0x82,0x17,0x55,0x03,0x83,0x16,0x55,0x03,0x09,0x17,0x56,0x04,0x16,0x54,0x03, 0x17,0x55,0x04,0x17,0x54,0x02,0x16,0x54,0x03,0x16,0x54,0x04,0x18,0x54,0x05, 0x17,0x54,0x04,0x17,0x53,0x04,0x82,0x16,0x52,0x03,0x82,0x16,0x51,0x03,0x82, 0x16,0x51,0x05,0x04,0x16,0x53,0x05,0x16,0x52,0x04,0x16,0x51,0x03,0x17,0x51, 0x05,0x82,0x16,0x51,0x03,0x06,0x16,0x4f,0x03,0x18,0x4f,0x04,0x16,0x51,0x04, 0x16,0x4f,0x03,0x15,0x4f,0x03,0x16,0x4f,0x03,0x82,0x15,0x4f,0x03,0x05,0x16, 0x4e,0x03,0x15,0x4e,0x03,0x16,0x4e,0x03,0x16,0x4f,0x04,0x15,0x4e,0x03,0x82, 0x16,0x4d,0x03,0x06,0x15,0x4c,0x03,0x15,0x4c,0x02,0x15,0x4b,0x02,0x14,0x4b, 0x02,0x16,0x4c,0x03,0x16,0x4c,0x04,0x82,0x15,0x4b,0x03,0x01,0x13,0x4a,0x03, 0x82,0x14,0x4b,0x03,0x01,0x15,0x4b,0x04,0x82,0x13,0x4a,0x03,0x0f,0x14,0x49, 0x03,0x15,0x4a,0x04,0x14,0x4a,0x03,0x13,0x49,0x03,0x15,0x47,0x04,0x13,0x49, 0x03,0x15,0x47,0x03,0x13,0x47,0x04,0x14,0x47,0x04,0x14,0x47,0x03,0x13,0x46, 0x03,0x13,0x46,0x02,0x13,0x47,0x03,0x13,0x46,0x03,0x13,0x45,0x02,0x82,0x13, 0x45,0x03,0x01,0x12,0x45,0x03,0x82,0x13,0x45,0x03,0x84,0x13,0x44,0x03,0x02, 0x12,0x43,0x03,0x13,0x44,0x03,0x82,0x12,0x43,0x03,0x03,0x12,0x42,0x03,0x11, 0x43,0x03,0x12,0x43,0x03,0x82,0x13,0x42,0x03,0x82,0x12,0x41,0x03,0x01,0x13, 0x40,0x03,0x82,0x12,0x41,0x03,0x01,0x11,0x41,0x03,0x82,0x13,0x3f,0x03,0x82, 0x11,0x3f,0x03,0x05,0x10,0x3e,0x02,0x11,0x3e,0x03,0x10,0x3d,0x02,0x12,0x3d, 0x03,0x11,0x3e,0x04,0x82,0x10,0x3d,0x02,0x82,0x10,0x3d,0x03,0x09,0x10,0x3c, 0x02,0x10,0x3d,0x02,0x10,0x3c,0x02,0x10,0x3b,0x02,0x10,0x3c,0x02,0x12,0x3b, 0x03,0x10,0x3b,0x03,0x10,0x3a,0x02,0x10,0x3a,0x01,0x82,0x0f,0x3a,0x03,0x03, 0x10,0x38,0x02,0x0f,0x3a,0x03,0x0e,0x39,0x02,0x82,0x0f,0x38,0x03,0x02,0x0f, 0x38,0x02,0x0f,0x38,0x03,0x83,0x0e,0x37,0x02,0x08,0x0f,0x38,0x03,0x0f,0x37, 0x02,0x0f,0x37,0x03,0x0d,0x36,0x02,0x0e,0x36,0x02,0x0e,0x37,0x03,0x0e,0x36, 0x03,0x0d,0x35,0x01,0x82,0x0d,0x35,0x02,0x82,0x0d,0x34,0x02,0x01,0x0e,0x34, 0x03,0x82,0x0d,0x34,0x02,0x02,0x0d,0x34,0x03,0x0d,0x33,0x03,0x83,0x0d,0x33, 0x02,0x82,0x0d,0x32,0x02,0x02,0x0c,0x31,0x02,0x0d,0x32,0x02,0x83,0x0d,0x31, 0x02,0x87,0x0d,0x30,0x02,0x03,0x0d,0x2f,0x02,0x0d,0x2d,0x01,0x0d,0x2e,0x01, 0x83,0x0c,0x2e,0x02,0x83,0x0c,0x2d,0x02,0x06,0x0c,0x2c,0x01,0x0c,0x2c,0x02, 0x0b,0x2d,0x02,0x0b,0x2c,0x01,0x0c,0x2b,0x01,0x0b,0x2c,0x01,0x82,0x0a,0x2a, 0x01,0x01,0x0b,0x2b,0x02,0x82,0x0a,0x2a,0x01,0x01,0x0b,0x2a,0x02,0x82,0x0a, 0x2a,0x01,0x01,0x0a,0x29,0x00,0x82,0x0b,0x29,0x01,0x01,0x0a,0x28,0x01,0x82, 0x09,0x28,0x01,0x01,0x09,0x27,0x00,0x84,0x09,0x27,0x01,0x02,0x09,0x26,0x00, 0x09,0x27,0x01,0x82,0x09,0x26,0x00,0x08,0x09,0x26,0x01,0x0b,0x25,0x01,0x09, 0x25,0x01,0x09,0x24,0x01,0x09,0x23,0x01,0x09,0x25,0x01,0x09,0x24,0x01,0x09, 0x23,0x01,0x82,0x08,0x23,0x01,0x82,0x09,0x23,0x01,0x82,0x08,0x23,0x01,0x82, 0x08,0x21,0x00,0x01,0x08,0x22,0x01,0x82,0x08,0x20,0x00,0x02,0x08,0x20,0x01, 0x08,0x20,0x00,0x82,0x07,0x20,0x00,0x03,0x08,0x20,0x00,0x08,0x20,0x01,0x08, 0x1f,0x00,0x82,0x07,0x1f,0x00,0x03,0x07,0x1e,0x00,0x08,0x1f,0x01,0x07,0x1e, 0x00,0x82,0x07,0x1d,0x00,0x84,0x06,0x1d,0x00,0x83,0x06,0x1c,0x00,0x84,0x06, 0x1b,0x00,0x82,0x06,0x1a,0x00,0x01,0x05,0x1a,0x00,0x82,0x06,0x1a,0x00,0x06, 0x06,0x19,0x00,0x05,0x19,0x00,0x06,0x19,0x00,0x05,0x18,0x00,0x06,0x19,0x00, 0x06,0x18,0x00,0x82,0x05,0x18,0x00,0x84,0x05,0x17,0x00,0x88,0x05,0x16,0x00, 0x02,0x05,0x15,0x00,0x04,0x15,0x00,0x82,0x04,0x14,0x00,0x03,0x05,0x15,0x00, 0x04,0x14,0x00,0x04,0x13,0x00,0x82,0x04,0x14,0x00,0x83,0x04,0x13,0x00,0x82, 0x03,0x13,0x00,0x84,0x03,0x12,0x00,0x85,0x03,0x11,0x00,0x87,0x03,0x10,0x00, 0x84,0x03,0x0f,0x00,0x83,0x03,0x0e,0x00,0x84,0x03,0x0d,0x00,0x83,0x02,0x0d, 0x00,0x01,0x03,0x0d,0x00,0x84,0x02,0x0c,0x00,0x85,0x02,0x0b,0x00,0x85,0x02, 0x0a,0x00,0x84,0x02,0x09,0x00,0x83,0x01,0x09,0x00,0x83,0x01,0x08,0x00,0x85, 0x01,0x07,0x00,0x04,0x02,0x08,0x00,0x02,0x09,0x00,0x03,0x09,0x00,0x03,0x08, 0x00,0x82,0x03,0x08,0x01,0x82,0x03,0x07,0x01,0x84,0x03,0x06,0x01,0x01,0x02, 0x06,0x00,0x82,0x02,0x05,0x00,0x02,0x02,0x04,0x00,0x01,0x04,0x00,0x84,0x01, 0x03,0x00,0x01,0x00,0x03,0x00,0x82,0x00,0x02,0x00,0x82,0x00,0x01,0x00,0xdc, 0x00,0x00,0x00,0x0e,0x48,0x9d,0x16,0x49,0x9c,0x16,0x49,0x9e,0x17,0x48,0x9b, 0x15,0x47,0x9b,0x14,0x47,0x9f,0x15,0x48,0x9d,0x14,0x48,0x9d,0x16,0x47,0x9c, 0x15,0x48,0x9b,0x15,0x47,0x9b,0x14,0x47,0x9c,0x15,0x48,0x9b,0x15,0x47,0x9c, 0x17,0x82,0x47,0x9b,0x16,0x08,0x46,0x9b,0x15,0x47,0x9b,0x14,0x47,0x9b,0x16, 0x47,0x9b,0x14,0x47,0x9a,0x14,0x47,0x9b,0x16,0x47,0x9a,0x14,0x47,0x9b,0x16, 0x83,0x47,0x9a,0x15,0x01,0x46,0x99,0x14,0x83,0x45,0x9a,0x14,0x82,0x46,0x9b, 0x15,0x02,0x46,0x99,0x14,0x47,0x9a,0x15,0x82,0x45,0x9a,0x14,0x82,0x46,0x99, 0x14,0x02,0x45,0x9a,0x14,0x46,0x99,0x15,0x82,0x45,0x98,0x14,0x01,0x47,0x9a, 0x16,0x82,0x46,0x99,0x14,0x82,0x45,0x98,0x14,0x14,0x45,0x98,0x16,0x45,0x98, 0x14,0x45,0x98,0x16,0x44,0x97,0x15,0x45,0x98,0x16,0x46,0x99,0x15,0x44,0x97, 0x15,0x43,0x98,0x17,0x44,0x97,0x17,0x44,0x96,0x14,0x44,0x98,0x16,0x45,0x98, 0x17,0x44,0x97,0x15,0x44,0x98,0x17,0x45,0x96,0x18,0x43,0x98,0x17,0x44,0x97, 0x18,0x44,0x97,0x17,0x44,0x95,0x17,0x43,0x94,0x17,0x82,0x45,0x96,0x18,0x02, 0x45,0x97,0x1a,0x44,0x97,0x18,0x82,0x44,0x96,0x19,0x0b,0x43,0x94,0x17,0x44, 0x95,0x18,0x44,0x94,0x1a,0x46,0x96,0x1b,0x44,0x96,0x1b,0x43,0x96,0x1a,0x45, 0x95,0x1b,0x45,0x95,0x1c,0x44,0x94,0x1b,0x46,0x94,0x1b,0x44,0x94,0x1b,0x83, 0x44,0x96,0x1c,0x03,0x43,0x94,0x1d,0x45,0x96,0x1e,0x44,0x95,0x1e,0x83,0x45, 0x95,0x1e,0x02,0x46,0x96,0x1e,0x44,0x94,0x1e,0x82,0x45,0x94,0x1e,0x03,0x46, 0x93,0x1e,0x43,0x92,0x1e,0x45,0x94,0x20,0x82,0x44,0x94,0x1f,0x12,0x45,0x94, 0x20,0x46,0x95,0x21,0x44,0x94,0x1f,0x46,0x93,0x1f,0x45,0x92,0x1e,0x46,0x93, 0x1f,0x44,0x94,0x1f,0x45,0x94,0x20,0x43,0x93,0x1e,0x44,0x94,0x1f,0x45,0x94, 0x21,0x46,0x93,0x21,0x46,0x93,0x1f,0x45,0x92,0x20,0x46,0x93,0x21,0x44,0x94, 0x1f,0x43,0x91,0x1f,0x45,0x92,0x20,0x83,0x46,0x93,0x21,0x07,0x45,0x92,0x20, 0x45,0x94,0x21,0x44,0x93,0x22,0x45,0x91,0x21,0x44,0x91,0x21,0x45,0x92,0x20, 0x46,0x93,0x21,0x82,0x43,0x92,0x20,0x08,0x44,0x91,0x1f,0x45,0x92,0x20,0x45, 0x91,0x21,0x44,0x91,0x1f,0x45,0x91,0x21,0x46,0x92,0x22,0x45,0x92,0x20,0x44, 0x91,0x1f,0x82,0x45,0x91,0x21,0x02,0x44,0x93,0x21,0x42,0x91,0x20,0x82,0x44, 0x91,0x21,0x05,0x43,0x91,0x21,0x43,0x92,0x21,0x45,0x91,0x21,0x44,0x91,0x21, 0x44,0x91,0x1f,0x83,0x44,0x91,0x21,0x02,0x43,0x90,0x20,0x44,0x91,0x21,0x82, 0x42,0x91,0x20,0x01,0x43,0x90,0x20,0x82,0x44,0x91,0x21,0x84,0x43,0x90,0x20, 0x02,0x43,0x90,0x21,0x43,0x8f,0x21,0x82,0x43,0x8f,0x1f,0x01,0x43,0x90,0x20, 0x82,0x43,0x8f,0x21,0x04,0x42,0x8e,0x1e,0x43,0x8f,0x1f,0x43,0x90,0x20,0x43, 0x90,0x21,0x82,0x42,0x8e,0x20,0x82,0x41,0x8e,0x1f,0x04,0x40,0x8d,0x1e,0x41, 0x8e,0x1f,0x43,0x8e,0x20,0x43,0x8e,0x21,0x82,0x40,0x8c,0x1e,0x82,0x40,0x8d, 0x1e,0x82,0x40,0x8c,0x1e,0x04,0x41,0x8e,0x20,0x3e,0x8a,0x1d,0x3d,0x8a,0x1c, 0x40,0x8a,0x1e,0x84,0x40,0x8b,0x1e,0x83,0x40,0x8a,0x1e,0x03,0x40,0x8b,0x1e, 0x40,0x8a,0x1e,0x3c,0x87,0x1b,0x82,0x3f,0x8a,0x1d,0x04,0x3e,0x89,0x1c,0x3d, 0x89,0x1e,0x3e,0x8a,0x1e,0x3d,0x89,0x1e,0x82,0x3d,0x8a,0x1c,0x82,0x3c,0x88, 0x1b,0x01,0x3d,0x8a,0x1c,0x82,0x3e,0x89,0x1c,0x04,0x3e,0x89,0x1e,0x3e,0x89, 0x1b,0x3e,0x8a,0x1c,0x40,0x8c,0x1c,0x82,0x3d,0x8a,0x1b,0x03,0x3f,0x8b,0x1d, 0x40,0x8c,0x1e,0x3e,0x8a,0x1b,0x84,0x40,0x8c,0x1c,0x0f,0x40,0x8d,0x1d,0x40, 0x8e,0x1f,0x40,0x8f,0x1b,0x41,0x91,0x1b,0x3e,0x8e,0x19,0x41,0x91,0x1c,0x40, 0x8f,0x1b,0x3e,0x8e,0x1b,0x40,0x91,0x1e,0x41,0x90,0x1e,0x3f,0x8e,0x1d,0x3d, 0x8c,0x1a,0x3f,0x8e,0x1b,0x40,0x8e,0x1c,0x41,0x8e,0x1c,0x83,0x40,0x8d,0x1d, 0x08,0x40,0x8c,0x1c,0x40,0x8d,0x1d,0x3f,0x8b,0x1d,0x3d,0x8a,0x1c,0x3c,0x88, 0x1b,0x3d,0x8a,0x1c,0x3f,0x8b,0x1e,0x3f,0x8b,0x1d,0x82,0x3d,0x8a,0x1b,0x01, 0x3c,0x89,0x1b,0x82,0x40,0x8c,0x1e,0x04,0x3b,0x87,0x19,0x3e,0x8a,0x1c,0x3d, 0x88,0x1b,0x3e,0x89,0x1c,0x82,0x3c,0x87,0x1b,0x05,0x3c,0x87,0x1a,0x3b,0x86, 0x19,0x3c,0x87,0x1b,0x37,0x82,0x17,0x38,0x82,0x1b,0x82,0x39,0x82,0x17,0x05, 0x3a,0x83,0x18,0x3c,0x84,0x1a,0x39,0x80,0x1a,0x2c,0x73,0x13,0x21,0x68,0x08, 0x82,0x20,0x65,0x06,0x82,0x21,0x67,0x08,0x82,0x21,0x66,0x07,0x09,0x21,0x65, 0x09,0x1f,0x64,0x09,0x1f,0x65,0x06,0x20,0x65,0x08,0x1e,0x62,0x06,0x1e,0x62, 0x07,0x1f,0x64,0x09,0x1e,0x61,0x06,0x1d,0x60,0x06,0x82,0x1c,0x61,0x06,0x01, 0x1d,0x62,0x06,0x82,0x1c,0x61,0x06,0x02,0x1c,0x61,0x04,0x1b,0x5f,0x03,0x82, 0x1b,0x5f,0x04,0x01,0x1a,0x5e,0x02,0x84,0x1b,0x5e,0x04,0x0a,0x1a,0x5d,0x03, 0x1a,0x5c,0x03,0x19,0x5b,0x04,0x18,0x5b,0x04,0x17,0x59,0x03,0x17,0x58,0x03, 0x16,0x58,0x02,0x17,0x58,0x03,0x19,0x59,0x04,0x17,0x58,0x03,0x82,0x18,0x58, 0x03,0x82,0x17,0x57,0x03,0x08,0x17,0x56,0x02,0x17,0x57,0x03,0x17,0x56,0x03, 0x17,0x57,0x03,0x17,0x56,0x03,0x18,0x57,0x04,0x17,0x56,0x03,0x17,0x55,0x03, 0x82,0x17,0x56,0x03,0x83,0x17,0x54,0x03,0x02,0x16,0x53,0x03,0x16,0x53,0x04, 0x82,0x16,0x53,0x03,0x01,0x17,0x53,0x02,0x82,0x17,0x54,0x03,0x06,0x16,0x52, 0x03,0x17,0x52,0x03,0x17,0x53,0x04,0x16,0x51,0x04,0x16,0x52,0x03,0x17,0x54, 0x05,0x82,0x16,0x51,0x03,0x0d,0x16,0x52,0x03,0x17,0x52,0x04,0x16,0x50,0x03, 0x17,0x4f,0x03,0x16,0x51,0x04,0x17,0x51,0x04,0x16,0x51,0x04,0x16,0x50,0x03, 0x15,0x50,0x03,0x16,0x4f,0x03,0x15,0x4e,0x03,0x14,0x4e,0x03,0x14,0x4d,0x03, 0x82,0x16,0x4e,0x03,0x82,0x15,0x4d,0x03,0x05,0x16,0x4d,0x03,0x15,0x4d,0x02, 0x15,0x4c,0x03,0x14,0x4c,0x02,0x15,0x4d,0x03,0x82,0x15,0x4c,0x03,0x0c,0x14, 0x4b,0x03,0x15,0x4b,0x03,0x16,0x4c,0x04,0x15,0x4b,0x03,0x14,0x4a,0x03,0x12, 0x4a,0x02,0x15,0x4b,0x04,0x14,0x4a,0x03,0x14,0x49,0x03,0x14,0x4a,0x02,0x14, 0x4a,0x03,0x15,0x48,0x04,0x83,0x14,0x48,0x03,0x02,0x14,0x47,0x04,0x14,0x49, 0x04,0x84,0x14,0x47,0x03,0x04,0x13,0x46,0x02,0x13,0x46,0x03,0x14,0x47,0x04, 0x12,0x46,0x03,0x82,0x14,0x46,0x03,0x05,0x14,0x45,0x03,0x13,0x44,0x03,0x11, 0x44,0x02,0x12,0x44,0x03,0x12,0x45,0x03,0x82,0x13,0x44,0x03,0x82,0x12,0x43, 0x03,0x82,0x11,0x43,0x03,0x83,0x12,0x42,0x03,0x09,0x12,0x43,0x03,0x12,0x42, 0x03,0x14,0x41,0x03,0x11,0x41,0x03,0x11,0x3f,0x01,0x12,0x40,0x02,0x11,0x40, 0x03,0x10,0x40,0x03,0x10,0x3f,0x03,0x82,0x11,0x40,0x03,0x07,0x10,0x3e,0x02, 0x11,0x3d,0x03,0x11,0x3c,0x03,0x10,0x3d,0x01,0x10,0x3e,0x03,0x10,0x3e,0x02, 0x11,0x3c,0x02,0x82,0x10,0x3d,0x02,0x82,0x11,0x3c,0x02,0x07,0x10,0x3c,0x03, 0x10,0x3a,0x02,0x10,0x3c,0x03,0x10,0x3c,0x02,0x0f,0x3a,0x01,0x10,0x3c,0x03, 0x10,0x3a,0x03,0x82,0x0f,0x39,0x02,0x84,0x0f,0x39,0x03,0x01,0x0e,0x39,0x03, 0x83,0x0e,0x38,0x02,0x0a,0x0e,0x37,0x02,0x0f,0x39,0x02,0x0f,0x38,0x02,0x0f, 0x38,0x03,0x10,0x36,0x03,0x10,0x37,0x03,0x0f,0x36,0x02,0x0e,0x36,0x02,0x0f, 0x36,0x03,0x0e,0x36,0x02,0x82,0x0e,0x36,0x03,0x06,0x0e,0x35,0x03,0x0d,0x35, 0x02,0x0d,0x34,0x01,0x0d,0x34,0x02,0x0d,0x32,0x02,0x0d,0x34,0x01,0x82,0x0d, 0x33,0x02,0x83,0x0d,0x32,0x02,0x01,0x0d,0x33,0x03,0x82,0x0d,0x32,0x02,0x01, 0x0e,0x32,0x02,0x82,0x0d,0x31,0x02,0x82,0x0c,0x30,0x01,0x83,0x0d,0x30,0x02, 0x83,0x0d,0x2f,0x02,0x83,0x0c,0x2f,0x02,0x01,0x0d,0x2e,0x02,0x82,0x0c,0x2e, 0x02,0x09,0x0c,0x2c,0x01,0x0c,0x2c,0x02,0x0c,0x2d,0x02,0x0b,0x2c,0x01,0x0c, 0x2c,0x01,0x0b,0x2c,0x01,0x0a,0x2b,0x01,0x0b,0x2c,0x01,0x0a,0x2a,0x00,0x83, 0x0a,0x2b,0x01,0x03,0x0b,0x2c,0x02,0x0a,0x2a,0x01,0x0a,0x29,0x00,0x83,0x0a, 0x29,0x01,0x82,0x0a,0x28,0x01,0x82,0x0a,0x28,0x00,0x03,0x0a,0x27,0x00,0x09, 0x27,0x00,0x0a,0x28,0x01,0x83,0x0a,0x27,0x01,0x04,0x0a,0x26,0x00,0x09,0x26, 0x00,0x0a,0x26,0x01,0x08,0x26,0x01,0x84,0x0a,0x25,0x01,0x06,0x0a,0x24,0x00, 0x09,0x23,0x01,0x09,0x24,0x01,0x0a,0x24,0x01,0x09,0x23,0x01,0x09,0x24,0x01, 0x82,0x08,0x22,0x00,0x05,0x09,0x22,0x00,0x08,0x22,0x00,0x09,0x21,0x00,0x08, 0x21,0x00,0x07,0x21,0x00,0x82,0x08,0x20,0x00,0x01,0x07,0x21,0x01,0x82,0x08, 0x20,0x00,0x82,0x08,0x1f,0x00,0x86,0x07,0x1e,0x00,0x01,0x07,0x1e,0x01,0x82, 0x07,0x1d,0x01,0x04,0x06,0x1d,0x00,0x06,0x1d,0x01,0x06,0x1c,0x01,0x06,0x1c, 0x00,0x86,0x06,0x1b,0x00,0x83,0x06,0x1a,0x00,0x02,0x06,0x19,0x00,0x05,0x19, 0x00,0x83,0x06,0x19,0x00,0x05,0x06,0x18,0x00,0x05,0x18,0x00,0x06,0x18,0x00, 0x05,0x17,0x00,0x06,0x17,0x00,0x86,0x05,0x17,0x00,0x82,0x05,0x16,0x00,0x85, 0x04,0x15,0x00,0x01,0x05,0x15,0x00,0x88,0x04,0x14,0x00,0x01,0x04,0x13,0x00, 0x82,0x03,0x13,0x00,0x83,0x03,0x12,0x00,0x84,0x03,0x11,0x00,0x88,0x03,0x10, 0x00,0x84,0x03,0x0f,0x00,0x83,0x03,0x0e,0x00,0x85,0x03,0x0d,0x00,0x03,0x02, 0x0d,0x00,0x02,0x0c,0x00,0x03,0x0d,0x00,0x84,0x02,0x0c,0x00,0x86,0x02,0x0b, 0x00,0x86,0x02,0x0a,0x00,0x82,0x02,0x09,0x00,0x82,0x01,0x09,0x00,0x84,0x01, 0x08,0x00,0x84,0x01,0x07,0x00,0x83,0x01,0x06,0x00,0x01,0x02,0x07,0x00,0x82, 0x02,0x08,0x00,0x01,0x03,0x08,0x01,0x83,0x03,0x07,0x01,0x83,0x03,0x06,0x01, 0x01,0x02,0x06,0x00,0x82,0x02,0x05,0x00,0x02,0x02,0x04,0x00,0x01,0x04,0x00, 0x84,0x01,0x03,0x00,0x01,0x00,0x03,0x00,0x82,0x00,0x02,0x00,0x82,0x00,0x01, 0x00,0xdc,0x00,0x00,0x00,0x03,0x49,0x9e,0x16,0x49,0x9d,0x15,0x48,0x9e,0x15, 0x82,0x49,0x9e,0x16,0x03,0x46,0x9e,0x13,0x48,0x9e,0x14,0x46,0x9e,0x15,0x83, 0x49,0x9d,0x15,0x0d,0x47,0x9d,0x15,0x48,0x9c,0x15,0x48,0x9e,0x17,0x47,0x9d, 0x16,0x48,0x9c,0x16,0x46,0x9c,0x15,0x47,0x9d,0x15,0x46,0x9c,0x15,0x47,0x9d, 0x15,0x46,0x9c,0x14,0x46,0x9c,0x15,0x46,0x9c,0x14,0x46,0x9b,0x15,0x83,0x46, 0x9c,0x15,0x01,0x46,0x9b,0x15,0x82,0x46,0x9c,0x15,0x0b,0x46,0x9b,0x15,0x46, 0x9c,0x15,0x46,0x9b,0x15,0x46,0x9a,0x14,0x46,0x9a,0x15,0x46,0x9b,0x15,0x46, 0x9a,0x15,0x45,0x9a,0x15,0x45,0x9a,0x14,0x46,0x9b,0x15,0x45,0x99,0x13,0x83, 0x46,0x9a,0x15,0x01,0x45,0x99,0x14,0x82,0x46,0x9a,0x15,0x01,0x44,0x98,0x13, 0x82,0x44,0x99,0x14,0x02,0x45,0x9a,0x15,0x45,0x98,0x15,0x82,0x45,0x99,0x14, 0x16,0x43,0x98,0x13,0x44,0x99,0x15,0x45,0x98,0x17,0x46,0x99,0x18,0x44,0x99, 0x15,0x44,0x97,0x15,0x42,0x96,0x16,0x44,0x97,0x18,0x45,0x98,0x17,0x42,0x97, 0x17,0x44,0x97,0x18,0x44,0x98,0x18,0x46,0x97,0x18,0x43,0x97,0x17,0x45,0x97, 0x18,0x46,0x97,0x19,0x45,0x97,0x19,0x43,0x96,0x18,0x43,0x97,0x18,0x45,0x97, 0x19,0x44,0x97,0x18,0x45,0x97,0x18,0x82,0x44,0x95,0x19,0x12,0x44,0x97,0x1a, 0x44,0x98,0x1b,0x44,0x97,0x1c,0x43,0x96,0x1b,0x46,0x97,0x1c,0x46,0x95,0x1c, 0x44,0x95,0x1b,0x45,0x97,0x1c,0x46,0x98,0x1d,0x44,0x97,0x1c,0x44,0x96,0x1d, 0x45,0x96,0x1d,0x44,0x96,0x1d,0x44,0x95,0x1c,0x46,0x95,0x1d,0x46,0x97,0x1e, 0x45,0x96,0x1d,0x46,0x94,0x1e,0x82,0x46,0x96,0x1f,0x08,0x47,0x95,0x1f,0x46, 0x94,0x1f,0x46,0x96,0x20,0x45,0x95,0x1f,0x44,0x94,0x1f,0x45,0x95,0x1f,0x46, 0x96,0x20,0x45,0x95,0x1f,0x83,0x46,0x94,0x1f,0x0b,0x44,0x94,0x1f,0x46,0x96, 0x20,0x45,0x95,0x1f,0x44,0x93,0x20,0x46,0x93,0x1f,0x44,0x92,0x1f,0x46,0x93, 0x20,0x46,0x94,0x1f,0x45,0x93,0x1f,0x46,0x93,0x20,0x45,0x94,0x21,0x84,0x46, 0x93,0x20,0x01,0x45,0x93,0x1f,0x82,0x44,0x93,0x20,0x0a,0x45,0x92,0x21,0x46, 0x93,0x20,0x45,0x92,0x21,0x43,0x93,0x21,0x44,0x93,0x20,0x46,0x93,0x20,0x45, 0x92,0x21,0x46,0x93,0x22,0x45,0x93,0x1f,0x44,0x93,0x22,0x82,0x45,0x92,0x21, 0x82,0x45,0x93,0x1f,0x06,0x45,0x92,0x21,0x46,0x93,0x22,0x46,0x93,0x20,0x43, 0x93,0x21,0x45,0x92,0x21,0x44,0x91,0x20,0x82,0x43,0x93,0x21,0x01,0x45,0x92, 0x21,0x82,0x44,0x92,0x1f,0x16,0x44,0x91,0x20,0x43,0x93,0x21,0x44,0x93,0x22, 0x43,0x91,0x1e,0x42,0x90,0x1d,0x42,0x92,0x20,0x43,0x93,0x21,0x44,0x91,0x20, 0x42,0x91,0x1f,0x42,0x90,0x1f,0x43,0x90,0x1f,0x42,0x90,0x1f,0x42,0x91,0x1f, 0x42,0x92,0x20,0x43,0x90,0x1f,0x44,0x91,0x22,0x45,0x92,0x21,0x44,0x91,0x20, 0x42,0x90,0x1f,0x43,0x90,0x1f,0x44,0x91,0x20,0x41,0x8e,0x1d,0x82,0x42,0x90, 0x1f,0x86,0x42,0x8f,0x1f,0x05,0x42,0x90,0x1f,0x42,0x8f,0x1e,0x41,0x8e,0x1f, 0x40,0x8d,0x1e,0x41,0x8e,0x1f,0x82,0x3f,0x8c,0x1d,0x01,0x41,0x8e,0x1f,0x82, 0x40,0x8d,0x1f,0x04,0x3f,0x8c,0x1e,0x3f,0x8c,0x1d,0x3f,0x8c,0x1e,0x40,0x8c, 0x1e,0x83,0x3f,0x8b,0x1d,0x01,0x3f,0x8b,0x1f,0x84,0x3f,0x8c,0x1d,0x04,0x3f, 0x8b,0x1d,0x3f,0x8a,0x1c,0x40,0x8c,0x1e,0x3f,0x8a,0x1c,0x83,0x3f,0x8c,0x1d, 0x02,0x3e,0x8b,0x1c,0x3f,0x8c,0x1e,0x83,0x3e,0x8b,0x1c,0x09,0x3d,0x89,0x1c, 0x3f,0x8a,0x1c,0x3e,0x89,0x1c,0x3e,0x8b,0x1a,0x3d,0x8a,0x1c,0x3f,0x8c,0x1c, 0x3e,0x8b,0x1c,0x3f,0x8c,0x1b,0x3d,0x8a,0x1b,0x83,0x3f,0x8c,0x1c,0x0a,0x3f, 0x8c,0x1b,0x41,0x8e,0x1d,0x3e,0x8b,0x1a,0x40,0x8d,0x1c,0x3f,0x90,0x1e,0x3e, 0x8d,0x1c,0x3f,0x8f,0x19,0x42,0x92,0x1b,0x42,0x93,0x1d,0x3e,0x8d,0x1a,0x82, 0x41,0x93,0x1b,0x04,0x3e,0x8d,0x1a,0x3e,0x8d,0x1c,0x40,0x90,0x1c,0x40,0x90, 0x1e,0x82,0x3f,0x8e,0x1b,0x1e,0x3f,0x8c,0x1c,0x3f,0x8d,0x1a,0x3f,0x8c,0x1c, 0x40,0x8d,0x1c,0x3f,0x8c,0x1b,0x3f,0x8c,0x1c,0x3e,0x8b,0x1c,0x3f,0x8c,0x1d, 0x3e,0x8b,0x1c,0x3f,0x8c,0x1c,0x3e,0x8b,0x1c,0x3c,0x89,0x1b,0x3e,0x8b,0x1c, 0x3f,0x8c,0x1c,0x3f,0x8c,0x1b,0x3f,0x8c,0x1c,0x3f,0x8c,0x1b,0x3d,0x8a,0x19, 0x3e,0x89,0x1c,0x3b,0x89,0x19,0x3c,0x89,0x18,0x3d,0x89,0x18,0x3b,0x87,0x18, 0x3e,0x89,0x1b,0x3d,0x89,0x1b,0x3a,0x85,0x1c,0x38,0x82,0x18,0x39,0x82,0x18, 0x3a,0x83,0x19,0x38,0x82,0x18,0x82,0x3a,0x83,0x18,0x07,0x3b,0x85,0x1b,0x39, 0x82,0x18,0x31,0x7a,0x13,0x28,0x6e,0x0e,0x20,0x66,0x08,0x1f,0x65,0x07,0x21, 0x67,0x07,0x83,0x22,0x68,0x08,0x03,0x21,0x66,0x09,0x1f,0x65,0x07,0x21,0x66, 0x08,0x82,0x1e,0x63,0x07,0x82,0x1f,0x62,0x07,0x01,0x1e,0x63,0x07,0x83,0x1c, 0x62,0x06,0x16,0x1d,0x62,0x07,0x1e,0x63,0x07,0x1c,0x62,0x04,0x1c,0x61,0x05, 0x1c,0x62,0x06,0x1c,0x61,0x04,0x1b,0x5f,0x03,0x1c,0x60,0x05,0x1c,0x60,0x04, 0x1c,0x5f,0x03,0x1a,0x5f,0x04,0x1b,0x5e,0x04,0x19,0x5c,0x04,0x18,0x5b,0x03, 0x19,0x5c,0x05,0x18,0x59,0x03,0x17,0x5a,0x03,0x18,0x5b,0x03,0x19,0x57,0x03, 0x18,0x58,0x03,0x17,0x57,0x02,0x18,0x58,0x03,0x84,0x18,0x57,0x03,0x03,0x17, 0x57,0x03,0x18,0x57,0x03,0x18,0x57,0x04,0x82,0x16,0x55,0x02,0x08,0x17,0x56, 0x04,0x17,0x55,0x04,0x16,0x54,0x03,0x18,0x54,0x02,0x17,0x54,0x03,0x17,0x56, 0x03,0x17,0x54,0x04,0x16,0x54,0x04,0x82,0x16,0x54,0x03,0x01,0x16,0x54,0x01, 0x82,0x16,0x53,0x01,0x05,0x16,0x53,0x03,0x17,0x53,0x03,0x15,0x51,0x02,0x16, 0x52,0x04,0x17,0x53,0x04,0x82,0x16,0x52,0x03,0x07,0x18,0x53,0x06,0x15,0x52, 0x02,0x15,0x52,0x03,0x15,0x50,0x03,0x16,0x50,0x04,0x15,0x51,0x03,0x17,0x50, 0x04,0x82,0x16,0x50,0x03,0x04,0x15,0x50,0x03,0x18,0x4f,0x03,0x15,0x4f,0x03, 0x15,0x4f,0x04,0x82,0x15,0x4e,0x03,0x05,0x17,0x4e,0x03,0x16,0x4e,0x03,0x15, 0x4f,0x03,0x17,0x4d,0x03,0x15,0x4d,0x04,0x83,0x15,0x4d,0x03,0x08,0x15,0x4c, 0x03,0x15,0x4d,0x05,0x15,0x4d,0x03,0x15,0x4c,0x03,0x16,0x4d,0x04,0x15,0x4c, 0x03,0x15,0x4b,0x04,0x13,0x49,0x03,0x82,0x15,0x4a,0x03,0x04,0x14,0x49,0x03, 0x15,0x4a,0x02,0x15,0x49,0x03,0x13,0x49,0x03,0x82,0x14,0x49,0x03,0x0b,0x15, 0x49,0x03,0x14,0x48,0x03,0x13,0x47,0x02,0x14,0x48,0x03,0x13,0x47,0x02,0x13, 0x48,0x03,0x13,0x47,0x03,0x13,0x46,0x03,0x14,0x47,0x03,0x15,0x47,0x04,0x12, 0x46,0x03,0x83,0x14,0x46,0x03,0x08,0x13,0x45,0x03,0x12,0x44,0x02,0x13,0x45, 0x03,0x14,0x46,0x03,0x12,0x44,0x03,0x14,0x45,0x03,0x13,0x44,0x03,0x12,0x43, 0x03,0x82,0x12,0x44,0x03,0x83,0x12,0x42,0x03,0x0b,0x13,0x42,0x03,0x11,0x42, 0x03,0x12,0x42,0x03,0x11,0x42,0x03,0x12,0x40,0x02,0x11,0x42,0x03,0x11,0x40, 0x02,0x12,0x3f,0x02,0x11,0x3f,0x03,0x11,0x40,0x03,0x10,0x3f,0x03,0x82,0x11, 0x3e,0x03,0x03,0x12,0x3f,0x03,0x11,0x3f,0x03,0x11,0x3e,0x02,0x82,0x11,0x3d, 0x03,0x82,0x10,0x3d,0x03,0x0d,0x11,0x3c,0x03,0x10,0x3c,0x03,0x0f,0x3d,0x03, 0x11,0x3b,0x02,0x0f,0x3b,0x02,0x11,0x3d,0x03,0x0f,0x3c,0x02,0x10,0x3b,0x03, 0x0f,0x3b,0x02,0x10,0x3b,0x03,0x0f,0x3a,0x02,0x10,0x39,0x03,0x10,0x39,0x02, 0x82,0x0e,0x39,0x02,0x08,0x0f,0x39,0x03,0x0e,0x38,0x02,0x0e,0x39,0x03,0x0f, 0x39,0x03,0x0f,0x38,0x03,0x0f,0x39,0x02,0x0e,0x38,0x01,0x0e,0x38,0x03,0x82, 0x10,0x38,0x03,0x01,0x0f,0x36,0x01,0x82,0x0e,0x37,0x03,0x0e,0x0f,0x37,0x02, 0x0e,0x37,0x03,0x0e,0x36,0x03,0x0e,0x35,0x03,0x0e,0x35,0x02,0x0e,0x35,0x03, 0x0e,0x34,0x02,0x0d,0x34,0x01,0x0e,0x34,0x01,0x0e,0x34,0x02,0x0d,0x33,0x02, 0x0e,0x32,0x02,0x0e,0x33,0x02,0x0e,0x32,0x01,0x82,0x0e,0x32,0x02,0x02,0x0e, 0x33,0x02,0x0e,0x31,0x02,0x83,0x0d,0x31,0x02,0x08,0x0c,0x31,0x02,0x0e,0x31, 0x02,0x0d,0x30,0x02,0x0c,0x30,0x01,0x0c,0x30,0x02,0x0d,0x30,0x02,0x0c,0x30, 0x02,0x0c,0x2f,0x01,0x82,0x0c,0x2f,0x02,0x05,0x0c,0x2d,0x01,0x0c,0x2e,0x02, 0x0b,0x2d,0x00,0x0c,0x2d,0x01,0x0b,0x2d,0x01,0x82,0x0b,0x2d,0x00,0x02,0x0a, 0x2c,0x00,0x0a,0x2d,0x00,0x82,0x0b,0x2d,0x01,0x01,0x0a,0x2b,0x00,0x83,0x0a, 0x2b,0x01,0x82,0x0b,0x2b,0x01,0x04,0x0a,0x2a,0x01,0x0a,0x2a,0x00,0x0a,0x2a, 0x01,0x0a,0x2a,0x02,0x82,0x0a,0x2a,0x01,0x0c,0x0b,0x2a,0x02,0x0a,0x29,0x01, 0x0a,0x28,0x01,0x0a,0x27,0x02,0x0a,0x27,0x01,0x09,0x26,0x01,0x0a,0x26,0x01, 0x0a,0x27,0x01,0x0a,0x26,0x01,0x09,0x26,0x00,0x09,0x26,0x01,0x0a,0x26,0x01, 0x82,0x09,0x26,0x01,0x08,0x0a,0x25,0x01,0x09,0x25,0x01,0x09,0x24,0x00,0x09, 0x23,0x00,0x09,0x24,0x00,0x0a,0x24,0x01,0x09,0x23,0x00,0x08,0x23,0x00,0x84, 0x09,0x23,0x00,0x01,0x09,0x22,0x01,0x82,0x08,0x22,0x01,0x02,0x09,0x22,0x00, 0x08,0x21,0x00,0x82,0x07,0x20,0x00,0x02,0x08,0x20,0x00,0x08,0x20,0x01,0x86, 0x07,0x1f,0x00,0x83,0x07,0x1e,0x00,0x82,0x07,0x1d,0x00,0x86,0x07,0x1c,0x00, 0x82,0x06,0x1c,0x00,0x01,0x07,0x1b,0x00,0x83,0x06,0x1a,0x00,0x86,0x06,0x19, 0x00,0x82,0x05,0x18,0x00,0x82,0x06,0x18,0x00,0x82,0x05,0x18,0x00,0x83,0x05, 0x17,0x00,0x82,0x05,0x16,0x00,0x82,0x04,0x15,0x00,0x01,0x05,0x16,0x00,0x86, 0x04,0x15,0x00,0x86,0x04,0x14,0x00,0x83,0x04,0x13,0x00,0x02,0x04,0x12,0x00, 0x03,0x12,0x00,0x8a,0x03,0x11,0x00,0x83,0x03,0x10,0x00,0x83,0x03,0x0f,0x00, 0x88,0x03,0x0e,0x00,0x01,0x03,0x0d,0x00,0x82,0x02,0x0d,0x00,0x85,0x02,0x0c, 0x00,0x86,0x02,0x0b,0x00,0x85,0x02,0x0a,0x00,0x85,0x02,0x09,0x00,0x83,0x01, 0x08,0x00,0x88,0x01,0x07,0x00,0x01,0x01,0x06,0x00,0x82,0x01,0x07,0x00,0x82, 0x02,0x07,0x00,0x01,0x03,0x07,0x00,0x83,0x03,0x07,0x01,0x82,0x02,0x06,0x00, 0x82,0x02,0x05,0x00,0x82,0x02,0x04,0x00,0x01,0x01,0x04,0x00,0x83,0x01,0x03, 0x00,0x01,0x00,0x03,0x00,0x82,0x00,0x02,0x00,0x82,0x00,0x01,0x00,0xdc,0x00, 0x00,0x00,0x09,0x49,0xa0,0x16,0x49,0x9d,0x15,0x49,0xa0,0x16,0x48,0x9e,0x15, 0x49,0x9f,0x15,0x49,0xa0,0x16,0x48,0x9e,0x15,0x45,0x9e,0x14,0x49,0x9d,0x15, 0x82,0x48,0x9e,0x15,0x01,0x48,0x9d,0x15,0x82,0x47,0x9d,0x15,0x05,0x47,0x9c, 0x15,0x46,0x9d,0x15,0x48,0x9e,0x15,0x48,0x9e,0x16,0x47,0x9d,0x14,0x82,0x47, 0x9d,0x15,0x03,0x47,0x9d,0x14,0x47,0x9d,0x15,0x45,0x9c,0x12,0x82,0x47,0x9d, 0x15,0x84,0x46,0x9d,0x15,0x82,0x45,0x9c,0x14,0x03,0x45,0x9d,0x15,0x46,0x9d, 0x15,0x47,0x9c,0x15,0x82,0x46,0x9c,0x15,0x04,0x45,0x9b,0x15,0x45,0x9a,0x14, 0x45,0x9c,0x14,0x45,0x9b,0x13,0x82,0x45,0x9a,0x14,0x01,0x46,0x9b,0x15,0x83, 0x45,0x9a,0x14,0x05,0x45,0x9a,0x15,0x45,0x99,0x13,0x44,0x99,0x15,0x45,0x9b, 0x15,0x45,0x9a,0x14,0x83,0x45,0x99,0x15,0x05,0x45,0x9b,0x15,0x44,0x98,0x15, 0x44,0x99,0x16,0x44,0x98,0x14,0x43,0x99,0x14,0x82,0x44,0x98,0x17,0x02,0x44, 0x99,0x16,0x45,0x99,0x18,0x82,0x45,0x99,0x19,0x82,0x45,0x99,0x18,0x06,0x45, 0x98,0x19,0x44,0x96,0x17,0x43,0x96,0x17,0x45,0x99,0x19,0x45,0x98,0x19,0x45, 0x98,0x1a,0x82,0x45,0x98,0x19,0x03,0x44,0x96,0x1a,0x43,0x96,0x1a,0x44,0x97, 0x19,0x82,0x45,0x98,0x1a,0x09,0x45,0x99,0x1d,0x45,0x98,0x1c,0x44,0x96,0x1a, 0x45,0x96,0x1b,0x44,0x97,0x1b,0x43,0x96,0x1a,0x45,0x96,0x1b,0x45,0x97,0x1c, 0x46,0x96,0x1d,0x82,0x45,0x96,0x1d,0x04,0x47,0x96,0x1d,0x45,0x97,0x1d,0x44, 0x96,0x1d,0x46,0x95,0x1d,0x83,0x45,0x96,0x1e,0x01,0x45,0x96,0x1d,0x82,0x45, 0x96,0x1f,0x01,0x44,0x95,0x1e,0x83,0x45,0x96,0x20,0x01,0x47,0x96,0x20,0x82, 0x46,0x95,0x1f,0x05,0x45,0x96,0x1f,0x45,0x96,0x20,0x45,0x96,0x1f,0x44,0x94, 0x20,0x46,0x95,0x1f,0x82,0x46,0x95,0x20,0x04,0x46,0x95,0x1f,0x46,0x95,0x20, 0x45,0x93,0x21,0x44,0x94,0x20,0x85,0x45,0x94,0x20,0x82,0x43,0x93,0x1f,0x0e, 0x46,0x95,0x20,0x45,0x94,0x20,0x45,0x93,0x21,0x45,0x95,0x22,0x45,0x95,0x20, 0x45,0x94,0x20,0x45,0x92,0x20,0x45,0x93,0x21,0x44,0x94,0x20,0x44,0x94,0x21, 0x43,0x93,0x20,0x44,0x94,0x21,0x45,0x94,0x20,0x45,0x93,0x1f,0x82,0x45,0x92, 0x20,0x04,0x45,0x93,0x21,0x43,0x93,0x1f,0x45,0x94,0x20,0x45,0x92,0x20,0x82, 0x42,0x92,0x20,0x02,0x44,0x94,0x21,0x45,0x92,0x20,0x82,0x45,0x93,0x21,0x10, 0x42,0x92,0x20,0x44,0x94,0x21,0x45,0x93,0x1f,0x44,0x92,0x1e,0x42,0x92,0x20, 0x44,0x94,0x21,0x45,0x93,0x21,0x43,0x93,0x20,0x44,0x92,0x20,0x45,0x92,0x20, 0x43,0x91,0x1f,0x42,0x92,0x20,0x43,0x93,0x20,0x41,0x92,0x1f,0x41,0x91,0x1e, 0x43,0x91,0x1f,0x82,0x44,0x92,0x20,0x82,0x43,0x91,0x1f,0x08,0x42,0x90,0x1e, 0x43,0x91,0x1f,0x42,0x90,0x1e,0x41,0x91,0x20,0x42,0x90,0x20,0x42,0x90,0x1e, 0x41,0x8f,0x1d,0x41,0x8e,0x1e,0x82,0x42,0x90,0x20,0x01,0x41,0x8f,0x1d,0x82, 0x41,0x8f,0x1f,0x01,0x41,0x8e,0x1e,0x83,0x41,0x8f,0x1f,0x82,0x40,0x8e,0x1e, 0x02,0x41,0x8f,0x20,0x40,0x8e,0x1e,0x82,0x40,0x8e,0x1d,0x82,0x40,0x8e,0x1e, 0x03,0x3e,0x8c,0x1d,0x3e,0x8b,0x1e,0x40,0x8e,0x1e,0x83,0x3f,0x8d,0x1d,0x05, 0x41,0x8e,0x1f,0x3f,0x8d,0x1d,0x41,0x8e,0x1f,0x3e,0x8c,0x1d,0x40,0x8e,0x1e, 0x83,0x3f,0x8d,0x1d,0x82,0x40,0x8e,0x1e,0x82,0x3f,0x8d,0x1d,0x82,0x3e,0x8c, 0x1d,0x0b,0x3f,0x8b,0x1d,0x3e,0x8c,0x1c,0x3f,0x8d,0x1d,0x3e,0x8c,0x1c,0x3f, 0x8d,0x1d,0x40,0x8e,0x1c,0x3e,0x8c,0x1c,0x3f,0x8d,0x1d,0x3e,0x8b,0x1b,0x3f, 0x8d,0x1b,0x3d,0x8d,0x1a,0x82,0x3f,0x8d,0x1b,0x17,0x40,0x8e,0x1c,0x40,0x92, 0x1b,0x3e,0x8e,0x1a,0x3f,0x8f,0x1d,0x3e,0x8e,0x1b,0x3f,0x8f,0x1b,0x3e,0x90, 0x1d,0x3f,0x91,0x1d,0x40,0x92,0x1d,0x3f,0x8f,0x1b,0x3e,0x8e,0x1c,0x40,0x90, 0x1d,0x3e,0x8e,0x1b,0x3e,0x8e,0x1c,0x40,0x90,0x1c,0x3e,0x8e,0x1b,0x3f,0x8f, 0x1b,0x3e,0x8e,0x1c,0x3f,0x8d,0x1b,0x3f,0x8d,0x1d,0x3e,0x8c,0x1c,0x3f,0x8d, 0x1d,0x3e,0x8c,0x1c,0x82,0x40,0x8e,0x1d,0x01,0x3f,0x8d,0x1d,0x82,0x3e,0x8b, 0x1b,0x01,0x41,0x8e,0x1e,0x82,0x3e,0x8c,0x1a,0x0c,0x40,0x8e,0x1c,0x3f,0x8d, 0x1b,0x3f,0x8d,0x1d,0x3e,0x8c,0x1c,0x3e,0x8b,0x1b,0x3e,0x8b,0x1c,0x3a,0x86, 0x19,0x3e,0x8a,0x1b,0x3e,0x8b,0x1b,0x3d,0x89,0x1c,0x3e,0x89,0x19,0x3c,0x86, 0x18,0x82,0x3a,0x83,0x17,0x0a,0x3a,0x84,0x19,0x3a,0x83,0x19,0x3d,0x87,0x1c, 0x3a,0x83,0x1b,0x3d,0x87,0x1c,0x3b,0x85,0x1a,0x33,0x7c,0x13,0x28,0x70,0x0e, 0x20,0x66,0x07,0x20,0x66,0x08,0x82,0x21,0x68,0x07,0x03,0x23,0x69,0x0a,0x20, 0x66,0x08,0x20,0x66,0x07,0x82,0x20,0x66,0x08,0x04,0x1e,0x64,0x06,0x1f,0x65, 0x08,0x1d,0x63,0x07,0x1e,0x64,0x07,0x82,0x1d,0x63,0x07,0x82,0x1e,0x64,0x07, 0x83,0x1d,0x62,0x04,0x01,0x1d,0x62,0x05,0x82,0x1c,0x61,0x03,0x82,0x1d,0x61, 0x04,0x02,0x1c,0x60,0x05,0x1b,0x5f,0x04,0x82,0x19,0x5d,0x04,0x03,0x19,0x5b, 0x03,0x18,0x5b,0x03,0x16,0x5a,0x02,0x82,0x18,0x5b,0x03,0x04,0x19,0x57,0x02, 0x19,0x5a,0x03,0x18,0x59,0x04,0x17,0x57,0x03,0x82,0x18,0x58,0x03,0x82,0x17, 0x57,0x02,0x03,0x16,0x57,0x03,0x16,0x56,0x03,0x18,0x57,0x05,0x82,0x16,0x56, 0x03,0x07,0x16,0x55,0x03,0x17,0x56,0x04,0x19,0x56,0x05,0x19,0x54,0x03,0x16, 0x56,0x03,0x16,0x54,0x03,0x16,0x54,0x04,0x84,0x16,0x54,0x03,0x16,0x15,0x54, 0x03,0x16,0x54,0x03,0x17,0x54,0x03,0x18,0x53,0x03,0x17,0x54,0x05,0x16,0x52, 0x04,0x16,0x52,0x03,0x17,0x51,0x03,0x15,0x52,0x04,0x16,0x52,0x03,0x15,0x53, 0x03,0x16,0x51,0x04,0x16,0x52,0x05,0x16,0x51,0x03,0x15,0x51,0x03,0x15,0x50, 0x02,0x16,0x50,0x03,0x15,0x50,0x03,0x17,0x51,0x04,0x15,0x50,0x03,0x15,0x50, 0x04,0x15,0x4f,0x04,0x82,0x15,0x4e,0x03,0x04,0x14,0x4d,0x02,0x15,0x4e,0x03, 0x15,0x4e,0x04,0x15,0x4e,0x02,0x82,0x15,0x4d,0x03,0x03,0x15,0x4e,0x03,0x15, 0x4d,0x05,0x15,0x4d,0x03,0x83,0x15,0x4c,0x03,0x03,0x14,0x4b,0x03,0x15,0x4a, 0x03,0x15,0x4c,0x05,0x82,0x15,0x4b,0x03,0x82,0x14,0x4a,0x03,0x05,0x15,0x4b, 0x03,0x15,0x4a,0x05,0x14,0x4b,0x03,0x14,0x49,0x04,0x15,0x49,0x03,0x83,0x14, 0x49,0x03,0x83,0x13,0x49,0x03,0x83,0x13,0x47,0x03,0x02,0x12,0x46,0x02,0x14, 0x47,0x02,0x82,0x13,0x46,0x03,0x83,0x13,0x45,0x03,0x0b,0x12,0x45,0x03,0x12, 0x44,0x01,0x12,0x44,0x02,0x12,0x45,0x03,0x13,0x45,0x03,0x12,0x44,0x02,0x12, 0x44,0x03,0x12,0x43,0x03,0x12,0x42,0x02,0x12,0x43,0x03,0x12,0x42,0x03,0x82, 0x12,0x43,0x03,0x82,0x12,0x41,0x02,0x06,0x12,0x42,0x03,0x11,0x41,0x03,0x12, 0x41,0x03,0x11,0x40,0x03,0x12,0x41,0x03,0x10,0x3f,0x03,0x83,0x11,0x3f,0x03, 0x04,0x12,0x40,0x04,0x11,0x3f,0x03,0x10,0x3e,0x03,0x11,0x3e,0x03,0x83,0x10, 0x3e,0x03,0x06,0x12,0x3d,0x03,0x12,0x3c,0x03,0x11,0x3c,0x03,0x10,0x3d,0x03, 0x11,0x3d,0x03,0x10,0x3d,0x02,0x83,0x10,0x3c,0x03,0x0c,0x0f,0x3b,0x03,0x10, 0x3a,0x03,0x10,0x3b,0x03,0x0f,0x3a,0x02,0x0f,0x3a,0x01,0x10,0x3c,0x03,0x0f, 0x3a,0x02,0x0f,0x3a,0x03,0x11,0x39,0x03,0x10,0x3a,0x03,0x0f,0x39,0x03,0x0e, 0x38,0x02,0x82,0x0e,0x38,0x03,0x01,0x0e,0x38,0x02,0x82,0x0f,0x38,0x03,0x04, 0x0e,0x37,0x03,0x10,0x36,0x02,0x0e,0x37,0x02,0x0e,0x36,0x03,0x84,0x0e,0x36, 0x02,0x03,0x0e,0x35,0x01,0x0e,0x34,0x02,0x0e,0x35,0x02,0x83,0x0e,0x34,0x02, 0x83,0x0e,0x33,0x02,0x02,0x0e,0x33,0x03,0x0c,0x32,0x02,0x83,0x0d,0x32,0x02, 0x02,0x0d,0x31,0x02,0x0d,0x32,0x02,0x83,0x0d,0x31,0x02,0x84,0x0d,0x30,0x02, 0x83,0x0c,0x2f,0x02,0x07,0x0b,0x2e,0x00,0x0c,0x2f,0x02,0x0c,0x2e,0x02,0x0c, 0x2e,0x01,0x0c,0x2f,0x01,0x0b,0x2d,0x01,0x0b,0x2e,0x02,0x82,0x0b,0x2d,0x01, 0x01,0x0c,0x2c,0x02,0x82,0x0c,0x2b,0x01,0x03,0x0b,0x2b,0x01,0x0a,0x2b,0x00, 0x0b,0x2b,0x01,0x84,0x0a,0x2b,0x01,0x08,0x0a,0x2a,0x01,0x0a,0x29,0x01,0x0a, 0x2a,0x01,0x0a,0x29,0x01,0x0a,0x28,0x01,0x0a,0x28,0x02,0x0a,0x28,0x01,0x0a, 0x28,0x02,0x82,0x0a,0x28,0x01,0x03,0x0a,0x27,0x01,0x09,0x27,0x01,0x0a,0x27, 0x01,0x83,0x0a,0x26,0x01,0x01,0x0a,0x25,0x01,0x82,0x09,0x25,0x01,0x02,0x09, 0x24,0x01,0x09,0x24,0x00,0x83,0x09,0x24,0x01,0x08,0x0a,0x24,0x01,0x09,0x24, 0x00,0x08,0x23,0x00,0x09,0x23,0x00,0x09,0x22,0x01,0x08,0x22,0x01,0x09,0x22, 0x01,0x08,0x21,0x00,0x82,0x08,0x21,0x01,0x82,0x07,0x20,0x00,0x02,0x08,0x20, 0x01,0x08,0x20,0x00,0x83,0x07,0x20,0x00,0x82,0x07,0x1f,0x00,0x82,0x07,0x1e, 0x00,0x85,0x07,0x1d,0x00,0x03,0x07,0x1d,0x01,0x06,0x1d,0x00,0x06,0x1c,0x00, 0x82,0x07,0x1c,0x00,0x02,0x06,0x1c,0x00,0x06,0x1b,0x00,0x84,0x06,0x1a,0x00, 0x86,0x06,0x19,0x00,0x03,0x05,0x19,0x00,0x06,0x19,0x00,0x06,0x18,0x00,0x82, 0x05,0x18,0x00,0x83,0x05,0x17,0x00,0x82,0x05,0x16,0x00,0x01,0x04,0x16,0x00, 0x82,0x05,0x16,0x00,0x86,0x04,0x15,0x00,0x85,0x04,0x14,0x00,0x83,0x04,0x13, 0x00,0x82,0x04,0x12,0x00,0x86,0x03,0x12,0x00,0x84,0x03,0x11,0x00,0x84,0x03, 0x10,0x00,0x82,0x03,0x0f,0x00,0x89,0x03,0x0e,0x00,0x82,0x02,0x0d,0x00,0x01, 0x03,0x0d,0x00,0x84,0x02,0x0c,0x00,0x86,0x02,0x0b,0x00,0x86,0x02,0x0a,0x00, 0x85,0x02,0x09,0x00,0x83,0x01,0x08,0x00,0x87,0x01,0x07,0x00,0x86,0x01,0x06, 0x00,0x01,0x01,0x07,0x00,0x82,0x02,0x07,0x00,0x03,0x03,0x07,0x01,0x02,0x06, 0x00,0x02,0x06,0x01,0x82,0x02,0x05,0x00,0x01,0x02,0x04,0x00,0x82,0x01,0x04, 0x00,0x83,0x01,0x03,0x00,0x01,0x00,0x03,0x00,0x82,0x00,0x02,0x00,0x82,0x00, 0x01,0x00,0xdc,0x00,0x00,0x00,0x03,0x49,0xa0,0x16,0x48,0x9f,0x15,0x48,0xa1, 0x16,0x82,0x48,0x9f,0x15,0x06,0x49,0xa0,0x16,0x49,0x9f,0x15,0x48,0x9f,0x16, 0x49,0xa0,0x16,0x49,0x9f,0x15,0x48,0x9f,0x14,0x83,0x48,0x9f,0x16,0x04,0x47, 0x9e,0x15,0x48,0x9e,0x16,0x48,0x9f,0x16,0x47,0x9e,0x13,0x83,0x48,0x9d,0x15, 0x03,0x49,0x9f,0x16,0x48,0x9e,0x14,0x48,0x9d,0x15,0x84,0x47,0x9e,0x15,0x07, 0x46,0x9d,0x14,0x47,0x9e,0x15,0x46,0x9d,0x14,0x47,0x9e,0x15,0x45,0x9e,0x15, 0x46,0x9d,0x14,0x47,0x9c,0x14,0x82,0x46,0x9c,0x15,0x05,0x45,0x9c,0x14,0x46, 0x9c,0x15,0x46,0x9d,0x14,0x45,0x9c,0x13,0x46,0x9c,0x15,0x83,0x44,0x9b,0x13, 0x08,0x45,0x9c,0x14,0x44,0x9b,0x15,0x45,0x9c,0x16,0x46,0x9b,0x16,0x44,0x99, 0x14,0x46,0x9b,0x16,0x45,0x9b,0x13,0x44,0x99,0x14,0x82,0x44,0x99,0x16,0x0f, 0x46,0x9c,0x14,0x44,0x98,0x16,0x44,0x9b,0x15,0x45,0x9a,0x15,0x44,0x9a,0x16, 0x44,0x99,0x16,0x45,0x98,0x17,0x43,0x98,0x16,0x44,0x99,0x16,0x44,0x98,0x16, 0x44,0x9a,0x18,0x44,0x99,0x17,0x44,0x98,0x16,0x44,0x98,0x18,0x45,0x98,0x18, 0x82,0x45,0x99,0x19,0x03,0x45,0x98,0x18,0x44,0x98,0x1a,0x44,0x98,0x18,0x83, 0x44,0x98,0x1a,0x04,0x44,0x97,0x19,0x45,0x98,0x1b,0x45,0x99,0x1a,0x44,0x98, 0x1a,0x82,0x44,0x98,0x1b,0x01,0x44,0x98,0x1a,0x82,0x44,0x97,0x1c,0x06,0x46, 0x96,0x1c,0x45,0x98,0x1b,0x46,0x98,0x1c,0x44,0x98,0x1d,0x44,0x97,0x1c,0x45, 0x97,0x1e,0x82,0x44,0x98,0x1e,0x03,0x44,0x97,0x1d,0x45,0x98,0x1e,0x44,0x98, 0x1e,0x82,0x45,0x97,0x1e,0x02,0x45,0x97,0x1f,0x45,0x98,0x20,0x82,0x44,0x98, 0x1f,0x01,0x45,0x97,0x1f,0x82,0x44,0x96,0x1e,0x12,0x45,0x94,0x1e,0x45,0x97, 0x1f,0x44,0x96,0x1e,0x45,0x97,0x1f,0x44,0x96,0x1e,0x44,0x95,0x1e,0x44,0x94, 0x1f,0x47,0x96,0x21,0x46,0x95,0x1e,0x45,0x94,0x1f,0x46,0x95,0x20,0x44,0x95, 0x20,0x44,0x94,0x21,0x44,0x94,0x1e,0x44,0x94,0x1f,0x44,0x95,0x20,0x45,0x94, 0x1f,0x45,0x96,0x21,0x82,0x44,0x94,0x1f,0x08,0x45,0x96,0x21,0x45,0x94,0x21, 0x44,0x94,0x1e,0x44,0x94,0x1f,0x44,0x94,0x21,0x44,0x95,0x22,0x46,0x95,0x20, 0x44,0x95,0x20,0x83,0x44,0x94,0x21,0x01,0x44,0x94,0x1f,0x82,0x44,0x95,0x20, 0x07,0x44,0x95,0x22,0x45,0x94,0x21,0x44,0x93,0x20,0x44,0x95,0x20,0x45,0x94, 0x1f,0x44,0x94,0x1e,0x44,0x93,0x20,0x83,0x43,0x94,0x20,0x0a,0x44,0x95,0x22, 0x44,0x94,0x21,0x45,0x94,0x21,0x45,0x94,0x1f,0x42,0x93,0x1e,0x43,0x94,0x1e, 0x45,0x94,0x1f,0x45,0x94,0x21,0x43,0x94,0x20,0x42,0x93,0x1f,0x83,0x44,0x93, 0x20,0x07,0x44,0x94,0x21,0x43,0x94,0x20,0x44,0x94,0x21,0x43,0x94,0x20,0x44, 0x92,0x1f,0x42,0x90,0x1e,0x44,0x93,0x20,0x83,0x44,0x92,0x1f,0x01,0x41,0x92, 0x20,0x82,0x40,0x91,0x1f,0x01,0x43,0x91,0x20,0x82,0x43,0x91,0x1e,0x82,0x42, 0x90,0x1f,0x82,0x41,0x90,0x1e,0x02,0x3f,0x8d,0x1d,0x43,0x91,0x20,0x82,0x41, 0x90,0x1e,0x06,0x40,0x8f,0x1e,0x41,0x90,0x1f,0x40,0x8f,0x1e,0x40,0x8e,0x1e, 0x41,0x90,0x1e,0x40,0x8f,0x1e,0x82,0x41,0x90,0x1e,0x0a,0x40,0x8f,0x1e,0x40, 0x8e,0x1e,0x3e,0x8c,0x1c,0x3f,0x8c,0x1e,0x41,0x90,0x1f,0x3f,0x8d,0x1d,0x40, 0x8e,0x1e,0x41,0x90,0x1e,0x40,0x8e,0x1d,0x40,0x8e,0x1e,0x83,0x3f,0x8d,0x1d, 0x0b,0x3e,0x8c,0x1c,0x3d,0x8c,0x1b,0x40,0x8e,0x1e,0x3f,0x8d,0x1d,0x3e,0x8c, 0x1c,0x3d,0x8c,0x1b,0x3f,0x8d,0x1d,0x3f,0x8d,0x1c,0x3c,0x8b,0x1a,0x3f,0x8d, 0x1d,0x3c,0x8a,0x1c,0x82,0x3f,0x8d,0x1c,0x03,0x3e,0x8c,0x1b,0x3d,0x8c,0x1b, 0x3f,0x8d,0x1c,0x82,0x3e,0x8c,0x1b,0x03,0x3d,0x8e,0x1c,0x3f,0x90,0x1c,0x40, 0x90,0x1d,0x82,0x40,0x8e,0x1b,0x18,0x3f,0x91,0x1b,0x3f,0x90,0x1c,0x40,0x90, 0x1d,0x3d,0x8e,0x1a,0x40,0x92,0x1a,0x43,0x96,0x1c,0x41,0x94,0x1c,0x3f,0x91, 0x1d,0x3f,0x90,0x1a,0x40,0x90,0x1d,0x40,0x91,0x1c,0x40,0x90,0x1d,0x40,0x90, 0x1a,0x40,0x90,0x1b,0x41,0x92,0x1e,0x40,0x90,0x1b,0x40,0x90,0x1d,0x3d,0x8e, 0x1c,0x3d,0x8c,0x1b,0x40,0x8e,0x1e,0x40,0x8e,0x1d,0x40,0x8e,0x1b,0x40,0x90, 0x1d,0x3e,0x8f,0x1b,0x84,0x41,0x90,0x1d,0x11,0x40,0x8f,0x1c,0x43,0x91,0x20, 0x3e,0x8c,0x1b,0x3f,0x8d,0x1d,0x40,0x8e,0x1d,0x3e,0x8c,0x1b,0x3f,0x8d,0x1a, 0x3f,0x8c,0x1c,0x3c,0x88,0x1c,0x3a,0x89,0x18,0x3c,0x8a,0x19,0x3b,0x87,0x1b, 0x3d,0x8a,0x1a,0x3c,0x88,0x1c,0x3c,0x87,0x1a,0x3c,0x87,0x18,0x39,0x84,0x18, 0x82,0x3c,0x86,0x19,0x01,0x38,0x81,0x18,0x82,0x3a,0x85,0x19,0x04,0x3b,0x85, 0x1a,0x3d,0x88,0x1c,0x35,0x7f,0x16,0x29,0x72,0x0e,0x82,0x22,0x69,0x07,0x82, 0x21,0x67,0x08,0x82,0x22,0x68,0x09,0x01,0x21,0x67,0x08,0x82,0x20,0x66,0x07, 0x03,0x1e,0x66,0x07,0x1e,0x65,0x07,0x1e,0x64,0x07,0x83,0x1e,0x65,0x07,0x83, 0x1e,0x64,0x05,0x0b,0x1c,0x63,0x04,0x1d,0x64,0x05,0x1e,0x63,0x05,0x1d,0x62, 0x04,0x1e,0x63,0x05,0x1b,0x60,0x03,0x1a,0x5f,0x03,0x1b,0x5e,0x05,0x19,0x5e, 0x04,0x18,0x5d,0x03,0x18,0x5b,0x03,0x82,0x18,0x5c,0x03,0x02,0x18,0x5a,0x03, 0x19,0x5b,0x03,0x82,0x18,0x5a,0x04,0x0a,0x16,0x57,0x03,0x17,0x58,0x03,0x18, 0x59,0x04,0x17,0x57,0x03,0x17,0x58,0x04,0x18,0x59,0x05,0x16,0x57,0x03,0x16, 0x56,0x03,0x17,0x55,0x03,0x16,0x57,0x03,0x82,0x16,0x56,0x03,0x03,0x18,0x55, 0x03,0x18,0x54,0x03,0x16,0x56,0x04,0x82,0x16,0x54,0x03,0x04,0x16,0x54,0x02, 0x15,0x53,0x01,0x16,0x54,0x02,0x15,0x53,0x03,0x82,0x16,0x54,0x04,0x0e,0x16, 0x53,0x02,0x18,0x54,0x02,0x18,0x53,0x03,0x16,0x53,0x04,0x16,0x53,0x01,0x17, 0x52,0x03,0x16,0x51,0x03,0x16,0x53,0x03,0x16,0x52,0x03,0x16,0x50,0x03,0x16, 0x51,0x04,0x16,0x4f,0x02,0x16,0x52,0x03,0x17,0x50,0x03,0x83,0x16,0x52,0x03, 0x08,0x15,0x4f,0x03,0x16,0x50,0x04,0x16,0x4f,0x03,0x15,0x50,0x03,0x16,0x51, 0x03,0x14,0x4f,0x03,0x16,0x4f,0x03,0x15,0x4e,0x03,0x82,0x16,0x4f,0x03,0x01, 0x15,0x4f,0x03,0x82,0x14,0x4e,0x03,0x82,0x16,0x4e,0x03,0x01,0x14,0x4d,0x03, 0x82,0x16,0x4d,0x03,0x02,0x13,0x4b,0x02,0x16,0x4c,0x03,0x82,0x15,0x4c,0x03, 0x0f,0x14,0x4c,0x03,0x14,0x4b,0x04,0x14,0x4c,0x02,0x15,0x4b,0x05,0x13,0x4c, 0x03,0x13,0x48,0x04,0x13,0x4a,0x02,0x15,0x49,0x03,0x14,0x49,0x04,0x14,0x4a, 0x03,0x14,0x4b,0x04,0x14,0x4a,0x03,0x13,0x49,0x03,0x13,0x48,0x03,0x13,0x47, 0x02,0x82,0x13,0x48,0x03,0x07,0x14,0x48,0x02,0x14,0x48,0x03,0x13,0x47,0x03, 0x13,0x47,0x04,0x14,0x48,0x03,0x13,0x46,0x03,0x13,0x45,0x03,0x82,0x13,0x46, 0x03,0x0d,0x13,0x45,0x03,0x13,0x44,0x03,0x12,0x45,0x03,0x13,0x45,0x03,0x12, 0x44,0x03,0x12,0x43,0x02,0x12,0x44,0x03,0x11,0x43,0x01,0x13,0x43,0x03,0x12, 0x44,0x03,0x11,0x43,0x02,0x11,0x44,0x03,0x13,0x43,0x03,0x82,0x11,0x42,0x03, 0x01,0x12,0x41,0x03,0x83,0x11,0x41,0x03,0x01,0x11,0x40,0x03,0x83,0x10,0x40, 0x02,0x01,0x12,0x3d,0x03,0x82,0x11,0x3f,0x03,0x04,0x12,0x3d,0x03,0x0f,0x3d, 0x02,0x10,0x3d,0x02,0x12,0x3c,0x03,0x82,0x11,0x3c,0x02,0x02,0x0f,0x3c,0x02, 0x10,0x3d,0x02,0x82,0x0f,0x3c,0x03,0x01,0x10,0x3c,0x03,0x82,0x0f,0x3c,0x03, 0x04,0x11,0x3a,0x03,0x10,0x3c,0x03,0x0f,0x3c,0x02,0x0f,0x3b,0x02,0x83,0x0f, 0x3a,0x02,0x01,0x10,0x39,0x02,0x84,0x0f,0x39,0x03,0x02,0x0f,0x39,0x02,0x0f, 0x39,0x03,0x82,0x0f,0x38,0x03,0x03,0x0f,0x37,0x01,0x10,0x37,0x02,0x0f,0x37, 0x03,0x82,0x0f,0x36,0x03,0x15,0x0f,0x36,0x02,0x0f,0x37,0x03,0x0f,0x36,0x02, 0x0e,0x35,0x03,0x0e,0x35,0x02,0x0e,0x35,0x01,0x0f,0x35,0x03,0x0d,0x34,0x01, 0x0d,0x34,0x02,0x0e,0x34,0x02,0x0e,0x34,0x01,0x0d,0x32,0x02,0x0c,0x32,0x02, 0x0f,0x32,0x03,0x0c,0x32,0x01,0x0c,0x32,0x02,0x0c,0x31,0x01,0x0d,0x32,0x02, 0x0d,0x31,0x02,0x0e,0x31,0x02,0x0d,0x31,0x02,0x82,0x0c,0x31,0x02,0x82,0x0c, 0x30,0x02,0x82,0x0b,0x2f,0x02,0x08,0x0c,0x30,0x02,0x0d,0x2e,0x01,0x0d,0x2e, 0x02,0x0c,0x2f,0x02,0x0d,0x2e,0x01,0x0b,0x2e,0x01,0x0b,0x2d,0x01,0x0c,0x2e, 0x02,0x83,0x0b,0x2d,0x01,0x01,0x0c,0x2c,0x01,0x84,0x0b,0x2c,0x01,0x06,0x0b, 0x2a,0x00,0x0b,0x2c,0x02,0x0b,0x2b,0x01,0x0b,0x2a,0x01,0x0b,0x2b,0x02,0x0b, 0x2a,0x01,0x82,0x0b,0x29,0x01,0x01,0x0a,0x29,0x00,0x82,0x0a,0x29,0x01,0x0f, 0x0b,0x28,0x01,0x0b,0x28,0x02,0x0b,0x28,0x01,0x0a,0x27,0x01,0x0a,0x28,0x02, 0x0a,0x28,0x01,0x0b,0x27,0x01,0x0a,0x27,0x01,0x0a,0x26,0x01,0x0a,0x26,0x00, 0x09,0x26,0x01,0x0b,0x26,0x01,0x0a,0x25,0x01,0x08,0x25,0x00,0x09,0x26,0x01, 0x82,0x09,0x25,0x01,0x0b,0x09,0x24,0x00,0x08,0x24,0x00,0x09,0x24,0x01,0x09, 0x23,0x00,0x0a,0x24,0x01,0x08,0x22,0x00,0x08,0x22,0x01,0x08,0x21,0x01,0x09, 0x21,0x02,0x08,0x22,0x01,0x07,0x21,0x00,0x82,0x08,0x21,0x00,0x01,0x07,0x21, 0x00,0x82,0x07,0x20,0x00,0x82,0x07,0x20,0x01,0x01,0x07,0x1f,0x01,0x85,0x07, 0x1e,0x00,0x82,0x07,0x1d,0x00,0x02,0x07,0x1e,0x01,0x06,0x1d,0x00,0x83,0x07, 0x1c,0x00,0x02,0x07,0x1c,0x01,0x07,0x1b,0x00,0x89,0x06,0x1a,0x00,0x02,0x05, 0x1a,0x00,0x05,0x19,0x00,0x82,0x06,0x19,0x00,0x01,0x06,0x18,0x00,0x82,0x05, 0x18,0x00,0x83,0x05,0x17,0x00,0x85,0x05,0x16,0x00,0x01,0x04,0x16,0x00,0x85, 0x04,0x15,0x00,0x85,0x04,0x14,0x00,0x82,0x04,0x13,0x00,0x01,0x03,0x13,0x00, 0x82,0x04,0x13,0x00,0x02,0x03,0x12,0x00,0x04,0x12,0x00,0x82,0x03,0x12,0x00, 0x85,0x03,0x11,0x00,0x84,0x03,0x10,0x00,0x87,0x03,0x0f,0x00,0x84,0x03,0x0e, 0x00,0x82,0x02,0x0d,0x00,0x01,0x03,0x0d,0x00,0x84,0x02,0x0c,0x00,0x88,0x02, 0x0b,0x00,0x82,0x02,0x0a,0x00,0x01,0x01,0x0a,0x00,0x82,0x02,0x0a,0x00,0x82, 0x02,0x09,0x00,0x85,0x01,0x08,0x00,0x87,0x01,0x07,0x00,0x84,0x01,0x06,0x00, 0x82,0x00,0x05,0x00,0x01,0x01,0x05,0x00,0x82,0x01,0x06,0x00,0x83,0x02,0x06, 0x00,0x04,0x02,0x05,0x01,0x02,0x05,0x00,0x02,0x04,0x00,0x01,0x04,0x00,0x84, 0x01,0x03,0x00,0x01,0x00,0x03,0x00,0x82,0x00,0x02,0x00,0x82,0x00,0x01,0x00, 0xdc,0x00,0x00,0x00,0x05,0x4b,0xa1,0x16,0x48,0xa2,0x16,0x47,0xa2,0x15,0x4a, 0xa0,0x17,0x49,0x9f,0x16,0x82,0x47,0xa1,0x17,0x1d,0x49,0x9f,0x14,0x49,0x9f, 0x16,0x49,0xa1,0x17,0x48,0xa0,0x16,0x48,0x9e,0x16,0x48,0x9e,0x15,0x47,0x9f, 0x15,0x48,0xa0,0x14,0x4a,0xa0,0x17,0x47,0x9e,0x15,0x48,0x9f,0x17,0x46,0x9f, 0x15,0x47,0xa0,0x16,0x47,0x9f,0x15,0x47,0x9e,0x14,0x47,0x9e,0x15,0x47,0x9e, 0x16,0x48,0xa0,0x14,0x46,0x9d,0x14,0x47,0x9e,0x14,0x46,0x9e,0x13,0x47,0x9d, 0x14,0x48,0x9e,0x16,0x46,0x9e,0x13,0x45,0x9e,0x15,0x47,0x9e,0x14,0x46,0x9e, 0x13,0x45,0x9d,0x13,0x47,0x9e,0x15,0x82,0x45,0x9c,0x13,0x02,0x46,0x9d,0x14, 0x47,0x9e,0x16,0x82,0x45,0x9c,0x13,0x03,0x44,0x9b,0x13,0x45,0x9c,0x13,0x44, 0x9b,0x13,0x83,0x44,0x9b,0x14,0x11,0x43,0x9a,0x12,0x45,0x9a,0x14,0x46,0x9c, 0x13,0x46,0x9b,0x15,0x45,0x9a,0x14,0x44,0x9a,0x13,0x43,0x99,0x16,0x43,0x99, 0x14,0x44,0x9a,0x17,0x43,0x9a,0x15,0x45,0x9a,0x16,0x45,0x9a,0x17,0x44,0x9a, 0x17,0x43,0x99,0x14,0x45,0x9a,0x16,0x44,0x98,0x16,0x42,0x9a,0x17,0x82,0x44, 0x9a,0x17,0x12,0x44,0x99,0x17,0x45,0x99,0x17,0x46,0x97,0x17,0x43,0x99,0x17, 0x45,0x9a,0x18,0x44,0x9a,0x1a,0x44,0x99,0x17,0x43,0x98,0x17,0x44,0x99,0x19, 0x45,0x98,0x1b,0x43,0x96,0x19,0x43,0x98,0x1a,0x46,0x99,0x1a,0x45,0x9a,0x1b, 0x47,0x9a,0x1b,0x44,0x97,0x1a,0x44,0x98,0x1c,0x44,0x99,0x1b,0x82,0x44,0x98, 0x1c,0x03,0x45,0x9a,0x1b,0x45,0x97,0x1d,0x43,0x97,0x1b,0x82,0x45,0x99,0x1d, 0x05,0x44,0x98,0x1d,0x45,0x97,0x1d,0x47,0x99,0x1f,0x45,0x97,0x1d,0x44,0x98, 0x1d,0x82,0x45,0x97,0x1d,0x06,0x44,0x96,0x1c,0x46,0x96,0x1e,0x47,0x97,0x1f, 0x45,0x97,0x1f,0x44,0x97,0x20,0x45,0x97,0x1f,0x84,0x44,0x96,0x1f,0x01,0x45, 0x96,0x20,0x83,0x44,0x96,0x1f,0x02,0x43,0x95,0x1f,0x46,0x96,0x1f,0x83,0x44, 0x96,0x1f,0x82,0x43,0x96,0x1f,0x01,0x44,0x96,0x1f,0x82,0x43,0x95,0x1f,0x06, 0x44,0x96,0x1f,0x45,0x95,0x1f,0x46,0x96,0x1f,0x44,0x96,0x1f,0x43,0x95,0x1f, 0x45,0x95,0x1f,0x82,0x43,0x94,0x1e,0x02,0x43,0x95,0x20,0x43,0x94,0x1f,0x83, 0x43,0x95,0x20,0x03,0x44,0x93,0x1f,0x43,0x95,0x20,0x44,0x96,0x21,0x82,0x43, 0x95,0x1f,0x82,0x44,0x96,0x1f,0x02,0x43,0x94,0x1f,0x43,0x95,0x1f,0x83,0x43, 0x95,0x20,0x83,0x44,0x96,0x1f,0x03,0x43,0x95,0x20,0x43,0x94,0x1f,0x43,0x95, 0x20,0x82,0x45,0x94,0x20,0x04,0x44,0x93,0x1f,0x46,0x95,0x21,0x45,0x94,0x20, 0x43,0x95,0x20,0x82,0x43,0x95,0x1f,0x03,0x43,0x95,0x20,0x43,0x94,0x1f,0x43, 0x92,0x1e,0x82,0x44,0x93,0x1f,0x04,0x43,0x92,0x1f,0x42,0x93,0x1f,0x43,0x92, 0x1e,0x43,0x92,0x1f,0x82,0x44,0x93,0x1f,0x01,0x43,0x92,0x1e,0x82,0x41,0x92, 0x1e,0x08,0x43,0x92,0x20,0x43,0x92,0x1f,0x43,0x92,0x20,0x43,0x92,0x1f,0x41, 0x90,0x1e,0x42,0x91,0x1f,0x43,0x92,0x1f,0x41,0x92,0x1e,0x82,0x41,0x90,0x1e, 0x03,0x43,0x92,0x1f,0x43,0x90,0x1f,0x3f,0x8e,0x1c,0x82,0x42,0x91,0x1f,0x05, 0x41,0x90,0x1e,0x40,0x8f,0x1d,0x41,0x90,0x1e,0x3f,0x8e,0x1c,0x43,0x92,0x1f, 0x82,0x3f,0x8e,0x1c,0x06,0x43,0x92,0x1f,0x3f,0x8e,0x1c,0x3f,0x8f,0x1e,0x41, 0x90,0x1f,0x3f,0x8e,0x1d,0x3f,0x8e,0x1c,0x83,0x3f,0x8d,0x1c,0x01,0x40,0x8f, 0x1e,0x82,0x3f,0x8e,0x1c,0x01,0x3f,0x8e,0x1d,0x83,0x3f,0x8e,0x1c,0x0e,0x40, 0x8e,0x1d,0x3e,0x8b,0x1b,0x3f,0x8e,0x1c,0x3e,0x8d,0x1b,0x3c,0x8a,0x1b,0x40, 0x8e,0x1f,0x3f,0x8e,0x1c,0x3c,0x8b,0x1a,0x40,0x8f,0x1d,0x3f,0x8e,0x1b,0x3e, 0x8d,0x1b,0x3f,0x8e,0x1c,0x3c,0x8e,0x1b,0x3e,0x8f,0x1b,0x82,0x3f,0x90,0x1b, 0x0f,0x3e,0x8f,0x1b,0x40,0x92,0x1b,0x40,0x92,0x1a,0x3f,0x91,0x1b,0x3f,0x92, 0x1b,0x3e,0x91,0x1b,0x41,0x94,0x1d,0x41,0x95,0x1b,0x3f,0x92,0x1b,0x41,0x93, 0x1b,0x41,0x92,0x1e,0x3f,0x90,0x1b,0x3f,0x91,0x1c,0x40,0x92,0x1d,0x3e,0x8f, 0x1b,0x83,0x3f,0x91,0x1c,0x01,0x42,0x91,0x1d,0x82,0x41,0x90,0x1e,0x06,0x3f, 0x8e,0x1b,0x3e,0x8d,0x1b,0x40,0x8f,0x1e,0x41,0x90,0x1f,0x3f,0x90,0x1d,0x41, 0x92,0x1e,0x82,0x40,0x92,0x1d,0x02,0x42,0x91,0x1d,0x43,0x92,0x1f,0x82,0x41, 0x90,0x1e,0x01,0x3f,0x8e,0x1b,0x82,0x3e,0x8d,0x1b,0x10,0x3c,0x8d,0x1b,0x3d, 0x8c,0x1b,0x3f,0x8c,0x1b,0x3d,0x88,0x1a,0x3c,0x8a,0x1b,0x3b,0x89,0x1a,0x3b, 0x88,0x19,0x3b,0x89,0x1a,0x3c,0x8a,0x19,0x3b,0x88,0x19,0x3c,0x87,0x19,0x3b, 0x85,0x1b,0x3b,0x86,0x18,0x3b,0x86,0x17,0x39,0x86,0x19,0x3a,0x85,0x18,0x82, 0x39,0x83,0x19,0x06,0x3d,0x88,0x1b,0x3a,0x84,0x1a,0x36,0x80,0x17,0x2c,0x77, 0x0f,0x25,0x6c,0x0c,0x1f,0x67,0x07,0x82,0x22,0x69,0x09,0x0f,0x23,0x6b,0x08, 0x20,0x68,0x06,0x1f,0x67,0x07,0x21,0x68,0x08,0x21,0x69,0x06,0x20,0x67,0x07, 0x1f,0x67,0x07,0x1f,0x67,0x08,0x1f,0x66,0x07,0x1e,0x65,0x05,0x1f,0x66,0x06, 0x1f,0x67,0x04,0x1d,0x65,0x05,0x1d,0x65,0x07,0x1f,0x66,0x04,0x82,0x1d,0x63, 0x04,0x06,0x1c,0x62,0x03,0x1b,0x5f,0x05,0x1b,0x60,0x04,0x1b,0x5f,0x04,0x19, 0x5d,0x02,0x19,0x5e,0x04,0x82,0x17,0x5c,0x03,0x02,0x18,0x5c,0x03,0x19,0x5b, 0x03,0x82,0x18,0x5b,0x03,0x01,0x18,0x5a,0x03,0x82,0x17,0x59,0x02,0x03,0x17, 0x57,0x01,0x17,0x58,0x02,0x17,0x58,0x03,0x82,0x17,0x57,0x03,0x0d,0x16,0x56, 0x03,0x16,0x57,0x03,0x17,0x57,0x02,0x17,0x57,0x03,0x17,0x57,0x02,0x17,0x57, 0x03,0x17,0x57,0x04,0x17,0x56,0x03,0x16,0x55,0x01,0x16,0x54,0x03,0x16,0x54, 0x04,0x15,0x53,0x03,0x16,0x54,0x03,0x82,0x17,0x55,0x04,0x04,0x16,0x53,0x02, 0x17,0x54,0x03,0x17,0x55,0x03,0x17,0x53,0x03,0x82,0x17,0x54,0x03,0x0b,0x16, 0x53,0x03,0x16,0x54,0x03,0x16,0x53,0x03,0x15,0x52,0x02,0x16,0x52,0x04,0x17, 0x53,0x04,0x16,0x53,0x04,0x14,0x51,0x02,0x16,0x51,0x03,0x16,0x52,0x02,0x16, 0x51,0x02,0x82,0x16,0x51,0x03,0x05,0x16,0x52,0x03,0x16,0x53,0x03,0x15,0x51, 0x02,0x16,0x50,0x02,0x17,0x4f,0x03,0x82,0x16,0x4f,0x03,0x82,0x15,0x4f,0x03, 0x05,0x15,0x51,0x04,0x14,0x4f,0x03,0x14,0x50,0x03,0x14,0x4f,0x02,0x15,0x4e, 0x02,0x82,0x15,0x4d,0x03,0x08,0x14,0x4d,0x03,0x14,0x4c,0x04,0x14,0x4d,0x03, 0x15,0x4e,0x03,0x14,0x4c,0x02,0x14,0x4b,0x02,0x14,0x4b,0x03,0x14,0x4c,0x03, 0x82,0x13,0x4b,0x03,0x82,0x14,0x4b,0x03,0x02,0x13,0x4a,0x02,0x14,0x4a,0x03, 0x82,0x14,0x49,0x03,0x03,0x13,0x48,0x02,0x14,0x47,0x02,0x13,0x47,0x02,0x82, 0x13,0x48,0x03,0x82,0x13,0x47,0x03,0x01,0x13,0x47,0x04,0x86,0x13,0x47,0x03, 0x02,0x13,0x45,0x03,0x12,0x45,0x03,0x83,0x13,0x45,0x03,0x04,0x12,0x45,0x03, 0x12,0x44,0x03,0x11,0x45,0x03,0x13,0x45,0x03,0x82,0x12,0x43,0x03,0x08,0x12, 0x44,0x03,0x12,0x43,0x03,0x12,0x43,0x04,0x12,0x42,0x03,0x11,0x43,0x03,0x11, 0x41,0x02,0x12,0x41,0x03,0x12,0x42,0x03,0x82,0x11,0x41,0x03,0x0a,0x11,0x40, 0x02,0x13,0x3f,0x03,0x11,0x40,0x03,0x11,0x3f,0x03,0x10,0x3f,0x03,0x11,0x3f, 0x03,0x10,0x3e,0x01,0x10,0x3e,0x02,0x11,0x3f,0x03,0x10,0x3e,0x03,0x82,0x0f, 0x3d,0x02,0x04,0x10,0x3e,0x03,0x11,0x3c,0x03,0x10,0x3c,0x02,0x0f,0x3d,0x02, 0x82,0x0f,0x3b,0x02,0x06,0x0f,0x3b,0x03,0x10,0x3c,0x03,0x0f,0x3b,0x01,0x10, 0x3b,0x02,0x10,0x3a,0x02,0x0f,0x3b,0x02,0x83,0x0f,0x3b,0x03,0x07,0x0f,0x39, 0x03,0x0f,0x39,0x02,0x0f,0x3a,0x02,0x0f,0x38,0x02,0x0f,0x38,0x03,0x0f,0x39, 0x02,0x0f,0x37,0x01,0x82,0x0f,0x38,0x03,0x82,0x0f,0x37,0x03,0x13,0x0e,0x37, 0x03,0x0e,0x37,0x01,0x0f,0x37,0x01,0x0f,0x36,0x00,0x0f,0x36,0x02,0x0e,0x36, 0x01,0x0d,0x35,0x02,0x0e,0x35,0x02,0x0d,0x35,0x02,0x0d,0x34,0x02,0x0e,0x34, 0x02,0x0e,0x34,0x03,0x0d,0x33,0x02,0x0f,0x33,0x02,0x0d,0x33,0x02,0x0d,0x33, 0x03,0x0e,0x32,0x02,0x0c,0x31,0x01,0x0b,0x32,0x01,0x82,0x0d,0x32,0x02,0x02, 0x0c,0x30,0x02,0x0c,0x31,0x02,0x82,0x0c,0x30,0x02,0x09,0x0c,0x31,0x02,0x0b, 0x30,0x02,0x0c,0x31,0x03,0x0c,0x30,0x01,0x0c,0x2f,0x02,0x0c,0x2f,0x01,0x0c, 0x2f,0x02,0x0b,0x2f,0x01,0x0c,0x2f,0x02,0x82,0x0b,0x2e,0x01,0x05,0x0c,0x2f, 0x02,0x0c,0x2d,0x01,0x0b,0x2d,0x01,0x0b,0x2e,0x01,0x0b,0x2d,0x00,0x82,0x0b, 0x2d,0x01,0x02,0x0c,0x2b,0x00,0x0b,0x2c,0x02,0x84,0x0b,0x2b,0x01,0x07,0x0b, 0x2a,0x01,0x0a,0x2a,0x00,0x0b,0x2a,0x01,0x0a,0x2a,0x01,0x0b,0x2a,0x01,0x0b, 0x29,0x01,0x0a,0x29,0x01,0x84,0x0a,0x28,0x01,0x02,0x0a,0x27,0x01,0x0b,0x27, 0x01,0x83,0x0a,0x27,0x01,0x01,0x09,0x25,0x00,0x82,0x0a,0x26,0x01,0x0a,0x09, 0x25,0x01,0x0a,0x25,0x01,0x09,0x24,0x01,0x08,0x24,0x00,0x09,0x24,0x00,0x08, 0x24,0x00,0x08,0x23,0x00,0x09,0x23,0x00,0x09,0x24,0x00,0x08,0x23,0x01,0x82, 0x08,0x23,0x00,0x01,0x08,0x23,0x01,0x82,0x08,0x22,0x00,0x01,0x08,0x21,0x00, 0x82,0x07,0x21,0x01,0x01,0x07,0x20,0x00,0x82,0x07,0x1f,0x00,0x01,0x07,0x20, 0x01,0x83,0x07,0x1f,0x00,0x83,0x07,0x1e,0x00,0x04,0x07,0x1d,0x00,0x07,0x1e, 0x01,0x07,0x1e,0x00,0x06,0x1d,0x00,0x85,0x07,0x1c,0x00,0x83,0x07,0x1b,0x00, 0x82,0x06,0x1b,0x00,0x84,0x06,0x1a,0x00,0x02,0x05,0x1a,0x00,0x05,0x19,0x00, 0x82,0x06,0x18,0x00,0x82,0x05,0x18,0x00,0x82,0x06,0x18,0x00,0x86,0x05,0x17, 0x00,0x01,0x04,0x16,0x00,0x82,0x05,0x16,0x00,0x02,0x04,0x16,0x00,0x05,0x15, 0x00,0x82,0x04,0x15,0x00,0x84,0x04,0x14,0x00,0x83,0x03,0x13,0x00,0x82,0x04, 0x13,0x00,0x01,0x03,0x13,0x00,0x85,0x03,0x12,0x00,0x83,0x03,0x11,0x00,0x85, 0x03,0x10,0x00,0x87,0x03,0x0f,0x00,0x84,0x03,0x0e,0x00,0x82,0x02,0x0d,0x00, 0x01,0x03,0x0d,0x00,0x84,0x02,0x0c,0x00,0x88,0x02,0x0b,0x00,0x03,0x02,0x0a, 0x00,0x01,0x0a,0x00,0x01,0x09,0x00,0x83,0x02,0x09,0x00,0x82,0x01,0x09,0x00, 0x84,0x01,0x08,0x00,0x87,0x01,0x07,0x00,0x84,0x01,0x06,0x00,0x82,0x01,0x05, 0x00,0x82,0x00,0x05,0x00,0x01,0x00,0x04,0x00,0x84,0x01,0x05,0x00,0x01,0x02, 0x05,0x00,0x82,0x02,0x04,0x00,0x84,0x01,0x03,0x00,0x83,0x00,0x02,0x00,0x82, 0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x08,0x4a,0xa1,0x15,0x49,0xa4,0x16,0x48, 0xa3,0x15,0x4a,0xa1,0x16,0x4a,0xa1,0x17,0x48,0xa2,0x17,0x47,0xa1,0x16,0x4a, 0xa1,0x16,0x82,0x48,0xa1,0x15,0x03,0x47,0xa0,0x14,0x48,0xa0,0x16,0x49,0xa1, 0x17,0x83,0x48,0xa1,0x15,0x01,0x47,0x9f,0x15,0x82,0x46,0x9e,0x14,0x01,0x49, 0xa1,0x17,0x82,0x46,0x9e,0x14,0x03,0x48,0xa0,0x16,0x46,0x9e,0x14,0x47,0xa0, 0x14,0x83,0x46,0x9e,0x14,0x82,0x47,0x9e,0x14,0x02,0x46,0x9d,0x14,0x46,0x9e, 0x14,0x82,0x46,0x9d,0x14,0x05,0x46,0x9d,0x13,0x47,0x9e,0x14,0x46,0x9d,0x14, 0x46,0x9d,0x13,0x44,0x9c,0x12,0x84,0x45,0x9d,0x13,0x01,0x46,0x9d,0x15,0x82, 0x44,0x9c,0x14,0x83,0x45,0x9d,0x14,0x08,0x44,0x9c,0x14,0x45,0x9b,0x14,0x44, 0x9a,0x13,0x44,0x9a,0x14,0x45,0x9b,0x14,0x46,0x9c,0x18,0x45,0x9b,0x15,0x45, 0x9c,0x18,0x82,0x44,0x9a,0x14,0x83,0x44,0x9a,0x16,0x04,0x45,0x9b,0x17,0x46, 0x9a,0x18,0x43,0x9a,0x16,0x44,0x9b,0x17,0x82,0x44,0x99,0x17,0x04,0x45,0x99, 0x17,0x45,0x99,0x18,0x43,0x9a,0x18,0x43,0x99,0x18,0x82,0x43,0x9a,0x18,0x05, 0x44,0x99,0x18,0x43,0x99,0x18,0x44,0x99,0x1a,0x43,0x99,0x19,0x45,0x99,0x1a, 0x82,0x44,0x99,0x18,0x82,0x44,0x98,0x19,0x01,0x44,0x99,0x1a,0x82,0x44,0x99, 0x1c,0x03,0x44,0x99,0x1a,0x44,0x99,0x1c,0x42,0x97,0x1a,0x82,0x45,0x99,0x1c, 0x0a,0x44,0x98,0x1b,0x46,0x98,0x1c,0x45,0x98,0x1c,0x45,0x99,0x1d,0x44,0x99, 0x1c,0x44,0x97,0x1c,0x46,0x99,0x1f,0x47,0x98,0x1f,0x45,0x98,0x1e,0x44,0x97, 0x1d,0x82,0x45,0x98,0x1e,0x05,0x44,0x99,0x1e,0x45,0x98,0x1e,0x44,0x97,0x1d, 0x45,0x98,0x1e,0x46,0x99,0x1f,0x82,0x45,0x98,0x1e,0x82,0x44,0x96,0x1f,0x0a, 0x44,0x97,0x1d,0x47,0x98,0x1f,0x43,0x97,0x1f,0x45,0x97,0x20,0x46,0x96,0x1f, 0x45,0x99,0x21,0x43,0x95,0x1e,0x42,0x96,0x1e,0x46,0x98,0x21,0x45,0x97,0x20, 0x82,0x44,0x96,0x1f,0x82,0x43,0x95,0x1e,0x83,0x44,0x96,0x1f,0x83,0x45,0x97, 0x20,0x82,0x44,0x96,0x21,0x06,0x45,0x97,0x21,0x44,0x96,0x1f,0x46,0x97,0x20, 0x44,0x96,0x21,0x43,0x95,0x20,0x44,0x96,0x1f,0x82,0x43,0x95,0x1e,0x0a,0x44, 0x96,0x1f,0x44,0x96,0x21,0x43,0x95,0x1e,0x44,0x96,0x21,0x43,0x95,0x20,0x42, 0x95,0x1f,0x44,0x96,0x1f,0x46,0x98,0x21,0x45,0x97,0x20,0x44,0x96,0x21,0x82, 0x43,0x95,0x20,0x07,0x42,0x95,0x1f,0x44,0x94,0x1f,0x45,0x95,0x20,0x46,0x95, 0x21,0x43,0x95,0x20,0x44,0x96,0x21,0x44,0x96,0x1f,0x82,0x44,0x96,0x21,0x02, 0x43,0x95,0x20,0x45,0x95,0x20,0x82,0x44,0x94,0x1f,0x83,0x42,0x94,0x1e,0x07, 0x45,0x95,0x20,0x44,0x94,0x1f,0x43,0x93,0x1e,0x42,0x92,0x1d,0x43,0x93,0x1e, 0x44,0x94,0x1f,0x42,0x91,0x1e,0x82,0x43,0x93,0x20,0x82,0x42,0x92,0x1f,0x05, 0x42,0x91,0x1e,0x42,0x92,0x1f,0x41,0x93,0x1f,0x42,0x91,0x1e,0x41,0x90,0x1d, 0x82,0x42,0x92,0x1f,0x01,0x42,0x91,0x1e,0x82,0x41,0x90,0x1d,0x07,0x42,0x92, 0x1f,0x42,0x91,0x1f,0x41,0x90,0x1d,0x40,0x90,0x1c,0x3f,0x8f,0x1c,0x41,0x90, 0x1e,0x3f,0x8f,0x1c,0x82,0x41,0x90,0x1d,0x01,0x3e,0x8e,0x1c,0x82,0x41,0x90, 0x1e,0x82,0x40,0x90,0x1d,0x82,0x3f,0x8f,0x1c,0x02,0x41,0x90,0x1e,0x40,0x90, 0x1d,0x84,0x3f,0x8f,0x1c,0x05,0x3e,0x8e,0x1c,0x3f,0x8f,0x1c,0x40,0x8e,0x1c, 0x3e,0x8e,0x1c,0x3e,0x8d,0x1b,0x82,0x40,0x90,0x1d,0x03,0x3f,0x8f,0x1c,0x40, 0x90,0x1c,0x3f,0x8f,0x1c,0x82,0x40,0x90,0x1c,0x82,0x41,0x90,0x1d,0x01,0x40, 0x90,0x1b,0x82,0x3e,0x90,0x1b,0x05,0x40,0x92,0x1c,0x42,0x94,0x1c,0x40,0x93, 0x19,0x3e,0x90,0x1b,0x42,0x95,0x1c,0x82,0x41,0x95,0x1b,0x07,0x43,0x98,0x1c, 0x41,0x94,0x1a,0x41,0x93,0x1c,0x3f,0x91,0x1c,0x41,0x93,0x1d,0x42,0x94,0x1c, 0x40,0x92,0x1b,0x82,0x41,0x93,0x1c,0x05,0x41,0x93,0x1d,0x40,0x92,0x1e,0x3e, 0x8e,0x1c,0x40,0x90,0x1b,0x42,0x91,0x1c,0x82,0x3e,0x8e,0x1c,0x06,0x41,0x90, 0x1c,0x40,0x90,0x1b,0x3e,0x90,0x1d,0x3f,0x91,0x1c,0x3e,0x90,0x1b,0x3f,0x91, 0x1c,0x82,0x42,0x92,0x1d,0x04,0x3f,0x8f,0x1c,0x40,0x90,0x1c,0x3f,0x8f,0x1c, 0x41,0x90,0x1e,0x82,0x3e,0x8d,0x1b,0x01,0x3e,0x8e,0x1c,0x82,0x3d,0x8b,0x1b, 0x09,0x3c,0x8a,0x1a,0x3e,0x8c,0x1c,0x3e,0x8c,0x1a,0x3e,0x8c,0x1c,0x3b,0x89, 0x18,0x3d,0x8b,0x19,0x3d,0x8b,0x18,0x3f,0x8b,0x1a,0x3e,0x89,0x1a,0x82,0x3c, 0x88,0x1a,0x04,0x39,0x84,0x17,0x3a,0x86,0x18,0x39,0x84,0x17,0x39,0x85,0x18, 0x82,0x3a,0x85,0x1a,0x06,0x3c,0x87,0x1c,0x38,0x81,0x18,0x2e,0x78,0x10,0x24, 0x6c,0x08,0x21,0x69,0x08,0x21,0x68,0x09,0x82,0x21,0x69,0x0a,0x04,0x20,0x67, 0x08,0x1f,0x67,0x08,0x21,0x69,0x08,0x21,0x68,0x09,0x82,0x21,0x69,0x06,0x0e, 0x20,0x67,0x07,0x1d,0x66,0x03,0x20,0x67,0x08,0x1f,0x67,0x04,0x1f,0x66,0x06, 0x1e,0x65,0x05,0x1c,0x63,0x04,0x1d,0x63,0x04,0x1e,0x64,0x05,0x1e,0x63,0x07, 0x1b,0x60,0x05,0x1b,0x5f,0x04,0x19,0x5f,0x03,0x1a,0x5f,0x05,0x82,0x18,0x5e, 0x04,0x04,0x19,0x5e,0x04,0x18,0x5b,0x03,0x18,0x5b,0x02,0x18,0x5b,0x03,0x82, 0x18,0x5a,0x02,0x03,0x18,0x5b,0x03,0x18,0x59,0x02,0x17,0x58,0x03,0x82,0x16, 0x58,0x03,0x08,0x16,0x57,0x03,0x15,0x56,0x00,0x17,0x58,0x04,0x16,0x56,0x03, 0x17,0x57,0x02,0x18,0x58,0x03,0x15,0x56,0x02,0x16,0x56,0x01,0x82,0x17,0x56, 0x04,0x06,0x16,0x56,0x04,0x15,0x55,0x03,0x16,0x56,0x04,0x18,0x56,0x04,0x17, 0x56,0x03,0x16,0x55,0x02,0x82,0x17,0x55,0x03,0x08,0x17,0x55,0x04,0x16,0x54, 0x04,0x16,0x53,0x02,0x16,0x54,0x03,0x16,0x53,0x04,0x17,0x54,0x04,0x18,0x52, 0x03,0x17,0x53,0x04,0x82,0x16,0x54,0x04,0x82,0x15,0x52,0x02,0x1b,0x16,0x52, 0x03,0x15,0x52,0x03,0x16,0x52,0x02,0x17,0x52,0x04,0x15,0x52,0x04,0x14,0x50, 0x02,0x16,0x51,0x02,0x17,0x50,0x01,0x17,0x4f,0x03,0x14,0x4f,0x02,0x16,0x50, 0x03,0x16,0x50,0x04,0x16,0x4f,0x03,0x16,0x4e,0x03,0x15,0x50,0x03,0x15,0x4e, 0x03,0x16,0x4f,0x04,0x15,0x4e,0x03,0x14,0x4e,0x01,0x16,0x4d,0x03,0x14,0x4d, 0x01,0x15,0x4e,0x03,0x14,0x4e,0x03,0x15,0x4d,0x03,0x15,0x4e,0x02,0x14,0x4e, 0x02,0x14,0x4c,0x02,0x82,0x14,0x4d,0x04,0x82,0x14,0x4c,0x03,0x82,0x14,0x4b, 0x03,0x06,0x14,0x4b,0x02,0x12,0x4a,0x02,0x14,0x4a,0x03,0x15,0x49,0x03,0x14, 0x49,0x02,0x14,0x4a,0x03,0x82,0x14,0x4a,0x04,0x0b,0x13,0x48,0x02,0x14,0x4a, 0x04,0x14,0x49,0x04,0x13,0x47,0x02,0x13,0x48,0x03,0x14,0x49,0x04,0x14,0x47, 0x03,0x14,0x47,0x04,0x13,0x48,0x04,0x13,0x46,0x03,0x13,0x46,0x02,0x82,0x12, 0x46,0x02,0x0e,0x12,0x46,0x03,0x13,0x46,0x04,0x14,0x46,0x04,0x13,0x45,0x03, 0x12,0x44,0x02,0x11,0x44,0x02,0x12,0x45,0x03,0x12,0x44,0x03,0x12,0x43,0x02, 0x13,0x44,0x04,0x13,0x43,0x04,0x11,0x42,0x03,0x12,0x42,0x03,0x11,0x42,0x02, 0x84,0x12,0x42,0x03,0x09,0x10,0x41,0x02,0x11,0x40,0x02,0x13,0x41,0x04,0x12, 0x3f,0x03,0x11,0x3e,0x02,0x11,0x40,0x04,0x11,0x3f,0x02,0x10,0x40,0x02,0x11, 0x40,0x03,0x83,0x10,0x3e,0x04,0x10,0x10,0x3e,0x03,0x10,0x3c,0x02,0x10,0x3d, 0x03,0x10,0x3e,0x02,0x10,0x3d,0x04,0x11,0x3e,0x04,0x10,0x3c,0x02,0x10,0x3b, 0x01,0x10,0x3c,0x02,0x10,0x3c,0x03,0x10,0x3c,0x02,0x10,0x3b,0x03,0x0f,0x3a, 0x02,0x10,0x3b,0x04,0x10,0x3b,0x02,0x0f,0x39,0x01,0x83,0x0f,0x39,0x03,0x0b, 0x10,0x39,0x03,0x0f,0x39,0x02,0x0e,0x38,0x00,0x0f,0x38,0x03,0x0f,0x39,0x03, 0x10,0x37,0x03,0x0e,0x37,0x02,0x0f,0x38,0x03,0x0f,0x37,0x03,0x0e,0x37,0x03, 0x10,0x36,0x02,0x82,0x0e,0x36,0x01,0x82,0x0e,0x35,0x02,0x82,0x0d,0x35,0x02, 0x04,0x0e,0x35,0x02,0x0d,0x34,0x01,0x0f,0x35,0x03,0x0e,0x35,0x03,0x82,0x0d, 0x34,0x02,0x83,0x0d,0x33,0x02,0x82,0x0c,0x32,0x02,0x01,0x0c,0x32,0x03,0x83, 0x0c,0x31,0x02,0x01,0x0c,0x31,0x01,0x82,0x0c,0x31,0x02,0x82,0x0c,0x30,0x02, 0x02,0x0d,0x30,0x02,0x0c,0x30,0x02,0x82,0x0c,0x2f,0x02,0x82,0x0c,0x2e,0x01, 0x82,0x0c,0x2e,0x02,0x01,0x0c,0x2d,0x01,0x83,0x0c,0x2d,0x02,0x82,0x0c,0x2d, 0x00,0x0a,0x0c,0x2d,0x01,0x0b,0x2c,0x00,0x0c,0x2c,0x02,0x0b,0x2c,0x01,0x0b, 0x2b,0x01,0x0c,0x2b,0x02,0x0b,0x2b,0x01,0x0b,0x2a,0x01,0x0a,0x2a,0x01,0x0a, 0x29,0x01,0x82,0x0b,0x29,0x01,0x83,0x0a,0x29,0x01,0x04,0x09,0x28,0x00,0x0a, 0x29,0x01,0x0b,0x28,0x01,0x0a,0x28,0x01,0x82,0x0a,0x27,0x01,0x05,0x0b,0x27, 0x01,0x09,0x26,0x01,0x0a,0x25,0x01,0x09,0x26,0x01,0x0a,0x25,0x00,0x82,0x09, 0x25,0x01,0x01,0x09,0x25,0x00,0x82,0x08,0x24,0x00,0x06,0x09,0x24,0x00,0x08, 0x24,0x00,0x08,0x24,0x01,0x08,0x23,0x00,0x08,0x22,0x00,0x08,0x22,0x01,0x82, 0x09,0x22,0x00,0x82,0x08,0x22,0x00,0x82,0x08,0x21,0x00,0x84,0x08,0x20,0x00, 0x05,0x08,0x20,0x01,0x08,0x20,0x00,0x08,0x1f,0x00,0x08,0x1e,0x00,0x08,0x1e, 0x01,0x85,0x07,0x1d,0x00,0x02,0x08,0x1d,0x00,0x06,0x1c,0x00,0x82,0x07,0x1c, 0x00,0x01,0x06,0x1c,0x00,0x82,0x07,0x1c,0x00,0x01,0x06,0x1c,0x00,0x83,0x06, 0x1b,0x00,0x01,0x07,0x1a,0x00,0x82,0x06,0x1a,0x00,0x82,0x06,0x19,0x00,0x82, 0x05,0x18,0x00,0x83,0x06,0x18,0x00,0x01,0x05,0x18,0x00,0x82,0x05,0x17,0x00, 0x02,0x04,0x17,0x00,0x04,0x16,0x00,0x85,0x05,0x16,0x00,0x82,0x04,0x15,0x00, 0x88,0x04,0x14,0x00,0x83,0x04,0x13,0x00,0x84,0x04,0x12,0x00,0x85,0x04,0x11, 0x00,0x83,0x04,0x10,0x00,0x84,0x03,0x10,0x00,0x83,0x03,0x0f,0x00,0x84,0x03, 0x0e,0x00,0x84,0x03,0x0d,0x00,0x82,0x03,0x0c,0x00,0x86,0x02,0x0c,0x00,0x84, 0x02,0x0b,0x00,0x83,0x02,0x0a,0x00,0x04,0x02,0x09,0x00,0x01,0x09,0x00,0x02, 0x09,0x00,0x01,0x09,0x00,0x88,0x01,0x08,0x00,0x84,0x01,0x07,0x00,0x84,0x01, 0x06,0x00,0x83,0x00,0x05,0x00,0x86,0x00,0x04,0x00,0x86,0x01,0x04,0x00,0x82, 0x00,0x03,0x00,0x82,0x00,0x02,0x00,0x82,0x00,0x01,0x00,0xdc,0x00,0x00,0x00, 0x0d,0x49,0xa3,0x15,0x49,0xa4,0x15,0x49,0xa4,0x18,0x49,0xa2,0x15,0x49,0xa3, 0x16,0x48,0xa3,0x16,0x49,0xa4,0x17,0x49,0xa2,0x15,0x49,0xa3,0x16,0x4a,0xa4, 0x17,0x49,0xa2,0x15,0x47,0xa0,0x15,0x48,0xa0,0x15,0x82,0x49,0xa2,0x15,0x01, 0x47,0xa0,0x15,0x82,0x49,0xa0,0x15,0x82,0x48,0xa0,0x15,0x08,0x47,0xa0,0x15, 0x47,0x9f,0x14,0x49,0xa0,0x15,0x46,0x9f,0x14,0x47,0xa0,0x15,0x46,0xa0,0x13, 0x45,0x9e,0x13,0x46,0x9f,0x14,0x82,0x47,0x9f,0x14,0x01,0x46,0x9f,0x15,0x82, 0x46,0x9f,0x14,0x01,0x46,0x9f,0x15,0x83,0x45,0x9c,0x14,0x01,0x46,0x9d,0x15, 0x83,0x45,0x9e,0x15,0x82,0x45,0x9d,0x14,0x83,0x45,0x9e,0x15,0x83,0x45,0x9d, 0x14,0x08,0x44,0x9c,0x15,0x45,0x9c,0x14,0x45,0x9c,0x15,0x45,0x9b,0x15,0x45, 0x9c,0x15,0x45,0x9c,0x17,0x45,0x9b,0x16,0x44,0x9b,0x16,0x82,0x45,0x9b,0x15, 0x82,0x45,0x9b,0x16,0x04,0x44,0x9b,0x15,0x44,0x9a,0x16,0x45,0x9b,0x19,0x43, 0x9b,0x16,0x82,0x44,0x9a,0x16,0x01,0x44,0x9a,0x18,0x82,0x44,0x98,0x17,0x0e, 0x44,0x9b,0x19,0x44,0x9a,0x18,0x45,0x9b,0x19,0x44,0x9b,0x19,0x44,0x9a,0x18, 0x44,0x98,0x19,0x44,0x9a,0x19,0x45,0x9b,0x1a,0x45,0x99,0x19,0x43,0x99,0x17, 0x44,0x9a,0x19,0x45,0x99,0x1b,0x45,0x99,0x19,0x43,0x99,0x19,0x82,0x44,0x99, 0x1b,0x08,0x45,0x9b,0x1a,0x43,0x98,0x1a,0x44,0x99,0x1b,0x44,0x98,0x1a,0x45, 0x98,0x1c,0x45,0x97,0x1b,0x46,0x98,0x1b,0x44,0x98,0x1a,0x82,0x44,0x99,0x1c, 0x07,0x44,0x97,0x1d,0x44,0x99,0x1e,0x45,0x98,0x1e,0x46,0x97,0x1e,0x45,0x98, 0x1e,0x46,0x97,0x1e,0x46,0x96,0x1d,0x84,0x45,0x98,0x1e,0x01,0x45,0x99,0x1e, 0x82,0x45,0x98,0x1e,0x82,0x45,0x97,0x1f,0x07,0x45,0x98,0x1e,0x45,0x99,0x20, 0x44,0x97,0x1e,0x45,0x97,0x1f,0x44,0x97,0x1e,0x46,0x97,0x1f,0x42,0x97,0x1e, 0x83,0x45,0x97,0x1f,0x02,0x44,0x97,0x1e,0x45,0x97,0x1f,0x82,0x44,0x97,0x1e, 0x07,0x45,0x97,0x1f,0x45,0x98,0x20,0x44,0x97,0x1d,0x45,0x97,0x1f,0x44,0x97, 0x1e,0x45,0x97,0x1f,0x44,0x97,0x1e,0x83,0x45,0x97,0x1f,0x04,0x44,0x97,0x1e, 0x45,0x97,0x1f,0x44,0x97,0x20,0x45,0x97,0x21,0x83,0x44,0x97,0x1e,0x0a,0x43, 0x96,0x1e,0x46,0x97,0x1f,0x44,0x97,0x20,0x43,0x96,0x1f,0x44,0x97,0x1e,0x45, 0x97,0x1f,0x45,0x98,0x20,0x43,0x96,0x1e,0x44,0x97,0x20,0x42,0x95,0x1e,0x82, 0x44,0x97,0x20,0x04,0x41,0x94,0x1e,0x42,0x95,0x1e,0x43,0x96,0x1f,0x44,0x97, 0x20,0x82,0x45,0x97,0x21,0x01,0x44,0x97,0x20,0x82,0x43,0x96,0x1f,0x02,0x44, 0x97,0x20,0x41,0x94,0x1e,0x82,0x42,0x95,0x1e,0x01,0x43,0x96,0x1f,0x83,0x41, 0x94,0x1e,0x01,0x42,0x95,0x1e,0x82,0x43,0x93,0x1e,0x03,0x44,0x94,0x1e,0x42, 0x93,0x1e,0x44,0x94,0x20,0x83,0x43,0x93,0x1f,0x04,0x41,0x92,0x1e,0x43,0x93, 0x1f,0x41,0x92,0x1e,0x42,0x93,0x1e,0x83,0x41,0x92,0x1e,0x04,0x40,0x91,0x1e, 0x42,0x93,0x1e,0x41,0x92,0x1e,0x40,0x91,0x1d,0x82,0x40,0x91,0x1e,0x07,0x42, 0x93,0x1f,0x41,0x92,0x1e,0x42,0x93,0x1f,0x41,0x92,0x1e,0x43,0x93,0x20,0x3f, 0x8f,0x1c,0x40,0x90,0x1d,0x83,0x40,0x91,0x1e,0x02,0x40,0x90,0x1d,0x40,0x91, 0x1e,0x82,0x40,0x91,0x1d,0x01,0x41,0x92,0x1e,0x84,0x40,0x90,0x1d,0x82,0x40, 0x91,0x1e,0x82,0x3f,0x8f,0x1c,0x02,0x40,0x90,0x1d,0x3f,0x8f,0x1b,0x82,0x40, 0x91,0x1d,0x0e,0x3f,0x8f,0x1b,0x40,0x90,0x1c,0x3f,0x8f,0x1b,0x40,0x91,0x1d, 0x40,0x90,0x1c,0x42,0x93,0x1e,0x3f,0x8f,0x19,0x40,0x93,0x1c,0x3e,0x91,0x1a, 0x40,0x93,0x1b,0x40,0x93,0x1a,0x42,0x95,0x1e,0x40,0x93,0x1c,0x40,0x93,0x1a, 0x83,0x42,0x95,0x1d,0x07,0x40,0x93,0x1d,0x41,0x94,0x1e,0x40,0x93,0x1b,0x40, 0x93,0x1a,0x40,0x93,0x1c,0x40,0x93,0x1d,0x40,0x93,0x1c,0x82,0x40,0x93,0x1d, 0x02,0x40,0x93,0x1c,0x40,0x91,0x1b,0x82,0x3f,0x8f,0x1c,0x05,0x40,0x91,0x1d, 0x42,0x93,0x1e,0x41,0x92,0x1e,0x40,0x90,0x1c,0x41,0x94,0x1e,0x82,0x40,0x93, 0x1c,0x82,0x40,0x93,0x1d,0x01,0x40,0x91,0x1d,0x83,0x41,0x92,0x1e,0x04,0x40, 0x91,0x1e,0x41,0x92,0x1e,0x41,0x90,0x1e,0x3d,0x8c,0x19,0x82,0x3f,0x8e,0x1d, 0x07,0x3c,0x8b,0x1a,0x3e,0x8d,0x1c,0x3f,0x8e,0x1b,0x40,0x8f,0x1d,0x3d,0x8c, 0x19,0x3c,0x8a,0x18,0x3b,0x8a,0x19,0x82,0x40,0x8c,0x1c,0x15,0x3c,0x89,0x17, 0x3c,0x89,0x19,0x3c,0x89,0x1a,0x39,0x86,0x17,0x3a,0x86,0x18,0x39,0x86,0x17, 0x3b,0x86,0x18,0x3d,0x88,0x1c,0x3a,0x85,0x19,0x3a,0x86,0x16,0x3c,0x87,0x19, 0x39,0x83,0x19,0x30,0x7a,0x13,0x28,0x71,0x0d,0x21,0x69,0x08,0x1e,0x66,0x04, 0x22,0x6a,0x0a,0x22,0x6b,0x07,0x22,0x6a,0x08,0x20,0x68,0x07,0x20,0x68,0x08, 0x82,0x21,0x69,0x08,0x02,0x20,0x68,0x07,0x1e,0x67,0x05,0x82,0x1f,0x67,0x06, 0x09,0x1e,0x65,0x06,0x1e,0x65,0x05,0x1f,0x66,0x06,0x1e,0x64,0x04,0x1d,0x63, 0x04,0x1c,0x62,0x06,0x1c,0x63,0x05,0x1a,0x60,0x04,0x19,0x5f,0x04,0x82,0x1a, 0x5f,0x04,0x04,0x19,0x5d,0x04,0x19,0x5c,0x03,0x19,0x5d,0x04,0x1a,0x5d,0x04, 0x82,0x18,0x5c,0x03,0x03,0x17,0x5b,0x02,0x19,0x5a,0x04,0x17,0x59,0x03,0x82, 0x17,0x5a,0x04,0x08,0x15,0x57,0x00,0x16,0x58,0x03,0x16,0x58,0x01,0x16,0x57, 0x01,0x16,0x57,0x03,0x17,0x58,0x04,0x17,0x57,0x04,0x15,0x56,0x02,0x83,0x16, 0x56,0x03,0x06,0x15,0x56,0x03,0x18,0x57,0x05,0x18,0x57,0x04,0x16,0x56,0x02, 0x17,0x56,0x03,0x16,0x55,0x04,0x82,0x18,0x54,0x04,0x01,0x16,0x55,0x04,0x82, 0x15,0x54,0x04,0x04,0x15,0x53,0x03,0x17,0x52,0x04,0x17,0x55,0x04,0x17,0x54, 0x04,0x82,0x16,0x55,0x04,0x09,0x14,0x52,0x01,0x16,0x52,0x03,0x16,0x52,0x04, 0x15,0x52,0x04,0x16,0x53,0x02,0x15,0x52,0x03,0x15,0x51,0x02,0x16,0x50,0x02, 0x17,0x50,0x03,0x82,0x15,0x51,0x03,0x04,0x15,0x50,0x04,0x15,0x4f,0x02,0x17, 0x50,0x03,0x15,0x50,0x03,0x82,0x15,0x4f,0x04,0x02,0x16,0x4e,0x03,0x15,0x50, 0x03,0x82,0x15,0x4e,0x03,0x02,0x16,0x4d,0x01,0x16,0x4d,0x03,0x82,0x15,0x4d, 0x03,0x02,0x15,0x4d,0x02,0x15,0x4d,0x03,0x82,0x15,0x4d,0x02,0x08,0x15,0x4d, 0x04,0x14,0x4d,0x03,0x14,0x4c,0x02,0x14,0x4d,0x03,0x14,0x4b,0x02,0x15,0x4b, 0x03,0x15,0x4d,0x04,0x14,0x4b,0x03,0x82,0x15,0x4a,0x03,0x02,0x14,0x49,0x02, 0x14,0x4b,0x04,0x82,0x13,0x4a,0x03,0x06,0x13,0x49,0x02,0x14,0x49,0x02,0x13, 0x49,0x01,0x12,0x49,0x02,0x12,0x47,0x01,0x14,0x48,0x01,0x82,0x13,0x48,0x03, 0x01,0x13,0x46,0x02,0x82,0x13,0x47,0x03,0x82,0x12,0x47,0x03,0x82,0x13,0x47, 0x02,0x03,0x13,0x45,0x03,0x11,0x44,0x01,0x12,0x45,0x02,0x82,0x12,0x45,0x03, 0x07,0x11,0x45,0x02,0x12,0x44,0x02,0x12,0x44,0x03,0x11,0x43,0x02,0x11,0x44, 0x03,0x12,0x43,0x03,0x11,0x42,0x02,0x82,0x12,0x42,0x03,0x02,0x11,0x42,0x03, 0x12,0x43,0x03,0x82,0x11,0x42,0x03,0x04,0x11,0x40,0x03,0x11,0x3f,0x03,0x11, 0x3f,0x02,0x12,0x40,0x04,0x82,0x12,0x40,0x03,0x02,0x11,0x40,0x02,0x11,0x3f, 0x02,0x82,0x11,0x3f,0x04,0x01,0x10,0x3d,0x02,0x83,0x11,0x3e,0x04,0x05,0x0f, 0x3d,0x01,0x11,0x3e,0x03,0x11,0x3d,0x03,0x11,0x3c,0x02,0x10,0x3d,0x02,0x82, 0x10,0x3c,0x02,0x82,0x10,0x3c,0x03,0x0a,0x10,0x3b,0x03,0x10,0x3a,0x03,0x10, 0x3c,0x02,0x11,0x3b,0x03,0x0f,0x3a,0x02,0x0e,0x3a,0x00,0x0f,0x3a,0x02,0x10, 0x3a,0x04,0x0e,0x39,0x03,0x0f,0x38,0x01,0x84,0x0f,0x38,0x03,0x05,0x0e,0x38, 0x03,0x0e,0x37,0x02,0x0f,0x38,0x03,0x0e,0x38,0x02,0x0e,0x37,0x01,0x82,0x0e, 0x36,0x02,0x06,0x0d,0x36,0x02,0x0d,0x35,0x02,0x0e,0x35,0x02,0x0e,0x34,0x02, 0x0d,0x35,0x01,0x0c,0x35,0x01,0x82,0x0d,0x34,0x01,0x04,0x0c,0x33,0x02,0x0d, 0x33,0x02,0x0f,0x33,0x03,0x0d,0x33,0x02,0x82,0x0c,0x33,0x02,0x01,0x0c,0x33, 0x01,0x82,0x0c,0x32,0x02,0x04,0x0c,0x33,0x01,0x0c,0x31,0x02,0x0c,0x31,0x01, 0x0c,0x31,0x02,0x83,0x0c,0x30,0x02,0x01,0x0d,0x31,0x03,0x83,0x0c,0x2f,0x01, 0x08,0x0c,0x2f,0x02,0x0c,0x2f,0x01,0x0c,0x2e,0x01,0x0c,0x2f,0x02,0x0c,0x2e, 0x01,0x0b,0x2d,0x01,0x0c,0x2d,0x01,0x0c,0x2d,0x02,0x82,0x0c,0x2d,0x01,0x03, 0x0c,0x2c,0x01,0x0c,0x2c,0x02,0x0b,0x2b,0x01,0x82,0x0c,0x2b,0x02,0x84,0x0b, 0x2b,0x01,0x01,0x0b,0x2a,0x00,0x82,0x0b,0x2a,0x02,0x82,0x0b,0x28,0x01,0x82, 0x09,0x28,0x00,0x82,0x0b,0x27,0x01,0x82,0x09,0x27,0x01,0x09,0x0a,0x26,0x00, 0x0a,0x27,0x01,0x08,0x26,0x00,0x0a,0x26,0x00,0x08,0x26,0x01,0x09,0x26,0x01, 0x09,0x25,0x00,0x08,0x25,0x00,0x0a,0x24,0x00,0x82,0x09,0x24,0x00,0x82,0x09, 0x23,0x00,0x04,0x09,0x23,0x01,0x08,0x23,0x00,0x08,0x23,0x01,0x08,0x23,0x00, 0x85,0x08,0x22,0x00,0x01,0x08,0x21,0x00,0x82,0x08,0x20,0x01,0x02,0x08,0x1f, 0x00,0x08,0x1f,0x01,0x83,0x07,0x1f,0x00,0x83,0x08,0x1e,0x00,0x83,0x07,0x1e, 0x00,0x05,0x07,0x1d,0x00,0x07,0x1c,0x00,0x07,0x1d,0x00,0x06,0x1d,0x00,0x06, 0x1c,0x00,0x82,0x07,0x1c,0x00,0x82,0x06,0x1b,0x00,0x05,0x07,0x1b,0x00,0x07, 0x1a,0x00,0x06,0x1a,0x00,0x07,0x1a,0x00,0x05,0x1a,0x00,0x83,0x06,0x19,0x00, 0x82,0x05,0x19,0x00,0x82,0x05,0x18,0x00,0x85,0x05,0x17,0x00,0x01,0x05,0x16, 0x00,0x82,0x04,0x16,0x00,0x05,0x04,0x15,0x00,0x05,0x16,0x00,0x05,0x15,0x00, 0x04,0x15,0x00,0x05,0x15,0x00,0x82,0x04,0x15,0x00,0x84,0x04,0x14,0x00,0x84, 0x04,0x13,0x00,0x83,0x04,0x12,0x00,0x88,0x04,0x11,0x00,0x01,0x04,0x10,0x00, 0x83,0x03,0x10,0x00,0x84,0x03,0x0f,0x00,0x83,0x03,0x0e,0x00,0x83,0x03,0x0d, 0x00,0x85,0x02,0x0c,0x00,0x01,0x03,0x0c,0x00,0x82,0x02,0x0c,0x00,0x84,0x02, 0x0b,0x00,0x02,0x02,0x0a,0x00,0x01,0x0a,0x00,0x82,0x02,0x0a,0x00,0x01,0x02, 0x09,0x00,0x82,0x01,0x09,0x00,0x87,0x01,0x08,0x00,0x85,0x01,0x07,0x00,0x83, 0x01,0x06,0x00,0x01,0x00,0x06,0x00,0x84,0x00,0x05,0x00,0x88,0x00,0x04,0x00, 0x02,0x01,0x04,0x00,0x00,0x04,0x00,0x82,0x01,0x04,0x00,0x02,0x01,0x03,0x00, 0x00,0x03,0x00,0x82,0x00,0x02,0x00,0x82,0x00,0x01,0x00,0xdc,0x00,0x00,0x00, 0x01,0x4a,0xa4,0x16,0x82,0x48,0xa3,0x16,0x14,0x4a,0xa4,0x16,0x49,0xa3,0x16, 0x48,0xa3,0x16,0x48,0xa4,0x16,0x49,0xa3,0x16,0x48,0xa3,0x16,0x4a,0xa2,0x16, 0x48,0xa1,0x14,0x48,0xa1,0x15,0x48,0xa2,0x16,0x49,0xa2,0x15,0x4a,0xa2,0x16, 0x47,0xa2,0x16,0x48,0xa1,0x14,0x48,0xa1,0x15,0x48,0xa2,0x16,0x47,0xa0,0x14, 0x48,0xa1,0x15,0x47,0xa0,0x14,0x46,0x9f,0x13,0x82,0x47,0xa0,0x14,0x01,0x45, 0x9f,0x12,0x82,0x46,0x9f,0x15,0x03,0x48,0xa0,0x14,0x47,0xa0,0x14,0x45,0x9e, 0x16,0x82,0x46,0x9f,0x15,0x02,0x47,0xa0,0x16,0x46,0x9f,0x15,0x85,0x45,0x9e, 0x14,0x02,0x43,0x9d,0x12,0x44,0x9e,0x13,0x82,0x45,0x9e,0x14,0x02,0x44,0x9e, 0x13,0x43,0x9d,0x14,0x82,0x45,0x9d,0x15,0x0b,0x43,0x9d,0x14,0x43,0x9c,0x16, 0x44,0x9e,0x15,0x43,0x9c,0x16,0x44,0x9c,0x16,0x44,0x9c,0x14,0x45,0x9d,0x16, 0x44,0x9c,0x14,0x44,0x9b,0x16,0x44,0x9c,0x16,0x45,0x9d,0x16,0x82,0x44,0x9c, 0x16,0x82,0x43,0x9a,0x16,0x02,0x44,0x9b,0x18,0x44,0x9b,0x16,0x82,0x43,0x9a, 0x16,0x08,0x43,0x9c,0x18,0x44,0x99,0x17,0x43,0x99,0x16,0x43,0x9b,0x17,0x44, 0x9b,0x18,0x43,0x99,0x18,0x44,0x99,0x17,0x44,0x9b,0x1a,0x82,0x43,0x99,0x18, 0x08,0x43,0x99,0x1a,0x43,0x99,0x18,0x45,0x9a,0x1a,0x44,0x9a,0x1b,0x45,0x9a, 0x1a,0x44,0x99,0x1b,0x43,0x99,0x1a,0x44,0x9b,0x1a,0x82,0x43,0x99,0x1b,0x0b, 0x44,0x9a,0x1b,0x44,0x99,0x1b,0x42,0x96,0x19,0x43,0x98,0x1c,0x44,0x9a,0x1e, 0x44,0x99,0x1b,0x43,0x98,0x1b,0x45,0x99,0x1c,0x44,0x99,0x1d,0x46,0x98,0x1d, 0x44,0x99,0x1d,0x82,0x45,0x97,0x1c,0x0b,0x44,0x9a,0x1e,0x45,0x99,0x1e,0x46, 0x98,0x1d,0x43,0x99,0x1d,0x44,0x99,0x1d,0x43,0x98,0x1c,0x44,0x98,0x1f,0x45, 0x99,0x1f,0x44,0x99,0x1f,0x44,0x98,0x1f,0x45,0x99,0x1f,0x83,0x44,0x98,0x1f, 0x02,0x45,0x99,0x1f,0x43,0x97,0x1e,0x82,0x43,0x97,0x1f,0x02,0x45,0x99,0x1f, 0x43,0x99,0x1f,0x82,0x44,0x98,0x1f,0x01,0x43,0x97,0x1e,0x82,0x44,0x98,0x1f, 0x83,0x43,0x97,0x1e,0x03,0x45,0x99,0x1e,0x43,0x99,0x1f,0x43,0x98,0x1e,0x87, 0x44,0x98,0x1f,0x04,0x43,0x97,0x1e,0x44,0x98,0x20,0x43,0x97,0x1e,0x46,0x99, 0x20,0x82,0x43,0x97,0x1e,0x01,0x44,0x96,0x1d,0x82,0x43,0x97,0x1f,0x01,0x43, 0x97,0x1e,0x82,0x44,0x98,0x1f,0x05,0x43,0x96,0x1d,0x43,0x97,0x1f,0x43,0x96, 0x1f,0x43,0x97,0x1f,0x44,0x98,0x20,0x82,0x43,0x96,0x1f,0x82,0x43,0x97,0x1f, 0x01,0x41,0x95,0x1d,0x84,0x43,0x96,0x1f,0x03,0x43,0x97,0x1f,0x43,0x96,0x1f, 0x43,0x97,0x1f,0x82,0x44,0x98,0x20,0x83,0x42,0x95,0x1e,0x04,0x43,0x96,0x1f, 0x44,0x95,0x1f,0x43,0x95,0x1e,0x44,0x95,0x1f,0x82,0x44,0x95,0x20,0x01,0x43, 0x95,0x1f,0x83,0x43,0x94,0x1f,0x05,0x43,0x95,0x1f,0x42,0x93,0x1e,0x43,0x94, 0x1f,0x43,0x95,0x1f,0x43,0x94,0x1f,0x83,0x41,0x92,0x1e,0x82,0x42,0x93,0x1e, 0x08,0x3f,0x90,0x1c,0x40,0x91,0x1d,0x43,0x94,0x1f,0x3f,0x90,0x1b,0x40,0x91, 0x1d,0x43,0x94,0x1f,0x40,0x91,0x1d,0x3e,0x90,0x1c,0x84,0x41,0x92,0x1e,0x07, 0x40,0x91,0x1d,0x41,0x92,0x1e,0x40,0x91,0x1d,0x3f,0x90,0x1c,0x43,0x94,0x1f, 0x40,0x91,0x1d,0x3f,0x90,0x1c,0x82,0x3f,0x90,0x1b,0x08,0x3f,0x90,0x1c,0x40, 0x91,0x1d,0x3f,0x90,0x1c,0x40,0x91,0x1d,0x41,0x92,0x1e,0x40,0x91,0x1d,0x40, 0x91,0x1c,0x41,0x92,0x1d,0x83,0x3f,0x90,0x1b,0x03,0x3f,0x93,0x1d,0x3e,0x91, 0x1b,0x3f,0x92,0x1b,0x82,0x3f,0x93,0x1b,0x02,0x40,0x94,0x1c,0x3f,0x93,0x1a, 0x82,0x40,0x94,0x1b,0x09,0x41,0x95,0x1a,0x42,0x95,0x1c,0x41,0x95,0x1d,0x42, 0x96,0x1b,0x43,0x98,0x1c,0x40,0x94,0x1b,0x41,0x95,0x1a,0x42,0x96,0x1b,0x43, 0x96,0x1d,0x82,0x40,0x94,0x1c,0x0d,0x3f,0x93,0x1b,0x41,0x95,0x1d,0x3f,0x92, 0x1b,0x43,0x96,0x1d,0x42,0x93,0x1c,0x41,0x92,0x1d,0x40,0x91,0x1d,0x40,0x91, 0x1c,0x41,0x92,0x1d,0x40,0x91,0x1c,0x40,0x94,0x1e,0x43,0x96,0x1f,0x42,0x95, 0x1e,0x83,0x41,0x95,0x1d,0x82,0x42,0x93,0x1e,0x06,0x41,0x92,0x1d,0x42,0x93, 0x1f,0x42,0x93,0x1e,0x44,0x94,0x20,0x41,0x90,0x1d,0x40,0x90,0x1c,0x82,0x40, 0x91,0x1d,0x0e,0x3f,0x8f,0x1b,0x40,0x90,0x1c,0x3c,0x8b,0x1b,0x3f,0x8e,0x1b, 0x41,0x90,0x1d,0x3f,0x8e,0x1a,0x3d,0x8c,0x1b,0x3b,0x8b,0x19,0x3d,0x8a,0x1b, 0x3c,0x89,0x18,0x3d,0x8a,0x19,0x3f,0x8c,0x1b,0x3d,0x8a,0x1b,0x3c,0x89,0x1a, 0x82,0x3b,0x88,0x19,0x1a,0x3c,0x89,0x1a,0x39,0x86,0x16,0x3a,0x87,0x1a,0x3a, 0x86,0x19,0x3d,0x8a,0x1b,0x3a,0x86,0x16,0x3a,0x85,0x16,0x33,0x7e,0x14,0x2b, 0x75,0x0f,0x23,0x6c,0x09,0x20,0x69,0x07,0x21,0x6a,0x09,0x21,0x6a,0x08,0x21, 0x68,0x09,0x23,0x6b,0x09,0x1e,0x67,0x04,0x1f,0x68,0x08,0x20,0x69,0x07,0x1f, 0x68,0x06,0x1f,0x68,0x04,0x20,0x68,0x07,0x20,0x68,0x05,0x1f,0x67,0x06,0x1e, 0x65,0x06,0x1e,0x64,0x04,0x1d,0x64,0x06,0x83,0x1c,0x63,0x05,0x02,0x1b,0x60, 0x05,0x1c,0x61,0x06,0x82,0x1b,0x5e,0x04,0x02,0x1a,0x5e,0x04,0x19,0x5d,0x03, 0x82,0x18,0x5d,0x03,0x12,0x17,0x5c,0x02,0x19,0x5b,0x04,0x18,0x5a,0x04,0x18, 0x5b,0x04,0x16,0x5a,0x04,0x17,0x5a,0x02,0x17,0x5a,0x04,0x16,0x59,0x03,0x17, 0x59,0x02,0x16,0x58,0x03,0x16,0x57,0x02,0x18,0x59,0x03,0x16,0x57,0x03,0x16, 0x56,0x02,0x17,0x57,0x02,0x17,0x58,0x03,0x16,0x57,0x04,0x16,0x56,0x03,0x82, 0x16,0x55,0x03,0x01,0x16,0x56,0x04,0x87,0x16,0x55,0x04,0x03,0x18,0x54,0x04, 0x16,0x55,0x03,0x16,0x54,0x02,0x82,0x16,0x54,0x03,0x06,0x16,0x55,0x03,0x16, 0x55,0x04,0x16,0x53,0x03,0x16,0x51,0x04,0x16,0x54,0x04,0x16,0x53,0x03,0x82, 0x16,0x52,0x03,0x04,0x15,0x52,0x03,0x16,0x53,0x04,0x15,0x52,0x03,0x15,0x51, 0x02,0x82,0x16,0x51,0x03,0x0f,0x15,0x51,0x03,0x16,0x4f,0x03,0x15,0x51,0x03, 0x14,0x4e,0x01,0x15,0x4f,0x03,0x15,0x50,0x03,0x14,0x4e,0x03,0x15,0x4e,0x03, 0x14,0x4d,0x02,0x15,0x4e,0x04,0x15,0x4e,0x03,0x15,0x4d,0x02,0x14,0x4c,0x03, 0x15,0x4d,0x02,0x14,0x4c,0x02,0x82,0x14,0x4c,0x04,0x10,0x14,0x4c,0x02,0x15, 0x4c,0x03,0x14,0x4c,0x04,0x15,0x4c,0x04,0x14,0x4b,0x02,0x13,0x4a,0x02,0x14, 0x4b,0x02,0x14,0x4c,0x03,0x13,0x4b,0x02,0x13,0x4a,0x02,0x13,0x49,0x02,0x14, 0x4a,0x03,0x13,0x4a,0x02,0x13,0x4a,0x03,0x14,0x49,0x03,0x15,0x49,0x04,0x82, 0x13,0x49,0x01,0x01,0x14,0x48,0x02,0x82,0x13,0x48,0x03,0x82,0x14,0x48,0x04, 0x82,0x12,0x48,0x01,0x06,0x13,0x48,0x02,0x13,0x48,0x04,0x13,0x46,0x03,0x12, 0x45,0x02,0x12,0x46,0x01,0x13,0x46,0x02,0x82,0x12,0x45,0x01,0x0f,0x12,0x46, 0x03,0x12,0x45,0x03,0x13,0x44,0x03,0x13,0x45,0x04,0x12,0x43,0x03,0x12,0x43, 0x02,0x12,0x43,0x03,0x12,0x43,0x01,0x11,0x43,0x01,0x12,0x43,0x03,0x12,0x43, 0x04,0x12,0x43,0x03,0x12,0x42,0x03,0x12,0x41,0x03,0x12,0x41,0x04,0x82,0x12, 0x40,0x02,0x0c,0x11,0x3f,0x02,0x10,0x3f,0x01,0x12,0x3f,0x02,0x10,0x3f,0x01, 0x12,0x3f,0x02,0x10,0x3e,0x02,0x11,0x3f,0x03,0x11,0x3e,0x03,0x11,0x3f,0x02, 0x10,0x3e,0x02,0x10,0x3d,0x02,0x10,0x3d,0x03,0x82,0x11,0x3d,0x02,0x0c,0x10, 0x3d,0x02,0x0f,0x3d,0x02,0x0f,0x3b,0x01,0x10,0x3c,0x03,0x10,0x3b,0x03,0x11, 0x3b,0x03,0x10,0x3c,0x02,0x10,0x3b,0x02,0x10,0x3a,0x03,0x0f,0x3b,0x02,0x0f, 0x3a,0x03,0x10,0x3a,0x03,0x82,0x0f,0x3a,0x02,0x0a,0x0f,0x39,0x01,0x0f,0x39, 0x02,0x10,0x3a,0x03,0x0f,0x39,0x02,0x0e,0x38,0x01,0x0e,0x38,0x03,0x0e,0x37, 0x03,0x0f,0x38,0x02,0x0e,0x38,0x02,0x0e,0x37,0x02,0x84,0x0e,0x36,0x02,0x03, 0x0d,0x36,0x02,0x0e,0x36,0x02,0x0d,0x36,0x01,0x82,0x0d,0x35,0x01,0x83,0x0d, 0x34,0x02,0x82,0x0d,0x33,0x02,0x84,0x0d,0x32,0x02,0x04,0x0d,0x32,0x01,0x0d, 0x31,0x02,0x0d,0x32,0x02,0x0d,0x31,0x03,0x84,0x0d,0x31,0x02,0x01,0x0c,0x2f, 0x00,0x82,0x0d,0x30,0x02,0x07,0x0c,0x2f,0x02,0x0c,0x2f,0x01,0x0c,0x2e,0x01, 0x0d,0x2f,0x02,0x0c,0x2e,0x01,0x0b,0x2d,0x01,0x0c,0x2e,0x02,0x82,0x0c,0x2d, 0x02,0x83,0x0b,0x2d,0x01,0x08,0x0b,0x2c,0x01,0x0b,0x2b,0x01,0x0b,0x2c,0x01, 0x0b,0x2a,0x01,0x0b,0x2b,0x01,0x0b,0x2b,0x02,0x0b,0x2a,0x01,0x0b,0x2a,0x00, 0x82,0x0b,0x2a,0x02,0x03,0x0a,0x29,0x01,0x0b,0x29,0x02,0x09,0x28,0x01,0x82, 0x0b,0x28,0x01,0x82,0x0a,0x28,0x01,0x02,0x09,0x28,0x01,0x09,0x27,0x00,0x83, 0x0a,0x27,0x01,0x02,0x09,0x26,0x01,0x09,0x26,0x00,0x82,0x09,0x26,0x01,0x01, 0x09,0x25,0x00,0x84,0x09,0x24,0x00,0x02,0x09,0x24,0x01,0x09,0x24,0x00,0x83, 0x09,0x23,0x00,0x02,0x09,0x23,0x01,0x09,0x22,0x00,0x82,0x09,0x22,0x01,0x04, 0x08,0x21,0x00,0x08,0x21,0x01,0x08,0x21,0x00,0x08,0x20,0x00,0x82,0x08,0x1f, 0x00,0x01,0x08,0x1f,0x01,0x82,0x07,0x1f,0x00,0x82,0x08,0x1f,0x00,0x04,0x08, 0x1e,0x00,0x08,0x1f,0x00,0x07,0x1e,0x00,0x07,0x1d,0x00,0x82,0x06,0x1d,0x00, 0x02,0x07,0x1c,0x00,0x06,0x1c,0x00,0x82,0x07,0x1c,0x00,0x01,0x07,0x1b,0x00, 0x82,0x06,0x1b,0x00,0x01,0x07,0x1b,0x00,0x83,0x06,0x1b,0x00,0x01,0x05,0x1a, 0x00,0x82,0x06,0x1a,0x00,0x02,0x06,0x19,0x00,0x05,0x19,0x00,0x84,0x05,0x18, 0x00,0x83,0x05,0x17,0x00,0x85,0x05,0x16,0x00,0x82,0x04,0x16,0x00,0x01,0x05, 0x16,0x00,0x82,0x04,0x15,0x00,0x02,0x04,0x14,0x00,0x04,0x15,0x00,0x82,0x04, 0x14,0x00,0x85,0x04,0x13,0x00,0x84,0x04,0x12,0x00,0x01,0x03,0x12,0x00,0x84, 0x04,0x11,0x00,0x02,0x04,0x10,0x00,0x03,0x11,0x00,0x82,0x03,0x10,0x00,0x02, 0x03,0x0f,0x00,0x03,0x10,0x00,0x82,0x03,0x0f,0x00,0x84,0x03,0x0e,0x00,0x83, 0x03,0x0d,0x00,0x85,0x02,0x0d,0x00,0x84,0x02,0x0c,0x00,0x83,0x02,0x0b,0x00, 0x83,0x02,0x0a,0x00,0x88,0x01,0x09,0x00,0x84,0x01,0x08,0x00,0x85,0x01,0x07, 0x00,0x83,0x01,0x06,0x00,0x84,0x00,0x05,0x00,0x87,0x00,0x04,0x00,0x82,0x00, 0x03,0x00,0x82,0x00,0x04,0x00,0x82,0x00,0x03,0x00,0x01,0x01,0x03,0x00,0x82, 0x00,0x02,0x00,0x82,0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x03,0x4a,0xa4,0x17, 0x49,0xa3,0x16,0x48,0xa2,0x15,0x82,0x4a,0xa4,0x17,0x02,0x49,0xa3,0x16,0x48, 0xa2,0x15,0x82,0x4a,0xa4,0x17,0x02,0x4a,0xa3,0x15,0x49,0xa2,0x15,0x82,0x48, 0xa2,0x15,0x82,0x48,0xa1,0x14,0x05,0x47,0xa0,0x15,0x47,0xa0,0x13,0x46,0xa0, 0x12,0x48,0xa2,0x15,0x47,0xa0,0x13,0x83,0x47,0xa1,0x16,0x0a,0x47,0xa0,0x13, 0x47,0xa0,0x15,0x46,0xa0,0x12,0x47,0xa0,0x15,0x47,0xa0,0x17,0x47,0xa0,0x13, 0x47,0xa1,0x16,0x45,0x9f,0x15,0x45,0x9f,0x13,0x46,0xa0,0x14,0x82,0x45,0x9f, 0x13,0x82,0x47,0xa0,0x15,0x83,0x45,0x9f,0x13,0x82,0x44,0x9e,0x14,0x82,0x45, 0x9f,0x15,0x84,0x45,0x9d,0x14,0x03,0x43,0x9d,0x13,0x44,0x9d,0x16,0x44,0x9e, 0x14,0x82,0x43,0x9c,0x15,0x06,0x45,0x9d,0x14,0x44,0x9c,0x15,0x43,0x9c,0x14, 0x43,0x9b,0x17,0x43,0x9b,0x15,0x44,0x9c,0x15,0x83,0x44,0x9c,0x16,0x15,0x43, 0x9b,0x15,0x44,0x9c,0x17,0x42,0x9a,0x14,0x43,0x9b,0x15,0x43,0x9b,0x17,0x42, 0x9b,0x16,0x42,0x9a,0x16,0x44,0x9a,0x17,0x42,0x9c,0x17,0x42,0x9a,0x16,0x43, 0x9b,0x18,0x43,0x99,0x17,0x43,0x9b,0x18,0x42,0x9a,0x17,0x43,0x99,0x17,0x42, 0x98,0x18,0x42,0x9a,0x17,0x45,0x9b,0x19,0x43,0x9a,0x1a,0x44,0x9a,0x18,0x43, 0x99,0x19,0x83,0x43,0x9a,0x1a,0x06,0x42,0x99,0x1a,0x44,0x9b,0x1c,0x45,0x9b, 0x1b,0x43,0x98,0x1a,0x43,0x9a,0x1c,0x42,0x99,0x1c,0x82,0x43,0x9a,0x1b,0x0a, 0x45,0x9a,0x1d,0x43,0x98,0x1c,0x45,0x9a,0x1d,0x43,0x9b,0x1d,0x44,0x99,0x1c, 0x43,0x98,0x1c,0x43,0x9a,0x1c,0x44,0x99,0x1c,0x47,0x97,0x1c,0x44,0x9b,0x1d, 0x84,0x44,0x98,0x1e,0x0c,0x42,0x98,0x1d,0x43,0x97,0x1d,0x44,0x98,0x1e,0x44, 0x98,0x20,0x43,0x97,0x1d,0x44,0x98,0x1e,0x45,0x99,0x1f,0x43,0x97,0x1d,0x43, 0x97,0x1f,0x44,0x98,0x20,0x45,0x99,0x1f,0x44,0x98,0x1e,0x82,0x45,0x99,0x1f, 0x86,0x44,0x98,0x1e,0x01,0x44,0x9a,0x1f,0x82,0x43,0x99,0x1e,0x01,0x45,0x99, 0x1f,0x82,0x45,0x99,0x21,0x09,0x42,0x97,0x1e,0x44,0x98,0x20,0x45,0x99,0x1f, 0x44,0x98,0x1e,0x44,0x98,0x20,0x45,0x99,0x21,0x44,0x98,0x20,0x46,0x9a,0x20, 0x43,0x97,0x1d,0x83,0x43,0x97,0x1f,0x01,0x45,0x99,0x21,0x83,0x43,0x97,0x1d, 0x02,0x43,0x97,0x1f,0x44,0x98,0x20,0x82,0x42,0x97,0x1e,0x02,0x43,0x97,0x1f, 0x44,0x98,0x20,0x82,0x43,0x97,0x1f,0x02,0x42,0x97,0x1e,0x45,0x97,0x1f,0x82, 0x42,0x97,0x1e,0x82,0x43,0x97,0x1f,0x82,0x42,0x97,0x1e,0x01,0x42,0x96,0x1d, 0x82,0x42,0x97,0x1e,0x82,0x43,0x97,0x1f,0x09,0x42,0x96,0x1f,0x42,0x97,0x20, 0x42,0x96,0x1f,0x42,0x94,0x1e,0x43,0x95,0x1d,0x43,0x95,0x1f,0x44,0x96,0x20, 0x42,0x96,0x1f,0x40,0x94,0x1d,0x84,0x43,0x95,0x1f,0x08,0x43,0x95,0x1d,0x42, 0x94,0x1e,0x42,0x93,0x1d,0x42,0x93,0x1e,0x42,0x94,0x1f,0x42,0x93,0x1e,0x42, 0x93,0x1d,0x43,0x95,0x1f,0x84,0x42,0x93,0x1d,0x83,0x42,0x93,0x1e,0x0e,0x41, 0x94,0x1f,0x41,0x92,0x1d,0x42,0x94,0x1f,0x40,0x92,0x1c,0x3e,0x90,0x1b,0x3f, 0x91,0x1c,0x40,0x92,0x1c,0x41,0x91,0x1e,0x42,0x92,0x20,0x42,0x93,0x1e,0x40, 0x92,0x1c,0x3f,0x91,0x1c,0x40,0x92,0x1c,0x40,0x91,0x1e,0x82,0x3e,0x90,0x1b, 0x82,0x41,0x92,0x1d,0x01,0x3e,0x90,0x1b,0x82,0x40,0x92,0x1c,0x01,0x41,0x92, 0x1d,0x82,0x40,0x92,0x1c,0x01,0x42,0x94,0x1c,0x82,0x3f,0x93,0x1b,0x02,0x3e, 0x92,0x1a,0x42,0x96,0x1d,0x82,0x41,0x95,0x1c,0x0a,0x3f,0x93,0x19,0x42,0x97, 0x1c,0x42,0x97,0x1b,0x40,0x94,0x1a,0x42,0x96,0x1c,0x42,0x98,0x1b,0x43,0x99, 0x1e,0x42,0x98,0x1d,0x42,0x98,0x1b,0x41,0x97,0x1c,0x82,0x42,0x96,0x1c,0x01, 0x42,0x97,0x1c,0x82,0x41,0x95,0x1b,0x15,0x42,0x96,0x1c,0x42,0x96,0x1d,0x40, 0x94,0x1d,0x42,0x93,0x1d,0x42,0x93,0x1c,0x42,0x93,0x1d,0x41,0x92,0x1d,0x3f, 0x91,0x1c,0x41,0x92,0x1b,0x42,0x97,0x1e,0x41,0x95,0x1e,0x41,0x95,0x1c,0x42, 0x96,0x1d,0x42,0x97,0x1e,0x41,0x95,0x1c,0x43,0x95,0x1d,0x42,0x94,0x1e,0x41, 0x92,0x1c,0x40,0x92,0x1c,0x41,0x92,0x1d,0x42,0x92,0x1d,0x82,0x40,0x90,0x1c, 0x02,0x41,0x92,0x1d,0x3f,0x91,0x1c,0x83,0x41,0x91,0x1c,0x28,0x3d,0x8e,0x19, 0x3e,0x8e,0x1d,0x3e,0x8e,0x1c,0x40,0x8f,0x1f,0x3e,0x8e,0x1a,0x3e,0x8c,0x1a, 0x40,0x8e,0x1c,0x3a,0x8a,0x17,0x3c,0x8c,0x19,0x3d,0x8b,0x1b,0x3a,0x88,0x17, 0x3c,0x89,0x19,0x3d,0x8a,0x1a,0x3b,0x89,0x18,0x3c,0x89,0x19,0x3b,0x89,0x18, 0x3c,0x89,0x19,0x3c,0x89,0x1b,0x38,0x84,0x17,0x39,0x86,0x18,0x3a,0x87,0x19, 0x3d,0x89,0x1b,0x36,0x82,0x14,0x2b,0x75,0x12,0x22,0x6c,0x07,0x20,0x69,0x08, 0x21,0x68,0x08,0x21,0x6a,0x07,0x21,0x6a,0x09,0x21,0x6b,0x05,0x20,0x69,0x06, 0x21,0x69,0x07,0x20,0x69,0x04,0x21,0x6a,0x08,0x21,0x6a,0x06,0x20,0x68,0x06, 0x1f,0x67,0x07,0x20,0x68,0x07,0x1e,0x66,0x05,0x1c,0x64,0x04,0x82,0x1c,0x63, 0x05,0x02,0x1c,0x62,0x04,0x1d,0x63,0x05,0x82,0x1c,0x61,0x06,0x0d,0x1a,0x60, 0x04,0x1b,0x5e,0x04,0x1a,0x5f,0x04,0x19,0x5e,0x04,0x18,0x5c,0x02,0x19,0x5c, 0x03,0x18,0x5b,0x04,0x18,0x5c,0x04,0x17,0x5a,0x04,0x17,0x59,0x04,0x16,0x59, 0x02,0x17,0x59,0x03,0x17,0x58,0x04,0x82,0x16,0x58,0x02,0x0c,0x16,0x57,0x03, 0x17,0x58,0x03,0x17,0x59,0x04,0x17,0x58,0x01,0x17,0x57,0x03,0x16,0x56,0x02, 0x16,0x57,0x03,0x17,0x57,0x04,0x16,0x56,0x03,0x16,0x55,0x04,0x15,0x56,0x03, 0x15,0x55,0x03,0x82,0x16,0x55,0x03,0x04,0x17,0x54,0x03,0x17,0x55,0x02,0x17, 0x55,0x04,0x17,0x56,0x04,0x82,0x16,0x55,0x04,0x21,0x17,0x55,0x03,0x16,0x54, 0x02,0x15,0x55,0x02,0x16,0x55,0x03,0x16,0x53,0x02,0x17,0x51,0x01,0x18,0x54, 0x04,0x16,0x53,0x03,0x16,0x54,0x03,0x15,0x53,0x03,0x15,0x52,0x02,0x15,0x53, 0x03,0x15,0x53,0x01,0x15,0x52,0x01,0x15,0x54,0x03,0x15,0x50,0x02,0x14,0x51, 0x02,0x15,0x51,0x03,0x15,0x50,0x02,0x14,0x4f,0x01,0x14,0x51,0x03,0x15,0x50, 0x03,0x13,0x4f,0x01,0x14,0x50,0x01,0x15,0x4f,0x03,0x14,0x4f,0x04,0x15,0x4f, 0x01,0x14,0x4d,0x02,0x14,0x4d,0x03,0x14,0x4d,0x02,0x15,0x4e,0x03,0x14,0x4d, 0x02,0x14,0x4d,0x04,0x83,0x14,0x4c,0x02,0x02,0x16,0x4c,0x03,0x13,0x4b,0x02, 0x82,0x14,0x4b,0x02,0x0d,0x14,0x4c,0x03,0x14,0x4c,0x02,0x14,0x4b,0x02,0x13, 0x4a,0x02,0x14,0x4b,0x03,0x13,0x4a,0x02,0x15,0x49,0x04,0x14,0x4a,0x03,0x12, 0x4a,0x02,0x14,0x4a,0x04,0x14,0x4a,0x02,0x12,0x49,0x01,0x13,0x4b,0x04,0x82, 0x13,0x49,0x03,0x04,0x13,0x49,0x04,0x13,0x49,0x02,0x13,0x47,0x01,0x14,0x47, 0x04,0x82,0x13,0x47,0x03,0x06,0x12,0x46,0x02,0x13,0x47,0x03,0x13,0x46,0x01, 0x12,0x46,0x01,0x13,0x46,0x02,0x12,0x47,0x03,0x82,0x12,0x46,0x03,0x0e,0x12, 0x44,0x01,0x12,0x45,0x03,0x12,0x44,0x03,0x12,0x45,0x03,0x12,0x44,0x02,0x12, 0x43,0x01,0x12,0x42,0x03,0x12,0x43,0x03,0x11,0x42,0x02,0x12,0x42,0x03,0x11, 0x42,0x02,0x11,0x41,0x02,0x12,0x42,0x02,0x11,0x41,0x02,0x82,0x12,0x41,0x02, 0x01,0x12,0x41,0x03,0x82,0x12,0x40,0x02,0x03,0x11,0x3f,0x02,0x11,0x3f,0x03, 0x12,0x3e,0x03,0x82,0x11,0x3e,0x02,0x83,0x10,0x3d,0x02,0x02,0x11,0x3e,0x04, 0x0f,0x3d,0x01,0x83,0x10,0x3d,0x02,0x0b,0x11,0x3d,0x03,0x11,0x3c,0x02,0x0f, 0x3b,0x02,0x10,0x3a,0x01,0x11,0x3a,0x02,0x0f,0x3b,0x03,0x0f,0x3a,0x03,0x11, 0x3a,0x02,0x0f,0x3b,0x02,0x10,0x3a,0x03,0x0e,0x38,0x02,0x83,0x0f,0x39,0x02, 0x08,0x0f,0x38,0x02,0x10,0x39,0x03,0x0e,0x38,0x01,0x0f,0x37,0x01,0x0e,0x38, 0x01,0x0e,0x38,0x02,0x0e,0x38,0x01,0x0f,0x37,0x02,0x82,0x0e,0x36,0x02,0x05, 0x0e,0x36,0x03,0x0e,0x36,0x02,0x0e,0x35,0x02,0x0d,0x34,0x02,0x0e,0x35,0x02, 0x82,0x0e,0x35,0x03,0x82,0x0e,0x34,0x01,0x03,0x0e,0x34,0x03,0x0e,0x34,0x02, 0x0e,0x33,0x02,0x83,0x0d,0x33,0x02,0x03,0x0d,0x32,0x01,0x0e,0x33,0x03,0x0e, 0x32,0x03,0x82,0x0c,0x31,0x02,0x08,0x0d,0x31,0x02,0x0d,0x32,0x02,0x0c,0x31, 0x01,0x0d,0x30,0x02,0x0c,0x2f,0x01,0x0d,0x30,0x02,0x0e,0x30,0x03,0x0d,0x2f, 0x02,0x82,0x0c,0x2f,0x02,0x82,0x0d,0x2f,0x02,0x82,0x0c,0x2e,0x02,0x08,0x0b, 0x2d,0x01,0x0b,0x2c,0x01,0x0b,0x2d,0x01,0x0c,0x2d,0x02,0x0c,0x2c,0x02,0x0c, 0x2d,0x02,0x0b,0x2c,0x02,0x0c,0x2b,0x01,0x83,0x0b,0x2a,0x01,0x0f,0x0a,0x2a, 0x01,0x0b,0x2a,0x02,0x0a,0x2a,0x02,0x0b,0x2a,0x02,0x0a,0x2a,0x02,0x0b,0x29, 0x01,0x0b,0x28,0x01,0x09,0x28,0x00,0x0a,0x28,0x01,0x09,0x28,0x01,0x09,0x27, 0x01,0x0a,0x26,0x00,0x0a,0x27,0x01,0x09,0x27,0x01,0x0a,0x27,0x02,0x82,0x09, 0x26,0x01,0x82,0x09,0x25,0x00,0x03,0x0a,0x25,0x01,0x09,0x25,0x00,0x09,0x25, 0x01,0x82,0x09,0x24,0x00,0x82,0x09,0x24,0x01,0x02,0x09,0x23,0x01,0x09,0x23, 0x00,0x82,0x09,0x22,0x01,0x82,0x08,0x22,0x00,0x84,0x08,0x21,0x00,0x82,0x08, 0x20,0x01,0x05,0x09,0x20,0x01,0x08,0x20,0x00,0x07,0x20,0x00,0x07,0x1f,0x00, 0x08,0x1f,0x00,0x82,0x07,0x1e,0x00,0x02,0x08,0x1e,0x00,0x07,0x1e,0x00,0x82, 0x07,0x1d,0x00,0x03,0x06,0x1d,0x00,0x07,0x1c,0x00,0x06,0x1c,0x00,0x83,0x07, 0x1c,0x00,0x02,0x06,0x1b,0x00,0x07,0x1b,0x00,0x82,0x06,0x1b,0x00,0x02,0x06, 0x1a,0x00,0x06,0x1b,0x00,0x82,0x06,0x1a,0x00,0x84,0x06,0x19,0x00,0x03,0x05, 0x18,0x00,0x05,0x17,0x00,0x06,0x18,0x00,0x87,0x05,0x17,0x00,0x01,0x04,0x16, 0x00,0x82,0x05,0x16,0x00,0x83,0x04,0x15,0x00,0x83,0x04,0x14,0x00,0x83,0x04, 0x13,0x00,0x87,0x04,0x12,0x00,0x84,0x04,0x11,0x00,0x02,0x04,0x10,0x00,0x04, 0x11,0x00,0x82,0x03,0x10,0x00,0x84,0x03,0x0f,0x00,0x87,0x03,0x0e,0x00,0x82, 0x02,0x0e,0x00,0x83,0x02,0x0d,0x00,0x84,0x02,0x0c,0x00,0x83,0x02,0x0b,0x00, 0x83,0x02,0x0a,0x00,0x02,0x01,0x09,0x00,0x02,0x09,0x00,0x86,0x01,0x09,0x00, 0x02,0x01,0x08,0x00,0x01,0x09,0x00,0x82,0x01,0x08,0x00,0x85,0x01,0x07,0x00, 0x83,0x01,0x06,0x00,0x01,0x01,0x05,0x00,0x83,0x00,0x05,0x00,0x87,0x00,0x04, 0x00,0x87,0x00,0x03,0x00,0x82,0x00,0x02,0x00,0x82,0x00,0x01,0x00,0xdc,0x00, 0x00,0x00,0x0b,0x48,0xa3,0x14,0x49,0xa3,0x15,0x48,0xa3,0x14,0x4a,0xa4,0x16, 0x49,0xa3,0x15,0x4a,0xa4,0x16,0x48,0xa3,0x14,0x49,0xa3,0x15,0x48,0xa3,0x14, 0x49,0xa3,0x14,0x47,0xa2,0x13,0x82,0x47,0xa2,0x15,0x04,0x48,0xa3,0x14,0x4a, 0xa3,0x17,0x47,0xa2,0x15,0x49,0xa3,0x17,0x83,0x47,0xa2,0x15,0x82,0x46,0xa1, 0x14,0x06,0x48,0xa3,0x16,0x45,0xa0,0x13,0x46,0xa1,0x16,0x46,0xa1,0x14,0x47, 0xa0,0x16,0x45,0xa0,0x15,0x82,0x45,0xa0,0x13,0x03,0x45,0xa0,0x15,0x46,0x9f, 0x15,0x45,0xa0,0x15,0x82,0x45,0x9f,0x14,0x82,0x45,0xa0,0x15,0x83,0x45,0x9f, 0x14,0x02,0x45,0x9e,0x14,0x45,0x9e,0x13,0x82,0x44,0x9d,0x13,0x83,0x45,0x9e, 0x13,0x04,0x44,0x9d,0x13,0x44,0x9d,0x14,0x43,0x9d,0x14,0x43,0x9e,0x13,0x82, 0x42,0x9c,0x13,0x04,0x43,0x9c,0x13,0x43,0x9b,0x14,0x44,0x9d,0x14,0x43,0x9b, 0x16,0x82,0x43,0x9b,0x14,0x03,0x43,0x9b,0x16,0x42,0x9a,0x15,0x43,0x9b,0x14, 0x83,0x43,0x9b,0x16,0x09,0x44,0x9c,0x17,0x43,0x9b,0x16,0x41,0x9a,0x17,0x41, 0x99,0x16,0x43,0x99,0x17,0x41,0x9a,0x17,0x42,0x9a,0x17,0x43,0x9b,0x18,0x42, 0x9b,0x19,0x82,0x42,0x99,0x18,0x0d,0x42,0x9b,0x19,0x42,0x99,0x18,0x43,0x99, 0x18,0x43,0x9a,0x19,0x42,0x99,0x18,0x43,0x99,0x19,0x43,0x99,0x18,0x42,0x99, 0x18,0x41,0x99,0x18,0x43,0x9a,0x1a,0x42,0x99,0x19,0x43,0x9a,0x1c,0x43,0x9a, 0x19,0x82,0x43,0x9a,0x1a,0x01,0x43,0x99,0x19,0x82,0x44,0x99,0x1a,0x03,0x43, 0x9a,0x1c,0x42,0x99,0x1b,0x45,0x98,0x1b,0x83,0x43,0x98,0x1d,0x04,0x43,0x99, 0x1d,0x44,0x99,0x1d,0x44,0x99,0x1c,0x43,0x9b,0x1d,0x82,0x44,0x99,0x1d,0x02, 0x44,0x99,0x1f,0x43,0x98,0x1e,0x82,0x43,0x98,0x1d,0x82,0x43,0x98,0x1e,0x03, 0x45,0x98,0x1d,0x44,0x99,0x1d,0x45,0x98,0x1d,0x82,0x43,0x98,0x1d,0x02,0x45, 0x99,0x1d,0x42,0x99,0x1d,0x82,0x44,0x99,0x1d,0x01,0x45,0x99,0x1e,0x84,0x44, 0x99,0x1f,0x82,0x43,0x98,0x1e,0x03,0x43,0x99,0x1d,0x42,0x99,0x1d,0x44,0x9a, 0x20,0x82,0x44,0x99,0x1f,0x05,0x45,0x99,0x20,0x42,0x97,0x1d,0x44,0x99,0x1f, 0x44,0x99,0x1d,0x45,0x99,0x1e,0x82,0x44,0x99,0x1f,0x04,0x42,0x97,0x1d,0x43, 0x98,0x1e,0x44,0x99,0x1f,0x43,0x98,0x1e,0x82,0x44,0x99,0x1f,0x02,0x45,0x9a, 0x21,0x44,0x99,0x1f,0x82,0x43,0x98,0x1e,0x02,0x44,0x99,0x1f,0x43,0x98,0x1e, 0x83,0x42,0x97,0x1d,0x83,0x44,0x99,0x1f,0x04,0x44,0x96,0x1d,0x45,0x98,0x1f, 0x43,0x98,0x1e,0x42,0x97,0x1d,0x82,0x43,0x98,0x1e,0x11,0x42,0x97,0x1d,0x44, 0x99,0x1f,0x43,0x98,0x1e,0x44,0x99,0x1f,0x42,0x97,0x1d,0x43,0x98,0x1e,0x42, 0x97,0x1d,0x41,0x96,0x1e,0x42,0x97,0x1f,0x41,0x96,0x1e,0x43,0x95,0x1e,0x45, 0x97,0x1e,0x43,0x95,0x1e,0x41,0x96,0x1e,0x42,0x97,0x1f,0x41,0x96,0x1e,0x43, 0x95,0x1e,0x83,0x44,0x96,0x1f,0x04,0x42,0x94,0x1c,0x40,0x95,0x1d,0x41,0x96, 0x1e,0x44,0x96,0x1f,0x82,0x41,0x94,0x1d,0x05,0x43,0x95,0x1e,0x41,0x94,0x1d, 0x45,0x97,0x20,0x40,0x93,0x1c,0x43,0x95,0x1e,0x82,0x41,0x94,0x1d,0x05,0x40, 0x92,0x1c,0x41,0x94,0x1d,0x40,0x94,0x1e,0x40,0x93,0x1d,0x42,0x94,0x1e,0x82, 0x40,0x93,0x1d,0x82,0x40,0x92,0x1c,0x11,0x40,0x91,0x1d,0x41,0x92,0x1e,0x41, 0x94,0x1d,0x3f,0x91,0x1b,0x40,0x92,0x1c,0x40,0x93,0x1d,0x3f,0x91,0x1b,0x40, 0x92,0x1c,0x40,0x93,0x1d,0x41,0x94,0x1d,0x40,0x92,0x1b,0x40,0x92,0x1c,0x3e, 0x90,0x1a,0x40,0x91,0x1d,0x40,0x93,0x1d,0x40,0x92,0x1c,0x42,0x94,0x1d,0x83, 0x40,0x95,0x1c,0x09,0x41,0x96,0x1d,0x3f,0x94,0x1a,0x42,0x97,0x1d,0x40,0x95, 0x1c,0x41,0x96,0x1b,0x42,0x97,0x1c,0x3f,0x95,0x1b,0x41,0x98,0x1c,0x43,0x99, 0x1d,0x82,0x43,0x9a,0x1c,0x10,0x41,0x98,0x1c,0x43,0x99,0x1d,0x40,0x96,0x1c, 0x41,0x96,0x1b,0x43,0x98,0x1d,0x40,0x94,0x1b,0x40,0x95,0x1c,0x43,0x98,0x1e, 0x44,0x99,0x1f,0x42,0x97,0x1d,0x40,0x95,0x1c,0x40,0x93,0x1a,0x40,0x92,0x1b, 0x3f,0x93,0x1d,0x3f,0x94,0x1c,0x42,0x94,0x1d,0x82,0x40,0x94,0x1d,0x02,0x41, 0x96,0x1d,0x42,0x97,0x1c,0x82,0x41,0x96,0x1d,0x82,0x43,0x98,0x1e,0x0f,0x41, 0x94,0x1d,0x40,0x92,0x1b,0x43,0x95,0x1e,0x40,0x91,0x1d,0x41,0x92,0x1e,0x42, 0x93,0x1f,0x3f,0x8f,0x1c,0x41,0x92,0x1e,0x40,0x91,0x1d,0x42,0x93,0x1f,0x40, 0x91,0x1d,0x3f,0x8f,0x1c,0x40,0x90,0x1d,0x40,0x91,0x1c,0x40,0x91,0x1b,0x82, 0x3f,0x8f,0x1a,0x04,0x3c,0x8d,0x19,0x3f,0x8f,0x1c,0x3e,0x8f,0x1b,0x3d,0x8e, 0x1a,0x82,0x3b,0x8c,0x18,0x04,0x3b,0x8b,0x1a,0x3a,0x8a,0x18,0x3e,0x8c,0x1b, 0x3d,0x8b,0x18,0x82,0x3b,0x8a,0x18,0x01,0x3a,0x88,0x17,0x82,0x3b,0x8a,0x18, 0x82,0x39,0x86,0x18,0x23,0x3b,0x89,0x1b,0x3b,0x88,0x1a,0x3a,0x86,0x1a,0x2c, 0x77,0x0f,0x25,0x6f,0x0b,0x1f,0x69,0x07,0x1e,0x68,0x06,0x22,0x6c,0x08,0x20, 0x6a,0x06,0x21,0x6b,0x05,0x21,0x6a,0x07,0x20,0x69,0x08,0x21,0x69,0x07,0x22, 0x6b,0x06,0x20,0x69,0x04,0x20,0x68,0x07,0x1f,0x68,0x08,0x1e,0x67,0x05,0x1d, 0x64,0x05,0x1d,0x63,0x04,0x1c,0x62,0x04,0x1d,0x63,0x04,0x1c,0x61,0x04,0x1d, 0x62,0x04,0x1c,0x63,0x04,0x1b,0x5f,0x04,0x1c,0x60,0x05,0x19,0x5f,0x04,0x1a, 0x5e,0x04,0x19,0x5e,0x04,0x18,0x5d,0x03,0x18,0x5d,0x04,0x17,0x5b,0x03,0x17, 0x59,0x04,0x16,0x59,0x02,0x82,0x17,0x59,0x04,0x04,0x16,0x59,0x02,0x17,0x59, 0x03,0x18,0x59,0x04,0x17,0x59,0x03,0x82,0x16,0x57,0x03,0x01,0x17,0x58,0x03, 0x82,0x16,0x57,0x04,0x05,0x16,0x57,0x03,0x16,0x57,0x01,0x17,0x58,0x04,0x18, 0x57,0x04,0x17,0x57,0x04,0x82,0x16,0x57,0x04,0x01,0x17,0x56,0x04,0x82,0x16, 0x55,0x01,0x84,0x16,0x55,0x04,0x08,0x14,0x54,0x01,0x15,0x55,0x02,0x15,0x54, 0x02,0x16,0x55,0x03,0x16,0x54,0x02,0x17,0x52,0x03,0x17,0x53,0x04,0x16,0x53, 0x04,0x82,0x16,0x54,0x04,0x04,0x15,0x54,0x03,0x14,0x53,0x00,0x16,0x52,0x01, 0x16,0x52,0x03,0x82,0x14,0x52,0x02,0x0c,0x17,0x50,0x03,0x15,0x52,0x03,0x15, 0x50,0x02,0x15,0x50,0x03,0x15,0x51,0x03,0x14,0x51,0x01,0x14,0x50,0x01,0x15, 0x51,0x03,0x15,0x50,0x03,0x14,0x4f,0x01,0x15,0x4f,0x01,0x16,0x4f,0x03,0x82, 0x15,0x4f,0x02,0x11,0x14,0x4d,0x02,0x14,0x4e,0x02,0x14,0x4e,0x01,0x14,0x4d, 0x01,0x13,0x4c,0x02,0x14,0x4d,0x02,0x14,0x4c,0x01,0x15,0x4d,0x03,0x13,0x4b, 0x02,0x14,0x4b,0x02,0x14,0x4b,0x01,0x13,0x4b,0x01,0x13,0x4b,0x02,0x13,0x4a, 0x02,0x16,0x4a,0x03,0x13,0x4a,0x04,0x15,0x49,0x04,0x82,0x13,0x4a,0x02,0x82, 0x13,0x4a,0x01,0x82,0x13,0x4a,0x04,0x0a,0x13,0x4a,0x03,0x13,0x4a,0x04,0x14, 0x49,0x02,0x13,0x48,0x01,0x13,0x47,0x02,0x13,0x47,0x03,0x13,0x48,0x04,0x13, 0x49,0x04,0x13,0x46,0x03,0x13,0x45,0x02,0x82,0x13,0x47,0x03,0x01,0x13,0x46, 0x03,0x82,0x13,0x45,0x03,0x02,0x12,0x45,0x03,0x11,0x44,0x01,0x82,0x13,0x45, 0x03,0x07,0x12,0x45,0x01,0x13,0x44,0x02,0x13,0x43,0x03,0x12,0x43,0x02,0x11, 0x42,0x01,0x12,0x44,0x03,0x12,0x42,0x03,0x82,0x12,0x42,0x02,0x02,0x11,0x41, 0x02,0x11,0x40,0x02,0x82,0x11,0x41,0x02,0x0d,0x12,0x40,0x02,0x10,0x40,0x01, 0x10,0x3f,0x01,0x11,0x40,0x02,0x12,0x3f,0x02,0x10,0x3e,0x01,0x11,0x3f,0x02, 0x10,0x3e,0x02,0x10,0x3e,0x03,0x11,0x3e,0x04,0x10,0x3e,0x02,0x11,0x3c,0x01, 0x11,0x3c,0x02,0x82,0x10,0x3d,0x02,0x09,0x0f,0x3d,0x02,0x10,0x3b,0x02,0x0f, 0x3b,0x02,0x11,0x3b,0x02,0x11,0x3b,0x00,0x10,0x3b,0x02,0x10,0x3b,0x03,0x10, 0x3b,0x02,0x0e,0x39,0x01,0x83,0x0f,0x3a,0x03,0x82,0x0f,0x39,0x01,0x0d,0x0f, 0x39,0x02,0x10,0x39,0x02,0x10,0x38,0x01,0x0f,0x38,0x02,0x0e,0x38,0x01,0x10, 0x37,0x02,0x0f,0x38,0x02,0x0f,0x39,0x03,0x0e,0x38,0x02,0x0e,0x36,0x02,0x0e, 0x36,0x03,0x0e,0x35,0x01,0x0e,0x35,0x02,0x82,0x0e,0x36,0x02,0x82,0x0e,0x35, 0x02,0x04,0x0d,0x36,0x01,0x0e,0x35,0x02,0x0d,0x34,0x02,0x0e,0x35,0x02,0x82, 0x0d,0x33,0x02,0x04,0x0d,0x33,0x01,0x0d,0x32,0x02,0x0d,0x33,0x02,0x0d,0x32, 0x02,0x83,0x0d,0x31,0x02,0x02,0x0d,0x31,0x03,0x0c,0x31,0x02,0x82,0x0d,0x31, 0x01,0x06,0x0c,0x31,0x01,0x0c,0x30,0x02,0x0d,0x30,0x02,0x0d,0x30,0x01,0x0c, 0x30,0x01,0x0b,0x30,0x01,0x82,0x0c,0x2f,0x01,0x02,0x0b,0x2f,0x01,0x0c,0x2e, 0x02,0x82,0x0b,0x2d,0x01,0x01,0x0c,0x2d,0x02,0x82,0x0b,0x2c,0x00,0x04,0x0c, 0x2c,0x01,0x0b,0x2c,0x00,0x0b,0x2b,0x01,0x0c,0x2b,0x01,0x82,0x0b,0x2b,0x01, 0x02,0x0a,0x2a,0x01,0x0b,0x2b,0x01,0x82,0x0a,0x2a,0x01,0x0e,0x0b,0x29,0x01, 0x0b,0x2a,0x01,0x0b,0x28,0x01,0x0a,0x29,0x01,0x0a,0x28,0x01,0x09,0x28,0x01, 0x0b,0x27,0x01,0x09,0x27,0x01,0x0a,0x27,0x01,0x09,0x27,0x00,0x0a,0x26,0x01, 0x09,0x27,0x01,0x09,0x27,0x00,0x09,0x26,0x00,0x82,0x09,0x27,0x01,0x08,0x09, 0x25,0x01,0x09,0x25,0x00,0x09,0x25,0x01,0x09,0x24,0x01,0x09,0x25,0x01,0x09, 0x24,0x01,0x09,0x23,0x01,0x09,0x23,0x00,0x83,0x09,0x22,0x01,0x03,0x08,0x22, 0x01,0x09,0x22,0x01,0x08,0x22,0x00,0x82,0x09,0x21,0x00,0x02,0x08,0x20,0x00, 0x08,0x20,0x01,0x82,0x08,0x21,0x00,0x82,0x08,0x20,0x00,0x01,0x07,0x1f,0x01, 0x82,0x07,0x1e,0x00,0x82,0x08,0x1e,0x00,0x01,0x07,0x1d,0x00,0x82,0x06,0x1d, 0x00,0x84,0x07,0x1d,0x00,0x82,0x07,0x1c,0x00,0x01,0x07,0x1b,0x00,0x82,0x06, 0x1b,0x00,0x84,0x06,0x1a,0x00,0x02,0x06,0x19,0x00,0x05,0x19,0x00,0x82,0x06, 0x19,0x00,0x82,0x05,0x18,0x00,0x01,0x06,0x18,0x00,0x82,0x05,0x18,0x00,0x02, 0x05,0x17,0x00,0x05,0x18,0x00,0x83,0x05,0x17,0x00,0x01,0x04,0x16,0x00,0x82, 0x05,0x16,0x00,0x83,0x05,0x15,0x00,0x83,0x04,0x14,0x00,0x87,0x04,0x13,0x00, 0x83,0x04,0x12,0x00,0x06,0x04,0x11,0x00,0x04,0x12,0x00,0x04,0x11,0x00,0x03, 0x11,0x00,0x04,0x11,0x00,0x03,0x11,0x00,0x82,0x03,0x10,0x00,0x83,0x03,0x0f, 0x00,0x01,0x03,0x0e,0x00,0x83,0x02,0x0e,0x00,0x02,0x03,0x0e,0x00,0x02,0x0e, 0x00,0x84,0x03,0x0e,0x00,0x82,0x02,0x0d,0x00,0x02,0x02,0x0c,0x00,0x02,0x0d, 0x00,0x83,0x02,0x0c,0x00,0x83,0x02,0x0b,0x00,0x83,0x02,0x0a,0x00,0x88,0x01, 0x09,0x00,0x84,0x01,0x08,0x00,0x84,0x01,0x07,0x00,0x01,0x01,0x06,0x00,0x83, 0x00,0x06,0x00,0x84,0x00,0x05,0x00,0x87,0x00,0x04,0x00,0x83,0x00,0x03,0x00, 0x86,0x00,0x02,0x00,0x82,0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x01,0x49,0xa5, 0x17,0x82,0x48,0xa4,0x16,0x01,0x4a,0xa6,0x18,0x84,0x48,0xa3,0x15,0x01,0x49, 0xa3,0x16,0x83,0x48,0xa3,0x15,0x01,0x47,0xa2,0x14,0x82,0x48,0xa3,0x15,0x01, 0x48,0xa1,0x16,0x82,0x48,0xa3,0x17,0x08,0x46,0xa1,0x15,0x47,0xa2,0x16,0x46, 0xa1,0x15,0x47,0xa1,0x15,0x47,0xa2,0x16,0x46,0xa1,0x15,0x45,0xa1,0x14,0x45, 0xa0,0x16,0x82,0x46,0xa0,0x14,0x01,0x44,0xa0,0x14,0x82,0x45,0xa1,0x14,0x82, 0x45,0x9f,0x15,0x82,0x45,0x9f,0x14,0x82,0x44,0xa0,0x14,0x82,0x45,0x9f,0x15, 0x84,0x44,0x9e,0x14,0x02,0x43,0x9d,0x14,0x43,0x9e,0x14,0x82,0x43,0x9d,0x14, 0x09,0x43,0x9e,0x14,0x43,0x9d,0x14,0x43,0x9c,0x14,0x44,0x9e,0x14,0x43,0x9e, 0x15,0x43,0x9c,0x14,0x43,0x9c,0x13,0x42,0x9b,0x14,0x41,0x9a,0x12,0x83,0x42, 0x9b,0x14,0x05,0x42,0x9b,0x16,0x41,0x9a,0x15,0x42,0x9b,0x14,0x43,0x9c,0x15, 0x43,0x9c,0x17,0x83,0x42,0x9b,0x16,0x06,0x41,0x9b,0x16,0x43,0x9a,0x18,0x42, 0x99,0x17,0x40,0x9a,0x17,0x42,0x9a,0x18,0x41,0x99,0x17,0x82,0x43,0x9b,0x19, 0x83,0x41,0x99,0x17,0x03,0x43,0x9a,0x18,0x42,0x9a,0x19,0x43,0x9b,0x1a,0x82, 0x43,0x99,0x19,0x01,0x43,0x9b,0x19,0x83,0x42,0x9a,0x19,0x03,0x42,0x99,0x1c, 0x43,0x99,0x19,0x41,0x99,0x18,0x82,0x43,0x9c,0x1a,0x04,0x44,0x9b,0x1c,0x43, 0x9a,0x1b,0x43,0x99,0x1d,0x43,0x98,0x1c,0x82,0x41,0x98,0x1b,0x82,0x43,0x99, 0x1d,0x05,0x43,0x9a,0x1d,0x43,0x99,0x1d,0x45,0x99,0x1d,0x42,0x99,0x1c,0x42, 0x97,0x1d,0x82,0x43,0x98,0x1e,0x82,0x43,0x99,0x1f,0x0b,0x43,0x98,0x1c,0x43, 0x98,0x1e,0x42,0x97,0x1d,0x43,0x98,0x1c,0x45,0x99,0x1d,0x42,0x99,0x1c,0x43, 0x98,0x1e,0x43,0x97,0x1d,0x43,0x99,0x1f,0x45,0x98,0x1f,0x43,0x9b,0x1e,0x83, 0x43,0x98,0x1e,0x83,0x43,0x99,0x1f,0x82,0x43,0x98,0x1e,0x01,0x43,0x99,0x1d, 0x82,0x43,0x9a,0x1f,0x82,0x43,0x98,0x1e,0x82,0x43,0x99,0x1f,0x0c,0x44,0x9a, 0x1f,0x43,0x98,0x1c,0x44,0x9a,0x1e,0x45,0x9b,0x20,0x44,0x9a,0x1f,0x43,0x99, 0x1f,0x43,0x98,0x1e,0x43,0x99,0x1f,0x43,0x98,0x1e,0x42,0x97,0x1d,0x43,0x98, 0x1e,0x45,0x9b,0x20,0x82,0x43,0x98,0x1e,0x02,0x44,0x9a,0x1f,0x43,0x99,0x1f, 0x82,0x42,0x97,0x1d,0x02,0x43,0x99,0x1f,0x44,0x9a,0x1f,0x82,0x43,0x99,0x1f, 0x03,0x42,0x97,0x1d,0x41,0x97,0x1c,0x43,0x97,0x1d,0x87,0x43,0x98,0x1e,0x06, 0x43,0x99,0x1f,0x44,0x9a,0x1f,0x43,0x99,0x1f,0x41,0x97,0x1c,0x41,0x97,0x1e, 0x43,0x98,0x1f,0x82,0x41,0x97,0x1e,0x01,0x43,0x98,0x1f,0x82,0x41,0x97,0x1e, 0x0e,0x42,0x97,0x1f,0x41,0x97,0x1e,0x40,0x96,0x1d,0x43,0x96,0x1e,0x42,0x97, 0x1f,0x41,0x97,0x1e,0x42,0x97,0x1f,0x40,0x96,0x1d,0x41,0x97,0x1e,0x42,0x97, 0x1f,0x40,0x96,0x1d,0x41,0x97,0x1e,0x43,0x97,0x1f,0x41,0x94,0x1c,0x82,0x43, 0x96,0x1e,0x82,0x42,0x95,0x1d,0x04,0x43,0x97,0x1f,0x41,0x94,0x1d,0x42,0x95, 0x1e,0x41,0x96,0x1f,0x82,0x41,0x94,0x1d,0x01,0x40,0x93,0x1c,0x84,0x42,0x95, 0x1e,0x03,0x41,0x94,0x1d,0x3f,0x94,0x1d,0x3f,0x92,0x1b,0x82,0x41,0x94,0x1d, 0x01,0x3f,0x92,0x1b,0x82,0x40,0x93,0x1c,0x13,0x3e,0x91,0x1a,0x40,0x93,0x1c, 0x41,0x94,0x1d,0x42,0x95,0x1e,0x3f,0x92,0x1b,0x40,0x93,0x1c,0x3f,0x95,0x1c, 0x40,0x96,0x1d,0x3e,0x94,0x1b,0x40,0x96,0x1b,0x41,0x97,0x1c,0x40,0x96,0x1b, 0x3e,0x94,0x1a,0x40,0x96,0x1b,0x43,0x98,0x1e,0x42,0x97,0x1b,0x41,0x97,0x1a, 0x43,0x9a,0x1f,0x42,0x9a,0x19,0x82,0x43,0x9b,0x1b,0x09,0x42,0x9a,0x19,0x41, 0x99,0x1a,0x43,0x9b,0x1b,0x43,0x9c,0x1c,0x43,0x98,0x1c,0x43,0x99,0x1d,0x40, 0x96,0x1b,0x43,0x98,0x1f,0x41,0x97,0x1c,0x82,0x43,0x98,0x1e,0x02,0x43,0x98, 0x1c,0x43,0x96,0x1e,0x82,0x41,0x97,0x1e,0x04,0x3f,0x95,0x1c,0x42,0x97,0x1f, 0x3f,0x95,0x1c,0x3e,0x94,0x1a,0x82,0x43,0x98,0x1e,0x02,0x43,0x99,0x1f,0x42, 0x97,0x1d,0x82,0x43,0x98,0x1e,0x01,0x43,0x96,0x1e,0x82,0x42,0x95,0x1d,0x06, 0x43,0x94,0x1f,0x3f,0x91,0x1d,0x41,0x93,0x1f,0x42,0x94,0x1f,0x3f,0x91,0x1c, 0x41,0x92,0x1e,0x82,0x43,0x94,0x1f,0x82,0x41,0x92,0x1e,0x14,0x41,0x92,0x1c, 0x40,0x91,0x1d,0x3d,0x8e,0x1a,0x3d,0x8d,0x1b,0x3e,0x8f,0x1a,0x41,0x92,0x1c, 0x3e,0x8f,0x1a,0x3c,0x8d,0x17,0x3e,0x90,0x1a,0x40,0x91,0x1d,0x3d,0x8e,0x1a, 0x3a,0x8b,0x19,0x3e,0x8c,0x19,0x3e,0x8d,0x1a,0x3e,0x8c,0x19,0x3c,0x8b,0x17, 0x3c,0x8b,0x19,0x3d,0x8c,0x1a,0x39,0x8a,0x18,0x3b,0x89,0x1a,0x82,0x39,0x87, 0x17,0x1c,0x3a,0x89,0x17,0x3a,0x88,0x1a,0x3a,0x88,0x19,0x39,0x85,0x19,0x2e, 0x7a,0x0f,0x24,0x70,0x08,0x20,0x6b,0x08,0x21,0x6c,0x09,0x21,0x6c,0x05,0x24, 0x6d,0x0a,0x22,0x6c,0x08,0x1f,0x68,0x07,0x22,0x6b,0x08,0x21,0x6b,0x05,0x20, 0x68,0x06,0x1f,0x68,0x07,0x1e,0x67,0x06,0x1e,0x66,0x06,0x1f,0x65,0x06,0x1c, 0x63,0x04,0x1d,0x63,0x06,0x1c,0x62,0x05,0x1b,0x63,0x05,0x1a,0x62,0x05,0x1c, 0x61,0x04,0x1b,0x62,0x04,0x1a,0x60,0x04,0x1a,0x5f,0x05,0x82,0x1a,0x5e,0x04, 0x06,0x19,0x5d,0x03,0x18,0x5c,0x02,0x17,0x5b,0x03,0x18,0x5b,0x05,0x17,0x5b, 0x03,0x17,0x5a,0x03,0x82,0x16,0x58,0x03,0x01,0x18,0x5a,0x04,0x82,0x15,0x57, 0x02,0x02,0x16,0x58,0x03,0x17,0x58,0x04,0x82,0x16,0x57,0x03,0x05,0x17,0x58, 0x04,0x16,0x58,0x01,0x15,0x57,0x02,0x18,0x57,0x03,0x16,0x57,0x03,0x82,0x15, 0x57,0x03,0x01,0x15,0x56,0x03,0x82,0x15,0x55,0x02,0x04,0x17,0x55,0x03,0x15, 0x55,0x03,0x16,0x56,0x04,0x16,0x55,0x04,0x83,0x15,0x55,0x04,0x05,0x17,0x55, 0x04,0x15,0x53,0x03,0x15,0x54,0x04,0x16,0x53,0x02,0x16,0x52,0x01,0x82,0x15, 0x53,0x04,0x82,0x15,0x54,0x03,0x12,0x18,0x53,0x01,0x16,0x53,0x03,0x17,0x51, 0x02,0x14,0x53,0x02,0x16,0x52,0x03,0x15,0x53,0x03,0x15,0x52,0x03,0x15,0x53, 0x03,0x16,0x52,0x03,0x16,0x52,0x02,0x15,0x50,0x03,0x14,0x50,0x02,0x14,0x51, 0x01,0x14,0x50,0x00,0x14,0x50,0x01,0x16,0x50,0x02,0x15,0x4f,0x02,0x15,0x4e, 0x01,0x82,0x14,0x4e,0x02,0x06,0x14,0x4e,0x01,0x15,0x4e,0x02,0x14,0x4e,0x01, 0x14,0x4d,0x02,0x14,0x4d,0x01,0x13,0x4c,0x03,0x82,0x14,0x4c,0x02,0x11,0x14, 0x4c,0x01,0x14,0x4d,0x02,0x15,0x4e,0x03,0x14,0x4b,0x02,0x15,0x4a,0x02,0x14, 0x4b,0x02,0x13,0x49,0x01,0x14,0x4b,0x03,0x14,0x4a,0x02,0x14,0x49,0x02,0x14, 0x4b,0x04,0x14,0x4a,0x03,0x14,0x4b,0x04,0x14,0x48,0x02,0x14,0x49,0x03,0x14, 0x49,0x02,0x14,0x49,0x04,0x84,0x13,0x48,0x03,0x09,0x14,0x46,0x02,0x14,0x47, 0x03,0x13,0x48,0x03,0x12,0x47,0x02,0x13,0x46,0x02,0x13,0x45,0x02,0x12,0x45, 0x02,0x12,0x46,0x03,0x12,0x44,0x02,0x82,0x12,0x45,0x03,0x05,0x11,0x44,0x02, 0x13,0x44,0x03,0x12,0x43,0x02,0x12,0x43,0x03,0x12,0x43,0x02,0x82,0x12,0x43, 0x03,0x82,0x12,0x43,0x02,0x03,0x11,0x42,0x02,0x11,0x41,0x02,0x12,0x42,0x02, 0x82,0x11,0x41,0x02,0x0a,0x12,0x41,0x02,0x11,0x41,0x02,0x11,0x40,0x02,0x11, 0x3f,0x02,0x11,0x40,0x02,0x11,0x3f,0x02,0x10,0x3e,0x02,0x10,0x3e,0x01,0x11, 0x3e,0x02,0x10,0x3e,0x01,0x82,0x11,0x3e,0x02,0x11,0x0f,0x3c,0x00,0x10,0x3d, 0x02,0x10,0x3e,0x02,0x10,0x3d,0x01,0x11,0x3c,0x02,0x0f,0x3c,0x02,0x10,0x3c, 0x03,0x0f,0x3c,0x03,0x0f,0x3b,0x03,0x10,0x3b,0x02,0x10,0x3b,0x01,0x0f,0x3a, 0x03,0x10,0x3b,0x04,0x0f,0x3b,0x02,0x0f,0x3a,0x01,0x0f,0x3a,0x02,0x0f,0x39, 0x02,0x82,0x10,0x39,0x01,0x01,0x0f,0x39,0x01,0x82,0x0f,0x39,0x02,0x01,0x0f, 0x37,0x01,0x82,0x0f,0x39,0x02,0x01,0x0e,0x37,0x02,0x82,0x0e,0x36,0x02,0x0a, 0x0f,0x36,0x02,0x0e,0x36,0x02,0x0e,0x35,0x02,0x0d,0x34,0x01,0x0e,0x34,0x02, 0x0d,0x35,0x01,0x0e,0x35,0x01,0x0d,0x34,0x02,0x0d,0x34,0x01,0x0c,0x33,0x01, 0x82,0x0d,0x34,0x01,0x02,0x0d,0x33,0x02,0x0d,0x34,0x02,0x82,0x0d,0x33,0x02, 0x11,0x0d,0x32,0x02,0x0c,0x32,0x02,0x0d,0x32,0x02,0x0d,0x31,0x02,0x0d,0x32, 0x01,0x0d,0x31,0x01,0x0d,0x32,0x01,0x0d,0x30,0x02,0x0c,0x30,0x01,0x0d,0x30, 0x02,0x0d,0x30,0x03,0x0c,0x2f,0x02,0x0c,0x2e,0x01,0x0e,0x2f,0x02,0x0c,0x2f, 0x02,0x0b,0x2e,0x01,0x0b,0x2e,0x02,0x82,0x0c,0x2e,0x02,0x01,0x0c,0x2e,0x01, 0x82,0x0c,0x2d,0x01,0x03,0x0b,0x2d,0x01,0x0b,0x2c,0x00,0x0b,0x2c,0x02,0x83, 0x0b,0x2b,0x01,0x02,0x0b,0x2b,0x02,0x0a,0x2a,0x01,0x82,0x0b,0x2a,0x02,0x01, 0x0c,0x2a,0x02,0x82,0x0a,0x29,0x01,0x01,0x0b,0x29,0x01,0x83,0x0a,0x29,0x01, 0x03,0x0a,0x27,0x00,0x0a,0x28,0x01,0x0a,0x27,0x01,0x82,0x0a,0x27,0x00,0x82, 0x0a,0x26,0x00,0x01,0x0a,0x26,0x01,0x82,0x09,0x25,0x00,0x01,0x09,0x25,0x01, 0x82,0x0a,0x25,0x01,0x07,0x09,0x24,0x00,0x0a,0x24,0x00,0x0a,0x24,0x01,0x09, 0x24,0x01,0x09,0x23,0x00,0x09,0x23,0x01,0x09,0x23,0x00,0x82,0x09,0x22,0x00, 0x82,0x08,0x22,0x00,0x82,0x08,0x21,0x00,0x03,0x08,0x21,0x01,0x08,0x20,0x01, 0x07,0x20,0x00,0x82,0x07,0x1f,0x00,0x01,0x08,0x1f,0x00,0x82,0x07,0x1f,0x00, 0x01,0x08,0x1f,0x00,0x82,0x07,0x1e,0x00,0x02,0x07,0x1d,0x00,0x06,0x1d,0x00, 0x82,0x07,0x1d,0x00,0x01,0x06,0x1c,0x00,0x83,0x07,0x1c,0x00,0x83,0x06,0x1b, 0x00,0x03,0x06,0x1a,0x00,0x07,0x1b,0x01,0x07,0x1a,0x00,0x84,0x06,0x1a,0x00, 0x03,0x05,0x19,0x00,0x05,0x18,0x00,0x06,0x19,0x00,0x84,0x05,0x18,0x00,0x83, 0x05,0x17,0x00,0x83,0x05,0x16,0x00,0x01,0x05,0x15,0x00,0x83,0x05,0x14,0x00, 0x01,0x04,0x14,0x00,0x83,0x05,0x14,0x00,0x01,0x04,0x14,0x00,0x84,0x04,0x13, 0x00,0x83,0x04,0x12,0x00,0x84,0x04,0x11,0x00,0x82,0x04,0x10,0x00,0x82,0x03, 0x10,0x00,0x86,0x03,0x0f,0x00,0x02,0x02,0x0f,0x00,0x03,0x0f,0x00,0x83,0x03, 0x0e,0x00,0x86,0x02,0x0d,0x00,0x82,0x02,0x0c,0x00,0x84,0x02,0x0b,0x00,0x83, 0x02,0x0a,0x00,0x84,0x01,0x0a,0x00,0x84,0x01,0x09,0x00,0x83,0x01,0x08,0x00, 0x85,0x01,0x07,0x00,0x82,0x01,0x06,0x00,0x01,0x00,0x06,0x00,0x88,0x00,0x05, 0x00,0x84,0x00,0x04,0x00,0x83,0x00,0x03,0x00,0x83,0x00,0x02,0x00,0x85,0x00, 0x01,0x00,0xdc,0x00,0x00,0x00,0x01,0x47,0xa4,0x15,0x82,0x49,0xa5,0x16,0x82, 0x47,0xa4,0x16,0x0c,0x48,0xa4,0x15,0x49,0xa5,0x16,0x4a,0xa6,0x17,0x47,0xa2, 0x15,0x48,0xa4,0x15,0x47,0xa6,0x16,0x47,0xa3,0x15,0x46,0xa2,0x13,0x46,0xa4, 0x15,0x48,0xa4,0x15,0x47,0xa2,0x15,0x46,0xa2,0x15,0x83,0x47,0xa3,0x15,0x84, 0x46,0xa0,0x14,0x0a,0x45,0xa0,0x15,0x44,0x9f,0x15,0x45,0x9f,0x15,0x46,0xa0, 0x14,0x44,0x9f,0x15,0x45,0xa1,0x14,0x45,0x9f,0x13,0x45,0x9f,0x15,0x43,0x9e, 0x13,0x45,0x9f,0x15,0x83,0x44,0x9f,0x15,0x01,0x43,0x9e,0x14,0x82,0x44,0x9e, 0x15,0x05,0x43,0x9d,0x14,0x44,0x9e,0x15,0x43,0x9e,0x14,0x42,0x9e,0x13,0x43, 0x9e,0x14,0x82,0x42,0x9e,0x13,0x03,0x43,0x9e,0x14,0x44,0x9e,0x15,0x42,0x9c, 0x15,0x82,0x43,0x9d,0x14,0x03,0x42,0x9c,0x13,0x43,0x9d,0x14,0x42,0x9c,0x16, 0x82,0x42,0x9c,0x15,0x09,0x43,0x9d,0x15,0x42,0x9c,0x15,0x42,0x9c,0x16,0x41, 0x9a,0x17,0x42,0x9c,0x16,0x41,0x9b,0x15,0x41,0x99,0x16,0x40,0x9a,0x16,0x41, 0x9a,0x17,0x84,0x41,0x99,0x16,0x0b,0x41,0x9b,0x17,0x41,0x9a,0x17,0x41,0x99, 0x17,0x42,0x99,0x18,0x41,0x99,0x17,0x40,0x99,0x16,0x41,0x99,0x17,0x41,0x99, 0x16,0x41,0x9a,0x18,0x41,0x99,0x17,0x40,0x99,0x18,0x82,0x42,0x99,0x18,0x01, 0x40,0x99,0x16,0x82,0x42,0x9b,0x19,0x0a,0x41,0x99,0x1b,0x40,0x99,0x18,0x43, 0x98,0x19,0x41,0x99,0x19,0x42,0x9b,0x19,0x41,0x9a,0x1a,0x41,0x99,0x1b,0x41, 0x97,0x1b,0x41,0x98,0x1c,0x42,0x96,0x1b,0x82,0x41,0x98,0x1b,0x82,0x42,0x99, 0x1b,0x82,0x41,0x98,0x1b,0x01,0x42,0x99,0x1d,0x83,0x41,0x99,0x1c,0x82,0x42, 0x99,0x1d,0x03,0x41,0x98,0x1c,0x41,0x98,0x1b,0x42,0x99,0x1b,0x82,0x42,0x99, 0x1d,0x05,0x40,0x98,0x1b,0x42,0x99,0x1d,0x43,0x99,0x1e,0x42,0x99,0x1f,0x40, 0x96,0x1c,0x82,0x42,0x99,0x1d,0x04,0x41,0x98,0x1c,0x42,0x99,0x1d,0x41,0x98, 0x1c,0x42,0x99,0x1d,0x82,0x41,0x98,0x1c,0x04,0x42,0x99,0x1d,0x43,0x99,0x1e, 0x42,0x99,0x1d,0x43,0x99,0x1e,0x83,0x41,0x98,0x1c,0x82,0x42,0x99,0x1d,0x15, 0x43,0x99,0x1e,0x43,0x99,0x1c,0x42,0x99,0x1d,0x44,0x9a,0x1f,0x43,0x99,0x1e, 0x42,0x99,0x1d,0x41,0x98,0x1c,0x42,0x99,0x1d,0x43,0x99,0x20,0x42,0x99,0x1f, 0x42,0x99,0x1d,0x43,0x99,0x1e,0x45,0x99,0x1e,0x44,0x98,0x1d,0x44,0x9a,0x1f, 0x43,0x99,0x1e,0x42,0x99,0x1d,0x43,0x99,0x1e,0x42,0x99,0x1d,0x44,0x9a,0x1f, 0x42,0x99,0x1d,0x82,0x43,0x99,0x1e,0x02,0x44,0x9a,0x1f,0x43,0x99,0x1e,0x84, 0x42,0x99,0x1d,0x07,0x43,0x99,0x1e,0x41,0x97,0x1b,0x42,0x99,0x1d,0x43,0x99, 0x1e,0x41,0x97,0x1b,0x43,0x99,0x1e,0x42,0x99,0x1d,0x82,0x42,0x99,0x1f,0x01, 0x41,0x97,0x1d,0x83,0x41,0x98,0x1e,0x05,0x42,0x99,0x1f,0x41,0x98,0x1e,0x41, 0x97,0x1d,0x41,0x98,0x1e,0x43,0x97,0x1e,0x82,0x42,0x99,0x1d,0x02,0x41,0x98, 0x1e,0x42,0x99,0x1f,0x82,0x41,0x97,0x1d,0x83,0x41,0x98,0x1e,0x05,0x43,0x97, 0x1e,0x42,0x96,0x1d,0x43,0x97,0x1e,0x40,0x96,0x1c,0x43,0x97,0x1e,0x82,0x41, 0x95,0x1d,0x82,0x42,0x96,0x1e,0x08,0x41,0x95,0x1d,0x41,0x94,0x1c,0x3f,0x93, 0x1b,0x40,0x95,0x1d,0x41,0x98,0x1e,0x41,0x97,0x1d,0x40,0x96,0x1c,0x40,0x94, 0x1b,0x82,0x3f,0x94,0x1c,0x01,0x41,0x95,0x1d,0x83,0x41,0x94,0x1c,0x0b,0x40, 0x94,0x1b,0x41,0x95,0x1d,0x41,0x94,0x1f,0x3f,0x93,0x1b,0x41,0x94,0x1c,0x41, 0x94,0x1b,0x41,0x95,0x1c,0x3f,0x95,0x1b,0x3e,0x94,0x1b,0x3f,0x95,0x1b,0x41, 0x97,0x1b,0x83,0x40,0x96,0x1b,0x01,0x41,0x98,0x1c,0x83,0x41,0x98,0x1b,0x09, 0x41,0x99,0x1b,0x42,0x9b,0x1b,0x42,0x9a,0x1c,0x43,0x9c,0x1b,0x41,0x99,0x1c, 0x3f,0x97,0x1b,0x42,0x9b,0x19,0x44,0x9d,0x1c,0x41,0x98,0x1c,0x82,0x42,0x99, 0x1d,0x02,0x43,0x99,0x1c,0x42,0x99,0x1b,0x83,0x41,0x98,0x1c,0x04,0x41,0x97, 0x1d,0x41,0x98,0x1e,0x41,0x97,0x1d,0x3f,0x95,0x1b,0x82,0x41,0x98,0x1e,0x82, 0x41,0x97,0x1b,0x18,0x43,0x99,0x1e,0x42,0x99,0x1d,0x3f,0x95,0x1a,0x41,0x98, 0x1c,0x41,0x97,0x1d,0x45,0x99,0x20,0x44,0x98,0x1f,0x42,0x96,0x1d,0x41,0x94, 0x1e,0x41,0x94,0x1c,0x41,0x95,0x1d,0x43,0x97,0x1f,0x44,0x96,0x1f,0x44,0x94, 0x1d,0x41,0x93,0x1b,0x40,0x94,0x1b,0x41,0x93,0x20,0x41,0x92,0x1f,0x41,0x94, 0x1e,0x40,0x91,0x1e,0x3f,0x91,0x1a,0x3d,0x8e,0x1b,0x3f,0x91,0x1b,0x40,0x91, 0x1e,0x82,0x3f,0x91,0x1a,0x08,0x3d,0x8f,0x18,0x3c,0x8e,0x17,0x3c,0x8e,0x18, 0x3f,0x91,0x1b,0x3f,0x8e,0x1a,0x3e,0x8e,0x19,0x3f,0x8e,0x18,0x40,0x8f,0x1b, 0x82,0x3d,0x8d,0x18,0x21,0x3c,0x8e,0x19,0x3a,0x8b,0x18,0x3c,0x8b,0x18,0x3b, 0x8a,0x17,0x37,0x86,0x15,0x3a,0x89,0x18,0x39,0x88,0x18,0x3a,0x89,0x18,0x3d, 0x8c,0x1b,0x38,0x85,0x18,0x34,0x81,0x15,0x27,0x73,0x0a,0x20,0x6b,0x06,0x20, 0x6b,0x08,0x22,0x6d,0x06,0x21,0x6b,0x07,0x21,0x6b,0x09,0x22,0x6c,0x08,0x20, 0x69,0x08,0x1f,0x68,0x05,0x1f,0x68,0x07,0x1e,0x67,0x06,0x1f,0x66,0x06,0x1e, 0x65,0x07,0x1f,0x65,0x08,0x1d,0x63,0x06,0x1b,0x63,0x05,0x1c,0x64,0x06,0x1b, 0x62,0x04,0x1c,0x63,0x05,0x1b,0x62,0x03,0x1b,0x61,0x05,0x1a,0x5f,0x04,0x82, 0x1b,0x60,0x05,0x08,0x19,0x5d,0x03,0x17,0x5c,0x03,0x19,0x5d,0x03,0x19,0x5d, 0x05,0x16,0x5a,0x03,0x16,0x5a,0x02,0x16,0x59,0x03,0x15,0x58,0x02,0x82,0x16, 0x59,0x02,0x0a,0x17,0x5a,0x03,0x16,0x58,0x02,0x15,0x56,0x01,0x15,0x57,0x02, 0x16,0x58,0x03,0x18,0x57,0x03,0x16,0x56,0x02,0x14,0x58,0x03,0x15,0x57,0x03, 0x16,0x55,0x02,0x82,0x16,0x55,0x01,0x14,0x15,0x56,0x02,0x16,0x57,0x03,0x16, 0x56,0x03,0x16,0x57,0x02,0x17,0x55,0x03,0x17,0x53,0x02,0x17,0x54,0x03,0x14, 0x54,0x02,0x15,0x55,0x03,0x16,0x55,0x04,0x17,0x54,0x04,0x16,0x56,0x03,0x15, 0x55,0x02,0x15,0x54,0x01,0x16,0x55,0x04,0x15,0x53,0x03,0x15,0x52,0x03,0x16, 0x54,0x03,0x15,0x54,0x03,0x16,0x53,0x04,0x83,0x15,0x52,0x03,0x01,0x15,0x52, 0x04,0x82,0x15,0x52,0x02,0x15,0x15,0x50,0x01,0x17,0x52,0x01,0x15,0x4f,0x03, 0x15,0x50,0x03,0x15,0x52,0x03,0x14,0x52,0x03,0x15,0x51,0x01,0x16,0x52,0x02, 0x15,0x50,0x02,0x15,0x4e,0x02,0x14,0x4d,0x02,0x15,0x4f,0x04,0x15,0x4e,0x02, 0x15,0x4f,0x03,0x15,0x4e,0x02,0x14,0x4d,0x02,0x15,0x4d,0x02,0x14,0x4d,0x04, 0x13,0x4d,0x02,0x14,0x4d,0x02,0x13,0x4c,0x00,0x82,0x15,0x4d,0x02,0x03,0x14, 0x4b,0x02,0x14,0x4c,0x02,0x14,0x4c,0x03,0x82,0x13,0x4b,0x01,0x82,0x14,0x4c, 0x03,0x07,0x13,0x49,0x01,0x14,0x4a,0x02,0x14,0x49,0x02,0x14,0x4a,0x03,0x14, 0x49,0x02,0x13,0x4a,0x01,0x14,0x4a,0x04,0x82,0x13,0x49,0x03,0x02,0x14,0x48, 0x03,0x13,0x47,0x01,0x82,0x14,0x47,0x01,0x02,0x13,0x47,0x01,0x13,0x47,0x02, 0x82,0x13,0x47,0x03,0x05,0x14,0x47,0x02,0x12,0x46,0x01,0x15,0x47,0x04,0x14, 0x46,0x03,0x12,0x46,0x03,0x82,0x11,0x45,0x02,0x0d,0x13,0x44,0x03,0x14,0x46, 0x04,0x12,0x43,0x02,0x11,0x45,0x01,0x12,0x44,0x03,0x11,0x44,0x02,0x12,0x43, 0x02,0x11,0x42,0x02,0x12,0x42,0x02,0x13,0x41,0x02,0x12,0x40,0x02,0x11,0x41, 0x02,0x12,0x42,0x03,0x82,0x10,0x41,0x02,0x02,0x10,0x40,0x01,0x11,0x41,0x02, 0x82,0x10,0x40,0x02,0x03,0x11,0x40,0x02,0x11,0x3f,0x01,0x10,0x3f,0x00,0x82, 0x11,0x3f,0x02,0x07,0x11,0x3f,0x03,0x10,0x3e,0x02,0x11,0x3e,0x03,0x10,0x3d, 0x02,0x10,0x3c,0x00,0x11,0x3d,0x03,0x10,0x3e,0x03,0x82,0x10,0x3c,0x01,0x03, 0x10,0x3c,0x03,0x10,0x3c,0x01,0x10,0x3b,0x01,0x83,0x10,0x3c,0x02,0x01,0x10, 0x3b,0x02,0x82,0x10,0x3a,0x02,0x0b,0x0f,0x39,0x01,0x0f,0x38,0x01,0x0f,0x39, 0x01,0x0f,0x39,0x02,0x0f,0x39,0x01,0x0f,0x38,0x01,0x0e,0x37,0x01,0x0f,0x37, 0x02,0x0e,0x36,0x02,0x0f,0x37,0x01,0x0e,0x37,0x01,0x82,0x0f,0x36,0x02,0x84, 0x0e,0x36,0x02,0x03,0x0d,0x35,0x02,0x0d,0x35,0x01,0x0d,0x34,0x02,0x82,0x0e, 0x35,0x02,0x02,0x0d,0x34,0x02,0x0c,0x33,0x01,0x82,0x0d,0x32,0x02,0x82,0x0c, 0x32,0x02,0x03,0x0d,0x32,0x02,0x0e,0x32,0x03,0x0e,0x31,0x01,0x82,0x0d,0x31, 0x01,0x83,0x0d,0x31,0x02,0x82,0x0c,0x30,0x01,0x11,0x0e,0x30,0x02,0x0e,0x2f, 0x02,0x0d,0x2e,0x01,0x0c,0x2f,0x02,0x0b,0x2f,0x02,0x0b,0x2e,0x01,0x0b,0x2e, 0x02,0x0c,0x2e,0x02,0x0c,0x2d,0x02,0x0b,0x2d,0x01,0x0b,0x2c,0x01,0x0b,0x2d, 0x00,0x0b,0x2d,0x01,0x0b,0x2c,0x01,0x0b,0x2c,0x02,0x0a,0x2b,0x01,0x0b,0x2b, 0x01,0x82,0x0b,0x2b,0x02,0x04,0x0c,0x2b,0x02,0x0a,0x2b,0x01,0x0a,0x2a,0x01, 0x0a,0x2b,0x01,0x82,0x0a,0x2a,0x01,0x01,0x0b,0x28,0x00,0x82,0x0a,0x29,0x01, 0x82,0x0a,0x28,0x01,0x83,0x0a,0x27,0x01,0x05,0x0a,0x26,0x00,0x0a,0x27,0x01, 0x0a,0x26,0x01,0x0a,0x26,0x00,0x0a,0x26,0x01,0x82,0x09,0x26,0x01,0x10,0x09, 0x25,0x00,0x09,0x24,0x01,0x09,0x24,0x00,0x0a,0x24,0x01,0x09,0x24,0x01,0x08, 0x24,0x00,0x08,0x23,0x00,0x09,0x23,0x01,0x08,0x22,0x00,0x08,0x21,0x00,0x08, 0x22,0x00,0x08,0x21,0x00,0x07,0x21,0x00,0x08,0x21,0x00,0x08,0x20,0x00,0x08, 0x21,0x00,0x82,0x08,0x20,0x00,0x02,0x08,0x20,0x01,0x07,0x20,0x00,0x83,0x07, 0x1f,0x00,0x06,0x07,0x1e,0x00,0x06,0x1e,0x00,0x07,0x1e,0x00,0x07,0x1e,0x01, 0x07,0x1d,0x00,0x06,0x1d,0x00,0x82,0x06,0x1c,0x00,0x03,0x07,0x1c,0x00,0x06, 0x1b,0x00,0x07,0x1b,0x00,0x84,0x06,0x1b,0x00,0x82,0x06,0x1a,0x00,0x01,0x06, 0x1b,0x00,0x82,0x05,0x1a,0x00,0x02,0x05,0x19,0x00,0x06,0x19,0x00,0x84,0x05, 0x18,0x00,0x84,0x05,0x17,0x00,0x82,0x05,0x16,0x00,0x86,0x05,0x15,0x00,0x82, 0x05,0x14,0x00,0x82,0x04,0x13,0x00,0x01,0x05,0x14,0x00,0x82,0x04,0x13,0x00, 0x83,0x04,0x12,0x00,0x84,0x04,0x11,0x00,0x01,0x03,0x10,0x00,0x82,0x04,0x10, 0x00,0x85,0x03,0x10,0x00,0x84,0x03,0x0f,0x00,0x82,0x03,0x0e,0x00,0x82,0x02, 0x0e,0x00,0x82,0x03,0x0d,0x00,0x82,0x02,0x0d,0x00,0x83,0x02,0x0c,0x00,0x84, 0x02,0x0b,0x00,0x83,0x02,0x0a,0x00,0x84,0x01,0x0a,0x00,0x84,0x01,0x09,0x00, 0x84,0x01,0x08,0x00,0x83,0x01,0x07,0x00,0x02,0x01,0x06,0x00,0x00,0x06,0x00, 0x82,0x01,0x06,0x00,0x87,0x00,0x05,0x00,0x84,0x00,0x04,0x00,0x84,0x00,0x03, 0x00,0x83,0x00,0x02,0x00,0x84,0x00,0x01,0x00,0xdd,0x00,0x00,0x00,0x02,0x48, 0xa5,0x17,0x47,0xa4,0x16,0x82,0x49,0xa6,0x17,0x02,0x48,0xa3,0x16,0x46,0xa1, 0x14,0x82,0x49,0xa4,0x17,0x0b,0x46,0xa5,0x17,0x47,0xa2,0x17,0x46,0xa1,0x16, 0x47,0xa2,0x15,0x46,0xa3,0x15,0x45,0xa1,0x16,0x46,0xa2,0x17,0x46,0xa3,0x15, 0x44,0xa0,0x14,0x45,0xa1,0x16,0x45,0xa1,0x15,0x83,0x45,0xa1,0x16,0x11,0x45, 0xa1,0x15,0x44,0xa0,0x15,0x45,0x9f,0x15,0x45,0xa0,0x14,0x45,0xa1,0x15,0x45, 0xa0,0x16,0x44,0x9f,0x13,0x42,0x9e,0x12,0x43,0x9f,0x16,0x44,0xa0,0x15,0x43, 0x9b,0x14,0x42,0x9d,0x11,0x44,0x9f,0x13,0x42,0x9e,0x13,0x41,0x9d,0x14,0x43, 0x9d,0x15,0x44,0x9e,0x14,0x82,0x42,0x9c,0x12,0x05,0x40,0x9c,0x11,0x41,0x9d, 0x14,0x41,0x9b,0x13,0x40,0x9b,0x12,0x43,0x9d,0x15,0x82,0x41,0x9b,0x13,0x05, 0x42,0x9c,0x14,0x40,0x9b,0x12,0x42,0x9c,0x16,0x43,0x9d,0x17,0x40,0x9b,0x14, 0x82,0x42,0x9c,0x14,0x0a,0x41,0x9d,0x14,0x40,0x9b,0x14,0x41,0x9a,0x14,0x42, 0x9b,0x15,0x40,0x9b,0x14,0x41,0x9b,0x15,0x40,0x9b,0x15,0x40,0x9a,0x16,0x41, 0x9a,0x16,0x40,0x98,0x16,0x82,0x40,0x9a,0x17,0x16,0x3f,0x99,0x16,0x40,0x9a, 0x17,0x3f,0x99,0x16,0x42,0x9a,0x17,0x41,0x99,0x17,0x41,0x9b,0x17,0x41,0x99, 0x18,0x41,0x99,0x17,0x3f,0x99,0x16,0x40,0x9a,0x18,0x41,0x99,0x17,0x41,0x9a, 0x16,0x42,0x9a,0x17,0x40,0x9a,0x18,0x41,0x9b,0x17,0x42,0x9a,0x17,0x43,0x9b, 0x18,0x3f,0x99,0x17,0x3f,0x98,0x19,0x41,0x98,0x1a,0x40,0x98,0x17,0x40,0x99, 0x1a,0x82,0x41,0x98,0x1a,0x02,0x42,0x99,0x1b,0x43,0x9a,0x1c,0x82,0x41,0x98, 0x1a,0x01,0x43,0x98,0x1a,0x82,0x41,0x98,0x1c,0x82,0x40,0x99,0x1c,0x06,0x41, 0x9a,0x1c,0x41,0x98,0x1c,0x40,0x97,0x1b,0x41,0x98,0x1c,0x42,0x99,0x1b,0x41, 0x98,0x1c,0x82,0x42,0x99,0x1c,0x02,0x41,0x98,0x1c,0x40,0x99,0x1c,0x82,0x42, 0x99,0x1c,0x0b,0x40,0x98,0x1d,0x42,0x9a,0x1f,0x43,0x9a,0x1f,0x41,0x98,0x1c, 0x43,0x9a,0x1d,0x41,0x98,0x1c,0x42,0x99,0x1c,0x41,0x98,0x1c,0x42,0x96,0x1c, 0x41,0x98,0x1d,0x42,0x99,0x1e,0x82,0x43,0x9a,0x1d,0x82,0x42,0x99,0x1e,0x07, 0x41,0x98,0x1d,0x42,0x99,0x1e,0x43,0x9a,0x1d,0x40,0x97,0x1b,0x42,0x99,0x1c, 0x43,0x9a,0x1d,0x42,0x99,0x1c,0x82,0x42,0x9b,0x1d,0x01,0x43,0x9a,0x1d,0x84, 0x42,0x99,0x1c,0x02,0x43,0x9a,0x1d,0x44,0x9b,0x1e,0x82,0x43,0x9a,0x1d,0x03, 0x42,0x99,0x1c,0x41,0x9a,0x1c,0x41,0x98,0x1c,0x82,0x42,0x99,0x1c,0x08,0x41, 0x98,0x1c,0x40,0x99,0x1c,0x43,0x9a,0x1f,0x42,0x99,0x1e,0x43,0x9a,0x1f,0x45, 0x9b,0x1f,0x40,0x99,0x1c,0x41,0x9a,0x1c,0x82,0x42,0x99,0x1c,0x04,0x41,0x9a, 0x1b,0x43,0x9b,0x1e,0x41,0x9a,0x1c,0x42,0x99,0x1c,0x82,0x43,0x9a,0x1d,0x82, 0x42,0x99,0x1c,0x82,0x41,0x98,0x1c,0x01,0x43,0x9a,0x1d,0x82,0x42,0x99,0x1c, 0x05,0x44,0x9b,0x1e,0x41,0x98,0x1c,0x43,0x97,0x1c,0x44,0x9b,0x20,0x44,0x9b, 0x1e,0x82,0x42,0x9b,0x1d,0x01,0x41,0x98,0x1c,0x82,0x43,0x9a,0x1d,0x82,0x41, 0x98,0x1c,0x17,0x42,0x99,0x1c,0x41,0x98,0x1d,0x42,0x99,0x1e,0x41,0x98,0x1d, 0x43,0x97,0x1d,0x42,0x96,0x1c,0x44,0x98,0x1e,0x40,0x97,0x1c,0x41,0x98,0x1d, 0x40,0x97,0x1c,0x3f,0x96,0x1c,0x41,0x98,0x1d,0x42,0x99,0x1e,0x41,0x98,0x1d, 0x40,0x97,0x1c,0x3f,0x97,0x1c,0x40,0x97,0x1c,0x41,0x97,0x1e,0x3f,0x97,0x1c, 0x3f,0x96,0x1c,0x42,0x96,0x1c,0x43,0x97,0x1d,0x40,0x95,0x1b,0x82,0x43,0x97, 0x1d,0x13,0x40,0x96,0x1d,0x3f,0x96,0x1c,0x40,0x96,0x1d,0x40,0x97,0x1c,0x43, 0x97,0x1d,0x3f,0x94,0x1b,0x41,0x96,0x1c,0x40,0x97,0x1c,0x40,0x97,0x1b,0x41, 0x98,0x1d,0x40,0x97,0x1c,0x3f,0x96,0x1b,0x41,0x98,0x1c,0x3f,0x98,0x1b,0x44, 0x98,0x1c,0x41,0x98,0x1c,0x40,0x97,0x1b,0x41,0x98,0x1c,0x42,0x99,0x1c,0x82, 0x41,0x98,0x1c,0x01,0x43,0x9a,0x1d,0x82,0x41,0x98,0x1c,0x05,0x43,0x9a,0x1d, 0x42,0x99,0x1c,0x43,0x9a,0x1c,0x44,0x9b,0x1c,0x43,0x9a,0x1c,0x82,0x44,0x9b, 0x1c,0x08,0x45,0x9b,0x1d,0x42,0x99,0x1b,0x43,0x9b,0x1c,0x3f,0x98,0x19,0x42, 0x9b,0x1c,0x44,0x9b,0x1c,0x42,0x99,0x1c,0x3f,0x96,0x1c,0x82,0x41,0x98,0x1d, 0x03,0x41,0x97,0x1e,0x41,0x96,0x1c,0x42,0x99,0x1e,0x82,0x42,0x99,0x1c,0x01, 0x43,0x9a,0x1d,0x82,0x42,0x99,0x1c,0x05,0x43,0x9b,0x1e,0x41,0x98,0x1d,0x42, 0x99,0x1e,0x43,0x97,0x1e,0x41,0x96,0x1c,0x82,0x42,0x96,0x1d,0x08,0x43,0x97, 0x1e,0x44,0x98,0x1f,0x42,0x96,0x1d,0x44,0x98,0x1f,0x42,0x96,0x1d,0x45,0x97, 0x1e,0x40,0x95,0x1c,0x42,0x94,0x20,0x82,0x40,0x93,0x1c,0x04,0x42,0x95,0x1e, 0x40,0x93,0x1c,0x3f,0x93,0x1e,0x3f,0x94,0x1b,0x82,0x40,0x93,0x1c,0x02,0x3f, 0x92,0x1c,0x3f,0x91,0x1b,0x82,0x3e,0x90,0x1a,0x05,0x3f,0x91,0x19,0x3c,0x8f, 0x17,0x3b,0x8d,0x19,0x3e,0x90,0x1a,0x3f,0x91,0x1b,0x82,0x3e,0x8e,0x1a,0x03, 0x3b,0x8b,0x17,0x3f,0x8f,0x1b,0x3e,0x8e,0x1a,0x82,0x3a,0x8a,0x18,0x1b,0x3b, 0x8a,0x19,0x39,0x89,0x17,0x3a,0x8a,0x18,0x39,0x88,0x17,0x39,0x89,0x17,0x39, 0x85,0x17,0x31,0x7f,0x15,0x2a,0x77,0x0b,0x22,0x6e,0x06,0x22,0x6c,0x07,0x24, 0x6f,0x08,0x22,0x6d,0x08,0x21,0x6b,0x09,0x22,0x6c,0x08,0x20,0x6a,0x08,0x21, 0x6a,0x09,0x1f,0x68,0x07,0x1e,0x67,0x06,0x1d,0x66,0x05,0x1e,0x67,0x06,0x1c, 0x65,0x05,0x1e,0x65,0x05,0x1c,0x63,0x05,0x1d,0x63,0x06,0x1d,0x64,0x07,0x1b, 0x61,0x05,0x1a,0x60,0x04,0x82,0x1b,0x61,0x05,0x04,0x1a,0x61,0x05,0x17,0x5e, 0x02,0x19,0x5e,0x03,0x18,0x5d,0x04,0x82,0x17,0x5c,0x04,0x05,0x17,0x5c,0x03, 0x17,0x5b,0x02,0x16,0x59,0x01,0x16,0x5a,0x02,0x17,0x5a,0x02,0x82,0x17,0x59, 0x02,0x82,0x16,0x58,0x01,0x07,0x15,0x57,0x01,0x17,0x59,0x03,0x16,0x58,0x02, 0x15,0x56,0x01,0x17,0x56,0x01,0x16,0x57,0x02,0x16,0x56,0x02,0x82,0x16,0x57, 0x03,0x0c,0x16,0x56,0x03,0x17,0x55,0x02,0x15,0x55,0x01,0x16,0x56,0x03,0x15, 0x55,0x02,0x16,0x56,0x03,0x16,0x56,0x01,0x16,0x55,0x01,0x15,0x56,0x01,0x17, 0x54,0x03,0x16,0x55,0x03,0x17,0x53,0x03,0x82,0x16,0x55,0x02,0x17,0x16,0x54, 0x02,0x16,0x56,0x01,0x14,0x52,0x00,0x16,0x53,0x02,0x14,0x52,0x03,0x15,0x53, 0x03,0x16,0x53,0x04,0x16,0x52,0x02,0x15,0x51,0x01,0x16,0x53,0x03,0x15,0x52, 0x02,0x16,0x52,0x01,0x15,0x50,0x01,0x14,0x50,0x03,0x15,0x50,0x03,0x16,0x51, 0x04,0x15,0x50,0x02,0x14,0x4f,0x01,0x16,0x50,0x02,0x16,0x50,0x03,0x15,0x50, 0x02,0x14,0x50,0x02,0x14,0x4f,0x02,0x82,0x15,0x4f,0x02,0x07,0x15,0x4f,0x01, 0x14,0x4d,0x00,0x13,0x4f,0x02,0x15,0x4f,0x03,0x14,0x4e,0x02,0x15,0x4f,0x03, 0x15,0x4d,0x02,0x82,0x14,0x4c,0x02,0x09,0x15,0x4b,0x02,0x15,0x4c,0x03,0x13, 0x4d,0x03,0x15,0x4d,0x04,0x13,0x4b,0x02,0x14,0x4c,0x03,0x13,0x4a,0x01,0x14, 0x4b,0x03,0x14,0x4a,0x02,0x82,0x14,0x4b,0x03,0x0b,0x13,0x4a,0x02,0x13,0x4b, 0x03,0x13,0x4a,0x03,0x15,0x4a,0x04,0x13,0x48,0x02,0x16,0x49,0x03,0x14,0x49, 0x03,0x13,0x47,0x02,0x12,0x49,0x03,0x13,0x48,0x03,0x13,0x49,0x03,0x82,0x13, 0x47,0x03,0x04,0x14,0x45,0x02,0x12,0x47,0x03,0x13,0x47,0x03,0x13,0x46,0x03, 0x82,0x12,0x45,0x02,0x82,0x13,0x45,0x02,0x11,0x11,0x44,0x00,0x12,0x45,0x03, 0x13,0x43,0x02,0x12,0x45,0x03,0x11,0x45,0x03,0x13,0x44,0x03,0x13,0x42,0x02, 0x11,0x43,0x02,0x11,0x44,0x02,0x11,0x42,0x03,0x11,0x41,0x02,0x11,0x42,0x02, 0x11,0x41,0x02,0x12,0x40,0x02,0x11,0x40,0x03,0x11,0x40,0x02,0x11,0x41,0x02, 0x82,0x11,0x40,0x02,0x01,0x11,0x40,0x03,0x83,0x11,0x3f,0x02,0x0d,0x11,0x3f, 0x03,0x12,0x3e,0x02,0x11,0x3f,0x03,0x11,0x3f,0x02,0x10,0x3e,0x02,0x10,0x3d, 0x03,0x10,0x3e,0x02,0x11,0x3d,0x03,0x10,0x3c,0x03,0x11,0x3d,0x01,0x10,0x3c, 0x02,0x10,0x3d,0x01,0x10,0x3b,0x01,0x82,0x10,0x3b,0x02,0x1b,0x11,0x3a,0x02, 0x11,0x3b,0x04,0x0f,0x39,0x03,0x10,0x39,0x01,0x0f,0x39,0x01,0x0f,0x39,0x02, 0x0f,0x38,0x02,0x0e,0x38,0x01,0x0f,0x38,0x01,0x10,0x38,0x02,0x0f,0x38,0x02, 0x0e,0x38,0x02,0x0f,0x38,0x02,0x0f,0x37,0x02,0x0e,0x38,0x02,0x0d,0x36,0x01, 0x0f,0x37,0x02,0x0f,0x35,0x01,0x0e,0x35,0x01,0x0d,0x36,0x01,0x0d,0x36,0x02, 0x0d,0x36,0x01,0x0e,0x34,0x01,0x0d,0x33,0x02,0x0d,0x34,0x02,0x0d,0x33,0x02, 0x0d,0x32,0x01,0x82,0x0d,0x33,0x01,0x82,0x0e,0x33,0x02,0x07,0x0d,0x33,0x01, 0x0e,0x32,0x01,0x0d,0x31,0x01,0x0d,0x32,0x02,0x0c,0x31,0x00,0x0d,0x31,0x01, 0x0d,0x31,0x02,0x84,0x0c,0x30,0x02,0x01,0x0d,0x30,0x02,0x82,0x0c,0x2f,0x02, 0x01,0x0c,0x2e,0x02,0x82,0x0b,0x2e,0x01,0x82,0x0c,0x2e,0x02,0x01,0x0c,0x2d, 0x00,0x82,0x0b,0x2d,0x01,0x84,0x0b,0x2c,0x01,0x05,0x0b,0x2c,0x02,0x0b,0x2b, 0x02,0x0c,0x2b,0x02,0x0b,0x2a,0x00,0x0b,0x2b,0x01,0x82,0x0b,0x29,0x01,0x02, 0x0b,0x2a,0x01,0x0b,0x29,0x01,0x83,0x0b,0x28,0x01,0x01,0x0a,0x28,0x01,0x82, 0x0b,0x28,0x01,0x03,0x0b,0x27,0x01,0x0a,0x28,0x01,0x0b,0x27,0x01,0x82,0x0a, 0x27,0x01,0x83,0x0a,0x26,0x01,0x03,0x09,0x25,0x00,0x0a,0x25,0x01,0x09,0x25, 0x01,0x83,0x09,0x24,0x01,0x02,0x09,0x23,0x01,0x08,0x22,0x00,0x82,0x09,0x22, 0x01,0x0e,0x08,0x22,0x01,0x08,0x22,0x00,0x09,0x22,0x00,0x08,0x22,0x00,0x07, 0x22,0x00,0x09,0x21,0x01,0x08,0x21,0x01,0x08,0x20,0x00,0x07,0x20,0x00,0x08, 0x1f,0x00,0x07,0x20,0x00,0x07,0x1f,0x00,0x07,0x1e,0x00,0x08,0x1e,0x00,0x83, 0x07,0x1e,0x00,0x02,0x06,0x1d,0x00,0x07,0x1d,0x00,0x83,0x06,0x1c,0x00,0x82, 0x07,0x1c,0x00,0x82,0x06,0x1c,0x00,0x82,0x06,0x1b,0x00,0x85,0x06,0x1a,0x00, 0x83,0x05,0x19,0x00,0x84,0x05,0x18,0x00,0x85,0x05,0x17,0x00,0x83,0x05,0x16, 0x00,0x83,0x05,0x15,0x00,0x01,0x04,0x14,0x00,0x83,0x05,0x14,0x00,0x01,0x05, 0x13,0x00,0x82,0x04,0x13,0x00,0x83,0x04,0x12,0x00,0x86,0x04,0x11,0x00,0x01, 0x03,0x11,0x00,0x84,0x03,0x10,0x00,0x83,0x03,0x0f,0x00,0x06,0x02,0x0f,0x00, 0x02,0x0e,0x00,0x03,0x0e,0x00,0x02,0x0e,0x00,0x03,0x0e,0x00,0x02,0x0e,0x00, 0x82,0x03,0x0d,0x00,0x82,0x02,0x0d,0x00,0x83,0x02,0x0c,0x00,0x87,0x02,0x0b, 0x00,0x01,0x01,0x0b,0x00,0x83,0x01,0x0a,0x00,0x84,0x01,0x09,0x00,0x83,0x01, 0x08,0x00,0x84,0x01,0x07,0x00,0x82,0x01,0x06,0x00,0x82,0x00,0x06,0x00,0x88, 0x00,0x05,0x00,0x83,0x00,0x04,0x00,0x83,0x00,0x03,0x00,0x84,0x00,0x02,0x00, 0x83,0x00,0x01,0x00,0xde,0x00,0x00,0x00,0x02,0x46,0xa3,0x16,0x47,0xa4,0x17, 0x82,0x48,0xa4,0x18,0x01,0x47,0xa4,0x17,0x83,0x47,0xa3,0x16,0x03,0x47,0xa4, 0x17,0x44,0x9f,0x14,0x46,0xa1,0x16,0x82,0x47,0xa4,0x17,0x82,0x45,0xa0,0x15, 0x01,0x43,0xa3,0x15,0x83,0x45,0xa0,0x15,0x01,0x44,0x9f,0x14,0x82,0x45,0xa0, 0x15,0x04,0x43,0x9e,0x14,0x44,0x9f,0x16,0x43,0x9e,0x16,0x42,0x9d,0x12,0x82, 0x43,0x9e,0x14,0x08,0x43,0x9e,0x13,0x43,0x9e,0x14,0x43,0x9e,0x16,0x43,0x9e, 0x14,0x43,0x9e,0x13,0x43,0x9e,0x14,0x41,0x9c,0x12,0x42,0x9d,0x13,0x82,0x43, 0x9e,0x14,0x01,0x42,0x9d,0x13,0x83,0x41,0x9c,0x14,0x16,0x42,0x9d,0x15,0x41, 0x9c,0x14,0x3f,0x9a,0x12,0x41,0x9c,0x14,0x40,0x9b,0x13,0x42,0x9d,0x15,0x42, 0x9b,0x12,0x43,0x9c,0x15,0x3f,0x9a,0x12,0x3f,0x9b,0x15,0x40,0x9c,0x16,0x42, 0x9c,0x17,0x40,0x9a,0x15,0x42,0x9b,0x16,0x3f,0x99,0x15,0x40,0x98,0x15,0x41, 0x9a,0x15,0x40,0x9a,0x15,0x3e,0x98,0x14,0x40,0x9a,0x16,0x40,0x9a,0x18,0x40, 0x98,0x17,0x82,0x40,0x98,0x15,0x03,0x3f,0x98,0x14,0x40,0x98,0x15,0x3f,0x99, 0x17,0x82,0x40,0x9a,0x18,0x0b,0x3e,0x98,0x16,0x40,0x98,0x17,0x3f,0x97,0x18, 0x40,0x98,0x17,0x3e,0x97,0x15,0x40,0x99,0x19,0x3f,0x98,0x16,0x41,0x99,0x16, 0x41,0x99,0x18,0x3f,0x98,0x18,0x40,0x9a,0x18,0x82,0x40,0x98,0x17,0x01,0x40, 0x98,0x18,0x82,0x41,0x98,0x19,0x02,0x3f,0x97,0x18,0x40,0x98,0x18,0x82,0x41, 0x98,0x19,0x01,0x40,0x98,0x1a,0x83,0x41,0x98,0x1b,0x82,0x40,0x98,0x1a,0x02, 0x41,0x98,0x1b,0x40,0x98,0x1a,0x84,0x41,0x98,0x1b,0x02,0x40,0x98,0x1c,0x41, 0x98,0x1b,0x83,0x42,0x99,0x1c,0x82,0x40,0x99,0x1b,0x82,0x41,0x98,0x1d,0x02, 0x3f,0x98,0x1c,0x43,0x9a,0x1e,0x82,0x42,0x99,0x1e,0x01,0x41,0x98,0x1d,0x83, 0x42,0x99,0x1e,0x83,0x41,0x98,0x1d,0x0d,0x41,0x98,0x1b,0x40,0x98,0x1a,0x40, 0x98,0x1c,0x42,0x99,0x1e,0x43,0x9a,0x1e,0x40,0x98,0x1d,0x42,0x99,0x1e,0x40, 0x98,0x1c,0x41,0x98,0x1d,0x42,0x99,0x1c,0x41,0x98,0x1b,0x41,0x9a,0x1c,0x41, 0x99,0x1e,0x82,0x43,0x9a,0x1d,0x82,0x42,0x99,0x1e,0x09,0x41,0x9a,0x1c,0x42, 0x9b,0x1d,0x43,0x9b,0x1e,0x42,0x99,0x1e,0x41,0x98,0x1b,0x42,0x99,0x1c,0x42, 0x9b,0x1d,0x43,0x9d,0x1e,0x42,0x99,0x1c,0x82,0x43,0x9a,0x1d,0x0a,0x43,0x9b, 0x1f,0x42,0x99,0x1e,0x43,0x9a,0x1e,0x41,0x98,0x1d,0x42,0x99,0x1e,0x42,0x99, 0x1c,0x42,0x9b,0x1d,0x43,0x9a,0x1d,0x42,0x99,0x1c,0x43,0x9a,0x1d,0x82,0x42, 0x9b,0x1d,0x82,0x43,0x9c,0x1e,0x01,0x42,0x99,0x1c,0x82,0x41,0x98,0x1d,0x02, 0x43,0x9b,0x1e,0x43,0x9a,0x1d,0x83,0x42,0x99,0x1c,0x01,0x43,0x9b,0x1e,0x82, 0x43,0x9a,0x1d,0x01,0x42,0x99,0x1e,0x82,0x42,0x99,0x1c,0x01,0x43,0x9b,0x1e, 0x82,0x43,0x9a,0x1d,0x05,0x43,0x9b,0x1f,0x43,0x9a,0x1e,0x41,0x9a,0x1c,0x41, 0x99,0x1e,0x42,0x99,0x1e,0x82,0x41,0x98,0x1d,0x09,0x42,0x99,0x1e,0x40,0x98, 0x1c,0x42,0x99,0x1e,0x41,0x98,0x1d,0x43,0x9a,0x1e,0x40,0x98,0x1c,0x3e,0x96, 0x1a,0x40,0x98,0x1c,0x42,0x99,0x1e,0x82,0x41,0x98,0x1d,0x1b,0x44,0x99,0x1e, 0x42,0x97,0x1c,0x42,0x98,0x1e,0x41,0x98,0x1d,0x41,0x99,0x1e,0x43,0x9a,0x1e, 0x40,0x98,0x1c,0x40,0x98,0x1d,0x43,0x98,0x1d,0x42,0x99,0x1e,0x41,0x98,0x1e, 0x40,0x97,0x1d,0x3f,0x96,0x1c,0x41,0x98,0x1d,0x41,0x98,0x1e,0x41,0x96,0x1c, 0x43,0x98,0x1e,0x41,0x98,0x1d,0x40,0x98,0x1c,0x40,0x98,0x1a,0x40,0x97,0x1d, 0x43,0x9a,0x1d,0x40,0x98,0x1c,0x41,0x9a,0x1c,0x41,0x98,0x1d,0x41,0x98,0x1b, 0x42,0x99,0x1c,0x82,0x41,0x98,0x1b,0x11,0x42,0x99,0x1c,0x41,0x98,0x1b,0x43, 0x9a,0x1b,0x43,0x9b,0x1e,0x42,0x99,0x1c,0x43,0x9a,0x1d,0x42,0x99,0x1a,0x44, 0x9c,0x1d,0x43,0x9b,0x1c,0x44,0x9c,0x1d,0x45,0x9d,0x1e,0x43,0x9a,0x1e,0x40, 0x98,0x1c,0x43,0x9b,0x1e,0x43,0x9d,0x1e,0x42,0x9b,0x1b,0x42,0x99,0x1a,0x82, 0x43,0x9a,0x1b,0x05,0x42,0x99,0x1c,0x43,0x9a,0x1d,0x43,0x9b,0x1f,0x40,0x98, 0x1c,0x3f,0x97,0x1b,0x82,0x43,0x9a,0x1e,0x1c,0x43,0x9b,0x1f,0x44,0x9e,0x1f, 0x42,0x9b,0x1d,0x43,0x9b,0x1e,0x43,0x9a,0x1d,0x45,0x9a,0x1e,0x43,0x98,0x1d, 0x40,0x97,0x1d,0x43,0x99,0x1f,0x43,0x98,0x1e,0x3f,0x94,0x1a,0x43,0x98,0x20, 0x42,0x96,0x1e,0x41,0x96,0x1c,0x43,0x98,0x1e,0x41,0x96,0x1c,0x44,0x98,0x20, 0x43,0x97,0x1f,0x41,0x94,0x1d,0x42,0x95,0x1c,0x43,0x95,0x20,0x41,0x93,0x1e, 0x43,0x97,0x1e,0x40,0x93,0x1c,0x40,0x92,0x1e,0x42,0x95,0x1c,0x42,0x95,0x1e, 0x3e,0x92,0x1a,0x82,0x40,0x93,0x1c,0x01,0x3d,0x91,0x18,0x82,0x3f,0x92,0x19, 0x0d,0x3c,0x90,0x18,0x3c,0x8f,0x18,0x3d,0x91,0x19,0x3e,0x92,0x1a,0x3e,0x8f, 0x18,0x3c,0x8d,0x18,0x3e,0x8f,0x1a,0x3e,0x8f,0x18,0x3c,0x8c,0x18,0x3b,0x8c, 0x17,0x3d,0x8e,0x19,0x3c,0x8c,0x18,0x3c,0x8c,0x19,0x82,0x38,0x88,0x16,0x0f, 0x36,0x86,0x15,0x38,0x87,0x16,0x3b,0x89,0x1b,0x35,0x81,0x16,0x2a,0x76,0x0d, 0x25,0x71,0x09,0x23,0x6e,0x06,0x24,0x6e,0x0a,0x21,0x6c,0x07,0x20,0x6b,0x08, 0x1f,0x69,0x07,0x20,0x6a,0x08,0x1f,0x69,0x07,0x1f,0x68,0x07,0x1e,0x67,0x06, 0x83,0x1e,0x66,0x07,0x02,0x1e,0x64,0x06,0x1d,0x64,0x06,0x83,0x1c,0x62,0x06, 0x01,0x1b,0x61,0x05,0x82,0x19,0x61,0x04,0x03,0x18,0x5e,0x04,0x18,0x5d,0x03, 0x18,0x5d,0x04,0x82,0x18,0x5c,0x03,0x04,0x19,0x5b,0x03,0x16,0x5a,0x01,0x17, 0x5b,0x03,0x18,0x5b,0x03,0x82,0x17,0x5a,0x02,0x82,0x16,0x59,0x01,0x82,0x16, 0x59,0x02,0x0b,0x18,0x58,0x02,0x16,0x58,0x02,0x15,0x57,0x01,0x16,0x58,0x02, 0x16,0x57,0x02,0x15,0x56,0x01,0x17,0x58,0x03,0x15,0x57,0x02,0x15,0x55,0x01, 0x16,0x56,0x02,0x16,0x57,0x03,0x82,0x15,0x55,0x02,0x06,0x16,0x56,0x03,0x16, 0x56,0x04,0x16,0x57,0x02,0x15,0x55,0x03,0x16,0x55,0x04,0x17,0x54,0x03,0x82, 0x17,0x54,0x01,0x11,0x18,0x54,0x02,0x16,0x57,0x04,0x15,0x56,0x03,0x16,0x54, 0x02,0x15,0x53,0x01,0x15,0x54,0x03,0x14,0x53,0x03,0x15,0x52,0x01,0x16,0x53, 0x02,0x15,0x52,0x01,0x15,0x53,0x02,0x15,0x54,0x01,0x16,0x54,0x03,0x15,0x53, 0x03,0x14,0x50,0x01,0x15,0x51,0x02,0x14,0x50,0x01,0x82,0x16,0x4f,0x02,0x02, 0x15,0x50,0x02,0x15,0x51,0x02,0x82,0x15,0x50,0x02,0x84,0x15,0x4f,0x02,0x01, 0x16,0x4f,0x03,0x82,0x14,0x4e,0x02,0x14,0x15,0x4f,0x03,0x15,0x4e,0x03,0x14, 0x4d,0x02,0x14,0x4c,0x03,0x14,0x4d,0x04,0x15,0x4b,0x02,0x14,0x4c,0x02,0x13, 0x4d,0x02,0x13,0x4c,0x01,0x14,0x4b,0x02,0x12,0x4b,0x01,0x14,0x4c,0x03,0x13, 0x4b,0x02,0x14,0x4a,0x02,0x14,0x4b,0x03,0x13,0x4a,0x02,0x13,0x49,0x01,0x12, 0x48,0x01,0x13,0x49,0x02,0x12,0x49,0x02,0x82,0x13,0x49,0x02,0x0b,0x12,0x48, 0x01,0x12,0x49,0x02,0x12,0x48,0x01,0x12,0x49,0x02,0x12,0x48,0x02,0x12,0x48, 0x03,0x14,0x48,0x03,0x12,0x48,0x01,0x12,0x47,0x01,0x12,0x46,0x02,0x12,0x45, 0x02,0x83,0x13,0x46,0x03,0x0d,0x12,0x46,0x03,0x12,0x44,0x03,0x12,0x43,0x03, 0x12,0x45,0x02,0x12,0x44,0x00,0x12,0x43,0x00,0x12,0x43,0x02,0x11,0x43,0x02, 0x11,0x43,0x03,0x12,0x43,0x02,0x11,0x43,0x02,0x12,0x43,0x02,0x12,0x42,0x03, 0x82,0x12,0x41,0x03,0x03,0x11,0x41,0x02,0x11,0x42,0x01,0x12,0x42,0x03,0x82, 0x11,0x41,0x02,0x04,0x11,0x40,0x02,0x12,0x40,0x02,0x11,0x3f,0x02,0x12,0x40, 0x03,0x82,0x11,0x3e,0x02,0x04,0x11,0x3f,0x02,0x11,0x3e,0x02,0x10,0x3e,0x02, 0x10,0x3d,0x00,0x82,0x10,0x3c,0x01,0x01,0x11,0x3c,0x01,0x82,0x10,0x3c,0x02, 0x0d,0x10,0x3c,0x00,0x11,0x3c,0x03,0x10,0x3c,0x02,0x10,0x3a,0x01,0x0e,0x3b, 0x01,0x0f,0x3a,0x01,0x10,0x3c,0x02,0x0e,0x38,0x00,0x0e,0x39,0x01,0x0f,0x3b, 0x02,0x0e,0x39,0x01,0x0e,0x38,0x01,0x0f,0x38,0x01,0x82,0x0e,0x38,0x01,0x05, 0x0d,0x37,0x01,0x0e,0x37,0x01,0x0d,0x38,0x01,0x0d,0x37,0x01,0x0e,0x37,0x02, 0x82,0x0e,0x36,0x01,0x03,0x0f,0x36,0x02,0x0e,0x36,0x02,0x0e,0x35,0x01,0x83, 0x0e,0x36,0x02,0x02,0x0d,0x35,0x02,0x0d,0x35,0x01,0x82,0x0d,0x34,0x01,0x01, 0x0d,0x33,0x01,0x82,0x0f,0x33,0x02,0x04,0x0e,0x33,0x02,0x0d,0x32,0x01,0x0e, 0x32,0x01,0x0d,0x31,0x01,0x82,0x0d,0x31,0x02,0x84,0x0c,0x30,0x02,0x01,0x0d, 0x30,0x02,0x82,0x0c,0x30,0x01,0x82,0x0c,0x2f,0x01,0x82,0x0c,0x2f,0x02,0x0d, 0x0c,0x2f,0x01,0x0c,0x2d,0x00,0x0b,0x2d,0x01,0x0c,0x2d,0x01,0x0c,0x2d,0x02, 0x0c,0x2c,0x01,0x0b,0x2b,0x01,0x0c,0x2c,0x01,0x0c,0x2c,0x02,0x0b,0x2b,0x01, 0x0c,0x2a,0x01,0x0c,0x2a,0x00,0x0b,0x2a,0x00,0x82,0x0b,0x2a,0x01,0x04,0x0a, 0x2a,0x01,0x0a,0x29,0x01,0x0a,0x28,0x01,0x0b,0x28,0x01,0x82,0x0a,0x29,0x01, 0x03,0x0a,0x28,0x01,0x0b,0x28,0x01,0x0b,0x27,0x00,0x82,0x0a,0x28,0x01,0x83, 0x0a,0x27,0x01,0x04,0x0a,0x25,0x00,0x09,0x25,0x00,0x0a,0x25,0x01,0x09,0x25, 0x00,0x82,0x09,0x25,0x01,0x83,0x09,0x24,0x01,0x01,0x08,0x23,0x00,0x82,0x09, 0x23,0x01,0x01,0x08,0x23,0x01,0x82,0x09,0x23,0x01,0x04,0x09,0x22,0x00,0x08, 0x21,0x00,0x08,0x22,0x01,0x08,0x21,0x00,0x83,0x08,0x20,0x00,0x09,0x07,0x1f, 0x00,0x07,0x20,0x00,0x08,0x20,0x01,0x08,0x1f,0x00,0x08,0x1e,0x00,0x07,0x1e, 0x00,0x08,0x1e,0x01,0x07,0x1e,0x00,0x06,0x1e,0x00,0x83,0x06,0x1d,0x00,0x01, 0x06,0x1c,0x00,0x82,0x07,0x1c,0x00,0x82,0x06,0x1c,0x00,0x82,0x06,0x1b,0x00, 0x84,0x06,0x1a,0x00,0x01,0x06,0x19,0x00,0x84,0x06,0x18,0x00,0x05,0x05,0x18, 0x00,0x06,0x18,0x00,0x05,0x18,0x00,0x06,0x18,0x00,0x06,0x17,0x00,0x82,0x05, 0x17,0x00,0x04,0x05,0x16,0x00,0x06,0x17,0x00,0x06,0x16,0x00,0x05,0x16,0x00, 0x83,0x05,0x15,0x00,0x83,0x05,0x14,0x00,0x01,0x05,0x13,0x00,0x83,0x04,0x13, 0x00,0x86,0x04,0x12,0x00,0x83,0x03,0x11,0x00,0x01,0x04,0x11,0x00,0x85,0x03, 0x10,0x00,0x83,0x03,0x0f,0x00,0x82,0x02,0x0e,0x00,0x02,0x03,0x0e,0x00,0x02, 0x0e,0x00,0x82,0x02,0x0d,0x00,0x02,0x03,0x0d,0x00,0x02,0x0d,0x00,0x87,0x02, 0x0c,0x00,0x83,0x02,0x0b,0x00,0x01,0x02,0x0a,0x00,0x83,0x01,0x0a,0x00,0x84, 0x01,0x09,0x00,0x83,0x01,0x08,0x00,0x84,0x01,0x07,0x00,0x82,0x01,0x06,0x00, 0x86,0x00,0x06,0x00,0x84,0x00,0x05,0x00,0x83,0x00,0x04,0x00,0x83,0x00,0x03, 0x00,0x84,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xde,0x00,0x00,0x00,0x03,0x47, 0xa5,0x18,0x46,0xa3,0x16,0x45,0xa2,0x15,0x82,0x46,0xa3,0x16,0x09,0x45,0xa2, 0x15,0x45,0xa2,0x17,0x46,0xa1,0x17,0x46,0xa1,0x15,0x45,0xa2,0x15,0x45,0xa5, 0x17,0x44,0xa1,0x16,0x46,0xa1,0x17,0x45,0xa1,0x16,0x82,0x44,0xa0,0x15,0x83, 0x43,0x9f,0x16,0x21,0x41,0x9d,0x14,0x42,0x9e,0x15,0x44,0xa0,0x17,0x42,0x9e, 0x13,0x43,0x9f,0x14,0x41,0x9c,0x16,0x40,0x9c,0x13,0x42,0x9e,0x15,0x41,0x9d, 0x14,0x42,0x9e,0x15,0x41,0x9d,0x14,0x41,0x9c,0x16,0x40,0x9b,0x15,0x41,0x9d, 0x13,0x43,0x9e,0x18,0x41,0x9c,0x16,0x42,0x9c,0x14,0x41,0x9d,0x13,0x40,0x9c, 0x13,0x40,0x9a,0x14,0x3f,0x9b,0x14,0x41,0x9c,0x16,0x40,0x9a,0x14,0x3f,0x9a, 0x13,0x40,0x9a,0x14,0x41,0x9b,0x15,0x40,0x9a,0x14,0x40,0x9a,0x13,0x40,0x9a, 0x14,0x40,0x9b,0x13,0x40,0x9b,0x15,0x40,0x9a,0x14,0x40,0x99,0x14,0x82,0x3f, 0x9a,0x14,0x82,0x3e,0x99,0x13,0x01,0x3f,0x9a,0x14,0x82,0x3f,0x98,0x13,0x05, 0x40,0x9a,0x15,0x3e,0x99,0x13,0x3f,0x9a,0x14,0x3f,0x98,0x15,0x40,0x99,0x16, 0x82,0x3f,0x9a,0x16,0x01,0x3d,0x98,0x14,0x82,0x3f,0x98,0x15,0x05,0x3f,0x97, 0x17,0x40,0x98,0x18,0x40,0x95,0x18,0x3e,0x96,0x16,0x3e,0x96,0x18,0x82,0x3e, 0x96,0x16,0x08,0x3f,0x97,0x19,0x40,0x98,0x19,0x40,0x98,0x18,0x3f,0x97,0x19, 0x3d,0x97,0x18,0x3e,0x96,0x18,0x3d,0x95,0x17,0x3e,0x96,0x18,0x82,0x3f,0x97, 0x19,0x02,0x3e,0x96,0x16,0x3f,0x97,0x17,0x83,0x3f,0x97,0x19,0x01,0x3e,0x96, 0x19,0x82,0x3f,0x97,0x1a,0x05,0x40,0x98,0x1b,0x40,0x98,0x19,0x41,0x97,0x1b, 0x42,0x98,0x1c,0x40,0x98,0x1b,0x83,0x40,0x99,0x1c,0x01,0x41,0x9a,0x1d,0x82, 0x40,0x98,0x1b,0x83,0x40,0x99,0x1c,0x06,0x3f,0x98,0x1b,0x40,0x99,0x1c,0x40, 0x98,0x1b,0x40,0x98,0x1d,0x40,0x99,0x1c,0x40,0x98,0x1b,0x82,0x40,0x99,0x1c, 0x01,0x42,0x9a,0x1e,0x82,0x40,0x99,0x1c,0x01,0x40,0x98,0x1b,0x83,0x40,0x99, 0x1c,0x82,0x40,0x98,0x1b,0x0a,0x40,0x99,0x1c,0x42,0x9a,0x1f,0x40,0x98,0x1b, 0x40,0x9a,0x1d,0x42,0x9a,0x1e,0x41,0x9a,0x1d,0x40,0x98,0x1b,0x40,0x99,0x1c, 0x41,0x9a,0x1d,0x42,0x9a,0x1e,0x83,0x40,0x99,0x1c,0x02,0x40,0x98,0x1b,0x40, 0x99,0x1c,0x82,0x40,0x9a,0x1d,0x04,0x41,0x9a,0x1e,0x41,0x9a,0x1d,0x43,0x9b, 0x1f,0x41,0x9a,0x1b,0x83,0x40,0x9a,0x1b,0x83,0x41,0x9a,0x1d,0x02,0x40,0x9a, 0x1d,0x42,0x9b,0x1f,0x82,0x42,0x9a,0x1e,0x05,0x41,0x9a,0x1d,0x40,0x9a,0x1d, 0x43,0x9b,0x1f,0x41,0x9a,0x1d,0x45,0x9d,0x1f,0x83,0x41,0x9b,0x1c,0x01,0x40, 0x9a,0x1d,0x82,0x40,0x99,0x1c,0x05,0x42,0x9a,0x1e,0x43,0x9b,0x1d,0x42,0x9a, 0x1c,0x40,0x9a,0x1a,0x40,0x9a,0x1b,0x83,0x41,0x9b,0x1c,0x01,0x42,0x9a,0x1c, 0x82,0x41,0x9a,0x1b,0x02,0x40,0x99,0x1a,0x42,0x9a,0x1e,0x82,0x41,0x9a,0x1d, 0x03,0x42,0x9a,0x1e,0x40,0x98,0x1b,0x40,0x9a,0x1d,0x82,0x41,0x9a,0x1e,0x01, 0x40,0x99,0x1c,0x82,0x41,0x9a,0x1d,0x04,0x40,0x99,0x1c,0x43,0x9b,0x1f,0x40, 0x99,0x1c,0x42,0x9a,0x1e,0x82,0x41,0x9a,0x1d,0x83,0x40,0x99,0x1c,0x05,0x41, 0x99,0x1e,0x40,0x99,0x1c,0x41,0x9a,0x1d,0x40,0x98,0x1d,0x40,0x98,0x1b,0x82, 0x42,0x9a,0x1e,0x02,0x40,0x99,0x1c,0x40,0x98,0x1b,0x82,0x40,0x98,0x1d,0x02, 0x3f,0x96,0x1b,0x40,0x98,0x1d,0x82,0x40,0x98,0x1b,0x16,0x40,0x97,0x1c,0x41, 0x99,0x1e,0x41,0x97,0x1b,0x41,0x99,0x1e,0x41,0x9a,0x1b,0x40,0x98,0x1b,0x41, 0x9a,0x1b,0x40,0x97,0x1c,0x41,0x9a,0x1b,0x41,0x9a,0x1d,0x3f,0x97,0x1a,0x41, 0x9a,0x1d,0x43,0x9b,0x1d,0x42,0x9a,0x1c,0x41,0x9b,0x1c,0x43,0x9b,0x1d,0x42, 0x9a,0x1c,0x42,0x9a,0x1a,0x41,0x9b,0x1c,0x43,0x9d,0x1e,0x43,0x9d,0x1c,0x44, 0x9e,0x1d,0x82,0x42,0x9c,0x1b,0x0f,0x41,0x9b,0x1a,0x43,0x9d,0x1c,0x44,0x9c, 0x1c,0x44,0x9c,0x1e,0x43,0x9d,0x1e,0x41,0x9b,0x1c,0x42,0x9c,0x1d,0x43,0x9b, 0x1d,0x40,0x99,0x1a,0x41,0x9a,0x1b,0x44,0x9c,0x1e,0x42,0x9a,0x1c,0x43,0x9b, 0x1d,0x40,0x99,0x1c,0x41,0x9a,0x1d,0x82,0x42,0x9a,0x1e,0x1b,0x41,0x9a,0x1d, 0x43,0x9d,0x1e,0x44,0x9e,0x1f,0x45,0x9d,0x1f,0x42,0x9a,0x1c,0x45,0x9a,0x1d, 0x40,0x99,0x1c,0x42,0x9a,0x1e,0x41,0x99,0x1e,0x41,0x97,0x1c,0x42,0x97,0x1f, 0x44,0x99,0x20,0x42,0x97,0x1f,0x44,0x9a,0x1f,0x45,0x9a,0x20,0x43,0x97,0x1d, 0x42,0x96,0x1e,0x47,0x9b,0x21,0x43,0x96,0x20,0x43,0x97,0x1f,0x40,0x94,0x1e, 0x43,0x97,0x1f,0x42,0x96,0x1e,0x41,0x94,0x1f,0x40,0x94,0x1c,0x42,0x97,0x1f, 0x40,0x94,0x1c,0x83,0x40,0x94,0x1b,0x82,0x41,0x95,0x1b,0x01,0x3f,0x93,0x1a, 0x84,0x3d,0x91,0x17,0x05,0x3c,0x90,0x18,0x3f,0x93,0x1a,0x3d,0x91,0x19,0x3c, 0x90,0x18,0x3f,0x90,0x19,0x82,0x3c,0x8d,0x18,0x07,0x3b,0x8d,0x17,0x3b,0x8e, 0x19,0x3a,0x8b,0x18,0x3a,0x8a,0x17,0x37,0x87,0x15,0x39,0x88,0x16,0x36,0x86, 0x14,0x82,0x39,0x87,0x16,0x0a,0x34,0x81,0x14,0x2d,0x7a,0x0e,0x26,0x72,0x09, 0x20,0x6c,0x08,0x21,0x6d,0x07,0x20,0x6a,0x06,0x21,0x6a,0x08,0x20,0x69,0x05, 0x21,0x69,0x08,0x20,0x68,0x07,0x82,0x1f,0x67,0x07,0x0d,0x1d,0x66,0x06,0x1d, 0x64,0x06,0x1d,0x65,0x06,0x1e,0x65,0x07,0x1c,0x63,0x06,0x1b,0x62,0x05,0x1a, 0x61,0x04,0x1a,0x60,0x04,0x1b,0x61,0x05,0x19,0x60,0x05,0x1a,0x5e,0x04,0x19, 0x5f,0x05,0x19,0x5e,0x04,0x82,0x19,0x5c,0x04,0x03,0x19,0x5a,0x03,0x19,0x5d, 0x04,0x16,0x5a,0x01,0x83,0x17,0x5a,0x03,0x01,0x15,0x59,0x00,0x82,0x16,0x59, 0x03,0x06,0x17,0x58,0x02,0x18,0x58,0x02,0x15,0x58,0x01,0x17,0x5a,0x03,0x18, 0x58,0x02,0x17,0x56,0x01,0x82,0x16,0x58,0x02,0x15,0x16,0x57,0x02,0x16,0x58, 0x03,0x15,0x57,0x02,0x15,0x56,0x02,0x14,0x55,0x01,0x16,0x57,0x03,0x16,0x57, 0x04,0x15,0x56,0x03,0x16,0x56,0x01,0x17,0x57,0x03,0x18,0x55,0x02,0x15,0x54, 0x00,0x14,0x53,0x00,0x15,0x53,0x02,0x15,0x55,0x04,0x15,0x55,0x03,0x15,0x53, 0x01,0x16,0x54,0x02,0x16,0x54,0x03,0x17,0x54,0x04,0x16,0x53,0x02,0x82,0x15, 0x53,0x01,0x07,0x15,0x53,0x02,0x15,0x54,0x03,0x15,0x53,0x02,0x15,0x52,0x02, 0x16,0x53,0x03,0x16,0x53,0x01,0x15,0x51,0x02,0x82,0x14,0x50,0x02,0x04,0x13, 0x4f,0x00,0x14,0x4f,0x01,0x14,0x51,0x02,0x15,0x50,0x02,0x83,0x14,0x4f,0x02, 0x01,0x14,0x4e,0x02,0x82,0x15,0x4f,0x01,0x0e,0x14,0x4f,0x02,0x15,0x50,0x03, 0x15,0x4f,0x03,0x13,0x4d,0x02,0x13,0x4d,0x03,0x14,0x4d,0x03,0x16,0x4d,0x02, 0x15,0x4c,0x01,0x13,0x4d,0x01,0x14,0x4d,0x02,0x13,0x4c,0x01,0x13,0x4b,0x01, 0x14,0x4c,0x02,0x14,0x4d,0x03,0x82,0x14,0x4b,0x02,0x04,0x15,0x4a,0x02,0x15, 0x49,0x02,0x13,0x48,0x01,0x13,0x4a,0x01,0x82,0x13,0x4a,0x02,0x04,0x13,0x49, 0x02,0x13,0x48,0x02,0x13,0x47,0x01,0x12,0x48,0x01,0x82,0x13,0x49,0x03,0x03, 0x13,0x48,0x02,0x13,0x49,0x03,0x13,0x48,0x02,0x82,0x13,0x47,0x01,0x03,0x12, 0x46,0x02,0x13,0x46,0x03,0x12,0x46,0x02,0x82,0x13,0x46,0x03,0x09,0x13,0x45, 0x03,0x12,0x45,0x02,0x12,0x46,0x01,0x12,0x45,0x01,0x12,0x46,0x01,0x13,0x46, 0x02,0x11,0x44,0x02,0x11,0x42,0x02,0x12,0x44,0x02,0x82,0x11,0x43,0x02,0x06, 0x12,0x42,0x03,0x11,0x41,0x03,0x10,0x40,0x02,0x11,0x41,0x02,0x11,0x43,0x02, 0x13,0x43,0x04,0x82,0x11,0x40,0x02,0x82,0x12,0x40,0x02,0x16,0x11,0x40,0x02, 0x11,0x40,0x03,0x10,0x40,0x02,0x11,0x3f,0x02,0x11,0x40,0x02,0x12,0x3f,0x03, 0x10,0x3f,0x02,0x10,0x3f,0x01,0x10,0x3d,0x01,0x10,0x3e,0x02,0x11,0x3d,0x01, 0x11,0x3e,0x03,0x10,0x3d,0x02,0x10,0x3c,0x00,0x10,0x3d,0x02,0x10,0x3c,0x02, 0x10,0x3b,0x01,0x0f,0x3b,0x01,0x0f,0x3a,0x01,0x0f,0x3b,0x02,0x0f,0x3a,0x02, 0x0e,0x3a,0x02,0x82,0x0f,0x3a,0x01,0x82,0x0e,0x39,0x02,0x82,0x0f,0x39,0x01, 0x0c,0x0f,0x38,0x01,0x0f,0x38,0x02,0x0d,0x38,0x01,0x0e,0x38,0x01,0x0e,0x38, 0x02,0x0d,0x37,0x01,0x0d,0x36,0x01,0x0d,0x37,0x01,0x0e,0x36,0x01,0x0e,0x37, 0x02,0x0e,0x36,0x02,0x0d,0x35,0x01,0x82,0x0d,0x34,0x01,0x02,0x0e,0x35,0x02, 0x0c,0x34,0x01,0x82,0x0e,0x33,0x01,0x06,0x0e,0x33,0x02,0x0d,0x33,0x01,0x0d, 0x32,0x00,0x0e,0x33,0x01,0x0d,0x33,0x01,0x0d,0x33,0x02,0x82,0x0d,0x32,0x02, 0x02,0x0c,0x31,0x02,0x0d,0x32,0x02,0x83,0x0d,0x31,0x02,0x83,0x0c,0x30,0x01, 0x82,0x0c,0x2f,0x01,0x05,0x0c,0x2e,0x00,0x0c,0x2f,0x02,0x0c,0x2f,0x01,0x0c, 0x2d,0x00,0x0b,0x2d,0x00,0x83,0x0c,0x2d,0x01,0x06,0x0c,0x2d,0x02,0x0c,0x2d, 0x01,0x0b,0x2c,0x00,0x0c,0x2b,0x01,0x0c,0x2b,0x00,0x0c,0x2c,0x01,0x82,0x0b, 0x2b,0x01,0x0c,0x0b,0x2a,0x01,0x0a,0x29,0x01,0x0a,0x29,0x00,0x0b,0x2a,0x01, 0x0b,0x29,0x01,0x0b,0x28,0x01,0x0a,0x28,0x01,0x0b,0x28,0x01,0x09,0x27,0x00, 0x0a,0x27,0x00,0x0a,0x27,0x01,0x0a,0x27,0x00,0x82,0x0a,0x27,0x01,0x01,0x0b, 0x26,0x01,0x82,0x09,0x26,0x00,0x82,0x0a,0x26,0x01,0x04,0x09,0x26,0x01,0x09, 0x25,0x00,0x09,0x25,0x01,0x08,0x24,0x00,0x82,0x09,0x24,0x00,0x09,0x0a,0x23, 0x01,0x09,0x23,0x01,0x08,0x23,0x01,0x08,0x23,0x00,0x08,0x22,0x00,0x08,0x21, 0x00,0x08,0x22,0x01,0x07,0x21,0x00,0x09,0x21,0x01,0x82,0x08,0x20,0x00,0x82, 0x07,0x20,0x00,0x82,0x08,0x20,0x00,0x01,0x08,0x1f,0x00,0x82,0x07,0x1f,0x00, 0x01,0x06,0x1e,0x00,0x82,0x07,0x1e,0x00,0x03,0x06,0x1d,0x00,0x07,0x1d,0x00, 0x06,0x1d,0x00,0x85,0x06,0x1c,0x00,0x82,0x06,0x1b,0x00,0x83,0x06,0x1a,0x00, 0x87,0x06,0x19,0x00,0x82,0x06,0x18,0x00,0x01,0x06,0x17,0x00,0x82,0x05,0x17, 0x00,0x82,0x05,0x16,0x00,0x01,0x06,0x16,0x00,0x82,0x05,0x16,0x00,0x83,0x05, 0x15,0x00,0x82,0x05,0x14,0x00,0x01,0x04,0x13,0x00,0x83,0x05,0x13,0x00,0x82, 0x04,0x13,0x00,0x83,0x04,0x12,0x00,0x82,0x04,0x11,0x00,0x82,0x03,0x11,0x00, 0x84,0x03,0x10,0x00,0x02,0x03,0x0f,0x00,0x03,0x10,0x00,0x83,0x03,0x0f,0x00, 0x82,0x03,0x0e,0x00,0x82,0x02,0x0e,0x00,0x01,0x02,0x0d,0x00,0x82,0x03,0x0d, 0x00,0x01,0x02,0x0d,0x00,0x87,0x02,0x0c,0x00,0x83,0x02,0x0b,0x00,0x84,0x01, 0x0a,0x00,0x84,0x01,0x09,0x00,0x83,0x01,0x08,0x00,0x84,0x01,0x07,0x00,0x01, 0x01,0x06,0x00,0x87,0x00,0x06,0x00,0x83,0x00,0x05,0x00,0x84,0x00,0x04,0x00, 0x83,0x00,0x03,0x00,0x84,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xde,0x00,0x00, 0x00,0x0d,0x45,0xa2,0x16,0x44,0xa1,0x15,0x46,0xa3,0x17,0x44,0xa2,0x15,0x45, 0xa4,0x17,0x44,0xa1,0x15,0x44,0xa1,0x17,0x44,0xa0,0x16,0x46,0xa1,0x16,0x44, 0xa2,0x14,0x44,0xa4,0x17,0x44,0xa0,0x16,0x45,0xa0,0x17,0x82,0x42,0xa0,0x14, 0x05,0x44,0x9f,0x16,0x45,0xa0,0x17,0x43,0x9d,0x14,0x42,0x9d,0x14,0x44,0x9e, 0x15,0x82,0x43,0x9d,0x14,0x82,0x44,0x9e,0x15,0x1a,0x40,0x9c,0x14,0x41,0x9d, 0x15,0x42,0x9d,0x16,0x42,0x9d,0x15,0x41,0x9d,0x15,0x40,0x9c,0x14,0x41,0x9c, 0x14,0x40,0x9b,0x14,0x3f,0x9b,0x14,0x3e,0x9a,0x13,0x3f,0x9c,0x12,0x42,0x9e, 0x14,0x41,0x9d,0x15,0x3e,0x9a,0x14,0x3f,0x9b,0x14,0x40,0x9c,0x14,0x3f,0x99, 0x14,0x40,0x9a,0x14,0x3d,0x99,0x13,0x3f,0x99,0x14,0x40,0x9a,0x14,0x3e,0x98, 0x13,0x40,0x9a,0x14,0x3e,0x9a,0x14,0x3f,0x9b,0x14,0x3e,0x9a,0x14,0x82,0x3e, 0x98,0x14,0x82,0x3d,0x97,0x14,0x0c,0x3d,0x99,0x14,0x3d,0x98,0x14,0x3e,0x97, 0x16,0x3f,0x99,0x15,0x3d,0x97,0x14,0x3d,0x98,0x14,0x3d,0x97,0x15,0x3e,0x97, 0x16,0x3d,0x96,0x15,0x3d,0x96,0x14,0x3d,0x96,0x15,0x3e,0x97,0x16,0x82,0x3d, 0x96,0x15,0x82,0x3d,0x96,0x14,0x82,0x3d,0x96,0x16,0x0d,0x3c,0x95,0x15,0x3c, 0x96,0x16,0x3e,0x97,0x18,0x3f,0x96,0x17,0x3d,0x94,0x15,0x3d,0x96,0x17,0x3d, 0x97,0x17,0x3e,0x97,0x18,0x3c,0x96,0x18,0x3d,0x96,0x18,0x3c,0x95,0x17,0x3e, 0x95,0x18,0x3d,0x96,0x19,0x82,0x3d,0x96,0x16,0x82,0x3e,0x97,0x18,0x82,0x3d, 0x96,0x19,0x03,0x3f,0x96,0x19,0x3e,0x97,0x1a,0x3d,0x96,0x19,0x82,0x3e,0x97, 0x1a,0x01,0x3e,0x95,0x19,0x82,0x3d,0x96,0x1a,0x83,0x3e,0x97,0x1a,0x01,0x3f, 0x97,0x1b,0x82,0x3e,0x96,0x1b,0x82,0x3f,0x97,0x1b,0x03,0x3e,0x96,0x1b,0x3d, 0x97,0x1b,0x3e,0x96,0x1b,0x82,0x40,0x96,0x1b,0x11,0x3e,0x96,0x1b,0x3d,0x96, 0x1a,0x3f,0x97,0x1b,0x3e,0x96,0x1b,0x3f,0x97,0x1b,0x3d,0x96,0x1a,0x3e,0x96, 0x1b,0x3f,0x97,0x1b,0x42,0x9b,0x1d,0x40,0x99,0x1b,0x3f,0x97,0x1b,0x40,0x99, 0x1b,0x40,0x98,0x1c,0x3f,0x97,0x1b,0x40,0x98,0x1c,0x3e,0x98,0x1b,0x3f,0x99, 0x1c,0x83,0x3f,0x97,0x1b,0x82,0x40,0x98,0x1c,0x82,0x40,0x99,0x1b,0x08,0x40, 0x9a,0x1c,0x3f,0x99,0x1b,0x40,0x99,0x1b,0x40,0x9a,0x1c,0x41,0x9b,0x1d,0x40, 0x9a,0x1c,0x41,0x9b,0x1d,0x42,0x9b,0x1d,0x82,0x40,0x99,0x1b,0x83,0x41,0x9b, 0x1d,0x03,0x3f,0x99,0x1b,0x41,0x9a,0x1c,0x42,0x9b,0x1d,0x82,0x40,0x9a,0x1c, 0x83,0x42,0x9b,0x1d,0x82,0x41,0x9b,0x1d,0x01,0x41,0x9a,0x1c,0x82,0x42,0x9b, 0x1d,0x01,0x41,0x9b,0x1d,0x82,0x42,0x9c,0x1e,0x05,0x41,0x9b,0x1d,0x41,0x9a, 0x1c,0x43,0x9c,0x1e,0x42,0x9b,0x1b,0x41,0x9a,0x1c,0x83,0x40,0x9a,0x1c,0x03, 0x41,0x9b,0x1d,0x40,0x9a,0x1c,0x42,0x9d,0x1c,0x82,0x41,0x9a,0x1c,0x01,0x40, 0x99,0x1b,0x83,0x41,0x9a,0x1c,0x01,0x42,0x9b,0x1d,0x82,0x40,0x99,0x1b,0x02, 0x41,0x9a,0x1c,0x43,0x9c,0x1e,0x82,0x41,0x9b,0x1d,0x04,0x40,0x9a,0x1c,0x3f, 0x99,0x1b,0x41,0x9b,0x1d,0x42,0x9b,0x1d,0x82,0x41,0x9a,0x1c,0x0a,0x40,0x9a, 0x1c,0x3f,0x99,0x1b,0x41,0x9a,0x1c,0x43,0x9c,0x1e,0x40,0x98,0x1c,0x3f,0x99, 0x1b,0x43,0x9c,0x1e,0x41,0x99,0x1d,0x3f,0x99,0x1b,0x41,0x9a,0x1c,0x82,0x42, 0x98,0x1b,0x01,0x41,0x9a,0x1c,0x82,0x40,0x98,0x1c,0x01,0x41,0x99,0x1d,0x82, 0x40,0x99,0x1b,0x0f,0x41,0x9a,0x1c,0x40,0x99,0x1b,0x41,0x99,0x1d,0x40,0x99, 0x1b,0x42,0x9b,0x1d,0x3f,0x98,0x1b,0x42,0x9b,0x1b,0x42,0x9b,0x1d,0x3f,0x98, 0x1b,0x42,0x9b,0x1d,0x41,0x9a,0x1c,0x3f,0x98,0x1b,0x42,0x9b,0x1d,0x43,0x9c, 0x1c,0x43,0x9d,0x1d,0x82,0x42,0x9d,0x1c,0x82,0x43,0x9d,0x1d,0x06,0x42,0x9d, 0x1c,0x42,0x9d,0x1b,0x43,0x9d,0x1b,0x42,0x9d,0x1b,0x44,0x9f,0x1b,0x43,0x9e, 0x1a,0x83,0x44,0x9f,0x1b,0x0d,0x44,0xa0,0x1b,0x43,0x9d,0x1b,0x42,0x9d,0x1b, 0x44,0x9d,0x1c,0x46,0x9f,0x1e,0x44,0x9d,0x1d,0x3f,0x98,0x19,0x43,0x9c,0x1c, 0x41,0x9a,0x1b,0x42,0x9b,0x1b,0x41,0x9a,0x1b,0x42,0x9b,0x1d,0x41,0x9a,0x1c, 0x82,0x44,0x9d,0x1f,0x02,0x44,0x9d,0x1e,0x43,0x9c,0x1c,0x82,0x44,0x9e,0x1e, 0x01,0x42,0x9d,0x1c,0x82,0x43,0x9c,0x1e,0x0b,0x43,0x99,0x1d,0x3f,0x95,0x1b, 0x42,0x98,0x1c,0x44,0x9a,0x1e,0x42,0x98,0x1c,0x44,0x9a,0x1e,0x44,0x99,0x20, 0x41,0x96,0x1d,0x44,0x99,0x1e,0x45,0x9c,0x1f,0x42,0x97,0x1e,0x82,0x42,0x96, 0x1d,0x0e,0x44,0x98,0x1f,0x42,0x96,0x1d,0x41,0x95,0x1e,0x44,0x99,0x1e,0x45, 0x9b,0x22,0x40,0x95,0x1b,0x41,0x96,0x1c,0x43,0x97,0x1e,0x40,0x95,0x1b,0x41, 0x96,0x1c,0x40,0x95,0x1b,0x3f,0x94,0x1b,0x3f,0x94,0x19,0x40,0x95,0x1a,0x83, 0x3e,0x93,0x18,0x15,0x3f,0x94,0x19,0x3c,0x90,0x15,0x3d,0x92,0x17,0x3e,0x93, 0x1a,0x3f,0x91,0x19,0x3e,0x90,0x18,0x3d,0x91,0x1b,0x3d,0x90,0x1a,0x39,0x8b, 0x14,0x39,0x8a,0x16,0x3b,0x8b,0x18,0x38,0x8b,0x17,0x38,0x88,0x16,0x37,0x87, 0x14,0x36,0x87,0x14,0x36,0x86,0x15,0x37,0x87,0x16,0x37,0x85,0x17,0x2f,0x7b, 0x10,0x22,0x70,0x07,0x20,0x6c,0x04,0x82,0x22,0x6d,0x07,0x08,0x22,0x6c,0x07, 0x21,0x6a,0x06,0x20,0x69,0x05,0x21,0x69,0x06,0x1f,0x68,0x06,0x1f,0x66,0x06, 0x1d,0x66,0x05,0x1e,0x66,0x06,0x82,0x1d,0x65,0x06,0x01,0x1e,0x63,0x06,0x82, 0x1b,0x62,0x05,0x0b,0x1b,0x61,0x06,0x1b,0x5f,0x05,0x1a,0x5f,0x05,0x19,0x5f, 0x04,0x1a,0x5d,0x03,0x19,0x5c,0x02,0x19,0x5b,0x02,0x18,0x5d,0x03,0x17,0x5b, 0x03,0x18,0x5a,0x02,0x17,0x59,0x02,0x82,0x16,0x59,0x02,0x0b,0x16,0x59,0x03, 0x16,0x58,0x01,0x15,0x59,0x02,0x16,0x58,0x01,0x17,0x58,0x02,0x18,0x59,0x03, 0x16,0x59,0x03,0x16,0x58,0x03,0x16,0x59,0x02,0x18,0x59,0x03,0x16,0x58,0x02, 0x82,0x16,0x59,0x03,0x0a,0x16,0x58,0x03,0x16,0x55,0x01,0x14,0x56,0x01,0x16, 0x57,0x03,0x15,0x57,0x03,0x18,0x55,0x00,0x16,0x57,0x01,0x16,0x56,0x01,0x14, 0x55,0x02,0x14,0x56,0x03,0x82,0x15,0x55,0x03,0x0a,0x16,0x53,0x02,0x15,0x54, 0x01,0x16,0x55,0x02,0x14,0x53,0x02,0x16,0x54,0x03,0x16,0x54,0x02,0x15,0x53, 0x01,0x16,0x54,0x03,0x15,0x54,0x02,0x15,0x53,0x03,0x82,0x14,0x52,0x02,0x83, 0x15,0x52,0x02,0x02,0x15,0x53,0x02,0x14,0x52,0x01,0x82,0x15,0x52,0x02,0x82, 0x15,0x51,0x02,0x02,0x14,0x50,0x02,0x14,0x4f,0x01,0x82,0x14,0x50,0x02,0x0e, 0x14,0x51,0x00,0x14,0x51,0x01,0x14,0x52,0x02,0x13,0x50,0x02,0x14,0x4f,0x02, 0x14,0x4e,0x02,0x15,0x4f,0x03,0x14,0x4e,0x02,0x14,0x4e,0x01,0x15,0x4e,0x03, 0x14,0x4e,0x02,0x14,0x4c,0x01,0x13,0x4b,0x01,0x14,0x4d,0x02,0x82,0x14,0x4c, 0x02,0x05,0x14,0x4c,0x01,0x14,0x4b,0x01,0x14,0x4b,0x02,0x14,0x4b,0x03,0x14, 0x4b,0x02,0x82,0x13,0x4b,0x02,0x07,0x14,0x4b,0x03,0x13,0x49,0x01,0x13,0x4a, 0x02,0x13,0x48,0x01,0x14,0x4a,0x03,0x14,0x49,0x03,0x13,0x49,0x02,0x82,0x12, 0x48,0x01,0x05,0x12,0x47,0x00,0x13,0x48,0x01,0x13,0x48,0x03,0x12,0x47,0x02, 0x14,0x48,0x03,0x82,0x13,0x47,0x03,0x12,0x12,0x46,0x02,0x13,0x45,0x02,0x12, 0x47,0x03,0x11,0x46,0x00,0x12,0x45,0x01,0x12,0x46,0x01,0x11,0x47,0x02,0x11, 0x44,0x00,0x11,0x44,0x01,0x11,0x43,0x02,0x11,0x44,0x02,0x12,0x44,0x02,0x12, 0x44,0x01,0x11,0x43,0x02,0x12,0x42,0x02,0x10,0x44,0x02,0x11,0x43,0x02,0x11, 0x42,0x02,0x82,0x11,0x41,0x02,0x0c,0x12,0x41,0x02,0x11,0x40,0x02,0x11,0x41, 0x02,0x11,0x41,0x03,0x0f,0x3f,0x01,0x11,0x3f,0x02,0x11,0x40,0x03,0x10,0x3f, 0x02,0x10,0x3e,0x02,0x10,0x3f,0x02,0x11,0x3e,0x02,0x11,0x3f,0x03,0x82,0x11, 0x3d,0x02,0x01,0x10,0x3e,0x03,0x82,0x10,0x3d,0x01,0x06,0x10,0x3d,0x02,0x10, 0x3c,0x02,0x0f,0x3d,0x02,0x0f,0x3b,0x01,0x0f,0x3a,0x01,0x0f,0x3b,0x02,0x82, 0x0f,0x3a,0x02,0x06,0x10,0x39,0x01,0x0f,0x39,0x02,0x0f,0x3a,0x03,0x10,0x39, 0x02,0x0f,0x39,0x01,0x0f,0x38,0x01,0x83,0x0e,0x38,0x01,0x82,0x0e,0x37,0x01, 0x04,0x0f,0x37,0x02,0x0f,0x36,0x01,0x0e,0x36,0x02,0x0e,0x36,0x01,0x82,0x0d, 0x36,0x01,0x01,0x0e,0x36,0x02,0x82,0x0d,0x36,0x02,0x01,0x0f,0x35,0x02,0x83, 0x0d,0x34,0x01,0x01,0x0e,0x34,0x02,0x82,0x0d,0x33,0x01,0x02,0x0d,0x33,0x00, 0x0d,0x33,0x02,0x82,0x0d,0x32,0x01,0x02,0x0d,0x31,0x01,0x0d,0x32,0x01,0x82, 0x0d,0x31,0x02,0x83,0x0d,0x30,0x02,0x02,0x0d,0x2f,0x01,0x0d,0x2f,0x02,0x82, 0x0c,0x2f,0x01,0x01,0x0d,0x2f,0x02,0x82,0x0c,0x2f,0x01,0x01,0x0b,0x2e,0x00, 0x82,0x0c,0x2e,0x01,0x09,0x0c,0x2d,0x00,0x0c,0x2d,0x01,0x0b,0x2d,0x01,0x0c, 0x2d,0x01,0x0b,0x2c,0x01,0x0b,0x2b,0x00,0x0c,0x2c,0x01,0x0b,0x2b,0x01,0x0b, 0x2a,0x01,0x82,0x0b,0x2b,0x01,0x02,0x0b,0x2a,0x02,0x0b,0x2a,0x01,0x82,0x0b, 0x29,0x00,0x83,0x0b,0x29,0x01,0x04,0x0a,0x29,0x00,0x0a,0x28,0x00,0x0b,0x28, 0x01,0x0a,0x28,0x01,0x82,0x0a,0x27,0x01,0x01,0x09,0x27,0x01,0x82,0x0a,0x26, 0x01,0x02,0x09,0x26,0x01,0x0a,0x26,0x00,0x83,0x09,0x25,0x01,0x03,0x09,0x24, 0x01,0x09,0x24,0x00,0x09,0x23,0x00,0x83,0x08,0x23,0x00,0x05,0x08,0x22,0x00, 0x09,0x22,0x01,0x08,0x22,0x01,0x07,0x22,0x00,0x09,0x22,0x01,0x82,0x08,0x21, 0x00,0x08,0x08,0x21,0x01,0x08,0x21,0x00,0x07,0x21,0x00,0x09,0x20,0x00,0x07, 0x20,0x00,0x07,0x1f,0x00,0x07,0x1e,0x00,0x07,0x1f,0x00,0x83,0x07,0x1e,0x00, 0x83,0x07,0x1d,0x00,0x01,0x06,0x1d,0x00,0x82,0x06,0x1c,0x00,0x86,0x06,0x1b, 0x00,0x83,0x06,0x1a,0x00,0x84,0x06,0x19,0x00,0x82,0x06,0x18,0x00,0x84,0x06, 0x17,0x00,0x04,0x05,0x17,0x00,0x05,0x16,0x00,0x06,0x16,0x00,0x05,0x16,0x00, 0x83,0x05,0x15,0x00,0x83,0x05,0x14,0x00,0x01,0x04,0x14,0x00,0x82,0x05,0x14, 0x00,0x83,0x04,0x13,0x00,0x83,0x04,0x12,0x00,0x02,0x03,0x11,0x00,0x04,0x11, 0x00,0x82,0x03,0x11,0x00,0x01,0x04,0x10,0x00,0x83,0x03,0x10,0x00,0x84,0x03, 0x0f,0x00,0x01,0x03,0x0e,0x00,0x82,0x02,0x0e,0x00,0x03,0x03,0x0e,0x00,0x02, 0x0d,0x00,0x03,0x0d,0x00,0x85,0x02,0x0d,0x00,0x84,0x02,0x0c,0x00,0x83,0x02, 0x0b,0x00,0x83,0x01,0x0a,0x00,0x01,0x02,0x0a,0x00,0x84,0x01,0x09,0x00,0x83, 0x01,0x08,0x00,0x84,0x01,0x07,0x00,0x01,0x01,0x06,0x00,0x86,0x00,0x06,0x00, 0x84,0x00,0x05,0x00,0x83,0x00,0x04,0x00,0x84,0x00,0x03,0x00,0x84,0x00,0x02, 0x00,0x83,0x00,0x01,0x00,0xde,0x00,0x00,0x00,0x02,0x44,0xa1,0x16,0x45,0xa2, 0x17,0x82,0x46,0xa3,0x16,0x10,0x45,0xa2,0x17,0x44,0xa1,0x16,0x44,0xa0,0x18, 0x43,0xa0,0x17,0x43,0xa0,0x15,0x42,0xa0,0x13,0x44,0xa1,0x15,0x42,0x9f,0x16, 0x41,0x9d,0x15,0x42,0xa0,0x15,0x43,0xa0,0x15,0x41,0x9d,0x15,0x43,0x9f,0x16, 0x41,0x9d,0x15,0x41,0x9c,0x15,0x42,0x9d,0x16,0x82,0x42,0x9e,0x15,0x02,0x41, 0x9d,0x15,0x42,0x9e,0x15,0x82,0x41,0x9e,0x16,0x02,0x41,0x9c,0x15,0x40,0x9b, 0x13,0x83,0x40,0x9a,0x14,0x08,0x41,0x9b,0x15,0x40,0x98,0x14,0x3f,0x99,0x13, 0x40,0x9c,0x14,0x3f,0x9b,0x14,0x3d,0x99,0x14,0x3f,0x9b,0x15,0x40,0x9a,0x15, 0x82,0x3e,0x98,0x14,0x03,0x3f,0x99,0x15,0x3e,0x98,0x14,0x3d,0x98,0x13,0x83, 0x3f,0x99,0x15,0x05,0x3c,0x98,0x13,0x3d,0x98,0x13,0x3d,0x97,0x15,0x3c,0x98, 0x15,0x3d,0x98,0x15,0x82,0x3d,0x99,0x14,0x06,0x3c,0x98,0x13,0x3c,0x97,0x12, 0x3b,0x95,0x13,0x3d,0x97,0x15,0x3c,0x96,0x14,0x3a,0x94,0x12,0x82,0x3c,0x96, 0x15,0x82,0x3b,0x95,0x15,0x82,0x3c,0x96,0x15,0x02,0x3d,0x97,0x16,0x3b,0x95, 0x15,0x82,0x3c,0x96,0x15,0x09,0x3b,0x95,0x15,0x3b,0x95,0x16,0x3c,0x96,0x15, 0x3b,0x95,0x15,0x3d,0x97,0x16,0x3c,0x93,0x15,0x3d,0x94,0x15,0x3c,0x96,0x17, 0x3b,0x96,0x17,0x82,0x3a,0x94,0x15,0x82,0x3c,0x96,0x17,0x82,0x3b,0x95,0x16, 0x02,0x3c,0x96,0x17,0x3d,0x97,0x18,0x83,0x3c,0x96,0x17,0x02,0x3c,0x95,0x18, 0x3e,0x95,0x18,0x82,0x3f,0x96,0x19,0x04,0x3e,0x98,0x19,0x3d,0x97,0x18,0x3c, 0x95,0x1a,0x3d,0x96,0x19,0x83,0x3e,0x97,0x1a,0x83,0x3d,0x96,0x19,0x82,0x3f, 0x95,0x1b,0x02,0x3e,0x97,0x1c,0x3d,0x96,0x19,0x82,0x3d,0x96,0x1b,0x82,0x3f, 0x95,0x1b,0x82,0x3d,0x96,0x1b,0x02,0x3e,0x97,0x1c,0x3f,0x98,0x1d,0x83,0x3d, 0x96,0x1b,0x02,0x3e,0x97,0x1c,0x3f,0x98,0x1a,0x84,0x3f,0x98,0x1b,0x04,0x3d, 0x96,0x1b,0x3e,0x97,0x1c,0x3e,0x98,0x1b,0x40,0x98,0x1c,0x83,0x3f,0x98,0x1b, 0x01,0x40,0x98,0x1c,0x82,0x3f,0x98,0x1b,0x03,0x41,0x99,0x1d,0x40,0x9a,0x1c, 0x40,0x99,0x1b,0x82,0x41,0x9a,0x1c,0x05,0x40,0x99,0x1b,0x3f,0x99,0x1b,0x41, 0x9a,0x1c,0x41,0x9b,0x1d,0x41,0x9a,0x1c,0x82,0x3f,0x98,0x1a,0x03,0x41,0x9b, 0x1d,0x3f,0x99,0x1b,0x40,0x9a,0x1c,0x82,0x41,0x9b,0x1d,0x83,0x40,0x9a,0x1c, 0x01,0x40,0x99,0x1b,0x82,0x41,0x9b,0x1d,0x04,0x40,0x9a,0x1c,0x41,0x9b,0x1d, 0x40,0x99,0x1b,0x41,0x9a,0x1c,0x83,0x41,0x9c,0x1d,0x02,0x41,0x9b,0x1d,0x40, 0x99,0x1b,0x83,0x41,0x9a,0x1c,0x82,0x40,0x9a,0x1c,0x82,0x41,0x9b,0x1d,0x03, 0x40,0x9a,0x1c,0x41,0x9b,0x1d,0x41,0x9a,0x1c,0x87,0x41,0x9b,0x1d,0x82,0x42, 0x9c,0x1d,0x83,0x41,0x9b,0x1d,0x82,0x40,0x9a,0x1c,0x04,0x41,0x9b,0x1d,0x43, 0x9d,0x1d,0x41,0x9b,0x1d,0x40,0x9a,0x1c,0x83,0x41,0x9b,0x1d,0x01,0x43,0x9d, 0x1e,0x82,0x41,0x9b,0x1d,0x09,0x43,0x9a,0x1d,0x41,0x9a,0x1d,0x40,0x99,0x1b, 0x41,0x9a,0x1c,0x41,0x9b,0x1d,0x41,0x9a,0x1c,0x41,0x9c,0x1d,0x41,0x9a,0x1d, 0x41,0x99,0x1d,0x82,0x41,0x9b,0x1d,0x03,0x42,0x9c,0x1d,0x41,0x9b,0x1d,0x3f, 0x98,0x1a,0x82,0x41,0x9b,0x1d,0x82,0x41,0x9a,0x1c,0x0b,0x42,0x9c,0x1c,0x42, 0x9c,0x1d,0x41,0x9b,0x1b,0x40,0x99,0x1b,0x41,0x9a,0x1c,0x42,0x9c,0x1c,0x43, 0x9d,0x1d,0x43,0x9d,0x1b,0x42,0x9e,0x1b,0x41,0x9d,0x1a,0x41,0x9d,0x1c,0x83, 0x43,0x9f,0x1d,0x82,0x43,0x9f,0x1c,0x05,0x45,0xa1,0x1c,0x43,0xa0,0x1a,0x45, 0xa1,0x1c,0x43,0xa0,0x1a,0x44,0xa0,0x1d,0x82,0x43,0x9f,0x1c,0x02,0x42,0x9e, 0x1d,0x41,0x9c,0x1b,0x82,0x44,0x9e,0x1c,0x09,0x47,0xa0,0x1e,0x42,0x9c,0x1a, 0x42,0x9c,0x1c,0x41,0x9b,0x1d,0x42,0x9c,0x1d,0x44,0x9e,0x1f,0x43,0x9d,0x1e, 0x42,0x9c,0x1d,0x44,0x9e,0x1d,0x82,0x43,0x9d,0x1d,0x04,0x42,0x9c,0x1c,0x42, 0x9e,0x1d,0x45,0xa0,0x1f,0x44,0xa0,0x1e,0x82,0x42,0x9c,0x1d,0x07,0x41,0x98, 0x1b,0x41,0x9a,0x1d,0x43,0x9c,0x1f,0x42,0x99,0x1c,0x45,0x9c,0x1e,0x45,0x9c, 0x1f,0x42,0x99,0x1d,0x82,0x43,0x9a,0x1d,0x09,0x44,0x9b,0x1e,0x41,0x98,0x1d, 0x45,0x9c,0x1f,0x42,0x97,0x1f,0x41,0x96,0x1e,0x43,0x98,0x1d,0x42,0x98,0x1d, 0x45,0x9a,0x20,0x41,0x97,0x1d,0x82,0x42,0x98,0x1d,0x08,0x43,0x98,0x1e,0x42, 0x98,0x1d,0x41,0x97,0x1d,0x41,0x96,0x1c,0x40,0x95,0x1b,0x40,0x97,0x1a,0x40, 0x95,0x19,0x3e,0x93,0x17,0x82,0x40,0x95,0x19,0x06,0x3f,0x94,0x1a,0x3d,0x92, 0x18,0x3d,0x92,0x16,0x3e,0x93,0x17,0x3e,0x93,0x19,0x41,0x94,0x1b,0x82,0x3b, 0x90,0x18,0x08,0x3d,0x90,0x18,0x3a,0x8d,0x15,0x39,0x8a,0x15,0x3a,0x8d,0x18, 0x39,0x8a,0x15,0x39,0x8a,0x17,0x38,0x89,0x16,0x36,0x86,0x15,0x82,0x35,0x85, 0x14,0x06,0x39,0x87,0x15,0x36,0x84,0x18,0x2b,0x78,0x0e,0x24,0x70,0x07,0x22, 0x6d,0x07,0x21,0x6a,0x07,0x82,0x22,0x6c,0x07,0x04,0x22,0x6b,0x07,0x20,0x6a, 0x07,0x1f,0x6a,0x07,0x20,0x69,0x07,0x82,0x1e,0x68,0x07,0x05,0x1e,0x66,0x06, 0x1d,0x65,0x07,0x1d,0x64,0x06,0x1b,0x64,0x05,0x1c,0x63,0x05,0x82,0x1b,0x61, 0x06,0x82,0x1a,0x60,0x05,0x0f,0x1b,0x5e,0x04,0x17,0x5d,0x02,0x1a,0x5e,0x04, 0x19,0x5d,0x04,0x18,0x5b,0x02,0x18,0x5b,0x03,0x17,0x5b,0x03,0x17,0x5c,0x04, 0x18,0x5a,0x03,0x17,0x59,0x02,0x15,0x59,0x02,0x16,0x58,0x01,0x16,0x57,0x01, 0x15,0x57,0x01,0x15,0x58,0x02,0x82,0x16,0x58,0x03,0x01,0x17,0x58,0x02,0x82, 0x15,0x58,0x02,0x01,0x16,0x59,0x03,0x82,0x17,0x57,0x02,0x02,0x16,0x56,0x01, 0x17,0x57,0x02,0x82,0x15,0x57,0x02,0x08,0x16,0x57,0x03,0x17,0x56,0x02,0x15, 0x56,0x02,0x16,0x57,0x03,0x16,0x57,0x04,0x15,0x56,0x03,0x15,0x55,0x02,0x16, 0x56,0x02,0x83,0x15,0x54,0x02,0x01,0x15,0x53,0x02,0x82,0x15,0x54,0x01,0x01, 0x15,0x55,0x02,0x82,0x15,0x53,0x03,0x01,0x15,0x52,0x02,0x82,0x15,0x51,0x02, 0x03,0x15,0x52,0x01,0x15,0x54,0x02,0x15,0x53,0x00,0x84,0x15,0x52,0x02,0x83, 0x15,0x51,0x02,0x04,0x14,0x50,0x02,0x14,0x51,0x01,0x14,0x50,0x00,0x14,0x51, 0x02,0x82,0x15,0x50,0x02,0x01,0x15,0x50,0x01,0x82,0x15,0x50,0x02,0x0a,0x14, 0x4f,0x00,0x15,0x50,0x01,0x14,0x4f,0x02,0x14,0x4e,0x01,0x13,0x4d,0x01,0x15, 0x4e,0x03,0x14,0x4d,0x02,0x15,0x4c,0x02,0x15,0x4c,0x01,0x15,0x4c,0x02,0x82, 0x14,0x4c,0x02,0x12,0x13,0x4b,0x01,0x13,0x4b,0x02,0x15,0x4b,0x03,0x15,0x49, 0x02,0x13,0x4a,0x02,0x12,0x49,0x01,0x14,0x49,0x02,0x14,0x4a,0x03,0x12,0x48, 0x01,0x13,0x49,0x02,0x14,0x49,0x03,0x13,0x48,0x01,0x12,0x48,0x01,0x13,0x48, 0x02,0x13,0x48,0x03,0x12,0x47,0x01,0x14,0x48,0x03,0x13,0x47,0x02,0x82,0x13, 0x48,0x01,0x12,0x14,0x46,0x01,0x12,0x48,0x01,0x11,0x47,0x02,0x12,0x46,0x02, 0x10,0x45,0x01,0x11,0x46,0x02,0x12,0x45,0x01,0x11,0x44,0x00,0x10,0x43,0x00, 0x13,0x42,0x01,0x11,0x44,0x02,0x11,0x43,0x00,0x12,0x42,0x00,0x10,0x43,0x02, 0x11,0x43,0x02,0x11,0x42,0x04,0x11,0x41,0x02,0x12,0x41,0x02,0x82,0x12,0x42, 0x03,0x84,0x11,0x41,0x02,0x06,0x10,0x40,0x02,0x0f,0x41,0x02,0x10,0x40,0x02, 0x10,0x41,0x02,0x11,0x40,0x03,0x10,0x3e,0x01,0x82,0x10,0x3f,0x02,0x02,0x10, 0x3d,0x01,0x10,0x3f,0x03,0x82,0x10,0x3e,0x01,0x82,0x10,0x3d,0x02,0x02,0x0f, 0x3d,0x02,0x10,0x3d,0x03,0x82,0x0f,0x3b,0x01,0x0a,0x0f,0x3a,0x02,0x10,0x3b, 0x03,0x0e,0x3a,0x02,0x0e,0x3a,0x01,0x10,0x3a,0x01,0x0e,0x39,0x01,0x0e,0x3a, 0x01,0x0f,0x3a,0x02,0x0e,0x39,0x01,0x0f,0x3a,0x02,0x82,0x0e,0x39,0x01,0x05, 0x0e,0x39,0x02,0x0e,0x37,0x01,0x0f,0x37,0x01,0x0e,0x37,0x02,0x0e,0x37,0x01, 0x84,0x0e,0x36,0x01,0x01,0x0e,0x35,0x01,0x83,0x0e,0x34,0x01,0x08,0x0e,0x33, 0x01,0x0e,0x34,0x02,0x0e,0x34,0x01,0x0e,0x33,0x01,0x0e,0x33,0x00,0x0e,0x32, 0x01,0x0d,0x32,0x00,0x0e,0x32,0x01,0x84,0x0d,0x32,0x01,0x82,0x0d,0x31,0x02, 0x04,0x0c,0x30,0x01,0x0d,0x31,0x01,0x0d,0x30,0x01,0x0d,0x30,0x02,0x82,0x0d, 0x2f,0x02,0x83,0x0c,0x2f,0x01,0x01,0x0c,0x2e,0x01,0x82,0x0c,0x2d,0x00,0x04, 0x0c,0x2d,0x01,0x0c,0x2e,0x01,0x0c,0x2d,0x01,0x0c,0x2d,0x02,0x82,0x0c,0x2c, 0x01,0x83,0x0b,0x2b,0x01,0x06,0x0a,0x2b,0x00,0x0b,0x2b,0x02,0x0b,0x2b,0x01, 0x0b,0x2a,0x01,0x0a,0x2b,0x01,0x0a,0x2a,0x00,0x83,0x0b,0x29,0x00,0x02,0x0a, 0x29,0x01,0x0a,0x29,0x02,0x82,0x0a,0x28,0x01,0x07,0x0b,0x27,0x01,0x0a,0x27, 0x01,0x0b,0x27,0x02,0x0a,0x25,0x00,0x0a,0x26,0x01,0x0a,0x26,0x00,0x09,0x25, 0x00,0x82,0x09,0x25,0x01,0x82,0x09,0x24,0x01,0x10,0x08,0x24,0x00,0x09,0x24, 0x01,0x09,0x23,0x00,0x09,0x24,0x01,0x08,0x23,0x00,0x08,0x23,0x01,0x08,0x22, 0x01,0x08,0x22,0x00,0x07,0x22,0x00,0x08,0x22,0x01,0x08,0x21,0x01,0x08,0x21, 0x00,0x07,0x21,0x00,0x08,0x20,0x00,0x08,0x21,0x00,0x08,0x20,0x00,0x83,0x07, 0x1f,0x00,0x83,0x07,0x1e,0x00,0x82,0x07,0x1d,0x00,0x82,0x07,0x1d,0x01,0x82, 0x07,0x1d,0x00,0x84,0x07,0x1c,0x00,0x01,0x07,0x1b,0x00,0x82,0x06,0x1b,0x00, 0x82,0x06,0x1a,0x00,0x02,0x06,0x19,0x00,0x07,0x19,0x00,0x82,0x06,0x19,0x00, 0x83,0x06,0x18,0x00,0x83,0x06,0x17,0x00,0x01,0x05,0x17,0x00,0x83,0x05,0x16, 0x00,0x86,0x05,0x15,0x00,0x83,0x05,0x14,0x00,0x83,0x04,0x13,0x00,0x83,0x04, 0x12,0x00,0x82,0x04,0x11,0x00,0x82,0x03,0x11,0x00,0x01,0x04,0x10,0x00,0x82, 0x03,0x10,0x00,0x85,0x03,0x0f,0x00,0x01,0x03,0x0e,0x00,0x84,0x02,0x0e,0x00, 0x02,0x03,0x0e,0x00,0x02,0x0e,0x00,0x85,0x02,0x0d,0x00,0x83,0x02,0x0c,0x00, 0x84,0x02,0x0b,0x00,0x03,0x02,0x0a,0x00,0x01,0x0a,0x00,0x02,0x0a,0x00,0x85, 0x01,0x09,0x00,0x82,0x01,0x08,0x00,0x85,0x01,0x07,0x00,0x83,0x00,0x07,0x00, 0x84,0x00,0x06,0x00,0x83,0x00,0x05,0x00,0x84,0x00,0x04,0x00,0x83,0x00,0x03, 0x00,0x84,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xde,0x00,0x00,0x00,0x06,0x40, 0x9d,0x14,0x43,0xa0,0x17,0x42,0x9f,0x16,0x45,0xa3,0x19,0x42,0x9f,0x17,0x43, 0xa0,0x17,0x82,0x41,0x9e,0x16,0x04,0x42,0x9f,0x17,0x41,0x9e,0x15,0x41,0x9c, 0x15,0x42,0x9d,0x16,0x82,0x40,0x9d,0x15,0x05,0x42,0x9d,0x16,0x43,0x9b,0x17, 0x3e,0x98,0x15,0x3f,0x9a,0x17,0x40,0x9b,0x17,0x82,0x3e,0x98,0x15,0x05,0x3f, 0x9a,0x17,0x3e,0x98,0x15,0x3e,0x9a,0x14,0x3e,0x9b,0x15,0x3f,0x9a,0x17,0x82, 0x3e,0x99,0x13,0x04,0x3c,0x96,0x13,0x3d,0x97,0x14,0x3e,0x98,0x15,0x3e,0x99, 0x16,0x82,0x3e,0x96,0x13,0x0b,0x3e,0x98,0x15,0x3c,0x98,0x16,0x3a,0x96,0x12, 0x3d,0x98,0x12,0x3c,0x96,0x13,0x3e,0x95,0x17,0x3a,0x94,0x13,0x3c,0x96,0x15, 0x3e,0x98,0x17,0x3b,0x95,0x14,0x3a,0x94,0x13,0x85,0x3c,0x96,0x15,0x82,0x3b, 0x95,0x14,0x01,0x3c,0x96,0x15,0x82,0x3b,0x97,0x13,0x0d,0x3c,0x98,0x16,0x3c, 0x96,0x15,0x3b,0x95,0x14,0x3c,0x96,0x15,0x3b,0x95,0x14,0x3d,0x94,0x14,0x3b, 0x93,0x12,0x3b,0x95,0x14,0x3c,0x96,0x15,0x39,0x94,0x16,0x3a,0x95,0x16,0x3c, 0x96,0x17,0x3a,0x94,0x15,0x82,0x3d,0x94,0x16,0x82,0x3c,0x93,0x15,0x01,0x3a, 0x94,0x15,0x82,0x3b,0x95,0x16,0x08,0x3d,0x94,0x17,0x3c,0x93,0x15,0x3b,0x95, 0x16,0x3c,0x95,0x17,0x3b,0x94,0x17,0x3b,0x95,0x16,0x3c,0x95,0x17,0x3e,0x95, 0x17,0x82,0x3b,0x94,0x17,0x05,0x3c,0x95,0x17,0x3d,0x96,0x18,0x3d,0x93,0x18, 0x3c,0x95,0x17,0x3b,0x94,0x17,0x82,0x3c,0x95,0x17,0x06,0x3e,0x94,0x19,0x3d, 0x94,0x17,0x3e,0x95,0x17,0x3b,0x94,0x17,0x3a,0x95,0x18,0x3b,0x94,0x18,0x83, 0x3c,0x95,0x19,0x03,0x3e,0x94,0x19,0x3d,0x93,0x18,0x3e,0x95,0x1a,0x82,0x3e, 0x94,0x19,0x01,0x3e,0x95,0x1a,0x83,0x3c,0x95,0x19,0x05,0x3e,0x95,0x1a,0x3e, 0x94,0x19,0x3e,0x95,0x1a,0x3e,0x94,0x19,0x3e,0x97,0x1b,0x82,0x3d,0x96,0x1a, 0x06,0x3e,0x97,0x1b,0x3d,0x96,0x1a,0x3c,0x95,0x19,0x3e,0x98,0x1a,0x3e,0x98, 0x1c,0x3e,0x97,0x1b,0x83,0x3c,0x95,0x19,0x02,0x3e,0x97,0x1b,0x3d,0x98,0x1b, 0x82,0x3e,0x98,0x1a,0x02,0x3e,0x97,0x1b,0x3d,0x96,0x18,0x84,0x3e,0x97,0x19, 0x06,0x3e,0x9a,0x1b,0x3f,0x99,0x1b,0x3e,0x98,0x1a,0x3e,0x97,0x19,0x40,0x9b, 0x1b,0x41,0x9b,0x1c,0x82,0x3f,0x9a,0x1a,0x04,0x40,0x9b,0x1b,0x3e,0x99,0x19, 0x3f,0x9a,0x1a,0x40,0x9b,0x1b,0x82,0x3e,0x9a,0x1a,0x02,0x40,0x9b,0x1b,0x41, 0x9b,0x1c,0x82,0x40,0x9b,0x1c,0x0b,0x42,0x9c,0x1d,0x41,0x9b,0x1c,0x40,0x9b, 0x1c,0x41,0x9c,0x1d,0x3f,0x9b,0x1b,0x40,0x9b,0x1c,0x42,0x9c,0x1d,0x40,0x9b, 0x1b,0x41,0x9b,0x1c,0x40,0x9b,0x1c,0x3f,0x9b,0x1b,0x82,0x40,0x9b,0x1c,0x01, 0x40,0x9c,0x1a,0x82,0x42,0x9c,0x1d,0x82,0x3f,0x9b,0x1b,0x01,0x40,0x9b,0x1c, 0x83,0x3f,0x9b,0x1b,0x04,0x40,0x9b,0x1b,0x40,0x9b,0x1c,0x41,0x9c,0x1d,0x40, 0x9b,0x1c,0x82,0x41,0x9c,0x1d,0x02,0x40,0x9b,0x1c,0x41,0x9d,0x1b,0x83,0x40, 0x9b,0x1b,0x08,0x41,0x9b,0x1c,0x41,0x9c,0x1d,0x40,0x9b,0x1c,0x41,0x9c,0x1d, 0x40,0x9b,0x1c,0x41,0x9b,0x1a,0x41,0x9b,0x1c,0x40,0x9b,0x1c,0x82,0x41,0x9c, 0x1d,0x06,0x3f,0x9b,0x1b,0x40,0x9b,0x1b,0x41,0x9b,0x1c,0x43,0x9d,0x1e,0x42, 0x9c,0x1d,0x41,0x9b,0x1d,0x82,0x40,0x9b,0x1b,0x82,0x41,0x9b,0x1c,0x01,0x3f, 0x9b,0x1b,0x82,0x41,0x9b,0x1c,0x04,0x42,0x9c,0x1d,0x40,0x9b,0x1b,0x42,0x9c, 0x1d,0x43,0x9d,0x1e,0x82,0x41,0x9b,0x1c,0x0b,0x42,0x9c,0x1d,0x40,0x9b,0x1b, 0x41,0x9b,0x1c,0x3e,0x98,0x1a,0x41,0x9b,0x1a,0x40,0x9b,0x1c,0x41,0x9b,0x1a, 0x44,0x9e,0x1f,0x43,0x9d,0x1c,0x43,0x9d,0x1a,0x44,0xa0,0x1c,0x82,0x42,0x9e, 0x1a,0x07,0x43,0x9f,0x1b,0x44,0xa0,0x1c,0x43,0x9f,0x1b,0x45,0xa1,0x1d,0x43, 0x9f,0x1b,0x44,0xa0,0x1c,0x45,0xa2,0x1b,0x82,0x45,0xa3,0x1c,0x08,0x44,0xa0, 0x1c,0x41,0x9d,0x19,0x44,0xa0,0x1c,0x45,0xa1,0x1f,0x42,0x9e,0x1c,0x42,0x9c, 0x1b,0x45,0x9f,0x1e,0x44,0x9e,0x1d,0x82,0x42,0x9e,0x1c,0x02,0x44,0x9e,0x1f, 0x42,0x9c,0x1d,0x82,0x43,0x9d,0x1e,0x04,0x42,0x9c,0x1d,0x44,0x9e,0x1d,0x42, 0x9e,0x1c,0x40,0x9c,0x1a,0x82,0x44,0xa0,0x1e,0x01,0x47,0xa2,0x20,0x82,0x43, 0x9d,0x1c,0x09,0x44,0x9e,0x1f,0x41,0x9b,0x1c,0x43,0x9d,0x1e,0x44,0x9e,0x1f, 0x43,0x9c,0x1f,0x41,0x9b,0x1d,0x42,0x9b,0x1e,0x44,0x9e,0x1f,0x45,0x9f,0x1f, 0x82,0x44,0x9b,0x1e,0x03,0x45,0x9c,0x1f,0x43,0x9a,0x1f,0x45,0x9b,0x20,0x82, 0x41,0x98,0x1f,0x03,0x42,0x99,0x1e,0x43,0x9a,0x20,0x41,0x98,0x1d,0x82,0x45, 0x9b,0x1f,0x83,0x43,0x99,0x1e,0x07,0x42,0x98,0x1d,0x3f,0x95,0x1a,0x41,0x97, 0x1c,0x40,0x96,0x1b,0x42,0x98,0x1d,0x41,0x97,0x1a,0x3f,0x95,0x1a,0x82,0x3e, 0x94,0x19,0x02,0x3f,0x95,0x1a,0x3e,0x94,0x19,0x82,0x3e,0x93,0x17,0x08,0x3d, 0x93,0x17,0x3f,0x93,0x18,0x3e,0x92,0x17,0x3d,0x90,0x16,0x3f,0x93,0x1a,0x3e, 0x90,0x18,0x3c,0x90,0x1a,0x3b,0x8e,0x17,0x82,0x39,0x8b,0x17,0x26,0x38,0x89, 0x16,0x36,0x87,0x14,0x36,0x86,0x16,0x35,0x84,0x13,0x37,0x87,0x15,0x36,0x85, 0x17,0x31,0x7f,0x13,0x29,0x75,0x0d,0x24,0x6e,0x08,0x23,0x6c,0x09,0x22,0x6c, 0x08,0x22,0x6b,0x08,0x21,0x6c,0x07,0x20,0x6c,0x08,0x20,0x6b,0x08,0x1f,0x6a, 0x07,0x1f,0x69,0x07,0x1f,0x67,0x06,0x1d,0x65,0x04,0x1f,0x66,0x06,0x1c,0x65, 0x06,0x1d,0x65,0x06,0x1d,0x64,0x06,0x1c,0x63,0x05,0x1a,0x61,0x05,0x1b,0x62, 0x06,0x1b,0x61,0x06,0x19,0x5f,0x04,0x1a,0x5e,0x04,0x19,0x5d,0x03,0x18,0x5c, 0x02,0x19,0x5d,0x04,0x17,0x5c,0x03,0x17,0x5c,0x01,0x17,0x5a,0x01,0x18,0x5b, 0x03,0x17,0x5a,0x02,0x17,0x5a,0x03,0x82,0x15,0x58,0x01,0x14,0x16,0x59,0x02, 0x17,0x58,0x02,0x17,0x59,0x03,0x15,0x58,0x00,0x16,0x59,0x02,0x17,0x59,0x02, 0x16,0x59,0x02,0x17,0x57,0x01,0x17,0x57,0x02,0x17,0x56,0x01,0x18,0x58,0x03, 0x17,0x56,0x00,0x17,0x58,0x03,0x16,0x58,0x03,0x17,0x56,0x02,0x16,0x56,0x02, 0x17,0x57,0x03,0x17,0x55,0x03,0x16,0x57,0x01,0x17,0x57,0x02,0x83,0x15,0x55, 0x02,0x82,0x16,0x55,0x03,0x82,0x15,0x55,0x03,0x09,0x15,0x54,0x03,0x14,0x54, 0x00,0x16,0x55,0x02,0x15,0x53,0x03,0x15,0x52,0x02,0x15,0x51,0x03,0x14,0x51, 0x02,0x14,0x52,0x02,0x16,0x53,0x02,0x82,0x15,0x53,0x02,0x03,0x15,0x51,0x01, 0x16,0x52,0x02,0x15,0x53,0x02,0x82,0x15,0x52,0x02,0x83,0x15,0x50,0x02,0x12, 0x15,0x50,0x03,0x14,0x4f,0x03,0x14,0x50,0x02,0x15,0x50,0x02,0x15,0x51,0x02, 0x15,0x50,0x01,0x15,0x50,0x02,0x14,0x50,0x01,0x14,0x4d,0x01,0x14,0x4e,0x01, 0x14,0x4e,0x02,0x15,0x4d,0x02,0x13,0x4d,0x01,0x15,0x4d,0x01,0x14,0x4c,0x00, 0x15,0x4d,0x02,0x14,0x4d,0x03,0x14,0x4d,0x02,0x82,0x13,0x4c,0x01,0x05,0x16, 0x4b,0x02,0x15,0x4a,0x01,0x13,0x4b,0x01,0x12,0x4a,0x01,0x14,0x4a,0x02,0x82, 0x12,0x48,0x01,0x03,0x14,0x4a,0x03,0x13,0x48,0x01,0x13,0x49,0x02,0x83,0x13, 0x48,0x02,0x0c,0x12,0x47,0x01,0x12,0x46,0x01,0x12,0x46,0x00,0x13,0x47,0x01, 0x13,0x48,0x02,0x15,0x47,0x01,0x13,0x46,0x02,0x12,0x46,0x02,0x11,0x45,0x02, 0x11,0x44,0x02,0x12,0x45,0x02,0x11,0x44,0x01,0x82,0x12,0x45,0x00,0x0a,0x12, 0x45,0x02,0x13,0x43,0x02,0x11,0x43,0x02,0x11,0x45,0x02,0x12,0x44,0x02,0x10, 0x43,0x01,0x11,0x44,0x02,0x11,0x41,0x01,0x11,0x42,0x02,0x11,0x43,0x02,0x82, 0x10,0x43,0x02,0x09,0x11,0x42,0x02,0x10,0x41,0x02,0x12,0x41,0x03,0x10,0x40, 0x02,0x0f,0x41,0x02,0x10,0x40,0x02,0x10,0x41,0x02,0x11,0x40,0x03,0x10,0x3e, 0x01,0x83,0x0f,0x3e,0x01,0x01,0x10,0x3f,0x01,0x82,0x10,0x3e,0x01,0x0f,0x0f, 0x3e,0x01,0x10,0x3e,0x02,0x10,0x3e,0x03,0x0f,0x3d,0x02,0x10,0x3e,0x02,0x0f, 0x3d,0x01,0x0f,0x3c,0x01,0x10,0x3c,0x03,0x0f,0x3b,0x02,0x0f,0x3b,0x01,0x0f, 0x3a,0x01,0x0f,0x39,0x02,0x0f,0x3a,0x01,0x0f,0x3b,0x02,0x0e,0x39,0x01,0x82, 0x0f,0x39,0x01,0x0e,0x0f,0x39,0x02,0x0f,0x38,0x01,0x0f,0x36,0x00,0x0e,0x37, 0x01,0x0f,0x39,0x02,0x0e,0x38,0x02,0x0f,0x37,0x02,0x0f,0x36,0x01,0x0d,0x36, 0x01,0x0e,0x36,0x02,0x0f,0x36,0x03,0x0e,0x36,0x01,0x0f,0x35,0x01,0x0f,0x36, 0x02,0x82,0x0e,0x35,0x01,0x82,0x0f,0x34,0x01,0x03,0x0e,0x34,0x00,0x0e,0x33, 0x01,0x0d,0x33,0x00,0x83,0x0e,0x33,0x01,0x83,0x0e,0x32,0x01,0x02,0x0d,0x32, 0x01,0x0c,0x30,0x00,0x83,0x0d,0x30,0x01,0x06,0x0e,0x30,0x02,0x0e,0x2f,0x01, 0x0d,0x2f,0x01,0x0d,0x2f,0x02,0x0c,0x2e,0x02,0x0b,0x2e,0x00,0x83,0x0c,0x2e, 0x01,0x82,0x0b,0x2e,0x01,0x83,0x0c,0x2d,0x01,0x82,0x0b,0x2c,0x01,0x82,0x0b, 0x2b,0x00,0x04,0x0a,0x2b,0x01,0x0b,0x2b,0x01,0x0b,0x2b,0x02,0x0a,0x2b,0x01, 0x82,0x0a,0x29,0x01,0x0b,0x0b,0x29,0x00,0x0a,0x29,0x01,0x0a,0x28,0x01,0x0a, 0x29,0x00,0x0a,0x29,0x02,0x0a,0x28,0x02,0x0a,0x27,0x01,0x09,0x26,0x00,0x0a, 0x26,0x01,0x0a,0x26,0x00,0x09,0x26,0x01,0x82,0x0a,0x26,0x00,0x82,0x09,0x26, 0x01,0x83,0x09,0x25,0x01,0x01,0x08,0x24,0x01,0x82,0x0a,0x24,0x01,0x0c,0x09, 0x24,0x01,0x08,0x23,0x01,0x09,0x23,0x01,0x09,0x22,0x01,0x08,0x22,0x01,0x07, 0x22,0x00,0x08,0x21,0x00,0x08,0x21,0x01,0x08,0x21,0x00,0x07,0x21,0x00,0x08, 0x21,0x00,0x07,0x20,0x00,0x83,0x07,0x1f,0x00,0x01,0x08,0x1f,0x01,0x82,0x07, 0x1f,0x00,0x82,0x07,0x1e,0x00,0x82,0x07,0x1d,0x00,0x01,0x07,0x1d,0x01,0x82, 0x07,0x1d,0x00,0x83,0x07,0x1c,0x00,0x82,0x07,0x1b,0x00,0x83,0x07,0x1a,0x00, 0x85,0x06,0x19,0x00,0x83,0x06,0x18,0x00,0x02,0x06,0x17,0x00,0x05,0x17,0x00, 0x82,0x06,0x17,0x00,0x82,0x05,0x17,0x00,0x83,0x05,0x16,0x00,0x84,0x05,0x15, 0x00,0x83,0x05,0x14,0x00,0x82,0x04,0x13,0x00,0x82,0x04,0x12,0x00,0x84,0x04, 0x11,0x00,0x01,0x03,0x11,0x00,0x84,0x03,0x10,0x00,0x85,0x03,0x0f,0x00,0x02, 0x02,0x0f,0x00,0x03,0x0f,0x00,0x83,0x02,0x0e,0x00,0x01,0x03,0x0e,0x00,0x84, 0x02,0x0d,0x00,0x84,0x02,0x0c,0x00,0x83,0x02,0x0b,0x00,0x02,0x01,0x0a,0x00, 0x02,0x0b,0x00,0x83,0x01,0x0a,0x00,0x84,0x01,0x09,0x00,0x83,0x01,0x08,0x00, 0x82,0x01,0x07,0x00,0x82,0x00,0x07,0x00,0x01,0x01,0x07,0x00,0x82,0x00,0x07, 0x00,0x83,0x00,0x06,0x00,0x84,0x00,0x05,0x00,0x84,0x00,0x04,0x00,0x83,0x00, 0x03,0x00,0x84,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xde,0x00,0x00,0x00,0x13, 0x40,0x9e,0x16,0x42,0xa0,0x18,0x40,0x9b,0x17,0x42,0x9d,0x18,0x3e,0x99,0x15, 0x40,0x9b,0x17,0x3f,0x9a,0x16,0x3e,0x9b,0x16,0x3d,0x98,0x14,0x3f,0x9c,0x17, 0x3e,0x99,0x15,0x3c,0x97,0x13,0x3e,0x99,0x15,0x3d,0x98,0x16,0x3e,0x99,0x17, 0x3f,0x97,0x16,0x3a,0x95,0x15,0x3b,0x96,0x16,0x3c,0x97,0x17,0x82,0x3a,0x95, 0x15,0x05,0x3c,0x97,0x17,0x3a,0x95,0x15,0x3c,0x97,0x17,0x3b,0x96,0x14,0x3a, 0x95,0x15,0x82,0x3d,0x95,0x14,0x0b,0x3b,0x94,0x15,0x3c,0x95,0x15,0x3d,0x95, 0x16,0x3c,0x95,0x16,0x3c,0x95,0x15,0x3d,0x95,0x16,0x3a,0x95,0x16,0x3a,0x94, 0x15,0x39,0x94,0x13,0x3a,0x95,0x15,0x3a,0x94,0x15,0x83,0x39,0x93,0x14,0x08, 0x3a,0x94,0x15,0x39,0x93,0x14,0x38,0x92,0x13,0x3c,0x95,0x15,0x39,0x94,0x13, 0x3a,0x95,0x14,0x38,0x92,0x13,0x37,0x91,0x12,0x82,0x3a,0x92,0x13,0x04,0x3a, 0x93,0x13,0x39,0x94,0x13,0x39,0x95,0x14,0x39,0x95,0x15,0x82,0x39,0x93,0x16, 0x04,0x3a,0x94,0x17,0x3a,0x91,0x15,0x39,0x90,0x14,0x3a,0x91,0x15,0x82,0x38, 0x92,0x15,0x01,0x3a,0x92,0x16,0x84,0x3a,0x91,0x15,0x82,0x38,0x92,0x15,0x09, 0x37,0x93,0x15,0x38,0x92,0x15,0x3b,0x94,0x15,0x38,0x8f,0x13,0x3a,0x92,0x16, 0x38,0x92,0x13,0x3a,0x92,0x16,0x38,0x92,0x17,0x39,0x93,0x16,0x83,0x3a,0x92, 0x16,0x06,0x3a,0x94,0x17,0x3a,0x95,0x18,0x3a,0x94,0x17,0x3b,0x93,0x18,0x3a, 0x91,0x17,0x3b,0x95,0x18,0x82,0x3a,0x95,0x18,0x02,0x3b,0x95,0x18,0x3c,0x94, 0x18,0x82,0x3a,0x92,0x16,0x01,0x3b,0x93,0x17,0x83,0x3a,0x95,0x18,0x83,0x3c, 0x94,0x19,0x04,0x3d,0x95,0x18,0x3b,0x95,0x18,0x3b,0x95,0x1a,0x3a,0x95,0x19, 0x82,0x3c,0x94,0x19,0x82,0x3a,0x95,0x19,0x08,0x3b,0x95,0x1a,0x3b,0x95,0x18, 0x3d,0x95,0x18,0x3c,0x94,0x18,0x3e,0x98,0x1b,0x3a,0x95,0x18,0x3b,0x95,0x18, 0x3a,0x95,0x18,0x82,0x3c,0x96,0x1b,0x01,0x3f,0x96,0x1a,0x82,0x3b,0x95,0x18, 0x02,0x3c,0x96,0x19,0x3d,0x97,0x1a,0x82,0x3c,0x96,0x1b,0x23,0x3b,0x97,0x19, 0x3d,0x97,0x1a,0x3b,0x95,0x18,0x3c,0x96,0x19,0x3d,0x97,0x1a,0x3e,0x98,0x1b, 0x3d,0x97,0x1a,0x3c,0x96,0x19,0x3b,0x95,0x18,0x3b,0x97,0x18,0x3e,0x9a,0x1c, 0x3f,0x99,0x1c,0x3d,0x97,0x18,0x3e,0x98,0x19,0x3d,0x97,0x18,0x3e,0x98,0x19, 0x40,0x9a,0x1b,0x3d,0x99,0x19,0x3e,0x98,0x19,0x3f,0x99,0x1a,0x3e,0x98,0x19, 0x3f,0x9b,0x1b,0x3e,0x9a,0x1a,0x40,0x9c,0x1c,0x41,0x9c,0x1b,0x40,0x9c,0x1c, 0x3f,0x99,0x1a,0x40,0x9b,0x1a,0x41,0x9d,0x1c,0x40,0x9c,0x1b,0x41,0x9d,0x1c, 0x3f,0x9b,0x1a,0x40,0x9b,0x1a,0x42,0x9d,0x1c,0x3f,0x9a,0x19,0x82,0x40,0x9b, 0x1a,0x01,0x40,0x9c,0x1b,0x82,0x41,0x9d,0x1c,0x02,0x40,0x9c,0x1b,0x3f,0x9b, 0x1a,0x82,0x40,0x9c,0x1b,0x82,0x42,0x9e,0x1d,0x02,0x41,0x9d,0x1c,0x40,0x9c, 0x1b,0x82,0x41,0x9c,0x1b,0x02,0x3f,0x9b,0x1a,0x40,0x9c,0x1b,0x82,0x41,0x9d, 0x1c,0x82,0x3f,0x9b,0x1a,0x02,0x41,0x9d,0x1c,0x42,0x9d,0x1c,0x82,0x41,0x9c, 0x1b,0x02,0x41,0x9d,0x1c,0x40,0x9c,0x1b,0x83,0x41,0x9d,0x1c,0x06,0x40,0x9b, 0x1a,0x42,0x9e,0x1d,0x41,0x9d,0x1c,0x3f,0x9b,0x1a,0x40,0x9c,0x1b,0x41,0x9d, 0x1c,0x82,0x40,0x9b,0x1a,0x09,0x40,0x9c,0x1b,0x41,0x9d,0x1c,0x41,0x9b,0x1c, 0x42,0x9e,0x1d,0x41,0x9c,0x1b,0x3f,0x9a,0x19,0x42,0x9d,0x1c,0x42,0x9e,0x1d, 0x42,0x9d,0x1c,0x82,0x41,0x9c,0x1b,0x01,0x40,0x9b,0x1a,0x82,0x41,0x9c,0x1b, 0x08,0x3f,0x9a,0x19,0x40,0x9b,0x1a,0x41,0x9d,0x1c,0x42,0x9e,0x1d,0x40,0x9a, 0x1b,0x42,0x9d,0x1a,0x41,0x9d,0x1c,0x42,0x9f,0x1a,0x82,0x42,0x9e,0x1b,0x03, 0x42,0x9d,0x1a,0x42,0x9e,0x1b,0x43,0xa0,0x1b,0x82,0x42,0x9e,0x19,0x82,0x44, 0xa1,0x1c,0x14,0x42,0xa1,0x19,0x43,0xa0,0x1b,0x45,0xa2,0x1d,0x43,0xa0,0x1b, 0x45,0xa2,0x1d,0x42,0x9f,0x1a,0x44,0xa1,0x1c,0x43,0xa0,0x1b,0x42,0x9f,0x1a, 0x43,0xa0,0x1b,0x44,0xa1,0x1c,0x45,0xa2,0x1d,0x45,0xa0,0x1e,0x42,0x9d,0x1a, 0x42,0x9f,0x1c,0x42,0x9e,0x1e,0x44,0xa0,0x20,0x42,0x9e,0x1b,0x42,0x9d,0x1a, 0x43,0x9e,0x1e,0x82,0x42,0x9e,0x1d,0x11,0x44,0x9f,0x1d,0x43,0xa0,0x1d,0x45, 0xa2,0x1d,0x43,0xa0,0x1b,0x45,0xa2,0x1d,0x46,0xa1,0x1f,0x44,0x9f,0x1d,0x45, 0xa0,0x1e,0x44,0x9f,0x1d,0x43,0x9e,0x1e,0x42,0x9e,0x1e,0x42,0x9e,0x1d,0x44, 0x9e,0x20,0x42,0x9d,0x20,0x41,0x9b,0x1c,0x42,0x9e,0x1d,0x44,0x9f,0x1f,0x83, 0x46,0x9e,0x20,0x02,0x45,0x9d,0x22,0x42,0x99,0x1d,0x82,0x44,0x9c,0x20,0x04, 0x43,0x9b,0x1f,0x42,0x9a,0x20,0x43,0x9c,0x1d,0x43,0x9b,0x1f,0x82,0x45,0x9c, 0x20,0x04,0x44,0x9b,0x1f,0x44,0x9b,0x1d,0x47,0x9e,0x20,0x43,0x9a,0x1e,0x82, 0x42,0x98,0x1c,0x03,0x42,0x99,0x1d,0x41,0x97,0x1b,0x3f,0x95,0x19,0x84,0x40, 0x96,0x1a,0x1b,0x41,0x99,0x1a,0x3e,0x95,0x17,0x41,0x97,0x19,0x3e,0x95,0x18, 0x3e,0x92,0x17,0x3e,0x95,0x17,0x3e,0x92,0x17,0x3f,0x92,0x18,0x3a,0x90,0x15, 0x3a,0x8d,0x16,0x3a,0x8f,0x19,0x3a,0x8e,0x19,0x38,0x8c,0x17,0x37,0x8b,0x16, 0x38,0x89,0x15,0x38,0x88,0x15,0x35,0x85,0x12,0x35,0x85,0x14,0x35,0x84,0x15, 0x35,0x84,0x16,0x31,0x7e,0x14,0x28,0x74,0x0b,0x22,0x6e,0x08,0x22,0x6c,0x07, 0x22,0x6e,0x08,0x22,0x6d,0x08,0x21,0x6c,0x07,0x82,0x20,0x6b,0x08,0x09,0x21, 0x6a,0x08,0x1f,0x67,0x06,0x20,0x68,0x07,0x1e,0x68,0x06,0x1e,0x66,0x05,0x1e, 0x65,0x07,0x1b,0x64,0x05,0x19,0x63,0x03,0x1b,0x63,0x04,0x82,0x1b,0x62,0x04, 0x82,0x1a,0x5f,0x04,0x82,0x19,0x5d,0x03,0x0d,0x18,0x5d,0x02,0x17,0x5d,0x02, 0x17,0x5c,0x02,0x18,0x5b,0x02,0x17,0x5a,0x01,0x18,0x5b,0x03,0x16,0x5a,0x02, 0x15,0x59,0x01,0x18,0x5a,0x02,0x18,0x59,0x02,0x17,0x5a,0x03,0x16,0x5b,0x02, 0x15,0x58,0x01,0x83,0x16,0x58,0x02,0x06,0x17,0x57,0x02,0x17,0x57,0x01,0x16, 0x59,0x02,0x17,0x59,0x01,0x16,0x58,0x02,0x15,0x58,0x02,0x83,0x16,0x57,0x02, 0x11,0x16,0x55,0x01,0x15,0x55,0x01,0x17,0x55,0x02,0x15,0x56,0x02,0x17,0x57, 0x03,0x15,0x55,0x02,0x16,0x56,0x03,0x16,0x55,0x03,0x14,0x55,0x00,0x16,0x56, 0x02,0x15,0x55,0x01,0x15,0x53,0x02,0x16,0x55,0x02,0x16,0x54,0x02,0x14,0x53, 0x01,0x15,0x53,0x02,0x15,0x53,0x03,0x82,0x15,0x53,0x02,0x02,0x14,0x53,0x01, 0x15,0x52,0x01,0x82,0x14,0x51,0x02,0x09,0x14,0x52,0x01,0x15,0x53,0x02,0x15, 0x52,0x02,0x15,0x51,0x02,0x17,0x50,0x02,0x16,0x52,0x02,0x15,0x51,0x03,0x14, 0x4f,0x02,0x13,0x50,0x01,0x82,0x15,0x51,0x02,0x03,0x14,0x50,0x02,0x15,0x50, 0x02,0x14,0x50,0x02,0x82,0x14,0x4e,0x01,0x82,0x13,0x4e,0x01,0x02,0x14,0x4e, 0x02,0x15,0x4d,0x02,0x82,0x14,0x4c,0x01,0x0a,0x14,0x4d,0x02,0x14,0x4e,0x03, 0x14,0x4d,0x02,0x13,0x4b,0x01,0x13,0x4b,0x00,0x14,0x4a,0x00,0x14,0x4b,0x01, 0x15,0x4b,0x01,0x14,0x4a,0x01,0x12,0x49,0x00,0x82,0x14,0x4a,0x03,0x82,0x13, 0x4a,0x02,0x01,0x14,0x4a,0x03,0x82,0x13,0x49,0x02,0x01,0x14,0x49,0x03,0x82, 0x12,0x47,0x01,0x07,0x13,0x48,0x01,0x13,0x49,0x01,0x13,0x48,0x03,0x14,0x46, 0x02,0x12,0x46,0x02,0x12,0x47,0x02,0x12,0x46,0x03,0x82,0x12,0x45,0x02,0x09, 0x13,0x44,0x02,0x12,0x46,0x01,0x13,0x45,0x02,0x12,0x45,0x04,0x10,0x42,0x02, 0x11,0x44,0x02,0x12,0x46,0x03,0x11,0x43,0x00,0x11,0x44,0x01,0x83,0x11,0x42, 0x00,0x06,0x11,0x42,0x01,0x12,0x43,0x02,0x11,0x42,0x02,0x10,0x42,0x00,0x11, 0x42,0x01,0x11,0x41,0x02,0x82,0x10,0x41,0x02,0x07,0x10,0x41,0x01,0x10,0x41, 0x02,0x10,0x3f,0x01,0x10,0x3f,0x00,0x10,0x40,0x02,0x10,0x3f,0x01,0x10,0x40, 0x01,0x82,0x10,0x3f,0x01,0x0a,0x10,0x3e,0x02,0x10,0x3d,0x01,0x10,0x3e,0x02, 0x0f,0x3c,0x01,0x10,0x3d,0x01,0x10,0x3e,0x02,0x0f,0x3c,0x01,0x0e,0x3a,0x00, 0x0f,0x3b,0x01,0x0e,0x3b,0x01,0x82,0x0f,0x3a,0x01,0x09,0x10,0x3a,0x01,0x10, 0x3b,0x02,0x0f,0x3a,0x01,0x0f,0x39,0x01,0x10,0x3a,0x02,0x0f,0x3a,0x02,0x0f, 0x39,0x01,0x10,0x37,0x01,0x0f,0x38,0x01,0x82,0x0e,0x38,0x01,0x02,0x0f,0x37, 0x01,0x0f,0x37,0x02,0x82,0x0e,0x37,0x01,0x04,0x0e,0x36,0x01,0x10,0x36,0x02, 0x0f,0x36,0x02,0x0e,0x36,0x01,0x83,0x0e,0x35,0x01,0x03,0x0d,0x34,0x01,0x0f, 0x33,0x01,0x0e,0x34,0x01,0x84,0x0e,0x33,0x01,0x82,0x0d,0x32,0x01,0x84,0x0d, 0x31,0x01,0x03,0x0e,0x31,0x02,0x0d,0x31,0x01,0x0e,0x30,0x01,0x83,0x0d,0x30, 0x01,0x08,0x0c,0x30,0x01,0x0c,0x2f,0x01,0x0c,0x2f,0x02,0x0c,0x2e,0x02,0x0b, 0x2e,0x01,0x0b,0x2d,0x01,0x0b,0x2d,0x02,0x0b,0x2d,0x00,0x82,0x0c,0x2d,0x01, 0x03,0x0b,0x2d,0x01,0x0b,0x2c,0x00,0x0b,0x2c,0x01,0x83,0x0b,0x2b,0x01,0x0f, 0x0b,0x2b,0x02,0x0b,0x2a,0x01,0x0a,0x29,0x01,0x0a,0x2b,0x01,0x0b,0x2a,0x01, 0x0b,0x29,0x02,0x0a,0x29,0x01,0x0a,0x29,0x00,0x0a,0x29,0x01,0x09,0x28,0x00, 0x0a,0x28,0x01,0x0a,0x29,0x01,0x0a,0x28,0x00,0x0a,0x27,0x01,0x0a,0x26,0x01, 0x82,0x09,0x27,0x00,0x83,0x09,0x26,0x01,0x83,0x09,0x25,0x01,0x09,0x09,0x24, 0x00,0x0a,0x24,0x00,0x09,0x24,0x00,0x08,0x23,0x01,0x08,0x23,0x00,0x08,0x22, 0x00,0x08,0x22,0x01,0x08,0x22,0x00,0x08,0x21,0x00,0x82,0x08,0x22,0x01,0x83, 0x08,0x21,0x00,0x82,0x08,0x20,0x00,0x02,0x08,0x21,0x01,0x08,0x20,0x00,0x83, 0x08,0x1f,0x00,0x82,0x08,0x1e,0x00,0x01,0x07,0x1e,0x00,0x83,0x07,0x1d,0x00, 0x83,0x07,0x1c,0x00,0x85,0x07,0x1b,0x00,0x01,0x06,0x1a,0x00,0x84,0x06,0x19, 0x00,0x01,0x07,0x19,0x00,0x82,0x06,0x18,0x00,0x01,0x05,0x18,0x00,0x82,0x06, 0x18,0x00,0x01,0x06,0x17,0x00,0x83,0x05,0x17,0x00,0x01,0x05,0x16,0x00,0x84, 0x05,0x15,0x00,0x01,0x04,0x15,0x00,0x83,0x05,0x14,0x00,0x01,0x05,0x13,0x00, 0x83,0x04,0x13,0x00,0x82,0x04,0x12,0x00,0x82,0x03,0x11,0x00,0x82,0x04,0x11, 0x00,0x86,0x03,0x10,0x00,0x83,0x03,0x0f,0x00,0x02,0x02,0x0f,0x00,0x02,0x0e, 0x00,0x82,0x03,0x0e,0x00,0x01,0x02,0x0e,0x00,0x84,0x02,0x0d,0x00,0x84,0x02, 0x0c,0x00,0x83,0x02,0x0b,0x00,0x83,0x02,0x0a,0x00,0x01,0x01,0x0a,0x00,0x82, 0x02,0x0a,0x00,0x82,0x01,0x09,0x00,0x87,0x01,0x08,0x00,0x82,0x01,0x07,0x00, 0x82,0x00,0x07,0x00,0x83,0x00,0x06,0x00,0x84,0x00,0x05,0x00,0x84,0x00,0x04, 0x00,0x83,0x00,0x03,0x00,0x84,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xde,0x00, 0x00,0x00,0x10,0x3e,0x9b,0x17,0x3e,0x9c,0x18,0x3b,0x97,0x13,0x3d,0x98,0x17, 0x3e,0x99,0x18,0x3b,0x97,0x15,0x3d,0x98,0x17,0x3d,0x99,0x18,0x3c,0x97,0x16, 0x3e,0x97,0x17,0x3c,0x95,0x15,0x3c,0x97,0x16,0x3e,0x99,0x18,0x3c,0x93,0x14, 0x3d,0x96,0x16,0x39,0x96,0x14,0x83,0x39,0x94,0x14,0x82,0x3a,0x95,0x15,0x0c, 0x3b,0x96,0x16,0x39,0x94,0x14,0x38,0x93,0x13,0x3a,0x96,0x14,0x3b,0x94,0x14, 0x3c,0x95,0x14,0x3a,0x93,0x12,0x38,0x90,0x13,0x39,0x91,0x14,0x3b,0x94,0x14, 0x37,0x8f,0x12,0x37,0x92,0x14,0x82,0x39,0x91,0x14,0x05,0x3b,0x94,0x14,0x39, 0x91,0x14,0x37,0x8f,0x14,0x36,0x91,0x15,0x38,0x93,0x13,0x82,0x37,0x92,0x14, 0x0a,0x36,0x91,0x13,0x38,0x93,0x15,0x39,0x91,0x14,0x3a,0x92,0x15,0x39,0x91, 0x14,0x38,0x90,0x13,0x39,0x90,0x13,0x39,0x91,0x14,0x3b,0x93,0x16,0x37,0x92, 0x14,0x82,0x36,0x91,0x13,0x03,0x37,0x92,0x14,0x38,0x93,0x17,0x39,0x91,0x14, 0x82,0x36,0x91,0x13,0x09,0x37,0x8f,0x14,0x38,0x90,0x15,0x39,0x91,0x16,0x36, 0x91,0x15,0x35,0x92,0x13,0x37,0x92,0x14,0x39,0x91,0x14,0x37,0x8f,0x12,0x39, 0x91,0x16,0x82,0x37,0x8f,0x14,0x12,0x38,0x90,0x15,0x35,0x90,0x14,0x36,0x91, 0x15,0x39,0x91,0x14,0x38,0x90,0x15,0x36,0x91,0x15,0x37,0x92,0x14,0x38,0x90, 0x15,0x36,0x8f,0x15,0x36,0x91,0x15,0x38,0x90,0x15,0x37,0x8f,0x16,0x38,0x90, 0x15,0x39,0x91,0x16,0x38,0x93,0x15,0x37,0x92,0x16,0x38,0x90,0x15,0x37,0x8f, 0x16,0x82,0x37,0x92,0x16,0x82,0x38,0x93,0x17,0x07,0x3a,0x92,0x17,0x39,0x91, 0x16,0x3a,0x92,0x17,0x3b,0x93,0x18,0x3b,0x93,0x16,0x3b,0x93,0x18,0x3a,0x92, 0x17,0x83,0x3b,0x93,0x18,0x02,0x3a,0x95,0x19,0x39,0x94,0x18,0x82,0x3a,0x95, 0x19,0x01,0x3a,0x92,0x17,0x82,0x3b,0x93,0x18,0x82,0x3a,0x95,0x19,0x03,0x3b, 0x96,0x18,0x3d,0x95,0x18,0x3b,0x93,0x16,0x82,0x3b,0x96,0x18,0x82,0x3b,0x96, 0x1a,0x05,0x3c,0x94,0x19,0x3d,0x95,0x1a,0x3d,0x95,0x18,0x3c,0x94,0x19,0x3b, 0x96,0x1a,0x82,0x3c,0x97,0x19,0x06,0x3b,0x96,0x1a,0x3c,0x97,0x1a,0x3a,0x97, 0x18,0x3c,0x97,0x1a,0x3b,0x96,0x1a,0x3d,0x97,0x1a,0x82,0x3e,0x98,0x1a,0x83, 0x3c,0x97,0x19,0x82,0x3c,0x98,0x1a,0x02,0x3c,0x97,0x19,0x3d,0x97,0x1a,0x82, 0x3d,0x97,0x18,0x0a,0x3f,0x9a,0x1a,0x3d,0x97,0x18,0x3c,0x98,0x18,0x3d,0x99, 0x19,0x3e,0x98,0x1a,0x3e,0x99,0x1b,0x3e,0x9a,0x1b,0x3e,0x9b,0x1a,0x3e,0x9a, 0x1a,0x3d,0x97,0x18,0x82,0x3f,0x9a,0x1a,0x03,0x3e,0x99,0x1a,0x3e,0x9b,0x1a, 0x3e,0x9a,0x1a,0x82,0x3e,0x9b,0x1a,0x05,0x42,0x9e,0x1c,0x3f,0x9c,0x1b,0x3e, 0x9a,0x1a,0x3e,0x99,0x1a,0x3f,0x9b,0x1a,0x83,0x3f,0x9c,0x1a,0x06,0x3e,0x9d, 0x1a,0x3f,0x9c,0x1a,0x3e,0x9b,0x1a,0x40,0x9d,0x1b,0x40,0x9e,0x1a,0x3e,0x9c, 0x18,0x82,0x3e,0x9b,0x1a,0x82,0x41,0x9d,0x1b,0x05,0x40,0x9c,0x1a,0x3f,0x9c, 0x1a,0x40,0x9d,0x1c,0x3f,0x9c,0x1b,0x3e,0x9a,0x1a,0x82,0x40,0x9d,0x1c,0x82, 0x41,0x9d,0x1b,0x04,0x40,0x9d,0x1b,0x3f,0x9c,0x1a,0x3e,0x9a,0x19,0x41,0x9e, 0x1c,0x82,0x40,0x9d,0x1b,0x0e,0x3f,0x9b,0x1a,0x42,0x9d,0x1d,0x40,0x9d,0x1c, 0x3e,0x9b,0x1a,0x3f,0x9c,0x1a,0x40,0x9d,0x1b,0x42,0x9e,0x1c,0x42,0x9d,0x1d, 0x3f,0x9b,0x1a,0x40,0x9c,0x1a,0x40,0x9b,0x1b,0x40,0x9c,0x1a,0x41,0x9d,0x1b, 0x42,0x9e,0x1c,0x82,0x40,0x9d,0x1b,0x0c,0x41,0x9d,0x1b,0x42,0x9e,0x1c,0x41, 0x9d,0x1b,0x42,0x9d,0x1d,0x41,0x9d,0x1b,0x42,0x9e,0x1c,0x40,0x9c,0x1a,0x40, 0x9b,0x1b,0x40,0x9e,0x1a,0x41,0x9d,0x1b,0x40,0x9c,0x1a,0x41,0x9d,0x1b,0x82, 0x41,0x9f,0x1a,0x10,0x44,0xa1,0x1d,0x42,0xa0,0x1b,0x41,0x9e,0x1c,0x42,0xa0, 0x1b,0x43,0xa0,0x1c,0x43,0xa0,0x1a,0x44,0xa1,0x1b,0x44,0xa2,0x1a,0x44,0xa3, 0x1a,0x43,0xa2,0x1a,0x44,0xa2,0x1a,0x46,0xa4,0x1b,0x43,0xa0,0x1a,0x46,0xa3, 0x1d,0x45,0xa2,0x1c,0x44,0xa1,0x1b,0x82,0x45,0xa2,0x1c,0x09,0x43,0xa0,0x1c, 0x44,0xa1,0x1d,0x45,0xa0,0x1d,0x44,0xa0,0x1a,0x46,0xa1,0x1c,0x44,0xa1,0x1b, 0x43,0xa0,0x1a,0x44,0xa1,0x1d,0x45,0xa0,0x1d,0x82,0x43,0x9f,0x1b,0x82,0x43, 0x9f,0x1d,0x03,0x42,0xa0,0x1b,0x44,0xa1,0x1d,0x47,0xa4,0x1e,0x82,0x46,0xa1, 0x1c,0x0a,0x41,0x9f,0x1a,0x44,0xa1,0x1d,0x42,0xa0,0x1b,0x47,0xa2,0x1f,0x46, 0xa1,0x1e,0x43,0x9f,0x1b,0x45,0x9e,0x1e,0x43,0x9c,0x1c,0x44,0x9d,0x1d,0x41, 0x9c,0x1c,0x82,0x43,0x9e,0x1e,0x05,0x44,0x9f,0x1f,0x45,0x9e,0x1d,0x44,0x9d, 0x1d,0x46,0x9f,0x1f,0x44,0x9d,0x1c,0x82,0x44,0x9c,0x1f,0x06,0x44,0x9d,0x1c, 0x45,0x9e,0x1e,0x47,0xa0,0x21,0x42,0x9a,0x1d,0x43,0x9b,0x1e,0x43,0x9a,0x1d, 0x82,0x45,0x9c,0x1d,0x82,0x43,0x9c,0x1c,0x01,0x42,0x9a,0x1d,0x82,0x43,0x9a, 0x1d,0x02,0x43,0x9a,0x1b,0x42,0x99,0x1c,0x82,0x41,0x98,0x1b,0x06,0x3f,0x97, 0x1a,0x3f,0x97,0x18,0x41,0x9a,0x1a,0x40,0x99,0x1a,0x3f,0x97,0x18,0x3e,0x95, 0x16,0x82,0x3e,0x96,0x17,0x0b,0x3d,0x94,0x15,0x3b,0x91,0x13,0x39,0x8f,0x15, 0x3c,0x90,0x1a,0x3a,0x8f,0x17,0x39,0x8f,0x14,0x3a,0x8f,0x17,0x3b,0x8f,0x18, 0x3b,0x8d,0x16,0x38,0x89,0x15,0x37,0x88,0x15,0x82,0x35,0x86,0x14,0x05,0x35, 0x86,0x13,0x37,0x87,0x15,0x35,0x84,0x14,0x30,0x7e,0x11,0x24,0x72,0x08,0x82, 0x22,0x6d,0x07,0x09,0x23,0x6d,0x08,0x22,0x6d,0x09,0x21,0x6c,0x08,0x22,0x6b, 0x08,0x22,0x69,0x07,0x21,0x6a,0x08,0x20,0x6b,0x08,0x20,0x68,0x07,0x1f,0x67, 0x06,0x82,0x1d,0x67,0x07,0x06,0x1d,0x64,0x06,0x1b,0x62,0x04,0x1b,0x63,0x05, 0x1b,0x61,0x05,0x1a,0x60,0x04,0x1b,0x60,0x05,0x82,0x19,0x60,0x04,0x05,0x18, 0x5e,0x03,0x19,0x5f,0x04,0x19,0x5c,0x02,0x17,0x5c,0x03,0x19,0x5b,0x03,0x82, 0x18,0x5a,0x02,0x01,0x17,0x5b,0x03,0x82,0x16,0x59,0x02,0x05,0x16,0x5a,0x01, 0x17,0x59,0x01,0x17,0x59,0x02,0x15,0x58,0x01,0x16,0x59,0x02,0x82,0x16,0x59, 0x03,0x05,0x14,0x59,0x01,0x15,0x59,0x02,0x17,0x59,0x03,0x15,0x59,0x02,0x17, 0x57,0x01,0x82,0x15,0x57,0x01,0x05,0x17,0x57,0x02,0x16,0x57,0x02,0x17,0x56, 0x02,0x15,0x57,0x00,0x16,0x55,0x01,0x82,0x17,0x55,0x02,0x09,0x16,0x56,0x03, 0x16,0x58,0x02,0x14,0x56,0x00,0x16,0x55,0x01,0x16,0x53,0x03,0x16,0x53,0x02, 0x15,0x54,0x03,0x15,0x53,0x00,0x15,0x53,0x02,0x82,0x14,0x53,0x02,0x02,0x14, 0x54,0x01,0x14,0x53,0x02,0x82,0x16,0x53,0x03,0x07,0x14,0x51,0x02,0x15,0x52, 0x02,0x15,0x51,0x02,0x15,0x51,0x01,0x16,0x50,0x01,0x14,0x51,0x00,0x15,0x52, 0x02,0x82,0x14,0x51,0x02,0x82,0x15,0x51,0x02,0x82,0x15,0x50,0x02,0x06,0x14, 0x50,0x02,0x14,0x4f,0x01,0x14,0x50,0x01,0x15,0x50,0x02,0x15,0x4f,0x02,0x12, 0x4f,0x01,0x83,0x14,0x4f,0x02,0x03,0x14,0x4d,0x01,0x13,0x4c,0x01,0x14,0x4c, 0x00,0x82,0x14,0x4d,0x01,0x0a,0x15,0x4d,0x01,0x13,0x4b,0x00,0x14,0x4c,0x01, 0x16,0x4c,0x01,0x14,0x4b,0x01,0x15,0x4b,0x01,0x13,0x4b,0x02,0x13,0x4a,0x01, 0x14,0x4c,0x03,0x12,0x48,0x01,0x83,0x13,0x49,0x01,0x0a,0x14,0x4a,0x03,0x13, 0x48,0x02,0x14,0x48,0x03,0x13,0x48,0x03,0x13,0x47,0x02,0x12,0x49,0x03,0x13, 0x47,0x00,0x12,0x46,0x00,0x12,0x47,0x00,0x13,0x48,0x02,0x82,0x12,0x47,0x02, 0x02,0x14,0x46,0x02,0x12,0x47,0x02,0x82,0x12,0x45,0x02,0x05,0x11,0x45,0x02, 0x11,0x45,0x00,0x12,0x45,0x01,0x11,0x45,0x02,0x12,0x44,0x02,0x83,0x11,0x44, 0x01,0x09,0x11,0x43,0x01,0x11,0x43,0x00,0x11,0x43,0x02,0x11,0x42,0x00,0x11, 0x42,0x01,0x11,0x41,0x00,0x11,0x41,0x02,0x11,0x40,0x00,0x11,0x41,0x01,0x82, 0x11,0x40,0x02,0x08,0x11,0x3f,0x00,0x10,0x3e,0x01,0x10,0x3f,0x00,0x10,0x40, 0x01,0x10,0x3e,0x00,0x11,0x3f,0x01,0x11,0x3e,0x02,0x10,0x3d,0x01,0x82,0x10, 0x3e,0x02,0x05,0x10,0x3e,0x00,0x11,0x3d,0x02,0x10,0x3d,0x01,0x0f,0x3d,0x01, 0x0f,0x3c,0x01,0x82,0x10,0x3c,0x03,0x04,0x11,0x3a,0x01,0x10,0x3c,0x01,0x0e, 0x3b,0x00,0x0f,0x3c,0x01,0x82,0x10,0x3b,0x01,0x82,0x0f,0x3b,0x02,0x02,0x0f, 0x38,0x01,0x0e,0x3a,0x02,0x82,0x0f,0x39,0x02,0x0a,0x0e,0x38,0x01,0x0f,0x38, 0x02,0x0f,0x37,0x02,0x0e,0x36,0x01,0x0f,0x37,0x02,0x0e,0x36,0x01,0x0f,0x36, 0x02,0x0e,0x35,0x01,0x0f,0x36,0x02,0x0e,0x36,0x02,0x84,0x0e,0x35,0x01,0x82, 0x0e,0x34,0x01,0x82,0x0d,0x33,0x01,0x83,0x0e,0x33,0x01,0x02,0x0d,0x32,0x02, 0x0e,0x32,0x02,0x83,0x0d,0x31,0x01,0x03,0x0c,0x30,0x01,0x0d,0x30,0x02,0x0c, 0x2f,0x01,0x83,0x0c,0x30,0x01,0x05,0x0b,0x2f,0x00,0x0b,0x2e,0x01,0x0c,0x2e, 0x02,0x0b,0x2d,0x01,0x0d,0x2e,0x02,0x82,0x0b,0x2d,0x00,0x02,0x0c,0x2d,0x00, 0x0b,0x2e,0x01,0x82,0x0b,0x2c,0x01,0x01,0x0a,0x2c,0x01,0x83,0x0b,0x2c,0x01, 0x0f,0x0a,0x2b,0x01,0x0a,0x2c,0x01,0x0b,0x2b,0x01,0x0a,0x2b,0x00,0x0b,0x2a, 0x01,0x0a,0x2a,0x01,0x0b,0x2a,0x00,0x0a,0x2a,0x00,0x09,0x28,0x00,0x0a,0x28, 0x01,0x0a,0x28,0x00,0x0a,0x28,0x01,0x0a,0x27,0x00,0x0a,0x28,0x02,0x09,0x27, 0x01,0x84,0x09,0x26,0x01,0x07,0x0a,0x25,0x01,0x0a,0x24,0x01,0x09,0x24,0x01, 0x09,0x25,0x00,0x09,0x25,0x01,0x09,0x23,0x00,0x08,0x23,0x00,0x82,0x08,0x23, 0x01,0x01,0x08,0x23,0x00,0x82,0x08,0x23,0x01,0x83,0x08,0x22,0x00,0x03,0x08, 0x21,0x00,0x08,0x22,0x01,0x08,0x21,0x00,0x82,0x08,0x20,0x00,0x01,0x08,0x20, 0x01,0x83,0x08,0x1f,0x00,0x01,0x08,0x1f,0x01,0x84,0x08,0x1e,0x00,0x82,0x07, 0x1d,0x00,0x82,0x07,0x1c,0x00,0x82,0x07,0x1b,0x00,0x01,0x06,0x1a,0x00,0x82, 0x07,0x1b,0x00,0x82,0x06,0x1a,0x00,0x01,0x07,0x1a,0x00,0x83,0x06,0x1a,0x00, 0x82,0x06,0x19,0x00,0x01,0x06,0x18,0x00,0x82,0x05,0x18,0x00,0x01,0x06,0x17, 0x00,0x83,0x05,0x17,0x00,0x82,0x05,0x16,0x00,0x84,0x05,0x15,0x00,0x84,0x05, 0x14,0x00,0x83,0x04,0x13,0x00,0x83,0x04,0x12,0x00,0x82,0x03,0x11,0x00,0x01, 0x04,0x11,0x00,0x84,0x03,0x11,0x00,0x83,0x03,0x10,0x00,0x01,0x03,0x0f,0x00, 0x83,0x02,0x0f,0x00,0x82,0x02,0x0e,0x00,0x85,0x02,0x0d,0x00,0x84,0x02,0x0c, 0x00,0x84,0x02,0x0b,0x00,0x82,0x01,0x0a,0x00,0x02,0x02,0x0a,0x00,0x01,0x0a, 0x00,0x83,0x01,0x09,0x00,0x87,0x01,0x08,0x00,0x02,0x01,0x07,0x00,0x00,0x07, 0x00,0x82,0x01,0x07,0x00,0x83,0x00,0x06,0x00,0x83,0x00,0x05,0x00,0x85,0x00, 0x04,0x00,0x83,0x00,0x03,0x00,0x84,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xde, 0x00,0x00,0x00,0x04,0x3b,0x94,0x16,0x3f,0x99,0x18,0x3f,0x99,0x17,0x3b,0x95, 0x14,0x82,0x39,0x92,0x16,0x01,0x3a,0x93,0x15,0x82,0x3b,0x95,0x14,0x0b,0x39, 0x92,0x16,0x38,0x90,0x13,0x39,0x91,0x13,0x39,0x91,0x17,0x38,0x90,0x14,0x39, 0x92,0x14,0x3a,0x93,0x17,0x39,0x95,0x16,0x38,0x90,0x14,0x39,0x90,0x15,0x3a, 0x91,0x16,0x82,0x37,0x92,0x15,0x02,0x39,0x92,0x16,0x38,0x8f,0x15,0x82,0x39, 0x90,0x15,0x82,0x39,0x91,0x15,0x01,0x38,0x90,0x14,0x82,0x39,0x90,0x16,0x10, 0x37,0x8e,0x14,0x38,0x90,0x16,0x36,0x8f,0x13,0x38,0x90,0x16,0x38,0x90,0x13, 0x36,0x8f,0x14,0x38,0x90,0x14,0x39,0x91,0x17,0x39,0x90,0x16,0x37,0x90,0x13, 0x37,0x90,0x15,0x37,0x8e,0x14,0x36,0x8f,0x14,0x37,0x90,0x13,0x35,0x90,0x13, 0x3a,0x93,0x17,0x82,0x36,0x8f,0x14,0x02,0x37,0x90,0x13,0x35,0x8e,0x12,0x82, 0x38,0x90,0x14,0x13,0x37,0x90,0x13,0x37,0x90,0x15,0x36,0x8f,0x14,0x36,0x8d, 0x13,0x38,0x90,0x16,0x37,0x90,0x15,0x37,0x90,0x13,0x36,0x8f,0x13,0x38,0x90, 0x14,0x36,0x8f,0x14,0x37,0x8e,0x14,0x36,0x8f,0x14,0x37,0x90,0x15,0x38,0x90, 0x16,0x36,0x8f,0x14,0x37,0x90,0x15,0x37,0x8e,0x14,0x38,0x8f,0x16,0x37,0x8e, 0x15,0x83,0x35,0x8e,0x13,0x82,0x36,0x8f,0x14,0x06,0x38,0x90,0x16,0x35,0x90, 0x15,0x37,0x90,0x15,0x37,0x8e,0x14,0x39,0x90,0x17,0x37,0x8e,0x15,0x82,0x38, 0x90,0x16,0x04,0x37,0x90,0x15,0x38,0x8f,0x16,0x37,0x8f,0x16,0x35,0x8d,0x14, 0x82,0x38,0x90,0x16,0x08,0x37,0x90,0x15,0x38,0x8f,0x15,0x39,0x90,0x16,0x38, 0x90,0x16,0x38,0x92,0x18,0x39,0x91,0x17,0x38,0x90,0x16,0x39,0x91,0x17,0x82, 0x38,0x90,0x16,0x16,0x39,0x91,0x17,0x38,0x90,0x16,0x39,0x92,0x18,0x37,0x91, 0x17,0x38,0x92,0x18,0x39,0x91,0x19,0x38,0x90,0x17,0x38,0x90,0x16,0x39,0x92, 0x18,0x3b,0x94,0x1a,0x38,0x92,0x18,0x39,0x91,0x17,0x39,0x92,0x18,0x39,0x90, 0x18,0x3a,0x95,0x1b,0x39,0x95,0x18,0x3b,0x97,0x18,0x3b,0x97,0x1a,0x3a,0x95, 0x1b,0x3a,0x93,0x19,0x3b,0x94,0x1a,0x39,0x94,0x1a,0x82,0x39,0x95,0x18,0x82, 0x3b,0x97,0x1a,0x04,0x39,0x95,0x18,0x3a,0x96,0x19,0x3b,0x97,0x1a,0x3a,0x96, 0x17,0x82,0x3b,0x97,0x18,0x09,0x3a,0x96,0x17,0x3b,0x97,0x1a,0x3c,0x95,0x19, 0x3b,0x97,0x18,0x3a,0x98,0x18,0x3a,0x96,0x17,0x3c,0x98,0x19,0x3c,0x95,0x19, 0x3b,0x97,0x18,0x82,0x3c,0x98,0x19,0x83,0x3c,0x9a,0x1a,0x85,0x3d,0x99,0x1a, 0x05,0x3d,0x9a,0x19,0x3e,0x9b,0x1c,0x3d,0x99,0x1a,0x3e,0x9a,0x19,0x3f,0x9a, 0x1a,0x82,0x3d,0x99,0x1a,0x01,0x3e,0x9b,0x1a,0x82,0x3f,0x9c,0x1b,0x82,0x3f, 0x9c,0x1a,0x82,0x3f,0x9c,0x1b,0x07,0x41,0x9e,0x1c,0x40,0x9d,0x1b,0x3e,0x9d, 0x1a,0x40,0x9d,0x1b,0x3e,0x9b,0x19,0x3f,0x9e,0x1b,0x3d,0x9c,0x19,0x82,0x40, 0x9c,0x1a,0x02,0x40,0x9d,0x1c,0x3f,0x9c,0x1a,0x83,0x40,0x9d,0x1b,0x06,0x41, 0x9e,0x1c,0x3e,0x9b,0x19,0x3e,0x9b,0x1a,0x40,0x9d,0x1c,0x42,0x9f,0x1c,0x40, 0x9d,0x1b,0x82,0x3e,0x9b,0x19,0x82,0x40,0x9d,0x1b,0x02,0x3f,0x9c,0x1a,0x41, 0x9e,0x1c,0x82,0x40,0x9d,0x1b,0x08,0x41,0x9e,0x1c,0x42,0x9f,0x1c,0x40,0x9c, 0x1a,0x41,0x9d,0x1b,0x42,0x9e,0x1c,0x41,0x9d,0x1b,0x3f,0x9c,0x1a,0x3d,0x9a, 0x18,0x83,0x40,0x9d,0x1b,0x01,0x41,0x9e,0x1c,0x82,0x3f,0x9c,0x1b,0x01,0x42, 0xa0,0x1b,0x82,0x41,0x9e,0x1c,0x01,0x40,0x9c,0x1a,0x82,0x42,0x9e,0x1c,0x83, 0x41,0x9e,0x1c,0x83,0x40,0x9d,0x1b,0x05,0x41,0x9f,0x1a,0x42,0xa0,0x1b,0x43, 0xa1,0x1c,0x42,0xa0,0x1b,0x43,0xa1,0x1c,0x82,0x43,0xa1,0x1a,0x03,0x42,0xa0, 0x19,0x43,0xa1,0x1a,0x43,0xa2,0x1b,0x82,0x44,0xa3,0x1c,0x03,0x44,0xa4,0x1a, 0x43,0xa2,0x1b,0x43,0xa3,0x1b,0x82,0x44,0xa4,0x1b,0x04,0x45,0xa4,0x1b,0x45, 0xa4,0x1c,0x44,0xa4,0x1a,0x45,0xa4,0x1c,0x82,0x43,0xa3,0x1b,0x08,0x43,0xa2, 0x1b,0x45,0xa4,0x1c,0x44,0xa1,0x1c,0x43,0xa0,0x1c,0x43,0xa2,0x1c,0x43,0xa0, 0x1c,0x43,0x9f,0x1c,0x46,0xa3,0x1c,0x82,0x43,0x9f,0x1b,0x07,0x46,0xa3,0x1c, 0x43,0xa0,0x1d,0x42,0xa0,0x1b,0x44,0xa3,0x1d,0x46,0xa4,0x1d,0x43,0xa1,0x1a, 0x47,0xa5,0x1e,0x82,0x44,0xa3,0x1d,0x16,0x44,0xa1,0x1c,0x46,0xa0,0x1c,0x47, 0xa1,0x1f,0x43,0x9c,0x1b,0x43,0x9d,0x1c,0x44,0x9e,0x1d,0x43,0x9c,0x1c,0x43, 0x9d,0x1c,0x45,0x9f,0x1e,0x46,0xa0,0x1f,0x45,0x9f,0x1e,0x45,0x9f,0x1d,0x45, 0xa2,0x1f,0x42,0x9d,0x1c,0x43,0x9f,0x1e,0x45,0x9f,0x1e,0x47,0xa1,0x20,0x44, 0x9d,0x1f,0x44,0x9c,0x1c,0x44,0x9c,0x1e,0x43,0x9b,0x1d,0x44,0x9d,0x1f,0x82, 0x43,0x9a,0x1c,0x06,0x44,0x9c,0x1c,0x43,0x9d,0x1c,0x44,0x9d,0x1f,0x44,0x9c, 0x1c,0x43,0x9b,0x1c,0x43,0x9b,0x1d,0x82,0x43,0x9a,0x1c,0x03,0x43,0x9a,0x1b, 0x41,0x9a,0x1a,0x40,0x9a,0x19,0x83,0x3f,0x97,0x17,0x0e,0x40,0x98,0x18,0x3f, 0x97,0x17,0x40,0x98,0x18,0x3b,0x94,0x14,0x3c,0x95,0x15,0x3d,0x93,0x15,0x3a, 0x91,0x13,0x3a,0x91,0x15,0x39,0x90,0x14,0x3b,0x90,0x18,0x39,0x8d,0x15,0x38, 0x8c,0x14,0x39,0x8c,0x13,0x39,0x89,0x13,0x82,0x37,0x87,0x14,0x07,0x34,0x85, 0x14,0x33,0x82,0x13,0x37,0x86,0x15,0x31,0x7f,0x11,0x2c,0x79,0x0f,0x24,0x72, 0x08,0x22,0x6d,0x07,0x82,0x23,0x6d,0x09,0x09,0x21,0x6b,0x08,0x21,0x6b,0x06, 0x21,0x6c,0x07,0x21,0x6b,0x06,0x22,0x6a,0x09,0x20,0x69,0x07,0x1d,0x68,0x05, 0x1e,0x68,0x08,0x1c,0x66,0x06,0x82,0x1c,0x65,0x06,0x05,0x1c,0x61,0x03,0x1c, 0x60,0x05,0x1b,0x62,0x06,0x1a,0x62,0x06,0x1a,0x61,0x05,0x82,0x1b,0x5f,0x04, 0x0a,0x18,0x5f,0x01,0x18,0x5f,0x03,0x18,0x5e,0x03,0x17,0x5d,0x02,0x17,0x5a, 0x00,0x18,0x5b,0x02,0x16,0x5a,0x02,0x15,0x5b,0x02,0x16,0x5a,0x02,0x17,0x59, 0x01,0x82,0x16,0x59,0x02,0x82,0x15,0x58,0x01,0x82,0x15,0x58,0x02,0x04,0x14, 0x58,0x00,0x15,0x59,0x02,0x17,0x5a,0x04,0x16,0x58,0x02,0x83,0x15,0x57,0x01, 0x05,0x16,0x56,0x01,0x18,0x57,0x03,0x15,0x57,0x02,0x17,0x55,0x01,0x18,0x55, 0x02,0x82,0x15,0x56,0x02,0x14,0x17,0x56,0x03,0x16,0x54,0x00,0x16,0x56,0x01, 0x15,0x55,0x02,0x13,0x54,0x01,0x15,0x55,0x03,0x14,0x54,0x02,0x15,0x54,0x02, 0x14,0x53,0x00,0x15,0x54,0x01,0x14,0x53,0x02,0x14,0x55,0x01,0x15,0x53,0x01, 0x16,0x54,0x02,0x15,0x53,0x01,0x15,0x53,0x02,0x14,0x51,0x00,0x13,0x50,0x00, 0x14,0x52,0x01,0x14,0x51,0x01,0x82,0x15,0x53,0x02,0x05,0x16,0x52,0x01,0x15, 0x52,0x01,0x14,0x51,0x02,0x15,0x50,0x02,0x14,0x51,0x02,0x82,0x14,0x4f,0x02, 0x01,0x14,0x4e,0x01,0x82,0x14,0x4f,0x01,0x82,0x13,0x4f,0x01,0x03,0x14,0x4f, 0x02,0x13,0x4e,0x00,0x15,0x4d,0x01,0x82,0x13,0x4d,0x01,0x02,0x13,0x4e,0x00, 0x14,0x4d,0x01,0x82,0x13,0x4d,0x00,0x01,0x15,0x4c,0x02,0x82,0x13,0x4c,0x01, 0x03,0x13,0x4b,0x01,0x14,0x4a,0x01,0x15,0x4b,0x02,0x82,0x13,0x4b,0x02,0x01, 0x14,0x4a,0x00,0x82,0x13,0x4a,0x01,0x08,0x14,0x4a,0x01,0x13,0x4a,0x02,0x13, 0x4a,0x01,0x14,0x49,0x01,0x13,0x48,0x01,0x13,0x47,0x01,0x13,0x48,0x02,0x13, 0x47,0x02,0x82,0x13,0x47,0x00,0x04,0x13,0x47,0x01,0x13,0x46,0x00,0x13,0x46, 0x02,0x13,0x46,0x00,0x82,0x13,0x45,0x02,0x05,0x13,0x45,0x00,0x13,0x45,0x04, 0x13,0x44,0x02,0x12,0x43,0x00,0x13,0x45,0x03,0x82,0x12,0x43,0x02,0x0a,0x11, 0x43,0x02,0x13,0x43,0x02,0x12,0x43,0x00,0x12,0x43,0x02,0x12,0x42,0x03,0x12, 0x43,0x01,0x12,0x43,0x02,0x11,0x42,0x02,0x11,0x42,0x01,0x10,0x41,0x00,0x82, 0x11,0x41,0x00,0x04,0x11,0x41,0x01,0x10,0x3f,0x01,0x10,0x3f,0x00,0x10,0x40, 0x01,0x82,0x10,0x3f,0x00,0x15,0x11,0x40,0x01,0x11,0x3f,0x01,0x10,0x3e,0x01, 0x11,0x3e,0x01,0x10,0x3d,0x01,0x11,0x3d,0x01,0x10,0x3c,0x00,0x10,0x3d,0x00, 0x11,0x3d,0x00,0x10,0x3d,0x01,0x0f,0x3c,0x01,0x10,0x3c,0x01,0x10,0x3c,0x02, 0x0e,0x3a,0x01,0x0f,0x3a,0x00,0x10,0x3b,0x01,0x0f,0x3b,0x01,0x0f,0x3a,0x01, 0x10,0x39,0x02,0x0f,0x3a,0x02,0x0e,0x3a,0x02,0x82,0x0f,0x39,0x02,0x02,0x0e, 0x39,0x01,0x0e,0x38,0x02,0x82,0x0f,0x38,0x02,0x05,0x0e,0x37,0x01,0x0e,0x37, 0x03,0x0e,0x36,0x01,0x0e,0x38,0x02,0x0e,0x36,0x01,0x82,0x0e,0x37,0x02,0x11, 0x0e,0x35,0x01,0x0e,0x36,0x01,0x0f,0x34,0x02,0x0f,0x34,0x01,0x0e,0x35,0x00, 0x0e,0x34,0x00,0x0d,0x33,0x01,0x0d,0x33,0x02,0x0e,0x33,0x02,0x0d,0x32,0x02, 0x0d,0x32,0x01,0x0e,0x31,0x01,0x0e,0x30,0x00,0x0e,0x31,0x01,0x0c,0x31,0x00, 0x0d,0x31,0x01,0x0d,0x31,0x02,0x83,0x0c,0x30,0x01,0x83,0x0c,0x30,0x02,0x01, 0x0d,0x2f,0x01,0x82,0x0c,0x2f,0x01,0x06,0x0c,0x2f,0x02,0x0c,0x2f,0x01,0x0c, 0x2e,0x01,0x0b,0x2d,0x01,0x0c,0x2d,0x01,0x0b,0x2c,0x00,0x82,0x0b,0x2c,0x01, 0x01,0x0b,0x2d,0x01,0x82,0x0b,0x2b,0x01,0x84,0x0a,0x2a,0x01,0x06,0x0a,0x29, 0x01,0x0a,0x2a,0x01,0x0a,0x29,0x01,0x0b,0x29,0x02,0x0a,0x28,0x01,0x09,0x27, 0x00,0x82,0x0a,0x28,0x01,0x83,0x09,0x27,0x01,0x85,0x09,0x26,0x01,0x01,0x09, 0x25,0x01,0x82,0x09,0x25,0x00,0x02,0x09,0x24,0x00,0x09,0x24,0x01,0x82,0x09, 0x23,0x00,0x02,0x09,0x23,0x01,0x08,0x22,0x01,0x83,0x09,0x22,0x00,0x82,0x09, 0x23,0x00,0x82,0x08,0x21,0x00,0x01,0x09,0x21,0x01,0x83,0x08,0x20,0x00,0x82, 0x08,0x1f,0x00,0x05,0x09,0x1f,0x00,0x09,0x1e,0x00,0x08,0x1d,0x00,0x07,0x1e, 0x01,0x08,0x1d,0x01,0x83,0x07,0x1d,0x00,0x02,0x07,0x1c,0x00,0x08,0x1c,0x00, 0x82,0x07,0x1c,0x00,0x03,0x06,0x1c,0x00,0x06,0x1b,0x00,0x07,0x1b,0x00,0x82, 0x06,0x1b,0x00,0x03,0x07,0x1a,0x00,0x06,0x19,0x00,0x07,0x1a,0x00,0x82,0x06, 0x19,0x00,0x84,0x06,0x18,0x00,0x03,0x05,0x17,0x00,0x06,0x17,0x00,0x05,0x17, 0x00,0x82,0x05,0x16,0x00,0x85,0x05,0x15,0x00,0x83,0x04,0x14,0x00,0x85,0x04, 0x13,0x00,0x03,0x04,0x12,0x00,0x04,0x13,0x00,0x03,0x12,0x00,0x85,0x03,0x11, 0x00,0x83,0x03,0x10,0x00,0x83,0x03,0x0f,0x00,0x84,0x03,0x0e,0x00,0x01,0x02, 0x0e,0x00,0x83,0x02,0x0d,0x00,0x84,0x02,0x0c,0x00,0x84,0x02,0x0b,0x00,0x04, 0x02,0x0a,0x00,0x01,0x0a,0x00,0x02,0x0a,0x00,0x01,0x0a,0x00,0x86,0x01,0x09, 0x00,0x84,0x01,0x08,0x00,0x83,0x01,0x07,0x00,0x84,0x00,0x06,0x00,0x84,0x00, 0x05,0x00,0x83,0x00,0x04,0x00,0x84,0x00,0x03,0x00,0x83,0x00,0x02,0x00,0x84, 0x00,0x01,0x00,0xde,0x00,0x00,0x00,0x12,0x38,0x92,0x16,0x3a,0x93,0x18,0x37, 0x91,0x15,0x38,0x92,0x16,0x3a,0x93,0x18,0x38,0x92,0x16,0x3a,0x92,0x17,0x38, 0x90,0x15,0x39,0x92,0x17,0x38,0x92,0x14,0x37,0x91,0x15,0x39,0x91,0x17,0x38, 0x90,0x15,0x39,0x91,0x16,0x37,0x8f,0x15,0x3a,0x92,0x17,0x38,0x92,0x16,0x37, 0x91,0x15,0x82,0x36,0x8e,0x14,0x82,0x38,0x90,0x15,0x04,0x36,0x8e,0x14,0x38, 0x90,0x16,0x36,0x8e,0x14,0x38,0x90,0x16,0x85,0x36,0x8e,0x14,0x05,0x38,0x90, 0x15,0x37,0x8f,0x15,0x36,0x8e,0x14,0x37,0x8f,0x15,0x35,0x8d,0x14,0x85,0x36, 0x8e,0x14,0x07,0x36,0x8f,0x15,0x34,0x8d,0x15,0x35,0x8e,0x14,0x36,0x8e,0x14, 0x35,0x8d,0x13,0x37,0x8f,0x14,0x34,0x8d,0x14,0x82,0x35,0x8d,0x14,0x82,0x35, 0x8f,0x14,0x0d,0x34,0x8e,0x13,0x37,0x91,0x15,0x36,0x8e,0x14,0x35,0x8d,0x14, 0x36,0x8f,0x15,0x37,0x8f,0x15,0x35,0x8d,0x14,0x37,0x8f,0x14,0x36,0x8e,0x14, 0x37,0x8f,0x15,0x36,0x8e,0x14,0x34,0x8d,0x14,0x34,0x8c,0x13,0x82,0x35,0x8e, 0x14,0x1d,0x34,0x8d,0x14,0x36,0x8f,0x15,0x35,0x8d,0x14,0x34,0x8c,0x13,0x37, 0x8e,0x17,0x34,0x8d,0x14,0x35,0x8e,0x14,0x36,0x8e,0x14,0x37,0x8f,0x15,0x35, 0x8d,0x14,0x36,0x8e,0x14,0x3a,0x8f,0x15,0x37,0x8c,0x13,0x34,0x8d,0x14,0x36, 0x8e,0x14,0x35,0x8d,0x14,0x35,0x8e,0x14,0x34,0x8d,0x14,0x35,0x8d,0x14,0x37, 0x8f,0x15,0x36,0x8f,0x15,0x34,0x8d,0x15,0x34,0x8c,0x14,0x35,0x8e,0x14,0x36, 0x8f,0x15,0x36,0x8e,0x14,0x35,0x8d,0x14,0x36,0x8f,0x15,0x34,0x90,0x15,0x82, 0x37,0x90,0x16,0x03,0x36,0x8f,0x15,0x36,0x8f,0x17,0x36,0x8f,0x15,0x82,0x38, 0x91,0x17,0x0c,0x36,0x8f,0x15,0x37,0x90,0x18,0x37,0x90,0x16,0x38,0x92,0x16, 0x37,0x91,0x15,0x36,0x8f,0x15,0x36,0x8f,0x17,0x38,0x91,0x17,0x38,0x92,0x16, 0x36,0x8f,0x15,0x37,0x90,0x16,0x38,0x92,0x16,0x82,0x39,0x92,0x17,0x02,0x37, 0x91,0x15,0x39,0x92,0x17,0x82,0x38,0x92,0x16,0x0a,0x3a,0x93,0x18,0x37,0x92, 0x17,0x36,0x92,0x16,0x38,0x93,0x18,0x39,0x94,0x19,0x38,0x93,0x18,0x3b,0x94, 0x19,0x3a,0x93,0x18,0x39,0x95,0x17,0x38,0x95,0x17,0x82,0x3a,0x96,0x18,0x03, 0x3d,0x96,0x19,0x3c,0x95,0x18,0x39,0x94,0x19,0x83,0x3a,0x97,0x19,0x82,0x3b, 0x97,0x19,0x04,0x3b,0x98,0x1a,0x3a,0x97,0x19,0x39,0x95,0x15,0x39,0x97,0x16, 0x82,0x3c,0x98,0x18,0x0c,0x3a,0x96,0x16,0x3d,0x9b,0x1a,0x3b,0x99,0x18,0x3d, 0x99,0x19,0x3e,0x9a,0x1a,0x3d,0x9b,0x18,0x3b,0x99,0x18,0x3c,0x9a,0x19,0x3c, 0x9a,0x17,0x3b,0x99,0x16,0x3c,0x9a,0x19,0x3e,0x9c,0x1b,0x83,0x3d,0x9b,0x18, 0x83,0x3e,0x9c,0x19,0x01,0x3d,0x9b,0x18,0x82,0x3e,0x9c,0x19,0x04,0x3e,0x9d, 0x1a,0x3f,0x9d,0x1b,0x3e,0x9d,0x1a,0x3e,0x9c,0x18,0x82,0x3e,0x9d,0x19,0x0e, 0x3f,0x9d,0x1b,0x3e,0x9d,0x1a,0x41,0x9f,0x1c,0x3e,0x9d,0x19,0x3f,0x9d,0x1a, 0x3e,0x9d,0x19,0x3f,0x9d,0x1a,0x40,0x9e,0x1b,0x3e,0x9d,0x1a,0x3e,0x9c,0x19, 0x40,0x9e,0x1b,0x3e,0x9d,0x19,0x3f,0x9d,0x1a,0x40,0x9e,0x1b,0x82,0x3f,0x9d, 0x1a,0x82,0x3e,0x9d,0x19,0x06,0x3f,0x9d,0x1a,0x40,0x9e,0x1b,0x3e,0x9d,0x19, 0x3f,0x9d,0x1a,0x41,0x9e,0x1b,0x40,0x9d,0x1a,0x82,0x3f,0x9d,0x1a,0x06,0x3e, 0x9d,0x19,0x3f,0x9d,0x1a,0x41,0x9f,0x1c,0x40,0x9e,0x1c,0x3f,0x9d,0x1b,0x41, 0x9d,0x1c,0x82,0x40,0x9d,0x1b,0x82,0x40,0x9e,0x1b,0x04,0x41,0x9f,0x1d,0x40, 0x9d,0x1b,0x40,0x9d,0x1a,0x41,0x9f,0x1c,0x82,0x40,0x9e,0x1b,0x04,0x3f,0x9d, 0x1a,0x41,0x9f,0x1c,0x40,0x9e,0x1b,0x41,0x9f,0x1c,0x82,0x41,0xa0,0x1a,0x82, 0x40,0x9f,0x19,0x82,0x42,0xa1,0x19,0x0a,0x43,0xa2,0x1a,0x44,0xa3,0x1b,0x43, 0xa2,0x1a,0x42,0xa1,0x19,0x44,0xa3,0x1b,0x42,0xa1,0x19,0x43,0xa3,0x18,0x43, 0xa4,0x1b,0x44,0xa5,0x1c,0x45,0xa6,0x1b,0x82,0x44,0xa5,0x1a,0x10,0x45,0xa4, 0x1c,0x44,0xa4,0x19,0x43,0xa2,0x1a,0x43,0xa4,0x1b,0x45,0xa6,0x1b,0x46,0xa6, 0x1b,0x44,0xa3,0x1b,0x43,0xa2,0x1a,0x42,0xa1,0x1b,0x41,0xa0,0x1a,0x43,0xa0, 0x1b,0x42,0x9f,0x1a,0x44,0xa1,0x1c,0x45,0xa2,0x1d,0x41,0x9e,0x19,0x42,0x9f, 0x1a,0x82,0x45,0xa4,0x1e,0x06,0x47,0xa6,0x1f,0x46,0xa5,0x1d,0x45,0xa4,0x1c, 0x46,0xa5,0x1d,0x43,0xa2,0x1c,0x45,0xa4,0x1e,0x82,0x44,0xa1,0x1c,0x08,0x45, 0xa2,0x1f,0x42,0x9e,0x1d,0x44,0xa0,0x1f,0x41,0x9d,0x1c,0x42,0x9e,0x1d,0x43, 0x9f,0x1e,0x45,0xa1,0x1f,0x44,0xa0,0x1f,0x83,0x45,0x9f,0x1e,0x17,0x45,0x9f, 0x1d,0x47,0xa1,0x1f,0x46,0x9f,0x20,0x47,0xa0,0x21,0x44,0x9e,0x1d,0x43,0x9d, 0x1e,0x45,0x9d,0x1f,0x46,0x9e,0x1e,0x45,0x9d,0x1d,0x43,0x9d,0x1c,0x46,0xa0, 0x1f,0x44,0x9d,0x1f,0x45,0x9d,0x1f,0x43,0x9d,0x1e,0x46,0xa0,0x1f,0x44,0x9e, 0x1d,0x43,0x9c,0x1d,0x45,0x9d,0x1f,0x44,0x9d,0x1c,0x43,0x9c,0x1b,0x43,0x9d, 0x1c,0x40,0x9b,0x19,0x42,0x9b,0x1a,0x82,0x41,0x9a,0x19,0x0a,0x42,0x9b,0x1a, 0x3f,0x98,0x17,0x3d,0x97,0x15,0x3e,0x98,0x17,0x3f,0x99,0x18,0x3d,0x93,0x14, 0x3b,0x92,0x15,0x3a,0x92,0x14,0x3a,0x90,0x16,0x39,0x8f,0x15,0x82,0x3a,0x8f, 0x16,0x11,0x3b,0x8f,0x16,0x39,0x8b,0x16,0x3a,0x8c,0x17,0x38,0x8a,0x15,0x36, 0x88,0x14,0x34,0x86,0x13,0x35,0x85,0x14,0x35,0x84,0x12,0x34,0x84,0x12,0x33, 0x82,0x14,0x29,0x77,0x0d,0x24,0x70,0x09,0x23,0x6f,0x08,0x22,0x6d,0x07,0x24, 0x6e,0x0a,0x21,0x6b,0x0a,0x21,0x6b,0x08,0x82,0x21,0x6a,0x08,0x82,0x1f,0x68, 0x06,0x08,0x1e,0x68,0x07,0x1d,0x67,0x06,0x1e,0x67,0x07,0x1f,0x65,0x06,0x1d, 0x62,0x04,0x1b,0x63,0x06,0x1a,0x64,0x04,0x1b,0x62,0x04,0x82,0x1b,0x5f,0x04, 0x06,0x1a,0x61,0x03,0x19,0x5f,0x04,0x17,0x5e,0x02,0x1a,0x5e,0x03,0x19,0x5d, 0x02,0x18,0x5d,0x04,0x82,0x16,0x5b,0x02,0x0b,0x17,0x5c,0x03,0x18,0x5b,0x03, 0x17,0x5a,0x02,0x15,0x59,0x01,0x14,0x5a,0x01,0x16,0x5a,0x03,0x15,0x58,0x01, 0x14,0x57,0x00,0x17,0x59,0x02,0x14,0x58,0x00,0x15,0x59,0x01,0x82,0x16,0x59, 0x02,0x82,0x15,0x58,0x01,0x13,0x16,0x58,0x02,0x17,0x57,0x02,0x15,0x58,0x02, 0x15,0x55,0x00,0x16,0x55,0x01,0x15,0x57,0x02,0x16,0x57,0x03,0x15,0x56,0x02, 0x16,0x54,0x00,0x16,0x56,0x01,0x14,0x54,0x01,0x16,0x53,0x01,0x14,0x55,0x02, 0x14,0x54,0x01,0x15,0x55,0x03,0x16,0x55,0x02,0x15,0x56,0x02,0x15,0x54,0x02, 0x14,0x55,0x01,0x83,0x14,0x53,0x00,0x83,0x15,0x53,0x01,0x01,0x14,0x53,0x01, 0x82,0x14,0x52,0x01,0x01,0x14,0x53,0x01,0x82,0x14,0x51,0x01,0x02,0x14,0x52, 0x01,0x14,0x52,0x02,0x82,0x15,0x51,0x02,0x82,0x14,0x50,0x01,0x01,0x14,0x51, 0x02,0x82,0x14,0x50,0x00,0x03,0x14,0x50,0x01,0x14,0x50,0x02,0x14,0x50,0x01, 0x82,0x14,0x4d,0x01,0x03,0x14,0x50,0x03,0x13,0x4f,0x01,0x14,0x4e,0x00,0x82, 0x14,0x4e,0x02,0x04,0x14,0x4d,0x02,0x13,0x4c,0x01,0x13,0x4b,0x01,0x14,0x4d, 0x02,0x82,0x14,0x4b,0x01,0x82,0x13,0x4b,0x01,0x04,0x14,0x4a,0x02,0x14,0x4b, 0x01,0x13,0x4a,0x02,0x13,0x49,0x01,0x82,0x13,0x49,0x00,0x06,0x14,0x49,0x02, 0x14,0x49,0x01,0x12,0x49,0x01,0x14,0x49,0x02,0x13,0x49,0x02,0x12,0x48,0x00, 0x82,0x13,0x47,0x00,0x0f,0x12,0x47,0x01,0x14,0x45,0x01,0x13,0x48,0x01,0x14, 0x47,0x02,0x13,0x46,0x00,0x12,0x45,0x00,0x12,0x45,0x01,0x13,0x45,0x02,0x12, 0x45,0x00,0x12,0x45,0x02,0x12,0x45,0x01,0x12,0x43,0x01,0x11,0x42,0x00,0x13, 0x44,0x02,0x12,0x44,0x01,0x82,0x12,0x44,0x02,0x01,0x12,0x42,0x00,0x82,0x11, 0x42,0x02,0x05,0x12,0x43,0x02,0x12,0x43,0x03,0x11,0x42,0x02,0x10,0x40,0x01, 0x11,0x41,0x02,0x82,0x11,0x40,0x01,0x02,0x10,0x40,0x01,0x11,0x40,0x02,0x82, 0x11,0x40,0x01,0x07,0x11,0x3f,0x02,0x10,0x3f,0x02,0x10,0x3e,0x02,0x10,0x3e, 0x01,0x0f,0x3e,0x01,0x10,0x3e,0x01,0x11,0x3e,0x01,0x82,0x0f,0x3d,0x00,0x01, 0x10,0x3d,0x01,0x82,0x0f,0x3c,0x01,0x01,0x0e,0x3b,0x01,0x82,0x10,0x3b,0x01, 0x09,0x0e,0x3b,0x00,0x0f,0x3b,0x00,0x10,0x3a,0x02,0x10,0x3b,0x02,0x0e,0x3b, 0x02,0x0e,0x39,0x01,0x0f,0x38,0x01,0x0e,0x38,0x01,0x0f,0x38,0x01,0x82,0x0f, 0x38,0x02,0x08,0x0e,0x38,0x00,0x0f,0x37,0x02,0x0e,0x37,0x02,0x0f,0x38,0x02, 0x0f,0x37,0x02,0x0e,0x37,0x02,0x0e,0x36,0x01,0x0f,0x36,0x02,0x82,0x0e,0x35, 0x01,0x02,0x0e,0x34,0x00,0x0f,0x34,0x00,0x82,0x0e,0x35,0x01,0x02,0x0d,0x34, 0x01,0x0e,0x34,0x01,0x82,0x0d,0x34,0x01,0x82,0x0d,0x33,0x01,0x02,0x0e,0x32, 0x01,0x0c,0x31,0x00,0x82,0x0d,0x32,0x01,0x04,0x0d,0x31,0x01,0x0d,0x32,0x02, 0x0d,0x31,0x01,0x0c,0x30,0x02,0x85,0x0c,0x2f,0x01,0x10,0x0c,0x2f,0x02,0x0b, 0x2e,0x00,0x0b,0x2e,0x01,0x0c,0x2e,0x01,0x0c,0x2d,0x01,0x0b,0x2d,0x01,0x0c, 0x2d,0x01,0x0c,0x2c,0x01,0x0c,0x2b,0x01,0x0b,0x2b,0x00,0x0b,0x2b,0x01,0x0a, 0x2a,0x00,0x0a,0x2b,0x00,0x0a,0x2a,0x01,0x0b,0x2a,0x01,0x0a,0x29,0x01,0x82, 0x0a,0x29,0x00,0x01,0x0b,0x29,0x01,0x83,0x0a,0x29,0x00,0x04,0x0a,0x29,0x01, 0x0a,0x28,0x01,0x0a,0x28,0x00,0x0a,0x27,0x00,0x82,0x0a,0x27,0x01,0x82,0x0a, 0x26,0x01,0x82,0x0a,0x26,0x00,0x02,0x0a,0x25,0x00,0x0a,0x26,0x01,0x82,0x0a, 0x25,0x01,0x82,0x0a,0x24,0x00,0x01,0x09,0x23,0x01,0x83,0x09,0x22,0x00,0x01, 0x09,0x23,0x01,0x82,0x09,0x22,0x00,0x01,0x08,0x21,0x01,0x82,0x08,0x21,0x00, 0x83,0x08,0x20,0x00,0x85,0x08,0x1f,0x00,0x01,0x07,0x1f,0x00,0x82,0x07,0x1e, 0x00,0x04,0x08,0x1e,0x00,0x07,0x1e,0x00,0x07,0x1d,0x00,0x08,0x1d,0x00,0x82, 0x07,0x1c,0x00,0x82,0x06,0x1b,0x00,0x82,0x07,0x1b,0x00,0x83,0x06,0x1a,0x00, 0x01,0x07,0x1a,0x00,0x82,0x06,0x19,0x00,0x84,0x06,0x18,0x00,0x02,0x06,0x17, 0x00,0x05,0x17,0x00,0x83,0x05,0x16,0x00,0x83,0x05,0x15,0x00,0x02,0x04,0x15, 0x00,0x05,0x14,0x00,0x87,0x04,0x14,0x00,0x83,0x04,0x13,0x00,0x82,0x04,0x12, 0x00,0x82,0x03,0x11,0x00,0x02,0x04,0x11,0x00,0x03,0x11,0x00,0x84,0x03,0x10, 0x00,0x82,0x03,0x0f,0x00,0x82,0x03,0x0e,0x00,0x05,0x02,0x0e,0x00,0x03,0x0e, 0x00,0x02,0x0d,0x00,0x03,0x0d,0x00,0x02,0x0d,0x00,0x85,0x02,0x0c,0x00,0x84, 0x02,0x0b,0x00,0x83,0x02,0x0a,0x00,0x02,0x01,0x0a,0x00,0x02,0x0a,0x00,0x82, 0x01,0x0a,0x00,0x83,0x01,0x09,0x00,0x84,0x01,0x08,0x00,0x01,0x01,0x07,0x00, 0x82,0x00,0x07,0x00,0x84,0x00,0x06,0x00,0x83,0x00,0x05,0x00,0x84,0x00,0x04, 0x00,0x84,0x00,0x03,0x00,0x83,0x00,0x02,0x00,0x84,0x00,0x01,0x00,0xde,0x00, 0x00,0x00,0x08,0x38,0x91,0x18,0x39,0x91,0x16,0x38,0x90,0x16,0x38,0x8f,0x17, 0x39,0x91,0x19,0x39,0x91,0x16,0x38,0x90,0x16,0x38,0x8f,0x17,0x82,0x37,0x8e, 0x16,0x0e,0x36,0x8d,0x17,0x33,0x8a,0x15,0x38,0x8f,0x17,0x35,0x8a,0x13,0x36, 0x8a,0x16,0x37,0x8c,0x15,0x34,0x89,0x16,0x36,0x8d,0x16,0x37,0x90,0x16,0x36, 0x8d,0x16,0x35,0x89,0x16,0x35,0x88,0x16,0x34,0x89,0x14,0x34,0x8b,0x14,0x82, 0x37,0x8e,0x16,0x06,0x36,0x8d,0x17,0x35,0x8c,0x16,0x32,0x89,0x14,0x35,0x89, 0x15,0x35,0x8c,0x16,0x34,0x8b,0x16,0x82,0x33,0x8a,0x15,0x11,0x35,0x8a,0x13, 0x36,0x8a,0x17,0x39,0x8e,0x16,0x34,0x89,0x14,0x37,0x8c,0x15,0x34,0x89,0x14, 0x33,0x8a,0x13,0x34,0x8b,0x16,0x33,0x8a,0x15,0x34,0x8b,0x16,0x33,0x8a,0x13, 0x35,0x8c,0x15,0x36,0x8d,0x16,0x35,0x8c,0x15,0x32,0x89,0x12,0x35,0x8c,0x15, 0x33,0x8a,0x13,0x82,0x34,0x8b,0x14,0x82,0x33,0x8a,0x13,0x04,0x34,0x8b,0x14, 0x33,0x8c,0x14,0x34,0x8b,0x16,0x35,0x8a,0x13,0x83,0x36,0x8b,0x14,0x06,0x34, 0x8b,0x16,0x33,0x8c,0x16,0x35,0x8c,0x16,0x30,0x88,0x12,0x34,0x8b,0x16,0x36, 0x8d,0x17,0x82,0x32,0x89,0x14,0x02,0x35,0x8c,0x16,0x33,0x8a,0x15,0x82,0x34, 0x8b,0x14,0x04,0x35,0x8c,0x16,0x33,0x8a,0x15,0x32,0x89,0x12,0x35,0x8c,0x15, 0x82,0x34,0x8b,0x14,0x10,0x34,0x8d,0x15,0x32,0x89,0x14,0x34,0x8b,0x16,0x34, 0x8d,0x16,0x34,0x8d,0x15,0x33,0x8a,0x13,0x37,0x8e,0x16,0x36,0x8d,0x16,0x36, 0x8d,0x17,0x33,0x8c,0x16,0x34,0x8d,0x16,0x36,0x8f,0x16,0x36,0x8d,0x16,0x32, 0x89,0x12,0x34,0x8b,0x14,0x34,0x8d,0x15,0x82,0x35,0x8e,0x16,0x04,0x35,0x8c, 0x16,0x36,0x8d,0x17,0x37,0x8e,0x16,0x35,0x8c,0x15,0x86,0x36,0x8d,0x16,0x82, 0x36,0x8f,0x16,0x04,0x37,0x90,0x16,0x35,0x8e,0x14,0x35,0x8e,0x16,0x36,0x8f, 0x16,0x82,0x38,0x91,0x16,0x05,0x37,0x90,0x16,0x35,0x8e,0x14,0x36,0x8f,0x15, 0x38,0x90,0x16,0x37,0x90,0x16,0x82,0x38,0x91,0x16,0x02,0x36,0x8f,0x15,0x38, 0x91,0x16,0x82,0x37,0x90,0x16,0x04,0x38,0x91,0x16,0x37,0x93,0x17,0x38,0x94, 0x17,0x39,0x94,0x17,0x82,0x37,0x93,0x16,0x08,0x38,0x94,0x17,0x39,0x94,0x18, 0x3c,0x96,0x1a,0x39,0x95,0x19,0x39,0x96,0x19,0x39,0x96,0x17,0x39,0x95,0x16, 0x3a,0x97,0x18,0x82,0x39,0x97,0x18,0x06,0x39,0x96,0x17,0x3a,0x97,0x18,0x39, 0x96,0x17,0x39,0x95,0x16,0x39,0x96,0x17,0x3b,0x98,0x17,0x82,0x3b,0x9a,0x18, 0x02,0x3b,0x98,0x19,0x3c,0x9b,0x19,0x82,0x3a,0x99,0x17,0x82,0x3b,0x9a,0x18, 0x0c,0x3a,0x99,0x17,0x3b,0x9a,0x18,0x3c,0x9b,0x17,0x3b,0x9a,0x18,0x3c,0x9b, 0x17,0x3d,0x9c,0x18,0x3c,0x9b,0x17,0x3c,0x9b,0x19,0x3e,0x9b,0x1a,0x3d,0x9c, 0x1a,0x3c,0x9b,0x17,0x3e,0x9b,0x18,0x82,0x3e,0x9d,0x19,0x09,0x3d,0x9a,0x17, 0x3e,0x9b,0x18,0x3d,0x9c,0x18,0x3f,0x9e,0x1a,0x3e,0x9d,0x19,0x3e,0x9d,0x18, 0x3e,0x9d,0x19,0x3d,0x9c,0x18,0x3e,0x9d,0x19,0x82,0x3e,0x9d,0x18,0x04,0x3e, 0x9d,0x19,0x3d,0x9c,0x18,0x3f,0x9e,0x19,0x3f,0x9e,0x1a,0x82,0x3e,0x9d,0x19, 0x01,0x3f,0x9e,0x19,0x82,0x3e,0x9d,0x18,0x03,0x40,0x9f,0x1b,0x40,0x9f,0x1a, 0x41,0x9f,0x1b,0x82,0x3e,0x9d,0x18,0x84,0x40,0x9f,0x1a,0x04,0x3f,0x9e,0x19, 0x40,0x9f,0x1a,0x40,0x9f,0x1b,0x3f,0x9e,0x1a,0x82,0x3f,0x9c,0x19,0x08,0x40, 0x9d,0x1a,0x41,0x9f,0x1a,0x41,0x9f,0x1b,0x40,0x9f,0x1a,0x40,0x9f,0x1b,0x3f, 0x9e,0x1a,0x3f,0x9e,0x19,0x41,0x9f,0x1b,0x82,0x3f,0x9e,0x1a,0x04,0x40,0x9f, 0x1a,0x42,0xa0,0x1c,0x40,0x9f,0x1a,0x42,0xa0,0x1c,0x82,0x42,0xa1,0x1a,0x02, 0x41,0xa0,0x19,0x43,0xa2,0x1b,0x82,0x42,0xa1,0x18,0x09,0x43,0xa2,0x19,0x45, 0xa5,0x1c,0x43,0xa2,0x19,0x44,0xa3,0x1a,0x45,0xa5,0x1c,0x42,0xa3,0x19,0x44, 0xa5,0x19,0x43,0xa4,0x1a,0x44,0xa5,0x1b,0x82,0x44,0xa5,0x19,0x05,0x44,0xa6, 0x1a,0x45,0xa6,0x1a,0x44,0xa4,0x18,0x44,0xa4,0x1b,0x44,0xa5,0x19,0x82,0x44, 0xa6,0x1a,0x01,0x44,0xa4,0x1b,0x82,0x47,0xa7,0x1e,0x0b,0x46,0xa6,0x1d,0x43, 0xa2,0x1b,0x44,0xa4,0x1b,0x42,0xa0,0x1c,0x44,0xa2,0x1c,0x44,0xa3,0x1c,0x43, 0xa2,0x1b,0x44,0xa4,0x1b,0x43,0xa2,0x1b,0x44,0xa4,0x1b,0x45,0xa5,0x1c,0x82, 0x46,0xa6,0x1d,0x08,0x44,0xa4,0x1d,0x44,0xa3,0x1c,0x46,0xa4,0x1e,0x45,0xa3, 0x1d,0x45,0xa2,0x20,0x44,0xa0,0x1e,0x43,0x9f,0x1d,0x44,0xa1,0x1f,0x82,0x44, 0xa1,0x1d,0x08,0x44,0xa2,0x1e,0x48,0xa6,0x22,0x46,0xa1,0x1f,0x45,0xa0,0x1e, 0x44,0x9f,0x1d,0x45,0xa0,0x1e,0x46,0xa1,0x1f,0x44,0x9e,0x1e,0x82,0x44,0x9f, 0x1f,0x02,0x45,0x9f,0x20,0x44,0x9f,0x1d,0x82,0x45,0xa0,0x1e,0x04,0x44,0x9f, 0x1c,0x47,0xa2,0x20,0x44,0x9f,0x1c,0x43,0x9d,0x1d,0x82,0x44,0xa0,0x1e,0x06, 0x44,0x9f,0x1d,0x44,0x9f,0x1c,0x45,0x9f,0x1f,0x44,0x9e,0x1c,0x43,0x9e,0x1b, 0x44,0x9f,0x1c,0x82,0x43,0x9e,0x1b,0x01,0x41,0x9c,0x19,0x82,0x42,0x9d,0x1a, 0x09,0x41,0x9c,0x18,0x3f,0x9a,0x16,0x41,0x9b,0x18,0x40,0x98,0x17,0x40,0x97, 0x17,0x3d,0x95,0x16,0x3e,0x96,0x16,0x3d,0x94,0x17,0x3c,0x94,0x16,0x82,0x39, 0x8f,0x16,0x0e,0x38,0x8d,0x14,0x39,0x8f,0x18,0x39,0x8c,0x16,0x39,0x8c,0x14, 0x39,0x8b,0x14,0x37,0x89,0x14,0x36,0x88,0x13,0x35,0x84,0x12,0x34,0x84,0x11, 0x35,0x84,0x12,0x33,0x82,0x12,0x2f,0x7e,0x10,0x29,0x76,0x0c,0x23,0x6f,0x08, 0x82,0x22,0x6e,0x07,0x23,0x22,0x6d,0x09,0x21,0x6a,0x07,0x22,0x6b,0x08,0x20, 0x6a,0x07,0x20,0x69,0x07,0x1f,0x6a,0x07,0x1d,0x68,0x07,0x1f,0x68,0x08,0x21, 0x67,0x06,0x1f,0x65,0x06,0x1c,0x65,0x05,0x1b,0x66,0x03,0x1c,0x64,0x05,0x1a, 0x62,0x03,0x1a,0x62,0x05,0x1a,0x62,0x03,0x19,0x61,0x05,0x1b,0x5f,0x04,0x1a, 0x5e,0x03,0x17,0x5e,0x02,0x18,0x5e,0x03,0x19,0x5d,0x03,0x17,0x5d,0x02,0x16, 0x5d,0x02,0x17,0x5b,0x01,0x16,0x5b,0x02,0x18,0x5b,0x03,0x17,0x5b,0x01,0x16, 0x5b,0x01,0x16,0x5a,0x02,0x17,0x5a,0x02,0x15,0x59,0x01,0x15,0x59,0x00,0x16, 0x5a,0x01,0x17,0x59,0x01,0x83,0x16,0x59,0x01,0x01,0x16,0x58,0x01,0x82,0x16, 0x59,0x02,0x15,0x15,0x57,0x01,0x16,0x56,0x01,0x16,0x58,0x02,0x16,0x58,0x03, 0x16,0x57,0x02,0x15,0x56,0x01,0x17,0x56,0x02,0x16,0x56,0x02,0x16,0x55,0x02, 0x16,0x53,0x00,0x15,0x55,0x01,0x16,0x55,0x02,0x15,0x56,0x01,0x15,0x55,0x00, 0x15,0x54,0x02,0x15,0x55,0x02,0x15,0x54,0x02,0x16,0x54,0x02,0x16,0x55,0x03, 0x16,0x54,0x02,0x16,0x53,0x02,0x84,0x15,0x52,0x02,0x82,0x14,0x51,0x02,0x06, 0x14,0x50,0x02,0x13,0x50,0x02,0x14,0x52,0x03,0x15,0x50,0x02,0x15,0x52,0x02, 0x14,0x50,0x01,0x82,0x15,0x51,0x01,0x83,0x14,0x50,0x00,0x04,0x15,0x4f,0x00, 0x15,0x50,0x02,0x14,0x4f,0x01,0x15,0x4f,0x01,0x83,0x14,0x4f,0x01,0x82,0x14, 0x4e,0x01,0x03,0x14,0x4e,0x02,0x13,0x4d,0x01,0x13,0x4c,0x01,0x82,0x13,0x4d, 0x01,0x04,0x13,0x4c,0x01,0x14,0x4d,0x02,0x13,0x4c,0x01,0x13,0x4b,0x00,0x82, 0x13,0x4b,0x01,0x01,0x13,0x4a,0x01,0x82,0x13,0x49,0x01,0x08,0x14,0x4a,0x02, 0x14,0x4a,0x03,0x13,0x4a,0x02,0x12,0x4a,0x02,0x13,0x4a,0x02,0x12,0x48,0x01, 0x13,0x48,0x00,0x13,0x47,0x01,0x82,0x12,0x46,0x01,0x09,0x12,0x48,0x00,0x12, 0x47,0x02,0x12,0x47,0x00,0x13,0x47,0x01,0x11,0x45,0x01,0x12,0x44,0x01,0x12, 0x45,0x00,0x12,0x45,0x02,0x11,0x44,0x00,0x82,0x12,0x44,0x02,0x03,0x14,0x45, 0x02,0x12,0x44,0x02,0x11,0x44,0x01,0x82,0x12,0x44,0x02,0x02,0x12,0x44,0x01, 0x11,0x43,0x00,0x82,0x11,0x43,0x02,0x09,0x11,0x42,0x02,0x11,0x42,0x01,0x11, 0x42,0x02,0x10,0x41,0x01,0x11,0x41,0x01,0x10,0x41,0x01,0x10,0x40,0x01,0x11, 0x41,0x01,0x11,0x40,0x01,0x82,0x10,0x3f,0x01,0x02,0x10,0x3f,0x02,0x10,0x3f, 0x01,0x82,0x10,0x3e,0x01,0x01,0x11,0x3f,0x01,0x82,0x0f,0x3d,0x00,0x05,0x10, 0x3d,0x01,0x10,0x3d,0x02,0x10,0x3c,0x01,0x0f,0x3d,0x02,0x0f,0x3c,0x01,0x82, 0x0f,0x3b,0x00,0x02,0x0f,0x3c,0x01,0x0f,0x3b,0x02,0x82,0x10,0x3a,0x02,0x03, 0x0f,0x39,0x02,0x0f,0x3a,0x02,0x0e,0x3a,0x02,0x82,0x0e,0x39,0x01,0x04,0x0e, 0x38,0x01,0x0e,0x38,0x00,0x0e,0x38,0x01,0x0e,0x38,0x02,0x83,0x0f,0x38,0x02, 0x06,0x0e,0x37,0x01,0x0e,0x37,0x02,0x0e,0x36,0x01,0x0e,0x34,0x00,0x0e,0x36, 0x00,0x0e,0x36,0x01,0x82,0x0d,0x35,0x00,0x82,0x0e,0x35,0x02,0x02,0x0d,0x33, 0x01,0x0e,0x34,0x02,0x82,0x0d,0x34,0x02,0x08,0x0d,0x32,0x01,0x0d,0x31,0x00, 0x0d,0x32,0x01,0x0d,0x31,0x01,0x0e,0x31,0x01,0x0d,0x31,0x01,0x0c,0x30,0x01, 0x0c,0x2f,0x00,0x82,0x0c,0x30,0x01,0x83,0x0c,0x2f,0x01,0x02,0x0c,0x2e,0x01, 0x0c,0x2f,0x01,0x82,0x0b,0x2e,0x01,0x01,0x0b,0x2d,0x01,0x82,0x0c,0x2d,0x01, 0x82,0x0b,0x2d,0x01,0x01,0x0c,0x2c,0x01,0x82,0x0b,0x2d,0x01,0x82,0x0b,0x2c, 0x01,0x04,0x0b,0x2b,0x01,0x0b,0x2a,0x00,0x0b,0x2b,0x00,0x0b,0x2a,0x00,0x82, 0x0b,0x2a,0x01,0x03,0x0b,0x29,0x01,0x0b,0x29,0x00,0x0b,0x28,0x00,0x82,0x0b, 0x28,0x01,0x0d,0x0a,0x27,0x01,0x0b,0x27,0x00,0x0b,0x28,0x01,0x0a,0x27,0x00, 0x0a,0x26,0x00,0x0a,0x26,0x01,0x09,0x25,0x01,0x0a,0x25,0x01,0x0a,0x26,0x01, 0x0a,0x25,0x00,0x09,0x25,0x00,0x0a,0x24,0x00,0x09,0x24,0x01,0x82,0x09,0x23, 0x00,0x02,0x09,0x23,0x01,0x08,0x22,0x00,0x82,0x09,0x23,0x01,0x01,0x08,0x22, 0x00,0x82,0x09,0x22,0x01,0x86,0x08,0x21,0x00,0x02,0x08,0x20,0x00,0x08,0x20, 0x01,0x82,0x08,0x1f,0x00,0x84,0x07,0x1e,0x00,0x83,0x07,0x1d,0x00,0x02,0x07, 0x1c,0x00,0x07,0x1b,0x00,0x82,0x07,0x1c,0x00,0x01,0x07,0x1b,0x00,0x82,0x06, 0x1b,0x00,0x02,0x07,0x1a,0x00,0x06,0x1a,0x00,0x83,0x06,0x19,0x00,0x83,0x06, 0x18,0x00,0x82,0x05,0x17,0x00,0x87,0x05,0x16,0x00,0x02,0x05,0x15,0x00,0x05, 0x16,0x00,0x82,0x04,0x15,0x00,0x82,0x04,0x14,0x00,0x02,0x05,0x14,0x00,0x04, 0x14,0x00,0x83,0x04,0x13,0x00,0x82,0x04,0x12,0x00,0x82,0x03,0x11,0x00,0x01, 0x04,0x11,0x00,0x85,0x03,0x10,0x00,0x83,0x03,0x0f,0x00,0x82,0x03,0x0e,0x00, 0x84,0x02,0x0d,0x00,0x84,0x02,0x0c,0x00,0x88,0x02,0x0b,0x00,0x83,0x01,0x0a, 0x00,0x84,0x01,0x09,0x00,0x84,0x01,0x08,0x00,0x82,0x01,0x07,0x00,0x01,0x00, 0x07,0x00,0x84,0x00,0x06,0x00,0x83,0x00,0x05,0x00,0x84,0x00,0x04,0x00,0x84, 0x00,0x03,0x00,0x83,0x00,0x02,0x00,0x84,0x00,0x01,0x00,0xde,0x00,0x00,0x00, 0x12,0x35,0x8d,0x19,0x35,0x8d,0x17,0x3a,0x90,0x18,0x35,0x8a,0x15,0x33,0x89, 0x15,0x37,0x8c,0x19,0x38,0x8d,0x18,0x34,0x8a,0x14,0x33,0x89,0x15,0x37,0x8c, 0x19,0x36,0x8b,0x18,0x35,0x8a,0x17,0x32,0x87,0x14,0x34,0x8a,0x16,0x36,0x8b, 0x18,0x32,0x87,0x13,0x32,0x86,0x14,0x35,0x8a,0x18,0x82,0x33,0x8a,0x18,0x82, 0x32,0x86,0x14,0x05,0x35,0x8a,0x18,0x32,0x89,0x16,0x32,0x8a,0x16,0x33,0x8b, 0x17,0x32,0x8a,0x15,0x85,0x32,0x88,0x15,0x06,0x33,0x89,0x15,0x32,0x88,0x15, 0x34,0x8a,0x16,0x32,0x87,0x14,0x33,0x89,0x15,0x32,0x87,0x14,0x82,0x33,0x89, 0x15,0x0a,0x31,0x89,0x14,0x32,0x88,0x14,0x32,0x88,0x15,0x33,0x89,0x16,0x30, 0x88,0x13,0x32,0x8a,0x15,0x34,0x8a,0x16,0x33,0x89,0x15,0x32,0x88,0x14,0x36, 0x8b,0x18,0x82,0x31,0x89,0x14,0x08,0x32,0x8a,0x16,0x32,0x8a,0x15,0x33,0x89, 0x15,0x32,0x88,0x14,0x32,0x8a,0x15,0x31,0x89,0x14,0x32,0x88,0x14,0x34,0x8a, 0x16,0x82,0x32,0x88,0x14,0x02,0x32,0x8a,0x15,0x30,0x87,0x14,0x82,0x30,0x88, 0x13,0x05,0x31,0x89,0x14,0x30,0x88,0x13,0x31,0x89,0x14,0x32,0x8a,0x15,0x31, 0x89,0x14,0x82,0x32,0x8a,0x15,0x21,0x31,0x89,0x14,0x32,0x8a,0x16,0x30,0x88, 0x13,0x31,0x89,0x14,0x33,0x8b,0x17,0x32,0x8a,0x15,0x33,0x8b,0x15,0x32,0x8a, 0x16,0x31,0x89,0x14,0x32,0x8a,0x15,0x33,0x8b,0x17,0x32,0x8a,0x16,0x32,0x8a, 0x13,0x36,0x8b,0x16,0x32,0x8a,0x14,0x33,0x8b,0x17,0x35,0x8d,0x19,0x32,0x8a, 0x13,0x34,0x8c,0x16,0x32,0x8a,0x14,0x34,0x8c,0x16,0x33,0x8b,0x15,0x32,0x8a, 0x13,0x34,0x8c,0x16,0x33,0x8b,0x15,0x32,0x8a,0x14,0x33,0x8b,0x15,0x34,0x8c, 0x16,0x33,0x8b,0x15,0x32,0x8a,0x13,0x33,0x8b,0x15,0x35,0x8d,0x15,0x35,0x8d, 0x17,0x82,0x34,0x8c,0x16,0x82,0x34,0x8c,0x14,0x03,0x34,0x8e,0x17,0x33,0x8d, 0x16,0x34,0x8c,0x16,0x82,0x35,0x8d,0x17,0x01,0x36,0x8e,0x18,0x82,0x36,0x8e, 0x16,0x07,0x35,0x8d,0x15,0x36,0x8e,0x18,0x35,0x8f,0x16,0x34,0x8e,0x15,0x35, 0x8f,0x16,0x33,0x8d,0x14,0x36,0x90,0x17,0x82,0x35,0x8f,0x16,0x02,0x34,0x8e, 0x15,0x35,0x92,0x18,0x82,0x37,0x91,0x16,0x08,0x36,0x90,0x15,0x36,0x93,0x16, 0x38,0x95,0x19,0x36,0x93,0x17,0x37,0x91,0x16,0x36,0x90,0x15,0x36,0x93,0x16, 0x38,0x95,0x18,0x82,0x3a,0x95,0x18,0x82,0x37,0x94,0x17,0x04,0x38,0x93,0x16, 0x3a,0x95,0x16,0x3c,0x96,0x18,0x3b,0x96,0x17,0x82,0x39,0x96,0x17,0x01,0x3a, 0x98,0x19,0x82,0x39,0x97,0x18,0x05,0x3b,0x9a,0x18,0x3d,0x9a,0x19,0x3b,0x98, 0x17,0x3c,0x99,0x18,0x3d,0x9a,0x19,0x82,0x3b,0x9a,0x18,0x02,0x3c,0x9b,0x19, 0x3c,0x99,0x18,0x82,0x3b,0x9a,0x18,0x01,0x3c,0x9b,0x19,0x82,0x3e,0x9b,0x19, 0x08,0x3c,0x9b,0x19,0x3d,0x9c,0x19,0x3e,0x9b,0x18,0x3c,0x9b,0x17,0x3b,0x9a, 0x18,0x3d,0x9a,0x19,0x3d,0x9a,0x17,0x3e,0x9e,0x19,0x82,0x3d,0x9c,0x18,0x08, 0x3c,0x9b,0x17,0x3e,0x9e,0x19,0x3d,0x9a,0x17,0x3f,0x9d,0x19,0x3e,0x9d,0x19, 0x3d,0x9c,0x18,0x3e,0x9d,0x19,0x3e,0x9c,0x19,0x82,0x3e,0x9e,0x19,0x82,0x3e, 0x9d,0x19,0x83,0x3e,0x9e,0x19,0x02,0x3f,0x9f,0x1a,0x3f,0x9f,0x19,0x82,0x3f, 0x9f,0x1a,0x82,0x3e,0x9e,0x19,0x03,0x40,0xa0,0x1a,0x3f,0x9f,0x19,0x3e,0xa0, 0x19,0x82,0x3f,0x9f,0x19,0x83,0x3e,0x9e,0x19,0x03,0x40,0x9e,0x1a,0x41,0xa0, 0x1a,0x40,0x9f,0x19,0x82,0x3f,0x9f,0x19,0x01,0x3f,0x9f,0x1a,0x84,0x3e,0x9e, 0x19,0x14,0x3f,0x9f,0x1a,0x40,0xa0,0x1a,0x41,0xa1,0x1b,0x40,0xa0,0x1a,0x42, 0xa2,0x1c,0x42,0xa3,0x1a,0x40,0xa1,0x19,0x41,0xa2,0x19,0x44,0xa4,0x1c,0x42, 0xa4,0x19,0x43,0xa5,0x1a,0x42,0xa4,0x19,0x41,0xa3,0x19,0x42,0xa4,0x19,0x43, 0xa5,0x1a,0x42,0xa4,0x19,0x44,0xa6,0x19,0x45,0xa6,0x19,0x42,0xa4,0x19,0x43, 0xa5,0x1a,0x84,0x44,0xa6,0x19,0x06,0x46,0xa7,0x1a,0x44,0xa4,0x1a,0x45,0xa6, 0x19,0x45,0xa7,0x1a,0x45,0xa6,0x19,0x43,0xa3,0x19,0x82,0x44,0xa4,0x1a,0x0a, 0x45,0xa5,0x1b,0x43,0xa3,0x1b,0x47,0xa7,0x1d,0x43,0xa3,0x1b,0x44,0xa4,0x1a, 0x46,0xa6,0x1c,0x44,0xa4,0x1c,0x44,0xa4,0x1a,0x46,0xa6,0x1c,0x46,0xa8,0x1d, 0x82,0x47,0xa7,0x1d,0x01,0x45,0xa5,0x1d,0x82,0x43,0xa3,0x1b,0x03,0x48,0xa6, 0x1f,0x47,0xa5,0x1e,0x43,0xa2,0x1c,0x83,0x45,0xa3,0x1e,0x04,0x46,0xa4,0x1f, 0x45,0xa3,0x1e,0x46,0xa4,0x1f,0x48,0xa3,0x1f,0x82,0x45,0xa3,0x1f,0x01,0x44, 0xa3,0x1d,0x82,0x45,0xa3,0x1f,0x82,0x47,0xa3,0x1f,0x04,0x44,0x9f,0x1e,0x45, 0xa1,0x1c,0x47,0xa3,0x1f,0x41,0x9f,0x1b,0x82,0x46,0xa2,0x1e,0x09,0x46,0xa0, 0x1d,0x48,0xa3,0x20,0x44,0xa0,0x1c,0x45,0xa3,0x1f,0x45,0xa1,0x1c,0x46,0xa2, 0x1d,0x46,0xa2,0x1e,0x45,0xa1,0x1d,0x44,0xa0,0x1c,0x83,0x45,0xa1,0x1d,0x83, 0x44,0xa0,0x1c,0x21,0x43,0x9f,0x1b,0x41,0x9d,0x19,0x40,0x9c,0x18,0x3f,0x9a, 0x17,0x3e,0x98,0x15,0x41,0x99,0x18,0x3e,0x97,0x16,0x3f,0x98,0x17,0x3e,0x96, 0x16,0x3e,0x96,0x17,0x3d,0x94,0x17,0x3c,0x93,0x16,0x3a,0x91,0x14,0x39,0x8f, 0x16,0x3a,0x90,0x17,0x37,0x8d,0x14,0x37,0x8c,0x14,0x38,0x8a,0x14,0x36,0x89, 0x13,0x36,0x88,0x12,0x34,0x86,0x11,0x35,0x87,0x13,0x35,0x85,0x14,0x33,0x83, 0x12,0x32,0x82,0x11,0x2e,0x7d,0x0e,0x27,0x74,0x0a,0x23,0x6f,0x05,0x22,0x6e, 0x06,0x23,0x6e,0x07,0x22,0x6e,0x07,0x22,0x6d,0x09,0x20,0x6a,0x07,0x82,0x1f, 0x6b,0x07,0x04,0x1e,0x69,0x08,0x1f,0x68,0x06,0x1f,0x66,0x04,0x1d,0x66,0x04, 0x82,0x1e,0x66,0x05,0x02,0x1c,0x64,0x05,0x1b,0x64,0x06,0x82,0x1b,0x63,0x04, 0x05,0x19,0x61,0x02,0x1a,0x5f,0x03,0x19,0x61,0x04,0x19,0x60,0x04,0x19,0x5f, 0x03,0x82,0x18,0x5e,0x02,0x09,0x18,0x5c,0x02,0x19,0x5d,0x03,0x17,0x5d,0x02, 0x17,0x5c,0x01,0x19,0x5c,0x03,0x16,0x5b,0x01,0x15,0x59,0x01,0x18,0x5a,0x02, 0x15,0x58,0x01,0x82,0x18,0x59,0x02,0x06,0x18,0x58,0x01,0x16,0x59,0x01,0x17, 0x5a,0x03,0x17,0x59,0x02,0x16,0x59,0x02,0x16,0x58,0x01,0x83,0x15,0x57,0x01, 0x83,0x16,0x57,0x02,0x01,0x17,0x56,0x01,0x82,0x16,0x57,0x02,0x0c,0x17,0x54, 0x01,0x16,0x56,0x03,0x16,0x56,0x02,0x15,0x57,0x00,0x15,0x55,0x00,0x16,0x56, 0x01,0x14,0x56,0x00,0x15,0x55,0x00,0x16,0x55,0x01,0x16,0x56,0x02,0x14,0x55, 0x00,0x16,0x54,0x01,0x82,0x15,0x53,0x00,0x82,0x15,0x53,0x02,0x08,0x14,0x53, 0x02,0x14,0x52,0x02,0x14,0x51,0x02,0x13,0x51,0x02,0x14,0x52,0x02,0x15,0x51, 0x02,0x15,0x53,0x02,0x14,0x51,0x01,0x82,0x15,0x52,0x01,0x82,0x14,0x51,0x01, 0x82,0x15,0x50,0x01,0x08,0x13,0x4f,0x01,0x14,0x50,0x01,0x15,0x4f,0x01,0x13, 0x4e,0x01,0x15,0x4e,0x01,0x14,0x50,0x02,0x15,0x4e,0x02,0x14,0x4f,0x02,0x82, 0x14,0x4e,0x02,0x1f,0x14,0x4e,0x01,0x14,0x4e,0x02,0x13,0x4d,0x01,0x12,0x4c, 0x01,0x13,0x4c,0x01,0x13,0x4b,0x01,0x14,0x4d,0x01,0x14,0x4c,0x02,0x13,0x4b, 0x02,0x14,0x4c,0x03,0x13,0x4a,0x03,0x13,0x4a,0x01,0x12,0x4b,0x00,0x12,0x49, 0x01,0x14,0x4a,0x01,0x12,0x4b,0x02,0x11,0x4a,0x01,0x12,0x49,0x01,0x13,0x49, 0x02,0x12,0x47,0x00,0x14,0x47,0x01,0x12,0x48,0x01,0x12,0x49,0x00,0x12,0x47, 0x01,0x11,0x47,0x01,0x13,0x48,0x01,0x11,0x46,0x01,0x11,0x45,0x00,0x12,0x46, 0x00,0x12,0x46,0x02,0x12,0x45,0x00,0x82,0x12,0x45,0x02,0x04,0x12,0x45,0x01, 0x11,0x45,0x00,0x12,0x45,0x01,0x12,0x46,0x02,0x82,0x12,0x44,0x01,0x05,0x12, 0x44,0x02,0x11,0x43,0x01,0x11,0x43,0x02,0x10,0x42,0x01,0x11,0x42,0x01,0x82, 0x11,0x42,0x02,0x05,0x11,0x41,0x01,0x10,0x41,0x01,0x10,0x40,0x01,0x10,0x40, 0x00,0x11,0x40,0x01,0x82,0x10,0x3f,0x01,0x82,0x10,0x3f,0x02,0x09,0x10,0x3f, 0x01,0x10,0x3e,0x00,0x10,0x3e,0x02,0x11,0x3e,0x01,0x10,0x3e,0x01,0x10,0x3e, 0x02,0x0f,0x3d,0x00,0x10,0x3e,0x02,0x10,0x3d,0x02,0x82,0x0f,0x3c,0x00,0x82, 0x0f,0x3c,0x01,0x06,0x0f,0x3c,0x02,0x0f,0x3a,0x01,0x0f,0x3b,0x02,0x0f,0x3b, 0x01,0x10,0x3b,0x01,0x0f,0x3b,0x02,0x82,0x0f,0x3a,0x02,0x82,0x0e,0x39,0x01, 0x05,0x0e,0x38,0x01,0x0f,0x39,0x02,0x0f,0x38,0x01,0x0e,0x38,0x01,0x0f,0x38, 0x02,0x82,0x0e,0x37,0x01,0x0f,0x0f,0x37,0x02,0x0e,0x36,0x01,0x0d,0x36,0x01, 0x0e,0x36,0x01,0x0d,0x34,0x00,0x0d,0x34,0x01,0x0d,0x35,0x01,0x0d,0x35,0x02, 0x0d,0x34,0x01,0x0e,0x32,0x01,0x0d,0x34,0x01,0x0d,0x32,0x01,0x0d,0x33,0x01, 0x0d,0x32,0x01,0x0e,0x32,0x01,0x83,0x0c,0x32,0x01,0x84,0x0c,0x31,0x01,0x82, 0x0c,0x30,0x01,0x05,0x0c,0x2f,0x01,0x0c,0x30,0x01,0x0c,0x2f,0x01,0x0c,0x2f, 0x00,0x0c,0x2f,0x01,0x82,0x0c,0x2e,0x01,0x84,0x0c,0x2d,0x01,0x09,0x0c,0x2c, 0x01,0x0c,0x2b,0x01,0x0b,0x2b,0x00,0x0c,0x2b,0x00,0x0b,0x2b,0x01,0x0a,0x2b, 0x01,0x0b,0x2a,0x01,0x0b,0x2a,0x00,0x0b,0x2a,0x01,0x82,0x0b,0x2a,0x00,0x82, 0x0b,0x29,0x00,0x05,0x0b,0x28,0x01,0x0b,0x29,0x01,0x0b,0x28,0x01,0x0a,0x28, 0x00,0x0a,0x27,0x01,0x82,0x0a,0x26,0x01,0x82,0x0a,0x26,0x00,0x83,0x0a,0x26, 0x01,0x01,0x09,0x25,0x00,0x82,0x0a,0x25,0x00,0x03,0x09,0x25,0x00,0x0a,0x25, 0x00,0x09,0x24,0x01,0x83,0x09,0x23,0x00,0x01,0x08,0x22,0x00,0x83,0x09,0x22, 0x00,0x03,0x09,0x21,0x00,0x09,0x21,0x01,0x08,0x21,0x00,0x83,0x08,0x20,0x00, 0x82,0x08,0x20,0x01,0x03,0x08,0x1f,0x00,0x07,0x1f,0x00,0x08,0x1e,0x00,0x82, 0x07,0x1e,0x00,0x82,0x07,0x1d,0x00,0x84,0x07,0x1c,0x00,0x01,0x07,0x1b,0x00, 0x84,0x06,0x1b,0x00,0x01,0x06,0x1a,0x00,0x86,0x06,0x19,0x00,0x82,0x05,0x18, 0x00,0x02,0x06,0x18,0x00,0x05,0x18,0x00,0x82,0x05,0x17,0x00,0x83,0x05,0x16, 0x00,0x02,0x05,0x15,0x00,0x05,0x16,0x00,0x82,0x04,0x15,0x00,0x01,0x05,0x14, 0x00,0x82,0x04,0x14,0x00,0x83,0x04,0x13,0x00,0x01,0x03,0x12,0x00,0x83,0x04, 0x12,0x00,0x82,0x03,0x11,0x00,0x01,0x04,0x11,0x00,0x83,0x03,0x10,0x00,0x83, 0x03,0x0f,0x00,0x02,0x03,0x0e,0x00,0x03,0x0f,0x00,0x82,0x03,0x0e,0x00,0x83, 0x02,0x0d,0x00,0x88,0x02,0x0c,0x00,0x82,0x02,0x0b,0x00,0x02,0x01,0x0b,0x00, 0x02,0x0b,0x00,0x84,0x01,0x0a,0x00,0x83,0x01,0x09,0x00,0x84,0x01,0x08,0x00, 0x01,0x01,0x07,0x00,0x83,0x00,0x07,0x00,0x83,0x00,0x06,0x00,0x83,0x00,0x05, 0x00,0x84,0x00,0x04,0x00,0x83,0x00,0x03,0x00,0x84,0x00,0x02,0x00,0x84,0x00, 0x01,0x00,0xde,0x00,0x00,0x00,0x05,0x34,0x89,0x1a,0x36,0x8b,0x1a,0x33,0x89, 0x15,0x31,0x86,0x15,0x34,0x89,0x18,0x82,0x33,0x88,0x17,0x09,0x32,0x87,0x16, 0x33,0x89,0x15,0x34,0x89,0x18,0x33,0x88,0x17,0x36,0x8b,0x18,0x31,0x86,0x15, 0x35,0x8a,0x19,0x31,0x87,0x13,0x34,0x89,0x18,0x82,0x32,0x87,0x16,0x06,0x31, 0x86,0x15,0x33,0x88,0x17,0x34,0x8a,0x16,0x33,0x87,0x14,0x34,0x89,0x18,0x31, 0x86,0x17,0x82,0x32,0x87,0x16,0x0e,0x30,0x85,0x14,0x31,0x86,0x15,0x33,0x88, 0x17,0x32,0x88,0x14,0x31,0x87,0x13,0x30,0x86,0x12,0x31,0x87,0x13,0x33,0x89, 0x15,0x33,0x88,0x17,0x31,0x87,0x13,0x33,0x88,0x17,0x32,0x88,0x14,0x31,0x86, 0x15,0x31,0x87,0x13,0x82,0x33,0x89,0x15,0x04,0x30,0x88,0x16,0x33,0x88,0x17, 0x32,0x88,0x14,0x32,0x86,0x13,0x83,0x31,0x87,0x13,0x04,0x33,0x89,0x15,0x34, 0x8a,0x16,0x31,0x87,0x13,0x30,0x86,0x12,0x82,0x32,0x88,0x14,0x82,0x31,0x87, 0x13,0x03,0x32,0x88,0x14,0x30,0x86,0x12,0x31,0x87,0x13,0x82,0x32,0x88,0x14, 0x07,0x31,0x87,0x13,0x31,0x86,0x15,0x31,0x89,0x15,0x2f,0x87,0x13,0x30,0x88, 0x14,0x2f,0x87,0x13,0x30,0x88,0x14,0x82,0x2f,0x87,0x13,0x07,0x31,0x89,0x15, 0x2e,0x86,0x12,0x2f,0x87,0x13,0x2e,0x86,0x12,0x30,0x85,0x14,0x31,0x86,0x15, 0x31,0x87,0x13,0x82,0x33,0x87,0x14,0x01,0x2f,0x87,0x13,0x82,0x31,0x87,0x13, 0x0d,0x30,0x88,0x14,0x2f,0x87,0x13,0x32,0x88,0x14,0x31,0x87,0x12,0x2f,0x85, 0x10,0x30,0x88,0x14,0x31,0x89,0x15,0x2f,0x87,0x13,0x31,0x89,0x15,0x2f,0x87, 0x13,0x32,0x8b,0x15,0x34,0x8a,0x15,0x33,0x89,0x14,0x83,0x31,0x8a,0x14,0x01, 0x32,0x8b,0x15,0x82,0x33,0x8b,0x16,0x0a,0x32,0x8b,0x15,0x33,0x8b,0x16,0x31, 0x89,0x15,0x32,0x8b,0x15,0x33,0x8b,0x14,0x35,0x8d,0x16,0x34,0x8c,0x17,0x33, 0x8b,0x17,0x33,0x8c,0x17,0x35,0x8f,0x17,0x82,0x33,0x8b,0x16,0x06,0x32,0x8b, 0x15,0x33,0x8b,0x16,0x34,0x8c,0x15,0x34,0x8e,0x16,0x31,0x8b,0x13,0x32,0x8b, 0x16,0x82,0x34,0x8c,0x15,0x02,0x34,0x8e,0x16,0x32,0x8c,0x14,0x82,0x35,0x8f, 0x15,0x0d,0x34,0x8e,0x14,0x33,0x8d,0x13,0x32,0x8c,0x14,0x33,0x8d,0x13,0x36, 0x90,0x16,0x37,0x91,0x17,0x37,0x91,0x15,0x35,0x8f,0x13,0x34,0x8e,0x14,0x34, 0x91,0x16,0x37,0x91,0x17,0x37,0x91,0x15,0x37,0x92,0x16,0x82,0x37,0x91,0x15, 0x01,0x35,0x8f,0x13,0x82,0x37,0x91,0x15,0x07,0x38,0x94,0x16,0x39,0x95,0x17, 0x38,0x94,0x16,0x37,0x92,0x14,0x38,0x97,0x16,0x39,0x98,0x17,0x38,0x98,0x17, 0x82,0x39,0x98,0x17,0x84,0x3a,0x98,0x18,0x05,0x39,0x98,0x15,0x3a,0x98,0x16, 0x39,0x98,0x15,0x39,0x99,0x16,0x3b,0x9b,0x18,0x82,0x3a,0x9a,0x17,0x02,0x3b, 0x9b,0x18,0x3b,0x99,0x17,0x82,0x3b,0x9b,0x18,0x03,0x3a,0x9a,0x17,0x3a,0x9c, 0x18,0x38,0x9a,0x16,0x82,0x3c,0x9a,0x18,0x03,0x3d,0x9d,0x18,0x3c,0x9c,0x17, 0x3d,0x9b,0x19,0x82,0x3c,0x9c,0x17,0x07,0x3c,0x9c,0x19,0x3c,0x9c,0x17,0x3b, 0x9b,0x16,0x3d,0x9d,0x18,0x3c,0x9c,0x17,0x3b,0x9b,0x16,0x3d,0x9d,0x18,0x82, 0x3c,0x9c,0x17,0x01,0x3f,0x9f,0x1a,0x82,0x3e,0x9e,0x19,0x01,0x3f,0x9f,0x1a, 0x83,0x3e,0x9e,0x19,0x0b,0x3f,0x9f,0x1a,0x3e,0x9e,0x19,0x3e,0x9e,0x18,0x40, 0xa0,0x1a,0x3f,0x9f,0x19,0x3e,0x9e,0x18,0x3d,0x9d,0x17,0x40,0xa0,0x1a,0x41, 0xa1,0x1b,0x3f,0x9f,0x1a,0x3e,0x9e,0x19,0x83,0x3f,0x9f,0x19,0x09,0x41,0xa2, 0x19,0x3f,0x9f,0x19,0x3e,0x9e,0x18,0x3f,0x9f,0x19,0x41,0xa1,0x1b,0x40,0xa0, 0x1a,0x41,0xa1,0x1b,0x40,0xa0,0x1a,0x40,0xa2,0x1b,0x83,0x40,0xa0,0x1a,0x01, 0x42,0xa3,0x1a,0x82,0x41,0xa2,0x19,0x01,0x42,0xa3,0x1a,0x84,0x41,0xa4,0x18, 0x01,0x42,0xa5,0x19,0x82,0x44,0xa6,0x1b,0x82,0x45,0xa7,0x1a,0x04,0x43,0xa4, 0x19,0x43,0xa6,0x1a,0x44,0xa6,0x19,0x45,0xa7,0x1a,0x82,0x44,0xa6,0x19,0x05, 0x45,0xa6,0x19,0x43,0xa6,0x1a,0x45,0xa6,0x19,0x46,0xa8,0x1b,0x45,0xa7,0x1a, 0x82,0x45,0xa6,0x1b,0x0d,0x44,0xa5,0x1a,0x45,0xa6,0x1b,0x45,0xa7,0x1b,0x44, 0xa5,0x1b,0x43,0xa4,0x19,0x43,0xa4,0x1b,0x45,0xa6,0x1b,0x46,0xa7,0x1c,0x44, 0xa5,0x1a,0x46,0xa7,0x1c,0x48,0xab,0x1d,0x46,0xa7,0x1c,0x47,0xa8,0x1d,0x82, 0x45,0xa6,0x1d,0x1b,0x46,0xa7,0x1e,0x44,0xa5,0x1b,0x45,0xa4,0x1b,0x44,0xa3, 0x1b,0x45,0xa4,0x1b,0x45,0xa5,0x1c,0x45,0xa4,0x1b,0x46,0xa6,0x1d,0x45,0xa5, 0x1e,0x46,0xa3,0x1d,0x47,0xa4,0x1f,0x45,0xa3,0x1e,0x45,0xa5,0x1e,0x47,0xa6, 0x20,0x46,0xa5,0x20,0x44,0xa2,0x1d,0x45,0xa4,0x1d,0x45,0xa3,0x1e,0x45,0xa3, 0x20,0x45,0xa5,0x1e,0x45,0xa1,0x1c,0x47,0xa4,0x1f,0x45,0xa2,0x1d,0x44,0xa0, 0x1b,0x45,0xa2,0x1d,0x45,0xa1,0x1c,0x46,0xa1,0x1d,0x82,0x46,0xa3,0x1d,0x01, 0x47,0xa4,0x1e,0x83,0x45,0xa1,0x1c,0x04,0x46,0xa3,0x1d,0x44,0xa2,0x1d,0x46, 0xa3,0x1d,0x45,0xa2,0x1c,0x82,0x45,0xa1,0x1b,0x21,0x46,0xa3,0x1d,0x43,0x9f, 0x1a,0x41,0x9d,0x19,0x41,0x9c,0x19,0x3f,0x9a,0x16,0x3f,0x99,0x16,0x3f,0x9a, 0x17,0x3e,0x99,0x16,0x3d,0x98,0x15,0x3c,0x97,0x15,0x3e,0x98,0x17,0x3c,0x94, 0x14,0x3c,0x95,0x15,0x3b,0x93,0x16,0x39,0x90,0x16,0x39,0x8f,0x16,0x3a,0x90, 0x16,0x39,0x8f,0x17,0x3a,0x8c,0x16,0x38,0x8b,0x15,0x37,0x8b,0x14,0x36,0x88, 0x13,0x33,0x85,0x12,0x34,0x86,0x11,0x34,0x83,0x10,0x34,0x83,0x12,0x34,0x83, 0x14,0x2c,0x7b,0x0e,0x25,0x73,0x09,0x23,0x6f,0x06,0x22,0x6f,0x07,0x23,0x6f, 0x0a,0x22,0x6d,0x09,0x82,0x20,0x6d,0x08,0x08,0x20,0x6c,0x06,0x1f,0x69,0x06, 0x20,0x68,0x05,0x21,0x69,0x06,0x1f,0x68,0x06,0x1e,0x67,0x05,0x1d,0x66,0x06, 0x1b,0x64,0x04,0x82,0x1b,0x63,0x04,0x82,0x1b,0x62,0x03,0x02,0x1b,0x61,0x05, 0x1a,0x61,0x04,0x82,0x19,0x60,0x03,0x03,0x19,0x5f,0x03,0x18,0x5f,0x03,0x18, 0x5c,0x01,0x82,0x17,0x5d,0x01,0x09,0x18,0x5b,0x01,0x17,0x5a,0x00,0x16,0x5b, 0x02,0x17,0x5a,0x01,0x16,0x5a,0x02,0x15,0x59,0x01,0x18,0x5a,0x02,0x18,0x59, 0x02,0x15,0x59,0x00,0x82,0x17,0x5a,0x02,0x02,0x16,0x59,0x01,0x15,0x58,0x00, 0x84,0x15,0x58,0x01,0x0e,0x15,0x57,0x01,0x16,0x58,0x02,0x17,0x56,0x01,0x15, 0x56,0x01,0x18,0x57,0x03,0x16,0x57,0x03,0x17,0x56,0x03,0x15,0x55,0x02,0x18, 0x56,0x02,0x15,0x56,0x00,0x18,0x55,0x01,0x17,0x57,0x02,0x15,0x55,0x00,0x14, 0x54,0x00,0x82,0x14,0x55,0x00,0x0c,0x16,0x55,0x02,0x15,0x53,0x00,0x14,0x54, 0x00,0x15,0x53,0x02,0x15,0x54,0x01,0x14,0x53,0x00,0x15,0x53,0x01,0x14,0x53, 0x01,0x13,0x53,0x00,0x14,0x53,0x01,0x14,0x52,0x02,0x15,0x53,0x02,0x82,0x15, 0x53,0x01,0x03,0x14,0x52,0x01,0x13,0x51,0x00,0x14,0x51,0x01,0x82,0x14,0x50, 0x01,0x0e,0x16,0x51,0x02,0x13,0x50,0x01,0x15,0x50,0x01,0x15,0x51,0x02,0x14, 0x4e,0x00,0x14,0x50,0x00,0x15,0x4f,0x02,0x14,0x4f,0x01,0x14,0x4e,0x00,0x14, 0x4f,0x01,0x14,0x50,0x01,0x15,0x4f,0x01,0x13,0x4c,0x00,0x13,0x4c,0x01,0x82, 0x14,0x4d,0x02,0x0f,0x14,0x4d,0x01,0x14,0x4c,0x01,0x13,0x4c,0x01,0x13,0x4c, 0x02,0x14,0x4b,0x01,0x13,0x4b,0x02,0x11,0x4b,0x01,0x12,0x4a,0x00,0x14,0x4a, 0x01,0x13,0x49,0x01,0x11,0x49,0x00,0x12,0x4a,0x02,0x13,0x49,0x02,0x12,0x47, 0x00,0x11,0x47,0x00,0x82,0x12,0x48,0x01,0x02,0x12,0x47,0x01,0x11,0x47,0x01, 0x83,0x12,0x47,0x02,0x02,0x12,0x46,0x02,0x10,0x46,0x01,0x83,0x12,0x45,0x02, 0x83,0x11,0x45,0x00,0x01,0x11,0x45,0x02,0x82,0x12,0x45,0x01,0x01,0x13,0x45, 0x02,0x82,0x11,0x44,0x01,0x09,0x10,0x43,0x00,0x11,0x43,0x00,0x10,0x42,0x01, 0x11,0x43,0x02,0x11,0x42,0x01,0x10,0x42,0x00,0x11,0x42,0x02,0x11,0x42,0x01, 0x11,0x41,0x01,0x83,0x10,0x40,0x01,0x02,0x10,0x40,0x02,0x10,0x3f,0x00,0x82, 0x10,0x3f,0x02,0x82,0x10,0x3f,0x01,0x04,0x0f,0x3e,0x01,0x0f,0x3d,0x00,0x0f, 0x3e,0x01,0x10,0x3d,0x01,0x82,0x0f,0x3c,0x01,0x82,0x0f,0x3c,0x02,0x03,0x0f, 0x3c,0x01,0x0f,0x3b,0x00,0x0f,0x3b,0x02,0x82,0x0f,0x3b,0x01,0x82,0x0f,0x3a, 0x01,0x01,0x0f,0x3a,0x02,0x82,0x0e,0x39,0x00,0x07,0x0e,0x39,0x02,0x0e,0x37, 0x01,0x0f,0x39,0x01,0x0f,0x38,0x01,0x0f,0x37,0x02,0x0e,0x37,0x01,0x0f,0x37, 0x02,0x82,0x0e,0x37,0x01,0x01,0x0e,0x36,0x01,0x82,0x0e,0x37,0x02,0x02,0x0d, 0x37,0x02,0x0d,0x36,0x01,0x82,0x0d,0x35,0x01,0x83,0x0d,0x34,0x01,0x03,0x0d, 0x34,0x02,0x0e,0x34,0x02,0x0e,0x32,0x01,0x82,0x0d,0x33,0x01,0x82,0x0d,0x32, 0x01,0x82,0x0d,0x31,0x01,0x01,0x0d,0x30,0x00,0x82,0x0d,0x30,0x01,0x08,0x0c, 0x2f,0x00,0x0d,0x30,0x01,0x0d,0x2f,0x01,0x0c,0x2f,0x00,0x0c,0x2f,0x01,0x0c, 0x2d,0x00,0x0c,0x2e,0x01,0x0d,0x2e,0x01,0x82,0x0c,0x2d,0x01,0x0b,0x0c,0x2c, 0x01,0x0b,0x2d,0x01,0x0b,0x2c,0x01,0x0b,0x2b,0x00,0x0b,0x2c,0x00,0x0c,0x2b, 0x00,0x0b,0x2b,0x01,0x0b,0x2a,0x01,0x0b,0x2a,0x00,0x0b,0x2a,0x01,0x0b,0x2a, 0x00,0x82,0x0b,0x29,0x00,0x06,0x0b,0x29,0x01,0x0a,0x29,0x01,0x0a,0x29,0x00, 0x0a,0x28,0x00,0x0b,0x28,0x01,0x0a,0x28,0x01,0x84,0x0a,0x27,0x01,0x01,0x09, 0x27,0x00,0x84,0x0a,0x26,0x01,0x02,0x0a,0x25,0x01,0x09,0x25,0x00,0x82,0x09, 0x24,0x00,0x01,0x09,0x24,0x01,0x82,0x09,0x24,0x00,0x82,0x09,0x23,0x01,0x82, 0x09,0x22,0x00,0x03,0x08,0x21,0x00,0x09,0x21,0x01,0x08,0x21,0x00,0x82,0x08, 0x20,0x00,0x01,0x09,0x20,0x00,0x84,0x08,0x1f,0x00,0x01,0x08,0x1e,0x00,0x82, 0x07,0x1e,0x00,0x02,0x08,0x1d,0x00,0x07,0x1d,0x00,0x82,0x07,0x1c,0x00,0x02, 0x06,0x1c,0x00,0x07,0x1c,0x00,0x83,0x07,0x1b,0x00,0x82,0x06,0x1b,0x00,0x03, 0x07,0x1b,0x00,0x06,0x1b,0x00,0x06,0x1a,0x00,0x82,0x06,0x19,0x00,0x02,0x06, 0x1a,0x00,0x05,0x19,0x00,0x82,0x05,0x18,0x00,0x02,0x06,0x18,0x00,0x05,0x18, 0x00,0x82,0x05,0x17,0x00,0x01,0x06,0x17,0x00,0x83,0x05,0x16,0x00,0x01,0x05, 0x15,0x00,0x82,0x04,0x15,0x00,0x02,0x05,0x14,0x00,0x04,0x14,0x00,0x82,0x04, 0x13,0x00,0x01,0x04,0x14,0x00,0x82,0x04,0x13,0x00,0x84,0x04,0x12,0x00,0x83, 0x04,0x11,0x00,0x82,0x04,0x10,0x00,0x01,0x03,0x10,0x00,0x82,0x03,0x0f,0x00, 0x02,0x03,0x0e,0x00,0x02,0x0e,0x00,0x82,0x03,0x0e,0x00,0x87,0x02,0x0d,0x00, 0x84,0x02,0x0c,0x00,0x82,0x02,0x0b,0x00,0x02,0x01,0x0b,0x00,0x02,0x0b,0x00, 0x84,0x01,0x0a,0x00,0x82,0x01,0x09,0x00,0x84,0x01,0x08,0x00,0x82,0x01,0x07, 0x00,0x82,0x00,0x07,0x00,0x84,0x00,0x06,0x00,0x83,0x00,0x05,0x00,0x84,0x00, 0x04,0x00,0x83,0x00,0x03,0x00,0x84,0x00,0x02,0x00,0x84,0x00,0x01,0x00,0xde, 0x00,0x00,0x00,0x0c,0x31,0x87,0x17,0x32,0x88,0x18,0x33,0x89,0x19,0x33,0x87, 0x18,0x34,0x88,0x17,0x36,0x8b,0x17,0x35,0x89,0x18,0x32,0x86,0x19,0x32,0x88, 0x18,0x31,0x87,0x15,0x33,0x89,0x19,0x31,0x87,0x17,0x82,0x31,0x87,0x15,0x0c, 0x33,0x89,0x19,0x32,0x88,0x16,0x33,0x89,0x17,0x31,0x87,0x15,0x32,0x86,0x15, 0x31,0x87,0x15,0x33,0x89,0x17,0x30,0x86,0x14,0x32,0x88,0x16,0x33,0x87,0x16, 0x32,0x86,0x15,0x31,0x87,0x15,0x82,0x32,0x88,0x16,0x82,0x33,0x87,0x16,0x09, 0x33,0x89,0x17,0x31,0x87,0x15,0x30,0x86,0x14,0x32,0x88,0x16,0x2f,0x85,0x15, 0x31,0x87,0x15,0x31,0x87,0x17,0x30,0x86,0x14,0x32,0x88,0x16,0x82,0x31,0x87, 0x15,0x83,0x32,0x88,0x16,0x03,0x30,0x86,0x14,0x31,0x87,0x15,0x32,0x88,0x16, 0x86,0x31,0x87,0x15,0x10,0x32,0x88,0x16,0x31,0x87,0x15,0x2f,0x86,0x11,0x32, 0x86,0x15,0x32,0x88,0x16,0x30,0x86,0x14,0x2f,0x85,0x13,0x32,0x88,0x16,0x31, 0x87,0x15,0x2f,0x85,0x13,0x32,0x86,0x15,0x30,0x86,0x14,0x31,0x87,0x15,0x32, 0x88,0x16,0x2e,0x83,0x11,0x2f,0x85,0x13,0x82,0x31,0x87,0x15,0x02,0x2f,0x85, 0x13,0x2e,0x86,0x13,0x82,0x30,0x86,0x14,0x01,0x2e,0x84,0x12,0x83,0x2f,0x85, 0x13,0x01,0x2e,0x84,0x12,0x83,0x2f,0x85,0x13,0x82,0x2f,0x88,0x15,0x06,0x31, 0x88,0x13,0x30,0x87,0x12,0x30,0x86,0x14,0x2e,0x87,0x14,0x32,0x88,0x16,0x30, 0x86,0x14,0x82,0x2e,0x87,0x14,0x11,0x2e,0x86,0x13,0x31,0x87,0x15,0x32,0x88, 0x16,0x2e,0x87,0x12,0x2f,0x88,0x13,0x30,0x89,0x14,0x31,0x8a,0x15,0x2f,0x88, 0x13,0x2e,0x87,0x12,0x30,0x89,0x14,0x31,0x87,0x15,0x2f,0x88,0x13,0x31,0x8a, 0x15,0x31,0x8b,0x14,0x31,0x8a,0x15,0x30,0x89,0x14,0x31,0x8a,0x15,0x82,0x30, 0x89,0x14,0x08,0x33,0x89,0x17,0x31,0x88,0x13,0x30,0x8a,0x13,0x2f,0x89,0x12, 0x34,0x8c,0x18,0x32,0x8c,0x17,0x31,0x8c,0x16,0x30,0x8b,0x14,0x82,0x31,0x8b, 0x14,0x82,0x32,0x8c,0x15,0x08,0x32,0x8d,0x14,0x33,0x8e,0x15,0x34,0x8f,0x16, 0x32,0x8d,0x14,0x33,0x8d,0x17,0x32,0x8d,0x14,0x34,0x8f,0x16,0x33,0x8e,0x15, 0x82,0x33,0x8e,0x13,0x02,0x32,0x8d,0x12,0x34,0x8f,0x14,0x82,0x33,0x8e,0x13, 0x05,0x34,0x8f,0x14,0x35,0x90,0x15,0x36,0x91,0x16,0x32,0x90,0x14,0x35,0x93, 0x15,0x82,0x36,0x91,0x14,0x0d,0x37,0x92,0x15,0x38,0x93,0x16,0x39,0x94,0x17, 0x39,0x95,0x16,0x36,0x94,0x15,0x35,0x93,0x14,0x37,0x95,0x16,0x38,0x94,0x15, 0x39,0x95,0x16,0x38,0x94,0x15,0x3a,0x96,0x17,0x37,0x95,0x16,0x38,0x97,0x15, 0x83,0x3b,0x9a,0x18,0x06,0x3c,0x9b,0x1a,0x3a,0x9a,0x18,0x39,0x99,0x17,0x3a, 0x99,0x17,0x3b,0x9a,0x18,0x3b,0x9b,0x17,0x82,0x39,0x9a,0x15,0x01,0x3c,0x9c, 0x18,0x82,0x3b,0x9b,0x17,0x07,0x3d,0x9b,0x18,0x3a,0x9b,0x16,0x3c,0x9c,0x18, 0x3c,0x9b,0x17,0x3c,0x9c,0x16,0x3c,0x9c,0x18,0x3b,0x9b,0x17,0x82,0x3d,0x9d, 0x19,0x82,0x3c,0x9c,0x16,0x02,0x3c,0x9c,0x18,0x3d,0x9d,0x17,0x82,0x3c,0x9c, 0x18,0x02,0x3e,0x9e,0x18,0x3d,0x9d,0x17,0x83,0x3e,0x9e,0x18,0x03,0x3d,0x9d, 0x17,0x3e,0x9e,0x18,0x3d,0x9d,0x17,0x82,0x3e,0x9e,0x18,0x05,0x3e,0x9e,0x17, 0x3e,0x9f,0x18,0x3f,0xa0,0x1a,0x3e,0xa0,0x18,0x3e,0x9e,0x17,0x82,0x3e,0x9e, 0x18,0x05,0x3e,0x9f,0x19,0x40,0xa1,0x1a,0x3e,0x9f,0x18,0x3f,0xa0,0x19,0x3f, 0xa1,0x17,0x83,0x3f,0xa0,0x19,0x0f,0x41,0xa2,0x1b,0x3f,0xa1,0x17,0x41,0xa2, 0x1b,0x3f,0xa0,0x19,0x3f,0xa1,0x17,0x3f,0xa0,0x19,0x42,0xa3,0x1c,0x3f,0xa0, 0x19,0x3f,0xa3,0x18,0x40,0xa4,0x19,0x41,0xa5,0x1a,0x43,0xa5,0x1b,0x41,0xa5, 0x18,0x3f,0xa3,0x16,0x40,0xa4,0x17,0x82,0x43,0xa7,0x1a,0x04,0x42,0xa6,0x19, 0x45,0xa9,0x1c,0x43,0xa7,0x1a,0x44,0xa8,0x19,0x82,0x43,0xa7,0x1a,0x03,0x44, 0xa8,0x19,0x46,0xaa,0x1b,0x45,0xa9,0x1a,0x82,0x44,0xa8,0x19,0x11,0x45,0xa9, 0x1a,0x44,0xa8,0x19,0x45,0xa8,0x19,0x43,0xa6,0x17,0x45,0xa9,0x1c,0x44,0xa8, 0x1b,0x45,0xa7,0x1b,0x46,0xa8,0x1c,0x45,0xa9,0x1a,0x43,0xa7,0x1c,0x46,0xa8, 0x1c,0x45,0xa7,0x1d,0x44,0xa6,0x1c,0x47,0xaa,0x1b,0x45,0xa7,0x1b,0x47,0xab, 0x1c,0x48,0xab,0x1d,0x82,0x46,0xa8,0x1c,0x83,0x46,0xa8,0x1e,0x05,0x44,0xa6, 0x1c,0x45,0xa5,0x1c,0x48,0xaa,0x1e,0x48,0xa8,0x1f,0x47,0xa7,0x1e,0x82,0x44, 0xa6,0x1c,0x08,0x48,0xa8,0x20,0x44,0xa4,0x1d,0x45,0xa4,0x1f,0x47,0xa7,0x1f, 0x43,0xa3,0x1c,0x44,0xa3,0x1e,0x46,0xa6,0x1f,0x44,0xa4,0x1d,0x82,0x45,0xa4, 0x1f,0x05,0x45,0xa5,0x1e,0x46,0xa3,0x1e,0x44,0xa1,0x1c,0x46,0xa3,0x1e,0x48, 0xa5,0x1f,0x82,0x46,0xa3,0x1d,0x08,0x46,0xa3,0x1e,0x46,0xa2,0x1f,0x47,0xa4, 0x1f,0x48,0xa5,0x1f,0x47,0xa4,0x1e,0x45,0xa2,0x1c,0x46,0xa3,0x1e,0x46,0xa3, 0x1d,0x82,0x45,0xa5,0x1e,0x1a,0x48,0xa5,0x1f,0x46,0xa3,0x1d,0x45,0xa2,0x1c, 0x44,0xa4,0x1d,0x48,0xa5,0x1f,0x43,0xa0,0x1a,0x42,0x9f,0x1a,0x43,0x9f,0x1b, 0x42,0x9e,0x1a,0x41,0x9c,0x18,0x3f,0x9b,0x17,0x40,0x9c,0x18,0x3f,0x9b,0x17, 0x3e,0x99,0x16,0x3e,0x98,0x16,0x3c,0x96,0x14,0x3d,0x96,0x14,0x3e,0x97,0x17, 0x3d,0x95,0x17,0x3d,0x93,0x18,0x3c,0x92,0x17,0x38,0x8e,0x15,0x3a,0x8c,0x15, 0x39,0x8d,0x13,0x37,0x8b,0x13,0x38,0x8b,0x14,0x82,0x35,0x88,0x11,0x0b,0x35, 0x87,0x12,0x33,0x83,0x11,0x32,0x82,0x10,0x33,0x82,0x11,0x30,0x7f,0x10,0x2a, 0x78,0x0c,0x25,0x72,0x08,0x21,0x6e,0x06,0x21,0x6e,0x07,0x23,0x70,0x09,0x21, 0x6e,0x07,0x82,0x20,0x6c,0x05,0x0c,0x1f,0x6a,0x06,0x20,0x6b,0x07,0x1f,0x6a, 0x04,0x1f,0x68,0x05,0x1f,0x68,0x07,0x1e,0x67,0x06,0x1d,0x65,0x05,0x1c,0x64, 0x04,0x1b,0x65,0x04,0x1c,0x64,0x04,0x1d,0x62,0x04,0x1b,0x60,0x02,0x82,0x1a, 0x62,0x05,0x05,0x1a,0x5f,0x03,0x1a,0x5e,0x03,0x19,0x60,0x04,0x18,0x5f,0x03, 0x18,0x5d,0x01,0x82,0x17,0x5d,0x02,0x06,0x18,0x5c,0x01,0x15,0x5b,0x01,0x17, 0x5c,0x03,0x16,0x5b,0x02,0x18,0x5b,0x02,0x18,0x5a,0x01,0x82,0x16,0x5b,0x01, 0x03,0x17,0x5a,0x01,0x17,0x59,0x01,0x16,0x5a,0x01,0x82,0x15,0x59,0x01,0x03, 0x16,0x5a,0x02,0x15,0x59,0x01,0x14,0x58,0x00,0x82,0x15,0x58,0x01,0x01,0x15, 0x57,0x02,0x82,0x16,0x58,0x02,0x03,0x16,0x57,0x02,0x14,0x55,0x01,0x16,0x55, 0x01,0x82,0x15,0x56,0x00,0x05,0x14,0x55,0x00,0x15,0x56,0x00,0x16,0x56,0x01, 0x15,0x55,0x00,0x14,0x56,0x00,0x82,0x15,0x54,0x00,0x0c,0x15,0x56,0x02,0x16, 0x55,0x02,0x15,0x55,0x01,0x14,0x54,0x00,0x15,0x53,0x01,0x15,0x55,0x02,0x14, 0x54,0x01,0x15,0x53,0x01,0x14,0x53,0x01,0x16,0x53,0x02,0x15,0x52,0x01,0x15, 0x53,0x01,0x84,0x14,0x52,0x01,0x0f,0x14,0x50,0x00,0x15,0x50,0x01,0x14,0x51, 0x01,0x15,0x50,0x01,0x15,0x4f,0x01,0x15,0x4f,0x00,0x14,0x50,0x00,0x14,0x50, 0x02,0x14,0x4e,0x01,0x14,0x4e,0x00,0x13,0x4e,0x00,0x14,0x50,0x01,0x13,0x4f, 0x01,0x13,0x4e,0x00,0x13,0x4d,0x00,0x82,0x14,0x4e,0x01,0x2a,0x14,0x4d,0x01, 0x14,0x4c,0x00,0x13,0x4d,0x00,0x13,0x4d,0x02,0x13,0x4b,0x00,0x13,0x4c,0x01, 0x12,0x4c,0x01,0x12,0x4d,0x01,0x14,0x4b,0x01,0x13,0x4a,0x01,0x12,0x49,0x00, 0x13,0x4b,0x02,0x13,0x4a,0x02,0x12,0x49,0x01,0x11,0x48,0x00,0x12,0x49,0x02, 0x12,0x49,0x01,0x13,0x48,0x00,0x11,0x47,0x00,0x11,0x48,0x01,0x11,0x47,0x00, 0x12,0x48,0x02,0x11,0x47,0x01,0x10,0x47,0x01,0x11,0x47,0x02,0x12,0x45,0x00, 0x10,0x45,0x00,0x11,0x46,0x02,0x13,0x47,0x00,0x12,0x47,0x02,0x0f,0x46,0x02, 0x11,0x43,0x00,0x12,0x45,0x01,0x11,0x44,0x00,0x10,0x43,0x00,0x11,0x43,0x00, 0x12,0x44,0x02,0x12,0x44,0x01,0x11,0x42,0x00,0x11,0x43,0x02,0x12,0x43,0x01, 0x11,0x42,0x01,0x82,0x10,0x41,0x00,0x08,0x11,0x42,0x01,0x11,0x41,0x01,0x10, 0x41,0x01,0x11,0x41,0x01,0x10,0x40,0x01,0x10,0x40,0x02,0x11,0x40,0x02,0x10, 0x3f,0x01,0x82,0x0f,0x3e,0x01,0x05,0x10,0x3e,0x01,0x10,0x3e,0x02,0x0f,0x3e, 0x00,0x10,0x3e,0x01,0x10,0x3d,0x02,0x82,0x0f,0x3d,0x01,0x04,0x0f,0x3d,0x02, 0x0f,0x3d,0x01,0x0f,0x3c,0x01,0x0f,0x3c,0x02,0x82,0x0f,0x3b,0x00,0x82,0x0f, 0x3c,0x01,0x1b,0x0f,0x3b,0x01,0x0f,0x3a,0x02,0x0f,0x3a,0x01,0x0f,0x3a,0x02, 0x0f,0x38,0x00,0x0f,0x3a,0x01,0x0f,0x39,0x01,0x0f,0x38,0x00,0x0f,0x38,0x01, 0x0f,0x37,0x01,0x0e,0x37,0x01,0x0f,0x38,0x01,0x0f,0x36,0x01,0x0f,0x37,0x02, 0x0f,0x36,0x01,0x0f,0x36,0x00,0x0f,0x37,0x01,0x0f,0x35,0x02,0x0e,0x36,0x01, 0x0e,0x36,0x02,0x0f,0x34,0x01,0x0e,0x35,0x02,0x0e,0x34,0x01,0x0f,0x34,0x01, 0x0e,0x33,0x01,0x0f,0x32,0x01,0x0e,0x33,0x02,0x82,0x0e,0x32,0x01,0x02,0x0d, 0x31,0x01,0x0e,0x31,0x01,0x82,0x0d,0x30,0x00,0x08,0x0c,0x2f,0x00,0x0d,0x2f, 0x02,0x0d,0x2f,0x01,0x0d,0x30,0x01,0x0d,0x2f,0x01,0x0c,0x2f,0x01,0x0c,0x2e, 0x01,0x0d,0x2e,0x01,0x82,0x0c,0x2e,0x01,0x05,0x0b,0x2e,0x00,0x0c,0x2d,0x01, 0x0b,0x2e,0x01,0x0b,0x2d,0x01,0x0c,0x2c,0x00,0x82,0x0b,0x2d,0x00,0x03,0x0b, 0x2c,0x00,0x0c,0x2b,0x01,0x0b,0x2a,0x00,0x82,0x0b,0x2b,0x00,0x82,0x0b,0x2a, 0x00,0x0b,0x0b,0x2a,0x02,0x0a,0x29,0x01,0x0a,0x28,0x00,0x0a,0x28,0x01,0x0b, 0x28,0x00,0x0b,0x28,0x01,0x0a,0x28,0x00,0x0a,0x27,0x00,0x0a,0x27,0x01,0x09, 0x26,0x01,0x0a,0x27,0x01,0x82,0x0a,0x26,0x01,0x06,0x09,0x26,0x01,0x0a,0x26, 0x01,0x0a,0x25,0x00,0x09,0x25,0x00,0x09,0x24,0x01,0x09,0x24,0x00,0x82,0x09, 0x23,0x00,0x01,0x09,0x24,0x00,0x82,0x09,0x23,0x00,0x01,0x09,0x23,0x01,0x82, 0x09,0x22,0x00,0x82,0x08,0x21,0x00,0x03,0x08,0x20,0x00,0x08,0x21,0x01,0x08, 0x20,0x01,0x83,0x08,0x1f,0x00,0x02,0x07,0x1f,0x00,0x08,0x1f,0x00,0x82,0x07, 0x1f,0x00,0x01,0x08,0x1f,0x01,0x82,0x07,0x1e,0x00,0x03,0x07,0x1d,0x00,0x06, 0x1d,0x00,0x07,0x1d,0x00,0x84,0x07,0x1c,0x00,0x02,0x06,0x1c,0x00,0x06,0x1b, 0x00,0x85,0x06,0x1a,0x00,0x82,0x06,0x19,0x00,0x02,0x05,0x18,0x00,0x06,0x18, 0x00,0x82,0x05,0x18,0x00,0x82,0x05,0x17,0x00,0x83,0x05,0x16,0x00,0x02,0x05, 0x15,0x00,0x04,0x15,0x00,0x86,0x04,0x14,0x00,0x02,0x05,0x13,0x00,0x04,0x13, 0x00,0x84,0x04,0x12,0x00,0x01,0x04,0x11,0x00,0x82,0x03,0x11,0x00,0x84,0x03, 0x10,0x00,0x02,0x03,0x0f,0x00,0x02,0x0f,0x00,0x84,0x03,0x0f,0x00,0x83,0x02, 0x0e,0x00,0x84,0x02,0x0d,0x00,0x84,0x02,0x0c,0x00,0x04,0x01,0x0b,0x00,0x02, 0x0b,0x00,0x02,0x0a,0x00,0x02,0x0b,0x00,0x82,0x01,0x0a,0x00,0x84,0x01,0x09, 0x00,0x83,0x01,0x08,0x00,0x83,0x01,0x07,0x00,0x01,0x00,0x07,0x00,0x84,0x00, 0x06,0x00,0x83,0x00,0x05,0x00,0x84,0x00,0x04,0x00,0x84,0x00,0x03,0x00,0x83, 0x00,0x02,0x00,0x84,0x00,0x01,0x00,0xde,0x00,0x00,0x00,0x82,0x31,0x85,0x15, 0x17,0x34,0x89,0x19,0x33,0x87,0x17,0x34,0x89,0x17,0x34,0x8a,0x15,0x32,0x86, 0x14,0x33,0x87,0x19,0x31,0x87,0x18,0x33,0x89,0x18,0x34,0x8a,0x19,0x32,0x88, 0x17,0x34,0x8a,0x19,0x30,0x86,0x15,0x31,0x87,0x16,0x32,0x88,0x17,0x31,0x87, 0x14,0x32,0x86,0x16,0x34,0x88,0x18,0x32,0x88,0x17,0x32,0x88,0x15,0x31,0x87, 0x14,0x33,0x89,0x16,0x33,0x87,0x17,0x31,0x85,0x13,0x82,0x34,0x88,0x16,0x06, 0x31,0x87,0x16,0x33,0x87,0x17,0x32,0x86,0x16,0x32,0x88,0x17,0x32,0x88,0x19, 0x33,0x89,0x18,0x82,0x31,0x87,0x16,0x01,0x33,0x89,0x18,0x82,0x32,0x88,0x17, 0x0a,0x31,0x87,0x16,0x32,0x88,0x17,0x30,0x86,0x15,0x31,0x87,0x16,0x32,0x86, 0x14,0x33,0x87,0x15,0x2f,0x85,0x12,0x30,0x89,0x17,0x33,0x89,0x18,0x32,0x86, 0x16,0x82,0x31,0x87,0x16,0x10,0x30,0x86,0x15,0x32,0x88,0x17,0x32,0x88,0x15, 0x31,0x87,0x14,0x32,0x88,0x15,0x31,0x87,0x14,0x32,0x88,0x15,0x31,0x87,0x14, 0x32,0x88,0x15,0x31,0x87,0x14,0x30,0x86,0x13,0x31,0x87,0x14,0x32,0x88,0x15, 0x31,0x87,0x16,0x32,0x88,0x17,0x2f,0x85,0x12,0x82,0x30,0x86,0x13,0x82,0x31, 0x87,0x14,0x02,0x30,0x86,0x13,0x31,0x87,0x14,0x82,0x30,0x86,0x13,0x07,0x31, 0x87,0x14,0x2f,0x85,0x12,0x30,0x89,0x15,0x31,0x8a,0x16,0x2d,0x86,0x12,0x2f, 0x88,0x14,0x31,0x87,0x14,0x82,0x2f,0x85,0x12,0x0b,0x2e,0x87,0x13,0x2f,0x88, 0x14,0x30,0x86,0x13,0x2f,0x85,0x12,0x30,0x86,0x13,0x30,0x86,0x15,0x32,0x88, 0x17,0x2f,0x85,0x14,0x2d,0x83,0x12,0x2f,0x88,0x16,0x2e,0x87,0x15,0x82,0x2f, 0x85,0x12,0x01,0x2e,0x87,0x13,0x82,0x30,0x89,0x15,0x16,0x2f,0x88,0x14,0x2e, 0x87,0x13,0x2f,0x88,0x14,0x32,0x88,0x15,0x2f,0x85,0x14,0x30,0x89,0x13,0x30, 0x89,0x15,0x2f,0x88,0x14,0x2e,0x87,0x13,0x2e,0x87,0x11,0x31,0x8a,0x14,0x2f, 0x88,0x14,0x2e,0x87,0x15,0x2f,0x85,0x14,0x30,0x86,0x13,0x31,0x8a,0x14,0x2e, 0x87,0x11,0x2f,0x88,0x14,0x2e,0x87,0x13,0x2f,0x88,0x14,0x2f,0x8a,0x13,0x32, 0x8b,0x15,0x82,0x30,0x89,0x13,0x82,0x31,0x8a,0x14,0x09,0x32,0x8c,0x14,0x33, 0x8c,0x16,0x30,0x8b,0x14,0x31,0x8c,0x15,0x32,0x8c,0x14,0x35,0x8d,0x16,0x32, 0x8c,0x14,0x32,0x8d,0x13,0x33,0x90,0x16,0x82,0x34,0x90,0x16,0x03,0x34,0x8f, 0x15,0x32,0x8d,0x13,0x33,0x8e,0x14,0x83,0x34,0x8f,0x15,0x0d,0x32,0x90,0x13, 0x34,0x90,0x14,0x34,0x93,0x16,0x34,0x8f,0x13,0x33,0x8e,0x12,0x36,0x92,0x16, 0x34,0x8f,0x13,0x36,0x92,0x14,0x34,0x93,0x13,0x36,0x95,0x15,0x37,0x93,0x15, 0x38,0x95,0x15,0x37,0x94,0x14,0x82,0x35,0x91,0x13,0x01,0x36,0x95,0x15,0x83, 0x37,0x96,0x16,0x03,0x38,0x97,0x17,0x35,0x96,0x15,0x37,0x97,0x14,0x83,0x39, 0x99,0x16,0x01,0x39,0x9a,0x17,0x82,0x3a,0x9a,0x17,0x01,0x3a,0x9b,0x18,0x82, 0x3b,0x9d,0x17,0x03,0x3a,0x9a,0x15,0x3a,0x9c,0x16,0x3a,0x9b,0x18,0x82,0x3a, 0x9c,0x16,0x04,0x38,0x9a,0x14,0x3b,0x9d,0x17,0x3e,0x9f,0x1a,0x3b,0x9d,0x17, 0x82,0x3c,0x9e,0x18,0x02,0x3b,0x9d,0x17,0x3d,0x9e,0x19,0x82,0x3c,0x9e,0x18, 0x06,0x3c,0x9e,0x16,0x3d,0x9e,0x17,0x3c,0x9e,0x16,0x3d,0x9e,0x17,0x3b,0x9d, 0x15,0x3e,0x9f,0x18,0x83,0x3d,0x9e,0x17,0x01,0x3c,0x9e,0x16,0x82,0x3e,0x9f, 0x18,0x02,0x40,0xa1,0x1a,0x3f,0xa0,0x19,0x82,0x3e,0x9f,0x18,0x82,0x3f,0xa0, 0x19,0x06,0x3e,0x9f,0x17,0x3f,0xa0,0x18,0x40,0xa1,0x19,0x3f,0xa0,0x18,0x3f, 0xa0,0x19,0x3f,0xa0,0x18,0x83,0x40,0xa1,0x19,0x01,0x3f,0xa0,0x18,0x82,0x40, 0xa2,0x17,0x03,0x42,0xa3,0x1b,0x40,0xa1,0x19,0x40,0xa4,0x18,0x82,0x41,0xa5, 0x19,0x01,0x40,0xa4,0x18,0x82,0x42,0xa6,0x18,0x82,0x41,0xa5,0x17,0x07,0x44, 0xa8,0x1a,0x41,0xa5,0x17,0x42,0xa6,0x18,0x44,0xa8,0x1a,0x43,0xa7,0x17,0x44, 0xa8,0x1a,0x46,0xaa,0x1c,0x82,0x45,0xa9,0x19,0x01,0x43,0xa7,0x17,0x82,0x44, 0xa8,0x18,0x01,0x43,0xaa,0x19,0x82,0x45,0xa9,0x19,0x01,0x44,0xa8,0x18,0x83, 0x45,0xa9,0x19,0x02,0x46,0xaa,0x1a,0x45,0xa9,0x1b,0x82,0x44,0xa8,0x1a,0x08, 0x46,0xa9,0x1e,0x45,0xa7,0x1c,0x46,0xa8,0x1b,0x45,0xa7,0x1a,0x48,0xac,0x1c, 0x46,0xab,0x1b,0x47,0xab,0x1b,0x46,0xa8,0x1b,0x82,0x46,0xa8,0x1d,0x82,0x45, 0xa7,0x1c,0x0a,0x46,0xa6,0x1c,0x46,0xa9,0x1e,0x44,0xa6,0x1b,0x46,0xa8,0x1d, 0x45,0xa7,0x1c,0x46,0xa8,0x1d,0x45,0xa7,0x1c,0x44,0xa4,0x1c,0x45,0xa5,0x1d, 0x47,0xa8,0x1e,0x82,0x46,0xa6,0x1e,0x12,0x48,0xa6,0x1f,0x47,0xa5,0x1e,0x47, 0xa5,0x1f,0x46,0xa6,0x20,0x46,0xa6,0x1e,0x47,0xa5,0x1f,0x46,0xa4,0x1e,0x46, 0xa7,0x1f,0x46,0xa6,0x1e,0x47,0xa5,0x1e,0x49,0xa7,0x20,0x47,0xa5,0x1e,0x44, 0xa3,0x1d,0x46,0xa3,0x1d,0x44,0xa4,0x1c,0x46,0xa6,0x1e,0x45,0xa5,0x1d,0x48, 0xa6,0x20,0x83,0x46,0xa4,0x1d,0x07,0x46,0xa4,0x1e,0x44,0xa4,0x1c,0x45,0xa5, 0x1d,0x46,0xa7,0x1f,0x45,0xa5,0x1b,0x42,0x9f,0x18,0x44,0xa1,0x1a,0x82,0x46, 0xa2,0x1c,0x21,0x45,0xa0,0x1b,0x40,0x9d,0x17,0x41,0x9e,0x18,0x41,0x9d,0x18, 0x40,0x9c,0x17,0x3e,0x99,0x16,0x40,0x99,0x17,0x3d,0x98,0x16,0x3c,0x95,0x14, 0x3c,0x95,0x16,0x3d,0x95,0x15,0x3c,0x94,0x16,0x39,0x91,0x13,0x36,0x8d,0x12, 0x3a,0x8f,0x14,0x39,0x8e,0x11,0x39,0x8d,0x13,0x39,0x8d,0x16,0x36,0x8a,0x13, 0x34,0x87,0x11,0x35,0x88,0x11,0x34,0x85,0x11,0x34,0x85,0x15,0x34,0x84,0x12, 0x33,0x83,0x11,0x30,0x7f,0x11,0x28,0x77,0x0a,0x23,0x71,0x06,0x23,0x70,0x08, 0x23,0x6f,0x08,0x23,0x6e,0x07,0x22,0x6e,0x07,0x21,0x6c,0x05,0x82,0x22,0x6c, 0x06,0x04,0x1f,0x6a,0x04,0x20,0x69,0x06,0x1f,0x68,0x07,0x1d,0x66,0x03,0x82, 0x1d,0x66,0x05,0x05,0x1c,0x65,0x04,0x1d,0x66,0x06,0x1c,0x65,0x05,0x1b,0x64, 0x04,0x1a,0x63,0x05,0x82,0x19,0x61,0x04,0x03,0x19,0x5e,0x02,0x18,0x60,0x03, 0x18,0x5f,0x03,0x82,0x18,0x5c,0x01,0x06,0x18,0x5e,0x03,0x18,0x5c,0x01,0x16, 0x5c,0x01,0x19,0x5c,0x02,0x18,0x5b,0x01,0x18,0x5a,0x01,0x82,0x16,0x5b,0x01, 0x07,0x16,0x5a,0x01,0x17,0x59,0x01,0x16,0x59,0x02,0x16,0x58,0x01,0x17,0x58, 0x01,0x16,0x5a,0x02,0x14,0x59,0x01,0x83,0x15,0x58,0x01,0x05,0x17,0x58,0x02, 0x13,0x57,0x00,0x16,0x58,0x02,0x15,0x58,0x02,0x17,0x57,0x03,0x82,0x15,0x57, 0x01,0x82,0x14,0x57,0x02,0x04,0x15,0x57,0x02,0x14,0x56,0x01,0x14,0x55,0x01, 0x15,0x56,0x02,0x82,0x15,0x55,0x02,0x06,0x14,0x55,0x02,0x15,0x55,0x01,0x14, 0x55,0x00,0x13,0x54,0x00,0x14,0x54,0x00,0x15,0x54,0x01,0x82,0x13,0x54,0x00, 0x01,0x14,0x53,0x00,0x82,0x15,0x53,0x01,0x03,0x14,0x52,0x00,0x13,0x51,0x00, 0x14,0x52,0x01,0x82,0x14,0x53,0x01,0x02,0x13,0x52,0x01,0x13,0x50,0x01,0x82, 0x14,0x52,0x01,0x09,0x15,0x4e,0x00,0x15,0x50,0x00,0x14,0x51,0x00,0x14,0x50, 0x01,0x14,0x4f,0x01,0x14,0x4e,0x01,0x13,0x4f,0x01,0x14,0x50,0x01,0x13,0x4f, 0x00,0x83,0x14,0x4f,0x02,0x02,0x13,0x4e,0x01,0x14,0x4e,0x00,0x82,0x13,0x4d, 0x01,0x01,0x14,0x4e,0x01,0x83,0x13,0x4c,0x01,0x03,0x13,0x4c,0x02,0x13,0x4c, 0x01,0x12,0x4b,0x01,0x82,0x14,0x49,0x01,0x02,0x13,0x4b,0x02,0x12,0x4b,0x00, 0x82,0x12,0x49,0x00,0x02,0x12,0x49,0x02,0x12,0x49,0x00,0x82,0x11,0x48,0x01, 0x07,0x11,0x47,0x00,0x11,0x47,0x01,0x11,0x46,0x02,0x12,0x47,0x02,0x11,0x47, 0x02,0x12,0x46,0x01,0x11,0x46,0x01,0x83,0x11,0x46,0x00,0x03,0x11,0x46,0x02, 0x12,0x46,0x01,0x11,0x45,0x01,0x82,0x11,0x45,0x00,0x0f,0x11,0x44,0x00,0x11, 0x45,0x01,0x11,0x44,0x00,0x11,0x43,0x00,0x11,0x43,0x01,0x11,0x42,0x00,0x11, 0x43,0x01,0x11,0x42,0x01,0x11,0x41,0x00,0x11,0x43,0x01,0x11,0x42,0x01,0x11, 0x41,0x00,0x11,0x42,0x00,0x11,0x40,0x00,0x11,0x40,0x01,0x82,0x11,0x3f,0x00, 0x01,0x11,0x40,0x02,0x83,0x11,0x3f,0x01,0x0b,0x10,0x3f,0x01,0x11,0x3e,0x01, 0x11,0x3d,0x02,0x10,0x3d,0x01,0x10,0x3c,0x01,0x10,0x3d,0x02,0x10,0x3d,0x01, 0x10,0x3c,0x00,0x0f,0x3c,0x01,0x10,0x3c,0x02,0x10,0x3b,0x01,0x82,0x11,0x3b, 0x01,0x04,0x10,0x3a,0x01,0x10,0x3a,0x02,0x0f,0x3a,0x02,0x0f,0x39,0x00,0x82, 0x0f,0x39,0x01,0x02,0x0f,0x38,0x00,0x0f,0x39,0x01,0x82,0x0f,0x38,0x01,0x0a, 0x0f,0x38,0x02,0x0f,0x37,0x00,0x0e,0x36,0x00,0x0e,0x37,0x01,0x0e,0x36,0x01, 0x0f,0x36,0x00,0x0e,0x35,0x00,0x0e,0x35,0x01,0x0e,0x34,0x00,0x0e,0x35,0x02, 0x86,0x0e,0x34,0x01,0x07,0x0e,0x34,0x02,0x0d,0x33,0x01,0x0e,0x33,0x01,0x0d, 0x32,0x01,0x0d,0x32,0x02,0x0c,0x30,0x01,0x0d,0x31,0x01,0x82,0x0d,0x31,0x02, 0x82,0x0d,0x31,0x01,0x01,0x0c,0x30,0x01,0x82,0x0c,0x2f,0x01,0x82,0x0c,0x2e, 0x01,0x01,0x0d,0x2e,0x02,0x82,0x0c,0x2f,0x01,0x03,0x0b,0x2d,0x01,0x0c,0x2c, 0x01,0x0b,0x2c,0x00,0x82,0x0c,0x2c,0x00,0x01,0x0b,0x2d,0x01,0x83,0x0b,0x2b, 0x00,0x02,0x0b,0x2b,0x01,0x0b,0x2a,0x01,0x82,0x0b,0x2a,0x00,0x01,0x0a,0x29, 0x01,0x83,0x0a,0x29,0x00,0x82,0x0a,0x28,0x01,0x01,0x0a,0x27,0x01,0x82,0x0a, 0x28,0x01,0x02,0x09,0x26,0x01,0x0a,0x26,0x00,0x82,0x09,0x26,0x00,0x03,0x0b, 0x26,0x01,0x0a,0x25,0x00,0x09,0x25,0x00,0x82,0x09,0x24,0x00,0x01,0x09,0x24, 0x01,0x84,0x09,0x23,0x00,0x01,0x09,0x23,0x01,0x82,0x09,0x23,0x00,0x82,0x09, 0x22,0x00,0x82,0x08,0x22,0x00,0x03,0x09,0x21,0x00,0x08,0x21,0x00,0x08,0x21, 0x01,0x82,0x08,0x20,0x00,0x01,0x08,0x20,0x01,0x83,0x08,0x1f,0x00,0x84,0x07, 0x1e,0x00,0x01,0x07,0x1d,0x00,0x83,0x07,0x1c,0x00,0x83,0x06,0x1b,0x00,0x82, 0x07,0x1a,0x00,0x82,0x06,0x1a,0x00,0x83,0x06,0x19,0x00,0x02,0x05,0x18,0x00, 0x06,0x19,0x00,0x82,0x06,0x18,0x00,0x03,0x05,0x17,0x00,0x06,0x17,0x00,0x05, 0x17,0x00,0x83,0x05,0x16,0x00,0x02,0x05,0x15,0x00,0x04,0x15,0x00,0x82,0x05, 0x14,0x00,0x82,0x04,0x14,0x00,0x83,0x04,0x13,0x00,0x85,0x04,0x12,0x00,0x86, 0x03,0x11,0x00,0x83,0x03,0x10,0x00,0x83,0x03,0x0f,0x00,0x01,0x03,0x0e,0x00, 0x82,0x02,0x0e,0x00,0x84,0x02,0x0d,0x00,0x83,0x02,0x0c,0x00,0x04,0x02,0x0b, 0x00,0x01,0x0b,0x00,0x02,0x0b,0x00,0x02,0x0a,0x00,0x84,0x01,0x0a,0x00,0x83, 0x01,0x09,0x00,0x84,0x01,0x08,0x00,0x01,0x01,0x07,0x00,0x82,0x00,0x07,0x00, 0x84,0x00,0x06,0x00,0x83,0x00,0x05,0x00,0x84,0x00,0x04,0x00,0x83,0x00,0x03, 0x00,0x84,0x00,0x02,0x00,0x84,0x00,0x01,0x00,0xde,0x00,0x00,0x00,0x02,0x30, 0x84,0x18,0x33,0x88,0x19,0x82,0x34,0x89,0x18,0x08,0x33,0x8a,0x18,0x31,0x88, 0x16,0x31,0x86,0x15,0x32,0x87,0x18,0x33,0x8a,0x18,0x31,0x88,0x18,0x32,0x89, 0x17,0x30,0x87,0x15,0x82,0x33,0x8a,0x1a,0x0d,0x31,0x88,0x16,0x30,0x87,0x17, 0x33,0x88,0x19,0x33,0x88,0x17,0x32,0x87,0x14,0x32,0x89,0x17,0x30,0x87,0x17, 0x2f,0x86,0x16,0x32,0x89,0x17,0x31,0x88,0x14,0x33,0x88,0x19,0x31,0x86,0x17, 0x32,0x87,0x16,0x83,0x31,0x88,0x16,0x03,0x33,0x8a,0x18,0x32,0x89,0x17,0x32, 0x87,0x16,0x82,0x33,0x88,0x17,0x1d,0x30,0x87,0x17,0x30,0x87,0x14,0x31,0x88, 0x18,0x31,0x88,0x16,0x30,0x87,0x15,0x32,0x87,0x16,0x31,0x88,0x16,0x2f,0x86, 0x13,0x33,0x8a,0x16,0x31,0x86,0x15,0x32,0x87,0x16,0x2f,0x86,0x14,0x31,0x88, 0x16,0x2f,0x89,0x16,0x2e,0x85,0x14,0x30,0x87,0x15,0x2f,0x86,0x14,0x2f,0x86, 0x13,0x31,0x88,0x14,0x32,0x89,0x15,0x2f,0x89,0x14,0x2e,0x88,0x14,0x31,0x88, 0x14,0x31,0x88,0x16,0x30,0x85,0x14,0x32,0x87,0x16,0x32,0x89,0x15,0x31,0x88, 0x16,0x2e,0x88,0x15,0x83,0x30,0x87,0x15,0x07,0x30,0x87,0x14,0x31,0x88,0x14, 0x31,0x88,0x16,0x2f,0x86,0x14,0x30,0x87,0x15,0x30,0x87,0x14,0x2e,0x85,0x12, 0x82,0x30,0x85,0x13,0x02,0x31,0x86,0x15,0x30,0x87,0x15,0x82,0x2f,0x86,0x14, 0x0f,0x2f,0x86,0x13,0x2e,0x85,0x12,0x31,0x88,0x14,0x2d,0x87,0x13,0x2f,0x89, 0x14,0x32,0x89,0x15,0x30,0x87,0x14,0x2b,0x85,0x13,0x2f,0x86,0x13,0x2e,0x85, 0x12,0x2d,0x84,0x13,0x2f,0x86,0x14,0x2e,0x88,0x15,0x2d,0x87,0x13,0x2c,0x86, 0x12,0x82,0x30,0x87,0x14,0x03,0x31,0x88,0x14,0x30,0x8a,0x15,0x2f,0x89,0x14, 0x82,0x2e,0x88,0x14,0x0b,0x2f,0x86,0x13,0x30,0x87,0x15,0x2e,0x88,0x15,0x2e, 0x88,0x14,0x2e,0x88,0x12,0x30,0x87,0x14,0x2f,0x86,0x13,0x2d,0x87,0x14,0x2c, 0x86,0x14,0x2f,0x89,0x14,0x30,0x87,0x14,0x82,0x2d,0x87,0x13,0x02,0x2c,0x86, 0x12,0x2d,0x87,0x13,0x82,0x2f,0x89,0x14,0x84,0x2e,0x88,0x14,0x08,0x30,0x8a, 0x15,0x2e,0x88,0x14,0x2d,0x87,0x13,0x2e,0x88,0x14,0x31,0x8b,0x16,0x2f,0x89, 0x13,0x2d,0x87,0x11,0x31,0x8b,0x14,0x82,0x32,0x8d,0x14,0x03,0x2f,0x8b,0x13, 0x30,0x8c,0x14,0x32,0x90,0x17,0x82,0x30,0x8c,0x14,0x01,0x32,0x8e,0x15,0x82, 0x32,0x8d,0x14,0x04,0x33,0x8f,0x14,0x32,0x8e,0x14,0x34,0x90,0x14,0x32,0x91, 0x14,0x82,0x34,0x90,0x15,0x0f,0x32,0x8d,0x13,0x31,0x8e,0x11,0x35,0x91,0x14, 0x35,0x94,0x14,0x33,0x92,0x13,0x35,0x91,0x14,0x35,0x91,0x13,0x36,0x92,0x14, 0x34,0x90,0x14,0x35,0x91,0x14,0x35,0x94,0x14,0x34,0x93,0x13,0x34,0x93,0x14, 0x35,0x94,0x14,0x36,0x95,0x15,0x84,0x37,0x96,0x15,0x0d,0x36,0x95,0x14,0x36, 0x96,0x13,0x36,0x95,0x14,0x36,0x93,0x11,0x38,0x98,0x14,0x3a,0x9b,0x17,0x38, 0x9a,0x14,0x3b,0x9b,0x15,0x38,0x99,0x15,0x3a,0x9d,0x18,0x3b,0x9b,0x15,0x39, 0x99,0x14,0x3b,0x9b,0x15,0x82,0x3a,0x9a,0x14,0x04,0x3b,0x9b,0x15,0x3c,0x9c, 0x16,0x3b,0x9b,0x15,0x3a,0x9c,0x15,0x82,0x3c,0x9e,0x17,0x03,0x3b,0x9d,0x16, 0x3b,0x9d,0x14,0x3d,0xa0,0x17,0x82,0x3c,0x9e,0x15,0x82,0x3c,0xa0,0x16,0x08, 0x3c,0x9f,0x16,0x3c,0x9e,0x15,0x3b,0x9d,0x14,0x3c,0x9f,0x16,0x3d,0xa0,0x17, 0x3c,0x9e,0x15,0x3c,0x9f,0x16,0x3e,0xa1,0x18,0x83,0x3d,0xa0,0x17,0x82,0x3e, 0xa1,0x18,0x03,0x3c,0x9f,0x16,0x3d,0xa2,0x17,0x3d,0xa0,0x17,0x82,0x3f,0xa2, 0x19,0x02,0x3e,0xa1,0x17,0x40,0xa2,0x19,0x82,0x3f,0xa2,0x18,0x82,0x40,0xa3, 0x17,0x02,0x3f,0xa2,0x18,0x40,0xa2,0x19,0x83,0x40,0xa5,0x18,0x03,0x3f,0xa4, 0x17,0x41,0xa6,0x19,0x3f,0xa4,0x15,0x82,0x41,0xa6,0x17,0x02,0x42,0xa7,0x18, 0x40,0xa5,0x16,0x82,0x43,0xa6,0x18,0x01,0x43,0xa8,0x17,0x82,0x43,0xa8,0x19, 0x03,0x43,0xa8,0x17,0x44,0xa9,0x18,0x41,0xa9,0x17,0x82,0x42,0xaa,0x18,0x82, 0x43,0xab,0x19,0x82,0x45,0xaa,0x19,0x82,0x42,0xaa,0x18,0x14,0x44,0xa9,0x18, 0x45,0xa9,0x18,0x44,0xa9,0x1a,0x45,0xaa,0x1b,0x43,0xa8,0x1b,0x45,0xa8,0x1c, 0x43,0xa6,0x1a,0x45,0xa8,0x1c,0x47,0xab,0x1a,0x47,0xaa,0x1c,0x48,0xad,0x1c, 0x48,0xac,0x1b,0x48,0xab,0x1d,0x43,0xa8,0x1b,0x45,0xaa,0x1d,0x47,0xaa,0x1e, 0x46,0xa9,0x1d,0x46,0xa7,0x1c,0x44,0xa7,0x1b,0x46,0xa9,0x1d,0x82,0x47,0xa8, 0x1f,0x1a,0x45,0xa6,0x1b,0x47,0xa8,0x1d,0x47,0xa8,0x1f,0x46,0xa7,0x1e,0x45, 0xa6,0x1d,0x46,0xa7,0x1e,0x46,0xa4,0x1c,0x48,0xa6,0x1f,0x49,0xa7,0x20,0x48, 0xa6,0x1e,0x49,0xa7,0x1f,0x47,0xa5,0x1e,0x46,0xa7,0x1e,0x47,0xa5,0x1d,0x48, 0xa6,0x1e,0x46,0xa4,0x1c,0x45,0xa6,0x1d,0x47,0xa8,0x1f,0x45,0xa6,0x1d,0x46, 0xa7,0x1e,0x43,0xa3,0x1c,0x46,0xa7,0x1e,0x48,0xa9,0x20,0x45,0xa6,0x1d,0x47, 0xa8,0x1f,0x46,0xa4,0x1c,0x82,0x47,0xa5,0x1d,0x07,0x43,0xa3,0x1c,0x44,0xa4, 0x1d,0x43,0xa4,0x1b,0x46,0xa7,0x1c,0x46,0xa4,0x1a,0x45,0xa3,0x19,0x46,0xa4, 0x1a,0x82,0x44,0xa2,0x1a,0x02,0x44,0xa1,0x1a,0x44,0xa2,0x1b,0x82,0x43,0xa0, 0x1a,0x33,0x41,0x9e,0x18,0x41,0x9d,0x18,0x41,0x9b,0x17,0x3c,0x99,0x15,0x3c, 0x96,0x16,0x3d,0x97,0x15,0x3c,0x95,0x14,0x3b,0x95,0x13,0x3c,0x94,0x14,0x3a, 0x91,0x14,0x39,0x90,0x14,0x3b,0x90,0x14,0x3a,0x8e,0x15,0x36,0x8d,0x14,0x38, 0x8c,0x14,0x38,0x8b,0x14,0x36,0x89,0x13,0x35,0x88,0x11,0x35,0x87,0x11,0x34, 0x85,0x13,0x33,0x84,0x12,0x31,0x81,0x10,0x34,0x84,0x13,0x2e,0x7d,0x11,0x26, 0x74,0x09,0x23,0x70,0x07,0x24,0x6f,0x09,0x22,0x71,0x08,0x21,0x6e,0x06,0x23, 0x6e,0x07,0x21,0x6d,0x06,0x20,0x6c,0x05,0x20,0x6b,0x07,0x1f,0x68,0x05,0x1e, 0x67,0x04,0x1e,0x69,0x07,0x1e,0x68,0x06,0x1c,0x65,0x05,0x1c,0x67,0x06,0x1b, 0x66,0x05,0x1c,0x65,0x05,0x1c,0x63,0x05,0x1a,0x63,0x05,0x1a,0x63,0x03,0x19, 0x62,0x04,0x18,0x61,0x03,0x19,0x61,0x04,0x17,0x5f,0x02,0x16,0x5e,0x01,0x1a, 0x5f,0x03,0x16,0x5d,0x01,0x83,0x19,0x5d,0x02,0x0a,0x18,0x5b,0x01,0x14,0x5a, 0x00,0x16,0x5c,0x01,0x17,0x5c,0x02,0x17,0x5a,0x01,0x16,0x5a,0x02,0x18,0x59, 0x02,0x18,0x59,0x01,0x15,0x5a,0x01,0x14,0x5a,0x01,0x82,0x15,0x59,0x01,0x0f, 0x14,0x58,0x00,0x17,0x58,0x03,0x15,0x58,0x01,0x14,0x59,0x02,0x15,0x58,0x01, 0x16,0x58,0x02,0x16,0x56,0x01,0x15,0x58,0x02,0x14,0x59,0x02,0x14,0x57,0x01, 0x14,0x57,0x02,0x16,0x57,0x02,0x14,0x55,0x01,0x15,0x56,0x02,0x14,0x55,0x01, 0x82,0x15,0x55,0x02,0x05,0x15,0x55,0x00,0x15,0x54,0x00,0x14,0x55,0x00,0x14, 0x55,0x01,0x15,0x54,0x01,0x82,0x14,0x55,0x01,0x02,0x16,0x54,0x02,0x16,0x52, 0x02,0x82,0x15,0x51,0x01,0x01,0x13,0x51,0x00,0x82,0x14,0x51,0x01,0x02,0x14, 0x51,0x00,0x14,0x52,0x01,0x83,0x14,0x51,0x01,0x02,0x15,0x50,0x01,0x15,0x52, 0x01,0x82,0x14,0x51,0x01,0x02,0x14,0x50,0x01,0x14,0x4f,0x02,0x84,0x14,0x4f, 0x01,0x03,0x14,0x50,0x02,0x14,0x4f,0x02,0x14,0x4e,0x01,0x82,0x14,0x4f,0x01, 0x02,0x14,0x4e,0x01,0x14,0x4d,0x02,0x82,0x14,0x4d,0x00,0x16,0x14,0x4c,0x01, 0x14,0x4d,0x02,0x13,0x4d,0x01,0x14,0x4b,0x01,0x14,0x4a,0x01,0x13,0x4a,0x00, 0x14,0x4c,0x02,0x12,0x4b,0x00,0x13,0x4c,0x01,0x13,0x49,0x00,0x12,0x4a,0x01, 0x13,0x4a,0x00,0x12,0x49,0x00,0x12,0x49,0x01,0x13,0x49,0x00,0x14,0x48,0x00, 0x12,0x46,0x01,0x12,0x47,0x01,0x12,0x47,0x00,0x13,0x47,0x03,0x13,0x48,0x02, 0x11,0x49,0x00,0x82,0x12,0x46,0x00,0x0d,0x11,0x48,0x01,0x11,0x45,0x01,0x10, 0x45,0x00,0x12,0x45,0x02,0x13,0x46,0x02,0x12,0x44,0x00,0x12,0x45,0x01,0x12, 0x44,0x00,0x12,0x43,0x01,0x11,0x43,0x01,0x11,0x43,0x00,0x12,0x43,0x02,0x12, 0x43,0x03,0x82,0x11,0x42,0x00,0x08,0x10,0x41,0x00,0x11,0x42,0x01,0x11,0x42, 0x00,0x11,0x40,0x01,0x11,0x40,0x00,0x11,0x3f,0x00,0x11,0x3f,0x01,0x12,0x3f, 0x01,0x83,0x11,0x3e,0x00,0x02,0x10,0x3e,0x00,0x11,0x3e,0x01,0x82,0x10,0x3d, 0x01,0x06,0x11,0x3c,0x01,0x10,0x3d,0x02,0x10,0x3d,0x01,0x11,0x3c,0x01,0x0f, 0x3c,0x01,0x10,0x3c,0x02,0x83,0x10,0x3c,0x01,0x01,0x10,0x3b,0x00,0x82,0x0f, 0x3a,0x01,0x0b,0x0e,0x3a,0x00,0x0f,0x3b,0x01,0x10,0x3b,0x01,0x0f,0x3b,0x01, 0x0f,0x3a,0x01,0x0f,0x38,0x01,0x0f,0x39,0x01,0x0f,0x38,0x01,0x0e,0x38,0x00, 0x0e,0x37,0x01,0x0f,0x37,0x01,0x82,0x0e,0x37,0x01,0x03,0x0f,0x35,0x00,0x0e, 0x36,0x01,0x0e,0x35,0x02,0x82,0x0d,0x34,0x01,0x0a,0x0f,0x34,0x01,0x0e,0x34, 0x01,0x0e,0x35,0x01,0x0e,0x35,0x02,0x0d,0x35,0x02,0x0d,0x33,0x01,0x0d,0x33, 0x00,0x0d,0x33,0x01,0x0d,0x32,0x01,0x0d,0x32,0x02,0x82,0x0d,0x31,0x02,0x06, 0x0c,0x30,0x01,0x0c,0x31,0x02,0x0c,0x31,0x01,0x0c,0x30,0x01,0x0d,0x30,0x01, 0x0c,0x2f,0x01,0x83,0x0c,0x2e,0x01,0x04,0x0c,0x2e,0x02,0x0c,0x2e,0x01,0x0c, 0x2d,0x01,0x0b,0x2d,0x01,0x82,0x0b,0x2c,0x01,0x82,0x0c,0x2c,0x00,0x0d,0x0b, 0x2b,0x00,0x0b,0x2c,0x00,0x0b,0x2b,0x00,0x0a,0x2b,0x00,0x0b,0x2b,0x00,0x0b, 0x2a,0x00,0x0a,0x2a,0x00,0x0b,0x2a,0x00,0x0a,0x2a,0x00,0x0b,0x29,0x01,0x0b, 0x29,0x00,0x0b,0x28,0x00,0x0b,0x28,0x01,0x82,0x0a,0x28,0x00,0x01,0x0a,0x28, 0x01,0x82,0x09,0x27,0x01,0x03,0x0a,0x28,0x01,0x0a,0x28,0x00,0x09,0x27,0x00, 0x83,0x0a,0x26,0x01,0x82,0x09,0x25,0x00,0x02,0x09,0x24,0x00,0x09,0x25,0x00, 0x83,0x09,0x24,0x00,0x03,0x09,0x23,0x01,0x09,0x24,0x00,0x08,0x23,0x00,0x82, 0x09,0x22,0x00,0x03,0x08,0x21,0x00,0x08,0x22,0x00,0x09,0x21,0x00,0x82,0x08, 0x21,0x00,0x07,0x07,0x20,0x00,0x08,0x1f,0x00,0x08,0x20,0x00,0x08,0x1f,0x00, 0x08,0x1f,0x01,0x07,0x1f,0x00,0x08,0x1e,0x00,0x82,0x07,0x1e,0x00,0x84,0x07, 0x1d,0x00,0x02,0x07,0x1c,0x00,0x06,0x1c,0x00,0x84,0x07,0x1b,0x00,0x01,0x07, 0x1a,0x00,0x82,0x06,0x1a,0x00,0x82,0x06,0x19,0x00,0x03,0x06,0x18,0x00,0x06, 0x19,0x00,0x06,0x18,0x00,0x85,0x05,0x17,0x00,0x82,0x05,0x16,0x00,0x82,0x04, 0x15,0x00,0x03,0x05,0x15,0x00,0x05,0x14,0x00,0x05,0x15,0x00,0x84,0x04,0x14, 0x00,0x85,0x04,0x13,0x00,0x82,0x04,0x12,0x00,0x84,0x03,0x11,0x00,0x83,0x03, 0x10,0x00,0x82,0x03,0x0f,0x00,0x01,0x02,0x0f,0x00,0x82,0x02,0x0e,0x00,0x85, 0x02,0x0d,0x00,0x83,0x02,0x0c,0x00,0x01,0x02,0x0b,0x00,0x82,0x01,0x0b,0x00, 0x01,0x02,0x0b,0x00,0x84,0x01,0x0a,0x00,0x83,0x01,0x09,0x00,0x83,0x01,0x08, 0x00,0x82,0x01,0x07,0x00,0x82,0x00,0x07,0x00,0x84,0x00,0x06,0x00,0x83,0x00, 0x05,0x00,0x84,0x00,0x04,0x00,0x83,0x00,0x03,0x00,0x84,0x00,0x02,0x00,0x84, 0x00,0x01,0x00,0xde,0x00,0x00,0x00,0x01,0x33,0x89,0x19,0x82,0x32,0x88,0x17, 0x07,0x33,0x89,0x17,0x32,0x88,0x18,0x31,0x87,0x17,0x32,0x88,0x18,0x33,0x89, 0x17,0x33,0x8b,0x1a,0x30,0x88,0x17,0x82,0x33,0x89,0x19,0x04,0x32,0x88,0x18, 0x30,0x86,0x15,0x31,0x89,0x17,0x33,0x8b,0x18,0x82,0x32,0x88,0x18,0x02,0x31, 0x89,0x18,0x2f,0x86,0x16,0x82,0x33,0x89,0x17,0x08,0x31,0x87,0x17,0x33,0x89, 0x19,0x32,0x88,0x18,0x30,0x88,0x17,0x32,0x8a,0x19,0x30,0x88,0x17,0x31,0x89, 0x18,0x32,0x88,0x17,0x82,0x32,0x8a,0x17,0x07,0x32,0x88,0x18,0x31,0x89,0x17, 0x32,0x8a,0x17,0x31,0x89,0x17,0x30,0x88,0x17,0x30,0x86,0x17,0x33,0x89,0x19, 0x82,0x30,0x88,0x16,0x02,0x31,0x87,0x16,0x32,0x88,0x17,0x82,0x31,0x89,0x17, 0x82,0x31,0x87,0x16,0x02,0x30,0x88,0x16,0x30,0x88,0x17,0x82,0x31,0x89,0x18, 0x07,0x31,0x87,0x16,0x30,0x86,0x15,0x2f,0x85,0x14,0x30,0x86,0x15,0x31,0x87, 0x16,0x2f,0x87,0x17,0x2f,0x8a,0x17,0x82,0x2f,0x87,0x15,0x08,0x2f,0x89,0x14, 0x2f,0x89,0x16,0x2f,0x87,0x15,0x2f,0x89,0x18,0x31,0x89,0x15,0x31,0x89,0x17, 0x32,0x8a,0x17,0x2f,0x86,0x14,0x83,0x2f,0x87,0x15,0x06,0x30,0x86,0x17,0x2f, 0x86,0x16,0x2d,0x84,0x14,0x2f,0x87,0x15,0x2f,0x86,0x14,0x2e,0x85,0x13,0x85, 0x2f,0x86,0x14,0x07,0x2e,0x85,0x13,0x2f,0x84,0x13,0x2f,0x85,0x14,0x2f,0x87, 0x15,0x30,0x88,0x16,0x2f,0x87,0x15,0x2f,0x86,0x14,0x83,0x30,0x88,0x16,0x82, 0x2f,0x86,0x14,0x0e,0x2f,0x87,0x15,0x31,0x89,0x15,0x2f,0x87,0x15,0x31,0x89, 0x17,0x2f,0x87,0x13,0x2e,0x88,0x15,0x2f,0x89,0x16,0x2e,0x88,0x15,0x2f,0x89, 0x16,0x30,0x88,0x16,0x30,0x88,0x17,0x2f,0x87,0x15,0x2e,0x88,0x13,0x2d,0x87, 0x14,0x82,0x2f,0x89,0x16,0x08,0x2f,0x87,0x15,0x30,0x88,0x14,0x2f,0x8a,0x15, 0x2f,0x89,0x14,0x2e,0x88,0x13,0x2f,0x89,0x16,0x2e,0x88,0x15,0x31,0x89,0x15, 0x82,0x2e,0x88,0x13,0x01,0x2d,0x87,0x14,0x82,0x2e,0x88,0x15,0x01,0x2f,0x89, 0x14,0x83,0x2e,0x88,0x13,0x02,0x2f,0x8a,0x17,0x2d,0x87,0x12,0x82,0x2f,0x89, 0x14,0x82,0x2f,0x8a,0x13,0x01,0x2e,0x88,0x11,0x82,0x2f,0x8a,0x15,0x07,0x32, 0x8f,0x17,0x2f,0x8b,0x12,0x2f,0x8a,0x15,0x31,0x8d,0x14,0x2f,0x8b,0x12,0x30, 0x8b,0x14,0x2f,0x8b,0x12,0x83,0x31,0x8e,0x15,0x03,0x32,0x8f,0x16,0x31,0x8e, 0x15,0x30,0x8d,0x14,0x82,0x33,0x90,0x15,0x01,0x33,0x90,0x13,0x82,0x33,0x90, 0x15,0x07,0x34,0x91,0x14,0x35,0x92,0x15,0x34,0x91,0x14,0x35,0x92,0x13,0x36, 0x93,0x14,0x35,0x92,0x13,0x32,0x92,0x12,0x82,0x34,0x94,0x14,0x82,0x33,0x93, 0x15,0x03,0x34,0x94,0x14,0x32,0x92,0x12,0x35,0x95,0x15,0x82,0x34,0x94,0x13, 0x01,0x35,0x96,0x12,0x82,0x37,0x98,0x14,0x09,0x38,0x98,0x17,0x3a,0x9a,0x18, 0x39,0x99,0x17,0x37,0x97,0x16,0x36,0x97,0x11,0x38,0x9a,0x16,0x38,0x9b,0x14, 0x39,0x9c,0x15,0x3a,0x9b,0x17,0x82,0x3b,0x9c,0x16,0x02,0x39,0x9a,0x16,0x3a, 0x9b,0x15,0x83,0x3b,0x9e,0x17,0x06,0x3a,0x9d,0x16,0x3c,0x9f,0x17,0x39,0x9c, 0x15,0x3c,0x9f,0x16,0x3b,0x9e,0x15,0x3c,0x9f,0x16,0x82,0x3b,0x9e,0x17,0x0e, 0x3c,0x9f,0x17,0x3d,0xa0,0x18,0x3c,0x9f,0x16,0x3d,0xa0,0x17,0x3c,0x9f,0x16, 0x3b,0xa0,0x16,0x3d,0xa2,0x17,0x3d,0xa0,0x17,0x3e,0xa1,0x17,0x3c,0xa1,0x17, 0x3e,0xa3,0x18,0x3d,0xa2,0x17,0x3e,0xa3,0x18,0x3e,0xa3,0x17,0x82,0x3d,0xa2, 0x17,0x05,0x40,0xa3,0x18,0x3f,0xa2,0x17,0x40,0xa3,0x18,0x40,0xa6,0x17,0x3e, 0xa4,0x16,0x82,0x3f,0xa4,0x18,0x02,0x3d,0xa2,0x17,0x3f,0xa4,0x18,0x82,0x41, 0xa6,0x18,0x01,0x43,0xa6,0x17,0x82,0x40,0xa6,0x16,0x02,0x41,0xa6,0x17,0x43, 0xa8,0x18,0x82,0x42,0xa7,0x17,0x08,0x43,0xa8,0x18,0x45,0xaa,0x18,0x43,0xa8, 0x17,0x42,0xa7,0x16,0x43,0xa8,0x17,0x44,0xa9,0x17,0x45,0xaa,0x18,0x44,0xa9, 0x17,0x82,0x45,0xaa,0x18,0x82,0x43,0xab,0x18,0x02,0x46,0xaa,0x18,0x45,0xaa, 0x18,0x82,0x43,0xab,0x18,0x01,0x45,0xa9,0x17,0x82,0x46,0xab,0x1b,0x0a,0x45, 0xa8,0x19,0x43,0xa6,0x17,0x44,0xa7,0x18,0x46,0xa9,0x1c,0x47,0xaa,0x1d,0x46, 0xa9,0x1c,0x45,0xad,0x1a,0x47,0xac,0x1a,0x47,0xad,0x1d,0x46,0xab,0x1b,0x82, 0x45,0xaa,0x1c,0x02,0x47,0xac,0x1c,0x46,0xab,0x1b,0x82,0x44,0xa7,0x1a,0x82, 0x46,0xa9,0x1c,0x05,0x46,0xa8,0x1e,0x47,0xa8,0x1e,0x47,0xa9,0x1f,0x46,0xa7, 0x1b,0x45,0xa6,0x1c,0x83,0x45,0xa7,0x1d,0x01,0x46,0xa7,0x1d,0x83,0x47,0xa9, 0x1f,0x46,0x46,0xa7,0x1d,0x47,0xa9,0x1d,0x47,0xa8,0x1c,0x45,0xa6,0x1c,0x48, 0xa7,0x1f,0x47,0xa6,0x1e,0x46,0xa7,0x1d,0x47,0xa8,0x1e,0x45,0xa7,0x1e,0x47, 0xa9,0x1f,0x47,0xa8,0x1e,0x47,0xa8,0x1c,0x47,0xa9,0x1d,0x47,0xa8,0x1e,0x46, 0xa5,0x1c,0x47,0xa6,0x1d,0x46,0xa7,0x1d,0x46,0xa5,0x1b,0x46,0xa5,0x19,0x47, 0xa6,0x1c,0x47,0xa8,0x1e,0x44,0xa6,0x1b,0x46,0xa7,0x1b,0x47,0xa6,0x19,0x44, 0xa5,0x19,0x45,0xa2,0x1a,0x43,0xa1,0x19,0x47,0xa4,0x1b,0x43,0xa3,0x19,0x43, 0xa3,0x1b,0x43,0x9f,0x19,0x41,0x9d,0x16,0x3e,0x9a,0x16,0x3d,0x99,0x16,0x3e, 0x9a,0x17,0x3f,0x98,0x16,0x3e,0x97,0x15,0x3c,0x95,0x15,0x3c,0x95,0x16,0x3a, 0x93,0x14,0x3b,0x93,0x15,0x39,0x91,0x13,0x38,0x8f,0x14,0x3a,0x90,0x17,0x35, 0x8c,0x13,0x39,0x8d,0x15,0x36,0x89,0x12,0x35,0x89,0x13,0x35,0x87,0x14,0x34, 0x86,0x13,0x34,0x83,0x12,0x34,0x83,0x10,0x34,0x84,0x13,0x30,0x80,0x0f,0x2b, 0x7b,0x0b,0x25,0x74,0x07,0x23,0x71,0x08,0x25,0x71,0x08,0x24,0x70,0x08,0x23, 0x6f,0x07,0x22,0x6e,0x06,0x21,0x6c,0x05,0x20,0x6a,0x06,0x1f,0x6b,0x06,0x1f, 0x6a,0x06,0x1f,0x69,0x06,0x1e,0x68,0x05,0x1d,0x67,0x04,0x1e,0x68,0x05,0x1d, 0x66,0x06,0x82,0x1b,0x64,0x04,0x09,0x1c,0x62,0x03,0x1a,0x63,0x03,0x1a,0x62, 0x05,0x1b,0x60,0x04,0x19,0x5f,0x02,0x1b,0x60,0x05,0x17,0x5e,0x02,0x17,0x5e, 0x03,0x19,0x5e,0x03,0x82,0x19,0x5e,0x02,0x01,0x18,0x5c,0x01,0x82,0x17,0x5d, 0x01,0x04,0x17,0x5d,0x02,0x17,0x5b,0x01,0x17,0x5b,0x02,0x16,0x5b,0x02,0x82, 0x17,0x5a,0x01,0x05,0x18,0x5b,0x02,0x16,0x5a,0x01,0x17,0x5b,0x02,0x16,0x5b, 0x02,0x14,0x5a,0x01,0x82,0x16,0x58,0x02,0x04,0x16,0x59,0x01,0x17,0x58,0x01, 0x17,0x5a,0x02,0x17,0x5a,0x03,0x82,0x15,0x58,0x02,0x03,0x15,0x56,0x00,0x16, 0x57,0x00,0x16,0x58,0x02,0x82,0x15,0x56,0x01,0x05,0x17,0x57,0x02,0x16,0x54, 0x01,0x16,0x56,0x00,0x16,0x55,0x00,0x15,0x55,0x00,0x82,0x16,0x55,0x02,0x02, 0x15,0x54,0x02,0x16,0x55,0x01,0x83,0x16,0x54,0x01,0x05,0x16,0x53,0x01,0x16, 0x53,0x02,0x15,0x53,0x02,0x15,0x52,0x00,0x14,0x52,0x00,0x82,0x15,0x53,0x00, 0x0d,0x16,0x52,0x01,0x14,0x52,0x01,0x16,0x52,0x01,0x16,0x51,0x01,0x15,0x50, 0x01,0x14,0x52,0x00,0x16,0x51,0x02,0x15,0x4f,0x01,0x14,0x4f,0x01,0x14,0x4f, 0x00,0x15,0x4f,0x01,0x14,0x4d,0x00,0x13,0x4d,0x01,0x82,0x15,0x4e,0x01,0x0d, 0x15,0x4e,0x00,0x15,0x4e,0x02,0x14,0x4e,0x01,0x14,0x4e,0x02,0x15,0x4e,0x01, 0x14,0x4d,0x00,0x14,0x4c,0x00,0x13,0x4b,0x01,0x14,0x4d,0x01,0x14,0x4c,0x01, 0x13,0x4b,0x00,0x14,0x4a,0x01,0x15,0x4b,0x01,0x82,0x13,0x49,0x00,0x82,0x14, 0x4a,0x00,0x01,0x13,0x49,0x01,0x82,0x13,0x48,0x01,0x0e,0x14,0x4a,0x02,0x12, 0x47,0x00,0x13,0x48,0x00,0x12,0x47,0x00,0x12,0x47,0x01,0x12,0x47,0x00,0x13, 0x47,0x00,0x12,0x48,0x00,0x13,0x47,0x00,0x12,0x47,0x00,0x12,0x46,0x00,0x11, 0x46,0x00,0x13,0x46,0x01,0x12,0x46,0x00,0x84,0x12,0x46,0x01,0x04,0x12,0x44, 0x00,0x11,0x43,0x00,0x12,0x44,0x01,0x11,0x44,0x00,0x82,0x12,0x44,0x01,0x18, 0x10,0x42,0x00,0x12,0x43,0x01,0x11,0x42,0x00,0x11,0x41,0x00,0x11,0x40,0x01, 0x12,0x41,0x01,0x11,0x41,0x00,0x11,0x41,0x01,0x12,0x41,0x00,0x11,0x41,0x01, 0x10,0x40,0x01,0x11,0x3f,0x00,0x10,0x3f,0x01,0x11,0x3f,0x02,0x10,0x3f,0x01, 0x10,0x3e,0x00,0x10,0x3e,0x01,0x11,0x3f,0x00,0x10,0x3e,0x01,0x10,0x3d,0x00, 0x0f,0x3d,0x00,0x0f,0x3c,0x01,0x0f,0x3b,0x01,0x10,0x3c,0x02,0x82,0x10,0x3c, 0x01,0x82,0x0f,0x3b,0x00,0x04,0x0f,0x3a,0x01,0x10,0x3a,0x02,0x0f,0x3a,0x01, 0x0f,0x3a,0x02,0x82,0x0f,0x39,0x00,0x82,0x0e,0x39,0x01,0x03,0x0e,0x38,0x00, 0x0f,0x38,0x00,0x0f,0x38,0x02,0x85,0x0e,0x36,0x01,0x03,0x0e,0x35,0x01,0x0e, 0x35,0x00,0x0e,0x36,0x01,0x82,0x0d,0x34,0x01,0x0a,0x0e,0x34,0x00,0x0e,0x33, 0x00,0x0d,0x33,0x00,0x0e,0x33,0x00,0x0e,0x34,0x01,0x0d,0x33,0x00,0x0d,0x32, 0x01,0x0d,0x31,0x00,0x0d,0x31,0x01,0x0e,0x32,0x02,0x82,0x0d,0x31,0x01,0x05, 0x0d,0x30,0x01,0x0c,0x2f,0x01,0x0d,0x30,0x01,0x0c,0x30,0x01,0x0b,0x2f,0x00, 0x83,0x0c,0x2f,0x01,0x82,0x0c,0x2e,0x01,0x16,0x0c,0x2f,0x01,0x0b,0x2e,0x00, 0x0c,0x2e,0x01,0x0c,0x2d,0x02,0x0b,0x2d,0x01,0x0b,0x2d,0x00,0x0b,0x2d,0x01, 0x0a,0x2d,0x01,0x0b,0x2d,0x01,0x0b,0x2b,0x00,0x0b,0x2c,0x00,0x0b,0x2b,0x00, 0x0a,0x2a,0x00,0x0b,0x2b,0x01,0x0b,0x2a,0x01,0x0a,0x2a,0x00,0x0a,0x29,0x00, 0x0a,0x29,0x01,0x0a,0x29,0x00,0x0a,0x28,0x00,0x09,0x28,0x00,0x0a,0x28,0x01, 0x82,0x0a,0x27,0x00,0x08,0x09,0x27,0x00,0x09,0x26,0x00,0x0a,0x26,0x00,0x09, 0x25,0x00,0x09,0x26,0x00,0x09,0x25,0x00,0x0a,0x25,0x00,0x09,0x25,0x00,0x82, 0x09,0x24,0x01,0x82,0x09,0x24,0x00,0x03,0x08,0x23,0x00,0x09,0x23,0x00,0x09, 0x22,0x00,0x82,0x08,0x22,0x00,0x85,0x08,0x21,0x00,0x84,0x08,0x20,0x00,0x02, 0x08,0x1f,0x00,0x07,0x1f,0x00,0x83,0x07,0x1e,0x00,0x82,0x07,0x1d,0x00,0x85, 0x07,0x1c,0x00,0x82,0x06,0x1b,0x00,0x02,0x06,0x1a,0x00,0x06,0x1b,0x00,0x82, 0x06,0x1a,0x00,0x01,0x06,0x19,0x00,0x83,0x06,0x18,0x00,0x02,0x05,0x17,0x00, 0x06,0x17,0x00,0x86,0x05,0x17,0x00,0x82,0x05,0x16,0x00,0x82,0x04,0x15,0x00, 0x02,0x05,0x15,0x00,0x04,0x15,0x00,0x83,0x04,0x14,0x00,0x83,0x04,0x13,0x00, 0x01,0x04,0x12,0x00,0x82,0x03,0x12,0x00,0x83,0x03,0x11,0x00,0x01,0x04,0x11, 0x00,0x83,0x03,0x10,0x00,0x82,0x03,0x0f,0x00,0x04,0x02,0x0f,0x00,0x03,0x0f, 0x00,0x03,0x0e,0x00,0x02,0x0e,0x00,0x84,0x02,0x0d,0x00,0x83,0x02,0x0c,0x00, 0x84,0x02,0x0b,0x00,0x84,0x01,0x0a,0x00,0x83,0x01,0x09,0x00,0x84,0x01,0x08, 0x00,0x01,0x01,0x07,0x00,0x82,0x00,0x07,0x00,0x84,0x00,0x06,0x00,0x83,0x00, 0x05,0x00,0x84,0x00,0x04,0x00,0x83,0x00,0x03,0x00,0x84,0x00,0x02,0x00,0x84, 0x00,0x01,0x00,0xde,0x00,0x00,0x00,0x05,0x34,0x8a,0x1a,0x33,0x89,0x19,0x32, 0x88,0x18,0x33,0x89,0x19,0x34,0x8a,0x1a,0x82,0x33,0x89,0x19,0x03,0x34,0x8a, 0x18,0x30,0x88,0x17,0x33,0x8b,0x1a,0x83,0x33,0x89,0x19,0x03,0x34,0x8a,0x1a, 0x30,0x86,0x16,0x32,0x8a,0x19,0x82,0x32,0x88,0x18,0x82,0x33,0x8b,0x1a,0x03, 0x34,0x8a,0x1a,0x32,0x88,0x18,0x35,0x8b,0x1b,0x82,0x32,0x88,0x18,0x04,0x33, 0x89,0x19,0x32,0x8a,0x19,0x31,0x89,0x18,0x31,0x87,0x17,0x82,0x33,0x89,0x19, 0x05,0x30,0x88,0x17,0x32,0x88,0x18,0x30,0x86,0x14,0x32,0x8a,0x17,0x30,0x88, 0x15,0x82,0x31,0x87,0x17,0x02,0x32,0x88,0x18,0x31,0x89,0x18,0x82,0x30,0x88, 0x17,0x82,0x30,0x88,0x15,0x82,0x32,0x88,0x18,0x07,0x31,0x87,0x17,0x30,0x88, 0x17,0x31,0x89,0x18,0x30,0x88,0x17,0x2f,0x87,0x16,0x30,0x86,0x16,0x31,0x87, 0x17,0x82,0x32,0x88,0x18,0x07,0x2f,0x85,0x15,0x30,0x88,0x17,0x2f,0x89,0x18, 0x31,0x89,0x16,0x2f,0x87,0x14,0x30,0x88,0x15,0x31,0x89,0x16,0x82,0x30,0x86, 0x16,0x03,0x31,0x89,0x16,0x31,0x89,0x18,0x32,0x8a,0x19,0x82,0x30,0x88,0x17, 0x08,0x31,0x89,0x18,0x30,0x88,0x17,0x2c,0x82,0x12,0x2e,0x86,0x15,0x30,0x88, 0x17,0x32,0x8a,0x19,0x2f,0x87,0x14,0x2e,0x86,0x13,0x83,0x2f,0x87,0x14,0x03, 0x2f,0x87,0x16,0x30,0x88,0x15,0x2e,0x86,0x13,0x82,0x30,0x86,0x14,0x01,0x32, 0x8a,0x17,0x82,0x31,0x89,0x16,0x03,0x2d,0x85,0x12,0x30,0x88,0x15,0x31,0x89, 0x16,0x83,0x2f,0x87,0x14,0x06,0x30,0x88,0x15,0x31,0x89,0x14,0x2d,0x85,0x12, 0x30,0x88,0x15,0x2e,0x86,0x13,0x2d,0x88,0x14,0x82,0x2e,0x89,0x15,0x82,0x30, 0x88,0x15,0x01,0x2e,0x86,0x13,0x82,0x2f,0x87,0x14,0x01,0x2e,0x89,0x15,0x82, 0x2d,0x88,0x14,0x03,0x30,0x88,0x15,0x30,0x88,0x13,0x2c,0x87,0x13,0x82,0x2f, 0x8a,0x16,0x08,0x30,0x8b,0x17,0x2c,0x87,0x13,0x31,0x89,0x16,0x2e,0x89,0x15, 0x2f,0x8a,0x14,0x30,0x8b,0x17,0x2e,0x89,0x15,0x2d,0x88,0x14,0x82,0x2e,0x89, 0x15,0x08,0x31,0x89,0x16,0x2f,0x87,0x14,0x2c,0x87,0x13,0x2f,0x8a,0x14,0x2e, 0x89,0x13,0x30,0x8b,0x15,0x2e,0x89,0x13,0x30,0x8b,0x15,0x83,0x2e,0x89,0x13, 0x82,0x2c,0x89,0x12,0x0c,0x30,0x8b,0x15,0x2f,0x8b,0x11,0x2d,0x89,0x0f,0x2d, 0x88,0x12,0x2e,0x8b,0x12,0x2f,0x8c,0x15,0x2f,0x8c,0x13,0x2e,0x8b,0x12,0x30, 0x8d,0x13,0x32,0x8f,0x15,0x31,0x8f,0x12,0x32,0x8f,0x15,0x82,0x30,0x8d,0x13, 0x03,0x32,0x90,0x13,0x34,0x91,0x15,0x32,0x90,0x13,0x82,0x34,0x91,0x15,0x08, 0x32,0x90,0x11,0x34,0x91,0x13,0x35,0x92,0x14,0x32,0x92,0x13,0x31,0x91,0x12, 0x33,0x93,0x14,0x37,0x94,0x16,0x31,0x91,0x12,0x82,0x32,0x92,0x11,0x82,0x34, 0x94,0x15,0x03,0x35,0x95,0x14,0x34,0x94,0x12,0x36,0x96,0x14,0x82,0x35,0x95, 0x13,0x03,0x36,0x96,0x15,0x35,0x95,0x14,0x37,0x97,0x16,0x82,0x36,0x96,0x14, 0x0c,0x39,0x9a,0x18,0x37,0x98,0x13,0x38,0x99,0x14,0x39,0x9a,0x13,0x39,0x9b, 0x14,0x39,0x9a,0x15,0x3a,0x9c,0x17,0x3a,0x9e,0x16,0x3b,0x9f,0x17,0x39,0x9d, 0x15,0x3a,0x9c,0x15,0x3a,0x9e,0x16,0x83,0x39,0x9d,0x15,0x09,0x3b,0x9d,0x16, 0x3a,0x9e,0x16,0x3c,0xa0,0x18,0x3b,0x9f,0x17,0x3a,0x9e,0x16,0x3b,0x9f,0x17, 0x3d,0xa1,0x17,0x3c,0xa0,0x16,0x3a,0x9e,0x14,0x82,0x3b,0x9f,0x15,0x01,0x3c, 0xa0,0x16,0x82,0x3c,0xa2,0x17,0x02,0x3b,0xa1,0x16,0x3c,0xa2,0x17,0x82,0x3c, 0xa2,0x16,0x06,0x3c,0xa2,0x17,0x3d,0xa3,0x18,0x3d,0xa1,0x16,0x3e,0xa2,0x17, 0x3e,0xa4,0x18,0x3d,0xa3,0x17,0x83,0x3e,0xa4,0x18,0x01,0x3f,0xa5,0x19,0x82, 0x40,0xa7,0x18,0x18,0x40,0xa7,0x16,0x41,0xa8,0x17,0x42,0xa9,0x18,0x3f,0xa6, 0x15,0x41,0xa8,0x17,0x42,0xa9,0x18,0x40,0xa7,0x16,0x43,0xaa,0x19,0x3f,0xa9, 0x17,0x41,0xab,0x19,0x42,0xac,0x18,0x42,0xac,0x16,0x43,0xac,0x17,0x43,0xac, 0x19,0x41,0xab,0x17,0x43,0xac,0x1b,0x43,0xaa,0x17,0x42,0xac,0x18,0x43,0xac, 0x19,0x46,0xac,0x1a,0x44,0xab,0x18,0x43,0xac,0x19,0x45,0xae,0x1b,0x45,0xab, 0x18,0x82,0x42,0xa9,0x18,0x0f,0x45,0xac,0x1b,0x46,0xac,0x1c,0x43,0xaa,0x19, 0x44,0xab,0x1a,0x47,0xac,0x1c,0x44,0xa9,0x19,0x45,0xac,0x19,0x46,0xac,0x1a, 0x47,0xad,0x1b,0x47,0xad,0x1c,0x46,0xac,0x1c,0x45,0xac,0x1b,0x46,0xac,0x1c, 0x46,0xac,0x1d,0x45,0xaa,0x1c,0x82,0x46,0xab,0x1c,0x03,0x47,0xac,0x1d,0x46, 0xab,0x1c,0x46,0xaa,0x1e,0x82,0x46,0xa9,0x1c,0x01,0x47,0xaa,0x1e,0x82,0x47, 0xac,0x1d,0x03,0x45,0xa9,0x1d,0x46,0xa9,0x1d,0x47,0xaa,0x1e,0x82,0x46,0xa9, 0x1d,0x2f,0x45,0xa8,0x1c,0x48,0xab,0x1f,0x46,0xa8,0x1e,0x44,0xa7,0x1c,0x48, 0xab,0x1f,0x45,0xa8,0x1c,0x47,0xaa,0x1e,0x46,0xa8,0x1e,0x48,0xac,0x1e,0x44, 0xa7,0x1c,0x47,0xaa,0x1e,0x45,0xa8,0x1c,0x44,0xa7,0x1c,0x48,0xab,0x1f,0x47, 0xaa,0x1e,0x48,0xa8,0x1d,0x45,0xa8,0x1c,0x47,0xaa,0x1e,0x48,0xa8,0x1c,0x47, 0xaa,0x1c,0x46,0xa9,0x1d,0x43,0xa6,0x1b,0x46,0xa9,0x1c,0x45,0xa7,0x19,0x47, 0xa6,0x1c,0x46,0xa7,0x1c,0x43,0xa5,0x1a,0x42,0xa3,0x1b,0x42,0xa0,0x19,0x45, 0xa3,0x1a,0x45,0xa2,0x1a,0x42,0xa2,0x1b,0x42,0x9f,0x1a,0x40,0x9d,0x18,0x3e, 0x9b,0x16,0x3e,0x9a,0x16,0x40,0x9c,0x17,0x3c,0x97,0x15,0x3a,0x94,0x14,0x3c, 0x96,0x16,0x3c,0x95,0x14,0x3a,0x93,0x12,0x3c,0x94,0x16,0x37,0x8f,0x10,0x39, 0x90,0x14,0x39,0x90,0x15,0x3a,0x8f,0x17,0x82,0x36,0x8a,0x12,0x11,0x37,0x89, 0x12,0x36,0x87,0x12,0x34,0x85,0x10,0x33,0x84,0x0f,0x33,0x83,0x11,0x33,0x84, 0x12,0x32,0x82,0x10,0x2c,0x7b,0x0e,0x25,0x73,0x07,0x23,0x70,0x05,0x23,0x71, 0x06,0x22,0x70,0x07,0x21,0x6e,0x06,0x21,0x6f,0x07,0x20,0x6e,0x06,0x20,0x6d, 0x05,0x1f,0x6a,0x06,0x82,0x1e,0x69,0x05,0x01,0x1d,0x68,0x04,0x82,0x1d,0x67, 0x04,0x07,0x1c,0x66,0x05,0x1c,0x65,0x02,0x1c,0x65,0x05,0x1c,0x64,0x04,0x1b, 0x63,0x03,0x1c,0x63,0x04,0x1c,0x61,0x02,0x82,0x19,0x60,0x03,0x09,0x1b,0x5f, 0x03,0x1a,0x5e,0x02,0x19,0x5d,0x01,0x18,0x5e,0x02,0x19,0x5f,0x03,0x17,0x5d, 0x01,0x16,0x5c,0x00,0x16,0x5b,0x00,0x19,0x5c,0x02,0x82,0x16,0x5b,0x01,0x06, 0x17,0x5c,0x02,0x17,0x5b,0x02,0x15,0x5a,0x00,0x15,0x59,0x00,0x16,0x5a,0x01, 0x16,0x5a,0x02,0x83,0x16,0x59,0x01,0x01,0x17,0x59,0x00,0x82,0x16,0x59,0x00, 0x83,0x15,0x57,0x01,0x82,0x17,0x58,0x02,0x06,0x15,0x56,0x01,0x14,0x56,0x00, 0x17,0x56,0x01,0x16,0x55,0x01,0x15,0x56,0x00,0x16,0x56,0x00,0x82,0x16,0x56, 0x02,0x82,0x15,0x55,0x02,0x01,0x16,0x56,0x01,0x83,0x16,0x55,0x01,0x06,0x15, 0x54,0x01,0x15,0x53,0x01,0x14,0x52,0x01,0x15,0x53,0x01,0x15,0x52,0x01,0x14, 0x52,0x00,0x82,0x15,0x54,0x01,0x02,0x14,0x51,0x00,0x14,0x52,0x02,0x82,0x14, 0x52,0x01,0x03,0x15,0x51,0x02,0x14,0x53,0x01,0x15,0x50,0x01,0x82,0x14,0x50, 0x00,0x03,0x15,0x50,0x01,0x14,0x50,0x01,0x13,0x50,0x01,0x82,0x14,0x50,0x01, 0x02,0x14,0x4f,0x01,0x15,0x4e,0x01,0x82,0x14,0x4d,0x01,0x24,0x14,0x4e,0x01, 0x14,0x4e,0x02,0x15,0x4f,0x01,0x14,0x4d,0x00,0x13,0x4d,0x00,0x15,0x4e,0x01, 0x13,0x4c,0x00,0x12,0x4b,0x00,0x14,0x4c,0x00,0x13,0x4b,0x00,0x14,0x4c,0x01, 0x13,0x4b,0x00,0x12,0x4a,0x00,0x13,0x4a,0x00,0x13,0x49,0x00,0x13,0x4a,0x02, 0x12,0x49,0x01,0x12,0x4a,0x00,0x13,0x49,0x00,0x13,0x48,0x00,0x13,0x49,0x02, 0x12,0x48,0x00,0x13,0x48,0x00,0x12,0x49,0x00,0x12,0x48,0x00,0x12,0x48,0x01, 0x13,0x48,0x01,0x13,0x47,0x01,0x13,0x46,0x00,0x12,0x46,0x00,0x11,0x46,0x00, 0x12,0x47,0x02,0x11,0x45,0x00,0x12,0x45,0x01,0x12,0x44,0x00,0x11,0x44,0x00, 0x82,0x12,0x44,0x01,0x05,0x11,0x43,0x00,0x12,0x44,0x01,0x11,0x43,0x00,0x12, 0x44,0x01,0x11,0x43,0x01,0x82,0x11,0x41,0x00,0x12,0x11,0x41,0x01,0x11,0x41, 0x00,0x11,0x41,0x01,0x12,0x41,0x01,0x11,0x41,0x01,0x11,0x40,0x01,0x11,0x40, 0x02,0x11,0x40,0x01,0x10,0x3f,0x00,0x10,0x3e,0x00,0x10,0x3f,0x01,0x11,0x3f, 0x01,0x10,0x3e,0x01,0x10,0x3d,0x01,0x10,0x3d,0x02,0x11,0x3d,0x01,0x10,0x3c, 0x01,0x0f,0x3b,0x01,0x82,0x0f,0x3c,0x01,0x03,0x10,0x3d,0x01,0x10,0x3b,0x01, 0x11,0x3b,0x01,0x82,0x0f,0x3a,0x01,0x03,0x0e,0x39,0x01,0x0f,0x39,0x01,0x0f, 0x3a,0x01,0x82,0x0f,0x39,0x00,0x01,0x0f,0x39,0x02,0x83,0x0f,0x39,0x00,0x82, 0x0e,0x38,0x00,0x83,0x0e,0x37,0x00,0x11,0x0e,0x37,0x01,0x0e,0x36,0x01,0x0d, 0x37,0x01,0x0d,0x35,0x01,0x0d,0x35,0x00,0x0d,0x35,0x01,0x0e,0x34,0x01,0x0d, 0x34,0x01,0x0d,0x34,0x00,0x0d,0x35,0x01,0x0d,0x34,0x00,0x0d,0x33,0x00,0x0d, 0x33,0x01,0x0d,0x32,0x01,0x0d,0x33,0x01,0x0c,0x31,0x00,0x0d,0x32,0x00,0x82, 0x0d,0x32,0x01,0x06,0x0d,0x31,0x01,0x0c,0x31,0x01,0x0c,0x30,0x01,0x0d,0x30, 0x01,0x0c,0x2f,0x01,0x0c,0x2e,0x00,0x82,0x0c,0x2e,0x01,0x01,0x0c,0x2f,0x01, 0x82,0x0c,0x2e,0x01,0x03,0x0b,0x2d,0x00,0x0b,0x2d,0x02,0x0b,0x2c,0x00,0x82, 0x0b,0x2d,0x01,0x05,0x0b,0x2c,0x00,0x0c,0x2d,0x01,0x0b,0x2c,0x01,0x0c,0x2b, 0x01,0x0a,0x2b,0x00,0x83,0x0a,0x2a,0x00,0x03,0x0a,0x2a,0x01,0x0b,0x2a,0x01, 0x0b,0x29,0x01,0x82,0x0a,0x29,0x01,0x01,0x0a,0x27,0x00,0x82,0x0a,0x28,0x01, 0x82,0x09,0x26,0x00,0x04,0x0a,0x27,0x01,0x09,0x26,0x00,0x09,0x25,0x00,0x0a, 0x25,0x00,0x83,0x09,0x25,0x00,0x01,0x09,0x24,0x00,0x83,0x09,0x23,0x00,0x04, 0x08,0x23,0x00,0x09,0x22,0x00,0x09,0x21,0x00,0x08,0x22,0x01,0x82,0x08,0x22, 0x00,0x02,0x08,0x21,0x01,0x09,0x20,0x00,0x82,0x08,0x20,0x00,0x02,0x07,0x20, 0x00,0x08,0x20,0x00,0x82,0x08,0x1f,0x00,0x02,0x07,0x1f,0x00,0x08,0x1e,0x00, 0x82,0x07,0x1e,0x00,0x82,0x07,0x1d,0x00,0x83,0x07,0x1c,0x00,0x02,0x06,0x1c, 0x00,0x07,0x1c,0x00,0x82,0x06,0x1c,0x00,0x83,0x06,0x1b,0x00,0x03,0x06,0x1a, 0x00,0x05,0x19,0x00,0x06,0x19,0x00,0x82,0x06,0x1a,0x00,0x01,0x05,0x19,0x00, 0x84,0x05,0x18,0x00,0x84,0x05,0x17,0x00,0x83,0x05,0x16,0x00,0x82,0x05,0x15, 0x00,0x83,0x04,0x14,0x00,0x83,0x04,0x13,0x00,0x83,0x04,0x12,0x00,0x82,0x03, 0x11,0x00,0x01,0x04,0x11,0x00,0x85,0x03,0x10,0x00,0x83,0x03,0x0f,0x00,0x02, 0x03,0x0e,0x00,0x02,0x0e,0x00,0x84,0x02,0x0d,0x00,0x83,0x02,0x0c,0x00,0x84, 0x02,0x0b,0x00,0x84,0x01,0x0a,0x00,0x83,0x01,0x09,0x00,0x84,0x01,0x08,0x00, 0x01,0x01,0x07,0x00,0x82,0x00,0x07,0x00,0x84,0x00,0x06,0x00,0x83,0x00,0x05, 0x00,0x84,0x00,0x04,0x00,0x84,0x00,0x03,0x00,0x83,0x00,0x02,0x00,0x84,0x00, 0x01,0x00,0xde,0x00,0x00,0x00,0x82,0x32,0x89,0x18,0x08,0x34,0x8b,0x1a,0x33, 0x8a,0x19,0x32,0x89,0x18,0x33,0x8a,0x19,0x34,0x8b,0x1a,0x33,0x8a,0x19,0x33, 0x8c,0x1a,0x32,0x8b,0x19,0x82,0x31,0x88,0x17,0x82,0x34,0x8b,0x1a,0x03,0x31, 0x88,0x17,0x35,0x8c,0x1b,0x31,0x88,0x17,0x83,0x33,0x8a,0x19,0x10,0x34,0x8b, 0x1a,0x31,0x88,0x17,0x33,0x8a,0x19,0x32,0x89,0x18,0x33,0x8a,0x19,0x32,0x89, 0x18,0x31,0x88,0x17,0x33,0x8a,0x19,0x31,0x88,0x17,0x34,0x8b,0x1a,0x33,0x8a, 0x19,0x32,0x89,0x18,0x34,0x89,0x19,0x32,0x89,0x18,0x33,0x8a,0x19,0x32,0x89, 0x18,0x83,0x31,0x88,0x17,0x82,0x31,0x8a,0x18,0x07,0x32,0x8b,0x19,0x32,0x89, 0x18,0x30,0x89,0x17,0x32,0x89,0x18,0x32,0x87,0x17,0x31,0x88,0x17,0x30,0x87, 0x16,0x82,0x31,0x8a,0x16,0x02,0x31,0x8a,0x18,0x32,0x89,0x18,0x84,0x31,0x88, 0x17,0x01,0x30,0x89,0x17,0x82,0x31,0x8a,0x18,0x01,0x2f,0x88,0x16,0x83,0x30, 0x87,0x16,0x03,0x2f,0x85,0x17,0x31,0x88,0x17,0x2f,0x86,0x15,0x82,0x30,0x89, 0x17,0x05,0x2f,0x88,0x16,0x30,0x89,0x17,0x2f,0x88,0x16,0x2d,0x83,0x15,0x30, 0x87,0x16,0x82,0x2e,0x87,0x15,0x82,0x2f,0x88,0x16,0x02,0x2d,0x86,0x14,0x2e, 0x87,0x15,0x82,0x2f,0x88,0x16,0x03,0x30,0x89,0x15,0x31,0x8a,0x16,0x2e,0x87, 0x13,0x83,0x2f,0x88,0x14,0x02,0x30,0x89,0x15,0x2e,0x87,0x13,0x82,0x2f,0x88, 0x14,0x07,0x2e,0x87,0x13,0x30,0x89,0x17,0x2f,0x88,0x14,0x31,0x8a,0x16,0x30, 0x89,0x15,0x2f,0x88,0x14,0x31,0x8a,0x16,0x82,0x2e,0x87,0x13,0x82,0x30,0x89, 0x15,0x01,0x2e,0x87,0x13,0x82,0x2f,0x88,0x14,0x05,0x30,0x89,0x15,0x2f,0x88, 0x14,0x31,0x8a,0x16,0x2f,0x88,0x14,0x2e,0x87,0x13,0x82,0x2f,0x88,0x14,0x08, 0x2e,0x87,0x13,0x2e,0x8a,0x15,0x2f,0x8b,0x16,0x2c,0x88,0x13,0x2d,0x89,0x14, 0x2f,0x88,0x14,0x2e,0x8a,0x15,0x2d,0x89,0x14,0x82,0x2f,0x88,0x14,0x03,0x30, 0x89,0x15,0x2e,0x8a,0x15,0x2f,0x8b,0x16,0x82,0x2e,0x87,0x13,0x07,0x2d,0x89, 0x14,0x2f,0x8b,0x14,0x2d,0x89,0x12,0x2e,0x8a,0x13,0x2d,0x89,0x12,0x2e,0x8a, 0x13,0x31,0x8d,0x16,0x83,0x2e,0x8a,0x13,0x02,0x2d,0x89,0x12,0x2f,0x8b,0x16, 0x82,0x2e,0x8a,0x13,0x08,0x2f,0x8b,0x16,0x30,0x8c,0x15,0x2d,0x89,0x12,0x2d, 0x8b,0x11,0x2c,0x8a,0x10,0x2d,0x8b,0x11,0x30,0x8c,0x13,0x2f,0x8b,0x12,0x82, 0x30,0x8c,0x13,0x01,0x2e,0x8b,0x10,0x82,0x2f,0x8d,0x12,0x06,0x30,0x8e,0x13, 0x2f,0x8d,0x12,0x30,0x8e,0x13,0x2f,0x8d,0x12,0x30,0x8e,0x13,0x32,0x90,0x15, 0x83,0x32,0x91,0x13,0x0b,0x36,0x94,0x17,0x34,0x92,0x15,0x31,0x92,0x12,0x30, 0x91,0x11,0x33,0x94,0x14,0x31,0x91,0x14,0x33,0x94,0x14,0x33,0x94,0x12,0x35, 0x96,0x14,0x34,0x95,0x13,0x35,0x96,0x14,0x82,0x34,0x95,0x13,0x01,0x33,0x94, 0x11,0x82,0x36,0x97,0x14,0x82,0x36,0x97,0x15,0x06,0x36,0x97,0x14,0x36,0x97, 0x15,0x36,0x97,0x14,0x37,0x98,0x15,0x38,0x99,0x16,0x36,0x99,0x13,0x83,0x39, 0x9b,0x15,0x01,0x38,0x9b,0x15,0x82,0x3a,0x9d,0x17,0x10,0x39,0x9b,0x15,0x3b, 0x9d,0x17,0x3a,0x9c,0x16,0x3a,0x9e,0x15,0x3c,0xa0,0x17,0x3a,0x9e,0x15,0x3b, 0x9f,0x16,0x3c,0xa0,0x17,0x3d,0xa1,0x18,0x3c,0xa0,0x17,0x3d,0xa1,0x18,0x3a, 0x9e,0x15,0x3b,0x9f,0x14,0x3b,0xa1,0x15,0x3c,0xa2,0x16,0x3d,0xa3,0x17,0x83, 0x3c,0xa2,0x16,0x16,0x3b,0xa1,0x15,0x3c,0xa2,0x16,0x3e,0xa2,0x17,0x3e,0xa2, 0x16,0x3d,0xa3,0x17,0x3e,0xa4,0x18,0x3e,0xa4,0x17,0x3d,0xa3,0x16,0x3e,0xa4, 0x17,0x3f,0xa6,0x16,0x40,0xa7,0x17,0x3f,0xa6,0x14,0x40,0xa7,0x17,0x41,0xa8, 0x18,0x40,0xa7,0x17,0x40,0xa7,0x15,0x41,0xa8,0x16,0x40,0xa7,0x15,0x41,0xab, 0x18,0x3f,0xa9,0x16,0x40,0xaa,0x15,0x43,0xad,0x18,0x82,0x41,0xab,0x16,0x82, 0x43,0xad,0x18,0x05,0x42,0xac,0x17,0x43,0xad,0x18,0x44,0xab,0x17,0x44,0xae, 0x19,0x42,0xac,0x17,0x82,0x44,0xab,0x17,0x15,0x42,0xac,0x17,0x43,0xad,0x1a, 0x45,0xac,0x1a,0x46,0xad,0x1b,0x45,0xac,0x1a,0x46,0xad,0x1b,0x46,0xad,0x19, 0x45,0xac,0x18,0x46,0xad,0x19,0x48,0xaf,0x1b,0x47,0xad,0x19,0x47,0xae,0x1c, 0x46,0xad,0x1b,0x46,0xad,0x19,0x48,0xaf,0x1b,0x48,0xb0,0x1c,0x48,0xaf,0x1d, 0x47,0xae,0x1c,0x44,0xab,0x1b,0x48,0xad,0x1e,0x46,0xab,0x1c,0x82,0x47,0xac, 0x1d,0x82,0x48,0xad,0x1e,0x05,0x45,0xaa,0x1b,0x46,0xa9,0x1b,0x48,0xab,0x1f, 0x46,0xab,0x1c,0x47,0xac,0x1d,0x84,0x47,0xaa,0x1e,0x07,0x45,0xa7,0x1d,0x46, 0xa9,0x1d,0x48,0xab,0x1f,0x47,0xa9,0x1f,0x45,0xa8,0x1c,0x47,0xaa,0x1e,0x46, 0xa9,0x1d,0x82,0x45,0xa8,0x1c,0x0d,0x48,0xac,0x1e,0x47,0xaa,0x1c,0x48,0xab, 0x1f,0x45,0xa8,0x1c,0x47,0xaa,0x1e,0x48,0xab,0x1d,0x46,0xa9,0x1b,0x47,0xaa, 0x1c,0x48,0xab,0x1f,0x46,0xa9,0x1b,0x45,0xa8,0x1a,0x47,0xaa,0x1c,0x46,0xa9, 0x1d,0x82,0x46,0xa9,0x1b,0x11,0x46,0xa8,0x1b,0x46,0xa5,0x1b,0x45,0xa6,0x1a, 0x44,0xa6,0x1a,0x43,0xa4,0x19,0x45,0xa3,0x19,0x48,0xa6,0x1c,0x46,0xa3,0x1a, 0x42,0xa2,0x1a,0x42,0x9f,0x19,0x44,0xa1,0x19,0x42,0x9f,0x17,0x3f,0x9e,0x18, 0x3e,0x9d,0x17,0x3d,0x9b,0x15,0x3d,0x98,0x14,0x3b,0x97,0x13,0x83,0x3a,0x95, 0x12,0x0a,0x3c,0x94,0x15,0x3b,0x93,0x14,0x3b,0x93,0x15,0x37,0x8f,0x13,0x38, 0x8e,0x12,0x35,0x8d,0x11,0x36,0x8b,0x10,0x36,0x8a,0x12,0x37,0x8a,0x13,0x34, 0x87,0x11,0x82,0x32,0x85,0x0f,0x10,0x32,0x83,0x0f,0x31,0x82,0x10,0x2f,0x80, 0x10,0x29,0x78,0x0b,0x24,0x72,0x06,0x23,0x71,0x08,0x22,0x6f,0x07,0x21,0x6f, 0x04,0x23,0x6f,0x05,0x23,0x6e,0x07,0x23,0x6e,0x06,0x21,0x6c,0x06,0x20,0x6b, 0x06,0x1f,0x6a,0x05,0x1f,0x69,0x05,0x20,0x6a,0x06,0x82,0x1e,0x68,0x04,0x0d, 0x1d,0x66,0x05,0x1c,0x65,0x04,0x1b,0x64,0x03,0x1c,0x65,0x04,0x1a,0x63,0x02, 0x1b,0x63,0x03,0x1a,0x62,0x02,0x1a,0x62,0x04,0x1a,0x60,0x03,0x1a,0x5f,0x03, 0x19,0x60,0x03,0x18,0x5f,0x02,0x18,0x5e,0x02,0x82,0x18,0x5f,0x03,0x09,0x18, 0x5c,0x01,0x19,0x5c,0x02,0x16,0x5c,0x01,0x16,0x5b,0x00,0x16,0x5c,0x01,0x15, 0x5b,0x00,0x15,0x5a,0x00,0x18,0x5a,0x01,0x17,0x5b,0x02,0x83,0x16,0x5a,0x01, 0x01,0x17,0x5a,0x00,0x82,0x16,0x59,0x01,0x0b,0x15,0x58,0x01,0x16,0x59,0x02, 0x15,0x59,0x02,0x16,0x58,0x02,0x15,0x57,0x01,0x14,0x57,0x01,0x15,0x57,0x01, 0x17,0x56,0x02,0x16,0x57,0x02,0x16,0x57,0x00,0x16,0x56,0x02,0x82,0x15,0x56, 0x02,0x0b,0x15,0x55,0x02,0x14,0x55,0x02,0x16,0x56,0x01,0x17,0x56,0x02,0x16, 0x55,0x01,0x15,0x54,0x00,0x14,0x53,0x01,0x16,0x54,0x02,0x15,0x53,0x01,0x15, 0x54,0x02,0x15,0x52,0x01,0x82,0x15,0x53,0x02,0x0a,0x15,0x52,0x01,0x14,0x51, 0x01,0x14,0x52,0x02,0x14,0x54,0x01,0x14,0x52,0x01,0x15,0x51,0x02,0x14,0x51, 0x01,0x15,0x50,0x00,0x15,0x51,0x00,0x14,0x50,0x00,0x83,0x14,0x50,0x01,0x1e, 0x15,0x51,0x02,0x14,0x50,0x01,0x13,0x4e,0x02,0x14,0x4f,0x01,0x14,0x4f,0x00, 0x14,0x4e,0x01,0x14,0x4d,0x01,0x14,0x4c,0x01,0x14,0x4e,0x01,0x14,0x4f,0x01, 0x14,0x4e,0x01,0x14,0x4d,0x01,0x13,0x4c,0x00,0x14,0x4d,0x00,0x14,0x4d,0x01, 0x14,0x4c,0x00,0x13,0x4c,0x02,0x13,0x4b,0x01,0x13,0x4b,0x00,0x14,0x4b,0x01, 0x12,0x4a,0x00,0x13,0x4a,0x00,0x12,0x49,0x00,0x12,0x4a,0x00,0x13,0x49,0x00, 0x13,0x4a,0x01,0x13,0x49,0x00,0x12,0x48,0x00,0x13,0x48,0x00,0x12,0x49,0x00, 0x82,0x12,0x48,0x00,0x0a,0x13,0x48,0x01,0x12,0x48,0x00,0x12,0x46,0x00,0x11, 0x47,0x00,0x11,0x48,0x01,0x12,0x48,0x01,0x11,0x46,0x00,0x12,0x46,0x00,0x12, 0x46,0x01,0x11,0x46,0x00,0x82,0x11,0x45,0x00,0x83,0x11,0x44,0x00,0x05,0x11, 0x43,0x00,0x11,0x44,0x01,0x11,0x43,0x00,0x12,0x42,0x01,0x11,0x42,0x01,0x82, 0x12,0x42,0x01,0x01,0x12,0x41,0x01,0x82,0x10,0x41,0x00,0x04,0x10,0x40,0x00, 0x11,0x41,0x00,0x11,0x40,0x01,0x10,0x40,0x01,0x82,0x10,0x3f,0x00,0x01,0x10, 0x3f,0x01,0x82,0x10,0x3e,0x01,0x02,0x10,0x3e,0x00,0x10,0x3e,0x01,0x82,0x0f, 0x3c,0x01,0x04,0x0f,0x3c,0x00,0x10,0x3d,0x01,0x0f,0x3c,0x01,0x10,0x3c,0x01, 0x82,0x0f,0x3b,0x00,0x03,0x0f,0x3b,0x01,0x0f,0x3b,0x02,0x0f,0x3b,0x01,0x83, 0x0f,0x3a,0x00,0x82,0x0f,0x39,0x00,0x82,0x0f,0x39,0x01,0x01,0x0e,0x38,0x00, 0x82,0x0e,0x37,0x00,0x01,0x0f,0x38,0x01,0x82,0x0d,0x36,0x00,0x03,0x0d,0x37, 0x00,0x0e,0x36,0x01,0x0e,0x36,0x00,0x82,0x0e,0x35,0x00,0x82,0x0d,0x34,0x00, 0x01,0x0e,0x35,0x01,0x82,0x0d,0x33,0x00,0x08,0x0d,0x33,0x01,0x0d,0x32,0x01, 0x0c,0x32,0x01,0x0d,0x31,0x01,0x0d,0x33,0x00,0x0d,0x32,0x00,0x0d,0x31,0x00, 0x0c,0x31,0x01,0x82,0x0c,0x30,0x01,0x03,0x0d,0x30,0x01,0x0c,0x2f,0x00,0x0c, 0x2e,0x00,0x82,0x0b,0x2e,0x00,0x05,0x0b,0x2e,0x01,0x0b,0x2e,0x00,0x0c,0x2e, 0x01,0x0b,0x2d,0x00,0x0b,0x2d,0x01,0x84,0x0b,0x2c,0x00,0x01,0x0b,0x2b,0x00, 0x82,0x0b,0x2c,0x01,0x01,0x0a,0x2b,0x01,0x83,0x0a,0x2a,0x00,0x82,0x0a,0x2a, 0x01,0x83,0x0a,0x29,0x01,0x05,0x0a,0x28,0x01,0x0a,0x29,0x01,0x0a,0x28,0x01, 0x0a,0x27,0x00,0x0a,0x26,0x00,0x82,0x09,0x26,0x00,0x05,0x0a,0x26,0x00,0x0a, 0x25,0x00,0x0a,0x25,0x01,0x09,0x25,0x01,0x09,0x25,0x00,0x82,0x09,0x24,0x00, 0x03,0x09,0x24,0x01,0x09,0x24,0x00,0x09,0x24,0x01,0x82,0x08,0x23,0x00,0x02, 0x09,0x23,0x01,0x08,0x23,0x00,0x82,0x08,0x22,0x00,0x05,0x08,0x22,0x01,0x08, 0x22,0x00,0x08,0x21,0x00,0x07,0x21,0x00,0x08,0x21,0x00,0x82,0x08,0x20,0x00, 0x01,0x08,0x1f,0x00,0x83,0x07,0x1f,0x00,0x83,0x07,0x1e,0x00,0x84,0x07,0x1d, 0x00,0x82,0x06,0x1c,0x00,0x01,0x07,0x1c,0x00,0x82,0x06,0x1b,0x00,0x82,0x06, 0x1a,0x00,0x01,0x05,0x19,0x00,0x82,0x06,0x1a,0x00,0x07,0x05,0x19,0x00,0x06, 0x19,0x00,0x05,0x18,0x00,0x06,0x18,0x00,0x05,0x18,0x00,0x05,0x17,0x00,0x06, 0x17,0x00,0x82,0x05,0x17,0x00,0x83,0x05,0x16,0x00,0x02,0x04,0x15,0x00,0x05, 0x15,0x00,0x83,0x04,0x14,0x00,0x85,0x04,0x13,0x00,0x02,0x04,0x12,0x00,0x03, 0x12,0x00,0x82,0x03,0x11,0x00,0x84,0x03,0x10,0x00,0x84,0x03,0x0f,0x00,0x01, 0x03,0x0e,0x00,0x82,0x02,0x0e,0x00,0x83,0x02,0x0d,0x00,0x83,0x02,0x0c,0x00, 0x82,0x02,0x0b,0x00,0x02,0x01,0x0b,0x00,0x02,0x0b,0x00,0x84,0x01,0x0a,0x00, 0x83,0x01,0x09,0x00,0x84,0x01,0x08,0x00,0x01,0x01,0x07,0x00,0x82,0x00,0x07, 0x00,0x83,0x00,0x06,0x00,0x84,0x00,0x05,0x00,0x84,0x00,0x04,0x00,0x84,0x00, 0x03,0x00,0x83,0x00,0x02,0x00,0x84,0x00,0x01,0x00,0xde,0x00,0x00,0x00,0x04, 0x35,0x8d,0x19,0x33,0x8b,0x19,0x32,0x89,0x1a,0x34,0x8b,0x1c,0x82,0x33,0x8b, 0x19,0x02,0x35,0x8d,0x1b,0x32,0x89,0x1a,0x82,0x32,0x8b,0x1b,0x01,0x33,0x8a, 0x1b,0x82,0x33,0x8b,0x19,0x03,0x32,0x8a,0x18,0x33,0x8b,0x19,0x35,0x8d,0x1b, 0x83,0x33,0x8b,0x19,0x03,0x32,0x89,0x1a,0x33,0x8a,0x1b,0x32,0x8a,0x18,0x82, 0x33,0x8b,0x19,0x01,0x32,0x8a,0x18,0x82,0x33,0x8b,0x19,0x01,0x35,0x8d,0x1b, 0x83,0x32,0x8a,0x18,0x04,0x34,0x8c,0x1a,0x34,0x8a,0x19,0x32,0x8a,0x18,0x31, 0x89,0x17,0x82,0x33,0x8b,0x19,0x82,0x30,0x88,0x16,0x82,0x30,0x8a,0x17,0x01, 0x32,0x8a,0x18,0x83,0x31,0x89,0x17,0x02,0x31,0x87,0x16,0x31,0x89,0x17,0x82, 0x30,0x8a,0x15,0x11,0x32,0x8c,0x17,0x31,0x8b,0x18,0x31,0x89,0x17,0x30,0x88, 0x16,0x30,0x87,0x15,0x30,0x88,0x16,0x32,0x8a,0x16,0x30,0x88,0x16,0x31,0x87, 0x16,0x30,0x88,0x16,0x30,0x89,0x16,0x31,0x89,0x17,0x30,0x88,0x16,0x31,0x8a, 0x1a,0x30,0x87,0x18,0x30,0x88,0x16,0x32,0x8a,0x18,0x82,0x30,0x89,0x16,0x07, 0x31,0x8b,0x18,0x30,0x89,0x16,0x2e,0x87,0x14,0x30,0x8a,0x17,0x31,0x89,0x17, 0x30,0x87,0x15,0x2f,0x88,0x15,0x83,0x30,0x89,0x16,0x01,0x30,0x8a,0x17,0x82, 0x2f,0x88,0x15,0x03,0x2e,0x87,0x14,0x30,0x89,0x14,0x2e,0x87,0x12,0x82,0x30, 0x8a,0x17,0x85,0x30,0x89,0x14,0x03,0x30,0x89,0x16,0x30,0x8a,0x17,0x2f,0x88, 0x15,0x82,0x30,0x8a,0x15,0x04,0x30,0x8a,0x17,0x30,0x8a,0x15,0x2f,0x88,0x13, 0x30,0x89,0x14,0x82,0x30,0x8a,0x15,0x05,0x2f,0x88,0x13,0x30,0x8a,0x15,0x30, 0x89,0x14,0x2f,0x88,0x13,0x30,0x89,0x14,0x82,0x30,0x8a,0x15,0x02,0x30,0x89, 0x14,0x2e,0x87,0x12,0x82,0x30,0x89,0x14,0x01,0x30,0x8a,0x15,0x82,0x2d,0x89, 0x13,0x0e,0x30,0x8a,0x15,0x30,0x8a,0x17,0x2e,0x87,0x12,0x2b,0x87,0x11,0x2e, 0x87,0x12,0x2f,0x88,0x13,0x30,0x8a,0x15,0x2d,0x89,0x13,0x30,0x8c,0x16,0x31, 0x8b,0x16,0x30,0x8a,0x15,0x2f,0x8b,0x15,0x2f,0x8b,0x13,0x2d,0x89,0x11,0x83, 0x2f,0x8b,0x13,0x82,0x2e,0x8a,0x12,0x05,0x2f,0x8b,0x13,0x2e,0x8a,0x10,0x2f, 0x8b,0x13,0x2e,0x8a,0x14,0x30,0x8d,0x17,0x83,0x30,0x8c,0x14,0x01,0x2f,0x8b, 0x11,0x82,0x2f,0x8b,0x13,0x29,0x2e,0x8a,0x12,0x2f,0x8b,0x13,0x2e,0x8a,0x12, 0x30,0x8c,0x14,0x30,0x8c,0x12,0x2e,0x8a,0x10,0x2f,0x8b,0x13,0x2d,0x89,0x11, 0x30,0x8d,0x13,0x2d,0x8b,0x10,0x2e,0x8c,0x11,0x2f,0x8d,0x12,0x30,0x8e,0x13, 0x2e,0x8c,0x11,0x2f,0x8d,0x12,0x30,0x8e,0x12,0x2f,0x8d,0x11,0x30,0x8f,0x13, 0x32,0x91,0x15,0x32,0x92,0x13,0x30,0x92,0x13,0x33,0x94,0x16,0x31,0x92,0x14, 0x32,0x93,0x15,0x33,0x95,0x14,0x33,0x95,0x12,0x34,0x96,0x13,0x35,0x97,0x14, 0x33,0x95,0x12,0x35,0x97,0x14,0x34,0x96,0x12,0x33,0x95,0x12,0x32,0x94,0x10, 0x32,0x94,0x11,0x35,0x97,0x16,0x34,0x96,0x13,0x34,0x96,0x15,0x36,0x98,0x15, 0x35,0x97,0x13,0x37,0x99,0x15,0x35,0x97,0x13,0x82,0x36,0x98,0x14,0x03,0x37, 0x99,0x15,0x35,0x99,0x12,0x36,0x9a,0x13,0x82,0x37,0x9a,0x13,0x04,0x39,0x9c, 0x15,0x38,0x9b,0x14,0x38,0x9c,0x15,0x3a,0x9e,0x17,0x82,0x3a,0x9f,0x15,0x02, 0x3b,0xa0,0x16,0x3a,0x9f,0x15,0x82,0x3b,0xa0,0x16,0x08,0x3a,0x9f,0x15,0x3b, 0xa0,0x16,0x3b,0xa0,0x14,0x3b,0xa2,0x15,0x3c,0xa3,0x16,0x3b,0xa2,0x15,0x3c, 0xa3,0x16,0x3d,0xa4,0x17,0x83,0x3c,0xa3,0x16,0x07,0x3b,0xa2,0x15,0x3c,0xa3, 0x16,0x3d,0xa4,0x17,0x3d,0xa4,0x16,0x3e,0xa5,0x17,0x3d,0xa4,0x16,0x3f,0xa7, 0x16,0x83,0x40,0xa8,0x17,0x83,0x3f,0xa7,0x16,0x02,0x3f,0xaa,0x16,0x40,0xab, 0x17,0x82,0x3f,0xaa,0x16,0x09,0x41,0xac,0x14,0x42,0xad,0x17,0x3f,0xaa,0x16, 0x40,0xab,0x17,0x42,0xad,0x19,0x3f,0xaa,0x16,0x40,0xab,0x15,0x43,0xae,0x18, 0x43,0xab,0x16,0x82,0x41,0xac,0x16,0x82,0x44,0xac,0x17,0x04,0x42,0xad,0x19, 0x43,0xae,0x1a,0x44,0xac,0x19,0x42,0xaa,0x17,0x82,0x45,0xad,0x1a,0x82,0x43, 0xae,0x18,0x07,0x45,0xad,0x18,0x46,0xae,0x19,0x47,0xaf,0x1a,0x45,0xad,0x1a, 0x45,0xad,0x18,0x46,0xae,0x19,0x49,0xb1,0x1c,0x82,0x47,0xaf,0x1a,0x06,0x46, 0xae,0x1b,0x47,0xaf,0x1e,0x47,0xad,0x1d,0x45,0xab,0x1b,0x47,0xad,0x1d,0x44, 0xaa,0x1a,0x82,0x46,0xac,0x1c,0x0a,0x47,0xad,0x1d,0x45,0xab,0x1b,0x45,0xaa, 0x1d,0x45,0xab,0x1b,0x47,0xad,0x1d,0x46,0xaa,0x1b,0x47,0xab,0x1e,0x48,0xac, 0x1d,0x48,0xac,0x1f,0x45,0xa9,0x1c,0x82,0x46,0xaa,0x1d,0x0a,0x49,0xad,0x1e, 0x47,0xab,0x1c,0x46,0xaa,0x1d,0x47,0xab,0x1e,0x46,0xaa,0x1d,0x46,0xaa,0x1b, 0x48,0xac,0x1f,0x46,0xaa,0x1d,0x46,0xaa,0x1b,0x47,0xab,0x1c,0x83,0x48,0xac, 0x1d,0x82,0x47,0xab,0x1c,0x01,0x46,0xaa,0x1b,0x82,0x48,0xac,0x1d,0x82,0x46, 0xaa,0x1b,0x0c,0x45,0xa9,0x1a,0x45,0xa8,0x1a,0x44,0xa7,0x19,0x45,0xa7,0x1c, 0x47,0xa7,0x1b,0x47,0xa7,0x19,0x45,0xa7,0x19,0x46,0xa8,0x1c,0x43,0xa4,0x1b, 0x44,0xa3,0x19,0x42,0xa0,0x19,0x41,0xa2,0x18,0x82,0x41,0xa1,0x18,0x04,0x3d, 0x9d,0x14,0x3e,0x9d,0x15,0x3d,0x9a,0x14,0x3c,0x99,0x14,0x82,0x3c,0x98,0x14, 0x07,0x3d,0x98,0x15,0x3c,0x96,0x16,0x3a,0x93,0x13,0x38,0x92,0x11,0x37,0x90, 0x13,0x39,0x92,0x15,0x36,0x8f,0x14,0x82,0x37,0x8c,0x13,0x0f,0x39,0x8d,0x15, 0x36,0x8a,0x12,0x35,0x89,0x11,0x32,0x86,0x0f,0x32,0x84,0x10,0x31,0x83,0x0e, 0x30,0x82,0x0f,0x31,0x82,0x12,0x2d,0x7d,0x0f,0x27,0x76,0x09,0x24,0x73,0x07, 0x24,0x71,0x07,0x22,0x6f,0x06,0x21,0x6e,0x06,0x23,0x6f,0x06,0x82,0x22,0x6d, 0x07,0x07,0x21,0x6c,0x05,0x20,0x6b,0x04,0x1f,0x6a,0x03,0x1f,0x69,0x05,0x1e, 0x68,0x05,0x1d,0x66,0x05,0x1e,0x67,0x05,0x82,0x1c,0x65,0x04,0x06,0x1b,0x63, 0x03,0x1c,0x64,0x04,0x1a,0x62,0x02,0x1b,0x61,0x03,0x1a,0x60,0x02,0x1a,0x61, 0x04,0x82,0x19,0x61,0x03,0x09,0x19,0x61,0x04,0x18,0x60,0x03,0x16,0x5d,0x00, 0x17,0x5c,0x00,0x19,0x5d,0x02,0x16,0x5d,0x01,0x15,0x5b,0x00,0x16,0x5d,0x01, 0x16,0x5c,0x01,0x82,0x17,0x5a,0x00,0x04,0x16,0x5b,0x02,0x15,0x5a,0x01,0x17, 0x5a,0x02,0x17,0x5a,0x01,0x82,0x16,0x5a,0x01,0x14,0x16,0x58,0x01,0x15,0x59, 0x02,0x15,0x59,0x01,0x15,0x5a,0x02,0x15,0x59,0x01,0x16,0x59,0x02,0x14,0x58, 0x01,0x15,0x58,0x01,0x17,0x57,0x02,0x16,0x59,0x01,0x16,0x58,0x00,0x16,0x57, 0x02,0x15,0x56,0x01,0x15,0x57,0x02,0x15,0x56,0x01,0x15,0x56,0x02,0x16,0x57, 0x01,0x16,0x56,0x01,0x15,0x55,0x00,0x16,0x56,0x01,0x82,0x16,0x55,0x01,0x0f, 0x15,0x55,0x01,0x16,0x55,0x01,0x15,0x54,0x01,0x14,0x53,0x01,0x16,0x52,0x00, 0x17,0x53,0x02,0x15,0x55,0x01,0x16,0x53,0x00,0x15,0x54,0x01,0x15,0x52,0x01, 0x14,0x54,0x00,0x15,0x50,0x00,0x15,0x52,0x00,0x15,0x52,0x01,0x14,0x52,0x01, 0x82,0x14,0x51,0x01,0x0f,0x13,0x51,0x01,0x14,0x51,0x01,0x13,0x50,0x01,0x13, 0x51,0x01,0x13,0x4f,0x01,0x14,0x4e,0x01,0x14,0x4f,0x01,0x13,0x4e,0x01,0x13, 0x4f,0x01,0x13,0x4f,0x00,0x14,0x4e,0x00,0x15,0x4e,0x01,0x13,0x4c,0x01,0x14, 0x4d,0x01,0x14,0x4d,0x02,0x82,0x14,0x4d,0x00,0x06,0x12,0x4b,0x00,0x13,0x4c, 0x01,0x13,0x4c,0x00,0x13,0x4b,0x00,0x12,0x4a,0x00,0x12,0x4b,0x00,0x82,0x13, 0x4b,0x00,0x1f,0x13,0x4a,0x00,0x12,0x49,0x00,0x13,0x4a,0x02,0x13,0x49,0x00, 0x13,0x4a,0x01,0x12,0x4a,0x01,0x12,0x49,0x00,0x12,0x49,0x01,0x13,0x49,0x01, 0x12,0x48,0x00,0x13,0x47,0x00,0x11,0x47,0x00,0x12,0x48,0x01,0x11,0x47,0x00, 0x12,0x46,0x00,0x11,0x45,0x00,0x12,0x46,0x01,0x12,0x47,0x01,0x12,0x45,0x01, 0x11,0x45,0x00,0x11,0x44,0x00,0x11,0x43,0x00,0x12,0x44,0x01,0x10,0x43,0x00, 0x11,0x44,0x01,0x11,0x43,0x01,0x11,0x42,0x00,0x11,0x43,0x01,0x12,0x42,0x01, 0x11,0x41,0x01,0x11,0x41,0x00,0x82,0x10,0x41,0x00,0x01,0x10,0x41,0x01,0x82, 0x10,0x40,0x00,0x03,0x10,0x40,0x02,0x10,0x3f,0x01,0x10,0x3f,0x00,0x82,0x10, 0x3f,0x01,0x07,0x10,0x40,0x01,0x10,0x3f,0x00,0x10,0x3e,0x01,0x0f,0x3c,0x00, 0x0f,0x3c,0x01,0x10,0x3c,0x00,0x10,0x3d,0x01,0x82,0x0f,0x3c,0x01,0x83,0x0f, 0x3b,0x00,0x85,0x0f,0x3a,0x00,0x01,0x0f,0x39,0x00,0x82,0x0e,0x38,0x00,0x0a, 0x0e,0x37,0x01,0x0f,0x38,0x01,0x0e,0x38,0x01,0x0e,0x37,0x01,0x0e,0x37,0x00, 0x0e,0x37,0x01,0x0e,0x37,0x00,0x0e,0x37,0x01,0x0e,0x36,0x01,0x0e,0x36,0x00, 0x82,0x0e,0x35,0x00,0x03,0x0d,0x34,0x00,0x0d,0x34,0x01,0x0d,0x33,0x01,0x82, 0x0d,0x33,0x00,0x06,0x0d,0x33,0x01,0x0c,0x33,0x01,0x0c,0x32,0x01,0x0d,0x31, 0x01,0x0d,0x32,0x01,0x0c,0x31,0x00,0x82,0x0c,0x31,0x01,0x83,0x0c,0x30,0x01, 0x01,0x0b,0x30,0x00,0x83,0x0c,0x30,0x01,0x02,0x0c,0x2f,0x01,0x0b,0x2f,0x00, 0x82,0x0b,0x2f,0x01,0x01,0x0b,0x2e,0x01,0x83,0x0b,0x2d,0x00,0x02,0x0c,0x2e, 0x01,0x0b,0x2c,0x00,0x82,0x0b,0x2d,0x01,0x82,0x0a,0x2b,0x00,0x05,0x0b,0x2b, 0x01,0x0b,0x2c,0x01,0x0a,0x2b,0x01,0x0a,0x2a,0x00,0x0a,0x2a,0x01,0x82,0x0a, 0x29,0x00,0x01,0x09,0x29,0x00,0x83,0x0a,0x29,0x01,0x05,0x0a,0x29,0x00,0x0a, 0x28,0x00,0x09,0x27,0x00,0x09,0x28,0x01,0x09,0x26,0x00,0x82,0x09,0x25,0x00, 0x82,0x09,0x26,0x00,0x83,0x09,0x25,0x00,0x02,0x08,0x23,0x00,0x08,0x23,0x01, 0x82,0x08,0x23,0x00,0x82,0x08,0x22,0x00,0x02,0x09,0x22,0x00,0x08,0x22,0x01, 0x82,0x08,0x22,0x00,0x82,0x08,0x21,0x00,0x03,0x07,0x21,0x00,0x07,0x20,0x00, 0x08,0x20,0x00,0x82,0x07,0x1f,0x00,0x01,0x08,0x1f,0x01,0x84,0x07,0x1e,0x00, 0x02,0x07,0x1d,0x00,0x07,0x1d,0x01,0x82,0x07,0x1d,0x00,0x03,0x07,0x1c,0x00, 0x06,0x1b,0x00,0x06,0x1c,0x00,0x82,0x06,0x1b,0x00,0x83,0x06,0x1a,0x00,0x01, 0x05,0x19,0x00,0x83,0x06,0x19,0x00,0x82,0x05,0x18,0x00,0x83,0x05,0x17,0x00, 0x83,0x05,0x16,0x00,0x02,0x04,0x16,0x00,0x04,0x15,0x00,0x82,0x05,0x15,0x00, 0x01,0x04,0x15,0x00,0x82,0x04,0x14,0x00,0x83,0x04,0x13,0x00,0x01,0x04,0x12, 0x00,0x82,0x03,0x12,0x00,0x83,0x03,0x11,0x00,0x84,0x03,0x10,0x00,0x83,0x03, 0x0f,0x00,0x83,0x02,0x0e,0x00,0x84,0x02,0x0d,0x00,0x82,0x02,0x0c,0x00,0x85, 0x02,0x0b,0x00,0x83,0x01,0x0a,0x00,0x83,0x01,0x09,0x00,0x84,0x01,0x08,0x00, 0x01,0x01,0x07,0x00,0x82,0x00,0x07,0x00,0x83,0x00,0x06,0x00,0x84,0x00,0x05, 0x00,0x84,0x00,0x04,0x00,0x84,0x00,0x03,0x00,0x83,0x00,0x02,0x00,0x84,0x00, 0x01,0x00,0xde,0x00,0x00,0x00,0x82,0x35,0x8d,0x1a,0x0b,0x32,0x89,0x19,0x34, 0x8b,0x1b,0x35,0x8d,0x1a,0x34,0x8c,0x19,0x35,0x8d,0x1a,0x35,0x8c,0x1c,0x30, 0x89,0x18,0x35,0x8e,0x1d,0x35,0x8d,0x1a,0x37,0x8f,0x1c,0x34,0x8c,0x19,0x82, 0x35,0x8d,0x1a,0x01,0x33,0x8b,0x18,0x83,0x35,0x8d,0x1a,0x03,0x33,0x8b,0x18, 0x34,0x8c,0x19,0x35,0x8d,0x1a,0x82,0x34,0x8c,0x19,0x01,0x32,0x8a,0x17,0x83, 0x35,0x8d,0x1a,0x01,0x32,0x8a,0x17,0x82,0x33,0x8b,0x18,0x03,0x34,0x8c,0x19, 0x33,0x8a,0x1a,0x34,0x8b,0x1b,0x82,0x32,0x8a,0x17,0x11,0x34,0x8c,0x19,0x32, 0x8a,0x17,0x33,0x8b,0x18,0x32,0x8b,0x1a,0x34,0x8c,0x19,0x33,0x8b,0x18,0x31, 0x89,0x16,0x33,0x8b,0x18,0x32,0x89,0x19,0x31,0x89,0x16,0x34,0x8c,0x19,0x31, 0x8b,0x15,0x32,0x8a,0x17,0x33,0x8b,0x18,0x32,0x89,0x19,0x31,0x8a,0x19,0x31, 0x8b,0x17,0x82,0x30,0x8a,0x16,0x09,0x31,0x8b,0x15,0x32,0x8a,0x17,0x33,0x89, 0x17,0x32,0x8a,0x17,0x31,0x8b,0x17,0x33,0x8b,0x18,0x2f,0x89,0x15,0x32,0x8c, 0x18,0x32,0x89,0x19,0x82,0x32,0x8a,0x17,0x03,0x30,0x8a,0x16,0x31,0x8b,0x17, 0x30,0x8a,0x16,0x82,0x31,0x8b,0x17,0x03,0x2f,0x89,0x15,0x31,0x89,0x16,0x32, 0x8a,0x17,0x82,0x2f,0x89,0x15,0x82,0x31,0x89,0x16,0x0e,0x2f,0x89,0x15,0x2e, 0x88,0x14,0x30,0x88,0x15,0x2e,0x88,0x14,0x2f,0x89,0x15,0x31,0x8b,0x17,0x2e, 0x88,0x14,0x30,0x8a,0x16,0x2f,0x89,0x15,0x31,0x89,0x14,0x31,0x8b,0x15,0x2f, 0x89,0x15,0x2e,0x88,0x14,0x2f,0x89,0x15,0x83,0x30,0x8a,0x16,0x01,0x2f,0x89, 0x15,0x82,0x30,0x8a,0x16,0x03,0x30,0x8a,0x14,0x31,0x8b,0x15,0x30,0x8a,0x14, 0x82,0x2f,0x89,0x13,0x14,0x31,0x8b,0x15,0x30,0x8a,0x14,0x2e,0x88,0x12,0x30, 0x8a,0x16,0x2e,0x88,0x14,0x2f,0x8c,0x15,0x31,0x8b,0x15,0x2e,0x88,0x12,0x31, 0x8b,0x17,0x31,0x8b,0x15,0x30,0x8a,0x14,0x2f,0x89,0x13,0x2e,0x8b,0x14,0x32, 0x8c,0x16,0x31,0x8b,0x15,0x30,0x8a,0x14,0x31,0x8b,0x15,0x2f,0x89,0x13,0x2e, 0x88,0x12,0x32,0x8c,0x16,0x82,0x2d,0x8a,0x13,0x05,0x2f,0x89,0x13,0x31,0x8b, 0x15,0x30,0x8d,0x16,0x30,0x8d,0x14,0x2e,0x8b,0x14,0x82,0x2d,0x8a,0x13,0x83, 0x2f,0x8c,0x13,0x0a,0x2d,0x8a,0x11,0x31,0x8b,0x13,0x2e,0x8b,0x14,0x2d,0x8a, 0x11,0x2f,0x8c,0x13,0x2f,0x8c,0x11,0x2e,0x8b,0x12,0x2f,0x8c,0x13,0x30,0x8d, 0x14,0x30,0x8d,0x16,0x82,0x2f,0x8c,0x13,0x03,0x30,0x8d,0x12,0x2f,0x8c,0x11, 0x2d,0x8c,0x12,0x82,0x2e,0x8d,0x13,0x09,0x30,0x8d,0x14,0x2f,0x8c,0x13,0x2f, 0x8e,0x14,0x2e,0x8d,0x13,0x2f,0x8e,0x12,0x2e,0x8d,0x11,0x31,0x90,0x14,0x2d, 0x8c,0x10,0x2e,0x8d,0x13,0x82,0x2f,0x8e,0x12,0x09,0x30,0x8f,0x13,0x2f,0x8e, 0x12,0x2e,0x8d,0x10,0x30,0x8f,0x12,0x31,0x90,0x13,0x2d,0x8f,0x11,0x2f,0x91, 0x13,0x2f,0x91,0x11,0x30,0x93,0x10,0x82,0x33,0x95,0x13,0x82,0x31,0x93,0x11, 0x02,0x30,0x92,0x12,0x32,0x93,0x14,0x82,0x34,0x96,0x14,0x06,0x31,0x93,0x11, 0x35,0x97,0x12,0x34,0x96,0x12,0x35,0x97,0x12,0x34,0x96,0x12,0x35,0x97,0x13, 0x82,0x36,0x98,0x13,0x09,0x35,0x97,0x12,0x36,0x98,0x13,0x35,0x99,0x13,0x36, 0x9a,0x12,0x37,0x99,0x14,0x38,0x9a,0x15,0x37,0x99,0x14,0x36,0x99,0x11,0x37, 0x9a,0x12,0x82,0x38,0x9c,0x14,0x01,0x3a,0x9f,0x14,0x82,0x39,0x9e,0x13,0x82, 0x3a,0x9f,0x14,0x01,0x39,0x9e,0x13,0x82,0x3b,0xa0,0x15,0x01,0x3c,0xa3,0x15, 0x84,0x3b,0xa2,0x14,0x09,0x3a,0xa1,0x13,0x3c,0xa3,0x15,0x3d,0xa4,0x16,0x3c, 0xa3,0x15,0x3b,0xa2,0x14,0x3c,0xa3,0x15,0x3c,0xa3,0x14,0x3e,0xa5,0x16,0x3c, 0xa3,0x14,0x82,0x3d,0xa4,0x15,0x82,0x3e,0xa5,0x16,0x01,0x3f,0xa7,0x15,0x83, 0x3e,0xa8,0x16,0x82,0x3f,0xa9,0x17,0x06,0x3e,0xa8,0x16,0x40,0xab,0x16,0x41, 0xac,0x17,0x40,0xab,0x16,0x41,0xac,0x15,0x42,0xad,0x16,0x82,0x40,0xab,0x16, 0x03,0x41,0xac,0x17,0x43,0xab,0x17,0x40,0xab,0x16,0x82,0x42,0xad,0x16,0x01, 0x44,0xac,0x16,0x82,0x44,0xac,0x18,0x04,0x45,0xad,0x19,0x44,0xac,0x18,0x45, 0xad,0x19,0x42,0xad,0x18,0x82,0x43,0xae,0x19,0x01,0x45,0xad,0x19,0x82,0x46, 0xae,0x1a,0x0b,0x47,0xaf,0x19,0x46,0xae,0x18,0x47,0xaf,0x19,0x48,0xb0,0x1a, 0x46,0xae,0x18,0x48,0xb0,0x1c,0x47,0xaf,0x1b,0x48,0xb0,0x1c,0x46,0xae,0x1c, 0x44,0xac,0x1a,0x47,0xad,0x1c,0x82,0x46,0xac,0x1b,0x06,0x45,0xab,0x1a,0x47, 0xad,0x1c,0x49,0xaf,0x1e,0x48,0xae,0x1d,0x47,0xad,0x1c,0x48,0xae,0x1d,0x83, 0x47,0xab,0x1b,0x07,0x48,0xac,0x1c,0x47,0xab,0x1d,0x46,0xaa,0x1c,0x48,0xac, 0x1c,0x49,0xad,0x1d,0x49,0xae,0x1e,0x49,0xad,0x1f,0x83,0x47,0xab,0x1d,0x03, 0x49,0xad,0x1f,0x47,0xab,0x1d,0x45,0xa9,0x1b,0x82,0x49,0xad,0x1d,0x05,0x48, 0xac,0x1c,0x49,0xad,0x1d,0x47,0xab,0x1b,0x45,0xa9,0x19,0x47,0xab,0x1b,0x82, 0x49,0xad,0x1d,0x19,0x48,0xac,0x1c,0x46,0xaa,0x1a,0x49,0xad,0x1d,0x48,0xa8, 0x1a,0x47,0xaa,0x1b,0x46,0xa8,0x1a,0x47,0xa7,0x1a,0x45,0xa7,0x18,0x46,0xa8, 0x19,0x46,0xa8,0x1b,0x44,0xa5,0x19,0x45,0xa6,0x1a,0x44,0xa5,0x1c,0x44,0xa5, 0x1a,0x42,0xa2,0x16,0x42,0xa2,0x18,0x41,0xa1,0x17,0x42,0xa1,0x17,0x3f,0x9c, 0x14,0x3f,0x9c,0x16,0x3e,0x9a,0x14,0x3d,0x99,0x14,0x3e,0x99,0x15,0x3c,0x97, 0x13,0x3e,0x98,0x15,0x82,0x3b,0x94,0x14,0x12,0x3a,0x93,0x15,0x38,0x90,0x13, 0x3a,0x90,0x13,0x39,0x8f,0x12,0x39,0x8e,0x12,0x37,0x8c,0x10,0x36,0x8b,0x12, 0x34,0x89,0x11,0x34,0x86,0x10,0x33,0x87,0x10,0x32,0x84,0x0e,0x31,0x83,0x0d, 0x31,0x82,0x0f,0x30,0x81,0x10,0x2c,0x7c,0x0e,0x27,0x75,0x08,0x23,0x71,0x05, 0x23,0x71,0x07,0x82,0x22,0x6f,0x06,0x09,0x22,0x6e,0x06,0x21,0x6d,0x05,0x22, 0x6e,0x06,0x21,0x6d,0x05,0x1f,0x6a,0x05,0x1e,0x69,0x04,0x1f,0x6a,0x05,0x1e, 0x68,0x05,0x1d,0x67,0x05,0x82,0x1d,0x66,0x05,0x01,0x1b,0x64,0x03,0x82,0x1c, 0x63,0x04,0x01,0x1b,0x62,0x04,0x82,0x19,0x61,0x03,0x82,0x19,0x61,0x04,0x01, 0x18,0x5f,0x02,0x82,0x17,0x5f,0x02,0x03,0x17,0x5e,0x02,0x18,0x5c,0x01,0x19, 0x5d,0x03,0x82,0x17,0x5b,0x01,0x13,0x18,0x5b,0x01,0x17,0x5a,0x00,0x18,0x5b, 0x02,0x16,0x5a,0x02,0x17,0x5a,0x02,0x17,0x5a,0x01,0x17,0x5b,0x02,0x17,0x59, 0x02,0x17,0x57,0x01,0x15,0x58,0x02,0x15,0x59,0x01,0x15,0x58,0x00,0x15,0x59, 0x01,0x14,0x58,0x01,0x14,0x57,0x00,0x15,0x58,0x01,0x15,0x57,0x01,0x17,0x57, 0x00,0x16,0x56,0x00,0x82,0x16,0x58,0x02,0x05,0x15,0x56,0x01,0x14,0x55,0x00, 0x15,0x56,0x02,0x16,0x57,0x01,0x15,0x56,0x00,0x82,0x16,0x56,0x01,0x02,0x16, 0x55,0x01,0x15,0x54,0x00,0x82,0x15,0x55,0x01,0x09,0x15,0x54,0x01,0x14,0x53, 0x01,0x17,0x53,0x01,0x15,0x53,0x02,0x15,0x53,0x01,0x14,0x55,0x00,0x16,0x54, 0x02,0x14,0x54,0x01,0x15,0x54,0x01,0x82,0x15,0x52,0x01,0x05,0x14,0x50,0x00, 0x14,0x51,0x01,0x15,0x53,0x02,0x14,0x52,0x01,0x13,0x51,0x01,0x82,0x13,0x50, 0x01,0x82,0x14,0x4f,0x01,0x08,0x12,0x4f,0x02,0x13,0x4f,0x03,0x13,0x4e,0x01, 0x14,0x4f,0x00,0x13,0x4f,0x00,0x13,0x4e,0x00,0x14,0x4d,0x01,0x13,0x4c,0x01, 0x82,0x13,0x4c,0x00,0x02,0x14,0x4c,0x00,0x14,0x4d,0x00,0x82,0x13,0x4c,0x00, 0x02,0x13,0x4c,0x02,0x12,0x4b,0x00,0x82,0x12,0x4b,0x01,0x01,0x13,0x4b,0x02, 0x82,0x12,0x4a,0x01,0x83,0x12,0x49,0x01,0x82,0x12,0x49,0x00,0x02,0x12,0x4a, 0x01,0x13,0x49,0x01,0x82,0x12,0x49,0x00,0x82,0x13,0x49,0x00,0x02,0x11,0x48, 0x00,0x12,0x48,0x00,0x82,0x11,0x47,0x00,0x04,0x10,0x46,0x00,0x11,0x46,0x00, 0x13,0x47,0x01,0x11,0x46,0x00,0x82,0x11,0x45,0x00,0x03,0x12,0x45,0x01,0x10, 0x44,0x00,0x12,0x45,0x01,0x82,0x11,0x44,0x01,0x0b,0x11,0x44,0x00,0x12,0x43, 0x01,0x11,0x42,0x00,0x12,0x43,0x00,0x11,0x43,0x00,0x10,0x43,0x01,0x11,0x43, 0x00,0x11,0x42,0x01,0x10,0x41,0x00,0x10,0x40,0x00,0x10,0x41,0x01,0x83,0x10, 0x40,0x00,0x03,0x11,0x41,0x01,0x10,0x3f,0x00,0x0f,0x3e,0x00,0x83,0x0f,0x3e, 0x01,0x10,0x10,0x3e,0x01,0x0f,0x3d,0x01,0x10,0x3d,0x01,0x0f,0x3c,0x00,0x10, 0x3c,0x01,0x0f,0x3c,0x01,0x0f,0x3b,0x00,0x0f,0x3c,0x01,0x0f,0x3b,0x00,0x0e, 0x3a,0x00,0x0f,0x3b,0x00,0x0e,0x3a,0x00,0x0f,0x3a,0x00,0x0f,0x3a,0x01,0x0e, 0x39,0x00,0x0e,0x39,0x01,0x83,0x0e,0x38,0x00,0x02,0x0e,0x37,0x01,0x0d,0x37, 0x00,0x82,0x0e,0x37,0x01,0x02,0x0d,0x36,0x01,0x0e,0x35,0x01,0x82,0x0d,0x36, 0x01,0x01,0x0d,0x35,0x02,0x82,0x0d,0x35,0x01,0x08,0x0d,0x34,0x00,0x0d,0x35, 0x00,0x0b,0x34,0x00,0x0c,0x34,0x00,0x0c,0x33,0x00,0x0d,0x33,0x02,0x0d,0x33, 0x01,0x0d,0x32,0x01,0x83,0x0c,0x32,0x01,0x82,0x0c,0x31,0x01,0x83,0x0c,0x30, 0x01,0x05,0x0b,0x2f,0x01,0x0c,0x2f,0x01,0x0b,0x2f,0x01,0x0b,0x2f,0x00,0x0b, 0x2e,0x00,0x82,0x0b,0x2e,0x01,0x02,0x0b,0x2d,0x01,0x0b,0x2c,0x00,0x82,0x0b, 0x2d,0x01,0x03,0x0b,0x2c,0x01,0x0a,0x2c,0x00,0x0a,0x2b,0x00,0x82,0x0b,0x2b, 0x01,0x82,0x0a,0x2b,0x01,0x84,0x0a,0x2a,0x01,0x05,0x0a,0x29,0x01,0x0a,0x28, 0x00,0x09,0x28,0x00,0x09,0x28,0x01,0x0a,0x28,0x01,0x82,0x09,0x27,0x00,0x01, 0x09,0x26,0x01,0x82,0x09,0x26,0x00,0x02,0x09,0x26,0x01,0x09,0x26,0x00,0x82, 0x09,0x25,0x00,0x03,0x09,0x24,0x00,0x08,0x24,0x01,0x09,0x24,0x00,0x82,0x08, 0x23,0x00,0x09,0x08,0x24,0x00,0x07,0x22,0x00,0x07,0x21,0x00,0x08,0x22,0x00, 0x08,0x21,0x00,0x08,0x22,0x00,0x08,0x21,0x00,0x08,0x20,0x00,0x07,0x21,0x00, 0x83,0x07,0x20,0x00,0x01,0x07,0x1f,0x00,0x85,0x07,0x1e,0x00,0x83,0x07,0x1d, 0x00,0x82,0x06,0x1c,0x00,0x03,0x06,0x1b,0x00,0x06,0x1c,0x00,0x06,0x1b,0x00, 0x85,0x06,0x1a,0x00,0x82,0x06,0x19,0x00,0x82,0x05,0x18,0x00,0x01,0x06,0x18, 0x00,0x84,0x05,0x17,0x00,0x83,0x05,0x16,0x00,0x04,0x05,0x15,0x00,0x04,0x15, 0x00,0x04,0x14,0x00,0x05,0x15,0x00,0x83,0x04,0x14,0x00,0x82,0x04,0x13,0x00, 0x82,0x04,0x12,0x00,0x01,0x03,0x12,0x00,0x83,0x03,0x11,0x00,0x84,0x03,0x10, 0x00,0x83,0x03,0x0f,0x00,0x82,0x03,0x0e,0x00,0x01,0x02,0x0e,0x00,0x84,0x02, 0x0d,0x00,0x82,0x02,0x0c,0x00,0x84,0x02,0x0b,0x00,0x84,0x01,0x0a,0x00,0x83, 0x01,0x09,0x00,0x84,0x01,0x08,0x00,0x83,0x00,0x07,0x00,0x84,0x00,0x06,0x00, 0x83,0x00,0x05,0x00,0x84,0x00,0x04,0x00,0x84,0x00,0x03,0x00,0x83,0x00,0x02, 0x00,0x84,0x00,0x01,0x00,0xde,0x00,0x00,0x00,0x82,0x35,0x8e,0x1a,0x82,0x35, 0x8d,0x1c,0x83,0x35,0x8e,0x1a,0x05,0x36,0x8f,0x1b,0x34,0x8c,0x1b,0x34,0x8d, 0x19,0x32,0x8b,0x17,0x36,0x8f,0x1b,0x83,0x35,0x8e,0x1a,0x0d,0x32,0x8b,0x17, 0x35,0x8e,0x1a,0x36,0x8f,0x1b,0x34,0x8d,0x19,0x33,0x8c,0x18,0x35,0x8e,0x1a, 0x34,0x8f,0x1a,0x35,0x8e,0x1a,0x34,0x8d,0x19,0x33,0x8c,0x18,0x35,0x8e,0x1a, 0x34,0x8d,0x19,0x33,0x8c,0x18,0x82,0x33,0x8e,0x19,0x06,0x34,0x8d,0x19,0x34, 0x8c,0x1b,0x33,0x8b,0x1a,0x34,0x8c,0x1b,0x33,0x8b,0x1a,0x32,0x8a,0x19,0x82, 0x33,0x8c,0x18,0x0e,0x32,0x8d,0x18,0x33,0x8d,0x1b,0x33,0x8b,0x1a,0x32,0x8a, 0x19,0x31,0x89,0x18,0x33,0x8b,0x1a,0x32,0x8a,0x19,0x31,0x89,0x18,0x33,0x8c, 0x18,0x31,0x8c,0x17,0x30,0x88,0x17,0x31,0x89,0x18,0x32,0x8a,0x19,0x31,0x8b, 0x19,0x82,0x30,0x8a,0x18,0x82,0x31,0x8c,0x17,0x05,0x32,0x8d,0x18,0x33,0x8c, 0x18,0x34,0x8f,0x1a,0x32,0x8d,0x18,0x32,0x8b,0x17,0x82,0x30,0x89,0x15,0x06, 0x31,0x89,0x18,0x30,0x88,0x17,0x32,0x8a,0x19,0x30,0x88,0x17,0x30,0x8b,0x16, 0x32,0x8d,0x18,0x82,0x31,0x8c,0x17,0x04,0x31,0x8b,0x19,0x31,0x8a,0x16,0x30, 0x89,0x15,0x2f,0x8a,0x15,0x82,0x31,0x8a,0x16,0x82,0x30,0x89,0x15,0x82,0x31, 0x8a,0x16,0x0c,0x2f,0x88,0x14,0x2e,0x89,0x14,0x2f,0x8a,0x15,0x2d,0x88,0x13, 0x31,0x8c,0x17,0x31,0x8a,0x16,0x30,0x89,0x15,0x30,0x8b,0x16,0x2f,0x8a,0x15, 0x2f,0x88,0x14,0x30,0x89,0x15,0x2e,0x89,0x14,0x82,0x30,0x8b,0x16,0x01,0x2e, 0x89,0x14,0x83,0x30,0x8b,0x16,0x04,0x31,0x8c,0x17,0x2f,0x8a,0x15,0x2d,0x88, 0x13,0x31,0x8c,0x15,0x82,0x30,0x8b,0x14,0x03,0x30,0x8b,0x16,0x31,0x8c,0x17, 0x2d,0x88,0x13,0x82,0x30,0x8b,0x14,0x0d,0x2f,0x8a,0x13,0x2f,0x8a,0x15,0x33, 0x8c,0x16,0x2f,0x8a,0x13,0x31,0x8c,0x15,0x2f,0x8d,0x15,0x30,0x8b,0x14,0x2f, 0x8a,0x13,0x31,0x8c,0x15,0x30,0x8b,0x14,0x2e,0x8c,0x14,0x2d,0x88,0x11,0x2f, 0x8a,0x13,0x82,0x2e,0x8c,0x14,0x82,0x2f,0x8a,0x13,0x10,0x2f,0x8d,0x15,0x2f, 0x8a,0x13,0x30,0x8b,0x14,0x2d,0x8b,0x13,0x2f,0x8d,0x15,0x2d,0x8b,0x13,0x2f, 0x8d,0x15,0x2c,0x8a,0x12,0x2d,0x8b,0x13,0x30,0x8b,0x12,0x2c,0x8a,0x12,0x2e, 0x8c,0x14,0x2e,0x8c,0x12,0x31,0x8f,0x15,0x2e,0x8c,0x12,0x2e,0x8c,0x14,0x82, 0x2d,0x8b,0x11,0x04,0x2e,0x8c,0x12,0x2f,0x8d,0x13,0x31,0x8f,0x15,0x30,0x8e, 0x14,0x82,0x2f,0x8f,0x14,0x04,0x2e,0x8e,0x13,0x30,0x8e,0x14,0x2e,0x8c,0x12, 0x2f,0x8d,0x11,0x82,0x2e,0x8e,0x11,0x01,0x2e,0x8e,0x10,0x82,0x2f,0x8f,0x11, 0x02,0x2f,0x8f,0x14,0x2e,0x8e,0x13,0x83,0x2f,0x8f,0x12,0x13,0x2d,0x8d,0x0f, 0x2e,0x8e,0x10,0x2d,0x8d,0x10,0x2f,0x8f,0x12,0x30,0x90,0x12,0x2e,0x8e,0x10, 0x2f,0x8f,0x11,0x32,0x92,0x14,0x31,0x91,0x13,0x32,0x92,0x14,0x31,0x91,0x13, 0x31,0x94,0x13,0x2f,0x92,0x11,0x31,0x94,0x11,0x32,0x95,0x12,0x31,0x94,0x11, 0x33,0x96,0x11,0x32,0x95,0x12,0x33,0x96,0x11,0x85,0x34,0x97,0x12,0x09,0x33, 0x96,0x11,0x34,0x97,0x11,0x36,0x9b,0x14,0x33,0x96,0x10,0x36,0x99,0x13,0x35, 0x9a,0x13,0x36,0x9b,0x14,0x37,0x9a,0x14,0x37,0x9b,0x12,0x83,0x36,0x9b,0x12, 0x03,0x37,0x9c,0x13,0x38,0x9d,0x14,0x38,0x9e,0x12,0x82,0x39,0x9f,0x13,0x04, 0x3b,0xa1,0x15,0x3b,0xa3,0x16,0x3a,0xa0,0x14,0x3b,0xa1,0x15,0x82,0x3b,0xa1, 0x13,0x02,0x3a,0xa0,0x12,0x3c,0xa2,0x14,0x82,0x3b,0xa3,0x14,0x82,0x3c,0xa4, 0x15,0x0e,0x3b,0xa3,0x13,0x3d,0xa5,0x15,0x3b,0xa3,0x13,0x3d,0xa5,0x15,0x3c, 0xa4,0x14,0x3d,0xa5,0x15,0x3b,0xa6,0x15,0x3c,0xa7,0x16,0x3c,0xa7,0x14,0x3f, 0xaa,0x17,0x3c,0xa7,0x14,0x3d,0xa8,0x15,0x40,0xab,0x18,0x3f,0xaa,0x17,0x82, 0x3e,0xaa,0x14,0x0d,0x40,0xac,0x16,0x41,0xaa,0x15,0x42,0xab,0x16,0x41,0xad, 0x17,0x40,0xac,0x16,0x41,0xad,0x17,0x43,0xac,0x17,0x41,0xad,0x17,0x42,0xae, 0x18,0x42,0xae,0x16,0x45,0xae,0x17,0x45,0xae,0x19,0x41,0xaa,0x15,0x82,0x41, 0xad,0x17,0x82,0x42,0xae,0x18,0x03,0x44,0xb0,0x1a,0x43,0xaf,0x19,0x44,0xad, 0x18,0x82,0x45,0xae,0x19,0x06,0x47,0xb0,0x19,0x46,0xaf,0x18,0x45,0xb1,0x1b, 0x44,0xb0,0x1a,0x43,0xaf,0x19,0x47,0xb0,0x1b,0x82,0x46,0xaf,0x18,0x82,0x46, 0xaf,0x1c,0x07,0x44,0xad,0x1a,0x46,0xaf,0x1c,0x47,0xb0,0x1d,0x46,0xaf,0x1a, 0x44,0xad,0x1a,0x48,0xb1,0x1e,0x48,0xaf,0x1d,0x82,0x47,0xae,0x1c,0x04,0x45, 0xac,0x1a,0x46,0xab,0x1a,0x46,0xad,0x1b,0x47,0xae,0x1c,0x83,0x47,0xac,0x1b, 0x28,0x46,0xac,0x1d,0x47,0xad,0x1e,0x48,0xad,0x1e,0x47,0xac,0x1d,0x46,0xab, 0x1c,0x47,0xab,0x1e,0x48,0xad,0x1c,0x49,0xae,0x1d,0x45,0xaa,0x1b,0x47,0xac, 0x1d,0x48,0xad,0x1e,0x48,0xad,0x1c,0x47,0xac,0x19,0x49,0xae,0x1b,0x48,0xad, 0x1c,0x47,0xac,0x1b,0x48,0xad,0x1c,0x47,0xac,0x1b,0x48,0xad,0x1c,0x47,0xac, 0x1b,0x49,0xae,0x1d,0x48,0xac,0x1c,0x47,0xab,0x1b,0x47,0xaa,0x19,0x45,0xab, 0x19,0x45,0xa8,0x1a,0x46,0xa9,0x1b,0x47,0xaa,0x1a,0x45,0xa7,0x18,0x43,0xa7, 0x19,0x44,0xa6,0x1a,0x45,0xa7,0x1b,0x43,0xa4,0x19,0x42,0xa3,0x18,0x42,0xa3, 0x17,0x43,0xa4,0x19,0x42,0xa0,0x16,0x40,0x9e,0x16,0x41,0x9e,0x15,0x40,0x9d, 0x16,0x82,0x3d,0x99,0x13,0x0b,0x3b,0x97,0x11,0x3a,0x95,0x11,0x3a,0x94,0x11, 0x3b,0x95,0x12,0x39,0x93,0x10,0x39,0x93,0x12,0x3b,0x92,0x14,0x3a,0x90,0x13, 0x36,0x8e,0x13,0x35,0x8d,0x12,0x35,0x8a,0x11,0x82,0x34,0x89,0x10,0x0e,0x33, 0x88,0x0f,0x33,0x86,0x0e,0x32,0x85,0x0d,0x32,0x84,0x0e,0x32,0x83,0x10,0x2e, 0x7f,0x0e,0x2c,0x7b,0x0d,0x24,0x74,0x06,0x23,0x73,0x06,0x22,0x71,0x06,0x21, 0x6f,0x06,0x22,0x6f,0x06,0x23,0x71,0x07,0x22,0x6f,0x06,0x82,0x20,0x6c,0x04, 0x09,0x20,0x6d,0x05,0x1e,0x69,0x04,0x1e,0x69,0x05,0x1d,0x68,0x04,0x1d,0x67, 0x03,0x1c,0x66,0x04,0x1d,0x65,0x04,0x1c,0x64,0x03,0x1c,0x63,0x03,0x82,0x1a, 0x64,0x03,0x01,0x1b,0x62,0x02,0x82,0x1a,0x60,0x03,0x19,0x19,0x62,0x03,0x18, 0x60,0x03,0x17,0x5f,0x02,0x18,0x5d,0x01,0x19,0x5e,0x02,0x18,0x5d,0x01,0x17, 0x5c,0x00,0x18,0x5c,0x01,0x16,0x5d,0x01,0x18,0x5c,0x02,0x17,0x5b,0x00,0x17, 0x5a,0x00,0x15,0x5b,0x00,0x16,0x5b,0x01,0x16,0x59,0x00,0x16,0x58,0x00,0x15, 0x59,0x01,0x16,0x5b,0x02,0x16,0x58,0x00,0x16,0x5a,0x02,0x15,0x5a,0x02,0x16, 0x57,0x00,0x18,0x59,0x02,0x15,0x58,0x01,0x16,0x57,0x01,0x82,0x17,0x58,0x02, 0x82,0x15,0x58,0x02,0x26,0x15,0x57,0x01,0x15,0x57,0x02,0x16,0x58,0x01,0x15, 0x57,0x00,0x17,0x58,0x02,0x16,0x57,0x01,0x16,0x56,0x01,0x15,0x55,0x01,0x15, 0x56,0x02,0x15,0x55,0x01,0x15,0x54,0x01,0x15,0x55,0x02,0x14,0x55,0x02,0x14, 0x55,0x01,0x14,0x53,0x00,0x14,0x54,0x01,0x16,0x57,0x01,0x15,0x55,0x01,0x15, 0x53,0x02,0x15,0x55,0x02,0x15,0x52,0x01,0x14,0x51,0x00,0x14,0x52,0x01,0x15, 0x52,0x01,0x14,0x51,0x01,0x13,0x52,0x01,0x14,0x52,0x01,0x13,0x51,0x01,0x15, 0x51,0x00,0x14,0x50,0x01,0x13,0x4f,0x01,0x13,0x4f,0x02,0x13,0x51,0x01,0x13, 0x50,0x00,0x13,0x4f,0x00,0x15,0x4e,0x01,0x13,0x4f,0x01,0x13,0x4e,0x01,0x82, 0x12,0x4d,0x00,0x01,0x13,0x4e,0x01,0x83,0x13,0x4d,0x00,0x05,0x13,0x4d,0x01, 0x13,0x4c,0x01,0x12,0x4c,0x01,0x13,0x4c,0x02,0x12,0x4b,0x00,0x82,0x12,0x4b, 0x01,0x02,0x12,0x4a,0x01,0x13,0x4b,0x02,0x82,0x12,0x4a,0x01,0x0c,0x12,0x49, 0x00,0x12,0x4b,0x01,0x13,0x4a,0x01,0x12,0x48,0x00,0x12,0x49,0x00,0x11,0x48, 0x00,0x11,0x49,0x00,0x12,0x48,0x00,0x12,0x48,0x01,0x12,0x47,0x00,0x12,0x48, 0x01,0x11,0x47,0x00,0x83,0x11,0x46,0x00,0x01,0x12,0x46,0x01,0x82,0x11,0x45, 0x00,0x0e,0x10,0x44,0x00,0x11,0x45,0x01,0x11,0x44,0x01,0x11,0x45,0x01,0x11, 0x43,0x00,0x11,0x43,0x01,0x11,0x43,0x00,0x10,0x42,0x00,0x11,0x43,0x00,0x10, 0x43,0x00,0x10,0x42,0x01,0x11,0x43,0x00,0x11,0x41,0x00,0x10,0x41,0x01,0x83, 0x10,0x40,0x00,0x03,0x10,0x3f,0x00,0x10,0x40,0x01,0x0f,0x3f,0x00,0x83,0x0f, 0x3e,0x00,0x02,0x0f,0x3d,0x00,0x10,0x3e,0x01,0x82,0x0f,0x3d,0x00,0x83,0x10, 0x3c,0x01,0x82,0x0f,0x3c,0x01,0x01,0x0e,0x3b,0x01,0x82,0x0e,0x3a,0x00,0x10, 0x0f,0x3a,0x00,0x0e,0x39,0x00,0x0e,0x3a,0x00,0x0d,0x3a,0x00,0x0d,0x3b,0x01, 0x0e,0x39,0x00,0x0e,0x38,0x00,0x0e,0x37,0x00,0x0e,0x37,0x01,0x0d,0x37,0x00, 0x0e,0x37,0x00,0x0e,0x37,0x02,0x0e,0x37,0x01,0x0e,0x35,0x01,0x0d,0x36,0x01, 0x0e,0x36,0x02,0x83,0x0d,0x35,0x01,0x82,0x0d,0x34,0x00,0x04,0x0d,0x35,0x01, 0x0d,0x34,0x01,0x0d,0x33,0x00,0x0d,0x33,0x01,0x82,0x0d,0x32,0x01,0x82,0x0c, 0x32,0x00,0x82,0x0c,0x32,0x01,0x82,0x0d,0x31,0x01,0x82,0x0c,0x30,0x00,0x01, 0x0c,0x30,0x01,0x84,0x0c,0x2f,0x00,0x04,0x0b,0x2e,0x00,0x0b,0x2e,0x01,0x0b, 0x2d,0x00,0x0b,0x2d,0x01,0x82,0x0b,0x2d,0x00,0x08,0x0b,0x2c,0x00,0x0a,0x2c, 0x00,0x0b,0x2c,0x01,0x0b,0x2b,0x01,0x0a,0x2b,0x00,0x0a,0x2a,0x00,0x0a,0x2a, 0x01,0x0a,0x2a,0x00,0x82,0x0a,0x29,0x00,0x01,0x0a,0x29,0x01,0x85,0x0a,0x28, 0x01,0x01,0x09,0x27,0x00,0x84,0x09,0x26,0x00,0x03,0x08,0x26,0x01,0x09,0x25, 0x01,0x09,0x26,0x00,0x82,0x09,0x25,0x00,0x06,0x09,0x24,0x00,0x09,0x25,0x01, 0x09,0x24,0x00,0x08,0x23,0x00,0x09,0x23,0x00,0x09,0x23,0x01,0x82,0x08,0x22, 0x00,0x82,0x09,0x21,0x00,0x82,0x08,0x21,0x00,0x82,0x08,0x20,0x00,0x01,0x07, 0x20,0x00,0x83,0x07,0x1f,0x00,0x04,0x07,0x1f,0x01,0x07,0x1f,0x00,0x07,0x1e, 0x00,0x07,0x1e,0x01,0x82,0x07,0x1d,0x00,0x01,0x07,0x1c,0x00,0x82,0x06,0x1c, 0x00,0x05,0x07,0x1c,0x00,0x06,0x1c,0x00,0x06,0x1b,0x00,0x06,0x1a,0x00,0x06, 0x1b,0x00,0x83,0x06,0x1a,0x00,0x82,0x06,0x19,0x00,0x82,0x05,0x18,0x00,0x01, 0x06,0x18,0x00,0x84,0x05,0x17,0x00,0x83,0x05,0x16,0x00,0x82,0x05,0x15,0x00, 0x82,0x04,0x15,0x00,0x83,0x04,0x14,0x00,0x84,0x04,0x13,0x00,0x82,0x04,0x12, 0x00,0x82,0x03,0x11,0x00,0x84,0x03,0x10,0x00,0x83,0x03,0x0f,0x00,0x82,0x03, 0x0e,0x00,0x82,0x02,0x0e,0x00,0x83,0x02,0x0d,0x00,0x84,0x02,0x0c,0x00,0x82, 0x02,0x0b,0x00,0x84,0x01,0x0a,0x00,0x83,0x01,0x09,0x00,0x84,0x01,0x08,0x00, 0x01,0x01,0x07,0x00,0x82,0x00,0x07,0x00,0x84,0x00,0x06,0x00,0x83,0x00,0x05, 0x00,0x84,0x00,0x04,0x00,0x84,0x00,0x03,0x00,0x83,0x00,0x02,0x00,0x84,0x00, 0x01,0x00,0xde,0x00,0x00,0x00,0x04,0x39,0x90,0x1d,0x35,0x8e,0x1a,0x36,0x8f, 0x1b,0x37,0x90,0x1c,0x82,0x37,0x8f,0x1e,0x82,0x36,0x8f,0x1b,0x03,0x36,0x8e, 0x1d,0x34,0x8c,0x1b,0x35,0x8d,0x1c,0x82,0x35,0x8e,0x1a,0x03,0x34,0x8d,0x19, 0x38,0x91,0x1d,0x34,0x8d,0x19,0x82,0x36,0x8f,0x1b,0x08,0x37,0x8e,0x1b,0x37, 0x90,0x1c,0x35,0x8e,0x1a,0x34,0x8f,0x1a,0x37,0x90,0x1c,0x36,0x8d,0x1a,0x34, 0x8d,0x19,0x35,0x8e,0x1a,0x82,0x36,0x8f,0x1b,0x05,0x35,0x90,0x1b,0x34,0x8f, 0x1a,0x35,0x8d,0x1c,0x36,0x8e,0x1d,0x35,0x8f,0x1d,0x82,0x35,0x8d,0x1c,0x02, 0x37,0x8f,0x1e,0x36,0x8f,0x1b,0x82,0x33,0x8c,0x18,0x02,0x35,0x8d,0x1c,0x34, 0x8e,0x1c,0x84,0x34,0x8c,0x1b,0x03,0x34,0x8b,0x1a,0x34,0x8d,0x19,0x33,0x8e, 0x19,0x82,0x33,0x8b,0x1a,0x0c,0x34,0x8c,0x1b,0x32,0x8c,0x1a,0x31,0x8b,0x19, 0x32,0x8c,0x1a,0x33,0x8e,0x19,0x32,0x8d,0x18,0x33,0x8b,0x1a,0x32,0x8d,0x18, 0x33,0x8e,0x19,0x33,0x8c,0x18,0x33,0x8e,0x19,0x34,0x8d,0x19,0x84,0x32,0x8a, 0x19,0x04,0x30,0x88,0x17,0x31,0x89,0x18,0x32,0x8b,0x17,0x2f,0x8a,0x15,0x82, 0x30,0x8a,0x18,0x01,0x32,0x8b,0x17,0x82,0x30,0x8b,0x16,0x82,0x32,0x8b,0x17, 0x06,0x33,0x8c,0x18,0x32,0x8b,0x17,0x33,0x8c,0x18,0x32,0x8b,0x17,0x31,0x8a, 0x16,0x32,0x8d,0x18,0x82,0x30,0x8b,0x16,0x04,0x2f,0x8a,0x15,0x33,0x8c,0x18, 0x31,0x8a,0x16,0x30,0x8b,0x16,0x82,0x31,0x8a,0x16,0x06,0x30,0x89,0x15,0x30, 0x8b,0x16,0x32,0x8d,0x18,0x31,0x8c,0x17,0x30,0x89,0x15,0x30,0x8b,0x16,0x83, 0x2f,0x8a,0x15,0x06,0x30,0x8b,0x16,0x2f,0x8a,0x15,0x33,0x8e,0x17,0x31,0x8c, 0x15,0x2f,0x8a,0x13,0x2f,0x8a,0x15,0x82,0x30,0x8b,0x16,0x0a,0x31,0x8c,0x15, 0x30,0x8b,0x14,0x31,0x8c,0x15,0x2e,0x89,0x14,0x30,0x89,0x15,0x30,0x8b,0x14, 0x31,0x8c,0x15,0x33,0x8e,0x17,0x2e,0x89,0x12,0x30,0x8b,0x14,0x82,0x2f,0x8a, 0x13,0x82,0x2f,0x8d,0x15,0x27,0x31,0x8c,0x15,0x2e,0x8c,0x14,0x33,0x8e,0x17, 0x32,0x8d,0x16,0x2f,0x8a,0x13,0x2d,0x8b,0x13,0x31,0x8c,0x15,0x2e,0x89,0x12, 0x2f,0x8a,0x13,0x2d,0x8b,0x13,0x2f,0x8d,0x15,0x2e,0x8c,0x14,0x2d,0x8b,0x13, 0x30,0x8e,0x16,0x30,0x8c,0x10,0x2d,0x8b,0x13,0x2f,0x8d,0x15,0x2d,0x8b,0x13, 0x2f,0x8d,0x15,0x2e,0x8c,0x12,0x30,0x8e,0x16,0x30,0x8e,0x12,0x31,0x8f,0x13, 0x30,0x8e,0x14,0x2f,0x8d,0x13,0x2d,0x8b,0x13,0x2d,0x8b,0x11,0x2f,0x8d,0x13, 0x31,0x8f,0x13,0x30,0x8e,0x12,0x30,0x8e,0x14,0x2f,0x8d,0x11,0x30,0x8e,0x12, 0x2f,0x8d,0x11,0x2f,0x8f,0x12,0x30,0x90,0x13,0x2f,0x8f,0x12,0x31,0x91,0x13, 0x31,0x8f,0x15,0x82,0x2f,0x8f,0x12,0x02,0x2e,0x8e,0x11,0x30,0x90,0x13,0x82, 0x30,0x90,0x12,0x0c,0x2f,0x8f,0x12,0x30,0x90,0x12,0x33,0x93,0x15,0x2f,0x8f, 0x11,0x31,0x91,0x13,0x32,0x92,0x14,0x30,0x90,0x12,0x31,0x91,0x13,0x2f,0x8f, 0x11,0x30,0x90,0x12,0x31,0x92,0x11,0x31,0x94,0x13,0x82,0x30,0x93,0x12,0x82, 0x31,0x94,0x13,0x02,0x30,0x93,0x12,0x32,0x96,0x12,0x82,0x34,0x98,0x14,0x82, 0x33,0x97,0x13,0x04,0x35,0x99,0x13,0x34,0x98,0x12,0x37,0x9b,0x14,0x36,0x9a, 0x13,0x82,0x35,0x9b,0x13,0x01,0x36,0x9c,0x14,0x82,0x36,0x9a,0x13,0x83,0x37, 0x9d,0x15,0x03,0x37,0x9d,0x13,0x36,0x9c,0x12,0x37,0x9d,0x13,0x84,0x38,0x9e, 0x14,0x02,0x39,0x9f,0x15,0x39,0xa0,0x13,0x83,0x3a,0xa1,0x14,0x02,0x3b,0xa2, 0x15,0x3a,0xa3,0x13,0x83,0x3b,0xa4,0x14,0x03,0x3c,0xa5,0x15,0x3d,0xa6,0x15, 0x3c,0xa5,0x14,0x82,0x3d,0xa6,0x15,0x01,0x3e,0xa7,0x16,0x82,0x3c,0xa8,0x16, 0x82,0x3d,0xa9,0x15,0x82,0x3e,0xab,0x14,0x07,0x3c,0xa8,0x14,0x40,0xac,0x18, 0x40,0xad,0x16,0x3e,0xab,0x14,0x40,0xad,0x16,0x40,0xac,0x18,0x3f,0xac,0x15, 0x82,0x3e,0xab,0x14,0x0d,0x42,0xaf,0x16,0x42,0xaf,0x18,0x3f,0xac,0x15,0x40, 0xad,0x16,0x41,0xae,0x15,0x43,0xad,0x15,0x44,0xae,0x16,0x43,0xad,0x17,0x41, 0xae,0x17,0x42,0xaf,0x18,0x41,0xae,0x17,0x42,0xac,0x16,0x43,0xad,0x17,0x82, 0x44,0xae,0x18,0x02,0x42,0xaf,0x18,0x43,0xb0,0x17,0x82,0x46,0xb0,0x18,0x05, 0x44,0xb1,0x18,0x44,0xb1,0x1a,0x45,0xb2,0x1b,0x48,0xb2,0x1c,0x47,0xb1,0x1b, 0x82,0x45,0xaf,0x19,0x0a,0x46,0xb0,0x1c,0x44,0xae,0x1a,0x45,0xaf,0x1b,0x46, 0xb0,0x1a,0x4a,0xb4,0x1e,0x47,0xb1,0x1b,0x47,0xb1,0x1d,0x46,0xae,0x1b,0x47, 0xaf,0x1c,0x46,0xb0,0x1c,0x82,0x46,0xae,0x1b,0x0d,0x49,0xb1,0x1e,0x48,0xb0, 0x1b,0x47,0xad,0x1b,0x4b,0xb1,0x1f,0x49,0xaf,0x1d,0x47,0xae,0x1e,0x46,0xad, 0x1d,0x47,0xaf,0x1c,0x49,0xaf,0x1d,0x47,0xad,0x1d,0x49,0xaf,0x1f,0x4a,0xb0, 0x1c,0x49,0xaf,0x1d,0x82,0x47,0xad,0x1d,0x1c,0x46,0xac,0x1c,0x47,0xad,0x1b, 0x48,0xae,0x1a,0x4a,0xb0,0x1c,0x4a,0xb0,0x1e,0x49,0xaf,0x1d,0x4a,0xb0,0x1e, 0x47,0xaf,0x1c,0x47,0xaf,0x1a,0x46,0xae,0x19,0x46,0xac,0x1a,0x48,0xad,0x1c, 0x47,0xac,0x1b,0x48,0xac,0x1a,0x47,0xae,0x1b,0x45,0xab,0x1b,0x46,0xaa,0x1b, 0x46,0xaa,0x19,0x46,0xa9,0x19,0x46,0xac,0x1d,0x44,0xa9,0x19,0x44,0xa7,0x1a, 0x44,0xa6,0x1a,0x45,0xa7,0x19,0x43,0xa5,0x17,0x43,0xa4,0x18,0x43,0xa2,0x17, 0x41,0xa0,0x15,0x82,0x42,0xa0,0x16,0x03,0x3f,0x9f,0x15,0x3d,0x9d,0x15,0x3e, 0x9b,0x14,0x82,0x3d,0x9a,0x14,0x1d,0x3c,0x98,0x14,0x3a,0x96,0x11,0x3c,0x96, 0x13,0x3c,0x95,0x15,0x39,0x91,0x14,0x38,0x90,0x13,0x37,0x90,0x13,0x37,0x8f, 0x13,0x37,0x8d,0x11,0x36,0x8b,0x12,0x34,0x89,0x10,0x35,0x89,0x11,0x34,0x88, 0x10,0x32,0x86,0x0e,0x32,0x85,0x0f,0x33,0x84,0x11,0x31,0x83,0x10,0x30,0x81, 0x10,0x2a,0x7a,0x0c,0x24,0x73,0x06,0x22,0x71,0x05,0x24,0x73,0x07,0x23,0x72, 0x06,0x23,0x70,0x07,0x22,0x6f,0x06,0x21,0x6f,0x06,0x20,0x6d,0x05,0x20,0x6c, 0x05,0x20,0x6b,0x06,0x82,0x1e,0x6a,0x05,0x03,0x1f,0x6a,0x05,0x1f,0x68,0x04, 0x1e,0x66,0x05,0x82,0x1c,0x66,0x05,0x12,0x1c,0x65,0x05,0x1a,0x63,0x03,0x1c, 0x62,0x03,0x1d,0x63,0x05,0x1a,0x63,0x04,0x1b,0x61,0x04,0x1c,0x61,0x04,0x1a, 0x5f,0x03,0x1b,0x60,0x04,0x1a,0x5f,0x03,0x19,0x5e,0x02,0x1a,0x5e,0x03,0x18, 0x5c,0x01,0x18,0x5e,0x03,0x19,0x5c,0x02,0x18,0x5c,0x02,0x17,0x5d,0x02,0x18, 0x5d,0x03,0x82,0x18,0x5b,0x02,0x01,0x19,0x5b,0x03,0x82,0x18,0x5a,0x02,0x0b, 0x18,0x5c,0x03,0x19,0x5d,0x04,0x18,0x59,0x02,0x18,0x5a,0x03,0x18,0x59,0x02, 0x19,0x5a,0x03,0x17,0x5a,0x03,0x16,0x59,0x02,0x17,0x57,0x02,0x18,0x58,0x03, 0x17,0x59,0x03,0x82,0x17,0x59,0x02,0x04,0x17,0x58,0x02,0x16,0x59,0x02,0x17, 0x58,0x03,0x17,0x57,0x03,0x82,0x16,0x56,0x02,0x01,0x16,0x57,0x03,0x82,0x16, 0x56,0x03,0x11,0x14,0x54,0x02,0x15,0x56,0x02,0x15,0x54,0x02,0x16,0x55,0x03, 0x15,0x57,0x02,0x16,0x54,0x02,0x15,0x54,0x03,0x15,0x56,0x02,0x16,0x55,0x01, 0x15,0x54,0x02,0x16,0x53,0x02,0x15,0x52,0x02,0x15,0x51,0x01,0x15,0x52,0x00, 0x15,0x53,0x02,0x14,0x52,0x02,0x16,0x52,0x02,0x82,0x14,0x51,0x02,0x82,0x15, 0x51,0x02,0x06,0x13,0x4f,0x00,0x14,0x50,0x00,0x15,0x51,0x02,0x14,0x50,0x01, 0x14,0x50,0x02,0x13,0x4f,0x01,0x82,0x14,0x4f,0x02,0x82,0x14,0x4e,0x02,0x05, 0x14,0x4e,0x03,0x13,0x4d,0x01,0x14,0x4d,0x02,0x14,0x4e,0x03,0x13,0x4d,0x02, 0x82,0x13,0x4c,0x01,0x82,0x14,0x4c,0x01,0x0f,0x13,0x4b,0x02,0x14,0x4a,0x02, 0x13,0x4b,0x02,0x14,0x4a,0x01,0x13,0x4b,0x01,0x13,0x4a,0x00,0x13,0x4b,0x01, 0x13,0x4a,0x01,0x12,0x49,0x01,0x12,0x4a,0x01,0x13,0x4b,0x03,0x13,0x48,0x01, 0x13,0x49,0x02,0x12,0x47,0x01,0x13,0x47,0x01,0x83,0x12,0x47,0x01,0x02,0x13, 0x47,0x02,0x12,0x46,0x01,0x82,0x13,0x46,0x02,0x07,0x12,0x45,0x01,0x11,0x44, 0x01,0x12,0x46,0x02,0x11,0x45,0x01,0x11,0x44,0x01,0x12,0x44,0x01,0x11,0x43, 0x01,0x82,0x12,0x44,0x01,0x03,0x11,0x43,0x02,0x12,0x43,0x00,0x12,0x42,0x01, 0x82,0x11,0x42,0x02,0x07,0x11,0x41,0x02,0x11,0x41,0x01,0x11,0x40,0x01,0x11, 0x40,0x03,0x11,0x41,0x01,0x11,0x40,0x02,0x11,0x3f,0x02,0x82,0x11,0x3e,0x01, 0x09,0x11,0x3f,0x02,0x0f,0x3e,0x01,0x10,0x3f,0x03,0x11,0x3d,0x02,0x10,0x3c, 0x01,0x10,0x3d,0x01,0x10,0x3d,0x02,0x10,0x3c,0x01,0x0f,0x3b,0x01,0x82,0x10, 0x3c,0x01,0x03,0x10,0x3b,0x00,0x0f,0x3a,0x01,0x10,0x3b,0x01,0x82,0x0f,0x3b, 0x01,0x01,0x0e,0x3a,0x01,0x82,0x0f,0x39,0x00,0x06,0x0f,0x38,0x01,0x0e,0x38, 0x01,0x0f,0x37,0x01,0x0f,0x38,0x01,0x0e,0x37,0x01,0x0f,0x36,0x01,0x82,0x0e, 0x37,0x01,0x01,0x0f,0x36,0x01,0x82,0x0e,0x36,0x01,0x05,0x0e,0x34,0x00,0x0e, 0x34,0x01,0x0e,0x35,0x02,0x0e,0x35,0x01,0x0d,0x34,0x01,0x82,0x0e,0x34,0x01, 0x01,0x0e,0x33,0x01,0x82,0x0d,0x33,0x01,0x0a,0x0d,0x33,0x02,0x0d,0x32,0x01, 0x0d,0x31,0x01,0x0d,0x32,0x01,0x0d,0x31,0x01,0x0c,0x31,0x01,0x0d,0x31,0x01, 0x0d,0x30,0x01,0x0c,0x30,0x01,0x0d,0x30,0x02,0x82,0x0c,0x2f,0x01,0x08,0x0d, 0x2e,0x02,0x0c,0x2d,0x01,0x0c,0x2f,0x02,0x0c,0x2d,0x01,0x0c,0x2e,0x01,0x0a, 0x2e,0x01,0x0c,0x2c,0x01,0x0c,0x2d,0x02,0x83,0x0b,0x2c,0x01,0x82,0x0b,0x2b, 0x01,0x82,0x0b,0x2b,0x02,0x01,0x0c,0x2a,0x02,0x82,0x0b,0x2a,0x02,0x02,0x0b, 0x29,0x01,0x0b,0x28,0x01,0x82,0x0b,0x29,0x02,0x02,0x0b,0x28,0x02,0x0a,0x28, 0x01,0x84,0x0a,0x27,0x01,0x83,0x0a,0x26,0x01,0x82,0x0a,0x25,0x01,0x01,0x09, 0x25,0x00,0x82,0x09,0x24,0x01,0x01,0x0a,0x23,0x01,0x82,0x09,0x23,0x01,0x01, 0x0a,0x22,0x01,0x82,0x09,0x22,0x01,0x02,0x08,0x22,0x01,0x08,0x21,0x01,0x82, 0x09,0x21,0x01,0x82,0x08,0x20,0x01,0x02,0x08,0x1f,0x01,0x09,0x20,0x02,0x82, 0x08,0x1f,0x01,0x01,0x07,0x1e,0x01,0x84,0x08,0x1e,0x01,0x03,0x07,0x1d,0x01, 0x07,0x1c,0x01,0x07,0x1d,0x01,0x82,0x07,0x1c,0x01,0x84,0x07,0x1b,0x01,0x82, 0x07,0x1a,0x01,0x01,0x06,0x1a,0x01,0x82,0x06,0x19,0x01,0x01,0x07,0x19,0x01, 0x83,0x06,0x18,0x01,0x04,0x06,0x17,0x01,0x06,0x17,0x00,0x06,0x17,0x01,0x05, 0x16,0x00,0x82,0x06,0x16,0x01,0x85,0x05,0x15,0x01,0x82,0x05,0x14,0x00,0x01, 0x05,0x13,0x01,0x82,0x05,0x13,0x00,0x83,0x04,0x12,0x00,0x83,0x04,0x11,0x00, 0x83,0x04,0x10,0x00,0x04,0x03,0x0f,0x00,0x04,0x0f,0x00,0x03,0x0f,0x00,0x04, 0x0f,0x00,0x83,0x03,0x0e,0x00,0x84,0x03,0x0d,0x00,0x83,0x03,0x0c,0x00,0x83, 0x02,0x0b,0x00,0x83,0x02,0x0a,0x00,0x84,0x02,0x09,0x00,0x82,0x02,0x08,0x00, 0x01,0x01,0x08,0x00,0x84,0x01,0x07,0x00,0x83,0x01,0x06,0x00,0x84,0x01,0x05, 0x00,0x84,0x01,0x04,0x00,0x83,0x00,0x03,0x00,0x84,0x00,0x02,0x00,0x83,0x00, 0x01,0x00,0xdb,0x00,0x00,0x00,0x04,0x37,0x8e,0x1d,0x38,0x8f,0x1c,0x37,0x8e, 0x1b,0x36,0x8f,0x1b,0x82,0x37,0x8f,0x1e,0x03,0x37,0x90,0x1c,0x38,0x91,0x1d, 0x38,0x90,0x1f,0x83,0x37,0x8f,0x1e,0x01,0x36,0x8e,0x1d,0x82,0x37,0x90,0x1c, 0x0a,0x36,0x8f,0x1b,0x35,0x8e,0x1a,0x37,0x90,0x1c,0x38,0x8f,0x1c,0x38,0x91, 0x1d,0x37,0x90,0x1c,0x34,0x8f,0x1a,0x36,0x8e,0x1d,0x38,0x8f,0x1e,0x36,0x8f, 0x1b,0x82,0x35,0x8e,0x1a,0x03,0x36,0x8f,0x1b,0x35,0x90,0x1b,0x36,0x91,0x1c, 0x82,0x36,0x8e,0x1d,0x11,0x35,0x90,0x1b,0x36,0x8e,0x1d,0x34,0x8c,0x1b,0x35, 0x8d,0x1c,0x34,0x8d,0x19,0x33,0x8c,0x18,0x34,0x8d,0x19,0x33,0x8b,0x1a,0x33, 0x90,0x1b,0x35,0x90,0x1b,0x35,0x8e,0x1a,0x34,0x8d,0x19,0x35,0x8e,0x1a,0x35, 0x8c,0x19,0x35,0x8e,0x1a,0x36,0x8f,0x1b,0x33,0x8c,0x18,0x82,0x35,0x8e,0x1a, 0x84,0x33,0x8e,0x19,0x05,0x32,0x8d,0x18,0x33,0x8a,0x19,0x32,0x8c,0x1a,0x35, 0x8e,0x1a,0x34,0x8d,0x19,0x82,0x32,0x8d,0x18,0x07,0x31,0x89,0x18,0x31,0x8b, 0x19,0x33,0x8c,0x18,0x34,0x8d,0x19,0x32,0x8b,0x17,0x31,0x8a,0x16,0x33,0x8c, 0x18,0x82,0x31,0x8a,0x16,0x02,0x30,0x88,0x17,0x31,0x8a,0x16,0x82,0x31,0x8c, 0x17,0x09,0x32,0x8b,0x17,0x33,0x8c,0x18,0x34,0x8d,0x19,0x30,0x89,0x15,0x31, 0x8a,0x16,0x30,0x89,0x15,0x2f,0x8a,0x15,0x30,0x8b,0x16,0x31,0x8c,0x17,0x82, 0x30,0x8b,0x16,0x11,0x31,0x8c,0x17,0x32,0x8b,0x17,0x2f,0x8a,0x15,0x31,0x8a, 0x16,0x33,0x8b,0x1a,0x2f,0x88,0x14,0x2f,0x8a,0x15,0x30,0x8b,0x16,0x31,0x8c, 0x17,0x31,0x89,0x18,0x30,0x8b,0x16,0x2e,0x89,0x14,0x31,0x8c,0x17,0x30,0x89, 0x15,0x30,0x8b,0x16,0x2f,0x8a,0x15,0x30,0x8b,0x14,0x82,0x31,0x8c,0x15,0x0c, 0x2e,0x89,0x14,0x2f,0x8a,0x15,0x32,0x8d,0x18,0x31,0x8c,0x15,0x30,0x8b,0x14, 0x33,0x8c,0x16,0x31,0x8a,0x14,0x2e,0x87,0x13,0x31,0x8c,0x17,0x32,0x8d,0x16, 0x31,0x8c,0x15,0x2e,0x89,0x12,0x83,0x30,0x8b,0x14,0x04,0x2e,0x8b,0x16,0x2e, 0x8c,0x14,0x31,0x8c,0x15,0x30,0x8b,0x14,0x82,0x32,0x8d,0x16,0x15,0x2f,0x8a, 0x13,0x2e,0x8c,0x14,0x2f,0x8a,0x11,0x31,0x8c,0x13,0x31,0x8c,0x15,0x32,0x8d, 0x16,0x2f,0x8d,0x13,0x30,0x8e,0x14,0x2d,0x8b,0x11,0x2f,0x8d,0x13,0x2e,0x8c, 0x12,0x2e,0x8c,0x14,0x31,0x8f,0x15,0x30,0x8e,0x14,0x30,0x8e,0x12,0x32,0x90, 0x14,0x31,0x8f,0x17,0x2f,0x8d,0x13,0x2e,0x8e,0x13,0x2c,0x8c,0x11,0x2d,0x8b, 0x11,0x82,0x2d,0x8b,0x0f,0x06,0x2e,0x8c,0x12,0x32,0x8d,0x14,0x31,0x8c,0x13, 0x2e,0x8c,0x12,0x2f,0x8d,0x13,0x2e,0x8c,0x12,0x82,0x2f,0x8d,0x13,0x82,0x2f, 0x8f,0x14,0x03,0x2e,0x8e,0x13,0x2d,0x8b,0x11,0x2f,0x8d,0x11,0x82,0x2e,0x8e, 0x11,0x01,0x2e,0x8e,0x10,0x82,0x2f,0x8f,0x11,0x17,0x2e,0x8e,0x11,0x31,0x92, 0x11,0x33,0x94,0x13,0x2f,0x90,0x0f,0x31,0x91,0x13,0x2f,0x8f,0x11,0x2e,0x8e, 0x10,0x2f,0x8f,0x11,0x30,0x90,0x12,0x2f,0x8f,0x12,0x30,0x90,0x12,0x2d,0x90, 0x11,0x31,0x94,0x13,0x2e,0x91,0x10,0x31,0x91,0x13,0x32,0x93,0x12,0x32,0x92, 0x14,0x32,0x95,0x14,0x31,0x95,0x11,0x32,0x96,0x12,0x33,0x97,0x13,0x2f,0x93, 0x0f,0x33,0x97,0x13,0x82,0x33,0x97,0x11,0x0a,0x34,0x98,0x12,0x33,0x99,0x12, 0x32,0x98,0x11,0x34,0x9a,0x13,0x35,0x99,0x13,0x35,0x99,0x12,0x36,0x9a,0x13, 0x36,0x9c,0x14,0x36,0x9a,0x13,0x35,0x9b,0x13,0x82,0x35,0x9b,0x11,0x01,0x37, 0x9d,0x13,0x82,0x36,0x9c,0x12,0x06,0x37,0x9d,0x13,0x38,0x9e,0x14,0x37,0x9d, 0x13,0x38,0x9e,0x14,0x39,0xa0,0x13,0x38,0x9f,0x12,0x82,0x3a,0xa1,0x14,0x07, 0x3a,0xa3,0x13,0x3a,0xa3,0x15,0x39,0xa2,0x14,0x3c,0xa5,0x15,0x3b,0xa4,0x14, 0x3c,0xa5,0x14,0x3b,0xa4,0x13,0x82,0x3c,0xa6,0x12,0x09,0x39,0xa5,0x13,0x3b, 0xa7,0x15,0x3c,0xa8,0x14,0x3d,0xa9,0x15,0x3c,0xa9,0x12,0x3d,0xaa,0x13,0x3e, 0xa8,0x12,0x3f,0xa9,0x15,0x3e,0xaa,0x16,0x82,0x3d,0xaa,0x13,0x0c,0x3e,0xab, 0x12,0x40,0xad,0x14,0x3f,0xac,0x13,0x40,0xad,0x16,0x3f,0xac,0x15,0x3e,0xaa, 0x16,0x3f,0xac,0x15,0x3e,0xab,0x14,0x40,0xad,0x16,0x41,0xae,0x15,0x44,0xae, 0x16,0x42,0xac,0x16,0x83,0x41,0xae,0x17,0x08,0x42,0xac,0x16,0x43,0xad,0x17, 0x44,0xae,0x18,0x43,0xad,0x17,0x42,0xaf,0x16,0x43,0xb0,0x15,0x44,0xae,0x18, 0x46,0xb0,0x1a,0x82,0x44,0xb1,0x18,0x05,0x47,0xb1,0x19,0x44,0xae,0x16,0x46, 0xb0,0x1a,0x47,0xaf,0x1a,0x43,0xad,0x17,0x82,0x44,0xae,0x1a,0x02,0x45,0xaf, 0x1b,0x44,0xae,0x18,0x82,0x45,0xaf,0x19,0x05,0x45,0xaf,0x1b,0x49,0xaf,0x1d, 0x46,0xae,0x1b,0x44,0xae,0x1a,0x46,0xad,0x1d,0x82,0x46,0xae,0x1b,0x03,0x45, 0xad,0x18,0x47,0xaf,0x1a,0x46,0xac,0x1a,0x82,0x47,0xaf,0x1a,0x07,0x48,0xb0, 0x1b,0x46,0xae,0x1b,0x47,0xaf,0x1c,0x48,0xb0,0x1b,0x46,0xae,0x19,0x48,0xb0, 0x1d,0x49,0xaf,0x1d,0x86,0x48,0xae,0x1c,0x29,0x47,0xaf,0x1c,0x49,0xb1,0x1e, 0x47,0xaf,0x1c,0x48,0xb0,0x1d,0x49,0xb1,0x1c,0x48,0xb0,0x1b,0x47,0xaf,0x1c, 0x47,0xac,0x1d,0x48,0xaf,0x1b,0x47,0xab,0x1b,0x46,0xab,0x1b,0x45,0xa9,0x18, 0x44,0xaa,0x18,0x43,0xa9,0x19,0x44,0xa9,0x1a,0x46,0xaa,0x1a,0x45,0xab,0x18, 0x43,0xa8,0x1a,0x44,0xa6,0x1a,0x45,0xa7,0x19,0x44,0xa6,0x18,0x43,0xa4,0x18, 0x42,0xa4,0x18,0x43,0xa2,0x15,0x40,0xa1,0x16,0x41,0xa2,0x17,0x40,0xa0,0x18, 0x3f,0x9f,0x17,0x3d,0x9c,0x15,0x3d,0x9d,0x16,0x3e,0x9b,0x15,0x3c,0x98,0x13, 0x3c,0x98,0x14,0x3a,0x96,0x12,0x3c,0x95,0x13,0x3a,0x93,0x13,0x39,0x93,0x13, 0x37,0x90,0x13,0x36,0x90,0x15,0x37,0x8f,0x14,0x39,0x8d,0x14,0x82,0x37,0x8b, 0x13,0x2c,0x34,0x88,0x11,0x32,0x86,0x0f,0x32,0x85,0x0f,0x31,0x84,0x0e,0x32, 0x84,0x0f,0x30,0x83,0x10,0x31,0x84,0x10,0x2e,0x7f,0x0f,0x29,0x78,0x0b,0x24, 0x73,0x07,0x23,0x72,0x06,0x23,0x72,0x07,0x22,0x70,0x05,0x21,0x6f,0x08,0x20, 0x6d,0x06,0x21,0x6c,0x07,0x1f,0x6a,0x06,0x1e,0x6b,0x06,0x1f,0x6c,0x05,0x1f, 0x6a,0x05,0x20,0x68,0x05,0x1d,0x66,0x02,0x1d,0x67,0x04,0x1c,0x66,0x03,0x1d, 0x66,0x04,0x1c,0x65,0x05,0x1c,0x62,0x03,0x1a,0x63,0x03,0x1a,0x63,0x04,0x1b, 0x61,0x04,0x1b,0x60,0x04,0x18,0x60,0x03,0x1a,0x61,0x03,0x18,0x5f,0x01,0x17, 0x5e,0x00,0x1a,0x5f,0x04,0x1a,0x5e,0x03,0x17,0x5d,0x02,0x1a,0x5c,0x03,0x19, 0x5d,0x03,0x18,0x5d,0x03,0x18,0x5c,0x02,0x18,0x5b,0x02,0x17,0x5d,0x03,0x82, 0x19,0x5b,0x03,0x10,0x17,0x5c,0x03,0x15,0x59,0x00,0x19,0x5b,0x02,0x18,0x5c, 0x03,0x18,0x59,0x02,0x18,0x59,0x03,0x17,0x5b,0x03,0x17,0x5a,0x03,0x17,0x59, 0x03,0x16,0x59,0x03,0x17,0x57,0x02,0x16,0x58,0x02,0x17,0x59,0x02,0x18,0x59, 0x03,0x17,0x5a,0x03,0x16,0x59,0x02,0x82,0x16,0x57,0x01,0x19,0x17,0x58,0x02, 0x18,0x56,0x02,0x16,0x57,0x02,0x16,0x55,0x01,0x16,0x56,0x02,0x15,0x55,0x01, 0x17,0x56,0x04,0x16,0x55,0x02,0x17,0x55,0x02,0x17,0x53,0x01,0x16,0x56,0x02, 0x16,0x55,0x01,0x16,0x54,0x02,0x16,0x55,0x01,0x15,0x54,0x02,0x15,0x53,0x02, 0x15,0x52,0x02,0x16,0x53,0x01,0x15,0x52,0x00,0x15,0x53,0x02,0x14,0x52,0x02, 0x15,0x52,0x02,0x14,0x51,0x02,0x15,0x51,0x01,0x13,0x50,0x00,0x82,0x14,0x50, 0x02,0x02,0x14,0x51,0x02,0x14,0x50,0x01,0x82,0x14,0x4f,0x00,0x01,0x14,0x4e, 0x01,0x82,0x13,0x4d,0x01,0x01,0x14,0x4d,0x01,0x82,0x13,0x4d,0x01,0x82,0x12, 0x4c,0x01,0x16,0x14,0x4e,0x03,0x12,0x4b,0x00,0x14,0x4d,0x01,0x13,0x4c,0x01, 0x14,0x4d,0x02,0x13,0x4d,0x01,0x12,0x4a,0x01,0x13,0x4a,0x01,0x14,0x4b,0x03, 0x14,0x4a,0x01,0x13,0x4b,0x00,0x14,0x4b,0x01,0x13,0x4b,0x02,0x12,0x4a,0x01, 0x14,0x49,0x03,0x12,0x4a,0x01,0x12,0x49,0x01,0x13,0x49,0x02,0x13,0x48,0x01, 0x14,0x48,0x02,0x13,0x47,0x00,0x13,0x48,0x01,0x82,0x12,0x47,0x01,0x01,0x13, 0x47,0x02,0x82,0x12,0x46,0x01,0x07,0x13,0x46,0x02,0x11,0x45,0x01,0x12,0x45, 0x01,0x11,0x45,0x01,0x12,0x45,0x01,0x11,0x44,0x01,0x10,0x44,0x01,0x82,0x11, 0x44,0x00,0x82,0x12,0x43,0x02,0x82,0x11,0x42,0x01,0x02,0x11,0x42,0x02,0x11, 0x41,0x01,0x82,0x11,0x41,0x02,0x03,0x11,0x40,0x01,0x11,0x40,0x02,0x10,0x3f, 0x00,0x82,0x11,0x3f,0x02,0x01,0x11,0x3e,0x01,0x82,0x11,0x3f,0x01,0x02,0x0f, 0x3d,0x01,0x10,0x3e,0x02,0x82,0x10,0x3d,0x02,0x03,0x11,0x3e,0x01,0x10,0x3d, 0x01,0x10,0x3d,0x02,0x82,0x0f,0x3b,0x01,0x04,0x10,0x3c,0x01,0x10,0x3c,0x02, 0x0f,0x3a,0x01,0x10,0x3a,0x01,0x82,0x10,0x39,0x01,0x05,0x0f,0x38,0x00,0x10, 0x3a,0x02,0x0f,0x3a,0x01,0x0f,0x38,0x01,0x0f,0x39,0x02,0x82,0x0f,0x38,0x01, 0x02,0x0e,0x37,0x02,0x0f,0x36,0x02,0x82,0x0e,0x37,0x01,0x0e,0x0f,0x37,0x01, 0x0d,0x36,0x00,0x0d,0x36,0x01,0x0e,0x35,0x01,0x0e,0x35,0x02,0x0e,0x34,0x02, 0x0d,0x35,0x02,0x0e,0x35,0x03,0x0d,0x34,0x01,0x0d,0x33,0x01,0x0e,0x33,0x01, 0x0e,0x33,0x02,0x0d,0x33,0x01,0x0d,0x32,0x01,0x82,0x0d,0x32,0x02,0x85,0x0d, 0x31,0x01,0x82,0x0d,0x2f,0x01,0x0a,0x0c,0x2f,0x01,0x0c,0x2e,0x01,0x0d,0x2f, 0x01,0x0d,0x2d,0x01,0x0c,0x2e,0x01,0x0c,0x2f,0x02,0x0c,0x2e,0x01,0x0b,0x2d, 0x01,0x0c,0x2d,0x01,0x0b,0x2d,0x01,0x82,0x0b,0x2c,0x01,0x01,0x0c,0x2c,0x01, 0x82,0x0b,0x2b,0x01,0x02,0x0b,0x2c,0x02,0x0b,0x2b,0x01,0x83,0x0b,0x2a,0x01, 0x06,0x0a,0x2a,0x02,0x0a,0x29,0x01,0x0a,0x28,0x01,0x0b,0x29,0x01,0x0a,0x29, 0x01,0x0a,0x28,0x01,0x84,0x0a,0x27,0x01,0x01,0x0a,0x27,0x02,0x82,0x0a,0x26, 0x01,0x82,0x0a,0x25,0x01,0x02,0x0a,0x24,0x01,0x09,0x23,0x01,0x82,0x09,0x24, 0x01,0x02,0x09,0x23,0x01,0x09,0x23,0x00,0x82,0x09,0x23,0x01,0x82,0x09,0x22, 0x01,0x02,0x08,0x22,0x01,0x08,0x21,0x01,0x83,0x09,0x21,0x01,0x01,0x08,0x20, 0x01,0x86,0x08,0x1f,0x01,0x82,0x08,0x1e,0x01,0x06,0x07,0x1d,0x01,0x08,0x1d, 0x01,0x07,0x1d,0x01,0x07,0x1c,0x01,0x07,0x1b,0x01,0x06,0x1b,0x01,0x83,0x07, 0x1b,0x01,0x82,0x07,0x1a,0x01,0x01,0x06,0x1a,0x01,0x82,0x06,0x19,0x01,0x02, 0x07,0x19,0x01,0x06,0x18,0x00,0x83,0x06,0x18,0x01,0x03,0x06,0x17,0x00,0x05, 0x17,0x00,0x06,0x16,0x01,0x82,0x06,0x16,0x00,0x01,0x05,0x16,0x01,0x82,0x05, 0x15,0x01,0x82,0x05,0x15,0x00,0x03,0x05,0x14,0x00,0x05,0x14,0x01,0x05,0x13, 0x01,0x82,0x05,0x13,0x00,0x01,0x05,0x13,0x01,0x82,0x04,0x12,0x00,0x83,0x04, 0x11,0x00,0x84,0x04,0x10,0x00,0x01,0x04,0x0f,0x00,0x82,0x03,0x0f,0x00,0x83, 0x03,0x0e,0x00,0x84,0x03,0x0d,0x00,0x83,0x03,0x0c,0x00,0x03,0x02,0x0b,0x00, 0x03,0x0b,0x00,0x02,0x0b,0x00,0x84,0x02,0x0a,0x00,0x83,0x02,0x09,0x00,0x82, 0x02,0x08,0x00,0x82,0x01,0x08,0x00,0x83,0x01,0x07,0x00,0x83,0x01,0x06,0x00, 0x84,0x01,0x05,0x00,0x83,0x01,0x04,0x00,0x01,0x00,0x04,0x00,0x83,0x00,0x03, 0x00,0x84,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xdb,0x00,0x00,0x00,0x01,0x39, 0x92,0x1e,0x83,0x36,0x8f,0x1b,0x02,0x35,0x8d,0x1c,0x39,0x91,0x20,0x82,0x37, 0x90,0x1c,0x06,0x38,0x90,0x1f,0x37,0x8f,0x1e,0x37,0x90,0x1c,0x39,0x92,0x1e, 0x37,0x90,0x1c,0x38,0x91,0x1d,0x82,0x37,0x90,0x1c,0x05,0x39,0x92,0x1e,0x37, 0x90,0x1c,0x36,0x8f,0x1b,0x39,0x92,0x1e,0x38,0x91,0x1d,0x83,0x37,0x90,0x1c, 0x03,0x38,0x91,0x1d,0x36,0x8f,0x1b,0x34,0x8d,0x19,0x82,0x35,0x8e,0x1a,0x82, 0x37,0x90,0x1c,0x04,0x36,0x8f,0x1b,0x35,0x90,0x1b,0x36,0x8f,0x1b,0x33,0x8c, 0x18,0x82,0x36,0x8f,0x1b,0x82,0x35,0x8e,0x1a,0x01,0x37,0x8e,0x1b,0x83,0x34, 0x8c,0x1b,0x01,0x34,0x8d,0x19,0x82,0x35,0x8e,0x1a,0x05,0x33,0x8e,0x19,0x34, 0x8e,0x1c,0x33,0x8c,0x18,0x34,0x8f,0x1a,0x33,0x8e,0x19,0x82,0x33,0x8d,0x1b, 0x04,0x33,0x8e,0x19,0x34,0x8d,0x19,0x33,0x8c,0x18,0x33,0x8b,0x1a,0x83,0x33, 0x8c,0x18,0x08,0x34,0x8c,0x1b,0x32,0x8a,0x19,0x35,0x8d,0x1c,0x33,0x8c,0x18, 0x30,0x8a,0x18,0x32,0x8a,0x19,0x33,0x8b,0x1a,0x32,0x8b,0x17,0x82,0x33,0x8c, 0x18,0x10,0x31,0x8a,0x16,0x32,0x8d,0x18,0x33,0x8e,0x19,0x32,0x8d,0x18,0x32, 0x8b,0x17,0x33,0x8b,0x1a,0x32,0x8a,0x19,0x32,0x8b,0x17,0x31,0x8a,0x16,0x32, 0x8d,0x18,0x31,0x8c,0x17,0x31,0x8a,0x16,0x2f,0x87,0x16,0x30,0x88,0x17,0x33, 0x8b,0x1a,0x32,0x8b,0x17,0x82,0x31,0x8c,0x17,0x01,0x34,0x8d,0x19,0x82,0x32, 0x8b,0x17,0x01,0x33,0x8c,0x18,0x83,0x32,0x8b,0x17,0x03,0x30,0x89,0x15,0x31, 0x8c,0x17,0x31,0x8c,0x15,0x82,0x32,0x8d,0x18,0x05,0x32,0x8b,0x17,0x2f,0x8a, 0x15,0x31,0x8c,0x17,0x30,0x8b,0x16,0x31,0x8c,0x15,0x82,0x30,0x8b,0x16,0x07, 0x2f,0x89,0x17,0x30,0x8a,0x18,0x32,0x8d,0x18,0x30,0x8b,0x16,0x31,0x8c,0x15, 0x31,0x8a,0x16,0x32,0x8d,0x18,0x82,0x30,0x8b,0x16,0x02,0x31,0x8c,0x15,0x2e, 0x89,0x12,0x82,0x31,0x8c,0x15,0x08,0x32,0x8d,0x16,0x30,0x8b,0x14,0x2e,0x8b, 0x16,0x32,0x8b,0x15,0x30,0x8e,0x16,0x31,0x8c,0x15,0x2f,0x8d,0x15,0x2e,0x89, 0x12,0x82,0x2e,0x8c,0x14,0x02,0x30,0x8e,0x16,0x31,0x8c,0x15,0x83,0x30,0x8b, 0x12,0x02,0x32,0x8d,0x16,0x2e,0x8b,0x16,0x82,0x2e,0x8c,0x12,0x06,0x2d,0x8b, 0x0f,0x30,0x90,0x13,0x30,0x8e,0x14,0x2f,0x8d,0x13,0x2d,0x8b,0x13,0x2f,0x8d, 0x15,0x82,0x2e,0x8c,0x12,0x02,0x30,0x90,0x15,0x2f,0x8f,0x14,0x82,0x2f,0x8d, 0x13,0x02,0x2e,0x8c,0x14,0x2e,0x8c,0x10,0x82,0x2f,0x8f,0x12,0x02,0x30,0x8e, 0x12,0x2f,0x8d,0x13,0x82,0x2f,0x8f,0x14,0x01,0x2e,0x8c,0x12,0x82,0x2e,0x8e, 0x11,0x82,0x30,0x90,0x13,0x0a,0x2e,0x8e,0x11,0x2d,0x8d,0x10,0x2e,0x8e,0x10, 0x30,0x90,0x12,0x30,0x90,0x13,0x31,0x91,0x13,0x32,0x92,0x14,0x31,0x91,0x13, 0x30,0x91,0x10,0x31,0x91,0x13,0x82,0x2f,0x8f,0x12,0x0b,0x2f,0x8f,0x11,0x2e, 0x8e,0x11,0x2f,0x8f,0x12,0x31,0x91,0x14,0x2f,0x8f,0x11,0x30,0x91,0x10,0x31, 0x91,0x13,0x30,0x90,0x12,0x2e,0x91,0x10,0x2f,0x92,0x13,0x2e,0x91,0x12,0x82, 0x30,0x93,0x12,0x03,0x31,0x94,0x13,0x30,0x93,0x12,0x31,0x94,0x13,0x82,0x32, 0x96,0x12,0x10,0x33,0x97,0x11,0x32,0x96,0x10,0x33,0x97,0x11,0x33,0x99,0x12, 0x32,0x98,0x11,0x32,0x98,0x10,0x35,0x99,0x12,0x37,0x9b,0x15,0x34,0x98,0x11, 0x34,0x9a,0x10,0x36,0x9c,0x12,0x35,0x9b,0x13,0x36,0x9c,0x14,0x35,0x9b,0x13, 0x36,0x9c,0x12,0x37,0x9d,0x13,0x82,0x35,0x9d,0x12,0x01,0x36,0x9e,0x13,0x83, 0x38,0x9f,0x12,0x06,0x38,0xa1,0x13,0x3a,0x9f,0x13,0x39,0xa0,0x13,0x38,0xa4, 0x13,0x3a,0xa3,0x13,0x3b,0xa2,0x12,0x83,0x3b,0xa4,0x13,0x05,0x3c,0xa5,0x14, 0x3d,0xa6,0x15,0x3b,0xa7,0x13,0x3c,0xa8,0x14,0x3e,0xaa,0x16,0x82,0x3d,0xaa, 0x13,0x0b,0x3e,0xab,0x14,0x3e,0xaa,0x16,0x3e,0xab,0x12,0x3d,0xaa,0x13,0x3e, 0xab,0x14,0x3f,0xac,0x15,0x3e,0xaa,0x16,0x3f,0xab,0x17,0x3e,0xaa,0x16,0x40, 0xad,0x16,0x41,0xae,0x17,0x82,0x40,0xad,0x16,0x04,0x3f,0xac,0x15,0x40,0xad, 0x16,0x3f,0xac,0x15,0x41,0xae,0x17,0x82,0x40,0xad,0x16,0x82,0x42,0xaf,0x18, 0x83,0x41,0xae,0x17,0x0d,0x43,0xb0,0x19,0x42,0xaf,0x18,0x43,0xb0,0x19,0x42, 0xaf,0x18,0x43,0xb0,0x19,0x42,0xaf,0x18,0x44,0xae,0x18,0x42,0xac,0x16,0x43, 0xac,0x1b,0x43,0xad,0x19,0x45,0xaf,0x19,0x44,0xae,0x18,0x45,0xaf,0x19,0x82, 0x45,0xad,0x1a,0x03,0x46,0xae,0x1b,0x45,0xad,0x1a,0x46,0xb0,0x1c,0x83,0x45, 0xaf,0x1b,0x05,0x43,0xad,0x19,0x45,0xaf,0x1b,0x47,0xb1,0x1d,0x45,0xaf,0x19, 0x46,0xae,0x19,0x82,0x46,0xae,0x1b,0x06,0x47,0xad,0x1b,0x48,0xae,0x1c,0x48, 0xb0,0x1d,0x48,0xae,0x1c,0x48,0xb0,0x1d,0x46,0xae,0x1b,0x82,0x47,0xaf,0x1c, 0x01,0x49,0xb1,0x1e,0x82,0x47,0xaf,0x1c,0x01,0x48,0xb0,0x1d,0x82,0x47,0xaf, 0x1c,0x0a,0x48,0xb0,0x1d,0x48,0xae,0x1c,0x47,0xad,0x19,0x47,0xaf,0x1a,0x48, 0xb0,0x1b,0x48,0xaf,0x1b,0x46,0xad,0x1b,0x47,0xab,0x19,0x47,0xac,0x1a,0x47, 0xab,0x1a,0x82,0x45,0xac,0x17,0x2d,0x47,0xac,0x1b,0x47,0xab,0x1b,0x43,0xa8, 0x1a,0x46,0xab,0x1b,0x45,0xa9,0x1a,0x44,0xa6,0x18,0x46,0xa8,0x19,0x43,0xa5, 0x17,0x42,0xa4,0x16,0x42,0xa4,0x14,0x45,0xa3,0x19,0x42,0xa2,0x18,0x41,0xa1, 0x17,0x41,0xa2,0x18,0x3e,0x9d,0x14,0x3d,0x9d,0x16,0x3e,0x9e,0x17,0x3f,0x9b, 0x16,0x3c,0x9b,0x15,0x39,0x98,0x12,0x3c,0x97,0x14,0x3b,0x97,0x14,0x38,0x93, 0x10,0x37,0x91,0x12,0x39,0x91,0x15,0x38,0x90,0x14,0x38,0x90,0x12,0x3a,0x8f, 0x13,0x38,0x8d,0x12,0x34,0x8a,0x10,0x33,0x89,0x0f,0x34,0x88,0x11,0x33,0x87, 0x10,0x33,0x86,0x10,0x30,0x83,0x0e,0x2f,0x82,0x0d,0x31,0x82,0x0f,0x32,0x82, 0x10,0x2c,0x7c,0x0d,0x27,0x76,0x09,0x23,0x70,0x06,0x22,0x6f,0x06,0x21,0x6f, 0x06,0x21,0x6e,0x06,0x21,0x6c,0x07,0x83,0x20,0x6b,0x06,0x01,0x1e,0x69,0x05, 0x83,0x1d,0x69,0x05,0x04,0x1d,0x68,0x05,0x1c,0x67,0x05,0x1d,0x66,0x05,0x1c, 0x65,0x05,0x82,0x1a,0x63,0x03,0x01,0x1a,0x62,0x04,0x82,0x19,0x61,0x04,0x07, 0x1b,0x61,0x04,0x1b,0x5f,0x04,0x1a,0x5e,0x03,0x19,0x60,0x04,0x18,0x5f,0x01, 0x18,0x5c,0x01,0x19,0x5c,0x02,0x82,0x19,0x5d,0x03,0x0c,0x18,0x5c,0x02,0x1a, 0x5d,0x03,0x18,0x5d,0x02,0x16,0x5b,0x00,0x18,0x5d,0x02,0x18,0x5c,0x02,0x16, 0x5b,0x02,0x16,0x5a,0x02,0x18,0x5c,0x03,0x17,0x5a,0x03,0x18,0x59,0x02,0x17, 0x58,0x02,0x82,0x18,0x59,0x03,0x08,0x17,0x57,0x02,0x19,0x59,0x03,0x19,0x58, 0x03,0x16,0x58,0x03,0x17,0x59,0x03,0x16,0x58,0x03,0x16,0x59,0x02,0x17,0x58, 0x02,0x82,0x17,0x57,0x02,0x01,0x16,0x56,0x01,0x82,0x16,0x57,0x02,0x1f,0x16, 0x56,0x02,0x15,0x55,0x02,0x15,0x56,0x02,0x16,0x55,0x02,0x15,0x54,0x01,0x15, 0x55,0x00,0x16,0x54,0x00,0x15,0x53,0x01,0x16,0x55,0x01,0x15,0x54,0x00,0x14, 0x53,0x01,0x15,0x53,0x02,0x17,0x52,0x02,0x17,0x54,0x02,0x14,0x53,0x00,0x15, 0x54,0x02,0x14,0x55,0x02,0x15,0x52,0x02,0x16,0x51,0x02,0x14,0x50,0x01,0x13, 0x50,0x00,0x14,0x50,0x00,0x15,0x50,0x01,0x16,0x51,0x02,0x14,0x50,0x01,0x15, 0x4f,0x02,0x14,0x50,0x02,0x13,0x4f,0x01,0x13,0x4e,0x01,0x14,0x4f,0x02,0x14, 0x4e,0x02,0x82,0x13,0x4d,0x00,0x02,0x14,0x4e,0x01,0x13,0x4d,0x00,0x82,0x13, 0x4d,0x01,0x01,0x13,0x4c,0x01,0x82,0x14,0x4b,0x01,0x04,0x14,0x4d,0x02,0x14, 0x4c,0x00,0x14,0x4a,0x01,0x13,0x4b,0x01,0x82,0x13,0x4b,0x03,0x0f,0x13,0x4a, 0x02,0x13,0x4b,0x01,0x13,0x4b,0x02,0x12,0x49,0x01,0x13,0x49,0x01,0x13,0x49, 0x00,0x13,0x49,0x02,0x13,0x48,0x01,0x12,0x48,0x01,0x13,0x47,0x01,0x12,0x47, 0x02,0x11,0x47,0x01,0x13,0x48,0x02,0x12,0x47,0x01,0x12,0x47,0x02,0x82,0x11, 0x46,0x01,0x04,0x11,0x46,0x00,0x12,0x46,0x01,0x12,0x46,0x02,0x11,0x45,0x01, 0x82,0x11,0x43,0x01,0x08,0x11,0x43,0x02,0x10,0x42,0x01,0x12,0x43,0x02,0x11, 0x43,0x01,0x11,0x42,0x01,0x12,0x42,0x02,0x11,0x41,0x01,0x10,0x42,0x01,0x82, 0x11,0x41,0x01,0x21,0x10,0x41,0x02,0x11,0x3f,0x02,0x11,0x3f,0x01,0x0f,0x41, 0x01,0x10,0x3f,0x01,0x10,0x3e,0x01,0x10,0x3e,0x02,0x11,0x3f,0x03,0x11,0x3e, 0x02,0x10,0x3e,0x00,0x0f,0x3e,0x01,0x10,0x3c,0x01,0x11,0x3c,0x01,0x10,0x3c, 0x01,0x10,0x3d,0x02,0x0f,0x3c,0x01,0x0f,0x3b,0x01,0x11,0x3b,0x01,0x0f,0x3b, 0x01,0x10,0x3a,0x01,0x10,0x3b,0x01,0x0f,0x39,0x01,0x0f,0x39,0x00,0x0e,0x3a, 0x02,0x10,0x3a,0x02,0x0f,0x3a,0x02,0x0f,0x38,0x01,0x0e,0x38,0x00,0x0f,0x37, 0x01,0x0f,0x38,0x01,0x0f,0x37,0x01,0x0e,0x37,0x02,0x0f,0x36,0x01,0x82,0x0e, 0x36,0x01,0x0a,0x0f,0x36,0x02,0x0f,0x35,0x01,0x0e,0x35,0x01,0x0d,0x36,0x01, 0x0e,0x34,0x01,0x0d,0x35,0x01,0x0f,0x34,0x02,0x0f,0x33,0x01,0x0d,0x34,0x01, 0x0e,0x34,0x02,0x82,0x0d,0x33,0x01,0x07,0x0c,0x32,0x01,0x0d,0x33,0x02,0x0e, 0x31,0x02,0x0d,0x31,0x02,0x0d,0x30,0x01,0x0c,0x30,0x01,0x0d,0x31,0x02,0x82, 0x0d,0x30,0x01,0x02,0x0c,0x2f,0x01,0x0d,0x2f,0x02,0x82,0x0c,0x2f,0x01,0x02, 0x0d,0x2e,0x01,0x0c,0x2f,0x01,0x82,0x0c,0x2e,0x01,0x83,0x0c,0x2d,0x01,0x02, 0x0b,0x2c,0x01,0x0c,0x2c,0x01,0x83,0x0b,0x2c,0x01,0x01,0x0b,0x2b,0x01,0x83, 0x0b,0x2a,0x01,0x01,0x0b,0x29,0x01,0x82,0x0a,0x29,0x01,0x05,0x0a,0x29,0x02, 0x0b,0x29,0x02,0x0b,0x28,0x02,0x0a,0x28,0x01,0x0a,0x26,0x01,0x83,0x0a,0x27, 0x01,0x05,0x0a,0x26,0x01,0x0b,0x25,0x01,0x09,0x25,0x01,0x0a,0x25,0x01,0x09, 0x25,0x01,0x84,0x09,0x24,0x01,0x83,0x09,0x23,0x01,0x06,0x08,0x23,0x02,0x09, 0x22,0x02,0x09,0x21,0x01,0x08,0x21,0x01,0x09,0x21,0x01,0x09,0x20,0x01,0x82, 0x08,0x21,0x01,0x08,0x08,0x20,0x01,0x08,0x20,0x02,0x08,0x1f,0x01,0x08,0x1f, 0x02,0x08,0x1f,0x01,0x08,0x1e,0x01,0x08,0x1e,0x00,0x08,0x1e,0x01,0x84,0x08, 0x1d,0x01,0x83,0x07,0x1c,0x01,0x84,0x07,0x1b,0x01,0x83,0x07,0x1a,0x01,0x07, 0x07,0x19,0x01,0x06,0x19,0x00,0x07,0x19,0x01,0x06,0x19,0x01,0x06,0x18,0x01, 0x06,0x17,0x01,0x06,0x17,0x00,0x83,0x06,0x17,0x01,0x01,0x06,0x16,0x00,0x82, 0x05,0x16,0x00,0x03,0x06,0x15,0x01,0x05,0x15,0x00,0x05,0x14,0x00,0x82,0x05, 0x14,0x01,0x82,0x05,0x13,0x01,0x03,0x05,0x13,0x00,0x05,0x13,0x01,0x04,0x13, 0x01,0x82,0x04,0x12,0x00,0x83,0x04,0x11,0x00,0x82,0x04,0x10,0x00,0x83,0x04, 0x0f,0x00,0x01,0x03,0x0f,0x00,0x84,0x03,0x0e,0x00,0x83,0x03,0x0d,0x00,0x83, 0x03,0x0c,0x00,0x03,0x02,0x0b,0x00,0x03,0x0b,0x00,0x02,0x0b,0x00,0x84,0x02, 0x0a,0x00,0x82,0x02,0x09,0x00,0x84,0x02,0x08,0x00,0x84,0x01,0x07,0x00,0x83, 0x01,0x06,0x00,0x84,0x01,0x05,0x00,0x84,0x01,0x04,0x00,0x83,0x00,0x03,0x00, 0x83,0x00,0x02,0x00,0x84,0x00,0x01,0x00,0xdb,0x00,0x00,0x00,0x04,0x39,0x92, 0x1e,0x37,0x90,0x1c,0x38,0x91,0x1d,0x3a,0x93,0x1f,0x83,0x38,0x91,0x1d,0x09, 0x39,0x92,0x1e,0x38,0x90,0x1f,0x39,0x92,0x1e,0x37,0x90,0x1c,0x38,0x91,0x1d, 0x39,0x92,0x1e,0x38,0x91,0x1d,0x37,0x90,0x1c,0x39,0x92,0x1e,0x82,0x38,0x91, 0x1d,0x82,0x37,0x90,0x1c,0x03,0x37,0x90,0x1a,0x38,0x91,0x1b,0x38,0x91,0x1d, 0x84,0x36,0x8f,0x1b,0x03,0x38,0x91,0x1d,0x37,0x90,0x1c,0x38,0x90,0x1f,0x82, 0x36,0x8e,0x1d,0x01,0x37,0x90,0x1c,0x84,0x36,0x8f,0x1b,0x06,0x37,0x90,0x1c, 0x35,0x8e,0x1a,0x36,0x8f,0x1b,0x35,0x90,0x1b,0x36,0x8d,0x1c,0x36,0x8d,0x1a, 0x82,0x35,0x90,0x1b,0x06,0x35,0x8c,0x19,0x33,0x8c,0x18,0x32,0x8f,0x1a,0x34, 0x8f,0x1a,0x36,0x91,0x1c,0x33,0x8e,0x19,0x82,0x34,0x8d,0x19,0x0d,0x33,0x8c, 0x18,0x35,0x8e,0x1a,0x33,0x8e,0x19,0x36,0x8e,0x1d,0x34,0x8d,0x19,0x35,0x8e, 0x1a,0x34,0x8d,0x19,0x34,0x8c,0x1b,0x33,0x8b,0x1a,0x34,0x8c,0x1b,0x34,0x8d, 0x19,0x33,0x8e,0x19,0x32,0x8d,0x18,0x82,0x34,0x8d,0x19,0x04,0x33,0x8c,0x18, 0x34,0x8d,0x19,0x33,0x8e,0x19,0x32,0x8d,0x18,0x82,0x31,0x8c,0x17,0x82,0x34, 0x8d,0x19,0x01,0x32,0x8b,0x17,0x82,0x33,0x8c,0x18,0x83,0x31,0x8c,0x17,0x82, 0x32,0x8a,0x19,0x02,0x33,0x8c,0x18,0x32,0x8b,0x17,0x82,0x31,0x8c,0x17,0x82, 0x33,0x8c,0x18,0x03,0x30,0x8b,0x16,0x31,0x8c,0x17,0x32,0x8d,0x18,0x82,0x30, 0x8b,0x16,0x82,0x31,0x8c,0x17,0x0b,0x31,0x8c,0x15,0x34,0x8d,0x19,0x33,0x8c, 0x18,0x30,0x89,0x15,0x2f,0x8a,0x15,0x33,0x8e,0x19,0x30,0x8b,0x16,0x31,0x8c, 0x15,0x33,0x8e,0x17,0x31,0x8c,0x17,0x32,0x8d,0x18,0x82,0x31,0x8c,0x17,0x23, 0x32,0x8d,0x16,0x2e,0x89,0x12,0x33,0x8c,0x18,0x31,0x8c,0x17,0x31,0x8c,0x15, 0x2e,0x89,0x12,0x32,0x8d,0x16,0x30,0x8e,0x16,0x2e,0x8c,0x14,0x31,0x8c,0x15, 0x32,0x8d,0x16,0x2f,0x8d,0x15,0x30,0x8e,0x16,0x32,0x8d,0x16,0x31,0x8c,0x15, 0x2f,0x8d,0x15,0x30,0x8b,0x14,0x31,0x8c,0x15,0x30,0x8b,0x14,0x2e,0x89,0x12, 0x2d,0x88,0x11,0x32,0x8d,0x16,0x30,0x8e,0x16,0x2d,0x8b,0x11,0x2f,0x8d,0x15, 0x30,0x8e,0x16,0x30,0x8b,0x14,0x2f,0x8d,0x13,0x2e,0x8c,0x14,0x2e,0x8c,0x12, 0x2d,0x8d,0x12,0x2f,0x8d,0x15,0x31,0x8f,0x13,0x2d,0x8b,0x11,0x2f,0x8d,0x15, 0x84,0x2e,0x8c,0x12,0x01,0x30,0x8e,0x14,0x82,0x2f,0x8d,0x13,0x08,0x31,0x8f, 0x15,0x31,0x8f,0x13,0x2e,0x8c,0x10,0x30,0x8e,0x12,0x2f,0x8d,0x13,0x30,0x90, 0x15,0x2f,0x8f,0x14,0x30,0x8e,0x14,0x83,0x2f,0x8f,0x12,0x0d,0x2d,0x8d,0x10, 0x2f,0x8f,0x12,0x2e,0x8e,0x11,0x2f,0x8f,0x12,0x30,0x90,0x12,0x30,0x90,0x13, 0x30,0x90,0x12,0x2f,0x8f,0x11,0x30,0x90,0x12,0x31,0x92,0x11,0x31,0x91,0x13, 0x30,0x90,0x13,0x30,0x8f,0x11,0x84,0x30,0x90,0x12,0x05,0x30,0x90,0x13,0x31, 0x91,0x14,0x30,0x90,0x12,0x31,0x92,0x11,0x30,0x93,0x12,0x82,0x2e,0x91,0x12, 0x03,0x2e,0x91,0x10,0x30,0x93,0x12,0x2e,0x91,0x10,0x82,0x30,0x93,0x12,0x08, 0x31,0x92,0x0f,0x30,0x94,0x10,0x30,0x95,0x11,0x31,0x96,0x12,0x32,0x97,0x13, 0x2f,0x94,0x10,0x31,0x95,0x11,0x34,0x98,0x12,0x82,0x33,0x97,0x11,0x04,0x35, 0x99,0x13,0x33,0x99,0x12,0x34,0x9a,0x13,0x35,0x9b,0x13,0x82,0x33,0x99,0x11, 0x03,0x34,0x9a,0x10,0x35,0x9b,0x11,0x36,0x9c,0x12,0x82,0x35,0x9b,0x11,0x82, 0x37,0x9d,0x13,0x05,0x38,0x9f,0x12,0x36,0x9f,0x11,0x37,0xa0,0x12,0x38,0xa1, 0x13,0x38,0xa1,0x11,0x82,0x39,0xa2,0x12,0x83,0x39,0xa2,0x11,0x07,0x3a,0xa3, 0x12,0x3c,0xa5,0x14,0x3d,0xa6,0x15,0x3d,0xa7,0x13,0x3b,0xa7,0x13,0x3a,0xa6, 0x12,0x3b,0xa7,0x13,0x82,0x3d,0xa9,0x15,0x02,0x3c,0xa8,0x14,0x3f,0xac,0x15, 0x82,0x3c,0xa9,0x12,0x03,0x3e,0xab,0x14,0x3e,0xac,0x15,0x3e,0xaa,0x16,0x82, 0x40,0xad,0x16,0x02,0x3f,0xac,0x15,0x3e,0xab,0x14,0x82,0x40,0xad,0x16,0x03, 0x41,0xae,0x17,0x3f,0xac,0x15,0x41,0xae,0x15,0x82,0x40,0xad,0x16,0x05,0x41, 0xae,0x15,0x42,0xaf,0x16,0x42,0xaf,0x18,0x42,0xaf,0x16,0x42,0xaf,0x18,0x83, 0x41,0xae,0x17,0x83,0x43,0xb0,0x19,0x0d,0x43,0xad,0x17,0x42,0xae,0x1a,0x41, 0xae,0x17,0x44,0xae,0x18,0x44,0xae,0x16,0x45,0xaf,0x19,0x44,0xac,0x19,0x43, 0xad,0x19,0x45,0xaf,0x1b,0x42,0xac,0x16,0x46,0xb0,0x1a,0x44,0xae,0x18,0x43, 0xad,0x17,0x82,0x44,0xae,0x18,0x06,0x45,0xaf,0x19,0x46,0xb0,0x1a,0x48,0xb0, 0x1b,0x46,0xb0,0x1a,0x47,0xaf,0x1c,0x45,0xad,0x1a,0x82,0x46,0xae,0x1b,0x02, 0x48,0xae,0x1c,0x44,0xac,0x19,0x82,0x46,0xae,0x1b,0x04,0x47,0xaf,0x1c,0x46, 0xae,0x1b,0x47,0xaf,0x1c,0x46,0xae,0x19,0x82,0x47,0xaf,0x1c,0x01,0x49,0xb1, 0x1e,0x83,0x46,0xae,0x1b,0x83,0x46,0xae,0x19,0x0b,0x47,0xae,0x1a,0x46,0xab, 0x1a,0x48,0xae,0x1b,0x45,0xac,0x19,0x45,0xab,0x19,0x46,0xad,0x18,0x46,0xaa, 0x19,0x44,0xa9,0x18,0x45,0xaa,0x19,0x43,0xa8,0x1a,0x43,0xa8,0x18,0x82,0x43, 0xa7,0x18,0x26,0x45,0xa7,0x18,0x43,0xa4,0x16,0x43,0xa5,0x17,0x42,0xa3,0x16, 0x41,0xa2,0x15,0x42,0xa2,0x16,0x43,0xa3,0x19,0x41,0xa1,0x17,0x40,0xa0,0x17, 0x3e,0x9e,0x15,0x3d,0x9d,0x14,0x3f,0x9e,0x16,0x3f,0x9b,0x14,0x3d,0x9b,0x16, 0x3c,0x9a,0x15,0x3b,0x97,0x13,0x3b,0x96,0x14,0x3a,0x93,0x12,0x39,0x92,0x13, 0x38,0x92,0x13,0x38,0x90,0x12,0x3a,0x90,0x14,0x39,0x8e,0x13,0x37,0x8d,0x12, 0x34,0x8a,0x10,0x35,0x89,0x11,0x36,0x89,0x12,0x34,0x87,0x10,0x33,0x86,0x10, 0x31,0x84,0x0f,0x30,0x82,0x0e,0x31,0x81,0x0f,0x30,0x80,0x0e,0x30,0x80,0x10, 0x2a,0x79,0x0d,0x26,0x73,0x07,0x21,0x6e,0x06,0x23,0x6f,0x07,0x82,0x21,0x6d, 0x06,0x09,0x22,0x6e,0x06,0x21,0x6c,0x06,0x20,0x6a,0x06,0x1e,0x6a,0x07,0x1e, 0x69,0x03,0x1f,0x69,0x05,0x20,0x69,0x06,0x1d,0x66,0x04,0x1c,0x65,0x03,0x82, 0x1c,0x65,0x05,0x01,0x1b,0x63,0x04,0x82,0x1a,0x62,0x03,0x0d,0x1a,0x62,0x04, 0x19,0x61,0x04,0x1b,0x5f,0x04,0x19,0x60,0x04,0x18,0x5f,0x01,0x1a,0x60,0x03, 0x1a,0x5e,0x04,0x19,0x5d,0x03,0x18,0x5c,0x02,0x18,0x5d,0x03,0x17,0x5c,0x02, 0x17,0x5d,0x03,0x18,0x5d,0x02,0x82,0x17,0x5c,0x01,0x09,0x18,0x5c,0x02,0x17, 0x5b,0x03,0x16,0x5a,0x02,0x18,0x5c,0x03,0x18,0x5b,0x03,0x18,0x59,0x03,0x17, 0x58,0x02,0x17,0x5a,0x03,0x17,0x59,0x03,0x82,0x16,0x59,0x03,0x02,0x16,0x58, 0x03,0x15,0x57,0x02,0x82,0x16,0x58,0x01,0x01,0x17,0x5a,0x03,0x82,0x16,0x57, 0x01,0x02,0x17,0x57,0x02,0x16,0x58,0x02,0x82,0x16,0x57,0x02,0x04,0x15,0x54, 0x00,0x15,0x56,0x01,0x18,0x55,0x03,0x15,0x55,0x01,0x82,0x17,0x55,0x01,0x13, 0x14,0x54,0x01,0x15,0x53,0x01,0x16,0x54,0x02,0x16,0x53,0x02,0x15,0x52,0x01, 0x15,0x53,0x02,0x15,0x52,0x02,0x15,0x53,0x02,0x14,0x52,0x00,0x15,0x53,0x02, 0x14,0x53,0x02,0x14,0x52,0x02,0x13,0x50,0x00,0x15,0x50,0x02,0x15,0x51,0x02, 0x14,0x50,0x00,0x14,0x4f,0x00,0x14,0x50,0x00,0x14,0x50,0x01,0x82,0x14,0x4e, 0x01,0x09,0x13,0x4f,0x01,0x13,0x4e,0x01,0x14,0x4f,0x02,0x13,0x4e,0x00,0x13, 0x4d,0x01,0x14,0x4e,0x02,0x14,0x4e,0x01,0x14,0x4d,0x02,0x13,0x4d,0x02,0x82, 0x13,0x4c,0x01,0x07,0x13,0x4b,0x00,0x14,0x4b,0x01,0x13,0x4b,0x01,0x14,0x4c, 0x01,0x13,0x4b,0x01,0x14,0x4b,0x01,0x13,0x4b,0x03,0x83,0x13,0x4a,0x01,0x06, 0x14,0x4a,0x01,0x12,0x48,0x00,0x12,0x4a,0x00,0x13,0x4b,0x01,0x12,0x49,0x01, 0x13,0x47,0x01,0x82,0x13,0x48,0x02,0x05,0x12,0x48,0x02,0x13,0x46,0x01,0x12, 0x47,0x01,0x12,0x46,0x01,0x13,0x48,0x02,0x82,0x12,0x47,0x02,0x04,0x12,0x45, 0x00,0x14,0x46,0x01,0x12,0x45,0x02,0x12,0x44,0x01,0x82,0x11,0x43,0x02,0x03, 0x12,0x43,0x01,0x11,0x43,0x00,0x11,0x43,0x01,0x82,0x12,0x43,0x02,0x0a,0x10, 0x42,0x01,0x11,0x43,0x01,0x10,0x41,0x00,0x10,0x41,0x01,0x11,0x42,0x02,0x11, 0x40,0x01,0x10,0x40,0x01,0x12,0x41,0x02,0x10,0x40,0x01,0x0f,0x40,0x00,0x82, 0x10,0x3e,0x01,0x05,0x10,0x3f,0x02,0x10,0x3d,0x01,0x11,0x3f,0x01,0x10,0x3e, 0x01,0x10,0x3d,0x01,0x82,0x11,0x3d,0x01,0x82,0x10,0x3c,0x01,0x01,0x10,0x3c, 0x00,0x82,0x10,0x3b,0x01,0x04,0x0f,0x3a,0x01,0x10,0x3b,0x00,0x0f,0x3b,0x00, 0x0f,0x3b,0x01,0x82,0x0f,0x39,0x01,0x03,0x10,0x39,0x01,0x0e,0x37,0x00,0x0e, 0x39,0x01,0x82,0x0f,0x39,0x02,0x09,0x0f,0x37,0x01,0x0e,0x37,0x01,0x0f,0x36, 0x01,0x0e,0x36,0x01,0x0e,0x35,0x00,0x0e,0x37,0x01,0x0f,0x36,0x02,0x0d,0x36, 0x01,0x0e,0x36,0x02,0x82,0x0e,0x35,0x01,0x02,0x0d,0x34,0x01,0x0e,0x34,0x01, 0x82,0x0e,0x34,0x02,0x01,0x0d,0x33,0x01,0x82,0x0d,0x32,0x01,0x82,0x0d,0x32, 0x02,0x02,0x0d,0x32,0x01,0x0d,0x31,0x02,0x82,0x0c,0x30,0x01,0x82,0x0d,0x30, 0x01,0x01,0x0d,0x30,0x02,0x83,0x0d,0x2f,0x02,0x03,0x0c,0x2e,0x01,0x0c,0x2f, 0x02,0x0c,0x2d,0x01,0x82,0x0c,0x2e,0x01,0x05,0x0c,0x2e,0x02,0x0b,0x2d,0x01, 0x0b,0x2c,0x01,0x0c,0x2c,0x01,0x0b,0x2c,0x01,0x83,0x0b,0x2b,0x01,0x02,0x0b, 0x2a,0x01,0x0b,0x2b,0x01,0x82,0x0b,0x2a,0x01,0x02,0x0b,0x29,0x01,0x0a,0x29, 0x01,0x84,0x0a,0x28,0x01,0x84,0x0a,0x27,0x01,0x01,0x0a,0x26,0x01,0x84,0x0a, 0x25,0x01,0x02,0x0a,0x25,0x02,0x09,0x24,0x01,0x82,0x0a,0x24,0x02,0x01,0x0a, 0x23,0x02,0x82,0x09,0x23,0x01,0x82,0x09,0x22,0x01,0x02,0x09,0x21,0x01,0x08, 0x21,0x01,0x82,0x09,0x21,0x01,0x01,0x08,0x21,0x01,0x83,0x08,0x20,0x01,0x84, 0x08,0x1f,0x01,0x83,0x08,0x1e,0x01,0x03,0x07,0x1d,0x01,0x08,0x1d,0x01,0x07, 0x1d,0x01,0x82,0x07,0x1c,0x01,0x85,0x07,0x1b,0x01,0x83,0x07,0x1a,0x01,0x82, 0x06,0x19,0x00,0x01,0x06,0x19,0x01,0x82,0x06,0x18,0x01,0x83,0x06,0x17,0x00, 0x03,0x05,0x17,0x00,0x06,0x17,0x01,0x06,0x16,0x00,0x82,0x06,0x16,0x01,0x82, 0x05,0x15,0x00,0x01,0x05,0x15,0x01,0x82,0x05,0x14,0x01,0x04,0x05,0x14,0x00, 0x05,0x13,0x01,0x05,0x13,0x00,0x05,0x13,0x01,0x82,0x04,0x12,0x00,0x01,0x05, 0x11,0x00,0x83,0x04,0x11,0x00,0x83,0x04,0x10,0x00,0x01,0x04,0x0f,0x00,0x82, 0x03,0x0f,0x00,0x83,0x03,0x0e,0x00,0x84,0x03,0x0d,0x00,0x83,0x03,0x0c,0x00, 0x84,0x02,0x0b,0x00,0x83,0x02,0x0a,0x00,0x83,0x02,0x09,0x00,0x83,0x02,0x08, 0x00,0x01,0x02,0x07,0x00,0x83,0x01,0x07,0x00,0x83,0x01,0x06,0x00,0x84,0x01, 0x05,0x00,0x83,0x01,0x04,0x00,0x84,0x00,0x03,0x00,0x84,0x00,0x02,0x00,0x83, 0x00,0x01,0x00,0xdb,0x00,0x00,0x00,0x82,0x39,0x92,0x1e,0x84,0x3a,0x93,0x1f, 0x01,0x38,0x91,0x1d,0x82,0x39,0x92,0x1e,0x82,0x38,0x91,0x1d,0x01,0x3a,0x93, 0x1f,0x82,0x39,0x92,0x1e,0x04,0x38,0x91,0x1d,0x39,0x92,0x1e,0x3a,0x93,0x1d, 0x39,0x92,0x1c,0x82,0x38,0x91,0x1d,0x01,0x38,0x91,0x1b,0x82,0x39,0x92,0x1c, 0x01,0x38,0x91,0x1b,0x83,0x38,0x91,0x1d,0x02,0x39,0x92,0x1e,0x37,0x90,0x1c, 0x82,0x36,0x8f,0x1b,0x02,0x37,0x90,0x1c,0x36,0x8f,0x1b,0x85,0x37,0x90,0x1c, 0x82,0x35,0x8e,0x1a,0x86,0x36,0x8f,0x1b,0x05,0x35,0x90,0x1b,0x36,0x91,0x1c, 0x32,0x8f,0x1a,0x36,0x91,0x1c,0x35,0x8e,0x1a,0x83,0x36,0x8f,0x1b,0x01,0x35, 0x90,0x1b,0x82,0x34,0x8f,0x1a,0x02,0x32,0x8d,0x18,0x34,0x8f,0x1a,0x82,0x33, 0x8e,0x19,0x03,0x34,0x8e,0x1c,0x34,0x8d,0x19,0x33,0x8c,0x18,0x86,0x33,0x8e, 0x19,0x02,0x32,0x8d,0x18,0x33,0x8e,0x19,0x82,0x33,0x8c,0x18,0x82,0x34,0x8d, 0x19,0x04,0x33,0x8c,0x18,0x32,0x8b,0x17,0x33,0x8c,0x18,0x31,0x8c,0x17,0x82, 0x32,0x8d,0x18,0x02,0x34,0x8d,0x19,0x32,0x8b,0x17,0x82,0x33,0x8c,0x18,0x82, 0x31,0x8c,0x17,0x02,0x30,0x8b,0x16,0x32,0x8d,0x18,0x82,0x32,0x8d,0x16,0x82, 0x32,0x8d,0x18,0x02,0x33,0x8e,0x17,0x31,0x8c,0x15,0x82,0x32,0x8b,0x17,0x04, 0x33,0x8c,0x18,0x32,0x8b,0x17,0x33,0x8c,0x18,0x31,0x8c,0x17,0x82,0x32,0x8d, 0x18,0x82,0x32,0x8d,0x16,0x1a,0x31,0x8c,0x15,0x33,0x8e,0x19,0x32,0x8d,0x16, 0x31,0x8c,0x15,0x32,0x8d,0x16,0x31,0x8c,0x15,0x30,0x8b,0x14,0x31,0x8c,0x15, 0x30,0x8e,0x16,0x2f,0x8a,0x13,0x31,0x8c,0x15,0x30,0x8e,0x16,0x2f,0x8d,0x15, 0x31,0x8c,0x15,0x33,0x8e,0x19,0x30,0x8e,0x16,0x31,0x8c,0x15,0x2f,0x8d,0x15, 0x2f,0x8a,0x13,0x2f,0x8c,0x17,0x30,0x8b,0x14,0x2d,0x8b,0x13,0x31,0x8c,0x15, 0x33,0x8e,0x17,0x31,0x8c,0x15,0x30,0x8b,0x14,0x83,0x2f,0x8d,0x15,0x04,0x30, 0x8e,0x16,0x2f,0x8a,0x13,0x31,0x8f,0x15,0x2c,0x8a,0x12,0x82,0x2f,0x8d,0x13, 0x03,0x2f,0x8d,0x15,0x31,0x8c,0x13,0x31,0x8f,0x15,0x82,0x2f,0x8d,0x13,0x04, 0x2e,0x8c,0x12,0x2f,0x8d,0x13,0x30,0x8e,0x14,0x2f,0x8d,0x13,0x82,0x2e,0x8c, 0x12,0x03,0x2f,0x8d,0x13,0x30,0x8e,0x14,0x2f,0x8d,0x13,0x82,0x2e,0x8c,0x12, 0x05,0x2c,0x8c,0x11,0x2e,0x8e,0x13,0x30,0x8e,0x12,0x2f,0x8f,0x14,0x2c,0x8c, 0x11,0x83,0x2f,0x8f,0x14,0x0b,0x2b,0x8b,0x0e,0x2e,0x8e,0x11,0x30,0x90,0x12, 0x2e,0x8e,0x11,0x30,0x90,0x12,0x2f,0x8f,0x12,0x2d,0x8d,0x10,0x2e,0x8f,0x0e, 0x30,0x90,0x12,0x30,0x90,0x13,0x30,0x90,0x12,0x82,0x2f,0x8f,0x11,0x0a,0x31, 0x92,0x11,0x31,0x91,0x13,0x2e,0x8e,0x10,0x30,0x90,0x13,0x31,0x91,0x13,0x32, 0x92,0x14,0x30,0x93,0x12,0x2d,0x90,0x11,0x30,0x93,0x14,0x2f,0x92,0x11,0x83, 0x30,0x93,0x12,0x01,0x31,0x94,0x13,0x82,0x30,0x94,0x10,0x1a,0x2d,0x92,0x0e, 0x2e,0x93,0x0f,0x31,0x96,0x12,0x32,0x95,0x14,0x31,0x95,0x11,0x33,0x94,0x11, 0x31,0x95,0x11,0x32,0x96,0x10,0x31,0x95,0x11,0x30,0x95,0x13,0x31,0x96,0x12, 0x33,0x99,0x11,0x35,0x9b,0x13,0x34,0x9a,0x13,0x36,0x9c,0x12,0x34,0x9a,0x10, 0x35,0x9b,0x13,0x34,0x9a,0x12,0x33,0x99,0x11,0x34,0x9a,0x12,0x35,0x9b,0x11, 0x36,0x9c,0x12,0x38,0x9f,0x12,0x35,0xa0,0x12,0x38,0xa1,0x13,0x38,0x9f,0x12, 0x82,0x38,0xa1,0x11,0x82,0x36,0x9f,0x0f,0x82,0x38,0xa1,0x11,0x82,0x3a,0xa3, 0x12,0x82,0x3b,0xa4,0x13,0x01,0x3c,0xa5,0x14,0x82,0x3d,0xa6,0x15,0x08,0x3b, 0xa8,0x11,0x39,0xa5,0x11,0x3d,0xaa,0x13,0x3c,0xa9,0x12,0x3d,0xa9,0x15,0x3f, 0xa9,0x11,0x3e,0xa8,0x12,0x3d,0xa9,0x15,0x82,0x3d,0xaa,0x13,0x02,0x3e,0xab, 0x14,0x3d,0xaa,0x13,0x82,0x3e,0xab,0x14,0x0a,0x3f,0xac,0x15,0x40,0xad,0x16, 0x40,0xac,0x18,0x3f,0xac,0x15,0x3f,0xac,0x13,0x41,0xae,0x17,0x42,0xaf,0x18, 0x40,0xad,0x14,0x40,0xad,0x16,0x41,0xae,0x17,0x83,0x42,0xaf,0x18,0x01,0x41, 0xae,0x17,0x82,0x42,0xaf,0x18,0x06,0x42,0xac,0x16,0x42,0xae,0x1a,0x41,0xae, 0x17,0x42,0xaf,0x16,0x44,0xae,0x16,0x43,0xad,0x17,0x82,0x42,0xac,0x18,0x82, 0x45,0xaf,0x19,0x08,0x47,0xb1,0x1b,0x44,0xae,0x18,0x42,0xac,0x16,0x44,0xae, 0x18,0x46,0xb0,0x1a,0x46,0xae,0x19,0x45,0xaf,0x19,0x47,0xaf,0x1a,0x82,0x45, 0xaf,0x19,0x01,0x46,0xae,0x1b,0x82,0x45,0xaf,0x1b,0x03,0x47,0xaf,0x1c,0x45, 0xad,0x1a,0x46,0xae,0x1b,0x82,0x45,0xad,0x1a,0x01,0x47,0xaf,0x1c,0x82,0x47, 0xaf,0x1a,0x07,0x47,0xaf,0x1c,0x46,0xae,0x1b,0x48,0xb0,0x1b,0x46,0xae,0x19, 0x47,0xaf,0x1a,0x49,0xb1,0x1c,0x48,0xb0,0x1b,0x82,0x46,0xae,0x19,0x82,0x47, 0xae,0x1a,0x02,0x47,0xad,0x1a,0x43,0xaa,0x17,0x82,0x46,0xac,0x1a,0x03,0x44, 0xac,0x19,0x45,0xaa,0x19,0x46,0xab,0x1a,0x82,0x42,0xa7,0x17,0x08,0x43,0xa7, 0x18,0x44,0xa8,0x19,0x44,0xa8,0x18,0x43,0xa4,0x16,0x43,0xa5,0x17,0x44,0xa5, 0x18,0x43,0xa4,0x17,0x40,0xa1,0x14,0x82,0x41,0xa1,0x15,0x02,0x41,0xa1,0x18, 0x40,0xa0,0x15,0x82,0x40,0x9f,0x15,0x0b,0x3e,0x9d,0x15,0x3e,0x9c,0x15,0x3e, 0x9a,0x14,0x3b,0x97,0x13,0x3c,0x9a,0x16,0x38,0x96,0x12,0x39,0x94,0x12,0x39, 0x93,0x12,0x3a,0x93,0x14,0x37,0x8f,0x11,0x37,0x8e,0x13,0x82,0x36,0x8c,0x12, 0x05,0x37,0x8c,0x11,0x35,0x88,0x11,0x32,0x88,0x10,0x36,0x89,0x13,0x32,0x85, 0x0f,0x82,0x30,0x82,0x0e,0x01,0x32,0x82,0x0e,0x82,0x31,0x80,0x0f,0x03,0x30, 0x80,0x11,0x2a,0x78,0x0d,0x24,0x72,0x07,0x83,0x22,0x6e,0x05,0x05,0x22,0x6d, 0x06,0x21,0x6c,0x05,0x21,0x6b,0x07,0x1f,0x6a,0x04,0x1f,0x69,0x04,0x83,0x1f, 0x68,0x05,0x03,0x1d,0x66,0x04,0x1c,0x65,0x03,0x1d,0x65,0x05,0x82,0x1b,0x63, 0x04,0x01,0x1c,0x63,0x04,0x82,0x1a,0x61,0x03,0x04,0x1a,0x62,0x04,0x19,0x60, 0x02,0x19,0x5f,0x02,0x19,0x5f,0x04,0x82,0x18,0x5e,0x03,0x82,0x18,0x5e,0x04, 0x15,0x18,0x5e,0x03,0x17,0x5d,0x03,0x16,0x5b,0x02,0x18,0x5d,0x02,0x17,0x5c, 0x01,0x16,0x5b,0x02,0x16,0x5a,0x02,0x17,0x5b,0x03,0x18,0x5b,0x02,0x17,0x5a, 0x01,0x18,0x59,0x03,0x17,0x5a,0x03,0x17,0x59,0x03,0x16,0x59,0x03,0x16,0x59, 0x01,0x16,0x58,0x01,0x15,0x57,0x00,0x18,0x57,0x01,0x19,0x58,0x03,0x15,0x58, 0x01,0x15,0x56,0x00,0x82,0x17,0x57,0x02,0x18,0x16,0x58,0x02,0x15,0x57,0x01, 0x17,0x57,0x02,0x16,0x56,0x02,0x15,0x56,0x02,0x15,0x55,0x02,0x15,0x54,0x01, 0x17,0x57,0x02,0x17,0x55,0x02,0x15,0x53,0x01,0x14,0x53,0x00,0x16,0x51,0x00, 0x16,0x53,0x02,0x15,0x52,0x01,0x14,0x53,0x01,0x15,0x54,0x02,0x15,0x53,0x02, 0x14,0x52,0x01,0x14,0x52,0x02,0x15,0x51,0x02,0x14,0x52,0x02,0x14,0x51,0x02, 0x15,0x52,0x02,0x15,0x51,0x02,0x84,0x14,0x50,0x02,0x03,0x13,0x4d,0x00,0x14, 0x4e,0x01,0x13,0x4f,0x01,0x82,0x14,0x4f,0x01,0x07,0x13,0x4e,0x00,0x12,0x4d, 0x01,0x14,0x4e,0x02,0x13,0x4d,0x01,0x12,0x4c,0x01,0x13,0x4c,0x01,0x13,0x4d, 0x02,0x82,0x13,0x4c,0x02,0x06,0x13,0x4a,0x00,0x13,0x4b,0x01,0x14,0x4c,0x01, 0x13,0x4b,0x01,0x14,0x4c,0x02,0x13,0x4b,0x01,0x82,0x13,0x4a,0x01,0x12,0x13, 0x49,0x00,0x13,0x4a,0x00,0x13,0x49,0x01,0x12,0x4a,0x00,0x12,0x49,0x00,0x12, 0x49,0x01,0x13,0x48,0x01,0x13,0x48,0x02,0x13,0x47,0x01,0x12,0x48,0x01,0x12, 0x47,0x01,0x12,0x46,0x01,0x13,0x47,0x02,0x12,0x46,0x01,0x11,0x45,0x01,0x12, 0x45,0x01,0x12,0x45,0x00,0x12,0x45,0x01,0x82,0x11,0x45,0x01,0x0a,0x12,0x44, 0x02,0x12,0x44,0x01,0x12,0x43,0x01,0x12,0x44,0x01,0x11,0x42,0x01,0x12,0x42, 0x01,0x11,0x43,0x02,0x10,0x44,0x02,0x11,0x43,0x01,0x11,0x41,0x01,0x82,0x11, 0x42,0x02,0x82,0x11,0x41,0x02,0x09,0x10,0x40,0x00,0x0f,0x41,0x01,0x10,0x40, 0x01,0x11,0x3f,0x01,0x11,0x40,0x02,0x10,0x3f,0x02,0x0f,0x3e,0x01,0x0f,0x3d, 0x01,0x10,0x3e,0x01,0x82,0x10,0x3d,0x01,0x02,0x10,0x3c,0x01,0x10,0x3d,0x01, 0x83,0x10,0x3c,0x01,0x03,0x0f,0x3c,0x01,0x0f,0x3b,0x00,0x10,0x3b,0x00,0x82, 0x0f,0x3b,0x01,0x03,0x0f,0x38,0x00,0x0f,0x39,0x01,0x0f,0x39,0x00,0x82,0x0f, 0x39,0x01,0x0f,0x0f,0x38,0x01,0x0e,0x38,0x01,0x0f,0x38,0x01,0x0e,0x37,0x01, 0x0f,0x37,0x01,0x0e,0x37,0x01,0x0e,0x36,0x01,0x0e,0x37,0x01,0x0e,0x36,0x01, 0x0e,0x36,0x00,0x0e,0x36,0x02,0x0e,0x34,0x01,0x0d,0x35,0x01,0x0c,0x34,0x00, 0x0d,0x33,0x00,0x82,0x0d,0x34,0x01,0x06,0x0e,0x33,0x01,0x0e,0x32,0x01,0x0d, 0x33,0x02,0x0c,0x32,0x01,0x0d,0x31,0x01,0x0d,0x32,0x00,0x82,0x0d,0x31,0x01, 0x01,0x0c,0x30,0x01,0x82,0x0d,0x30,0x01,0x01,0x0c,0x2f,0x01,0x82,0x0c,0x2e, 0x01,0x06,0x0c,0x2f,0x02,0x0c,0x2e,0x01,0x0c,0x2f,0x02,0x0c,0x2d,0x02,0x0c, 0x2d,0x01,0x0c,0x2e,0x01,0x83,0x0b,0x2d,0x01,0x02,0x0c,0x2c,0x02,0x0b,0x2c, 0x02,0x82,0x0b,0x2b,0x01,0x85,0x0b,0x2a,0x01,0x82,0x0b,0x29,0x01,0x01,0x0b, 0x29,0x02,0x82,0x0a,0x28,0x01,0x0b,0x0b,0x28,0x01,0x0b,0x27,0x01,0x0a,0x27, 0x01,0x0a,0x27,0x02,0x0a,0x27,0x01,0x0b,0x26,0x01,0x0a,0x25,0x01,0x0a,0x26, 0x01,0x0a,0x25,0x01,0x09,0x25,0x01,0x0a,0x25,0x02,0x83,0x09,0x24,0x01,0x06, 0x0a,0x24,0x02,0x09,0x23,0x01,0x09,0x23,0x00,0x09,0x22,0x01,0x09,0x23,0x01, 0x09,0x22,0x01,0x82,0x08,0x21,0x01,0x02,0x09,0x21,0x01,0x08,0x21,0x01,0x84, 0x08,0x20,0x01,0x84,0x08,0x1f,0x01,0x03,0x08,0x1e,0x01,0x08,0x1d,0x01,0x07, 0x1d,0x00,0x82,0x07,0x1d,0x01,0x02,0x08,0x1c,0x01,0x07,0x1c,0x01,0x84,0x07, 0x1b,0x01,0x84,0x07,0x1a,0x01,0x84,0x06,0x19,0x01,0x02,0x06,0x18,0x01,0x06, 0x17,0x00,0x82,0x06,0x17,0x01,0x01,0x06,0x17,0x00,0x82,0x06,0x16,0x00,0x06, 0x05,0x16,0x01,0x06,0x16,0x01,0x05,0x15,0x00,0x06,0x15,0x00,0x06,0x15,0x01, 0x05,0x14,0x01,0x82,0x05,0x14,0x00,0x82,0x05,0x13,0x00,0x07,0x05,0x13,0x01, 0x05,0x12,0x00,0x04,0x12,0x00,0x05,0x11,0x00,0x04,0x12,0x01,0x04,0x11,0x00, 0x04,0x11,0x01,0x84,0x04,0x10,0x00,0x02,0x04,0x0f,0x00,0x03,0x0f,0x00,0x83, 0x03,0x0e,0x00,0x84,0x03,0x0d,0x00,0x83,0x03,0x0c,0x00,0x04,0x03,0x0b,0x00, 0x02,0x0b,0x00,0x03,0x0b,0x00,0x02,0x0b,0x00,0x83,0x02,0x0a,0x00,0x83,0x02, 0x09,0x00,0x83,0x02,0x08,0x00,0x01,0x02,0x07,0x00,0x83,0x01,0x07,0x00,0x83, 0x01,0x06,0x00,0x84,0x01,0x05,0x00,0x83,0x01,0x04,0x00,0x84,0x00,0x03,0x00, 0x83,0x00,0x02,0x00,0x84,0x00,0x01,0x00,0xdb,0x00,0x00,0x00,0x05,0x3a,0x93, 0x1f,0x3b,0x94,0x20,0x3b,0x94,0x1e,0x3a,0x93,0x1d,0x39,0x92,0x1c,0x82,0x3a, 0x93,0x1f,0x0f,0x3b,0x92,0x1f,0x3b,0x94,0x1e,0x39,0x92,0x1c,0x3a,0x93,0x1d, 0x3c,0x95,0x1f,0x39,0x92,0x1c,0x3a,0x93,0x1f,0x3b,0x94,0x20,0x39,0x92,0x1e, 0x39,0x92,0x1c,0x3a,0x93,0x1d,0x39,0x92,0x1c,0x3a,0x93,0x1f,0x3a,0x93,0x1d, 0x3b,0x94,0x1e,0x82,0x3a,0x93,0x1d,0x83,0x39,0x92,0x1c,0x03,0x3a,0x93,0x1d, 0x39,0x92,0x1e,0x38,0x91,0x1d,0x82,0x37,0x90,0x1c,0x82,0x38,0x91,0x1d,0x82, 0x37,0x90,0x1c,0x82,0x37,0x92,0x1b,0x05,0x38,0x91,0x1d,0x37,0x90,0x1c,0x36, 0x91,0x1c,0x38,0x91,0x1d,0x37,0x90,0x1c,0x82,0x36,0x91,0x1c,0x09,0x38,0x91, 0x1b,0x38,0x91,0x1d,0x36,0x91,0x1c,0x35,0x90,0x19,0x36,0x91,0x1a,0x36,0x8f, 0x1b,0x35,0x8e,0x1a,0x36,0x8f,0x1b,0x37,0x90,0x1c,0x82,0x36,0x8f,0x19,0x02, 0x35,0x90,0x1b,0x34,0x8d,0x19,0x83,0x36,0x8f,0x1b,0x05,0x37,0x90,0x1c,0x35, 0x8e,0x1a,0x36,0x8f,0x1b,0x36,0x91,0x1a,0x35,0x90,0x19,0x82,0x34,0x8f,0x1a, 0x01,0x32,0x8d,0x18,0x83,0x33,0x8e,0x19,0x06,0x35,0x8e,0x1a,0x34,0x8d,0x19, 0x33,0x8e,0x19,0x32,0x8d,0x18,0x35,0x8e,0x1a,0x33,0x8c,0x18,0x82,0x32,0x8d, 0x18,0x82,0x33,0x8e,0x19,0x02,0x32,0x8d,0x18,0x32,0x8b,0x15,0x82,0x33,0x8c, 0x16,0x06,0x33,0x8c,0x18,0x31,0x8c,0x17,0x32,0x8d,0x18,0x32,0x8d,0x16,0x33, 0x8e,0x17,0x34,0x8f,0x18,0x82,0x33,0x8e,0x17,0x0a,0x35,0x90,0x19,0x32,0x8d, 0x16,0x2f,0x8a,0x15,0x32,0x8b,0x15,0x33,0x8c,0x16,0x31,0x8a,0x16,0x2e,0x89, 0x14,0x30,0x8b,0x16,0x33,0x8e,0x19,0x32,0x8d,0x16,0x82,0x32,0x8d,0x18,0x03, 0x33,0x8e,0x19,0x30,0x8b,0x14,0x2f,0x8a,0x13,0x82,0x32,0x8d,0x16,0x82,0x31, 0x8c,0x15,0x82,0x33,0x8e,0x17,0x16,0x31,0x8c,0x15,0x30,0x8b,0x14,0x2e,0x8c, 0x14,0x32,0x8d,0x16,0x31,0x8c,0x15,0x2f,0x8c,0x17,0x31,0x8c,0x15,0x31,0x8c, 0x13,0x30,0x8e,0x14,0x2d,0x8b,0x13,0x2f,0x8a,0x15,0x31,0x8c,0x15,0x2e,0x8c, 0x12,0x2f,0x8a,0x13,0x30,0x8b,0x14,0x33,0x8e,0x17,0x30,0x8e,0x16,0x2e,0x8c, 0x14,0x2f,0x8d,0x15,0x31,0x8f,0x17,0x30,0x8e,0x16,0x2e,0x89,0x14,0x82,0x2f, 0x8d,0x13,0x05,0x2e,0x8c,0x10,0x2f,0x8d,0x11,0x2e,0x8c,0x12,0x32,0x8d,0x14, 0x2f,0x8d,0x15,0x82,0x2e,0x8c,0x12,0x01,0x31,0x8f,0x15,0x82,0x2e,0x8c,0x12, 0x0c,0x30,0x8e,0x14,0x2c,0x8a,0x10,0x2f,0x8d,0x13,0x2d,0x8b,0x11,0x30,0x8e, 0x14,0x2e,0x8c,0x12,0x2f,0x8d,0x13,0x2c,0x8a,0x10,0x2e,0x8e,0x13,0x2f,0x8f, 0x12,0x30,0x8e,0x12,0x2f,0x8f,0x14,0x82,0x30,0x90,0x15,0x07,0x2d,0x8d,0x12, 0x2f,0x8f,0x14,0x2e,0x8e,0x11,0x2d,0x8d,0x10,0x2d,0x8d,0x0f,0x2e,0x8e,0x11, 0x2f,0x8f,0x11,0x82,0x2f,0x8f,0x12,0x08,0x30,0x90,0x12,0x31,0x91,0x13,0x2e, 0x8e,0x11,0x30,0x90,0x12,0x30,0x91,0x10,0x31,0x91,0x13,0x30,0x90,0x13,0x2e, 0x8e,0x11,0x82,0x2f,0x8f,0x11,0x05,0x2e,0x8e,0x10,0x2f,0x8f,0x11,0x31,0x91, 0x13,0x32,0x92,0x14,0x30,0x90,0x12,0x82,0x31,0x92,0x11,0x13,0x31,0x91,0x13, 0x32,0x92,0x14,0x30,0x91,0x10,0x2e,0x91,0x10,0x30,0x93,0x12,0x2f,0x93,0x0f, 0x2e,0x92,0x0e,0x2f,0x92,0x11,0x31,0x94,0x13,0x2f,0x93,0x0f,0x2e,0x92,0x0e, 0x30,0x94,0x10,0x2f,0x93,0x0f,0x31,0x95,0x11,0x30,0x94,0x10,0x31,0x95,0x11, 0x32,0x98,0x11,0x30,0x96,0x0f,0x30,0x95,0x11,0x82,0x34,0x9a,0x12,0x02,0x32, 0x98,0x11,0x33,0x99,0x12,0x82,0x32,0x98,0x10,0x08,0x35,0x9b,0x13,0x34,0x9a, 0x10,0x34,0x9c,0x11,0x33,0x9e,0x12,0x34,0x9d,0x0f,0x35,0x9c,0x0f,0x35,0x9e, 0x10,0x36,0x9f,0x11,0x82,0x38,0x9f,0x10,0x02,0x38,0xa1,0x11,0x37,0xa0,0x10, 0x82,0x38,0xa1,0x10,0x82,0x3a,0xa3,0x12,0x0b,0x3b,0xa4,0x13,0x3c,0xa5,0x14, 0x3b,0xa7,0x15,0x3b,0xa9,0x14,0x3a,0xa8,0x13,0x3a,0xa8,0x11,0x3c,0xaa,0x13, 0x3a,0xa8,0x13,0x3d,0xaa,0x13,0x3c,0xa9,0x12,0x3c,0xa8,0x14,0x82,0x3c,0xa9, 0x12,0x83,0x3e,0xab,0x14,0x09,0x3d,0xa9,0x15,0x3e,0xaa,0x16,0x3d,0xa9,0x15, 0x3d,0xaa,0x13,0x3f,0xab,0x17,0x3e,0xaa,0x16,0x3e,0xab,0x14,0x40,0xad,0x16, 0x40,0xac,0x18,0x82,0x40,0xad,0x16,0x06,0x42,0xaf,0x18,0x41,0xae,0x17,0x41, 0xae,0x15,0x40,0xad,0x14,0x41,0xae,0x15,0x41,0xae,0x17,0x82,0x40,0xad,0x16, 0x08,0x41,0xae,0x17,0x43,0xb0,0x17,0x44,0xae,0x16,0x44,0xae,0x18,0x43,0xad, 0x17,0x42,0xac,0x16,0x40,0xad,0x16,0x43,0xb0,0x19,0x82,0x41,0xae,0x17,0x0c, 0x44,0xae,0x18,0x42,0xac,0x16,0x44,0xae,0x1a,0x45,0xad,0x1a,0x43,0xad,0x19, 0x44,0xae,0x18,0x45,0xad,0x18,0x43,0xad,0x17,0x44,0xb1,0x1a,0x44,0xae,0x18, 0x45,0xaf,0x19,0x44,0xae,0x1a,0x82,0x45,0xad,0x1a,0x17,0x46,0xae,0x1b,0x45, 0xad,0x1a,0x47,0xaf,0x1a,0x45,0xad,0x18,0x46,0xae,0x19,0x47,0xaf,0x1a,0x46, 0xae,0x1b,0x47,0xaf,0x1a,0x46,0xb0,0x1a,0x45,0xaf,0x19,0x46,0xb0,0x1a,0x47, 0xb1,0x1b,0x45,0xaf,0x19,0x46,0xb0,0x1a,0x45,0xae,0x17,0x44,0xad,0x18,0x46, 0xac,0x19,0x45,0xac,0x19,0x47,0xad,0x1b,0x43,0xab,0x18,0x44,0xac,0x19,0x45, 0xac,0x1a,0x43,0xa8,0x17,0x82,0x44,0xa9,0x19,0x82,0x43,0xa8,0x16,0x05,0x43, 0xa7,0x18,0x43,0xa6,0x17,0x43,0xa5,0x17,0x41,0xa2,0x15,0x43,0xa4,0x17,0x82, 0x42,0xa2,0x16,0x0e,0x43,0xa3,0x18,0x3f,0x9f,0x14,0x40,0xa0,0x15,0x41,0xa0, 0x16,0x3f,0xa0,0x15,0x40,0x9c,0x15,0x3e,0x9c,0x15,0x3d,0x9d,0x15,0x3b,0x9a, 0x13,0x3e,0x99,0x14,0x3d,0x98,0x13,0x3c,0x96,0x14,0x38,0x95,0x12,0x39,0x93, 0x12,0x82,0x39,0x91,0x13,0x83,0x36,0x8c,0x12,0x10,0x33,0x89,0x10,0x34,0x8a, 0x10,0x35,0x88,0x11,0x34,0x86,0x10,0x32,0x84,0x0f,0x33,0x85,0x0f,0x33,0x84, 0x10,0x2f,0x7f,0x0c,0x31,0x80,0x0e,0x30,0x80,0x0f,0x30,0x7f,0x0f,0x2e,0x7d, 0x0f,0x27,0x75,0x0a,0x23,0x70,0x06,0x22,0x6e,0x07,0x20,0x6c,0x06,0x82,0x22, 0x6d,0x05,0x82,0x21,0x6b,0x05,0x0e,0x20,0x6a,0x05,0x20,0x69,0x06,0x1f,0x68, 0x05,0x1e,0x67,0x05,0x1e,0x66,0x05,0x1d,0x65,0x05,0x1d,0x66,0x06,0x1c,0x64, 0x05,0x1c,0x63,0x04,0x1b,0x62,0x04,0x1a,0x61,0x03,0x1a,0x62,0x04,0x1b,0x62, 0x04,0x1a,0x60,0x03,0x82,0x19,0x60,0x03,0x82,0x19,0x5f,0x03,0x11,0x18,0x5d, 0x01,0x17,0x5d,0x03,0x18,0x5d,0x03,0x19,0x5e,0x04,0x17,0x5c,0x01,0x16,0x5b, 0x00,0x19,0x5b,0x03,0x18,0x5c,0x03,0x18,0x5c,0x02,0x18,0x5b,0x02,0x17,0x5a, 0x01,0x18,0x59,0x01,0x19,0x5a,0x03,0x18,0x59,0x03,0x16,0x59,0x03,0x16,0x59, 0x01,0x16,0x58,0x01,0x82,0x18,0x57,0x01,0x23,0x18,0x58,0x02,0x16,0x57,0x01, 0x15,0x56,0x00,0x16,0x57,0x01,0x16,0x56,0x01,0x16,0x58,0x02,0x15,0x57,0x01, 0x16,0x56,0x02,0x15,0x55,0x01,0x16,0x56,0x00,0x15,0x55,0x02,0x16,0x55,0x02, 0x15,0x55,0x00,0x15,0x54,0x01,0x16,0x54,0x02,0x15,0x55,0x02,0x16,0x52,0x01, 0x15,0x53,0x01,0x16,0x54,0x01,0x15,0x53,0x00,0x15,0x54,0x01,0x15,0x53,0x00, 0x15,0x53,0x02,0x16,0x52,0x02,0x15,0x51,0x02,0x14,0x50,0x00,0x16,0x53,0x02, 0x15,0x53,0x02,0x15,0x51,0x02,0x13,0x50,0x01,0x13,0x51,0x02,0x14,0x51,0x02, 0x15,0x50,0x02,0x14,0x4e,0x01,0x14,0x50,0x02,0x82,0x14,0x4f,0x01,0x09,0x15, 0x4f,0x01,0x14,0x4e,0x01,0x13,0x4d,0x01,0x14,0x4e,0x02,0x14,0x4e,0x01,0x13, 0x4b,0x00,0x13,0x4c,0x00,0x13,0x4d,0x01,0x14,0x4d,0x01,0x82,0x14,0x4b,0x01, 0x82,0x14,0x4c,0x01,0x82,0x13,0x4b,0x01,0x08,0x13,0x4a,0x01,0x13,0x4b,0x01, 0x14,0x4b,0x02,0x13,0x4a,0x01,0x12,0x49,0x01,0x13,0x49,0x01,0x14,0x4a,0x02, 0x13,0x48,0x00,0x82,0x12,0x48,0x01,0x06,0x12,0x48,0x00,0x13,0x47,0x00,0x12, 0x47,0x01,0x12,0x48,0x02,0x12,0x47,0x01,0x13,0x47,0x02,0x82,0x12,0x46,0x01, 0x07,0x11,0x45,0x01,0x11,0x46,0x01,0x11,0x45,0x00,0x11,0x44,0x02,0x11,0x44, 0x01,0x12,0x44,0x02,0x12,0x44,0x01,0x82,0x11,0x43,0x01,0x03,0x10,0x43,0x01, 0x12,0x44,0x01,0x11,0x43,0x01,0x82,0x12,0x43,0x02,0x15,0x12,0x42,0x02,0x11, 0x42,0x02,0x10,0x41,0x01,0x11,0x41,0x02,0x10,0x40,0x01,0x10,0x41,0x01,0x0f, 0x41,0x01,0x10,0x40,0x01,0x0f,0x3f,0x00,0x10,0x3f,0x00,0x11,0x3f,0x02,0x10, 0x3f,0x02,0x0f,0x3e,0x01,0x10,0x3d,0x01,0x10,0x3e,0x01,0x10,0x3e,0x02,0x0f, 0x3d,0x01,0x10,0x3d,0x01,0x10,0x3c,0x01,0x0f,0x3c,0x02,0x0f,0x3c,0x01,0x82, 0x0f,0x3b,0x01,0x01,0x0f,0x3b,0x00,0x82,0x0f,0x3b,0x01,0x16,0x0e,0x39,0x00, 0x0f,0x39,0x01,0x0f,0x38,0x01,0x10,0x39,0x02,0x0f,0x38,0x01,0x0e,0x38,0x01, 0x0e,0x37,0x01,0x0f,0x38,0x01,0x0e,0x37,0x01,0x0f,0x37,0x01,0x0e,0x37,0x01, 0x0d,0x36,0x01,0x0e,0x36,0x01,0x0e,0x35,0x01,0x0f,0x35,0x01,0x0e,0x36,0x02, 0x0e,0x35,0x01,0x0d,0x35,0x01,0x0e,0x34,0x01,0x0f,0x33,0x01,0x0e,0x34,0x01, 0x0e,0x34,0x02,0x82,0x0d,0x33,0x01,0x82,0x0d,0x32,0x01,0x04,0x0e,0x31,0x01, 0x0d,0x31,0x00,0x0d,0x31,0x01,0x0d,0x31,0x02,0x82,0x0d,0x31,0x01,0x82,0x0d, 0x30,0x02,0x01,0x0c,0x2f,0x02,0x82,0x0c,0x2f,0x01,0x07,0x0c,0x2e,0x01,0x0c, 0x2e,0x02,0x0c,0x2d,0x02,0x0c,0x2e,0x01,0x0c,0x2d,0x01,0x0b,0x2d,0x01,0x0c, 0x2d,0x01,0x82,0x0c,0x2c,0x02,0x01,0x0b,0x2b,0x01,0x82,0x0b,0x2b,0x02,0x04, 0x0b,0x2b,0x01,0x0a,0x2b,0x01,0x0b,0x2b,0x01,0x0b,0x2a,0x01,0x84,0x0b,0x29, 0x01,0x08,0x0a,0x28,0x01,0x0a,0x27,0x01,0x0a,0x28,0x01,0x0a,0x27,0x00,0x0a, 0x27,0x01,0x0a,0x27,0x02,0x0a,0x26,0x01,0x0a,0x26,0x00,0x82,0x0a,0x26,0x01, 0x03,0x0a,0x26,0x02,0x09,0x24,0x01,0x0a,0x25,0x01,0x82,0x09,0x24,0x01,0x02, 0x0a,0x24,0x01,0x0a,0x24,0x02,0x82,0x09,0x23,0x01,0x01,0x0a,0x22,0x01,0x82, 0x09,0x22,0x01,0x01,0x09,0x21,0x01,0x82,0x09,0x22,0x01,0x01,0x08,0x21,0x01, 0x83,0x08,0x20,0x01,0x84,0x08,0x1f,0x01,0x01,0x08,0x1e,0x00,0x82,0x08,0x1d, 0x01,0x05,0x07,0x1d,0x01,0x08,0x1d,0x01,0x07,0x1d,0x01,0x08,0x1c,0x01,0x07, 0x1c,0x01,0x84,0x07,0x1b,0x01,0x01,0x06,0x1a,0x00,0x83,0x07,0x1a,0x01,0x02, 0x07,0x19,0x00,0x06,0x19,0x01,0x83,0x06,0x18,0x01,0x01,0x06,0x18,0x00,0x82, 0x06,0x17,0x00,0x04,0x05,0x17,0x00,0x06,0x16,0x00,0x06,0x17,0x01,0x06,0x16, 0x01,0x83,0x05,0x15,0x00,0x01,0x05,0x15,0x01,0x83,0x05,0x14,0x00,0x83,0x05, 0x13,0x00,0x03,0x05,0x12,0x00,0x04,0x12,0x01,0x05,0x12,0x01,0x82,0x04,0x11, 0x00,0x01,0x04,0x11,0x01,0x84,0x04,0x10,0x00,0x01,0x04,0x0f,0x00,0x82,0x03, 0x0f,0x00,0x83,0x03,0x0e,0x00,0x83,0x03,0x0d,0x00,0x84,0x03,0x0c,0x00,0x82, 0x03,0x0b,0x00,0x01,0x02,0x0b,0x00,0x83,0x02,0x0a,0x00,0x83,0x02,0x09,0x00, 0x84,0x02,0x08,0x00,0x83,0x01,0x07,0x00,0x84,0x01,0x06,0x00,0x83,0x01,0x05, 0x00,0x83,0x01,0x04,0x00,0x84,0x00,0x03,0x00,0x84,0x00,0x02,0x00,0x83,0x00, 0x01,0x00,0xdb,0x00,0x00,0x00,0x01,0x3d,0x96,0x22,0x84,0x3a,0x93,0x1d,0x04, 0x3b,0x94,0x1e,0x3c,0x95,0x1f,0x3a,0x93,0x1d,0x3a,0x95,0x1e,0x82,0x3b,0x94, 0x1e,0x02,0x3c,0x95,0x1f,0x3b,0x94,0x1e,0x82,0x3c,0x95,0x1f,0x02,0x3b,0x94, 0x1e,0x39,0x92,0x1c,0x82,0x3a,0x93,0x1d,0x05,0x3a,0x93,0x1f,0x3a,0x93,0x1d, 0x3b,0x94,0x1e,0x3a,0x93,0x1d,0x3b,0x94,0x1e,0x86,0x3a,0x93,0x1d,0x0f,0x39, 0x92,0x1c,0x3b,0x92,0x1d,0x3b,0x94,0x1e,0x38,0x91,0x1b,0x39,0x92,0x1c,0x38, 0x91,0x1b,0x38,0x93,0x1c,0x39,0x94,0x1d,0x37,0x90,0x1a,0x39,0x92,0x1e,0x39, 0x94,0x1d,0x38,0x91,0x1b,0x36,0x8f,0x1b,0x36,0x91,0x1a,0x37,0x92,0x1b,0x82, 0x38,0x91,0x1b,0x01,0x38,0x93,0x1c,0x82,0x38,0x91,0x1b,0x01,0x37,0x90,0x1c, 0x83,0x36,0x8f,0x1b,0x01,0x36,0x8f,0x19,0x83,0x37,0x90,0x1a,0x02,0x36,0x8f, 0x1b,0x37,0x90,0x1c,0x82,0x36,0x8f,0x1b,0x01,0x35,0x8e,0x18,0x82,0x36,0x8f, 0x19,0x01,0x35,0x90,0x19,0x83,0x34,0x8f,0x1a,0x82,0x35,0x90,0x1b,0x07,0x36, 0x8f,0x1b,0x35,0x8e,0x1a,0x36,0x8f,0x1b,0x35,0x90,0x19,0x33,0x8e,0x17,0x35, 0x90,0x19,0x35,0x8e,0x18,0x82,0x33,0x8e,0x19,0x09,0x34,0x8f,0x18,0x35,0x90, 0x19,0x34,0x8f,0x18,0x35,0x90,0x19,0x35,0x8e,0x18,0x34,0x8d,0x17,0x34,0x8f, 0x18,0x33,0x8e,0x19,0x34,0x8f,0x1a,0x83,0x33,0x8e,0x17,0x82,0x34,0x8f,0x18, 0x02,0x33,0x8e,0x17,0x32,0x8d,0x16,0x82,0x33,0x8e,0x17,0x09,0x34,0x8f,0x18, 0x33,0x8e,0x17,0x32,0x8d,0x18,0x33,0x8e,0x17,0x34,0x8f,0x18,0x32,0x8d,0x16, 0x33,0x8e,0x19,0x31,0x8c,0x17,0x33,0x8e,0x19,0x82,0x32,0x8d,0x16,0x04,0x31, 0x8c,0x15,0x30,0x8b,0x14,0x32,0x8d,0x16,0x33,0x8e,0x17,0x82,0x32,0x8d,0x16, 0x01,0x30,0x8b,0x14,0x82,0x33,0x8e,0x17,0x82,0x31,0x8c,0x15,0x17,0x2e,0x8b, 0x16,0x30,0x8b,0x14,0x30,0x8b,0x12,0x30,0x8e,0x14,0x30,0x8e,0x16,0x2f,0x8a, 0x15,0x31,0x8c,0x15,0x30,0x8e,0x14,0x2f,0x8d,0x13,0x30,0x8e,0x16,0x2e,0x8c, 0x14,0x30,0x8e,0x16,0x2e,0x8c,0x14,0x2e,0x89,0x12,0x32,0x8d,0x16,0x31,0x8c, 0x15,0x2e,0x89,0x10,0x2f,0x8d,0x13,0x31,0x8f,0x17,0x2f,0x8d,0x13,0x2f,0x8e, 0x16,0x2f,0x8d,0x15,0x32,0x8e,0x12,0x83,0x2f,0x8d,0x13,0x09,0x2d,0x8b,0x11, 0x2f,0x8d,0x13,0x30,0x8e,0x14,0x31,0x8f,0x15,0x2f,0x8d,0x11,0x2e,0x8c,0x10, 0x2f,0x8d,0x13,0x2f,0x8f,0x14,0x2f,0x8f,0x12,0x82,0x2f,0x8d,0x11,0x03,0x2f, 0x8f,0x12,0x31,0x91,0x14,0x30,0x8e,0x12,0x82,0x2f,0x8f,0x12,0x82,0x2e,0x8e, 0x13,0x82,0x30,0x90,0x13,0x0c,0x2e,0x8e,0x11,0x2d,0x8d,0x0f,0x2e,0x8e,0x11, 0x2f,0x8f,0x11,0x30,0x90,0x13,0x2e,0x8e,0x11,0x2f,0x8f,0x11,0x30,0x90,0x12, 0x2d,0x8d,0x10,0x2e,0x8e,0x10,0x2f,0x8f,0x11,0x30,0x90,0x13,0x82,0x2e,0x8e, 0x11,0x82,0x2f,0x8f,0x11,0x82,0x2e,0x8e,0x10,0x03,0x2f,0x8f,0x11,0x30,0x90, 0x12,0x2f,0x8f,0x11,0x82,0x2f,0x90,0x0f,0x03,0x30,0x90,0x12,0x31,0x91,0x13, 0x30,0x91,0x10,0x83,0x2f,0x92,0x11,0x10,0x31,0x92,0x0f,0x30,0x93,0x12,0x31, 0x94,0x13,0x2f,0x93,0x0f,0x2d,0x92,0x0e,0x31,0x95,0x11,0x30,0x93,0x12,0x32, 0x96,0x12,0x31,0x95,0x0f,0x30,0x94,0x0e,0x31,0x95,0x11,0x2f,0x92,0x11,0x30, 0x93,0x12,0x32,0x96,0x10,0x33,0x97,0x11,0x30,0x96,0x0f,0x82,0x32,0x98,0x11, 0x05,0x32,0x98,0x10,0x33,0x99,0x0f,0x34,0x9a,0x10,0x33,0x9b,0x12,0x35,0x9b, 0x13,0x82,0x33,0x9b,0x10,0x02,0x34,0x9d,0x0f,0x35,0x9c,0x0f,0x82,0x35,0x9e, 0x10,0x01,0x37,0xa0,0x10,0x82,0x38,0xa1,0x11,0x0d,0x37,0xa0,0x0f,0x37,0xa3, 0x11,0x36,0xa2,0x10,0x37,0xa3,0x11,0x39,0xa2,0x11,0x38,0xa4,0x10,0x38,0xa4, 0x12,0x3a,0xa6,0x12,0x39,0xa7,0x12,0x3a,0xa8,0x13,0x39,0xa6,0x0f,0x39,0xa5, 0x11,0x3c,0xa8,0x14,0x82,0x3b,0xa7,0x13,0x05,0x3c,0xa8,0x14,0x3c,0xa9,0x12, 0x3d,0xaa,0x13,0x3c,0xa9,0x12,0x3c,0xa8,0x14,0x83,0x3d,0xa9,0x15,0x04,0x3e, 0xaa,0x16,0x3d,0xa9,0x15,0x3c,0xa9,0x12,0x3d,0xaa,0x13,0x83,0x3f,0xac,0x15, 0x82,0x40,0xad,0x16,0x05,0x41,0xae,0x15,0x40,0xad,0x14,0x41,0xae,0x15,0x41, 0xae,0x17,0x3f,0xac,0x15,0x82,0x40,0xad,0x16,0x06,0x41,0xae,0x17,0x3f,0xac, 0x15,0x42,0xac,0x16,0x43,0xad,0x17,0x42,0xaf,0x18,0x41,0xae,0x17,0x83,0x40, 0xad,0x16,0x0c,0x41,0xae,0x17,0x43,0xad,0x17,0x43,0xad,0x19,0x41,0xab,0x17, 0x44,0xae,0x1a,0x43,0xad,0x17,0x45,0xad,0x18,0x43,0xad,0x17,0x44,0xb1,0x1a, 0x43,0xad,0x17,0x45,0xaf,0x19,0x44,0xae,0x18,0x82,0x46,0xae,0x19,0x02,0x46, 0xae,0x1b,0x44,0xac,0x17,0x82,0x45,0xad,0x18,0x82,0x46,0xae,0x19,0x36,0x45, 0xad,0x18,0x45,0xaf,0x19,0x47,0xb1,0x1b,0x46,0xb0,0x1a,0x45,0xaf,0x19,0x46, 0xb0,0x1a,0x44,0xae,0x18,0x46,0xb0,0x1a,0x46,0xaf,0x18,0x46,0xad,0x19,0x45, 0xad,0x19,0x45,0xae,0x18,0x43,0xab,0x16,0x43,0xaa,0x15,0x44,0xaa,0x18,0x45, 0xaa,0x19,0x45,0xac,0x1a,0x45,0xab,0x18,0x43,0xa9,0x16,0x43,0xa8,0x16,0x44, 0xa9,0x17,0x43,0xa8,0x16,0x42,0xa5,0x16,0x43,0xa7,0x18,0x42,0xa3,0x16,0x44, 0xa6,0x16,0x44,0xa4,0x18,0x42,0xa2,0x16,0x42,0xa3,0x17,0x40,0xa0,0x15,0x42, 0xa2,0x17,0x42,0xa1,0x17,0x41,0xa2,0x17,0x3f,0x9f,0x17,0x3f,0x9d,0x16,0x40, 0x9c,0x16,0x3d,0x9b,0x15,0x3b,0x99,0x13,0x3c,0x9b,0x15,0x3c,0x99,0x15,0x3d, 0x97,0x14,0x37,0x94,0x11,0x3a,0x93,0x13,0x39,0x92,0x12,0x37,0x8f,0x12,0x36, 0x8f,0x12,0x35,0x8c,0x10,0x35,0x8b,0x11,0x35,0x8d,0x12,0x34,0x89,0x10,0x33, 0x88,0x0f,0x33,0x88,0x11,0x31,0x86,0x0f,0x33,0x84,0x0f,0x82,0x31,0x82,0x0e, 0x0e,0x30,0x80,0x0f,0x30,0x7f,0x0d,0x30,0x7f,0x0f,0x2f,0x7e,0x10,0x2d,0x7b, 0x10,0x27,0x74,0x0b,0x21,0x6e,0x05,0x22,0x6f,0x05,0x22,0x6d,0x05,0x22,0x6c, 0x06,0x21,0x6b,0x05,0x20,0x6b,0x05,0x20,0x6a,0x07,0x1f,0x68,0x05,0x82,0x1f, 0x68,0x06,0x82,0x1d,0x65,0x04,0x0a,0x1c,0x64,0x03,0x1c,0x64,0x04,0x1c,0x64, 0x05,0x1b,0x62,0x04,0x1a,0x62,0x04,0x1b,0x62,0x04,0x1a,0x60,0x01,0x19,0x60, 0x03,0x19,0x5f,0x02,0x18,0x5e,0x02,0x82,0x19,0x5f,0x03,0x06,0x18,0x5e,0x02, 0x18,0x5d,0x03,0x16,0x5b,0x02,0x18,0x5d,0x02,0x17,0x5c,0x03,0x19,0x5b,0x03, 0x82,0x17,0x5b,0x03,0x82,0x17,0x5a,0x01,0x01,0x17,0x5b,0x03,0x82,0x17,0x58, 0x02,0x07,0x18,0x58,0x03,0x16,0x59,0x01,0x17,0x59,0x02,0x16,0x58,0x01,0x15, 0x57,0x00,0x18,0x57,0x01,0x17,0x58,0x02,0x82,0x16,0x57,0x01,0x03,0x16,0x56, 0x01,0x16,0x58,0x02,0x16,0x57,0x02,0x83,0x16,0x56,0x02,0x0b,0x15,0x55,0x01, 0x15,0x56,0x02,0x16,0x55,0x02,0x15,0x55,0x00,0x16,0x56,0x02,0x17,0x53,0x03, 0x15,0x53,0x01,0x14,0x53,0x01,0x15,0x54,0x00,0x15,0x53,0x00,0x15,0x54,0x01, 0x83,0x15,0x53,0x02,0x09,0x15,0x53,0x01,0x15,0x51,0x00,0x15,0x52,0x01,0x14, 0x52,0x01,0x15,0x52,0x03,0x13,0x50,0x01,0x12,0x50,0x01,0x14,0x51,0x02,0x15, 0x50,0x01,0x82,0x14,0x4f,0x02,0x0b,0x15,0x50,0x01,0x14,0x4f,0x01,0x13,0x4d, 0x00,0x13,0x4e,0x00,0x13,0x4d,0x01,0x12,0x4c,0x01,0x14,0x4e,0x01,0x14,0x4d, 0x01,0x13,0x4c,0x00,0x12,0x4b,0x00,0x13,0x4c,0x01,0x82,0x14,0x4b,0x01,0x82, 0x14,0x4c,0x01,0x03,0x14,0x4b,0x01,0x12,0x4a,0x00,0x13,0x4a,0x01,0x82,0x14, 0x4b,0x02,0x09,0x14,0x49,0x01,0x13,0x48,0x01,0x12,0x48,0x01,0x13,0x49,0x01, 0x13,0x48,0x00,0x12,0x49,0x01,0x13,0x48,0x01,0x12,0x48,0x01,0x13,0x47,0x00, 0x82,0x12,0x47,0x01,0x82,0x12,0x47,0x00,0x07,0x12,0x47,0x01,0x11,0x46,0x01, 0x11,0x45,0x01,0x12,0x46,0x02,0x12,0x45,0x00,0x11,0x45,0x02,0x11,0x44,0x01, 0x82,0x12,0x45,0x02,0x0a,0x12,0x44,0x02,0x11,0x43,0x01,0x11,0x42,0x01,0x11, 0x42,0x00,0x11,0x43,0x01,0x12,0x42,0x01,0x11,0x43,0x01,0x11,0x42,0x02,0x10, 0x40,0x01,0x10,0x41,0x01,0x82,0x10,0x40,0x01,0x13,0x10,0x42,0x01,0x11,0x40, 0x01,0x11,0x41,0x01,0x10,0x40,0x01,0x11,0x40,0x01,0x10,0x3f,0x01,0x10,0x3e, 0x02,0x10,0x3f,0x02,0x10,0x3d,0x00,0x0f,0x3d,0x01,0x0f,0x3e,0x02,0x0f,0x3e, 0x01,0x0f,0x3d,0x01,0x0f,0x3c,0x01,0x0f,0x3c,0x00,0x0f,0x3c,0x01,0x0f,0x3b, 0x01,0x0f,0x3a,0x01,0x0f,0x3b,0x01,0x82,0x0f,0x3a,0x01,0x01,0x0e,0x3a,0x01, 0x82,0x0f,0x39,0x01,0x03,0x0f,0x38,0x01,0x0e,0x38,0x00,0x0e,0x38,0x01,0x82, 0x0f,0x38,0x01,0x01,0x0e,0x37,0x01,0x82,0x0f,0x37,0x02,0x03,0x0d,0x36,0x00, 0x0e,0x37,0x01,0x10,0x35,0x01,0x82,0x0e,0x35,0x01,0x01,0x0e,0x34,0x01,0x82, 0x0d,0x34,0x01,0x05,0x0d,0x33,0x00,0x0e,0x33,0x01,0x0e,0x34,0x02,0x0d,0x34, 0x02,0x0d,0x33,0x01,0x82,0x0d,0x32,0x01,0x02,0x0e,0x31,0x01,0x0d,0x32,0x01, 0x82,0x0d,0x31,0x01,0x82,0x0c,0x30,0x01,0x06,0x0c,0x2f,0x00,0x0d,0x30,0x01, 0x0c,0x2f,0x01,0x0c,0x2f,0x00,0x0c,0x2e,0x01,0x0c,0x2d,0x00,0x84,0x0c,0x2d, 0x01,0x04,0x0c,0x2d,0x02,0x0c,0x2d,0x01,0x0c,0x2c,0x01,0x0c,0x2b,0x01,0x84, 0x0b,0x2b,0x01,0x82,0x0b,0x2b,0x02,0x01,0x0b,0x2a,0x01,0x83,0x0b,0x29,0x01, 0x03,0x0b,0x29,0x02,0x0b,0x28,0x02,0x0b,0x28,0x01,0x82,0x0a,0x27,0x00,0x04, 0x0b,0x27,0x02,0x0a,0x27,0x02,0x0a,0x26,0x01,0x0a,0x26,0x00,0x82,0x0a,0x26, 0x01,0x02,0x0a,0x25,0x01,0x09,0x25,0x00,0x82,0x0a,0x25,0x01,0x01,0x09,0x24, 0x00,0x82,0x09,0x24,0x01,0x03,0x09,0x23,0x01,0x09,0x23,0x02,0x0a,0x23,0x02, 0x82,0x09,0x22,0x01,0x83,0x09,0x21,0x01,0x01,0x08,0x21,0x01,0x83,0x08,0x20, 0x01,0x02,0x09,0x20,0x01,0x08,0x1f,0x01,0x82,0x09,0x1f,0x01,0x01,0x08,0x1e, 0x01,0x84,0x08,0x1d,0x01,0x03,0x07,0x1d,0x01,0x08,0x1c,0x01,0x07,0x1c,0x01, 0x85,0x07,0x1b,0x01,0x83,0x07,0x1a,0x01,0x02,0x07,0x19,0x00,0x06,0x19,0x01, 0x84,0x06,0x18,0x01,0x84,0x06,0x17,0x01,0x03,0x06,0x16,0x01,0x05,0x16,0x00, 0x06,0x15,0x00,0x82,0x06,0x15,0x01,0x01,0x05,0x14,0x00,0x83,0x05,0x14,0x01, 0x83,0x05,0x13,0x00,0x03,0x05,0x12,0x00,0x04,0x13,0x00,0x04,0x12,0x00,0x82, 0x04,0x11,0x00,0x01,0x04,0x11,0x01,0x84,0x04,0x10,0x00,0x82,0x04,0x0f,0x00, 0x02,0x03,0x0f,0x00,0x04,0x0e,0x00,0x82,0x03,0x0e,0x00,0x83,0x03,0x0d,0x00, 0x83,0x03,0x0c,0x00,0x83,0x03,0x0b,0x00,0x01,0x02,0x0b,0x00,0x83,0x02,0x0a, 0x00,0x83,0x02,0x09,0x00,0x84,0x02,0x08,0x00,0x01,0x02,0x07,0x00,0x82,0x01, 0x07,0x00,0x83,0x01,0x06,0x00,0x84,0x01,0x05,0x00,0x83,0x01,0x04,0x00,0x84, 0x00,0x03,0x00,0x83,0x00,0x02,0x00,0x84,0x00,0x01,0x00,0xdb,0x00,0x00,0x00, 0x13,0x3b,0x94,0x1e,0x3c,0x95,0x1f,0x3b,0x94,0x1e,0x3a,0x93,0x1d,0x3c,0x95, 0x1f,0x3d,0x96,0x20,0x3e,0x97,0x21,0x3c,0x95,0x1f,0x3c,0x97,0x20,0x3d,0x98, 0x21,0x3d,0x96,0x20,0x3c,0x95,0x1f,0x3b,0x94,0x1e,0x3c,0x95,0x1f,0x3c,0x95, 0x1d,0x3b,0x94,0x1c,0x3c,0x95,0x1d,0x3d,0x96,0x20,0x3b,0x94,0x1e,0x82,0x3a, 0x93,0x1d,0x82,0x3b,0x94,0x1e,0x01,0x3d,0x96,0x20,0x82,0x3c,0x95,0x1f,0x01, 0x3b,0x94,0x1e,0x85,0x3a,0x93,0x1d,0x03,0x3b,0x94,0x1e,0x39,0x92,0x1c,0x3b, 0x94,0x1e,0x82,0x3c,0x95,0x1f,0x02,0x3a,0x93,0x1d,0x38,0x91,0x1b,0x82,0x39, 0x92,0x1c,0x02,0x37,0x92,0x1b,0x36,0x91,0x1a,0x82,0x3a,0x93,0x1d,0x08,0x38, 0x91,0x1b,0x37,0x92,0x1b,0x37,0x90,0x1a,0x38,0x91,0x1b,0x39,0x92,0x1c,0x37, 0x90,0x1a,0x38,0x93,0x1c,0x37,0x92,0x1b,0x82,0x37,0x90,0x1a,0x08,0x39,0x90, 0x1b,0x38,0x91,0x1b,0x39,0x92,0x1c,0x37,0x90,0x1a,0x36,0x8f,0x19,0x37,0x90, 0x1a,0x38,0x91,0x1b,0x37,0x90,0x1a,0x82,0x36,0x8f,0x19,0x05,0x38,0x91,0x1b, 0x35,0x90,0x19,0x33,0x8e,0x17,0x35,0x90,0x1b,0x36,0x91,0x1a,0x82,0x35,0x8e, 0x18,0x02,0x36,0x8f,0x19,0x34,0x8f,0x18,0x82,0x35,0x90,0x19,0x02,0x36,0x8f, 0x19,0x35,0x8e,0x18,0x82,0x35,0x90,0x19,0x82,0x36,0x91,0x1a,0x82,0x35,0x90, 0x19,0x02,0x34,0x8f,0x18,0x33,0x8e,0x17,0x82,0x35,0x90,0x19,0x04,0x32,0x8b, 0x17,0x34,0x8f,0x18,0x36,0x91,0x1a,0x34,0x8f,0x18,0x83,0x33,0x8e,0x17,0x02, 0x37,0x92,0x1b,0x32,0x90,0x18,0x82,0x33,0x8e,0x17,0x06,0x34,0x8f,0x18,0x36, 0x91,0x1a,0x34,0x8f,0x18,0x33,0x8c,0x16,0x35,0x8e,0x16,0x33,0x8e,0x19,0x82, 0x34,0x8f,0x1a,0x83,0x33,0x8e,0x17,0x17,0x34,0x8f,0x18,0x32,0x8d,0x16,0x33, 0x8e,0x17,0x32,0x8d,0x16,0x31,0x8c,0x15,0x33,0x8e,0x17,0x34,0x8f,0x18,0x33, 0x8e,0x17,0x32,0x8d,0x16,0x30,0x8b,0x14,0x30,0x8d,0x18,0x33,0x8e,0x17,0x30, 0x8e,0x14,0x31,0x8c,0x13,0x32,0x90,0x18,0x32,0x8d,0x16,0x2f,0x8d,0x15,0x33, 0x8e,0x15,0x2f,0x8d,0x15,0x31,0x8f,0x17,0x2e,0x8c,0x14,0x30,0x8e,0x16,0x32, 0x90,0x18,0x82,0x31,0x8c,0x15,0x0b,0x34,0x8f,0x18,0x30,0x8b,0x14,0x32,0x90, 0x16,0x2e,0x8c,0x14,0x31,0x8f,0x15,0x2f,0x8f,0x14,0x2f,0x8d,0x15,0x30,0x8c, 0x10,0x30,0x8e,0x14,0x31,0x8f,0x15,0x2e,0x8c,0x12,0x84,0x2f,0x8d,0x13,0x1a, 0x2e,0x8c,0x12,0x31,0x8f,0x13,0x2f,0x8d,0x13,0x2f,0x8f,0x14,0x2e,0x8e,0x11, 0x31,0x8f,0x13,0x2d,0x8b,0x0f,0x2e,0x8e,0x11,0x2f,0x8f,0x12,0x31,0x8f,0x13, 0x2e,0x8e,0x11,0x2c,0x8c,0x0f,0x2f,0x8f,0x12,0x30,0x90,0x13,0x2e,0x8e,0x11, 0x30,0x8e,0x12,0x31,0x8f,0x13,0x2f,0x8d,0x11,0x2f,0x8f,0x12,0x30,0x90,0x12, 0x2e,0x8e,0x11,0x2d,0x8d,0x12,0x2f,0x8f,0x12,0x32,0x92,0x15,0x30,0x90,0x15, 0x2e,0x8e,0x11,0x82,0x30,0x90,0x13,0x12,0x30,0x90,0x12,0x30,0x90,0x13,0x2f, 0x8f,0x12,0x2e,0x8e,0x11,0x30,0x90,0x12,0x2f,0x90,0x0f,0x2f,0x8f,0x11,0x2e, 0x8e,0x10,0x32,0x92,0x14,0x2f,0x90,0x0f,0x31,0x91,0x13,0x30,0x90,0x12,0x2f, 0x8f,0x11,0x31,0x92,0x11,0x2f,0x8f,0x11,0x30,0x91,0x10,0x30,0x93,0x12,0x31, 0x94,0x13,0x82,0x30,0x93,0x12,0x08,0x2e,0x92,0x0e,0x2f,0x93,0x0f,0x30,0x94, 0x10,0x30,0x93,0x12,0x30,0x94,0x10,0x30,0x94,0x0e,0x31,0x95,0x0f,0x31,0x95, 0x11,0x82,0x30,0x93,0x12,0x82,0x32,0x96,0x12,0x0f,0x30,0x95,0x11,0x30,0x96, 0x0f,0x31,0x97,0x10,0x32,0x98,0x10,0x30,0x96,0x0e,0x32,0x98,0x0e,0x32,0x99, 0x12,0x33,0x97,0x11,0x34,0x9a,0x12,0x31,0x9c,0x12,0x34,0x9a,0x10,0x36,0x9c, 0x12,0x34,0x9d,0x0f,0x35,0x9e,0x10,0x34,0x9d,0x0f,0x82,0x36,0x9f,0x0f,0x01, 0x34,0xa0,0x0f,0x83,0x36,0xa2,0x10,0x0f,0x37,0xa3,0x11,0x3a,0xa4,0x10,0x39, 0xa2,0x11,0x39,0xa3,0x0f,0x3b,0xa4,0x13,0x3a,0xa3,0x12,0x3c,0xa6,0x12,0x3a, 0xa3,0x12,0x3c,0xa6,0x12,0x39,0xa5,0x11,0x3a,0xa6,0x12,0x3b,0xa7,0x13,0x3a, 0xa6,0x12,0x3c,0xa9,0x12,0x3b,0xa8,0x11,0x82,0x3c,0xa8,0x14,0x09,0x3d,0xaa, 0x13,0x3d,0xa9,0x15,0x3b,0xa8,0x11,0x3d,0xaa,0x13,0x3f,0xab,0x17,0x3d,0xaa, 0x13,0x3e,0xab,0x12,0x3e,0xab,0x14,0x3d,0xab,0x14,0x82,0x3f,0xac,0x15,0x03, 0x40,0xae,0x17,0x3f,0xae,0x14,0x3e,0xad,0x13,0x82,0x3e,0xab,0x14,0x82,0x3f, 0xac,0x15,0x08,0x40,0xad,0x16,0x3f,0xac,0x15,0x40,0xad,0x16,0x41,0xae,0x17, 0x42,0xaf,0x18,0x41,0xae,0x17,0x42,0xaf,0x18,0x40,0xad,0x16,0x82,0x42,0xaf, 0x18,0x01,0x42,0xac,0x16,0x82,0x44,0xae,0x18,0x03,0x42,0xac,0x16,0x44,0xac, 0x17,0x43,0xad,0x17,0x82,0x44,0xae,0x18,0x04,0x42,0xaf,0x18,0x44,0xae,0x18, 0x45,0xad,0x18,0x44,0xae,0x18,0x82,0x45,0xaf,0x19,0x02,0x44,0xae,0x18,0x46, 0xb0,0x1a,0x82,0x45,0xaf,0x19,0x04,0x46,0xb0,0x1a,0x48,0xb2,0x1c,0x47,0xb1, 0x19,0x46,0xb0,0x1a,0x82,0x45,0xaf,0x19,0x03,0x48,0xb2,0x1c,0x45,0xaf,0x19, 0x45,0xaf,0x17,0x82,0x46,0xaf,0x18,0x82,0x44,0xac,0x16,0x11,0x44,0xab,0x16, 0x46,0xad,0x18,0x44,0xab,0x16,0x44,0xaa,0x16,0x46,0xac,0x18,0x44,0xaa,0x17, 0x43,0xa9,0x16,0x45,0xaa,0x18,0x46,0xab,0x19,0x43,0xa8,0x16,0x41,0xa5,0x14, 0x42,0xa7,0x15,0x43,0xa7,0x16,0x42,0xa6,0x15,0x41,0xa4,0x14,0x42,0xa5,0x15, 0x41,0xa1,0x15,0x82,0x41,0xa1,0x16,0x0c,0x40,0xa1,0x16,0x42,0xa3,0x18,0x41, 0x9f,0x16,0x3f,0x9d,0x14,0x3e,0x9f,0x17,0x3e,0x9c,0x16,0x3b,0x99,0x13,0x3f, 0x9a,0x15,0x3b,0x98,0x13,0x3c,0x99,0x15,0x3b,0x97,0x14,0x38,0x94,0x12,0x82, 0x39,0x93,0x12,0x02,0x38,0x91,0x12,0x35,0x8e,0x0f,0x82,0x36,0x8d,0x11,0x13, 0x35,0x8b,0x10,0x34,0x89,0x10,0x36,0x8b,0x13,0x33,0x87,0x11,0x32,0x86,0x10, 0x32,0x84,0x0f,0x30,0x81,0x0e,0x30,0x82,0x0e,0x30,0x7f,0x0d,0x2f,0x7e,0x0d, 0x30,0x7f,0x0d,0x32,0x80,0x11,0x30,0x7e,0x11,0x29,0x76,0x0c,0x22,0x6f,0x05, 0x22,0x6f,0x06,0x23,0x6e,0x06,0x22,0x6d,0x07,0x20,0x6b,0x05,0x82,0x20,0x6a, 0x05,0x04,0x20,0x69,0x07,0x1f,0x68,0x06,0x1e,0x67,0x05,0x1e,0x66,0x05,0x82, 0x1d,0x65,0x04,0x02,0x1b,0x63,0x03,0x1b,0x62,0x02,0x83,0x1c,0x63,0x04,0x02, 0x1b,0x62,0x04,0x1a,0x60,0x04,0x83,0x19,0x5f,0x03,0x06,0x17,0x5d,0x01,0x18, 0x5d,0x03,0x17,0x5c,0x03,0x16,0x5b,0x00,0x19,0x5b,0x01,0x19,0x5b,0x03,0x82, 0x17,0x5b,0x03,0x01,0x17,0x5a,0x03,0x82,0x16,0x59,0x02,0x82,0x17,0x58,0x02, 0x01,0x16,0x59,0x03,0x82,0x17,0x59,0x02,0x02,0x16,0x58,0x01,0x15,0x57,0x00, 0x83,0x17,0x58,0x02,0x01,0x16,0x57,0x01,0x82,0x16,0x56,0x01,0x25,0x15,0x57, 0x01,0x16,0x55,0x01,0x16,0x56,0x02,0x17,0x56,0x02,0x17,0x58,0x02,0x15,0x54, 0x00,0x16,0x53,0x00,0x15,0x55,0x00,0x15,0x55,0x02,0x16,0x52,0x02,0x16,0x54, 0x01,0x16,0x55,0x02,0x15,0x54,0x02,0x15,0x52,0x01,0x15,0x52,0x02,0x15,0x52, 0x03,0x14,0x51,0x02,0x13,0x51,0x00,0x14,0x52,0x00,0x16,0x54,0x02,0x15,0x52, 0x01,0x14,0x51,0x00,0x15,0x51,0x02,0x14,0x50,0x02,0x15,0x51,0x02,0x14,0x50, 0x02,0x14,0x50,0x00,0x15,0x4f,0x02,0x14,0x4e,0x00,0x15,0x4f,0x01,0x14,0x4f, 0x01,0x13,0x4e,0x00,0x14,0x4d,0x00,0x14,0x4d,0x02,0x14,0x4c,0x01,0x14,0x4e, 0x02,0x14,0x4c,0x01,0x82,0x13,0x4c,0x01,0x07,0x13,0x4c,0x02,0x13,0x4b,0x01, 0x13,0x4a,0x01,0x13,0x4b,0x01,0x14,0x4c,0x00,0x14,0x4c,0x01,0x14,0x4b,0x01, 0x82,0x14,0x4b,0x02,0x0f,0x13,0x4a,0x01,0x13,0x49,0x01,0x12,0x48,0x01,0x13, 0x48,0x01,0x12,0x4a,0x01,0x13,0x4a,0x01,0x12,0x4a,0x02,0x13,0x49,0x02,0x13, 0x48,0x01,0x12,0x47,0x00,0x12,0x48,0x01,0x12,0x47,0x00,0x13,0x47,0x01,0x12, 0x46,0x00,0x12,0x45,0x01,0x82,0x11,0x45,0x01,0x08,0x12,0x45,0x01,0x11,0x44, 0x00,0x12,0x44,0x00,0x12,0x43,0x01,0x11,0x43,0x01,0x12,0x44,0x01,0x11,0x43, 0x01,0x11,0x42,0x00,0x82,0x11,0x43,0x01,0x01,0x10,0x44,0x01,0x82,0x11,0x43, 0x01,0x0b,0x10,0x43,0x01,0x10,0x41,0x00,0x11,0x42,0x01,0x10,0x42,0x01,0x11, 0x42,0x01,0x0f,0x41,0x01,0x10,0x3f,0x00,0x10,0x40,0x01,0x11,0x40,0x01,0x10, 0x3f,0x01,0x10,0x3e,0x00,0x82,0x10,0x3f,0x01,0x82,0x10,0x3e,0x01,0x0e,0x0f, 0x3f,0x01,0x0f,0x3e,0x01,0x10,0x3d,0x01,0x10,0x3c,0x00,0x0f,0x3c,0x00,0x0f, 0x3c,0x01,0x0f,0x3d,0x02,0x10,0x3b,0x01,0x0f,0x3a,0x01,0x0f,0x39,0x01,0x10, 0x3a,0x01,0x0e,0x3a,0x01,0x0e,0x39,0x01,0x0d,0x3a,0x01,0x83,0x0e,0x39,0x01, 0x03,0x0f,0x38,0x01,0x0e,0x37,0x01,0x0e,0x36,0x00,0x82,0x0f,0x36,0x01,0x0b, 0x0e,0x36,0x01,0x0d,0x36,0x00,0x0e,0x36,0x01,0x0f,0x36,0x02,0x0e,0x35,0x01, 0x0e,0x34,0x01,0x0e,0x35,0x02,0x0d,0x35,0x01,0x0e,0x34,0x02,0x0d,0x33,0x00, 0x0d,0x33,0x01,0x83,0x0d,0x32,0x01,0x05,0x0c,0x32,0x01,0x0d,0x32,0x01,0x0d, 0x32,0x02,0x0d,0x31,0x02,0x0c,0x31,0x01,0x82,0x0c,0x30,0x01,0x01,0x0c,0x2f, 0x00,0x82,0x0d,0x30,0x01,0x02,0x0d,0x2f,0x01,0x0c,0x2f,0x01,0x82,0x0c,0x2e, 0x01,0x82,0x0c,0x2d,0x02,0x02,0x0b,0x2d,0x01,0x0b,0x2d,0x02,0x82,0x0b,0x2d, 0x01,0x82,0x0b,0x2c,0x01,0x82,0x0b,0x2b,0x01,0x03,0x0b,0x2a,0x01,0x0b,0x2a, 0x02,0x0b,0x2a,0x01,0x82,0x0b,0x2a,0x02,0x82,0x0a,0x29,0x01,0x02,0x0a,0x28, 0x01,0x0b,0x28,0x02,0x82,0x0a,0x28,0x01,0x02,0x0a,0x27,0x01,0x0b,0x27,0x02, 0x82,0x0a,0x27,0x01,0x82,0x0a,0x26,0x01,0x03,0x0a,0x25,0x01,0x0a,0x26,0x01, 0x0a,0x25,0x01,0x82,0x09,0x24,0x00,0x82,0x09,0x24,0x01,0x01,0x09,0x23,0x00, 0x84,0x09,0x23,0x01,0x01,0x09,0x22,0x01,0x83,0x09,0x21,0x01,0x01,0x08,0x21, 0x01,0x83,0x08,0x20,0x01,0x01,0x09,0x20,0x01,0x82,0x09,0x1f,0x01,0x01,0x08, 0x1f,0x01,0x82,0x08,0x1e,0x01,0x83,0x08,0x1d,0x01,0x02,0x07,0x1d,0x01,0x08, 0x1d,0x01,0x83,0x07,0x1c,0x01,0x83,0x07,0x1b,0x01,0x01,0x07,0x1a,0x01,0x82, 0x07,0x1a,0x00,0x82,0x07,0x19,0x01,0x82,0x06,0x19,0x01,0x02,0x06,0x18,0x01, 0x07,0x17,0x01,0x83,0x06,0x17,0x01,0x02,0x06,0x16,0x01,0x06,0x16,0x00,0x82, 0x06,0x16,0x01,0x04,0x06,0x15,0x00,0x06,0x15,0x01,0x05,0x15,0x00,0x05,0x15, 0x01,0x82,0x05,0x14,0x00,0x83,0x05,0x13,0x00,0x06,0x05,0x12,0x00,0x04,0x13, 0x00,0x04,0x12,0x00,0x04,0x12,0x01,0x04,0x11,0x01,0x04,0x11,0x00,0x85,0x04, 0x10,0x00,0x82,0x04,0x0f,0x00,0x01,0x04,0x0e,0x00,0x82,0x03,0x0e,0x00,0x83, 0x03,0x0d,0x00,0x83,0x03,0x0c,0x00,0x02,0x02,0x0b,0x00,0x03,0x0b,0x00,0x82, 0x02,0x0b,0x00,0x83,0x02,0x0a,0x00,0x84,0x02,0x09,0x00,0x83,0x02,0x08,0x00, 0x01,0x02,0x07,0x00,0x82,0x01,0x07,0x00,0x83,0x01,0x06,0x00,0x84,0x01,0x05, 0x00,0x84,0x01,0x04,0x00,0x83,0x00,0x03,0x00,0x83,0x00,0x02,0x00,0x84,0x00, 0x01,0x00,0xdb,0x00,0x00,0x00,0x03,0x3b,0x96,0x1f,0x3f,0x98,0x22,0x40,0x99, 0x23,0x82,0x3d,0x96,0x20,0x01,0x3c,0x95,0x1f,0x82,0x3c,0x97,0x1e,0x83,0x3c, 0x97,0x20,0x03,0x3d,0x96,0x20,0x3d,0x96,0x1e,0x3c,0x97,0x1e,0x82,0x3e,0x99, 0x20,0x03,0x3d,0x96,0x1e,0x3e,0x97,0x1f,0x3e,0x97,0x21,0x82,0x3c,0x95,0x1f, 0x09,0x3e,0x97,0x21,0x3d,0x96,0x1e,0x3b,0x96,0x1d,0x3a,0x93,0x1d,0x3b,0x94, 0x1e,0x3c,0x95,0x1f,0x3b,0x96,0x1d,0x3c,0x97,0x1e,0x3c,0x95,0x1f,0x82,0x3b, 0x94,0x1e,0x03,0x3b,0x96,0x1f,0x3c,0x95,0x1f,0x3b,0x94,0x1e,0x82,0x3d,0x96, 0x20,0x06,0x3a,0x93,0x1d,0x3c,0x95,0x1f,0x3b,0x94,0x1e,0x39,0x94,0x1d,0x3b, 0x92,0x1d,0x39,0x92,0x1c,0x82,0x39,0x94,0x1d,0x03,0x3a,0x91,0x1c,0x3b,0x93, 0x1b,0x39,0x94,0x1d,0x82,0x39,0x92,0x1c,0x02,0x38,0x91,0x1b,0x39,0x92,0x1c, 0x82,0x38,0x91,0x1b,0x82,0x39,0x92,0x1c,0x03,0x3a,0x93,0x1b,0x38,0x91,0x1b, 0x37,0x90,0x1a,0x83,0x38,0x91,0x1b,0x83,0x39,0x92,0x1c,0x01,0x37,0x90,0x1a, 0x82,0x36,0x91,0x1a,0x02,0x35,0x90,0x19,0x36,0x91,0x1a,0x82,0x37,0x90,0x1a, 0x01,0x37,0x92,0x19,0x83,0x35,0x90,0x19,0x05,0x37,0x90,0x1a,0x36,0x8f,0x19, 0x35,0x90,0x19,0x36,0x91,0x18,0x34,0x8f,0x18,0x82,0x35,0x90,0x19,0x01,0x37, 0x92,0x1b,0x82,0x36,0x91,0x18,0x07,0x35,0x90,0x17,0x35,0x90,0x19,0x36,0x8f, 0x19,0x34,0x8f,0x18,0x34,0x8f,0x16,0x35,0x90,0x17,0x34,0x8f,0x16,0x82,0x33, 0x8e,0x17,0x09,0x34,0x8f,0x18,0x36,0x91,0x1a,0x35,0x90,0x19,0x36,0x91,0x1a, 0x34,0x8f,0x18,0x32,0x8d,0x16,0x33,0x8e,0x17,0x34,0x8f,0x16,0x36,0x8f,0x17, 0x82,0x33,0x8e,0x17,0x09,0x32,0x8d,0x16,0x34,0x8f,0x18,0x35,0x90,0x19,0x33, 0x8e,0x17,0x35,0x90,0x19,0x34,0x8f,0x18,0x33,0x8e,0x17,0x31,0x8f,0x17,0x32, 0x8d,0x16,0x82,0x33,0x8e,0x17,0x0d,0x32,0x8d,0x16,0x35,0x90,0x19,0x32,0x8d, 0x16,0x31,0x8c,0x15,0x34,0x8f,0x18,0x32,0x90,0x18,0x32,0x8d,0x16,0x33,0x8e, 0x17,0x31,0x8f,0x17,0x2f,0x8d,0x13,0x32,0x8d,0x14,0x34,0x8f,0x18,0x30,0x8e, 0x16,0x82,0x2f,0x8d,0x15,0x01,0x30,0x8e,0x14,0x82,0x31,0x8c,0x13,0x0c,0x33, 0x8e,0x15,0x32,0x8d,0x18,0x2f,0x8d,0x13,0x30,0x8e,0x14,0x31,0x8d,0x11,0x2f, 0x8d,0x11,0x2f,0x8d,0x13,0x34,0x8f,0x16,0x30,0x8e,0x16,0x2f,0x8d,0x13,0x30, 0x8e,0x14,0x2f,0x8d,0x13,0x82,0x30,0x8e,0x14,0x82,0x2f,0x8d,0x13,0x0a,0x2e, 0x8c,0x12,0x30,0x8e,0x14,0x2f,0x8f,0x14,0x2f,0x8f,0x12,0x2f,0x8d,0x11,0x30, 0x8e,0x14,0x30,0x90,0x13,0x2f,0x8f,0x12,0x31,0x8f,0x13,0x2e,0x8e,0x11,0x82, 0x30,0x90,0x13,0x02,0x2d,0x8d,0x10,0x2e,0x8c,0x10,0x82,0x31,0x8f,0x13,0x03, 0x2e,0x8c,0x10,0x2f,0x8f,0x12,0x2f,0x8f,0x11,0x82,0x30,0x8e,0x12,0x0c,0x30, 0x90,0x12,0x30,0x90,0x13,0x2e,0x8e,0x13,0x2e,0x8e,0x11,0x30,0x90,0x13,0x30, 0x90,0x12,0x2e,0x8e,0x10,0x2f,0x8f,0x11,0x2f,0x8f,0x12,0x2e,0x8e,0x11,0x2e, 0x8e,0x10,0x2f,0x8f,0x11,0x82,0x2e,0x8e,0x10,0x82,0x30,0x90,0x12,0x07,0x32, 0x92,0x14,0x2f,0x8f,0x11,0x30,0x90,0x12,0x31,0x92,0x0f,0x31,0x91,0x13,0x31, 0x92,0x11,0x2d,0x90,0x0f,0x84,0x2e,0x91,0x10,0x02,0x30,0x94,0x10,0x31,0x95, 0x11,0x82,0x2f,0x92,0x11,0x05,0x2e,0x92,0x0e,0x30,0x94,0x10,0x32,0x96,0x12, 0x31,0x95,0x11,0x32,0x97,0x13,0x82,0x30,0x94,0x10,0x01,0x2f,0x94,0x10,0x82, 0x30,0x96,0x0f,0x0f,0x31,0x97,0x10,0x2e,0x94,0x0d,0x30,0x96,0x0f,0x32,0x98, 0x11,0x31,0x97,0x10,0x32,0x98,0x11,0x32,0x98,0x10,0x33,0x99,0x11,0x33,0x99, 0x0f,0x33,0x9b,0x10,0x34,0x9c,0x11,0x34,0x9d,0x0f,0x36,0x9f,0x11,0x35,0x9e, 0x10,0x33,0x9f,0x0e,0x83,0x34,0xa0,0x0f,0x01,0x37,0xa0,0x10,0x82,0x34,0xa0, 0x0e,0x0a,0x37,0xa3,0x11,0x39,0xa5,0x13,0x37,0xa3,0x11,0x3a,0xa6,0x12,0x38, 0xa6,0x13,0x37,0xa5,0x10,0x38,0xa4,0x10,0x39,0xa5,0x11,0x3a,0xa6,0x14,0x3a, 0xa6,0x12,0x82,0x3c,0xa9,0x12,0x0a,0x3d,0xa9,0x15,0x3c,0xa8,0x14,0x3a,0xa6, 0x12,0x3c,0xa9,0x12,0x3d,0xaa,0x13,0x3d,0xa9,0x15,0x3d,0xaa,0x11,0x3d,0xaa, 0x13,0x3e,0xab,0x14,0x3e,0xab,0x12,0x82,0x3e,0xac,0x15,0x82,0x3f,0xad,0x16, 0x82,0x3e,0xac,0x15,0x02,0x3f,0xac,0x15,0x40,0xad,0x16,0x82,0x3e,0xab,0x14, 0x04,0x3d,0xab,0x14,0x3e,0xac,0x15,0x3e,0xab,0x14,0x3e,0xab,0x12,0x82,0x3f, 0xac,0x13,0x13,0x40,0xad,0x16,0x3f,0xac,0x15,0x41,0xae,0x15,0x40,0xad,0x14, 0x41,0xae,0x15,0x44,0xae,0x18,0x41,0xae,0x17,0x3f,0xac,0x15,0x42,0xac,0x16, 0x40,0xad,0x16,0x43,0xad,0x17,0x42,0xac,0x16,0x42,0xaf,0x18,0x41,0xae,0x17, 0x44,0xae,0x18,0x43,0xad,0x17,0x44,0xae,0x16,0x45,0xaf,0x19,0x43,0xad,0x17, 0x82,0x44,0xae,0x18,0x0f,0x44,0xae,0x16,0x46,0xb0,0x18,0x44,0xae,0x16,0x45, 0xaf,0x19,0x44,0xae,0x18,0x45,0xaf,0x19,0x44,0xae,0x18,0x45,0xaf,0x17,0x44, 0xae,0x16,0x45,0xaf,0x17,0x46,0xaf,0x18,0x43,0xaf,0x17,0x45,0xad,0x17,0x43, 0xab,0x15,0x44,0xab,0x16,0x82,0x44,0xac,0x17,0x0d,0x45,0xac,0x18,0x45,0xab, 0x17,0x44,0xaa,0x17,0x46,0xac,0x19,0x45,0xac,0x17,0x44,0xab,0x16,0x44,0xa9, 0x18,0x44,0xa9,0x17,0x43,0xa8,0x16,0x42,0xa6,0x15,0x43,0xa7,0x16,0x41,0xa4, 0x14,0x44,0xa7,0x17,0x82,0x42,0xa5,0x16,0x04,0x41,0xa3,0x17,0x40,0xa1,0x16, 0x41,0xa2,0x17,0x40,0xa0,0x16,0x82,0x40,0x9f,0x16,0x0d,0x40,0x9e,0x16,0x3e, 0x9c,0x14,0x3e,0x9b,0x14,0x3c,0x99,0x14,0x3e,0x99,0x14,0x3c,0x98,0x14,0x3a, 0x96,0x12,0x3a,0x97,0x13,0x38,0x94,0x12,0x37,0x93,0x12,0x37,0x90,0x10,0x36, 0x8f,0x10,0x37,0x8e,0x12,0x82,0x36,0x8c,0x10,0x12,0x36,0x8b,0x13,0x34,0x88, 0x10,0x33,0x87,0x0f,0x33,0x88,0x10,0x32,0x84,0x0f,0x30,0x82,0x0d,0x31,0x80, 0x0e,0x30,0x7f,0x0d,0x2e,0x7d,0x0c,0x30,0x7e,0x0d,0x31,0x7f,0x0e,0x30,0x7e, 0x0f,0x2b,0x78,0x0e,0x24,0x71,0x07,0x21,0x6b,0x04,0x22,0x6d,0x05,0x21,0x6c, 0x06,0x20,0x6a,0x05,0x82,0x21,0x6b,0x06,0x02,0x1f,0x69,0x05,0x1f,0x68,0x06, 0x82,0x1e,0x67,0x04,0x02,0x1e,0x66,0x05,0x1c,0x64,0x04,0x82,0x1d,0x64,0x04, 0x82,0x1c,0x63,0x04,0x02,0x1b,0x62,0x03,0x1a,0x60,0x02,0x83,0x1a,0x60,0x04, 0x08,0x19,0x5e,0x03,0x18,0x5d,0x02,0x17,0x5c,0x01,0x18,0x5d,0x02,0x19,0x5c, 0x02,0x19,0x5b,0x01,0x18,0x59,0x02,0x17,0x5b,0x01,0x82,0x17,0x5a,0x01,0x01, 0x17,0x5a,0x03,0x82,0x18,0x59,0x03,0x06,0x17,0x5a,0x03,0x16,0x59,0x03,0x16, 0x58,0x03,0x15,0x57,0x02,0x16,0x58,0x01,0x17,0x58,0x02,0x82,0x16,0x57,0x01, 0x01,0x15,0x56,0x00,0x82,0x16,0x56,0x01,0x01,0x16,0x57,0x02,0x82,0x16,0x56, 0x02,0x0f,0x15,0x55,0x01,0x15,0x56,0x02,0x17,0x54,0x01,0x16,0x55,0x02,0x17, 0x55,0x02,0x16,0x54,0x03,0x14,0x53,0x02,0x15,0x53,0x01,0x14,0x53,0x01,0x15, 0x54,0x02,0x15,0x53,0x02,0x14,0x51,0x00,0x15,0x51,0x02,0x15,0x52,0x03,0x15, 0x52,0x02,0x82,0x14,0x52,0x00,0x82,0x15,0x52,0x02,0x03,0x14,0x51,0x02,0x14, 0x50,0x02,0x15,0x51,0x02,0x82,0x14,0x50,0x02,0x06,0x14,0x4f,0x00,0x14,0x4e, 0x00,0x13,0x4f,0x00,0x13,0x4e,0x00,0x14,0x4f,0x01,0x14,0x4e,0x01,0x82,0x14, 0x4d,0x02,0x0c,0x14,0x4e,0x02,0x14,0x4c,0x01,0x13,0x4c,0x01,0x13,0x4d,0x02, 0x13,0x4c,0x02,0x12,0x4b,0x01,0x12,0x4a,0x01,0x13,0x4b,0x01,0x14,0x4c,0x00, 0x14,0x4b,0x00,0x14,0x4c,0x02,0x13,0x4b,0x01,0x82,0x13,0x4a,0x01,0x03,0x13, 0x49,0x01,0x13,0x4a,0x01,0x14,0x49,0x01,0x82,0x13,0x4a,0x01,0x0a,0x11,0x4a, 0x01,0x13,0x48,0x01,0x14,0x49,0x01,0x13,0x47,0x00,0x11,0x47,0x01,0x12,0x48, 0x01,0x12,0x47,0x00,0x12,0x46,0x00,0x13,0x46,0x02,0x13,0x45,0x01,0x82,0x12, 0x45,0x01,0x02,0x12,0x45,0x02,0x11,0x44,0x00,0x82,0x12,0x44,0x01,0x09,0x12, 0x44,0x02,0x11,0x43,0x01,0x12,0x44,0x01,0x11,0x43,0x01,0x11,0x42,0x01,0x11, 0x43,0x00,0x12,0x43,0x01,0x10,0x42,0x00,0x11,0x43,0x01,0x83,0x11,0x42,0x01, 0x08,0x11,0x42,0x00,0x10,0x41,0x00,0x10,0x40,0x01,0x11,0x40,0x02,0x10,0x41, 0x02,0x10,0x3f,0x01,0x11,0x3f,0x01,0x10,0x3f,0x01,0x82,0x10,0x3e,0x01,0x0d, 0x10,0x3e,0x00,0x10,0x3e,0x01,0x10,0x3d,0x02,0x10,0x3e,0x01,0x10,0x3d,0x01, 0x10,0x3c,0x01,0x10,0x3c,0x00,0x10,0x3b,0x00,0x10,0x3b,0x01,0x0f,0x3a,0x01, 0x0e,0x3a,0x01,0x0f,0x3b,0x01,0x0e,0x3a,0x01,0x82,0x0f,0x39,0x01,0x0e,0x0e, 0x39,0x01,0x0e,0x38,0x01,0x0e,0x39,0x01,0x0f,0x38,0x01,0x0e,0x38,0x01,0x0f, 0x36,0x01,0x0e,0x37,0x01,0x0e,0x35,0x00,0x0e,0x36,0x01,0x0d,0x35,0x00,0x0d, 0x36,0x01,0x0e,0x35,0x01,0x0d,0x35,0x01,0x0e,0x34,0x01,0x82,0x0d,0x35,0x00, 0x03,0x0e,0x35,0x02,0x0d,0x33,0x01,0x0e,0x33,0x01,0x82,0x0d,0x33,0x01,0x04, 0x0e,0x32,0x01,0x0d,0x32,0x01,0x0b,0x32,0x01,0x0d,0x32,0x02,0x82,0x0d,0x31, 0x01,0x03,0x0d,0x31,0x02,0x0c,0x31,0x01,0x0c,0x30,0x01,0x82,0x0d,0x30,0x01, 0x04,0x0d,0x2f,0x01,0x0c,0x30,0x01,0x0c,0x2f,0x01,0x0b,0x2e,0x01,0x83,0x0c, 0x2d,0x01,0x05,0x0b,0x2d,0x01,0x0b,0x2d,0x00,0x0b,0x2d,0x01,0x0c,0x2c,0x01, 0x0b,0x2c,0x01,0x83,0x0b,0x2b,0x01,0x01,0x0b,0x2a,0x02,0x82,0x0b,0x2a,0x01, 0x01,0x0b,0x2a,0x02,0x82,0x0a,0x29,0x01,0x04,0x0a,0x28,0x01,0x0b,0x28,0x01, 0x0a,0x28,0x01,0x0b,0x27,0x01,0x84,0x0a,0x27,0x01,0x82,0x0a,0x26,0x01,0x04, 0x0a,0x25,0x01,0x09,0x26,0x01,0x0a,0x26,0x01,0x0a,0x25,0x01,0x83,0x09,0x24, 0x01,0x01,0x09,0x23,0x00,0x82,0x09,0x23,0x01,0x04,0x08,0x23,0x01,0x09,0x21, 0x01,0x08,0x21,0x01,0x09,0x22,0x01,0x82,0x09,0x21,0x01,0x01,0x08,0x21,0x01, 0x83,0x08,0x20,0x01,0x84,0x08,0x1f,0x01,0x82,0x08,0x1e,0x01,0x01,0x08,0x1e, 0x00,0x84,0x08,0x1d,0x01,0x83,0x07,0x1c,0x01,0x83,0x07,0x1b,0x01,0x01,0x07, 0x1a,0x00,0x82,0x07,0x1a,0x01,0x04,0x07,0x19,0x01,0x07,0x18,0x00,0x06,0x18, 0x01,0x06,0x19,0x01,0x83,0x06,0x18,0x01,0x83,0x06,0x17,0x01,0x83,0x06,0x16, 0x01,0x82,0x05,0x15,0x00,0x05,0x05,0x15,0x01,0x05,0x14,0x01,0x05,0x14,0x00, 0x05,0x14,0x01,0x05,0x14,0x00,0x82,0x05,0x13,0x00,0x01,0x05,0x12,0x00,0x83, 0x04,0x12,0x00,0x84,0x04,0x11,0x00,0x83,0x04,0x10,0x00,0x83,0x04,0x0f,0x00, 0x83,0x03,0x0e,0x00,0x82,0x03,0x0d,0x00,0x83,0x03,0x0c,0x00,0x83,0x03,0x0b, 0x00,0x02,0x02,0x0b,0x00,0x03,0x0a,0x00,0x83,0x02,0x0a,0x00,0x82,0x02,0x09, 0x00,0x84,0x02,0x08,0x00,0x01,0x02,0x07,0x00,0x82,0x01,0x07,0x00,0x83,0x01, 0x06,0x00,0x84,0x01,0x05,0x00,0x84,0x01,0x04,0x00,0x83,0x00,0x03,0x00,0x83, 0x00,0x02,0x00,0x84,0x00,0x01,0x00,0xdb,0x00,0x00,0x00,0x02,0x3e,0x99,0x22, 0x3c,0x97,0x20,0x82,0x3f,0x98,0x22,0x10,0x3e,0x97,0x21,0x3d,0x98,0x21,0x3f, 0x9a,0x21,0x3d,0x98,0x1f,0x3e,0x99,0x22,0x3d,0x98,0x21,0x3c,0x97,0x20,0x3d, 0x98,0x21,0x3d,0x98,0x1f,0x3c,0x97,0x1e,0x3e,0x9a,0x1e,0x3f,0x9b,0x1f,0x3d, 0x96,0x1e,0x3c,0x95,0x1d,0x3d,0x96,0x20,0x3d,0x98,0x21,0x82,0x3e,0x97,0x1f, 0x82,0x3c,0x97,0x1e,0x09,0x3d,0x96,0x20,0x3d,0x96,0x1e,0x3c,0x95,0x1d,0x3c, 0x98,0x1c,0x3d,0x99,0x1d,0x3c,0x97,0x1e,0x3c,0x95,0x1d,0x3c,0x95,0x1f,0x3c, 0x97,0x1e,0x82,0x3b,0x94,0x1e,0x08,0x3c,0x93,0x1e,0x3c,0x95,0x1f,0x3a,0x93, 0x1d,0x3b,0x94,0x1e,0x3a,0x93,0x1d,0x3b,0x94,0x1c,0x3b,0x94,0x1e,0x3a,0x93, 0x1d,0x82,0x3c,0x95,0x1f,0x17,0x3b,0x94,0x1c,0x3c,0x95,0x1d,0x3b,0x94,0x1c, 0x3a,0x95,0x1c,0x39,0x94,0x1d,0x39,0x92,0x1c,0x3a,0x93,0x1d,0x39,0x92,0x1c, 0x3a,0x93,0x1d,0x39,0x94,0x1d,0x37,0x95,0x1b,0x39,0x94,0x1b,0x37,0x92,0x1b, 0x39,0x92,0x1c,0x3a,0x93,0x1d,0x39,0x92,0x1a,0x38,0x91,0x19,0x38,0x91,0x1b, 0x3a,0x93,0x1f,0x39,0x92,0x1c,0x37,0x90,0x1a,0x37,0x92,0x1b,0x38,0x93,0x1c, 0x82,0x37,0x92,0x1b,0x02,0x37,0x90,0x1a,0x38,0x91,0x1b,0x82,0x38,0x93,0x1a, 0x08,0x37,0x92,0x1b,0x36,0x8f,0x19,0x37,0x90,0x1a,0x38,0x91,0x1b,0x35,0x90, 0x17,0x36,0x91,0x18,0x36,0x91,0x1a,0x34,0x8f,0x18,0x82,0x35,0x90,0x19,0x07, 0x35,0x90,0x17,0x37,0x92,0x19,0x36,0x91,0x18,0x37,0x92,0x19,0x35,0x90,0x19, 0x36,0x91,0x18,0x34,0x8f,0x16,0x82,0x35,0x90,0x17,0x06,0x35,0x90,0x19,0x37, 0x92,0x1b,0x35,0x90,0x19,0x35,0x8e,0x18,0x37,0x90,0x1a,0x36,0x91,0x18,0x82, 0x34,0x8f,0x18,0x82,0x35,0x90,0x17,0x04,0x36,0x91,0x18,0x35,0x90,0x17,0x32, 0x8d,0x14,0x34,0x8f,0x16,0x82,0x34,0x8d,0x15,0x06,0x35,0x90,0x17,0x34,0x8f, 0x16,0x33,0x8e,0x15,0x31,0x8f,0x17,0x32,0x90,0x18,0x33,0x91,0x19,0x82,0x31, 0x8c,0x15,0x83,0x34,0x8f,0x16,0x06,0x35,0x90,0x17,0x32,0x90,0x18,0x32,0x8d, 0x16,0x31,0x8f,0x17,0x32,0x8b,0x13,0x30,0x8e,0x14,0x82,0x33,0x8e,0x15,0x13, 0x32,0x8d,0x16,0x35,0x90,0x19,0x30,0x8e,0x16,0x31,0x8f,0x15,0x32,0x90,0x16, 0x31,0x8f,0x15,0x33,0x8e,0x15,0x30,0x8b,0x12,0x31,0x8c,0x13,0x2e,0x8c,0x12, 0x36,0x91,0x1a,0x33,0x8e,0x15,0x31,0x8f,0x17,0x2f,0x8d,0x15,0x32,0x8e,0x12, 0x2f,0x8d,0x13,0x30,0x8e,0x14,0x31,0x8f,0x15,0x2f,0x8d,0x13,0x82,0x30,0x8e, 0x14,0x01,0x31,0x8f,0x15,0x83,0x30,0x8e,0x14,0x02,0x31,0x8f,0x15,0x30,0x8e, 0x14,0x82,0x2f,0x8d,0x13,0x08,0x30,0x90,0x15,0x2d,0x8d,0x12,0x2e,0x8c,0x10, 0x31,0x91,0x14,0x2e,0x8e,0x11,0x2f,0x8f,0x12,0x31,0x8f,0x13,0x32,0x90,0x14, 0x82,0x30,0x8e,0x12,0x0d,0x30,0x8e,0x14,0x31,0x91,0x14,0x30,0x8f,0x11,0x31, 0x8f,0x13,0x2f,0x8d,0x11,0x2e,0x8d,0x0f,0x2f,0x8f,0x12,0x2d,0x8d,0x12,0x2e, 0x8e,0x11,0x30,0x91,0x10,0x2e,0x8e,0x10,0x2e,0x8e,0x11,0x2f,0x8f,0x12,0x82, 0x2e,0x8e,0x10,0x02,0x2f,0x8f,0x11,0x31,0x91,0x14,0x82,0x2e,0x91,0x12,0x06, 0x2d,0x90,0x11,0x2c,0x8f,0x10,0x2d,0x90,0x11,0x2e,0x91,0x13,0x2c,0x8f,0x10, 0x2e,0x92,0x0e,0x82,0x30,0x93,0x12,0x11,0x2c,0x8f,0x0e,0x31,0x92,0x11,0x32, 0x93,0x12,0x30,0x91,0x10,0x2e,0x91,0x10,0x2f,0x92,0x11,0x30,0x91,0x10,0x30, 0x94,0x10,0x2f,0x92,0x11,0x2e,0x91,0x12,0x2f,0x92,0x11,0x2f,0x93,0x0d,0x2f, 0x95,0x0e,0x30,0x96,0x0f,0x2f,0x93,0x0f,0x30,0x94,0x10,0x2e,0x94,0x0d,0x83, 0x2f,0x95,0x0e,0x03,0x2f,0x94,0x10,0x30,0x94,0x10,0x32,0x93,0x0e,0x82,0x30, 0x96,0x0f,0x02,0x32,0x96,0x10,0x32,0x98,0x10,0x82,0x31,0x99,0x10,0x02,0x32, 0x9a,0x11,0x32,0x9a,0x0f,0x82,0x34,0x9d,0x0f,0x12,0x34,0x9f,0x11,0x35,0xa1, 0x10,0x34,0xa0,0x0f,0x33,0x9f,0x0e,0x36,0x9f,0x0f,0x35,0xa1,0x10,0x35,0xa1, 0x0f,0x37,0xa3,0x12,0x37,0xa3,0x11,0x36,0xa2,0x0e,0x36,0xa2,0x10,0x36,0xa4, 0x0f,0x37,0xa5,0x10,0x38,0xa4,0x10,0x39,0xa5,0x13,0x3a,0xa6,0x14,0x3a,0xa6, 0x12,0x38,0xa6,0x0f,0x82,0x3b,0xa8,0x11,0x06,0x3b,0xa7,0x13,0x3a,0xa6,0x12, 0x39,0xa5,0x11,0x3c,0xa8,0x14,0x3c,0xa9,0x12,0x3b,0xa8,0x11,0x82,0x3d,0xaa, 0x13,0x07,0x3e,0xab,0x14,0x3e,0xac,0x15,0x3c,0xaa,0x13,0x3d,0xab,0x14,0x3c, 0xaa,0x13,0x3d,0xab,0x14,0x3e,0xac,0x15,0x82,0x3f,0xac,0x15,0x82,0x3d,0xaa, 0x13,0x01,0x3d,0xab,0x16,0x82,0x3f,0xad,0x16,0x01,0x3e,0xab,0x12,0x82,0x3f, 0xac,0x13,0x07,0x3e,0xab,0x14,0x3f,0xac,0x15,0x41,0xae,0x17,0x3f,0xac,0x15, 0x40,0xad,0x16,0x3e,0xab,0x14,0x3f,0xac,0x15,0x82,0x41,0xae,0x17,0x04,0x44, 0xae,0x18,0x40,0xad,0x16,0x41,0xae,0x15,0x43,0xad,0x15,0x82,0x41,0xae,0x17, 0x03,0x43,0xad,0x17,0x45,0xaf,0x17,0x44,0xae,0x16,0x82,0x42,0xaf,0x18,0x04, 0x43,0xb0,0x19,0x43,0xb0,0x17,0x46,0xb0,0x18,0x45,0xaf,0x17,0x82,0x43,0xad, 0x17,0x03,0x46,0xb0,0x1a,0x45,0xaf,0x17,0x47,0xb0,0x18,0x82,0x45,0xaf,0x17, 0x0e,0x45,0xae,0x17,0x44,0xad,0x16,0x46,0xae,0x18,0x43,0xac,0x16,0x46,0xae, 0x19,0x45,0xad,0x18,0x44,0xab,0x16,0x44,0xaa,0x14,0x43,0xab,0x14,0x45,0xab, 0x18,0x43,0xa9,0x16,0x43,0xaa,0x15,0x44,0xab,0x16,0x44,0xaa,0x16,0x82,0x43, 0xa8,0x16,0x0c,0x43,0xa7,0x16,0x42,0xa7,0x16,0x42,0xa6,0x16,0x41,0xa5,0x15, 0x43,0xa7,0x18,0x43,0xa6,0x17,0x42,0xa5,0x16,0x40,0xa1,0x16,0x41,0xa2,0x17, 0x41,0xa0,0x14,0x41,0xa1,0x15,0x40,0xa0,0x14,0x82,0x40,0x9e,0x16,0x82,0x3e, 0x9b,0x14,0x07,0x3d,0x9a,0x14,0x3c,0x9a,0x14,0x3d,0x9a,0x15,0x3a,0x97,0x13, 0x39,0x95,0x12,0x3a,0x96,0x12,0x39,0x92,0x11,0x82,0x3a,0x92,0x13,0x02,0x38, 0x8f,0x13,0x37,0x8d,0x11,0x82,0x34,0x8a,0x0f,0x07,0x34,0x89,0x11,0x34,0x88, 0x11,0x35,0x87,0x10,0x33,0x85,0x0e,0x31,0x82,0x0f,0x2f,0x80,0x0d,0x30,0x80, 0x0e,0x82,0x30,0x7e,0x0d,0x08,0x30,0x7e,0x0f,0x2e,0x7b,0x0d,0x2e,0x7c,0x10, 0x28,0x75,0x0c,0x21,0x6e,0x05,0x20,0x6d,0x05,0x21,0x6c,0x07,0x20,0x6b,0x06, 0x82,0x1f,0x6a,0x05,0x0c,0x1f,0x68,0x04,0x1f,0x69,0x05,0x20,0x69,0x05,0x1f, 0x67,0x04,0x1e,0x65,0x05,0x1d,0x64,0x04,0x1c,0x63,0x04,0x1d,0x64,0x04,0x1d, 0x63,0x04,0x1b,0x62,0x03,0x1b,0x61,0x03,0x1a,0x60,0x04,0x82,0x19,0x5f,0x03, 0x08,0x18,0x5e,0x02,0x19,0x5e,0x03,0x18,0x5d,0x02,0x19,0x5e,0x01,0x19,0x5c, 0x02,0x19,0x5b,0x01,0x19,0x5a,0x01,0x17,0x5b,0x01,0x82,0x17,0x5a,0x01,0x03, 0x17,0x5a,0x03,0x17,0x58,0x02,0x18,0x59,0x03,0x82,0x18,0x58,0x03,0x01,0x17, 0x57,0x02,0x82,0x18,0x57,0x03,0x12,0x17,0x56,0x02,0x16,0x59,0x02,0x17,0x58, 0x02,0x16,0x57,0x01,0x17,0x57,0x02,0x15,0x55,0x00,0x16,0x57,0x02,0x16,0x55, 0x01,0x15,0x55,0x01,0x15,0x56,0x00,0x16,0x53,0x02,0x16,0x55,0x03,0x16,0x55, 0x02,0x16,0x52,0x02,0x16,0x54,0x03,0x15,0x55,0x02,0x14,0x52,0x00,0x15,0x53, 0x01,0x82,0x15,0x53,0x02,0x13,0x15,0x52,0x01,0x15,0x51,0x02,0x15,0x52,0x02, 0x16,0x52,0x01,0x16,0x53,0x00,0x14,0x53,0x02,0x15,0x51,0x02,0x14,0x50,0x01, 0x15,0x51,0x04,0x13,0x4f,0x02,0x14,0x4f,0x01,0x15,0x50,0x02,0x14,0x51,0x02, 0x14,0x50,0x01,0x14,0x4f,0x00,0x15,0x50,0x01,0x14,0x50,0x01,0x13,0x4f,0x00, 0x13,0x4e,0x00,0x82,0x13,0x4d,0x01,0x0e,0x13,0x4d,0x00,0x12,0x4c,0x00,0x13, 0x4d,0x01,0x13,0x4d,0x02,0x13,0x4c,0x01,0x14,0x4d,0x01,0x14,0x4c,0x01,0x12, 0x4c,0x01,0x14,0x4b,0x01,0x13,0x4b,0x01,0x14,0x4b,0x01,0x12,0x4a,0x00,0x13, 0x4a,0x01,0x14,0x4b,0x03,0x82,0x13,0x4a,0x00,0x06,0x14,0x49,0x01,0x13,0x49, 0x00,0x13,0x48,0x00,0x12,0x49,0x01,0x12,0x48,0x01,0x12,0x48,0x00,0x82,0x14, 0x48,0x01,0x83,0x13,0x47,0x01,0x02,0x12,0x47,0x02,0x10,0x45,0x00,0x82,0x11, 0x45,0x01,0x0d,0x12,0x45,0x02,0x12,0x44,0x00,0x12,0x45,0x01,0x12,0x44,0x00, 0x12,0x44,0x01,0x11,0x43,0x01,0x12,0x45,0x03,0x11,0x43,0x01,0x10,0x43,0x00, 0x12,0x43,0x02,0x11,0x43,0x02,0x10,0x42,0x01,0x11,0x41,0x01,0x82,0x11,0x42, 0x02,0x07,0x11,0x40,0x00,0x11,0x42,0x01,0x0f,0x41,0x00,0x11,0x3f,0x00,0x0f, 0x3f,0x01,0x0f,0x40,0x01,0x10,0x3f,0x01,0x82,0x11,0x3f,0x00,0x11,0x10,0x3f, 0x00,0x0f,0x3e,0x00,0x0f,0x3d,0x01,0x10,0x3e,0x02,0x0f,0x3d,0x00,0x0f,0x3d, 0x01,0x10,0x3d,0x02,0x10,0x3c,0x01,0x0f,0x3b,0x01,0x10,0x3b,0x00,0x0f,0x3b, 0x00,0x10,0x3b,0x01,0x0e,0x3a,0x01,0x0f,0x3b,0x01,0x0f,0x3a,0x01,0x0e,0x39, 0x01,0x0f,0x38,0x00,0x83,0x0f,0x38,0x01,0x02,0x0e,0x37,0x00,0x0d,0x37,0x00, 0x82,0x0e,0x37,0x01,0x82,0x0d,0x36,0x00,0x02,0x0e,0x37,0x02,0x0f,0x36,0x02, 0x82,0x0e,0x35,0x01,0x05,0x0e,0x35,0x00,0x0d,0x35,0x00,0x0d,0x34,0x00,0x0e, 0x34,0x02,0x0e,0x34,0x01,0x83,0x0d,0x33,0x01,0x08,0x0e,0x33,0x02,0x0d,0x32, 0x01,0x0d,0x32,0x00,0x0d,0x32,0x01,0x0d,0x32,0x02,0x0d,0x31,0x00,0x0d,0x31, 0x01,0x0c,0x31,0x01,0x83,0x0c,0x30,0x01,0x04,0x0b,0x30,0x00,0x0c,0x30,0x01, 0x0d,0x2f,0x01,0x0c,0x2f,0x01,0x82,0x0c,0x2e,0x00,0x01,0x0d,0x2e,0x01,0x82, 0x0c,0x2d,0x00,0x01,0x0c,0x2d,0x01,0x82,0x0c,0x2c,0x01,0x82,0x0b,0x2c,0x01, 0x0b,0x0c,0x2b,0x01,0x0b,0x2a,0x01,0x0b,0x2b,0x01,0x0b,0x2a,0x01,0x0b,0x29, 0x00,0x0b,0x29,0x01,0x0b,0x29,0x02,0x0a,0x29,0x01,0x0b,0x28,0x01,0x0a,0x28, 0x01,0x0b,0x28,0x01,0x83,0x0a,0x27,0x01,0x83,0x0a,0x26,0x01,0x04,0x0a,0x25, 0x01,0x09,0x26,0x01,0x09,0x25,0x01,0x0a,0x25,0x01,0x82,0x09,0x24,0x01,0x0b, 0x09,0x23,0x01,0x09,0x23,0x00,0x0a,0x23,0x00,0x09,0x23,0x01,0x09,0x23,0x02, 0x09,0x22,0x01,0x09,0x21,0x01,0x09,0x22,0x01,0x0a,0x21,0x01,0x09,0x21,0x01, 0x08,0x21,0x01,0x82,0x09,0x20,0x01,0x01,0x08,0x20,0x01,0x86,0x08,0x1f,0x01, 0x06,0x07,0x1e,0x00,0x08,0x1e,0x01,0x08,0x1d,0x01,0x07,0x1d,0x01,0x07,0x1c, 0x00,0x08,0x1d,0x01,0x82,0x07,0x1c,0x01,0x84,0x07,0x1b,0x01,0x82,0x07,0x1a, 0x01,0x83,0x07,0x19,0x01,0x01,0x06,0x19,0x01,0x82,0x06,0x18,0x01,0x03,0x06, 0x17,0x01,0x06,0x17,0x00,0x05,0x17,0x00,0x82,0x06,0x17,0x01,0x82,0x06,0x16, 0x01,0x02,0x06,0x15,0x01,0x05,0x15,0x00,0x82,0x05,0x15,0x01,0x83,0x05,0x14, 0x00,0x82,0x05,0x13,0x00,0x01,0x05,0x12,0x00,0x82,0x05,0x12,0x01,0x01,0x04, 0x12,0x00,0x84,0x04,0x11,0x00,0x83,0x04,0x10,0x00,0x82,0x04,0x0f,0x00,0x83, 0x03,0x0e,0x00,0x83,0x03,0x0d,0x00,0x84,0x03,0x0c,0x00,0x04,0x03,0x0b,0x00, 0x02,0x0b,0x00,0x02,0x0a,0x00,0x03,0x0a,0x00,0x83,0x02,0x0a,0x00,0x82,0x02, 0x09,0x00,0x82,0x02,0x08,0x00,0x82,0x01,0x08,0x00,0x01,0x02,0x07,0x00,0x82, 0x01,0x07,0x00,0x84,0x01,0x06,0x00,0x83,0x01,0x05,0x00,0x83,0x01,0x04,0x00, 0x84,0x00,0x03,0x00,0x83,0x00,0x02,0x00,0x84,0x00,0x01,0x00,0xdb,0x00,0x00, 0x00,0x09,0x40,0x9b,0x22,0x3e,0x99,0x20,0x3f,0x9a,0x21,0x3e,0x99,0x20,0x40, 0x9b,0x22,0x3f,0x9a,0x21,0x3d,0x98,0x1f,0x3f,0x9a,0x23,0x3f,0x9a,0x21,0x83, 0x3e,0x99,0x20,0x05,0x3f,0x9a,0x21,0x3e,0x9c,0x22,0x3c,0x9a,0x20,0x3d,0x9b, 0x21,0x3e,0x9c,0x20,0x83,0x3d,0x98,0x1f,0x82,0x3e,0x99,0x20,0x03,0x3d,0x98, 0x1f,0x3e,0x9a,0x1e,0x3d,0x98,0x1f,0x82,0x3c,0x97,0x1e,0x82,0x3d,0x98,0x1f, 0x83,0x3c,0x97,0x1e,0x01,0x3c,0x95,0x1f,0x82,0x3d,0x96,0x1e,0x83,0x3c,0x97, 0x1e,0x82,0x3a,0x95,0x1c,0x06,0x3a,0x95,0x1e,0x3b,0x96,0x1f,0x3a,0x95,0x1c, 0x3b,0x96,0x1d,0x3d,0x98,0x1f,0x3b,0x96,0x1d,0x82,0x3a,0x95,0x1c,0x01,0x3a, 0x93,0x1d,0x82,0x3b,0x94,0x1e,0x09,0x3a,0x93,0x1d,0x3b,0x94,0x1e,0x3a,0x93, 0x1b,0x3b,0x94,0x1c,0x3a,0x95,0x1c,0x39,0x94,0x1d,0x3a,0x95,0x1e,0x3b,0x96, 0x1d,0x3a,0x95,0x1c,0x82,0x38,0x93,0x1c,0x14,0x39,0x92,0x1a,0x38,0x91,0x19, 0x37,0x90,0x1a,0x38,0x91,0x1b,0x3a,0x95,0x1c,0x37,0x92,0x19,0x39,0x94,0x1b, 0x38,0x93,0x1a,0x38,0x91,0x19,0x39,0x92,0x1c,0x39,0x92,0x1a,0x38,0x93,0x1a, 0x35,0x90,0x17,0x36,0x91,0x18,0x37,0x92,0x19,0x36,0x8f,0x17,0x38,0x91,0x19, 0x39,0x92,0x1a,0x39,0x92,0x1c,0x37,0x92,0x19,0x82,0x36,0x91,0x18,0x01,0x37, 0x92,0x19,0x82,0x36,0x91,0x18,0x01,0x37,0x92,0x1b,0x83,0x38,0x93,0x1a,0x0a, 0x36,0x91,0x18,0x35,0x90,0x17,0x36,0x91,0x18,0x37,0x92,0x19,0x36,0x91,0x18, 0x37,0x92,0x19,0x37,0x90,0x18,0x38,0x91,0x19,0x39,0x94,0x1b,0x36,0x91,0x18, 0x82,0x35,0x90,0x17,0x01,0x34,0x8f,0x16,0x83,0x35,0x90,0x19,0x82,0x34,0x8f, 0x16,0x03,0x36,0x91,0x18,0x34,0x8f,0x16,0x35,0x90,0x17,0x82,0x34,0x8f,0x16, 0x04,0x32,0x8b,0x13,0x34,0x8d,0x15,0x35,0x90,0x17,0x33,0x8e,0x15,0x82,0x34, 0x8f,0x16,0x82,0x33,0x8e,0x15,0x02,0x34,0x8f,0x16,0x31,0x8c,0x13,0x82,0x33, 0x8e,0x15,0x0a,0x35,0x91,0x15,0x32,0x90,0x14,0x32,0x8d,0x14,0x35,0x90,0x17, 0x30,0x8e,0x16,0x32,0x90,0x18,0x31,0x8f,0x17,0x32,0x90,0x18,0x32,0x90,0x16, 0x30,0x8e,0x14,0x82,0x31,0x8f,0x15,0x01,0x34,0x8f,0x16,0x82,0x35,0x90,0x17, 0x03,0x34,0x8f,0x16,0x30,0x8e,0x12,0x32,0x90,0x14,0x83,0x31,0x8f,0x15,0x82, 0x32,0x8d,0x14,0x82,0x30,0x8e,0x14,0x09,0x32,0x90,0x16,0x2f,0x8d,0x11,0x30, 0x8e,0x12,0x30,0x8e,0x14,0x31,0x8f,0x15,0x2d,0x8b,0x0f,0x31,0x8f,0x13,0x2f, 0x8e,0x10,0x2e,0x8d,0x0f,0x83,0x2f,0x8f,0x12,0x01,0x31,0x91,0x14,0x82,0x30, 0x90,0x13,0x10,0x2e,0x8c,0x10,0x30,0x8e,0x12,0x30,0x8e,0x14,0x30,0x90,0x13, 0x2f,0x8f,0x11,0x31,0x8f,0x13,0x2f,0x8d,0x11,0x2f,0x8f,0x12,0x2d,0x8d,0x0f, 0x30,0x8e,0x12,0x2e,0x8e,0x11,0x2f,0x8f,0x12,0x2f,0x8f,0x11,0x30,0x90,0x12, 0x2f,0x8f,0x11,0x32,0x92,0x14,0x82,0x2f,0x8f,0x11,0x0b,0x2e,0x91,0x12,0x2d, 0x90,0x11,0x30,0x90,0x12,0x2f,0x8f,0x11,0x2f,0x90,0x0f,0x2f,0x8f,0x11,0x2e, 0x8e,0x10,0x2f,0x92,0x11,0x31,0x91,0x13,0x30,0x93,0x14,0x2c,0x8f,0x0e,0x83, 0x2e,0x91,0x10,0x82,0x2e,0x8f,0x0e,0x06,0x2e,0x91,0x10,0x30,0x94,0x10,0x2f, 0x93,0x0f,0x2e,0x92,0x0e,0x31,0x95,0x11,0x2f,0x93,0x0f,0x82,0x2e,0x92,0x0e, 0x06,0x2e,0x93,0x0f,0x2f,0x94,0x10,0x31,0x95,0x0f,0x2f,0x93,0x0d,0x30,0x94, 0x0e,0x2e,0x94,0x0d,0x83,0x30,0x96,0x0f,0x02,0x31,0x97,0x10,0x30,0x96,0x0f, 0x82,0x31,0x97,0x10,0x02,0x30,0x96,0x0e,0x32,0x98,0x10,0x82,0x32,0x9a,0x0f, 0x02,0x31,0x99,0x0e,0x32,0x9a,0x0f,0x82,0x33,0x9b,0x10,0x02,0x34,0x9d,0x0f, 0x35,0x9e,0x10,0x82,0x34,0xa0,0x0f,0x03,0x35,0xa1,0x10,0x38,0xa4,0x12,0x36, 0xa4,0x11,0x82,0x37,0xa3,0x11,0x82,0x36,0xa2,0x10,0x03,0x37,0xa3,0x11,0x36, 0xa2,0x10,0x37,0xa3,0x11,0x82,0x38,0xa4,0x10,0x0a,0x39,0xa5,0x11,0x39,0xa7, 0x12,0x38,0xa6,0x11,0x3a,0xa7,0x10,0x38,0xa6,0x0f,0x3a,0xa8,0x13,0x3a,0xa8, 0x11,0x3a,0xa7,0x10,0x3b,0xa7,0x13,0x3b,0xa8,0x11,0x82,0x3b,0xa9,0x12,0x05, 0x3c,0xaa,0x13,0x3d,0xab,0x14,0x3c,0xaa,0x13,0x3b,0xa9,0x12,0x3d,0xab,0x14, 0x82,0x3c,0xaa,0x13,0x04,0x3c,0xab,0x11,0x3f,0xac,0x13,0x3e,0xab,0x14,0x3d, 0xaa,0x13,0x82,0x3e,0xab,0x14,0x82,0x3f,0xac,0x13,0x09,0x3e,0xab,0x12,0x3f, 0xac,0x15,0x3f,0xab,0x17,0x3d,0xab,0x14,0x3e,0xab,0x14,0x41,0xab,0x13,0x42, 0xac,0x14,0x42,0xac,0x16,0x40,0xad,0x14,0x82,0x42,0xac,0x16,0x09,0x40,0xad, 0x16,0x3f,0xad,0x16,0x41,0xae,0x15,0x44,0xae,0x18,0x43,0xab,0x16,0x44,0xac, 0x17,0x44,0xae,0x16,0x41,0xae,0x15,0x42,0xaf,0x16,0x83,0x45,0xaf,0x17,0x02, 0x46,0xb0,0x18,0x47,0xb0,0x18,0x82,0x46,0xb0,0x18,0x02,0x45,0xaf,0x17,0x47, 0xb1,0x19,0x82,0x45,0xaf,0x17,0x09,0x46,0xae,0x17,0x45,0xaf,0x15,0x48,0xaf, 0x17,0x44,0xae,0x15,0x44,0xaf,0x17,0x44,0xaf,0x19,0x44,0xac,0x17,0x43,0xaa, 0x16,0x43,0xad,0x18,0x82,0x43,0xab,0x15,0x11,0x44,0xab,0x16,0x43,0xa9,0x17, 0x43,0xa8,0x17,0x43,0xa8,0x16,0x42,0xa8,0x16,0x44,0xaa,0x16,0x42,0xa8,0x14, 0x41,0xa5,0x15,0x42,0xa6,0x16,0x41,0xa3,0x14,0x41,0xa4,0x13,0x44,0xa6,0x16, 0x41,0xa3,0x13,0x40,0xa2,0x14,0x40,0xa0,0x16,0x40,0xa1,0x17,0x3e,0x9f,0x15, 0x82,0x3f,0x9f,0x16,0x05,0x3f,0x9e,0x16,0x3d,0x9c,0x14,0x3e,0x9c,0x16,0x3d, 0x9c,0x14,0x3c,0x9b,0x13,0x82,0x3b,0x99,0x14,0x1b,0x3a,0x96,0x12,0x39,0x94, 0x11,0x39,0x94,0x13,0x37,0x92,0x11,0x37,0x91,0x12,0x37,0x8e,0x10,0x35,0x8a, 0x0e,0x34,0x8b,0x10,0x35,0x8b,0x11,0x35,0x8a,0x10,0x33,0x88,0x0e,0x32,0x87, 0x0d,0x34,0x85,0x11,0x33,0x83,0x10,0x30,0x80,0x0d,0x31,0x81,0x0e,0x31,0x81, 0x10,0x30,0x7f,0x0e,0x2f,0x7f,0x10,0x2e,0x7c,0x10,0x31,0x7e,0x11,0x2b,0x78, 0x0c,0x25,0x71,0x08,0x20,0x6c,0x05,0x21,0x6c,0x07,0x21,0x6b,0x06,0x20,0x6a, 0x06,0x82,0x1f,0x6a,0x04,0x03,0x1f,0x69,0x04,0x1f,0x67,0x04,0x1f,0x66,0x06, 0x83,0x1d,0x64,0x04,0x0c,0x1d,0x63,0x04,0x1b,0x62,0x03,0x1b,0x61,0x04,0x19, 0x5f,0x03,0x1a,0x60,0x04,0x1a,0x60,0x02,0x1a,0x5f,0x03,0x1b,0x5e,0x03,0x1a, 0x5c,0x02,0x18,0x5d,0x02,0x18,0x5c,0x02,0x17,0x5b,0x01,0x82,0x18,0x5c,0x02, 0x0e,0x17,0x5a,0x03,0x19,0x5a,0x02,0x1a,0x5b,0x03,0x18,0x59,0x03,0x19,0x59, 0x03,0x18,0x58,0x01,0x17,0x59,0x02,0x19,0x58,0x02,0x17,0x59,0x02,0x18,0x57, 0x01,0x18,0x58,0x00,0x18,0x59,0x03,0x17,0x58,0x02,0x15,0x57,0x01,0x82,0x16, 0x58,0x00,0x0c,0x17,0x57,0x02,0x16,0x55,0x01,0x18,0x55,0x03,0x16,0x56,0x00, 0x16,0x55,0x00,0x16,0x55,0x02,0x17,0x53,0x01,0x14,0x52,0x00,0x15,0x53,0x02, 0x15,0x53,0x01,0x16,0x52,0x01,0x15,0x53,0x01,0x82,0x17,0x52,0x02,0x0d,0x14, 0x54,0x02,0x15,0x52,0x02,0x16,0x53,0x02,0x14,0x51,0x01,0x15,0x53,0x01,0x14, 0x52,0x02,0x13,0x52,0x00,0x14,0x52,0x01,0x14,0x51,0x00,0x14,0x50,0x02,0x15, 0x4f,0x02,0x14,0x4e,0x01,0x14,0x50,0x01,0x82,0x14,0x4f,0x02,0x04,0x14,0x4f, 0x01,0x13,0x50,0x01,0x14,0x4f,0x02,0x13,0x4e,0x01,0x82,0x13,0x4c,0x01,0x02, 0x14,0x4d,0x02,0x14,0x4e,0x03,0x83,0x13,0x4c,0x00,0x01,0x14,0x4b,0x01,0x82, 0x13,0x4d,0x01,0x01,0x14,0x4c,0x01,0x82,0x13,0x4b,0x01,0x83,0x13,0x4a,0x01, 0x0b,0x13,0x49,0x01,0x13,0x48,0x01,0x12,0x49,0x01,0x14,0x48,0x01,0x12,0x48, 0x01,0x12,0x49,0x01,0x12,0x48,0x01,0x12,0x48,0x00,0x13,0x47,0x01,0x14,0x46, 0x02,0x13,0x47,0x02,0x82,0x12,0x46,0x01,0x82,0x12,0x46,0x00,0x05,0x11,0x45, 0x01,0x12,0x45,0x01,0x12,0x45,0x02,0x12,0x46,0x02,0x11,0x45,0x00,0x82,0x12, 0x45,0x01,0x01,0x10,0x43,0x00,0x82,0x11,0x43,0x01,0x06,0x12,0x42,0x01,0x11, 0x42,0x01,0x10,0x42,0x00,0x11,0x43,0x01,0x11,0x42,0x01,0x11,0x42,0x02,0x82, 0x10,0x42,0x02,0x12,0x11,0x40,0x00,0x11,0x41,0x01,0x10,0x3f,0x00,0x10,0x40, 0x00,0x0f,0x3f,0x00,0x10,0x3f,0x01,0x11,0x40,0x01,0x10,0x3f,0x01,0x10,0x3e, 0x00,0x11,0x3e,0x01,0x10,0x3d,0x01,0x0f,0x3c,0x01,0x0e,0x3d,0x01,0x0f,0x3d, 0x01,0x0e,0x3d,0x00,0x0f,0x3c,0x00,0x0e,0x3d,0x00,0x0e,0x3c,0x00,0x82,0x0f, 0x3b,0x00,0x06,0x0e,0x3a,0x00,0x0e,0x39,0x00,0x0f,0x39,0x00,0x0f,0x3a,0x00, 0x0f,0x39,0x00,0x0f,0x39,0x01,0x83,0x0e,0x38,0x01,0x02,0x0f,0x38,0x01,0x0e, 0x37,0x01,0x82,0x0e,0x37,0x00,0x82,0x0e,0x36,0x01,0x0b,0x0e,0x35,0x01,0x0f, 0x36,0x02,0x0e,0x35,0x01,0x0e,0x35,0x00,0x0e,0x35,0x01,0x0f,0x35,0x01,0x0e, 0x34,0x01,0x0e,0x35,0x00,0x0e,0x34,0x01,0x0d,0x33,0x01,0x0e,0x33,0x01,0x82, 0x0d,0x32,0x00,0x03,0x0d,0x31,0x00,0x0d,0x33,0x01,0x0d,0x32,0x01,0x83,0x0d, 0x31,0x01,0x03,0x0c,0x30,0x01,0x0d,0x30,0x01,0x0c,0x2f,0x00,0x82,0x0d,0x2f, 0x01,0x82,0x0c,0x2f,0x01,0x83,0x0c,0x2e,0x01,0x04,0x0c,0x2d,0x01,0x0b,0x2d, 0x01,0x0b,0x2c,0x01,0x0c,0x2c,0x01,0x82,0x0b,0x2b,0x01,0x82,0x0b,0x2c,0x01, 0x04,0x0b,0x2a,0x01,0x0b,0x29,0x00,0x0c,0x2a,0x01,0x0b,0x2a,0x02,0x82,0x0a, 0x29,0x01,0x04,0x0a,0x28,0x01,0x0a,0x27,0x01,0x0a,0x27,0x00,0x0a,0x27,0x02, 0x84,0x0a,0x27,0x01,0x09,0x09,0x26,0x00,0x0a,0x25,0x00,0x0a,0x25,0x01,0x09, 0x24,0x01,0x09,0x25,0x00,0x09,0x25,0x01,0x0a,0x25,0x01,0x09,0x24,0x01,0x09, 0x23,0x01,0x82,0x0a,0x23,0x01,0x06,0x09,0x23,0x01,0x08,0x22,0x00,0x09,0x22, 0x01,0x09,0x22,0x00,0x09,0x22,0x01,0x08,0x21,0x00,0x82,0x09,0x21,0x00,0x05, 0x09,0x21,0x01,0x08,0x20,0x01,0x09,0x20,0x01,0x08,0x20,0x01,0x09,0x20,0x01, 0x83,0x08,0x1f,0x01,0x04,0x08,0x1f,0x02,0x08,0x1d,0x00,0x07,0x1e,0x00,0x08, 0x1d,0x00,0x82,0x08,0x1d,0x01,0x82,0x07,0x1c,0x01,0x82,0x07,0x1b,0x00,0x83, 0x07,0x1b,0x01,0x82,0x07,0x1a,0x01,0x82,0x07,0x19,0x00,0x03,0x06,0x19,0x01, 0x06,0x19,0x00,0x07,0x19,0x01,0x82,0x07,0x18,0x01,0x84,0x06,0x17,0x00,0x82, 0x06,0x16,0x00,0x04,0x06,0x15,0x00,0x05,0x15,0x00,0x06,0x15,0x00,0x06,0x14, 0x00,0x83,0x05,0x14,0x00,0x04,0x05,0x13,0x00,0x05,0x13,0x01,0x05,0x13,0x00, 0x04,0x13,0x00,0x82,0x04,0x12,0x00,0x84,0x04,0x11,0x00,0x82,0x04,0x10,0x00, 0x83,0x04,0x0f,0x00,0x01,0x04,0x0f,0x01,0x83,0x03,0x0e,0x00,0x83,0x03,0x0d, 0x00,0x84,0x03,0x0c,0x00,0x82,0x03,0x0b,0x00,0x83,0x02,0x0a,0x00,0x84,0x02, 0x09,0x00,0x83,0x02,0x08,0x00,0x82,0x02,0x07,0x00,0x01,0x01,0x07,0x00,0x84, 0x01,0x06,0x00,0x83,0x01,0x05,0x00,0x83,0x01,0x04,0x00,0x84,0x00,0x03,0x00, 0x83,0x00,0x02,0x00,0x84,0x00,0x01,0x00,0xdb,0x00,0x00,0x00,0x06,0x40,0x9b, 0x22,0x3f,0x9a,0x21,0x3d,0x98,0x1f,0x41,0x9c,0x23,0x42,0x9d,0x24,0x3e,0x99, 0x20,0x82,0x3f,0x9a,0x21,0x82,0x3e,0x9a,0x1e,0x82,0x3f,0x9b,0x1f,0x02,0x40, 0x9c,0x20,0x41,0x9d,0x21,0x82,0x40,0x9c,0x20,0x08,0x3e,0x9a,0x1e,0x3d,0x98, 0x1f,0x3e,0x99,0x20,0x3e,0x9a,0x1e,0x40,0x9c,0x20,0x40,0x9b,0x22,0x3f,0x9a, 0x21,0x3e,0x9a,0x1e,0x82,0x3d,0x98,0x1f,0x01,0x3e,0x99,0x20,0x84,0x3f,0x9a, 0x21,0x03,0x3e,0x99,0x20,0x3c,0x95,0x1d,0x3d,0x96,0x1e,0x82,0x3e,0x99,0x20, 0x85,0x3c,0x97,0x1e,0x82,0x3b,0x96,0x1d,0x82,0x3c,0x97,0x1e,0x07,0x3b,0x96, 0x1d,0x3a,0x95,0x1c,0x3b,0x96,0x1d,0x3c,0x97,0x20,0x3a,0x95,0x1c,0x3d,0x96, 0x1e,0x3b,0x94,0x1c,0x82,0x3c,0x95,0x1d,0x0c,0x3a,0x95,0x1c,0x39,0x94,0x1b, 0x3c,0x95,0x1f,0x3b,0x96,0x1d,0x3c,0x97,0x1e,0x3a,0x95,0x1c,0x38,0x93,0x1a, 0x3b,0x94,0x1e,0x3b,0x94,0x1c,0x39,0x92,0x1a,0x3a,0x93,0x1d,0x3a,0x93,0x1b, 0x82,0x3a,0x95,0x1c,0x0f,0x39,0x94,0x1b,0x38,0x93,0x1a,0x38,0x91,0x19,0x39, 0x92,0x1c,0x38,0x93,0x1a,0x37,0x92,0x19,0x38,0x93,0x1a,0x39,0x94,0x1b,0x38, 0x93,0x1a,0x38,0x91,0x19,0x3a,0x93,0x1b,0x37,0x92,0x19,0x36,0x91,0x18,0x38, 0x93,0x1a,0x37,0x92,0x19,0x82,0x38,0x93,0x1a,0x03,0x39,0x92,0x1a,0x38,0x91, 0x19,0x36,0x91,0x1a,0x84,0x37,0x92,0x19,0x02,0x38,0x93,0x1a,0x37,0x92,0x19, 0x82,0x36,0x91,0x18,0x82,0x37,0x92,0x19,0x02,0x36,0x8f,0x17,0x35,0x90,0x17, 0x83,0x36,0x91,0x18,0x02,0x37,0x92,0x19,0x36,0x91,0x18,0x82,0x34,0x8f,0x16, 0x83,0x35,0x90,0x17,0x82,0x36,0x91,0x18,0x0a,0x35,0x90,0x17,0x34,0x8f,0x16, 0x35,0x90,0x17,0x33,0x8e,0x15,0x34,0x8f,0x16,0x35,0x90,0x17,0x37,0x92,0x19, 0x35,0x90,0x17,0x36,0x91,0x18,0x34,0x8f,0x16,0x82,0x33,0x8e,0x15,0x0d,0x37, 0x92,0x19,0x34,0x8f,0x16,0x35,0x90,0x17,0x31,0x8f,0x15,0x34,0x8f,0x16,0x32, 0x8d,0x14,0x32,0x90,0x16,0x33,0x91,0x17,0x31,0x8f,0x15,0x33,0x8e,0x15,0x31, 0x8c,0x13,0x32,0x90,0x16,0x33,0x91,0x17,0x83,0x31,0x8f,0x15,0x18,0x2e,0x8c, 0x12,0x2f,0x8d,0x13,0x31,0x8f,0x15,0x2f,0x8d,0x11,0x31,0x8f,0x15,0x33,0x91, 0x17,0x30,0x8e,0x14,0x34,0x8f,0x16,0x31,0x8c,0x13,0x31,0x8f,0x15,0x31,0x8f, 0x13,0x34,0x92,0x16,0x30,0x8e,0x12,0x31,0x8f,0x13,0x31,0x8f,0x15,0x30,0x8e, 0x14,0x2e,0x8c,0x10,0x30,0x8e,0x12,0x32,0x90,0x14,0x2f,0x8e,0x10,0x30,0x8e, 0x12,0x32,0x90,0x14,0x30,0x8e,0x12,0x2f,0x8f,0x12,0x82,0x30,0x90,0x13,0x82, 0x2e,0x8e,0x11,0x03,0x2f,0x8d,0x11,0x30,0x90,0x13,0x2f,0x8f,0x11,0x82,0x30, 0x8f,0x11,0x08,0x31,0x91,0x14,0x2e,0x8e,0x11,0x2f,0x8d,0x11,0x2e,0x8e,0x11, 0x2f,0x8f,0x12,0x2e,0x8e,0x10,0x2f,0x8f,0x11,0x30,0x90,0x12,0x82,0x2e,0x8e, 0x10,0x01,0x30,0x90,0x12,0x82,0x2f,0x90,0x0f,0x03,0x31,0x91,0x14,0x2f,0x8f, 0x12,0x2f,0x8f,0x11,0x82,0x31,0x91,0x13,0x07,0x31,0x92,0x0f,0x2d,0x8d,0x0f, 0x30,0x91,0x10,0x2d,0x90,0x0f,0x2e,0x91,0x10,0x2f,0x92,0x13,0x2f,0x92,0x11, 0x82,0x30,0x91,0x10,0x82,0x2e,0x91,0x10,0x01,0x2e,0x92,0x0e,0x82,0x2f,0x92, 0x11,0x01,0x2e,0x92,0x0e,0x82,0x2f,0x93,0x0f,0x09,0x2f,0x94,0x10,0x2f,0x93, 0x0f,0x30,0x94,0x10,0x30,0x94,0x0e,0x30,0x94,0x10,0x2d,0x92,0x0e,0x2f,0x94, 0x10,0x30,0x96,0x0f,0x31,0x97,0x10,0x83,0x30,0x96,0x0f,0x0e,0x31,0x97,0x10, 0x30,0x96,0x0f,0x30,0x96,0x0e,0x31,0x99,0x0e,0x31,0x99,0x10,0x32,0x9a,0x11, 0x33,0x9b,0x10,0x31,0x9c,0x0e,0x30,0x9b,0x0d,0x33,0x9c,0x0e,0x35,0x9e,0x10, 0x32,0x9d,0x0f,0x35,0x9e,0x10,0x33,0x9f,0x0e,0x82,0x35,0xa1,0x10,0x01,0x36, 0xa2,0x11,0x83,0x36,0xa2,0x10,0x02,0x37,0xa3,0x11,0x36,0xa2,0x10,0x84,0x37, 0xa3,0x0f,0x0c,0x38,0xa4,0x10,0x39,0xa5,0x11,0x3a,0xa8,0x11,0x37,0xa3,0x0f, 0x39,0xa5,0x11,0x3a,0xa6,0x12,0x37,0xa5,0x10,0x38,0xa6,0x11,0x3a,0xa8,0x13, 0x3d,0xaa,0x13,0x3b,0xa9,0x12,0x3a,0xa8,0x11,0x82,0x3b,0xa9,0x12,0x02,0x3a, 0xa8,0x11,0x3c,0xaa,0x13,0x82,0x3b,0xa9,0x12,0x01,0x3a,0xa8,0x11,0x82,0x3c, 0xa9,0x12,0x16,0x3d,0xaa,0x13,0x3f,0xac,0x15,0x3e,0xab,0x14,0x3d,0xaa,0x11, 0x3c,0xa9,0x10,0x3c,0xab,0x11,0x3d,0xaa,0x13,0x3e,0xab,0x14,0x3d,0xab,0x14, 0x3e,0xac,0x15,0x3e,0xab,0x12,0x3f,0xa9,0x11,0x3d,0xaa,0x13,0x40,0xad,0x14, 0x3f,0xac,0x15,0x41,0xab,0x15,0x41,0xae,0x17,0x3f,0xae,0x14,0x40,0xad,0x14, 0x43,0xad,0x17,0x42,0xac,0x16,0x42,0xac,0x14,0x82,0x42,0xaf,0x16,0x08,0x40, 0xad,0x14,0x42,0xac,0x14,0x45,0xaf,0x17,0x46,0xb0,0x18,0x45,0xaf,0x17,0x44, 0xae,0x16,0x42,0xaf,0x16,0x43,0xb0,0x17,0x83,0x45,0xaf,0x17,0x0a,0x44,0xae, 0x16,0x46,0xae,0x17,0x45,0xad,0x14,0x45,0xae,0x15,0x45,0xaf,0x16,0x46,0xaf, 0x17,0x41,0xac,0x16,0x42,0xad,0x17,0x44,0xab,0x17,0x44,0xac,0x15,0x82,0x43, 0xab,0x15,0x10,0x44,0xab,0x16,0x43,0xaa,0x15,0x44,0xaa,0x16,0x43,0xaa,0x16, 0x42,0xa9,0x15,0x41,0xa7,0x14,0x44,0xaa,0x16,0x43,0xa7,0x17,0x42,0xa6,0x16, 0x41,0xa5,0x13,0x40,0xa5,0x13,0x41,0xa5,0x14,0x42,0xa4,0x14,0x42,0xa4,0x16, 0x41,0xa2,0x15,0x40,0xa2,0x15,0x82,0x40,0xa1,0x15,0x09,0x3e,0x9f,0x13,0x3f, 0x9f,0x14,0x3f,0x9e,0x15,0x3e,0x9c,0x14,0x3d,0x9c,0x14,0x3c,0x9b,0x13,0x3b, 0x99,0x13,0x3c,0x98,0x14,0x3b,0x97,0x13,0x82,0x3a,0x95,0x12,0x15,0x39,0x94, 0x13,0x38,0x92,0x12,0x39,0x91,0x12,0x37,0x8f,0x11,0x35,0x8d,0x0f,0x34,0x8b, 0x10,0x35,0x8b,0x11,0x35,0x8a,0x10,0x33,0x88,0x0e,0x32,0x85,0x0f,0x33,0x86, 0x10,0x33,0x86,0x12,0x32,0x82,0x0f,0x31,0x81,0x0f,0x30,0x80,0x0f,0x2f,0x7d, 0x0d,0x30,0x7e,0x10,0x2f,0x7c,0x0f,0x32,0x7f,0x11,0x30,0x7d,0x10,0x25,0x72, 0x07,0x82,0x22,0x6c,0x05,0x0a,0x21,0x6a,0x05,0x22,0x6d,0x06,0x20,0x6b,0x04, 0x20,0x69,0x05,0x20,0x68,0x05,0x1e,0x66,0x04,0x1f,0x67,0x03,0x1e,0x66,0x02, 0x1e,0x65,0x05,0x1e,0x64,0x07,0x82,0x1c,0x62,0x04,0x06,0x1b,0x61,0x04,0x1b, 0x61,0x03,0x1b,0x60,0x03,0x1a,0x5f,0x03,0x1b,0x5d,0x03,0x1a,0x5d,0x03,0x82, 0x19,0x5e,0x03,0x02,0x19,0x5d,0x03,0x18,0x5c,0x02,0x82,0x18,0x5c,0x03,0x13, 0x19,0x5a,0x02,0x1a,0x5b,0x01,0x17,0x5a,0x02,0x18,0x59,0x01,0x18,0x5b,0x03, 0x19,0x59,0x03,0x17,0x59,0x02,0x18,0x58,0x02,0x16,0x58,0x00,0x18,0x59,0x01, 0x18,0x57,0x02,0x16,0x57,0x01,0x17,0x57,0x02,0x17,0x58,0x01,0x16,0x58,0x01, 0x16,0x58,0x02,0x16,0x55,0x01,0x15,0x55,0x01,0x16,0x56,0x02,0x82,0x16,0x55, 0x00,0x0f,0x17,0x54,0x02,0x16,0x54,0x02,0x16,0x55,0x02,0x16,0x54,0x02,0x17, 0x53,0x02,0x16,0x55,0x02,0x15,0x53,0x02,0x15,0x52,0x01,0x16,0x51,0x01,0x15, 0x53,0x02,0x17,0x53,0x03,0x16,0x52,0x02,0x14,0x53,0x00,0x14,0x52,0x02,0x15, 0x51,0x00,0x82,0x14,0x52,0x01,0x04,0x15,0x50,0x02,0x15,0x4f,0x02,0x14,0x50, 0x02,0x15,0x50,0x01,0x82,0x14,0x50,0x02,0x02,0x14,0x4f,0x01,0x13,0x4e,0x00, 0x82,0x13,0x4e,0x01,0x1c,0x13,0x4d,0x01,0x14,0x4e,0x02,0x14,0x4e,0x03,0x12, 0x4d,0x01,0x13,0x4c,0x00,0x15,0x4e,0x02,0x14,0x4d,0x01,0x13,0x4b,0x00,0x13, 0x4a,0x00,0x15,0x4b,0x01,0x13,0x4a,0x00,0x13,0x4b,0x01,0x13,0x4b,0x02,0x13, 0x4a,0x02,0x12,0x49,0x01,0x13,0x4a,0x02,0x13,0x48,0x01,0x12,0x48,0x01,0x12, 0x4a,0x01,0x13,0x49,0x01,0x12,0x48,0x01,0x13,0x48,0x01,0x13,0x49,0x01,0x13, 0x48,0x01,0x12,0x48,0x00,0x11,0x46,0x00,0x12,0x46,0x01,0x13,0x46,0x01,0x82, 0x12,0x46,0x01,0x82,0x12,0x47,0x02,0x03,0x11,0x46,0x01,0x12,0x46,0x02,0x11, 0x45,0x01,0x82,0x12,0x44,0x01,0x03,0x12,0x44,0x00,0x11,0x43,0x00,0x12,0x44, 0x02,0x83,0x11,0x42,0x01,0x0c,0x12,0x42,0x01,0x11,0x41,0x00,0x11,0x43,0x01, 0x10,0x43,0x02,0x10,0x41,0x01,0x11,0x40,0x01,0x11,0x41,0x01,0x10,0x40,0x00, 0x11,0x41,0x01,0x0f,0x41,0x01,0x10,0x40,0x01,0x11,0x40,0x01,0x82,0x10,0x3e, 0x00,0x08,0x10,0x3f,0x01,0x10,0x3d,0x00,0x10,0x3d,0x01,0x10,0x3e,0x01,0x0f, 0x3d,0x00,0x0e,0x3d,0x00,0x0f,0x3d,0x00,0x0e,0x3d,0x00,0x82,0x0f,0x3c,0x00, 0x82,0x0f,0x3b,0x00,0x0a,0x0f,0x3b,0x01,0x0f,0x3b,0x00,0x0f,0x3a,0x00,0x0f, 0x3a,0x01,0x0e,0x39,0x00,0x0f,0x38,0x01,0x0e,0x38,0x00,0x0d,0x37,0x00,0x0e, 0x38,0x01,0x0f,0x38,0x01,0x82,0x0e,0x37,0x00,0x06,0x0e,0x36,0x00,0x0d,0x37, 0x01,0x0e,0x36,0x01,0x0e,0x35,0x01,0x0d,0x35,0x01,0x0d,0x35,0x00,0x82,0x0e, 0x35,0x00,0x08,0x0e,0x34,0x00,0x0d,0x34,0x01,0x0d,0x34,0x00,0x0d,0x34,0x01, 0x0d,0x33,0x01,0x0d,0x34,0x01,0x0d,0x32,0x00,0x0e,0x33,0x01,0x82,0x0d,0x32, 0x00,0x01,0x0e,0x32,0x01,0x83,0x0d,0x31,0x01,0x82,0x0d,0x30,0x01,0x86,0x0c, 0x2f,0x01,0x82,0x0c,0x2e,0x01,0x05,0x0c,0x2d,0x00,0x0c,0x2d,0x01,0x0b,0x2c, 0x01,0x0c,0x2d,0x01,0x0b,0x2c,0x01,0x83,0x0b,0x2b,0x01,0x01,0x0a,0x2b,0x01, 0x82,0x0b,0x2a,0x01,0x03,0x0b,0x2a,0x00,0x0b,0x2a,0x01,0x0b,0x29,0x01,0x82, 0x0a,0x28,0x01,0x03,0x0a,0x27,0x02,0x0b,0x26,0x01,0x0b,0x27,0x00,0x84,0x0a, 0x27,0x01,0x02,0x0a,0x26,0x01,0x0a,0x25,0x00,0x83,0x0a,0x25,0x01,0x04,0x09, 0x25,0x01,0x0a,0x25,0x01,0x0a,0x24,0x02,0x0a,0x23,0x01,0x85,0x09,0x23,0x01, 0x01,0x09,0x22,0x01,0x83,0x09,0x21,0x01,0x82,0x08,0x20,0x01,0x02,0x09,0x20, 0x01,0x08,0x20,0x01,0x84,0x08,0x1f,0x01,0x03,0x08,0x1e,0x01,0x08,0x1d,0x01, 0x08,0x1e,0x01,0x83,0x08,0x1d,0x01,0x82,0x07,0x1c,0x00,0x01,0x08,0x1c,0x01, 0x82,0x07,0x1b,0x01,0x02,0x07,0x1b,0x00,0x07,0x1b,0x01,0x82,0x07,0x1a,0x00, 0x07,0x07,0x1a,0x01,0x06,0x1a,0x01,0x07,0x19,0x01,0x06,0x19,0x00,0x06,0x19, 0x01,0x06,0x18,0x01,0x06,0x17,0x01,0x84,0x06,0x17,0x00,0x83,0x06,0x16,0x00, 0x01,0x06,0x15,0x00,0x82,0x05,0x15,0x00,0x83,0x05,0x14,0x00,0x82,0x05,0x13, 0x00,0x04,0x05,0x13,0x01,0x05,0x12,0x00,0x05,0x12,0x01,0x04,0x12,0x00,0x84, 0x04,0x11,0x00,0x82,0x04,0x10,0x00,0x82,0x04,0x0f,0x00,0x03,0x03,0x0f,0x00, 0x04,0x0f,0x00,0x04,0x0e,0x00,0x82,0x03,0x0e,0x00,0x83,0x03,0x0d,0x00,0x84, 0x03,0x0c,0x00,0x83,0x03,0x0b,0x00,0x82,0x02,0x0a,0x00,0x84,0x02,0x09,0x00, 0x83,0x02,0x08,0x00,0x01,0x02,0x07,0x00,0x82,0x01,0x07,0x00,0x84,0x01,0x06, 0x00,0x83,0x01,0x05,0x00,0x83,0x01,0x04,0x00,0x01,0x00,0x04,0x00,0x83,0x00, 0x03,0x00,0x84,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xdb,0x00,0x00,0x00,0x02, 0x43,0x9f,0x23,0x41,0x9d,0x21,0x82,0x3f,0x9b,0x1f,0x03,0x40,0x9e,0x22,0x3f, 0x9d,0x21,0x40,0x9c,0x20,0x82,0x41,0x9d,0x21,0x82,0x40,0x9c,0x20,0x01,0x41, 0x9d,0x21,0x82,0x40,0x9c,0x20,0x82,0x41,0x9d,0x21,0x01,0x3f,0x9b,0x1f,0x82, 0x3f,0x9a,0x21,0x83,0x3f,0x9b,0x1f,0x01,0x40,0x9c,0x20,0x82,0x3e,0x9a,0x1e, 0x01,0x3f,0x9a,0x21,0x82,0x40,0x9b,0x22,0x09,0x3e,0x99,0x20,0x3f,0x9a,0x21, 0x3e,0x99,0x20,0x3d,0x96,0x1e,0x3e,0x99,0x20,0x3d,0x98,0x1f,0x3c,0x98,0x1c, 0x3d,0x98,0x1f,0x3e,0x99,0x20,0x86,0x3d,0x98,0x1f,0x01,0x3c,0x97,0x1e,0x82, 0x3b,0x96,0x1d,0x02,0x3c,0x97,0x1e,0x3e,0x99,0x20,0x83,0x3b,0x96,0x1d,0x01, 0x3b,0x94,0x1c,0x82,0x3c,0x95,0x1d,0x83,0x3b,0x96,0x1d,0x84,0x3a,0x95,0x1c, 0x01,0x3b,0x94,0x1c,0x82,0x3a,0x93,0x1b,0x08,0x39,0x92,0x1a,0x3a,0x95,0x1c, 0x3a,0x96,0x1a,0x3b,0x96,0x1d,0x39,0x94,0x1b,0x38,0x94,0x18,0x3a,0x93,0x1b, 0x3c,0x95,0x1d,0x83,0x39,0x94,0x1b,0x84,0x38,0x93,0x1a,0x05,0x39,0x94,0x1b, 0x38,0x93,0x1a,0x39,0x94,0x1b,0x38,0x93,0x1a,0x3a,0x95,0x1c,0x83,0x38,0x91, 0x19,0x03,0x39,0x94,0x1b,0x39,0x95,0x19,0x38,0x93,0x1a,0x82,0x36,0x91,0x18, 0x82,0x39,0x94,0x1b,0x02,0x38,0x93,0x1a,0x38,0x94,0x18,0x82,0x38,0x93,0x1a, 0x82,0x36,0x91,0x18,0x06,0x37,0x92,0x19,0x38,0x93,0x1a,0x36,0x91,0x18,0x37, 0x92,0x19,0x35,0x93,0x19,0x33,0x91,0x17,0x83,0x36,0x91,0x18,0x01,0x34,0x8f, 0x16,0x82,0x35,0x90,0x17,0x14,0x37,0x92,0x19,0x34,0x8f,0x16,0x36,0x91,0x18, 0x35,0x90,0x17,0x34,0x8f,0x16,0x35,0x90,0x17,0x34,0x92,0x18,0x33,0x91,0x17, 0x33,0x8e,0x15,0x34,0x8f,0x16,0x35,0x90,0x17,0x34,0x8f,0x16,0x36,0x91,0x18, 0x35,0x90,0x17,0x36,0x91,0x18,0x35,0x93,0x19,0x35,0x91,0x15,0x36,0x92,0x16, 0x37,0x92,0x19,0x31,0x8f,0x15,0x82,0x32,0x8d,0x14,0x02,0x33,0x8f,0x13,0x34, 0x90,0x14,0x82,0x34,0x92,0x18,0x03,0x32,0x90,0x14,0x34,0x92,0x18,0x32,0x90, 0x16,0x82,0x2f,0x8d,0x13,0x05,0x31,0x8f,0x15,0x32,0x90,0x14,0x33,0x91,0x15, 0x30,0x8e,0x14,0x32,0x90,0x16,0x82,0x31,0x8f,0x13,0x82,0x34,0x92,0x16,0x06, 0x32,0x90,0x14,0x30,0x8e,0x12,0x31,0x8f,0x13,0x30,0x8e,0x14,0x31,0x8f,0x13, 0x2f,0x8d,0x11,0x82,0x32,0x90,0x14,0x02,0x30,0x8e,0x12,0x31,0x8f,0x13,0x82, 0x30,0x8e,0x12,0x0c,0x30,0x90,0x13,0x31,0x91,0x14,0x32,0x92,0x15,0x31,0x91, 0x14,0x32,0x91,0x13,0x31,0x91,0x14,0x32,0x92,0x14,0x32,0x91,0x11,0x30,0x8f, 0x11,0x2f,0x8f,0x12,0x2e,0x8e,0x13,0x32,0x91,0x13,0x82,0x30,0x90,0x12,0x83, 0x2f,0x8f,0x11,0x01,0x2e,0x8e,0x10,0x82,0x30,0x90,0x12,0x04,0x2f,0x90,0x0f, 0x2e,0x8f,0x0e,0x30,0x90,0x13,0x2f,0x8f,0x12,0x83,0x2f,0x8f,0x11,0x02,0x31, 0x92,0x0f,0x2f,0x8f,0x11,0x82,0x2f,0x90,0x0f,0x07,0x2e,0x8f,0x0e,0x2f,0x8f, 0x11,0x2f,0x92,0x11,0x31,0x92,0x11,0x31,0x92,0x0f,0x2d,0x90,0x0f,0x2f,0x92, 0x11,0x82,0x2e,0x91,0x10,0x01,0x2d,0x90,0x0f,0x82,0x2f,0x93,0x0f,0x02,0x2f, 0x92,0x11,0x30,0x93,0x12,0x84,0x2f,0x93,0x0f,0x82,0x2f,0x94,0x10,0x03,0x2e, 0x93,0x0f,0x30,0x96,0x0f,0x2e,0x94,0x0d,0x83,0x2f,0x95,0x0e,0x06,0x30,0x96, 0x0f,0x30,0x96,0x0e,0x32,0x9a,0x11,0x31,0x99,0x10,0x31,0x99,0x0e,0x30,0x98, 0x0d,0x82,0x30,0x9b,0x0f,0x06,0x32,0x9b,0x0d,0x34,0x9d,0x0f,0x31,0x9c,0x0e, 0x35,0x9e,0x10,0x34,0x9d,0x0f,0x33,0x9e,0x10,0x82,0x33,0x9f,0x0e,0x82,0x34, 0xa0,0x0f,0x06,0x35,0xa1,0x0f,0x36,0xa2,0x0e,0x37,0xa3,0x0f,0x37,0xa3,0x11, 0x36,0xa2,0x10,0x35,0xa1,0x0f,0x83,0x36,0xa2,0x10,0x02,0x37,0xa5,0x10,0x37, 0xa3,0x11,0x82,0x39,0xa5,0x11,0x83,0x38,0xa6,0x11,0x03,0x3a,0xa7,0x10,0x3b, 0xa9,0x14,0x3a,0xa8,0x13,0x82,0x3c,0xa9,0x12,0x17,0x3b,0xa8,0x11,0x3c,0xa9, 0x12,0x3b,0xa9,0x12,0x3b,0xaa,0x10,0x3a,0xa8,0x13,0x3e,0xaa,0x16,0x3d,0xa9, 0x15,0x3b,0xa7,0x13,0x3b,0xa8,0x11,0x3c,0xa9,0x12,0x3d,0xac,0x12,0x3e,0xab, 0x12,0x3c,0xab,0x11,0x3d,0xaa,0x13,0x3e,0xab,0x14,0x3d,0xab,0x14,0x3f,0xae, 0x14,0x3f,0xac,0x13,0x3e,0xab,0x12,0x3f,0xac,0x13,0x3e,0xad,0x13,0x3d,0xaa, 0x13,0x3e,0xab,0x14,0x82,0x3f,0xae,0x14,0x05,0x40,0xad,0x14,0x41,0xae,0x15, 0x43,0xad,0x17,0x41,0xab,0x13,0x41,0xae,0x15,0x82,0x42,0xaf,0x16,0x18,0x41, 0xae,0x15,0x42,0xaf,0x16,0x43,0xb0,0x15,0x46,0xb1,0x16,0x41,0xae,0x13,0x41, 0xae,0x15,0x42,0xaf,0x16,0x43,0xb0,0x17,0x44,0xae,0x16,0x45,0xaf,0x17,0x44, 0xae,0x16,0x45,0xad,0x16,0x45,0xad,0x14,0x43,0xae,0x15,0x42,0xae,0x15,0x44, 0xad,0x15,0x42,0xab,0x13,0x42,0xad,0x15,0x42,0xac,0x15,0x44,0xac,0x15,0x43, 0xab,0x15,0x44,0xac,0x16,0x44,0xab,0x16,0x43,0xaa,0x15,0x85,0x43,0xa9,0x15, 0x17,0x44,0xa9,0x16,0x42,0xa7,0x14,0x41,0xa5,0x13,0x42,0xa7,0x15,0x40,0xa5, 0x13,0x3f,0xa3,0x12,0x44,0xa5,0x18,0x42,0xa4,0x17,0x41,0xa3,0x16,0x41,0xa2, 0x16,0x40,0xa1,0x15,0x3f,0xa0,0x14,0x41,0xa1,0x16,0x40,0xa0,0x15,0x3e,0x9d, 0x13,0x3d,0x9d,0x13,0x3e,0x9c,0x15,0x3e,0x9a,0x14,0x3d,0x99,0x13,0x3e,0x99, 0x14,0x3d,0x98,0x13,0x3b,0x96,0x13,0x3a,0x95,0x13,0x82,0x39,0x94,0x12,0x21, 0x39,0x91,0x12,0x36,0x90,0x11,0x34,0x8d,0x10,0x36,0x8d,0x10,0x35,0x8c,0x0f, 0x34,0x8a,0x0e,0x32,0x87,0x0e,0x33,0x87,0x0e,0x33,0x86,0x10,0x30,0x83,0x0d, 0x31,0x82,0x0d,0x31,0x81,0x0f,0x30,0x7f,0x0d,0x2f,0x7d,0x0d,0x30,0x7d,0x10, 0x30,0x7d,0x0e,0x32,0x7f,0x10,0x30,0x7d,0x10,0x2a,0x76,0x0b,0x24,0x6e,0x07, 0x21,0x6a,0x05,0x21,0x6c,0x05,0x21,0x6a,0x04,0x20,0x69,0x05,0x21,0x68,0x08, 0x20,0x67,0x07,0x1f,0x68,0x05,0x1f,0x67,0x03,0x1f,0x67,0x05,0x1d,0x63,0x04, 0x1d,0x65,0x04,0x1d,0x63,0x04,0x1c,0x62,0x04,0x82,0x1c,0x61,0x04,0x03,0x1b, 0x60,0x03,0x1a,0x5f,0x03,0x1b,0x5f,0x02,0x82,0x19,0x5e,0x03,0x10,0x1a,0x5e, 0x04,0x19,0x5d,0x02,0x18,0x5c,0x01,0x18,0x5c,0x03,0x19,0x5a,0x02,0x19,0x5b, 0x00,0x18,0x5b,0x03,0x17,0x59,0x01,0x16,0x5b,0x02,0x18,0x5a,0x03,0x16,0x5a, 0x02,0x17,0x59,0x02,0x16,0x58,0x00,0x18,0x59,0x01,0x18,0x57,0x02,0x17,0x56, 0x01,0x82,0x17,0x58,0x02,0x82,0x16,0x57,0x02,0x82,0x16,0x56,0x00,0x01,0x17, 0x54,0x01,0x82,0x16,0x55,0x00,0x0f,0x17,0x54,0x00,0x16,0x54,0x02,0x17,0x56, 0x03,0x16,0x54,0x02,0x16,0x51,0x00,0x18,0x53,0x02,0x16,0x54,0x02,0x16,0x53, 0x02,0x17,0x52,0x02,0x14,0x52,0x01,0x16,0x53,0x02,0x16,0x52,0x02,0x16,0x52, 0x01,0x15,0x52,0x02,0x15,0x52,0x01,0x82,0x15,0x51,0x01,0x82,0x15,0x50,0x02, 0x82,0x15,0x50,0x01,0x0a,0x14,0x4f,0x02,0x14,0x50,0x02,0x13,0x4f,0x00,0x13, 0x4d,0x00,0x14,0x4d,0x00,0x13,0x4e,0x01,0x13,0x4d,0x01,0x14,0x4e,0x01,0x12, 0x4e,0x01,0x12,0x4d,0x01,0x82,0x14,0x4c,0x01,0x01,0x13,0x4c,0x00,0x82,0x14, 0x4b,0x01,0x06,0x15,0x4b,0x01,0x13,0x4a,0x01,0x14,0x4a,0x02,0x13,0x4b,0x02, 0x12,0x4a,0x01,0x12,0x49,0x01,0x82,0x13,0x4a,0x03,0x0e,0x13,0x48,0x02,0x12, 0x49,0x01,0x14,0x49,0x00,0x13,0x49,0x02,0x13,0x4a,0x02,0x13,0x48,0x00,0x12, 0x48,0x00,0x12,0x47,0x00,0x12,0x46,0x01,0x11,0x47,0x01,0x12,0x48,0x02,0x12, 0x47,0x02,0x12,0x47,0x01,0x11,0x46,0x01,0x82,0x12,0x45,0x01,0x13,0x12,0x44, 0x01,0x11,0x44,0x01,0x12,0x44,0x01,0x13,0x45,0x01,0x12,0x44,0x01,0x11,0x44, 0x00,0x11,0x44,0x02,0x11,0x44,0x01,0x11,0x43,0x00,0x11,0x42,0x01,0x12,0x41, 0x01,0x11,0x41,0x00,0x11,0x42,0x01,0x11,0x42,0x02,0x10,0x41,0x01,0x11,0x41, 0x02,0x10,0x40,0x00,0x10,0x41,0x01,0x11,0x41,0x01,0x82,0x10,0x3f,0x00,0x05, 0x10,0x41,0x02,0x0f,0x40,0x01,0x10,0x3e,0x01,0x10,0x3f,0x01,0x0f,0x3e,0x00, 0x83,0x10,0x3e,0x01,0x04,0x0f,0x3e,0x01,0x0f,0x3d,0x00,0x0f,0x3c,0x00,0x10, 0x3d,0x01,0x82,0x10,0x3c,0x01,0x06,0x0f,0x3b,0x00,0x0f,0x3b,0x01,0x0e,0x3c, 0x01,0x0f,0x3a,0x00,0x10,0x3a,0x01,0x0f,0x3a,0x00,0x82,0x0f,0x38,0x01,0x82, 0x0e,0x38,0x01,0x82,0x0e,0x37,0x00,0x82,0x0f,0x37,0x00,0x06,0x0e,0x37,0x01, 0x0e,0x36,0x01,0x0e,0x35,0x01,0x0e,0x35,0x00,0x0e,0x36,0x00,0x0e,0x36,0x01, 0x82,0x0d,0x35,0x00,0x0e,0x0d,0x34,0x01,0x0e,0x35,0x01,0x0d,0x34,0x01,0x0d, 0x34,0x02,0x0d,0x33,0x00,0x0d,0x33,0x01,0x0e,0x33,0x01,0x0e,0x33,0x00,0x0d, 0x32,0x00,0x0d,0x31,0x00,0x0d,0x31,0x01,0x0d,0x31,0x00,0x0c,0x30,0x01,0x0d, 0x30,0x01,0x83,0x0c,0x2f,0x01,0x02,0x0c,0x30,0x01,0x0c,0x2f,0x01,0x84,0x0c, 0x2e,0x01,0x02,0x0b,0x2d,0x01,0x0c,0x2d,0x01,0x83,0x0b,0x2c,0x01,0x83,0x0b, 0x2b,0x01,0x03,0x0a,0x2b,0x01,0x0b,0x2b,0x01,0x0b,0x2a,0x00,0x82,0x0b,0x2a, 0x01,0x82,0x0b,0x29,0x01,0x06,0x0b,0x28,0x02,0x0a,0x28,0x01,0x0b,0x27,0x01, 0x0b,0x27,0x00,0x0a,0x28,0x00,0x0a,0x27,0x00,0x82,0x0a,0x27,0x01,0x08,0x0a, 0x26,0x01,0x0a,0x25,0x00,0x09,0x26,0x01,0x0a,0x25,0x01,0x0a,0x25,0x00,0x09, 0x25,0x01,0x09,0x25,0x02,0x09,0x24,0x01,0x84,0x09,0x23,0x01,0x83,0x09,0x22, 0x01,0x83,0x09,0x21,0x01,0x04,0x08,0x21,0x01,0x08,0x20,0x01,0x09,0x20,0x01, 0x08,0x1f,0x00,0x84,0x08,0x1f,0x01,0x06,0x08,0x1d,0x01,0x07,0x1d,0x01,0x08, 0x1d,0x00,0x08,0x1d,0x01,0x08,0x1e,0x01,0x08,0x1c,0x01,0x83,0x07,0x1c,0x01, 0x02,0x07,0x1b,0x01,0x07,0x1b,0x00,0x82,0x07,0x1b,0x01,0x83,0x07,0x1a,0x01, 0x02,0x06,0x1a,0x01,0x07,0x19,0x01,0x82,0x06,0x19,0x01,0x01,0x06,0x18,0x00, 0x83,0x06,0x17,0x00,0x02,0x06,0x17,0x01,0x06,0x17,0x00,0x83,0x06,0x16,0x00, 0x01,0x06,0x16,0x01,0x82,0x05,0x15,0x00,0x82,0x05,0x14,0x00,0x83,0x05,0x13, 0x00,0x05,0x05,0x13,0x01,0x05,0x12,0x00,0x05,0x12,0x01,0x04,0x12,0x00,0x05, 0x11,0x01,0x83,0x04,0x11,0x00,0x83,0x04,0x10,0x00,0x04,0x04,0x0f,0x00,0x03, 0x0f,0x00,0x04,0x0f,0x00,0x04,0x0e,0x00,0x82,0x03,0x0e,0x00,0x83,0x03,0x0d, 0x00,0x84,0x03,0x0c,0x00,0x01,0x03,0x0b,0x00,0x82,0x02,0x0b,0x00,0x83,0x02, 0x0a,0x00,0x82,0x02,0x09,0x00,0x84,0x02,0x08,0x00,0x01,0x02,0x07,0x00,0x82, 0x01,0x07,0x00,0x84,0x01,0x06,0x00,0x83,0x01,0x05,0x00,0x84,0x01,0x04,0x00, 0x83,0x00,0x03,0x00,0x84,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xdb,0x00,0x00, 0x00,0x04,0x42,0xa1,0x23,0x43,0x9f,0x23,0x42,0xa0,0x24,0x3f,0x9d,0x21,0x82, 0x40,0x9e,0x22,0x0b,0x3e,0x9c,0x20,0x41,0x9d,0x21,0x43,0x9f,0x23,0x41,0x9d, 0x21,0x40,0x9c,0x20,0x41,0x9d,0x21,0x40,0x9c,0x20,0x3f,0x9b,0x1f,0x41,0x9d, 0x21,0x40,0x9c,0x20,0x41,0x9d,0x21,0x82,0x40,0x9c,0x20,0x06,0x41,0x9d,0x21, 0x3f,0x9d,0x21,0x3f,0x9b,0x1f,0x40,0x9c,0x20,0x40,0x9c,0x1f,0x41,0x9d,0x21, 0x82,0x3f,0x9b,0x1f,0x0a,0x3e,0x9a,0x1e,0x3e,0x99,0x20,0x40,0x9b,0x22,0x3f, 0x9a,0x21,0x3d,0x98,0x1f,0x3f,0x9b,0x1f,0x3e,0x9a,0x1e,0x3d,0x99,0x1d,0x3e, 0x9a,0x1e,0x3f,0x9b,0x1f,0x85,0x3e,0x9a,0x1e,0x01,0x3d,0x99,0x1d,0x82,0x3f, 0x9b,0x1f,0x82,0x3d,0x99,0x1d,0x09,0x3c,0x97,0x1e,0x3c,0x9a,0x20,0x3d,0x98, 0x1f,0x3d,0x99,0x1d,0x3e,0x9a,0x1e,0x3d,0x96,0x1e,0x3b,0x96,0x1d,0x3d,0x98, 0x1f,0x3a,0x95,0x1c,0x82,0x3c,0x97,0x1e,0x01,0x3c,0x98,0x1c,0x82,0x3c,0x97, 0x1e,0x01,0x3b,0x96,0x1d,0x82,0x3a,0x95,0x1c,0x06,0x3b,0x96,0x1d,0x3c,0x98, 0x1c,0x3a,0x96,0x1a,0x3b,0x96,0x1d,0x3c,0x97,0x1e,0x3b,0x97,0x1b,0x82,0x3a, 0x95,0x1c,0x82,0x39,0x94,0x1b,0x82,0x3a,0x95,0x1c,0x82,0x39,0x94,0x1b,0x06, 0x3a,0x95,0x1c,0x39,0x94,0x1b,0x38,0x94,0x18,0x39,0x95,0x19,0x38,0x93,0x1a, 0x39,0x94,0x1b,0x82,0x3a,0x93,0x1b,0x04,0x39,0x92,0x1a,0x37,0x92,0x19,0x38, 0x94,0x18,0x39,0x95,0x19,0x84,0x38,0x94,0x18,0x02,0x37,0x93,0x17,0x38,0x94, 0x18,0x86,0x39,0x94,0x1b,0x0b,0x38,0x93,0x1a,0x37,0x92,0x19,0x36,0x94,0x18, 0x34,0x92,0x16,0x39,0x95,0x19,0x37,0x93,0x17,0x36,0x92,0x16,0x39,0x94,0x1b, 0x37,0x92,0x19,0x36,0x91,0x18,0x35,0x93,0x17,0x84,0x37,0x92,0x19,0x03,0x33, 0x91,0x17,0x34,0x92,0x18,0x34,0x92,0x16,0x82,0x37,0x93,0x17,0x0c,0x39,0x95, 0x19,0x35,0x90,0x17,0x35,0x91,0x15,0x34,0x90,0x14,0x31,0x8f,0x13,0x33,0x91, 0x15,0x36,0x92,0x16,0x38,0x94,0x18,0x34,0x90,0x14,0x33,0x8e,0x15,0x34,0x8f, 0x16,0x31,0x8d,0x11,0x82,0x34,0x90,0x14,0x01,0x31,0x8f,0x13,0x83,0x33,0x91, 0x15,0x01,0x30,0x8e,0x14,0x82,0x34,0x8f,0x16,0x03,0x33,0x8e,0x15,0x33,0x91, 0x15,0x34,0x92,0x16,0x82,0x32,0x90,0x14,0x04,0x31,0x8f,0x13,0x2f,0x8d,0x11, 0x33,0x91,0x15,0x32,0x91,0x13,0x82,0x33,0x91,0x15,0x03,0x32,0x90,0x14,0x30, 0x8e,0x12,0x33,0x91,0x15,0x82,0x31,0x8f,0x13,0x03,0x32,0x90,0x14,0x32,0x91, 0x13,0x31,0x8f,0x13,0x82,0x32,0x90,0x14,0x82,0x2f,0x8f,0x12,0x05,0x30,0x90, 0x13,0x30,0x90,0x12,0x32,0x91,0x13,0x30,0x90,0x13,0x31,0x91,0x13,0x82,0x31, 0x90,0x12,0x82,0x2e,0x8e,0x11,0x01,0x30,0x8f,0x11,0x82,0x31,0x91,0x13,0x03, 0x30,0x90,0x12,0x2f,0x8f,0x11,0x30,0x90,0x12,0x82,0x33,0x93,0x15,0x0b,0x30, 0x90,0x12,0x2e,0x8e,0x10,0x30,0x90,0x12,0x31,0x91,0x13,0x30,0x90,0x12,0x31, 0x92,0x11,0x31,0x91,0x13,0x2e,0x91,0x13,0x2e,0x91,0x12,0x30,0x90,0x12,0x2f, 0x90,0x0f,0x82,0x30,0x91,0x10,0x01,0x2e,0x91,0x12,0x82,0x2e,0x91,0x10,0x03, 0x2f,0x93,0x0f,0x2f,0x92,0x11,0x31,0x94,0x13,0x82,0x2f,0x92,0x11,0x01,0x2d, 0x90,0x0f,0x82,0x2e,0x92,0x0e,0x04,0x2f,0x93,0x0f,0x2e,0x91,0x10,0x30,0x94, 0x10,0x2f,0x93,0x0f,0x82,0x2e,0x92,0x0e,0x03,0x2f,0x93,0x0f,0x2f,0x94,0x10, 0x2e,0x93,0x0f,0x83,0x2f,0x95,0x0e,0x15,0x2e,0x94,0x0d,0x2f,0x95,0x0e,0x31, 0x97,0x10,0x30,0x96,0x0e,0x2f,0x97,0x0e,0x32,0x9a,0x0f,0x31,0x99,0x0e,0x31, 0x99,0x10,0x32,0x9a,0x0f,0x31,0x9c,0x10,0x32,0x9a,0x0f,0x31,0x9a,0x0c,0x34, 0x9d,0x0f,0x33,0x9c,0x0e,0x32,0x9b,0x0d,0x31,0x9c,0x0e,0x34,0x9f,0x11,0x33, 0x9e,0x10,0x32,0x9d,0x0f,0x33,0x9f,0x0e,0x35,0xa1,0x10,0x82,0x36,0xa2,0x10, 0x83,0x35,0xa1,0x0f,0x01,0x37,0xa3,0x11,0x82,0x39,0xa5,0x13,0x0e,0x36,0xa2, 0x10,0x37,0xa3,0x11,0x36,0xa4,0x11,0x36,0xa4,0x0f,0x37,0xa5,0x10,0x36,0xa4, 0x0f,0x38,0xa6,0x11,0x3a,0xa8,0x11,0x38,0xa6,0x11,0x39,0xa7,0x12,0x3a,0xa8, 0x11,0x3b,0xa8,0x11,0x3a,0xa7,0x10,0x39,0xa7,0x10,0x82,0x3a,0xa8,0x11,0x01, 0x38,0xa6,0x11,0x82,0x3b,0xa9,0x14,0x01,0x3b,0xa9,0x12,0x82,0x3c,0xa9,0x12, 0x05,0x3c,0xaa,0x13,0x3b,0xaa,0x10,0x3d,0xab,0x14,0x3d,0xaa,0x13,0x3e,0xab, 0x14,0x82,0x3d,0xac,0x12,0x82,0x3d,0xaa,0x11,0x0a,0x3f,0xae,0x14,0x3e,0xac, 0x15,0x3d,0xaa,0x13,0x3f,0xac,0x13,0x3f,0xae,0x14,0x3e,0xad,0x13,0x3e,0xab, 0x12,0x3f,0xac,0x13,0x40,0xad,0x14,0x43,0xad,0x15,0x83,0x40,0xad,0x14,0x06, 0x41,0xae,0x15,0x43,0xb0,0x17,0x42,0xaf,0x14,0x43,0xae,0x13,0x43,0xb0,0x15, 0x41,0xae,0x13,0x82,0x42,0xaf,0x16,0x19,0x43,0xb0,0x17,0x43,0xb0,0x15,0x42, 0xaf,0x14,0x44,0xae,0x14,0x43,0xad,0x13,0x43,0xae,0x15,0x42,0xae,0x15,0x40, 0xab,0x13,0x41,0xac,0x14,0x44,0xae,0x17,0x42,0xac,0x15,0x41,0xab,0x14,0x42, 0xac,0x16,0x43,0xab,0x15,0x43,0xaa,0x15,0x42,0xa9,0x14,0x43,0xa9,0x15,0x43, 0xaa,0x16,0x43,0xa9,0x15,0x40,0xa8,0x14,0x41,0xa9,0x15,0x41,0xa6,0x13,0x43, 0xa8,0x15,0x42,0xa7,0x15,0x41,0xa6,0x14,0x82,0x41,0xa5,0x14,0x08,0x42,0xa5, 0x15,0x3f,0xa2,0x12,0x3f,0xa3,0x13,0x41,0xa2,0x14,0x40,0xa1,0x15,0x3e,0xa1, 0x12,0x3f,0xa0,0x15,0x3f,0x9f,0x14,0x82,0x3e,0x9e,0x14,0x18,0x3f,0x9e,0x14, 0x3e,0x9d,0x13,0x3e,0x9b,0x12,0x3e,0x99,0x14,0x3d,0x98,0x13,0x3b,0x99,0x13, 0x3a,0x97,0x12,0x39,0x94,0x10,0x39,0x94,0x12,0x38,0x92,0x11,0x37,0x92,0x13, 0x37,0x91,0x12,0x36,0x8f,0x11,0x37,0x8d,0x11,0x36,0x8c,0x10,0x33,0x88,0x0f, 0x34,0x89,0x10,0x35,0x89,0x11,0x34,0x87,0x12,0x32,0x85,0x10,0x33,0x84,0x0f, 0x33,0x82,0x11,0x30,0x7f,0x0e,0x32,0x7f,0x10,0x82,0x2f,0x7c,0x0d,0x0a,0x30, 0x7c,0x0e,0x31,0x7e,0x11,0x2f,0x7b,0x11,0x25,0x6f,0x09,0x22,0x6c,0x06,0x22, 0x6b,0x05,0x21,0x69,0x04,0x21,0x69,0x06,0x20,0x68,0x05,0x1f,0x67,0x07,0x82, 0x1e,0x66,0x04,0x04,0x1e,0x66,0x03,0x1e,0x66,0x04,0x1d,0x64,0x05,0x1c,0x63, 0x04,0x82,0x1c,0x61,0x04,0x11,0x1b,0x61,0x03,0x1b,0x60,0x03,0x1c,0x5f,0x03, 0x1a,0x5f,0x03,0x1a,0x5f,0x04,0x19,0x5e,0x02,0x1a,0x5e,0x03,0x19,0x5d,0x02, 0x18,0x5c,0x03,0x19,0x5d,0x03,0x19,0x5b,0x00,0x18,0x5b,0x03,0x17,0x5b,0x02, 0x17,0x5a,0x02,0x17,0x5b,0x03,0x18,0x5a,0x03,0x17,0x59,0x02,0x82,0x18,0x59, 0x03,0x82,0x17,0x58,0x02,0x0f,0x18,0x59,0x03,0x17,0x57,0x02,0x16,0x57,0x02, 0x18,0x56,0x02,0x18,0x57,0x01,0x18,0x56,0x00,0x18,0x55,0x02,0x16,0x55,0x02, 0x16,0x55,0x00,0x17,0x55,0x00,0x16,0x54,0x02,0x17,0x56,0x03,0x16,0x55,0x02, 0x17,0x53,0x02,0x17,0x53,0x00,0x82,0x15,0x53,0x00,0x20,0x15,0x53,0x02,0x16, 0x51,0x01,0x14,0x53,0x02,0x15,0x53,0x02,0x17,0x51,0x02,0x15,0x51,0x02,0x14, 0x51,0x00,0x17,0x51,0x01,0x16,0x50,0x00,0x14,0x50,0x00,0x15,0x51,0x02,0x15, 0x50,0x01,0x14,0x4f,0x00,0x16,0x4e,0x02,0x15,0x4f,0x02,0x15,0x4f,0x01,0x13, 0x4e,0x00,0x14,0x4f,0x01,0x13,0x4e,0x00,0x14,0x4d,0x00,0x14,0x4d,0x01,0x14, 0x4c,0x01,0x13,0x4d,0x00,0x14,0x4c,0x01,0x13,0x4d,0x01,0x13,0x4c,0x00,0x13, 0x4c,0x02,0x13,0x4c,0x01,0x13,0x4b,0x01,0x12,0x49,0x00,0x14,0x4a,0x01,0x14, 0x4b,0x01,0x82,0x13,0x4b,0x01,0x82,0x13,0x4a,0x01,0x07,0x12,0x49,0x01,0x13, 0x48,0x01,0x13,0x48,0x00,0x13,0x49,0x01,0x12,0x49,0x01,0x13,0x48,0x01,0x13, 0x48,0x00,0x82,0x13,0x47,0x00,0x04,0x12,0x46,0x01,0x12,0x47,0x01,0x13,0x47, 0x02,0x12,0x47,0x02,0x82,0x11,0x46,0x01,0x02,0x12,0x46,0x02,0x12,0x45,0x01, 0x82,0x11,0x44,0x01,0x08,0x13,0x45,0x01,0x12,0x44,0x01,0x10,0x43,0x00,0x11, 0x44,0x00,0x12,0x44,0x01,0x11,0x43,0x01,0x11,0x42,0x01,0x10,0x41,0x01,0x82, 0x11,0x41,0x01,0x14,0x10,0x41,0x01,0x10,0x42,0x02,0x10,0x42,0x01,0x10,0x40, 0x00,0x10,0x41,0x01,0x10,0x40,0x01,0x11,0x41,0x01,0x10,0x40,0x01,0x10,0x3f, 0x01,0x10,0x3f,0x00,0x10,0x3f,0x01,0x0f,0x40,0x01,0x10,0x3e,0x01,0x0f,0x3d, 0x00,0x10,0x3e,0x01,0x0f,0x3e,0x01,0x10,0x3d,0x01,0x0f,0x3c,0x00,0x0f,0x3b, 0x00,0x10,0x3d,0x01,0x83,0x0f,0x3b,0x00,0x82,0x0f,0x3b,0x01,0x03,0x0f,0x3a, 0x00,0x0f,0x39,0x00,0x0e,0x39,0x00,0x82,0x0f,0x39,0x01,0x02,0x0f,0x38,0x01, 0x0e,0x38,0x00,0x83,0x0e,0x37,0x00,0x04,0x0f,0x37,0x00,0x0d,0x36,0x00,0x0e, 0x37,0x00,0x0e,0x36,0x00,0x83,0x0e,0x35,0x00,0x06,0x0d,0x35,0x00,0x0e,0x34, 0x00,0x0d,0x34,0x01,0x0e,0x35,0x01,0x0d,0x34,0x01,0x0d,0x33,0x01,0x82,0x0d, 0x33,0x00,0x0a,0x0d,0x33,0x01,0x0e,0x32,0x01,0x0d,0x32,0x01,0x0d,0x32,0x00, 0x0c,0x31,0x00,0x0d,0x31,0x01,0x0d,0x30,0x01,0x0d,0x2f,0x01,0x0d,0x30,0x01, 0x0c,0x30,0x01,0x83,0x0c,0x2f,0x01,0x02,0x0c,0x2e,0x01,0x0c,0x2f,0x01,0x82, 0x0c,0x2e,0x01,0x82,0x0b,0x2d,0x01,0x02,0x0b,0x2c,0x01,0x0c,0x2b,0x01,0x84, 0x0b,0x2b,0x01,0x02,0x0b,0x2a,0x01,0x0b,0x2b,0x01,0x83,0x0b,0x2a,0x01,0x02, 0x0a,0x29,0x01,0x0b,0x29,0x00,0x82,0x0a,0x29,0x00,0x83,0x0a,0x28,0x00,0x82, 0x0a,0x27,0x00,0x83,0x0a,0x26,0x01,0x82,0x0a,0x25,0x01,0x01,0x0a,0x25,0x00, 0x83,0x09,0x24,0x01,0x85,0x09,0x23,0x01,0x83,0x09,0x22,0x01,0x01,0x08,0x21, 0x00,0x82,0x09,0x21,0x01,0x05,0x08,0x20,0x00,0x09,0x20,0x01,0x08,0x1f,0x01, 0x09,0x20,0x02,0x08,0x20,0x01,0x82,0x08,0x1f,0x01,0x82,0x08,0x1e,0x01,0x04, 0x08,0x1d,0x00,0x08,0x1d,0x01,0x08,0x1e,0x01,0x08,0x1c,0x00,0x84,0x07,0x1c, 0x01,0x83,0x07,0x1b,0x01,0x83,0x07,0x1a,0x01,0x03,0x06,0x19,0x01,0x07,0x19, 0x01,0x06,0x19,0x01,0x82,0x06,0x18,0x01,0x01,0x06,0x18,0x00,0x83,0x06,0x17, 0x00,0x84,0x06,0x16,0x00,0x03,0x06,0x16,0x01,0x05,0x15,0x00,0x05,0x15,0x01, 0x82,0x05,0x14,0x00,0x84,0x05,0x13,0x00,0x83,0x05,0x12,0x00,0x01,0x05,0x11, 0x01,0x82,0x04,0x11,0x00,0x84,0x04,0x10,0x00,0x84,0x04,0x0f,0x00,0x82,0x03, 0x0e,0x00,0x83,0x03,0x0d,0x00,0x84,0x03,0x0c,0x00,0x01,0x03,0x0b,0x00,0x82, 0x02,0x0b,0x00,0x83,0x02,0x0a,0x00,0x83,0x02,0x09,0x00,0x83,0x02,0x08,0x00, 0x82,0x02,0x07,0x00,0x82,0x01,0x07,0x00,0x83,0x01,0x06,0x00,0x83,0x01,0x05, 0x00,0x83,0x01,0x04,0x00,0x01,0x00,0x04,0x00,0x83,0x00,0x03,0x00,0x84,0x00, 0x02,0x00,0x83,0x00,0x01,0x00,0xdb,0x00,0x00,0x00,0x03,0x44,0xa3,0x25,0x41, 0xa0,0x22,0x3f,0x9d,0x21,0x84,0x41,0x9f,0x23,0x83,0x41,0x9d,0x21,0x02,0x42, 0x9e,0x22,0x43,0x9f,0x23,0x82,0x40,0x9e,0x22,0x0c,0x41,0x9f,0x23,0x3f,0x9d, 0x21,0x41,0x9d,0x21,0x40,0x9c,0x20,0x41,0x9d,0x21,0x40,0x9f,0x21,0x41,0xa0, 0x22,0x3f,0x9d,0x21,0x42,0x9e,0x22,0x42,0x9e,0x21,0x44,0xa0,0x23,0x41,0x9d, 0x21,0x82,0x3e,0x9c,0x20,0x01,0x3d,0x9b,0x1f,0x83,0x40,0x9c,0x20,0x06,0x41, 0x9d,0x21,0x40,0x9c,0x20,0x40,0x9c,0x1f,0x3f,0x9d,0x21,0x3d,0x9b,0x1f,0x3e, 0x9a,0x1e,0x82,0x40,0x9c,0x20,0x82,0x3f,0x9b,0x1f,0x01,0x3e,0x9a,0x1e,0x82, 0x3f,0x9b,0x1f,0x82,0x3d,0x99,0x1d,0x0a,0x3c,0x98,0x1c,0x3c,0x9a,0x1e,0x3d, 0x9b,0x1f,0x3d,0x99,0x1d,0x3e,0x9a,0x1e,0x3d,0x99,0x1d,0x3c,0x97,0x1e,0x3d, 0x98,0x1f,0x3b,0x96,0x1d,0x3e,0x9a,0x1e,0x83,0x3d,0x99,0x1d,0x02,0x3c,0x98, 0x1c,0x3c,0x97,0x1e,0x82,0x3c,0x98,0x1c,0x07,0x3b,0x96,0x1d,0x3b,0x97,0x1b, 0x3c,0x98,0x1c,0x3b,0x96,0x1d,0x3c,0x97,0x1e,0x3c,0x98,0x1c,0x3b,0x97,0x1b, 0x82,0x3b,0x96,0x1d,0x83,0x3a,0x95,0x1c,0x82,0x39,0x94,0x1b,0x02,0x3a,0x95, 0x1c,0x39,0x94,0x1b,0x82,0x3b,0x97,0x1b,0x02,0x3a,0x96,0x1a,0x39,0x95,0x19, 0x82,0x3a,0x94,0x19,0x03,0x3a,0x96,0x1a,0x39,0x95,0x19,0x3a,0x96,0x1a,0x82, 0x39,0x95,0x19,0x02,0x3b,0x97,0x1b,0x39,0x95,0x19,0x82,0x38,0x94,0x18,0x82, 0x39,0x95,0x19,0x07,0x38,0x94,0x18,0x39,0x94,0x1b,0x3a,0x95,0x1c,0x39,0x94, 0x1b,0x38,0x93,0x1a,0x38,0x94,0x18,0x39,0x95,0x19,0x82,0x37,0x93,0x17,0x09, 0x3a,0x96,0x1a,0x38,0x94,0x18,0x36,0x92,0x16,0x3b,0x97,0x1b,0x39,0x94,0x1b, 0x36,0x91,0x18,0x34,0x92,0x16,0x38,0x94,0x18,0x38,0x93,0x1a,0x82,0x39,0x94, 0x1b,0x01,0x34,0x92,0x18,0x82,0x35,0x93,0x17,0x82,0x36,0x92,0x16,0x04,0x38, 0x94,0x18,0x35,0x91,0x15,0x36,0x92,0x16,0x35,0x93,0x17,0x82,0x34,0x92,0x16, 0x0b,0x34,0x90,0x14,0x37,0x93,0x17,0x35,0x93,0x17,0x34,0x90,0x14,0x33,0x8f, 0x13,0x36,0x92,0x16,0x37,0x93,0x17,0x34,0x92,0x16,0x36,0x92,0x16,0x32,0x90, 0x14,0x30,0x8e,0x12,0x82,0x33,0x91,0x15,0x06,0x34,0x90,0x14,0x32,0x8e,0x12, 0x36,0x92,0x16,0x32,0x90,0x14,0x33,0x91,0x15,0x30,0x8e,0x12,0x83,0x33,0x91, 0x15,0x82,0x31,0x90,0x12,0x06,0x31,0x8f,0x13,0x35,0x93,0x17,0x32,0x90,0x14, 0x2f,0x8d,0x11,0x30,0x8e,0x12,0x33,0x91,0x15,0x82,0x32,0x90,0x14,0x03,0x32, 0x92,0x14,0x30,0x90,0x13,0x31,0x91,0x14,0x82,0x30,0x90,0x13,0x04,0x31,0x91, 0x14,0x30,0x90,0x13,0x33,0x93,0x15,0x33,0x91,0x15,0x82,0x30,0x90,0x12,0x82, 0x31,0x90,0x12,0x04,0x2f,0x90,0x0f,0x33,0x94,0x13,0x33,0x92,0x14,0x2e,0x8e, 0x10,0x83,0x31,0x91,0x13,0x0f,0x2f,0x8f,0x11,0x31,0x91,0x13,0x2f,0x8f,0x11, 0x31,0x91,0x13,0x30,0x90,0x12,0x2e,0x8e,0x10,0x2f,0x8f,0x11,0x31,0x91,0x13, 0x31,0x94,0x13,0x2e,0x91,0x12,0x2e,0x91,0x13,0x2e,0x91,0x12,0x2e,0x8e,0x10, 0x2d,0x8e,0x0d,0x30,0x91,0x10,0x83,0x2e,0x91,0x10,0x19,0x2d,0x90,0x0f,0x2f, 0x93,0x0f,0x30,0x93,0x12,0x2f,0x93,0x0f,0x2d,0x91,0x0d,0x2f,0x92,0x11,0x2e, 0x91,0x10,0x2f,0x93,0x0f,0x2e,0x92,0x0e,0x2c,0x90,0x0c,0x30,0x94,0x10,0x2f, 0x93,0x0f,0x2e,0x92,0x0e,0x2f,0x93,0x0f,0x30,0x94,0x10,0x31,0x95,0x11,0x2f, 0x93,0x0f,0x2f,0x93,0x0d,0x2d,0x93,0x0c,0x2f,0x95,0x0e,0x30,0x96,0x0f,0x2e, 0x94,0x0d,0x2f,0x95,0x0e,0x30,0x96,0x0f,0x2f,0x96,0x0f,0x82,0x30,0x98,0x0f, 0x02,0x32,0x98,0x10,0x32,0x9a,0x0f,0x83,0x32,0x9b,0x0d,0x0b,0x30,0x98,0x0d, 0x32,0x9a,0x0f,0x31,0x99,0x0e,0x34,0x9d,0x0f,0x34,0x9f,0x11,0x33,0x9e,0x10, 0x32,0x9d,0x0f,0x33,0x9e,0x10,0x33,0x9f,0x0e,0x32,0x9e,0x0d,0x35,0xa1,0x0f, 0x82,0x33,0x9f,0x0e,0x03,0x35,0xa1,0x10,0x35,0xa1,0x0f,0x34,0xa0,0x0e,0x83, 0x35,0xa1,0x0f,0x02,0x36,0xa2,0x10,0x36,0xa4,0x11,0x83,0x37,0xa5,0x10,0x03, 0x38,0xa6,0x11,0x35,0xa6,0x0e,0x36,0xa4,0x0d,0x85,0x39,0xa7,0x10,0x82,0x3b, 0xa9,0x12,0x0a,0x3b,0xa8,0x11,0x3a,0xa8,0x11,0x39,0xa7,0x10,0x3a,0xa8,0x11, 0x3b,0xa9,0x12,0x3b,0xa8,0x11,0x3b,0xa9,0x12,0x3c,0xaa,0x13,0x3b,0xa9,0x12, 0x3b,0xa8,0x11,0x82,0x3c,0xa9,0x10,0x01,0x3c,0xab,0x11,0x82,0x3d,0xaa,0x11, 0x04,0x3d,0xac,0x12,0x3d,0xab,0x14,0x3e,0xab,0x12,0x3f,0xac,0x13,0x82,0x3e, 0xad,0x13,0x82,0x3e,0xab,0x12,0x03,0x3f,0xac,0x13,0x3e,0xab,0x12,0x3f,0xac, 0x13,0x82,0x41,0xae,0x15,0x82,0x40,0xad,0x14,0x01,0x41,0xae,0x13,0x82,0x43, 0xae,0x13,0x01,0x41,0xae,0x13,0x83,0x43,0xb0,0x15,0x82,0x42,0xaf,0x14,0x04, 0x41,0xad,0x13,0x42,0xae,0x14,0x42,0xad,0x14,0x42,0xae,0x15,0x82,0x41,0xae, 0x15,0x03,0x43,0xad,0x16,0x41,0xab,0x14,0x41,0xad,0x15,0x82,0x42,0xac,0x16, 0x02,0x44,0xab,0x16,0x43,0xaa,0x15,0x82,0x43,0xa9,0x15,0x09,0x41,0xa9,0x15, 0x41,0xaa,0x14,0x41,0xa9,0x15,0x41,0xa6,0x13,0x42,0xa7,0x14,0x42,0xa7,0x15, 0x41,0xa6,0x14,0x40,0xa6,0x15,0x42,0xa6,0x15,0x82,0x42,0xa5,0x15,0x05,0x40, 0xa4,0x14,0x42,0xa5,0x16,0x41,0xa4,0x15,0x40,0xa2,0x14,0x41,0xa3,0x15,0x82, 0x3f,0xa0,0x15,0x15,0x40,0xa0,0x14,0x40,0x9f,0x15,0x3f,0x9e,0x14,0x3f,0x9d, 0x14,0x3e,0x9c,0x13,0x3d,0x9c,0x13,0x3d,0x9b,0x13,0x3b,0x98,0x13,0x3c,0x97, 0x13,0x3c,0x96,0x13,0x3a,0x94,0x11,0x39,0x95,0x13,0x37,0x92,0x11,0x37,0x90, 0x12,0x38,0x8e,0x11,0x34,0x8d,0x0f,0x35,0x8c,0x10,0x34,0x8a,0x0f,0x34,0x89, 0x11,0x34,0x88,0x10,0x31,0x84,0x0f,0x82,0x32,0x84,0x10,0x0f,0x30,0x82,0x10, 0x31,0x80,0x0f,0x30,0x7f,0x0e,0x30,0x7d,0x0e,0x30,0x7d,0x10,0x2e,0x7a,0x0e, 0x30,0x7c,0x12,0x2f,0x7a,0x13,0x28,0x73,0x0c,0x22,0x6b,0x07,0x21,0x69,0x04, 0x21,0x6a,0x05,0x22,0x6a,0x06,0x20,0x68,0x04,0x1f,0x67,0x04,0x82,0x1e,0x66, 0x04,0x0b,0x1f,0x66,0x04,0x1d,0x64,0x04,0x1d,0x63,0x05,0x1c,0x62,0x04,0x1c, 0x61,0x04,0x1b,0x61,0x03,0x1b,0x60,0x03,0x1d,0x60,0x03,0x1a,0x5f,0x03,0x1b, 0x60,0x05,0x19,0x5e,0x02,0x82,0x19,0x5d,0x02,0x0c,0x18,0x5b,0x02,0x18,0x5c, 0x03,0x1a,0x5b,0x03,0x17,0x5a,0x02,0x18,0x5b,0x03,0x19,0x59,0x02,0x17,0x59, 0x02,0x19,0x59,0x03,0x17,0x59,0x02,0x18,0x58,0x02,0x17,0x58,0x02,0x18,0x59, 0x03,0x82,0x17,0x58,0x02,0x17,0x15,0x56,0x00,0x16,0x57,0x02,0x18,0x56,0x02, 0x18,0x57,0x01,0x18,0x56,0x00,0x18,0x55,0x02,0x16,0x55,0x02,0x17,0x56,0x01, 0x16,0x55,0x00,0x17,0x54,0x02,0x16,0x54,0x02,0x15,0x53,0x01,0x16,0x52,0x01, 0x15,0x53,0x00,0x16,0x54,0x01,0x15,0x53,0x00,0x15,0x52,0x00,0x17,0x51,0x00, 0x14,0x53,0x00,0x15,0x53,0x01,0x16,0x53,0x03,0x14,0x52,0x02,0x16,0x51,0x00, 0x82,0x15,0x51,0x01,0x05,0x15,0x50,0x00,0x14,0x50,0x02,0x14,0x51,0x01,0x16, 0x50,0x01,0x15,0x4f,0x02,0x82,0x15,0x4f,0x01,0x01,0x14,0x4f,0x01,0x82,0x13, 0x4e,0x00,0x24,0x14,0x4d,0x00,0x14,0x4d,0x01,0x16,0x4d,0x01,0x14,0x4c,0x00, 0x13,0x4c,0x00,0x13,0x4d,0x01,0x13,0x4c,0x02,0x13,0x4b,0x01,0x11,0x4b,0x00, 0x12,0x4c,0x01,0x14,0x4a,0x01,0x13,0x4b,0x01,0x14,0x4b,0x01,0x13,0x4b,0x00, 0x14,0x4b,0x01,0x13,0x4a,0x00,0x14,0x4b,0x01,0x12,0x49,0x01,0x13,0x49,0x01, 0x14,0x48,0x01,0x13,0x49,0x01,0x12,0x48,0x01,0x13,0x47,0x01,0x13,0x48,0x01, 0x13,0x49,0x01,0x13,0x48,0x01,0x14,0x48,0x01,0x13,0x47,0x01,0x12,0x46,0x00, 0x12,0x47,0x00,0x11,0x46,0x00,0x11,0x45,0x00,0x12,0x46,0x01,0x12,0x45,0x01, 0x11,0x45,0x01,0x11,0x44,0x00,0x82,0x12,0x44,0x00,0x01,0x11,0x43,0x00,0x82, 0x11,0x44,0x01,0x06,0x12,0x44,0x01,0x12,0x43,0x02,0x10,0x41,0x01,0x11,0x41, 0x01,0x11,0x42,0x02,0x10,0x41,0x00,0x82,0x10,0x42,0x01,0x02,0x11,0x41,0x01, 0x10,0x41,0x01,0x83,0x10,0x40,0x01,0x04,0x11,0x3f,0x01,0x10,0x3f,0x01,0x0f, 0x3f,0x01,0x10,0x3f,0x01,0x83,0x10,0x3e,0x01,0x82,0x10,0x3d,0x01,0x02,0x0f, 0x3c,0x00,0x10,0x3c,0x00,0x82,0x0f,0x3c,0x00,0x03,0x10,0x3b,0x00,0x10,0x3c, 0x01,0x0f,0x3b,0x00,0x82,0x0f,0x3a,0x00,0x06,0x0f,0x39,0x00,0x10,0x39,0x01, 0x0e,0x39,0x01,0x0f,0x39,0x01,0x0f,0x38,0x01,0x0e,0x38,0x00,0x82,0x0e,0x37, 0x00,0x82,0x0e,0x36,0x00,0x82,0x0e,0x37,0x00,0x01,0x0e,0x36,0x00,0x83,0x0e, 0x35,0x00,0x02,0x0d,0x35,0x00,0x0e,0x34,0x00,0x83,0x0d,0x34,0x00,0x09,0x0d, 0x33,0x01,0x0d,0x34,0x01,0x0d,0x33,0x00,0x0c,0x32,0x01,0x0d,0x31,0x00,0x0d, 0x32,0x01,0x0d,0x32,0x00,0x0c,0x31,0x00,0x0c,0x30,0x00,0x82,0x0d,0x30,0x01, 0x02,0x0b,0x2f,0x00,0x0c,0x30,0x00,0x82,0x0d,0x2f,0x01,0x82,0x0c,0x2f,0x00, 0x82,0x0c,0x2e,0x00,0x02,0x0c,0x2e,0x01,0x0b,0x2d,0x01,0x82,0x0c,0x2d,0x01, 0x83,0x0c,0x2c,0x01,0x04,0x0b,0x2c,0x01,0x0c,0x2c,0x02,0x0b,0x2b,0x01,0x0a, 0x2a,0x01,0x82,0x0b,0x2a,0x01,0x83,0x0b,0x29,0x01,0x82,0x0a,0x29,0x00,0x82, 0x0a,0x28,0x01,0x01,0x0a,0x28,0x00,0x82,0x0a,0x27,0x00,0x03,0x0a,0x26,0x00, 0x0a,0x27,0x01,0x0a,0x26,0x01,0x82,0x0a,0x25,0x01,0x06,0x0a,0x25,0x00,0x09, 0x24,0x01,0x0a,0x24,0x01,0x0a,0x24,0x00,0x09,0x23,0x01,0x0a,0x23,0x01,0x83, 0x09,0x23,0x01,0x83,0x09,0x22,0x01,0x01,0x08,0x21,0x00,0x82,0x09,0x21,0x01, 0x82,0x09,0x20,0x01,0x01,0x08,0x20,0x01,0x84,0x08,0x1f,0x01,0x07,0x08,0x1e, 0x01,0x07,0x1f,0x01,0x08,0x1e,0x01,0x08,0x1d,0x01,0x07,0x1e,0x01,0x08,0x1c, 0x01,0x07,0x1c,0x00,0x82,0x07,0x1c,0x01,0x01,0x07,0x1b,0x00,0x82,0x07,0x1b, 0x01,0x82,0x07,0x1a,0x00,0x82,0x07,0x1a,0x01,0x83,0x06,0x19,0x01,0x01,0x06, 0x18,0x01,0x82,0x06,0x18,0x00,0x82,0x06,0x17,0x00,0x83,0x06,0x16,0x00,0x82, 0x06,0x16,0x01,0x03,0x06,0x15,0x00,0x05,0x15,0x00,0x05,0x15,0x01,0x82,0x05, 0x14,0x00,0x02,0x05,0x13,0x00,0x05,0x14,0x00,0x83,0x05,0x13,0x00,0x02,0x05, 0x12,0x00,0x04,0x12,0x00,0x83,0x04,0x11,0x00,0x02,0x04,0x10,0x00,0x04,0x10, 0x01,0x82,0x04,0x10,0x00,0x83,0x04,0x0f,0x00,0x01,0x04,0x0e,0x00,0x82,0x03, 0x0e,0x00,0x84,0x03,0x0d,0x00,0x83,0x03,0x0c,0x00,0x01,0x03,0x0b,0x00,0x82, 0x02,0x0b,0x00,0x83,0x02,0x0a,0x00,0x83,0x02,0x09,0x00,0x83,0x02,0x08,0x00, 0x01,0x02,0x07,0x00,0x83,0x01,0x07,0x00,0x83,0x01,0x06,0x00,0x83,0x01,0x05, 0x00,0x84,0x01,0x04,0x00,0x83,0x00,0x03,0x00,0x84,0x00,0x02,0x00,0x83,0x00, 0x01,0x00,0xdb,0x00,0x00,0x00,0x02,0x43,0xa2,0x24,0x42,0xa1,0x23,0x82,0x40, 0x9e,0x22,0x82,0x41,0xa0,0x22,0x06,0x43,0xa2,0x24,0x42,0xa0,0x24,0x43,0x9f, 0x23,0x42,0x9e,0x22,0x43,0x9f,0x23,0x42,0xa0,0x24,0x82,0x41,0x9f,0x23,0x06, 0x42,0xa0,0x24,0x41,0x9f,0x23,0x40,0x9f,0x21,0x40,0x9e,0x22,0x42,0xa1,0x23, 0x40,0x9f,0x21,0x82,0x3f,0x9e,0x20,0x03,0x40,0x9e,0x22,0x40,0x9f,0x21,0x43, 0x9f,0x22,0x82,0x3f,0x9e,0x20,0x01,0x40,0x9e,0x22,0x82,0x3e,0x9c,0x20,0x07, 0x3d,0x9b,0x1f,0x3f,0x9d,0x21,0x40,0x9c,0x20,0x3f,0x9e,0x20,0x3e,0x9d,0x1f, 0x3f,0x9e,0x20,0x3f,0x9d,0x21,0x82,0x40,0x9c,0x20,0x04,0x3e,0x9a,0x1d,0x3c, 0x9a,0x1e,0x3f,0x9b,0x1f,0x40,0x9c,0x20,0x82,0x3e,0x9c,0x20,0x06,0x3f,0x9b, 0x1f,0x3e,0x9a,0x1e,0x3c,0x9a,0x1e,0x3d,0x9b,0x1f,0x41,0x9d,0x21,0x3f,0x9b, 0x1f,0x83,0x3e,0x9a,0x1e,0x82,0x3d,0x99,0x1d,0x02,0x3e,0x9a,0x1e,0x3c,0x98, 0x1c,0x82,0x3e,0x9a,0x1e,0x82,0x3d,0x99,0x1d,0x05,0x3e,0x9a,0x1e,0x3d,0x99, 0x1d,0x3e,0x9a,0x1e,0x3c,0x98,0x1c,0x3e,0x9a,0x1e,0x82,0x3c,0x98,0x1c,0x82, 0x3d,0x99,0x1d,0x82,0x3c,0x97,0x1e,0x01,0x3d,0x99,0x1d,0x82,0x3c,0x98,0x1c, 0x02,0x3d,0x99,0x1d,0x3a,0x96,0x1a,0x82,0x39,0x95,0x19,0x03,0x3a,0x96,0x1a, 0x3b,0x97,0x1b,0x3d,0x99,0x1d,0x82,0x3c,0x98,0x1c,0x01,0x39,0x95,0x19,0x83, 0x3c,0x98,0x1c,0x0b,0x3a,0x96,0x1a,0x39,0x95,0x19,0x3a,0x96,0x1a,0x39,0x95, 0x19,0x3a,0x96,0x1a,0x3b,0x97,0x1b,0x3a,0x96,0x1a,0x3b,0x97,0x1b,0x39,0x95, 0x19,0x38,0x94,0x18,0x39,0x95,0x19,0x82,0x3a,0x96,0x1a,0x02,0x39,0x95,0x19, 0x3a,0x96,0x1a,0x83,0x39,0x95,0x19,0x08,0x3a,0x96,0x1a,0x37,0x93,0x17,0x39, 0x95,0x19,0x38,0x93,0x1a,0x37,0x92,0x19,0x38,0x94,0x18,0x37,0x93,0x17,0x36, 0x92,0x16,0x82,0x38,0x94,0x18,0x82,0x35,0x93,0x17,0x02,0x37,0x93,0x17,0x34, 0x90,0x14,0x82,0x37,0x93,0x17,0x82,0x34,0x92,0x16,0x04,0x36,0x94,0x18,0x37, 0x95,0x19,0x36,0x94,0x18,0x34,0x92,0x16,0x82,0x35,0x93,0x17,0x05,0x36,0x94, 0x18,0x35,0x91,0x15,0x36,0x92,0x16,0x37,0x93,0x17,0x35,0x93,0x17,0x83,0x33, 0x91,0x15,0x01,0x36,0x94,0x18,0x82,0x33,0x91,0x15,0x06,0x35,0x93,0x17,0x36, 0x94,0x18,0x32,0x90,0x14,0x31,0x8f,0x13,0x32,0x90,0x14,0x34,0x92,0x16,0x82, 0x33,0x92,0x14,0x08,0x34,0x93,0x15,0x31,0x90,0x12,0x32,0x91,0x13,0x35,0x94, 0x16,0x32,0x91,0x13,0x34,0x92,0x16,0x31,0x8f,0x13,0x32,0x90,0x14,0x82,0x33, 0x91,0x15,0x09,0x30,0x90,0x12,0x2f,0x8f,0x11,0x31,0x91,0x14,0x30,0x90,0x13, 0x31,0x91,0x14,0x34,0x92,0x16,0x31,0x90,0x12,0x2e,0x8e,0x10,0x32,0x90,0x14, 0x82,0x30,0x90,0x12,0x05,0x32,0x90,0x14,0x32,0x91,0x13,0x30,0x91,0x10,0x32, 0x93,0x12,0x33,0x92,0x14,0x83,0x2f,0x8f,0x11,0x0a,0x31,0x91,0x13,0x30,0x90, 0x12,0x33,0x93,0x15,0x2f,0x8f,0x11,0x30,0x90,0x12,0x30,0x91,0x10,0x31,0x92, 0x11,0x31,0x91,0x13,0x30,0x90,0x12,0x2f,0x92,0x11,0x82,0x2f,0x92,0x13,0x03, 0x2e,0x91,0x10,0x2f,0x8f,0x11,0x2f,0x90,0x0f,0x82,0x2f,0x92,0x11,0x83,0x2e, 0x91,0x10,0x02,0x30,0x94,0x10,0x2d,0x90,0x0f,0x82,0x2f,0x93,0x0f,0x01,0x30, 0x93,0x12,0x82,0x2f,0x93,0x0f,0x01,0x2e,0x92,0x0e,0x82,0x2f,0x93,0x0f,0x01, 0x30,0x94,0x10,0x82,0x2f,0x93,0x0f,0x82,0x30,0x94,0x10,0x04,0x2f,0x93,0x0d, 0x30,0x94,0x0e,0x30,0x95,0x11,0x30,0x96,0x0f,0x82,0x2f,0x95,0x0e,0x82,0x30, 0x96,0x0f,0x18,0x31,0x97,0x10,0x30,0x98,0x0f,0x30,0x96,0x0e,0x2f,0x95,0x0d, 0x31,0x97,0x0d,0x31,0x99,0x0e,0x30,0x98,0x0d,0x31,0x99,0x0e,0x32,0x98,0x0e, 0x31,0x99,0x0e,0x33,0x9c,0x0e,0x34,0x9d,0x0f,0x31,0x9c,0x0e,0x33,0x9e,0x10, 0x32,0x9d,0x0f,0x31,0x9c,0x0e,0x32,0x9d,0x0f,0x33,0x9f,0x0e,0x34,0xa0,0x0f, 0x32,0x9e,0x0d,0x33,0x9f,0x0e,0x34,0xa0,0x0f,0x33,0x9f,0x0e,0x34,0xa0,0x0e, 0x82,0x35,0xa1,0x0f,0x0e,0x35,0xa3,0x10,0x36,0xa2,0x10,0x37,0xa3,0x11,0x35, 0xa3,0x0e,0x36,0xa4,0x0f,0x37,0xa8,0x12,0x38,0xa6,0x11,0x35,0xa3,0x0e,0x38, 0xa6,0x0f,0x39,0xa7,0x10,0x37,0xa5,0x0e,0x38,0xa6,0x0f,0x39,0xa7,0x10,0x38, 0xa6,0x0f,0x82,0x39,0xa7,0x10,0x02,0x3b,0xa8,0x11,0x3a,0xa8,0x11,0x83,0x39, 0xa7,0x10,0x08,0x3b,0xa8,0x11,0x3b,0xa9,0x12,0x3c,0xaa,0x13,0x3a,0xa8,0x11, 0x3b,0xa8,0x11,0x3c,0xa9,0x10,0x3b,0xaa,0x10,0x3c,0xab,0x11,0x82,0x3d,0xaa, 0x11,0x06,0x3c,0xab,0x11,0x3d,0xaa,0x13,0x3d,0xaa,0x11,0x3e,0xab,0x12,0x3d, 0xac,0x12,0x3e,0xad,0x13,0x82,0x3e,0xab,0x12,0x02,0x3e,0xad,0x13,0x40,0xad, 0x14,0x82,0x3e,0xab,0x12,0x04,0x3f,0xac,0x13,0x40,0xad,0x14,0x3f,0xae,0x14, 0x41,0xae,0x13,0x82,0x44,0xaf,0x14,0x04,0x41,0xae,0x13,0x43,0xb0,0x15,0x41, 0xae,0x13,0x42,0xaf,0x14,0x82,0x40,0xaf,0x13,0x37,0x42,0xae,0x14,0x42,0xb0, 0x15,0x42,0xad,0x14,0x41,0xad,0x14,0x40,0xad,0x14,0x41,0xae,0x15,0x42,0xad, 0x15,0x42,0xac,0x15,0x44,0xb0,0x17,0x42,0xac,0x16,0x41,0xab,0x15,0x41,0xaa, 0x15,0x42,0xa9,0x14,0x42,0xa8,0x14,0x41,0xa9,0x15,0x41,0xaa,0x15,0x40,0xa9, 0x14,0x3f,0xa7,0x13,0x41,0xa9,0x14,0x42,0xa7,0x13,0x41,0xa6,0x14,0x40,0xa7, 0x15,0x3f,0xa5,0x14,0x41,0xa5,0x14,0x42,0xa5,0x15,0x41,0xa4,0x14,0x3f,0xa3, 0x13,0x40,0xa3,0x14,0x3f,0xa2,0x13,0x41,0xa3,0x15,0x42,0xa4,0x16,0x40,0xa1, 0x14,0x40,0xa1,0x16,0x3f,0xa1,0x14,0x3e,0x9e,0x14,0x3f,0x9e,0x14,0x40,0x9e, 0x15,0x3f,0x9d,0x14,0x3d,0x9c,0x13,0x3d,0x9b,0x13,0x3c,0x9a,0x12,0x3e,0x9a, 0x16,0x3d,0x97,0x14,0x3b,0x97,0x13,0x3a,0x96,0x12,0x38,0x93,0x12,0x38,0x91, 0x11,0x38,0x91,0x13,0x37,0x90,0x13,0x37,0x8d,0x11,0x36,0x8c,0x11,0x35,0x8b, 0x10,0x32,0x86,0x0e,0x31,0x85,0x0d,0x32,0x86,0x11,0x82,0x30,0x84,0x0f,0x1a, 0x31,0x83,0x0d,0x32,0x82,0x0f,0x31,0x7f,0x0f,0x2f,0x7d,0x0e,0x2f,0x7e,0x0f, 0x30,0x7e,0x0f,0x2e,0x7a,0x0f,0x30,0x7c,0x10,0x2c,0x78,0x0e,0x26,0x6e,0x09, 0x20,0x68,0x04,0x20,0x69,0x06,0x21,0x69,0x05,0x20,0x6a,0x05,0x1f,0x69,0x04, 0x1e,0x67,0x05,0x1f,0x66,0x04,0x1d,0x64,0x04,0x1e,0x64,0x06,0x1e,0x65,0x04, 0x1d,0x64,0x04,0x1c,0x62,0x04,0x1c,0x61,0x04,0x1d,0x62,0x05,0x1c,0x61,0x04, 0x1b,0x60,0x03,0x82,0x1b,0x5f,0x03,0x0b,0x1a,0x5e,0x03,0x19,0x5d,0x03,0x18, 0x5c,0x03,0x19,0x5c,0x03,0x17,0x5a,0x00,0x19,0x59,0x02,0x18,0x5b,0x03,0x19, 0x59,0x02,0x18,0x5a,0x03,0x19,0x59,0x03,0x17,0x59,0x02,0x82,0x19,0x58,0x03, 0x03,0x19,0x58,0x02,0x18,0x57,0x02,0x17,0x55,0x00,0x82,0x16,0x57,0x02,0x07, 0x16,0x56,0x02,0x18,0x57,0x02,0x17,0x54,0x01,0x17,0x56,0x02,0x17,0x57,0x02, 0x16,0x55,0x02,0x17,0x53,0x01,0x82,0x16,0x54,0x02,0x0b,0x15,0x53,0x01,0x17, 0x53,0x02,0x16,0x54,0x02,0x15,0x53,0x00,0x17,0x52,0x00,0x15,0x54,0x01,0x17, 0x53,0x02,0x16,0x52,0x01,0x15,0x53,0x02,0x15,0x51,0x02,0x16,0x51,0x01,0x82, 0x15,0x51,0x01,0x0a,0x15,0x50,0x02,0x15,0x4f,0x02,0x15,0x50,0x01,0x16,0x50, 0x02,0x14,0x4f,0x00,0x14,0x50,0x01,0x15,0x4f,0x01,0x15,0x4e,0x01,0x15,0x4e, 0x02,0x14,0x4e,0x02,0x82,0x14,0x4e,0x01,0x09,0x16,0x4d,0x01,0x14,0x4e,0x01, 0x14,0x4c,0x01,0x13,0x4d,0x01,0x13,0x4b,0x01,0x15,0x4a,0x01,0x13,0x4a,0x00, 0x14,0x4b,0x01,0x14,0x4c,0x01,0x82,0x12,0x4a,0x00,0x0f,0x13,0x4a,0x01,0x13, 0x4b,0x01,0x13,0x4a,0x01,0x14,0x4b,0x02,0x12,0x49,0x01,0x12,0x49,0x02,0x14, 0x48,0x01,0x13,0x49,0x02,0x12,0x48,0x02,0x12,0x46,0x01,0x12,0x47,0x01,0x13, 0x49,0x01,0x13,0x48,0x01,0x12,0x48,0x01,0x12,0x47,0x00,0x82,0x12,0x46,0x00, 0x06,0x13,0x46,0x01,0x11,0x45,0x00,0x12,0x45,0x00,0x13,0x45,0x01,0x12,0x45, 0x01,0x11,0x44,0x00,0x82,0x12,0x44,0x00,0x82,0x11,0x43,0x00,0x82,0x12,0x43, 0x01,0x1a,0x11,0x42,0x00,0x12,0x41,0x01,0x11,0x40,0x01,0x11,0x42,0x02,0x11, 0x42,0x01,0x11,0x41,0x01,0x12,0x41,0x01,0x11,0x41,0x01,0x0f,0x41,0x00,0x11, 0x40,0x01,0x10,0x3f,0x00,0x10,0x40,0x01,0x11,0x40,0x01,0x10,0x3f,0x01,0x0f, 0x3f,0x01,0x10,0x3e,0x01,0x0f,0x3e,0x00,0x10,0x3d,0x01,0x0f,0x3d,0x00,0x10, 0x3c,0x00,0x10,0x3d,0x01,0x10,0x3c,0x00,0x0f,0x3c,0x00,0x10,0x3d,0x01,0x0f, 0x3c,0x00,0x0f,0x3a,0x00,0x82,0x0f,0x3b,0x00,0x82,0x0f,0x3a,0x00,0x03,0x0e, 0x39,0x00,0x0f,0x38,0x00,0x0f,0x39,0x01,0x83,0x0e,0x38,0x01,0x84,0x0e,0x37, 0x01,0x04,0x0e,0x37,0x00,0x0e,0x36,0x00,0x0e,0x35,0x00,0x0d,0x35,0x00,0x82, 0x0e,0x35,0x00,0x09,0x0d,0x35,0x00,0x0c,0x35,0x00,0x0e,0x35,0x01,0x0d,0x35, 0x00,0x0d,0x34,0x00,0x0d,0x33,0x01,0x0e,0x33,0x01,0x0c,0x32,0x00,0x0c,0x32, 0x01,0x82,0x0d,0x32,0x00,0x01,0x0d,0x32,0x01,0x82,0x0c,0x31,0x01,0x05,0x0d, 0x31,0x01,0x0d,0x30,0x00,0x0c,0x30,0x00,0x0c,0x30,0x01,0x0d,0x2f,0x01,0x82, 0x0c,0x2f,0x00,0x82,0x0d,0x2f,0x01,0x82,0x0c,0x2e,0x01,0x82,0x0c,0x2d,0x00, 0x02,0x0c,0x2c,0x00,0x0b,0x2c,0x00,0x82,0x0c,0x2c,0x01,0x82,0x0c,0x2b,0x01, 0x09,0x0b,0x2b,0x01,0x0b,0x2b,0x00,0x0b,0x2b,0x01,0x0b,0x2a,0x01,0x0b,0x29, 0x00,0x0b,0x29,0x01,0x0c,0x2a,0x02,0x0b,0x29,0x01,0x0a,0x28,0x00,0x83,0x0a, 0x28,0x01,0x01,0x0a,0x27,0x01,0x82,0x0a,0x27,0x00,0x05,0x09,0x27,0x01,0x0a, 0x26,0x01,0x09,0x26,0x01,0x0a,0x26,0x01,0x0a,0x25,0x01,0x82,0x09,0x25,0x01, 0x82,0x0a,0x24,0x01,0x01,0x09,0x24,0x01,0x84,0x09,0x23,0x01,0x01,0x09,0x22, 0x01,0x85,0x09,0x21,0x01,0x02,0x09,0x20,0x01,0x08,0x20,0x01,0x84,0x08,0x1f, 0x01,0x82,0x08,0x1e,0x01,0x07,0x07,0x1e,0x00,0x08,0x1d,0x00,0x08,0x1e,0x00, 0x08,0x1d,0x01,0x07,0x1c,0x01,0x07,0x1c,0x00,0x07,0x1c,0x01,0x83,0x07,0x1b, 0x01,0x05,0x07,0x1a,0x01,0x07,0x1a,0x00,0x07,0x1a,0x01,0x06,0x1a,0x01,0x06, 0x19,0x01,0x82,0x07,0x19,0x01,0x04,0x06,0x18,0x01,0x06,0x18,0x00,0x07,0x18, 0x01,0x07,0x17,0x01,0x83,0x06,0x17,0x00,0x83,0x06,0x16,0x00,0x01,0x06,0x15, 0x00,0x82,0x05,0x15,0x00,0x83,0x05,0x14,0x00,0x83,0x05,0x13,0x00,0x82,0x05, 0x12,0x00,0x01,0x04,0x12,0x01,0x84,0x04,0x11,0x00,0x83,0x04,0x10,0x00,0x03, 0x04,0x0f,0x00,0x04,0x0f,0x01,0x04,0x0f,0x00,0x83,0x03,0x0e,0x00,0x84,0x03, 0x0d,0x00,0x83,0x03,0x0c,0x00,0x82,0x03,0x0b,0x00,0x01,0x02,0x0b,0x00,0x83, 0x02,0x0a,0x00,0x83,0x02,0x09,0x00,0x84,0x02,0x08,0x00,0x82,0x02,0x07,0x00, 0x01,0x01,0x07,0x00,0x83,0x01,0x06,0x00,0x84,0x01,0x05,0x00,0x83,0x01,0x04, 0x00,0x83,0x00,0x03,0x00,0x84,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xdb,0x00, 0x00,0x00,0x04,0x43,0xa2,0x24,0x44,0xa3,0x25,0x42,0xa1,0x23,0x41,0xa0,0x22, 0x82,0x43,0xa2,0x24,0x04,0x42,0xa1,0x23,0x41,0xa0,0x22,0x46,0xa2,0x25,0x44, 0xa0,0x23,0x82,0x42,0xa1,0x23,0x02,0x41,0xa0,0x22,0x40,0x9e,0x22,0x82,0x41, 0x9f,0x23,0x0c,0x42,0xa1,0x23,0x41,0xa0,0x22,0x43,0xa2,0x24,0x42,0xa1,0x21, 0x41,0xa0,0x22,0x42,0xa1,0x23,0x41,0x9f,0x23,0x41,0xa0,0x22,0x45,0xa1,0x22, 0x43,0x9f,0x22,0x41,0x9d,0x20,0x40,0x9f,0x21,0x82,0x41,0xa0,0x22,0x82,0x3f, 0x9e,0x20,0x05,0x40,0x9e,0x22,0x41,0xa0,0x22,0x3e,0x9d,0x1f,0x3d,0x9c,0x1e, 0x3f,0x9e,0x20,0x82,0x40,0x9c,0x1f,0x0b,0x42,0x9e,0x21,0x3f,0x9d,0x21,0x40, 0x9c,0x20,0x3f,0x9b,0x1f,0x3c,0x9a,0x1e,0x3e,0x9c,0x20,0x41,0x9d,0x20,0x40, 0x9c,0x1f,0x3e,0x9d,0x1f,0x40,0x9c,0x20,0x3e,0x9a,0x1e,0x82,0x40,0x9c,0x20, 0x01,0x3d,0x99,0x1d,0x82,0x3f,0x9b,0x1f,0x01,0x3d,0x99,0x1d,0x82,0x3e,0x9a, 0x1d,0x0a,0x3f,0x9b,0x1e,0x3e,0x9a,0x1d,0x3d,0x99,0x1d,0x3f,0x9b,0x1f,0x3e, 0x9a,0x1e,0x3b,0x97,0x1b,0x3e,0x9a,0x1e,0x3d,0x99,0x1d,0x3f,0x9b,0x1f,0x3e, 0x9a,0x1e,0x82,0x3c,0x98,0x1c,0x04,0x3d,0x99,0x1c,0x3d,0x99,0x1d,0x3c,0x98, 0x1c,0x3b,0x97,0x1b,0x83,0x3c,0x98,0x1c,0x01,0x3b,0x97,0x1b,0x82,0x3d,0x99, 0x1d,0x01,0x3b,0x97,0x1b,0x82,0x3c,0x98,0x1c,0x82,0x3b,0x97,0x1b,0x03,0x3c, 0x98,0x1c,0x3c,0x98,0x1b,0x39,0x98,0x1a,0x82,0x3c,0x98,0x1c,0x82,0x3d,0x99, 0x1d,0x82,0x3b,0x97,0x1b,0x82,0x3a,0x96,0x1a,0x83,0x39,0x95,0x19,0x82,0x3a, 0x96,0x1a,0x03,0x38,0x96,0x1a,0x3a,0x96,0x1a,0x3c,0x98,0x1c,0x83,0x39,0x95, 0x19,0x01,0x3a,0x96,0x1a,0x82,0x38,0x94,0x18,0x10,0x37,0x92,0x19,0x36,0x94, 0x1a,0x3b,0x97,0x1b,0x38,0x94,0x18,0x37,0x93,0x17,0x39,0x95,0x19,0x36,0x94, 0x18,0x38,0x96,0x1a,0x36,0x94,0x18,0x38,0x94,0x18,0x37,0x93,0x17,0x38,0x94, 0x18,0x35,0x93,0x17,0x37,0x95,0x19,0x38,0x96,0x1a,0x37,0x95,0x19,0x82,0x36, 0x94,0x18,0x82,0x35,0x93,0x17,0x0c,0x33,0x91,0x15,0x36,0x94,0x18,0x39,0x95, 0x19,0x37,0x93,0x17,0x36,0x94,0x18,0x33,0x91,0x15,0x35,0x93,0x17,0x37,0x95, 0x19,0x33,0x91,0x15,0x34,0x92,0x16,0x35,0x93,0x17,0x36,0x94,0x18,0x82,0x35, 0x93,0x17,0x82,0x33,0x91,0x15,0x06,0x35,0x93,0x17,0x34,0x93,0x15,0x33,0x92, 0x14,0x30,0x8f,0x11,0x36,0x95,0x17,0x34,0x94,0x16,0x82,0x35,0x93,0x17,0x02, 0x31,0x8f,0x13,0x36,0x95,0x17,0x82,0x32,0x91,0x13,0x12,0x34,0x92,0x16,0x36, 0x94,0x18,0x34,0x94,0x16,0x31,0x91,0x13,0x32,0x91,0x13,0x31,0x90,0x12,0x32, 0x91,0x13,0x34,0x93,0x15,0x32,0x92,0x14,0x30,0x90,0x12,0x33,0x92,0x14,0x32, 0x92,0x14,0x31,0x91,0x13,0x30,0x8f,0x11,0x32,0x91,0x13,0x33,0x94,0x13,0x32, 0x92,0x14,0x31,0x90,0x12,0x82,0x31,0x91,0x13,0x06,0x30,0x90,0x12,0x32,0x92, 0x14,0x31,0x91,0x13,0x33,0x93,0x15,0x31,0x91,0x13,0x30,0x90,0x12,0x82,0x31, 0x92,0x11,0x12,0x31,0x91,0x13,0x30,0x90,0x12,0x2e,0x91,0x10,0x2d,0x90,0x11, 0x2f,0x92,0x13,0x30,0x93,0x12,0x30,0x90,0x12,0x30,0x91,0x10,0x2e,0x91,0x10, 0x30,0x93,0x12,0x2f,0x92,0x11,0x2e,0x91,0x10,0x2f,0x90,0x0f,0x30,0x91,0x10, 0x2f,0x92,0x11,0x2f,0x93,0x0f,0x2d,0x91,0x0d,0x2e,0x92,0x0e,0x82,0x2f,0x93, 0x0f,0x03,0x2e,0x92,0x0e,0x2f,0x93,0x0f,0x30,0x94,0x10,0x82,0x2f,0x93,0x0f, 0x03,0x2d,0x91,0x0d,0x2f,0x93,0x0f,0x30,0x94,0x10,0x83,0x2f,0x93,0x0d,0x01, 0x30,0x94,0x0e,0x82,0x2f,0x95,0x0e,0x0f,0x30,0x96,0x0f,0x2f,0x95,0x0e,0x2e, 0x94,0x0d,0x30,0x96,0x0f,0x31,0x97,0x0d,0x30,0x96,0x0c,0x30,0x96,0x0e,0x31, 0x99,0x10,0x30,0x98,0x0f,0x31,0x99,0x0e,0x33,0x99,0x0f,0x32,0x9b,0x0d,0x32, 0x9a,0x0f,0x32,0x9d,0x0f,0x30,0x9b,0x0d,0x84,0x31,0x9c,0x0e,0x02,0x32,0x9d, 0x0f,0x33,0x9f,0x0e,0x83,0x34,0xa0,0x0f,0x0a,0x33,0x9f,0x0e,0x34,0xa0,0x0f, 0x35,0xa1,0x10,0x34,0xa0,0x0f,0x34,0xa2,0x0f,0x34,0xa0,0x0f,0x35,0xa1,0x0f, 0x36,0xa2,0x0e,0x38,0xa6,0x11,0x37,0xa5,0x12,0x82,0x36,0xa4,0x0f,0x01,0x37, 0xa4,0x0d,0x83,0x37,0xa5,0x0e,0x01,0x39,0xa7,0x10,0x82,0x38,0xa6,0x0f,0x82, 0x39,0xa6,0x0f,0x02,0x38,0xa6,0x0f,0x36,0xa7,0x0f,0x82,0x38,0xa6,0x0f,0x05, 0x3b,0xa8,0x11,0x3b,0xa9,0x12,0x3a,0xa8,0x11,0x39,0xa7,0x10,0x3a,0xa8,0x11, 0x84,0x3b,0xaa,0x10,0x02,0x3b,0xa9,0x12,0x3b,0xaa,0x10,0x82,0x3d,0xaa,0x11, 0x82,0x3c,0xab,0x11,0x05,0x3d,0xab,0x14,0x3d,0xaa,0x13,0x3e,0xab,0x12,0x3d, 0xac,0x12,0x3e,0xab,0x12,0x84,0x3f,0xac,0x13,0x82,0x3f,0xae,0x14,0x03,0x3f, 0xac,0x11,0x43,0xae,0x13,0x41,0xae,0x13,0x83,0x42,0xaf,0x14,0x0b,0x40,0xaf, 0x13,0x3f,0xac,0x11,0x3f,0xab,0x13,0x40,0xae,0x13,0x43,0xae,0x15,0x41,0xad, 0x14,0x3f,0xaa,0x12,0x41,0xac,0x14,0x42,0xad,0x15,0x41,0xab,0x14,0x40,0xac, 0x13,0x82,0x41,0xac,0x14,0x0a,0x41,0xab,0x14,0x41,0xaa,0x15,0x40,0xa8,0x14, 0x3f,0xa7,0x13,0x40,0xa9,0x14,0x3e,0xa7,0x12,0x3f,0xa8,0x13,0x42,0xa7,0x13, 0x43,0xa8,0x14,0x42,0xa7,0x14,0x82,0x3e,0xa5,0x13,0x0d,0x40,0xa6,0x15,0x41, 0xa5,0x13,0x40,0xa3,0x12,0x40,0xa4,0x14,0x41,0xa4,0x15,0x3f,0xa2,0x13,0x40, 0xa2,0x14,0x41,0xa3,0x15,0x40,0xa1,0x14,0x40,0xa2,0x14,0x3f,0x9f,0x13,0x3f, 0x9e,0x14,0x3e,0x9e,0x14,0x82,0x3e,0x9d,0x14,0x08,0x3d,0x9c,0x13,0x3d,0x9c, 0x14,0x3d,0x9b,0x13,0x3e,0x9b,0x14,0x3d,0x9a,0x13,0x3c,0x98,0x14,0x3c,0x98, 0x15,0x3a,0x96,0x13,0x82,0x39,0x93,0x13,0x1b,0x38,0x93,0x13,0x35,0x8e,0x0f, 0x36,0x8f,0x12,0x36,0x8e,0x12,0x35,0x8a,0x10,0x34,0x88,0x11,0x33,0x87,0x10, 0x30,0x84,0x0d,0x31,0x84,0x10,0x31,0x83,0x0d,0x32,0x83,0x10,0x32,0x81,0x10, 0x30,0x7f,0x0f,0x30,0x7e,0x0f,0x2f,0x7d,0x0e,0x2e,0x7c,0x0e,0x2f,0x7b,0x0f, 0x30,0x7b,0x0e,0x30,0x7c,0x13,0x29,0x73,0x0e,0x20,0x69,0x06,0x1f,0x68,0x06, 0x21,0x6b,0x06,0x20,0x69,0x05,0x1e,0x68,0x04,0x20,0x67,0x04,0x1f,0x66,0x05, 0x82,0x1e,0x65,0x04,0x02,0x1d,0x64,0x04,0x1d,0x62,0x05,0x82,0x1b,0x60,0x03, 0x14,0x1d,0x61,0x05,0x1b,0x60,0x03,0x1c,0x60,0x04,0x1b,0x60,0x02,0x1a,0x5e, 0x03,0x1b,0x5e,0x05,0x1a,0x5d,0x04,0x19,0x5c,0x02,0x18,0x5b,0x01,0x1a,0x5a, 0x03,0x18,0x5b,0x03,0x19,0x59,0x02,0x18,0x5a,0x03,0x18,0x58,0x02,0x17,0x59, 0x00,0x18,0x59,0x01,0x17,0x58,0x00,0x19,0x58,0x02,0x19,0x57,0x02,0x18,0x56, 0x02,0x82,0x16,0x57,0x02,0x03,0x17,0x57,0x02,0x17,0x58,0x02,0x17,0x56,0x01, 0x82,0x16,0x57,0x01,0x03,0x16,0x55,0x02,0x17,0x54,0x02,0x15,0x53,0x01,0x82, 0x16,0x54,0x02,0x01,0x16,0x52,0x01,0x82,0x15,0x53,0x02,0x03,0x16,0x53,0x01, 0x15,0x54,0x01,0x15,0x52,0x00,0x82,0x16,0x52,0x01,0x02,0x16,0x50,0x01,0x14, 0x51,0x00,0x82,0x15,0x51,0x01,0x08,0x15,0x50,0x02,0x14,0x4f,0x01,0x16,0x4e, 0x02,0x15,0x51,0x02,0x13,0x4f,0x00,0x14,0x50,0x01,0x15,0x4f,0x01,0x14,0x4e, 0x00,0x82,0x14,0x4d,0x01,0x10,0x13,0x4d,0x00,0x14,0x4e,0x01,0x14,0x4c,0x00, 0x14,0x4d,0x01,0x14,0x4c,0x01,0x13,0x4d,0x01,0x14,0x4c,0x02,0x14,0x49,0x01, 0x13,0x4a,0x01,0x14,0x4b,0x01,0x13,0x4b,0x01,0x14,0x4b,0x01,0x14,0x4c,0x02, 0x14,0x4b,0x02,0x13,0x4b,0x01,0x12,0x49,0x00,0x82,0x13,0x4a,0x01,0x04,0x13, 0x48,0x02,0x14,0x48,0x01,0x13,0x49,0x01,0x12,0x48,0x02,0x82,0x12,0x47,0x01, 0x04,0x13,0x48,0x01,0x12,0x47,0x00,0x13,0x47,0x00,0x13,0x47,0x02,0x82,0x12, 0x45,0x01,0x08,0x12,0x46,0x01,0x11,0x46,0x01,0x12,0x46,0x02,0x12,0x46,0x01, 0x13,0x45,0x01,0x12,0x44,0x00,0x13,0x44,0x01,0x12,0x44,0x00,0x82,0x11,0x43, 0x01,0x09,0x12,0x43,0x01,0x11,0x42,0x00,0x11,0x43,0x00,0x13,0x42,0x02,0x11, 0x40,0x01,0x11,0x41,0x00,0x11,0x42,0x01,0x12,0x42,0x01,0x11,0x41,0x01,0x82, 0x11,0x40,0x01,0x05,0x11,0x41,0x01,0x0f,0x41,0x01,0x10,0x40,0x01,0x11,0x3f, 0x01,0x10,0x3e,0x00,0x82,0x10,0x3f,0x01,0x06,0x0f,0x3d,0x01,0x0f,0x3c,0x01, 0x0f,0x3d,0x01,0x0f,0x3c,0x01,0x10,0x3d,0x02,0x0f,0x3c,0x01,0x82,0x0f,0x3c, 0x00,0x01,0x10,0x3b,0x00,0x84,0x0f,0x3a,0x00,0x09,0x0f,0x3a,0x01,0x0e,0x39, 0x00,0x0e,0x38,0x00,0x0f,0x39,0x01,0x0e,0x38,0x01,0x0e,0x37,0x00,0x0d,0x37, 0x00,0x0e,0x37,0x00,0x0d,0x37,0x00,0x82,0x0e,0x37,0x01,0x02,0x0d,0x37,0x00, 0x0e,0x37,0x00,0x82,0x0e,0x36,0x00,0x04,0x0d,0x34,0x00,0x0e,0x34,0x00,0x0d, 0x34,0x00,0x0e,0x35,0x01,0x82,0x0d,0x34,0x00,0x04,0x0e,0x33,0x00,0x0d,0x33, 0x01,0x0d,0x33,0x00,0x0d,0x32,0x00,0x82,0x0d,0x33,0x00,0x02,0x0d,0x32,0x01, 0x0c,0x31,0x01,0x82,0x0d,0x31,0x01,0x82,0x0c,0x30,0x00,0x02,0x0d,0x30,0x01, 0x0c,0x30,0x01,0x84,0x0c,0x2f,0x00,0x82,0x0c,0x2e,0x00,0x82,0x0c,0x2d,0x00, 0x05,0x0c,0x2d,0x01,0x0c,0x2c,0x00,0x0b,0x2c,0x00,0x0b,0x2c,0x01,0x0c,0x2c, 0x01,0x83,0x0b,0x2b,0x00,0x03,0x0b,0x2a,0x00,0x0b,0x2a,0x01,0x0b,0x2a,0x00, 0x82,0x0b,0x29,0x00,0x01,0x0b,0x29,0x01,0x82,0x0b,0x28,0x01,0x82,0x0a,0x28, 0x01,0x83,0x0a,0x27,0x01,0x04,0x0a,0x26,0x01,0x09,0x27,0x01,0x0a,0x26,0x01, 0x09,0x26,0x01,0x82,0x0a,0x25,0x01,0x05,0x09,0x25,0x01,0x09,0x25,0x00,0x0a, 0x24,0x01,0x0a,0x24,0x00,0x09,0x24,0x01,0x83,0x09,0x23,0x01,0x82,0x09,0x22, 0x01,0x01,0x08,0x21,0x00,0x82,0x09,0x21,0x01,0x01,0x08,0x20,0x01,0x82,0x09, 0x20,0x01,0x01,0x08,0x20,0x01,0x83,0x08,0x1f,0x01,0x05,0x08,0x1e,0x01,0x08, 0x1f,0x01,0x08,0x1e,0x01,0x07,0x1e,0x00,0x08,0x1d,0x00,0x82,0x08,0x1d,0x01, 0x01,0x07,0x1c,0x00,0x82,0x07,0x1c,0x01,0x82,0x07,0x1b,0x01,0x01,0x07,0x1b, 0x00,0x83,0x07,0x1a,0x01,0x02,0x06,0x1a,0x01,0x06,0x19,0x01,0x82,0x07,0x19, 0x01,0x83,0x06,0x18,0x00,0x82,0x06,0x17,0x00,0x82,0x06,0x17,0x01,0x83,0x06, 0x16,0x00,0x03,0x06,0x15,0x00,0x05,0x15,0x00,0x05,0x15,0x01,0x83,0x05,0x14, 0x00,0x84,0x05,0x13,0x00,0x04,0x05,0x12,0x00,0x04,0x12,0x00,0x05,0x12,0x00, 0x05,0x11,0x00,0x82,0x04,0x11,0x00,0x82,0x04,0x10,0x00,0x84,0x04,0x0f,0x00, 0x02,0x04,0x0e,0x00,0x04,0x0e,0x01,0x82,0x03,0x0e,0x00,0x83,0x03,0x0d,0x00, 0x83,0x03,0x0c,0x00,0x83,0x03,0x0b,0x00,0x83,0x02,0x0a,0x00,0x83,0x02,0x09, 0x00,0x84,0x02,0x08,0x00,0x01,0x02,0x07,0x00,0x82,0x01,0x07,0x00,0x83,0x01, 0x06,0x00,0x84,0x01,0x05,0x00,0x83,0x01,0x04,0x00,0x83,0x00,0x03,0x00,0x84, 0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xdb,0x00,0x00,0x00,0x05,0x43,0xa2,0x24, 0x44,0xa3,0x25,0x44,0xa0,0x23,0x45,0xa1,0x24,0x45,0xa4,0x26,0x83,0x42,0xa1, 0x23,0x03,0x43,0xa2,0x22,0x44,0xa3,0x25,0x43,0xa2,0x24,0x82,0x42,0xa1,0x23, 0x82,0x44,0xa0,0x23,0x0c,0x42,0x9e,0x21,0x43,0xa2,0x22,0x40,0x9f,0x21,0x44, 0xa0,0x23,0x44,0xa0,0x21,0x45,0xa1,0x22,0x43,0xa2,0x24,0x40,0x9e,0x22,0x40, 0x9f,0x21,0x43,0x9f,0x20,0x45,0xa1,0x22,0x43,0x9f,0x22,0x82,0x41,0xa0,0x22, 0x05,0x42,0xa1,0x23,0x40,0x9f,0x21,0x3f,0x9e,0x20,0x41,0x9f,0x23,0x41,0xa0, 0x22,0x82,0x40,0x9f,0x21,0x01,0x42,0xa1,0x23,0x82,0x42,0x9e,0x21,0x09,0x43, 0x9f,0x22,0x40,0x9e,0x22,0x42,0x9e,0x22,0x40,0x9c,0x20,0x3e,0x9c,0x20,0x3f, 0x9d,0x21,0x40,0x9c,0x1f,0x41,0x9d,0x20,0x3f,0x9e,0x20,0x82,0x41,0x9d,0x21, 0x01,0x3f,0x9b,0x1f,0x83,0x40,0x9c,0x20,0x02,0x3f,0x9b,0x1f,0x3f,0x9b,0x1e, 0x82,0x40,0x9c,0x1f,0x02,0x3f,0x9b,0x1e,0x3e,0x9a,0x1d,0x82,0x3f,0x9b,0x1f, 0x01,0x3d,0x99,0x1d,0x82,0x3f,0x9b,0x1f,0x02,0x3e,0x9a,0x1d,0x3c,0x98,0x1b, 0x82,0x3e,0x9a,0x1e,0x03,0x3f,0x9b,0x1e,0x3d,0x99,0x1c,0x3e,0x9a,0x1d,0x82, 0x3c,0x98,0x1c,0x02,0x3d,0x99,0x1d,0x3c,0x98,0x1c,0x82,0x3d,0x99,0x1c,0x02, 0x3c,0x98,0x1c,0x3d,0x99,0x1d,0x82,0x3c,0x98,0x1c,0x0a,0x3b,0x97,0x1b,0x3b, 0x99,0x1d,0x3a,0x98,0x1c,0x3a,0x99,0x1b,0x3b,0x9a,0x1c,0x3a,0x99,0x1b,0x3d, 0x99,0x1d,0x3b,0x97,0x1b,0x3a,0x96,0x19,0x3b,0x97,0x1a,0x82,0x3a,0x96,0x19, 0x03,0x39,0x95,0x19,0x3c,0x98,0x1c,0x3a,0x96,0x1a,0x82,0x39,0x95,0x19,0x82, 0x3b,0x97,0x1a,0x03,0x3a,0x98,0x1c,0x39,0x97,0x1b,0x37,0x93,0x17,0x82,0x39, 0x95,0x19,0x06,0x3c,0x98,0x1c,0x3a,0x96,0x1a,0x39,0x95,0x19,0x3a,0x96,0x1a, 0x36,0x94,0x18,0x38,0x96,0x1c,0x83,0x39,0x95,0x19,0x16,0x3a,0x96,0x1a,0x38, 0x94,0x18,0x3b,0x99,0x1d,0x39,0x95,0x19,0x38,0x94,0x18,0x37,0x93,0x17,0x39, 0x95,0x19,0x36,0x95,0x17,0x38,0x97,0x19,0x3a,0x99,0x1b,0x38,0x97,0x19,0x36, 0x94,0x18,0x39,0x95,0x19,0x36,0x94,0x18,0x38,0x96,0x1a,0x36,0x95,0x17,0x35, 0x94,0x16,0x3a,0x96,0x19,0x37,0x93,0x16,0x35,0x93,0x17,0x36,0x94,0x18,0x38, 0x94,0x18,0x82,0x37,0x93,0x17,0x08,0x38,0x94,0x18,0x34,0x90,0x14,0x34,0x92, 0x16,0x35,0x93,0x17,0x34,0x92,0x16,0x32,0x90,0x16,0x36,0x94,0x18,0x34,0x92, 0x16,0x82,0x35,0x94,0x16,0x03,0x33,0x92,0x14,0x33,0x93,0x15,0x34,0x94,0x16, 0x82,0x34,0x92,0x16,0x01,0x32,0x90,0x14,0x82,0x34,0x92,0x16,0x03,0x35,0x93, 0x17,0x33,0x91,0x15,0x31,0x8f,0x13,0x82,0x35,0x94,0x16,0x01,0x34,0x93,0x15, 0x82,0x33,0x92,0x14,0x0e,0x31,0x91,0x13,0x32,0x92,0x14,0x33,0x93,0x15,0x33, 0x92,0x10,0x32,0x92,0x14,0x33,0x93,0x15,0x31,0x90,0x12,0x32,0x91,0x11,0x32, 0x92,0x14,0x30,0x90,0x13,0x31,0x90,0x12,0x2f,0x8f,0x11,0x32,0x92,0x14,0x30, 0x90,0x12,0x82,0x31,0x91,0x13,0x0a,0x2f,0x8f,0x11,0x30,0x90,0x12,0x32,0x92, 0x14,0x31,0x91,0x13,0x30,0x91,0x10,0x31,0x92,0x11,0x30,0x91,0x10,0x30,0x91, 0x0e,0x30,0x91,0x10,0x33,0x93,0x16,0x82,0x30,0x90,0x12,0x03,0x30,0x91,0x10, 0x2c,0x8f,0x0e,0x2f,0x93,0x0f,0x82,0x2f,0x92,0x11,0x82,0x2f,0x90,0x0f,0x03, 0x2e,0x91,0x10,0x2f,0x93,0x0f,0x30,0x94,0x10,0x82,0x2f,0x93,0x0f,0x83,0x30, 0x94,0x10,0x07,0x2f,0x93,0x0f,0x2e,0x92,0x0e,0x30,0x94,0x10,0x2f,0x93,0x0f, 0x31,0x95,0x11,0x30,0x94,0x10,0x2e,0x92,0x0c,0x82,0x2f,0x93,0x0d,0x03,0x30, 0x94,0x0e,0x2f,0x95,0x0e,0x2e,0x94,0x0c,0x82,0x30,0x96,0x0f,0x82,0x2e,0x94, 0x0d,0x06,0x30,0x96,0x0e,0x32,0x98,0x10,0x30,0x98,0x0f,0x31,0x99,0x0e,0x2f, 0x9a,0x0e,0x32,0x9a,0x0f,0x82,0x33,0x9b,0x10,0x04,0x2f,0x9a,0x0e,0x32,0x9d, 0x0f,0x31,0x9c,0x0e,0x32,0x9d,0x0f,0x84,0x31,0x9c,0x0e,0x01,0x34,0xa0,0x0f, 0x84,0x33,0x9f,0x0e,0x07,0x32,0x9e,0x0d,0x32,0x9f,0x0e,0x33,0xa0,0x11,0x34, 0xa0,0x0e,0x34,0xa0,0x0f,0x34,0xa1,0x10,0x36,0xa2,0x10,0x82,0x35,0xa1,0x0f, 0x02,0x36,0xa4,0x11,0x36,0xa4,0x0f,0x82,0x36,0xa2,0x0e,0x02,0x38,0xa6,0x11, 0x37,0xa5,0x0e,0x82,0x38,0xa6,0x0f,0x04,0x38,0xa5,0x0e,0x39,0xa6,0x0f,0x38, 0xa4,0x10,0x37,0xa5,0x10,0x82,0x37,0xa8,0x10,0x06,0x38,0xa6,0x0f,0x39,0xa6, 0x0d,0x39,0xa8,0x0e,0x3b,0xaa,0x10,0x36,0xa7,0x11,0x39,0xa7,0x10,0x82,0x3a, 0xa9,0x0f,0x0f,0x3b,0xaa,0x10,0x3b,0xa9,0x12,0x3a,0xa8,0x11,0x3b,0xa9,0x12, 0x3c,0xab,0x11,0x3d,0xaa,0x11,0x3c,0xab,0x11,0x3b,0xaa,0x10,0x3b,0xa9,0x12, 0x3c,0xa9,0x12,0x3e,0xab,0x14,0x3d,0xac,0x12,0x3f,0xae,0x14,0x3e,0xad,0x13, 0x3e,0xab,0x12,0x82,0x3f,0xac,0x13,0x82,0x3e,0xad,0x13,0x04,0x3f,0xac,0x13, 0x40,0xad,0x14,0x3f,0xae,0x14,0x3f,0xae,0x12,0x83,0x41,0xae,0x13,0x0a,0x3f, 0xac,0x13,0x41,0xaa,0x13,0x41,0xad,0x13,0x3f,0xac,0x12,0x40,0xad,0x13,0x42, 0xad,0x15,0x41,0xac,0x14,0x3f,0xac,0x13,0x40,0xac,0x14,0x41,0xac,0x13,0x82, 0x40,0xab,0x13,0x0b,0x41,0xab,0x14,0x42,0xac,0x15,0x41,0xa9,0x15,0x40,0xa8, 0x14,0x40,0xa9,0x14,0x3f,0xa8,0x13,0x40,0xa9,0x13,0x42,0xa7,0x13,0x43,0xa8, 0x14,0x41,0xa6,0x13,0x3e,0xa5,0x13,0x82,0x3f,0xa5,0x14,0x82,0x42,0xa5,0x14, 0x0d,0x40,0xa4,0x13,0x41,0xa4,0x15,0x40,0xa3,0x14,0x40,0xa2,0x14,0x41,0xa3, 0x15,0x40,0xa1,0x14,0x3e,0x9f,0x12,0x40,0xa0,0x14,0x42,0xa1,0x17,0x40,0x9f, 0x15,0x3e,0x9d,0x14,0x3f,0x9e,0x15,0x3e,0x9d,0x15,0x82,0x3e,0x9c,0x14,0x0a, 0x3c,0x99,0x12,0x3d,0x9a,0x13,0x3d,0x99,0x13,0x3c,0x99,0x13,0x3a,0x96,0x13, 0x3b,0x95,0x13,0x3b,0x94,0x15,0x38,0x93,0x13,0x39,0x92,0x11,0x38,0x90,0x12, 0x82,0x35,0x8d,0x11,0x12,0x36,0x8b,0x11,0x35,0x8a,0x10,0x35,0x87,0x11,0x34, 0x86,0x10,0x33,0x86,0x10,0x30,0x81,0x0e,0x31,0x82,0x11,0x31,0x80,0x10,0x2f, 0x80,0x0e,0x30,0x80,0x10,0x2e,0x7c,0x0e,0x2f,0x7b,0x0f,0x30,0x7d,0x0f,0x2f, 0x7a,0x0f,0x2f,0x7a,0x12,0x2b,0x75,0x0f,0x24,0x6e,0x09,0x1f,0x69,0x04,0x82, 0x20,0x69,0x05,0x82,0x20,0x67,0x04,0x02,0x1f,0x66,0x05,0x1e,0x65,0x03,0x82, 0x1f,0x65,0x05,0x0a,0x1d,0x62,0x05,0x1c,0x62,0x03,0x1b,0x60,0x03,0x1c,0x60, 0x04,0x1d,0x62,0x06,0x1c,0x61,0x03,0x1c,0x60,0x03,0x1a,0x5e,0x03,0x19,0x5d, 0x03,0x1a,0x5d,0x03,0x82,0x19,0x5c,0x02,0x0f,0x1a,0x5b,0x03,0x19,0x5b,0x03, 0x19,0x59,0x03,0x18,0x5a,0x03,0x19,0x5b,0x03,0x18,0x5a,0x02,0x17,0x5a,0x01, 0x17,0x59,0x01,0x17,0x58,0x02,0x18,0x59,0x03,0x18,0x56,0x02,0x19,0x57,0x02, 0x17,0x57,0x02,0x16,0x56,0x00,0x17,0x56,0x01,0x82,0x16,0x57,0x01,0x03,0x15, 0x54,0x00,0x17,0x53,0x01,0x17,0x53,0x02,0x82,0x16,0x54,0x02,0x01,0x16,0x55, 0x02,0x82,0x17,0x52,0x02,0x01,0x15,0x54,0x01,0x82,0x16,0x53,0x01,0x0d,0x16, 0x52,0x01,0x14,0x52,0x00,0x16,0x50,0x01,0x15,0x51,0x00,0x15,0x52,0x01,0x15, 0x51,0x01,0x16,0x4f,0x02,0x15,0x4e,0x01,0x15,0x50,0x02,0x15,0x50,0x01,0x15, 0x4f,0x01,0x16,0x50,0x02,0x15,0x4f,0x01,0x82,0x15,0x4e,0x02,0x03,0x13,0x4c, 0x01,0x14,0x4b,0x01,0x15,0x4c,0x00,0x82,0x14,0x4e,0x01,0x02,0x14,0x4c,0x01, 0x13,0x4d,0x01,0x82,0x13,0x4c,0x02,0x05,0x14,0x4c,0x03,0x14,0x4b,0x01,0x14, 0x4c,0x00,0x14,0x4b,0x00,0x14,0x4b,0x01,0x82,0x13,0x4b,0x01,0x0d,0x13,0x4a, 0x01,0x14,0x4b,0x02,0x13,0x4a,0x01,0x12,0x49,0x02,0x13,0x48,0x01,0x13,0x49, 0x01,0x12,0x48,0x02,0x13,0x46,0x01,0x13,0x47,0x01,0x13,0x49,0x01,0x12,0x48, 0x01,0x12,0x46,0x01,0x12,0x47,0x01,0x83,0x12,0x46,0x01,0x82,0x13,0x46,0x02, 0x01,0x11,0x44,0x01,0x83,0x13,0x45,0x01,0x01,0x12,0x44,0x00,0x82,0x11,0x44, 0x02,0x05,0x11,0x43,0x00,0x11,0x43,0x01,0x12,0x43,0x01,0x11,0x43,0x01,0x10, 0x42,0x01,0x82,0x11,0x42,0x01,0x09,0x12,0x43,0x01,0x11,0x41,0x01,0x12,0x42, 0x02,0x11,0x41,0x01,0x10,0x40,0x00,0x10,0x40,0x01,0x11,0x3f,0x01,0x0e,0x3f, 0x00,0x10,0x3f,0x01,0x82,0x11,0x3f,0x01,0x02,0x10,0x3e,0x02,0x0f,0x3c,0x01, 0x82,0x10,0x3c,0x01,0x82,0x0f,0x3c,0x01,0x02,0x10,0x3c,0x01,0x0f,0x3c,0x00, 0x82,0x0f,0x3b,0x00,0x02,0x0f,0x3a,0x00,0x0f,0x3a,0x01,0x82,0x0e,0x3a,0x01, 0x06,0x0f,0x39,0x01,0x0f,0x3a,0x01,0x0f,0x39,0x01,0x0e,0x37,0x00,0x0e,0x38, 0x01,0x0d,0x37,0x00,0x83,0x0e,0x37,0x01,0x05,0x0e,0x36,0x01,0x0e,0x36,0x00, 0x0d,0x36,0x00,0x0d,0x37,0x00,0x0d,0x35,0x00,0x82,0x0e,0x35,0x00,0x82,0x0d, 0x35,0x00,0x05,0x0d,0x34,0x01,0x0d,0x34,0x00,0x0e,0x33,0x01,0x0d,0x33,0x01, 0x0d,0x32,0x00,0x82,0x0d,0x33,0x00,0x03,0x0b,0x32,0x00,0x0c,0x32,0x01,0x0d, 0x32,0x01,0x82,0x0d,0x31,0x01,0x02,0x0d,0x30,0x00,0x0c,0x30,0x00,0x82,0x0d, 0x30,0x01,0x06,0x0c,0x2f,0x00,0x0c,0x30,0x01,0x0c,0x2f,0x01,0x0c,0x2e,0x01, 0x0b,0x2e,0x01,0x0c,0x2e,0x01,0x83,0x0c,0x2d,0x01,0x83,0x0c,0x2c,0x01,0x03, 0x0b,0x2c,0x01,0x0a,0x2c,0x00,0x0b,0x2c,0x01,0x82,0x0b,0x2b,0x01,0x04,0x0b, 0x2a,0x00,0x0b,0x29,0x01,0x0a,0x2a,0x01,0x0b,0x2a,0x01,0x82,0x0b,0x29,0x01, 0x06,0x0b,0x29,0x00,0x0a,0x28,0x00,0x0a,0x29,0x01,0x0a,0x27,0x00,0x09,0x27, 0x00,0x0a,0x27,0x01,0x82,0x0a,0x26,0x01,0x09,0x0a,0x25,0x00,0x0a,0x25,0x01, 0x0a,0x26,0x00,0x09,0x25,0x01,0x09,0x24,0x01,0x09,0x24,0x00,0x09,0x24,0x01, 0x09,0x23,0x00,0x09,0x23,0x01,0x82,0x09,0x23,0x00,0x02,0x09,0x23,0x01,0x09, 0x22,0x00,0x82,0x09,0x22,0x01,0x01,0x09,0x21,0x01,0x82,0x08,0x21,0x01,0x82, 0x09,0x20,0x01,0x82,0x08,0x20,0x01,0x02,0x08,0x1f,0x01,0x08,0x1e,0x00,0x82, 0x08,0x1e,0x01,0x02,0x09,0x1e,0x01,0x08,0x1e,0x01,0x83,0x08,0x1d,0x01,0x01, 0x07,0x1d,0x01,0x82,0x07,0x1c,0x01,0x82,0x07,0x1b,0x00,0x82,0x07,0x1b,0x01, 0x01,0x07,0x1a,0x00,0x82,0x07,0x1a,0x01,0x82,0x07,0x19,0x01,0x02,0x06,0x19, 0x01,0x07,0x18,0x01,0x82,0x06,0x18,0x00,0x02,0x06,0x18,0x01,0x06,0x17,0x00, 0x82,0x06,0x17,0x01,0x82,0x06,0x16,0x01,0x03,0x06,0x16,0x00,0x06,0x16,0x01, 0x05,0x15,0x00,0x82,0x05,0x15,0x01,0x82,0x05,0x14,0x00,0x84,0x05,0x13,0x00, 0x82,0x05,0x12,0x00,0x82,0x05,0x11,0x00,0x82,0x04,0x11,0x00,0x82,0x04,0x10, 0x00,0x84,0x04,0x0f,0x00,0x02,0x04,0x0e,0x00,0x04,0x0e,0x01,0x82,0x03,0x0e, 0x00,0x83,0x03,0x0d,0x00,0x83,0x03,0x0c,0x00,0x83,0x03,0x0b,0x00,0x83,0x02, 0x0a,0x00,0x83,0x02,0x09,0x00,0x84,0x02,0x08,0x00,0x82,0x02,0x07,0x00,0x01, 0x01,0x07,0x00,0x84,0x01,0x06,0x00,0x83,0x01,0x05,0x00,0x83,0x01,0x04,0x00, 0x01,0x01,0x03,0x00,0x82,0x00,0x03,0x00,0x84,0x00,0x02,0x00,0x83,0x00,0x01, 0x00,0xdb,0x00,0x00,0x00,0x02,0x45,0xa4,0x24,0x45,0xa4,0x26,0x82,0x43,0xa2, 0x24,0x08,0x46,0xa5,0x27,0x45,0xa4,0x26,0x44,0xa3,0x25,0x42,0xa1,0x21,0x44, 0xa5,0x24,0x44,0xa3,0x23,0x44,0xa3,0x25,0x42,0xa1,0x23,0x82,0x44,0xa3,0x23, 0x07,0x43,0xa2,0x22,0x44,0xa3,0x25,0x44,0xa3,0x23,0x42,0xa1,0x21,0x41,0xa0, 0x22,0x43,0x9f,0x22,0x45,0xa1,0x24,0x82,0x43,0x9f,0x22,0x03,0x44,0xa0,0x23, 0x40,0x9f,0x21,0x41,0xa0,0x22,0x84,0x42,0xa1,0x23,0x0d,0x43,0xa2,0x24,0x44, 0xa0,0x23,0x41,0xa1,0x23,0x41,0xa0,0x20,0x43,0x9f,0x20,0x40,0x9f,0x21,0x42, 0xa1,0x23,0x40,0x9c,0x1f,0x41,0xa0,0x22,0x3f,0x9f,0x21,0x40,0x9f,0x21,0x41, 0xa0,0x22,0x3f,0x9e,0x20,0x82,0x42,0x9e,0x21,0x01,0x41,0x9d,0x20,0x82,0x3f, 0x9e,0x20,0x0a,0x3f,0x9d,0x21,0x40,0x9f,0x21,0x3f,0x9e,0x20,0x40,0x9e,0x22, 0x41,0xa0,0x20,0x40,0x9f,0x21,0x3f,0x9d,0x21,0x3f,0x9e,0x20,0x3e,0x9c,0x20, 0x3f,0x9d,0x21,0x82,0x40,0x9c,0x20,0x02,0x3f,0x9b,0x1f,0x3e,0x9a,0x1d,0x82, 0x3c,0x9b,0x1d,0x02,0x3f,0x9b,0x1f,0x3d,0x99,0x1d,0x82,0x3c,0x98,0x1b,0x08, 0x3f,0x9b,0x1e,0x40,0x9c,0x1f,0x3b,0x99,0x1d,0x3c,0x9a,0x1e,0x3e,0x9d,0x1f, 0x3a,0x99,0x1b,0x3d,0x99,0x1c,0x3f,0x9b,0x1e,0x82,0x3e,0x9a,0x1d,0x82,0x3a, 0x98,0x1c,0x04,0x3e,0x9a,0x1e,0x3c,0x98,0x1c,0x3b,0x95,0x1a,0x3d,0x99,0x1d, 0x82,0x3d,0x99,0x1c,0x0d,0x3b,0x9a,0x1c,0x39,0x98,0x1a,0x3d,0x97,0x1b,0x3d, 0x99,0x1c,0x3b,0x9a,0x1c,0x3a,0x96,0x19,0x3d,0x97,0x1b,0x3b,0x97,0x1a,0x39, 0x95,0x18,0x3b,0x97,0x1a,0x3c,0x98,0x1b,0x3a,0x96,0x1a,0x3b,0x97,0x1b,0x82, 0x3c,0x98,0x1c,0x05,0x3a,0x96,0x1a,0x3c,0x98,0x1c,0x38,0x96,0x1a,0x3b,0x9a, 0x1c,0x39,0x97,0x1b,0x82,0x39,0x98,0x1a,0x05,0x3c,0x98,0x1c,0x3a,0x95,0x1c, 0x37,0x92,0x19,0x39,0x95,0x19,0x39,0x93,0x18,0x82,0x39,0x97,0x1b,0x02,0x3a, 0x96,0x1a,0x38,0x94,0x18,0x82,0x39,0x97,0x1b,0x15,0x39,0x95,0x19,0x37,0x96, 0x18,0x37,0x95,0x19,0x35,0x93,0x19,0x38,0x96,0x1a,0x38,0x97,0x19,0x3a,0x99, 0x1b,0x37,0x95,0x19,0x35,0x93,0x17,0x37,0x95,0x19,0x39,0x95,0x18,0x37,0x93, 0x17,0x36,0x94,0x18,0x36,0x95,0x17,0x38,0x97,0x19,0x36,0x95,0x17,0x39,0x98, 0x18,0x36,0x95,0x17,0x38,0x94,0x17,0x36,0x92,0x16,0x35,0x91,0x15,0x82,0x34, 0x93,0x15,0x0a,0x38,0x97,0x19,0x34,0x93,0x15,0x33,0x92,0x14,0x36,0x95,0x17, 0x33,0x92,0x14,0x36,0x95,0x17,0x34,0x94,0x16,0x35,0x94,0x16,0x34,0x93,0x15, 0x35,0x94,0x14,0x82,0x35,0x94,0x16,0x09,0x36,0x95,0x17,0x35,0x94,0x16,0x33, 0x92,0x14,0x36,0x95,0x17,0x35,0x94,0x16,0x32,0x91,0x13,0x32,0x91,0x11,0x35, 0x94,0x14,0x33,0x92,0x12,0x83,0x33,0x93,0x15,0x12,0x31,0x91,0x13,0x32,0x93, 0x12,0x34,0x93,0x15,0x32,0x92,0x15,0x32,0x92,0x14,0x32,0x93,0x12,0x31,0x91, 0x14,0x34,0x94,0x16,0x2f,0x90,0x0f,0x30,0x8f,0x11,0x30,0x90,0x12,0x33,0x93, 0x15,0x31,0x91,0x13,0x33,0x93,0x15,0x31,0x91,0x13,0x30,0x90,0x12,0x32,0x92, 0x14,0x31,0x91,0x13,0x82,0x31,0x92,0x11,0x01,0x32,0x93,0x12,0x82,0x31,0x92, 0x11,0x09,0x30,0x91,0x10,0x2e,0x91,0x10,0x30,0x93,0x12,0x33,0x94,0x13,0x2f, 0x92,0x11,0x30,0x94,0x10,0x31,0x94,0x13,0x2f,0x92,0x11,0x2f,0x93,0x0f,0x82, 0x32,0x93,0x12,0x03,0x2d,0x90,0x0f,0x2f,0x92,0x11,0x30,0x93,0x12,0x82,0x2f, 0x92,0x11,0x07,0x2f,0x93,0x0f,0x2e,0x92,0x0e,0x30,0x94,0x10,0x2e,0x92,0x0e, 0x2f,0x93,0x0f,0x2f,0x92,0x11,0x30,0x94,0x10,0x82,0x2f,0x93,0x0d,0x82,0x2f, 0x93,0x0f,0x01,0x2d,0x93,0x0c,0x82,0x2f,0x95,0x0e,0x1a,0x2d,0x93,0x0c,0x2c, 0x92,0x0b,0x2e,0x94,0x0d,0x30,0x96,0x0f,0x2e,0x94,0x0c,0x31,0x95,0x0e,0x2f, 0x97,0x0e,0x30,0x96,0x0e,0x31,0x97,0x0f,0x31,0x99,0x10,0x2f,0x97,0x0e,0x31, 0x97,0x0f,0x30,0x98,0x0f,0x32,0x98,0x0e,0x32,0x9a,0x0f,0x32,0x9d,0x0f,0x2f, 0x9c,0x0b,0x30,0x9d,0x0c,0x32,0x9d,0x0f,0x31,0x9a,0x0c,0x33,0x9c,0x0e,0x33, 0x9f,0x0e,0x32,0x9e,0x0d,0x33,0x9f,0x0e,0x34,0xa0,0x0f,0x31,0x9d,0x0c,0x82, 0x32,0x9e,0x0d,0x0b,0x33,0xa0,0x0f,0x36,0xa2,0x11,0x33,0x9f,0x0d,0x34,0xa0, 0x0e,0x36,0xa2,0x0e,0x35,0xa1,0x0f,0x34,0xa0,0x0f,0x35,0xa1,0x10,0x34,0xa0, 0x0e,0x33,0xa1,0x0e,0x35,0xa1,0x0f,0x82,0x35,0xa3,0x0e,0x01,0x38,0xa4,0x10, 0x83,0x37,0xa5,0x10,0x01,0x38,0xa6,0x11,0x84,0x38,0xa6,0x0f,0x01,0x37,0xa5, 0x0e,0x82,0x3a,0xa7,0x10,0x05,0x38,0xa6,0x0f,0x39,0xa7,0x10,0x3a,0xa8,0x11, 0x39,0xa8,0x0e,0x3a,0xa9,0x0f,0x82,0x3b,0xaa,0x10,0x02,0x3c,0xaa,0x13,0x39, 0xaa,0x10,0x82,0x3c,0xab,0x0f,0x16,0x3e,0xab,0x10,0x3d,0xac,0x12,0x3c,0xab, 0x11,0x3b,0xa9,0x12,0x3c,0xa8,0x14,0x3b,0xac,0x12,0x3c,0xab,0x11,0x3d,0xac, 0x12,0x3c,0xae,0x11,0x3d,0xaf,0x12,0x3f,0xac,0x11,0x3f,0xac,0x13,0x3f,0xae, 0x14,0x3d,0xaf,0x12,0x41,0xae,0x13,0x3f,0xae,0x12,0x41,0xb0,0x14,0x41,0xae, 0x13,0x3f,0xac,0x11,0x41,0xb0,0x14,0x41,0xad,0x13,0x3d,0xae,0x12,0x82,0x41, 0xae,0x13,0x82,0x40,0xad,0x13,0x01,0x41,0xad,0x13,0x82,0x42,0xad,0x14,0x02, 0x41,0xab,0x15,0x40,0xaa,0x14,0x82,0x41,0xab,0x14,0x14,0x41,0xaa,0x14,0x40, 0xa9,0x13,0x40,0xa9,0x15,0x3e,0xa8,0x14,0x40,0xa9,0x13,0x41,0xa9,0x14,0x40, 0xa8,0x13,0x40,0xa7,0x13,0x40,0xa8,0x14,0x41,0xa7,0x16,0x3e,0xa4,0x13,0x3f, 0xa5,0x14,0x40,0xa6,0x14,0x3f,0xa5,0x13,0x41,0xa4,0x15,0x40,0xa3,0x14,0x3f, 0xa3,0x15,0x3e,0xa2,0x14,0x3d,0xa1,0x13,0x40,0xa2,0x14,0x82,0x40,0xa1,0x14, 0x01,0x42,0xa2,0x16,0x82,0x3f,0x9f,0x13,0x09,0x3e,0x9e,0x13,0x3e,0x9d,0x15, 0x3f,0x9d,0x15,0x3d,0x9b,0x14,0x3c,0x9a,0x13,0x3d,0x99,0x15,0x3c,0x97,0x14, 0x3a,0x96,0x13,0x3b,0x96,0x14,0x82,0x3a,0x95,0x13,0x12,0x3b,0x95,0x14,0x37, 0x91,0x12,0x37,0x8f,0x13,0x36,0x8e,0x12,0x37,0x8c,0x11,0x36,0x8b,0x11,0x35, 0x89,0x10,0x34,0x89,0x10,0x33,0x87,0x12,0x31,0x84,0x0e,0x31,0x83,0x0e,0x30, 0x81,0x0f,0x2f,0x80,0x0e,0x32,0x82,0x10,0x2e,0x7e,0x0d,0x2d,0x7d,0x0e,0x31, 0x7e,0x11,0x2f,0x7c,0x0f,0x82,0x2f,0x7c,0x11,0x02,0x2e,0x79,0x0f,0x27,0x71, 0x09,0x82,0x20,0x69,0x04,0x06,0x21,0x68,0x05,0x20,0x67,0x04,0x21,0x67,0x05, 0x20,0x66,0x06,0x1f,0x66,0x06,0x1d,0x64,0x04,0x82,0x1d,0x63,0x03,0x01,0x1d, 0x62,0x03,0x82,0x1c,0x61,0x03,0x02,0x1c,0x61,0x05,0x1c,0x5f,0x04,0x83,0x1b, 0x5e,0x03,0x82,0x1a,0x5d,0x03,0x01,0x19,0x5b,0x03,0x82,0x19,0x5b,0x02,0x82, 0x18,0x5a,0x02,0x03,0x18,0x59,0x01,0x18,0x5a,0x03,0x18,0x59,0x02,0x82,0x17, 0x58,0x01,0x02,0x18,0x58,0x02,0x19,0x57,0x02,0x82,0x18,0x55,0x02,0x83,0x17, 0x56,0x01,0x10,0x16,0x55,0x00,0x16,0x54,0x00,0x16,0x55,0x01,0x16,0x55,0x02, 0x15,0x53,0x01,0x16,0x55,0x02,0x16,0x54,0x01,0x17,0x54,0x02,0x15,0x52,0x02, 0x15,0x52,0x00,0x16,0x53,0x01,0x14,0x52,0x00,0x16,0x52,0x02,0x16,0x50,0x01, 0x16,0x50,0x02,0x16,0x50,0x00,0x83,0x15,0x51,0x01,0x0c,0x15,0x50,0x01,0x14, 0x50,0x01,0x14,0x4e,0x01,0x15,0x4f,0x02,0x15,0x4f,0x03,0x15,0x50,0x01,0x14, 0x4f,0x01,0x14,0x4d,0x00,0x16,0x4d,0x02,0x16,0x4c,0x02,0x13,0x4c,0x01,0x14, 0x4c,0x01,0x82,0x15,0x4d,0x01,0x07,0x14,0x4d,0x01,0x13,0x4c,0x01,0x13,0x4b, 0x01,0x13,0x4b,0x02,0x13,0x4b,0x01,0x14,0x4b,0x01,0x14,0x4a,0x01,0x82,0x14, 0x4b,0x00,0x82,0x14,0x4b,0x02,0x09,0x12,0x49,0x01,0x12,0x49,0x00,0x12,0x48, 0x02,0x13,0x47,0x01,0x13,0x48,0x00,0x12,0x48,0x01,0x13,0x48,0x01,0x13,0x47, 0x01,0x13,0x47,0x02,0x82,0x12,0x47,0x01,0x02,0x12,0x46,0x01,0x13,0x45,0x01, 0x82,0x12,0x45,0x01,0x01,0x13,0x46,0x02,0x84,0x12,0x44,0x01,0x82,0x12,0x44, 0x02,0x0d,0x11,0x42,0x01,0x11,0x43,0x01,0x12,0x43,0x02,0x11,0x42,0x00,0x10, 0x42,0x00,0x11,0x43,0x01,0x11,0x42,0x01,0x12,0x42,0x01,0x11,0x42,0x01,0x11, 0x41,0x01,0x11,0x42,0x01,0x11,0x40,0x01,0x11,0x41,0x01,0x82,0x10,0x40,0x01, 0x82,0x10,0x3e,0x00,0x83,0x10,0x3e,0x01,0x02,0x10,0x3d,0x00,0x10,0x3d,0x01, 0x82,0x10,0x3d,0x02,0x01,0x0e,0x3b,0x00,0x82,0x0f,0x3b,0x00,0x01,0x10,0x3c, 0x01,0x82,0x0f,0x3b,0x00,0x82,0x0f,0x3a,0x01,0x82,0x0f,0x39,0x01,0x09,0x0e, 0x39,0x01,0x0e,0x39,0x00,0x0f,0x39,0x00,0x0f,0x39,0x01,0x0e,0x38,0x00,0x0e, 0x37,0x01,0x0e,0x37,0x00,0x0e,0x38,0x00,0x0e,0x37,0x00,0x82,0x0d,0x36,0x00, 0x04,0x0e,0x36,0x00,0x0d,0x35,0x00,0x0e,0x36,0x00,0x0e,0x36,0x01,0x82,0x0d, 0x35,0x00,0x03,0x0d,0x33,0x00,0x0d,0x34,0x01,0x0d,0x33,0x01,0x82,0x0d,0x33, 0x00,0x04,0x0c,0x32,0x00,0x0c,0x32,0x01,0x0d,0x32,0x01,0x0d,0x31,0x01,0x82, 0x0d,0x31,0x00,0x01,0x0c,0x31,0x00,0x82,0x0c,0x30,0x00,0x04,0x0d,0x30,0x00, 0x0d,0x30,0x01,0x0c,0x2f,0x01,0x0c,0x2f,0x00,0x82,0x0c,0x2e,0x00,0x01,0x0c, 0x2d,0x01,0x83,0x0c,0x2e,0x01,0x04,0x0c,0x2d,0x00,0x0b,0x2d,0x01,0x0b,0x2c, 0x00,0x0b,0x2c,0x01,0x82,0x0b,0x2b,0x01,0x05,0x0b,0x2b,0x00,0x0b,0x2c,0x00, 0x0b,0x2b,0x00,0x0b,0x2a,0x00,0x0b,0x2a,0x01,0x83,0x0a,0x29,0x01,0x82,0x0b, 0x29,0x01,0x01,0x0a,0x28,0x01,0x82,0x0a,0x27,0x01,0x04,0x09,0x28,0x01,0x0a, 0x28,0x01,0x0a,0x27,0x01,0x0a,0x27,0x00,0x82,0x0a,0x26,0x00,0x02,0x0a,0x25, 0x00,0x0a,0x24,0x01,0x82,0x09,0x24,0x00,0x03,0x09,0x24,0x01,0x09,0x23,0x00, 0x0a,0x23,0x00,0x83,0x09,0x23,0x01,0x82,0x09,0x22,0x01,0x82,0x09,0x21,0x01, 0x01,0x08,0x21,0x01,0x82,0x09,0x20,0x01,0x01,0x08,0x1f,0x00,0x82,0x08,0x20, 0x01,0x82,0x08,0x1f,0x01,0x01,0x08,0x1f,0x00,0x82,0x08,0x1e,0x01,0x02,0x08, 0x1d,0x00,0x08,0x1e,0x01,0x83,0x08,0x1d,0x01,0x02,0x07,0x1c,0x01,0x08,0x1c, 0x01,0x82,0x07,0x1b,0x01,0x02,0x07,0x1b,0x00,0x07,0x1b,0x01,0x83,0x07,0x1a, 0x01,0x01,0x07,0x19,0x00,0x82,0x07,0x19,0x01,0x05,0x06,0x19,0x01,0x06,0x18, 0x01,0x06,0x18,0x00,0x06,0x17,0x00,0x06,0x18,0x01,0x83,0x06,0x17,0x01,0x01, 0x06,0x16,0x01,0x82,0x05,0x16,0x00,0x02,0x05,0x15,0x00,0x05,0x15,0x01,0x84, 0x05,0x14,0x01,0x02,0x05,0x13,0x01,0x05,0x13,0x00,0x83,0x05,0x12,0x00,0x83, 0x04,0x11,0x00,0x84,0x04,0x10,0x00,0x83,0x04,0x0f,0x00,0x83,0x04,0x0e,0x00, 0x84,0x03,0x0d,0x00,0x83,0x03,0x0c,0x00,0x83,0x03,0x0b,0x00,0x01,0x02,0x0b, 0x00,0x82,0x02,0x0a,0x00,0x84,0x02,0x09,0x00,0x83,0x02,0x08,0x00,0x82,0x02, 0x07,0x00,0x82,0x01,0x07,0x00,0x83,0x01,0x06,0x00,0x83,0x01,0x05,0x00,0x83, 0x01,0x04,0x00,0x01,0x01,0x03,0x00,0x82,0x00,0x03,0x00,0x84,0x00,0x02,0x00, 0x83,0x00,0x01,0x00,0xdb,0x00,0x00,0x00,0x82,0x45,0xa4,0x24,0x06,0x44,0xa3, 0x23,0x43,0xa2,0x24,0x44,0xa3,0x25,0x48,0xa7,0x27,0x43,0xa2,0x22,0x44,0xa3, 0x23,0x82,0x45,0xa4,0x24,0x02,0x43,0xa2,0x24,0x44,0xa3,0x25,0x82,0x44,0xa3, 0x23,0x0b,0x47,0xa6,0x26,0x45,0xa4,0x26,0x45,0xa4,0x24,0x46,0xa5,0x25,0x43, 0xa2,0x22,0x44,0xa3,0x23,0x45,0xa4,0x24,0x42,0xa1,0x21,0x46,0xa5,0x25,0x44, 0xa3,0x23,0x43,0xa2,0x24,0x83,0x44,0xa3,0x23,0x01,0x43,0xa2,0x24,0x82,0x41, 0xa0,0x22,0x02,0x43,0x9f,0x20,0x42,0xa1,0x23,0x82,0x42,0xa1,0x21,0x05,0x41, 0x9d,0x20,0x42,0x9e,0x21,0x41,0xa0,0x22,0x40,0x9f,0x21,0x3f,0x9e,0x20,0x82, 0x41,0xa0,0x22,0x0c,0x3f,0x9e,0x20,0x41,0xa0,0x22,0x45,0xa1,0x24,0x40,0x9f, 0x21,0x3f,0x9e,0x20,0x40,0x9f,0x21,0x43,0x9d,0x21,0x42,0x9e,0x21,0x41,0xa0, 0x22,0x40,0x9f,0x21,0x3e,0x9d,0x1f,0x3f,0x9e,0x20,0x82,0x41,0x9d,0x20,0x01, 0x40,0x9f,0x21,0x83,0x40,0x9c,0x1f,0x0b,0x41,0x9d,0x20,0x40,0x9c,0x1f,0x3f, 0x9b,0x1e,0x3f,0x9e,0x20,0x3f,0x9b,0x1e,0x40,0x9c,0x1f,0x41,0x9d,0x20,0x3f, 0x9b,0x1e,0x40,0x9c,0x1f,0x3f,0x9b,0x1e,0x3c,0x9b,0x1d,0x83,0x3d,0x9c,0x1e, 0x01,0x3e,0x9a,0x1d,0x82,0x3f,0x9b,0x1e,0x0e,0x40,0x9c,0x1f,0x3d,0x9c,0x1e, 0x3b,0x9a,0x1c,0x3e,0x9a,0x1d,0x3b,0x97,0x1b,0x3c,0x98,0x1c,0x40,0x9c,0x20, 0x3d,0x99,0x1c,0x3a,0x99,0x1b,0x3c,0x9b,0x1d,0x3b,0x9a,0x1c,0x3e,0x9a,0x1d, 0x3d,0x99,0x1c,0x3e,0x9a,0x1d,0x82,0x3d,0x99,0x1c,0x06,0x3b,0x9a,0x1c,0x3c, 0x98,0x1b,0x3a,0x96,0x19,0x39,0x98,0x1a,0x3c,0x98,0x1b,0x3d,0x99,0x1d,0x82, 0x3b,0x95,0x1a,0x03,0x3c,0x98,0x1c,0x3c,0x9a,0x1e,0x39,0x98,0x1a,0x84,0x3b, 0x97,0x1a,0x01,0x3a,0x96,0x19,0x82,0x39,0x95,0x19,0x82,0x3b,0x97,0x1b,0x17, 0x3a,0x96,0x1a,0x38,0x96,0x1a,0x3d,0x99,0x1d,0x39,0x97,0x1b,0x38,0x96,0x1a, 0x36,0x95,0x17,0x39,0x95,0x18,0x3a,0x99,0x19,0x37,0x95,0x19,0x38,0x96,0x1a, 0x39,0x97,0x1b,0x37,0x96,0x18,0x38,0x97,0x19,0x3a,0x99,0x1b,0x37,0x96,0x18, 0x39,0x98,0x1a,0x36,0x92,0x15,0x38,0x94,0x17,0x36,0x94,0x18,0x37,0x96,0x18, 0x36,0x95,0x17,0x37,0x93,0x16,0x37,0x96,0x16,0x82,0x37,0x96,0x18,0x0b,0x37, 0x93,0x16,0x36,0x95,0x17,0x38,0x97,0x19,0x35,0x94,0x16,0x39,0x98,0x1a,0x35, 0x94,0x16,0x37,0x93,0x16,0x37,0x97,0x19,0x35,0x95,0x17,0x39,0x95,0x18,0x35, 0x94,0x16,0x82,0x34,0x94,0x16,0x10,0x33,0x92,0x14,0x32,0x91,0x13,0x35,0x94, 0x16,0x38,0x97,0x19,0x35,0x94,0x14,0x34,0x93,0x13,0x35,0x94,0x16,0x34,0x93, 0x15,0x33,0x92,0x14,0x36,0x95,0x15,0x35,0x94,0x14,0x33,0x94,0x13,0x35,0x96, 0x15,0x32,0x92,0x14,0x35,0x95,0x17,0x32,0x93,0x12,0x82,0x33,0x94,0x13,0x08, 0x32,0x92,0x14,0x31,0x91,0x13,0x32,0x93,0x12,0x32,0x92,0x14,0x31,0x91,0x13, 0x31,0x92,0x11,0x31,0x91,0x13,0x30,0x91,0x10,0x82,0x31,0x92,0x11,0x05,0x33, 0x94,0x13,0x31,0x92,0x11,0x33,0x94,0x11,0x31,0x92,0x0f,0x32,0x93,0x10,0x82, 0x30,0x91,0x10,0x01,0x31,0x92,0x11,0x83,0x32,0x93,0x12,0x0b,0x30,0x93,0x12, 0x2f,0x92,0x11,0x30,0x91,0x10,0x31,0x92,0x0f,0x33,0x94,0x13,0x32,0x93,0x10, 0x2f,0x90,0x0d,0x2f,0x90,0x0f,0x31,0x92,0x0f,0x32,0x93,0x12,0x30,0x93,0x12, 0x82,0x2f,0x92,0x11,0x82,0x30,0x93,0x12,0x01,0x2f,0x93,0x0f,0x82,0x30,0x94, 0x10,0x01,0x32,0x93,0x10,0x82,0x2e,0x92,0x0e,0x01,0x2f,0x93,0x0f,0x82,0x2f, 0x93,0x0d,0x03,0x31,0x95,0x0f,0x30,0x94,0x10,0x2e,0x94,0x0d,0x82,0x2f,0x95, 0x0e,0x82,0x2e,0x94,0x0d,0x0e,0x2f,0x95,0x0e,0x30,0x96,0x0f,0x2f,0x95,0x0d, 0x30,0x94,0x0d,0x31,0x97,0x0f,0x30,0x96,0x0e,0x31,0x97,0x0f,0x30,0x98,0x0f, 0x30,0x96,0x0e,0x31,0x97,0x0f,0x31,0x99,0x10,0x32,0x9a,0x0f,0x33,0x9c,0x0e, 0x30,0x9b,0x0d,0x82,0x31,0x9c,0x0e,0x01,0x30,0x9b,0x0d,0x82,0x34,0x9d,0x0f, 0x02,0x31,0x9d,0x0c,0x32,0x9e,0x0d,0x85,0x33,0x9f,0x0e,0x06,0x32,0x9f,0x0e, 0x31,0x9e,0x0f,0x33,0x9f,0x0d,0x36,0xa2,0x10,0x33,0x9f,0x0e,0x32,0x9e,0x0d, 0x82,0x35,0xa1,0x0f,0x05,0x37,0xa0,0x0f,0x35,0xa1,0x0f,0x33,0xa1,0x0e,0x34, 0xa0,0x0e,0x35,0xa1,0x0d,0x82,0x35,0xa3,0x0e,0x02,0x36,0xa2,0x0e,0x35,0xa3, 0x0e,0x82,0x36,0xa4,0x0f,0x82,0x36,0xa4,0x0d,0x83,0x38,0xa6,0x0f,0x05,0x3a, 0xa7,0x10,0x37,0xa5,0x0e,0x39,0xa7,0x10,0x39,0xa8,0x0e,0x3a,0xa9,0x0f,0x82, 0x39,0xa8,0x0e,0x82,0x3a,0xa9,0x0f,0x05,0x38,0xa9,0x0f,0x3c,0xab,0x11,0x3c, 0xab,0x0f,0x3d,0xaa,0x0f,0x3c,0xab,0x0f,0x82,0x3b,0xaa,0x10,0x01,0x3c,0xa9, 0x12,0x82,0x3d,0xac,0x12,0x03,0x3d,0xac,0x10,0x3e,0xad,0x11,0x3f,0xae,0x12, 0x82,0x3d,0xac,0x10,0x02,0x3f,0xae,0x12,0x3e,0xb0,0x13,0x83,0x3f,0xae,0x12, 0x01,0x41,0xae,0x13,0x82,0x3f,0xae,0x12,0x82,0x40,0xae,0x13,0x2a,0x3f,0xac, 0x12,0x40,0xad,0x12,0x41,0xae,0x14,0x42,0xaf,0x15,0x40,0xad,0x13,0x40,0xab, 0x12,0x41,0xac,0x13,0x40,0xa9,0x13,0x3f,0xaa,0x12,0x41,0xab,0x14,0x40,0xab, 0x14,0x40,0xaa,0x14,0x41,0xaa,0x14,0x3f,0xa9,0x13,0x3f,0xa9,0x14,0x3f,0xa8, 0x13,0x40,0xa8,0x13,0x41,0xa9,0x14,0x40,0xa7,0x13,0x3e,0xa6,0x12,0x41,0xa8, 0x15,0x41,0xa7,0x16,0x3f,0xa5,0x14,0x40,0xa6,0x14,0x3e,0xa4,0x12,0x40,0xa3, 0x13,0x40,0xa3,0x14,0x3f,0xa4,0x14,0x3f,0xa3,0x15,0x3e,0xa1,0x14,0x3e,0xa0, 0x13,0x40,0xa1,0x14,0x3f,0xa0,0x13,0x41,0xa1,0x15,0x3f,0x9f,0x13,0x3f,0xa0, 0x14,0x3e,0x9e,0x13,0x3c,0x9c,0x11,0x40,0x9d,0x16,0x3e,0x9c,0x15,0x3d,0x9b, 0x14,0x3d,0x9a,0x14,0x82,0x3c,0x99,0x13,0x1b,0x3d,0x99,0x14,0x3c,0x98,0x13, 0x3c,0x97,0x13,0x3c,0x96,0x13,0x3b,0x94,0x13,0x39,0x91,0x13,0x37,0x8f,0x11, 0x37,0x8e,0x11,0x37,0x8f,0x12,0x35,0x8d,0x11,0x34,0x8a,0x11,0x34,0x88,0x11, 0x32,0x85,0x0f,0x33,0x85,0x10,0x32,0x83,0x10,0x2f,0x80,0x0e,0x31,0x82,0x0e, 0x31,0x81,0x0f,0x31,0x81,0x11,0x30,0x7e,0x0f,0x2f,0x7c,0x0e,0x2f,0x7b,0x0e, 0x2e,0x7a,0x0f,0x30,0x7b,0x11,0x31,0x7b,0x13,0x2c,0x76,0x0e,0x22,0x6b,0x06, 0x82,0x20,0x67,0x04,0x05,0x21,0x67,0x05,0x20,0x66,0x04,0x20,0x67,0x07,0x1f, 0x66,0x07,0x1f,0x64,0x05,0x83,0x1e,0x64,0x05,0x82,0x1c,0x61,0x03,0x02,0x1c, 0x60,0x05,0x1b,0x5f,0x04,0x84,0x1a,0x5d,0x03,0x02,0x1a,0x5c,0x03,0x19,0x5c, 0x03,0x83,0x19,0x5b,0x03,0x09,0x18,0x5a,0x02,0x18,0x59,0x03,0x19,0x58,0x02, 0x1a,0x59,0x02,0x17,0x58,0x01,0x18,0x58,0x02,0x19,0x57,0x02,0x18,0x56,0x02, 0x17,0x57,0x02,0x82,0x17,0x56,0x01,0x0a,0x17,0x57,0x02,0x17,0x56,0x02,0x17, 0x55,0x01,0x16,0x55,0x01,0x16,0x55,0x02,0x16,0x54,0x02,0x17,0x55,0x03,0x16, 0x55,0x02,0x16,0x53,0x01,0x15,0x52,0x02,0x82,0x16,0x53,0x01,0x11,0x15,0x52, 0x00,0x14,0x51,0x01,0x17,0x51,0x02,0x16,0x51,0x02,0x15,0x52,0x02,0x17,0x51, 0x01,0x14,0x50,0x00,0x15,0x4f,0x00,0x14,0x51,0x02,0x16,0x4f,0x02,0x13,0x4f, 0x01,0x15,0x4f,0x02,0x14,0x4e,0x01,0x15,0x4e,0x01,0x14,0x4d,0x00,0x15,0x4e, 0x01,0x14,0x4d,0x00,0x82,0x14,0x4c,0x01,0x02,0x14,0x4d,0x02,0x15,0x4d,0x01, 0x82,0x14,0x4c,0x01,0x01,0x14,0x4b,0x01,0x82,0x14,0x4b,0x02,0x04,0x12,0x4a, 0x00,0x13,0x4b,0x01,0x14,0x4b,0x01,0x13,0x4b,0x01,0x82,0x13,0x49,0x01,0x06, 0x13,0x4a,0x01,0x11,0x49,0x00,0x12,0x4a,0x01,0x12,0x48,0x02,0x13,0x47,0x01, 0x13,0x48,0x00,0x82,0x13,0x48,0x01,0x07,0x13,0x47,0x01,0x12,0x47,0x01,0x12, 0x48,0x02,0x12,0x47,0x01,0x12,0x46,0x01,0x13,0x46,0x02,0x12,0x46,0x01,0x82, 0x11,0x46,0x00,0x04,0x13,0x45,0x01,0x12,0x45,0x01,0x12,0x44,0x00,0x11,0x43, 0x01,0x82,0x12,0x44,0x01,0x03,0x11,0x43,0x00,0x11,0x43,0x01,0x12,0x43,0x02, 0x82,0x11,0x42,0x00,0x04,0x11,0x41,0x00,0x11,0x42,0x01,0x11,0x41,0x01,0x11, 0x41,0x00,0x82,0x11,0x41,0x01,0x01,0x11,0x40,0x01,0x82,0x10,0x40,0x00,0x02, 0x10,0x3f,0x00,0x10,0x3e,0x00,0x82,0x10,0x3f,0x01,0x01,0x10,0x3e,0x00,0x82, 0x10,0x3e,0x01,0x06,0x0f,0x3d,0x00,0x10,0x3c,0x00,0x10,0x3c,0x01,0x0f,0x3b, 0x00,0x10,0x3c,0x00,0x0f,0x3c,0x00,0x82,0x0f,0x3b,0x00,0x03,0x0f,0x3a,0x00, 0x0e,0x39,0x00,0x0f,0x3a,0x01,0x82,0x0f,0x39,0x01,0x05,0x0f,0x3a,0x00,0x0f, 0x39,0x01,0x0e,0x38,0x00,0x0d,0x38,0x00,0x0e,0x37,0x01,0x82,0x0e,0x37,0x00, 0x04,0x0f,0x37,0x01,0x0e,0x38,0x01,0x0e,0x37,0x01,0x0e,0x37,0x00,0x82,0x0e, 0x36,0x00,0x03,0x0e,0x37,0x01,0x0e,0x36,0x01,0x0d,0x35,0x00,0x84,0x0d,0x34, 0x00,0x84,0x0d,0x33,0x00,0x01,0x0d,0x32,0x01,0x82,0x0d,0x32,0x00,0x83,0x0c, 0x31,0x00,0x04,0x0c,0x30,0x00,0x0c,0x2f,0x00,0x0d,0x2f,0x00,0x0c,0x2f,0x01, 0x82,0x0c,0x2f,0x00,0x82,0x0c,0x2e,0x00,0x83,0x0c,0x2e,0x01,0x83,0x0c,0x2d, 0x01,0x01,0x0b,0x2c,0x01,0x82,0x0b,0x2b,0x01,0x01,0x0b,0x2a,0x01,0x82,0x0b, 0x2b,0x01,0x09,0x0a,0x2a,0x00,0x0b,0x2a,0x01,0x0b,0x29,0x01,0x0b,0x2a,0x01, 0x0a,0x29,0x01,0x0b,0x28,0x00,0x0b,0x29,0x01,0x0b,0x27,0x01,0x0a,0x27,0x00, 0x83,0x0a,0x27,0x01,0x01,0x0a,0x26,0x01,0x83,0x0a,0x26,0x00,0x02,0x0a,0x25, 0x00,0x0a,0x25,0x01,0x82,0x09,0x25,0x01,0x01,0x09,0x24,0x01,0x82,0x09,0x23, 0x00,0x05,0x09,0x23,0x01,0x09,0x23,0x00,0x09,0x22,0x00,0x09,0x23,0x01,0x09, 0x22,0x01,0x82,0x09,0x21,0x01,0x03,0x08,0x21,0x01,0x09,0x21,0x01,0x09,0x20, 0x01,0x82,0x08,0x20,0x01,0x83,0x08,0x1f,0x01,0x04,0x08,0x1f,0x00,0x08,0x1e, 0x01,0x08,0x1e,0x00,0x08,0x1d,0x00,0x83,0x08,0x1d,0x01,0x82,0x07,0x1c,0x00, 0x02,0x07,0x1c,0x01,0x07,0x1b,0x01,0x82,0x07,0x1b,0x00,0x84,0x07,0x1a,0x00, 0x04,0x07,0x19,0x01,0x07,0x19,0x00,0x07,0x19,0x01,0x06,0x18,0x01,0x82,0x06, 0x18,0x00,0x02,0x06,0x17,0x01,0x06,0x18,0x01,0x83,0x06,0x17,0x01,0x82,0x06, 0x16,0x01,0x01,0x05,0x16,0x00,0x83,0x05,0x15,0x00,0x03,0x06,0x14,0x00,0x05, 0x14,0x00,0x05,0x13,0x00,0x83,0x05,0x13,0x01,0x83,0x05,0x12,0x00,0x82,0x04, 0x11,0x00,0x01,0x05,0x11,0x00,0x83,0x04,0x10,0x00,0x84,0x04,0x0f,0x00,0x82, 0x04,0x0e,0x00,0x84,0x03,0x0d,0x00,0x83,0x03,0x0c,0x00,0x03,0x03,0x0b,0x00, 0x02,0x0b,0x00,0x03,0x0b,0x00,0x84,0x02,0x0a,0x00,0x83,0x02,0x09,0x00,0x83, 0x02,0x08,0x00,0x82,0x02,0x07,0x00,0x82,0x01,0x07,0x00,0x83,0x01,0x06,0x00, 0x83,0x01,0x05,0x00,0x83,0x01,0x04,0x00,0x01,0x01,0x03,0x00,0x82,0x00,0x03, 0x00,0x84,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xdb,0x00,0x00,0x00,0x83,0x45, 0xa4,0x24,0x01,0x47,0xa6,0x26,0x83,0x44,0xa3,0x23,0x05,0x48,0xa7,0x27,0x46, 0xa5,0x25,0x44,0xa3,0x23,0x45,0xa4,0x26,0x46,0xa5,0x27,0x82,0x44,0xa3,0x23, 0x0a,0x45,0xa4,0x24,0x43,0xa2,0x22,0x47,0xa3,0x24,0x43,0xa2,0x22,0x46,0xa5, 0x25,0x45,0xa4,0x24,0x43,0xa4,0x23,0x44,0xa5,0x24,0x43,0xa4,0x23,0x44,0xa5, 0x24,0x84,0x44,0xa3,0x23,0x0e,0x42,0xa1,0x21,0x43,0xa2,0x22,0x44,0xa3,0x23, 0x43,0xa2,0x22,0x43,0xa2,0x24,0x43,0xa2,0x22,0x42,0xa1,0x21,0x42,0x9e,0x21, 0x43,0x9f,0x22,0x44,0xa3,0x25,0x41,0xa0,0x20,0x43,0x9f,0x22,0x41,0xa0,0x20, 0x42,0xa1,0x21,0x82,0x41,0xa0,0x20,0x82,0x42,0xa1,0x21,0x0b,0x41,0xa0,0x20, 0x40,0x9f,0x21,0x42,0x9e,0x1f,0x42,0x9e,0x22,0x42,0x9e,0x21,0x41,0x9d,0x1e, 0x42,0x9e,0x21,0x44,0xa0,0x23,0x3f,0x9e,0x1e,0x3f,0x9e,0x20,0x40,0x9f,0x21, 0x82,0x41,0x9d,0x20,0x04,0x40,0x9c,0x1f,0x41,0x9d,0x20,0x42,0x9e,0x21,0x41, 0x9d,0x20,0x82,0x3f,0x9e,0x20,0x0a,0x3e,0x9d,0x1f,0x3f,0x9e,0x20,0x3e,0x9d, 0x1f,0x3f,0x9e,0x20,0x3e,0x9d,0x1f,0x3d,0x9c,0x1e,0x3c,0x9b,0x1d,0x3f,0x9e, 0x20,0x3e,0x9d,0x1f,0x3c,0x9b,0x1d,0x82,0x3e,0x9d,0x1f,0x82,0x3d,0x9c,0x1e, 0x05,0x3e,0x9d,0x1f,0x3f,0x9b,0x1e,0x3e,0x9a,0x1d,0x3f,0x9b,0x1e,0x40,0x9c, 0x1f,0x82,0x3c,0x9b,0x1d,0x04,0x3d,0x9c,0x1e,0x3c,0x9a,0x1e,0x3c,0x9b,0x1d, 0x3b,0x9a,0x1c,0x82,0x3d,0x99,0x1c,0x0c,0x3c,0x9b,0x1d,0x3d,0x9d,0x1f,0x3d, 0x9c,0x1e,0x3d,0x97,0x1b,0x3b,0x97,0x1a,0x3e,0x9a,0x1d,0x3b,0x9a,0x1c,0x39, 0x98,0x1a,0x3b,0x9a,0x1c,0x3c,0x9b,0x1d,0x3e,0x9a,0x1d,0x3d,0x99,0x1c,0x82, 0x3b,0x97,0x1a,0x13,0x3a,0x96,0x19,0x3b,0x97,0x1a,0x3a,0x96,0x19,0x3a,0x96, 0x1a,0x3c,0x98,0x1c,0x3c,0x98,0x1b,0x38,0x97,0x19,0x3c,0x98,0x1b,0x3a,0x96, 0x19,0x38,0x97,0x19,0x39,0x98,0x1a,0x3b,0x97,0x1a,0x38,0x94,0x17,0x3a,0x96, 0x19,0x39,0x98,0x18,0x3a,0x99,0x1b,0x3a,0x96,0x1a,0x36,0x95,0x17,0x3a,0x99, 0x1b,0x82,0x38,0x97,0x19,0x02,0x39,0x98,0x1a,0x38,0x97,0x19,0x82,0x36,0x95, 0x17,0x82,0x3a,0x99,0x1b,0x18,0x38,0x97,0x19,0x39,0x95,0x18,0x36,0x95,0x17, 0x38,0x97,0x17,0x36,0x95,0x17,0x37,0x96,0x18,0x36,0x95,0x17,0x37,0x96,0x18, 0x34,0x93,0x13,0x39,0x98,0x18,0x38,0x97,0x17,0x35,0x94,0x16,0x37,0x96,0x18, 0x34,0x93,0x15,0x38,0x97,0x19,0x34,0x93,0x15,0x35,0x95,0x17,0x32,0x92,0x14, 0x33,0x93,0x15,0x35,0x94,0x16,0x33,0x92,0x12,0x35,0x94,0x14,0x37,0x96,0x16, 0x38,0x97,0x17,0x82,0x35,0x94,0x14,0x82,0x37,0x96,0x18,0x82,0x34,0x95,0x14, 0x02,0x35,0x96,0x15,0x33,0x94,0x13,0x84,0x34,0x95,0x14,0x05,0x34,0x94,0x16, 0x36,0x97,0x16,0x35,0x96,0x15,0x33,0x93,0x15,0x32,0x93,0x12,0x82,0x33,0x94, 0x13,0x06,0x31,0x92,0x11,0x32,0x93,0x12,0x33,0x94,0x13,0x32,0x93,0x12,0x34, 0x95,0x14,0x35,0x96,0x15,0x82,0x31,0x92,0x11,0x01,0x32,0x93,0x12,0x82,0x33, 0x94,0x13,0x83,0x32,0x93,0x12,0x0d,0x32,0x93,0x10,0x2f,0x90,0x0d,0x32,0x93, 0x12,0x31,0x92,0x0f,0x31,0x92,0x11,0x32,0x93,0x10,0x31,0x92,0x0f,0x31,0x92, 0x11,0x31,0x92,0x0f,0x30,0x91,0x10,0x2e,0x91,0x10,0x31,0x94,0x13,0x30,0x93, 0x12,0x82,0x2f,0x92,0x11,0x04,0x30,0x94,0x10,0x31,0x95,0x11,0x2f,0x93,0x0f, 0x30,0x94,0x10,0x82,0x2e,0x92,0x0e,0x07,0x2f,0x93,0x0f,0x31,0x95,0x0f,0x30, 0x94,0x0e,0x31,0x95,0x0f,0x2f,0x93,0x0f,0x2e,0x94,0x0d,0x2f,0x95,0x0e,0x83, 0x2e,0x94,0x0d,0x02,0x30,0x96,0x0f,0x30,0x96,0x0e,0x82,0x2f,0x95,0x0d,0x83, 0x30,0x96,0x0e,0x82,0x32,0x98,0x10,0x03,0x30,0x98,0x0d,0x2f,0x97,0x0c,0x30, 0x9b,0x0f,0x82,0x30,0x9b,0x0d,0x82,0x33,0x9c,0x0e,0x03,0x34,0x9d,0x0f,0x32, 0x9d,0x0f,0x31,0x9c,0x0e,0x83,0x32,0x9d,0x0f,0x01,0x31,0x9c,0x0e,0x83,0x33, 0x9f,0x0e,0x05,0x32,0x9e,0x0d,0x34,0x9d,0x0f,0x35,0x9e,0x10,0x32,0x9e,0x0d, 0x34,0xa0,0x0e,0x82,0x33,0xa1,0x0e,0x04,0x32,0xa0,0x0d,0x33,0xa1,0x0c,0x34, 0xa2,0x0f,0x35,0xa1,0x0f,0x84,0x34,0xa2,0x0f,0x02,0x35,0xa3,0x10,0x36,0xa4, 0x0f,0x82,0x37,0xa3,0x0f,0x82,0x37,0xa5,0x10,0x07,0x39,0xa7,0x12,0x38,0xa6, 0x0f,0x37,0xa5,0x0e,0x36,0xa4,0x0d,0x37,0xa5,0x0e,0x38,0xa6,0x0f,0x37,0xa5, 0x0e,0x82,0x3a,0xa9,0x0f,0x01,0x38,0xa7,0x0d,0x82,0x3a,0xa9,0x0f,0x03,0x3a, 0xa8,0x11,0x38,0xa9,0x0f,0x3a,0xa9,0x0f,0x82,0x3b,0xaa,0x0e,0x03,0x3a,0xab, 0x11,0x3c,0xab,0x11,0x3b,0xaa,0x10,0x82,0x3e,0xad,0x11,0x05,0x3c,0xab,0x0f, 0x3d,0xac,0x10,0x3e,0xad,0x11,0x3c,0xae,0x11,0x3e,0xad,0x11,0x82,0x3f,0xae, 0x12,0x03,0x3c,0xae,0x11,0x40,0xaf,0x13,0x3f,0xae,0x12,0x82,0x40,0xaf,0x13, 0x06,0x3f,0xae,0x12,0x41,0xaf,0x13,0x3f,0xad,0x12,0x3f,0xac,0x12,0x3f,0xac, 0x11,0x3f,0xac,0x12,0x82,0x40,0xad,0x13,0x82,0x3f,0xab,0x13,0x06,0x40,0xac, 0x14,0x3f,0xab,0x13,0x3f,0xaa,0x13,0x3e,0xac,0x14,0x3f,0xa9,0x13,0x41,0xab, 0x15,0x82,0x3f,0xa9,0x14,0x0a,0x3f,0xa8,0x13,0x3f,0xa7,0x12,0x41,0xa9,0x14, 0x41,0xa9,0x15,0x3f,0xa7,0x13,0x3f,0xa6,0x13,0x40,0xa7,0x14,0x3f,0xa5,0x13, 0x40,0xa6,0x14,0x3f,0xa5,0x13,0x82,0x40,0xa6,0x15,0x07,0x3f,0xa4,0x14,0x3e, 0xa3,0x13,0x3f,0xa2,0x15,0x3f,0xa1,0x14,0x3d,0xa1,0x13,0x3d,0xa0,0x13,0x41, 0xa1,0x15,0x82,0x3d,0x9f,0x13,0x02,0x40,0xa0,0x15,0x3f,0x9f,0x14,0x82,0x3f, 0x9e,0x14,0x04,0x3f,0x9d,0x14,0x3e,0x9c,0x16,0x3c,0x9a,0x14,0x3d,0x9b,0x13, 0x82,0x3c,0x9a,0x12,0x0a,0x3c,0x98,0x14,0x3c,0x95,0x12,0x3c,0x96,0x13,0x3b, 0x93,0x13,0x3a,0x92,0x12,0x38,0x90,0x12,0x37,0x8f,0x12,0x36,0x8d,0x11,0x35, 0x8c,0x11,0x34,0x8a,0x11,0x82,0x34,0x88,0x10,0x18,0x32,0x85,0x10,0x31,0x83, 0x0e,0x31,0x82,0x0e,0x32,0x83,0x0f,0x31,0x81,0x0f,0x30,0x7e,0x0e,0x31,0x7e, 0x10,0x31,0x7e,0x11,0x30,0x7d,0x10,0x2f,0x7a,0x10,0x2e,0x78,0x0f,0x30,0x7a, 0x12,0x2f,0x79,0x11,0x26,0x6e,0x0a,0x21,0x68,0x05,0x21,0x67,0x05,0x22,0x69, 0x07,0x20,0x67,0x05,0x1e,0x66,0x03,0x1f,0x64,0x03,0x1f,0x65,0x04,0x1f,0x65, 0x06,0x1e,0x64,0x05,0x1d,0x62,0x03,0x82,0x1c,0x61,0x03,0x82,0x1b,0x5f,0x04, 0x02,0x1b,0x5e,0x03,0x1a,0x5d,0x03,0x82,0x1a,0x5c,0x03,0x02,0x1b,0x5d,0x04, 0x1a,0x5c,0x03,0x82,0x19,0x5b,0x03,0x15,0x18,0x5a,0x02,0x18,0x59,0x03,0x19, 0x58,0x02,0x1a,0x59,0x02,0x17,0x58,0x01,0x18,0x58,0x02,0x19,0x57,0x02,0x18, 0x56,0x02,0x17,0x57,0x02,0x17,0x56,0x01,0x16,0x55,0x00,0x17,0x56,0x02,0x19, 0x56,0x02,0x18,0x55,0x01,0x16,0x55,0x01,0x16,0x55,0x02,0x16,0x54,0x02,0x16, 0x53,0x00,0x16,0x55,0x02,0x15,0x53,0x00,0x17,0x52,0x02,0x82,0x15,0x52,0x00, 0x0a,0x17,0x52,0x01,0x15,0x51,0x02,0x15,0x52,0x02,0x16,0x51,0x02,0x15,0x51, 0x02,0x14,0x51,0x00,0x14,0x50,0x02,0x15,0x50,0x02,0x16,0x4f,0x02,0x14,0x4f, 0x02,0x82,0x15,0x4f,0x02,0x08,0x14,0x4e,0x01,0x15,0x4e,0x01,0x13,0x4e,0x00, 0x14,0x4e,0x01,0x14,0x4d,0x00,0x14,0x4d,0x01,0x14,0x4c,0x01,0x14,0x4d,0x02, 0x83,0x14,0x4c,0x01,0x03,0x14,0x4b,0x01,0x14,0x4b,0x02,0x13,0x4a,0x01,0x82, 0x13,0x4b,0x01,0x08,0x14,0x4b,0x01,0x14,0x4a,0x01,0x13,0x49,0x00,0x13,0x4a, 0x01,0x13,0x49,0x01,0x13,0x4a,0x01,0x13,0x4b,0x02,0x13,0x49,0x01,0x82,0x13, 0x48,0x01,0x03,0x13,0x48,0x00,0x13,0x47,0x01,0x13,0x46,0x01,0x83,0x12,0x47, 0x01,0x82,0x12,0x46,0x00,0x03,0x13,0x46,0x01,0x12,0x47,0x01,0x11,0x46,0x00, 0x83,0x12,0x45,0x01,0x09,0x12,0x44,0x01,0x12,0x44,0x00,0x12,0x44,0x01,0x11, 0x43,0x00,0x11,0x42,0x00,0x11,0x42,0x01,0x11,0x42,0x00,0x12,0x42,0x01,0x11, 0x41,0x00,0x82,0x11,0x42,0x01,0x82,0x11,0x40,0x00,0x82,0x11,0x40,0x01,0x05, 0x0f,0x3f,0x00,0x10,0x40,0x01,0x10,0x3f,0x00,0x10,0x3e,0x00,0x10,0x3f,0x01, 0x82,0x0f,0x3e,0x00,0x82,0x10,0x3e,0x01,0x06,0x0f,0x3e,0x01,0x0f,0x3d,0x00, 0x0f,0x3c,0x00,0x10,0x3c,0x00,0x0f,0x3b,0x00,0x0f,0x3c,0x00,0x82,0x10,0x3b, 0x00,0x07,0x0f,0x3a,0x00,0x0e,0x39,0x00,0x0f,0x3a,0x01,0x0f,0x39,0x00,0x0e, 0x39,0x00,0x0f,0x39,0x00,0x0f,0x38,0x01,0x82,0x0e,0x38,0x00,0x08,0x0f,0x38, 0x01,0x0e,0x38,0x00,0x0f,0x37,0x00,0x0f,0x37,0x01,0x0e,0x37,0x00,0x0d,0x36, 0x00,0x0e,0x37,0x00,0x0d,0x36,0x00,0x82,0x0e,0x36,0x01,0x83,0x0d,0x35,0x00, 0x02,0x0e,0x35,0x01,0x0d,0x34,0x00,0x82,0x0d,0x33,0x00,0x01,0x0e,0x33,0x01, 0x82,0x0d,0x33,0x00,0x04,0x0d,0x32,0x00,0x0c,0x31,0x00,0x0d,0x31,0x00,0x0d, 0x32,0x01,0x82,0x0c,0x31,0x00,0x02,0x0c,0x30,0x00,0x0d,0x30,0x01,0x82,0x0c, 0x30,0x01,0x02,0x0d,0x30,0x01,0x0d,0x30,0x00,0x82,0x0b,0x2f,0x00,0x82,0x0c, 0x2e,0x01,0x82,0x0c,0x2d,0x00,0x03,0x0c,0x2d,0x01,0x0b,0x2d,0x01,0x0b,0x2c, 0x00,0x85,0x0b,0x2b,0x01,0x82,0x0b,0x2a,0x00,0x82,0x0b,0x2a,0x01,0x05,0x0a, 0x29,0x00,0x0a,0x28,0x00,0x0b,0x28,0x00,0x0b,0x28,0x01,0x0a,0x27,0x01,0x83, 0x0a,0x27,0x00,0x83,0x0a,0x26,0x00,0x02,0x0a,0x25,0x00,0x09,0x25,0x00,0x82, 0x09,0x25,0x01,0x82,0x09,0x24,0x01,0x01,0x09,0x23,0x01,0x82,0x09,0x24,0x01, 0x82,0x09,0x23,0x00,0x03,0x09,0x23,0x01,0x09,0x22,0x00,0x09,0x21,0x00,0x82, 0x09,0x22,0x01,0x06,0x09,0x21,0x01,0x09,0x20,0x00,0x09,0x20,0x01,0x09,0x21, 0x01,0x09,0x20,0x01,0x09,0x1f,0x01,0x82,0x08,0x1f,0x00,0x02,0x08,0x1f,0x01, 0x08,0x1e,0x01,0x82,0x08,0x1d,0x00,0x02,0x07,0x1d,0x00,0x08,0x1d,0x01,0x82, 0x07,0x1c,0x00,0x82,0x07,0x1c,0x01,0x03,0x07,0x1b,0x00,0x07,0x1b,0x01,0x07, 0x1a,0x00,0x84,0x07,0x1a,0x01,0x05,0x07,0x19,0x00,0x06,0x19,0x00,0x06,0x19, 0x01,0x06,0x18,0x00,0x06,0x18,0x01,0x83,0x06,0x17,0x00,0x02,0x06,0x16,0x00, 0x06,0x17,0x01,0x83,0x06,0x16,0x01,0x02,0x05,0x16,0x01,0x05,0x15,0x00,0x84, 0x05,0x14,0x00,0x83,0x05,0x13,0x00,0x83,0x05,0x12,0x00,0x83,0x04,0x11,0x00, 0x83,0x04,0x10,0x00,0x84,0x04,0x0f,0x00,0x02,0x04,0x0e,0x00,0x03,0x0e,0x00, 0x84,0x03,0x0d,0x00,0x83,0x03,0x0c,0x00,0x83,0x03,0x0b,0x00,0x01,0x03,0x0a, 0x00,0x83,0x02,0x0a,0x00,0x83,0x02,0x09,0x00,0x83,0x02,0x08,0x00,0x82,0x02, 0x07,0x00,0x01,0x01,0x07,0x00,0x83,0x01,0x06,0x00,0x84,0x01,0x05,0x00,0x83, 0x01,0x04,0x00,0x01,0x01,0x03,0x00,0x82,0x00,0x03,0x00,0x84,0x00,0x02,0x00, 0x83,0x00,0x01,0x00,0xdb,0x00,0x00,0x00,0x03,0x45,0xa4,0x24,0x44,0xa3,0x23, 0x48,0xa7,0x27,0x84,0x47,0xa6,0x26,0x05,0x48,0xa7,0x27,0x44,0xa3,0x21,0x47, 0xa6,0x26,0x46,0xa5,0x25,0x47,0xa6,0x26,0x82,0x44,0xa3,0x23,0x82,0x45,0xa4, 0x24,0x83,0x44,0xa3,0x23,0x03,0x46,0xa7,0x24,0x43,0xa4,0x21,0x44,0xa5,0x24, 0x82,0x45,0xa6,0x25,0x0a,0x45,0xa4,0x24,0x44,0xa3,0x23,0x45,0xa4,0x24,0x44, 0xa3,0x23,0x42,0xa1,0x21,0x44,0xa5,0x24,0x46,0xa5,0x25,0x44,0xa3,0x23,0x43, 0xa2,0x24,0x44,0xa3,0x23,0x82,0x43,0xa2,0x22,0x04,0x42,0xa1,0x23,0x45,0xa4, 0x24,0x43,0xa2,0x22,0x45,0xa1,0x22,0x83,0x42,0xa1,0x21,0x83,0x41,0xa0,0x20, 0x82,0x43,0xa2,0x22,0x08,0x42,0xa1,0x21,0x42,0xa1,0x23,0x43,0x9f,0x20,0x42, 0x9e,0x1f,0x42,0x9e,0x21,0x43,0x9f,0x20,0x40,0x9f,0x1f,0x40,0xa1,0x20,0x82, 0x40,0x9f,0x21,0x01,0x40,0x9f,0x1f,0x82,0x41,0x9d,0x1e,0x01,0x3f,0x9e,0x1e, 0x85,0x3f,0x9e,0x20,0x01,0x40,0x9f,0x21,0x83,0x3e,0x9d,0x1f,0x03,0x3f,0x9e, 0x20,0x3e,0x9d,0x1d,0x3f,0x9e,0x20,0x84,0x3e,0x9d,0x1f,0x06,0x3d,0x9c,0x1e, 0x3c,0x9b,0x1d,0x3d,0x9c,0x1c,0x3d,0x9c,0x1e,0x3e,0x9d,0x1f,0x3c,0x9b,0x1d, 0x83,0x3e,0x9d,0x1f,0x83,0x3d,0x9c,0x1e,0x01,0x3c,0x9b,0x1d,0x82,0x3d,0x9c, 0x1e,0x03,0x3c,0x9c,0x1e,0x3c,0x9b,0x1d,0x3c,0x98,0x1b,0x83,0x3c,0x9b,0x1d, 0x02,0x3d,0x9c,0x1e,0x3b,0x9a,0x1c,0x82,0x3a,0x99,0x1b,0x25,0x3c,0x9b,0x1d, 0x3a,0x99,0x1b,0x3d,0x99,0x1c,0x3c,0x98,0x1b,0x3c,0x98,0x19,0x3c,0x98,0x1b, 0x3d,0x99,0x1c,0x3b,0x9a,0x1c,0x39,0x98,0x18,0x3a,0x99,0x1b,0x3d,0x99,0x1c, 0x3b,0x97,0x1a,0x38,0x97,0x19,0x39,0x98,0x1a,0x3b,0x97,0x1a,0x39,0x95,0x18, 0x39,0x98,0x1a,0x39,0x98,0x18,0x3a,0x96,0x19,0x3b,0x97,0x1b,0x38,0x97,0x19, 0x37,0x96,0x18,0x36,0x95,0x17,0x39,0x98,0x1a,0x3a,0x99,0x1b,0x39,0x98,0x1a, 0x3a,0x98,0x1c,0x37,0x96,0x18,0x3b,0x9a,0x1a,0x3a,0x99,0x1b,0x38,0x97,0x19, 0x3a,0x96,0x19,0x37,0x95,0x19,0x38,0x97,0x17,0x37,0x96,0x18,0x3a,0x99,0x1b, 0x38,0x97,0x19,0x83,0x38,0x97,0x17,0x05,0x39,0x98,0x18,0x35,0x94,0x16,0x34, 0x93,0x15,0x36,0x95,0x15,0x37,0x96,0x16,0x82,0x38,0x97,0x17,0x04,0x34,0x94, 0x16,0x35,0x95,0x17,0x35,0x96,0x15,0x36,0x97,0x16,0x82,0x35,0x96,0x15,0x07, 0x36,0x97,0x16,0x37,0x98,0x17,0x35,0x96,0x15,0x33,0x94,0x13,0x36,0x96,0x18, 0x36,0x97,0x16,0x35,0x96,0x15,0x82,0x34,0x95,0x14,0x0b,0x35,0x96,0x15,0x37, 0x98,0x17,0x34,0x95,0x14,0x32,0x93,0x12,0x35,0x95,0x17,0x35,0x96,0x15,0x33, 0x94,0x13,0x34,0x95,0x14,0x33,0x94,0x13,0x31,0x92,0x11,0x33,0x94,0x13,0x82, 0x32,0x92,0x14,0x02,0x33,0x94,0x13,0x31,0x92,0x11,0x82,0x33,0x94,0x13,0x11, 0x35,0x96,0x15,0x32,0x93,0x12,0x34,0x95,0x14,0x30,0x91,0x10,0x31,0x92,0x11, 0x34,0x95,0x14,0x35,0x96,0x15,0x33,0x94,0x13,0x32,0x93,0x10,0x34,0x95,0x12, 0x30,0x91,0x0e,0x32,0x93,0x12,0x30,0x94,0x10,0x32,0x95,0x14,0x31,0x94,0x13, 0x2f,0x93,0x0f,0x2f,0x92,0x11,0x82,0x30,0x94,0x10,0x01,0x31,0x95,0x11,0x83, 0x30,0x94,0x10,0x03,0x2e,0x92,0x0e,0x2f,0x93,0x0f,0x30,0x94,0x10,0x83,0x2e, 0x92,0x0e,0x07,0x2f,0x93,0x0f,0x30,0x94,0x0e,0x2f,0x93,0x0d,0x30,0x94,0x0e, 0x2f,0x93,0x0d,0x30,0x95,0x11,0x2f,0x95,0x0e,0x82,0x2d,0x93,0x0c,0x01,0x2e, 0x94,0x0d,0x82,0x2f,0x95,0x0d,0x0c,0x31,0x97,0x0f,0x30,0x96,0x0e,0x32,0x96, 0x0f,0x31,0x97,0x0f,0x2f,0x97,0x0e,0x31,0x97,0x0f,0x31,0x99,0x0e,0x30,0x9b, 0x0f,0x32,0x9a,0x0f,0x32,0x9b,0x0d,0x31,0x99,0x0e,0x32,0x9a,0x0f,0x82,0x32, 0x9b,0x0d,0x04,0x33,0x9b,0x10,0x33,0x9c,0x0e,0x31,0x9d,0x0c,0x34,0x9d,0x0f, 0x82,0x31,0x9c,0x0e,0x82,0x32,0x9d,0x0f,0x01,0x30,0x9c,0x0b,0x83,0x32,0x9e, 0x0d,0x09,0x33,0x9e,0x10,0x32,0x9e,0x0d,0x36,0xa2,0x10,0x34,0xa2,0x0f,0x32, 0x9f,0x0e,0x32,0x9e,0x0c,0x35,0xa1,0x0d,0x32,0xa0,0x0d,0x34,0xa0,0x0e,0x82, 0x34,0xa2,0x0f,0x03,0x35,0xa1,0x0f,0x34,0xa2,0x0f,0x35,0xa3,0x0e,0x82,0x36, 0xa2,0x0e,0x01,0x35,0xa1,0x0d,0x82,0x35,0xa3,0x0e,0x82,0x34,0xa5,0x0f,0x82, 0x36,0xa4,0x0d,0x09,0x37,0xa5,0x10,0x38,0xa6,0x0f,0x36,0xa4,0x0d,0x39,0xa7, 0x10,0x3a,0xa9,0x0f,0x39,0xa8,0x0e,0x3a,0xa9,0x0f,0x39,0xa8,0x0e,0x3a,0xa8, 0x11,0x82,0x38,0xa9,0x0f,0x82,0x3b,0xaa,0x10,0x04,0x3a,0xab,0x11,0x3a,0xac, 0x0f,0x3b,0xaa,0x0e,0x3a,0xa9,0x0d,0x82,0x3b,0xad,0x10,0x82,0x3c,0xab,0x0f, 0x05,0x3a,0xac,0x0f,0x3c,0xae,0x11,0x3f,0xae,0x12,0x3e,0xad,0x11,0x3c,0xae, 0x11,0x82,0x3e,0xad,0x11,0x82,0x3d,0xaf,0x12,0x03,0x3e,0xad,0x11,0x3d,0xae, 0x11,0x3f,0xad,0x12,0x82,0x3f,0xac,0x12,0x82,0x3d,0xad,0x12,0x12,0x3f,0xac, 0x12,0x3e,0xaa,0x11,0x40,0xac,0x13,0x40,0xab,0x13,0x3e,0xaa,0x12,0x3e,0xa9, 0x12,0x40,0xae,0x16,0x3e,0xab,0x14,0x40,0xaa,0x14,0x40,0xaa,0x15,0x3e,0xa8, 0x13,0x40,0xa8,0x14,0x40,0xa8,0x13,0x41,0xa9,0x14,0x41,0xa8,0x14,0x40,0xa8, 0x14,0x40,0xa7,0x14,0x3f,0xa6,0x13,0x82,0x40,0xa6,0x14,0x03,0x3f,0xa5,0x13, 0x3e,0xa4,0x13,0x40,0xa6,0x15,0x82,0x3f,0xa4,0x14,0x05,0x40,0xa4,0x15,0x3f, 0xa1,0x14,0x3e,0xa2,0x14,0x3d,0xa0,0x13,0x3e,0xa1,0x14,0x82,0x3e,0xa1,0x13, 0x09,0x3e,0xa1,0x14,0x40,0xa0,0x14,0x3e,0x9d,0x13,0x3d,0x9c,0x12,0x3e,0x9d, 0x13,0x3d,0x9c,0x13,0x3c,0x9b,0x12,0x3e,0x9c,0x14,0x3d,0x9b,0x13,0x82,0x3d, 0x9a,0x13,0x1c,0x3c,0x97,0x11,0x3b,0x96,0x13,0x3b,0x95,0x14,0x39,0x93,0x12, 0x37,0x91,0x11,0x38,0x91,0x12,0x37,0x90,0x12,0x34,0x8d,0x10,0x36,0x8d,0x12, 0x34,0x8a,0x10,0x36,0x89,0x10,0x33,0x86,0x0f,0x32,0x84,0x0f,0x31,0x84,0x0d, 0x32,0x83,0x0f,0x31,0x81,0x0e,0x30,0x7f,0x0e,0x32,0x80,0x0f,0x2f,0x7c,0x0e, 0x2f,0x7c,0x0f,0x2f,0x7b,0x0f,0x2c,0x77,0x0c,0x2d,0x77,0x0e,0x2f,0x79,0x11, 0x31,0x7b,0x14,0x2c,0x74,0x0e,0x23,0x6a,0x07,0x22,0x69,0x06,0x82,0x22,0x68, 0x07,0x82,0x20,0x66,0x05,0x03,0x1f,0x65,0x06,0x1d,0x63,0x04,0x1d,0x62,0x03, 0x82,0x1c,0x61,0x03,0x04,0x1b,0x60,0x03,0x1c,0x60,0x03,0x1d,0x61,0x04,0x1b, 0x5e,0x04,0x83,0x1a,0x5d,0x03,0x01,0x1a,0x5c,0x03,0x82,0x19,0x5b,0x03,0x02, 0x18,0x5a,0x02,0x18,0x5a,0x03,0x82,0x1a,0x58,0x03,0x02,0x17,0x58,0x01,0x18, 0x58,0x02,0x83,0x17,0x57,0x02,0x03,0x17,0x56,0x01,0x16,0x55,0x02,0x18,0x55, 0x02,0x82,0x18,0x55,0x01,0x0d,0x16,0x55,0x01,0x17,0x55,0x03,0x16,0x54,0x02, 0x16,0x54,0x01,0x18,0x54,0x02,0x15,0x53,0x00,0x16,0x53,0x02,0x18,0x54,0x02, 0x17,0x53,0x02,0x16,0x53,0x02,0x17,0x51,0x02,0x15,0x51,0x00,0x14,0x51,0x00, 0x82,0x15,0x51,0x01,0x0f,0x17,0x50,0x01,0x15,0x51,0x02,0x15,0x50,0x02,0x16, 0x4e,0x02,0x14,0x4f,0x02,0x14,0x4e,0x02,0x14,0x4e,0x01,0x15,0x50,0x01,0x14, 0x4f,0x01,0x15,0x4f,0x01,0x14,0x4d,0x01,0x15,0x4e,0x01,0x14,0x4c,0x00,0x14, 0x4d,0x01,0x13,0x4c,0x00,0x82,0x14,0x4c,0x01,0x01,0x13,0x4b,0x00,0x82,0x14, 0x4b,0x01,0x02,0x14,0x4d,0x02,0x13,0x4b,0x01,0x82,0x14,0x4a,0x01,0x13,0x13, 0x49,0x01,0x13,0x4a,0x01,0x13,0x49,0x01,0x14,0x49,0x01,0x14,0x4a,0x02,0x14, 0x49,0x00,0x13,0x47,0x01,0x13,0x48,0x01,0x13,0x48,0x00,0x13,0x47,0x01,0x13, 0x46,0x02,0x12,0x47,0x00,0x12,0x46,0x01,0x12,0x47,0x01,0x12,0x46,0x00,0x12, 0x45,0x00,0x13,0x46,0x01,0x13,0x47,0x01,0x12,0x45,0x00,0x82,0x13,0x46,0x01, 0x03,0x13,0x45,0x01,0x12,0x44,0x00,0x12,0x43,0x00,0x82,0x12,0x44,0x01,0x04, 0x11,0x43,0x01,0x10,0x42,0x01,0x12,0x42,0x00,0x12,0x42,0x01,0x82,0x11,0x42, 0x01,0x09,0x10,0x41,0x01,0x11,0x41,0x01,0x10,0x3f,0x00,0x11,0x40,0x01,0x10, 0x40,0x00,0x10,0x3f,0x01,0x11,0x40,0x02,0x10,0x3f,0x01,0x10,0x3e,0x01,0x83, 0x10,0x3f,0x01,0x83,0x10,0x3e,0x01,0x82,0x0f,0x3c,0x00,0x04,0x10,0x3c,0x00, 0x0f,0x3b,0x00,0x0f,0x3c,0x00,0x10,0x3b,0x00,0x82,0x0f,0x3a,0x00,0x07,0x0e, 0x39,0x00,0x0f,0x3a,0x00,0x0e,0x39,0x00,0x0f,0x39,0x00,0x10,0x3a,0x01,0x0f, 0x38,0x01,0x0e,0x39,0x00,0x82,0x0f,0x38,0x00,0x04,0x0e,0x38,0x00,0x0d,0x37, 0x00,0x0e,0x37,0x01,0x0e,0x37,0x00,0x82,0x0d,0x36,0x00,0x03,0x0e,0x37,0x01, 0x0e,0x36,0x01,0x0e,0x36,0x00,0x82,0x0d,0x35,0x00,0x01,0x0e,0x34,0x00,0x82, 0x0e,0x35,0x01,0x03,0x0d,0x34,0x00,0x0d,0x33,0x00,0x0e,0x34,0x01,0x82,0x0c, 0x32,0x00,0x02,0x0d,0x32,0x00,0x0d,0x32,0x01,0x84,0x0c,0x31,0x00,0x82,0x0c, 0x30,0x00,0x01,0x0c,0x2f,0x00,0x82,0x0c,0x30,0x01,0x01,0x0d,0x30,0x00,0x83, 0x0c,0x2f,0x00,0x03,0x0c,0x2e,0x00,0x0b,0x2e,0x00,0x0c,0x2e,0x00,0x82,0x0c, 0x2d,0x01,0x04,0x0b,0x2c,0x01,0x0c,0x2c,0x01,0x0b,0x2b,0x00,0x0b,0x2c,0x01, 0x82,0x0b,0x2b,0x01,0x82,0x0b,0x2a,0x00,0x01,0x0b,0x29,0x00,0x82,0x0a,0x29, 0x00,0x04,0x0b,0x28,0x00,0x0a,0x28,0x00,0x0a,0x27,0x00,0x0a,0x28,0x00,0x84, 0x0a,0x27,0x00,0x82,0x0a,0x26,0x00,0x02,0x0a,0x25,0x00,0x09,0x25,0x00,0x83, 0x09,0x25,0x01,0x03,0x0a,0x24,0x01,0x09,0x24,0x00,0x09,0x24,0x01,0x82,0x09, 0x23,0x00,0x82,0x09,0x23,0x01,0x82,0x09,0x22,0x00,0x05,0x09,0x22,0x01,0x09, 0x22,0x00,0x09,0x21,0x00,0x09,0x21,0x01,0x09,0x20,0x01,0x82,0x08,0x20,0x00, 0x02,0x09,0x1f,0x01,0x08,0x1f,0x00,0x82,0x08,0x1f,0x01,0x82,0x08,0x1e,0x01, 0x83,0x08,0x1d,0x01,0x83,0x07,0x1c,0x01,0x82,0x07,0x1b,0x00,0x03,0x07,0x1b, 0x01,0x07,0x1a,0x00,0x07,0x1a,0x01,0x83,0x07,0x1a,0x00,0x04,0x07,0x19,0x01, 0x06,0x19,0x00,0x06,0x19,0x01,0x06,0x18,0x01,0x82,0x06,0x18,0x00,0x82,0x06, 0x17,0x00,0x02,0x06,0x17,0x01,0x06,0x16,0x00,0x83,0x05,0x16,0x00,0x83,0x05, 0x15,0x00,0x84,0x05,0x14,0x00,0x82,0x05,0x13,0x00,0x04,0x05,0x12,0x00,0x04, 0x12,0x00,0x05,0x12,0x00,0x05,0x12,0x01,0x82,0x04,0x11,0x00,0x83,0x04,0x10, 0x00,0x84,0x04,0x0f,0x00,0x01,0x04,0x0e,0x00,0x82,0x03,0x0e,0x00,0x84,0x03, 0x0d,0x00,0x82,0x03,0x0c,0x00,0x84,0x03,0x0b,0x00,0x83,0x02,0x0a,0x00,0x83, 0x02,0x09,0x00,0x83,0x02,0x08,0x00,0x82,0x02,0x07,0x00,0x01,0x01,0x07,0x00, 0x84,0x01,0x06,0x00,0x83,0x01,0x05,0x00,0x83,0x01,0x04,0x00,0x01,0x01,0x03, 0x00,0x83,0x00,0x03,0x00,0x83,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xdb,0x00, 0x00,0x00,0x83,0x47,0xa6,0x26,0x02,0x46,0xa5,0x25,0x48,0xa9,0x28,0x83,0x48, 0xa7,0x27,0x02,0x47,0xa6,0x24,0x48,0xa7,0x25,0x83,0x46,0xa5,0x23,0x0a,0x48, 0xa7,0x25,0x47,0xa6,0x24,0x46,0xa5,0x23,0x46,0xa5,0x25,0x48,0xa7,0x27,0x45, 0xa4,0x24,0x47,0xa8,0x25,0x45,0xa6,0x23,0x44,0xa5,0x22,0x47,0xa6,0x26,0x82, 0x44,0xa3,0x23,0x84,0x45,0xa4,0x24,0x04,0x44,0xa5,0x24,0x42,0xa3,0x22,0x45, 0xa4,0x24,0x43,0xa4,0x23,0x82,0x45,0xa4,0x24,0x04,0x44,0xa5,0x24,0x41,0xa2, 0x21,0x43,0xa2,0x22,0x44,0xa3,0x23,0x83,0x43,0xa2,0x22,0x01,0x44,0xa3,0x23, 0x84,0x43,0xa2,0x22,0x02,0x42,0xa1,0x21,0x44,0xa0,0x21,0x82,0x42,0xa1,0x21, 0x01,0x41,0xa1,0x23,0x82,0x40,0x9f,0x1f,0x02,0x42,0xa1,0x21,0x42,0xa1,0x1f, 0x83,0x41,0xa0,0x20,0x02,0x40,0x9f,0x1f,0x3f,0x9e,0x1e,0x83,0x40,0x9f,0x1f, 0x83,0x3f,0x9e,0x1e,0x02,0x41,0xa0,0x20,0x3f,0x9e,0x1e,0x83,0x40,0x9f,0x1f, 0x01,0x3e,0x9d,0x1d,0x85,0x3e,0x9d,0x1f,0x02,0x3c,0x9b,0x1d,0x3d,0x9c,0x1c, 0x83,0x3e,0x9d,0x1f,0x09,0x3d,0x9c,0x1e,0x3e,0x9d,0x1d,0x3d,0x9c,0x1c,0x3c, 0x9b,0x1b,0x3e,0x9d,0x1d,0x3e,0x9a,0x1d,0x3d,0x9c,0x1e,0x3c,0x9c,0x1e,0x3f, 0x9e,0x20,0x82,0x3c,0x9b,0x1d,0x82,0x3d,0x9c,0x1e,0x08,0x3e,0x9d,0x1f,0x3c, 0x9b,0x1d,0x3c,0x9b,0x1b,0x3f,0x9e,0x1e,0x3d,0x9c,0x1c,0x3c,0x9b,0x1d,0x3b, 0x9a,0x1c,0x3a,0x99,0x1b,0x83,0x3c,0x9b,0x1d,0x0c,0x3c,0x9b,0x1b,0x3b,0x9a, 0x1c,0x3c,0x9b,0x1d,0x3a,0x99,0x1b,0x3b,0x9a,0x1a,0x3c,0x9b,0x1d,0x3d,0x99, 0x1c,0x3c,0x98,0x1b,0x3b,0x9a,0x1c,0x3a,0x99,0x1b,0x3b,0x97,0x1a,0x3c,0x98, 0x1b,0x82,0x39,0x98,0x1a,0x24,0x3b,0x9a,0x1c,0x3c,0x98,0x1b,0x3a,0x99,0x1b, 0x3b,0x9a,0x1c,0x3a,0x99,0x1b,0x39,0x98,0x1a,0x3a,0x99,0x1b,0x3b,0x9a,0x1a, 0x39,0x98,0x1a,0x3b,0x9a,0x1a,0x39,0x98,0x18,0x3a,0x99,0x1b,0x38,0x97,0x19, 0x3a,0x96,0x17,0x39,0x97,0x1b,0x3a,0x99,0x1b,0x39,0x98,0x1a,0x38,0x97,0x19, 0x36,0x95,0x17,0x37,0x96,0x16,0x3a,0x99,0x19,0x38,0x97,0x17,0x39,0x98,0x1a, 0x38,0x94,0x15,0x37,0x98,0x17,0x39,0x9a,0x19,0x3a,0x96,0x17,0x36,0x92,0x13, 0x37,0x98,0x17,0x36,0x97,0x16,0x37,0x96,0x18,0x37,0x98,0x17,0x36,0x97,0x16, 0x33,0x94,0x13,0x37,0x98,0x17,0x36,0x97,0x16,0x82,0x35,0x96,0x15,0x02,0x36, 0x97,0x16,0x36,0x96,0x18,0x82,0x34,0x95,0x14,0x0e,0x35,0x96,0x13,0x39,0x9a, 0x19,0x35,0x96,0x15,0x36,0x97,0x16,0x35,0x96,0x15,0x37,0x96,0x16,0x35,0x96, 0x15,0x32,0x93,0x12,0x35,0x96,0x15,0x34,0x95,0x14,0x33,0x94,0x13,0x36,0x97, 0x16,0x36,0x95,0x15,0x33,0x94,0x13,0x82,0x34,0x95,0x14,0x06,0x33,0x94,0x11, 0x35,0x96,0x13,0x33,0x94,0x11,0x34,0x95,0x12,0x32,0x93,0x10,0x34,0x95,0x14, 0x83,0x32,0x93,0x12,0x01,0x34,0x95,0x14,0x83,0x34,0x95,0x12,0x09,0x31,0x92, 0x0f,0x32,0x95,0x14,0x30,0x94,0x10,0x30,0x93,0x12,0x31,0x94,0x13,0x31,0x95, 0x11,0x2f,0x92,0x11,0x2f,0x93,0x0f,0x30,0x94,0x10,0x82,0x2f,0x93,0x0f,0x83, 0x30,0x94,0x10,0x01,0x31,0x95,0x11,0x83,0x30,0x94,0x10,0x03,0x2f,0x93,0x0f, 0x30,0x94,0x10,0x2f,0x93,0x0f,0x83,0x2f,0x93,0x0d,0x82,0x2f,0x94,0x10,0x05, 0x2d,0x93,0x0c,0x2f,0x95,0x0e,0x30,0x96,0x0f,0x30,0x96,0x0e,0x2f,0x95,0x0d, 0x83,0x30,0x96,0x0e,0x82,0x31,0x99,0x10,0x05,0x31,0x97,0x0d,0x32,0x9a,0x0f, 0x30,0x9b,0x0f,0x30,0x99,0x0b,0x32,0x99,0x0c,0x82,0x32,0x9a,0x0f,0x08,0x32, 0x9d,0x0f,0x33,0x9c,0x0e,0x32,0x9a,0x0f,0x33,0x9c,0x0e,0x33,0x9c,0x0c,0x34, 0x9d,0x0f,0x31,0x9c,0x0e,0x30,0x9b,0x0d,0x82,0x32,0x9d,0x0f,0x0f,0x33,0x9f, 0x0e,0x34,0xa0,0x0f,0x33,0x9f,0x0e,0x32,0x9e,0x0d,0x32,0x9e,0x0c,0x33,0x9f, 0x0d,0x32,0x9f,0x0e,0x31,0x9e,0x0d,0x34,0xa2,0x0f,0x33,0x9f,0x0d,0x34,0xa0, 0x0f,0x33,0x9f,0x0d,0x31,0x9f,0x0c,0x33,0x9f,0x0d,0x36,0xa2,0x10,0x82,0x34, 0xa2,0x0f,0x02,0x36,0xa2,0x0e,0x34,0xa2,0x0d,0x82,0x35,0xa1,0x0d,0x82,0x35, 0xa3,0x0e,0x04,0x35,0xa6,0x10,0x34,0xa5,0x0f,0x32,0xa3,0x0d,0x34,0xa5,0x0d, 0x82,0x37,0xa5,0x10,0x02,0x36,0xa4,0x0d,0x37,0xa5,0x0e,0x82,0x39,0xa7,0x10, 0x03,0x38,0xa7,0x0d,0x37,0xa6,0x0c,0x39,0xa8,0x0e,0x82,0x38,0xa9,0x0f,0x0a, 0x3b,0xaa,0x10,0x3a,0xa9,0x0f,0x39,0xaa,0x10,0x3a,0xab,0x11,0x3b,0xaa,0x10, 0x3c,0xab,0x0f,0x3b,0xad,0x10,0x3a,0xac,0x0f,0x3c,0xab,0x0f,0x3d,0xac,0x10, 0x82,0x3c,0xae,0x11,0x0a,0x3d,0xac,0x10,0x3e,0xad,0x11,0x3d,0xaf,0x12,0x3d, 0xac,0x10,0x3e,0xad,0x11,0x3d,0xaf,0x11,0x3c,0xae,0x11,0x3e,0xad,0x11,0x3c, 0xad,0x10,0x40,0xae,0x12,0x82,0x3e,0xae,0x13,0x82,0x3d,0xad,0x12,0x0c,0x3e, 0xad,0x13,0x3d,0xac,0x12,0x3e,0xad,0x13,0x40,0xab,0x13,0x3e,0xaa,0x12,0x3f, 0xaa,0x13,0x3e,0xac,0x14,0x3e,0xab,0x14,0x3f,0xa9,0x13,0x40,0xaa,0x15,0x3e, 0xab,0x14,0x3f,0xa9,0x14,0x82,0x3e,0xa7,0x12,0x02,0x3e,0xa6,0x12,0x3e,0xa7, 0x13,0x82,0x3f,0xa7,0x14,0x05,0x3f,0xa6,0x14,0x40,0xa6,0x14,0x3f,0xa6,0x14, 0x3e,0xa4,0x13,0x3f,0xa5,0x14,0x82,0x3f,0xa4,0x14,0x04,0x3f,0xa3,0x14,0x3e, 0xa1,0x14,0x40,0xa4,0x15,0x3f,0xa3,0x14,0x82,0x3e,0xa1,0x13,0x09,0x3f,0xa2, 0x15,0x3e,0xa1,0x14,0x3d,0xa0,0x13,0x3f,0x9e,0x13,0x40,0x9f,0x15,0x3f,0x9d, 0x14,0x3d,0x9c,0x13,0x3c,0x9a,0x11,0x3d,0x9b,0x13,0x82,0x3c,0x9a,0x12,0x05, 0x3c,0x98,0x14,0x3b,0x97,0x13,0x3a,0x96,0x13,0x3c,0x97,0x13,0x3a,0x94,0x13, 0x82,0x3a,0x93,0x13,0x82,0x37,0x90,0x12,0x08,0x37,0x8f,0x12,0x36,0x8c,0x10, 0x36,0x8d,0x13,0x34,0x89,0x11,0x34,0x88,0x10,0x33,0x86,0x0f,0x32,0x84,0x0e, 0x31,0x82,0x0e,0x82,0x30,0x80,0x0f,0x02,0x31,0x7e,0x10,0x2e,0x7b,0x0d,0x82, 0x30,0x7c,0x0f,0x0c,0x30,0x7a,0x0f,0x2f,0x79,0x0f,0x2e,0x77,0x0f,0x31,0x7a, 0x12,0x2e,0x77,0x11,0x27,0x6d,0x0b,0x1f,0x67,0x04,0x20,0x68,0x06,0x20,0x66, 0x05,0x1f,0x65,0x04,0x1e,0x65,0x06,0x1f,0x64,0x06,0x82,0x1d,0x62,0x04,0x09, 0x1e,0x63,0x05,0x1c,0x61,0x03,0x1c,0x60,0x03,0x1d,0x61,0x04,0x1c,0x60,0x03, 0x1c,0x5f,0x05,0x1b,0x5e,0x04,0x1b,0x5d,0x04,0x1b,0x5e,0x03,0x82,0x1a,0x5c, 0x03,0x02,0x19,0x5b,0x03,0x18,0x5a,0x03,0x82,0x1a,0x58,0x03,0x06,0x17,0x58, 0x02,0x17,0x58,0x01,0x16,0x57,0x02,0x16,0x56,0x02,0x16,0x57,0x02,0x18,0x57, 0x03,0x82,0x17,0x56,0x02,0x82,0x17,0x55,0x01,0x21,0x16,0x55,0x01,0x17,0x55, 0x02,0x17,0x55,0x03,0x16,0x54,0x01,0x18,0x54,0x02,0x17,0x54,0x02,0x16,0x53, 0x02,0x18,0x54,0x02,0x17,0x53,0x01,0x15,0x52,0x00,0x18,0x52,0x03,0x16,0x52, 0x02,0x17,0x51,0x01,0x15,0x51,0x01,0x17,0x51,0x01,0x16,0x51,0x02,0x15,0x50, 0x01,0x14,0x50,0x02,0x14,0x4f,0x02,0x14,0x50,0x01,0x14,0x4e,0x02,0x16,0x4e, 0x02,0x16,0x4e,0x01,0x15,0x4f,0x01,0x15,0x4e,0x01,0x14,0x4e,0x01,0x13,0x4d, 0x00,0x15,0x4c,0x00,0x16,0x4d,0x01,0x13,0x4c,0x00,0x13,0x4b,0x00,0x14,0x4c, 0x01,0x13,0x4b,0x00,0x82,0x13,0x4a,0x00,0x01,0x15,0x4c,0x02,0x82,0x13,0x4b, 0x01,0x07,0x13,0x49,0x00,0x15,0x49,0x01,0x15,0x4a,0x01,0x13,0x49,0x01,0x12, 0x49,0x01,0x14,0x49,0x01,0x13,0x48,0x00,0x82,0x13,0x48,0x01,0x08,0x12,0x48, 0x00,0x13,0x47,0x01,0x13,0x46,0x02,0x12,0x47,0x00,0x12,0x46,0x01,0x12,0x45, 0x01,0x12,0x46,0x01,0x12,0x46,0x00,0x82,0x13,0x46,0x01,0x08,0x11,0x45,0x00, 0x12,0x45,0x00,0x12,0x45,0x01,0x13,0x45,0x01,0x13,0x44,0x01,0x12,0x44,0x00, 0x12,0x43,0x00,0x11,0x42,0x00,0x82,0x12,0x43,0x02,0x05,0x12,0x42,0x01,0x10, 0x41,0x01,0x11,0x42,0x02,0x12,0x42,0x02,0x11,0x41,0x01,0x82,0x11,0x41,0x02, 0x01,0x11,0x3f,0x01,0x83,0x10,0x3f,0x01,0x82,0x10,0x3e,0x01,0x01,0x11,0x3f, 0x02,0x82,0x10,0x3f,0x01,0x82,0x10,0x3e,0x01,0x07,0x11,0x3e,0x01,0x10,0x3c, 0x01,0x10,0x3d,0x02,0x0f,0x3d,0x01,0x0f,0x3c,0x01,0x0e,0x3a,0x00,0x0f,0x3b, 0x00,0x84,0x0f,0x3a,0x00,0x07,0x0f,0x39,0x00,0x0e,0x39,0x00,0x0f,0x39,0x00, 0x0e,0x39,0x00,0x0e,0x38,0x01,0x0e,0x39,0x00,0x0e,0x38,0x00,0x83,0x0e,0x37, 0x00,0x01,0x0e,0x37,0x01,0x82,0x0d,0x36,0x00,0x83,0x0e,0x36,0x00,0x03,0x0e, 0x36,0x01,0x0e,0x35,0x01,0x0d,0x35,0x00,0x82,0x0d,0x34,0x00,0x02,0x0d,0x33, 0x00,0x0d,0x32,0x00,0x83,0x0d,0x33,0x00,0x82,0x0d,0x32,0x00,0x10,0x0c,0x31, 0x00,0x0d,0x32,0x01,0x0d,0x31,0x01,0x0c,0x31,0x00,0x0c,0x30,0x00,0x0d,0x30, 0x00,0x0c,0x2f,0x00,0x0c,0x30,0x01,0x0d,0x30,0x01,0x0b,0x30,0x00,0x0b,0x2f, 0x00,0x0c,0x2f,0x00,0x0d,0x2f,0x01,0x0c,0x2f,0x00,0x0c,0x2d,0x01,0x0b,0x2d, 0x00,0x82,0x0c,0x2d,0x01,0x05,0x0b,0x2c,0x01,0x0c,0x2c,0x01,0x0b,0x2c,0x01, 0x0c,0x2c,0x00,0x0b,0x2b,0x00,0x82,0x0b,0x2b,0x01,0x03,0x0b,0x2a,0x00,0x0b, 0x29,0x00,0x0b,0x2a,0x01,0x82,0x0b,0x29,0x01,0x82,0x0a,0x28,0x00,0x01,0x0b, 0x28,0x00,0x84,0x0a,0x27,0x00,0x08,0x09,0x27,0x00,0x0a,0x26,0x00,0x0a,0x25, 0x00,0x0a,0x26,0x00,0x0a,0x25,0x00,0x09,0x25,0x00,0x09,0x24,0x00,0x0a,0x24, 0x00,0x82,0x09,0x24,0x00,0x01,0x09,0x24,0x01,0x83,0x09,0x23,0x00,0x01,0x09, 0x22,0x00,0x82,0x09,0x22,0x01,0x82,0x08,0x21,0x00,0x02,0x09,0x21,0x01,0x09, 0x20,0x01,0x82,0x08,0x20,0x00,0x84,0x08,0x1f,0x00,0x82,0x08,0x1e,0x00,0x82, 0x08,0x1e,0x01,0x82,0x08,0x1d,0x00,0x03,0x07,0x1d,0x00,0x07,0x1c,0x00,0x07, 0x1b,0x00,0x83,0x07,0x1b,0x01,0x01,0x07,0x1a,0x01,0x83,0x07,0x1a,0x00,0x01, 0x06,0x19,0x01,0x82,0x06,0x19,0x00,0x02,0x06,0x18,0x01,0x06,0x18,0x00,0x83, 0x06,0x17,0x00,0x03,0x06,0x17,0x01,0x06,0x16,0x00,0x05,0x16,0x00,0x82,0x06, 0x16,0x01,0x01,0x06,0x15,0x01,0x82,0x05,0x15,0x01,0x01,0x05,0x14,0x01,0x82, 0x05,0x14,0x00,0x83,0x05,0x13,0x00,0x04,0x05,0x12,0x00,0x04,0x12,0x00,0x04, 0x12,0x01,0x04,0x12,0x00,0x83,0x04,0x11,0x00,0x83,0x04,0x10,0x00,0x82,0x04, 0x0f,0x00,0x01,0x04,0x0e,0x00,0x83,0x03,0x0e,0x00,0x01,0x04,0x0d,0x00,0x83, 0x03,0x0d,0x00,0x82,0x03,0x0c,0x00,0x83,0x03,0x0b,0x00,0x02,0x02,0x0b,0x00, 0x03,0x0a,0x00,0x82,0x02,0x0a,0x00,0x83,0x02,0x09,0x00,0x83,0x02,0x08,0x00, 0x82,0x02,0x07,0x00,0x01,0x01,0x07,0x00,0x84,0x01,0x06,0x00,0x83,0x01,0x05, 0x00,0x83,0x01,0x04,0x00,0x01,0x01,0x03,0x00,0x83,0x00,0x03,0x00,0x83,0x00, 0x02,0x00,0x83,0x00,0x01,0x00,0xdb,0x00,0x00,0x00,0x03,0x45,0xa4,0x22,0x49, 0xa8,0x26,0x46,0xa7,0x24,0x82,0x49,0xaa,0x27,0x05,0x46,0xa7,0x24,0x47,0xa8, 0x25,0x47,0xa6,0x24,0x48,0xa7,0x25,0x46,0xa5,0x23,0x82,0x48,0xa7,0x25,0x0e, 0x47,0xa6,0x24,0x49,0xa8,0x26,0x47,0xa6,0x24,0x48,0xa7,0x25,0x47,0xa6,0x26, 0x48,0xa7,0x25,0x47,0xa8,0x25,0x46,0xa5,0x23,0x45,0xa4,0x22,0x48,0xa7,0x25, 0x45,0xa4,0x22,0x44,0xa3,0x21,0x44,0xa3,0x23,0x45,0xa4,0x22,0x82,0x46,0xa5, 0x23,0x82,0x45,0xa4,0x24,0x0a,0x44,0xa3,0x23,0x46,0xa5,0x25,0x45,0xa6,0x25, 0x43,0xa2,0x20,0x46,0xa5,0x23,0x44,0xa5,0x24,0x43,0xa4,0x23,0x45,0xa4,0x24, 0x45,0xa4,0x22,0x44,0xa3,0x23,0x82,0x41,0xa0,0x20,0x84,0x43,0xa2,0x22,0x0d, 0x44,0xa3,0x23,0x42,0xa1,0x21,0x41,0xa0,0x20,0x42,0xa1,0x1f,0x41,0xa0,0x20, 0x42,0xa2,0x24,0x43,0xa2,0x20,0x43,0xa2,0x22,0x42,0xa3,0x22,0x41,0xa2,0x1f, 0x43,0xa2,0x22,0x41,0xa0,0x20,0x42,0xa1,0x21,0x82,0x40,0x9f,0x1f,0x04,0x42, 0xa1,0x21,0x41,0xa0,0x20,0x40,0x9f,0x1f,0x3f,0x9e,0x1e,0x82,0x40,0x9f,0x1f, 0x02,0x41,0xa0,0x20,0x3e,0x9d,0x1d,0x82,0x40,0x9f,0x1f,0x07,0x3f,0x9e,0x1e, 0x40,0x9f,0x1f,0x41,0xa0,0x20,0x40,0x9f,0x21,0x3d,0x9c,0x1e,0x3e,0x9d,0x1f, 0x3f,0x9e,0x20,0x82,0x3e,0x9d,0x1d,0x03,0x3f,0x9e,0x1e,0x3d,0x9c,0x1e,0x3e, 0x9d,0x1f,0x82,0x3e,0x9d,0x1d,0x82,0x3d,0x9c,0x1c,0x06,0x3e,0x9d,0x1d,0x3f, 0x9b,0x1e,0x3d,0x9d,0x1f,0x3b,0x9b,0x1d,0x3c,0x9b,0x1d,0x3e,0x9a,0x1d,0x82, 0x3d,0x9c,0x1e,0x0d,0x3d,0x9d,0x1f,0x3e,0x9a,0x1d,0x3c,0x9b,0x1d,0x3d,0x9c, 0x1c,0x3d,0x9e,0x1d,0x3c,0x9d,0x1c,0x3b,0x9a,0x1c,0x3c,0x98,0x1b,0x3d,0x99, 0x1c,0x3c,0x9d,0x1c,0x3c,0x9b,0x1d,0x3d,0x9c,0x1e,0x3c,0x9b,0x1b,0x82,0x3b, 0x9a,0x1c,0x05,0x3a,0x99,0x1b,0x3d,0x9c,0x1c,0x3b,0x9a,0x1c,0x3a,0x99,0x1b, 0x39,0x98,0x1a,0x82,0x3a,0x99,0x1b,0x0d,0x3c,0x98,0x1b,0x3b,0x9a,0x1c,0x3a, 0x99,0x1b,0x3b,0x9a,0x1a,0x3b,0x9a,0x1c,0x3a,0x99,0x1b,0x3b,0x9a,0x1a,0x3a, 0x99,0x19,0x3a,0x99,0x1b,0x39,0x98,0x1a,0x3a,0x99,0x1b,0x39,0x98,0x18,0x38, 0x97,0x19,0x82,0x3a,0x99,0x19,0x09,0x3a,0x99,0x1b,0x39,0x98,0x1a,0x38,0x97, 0x19,0x37,0x96,0x18,0x39,0x98,0x1a,0x38,0x97,0x19,0x37,0x96,0x18,0x39,0x98, 0x1a,0x37,0x96,0x16,0x82,0x39,0x98,0x18,0x18,0x37,0x96,0x18,0x39,0x98,0x18, 0x37,0x98,0x17,0x38,0x97,0x17,0x35,0x94,0x14,0x37,0x96,0x16,0x35,0x96,0x15, 0x39,0x9a,0x19,0x39,0x98,0x18,0x35,0x94,0x14,0x37,0x96,0x16,0x36,0x95,0x15, 0x38,0x97,0x17,0x33,0x92,0x12,0x38,0x97,0x17,0x3a,0x99,0x19,0x36,0x95,0x15, 0x35,0x95,0x17,0x38,0x99,0x18,0x37,0x98,0x17,0x34,0x95,0x12,0x35,0x96,0x13, 0x36,0x97,0x16,0x35,0x96,0x15,0x82,0x37,0x96,0x16,0x0b,0x34,0x93,0x11,0x33, 0x94,0x13,0x36,0x97,0x16,0x33,0x94,0x13,0x34,0x95,0x14,0x38,0x97,0x17,0x36, 0x95,0x15,0x32,0x93,0x12,0x35,0x96,0x15,0x32,0x93,0x12,0x35,0x96,0x15,0x82, 0x36,0x97,0x14,0x13,0x33,0x94,0x13,0x34,0x95,0x14,0x36,0x97,0x14,0x34,0x95, 0x12,0x32,0x93,0x10,0x33,0x94,0x13,0x34,0x95,0x14,0x33,0x94,0x11,0x34,0x95, 0x12,0x32,0x96,0x12,0x32,0x93,0x12,0x33,0x94,0x11,0x32,0x93,0x12,0x32,0x93, 0x10,0x33,0x94,0x11,0x33,0x94,0x13,0x31,0x92,0x0f,0x32,0x93,0x12,0x32,0x96, 0x12,0x82,0x30,0x94,0x10,0x02,0x31,0x95,0x11,0x30,0x94,0x10,0x82,0x2f,0x93, 0x0f,0x82,0x30,0x94,0x10,0x03,0x31,0x95,0x11,0x2e,0x92,0x0e,0x30,0x94,0x0e, 0x83,0x2f,0x93,0x0f,0x02,0x31,0x95,0x0f,0x2e,0x93,0x0f,0x82,0x2f,0x95,0x0e, 0x82,0x30,0x96,0x0f,0x82,0x30,0x96,0x0e,0x0c,0x2e,0x94,0x0c,0x32,0x98,0x10, 0x30,0x96,0x0e,0x31,0x99,0x10,0x30,0x98,0x0f,0x2f,0x97,0x0c,0x32,0x9a,0x0f, 0x31,0x9c,0x10,0x30,0x9b,0x0d,0x32,0x98,0x0e,0x32,0x9b,0x0d,0x33,0x9c,0x0e, 0x82,0x30,0x9b,0x0f,0x05,0x35,0x9e,0x10,0x34,0x9d,0x0f,0x32,0x9b,0x0d,0x31, 0x9c,0x0e,0x32,0x9d,0x0f,0x82,0x30,0x9b,0x0d,0x01,0x31,0x9c,0x0e,0x82,0x33, 0x9f,0x0e,0x11,0x32,0x9e,0x0d,0x34,0x9d,0x0c,0x35,0x9e,0x0d,0x35,0xa1,0x0f, 0x34,0xa0,0x0e,0x31,0x9f,0x0c,0x32,0xa0,0x0d,0x32,0x9f,0x0e,0x33,0xa0,0x0f, 0x35,0xa1,0x0f,0x33,0xa1,0x0e,0x34,0xa2,0x0f,0x35,0xa1,0x0f,0x32,0xa0,0x0d, 0x33,0xa1,0x0e,0x34,0xa2,0x0d,0x32,0xa0,0x0b,0x82,0x35,0xa1,0x0d,0x82,0x34, 0xa2,0x0d,0x83,0x35,0xa3,0x0e,0x01,0x38,0xa6,0x11,0x83,0x36,0xa4,0x0f,0x06, 0x36,0xa4,0x0d,0x37,0xa5,0x0e,0x38,0xa6,0x0f,0x37,0xa5,0x0e,0x38,0xa6,0x0f, 0x39,0xa8,0x0e,0x83,0x38,0xa9,0x0f,0x02,0x3a,0xa9,0x0f,0x38,0xa9,0x0f,0x82, 0x39,0xaa,0x10,0x06,0x3b,0xaa,0x10,0x3a,0xac,0x0f,0x3c,0xab,0x0f,0x3d,0xac, 0x10,0x3c,0xab,0x0f,0x3a,0xac,0x0f,0x82,0x3b,0xad,0x10,0x01,0x3e,0xad,0x11, 0x82,0x3c,0xae,0x11,0x06,0x3f,0xae,0x11,0x3c,0xae,0x10,0x3b,0xad,0x10,0x3e, 0xad,0x10,0x3f,0xad,0x11,0x3d,0xae,0x11,0x82,0x3d,0xad,0x11,0x02,0x3c,0xac, 0x11,0x3d,0xad,0x10,0x82,0x3e,0xad,0x11,0x06,0x3e,0xad,0x13,0x3e,0xa9,0x11, 0x3e,0xaa,0x12,0x40,0xab,0x14,0x3d,0xab,0x13,0x3e,0xab,0x14,0x82,0x3e,0xa8, 0x12,0x06,0x3d,0xaa,0x14,0x3f,0xa9,0x13,0x3e,0xa7,0x12,0x3f,0xa8,0x13,0x40, 0xa8,0x14,0x3f,0xa8,0x14,0x82,0x3f,0xa7,0x14,0x03,0x3f,0xa6,0x14,0x3e,0xa5, 0x13,0x3f,0xa6,0x15,0x82,0x3e,0xa5,0x14,0x09,0x40,0xa5,0x15,0x3f,0xa4,0x14, 0x3f,0xa3,0x14,0x3e,0xa3,0x14,0x3f,0xa3,0x14,0x40,0xa4,0x15,0x3e,0xa1,0x13, 0x3d,0xa0,0x12,0x3e,0xa1,0x13,0x82,0x3e,0xa1,0x14,0x02,0x3e,0x9d,0x12,0x40, 0x9f,0x15,0x82,0x3f,0x9e,0x15,0x25,0x3d,0x9c,0x13,0x3e,0x9c,0x14,0x3d,0x9b, 0x13,0x3d,0x9a,0x13,0x3d,0x99,0x14,0x3c,0x98,0x14,0x3b,0x97,0x13,0x3c,0x98, 0x14,0x3b,0x96,0x13,0x3a,0x95,0x12,0x3a,0x93,0x13,0x38,0x91,0x11,0x39,0x91, 0x12,0x38,0x90,0x13,0x36,0x8e,0x11,0x36,0x8d,0x11,0x35,0x8b,0x11,0x34,0x89, 0x12,0x33,0x88,0x11,0x32,0x84,0x0e,0x31,0x82,0x0e,0x31,0x83,0x0f,0x30,0x80, 0x0f,0x31,0x80,0x10,0x2f,0x7e,0x10,0x2e,0x7d,0x0d,0x2f,0x7d,0x10,0x2f,0x7b, 0x0e,0x2f,0x7a,0x0e,0x2f,0x7b,0x10,0x2e,0x78,0x0e,0x31,0x7b,0x13,0x2f,0x78, 0x12,0x27,0x70,0x0a,0x23,0x6a,0x07,0x1e,0x65,0x03,0x21,0x67,0x06,0x82,0x1f, 0x65,0x07,0x03,0x20,0x65,0x07,0x1f,0x64,0x06,0x1e,0x63,0x05,0x84,0x1d,0x61, 0x04,0x06,0x1d,0x61,0x05,0x1d,0x60,0x04,0x1c,0x5e,0x05,0x1b,0x5e,0x03,0x1b, 0x5d,0x03,0x1a,0x5c,0x03,0x82,0x18,0x5a,0x02,0x01,0x1a,0x59,0x02,0x82,0x18, 0x59,0x02,0x01,0x18,0x58,0x02,0x82,0x17,0x57,0x02,0x01,0x18,0x57,0x03,0x83, 0x17,0x56,0x02,0x82,0x17,0x55,0x01,0x0c,0x16,0x55,0x01,0x17,0x55,0x02,0x16, 0x54,0x02,0x18,0x54,0x01,0x16,0x54,0x01,0x17,0x53,0x00,0x17,0x52,0x02,0x17, 0x54,0x02,0x16,0x53,0x01,0x16,0x51,0x00,0x16,0x52,0x02,0x16,0x52,0x01,0x82, 0x17,0x51,0x01,0x07,0x15,0x51,0x01,0x16,0x51,0x02,0x17,0x50,0x01,0x15,0x50, 0x01,0x14,0x50,0x01,0x15,0x4f,0x01,0x14,0x4e,0x02,0x82,0x15,0x4d,0x01,0x83, 0x15,0x4e,0x01,0x01,0x14,0x4c,0x00,0x83,0x15,0x4c,0x00,0x02,0x13,0x4b,0x01, 0x14,0x4c,0x02,0x83,0x14,0x4b,0x01,0x01,0x15,0x4c,0x02,0x83,0x14,0x4a,0x01, 0x03,0x13,0x49,0x01,0x14,0x4a,0x01,0x13,0x49,0x01,0x82,0x14,0x49,0x01,0x09, 0x13,0x48,0x01,0x12,0x48,0x01,0x13,0x48,0x01,0x13,0x48,0x00,0x14,0x48,0x02, 0x14,0x46,0x01,0x12,0x46,0x01,0x12,0x45,0x00,0x12,0x45,0x01,0x82,0x12,0x46, 0x01,0x02,0x13,0x46,0x02,0x14,0x46,0x02,0x83,0x12,0x45,0x01,0x06,0x13,0x45, 0x01,0x12,0x43,0x01,0x13,0x44,0x02,0x13,0x43,0x02,0x11,0x42,0x01,0x11,0x43, 0x01,0x82,0x11,0x42,0x01,0x07,0x10,0x42,0x01,0x11,0x42,0x02,0x12,0x42,0x02, 0x11,0x41,0x02,0x11,0x42,0x01,0x12,0x41,0x01,0x12,0x40,0x01,0x82,0x10,0x3f, 0x01,0x0e,0x0f,0x3e,0x00,0x10,0x3e,0x01,0x11,0x3e,0x01,0x10,0x3e,0x01,0x10, 0x3f,0x02,0x0f,0x3e,0x00,0x10,0x3e,0x01,0x0f,0x3d,0x01,0x10,0x3d,0x02,0x10, 0x3c,0x01,0x10,0x3d,0x02,0x0f,0x3c,0x01,0x0f,0x3c,0x00,0x0f,0x3b,0x00,0x85, 0x0f,0x3a,0x00,0x0e,0x10,0x3a,0x01,0x0f,0x39,0x01,0x0f,0x3a,0x01,0x0f,0x39, 0x00,0x0f,0x39,0x01,0x0e,0x39,0x00,0x0d,0x38,0x00,0x0d,0x36,0x00,0x0e,0x37, 0x00,0x0e,0x38,0x01,0x0e,0x37,0x01,0x0e,0x37,0x00,0x0d,0x36,0x00,0x0e,0x36, 0x00,0x82,0x0d,0x35,0x00,0x02,0x0e,0x36,0x01,0x0d,0x35,0x00,0x84,0x0d,0x34, 0x00,0x11,0x0d,0x33,0x00,0x0d,0x32,0x00,0x0c,0x32,0x00,0x0d,0x33,0x00,0x0c, 0x31,0x00,0x0d,0x32,0x00,0x0d,0x31,0x00,0x0d,0x31,0x01,0x0c,0x30,0x00,0x0c, 0x31,0x00,0x0c,0x30,0x01,0x0c,0x30,0x00,0x0b,0x2f,0x00,0x0b,0x30,0x00,0x0c, 0x30,0x01,0x0c,0x2f,0x01,0x0b,0x2e,0x00,0x82,0x0c,0x2f,0x00,0x01,0x0c,0x2e, 0x00,0x82,0x0c,0x2e,0x01,0x82,0x0c,0x2d,0x01,0x02,0x0b,0x2c,0x00,0x0c,0x2c, 0x00,0x82,0x0b,0x2c,0x00,0x82,0x0b,0x2b,0x00,0x01,0x0b,0x2b,0x01,0x83,0x0b, 0x2a,0x01,0x82,0x0b,0x29,0x01,0x0f,0x0a,0x28,0x00,0x0b,0x29,0x01,0x0b,0x28, 0x00,0x0a,0x27,0x00,0x0a,0x28,0x01,0x0a,0x26,0x00,0x0a,0x27,0x01,0x09,0x27, 0x00,0x0a,0x27,0x00,0x0a,0x26,0x00,0x0a,0x26,0x01,0x0a,0x25,0x00,0x09,0x25, 0x00,0x09,0x24,0x00,0x0a,0x24,0x00,0x82,0x0a,0x24,0x01,0x01,0x08,0x24,0x00, 0x83,0x09,0x23,0x00,0x82,0x09,0x22,0x00,0x01,0x09,0x21,0x00,0x82,0x08,0x21, 0x00,0x82,0x09,0x20,0x00,0x01,0x08,0x20,0x01,0x82,0x08,0x1f,0x00,0x01,0x08, 0x1f,0x01,0x82,0x08,0x1f,0x00,0x83,0x08,0x1e,0x00,0x02,0x08,0x1d,0x00,0x07, 0x1c,0x00,0x82,0x07,0x1d,0x00,0x82,0x07,0x1c,0x00,0x01,0x07,0x1b,0x00,0x82, 0x07,0x1b,0x01,0x02,0x07,0x1a,0x01,0x06,0x1a,0x00,0x82,0x07,0x1a,0x00,0x07, 0x06,0x1a,0x01,0x07,0x19,0x01,0x06,0x18,0x01,0x06,0x19,0x00,0x06,0x18,0x00, 0x06,0x17,0x00,0x06,0x18,0x01,0x83,0x06,0x17,0x00,0x06,0x06,0x16,0x00,0x05, 0x16,0x00,0x06,0x16,0x00,0x06,0x15,0x00,0x05,0x15,0x00,0x05,0x15,0x01,0x82, 0x05,0x14,0x01,0x01,0x05,0x14,0x00,0x84,0x05,0x13,0x00,0x02,0x05,0x12,0x00, 0x05,0x12,0x01,0x84,0x04,0x11,0x00,0x82,0x04,0x10,0x00,0x83,0x04,0x0f,0x00, 0x01,0x04,0x0e,0x00,0x83,0x03,0x0e,0x00,0x83,0x03,0x0d,0x00,0x83,0x03,0x0c, 0x00,0x83,0x03,0x0b,0x00,0x84,0x02,0x0a,0x00,0x83,0x02,0x09,0x00,0x84,0x02, 0x08,0x00,0x02,0x02,0x07,0x00,0x01,0x07,0x00,0x84,0x01,0x06,0x00,0x83,0x01, 0x05,0x00,0x83,0x01,0x04,0x00,0x01,0x01,0x03,0x00,0x83,0x00,0x03,0x00,0x83, 0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xdb,0x00,0x00,0x00,0x08,0x48,0xa7,0x25, 0x49,0xa8,0x26,0x49,0xaa,0x27,0x47,0xa8,0x25,0x46,0xa7,0x24,0x4a,0xab,0x28, 0x4a,0xa9,0x27,0x49,0xa8,0x26,0x82,0x48,0xa7,0x25,0x09,0x46,0xa7,0x22,0x48, 0xa9,0x24,0x48,0xa9,0x26,0x46,0xa5,0x23,0x49,0xa8,0x26,0x48,0xa7,0x25,0x45, 0xa6,0x23,0x48,0xa7,0x25,0x47,0xa6,0x24,0x82,0x46,0xa5,0x23,0x82,0x48,0xa7, 0x25,0x82,0x46,0xa7,0x24,0x06,0x46,0xa5,0x23,0x47,0xa6,0x24,0x46,0xa5,0x23, 0x43,0xa2,0x22,0x45,0xa4,0x24,0x46,0xa5,0x25,0x82,0x45,0xa4,0x24,0x82,0x44, 0xa3,0x21,0x02,0x45,0xa4,0x22,0x44,0xa5,0x24,0x82,0x45,0xa4,0x22,0x01,0x44, 0xa3,0x23,0x83,0x44,0xa3,0x21,0x03,0x43,0xa2,0x22,0x44,0xa3,0x23,0x43,0xa2, 0x22,0x82,0x45,0xa4,0x24,0x02,0x41,0xa2,0x21,0x44,0xa3,0x23,0x82,0x42,0xa1, 0x21,0x82,0x43,0xa2,0x22,0x82,0x42,0xa3,0x22,0x01,0x45,0xa4,0x24,0x84,0x42, 0xa1,0x21,0x07,0x43,0xa2,0x22,0x41,0xa0,0x20,0x42,0xa1,0x21,0x43,0xa2,0x22, 0x42,0xa1,0x21,0x41,0xa0,0x20,0x40,0x9f,0x1f,0x83,0x41,0xa0,0x20,0x82,0x40, 0x9f,0x1f,0x82,0x3e,0x9d,0x1d,0x09,0x3f,0x9e,0x20,0x40,0x9f,0x21,0x3f,0x9e, 0x1e,0x3e,0x9d,0x1d,0x40,0x9f,0x1f,0x3e,0x9f,0x1e,0x3e,0x9d,0x1d,0x3f,0x9e, 0x1e,0x40,0x9f,0x1f,0x83,0x3e,0x9d,0x1d,0x05,0x3d,0x9c,0x1c,0x3e,0x9d,0x1d, 0x3e,0x9f,0x1e,0x3d,0x9c,0x1c,0x3b,0x9a,0x1a,0x82,0x3e,0x9d,0x1d,0x82,0x3d, 0x9c,0x1c,0x08,0x3c,0x9d,0x1c,0x3d,0x9c,0x1c,0x3c,0x9b,0x1b,0x3d,0x99,0x1a, 0x40,0x9c,0x1d,0x3d,0x9c,0x1c,0x3c,0x9b,0x1d,0x3e,0x9d,0x1f,0x82,0x3c,0x9d, 0x1c,0x01,0x3f,0x9e,0x20,0x82,0x3b,0x9a,0x1a,0x82,0x3c,0x9b,0x1d,0x03,0x3b, 0x9a,0x1a,0x3c,0x9b,0x1d,0x3b,0x9a,0x1c,0x82,0x3a,0x99,0x19,0x82,0x3b,0x9a, 0x1a,0x03,0x3c,0x9b,0x1b,0x3b,0x9a,0x1a,0x3c,0x9b,0x1b,0x82,0x3a,0x99,0x19, 0x09,0x3d,0x9c,0x1c,0x3b,0x9a,0x1a,0x3b,0x9a,0x1c,0x3a,0x99,0x1b,0x3a,0x96, 0x17,0x39,0x98,0x18,0x3b,0x9a,0x1a,0x3a,0x99,0x19,0x3c,0x9b,0x1b,0x82,0x3a, 0x99,0x19,0x06,0x3a,0x99,0x1b,0x37,0x96,0x16,0x39,0x98,0x1a,0x38,0x97,0x19, 0x37,0x96,0x18,0x3a,0x99,0x19,0x82,0x36,0x95,0x15,0x07,0x38,0x97,0x17,0x37, 0x96,0x18,0x37,0x98,0x17,0x39,0x98,0x18,0x37,0x96,0x16,0x38,0x99,0x18,0x39, 0x9a,0x19,0x82,0x37,0x96,0x16,0x03,0x38,0x97,0x17,0x34,0x93,0x13,0x36,0x95, 0x15,0x82,0x37,0x96,0x16,0x08,0x34,0x93,0x13,0x39,0x98,0x18,0x3a,0x99,0x19, 0x35,0x94,0x14,0x34,0x95,0x14,0x38,0x99,0x18,0x39,0x9a,0x17,0x38,0x99,0x16, 0x82,0x37,0x98,0x15,0x82,0x36,0x95,0x13,0x07,0x34,0x95,0x14,0x36,0x97,0x14, 0x37,0x98,0x17,0x35,0x96,0x15,0x36,0x97,0x14,0x37,0x98,0x17,0x33,0x94,0x13, 0x82,0x35,0x96,0x15,0x07,0x34,0x95,0x14,0x32,0x93,0x12,0x34,0x95,0x14,0x33, 0x94,0x13,0x35,0x96,0x15,0x33,0x94,0x13,0x34,0x95,0x14,0x83,0x33,0x94,0x11, 0x08,0x32,0x93,0x12,0x33,0x94,0x13,0x33,0x94,0x11,0x35,0x96,0x13,0x31,0x95, 0x11,0x32,0x96,0x12,0x33,0x94,0x11,0x33,0x94,0x13,0x82,0x34,0x95,0x12,0x04, 0x34,0x95,0x14,0x31,0x92,0x0f,0x33,0x94,0x11,0x31,0x95,0x0f,0x82,0x32,0x96, 0x12,0x09,0x2f,0x93,0x0f,0x32,0x93,0x10,0x33,0x94,0x11,0x30,0x94,0x10,0x2f, 0x93,0x0f,0x30,0x95,0x11,0x31,0x95,0x11,0x2f,0x93,0x0d,0x31,0x95,0x0f,0x82, 0x30,0x94,0x10,0x02,0x31,0x95,0x11,0x31,0x97,0x10,0x82,0x30,0x96,0x0f,0x02, 0x2f,0x95,0x0e,0x31,0x97,0x10,0x82,0x2f,0x95,0x0e,0x01,0x31,0x97,0x0f,0x82, 0x2f,0x95,0x0d,0x05,0x2f,0x97,0x0e,0x31,0x99,0x10,0x32,0x98,0x10,0x2f,0x97, 0x0c,0x30,0x98,0x0d,0x82,0x32,0x9a,0x0f,0x03,0x2f,0x97,0x0e,0x31,0x9a,0x0c, 0x33,0x9c,0x0e,0x82,0x32,0x9a,0x0f,0x08,0x35,0x9e,0x10,0x33,0x9c,0x0e,0x31, 0x99,0x0e,0x30,0x9b,0x0d,0x32,0x9d,0x0f,0x33,0x9e,0x10,0x32,0x9d,0x0f,0x30, 0x9c,0x0b,0x82,0x31,0x9d,0x0c,0x13,0x32,0x9e,0x0d,0x33,0xa1,0x0e,0x33,0x9f, 0x0e,0x31,0x9d,0x0c,0x33,0x9f,0x0d,0x33,0xa1,0x0e,0x31,0x9e,0x0d,0x33,0x9f, 0x0e,0x32,0x9e,0x0c,0x32,0xa0,0x0d,0x34,0xa0,0x0e,0x33,0xa1,0x0e,0x32,0xa0, 0x0d,0x32,0x9e,0x0c,0x33,0xa1,0x0e,0x32,0xa3,0x0d,0x35,0xa1,0x0d,0x33,0xa1, 0x0e,0x33,0xa1,0x0c,0x82,0x35,0xa3,0x0e,0x02,0x34,0xa2,0x0d,0x35,0xa3,0x0e, 0x85,0x36,0xa4,0x0f,0x82,0x34,0xa5,0x0d,0x05,0x37,0xa5,0x0e,0x38,0xa6,0x0f, 0x39,0xa7,0x10,0x38,0xa6,0x0f,0x37,0xa8,0x10,0x82,0x37,0xa8,0x0e,0x01,0x3a, 0xa9,0x0f,0x83,0x38,0xa9,0x0f,0x01,0x39,0xaa,0x10,0x82,0x3b,0xaa,0x0e,0x01, 0x3d,0xac,0x10,0x86,0x3b,0xad,0x10,0x02,0x3c,0xae,0x11,0x3d,0xaf,0x11,0x83, 0x3b,0xad,0x0f,0x03,0x3f,0xad,0x11,0x3d,0xae,0x11,0x3b,0xab,0x0f,0x82,0x3b, 0xab,0x10,0x82,0x3d,0xad,0x10,0x16,0x3d,0xac,0x10,0x3f,0xae,0x14,0x40,0xab, 0x13,0x3e,0xaa,0x12,0x3f,0xaa,0x13,0x3d,0xab,0x13,0x3d,0xaa,0x11,0x3f,0xaa, 0x11,0x3f,0xa9,0x11,0x3e,0xab,0x14,0x3e,0xa8,0x13,0x3f,0xa8,0x13,0x40,0xa9, 0x14,0x3f,0xa7,0x13,0x3e,0xa7,0x13,0x3e,0xa6,0x13,0x3f,0xa7,0x14,0x3e,0xa5, 0x13,0x40,0xa7,0x15,0x3f,0xa6,0x15,0x3e,0xa5,0x14,0x3d,0xa4,0x13,0x82,0x3f, 0xa4,0x14,0x04,0x3f,0xa3,0x14,0x3e,0xa3,0x14,0x40,0xa4,0x15,0x3e,0xa2,0x13, 0x83,0x3e,0xa1,0x13,0x07,0x3e,0xa1,0x14,0x3f,0xa1,0x15,0x40,0x9f,0x14,0x3e, 0x9d,0x13,0x3f,0x9d,0x14,0x3f,0x9e,0x15,0x3d,0x9d,0x15,0x82,0x3c,0x9c,0x14, 0x06,0x3d,0x9a,0x13,0x3c,0x99,0x12,0x3c,0x99,0x14,0x3b,0x97,0x13,0x3b,0x98, 0x12,0x3b,0x97,0x12,0x82,0x3b,0x96,0x13,0x10,0x3a,0x95,0x13,0x39,0x93,0x11, 0x38,0x93,0x13,0x37,0x90,0x11,0x36,0x8d,0x10,0x36,0x8c,0x11,0x36,0x8c,0x13, 0x35,0x8b,0x12,0x34,0x87,0x0f,0x34,0x86,0x10,0x31,0x85,0x0f,0x30,0x81,0x0e, 0x32,0x82,0x0f,0x30,0x7f,0x0f,0x2e,0x7d,0x0d,0x30,0x7e,0x0f,0x82,0x30,0x7c, 0x10,0x13,0x2e,0x79,0x0e,0x2e,0x79,0x0f,0x2f,0x78,0x0f,0x2e,0x77,0x10,0x30, 0x78,0x11,0x2c,0x75,0x0f,0x22,0x6a,0x07,0x1f,0x67,0x04,0x20,0x67,0x06,0x1f, 0x66,0x05,0x20,0x66,0x06,0x1f,0x64,0x06,0x1d,0x62,0x04,0x1d,0x61,0x04,0x1f, 0x63,0x06,0x1e,0x62,0x05,0x1d,0x61,0x03,0x1d,0x61,0x05,0x1c,0x5f,0x03,0x82, 0x1b,0x5d,0x04,0x82,0x1b,0x5d,0x03,0x82,0x1a,0x5b,0x03,0x04,0x1b,0x5b,0x03, 0x1a,0x5a,0x02,0x18,0x59,0x02,0x18,0x58,0x02,0x82,0x19,0x58,0x02,0x03,0x18, 0x58,0x04,0x18,0x56,0x02,0x18,0x55,0x02,0x84,0x17,0x56,0x02,0x0c,0x17,0x55, 0x02,0x16,0x54,0x02,0x17,0x53,0x02,0x16,0x54,0x01,0x18,0x54,0x02,0x18,0x53, 0x03,0x17,0x54,0x02,0x16,0x53,0x01,0x16,0x52,0x00,0x15,0x51,0x02,0x16,0x52, 0x02,0x15,0x52,0x01,0x82,0x17,0x51,0x01,0x07,0x17,0x50,0x01,0x15,0x51,0x01, 0x15,0x50,0x01,0x16,0x50,0x01,0x17,0x50,0x02,0x16,0x4e,0x00,0x16,0x4e,0x02, 0x82,0x15,0x4e,0x02,0x15,0x15,0x4e,0x01,0x16,0x4d,0x01,0x15,0x4c,0x00,0x16, 0x4d,0x01,0x15,0x4c,0x00,0x15,0x4c,0x01,0x14,0x4c,0x01,0x13,0x4b,0x00,0x15, 0x4c,0x01,0x16,0x4c,0x01,0x16,0x4b,0x01,0x14,0x4c,0x01,0x14,0x4a,0x01,0x15, 0x4b,0x01,0x17,0x4b,0x03,0x15,0x4b,0x02,0x13,0x4a,0x01,0x13,0x49,0x01,0x14, 0x4a,0x02,0x14,0x49,0x01,0x13,0x48,0x02,0x82,0x13,0x49,0x01,0x01,0x13,0x47, 0x01,0x82,0x12,0x46,0x00,0x01,0x13,0x47,0x01,0x82,0x13,0x46,0x01,0x10,0x13, 0x46,0x02,0x12,0x46,0x01,0x11,0x45,0x01,0x13,0x45,0x02,0x12,0x45,0x01,0x11, 0x44,0x01,0x12,0x44,0x00,0x12,0x44,0x01,0x12,0x44,0x02,0x12,0x44,0x01,0x11, 0x43,0x01,0x11,0x42,0x00,0x11,0x42,0x01,0x12,0x42,0x01,0x11,0x43,0x02,0x12, 0x43,0x02,0x82,0x11,0x41,0x01,0x82,0x11,0x41,0x00,0x82,0x11,0x40,0x00,0x0b, 0x10,0x40,0x00,0x10,0x3f,0x00,0x10,0x3f,0x01,0x11,0x3f,0x02,0x11,0x3e,0x02, 0x10,0x3e,0x01,0x10,0x3e,0x02,0x10,0x3e,0x00,0x0f,0x3e,0x01,0x0f,0x3d,0x01, 0x10,0x3e,0x02,0x82,0x10,0x3d,0x02,0x01,0x0f,0x3c,0x00,0x82,0x0f,0x3b,0x00, 0x01,0x0e,0x39,0x00,0x85,0x0f,0x3a,0x00,0x07,0x0e,0x39,0x00,0x0f,0x3a,0x01, 0x0e,0x39,0x00,0x0e,0x39,0x01,0x0e,0x39,0x00,0x0e,0x38,0x00,0x0f,0x38,0x00, 0x82,0x0e,0x37,0x00,0x02,0x0e,0x37,0x01,0x0e,0x37,0x00,0x82,0x0e,0x36,0x00, 0x83,0x0e,0x35,0x00,0x04,0x0d,0x35,0x00,0x0d,0x34,0x00,0x0e,0x35,0x01,0x0c, 0x35,0x00,0x82,0x0d,0x33,0x00,0x04,0x0d,0x34,0x00,0x0d,0x33,0x01,0x0d,0x33, 0x00,0x0c,0x32,0x00,0x82,0x0d,0x32,0x00,0x01,0x0d,0x32,0x01,0x82,0x0c,0x31, 0x00,0x03,0x0c,0x30,0x00,0x0d,0x30,0x00,0x0d,0x30,0x01,0x82,0x0c,0x2f,0x00, 0x01,0x0b,0x30,0x01,0x83,0x0b,0x2f,0x00,0x04,0x0c,0x2e,0x00,0x0c,0x2e,0x01, 0x0b,0x2e,0x01,0x0b,0x2d,0x01,0x82,0x0b,0x2c,0x00,0x01,0x0b,0x2c,0x01,0x82, 0x0b,0x2c,0x00,0x83,0x0b,0x2b,0x00,0x03,0x0b,0x2a,0x00,0x0b,0x2a,0x01,0x0a, 0x29,0x00,0x84,0x0b,0x29,0x01,0x01,0x0a,0x28,0x00,0x86,0x0a,0x27,0x00,0x03, 0x09,0x26,0x00,0x0a,0x26,0x00,0x0a,0x25,0x00,0x82,0x09,0x25,0x00,0x03,0x09, 0x24,0x00,0x0a,0x24,0x01,0x09,0x24,0x01,0x82,0x09,0x23,0x00,0x82,0x09,0x23, 0x01,0x82,0x09,0x22,0x00,0x0b,0x09,0x21,0x00,0x09,0x22,0x01,0x09,0x21,0x01, 0x09,0x20,0x00,0x09,0x20,0x01,0x08,0x20,0x01,0x08,0x1f,0x00,0x09,0x1f,0x01, 0x08,0x1f,0x01,0x08,0x1f,0x00,0x08,0x1f,0x01,0x83,0x08,0x1e,0x00,0x82,0x08, 0x1d,0x00,0x02,0x07,0x1c,0x00,0x07,0x1d,0x00,0x82,0x07,0x1c,0x00,0x01,0x07, 0x1b,0x00,0x82,0x07,0x1b,0x01,0x02,0x07,0x1a,0x01,0x06,0x1a,0x00,0x82,0x07, 0x1a,0x00,0x07,0x07,0x19,0x00,0x07,0x19,0x01,0x06,0x19,0x01,0x06,0x19,0x00, 0x06,0x18,0x00,0x06,0x17,0x00,0x06,0x18,0x01,0x83,0x06,0x17,0x00,0x04,0x06, 0x16,0x00,0x05,0x16,0x00,0x05,0x15,0x00,0x06,0x16,0x00,0x82,0x05,0x15,0x00, 0x83,0x05,0x14,0x00,0x02,0x05,0x13,0x00,0x05,0x13,0x01,0x82,0x05,0x13,0x00, 0x01,0x05,0x12,0x00,0x82,0x04,0x12,0x00,0x83,0x04,0x11,0x00,0x82,0x04,0x10, 0x00,0x83,0x04,0x0f,0x00,0x82,0x04,0x0e,0x00,0x82,0x03,0x0e,0x00,0x83,0x03, 0x0d,0x00,0x83,0x03,0x0c,0x00,0x83,0x03,0x0b,0x00,0x84,0x02,0x0a,0x00,0x83, 0x02,0x09,0x00,0x84,0x02,0x08,0x00,0x83,0x02,0x07,0x00,0x83,0x01,0x06,0x00, 0x83,0x01,0x05,0x00,0x83,0x01,0x04,0x00,0x01,0x01,0x03,0x00,0x83,0x00,0x03, 0x00,0x83,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xdb,0x00,0x00,0x00,0x01,0x4b, 0xaa,0x28,0x82,0x4a,0xa9,0x27,0x0f,0x47,0xa8,0x23,0x49,0xaa,0x25,0x49,0xaa, 0x27,0x4b,0xaa,0x28,0x49,0xa8,0x26,0x48,0xa7,0x25,0x4a,0xab,0x28,0x4a,0xab, 0x26,0x48,0xa9,0x24,0x48,0xa9,0x26,0x48,0xa7,0x25,0x4a,0xa9,0x27,0x48,0xa7, 0x25,0x46,0xa5,0x23,0x49,0xa8,0x26,0x82,0x48,0xa7,0x25,0x0e,0x49,0xa8,0x26, 0x47,0xa8,0x25,0x47,0xa8,0x23,0x45,0xa6,0x21,0x46,0xa7,0x24,0x46,0xa5,0x23, 0x47,0xa6,0x24,0x48,0xa7,0x25,0x45,0xa4,0x22,0x47,0xa6,0x26,0x46,0xa5,0x25, 0x45,0xa4,0x24,0x44,0xa3,0x21,0x48,0xa7,0x25,0x82,0x46,0xa5,0x23,0x07,0x45, 0xa4,0x24,0x45,0xa4,0x22,0x46,0xa5,0x23,0x45,0xa1,0x22,0x45,0xa4,0x22,0x46, 0xa5,0x23,0x47,0xa6,0x24,0x82,0x44,0xa3,0x21,0x82,0x45,0xa4,0x22,0x09,0x44, 0xa3,0x21,0x46,0xa2,0x23,0x44,0xa3,0x25,0x42,0xa1,0x21,0x41,0xa2,0x1f,0x43, 0xa2,0x22,0x44,0xa3,0x23,0x43,0xa2,0x20,0x42,0xa1,0x21,0x82,0x43,0xa2,0x20, 0x01,0x43,0xa2,0x22,0x82,0x42,0xa1,0x21,0x83,0x43,0xa2,0x22,0x09,0x40,0xa1, 0x20,0x41,0xa0,0x20,0x42,0xa1,0x21,0x41,0xa0,0x20,0x42,0xa1,0x21,0x3e,0x9d, 0x1d,0x40,0x9f,0x1f,0x42,0xa1,0x21,0x3e,0x9d,0x1d,0x83,0x40,0x9f,0x1f,0x01, 0x42,0xa1,0x21,0x82,0x41,0xa0,0x20,0x02,0x40,0x9f,0x1d,0x3f,0xa0,0x1d,0x82, 0x3f,0x9e,0x1e,0x06,0x41,0xa0,0x20,0x40,0x9f,0x1f,0x3f,0x9e,0x1e,0x3e,0x9d, 0x1f,0x3d,0x9c,0x1e,0x3d,0x9e,0x1d,0x82,0x3f,0x9e,0x1e,0x08,0x3f,0x9b,0x1c, 0x3e,0x9d,0x1d,0x3d,0x9e,0x1d,0x3e,0x9f,0x1e,0x3e,0x9d,0x1d,0x3d,0x9c,0x1c, 0x3e,0x9d,0x1d,0x40,0x9f,0x1f,0x83,0x3d,0x9c,0x1c,0x04,0x3f,0x9b,0x1c,0x3e, 0x9a,0x1b,0x3d,0x9e,0x1d,0x3a,0x9b,0x1a,0x82,0x3c,0x9b,0x1b,0x0c,0x3f,0x9b, 0x1c,0x3d,0x99,0x1c,0x3f,0x9b,0x1e,0x3e,0x9d,0x1d,0x3e,0x9a,0x1b,0x3c,0x9b, 0x1b,0x3b,0x9c,0x1b,0x3c,0x9b,0x1b,0x3b,0x9a,0x1a,0x3a,0x9b,0x1a,0x3b,0x9c, 0x1b,0x3a,0x99,0x19,0x82,0x3b,0x9a,0x1a,0x0e,0x3c,0x9b,0x19,0x3e,0x9d,0x1b, 0x3a,0x99,0x19,0x3a,0x99,0x1b,0x3c,0x98,0x1b,0x3d,0x99,0x1a,0x3a,0x99,0x19, 0x3a,0x99,0x17,0x3b,0x9a,0x1a,0x3b,0x9a,0x1c,0x3b,0x9c,0x19,0x39,0x98,0x18, 0x3a,0x99,0x1b,0x3c,0x9b,0x1b,0x82,0x3b,0x9a,0x1c,0x83,0x38,0x97,0x17,0x0c, 0x37,0x96,0x16,0x36,0x95,0x15,0x37,0x96,0x16,0x37,0x96,0x14,0x37,0x98,0x17, 0x38,0x99,0x18,0x39,0x98,0x18,0x3a,0x99,0x19,0x38,0x99,0x18,0x39,0x98,0x18, 0x38,0x94,0x15,0x37,0x96,0x16,0x82,0x38,0x97,0x17,0x11,0x36,0x95,0x13,0x37, 0x96,0x14,0x38,0x97,0x17,0x35,0x94,0x14,0x39,0x98,0x18,0x37,0x98,0x17,0x38, 0x99,0x18,0x37,0x98,0x15,0x36,0x97,0x14,0x38,0x99,0x16,0x38,0x97,0x15,0x39, 0x98,0x16,0x36,0x95,0x13,0x37,0x98,0x15,0x37,0x98,0x13,0x35,0x96,0x13,0x32, 0x93,0x12,0x82,0x36,0x97,0x14,0x1e,0x35,0x96,0x15,0x35,0x96,0x13,0x34,0x95, 0x12,0x38,0x99,0x16,0x36,0x97,0x14,0x34,0x95,0x12,0x37,0x98,0x15,0x35,0x96, 0x13,0x33,0x94,0x11,0x36,0x97,0x14,0x33,0x97,0x13,0x32,0x93,0x10,0x33,0x94, 0x11,0x35,0x94,0x12,0x35,0x94,0x14,0x34,0x95,0x14,0x34,0x95,0x12,0x34,0x98, 0x14,0x33,0x97,0x13,0x32,0x96,0x12,0x32,0x96,0x10,0x32,0x96,0x12,0x31,0x95, 0x11,0x32,0x96,0x10,0x31,0x95,0x11,0x32,0x96,0x12,0x35,0x99,0x13,0x31,0x95, 0x0f,0x2f,0x93,0x0f,0x30,0x94,0x10,0x82,0x33,0x94,0x11,0x06,0x30,0x94,0x10, 0x2e,0x92,0x0e,0x2e,0x93,0x0f,0x2f,0x95,0x0e,0x30,0x94,0x0e,0x31,0x95,0x0f, 0x82,0x30,0x94,0x10,0x0c,0x32,0x96,0x12,0x30,0x96,0x0f,0x2e,0x94,0x0d,0x30, 0x96,0x0f,0x2f,0x95,0x0e,0x30,0x96,0x0f,0x2e,0x94,0x0d,0x30,0x96,0x0f,0x34, 0x9a,0x12,0x31,0x97,0x0f,0x31,0x95,0x0e,0x30,0x98,0x0f,0x82,0x32,0x98,0x10, 0x82,0x30,0x98,0x0d,0x1e,0x30,0x96,0x0c,0x30,0x98,0x0d,0x2e,0x99,0x0d,0x31, 0x9c,0x10,0x32,0x9a,0x0f,0x35,0x9e,0x10,0x32,0x9b,0x0d,0x30,0x98,0x0d,0x31, 0x9c,0x10,0x31,0x9e,0x0f,0x32,0x9d,0x0f,0x31,0x9c,0x0e,0x33,0x9e,0x10,0x32, 0x9d,0x0f,0x31,0x9d,0x0c,0x30,0x9c,0x0b,0x32,0x9e,0x0d,0x33,0x9f,0x0e,0x32, 0x9e,0x0d,0x31,0x9d,0x0c,0x32,0x9e,0x0d,0x31,0x9d,0x0c,0x33,0xa0,0x0f,0x33, 0xa1,0x0e,0x32,0xa0,0x0d,0x33,0xa0,0x0f,0x34,0xa0,0x0e,0x31,0x9f,0x0c,0x32, 0x9e,0x0c,0x34,0xa0,0x0e,0x82,0x33,0xa1,0x0e,0x08,0x34,0xa0,0x0c,0x33,0xa1, 0x0c,0x33,0xa1,0x0e,0x33,0xa1,0x0c,0x34,0xa2,0x0d,0x35,0xa1,0x0d,0x36,0xa2, 0x0e,0x35,0xa3,0x0e,0x82,0x36,0xa4,0x0f,0x82,0x36,0xa4,0x0d,0x01,0x34,0xa5, 0x0d,0x83,0x35,0xa6,0x0e,0x03,0x37,0xa5,0x0e,0x38,0xa6,0x0f,0x37,0xa3,0x0f, 0x82,0x36,0xa7,0x0f,0x02,0x37,0xa8,0x0e,0x3a,0xa9,0x0f,0x83,0x38,0xa9,0x0f, 0x01,0x39,0xab,0x0e,0x82,0x3b,0xaa,0x0e,0x82,0x3a,0xac,0x0f,0x82,0x3c,0xab, 0x0f,0x02,0x3b,0xad,0x10,0x3a,0xad,0x10,0x82,0x3b,0xad,0x10,0x02,0x3c,0xb0, 0x11,0x3c,0xae,0x10,0x82,0x3b,0xad,0x0f,0x12,0x3e,0xac,0x10,0x3d,0xae,0x11, 0x3c,0xac,0x10,0x3d,0xad,0x12,0x3e,0xab,0x11,0x3f,0xad,0x10,0x40,0xad,0x11, 0x3d,0xac,0x10,0x3d,0xac,0x12,0x3e,0xac,0x14,0x3d,0xa9,0x11,0x3b,0xa9,0x11, 0x3f,0xad,0x13,0x3d,0xaa,0x11,0x3f,0xaa,0x11,0x3f,0xab,0x13,0x3d,0xaa,0x12, 0x3e,0xa8,0x13,0x82,0x3e,0xa7,0x12,0x02,0x3e,0xa6,0x12,0x3f,0xa8,0x14,0x82, 0x3e,0xa6,0x13,0x82,0x40,0xa7,0x15,0x03,0x3f,0xa8,0x16,0x3d,0xa7,0x15,0x3e, 0xa5,0x14,0x82,0x3e,0xa3,0x13,0x05,0x40,0xa4,0x15,0x3f,0xa5,0x15,0x3f,0xa3, 0x14,0x3e,0xa2,0x13,0x3d,0xa1,0x13,0x82,0x3e,0xa1,0x13,0x13,0x3d,0x9f,0x12, 0x3e,0xa1,0x14,0x41,0xa0,0x15,0x3f,0x9e,0x13,0x3f,0x9d,0x13,0x3d,0x9e,0x13, 0x3d,0x9e,0x14,0x3c,0x9d,0x13,0x3e,0x9e,0x15,0x3c,0x9b,0x14,0x3d,0x9a,0x13, 0x3d,0x99,0x15,0x3e,0x9b,0x14,0x3c,0x99,0x13,0x3e,0x9a,0x14,0x3d,0x99,0x14, 0x3b,0x96,0x12,0x3b,0x97,0x12,0x3b,0x96,0x12,0x82,0x39,0x93,0x12,0x11,0x39, 0x91,0x13,0x3a,0x90,0x13,0x36,0x8c,0x11,0x34,0x8a,0x0f,0x34,0x89,0x11,0x35, 0x89,0x13,0x33,0x88,0x10,0x31,0x83,0x0e,0x33,0x83,0x10,0x32,0x82,0x10,0x2f, 0x7f,0x0d,0x30,0x7e,0x0f,0x2f,0x7d,0x10,0x2f,0x7a,0x0f,0x31,0x7c,0x11,0x30, 0x7b,0x10,0x30,0x79,0x10,0x82,0x2f,0x78,0x0f,0x10,0x2f,0x77,0x10,0x2e,0x76, 0x11,0x29,0x71,0x0c,0x20,0x67,0x06,0x1f,0x66,0x05,0x20,0x65,0x05,0x1f,0x64, 0x04,0x1f,0x63,0x06,0x1e,0x62,0x05,0x1f,0x63,0x06,0x1e,0x62,0x05,0x1e,0x63, 0x04,0x1d,0x61,0x05,0x1d,0x60,0x04,0x1c,0x5e,0x05,0x1b,0x5d,0x04,0x82,0x1b, 0x5d,0x03,0x05,0x1a,0x5c,0x02,0x19,0x5a,0x03,0x1b,0x5b,0x03,0x1c,0x5b,0x04, 0x19,0x59,0x02,0x83,0x19,0x58,0x02,0x17,0x18,0x57,0x01,0x18,0x56,0x02,0x18, 0x55,0x02,0x19,0x56,0x03,0x18,0x57,0x02,0x17,0x56,0x02,0x16,0x55,0x01,0x17, 0x55,0x02,0x16,0x54,0x02,0x18,0x53,0x02,0x16,0x52,0x00,0x16,0x53,0x01,0x17, 0x54,0x03,0x17,0x53,0x01,0x17,0x53,0x02,0x17,0x54,0x02,0x16,0x50,0x01,0x15, 0x52,0x02,0x16,0x51,0x02,0x15,0x51,0x01,0x17,0x51,0x02,0x16,0x51,0x02,0x17, 0x50,0x01,0x82,0x16,0x50,0x01,0x06,0x16,0x50,0x02,0x16,0x4e,0x00,0x15,0x4d, 0x01,0x16,0x4e,0x02,0x15,0x4d,0x01,0x16,0x4e,0x01,0x82,0x16,0x4d,0x01,0x02, 0x14,0x4d,0x01,0x13,0x4b,0x00,0x82,0x14,0x4c,0x01,0x01,0x15,0x4b,0x00,0x82, 0x15,0x4b,0x01,0x01,0x16,0x4b,0x01,0x83,0x14,0x4b,0x01,0x02,0x14,0x4b,0x00, 0x13,0x4a,0x00,0x82,0x13,0x49,0x01,0x10,0x13,0x4a,0x01,0x14,0x4a,0x01,0x13, 0x48,0x02,0x13,0x48,0x01,0x14,0x49,0x01,0x13,0x47,0x01,0x14,0x47,0x01,0x13, 0x46,0x01,0x13,0x48,0x03,0x12,0x47,0x01,0x12,0x45,0x01,0x13,0x46,0x01,0x13, 0x47,0x02,0x11,0x45,0x01,0x13,0x44,0x00,0x11,0x43,0x00,0x82,0x12,0x45,0x01, 0x0b,0x12,0x45,0x02,0x13,0x45,0x02,0x11,0x43,0x01,0x11,0x43,0x00,0x12,0x44, 0x01,0x12,0x43,0x00,0x12,0x42,0x02,0x12,0x44,0x02,0x11,0x42,0x01,0x11,0x41, 0x01,0x11,0x42,0x01,0x82,0x11,0x41,0x01,0x03,0x11,0x40,0x00,0x11,0x40,0x01, 0x12,0x41,0x01,0x82,0x11,0x40,0x01,0x05,0x11,0x3f,0x01,0x11,0x3e,0x00,0x10, 0x3e,0x00,0x10,0x3e,0x01,0x10,0x3e,0x00,0x82,0x10,0x3e,0x02,0x09,0x0f,0x3d, 0x01,0x0f,0x3d,0x00,0x0f,0x3c,0x00,0x10,0x3c,0x00,0x0f,0x3b,0x00,0x0f,0x3c, 0x00,0x0f,0x3b,0x01,0x0e,0x3a,0x00,0x0f,0x3b,0x00,0x82,0x0f,0x3a,0x00,0x05, 0x0f,0x39,0x00,0x0e,0x39,0x00,0x0e,0x39,0x01,0x0e,0x37,0x00,0x0e,0x39,0x00, 0x82,0x0e,0x37,0x00,0x03,0x0f,0x38,0x00,0x0e,0x37,0x00,0x0e,0x36,0x00,0x82, 0x0e,0x37,0x00,0x82,0x0e,0x36,0x00,0x04,0x0e,0x35,0x00,0x0e,0x36,0x01,0x0e, 0x35,0x00,0x0d,0x35,0x00,0x82,0x0d,0x34,0x00,0x02,0x0d,0x35,0x01,0x0c,0x34, 0x00,0x82,0x0d,0x34,0x00,0x02,0x0c,0x34,0x00,0x0c,0x33,0x00,0x83,0x0d,0x32, 0x00,0x04,0x0d,0x32,0x01,0x0c,0x31,0x00,0x0d,0x31,0x01,0x0c,0x30,0x00,0x82, 0x0b,0x30,0x00,0x82,0x0c,0x2f,0x00,0x01,0x0d,0x30,0x01,0x82,0x0b,0x2f,0x01, 0x11,0x0c,0x2f,0x00,0x0c,0x2e,0x00,0x0c,0x2e,0x01,0x0b,0x2e,0x00,0x0b,0x2e, 0x01,0x0b,0x2c,0x00,0x0c,0x2c,0x01,0x0b,0x2d,0x01,0x0b,0x2c,0x01,0x0b,0x2b, 0x00,0x0a,0x2c,0x01,0x0b,0x2c,0x00,0x0b,0x2b,0x00,0x0b,0x2a,0x00,0x0b,0x2a, 0x01,0x0a,0x29,0x00,0x0b,0x29,0x01,0x85,0x0a,0x28,0x00,0x02,0x0a,0x27,0x00, 0x0a,0x28,0x01,0x83,0x0a,0x27,0x00,0x03,0x09,0x26,0x00,0x0a,0x26,0x00,0x0a, 0x25,0x00,0x82,0x09,0x25,0x00,0x82,0x09,0x24,0x00,0x84,0x09,0x23,0x00,0x02, 0x09,0x22,0x00,0x08,0x22,0x00,0x82,0x09,0x22,0x00,0x04,0x09,0x22,0x01,0x09, 0x21,0x01,0x08,0x20,0x01,0x09,0x20,0x01,0x82,0x08,0x20,0x00,0x06,0x09,0x1f, 0x01,0x08,0x1f,0x00,0x08,0x1f,0x01,0x08,0x1f,0x00,0x08,0x1e,0x00,0x08,0x1e, 0x01,0x83,0x08,0x1d,0x00,0x03,0x07,0x1c,0x00,0x07,0x1d,0x00,0x07,0x1c,0x00, 0x82,0x07,0x1b,0x00,0x83,0x07,0x1b,0x01,0x82,0x07,0x1a,0x01,0x04,0x07,0x1a, 0x00,0x07,0x19,0x01,0x06,0x19,0x01,0x06,0x19,0x00,0x83,0x06,0x18,0x00,0x82, 0x06,0x17,0x01,0x02,0x06,0x17,0x00,0x06,0x16,0x00,0x82,0x06,0x16,0x01,0x04, 0x05,0x16,0x00,0x05,0x15,0x00,0x05,0x15,0x01,0x05,0x15,0x00,0x82,0x05,0x14, 0x00,0x82,0x05,0x13,0x00,0x82,0x05,0x13,0x01,0x02,0x05,0x12,0x00,0x04,0x13, 0x01,0x82,0x04,0x12,0x00,0x82,0x04,0x11,0x00,0x84,0x04,0x10,0x00,0x82,0x04, 0x0f,0x00,0x82,0x04,0x0e,0x00,0x82,0x03,0x0e,0x00,0x84,0x03,0x0d,0x00,0x83, 0x03,0x0c,0x00,0x03,0x03,0x0b,0x00,0x02,0x0b,0x00,0x03,0x0b,0x00,0x83,0x02, 0x0a,0x00,0x83,0x02,0x09,0x00,0x83,0x02,0x08,0x00,0x84,0x02,0x07,0x00,0x83, 0x01,0x06,0x00,0x83,0x01,0x05,0x00,0x83,0x01,0x04,0x00,0x01,0x01,0x03,0x00, 0x83,0x00,0x03,0x00,0x83,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xdb,0x00,0x00, 0x00,0x09,0x4b,0xaa,0x28,0x49,0xa8,0x26,0x4b,0xaa,0x28,0x4c,0xac,0x27,0x4a, 0xaa,0x25,0x4c,0xab,0x29,0x4a,0xa9,0x27,0x49,0xa8,0x26,0x46,0xa7,0x22,0x82, 0x49,0xaa,0x27,0x02,0x46,0xa7,0x24,0x49,0xaa,0x27,0x82,0x4a,0xaa,0x25,0x01, 0x49,0xa9,0x24,0x82,0x4a,0xab,0x26,0x0f,0x4a,0xaa,0x25,0x47,0xa8,0x25,0x49, 0xaa,0x27,0x49,0xa8,0x26,0x47,0xa8,0x25,0x48,0xa9,0x26,0x48,0xa7,0x27,0x47, 0xa6,0x24,0x48,0xa8,0x23,0x46,0xa7,0x22,0x47,0xa8,0x25,0x47,0xa6,0x24,0x45, 0xa4,0x22,0x48,0xa8,0x23,0x47,0xa7,0x22,0x82,0x47,0xa6,0x24,0x05,0x47,0xa7, 0x22,0x46,0xa5,0x23,0x45,0xa4,0x24,0x43,0xa4,0x23,0x45,0xa6,0x21,0x82,0x45, 0xa4,0x22,0x0e,0x44,0xa5,0x22,0x45,0xa6,0x23,0x46,0xa7,0x24,0x46,0xa5,0x23, 0x45,0xa4,0x22,0x43,0xa2,0x20,0x45,0xa4,0x22,0x42,0xa3,0x22,0x44,0xa5,0x20, 0x44,0xa3,0x21,0x42,0xa1,0x21,0x45,0xa4,0x22,0x44,0xa3,0x23,0x43,0xa2,0x20, 0x82,0x44,0xa3,0x21,0x82,0x42,0xa3,0x22,0x03,0x40,0xa1,0x20,0x43,0xa4,0x23, 0x43,0xa2,0x22,0x82,0x41,0xa0,0x20,0x04,0x41,0xa2,0x21,0x40,0xa1,0x20,0x41, 0xa0,0x20,0x42,0xa1,0x21,0x82,0x40,0x9f,0x1f,0x04,0x43,0xa2,0x22,0x41,0xa0, 0x20,0x40,0x9f,0x1f,0x3f,0x9e,0x1e,0x82,0x40,0x9f,0x1f,0x09,0x41,0xa0,0x20, 0x40,0x9f,0x1f,0x3f,0x9e,0x1e,0x3e,0x9f,0x1e,0x40,0x9f,0x1f,0x3d,0x9c,0x1c, 0x3e,0x9f,0x1e,0x3f,0xa0,0x1f,0x40,0x9f,0x1f,0x82,0x3e,0x9d,0x1d,0x04,0x40, 0x9c,0x1d,0x3f,0x9e,0x1e,0x41,0xa0,0x20,0x3f,0x9e,0x1e,0x82,0x3e,0x9d,0x1d, 0x16,0x3d,0x9c,0x1c,0x3f,0xa0,0x1f,0x3f,0x9e,0x1e,0x3d,0x9c,0x1c,0x3f,0x9e, 0x1e,0x3d,0x9e,0x1d,0x3d,0x9c,0x1c,0x3c,0x9b,0x1b,0x3d,0x9c,0x1c,0x3a,0x99, 0x19,0x3b,0x9c,0x1b,0x3d,0x9c,0x1e,0x3e,0x9d,0x1b,0x3b,0x9a,0x1a,0x3d,0x9c, 0x1c,0x3c,0x9b,0x1b,0x3d,0x9c,0x1e,0x3c,0x98,0x19,0x3b,0x9a,0x1a,0x3d,0x9c, 0x1a,0x3a,0x99,0x19,0x3c,0x9b,0x1d,0x82,0x3c,0x9b,0x1b,0x15,0x3c,0x9b,0x1d, 0x3b,0x9a,0x1c,0x3c,0x9b,0x1b,0x3b,0x9a,0x1a,0x3d,0x9c,0x1a,0x40,0x9d,0x1b, 0x3c,0x98,0x19,0x3e,0x9a,0x1b,0x3c,0x9b,0x1b,0x3b,0x9a,0x1a,0x39,0x99,0x1b, 0x3b,0x9a,0x1a,0x3c,0x9b,0x1b,0x3b,0x9a,0x18,0x3a,0x99,0x17,0x3a,0x99,0x19, 0x38,0x97,0x17,0x3b,0x9a,0x1a,0x3c,0x9b,0x1d,0x38,0x97,0x17,0x39,0x98,0x18, 0x82,0x3a,0x99,0x19,0x06,0x39,0x98,0x18,0x3a,0x99,0x19,0x37,0x96,0x18,0x3a, 0x99,0x19,0x37,0x96,0x16,0x37,0x98,0x17,0x82,0x39,0x9a,0x19,0x0d,0x38,0x97, 0x17,0x3b,0x9a,0x18,0x39,0x98,0x16,0x38,0x97,0x15,0x38,0x99,0x16,0x3a,0x9b, 0x18,0x35,0x94,0x14,0x38,0x97,0x17,0x35,0x94,0x14,0x37,0x98,0x17,0x39,0x98, 0x18,0x35,0x96,0x15,0x37,0x96,0x14,0x82,0x37,0x96,0x16,0x12,0x34,0x95,0x12, 0x39,0x9a,0x15,0x39,0x9a,0x17,0x36,0x95,0x15,0x37,0x98,0x17,0x34,0x95,0x14, 0x36,0x97,0x16,0x33,0x94,0x13,0x35,0x96,0x15,0x37,0x98,0x17,0x33,0x94,0x13, 0x35,0x96,0x15,0x34,0x95,0x14,0x36,0x97,0x14,0x34,0x95,0x12,0x36,0x97,0x14, 0x39,0x9a,0x17,0x36,0x97,0x14,0x82,0x35,0x96,0x13,0x05,0x35,0x96,0x11,0x34, 0x95,0x10,0x36,0x97,0x12,0x34,0x95,0x10,0x32,0x96,0x12,0x82,0x33,0x97,0x13, 0x82,0x32,0x96,0x10,0x01,0x32,0x96,0x12,0x82,0x34,0x95,0x12,0x22,0x35,0x96, 0x13,0x32,0x93,0x0e,0x30,0x94,0x0e,0x31,0x95,0x11,0x33,0x94,0x0f,0x33,0x94, 0x11,0x34,0x95,0x10,0x33,0x94,0x0f,0x32,0x93,0x10,0x33,0x94,0x0f,0x34,0x95, 0x10,0x31,0x92,0x11,0x31,0x92,0x0f,0x31,0x95,0x0f,0x31,0x97,0x0f,0x32,0x96, 0x10,0x30,0x94,0x0e,0x32,0x93,0x10,0x31,0x95,0x0f,0x30,0x96,0x0e,0x31,0x95, 0x0f,0x30,0x94,0x0e,0x30,0x96,0x0f,0x30,0x96,0x0e,0x31,0x97,0x0f,0x2f,0x95, 0x0d,0x32,0x98,0x11,0x31,0x97,0x10,0x32,0x98,0x10,0x30,0x96,0x0e,0x31,0x97, 0x0f,0x33,0x99,0x11,0x2f,0x97,0x0c,0x31,0x99,0x0e,0x82,0x33,0x9b,0x10,0x13, 0x30,0x9b,0x0f,0x30,0x98,0x0f,0x32,0x9a,0x0f,0x32,0x9b,0x0d,0x34,0x9d,0x0f, 0x31,0x9a,0x0c,0x32,0x9b,0x0d,0x34,0x9d,0x0d,0x31,0x9d,0x0c,0x32,0x9d,0x0f, 0x30,0x9b,0x0f,0x31,0x9c,0x0e,0x31,0x9d,0x0c,0x33,0x9f,0x0e,0x2f,0x9a,0x0c, 0x32,0x9d,0x0f,0x31,0x9e,0x0d,0x31,0x9d,0x0c,0x35,0x9e,0x0e,0x82,0x32,0x9e, 0x0d,0x09,0x33,0x9f,0x0d,0x34,0xa0,0x0e,0x33,0xa1,0x0e,0x32,0x9e,0x0c,0x31, 0x9d,0x0b,0x32,0xa0,0x0d,0x32,0xa2,0x0f,0x30,0xa0,0x0d,0x31,0xa1,0x0e,0x82, 0x33,0xa1,0x0c,0x03,0x33,0x9f,0x0d,0x35,0xa1,0x0d,0x34,0xa2,0x0d,0x82,0x35, 0xa3,0x10,0x02,0x36,0xa4,0x0d,0x35,0xa3,0x0c,0x83,0x33,0xa4,0x0e,0x01,0x34, 0xa5,0x0d,0x82,0x37,0xa5,0x0e,0x01,0x37,0xa4,0x0d,0x82,0x37,0xa5,0x0e,0x03, 0x35,0xa6,0x0e,0x34,0xa5,0x0d,0x36,0xa7,0x0f,0x82,0x39,0xa7,0x10,0x06,0x39, 0xa8,0x0e,0x38,0xa9,0x0f,0x36,0xa9,0x0e,0x37,0xaa,0x0d,0x38,0xaa,0x0d,0x3a, 0xac,0x0f,0x82,0x39,0xab,0x0e,0x0e,0x39,0xad,0x0e,0x3a,0xad,0x10,0x39,0xac, 0x0f,0x3a,0xad,0x12,0x3c,0xae,0x10,0x3e,0xad,0x10,0x3c,0xae,0x11,0x3d,0xaf, 0x11,0x3e,0xae,0x0e,0x3d,0xad,0x0d,0x3c,0xad,0x10,0x3c,0xaf,0x11,0x3b,0xad, 0x10,0x3c,0xac,0x10,0x82,0x3d,0xad,0x12,0x07,0x3d,0xad,0x10,0x3d,0xac,0x10, 0x3c,0xad,0x10,0x3e,0xac,0x13,0x3d,0xac,0x11,0x3e,0xac,0x12,0x3c,0xaa,0x10, 0x82,0x3f,0xa9,0x13,0x0c,0x3f,0xa9,0x14,0x3e,0xa9,0x11,0x3a,0xa9,0x10,0x3d, 0xa9,0x12,0x3e,0xaa,0x14,0x3f,0xa8,0x11,0x3f,0xa9,0x12,0x40,0xa9,0x13,0x3f, 0xa6,0x11,0x3e,0xa5,0x13,0x3d,0xa7,0x12,0x3f,0xa6,0x14,0x82,0x3f,0xa6,0x15, 0x09,0x3d,0xa3,0x13,0x3e,0xa4,0x14,0x40,0xa5,0x15,0x3e,0xa3,0x12,0x3d,0xa2, 0x14,0x3e,0xa2,0x13,0x3e,0xa1,0x13,0x3e,0xa2,0x14,0x3e,0xa1,0x13,0x82,0x3d, 0xa0,0x13,0x26,0x3e,0xa1,0x15,0x3e,0xa0,0x14,0x3d,0x9f,0x14,0x3d,0x9e,0x13, 0x3e,0x9d,0x13,0x3e,0x9c,0x13,0x3c,0x9d,0x14,0x3d,0x9e,0x15,0x3c,0x9c,0x13, 0x3c,0x9b,0x13,0x3d,0x9a,0x13,0x3e,0x9a,0x14,0x3b,0x97,0x12,0x3b,0x96,0x13, 0x3c,0x96,0x14,0x3b,0x97,0x12,0x3b,0x96,0x12,0x3a,0x95,0x11,0x38,0x92,0x11, 0x3a,0x92,0x14,0x39,0x90,0x13,0x36,0x8d,0x10,0x38,0x8d,0x13,0x37,0x8c,0x12, 0x36,0x8b,0x13,0x34,0x8a,0x0e,0x35,0x8a,0x11,0x32,0x86,0x0f,0x32,0x84,0x0f, 0x2f,0x7f,0x0d,0x32,0x81,0x11,0x2f,0x7d,0x0e,0x2e,0x7c,0x0d,0x32,0x7d,0x11, 0x30,0x7b,0x10,0x2f,0x7a,0x0f,0x30,0x7b,0x10,0x30,0x7a,0x10,0x82,0x2f,0x78, 0x0f,0x09,0x31,0x79,0x11,0x2b,0x71,0x0e,0x21,0x67,0x07,0x20,0x65,0x07,0x20, 0x65,0x06,0x1f,0x64,0x05,0x1f,0x63,0x06,0x1f,0x63,0x04,0x1e,0x62,0x03,0x82, 0x1e,0x62,0x06,0x02,0x1d,0x61,0x05,0x1d,0x60,0x05,0x83,0x1c,0x5f,0x04,0x06, 0x1b,0x5d,0x03,0x1a,0x5d,0x03,0x1a,0x5c,0x02,0x1a,0x5b,0x04,0x19,0x5a,0x03, 0x19,0x59,0x02,0x82,0x18,0x58,0x02,0x82,0x18,0x57,0x02,0x07,0x17,0x56,0x01, 0x17,0x57,0x02,0x17,0x56,0x02,0x17,0x55,0x01,0x17,0x56,0x02,0x16,0x55,0x01, 0x18,0x56,0x02,0x82,0x16,0x54,0x01,0x04,0x17,0x53,0x01,0x16,0x53,0x01,0x15, 0x52,0x00,0x17,0x53,0x02,0x82,0x16,0x53,0x02,0x05,0x16,0x54,0x02,0x16,0x53, 0x02,0x16,0x52,0x02,0x15,0x51,0x01,0x15,0x50,0x01,0x82,0x16,0x51,0x02,0x16, 0x16,0x50,0x02,0x15,0x51,0x02,0x15,0x50,0x03,0x13,0x4d,0x01,0x14,0x4e,0x01, 0x17,0x4f,0x01,0x16,0x4e,0x00,0x16,0x4d,0x01,0x14,0x4d,0x01,0x14,0x4e,0x01, 0x16,0x4e,0x02,0x14,0x4c,0x01,0x14,0x4d,0x01,0x15,0x4c,0x01,0x16,0x4c,0x01, 0x15,0x4b,0x01,0x13,0x4a,0x00,0x14,0x4a,0x01,0x15,0x4b,0x02,0x14,0x4b,0x01, 0x13,0x4a,0x01,0x13,0x4b,0x01,0x82,0x13,0x4a,0x01,0x05,0x12,0x49,0x01,0x14, 0x49,0x01,0x14,0x48,0x01,0x14,0x49,0x02,0x14,0x48,0x02,0x82,0x13,0x47,0x01, 0x04,0x12,0x46,0x00,0x14,0x46,0x01,0x13,0x47,0x00,0x12,0x47,0x00,0x82,0x12, 0x46,0x01,0x03,0x11,0x45,0x01,0x14,0x45,0x01,0x12,0x45,0x01,0x82,0x12,0x44, 0x01,0x0f,0x12,0x45,0x02,0x12,0x44,0x01,0x12,0x44,0x00,0x11,0x43,0x00,0x12, 0x44,0x01,0x12,0x43,0x01,0x13,0x43,0x01,0x12,0x42,0x00,0x12,0x42,0x02,0x10, 0x41,0x01,0x11,0x42,0x02,0x10,0x40,0x00,0x12,0x41,0x01,0x11,0x40,0x00,0x12, 0x3f,0x01,0x82,0x11,0x40,0x01,0x10,0x10,0x3f,0x00,0x10,0x3f,0x01,0x11,0x3e, 0x01,0x10,0x3e,0x01,0x11,0x3f,0x01,0x10,0x3e,0x01,0x10,0x3d,0x01,0x10,0x3c, 0x01,0x11,0x3d,0x02,0x10,0x3c,0x01,0x0f,0x3c,0x01,0x0e,0x3c,0x00,0x0f,0x3b, 0x00,0x10,0x3c,0x00,0x0f,0x3b,0x00,0x0f,0x3a,0x00,0x82,0x0e,0x3a,0x00,0x05, 0x0f,0x39,0x01,0x0d,0x38,0x00,0x0e,0x39,0x00,0x0e,0x38,0x00,0x0f,0x38,0x01, 0x82,0x0e,0x37,0x00,0x06,0x0e,0x37,0x01,0x0e,0x37,0x00,0x0e,0x36,0x00,0x0e, 0x37,0x00,0x0e,0x36,0x00,0x0d,0x35,0x00,0x82,0x0d,0x36,0x00,0x83,0x0e,0x36, 0x00,0x02,0x0d,0x35,0x00,0x0d,0x34,0x01,0x82,0x0d,0x34,0x00,0x84,0x0d,0x33, 0x00,0x01,0x0c,0x32,0x00,0x82,0x0d,0x32,0x00,0x05,0x0c,0x31,0x00,0x0c,0x32, 0x00,0x0d,0x32,0x00,0x0d,0x31,0x00,0x0d,0x30,0x00,0x82,0x0c,0x2f,0x00,0x02, 0x0c,0x30,0x00,0x0b,0x30,0x00,0x82,0x0c,0x2f,0x01,0x01,0x0c,0x2f,0x00,0x82, 0x0c,0x2e,0x01,0x82,0x0b,0x2e,0x00,0x02,0x0c,0x2d,0x00,0x0b,0x2d,0x00,0x82, 0x0b,0x2d,0x01,0x82,0x0b,0x2b,0x00,0x82,0x0b,0x2b,0x01,0x02,0x0b,0x2a,0x00, 0x0a,0x2b,0x01,0x82,0x0a,0x2a,0x01,0x01,0x0b,0x2a,0x01,0x83,0x0a,0x29,0x00, 0x01,0x0a,0x29,0x01,0x82,0x0a,0x27,0x00,0x0d,0x0b,0x27,0x01,0x09,0x26,0x00, 0x09,0x27,0x00,0x0a,0x27,0x01,0x0a,0x26,0x00,0x09,0x26,0x00,0x09,0x25,0x00, 0x09,0x24,0x00,0x0a,0x24,0x00,0x0a,0x25,0x01,0x09,0x24,0x00,0x09,0x23,0x00, 0x08,0x24,0x00,0x82,0x09,0x23,0x00,0x02,0x09,0x22,0x00,0x09,0x23,0x00,0x82, 0x09,0x22,0x00,0x06,0x09,0x21,0x00,0x09,0x21,0x01,0x08,0x21,0x00,0x09,0x20, 0x01,0x08,0x20,0x00,0x08,0x20,0x01,0x82,0x08,0x1f,0x00,0x83,0x08,0x1f,0x01, 0x01,0x08,0x1e,0x00,0x83,0x08,0x1d,0x00,0x04,0x07,0x1c,0x00,0x07,0x1d,0x00, 0x07,0x1c,0x00,0x07,0x1c,0x01,0x82,0x07,0x1b,0x00,0x84,0x07,0x1a,0x00,0x01, 0x06,0x19,0x00,0x82,0x07,0x19,0x01,0x04,0x06,0x19,0x01,0x06,0x18,0x01,0x06, 0x18,0x00,0x06,0x18,0x01,0x83,0x06,0x17,0x00,0x84,0x06,0x16,0x00,0x01,0x05, 0x15,0x00,0x82,0x05,0x15,0x01,0x82,0x05,0x14,0x00,0x84,0x05,0x13,0x00,0x83, 0x05,0x12,0x00,0x01,0x05,0x12,0x01,0x82,0x04,0x11,0x00,0x84,0x04,0x10,0x00, 0x83,0x04,0x0f,0x00,0x83,0x03,0x0e,0x00,0x84,0x03,0x0d,0x00,0x83,0x03,0x0c, 0x00,0x82,0x03,0x0b,0x00,0x84,0x02,0x0a,0x00,0x83,0x02,0x09,0x00,0x83,0x02, 0x08,0x00,0x83,0x02,0x07,0x00,0x01,0x01,0x07,0x00,0x83,0x01,0x06,0x00,0x83, 0x01,0x05,0x00,0x83,0x01,0x04,0x00,0x82,0x01,0x03,0x00,0x82,0x00,0x03,0x00, 0x83,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xdb,0x00,0x00,0x00,0x01,0x49,0xaa, 0x25,0x82,0x4c,0xad,0x28,0x07,0x4a,0xab,0x26,0x49,0xaa,0x25,0x4a,0xa9,0x27, 0x48,0xa7,0x25,0x49,0xa8,0x28,0x49,0xa9,0x24,0x48,0xa9,0x24,0x82,0x49,0xaa, 0x25,0x15,0x4a,0xab,0x26,0x4b,0xab,0x26,0x49,0xa9,0x24,0x4a,0xaa,0x25,0x49, 0xaa,0x25,0x4a,0xab,0x26,0x4a,0xaa,0x25,0x47,0xa8,0x25,0x49,0xaa,0x27,0x4a, 0xa9,0x27,0x48,0xa9,0x26,0x48,0xa9,0x24,0x48,0xa7,0x25,0x47,0xa6,0x24,0x48, 0xa8,0x23,0x47,0xa8,0x23,0x48,0xa9,0x24,0x47,0xa7,0x22,0x47,0xa6,0x24,0x48, 0xa9,0x26,0x46,0xa7,0x22,0x82,0x46,0xa7,0x24,0x05,0x46,0xa7,0x22,0x45,0xa6, 0x23,0x45,0xa6,0x25,0x45,0xa6,0x23,0x44,0xa8,0x22,0x82,0x46,0xa5,0x23,0x83, 0x45,0xa6,0x23,0x82,0x46,0xa5,0x23,0x13,0x44,0xa3,0x21,0x45,0xa4,0x22,0x45, 0xa6,0x25,0x43,0xa4,0x21,0x43,0xa2,0x22,0x46,0xa5,0x23,0x46,0xa6,0x21,0x41, 0xa2,0x21,0x45,0xa4,0x22,0x43,0xa4,0x21,0x44,0xa5,0x22,0x45,0xa4,0x22,0x43, 0xa2,0x22,0x41,0xa0,0x20,0x43,0xa2,0x22,0x43,0xa4,0x21,0x42,0xa3,0x20,0x43, 0xa2,0x22,0x42,0xa1,0x21,0x82,0x43,0xa2,0x22,0x01,0x42,0xa1,0x21,0x82,0x43, 0xa2,0x20,0x07,0x41,0xa0,0x20,0x42,0xa1,0x21,0x43,0xa2,0x22,0x40,0x9f,0x1f, 0x42,0xa1,0x21,0x41,0xa0,0x20,0x40,0x9f,0x1f,0x82,0x41,0xa0,0x20,0x06,0x42, 0xa1,0x1f,0x41,0xa0,0x20,0x3f,0x9e,0x1e,0x3f,0xa0,0x1f,0x40,0xa1,0x20,0x40, 0x9f,0x1d,0x82,0x3f,0x9e,0x1c,0x82,0x3e,0x9d,0x1d,0x02,0x40,0x9f,0x1f,0x3f, 0x9e,0x1e,0x83,0x3e,0x9d,0x1d,0x06,0x3e,0x9f,0x1e,0x3e,0x9d,0x1d,0x3d,0x9c, 0x1c,0x3f,0x9e,0x1e,0x3d,0x9c,0x1c,0x3c,0x9b,0x1b,0x82,0x3d,0x9c,0x1c,0x01, 0x3e,0x9d,0x1d,0x82,0x3c,0x9b,0x1b,0x01,0x3d,0x9c,0x1c,0x82,0x3e,0x9d,0x1d, 0x03,0x3d,0x9c,0x1c,0x3c,0x9b,0x1b,0x3d,0x99,0x1a,0x82,0x3e,0x9d,0x1d,0x08, 0x3b,0x9a,0x1a,0x3d,0x9c,0x1c,0x3c,0x9b,0x1b,0x3e,0x9d,0x1d,0x3d,0x9c,0x1c, 0x3e,0x9d,0x1f,0x3d,0x9c,0x1c,0x3c,0x9b,0x1b,0x82,0x3c,0x9b,0x19,0x08,0x3c, 0x98,0x19,0x3b,0x9a,0x1a,0x39,0x98,0x18,0x3d,0x9e,0x1d,0x3b,0x9a,0x1c,0x3c, 0x9b,0x1b,0x3d,0x9c,0x1c,0x3b,0x9a,0x18,0x82,0x3c,0x9b,0x1b,0x04,0x38,0x97, 0x17,0x3d,0x9c,0x1c,0x3b,0x9a,0x1a,0x3c,0x9b,0x1b,0x82,0x3b,0x9a,0x1a,0x82, 0x39,0x98,0x18,0x04,0x3b,0x9a,0x1a,0x37,0x96,0x16,0x3a,0x99,0x19,0x3a,0x9b, 0x18,0x82,0x39,0x9a,0x17,0x01,0x39,0x9a,0x19,0x82,0x38,0x97,0x17,0x04,0x3a, 0x99,0x17,0x39,0x98,0x16,0x36,0x97,0x14,0x38,0x99,0x16,0x82,0x39,0x98,0x18, 0x13,0x38,0x97,0x17,0x39,0x9a,0x19,0x3a,0x99,0x17,0x39,0x98,0x16,0x34,0x93, 0x13,0x39,0x98,0x18,0x3b,0x9a,0x18,0x36,0x97,0x12,0x39,0x9a,0x17,0x37,0x98, 0x17,0x36,0x95,0x13,0x37,0x98,0x15,0x34,0x95,0x12,0x36,0x97,0x14,0x35,0x94, 0x12,0x36,0x95,0x13,0x37,0x98,0x15,0x34,0x95,0x14,0x32,0x93,0x12,0x82,0x36, 0x97,0x14,0x02,0x34,0x95,0x12,0x35,0x96,0x13,0x82,0x36,0x97,0x14,0x07,0x35, 0x96,0x13,0x37,0x98,0x15,0x37,0x98,0x13,0x34,0x95,0x10,0x36,0x97,0x12,0x37, 0x98,0x13,0x35,0x99,0x15,0x82,0x32,0x96,0x12,0x0c,0x32,0x96,0x10,0x33,0x97, 0x13,0x34,0x98,0x14,0x35,0x96,0x13,0x33,0x94,0x11,0x35,0x96,0x13,0x36,0x97, 0x14,0x33,0x97,0x13,0x32,0x96,0x12,0x34,0x98,0x14,0x30,0x93,0x12,0x32,0x96, 0x12,0x83,0x32,0x96,0x10,0x0f,0x31,0x95,0x0e,0x30,0x94,0x0e,0x32,0x96,0x12, 0x31,0x95,0x0f,0x30,0x96,0x0f,0x33,0x97,0x11,0x31,0x95,0x11,0x33,0x94,0x11, 0x31,0x95,0x0f,0x31,0x97,0x0f,0x32,0x96,0x10,0x2f,0x93,0x0d,0x2f,0x95,0x0e, 0x30,0x96,0x0e,0x32,0x98,0x10,0x82,0x2f,0x95,0x0d,0x82,0x31,0x97,0x0f,0x0c, 0x30,0x96,0x0e,0x31,0x97,0x0f,0x30,0x98,0x0d,0x32,0x9a,0x0f,0x30,0x98,0x0d, 0x31,0x99,0x0e,0x32,0x98,0x0e,0x31,0x9c,0x10,0x34,0x9c,0x11,0x33,0x9b,0x10, 0x31,0x99,0x0e,0x33,0x9c,0x0e,0x82,0x32,0x9b,0x0d,0x02,0x33,0x9c,0x0e,0x31, 0x9c,0x0e,0x82,0x30,0x9b,0x0d,0x01,0x31,0x9c,0x0e,0x83,0x30,0x9b,0x0d,0x04, 0x32,0x9e,0x0d,0x32,0x9f,0x0e,0x31,0x9d,0x0c,0x32,0x9e,0x0d,0x82,0x33,0x9f, 0x0e,0x08,0x31,0x9d,0x0b,0x33,0x9f,0x0d,0x32,0xa0,0x0d,0x32,0x9e,0x0c,0x33, 0x9f,0x0d,0x33,0xa1,0x0e,0x32,0xa0,0x0d,0x30,0xa0,0x0d,0x82,0x34,0xa2,0x0f, 0x06,0x33,0xa1,0x0e,0x35,0xa1,0x0f,0x33,0xa1,0x0c,0x34,0xa2,0x0f,0x36,0xa4, 0x11,0x34,0xa2,0x0d,0x82,0x34,0xa2,0x0b,0x06,0x32,0xa3,0x0d,0x35,0xa6,0x10, 0x35,0xa3,0x0e,0x35,0xa3,0x0c,0x38,0xa5,0x0e,0x35,0xa6,0x0e,0x82,0x36,0xa4, 0x0d,0x02,0x37,0xa4,0x0d,0x35,0xa6,0x0e,0x82,0x36,0xa7,0x0f,0x03,0x37,0xa8, 0x10,0x38,0xa6,0x0f,0x38,0xa7,0x0d,0x82,0x38,0xa9,0x0f,0x01,0x38,0xaa,0x0d, 0x82,0x37,0xa9,0x0c,0x01,0x3a,0xac,0x0f,0x82,0x39,0xab,0x0e,0x82,0x3a,0xac, 0x0f,0x01,0x38,0xab,0x0e,0x82,0x3c,0xae,0x10,0x02,0x3a,0xac,0x0f,0x3b,0xad, 0x10,0x82,0x3b,0xad,0x0f,0x02,0x3b,0xac,0x10,0x3d,0xae,0x0f,0x82,0x3b,0xab, 0x10,0x82,0x3c,0xac,0x0f,0x05,0x3b,0xab,0x11,0x3c,0xab,0x11,0x3c,0xad,0x10, 0x3d,0xab,0x12,0x3b,0xaa,0x0f,0x82,0x3d,0xab,0x11,0x82,0x3e,0xa8,0x12,0x0c, 0x3f,0xa9,0x14,0x3c,0xa9,0x11,0x3b,0xaa,0x11,0x3d,0xa9,0x12,0x3d,0xa9,0x13, 0x3e,0xa7,0x10,0x3f,0xa9,0x12,0x3d,0xa8,0x12,0x3d,0xa6,0x10,0x3e,0xa5,0x13, 0x3c,0xa6,0x11,0x3f,0xa6,0x12,0x82,0x3e,0xa6,0x12,0x04,0x3f,0xa6,0x13,0x3e, 0xa5,0x12,0x3e,0xa4,0x12,0x3e,0xa3,0x12,0x82,0x3e,0xa3,0x14,0x02,0x3e,0xa2, 0x14,0x3f,0xa3,0x15,0x82,0x3f,0xa2,0x15,0x07,0x3d,0xa0,0x13,0x3c,0x9f,0x13, 0x3f,0xa1,0x15,0x3e,0xa0,0x15,0x3d,0x9f,0x14,0x3f,0x9d,0x14,0x3d,0x9e,0x14, 0x82,0x3d,0x9e,0x15,0x06,0x3d,0x9d,0x14,0x3e,0x9e,0x15,0x3b,0x9b,0x13,0x3a, 0x99,0x13,0x3b,0x97,0x12,0x3c,0x98,0x12,0x82,0x3c,0x98,0x13,0x0f,0x3d,0x98, 0x13,0x3e,0x99,0x15,0x3a,0x94,0x13,0x38,0x92,0x11,0x3a,0x91,0x14,0x39,0x91, 0x14,0x38,0x8f,0x12,0x37,0x8d,0x13,0x36,0x8d,0x13,0x33,0x89,0x0f,0x34,0x88, 0x0f,0x33,0x87,0x10,0x34,0x86,0x11,0x32,0x82,0x10,0x31,0x81,0x0f,0x82,0x31, 0x80,0x0f,0x13,0x2e,0x7c,0x0e,0x30,0x7d,0x10,0x2e,0x7b,0x0e,0x2f,0x79,0x0f, 0x30,0x7a,0x10,0x2f,0x7a,0x10,0x2f,0x78,0x0f,0x2e,0x76,0x0f,0x2e,0x76,0x12, 0x2d,0x75,0x0f,0x26,0x6c,0x09,0x1f,0x64,0x04,0x1f,0x65,0x07,0x1f,0x65,0x06, 0x1f,0x63,0x05,0x20,0x64,0x07,0x1e,0x62,0x06,0x1d,0x61,0x05,0x1e,0x61,0x06, 0x82,0x1d,0x60,0x05,0x06,0x1f,0x61,0x06,0x1c,0x5f,0x04,0x1d,0x5f,0x05,0x1b, 0x5e,0x04,0x1b,0x5d,0x03,0x1b,0x5c,0x05,0x82,0x1a,0x5b,0x04,0x83,0x19,0x59, 0x03,0x0a,0x1a,0x58,0x02,0x19,0x57,0x02,0x18,0x56,0x01,0x19,0x56,0x02,0x17, 0x56,0x02,0x18,0x56,0x02,0x17,0x55,0x02,0x18,0x56,0x02,0x18,0x55,0x02,0x17, 0x54,0x02,0x82,0x18,0x54,0x02,0x02,0x17,0x54,0x02,0x17,0x53,0x02,0x82,0x16, 0x52,0x01,0x04,0x16,0x52,0x02,0x17,0x53,0x02,0x16,0x52,0x02,0x15,0x51,0x01, 0x82,0x16,0x51,0x02,0x82,0x15,0x50,0x01,0x04,0x16,0x51,0x02,0x15,0x50,0x02, 0x15,0x50,0x03,0x15,0x4f,0x03,0x85,0x15,0x4e,0x01,0x0a,0x14,0x4d,0x01,0x14, 0x4c,0x01,0x15,0x4d,0x02,0x15,0x4c,0x01,0x13,0x4b,0x01,0x13,0x4c,0x01,0x15, 0x4d,0x01,0x13,0x4a,0x00,0x14,0x4a,0x01,0x14,0x4b,0x01,0x83,0x14,0x4a,0x01, 0x03,0x13,0x49,0x01,0x13,0x48,0x01,0x14,0x49,0x01,0x82,0x13,0x48,0x01,0x06, 0x13,0x47,0x01,0x13,0x48,0x01,0x13,0x48,0x02,0x13,0x47,0x01,0x12,0x46,0x01, 0x12,0x48,0x01,0x83,0x12,0x45,0x01,0x01,0x11,0x45,0x01,0x83,0x12,0x44,0x01, 0x01,0x11,0x44,0x01,0x82,0x12,0x44,0x01,0x04,0x12,0x44,0x00,0x11,0x43,0x00, 0x11,0x42,0x00,0x12,0x43,0x00,0x83,0x12,0x42,0x00,0x82,0x11,0x41,0x01,0x0c, 0x10,0x40,0x00,0x11,0x41,0x01,0x11,0x40,0x00,0x11,0x3f,0x01,0x10,0x40,0x01, 0x11,0x40,0x01,0x11,0x3f,0x02,0x10,0x3e,0x01,0x11,0x3f,0x02,0x11,0x3e,0x01, 0x10,0x3d,0x01,0x10,0x3f,0x01,0x83,0x10,0x3d,0x01,0x08,0x10,0x3c,0x01,0x10, 0x3d,0x02,0x0f,0x3d,0x00,0x0f,0x3c,0x00,0x10,0x3c,0x00,0x0f,0x3c,0x00,0x10, 0x3b,0x00,0x0f,0x3a,0x00,0x83,0x0e,0x39,0x00,0x02,0x0e,0x39,0x01,0x0f,0x39, 0x01,0x82,0x0e,0x39,0x01,0x05,0x0f,0x38,0x01,0x0e,0x37,0x00,0x0d,0x36,0x00, 0x0e,0x37,0x00,0x0f,0x37,0x00,0x82,0x0e,0x36,0x00,0x02,0x0d,0x36,0x00,0x0e, 0x36,0x00,0x82,0x0e,0x35,0x00,0x03,0x0e,0x36,0x00,0x0d,0x35,0x00,0x0c,0x34, 0x00,0x82,0x0d,0x34,0x00,0x84,0x0d,0x33,0x00,0x01,0x0c,0x33,0x00,0x82,0x0d, 0x32,0x00,0x84,0x0c,0x31,0x00,0x82,0x0d,0x30,0x00,0x03,0x0c,0x2f,0x00,0x0b, 0x30,0x00,0x0c,0x30,0x00,0x82,0x0c,0x2f,0x00,0x01,0x0c,0x2f,0x01,0x83,0x0c, 0x2e,0x00,0x03,0x0b,0x2e,0x00,0x0c,0x2d,0x00,0x0c,0x2d,0x01,0x82,0x0b,0x2d, 0x01,0x05,0x0b,0x2c,0x01,0x0c,0x2c,0x01,0x0b,0x2b,0x01,0x0b,0x2b,0x00,0x0b, 0x2b,0x01,0x82,0x0a,0x2a,0x00,0x01,0x0a,0x2a,0x01,0x82,0x0b,0x29,0x01,0x82, 0x0a,0x29,0x00,0x02,0x09,0x28,0x00,0x0a,0x28,0x00,0x82,0x0a,0x27,0x00,0x01, 0x0a,0x26,0x00,0x83,0x0a,0x27,0x01,0x02,0x09,0x25,0x00,0x0a,0x25,0x00,0x82, 0x09,0x25,0x00,0x83,0x09,0x24,0x00,0x84,0x09,0x23,0x00,0x0d,0x09,0x22,0x01, 0x09,0x22,0x00,0x08,0x21,0x00,0x09,0x21,0x01,0x08,0x21,0x00,0x08,0x20,0x00, 0x09,0x20,0x01,0x08,0x20,0x00,0x09,0x20,0x01,0x09,0x1f,0x01,0x08,0x1f,0x00, 0x08,0x1e,0x00,0x08,0x1f,0x00,0x82,0x08,0x1e,0x00,0x83,0x08,0x1d,0x00,0x01, 0x07,0x1d,0x00,0x83,0x07,0x1c,0x00,0x83,0x07,0x1b,0x00,0x84,0x07,0x1a,0x00, 0x01,0x07,0x19,0x00,0x82,0x06,0x19,0x00,0x84,0x06,0x18,0x00,0x82,0x06,0x17, 0x00,0x01,0x06,0x16,0x00,0x82,0x06,0x16,0x01,0x01,0x06,0x15,0x00,0x82,0x05, 0x15,0x00,0x01,0x06,0x15,0x00,0x84,0x05,0x14,0x00,0x83,0x05,0x13,0x00,0x82, 0x05,0x12,0x00,0x01,0x04,0x12,0x00,0x83,0x04,0x11,0x00,0x83,0x04,0x10,0x00, 0x83,0x04,0x0f,0x00,0x83,0x03,0x0e,0x00,0x84,0x03,0x0d,0x00,0x83,0x03,0x0c, 0x00,0x82,0x03,0x0b,0x00,0x01,0x02,0x0b,0x00,0x83,0x02,0x0a,0x00,0x83,0x02, 0x09,0x00,0x83,0x02,0x08,0x00,0x83,0x02,0x07,0x00,0x01,0x01,0x07,0x00,0x83, 0x01,0x06,0x00,0x84,0x01,0x05,0x00,0x82,0x01,0x04,0x00,0x82,0x01,0x03,0x00, 0x82,0x00,0x03,0x00,0x83,0x00,0x02,0x00,0x83,0x00,0x01,0x00,0xdb,0x00,0x00, 0x00 }; static const GdkPixdata background_tall_pixdata = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 186481, /* header length + pixel_data length */ 0x2010001, /* pixdata_type */ 2364, /* rowstride */ 787, /* width */ 110, /* height */ background_tall_pixdata_pixel_data /* pixel_data */ }; nvidia-settings/src/image_data/logo_tall.png0000664000175000017500000003646412236467170021403 0ustar albertoalbertoPNG  IHDRknWu)gAMA7tEXtSoftwareAdobe ImageReadyqe<p ?3Gr7G6gOy^{y?G8^ N 9O% bN (U#Cv@od-X%Xd  ?@Fg10|y ()y&?_ޢ#Fvvv--- .Áÿabd6ƈe`fff>}:Dt_)TiF,`T?i~ѣ fȔ{ēQl~?rrrlSL)PRRyf-[0ܹ'I P>_=Bp$JT4HP[PMM #pp0AhGn7tWGk!N-` l&)ϽA>?@ 1p,ڊgts>degz7>fL֝Li 8цjILv~cأ8=51F7~0~s>kuQߛ?PB7ꇾrhB$TE=)YiD?.1YQ,zEUUeBH$bn#LLZ(4fh'EYi1HЙi> p8HRc p8D~RE@d+E FFFp/Š!w- `0C/܌XL BD|RbFӗ7 b|$. ,o=I1V#aenAP3+3-cb̷x gA7;Rf[>%CSb eu+z ??:^B?AMӹ}LYMOdKf,d\?ŜE@>-Wc_w?3$ < 'ì|sc sB?`ghedf4bX qZhʯ_Y*kٹWc+$A ,ux-W얁TR}hll WTB1!,, 2` X DB\( KKK#eOooo ߻w)7ny`׮]`A"WRRj6D__?ҥK`wlO8ˀ%MMZ q8 '\]]O0H)~3{޳0@9}oos @9[6`bڮ]0@FVč- c; ƒ!0qlSKILTYM!Ca l`s-M#0Eۜ:swe&w dHo͠ %nϙ\G eV2*9c"[EEFZȉ>~H?{LTa^->=~tsh6-/jPˌý|y=E((*$At˒P~6_k,Ӽ^hFL*}ž[G1 ¶j KHd!~A#p|:]v+P-:{3CG'£2,exH4LFHWOm4~24r;qM&c_VYTJ} ;e7'g89%(?d`ya]dMs4CU/V-•6)ZN-Nw,E X,+ vɲm /4bd;*! TAWb?(Qm.k ՚=kbCpl(O}Dv㻟̫K7qnlj2wz!C_0p+<~637g;` #&7_{&GGVRqv(IJay-$CE־eA!m'ܻTM%3uc4+" kr!??/> 3x9Z@pC6%]Yg4qZH"xePRblMMM夣ihhX2 wbliii6R–\__/IDD2e9ˍX`02B>/HcIIɏҩh495=) Q2C/e⵸]Qãccc\iDٵZm)@“9*5)r1dddd?BŸH(#T߿Z\e&&&f]pӠ'+眊HI Q777\!]rKn dVOVvuu| J2JKK/JzzzX9RƏ\!G4P<[ u QcGooo"mYa###e111|fs(TV(cSSS',333׍FcߛOص(+|]e, "BDp+N1 ZLBBm%eZAZXTj4tD[+1$EAKc TTDee/,h;_s=;*Y| 18Gwo N0-RVΝu  E{Oʖ8Sʋ?s"P4p4ރuY ^}fwo%P} pŸ9O8gbDEgKZ"L;q288~ꉙ*U 8Y_ fO'|}~]ͩABbY 2p&SYB2:u } {*G@39ᵴz_.˂nĜ򵽬|Kq JO0ga^|f M JYTԋ,V߃@=naAKh!|` rRNAT~()Tx-Wk,崟f<&|wS G_6=|UͶ|k.#D:aX9(M{4n .}Ə۩!;&1 U^tDsQ&#?03qeRqc?2Ta9YCRvTitiy}L\wSozۆw51]itUHKlkD~s&\/>AAk~YaM†ZYz8"]tO,R\{N#l3>s=ivGRݰzjJB,Uѣp Ǫ>hz1DNw&ܹ Hz6=1fIII@IYYùTv 祫T*aѢEcr&>|޾L&޷oI!fY銌)0\iii'7544 >}:/;;;_,sYYY6ԂOz}΁ycъ+q|,ٹ*AAAakpʕZ:zzzJBxzd)))#7??_pb'k qKllŜ> ǤaaaT%N@|ݴ4CWW?&ɝ0.XhxXWWݻ]t쬷7 ӧOt:t_1q$''{`bk:Ն.꟞_]]]PP$O/^\X26mԆ޽{}sssyc8( j*XP2DZ:.k-DL4Ǔ9{lVTٳg+^J$I50RA jChR7D++***>MXWIT֮];LzS?MJ vѽ|r/: ʣpJ@A Y?B5̜?6R`֭O=.YF) p,;w(wĵVTTk ZRSS+3m˖-?wy癐.bOuyHS08U K2.w,!8(IUT T&PM@? ol”ଲ'[(Lΐy(] 7|;Gvձ{TkW\\b%P~3spF m-Xcm{Ȳ%чͱ=xVcUբpF̓lybR*HPTAۧUWࣕasp-TW[6@suMod@̲UxhXSU3.tȈDoYM\ :#^:=3DF׆ j=BiKP!cEI{GY^tH8bbA]Z ,m'Zb l&xe8*W~"r˿Ƥ&Re@с [bռ۫-KZ3BzuWWͯByWW.*zKɗ(X_;vcУkoA,vhkcHIoM}1[Pò/ݝA^NLPMcXc^cL5t׵4/AUҙm$mbH׵@#d.}ۇձx-KTΤtl&|`/P0ڜb5wwv #0p¡`arֱ̓@qNW< Ԧz S9LQ[5|㼝^_h>DkfgA /|_ߔ<~ig4UQ'4t>&j5Nت(_^)()ڒy}o?4>#̠VWAey%vmjxɻ0"kfegS<" Fmp.t7a;W ܸ??TU/wPPhxmJՋ%LLVC(%7ks/.|kIEZ] Uj9[5o?أ mCMS/ҋZwbmiltz"D"&> PF9%Tj)uX_3p4Z?4(L%wуFO2'MS*JQq$iN77V_ . hk F=/sL$ܗ K_YfC]G] 18Yy!/L5Y`z(%k,1qݼNxɦuFpnaec|CHdf6ۃb_n?Z5,IIa|FQvo : Kdz*=op ܃r4{y0°#?ޣ|t 3XNG9Ц#@!+cVRQg8m)/QX.`G.``Z5BgFQ3oR'nmc4],we 7d";I - tU\1erPNMOiH=Ne{])C~P6='7Hx" rsBϰμ3R ¼ &m8gkϠ ;C~J +sQU"@5Ey32gt&x]t5J)g<&6(I«p ŷ ^7 7t d\ܹ>lޯ:9`S eH F\:hHrgIqY :(z“G@ J~,tz,KJD4rԻa}aW( `Ymu:i@.WbࠄNhw/xs/Mh>0AY4gpz)P' 8:#ਂ-ڲ"tVѕ;8 FJrDҩ=@iٱCMj(ll( Hh,V&yM%*Ÿ E4Zu姑͗l[o|CCC= .a#jKBހ$B#:( f3<=7 gR'5]ZnMm۶{.R.*Yɬta{0tafb9ρ7Rᐘh!mm1A 7GMiQ?NƊ3G"#bqHcZnhIB䃑$Ն$3lDDwNx"DFF–-[̟ɓ'Y$NDf!r7B;)u2iЀǞܡCX̜Xճ{; D WZ\l^R|H痃j=o9JɆm"5n(qgd1Qa"f:œI7L>=Sb7o޼zb;u͛7}}_'>hybtQ.;Ww̙zMJJ$'w̟?fΜY޺u"U3fL bpFDDPpX XgBԐ!XJV~ΠJFz QQQAᣡ#;dY\\lZr%`E~/(kTq!{=7nܘI "dv&~'?P6m@PPлTAg(dO2J.+#̩|ZP!pwn,Ym\ǎ1N@,'l =s m0(C FᙔU0:!6R,C&3)\. 2{Ue^ ,27P%(KO_dM\aXA'hȘxJbEԇn3qSETV|PYc}JBvK]/? |ۓ8 (-)30+8}}qZ[i@# dQl"PKR!ɛVgTx}cV˰uDicxyVbMNt_9R cY@Ѥh}M@w @Pk5hlw6t k<Tz0Ȭ}.>O៎ P8_Bu\I:~ V/8AbA G2$KѪ_{~ԐGclq~'%%:{V/̠]ʪYm5И\bUCc{D"o)ZЄИɝ)OE +*8_ZVHn@ TFuLa`}e'`,wUHZpaoECՖ3Q?{8UM?(P|߁RlKpn !rsz^$6B" nw;38$1q֞ yK>U%HaM~d||e~9鮫rzG[0 n&JnSy"- ,/:.M?={z+t́ Rv[yQ1m8 IƟYxsu|wݪPI{oL?(RFX_4Ͼo iǪ eSTGib-%̤\kXl\jڴ;jrO2f%`+i$v `.,xv*Kvj] ?0&z-ه{iF:}Ō{K?t+<{Ⱏv:hg v-:8oU|K^LHٷb[ I U~-8'v3^-A3Xz^*(b`jU™rp$}r 4<ҶcrY#B<ϖARFJi:[!jڶe3r{pPr8\ۤEbfGJƈ:!4m I 5mšs{?~Q~5n#VG0 (b  #ot+/21!E'pڽ~d'?w΋CJLg xi~?iI~f  .V&)T~XAѿxJٜsHFhW5.uQFoYf THsaSMj]olUJ2㰅E_1z䧗~ V6ɅNp\ANUc}G^5hEb7..s3I1jomx& [qM@1 {Eۜ]:Eg-pl%_ QRÔԟ沖Wa2\tt>;#|-Ͷ,SoaQ.\D9I|V=-L0Yaϣ=P&A+lN}Ӝtk 45eFJf"/Wr6/P=$^WcSֆ%*5^=yȅ~n6}E򇚬bln!QMiv (Jqg6#0C2PjKܹ( uP|WHZcO9_HNݻޣtT-ӶCߦ|ojܡel{il_j0 ̀X?Q+?'eGd[ "oD]0_3ĖhUeYuBӘ)ɨ nALLWNv5<AdN]~3y\ZSpVb>N4<¿Z $z33%WL$UƴE?O$?@H~ AǶ9&~ Kt̽Pb:w8gƐÿڢԵe-Z5$DpU\;,CnA11ipT=dm2@AQo`9 e3O$ j2юA/7&Q-Z5ʱ!- qjԝѣm*D_f:֩*>v{c *L/)N8q*D]SXB-JR%0za>虖W.ŋ((]'}G}T^*@pd\wnrrї<ʛp`T1X4ąNuQQFwD2H eV7DB[J|`,|y||uu]@Vl`S]L mF%޽C ~>3 `zu|S>$@; #!jzQr̬_?ޑn.6Ku,،rbCEjjGi@zwkXs^#= LLX?PV @g5 @q{.]vafh8_ | E4V:dȐt =322+ev3 2M9gΜ G7**45$$d?N2e?l= h,8U6SԧO رcǜwy 9q]_ v£&O<e Zf BeL`!&@b; "[R GWZxW_}AZy"/ /Is'YO XkB9~Μ9Mifq(DC3sٌ-4}/~;- A L@xs^~WHۍ"Ŀ ̰T"hܸq@@H@ LL- k|~`pqǰ-LlNؖ63hs=ԬYNa),x<iofߡCQ/71mڴ/^-Ab>mo;N?޹YfFpa Q{B#av< Y-bℓ7\l6?ei]\ `6wmf slF w*޽{"[7#R]^UfԲ#Gܺu%rm3f{He % X7D]-R Xbf } 6gKTA|ԩi,Yl~2P64s߾}0pI~( ~pY~= H7 D@X LcBuW@(=PF]y#n[TDD4裏8p`G)0Xe^0iii| 'N n7BDI0 &hub!7lذ`3G *792]5uCh5b=t?]?;0oYc%0f5_7"&q7@pTL;]4; U+Vg1ȄoΜ׹SڴwlʤIMXqG 9`F۴3@:`U q9G9ݸq W,W I„&$$nj6it֭ۯY99G2A p#|4@"Ipnٲ + `& 5ВڑlEM:fLCPh-TJ%m|>r3$iko%ͳYs5G}|2/T# ;w~2p^~F\S0pkS>aKcdڷeA>g`x{ᷲ")q% ߿8} %?P]X3O@ GAiK.}1P% PG F uO) W!.APA~4uZ$KT#2߄ @p@sLo2UR fYhRȰH9OY*ioy8a hLC&h+XX>tHs?~ۏjr,(JHHi0 BBB.^+#ddϢ9߼΄ "664m#+0P3a `0 V^͛;^Y0t> <*ax'hҼ@, fr@X#>3 ޷NB  iP _%pׂSLOj18,aU#R1q@S,%egg;sV~Qч>5?MدФ0zΎ"1p%a5V!tb..Z A*5&6C.aKpnv>a[.O:訨HI3JA6) @h4 GFfzBoS"2! @.s"P($8L&HD x<Xd/ Y㡬 K=)Ar`?'A:'v]%bzk[CͶSSX 8V—oFP74B|6̪p@eI>ESSYj3nLAu(:Bk\opny=x,,,&+!L6RQSNaJ|j`A*e\{YX~311d b\B\n NK̹Ԋ#Pq :Tןj<yQQ`iK*Ee`0}} T2`m (ґ_82Ï B p8~?}`FtX6͉ 켌î6V0+G{q_lއ9c*7gbX;H@^jddȐ.6"K9BXJ ojEScS&nFx|=iN՘ ֠cld!CͦK&dY$q1Y12?h&f, Iنfl cf8 ֕BKep&&Nbқw?޹sn ƕ+?TVJjvdd(j Fqjُ!ʕ-ZP/lؔO<K%|oS~o*6c5e3333?6#(s+zaIn8\谁Mp&$tc߹=7aӳ]$oAx X8 c$BEg[t8,@Gd>"Jڊ҄r5z0 d2S^\\|F6|y?Xu)@̻ms+K˛y&Px}~!H4V\p3DIC MnT*YYY,K--fnna5PA3Q^*C`pLІyYó/!@%>EBj'\> qQQQlU5CH8}AAQ嫖F@\"VWW[VAEOZ]CϦ E k7e< AN{|;8O0r[Nyl" ok{gwuu}NPIIFZnhhx@!tJ nx.^MN蕱7ŢCޚ5hšII'X{F@ug(f(y\20s(H޷.5BhYN}jx5/7HƦsM,6##,D޼yfARd,Hf K:f^X5U١s,΅~s7^6;d"xbv7n=)nOkzE)'+Y;%e v\69pS gA` 0>Ib{BB[Sii알 LV5Ve y EEEAssE[l H'|->O/:DDhTnn.s?$\ɀ< ˗8 !j߶m I0Z%kʙ7 'AR|-`;@dȮ,ȸ»x j !@2nU/=f͚ ][{(3o%"ʭף۰ι>3xA㛄3* 0S ﹛+l[rcǎsK{O2gΜݘ\WW>ާIMM"}NʟyuD1^d݉KX+^ֆ܎+4# U瑷rU1VFv_>}ˡO0F!+,,̻zoFȢQ+PA5\R?8+'|Puu5Noݒ^[D]O_0p^qٽUK;`dI8Sit٤?;f{OKFcҠ 栐CJm0l,**bh9uot: Zq…!H-5Kc\j( vɓ'q{2Cґ9Pٝ_=ycY,//Ƨnkk3Z4Ɩ1 -ZN`5Rdm3D+k7ȻBzsȟkX)VG&A _cq[-[F[kjj㶴1R:VmB]o2~M!DMZ>A]v:tŊkkk_6`T^|Jmgtuu}K999=>wl!wۏh Tj$ _N"Cžj ] @V Š,IHeƏрvALQՏGuթ|#/it^Z؜[NfAkP_n(5 @qg AK; ר\%u\ ֛h)Pfijt]PP>Xɣ.r[GiIZ edӟ?_~ F`J%t'$hXIH(C hFLDdAFGٙ0s8& } ĬMwHIgj~9C:Nw~U/m>`}m>`}m>`}m>`}z7)&W(E?wd*@cc# HII +lb8q$&&RL fSc!b 7ǏKQr8,Mѽۼys1^h=//̙#ݹsO]W&Bd4ެ$000Sl6wM111N /w8g:Yq Fߌ:D(kxKl @iQe=bon;1*FLjGDGGh4 +q: :QTT>k¤e֯^~w^ gzcˍ0NJkI&'|EZ_B@;S*ӛWvsԞAMgfq2Mv0\^cnkC27RvvwW`'L 2~Ƌ/SDY]JX^<9] H|'ŕQVூ)%ꭠ֊A wM fMS(P~'@ِ Zĭ:!X-CRq5cxAX/<dA`3ڮ?jk `㔭Vֽ;lj^H ϿKVO @Q AfV fڄePХUZ?{ 3TcGCHIu;2G$wpc fXy}WA]59b`F5І@Gq<k:2ԭ^mڶ:@W_֬YxoeĢ%|abb?KghS Q 7PlV0߰V*T|nh;t*]AP&duxҪlOԡt-67 7ZYG9?cDSe2Q[K (&+C?Z  k[6o+<#)SvvP;?ЕgYUQ/;VEmyhPEa!i4p:= ضpDf$ oڸq5bIF+y(puܣDE':$M!Ij!#=}l5~& mW ~;P^vfhZ[Zj2#4.A3~x }b%۷o':h !ܟ% u~Flݺ]ٳĉ[q?~kƷ涶۶mߛ6lذ]7XcᑈGL;6* ])Om18y`+q`cw=%;A#wݙJh~%$[%CJ"Mc~AIv"utH8m jLR{x(GzwZPPPZxx 3$SǿMpuXޯxnRUVA ;@=5$е2Gh8QT9v-MnCn*N:+?)~AJ!TXN0 Tӄ D.;lz3x?\>c ZHʚuuP˔g {qSVLHURq(װ,\s+-VАlBb0L-kL)8m`O Cƞ(#e"V^f %Z{,mDwԨ)M1 XI,XpbժUYn w[C߿ٳ/PG>222qʕ7Q]$WAxŊDZ'ϛ7x]]]#f*r2'kpQr#JLDe z:4~f T4Iz Xܷ T⊂,(DA=oNHz_jS}+)B輙̫}7UϽU..&EVV]tV]tꢋX]tꢋX]tX]twHu~߯m4@@%(%ÎwQ);vPBY*I4**UZ nq((6-PGȳdz(J4WmmYM/7QW8' @f͢Ç+aڍg5߅ u mqY6q%K(~+lk.9s:*9,|mQaUsgCAzdMh`mk++>unUEeg軜P4/(󫇡{@ `;rlll:) q0&acQbv{).砜K~F=O<ő*}~?Lr{UL}OwND2//e_Zǡ5po3s14DaN(}o ˡƯ(ܥ`D~f~rP/cƌQ45X LԂ _u׭ν{ l>!cn@|Akxd8Ȁ7~ 'c"A {utQ8'Y= ]堊锳b˔CaCﻏv;n(*X7e%PQQ-g{M;wG5sTŒ9@jX(ȑ%$|Hh }/H g 3#%`,2k"xÛ"ϪTcRW31~3y2OO?یebr;6m(@e z\-ccsٰaGii ZB-.Q^@ņF8*}( ni`q3m䀓0>hLNAC)&:33׮ :NZ3J o(>wf3OXTV=(,̏ٿp"ImsYm7p7#M:@a-ۑfRLeʇ=A3@&MO `e"`/WRK,J? srȿ?Ц79ܷ'-E4=c-&q3ό+J^Am~zSx<69 v1 jzIY-yyy ~͆lmr\S(u!t)j.ɬDi*++Ϭ^:0|p Juqx#@|ԗyjr/xՀةb;o TczFA T )HN/FߓC𧼡KU1vN4=%K pA#X%%=s\,5iB͚|2/+ 6z[]/>|-[NLv=qmdKKj~9vX>WRF^N.J4o@1x(9MC_"l_%]d=.5gD5ZQ C}NϞ#C")P9 : ٬Yv #ZWՄ%fܘCk{'P(dzbا5狒cy:;;5 &`l8 TwMzq obŊiG=آE!<1]6"nI:U_#ȺkX]T[EVx.*'-!~ږAasU ]TG&%>ڋq7IЌ.6c16JHN4f6PvWlF8u܉ЮDH8u21ӠhR4hPUV-9L?~#33SM+fm`QQ'US~zڵ+j2r*"?PZm֬YV\9j'@ා7n n^۷oO#GXA'GIhf[z8?eVTs6Vn%Rw؇n@Kz넶m۾ڜ{GWYܹT?^g޻)q>rrz)?YEݧɳ0y%i$oD&j!y5bT|5[S5ß{Sq3'pYFh@j֍ŖS63E5QHVI`zr|IJ쫤jYv0ϝ;ײel4w`= BaЊOiy@6 |A5ψqͩbŵTYGaZم`[jwԩs=z mag| I!k6;9u9ϰ283g@E[\8qDo֭U.-ch}g ʏ7F|&c%p$gcM rfA>lO@imOs7 I&1格KTP֢A6H^!oJMۧ|W|G\mЗl?(fɽQ,z(s V=qht)J<.O 3:ܹsrݒ[o 'Fm)pt@W}2m%Szߝ(_J~sŞ̃|]2غhU;m)իÙ㺜"'Fn8aeIj-7*7I;M BQRJV\6pRU'g_TZqxMbd̻Ai8N!Q\#5ln!L=C{(KUd&JxwMchcOlڽkB#Z|a^jLKrLu @ƣv ̫l WLs .FF9Z㏚=-2gE;MŠ5iXYP&ѮC3Gb5m`R^Wϊz)Djz 3w/f͚Poӂ O KTj7d~w'ddd__?y/OC.e^ gAF QlцrZp挆Ѓ0` Ɂ Hpc-EHTQ YTZTj.ŶQYSR0Tr_119Gj 4aw\ 84tA[հ(bʵ_d 6 ck74 :mG~T)\/&&&ƃaKNN-_lٳmh:4黚U,n9kΜO=_LSz=%+4-l~FQXBs PxAhˎ~0(xg.Fڸ?ujhS-Zh0mڴ{-`V?XU&AwK8}z^mOPۺv90Y3o!0L(|Lh`C4e՟y @^j4"KBgheÚ[ @/Ъ/uh\"!V٫:_5=cOjJ5EaJSmՕV~ji&:,*ڲސm`c ? )Q%X͌̃kq]ИfA`$S?Y>Djj4ƾ٫v,G!pIEyb3/4U'}r’g(l[@~CFy!(D(A؟(΋(f4 8iH4 A e@*n$*c7// g fUQ PpیϠ^Z :IJRc߇c~ UUB E``q@pY8^bJ#nWO}V8W``~q^4\< n־cRBR@vN]hD*KP`Vձ:n.Y/^30w֒VN8XV 7Գc¸T0y.Bj~\?νBM)M"*6K7G=W'!=CB,mq?rG+snUJ WsZ:>yB@?8 =ZcuU9?` ̶;7 1=zP5v~n͸墌eeRTOVBB)G!wD!E03O F!!V=*b>Jh<@c_9YUK>9:=ʴnl@JB~}E&~xIqCTL0U+؃nD%1H#AG3:aj@=F+3PȨYTzB8˛lp T_9Y &^>Md@pV}NvDǝзYpLvIn(7rIS>X>shTQnl4OcXʤ {}<۩/d9pwf}|. f|'pk1kV4VP43rt0YX,)'3̋՝|`pm6h~  ?&jfc6T{<珣؛hpA^5LB @:qk}0";rKN+'9(o4sTU2*A3 y!VivI$jyץlDž3B8*~]z7:A8; &[f+h< N IQYV{44l/H\7{5FA|jA`bέ׫F\?IIiVS Rd>XI#ЬDGmŴmRjrZ@T+Ծvq0`#<մ} 㞝v*ߟ "U`\4/Ǒ9^T%ùl98bu|rEɧיw1喻sWr3R8BC5w *o`׵dǤt P̧|1֚7qгk#$"C\ksuAӆR$sI0 ɋb/*|#PE H85IwtHdsRphTc;&-k A(E~rs( 8ghOaϰ}*'Qdh/{/ϒγ餠Yi(Ps-NѨ쨃vU?0ãQ$gf=CGQHo'[z5w.8MxQ;[+t\U<ތQT8|Jiׂ\/hGM~H4oFŖlu:j 5NCkN> `Κ>%PY}%e;[[psn@y:C:=Rhݭw,I7 cS6kE!M!'zm(v dN.r>1(U#䁶.Qf$#ʑM*#Fr9<7>~NfT&.?! N(FE~Qfen)GxSٌR|r/j߉?_0WghIY '*_oCS7 $ܪu5DYͱU&gH6(>9(X"F7[%g ̣+II ha&'b56B,s8v0t^K5! jh7IQg7x3Ȯ<ќq̞IVĠ*'{GÕ1Bd'cXl7q7ٍ5xRNܙiq ؎_91ܘM]a lS*l1VDyԲx NOc̼Orj8\(p/aLI #faTeɔDK)C 2R*kq{:K0AnMGY@V{^S=1DxZyԝm&(t`||'*զ} jW|eٴrAԂN@'r܇6M6Rz4u|0,f#6Ǎ^%Ô/ϺnĐ}@oTbƒR8=vghP 1$&G}Ը>^Cy^L xJ})}6^&|"[?2uag!܁}({.p7qrs, x]KhM/Ќ(PqBpޅr lLiINR;O_6mp~M\fu ׋ILNh"P De$ѦxLeXˌ{։ݝ~TUǡ <؏K"P*Qr&ӥZE{h-M޴7p鑓=TgC/#Ǣ i&fDbNd4I*?ܧE~GKYC%My5j<ͽ3Pei~:_ٯbP&uFA( xpmECCia!eۅ=IuiA0M94i{Gq<O#9NRC ydnJ:䰝!i95Yw"\ESawneQ*ck-p^0'ԳN! \89.?R{yXYM?eS[90LԸRqZF^[$ s6"HC殌ׯZTkeeXܘvʼnFEx곪ZRrv\0“'T' Q瀼/p3%♉uUoΣƦ,SNζ&ݜd_,rvkplk$VN&aј~c`%OBh7oH30\0LREk,b:$ҮFXJ@!)Й$) 'vGy z?hQf. 9mN.%B|nS!­,ꂾzX8Hy{{cMbU 7]`g , h27?]ܹF7EInC3r.1s]>m)HZ3)YhqL|DM.7BP.tQ {"{*wV[TA)MZ,M73ijI%hibZ N١ ƶ՛=<ᑄJ򶤔q;OeÔ~a`cSLq d:+Vi & L6Wr hq@Qy>~@i~K}"c>B6!Hʡ78Xiq<)܂` 2]?]9J%U5 hXuǵHJEdEa->!F7hUh33-%lu*'ߺr5hPGcPGb K`1S,Re "PFǟO' Zꭿ) #BOeSb,PYГ)^_*zfx8hꦜɆrO5x5HU6` hYte;A{ݱ<|7P%9Euc,qTb? %k_=BJ[<ȈVen.ʽMӤ E{~a VW䱪tnB0Lek>6a}m{\a "Jm P ;ͽ jSx>SbS2kW Bgg)@݆y׊-Qn\%С4mq +FAx6 ~noa NʞK?l6B˻JLL,S~9u'Ýjosهd O/3MgIwBQ"N:0fbtxA' ծr͇363CRE{eB>":5MMK+1]l;MJ9!+ǔyk1^&O 1 L"o32ED +`*Ÿ~E8FqPA(qx1<-R !YyDNIc;Ƀ{05: ç@sJPh\(]cOL 纱E̗\#s[tM\ lsȉF`@Iӛnʠr 1"ʮKqX3rpyIߞnXc5oLsaA9m`p[W [k unk'9qdMiy5F >}S>2$Ov#%9)1 B8HbfĻgKO0;>S/߁[?$}⼩\OmؙұSk˒6B%vgA/El)Ja09%䁠ggm&C]&}ԶDkԨ"t8!R5N5]z^GíԜa W5'D݆.1˗߾8oqt : +>uǠ`lL, !KĆ)gCTNױ'(+f,4NȴW0ăX x0&'(iܠ&n,W VOYlQU ׅ(Ut%WP!YCVOHN`D#y3LHvgI;*I3:X\=`ˮSÈ=]8UpwO`bM䛵4bKe$t=? nعyR\)FLs jMٺj߭e>S܄__rҥNp(WRA/DO >'HA2*Ifg׿(.f 3*|=֬jOWZCLAIsTIjF]矑E)vF7L|"WҎÎ?aF;+1zQs `C(G򡖢 5M~Q1zJwތ0?>uxbDrήOk"QhբNJF4q ( i>urPt0_@jU<ǟm*<Ӿ{,ĸOm:wV3P>Z 1eBwQNVRvq{dBɭ;P pfngabHv+Bw{s0#`nEt>Ɗh]y ]7RF+x/-N-lAg-/m3f#9#Ĭ9uOnщl6˒V9]MTKSPʹGm(c`'U cݤtZpdc{h\moVjђ}bWU`nhLP4@lG]l`ll%[ vei:ӖԸRU/녥=^̠hіzY˚rWVܝWZVxqn*Dꞹͻȏ.IЯw.'1~}]* fO\tiFDru^*74MBOxVp r0pu2/;;H]SU|`IJl.:M2[KKSx:+woIV)hFot,ζr4#ǐ7w<@Yyv汾aw^J ٘ ZxyY_x*q|qA%s\Te906f,kqy#4:,?E.D.Q&i TH b{*1GtS ?D2f(Fon@1VrԹL.{1VYc._\URQ~K(4R!O+[rpA5xt@ޙζ˂q#GC(ke}ޏKM&8O9frUP4炩tdq6&1"@U|rQi᫄=]'oi gWKpsLvj\_B" zЦSlߘyw3ۣ}{s''~xF}F#eimS]MΕ0w3i2؇\]l˕StɄc:UEG~u%A={"$'ՃǸ瓴_~h6Q[/ A9-*6DHC=#cnvٗl9dȻ3f] Ǎt>N[mgRܨwHSX9$ESTXQ*N{دo10%k[.J1aXĬ;)eet-9~ZsT*w3Jm4Mʔ86՟8(V.uI&Ht-̦zۖ.R/ՕԜaSpD>TEc@K,Mu?~JnT*Ҫ́@@8tË(K>/rb.gr^YLThxp%őz:GInۥ&HgET|9昚\N_u^0{և4.{CjU  1wBt\ skT-'"g=DPX{ju^;A!"l氒®?.J> 4U g#0"pP%\I2*i 5 " ?x(edPm+ !m^-`->{/RW~M*'M)>"AYE%'r?idz)?#5[̇ N "s-Ź <})^s_v(`sɑ[ %Or8ޜ )3I_J1'HĠ.ƝzcP'K"HAfτr+ĹxKnӁJko, aDrfP#0xy)xyYZ(ù,̌!Y.vhvij&:HSq'8zw! -QU(2},IAւ h HtYDZ"xooq<F"0 43]37?ˆӕ-I#t a12EQ1uugVuFXNER~Av=E8&ֱB6ݼݹg#s:jY wԄ;z]b$Uߪ%I%1̋` XiQ.-ztK<;59ՍFR:+&u;hRdIwɛ7U։R$?ef+%<+uV?w:pW!VS]Z\- 1b|Yu[[>]__ zq[Kڗiec3%gɗjce U2"UEP@$|AUVAa`6&e>--fYu7u,%f_4u5ݶ6jy @U>UeѨ"~Fp`DTrq*'HKRiXN"u‹rSND(?Ì&/zdo߿=Ë-QszPh J!ehk,Ap0N#}05'}xCrsb{yknt?q+â3n:MVH%FDMצpziwdם\l@r @%Vޞh+tn5s'\2PTNĆӗFRdoӚFǵآC; #ǹ}"R2>=nyH"JG0 0mZ'5Ucwr nL2bpɣ}Y)(=|_Ɯ|VriJ'1ߣSOɺtc1 Z;T՝lO@E~a&?dňKw,NE2BkodliS}iNw=\V(V%<*)`/zjA%GTc]!IYttxd643 D!n"OQvꗯo?߿}-Thnwƒas'2TiSp@W$h#d3*#6n9mҽ\؇11*'AQJ'(Ko8_|^6"<"p+s5$-4`a('R>TS$`;W cGE̖Gy` +8 <0`Nf35 7N SWO,MNʍ} dh<1a7?wc,3[_|to3Aפr0Bd&]wo캦%OwD@د}|Ld/ơbw I `#2(”$Cs!?̋M1XCF*645ڲn?H#7mk'ZMt أEsKhy~9e++>~O 4)'H]y4QQ\lOT]f+0xiL\F1Hk%BY^3 ӴPS0~ǷѬ-0Oͩe ~ll Fe-mNKE[t[F9A*mګ3]FJ 9SBޟ3 i1]BEpII5&ţwJh)1wF[*ݪ'F 9\軔vCŶ~\TȰcaTLÍiOAtihޜFV0'y3&[6ZD3[hLpcɦ៥T}د.(R'q";"{Kٶq}O_k~PxzZ9efNPZs4/ yyN< 嶥dYaItn f0i=-/p B5wrx&&dvp9lt ?S&Y3]29 4M4 &@r;s#(e2^4{G~fyĐH[ɲW S:\'t̢Iſ~Jtކ$!Ya UY恚e~w^9?f[=(l#e1A,ȴ٥CfGV9Tt@눺ɧlf"ayvڳYæ'ۭMgXYKSot*="5vbki1>nBBcT[8EXazpj:̛)˒{9OZJT_qE&1<l9ZHfv=4Y2i>i lBS=.qo ;|1ϣa`]10clp<:\p}O9UUx!O):]ٸ|8w2lEx;U6 }⓷o[p3b,Ѷk_!М"%9A>*3 ĬNLT zS%#["F9ju-bS@GlUQMRhv?GMLL^;Ƿo|{9ŖLGt2=I.A4dHq ӣa')OִMd>k+k̻ڦf2#*"Yybw1=m6(1$b);2鹟`C)E#81(ḲFxLD mlE\YkGE/ftPaQZ5c<i5p>ҎiNj r9|Vt vߴ4?3]0's&e+TUT k3q3[4b)~vIO=O5gc zGg ⼧g8UWdc&6-yUNAVt}t)'!9/riR6,`b>j>eJB0T8c͆`t HVQ0P%v~@)'"DQ@kJLR9%Ӝ]$&S,Nh'ҴHspA.p`[A-dh!Kҷa^\iY//_^UE37?͎x|?ooUKi\QE$ }7BU͆;tBK`qK)' @d:&h tGUzՀ$H3>7o^$G*`#uN<+θTcab4'ba*#VboC,+q+°g?S](kC9ڠc.&H|chStYTj,frՄlӆ>:`<,tۉ@2cޙeV_A~gKA.UxJ~gO +59dKT{< ] 5u_bZ~Ûa #[jڲ90T`gl4KpWJ eEi Cd‰ 2^(esNOcBMv"2r;O_^F:刁=HZ'E>]ueXIDE:}iʠ;1l ,bȆM1#xԵ)S5B!(K˭g0ƀOGD- {}RQx UZ,ThBFO͐F<\"̅%Sq%cZ FPR5ϫ75'MdiK=t5(9brw4)4FSITN/>Ve)ܯ\֘E ea{z,+?oo=`ؖj{v'=eq84ory{`ܿt4*l9M)<9yemPFn˦h3;pq8X)a'zbi:3Å fEwDE4k9e'=J5`C6*ᰝ|+MPGฏȁMQ'U(]"0AˍIw`OĒߧ ͦj~g̲/t:wG^.=9'{ɲ<)\.-\╟>7(*'tDn H[.E\Ep9VVJ㌜O8eW/cQ1L,f0lHs!i!PUZӑX[X2 &Eśtܞa׸GFڿ A |Nyi,&d?lY @-щrykڷwg2Iba NU;aYCQ@z9S]7A񛯿ׯ_ۏ|H6 Lm#א"bۏ i\`[i0ø5F̕F+L@ݨRyW&T!pO#φN70Hp7$ʰ [fJXWACESOΎP+8)SPQv=%\F8ऋYC$a sn^<`?pYMVE4òMNLx$<WE쓵Fok*#5vyKCE |w0+jkݕؾ%1C{;𖫔Ҁ@zgpA992W!uS9;()fd+<\HC C̄+S܌gY[ =y,,@-eJ LI{WCj)ݨ\pDPZgiyji*1L(ִ*ExX{`&1 6Դnl 4,Jrp=TZP[JQ#m͍D,̌r X܈T.ݥo_/ϯ/~o?ǃɺKsԹBt,%Q#"Ћv#ilLqnrp.xĐ:{ݨYO}<\>&vp]5PV8I2Tb(ڇ[ 9Ӆˡp6ziRaHʼn$CT`evL ZUuMVd MUR}TDVJaho#+tDw1Z<8upzG XEj۶In6xu^x0γ0 U _gk_FPiMRB]WΤ`U XèK\b(2e-Cqג%d0gP>"9' j)=C8gd* }#)#nego5TxDvb[LrWyy_"G̲jBVmoHU;(vNpjA\HHrqBLڵܓQ* +4w}MV:B,"Ek\R*T)QdI͜M8cMJ2RX+We#S6˙TȤܪdOmdUX 9NG dUMqPuJ M d^B%X/) TRZǂzgm/|y=?]闭UW@d'"*/=x> 58$T-pI}bGrkn sR͚n\Ho0 T53}Ms`EQ{ۈK=CѠ_#NpHQSGVIv44 -dcD "z9% kN[?;9$O$zsG wDL"v-Ne`W63Ne0xJ ǩOϙ## !vϑsMRQuSFN%R|A!'C0USD#>'>aTcZ7:F+K^=(B 5d hG t;!%#n;ǔ[)5)}8 W\aUD//1X ]b&Q+a-!2E}__&83$)ƖQp)DO$SW-u`tƒb$"'^!Ӳ`u&kN+R[E2T^dTᥬV6CşFW5A`pބD!+TjIB4sǪBbUJOh7؛%j6n8!32M!gOF R:& :Kcr(EQgÅ,hlkA[+T '.Ѷ׋v.u>>mu<;m!ϧ _ONTZCGr(8w^(O.ʱ¢Ƕ` -5 nZf3DKM^t'C+ď41*hD_L]+EU]UHuWYnQ$gfLWBqȾMKPE (= v0Ë()$(]T<mc6d+d =%OY]P6]a˥[_<|(LR ӝH4Bw0%lg L^fT0QKaI"u<4{y}o?_N{ȸ݂Ũ Y%C|(P&h#yϩόTm9=RvV!֗s4X2Obn7WetEH m!'8 ZU\5H*%HDg#aV4`) A(1PPs0.|bl:j;O&ZəXOzΕ :nX(k 3DQy1n_S2HȗxC"7MLjWZ྆; oԕW~C*{T=V͛dwM*Ü"+h4ƌ(FL|fuҪk޺asVj 1Y*ȝ!0a_)⎑t3%MQ$!^:.Еitlp[pn. e21@fx KEKMAkJj.ErEJdeeRuc&{0]`'59 aߝݘL_N>ެ@2ejo-5F4.Xkq\M["//p,Y"0>u=YF-,hV L(YɒvzҧDcM9춺B rFcwm2_z4vsgthA0bϏ\`S%)sr~:݅ʬ jё.ۘ1 dA7vz>\p!4 d{FsuDz,ITC IDATs3ߑYB$JzR"GpO!P`Ynᗵy0̈粷/sώƬRgq N> ##8^@`{)`QWpXYy]~d^yj|擾흇kkN2IGO.rqj%f;-\I潱O5嗐!/ڌ`\Z֗ځM~1"b cՏ@|p u),b.:F+I ϿǗ.j.N"Gw][<&x8*&Tqeo[Bno=GpiP J1+TZU Ľtv2n[꒏ os7<PH&dǧWRjUpп#nE]pdu"KInEfBQdF/h z7v"!0 fغ!JlvyqV<8V6QAvoԑ 8&/uwF'ŌΣ=/L_Ա-S\v>79O{:siy]o}&k(6x4@ΌpWh(+qk+F aj5-I$izc3˲TM#V(jnyEgÆorZ/p\%x==c l/8XR<5Hԍ#md?O(p_jtzW^4\ݜ;~[27;3O@Eq]h= ~:Lt@h`QaftHDB=٠ٸF >o/U<2S G!ٖ.j+w@:GlL9{8(ChfRu^αp,' -lcqO ǐ`O2!msQyA bUO;ܮEkYٹeH*l#ۙ:OsbTpzpp6n?UO"Q^!=i)8`QsGXH&~06C`IrPnz1| z-kItL`˔U?29&WW"a!h]9s"8zQe:tɧ<)!˥[ӬݾϞk&.\cpDHYQuY]_Bؼ8J)mhlnu 0*tfmHLyy>=)EqܕAY뮴Gаb+q8_#H j,]ěoi'֡BGst=ǑCpE跜Of{5;#j)eNKtLfp_~}O)˚>3S=9JۓL '@w !8ڞ?q2HF^8d_ISQzm3zuHӎZ93'+mẘc#} oSg7nCx݀ͯ,ch7X5?i~\pwtfCÞОIcVlS|;oOϳnmG mas[oכz?o)=_1w(߷kcߞ짱jNna{Ǟ6pFPQnҬ-zi Zc0>4sjVËs[>L6:s_k*i ۯ[m|Zfޥ }!Yhi7UBYfqCt0 QBH:^-5 p{1أ|u7vf%.N|ܔ7!lF&_ﻨ,}]7WQ? ^UFq1@tCgBIY6XVy-7rnߌ{I|jBO0a@bMp5{g XR8yӰo_~t" [۱yMqa|׬-E= Eae~vst]E0$P9۠C! [?tsgW2ݮEGjKe}B8VCvN|l4u*4x,䆭ԮGf0՚W) R1 4_2愛RQSi`cճ+tnL1JN_j ̫fKk@B͟wF}>oM X)eqڱDk#J5C;J "FdP#%BiǓŪ_?2/ct;;]UsT댇VϜps඘Ёͬ?O]&s8|> l=9vokyVdKz\G|7p8˱'~|G)uVIk"*rg)swK٭k8t4Ӵ2֐HOTT́8.f}?hi0c(+>׵2w{#՟m0/ qJ,q8'K}vNWkĐa>0_vlf{X?r:sH4PUr߹K2{ԋ]1Vl Ƕks \WnDxU6Л d% T(%lB8]]YC3%fG"3%o1~8O;369Aft{f/ )(|s_~ofZ.z4b U m:Tq*L{U_X9ZH L>sqWL[h~G =D\n; kwPjd{$ۗ;-WY|9-$nf;"LH d6= b/NLFLx&q){PdǷ'񬷹O˺ؽ=9 ?]['l^?i#4xFGnKi&6 {dtQ&kK- hG:}euHч#JmDnKJqךjOg1hG6~o-~9s7o'(fi_%Ds6GL}sGڻ̕YzƻJ彿5)?ptΥ:|dzE7>0i}esxֶiս輻.*n]eƖYY:.\t/zu2xyLJ+yvX5jRoԦ[NͯsX,89TSMqFCG3ޕe`W d0p6} F]F],fhq~CAeչi^Rj`٦(Vѭ_N$`+SOa.`r&?'gD3Wn de6,m]P똽xRB+uĪg /d/4{{WyԐz8^GrJ@-!+FY+lI@MAef&BYadF;aʩ=yBb!/׾fIQ-~sŧmqF$.ƪ_*udI>y.? 6\ʾݲ'\]J+Fiu#oƧ)@Ҍn{ֵl&~er%|C% Y\^ {P~/ѿǿudnmcޜ4>2B*L}Z&DzK՜Ӳ4J5Vnd0eSG5"dY+cD9t bD:弰|K+eGU-;NǩHjsʍV(Ve+~FѸ+;S tDUbb?e̼0#xCt]f6}vA )o6d΅`%ƺxmhmsx,dd,4ˠ,17,KYkd,=C #(i͛Kaq˯ן,dX wO! V`g~+-zzTbGsPE:JI:5_rQ神Nc'{. >q-z#AE'hN~3yqEёIpmJQzMp RtQ[ɮ; W-,A~F @Q<z`\Dr: Rv파Xn`uoDzq?c7.A(N'8j]ph96zR _+i ^?NinGZ՞U^7l#ocY5-D}lx cHPcq!7S ![j.%mXL*@V0APlU#+(lN7`:+))!Nqd -oQJ?@g ޠ^m\@TZ)?b~""1Q U hes/ʯ7~j"E9䔌ǸMaot W gQrʤˈ2bk_*`VRC o}+k >!~Ks>mLfs6ybDFcXέ@tG6xe#oZ#k`[~7iXXʃ>Zb'GEMj̎6ZUL-Vgo:+ϟ$2 M#fťVޔZ1ȽIz"cV%M*w]5GSƆLm'@hYV_.z9[AӺd+Fѽul)<9{;C.R5*mKD5U0A5>ʞf'CmwPNk{>Jj&V `Wo:N.3޼\_0^z֊~/|˯ok}y<Η0J[kY15s'"QD"l2?nKQ?s.<"&].vO'RՋ15(BSdXI ?9eI72kh88ՅE,GV`]-Cm)ɃQ6OkǓ- :;zܵӇEpҥ~#y pnq5tQ! B?GVP@w^ 8Ld/Wo~NQ@s?iaF:,9AYj̼FDpr2qoGiq',$%y2*7MfFw  Tn$ #b"9ӓE$+\͠2pУ^Z?9Uiglƻ$jE In8PLPJ&U=HP倌 b9$o|!+$8RvqЕv_Nќ\aBXfP?W+a#e&~BbES9*%U 9s3 8 vҲ n\ „%2oϟx ~uZ:Ng +B>;!rz^S@Hh^3bṇ]Q "n6/ƍVж˪#bݳՠLb{鷅a@-2~s0YNjNG  mXm0cn"QUj沲2@m[i-#hGtY ϼ]%3O핛 uJR;T:|by$q+|(J+^`GC?gBS&m IDAT$^!/bn?bTHϱ?~k=V}\duyOR@#Vs MI[hDn4 T=)_ b0#vCD^.Ɣl <^LU뻱2>Q:(i8̡{yX,G+j|@Q% BIVtʼJ@u>$i}n(Wx`Ʃ:bIg5o]mzT|HŃc%3'TBfi.w5>SWL4>#Dzs|*VMre;0EL^;,5;,B8o4 liĭmQU #eOΝ]IQvf?6cfyiīO)?5[=CwY{ױTǭ. : S.7樓?k-b~6d` `'3Žj%Zv8l61;7;txY;Vg1c@pmmtu4JzZvL5_3?}crWϒ"'cP񓋱9峌Z3 K!"/.o**EݕfNV?GQjEu!:UFgMT֡1j)v,w }I®]~YI\ȩ^X2NY_9Sth\bn#igLf|kf$s :m UOLF;Pu6_bW.Yx\~퍎VGӛ^HxL=T4t䩈m1nUUؚ2n r 0$Z{od;wgv5J}#^!Q&3m\^TB%5ULSҙ9ttLe6>0h4ntoLۭ{>}PsVM 풝a'ϩuuV[oڗq_=EW=)`1A?|?pD&Wn> +]KY>QXvjXH>eD[Bp5c6g9)tJŻXtv4}Zޞ. `;P$E=b+QT^1+K:k_6njw)]2+@\o5d1LLJZRE{z -B x2َg-eND9#YrGk-1@f|DuHDf4=3e` 4@" $ K 0X3{Tr*_r(ƌzr|wuK^vs&|9G)TD߱y*P{i)9(T&b{~n_AN;kĆWoFN<#ymKPY>r9Gf|WXϱ'+S7+~yh}nI|~3PS/wӠ痹DhxieeBڝ z<^٢?V_p `'|0wk'^-xSrsW~$qKvzY] R![dAxYaCz2aeU|Me5.Ў,X^'U,VZ5]CRkUp[1Lp R*:۲@aT148JAI$ح~̨;" ^}0ۍΓ3{ǻ@qa^V\jױrLm{/2 ѕjq08dg J*R(gζK8(Wm]KH7 x`H;?b 4^ gRsY$W5yuM G{Z贮jr]V,b/ӰӃ? `1qo~zҢ+fku@/O;+[Wm>ݻ3OB3M| Z "Hcߣc`';QR*V/ K O^Ynfv=pߍg#r1Iw?:|W O]<|.a*;=9W IE;ɴF6 ~RP,+!8fUeZ&1ĈS,C\ Ay,6Ƹ⚕5<^F`EK z$ G@>40m](RHD喐j ;Y'9$*iHے"!);e3vQk1X3o20׷^ {"x*+Td;<gH5<ݿZ .Ksv.=ۃԖHnf+f_Tx2R~9}=IG/g fUkZ󣒫&Os|fi5'& TƁtAΔxtۊp^|IdۈPU'sҩu9mƹXf>bPt\;Ҡ-Orm\yH[U<ۼHc@/aH:rqYaz9IB94~5??6 ly^uӇ%5>?fw)W>)'#?奿ݟ,%LPX֗0x,=aB,HңHXQ2XVʬdi00Lr 6GV`TbZRbFulO&2 % X e]uY B݈.(\5fnn\]ʼ)XY\D+wprrHͧ ɪ\\**Ј4[:+Ml_ ' *GN WmhCѦ)Tf;U3$ꕊXEyH2yùI^%Lʒ P#W<*oG=2ۿau1.`ݛ+ OCRJcwZQ)3ޣN=-iK%]B#&+_BkA0MAN|R4}̆sqU"QSCf6d/KNJ/n0$zyZ=E0ϴv*>;R0$}d!퀚hfOQ/Mxf8rr sQN{zv)grt'EF7iQ%xϊ\]V.ԈVcU5) y0rv8jDpaKt_ɖ+m6H*f._Y'EvۯCXT{bpXo$53O7Z2W1]m~!J+|.N͛ 2fP]zHUb焠8ur.c;g"6dzr^jI>uF- uxWcO"YvAti*A9dLHY>+s|0eu2NNmkTbӘw=9jE(AT:qgv`7uet6^|My^nnn[i?3~S|ONbIXP<,ȍCٍd,PXwD ϤHH)2_/ZjXEEhe_o!0Of;*&XE6X,7/ijPT~f0!=MKt~/L% ֚ލ <}3 r?ǹUJsYD)>:B,)}9{Uhk A"ՓQRe:Z*=&W-)nFEdOn !jH"`%J!W(.D`E$XL4JrKlhpq G,ss-sC]ttD3:Mҳ -gPxQVB>Kf鋘DxdwB ` 4bHe8:h PnjjT5I6]<,w;I"R3y-0Xw*מOX}8͵הـ]-_<{3yt<44u7 Uw̺4D [FR tfɰtM>${#ʼ2YkmDtώ,t GW^ٷH2;^_UI~*ڑmMNoW˗]026V\BUYbVۤEOw2B ,)n%)0y5H^}2{+cSD}CoXU𭮑JBE XJS]Y*׭(&heդPjK¤?p( [c\n4i/;1B"qcRSi5"^*i:hrܹ&SXەRB$Ȏ EN} =5`>ABHE?z]lםv"q5@256sEUF辢jpRhœL*le^=FDe=zF\L{BlqHF'ϟ?眚DTT%hQ;3c+ǚCNznOZm}Ju@N%Ցz f,`Ԣa2s%{ˈv5K)9˒ x ;*Qb74Vnګi `7,T ~(&i($.wf/DOYwkX iugz^oWi{V Rc`tWzӽTE`?c4Q,d<]}=,aכ_oGT:3Ā"cHodI۳z4 hche?3WS8PuFKX3d1o&Nn;=GW[jըnFߦh[.w,A9Ȟo:rS5^%?^iS6FuU_85V xtz\>6UyX;/֑ˣ}S ijmaqxzOc>֝Q}\EwFX9A{R~?'s]K<]ˈ+/+GaׂXK7Z_hNw4֊Z;ꚴ|_ǵj3V;r*9Q'Ui*IE)" 4xg aj+JzqEнV򀫚e U(593yJ\jHwCRq}XB  B&~YuCo=pG Q@RWNy6xwՙ4 xS4:{ݬ,Y#c {f+ F]/JBb$;gPʏ<,NKkI9.3[rGڭ_b"d'BdBRˢ␥$Y=,ah>zdU '4/BssSdnf8NYR} N끓Rc5&+>EoԝGV6Rd>%:%`EQeLM-%)(S ZH{LvWƭ.lӲMnEC˽.bU ˧7=dcavgm@-wstf'Xk'VGe S&oY~ȿ{x!Qu.M8A:d4W47+?؃v5auNۇ:_C 8FMψZ _>%KC@Ec(RIh=zb&jю!sŋعQ=uEUBs W䵣p-9KGωmpRw|щg )tVRN\I՘sۓ[0t#Ɓ&u4簺އNZY6h] VS{Zl0qnRN ØcfӠe~CND+^O 2=S(^>KLw_7)53U'(VbPSwi%-BNDE QَiѢycaH0r:l+ rJ~ٷqGyjSB*j'̰"V@GMGD,QHC8ߢfAk0ϛMHcʉK: Xgk j>iFЪ3RXjW--E93kl*t׃lgqw5ަ-gUh+*Le Cv!GЖ% ҍMj"X;`~%3B]/c0\pS兕{=1À=ʒUcr슘+,"2+?j\.^o,k_ڹL*剓K%I43&5qDO*g`wk "Na;T PiuLBؑ侥ov4uJ9cWj {T}q͒khp,yɨ!StC1/߻cQ;@Cӳbd=P㏞NvVrw.={7\ض_VގFH= ҂ܗHJ%|l=Y̊k%LjgiV7DOׅxɆeYktD MJfr,V{K5V.hʅV50v@/Ih^v5K@Z3ȩk뱊2؇E#QTXEQ4`zXudL#&aꅡuζQ,n;@{O( ]uFFV(n2 6Suƙ}MXSPz舦 >չ}D *eCVW5 IDATB' ?e\bJ+$xfGdNphW,_*WViR[/ɮiwӚ,^ Ji'?]1CGl)rEBTgn xƝkP ڙ~eto41̋]wJ`'ŻN8j8SE7nqlcX#E,gʃ-0 }@G~P[n}BKеpVn}Ojml:&B{?Y4:77] Wn˱_eR#1XlNQ+id-*P^EF i"l]+bd9 7Q-VR[<:6^/CQv5% 3'k\]B .A KYlDՄ$LWy ֪(ͬ #׊I%a8zDғHAtRV}{QzG"ap EDFT)^`L0+zmr*Ns%ݺf߽]Ul'tv[BWFpa+V&/.#`@"p"3b>W2ѳdEZ#HSW̌1`3YjDRjN")OoVWUpE'V0VM=>!( Oik:ԁ#NsͫU0MM*#n&h:֏pdTCy&=TU3Zb 9~ґYT=U i^8:wY;y Sս:^ew͝7<1LOngs[ s`rtz(r&){mD`y uoMjhQ'oϻ?sy5caӎ-Љ34,[' ֏1 e2lV,A,"]T׻<h`ik2Ĥ}\33xc-"\K~yRP .XeUwx&џ&"O5Oϐ<kYap!5URY0B W/LEճ ;ЅSpPJy(*TWd_ *"oEnr5;wS]Ι Pisxmr0=RKŀ/><-2OCq9֭~_yZ&8{HU U4놔]-xLa72ț VmʻlҶըH(ov0SĚvQ uT6 *;vE&o|mApTςq#pb]B|ʃ"ΘDwumK C]n6܊yк]+~{'tsSб:XSFbҡY(z2}ung!}V9㵵J߱=Z_ܻ19ۿ ;KmE=V̌cݍp td z>}H ?7x QNeͣ4>!ѣLf`T!+wQMSVV`:PQ*fkvW3KLs& ΄6ഽ|SbAPn m2v4vaZv)"*yD3t{K.r5il}Pɡ{`K3n=H^RzzJ|֏mB7fƲ^#4UfܫǴU:6qW doa ֔]MLyRC1@VJ$k.dwdkv&q3ƂV+:jcV?l|ǖ8DݮUDr\zD*+MZ<6L ( Z]ҤrJA%18;(ԉE%v` rtvȢcO#ZEJQl9@P5B޵3Sj8}_Sݧ4.,#t$hE$H4Ojp 瀛-IЅ1S+v-=1h9 G%V.Iqݝy~, ɢlKӛU[b~XM' F YrƚKԍd\oL~TB9L*ݾjJVcz[}|ʳtfi}k?H\"pWeld:?t/?>72Ž溳EfhjmQw'zK]{^v d$3;.䇓‘}{?8\u'9Co&ک:?wjg3!֬3vʲkTT91HF3_yNr$)m2u1*kWZ-,סjO6#<,hvHٞ~Pd\g/] t"UNg3 `dPU0VV}ZXH{c> )R_L!E@/f9R}Y]Ew9by8^s66TۣI +[z6$M)X9f!\WjK>̦.d?!L}W57g_j,Ib~e tA.YN"֩і= %N tW3wfj\X%;"W&YUdRQLjPb,q/1LFvݽG%nP@`cPٽA`5] Ӷfkޱ1?-8sHm9s ٹDc7s#y,vd9v:vDur|o߰W6Y8 z 9w;)/\gC{'[/`tԷ |z~!X;*E2Ls?S&JLk'$GůE歎L.bwPV<'+@%Ng@62+G(GZsU-ވ=. <*Tvx]UfW#VZ3B#V$taO/2֣$olZڦ`fR؆f5[~=9coÆs,S=LS/+l4Ezñ7TPW϶n!J]izz*+u;[}Q]7qrh4Ogr_erH]v/xf]tK~߻%+ͽvxff zO:OS?> 0Aadrcw9;.o̞@8>o7ԓ&bn7۫d?v:%gN'2xr?FyVCzI_qRg]{?@`{x;\Y'T!-ՔsPёusѝ:ꨚ,%NOr/5ɦחjgkn$ȃRE/)=K+L0dt-bӅk3jL*gI8ҪrSzZжlx4S b$I}4:W0rT>$G1Aw2mLNk&׮O5yӣ)%[C'5 e|*oN]fOҞ"CsM]sL9K,YV'flU 2 6_wZ1$& 6I׊ygzBy(#c\wȟ#~=r΋ ^&v/5ȷww/0M;orPB- o].Ehc:o5'OcϚQ۸letvZ$[hI.$, G] nW ,İ9 uvdəj>áIz)C1+W Hɔ^…ċ?ͻK~ڤNМ?F]z39;Z7.B1(B~hjf5XQճI"ʊ̗|ر%۲Z6#ʌϫǢv61@XGkDE>54&@$ǯ^2h͔",@'afpgWlEڟs;BKC6memKob<{V 5Bby<[g v4uuZ4a9 3P, ^ZH(';h $䉶TAG%fk=2_zN.BL Qn:;tmm Ѭ)Z8hɋH fa$N8-²"K]R&S~>.y|yᦦ=(u-lT]K=!> "b-5cX On+l3,cևYU){t)GKsWDMwՂUCU*x{rAd*m,Y YyAŹU1ϒk Ztmy{B8"tm ?pOǔש{mrp`gvc'%n$|MU7>֝~W~z_M>Nai62~g> ᓶBo҅uqP/'y͊0E&ZF*Fs\au*9W] `iM=B_X}tB޽@BWI"ڹ"LcJ,rG K3o$W%)y8-ɕ$9<72Kd&Q,I-)9PS `g7lF`9'ǣ u9meVF._e5[s)p\\B/ O2z(̗W|ʝjy`;%=@aVwnDn-;&G,9  k:%ˤ8@ e]IDś`*,֥S5)X10^Gm;؉jCw=g,u(M `%M^~V 2 * (~@iqMxDӫu{~PqFH!qhhj^&a"| DU$[5ع}#̱\6!=)vM3.mhQp5-^ua!V״-{ZGT3{rU>dԫ o 2c2FKV{zw6\ Jby6j;o(s<#'Cgw |_GGUUPmFwnXK A,;!b15`*T*!V㽍ѤF 3e w0ħ9<]ο܀I`Fľ&phdVa TD8k'(yγ Tq]cn2U)̇mJ09gkXQ+Qo zȡja}*90)"F:f{7O|{;~H:<oT{e\mVYAK-bLj Hc/"AF,!#0x(TZ蝲W-m+ߛ<&6zkT/":GS]/]U+?r2@S<2!tY!P]zԘ};1 D#{;C<@`||t&%Y\(+h ^ exJ3Ĕ+(9a Z bhGu;6[/Ɔ?7b'K=g8%v1Zc._ot"2/wLl\.[ن"|N}UC I$o u.IFWYtX;?(2|Z\,jz8*PH(t^^)LZ¾a29AAW Nd[WmL7mx%^>`EdچT}bGt;9v{he(S1NT9:|UQNBLgԨy?w|1Zɛ8 OCfY j\dKٷYg1vrFPǿ@`JA6ti6 x\z8+ezX | .ւϻZUNO_jk}AB"VO, xFX =Wh WBEյVTr#j;z55}nj0Jo$jtϬ!UE+O8) =iJQ@6O&!=UsD1s(@?x^Qʁn)B".S'r | =$׊"sתϑW5H6Sz,&D=g -xCU[]Uw +nXJdG ]gml805IKpztCҔG=s#9*я0M:OqܝO.&œ2zjh lRxY i;psE[ p&`:{s84;p[{|``ӛX~~( IDAT9}49wJ"}; jI:U^^VPM/ܽvڏJ~~sXwӄQMG8fe-~e+̬n. "y,4 nҾ-| 7qog wMi@ʩhf XP|<IZbjUl1lu$)jjj j8\0ǎl-7 j^ڣ ,OZk`|@=vaPϚS/Udc)\q| .֪1onD2.QMl*B]Yr1HihR)ԌQO>B;j{s]f5 9إ}&35*,dQn>{Zcs]WxW-z ݁ML *λ~v SiZq7(Q-Z[ ڄ ]¢m 4+lҥMLÊIhweAZB*Fw7vI 'oɺ)JC7m p6ެ8 LzmRpv:a,~0zf|zw4H 9 sw,~Ɏs~}W%EeCm|RzWQdz@+W\Żr P|g=ǪvK{{23 aY4`G I+@+0GTTCu r,{^OU+ {O _ܻ#z'I+[2Aq@3J+tsI\ ɠ9*ca\lۢ7=C.qzjrNQ=aDR+V6H%2z<&ދCh]JKc[nhCz5$  u)t^PNʶ"H.' ՘sO84{7h^˟߀rT &T*HcZ ̡"R+c۔!0_sW[ -|D[*OqQI70IU*ofWHRD)ja6#WR"j\JYC:g| !nd C'h< k7;* "ĭ,.t?gNQr硶".1H)#$ٛj>E6ٿY8Cdʛdo^w]0ǟHd=ZOUadN̖-Z3s9E7s l܂/f`ĺME4靵߀r# axt'A9ϹV`Y{wpXr)@^ND37¬ӎ?plX XZK뺆`=ʡʡ(rt,Sl0L&ˬs[ "mCOkmΏ ԮC~: :a80TjeUx_3!DYǖYYD\}==+ZwT]}M-ZsI!ȝ=JUY*ltw=hԌE Ռ(ILwU-82qh=.*>8+{ѫ#şyrk%΁"~?DJC%})1M`cZ\Y;#뿏ng?-T\k1qd+T4ӆHy㣥>#쟢%|$)P] GkbQ2RmbR[F"(PL2s*XxR7m̉D(ԨHQlehxa$b|ŃPM4qpk=MxFu߁O4K^2⛨*y,n;*Hwu}!n7^^(wa#끏3?Ìu3:n 5paq骺Z~j;Sx&۵AW5qLQADa}0䈳\/^09Q2!y]003pG^ :DG1F'>EDo()7p,3LMfp7PΙuf&id 9h382ZVe˭XSLnr3|%^ TQXq}c~%*s4^w%E$<,>C%m@LaC WX3YdWڝt[fUij!\U\{5@lȢVi$+{N^z'R5_I>DnА3Bz UxW~fnAץպ `AKs`aM.MLݦl >40܁eQһ6a9Ėrjp.C7QOҪR@r&9VhX);l1kR~'W^:8f5WcFV{Bmfr(ӌ晦MdX4 EMuUm u,WYf%j(x@0 yDXkz fEVm%rSm{rȾK E,ăE UsOР^8A!͂ xB{QOA@D[fyF6˟&MadL;zs-"V5 NJExErۓ3&ƝJmJH{6>u1&Gn:)DU0=5sjP:Q,<'[H8W 5xU49OͦN-61Bz7ݴGQ% BТ+Fs⦼Ú񮱮sxg]?=/Y+1~D_R_6_9;ݗK:b38; UF4<+%ɦwW'Ci po]'ɝIPs1.WeEl)PwC %$kB*L \ =̹xb#Bf=γ){ hQ3CsjxB]߉auT=~>@RWHLޯ#i_a"E˻H b-nğ'[>S|\R;6"J_{/nE,M-V;ʗ碖;)1y}+Lwx,JKٖr 1we^çU\kiRrU{]T'N8}?b_ȼc>V;%S?h~}/Z_~sE3^l+GXu6(i :n2eڊ$z.r5A*X ;3,7MYd$nVjye2PFs2EA{;tyw4KaxPegJh]OI}Js--ʝh@ c7kx|Ck>4t;jc L*e|i1G\q4Szx)L8&M / 21G&`ߔ{ 8?:x_L9G_C}LN0(L7RD7G:Pu5Y\r}k+ݏ}0.<98݌Y rN9 8#OUImlL|JfIT5"44>䞈[`!zsuYcuq=phv=c$ hƜs1(qyr.}\P&&;lcJ'QMsDKH"MKGSj,P5pll?HIQeڐ{?'M>L/c1e.jOki4v|Ei6m]Gwή;"wmTRe"T3EPĮ(\kbwuEvžmbYwbĕL`{WZ/l9;{kR1!V.vB%$#1QbkۺS6ZNU]ִoO:|c,ZY9M^Ja{7{MkN4r{mHU78%@Bҟc/_~dAeeMJTbS]!+Ġ+.e%ؑϯgVcm`i%tj6.]t V~EZr$#S2~i%dT Ø<15:(m3ۥmhv\U%%*48*#<:\9=j댙a> OJ<╎ZToT!3\)" 3]P\A2U-̏H&%Hxi#]O3cS8̋XI"WӡDxS[Rf^]|; xLXf":Wz\CsaMHHR hL ZyW_/\QFA>4%^],Lzq)DsHR78N5He_woOiBrFMIܔn.z A51-X?{ 0a%y#IF(y8vX2c V =Ӟ3sͲ@B,6J;a2F̑8 t(q-vx)^v/'/#n5?1ڀs{?tXDKzfo(eB+9gPR}˅=oYEB̪~4PV3<{,;A.dnz'ӮewpB5*ؖ-QxCB Y6g_H0JvQ,K:TD/Df*B5]gxӜ)wW3.AAg |1t, wYQ.N%')7rQ+h(,7_2-+ `4pWҙ,|]3Pkb͊a'lliu!^簦uGn8%9|^SMeyFb)ebWpbk|)rqH-gUO߱eqmek'%,'?>1Fz'΍O=x/Rd6OUWys!^^r.GbzY݂6G}3Y;\M0[Nyd$^өtk 8pP21v2AHkp%x[T^7ʀO[ 2b m| ҝ_0w_AOf?Uv“?2@OhXܾ:y)TȈZ5Ps&%uxŹ1wx͛7Dq2>U%X'o3z_srqPTCìΎ|tDƦ&e8U,qVBKB]%+gap1 L mp⭳.b 7 #*%r WnY[2bi]K3>cS~]#k{*c̎CMAo=0;ۛ}ܨ1sid q=_Wb-/FN3k ޕ 4D7ׯu{TmS4c/q ωaUvخD76/QBI'$o}I>uqE$ͼ9?ek5Y geN#A5q`_\Pq1hff)T\r^L5)V$-N@*ZnDla om u]4_N }aef)5b, aÇ} 8}#!#,qrPE@zRJw$=OƠ 0]=;qq6Hx夰oS8ey(RUY]EhJ%4KObg!=|(6/ExU jFq-z5D(@ά7c[q*73}~_& R9y0ne~pv.qp݇\y ҚQJ}uK܌3,V LIWq`Q_GS֢lvgϤѴsmoWWDQ"=SN>~^?^hGYq:So<3q|)Ö/ e𚦣j^ެT8aӐ5MBl?I _S-oTHC]bQ\A,Ǣ׷:B ARVxH苓ĄZM{ @-rLmiP y+*.".NGZfQbT(lTaM4܌cS] 3{TެT*jTV<P!X+յ̈xƻ$)]B1(+ZYS“B8,y%bHnÅ }jl/;8){zf눈\ȥꔥ0jySSɐh~JtS=*k@`tӫ̵.KQ2(|1UY |z cܥflrR4Ulh$b*[H b#w4ծYA 1-* CcvCFAiZΑĮ+NheP`mvrFHiELxp;8l^*Tַ;seΧD/~P`sΟ<~p>?YOL n63t|ocFӸq`-l52"7{#ڙ rZMLA07q] ]t% Ig(3E,uZ.ਘ? WS@ATI Ɣ  "V7 w5n@] y+XSR/SͫLa+l:B<~]W T/w.8e2 ;<SUhڦ̮vZj4h0UΠix҃1l.N1~xMpHLKS HSeVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3gAMA|Q cHRMz%u0`:o_FgIDATxb?=Ib<;?"n +>CwO>~at&%2Rj 5*gjnim/4}pv rs/}RM/a K-fpx^nݼr+߿tC?vcG_6o=} Y/_ۗl]Bݵϙ__񿭥X~ )~/#+Ý׏TgHdx Îk gpcɥ +kȰuFp3ǎztapF,m7ѐG dPH!(8wPѺcklEVBQQ45V[Mn \tHSc@ŒGfMg Id&Zked-ΙC%Ǎod?jpF5Bo 1 xW(^4D*u-N _'x<$1ʲ{'ྃ$8nyNM;q$@Z5Z֌l>7( _؏6q3H}8՝h` BS@j!z'>ˏ%eYtKa\ e"Ihn ^t3.?BR5@k%ܥŻ\$:JgxWQJQ*D"t;]KlowZNԫ>jr~yN"\jX-V^^/>v$X,T*EU<<)J)km{89>!ea~4Q1ޓL&E0 4MӨlmnwk_ɓ]β%1@EJHW"] @heZd2G0 n*7\fӶPJ=wtj :(svzW+ror4M Ohd}jZ@Mxă[} e(Ֆ!!~(lcsDp I,Ca0,{?084H4[﷢V 1#y ;6¢?aǝ;tȩ9VBLQA@( ݪ $ҭO[vF߯cqP@y1)T@HuLe_]LgoRfKQhd aBf3*&F\]-5ټ@ްhL]ǥɌLpM"jNPhҾ-۾D6$͓<9ssf 3JUz*999D)RYU9;v8FGFFPH&E7څа '֭[dXA߀&KK cpvvΔ7@ZN`^zXx,AT/K~1xɔ;'%hkkCDE*I?V]Ჶǐk"V$R`4 '?j_v"Aſ`V(x<5%(--Y`p`Bii)LxVˮ/wzh4b6zExfW"---}ڄ@JKb N'rJfxxF2DAס9q\ӯgj8###խptY~', c1Ơ700<ʥ+{.gϝeW{%ѱQ5ȲlboU󓗗w22khUUTWU5h%ĸ'9< ٲy C!RDbg1n{@nnd qb(BQQ9뽇`b[ٰqg~6ouT9p>n`钥6\.`P(4N)u$7rɟ fqfk pwb9V(?}Luߺ8}4Yf||t`kuv-i%lSACެ<:;;F m8rcA@@Lx 0`7mDAaY2XTF8ɼi =z:2{^fjkkYz h`(siq7o9~8G^Μ;Ñomt^?Z/B!UC/hkm#-q%n7& It T^Jw5%%f2l4SVZ&ēq(@ًy¢BnݸGYUbEUUf/Y<9-kdY`bbUQm|5($IRGp8A ydL&C jQ2p8 #g4b/5 yx=b\c80z޵m6f$piNN &"Q6VJ!TITZEB$P?\ u1&Sٙݙ@$¥)t~{st:i=rʪJ4`ά9>vW(vE:&H Hr\-J E'NX~}bW$Ih)Xӭj'OՖ$ DQ̑/ZvcORcH?.E:& f]~! &|008`//Ӆ'C/C}?M_Hi?[q#bo{ҤI~rssHĹsQ<躎CvyYfڲnrlڸɲ\uN7h ]).)&m Er6`ϝgKS:c9Etne? eϢ, 6E),,D7tNp4Q\ \uq⥧n۸FrAH%S4.l6a#&HiB$ArJ{Ͻ,~~1D_ӉIjI¡0Fp~6s̚QFZ~z'O\_1ק>?š#2~)7E.BrH8N첝5װvZN'ח`re-oun[Fr}AjfDHĴiܳ53g̛79s D|^C|QzX  IxK/QQQ w-Z' 2{l}ʩ{lyg ҂eY|5ć⨪HA@$6]FiQ)/uX|Vl[l!o\CB^\"hMd . MF"0sH2\xs+Q}O5>Lhll/ǒ%K2y u?#PT; {9|f̨>]4DbBvN`bd豣TM %X2A.ZȮݻ3,[NJG%vUqa7(BQ⑝2Rĕ+ |կfB;|mdæ {a\#Iw2gl]`]Ď;Bn? 9q}PcG??g֒L'&˞ ={G~w:me  /P ̜=Ӂ#AǴLy~7jFnTN}[qsZr @@vyf}B-^Dii)sӧ#;eclF]EKjlߺnҴּƞxC񡠑6Ș `e,1ks6 y7P6KBM|r,s!*T /X[s$%+̣`\e\|#8ʟ䳓Q\\i(>3+|U+W=l#7!w u6f+DN,EUUΜ>Crڿjg|xS7?(eK4@4ѓۓa8/%ehݣ]ҒR&O&Yi{ヌffQR\7{<;+_SM]dA^2첝{+Wu{D"{x/R`-#iڑH$PUxdk񚖅Y(7d 92YT2E>nq,ۺf o@rv~6e䌤8)Qu%vڲmY90 aF@͏,zt7oRKk J$I4 $8)rm JF>d^oNy"p%ow}޽󦦦=7߼e[>gaqQH8)vm'-JZ,iIItǗD?VmH`Fi#ki۶3m,J#eFRŔKʒG;;l30AEQEAvqWuGm0 s2ntq^/exDA˲vJm.ؖ3-3cFF@HKKѡ dA,ozR)EQJJJFISs×iK/ڨu;[MMV"by?}{JKK&L۶$I*xެLw;M]R{vꊰ!"w[%J*k*1MM\@m%:֯Pmmm؎& uUSHzN?{g˂ x<>GJ^z{{OY;kôMBlEQ( _ڳgqJJ VElj2 ^˒%}0ލ$r ~yE˨ZTD",ˢA`ʕ.]ĺx%/"tIPT:E@ I$xD=#GuO>z/n{ "d #ٳgρcG)vtE"B(BHt6I'ٰaaŨƲ,AlJJKgMHhՙa|oѸqRA;+߽A#y¾W)Y~ 55TF*YTu]2 3LOOS0 KXT^`k+HEHPT(.Iʲ hr-[qƵ/prV6>f^$Ibvvc:q 0>DQdմFCC^oq$X MbIL'zVnx#\X,FYi@6/I%ԩS47 .3 +V6/D hY8@/_fqIirR:\֖VB%!rfHE$Wb>=ϋ|Cd2(7Mbɒ%:.,Q__iljDU[?n0??"+1fggY?^# e'{N8H  ´\BK[ M˚(dh\gQUv0{N+;Xվ͛6sqWqlںZA Fj873`G( j*|0֭biRV]ʼ⋴,oTOFQN9inj޻mah3g;,, ">41-%X:TWUӺQ4|T+o_ՃdYzd9v;T={_ 6?2?`~~GX{e:{ZU޼=`IܳQ]] kijnP)WCױ.N"TbӦMJ:f$="?SzG hTWVsۑU}@fzzzяĝt{x-dm潚ogH\fltmh0?~HΝ;Yvlǃhx<FG9s C1%ΰyfffg4e[x ^?DִaYyes= lV|#@t-w6۲d2477sӦ9þW!%B8{,Cb ~afgF {_؋j!oN'Yw:tϗD#$ $}BF"\ڶ/۶=8W&"kjZ@C/_y``۷oGT<XE6eE $IbĦb $>vm=«^erjoIgXE"qB2 ]?=*zD굫q8A87] Y.C!QVVF![#dY7xy_B,vquK>`|I`0HCCw~iA|ʞ}؛Evhhļ>_h "saaMYn=H\6_32:Bױ.IR,\c?x EVZSp>q'ZKKKީb }%X۶zӳrawvaVqP*6O@k>^eDBVK/AbJh S9u[RL{܋ %|~oOLMuDǫOXñen#W4Ѷ;y֟@`p;uvAڈz(~ؖiyNt^&>{C,|=VT򯮾W?aqz]*钻qn?sz AC͌h'Jϒ M8dҙ:?[^KFbB#̑-1ZV:U&rV|8?Ij"NʪϚ FJGhl`xCXCZťD+4WҪWpsu:PB}=hB &Tx3b'|:[~}hppk&~۽gKFٺd 'Zb o,DbDM0^'JKR F>W5[,Gc¸2y] K*q%Ē< SξЗnRFzݹ  ڇXԴR,OUy64JB\Jv N.ѣ?ݪYڕfJ6s=B3'I$BM$RhO$7JSvqBPr" 4+0!r G?{$INcREU 7lH87MV.7{Ֆ&L $BwFc>_}J)Ϸ9擣q6<fa`5k+*4=Wt5v}V8SC35f6ך^w Xb(NylH135L&n։#|ZkLW~:nZ@xd^fu&j6md?itg6]B#ϙ%lnɲlc/c!J[99Zal}9y7#G 7g*@(9|J'WAoUrL=cX&+ME%ʤVKyvӖKWs7ر_p(eg&' ٔ$4mz}ޞ-J 'ڠ -V;ې4v6(h9svy(u%+ga;u99OܦkQ(d`V\Z^K/K M[f™߱~τ.v]}A tVp:YhrbX{`]lY8W-,gtܳ\(X@"6,)$mmM8wtxuܱ(^ %Yr^ )'atgD\\,>&G}z#jk1 pyn3pa9sF6eQ$D~:]n*l"4;/YZpA 9˰hi|5 H^nFt倕JT"ҋ% z8؝^KLdD %fL)]QQ<^ v>D glsz >ΜGO7F;.m!uI^4/&d}xJ!Dffyn0\"2!svY6 o5q9B.Wa8j x(Pև}=qGslPdC}}@8r}}::;kx+VׯOkruH='d]AKp,gqFݍ7h$TcdLM1+?N Ѥ%*//[K&4\Af4vQH9j!YR%"+{ĉstRg/*MHϧŒPt̄3܎9MQAQD*#9)ZzKD6OB|ݷ"CDJs[$mL& gkkTbPUu,c%5vz~Ip9pf,Vmxy.YWyYcbbMZmuuu4W~8r!vՎ٪P nPiT"ሡMXHy$ZgJSfJ|𛚚 2Ō d Q.Ni&Ü#1 )}J&6"Tx!HdǖLbU0]=xdL <,Nz,mgKwѱubѨg !I~}aUS;&O]U #l ,-̜dr2Ȳj4!К-d2iRm:L +٘kd ]o,Yv.bǿRV1mII{H gq 6YY/shϿn]#t9j[~AG Mpl{I1)Ŧ,+ F#xq(VS_ /nR292i:fc3I_Ǥ~6[5?!3GRSSK/nwY!Cۿ>8JI6S,l<#q-눈z{v$M r[h8~zB̹}RnцKW5`fCB]O<'P~JGBJ$ ٖt";QСw?>(]$9@qt1Ysi XƎ]?ؾ}&d j5}PSqljG>??)IXE\ȸ@cz -|t> kfroolt A\ތu{goN(--iu49n<ۖ ` 4ɔT:Ha>|hoo_Rjmmr%ٳGp‰3kL5k9\3}=擡d]IENDB`nvidia-settings/src/image_data/help_pixdata.h0000664000175000017500000035613312236467170021532 0ustar albertoalberto/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static guint8 help_pixdata_pixel_data[] = { 0xaf,0xff,0xff,0xff,0x00,0x84,0xf4,0xf5,0xf9,0x00,0x2f,0xf6,0xf6,0xfa,0x00, 0xf3,0xf5,0xf9,0x00,0xbc,0xc9,0xdf,0x00,0x34,0x50,0x92,0x17,0x02,0x22,0x75, 0xce,0x11,0x33,0x88,0xff,0x14,0x3c,0x9f,0xff,0x19,0x47,0xb9,0xff,0x1d,0x50, 0xd2,0xff,0x21,0x5b,0xea,0xff,0x25,0x66,0xfc,0xff,0x28,0x6b,0xff,0xff,0x34, 0x7c,0xff,0xff,0x4b,0x9d,0xff,0xff,0x4e,0xa0,0xff,0xff,0x49,0x94,0xfe,0xff, 0x4c,0x92,0xff,0xff,0x4d,0x94,0xff,0xff,0x4d,0x94,0xfe,0xff,0x4e,0x95,0xff, 0xff,0x4e,0x95,0xfe,0xff,0x4f,0x96,0xff,0xff,0x51,0x96,0xff,0xff,0x50,0x97, 0xfe,0xff,0x53,0x99,0xfe,0xff,0x53,0x9a,0xfe,0xff,0x54,0x9b,0xff,0xff,0x54, 0x9d,0xff,0xff,0x56,0x9e,0xfe,0xff,0x57,0x9f,0xff,0xff,0x57,0xa0,0xfe,0xff, 0x59,0xa1,0xff,0xff,0x5a,0xa2,0xff,0xff,0x5a,0xa4,0xfe,0xff,0x5d,0xa5,0xfe, 0xff,0x5d,0xa6,0xff,0xff,0x5d,0xa8,0xff,0xff,0x5e,0xa8,0xfe,0xff,0x60,0xa9, 0xff,0xff,0x61,0xab,0xff,0xff,0x63,0xab,0xff,0xff,0x64,0xac,0xff,0xff,0x65, 0xae,0xff,0xff,0x68,0xb3,0xff,0xfd,0x59,0x9e,0xed,0x4b,0xb6,0xc7,0xe3,0x00, 0xfc,0xfa,0xf7,0x00,0xc6,0xff,0xff,0xff,0x00,0x84,0xf6,0xf7,0xfa,0x00,0x2f, 0xfa,0xfa,0xfc,0x00,0xf8,0xf9,0xfc,0x00,0x6a,0x82,0xb3,0x01,0x02,0x24,0x79, 0x8e,0x10,0x32,0x87,0xff,0x14,0x3b,0x9c,0xff,0x18,0x44,0xb8,0xff,0x1d,0x52, 0xd3,0xff,0x21,0x5d,0xed,0xff,0x27,0x66,0xfc,0xff,0x2a,0x6d,0xff,0xff,0x33, 0x7c,0xff,0xff,0x52,0xa4,0xfe,0xff,0x5c,0xb1,0xfe,0xff,0x50,0x9d,0xff,0xff, 0x4a,0x90,0xfe,0xff,0x4c,0x92,0xfe,0xff,0x4c,0x94,0xfe,0xff,0x4c,0x93,0xff, 0xff,0x4e,0x94,0xff,0xff,0x4e,0x94,0xfe,0xff,0x4f,0x96,0xff,0xff,0x50,0x96, 0xfe,0xff,0x51,0x97,0xff,0xff,0x51,0x99,0xff,0xff,0x52,0x9b,0xfe,0xff,0x53, 0x9b,0xfe,0xff,0x54,0x9c,0xff,0xff,0x56,0x9d,0xfe,0xff,0x56,0x9f,0xff,0xff, 0x57,0xa0,0xfe,0xff,0x58,0xa1,0xff,0xff,0x59,0xa1,0xff,0xff,0x5a,0xa2,0xff, 0xff,0x5b,0xa3,0xff,0xff,0x5c,0xa5,0xff,0xff,0x5d,0xa5,0xfe,0xff,0x5e,0xa6, 0xfe,0xff,0x5f,0xa9,0xff,0xff,0x60,0xa9,0xff,0xff,0x61,0xaa,0xfe,0xff,0x62, 0xac,0xff,0xff,0x65,0xac,0xfe,0xff,0x65,0xaf,0xff,0xff,0x5e,0xaa,0xfe,0xa4, 0x8d,0xb7,0xeb,0x01,0xf4,0xf4,0xf4,0x00,0xc6,0xff,0xff,0xff,0x00,0x84,0xe8, 0xec,0xf4,0x00,0x12,0xed,0xf1,0xf6,0x00,0xab,0xb9,0xd7,0x00,0x0f,0x31,0x83, 0x47,0x0e,0x2f,0x85,0xf3,0x14,0x3a,0x99,0xff,0x17,0x44,0xb3,0xff,0x1c,0x50, 0xcf,0xff,0x21,0x5c,0xec,0xff,0x27,0x66,0xfc,0xff,0x2b,0x6f,0xff,0xff,0x30, 0x79,0xff,0xff,0x55,0xa7,0xfe,0xff,0x70,0xc7,0xff,0xff,0x5d,0xaf,0xff,0xff, 0x49,0x91,0xff,0xff,0x49,0x8f,0xff,0xff,0x4a,0x91,0xff,0xff,0x4a,0x92,0xfe, 0xff,0x82,0x4c,0x94,0xfe,0xff,0x11,0x4e,0x95,0xff,0xff,0x4f,0x95,0xfe,0xff, 0x4e,0x96,0xfe,0xff,0x50,0x97,0xff,0xff,0x51,0x98,0xff,0xff,0x52,0x99,0xff, 0xff,0x52,0x9b,0xfe,0xff,0x53,0x9c,0xfe,0xff,0x54,0x9c,0xff,0xff,0x55,0x9c, 0xfe,0xff,0x55,0x9e,0xff,0xff,0x57,0xa0,0xff,0xff,0x58,0xa0,0xff,0xff,0x5a, 0xa0,0xfe,0xff,0x5a,0xa3,0xff,0xff,0x5a,0xa5,0xff,0xff,0x5d,0xa5,0xfe,0xff, 0x82,0x5d,0xa6,0xff,0xff,0x01,0x5e,0xa8,0xfe,0xff,0x82,0x60,0xab,0xff,0xff, 0x05,0x62,0xaa,0xfe,0xff,0x64,0xad,0xfe,0xff,0x61,0xac,0xff,0xe3,0x6e,0xad, 0xf4,0x25,0xcc,0xdb,0xee,0x00,0xc6,0xff,0xff,0xff,0x00,0x83,0xd9,0xdf,0xed, 0x00,0x1a,0xd9,0xe0,0xed,0x00,0xd8,0xdf,0xed,0x00,0x37,0x56,0x9d,0x0b,0x08, 0x2a,0x82,0xc7,0x14,0x3a,0x96,0xfd,0x17,0x42,0xaf,0xfe,0x1b,0x4f,0xcc,0xfe, 0x20,0x5a,0xe7,0xfe,0x26,0x65,0xfb,0xfe,0x2b,0x6f,0xff,0xff,0x2e,0x75,0xfe, 0xff,0x4c,0x9d,0xfe,0xff,0x81,0xdc,0xff,0xff,0x75,0xcd,0xfe,0xff,0x4c,0x95, 0xff,0xff,0x47,0x8d,0xfe,0xff,0x4a,0x90,0xfe,0xff,0x4b,0x91,0xfe,0xff,0x4a, 0x91,0xff,0xff,0x4b,0x93,0xff,0xff,0x4d,0x94,0xfe,0xff,0x4c,0x94,0xfe,0xff, 0x4d,0x94,0xfe,0xff,0x4f,0x95,0xff,0xff,0x4f,0x96,0xfe,0xff,0x50,0x97,0xff, 0xff,0x82,0x51,0x99,0xff,0xff,0x14,0x54,0x9b,0xff,0xff,0x56,0xa0,0xff,0xff, 0x58,0xa2,0xff,0xff,0x59,0xa4,0xff,0xff,0x5b,0xa6,0xff,0xff,0x5a,0xa5,0xff, 0xff,0x59,0xa2,0xff,0xff,0x59,0xa2,0xfe,0xff,0x5a,0xa2,0xfe,0xff,0x5b,0xa3, 0xff,0xff,0x5b,0xa5,0xff,0xff,0x5c,0xa7,0xfe,0xff,0x5e,0xa6,0xff,0xff,0x5e, 0xa8,0xfe,0xff,0x60,0xa9,0xfe,0xff,0x60,0xa9,0xff,0xff,0x62,0xab,0xfe,0xff, 0x60,0xab,0xfe,0xfc,0x5e,0xa9,0xfd,0x60,0xba,0xd8,0xf8,0x00,0xc6,0xff,0xff, 0xff,0x00,0x82,0xdb,0xe1,0xee,0x00,0x2d,0xda,0xe0,0xed,0x00,0xe5,0xe9,0xf2, 0x00,0x8d,0xa1,0xca,0x00,0x0c,0x2d,0x85,0x64,0x11,0x36,0x91,0xfe,0x15,0x40, 0xa7,0xfd,0x1a,0x4a,0xc2,0xfd,0x1f,0x57,0xe0,0xfd,0x24,0x63,0xfa,0xfd,0x2a, 0x6e,0xff,0xfd,0x2f,0x76,0xff,0xfe,0x40,0x8f,0xfe,0xff,0x88,0xe1,0xfe,0xff, 0x9b,0xf9,0xfe,0xff,0x5d,0xad,0xfe,0xff,0x44,0x8a,0xfe,0xff,0x48,0x8e,0xff, 0xff,0x47,0x8f,0xfe,0xff,0x49,0x90,0xff,0xff,0x4a,0x91,0xfe,0xff,0x4a,0x93, 0xff,0xff,0x4c,0x94,0xfe,0xff,0x4c,0x93,0xff,0xff,0x4d,0x95,0xff,0xff,0x4e, 0x95,0xff,0xff,0x4f,0x95,0xfe,0xff,0x4f,0x96,0xff,0xff,0x50,0x99,0xff,0xff, 0x55,0xa0,0xff,0xff,0x53,0x9c,0xfd,0xff,0x49,0x8a,0xe8,0xff,0x3a,0x74,0xc8, 0xff,0x32,0x64,0xb4,0xff,0x36,0x6a,0xbc,0xff,0x44,0x83,0xdd,0xff,0x55,0x9e, 0xfa,0xff,0x5a,0xa5,0xff,0xff,0x59,0xa2,0xfe,0xff,0x59,0xa3,0xff,0xff,0x5a, 0xa4,0xfe,0xff,0x5b,0xa3,0xff,0xff,0x5c,0xa5,0xfe,0xff,0x5d,0xa7,0xfe,0xff, 0x5e,0xa8,0xff,0xff,0x5e,0xa9,0xff,0xff,0x82,0x60,0xaa,0xfe,0xff,0x02,0x5b, 0xa9,0xfe,0x93,0x9f,0xcc,0xfe,0x00,0xc6,0xff,0xff,0xff,0x00,0x82,0xdd,0xe3, 0xf0,0x00,0x15,0xdf,0xe5,0xf1,0x00,0xd7,0xe0,0xee,0x00,0x39,0x57,0x9f,0x10, 0x09,0x2d,0x89,0xcd,0x15,0x3c,0x9d,0xfd,0x18,0x46,0xb8,0xfd,0x1d,0x53,0xd6, 0xfd,0x22,0x60,0xf2,0xfd,0x29,0x6b,0xff,0xfd,0x30,0x76,0xff,0xfd,0x33,0x7f, 0xff,0xfe,0x76,0xc5,0xff,0xff,0xc5,0xff,0xfa,0xff,0x89,0xd7,0xff,0xff,0x44, 0x8c,0xfe,0xff,0x44,0x8c,0xff,0xff,0x47,0x8f,0xfe,0xff,0x48,0x8f,0xff,0xff, 0x49,0x90,0xff,0xff,0x4a,0x90,0xfe,0xff,0x49,0x92,0xfe,0xff,0x82,0x4b,0x93, 0xff,0xff,0x0f,0x4c,0x93,0xff,0xff,0x4d,0x95,0xff,0xff,0x4e,0x95,0xfe,0xff, 0x50,0x98,0xff,0xff,0x4e,0x99,0xfd,0xee,0x3f,0x7b,0xcf,0xf2,0x20,0x41,0x7a, 0xff,0x0b,0x1a,0x3d,0xff,0x04,0x10,0x2b,0xff,0x05,0x11,0x33,0xff,0x08,0x1c, 0x4e,0xff,0x0f,0x2c,0x72,0xff,0x23,0x4e,0xa6,0xff,0x4a,0x8c,0xea,0xff,0x5b, 0xa6,0xff,0xff,0x82,0x59,0xa2,0xfe,0xff,0x03,0x5a,0xa2,0xfe,0xff,0x5b,0xa5, 0xff,0xff,0x5c,0xa5,0xfe,0xff,0x82,0x5d,0xa6,0xff,0xff,0x04,0x5e,0xa9,0xff, 0xff,0x60,0xa9,0xff,0xff,0x58,0xa5,0xfe,0xc0,0x89,0xc1,0xfe,0x0c,0xc6,0xff, 0xff,0xff,0x00,0x82,0xe2,0xe7,0xf4,0x00,0x17,0xf3,0xf5,0xfc,0x00,0x8e,0xa2, 0xcd,0x00,0x0c,0x2f,0x8b,0x64,0x10,0x36,0x94,0xfb,0x17,0x41,0xac,0xfd,0x1b, 0x4f,0xc9,0xfd,0x21,0x5a,0xe9,0xfd,0x26,0x67,0xfd,0xfd,0x2c,0x73,0xff,0xfd, 0x32,0x7c,0xfe,0xfd,0x51,0x9e,0xfe,0xfe,0xd2,0xf6,0xff,0xff,0xd4,0xf8,0xfe, 0xff,0x5b,0xa1,0xff,0xff,0x3e,0x85,0xfe,0xff,0x46,0x8d,0xff,0xff,0x47,0x8e, 0xff,0xff,0x48,0x8f,0xfe,0xff,0x48,0x90,0xfe,0xff,0x48,0x90,0xff,0xff,0x49, 0x91,0xfe,0xff,0x4b,0x93,0xff,0xff,0x4a,0x93,0xff,0xff,0x82,0x4b,0x94,0xfe, 0xff,0x0e,0x4e,0x97,0xff,0xff,0x48,0x92,0xf8,0xc8,0x36,0x64,0xaf,0x39,0x0e, 0x20,0x46,0x99,0x00,0x04,0x17,0xf2,0x00,0x04,0x0b,0xff,0x01,0x05,0x0d,0xff, 0x04,0x0c,0x22,0xff,0x07,0x15,0x3a,0xfe,0x0b,0x22,0x5d,0xfe,0x0e,0x2f,0x8a, 0xff,0x1f,0x4e,0xb8,0xff,0x4c,0x92,0xf4,0xff,0x5a,0xa3,0xff,0xff,0x82,0x59, 0xa1,0xfe,0xff,0x08,0x59,0xa2,0xfe,0xff,0x5b,0xa4,0xfe,0xff,0x5b,0xa5,0xfe, 0xff,0x5c,0xa5,0xff,0xff,0x5d,0xa7,0xfe,0xff,0x5f,0xa7,0xfe,0xff,0x58,0xa5, 0xff,0xdb,0x74,0xb5,0xfe,0x22,0xc6,0xff,0xff,0xff,0x00,0x33,0xf1,0xf4,0xf8, 0x00,0xf6,0xf7,0xfa,0x00,0xe9,0xee,0xf6,0x00,0x4e,0x6a,0xad,0x07,0x05,0x2a, 0x8a,0xb5,0x14,0x3b,0x9f,0xfd,0x19,0x48,0xba,0xfd,0x1e,0x55,0xdb,0xfd,0x24, 0x62,0xf7,0xfd,0x2a,0x6d,0xff,0xfd,0x31,0x79,0xff,0xfd,0x38,0x89,0xfe,0xfe, 0x9c,0xd3,0xff,0xff,0xff,0xff,0xfe,0xff,0xa8,0xcc,0xfe,0xff,0x3c,0x86,0xfe, 0xff,0x42,0x8a,0xff,0xff,0x45,0x8c,0xff,0xff,0x46,0x8d,0xff,0xff,0x47,0x8f, 0xfe,0xff,0x47,0x8f,0xff,0xff,0x48,0x8f,0xff,0xff,0x48,0x90,0xff,0xff,0x49, 0x91,0xfe,0xff,0x4b,0x91,0xfe,0xff,0x4a,0x93,0xff,0xff,0x4d,0x95,0xff,0xff, 0x44,0x8f,0xf9,0xc8,0x57,0x82,0xc6,0x1e,0xb1,0xb6,0xc0,0x00,0x52,0x5e,0x7c, 0x27,0x00,0x09,0x32,0xa1,0x07,0x17,0x3d,0xff,0x08,0x18,0x42,0xfe,0x09,0x1c, 0x4d,0xfe,0x0b,0x23,0x5b,0xfd,0x0d,0x27,0x66,0xfd,0x13,0x36,0x8d,0xfe,0x16, 0x44,0xbd,0xff,0x2f,0x69,0xe1,0xff,0x56,0x9f,0xfe,0xff,0x57,0xa2,0xff,0xff, 0x57,0xa1,0xfe,0xff,0x59,0xa2,0xff,0xff,0x59,0xa4,0xff,0xff,0x59,0xa4,0xfe, 0xff,0x5a,0xa5,0xfe,0xff,0x5c,0xa5,0xfe,0xff,0x5d,0xa5,0xfe,0xff,0x58,0xa4, 0xff,0xec,0x64,0xac,0xff,0x35,0xc6,0xff,0xff,0xff,0x00,0x13,0xf5,0xf7,0xf9, 0x00,0xff,0xff,0xfe,0x00,0xbc,0xc8,0xe0,0x00,0x18,0x3b,0x93,0x36,0x0d,0x33, 0x91,0xec,0x17,0x41,0xa9,0xfd,0x1b,0x4d,0xc8,0xfd,0x21,0x5b,0xe9,0xfd,0x27, 0x67,0xfe,0xfd,0x2e,0x73,0xff,0xfd,0x31,0x7f,0xfe,0xfd,0x56,0xa5,0xff,0xfe, 0xe8,0xf9,0xfe,0xff,0xef,0xf6,0xfe,0xff,0x5e,0x9c,0xfe,0xff,0x3b,0x84,0xff, 0xff,0x45,0x8d,0xff,0xff,0x45,0x8d,0xfe,0xff,0x45,0x8d,0xff,0xff,0x82,0x46, 0x8e,0xfe,0xff,0x1e,0x47,0x8f,0xff,0xff,0x48,0x90,0xfe,0xff,0x49,0x90,0xfe, 0xff,0x4a,0x90,0xfe,0xff,0x4b,0x92,0xff,0xff,0x43,0x8e,0xfe,0xcd,0x5a,0x8e, 0xdb,0x1f,0xc9,0xce,0xd4,0x00,0xfe,0xf8,0xed,0x00,0xa7,0xb3,0xcf,0x00,0x06, 0x26,0x75,0x54,0x0d,0x2c,0x7b,0xfc,0x0f,0x2d,0x78,0xfd,0x0e,0x2a,0x70,0xfe, 0x10,0x2e,0x7c,0xfd,0x12,0x34,0x89,0xfd,0x14,0x3a,0x97,0xfd,0x1b,0x4d,0xc9, 0xfe,0x22,0x5f,0xee,0xff,0x48,0x8d,0xfd,0xff,0x57,0xa2,0xff,0xff,0x56,0xa0, 0xfe,0xff,0x58,0xa2,0xfe,0xff,0x58,0xa2,0xff,0xff,0x59,0xa2,0xff,0xff,0x59, 0xa5,0xff,0xff,0x5b,0xa5,0xff,0xff,0x5b,0xa5,0xfe,0xff,0x57,0xa4,0xff,0xf7, 0x5d,0xa7,0xfe,0x46,0xc6,0xff,0xff,0xff,0x00,0x33,0xad,0xbc,0xdc,0x00,0xbb, 0xc9,0xe3,0x00,0x7c,0x93,0xc3,0x01,0x04,0x2c,0x8a,0x80,0x13,0x3a,0x9a,0xfe, 0x18,0x45,0xb4,0xfd,0x1e,0x53,0xd5,0xfd,0x23,0x61,0xf4,0xfd,0x29,0x6c,0xff, 0xfd,0x30,0x79,0xff,0xfd,0x33,0x85,0xfe,0xfd,0x90,0xca,0xff,0xfe,0xff,0xff, 0xff,0xff,0xb2,0xd0,0xfe,0xff,0x3c,0x85,0xfe,0xff,0x42,0x88,0xfe,0xff,0x44, 0x8c,0xff,0xff,0x44,0x8d,0xff,0xff,0x45,0x8d,0xff,0xff,0x45,0x8d,0xfe,0xff, 0x47,0x8f,0xfe,0xff,0x48,0x8e,0xff,0xff,0x47,0x8f,0xff,0xff,0x49,0x90,0xff, 0xff,0x49,0x91,0xfe,0xff,0x43,0x8e,0xff,0xea,0x51,0x91,0xf1,0x37,0xc0,0xcf, 0xe3,0x00,0xea,0xe8,0xe3,0x00,0xcb,0xd1,0xdf,0x00,0xa8,0xbd,0xe4,0x00,0x26, 0x4e,0xae,0x2c,0x0d,0x34,0x9a,0xe4,0x12,0x37,0x95,0xfd,0x12,0x35,0x8d,0xfd, 0x14,0x3a,0x98,0xfd,0x17,0x42,0xab,0xfd,0x19,0x48,0xb8,0xfd,0x1f,0x54,0xd5, 0xfd,0x26,0x67,0xfd,0xfe,0x3b,0x81,0xff,0xff,0x56,0x9f,0xff,0xff,0x55,0xa0, 0xff,0xff,0x56,0x9f,0xff,0xff,0x57,0xa2,0xff,0xff,0x57,0xa1,0xfe,0xff,0x58, 0xa2,0xff,0xff,0x5a,0xa2,0xfe,0xff,0x5a,0xa5,0xff,0xff,0x56,0xa2,0xff,0xfa, 0x59,0xa4,0xfe,0x4d,0xc6,0xff,0xff,0xff,0x00,0x33,0xb9,0xc6,0xe1,0x00,0xb2, 0xc0,0xde,0x00,0x46,0x64,0xaa,0x09,0x07,0x2d,0x8c,0xba,0x16,0x3e,0xa3,0xfd, 0x19,0x4a,0xc0,0xfd,0x20,0x58,0xe2,0xfd,0x25,0x65,0xfc,0xfd,0x2c,0x72,0xff, 0xfd,0x31,0x7c,0xff,0xfd,0x47,0x99,0xfe,0xfd,0xcc,0xea,0xff,0xfe,0xfd,0xfc, 0xff,0xff,0x6c,0xa5,0xff,0xff,0x3b,0x84,0xff,0xff,0x43,0x8a,0xfe,0xff,0x44, 0x8a,0xfe,0xff,0x44,0x8b,0xfe,0xff,0x45,0x8d,0xff,0xff,0x45,0x8c,0xff,0xff, 0x45,0x8d,0xff,0xff,0x47,0x8e,0xff,0xff,0x47,0x8f,0xfe,0xff,0x47,0x90,0xff, 0xff,0x46,0x8f,0xff,0xfd,0x42,0x8d,0xfd,0x7a,0x93,0xba,0xf2,0x00,0xe0,0xe5, 0xe8,0x00,0xe5,0xe5,0xe1,0x00,0x76,0x98,0xda,0x00,0x80,0xa0,0xdd,0x00,0x3c, 0x65,0xc5,0x1e,0x0d,0x3c,0xb2,0xd7,0x16,0x42,0xac,0xfd,0x16,0x40,0xa6,0xfd, 0x18,0x46,0xb2,0xfd,0x1c,0x4e,0xc9,0xfd,0x20,0x56,0xdc,0xfd,0x23,0x5f,0xee, 0xfd,0x30,0x74,0xfe,0xfd,0x3b,0x84,0xff,0xfe,0x52,0x9c,0xfe,0xff,0x55,0x9d, 0xfe,0xff,0x55,0x9e,0xff,0xff,0x56,0x9f,0xfe,0xff,0x55,0xa0,0xff,0xff,0x57, 0xa0,0xfe,0xff,0x58,0xa2,0xff,0xff,0x59,0xa2,0xfe,0xff,0x56,0xa1,0xff,0xfd, 0x57,0xa3,0xfe,0x54,0xc6,0xff,0xff,0xff,0x00,0x14,0xf9,0xfa,0xfc,0x00,0xd2, 0xda,0xeb,0x00,0x1b,0x3f,0x96,0x26,0x0e,0x34,0x92,0xe8,0x17,0x42,0xab,0xfd, 0x1b,0x4f,0xcc,0xfd,0x21,0x5b,0xeb,0xfd,0x27,0x68,0xfd,0xfd,0x30,0x75,0xff, 0xfd,0x31,0x80,0xfe,0xfd,0x70,0xb5,0xff,0xfe,0xf6,0xfe,0xff,0xff,0xcd,0xde, 0xfe,0xff,0x44,0x8a,0xfe,0xff,0x41,0x88,0xff,0xff,0x42,0x8a,0xff,0xff,0x43, 0x8a,0xff,0xff,0x44,0x8a,0xfe,0xff,0x44,0x8b,0xfe,0xff,0x45,0x8d,0xfe,0xff, 0x82,0x45,0x8d,0xff,0xff,0x1d,0x47,0x8e,0xff,0xff,0x47,0x8f,0xfe,0xff,0x40, 0x8c,0xff,0xd2,0x67,0xa3,0xfe,0x11,0xd9,0xe6,0xfb,0x00,0xe1,0xea,0xf9,0x00, 0xa6,0xbb,0xe7,0x00,0x7d,0x9e,0xe2,0x00,0x89,0xa8,0xe5,0x00,0x3f,0x69,0xd1, 0x1d,0x0f,0x43,0xc4,0xd6,0x19,0x49,0xbe,0xfd,0x19,0x47,0xbb,0xfd,0x1c,0x50, 0xcc,0xfd,0x22,0x5a,0xe4,0xfd,0x25,0x62,0xf7,0xfd,0x29,0x6b,0xff,0xfd,0x3a, 0x83,0xfe,0xfd,0x47,0x94,0xfe,0xfd,0x51,0x9a,0xff,0xfe,0x53,0x9c,0xff,0xff, 0x54,0x9d,0xfe,0xff,0x55,0x9d,0xff,0xff,0x55,0x9e,0xfe,0xff,0x55,0xa0,0xff, 0xff,0x57,0xa0,0xff,0xff,0x57,0xa1,0xff,0xff,0x54,0x9f,0xfe,0xfb,0x56,0xa2, 0xfe,0x50,0x98,0xff,0xff,0xff,0x00,0x14,0xf2,0xf4,0xf6,0x00,0xf4,0xf6,0xf8, 0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa,0xbf,0x00,0xc0,0xc6, 0xd2,0x00,0xe1,0xe3,0xe7,0x00,0xa0,0xaa,0xb9,0x00,0x95,0x9d,0xb0,0x00,0xbf, 0xc3,0xcd,0x00,0x81,0x8a,0x9e,0x00,0xb7,0xbc,0xc5,0x00,0x91,0x98,0xa7,0x00, 0x87,0x8f,0x9e,0x00,0xa4,0xaa,0xb4,0x00,0x80,0x8c,0xa4,0x00,0xc1,0xc6,0xd1, 0x00,0xa9,0xba,0xd6,0x00,0xe0,0xe7,0xf2,0x00,0xfa,0xfb,0xfd,0x00,0x8c,0xf6, 0xf8,0xfb,0x00,0x4e,0xf5,0xf7,0xfa,0x00,0xff,0xfe,0xfd,0x00,0xb6,0xc2,0xd6, 0x00,0xb4,0xbe,0xcf,0x00,0xab,0xb4,0xc8,0x00,0xd2,0xd7,0xdd,0x00,0xaf,0xb6, 0xc4,0x00,0x93,0x9d,0xae,0x00,0x9f,0xa9,0xb9,0x00,0xb9,0xc0,0xcb,0x00,0xaf, 0xbc,0xd8,0x00,0xa8,0xb8,0xd9,0x00,0xa7,0xb6,0xd9,0x00,0xa8,0xb6,0xd9,0x00, 0xae,0xbb,0xdc,0x00,0x91,0xa3,0xcd,0x00,0x0b,0x30,0x8c,0x5d,0x13,0x39,0x98, 0xfe,0x18,0x44,0xb2,0xfd,0x1d,0x52,0xd3,0xfd,0x22,0x5e,0xf0,0xfd,0x29,0x6b, 0xff,0xfd,0x30,0x77,0xff,0xfd,0x37,0x89,0xff,0xfd,0x9b,0xcf,0xff,0xfe,0xff, 0xff,0xff,0xff,0x8f,0xbb,0xfe,0xff,0x38,0x83,0xff,0xff,0x41,0x88,0xff,0xff, 0x42,0x88,0xff,0xff,0x42,0x8a,0xff,0xff,0x43,0x89,0xff,0xff,0x44,0x8b,0xff, 0xff,0x44,0x8d,0xff,0xff,0x45,0x8c,0xfe,0xff,0x45,0x8d,0xfe,0xff,0x45,0x8e, 0xfe,0xff,0x46,0x8e,0xfe,0xff,0x41,0x8b,0xff,0x79,0x9b,0xc4,0xfe,0x00,0xe3, 0xed,0xff,0x00,0xe0,0xeb,0xff,0x00,0xe4,0xea,0xfa,0x00,0xf2,0xf5,0xfb,0x00, 0xc0,0xd1,0xf3,0x00,0x2b,0x5f,0xd9,0x29,0x13,0x48,0xd3,0xe1,0x1b,0x4f,0xd0, 0xfd,0x1c,0x50,0xcd,0xfd,0x21,0x59,0xe1,0xfd,0x26,0x64,0xfa,0xfd,0x2a,0x6c, 0xff,0xfd,0x30,0x76,0xff,0xfd,0x4a,0x9a,0xff,0xfe,0x5b,0xaf,0xff,0xfd,0x53, 0x9f,0xfe,0xfe,0x51,0x9a,0xfe,0xff,0x52,0x9c,0xfe,0xff,0x54,0x9c,0xfe,0xff, 0x53,0x9d,0xfe,0xff,0x54,0x9e,0xfe,0xff,0x55,0x9e,0xfe,0xff,0x56,0xa0,0xff, 0xff,0x52,0x9d,0xfe,0xf5,0x56,0xa1,0xfe,0x42,0xd2,0xe8,0xfe,0x00,0xff,0xff, 0xfe,0x00,0xf6,0xfb,0xfe,0x00,0xe7,0xf0,0xff,0x00,0xe5,0xee,0xfc,0x00,0xdf, 0xe5,0xf2,0x06,0x9a,0xa9,0xc7,0x21,0x64,0x7a,0xa9,0x33,0x79,0x92,0xc5,0x2e, 0xb0,0xc4,0xeb,0x1e,0xce,0xdf,0xfa,0x0d,0xd0,0xe3,0xff,0x00,0xde,0xeb,0xff, 0x00,0x88,0xdc,0xea,0xff,0x00,0x83,0xff,0xff,0xff,0x00,0x14,0xf2,0xf4,0xf6, 0x00,0xf4,0xf6,0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa, 0xbf,0x00,0xc0,0xc6,0xd2,0x00,0xe1,0xe3,0xe7,0x00,0xa0,0xaa,0xb9,0x00,0x95, 0x9d,0xb0,0x00,0xbf,0xc3,0xcd,0x00,0x81,0x8a,0x9e,0x00,0xb7,0xbc,0xc5,0x00, 0x91,0x98,0xa7,0x00,0x87,0x8f,0x9e,0x00,0xa4,0xaa,0xb4,0x00,0x80,0x8c,0xa4, 0x00,0xc1,0xc6,0xd1,0x00,0xa9,0xba,0xd6,0x00,0xe0,0xe7,0xf2,0x00,0xfa,0xfb, 0xfd,0x00,0x8c,0xf6,0xf8,0xfb,0x00,0x23,0xf5,0xf7,0xfa,0x00,0xff,0xfe,0xfd, 0x00,0xb6,0xc2,0xd6,0x00,0xb4,0xbe,0xcf,0x00,0xab,0xb4,0xc8,0x00,0xd2,0xd7, 0xdd,0x00,0xaf,0xb6,0xc4,0x00,0x93,0x9d,0xae,0x00,0x9f,0xa9,0xb9,0x00,0xbb, 0xc2,0xcc,0x00,0x84,0x9e,0xcc,0x00,0x84,0x9b,0xcb,0x00,0x90,0xa4,0xce,0x00, 0x90,0xa3,0xce,0x00,0x93,0xa7,0xd0,0x00,0x63,0x7e,0xb8,0x00,0x09,0x2d,0x89, 0x8e,0x14,0x3b,0x9d,0xfd,0x18,0x46,0xb8,0xfd,0x1e,0x54,0xd9,0xfd,0x24,0x62, 0xf5,0xfd,0x2b,0x6f,0xfe,0xfd,0x30,0x7b,0xfe,0xfd,0x43,0x95,0xff,0xfe,0xc3, 0xe6,0xfe,0xff,0xfb,0xfc,0xff,0xff,0x67,0xa1,0xff,0xff,0x39,0x83,0xff,0xff, 0x40,0x88,0xff,0xff,0x42,0x88,0xff,0xff,0x42,0x89,0xfe,0xff,0x42,0x8a,0xfe, 0xff,0x43,0x8a,0xfe,0xff,0x44,0x8b,0xfe,0xff,0x44,0x8c,0xfe,0xff,0x82,0x45, 0x8d,0xff,0xff,0x02,0x42,0x8d,0xff,0xef,0x4f,0x93,0xfc,0x28,0x82,0xd1,0xe4, 0xfd,0x00,0x25,0xe8,0xef,0xfd,0x00,0xf9,0xf9,0xfd,0x00,0xff,0xff,0xff,0x00, 0xb7,0xc9,0xf3,0x00,0x1a,0x54,0xdf,0x44,0x18,0x50,0xde,0xf6,0x1d,0x54,0xdc, 0xfd,0x1f,0x57,0xdf,0xfd,0x24,0x62,0xf5,0xfd,0x2a,0x6d,0xff,0xfd,0x31,0x77, 0xfe,0xfd,0x39,0x85,0xfe,0xfd,0x6a,0xc2,0xff,0xfe,0x80,0xdc,0xfe,0xfe,0x58, 0xa5,0xfe,0xff,0x4e,0x98,0xfe,0xff,0x51,0x9b,0xff,0xff,0x52,0x9b,0xff,0xff, 0x52,0x9c,0xfe,0xff,0x53,0x9c,0xff,0xff,0x54,0x9d,0xfe,0xff,0x54,0x9e,0xfe, 0xff,0x50,0x9b,0xff,0xeb,0x5e,0xa3,0xfe,0x30,0xc2,0xdf,0xfe,0x01,0xe1,0xef, 0xfe,0x00,0xe7,0xf0,0xff,0x00,0xee,0xf5,0xff,0x00,0xd7,0xe3,0xfa,0x0d,0x6e, 0x8b,0xcf,0x3e,0x43,0x67,0xbc,0x54,0x62,0x90,0xe0,0x54,0x89,0xbd,0xf9,0x54, 0x87,0xbb,0xfa,0x53,0x89,0xb6,0xfe,0x4a,0xc9,0xe0,0xff,0x1a,0xe0,0xec,0xff, 0x00,0x88,0xdb,0xe9,0xff,0x00,0x83,0xff,0xff,0xff,0x00,0x14,0xf2,0xf4,0xf6, 0x00,0xf4,0xf6,0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa, 0xbf,0x00,0xc0,0xc6,0xd2,0x00,0xe1,0xe3,0xe7,0x00,0xa0,0xaa,0xb9,0x00,0x95, 0x9d,0xb0,0x00,0xbf,0xc3,0xcd,0x00,0x81,0x8a,0x9e,0x00,0xb7,0xbc,0xc5,0x00, 0x91,0x98,0xa7,0x00,0x87,0x8f,0x9e,0x00,0xa4,0xaa,0xb4,0x00,0x80,0x8c,0xa4, 0x00,0xc1,0xc6,0xd1,0x00,0xa9,0xba,0xd6,0x00,0xe0,0xe7,0xf2,0x00,0xfa,0xfb, 0xfd,0x00,0x8c,0xf6,0xf8,0xfb,0x00,0x4f,0xf5,0xf7,0xfa,0x00,0xff,0xfe,0xfd, 0x00,0xb6,0xc2,0xd6,0x00,0xb4,0xbe,0xcf,0x00,0xab,0xb4,0xc8,0x00,0xd2,0xd7, 0xdd,0x00,0xaf,0xb6,0xc4,0x00,0x93,0x9d,0xae,0x00,0x9f,0xa9,0xb9,0x00,0xbb, 0xc2,0xcb,0x00,0x86,0x9f,0xcd,0x00,0xa5,0xb6,0xda,0x00,0xcc,0xd4,0xe7,0x00, 0xcb,0xd3,0xe6,0x00,0xc9,0xd1,0xe5,0x00,0x48,0x66,0xaa,0x02,0x0a,0x2d,0x89, 0xb1,0x15,0x3d,0xa0,0xfd,0x19,0x49,0xbd,0xfd,0x1f,0x56,0xde,0xfd,0x24,0x63, 0xf9,0xfd,0x2b,0x71,0xff,0xfd,0x31,0x7c,0xfe,0xfd,0x58,0xa4,0xfe,0xfe,0xe9, 0xfa,0xff,0xff,0xd3,0xe4,0xfe,0xff,0x49,0x8d,0xff,0xff,0x3c,0x84,0xfe,0xff, 0x3f,0x87,0xfe,0xff,0x40,0x89,0xfe,0xff,0x42,0x88,0xff,0xff,0x41,0x8a,0xff, 0xff,0x42,0x89,0xfe,0xff,0x43,0x89,0xff,0xff,0x43,0x8b,0xff,0xff,0x45,0x8d, 0xfe,0xff,0x45,0x8d,0xff,0xff,0x3e,0x89,0xff,0xb3,0x75,0xac,0xfc,0x03,0xf0, 0xf6,0xf8,0x00,0xf7,0xfa,0xf9,0x00,0xd0,0xde,0xf7,0x00,0xb6,0xcb,0xf5,0x00, 0xcc,0xdb,0xf8,0x00,0x89,0xa8,0xf0,0x00,0x10,0x4d,0xe2,0x7b,0x1c,0x55,0xe3, 0xfe,0x1e,0x58,0xe3,0xfd,0x23,0x5e,0xf0,0xfd,0x29,0x6a,0xff,0xfd,0x31,0x78, 0xff,0xfd,0x39,0x85,0xff,0xfd,0x4e,0xa0,0xff,0xfd,0xb3,0xed,0xfe,0xfe,0xc5, 0xfc,0xff,0xff,0x5c,0xa5,0xff,0xff,0x4c,0x96,0xfe,0xff,0x50,0x9b,0xff,0xff, 0x51,0x9a,0xfe,0xff,0x52,0x9a,0xff,0xff,0x51,0x9c,0xfe,0xff,0x53,0x9c,0xff, 0xff,0x53,0x9c,0xfe,0xff,0x4c,0x98,0xfe,0xd6,0x72,0xaf,0xff,0x13,0xa6,0xcf, 0xfe,0x05,0x9d,0xc9,0xfe,0x00,0xdd,0xeb,0xff,0x00,0xdb,0xea,0xff,0x06,0x7b, 0x9e,0xee,0x3c,0x46,0x75,0xe1,0x57,0x73,0xa6,0xf9,0x51,0x9a,0xd0,0xff,0x50, 0xaa,0xdf,0xff,0x50,0xa5,0xda,0xff,0x50,0x81,0xb6,0xff,0x56,0x9c,0xc7,0xff, 0x43,0xe0,0xef,0xff,0x08,0xe3,0xf1,0xff,0x00,0x87,0xe2,0xf0,0xff,0x00,0x83, 0xff,0xff,0xff,0x00,0x14,0xf2,0xf4,0xf6,0x00,0xf4,0xf6,0xf8,0x00,0xd1,0xd8, 0xe1,0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa,0xbf,0x00,0xc0,0xc6,0xd2,0x00,0xe1, 0xe3,0xe7,0x00,0xa0,0xaa,0xb9,0x00,0x95,0x9d,0xb0,0x00,0xbf,0xc3,0xcd,0x00, 0x81,0x8a,0x9e,0x00,0xb7,0xbc,0xc5,0x00,0x91,0x98,0xa7,0x00,0x87,0x8f,0x9e, 0x00,0xa4,0xaa,0xb4,0x00,0x80,0x8c,0xa4,0x00,0xc1,0xc6,0xd1,0x00,0xa9,0xba, 0xd6,0x00,0xe0,0xe7,0xf2,0x00,0xfa,0xfb,0xfd,0x00,0x8c,0xf6,0xf8,0xfb,0x00, 0x20,0xf5,0xf7,0xfa,0x00,0xff,0xfe,0xfd,0x00,0xb6,0xc2,0xd6,0x00,0xb4,0xbe, 0xcf,0x00,0xab,0xb4,0xc8,0x00,0xd2,0xd7,0xdd,0x00,0xaf,0xb6,0xc4,0x00,0x93, 0x9d,0xae,0x00,0x9f,0xa9,0xb9,0x00,0xbb,0xc2,0xcb,0x00,0x85,0x9e,0xcd,0x00, 0xa4,0xb6,0xda,0x00,0xce,0xd7,0xe9,0x00,0xc7,0xd2,0xe6,0x00,0xc3,0xce,0xe4, 0x00,0x2e,0x4f,0x9a,0x0e,0x0d,0x2f,0x8b,0xd4,0x15,0x3e,0xa1,0xfd,0x19,0x4b, 0xbf,0xfd,0x20,0x58,0xe1,0xfd,0x26,0x65,0xfb,0xfd,0x2d,0x72,0xff,0xfd,0x31, 0x7e,0xff,0xfd,0x71,0xb5,0xfe,0xfe,0xff,0xff,0xfe,0xff,0xac,0xcb,0xfe,0xff, 0x39,0x82,0xfe,0xff,0x3d,0x85,0xff,0xff,0x40,0x86,0xff,0xff,0x40,0x88,0xff, 0xff,0x40,0x87,0xfe,0xff,0x41,0x89,0xfe,0xff,0x82,0x42,0x8a,0xff,0xff,0x17, 0x42,0x8a,0xfe,0xff,0x43,0x8b,0xff,0xff,0x43,0x8c,0xfe,0xff,0x3d,0x87,0xff, 0x72,0x9e,0xc5,0xfd,0x00,0xc9,0xe0,0xfb,0x00,0xc4,0xdd,0xfc,0x00,0xd3,0xe3, 0xfa,0x00,0xde,0xe8,0xf9,0x00,0xb4,0xc9,0xf3,0x00,0x47,0x77,0xe6,0x0b,0x12, 0x4d,0xe2,0xc3,0x1e,0x57,0xe4,0xfd,0x20,0x5a,0xe8,0xfd,0x25,0x63,0xf9,0xfd, 0x2c,0x70,0xff,0xfd,0x36,0x81,0xfe,0xfd,0x41,0x94,0xfe,0xfd,0x6f,0xc0,0xfe, 0xfe,0xec,0xfc,0xff,0xff,0xde,0xea,0xfe,0xff,0x56,0x9b,0xfe,0xff,0x4c,0x95, 0xff,0xff,0x82,0x4f,0x99,0xff,0xff,0x14,0x50,0x9a,0xfe,0xff,0x51,0x9a,0xff, 0xff,0x51,0x9a,0xfe,0xff,0x51,0x9b,0xff,0xff,0x48,0x96,0xff,0xba,0x82,0xb8, 0xfe,0x04,0xd1,0xe7,0xfe,0x02,0xcc,0xe2,0xff,0x00,0xda,0xea,0xff,0x00,0xa9, 0xc7,0xfe,0x22,0x4f,0x84,0xf4,0x54,0x7f,0xb5,0xfd,0x51,0x8f,0xc3,0xff,0x50, 0x86,0xb9,0xff,0x52,0x67,0x90,0xd6,0x54,0x68,0x8c,0xcc,0x50,0x80,0xb1,0xfe, 0x52,0x8b,0xbf,0xff,0x4f,0xd5,0xeb,0xfe,0x15,0xee,0xf9,0xfe,0x00,0x87,0xe9, 0xf6,0xfe,0x00,0x83,0xff,0xff,0xff,0x00,0x14,0xf2,0xf4,0xf6,0x00,0xf4,0xf6, 0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa,0xbf,0x00,0xc0, 0xc6,0xd2,0x00,0xe1,0xe3,0xe7,0x00,0xa0,0xaa,0xb9,0x00,0x95,0x9d,0xb0,0x00, 0xbf,0xc3,0xcd,0x00,0x81,0x8a,0x9e,0x00,0xb7,0xbc,0xc5,0x00,0x91,0x98,0xa7, 0x00,0x87,0x8f,0x9e,0x00,0xa4,0xaa,0xb4,0x00,0x80,0x8c,0xa4,0x00,0xc1,0xc6, 0xd1,0x00,0xa9,0xba,0xd6,0x00,0xe0,0xe7,0xf2,0x00,0xfa,0xfb,0xfd,0x00,0x8c, 0xf6,0xf8,0xfb,0x00,0x1d,0xf5,0xf7,0xfa,0x00,0xff,0xfe,0xfd,0x00,0xb6,0xc2, 0xd6,0x00,0xb3,0xbe,0xcf,0x00,0xae,0xb6,0xca,0x00,0xda,0xde,0xe2,0x00,0xb6, 0xbc,0xc8,0x00,0x98,0xa1,0xaf,0x01,0xa4,0xac,0xba,0x00,0xc1,0xc7,0xcc,0x00, 0x86,0x9f,0xcd,0x00,0xa5,0xb6,0xda,0x00,0xd2,0xdb,0xea,0x00,0xc5,0xd3,0xe5, 0x00,0xc4,0xd1,0xe4,0x00,0x1e,0x3e,0x8f,0x25,0x0f,0x32,0x8c,0xec,0x16,0x3e, 0xa3,0xfd,0x1b,0x4b,0xc3,0xfd,0x20,0x59,0xe4,0xfd,0x26,0x66,0xfc,0xfd,0x2e, 0x73,0xff,0xfd,0x32,0x80,0xff,0xfd,0x8b,0xc5,0xff,0xfe,0xff,0xff,0xfe,0xff, 0x90,0xb9,0xff,0xff,0x34,0x7f,0xfe,0xff,0x3e,0x85,0xfe,0xff,0x3f,0x86,0xff, 0xff,0x82,0x40,0x87,0xfe,0xff,0x02,0x40,0x89,0xfe,0xff,0x41,0x89,0xfe,0xff, 0x83,0x42,0x8a,0xff,0xff,0x2b,0x3f,0x88,0xff,0xf6,0x45,0x8d,0xfd,0x3c,0xc8, 0xdc,0xf9,0x00,0xdf,0xeb,0xf8,0x00,0xe2,0xed,0xfb,0x00,0xfc,0xfe,0xff,0x00, 0xff,0xff,0xff,0x00,0xa8,0xc0,0xf1,0x00,0x16,0x4f,0xda,0x50,0x1a,0x51,0xdd, 0xfd,0x1e,0x56,0xe0,0xfd,0x21,0x5b,0xeb,0xfd,0x27,0x68,0xfd,0xfd,0x2f,0x75, 0xfe,0xfd,0x3a,0x87,0xfe,0xfd,0x48,0xa1,0xfe,0xfd,0x96,0xd9,0xff,0xfe,0xff, 0xff,0xfe,0xff,0xb8,0xd4,0xfe,0xff,0x49,0x94,0xff,0xff,0x4d,0x95,0xff,0xff, 0x4e,0x96,0xfe,0xff,0x4e,0x97,0xff,0xff,0x4f,0x97,0xfe,0xff,0x4f,0x99,0xff, 0xff,0x50,0x9b,0xff,0xff,0x4f,0x99,0xff,0xff,0x49,0x96,0xff,0x8c,0x98,0xc5, 0xfe,0x00,0xe5,0xf2,0xfe,0x00,0xd5,0xe6,0xff,0x00,0xcc,0xe1,0xff,0x05,0x79, 0xa5,0xff,0x3e,0x73,0xa7,0xfe,0x55,0xc3,0xea,0xff,0x50,0x89,0xbb,0xff,0x50, 0x97,0xc4,0xff,0x3e,0x5f,0x84,0xd7,0x46,0x50,0x78,0xd1,0x52,0x7c,0xae,0xfe, 0x52,0x88,0xbf,0xff,0x50,0xcf,0xe9,0xff,0x18,0xea,0xf7,0xff,0x00,0x82,0xe5, 0xf5,0xff,0x00,0x02,0xe6,0xf6,0xff,0x00,0xea,0xf8,0xff,0x00,0x82,0xe8,0xf6, 0xff,0x00,0x01,0xe5,0xf5,0xff,0x00,0x83,0xff,0xff,0xff,0x00,0x14,0xf2,0xf4, 0xf6,0x00,0xf4,0xf6,0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00,0xa0, 0xaa,0xbf,0x00,0xc0,0xc6,0xd2,0x00,0xe1,0xe3,0xe7,0x00,0xa0,0xaa,0xb9,0x00, 0x95,0x9d,0xb0,0x00,0xbf,0xc3,0xcd,0x00,0x81,0x8a,0x9e,0x00,0xb7,0xbc,0xc5, 0x00,0x91,0x98,0xa7,0x00,0x87,0x8f,0x9e,0x00,0xa4,0xaa,0xb4,0x00,0x80,0x8c, 0xa4,0x00,0xc1,0xc6,0xd1,0x00,0xa9,0xba,0xd6,0x00,0xe0,0xe7,0xf2,0x00,0xfa, 0xfb,0xfd,0x00,0x8c,0xf6,0xf8,0xfb,0x00,0x56,0xf5,0xf7,0xfa,0x00,0xff,0xfe, 0xfd,0x00,0xb6,0xc2,0xd6,0x00,0xc0,0xc8,0xd6,0x00,0xa4,0xad,0xc2,0x0a,0xac, 0xb3,0xc1,0x1b,0x8b,0x96,0xaa,0x29,0x78,0x84,0x9f,0x30,0x82,0x91,0xae,0x2e, 0x9c,0xa9,0xc1,0x20,0x82,0x9b,0xc9,0x0e,0xb2,0xc0,0xdc,0x04,0xc1,0xcc,0xe5, 0x00,0xab,0xbc,0xdc,0x00,0xab,0xba,0xd3,0x00,0x15,0x34,0x7f,0x3a,0x0f,0x31, 0x85,0xf8,0x15,0x3c,0xa1,0xfd,0x1b,0x4c,0xc4,0xfd,0x20,0x5a,0xe7,0xfd,0x27, 0x67,0xfd,0xfd,0x2f,0x73,0xff,0xfd,0x35,0x84,0xff,0xfe,0xa4,0xd5,0xff,0xff, 0xff,0xfd,0xfe,0xff,0x73,0xa7,0xff,0xff,0x33,0x7f,0xff,0xff,0x3e,0x85,0xfe, 0xff,0x3f,0x85,0xff,0xff,0x40,0x86,0xff,0xff,0x40,0x89,0xfe,0xff,0x3f,0x88, 0xfe,0xff,0x40,0x89,0xfe,0xff,0x41,0x89,0xfe,0xff,0x42,0x89,0xfe,0xff,0x43, 0x8a,0xff,0xff,0x3b,0x87,0xff,0xd6,0x5a,0x9a,0xfd,0x16,0xdb,0xe9,0xfb,0x00, 0xef,0xf5,0xfb,0x00,0xef,0xf4,0xfc,0x00,0xf2,0xf6,0xfc,0x00,0xe3,0xec,0xfa, 0x00,0x40,0x6f,0xda,0x0e,0x13,0x47,0xd0,0xc7,0x1c,0x51,0xd4,0xfd,0x1d,0x53, 0xd9,0xfd,0x21,0x5d,0xef,0xfd,0x28,0x6b,0xff,0xfd,0x30,0x7a,0xff,0xfd,0x3a, 0x8a,0xfe,0xfd,0x50,0xa7,0xfe,0xfd,0xc0,0xe8,0xff,0xfe,0xff,0xff,0xfe,0xff, 0x86,0xba,0xff,0xff,0x44,0x90,0xff,0xff,0x4c,0x96,0xfe,0xff,0x4d,0x96,0xfe, 0xff,0x4d,0x97,0xff,0xff,0x4e,0x96,0xfe,0xff,0x4e,0x98,0xfe,0xff,0x4f,0x98, 0xfe,0xff,0x4c,0x95,0xff,0xf8,0x4f,0x99,0xff,0x47,0xc0,0xdd,0xff,0x05,0xff, 0xff,0xfe,0x00,0xcf,0xe1,0xfe,0x00,0xb2,0xcc,0xfd,0x0e,0x51,0x86,0xf5,0x4f, 0x8e,0xb9,0xfd,0x58,0xb3,0xd9,0xff,0x56,0x82,0xb6,0xff,0x50,0xa6,0xcd,0xff, 0x30,0x62,0x90,0xfa,0x46,0x8c,0xbe,0xff,0x52,0x9b,0xcf,0xff,0x53,0x86,0xba, 0xfe,0x4d,0xdd,0xef,0xfe,0x12,0xf7,0xfb,0xfe,0x00,0xf2,0xf9,0xfe,0x00,0xf4, 0xfc,0xff,0x00,0xed,0xf4,0xfb,0x00,0xd7,0xe3,0xf2,0x00,0xe3,0xed,0xf8,0x00, 0xe4,0xed,0xf8,0x00,0xf1,0xf8,0xfd,0x00,0x83,0xff,0xff,0xff,0x00,0x14,0xf2, 0xf4,0xf6,0x00,0xf4,0xf6,0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00, 0xa0,0xaa,0xbf,0x00,0xc0,0xc6,0xd2,0x00,0xe1,0xe3,0xe7,0x00,0xa0,0xaa,0xb9, 0x00,0x95,0x9d,0xb0,0x00,0xbf,0xc3,0xcd,0x00,0x81,0x8a,0x9e,0x00,0xb7,0xbc, 0xc5,0x00,0x91,0x98,0xa7,0x00,0x87,0x8f,0x9e,0x00,0xa4,0xaa,0xb4,0x00,0x80, 0x8c,0xa4,0x00,0xc1,0xc6,0xd1,0x00,0xa9,0xba,0xd6,0x00,0xe0,0xe7,0xf2,0x00, 0xfa,0xfb,0xfd,0x00,0x8c,0xf6,0xf8,0xfb,0x00,0x1f,0xf4,0xf6,0xfa,0x00,0xff, 0xff,0xff,0x00,0xbc,0xc7,0xd9,0x09,0x86,0x95,0xb4,0x2a,0x52,0x66,0x94,0x46, 0x35,0x52,0x8f,0x52,0x39,0x5a,0xa7,0x55,0x43,0x6b,0xc3,0x55,0x4a,0x75,0xd3, 0x55,0x52,0x7d,0xdc,0x53,0x65,0x8d,0xde,0x4a,0x7d,0x9b,0xd8,0x3c,0x92,0xa9, 0xd7,0x22,0xdf,0xe4,0xf1,0x02,0xa9,0xb4,0xc8,0x00,0x0c,0x25,0x63,0x41,0x0c, 0x28,0x6e,0xfd,0x12,0x34,0x8a,0xfd,0x18,0x44,0xb4,0xfd,0x1f,0x55,0xdd,0xfd, 0x26,0x66,0xfb,0xfd,0x2e,0x73,0xff,0xfd,0x3a,0x88,0xff,0xfe,0xb2,0xe8,0xfe, 0xff,0xd8,0xf8,0xff,0xff,0x53,0x98,0xff,0xff,0x36,0x7e,0xff,0xff,0x3e,0x86, 0xff,0xff,0x3f,0x85,0xff,0xff,0x3e,0x87,0xfe,0xff,0x3f,0x88,0xff,0xff,0x83, 0x40,0x88,0xff,0xff,0x34,0x41,0x88,0xff,0xff,0x42,0x88,0xfe,0xff,0x37,0x83, 0xfe,0xae,0x7a,0xaf,0xfe,0x07,0xcb,0xe1,0xfd,0x00,0xd1,0xe4,0xfc,0x00,0xee, 0xf0,0xfb,0x00,0xe2,0xea,0xfa,0x00,0x6a,0x91,0xe1,0x01,0x10,0x45,0xca,0x8f, 0x19,0x4d,0xcc,0xff,0x1b,0x4f,0xcc,0xfe,0x1e,0x55,0xdb,0xfe,0x23,0x61,0xf6, 0xfe,0x29,0x6d,0xff,0xfd,0x31,0x7a,0xff,0xfd,0x39,0x87,0xff,0xfd,0x5a,0xb0, 0xff,0xfe,0xd4,0xfc,0xff,0xff,0xdb,0xee,0xff,0xff,0x59,0x9d,0xfe,0xff,0x46, 0x91,0xfe,0xff,0x4b,0x94,0xfe,0xff,0x4b,0x96,0xff,0xff,0x4c,0x96,0xfe,0xff, 0x4e,0x95,0xff,0xff,0x4d,0x97,0xff,0xff,0x4e,0x97,0xff,0xff,0x48,0x93,0xfe, 0xdb,0x65,0xa6,0xfe,0x0f,0xde,0xec,0xfd,0x04,0xf3,0xf8,0xfc,0x00,0xd9,0xe5, 0xfb,0x00,0xc9,0xda,0xf9,0x08,0x8e,0xa9,0xe0,0x2f,0x7d,0xa1,0xe0,0x3f,0x8a, 0xad,0xea,0x3f,0x92,0xb5,0xf1,0x39,0x6e,0x99,0xed,0x43,0x52,0x81,0xeb,0x51, 0x83,0xb6,0xfe,0x50,0x82,0xb8,0xfe,0x55,0xa0,0xca,0xfe,0x3c,0xec,0xf8,0xfe, 0x04,0xee,0xf8,0xfe,0x00,0xf6,0xff,0xfe,0x00,0xeb,0xf6,0xfa,0x00,0xd1,0xd6, 0xe3,0x00,0x90,0xa4,0xd1,0x00,0xbb,0xcb,0xe5,0x00,0xbd,0xcc,0xe6,0x00,0xf0, 0xf4,0xf9,0x00,0x83,0xff,0xff,0xff,0x00,0x14,0xf2,0xf4,0xf6,0x00,0xf4,0xf6, 0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa,0xbf,0x00,0xc0, 0xc6,0xd2,0x00,0xe1,0xe3,0xe7,0x00,0xa0,0xaa,0xb9,0x00,0x95,0x9d,0xb0,0x00, 0xbf,0xc3,0xcd,0x00,0x81,0x8a,0x9e,0x00,0xb7,0xbc,0xc5,0x00,0x91,0x98,0xa7, 0x00,0x87,0x8f,0x9e,0x00,0xa4,0xaa,0xb4,0x00,0x80,0x8c,0xa4,0x00,0xc1,0xc6, 0xd1,0x00,0xa9,0xba,0xd6,0x00,0xe1,0xe8,0xf2,0x00,0xfa,0xfb,0xfd,0x00,0x8c, 0xf6,0xf8,0xfb,0x00,0x1e,0xff,0xff,0xff,0x00,0xcc,0xd4,0xe2,0x12,0x5f,0x76, 0xa6,0x41,0x32,0x50,0x96,0x56,0x41,0x69,0xbc,0x54,0x57,0x86,0xe9,0x52,0x62, 0x92,0xfd,0x50,0x68,0x9a,0xff,0x50,0x6a,0x9b,0xff,0x50,0x69,0x9b,0xff,0x51, 0x63,0x96,0xff,0x53,0x54,0x85,0xef,0x56,0x50,0x7b,0xd8,0x55,0x93,0xac,0xe1, 0x2c,0x7f,0x8c,0xa3,0x06,0x02,0x13,0x3a,0x6c,0x06,0x1b,0x4d,0xf4,0x0c,0x26, 0x66,0xfe,0x12,0x37,0x90,0xfe,0x1a,0x49,0xbb,0xfe,0x20,0x59,0xe4,0xfd,0x28, 0x69,0xfc,0xfe,0x3b,0x86,0xff,0xff,0x83,0xd7,0xfe,0xff,0x77,0xcb,0xfe,0xfe, 0x3f,0x8a,0xfe,0xff,0x3b,0x82,0xfe,0xff,0x3e,0x86,0xff,0xff,0x3e,0x88,0xff, 0xff,0x3e,0x86,0xff,0xff,0x82,0x40,0x88,0xff,0xff,0x19,0x40,0x89,0xff,0xff, 0x41,0x8a,0xff,0xff,0x42,0x8a,0xff,0xff,0x41,0x8a,0xff,0xff,0x39,0x86,0xff, 0x8d,0x90,0xbd,0xff,0x00,0xbf,0xdb,0xff,0x00,0xd9,0xe5,0xfc,0x00,0xf9,0xf9, 0xfe,0x00,0xa6,0xbd,0xec,0x00,0x18,0x4c,0xcb,0x55,0x15,0x48,0xcb,0xf8,0x1a, 0x4b,0xca,0xff,0x1c,0x50,0xd1,0xff,0x20,0x5b,0xea,0xff,0x26,0x67,0xfd,0xff, 0x2c,0x71,0xfe,0xfe,0x32,0x7c,0xfe,0xfe,0x3b,0x89,0xfe,0xfe,0x6b,0xc5,0xfe, 0xff,0xa7,0xfd,0xfe,0xff,0x7a,0xc2,0xfe,0xff,0x44,0x8d,0xff,0xff,0x49,0x94, 0xff,0xff,0x4a,0x94,0xff,0xff,0x82,0x4b,0x94,0xfe,0xff,0x1b,0x4b,0x96,0xfe, 0xff,0x4c,0x94,0xfe,0xff,0x4d,0x96,0xfe,0xff,0x44,0x92,0xff,0x99,0x8f,0xbf, 0xff,0x00,0xf9,0xfb,0xfd,0x00,0xf5,0xf8,0xfd,0x00,0xf6,0xf9,0xfc,0x00,0xf5, 0xf9,0xfb,0x00,0xce,0xd9,0xe5,0x00,0x87,0x9e,0xce,0x06,0xbc,0xcc,0xec,0x05, 0xa5,0xbd,0xf0,0x25,0x47,0x76,0xde,0x53,0x66,0x97,0xf6,0x51,0x76,0xaa,0xff, 0x52,0x7c,0xb1,0xff,0x51,0xcb,0xe4,0xff,0x1c,0xef,0xfb,0xff,0x00,0xe4,0xf4, 0xfd,0x00,0x97,0xa4,0xb7,0x00,0xb3,0xbe,0xcb,0x00,0xce,0xd3,0xe0,0x00,0x98, 0xac,0xd6,0x00,0xbf,0xce,0xe7,0x00,0xc1,0xcf,0xe8,0x00,0xf0,0xf4,0xf9,0x00, 0x83,0xff,0xff,0xff,0x00,0x14,0xf2,0xf4,0xf6,0x00,0xf4,0xf6,0xf8,0x00,0xd1, 0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa,0xbf,0x00,0xc0,0xc6,0xd2,0x00, 0xe1,0xe3,0xe7,0x00,0xa0,0xaa,0xb9,0x00,0x95,0x9d,0xb0,0x00,0xbf,0xc3,0xcd, 0x00,0x81,0x8a,0x9e,0x00,0xb7,0xbc,0xc5,0x00,0x91,0x98,0xa7,0x00,0x87,0x8f, 0x9e,0x00,0xa4,0xaa,0xb4,0x00,0x80,0x8c,0xa4,0x00,0xc1,0xc6,0xd1,0x00,0xa9, 0xba,0xd6,0x00,0xdd,0xe4,0xf0,0x00,0xf8,0xf9,0xfc,0x00,0x8b,0xf4,0xf6,0xfa, 0x00,0x0a,0xfc,0xfd,0xfe,0x00,0xd4,0xdd,0xeb,0x0e,0x51,0x6c,0xa4,0x46,0x32, 0x55,0xa5,0x56,0x59,0x86,0xdf,0x51,0x6c,0xa0,0xff,0x50,0x68,0x99,0xff,0x50, 0x67,0x98,0xff,0x50,0x67,0x9a,0xff,0x50,0x69,0x9b,0xff,0x50,0x82,0x6a,0x9b, 0xff,0x50,0x10,0x68,0x99,0xfe,0x50,0x5a,0x88,0xeb,0x52,0x56,0x82,0xe3,0x50, 0x4a,0x67,0xa1,0x1b,0x22,0x2d,0x45,0x12,0x12,0x1d,0x3b,0x3c,0x03,0x14,0x3c, 0x85,0x02,0x1c,0x5b,0xbf,0x0c,0x2f,0x87,0xe6,0x16,0x43,0xb5,0xfe,0x21,0x5a, 0xe8,0xff,0x32,0x78,0xff,0xff,0x48,0x9a,0xff,0xfe,0x3c,0x8a,0xff,0xfd,0x3d, 0x86,0xff,0xfe,0x3f,0x89,0xff,0xff,0x82,0x3f,0x88,0xff,0xff,0x39,0x3f,0x88, 0xfe,0xff,0x3e,0x87,0xfc,0xff,0x3c,0x84,0xf9,0xff,0x3b,0x83,0xf6,0xfd,0x39, 0x7f,0xf3,0xf6,0x38,0x7c,0xf1,0xef,0x33,0x78,0xeb,0xea,0x2c,0x70,0xe2,0x6b, 0xa3,0xc1,0xf2,0x00,0xe5,0xef,0xfd,0x00,0xce,0xd9,0xf4,0x00,0x9f,0xb9,0xeb, 0x00,0x33,0x61,0xd1,0x26,0x0e,0x42,0xc6,0xdc,0x1a,0x4c,0xc8,0xff,0x1a,0x4e, 0xca,0xff,0x1e,0x57,0xe0,0xff,0x24,0x63,0xf9,0xff,0x29,0x6c,0xff,0xff,0x2f, 0x78,0xfe,0xff,0x35,0x81,0xfe,0xff,0x4e,0xa2,0xff,0xff,0x79,0xd8,0xff,0xff, 0x71,0xcd,0xff,0xff,0x48,0x96,0xff,0xff,0x46,0x8f,0xff,0xff,0x49,0x92,0xff, 0xff,0x49,0x93,0xfe,0xff,0x4a,0x94,0xfe,0xff,0x49,0x94,0xfe,0xff,0x4b,0x94, 0xfe,0xff,0x4c,0x95,0xff,0xff,0x49,0x94,0xff,0xf7,0x4d,0x96,0xfe,0x3f,0xc9, 0xe1,0xff,0x00,0xff,0xff,0xfe,0x00,0xfc,0xfc,0xfe,0x00,0xf3,0xf8,0xfc,0x00, 0xeb,0xf2,0xf8,0x00,0xe5,0xed,0xf4,0x00,0xf3,0xf6,0xfa,0x00,0xd6,0xe6,0xff, 0x0d,0x5f,0x8f,0xf4,0x48,0x5f,0x92,0xf3,0x52,0x7d,0xb0,0xff,0x50,0x74,0xaa, 0xff,0x54,0xaa,0xd0,0xfe,0x35,0xf3,0xfa,0xfd,0x01,0xec,0xf3,0xf6,0x00,0x89, 0x95,0xac,0x00,0x69,0x74,0x8f,0x00,0xa5,0xae,0xbd,0x00,0xd2,0xd7,0xe3,0x00, 0x98,0xac,0xd6,0x00,0xbf,0xce,0xe7,0x00,0xc1,0xcf,0xe8,0x00,0xf0,0xf4,0xf9, 0x00,0x83,0xff,0xff,0xff,0x00,0x14,0xf2,0xf4,0xf6,0x00,0xf4,0xf6,0xf8,0x00, 0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa,0xbf,0x00,0xc0,0xc6,0xd2, 0x00,0xe1,0xe3,0xe7,0x00,0xa0,0xaa,0xb9,0x00,0x95,0x9d,0xb0,0x00,0xbf,0xc3, 0xcd,0x00,0x81,0x8a,0x9e,0x00,0xb7,0xbc,0xc5,0x00,0x91,0x98,0xa7,0x00,0x87, 0x8f,0x9e,0x00,0xa4,0xaa,0xb4,0x00,0x80,0x8c,0xa4,0x00,0xc1,0xc6,0xd1,0x00, 0xab,0xbc,0xd7,0x00,0xbe,0xca,0xe1,0x00,0xe3,0xe9,0xf1,0x00,0x8a,0xe2,0xe8, 0xf1,0x00,0x42,0xe5,0xeb,0xf3,0x00,0xe1,0xe7,0xf1,0x04,0x6e,0x88,0xb8,0x3a, 0x30,0x56,0xa8,0x56,0x63,0x93,0xe6,0x50,0x89,0xbe,0xff,0x50,0x67,0x98,0xfc, 0x50,0x5e,0x8c,0xf3,0x50,0x5d,0x8d,0xf0,0x50,0x59,0x8b,0xf3,0x54,0x5a,0x8a, 0xed,0x54,0x62,0x90,0xef,0x50,0x67,0x98,0xfe,0x50,0x69,0x9a,0xff,0x50,0x61, 0x90,0xf5,0x50,0x56,0x82,0xe3,0x52,0x5f,0x87,0xe2,0x4c,0xbc,0xc7,0xd9,0x0e, 0x85,0x89,0x93,0x01,0x52,0x5c,0x74,0x00,0x40,0x4f,0x70,0x08,0x22,0x39,0x72, 0x30,0x0a,0x2d,0x87,0x67,0x0e,0x3e,0xb7,0xa7,0x1b,0x58,0xe9,0xd1,0x24,0x6b, 0xfe,0xd4,0x1f,0x61,0xef,0xc7,0x24,0x5e,0xd3,0xbb,0x20,0x55,0xb5,0xb2,0x1b, 0x4b,0xa5,0xa6,0x17,0x44,0x9b,0x97,0x12,0x3d,0x8f,0x88,0x0d,0x37,0x84,0x77, 0x10,0x33,0x7b,0x6a,0x16,0x36,0x77,0x5c,0x1b,0x38,0x72,0x4d,0x21,0x3a,0x70, 0x41,0x21,0x38,0x69,0x36,0x29,0x3f,0x71,0x26,0xb9,0xc2,0xd3,0x00,0xfe,0xfe, 0xff,0x00,0xcd,0xda,0xf5,0x00,0x51,0x7a,0xd7,0x09,0x0d,0x40,0xc4,0xb6,0x19, 0x4b,0xc7,0xff,0x1a,0x4b,0xc7,0xff,0x1d,0x53,0xd8,0xff,0x23,0x5e,0xf3,0xff, 0x28,0x69,0xff,0xff,0x2e,0x75,0xff,0xff,0x32,0x7b,0xfe,0xff,0x41,0x91,0xff, 0xff,0x68,0xc3,0xff,0xff,0x70,0xcc,0xff,0xff,0x50,0x9f,0xff,0xff,0x45,0x8c, 0xfe,0xff,0x48,0x91,0xfe,0xff,0x49,0x91,0xfe,0xff,0x48,0x91,0xfe,0xff,0x48, 0x92,0xff,0xff,0x49,0x93,0xfe,0xff,0x49,0x93,0xff,0xff,0x4a,0x95,0xff,0xff, 0x41,0x8f,0xfe,0xb6,0x78,0xb1,0xfe,0x04,0xf6,0xfb,0xfe,0x00,0x82,0xf6,0xfa, 0xfe,0x00,0x14,0xea,0xf2,0xfc,0x00,0xe8,0xf1,0xfd,0x00,0xef,0xf7,0xff,0x00, 0xf6,0xfb,0xff,0x00,0x93,0xb8,0xff,0x30,0x5d,0x94,0xfc,0x54,0x9b,0xce,0xfe, 0x50,0x7c,0xb1,0xff,0x52,0x86,0xb8,0xff,0x47,0xe2,0xf4,0xff,0x0d,0xd6,0xdc, 0xe4,0x00,0x86,0x92,0xa9,0x00,0x68,0x76,0x92,0x00,0x72,0x7e,0x97,0x00,0xa8, 0xb1,0xc0,0x00,0xd2,0xd7,0xe3,0x00,0x98,0xac,0xd6,0x00,0xbf,0xce,0xe7,0x00, 0xc1,0xcf,0xe8,0x00,0xf0,0xf4,0xf9,0x00,0x83,0xff,0xff,0xff,0x00,0x14,0xf2, 0xf4,0xf6,0x00,0xf4,0xf6,0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00, 0xa0,0xaa,0xbf,0x00,0xc0,0xc6,0xd2,0x00,0xe1,0xe3,0xe7,0x00,0xa0,0xaa,0xb9, 0x00,0x95,0x9d,0xb0,0x00,0xbf,0xc3,0xcd,0x00,0x81,0x8a,0x9e,0x00,0xb7,0xbc, 0xc5,0x00,0x91,0x98,0xa7,0x00,0x87,0x8f,0x9e,0x00,0xa4,0xaa,0xb4,0x00,0x80, 0x8c,0xa4,0x00,0xc1,0xc6,0xd1,0x00,0xab,0xbc,0xd7,0x00,0xc0,0xcc,0xe2,0x00, 0xe9,0xef,0xf6,0x00,0x89,0xe8,0xee,0xf6,0x00,0x59,0xe8,0xed,0xf6,0x00,0xec, 0xf0,0xf7,0x00,0xae,0xbd,0xd9,0x1e,0x36,0x58,0xa4,0x52,0x52,0x7c,0xd7,0x51, 0xb3,0xdd,0xff,0x50,0x7c,0xad,0xfc,0x50,0x59,0x86,0xed,0x50,0x57,0x82,0xdf, 0x50,0x51,0x7d,0xde,0x52,0x6b,0x8d,0xd6,0x41,0x60,0x74,0x9f,0x3f,0x37,0x4b, 0x79,0x52,0x4e,0x73,0xc2,0x50,0x66,0x98,0xfc,0x50,0x63,0x94,0xfb,0x50,0x59, 0x86,0xe7,0x50,0x56,0x82,0xe4,0x53,0xa6,0xbf,0xed,0x21,0x71,0x7d,0x98,0x00, 0xa6,0xa9,0xb1,0x00,0xbe,0xc5,0xd2,0x00,0x86,0x95,0xb0,0x00,0x8f,0x9f,0xc1, 0x00,0x5c,0x78,0xba,0x03,0x41,0x6b,0xd2,0x19,0x43,0x71,0xe1,0x1b,0x45,0x65, 0xb2,0x13,0x3d,0x4e,0x79,0x0c,0x39,0x45,0x61,0x07,0x47,0x50,0x65,0x03,0x58, 0x62,0x75,0x00,0x69,0x6f,0x81,0x00,0x7c,0x80,0x8e,0x00,0x7a,0x7f,0x8e,0x00, 0x5e,0x66,0x77,0x00,0x52,0x5d,0x71,0x00,0x4d,0x58,0x6d,0x00,0x60,0x6a,0x7c, 0x00,0x80,0x87,0x98,0x00,0xda,0xde,0xe4,0x00,0xf9,0xfc,0xff,0x00,0x78,0x97, 0xe1,0x00,0x0e,0x43,0xc5,0x8a,0x19,0x4b,0xc7,0xff,0x1a,0x4b,0xc6,0xff,0x1c, 0x50,0xd1,0xff,0x20,0x5c,0xed,0xff,0x27,0x66,0xfe,0xff,0x2c,0x72,0xff,0xff, 0x31,0x7b,0xfe,0xff,0x39,0x86,0xff,0xff,0x5a,0xb0,0xfe,0xff,0x70,0xcd,0xfe, 0xff,0x58,0xab,0xff,0xff,0x44,0x8c,0xfe,0xff,0x47,0x8f,0xff,0xff,0x47,0x90, 0xfe,0xff,0x46,0x91,0xff,0xff,0x46,0x91,0xfe,0xff,0x48,0x91,0xff,0xff,0x48, 0x92,0xff,0xff,0x48,0x92,0xfe,0xff,0x46,0x90,0xff,0xf7,0x47,0x92,0xfe,0x4b, 0xc2,0xdd,0xff,0x00,0xf7,0xfc,0xff,0x00,0xf3,0xfa,0xff,0x00,0xf5,0xfb,0xff, 0x00,0xd2,0xe4,0xff,0x00,0xc9,0xdd,0xff,0x00,0xca,0xdd,0xfe,0x00,0xd0,0xe1, 0xfe,0x06,0x6d,0x9b,0xfe,0x42,0x84,0xb4,0xfe,0x53,0xbb,0xe2,0xff,0x50,0x70, 0xa7,0xff,0x53,0xb9,0xd8,0xfd,0x26,0xcb,0xd6,0xe8,0x00,0xd1,0xd4,0xdd,0x02, 0x91,0x9d,0xb1,0x10,0x6e,0x7c,0x95,0x18,0x77,0x81,0x97,0x15,0xb0,0xb6,0xc2, 0x09,0xdb,0xdf,0xe6,0x00,0x99,0xad,0xd6,0x00,0xbf,0xce,0xe7,0x00,0xc1,0xcf, 0xe8,0x00,0xf0,0xf4,0xf9,0x00,0x83,0xff,0xff,0xff,0x00,0x15,0xf2,0xf4,0xf6, 0x00,0xf4,0xf6,0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa, 0xbf,0x00,0xc0,0xc6,0xd2,0x00,0xe1,0xe3,0xe7,0x00,0xa0,0xaa,0xb9,0x00,0x95, 0x9d,0xb0,0x00,0xbf,0xc3,0xcd,0x00,0x81,0x8a,0x9e,0x00,0xb7,0xbc,0xc5,0x00, 0x91,0x98,0xa7,0x00,0x87,0x8f,0x9e,0x00,0xa4,0xaa,0xb4,0x00,0x80,0x8c,0xa4, 0x00,0xc1,0xc6,0xd1,0x00,0xab,0xbc,0xd7,0x00,0xc0,0xcc,0xe2,0x00,0xf0,0xf5, 0xfa,0x00,0xee,0xf3,0xfa,0x00,0x88,0xef,0xf4,0xfa,0x00,0x3c,0xf0,0xf5,0xfa, 0x00,0xed,0xf2,0xfa,0x02,0x66,0x82,0xb7,0x3c,0x33,0x5a,0xb4,0x54,0x98,0xb9, 0xf6,0x50,0xb6,0xd6,0xff,0x50,0x60,0x91,0xf6,0x50,0x59,0x85,0xe3,0x50,0x4f, 0x7b,0xdb,0x53,0x73,0x95,0xe0,0x3f,0xe0,0xe6,0xef,0x08,0xbb,0xc1,0xcd,0x14, 0x37,0x4d,0x78,0x4e,0x3a,0x5b,0xa0,0x52,0x5d,0x8d,0xf5,0x50,0x66,0x96,0xfc, 0x50,0x5b,0x88,0xea,0x50,0x55,0x81,0xe3,0x54,0x8a,0xab,0xec,0x2b,0x7e,0x9e, 0xde,0x00,0xb4,0xbd,0xd3,0x00,0xab,0xb2,0xbf,0x00,0x91,0x9d,0xb7,0x00,0xf7, 0xf7,0xf8,0x00,0xac,0xba,0xda,0x00,0x73,0x93,0xd6,0x00,0x71,0x8f,0xd1,0x00, 0x7e,0x8e,0xac,0x00,0x77,0x7e,0x8c,0x00,0x72,0x78,0x86,0x00,0x8f,0x92,0x9a, 0x00,0xb0,0xb5,0xba,0x00,0xce,0xce,0xd1,0x00,0xee,0xec,0xe9,0x00,0xdd,0xdd, 0xdf,0x00,0x93,0x98,0xa1,0x00,0x62,0x6d,0x81,0x00,0x41,0x4d,0x68,0x00,0x53, 0x5e,0x74,0x00,0x96,0x9e,0xad,0x00,0xf8,0xf9,0xf9,0x00,0x9d,0xb6,0xeb,0x00, 0x14,0x47,0xc7,0x5d,0x15,0x48,0xc7,0xfa,0x1a,0x4b,0xc7,0xff,0x1b,0x4d,0xcc, 0xff,0x1f,0x59,0xe5,0xff,0x24,0x64,0xfc,0xff,0x2a,0x6e,0xff,0xff,0x30,0x79, 0xff,0xff,0x35,0x82,0xff,0xff,0x50,0xa2,0xfe,0xff,0x6d,0xca,0xfe,0xff,0x5f, 0xb6,0xff,0xff,0x45,0x8e,0xfe,0xff,0x44,0x8c,0xfe,0xff,0x46,0x8e,0xfe,0xff, 0x46,0x8e,0xff,0xff,0x46,0x8e,0xfe,0xff,0x46,0x8f,0xfe,0xff,0x82,0x47,0x90, 0xfe,0xff,0x1b,0x47,0x90,0xff,0xff,0x3c,0x8a,0xff,0xaf,0x7c,0xb2,0xff,0x05, 0xee,0xf8,0xff,0x00,0xf4,0xfb,0xff,0x00,0xf0,0xf9,0xff,0x00,0xf4,0xfb,0xff, 0x00,0xca,0xde,0xff,0x00,0xbf,0xd7,0xff,0x00,0xc1,0xd8,0xff,0x00,0xc7,0xdc, 0xff,0x0d,0x64,0x92,0xf9,0x49,0x7d,0xb1,0xff,0x52,0x95,0xc7,0xff,0x51,0x79, 0xae,0xff,0x4e,0xde,0xed,0xfe,0x12,0xa5,0xae,0xc7,0x15,0x69,0x7b,0x9f,0x39, 0x47,0x5b,0x84,0x4a,0x40,0x56,0x86,0x50,0x47,0x61,0x97,0x4e,0x5e,0x7a,0xb1, 0x44,0x7c,0x93,0xc5,0x36,0x8e,0xa5,0xd2,0x25,0xc4,0xd1,0xe9,0x0a,0xc2,0xd0, 0xe8,0x00,0xf0,0xf4,0xf9,0x00,0x83,0xff,0xff,0xff,0x00,0x15,0xf2,0xf4,0xf6, 0x00,0xf4,0xf6,0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa, 0xbf,0x00,0xc0,0xc6,0xd2,0x00,0xe1,0xe3,0xe7,0x00,0xa0,0xaa,0xb9,0x00,0x95, 0x9d,0xb0,0x00,0xbf,0xc3,0xcd,0x00,0x81,0x8a,0x9e,0x00,0xb7,0xbc,0xc5,0x00, 0x91,0x98,0xa7,0x00,0x87,0x8f,0x9e,0x00,0xa4,0xaa,0xb4,0x00,0x80,0x8c,0xa4, 0x00,0xc1,0xc6,0xd1,0x00,0xac,0xbc,0xd7,0x00,0xbb,0xc8,0xdf,0x00,0xa8,0xb8, 0xda,0x00,0xd7,0xdf,0xf0,0x00,0x88,0xd2,0xdb,0xee,0x00,0x39,0xd3,0xdc,0xee, 0x00,0xce,0xd7,0xec,0x0e,0x43,0x63,0xa7,0x4c,0x4a,0x74,0xcc,0x51,0xc2,0xde, 0xff,0x50,0x86,0xae,0xfc,0x50,0x5d,0x8b,0xf2,0x50,0x54,0x7f,0xde,0x52,0x54, 0x7f,0xdc,0x50,0xc2,0xd1,0xef,0x17,0xff,0xff,0xfc,0x00,0xcb,0xd5,0xeb,0x12, 0x41,0x62,0xa8,0x4e,0x49,0x72,0xcc,0x52,0x76,0xab,0xfe,0x50,0x68,0x99,0xfd, 0x50,0x5b,0x89,0xea,0x50,0x55,0x81,0xe5,0x54,0x8e,0xae,0xf1,0x2a,0x8e,0xb1, 0xf6,0x00,0xba,0xc9,0xec,0x00,0xa6,0xad,0xb9,0x00,0x8e,0x9c,0xb5,0x00,0xe7, 0xea,0xf0,0x00,0xa0,0xb0,0xd6,0x00,0x6c,0x8e,0xd6,0x00,0x6a,0x8b,0xd4,0x00, 0x76,0x89,0xae,0x00,0x6f,0x78,0x8b,0x00,0x6a,0x72,0x82,0x00,0x85,0x89,0x94, 0x00,0xa3,0xa9,0xb1,0x00,0xbf,0xc0,0xc6,0x00,0xdd,0xdc,0xdd,0x00,0xce,0xcf, 0xd4,0x00,0x87,0x8c,0x97,0x00,0x69,0x73,0x86,0x00,0x5d,0x68,0x7e,0x00,0xdf, 0xe2,0xec,0x00,0xd5,0xdf,0xf3,0x00,0xaa,0xc1,0xef,0x00,0x28,0x59,0xcc,0x35, 0x10,0x44,0xc5,0xe7,0x19,0x4c,0xc8,0xff,0x1b,0x4c,0xca,0xff,0x1f,0x56,0xdf, 0xff,0x23,0x62,0xf8,0xff,0x29,0x6b,0xff,0xff,0x2f,0x75,0xfe,0xff,0x33,0x7d, 0xff,0xff,0x46,0x97,0xff,0xff,0x69,0xc6,0xfe,0xff,0x66,0xc0,0xfe,0xff,0x48, 0x94,0xff,0xff,0x41,0x8c,0xfe,0xff,0x43,0x8e,0xfe,0xff,0x45,0x8e,0xfe,0xff, 0x82,0x44,0x8f,0xff,0xff,0x1e,0x45,0x8f,0xfe,0xff,0x46,0x8f,0xfe,0xff,0x46, 0x8f,0xff,0xff,0x40,0x8c,0xff,0xf0,0x4a,0x93,0xff,0x3c,0xce,0xe3,0xff,0x00, 0xff,0xff,0xff,0x00,0xf8,0xfb,0xfe,0x00,0xfd,0xfe,0xfe,0x00,0xdc,0xe7,0xfd, 0x00,0xc1,0xd6,0xfc,0x00,0xc3,0xd8,0xfc,0x00,0xc4,0xd8,0xfc,0x00,0xca,0xdc, 0xfe,0x0c,0x5e,0x85,0xda,0x47,0x4a,0x7b,0xdb,0x57,0x59,0x89,0xe4,0x58,0x71, 0x9a,0xe7,0x47,0x84,0x9f,0xd0,0x32,0x42,0x5d,0x96,0x4c,0x30,0x4f,0x91,0x55, 0x39,0x5b,0xa6,0x53,0x46,0x6c,0xc5,0x52,0x52,0x7a,0xd5,0x52,0x52,0x7a,0xd3, 0x54,0x4a,0x70,0xc1,0x54,0x4c,0x6f,0xbc,0x54,0x6f,0x8d,0xcc,0x42,0xc3,0xd1, 0xe9,0x10,0xf2,0xf5,0xf9,0x00,0x83,0xff,0xff,0xff,0x00,0x17,0xf2,0xf4,0xf6, 0x00,0xf4,0xf6,0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa, 0xbf,0x00,0xc0,0xc6,0xd2,0x00,0xe1,0xe3,0xe7,0x00,0xa0,0xaa,0xb9,0x00,0x95, 0x9d,0xb0,0x00,0xbf,0xc3,0xcd,0x00,0x81,0x8a,0x9e,0x00,0xb7,0xbc,0xc5,0x00, 0x91,0x98,0xa7,0x00,0x87,0x8f,0x9e,0x00,0xa4,0xaa,0xb4,0x00,0x80,0x8c,0xa4, 0x00,0xc1,0xc6,0xd1,0x00,0xac,0xbc,0xd7,0x00,0xba,0xc7,0xdf,0x00,0xa6,0xb6, 0xd8,0x00,0xcb,0xd4,0xe4,0x00,0x9e,0xb0,0xd0,0x00,0xa6,0xb6,0xd5,0x00,0x86, 0xa5,0xb5,0xd5,0x00,0x39,0xa6,0xb6,0xd5,0x00,0xa2,0xb2,0xd2,0x1c,0x39,0x58, 0xa1,0x52,0x65,0x8f,0xdc,0x50,0xae,0xd8,0xff,0x50,0x6c,0x9b,0xfc,0x50,0x5b, 0x88,0xec,0x50,0x4d,0x79,0xdd,0x54,0x71,0x96,0xe3,0x41,0xe1,0xe8,0xf7,0x05, 0xfe,0xfe,0xfd,0x00,0x91,0xa6,0xcf,0x2b,0x35,0x5d,0xb5,0x54,0x76,0xa1,0xf0, 0x50,0xbf,0xe3,0xff,0x50,0x64,0x95,0xfb,0x50,0x59,0x86,0xe7,0x50,0x56,0x83, 0xe5,0x53,0xa8,0xc2,0xf7,0x1f,0xab,0xc5,0xf7,0x00,0xaa,0xc5,0xf9,0x00,0xa2, 0xb1,0xd0,0x00,0x88,0x96,0xaf,0x00,0xe7,0xeb,0xf0,0x00,0xa0,0xb0,0xd6,0x00, 0x6c,0x8e,0xd6,0x00,0x6a,0x8b,0xd4,0x00,0x76,0x89,0xae,0x00,0x6f,0x78,0x8b, 0x00,0x6a,0x72,0x82,0x00,0x85,0x89,0x94,0x00,0xa3,0xa9,0xb1,0x00,0xbf,0xc0, 0xc6,0x00,0xdd,0xdc,0xdd,0x00,0xc9,0xcb,0xd0,0x00,0x81,0x87,0x94,0x00,0xe0, 0xe2,0xe7,0x00,0xfe,0xff,0xff,0x00,0xfc,0xfc,0xff,0x00,0xd6,0xe2,0xf8,0x00, 0x44,0x70,0xd5,0x11,0x0c,0x40,0xc5,0xc5,0x19,0x4c,0xc9,0xff,0x1a,0x4d,0xc9, 0xff,0x1d,0x54,0xd9,0xff,0x23,0x60,0xf5,0xff,0x28,0x69,0xff,0xff,0x2d,0x74, 0xff,0xff,0x32,0x7c,0xff,0xff,0x3f,0x8e,0xfe,0xff,0x63,0xbe,0xfe,0xff,0x6d, 0xc8,0xff,0xff,0x4e,0x9d,0xff,0xff,0x3f,0x88,0xff,0xff,0x42,0x8c,0xfe,0xff, 0x43,0x8e,0xfe,0xff,0x43,0x8c,0xff,0xff,0x82,0x44,0x8d,0xfe,0xff,0x82,0x44, 0x8f,0xff,0xff,0x09,0x44,0x8e,0xfe,0xff,0x3b,0x89,0xfe,0x98,0x86,0xb8,0xff, 0x01,0xed,0xf4,0xfd,0x00,0xea,0xf0,0xf9,0x00,0xf8,0xfa,0xfe,0x00,0xff,0xff, 0xfe,0x00,0xcf,0xe0,0xfd,0x00,0xb8,0xcf,0xfc,0x00,0x82,0xbe,0xd4,0xfc,0x00, 0x11,0xc4,0xd9,0xfe,0x0d,0x61,0x87,0xda,0x47,0x50,0x7a,0xca,0x57,0x50,0x79, 0xcd,0x55,0x3f,0x69,0xc6,0x55,0x37,0x5b,0xa8,0x53,0x3e,0x61,0xae,0x51,0x4b, 0x74,0xd0,0x50,0x54,0x82,0xe4,0x50,0x58,0x84,0xdd,0x50,0x5a,0x81,0xd4,0x50, 0x5b,0x82,0xd6,0x50,0x55,0x7c,0xcd,0x50,0x4e,0x71,0xbd,0x51,0x44,0x6a,0xbd, 0x56,0x82,0x9f,0xd8,0x38,0xf3,0xf6,0xfa,0x03,0x83,0xff,0xff,0xff,0x00,0x17, 0xf2,0xf4,0xf6,0x00,0xf4,0xf6,0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6, 0x00,0xa0,0xaa,0xbf,0x00,0xc0,0xc6,0xd2,0x00,0xe1,0xe3,0xe7,0x00,0xa0,0xaa, 0xb9,0x00,0x95,0x9d,0xb0,0x00,0xbf,0xc3,0xcd,0x00,0x81,0x8a,0x9e,0x00,0xb7, 0xbc,0xc5,0x00,0x91,0x98,0xa7,0x00,0x87,0x8f,0x9e,0x00,0xa4,0xaa,0xb4,0x00, 0x80,0x8c,0xa4,0x00,0xc1,0xc6,0xd1,0x00,0xac,0xbc,0xd7,0x00,0xba,0xc7,0xdf, 0x00,0xa6,0xb7,0xd9,0x00,0xd4,0xd9,0xe7,0x00,0x99,0xa6,0xc3,0x00,0x8f,0x9d, 0xbc,0x00,0x87,0x91,0x9f,0xbe,0x00,0x37,0x8e,0x9c,0xba,0x21,0x2e,0x49,0x86, 0x55,0x50,0x7b,0xcb,0x55,0x71,0xa7,0xf7,0x54,0x52,0x81,0xe8,0x54,0x4d,0x78, 0xda,0x55,0x43,0x6f,0xd1,0x5a,0x88,0xa5,0xe3,0x34,0xdf,0xe5,0xf3,0x00,0xbc, 0xc9,0xe1,0x17,0x43,0x65,0xad,0x4d,0x40,0x6c,0xce,0x52,0xa1,0xd0,0xfe,0x50, 0xa0,0xc5,0xff,0x50,0x5b,0x8a,0xf2,0x50,0x54,0x80,0xe2,0x52,0x65,0x90,0xea, 0x49,0xdd,0xe6,0xfc,0x0b,0xe2,0xe9,0xfc,0x00,0xe1,0xe8,0xfc,0x00,0xdd,0xe6, 0xfd,0x00,0xc3,0xcb,0xda,0x00,0xe3,0xe7,0xed,0x00,0xa0,0xb0,0xd6,0x00,0x6c, 0x8e,0xd6,0x00,0x6a,0x8b,0xd4,0x00,0x76,0x89,0xae,0x00,0x6f,0x78,0x8b,0x00, 0x6a,0x72,0x82,0x00,0x85,0x89,0x94,0x00,0xa3,0xa9,0xb1,0x00,0xbf,0xc0,0xc6, 0x00,0xd9,0xd8,0xd9,0x00,0xd4,0xd4,0xd8,0x00,0xd3,0xd6,0xe0,0x00,0xfd,0xfd, 0xff,0x00,0xfa,0xfa,0xff,0x00,0xf6,0xf9,0xfe,0x00,0x6d,0x91,0xdf,0x03,0x0c, 0x42,0xc8,0x95,0x19,0x4b,0xca,0xff,0x1a,0x4c,0xcb,0xff,0x1c,0x53,0xd6,0xff, 0x21,0x5e,0xf0,0xff,0x27,0x69,0xff,0xff,0x2c,0x72,0xfe,0xff,0x31,0x7c,0xff, 0xff,0x3a,0x8a,0xff,0xff,0x5b,0xb3,0xff,0xff,0x71,0xcf,0xff,0xff,0x57,0xaa, 0xfe,0xff,0x40,0x86,0xff,0xff,0x41,0x89,0xfe,0xff,0x41,0x8c,0xfe,0xff,0x43, 0x8c,0xff,0xff,0x82,0x42,0x8b,0xff,0xff,0x1f,0x44,0x8d,0xff,0xff,0x43,0x8e, 0xfe,0xff,0x44,0x8d,0xfe,0xff,0x3d,0x89,0xff,0xd9,0x60,0xa1,0xff,0x1b,0xcd, 0xe2,0xfa,0x00,0xd2,0xdc,0xed,0x00,0xb7,0xca,0xee,0x00,0xf5,0xf9,0xfe,0x00, 0xfc,0xfd,0xfe,0x00,0xe2,0xed,0xff,0x00,0xad,0xca,0xff,0x00,0xa7,0xc6,0xff, 0x00,0xa9,0xc7,0xff,0x00,0xae,0xca,0xff,0x14,0x5f,0x8e,0xf3,0x4c,0x7a,0xae, 0xff,0x50,0x65,0x9a,0xf6,0x55,0x2c,0x59,0xc5,0x60,0x3f,0x68,0xc1,0x54,0x54, 0x81,0xe5,0x4f,0x61,0x93,0xf9,0x50,0x59,0x84,0xdf,0x50,0x57,0x7d,0xcf,0x50, 0x5a,0x81,0xd7,0x4f,0x5c,0x85,0xdd,0x50,0x5a,0x81,0xd6,0x50,0x51,0x75,0xc3, 0x50,0x4a,0x6f,0xbc,0x53,0x55,0x7d,0xcd,0x4e,0xce,0xdc,0xf4,0x14,0x83,0xff, 0xff,0xff,0x00,0x17,0xf2,0xf4,0xf6,0x00,0xf4,0xf6,0xf8,0x00,0xd1,0xd8,0xe1, 0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa,0xbf,0x00,0xc0,0xc6,0xd2,0x00,0xe1,0xe3, 0xe7,0x00,0xa0,0xaa,0xb9,0x00,0x95,0x9d,0xb0,0x00,0xbf,0xc3,0xcd,0x00,0x81, 0x8a,0x9e,0x00,0xb7,0xbc,0xc5,0x00,0x91,0x98,0xa7,0x00,0x87,0x8f,0x9e,0x00, 0xa4,0xaa,0xb4,0x00,0x80,0x8c,0xa4,0x00,0xc1,0xc6,0xd1,0x00,0xac,0xbc,0xd7, 0x00,0xba,0xc7,0xdf,0x00,0xa4,0xb5,0xd8,0x00,0xdf,0xe3,0xed,0x00,0xd4,0xd9, 0xe5,0x00,0xd6,0xdb,0xe4,0x00,0x87,0xd5,0xdb,0xe4,0x00,0x12,0xd5,0xda,0xe3, 0x08,0x95,0xa0,0xb3,0x22,0x70,0x88,0xbb,0x38,0x70,0x8d,0xcf,0x3d,0x7b,0x92, 0xc2,0x36,0x7f,0x93,0xbd,0x31,0x73,0x87,0xb4,0x2d,0xc9,0xd1,0xe2,0x10,0xc9, 0xd4,0xe9,0x0d,0x51,0x6f,0xaf,0x46,0x3a,0x5f,0xbb,0x54,0x72,0xa5,0xf3,0x50, 0x91,0xc8,0xff,0x50,0x60,0x92,0xf6,0x50,0x58,0x85,0xe5,0x50,0x4d,0x7d,0xe3, 0x55,0x9b,0xb7,0xf2,0x2c,0xf8,0xf9,0xfe,0x00,0x82,0xf8,0xf8,0xfe,0x00,0x20, 0xf8,0xf8,0xff,0x00,0xfc,0xfd,0xff,0x00,0xdf,0xe3,0xeb,0x00,0xa0,0xb0,0xd6, 0x00,0x6c,0x8e,0xd6,0x00,0x6a,0x8b,0xd4,0x00,0x76,0x89,0xae,0x00,0x6f,0x78, 0x8b,0x00,0x6a,0x72,0x82,0x00,0x85,0x89,0x94,0x00,0xa1,0xa7,0xb0,0x00,0xbc, 0xbe,0xc3,0x00,0xeb,0xeb,0xec,0x00,0xf9,0xf9,0xfa,0x00,0xff,0xff,0xff,0x00, 0xfb,0xfa,0xfc,0x00,0xe6,0xec,0xfa,0x00,0x9a,0xb4,0xec,0x00,0x14,0x49,0xcb, 0x5c,0x16,0x4a,0xcd,0xfa,0x1a,0x4e,0xce,0xff,0x1c,0x51,0xd5,0xff,0x20,0x5d, 0xec,0xff,0x26,0x67,0xfe,0xff,0x2b,0x71,0xff,0xff,0x31,0x7c,0xff,0xff,0x37, 0x85,0xfe,0xff,0x55,0xab,0xff,0xff,0x74,0xd2,0xfe,0xff,0x62,0xb9,0xff,0xff, 0x41,0x8a,0xff,0xff,0x3f,0x88,0xff,0xff,0x82,0x41,0x8a,0xff,0xff,0x01,0x42, 0x89,0xfe,0xff,0x82,0x42,0x8a,0xfe,0xff,0x1f,0x43,0x8a,0xff,0xff,0x42,0x8b, 0xff,0xff,0x41,0x8b,0xff,0xf8,0x45,0x8d,0xff,0x65,0xaa,0xca,0xf7,0x03,0xe0, 0xe2,0xe2,0x02,0xd3,0xdb,0xe8,0x04,0xbe,0xce,0xf1,0x00,0xf6,0xfa,0xfe,0x00, 0xf8,0xfb,0xfe,0x00,0xff,0xff,0xfe,0x00,0xaf,0xc9,0xfd,0x00,0x99,0xbb,0xfd, 0x00,0x9c,0xbd,0xfd,0x00,0xa0,0xc0,0xfe,0x17,0x58,0x87,0xec,0x4f,0x61,0x96, 0xfe,0x54,0x3d,0x6e,0xd8,0x5e,0x2c,0x5a,0xc5,0x61,0x53,0x83,0xed,0x52,0x77, 0xad,0xff,0x50,0x64,0x8f,0xe4,0x50,0x4f,0x72,0xc0,0x50,0x47,0x6b,0xbd,0x55, 0x40,0x65,0xb2,0x58,0x44,0x61,0x9e,0x51,0x4c,0x6e,0xb2,0x50,0x51,0x76,0xc6, 0x50,0x4d,0x71,0xbe,0x51,0x4b,0x73,0xc8,0x53,0xad,0xc4,0xf0,0x24,0x83,0xff, 0xff,0xff,0x00,0x18,0xf2,0xf4,0xf6,0x00,0xf4,0xf6,0xf8,0x00,0xd1,0xd8,0xe1, 0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa,0xbf,0x00,0xc0,0xc6,0xd2,0x00,0xe1,0xe3, 0xe7,0x00,0xa0,0xaa,0xb9,0x00,0x95,0x9d,0xb0,0x00,0xbf,0xc3,0xcd,0x00,0x81, 0x8a,0x9e,0x00,0xb7,0xbc,0xc5,0x00,0x91,0x98,0xa7,0x00,0x87,0x8f,0x9e,0x00, 0xa4,0xaa,0xb4,0x00,0x80,0x8c,0xa4,0x00,0xc1,0xc6,0xd1,0x00,0xac,0xbc,0xd7, 0x00,0xba,0xc7,0xdf,0x00,0xa4,0xb5,0xd8,0x00,0xdb,0xe0,0xeb,0x00,0xda,0xe0, 0xea,0x00,0xed,0xf1,0xf5,0x00,0xef,0xf1,0xf5,0x00,0x86,0xee,0xf1,0xf5,0x00, 0x12,0xef,0xf1,0xf5,0x00,0xbf,0xc6,0xce,0x00,0x88,0x9b,0xc0,0x02,0x7f,0x96, 0xc5,0x03,0x8f,0x9e,0xba,0x02,0x96,0xa1,0xb7,0x01,0xbe,0xc3,0xd1,0x00,0xeb, 0xf0,0xf9,0x05,0x6a,0x84,0xbc,0x3d,0x34,0x58,0xb1,0x55,0x62,0x92,0xea,0x50, 0x8d,0xc4,0xff,0x50,0x67,0x99,0xf9,0x50,0x56,0x83,0xe7,0x50,0x4d,0x7d,0xe0, 0x55,0x6c,0x94,0xe9,0x44,0xe6,0xed,0xfa,0x0a,0xfc,0xfd,0xfd,0x00,0x82,0xf8, 0xfa,0xfc,0x00,0x1f,0xf9,0xfb,0xfc,0x00,0xf8,0xf9,0xfa,0x00,0xe0,0xe4,0xeb, 0x00,0xa0,0xb0,0xd6,0x00,0x6c,0x8e,0xd6,0x00,0x6a,0x8b,0xd4,0x00,0x76,0x89, 0xae,0x00,0x6f,0x78,0x8b,0x00,0x64,0x6c,0x7c,0x00,0x7e,0x82,0x8d,0x00,0xc7, 0xca,0xce,0x00,0xfa,0xf9,0xf9,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00, 0xfd,0xfc,0xfc,0x00,0xff,0xff,0xfe,0x00,0xcc,0xda,0xf5,0x00,0x2a,0x5c,0xd4, 0x24,0x13,0x47,0xcd,0xe1,0x1b,0x4f,0xd1,0xff,0x1c,0x51,0xd4,0xff,0x20,0x5a, 0xe9,0xff,0x25,0x66,0xfc,0xff,0x2a,0x71,0xff,0xff,0x31,0x79,0xfe,0xff,0x35, 0x82,0xff,0xff,0x4d,0xa0,0xff,0xff,0x77,0xd4,0xff,0xff,0x71,0xcd,0xfe,0xff, 0x46,0x92,0xfe,0xff,0x3d,0x86,0xff,0xff,0x84,0x40,0x89,0xfe,0xff,0x01,0x40, 0x89,0xff,0xff,0x82,0x41,0x89,0xfe,0xff,0x1e,0x41,0x8a,0xff,0xff,0x3e,0x8b, 0xff,0xd4,0x50,0x8f,0xf2,0x35,0x6c,0x89,0xc9,0x23,0x61,0x83,0xd2,0x48,0x76, 0x9d,0xee,0x42,0xa6,0xbf,0xef,0x26,0xf5,0xf9,0xfd,0x01,0xf6,0xfa,0xfe,0x00, 0xf9,0xfd,0xfe,0x00,0xbc,0xcd,0xf1,0x00,0xa8,0xc0,0xee,0x00,0xab,0xc2,0xef, 0x00,0xaf,0xc5,0xf1,0x12,0x64,0x87,0xd2,0x44,0x43,0x73,0xd9,0x57,0x2e,0x5b, 0xc6,0x60,0x3e,0x6f,0xde,0x5a,0x84,0xba,0xff,0x50,0xa1,0xd2,0xfa,0x50,0x4e, 0x74,0xc7,0x50,0x4b,0x71,0xbe,0x50,0x46,0x6c,0xbf,0x54,0x2e,0x48,0x7d,0x56, 0x2e,0x41,0x67,0x51,0x3a,0x56,0x93,0x50,0x4c,0x71,0xc1,0x50,0x4f,0x73,0xc1, 0x51,0x49,0x72,0xc9,0x54,0x9c,0xb6,0xee,0x2b,0x83,0xff,0xff,0xff,0x00,0x19, 0xf2,0xf4,0xf6,0x00,0xf4,0xf6,0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6, 0x00,0xa0,0xaa,0xbf,0x00,0xc0,0xc6,0xd2,0x00,0xe1,0xe3,0xe7,0x00,0xa0,0xaa, 0xb9,0x00,0x95,0x9d,0xb0,0x00,0xbf,0xc3,0xcd,0x00,0x81,0x8a,0x9e,0x00,0xb7, 0xbc,0xc5,0x00,0x91,0x98,0xa7,0x00,0x87,0x8f,0x9e,0x00,0xa4,0xaa,0xb4,0x00, 0x80,0x8c,0xa4,0x00,0xc1,0xc6,0xd1,0x00,0xac,0xbc,0xd7,0x00,0xba,0xc7,0xdf, 0x00,0xa4,0xb5,0xd8,0x00,0xdc,0xe0,0xeb,0x00,0xd8,0xdd,0xe9,0x00,0xe2,0xe6, 0xee,0x00,0xe8,0xec,0xf1,0x00,0xeb,0xee,0xf2,0x00,0x86,0xea,0xee,0xf2,0x00, 0x11,0xb8,0xbf,0xca,0x00,0x85,0x99,0xc0,0x00,0x78,0x90,0xc4,0x00,0x98,0xa8, 0xc6,0x00,0xb6,0xc1,0xd5,0x00,0xf0,0xf5,0xfb,0x01,0x8a,0xa1,0xce,0x2f,0x33, 0x58,0xab,0x55,0x57,0x85,0xe1,0x51,0x93,0xc9,0xff,0x50,0x6f,0xa2,0xfa,0x50, 0x57,0x84,0xeb,0x50,0x51,0x7d,0xe0,0x52,0x55,0x81,0xe2,0x50,0xb6,0xca,0xf1, 0x1b,0xfc,0xfd,0xfc,0x00,0xfb,0xfd,0xfc,0x00,0x82,0xfa,0xfc,0xfc,0x00,0x1f, 0xfb,0xfd,0xfc,0x00,0xf8,0xfa,0xfa,0x00,0xdf,0xe3,0xea,0x00,0xa0,0xb0,0xd6, 0x00,0x6c,0x8e,0xd6,0x00,0x6a,0x8b,0xd4,0x00,0x77,0x8a,0xaf,0x00,0x67,0x70, 0x82,0x00,0x7e,0x87,0x98,0x00,0xad,0xb2,0xbe,0x00,0xf7,0xfa,0xff,0x00,0xf3, 0xf7,0xfc,0x00,0xf2,0xf6,0xfb,0x00,0xf2,0xf5,0xfb,0x00,0xf3,0xf6,0xfb,0x00, 0xf1,0xf6,0xfc,0x00,0x5e,0x86,0xe0,0x04,0x0f,0x45,0xd0,0xa8,0x1b,0x4f,0xd1, 0xff,0x1c,0x50,0xd3,0xff,0x1f,0x58,0xe4,0xff,0x24,0x64,0xfa,0xff,0x2a,0x6e, 0xff,0xff,0x31,0x79,0xff,0xff,0x36,0x82,0xff,0xff,0x44,0x96,0xfe,0xff,0x75, 0xd4,0xff,0xff,0x81,0xe1,0xff,0xff,0x52,0xa1,0xff,0xff,0x3b,0x83,0xfe,0xff, 0x3e,0x87,0xfe,0xff,0x83,0x3f,0x88,0xfe,0xff,0x82,0x40,0x89,0xfe,0xff,0x0d, 0x40,0x89,0xff,0xff,0x40,0x89,0xfe,0xff,0x3f,0x89,0xff,0xfa,0x40,0x86,0xfd, 0x60,0x4d,0x82,0xe8,0x2c,0x5b,0x8c,0xee,0x52,0x56,0x85,0xea,0x54,0x53,0x80, 0xe1,0x54,0x5b,0x88,0xe8,0x52,0xb9,0xcf,0xfb,0x18,0xbc,0xd1,0xfb,0x00,0xba, 0xd0,0xfb,0x00,0xd4,0xe0,0xf7,0x00,0x82,0xf1,0xf2,0xf5,0x00,0x11,0xf3,0xf3, 0xf5,0x01,0xda,0xdf,0xea,0x0a,0x5b,0x7f,0xca,0x42,0x3c,0x65,0xc6,0x56,0x5e, 0x91,0xf3,0x4f,0xd1,0xef,0xff,0x50,0x97,0xb8,0xe6,0x50,0x43,0x69,0xbd,0x50, 0x4f,0x77,0xcb,0x51,0x73,0x95,0xda,0x3c,0x47,0x67,0xab,0x4a,0x41,0x64,0xb1, 0x51,0x4b,0x76,0xd4,0x50,0x54,0x7e,0xd7,0x50,0x4f,0x72,0xbf,0x51,0x49,0x72, 0xcc,0x54,0xa1,0xbb,0xf1,0x2a,0x83,0xff,0xff,0xff,0x00,0x1a,0xf2,0xf4,0xf6, 0x00,0xf4,0xf6,0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa, 0xbf,0x00,0xc0,0xc6,0xd2,0x00,0xe1,0xe3,0xe7,0x00,0xa0,0xaa,0xb9,0x00,0x95, 0x9d,0xb0,0x00,0xbf,0xc3,0xcd,0x00,0x81,0x8a,0x9e,0x00,0xb7,0xbc,0xc5,0x00, 0x91,0x98,0xa7,0x00,0x87,0x8f,0x9e,0x00,0xa4,0xaa,0xb4,0x00,0x80,0x8c,0xa4, 0x00,0xc1,0xc6,0xd1,0x00,0xac,0xbc,0xd7,0x00,0xba,0xc7,0xdf,0x00,0xa4,0xb5, 0xd8,0x00,0xdc,0xe0,0xeb,0x00,0xd8,0xdd,0xe9,0x00,0xe1,0xe6,0xed,0x00,0xe0, 0xe5,0xed,0x00,0xe8,0xeb,0xf1,0x00,0xeb,0xee,0xf2,0x00,0x85,0xea,0xee,0xf2, 0x00,0x11,0xb7,0xbe,0xc9,0x00,0x7a,0x8f,0xba,0x00,0x8e,0xa5,0xd1,0x00,0xcc, 0xd9,0xed,0x00,0xd9,0xe5,0xf5,0x00,0xaa,0xbb,0xdd,0x1a,0x3e,0x60,0xac,0x50, 0x47,0x73,0xd3,0x52,0xa2,0xd2,0xfd,0x50,0x87,0xba,0xfd,0x50,0x54,0x82,0xee, 0x50,0x54,0x80,0xe0,0x51,0x4c,0x7a,0xde,0x54,0x99,0xb2,0xeb,0x2e,0xec,0xf0, 0xf8,0x02,0xf5,0xf7,0xfa,0x00,0xf7,0xf9,0xfb,0x00,0x82,0xf7,0xf8,0xfb,0x00, 0x0a,0xf7,0xf9,0xfb,0x00,0xf8,0xf9,0xfb,0x00,0xe4,0xe8,0xef,0x00,0xa0,0xb0, 0xd6,0x00,0x6c,0x8e,0xd6,0x00,0x69,0x8a,0xd3,0x00,0x6a,0x7c,0xa3,0x00,0x8e, 0x97,0xaa,0x00,0xdc,0xe7,0xf8,0x00,0xe4,0xef,0xff,0x00,0x84,0xda,0xe5,0xf9, 0x00,0x11,0xe8,0xf0,0xfc,0x00,0x98,0xb4,0xed,0x00,0x17,0x4e,0xd4,0x5b,0x18, 0x4e,0xd4,0xf9,0x1c,0x51,0xd5,0xfe,0x1e,0x57,0xe0,0xff,0x23,0x62,0xf7,0xff, 0x29,0x6c,0xff,0xff,0x2f,0x76,0xff,0xff,0x36,0x82,0xff,0xff,0x40,0x91,0xff, 0xff,0x70,0xcd,0xff,0xff,0x94,0xf7,0xfe,0xff,0x65,0xbb,0xff,0xff,0x3b,0x83, 0xff,0xff,0x3d,0x85,0xfe,0xff,0x3d,0x87,0xff,0xff,0x82,0x3f,0x88,0xff,0xff, 0x0d,0x3f,0x86,0xff,0xff,0x3f,0x88,0xfe,0xff,0x3e,0x88,0xfe,0xff,0x40,0x89, 0xfe,0xff,0x3e,0x88,0xff,0xfa,0x40,0x8b,0xff,0xad,0x4f,0x89,0xf7,0x0c,0x80, 0xaf,0xfb,0x4b,0x7a,0xa9,0xfe,0x4f,0x67,0x8d,0xdb,0x41,0x56,0x7a,0xc5,0x4e, 0x5d,0x8d,0xee,0x54,0x97,0xbb,0xfe,0x23,0x82,0x99,0xbd,0xfd,0x00,0x14,0x9a, 0xbc,0xfe,0x00,0xe0,0xe6,0xf7,0x00,0xe2,0xe8,0xf7,0x00,0xe3,0xe9,0xf7,0x00, 0xde,0xe7,0xfa,0x07,0x59,0x7f,0xcd,0x45,0x42,0x6f,0xd3,0x52,0x7c,0xae,0xfb, 0x50,0xe4,0xf3,0xff,0x50,0x68,0x87,0xd1,0x50,0x44,0x69,0xbd,0x53,0x65,0x88, 0xd8,0x46,0x8e,0xab,0xe7,0x2e,0x46,0x70,0xca,0x4f,0x52,0x80,0xe2,0x50,0x9a, 0xc7,0xff,0x50,0x80,0xac,0xe9,0x50,0x49,0x6d,0xbe,0x52,0x4c,0x76,0xd1,0x52, 0xb8,0xcd,0xf7,0x1f,0x83,0xff,0xff,0xff,0x00,0x1a,0xf2,0xf4,0xf6,0x00,0xf4, 0xf6,0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa,0xbf,0x00, 0xc0,0xc6,0xd2,0x00,0xe1,0xe3,0xe7,0x00,0xa0,0xaa,0xb9,0x00,0x95,0x9d,0xb0, 0x00,0xbf,0xc3,0xcd,0x00,0x81,0x8a,0x9e,0x00,0xb7,0xbc,0xc5,0x00,0x91,0x98, 0xa7,0x00,0x87,0x8f,0x9e,0x00,0xa4,0xaa,0xb4,0x00,0x80,0x8c,0xa4,0x00,0xc1, 0xc6,0xd1,0x00,0xac,0xbc,0xd7,0x00,0xba,0xc7,0xdf,0x00,0xa4,0xb5,0xd8,0x00, 0xdc,0xe0,0xeb,0x00,0xd8,0xdd,0xe9,0x00,0xe1,0xe6,0xee,0x00,0xdf,0xe4,0xed, 0x00,0xe0,0xe5,0xed,0x00,0xe8,0xec,0xf1,0x00,0x84,0xeb,0xee,0xf2,0x00,0x1d, 0xe9,0xed,0xf1,0x00,0xc0,0xc7,0xd1,0x00,0xbd,0xc9,0xe2,0x00,0xcd,0xd9,0xed, 0x00,0xd8,0xe2,0xf1,0x00,0xd0,0xdc,0xee,0x04,0x70,0x8b,0xc2,0x3b,0x33,0x5c, 0xbb,0x56,0x8b,0xb4,0xf8,0x50,0xbe,0xe0,0xff,0x50,0x5c,0x8c,0xf4,0x50,0x55, 0x80,0xe1,0x50,0x4d,0x79,0xdb,0x54,0x7a,0x9d,0xe7,0x3c,0xec,0xf0,0xf8,0x05, 0xfb,0xfa,0xfa,0x00,0xf4,0xf5,0xf9,0x00,0xf3,0xf4,0xf9,0x00,0xf4,0xf4,0xf9, 0x00,0xf5,0xf6,0xfa,0x00,0xf4,0xf5,0xf9,0x00,0xf8,0xf8,0xfb,0x00,0xe9,0xec, 0xf3,0x00,0x9e,0xae,0xd4,0x00,0x68,0x8b,0xd5,0x00,0x74,0x95,0xdb,0x00,0xb1, 0xc0,0xdf,0x00,0xca,0xd8,0xf3,0x00,0xd2,0xe1,0xfa,0x00,0x84,0xcd,0xdc,0xf6, 0x00,0x13,0xd2,0xdf,0xf7,0x00,0xc3,0xd4,0xf5,0x00,0x40,0x6e,0xdd,0x16,0x0e, 0x47,0xd4,0xcd,0x1c,0x51,0xd7,0xfd,0x1d,0x55,0xdb,0xfd,0x23,0x5f,0xf2,0xfe, 0x27,0x6a,0xff,0xfe,0x2e,0x75,0xff,0xff,0x35,0x81,0xfe,0xff,0x3c,0x8c,0xff, 0xff,0x63,0xbc,0xfe,0xff,0xa3,0xff,0xfb,0xff,0x85,0xe3,0xfe,0xff,0x42,0x8b, 0xff,0xff,0x39,0x82,0xfe,0xff,0x3c,0x86,0xfe,0xff,0x3d,0x85,0xfe,0xff,0x3c, 0x86,0xfe,0xff,0x85,0x3e,0x87,0xfe,0xff,0x09,0x38,0x83,0xff,0xb0,0x72,0xa9, 0xfc,0x1a,0x83,0xa4,0xe5,0x0f,0x7c,0xa7,0xf0,0x51,0x73,0x9c,0xec,0x45,0x71, 0x98,0xea,0x3b,0x71,0xa2,0xf4,0x51,0x6d,0x9c,0xf7,0x50,0xbf,0xd4,0xfd,0x16, 0x82,0xc3,0xd8,0xfe,0x00,0x14,0xc2,0xd7,0xfd,0x00,0xc0,0xcf,0xec,0x00,0xbf, 0xce,0xeb,0x00,0xc0,0xcf,0xeb,0x00,0xba,0xca,0xe8,0x15,0x3f,0x66,0xba,0x52, 0x42,0x70,0xd9,0x52,0x95,0xc7,0xff,0x50,0xbf,0xdf,0xf9,0x50,0x4e,0x72,0xc5, 0x51,0x47,0x6e,0xc4,0x54,0x6c,0x92,0xe0,0x41,0x62,0x84,0xd1,0x40,0x40,0x69, 0xc5,0x52,0x5d,0x90,0xf1,0x50,0xc3,0xeb,0xff,0x50,0x81,0xa6,0xdb,0x50,0x42, 0x68,0xbe,0x53,0x5e,0x85,0xd9,0x4a,0xd2,0xe0,0xfc,0x0f,0x83,0xff,0xff,0xff, 0x00,0x17,0xf2,0xf4,0xf6,0x00,0xf4,0xf6,0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7, 0xb1,0xc6,0x00,0xa0,0xaa,0xbf,0x00,0xc0,0xc6,0xd2,0x00,0xe1,0xe3,0xe7,0x00, 0xa0,0xaa,0xb9,0x00,0x95,0x9d,0xb0,0x00,0xbf,0xc3,0xcd,0x00,0x81,0x8a,0x9e, 0x00,0xbd,0xc1,0xc9,0x00,0x95,0x9c,0xaa,0x00,0x8b,0x91,0xa0,0x00,0xa9,0xae, 0xb7,0x00,0x80,0x8c,0xa4,0x00,0xc1,0xc6,0xd1,0x00,0xac,0xbc,0xd7,0x00,0xba, 0xc7,0xdf,0x00,0xa4,0xb5,0xd8,0x00,0xdc,0xe0,0xeb,0x00,0xd8,0xdd,0xe9,0x00, 0xe1,0xe6,0xee,0x00,0x82,0xe0,0xe5,0xed,0x00,0x02,0xe0,0xe4,0xed,0x00,0xe7, 0xec,0xf1,0x00,0x83,0xe7,0xeb,0xf1,0x00,0x0f,0xe6,0xeb,0xf1,0x00,0xd4,0xdd, 0xec,0x00,0xd9,0xe3,0xf2,0x00,0xd7,0xe0,0xef,0x00,0xd8,0xe2,0xf0,0x00,0xc0, 0xcd,0xe4,0x10,0x43,0x66,0xad,0x4c,0x49,0x77,0xd6,0x52,0xca,0xe4,0xff,0x50, 0x85,0xad,0xfc,0x50,0x56,0x85,0xeb,0x50,0x51,0x7c,0xdc,0x52,0x5e,0x8a,0xe3, 0x4b,0xcd,0xda,0xf5,0x11,0xfa,0xf9,0xfa,0x00,0x82,0xf8,0xf8,0xf9,0x00,0x0c, 0xf8,0xf8,0xfa,0x00,0xf7,0xf7,0xfb,0x00,0xed,0xee,0xf4,0x00,0xf0,0xf1,0xf6, 0x00,0xd7,0xdd,0xe8,0x00,0xc9,0xd3,0xe3,0x00,0xda,0xdf,0xe8,0x00,0x82,0x9e, 0xd9,0x00,0xbb,0xcf,0xf2,0x00,0xcf,0xde,0xfa,0x00,0xc9,0xd9,0xf7,0x00,0xc6, 0xd7,0xf4,0x00,0x84,0xc7,0xd7,0xf5,0x00,0x37,0xd1,0xdf,0xf6,0x00,0x86,0xa5, 0xe9,0x00,0x0e,0x46,0xd5,0x79,0x19,0x50,0xd8,0xfe,0x1d,0x53,0xdb,0xfd,0x20, 0x5b,0xea,0xfd,0x25,0x67,0xfd,0xfd,0x2c,0x73,0xff,0xfd,0x35,0x7f,0xff,0xfe, 0x3a,0x8b,0xff,0xfe,0x51,0xa8,0xff,0xff,0xa5,0xf3,0xfe,0xff,0xb3,0xfe,0xfb, 0xff,0x58,0xa6,0xff,0xff,0x35,0x7d,0xfe,0xff,0x3c,0x84,0xff,0xff,0x3c,0x86, 0xfe,0xff,0x3c,0x86,0xff,0xff,0x3d,0x87,0xff,0xff,0x3d,0x85,0xfe,0xff,0x3d, 0x87,0xfe,0xff,0x3e,0x86,0xff,0xff,0x3d,0x87,0xfe,0xff,0x37,0x82,0xff,0xe5, 0x51,0x94,0xff,0x22,0xba,0xd4,0xfb,0x04,0xd0,0xda,0xec,0x04,0xc8,0xd4,0xed, 0x12,0x95,0xae,0xe2,0x29,0x57,0x86,0xe9,0x4f,0x5c,0x8f,0xf7,0x56,0x8c,0xb1, 0xf9,0x37,0xf9,0xfa,0xff,0x02,0xfa,0xfb,0xff,0x00,0xf9,0xfb,0xff,0x00,0xf7, 0xf9,0xfe,0x00,0xc5,0xcf,0xe3,0x00,0xc3,0xcd,0xe2,0x00,0xc4,0xce,0xe2,0x00, 0xbf,0xc9,0xe0,0x12,0x52,0x6b,0x9f,0x46,0x42,0x64,0xb1,0x50,0x67,0x97,0xe8, 0x54,0x69,0x97,0xdd,0x53,0x44,0x66,0xb0,0x51,0x4b,0x6e,0xb6,0x4e,0x49,0x6f, 0xbf,0x4e,0x3f,0x65,0xb7,0x50,0x48,0x71,0xce,0x50,0x65,0x98,0xf9,0x50,0x76, 0xa7,0xf5,0x50,0x51,0x74,0xc4,0x50,0x42,0x6a,0xc2,0x55,0x89,0xa8,0xea,0x36, 0xe0,0xeb,0xff,0x02,0x83,0xff,0xff,0xff,0x00,0x17,0xf2,0xf4,0xf6,0x00,0xf4, 0xf6,0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa,0xbf,0x00, 0xc0,0xc6,0xd2,0x00,0xe1,0xe3,0xe7,0x00,0x9f,0xa9,0xb8,0x00,0x9a,0xa2,0xb4, 0x00,0xcc,0xcf,0xd6,0x01,0x87,0x90,0xa1,0x09,0x9f,0xa6,0xb2,0x10,0x7e,0x86, 0x97,0x16,0x75,0x7e,0x8f,0x18,0x8e,0x95,0xa2,0x13,0x84,0x8f,0xa2,0x0a,0xcb, 0xcf,0xd4,0x00,0xb0,0xbf,0xd8,0x00,0xb9,0xc7,0xdf,0x00,0xa4,0xb5,0xd8,0x00, 0xdc,0xe0,0xeb,0x00,0xd8,0xdd,0xe9,0x00,0xe1,0xe6,0xee,0x00,0x83,0xe0,0xe5, 0xed,0x00,0x02,0xdf,0xe4,0xed,0x00,0xc4,0xcf,0xe5,0x00,0x83,0xc6,0xd1,0xe6, 0x00,0x83,0xc7,0xd1,0xe6,0x00,0x16,0xcc,0xd5,0xe8,0x00,0xaf,0xbc,0xd7,0x1c, 0x33,0x56,0xa4,0x52,0x66,0x91,0xe3,0x51,0xc0,0xe2,0xff,0x50,0x61,0x8f,0xf1, 0x50,0x55,0x81,0xde,0x50,0x4c,0x79,0xdb,0x54,0x91,0xaf,0xee,0x2f,0xce,0xdc, 0xf6,0x00,0xe0,0xe8,0xf7,0x00,0xe3,0xea,0xf7,0x00,0xe2,0xe9,0xf8,0x00,0xe4, 0xeb,0xf9,0x00,0xea,0xe9,0xea,0x00,0xaf,0xb8,0xcb,0x00,0xc1,0xc9,0xd8,0x00, 0xd3,0xda,0xe6,0x00,0xc5,0xcf,0xe1,0x00,0xde,0xe3,0xeb,0x00,0xbb,0xc5,0xd7, 0x00,0xc4,0xd5,0xf3,0x00,0x86,0xc3,0xd5,0xf5,0x00,0x10,0xc9,0xd9,0xf6,0x00, 0xba,0xcf,0xf3,0x00,0x33,0x65,0xdc,0x1b,0x13,0x4a,0xd7,0xda,0x1d,0x53,0xdb, 0xfd,0x1f,0x58,0xe3,0xfd,0x24,0x63,0xf9,0xfd,0x2a,0x6f,0xff,0xfd,0x32,0x7a, 0xff,0xfd,0x3a,0x88,0xff,0xfd,0x44,0x9c,0xfe,0xfd,0x95,0xdc,0xfe,0xfe,0xde, 0xff,0xfc,0xff,0x8a,0xce,0xfe,0xff,0x37,0x7f,0xff,0xff,0x39,0x83,0xfe,0xff, 0x83,0x3b,0x84,0xff,0xff,0x0f,0x3c,0x86,0xfe,0xff,0x3c,0x84,0xfe,0xff,0x3c, 0x86,0xff,0xff,0x3d,0x87,0xfe,0xff,0x3b,0x85,0xfe,0xfd,0x38,0x82,0xfe,0x52, 0xa9,0xcb,0xff,0x09,0xff,0xff,0xff,0x00,0xed,0xf1,0xf8,0x00,0xc3,0xd4,0xf7, 0x03,0x7a,0xa5,0xf6,0x3f,0x70,0xa4,0xf7,0x56,0x6a,0x97,0xf5,0x49,0xd2,0xe2, 0xfe,0x0f,0xff,0xff,0xff,0x00,0x83,0xfe,0xfe,0xff,0x00,0x83,0xf6,0xf7,0xf9, 0x00,0x0f,0xf7,0xf8,0xf9,0x00,0xcf,0xd4,0xdb,0x08,0x8b,0x99,0xb8,0x1a,0x7e, 0x96,0xca,0x2a,0x6c,0x85,0xb9,0x28,0xa9,0xb5,0xc9,0x1c,0x8c,0x9d,0xba,0x29, 0x37,0x59,0x9e,0x51,0x41,0x68,0xbf,0x52,0x56,0x85,0xea,0x50,0x6b,0x9c,0xfe, 0x50,0x55,0x7c,0xd0,0x50,0x45,0x69,0xb9,0x52,0x52,0x7b,0xd2,0x4f,0xcb,0xdc, 0xfa,0x16,0x84,0xff,0xff,0xff,0x00,0x17,0xf2,0xf4,0xf6,0x00,0xf4,0xf6,0xf8, 0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1,0xc6,0x00,0xa0,0xaa,0xbf,0x00,0xbf,0xc6, 0xd2,0x00,0xe8,0xea,0xec,0x00,0xaf,0xb7,0xc3,0x08,0x7b,0x85,0x9d,0x1d,0x78, 0x82,0x98,0x34,0x51,0x60,0x7d,0x44,0x39,0x4c,0x72,0x4c,0x36,0x4d,0x7a,0x50, 0x38,0x51,0x87,0x51,0x3e,0x5a,0x91,0x4e,0x5b,0x72,0xa3,0x44,0x87,0x99,0xbf, 0x2e,0x9b,0xae,0xcf,0x16,0xc7,0xd1,0xe3,0x04,0xa4,0xb5,0xd8,0x00,0xdc,0xe0, 0xeb,0x00,0xd8,0xdd,0xe9,0x00,0xe1,0xe6,0xee,0x00,0x83,0xe0,0xe5,0xed,0x00, 0x03,0xe0,0xe5,0xee,0x00,0xcd,0xd7,0xe6,0x00,0xbb,0xc8,0xdf,0x00,0x85,0xbc, 0xc9,0xdf,0x00,0x16,0xc1,0xcd,0xe2,0x00,0xa4,0xb5,0xd0,0x21,0x31,0x52,0x9e, 0x53,0x6a,0x98,0xe3,0x50,0x89,0xbe,0xff,0x50,0x5c,0x8a,0xf1,0x50,0x53,0x80, 0xde,0x50,0x4c,0x79,0xd9,0x53,0xa8,0xbf,0xed,0x22,0xbb,0xce,0xf1,0x00,0xb5, 0xc9,0xf0,0x00,0xb4,0xc8,0xef,0x00,0xb7,0xcc,0xf4,0x00,0x9c,0xab,0xc6,0x00, 0xc8,0xc8,0xcd,0x00,0xb5,0xbe,0xcf,0x00,0xc2,0xca,0xd9,0x00,0xd4,0xdb,0xe6, 0x00,0xc6,0xd0,0xe1,0x00,0xdd,0xe2,0xeb,0x00,0xbb,0xc5,0xd7,0x00,0xcd,0xdb, 0xf5,0x00,0x85,0xcf,0xdd,0xf7,0x00,0x11,0xcf,0xdc,0xf7,0x00,0xd1,0xdf,0xf7, 0x00,0x85,0xa5,0xea,0x00,0x11,0x49,0xd6,0x7a,0x1c,0x52,0xdb,0xfe,0x1f,0x56, 0xdf,0xfd,0x22,0x5e,0xf1,0xfd,0x29,0x6b,0xff,0xfd,0x30,0x76,0xff,0xfd,0x38, 0x86,0xff,0xfd,0x3d,0x95,0xff,0xfd,0x72,0xc0,0xfe,0xfe,0xea,0xfb,0xff,0xff, 0xd9,0xf0,0xff,0xff,0x4a,0x8f,0xff,0xff,0x37,0x7e,0xff,0xff,0x3b,0x83,0xff, 0xff,0x83,0x3b,0x83,0xfe,0xff,0x01,0x3b,0x83,0xff,0xff,0x82,0x3c,0x84,0xff, 0xff,0x0c,0x3c,0x85,0xfe,0xff,0x33,0x7e,0xfe,0xa6,0x78,0xac,0xfe,0x01,0xec, 0xf4,0xff,0x02,0xec,0xf1,0xfa,0x00,0xb4,0xc8,0xf3,0x00,0xa7,0xbf,0xf2,0x17, 0x71,0xa1,0xf8,0x50,0x7a,0xac,0xfa,0x55,0x9e,0xbb,0xfa,0x2b,0xe4,0xef,0xff, 0x00,0xec,0xf3,0xff,0x00,0x82,0xec,0xf2,0xff,0x00,0x02,0xed,0xf3,0xff,0x00, 0xf4,0xf6,0xf9,0x00,0x82,0xf5,0xf6,0xf9,0x00,0x0f,0xf6,0xf7,0xf9,0x00,0xcd, 0xd3,0xda,0x00,0x7f,0x8f,0xb5,0x00,0xae,0xb9,0xd5,0x00,0xc6,0xcf,0xe3,0x00, 0xee,0xf4,0xff,0x02,0x71,0x90,0xd1,0x39,0x3a,0x60,0xb7,0x54,0x4e,0x7a,0xdd, 0x50,0x67,0x9b,0xff,0x50,0x5e,0x89,0xe1,0x50,0x49,0x6c,0xb8,0x50,0x44,0x6c, 0xc4,0x54,0x86,0xa7,0xeb,0x33,0xef,0xf6,0xff,0x01,0x84,0xff,0xff,0xff,0x00, 0x17,0xf2,0xf4,0xf6,0x00,0xf4,0xf6,0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa7,0xb1, 0xc6,0x00,0xa1,0xab,0xc0,0x00,0xc8,0xcd,0xd8,0x02,0x9d,0xa7,0xb9,0x20,0x54, 0x64,0x86,0x42,0x32,0x46,0x72,0x52,0x27,0x40,0x76,0x55,0x32,0x51,0x95,0x54, 0x3e,0x62,0xb1,0x53,0x44,0x6d,0xc2,0x52,0x49,0x72,0xcc,0x52,0x4b,0x74,0xd0, 0x52,0x47,0x72,0xcd,0x54,0x45,0x70,0xcb,0x55,0x55,0x7a,0xc9,0x4e,0x72,0x8f, 0xc9,0x3d,0xa1,0xb3,0xd6,0x1c,0xe0,0xe3,0xec,0x01,0xd9,0xde,0xe9,0x00,0xe1, 0xe6,0xee,0x00,0x83,0xe0,0xe5,0xed,0x00,0x03,0xe1,0xe6,0xee,0x00,0xdc,0xe0, 0xeb,0x00,0xb7,0xc3,0xda,0x00,0x85,0xba,0xc5,0xdc,0x00,0x16,0xbf,0xc9,0xdf, 0x00,0xa2,0xb0,0xcc,0x21,0x32,0x52,0x97,0x53,0x5c,0x8a,0xe2,0x50,0x6d,0xa0, 0xff,0x50,0x59,0x88,0xef,0x50,0x53,0x81,0xe4,0x51,0x4d,0x79,0xdc,0x53,0xa7, 0xbc,0xe5,0x21,0xbe,0xcd,0xe7,0x00,0xbb,0xcb,0xe8,0x00,0xbf,0xd0,0xed,0x00, 0x8e,0x9a,0xb4,0x00,0x8b,0x91,0x9f,0x00,0xcd,0xcd,0xd2,0x00,0xb5,0xbe,0xcf, 0x00,0xc2,0xca,0xd9,0x00,0xd4,0xdb,0xe6,0x00,0xc6,0xd0,0xe1,0x00,0xdd,0xe2, 0xeb,0x00,0xbb,0xc5,0xd7,0x00,0xd8,0xe1,0xf7,0x00,0x85,0xda,0xe3,0xf8,0x00, 0x10,0xdb,0xe4,0xf8,0x00,0xd7,0xe1,0xf8,0x00,0x37,0x68,0xdd,0x11,0x15,0x4d, 0xd8,0xd4,0x1e,0x56,0xdc,0xfd,0x20,0x5a,0xe6,0xfd,0x25,0x65,0xfb,0xfd,0x2c, 0x72,0xff,0xfd,0x34,0x81,0xfe,0xfd,0x3e,0x8f,0xff,0xfd,0x52,0xac,0xfe,0xfe, 0xbd,0xe9,0xff,0xff,0xff,0xff,0xfe,0xff,0x87,0xb2,0xfe,0xff,0x30,0x7a,0xff, 0xff,0x3a,0x82,0xff,0xff,0x82,0x3b,0x81,0xff,0xff,0x02,0x3a,0x83,0xff,0xff, 0x3b,0x84,0xff,0xff,0x82,0x3b,0x82,0xfe,0xff,0x0c,0x3b,0x83,0xfe,0xff,0x33, 0x7e,0xfe,0xd8,0x51,0x94,0xff,0x1e,0xdc,0xea,0xff,0x00,0xfc,0xfe,0xff,0x00, 0xd3,0xdf,0xf3,0x00,0x8d,0xa8,0xde,0x00,0x95,0xae,0xe1,0x1a,0x4d,0x79,0xd7, 0x56,0x4c,0x79,0xda,0x56,0xba,0xce,0xf2,0x1c,0xf2,0xf8,0xff,0x00,0x83,0xe5, 0xef,0xfe,0x00,0x01,0xe6,0xf0,0xfe,0x00,0x83,0xf5,0xf6,0xf9,0x00,0x10,0xf6, 0xf7,0xf9,0x00,0xc6,0xcc,0xd6,0x00,0xa3,0xb1,0xca,0x00,0xd4,0xdf,0xf1,0x00, 0xf0,0xf7,0xff,0x00,0x9f,0xb8,0xe7,0x26,0x37,0x63,0xbf,0x55,0x4a,0x75,0xd6, 0x51,0x68,0x9d,0xfc,0x50,0x6e,0x9f,0xf4,0x50,0x4d,0x70,0xc0,0x50,0x45,0x6a, 0xba,0x53,0x5f,0x86,0xd8,0x48,0xd7,0xe4,0xfb,0x0d,0xe9,0xf0,0xfc,0x00,0xee, 0xf5,0xfd,0x00,0x83,0xff,0xff,0xff,0x00,0x17,0xf2,0xf4,0xf6,0x00,0xf4,0xf6, 0xf8,0x00,0xd1,0xd8,0xe1,0x00,0xa9,0xb3,0xc8,0x00,0xaa,0xb3,0xc5,0x08,0x71, 0x7f,0x9d,0x35,0x2b,0x42,0x72,0x53,0x2a,0x46,0x7f,0x54,0x3d,0x5f,0xa7,0x52, 0x4d,0x75,0xcd,0x50,0x52,0x7d,0xd9,0x50,0x52,0x7c,0xd8,0x50,0x52,0x7c,0xd4, 0x50,0x52,0x7c,0xd5,0x50,0x52,0x7b,0xd5,0x50,0x53,0x7d,0xd7,0x50,0x52,0x7d, 0xd8,0x50,0x50,0x7a,0xd9,0x52,0x45,0x70,0xcb,0x55,0x4e,0x73,0xc0,0x51,0x93, 0xa7,0xcf,0x2c,0xe0,0xe5,0xec,0x02,0xe4,0xe8,0xef,0x00,0x85,0xe1,0xe6,0xee, 0x00,0x02,0xd8,0xdd,0xe9,0x00,0xcf,0xd5,0xe5,0x00,0x84,0xd0,0xd6,0xe6,0x00, 0x17,0xd5,0xdb,0xe9,0x00,0xb8,0xc1,0xd6,0x19,0x35,0x50,0x88,0x50,0x3d,0x64, 0xbb,0x55,0x47,0x73,0xd7,0x58,0x32,0x58,0xaa,0x5b,0x2a,0x4b,0x92,0x5b,0x3e, 0x5c,0x99,0x4f,0xbe,0xc9,0xe1,0x18,0xda,0xe2,0xf2,0x00,0xd9,0xe1,0xf3,0x00, 0x91,0x9c,0xb1,0x00,0x66,0x70,0x86,0x00,0x8e,0x96,0xa6,0x00,0xcd,0xcd,0xd2, 0x00,0xb5,0xbe,0xcf,0x00,0xc2,0xca,0xd9,0x00,0xd4,0xdb,0xe6,0x00,0xc6,0xd0, 0xe1,0x00,0xdd,0xe2,0xeb,0x00,0xba,0xc4,0xd6,0x00,0xd1,0xd7,0xe5,0x00,0xdc, 0xe6,0xf7,0x00,0x84,0xdb,0xe5,0xf6,0x00,0x10,0xe0,0xe9,0xf7,0x00,0x9f,0xb9, 0xec,0x00,0x18,0x4f,0xd5,0x56,0x1b,0x51,0xd9,0xfe,0x1e,0x54,0xdd,0xfd,0x22, 0x5e,0xf1,0xfd,0x28,0x6b,0xff,0xfd,0x2f,0x79,0xfe,0xfd,0x3a,0x89,0xfe,0xfd, 0x46,0x9d,0xff,0xfd,0x81,0xcd,0xfe,0xfe,0xfc,0xff,0xfe,0xff,0xd2,0xe2,0xfe, 0xff,0x42,0x84,0xff,0xff,0x33,0x7d,0xff,0xff,0x39,0x81,0xff,0xff,0x82,0x3a, 0x82,0xff,0xff,0x10,0x3a,0x82,0xfe,0xff,0x3b,0x83,0xff,0xff,0x3a,0x82,0xff, 0xff,0x3b,0x83,0xfe,0xff,0x37,0x80,0xfe,0xfe,0x34,0x80,0xff,0x60,0xab,0xca, 0xff,0x00,0xff,0xff,0xff,0x00,0xfd,0xfd,0xfe,0x00,0xc6,0xd4,0xf0,0x00,0x86, 0xa4,0xdc,0x00,0x8c,0xa8,0xdf,0x1c,0x4e,0x7b,0xda,0x56,0x4b,0x7a,0xdf,0x56, 0xbb,0xcf,0xf7,0x1e,0xf6,0xfb,0xff,0x00,0x83,0xec,0xf3,0xff,0x00,0x14,0xeb, 0xf3,0xff,0x00,0xee,0xf3,0xfe,0x00,0xf6,0xf7,0xfa,0x00,0xf5,0xf7,0xfa,0x00, 0xf4,0xf5,0xf8,0x00,0xd8,0xde,0xe6,0x00,0xe0,0xeb,0xf7,0x00,0xe7,0xf0,0xfc, 0x00,0xd8,0xe4,0xf7,0x0a,0x53,0x7a,0xce,0x48,0x40,0x6a,0xcc,0x53,0x62,0x96, 0xf5,0x50,0x8c,0xc5,0xff,0x50,0x5c,0x85,0xd3,0x50,0x46,0x68,0xb6,0x51,0x47, 0x71,0xc9,0x53,0xa9,0xc1,0xf1,0x22,0xef,0xf5,0xfd,0x00,0xe9,0xf0,0xfc,0x00, 0xe7,0xf0,0xfc,0x00,0x83,0xff,0xff,0xff,0x00,0x18,0xf2,0xf4,0xf6,0x00,0xf4, 0xf6,0xf8,0x00,0xd3,0xd9,0xe2,0x00,0xb0,0xb9,0xcc,0x08,0x60,0x70,0x94,0x3d, 0x26,0x3e,0x76,0x56,0x35,0x53,0x99,0x51,0x53,0x7b,0xcf,0x50,0x5e,0x8a,0xec, 0x50,0x54,0x7f,0xdb,0x50,0x4f,0x78,0xd0,0x50,0x50,0x78,0xce,0x50,0x50,0x78, 0xd1,0x50,0x51,0x7a,0xd0,0x50,0x51,0x7a,0xd1,0x50,0x51,0x79,0xd2,0x50,0x51, 0x7a,0xd4,0x50,0x53,0x7e,0xd9,0x50,0x53,0x7d,0xd9,0x50,0x49,0x71,0xca,0x52, 0x43,0x6b,0xbd,0x54,0xa2,0xb3,0xd4,0x28,0xe1,0xe5,0xec,0x00,0xdc,0xe1,0xea, 0x00,0x83,0xdb,0xe1,0xea,0x00,0x03,0xde,0xe3,0xeb,0x00,0xcf,0xd8,0xe6,0x00, 0xb8,0xc6,0xdd,0x00,0x84,0xbb,0xc8,0xdf,0x00,0x17,0xbe,0xcc,0xe1,0x00,0xab, 0xbb,0xd5,0x13,0x3e,0x59,0x90,0x4d,0x2d,0x4e,0x95,0x5b,0x33,0x53,0x9e,0x5a, 0x34,0x54,0x98,0x56,0x38,0x59,0x9f,0x52,0x44,0x69,0xbc,0x52,0xab,0xc2,0xef, 0x22,0xc6,0xd8,0xfb,0x00,0x92,0xa0,0xba,0x00,0x5f,0x6a,0x81,0x00,0x6e,0x78, 0x8e,0x00,0x8f,0x97,0xa7,0x00,0xcd,0xcd,0xd2,0x00,0xb5,0xbe,0xcf,0x00,0xc2, 0xca,0xd9,0x00,0xd4,0xdb,0xe6,0x00,0xc6,0xd0,0xe1,0x00,0xdd,0xe2,0xeb,0x00, 0xba,0xc4,0xd6,0x00,0xcf,0xd5,0xe3,0x00,0xe0,0xe9,0xf8,0x00,0x84,0xe3,0xea, 0xf7,0x00,0x0f,0xec,0xf1,0xf8,0x00,0x64,0x8c,0xe1,0x00,0x12,0x47,0xd2,0x9a, 0x1b,0x51,0xd7,0xfd,0x1f,0x57,0xe0,0xfd,0x24,0x62,0xf8,0xfd,0x2b,0x6f,0xff, 0xfd,0x34,0x7f,0xff,0xfd,0x41,0x91,0xff,0xfd,0x56,0xb0,0xfe,0xfe,0xc2,0xed, 0xfe,0xff,0xff,0xff,0xfe,0xff,0x87,0xb3,0xff,0xff,0x2d,0x78,0xff,0xff,0x37, 0x7f,0xff,0xff,0x83,0x39,0x80,0xfe,0xff,0x10,0x39,0x82,0xff,0xff,0x3a,0x80, 0xfe,0xff,0x3a,0x82,0xff,0xff,0x3a,0x81,0xff,0xff,0x2e,0x7b,0xff,0xae,0x74, 0xa9,0xff,0x07,0xe6,0xf1,0xff,0x00,0xfe,0xff,0xff,0x00,0xe3,0xea,0xf7,0x00, 0x7c,0x9b,0xd8,0x00,0x84,0xa1,0xdb,0x00,0x81,0x9f,0xdb,0x20,0x4c,0x7c,0xe3, 0x59,0x5a,0x8b,0xf3,0x54,0xc6,0xd7,0xfb,0x1b,0xf9,0xfd,0xff,0x00,0x84,0xf0, 0xf6,0xff,0x00,0x02,0xf2,0xf8,0xff,0x00,0xfc,0xfe,0xff,0x00,0x82,0xfb,0xfe, 0xff,0x00,0x82,0xfc,0xff,0xff,0x00,0x0b,0xff,0xff,0xff,0x00,0xa3,0xba,0xea, 0x24,0x3c,0x67,0xc9,0x53,0x51,0x82,0xe7,0x50,0xaa,0xd6,0xff,0x50,0x9d,0xc9, 0xf0,0x50,0x47,0x6c,0xbb,0x50,0x3f,0x67,0xbe,0x55,0x7e,0xa0,0xe4,0x3a,0xcb, 0xdc,0xfa,0x04,0xe6,0xef,0xfd,0x00,0x82,0xe5,0xef,0xfd,0x00,0x83,0xff,0xff, 0xff,0x00,0x18,0xf2,0xf4,0xf6,0x00,0xf4,0xf6,0xf8,0x00,0xd8,0xde,0xe5,0x04, 0x6b,0x7b,0x9c,0x38,0x28,0x41,0x79,0x56,0x3a,0x5b,0xa5,0x50,0x69,0x95,0xe1, 0x50,0x72,0xa1,0xf9,0x50,0x53,0x7b,0xd4,0x50,0x4d,0x74,0xc9,0x50,0x4f,0x75, 0xcd,0x50,0x4f,0x75,0xce,0x50,0x50,0x78,0xd3,0x50,0x52,0x7c,0xd8,0x51,0x54, 0x7f,0xdc,0x50,0x52,0x7e,0xd9,0x50,0x51,0x7a,0xd4,0x50,0x51,0x7b,0xd5,0x50, 0x54,0x7e,0xdb,0x50,0x51,0x79,0xd2,0x50,0x47,0x6d,0xc6,0x54,0x55,0x77,0xbf, 0x4b,0xc1,0xca,0xdd,0x0e,0xd6,0xdb,0xe4,0x00,0x83,0xd2,0xd7,0xe3,0x00,0x03, 0xd6,0xda,0xe4,0x00,0xbf,0xc9,0xdc,0x00,0x9c,0xad,0xcf,0x00,0x84,0xa0,0xb1, 0xd0,0x00,0x18,0xa4,0xb4,0xd2,0x00,0x90,0xa3,0xc6,0x1a,0x38,0x59,0xa4,0x52, 0x6b,0x94,0xde,0x50,0x8a,0xb7,0xf1,0x4f,0x5c,0x8d,0xf8,0x4f,0x56,0x84,0xe6, 0x4f,0x4d,0x7a,0xe0,0x54,0xa2,0xbc,0xf1,0x25,0xa0,0xae,0xc7,0x00,0x6b,0x76, 0x8c,0x00,0x67,0x72,0x8a,0x00,0x6e,0x78,0x8e,0x00,0x8f,0x97,0xa7,0x00,0xcd, 0xcd,0xd2,0x00,0xb5,0xbe,0xcf,0x00,0xc2,0xca,0xd9,0x00,0xd4,0xdb,0xe6,0x00, 0xc6,0xd0,0xe1,0x00,0xdd,0xe2,0xeb,0x00,0xba,0xc4,0xd6,0x00,0xd5,0xd9,0xe3, 0x00,0xdd,0xe3,0xf4,0x00,0xc4,0xd2,0xf2,0x00,0x83,0xc7,0xd5,0xf2,0x00,0x22, 0xd0,0xdb,0xf4,0x00,0x42,0x6e,0xd6,0x0c,0x12,0x48,0xce,0xce,0x1c,0x52,0xd4, 0xfd,0x1f,0x58,0xe4,0xfd,0x26,0x66,0xfd,0xfe,0x2e,0x73,0xff,0xfd,0x38,0x83, 0xfe,0xfd,0x46,0x99,0xfe,0xfd,0x77,0xc9,0xff,0xfe,0xf6,0xff,0xff,0xff,0xdf, 0xeb,0xff,0xff,0x4b,0x8c,0xfe,0xff,0x30,0x79,0xfe,0xff,0x38,0x80,0xfe,0xff, 0x39,0x7f,0xff,0xff,0x39,0x81,0xfe,0xff,0x39,0x80,0xff,0xff,0x39,0x80,0xfe, 0xff,0x39,0x80,0xff,0xff,0x39,0x81,0xff,0xff,0x34,0x7d,0xfe,0xec,0x42,0x87, 0xfe,0x36,0xca,0xe0,0xff,0x00,0xff,0xff,0xfe,0x00,0xfe,0xfe,0xff,0x00,0xef, 0xf2,0xf8,0x00,0xb6,0xc4,0xdd,0x00,0xb9,0xc6,0xde,0x00,0xb7,0xc5,0xdd,0x0d, 0x91,0xaa,0xdd,0x2d,0x95,0xb2,0xed,0x22,0xd4,0xe1,0xf8,0x07,0xfd,0xfe,0xff, 0x00,0x83,0xf7,0xfa,0xff,0x00,0x03,0xf7,0xfb,0xff,0x00,0xf8,0xfb,0xff,0x00, 0xe8,0xee,0xfa,0x00,0x84,0xe9,0xef,0xfb,0x00,0x0a,0xf0,0xf4,0xfc,0x01,0x77, 0x95,0xd9,0x38,0x3b,0x67,0xcb,0x54,0x6d,0xa0,0xf6,0x50,0xe4,0xfb,0xff,0x50, 0x80,0xa0,0xd5,0x50,0x3d,0x63,0xb6,0x52,0x50,0x79,0xd0,0x4e,0xc1,0xd5,0xf9, 0x16,0xea,0xf3,0xff,0x00,0x83,0xde,0xea,0xff,0x00,0x83,0xff,0xff,0xff,0x00, 0x18,0xf2,0xf4,0xf6,0x00,0xfb,0xfc,0xfb,0x00,0x94,0xa2,0xba,0x27,0x28,0x41, 0x78,0x54,0x33,0x52,0x9e,0x51,0x74,0xa0,0xe0,0x50,0x94,0xc5,0xfd,0x50,0x55, 0x7d,0xd4,0x50,0x4c,0x73,0xc7,0x50,0x4d,0x74,0xc7,0x50,0x4b,0x71,0xc4,0x50, 0x47,0x6e,0xc3,0x52,0x46,0x6c,0xc2,0x53,0x41,0x64,0xae,0x52,0x3f,0x5d,0x9f, 0x52,0x49,0x6c,0xba,0x50,0x51,0x79,0xd3,0x50,0x51,0x7a,0xd5,0x50,0x52,0x7d, 0xd8,0x50,0x51,0x7c,0xd5,0x50,0x4c,0x74,0xca,0x50,0x42,0x6a,0xc0,0x55,0x9d, 0xb0,0xd3,0x26,0xb7,0xc3,0xda,0x00,0x84,0xb3,0xbf,0xd9,0x00,0x02,0xb2,0xbe, 0xd8,0x00,0xb1,0xbc,0xd6,0x00,0x84,0xb1,0xbd,0xd7,0x00,0x19,0xb5,0xc0,0xd9, 0x00,0x9f,0xae,0xca,0x17,0x3a,0x56,0x94,0x50,0x56,0x80,0xd1,0x51,0x7c,0xaf, 0xff,0x50,0x5f,0x8f,0xfb,0x50,0x56,0x83,0xe2,0x50,0x49,0x74,0xd3,0x54,0x85, 0x9f,0xd1,0x30,0x9c,0xa3,0xac,0x16,0x70,0x7c,0x92,0x22,0x67,0x71,0x88,0x25, 0x6f,0x78,0x8d,0x23,0x90,0x98,0xa7,0x18,0xd0,0xcf,0xd2,0x08,0xb7,0xc0,0xd0, 0x00,0xc4,0xcb,0xda,0x00,0xd6,0xdc,0xe7,0x00,0xc6,0xd0,0xe1,0x00,0xdd,0xe2, 0xeb,0x00,0xb9,0xc3,0xd6,0x00,0xdb,0xde,0xe3,0x00,0xc9,0xd4,0xec,0x00,0x80, 0x9f,0xe3,0x00,0x8a,0xa6,0xe4,0x00,0x82,0x89,0xa6,0xe4,0x00,0x0f,0x91,0xad, 0xe6,0x00,0x2b,0x5a,0xcd,0x33,0x15,0x49,0xca,0xeb,0x1c,0x51,0xd0,0xfd,0x21, 0x5b,0xe8,0xfd,0x27,0x69,0xfe,0xfd,0x30,0x76,0xff,0xfd,0x3a,0x88,0xff,0xfd, 0x4a,0xa2,0xfe,0xfe,0xa2,0xdf,0xfe,0xff,0xff,0xff,0xff,0xff,0xaa,0xc8,0xff, 0xff,0x2d,0x78,0xff,0xff,0x35,0x7d,0xff,0xff,0x38,0x7f,0xff,0xff,0x83,0x38, 0x80,0xff,0xff,0x16,0x38,0x7f,0xfe,0xff,0x37,0x80,0xfe,0xff,0x39,0x80,0xff, 0xff,0x31,0x7c,0xff,0x96,0x83,0xb2,0xff,0x00,0xfd,0xfe,0xfe,0x00,0xfe,0xfe, 0xfe,0x00,0xfe,0xfe,0xff,0x00,0xf7,0xf7,0xf9,0x00,0xd7,0xdb,0xe4,0x00,0xd9, 0xdd,0xe5,0x00,0xd8,0xdc,0xe4,0x00,0xd4,0xda,0xe5,0x00,0xb6,0xca,0xef,0x00, 0xcd,0xdc,0xf8,0x00,0xfd,0xfe,0xff,0x00,0xf6,0xfa,0xff,0x00,0xf7,0xfa,0xff, 0x00,0xf7,0xfb,0xff,0x00,0xf5,0xfa,0xff,0x00,0xc5,0xd4,0xf1,0x00,0xb9,0xc9, 0xed,0x00,0x84,0xba,0xca,0xee,0x00,0x0a,0xbf,0xcf,0xf0,0x07,0x5e,0x80,0xc9, 0x43,0x3d,0x68,0xc9,0x53,0x7c,0xac,0xf8,0x50,0xb8,0xe1,0xfc,0x50,0x57,0x7b, 0xc3,0x50,0x3c,0x63,0xb9,0x55,0x75,0x98,0xdf,0x3e,0xcc,0xdd,0xfb,0x05,0xc9, 0xda,0xf8,0x00,0x83,0xc8,0xd9,0xf8,0x00,0x83,0xff,0xff,0xff,0x00,0x18,0xfb, 0xfb,0xfb,0x00,0xce,0xd5,0xdf,0x0e,0x42,0x57,0x84,0x49,0x29,0x46,0x8c,0x54, 0x60,0x84,0xcb,0x50,0xbc,0xe2,0xfe,0x50,0x69,0x91,0xd8,0x50,0x4a,0x70,0xca, 0x50,0x4f,0x77,0xcb,0x50,0x4a,0x70,0xc1,0x50,0x44,0x6b,0xbd,0x53,0x4c,0x6d, 0xb6,0x4c,0x89,0x9c,0xbf,0x2a,0xae,0xb4,0xbf,0x19,0x43,0x4b,0x5a,0x44,0x28, 0x3a,0x5f,0x52,0x42,0x63,0xab,0x50,0x51,0x7a,0xd6,0x50,0x52,0x7d,0xd9,0x50, 0x52,0x7c,0xd6,0x50,0x4e,0x75,0xcb,0x50,0x44,0x6b,0xc4,0x54,0x7d,0x98,0xcc, 0x34,0x8e,0xa4,0xd0,0x00,0x83,0x8b,0xa2,0xcf,0x00,0x03,0x87,0xa0,0xce,0x00, 0x9e,0xb0,0xd5,0x00,0xc1,0xca,0xdf,0x00,0x84,0xbc,0xc7,0xde,0x00,0x2a,0xc0, 0xcb,0xe1,0x00,0xa9,0xb7,0xd2,0x14,0x3e,0x59,0x95,0x4e,0x49,0x71,0xca,0x51, 0x66,0x98,0xff,0x4f,0x55,0x84,0xe7,0x52,0x38,0x5b,0xa8,0x57,0x21,0x3d,0x7c, 0x5e,0x27,0x3d,0x6d,0x56,0x36,0x49,0x6d,0x4e,0x31,0x44,0x6d,0x52,0x31,0x46, 0x73,0x52,0x34,0x4a,0x7a,0x52,0x39,0x4e,0x7f,0x50,0x4e,0x63,0x91,0x44,0x7b, 0x8c,0xb0,0x2d,0xbe,0xc7,0xd9,0x14,0xcf,0xd6,0xe3,0x03,0xce,0xd7,0xe5,0x00, 0xe0,0xe4,0xec,0x00,0xb8,0xc3,0xd6,0x00,0xd4,0xd9,0xe2,0x00,0xef,0xee,0xf1, 0x00,0xc8,0xd6,0xee,0x00,0xb7,0xcb,0xed,0x00,0xba,0xcc,0xed,0x00,0xc1,0xd3, 0xef,0x00,0x8a,0xa8,0xe2,0x00,0x1b,0x4b,0xc3,0x56,0x16,0x49,0xc6,0xf8,0x1b, 0x4f,0xce,0xfd,0x21,0x5b,0xeb,0xfd,0x27,0x6a,0xff,0xfd,0x30,0x77,0xff,0xfd, 0x3b,0x89,0xff,0xfd,0x51,0xaa,0xfe,0xfe,0xca,0xf1,0xfe,0xff,0xfa,0xfb,0xff, 0xff,0x6f,0xa0,0xff,0xff,0x2a,0x75,0xff,0xff,0x37,0x7f,0xfe,0xff,0x38,0x7f, 0xff,0xff,0x83,0x37,0x7f,0xff,0xff,0x15,0x37,0x7f,0xfe,0xff,0x38,0x7f,0xfe, 0xff,0x35,0x7d,0xff,0xef,0x40,0x85,0xff,0x31,0xcf,0xe1,0xff,0x00,0xff,0xff, 0xfe,0x00,0xfd,0xfd,0xfe,0x00,0xfe,0xff,0xff,0x00,0xf5,0xf7,0xf9,0x00,0xd2, 0xd7,0xe3,0x00,0xd4,0xd9,0xe4,0x00,0xd3,0xd8,0xe3,0x00,0xca,0xd3,0xe4,0x00, 0xb1,0xc6,0xef,0x00,0xce,0xdd,0xf8,0x00,0xff,0xff,0xff,0x00,0xfb,0xfd,0xff, 0x00,0xf7,0xfb,0xff,0x00,0xf2,0xf6,0xfc,0x00,0xef,0xf4,0xfc,0x00,0x9b,0xb3, 0xe1,0x00,0x85,0x9a,0xb3,0xe1,0x00,0x0a,0x9f,0xb6,0xe3,0x0c,0x52,0x74,0xbd, 0x48,0x41,0x68,0xc3,0x52,0x71,0xa4,0xf9,0x4f,0x7f,0xb3,0xf6,0x4f,0x4a,0x6f, 0xbf,0x4f,0x3f,0x67,0xbd,0x55,0x86,0xa6,0xe5,0x35,0xd7,0xe5,0xfc,0x00,0xca, 0xdb,0xf8,0x00,0x83,0xca,0xdc,0xf8,0x00,0x83,0xff,0xff,0xff,0x00,0x18,0xf3, 0xf4,0xf7,0x00,0x90,0x9b,0xb5,0x28,0x27,0x42,0x7a,0x54,0x3b,0x5d,0xab,0x51, 0xad,0xca,0xf2,0x50,0x9a,0xb9,0xe7,0x50,0x44,0x6c,0xc5,0x50,0x53,0x79,0xd1, 0x50,0x4c,0x72,0xc4,0x50,0x46,0x6c,0xbe,0x52,0x4e,0x71,0xbb,0x4c,0xb5,0xbf, 0xd6,0x1a,0xd6,0xd8,0xdc,0x00,0xf2,0xf4,0xf5,0x00,0x75,0x7e,0x94,0x34,0x25, 0x39,0x63,0x54,0x3a,0x58,0x98,0x50,0x4d,0x75,0xce,0x50,0x53,0x7e,0xda,0x50, 0x53,0x7d,0xd7,0x50,0x4e,0x75,0xcd,0x50,0x45,0x6d,0xc6,0x54,0x72,0x90,0xcb, 0x3a,0x7f,0x99,0xcd,0x01,0x83,0x7d,0x98,0xcd,0x00,0x03,0x77,0x94,0xcb,0x00, 0x99,0xae,0xd6,0x00,0xce,0xd7,0xe6,0x00,0x84,0xc7,0xd1,0xe4,0x00,0x2d,0xcc, 0xd5,0xe7,0x00,0xb3,0xbf,0xd7,0x13,0x40,0x5c,0x95,0x4d,0x43,0x69,0xbe,0x52, 0x43,0x6a,0xc1,0x57,0x21,0x3d,0x81,0x5f,0x15,0x2f,0x6b,0x62,0x12,0x2e,0x6c, 0x64,0x21,0x3d,0x7b,0x5b,0x35,0x52,0x92,0x50,0x3b,0x5d,0xa6,0x51,0x40,0x65, 0xb5,0x50,0x44,0x6a,0xc0,0x50,0x46,0x6d,0xc3,0x51,0x42,0x69,0xc0,0x53,0x3e, 0x64,0xb7,0x54,0x46,0x68,0xb2,0x4e,0x67,0x83,0xbc,0x3e,0xa8,0xb7,0xd3,0x22, 0xd9,0xde,0xe8,0x06,0xbe,0xc7,0xd8,0x00,0xd2,0xd8,0xe2,0x00,0xf6,0xf3,0xf2, 0x00,0xcf,0xda,0xf0,0x00,0xb8,0xcc,0xee,0x00,0xbc,0xcd,0xee,0x00,0xc8,0xd7, 0xf1,0x00,0x74,0x96,0xda,0x00,0x13,0x44,0xbc,0x76,0x17,0x47,0xc0,0xfe,0x1b, 0x4e,0xcd,0xfd,0x22,0x5c,0xec,0xfd,0x28,0x6b,0xff,0xfd,0x31,0x79,0xfe,0xfd, 0x3a,0x8a,0xfe,0xfd,0x5d,0xb1,0xfe,0xfe,0xe9,0xfb,0xff,0xff,0xe9,0xed,0xfe, 0xff,0x43,0x81,0xff,0xff,0x2f,0x78,0xfe,0xff,0x37,0x7f,0xfe,0xff,0x37,0x7e, 0xff,0xff,0x36,0x7e,0xfe,0xff,0x37,0x7e,0xfe,0xff,0x36,0x7f,0xfe,0xff,0x82, 0x37,0x7f,0xff,0xff,0x13,0x2f,0x79,0xfe,0xb2,0x6b,0xa2,0xfe,0x02,0xfb,0xfc, 0xfe,0x00,0xfc,0xfb,0xfe,0x00,0xfb,0xfb,0xfe,0x00,0xfc,0xfc,0xff,0x00,0xf4, 0xf5,0xf8,0x00,0xd3,0xd7,0xe2,0x00,0xd4,0xd9,0xe4,0x00,0xd3,0xd8,0xe3,0x00, 0xca,0xd3,0xe4,0x00,0xaf,0xc5,0xf0,0x00,0xd0,0xdf,0xfb,0x00,0xf5,0xf6,0xf7, 0x00,0xe6,0xea,0xf0,0x00,0xc2,0xcd,0xdf,0x00,0xd3,0xd8,0xe6,0x00,0xcf,0xd7, 0xe7,0x00,0x8e,0xa6,0xda,0x00,0x85,0x8e,0xa7,0xda,0x00,0x09,0x92,0xab,0xdc, 0x0e,0x4f,0x70,0xb8,0x49,0x41,0x67,0xbe,0x52,0x5d,0x8e,0xf0,0x51,0x59,0x88, 0xe4,0x55,0x3f,0x64,0xb1,0x54,0x3e,0x65,0xb6,0x53,0x9a,0xb3,0xe4,0x2a,0xf0, 0xf5,0xfe,0x00,0x84,0xe4,0xed,0xfb,0x00,0x83,0xff,0xff,0xff,0x00,0x18,0xc0, 0xc7,0xd5,0x05,0x5f,0x6f,0x95,0x3e,0x27,0x45,0x84,0x55,0x60,0x87,0xc9,0x50, 0xb4,0xdc,0xfb,0x50,0x57,0x7e,0xce,0x50,0x49,0x70,0xc8,0x50,0x50,0x76,0xcb, 0x50,0x48,0x6e,0xbf,0x50,0x41,0x67,0xb9,0x53,0x9c,0xaf,0xd2,0x27,0xf5,0xf4, 0xf1,0x00,0xe3,0xe4,0xe6,0x00,0xf5,0xf8,0xf9,0x00,0x6a,0x7b,0x9e,0x38,0x2d, 0x48,0x80,0x54,0x43,0x68,0xb8,0x50,0x54,0x7f,0xdf,0x50,0x52,0x7d,0xd7,0x50, 0x55,0x7c,0xd8,0x50,0x4f,0x76,0xcd,0x50,0x43,0x6b,0xc4,0x54,0x7c,0x97,0xd0, 0x35,0x8c,0xa4,0xd4,0x00,0x83,0x89,0xa1,0xd3,0x00,0x03,0x83,0x9b,0xd1,0x00, 0xab,0xbc,0xde,0x00,0xeb,0xee,0xf2,0x00,0x83,0xe3,0xe8,0xf0,0x00,0x33,0xe4, 0xe9,0xf0,0x00,0xec,0xf0,0xf5,0x00,0xd3,0xda,0xe5,0x0a,0x42,0x59,0x87,0x4a, 0x18,0x35,0x76,0x60,0x15,0x31,0x72,0x63,0x18,0x34,0x77,0x62,0x1f,0x3e,0x87, 0x5f,0x28,0x4c,0x9b,0x5b,0x3c,0x64,0xbc,0x54,0x4b,0x76,0xd4,0x50,0x4c,0x77, 0xd5,0x50,0x4b,0x74,0xcf,0x50,0x49,0x71,0xc7,0x50,0x48,0x70,0xc4,0x50,0x48, 0x70,0xc3,0x50,0x4a,0x70,0xc6,0x50,0x44,0x6b,0xc0,0x51,0x3b,0x61,0xb3,0x55, 0x3a,0x5d,0xaa,0x54,0x75,0x8c,0xba,0x3c,0xbc,0xc5,0xd6,0x0e,0xd6,0xda,0xe3, 0x00,0xf3,0xf2,0xf2,0x00,0xde,0xe2,0xf0,0x00,0xcb,0xd6,0xf1,0x00,0xcb,0xd7, 0xf1,0x00,0xda,0xe3,0xf6,0x00,0x6b,0x8b,0xd4,0x00,0x0c,0x3d,0xb6,0x90,0x17, 0x47,0xbc,0xfe,0x1b,0x4f,0xc9,0xfd,0x21,0x5c,0xeb,0xfe,0x28,0x6b,0xff,0xfd, 0x31,0x79,0xff,0xfd,0x37,0x88,0xff,0xfd,0x6c,0xbb,0xff,0xfe,0xf4,0xfe,0xfd, 0xff,0xbf,0xd4,0xff,0xff,0x2f,0x75,0xff,0xff,0x34,0x7b,0xfe,0xff,0x35,0x7d, 0xff,0xff,0x36,0x7e,0xff,0xff,0x36,0x7e,0xfe,0xff,0x35,0x7d,0xfe,0xff,0x37, 0x7d,0xfe,0xff,0x37,0x7e,0xfe,0xff,0x37,0x7e,0xff,0xff,0x2e,0x78,0xff,0x79, 0x96,0xbe,0xff,0x00,0xda,0xe8,0xff,0x00,0x82,0xd7,0xe6,0xff,0x00,0x0f,0xd7, 0xe7,0xff,0x00,0xd2,0xe3,0xfc,0x00,0xca,0xd5,0xeb,0x00,0xd2,0xd7,0xe1,0x00, 0xd6,0xdb,0xe4,0x00,0xcb,0xd4,0xe6,0x00,0xc2,0xd2,0xef,0x00,0xcd,0xd7,0xea, 0x00,0xd2,0xd7,0xdc,0x00,0xad,0xb6,0xc5,0x00,0x85,0x97,0xba,0x00,0xdc,0xe0, 0xed,0x00,0xd2,0xd8,0xe7,0x00,0xbf,0xcd,0xe8,0x00,0xbc,0xcb,0xea,0x00,0x84, 0xbc,0xcc,0xea,0x00,0x09,0xc2,0xd1,0xee,0x08,0x61,0x7c,0xb5,0x3f,0x27,0x45, 0x8b,0x59,0x2c,0x53,0xb1,0x5e,0x29,0x4f,0xa7,0x61,0x22,0x3d,0x7c,0x5c,0x3d, 0x5c,0x9f,0x51,0xbc,0xcd,0xeb,0x1e,0xff,0xff,0xff,0x00,0x84,0xfb,0xfd,0xfe, 0x00,0x83,0xff,0xff,0xff,0x00,0x18,0xa6,0xb1,0xc2,0x10,0x40,0x57,0x83,0x4a, 0x30,0x4e,0x90,0x53,0x73,0x9d,0xe1,0x50,0x80,0xae,0xed,0x50,0x43,0x69,0xc2, 0x50,0x4f,0x75,0xc9,0x50,0x4c,0x72,0xc4,0x50,0x42,0x68,0xbb,0x53,0x52,0x73, 0xb8,0x49,0xe0,0xe5,0xec,0x0b,0xf6,0xf8,0xf4,0x00,0xc9,0xd0,0xdc,0x00,0xa9, 0xb5,0xcb,0x12,0x42,0x5b,0x8c,0x4b,0x32,0x53,0x9d,0x52,0x6e,0x96,0xe1,0x50, 0x81,0xac,0xf1,0x50,0x51,0x7b,0xd6,0x50,0x55,0x7f,0xd9,0x50,0x4c,0x74,0xca, 0x50,0x42,0x6c,0xc4,0x54,0x98,0xad,0xda,0x28,0xb0,0xbf,0xe0,0x00,0x83,0xac, 0xbc,0xdf,0x00,0x03,0xa7,0xb9,0xde,0x00,0xc5,0xd0,0xe7,0x00,0xf4,0xf5,0xf7, 0x00,0x82,0xee,0xf0,0xf5,0x00,0x34,0xf0,0xf1,0xf6,0x00,0xe5,0xe9,0xf0,0x00, 0xd3,0xda,0xe6,0x00,0xb9,0xc3,0xd5,0x15,0x38,0x4e,0x7f,0x4d,0x1d,0x37,0x72, 0x5c,0x26,0x45,0x8b,0x5a,0x32,0x56,0xa4,0x56,0x42,0x69,0xc1,0x52,0x53,0x80, 0xe4,0x50,0x53,0x81,0xe3,0x50,0x4b,0x75,0xcf,0x50,0x47,0x6e,0xc1,0x50,0x47, 0x6c,0xbe,0x50,0x46,0x6e,0xbd,0x50,0x46,0x6d,0xbe,0x50,0x47,0x6c,0xbe,0x50, 0x46,0x6d,0xc0,0x50,0x48,0x6f,0xc3,0x50,0x46,0x6c,0xbd,0x50,0x40,0x65,0xb7, 0x51,0x36,0x5b,0xab,0x56,0x68,0x7f,0xb3,0x41,0xd6,0xda,0xe3,0x0a,0xf1,0xf1, 0xf3,0x00,0xf4,0xf3,0xf2,0x00,0xd8,0xe0,0xf1,0x00,0xd1,0xdb,0xf1,0x00,0xe1, 0xe8,0xf6,0x00,0x65,0x84,0xcc,0x01,0x08,0x38,0xae,0xa5,0x17,0x45,0xb7,0xfe, 0x1c,0x4c,0xc7,0xfd,0x22,0x5c,0xeb,0xfd,0x27,0x6a,0xff,0xfd,0x31,0x79,0xff, 0xfd,0x36,0x86,0xfe,0xfd,0x72,0xc3,0xfe,0xfe,0xd8,0xff,0xfc,0xff,0x88,0xbf, 0xff,0xff,0x2d,0x75,0xfe,0xff,0x35,0x7c,0xfe,0xff,0x35,0x7d,0xfe,0xff,0x36, 0x7b,0xfe,0xff,0x35,0x7c,0xff,0xff,0x36,0x7d,0xfe,0xff,0x35,0x7d,0xfe,0xff, 0x36,0x7d,0xff,0xff,0x35,0x7c,0xfe,0xff,0x32,0x7b,0xfe,0x52,0xb3,0xd1,0xfe, 0x00,0xca,0xde,0xfe,0x00,0x83,0xc5,0xdb,0xfe,0x00,0x0e,0xc2,0xda,0xff,0x00, 0xd6,0xe6,0xfd,0x00,0xf3,0xf4,0xf7,0x00,0xb3,0xc1,0xda,0x00,0xb2,0xbd,0xd7, 0x00,0xa5,0xb0,0xcb,0x00,0xcd,0xd3,0xdb,0x00,0xcd,0xd2,0xda,0x00,0xb3,0xbc, 0xca,0x00,0x8b,0x9c,0xbe,0x00,0xdb,0xdf,0xec,0x00,0xd5,0xdb,0xe7,0x00,0xd9, 0xe0,0xed,0x00,0xb3,0xc8,0xf1,0x00,0x84,0xb6,0xcb,0xf1,0x00,0x09,0xbc,0xd0, 0xf4,0x0e,0x58,0x7b,0xc8,0x46,0x39,0x5e,0xad,0x55,0x48,0x6e,0xb9,0x57,0x3e, 0x60,0xa8,0x55,0x42,0x64,0xaf,0x52,0x47,0x71,0xcc,0x54,0xae,0xc6,0xf6,0x28, 0xff,0xff,0xff,0x00,0x84,0xfc,0xfd,0xff,0x00,0x83,0xff,0xff,0xff,0x00,0x18, 0x9f,0xa9,0xbb,0x1a,0x30,0x46,0x75,0x50,0x38,0x57,0x9b,0x52,0x6e,0x9b,0xee, 0x50,0x5c,0x86,0xdd,0x50,0x48,0x6e,0xc3,0x50,0x51,0x78,0xcd,0x50,0x4b,0x71, 0xc3,0x50,0x3d,0x64,0xb9,0x56,0x71,0x8a,0xc0,0x3a,0xe5,0xea,0xed,0x03,0xe4, 0xe8,0xec,0x00,0xca,0xd2,0xdf,0x06,0x62,0x74,0x9d,0x3b,0x2a,0x47,0x89,0x54, 0x44,0x6a,0xbf,0x50,0xb9,0xd4,0xfc,0x50,0x91,0xb1,0xe9,0x50,0x4d,0x78,0xd7, 0x50,0x50,0x78,0xd1,0x50,0x47,0x6f,0xc7,0x52,0x4c,0x73,0xc4,0x4e,0xc7,0xd1, 0xe7,0x12,0xe3,0xe7,0xf0,0x00,0x83,0xde,0xe3,0xef,0x00,0x03,0xdc,0xe2,0xee, 0x00,0xe3,0xe7,0xf1,0x00,0xec,0xef,0xf4,0x00,0x82,0xeb,0xee,0xf4,0x00,0x34, 0xec,0xef,0xf5,0x00,0xe3,0xe7,0xef,0x00,0xb1,0xbc,0xd3,0x14,0x45,0x5f,0x91, 0x47,0x32,0x4e,0x8a,0x52,0x3c,0x5d,0xa4,0x4f,0x40,0x65,0xbd,0x50,0x53,0x7f, 0xde,0x4f,0x63,0x97,0xfa,0x4f,0x55,0x81,0xe3,0x50,0x48,0x6e,0xc1,0x50,0x47, 0x69,0xbb,0x50,0x45,0x6c,0xbb,0x50,0x46,0x6d,0xbd,0x50,0x47,0x6c,0xbe,0x50, 0x46,0x6c,0xbf,0x50,0x46,0x6d,0xbf,0x50,0x47,0x6d,0xc0,0x50,0x48,0x6d,0xc1, 0x50,0x47,0x6e,0xc0,0x50,0x45,0x69,0xba,0x50,0x42,0x65,0xb5,0x50,0x38,0x5c, 0xab,0x55,0x87,0x99,0xc0,0x31,0xf0,0xef,0xf1,0x00,0xe8,0xe8,0xec,0x00,0xbb, 0xca,0xe8,0x00,0xb3,0xc4,0xe8,0x00,0xc3,0xd2,0xed,0x00,0x57,0x77,0xc4,0x04, 0x09,0x35,0xa7,0xb3,0x16,0x43,0xb0,0xfd,0x1b,0x4b,0xc4,0xfd,0x21,0x5b,0xe8, 0xfd,0x27,0x69,0xff,0xfd,0x2e,0x76,0xff,0xfd,0x36,0x83,0xfe,0xfd,0x71,0xc9, 0xfe,0xfe,0xb1,0xff,0xfa,0xff,0x62,0xae,0xfe,0xff,0x2f,0x73,0xff,0xff,0x34, 0x7b,0xff,0xff,0x35,0x7a,0xfe,0xff,0x35,0x7a,0xff,0xff,0x35,0x7b,0xfe,0xff, 0x35,0x7b,0xff,0xff,0x34,0x7b,0xff,0xff,0x36,0x7d,0xfe,0xff,0x31,0x78,0xfe, 0xf3,0x3d,0x82,0xfe,0x36,0xba,0xd5,0xfe,0x00,0xd3,0xe4,0xfe,0x00,0x82,0xce, 0xe1,0xfe,0x00,0x11,0xcd,0xe0,0xfe,0x00,0xd6,0xe6,0xfe,0x00,0xfa,0xfb,0xff, 0x00,0xfd,0xff,0xff,0x00,0xa4,0xb6,0xd6,0x00,0xa8,0xb5,0xd1,0x00,0x90,0x9e, 0xbe,0x00,0xd0,0xd6,0xdf,0x00,0xce,0xd3,0xdb,0x00,0xb3,0xbc,0xca,0x00,0x8b, 0x9c,0xbe,0x00,0xdb,0xdf,0xec,0x00,0xd3,0xd9,0xe7,0x00,0xe0,0xe5,0xed,0x00, 0xbc,0xcc,0xeb,0x00,0x92,0xae,0xe7,0x00,0x9a,0xb4,0xe8,0x00,0x82,0x9a,0xb3, 0xe8,0x00,0x09,0x9e,0xb7,0xea,0x16,0x4a,0x6f,0xc2,0x4e,0x49,0x75,0xd1,0x52, 0x89,0xbe,0xfc,0x4f,0x6e,0x9a,0xe4,0x50,0x45,0x6a,0xbe,0x50,0x43,0x6b,0xc1, 0x53,0x93,0xb0,0xe7,0x26,0xd5,0xe1,0xf9,0x00,0x84,0xcc,0xdc,0xf7,0x00,0x83, 0xff,0xff,0xff,0x00,0x18,0xad,0xb2,0xbb,0x1e,0x1f,0x32,0x56,0x55,0x30,0x4e, 0x91,0x55,0x5c,0x87,0xe3,0x52,0x4a,0x73,0xca,0x53,0x41,0x69,0xbf,0x54,0x41, 0x69,0xbe,0x55,0x41,0x67,0xb9,0x56,0x32,0x58,0xac,0x5a,0x8e,0xa1,0xc8,0x2e, 0xd4,0xd9,0xe4,0x00,0xe3,0xe7,0xed,0x01,0x80,0x91,0xb0,0x30,0x2c,0x46,0x81, 0x55,0x35,0x59,0xa9,0x51,0x82,0xac,0xea,0x50,0xb4,0xd7,0xf7,0x50,0x59,0x81, 0xd8,0x50,0x4f,0x79,0xd4,0x50,0x4b,0x73,0xc9,0x50,0x3e,0x67,0xc0,0x56,0x7c, 0x97,0xcd,0x37,0xdc,0xe2,0xec,0x03,0xe1,0xe6,0xef,0x00,0x83,0xdf,0xe5,0xee, 0x00,0x14,0xe7,0xeb,0xf2,0x00,0xee,0xef,0xf5,0x00,0xed,0xef,0xf5,0x00,0xed, 0xf0,0xf5,0x00,0xec,0xef,0xf5,0x00,0xf4,0xf5,0xf9,0x00,0xd6,0xdc,0xe9,0x0b, 0x50,0x68,0x99,0x44,0x2c,0x4a,0x89,0x54,0x3c,0x5f,0xa8,0x50,0x40,0x69,0xc7, 0x50,0x5f,0x8e,0xed,0x50,0x7b,0xb0,0xff,0x50,0x57,0x82,0xdb,0x50,0x43,0x68, 0xbb,0x50,0x45,0x6b,0xbc,0x50,0x47,0x6d,0xbe,0x50,0x47,0x6e,0xc0,0x50,0x48, 0x6e,0xbf,0x50,0x47,0x6f,0xbf,0x50,0x82,0x47,0x6e,0xc0,0x50,0x82,0x46,0x6d, 0xbf,0x50,0x17,0x47,0x6e,0xc2,0x50,0x45,0x6c,0xbc,0x50,0x43,0x67,0xb6,0x50, 0x3d,0x64,0xb3,0x52,0x4f,0x6d,0xb1,0x4c,0xb7,0xc1,0xd6,0x0c,0xc5,0xcb,0xdc, 0x00,0xb8,0xc6,0xe4,0x00,0xa2,0xb7,0xe1,0x00,0xaf,0xc2,0xe6,0x00,0x4d,0x6e, 0xbd,0x0a,0x09,0x34,0xa1,0xbe,0x16,0x40,0xab,0xfd,0x1a,0x4a,0xc0,0xfd,0x20, 0x5a,0xe5,0xfd,0x26,0x68,0xfe,0xfd,0x2d,0x74,0xff,0xfd,0x37,0x83,0xff,0xfd, 0x6b,0xc3,0xff,0xfe,0x91,0xf2,0xfe,0xff,0x4c,0x9a,0xfe,0xff,0x30,0x75,0xfe, 0xff,0x34,0x7b,0xff,0xff,0x82,0x34,0x7a,0xfe,0xff,0x08,0x35,0x7a,0xfe,0xff, 0x34,0x7a,0xfe,0xff,0x34,0x7b,0xfe,0xff,0x35,0x7b,0xff,0xff,0x2e,0x77,0xff, 0xe5,0x43,0x87,0xff,0x24,0xd1,0xe2,0xff,0x00,0xec,0xf2,0xff,0x00,0x82,0xe7, 0xf0,0xff,0x00,0x11,0xe6,0xef,0xff,0x00,0xee,0xf4,0xff,0x00,0xfb,0xfb,0xfe, 0x00,0xfa,0xfd,0xff,0x00,0xa7,0xb8,0xd7,0x00,0xaa,0xb7,0xd2,0x00,0x93,0xa1, 0xc0,0x00,0xd0,0xd6,0xdf,0x00,0xce,0xd3,0xdb,0x00,0xb3,0xbc,0xca,0x00,0x8b, 0x9c,0xbe,0x00,0xdb,0xdf,0xec,0x00,0xd3,0xd9,0xe7,0x00,0xe2,0xe6,0xed,0x00, 0xcd,0xd7,0xeb,0x00,0x96,0xb0,0xe6,0x00,0x90,0xac,0xe5,0x00,0x82,0x92,0xae, 0xe5,0x00,0x09,0x97,0xb1,0xe8,0x18,0x49,0x6c,0xba,0x4e,0x40,0x66,0xbc,0x52, 0x5e,0x8e,0xf5,0x50,0x58,0x81,0xd9,0x50,0x41,0x63,0xad,0x51,0x46,0x6d,0xc0, 0x52,0x94,0xb0,0xeb,0x22,0xbe,0xd2,0xf8,0x00,0x84,0xb8,0xcc,0xf6,0x00,0x83, 0xff,0xff,0xff,0x00,0x17,0xd9,0xdb,0xdd,0x0a,0x7e,0x84,0x91,0x2d,0x40,0x54, 0x82,0x4a,0x40,0x62,0xac,0x52,0x4e,0x6d,0xac,0x4c,0x5c,0x75,0xab,0x46,0x65, 0x7c,0xaa,0x3f,0x6b,0x7f,0xa8,0x38,0x7e,0x8f,0xb1,0x31,0xc0,0xc9,0xd8,0x12, 0xff,0xfe,0xfe,0x00,0x97,0xa5,0xbf,0x25,0x2e,0x48,0x80,0x52,0x34,0x54,0x9e, 0x51,0x66,0x92,0xdc,0x50,0xaa,0xda,0xfd,0x50,0x60,0x8c,0xdc,0x50,0x4e,0x77, 0xd2,0x50,0x4d,0x75,0xcb,0x50,0x44,0x6b,0xc3,0x53,0x4e,0x72,0xbe,0x4c,0xbc, 0xca,0xe0,0x14,0xdf,0xe6,0xed,0x00,0x83,0xd6,0xdf,0xea,0x00,0x02,0xd9,0xe1, 0xeb,0x00,0xe1,0xe6,0xef,0x00,0x83,0xe1,0xe5,0xef,0x00,0x2f,0xe3,0xe7,0xf0, 0x00,0xe3,0xe7,0xf0,0x03,0x73,0x87,0xae,0x35,0x28,0x46,0x86,0x55,0x3c,0x5e, 0xa8,0x50,0x40,0x69,0xc7,0x50,0x64,0x96,0xed,0x50,0xa3,0xd9,0xff,0x50,0x65, 0x90,0xda,0x50,0x41,0x65,0xb8,0x50,0x45,0x6a,0xba,0x50,0x43,0x6a,0xb9,0x50, 0x44,0x69,0xb8,0x50,0x46,0x6a,0xbb,0x50,0x3f,0x66,0xb8,0x54,0x42,0x69,0xbe, 0x52,0x47,0x6d,0xc0,0x50,0x47,0x6c,0xc1,0x50,0x46,0x6d,0xc0,0x50,0x46,0x6c, 0xbd,0x50,0x47,0x6e,0xc1,0x50,0x47,0x6d,0xbe,0x50,0x44,0x68,0xb8,0x50,0x41, 0x66,0xb5,0x51,0x3b,0x60,0xb0,0x53,0x9c,0xae,0xd0,0x24,0xf3,0xf6,0xf5,0x00, 0xe7,0xeb,0xef,0x00,0xa0,0xb5,0xde,0x00,0xa9,0xbd,0xe3,0x00,0x4a,0x6c,0xbb, 0x0b,0x09,0x33,0x9e,0xc0,0x15,0x3e,0xa6,0xfd,0x19,0x49,0xbc,0xfd,0x20,0x56, 0xe1,0xfd,0x26,0x66,0xfc,0xfd,0x2d,0x72,0xff,0xfd,0x37,0x82,0xfe,0xfd,0x64, 0xbc,0xff,0xfe,0x79,0xd4,0xff,0xff,0x3f,0x8a,0xfe,0xff,0x31,0x75,0xfe,0xff, 0x34,0x7a,0xfe,0xff,0x32,0x79,0xff,0xff,0x34,0x79,0xff,0xff,0x33,0x79,0xff, 0xff,0x33,0x7a,0xfe,0xff,0x82,0x34,0x7b,0xff,0xff,0x04,0x2b,0x75,0xff,0xda, 0x48,0x8a,0xff,0x19,0xdf,0xeb,0xff,0x00,0xfb,0xfc,0xff,0x00,0x82,0xf6,0xf9, 0xff,0x00,0x1c,0xf5,0xf9,0xff,0x00,0xfd,0xfd,0xfe,0x00,0xfa,0xfa,0xfe,0x00, 0xfa,0xfd,0xff,0x00,0xa7,0xb8,0xd7,0x00,0xa9,0xb6,0xd2,0x00,0x97,0xa4,0xc2, 0x00,0xdc,0xe1,0xe7,0x02,0xda,0xde,0xe2,0x04,0xba,0xc2,0xce,0x00,0x8a,0x9c, 0xbe,0x00,0xdb,0xdf,0xec,0x00,0xd3,0xd9,0xe7,0x00,0xdd,0xe3,0xec,0x00,0xea, 0xec,0xee,0x00,0xa7,0xbc,0xe5,0x00,0x7f,0xa0,0xe0,0x00,0x88,0xa8,0xe1,0x00, 0x88,0xa7,0xe1,0x00,0x8c,0xab,0xe3,0x1a,0x47,0x6b,0xba,0x4f,0x43,0x6a,0xc0, 0x51,0x5e,0x8e,0xf5,0x50,0x56,0x7f,0xd9,0x50,0x42,0x64,0xb0,0x51,0x46,0x6d, 0xc2,0x52,0xa1,0xba,0xf0,0x1f,0xd4,0xe1,0xfc,0x00,0x84,0xcd,0xdb,0xfa,0x00, 0x83,0xff,0xff,0xff,0x00,0x17,0xf2,0xf2,0xf2,0x00,0xc7,0xc9,0xcd,0x00,0xbf, 0xc6,0xd2,0x0e,0xad,0xb6,0xcc,0x18,0x85,0x93,0xac,0x10,0x7a,0x89,0xa5,0x0a, 0x94,0x9e,0xb1,0x06,0x9a,0xa1,0xae,0x03,0xca,0xce,0xcf,0x00,0xca,0xd1,0xda, 0x00,0xa0,0xac,0xc5,0x1b,0x37,0x4f,0x85,0x4f,0x30,0x4e,0x95,0x52,0x55,0x7e, 0xd1,0x50,0xa6,0xd9,0xff,0x50,0x6c,0x9a,0xe0,0x50,0x4b,0x74,0xd0,0x50,0x50, 0x77,0xcd,0x50,0x48,0x6f,0xc4,0x51,0x3e,0x64,0xb9,0x54,0x96,0xaa,0xd1,0x2a, 0xf5,0xf5,0xf5,0x00,0xed,0xef,0xf3,0x00,0x82,0xec,0xee,0xf2,0x00,0x02,0xee, 0xef,0xf3,0x00,0xdc,0xe1,0xec,0x00,0x84,0xd5,0xda,0xe9,0x00,0x2a,0xe0,0xe4, 0xef,0x00,0xa9,0xb4,0xcf,0x1c,0x2f,0x4c,0x87,0x52,0x35,0x57,0x9e,0x52,0x3f, 0x69,0xc3,0x50,0x5a,0x88,0xe9,0x50,0xd0,0xee,0xff,0x50,0x92,0xbb,0xe5,0x50, 0x41,0x66,0xbc,0x50,0x45,0x6a,0xba,0x50,0x44,0x68,0xb8,0x50,0x43,0x66,0xb3, 0x50,0x40,0x64,0xb2,0x50,0x3d,0x63,0xb3,0x52,0x39,0x58,0x9c,0x51,0x25,0x39, 0x65,0x56,0x29,0x3c,0x5f,0x52,0x35,0x4e,0x82,0x50,0x40,0x62,0xae,0x50,0x46, 0x6d,0xbe,0x50,0x47,0x6e,0xc0,0x50,0x48,0x6d,0xbf,0x50,0x44,0x69,0xb9,0x50, 0x41,0x66,0xb7,0x50,0x37,0x5d,0xb0,0x55,0x88,0x9e,0xcd,0x31,0xeb,0xee,0xf2, 0x00,0xdc,0xe1,0xec,0x00,0xa0,0xb4,0xdc,0x00,0xaa,0xbc,0xe0,0x00,0x4a,0x6a, 0xb7,0x0b,0x08,0x32,0x9a,0xc0,0x15,0x3c,0xa2,0xfd,0x18,0x47,0xb7,0xfd,0x1e, 0x55,0xdb,0xfd,0x24,0x63,0xf9,0xfd,0x2b,0x6e,0xff,0xfd,0x35,0x80,0xfe,0xfd, 0x5b,0xb2,0xfe,0xfe,0x66,0xbf,0xff,0xff,0x3a,0x82,0xff,0xff,0x32,0x77,0xfe, 0xff,0x82,0x33,0x78,0xff,0xff,0x27,0x32,0x79,0xff,0xff,0x33,0x78,0xff,0xff, 0x32,0x7a,0xfe,0xff,0x33,0x79,0xff,0xff,0x35,0x79,0xfe,0xff,0x2c,0x73,0xfe, 0xd4,0x4c,0x8c,0xff,0x14,0xe7,0xef,0xfe,0x00,0xff,0xff,0xfe,0x00,0xfc,0xfc, 0xfe,0x00,0xfa,0xfa,0xfe,0x00,0xfb,0xfb,0xfe,0x00,0xfd,0xfc,0xfe,0x00,0xfa, 0xfa,0xfe,0x00,0xfb,0xfe,0xff,0x00,0xa9,0xba,0xd8,0x00,0xb4,0xbf,0xd7,0x0e, 0x71,0x83,0xa9,0x29,0x63,0x74,0x97,0x3b,0x5f,0x71,0x95,0x3e,0x6f,0x80,0xa4, 0x30,0x92,0xa2,0xc1,0x1a,0xde,0xe2,0xee,0x05,0xd5,0xdb,0xe8,0x00,0xdd,0xe3, 0xec,0x00,0xe1,0xe6,0xed,0x00,0xd2,0xdb,0xeb,0x00,0x86,0xa4,0xdd,0x00,0x79, 0x9a,0xda,0x00,0x7c,0x9c,0xda,0x00,0x7f,0xa0,0xdc,0x1f,0x41,0x67,0xb8,0x54, 0x42,0x6c,0xc4,0x53,0x5d,0x8d,0xf5,0x50,0x50,0x7a,0xd2,0x52,0x3a,0x5f,0xaf, 0x55,0x4d,0x73,0xc7,0x51,0x99,0xb3,0xea,0x1a,0xa1,0xba,0xeb,0x00,0x84,0x9f, 0xb9,0xeb,0x00,0x83,0xff,0xff,0xff,0x00,0x17,0xee,0xee,0xef,0x00,0xb9,0xbd, 0xc2,0x00,0xe2,0xe4,0xe9,0x00,0xda,0xdd,0xe5,0x00,0x92,0x9e,0xb3,0x00,0x6e, 0x7e,0xa1,0x00,0x93,0x9f,0xb4,0x00,0xad,0xb4,0xc1,0x00,0xf3,0xf4,0xf5,0x00, 0xb9,0xc3,0xd3,0x0f,0x42,0x5a,0x8a,0x48,0x2b,0x48,0x8c,0x54,0x49,0x71,0xc3, 0x50,0xa7,0xd4,0xfa,0x50,0x7e,0xac,0xe8,0x50,0x4a,0x72,0xce,0x50,0x50,0x78, 0xcd,0x50,0x49,0x70,0xc4,0x50,0x3f,0x65,0xbd,0x55,0x6f,0x8a,0xc4,0x3c,0xe7, 0xeb,0xef,0x06,0xfa,0xf9,0xf7,0x00,0xf5,0xf5,0xf5,0x00,0x82,0xf6,0xf5,0xf6, 0x00,0x03,0xf4,0xf4,0xf4,0x00,0xdf,0xe4,0xee,0x00,0xda,0xe0,0xec,0x00,0x82, 0xdb,0xe1,0xec,0x00,0x54,0xde,0xe4,0xee,0x00,0xd6,0xdd,0xea,0x05,0x5d,0x73, 0xa2,0x3e,0x2b,0x4a,0x8e,0x56,0x40,0x65,0xb7,0x50,0x47,0x78,0xde,0x50,0xb8, 0xd3,0xff,0x50,0xd2,0xdf,0xf0,0x50,0x4f,0x76,0xc7,0x50,0x47,0x6e,0xc3,0x50, 0x44,0x67,0xb7,0x50,0x42,0x67,0xb6,0x50,0x3f,0x65,0xb3,0x51,0x3b,0x60,0xb0, 0x54,0x6c,0x85,0xb9,0x38,0xbe,0xc5,0xd2,0x12,0x5a,0x60,0x6c,0x39,0x1f,0x29, 0x3e,0x54,0x2c,0x3e,0x62,0x50,0x37,0x54,0x92,0x50,0x44,0x69,0xb9,0x50,0x47, 0x6e,0xc0,0x50,0x48,0x6f,0xc1,0x50,0x44,0x6a,0xbb,0x50,0x41,0x66,0xb6,0x50, 0x38,0x5e,0xb2,0x55,0x7f,0x98,0xcd,0x36,0xdd,0xe3,0xee,0x00,0xcf,0xd9,0xe9, 0x00,0x9e,0xb3,0xda,0x00,0xa8,0xbc,0xde,0x00,0x49,0x69,0xb2,0x0b,0x08,0x2f, 0x94,0xc1,0x13,0x3b,0x9c,0xfe,0x17,0x44,0xb2,0xfe,0x1e,0x53,0xd6,0xfd,0x24, 0x62,0xf6,0xfd,0x2a,0x6d,0xff,0xfd,0x34,0x7c,0xff,0xfd,0x54,0xa9,0xff,0xfe, 0x5c,0xb1,0xff,0xff,0x36,0x7e,0xff,0xff,0x31,0x76,0xff,0xff,0x32,0x78,0xfe, 0xff,0x32,0x78,0xff,0xff,0x32,0x78,0xfe,0xff,0x32,0x79,0xff,0xff,0x33,0x78, 0xff,0xff,0x32,0x78,0xff,0xff,0x34,0x7b,0xff,0xff,0x2c,0x75,0xff,0xd3,0x53, 0x91,0xff,0x13,0x7c,0xaf,0xff,0x00,0x7b,0xae,0xff,0x00,0x6c,0xa4,0xfd,0x00, 0xc8,0xdb,0xfd,0x00,0xff,0xff,0xfe,0x00,0xfc,0xfc,0xfe,0x00,0xfd,0xfc,0xff, 0x00,0xf9,0xfb,0xff,0x01,0x96,0xaa,0xcd,0x23,0x44,0x60,0x98,0x49,0x32,0x4f, 0x8d,0x54,0x30,0x52,0x99,0x54,0x32,0x53,0x9e,0x54,0x32,0x52,0x97,0x54,0x3d, 0x5a,0x98,0x50,0x5d,0x76,0xae,0x42,0xb4,0xc0,0xd8,0x1a,0xe4,0xe9,0xef,0x00, 0xde,0xe3,0xec,0x00,0xe5,0xe9,0xee,0x00,0xb1,0xc0,0xdc,0x00,0x9c,0xaf,0xd5, 0x00,0xa0,0xb4,0xd7,0x00,0xa4,0xb7,0xd9,0x13,0x61,0x78,0xa7,0x3f,0x42,0x61, 0xa5,0x4f,0x4f,0x7b,0xd8,0x54,0x53,0x79,0xc9,0x4d,0x6c,0x89,0xbe,0x3a,0xa9, 0xba,0xd8,0x1c,0xe1,0xe8,0xf4,0x04,0xda,0xe4,0xf1,0x00,0x84,0xda,0xe4,0xf2, 0x00,0x83,0xff,0xff,0xff,0x00,0x16,0xee,0xee,0xef,0x00,0xb9,0xbd,0xc2,0x00, 0xdb,0xdf,0xe5,0x00,0xd3,0xd6,0xe1,0x00,0x88,0x96,0xae,0x00,0x82,0x91,0xaf, 0x00,0xf1,0xf1,0xf4,0x00,0xff,0xff,0xff,0x00,0xf3,0xf4,0xf7,0x02,0x6c,0x7f, 0xa4,0x37,0x29,0x45,0x83,0x55,0x3d,0x63,0xb5,0x50,0xa4,0xc7,0xf4,0x50,0x9f, 0xc4,0xef,0x50,0x4a,0x73,0xce,0x50,0x50,0x75,0xcd,0x50,0x4b,0x72,0xc5,0x50, 0x42,0x6a,0xbf,0x53,0x51,0x72,0xbc,0x4a,0xb1,0xc0,0xd9,0x10,0xe6,0xea,0xef, 0x00,0xf6,0xf6,0xf6,0x00,0x82,0xf4,0xf4,0xf5,0x00,0x03,0xf6,0xf6,0xf7,0x00, 0xea,0xed,0xf4,0x00,0xe3,0xe8,0xf1,0x00,0x83,0xe4,0xe9,0xf1,0x00,0x2c,0xe9, 0xed,0xf4,0x00,0xb7,0xc1,0xd6,0x19,0x31,0x4c,0x88,0x52,0x38,0x59,0xa2,0x51, 0x41,0x6c,0xca,0x50,0x79,0xa3,0xf6,0x50,0xec,0xf7,0xfd,0x50,0x75,0x92,0xd1, 0x50,0x47,0x71,0xc9,0x50,0x48,0x6e,0xbf,0x50,0x43,0x66,0xb6,0x50,0x42,0x66, 0xb4,0x50,0x39,0x5f,0xb2,0x54,0x77,0x91,0xc6,0x36,0xbd,0xc7,0xd6,0x06,0xd3, 0xdb,0xe8,0x00,0x7c,0x8b,0xa9,0x2e,0x29,0x40,0x6f,0x54,0x34,0x4f,0x87,0x50, 0x3b,0x5e,0xa3,0x50,0x46,0x6d,0xc2,0x50,0x47,0x6e,0xc1,0x50,0x4c,0x71,0xc4, 0x50,0x45,0x6b,0xbb,0x50,0x41,0x66,0xb6,0x50,0x37,0x5f,0xb0,0x55,0x7f,0x99, 0xce,0x35,0xde,0xe4,0xf1,0x00,0xd0,0xda,0xec,0x00,0xa8,0xbb,0xe0,0x00,0xb2, 0xc5,0xe6,0x00,0x4e,0x6f,0xb8,0x08,0x08,0x2f,0x93,0xba,0x13,0x3b,0x9a,0xfd, 0x17,0x41,0xac,0xfd,0x1d,0x50,0xcf,0xfd,0x22,0x5f,0xf1,0xfd,0x28,0x69,0xff, 0xfd,0x31,0x79,0xff,0xfd,0x4f,0xa0,0xff,0xfe,0x53,0xa7,0xff,0xfe,0x35,0x7b, 0xff,0xff,0x32,0x77,0xfe,0xff,0x32,0x78,0xfe,0xff,0x82,0x32,0x77,0xfe,0xff, 0x25,0x32,0x78,0xff,0xff,0x33,0x7c,0xff,0xff,0x35,0x7e,0xff,0xff,0x33,0x7b, 0xff,0xf6,0x1d,0x5f,0xde,0xa2,0x47,0x76,0xcf,0x11,0x67,0x8e,0xd4,0x00,0x5e, 0x88,0xd2,0x00,0x66,0x91,0xdc,0x00,0xd1,0xdf,0xf8,0x00,0xff,0xff,0xff,0x00, 0xff,0xfe,0xfe,0x00,0xfb,0xfc,0xff,0x01,0x94,0xa9,0xd6,0x28,0x31,0x54,0x9e, 0x53,0x38,0x5e,0xb0,0x53,0x49,0x72,0xce,0x50,0x41,0x67,0xb8,0x50,0x39,0x58, 0x9b,0x50,0x37,0x54,0x95,0x50,0x37,0x56,0x98,0x51,0x31,0x53,0x97,0x54,0x48, 0x65,0xa1,0x4b,0xce,0xd7,0xe6,0x0f,0xe1,0xe7,0xf0,0x00,0xdf,0xe5,0xef,0x00, 0xe0,0xe5,0xef,0x00,0xb5,0xc3,0xde,0x00,0xa5,0xb6,0xd6,0x00,0xa4,0xb6,0xd7, 0x00,0xcc,0xd0,0xdb,0x04,0xa3,0xac,0xc2,0x16,0x73,0x8e,0xc4,0x26,0xad,0xbb, 0xdb,0x14,0xd9,0xdd,0xe5,0x00,0xb6,0xc4,0xdb,0x00,0xec,0xf0,0xf6,0x00,0x85, 0xe8,0xed,0xf4,0x00,0x83,0xff,0xff,0xff,0x00,0x19,0xee,0xee,0xef,0x00,0xb9, 0xbd,0xc2,0x00,0xdb,0xdf,0xe5,0x00,0xce,0xd3,0xde,0x00,0x98,0xa2,0xb7,0x00, 0xc7,0xcd,0xdd,0x00,0xe3,0xe7,0xee,0x00,0xe8,0xeb,0xf1,0x00,0xb1,0xba,0xce, 0x1c,0x2f,0x49,0x81,0x52,0x33,0x55,0xa1,0x52,0x84,0xa4,0xe4,0x50,0xca,0xde, 0xf9,0x50,0x55,0x7c,0xd1,0x50,0x4d,0x75,0xce,0x50,0x4c,0x73,0xc5,0x50,0x45, 0x6b,0xc0,0x52,0x46,0x6b,0xbb,0x4f,0xb3,0xc0,0xdc,0x1c,0xda,0xdf,0xea,0x00, 0xed,0xef,0xf2,0x00,0xf5,0xf5,0xf6,0x00,0xf4,0xf4,0xf5,0x00,0xf4,0xf4,0xf4, 0x00,0xf6,0xf6,0xf9,0x00,0x84,0xfb,0xfa,0xff,0x00,0x2c,0xfc,0xfb,0xff,0x00, 0xfa,0xfa,0xff,0x00,0x75,0x88,0xae,0x33,0x2c,0x49,0x89,0x54,0x3f,0x64,0xb3, 0x50,0x4a,0x77,0xdb,0x50,0xbe,0xd9,0xff,0x50,0xbc,0xcb,0xe7,0x50,0x40,0x69, 0xbf,0x50,0x4c,0x73,0xc5,0x50,0x44,0x68,0xb8,0x50,0x42,0x66,0xb5,0x50,0x3c, 0x61,0xb0,0x53,0x59,0x79,0xbe,0x45,0xdc,0xe1,0xf0,0x09,0xdf,0xe5,0xee,0x00, 0xe6,0xed,0xf5,0x00,0x6c,0x81,0xad,0x36,0x2e,0x4a,0x89,0x54,0x3d,0x5d,0xa7, 0x50,0x45,0x6c,0xc6,0x50,0x50,0x80,0xe3,0x50,0x4b,0x74,0xc8,0x50,0x4d,0x74, 0xc8,0x50,0x43,0x6a,0xba,0x50,0x41,0x66,0xb6,0x50,0x37,0x5d,0xb1,0x54,0x8c, 0xa5,0xd6,0x30,0xf1,0xf7,0xfc,0x00,0xe2,0xea,0xf6,0x00,0xad,0xbe,0xdd,0x00, 0xb9,0xc8,0xe2,0x00,0x4e,0x6d,0xb1,0x07,0x06,0x2f,0x94,0xba,0x13,0x3c,0x9e, 0xfd,0x17,0x41,0xac,0xfd,0x1c,0x4f,0xcc,0xfe,0x22,0x5c,0xee,0xfd,0x27,0x67, 0xff,0xfd,0x2f,0x76,0xff,0xfd,0x48,0x98,0xff,0xfe,0x4c,0x9f,0xff,0xfd,0x33, 0x7b,0xff,0xfe,0x32,0x75,0xff,0xff,0x82,0x32,0x78,0xff,0xff,0x12,0x34,0x7b, 0xff,0xff,0x34,0x7f,0xff,0xff,0x2f,0x72,0xef,0xff,0x23,0x57,0xba,0xf6,0x1c, 0x41,0x88,0x9c,0x5d,0x6e,0x90,0x25,0xa1,0xad,0xc4,0x01,0xa4,0xb4,0xd2,0x00, 0x9b,0xac,0xcc,0x00,0xc8,0xd1,0xe2,0x00,0xfc,0xfd,0xfe,0x00,0xf4,0xf7,0xfd, 0x00,0xf7,0xfa,0xff,0x00,0xb3,0xc4,0xe7,0x1c,0x38,0x5d,0xad,0x51,0x3e,0x68, 0xc7,0x52,0x5c,0x8d,0xf3,0x50,0x4b,0x72,0xc8,0x50,0x82,0x35,0x52,0x8f,0x50, 0x12,0x37,0x55,0x96,0x50,0x3c,0x5c,0xa1,0x50,0x3d,0x5c,0xa0,0x50,0x33,0x54, 0x99,0x54,0x8d,0xa2,0xce,0x29,0xe9,0xef,0xf9,0x00,0xe3,0xe9,0xf6,0x00,0xe5, 0xec,0xf8,0x00,0xda,0xe2,0xf1,0x00,0xa0,0xb1,0xd4,0x00,0xa3,0xb5,0xd7,0x00, 0xc9,0xce,0xda,0x00,0xa1,0xab,0xc2,0x00,0x73,0x8e,0xc5,0x00,0xab,0xba,0xdb, 0x00,0xd6,0xdb,0xe4,0x00,0xb4,0xc2,0xdb,0x00,0xea,0xef,0xf6,0x00,0x85,0xe6, 0xec,0xf4,0x00,0x83,0xff,0xff,0xff,0x00,0x15,0xee,0xee,0xef,0x00,0xb9,0xbd, 0xc2,0x00,0xda,0xde,0xe4,0x00,0xd3,0xd8,0xe4,0x00,0xd5,0xda,0xe1,0x00,0xd9, 0xde,0xe6,0x00,0xd4,0xda,0xe3,0x00,0xcf,0xd5,0xe0,0x03,0x66,0x79,0x9d,0x39, 0x29,0x47,0x86,0x56,0x50,0x75,0xc5,0x50,0xce,0xe1,0xfc,0x50,0x7a,0x99,0xdb, 0x50,0x45,0x70,0xcb,0x50,0x50,0x77,0xca,0x50,0x46,0x6d,0xc0,0x51,0x3e,0x65, 0xbb,0x54,0x93,0xa7,0xd2,0x2a,0xfa,0xf9,0xf6,0x00,0xfc,0xfa,0xf8,0x00,0xf5, 0xf5,0xf5,0x00,0x82,0xf4,0xf4,0xf5,0x00,0x03,0xf6,0xf6,0xf6,0x00,0xea,0xed, 0xf2,0x00,0xd5,0xdb,0xe9,0x00,0x83,0xd8,0xdd,0xeb,0x00,0x54,0xd9,0xde,0xeb, 0x00,0xd5,0xda,0xe9,0x07,0x4b,0x62,0x93,0x45,0x32,0x51,0x91,0x52,0x40,0x68, 0xbc,0x50,0x64,0x92,0xea,0x50,0xe6,0xf1,0xfd,0x50,0x6e,0x8d,0xce,0x50,0x3e, 0x65,0xba,0x50,0x48,0x6d,0xbd,0x50,0x43,0x65,0xb5,0x50,0x41,0x66,0xb3,0x50, 0x39,0x5e,0xaf,0x54,0x9e,0xb1,0xd8,0x26,0xff,0xff,0xff,0x00,0xf1,0xf4,0xf9, 0x00,0xc6,0xd0,0xe5,0x0d,0x48,0x64,0x9d,0x48,0x35,0x57,0xa0,0x52,0x43,0x6b, 0xc5,0x50,0x5e,0x8d,0xec,0x50,0x84,0xb8,0xfc,0x50,0x56,0x7e,0xd5,0x50,0x4b, 0x71,0xc4,0x50,0x43,0x67,0xb7,0x50,0x40,0x65,0xb4,0x51,0x3c,0x62,0xb4,0x52, 0xa4,0xb8,0xe2,0x23,0xf9,0xfb,0xfe,0x00,0xec,0xf1,0xf9,0x00,0xba,0xc3,0xd3, 0x00,0xc6,0xcd,0xdc,0x00,0x57,0x6a,0x90,0x03,0x00,0x1b,0x5e,0x78,0x0f,0x30, 0x83,0xed,0x17,0x41,0xab,0xfd,0x1d,0x51,0xd1,0xfe,0x22,0x5d,0xef,0xfd,0x27, 0x67,0xfe,0xfd,0x2e,0x73,0xff,0xfd,0x45,0x94,0xfe,0xfd,0x49,0x9a,0xfe,0xfd, 0x33,0x79,0xff,0xfe,0x32,0x78,0xff,0xff,0x34,0x7b,0xff,0xff,0x32,0x79,0xff, 0xff,0x29,0x63,0xd2,0xff,0x1b,0x43,0x91,0xff,0x11,0x2a,0x63,0xff,0x0c,0x22, 0x5d,0xf8,0x11,0x2d,0x79,0xaa,0x4f,0x6d,0xb6,0x2d,0xac,0xc1,0xef,0x01,0xbf, 0xd3,0xf9,0x00,0xb7,0xcc,0xf5,0x00,0xcd,0xdc,0xf8,0x00,0xee,0xf3,0xfc,0x00, 0xed,0xf2,0xfd,0x00,0xdb,0xe5,0xf7,0x09,0x56,0x79,0xc1,0x44,0x38,0x63,0xc5, 0x55,0x77,0xad,0xfc,0x50,0x6e,0x9c,0xe3,0x50,0x34,0x52,0x92,0x50,0x2e,0x4a, 0x8a,0x53,0x24,0x3c,0x72,0x57,0x2c,0x40,0x6a,0x52,0x39,0x57,0x95,0x50,0x3e, 0x5e,0xa5,0x50,0x35,0x55,0x9b,0x54,0x71,0x8a,0xc4,0x36,0xcf,0xda,0xf1,0x00, 0xc8,0xd6,0xee,0x00,0xc9,0xd5,0xee,0x00,0xc7,0xd3,0xed,0x00,0xaf,0xbf,0xdf, 0x00,0xa1,0xb2,0xd5,0x00,0xc9,0xce,0xda,0x00,0xa1,0xab,0xc2,0x00,0x73,0x8e, 0xc5,0x00,0xab,0xba,0xdb,0x00,0xd6,0xdb,0xe4,0x00,0xb4,0xc2,0xdb,0x00,0xea, 0xef,0xf6,0x00,0x85,0xe6,0xec,0xf4,0x00,0x83,0xff,0xff,0xff,0x00,0x12,0xf3, 0xf3,0xf2,0x00,0xbd,0xc1,0xc5,0x00,0xd6,0xda,0xe1,0x00,0xdc,0xe0,0xe8,0x00, 0xdb,0xe0,0xe7,0x00,0xda,0xdf,0xe5,0x00,0xdf,0xe3,0xe8,0x00,0xc6,0xcc,0xd8, 0x0c,0x40,0x55,0x81,0x4a,0x2e,0x4d,0x94,0x53,0x82,0xa8,0xe4,0x50,0xb7,0xd1, 0xf5,0x50,0x44,0x6d,0xc8,0x50,0x4c,0x74,0xc7,0x50,0x49,0x6f,0xc1,0x50,0x3e, 0x66,0xba,0x54,0x6b,0x89,0xc6,0x3f,0xd7,0xdc,0xe9,0x07,0x82,0xf5,0xf5,0xf5, 0x00,0x82,0xf4,0xf4,0xf5,0x00,0x04,0xf6,0xf6,0xf6,0x00,0xeb,0xed,0xf1,0x00, 0xbc,0xc6,0xd9,0x00,0xba,0xc4,0xd7,0x00,0x83,0xba,0xc5,0xd8,0x00,0x48,0xbb, 0xc6,0xd8,0x00,0xb6,0xc1,0xd5,0x14,0x38,0x50,0x84,0x4e,0x36,0x56,0x99,0x51, 0x3e,0x67,0xc1,0x50,0x86,0xb0,0xf3,0x50,0xcd,0xe2,0xf5,0x50,0x43,0x6a,0xba, 0x50,0x46,0x6c,0xbd,0x50,0x45,0x6a,0xb9,0x50,0x42,0x67,0xb4,0x50,0x3c,0x62, 0xb0,0x52,0x45,0x6a,0xb3,0x4c,0xd8,0xde,0xed,0x0f,0xfd,0xfb,0xfb,0x00,0xf5, 0xf7,0xfb,0x00,0x7f,0x93,0xbe,0x30,0x2d,0x4e,0x92,0x54,0x3d,0x64,0xb5,0x50, 0x44,0x74,0xe1,0x50,0xa6,0xcb,0xff,0x50,0xcd,0xe4,0xf8,0x50,0x54,0x7c,0xd3, 0x50,0x46,0x6b,0xbc,0x50,0x42,0x67,0xb7,0x50,0x3d,0x62,0xb2,0x52,0x4a,0x70, 0xbd,0x4c,0xc6,0xd3,0xef,0x12,0xed,0xf1,0xfa,0x00,0xec,0xf1,0xf9,0x00,0xe7, 0xee,0xf9,0x00,0xe9,0xf1,0xfb,0x00,0xde,0xe2,0xe7,0x00,0x77,0x82,0x9a,0x08, 0x10,0x22,0x4d,0x70,0x09,0x1f,0x56,0xed,0x16,0x3c,0x9c,0xff,0x1f,0x59,0xe1, 0xfe,0x27,0x68,0xff,0xfd,0x2f,0x76,0xff,0xfd,0x45,0x95,0xff,0xfd,0x49,0x9a, 0xff,0xfd,0x34,0x7a,0xfd,0xfe,0x2c,0x6a,0xe6,0xff,0x20,0x4e,0xa8,0xff,0x13, 0x2f,0x6c,0xff,0x0c,0x21,0x57,0xff,0x0e,0x2b,0x78,0xff,0x16,0x41,0xb5,0xff, 0x1f,0x58,0xe6,0xff,0x28,0x69,0xf7,0xf8,0x43,0x91,0xf3,0xaf,0x9c,0xd4,0xf6, 0x0c,0xbf,0xe7,0xfb,0x00,0xb6,0xe4,0xfb,0x00,0xb8,0xd9,0xf6,0x00,0xc2,0xcf, 0xef,0x00,0xc6,0xd4,0xf2,0x00,0xa0,0xb5,0xe1,0x23,0x33,0x5c,0xb9,0x54,0x63, 0x93,0xef,0x50,0xc3,0xe5,0xff,0x50,0x50,0x70,0xab,0x50,0x2d,0x4b,0x8d,0x52, 0x56,0x73,0xae,0x41,0x41,0x56,0x82,0x48,0x30,0x48,0x80,0x52,0x3d,0x5f,0xae, 0x50,0x40,0x62,0xac,0x50,0x35,0x56,0x9a,0x54,0x6d,0x89,0xc3,0x38,0xc6,0xd3, 0xef,0x00,0x82,0xc0,0xce,0xeb,0x00,0x0a,0xc3,0xd0,0xee,0x00,0xbb,0xc9,0xe6, 0x00,0xa3,0xb5,0xd6,0x00,0xc9,0xce,0xda,0x00,0xa1,0xab,0xc2,0x00,0x73,0x8e, 0xc5,0x00,0xab,0xba,0xdb,0x00,0xd6,0xdb,0xe4,0x00,0xb4,0xc2,0xdb,0x00,0xea, 0xef,0xf6,0x00,0x85,0xe6,0xec,0xf4,0x00,0x83,0xff,0xff,0xff,0x00,0x03,0xd3, 0xd7,0xdc,0x00,0xb3,0xba,0xc7,0x00,0xa1,0xaa,0xbd,0x00,0x83,0xa4,0xad,0xbe, 0x00,0x0c,0xa8,0xb0,0xc0,0x00,0x94,0x9d,0xb3,0x16,0x35,0x4b,0x79,0x50,0x36, 0x55,0xa1,0x52,0x86,0xb5,0xf4,0x50,0x6c,0x99,0xe1,0x50,0x46,0x6c,0xc3,0x50, 0x4a,0x71,0xc3,0x50,0x45,0x6b,0xbd,0x51,0x40,0x65,0xb7,0x52,0xaa,0xbb,0xdb, 0x23,0xff,0xff,0xff,0x00,0x82,0xfe,0xfe,0xfa,0x00,0x82,0xff,0xfe,0xfa,0x00, 0x03,0xff,0xff,0xfd,0x00,0xed,0xef,0xf3,0x00,0x90,0xa0,0xbb,0x00,0x85,0x97, 0xa5,0xbf,0x00,0x47,0x93,0xa2,0xbc,0x1e,0x33,0x4c,0x80,0x51,0x39,0x59,0x9d, 0x50,0x41,0x68,0xc7,0x50,0x94,0xc5,0xfa,0x50,0x8a,0xb5,0xe4,0x50,0x3e,0x63, 0xb5,0x50,0x4b,0x71,0xc2,0x50,0x45,0x68,0xb8,0x50,0x42,0x65,0xb2,0x50,0x37, 0x5d,0xab,0x54,0x66,0x84,0xbd,0x3e,0xcd,0xd5,0xe6,0x04,0xeb,0xef,0xf5,0x00, 0xad,0xbc,0xd6,0x1e,0x33,0x52,0x92,0x50,0x36,0x59,0xa2,0x52,0x40,0x69,0xc8, 0x50,0x5e,0x8f,0xf3,0x50,0xe4,0xf3,0xff,0x50,0xa0,0xb7,0xe9,0x50,0x44,0x6c, 0xc3,0x50,0x42,0x67,0xb7,0x50,0x42,0x67,0xb6,0x50,0x39,0x5f,0xb1,0x54,0x71, 0x90,0xce,0x3b,0xec,0xef,0xfa,0x02,0xe4,0xe9,0xf8,0x00,0xda,0xe5,0xf9,0x00, 0xd7,0xe4,0xfa,0x00,0xe2,0xec,0xfb,0x00,0x9a,0xb7,0xf4,0x01,0x3c,0x6d,0xe4, 0x51,0x17,0x43,0xb1,0xc3,0x0e,0x2b,0x74,0xf9,0x09,0x1c,0x4f,0xff,0x0d,0x28, 0x6b,0xff,0x19,0x47,0xb7,0xfe,0x29,0x69,0xf1,0xfe,0x38,0x82,0xfd,0xfe,0x2b, 0x67,0xd8,0xfe,0x19,0x3e,0x8f,0xff,0x0d,0x23,0x59,0xff,0x0c,0x26,0x69,0xff, 0x13,0x39,0x9f,0xff,0x1c,0x52,0xd8,0xff,0x27,0x69,0xfd,0xff,0x33,0x7c,0xff, 0xff,0x40,0x8f,0xff,0xff,0x4c,0xa1,0xff,0xff,0x78,0xd2,0xff,0xc5,0xaa,0xe8, 0xff,0x0f,0xaf,0xdf,0xff,0x00,0xb3,0xe5,0xff,0x00,0xdc,0xf4,0xfe,0x00,0xee, 0xf2,0xfb,0x00,0xe8,0xef,0xfa,0x02,0x66,0x87,0xc8,0x3b,0x36,0x63,0xc7,0x54, 0xa4,0xcd,0xfe,0x50,0xa7,0xbc,0xda,0x50,0x2e,0x4b,0x8e,0x52,0x41,0x5f,0x9f, 0x4b,0x8f,0xa7,0xd5,0x28,0x52,0x70,0xb7,0x46,0x4c,0x77,0xd2,0x52,0x76,0xa4, 0xf0,0x50,0x4b,0x6f,0xb3,0x50,0x30,0x51,0x98,0x54,0x86,0x9f,0xd0,0x2e,0xe5, 0xef,0xf9,0x00,0x83,0xde,0xea,0xf6,0x00,0x09,0xe4,0xee,0xf9,0x00,0xb9,0xc9, 0xe2,0x00,0xc5,0xcb,0xd7,0x00,0xa1,0xab,0xc2,0x00,0x73,0x8e,0xc5,0x00,0xab, 0xba,0xdb,0x00,0xd6,0xdb,0xe4,0x00,0xb4,0xc2,0xdb,0x00,0xea,0xef,0xf6,0x00, 0x85,0xe6,0xec,0xf4,0x00,0x83,0xff,0xff,0xff,0x00,0x02,0x84,0x8e,0xa7,0x00, 0x88,0x91,0xa9,0x00,0x84,0x89,0x93,0xaa,0x00,0x0c,0x8c,0x95,0xac,0x00,0x7c, 0x87,0xa0,0x1a,0x31,0x48,0x74,0x52,0x3c,0x5b,0xa2,0x51,0x6a,0x98,0xf1,0x50, 0x52,0x7a,0xd2,0x50,0x4b,0x71,0xc5,0x50,0x4c,0x73,0xc4,0x50,0x44,0x6b,0xbc, 0x52,0x49,0x6c,0xb8,0x50,0xa0,0xaf,0xd1,0x1a,0xc3,0xcc,0xdf,0x00,0x84,0xbe, 0xc8,0xdd,0x00,0x03,0xbf,0xc9,0xde,0x00,0xa6,0xad,0xbb,0x00,0x72,0x80,0x99, 0x00,0x85,0x75,0x83,0x9b,0x00,0x1a,0x72,0x80,0x98,0x28,0x2c,0x41,0x6f,0x55, 0x38,0x59,0x9d,0x50,0x46,0x6e,0xca,0x50,0x85,0xb8,0xfc,0x50,0x5e,0x87,0xd4, 0x50,0x3f,0x61,0xb0,0x50,0x45,0x6a,0xb9,0x50,0x44,0x69,0xba,0x50,0x42,0x65, 0xb5,0x50,0x34,0x5a,0xae,0x57,0x7c,0x95,0xc6,0x33,0xc1,0xcc,0xe1,0x00,0xab, 0xba,0xd7,0x0f,0x46,0x62,0x9c,0x49,0x30,0x52,0x96,0x54,0x41,0x67,0xbb,0x50, 0x47,0x78,0xe1,0x50,0xa8,0xcf,0xfe,0x50,0xd0,0xe5,0xf8,0x50,0x56,0x7c,0xce, 0x50,0x41,0x66,0xb8,0x50,0x43,0x66,0xb6,0x50,0x40,0x64,0xb3,0x50,0x40,0x66, 0xb7,0x51,0xbb,0xcb,0xea,0x1b,0x82,0xff,0xff,0xff,0x00,0x2b,0xc4,0xd3,0xf4, 0x00,0xb2,0xc7,0xf2,0x00,0xc4,0xd3,0xf4,0x00,0x53,0x7f,0xe2,0x04,0x07,0x44, 0xdc,0xbd,0x1d,0x59,0xec,0xf9,0x1f,0x59,0xe9,0xfe,0x1a,0x49,0xbf,0xff,0x12, 0x34,0x89,0xff,0x0c,0x28,0x70,0xff,0x13,0x37,0x94,0xff,0x16,0x40,0xa6,0xff, 0x0f,0x2e,0x82,0xff,0x11,0x32,0x8d,0xff,0x19,0x47,0xc3,0xff,0x23,0x61,0xf4, 0xff,0x2d,0x74,0xff,0xff,0x3a,0x88,0xff,0xff,0x47,0x9a,0xff,0xff,0x4f,0xa4, 0xff,0xff,0x4c,0x9f,0xfe,0xff,0x43,0x91,0xfe,0xff,0x35,0x80,0xfe,0xc1,0x5e, 0x97,0xff,0x0e,0x78,0xa9,0xff,0x00,0x8a,0xb2,0xfc,0x00,0xda,0xdf,0xf0,0x00, 0xd3,0xde,0xf0,0x00,0xce,0xd9,0xee,0x0c,0x49,0x6b,0xb5,0x49,0x46,0x75,0xd6, 0x52,0xb4,0xd9,0xff,0x50,0x6a,0x87,0xb7,0x50,0x29,0x47,0x8a,0x53,0x5b,0x78, 0xb4,0x40,0x71,0x8e,0xca,0x36,0x3b,0x62,0xbe,0x51,0x76,0xa7,0xf9,0x50,0xb4, 0xd9,0xf3,0x50,0x45,0x65,0xa8,0x50,0x36,0x57,0xa1,0x51,0xb2,0xc3,0xe6,0x1a, 0xd3,0xdf,0xf2,0x00,0x83,0xd0,0xdc,0xf1,0x00,0x09,0xd4,0xe0,0xf3,0x00,0xaf, 0xc0,0xdf,0x00,0xc4,0xca,0xd7,0x00,0xa1,0xab,0xc2,0x00,0x73,0x8e,0xc5,0x00, 0xab,0xba,0xdb,0x00,0xd6,0xdb,0xe4,0x00,0xb4,0xc2,0xdb,0x00,0xea,0xef,0xf6, 0x00,0x85,0xe6,0xec,0xf4,0x00,0x83,0xff,0xff,0xff,0x00,0x86,0x8c,0x95,0xa9, 0x00,0x0c,0x8f,0x98,0xab,0x00,0x7e,0x89,0x9e,0x19,0x31,0x45,0x6f,0x52,0x3b, 0x59,0x9d,0x51,0x59,0x83,0xe0,0x50,0x4f,0x75,0xcc,0x50,0x4d,0x73,0xc9,0x4f, 0x4f,0x75,0xc8,0x50,0x47,0x6e,0xc1,0x51,0x4e,0x71,0xbc,0x50,0x83,0x98,0xc3, 0x1b,0x78,0x90,0xbf,0x00,0x84,0x79,0x91,0xc0,0x00,0x03,0x79,0x90,0xbe,0x00, 0x8e,0x94,0xa3,0x00,0x97,0x9c,0xa8,0x00,0x85,0x98,0x9d,0xa8,0x00,0x1a,0x95, 0x9a,0xa5,0x1d,0x35,0x40,0x58,0x4c,0x27,0x3f,0x6f,0x54,0x3b,0x61,0xb1,0x52, 0x5f,0x8d,0xeb,0x51,0x43,0x6a,0xbe,0x52,0x38,0x5c,0xa9,0x53,0x39,0x5b,0xa7, 0x54,0x39,0x5a,0xa2,0x54,0x3c,0x5a,0x9c,0x51,0x3a,0x57,0x95,0x4f,0xa8,0xb3, 0xcd,0x1e,0xeb,0xee,0xf6,0x04,0x60,0x79,0xab,0x3f,0x2d,0x4c,0x8f,0x54,0x3f, 0x64,0xb1,0x50,0x43,0x6f,0xd5,0x50,0x7b,0xac,0xfa,0x50,0xd0,0xf5,0xfd,0x50, 0x6d,0x95,0xd9,0x50,0x3e,0x65,0xb9,0x50,0x42,0x66,0xb5,0x50,0x43,0x65,0xb4, 0x50,0x39,0x5f,0xb0,0x54,0x72,0x90,0xce,0x38,0xe0,0xe7,0xf6,0x02,0x82,0xff, 0xff,0xff,0x00,0x2b,0xcf,0xda,0xf1,0x00,0xc2,0xd0,0xee,0x00,0xd2,0xdd,0xf2, 0x00,0x5f,0x83,0xd5,0x01,0x0d,0x44,0xca,0xaa,0x1e,0x55,0xe0,0xfe,0x22,0x5e, 0xf3,0xfd,0x29,0x6e,0xff,0xfe,0x30,0x78,0xfc,0xfe,0x31,0x73,0xe6,0xfe,0x25, 0x5f,0xcb,0xff,0x1b,0x4f,0xc1,0xff,0x20,0x59,0xdf,0xff,0x29,0x6c,0xff,0xff, 0x35,0x82,0xff,0xff,0x42,0x92,0xff,0xff,0x4b,0x9f,0xff,0xff,0x4d,0xa3,0xff, 0xff,0x46,0x95,0xff,0xff,0x3b,0x86,0xfe,0xff,0x32,0x78,0xfe,0xff,0x2e,0x72, 0xfe,0xff,0x21,0x67,0xff,0xba,0x5b,0x92,0xfe,0x0b,0x80,0xae,0xff,0x00,0x87, 0xaf,0xf7,0x00,0xb9,0xc2,0xd8,0x00,0xb5,0xc0,0xda,0x00,0xb1,0xbc,0xd7,0x10, 0x41,0x5c,0x95,0x4c,0x44,0x6f,0xc6,0x55,0x70,0xa0,0xef,0x54,0x3a,0x59,0x9a, 0x54,0x2f,0x4d,0x8b,0x51,0x43,0x62,0xa4,0x4a,0x40,0x61,0xae,0x4e,0x48,0x73, 0xd5,0x51,0x83,0xb7,0xff,0x50,0x6c,0x92,0xce,0x50,0x2f,0x4e,0x96,0x54,0x62, 0x81,0xbf,0x3f,0xea,0xee,0xfb,0x04,0xe8,0xeb,0xf9,0x00,0x83,0xe7,0xeb,0xf9, 0x00,0x09,0xe8,0xec,0xfa,0x00,0xe2,0xe8,0xf6,0x00,0xd2,0xd6,0xdf,0x00,0x9f, 0xaa,0xc1,0x00,0x73,0x8e,0xc5,0x00,0xab,0xba,0xdb,0x00,0xd6,0xdb,0xe4,0x00, 0xb4,0xc2,0xdb,0x00,0xea,0xef,0xf6,0x00,0x85,0xe6,0xec,0xf4,0x00,0x83,0xff, 0xff,0xff,0x00,0x86,0xa6,0xb0,0xbd,0x00,0x0c,0xaa,0xb2,0xc0,0x00,0x96,0xa1, 0xb0,0x15,0x34,0x47,0x6e,0x50,0x38,0x55,0x96,0x51,0x51,0x78,0xcf,0x4f,0x47, 0x6d,0xc1,0x52,0x3a,0x60,0xb1,0x56,0x2d,0x51,0xa0,0x5b,0x2c,0x4e,0x9a,0x5b, 0x48,0x65,0xa2,0x4e,0x93,0xa5,0xc5,0x17,0x93,0xa5,0xc7,0x00,0x84,0x92,0xa5, 0xc7,0x00,0x04,0x92,0xa4,0xc7,0x00,0x9d,0xac,0xc6,0x00,0xb0,0xb3,0xba,0x00, 0xa9,0xad,0xb5,0x00,0x84,0xaa,0xae,0xb6,0x00,0x46,0xad,0xb1,0xb8,0x01,0xbe, 0xbf,0xc3,0x0e,0x73,0x7e,0x91,0x2d,0x48,0x60,0x94,0x48,0x48,0x68,0xb3,0x4e, 0x4f,0x67,0x9e,0x47,0x5a,0x6e,0x97,0x3e,0x6d,0x7d,0x9f,0x32,0x83,0x90,0xa6, 0x25,0x95,0x9d,0xac,0x1a,0xc3,0xc5,0xce,0x0e,0xe6,0xe8,0xec,0x02,0x82,0x95, 0xbd,0x30,0x2b,0x49,0x8b,0x55,0x3c,0x5e,0xa6,0x50,0x42,0x6c,0xca,0x50,0x60, 0x92,0xf1,0x50,0xc5,0xf2,0xff,0x50,0x86,0xad,0xe4,0x50,0x3f,0x65,0xbe,0x50, 0x42,0x66,0xb5,0x50,0x42,0x67,0xb4,0x50,0x3a,0x5f,0xaf,0x53,0x48,0x6e,0xbc, 0x4d,0xc8,0xd7,0xf0,0x12,0xe6,0xed,0xf9,0x00,0xe7,0xef,0xfa,0x00,0xd2,0xdd, 0xef,0x00,0xc0,0xce,0xe7,0x00,0xc1,0xd0,0xe7,0x00,0xd1,0xdc,0xed,0x00,0x5c, 0x79,0xbd,0x01,0x08,0x32,0xa1,0xaa,0x17,0x46,0xb9,0xfe,0x1e,0x56,0xdc,0xfd, 0x28,0x6b,0xfe,0xfd,0x37,0x82,0xff,0xfd,0x57,0xaf,0xff,0xfd,0x88,0xda,0xff, 0xfe,0x79,0xc6,0xff,0xff,0x4a,0xa2,0xff,0xff,0x4b,0xa3,0xff,0xff,0x4d,0xa3, 0xff,0xff,0x49,0x9a,0xfe,0xff,0x3f,0x8c,0xff,0xff,0x34,0x7b,0xff,0xff,0x2f, 0x72,0xff,0xff,0x2c,0x72,0xff,0xff,0x2e,0x71,0xfe,0xff,0x2e,0x73,0xff,0xff, 0x26,0x6c,0xff,0xba,0x5e,0x94,0xfe,0x0b,0x80,0xaf,0xfe,0x00,0x91,0xb7,0xfd, 0x00,0xef,0xf1,0xf4,0x00,0xf3,0xf4,0xf4,0x00,0xf2,0xf3,0xf4,0x02,0xb2,0xb8, 0xc4,0x15,0x76,0x8b,0xb8,0x30,0x68,0x86,0xc4,0x3b,0x83,0x92,0xb6,0x2b,0x8f, 0x9e,0xbb,0x27,0x3b,0x57,0x94,0x4d,0x3a,0x60,0xbb,0x53,0x6b,0x9e,0xfd,0x50, 0x71,0x9f,0xe8,0x50,0x35,0x55,0x9d,0x51,0x37,0x5a,0xa3,0x52,0xae,0xc2,0xe4, 0x1b,0xfa,0xfa,0xff,0x00,0x85,0xf7,0xf8,0xff,0x00,0x08,0xfb,0xfb,0xff,0x00, 0xd8,0xdb,0xe2,0x00,0x9e,0xa9,0xc1,0x00,0x73,0x8e,0xc5,0x00,0xab,0xba,0xdb, 0x00,0xd6,0xdb,0xe4,0x00,0xb4,0xc2,0xdb,0x00,0xea,0xef,0xf6,0x00,0x85,0xe6, 0xec,0xf4,0x00,0x83,0xff,0xff,0xff,0x00,0x86,0xda,0xdf,0xe6,0x00,0x0c,0xde, 0xe3,0xe9,0x00,0xcc,0xd2,0xdb,0x0a,0x4b,0x59,0x79,0x43,0x1f,0x36,0x6b,0x5a, 0x2b,0x4c,0x98,0x5c,0x23,0x42,0x88,0x5f,0x1d,0x37,0x72,0x60,0x1d,0x34,0x69, 0x5c,0x21,0x38,0x6b,0x5a,0x45,0x5f,0x95,0x4d,0xc3,0xd2,0xee,0x17,0xf2,0xf7, 0xff,0x00,0x85,0xeb,0xf1,0xfd,0x00,0x04,0xf0,0xf7,0xff,0x00,0xcd,0xd3,0xdf, 0x00,0x9e,0xa2,0xab,0x00,0xa8,0xac,0xb4,0x00,0x83,0xa7,0xab,0xb4,0x00,0x2f, 0xab,0xaf,0xb7,0x00,0xc2,0xc5,0xca,0x00,0xb7,0xbb,0xc2,0x00,0xc9,0xd0,0xdf, 0x0c,0xa1,0xac,0xc9,0x14,0xcc,0xce,0xd5,0x0a,0xc9,0xca,0xca,0x02,0x93,0x9b, 0xad,0x00,0x83,0x8f,0xa2,0x00,0xba,0xbd,0xc7,0x00,0xd7,0xda,0xe5,0x00,0x93, 0xa4,0xcc,0x20,0x33,0x50,0x8e,0x52,0x37,0x58,0x9f,0x52,0x40,0x69,0xc1,0x50, 0x4f,0x80,0xe9,0x50,0xb6,0xe4,0xff,0x50,0xa0,0xc9,0xec,0x50,0x44,0x6b,0xc1, 0x50,0x42,0x67,0xb7,0x50,0x42,0x66,0xb3,0x50,0x3f,0x62,0xaf,0x51,0x36,0x5d, 0xb0,0x55,0x9a,0xaf,0xdd,0x28,0xed,0xf3,0xfb,0x00,0xeb,0xf0,0xfb,0x00,0xec, 0xf2,0xfb,0x00,0xcf,0xdb,0xef,0x00,0xbd,0xcc,0xe6,0x00,0xc1,0xcf,0xe7,0x00, 0xd0,0xdb,0xee,0x00,0x5b,0x78,0xb9,0x01,0x05,0x2d,0x8f,0xaa,0x14,0x3a,0x98, 0xff,0x18,0x45,0xb4,0xfe,0x21,0x5b,0xe5,0xfd,0x2c,0x70,0xfe,0xfe,0x44,0x9a, 0xff,0xfe,0xa5,0xe9,0xff,0xff,0xd3,0xff,0xfc,0xff,0x85,0xe4,0xff,0xff,0x4b, 0xa1,0xff,0xff,0x38,0x82,0xff,0xff,0x30,0x74,0xfe,0xff,0x2d,0x6e,0xfe,0xff, 0x2d,0x70,0xfe,0xff,0x2e,0x71,0xfe,0xff,0x83,0x2e,0x72,0xfe,0xff,0x14,0x26, 0x6b,0xfe,0xba,0x5d,0x93,0xff,0x0b,0x84,0xaf,0xff,0x00,0x74,0xa4,0xff,0x00, 0xb3,0xcd,0xfc,0x00,0xff,0xff,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xb7,0xbd,0xca, 0x00,0x93,0xa2,0xbd,0x00,0xc3,0xcb,0xdb,0x00,0xe8,0xee,0xf7,0x00,0x8c,0xa4, 0xd5,0x2c,0x35,0x5c,0xb3,0x53,0x5a,0x8b,0xea,0x50,0x81,0xb5,0xfb,0x50,0x46, 0x68,0xb0,0x50,0x2c,0x4d,0x95,0x56,0x7a,0x94,0xcb,0x36,0xd3,0xdf,0xf3,0x03, 0xf0,0xf4,0xfc,0x00,0x85,0xef,0xf3,0xfc,0x00,0x08,0xf1,0xf5,0xfe,0x00,0xd6, 0xd9,0xe1,0x00,0x9e,0xa9,0xc1,0x00,0x73,0x8e,0xc5,0x00,0xab,0xba,0xdb,0x00, 0xd6,0xdb,0xe4,0x00,0xb4,0xc2,0xdb,0x00,0xea,0xef,0xf6,0x00,0x85,0xe6,0xec, 0xf4,0x00,0x83,0xff,0xff,0xff,0x00,0x86,0xe6,0xe9,0xed,0x00,0x0c,0xeb,0xed, 0xf0,0x00,0xd6,0xdb,0xe2,0x08,0x4d,0x5f,0x84,0x42,0x1f,0x38,0x6c,0x5b,0x21, 0x3d,0x7c,0x5c,0x28,0x41,0x79,0x58,0x37,0x54,0x94,0x53,0x43,0x66,0xb0,0x50, 0x47,0x6d,0xbe,0x50,0x48,0x70,0xc8,0x54,0xa9,0xbe,0xe6,0x26,0xf9,0xfb,0xfb, 0x00,0x85,0xf1,0xf4,0xf9,0x00,0x04,0xf3,0xf7,0xfb,0x00,0xe8,0xea,0xef,0x00, 0xb4,0xb8,0xbe,0x00,0xa4,0xa8,0xb1,0x00,0x83,0xa7,0xab,0xb4,0x00,0x45,0xab, 0xaf,0xb7,0x00,0xc0,0xc3,0xc8,0x00,0xb4,0xb8,0xc0,0x00,0xc6,0xce,0xde,0x00, 0x9f,0xab,0xc9,0x00,0xc9,0xcc,0xd4,0x00,0xc7,0xc9,0xc9,0x00,0x8a,0x93,0xa7, 0x00,0xac,0xb4,0xc6,0x00,0xf8,0xfa,0xff,0x00,0xd1,0xd9,0xec,0x0e,0x48,0x61, 0x9b,0x49,0x2f,0x50,0x95,0x54,0x41,0x67,0xbb,0x50,0x47,0x78,0xe0,0x50,0xa5, 0xce,0xfe,0x50,0xc2,0xe4,0xf5,0x50,0x4e,0x77,0xc9,0x50,0x42,0x67,0xb7,0x50, 0x41,0x65,0xb4,0x50,0x40,0x65,0xb2,0x50,0x36,0x5b,0xac,0x55,0x6a,0x88,0xc9, 0x3d,0xec,0xf0,0xfb,0x06,0xff,0xfe,0xff,0x00,0xf9,0xf9,0xfe,0x00,0xff,0xff, 0xff,0x00,0xda,0xe2,0xf2,0x00,0xbe,0xcc,0xe6,0x00,0xc2,0xd0,0xe8,0x00,0xd1, 0xdc,0xef,0x00,0x5c,0x79,0xb9,0x01,0x05,0x2c,0x8e,0xaa,0x13,0x38,0x95,0xfe, 0x16,0x3e,0xa5,0xfd,0x1b,0x4d,0xc8,0xfd,0x22,0x5e,0xee,0xfd,0x2a,0x70,0xfe, 0xfd,0x51,0x9f,0xfe,0xfe,0x98,0xea,0xfe,0xff,0x97,0xf1,0xff,0xff,0x36,0x7c, 0xfe,0xff,0x2a,0x6b,0xff,0xff,0x2d,0x70,0xfe,0xff,0x2e,0x72,0xff,0xff,0x2e, 0x71,0xfe,0xff,0x2d,0x71,0xfe,0xff,0x2e,0x71,0xff,0xff,0x2d,0x72,0xff,0xff, 0x2e,0x71,0xfe,0xff,0x23,0x69,0xff,0xb3,0x63,0x97,0xfe,0x08,0x8f,0xb6,0xfe, 0x00,0x83,0xaf,0xfe,0x00,0x9a,0xbc,0xfe,0x00,0xe7,0xee,0xfa,0x00,0xfb,0xfa, 0xf6,0x00,0xc1,0xc6,0xd0,0x00,0xc7,0xd0,0xe0,0x00,0xde,0xe3,0xee,0x00,0xc0, 0xd0,0xe9,0x14,0x3f,0x64,0xb7,0x4e,0x4b,0x79,0xdc,0x51,0x9a,0xd0,0xff,0x50, 0x68,0x91,0xcc,0x50,0x2d,0x4d,0x95,0x54,0x4d,0x6e,0xb4,0x49,0xcb,0xd7,0xf0, 0x0f,0xec,0xf2,0xfb,0x00,0x86,0xe1,0xe9,0xf7,0x00,0x08,0xe2,0xeb,0xf9,0x00, 0xd1,0xd5,0xde,0x00,0x9e,0xa9,0xc1,0x00,0x73,0x8e,0xc5,0x00,0xab,0xba,0xdb, 0x00,0xd6,0xdb,0xe4,0x00,0xb4,0xc2,0xdb,0x00,0xea,0xef,0xf6,0x00,0x85,0xe6, 0xec,0xf4,0x00,0x83,0xff,0xff,0xff,0x00,0x83,0xec,0xed,0xf0,0x00,0x0f,0xed, 0xee,0xf0,0x00,0xed,0xee,0xf1,0x00,0xed,0xed,0xf0,0x00,0xf3,0xf3,0xf5,0x00, 0xd7,0xda,0xdf,0x09,0x41,0x54,0x7a,0x46,0x36,0x56,0x9c,0x53,0x8b,0xb2,0xe2, 0x4f,0x69,0x94,0xdd,0x4f,0x4d,0x77,0xd3,0x4f,0x4f,0x79,0xd1,0x50,0x47,0x6f, 0xc0,0x51,0x3c,0x61,0xb1,0x54,0x98,0xa8,0xce,0x28,0xfa,0xf9,0xf7,0x00,0x85, 0xef,0xef,0xf2,0x00,0x04,0xee,0xef,0xf2,0x00,0xf8,0xf8,0xfa,0x00,0xc5,0xc9, 0xcf,0x00,0xa1,0xa5,0xae,0x00,0x83,0xa7,0xab,0xb4,0x00,0x45,0xab,0xaf,0xb7, 0x00,0xc0,0xc3,0xc8,0x00,0xb4,0xb8,0xc0,0x00,0xc6,0xce,0xde,0x00,0x9f,0xab, 0xc9,0x00,0xc9,0xcb,0xd3,0x00,0xbf,0xc2,0xc4,0x00,0xb5,0xbc,0xcb,0x00,0xd8, 0xe0,0xf0,0x00,0xd9,0xe2,0xf0,0x02,0x76,0x8a,0xb7,0x35,0x29,0x49,0x8c,0x56, 0x3e,0x63,0xb0,0x50,0x43,0x72,0xd6,0x50,0x8c,0xb3,0xfb,0x50,0xe5,0xf4,0xfd, 0x50,0x6b,0x8e,0xd2,0x50,0x3f,0x64,0xb8,0x50,0x42,0x65,0xb3,0x50,0x40,0x64, 0xb1,0x50,0x3a,0x5e,0xac,0x53,0x4b,0x6e,0xbb,0x4c,0xc1,0xce,0xec,0x13,0xf8, 0xf8,0xfd,0x00,0xfa,0xf9,0xff,0x00,0xfb,0xfa,0xff,0x00,0xeb,0xee,0xf8,0x00, 0xc3,0xd0,0xe8,0x00,0xc0,0xce,0xe7,0x00,0xc1,0xcf,0xe7,0x00,0xd0,0xdb,0xee, 0x00,0x5c,0x77,0xb9,0x01,0x05,0x2c,0x8f,0xaa,0x13,0x39,0x95,0xfe,0x16,0x3e, 0xa6,0xfd,0x1c,0x4c,0xc6,0xfd,0x20,0x59,0xe4,0xfd,0x24,0x63,0xfc,0xfd,0x2b, 0x70,0xff,0xfd,0x4d,0xa1,0xfe,0xfe,0x64,0xb9,0xff,0xff,0x33,0x78,0xff,0xff, 0x2c,0x70,0xff,0xff,0x2e,0x71,0xfe,0xff,0x2d,0x71,0xfe,0xff,0x2d,0x71,0xff, 0xff,0x2c,0x70,0xff,0xff,0x2d,0x70,0xfe,0xff,0x2d,0x71,0xff,0xff,0x2c,0x70, 0xff,0xff,0x22,0x69,0xff,0xb0,0x68,0x99,0xfe,0x08,0x95,0xbb,0xfe,0x00,0x8f, 0xb5,0xfe,0x00,0x80,0xab,0xff,0x00,0xcd,0xdd,0xfb,0x00,0xff,0xfd,0xf7,0x00, 0xeb,0xee,0xf4,0x00,0xfa,0xfc,0xff,0x00,0xfe,0xff,0xff,0x00,0x7d,0x96,0xd0, 0x32,0x33,0x5e,0xbf,0x54,0x8e,0xba,0xfb,0x50,0xb7,0xd9,0xef,0x50,0x3e,0x60, 0xa3,0x51,0x31,0x54,0x9e,0x52,0xa3,0xb7,0xde,0x24,0xfa,0xfc,0xff,0x00,0xf5, 0xf9,0xfd,0x00,0x86,0xf5,0xf8,0xfd,0x00,0x08,0xf6,0xf9,0xfe,0x00,0xf0,0xf1, 0xf5,0x00,0x9f,0xaa,0xc2,0x00,0x73,0x8e,0xc4,0x00,0xab,0xba,0xdb,0x00,0xd6, 0xdb,0xe4,0x00,0xb4,0xc2,0xdb,0x00,0xea,0xef,0xf6,0x00,0x85,0xe6,0xec,0xf4, 0x00,0x82,0xff,0xff,0xff,0x00 }; static const GdkPixdata help_pixdata = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 23376, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 484, /* rowstride */ 121, /* width */ 60, /* height */ help_pixdata_pixel_data /* pixel_data */ }; nvidia-settings/src/image_data/config_pixdata.h0000664000175000017500000015542212236467170022045 0ustar albertoalberto/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static guint8 config_pixdata_pixel_data[] = { 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xbe,0xff,0xff,0xff,0x00, 0x8f,0x00,0x00,0x00,0x00,0x18,0x27,0x28,0x29,0x00,0x10,0x10,0x11,0x00,0x3c, 0x3d,0x3d,0x00,0x1c,0x1c,0x1b,0x00,0x40,0x40,0x40,0x00,0x64,0x64,0x65,0x00, 0x17,0x16,0x17,0x00,0x14,0x14,0x15,0x2b,0x50,0x52,0x54,0x9f,0x46,0x48,0x4a, 0x83,0x2d,0x2f,0x2f,0x4d,0x1b,0x1b,0x1c,0x24,0x42,0x43,0x44,0x15,0x18,0x18, 0x18,0x02,0x12,0x12,0x11,0x00,0x34,0x34,0x35,0x00,0x4c,0x4e,0x4f,0x00,0x30, 0x30,0x30,0x00,0x11,0x10,0x11,0x00,0x1d,0x1c,0x1d,0x00,0x27,0x27,0x28,0x00, 0x47,0x48,0x48,0x00,0x59,0x5a,0x5c,0x00,0x25,0x26,0x27,0x00,0x88,0x3a,0x3b, 0x3c,0x00,0x8f,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x8f,0x00,0x00, 0x00,0x00,0x18,0x22,0x24,0x24,0x08,0x29,0x2a,0x2b,0x3e,0x54,0x55,0x56,0x82, 0x3e,0x3f,0x3e,0x65,0x4f,0x4f,0x4f,0x3c,0x54,0x54,0x55,0x22,0x00,0x00,0x00, 0x03,0x43,0x45,0x46,0x95,0x7b,0x80,0x83,0xff,0x77,0x7a,0x7d,0xff,0x75,0x7a, 0x7c,0xff,0x6e,0x72,0x74,0xf0,0x5d,0x5e,0x60,0xc9,0x44,0x44,0x45,0x8c,0x2c, 0x2d,0x2d,0x56,0x3c,0x3c,0x3d,0x37,0x3b,0x3c,0x3d,0x19,0x00,0x00,0x00,0x01, 0x09,0x08,0x09,0x00,0x1a,0x19,0x1a,0x00,0x27,0x27,0x28,0x00,0x47,0x48,0x48, 0x00,0x59,0x5a,0x5c,0x00,0x25,0x26,0x27,0x00,0x88,0x3a,0x3b,0x3c,0x00,0x8f, 0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x8e,0x00,0x00,0x00,0x00,0x19, 0x00,0x00,0x00,0x01,0x32,0x34,0x34,0x71,0x75,0x78,0x7c,0xf3,0x82,0x86,0x89, 0xff,0x85,0x89,0x8b,0xff,0x80,0x82,0x85,0xf8,0x6c,0x6e,0x6f,0xd0,0x4f,0x50, 0x51,0x9c,0x6f,0x71,0x72,0xe3,0x7d,0x80,0x81,0xff,0x71,0x75,0x77,0xff,0x69, 0x6c,0x6f,0xff,0x6f,0x73,0x75,0xff,0x76,0x7a,0x7c,0xff,0x78,0x7b,0x7d,0xff, 0x74,0x78,0x7b,0xff,0x63,0x66,0x69,0xf1,0x79,0x7b,0x7d,0xc5,0x7c,0x7e,0x7f, 0x90,0x2f,0x30,0x31,0x2e,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x47,0x48, 0x48,0x00,0x59,0x5a,0x5c,0x00,0x25,0x26,0x27,0x00,0x88,0x3a,0x3b,0x3c,0x00, 0x8f,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x8e,0x00,0x00,0x00,0x00, 0x19,0x00,0x00,0x00,0x02,0x4c,0x4f,0x50,0xae,0x75,0x79,0x7d,0xff,0x6f,0x74, 0x77,0xff,0x72,0x76,0x7a,0xff,0x78,0x7b,0x80,0xff,0x7f,0x82,0x86,0xff,0x82, 0x86,0x89,0xff,0x80,0x84,0x86,0xff,0x82,0x84,0x86,0xff,0x80,0x81,0x83,0xff, 0x87,0x8c,0x8e,0xff,0x74,0x78,0x7b,0xff,0x6b,0x6f,0x71,0xff,0x6d,0x72,0x73, 0xff,0x6b,0x6f,0x72,0xff,0x6e,0x72,0x75,0xff,0xde,0xe0,0xe2,0xff,0xff,0xff, 0xff,0xff,0xa1,0xa4,0xa5,0xc5,0x3a,0x3a,0x3b,0x50,0x14,0x14,0x15,0x16,0x00, 0x00,0x00,0x02,0x59,0x5a,0x5c,0x00,0x25,0x26,0x27,0x00,0x88,0x3a,0x3b,0x3c, 0x00,0x8f,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x8e,0x00,0x00,0x00, 0x00,0x07,0x00,0x00,0x00,0x04,0x49,0x4c,0x4e,0xa9,0x6e,0x73,0x76,0xff,0x6c, 0x72,0x74,0xff,0x6e,0x72,0x76,0xff,0x6f,0x73,0x78,0xff,0x70,0x75,0x79,0xff, 0x82,0x73,0x77,0x7b,0xff,0x12,0x74,0x78,0x7c,0xff,0xb5,0xb9,0xbb,0xff,0xed, 0xf0,0xf2,0xff,0xb4,0xb7,0xb9,0xff,0x6c,0x70,0x72,0xff,0x6e,0x71,0x74,0xff, 0x63,0x67,0x6a,0xff,0x93,0x96,0x98,0xff,0xf8,0xf8,0xf9,0xff,0xff,0xff,0xff, 0xff,0xc2,0xc2,0xc3,0xff,0x64,0x66,0x68,0xf0,0x63,0x65,0x66,0xd7,0x5b,0x5c, 0x5e,0xa7,0x51,0x52,0x53,0x7c,0x20,0x21,0x22,0x23,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,0x86,0x38,0x39,0x3a,0x00,0x8f,0x00,0x00,0x00,0x00,0x01,0xff, 0xff,0xff,0x00,0x8e,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x06,0x46,0x4a, 0x4c,0xb0,0x73,0x78,0x7b,0xff,0x6e,0x72,0x77,0xff,0x6e,0x73,0x77,0xff,0x6f, 0x74,0x77,0xff,0x70,0x75,0x79,0xff,0x72,0x77,0x7a,0xff,0x70,0x74,0x78,0xff, 0x72,0x78,0x7d,0xff,0xcf,0xd4,0xd7,0xff,0xff,0xff,0xff,0xff,0xed,0xee,0xef, 0xff,0x79,0x7e,0x80,0xff,0x6b,0x6f,0x72,0xff,0x67,0x6c,0x6f,0xff,0xc1,0xc3, 0xc4,0xff,0x82,0xff,0xff,0xff,0xff,0x0b,0xb0,0xb2,0xb3,0xff,0x60,0x64,0x65, 0xff,0x6b,0x6d,0x6f,0xff,0x67,0x69,0x6b,0xff,0x9e,0xa3,0xa6,0xfe,0xb2,0xb6, 0xb8,0xd3,0x3c,0x3d,0x3d,0x3d,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x4d, 0x4e,0x4f,0x00,0x4f,0x50,0x51,0x00,0x83,0x4e,0x4f,0x50,0x00,0x8f,0x00,0x00, 0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x89,0x00,0x00,0x00,0x00,0x10,0x0d,0x0d, 0x0d,0x14,0x3e,0x3e,0x3f,0x7c,0x36,0x36,0x37,0x5c,0x47,0x49,0x4a,0x26,0x29, 0x2a,0x2b,0x0e,0x00,0x00,0x00,0x08,0x4e,0x50,0x53,0xb8,0x76,0x7a,0x7e,0xff, 0x71,0x76,0x79,0xff,0x71,0x76,0x7a,0xff,0x72,0x77,0x7a,0xff,0x72,0x77,0x7b, 0xff,0x73,0x78,0x7b,0xff,0x6f,0x74,0x78,0xff,0x78,0x7e,0x83,0xff,0xd7,0xdc, 0xe0,0xff,0x82,0xff,0xff,0xff,0xff,0x04,0x99,0x9c,0x9f,0xff,0x5d,0x62,0x65, 0xff,0x84,0x88,0x8a,0xff,0xee,0xee,0xef,0xff,0x82,0xff,0xff,0xff,0xff,0x0b, 0xab,0xac,0xad,0xff,0x64,0x67,0x68,0xff,0x68,0x6a,0x6b,0xff,0x88,0x8e,0x91, 0xff,0xde,0xe2,0xe5,0xff,0xfd,0xfd,0xfd,0xff,0xa5,0xa5,0xa6,0x8f,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x99,0x9a,0x9a,0x00,0x83, 0x9a,0x9b,0x9c,0x00,0x8f,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x88, 0x00,0x00,0x00,0x00,0x11,0x12,0x14,0x14,0x12,0x47,0x4a,0x4c,0x9c,0x8b,0x8f, 0x92,0xff,0x84,0x87,0x89,0xff,0x68,0x6b,0x6c,0xde,0x55,0x57,0x58,0xb1,0x39, 0x3a,0x3b,0x87,0x5e,0x61,0x64,0xd9,0x77,0x7b,0x7f,0xff,0x72,0x78,0x7b,0xff, 0x6f,0x75,0x78,0xff,0x6f,0x74,0x78,0xff,0x75,0x7a,0x7e,0xff,0x75,0x7b,0x7e, 0xff,0x71,0x76,0x79,0xff,0x82,0x88,0x8c,0xff,0xe4,0xea,0xec,0xff,0x82,0xff, 0xff,0xff,0xff,0x03,0xcc,0xce,0xd0,0xff,0x73,0x78,0x7b,0xff,0xbd,0xc0,0xc1, 0xff,0x83,0xff,0xff,0xff,0xff,0x0b,0xa0,0xa2,0xa3,0xff,0x57,0x5a,0x5c,0xff, 0x80,0x85,0x88,0xff,0xd3,0xd8,0xdc,0xff,0xff,0xff,0xff,0xff,0xf1,0xf0,0xf0, 0xf9,0x3c,0x3b,0x3c,0x6b,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x0c,0x00,0x00, 0x00,0x02,0x16,0x17,0x17,0x00,0x83,0x1a,0x1b,0x1b,0x00,0x8f,0x00,0x00,0x00, 0x00,0x01,0xff,0xff,0xff,0x00,0x88,0x00,0x00,0x00,0x00,0x11,0x40,0x42,0x44, 0x45,0x60,0x65,0x68,0xf9,0x70,0x76,0x79,0xff,0x74,0x79,0x7d,0xff,0x7f,0x84, 0x87,0xff,0x88,0x8c,0x8f,0xff,0x87,0x8b,0x8e,0xff,0x7f,0x82,0x84,0xff,0x7a, 0x7d,0x80,0xff,0x72,0x76,0x77,0xff,0x7d,0x81,0x84,0xff,0x7e,0x84,0x89,0xff, 0x71,0x76,0x7a,0xff,0x78,0x7d,0x80,0xff,0x73,0x78,0x7b,0xff,0x8e,0x94,0x97, 0xff,0xf4,0xf7,0xf7,0xff,0x82,0xff,0xff,0xff,0xff,0x04,0xf8,0xf8,0xf8,0xff, 0xdf,0xe2,0xe3,0xff,0xfa,0xfb,0xfb,0xff,0xfe,0xff,0xff,0xff,0x82,0xff,0xff, 0xff,0xff,0x0b,0xd1,0xd3,0xd5,0xff,0x98,0x9e,0xa1,0xff,0xc2,0xc8,0xcd,0xff, 0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xaa,0xaa,0xd0,0x00,0x00,0x00, 0x42,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x03,0x24,0x25, 0x25,0x00,0x83,0x26,0x27,0x27,0x00,0x8f,0x00,0x00,0x00,0x00,0x01,0xff,0xff, 0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x01,0x24,0x25,0x27, 0x27,0x59,0x5d,0x5f,0xd4,0x74,0x79,0x7c,0xff,0x68,0x6d,0x71,0xff,0x66,0x6b, 0x6e,0xff,0x68,0x6c,0x71,0xff,0x71,0x76,0x7a,0xff,0x79,0x7f,0x82,0xff,0x7b, 0x80,0x83,0xff,0x82,0x86,0x8a,0xff,0xd2,0xd6,0xd7,0xff,0xdb,0xdd,0xdf,0xff, 0x87,0x8d,0x91,0xff,0x73,0x79,0x7c,0xff,0x73,0x78,0x7c,0xff,0x98,0x9d,0x9e, 0xff,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xff,0x83,0xff, 0xff,0xff,0xff,0x02,0xfe,0xfe,0xff,0xff,0xfe,0xff,0xff,0xff,0x82,0xff,0xff, 0xff,0xff,0x02,0xeb,0xef,0xf1,0xff,0xf4,0xf6,0xf8,0xff,0x82,0xff,0xff,0xff, 0xff,0x06,0x83,0x83,0x83,0xc9,0x0e,0x0e,0x0e,0x65,0x04,0x04,0x04,0x2f,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x03,0x24,0x25,0x25,0x00,0x83,0x26,0x27,0x27, 0x00,0x8f,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00, 0x00,0x11,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0b,0x52,0x55,0x57,0xb2,0x8b, 0x90,0x94,0xff,0x7d,0x82,0x85,0xff,0x78,0x7d,0x80,0xff,0x72,0x77,0x7a,0xff, 0x6c,0x71,0x74,0xff,0x69,0x6e,0x72,0xff,0x63,0x68,0x6c,0xff,0xa7,0xae,0xb3, 0xff,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xe8,0xe9,0xff,0x93,0x98, 0x9c,0xff,0x76,0x7b,0x7f,0xff,0xc3,0xc6,0xc8,0xff,0x82,0xff,0xff,0xff,0xff, 0x03,0xff,0xfe,0xff,0xff,0xff,0xfe,0xfe,0xff,0xfe,0xfe,0xff,0xff,0x82,0xff, 0xfe,0xff,0xff,0x01,0xff,0xfe,0xfe,0xff,0x85,0xff,0xff,0xff,0xff,0x0a,0xf6, 0xf6,0xf6,0xff,0x8e,0x8e,0x8e,0xfb,0x70,0x70,0x71,0xf3,0x64,0x65,0x65,0xdf, 0x55,0x57,0x57,0xa2,0x31,0x33,0x33,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x01,0x27,0x28,0x28,0x00,0x26,0x27,0x27,0x00,0x8f,0x00,0x00,0x00,0x00,0x01, 0xff,0xff,0xff,0x00,0x87,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x0b,0x36,0x38,0x39,0x82,0x90,0x95,0x98,0xfd,0x8c,0x91,0x94,0xff, 0x88,0x8d,0x90,0xff,0x85,0x8a,0x8e,0xff,0x81,0x86,0x89,0xff,0x7b,0x80,0x84, 0xff,0x71,0x76,0x7b,0xff,0x92,0x99,0x9d,0xff,0xef,0xf1,0xf3,0xff,0x82,0xff, 0xff,0xff,0xff,0x03,0xe7,0xe9,0xea,0xff,0xc2,0xc7,0xcb,0xff,0xf2,0xf5,0xf6, 0xff,0x82,0xff,0xff,0xff,0xff,0x02,0xfe,0xff,0xff,0xff,0xff,0xfe,0xff,0xff, 0x84,0xff,0xff,0xff,0xff,0x0f,0xfe,0xfe,0xff,0xff,0xff,0xfe,0xfe,0xff,0xff, 0xff,0xff,0xff,0xfe,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xe2,0xe2,0xe2,0xff, 0x5f,0x5f,0x5f,0xff,0x61,0x62,0x62,0xff,0x91,0x94,0x95,0xff,0xda,0xdd,0xdf, 0xff,0xce,0xcf,0xd1,0xe2,0x28,0x28,0x28,0x27,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x02,0x2e,0x2e,0x2e,0x00,0x8f,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff, 0x00,0x87,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08, 0x16,0x17,0x18,0x42,0x80,0x85,0x88,0xe8,0x97,0x9c,0x9f,0xff,0x90,0x95,0x98, 0xff,0x8e,0x93,0x97,0xff,0x8c,0x91,0x95,0xff,0x8a,0x90,0x93,0xff,0x85,0x8b, 0x8f,0xff,0x86,0x8c,0x90,0xff,0xd0,0xd2,0xd5,0xff,0x83,0xff,0xff,0xff,0xff, 0x82,0xfc,0xfd,0xfd,0xff,0x82,0xff,0xff,0xff,0xff,0x01,0xff,0xff,0xfe,0xff, 0x87,0xff,0xff,0xff,0xff,0x07,0xfe,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff, 0xff,0xff,0xff,0xf9,0xf9,0xfa,0xff,0xa8,0xaa,0xac,0xff,0xa6,0xaa,0xae,0xff, 0xf2,0xf6,0xf8,0xff,0x82,0xff,0xff,0xff,0xff,0x04,0x38,0x38,0x38,0x60,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x8f,0x00,0x00,0x00, 0x00,0x01,0xff,0xff,0xff,0x00,0x88,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00, 0x05,0x1c,0x1e,0x1f,0x3b,0x6e,0x72,0x75,0xe7,0x8d,0x93,0x97,0xff,0x91,0x96, 0x9a,0xff,0x95,0x9a,0x9d,0xff,0x96,0x9b,0x9f,0xff,0x94,0x99,0x9c,0xff,0x90, 0x96,0x9a,0xff,0x8a,0x90,0x93,0xff,0xaf,0xb4,0xb7,0xff,0xfc,0xfc,0xfd,0xff, 0xff,0xff,0xff,0xff,0xfe,0xff,0xfe,0xff,0x82,0xff,0xff,0xff,0xff,0x01,0xfe, 0xff,0xff,0xff,0x82,0xff,0xff,0xff,0xff,0x07,0xed,0xee,0xef,0xff,0xc0,0xc2, 0xc4,0xff,0xae,0xb1,0xb3,0xff,0xab,0xae,0xb0,0xff,0xb0,0xb3,0xb5,0xff,0xd0, 0xd1,0xd2,0xff,0xfe,0xff,0xfe,0xff,0x82,0xff,0xff,0xff,0xff,0x04,0xfe,0xff, 0xfe,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xfa,0xfd,0xff,0xff,0x82, 0xff,0xff,0xff,0xff,0x05,0xd6,0xd6,0xd6,0xe8,0x26,0x26,0x27,0x54,0x00,0x00, 0x00,0x1c,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x01,0x8f,0x00,0x00,0x00,0x00, 0x01,0xff,0xff,0xff,0x00,0x84,0x00,0x00,0x00,0x00,0x13,0x20,0x20,0x21,0x1a, 0x2e,0x30,0x30,0x39,0x27,0x28,0x29,0x2b,0x31,0x32,0x33,0x1d,0x19,0x19,0x19, 0x1a,0x54,0x57,0x59,0xa5,0x82,0x88,0x8b,0xfd,0x7d,0x82,0x85,0xff,0x80,0x85, 0x89,0xff,0x7f,0x85,0x88,0xff,0x88,0x8e,0x92,0xff,0x93,0x99,0x9c,0xff,0x98, 0x9d,0xa1,0xff,0x95,0x9c,0x9e,0xff,0x9a,0xa0,0xa5,0xff,0xe5,0xe7,0xe8,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xfe,0xff,0xff,0xff,0x82,0xff,0xff, 0xff,0xff,0x0a,0xf5,0xf5,0xf5,0xff,0xaf,0xb2,0xb4,0xff,0x8c,0x8f,0x91,0xff, 0x9e,0xa2,0xa3,0xff,0xba,0xbc,0xbe,0xff,0xc0,0xc2,0xc4,0xff,0xb1,0xb3,0xb5, 0xff,0x8f,0x92,0x96,0xff,0x95,0x98,0x9b,0xff,0xe1,0xe1,0xe2,0xff,0x82,0xff, 0xff,0xff,0xff,0x01,0xff,0xfe,0xff,0xff,0x83,0xff,0xff,0xff,0xff,0x06,0xf6, 0xf6,0xf6,0xfb,0x30,0x30,0x30,0x8c,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x22, 0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x02,0x8f,0x00,0x00,0x00,0x00,0x01,0xff, 0xff,0xff,0x00,0x83,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x01,0x4c,0x4f, 0x51,0x9b,0x86,0x8a,0x8c,0xed,0x7b,0x7f,0x80,0xe9,0x74,0x78,0x7a,0xe4,0x6f, 0x71,0x75,0xe3,0x7d,0x81,0x83,0xfc,0x81,0x85,0x87,0xff,0x78,0x7d,0x82,0xff, 0x79,0x80,0x84,0xff,0x7b,0x81,0x85,0xff,0x7c,0x82,0x84,0xff,0x7f,0x84,0x87, 0xff,0x7e,0x83,0x87,0xff,0x84,0x89,0x8d,0xff,0x94,0x9c,0xa0,0xff,0xd5,0xd9, 0xdb,0xff,0x84,0xff,0xff,0xff,0xff,0x05,0xe0,0xe1,0xe2,0xff,0x8c,0x90,0x92, 0xff,0xa6,0xa9,0xaa,0xff,0xe4,0xe5,0xe5,0xff,0xfc,0xfc,0xfc,0xff,0x83,0xff, 0xff,0xff,0xff,0x04,0xf1,0xf2,0xf2,0xff,0xb7,0xba,0xbb,0xff,0x86,0x88,0x8b, 0xff,0xdc,0xdc,0xdd,0xff,0x82,0xff,0xff,0xff,0xff,0x01,0xfe,0xfe,0xff,0xff, 0x82,0xff,0xff,0xff,0xff,0x08,0x70,0x70,0x70,0xbb,0x00,0x00,0x00,0x53,0x00, 0x00,0x00,0x3b,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x00,0x47,0x49,0x4a,0x01,0x8d,0x00,0x00,0x00,0x00,0x01,0xff, 0xff,0xff,0x00,0x83,0x00,0x00,0x00,0x00,0x12,0x3b,0x3d,0x3e,0x3b,0x68,0x6c, 0x70,0xea,0x7f,0x84,0x87,0xff,0x83,0x87,0x8b,0xff,0x86,0x8a,0x8d,0xff,0x8a, 0x8f,0x92,0xff,0x84,0x89,0x8c,0xff,0x80,0x83,0x86,0xff,0x7a,0x7f,0x82,0xff, 0x75,0x7a,0x7e,0xff,0x71,0x77,0x7c,0xff,0x72,0x79,0x7d,0xff,0x75,0x7b,0x80, 0xff,0x77,0x7d,0x82,0xff,0x7d,0x83,0x88,0xff,0xd0,0xd6,0xd8,0xff,0xf4,0xf8, 0xf9,0xff,0xfe,0xfe,0xfe,0xff,0x82,0xff,0xff,0xff,0xff,0x1e,0xda,0xdb,0xdc, 0xff,0x8a,0x8e,0x91,0xff,0xc7,0xc9,0xca,0xff,0xff,0xff,0xff,0xff,0xf8,0xf8, 0xf8,0xff,0xe1,0xe1,0xe1,0xff,0xbb,0xbb,0xbb,0xff,0xb9,0xba,0xb9,0xff,0xe1, 0xe1,0xe1,0xff,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xc1,0xc2,0xc4,0xff, 0x90,0x94,0x95,0xff,0xef,0xf0,0xef,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xff, 0xff,0xff,0xff,0xff,0xff,0xb6,0xb6,0xb6,0xe2,0x12,0x12,0x12,0x72,0x00,0x00, 0x00,0x47,0x00,0x00,0x00,0x2d,0x26,0x27,0x28,0x26,0x2f,0x30,0x31,0x12,0x06, 0x06,0x06,0x03,0x43,0x45,0x46,0x7a,0x53,0x55,0x57,0x97,0x27,0x28,0x28,0x4b, 0x25,0x27,0x28,0x1e,0x44,0x46,0x47,0x10,0x00,0x00,0x00,0x01,0x89,0x00,0x00, 0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00,0x24,0x00,0x00, 0x00,0x01,0x32,0x34,0x35,0x41,0x5e,0x61,0x63,0xed,0x74,0x77,0x7a,0xff,0x74, 0x79,0x7c,0xff,0x73,0x78,0x7b,0xff,0x79,0x7e,0x81,0xff,0x83,0x88,0x8c,0xff, 0x83,0x88,0x8d,0xff,0x84,0x88,0x8b,0xff,0x85,0x8a,0x8d,0xff,0xb0,0xb7,0xba, 0xff,0xad,0xb2,0xb5,0xff,0xa1,0xa7,0xaa,0xff,0x9f,0xa5,0xa9,0xff,0xaf,0xb5, 0xbb,0xff,0xfa,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff, 0xff,0xff,0xff,0xe1,0xe1,0xe3,0xff,0x8d,0x91,0x93,0xff,0xd4,0xd6,0xd7,0xff, 0xff,0xff,0xff,0xff,0xd9,0xd9,0xd9,0xff,0x65,0x64,0x65,0xff,0x23,0x23,0x23, 0xff,0x0e,0x10,0x10,0xff,0x0b,0x0d,0x0d,0xff,0x22,0x23,0x24,0xff,0x7f,0x80, 0x81,0xff,0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xa5,0xa8,0xaa,0xff,0xb4, 0xb6,0xb8,0xff,0xfe,0xfe,0xfe,0xff,0x82,0xff,0xff,0xff,0xff,0x10,0x69,0x6a, 0x69,0xbc,0x01,0x01,0x01,0x56,0x00,0x00,0x00,0x37,0x0b,0x0b,0x0b,0x44,0x61, 0x65,0x68,0xca,0x58,0x5a,0x5b,0xb1,0x44,0x45,0x46,0x8b,0x7e,0x7f,0x82,0xea, 0x8b,0x8e,0x92,0xff,0x7d,0x81,0x84,0xff,0x73,0x77,0x79,0xe6,0x5b,0x5d,0x5f, 0xba,0x4f,0x4f,0x51,0x78,0x4c,0x4c,0x4c,0x2a,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x01,0x86,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x82,0x00,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0b,0x23,0x25,0x25,0x71, 0x71,0x74,0x77,0xf7,0x74,0x78,0x7b,0xff,0x6b,0x6f,0x72,0xff,0x70,0x74,0x77, 0xff,0x75,0x79,0x7d,0xff,0x72,0x77,0x7a,0xff,0x78,0x7d,0x80,0xff,0x99,0xa1, 0xa6,0xff,0xf1,0xf8,0xfd,0xff,0xff,0xff,0xff,0xff,0xfb,0xfc,0xfd,0xff,0xf6, 0xf7,0xf8,0xff,0xf3,0xf5,0xf7,0xff,0xfc,0xfd,0xfe,0xff,0xfe,0xff,0xfe,0xff, 0xff,0xff,0xff,0xff,0xf3,0xf3,0xf3,0xff,0x95,0x98,0x9b,0xff,0xd2,0xd3,0xd4, 0xff,0xfd,0xfd,0xfd,0xfc,0x80,0x80,0x80,0xc7,0x53,0x53,0x54,0xec,0x2b,0x2d, 0x2f,0xff,0x1b,0x1e,0x1f,0xff,0x22,0x25,0x27,0xff,0x21,0x23,0x24,0xff,0x14, 0x16,0x18,0xff,0x14,0x17,0x19,0xff,0x70,0x73,0x75,0xff,0xf2,0xf2,0xf2,0xff, 0xe3,0xe4,0xe6,0xff,0x9a,0x9d,0xa0,0xff,0xee,0xee,0xee,0xff,0x82,0xff,0xff, 0xff,0xff,0x12,0xc5,0xc7,0xc8,0xf4,0x6a,0x6a,0x6c,0xc4,0x3c,0x3d,0x3d,0x84, 0x59,0x5b,0x5e,0xab,0x9b,0xa1,0xa6,0xff,0x92,0x98,0x9c,0xff,0x8c,0x92,0x95, 0xff,0x7d,0x82,0x84,0xff,0x8b,0x8d,0x8f,0xff,0xa8,0xab,0xae,0xff,0x7e,0x82, 0x86,0xff,0x8f,0x94,0x96,0xff,0xf7,0xf7,0xf8,0xff,0x9a,0x9c,0x9c,0xd8,0x40, 0x41,0x43,0x91,0x5e,0x60,0x63,0x55,0x29,0x2b,0x2c,0x11,0x00,0x00,0x00,0x02, 0x84,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x1e,0x2f,0x30, 0x31,0x91,0x82,0x87,0x8a,0xfc,0x7d,0x81,0x84,0xff,0x78,0x7c,0x7f,0xff,0x75, 0x79,0x7c,0xff,0x6f,0x73,0x76,0xff,0x6c,0x70,0x73,0xff,0xa9,0xb0,0xb6,0xff, 0xf3,0xf8,0xfb,0xff,0x87,0xff,0xff,0xff,0xff,0x11,0xaf,0xb2,0xb4,0xff,0xb9, 0xbc,0xbd,0xff,0xff,0xff,0xff,0xff,0x78,0x78,0x78,0xbd,0x01,0x01,0x01,0x63, 0x49,0x4a,0x4c,0xc8,0x72,0x76,0x7a,0xff,0x2c,0x30,0x32,0xff,0x2b,0x2e,0x31, 0xff,0x2a,0x2d,0x2f,0xff,0x28,0x2c,0x2e,0xff,0x22,0x25,0x28,0xff,0x38,0x3d, 0x40,0xff,0xac,0xaf,0xb2,0xff,0xff,0xff,0xff,0xff,0xa7,0xaa,0xab,0xff,0xcf, 0xd1,0xd2,0xff,0x82,0xff,0xff,0xff,0xff,0x14,0xf3,0xf5,0xf6,0xff,0xe9,0xeb, 0xef,0xff,0xe6,0xe9,0xeb,0xff,0xdf,0xe2,0xe4,0xfd,0xbd,0xc3,0xc6,0xff,0x90, 0x96,0x9b,0xff,0x94,0x9a,0x9e,0xff,0x89,0x90,0x93,0xff,0xb8,0xbe,0xc2,0xff, 0xf0,0xf1,0xf1,0xff,0x7a,0x7e,0x82,0xff,0x9c,0xa0,0xa2,0xff,0xff,0xff,0xff, 0xff,0xa8,0xaa,0xab,0xff,0x7a,0x7d,0x80,0xff,0xb4,0xb7,0xb9,0xfa,0x94,0x95, 0x95,0x6a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x82, 0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00,0x0c, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x15,0x01,0x01,0x02, 0x2e,0x45,0x46,0x48,0xb2,0x8f,0x93,0x96,0xff,0x8b,0x8f,0x91,0xff,0x85,0x89, 0x8d,0xff,0x81,0x85,0x89,0xff,0x7d,0x82,0x85,0xff,0x86,0x8b,0x8e,0xff,0xc2, 0xc5,0xc7,0xff,0x82,0xff,0xff,0xff,0xff,0x02,0xff,0xff,0xfe,0xff,0xff,0xfe, 0xff,0xff,0x82,0xff,0xff,0xff,0xff,0x13,0xdb,0xdd,0xde,0xff,0x9c,0xa0,0xa1, 0xff,0xfa,0xfb,0xfc,0xff,0xa5,0xa5,0xa5,0xd6,0x02,0x02,0x02,0x63,0x00,0x00, 0x00,0x52,0x43,0x45,0x46,0xab,0x87,0x8c,0x90,0xff,0x35,0x39,0x3b,0xff,0x31, 0x34,0x37,0xff,0x30,0x34,0x37,0xff,0x2e,0x32,0x35,0xff,0x2a,0x2d,0x30,0xff, 0x35,0x39,0x3c,0xff,0x79,0x7d,0x80,0xff,0xf4,0xf5,0xf5,0xff,0xc2,0xc4,0xc5, 0xff,0xae,0xb0,0xb1,0xff,0xfc,0xfc,0xfc,0xff,0x85,0xff,0xff,0xff,0xff,0x10, 0xd4,0xd6,0xd8,0xff,0x82,0x88,0x8d,0xff,0x8d,0x94,0x98,0xff,0x8c,0x92,0x97, 0xff,0xca,0xd1,0xd5,0xff,0xfa,0xfb,0xfb,0xff,0xb6,0xb9,0xbc,0xff,0xd3,0xd5, 0xd6,0xff,0xff,0xff,0xff,0xff,0xa4,0xa6,0xa8,0xff,0xb8,0xbc,0xbe,0xff,0xeb, 0xec,0xeb,0xf3,0x57,0x57,0x56,0x60,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x08, 0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x83, 0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0a,0x00,0x00, 0x00,0x1b,0x30,0x32,0x34,0x91,0x81,0x86,0x89,0xff,0x78,0x7d,0x7f,0xff,0x76, 0x7b,0x7f,0xff,0x7a,0x81,0x85,0xff,0x80,0x86,0x8a,0xff,0x7f,0x84,0x88,0xff, 0x7e,0x83,0x87,0xff,0xc0,0xc3,0xc4,0xff,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xff,0xa9,0xad, 0xaf,0xff,0xd1,0xd4,0xd4,0xff,0xe9,0xe9,0xe9,0xf3,0x1c,0x1c,0x1c,0x80,0x00, 0x00,0x00,0x4e,0x00,0x00,0x00,0x3e,0x34,0x36,0x38,0x90,0x66,0x6c,0x6f,0xfd, 0x3c,0x41,0x44,0xff,0x35,0x3a,0x3d,0xff,0x36,0x39,0x3d,0xff,0x34,0x37,0x3b, 0xff,0x31,0x35,0x38,0xff,0x33,0x37,0x3a,0xff,0x72,0x75,0x79,0xff,0xdc,0xdd, 0xde,0xff,0xdb,0xdd,0xde,0xff,0xa2,0xa5,0xa7,0xff,0xf8,0xf8,0xf8,0xff,0x84, 0xff,0xff,0xff,0xff,0x11,0xfe,0xfe,0xfe,0xff,0xc4,0xc6,0xc8,0xff,0x9f,0xa3, 0xa6,0xff,0xad,0xb2,0xb5,0xff,0x7e,0x84,0x89,0xff,0xcb,0xd2,0xd5,0xff,0xff, 0xff,0xff,0xff,0xfc,0xfd,0xfe,0xff,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff, 0xf2,0xf4,0xf5,0xff,0xfe,0xfe,0xfe,0xff,0xd5,0xd5,0xd5,0xf5,0x3e,0x3e,0x3e, 0xac,0x1d,0x1d,0x1e,0x60,0x03,0x03,0x04,0x15,0x00,0x00,0x00,0x04,0x82,0x00, 0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x84,0x00,0x00,0x00,0x00,0x19,0x00, 0x00,0x00,0x03,0x25,0x26,0x27,0x21,0x5e,0x61,0x64,0xc3,0x80,0x86,0x89,0xff, 0x77,0x7c,0x7f,0xff,0x71,0x77,0x7a,0xff,0x7a,0x80,0x83,0xff,0x79,0x7f,0x83, 0xff,0x7c,0x82,0x87,0xff,0x7a,0x81,0x86,0xff,0x7a,0x80,0x84,0xff,0xc1,0xc4, 0xc5,0xff,0xfb,0xfb,0xfb,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xde, 0xdf,0xdf,0xff,0xa4,0xa7,0xa9,0xff,0xf5,0xf6,0xf7,0xff,0x6f,0x70,0x6f,0xb5, 0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x2a,0x27,0x2a,0x2c, 0x86,0x4d,0x52,0x56,0xfd,0x3f,0x44,0x47,0xff,0x82,0x3a,0x3f,0x42,0xff,0x08, 0x39,0x3d,0x40,0xff,0x35,0x3a,0x3d,0xff,0x36,0x3b,0x3e,0xff,0x7a,0x7f,0x81, 0xff,0xd3,0xd5,0xd7,0xff,0xec,0xec,0xee,0xff,0xa7,0xaa,0xac,0xff,0xf6,0xf7, 0xf7,0xff,0x83,0xff,0xff,0xff,0xff,0x07,0xf6,0xf6,0xf6,0xff,0xc3,0xc5,0xc7, 0xff,0x9c,0xa2,0xa7,0xff,0xdc,0xe0,0xe2,0xff,0xf7,0xf6,0xf7,0xff,0xbb,0xbe, 0xc1,0xff,0xe7,0xea,0xeb,0xff,0x86,0xff,0xff,0xff,0xff,0x08,0xc1,0xc3,0xc3, 0xff,0x89,0x8b,0x8d,0xff,0xcc,0xd0,0xd2,0xfe,0x2c,0x2d,0x2d,0x53,0x00,0x00, 0x00,0x0a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x83, 0x00,0x00,0x00,0x00,0x08,0x23,0x24,0x26,0x16,0x48,0x4a,0x4b,0x6a,0x62,0x66, 0x68,0xc0,0x8c,0x92,0x95,0xff,0x89,0x8d,0x91,0xff,0x85,0x8b,0x8e,0xff,0x7c, 0x83,0x87,0xff,0x7e,0x84,0x88,0xff,0x82,0x7d,0x83,0x87,0xff,0x04,0x7e,0x85, 0x88,0xff,0x7a,0x80,0x85,0xff,0x9b,0xa1,0xa8,0xff,0xed,0xef,0xf0,0xff,0x82, 0xff,0xff,0xff,0xff,0x14,0xbf,0xc0,0xc2,0xff,0xc2,0xc5,0xc6,0xff,0xeb,0xeb, 0xeb,0xf5,0x16,0x16,0x16,0x72,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x2a,0x00, 0x00,0x00,0x19,0x4a,0x4e,0x4f,0x91,0x7a,0x80,0x84,0xff,0x42,0x47,0x4a,0xff, 0x3d,0x42,0x46,0xff,0x3d,0x43,0x45,0xff,0x3c,0x41,0x45,0xff,0x3b,0x40,0x43, 0xff,0x39,0x3e,0x41,0xff,0x5a,0x60,0x63,0xff,0xb6,0xba,0xbc,0xff,0xf3,0xf3, 0xf3,0xff,0xad,0xb0,0xb1,0xff,0xf6,0xf6,0xf6,0xff,0x82,0xff,0xff,0xff,0xff, 0x05,0xe8,0xe8,0xe9,0xff,0xbf,0xc2,0xc4,0xff,0xa8,0xaf,0xb3,0xff,0xa5,0xaa, 0xaf,0xff,0xc9,0xcd,0xd1,0xff,0x83,0xff,0xff,0xff,0xff,0x5d,0xf8,0xf8,0xf8, 0xff,0xdb,0xdb,0xdd,0xff,0xca,0xcc,0xcd,0xff,0xcf,0xd0,0xd0,0xff,0xee,0xef, 0xef,0xff,0xff,0xff,0xff,0xff,0xe9,0xee,0xf0,0xff,0xe7,0xe9,0xeb,0xff,0xec, 0xee,0xef,0xf2,0x22,0x23,0x24,0x57,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x07, 0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x0e,0x0e,0x0f, 0x0d,0x3e,0x40,0x41,0x67,0x54,0x58,0x5a,0xc4,0x7e,0x83,0x86,0xff,0x8c,0x92, 0x95,0xff,0x87,0x8c,0x8f,0xff,0x89,0x8e,0x92,0xff,0x8c,0x91,0x95,0xff,0x86, 0x8d,0x91,0xff,0x7d,0x84,0x89,0xff,0x7c,0x84,0x88,0xff,0x7d,0x83,0x88,0xff, 0x79,0x7d,0x81,0xff,0x92,0x97,0x9b,0xff,0xda,0xe1,0xe6,0xff,0xf9,0xfb,0xfb, 0xff,0xff,0xff,0xff,0xff,0xf2,0xf2,0xf2,0xff,0xa7,0xaa,0xac,0xff,0xe6,0xe7, 0xe7,0xff,0x8d,0x8d,0x8d,0xc5,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x1b,0x00,0x00,0x00,0x0f,0x70,0x75,0x78,0xb4,0x95,0x9b,0xa0,0xff, 0x42,0x46,0x49,0xff,0x41,0x46,0x49,0xff,0x40,0x46,0x49,0xff,0x40,0x45,0x48, 0xff,0x40,0x44,0x48,0xff,0x3e,0x42,0x46,0xff,0x3c,0x42,0x46,0xff,0x8e,0x93, 0x95,0xff,0xf0,0xf2,0xf2,0xff,0xb0,0xb3,0xb4,0xff,0xf6,0xf6,0xf6,0xff,0xff, 0xff,0xff,0xff,0xec,0xed,0xee,0xff,0x93,0x97,0x9a,0xff,0x95,0x9b,0x9f,0xff, 0xb6,0xbd,0xc1,0xff,0xbd,0xc3,0xc7,0xff,0xc6,0xcd,0xd1,0xff,0xf3,0xf5,0xf6, 0xff,0xff,0xff,0xff,0xff,0xec,0xed,0xed,0xff,0xc1,0xc4,0xc4,0xff,0xdb,0xdc, 0xdd,0xff,0xe7,0xe7,0xe8,0xff,0xdc,0xdd,0xde,0xff,0xb3,0xb6,0xb7,0xff,0xe4, 0xe7,0xe7,0xff,0xff,0xff,0xff,0xff,0xfa,0xfb,0xfb,0xfc,0x4e,0x4f,0x51,0x9c, 0x02,0x02,0x02,0x39,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x0a,0x00,0x00,0x00, 0x02,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x2a,0x2c,0x2d,0x54,0x77,0x7c, 0x80,0xfb,0x79,0x7f,0x82,0xff,0x72,0x77,0x7b,0xff,0x72,0x77,0x7a,0xff,0x77, 0x7c,0x7f,0xff,0x7d,0x82,0x85,0xff,0x82,0x87,0x8b,0xff,0x87,0x8b,0x90,0xff, 0x87,0x8d,0x90,0xff,0x85,0x8b,0x8f,0xff,0x7d,0x83,0x88,0xff,0x79,0x81,0x86, 0xff,0xb6,0xbe,0xc2,0xff,0xfd,0xff,0xff,0xff,0x82,0xff,0xff,0xff,0xff,0x3d, 0xdc,0xdd,0xde,0xff,0x9e,0xa1,0xa3,0xff,0xfd,0xfd,0xfd,0xff,0x48,0x47,0x47, 0x9b,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x10,0x0e,0x10, 0x10,0x1a,0x67,0x6c,0x70,0xd6,0x76,0x7b,0x7f,0xff,0x41,0x47,0x4a,0xff,0x44, 0x49,0x4d,0xff,0x43,0x49,0x4d,0xff,0x43,0x48,0x4b,0xff,0x41,0x47,0x4b,0xff, 0x42,0x48,0x4b,0xff,0x5b,0x61,0x66,0xff,0xa5,0xa8,0xab,0xff,0xe8,0xe9,0xe9, 0xff,0xad,0xb0,0xb2,0xff,0xf7,0xf7,0xf7,0xff,0xff,0xff,0xff,0xff,0xda,0xdd, 0xde,0xff,0x96,0x9b,0x9f,0xff,0x89,0x8e,0x92,0xff,0x87,0x8e,0x92,0xff,0x96, 0x9c,0xa1,0xff,0xce,0xd3,0xd6,0xff,0xfb,0xfc,0xfc,0xff,0xf0,0xf1,0xf2,0xff, 0xc3,0xc6,0xc8,0xff,0xda,0xdb,0xdb,0xff,0x9d,0x9e,0x9d,0xff,0x64,0x65,0x65, 0xff,0xad,0xad,0xae,0xff,0xdf,0xe2,0xe3,0xff,0xbb,0xbf,0xc0,0xff,0xff,0xff, 0xff,0xff,0xc3,0xc6,0xc6,0xe7,0x08,0x08,0x07,0x6b,0x00,0x00,0x00,0x3a,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x02,0xff,0xff,0xff,0x00, 0x00,0x00,0x00,0x02,0x43,0x45,0x46,0x84,0x85,0x8a,0x8e,0xff,0x76,0x7b,0x7e, 0xff,0x79,0x7e,0x81,0xff,0x77,0x7b,0x7f,0xff,0x74,0x79,0x7c,0xff,0x75,0x7a, 0x7d,0xff,0x76,0x7c,0x7f,0xff,0x7b,0x7e,0x83,0xff,0x7c,0x81,0x85,0xff,0x82, 0x88,0x8c,0xff,0x9f,0xa5,0xa9,0xff,0xc9,0xcf,0xd4,0xff,0xea,0xee,0xf1,0xff, 0xfe,0xfe,0xff,0xff,0x82,0xff,0xff,0xff,0xff,0x3a,0xd2,0xd3,0xd4,0xff,0xb3, 0xb6,0xb7,0xff,0xf9,0xf9,0xf9,0xf8,0x15,0x16,0x16,0x73,0x00,0x00,0x00,0x3a, 0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x0a,0x19,0x1a,0x1b,0x43,0x61,0x67,0x6b, 0xeb,0x54,0x5b,0x5f,0xff,0x44,0x49,0x4d,0xff,0x45,0x4b,0x4f,0xff,0x44,0x4a, 0x4f,0xff,0x45,0x4a,0x4e,0xff,0x43,0x48,0x4b,0xff,0x47,0x4c,0x50,0xff,0x86, 0x8c,0x91,0xff,0xd3,0xd6,0xd9,0xff,0xdc,0xdd,0xde,0xff,0xaa,0xad,0xaf,0xff, 0xf9,0xf9,0xf9,0xff,0xff,0xff,0xff,0xff,0xe3,0xe5,0xe7,0xff,0xac,0xb2,0xb6, 0xff,0xb6,0xbd,0xc3,0xff,0xe3,0xe8,0xe9,0xff,0xe5,0xe7,0xe8,0xff,0xf5,0xf6, 0xf7,0xff,0xfd,0xfd,0xfd,0xff,0xcc,0xce,0xcf,0xff,0xd8,0xd9,0xda,0xf8,0x82, 0x83,0x85,0xfb,0x1b,0x1e,0x20,0xff,0x10,0x12,0x15,0xff,0x18,0x1c,0x1e,0xff, 0xa7,0xac,0xae,0xff,0xc3,0xc8,0xcb,0xff,0xdc,0xe0,0xe3,0xff,0xe3,0xe8,0xeb, 0xfb,0x9d,0x9f,0xa0,0xe9,0x71,0x73,0x74,0xab,0x00,0x00,0x00,0x1d,0x00,0x00, 0x00,0x0a,0x00,0x00,0x00,0x02,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x03,0x29, 0x2a,0x2b,0x6f,0x61,0x63,0x65,0xe4,0x6e,0x72,0x74,0xfd,0x7e,0x83,0x86,0xff, 0x7d,0x83,0x86,0xff,0x79,0x7e,0x82,0xff,0x7e,0x84,0x87,0xff,0x78,0x7d,0x81, 0xff,0x77,0x7d,0x81,0xff,0x8f,0x95,0x99,0xff,0xc5,0xca,0xcd,0xff,0xec,0xee, 0xf1,0xff,0x82,0xff,0xff,0xff,0xff,0x01,0xff,0xfe,0xff,0xff,0x82,0xff,0xff, 0xff,0xff,0x0c,0xc4,0xc7,0xc8,0xff,0xc7,0xc9,0xca,0xff,0xcb,0xcb,0xca,0xe2, 0x10,0x10,0x10,0x5f,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x15,0x00,0x00,0x00, 0x07,0x4c,0x4f,0x51,0x8c,0x89,0x90,0x94,0xff,0x4c,0x52,0x56,0xff,0x44,0x4a, 0x4e,0xff,0x46,0x4c,0x50,0xff,0x82,0x46,0x4b,0x50,0xff,0x07,0x44,0x49,0x4d, 0xff,0x4a,0x51,0x54,0xff,0x89,0x90,0x94,0xff,0xe0,0xe2,0xe4,0xff,0xcb,0xcc, 0xcd,0xff,0xbb,0xbc,0xbf,0xff,0xfd,0xfd,0xfd,0xff,0x82,0xff,0xff,0xff,0xff, 0x03,0xdf,0xe1,0xe2,0xff,0xaa,0xaf,0xb3,0xff,0xe7,0xe8,0xe8,0xff,0x82,0xff, 0xff,0xff,0xff,0x1c,0xdd,0xdf,0xdf,0xff,0xd8,0xd9,0xda,0xfa,0x40,0x40,0x40, 0xa2,0x44,0x47,0x4a,0xe9,0x32,0x35,0x38,0xff,0x2c,0x30,0x32,0xff,0x21,0x25, 0x27,0xff,0x65,0x6a,0x6c,0xff,0xc9,0xcd,0xd1,0xff,0xbe,0xc2,0xc5,0xff,0xf5, 0xfa,0xfd,0xff,0xfd,0xff,0xff,0xff,0xc9,0xcd,0xcf,0xe5,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0x00,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x11,0x0a,0x0b,0x0b,0x41,0x27,0x27,0x29,0x92,0x3b,0x3c, 0x3e,0xc5,0x5d,0x5f,0x62,0xee,0x70,0x73,0x76,0xff,0x7c,0x81,0x84,0xff,0x76, 0x7b,0x7f,0xff,0x7f,0x85,0x89,0xff,0xc5,0xcc,0xd1,0xff,0x83,0xff,0xff,0xff, 0xff,0x1a,0xfe,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xfb, 0xfc,0xfc,0xff,0xba,0xbd,0xbe,0xff,0xd5,0xd6,0xd7,0xff,0xa9,0xa9,0xa9,0xd4, 0x21,0x21,0x21,0x55,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x10,0x0e,0x0e,0x0e, 0x21,0x85,0x8b,0x8e,0xd8,0x80,0x86,0x8a,0xff,0x43,0x49,0x4d,0xff,0x46,0x4b, 0x4f,0xff,0x47,0x4c,0x51,0xff,0x47,0x4d,0x50,0xff,0x47,0x4d,0x51,0xff,0x46, 0x4b,0x4f,0xff,0x4b,0x51,0x54,0xff,0x6b,0x72,0x76,0xff,0xe6,0xe7,0xe8,0xff, 0xc3,0xc4,0xc5,0xff,0xd8,0xd9,0xd9,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xff, 0xff,0x82,0xff,0xff,0xff,0xff,0x20,0xe4,0xe5,0xe6,0xff,0xc6,0xc9,0xcb,0xff, 0xed,0xef,0xf0,0xff,0xfa,0xfa,0xfa,0xff,0xe8,0xea,0xea,0xff,0x6c,0x6c,0x6c, 0xbb,0x01,0x01,0x02,0x64,0x4e,0x52,0x54,0xee,0x3a,0x3f,0x42,0xff,0x35,0x3a, 0x3d,0xff,0x2f,0x33,0x35,0xff,0x52,0x56,0x59,0xff,0xbe,0xc2,0xc5,0xff,0xbf, 0xc3,0xc6,0xff,0xf8,0xfd,0xff,0xff,0xbe,0xc2,0xc4,0xe9,0x3f,0x41,0x42,0x7d, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x05,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x21,0x00,0x00, 0x00,0x37,0x00,0x00,0x00,0x48,0x21,0x21,0x21,0x9d,0x68,0x6a,0x6b,0xfd,0x6b, 0x6d,0x6e,0xff,0x68,0x6c,0x6c,0xff,0x78,0x7d,0x80,0xff,0xca,0xd1,0xd5,0xff, 0x84,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xf8, 0xf8,0xf9,0xff,0xb4,0xb6,0xb8,0xff,0xdc,0xdd,0xde,0xff,0xa8,0xa7,0xa7,0xcf, 0x1c,0x1c,0x1c,0x4e,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0e,0x40,0x43,0x46, 0x7d,0x8e,0x94,0x99,0xff,0x51,0x56,0x5a,0xff,0x42,0x48,0x4c,0xff,0x47,0x4c, 0x50,0xff,0x46,0x4d,0x50,0xff,0x82,0x47,0x4d,0x51,0xff,0x06,0x46,0x4c,0x4f, 0xff,0x68,0x6f,0x73,0xff,0x90,0x95,0x99,0xff,0xed,0xee,0xee,0xff,0xba,0xbc, 0xbe,0xff,0xec,0xec,0xed,0xff,0x85,0xff,0xff,0xff,0xff,0x23,0xd8,0xdb,0xdf, 0xff,0xe6,0xea,0xec,0xff,0xed,0xec,0xee,0xff,0xd5,0xd6,0xd7,0xfc,0x25,0x25, 0x24,0x82,0x09,0x09,0x09,0x6a,0x6b,0x71,0x74,0xf9,0x3a,0x40,0x43,0xff,0x3b, 0x41,0x43,0xff,0x36,0x3b,0x3e,0xff,0x47,0x4b,0x4f,0xff,0xae,0xb3,0xb6,0xff, 0xc9,0xce,0xd1,0xff,0xd4,0xd9,0xdc,0xf1,0x1c,0x1d,0x1d,0x88,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x06,0xff,0xff, 0xff,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x2f,0x1d,0x1e,0x1f,0x7d,0x75,0x7a,0x7c,0xfc, 0x74,0x78,0x7a,0xff,0x66,0x68,0x6a,0xff,0x67,0x6a,0x6c,0xff,0x90,0x94,0x97, 0xff,0xb6,0xb7,0xb9,0xff,0xc9,0xcb,0xcb,0xff,0xe6,0xe6,0xe7,0xff,0xfa,0xfa, 0xf9,0xff,0x82,0xff,0xff,0xff,0xff,0x15,0xf9,0xf9,0xf8,0xff,0xb3,0xb5,0xb7, 0xff,0xda,0xdb,0xdd,0xff,0xa9,0xa8,0xa8,0xd1,0x21,0x21,0x21,0x4c,0x00,0x00, 0x00,0x20,0x1e,0x20,0x21,0x43,0x85,0x8b,0x90,0xee,0x6a,0x70,0x75,0xff,0x3f, 0x44,0x48,0xff,0x45,0x4a,0x4e,0xff,0x45,0x4b,0x4f,0xff,0x46,0x4c,0x50,0xff, 0x47,0x4c,0x50,0xff,0x44,0x49,0x4d,0xff,0x53,0x59,0x5d,0xff,0x8f,0x96,0x9a, 0xff,0xd4,0xd6,0xd9,0xff,0xd9,0xda,0xdb,0xff,0xb5,0xb7,0xb9,0xff,0xf9,0xf9, 0xfa,0xff,0x84,0xff,0xff,0xff,0xff,0x3a,0xfa,0xfa,0xfa,0xff,0xe6,0xe9,0xec, 0xff,0xfe,0xff,0xff,0xff,0xec,0xec,0xed,0xff,0x9c,0x9f,0x9f,0xdf,0x09,0x09, 0x09,0x60,0x26,0x28,0x29,0x96,0x5b,0x61,0x65,0xff,0x3d,0x42,0x46,0xff,0x3e, 0x44,0x47,0xff,0x39,0x3e,0x41,0xff,0x69,0x6d,0x72,0xff,0xb6,0xbb,0xbf,0xff, 0xcb,0xd0,0xd3,0xff,0xc1,0xc4,0xc7,0xed,0x09,0x09,0x09,0x72,0x00,0x00,0x00, 0x41,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x04,0xff,0xff, 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x0d,0x0f,0x10,0x11,0x37,0x45,0x4a,0x4c,0xcf,0x62,0x68,0x6b,0xfe, 0x68,0x6d,0x71,0xff,0x6e,0x73,0x77,0xff,0x75,0x7a,0x7e,0xff,0x6d,0x71,0x74, 0xff,0x66,0x6b,0x6f,0xff,0x6b,0x70,0x73,0xff,0x81,0x85,0x89,0xff,0xb9,0xbe, 0xc1,0xff,0xf6,0xf7,0xf8,0xff,0xff,0xff,0xff,0xff,0xfb,0xfb,0xfb,0xff,0xb4, 0xb7,0xb8,0xff,0xce,0xcf,0xd1,0xff,0xcb,0xcb,0xcb,0xe1,0x11,0x11,0x11,0x4d, 0x09,0x0a,0x0a,0x38,0x6d,0x73,0x75,0xd2,0x7c,0x81,0x85,0xff,0x41,0x46,0x4a, 0xff,0x3f,0x44,0x48,0xff,0x43,0x48,0x4c,0xff,0x44,0x49,0x4d,0xff,0x45,0x4a, 0x4e,0xff,0x45,0x4b,0x4f,0xff,0x41,0x47,0x4b,0xff,0x71,0x77,0x7c,0xff,0x9d, 0xa4,0xa7,0xff,0xf2,0xf3,0xf3,0xff,0xc0,0xc1,0xc3,0xff,0xd1,0xd2,0xd3,0xff, 0x82,0xff,0xff,0xff,0xff,0x18,0xeb,0xeb,0xeb,0xff,0xba,0xbd,0xbf,0xff,0xcf, 0xd3,0xd5,0xff,0xf9,0xf9,0xfa,0xff,0xff,0xff,0xff,0xff,0xfd,0xfd,0xfc,0xff, 0xec,0xf1,0xf1,0xff,0x7d,0x7f,0x80,0xc0,0x00,0x00,0x00,0x4b,0x5b,0x5f,0x63, 0xc9,0x52,0x57,0x5b,0xff,0x3f,0x45,0x48,0xff,0x40,0x45,0x49,0xff,0x3b,0x40, 0x43,0xff,0x77,0x7c,0x80,0xff,0xb7,0xbc,0xbf,0xff,0xc9,0xce,0xd1,0xff,0xe8, 0xee,0xf1,0xfe,0xa5,0xa8,0xaa,0xe1,0x1a,0x1a,0x1a,0x61,0x00,0x00,0x00,0x1d, 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x02,0xff,0xff,0xff,0x00,0x82,0x00,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x0a,0x0b,0x0b,0x15,0x40,0x43,0x46,0xb9, 0x61,0x67,0x6b,0xff,0x82,0x5b,0x60,0x64,0xff,0x08,0x5b,0x61,0x64,0xff,0x62, 0x68,0x6c,0xff,0x6b,0x70,0x75,0xff,0x6f,0x74,0x78,0xff,0x71,0x77,0x7b,0xff, 0x72,0x78,0x7c,0xff,0xb7,0xc0,0xc6,0xff,0xf8,0xfb,0xfc,0xff,0x82,0xff,0xff, 0xff,0xff,0x2d,0xbe,0xbf,0xc1,0xff,0xba,0xbd,0xbe,0xff,0xfa,0xfa,0xf9,0xf6, 0x35,0x35,0x36,0x89,0x5a,0x5e,0x61,0xca,0x78,0x7e,0x81,0xff,0x44,0x49,0x4c, 0xff,0x3a,0x3f,0x42,0xff,0x40,0x45,0x48,0xff,0x41,0x46,0x4a,0xff,0x42,0x47, 0x4b,0xff,0x44,0x49,0x4d,0xff,0x3e,0x43,0x47,0xff,0x53,0x59,0x5d,0xff,0x81, 0x87,0x8c,0xff,0xce,0xd2,0xd2,0xff,0xe6,0xe6,0xe7,0xff,0xa9,0xac,0xae,0xff, 0xf0,0xf0,0xf1,0xff,0xff,0xff,0xff,0xff,0xf3,0xf3,0xf4,0xff,0x93,0x97,0x99, 0xff,0x73,0x78,0x7b,0xff,0xb4,0xba,0xbe,0xff,0xf0,0xf1,0xf1,0xff,0xf9,0xf9, 0xf9,0xff,0xf9,0xfb,0xfb,0xff,0xe9,0xef,0xf2,0xff,0x64,0x66,0x67,0xae,0x21, 0x23,0x24,0x84,0x67,0x6c,0x70,0xf6,0x42,0x48,0x4b,0xff,0x41,0x46,0x4a,0xff, 0x3c,0x41,0x44,0xff,0x48,0x4e,0x51,0xff,0x9c,0xa1,0xa5,0xff,0xbc,0xc1,0xc4, 0xff,0xda,0xdf,0xe2,0xff,0xe6,0xeb,0xee,0xff,0xd4,0xda,0xdd,0xfb,0x2e,0x2f, 0x2f,0x6f,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0xff, 0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00,0x04,0x05,0x06,0x06,0x0b,0x3b,0x3f, 0x40,0xa4,0x65,0x6a,0x6e,0xff,0x5d,0x64,0x66,0xff,0x83,0x5d,0x62,0x66,0xff, 0x06,0x5c,0x61,0x65,0xff,0x5b,0x61,0x65,0xff,0x5d,0x63,0x67,0xff,0x5d,0x62, 0x66,0xff,0x72,0x78,0x7c,0xff,0xd8,0xde,0xe2,0xff,0x83,0xff,0xff,0xff,0xff, 0x12,0xce,0xd0,0xd0,0xff,0xa0,0xa3,0xa4,0xff,0xfe,0xfe,0xfe,0xfe,0xb7,0xb9, 0xbb,0xfc,0x5d,0x61,0x65,0xff,0x3d,0x41,0x44,0xff,0x35,0x3a,0x3c,0xff,0x3a, 0x3f,0x43,0xff,0x3c,0x41,0x44,0xff,0x3e,0x43,0x46,0xff,0x40,0x44,0x48,0xff, 0x3b,0x40,0x43,0xff,0x46,0x4c,0x4f,0xff,0x71,0x78,0x7d,0xff,0xa3,0xa8,0xab, 0xff,0xfb,0xfb,0xfb,0xff,0xb9,0xbb,0xbd,0xff,0xc9,0xca,0xcc,0xff,0x82,0xff, 0xff,0xff,0xff,0x27,0xc1,0xc3,0xc6,0xff,0x78,0x7f,0x82,0xff,0xa1,0xa7,0xab, 0xff,0x94,0x9a,0x9e,0xff,0x8f,0x95,0x99,0xff,0xc7,0xce,0xd0,0xff,0xf7,0xfb, 0xfc,0xff,0xe0,0xe5,0xe9,0xff,0x97,0x9a,0x9d,0xdb,0x5f,0x64,0x68,0xe6,0x43, 0x47,0x4b,0xff,0x3d,0x42,0x45,0xff,0x3d,0x43,0x47,0xff,0x36,0x3b,0x3f,0xff, 0x6f,0x75,0x77,0xff,0xbc,0xc1,0xc5,0xff,0xbf,0xc4,0xc7,0xff,0xd0,0xd5,0xd8, 0xfa,0x80,0x83,0x85,0xcd,0x3f,0x40,0x41,0x8d,0x05,0x05,0x05,0x3f,0x00,0x00, 0x00,0x1d,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x02,0xff,0xff,0xff,0x00,0x00, 0x00,0x00,0x00,0x22,0x24,0x24,0x09,0x3b,0x3e,0x40,0x8c,0x6f,0x74,0x78,0xff, 0x63,0x69,0x6c,0xff,0x5f,0x65,0x68,0xff,0x5f,0x64,0x68,0xff,0x5f,0x63,0x67, 0xff,0x5d,0x63,0x67,0xff,0x5d,0x63,0x66,0xff,0x5e,0x63,0x67,0xff,0x5a,0x5f, 0x63,0xff,0x56,0x5b,0x5f,0xff,0xac,0xb2,0xb5,0xff,0x82,0xff,0xff,0xff,0xff, 0x08,0xfe,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xdf,0xe0,0xe1,0xff,0x90,0x93, 0x97,0xff,0xea,0xeb,0xeb,0xff,0xe8,0xe8,0xe9,0xff,0x37,0x3b,0x3e,0xff,0x24, 0x28,0x2b,0xff,0x82,0x35,0x3a,0x3c,0xff,0x0a,0x38,0x3c,0x3f,0xff,0x38,0x3e, 0x40,0xff,0x35,0x39,0x3d,0xff,0x3f,0x44,0x47,0xff,0x68,0x6e,0x72,0xff,0x9c, 0xa1,0xa5,0xff,0xf1,0xf1,0xf2,0xff,0xd6,0xd8,0xd8,0xff,0xa4,0xa8,0xa9,0xff, 0xf7,0xf8,0xf8,0xff,0x82,0xff,0xff,0xff,0xff,0x27,0xd0,0xd3,0xd6,0xff,0xbb, 0xc1,0xc6,0xff,0xdb,0xe2,0xe7,0xff,0xc9,0xd0,0xd4,0xff,0xb4,0xba,0xbe,0xff, 0xdc,0xe2,0xe6,0xff,0xf4,0xfa,0xfc,0xff,0xd4,0xd9,0xdd,0xff,0xc8,0xcd,0xd1, 0xff,0x53,0x57,0x5a,0xff,0x2a,0x2f,0x32,0xff,0x3a,0x3e,0x41,0xff,0x34,0x39, 0x3b,0xff,0x46,0x4b,0x4e,0xff,0x9f,0xa4,0xa9,0xff,0xb5,0xba,0xbe,0xff,0xd4, 0xd9,0xdd,0xff,0x86,0x89,0x8b,0xda,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x4c, 0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x0a,0x00,0x00,0x00, 0x02,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x52,0x55,0x56,0x1a,0x6a,0x6e, 0x70,0xde,0x81,0x86,0x8a,0xff,0x73,0x78,0x7c,0xff,0x6d,0x72,0x76,0xff,0x66, 0x6b,0x6f,0xff,0x63,0x68,0x6c,0xff,0x61,0x66,0x6a,0xff,0x60,0x64,0x69,0xff, 0x5e,0x63,0x67,0xff,0x55,0x5c,0x60,0xff,0x93,0x9a,0xa0,0xff,0xf6,0xfa,0xfc, 0xff,0x82,0xff,0xff,0xff,0xff,0x14,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff, 0xf9,0xf9,0xf9,0xff,0xa0,0xa2,0xa5,0xff,0xc0,0xc1,0xc2,0xff,0xff,0xff,0xff, 0xff,0xa1,0xa2,0xa4,0xff,0x1f,0x22,0x25,0xff,0x21,0x25,0x27,0xff,0x2e,0x32, 0x35,0xff,0x30,0x33,0x36,0xff,0x31,0x35,0x38,0xff,0x3e,0x43,0x46,0xff,0x5d, 0x63,0x66,0xff,0x94,0x99,0x9c,0xff,0xe8,0xea,0xeb,0xff,0xf0,0xf0,0xf1,0xff, 0x97,0x9b,0x9e,0xff,0xe4,0xe4,0xe5,0xff,0xff,0xff,0xff,0xff,0x82,0xfd,0xff, 0xff,0xff,0x26,0xf5,0xfa,0xfb,0xff,0xed,0xf3,0xf6,0xff,0xf6,0xfc,0xfd,0xff, 0xe6,0xed,0xf2,0xff,0xe4,0xeb,0xee,0xff,0xf4,0xf9,0xfc,0xff,0xf3,0xf9,0xfc, 0xff,0xcb,0xd1,0xd4,0xff,0xc5,0xca,0xce,0xff,0x7f,0x83,0x85,0xff,0x1a,0x1c, 0x1f,0xff,0x1f,0x22,0x25,0xff,0x36,0x3b,0x3e,0xff,0x8d,0x92,0x96,0xff,0xb8, 0xbd,0xc1,0xff,0xb6,0xbb,0xbe,0xff,0xdf,0xe4,0xe7,0xff,0xa3,0xa5,0xa8,0xe4, 0x06,0x07,0x06,0x67,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x28,0x00,0x00,0x00, 0x14,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x00,0x00, 0x00,0x00,0x20,0x20,0x22,0x11,0x44,0x45,0x47,0xb2,0x77,0x7b,0x7d,0xff,0x7c, 0x80,0x83,0xff,0x7e,0x82,0x86,0xff,0x7a,0x7f,0x82,0xff,0x73,0x79,0x7d,0xff, 0x6c,0x70,0x74,0xff,0x67,0x6c,0x70,0xff,0x5d,0x63,0x65,0xff,0x86,0x8e,0x93, 0xff,0xe8,0xee,0xf2,0xff,0x84,0xff,0xff,0xff,0xff,0x3a,0xfe,0xfe,0xff,0xff, 0xff,0xff,0xff,0xff,0xd1,0xd2,0xd3,0xff,0x8e,0x90,0x93,0xff,0xee,0xee,0xee, 0xff,0xfd,0xfd,0xfd,0xff,0xa5,0xa6,0xa7,0xff,0x38,0x3b,0x3c,0xff,0x21,0x24, 0x26,0xff,0x25,0x2a,0x2c,0xff,0x38,0x3d,0x41,0xff,0x68,0x6e,0x72,0xff,0xab, 0xaf,0xb2,0xff,0xf2,0xf2,0xf3,0xff,0xf3,0xf4,0xf4,0xff,0x9e,0xa1,0xa4,0xff, 0xd1,0xd2,0xd4,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xfa,0xff,0xff, 0xff,0xf8,0xfd,0xff,0xff,0xf9,0xfe,0xff,0xff,0xe2,0xe8,0xec,0xff,0xda,0xe0, 0xe3,0xff,0xea,0xf1,0xf6,0xff,0xf1,0xf8,0xfc,0xff,0xf3,0xf9,0xfc,0xff,0xee, 0xf3,0xf7,0xff,0xdf,0xe5,0xe8,0xff,0xb1,0xb7,0xba,0xff,0xcd,0xd3,0xd6,0xff, 0x94,0x97,0x99,0xff,0x70,0x74,0x77,0xff,0x9f,0xa4,0xa8,0xff,0xb9,0xbe,0xc1, 0xff,0xad,0xb2,0xb4,0xff,0xd2,0xd8,0xdb,0xff,0xde,0xe4,0xe6,0xff,0xdb,0xe0, 0xe3,0xff,0x47,0x48,0x49,0x9c,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x19,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0c,0x0c,0x0d,0x48,0x33,0x33,0x33, 0xbb,0x50,0x52,0x53,0xee,0x67,0x6a,0x6c,0xfe,0x75,0x79,0x7b,0xff,0x7e,0x84, 0x87,0xff,0x7d,0x82,0x86,0xff,0x76,0x7c,0x7f,0xff,0x8b,0x91,0x96,0xff,0xe6, 0xeb,0xee,0xff,0x87,0xff,0xff,0xff,0xff,0x29,0xfe,0xfe,0xfe,0xff,0xa4,0xa7, 0xa9,0xff,0x9a,0x9e,0x9f,0xff,0xfa,0xfa,0xfa,0xff,0xff,0xff,0xff,0xff,0xeb, 0xeb,0xeb,0xff,0xb2,0xb4,0xb4,0xff,0x9f,0xa1,0xa4,0xff,0xb5,0xb7,0xb9,0xff, 0xe7,0xe8,0xe8,0xff,0xfe,0xfe,0xfe,0xff,0xe2,0xe3,0xe4,0xff,0x96,0x9b,0x9d, 0xff,0xc9,0xcc,0xcd,0xff,0xff,0xff,0xff,0xff,0xf9,0xff,0xff,0xff,0xfd,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xf9,0xfe,0xff,0xff,0xeb, 0xf0,0xf1,0xff,0x87,0x8a,0x8e,0xff,0x9d,0xa2,0xa6,0xff,0xcb,0xd0,0xd3,0xff, 0xad,0xb2,0xb6,0xff,0xd0,0xd6,0xdb,0xff,0xed,0xf3,0xf6,0xff,0xc9,0xcf,0xd3, 0xff,0xa6,0xaa,0xae,0xff,0xbd,0xc2,0xc5,0xff,0xc0,0xc4,0xc7,0xff,0xae,0xb3, 0xb6,0xff,0xab,0xb0,0xb3,0xff,0xd3,0xd8,0xdb,0xff,0xb4,0xb8,0xbb,0xef,0x71, 0x73,0x75,0xcd,0x99,0x9c,0x9f,0xe8,0x34,0x35,0x36,0x8c,0x00,0x00,0x00,0x28, 0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0x00,0x00,0x0d,0xff, 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x16, 0x00,0x00,0x00,0x2f,0x04,0x04,0x04,0x61,0x25,0x25,0x26,0xa8,0x37,0x38,0x39, 0xd2,0x5a,0x5b,0x5d,0xfd,0x6b,0x6e,0x70,0xff,0x74,0x77,0x7a,0xff,0xad,0xb4, 0xb9,0xff,0xf6,0xf9,0xfb,0xff,0x82,0xff,0xff,0xff,0xff,0x03,0xe8,0xe9,0xea, 0xff,0xd5,0xd7,0xda,0xff,0xec,0xee,0xef,0xff,0x83,0xff,0xff,0xff,0xff,0x05, 0xf2,0xf3,0xf3,0xff,0x91,0x96,0x98,0xff,0x9b,0x9e,0x9f,0xff,0xe3,0xe3,0xe4, 0xff,0xfe,0xfe,0xfe,0xff,0x82,0xff,0xff,0xff,0xff,0x21,0xfe,0xff,0xff,0xff, 0xea,0xeb,0xec,0xff,0xba,0xbe,0xbf,0xff,0x8d,0x93,0x96,0xff,0xcb,0xcf,0xce, 0xff,0xff,0xff,0xff,0xff,0xf8,0xfe,0xff,0xff,0xfe,0xff,0xff,0xff,0xde,0xe2, 0xe3,0xfa,0xb4,0xb8,0xbc,0xf5,0xe2,0xe7,0xea,0xff,0xff,0xff,0xff,0xff,0xde, 0xe4,0xe7,0xff,0x60,0x63,0x67,0xff,0x4c,0x4e,0x52,0xff,0x4e,0x53,0x57,0xff, 0x5d,0x63,0x66,0xff,0xd9,0xdd,0xe2,0xff,0xe5,0xeb,0xee,0xff,0xe4,0xea,0xed, 0xff,0xd1,0xd6,0xda,0xff,0xab,0xb0,0xb3,0xff,0xa5,0xa9,0xac,0xff,0xc0,0xc5, 0xc9,0xff,0xd9,0xde,0xe2,0xff,0xe1,0xe6,0xea,0xff,0x5b,0x5d,0x5e,0xbc,0x02, 0x02,0x02,0x5e,0x03,0x04,0x04,0x5e,0x01,0x01,0x01,0x44,0x00,0x00,0x00,0x24, 0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x00,0x13,0xff, 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0e, 0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x42,0x07,0x07,0x07, 0x6f,0x3e,0x40,0x42,0xf8,0x45,0x46,0x48,0xff,0x4a,0x4c,0x4c,0xff,0x73,0x76, 0x79,0xff,0xb8,0xbd,0xc0,0xff,0xc7,0xc9,0xca,0xff,0x97,0x9a,0x9b,0xff,0x72, 0x76,0x79,0xff,0x84,0x8b,0x8f,0xff,0xcb,0xd3,0xd7,0xff,0xfd,0xff,0xff,0xff, 0x82,0xfc,0xff,0xfe,0xff,0x28,0xff,0xff,0xff,0xff,0xf4,0xf4,0xf4,0xff,0xa6, 0xaa,0xac,0xff,0x89,0x8d,0x90,0xff,0xa6,0xa9,0xab,0xfe,0xb1,0xb6,0xb7,0xff, 0xb0,0xb6,0xb7,0xff,0xa7,0xac,0xae,0xff,0x92,0x97,0x9b,0xff,0xa1,0xa6,0xa8, 0xff,0xe3,0xe7,0xe7,0xff,0xff,0xff,0xff,0xff,0xf5,0xfa,0xfe,0xff,0xf9,0xfe, 0xff,0xff,0xd9,0xdd,0xdf,0xf5,0x3e,0x40,0x40,0xa6,0x1f,0x20,0x20,0x8e,0x3d, 0x3e,0x40,0xb3,0xad,0xb0,0xb3,0xf6,0xa4,0xaa,0xae,0xff,0x60,0x66,0x6b,0xff, 0x5b,0x61,0x65,0xff,0x4a,0x50,0x54,0xff,0x8d,0x91,0x94,0xff,0xef,0xf4,0xf7, 0xff,0xdc,0xe1,0xe5,0xff,0xd6,0xdc,0xdf,0xff,0xdc,0xe1,0xe4,0xff,0xe1,0xe6, 0xea,0xff,0xdd,0xe1,0xe5,0xff,0xd7,0xdc,0xdf,0xff,0xcc,0xd0,0xd5,0xff,0xda, 0xe0,0xe4,0xff,0x63,0x65,0x67,0xba,0x04,0x04,0x04,0x55,0x00,0x00,0x00,0x42, 0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x0c,0x00,0x00,0x00, 0x03,0x82,0x00,0x00,0x00,0x00,0x3d,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0e,0x00,0x00,0x00, 0x19,0x00,0x00,0x00,0x26,0x2b,0x2d,0x2f,0xaf,0x52,0x56,0x59,0xff,0x45,0x48, 0x4b,0xff,0x3f,0x41,0x43,0xff,0x45,0x46,0x48,0xff,0x52,0x55,0x58,0xff,0x43, 0x47,0x4a,0xff,0x35,0x3a,0x3d,0xff,0x3d,0x41,0x45,0xff,0x5e,0x63,0x67,0xff, 0xd2,0xd8,0xdb,0xff,0xfb,0xff,0xff,0xff,0xf9,0xff,0xff,0xff,0xf9,0xfe,0xff, 0xff,0xf8,0xfe,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdb,0xdf, 0xdf,0xff,0xb9,0xbf,0xc2,0xff,0xac,0xb1,0xb5,0xff,0xb0,0xb5,0xb9,0xff,0xbc, 0xc1,0xc4,0xff,0xd7,0xdd,0xde,0xff,0xfc,0xff,0xff,0xff,0xfa,0xff,0xff,0xff, 0xf0,0xf6,0xfb,0xff,0xf0,0xf6,0xfa,0xff,0xfa,0xfe,0xff,0xff,0x85,0x87,0x89, 0xd0,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x50,0x0d,0x0d, 0x0d,0x86,0x3c,0x3e,0x40,0xce,0x64,0x68,0x6a,0xf6,0x6e,0x73,0x76,0xff,0x6f, 0x74,0x78,0xff,0xd7,0xda,0xdd,0xff,0xd4,0xd9,0xdc,0xff,0x94,0x99,0x9c,0xff, 0xbf,0xc5,0xc8,0xff,0xdd,0xe2,0xe5,0xff,0xce,0xd4,0xd8,0xff,0xd3,0xd8,0xdc, 0xff,0xb6,0xba,0xbd,0xff,0x6f,0x71,0x72,0xff,0xc3,0xc8,0xcb,0xff,0x7d,0x80, 0x81,0xc2,0x08,0x08,0x08,0x48,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x0f,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00, 0x00,0x01,0xff,0xff,0xff,0x00,0x82,0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x14,0x14,0x14,0x3e,0x5b,0x5f, 0x62,0xf1,0x5d,0x62,0x65,0xff,0x56,0x5b,0x5e,0xff,0x51,0x57,0x59,0xff,0x4a, 0x4e,0x52,0xff,0x42,0x47,0x4a,0xff,0x41,0x47,0x4a,0xff,0x45,0x4b,0x4e,0xff, 0x34,0x39,0x3c,0xff,0x87,0x8b,0x8c,0xff,0xfa,0xfa,0xfa,0xff,0xf8,0xfd,0xff, 0xff,0xf6,0xfc,0xfe,0xff,0xf5,0xfb,0xff,0xff,0xf5,0xfb,0xfe,0xff,0xf4,0xfa, 0xfe,0xff,0xf7,0xfc,0xff,0xff,0x82,0xfd,0xff,0xff,0xff,0x82,0xf9,0xff,0xff, 0xff,0x04,0xfb,0xff,0xff,0xff,0xfa,0xfe,0xff,0xff,0xf1,0xf6,0xfb,0xff,0xed, 0xf3,0xf7,0xff,0x82,0xed,0xf3,0xf6,0xff,0x1a,0xf4,0xfa,0xfe,0xff,0x8c,0x8e, 0x91,0xcf,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x3a,0x06,0x06,0x06,0x52,0x31,0x31,0x32,0x96,0x59,0x5b,0x5c,0xfc, 0x6f,0x72,0x73,0xff,0xab,0xb0,0xb3,0xff,0x7a,0x7e,0x80,0xff,0x63,0x68,0x6c, 0xff,0xc3,0xc9,0xce,0xff,0xbc,0xbf,0xc2,0xff,0x7d,0x81,0x83,0xff,0xc9,0xce, 0xd2,0xff,0x79,0x7b,0x7d,0xd5,0x0c,0x0c,0x0b,0xaa,0x54,0x55,0x56,0xda,0x23, 0x25,0x25,0x86,0x01,0x01,0x01,0x39,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x0e, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x83,0x00,0x00,0x00,0x00,0x01,0xff, 0xff,0xff,0x00,0x84,0x00,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x02,0x43,0x45, 0x46,0x84,0x78,0x7d,0x7f,0xff,0x6d,0x72,0x75,0xff,0x68,0x6b,0x6e,0xff,0x61, 0x65,0x68,0xff,0x5c,0x60,0x63,0xff,0x56,0x5b,0x5e,0xff,0x53,0x57,0x5a,0xff, 0x49,0x4d,0x50,0xff,0x45,0x4b,0x4e,0xff,0xce,0xcf,0xd0,0xff,0xff,0xff,0xff, 0xff,0xf2,0xf8,0xfb,0xff,0xf6,0xfb,0xfe,0xff,0xf6,0xfb,0xff,0xff,0xf3,0xf8, 0xfc,0xff,0xf1,0xf7,0xfb,0xff,0xf1,0xf6,0xfa,0xff,0x82,0xf0,0xf6,0xf9,0xff, 0x20,0xf0,0xf6,0xfa,0xff,0xef,0xf5,0xf8,0xff,0xed,0xf3,0xf7,0xff,0xec,0xf1, 0xf6,0xff,0xee,0xf3,0xf7,0xff,0xf0,0xf6,0xfa,0xff,0xec,0xf3,0xf6,0xff,0xe8, 0xef,0xf2,0xff,0xf2,0xf7,0xfb,0xff,0x9d,0xa2,0xa4,0xda,0x03,0x03,0x03,0x49, 0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x1e,0x00,0x00,0x00, 0x2b,0x01,0x01,0x01,0x3d,0x16,0x16,0x16,0x85,0x42,0x43,0x43,0xcd,0x5a,0x5e, 0x60,0xf3,0x58,0x5b,0x5d,0xfd,0x81,0x85,0x89,0xff,0xd7,0xdd,0xe2,0xff,0x78, 0x7a,0x7b,0xfe,0x4c,0x4e,0x4f,0xff,0xc2,0xc7,0xcb,0xff,0x42,0x44,0x45,0xa6, 0x00,0x00,0x00,0x5b,0x0a,0x0b,0x0b,0x5c,0x00,0x00,0x00,0x44,0x00,0x00,0x00, 0x2c,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x06,0x85,0x00,0x00,0x00,0x00,0x01, 0xff,0xff,0xff,0x00,0x84,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x02,0x2b, 0x2c,0x2d,0x51,0x66,0x6a,0x6b,0xef,0x7c,0x7f,0x82,0xff,0x7c,0x80,0x83,0xff, 0x77,0x7b,0x7e,0xff,0x6f,0x73,0x76,0xff,0x68,0x6c,0x6f,0xff,0x63,0x67,0x6a, 0xff,0x4f,0x53,0x57,0xff,0x84,0x87,0x89,0xff,0xf4,0xf5,0xf5,0xff,0xf4,0xf9, 0xfc,0xff,0xf6,0xfb,0xfe,0xff,0xe6,0xeb,0xef,0xff,0xc6,0xca,0xce,0xff,0xdf, 0xe5,0xe9,0xff,0xf0,0xf5,0xf9,0xff,0xed,0xf3,0xf7,0xff,0xec,0xf2,0xf5,0xff, 0xee,0xf3,0xf7,0xff,0xed,0xf3,0xf7,0xff,0xea,0xef,0xf3,0xff,0xe9,0xee,0xf3, 0xff,0xeb,0xf0,0xf4,0xff,0xe2,0xe8,0xeb,0xff,0xb0,0xb4,0xb6,0xff,0xbf,0xc3, 0xc6,0xff,0xe6,0xec,0xf0,0xff,0xec,0xf2,0xf7,0xff,0xaf,0xb2,0xb5,0xdf,0x11, 0x12,0x12,0x4c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0a, 0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x32,0x00,0x00,0x00, 0x43,0x08,0x09,0x09,0x63,0x1c,0x1d,0x1e,0x99,0x61,0x65,0x67,0xd7,0x77,0x7b, 0x7d,0xc9,0x22,0x22,0x23,0xa9,0x2c,0x2d,0x2d,0xd6,0x72,0x75,0x76,0xd7,0x18, 0x19,0x1a,0x73,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x2e, 0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x04,0x85,0x00,0x00, 0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x84,0x00,0x00,0x00,0x00,0x2b,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x10,0x19,0x19,0x19,0x68,0x3a,0x3a,0x3b,0xcf,0x5c, 0x5e,0x60,0xef,0x79,0x7b,0x80,0xff,0x80,0x84,0x88,0xff,0x7d,0x82,0x85,0xff, 0x74,0x78,0x7c,0xff,0x6b,0x70,0x73,0xff,0xc8,0xca,0xcc,0xff,0xfa,0xfe,0xff, 0xff,0xf3,0xfa,0xfd,0xff,0xe5,0xe9,0xed,0xff,0x87,0x8b,0x8e,0xff,0x70,0x75, 0x77,0xff,0xbd,0xc4,0xc9,0xff,0xec,0xf1,0xf5,0xff,0xea,0xf0,0xf3,0xff,0xeb, 0xf1,0xf5,0xff,0xec,0xf1,0xf5,0xff,0xe9,0xef,0xf3,0xff,0xe8,0xed,0xf0,0xff, 0xe6,0xec,0xf0,0xff,0xeb,0xf2,0xf6,0xff,0xa8,0xad,0xaf,0xff,0x43,0x43,0x43, 0xff,0x73,0x75,0x78,0xff,0xd1,0xd7,0xdb,0xff,0xef,0xf5,0xfa,0xff,0xbc,0xc1, 0xc3,0xe8,0x18,0x19,0x1a,0x53,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x1a, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x43,0x00,0x00,0x00, 0x4b,0x01,0x01,0x01,0x51,0x82,0x00,0x00,0x00,0x52,0x08,0x01,0x01,0x01,0x52, 0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 0x18,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x85,0x00, 0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x84,0x00,0x00,0x00,0x00,0x22,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x21,0x01,0x01,0x01,0x3e, 0x0c,0x0c,0x0c,0x78,0x1e,0x1e,0x1f,0xb0,0x43,0x45,0x46,0xda,0x68,0x6a,0x6c, 0xfc,0x71,0x74,0x77,0xff,0x90,0x94,0x96,0xff,0xde,0xe1,0xe4,0xff,0xf9,0xfe, 0xff,0xff,0xde,0xe3,0xe6,0xff,0x82,0x85,0x87,0xff,0x51,0x54,0x56,0xff,0x63, 0x67,0x6a,0xff,0xb5,0xbc,0xc1,0xff,0xe9,0xef,0xf2,0xff,0xea,0xee,0xf2,0xff, 0xdf,0xe4,0xe8,0xff,0xa4,0xa8,0xab,0xff,0xab,0xb0,0xb4,0xff,0xde,0xe4,0xe8, 0xff,0xe7,0xee,0xf1,0xff,0xdc,0xe1,0xe6,0xfa,0x52,0x54,0x55,0xd4,0x25,0x24, 0x24,0xda,0x4e,0x4e,0x4e,0xff,0x9a,0x9f,0xa2,0xff,0xec,0xf2,0xf5,0xff,0x7d, 0x7f,0x80,0xc9,0x05,0x05,0x05,0x49,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x0a, 0x82,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x2e, 0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x38,0x00,0x00,0x00, 0x35,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x10,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x86,0x00,0x00,0x00,0x00, 0x01,0xff,0xff,0xff,0x00,0x84,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x26,0x00,0x00,0x00, 0x37,0x00,0x00,0x00,0x45,0x03,0x03,0x03,0x63,0x49,0x4a,0x4b,0xf3,0x58,0x5a, 0x5a,0xff,0x64,0x66,0x67,0xff,0x9c,0xa0,0xa2,0xff,0xbb,0xbf,0xc3,0xff,0x7a, 0x7c,0x7f,0xff,0x50,0x53,0x56,0xff,0x56,0x59,0x5b,0xff,0x69,0x6e,0x71,0xff, 0xc2,0xc9,0xce,0xff,0xe7,0xed,0xf1,0xff,0xea,0xef,0xf3,0xff,0xa1,0xa4,0xa7, 0xff,0x43,0x44,0x44,0xff,0x6e,0x73,0x75,0xff,0xcc,0xd3,0xd7,0xff,0xe9,0xef, 0xf3,0xff,0xb9,0xbe,0xc1,0xec,0x09,0x09,0x09,0x75,0x08,0x08,0x08,0x6b,0x17, 0x17,0x17,0x94,0x2f,0x30,0x30,0xbf,0x51,0x52,0x54,0xbf,0x07,0x06,0x06,0x65, 0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x0a,0x00,0x00,0x00, 0x01,0x11,0x11,0x10,0x00,0x0e,0x0e,0x0f,0x00,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x14,0x00, 0x00,0x00,0x18,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x18, 0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x05,0x00,0x00,0x00, 0x01,0x88,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x85,0x00,0x00,0x00, 0x00,0x21,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x36,0x1b,0x1b,0x1c,0x8c, 0x42,0x42,0x43,0xd7,0x55,0x56,0x57,0xfe,0x63,0x65,0x66,0xff,0x62,0x65,0x68, 0xff,0x56,0x58,0x5a,0xff,0x5a,0x5d,0x5f,0xff,0x53,0x56,0x58,0xff,0x71,0x76, 0x79,0xff,0xcf,0xd6,0xdb,0xff,0xe8,0xee,0xf1,0xff,0xcf,0xd4,0xd7,0xff,0x56, 0x57,0x58,0xff,0x39,0x3a,0x39,0xff,0x5f,0x62,0x64,0xff,0xc2,0xc7,0xcc,0xff, 0xe7,0xed,0xf1,0xff,0x94,0x97,0x9a,0xda,0x00,0x00,0x00,0x56,0x00,0x00,0x00, 0x4b,0x00,0x00,0x00,0x47,0x02,0x02,0x02,0x4d,0x04,0x04,0x04,0x50,0x00,0x00, 0x00,0x43,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x07,0x82, 0x12,0x12,0x11,0x00,0x07,0x0e,0x0e,0x0f,0x00,0x1f,0x20,0x20,0x00,0x4b,0x4d, 0x4d,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x06,0x83,0x00,0x00,0x00,0x07,0x03,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x01,0x89,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff, 0x00,0x86,0x00,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x1c,0x00,0x00,0x00, 0x2c,0x07,0x07,0x08,0x47,0x14,0x15,0x15,0x82,0x32,0x33,0x34,0xbf,0x50,0x52, 0x53,0xee,0x5f,0x61,0x63,0xfb,0x63,0x66,0x68,0xff,0x58,0x5b,0x5c,0xff,0x80, 0x86,0x8a,0xff,0xd8,0xdf,0xe4,0xff,0xeb,0xf1,0xf4,0xff,0x82,0x85,0x86,0xfa, 0x32,0x33,0x33,0xff,0x3e,0x3f,0x3e,0xff,0x51,0x52,0x54,0xff,0xb6,0xbb,0xbf, 0xff,0xeb,0xf2,0xf5,0xff,0x79,0x7c,0x7e,0xc6,0x00,0x00,0x00,0x4a,0x00,0x00, 0x00,0x36,0x82,0x00,0x00,0x00,0x2c,0x05,0x00,0x00,0x00,0x30,0x00,0x00,0x00, 0x2a,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x04,0x82,0x12, 0x12,0x11,0x00,0x07,0x0e,0x0e,0x0f,0x00,0x1f,0x20,0x20,0x00,0x4b,0x4d,0x4d, 0x00,0x21,0x22,0x22,0x00,0x25,0x26,0x27,0x00,0x09,0x09,0x08,0x00,0x49,0x4b, 0x4c,0x00,0x8f,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x88,0x00,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0a, 0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x39,0x00,0x00,0x00, 0x48,0x06,0x06,0x06,0x68,0x26,0x27,0x28,0x9b,0x3f,0x40,0x41,0xd1,0x4f,0x51, 0x53,0xf0,0x91,0x97,0x9b,0xff,0xe6,0xed,0xf1,0xff,0xac,0xaf,0xb2,0xe7,0x1e, 0x1f,0x1f,0x9d,0x1d,0x1d,0x1d,0xbe,0x2a,0x2a,0x2a,0xe8,0x3f,0x40,0x41,0xfe, 0xaa,0xb0,0xb3,0xff,0xc4,0xc9,0xcd,0xf7,0x2f,0x30,0x31,0x93,0x00,0x00,0x00, 0x3f,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x13,0x00,0x00, 0x00,0x15,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x01,0x82,0x12,0x12,0x11,0x00,0x07,0x0e,0x0e,0x0f,0x00,0x1f,0x20, 0x20,0x00,0x4b,0x4d,0x4d,0x00,0x21,0x22,0x22,0x00,0x25,0x26,0x27,0x00,0x09, 0x09,0x08,0x00,0x49,0x4b,0x4c,0x00,0x8f,0x00,0x00,0x00,0x00,0x01,0xff,0xff, 0xff,0x00,0x8a,0x00,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x08,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x2b,0x00,0x00, 0x00,0x37,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x4c,0x19,0x19,0x1a,0x7c,0x43, 0x46,0x46,0xaa,0x6b,0x6f,0x70,0xd3,0x21,0x21,0x22,0x92,0x00,0x00,0x00,0x59, 0x00,0x00,0x00,0x54,0x05,0x05,0x05,0x6d,0x16,0x16,0x16,0x9d,0x40,0x42,0x43, 0xbb,0x3c,0x3d,0x3e,0x90,0x01,0x01,0x01,0x50,0x00,0x00,0x00,0x33,0x00,0x00, 0x00,0x18,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0x00,0x05, 0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x83,0x12,0x12,0x11,0x00,0x07, 0x0e,0x0e,0x0f,0x00,0x1f,0x20,0x20,0x00,0x4b,0x4d,0x4d,0x00,0x21,0x22,0x22, 0x00,0x25,0x26,0x27,0x00,0x09,0x09,0x08,0x00,0x49,0x4b,0x4c,0x00,0x8f,0x00, 0x00,0x00,0x00,0x01,0xff,0xff,0xff,0x00,0x8b,0x00,0x00,0x00,0x00,0x15,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x12, 0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x2f,0x00,0x00,0x00, 0x3a,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x4a,0x00,0x00, 0x00,0x43,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x26, 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x04,0x9e,0x00,0x00,0x00,0x00,0x01,0xff, 0xff,0xff,0x00,0x8d,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x15,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x27,0x82,0x00,0x00,0x00,0x2e,0x04,0x00,0x00, 0x00,0x28,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x24,0x82, 0x00,0x00,0x00,0x2c,0x04,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x15,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x02,0x9e,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff, 0x00,0x8f,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x10,0x82,0x00,0x00, 0x00,0x14,0x09,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0a, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00, 0x0f,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x9f,0x00,0x00,0x00,0x00,0x01, 0xff,0xff,0xff,0x00,0x92,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x05,0x04,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x04, 0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0xa0,0x00,0x00,0x00,0x00 }; static const GdkPixdata config_pixdata = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 10709, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 252, /* rowstride */ 63, /* width */ 60, /* height */ config_pixdata_pixel_data /* pixel_data */ }; nvidia-settings/src/image_data/color.png0000664000175000017500000001236012236467170020532 0ustar albertoalbertoPNG  IHDR9<"gAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?>"?߿? f7߿`h2H}/dAO6 D󇡲g%Z)5@~10A"O Ū$` +?208ͻ F7ݎ]y_ׂ&02bٟH HG?~2b:yë ]Qǫ140zhO `x~ӕ_A/+Hrﳧ{ 2F@, @X@  7^լ5$m/j{Y}$%ϘnãY ?2.yMy3h *@+'X472Li 'O 3AWՋLxdd"ʛHaK9O~J LLL , bc0M|g+'  ϻ(q(YXXD￿obπx'? 860z2qQP!: u  ]u)RKх ZZ" ט̝ޙ` g.3o.HoKͿQ}^MBM;(^+>[ x@-%Cl e1hʎeP(YB=,L)wҖ<0 0at-" w@!"W+*F_g>ndæ00/s/ Uu6(o!!(=u HU;8}/K׾(N!>L<~"nQѱ4=x+qo$Btnndd*n(:Q$7RdI :%c[Uk6 x ߠIFS =qty.!,"&(MH*rccHtݠ:1>{óG.( d5ʻjϝ=SEC"K _x𦲬r3ۻW;VVrLVhGiqlPğƫj|IVb{ WG(08'bv65~s&7ŷ'TjZ# @vu @ G]]'х0 "c+s޶RTx*4ӯ(ʥɩW== ds[XW3UEngmm~覉 a<[F_ܣ8e5ahȜIRB^IE*Zr|X͛&Qjp4[լrZYMhe~fvgfglvnƤ`Z(=xP(%xBkE=xSHzBhHRfΌ76 I]2f}w9GU9vdrR=0ж*>00 +- jBt6j1W;IDȃhY*9/`Z*fM#] Tf)HGC@hե=6Ij.2)xuNm,cj`".Db;akxs3u'st>:L*cx,--!9 C7 g:1jt bZtqƏ +~mEIwг7^ٽUMKBjw=>x4jj o}xL,6ɑ:/6H ǘ|nhyYxPM'L%qePMt<_nh4\&Pu u_:/$`1 =|P5J4VpvԝBSݚ=/DmCT)pxVJJ_X-jN>;`(+U]]D7CXJ2r",-1ވ}H}v"Wd6*-T~r19<+!NCn&K`G߹$νEQ;M*k&e;$s8+dkPZVk|H[Z%H|-ıeYʯST6ٜKK])^qp9^UuASԟֈBd2INSآHc&c͝166k__ŝ?ThyۤYyK O*7=5 m.:2TJ#W'>;ÈWv! gz}=wѼaMIVGi䉓w@O~}SOc}u(zk1=[k5ѵmiKZv)f‹ï%׏D"A@BF(_Ɔu-LMOƍx@z!M>#U8w7;U9knnnah('r3iF>ZAg[BhoθMH4C3:NW( U~_#ݲ˔%9ق8k^/T 1]o7( YaY뾆F%qN&-Gd{jΞb㸪33ٵn4?M J $@h+x@BT>O/ *> ! H ǠZ9P ]<|g?V GMGg³/>ťS_| P K8~~xɯ_ =5?7 kM۔^ ѵj5mq<4;}` > n쀶k7 <3/q8"AHC4?$ߴg xhȆvD8~Mu|O]%Ϯ73ET}R7q"\) Wx0"MM3h>M a(89"@<i9Z$S]VKϻmP2[ n G dH瘸H@ ŤNqlLϕ_ r;pY$]sq/"i$%-[3MD6,sUo]V*UNVU P(!$N \"I( $ A9/ uR5 ;]GY-СF4 09Qp ,ۄw\jKSpn-xbzg`jA7",%YyKK'~J*2)0J.1nc/ĎQǡvx+Щv2RTY٘v.B;'#*ݮߍa{JFΈWG~$XF}X 9z9lK?:96VB׆Tƪ?bޢ*Ѽ[V6W.\i:|-B(iMnwСYX_ori.$Z2Dh{!v }T!kيvMרGվEVּ )FIk|۠zٮk-ԁ6GU+SFNDTR=WT*~d}7/@U"?r[b nf,%4I++Mōv%bBiqDo,7Tn5jv&+9LK 0%;hj0FrcMMaU+W,, J%U>O_e^< FY?>?;W]ڲύ_20]m<㭍LSv9A8Lr YKXw|( $PwHly ~x>ʸj|8?Ys'R/nﺾّ_^jkc|qxIO*! JOqew1`_\q݁|u zyM_ޖٿϟTG*P{Z놬v@U*9YDp "Km%  M(EѣPdA2Z&Dh`kY}>"(Rd!jHYKX2Hz-3!͌FIGBz⽯\q(g.u)ׅqN壀o50.,a(ҫ?2&K- A5ERЭ{Kac{t ֍h_'_F极qe$~@ϱaBgo{>$W}6"_[?ѽ#q w^?/?m-h(E!9a~, |eEabaI8퉂P8"Ћ ˼tArI܌VoF4v1#D5ױ\NUqVt:.ߖKn4QbRB\fFr)PxCuWv}A6F-+ƲU y?E4UA" !dum5F#u}ˍfZRYKj9. f DTz G٠*\^96^:\#ߝe)XVBb^=*mvKh"bc /є a %v( e:qLg;ZX '1R18sU0'!8y^ R= %Z\gK !? ( PZ^ak&,F p 2֫Xkg&"6^ߖd[}ZP J!G1qñYꦌ1@/QȊN!GZ!Ƕ"V|"X۫ /G .9e&pޒnLDpHqf z(E/*b0VqVT0xvMJ& s6UMGI.+ӣh[s&Kƽސj9J1g]{ާ+$v_<=QF^7pzi|RD_K h1@ rρ/Y тDhVA4("(@.)4 /3_0q2w|"F1q=Pcxd5c[}P޵=*zbv`pbc3\ `Qfvb͖ L-6;ɓ9 ]y4 }|9c8ˀ \034)ʝ. Mϑ1p$s-\qpDJj|w짴ΒIA~YAs} -DES+'P_bHYP]ѹ[$G0?,| cEF㐜ES.r{zC|*c NBSP/Ν:1*$`EECr9lRSb^y9(dMFbT)ȋ  %%kgFg<54 h4m{~Ge :/<^Z%ۜx?j6Lz*,ct )+ 'fԊ؉Lf7?gt5p}YH*Z 2nys%YҌ'׋ůFN-zC4hG5QńH+Kol!A7.jÖrIv&bX%5 o:`NxZUl!ÉƁ'B| 5QTDd)kGS@,OgHUi _[rMޤmv}]/zV²[8 B)zȣC|4!e 6xLMpM! Wh(AV=ozCj0ZwY,0V's=fhpc:Y/.D: 5B3QdShG۹_فxE_Fc+5x*Fm# Z5g { Q1@BA>^+92 'vh(4_.\8IDOڋ`JE{_ OE A_D[13%HjQd&= 0{ݥ\r[K2Ǖ$p2J[x L c[#D"eAu- ¹ϩ!,zⷮҁ &њ*o,(CB`Bځδ8R)"`O5޼~uwtr19ГɚȿtI-j*-\eU*؝BЈ9Re΁oTsPxޑn~}zA}?f~5;($v,L~ 5Ti b\Һ4SjxzubLނ1D]"K&z\S"kB_T΂ `b L;Z9@1/L43+d*=~GgK;cc;E'|ɉ Q(04$4s0>qN Gbkا`g'8e\(7B i 0/6hb%YvLӀodM"甃::) ";;:H<.KhEA L|S`3?"gpT` v%ien/ۛ6tV=^c2+ĬoI8ǫz&G@HN]15M6IH?ŕ!vc#lB:Prx,~ f%eX-\TŇ H̊"(8b(Hj4X$ Cח7 }޿IUBXAAem)gsP$3@@=]NU{H/1^o\oMEl7` vRɜqc9L ү{)] Ƌ$P׎5LLܢaQiS09?Mœ%CJvT8 t=_g S ޠu"Nj;圃e-Ό#캇ژqA9C-j.3 %; Gi}um) v8RjPQKAtO%SaT"|n2Zms|Ƀ/~ 8d4y^0NQç`Q.S ch|#(0$hsb+ ,MEC2 +ݑ~{pV@VZ yQ̕LbU@, ݽ=[8D'YXj(ܪMCȓ3^񝌃uҍ3d#t$r5X+ia7TaIs ȍe*f&Zg5dҟ߄l߷84Gћڻ4"\O r[T%gуxcWT,Ila&C#pH Ӧz>]u4rC ):pZKbW19ÑBsР!pvayjNCGY 7P/TPw\Sr=&B1&]tC:L b&+&ãbR5m.Z8<݁ls"KI a:g |(nFTq p/a7yCsq1z.a;b'G-/(O5Tߵ.|984ŰUyhj:ѧ'y-9/&+%0wFE"R,v"*O .[ Iކ5uP,ɳn!NB/\41cOu*G˼_.rVeQ`RLUc2R Ԅ}u& ʦ DHD$ ѥ lsf 8 LS!㖾P8@bڡ6R6)HI?ԲxAVMM3Ni%c^S)$V##鳃;q+=8 hH rdOo}LCѺsP$i4O3kڋOt_+8sk114͏`ɒiܦ` fE IDAT&\KRcyNTjhX en0p `T[\CPP*t!xsDŽԝADit U'~׬گnDU ?~?{nPK@Tb>HעN԰a ĪbsS@V3MM{VM'")5*jiw:9W/i- ZqVtYfC2G~qEQb$%9*s9#ϖ 1j3⃬ΧFxs_v0YE2|keXx{S57 Pb*.! ? hZB@.;-sz . fT#ʜh,8GOD.s#+i#>warL GyXD>K~NW3׳2k?-h!/[tkV4/3|EQKӢ\KWd$T+(4@RĒ>xF@p5MK$DiW:`sC7B13l6(u_q$,gc|*`*L+@߫(.vcU dB^.P\ k@̬ 5fM$- ~叏n{΃;oBzj%5$R[HPP1YO^}dTوLtZ-&zQ94ǁjk|M m/ 4Coi`{f歋v S=KQad$wֈs`LXL>{s9Nq+㞸2lvD'ay<M{'ʌ66+ጠh-i%^Cc?s|Xvn\9m g-<3 K*!pz~s5 bM{v/ GQye莜YwW]gvT|6g{L{SVeK&Ӣgqs+y +nzk$? C񊪨bKLq&QSY .jᤄ-J8ONj`cYtmT02gh*&`ȈvS"QX:=_螼ob3Mm״r)x*.[OQ~* "+Fyu-r[K1ٶ)*DO~)63ܡ&ta)fcmC5=i3Y{4YTlp5lޱmd&=~xf\24xcI4>>1A bVέ[ղoKԣ)C|M⊩P|Hwb(1ΫU1ECvRyx `ܮ c0WH'$.I}\4-b%ÇP#BHyLң4l87wQ2/%.v౟/&1ZqpV1g<ūgPY|yA\)3|a'B듬gZxƃs !/q7>ɳk>Hgԙ^O=Qho&\miI2 +wFRsu] Iʣ@]Nᝊ#0,;(u6zoaAY”i=52]M.m)gǍx\0}w]&/ }Rvx*Pv﫧[dO %o;UEl[]3_nkq:9C0tI5s\d)B# "?߾}I33:{ 'a87F=ZܽZiH, ҈O ryh焦V:WPnJ"CZHܲdD Yj($rsc R0jbz;e>A8$\U官]AyۈuI1{)Z)+xZSĖPo>t17 ̐#K&K7G0<^.q%]k7Jy[qB*7fxsx =+ސ ()F#S4Pjϥlqp2'-r=qTrS|gѰG?d.CeC^CdNW GSKC/_zmjyt*|kC91l *h>{ulCg .Ἣ=6|6L*.&APG#a`4\aʆ܆+}IZb^2(v>U`.GFO0o)Wꥶ,/$)fV 3 k#Tr xTYEKRXOYI&// ayR:~xt?ߟd2b}c|ɝSD.΃{Iⳏ}^^Qz&I9;M2; $Ћ f n 7E%wMMjP 3ǂ |/ :*TV!!tiЂbw&X׶% $AAajd@789HbE qa7~3Mc~)gͰfOi+PT*_40&فtNk9i??F{oڨk9QÐjfz1Xö<"[,uV$}4Qi;iY[;.XfwlM1a׬=HHA&3KGbzIg b c£ Ÿ6w>}Kj>LD-bG[߂t<UDm+iu4q/*6  tK~jL0\Œ#8Bݥ@6M`i"ZyftKEpEJthNx$doh3{^;0+1=LAرuȪ`_ /ESs'#;G-N(Zu.U"lhoιӈ" pKoBwV.3mUGHqG":[t׽FTøU缠7j,U"YA@YcM8@Sg X L$&-ahXSl C4ti8M$a4j6k0QZE:-H{]a2f;xW( 8>/! r+WY/(Uon}ulTW)5Ff{o ĀH.M;#9Dx8U6 Em!t|AA,jӐzsMtck>-0ܝ_Wthdjg*At!"Y'Ab6[ 4Gz=jPO`"Mn[,>N+'t%EVja]cF3iA^I ӝhc#(^n++2‘BSg85񜉖@"CڀVl>3Wʵvd y]9rvMك >6A32kHl gx*z_K8rd3l"}\8wF)S7yضo+%͎v('%Z4Zpw9)u}hePb$VX{zI得 1 lhB/*BSMH K4d ^hHp=vg:FPrrGR&[+E=7WG0g.8!PSKk(?swuK4<.6?}!/o?nLLvPU&#oKBbdTH]sE^FY3I:*)HeW-٠žcLUHyQ7X&"ꮬV;5~4YRZb[,R{!v 7 Ҹ,@p;v>ٚޫXc5ƈU})5)=5# x%<4cPf0K^GSzEyˬN Qz֡BpdOCã9-M* _yfRX&'3}Ȣ90] @ZG*^)]`% 8/="u2( Qb 9sDLp{!#mȝrm)P2o}.AP|FvZ;H ݒV0dg*ڢfb1DXug-0uS]otQ4/7F >cm9ظn*_TD>>ow0.0I?Ša ]QVyYѠ>:`ct$b2o%J)ܔȎpRa261:^3%| 2;/ٌ݂#iΉb wJo ynn;>JF5*K_3q0=mDtDc5e=9 Q&c0""=<rkiNC9ĕ:_\XS(sl^\%9 18Jpx}MֆxxWS-P)H93ISgpNZ# qҶUC-wޖm(M[o_֗ϿSo]b,b؃ZBB[sw'e?0䵆s+ hG }?¶CE6[`X'e7%Cp:RPR# -DQJ*,mA cZTHylL)UlL],+LWca*0H <Xn_ZSNVdx::a haNv.c864-)oQ+Ycv"Ġpk#>5^CG%\zD@lsPh_d=3sys6}[ obCW>xF>qۣ PVL*YC*k !#%!G5oz G!2Gr]DhOd4e5rKs4H!{gċi!Jn;@Әx1!.'޺*̘y<Ұ\ }xcV1(qff[dw\Dk/?ٛ߾}|믿~TafKH1h]pFGXr&3bns!J ,σrЦR}gלU>Ԑcvm"Y$/> =B¸$-r 1[ވhZTK=ƃT,G L(aPYqfs9C* %L{,&}7#9ZF,ѺS[X檩}{fPv;#Y-W¶!ǩ`.hӯTLx76;C3Q[\) u̼.Y<0]qJa`ə(C9Ez =#m$.IL7\1Q aMXOZA9CcUPmFԺM yjlT]!70m(D0. ٫h3tYu(95moi泲jCB3 tISqL-:4  _%S TU@v+BV,b*t3AW'i+Kod :j7=?8"碳/\P|:tC}e)70m Az!Tv[$nJ ~q j{Qg//v޿z.T-Oj?+K.r1*NSTqpytwϥ|sq70۩g[5I,  Xuq(25} 4C4SMHHx6|@zfؠ &@e孮'X7d E1R cEM li=Mw3XS\ "= ܌)n(p 0Jڕ*'ڥ̷bZ63H;\I\"r7L9>4>ƙ 8}*2ܕ泒TآkJS;G_Zyڋ"&W]%2S١F6#ϋ/2b> SЂ%(pQm:eˤ*P>%g>KVgpQڧmsj#Y0-*|WfG*TK_=cfh5 U2ʘ3DRNvmjD`Ma1P]f*`.W[T#vN4'r$Me L"dqz݂}/- B]V_֘:fàCKo~xahhĎRZ#~T!2vHCs ^KMfV%}JE.ωlgGCo";;Mx BTf ]yKSQeQrv̻4!$+-9::\hjQE=i!*A#Nyf+!CG)"⼜{ } ̒865s$2<ɼ]M-435&$֎'nru.ncrN]sB9< ~>N5i:lu!S'Nh Ro6>1>t?O<șQ'"csazPt~|I潨y-c1E_Ϯ߯_ȹ8DH :r}^7mΑCF!F}}NgsSSAp\-e`hju(IEX} ;%mܞ석ׂ1DHiO IZ*RvQ?]b)d:*`ܒ~0$IG0Qȶ8z `lW>$L@HCh4!UW )ֲ\Kж$ }%ȏݿ~}xNn"02k ) [|lav,hmnpοPVMO> G4.\_Bq+N!n맓J;UH";%B,3-(ndp0B~"[1T*"zmZT\b9A;bZ;.lR1s|W}E(- e3֢,̎OC MYsNQ^ZiG'wzn~N׹#. ?-'XFt[zx_SZJ_^X3wS+6^^ik>Zq|k;QnF3nu&Ucj%>l2%&SWFݎSV+kZUli:r eX^&}oj}}ԥf,=Xf֢vV"Tt'Lw7ÚarxrᒤYCNTCK6ȯɛToq>-":`rSVXpbͼ1gLDAnfr??>~?TKz IDAT  Po&klvKr7 B!` ˓bG~0(D Kрvۂd1U2cw)(*V=&/oo6Ea(;f1$,릮\b[:߆5 | *ۼa!3 9̂Nog Ԣ<`8Uĝ^2~,R K靘3 =$J1"CRCWop' L?c`X𢈸-lљ_gub0=1yz|س $W˓i N98{yWq\&դNG_S&A{K#("\o$ e2Pڙd.PTq _mbP&[q.,f Bu}Gާ4A*Ůt{96ұ,r\Yu >  v(sV f }q`]҃*G[l-4}ͷk-V?`!r 4ZB)4g#_5V>LK:oP^ۉ/F[7']QeAնȗ?|_>޿ǝܐ */r>GXX;U$A'V)LL(LS2@. ? m#X؂y?xVFNeUQF !qЩ1rIVg}p]UavTMHN=݌1O+Cpv;x QV2kySZ.GBdHi1>ۃ3.M0v̔ r[/v$GiS>]N NU`pC]\ 󣨒@3Ex'WPl|A)nn ;vЬ`V!HfC kZ5 p[ ߷36i5[A3٪76>1shEo\U}ILb8?:a@![ڧ7>Q}ޜ,rTKq%\lE`y Yn]>%goIo*"{oa &[3WU6̝SĔ_9|\q=BE 6!"\P,uNHJ1gޖ]^^5ARt{woo}B KqqCi8fƻ%2xwKB^X67Edt,ײ/2z KfpB&|}VӪM {{Io*"+%6+"ebi" \e+ҬB[$b䌃EEE5ls}_(75lq})@L*@wBPF8N${Ci)@@f$L1;4!CrACxt{VGr43xI7^x5Tg`Fgm^8KJ| fF`<4eF=NIgM ݄޺b%nŏ#i=RcO͞OK0i=X[̌}CE#9"t dz^zlp/<&0%0UI{i1Q41F(1HRNK~d>_OYUsHYT \KwNtXi4Lf $ *ĂϫpM+TUP&ƶNWmI($DD v"K&Toϫ%)hz[}m/~-}CZ%>/[9~ qkw $GE{DθqTIIrA*Z#3%#sJhB7D3wa-hQ?V͸O ~K[͙F4ʷ" tƷm#=O\= Bd,y1^_.I*Jf:g?Tג-l*'V x $wxkbȜTY?)r[_,=«4c<9*z.yu=g§mpw m6ɼ6BB~z# "7ʾmv[kM_Owo_&mvHabfzs+`oq[^;L*EBqƎeHfdjLDuX=MAwHpAvT_vKE良\OR8Jl}h$4dIJEk@͈7 /wu1Frxkk<"slRb*oyd'Q2{ Od蔴aΝo]GV}F̟-yXU)8 8#m² S' ɡǸO!c/]fH%!xҧ NWy: (~Yyzg?E'ǣ݂ 9HIK[MH %(; nvi'v,U\#SX"ҵRkTJ׽Z+J`డ›* VjMg@ܠ)Fd`%FŶӃuRVӖ+BTnCLh%>Xw.sxI:UŔHIJ;6C-u-9C'q&sZ3(3Mo&\j"mO䝞R4J4z=)@SPd/}_B03#>YΩPOKm;ZGҦGȌl0[y0#O{ENȖfjrkt^7VwAXPH!vjyL=pBY,LSLj{<@}3x_C0mT7Ɛ1:+N$Yvdo^S.GVLUɈݖd!sXV%pa:P8PAg&hD\dWCgTV~ H0 F| }aX8;LyySqGy.?{jWSIps&0b[_nӺ;ce+փ}-+@zD( | $]nPC"xxE C v9#9$T:ng%?`l6ҁN|45bR%* 4\<2 lhֳ&R$uY$w1ƅɣ *D=}P^cH81)K#KWS*HVCu^Yˢ X'cjE05؊VeO['~xK0&#y,OY2Gg/EpJ)҃&hFAs{xaTgPiɌ[0 \'a)*Ǹ~I[* XT(552WXP( w pc h(ywoj-`A԰Srb[h[GEDmܠ Q%:f*$K@[D;h0C|zU5bj;Xp{V ˼xyK=IF3jT9=yν@"]e]e+{amFFwޡkDD`x,7?o˷w"(}V  WBrΨhxqI5H u[[Lʦ3( -ba ZT G-"㶝nM2T0{(L,R߯h e8Ob6A\f[\4,FL^%C->|\hKjRke ,sHH#l"M>k4EגGWWEAKs|3M-_$הpu\a] Ϧ q{zF.qeڎa bEQz;90XZ@M-T܆nNv 2}fA:~nb i?j$D3M Ak`JCW}Ӱ7QRzK^t4='+@{;Rx[C=ZG7mzpzʅߠіL@KTo-cCߢ)` 4նC 77z kïi4 w!DeJ" !t쀽ʡ*KթKӥ}+l?|x'q,!k^8.c%z{ÿӟȯ}(@UgUY 83a]VcԣHk;T.yQT3,]5 I}6h1° ˷A-TRd~VڝZ|vѽ埍P TzI B0Z7x9D$v{Z;'ԝ?O qx=;d|(ŗjJ,_tXY7xQ"Ȓ$߲ j [1D&7]}a.Sg' "fƕdCFiDVU; nPe'5 dԵRARWE4=Y;f]]83`D_Ӹ7Woz̫2s C6ӥ1m=T.o`MXQnمPkf ar'@n0W_GL nOY4=5 zzZ@{_+B c/ G>rd|ɱx퐺/YKD,kN(%H Ioԑ)ì DgW/,UڬcL 98Șk:[,HLOľR4uH3PLw)f<;y*$e-qD9Q;=\&[oT?Bu&*# xԌvz*xS#<,]*Eq 4:s/Ws".!Z^u^vTi9(bΗM1s~^PN(w8A]./"|x#?׿sǡˠ2Nz&r3=ԛB1*I>kqY;?hh9~z/3h016bLwEwHm0ˣzT8Gd?!3j3ͱF|i_ajDB47xN' !&DMZ![Fgŝlt,oxr"+4(=Ph}Gn}F+",[ZQukk%O$jF|Kz;%_KJ^ C&~}yw\M}=H[:o`E,ӳ _2#&₳=b9(nt( Gk@0$ߡ0)gAWG8.h6vhȄ JI8+ S 9rq_ *l@AuQUTHx~cBl*Yę{z4ddx=ഋemXIF|pLiFы.X n`_@l_5^adW o!y$0~{jA IJ9.79d 6~MRML5HޞlNEjBb|=I5,.%ww/U}1;n?1K~)_1x4gj IDAT&Gyr8Ùԧ2֪)u$Mqޝu_Ǝچ#k ɗ//(*n:@N RB M*HgP(Dk=$E̮$R@2G_Nү\8tٳ N[q?[oTe,Go2cp)mӚ\rh{.k7ܗ+Elɏ~x\9rW֌#{E2 ۯLPZS [+!L7&ȇiD$iBZ=2҆`H"UA(SE" Tg6GST@aQr k  3JYk=< +/]Bx|TؕEPn)fCyU \6AH !Wkwb'R'!QSEG|Y|,h|h)E5GFwyic4tu hUӞ ?O=,rL`hKjy{ q0;rRZ`@4=;a/CUp1 3SYBP%[jVrI)Vo#C}9@zMjMqطL?Z-6hDw U3)בE JjzQBҡ$? ?uEОdlbA{aU&aQ$d-eCv!]([*^QF{U$.Druom-(<ɔ&{?lolxYn8@&&HL]A7;}MX·@zG1ʑ4Lel!DrueS4D&R5C]nmQм)xםvXyA~F:Iy.eJ <"5N;_k$_H(a P/0* ,v#+eahn^egbxeTR{HSjh;$%u5z-KSHM Ums|떑#rie*~{ b7 Z/9 .@YC|=hѮP"8n $((-er@]܅ LǡzonӇ?_?w`ZP mW GݕA@tǂJS0&)%ǎ9VXzp9`Q jFKSD1@` @F$$j;b]w(N3wkkw-) &y79ltR*#Bp6iU),J)6UXrX˥vZ߅.ՔҠF0NTqb%U%)HreFɦ6U#(&zNj6-K6׽?hgr5:,;\f87Dy6VY3[#2F^~QÊr,w!ʐy*Q+=dcd44vW"QTOOFJ ./5Um|Yl WYJ|Cx0tܞT9>څN~=I?3r_UQb0⭩829(t1aWBY<ߞ?<r~^/;$pIWU6BԸ?ٜ:3KursnU6q7HyIҒХerۚWIQ2 ;Z2߶,*IܕiB\u2ތnA<:VJ&o1@,_F2ȇfӰ>gdށC(ɝ13l{JP +G- ;u"c85V`wK*fsЛه@FG_KgPMfyrBfOw|o ܎JOEY}$j2fzI|߼9'|^ [Co=QtQjձj Gtzo]*4x6!n=ŴLO_nsPeA.{N(|QmcFBeiS` ='`uJjp5A3@Uϵp5J=XQ)Nr*+΃\E5$%kˡ1$x%!zeJhvZgxDD\_xy97YKf~(1͠2a_gT|SR2^}i ]k 3GYRHkg20Ƨn!.r ZФ]ƽ%FUP6f{A`kN5&Pt`Be hӳII(mB/Ty xi)_Aus 1j,CMyG@j+.N!hF+w]G*n:@빢-cG6Xz't@EDԡdU EEY-w2fcm1g-;A5ʴT.%T*a-r- 鐤-0)N{&6qT`4G彌[JCj#K,o'SqSyj"RlXv$;}#a'qɳd)}OC 5#c`yCh7Ͳrso4OZw 5x:u`Pe㕪^iœڕ7aNkpNB9vڕ)wz΂ 甌T<(Oe4hkZZy,]mr)] ~xe[53:0GY8@Yp ~G թ~`JEX)]9rƽȽNT jC2:~S$r3^Bת|=2sY)[%b'tL, W(C P,WЎwqO:89Oœ!Z4Kl|>ÓϧHwCn)Om8yF XI.oRWwmSL/!*u8vf(,&׌L} BO?Wp}z:VĐ`wa_Y-e'`S}"&vKBĦRUz!PVo.]ZS,Skn $X$E\2SObXC~=9d`;NlM\zQض+3%d1_ʣ3_A=$l 2U\0Je@vp(DwK8 tKKR{4+ZYMV(g<#AG*]Nۡ{bQҸ7%⳱@=#X*[QىZ@ʾ˱yqeAvT]9R s;?a)P .y$VRÝI 8-N] pbCFd`x'^C3s"R"EqeD3Tq>͆jo2/6(8bȊhqfS|&i.X(3K?/>] 1S.ۺ)rYd޷y$mf]➊2aB_\1DFOL8z*7qQ 0eT]4m PPLT'h;b/eMqNjiKfCt:x0XCYj\kZR5d[Ac Aﮑע,chZyQ)uF8L1m&" ~xR_x~Cޛgʓe<2+BDJ j?|x///yxe ˏ J@ Xɳ*9ai;{![PcҥX 1QC\(Tf ,+ UlwK--r[лwHEi5k %ԭuwc!*Cv##r9)m|F&C1{6q@4}i<2(SkH~dR'T/{mu!0[3*pmܽTzwC|0a̘/9~y}<(̂e!P %#I }޷AZHHaQ_ B!lYe iyUb8b2v2N$,+khӠۅM 5V.6'NȾÐ,A_/ YM>oߓ~HCxFN8[l{yϗ9B_Em/Q\𢅪7r+vLs7}Jzxv‘nj]Taf!L8kV4m yƻwSTćcf:OǏ8|yy9ϗ㸩z*vҬvH&'vq(Z3QU!XHU((]'/ F}p\'"ha9L7gx ^W3*9Q:H,:9ifޖBy^8DdΠX Vl OZ8]uGQJ"FiHw>6^FbQfzrܙ3vHbD Nnw +,|0;UC1O j`' =MXT94s#ltےWSIa{\>=6<,NsYYhTSЩ#񬫐XLLjb XiF_5]!wvٰx%J;eͬ5N{pwDݓp6] DuJCI9t+`— TTmZǡuiǮLz",? U/"8<}zSL 9y<wޙyU 1-jy~yPEDȵ ˲w$`!mL`5QLNk&#=s9EʞnI6#u2#"T12]̷1"vgF[33LL;Dm:qEdΝ6xm"#m7{;WmzW,oqICGn7c>+_*`s0sX8SĴjI[]xRd }Iw}0&ʗ}F«P _'eĿ<6x@3ƻTmS|mL_,RŒLv :ML(SkqŮKjzHvrFF$ieد3`S8d<ܤxruaX#pIDATHMl %R bd3dBv O#XUKZC!K;gdԀrᒜU$F*,0/Da0G8ZmtMugԉ6wdnzc cQ 5U˅ם [y̎ urJg 3+4ZPϸS4UOKDm8]"zu_v_tq{zpNB-Z!р Tv7>8P5<# Xd`E5 2-hD7cjX:q~]bto3vLѤ*^#eЫ[Y8'8|T؛5x/pAY/Z[ILyKæB=]é&]x'N2{nu2Fx|W{zC)E Fml[xX*+X3߲a,˔G|NO{waSbQ;/]b:TE}?R0wbL Y$:/՝f13TaOCmmdȮ7uNZ]cfQE PX:]jSL?g#BîI(^=y#d?T9+x?HvIyhX'`=b#颪\PUY/!+>0@r+!DBࢼ*t)Kr̽r 7ץo+_.~ yj4˿9?}TDR/`Ш#~ `>j`: *$ХD+cDM%V %mDQ8ν:!WN$}KP2)t9O \.HERK"Z^v$\]v  Zܠ}x|}g.=ԞJui?ސ20>^[ Al)pVƨ*2._KT| ޘ+.EQ)4(y,]D9'Qj! DVq[')QN(qy"/U7r8]b$CqaZ]ɴahDP+}DD=o)Ji|lWVbUjpYp7ihxKO+! w4"a}-v;R{n2f2 s%/jd+F\ɭ%t'5Cp:D1sf|"e \jS?| m}n3xxCisiNwJc"&:@J 5mo~G"/`X IENDB`nvidia-settings/src/image_data/rj45_unused.png0000664000175000017500000000032612236467170021562 0ustar albertoalbertoPNG  IHDRaڟ`bKGDdddO pHYs  tIME&$ KcIDATxc433k`&fff , >uT1c!,a! b]@b:dIr"]?@jmYHkQ0]uQم&IENDB`nvidia-settings/src/image_data/xvideo_pixdata.h0000664000175000017500000015772412236467170022105 0ustar albertoalberto/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static guint8 xvideo_pixdata_pixel_data[] = { 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xf3,0xff,0xff,0xff,0x00, 0x98,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x02, 0x82,0x00,0x00,0x00,0x03,0x84,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0x00,0x03, 0x82,0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x01,0x93,0x00,0x00,0x00,0x00, 0x83,0xff,0xff,0xff,0x00,0x95,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x08,0x82,0x00,0x00,0x00,0x09,0x82, 0x00,0x00,0x00,0x0a,0x82,0x00,0x00,0x00,0x09,0x07,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x91,0x00,0x00,0x00,0x00,0x8d,0x3d, 0x3a,0x3e,0x00,0x08,0x3d,0x38,0x3f,0x00,0x3e,0x40,0x38,0x00,0x4c,0x54,0x3f, 0x00,0x56,0x5b,0x58,0x00,0x64,0x63,0x64,0x00,0x65,0x6e,0x65,0x00,0x4b,0x4c, 0x4b,0x00,0x37,0x36,0x37,0x00,0x82,0x00,0x00,0x00,0x01,0x1e,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x10,0x10,0x10,0x08,0x53,0x52, 0x53,0x1d,0x58,0x58,0x58,0x40,0x66,0x64,0x66,0x64,0x6d,0x6a,0x6c,0x7a,0x74, 0x74,0x73,0x88,0x72,0x71,0x71,0x89,0x66,0x66,0x66,0x84,0x52,0x53,0x52,0x73, 0x41,0x40,0x40,0x57,0x2e,0x2e,0x2e,0x31,0x17,0x18,0x17,0x17,0x00,0x00,0x00, 0x0d,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0xe1, 0xe1,0xf7,0x00,0xac,0xaf,0xaa,0x00,0xa3,0xa8,0xa5,0x00,0xa6,0xad,0xaa,0x00, 0x9d,0xa4,0xa1,0x00,0x75,0x7a,0x78,0x00,0x53,0x57,0x55,0x00,0x88,0x00,0x00, 0x00,0x00,0x87,0x3d,0x3a,0x3e,0x00,0x87,0x21,0x1f,0x21,0x00,0x05,0x31,0x32, 0x2f,0x00,0x3f,0x47,0x33,0x00,0x4e,0x52,0x4f,0x00,0x5c,0x5b,0x5c,0x00,0x75, 0x7a,0x74,0x00,0x82,0x00,0x00,0x00,0x01,0x1d,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x06,0x4f,0x54,0x4f,0x1b,0x7f,0x7f,0x7d,0x59,0x9a, 0x99,0x99,0x99,0xba,0xb8,0xbb,0xcc,0xe3,0xe6,0xe7,0xed,0xf3,0xf6,0xf9,0xfb, 0xf8,0xfb,0xfe,0xfe,0xfa,0xfc,0xff,0xff,0xfa,0xfb,0xff,0xff,0xf6,0xf8,0xfb, 0xfe,0xed,0xed,0xf0,0xfb,0xc5,0xc5,0xc9,0xf1,0x88,0x88,0x8c,0xcf,0x5c,0x5c, 0x5d,0xa3,0x3c,0x3d,0x3d,0x60,0x2c,0x2c,0x2f,0x27,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x9c,0xa3,0x9d, 0x00,0xea,0xe5,0xe7,0x00,0x82,0xdc,0xd8,0xd8,0x00,0x01,0x9d,0xa4,0xa1,0x00, 0x88,0x00,0x00,0x00,0x00,0x87,0x3d,0x3a,0x3e,0x00,0x87,0x21,0x1f,0x21,0x00, 0x0c,0x31,0x32,0x2f,0x00,0x3f,0x47,0x33,0x00,0x4e,0x52,0x4f,0x00,0x5c,0x5b, 0x5c,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x06,0x32,0x33,0x32,0x24,0x6d,0x6d,0x6c,0x79,0xc0,0xc1,0xc0,0xcc, 0xf7,0xfa,0xfb,0xf9,0x83,0xff,0xff,0xff,0xff,0x03,0xf8,0xff,0xff,0xff,0xf6, 0xff,0xff,0xff,0xf8,0xff,0xff,0xff,0x85,0xff,0xff,0xff,0xff,0x0d,0xf7,0xf7, 0xf9,0xff,0xad,0xad,0xb3,0xef,0x5f,0x60,0x61,0xaf,0x40,0x40,0x40,0x5c,0x29, 0x27,0x28,0x1c,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x09, 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x01,0xea,0xe5,0xe7,0x00,0x82,0xdc,0xd8,0xd8,0x00,0x01,0xa6,0xad,0xaa,0x00, 0x88,0x00,0x00,0x00,0x00,0x87,0x3d,0x3a,0x3e,0x00,0x87,0x21,0x1f,0x21,0x00, 0x02,0x31,0x32,0x2f,0x00,0x3f,0x47,0x33,0x00,0x82,0x00,0x00,0x00,0x01,0x06, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x1a,0x1a,0x1a,0x13,0x57,0x58,0x56, 0x6e,0xba,0xbb,0xbb,0xd6,0xfe,0xff,0xff,0xff,0x82,0xff,0xff,0xff,0xff,0x05, 0xea,0xfe,0xff,0xff,0xe9,0xfc,0xff,0xff,0xee,0xfe,0xff,0xff,0xf2,0xff,0xff, 0xff,0xf7,0xff,0xff,0xff,0x88,0xff,0xff,0xff,0xff,0x0b,0xf4,0xf4,0xf6,0xfe, 0x82,0x82,0x85,0xd8,0x4f,0x4d,0x52,0x80,0x6d,0x6d,0x6d,0x2b,0x00,0x00,0x00, 0x15,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x82,0xdc,0xd8,0xd8,0x00, 0x01,0xa6,0xad,0xaa,0x00,0x88,0x00,0x00,0x00,0x00,0x87,0x3d,0x3a,0x3e,0x00, 0x87,0x21,0x1f,0x21,0x00,0x0d,0x31,0x32,0x2f,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x41,0x41,0x40,0x36, 0x91,0x91,0x91,0xb3,0xf4,0xf7,0xf8,0xfd,0xfe,0xff,0xff,0xff,0xf6,0xff,0xff, 0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf9,0xff,0xff,0xff,0x82,0xf4, 0xff,0xff,0xff,0x02,0xf6,0xff,0xff,0xff,0xf8,0xff,0xff,0xff,0x89,0xff,0xff, 0xff,0xff,0x0d,0xfd,0xfd,0xfe,0xff,0x9b,0x9a,0x9f,0xee,0x5e,0x5c,0x5c,0x94, 0x65,0x65,0x65,0x30,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x11,0x00,0x00,0x00, 0x0c,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x01,0xdc,0xd8,0xd8,0x00,0xa6,0xad,0xaa,0x00,0x88,0x00,0x00,0x00,0x00, 0x87,0x3d,0x3a,0x3e,0x00,0x87,0x21,0x1f,0x21,0x00,0x09,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x15,0x14,0x15,0x09,0x6d,0x71,0x6c, 0x62,0xd1,0xd2,0xd2,0xe7,0xf9,0xfc,0xfe,0xff,0xd5,0xe7,0xf1,0xff,0xe8,0xfa, 0xff,0xff,0x82,0xff,0xff,0xff,0xff,0x07,0xf7,0xff,0xff,0xff,0xe9,0xf8,0xff, 0xff,0xe8,0xf4,0xfd,0xff,0xe5,0xf4,0xfe,0xff,0xe8,0xf5,0xff,0xff,0xf0,0xff, 0xff,0xff,0xf7,0xff,0xff,0xff,0x89,0xff,0xff,0xff,0xff,0x0c,0xfe,0xff,0xff, 0xff,0x90,0x8e,0x94,0xf2,0x86,0x86,0x86,0x92,0x4a,0x4a,0x4a,0x2d,0x00,0x00, 0x00,0x1a,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0xa6,0xad,0xaa,0x00, 0x88,0x00,0x00,0x00,0x00,0x87,0x3d,0x3a,0x3e,0x00,0x86,0x21,0x1f,0x21,0x00, 0x13,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x21,0x23, 0x22,0x0e,0x81,0x7f,0x80,0x80,0xec,0xee,0xf1,0xf9,0xe0,0xee,0xf9,0xff,0xc1, 0xd3,0xda,0xff,0xe3,0xef,0xf8,0xff,0xec,0xf8,0xff,0xff,0xf7,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xec,0xfe,0xff,0xff,0xe4,0xef,0xfb,0xff,0xde,0xee,0xf5, 0xff,0xe1,0xef,0xfb,0xff,0xe8,0xf4,0xfe,0xff,0xea,0xfd,0xff,0xff,0xf9,0xff, 0xff,0xff,0x8a,0xff,0xff,0xff,0xff,0x0b,0xfc,0xfc,0xfd,0xff,0x77,0x72,0x78, 0xf6,0x94,0x9b,0x94,0x94,0x10,0x10,0x11,0x27,0x00,0x00,0x00,0x1b,0x00,0x00, 0x00,0x14,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x88,0x00,0x00,0x00,0x00,0x87,0x3d,0x3a, 0x3e,0x00,0x85,0x21,0x1f,0x21,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x05,0x21,0x26,0x1b,0x11,0x84,0x86,0x84,0x97,0xf0,0xf3, 0xf5,0xff,0xb7,0xc7,0xd3,0xff,0xbb,0xcc,0xd4,0xff,0xd5,0xe3,0xe9,0xff,0xd4, 0xe1,0xe9,0xff,0xdb,0xe9,0xf1,0xff,0xf2,0xff,0xff,0xff,0xf9,0xff,0xff,0xff, 0xf1,0xff,0xff,0xff,0xeb,0xfc,0xff,0xff,0xf1,0xff,0xff,0xff,0xf2,0xff,0xff, 0xff,0xf7,0xff,0xff,0xff,0x8a,0xff,0xff,0xff,0xff,0x0e,0xf9,0xff,0xff,0xff, 0xe8,0xf8,0xff,0xff,0xec,0xfb,0xfe,0xff,0xe5,0xe9,0xee,0xff,0x73,0x6f,0x74, 0xfb,0x94,0x90,0x94,0xa4,0x5e,0x5e,0x65,0x3f,0x00,0x00,0x00,0x1d,0x00,0x00, 0x00,0x15,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x87,0x00,0x00,0x00,0x00,0x87,0x3d,0x3a, 0x3e,0x00,0x84,0x21,0x1f,0x21,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x05,0x17,0x17,0x16,0x0f,0x7a,0x7d,0x76,0x97,0xf1,0xf3, 0xf6,0xff,0xa2,0xb7,0xc1,0xff,0xb4,0xc3,0xcc,0xff,0xc6,0xd2,0xda,0xff,0xc3, 0xd2,0xd8,0xff,0xc8,0xd2,0xdb,0xff,0xd6,0xe4,0xea,0xff,0xf8,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xee,0xfe,0xff,0xff,0xe7,0xf3,0xfb, 0xff,0xe3,0xf2,0xfb,0xff,0xe6,0xf1,0xfd,0xff,0xf1,0xff,0xff,0xff,0x88,0xff, 0xff,0xff,0xff,0x10,0xf6,0xff,0xff,0xff,0xdc,0xe7,0xf0,0xff,0xe2,0xec,0xf2, 0xff,0xd7,0xe8,0xec,0xff,0xe8,0xf3,0xfb,0xff,0x9e,0x9c,0xa3,0xff,0x84,0x85, 0x86,0xfa,0xb4,0xaf,0xb5,0xb2,0x69,0x6b,0x69,0x56,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x15,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x86,0x00,0x00,0x00,0x00,0x87,0x44, 0x48,0x3f,0x00,0x83,0x21,0x1f,0x21,0x00,0x15,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x04,0x04,0x03,0x04,0x09,0x64,0x63,0x64,0x86,0xed, 0xf0,0xf4,0xff,0x9b,0xaf,0xbb,0xff,0xab,0xb9,0xc2,0xff,0xb5,0xc4,0xcd,0xff, 0xb7,0xc3,0xcd,0xff,0xb9,0xc6,0xcd,0xff,0xcc,0xd9,0xe1,0xff,0xe3,0xf3,0xfb, 0xff,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xde,0xec, 0xf6,0xff,0xd9,0xe6,0xef,0xff,0xdd,0xe9,0xf1,0xff,0xe4,0xf2,0xfc,0xff,0xf0, 0xff,0xff,0xff,0x87,0xff,0xff,0xff,0xff,0x12,0xec,0xff,0xff,0xff,0xdf,0xe9, 0xf1,0xff,0xd8,0xe3,0xea,0xff,0xd0,0xda,0xe0,0xff,0xd1,0xdb,0xe3,0xff,0xc8, 0xd9,0xe0,0xff,0xdf,0xe1,0xea,0xff,0x7b,0x78,0x78,0xff,0xaf,0xb0,0xb2,0xfd, 0xbf,0xbe,0xc2,0xc1,0x66,0x6b,0x67,0x57,0x00,0x00,0x00,0x1e,0x00,0x00,0x00, 0x16,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x01,0x85,0x00,0x00,0x00,0x00,0x87,0x46,0x4b,0x3f, 0x00,0x83,0x31,0x31,0x32,0x00,0x14,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x07,0x4b,0x47,0x4a,0x6a,0xe4,0xe6,0xea,0xfb,0x9e,0xb1,0xbc, 0xff,0xa2,0xb0,0xba,0xff,0xab,0xb9,0xc2,0xff,0xac,0xb8,0xc1,0xff,0xaa,0xbb, 0xc2,0xff,0xc7,0xd4,0xde,0xff,0xd0,0xdd,0xe5,0xff,0xd6,0xe1,0xea,0xff,0xee, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf3,0xff,0xff,0xff,0xe2,0xf2,0xf9,0xff, 0xe0,0xec,0xf5,0xff,0xe2,0xf1,0xf8,0xff,0xea,0xf9,0xff,0xff,0x87,0xff,0xff, 0xff,0xff,0x14,0xfb,0xff,0xff,0xff,0xe2,0xed,0xf5,0xff,0xd1,0xdc,0xe1,0xff, 0xcb,0xd7,0xdf,0xff,0xc9,0xd7,0xdb,0xff,0xc6,0xd3,0xd9,0xff,0xbe,0xce,0xd3, 0xff,0xd1,0xdd,0xe5,0xff,0x9f,0x9c,0xa2,0xff,0x2c,0x2c,0x22,0xff,0xc7,0xcb, 0xbe,0xfd,0xae,0xaf,0xb1,0xbf,0x88,0x85,0x86,0x4f,0x00,0x00,0x00,0x1e,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x84,0x00,0x00,0x00,0x00,0x87,0x40, 0x46,0x3d,0x00,0x82,0x31,0x31,0x32,0x00,0x15,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x06,0x38,0x38,0x36,0x3d,0xc4,0xc4,0xcb,0xeb,0xb8, 0xc9,0xd2,0xff,0x90,0xa0,0xab,0xff,0xa2,0xb1,0xb9,0xff,0xa4,0xb1,0xb9,0xff, 0xa6,0xb3,0xbc,0xff,0xc0,0xca,0xd5,0xff,0xc0,0xcd,0xd4,0xff,0xc4,0xd3,0xd9, 0xff,0xd2,0xdf,0xe6,0xff,0xf1,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xec,0xff, 0xff,0xff,0xdb,0xec,0xf5,0xff,0xdd,0xef,0xf5,0xff,0xe8,0xf7,0xff,0xff,0xfb, 0xff,0xff,0xff,0x86,0xff,0xff,0xff,0xff,0x15,0xf6,0xff,0xff,0xff,0xe4,0xf3, 0xf8,0xff,0xdc,0xe6,0xec,0xff,0xcb,0xd7,0xdd,0xff,0xbc,0xc8,0xd1,0xff,0xc1, 0xcd,0xd4,0xff,0xc0,0xcb,0xd4,0xff,0xbb,0xc9,0xcf,0xff,0xb6,0xc4,0xce,0xff, 0xcb,0xc9,0xce,0xff,0x6b,0x6b,0x6f,0xff,0x37,0x37,0x31,0xff,0xe4,0xe4,0xe8, 0xfa,0x9c,0x9b,0x9e,0xa7,0x4b,0x4a,0x4a,0x38,0x00,0x00,0x00,0x1e,0x00,0x00, 0x00,0x15,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x02,0x84,0x00,0x00,0x00,0x00,0x87,0x38,0x3d,0x3a,0x00,0x16,0x31, 0x31,0x32,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05, 0x1f,0x1f,0x20,0x19,0x92,0x90,0x95,0xc2,0xd0,0xe1,0xe9,0xff,0x85,0x94,0x9f, 0xff,0x9f,0xad,0xb7,0xff,0xa1,0xad,0xb7,0xff,0x9e,0xab,0xb5,0xff,0xb3,0xc2, 0xca,0xff,0xae,0xbd,0xc8,0xff,0xb6,0xc3,0xca,0xff,0xc1,0xce,0xd6,0xff,0xcc, 0xd9,0xe2,0xff,0xe1,0xf5,0xfc,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff, 0xeb,0xf5,0xff,0xff,0xf2,0xf6,0xff,0xff,0xf0,0xfb,0xff,0xff,0x86,0xff,0xff, 0xff,0xff,0x17,0xe3,0xf5,0xfa,0xff,0xd0,0xda,0xe2,0xff,0xd6,0xe4,0xea,0xff, 0xce,0xd9,0xe1,0xff,0xc8,0xd6,0xdb,0xff,0xb5,0xc1,0xca,0xff,0xb1,0xbb,0xc2, 0xff,0xba,0xc7,0xcf,0xff,0xb4,0xbf,0xc8,0xff,0xa7,0xb8,0xbf,0xff,0xcc,0xd3, 0xd7,0xff,0x8c,0x87,0x8b,0xff,0x3d,0x3d,0x44,0xff,0x66,0x66,0x70,0xff,0xdc, 0xdc,0xde,0xf2,0x80,0x7b,0x80,0x7e,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x1c, 0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x01,0x83,0x00,0x00,0x00,0x00,0x87,0x58,0x4c,0x59,0x00, 0x11,0x62,0x5b,0x63,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x08,0x68,0x66,0x68,0x7e,0xce,0xd8,0xe0,0xff,0x85,0x98,0xa3,0xff,0x9a, 0xa4,0xaf,0xff,0x9b,0xa8,0xb0,0xff,0x98,0xa9,0xb2,0xff,0xa8,0xb4,0xbf,0xff, 0xa6,0xb7,0xc2,0xff,0xaa,0xb6,0xbf,0xff,0xae,0xbb,0xc4,0xff,0xb8,0xc5,0xcf, 0xff,0xb5,0xc7,0xcd,0xff,0xea,0xf3,0xfe,0xff,0x86,0xff,0xff,0xff,0xff,0x01, 0xed,0xed,0xf4,0xff,0x83,0xff,0xff,0xff,0xff,0x19,0xec,0xfe,0xff,0xff,0xd8, 0xe4,0xeb,0xff,0xc5,0xd1,0xd4,0xff,0xc4,0xd1,0xd7,0xff,0xc7,0xd5,0xdc,0xff, 0xc1,0xcc,0xd5,0xff,0xb0,0xbe,0xc4,0xff,0xa8,0xb4,0xbc,0xff,0xb2,0xbe,0xc6, 0xff,0xb1,0xbe,0xc6,0xff,0xa1,0xb3,0xbb,0xff,0xc3,0xc9,0xd3,0xff,0x8d,0x88, 0x8d,0xff,0x7a,0x7e,0x84,0xff,0x4f,0x51,0x43,0xff,0xac,0xab,0xb5,0xff,0xac, 0xad,0xae,0xc6,0x32,0x30,0x32,0x4a,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1a, 0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x87,0x6f,0x67,0x73,0x00, 0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x50,0x4a, 0x51,0x36,0xa7,0xa9,0xaf,0xe9,0xa0,0xb3,0xbc,0xff,0x91,0x9d,0xa8,0xff,0x98, 0xa5,0xae,0xff,0x99,0xa6,0xaf,0xff,0xa1,0xad,0xb6,0xff,0xa3,0xb2,0xbb,0xff, 0xa3,0xaf,0xb8,0xff,0x9f,0xad,0xb3,0xff,0xa2,0xb2,0xbe,0xff,0x9f,0xb0,0xb7, 0xff,0xed,0xf0,0xfb,0xff,0x82,0xff,0xff,0xff,0xff,0x22,0xd0,0xd0,0xd4,0xff, 0x81,0x81,0x83,0xff,0x68,0x68,0x6b,0xff,0x80,0x80,0x84,0xff,0xee,0xee,0xf3, 0xff,0xff,0xff,0xff,0xff,0xd6,0xd5,0xdd,0xff,0xff,0xff,0xff,0xff,0xf5,0xff, 0xff,0xff,0xd9,0xe5,0xeb,0xff,0xcc,0xd8,0xdf,0xff,0xc0,0xca,0xd5,0xff,0xb3, 0xbf,0xc7,0xff,0xb9,0xc7,0xcf,0xff,0xb9,0xc4,0xce,0xff,0xb0,0xbc,0xc4,0xff, 0x9e,0xac,0xb4,0xff,0xa3,0xb0,0xba,0xff,0xaf,0xba,0xc3,0xff,0x9e,0xad,0xb5, 0xff,0xb8,0xc4,0xce,0xff,0x98,0x93,0x91,0xff,0x4d,0x4e,0x61,0xff,0x96,0x9e, 0x67,0xff,0x80,0x84,0x73,0xff,0xe4,0xe4,0xe7,0xf6,0x5b,0x57,0x59,0x84,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0e, 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x82,0x00,0x00, 0x00,0x00,0x87,0x71,0x6d,0x73,0x00,0x15,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x0a,0x7b,0x79,0x7d,0x9c,0xb2,0xbc,0xc5,0xff,0x8d,0x9b, 0xa4,0xff,0x96,0xa3,0xac,0xff,0x98,0xa5,0xae,0xff,0x9a,0xa7,0xb0,0xff,0x9e, 0xad,0xb7,0xff,0x9f,0xad,0xb5,0xff,0x96,0xa2,0xad,0xff,0x9a,0xaa,0xb3,0xff, 0x8e,0xa2,0xa9,0xff,0xf5,0xf5,0xfe,0xff,0xff,0xff,0xff,0xff,0x95,0x96,0x9a, 0xff,0x24,0x24,0x24,0xff,0x18,0x18,0x15,0xff,0x08,0x08,0x08,0xff,0x08,0x08, 0x06,0xff,0x82,0x00,0x00,0x00,0xff,0x1d,0x96,0x94,0x99,0xff,0xff,0xff,0xff, 0xff,0xcd,0xcb,0xd6,0xff,0xd2,0xde,0xe4,0xff,0xcf,0xdb,0xe2,0xff,0xbc,0xc8, 0xcc,0xff,0xb6,0xc3,0xc8,0xff,0xaa,0xb5,0xbf,0xff,0xb1,0xc0,0xc6,0xff,0xb0, 0xbb,0xc4,0xff,0xad,0xb9,0xc2,0xff,0x9e,0xa9,0xb3,0xff,0x9f,0xaa,0xb3,0xff, 0xa6,0xb4,0xbd,0xff,0xa1,0xac,0xb6,0xff,0xad,0xb9,0xc2,0xff,0x9c,0x9a,0x9d, 0xff,0x46,0x45,0x49,0xff,0x54,0x56,0x5e,0xff,0xa7,0xab,0x9e,0xff,0xe4,0xe3, 0xe9,0xff,0x92,0x92,0x92,0xb7,0x0f,0x11,0x0f,0x41,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x02,0x82,0x00,0x00,0x00,0x00,0x86,0x64,0x65,0x64,0x00,0x20, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x53,0x52,0x51, 0x3b,0x97,0x98,0x9e,0xef,0x9a,0xab,0xb7,0xff,0x95,0xa1,0xac,0xff,0x93,0xa0, 0xab,0xff,0x9b,0xa8,0xb1,0xff,0x97,0xa4,0xae,0xff,0x9c,0xab,0xb5,0xff,0x94, 0xa0,0xab,0xff,0x97,0xa4,0xac,0xff,0x85,0x96,0xa0,0xff,0xe3,0xe1,0xec,0xff, 0xff,0xff,0xff,0xff,0x6b,0x6c,0x6c,0xff,0x00,0x00,0x00,0xff,0x1a,0x1a,0x19, 0xff,0x32,0x31,0x32,0xff,0x2d,0x2f,0x2d,0xff,0x2d,0x2d,0x2d,0xff,0x2c,0x2c, 0x2a,0xff,0x16,0x16,0x17,0xff,0x00,0x00,0x00,0xff,0xbf,0xbf,0xc6,0xff,0xf7, 0xf4,0xf9,0xff,0xc1,0xc6,0xce,0xff,0xb6,0xc5,0xcd,0xff,0xb1,0xbf,0xc8,0xff, 0xac,0xb7,0xc3,0xff,0xa2,0xaf,0xb6,0xff,0x82,0xa8,0xb7,0xbf,0xff,0x15,0xa8, 0xb3,0xbd,0xff,0x9a,0xa9,0xae,0xff,0x99,0xa6,0xb0,0xff,0xa5,0xb2,0xb9,0xff, 0x9a,0xaa,0xb3,0xff,0xa8,0xb3,0xbe,0xff,0x94,0x92,0x95,0xff,0x61,0x63,0x62, 0xff,0x18,0x17,0x25,0xff,0x6e,0x6e,0x74,0xff,0xb5,0xb5,0xbc,0xff,0xd0,0xd0, 0xd3,0xe3,0x23,0x27,0x24,0x62,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x86,0x7c,0x7b,0x7b,0x00,0x37,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0a,0x6f,0x6e,0x6f,0x92, 0x9f,0xa9,0xb3,0xff,0x96,0xa3,0xae,0xff,0x8f,0x9e,0xa5,0xff,0x99,0xa6,0xaf, 0xff,0x95,0xa2,0xad,0xff,0x99,0xa7,0xae,0xff,0x97,0xa4,0xaf,0xff,0x90,0x9e, 0xa4,0xff,0x88,0x9b,0xa6,0xff,0xb4,0xb9,0xc0,0xff,0xff,0xff,0xff,0xff,0x57, 0x5a,0x59,0xff,0x00,0x00,0x00,0xff,0x30,0x30,0x32,0xff,0x2b,0x2b,0x2b,0xff, 0x33,0x33,0x33,0xff,0x2e,0x2e,0x2e,0xff,0x25,0x25,0x25,0xff,0x26,0x26,0x26, 0xff,0x39,0x39,0x38,0xff,0x22,0x22,0x22,0xff,0x36,0x3b,0x3a,0xff,0xf3,0xf0, 0xf9,0xff,0xc6,0xc7,0xcd,0xff,0xa4,0xb4,0xbe,0xff,0xa8,0xb7,0xc0,0xff,0xa4, 0xb1,0xb8,0xff,0x9f,0xaa,0xb4,0xff,0xa2,0xaf,0xb8,0xff,0xa4,0xb1,0xba,0xff, 0xa3,0xb0,0xb9,0xff,0x97,0xa4,0xae,0xff,0x96,0xa1,0xaa,0xff,0xa4,0xb1,0xb8, 0xff,0x96,0xa6,0xb0,0xff,0xaa,0xb6,0xbc,0xff,0x78,0x75,0x7b,0xff,0x77,0x77, 0x7c,0xff,0x87,0x87,0x91,0xff,0x18,0x12,0x28,0xff,0x67,0x6b,0x72,0xff,0xe1, 0xe1,0xe4,0xf4,0x42,0x42,0x40,0x81,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x27, 0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0a,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x85,0x7e,0x7e,0x87,0x00,0x38, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x55,0x55,0x58, 0x29,0x7e,0x7f,0x83,0xdf,0x9f,0xae,0xba,0xff,0x96,0xa4,0xad,0xff,0x8e,0x9c, 0xa4,0xff,0x9b,0xa7,0xb0,0xff,0x90,0x9f,0xa9,0xff,0x9a,0xa5,0xb2,0xff,0x8e, 0x99,0xa1,0xff,0x90,0xa1,0xaa,0xff,0x8d,0x9a,0xa4,0xff,0xfd,0xf9,0xff,0xff, 0xa3,0xa6,0xa7,0xff,0x00,0x00,0x00,0xff,0x20,0x20,0x20,0xff,0x2e,0x2e,0x2e, 0xff,0x34,0x33,0x31,0xff,0x3a,0x3a,0x3e,0xff,0x20,0x20,0x1f,0xff,0x2c,0x2c, 0x2e,0xff,0x3c,0x3c,0x3c,0xff,0x3a,0x3a,0x3c,0xff,0x30,0x30,0x30,0xff,0x15, 0x14,0x13,0xfc,0xce,0xce,0xd3,0xff,0xce,0xcc,0xd3,0xff,0x9c,0xaa,0xb3,0xff, 0xa0,0xad,0xb6,0xff,0x9b,0xaa,0xb1,0xff,0x96,0xa3,0xac,0xff,0x9e,0xac,0xb5, 0xff,0x9d,0xac,0xb5,0xff,0x9a,0xa8,0xb3,0xff,0x98,0xa3,0xac,0xff,0x94,0xa1, 0xaa,0xff,0x9d,0xad,0xb4,0xff,0x99,0xa5,0xb0,0xff,0xab,0xb3,0xbe,0xff,0x70, 0x6f,0x6f,0xff,0x68,0x66,0x70,0xff,0x8b,0x8d,0x85,0xff,0x9a,0xa7,0x65,0xff, 0x2a,0x27,0x37,0xff,0xd6,0xd6,0xd9,0xfc,0x60,0x5f,0x5f,0x99,0x00,0x00,0x00, 0x3b,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x14,0x00,0x00, 0x00,0x0b,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x85, 0x7e,0x7a,0x83,0x00,0x38,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x0a,0x64,0x63,0x65,0x66,0x85,0x8c,0x90,0xff,0xa1,0xb6,0xbd,0xff,0x90, 0x9b,0xa5,0xff,0x91,0xa0,0xa7,0xff,0x92,0xa1,0xaa,0xff,0x96,0xa1,0xab,0xff, 0x92,0xa2,0xac,0xff,0x92,0x9e,0xa4,0xff,0x8c,0x9f,0xa8,0xff,0xb5,0xb7,0xbf, 0xff,0xdb,0xd8,0xe0,0xff,0x44,0x44,0x42,0xff,0x1b,0x1d,0x1d,0xff,0x22,0x24, 0x24,0xff,0x2c,0x2d,0x2d,0xff,0x19,0x1a,0x19,0xff,0x00,0x00,0x00,0xff,0x09, 0x09,0x0b,0xff,0x36,0x36,0x38,0xff,0x30,0x30,0x2f,0xff,0x30,0x2e,0x30,0xfb, 0x37,0x38,0x37,0xeb,0x2c,0x2c,0x2c,0xe5,0xb9,0xb8,0xbe,0xfe,0xc8,0xc6,0xcf, 0xff,0x94,0xa7,0xae,0xff,0x99,0xa6,0xaf,0xff,0x98,0xa3,0xae,0xff,0x96,0xa3, 0xac,0xff,0x9b,0xa8,0xb1,0xff,0x97,0xa4,0xad,0xff,0x9a,0xa5,0xae,0xff,0x96, 0xa1,0xab,0xff,0x93,0xa1,0xaa,0xff,0x9e,0xab,0xb4,0xff,0x97,0xa3,0xae,0xff, 0xa6,0xb1,0xbb,0xff,0x6d,0x69,0x6a,0xff,0x63,0x60,0x69,0xff,0x59,0x5f,0x67, 0xff,0xa2,0xb3,0x5f,0xff,0x9c,0x9d,0xa6,0xff,0xbc,0xbc,0xc3,0xff,0x76,0x76, 0x77,0xac,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x23,0x00, 0x00,0x00,0x17,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x00,0x85,0x83,0x7a,0x83,0x00,0x38,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x68,0x65,0x6a,0xa7,0x93,0x9f,0xaa,0xff, 0xa2,0xae,0xba,0xff,0x8d,0x9c,0xa1,0xff,0x97,0xa4,0xae,0xff,0x90,0x9d,0xa4, 0xff,0x98,0xa6,0xaf,0xff,0x91,0x9d,0xa6,0xff,0x92,0xa1,0xac,0xff,0x92,0xa1, 0xaa,0xff,0xc0,0xbd,0xc6,0xff,0xa6,0xa6,0xa9,0xff,0x29,0x29,0x26,0xff,0x2a, 0x2a,0x2a,0xff,0x43,0x43,0x43,0xff,0x28,0x29,0x29,0xff,0x00,0x00,0x00,0xff, 0x0b,0x0b,0x0e,0xff,0x32,0x32,0x33,0xff,0x24,0x24,0x26,0xff,0x3e,0x3e,0x3f, 0xf1,0x3c,0x3c,0x3d,0xe6,0x37,0x37,0x37,0xe6,0x46,0x46,0x45,0xe9,0xbe,0xbe, 0xc3,0xfe,0xb7,0xb7,0xbf,0xff,0x91,0xa0,0xa9,0xff,0x98,0xa5,0xae,0xff,0x91, 0xa0,0xa9,0xff,0x96,0xa3,0xac,0xff,0x98,0xa5,0xaf,0xff,0x94,0xa2,0xa9,0xff, 0x99,0xa6,0xaf,0xff,0x92,0x9f,0xa6,0xff,0x94,0x9f,0xa9,0xff,0x9b,0xa8,0xb1, 0xff,0x93,0xa3,0xac,0xff,0xa5,0xae,0xb7,0xff,0x63,0x61,0x61,0xff,0x49,0x49, 0x49,0xff,0x46,0x45,0x5c,0xff,0xa4,0xa1,0xaf,0xff,0x9c,0x9f,0x99,0xff,0xae, 0xae,0xb1,0xff,0x89,0x89,0x8b,0xb9,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x35, 0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x0f,0x00,0x00,0x00, 0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x84,0x7c,0x7c,0x7c,0x00,0x39, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x4d,0x4d,0x4d, 0x27,0x66,0x69,0x6d,0xdb,0xa0,0xb0,0xbb,0xff,0x99,0xa8,0xb1,0xff,0x8f,0x9e, 0xa5,0xff,0x98,0xa5,0xae,0xff,0x90,0x9f,0xa6,0xff,0x98,0xa5,0xae,0xff,0x8f, 0x9e,0xa3,0xff,0x96,0xa5,0xaf,0xff,0x97,0xa1,0xa9,0xff,0xba,0xb4,0xbc,0xff, 0x92,0x92,0x94,0xff,0x1f,0x1f,0x1f,0xff,0x32,0x31,0x31,0xff,0x50,0x52,0x51, 0xff,0x0c,0x0c,0x0d,0xff,0x00,0x00,0x00,0xff,0x2f,0x30,0x32,0xff,0x18,0x18, 0x19,0xff,0x3b,0x3b,0x3a,0xe9,0x62,0x62,0x62,0xe7,0x41,0x3f,0x41,0xea,0x30, 0x31,0x2f,0xe6,0x60,0x60,0x5e,0xec,0xc1,0xbf,0xc7,0xff,0xa5,0xa8,0xb0,0xff, 0x8e,0x9f,0xa8,0xff,0x93,0xa2,0xab,0xff,0x8f,0x9e,0xa5,0xff,0x99,0xa3,0xad, 0xff,0x93,0xa0,0xa7,0xff,0x8f,0x9a,0xa4,0xff,0x97,0xa5,0xae,0xff,0x8d,0x98, 0xa1,0xff,0x97,0xa5,0xae,0xff,0x99,0xa3,0xac,0xff,0x96,0xa4,0xae,0xff,0x9b, 0xa2,0xa7,0xff,0x60,0x5c,0x5e,0xff,0x78,0x78,0x7d,0xff,0x11,0x11,0x11,0xff, 0x62,0x62,0x78,0xff,0xa6,0xa6,0xa6,0xff,0x95,0x96,0x9a,0xff,0x87,0x87,0x87, 0xbc,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x28,0x00,0x00, 0x00,0x1b,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x00,0x84,0x7f,0x7e,0x7f,0x00,0x1f,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x0a,0x58,0x58,0x58,0x48,0x6a,0x6d,0x75,0xf5,0xae, 0xbd,0xc8,0xff,0x95,0xa2,0xab,0xff,0x95,0xa1,0xaa,0xff,0x97,0xa4,0xad,0xff, 0x91,0xa0,0xa9,0xff,0x97,0xa1,0xac,0xff,0x94,0xa0,0xa9,0xff,0x9c,0xac,0xb8, 0xff,0x96,0x9f,0xa3,0xff,0xaa,0xa7,0xae,0xff,0x64,0x65,0x64,0xff,0x19,0x19, 0x18,0xff,0x31,0x31,0x31,0xff,0x28,0x23,0x27,0xff,0x00,0x00,0x00,0xff,0x1a, 0x1a,0x1a,0xff,0x1f,0x1f,0x24,0xff,0x2c,0x2d,0x2d,0xef,0x35,0x34,0x34,0xdf, 0x3f,0x41,0x40,0xec,0x47,0x48,0x47,0xec,0x31,0x30,0x31,0xe7,0x8c,0x8d,0x92, 0xf4,0xbb,0xb7,0xbd,0xff,0x95,0x9e,0xa4,0xff,0x91,0xa1,0xa8,0xff,0x82,0x8f, 0x9c,0xa5,0xff,0x18,0x94,0xa3,0xae,0xff,0x8f,0x9c,0xa5,0xff,0x8f,0x9a,0xa3, 0xff,0x95,0xa2,0xad,0xff,0x8c,0x99,0xa2,0xff,0x9b,0xa6,0xb0,0xff,0x8f,0x9e, 0xa9,0xff,0x9b,0xaa,0xb4,0xff,0x88,0x87,0x8d,0xff,0x59,0x58,0x56,0xff,0xcf, 0xd4,0xe1,0xff,0x83,0x7d,0x98,0xff,0x12,0x12,0x1f,0xff,0x63,0x5d,0x68,0xff, 0x95,0x92,0x99,0xff,0x87,0x87,0x87,0xbc,0x00,0x00,0x00,0x4a,0x00,0x00,0x00, 0x3a,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x12,0x00,0x00, 0x00,0x0a,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x84,0x75,0x73,0x75,0x00, 0x39,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x58,0x54, 0x57,0x6b,0x78,0x81,0x88,0xff,0xac,0xbc,0xc7,0xff,0x94,0xa3,0xab,0xff,0x97, 0xa4,0xaf,0xff,0x95,0xa2,0xac,0xff,0x96,0xa2,0xad,0xff,0x97,0xa6,0xae,0xff, 0x97,0xa3,0xac,0xff,0xa1,0xb5,0xbc,0xff,0x8f,0x96,0x9d,0xff,0x9a,0x95,0x9c, 0xff,0x31,0x31,0x31,0xff,0x11,0x11,0x13,0xff,0x1b,0x1b,0x1b,0xff,0x1e,0x1e, 0x1e,0xff,0x17,0x17,0x17,0xff,0x15,0x17,0x17,0xff,0x31,0x31,0x32,0xfe,0x5a, 0x5a,0x5a,0xe2,0x28,0x28,0x29,0xec,0x2a,0x2a,0x28,0xea,0x34,0x34,0x34,0xea, 0x38,0x38,0x39,0xd4,0xa8,0xa7,0xae,0xfe,0xa7,0xa5,0xaa,0xff,0x8d,0x99,0xa4, 0xff,0x93,0xa1,0xaa,0xff,0x8e,0x9b,0xa4,0xff,0x8f,0x9c,0xa5,0xff,0x94,0xa2, 0xa9,0xff,0x8e,0x9b,0xa4,0xff,0x92,0x9e,0xa7,0xff,0x92,0x9d,0xa6,0xff,0x8d, 0x99,0xa2,0xff,0x98,0xa7,0xb0,0xff,0x8f,0x9e,0xa5,0xff,0x9c,0xae,0xb4,0xff, 0x66,0x62,0x68,0xff,0x5e,0x5f,0x5d,0xff,0xc9,0xc4,0xe9,0xff,0x92,0x9b,0x63, 0xff,0xd9,0xe7,0xbb,0xff,0x23,0x1a,0x30,0xff,0x82,0x82,0x83,0xff,0x87,0x87, 0x87,0xb5,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x01,0x84,0x63,0x64,0x63,0x00,0x39,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x53,0x53,0x53,0x8f,0x84,0x8e,0x95,0xff, 0xa9,0xb9,0xc4,0xff,0x97,0xa4,0xae,0xff,0x9b,0xa8,0xb0,0xff,0x99,0xa5,0xb0, 0xff,0x98,0xa7,0xb0,0xff,0x97,0xa6,0xaf,0xff,0x9a,0xa9,0xb0,0xff,0xaa,0xb9, 0xc5,0xff,0x8a,0x8d,0x95,0xff,0x94,0x91,0x98,0xff,0x1e,0x1f,0x1e,0xff,0x0b, 0x0b,0x0b,0xff,0x20,0x22,0x22,0xff,0x1f,0x1d,0x1e,0xff,0x29,0x29,0x29,0xff, 0x2a,0x2a,0x2a,0xff,0x4f,0x4f,0x4e,0xf5,0x39,0x39,0x3a,0xea,0x3d,0x3b,0x3b, 0xea,0x36,0x34,0x34,0xef,0x10,0x10,0x10,0xc7,0x52,0x54,0x56,0xeb,0xb3,0xad, 0xb7,0xff,0x91,0x96,0x9e,0xff,0x91,0xa4,0xae,0xff,0x92,0x9c,0xa6,0xff,0x8d, 0x99,0xa1,0xff,0x96,0xa3,0xae,0xff,0x8f,0x9c,0xa5,0xff,0x8e,0x99,0xa4,0xff, 0x92,0x9e,0xa7,0xff,0x8e,0x99,0xa2,0xff,0x91,0xa0,0xa9,0xff,0x94,0xa0,0xa7, 0xff,0x94,0xa4,0xab,0xff,0x97,0x9e,0xa8,0xff,0x4d,0x49,0x4a,0xff,0x6f,0x71, 0x73,0xff,0x95,0x8c,0xb2,0xff,0x86,0x9d,0x40,0xff,0xf1,0xff,0xbf,0xff,0xa3, 0xa1,0xb2,0xff,0x86,0x86,0x8c,0xfe,0x86,0x86,0x86,0xaa,0x00,0x00,0x00,0x4c, 0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x1e,0x00,0x00,0x00, 0x13,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x84,0x5a, 0x5a,0x5a,0x00,0x39,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00, 0x0f,0x4c,0x4c,0x4e,0xa6,0x8b,0x97,0xa1,0xff,0xa9,0xb8,0xc1,0xff,0x99,0xa6, 0xb0,0xff,0x9b,0xa7,0xb2,0xff,0x9b,0xaa,0xb1,0xff,0xa0,0xad,0xb6,0xff,0x9e, 0xaa,0xb4,0xff,0xa2,0xae,0xb7,0xff,0xb3,0xc3,0xce,0xff,0x8a,0x95,0x9a,0xff, 0x85,0x81,0x89,0xff,0x4f,0x4f,0x52,0xff,0x00,0x00,0x00,0xff,0x23,0x23,0x24, 0xff,0x1a,0x1a,0x1b,0xff,0x21,0x21,0x20,0xff,0x26,0x26,0x26,0xff,0x48,0x48, 0x4a,0xef,0x30,0x30,0x30,0xe7,0x39,0x39,0x3a,0xec,0x2b,0x2b,0x29,0xe0,0x30, 0x30,0x2f,0xdf,0xa3,0xa2,0xaa,0xff,0x91,0x91,0x97,0xff,0x91,0xa4,0xae,0xff, 0x99,0xa5,0xae,0xff,0x8d,0x9a,0xa1,0xff,0x8f,0x9c,0xa5,0xff,0x95,0xa2,0xa9, 0xff,0x8f,0x9a,0xa3,0xff,0x90,0x9d,0xa6,0xff,0x93,0xa2,0xa9,0xff,0x8b,0x96, 0xa0,0xff,0x99,0xa4,0xad,0xff,0x8f,0x9e,0xa5,0xff,0x9b,0xad,0xb9,0xff,0x81, 0x82,0x8a,0xff,0x30,0x30,0x2d,0xff,0x6c,0x68,0x71,0xff,0x6e,0x6c,0x80,0xff, 0x9d,0xa3,0xab,0xff,0xff,0xff,0xff,0xff,0x69,0x65,0x6a,0xff,0x88,0x88,0x8c, 0xfa,0x80,0x80,0x81,0x98,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x3c,0x00,0x00, 0x00,0x2c,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x84,0x6a,0x6a,0x69,0x00,0x39,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x09,0x18,0x18,0x17,0x16,0x4a,0x4a,0x4c,0xb6,0x92, 0x9e,0xaa,0xff,0xa8,0xb7,0xc2,0xff,0x9f,0xac,0xb8,0xff,0x9b,0xaa,0xb4,0xff, 0xa0,0xae,0xb6,0xff,0xa3,0xaf,0xba,0xff,0xa3,0xb4,0xba,0xff,0xa9,0xb7,0xc1, 0xff,0xbb,0xc8,0xd1,0xff,0xb4,0xc1,0xcb,0xff,0x5d,0x59,0x60,0xff,0x88,0x87, 0x8e,0xff,0x1c,0x1d,0x1a,0xff,0x0d,0x0b,0x0c,0xff,0x1b,0x1c,0x1b,0xff,0x25, 0x25,0x25,0xff,0x29,0x2b,0x2b,0xff,0x3f,0x3f,0x3f,0xec,0x2a,0x28,0x28,0xe6, 0x13,0x13,0x10,0xe1,0x45,0x48,0x47,0xef,0x9e,0x9b,0xa5,0xfe,0x8c,0x87,0x8e, 0xff,0x97,0xa6,0xae,0xff,0x9d,0xab,0xb4,0xff,0x90,0x9d,0xa5,0xff,0x8d,0x99, 0xa2,0xff,0x99,0xa4,0xaf,0xff,0x8f,0x9e,0xa4,0xff,0x93,0xa0,0xa8,0xff,0x91, 0x9c,0xa6,0xff,0x8e,0x9c,0xa5,0xff,0x8e,0x9a,0xa3,0xff,0x98,0xa3,0xad,0xff, 0x90,0x9f,0xa7,0xff,0x9b,0xa7,0xb2,0xff,0x5b,0x58,0x5b,0xff,0x4b,0x4b,0x4d, 0xff,0x61,0x62,0x5c,0xff,0x32,0x32,0x38,0xff,0x8e,0x91,0xa3,0xff,0xf1,0xf0, 0xf8,0xff,0x58,0x58,0x54,0xff,0x8f,0x8f,0x94,0xf2,0x6e,0x70,0x6d,0x84,0x00, 0x00,0x00,0x4b,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x1e, 0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x01,0x83,0x5c,0x5c,0x5b,0x00,0x3a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x0a,0x1d,0x1d,0x1c,0x19,0x42,0x42,0x44,0xbc,0x97,0xa3,0xae, 0xff,0xaa,0xb9,0xc1,0xff,0xa1,0xae,0xb8,0xff,0xa1,0xad,0xb8,0xff,0xa6,0xb5, 0xbf,0xff,0xa9,0xb8,0xc0,0xff,0xae,0xbb,0xc6,0xff,0xb6,0xc3,0xcc,0xff,0xc2, 0xcf,0xd7,0xff,0xe6,0xf7,0xfe,0xff,0x78,0x7b,0x82,0xff,0x5c,0x59,0x61,0xff, 0x74,0x74,0x7b,0xff,0x05,0x05,0x02,0xff,0x02,0x00,0x00,0xff,0x14,0x14,0x14, 0xff,0x15,0x14,0x14,0xff,0x29,0x29,0x28,0xe8,0x2d,0x2d,0x2d,0xe5,0x5b,0x5d, 0x5e,0xf7,0x90,0x8c,0x94,0xff,0x7c,0x78,0x7f,0xff,0xa0,0xab,0xb4,0xff,0xa8, 0xb8,0xc2,0xff,0x95,0xa2,0xab,0xff,0x8e,0x9b,0xa3,0xff,0x96,0xa4,0xad,0xff, 0x96,0xa1,0xac,0xff,0x93,0x9f,0xa7,0xff,0x91,0xa0,0xa8,0xff,0x94,0xa3,0xab, 0xff,0x8a,0x95,0x9e,0xff,0x98,0xa4,0xaf,0xff,0x91,0x9e,0xa5,0xff,0x9e,0xaf, 0xba,0xff,0x87,0x8c,0x92,0xff,0x2a,0x27,0x27,0xff,0x85,0x85,0x85,0xff,0xec, 0xec,0xff,0xff,0x52,0x4f,0x6e,0xff,0x18,0x17,0x1f,0xff,0xaf,0xb2,0xbb,0xff, 0x5c,0x5f,0x5e,0xff,0xa9,0xa7,0xab,0xe0,0x48,0x49,0x48,0x70,0x00,0x00,0x00, 0x4a,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x1d,0x00,0x00, 0x00,0x12,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x83, 0x48,0x49,0x48,0x00,0x21,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x0b,0x15,0x15,0x15,0x1b,0x3b,0x3b,0x3d,0xba,0x99,0xa4,0xae,0xff,0xab, 0xbc,0xc6,0xff,0xa6,0xb4,0xbe,0xff,0xa6,0xb4,0xbd,0xff,0xab,0xb7,0xc2,0xff, 0xb4,0xc1,0xca,0xff,0xb7,0xc4,0xcb,0xff,0xc2,0xcd,0xd6,0xff,0xd4,0xdf,0xe6, 0xff,0xe7,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0x4e,0x4c,0x54,0xff,0x52,0x52, 0x58,0xff,0x7d,0x7b,0x83,0xff,0x47,0x48,0x4f,0xff,0x46,0x46,0x44,0xff,0x51, 0x51,0x53,0xff,0x6c,0x6c,0x6e,0xf7,0x78,0x79,0x81,0xfe,0x6e,0x68,0x72,0xff, 0x7a,0x78,0x7b,0xff,0xb9,0xc6,0xcd,0xff,0xb9,0xcc,0xd2,0xff,0x9b,0xa8,0xb2, 0xff,0x94,0xa1,0xa8,0xff,0x9a,0xa7,0xb1,0xff,0x99,0xa8,0xaf,0xff,0x93,0xa0, 0xa9,0xff,0x82,0x97,0xa4,0xad,0xff,0x17,0x8e,0x99,0xa2,0xff,0x92,0x9f,0xa6, 0xff,0x98,0xa3,0xac,0xff,0x97,0xa5,0xae,0xff,0x99,0xa8,0xb1,0xff,0x60,0x5c, 0x5f,0xff,0x2a,0x2a,0x24,0xff,0xd3,0xd3,0xe9,0xff,0xa7,0xa3,0xb4,0xff,0xcc, 0xdd,0x84,0xff,0xd2,0xce,0xd9,0xff,0x1a,0x1a,0x22,0xff,0x6b,0x6b,0x6e,0xff, 0x94,0x92,0x94,0xbb,0x09,0x09,0x09,0x58,0x00,0x00,0x00,0x47,0x00,0x00,0x00, 0x37,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x11,0x00,0x00, 0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x83,0x31,0x2f,0x31,0x00, 0x0e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0b,0x02,0x02, 0x02,0x15,0x30,0x2f,0x32,0xad,0x99,0xa4,0xae,0xff,0xb4,0xc3,0xcd,0xff,0xa8, 0xb5,0xbf,0xff,0xae,0xba,0xc3,0xff,0xb2,0xc1,0xca,0xff,0xc4,0xd0,0xd8,0xff, 0xc3,0xd2,0xd9,0xff,0xd6,0xe1,0xe9,0xff,0xe0,0xf2,0xf9,0xff,0x83,0xff,0xff, 0xff,0xff,0x29,0x74,0x74,0x7d,0xff,0x45,0x43,0x4a,0xff,0x66,0x62,0x69,0xff, 0x6a,0x68,0x6f,0xff,0x69,0x67,0x6c,0xff,0x5c,0x5a,0x63,0xff,0x69,0x68,0x70, 0xff,0xc8,0xce,0xd1,0xff,0xe6,0xf4,0xfd,0xff,0xcb,0xd8,0xdf,0xff,0xa7,0xb2, 0xb8,0xff,0x9f,0xa9,0xb3,0xff,0xa5,0xb0,0xb8,0xff,0x9d,0xad,0xb2,0xff,0x97, 0xa1,0xad,0xff,0x9a,0xa8,0xb0,0xff,0x98,0xa4,0xad,0xff,0x92,0xa4,0xab,0xff, 0x8e,0x99,0xa4,0xff,0x98,0xa5,0xae,0xff,0x96,0xa3,0xac,0xff,0x9e,0xaf,0xba, 0xff,0x81,0x81,0x8b,0xff,0x3e,0x3d,0x3c,0xff,0x53,0x53,0x54,0xff,0xb0,0xab, 0xcc,0xff,0x92,0x9c,0x83,0xff,0xa8,0xca,0x38,0xff,0xff,0xff,0xff,0xff,0x74, 0x73,0x78,0xff,0x76,0x76,0x79,0xfa,0x82,0x81,0x82,0x9a,0x00,0x00,0x00,0x53, 0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x25,0x00,0x00,0x00, 0x19,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x00,0x83,0x1d,0x1b,0x1d,0x00,0x0d,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x14,0x20,0x20,0x20,0x9a,0x91,0x99, 0xa3,0xff,0xbd,0xd1,0xd9,0xff,0xac,0xb8,0xc3,0xff,0xb4,0xc3,0xcc,0xff,0xbd, 0xc9,0xd1,0xff,0xcd,0xda,0xe3,0xff,0xd6,0xe1,0xea,0xff,0xe2,0xee,0xf6,0xff, 0x85,0xff,0xff,0xff,0xff,0x05,0xd0,0xdc,0xe7,0xff,0x99,0xa0,0xa8,0xff,0x87, 0x8e,0x95,0xff,0x9a,0xa1,0xa6,0xff,0xd4,0xe2,0xe7,0xff,0x82,0xff,0xff,0xff, 0xff,0x21,0xde,0xef,0xf4,0xff,0xb1,0xbd,0xc5,0xff,0xb0,0xbd,0xc4,0xff,0xb0, 0xbc,0xc5,0xff,0xa6,0xb2,0xbb,0xff,0x9e,0xa9,0xb3,0xff,0xa1,0xaf,0xb8,0xff, 0x9b,0xa6,0xaf,0xff,0x9a,0xa7,0xb0,0xff,0x8d,0x9a,0xa2,0xff,0x98,0xa4,0xad, 0xff,0x9a,0xa8,0xaf,0xff,0x9e,0xac,0xb5,0xff,0x8e,0x9a,0xa2,0xff,0x71,0x6c, 0x72,0xff,0x26,0x26,0x21,0xff,0x71,0x71,0x81,0xff,0x76,0x77,0x89,0xff,0x95, 0x92,0x99,0xff,0xf8,0xfb,0xf7,0xff,0xef,0xed,0xf3,0xff,0x3a,0x3a,0x42,0xff, 0x92,0x92,0x94,0xdd,0x48,0x47,0x47,0x71,0x00,0x00,0x00,0x4f,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x16,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x83, 0x12,0x13,0x12,0x00,0x0d,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x0b,0x00,0x00,0x00,0x14,0x11,0x10,0x10,0x77,0x76,0x7c,0x82,0xff,0xce, 0xe0,0xec,0xff,0xb5,0xc1,0xca,0xff,0xbe,0xcb,0xd5,0xff,0xc7,0xd5,0xdd,0xff, 0xd9,0xe5,0xec,0xff,0xe2,0xf1,0xf7,0xff,0xf9,0xff,0xff,0xff,0x84,0xff,0xff, 0xff,0xff,0x06,0xe6,0xf7,0xff,0xff,0xe6,0xf5,0xfd,0xff,0xe2,0xf2,0xfc,0xff, 0xe2,0xf0,0xfa,0xff,0xdf,0xef,0xf8,0xff,0xf0,0xff,0xff,0xff,0x82,0xff,0xff, 0xff,0xff,0x21,0xe6,0xf7,0xfe,0xff,0xc7,0xd1,0xd7,0xff,0xbc,0xca,0xcf,0xff, 0xb6,0xc2,0xc6,0xff,0xa5,0xb2,0xbd,0xff,0xa6,0xb3,0xba,0xff,0xa1,0xac,0xb6, 0xff,0x9f,0xad,0xb4,0xff,0x91,0x9d,0xa6,0xff,0x99,0xa5,0xae,0xff,0x9d,0xa9, 0xb2,0xff,0x9e,0xaa,0xb3,0xff,0x99,0xab,0xb4,0xff,0x85,0x84,0x88,0xff,0x30, 0x2c,0x2e,0xff,0x56,0x56,0x56,0xff,0x39,0x3a,0x3c,0xff,0x4f,0x4b,0x52,0xff, 0x92,0x93,0xa7,0xff,0xf0,0xef,0xfd,0xff,0x91,0x91,0x90,0xff,0x6c,0x6c,0x72, 0xfe,0x87,0x87,0x87,0xb2,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x4b,0x00,0x00, 0x00,0x3c,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x14,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00, 0x83,0x0e,0x0e,0x0e,0x00,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x14,0x09,0x08,0x08,0x55,0x4e,0x4f,0x54,0xf3, 0xd4,0xe6,0xf0,0xff,0xc4,0xd2,0xd8,0xff,0xc8,0xd5,0xdc,0xff,0xd8,0xe4,0xeb, 0xff,0xe0,0xeb,0xf5,0xff,0xf9,0xff,0xff,0xff,0x84,0xff,0xff,0xff,0xff,0x07, 0xe9,0xfe,0xff,0xff,0xdf,0xe9,0xf2,0xff,0xcb,0xda,0xe4,0xff,0xc6,0xd2,0xdc, 0xff,0xc8,0xd5,0xdc,0xff,0xcb,0xda,0xde,0xff,0xde,0xee,0xf7,0xff,0x83,0xff, 0xff,0xff,0xff,0x08,0xcf,0xdb,0xe3,0xff,0xc2,0xcc,0xd3,0xff,0xb2,0xc1,0xc8, 0xff,0xb0,0xbb,0xc3,0xff,0xa7,0xb6,0xbe,0xff,0xa7,0xb4,0xbc,0xff,0x96,0xa1, 0xab,0xff,0x9c,0xaa,0xb1,0xff,0x82,0xa4,0xaf,0xb8,0xff,0x16,0x9e,0xb0,0xb9, 0xff,0x8f,0x91,0x99,0xff,0x44,0x43,0x45,0xff,0x00,0x00,0x00,0xff,0xd2,0xd2, 0xd9,0xff,0xc2,0xbf,0xe1,0xff,0x23,0x1d,0x36,0xff,0x22,0x22,0x28,0xff,0xc8, 0xc8,0xd8,0xff,0x56,0x56,0x58,0xff,0x94,0x95,0x99,0xeb,0x4e,0x4d,0x4f,0x7f, 0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x37,0x00,0x00,0x00, 0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0a,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x83,0x07,0x09,0x07,0x00, 0x0b,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0a,0x00,0x00, 0x00,0x12,0x03,0x04,0x02,0x34,0x2e,0x2e,0x31,0xd6,0xc9,0xd7,0xe0,0xff,0xdd, 0xec,0xf5,0xff,0xd3,0xde,0xe6,0xff,0xdf,0xeb,0xf4,0xff,0xf6,0xff,0xff,0xff, 0x85,0xff,0xff,0xff,0xff,0x07,0xea,0xf9,0xff,0xff,0xd4,0xe1,0xea,0xff,0xcb, 0xd8,0xe1,0xff,0xca,0xd7,0xde,0xff,0xcc,0xd9,0xe3,0xff,0xd3,0xde,0xe7,0xff, 0xe1,0xf0,0xf8,0xff,0x83,0xff,0xff,0xff,0xff,0x20,0xdc,0xeb,0xf1,0xff,0xbf, 0xcb,0xd1,0xff,0xb8,0xc4,0xc9,0xff,0xb4,0xc3,0xc9,0xff,0xaf,0xbb,0xc3,0xff, 0x9c,0xa7,0xaf,0xff,0xa4,0xb0,0xba,0xff,0xa6,0xb2,0xbb,0xff,0xa7,0xb4,0xbe, 0xff,0xa0,0xb4,0xba,0xff,0x9a,0x9d,0xa9,0xff,0x54,0x4e,0x52,0xff,0x00,0x00, 0x00,0xff,0x7f,0x7b,0x82,0xff,0xdd,0xda,0xfb,0xff,0x82,0x87,0x66,0xff,0xe7, 0xfa,0xb8,0xff,0xa4,0xa3,0xbd,0xff,0x18,0x16,0x19,0xff,0x8f,0x8f,0x95,0xfe, 0x75,0x72,0x75,0xb5,0x04,0x04,0x04,0x5d,0x00,0x00,0x00,0x4f,0x00,0x00,0x00, 0x41,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x18,0x00,0x00, 0x00,0x0e,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x84,0x0c,0x0f,0x0c,0x00,0x09,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x09,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x1b,0x11,0x11,0x12,0x99,0x82, 0x87,0x8e,0xff,0xff,0xff,0xff,0xff,0xe1,0xef,0xf4,0xff,0xea,0xfb,0xff,0xff, 0x85,0xff,0xff,0xff,0xff,0x08,0xe5,0xf8,0xff,0xff,0xe4,0xee,0xf5,0xff,0xdc, 0xeb,0xf1,0xff,0xd5,0xe1,0xe9,0xff,0xcd,0xda,0xe4,0xff,0xce,0xdb,0xe3,0xff, 0xd2,0xe0,0xe6,0xff,0xda,0xeb,0xf4,0xff,0x83,0xff,0xff,0xff,0xff,0x1e,0xeb, 0xfc,0xff,0xff,0xc5,0xcf,0xd5,0xff,0xc3,0xd0,0xd7,0xff,0xbb,0xc5,0xce,0xff, 0xa7,0xb2,0xba,0xff,0xae,0xba,0xc0,0xff,0xaf,0xbb,0xc3,0xff,0xae,0xb9,0xc3, 0xff,0xa5,0xb6,0xbe,0xff,0x95,0x9f,0xa6,0xff,0x81,0x7e,0x82,0xff,0x30,0x2e, 0x2e,0xff,0x2d,0x2d,0x30,0xff,0x96,0x96,0xa7,0xff,0x90,0x8c,0xa8,0xff,0x81, 0xa1,0x1c,0xff,0xec,0xf7,0xb9,0xff,0xff,0xff,0xff,0xff,0x6f,0x70,0x6f,0xff, 0x89,0x89,0x8a,0xe1,0x31,0x31,0x31,0x7b,0x00,0x00,0x00,0x56,0x00,0x00,0x00, 0x49,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x1f,0x00,0x00, 0x00,0x14,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x82, 0x00,0x00,0x00,0x00,0x84,0x15,0x14,0x16,0x00,0x07,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x19,0x0c,0x0c,0x0c,0x5a, 0x3a,0x39,0x3e,0xee,0xfa,0xfb,0xfc,0xff,0x86,0xff,0xff,0xff,0xff,0x09,0xe7, 0xfa,0xff,0xff,0xe2,0xef,0xf6,0xff,0xd5,0xe2,0xec,0xff,0xcb,0xd9,0xe3,0xff, 0xc7,0xd6,0xdd,0xff,0xc9,0xd5,0xdd,0xff,0xca,0xd8,0xe0,0xff,0xcc,0xd7,0xe0, 0xff,0xd4,0xe4,0xeb,0xff,0x84,0xff,0xff,0xff,0xff,0x1d,0xda,0xeb,0xf1,0xff, 0xc4,0xcc,0xd4,0xff,0xb3,0xc1,0xc7,0xff,0xb9,0xc3,0xcc,0xff,0xb8,0xc4,0xcd, 0xff,0xb4,0xc1,0xc6,0xff,0xab,0xbd,0xc4,0xff,0x9b,0xa5,0xad,0xff,0x94,0x8c, 0x91,0xff,0x3a,0x39,0x3b,0xff,0x15,0x14,0x14,0xff,0x50,0x54,0x5b,0xff,0x69, 0x68,0x7e,0xff,0x77,0x77,0x7d,0xff,0xb1,0xb2,0xb2,0xff,0xff,0xff,0xff,0xff, 0x74,0x71,0x72,0xff,0x95,0x95,0x9a,0xf9,0x45,0x48,0x46,0x9e,0x00,0x00,0x00, 0x5c,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x33,0x00,0x00, 0x00,0x26,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x84,0x22,0x25, 0x21,0x00,0x07,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0d, 0x00,0x00,0x00,0x16,0x06,0x06,0x06,0x27,0x18,0x18,0x18,0xa8,0x84,0x87,0x91, 0xff,0x85,0xff,0xff,0xff,0xff,0x0a,0xf8,0xff,0xff,0xff,0xde,0xea,0xf3,0xff, 0xcf,0xdc,0xe4,0xff,0xc9,0xd6,0xdd,0xff,0xc2,0xd3,0xdc,0xff,0xc1,0xd1,0xd9, 0xff,0xc0,0xd1,0xd8,0xff,0xc8,0xd5,0xde,0xff,0xcf,0xdd,0xe2,0xff,0xda,0xe8, 0xef,0xff,0x84,0xff,0xff,0xff,0xff,0x1d,0xdc,0xeb,0xf5,0xff,0xc4,0xcf,0xd2, 0xff,0xc2,0xcd,0xd5,0xff,0xc6,0xd0,0xd7,0xff,0xbd,0xc9,0xd2,0xff,0xb6,0xc7, 0xce,0xff,0xa2,0xaa,0xb0,0xff,0x9a,0x96,0x9a,0xff,0x36,0x36,0x34,0xff,0x21, 0x28,0x2b,0xff,0x72,0x72,0x79,0xff,0x36,0x32,0x39,0xff,0x0f,0x0f,0x14,0xff, 0x6f,0x6f,0x7f,0xff,0xc0,0xbd,0xd6,0xff,0xb5,0xb5,0xb2,0xff,0x7b,0x7c,0x7f, 0xfe,0x5a,0x5c,0x5a,0xc2,0x07,0x07,0x07,0x68,0x00,0x00,0x00,0x55,0x00,0x00, 0x00,0x48,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x15,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x82,0x3e,0x44,0x44,0x00,0x82, 0x3d,0x42,0x42,0x00,0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00, 0x00,0x0b,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1e,0x1e,0x1f,0x20,0x55,0x25, 0x25,0x28,0xe1,0xde,0xe2,0xe7,0xff,0x83,0xff,0xff,0xff,0xff,0x0c,0xf7,0xff, 0xff,0xff,0xee,0xfb,0xff,0xff,0xe9,0xf6,0xfd,0xff,0xd8,0xe5,0xed,0xff,0xcb, 0xd8,0xdf,0xff,0xbf,0xcb,0xd7,0xff,0xc0,0xcd,0xd6,0xff,0xc1,0xce,0xd8,0xff, 0xca,0xd5,0xdc,0xff,0xcc,0xda,0xe1,0xff,0xd5,0xe1,0xea,0xff,0xf8,0xff,0xff, 0xff,0x83,0xff,0xff,0xff,0xff,0x1c,0xf9,0xff,0xff,0xff,0xdd,0xe8,0xf0,0xff, 0xd6,0xe1,0xe4,0xff,0xc6,0xd3,0xdd,0xff,0xc3,0xd1,0xda,0xff,0xa6,0xac,0xb2, 0xff,0x84,0x7d,0x85,0xff,0x1e,0x1e,0x20,0xff,0x0f,0x0f,0x13,0xff,0x5b,0x56, 0x5b,0xff,0xc8,0xc8,0xdf,0xff,0x96,0x94,0xae,0xff,0x51,0x52,0x5c,0xff,0x03, 0x03,0x05,0xff,0x6e,0x6e,0x76,0xff,0x7e,0x82,0x85,0xff,0x69,0x65,0x69,0xd7, 0x1f,0x1d,0x1f,0x7a,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x4e,0x00,0x00,0x00, 0x40,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x1a,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x83, 0x00,0x00,0x00,0x00,0x0d,0x47,0x4a,0x4f,0x00,0x44,0x49,0x4c,0x00,0x44,0x4b, 0x4e,0x00,0x42,0x4a,0x4c,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x25, 0x28,0x28,0x26,0x80,0x27,0x27,0x2c,0xf5,0xfb,0xfb,0xfc,0xff,0x82,0xff,0xff, 0xff,0xff,0x0c,0xe7,0xf7,0xff,0xff,0xde,0xeb,0xf1,0xff,0xd6,0xe3,0xea,0xff, 0xd5,0xe2,0xeb,0xff,0xd1,0xdd,0xe7,0xff,0xcd,0xda,0xe3,0xff,0xc6,0xd4,0xde, 0xff,0xc4,0xd4,0xda,0xff,0xc6,0xd4,0xde,0xff,0xcb,0xd6,0xdd,0xff,0xd0,0xdc, 0xe2,0xff,0xef,0xff,0xff,0xff,0x84,0xff,0xff,0xff,0xff,0x1b,0xf2,0xff,0xff, 0xff,0xdd,0xec,0xf2,0xff,0xc7,0xd3,0xd9,0xff,0x9a,0x9a,0xa0,0xff,0x56,0x52, 0x59,0xff,0x26,0x26,0x2f,0xff,0x1a,0x1a,0x1a,0xff,0x12,0x12,0x18,0xff,0xbf, 0xbf,0xd8,0xff,0x6d,0x6f,0x7c,0xff,0x64,0x7c,0x00,0xff,0xe9,0xfa,0xbc,0xff, 0xd2,0xc9,0xe4,0xff,0x3f,0x3f,0x3f,0xff,0x76,0x79,0x78,0xe7,0x32,0x30,0x32, 0x89,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x45,0x00,0x00, 0x00,0x37,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x14,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01, 0x83,0x00,0x00,0x00,0x00,0x1b,0x3b,0x3d,0x3d,0x00,0x40,0x3d,0x42,0x00,0x7a, 0x71,0x7d,0x00,0x73,0x6a,0x77,0x00,0x71,0x68,0x74,0x00,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x15,0x00,0x00,0x00, 0x1f,0x13,0x11,0x13,0x33,0x2a,0x28,0x29,0x94,0x25,0x26,0x2b,0xf6,0xe5,0xec, 0xf4,0xff,0xff,0xff,0xff,0xff,0xed,0xff,0xff,0xff,0xd1,0xdd,0xe4,0xff,0xcd, 0xdc,0xe2,0xff,0xc7,0xd2,0xdc,0xff,0xc3,0xd3,0xd8,0xff,0xc5,0xd3,0xda,0xff, 0xc7,0xd7,0xe1,0xff,0xcb,0xd7,0xdf,0xff,0xcd,0xd8,0xe1,0xff,0xd0,0xdf,0xe4, 0xff,0xd9,0xe7,0xef,0xff,0xfc,0xff,0xff,0xff,0x84,0xff,0xff,0xff,0xff,0x1a, 0xfe,0xff,0xff,0xff,0xaf,0xb5,0xbe,0xff,0x7e,0x79,0x7e,0xff,0x2d,0x2b,0x2d, 0xff,0x1f,0x1e,0x22,0xff,0x3d,0x44,0x17,0xff,0x21,0x24,0x18,0xff,0x6d,0x6d, 0x84,0xff,0x52,0x51,0x62,0xff,0x73,0x78,0x6f,0xff,0x9d,0xb1,0x6e,0xff,0xf5, 0xef,0xff,0xff,0x8d,0x91,0x93,0xff,0x70,0x70,0x6f,0xed,0x3f,0x40,0x40,0x90, 0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x3c,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x18,0x00,0x00, 0x00,0x0f,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x84, 0x00,0x00,0x00,0x00,0x1b,0x3f,0x40,0x40,0x00,0x25,0x23,0x26,0x00,0x4c,0x46, 0x4e,0x00,0x85,0x75,0x86,0x00,0x92,0x81,0x92,0x00,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x19, 0x00,0x00,0x00,0x25,0x15,0x14,0x15,0x39,0x21,0x20,0x21,0x93,0x22,0x22,0x25, 0xec,0x95,0x9b,0xa2,0xff,0xfc,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xd9,0xe6, 0xf0,0xff,0xc2,0xd3,0xdc,0xff,0xbf,0xcd,0xd6,0xff,0xbf,0xca,0xd4,0xff,0xc0, 0xcc,0xd5,0xff,0xc3,0xd2,0xd8,0xff,0xca,0xd5,0xdd,0xff,0xcc,0xd9,0xe0,0xff, 0xd6,0xe0,0xe9,0xff,0xf3,0xff,0xff,0xff,0x83,0xff,0xff,0xff,0xff,0x1b,0xe0, 0xe5,0xe9,0xff,0x83,0x86,0x8e,0xff,0x40,0x3b,0x40,0xff,0x00,0x00,0x00,0xff, 0x3a,0x3a,0x45,0xff,0x53,0x52,0x53,0xff,0x3f,0x42,0x32,0xff,0x38,0x37,0x48, 0xff,0x09,0x05,0x0a,0xff,0x4d,0x4e,0x5e,0xff,0x72,0x6d,0x7d,0xff,0xdb,0xd4, 0xed,0xff,0x95,0x96,0x95,0xff,0x5c,0x5c,0x5b,0xed,0x4f,0x4f,0x55,0x94,0x00, 0x00,0x00,0x60,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x3f, 0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x1b,0x00,0x00,0x00, 0x12,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x01,0x84,0x00,0x00,0x00,0x00,0x38,0x40,0x40,0x41,0x00,0x21,0x21,0x22, 0x00,0x1d,0x20,0x1f,0x00,0x45,0x3d,0x46,0x00,0x81,0x71,0x81,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x29,0x06,0x06,0x06,0x39, 0x15,0x15,0x15,0x7d,0x17,0x16,0x18,0xc6,0x4a,0x4c,0x51,0xf7,0xa2,0xa4,0xab, 0xff,0xe3,0xf0,0xf7,0xff,0xe5,0xf5,0xff,0xff,0xdd,0xee,0xf7,0xff,0xd2,0xe6, 0xef,0xff,0xd1,0xe3,0xec,0xff,0xd5,0xe3,0xed,0xff,0xd7,0xe7,0xed,0xff,0xe0, 0xf1,0xf8,0xff,0xe7,0xf7,0xfe,0xff,0xed,0xfb,0xff,0xff,0xff,0xff,0xff,0xff, 0xc3,0xc1,0xc3,0xff,0x6d,0x6d,0x75,0xff,0x43,0x42,0x45,0xff,0x1b,0x19,0x1c, 0xff,0x2c,0x2b,0x2d,0xff,0x39,0x37,0x3f,0xff,0x16,0x13,0x17,0xff,0x28,0x29, 0x2f,0xff,0xaa,0xa8,0xbf,0xff,0x92,0x8f,0xaf,0xff,0x47,0x45,0x4c,0xff,0x00, 0x00,0x00,0xff,0x4b,0x50,0x5a,0xff,0x72,0x72,0x7b,0xff,0x4a,0x47,0x4b,0xe7, 0x4a,0x4b,0x48,0x8c,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x58,0x00,0x00,0x00, 0x4d,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x28,0x00,0x00, 0x00,0x1e,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x85,0x00,0x00,0x00,0x00,0x38,0x40,0x40, 0x41,0x00,0x22,0x21,0x23,0x00,0x25,0x27,0x27,0x00,0x33,0x2c,0x34,0x00,0x3f, 0x3e,0x40,0x00,0x6f,0x67,0x70,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x16,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x37,0x06,0x05,0x06,0x59,0x0e,0x0d, 0x0e,0x95,0x1b,0x1b,0x1c,0xc8,0x37,0x37,0x3b,0xf2,0x5c,0x5b,0x61,0xff,0x8c, 0x8d,0x99,0xff,0x9b,0xa3,0xac,0xff,0xa4,0xaa,0xb4,0xff,0xa4,0xae,0xb4,0xff, 0xa2,0xa7,0xb2,0xff,0x94,0x9b,0xa3,0xff,0x7c,0x80,0x87,0xff,0x60,0x5c,0x61, 0xff,0x39,0x36,0x42,0xff,0x19,0x1a,0x24,0xff,0x08,0x07,0x07,0xff,0x1e,0x1d, 0x2a,0xff,0x6a,0x6f,0x5b,0xff,0x93,0xa8,0x4c,0xff,0x66,0x71,0x51,0xff,0x1e, 0x19,0x25,0xff,0x99,0x97,0xaa,0xff,0x7a,0x77,0x90,0xff,0x48,0x5c,0x00,0xff, 0xb1,0xc5,0x64,0xff,0xf4,0xf1,0xff,0xff,0x30,0x2e,0x33,0xff,0x32,0x34,0x32, 0xd9,0x3a,0x3c,0x3a,0x81,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x58,0x00,0x00, 0x00,0x4d,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x2a,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x09, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x85,0x00,0x00, 0x00,0x00,0x37,0x40,0x40,0x41,0x00,0x22,0x21,0x23,0x00,0x25,0x27,0x27,0x00, 0x36,0x2d,0x36,0x00,0x41,0x40,0x42,0x00,0x40,0x44,0x41,0x00,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0b,0x00,0x00, 0x00,0x10,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x36,0x01,0x01,0x01,0x41,0x0a,0x0a,0x0a,0x5f,0x15,0x15,0x14,0x8a, 0x1b,0x19,0x1a,0xc2,0x20,0x1e,0x1e,0xf5,0x29,0x27,0x29,0xff,0x18,0x17,0x17, 0xff,0x14,0x0e,0x0f,0xff,0x15,0x14,0x13,0xff,0x08,0x04,0x0a,0xff,0x16,0x13, 0x14,0xff,0x2e,0x2d,0x2d,0xff,0x3c,0x42,0x2c,0xff,0x3c,0x42,0x27,0xff,0x2f, 0x2e,0x39,0xff,0x63,0x63,0x68,0xff,0x7a,0x78,0x87,0xff,0x43,0x44,0x48,0xff, 0x06,0x04,0x0a,0xff,0x5b,0x5b,0x6a,0xff,0x4b,0x4c,0x5c,0xff,0x6b,0x68,0x69, 0xff,0x87,0x9a,0x5f,0xff,0xe7,0xe6,0xec,0xff,0x9e,0x9d,0xa3,0xff,0x2e,0x2f, 0x2f,0xcf,0x19,0x1a,0x19,0x74,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x57,0x00, 0x00,0x00,0x4d,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x2b, 0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x0a,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x86,0x00, 0x00,0x00,0x00,0x36,0x40,0x40,0x41,0x00,0x22,0x21,0x23,0x00,0x25,0x27,0x27, 0x00,0x36,0x2d,0x36,0x00,0x42,0x41,0x44,0x00,0x42,0x46,0x44,0x00,0x36,0x37, 0x36,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x21, 0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x3c,0x00,0x00,0x00, 0x45,0x02,0x02,0x02,0x4e,0x38,0x39,0x37,0x7f,0x2c,0x2e,0x2e,0xc2,0x5d,0x5f, 0x61,0xf3,0x55,0x52,0x59,0xff,0x4f,0x4f,0x4b,0xff,0x5c,0x60,0x4f,0xff,0x5c, 0x5c,0x5f,0xff,0x4f,0x4d,0x56,0xff,0x6c,0x74,0x69,0xff,0x9f,0xa6,0x8a,0xff, 0xcb,0xc5,0xc7,0xff,0x69,0x6d,0x6f,0xff,0x05,0x08,0x02,0xff,0x6d,0x6c,0x75, 0xff,0x58,0x53,0x6f,0xff,0x00,0x00,0x05,0xff,0x1d,0x1e,0x22,0xff,0x60,0x5d, 0x70,0xff,0xc1,0xbb,0xd3,0xff,0x86,0x82,0x88,0xfc,0x13,0x13,0x13,0xb1,0x03, 0x03,0x03,0x6a,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x4c, 0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x2b,0x00,0x00,0x00, 0x21,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0b,0x00,0x00, 0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x87,0x00,0x00,0x00,0x00, 0x35,0x40,0x40,0x41,0x00,0x22,0x21,0x23,0x00,0x2a,0x2c,0x2c,0x00,0x47,0x3c, 0x47,0x00,0x62,0x61,0x65,0x00,0x6f,0x73,0x72,0x00,0x6d,0x70,0x70,0x00,0x6f, 0x6d,0x71,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07, 0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x17,0x00,0x00,0x00, 0x1f,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x37,0x00,0x00, 0x00,0x3f,0x00,0x00,0x00,0x47,0x0c,0x0d,0x0c,0x5b,0x28,0x28,0x29,0x90,0x4a, 0x4a,0x4c,0xc4,0x69,0x69,0x6d,0xec,0x7b,0x7a,0x7f,0xfd,0x79,0x79,0x7d,0xff, 0x6c,0x6c,0x6f,0xff,0x5e,0x5c,0x65,0xff,0x6c,0x6a,0x7b,0xff,0x3b,0x3f,0x3c, 0xff,0x13,0x16,0x14,0xff,0x88,0x87,0x93,0xff,0x86,0x85,0x9d,0xff,0x6a,0x70, 0x50,0xff,0x7a,0x86,0x5c,0xff,0x4e,0x4d,0x5d,0xff,0x37,0x37,0x3e,0xff,0x4a, 0x4a,0x4e,0xf5,0x0c,0x0c,0x0c,0x9d,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x5d, 0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x40,0x00,0x00,0x00, 0x35,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x18,0x00,0x00, 0x00,0x11,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,0x88,0x00,0x00,0x00,0x00,0x35,0x76,0x76,0x78,0x00,0x4f,0x4d, 0x50,0x00,0x58,0x5b,0x5b,0x00,0x76,0x66,0x76,0x00,0x8c,0x8a,0x8f,0x00,0x8c, 0x91,0x8f,0x00,0x7a,0x7d,0x7d,0x00,0x6f,0x6d,0x71,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00, 0x0b,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x1c,0x00,0x00, 0x00,0x22,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x38,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x47,0x0d,0x0d,0x0c,0x5b,0x2a,0x29,0x29,0x82, 0x40,0x40,0x3e,0xa9,0x5c,0x5a,0x5c,0xc3,0x6e,0x6f,0x71,0xd1,0x65,0x65,0x65, 0xe7,0x2a,0x2a,0x26,0xfd,0x15,0x14,0x14,0xff,0x4c,0x4c,0x61,0xff,0x64,0x61, 0x73,0xff,0x5d,0x5c,0x5c,0xff,0x65,0x7c,0x17,0xff,0xd1,0xd7,0xb6,0xff,0xcf, 0xcb,0xd6,0xff,0x32,0x32,0x32,0xe4,0x09,0x09,0x09,0x89,0x00,0x00,0x00,0x63, 0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x49,0x00,0x00,0x00, 0x3e,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x17,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x3d,0x2c,0x3d,0x00,0x88,0x00,0x00,0x00, 0x00,0x35,0x88,0x88,0x8a,0x00,0x53,0x51,0x54,0x00,0x58,0x5b,0x5b,0x00,0x76, 0x66,0x76,0x00,0x8c,0x8a,0x8f,0x00,0x8c,0x91,0x8f,0x00,0x7a,0x7d,0x7d,0x00, 0x6f,0x6d,0x71,0x00,0x84,0x83,0x86,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0a,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1e,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x3b, 0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x53,0x29,0x28,0x29, 0x76,0x1a,0x1a,0x1a,0xb5,0x2e,0x2e,0x30,0xf2,0x72,0x70,0x7b,0xff,0x32,0x2f, 0x4b,0xff,0x03,0x02,0x07,0xff,0x27,0x28,0x2f,0xff,0x61,0x61,0x73,0xff,0xbd, 0xbb,0xc8,0xff,0x8b,0x88,0x8f,0xfd,0x1f,0x1d,0x1d,0xc2,0x04,0x04,0x04,0x75, 0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x50,0x00,0x00,0x00, 0x46,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x28,0x00,0x00, 0x00,0x1f,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x3d,0x3d,0x3d,0x00, 0x3d,0x2c,0x3d,0x00,0x88,0x00,0x00,0x00,0x00,0x32,0x88,0x8a,0x8c,0x01,0x51, 0x4f,0x54,0x01,0x58,0x5a,0x5b,0x00,0x76,0x6a,0x76,0x00,0x8c,0x8a,0x8f,0x00, 0x8c,0x91,0x8f,0x00,0x7a,0x7d,0x7d,0x00,0x6f,0x6d,0x71,0x00,0x84,0x83,0x86, 0x00,0x58,0x5a,0x5a,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x22, 0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x31,0x03,0x03,0x03,0x3a,0x2c,0x2a,0x2c, 0x60,0x34,0x34,0x35,0x9e,0x22,0x22,0x22,0xdf,0x50,0x50,0x56,0xfe,0x93,0x92, 0xa5,0xff,0x60,0x68,0x62,0xff,0x61,0x73,0x32,0xff,0x81,0x86,0x73,0xff,0x53, 0x52,0x5f,0xff,0x40,0x40,0x47,0xff,0x3c,0x3c,0x43,0xe9,0x0c,0x0c,0x0c,0x9a, 0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x56,0x00,0x00,0x00, 0x4d,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x2f,0x00,0x00, 0x00,0x26,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02, 0x82,0x3d,0x3d,0x3d,0x00,0x01,0x3d,0x2c,0x3d,0x00,0x88,0x00,0x00,0x00,0x00, 0x08,0xa1,0xa3,0x9d,0x00,0x78,0x7d,0x78,0x02,0x5b,0x5d,0x5f,0x01,0x78,0x6a, 0x7a,0x00,0x8f,0x8c,0x93,0x00,0x8f,0x93,0x91,0x00,0x7a,0x7d,0x7d,0x00,0x6f, 0x6d,0x71,0x00,0x82,0x00,0x00,0x00,0x01,0x27,0x00,0x00,0x00,0x02,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x17, 0x00,0x00,0x00,0x1d,0x2d,0x2e,0x2e,0x33,0x48,0x4a,0x4a,0x68,0x47,0x47,0x47, 0xa8,0x4d,0x4e,0x53,0xe8,0x4a,0x4a,0x54,0xfe,0x36,0x35,0x46,0xff,0x32,0x33, 0x3e,0xff,0x57,0x52,0x61,0xff,0x6e,0x74,0x5e,0xff,0xa7,0xae,0x86,0xff,0xb4, 0xb6,0xb5,0xff,0x65,0x65,0x67,0xf4,0x12,0x12,0x12,0xb4,0x04,0x04,0x04,0x72, 0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x52,0x00,0x00,0x00, 0x4a,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x2d,0x00,0x00, 0x00,0x24,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01, 0x83,0x3d,0x3d,0x3d,0x00,0x01,0x3d,0x2c,0x3d,0x00,0x88,0x00,0x00,0x00,0x00, 0x07,0xa6,0xa8,0xa1,0x00,0x93,0x96,0x8c,0x00,0x7f,0x7f,0x7f,0x01,0x63,0x5d, 0x64,0x02,0x81,0x81,0x84,0x02,0x8c,0x91,0x8f,0x02,0x81,0x83,0x81,0x01,0x82, 0x00,0x00,0x00,0x01,0x27,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x0c,0x42,0x42,0x43,0x19,0x51,0x4c,0x51,0x35,0x59,0x59,0x59,0x62, 0x50,0x50,0x50,0x98,0x3e,0x3e,0x42,0xd0,0x46,0x45,0x48,0xfa,0x72,0x72,0x7b, 0xff,0x9b,0x97,0xa3,0xff,0x77,0x7d,0x69,0xff,0x74,0x7d,0x53,0xff,0x61,0x61, 0x66,0xff,0x49,0x4a,0x4f,0xff,0x6a,0x66,0x73,0xff,0x6c,0x6b,0x72,0xf3,0x25, 0x25,0x25,0xba,0x07,0x07,0x07,0x79,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x5b, 0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x45,0x00,0x00,0x00, 0x3c,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x21,0x00,0x00, 0x00,0x19,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x84,0x3d,0x3d,0x3d, 0x00,0x01,0x3d,0x2c,0x3d,0x00,0x88,0x00,0x00,0x00,0x00,0x31,0xa5,0xa6,0xa1, 0x00,0x91,0x93,0x8a,0x00,0x81,0x81,0x81,0x00,0x4d,0x4f,0x4f,0x00,0x3a,0x3b, 0x3d,0x02,0x46,0x48,0x48,0x09,0x57,0x57,0x59,0x18,0x6c,0x6a,0x6e,0x29,0x7f, 0x7e,0x81,0x35,0x54,0x55,0x55,0x3a,0x52,0x4f,0x52,0x40,0x4c,0x4c,0x4c,0x49, 0x6e,0x74,0x70,0x57,0x6a,0x6c,0x6c,0x6d,0x65,0x65,0x65,0x86,0x51,0x55,0x55, 0xa8,0x47,0x49,0x4b,0xc8,0x4c,0x4c,0x50,0xe6,0x61,0x61,0x64,0xfe,0x6b,0x6d, 0x71,0xff,0x5f,0x61,0x5d,0xff,0x54,0x54,0x54,0xff,0x54,0x54,0x5a,0xff,0x6a, 0x6a,0x6f,0xff,0x83,0x88,0x78,0xff,0xa1,0xa3,0x93,0xff,0x95,0x93,0x95,0xfe, 0x56,0x56,0x56,0xdf,0x1e,0x1e,0x1e,0xa7,0x08,0x09,0x08,0x70,0x00,0x00,0x00, 0x5a,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x4f,0x00,0x00, 0x00,0x49,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x2f,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x11, 0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x01,0x7b,0x5e,0x7b,0x00,0x3f,0x2d,0x3f,0x00,0x84,0x3d, 0x2c,0x3d,0x00,0x88,0x00,0x00,0x00,0x00 }; static const GdkPixdata xvideo_pixdata = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 10943, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 244, /* rowstride */ 61, /* width */ 60, /* height */ xvideo_pixdata_pixel_data /* pixel_data */ }; nvidia-settings/src/image_data/svp_3dvp_pixdata.h0000664000175000017500000011552012236467170022337 0ustar albertoalberto/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static guint8 svp_3dvp_pixdata_pixel_data[] = { 0xe6,0x00,0x00,0x00,0x00,0x0b,0x80,0xe9,0x06,0x04,0x82,0xe9,0x06,0x0c,0x83, 0xe9,0x06,0x12,0x84,0xe9,0x06,0x16,0x85,0xe9,0x06,0x18,0x86,0xe9,0x06,0x19, 0x85,0xe9,0x06,0x18,0x84,0xe9,0x06,0x15,0x83,0xe9,0x06,0x10,0x81,0xe9,0x06, 0x0a,0x80,0xe9,0x06,0x03,0xaf,0x00,0x00,0x00,0x00,0x0f,0x80,0xe9,0x06,0x07, 0x82,0xe9,0x06,0x15,0x82,0xe9,0x06,0x3b,0x82,0xe9,0x06,0x67,0x83,0xe9,0x06, 0x86,0x84,0xe9,0x06,0x98,0x85,0xe9,0x06,0xa2,0x86,0xe9,0x06,0xa5,0x85,0xe9, 0x06,0x9f,0x83,0xe9,0x06,0x93,0x83,0xe9,0x06,0x7e,0x82,0xe9,0x06,0x5a,0x82, 0xe9,0x06,0x2e,0x81,0xe9,0x06,0x11,0x80,0xe9,0x06,0x04,0xac,0x00,0x00,0x00, 0x00,0x11,0x81,0xe9,0x06,0x10,0x81,0xe9,0x06,0x3f,0x82,0xe9,0x06,0x72,0x83, 0xe9,0x06,0x83,0x83,0xe9,0x06,0x6c,0x81,0xe9,0x06,0x4a,0x80,0xe9,0x06,0x28, 0x7f,0xe9,0x06,0x0f,0x80,0xe9,0x06,0x04,0x7f,0xe9,0x06,0x17,0x80,0xe9,0x06, 0x33,0x82,0xe9,0x06,0x54,0x83,0xe9,0x06,0x75,0x83,0xe9,0x06,0x81,0x82,0xe9, 0x06,0x64,0x81,0xe9,0x06,0x2e,0x81,0xe9,0x06,0x08,0x97,0x00,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x84,0x00,0x00,0x00,0x03,0x01, 0x00,0x00,0x00,0x02,0x83,0x00,0x00,0x00,0x01,0x88,0x00,0x00,0x00,0x00,0x07, 0x80,0xe9,0x06,0x02,0x82,0xe9,0x06,0x18,0x82,0xe9,0x06,0x56,0x82,0xe9,0x06, 0x75,0x82,0xe9,0x06,0x57,0x81,0xe9,0x06,0x21,0x80,0xe9,0x06,0x03,0x87,0x00, 0x00,0x00,0x00,0x07,0x80,0xe9,0x06,0x0a,0x82,0xe9,0x06,0x32,0x82,0xe9,0x06, 0x64,0x82,0xe9,0x06,0x74,0x82,0xe9,0x06,0x3f,0x82,0xe9,0x06,0x0d,0x80,0xe9, 0x06,0x01,0x94,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x82,0x00,0x00,0x00,0x05,0x01, 0x00,0x00,0x00,0x06,0x82,0x00,0x00,0x00,0x07,0x05,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02, 0x83,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00,0x05,0x82,0xe9,0x06,0x1c, 0x82,0xe9,0x06,0x5d,0x83,0xe9,0x06,0x64,0x82,0xe9,0x06,0x2f,0x80,0xe9,0x06, 0x07,0x8b,0x00,0x00,0x00,0x00,0x05,0x80,0xe9,0x06,0x10,0x82,0xe9,0x06,0x41, 0x82,0xe9,0x06,0x6f,0x82,0xe9,0x06,0x48,0x82,0xe9,0x06,0x0a,0x94,0x00,0x00, 0x00,0x00,0x17,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06, 0x0e,0x0e,0x0e,0x1f,0x16,0x16,0x16,0x44,0x17,0x17,0x17,0x3c,0x0e,0x0e,0x0e, 0x28,0x07,0x07,0x07,0x1b,0x02,0x02,0x02,0x14,0x00,0x00,0x00,0x0e,0x00,0x00, 0x00,0x0b,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03, 0x76,0xd4,0x06,0x16,0x81,0xe7,0x06,0x59,0x82,0xe8,0x06,0x5f,0x80,0xe5,0x06, 0x1a,0x5d,0xa8,0x04,0x00,0x82,0x00,0x00,0x00,0x00,0x09,0x80,0xe9,0x06,0x10, 0x82,0xe9,0x06,0x2e,0x83,0xe9,0x06,0x46,0x85,0xe9,0x06,0x53,0x86,0xe9,0x06, 0x57,0x85,0xe9,0x06,0x4f,0x83,0xe9,0x06,0x3e,0x82,0xe9,0x06,0x25,0x80,0xe9, 0x06,0x0a,0x82,0x00,0x00,0x00,0x00,0x05,0x81,0xe9,0x06,0x01,0x82,0xe9,0x06, 0x2e,0x82,0xe9,0x06,0x73,0x82,0xe9,0x06,0x3d,0x81,0xe9,0x06,0x06,0x93,0x00, 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00, 0x08,0x0c,0x0c,0x0c,0x31,0x16,0x16,0x16,0x89,0x1e,0x1e,0x1e,0xaa,0x27,0x27, 0x27,0xa2,0x2f,0x2f,0x2f,0x96,0x31,0x31,0x31,0x85,0x2d,0x2d,0x2d,0x71,0x24, 0x24,0x24,0x5d,0x1a,0x1a,0x1a,0x4a,0x11,0x11,0x11,0x37,0x09,0x09,0x09,0x27, 0x03,0x03,0x03,0x1a,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0b,0x49,0x84,0x03, 0x12,0x79,0xd8,0x06,0x4d,0x7e,0xe1,0x06,0x71,0x75,0xd2,0x05,0x2d,0x0c,0x16, 0x01,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x80,0xe6,0x06,0x2a,0x82, 0xe9,0x06,0x5d,0x82,0xe9,0x06,0x78,0x82,0xe9,0x06,0x76,0x84,0xe9,0x06,0x6e, 0x86,0xe9,0x06,0x68,0x84,0xe9,0x06,0x71,0x82,0xe9,0x06,0x77,0x82,0xe9,0x06, 0x71,0x82,0xe9,0x06,0x4e,0x82,0xe9,0x06,0x19,0x82,0x00,0x00,0x00,0x00,0x05, 0x81,0xe9,0x06,0x01,0x82,0xe9,0x06,0x45,0x82,0xe9,0x06,0x79,0x81,0xe9,0x06, 0x28,0x80,0xe9,0x06,0x02,0x92,0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0a,0x04,0x04,0x04,0x17,0x12,0x12,0x12, 0x3d,0x1e,0x1e,0x1e,0x68,0x26,0x26,0x26,0x89,0x2a,0x2a,0x2a,0xa5,0x2e,0x2e, 0x2e,0xc0,0x31,0x31,0x31,0xd5,0x33,0x33,0x33,0xda,0x32,0x32,0x32,0xcd,0x2f, 0x2f,0x2f,0xbc,0x29,0x29,0x29,0xac,0x24,0x24,0x24,0x93,0x1e,0x1e,0x1e,0x77, 0x18,0x18,0x18,0x59,0x40,0x6c,0x0c,0x56,0x71,0xca,0x06,0x81,0x70,0xc9,0x05, 0x56,0x3c,0x6d,0x03,0x13,0x82,0x00,0x00,0x00,0x08,0x0d,0x78,0xd8,0x06,0x37, 0x80,0xe6,0x06,0x72,0x81,0xe7,0x06,0x65,0x81,0xe7,0x06,0x3d,0x81,0xe9,0x06, 0x22,0x80,0xe9,0x06,0x0d,0x80,0xe9,0x06,0x04,0x80,0xe9,0x06,0x14,0x81,0xe9, 0x06,0x2a,0x82,0xe9,0x06,0x48,0x83,0xe9,0x06,0x6c,0x82,0xe9,0x06,0x5f,0x82, 0xe9,0x06,0x1d,0x82,0x00,0x00,0x00,0x00,0x04,0x80,0xe9,0x06,0x0f,0x82,0xe9, 0x06,0x6c,0x82,0xe9,0x06,0x66,0x82,0xe9,0x06,0x06,0x92,0x00,0x00,0x00,0x00, 0x1b,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00, 0x00,0x0d,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x16,0x04,0x04,0x04,0x22,0x0e, 0x0e,0x0e,0x32,0x1c,0x1c,0x1c,0x49,0x27,0x27,0x27,0x69,0x2b,0x2b,0x2b,0x89, 0x2b,0x2b,0x2b,0xa8,0x2d,0x2d,0x2d,0xd2,0x30,0x30,0x30,0xf3,0x2f,0x2f,0x2f, 0xf6,0x2a,0x2a,0x2a,0xe8,0x29,0x2d,0x24,0xd7,0x44,0x69,0x18,0xcf,0x56,0x8e, 0x11,0xcc,0x30,0x46,0x16,0x95,0x14,0x14,0x14,0x59,0x0c,0x0c,0x0c,0x35,0x59, 0x9f,0x05,0x41,0x7c,0xde,0x06,0x78,0x78,0xd7,0x06,0x4a,0x68,0xbb,0x05,0x1d, 0x20,0x3a,0x02,0x05,0x82,0x00,0x00,0x00,0x01,0x83,0x00,0x00,0x00,0x00,0x05, 0x81,0xe9,0x06,0x07,0x82,0xe9,0x06,0x22,0x83,0xe9,0x06,0x5c,0x82,0xe9,0x06, 0x5d,0x82,0xe9,0x06,0x18,0x82,0x00,0x00,0x00,0x00,0x03,0x81,0xe9,0x06,0x33, 0x83,0xe9,0x06,0x8d,0x81,0xe9,0x06,0x23,0x92,0x00,0x00,0x00,0x00,0x1a,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x08, 0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x13,0x00,0x00,0x00, 0x15,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1f,0x05,0x05,0x05,0x29,0x0d,0x0d, 0x0d,0x38,0x1a,0x1a,0x1a,0x52,0x21,0x21,0x21,0x79,0x25,0x25,0x25,0xaa,0x2b, 0x2b,0x2b,0xdd,0x37,0x42,0x2a,0xfb,0x50,0x7b,0x1b,0xff,0x45,0x69,0x19,0xfa, 0x22,0x24,0x1f,0xec,0x21,0x21,0x21,0xda,0x2b,0x35,0x20,0xc5,0x55,0x8c,0x12, 0xc1,0x56,0x93,0x0d,0x9d,0x2a,0x47,0x09,0x38,0x03,0x03,0x02,0x0d,0x82,0x00, 0x00,0x00,0x07,0x01,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x01,0x82,0x00, 0x00,0x00,0x00,0x09,0x81,0xe9,0x06,0x00,0x82,0xe9,0x06,0x28,0x83,0xe9,0x06, 0x70,0x82,0xe9,0x06,0x46,0x80,0xe9,0x06,0x09,0x00,0x00,0x00,0x00,0x80,0xe9, 0x06,0x09,0x83,0xe9,0x06,0x83,0x82,0xe9,0x06,0x57,0x93,0x00,0x00,0x00,0x00, 0x1f,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x06,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x1a, 0x00,0x00,0x00,0x21,0x03,0x03,0x03,0x2b,0x0d,0x0d,0x0d,0x3d,0x18,0x18,0x18, 0x5d,0x39,0x54,0x18,0x9d,0x58,0x8e,0x16,0xea,0x40,0x58,0x22,0xfc,0x26,0x26, 0x26,0xff,0x23,0x23,0x23,0xff,0x39,0x51,0x1d,0xfe,0x52,0x84,0x15,0xfb,0x36, 0x49,0x1e,0xe9,0x24,0x26,0x23,0xc3,0x1c,0x1c,0x1c,0x7f,0x0b,0x0b,0x0b,0x35, 0x76,0xd4,0x05,0x52,0x80,0xe3,0x06,0x81,0x83,0xe6,0x06,0x92,0x81,0xe6,0x06, 0x6f,0x7e,0xe4,0x06,0x32,0x82,0x00,0x00,0x00,0x00,0x04,0x81,0xe9,0x06,0x06, 0x82,0xe9,0x06,0x53,0x82,0xe9,0x06,0x6e,0x82,0xe9,0x06,0x1d,0x82,0x00,0x00, 0x00,0x00,0x02,0x82,0xe9,0x06,0x5e,0x83,0xe9,0x06,0x84,0x85,0x00,0x00,0x00, 0x01,0x91,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x09,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x15,0x00,0x00, 0x00,0x1a,0x00,0x00,0x00,0x21,0x01,0x01,0x01,0x2a,0x4b,0x83,0x06,0x5f,0x64, 0xaf,0x0a,0xb0,0x31,0x47,0x17,0xa8,0x24,0x24,0x24,0xe0,0x25,0x25,0x25,0xff, 0x46,0x6b,0x19,0xff,0x4c,0x76,0x16,0xff,0x2b,0x34,0x20,0xff,0x22,0x22,0x22, 0xfc,0x22,0x22,0x22,0xee,0x40,0x62,0x17,0xd8,0x62,0xa8,0x0d,0xbe,0x62,0xae, 0x07,0x72,0x76,0xd2,0x05,0x3c,0x7c,0xdf,0x06,0x69,0x80,0xe4,0x06,0x76,0x7e, 0xe3,0x06,0x32,0x82,0x00,0x00,0x00,0x00,0x03,0x81,0xe9,0x06,0x32,0x82,0xe9, 0x06,0x7e,0x83,0xe9,0x06,0x2e,0x82,0x00,0x00,0x00,0x00,0x02,0x80,0xe9,0x06, 0x38,0x84,0xe9,0x06,0xa2,0x82,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0x00,0x03, 0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x94,0x00,0x00,0x00,0x00,0x1e, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x11,0x00,0x00, 0x00,0x19,0x5f,0xa6,0x04,0x54,0x70,0xc4,0x05,0x99,0x1e,0x33,0x06,0x48,0x0f, 0x0f,0x0f,0x68,0x1c,0x1c,0x1c,0xbe,0x4f,0x7e,0x15,0xf6,0x43,0x64,0x19,0xff, 0x26,0x2a,0x21,0xff,0x21,0x21,0x21,0xff,0x20,0x20,0x20,0xff,0x58,0x91,0x12, 0xfe,0x40,0x5f,0x1a,0xf9,0x2b,0x2f,0x26,0xd3,0x1e,0x21,0x1a,0x64,0x54,0x97, 0x04,0x2a,0x7d,0xe1,0x06,0x6c,0x80,0xe3,0x06,0x63,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x80,0xe9,0x06,0x16,0x84,0xe9,0x06,0x81,0x85,0xe9,0x06,0x39, 0x82,0x00,0x00,0x00,0x00,0x09,0x7f,0xe9,0x06,0x17,0x85,0xe9,0x06,0xb5,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x97,0x00,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06, 0x00,0x00,0x00,0x0b,0x71,0xc5,0x05,0x4b,0x77,0xd0,0x05,0x90,0x05,0x0a,0x00, 0x29,0x01,0x01,0x01,0x33,0x05,0x05,0x05,0x4f,0x5e,0xa0,0x09,0xbd,0x3e,0x59, 0x1c,0xfc,0x23,0x24,0x23,0xff,0x21,0x21,0x21,0xff,0x20,0x20,0x20,0xff,0x69, 0xb1,0x0d,0xff,0x23,0x29,0x1d,0xff,0x1e,0x1e,0x1e,0xfd,0x24,0x24,0x24,0xea, 0x27,0x2a,0x24,0x8f,0x64,0xaf,0x06,0x60,0x82,0xe3,0x06,0x7e,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x01,0x81,0xe9,0x06,0x03,0x86,0xe9,0x06,0x80,0x86,0xe9, 0x06,0x3f,0x82,0x00,0x00,0x00,0x00,0x0a,0x80,0xe9,0x06,0x03,0x86,0xe9,0x06, 0xbe,0x05,0x05,0x05,0x08,0x09,0x09,0x09,0x6f,0x15,0x15,0x15,0xb0,0x0b,0x0b, 0x0b,0x3d,0x08,0x08,0x08,0x07,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,0x98,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x03,0x7d,0xdb,0x06,0x40,0x7f,0xde,0x06,0x88,0x34,0x5f,0x03,0x21,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x2e,0x69,0xb8,0x05,0x93,0x43,0x70,0x0d,0xbc, 0x23,0x27,0x1f,0xe8,0x22,0x22,0x22,0xfd,0x1f,0x1f,0x1f,0xff,0x59,0x94,0x11, 0xff,0x3a,0x57,0x17,0xff,0x1b,0x1c,0x19,0xff,0x1e,0x1f,0x1e,0xff,0x46,0x4f, 0x3a,0xf8,0x62,0x93,0x25,0xd2,0x76,0xd1,0x07,0x6f,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x02,0x7d,0xe4,0x06,0x15,0x84,0xe9,0x06,0x82,0x85,0xe9,0x06,0x3a, 0x82,0x00,0x00,0x00,0x00,0x0c,0x7f,0xe9,0x06,0x15,0x85,0xe9,0x06,0xb6,0x00, 0x00,0x00,0x0c,0x04,0x04,0x04,0x26,0x0b,0x0b,0x0b,0x89,0x11,0x11,0x11,0xc2, 0x0e,0x0e,0x0e,0x5a,0x0c,0x0c,0x0c,0x0c,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x98,0x00,0x00,0x00,0x00,0x16, 0x81,0xe5,0x06,0x36,0x81,0xe6,0x06,0x83,0x69,0xbf,0x05,0x2a,0x00,0x00,0x00, 0x11,0x00,0x00,0x00,0x1e,0x67,0xb6,0x04,0x79,0x61,0xae,0x04,0x8e,0x1e,0x2e, 0x0a,0x89,0x1c,0x1c,0x1c,0xd7,0x1f,0x1f,0x1f,0xfb,0x3e,0x5e,0x19,0xff,0x58, 0x8d,0x17,0xff,0x53,0x71,0x2c,0xff,0x60,0x71,0x4a,0xff,0x68,0x8f,0x39,0xff, 0x63,0x97,0x23,0xeb,0x4e,0x7a,0x19,0x7b,0x02,0x02,0x02,0x07,0x00,0x00,0x00, 0x02,0x80,0xe7,0x06,0x31,0x82,0xe9,0x06,0x7f,0x83,0xe9,0x06,0x2f,0x82,0x00, 0x00,0x00,0x00,0x0e,0x80,0xe9,0x06,0x35,0x84,0xe9,0x06,0xa4,0x00,0x00,0x00, 0x0d,0x00,0x00,0x00,0x11,0x01,0x01,0x01,0x15,0x0a,0x0a,0x0a,0x6b,0x11,0x11, 0x11,0xc6,0x10,0x10,0x10,0x68,0x0e,0x0e,0x0e,0x18,0x01,0x01,0x01,0x09,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01, 0x96,0x00,0x00,0x00,0x00,0x16,0x81,0xe7,0x06,0x2b,0x81,0xe7,0x06,0x7d,0x7a, 0xdc,0x06,0x3e,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x14,0x5a,0xa2,0x04,0x57, 0x6b,0xbe,0x05,0x98,0x36,0x5f,0x03,0x65,0x10,0x11,0x0e,0x81,0x2a,0x2a,0x2a, 0xe7,0x46,0x46,0x46,0xfe,0x6b,0x8b,0x41,0xff,0x72,0xa7,0x28,0xff,0x6f,0xab, 0x18,0xff,0x59,0x88,0x19,0xff,0x45,0x5b,0x2b,0xf8,0x33,0x33,0x33,0x9d,0x03, 0x03,0x03,0x13,0x58,0x9e,0x04,0x07,0x81,0xe8,0x06,0x51,0x82,0xe9,0x06,0x70, 0x82,0xe9,0x06,0x1e,0x82,0x00,0x00,0x00,0x00,0x0f,0x82,0xe9,0x06,0x5b,0x83, 0xe9,0x06,0x87,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x16, 0x02,0x02,0x02,0x22,0x0b,0x0b,0x0b,0x7e,0x12,0x12,0x12,0xd0,0x13,0x13,0x13, 0x86,0x0f,0x0f,0x0f,0x32,0x07,0x07,0x07,0x13,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00,0x01, 0x91,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x75, 0xd3,0x05,0x1e,0x7f,0xe3,0x06,0x70,0x7b,0xdb,0x06,0x5c,0x1f,0x38,0x01,0x11, 0x00,0x00,0x00,0x17,0x31,0x59,0x02,0x33,0x64,0xb1,0x08,0x91,0x5a,0x8f,0x19, 0xac,0x54,0x5b,0x4b,0xc8,0x6a,0x6a,0x67,0xf1,0x6f,0x6e,0x65,0xf6,0x5b,0x5a, 0x46,0xfc,0x4f,0x4e,0x31,0xff,0x4a,0x49,0x29,0xff,0x36,0x36,0x25,0xff,0x34, 0x34,0x35,0xeb,0x28,0x28,0x28,0x7e,0x02,0x04,0x00,0x0c,0x76,0xd4,0x06,0x28, 0x82,0xe8,0x06,0x70,0x82,0xe9,0x06,0x49,0x80,0xe9,0x06,0x0a,0x00,0x00,0x00, 0x00,0x80,0xe9,0x06,0x07,0x83,0xe9,0x06,0x81,0x82,0xe9,0x06,0x5a,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x19,0x03, 0x03,0x03,0x2f,0x0b,0x0b,0x0b,0x90,0x12,0x12,0x12,0xe0,0x14,0x14,0x14,0xba, 0x13,0x13,0x13,0x65,0x0e,0x0e,0x0e,0x2d,0x04,0x04,0x04,0x15,0x00,0x00,0x00, 0x0b,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x03,0x83,0x00,0x00,0x00,0x01,0x8b,0x00,0x00,0x00,0x00,0x19,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x09,0x3b, 0x6c,0x03,0x14,0x75,0xd2,0x06,0x56,0x78,0xd5,0x06,0x7b,0x49,0x84,0x03,0x33, 0x00,0x00,0x00,0x22,0x12,0x12,0x12,0x3f,0x61,0x7d,0x3e,0xac,0x89,0xb9,0x4d, 0xf4,0x8d,0xa5,0x6a,0xfa,0x6d,0x75,0x49,0xe6,0x64,0x64,0x36,0xd7,0x5c,0x5b, 0x33,0xe9,0x4f,0x4e,0x2f,0xfa,0x41,0x40,0x27,0xff,0x31,0x31,0x25,0xfb,0x32, 0x32,0x33,0xc3,0x1e,0x26,0x14,0x48,0x67,0xb9,0x05,0x24,0x7e,0xe1,0x06,0x5c, 0x82,0xe8,0x06,0x61,0x82,0xe9,0x06,0x1a,0x82,0x00,0x00,0x00,0x00,0x18,0x81, 0xe9,0x06,0x2f,0x83,0xe9,0x06,0x8e,0x81,0xe9,0x06,0x26,0x00,0x00,0x00,0x02, 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x15,0x00,0x00,0x00, 0x1d,0x04,0x04,0x04,0x3a,0x0c,0x0c,0x0c,0x97,0x13,0x13,0x13,0xe9,0x16,0x16, 0x16,0xe4,0x15,0x15,0x15,0xa9,0x13,0x13,0x13,0x6e,0x11,0x11,0x11,0x41,0x0a, 0x0a,0x0a,0x24,0x02,0x02,0x02,0x14,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x08, 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x02,0x83,0x00,0x00,0x00,0x01,0x82,0x00,0x00,0x00,0x00, 0x82,0x00,0x00,0x00,0x01,0x1a,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x12, 0x02,0x02,0x02,0x1c,0x4a,0x7a,0x11,0x53,0x6d,0xb5,0x17,0xa2,0x61,0x98,0x1f, 0x86,0x36,0x3d,0x2d,0x6a,0x58,0x58,0x58,0xa5,0x8e,0x8e,0x8e,0xed,0x88,0x9f, 0x62,0xf4,0x79,0xab,0x27,0xe9,0x75,0xa0,0x21,0xdf,0x70,0x88,0x2a,0xd6,0x60, 0x6d,0x28,0xd2,0x4c,0x50,0x26,0xe4,0x39,0x3a,0x21,0xfd,0x37,0x3f,0x27,0xed, 0x3e,0x57,0x21,0x93,0x6a,0xbc,0x05,0x50,0x7c,0xdd,0x06,0x6f,0x81,0xe6,0x06, 0x65,0x80,0xe7,0x06,0x21,0x82,0x00,0x00,0x00,0x00,0x01,0x80,0xe9,0x06,0x0d, 0x82,0x82,0xe9,0x06,0x6a,0x14,0x82,0xe9,0x06,0x06,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x17, 0x00,0x00,0x00,0x20,0x04,0x04,0x04,0x3d,0x0c,0x0c,0x0c,0x8f,0x12,0x12,0x12, 0xdf,0x16,0x16,0x16,0xfc,0x17,0x17,0x17,0xec,0x17,0x17,0x17,0xc5,0x18,0x18, 0x18,0x9b,0x18,0x18,0x18,0x72,0x14,0x14,0x14,0x4d,0x0c,0x0c,0x0c,0x2e,0x04, 0x04,0x04,0x1b,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0a,0x82,0x00,0x00,0x00, 0x08,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x82, 0x00,0x00,0x00,0x04,0x1b,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x07,0x00,0x00, 0x00,0x09,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x15,0x0a, 0x0a,0x0a,0x29,0x35,0x35,0x36,0x4c,0x65,0x65,0x66,0x7a,0x78,0x7f,0x71,0xb2, 0x7b,0x9d,0x52,0xe4,0x6c,0x9a,0x33,0xec,0x57,0x68,0x43,0xe6,0x86,0x86,0x86, 0xf7,0x8a,0x8a,0x88,0xfc,0x69,0x68,0x49,0xdd,0x6d,0x83,0x2a,0xd3,0x70,0x9d, 0x1d,0xdb,0x6f,0xa6,0x16,0xdf,0x6a,0x9e,0x16,0xdc,0x64,0x8f,0x17,0xe1,0x54, 0x78,0x19,0xfb,0x59,0x88,0x1e,0xe1,0x69,0xb9,0x09,0x95,0x7c,0xdd,0x06,0x7a, 0x7e,0xe0,0x06,0x58,0x7d,0xe0,0x06,0x1e,0x82,0x00,0x00,0x00,0x00,0x40,0x81, 0xe9,0x06,0x01,0x82,0xe9,0x06,0x41,0x82,0xe9,0x06,0x7a,0x81,0xe9,0x06,0x2c, 0x80,0xe9,0x06,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x18,0x00,0x00, 0x00,0x22,0x02,0x02,0x02,0x39,0x0b,0x0b,0x0b,0x7d,0x12,0x12,0x12,0xd0,0x16, 0x16,0x16,0xf9,0x18,0x18,0x18,0xff,0x1a,0x1a,0x1a,0xfd,0x1b,0x1b,0x1b,0xec, 0x1a,0x1a,0x1a,0xcf,0x1c,0x1c,0x1c,0xae,0x1d,0x1d,0x1d,0x8e,0x1c,0x1c,0x1c, 0x6d,0x17,0x17,0x17,0x50,0x10,0x10,0x10,0x37,0x08,0x08,0x08,0x24,0x02,0x02, 0x02,0x16,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x12, 0x00,0x00,0x00,0x1d,0x14,0x14,0x14,0x3b,0x51,0x51,0x53,0x68,0x7d,0x7d,0x7f, 0x9c,0x82,0x82,0x81,0xc8,0x84,0x84,0x7e,0xe9,0x88,0x87,0x79,0xef,0x75,0x7e, 0x56,0xf1,0x5f,0x83,0x29,0xfc,0x5f,0x83,0x33,0xff,0x60,0x6a,0x56,0xff,0x51, 0x51,0x4a,0xf6,0x5c,0x5b,0x34,0xd0,0x5d,0x5c,0x2e,0xc3,0x59,0x63,0x26,0xc2, 0x5c,0x76,0x1c,0xcd,0x5b,0x7d,0x1c,0xe8,0x67,0x8d,0x2f,0xf7,0x66,0x95,0x28, 0xd0,0x66,0xad,0x0d,0x7f,0x71,0xc9,0x05,0x52,0x6f,0xc8,0x05,0x31,0x67,0xbd, 0x04,0x0f,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x81,0xe9,0x06,0x01,0x82, 0xe9,0x06,0x29,0x82,0xe9,0x06,0x71,0x82,0xe9,0x06,0x43,0x81,0xe9,0x06,0x07, 0x83,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x23, 0x01,0x01,0x01,0x35,0x09,0x09,0x09,0x6c,0x10,0x10,0x10,0xbe,0x16,0x16,0x16, 0xf5,0x18,0x18,0x18,0xff,0x19,0x19,0x19,0xff,0x1b,0x1b,0x1b,0xff,0x1d,0x1d, 0x1d,0xff,0x1e,0x1e,0x1e,0xf7,0x20,0x20,0x20,0xe5,0x21,0x21,0x21,0xd0,0x22, 0x22,0x22,0xbb,0x24,0x24,0x24,0xa3,0x23,0x23,0x23,0x87,0x1f,0x1f,0x1f,0x6a, 0x17,0x17,0x17,0x51,0x10,0x10,0x10,0x3d,0x09,0x09,0x09,0x30,0x05,0x05,0x05, 0x2d,0x09,0x09,0x09,0x39,0x2c,0x2c,0x2c,0x5d,0x6d,0x6d,0x6e,0x8c,0x91,0x91, 0x94,0xbc,0x8b,0x8b,0x89,0xde,0x89,0x88,0x7d,0xed,0x84,0x84,0x6d,0xe6,0x79, 0x78,0x55,0xde,0x6c,0x6b,0x40,0xda,0x5a,0x59,0x33,0xed,0x49,0x55,0x27,0xfd, 0x4f,0x77,0x1d,0xf5,0x48,0x6f,0x1a,0xf7,0x3e,0x50,0x24,0xf8,0x4f,0x52,0x2b, 0xce,0x52,0x51,0x27,0xbe,0x4a,0x49,0x23,0xc7,0x4d,0x4c,0x32,0xe2,0x55,0x54, 0x48,0xf2,0x49,0x49,0x46,0xb8,0x3c,0x3c,0x3c,0x59,0x03,0x03,0x03,0x17,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x80,0xe9,0x06,0x0f,0x82,0xe9,0x06,0x3a,0x82,0xe9,0x06,0x6c,0x82,0xe9,0x06, 0x4d,0x82,0xe9,0x06,0x0c,0x85,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x00,0x00,0x00, 0x18,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x32,0x06,0x06,0x06,0x5a,0x0f,0x0f, 0x0f,0xaa,0x16,0x16,0x16,0xf2,0x83,0x19,0x19,0x19,0xff,0x2a,0x1b,0x1b,0x1b, 0xff,0x1d,0x1d,0x1d,0xff,0x20,0x20,0x20,0xff,0x22,0x22,0x22,0xff,0x25,0x25, 0x25,0xfb,0x26,0x26,0x26,0xf0,0x28,0x28,0x28,0xe1,0x29,0x29,0x29,0xd2,0x2c, 0x2c,0x2c,0xc4,0x2f,0x2f,0x2f,0xb7,0x37,0x37,0x37,0xb2,0x5c,0x5c,0x5c,0xbf, 0x91,0x91,0x92,0xd8,0x9a,0x9a,0x99,0xf1,0x89,0x89,0x7b,0xed,0x7f,0x7e,0x60, 0xde,0x73,0x72,0x48,0xd4,0x70,0x6f,0x3b,0xce,0x6f,0x6e,0x39,0xcf,0x64,0x63, 0x38,0xe4,0x50,0x4f,0x30,0xfb,0x3d,0x3e,0x2d,0xf5,0x35,0x45,0x20,0xb2,0x42, 0x70,0x0b,0xc7,0x4e,0x7c,0x14,0xf8,0x5a,0x7d,0x1d,0xe2,0x51,0x5f,0x22,0xda, 0x55,0x56,0x42,0xec,0x56,0x56,0x50,0xec,0x44,0x43,0x43,0x98,0x29,0x29,0x2a, 0x3f,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x02,0x79,0xdc,0x06,0x0a,0x82,0xe9,0x06,0x2d,0x82,0xe9,0x06,0x5d,0x82, 0xe9,0x06,0x73,0x82,0xe9,0x06,0x45,0x82,0xe9,0x06,0x0f,0x80,0xe9,0x06,0x01, 0x86,0x00,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x21, 0x00,0x00,0x00,0x2e,0x04,0x04,0x04,0x4c,0x0c,0x0c,0x0c,0x90,0x14,0x14,0x14, 0xdd,0x19,0x19,0x19,0xfd,0x82,0x1a,0x1a,0x1a,0xff,0x27,0x1b,0x1b,0x1b,0xff, 0x1c,0x1c,0x1c,0xff,0x1d,0x1d,0x1d,0xff,0x1f,0x1f,0x1f,0xff,0x22,0x22,0x22, 0xff,0x27,0x27,0x27,0xff,0x2a,0x2a,0x2a,0xff,0x2f,0x2f,0x2f,0xff,0x41,0x41, 0x41,0xfd,0x55,0x55,0x55,0xfc,0x62,0x62,0x63,0xfe,0x73,0x73,0x6e,0xf7,0x74, 0x73,0x59,0xdd,0x69,0x68,0x3c,0xcc,0x6b,0x6a,0x36,0xc7,0x6f,0x6e,0x38,0xc8, 0x6c,0x6b,0x38,0xc8,0x60,0x5f,0x32,0xd1,0x4c,0x4b,0x2a,0xf1,0x3e,0x3d,0x29, 0xff,0x31,0x31,0x29,0xd0,0x17,0x17,0x17,0x69,0x1b,0x2c,0x06,0x79,0x38,0x58, 0x12,0xe0,0x59,0x88,0x1b,0xfa,0x67,0x9a,0x21,0xf8,0x66,0x92,0x2c,0xe3,0x60, 0x8a,0x2d,0xa2,0x45,0x77,0x0b,0x4d,0x36,0x61,0x02,0x1f,0x1e,0x37,0x01,0x10, 0x63,0xb4,0x05,0x1a,0x7a,0xdd,0x06,0x31,0x81,0xe6,0x06,0x4e,0x83,0xe9,0x06, 0x6d,0x83,0xe9,0x06,0x7c,0x82,0xe9,0x06,0x67,0x81,0xe9,0x06,0x34,0x81,0xe9, 0x06,0x0a,0x89,0x00,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x12,0x00,0x00, 0x00,0x1d,0x00,0x00,0x00,0x2a,0x02,0x02,0x02,0x3e,0x08,0x08,0x08,0x68,0x0f, 0x0f,0x0f,0xb5,0x17,0x17,0x17,0xf9,0x82,0x1a,0x1a,0x1a,0xff,0x01,0x1b,0x1b, 0x1b,0xff,0x82,0x1c,0x1c,0x1c,0xff,0x09,0x1e,0x1e,0x1e,0xff,0x21,0x21,0x21, 0xff,0x25,0x25,0x25,0xff,0x38,0x38,0x38,0xff,0x62,0x62,0x62,0xff,0x60,0x60, 0x60,0xff,0x46,0x46,0x47,0xfe,0x4f,0x4e,0x35,0xda,0x5e,0x5d,0x2e,0xc3,0x82, 0x63,0x62,0x31,0xc2,0x17,0x5d,0x5c,0x2e,0xc2,0x58,0x57,0x2c,0xc2,0x4f,0x4e, 0x28,0xd2,0x40,0x3f,0x25,0xf8,0x37,0x37,0x29,0xf0,0x29,0x29,0x27,0x91,0x06, 0x06,0x06,0x3b,0x02,0x02,0x02,0x3a,0x15,0x1d,0x0c,0x81,0x2b,0x3b,0x18,0xb4, 0x4c,0x78,0x15,0x98,0x6b,0xb9,0x0c,0x8b,0x75,0xd1,0x06,0x93,0x7d,0xdd,0x06, 0x99,0x80,0xe1,0x06,0x9d,0x83,0xe4,0x06,0x9b,0x83,0xe6,0x06,0x96,0x82,0xe8, 0x06,0x8e,0x82,0xe9,0x06,0x7d,0x82,0xe9,0x06,0x5f,0x82,0xe9,0x06,0x36,0x81, 0xe9,0x06,0x16,0x80,0xe9,0x06,0x05,0x8c,0x00,0x00,0x00,0x00,0x0b,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x18,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x31,0x04,0x04,0x04,0x47, 0x0b,0x0b,0x0b,0x82,0x13,0x13,0x13,0xd0,0x19,0x19,0x19,0xfe,0x82,0x1b,0x1b, 0x1b,0xff,0x82,0x1c,0x1c,0x1c,0xff,0x1f,0x1d,0x1d,0x1d,0xff,0x1e,0x1e,0x1e, 0xff,0x2b,0x2b,0x2b,0xff,0x40,0x40,0x40,0xff,0x3a,0x3a,0x3b,0xff,0x3c,0x3c, 0x36,0xf7,0x51,0x50,0x2c,0xc9,0x59,0x58,0x2b,0xbf,0x57,0x56,0x2b,0xbe,0x56, 0x55,0x2a,0xbe,0x55,0x54,0x28,0xbe,0x54,0x53,0x28,0xbd,0x4a,0x49,0x23,0xd2, 0x3c,0x3b,0x26,0xfb,0x33,0x33,0x2d,0xc2,0x15,0x15,0x16,0x49,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x21,0x03,0x03,0x03,0x27,0x0d,0x0d,0x0d,0x2e,0x1c,0x2e, 0x07,0x27,0x3e,0x70,0x03,0x25,0x59,0x9e,0x04,0x27,0x6e,0xc3,0x05,0x27,0x7d, 0xda,0x06,0x27,0x83,0xe4,0x06,0x27,0x85,0xe8,0x06,0x23,0x83,0xe8,0x06,0x1f, 0x83,0xe9,0x06,0x18,0x81,0xe9,0x06,0x0e,0x80,0xe9,0x06,0x04,0x8f,0x00,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1c,0x00,0x00,0x00, 0x28,0x01,0x01,0x01,0x36,0x06,0x06,0x06,0x4f,0x0b,0x0b,0x0b,0x8b,0x12,0x12, 0x12,0xd0,0x19,0x19,0x19,0xfa,0x1b,0x1b,0x1b,0xff,0x1c,0x1c,0x1c,0xff,0x83, 0x1d,0x1d,0x1d,0xff,0x0e,0x1e,0x1e,0x1e,0xff,0x28,0x28,0x29,0xff,0x3e,0x3e, 0x33,0xed,0x52,0x51,0x29,0xc3,0x54,0x53,0x28,0xbc,0x56,0x56,0x29,0xba,0x52, 0x51,0x26,0xba,0x4e,0x4d,0x21,0xc1,0x4e,0x4d,0x26,0xce,0x52,0x51,0x37,0xe8, 0x44,0x44,0x3b,0xe4,0x26,0x26,0x26,0x74,0x04,0x04,0x04,0x19,0x00,0x00,0x00, 0x13,0x82,0x00,0x00,0x00,0x11,0x06,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0e, 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x01,0x97,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x15,0x00,0x00,0x00, 0x20,0x00,0x00,0x00,0x2a,0x01,0x01,0x01,0x34,0x04,0x04,0x04,0x48,0x08,0x08, 0x08,0x7c,0x10,0x10,0x10,0xc1,0x17,0x17,0x17,0xf1,0x1b,0x1b,0x1b,0xff,0x1c, 0x1c,0x1c,0xff,0x1d,0x1d,0x1d,0xff,0x1c,0x1c,0x1c,0xff,0x27,0x27,0x29,0xff, 0x41,0x40,0x32,0xea,0x4f,0x4e,0x24,0xc1,0x4b,0x4a,0x21,0xc6,0x4c,0x4b,0x26, 0xd4,0x5b,0x5a,0x3f,0xe9,0x70,0x6f,0x5d,0xfb,0x79,0x78,0x70,0xfb,0x68,0x68, 0x65,0xe3,0x37,0x37,0x37,0x81,0x07,0x07,0x08,0x22,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x09,0x82,0x00,0x00,0x00,0x07,0x04,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x9a,0x00,0x00,0x00,0x00, 0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x1f,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x3a,0x05,0x05,0x05,0x63, 0x0c,0x0c,0x0c,0xa3,0x13,0x13,0x13,0xd6,0x18,0x18,0x18,0xf1,0x19,0x19,0x19, 0xf8,0x21,0x21,0x22,0xfb,0x3e,0x3e,0x39,0xfc,0x53,0x52,0x40,0xf9,0x69,0x68, 0x5b,0xf8,0x74,0x74,0x6f,0xf4,0x6e,0x6e,0x6e,0xe2,0x4a,0x4a,0x4c,0xb3,0x1e, 0x1e,0x1f,0x73,0x01,0x01,0x02,0x35,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0d, 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x84,0x00,0x00,0x00,0x01,0x9e,0x00, 0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 0x05,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x15,0x00,0x00, 0x00,0x1c,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x30,0x01, 0x01,0x01,0x42,0x04,0x04,0x04,0x60,0x09,0x09,0x09,0x86,0x0d,0x0d,0x0d,0xa7, 0x1a,0x1a,0x1a,0xb8,0x2f,0x2f,0x31,0xab,0x2c,0x2c,0x2e,0x86,0x11,0x11,0x12, 0x59,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x14,0x00,0x00, 0x00,0x12,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,0xa4,0x00,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x22, 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x26,0x00,0x00,0x00, 0x25,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x17,0x00,0x00, 0x00,0x16,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0xa7,0x00,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x13,0x83,0x00,0x00,0x00,0x16,0x08,0x00,0x00,0x00,0x14,0x00, 0x00,0x00,0x12,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x08, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0xac,0x00,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x84,0x00,0x00,0x00,0x08,0x03,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x82,0x00,0x00,0x00, 0x01,0xb0,0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x01,0xb8,0x00,0x00,0x00, 0x00,0x07,0x0c,0x0b,0x0c,0x02,0x0b,0x0b,0x0b,0x11,0x0e,0x0e,0x0e,0x39,0x16, 0x16,0x16,0x57,0x14,0x14,0x14,0x3a,0x10,0x0f,0x0f,0x13,0x11,0x11,0x11,0x03, 0xb3,0x00,0x00,0x00,0x00,0x0b,0x08,0x07,0x08,0x03,0x07,0x07,0x07,0x14,0x0e, 0x0d,0x0e,0x41,0x13,0x12,0x13,0x82,0x14,0x14,0x14,0xbf,0x17,0x17,0x17,0xe3, 0x18,0x18,0x18,0xc1,0x16,0x16,0x16,0x84,0x13,0x13,0x13,0x45,0x14,0x14,0x14, 0x17,0x13,0x13,0x13,0x04,0xaf,0x00,0x00,0x00,0x00,0x0f,0x08,0x08,0x08,0x06, 0x0d,0x0d,0x0d,0x26,0x0f,0x10,0x0f,0x57,0x13,0x13,0x13,0x93,0x15,0x15,0x15, 0xc6,0x17,0x16,0x17,0xf0,0x18,0x18,0x18,0xfe,0x18,0x18,0x18,0xff,0x19,0x19, 0x19,0xfe,0x19,0x19,0x19,0xf0,0x19,0x19,0x19,0xc9,0x19,0x19,0x19,0x96,0x16, 0x16,0x16,0x5a,0x12,0x12,0x12,0x27,0x0f,0x0f,0x0f,0x07,0xab,0x00,0x00,0x00, 0x00,0x07,0x07,0x07,0x06,0x08,0x0d,0x0d,0x0d,0x32,0x11,0x11,0x11,0x71,0x14, 0x14,0x14,0xad,0x16,0x16,0x16,0xd8,0x17,0x17,0x17,0xf5,0x17,0x17,0x17,0xfe, 0x83,0x18,0x18,0x18,0xff,0x01,0x19,0x19,0x19,0xff,0x82,0x1a,0x1a,0x1a,0xff, 0x06,0x1b,0x1b,0x1b,0xf6,0x1a,0x1a,0x1a,0xd9,0x19,0x19,0x19,0xae,0x17,0x17, 0x17,0x72,0x16,0x16,0x16,0x34,0x13,0x13,0x13,0x0a,0xa8,0x00,0x00,0x00,0x00, 0x05,0x02,0x02,0x02,0x08,0x0f,0x0f,0x10,0x4d,0x14,0x14,0x15,0xb6,0x16,0x16, 0x17,0xe6,0x17,0x17,0x17,0xf9,0x83,0x17,0x17,0x17,0xff,0x83,0x18,0x18,0x18, 0xff,0x01,0x19,0x19,0x19,0xff,0x83,0x1a,0x1a,0x1a,0xff,0x06,0x1b,0x1b,0x1b, 0xff,0x1c,0x1c,0x1c,0xf9,0x21,0x21,0x21,0xe6,0x27,0x27,0x27,0xbe,0x21,0x21, 0x22,0x54,0x0c,0x0c,0x0b,0x0b,0xa6,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00, 0x01,0x0e,0x0e,0x0e,0x36,0x18,0x18,0x18,0xb8,0x1e,0x1e,0x1f,0xf8,0x1b,0x1b, 0x1c,0xff,0x18,0x18,0x19,0xff,0x83,0x17,0x17,0x17,0xff,0x83,0x18,0x18,0x18, 0xff,0x82,0x19,0x19,0x19,0xff,0x09,0x1a,0x1a,0x1a,0xff,0x1b,0x1b,0x1b,0xff, 0x20,0x20,0x20,0xff,0x28,0x28,0x28,0xff,0x31,0x31,0x31,0xff,0x37,0x37,0x38, 0xfb,0x2f,0x2f,0x2f,0xc2,0x20,0x21,0x20,0x3b,0x05,0x07,0x04,0x03,0xa5,0x00, 0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x20,0x15,0x15,0x15,0x99,0x20,0x20,0x20, 0xf6,0x21,0x21,0x21,0xff,0x20,0x20,0x20,0xff,0x1d,0x1d,0x1d,0xff,0x1a,0x1a, 0x1a,0xff,0x19,0x19,0x19,0xff,0x83,0x18,0x18,0x18,0xff,0x0d,0x17,0x17,0x17, 0xff,0x18,0x18,0x18,0xff,0x1c,0x1c,0x1c,0xff,0x21,0x21,0x21,0xff,0x29,0x29, 0x29,0xff,0x31,0x31,0x31,0xff,0x36,0x36,0x36,0xff,0x39,0x39,0x39,0xff,0x3a, 0x3a,0x3a,0xff,0x38,0x38,0x38,0xf8,0x28,0x28,0x28,0xa2,0x1b,0x1a,0x1a,0x20, 0x0b,0x0b,0x0a,0x00,0xa3,0x00,0x00,0x00,0x00,0x11,0x03,0x03,0x03,0x11,0x11, 0x11,0x11,0x77,0x1e,0x1e,0x1e,0xf0,0x22,0x23,0x22,0xff,0x21,0x21,0x21,0xff, 0x20,0x20,0x20,0xff,0x1e,0x1e,0x1e,0xff,0x1d,0x1d,0x1d,0xff,0x1c,0x1c,0x1c, 0xff,0x1b,0x1b,0x1b,0xff,0x19,0x19,0x19,0xff,0x18,0x18,0x18,0xff,0x1c,0x1c, 0x1c,0xff,0x23,0x23,0x23,0xff,0x28,0x28,0x28,0xff,0x32,0x32,0x32,0xff,0x37, 0x37,0x37,0xff,0x85,0x38,0x38,0x38,0xff,0x03,0x34,0x34,0x34,0xf6,0x23,0x22, 0x22,0x80,0x15,0x14,0x14,0x11,0xa2,0x00,0x00,0x00,0x00,0x13,0x01,0x01,0x01, 0x07,0x0d,0x0d,0x0d,0x50,0x19,0x19,0x19,0xe1,0x23,0x23,0x23,0xff,0x22,0x22, 0x22,0xff,0x21,0x21,0x21,0xff,0x1f,0x1f,0x1f,0xff,0x1e,0x1e,0x1e,0xff,0x1d, 0x1d,0x1d,0xff,0x1c,0x1c,0x1c,0xff,0x1b,0x1b,0x1b,0xff,0x1a,0x1a,0x1a,0xff, 0x16,0x16,0x16,0xff,0x3f,0x3f,0x3f,0xff,0x39,0x39,0x39,0xff,0x26,0x26,0x26, 0xff,0x2d,0x2d,0x2d,0xff,0x32,0x32,0x32,0xff,0x35,0x35,0x35,0xff,0x83,0x37, 0x37,0x37,0xff,0x05,0x36,0x36,0x36,0xff,0x36,0x37,0x36,0xff,0x2d,0x2d,0x2d, 0xed,0x1b,0x1b,0x1b,0x58,0x0d,0x0c,0x0c,0x07,0xa0,0x00,0x00,0x00,0x00,0x0a, 0x04,0x04,0x04,0x03,0x0c,0x0c,0x0c,0x34,0x16,0x16,0x16,0xce,0x23,0x23,0x23, 0xff,0x22,0x22,0x22,0xff,0x23,0x23,0x23,0xff,0x22,0x22,0x22,0xff,0x1f,0x1f, 0x1f,0xff,0x1e,0x1e,0x1e,0xff,0x1d,0x1d,0x1d,0xff,0x82,0x1b,0x1b,0x1b,0xff, 0x05,0x19,0x19,0x19,0xff,0x17,0x17,0x17,0xff,0x48,0x48,0x48,0xff,0x3d,0x3d, 0x3d,0xff,0x24,0x24,0x24,0xff,0x82,0x27,0x27,0x27,0xff,0x01,0x2d,0x2d,0x2d, 0xff,0x82,0x35,0x35,0x35,0xff,0x07,0x34,0x34,0x34,0xff,0x33,0x34,0x33,0xff, 0x33,0x33,0x33,0xff,0x33,0x34,0x34,0xff,0x26,0x26,0x27,0xdc,0x18,0x18,0x18, 0x3b,0x0e,0x0f,0x0e,0x03,0x9e,0x00,0x00,0x00,0x00,0x05,0x03,0x03,0x03,0x01, 0x09,0x09,0x09,0x1e,0x12,0x12,0x12,0xae,0x21,0x21,0x21,0xff,0x24,0x24,0x24, 0xff,0x82,0x23,0x23,0x23,0xff,0x04,0x21,0x21,0x21,0xff,0x1f,0x1f,0x1f,0xff, 0x1e,0x1e,0x1e,0xff,0x1d,0x1d,0x1d,0xff,0x82,0x1b,0x1b,0x1b,0xff,0x05,0x19, 0x19,0x19,0xff,0x17,0x17,0x17,0xff,0x47,0x47,0x47,0xff,0x3d,0x3d,0x3d,0xff, 0x24,0x24,0x24,0xff,0x82,0x27,0x27,0x27,0xff,0x05,0x29,0x29,0x29,0xff,0x31, 0x30,0x30,0xff,0x34,0x34,0x34,0xff,0x33,0x33,0x33,0xff,0x32,0x33,0x32,0xff, 0x82,0x31,0x31,0x31,0xff,0x03,0x30,0x30,0x31,0xff,0x20,0x21,0x20,0xba,0x14, 0x14,0x14,0x1d,0x9e,0x00,0x00,0x00,0x00,0x12,0x06,0x06,0x06,0x12,0x0f,0x0f, 0x0f,0x8c,0x1f,0x1f,0x1f,0xfe,0x24,0x24,0x24,0xff,0x23,0x23,0x23,0xff,0x24, 0x24,0x24,0xff,0x23,0x23,0x23,0xff,0x21,0x21,0x21,0xff,0x20,0x20,0x20,0xff, 0x1f,0x1e,0x1e,0xff,0x1d,0x1d,0x1d,0xff,0x1b,0x1c,0x1b,0xff,0x1b,0x1a,0x1b, 0xff,0x19,0x19,0x19,0xff,0x17,0x17,0x17,0xff,0x48,0x48,0x48,0xff,0x3f,0x3f, 0x3f,0xff,0x24,0x24,0x24,0xff,0x83,0x27,0x27,0x27,0xff,0x05,0x2c,0x2c,0x2c, 0xff,0x33,0x32,0x33,0xff,0x32,0x32,0x32,0xff,0x31,0x31,0x31,0xff,0x30,0x30, 0x30,0xff,0x82,0x2f,0x2f,0x2f,0xff,0x03,0x2d,0x2d,0x2d,0xff,0x1a,0x19,0x1a, 0x98,0x08,0x08,0x08,0x0e,0x9c,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x07, 0x0e,0x0d,0x0d,0x69,0x1c,0x1c,0x1c,0xf2,0x25,0x25,0x25,0xff,0x24,0x24,0x24, 0xff,0x82,0x25,0x25,0x25,0xff,0x15,0x23,0x23,0x23,0xff,0x21,0x21,0x21,0xff, 0x20,0x20,0x20,0xff,0x1f,0x1f,0x1f,0xff,0x1d,0x1d,0x1d,0xff,0x1b,0x1c,0x1b, 0xff,0x1a,0x1a,0x1a,0xff,0x19,0x19,0x19,0xff,0x17,0x17,0x17,0xff,0x4b,0x4a, 0x4a,0xff,0x41,0x41,0x41,0xff,0x24,0x23,0x24,0xff,0x27,0x27,0x27,0xff,0x26, 0x26,0x26,0xff,0x25,0x25,0x25,0xff,0x29,0x29,0x29,0xff,0x31,0x31,0x32,0xff, 0x38,0x38,0x38,0xff,0x3c,0x3c,0x3c,0xff,0x36,0x36,0x36,0xff,0x2f,0x2f,0x2f, 0xff,0x82,0x2e,0x2e,0x2e,0xff,0x03,0x28,0x28,0x28,0xf9,0x12,0x13,0x12,0x6e, 0x0c,0x0b,0x0f,0x0b,0x9b,0x00,0x00,0x00,0x00,0x04,0x0c,0x0c,0x0c,0x43,0x1b, 0x1a,0x1a,0xe2,0x25,0x26,0x26,0xff,0x24,0x24,0x24,0xff,0x83,0x25,0x25,0x25, 0xff,0x15,0x23,0x23,0x23,0xff,0x22,0x22,0x22,0xff,0x20,0x20,0x20,0xff,0x1f, 0x1f,0x1f,0xff,0x1d,0x1d,0x1d,0xff,0x1c,0x1c,0x1c,0xff,0x1b,0x1b,0x1b,0xff, 0x19,0x19,0x19,0xff,0x17,0x17,0x17,0xff,0x4c,0x4c,0x4c,0xff,0x44,0x44,0x44, 0xff,0x23,0x22,0x23,0xff,0x26,0x26,0x26,0xff,0x26,0x26,0x25,0xff,0x27,0x27, 0x27,0xff,0x2e,0x2f,0x2e,0xff,0x3c,0x42,0x38,0xff,0x41,0x4b,0x3c,0xff,0x3c, 0x42,0x39,0xff,0x3b,0x3c,0x3b,0xff,0x32,0x32,0x32,0xff,0x82,0x2c,0x2c,0x2c, 0xff,0x03,0x2d,0x2d,0x2d,0xff,0x23,0x23,0x22,0xe3,0x1b,0x1a,0x1e,0x51,0x9b, 0x00,0x00,0x00,0x00,0x01,0x12,0x12,0x12,0xaf,0x82,0x26,0x26,0x26,0xff,0x01, 0x25,0x26,0x26,0xff,0x83,0x25,0x25,0x25,0xff,0x1a,0x23,0x23,0x23,0xff,0x22, 0x22,0x22,0xff,0x21,0x21,0x21,0xff,0x1f,0x1f,0x1f,0xff,0x1e,0x1e,0x1e,0xff, 0x1c,0x1c,0x1c,0xff,0x1b,0x1b,0x1b,0xff,0x1a,0x1a,0x1a,0xff,0x16,0x16,0x16, 0xff,0x4e,0x4e,0x4e,0xff,0x47,0x47,0x47,0xff,0x22,0x22,0x22,0xff,0x26,0x25, 0x25,0xff,0x27,0x27,0x27,0xff,0x30,0x31,0x30,0xff,0x36,0x3e,0x32,0xff,0x44, 0x60,0x28,0xff,0x50,0x7b,0x1c,0xff,0x36,0x50,0x1d,0xff,0x31,0x37,0x2f,0xff, 0x38,0x38,0x38,0xff,0x2e,0x2e,0x2e,0xff,0x2b,0x2b,0x2b,0xff,0x2e,0x2e,0x2e, 0xff,0x33,0x34,0x33,0xfc,0x27,0x26,0x29,0xb1,0x9b,0x00,0x00,0x00,0x00,0x04, 0x10,0x10,0x10,0xa6,0x1b,0x1b,0x1b,0xff,0x21,0x20,0x21,0xff,0x26,0x26,0x26, 0xff,0x82,0x27,0x27,0x27,0xff,0x06,0x25,0x25,0x25,0xff,0x24,0x24,0x24,0xff, 0x22,0x22,0x22,0xff,0x21,0x21,0x21,0xff,0x1f,0x1f,0x1f,0xff,0x1d,0x1d,0x1d, 0xff,0x82,0x1c,0x1c,0x1c,0xff,0x13,0x1a,0x1a,0x1a,0xff,0x17,0x17,0x17,0xff, 0x50,0x50,0x50,0xff,0x4a,0x4a,0x4a,0xff,0x22,0x22,0x22,0xff,0x25,0x25,0x25, 0xff,0x28,0x28,0x28,0xff,0x31,0x33,0x32,0xff,0x34,0x4a,0x26,0xff,0x58,0x95, 0x12,0xff,0x7d,0xcd,0x0b,0xff,0x51,0x81,0x14,0xff,0x29,0x34,0x22,0xff,0x36, 0x37,0x36,0xff,0x38,0x38,0x38,0xff,0x32,0x32,0x32,0xff,0x34,0x34,0x34,0xff, 0x31,0x31,0x31,0xfb,0x22,0x22,0x23,0xa7,0x9b,0x00,0x00,0x00,0x00,0x05,0x06, 0x06,0x06,0x42,0x0b,0x0b,0x0b,0xd8,0x11,0x11,0x11,0xfb,0x19,0x19,0x19,0xff, 0x20,0x20,0x20,0xff,0x82,0x25,0x25,0x25,0xff,0x1a,0x24,0x24,0x24,0xff,0x22, 0x22,0x22,0xff,0x21,0x21,0x21,0xff,0x1f,0x1f,0x1f,0xff,0x1e,0x1e,0x1e,0xff, 0x1d,0x1d,0x1d,0xff,0x1c,0x1c,0x1c,0xff,0x1a,0x1a,0x1a,0xff,0x16,0x17,0x17, 0xff,0x51,0x51,0x51,0xff,0x4d,0x4d,0x4d,0xff,0x22,0x22,0x22,0xff,0x25,0x25, 0x25,0xff,0x27,0x27,0x28,0xff,0x32,0x34,0x32,0xff,0x37,0x4e,0x26,0xff,0x53, 0x91,0x12,0xff,0x6b,0xb6,0x0f,0xff,0x4d,0x7a,0x19,0xff,0x2f,0x39,0x28,0xff, 0x37,0x38,0x38,0xff,0x3b,0x3b,0x3a,0xff,0x2f,0x2f,0x2f,0xff,0x25,0x25,0x25, 0xfb,0x1a,0x1a,0x1a,0xd0,0x0e,0x0e,0x10,0x4f,0x9b,0x00,0x00,0x00,0x00,0x0b, 0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x50,0x09,0x09,0x09,0x9b,0x0b,0x0b,0x0b, 0xd8,0x10,0x10,0x10,0xfa,0x16,0x16,0x16,0xff,0x1c,0x1c,0x1c,0xff,0x20,0x20, 0x20,0xff,0x22,0x22,0x22,0xff,0x20,0x21,0x20,0xff,0x1e,0x1e,0x1e,0xff,0x83, 0x1d,0x1d,0x1d,0xff,0x13,0x1b,0x1b,0x1b,0xff,0x16,0x16,0x16,0xff,0x51,0x51, 0x51,0xff,0x4e,0x4e,0x4e,0xff,0x22,0x22,0x22,0xff,0x24,0x24,0x24,0xff,0x26, 0x26,0x26,0xff,0x31,0x32,0x31,0xff,0x2f,0x38,0x2a,0xff,0x33,0x4c,0x20,0xff, 0x41,0x61,0x26,0xff,0x3b,0x4f,0x2d,0xff,0x33,0x37,0x30,0xff,0x2e,0x2e,0x2e, 0xff,0x24,0x24,0x24,0xfa,0x1a,0x1a,0x1a,0xd6,0x13,0x13,0x13,0x99,0x0f,0x0f, 0x0e,0x49,0x08,0x08,0x09,0x0c,0x9c,0x00,0x00,0x00,0x00,0x0b,0x06,0x06,0x06, 0x02,0x07,0x07,0x07,0x20,0x08,0x08,0x08,0x4e,0x09,0x09,0x09,0x93,0x0b,0x0b, 0x0b,0xd0,0x0f,0x0f,0x0f,0xf9,0x13,0x13,0x13,0xff,0x18,0x18,0x18,0xff,0x1c, 0x1d,0x1c,0xff,0x1e,0x1e,0x1e,0xff,0x1d,0x1d,0x1d,0xff,0x82,0x1c,0x1c,0x1c, 0xff,0x11,0x1b,0x1b,0x1b,0xff,0x16,0x16,0x16,0xff,0x52,0x52,0x52,0xff,0x4e, 0x4e,0x4f,0xff,0x21,0x20,0x21,0xff,0x23,0x23,0x23,0xff,0x25,0x25,0x25,0xff, 0x31,0x31,0x31,0xff,0x33,0x34,0x33,0xff,0x30,0x33,0x2f,0xff,0x2f,0x34,0x2f, 0xff,0x29,0x2d,0x29,0xff,0x21,0x21,0x21,0xf9,0x18,0x18,0x19,0xce,0x13,0x13, 0x13,0x90,0x0f,0x0f,0x0f,0x4b,0x09,0x09,0x09,0x1e,0x9f,0x00,0x00,0x00,0x00, 0x1d,0x03,0x03,0x03,0x00,0x07,0x07,0x07,0x04,0x07,0x07,0x07,0x1b,0x08,0x08, 0x08,0x41,0x09,0x09,0x09,0x80,0x0b,0x0b,0x0b,0xc7,0x0d,0x0d,0x0d,0xf5,0x11, 0x11,0x11,0xff,0x15,0x15,0x15,0xff,0x19,0x19,0x19,0xff,0x1c,0x1c,0x1c,0xff, 0x1d,0x1d,0x1d,0xff,0x1a,0x1a,0x1a,0xff,0x14,0x14,0x14,0xff,0x53,0x53,0x54, 0xff,0x51,0x51,0x52,0xff,0x21,0x20,0x21,0xff,0x28,0x28,0x28,0xff,0x2d,0x2d, 0x2d,0xff,0x31,0x31,0x31,0xff,0x2e,0x2e,0x2d,0xff,0x26,0x26,0x26,0xff,0x1e, 0x1e,0x1e,0xf5,0x17,0x17,0x17,0xc5,0x13,0x13,0x14,0x7e,0x0f,0x0f,0x0f,0x3f, 0x0a,0x0a,0x0a,0x1a,0x08,0x08,0x08,0x03,0x03,0x03,0x03,0x00,0xa2,0x00,0x00, 0x00,0x00,0x18,0x03,0x03,0x03,0x03,0x06,0x06,0x06,0x13,0x09,0x09,0x09,0x32, 0x09,0x0a,0x0a,0x6d,0x0a,0x0b,0x0b,0xb5,0x0c,0x0c,0x0c,0xe8,0x0f,0x0f,0x0f, 0xfc,0x13,0x14,0x14,0xff,0x16,0x17,0x17,0xff,0x1b,0x1b,0x1a,0xff,0x16,0x16, 0x16,0xff,0x4f,0x4f,0x50,0xff,0x55,0x55,0x56,0xff,0x2b,0x2b,0x2b,0xff,0x2d, 0x2d,0x2c,0xff,0x28,0x28,0x27,0xff,0x21,0x21,0x21,0xfc,0x1b,0x1b,0x1b,0xe6, 0x15,0x15,0x15,0xb2,0x12,0x11,0x12,0x6a,0x0f,0x0e,0x0f,0x31,0x0d,0x0c,0x0d, 0x12,0x0e,0x0e,0x0e,0x03,0x07,0x07,0x07,0x00,0xa6,0x00,0x00,0x00,0x00,0x13, 0x07,0x07,0x06,0x02,0x07,0x08,0x08,0x0c,0x08,0x09,0x09,0x20,0x09,0x08,0x09, 0x50,0x09,0x09,0x09,0x95,0x0c,0x0c,0x0c,0xd8,0x0e,0x0e,0x0e,0xfa,0x10,0x10, 0x10,0xff,0x14,0x14,0x14,0xff,0x2e,0x2e,0x2e,0xff,0x35,0x35,0x35,0xff,0x25, 0x25,0x25,0xff,0x1e,0x1d,0x1d,0xf9,0x17,0x17,0x17,0xd6,0x13,0x13,0x13,0x94, 0x12,0x12,0x12,0x4e,0x0e,0x0e,0x0e,0x20,0x0b,0x0b,0x0b,0x0c,0x05,0x05,0x05, 0x02,0xab,0x00,0x00,0x00,0x00,0x0f,0x02,0x02,0x03,0x00,0x07,0x06,0x07,0x06, 0x08,0x08,0x08,0x10,0x0a,0x0a,0x0a,0x2f,0x07,0x07,0x07,0x69,0x0a,0x0a,0x0a, 0xb8,0x0e,0x0e,0x0e,0xe9,0x16,0x16,0x16,0xec,0x1b,0x1b,0x1b,0xe7,0x15,0x15, 0x15,0xb5,0x0d,0x0d,0x0d,0x68,0x0f,0x0e,0x0e,0x2f,0x0f,0x0f,0x0e,0x10,0x0f, 0x0f,0x0e,0x06,0x01,0x01,0x01,0x01,0xb0,0x00,0x00,0x00,0x00,0x09,0x08,0x08, 0x08,0x02,0x05,0x05,0x05,0x05,0x0a,0x0a,0x0a,0x0b,0x0e,0x0e,0x0e,0x0e,0x13, 0x13,0x13,0x0f,0x17,0x17,0x17,0x0e,0x12,0x12,0x12,0x0b,0x07,0x08,0x08,0x05, 0x0a,0x09,0x09,0x02,0x99,0x00,0x00,0x00,0x00 }; static const GdkPixdata svp_3dvp_pixdata = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 7569, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 240, /* rowstride */ 60, /* width */ 60, /* height */ svp_3dvp_pixdata_pixel_data /* pixel_data */ }; nvidia-settings/src/nvidia-settings.c0000664000175000017500000001057412236467170020114 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "NvCtrlAttributes.h" #include "command-line.h" #include "config-file.h" #include "query-assign.h" #include "msg.h" #include "ctkui.h" #include extern int __list_targets; int main(int argc, char **argv) { ConfigProperties conf; ParsedAttribute *p; CtrlHandles *h; CtrlHandlesArray handles_array; Options *op; int ret; char *dpy = NULL; int gui = 0; handles_array.n = 0; handles_array.array = NULL; /* * initialize the ui * * XXX it would be nice if we didn't do this up front, since we * may not even use the gui, but we want the toolkit to have a * chance to parse the commandline before we do... * * gui flag used to decide if ctk should be used or not, as * the user might just use control the display from a remote console * but for some reason cannot initialize the gtk gui. - TY 2005-05-27 */ if (ctk_init_check(&argc, &argv)) { dpy = ctk_get_display(); gui = 1; } /* parse the commandline */ op = parse_command_line(argc, argv, dpy, &handles_array); /* quit here if we don't have a ctrl_display - TY 2005-05-27 */ if (op->ctrl_display == NULL) { nv_error_msg("The control display is undefined; please run " "`%s --help` for usage information.\n", argv[0]); return 1; } /* Allocate handle for ctrl_display */ nv_alloc_ctrl_handles_and_add_to_array(op->ctrl_display, &handles_array); /* process any query or assignment commandline options */ if (op->num_assignments || op->num_queries) { ret = nv_process_assignments_and_queries(op, &handles_array); nv_free_ctrl_handles_array(&handles_array); return ret ? 0 : 1; } /* initialize the parsed attribute list */ p = nv_parsed_attribute_init(); /* initialize the ConfigProperties */ init_config_properties(&conf); /* * Rewrite the X server settings to configuration file * and exit, without starting a Graphical User Interface. */ if (op->rewrite) { nv_parsed_attribute_clean(p); h = nv_get_ctrl_handles(op->ctrl_display, &handles_array); if(!h || !h->dpy) return 1; ret = nv_write_config_file(op->config, h, p, &conf); nv_free_ctrl_handles_array(&handles_array); nv_parsed_attribute_free(p); free(op); op = NULL; return ret ? 0 : 1; } /* upload the data from the config file */ if (!op->no_load) { ret = nv_read_config_file(op->config, op->ctrl_display, p, &conf, &handles_array); } else { ret = 1; } /* * if the user requested that we only load the config file, or that * we only list the resolved targets, then exit now. */ if (op->only_load || __list_targets) { return ret ? 0 : 1; } /* * past this point, we need to be able to create a gui; fail if * the gui isn't available; TY 2005-05-27 */ if (gui == 0) { nv_error_msg("Unable to create nvidia-settings GUI; please run " "`%s --help` for usage information.\n", argv[0]); return 1; } /* Get the CtrlHandles for this X screen */ h = nv_get_ctrl_handles(op->ctrl_display, &handles_array); if (!h || !h->dpy) { return 1; } /* pass control to the gui */ ctk_main(p, &conf, h, op->page); /* write the configuration file */ nv_write_config_file(op->config, h, p, &conf); /* cleanup */ nv_free_ctrl_handles_array(&handles_array); nv_parsed_attribute_free(p); return 0; } /* main() */ nvidia-settings/src/option-table.h0000664000175000017500000002112412236467170017377 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2010 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __OPTION_TABLE_H__ #define __OPTION_TABLE_H__ #include "nvgetopt.h" #include "command-line.h" #define TAB " " #define BIGTAB " " /* * Options table; see nvgetopt.h for a description of the fields, and * gen-manpage-opts.c:print_option() for a description of special * characters that are converted during manpage generation. */ static const NVGetoptOption __options[] = { { "version", 'v', NVGETOPT_HELP_ALWAYS, NULL, "Print the ^nvidia-settings^ version and exit." }, { "help", 'h', NVGETOPT_HELP_ALWAYS, NULL, "Print usage information and exit." }, { "config", CONFIG_FILE_OPTION, NVGETOPT_STRING_ARGUMENT | NVGETOPT_HELP_ALWAYS, NULL, "Use the configuration file &CONFIG& rather than the " "default &" DEFAULT_RC_FILE "&" }, { "ctrl-display", 'c', NVGETOPT_STRING_ARGUMENT | NVGETOPT_HELP_ALWAYS, NULL, "Control the specified X display. If this option is not given, then " "^nvidia-settings^ will control the display specified by ^'--display'^; " "if that is not given, then the &$DISPLAY& environment " "variable is used." }, { "load-config-only", 'l', NVGETOPT_HELP_ALWAYS, NULL, "Load the configuration file, send the values specified therein to " "the X server, and exit. This mode of operation is useful to place " "in your xinitrc file, for example." }, { "no-config", 'n', NVGETOPT_HELP_ALWAYS, NULL, "Do not load the configuration file. This mode of operation is useful " "if ^nvidia-settings^ has difficulties starting due to problems with " "applying settings in the configuration file." }, { "rewrite-config-file", 'r', NVGETOPT_HELP_ALWAYS, NULL, "Write the X server configuration to the configuration file, and exit, " "without starting the graphical user interface. See EXAMPLES section." }, { "verbose", 'V', NVGETOPT_STRING_ARGUMENT | NVGETOPT_ARGUMENT_IS_OPTIONAL | NVGETOPT_HELP_ALWAYS, NULL, "Controls how much information is printed. Valid values are ^'none'^ " "(do not print status messages), ^'errors'^ (print error messages), " "^'deprecations'^ (print error and deprecation messages), ^'warnings'^ " "(print error, deprecation, and warning messages), and ^'all'^ (print " "error, deprecation, warning and other informational messages). By " "default, ^'deprecations'^ is set." }, { "assign", 'a', NVGETOPT_STRING_ARGUMENT | NVGETOPT_HELP_ALWAYS, NULL, "The &ASSIGN& argument to the ^'--assign'^ command line option is of the " "form:\n" "\n" TAB "{DISPLAY}/{attribute name}[{display devices}]={value}\n" "\n" "This assigns the attribute {attribute name} to the value {value} on the " "X Display {DISPLAY}. {DISPLAY} follows the usual {host}:{display}." "{screen} syntax of the DISPLAY environment variable and is optional; " "when it is not specified, then it is implied following the same rule as " "the ^--ctrl-display^ option. If the X screen is not specified, then the " "assignment is made to all X screens. Note that the '/' is only required " "when {DISPLAY} is present.\n" "\n" "{DISPLAY} can additionally include a target specification to direct " "an assignment to something other than an X screen. A target " "specification is contained within brackets and consists of a target " "type name, a colon, and the target id. The target type name can be " "one of ^\"screen\", \"gpu\", \"framelock\", \"vcs\", \"gvi\",^ or " "^\"fan\";^ the target id is the index into the list of targets " "(for that target type). The target specification can be used in " "{DISPLAY} wherever an X screen can be used, following the syntax " "{host}:{display}[{target_type}:{target_id}]. See the output of\n" "\n" TAB "nvidia-settings -q all \n" "\n" "for information on which target types can be used with which " "attributes. See the output of\n" "\n" TAB " nvidia-settings -q screens -q gpus -q framelocks -q vcs -q gvis " "-q fans \n" "\n" "for lists of targets for each target type.\n" "\n" "The [{display devices}] portion is also optional; if it is not " "specified, then the attribute is assigned to all display devices.\n" "\n" "Some examples:\n" "\n" TAB "-a FSAA=5\n" TAB "-a localhost:0.0/DigitalVibrance[CRT-0]=0\n" TAB "--assign=\"SyncToVBlank=1\"\n" TAB "-a [gpu:0]/DigitalVibrance[DFP-1]=63\n" }, { "query", 'q', NVGETOPT_STRING_ARGUMENT | NVGETOPT_HELP_ALWAYS, NULL, "The &QUERY& argument to the ^'--query'^ command line option is of the " "form:\n" "\n" TAB "{DISPLAY}/{attribute name}[{display devices}]\n" "\n" "This queries the current value of the attribute {attribute name} on the " "X Display {DISPLAY}. The syntax is the same as that for the " "^'--assign'^ option, without '=^{value}'^; specify ^'-q screens', " "'-q gpus', '-q framelocks', '-q vcs', '-q gvis', or '-q fans'^ to " "query a list of X screens, GPUs, Frame Lock devices, Visual Computing " "Systems, SDI Input Devices, or Fans, respectively, that are present " "on the X Display {DISPLAY}. Specify ^'-q all'^ to query all attributes." }, { "terse", 't', NVGETOPT_HELP_ALWAYS, NULL, "When querying attribute values with the '--query' command line option, " "only print the current value, rather than the more verbose description " "of the attribute, its valid values, and its current value." }, { "display-device-string", 'd', NVGETOPT_HELP_ALWAYS, NULL, "When printing attribute values in response to the '--query' option, " "if the attribute value is a display device mask, print the value " "as a list of display devices (e.g., \"CRT-0, DFP-0\"), rather than " "a hexadecimal bit mask (e.g., 0x00010001)." }, { "glxinfo", 'g', NVGETOPT_HELP_ALWAYS, NULL, "Print GLX Information for the X display and exit." }, { "describe", 'e', NVGETOPT_STRING_ARGUMENT | NVGETOPT_HELP_ALWAYS, NULL, "Prints information about a particular attribute. Specify 'all' to " "list the descriptions of all attributes. Specify 'list' to list the " "attribute names without a descriptions." }, { "page", 'p', NVGETOPT_STRING_ARGUMENT | NVGETOPT_HELP_ALWAYS, NULL, "The &PAGE& argument to the ^'--page'^ commandline option selects a " "particular page in the nvidia-settings user interface to display " "upon starting nvidia-settings. Valid values are the page names " "in the tree view on the left side of the nvidia-settings user " "interface; e.g.,\n" "\n" TAB "--page=\"X Screen 0\"\n" "\n" "Because some page names are not unique (e.g., a \"PowerMizer\" page is " "present under each GPU), the page name can optionally be prepended " "with the name of the parent X Screen or GPU page, followed by a comma. " "E.g.,\n" "\n" TAB "--page=\"GPU 0 - (Quadro 6000), PowerMizer\"\n" "\n" "The first page with a name matching the &PAGE& argument will be used. " "By default, the \"X Server Information\" page is displayed." }, { "list-targets-only", 'L', NVGETOPT_HELP_ALWAYS, NULL, "When performing an attribute query (from the '--query' command line " "option) or an attribute assignment (from the '--assign' command line " "option or when loading an ~/.nvidia-settings-rc file), nvidia-settings " "identifies one or more targets on which to query/assign the attribute.\n" "\n" "'--list-targets-only' will cause nvidia-settings to list the targets on " " which the query/assign operation would have been performed, without " "actually performing the operation(s), and exit." }, { NULL, 0, 0, NULL, NULL}, }; #endif //_OPTION_TABLE_H nvidia-settings/src/query-assign.h0000664000175000017500000001022112236467170017425 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * query-assign.h - prototypes for querying and assigning * attribute values. */ #ifndef __QUERY_ASSIGN_H__ #define __QUERY_ASSIGN_H__ #include "NvCtrlAttributes.h" #include "parse.h" #include "command-line.h" enum { NV_DPY_PROTO_NAME_TYPE_BASENAME = 0, NV_DPY_PROTO_NAME_TYPE_ID, NV_DPY_PROTO_NAME_DP_GUID, NV_DPY_PROTO_NAME_EDID_HASH, NV_DPY_PROTO_NAME_TARGET_INDEX, NV_DPY_PROTO_NAME_RANDR, NV_DPY_PROTO_NAME_MAX, }; enum { NV_GPU_PROTO_NAME_TYPE_ID = 0, NV_GPU_PROTO_NAME_UUID, NV_GPU_PROTO_NAME_MAX, }; #define NV_PROTO_NAME_MAX (NV_MAX((int)NV_DPY_PROTO_NAME_MAX, (int)NV_GPU_PROTO_NAME_MAX)) /* * The CtrlHandles struct contains an array of target types for an X * server. For each target type, we store the number of those targets * on this X server. Per target, we store a NvCtrlAttributeHandle, a * bitmask of what display devices are enabled on that target, and a * string description of that target. */ typedef struct { NvCtrlAttributeHandle *h; /* handle for this target */ uint32 d; /* display device mask for this target */ uint32 c; /* Connected display device mask for target */ char *name; /* Name for this target */ char *protoNames[NV_PROTO_NAME_MAX]; /* List of valid names for this target */ struct _CtrlHandleTargetNode *relations; /* List of associated targets */ } CtrlHandleTarget; typedef struct { int n; /* number of targets */ CtrlHandleTarget *t; /* dynamically allocated array of targets */ } CtrlHandleTargets; typedef struct { char *display; /* string for XOpenDisplay */ Display *dpy; /* X display connection */ CtrlHandleTargets targets[MAX_TARGET_TYPES]; } CtrlHandles; /* Used to keep track of lists of targets */ typedef struct _CtrlHandleTargetNode { struct _CtrlHandleTargetNode *next; CtrlHandleTarget *t; } CtrlHandleTargetNode; typedef struct _CtrlHandlesArray { int n; /* number of CtrlHandles */ CtrlHandles **array; /* dynamically allocated array of CtrlHandles */ } CtrlHandlesArray; int nv_process_assignments_and_queries(const Options *op, CtrlHandlesArray *handles_array); CtrlHandles * nv_alloc_ctrl_handles_and_add_to_array(const char *display, CtrlHandlesArray *handles_array); void nv_free_ctrl_handles_array(CtrlHandlesArray *handles_array); CtrlHandles *nv_get_ctrl_handles(const char *display, CtrlHandlesArray *handles_array); NvCtrlAttributeHandle *nv_get_target_handle(const CtrlHandles *handles, int target_type, int target_id); Bool nv_get_attribute_perms(CtrlHandles *h, int attr, uint32 flags, NVCTRLAttributePermissionsRec *perms); int nv_process_parsed_attribute(ParsedAttribute*, CtrlHandles *h, int, int, char*, ...) NV_ATTRIBUTE_PRINTF(5, 6); void nv_target_list_free(CtrlHandleTargetNode *head); NvCtrlAttributeHandle *nv_add_target(CtrlHandles *handles, Display *dpy, int target_index, int display_id); const char *nv_get_display_target_config_name(const CtrlHandles *handles, int target_id); #endif /* __QUERY_ASSIGN_H__ */ nvidia-settings/src/lscf.h0000664000175000017500000000153012236467170015730 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __LSCF_H__ #define __LSCF_H__ /* lscf.c */ int update_scf_depth(int depth); #endif /* __LSCF_H__ */ nvidia-settings/src/glxinfo.c0000664000175000017500000003731212236467170016451 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include "NvCtrlAttributes.h" #include "query-assign.h" /* CtrlHandles */ #include "msg.h" #include "glxinfo.h" #include /* GLX #defines */ /* * print_extension_list() - Formats OpenGL/GLX extension strings * to contain commas and returns a pointer to the formated string. * The user is responsible for freeing this buffer. * * If there is an error or there is not enough memory to create * the buffer, NULL is returned. * */ static char * format_extension_list(const char *ext) { int i; char * extTmp = NULL; /* Actual string to print */ const char *extCountTmp; if ( !ext || !ext[0] ) return NULL; /* Count number of extensions (to get number of commas needed) */ i = 0; extCountTmp = ext; while ( *extCountTmp != '\0' ) { if ( *extCountTmp == ' ' ) { i++; } extCountTmp++; } /* * Allocate buffer that will hold the extension string with * commas in it */ extTmp = nvalloc( (strlen(ext) +i +1) *sizeof(char) ); /* Copy extension string to buffer, adding commas */ i = 0; while ( *ext != '\0' && *ext != '\n' ) { if ( *ext == ' ' ) { extTmp[i++] = ','; } extTmp[i++] = *ext; ext++; } extTmp[i] = '\0'; /* Remove any trailing whitespace and commas */ while ( extTmp[ strlen(extTmp)-1 ] == ' ' || extTmp[ strlen(extTmp)-1 ] == ',' ) { extTmp[ strlen(extTmp)-1 ] = '\0'; } return extTmp; } /* format_extension_list() */ /* * print_fbconfig_attribs() & helper functions - * Prints a table of fbconfig attributes * * NOTE: Only support FBconfig for GLX v1.3+ * */ #ifdef GLX_VERSION_1_3 const char * render_type_abbrev(int rend_type) { switch (rend_type) { case GLX_RGBA_BIT: return "rgb"; case GLX_COLOR_INDEX_BIT: return "ci"; case (GLX_RGBA_BIT | GLX_COLOR_INDEX_BIT): return "any"; default: return "."; } } const char * transparent_type_abbrev(int trans_type) { switch (trans_type) { case GLX_NONE: return "."; case GLX_TRANSPARENT_RGB: return "rg"; case GLX_TRANSPARENT_INDEX: return "ci"; default: return "."; } } const char * x_visual_type_abbrev(int x_visual_type) { switch (x_visual_type) { case GLX_TRUE_COLOR: return "tc"; case GLX_DIRECT_COLOR: return "dc"; case GLX_PSEUDO_COLOR: return "pc"; case GLX_STATIC_COLOR: return "sc"; case GLX_GRAY_SCALE: return "gs"; case GLX_STATIC_GRAY: return "sg"; default: return "."; } } const char * caveat_abbrev(int caveat) { if (caveat == GLX_NONE_EXT || caveat == 0) return("."); else if (caveat == GLX_SLOW_VISUAL_EXT) return("slo"); else if (caveat == GLX_NON_CONFORMANT_VISUAL_EXT) return("NoC"); else return("."); } static void print_fbconfig_attribs(GLXFBConfigAttr *fbca) { int i; /* Iterator */ if ( fbca == NULL ) { return; } printf("--fc- --vi- vt buf lv rgb d s colorbuffer ax dp st " "accumbuffer ---ms---- cav -----pbuffer----- ---transparent----\n"); printf(" id id siz l ci b t r g b a bf th en " " r g b a mvs mcs b eat widt hght max-pxs typ r g b a i\n"); printf("---------------------------------------------------" "--------------------------------------------------------------\n"); i = 0; while ( fbca[i].fbconfig_id != 0 ) { printf("0x%03x ", fbca[i].fbconfig_id); if ( fbca[i].visual_id ) { printf("0x%03x ", fbca[i].visual_id); } else { printf(" . "); } printf("%2.2s %3d %2d %3.3s %1c %1c ", x_visual_type_abbrev(fbca[i].x_visual_type), fbca[i].buffer_size, fbca[i].level, render_type_abbrev(fbca[i].render_type), fbca[i].doublebuffer ? 'y' : '.', fbca[i].stereo ? 'y' : '.' ); printf("%2d %2d %2d %2d %2d %2d %2d ", fbca[i].red_size, fbca[i].green_size, fbca[i].blue_size, fbca[i].alpha_size, fbca[i].aux_buffers, fbca[i].depth_size, fbca[i].stencil_size ); printf("%2d %2d %2d %2d ", fbca[i].accum_red_size, fbca[i].accum_green_size, fbca[i].accum_blue_size, fbca[i].accum_alpha_size ); if ( fbca[i].multi_sample_valid == 1 ) { printf("%3d ", fbca[i].multi_samples ); if ( fbca[i].multi_sample_coverage_valid == 1 ) { printf("%3d ", fbca[i].multi_samples_color ); } else { printf("%3d ", fbca[i].multi_samples ); } printf("%1d ", fbca[i].multi_sample_buffers ); } else { printf(" . . . "); } printf("%3.3s %4x %4x %7x %3.3s %2d %2d %2d %2d %2d\n", caveat_abbrev(fbca[i].config_caveat), fbca[i].pbuffer_width, fbca[i].pbuffer_height, fbca[i].pbuffer_max, transparent_type_abbrev(fbca[i].transparent_type), fbca[i].transparent_red_value, fbca[i].transparent_green_value, fbca[i].transparent_blue_value, fbca[i].transparent_alpha_value, fbca[i].transparent_index_value ); i++; } /* Done printing FBConfig attributes for FBConfig */ } /* print_fbconfig_attribs() */ #endif /* GLX_VERSION_1_3 */ /* * print_glxinfo() - prints information about glx * */ #define TAB " " #define SAFE_FREE(m) \ if ( (m) != NULL ) { \ free( m ); \ m = NULL; \ } #define NULL_TO_EMPTY(s) \ ((s)!=NULL)?(s):"" void print_glxinfo(const char *display_name, CtrlHandlesArray *handles_array) { int screen; CtrlHandles *h; CtrlHandleTarget *t; ReturnStatus status = NvCtrlSuccess; char *direct_rendering = NULL; char *glx_extensions = NULL; char *server_vendor = NULL; char *server_version = NULL; char *server_extensions = NULL; char *client_vendor = NULL; char *client_version = NULL; char *client_extensions = NULL; char *opengl_vendor = NULL; char *opengl_renderer = NULL; char *opengl_version = NULL; char *opengl_extensions = NULL; GLXFBConfigAttr *fbconfig_attribs = NULL; char *formated_ext_str = NULL; h = nv_alloc_ctrl_handles_and_add_to_array(display_name, handles_array); if ( h == NULL ) { return; } /* Print information for each screen */ for (screen = 0; screen < h->targets[X_SCREEN_TARGET].n; screen++) { t = &h->targets[X_SCREEN_TARGET].t[screen]; /* No screen, move on */ if ( !t->h ) continue; nv_msg(NULL, "GLX Information for %s:", t->name); /* Get GLX information */ status = NvCtrlGetStringAttribute(t->h, NV_CTRL_STRING_GLX_DIRECT_RENDERING, &direct_rendering); if ( status != NvCtrlSuccess && status != NvCtrlNoAttribute ) { goto finish; } status = NvCtrlGetStringAttribute(t->h, NV_CTRL_STRING_GLX_GLX_EXTENSIONS, &glx_extensions); if ( status != NvCtrlSuccess && status != NvCtrlNoAttribute ) { goto finish; } if ( glx_extensions != NULL ) { formated_ext_str = format_extension_list(glx_extensions); if ( formated_ext_str != NULL ) { free(glx_extensions); glx_extensions = formated_ext_str; } } /* Get server GLX information */ status = NvCtrlGetStringAttribute(t->h, NV_CTRL_STRING_GLX_SERVER_VENDOR, &server_vendor); if ( status != NvCtrlSuccess && status != NvCtrlNoAttribute ) { goto finish; } status = NvCtrlGetStringAttribute(t->h, NV_CTRL_STRING_GLX_SERVER_VERSION, &server_version); if ( status != NvCtrlSuccess && status != NvCtrlNoAttribute ) { goto finish; } status = NvCtrlGetStringAttribute(t->h, NV_CTRL_STRING_GLX_SERVER_EXTENSIONS, &server_extensions); if ( status != NvCtrlSuccess && status != NvCtrlNoAttribute ) { goto finish; } if ( server_extensions != NULL ) { formated_ext_str = format_extension_list(server_extensions); if ( formated_ext_str != NULL ) { free(server_extensions); server_extensions = formated_ext_str; } } /* Get client GLX information */ status = NvCtrlGetStringAttribute(t->h, NV_CTRL_STRING_GLX_CLIENT_VENDOR, &client_vendor); if ( status != NvCtrlSuccess && status != NvCtrlNoAttribute ) { goto finish; } status = NvCtrlGetStringAttribute(t->h, NV_CTRL_STRING_GLX_CLIENT_VERSION, &client_version); if ( status != NvCtrlSuccess && status != NvCtrlNoAttribute ) { goto finish; } status = NvCtrlGetStringAttribute(t->h, NV_CTRL_STRING_GLX_CLIENT_EXTENSIONS, &client_extensions); if ( status != NvCtrlSuccess && status != NvCtrlNoAttribute ) { goto finish; } if ( client_extensions != NULL ) { formated_ext_str = format_extension_list(client_extensions); if ( formated_ext_str != NULL ) { free(client_extensions); client_extensions = formated_ext_str; } } /* Get OpenGL information */ status = NvCtrlGetStringAttribute(t->h, NV_CTRL_STRING_GLX_OPENGL_VENDOR, &opengl_vendor); if ( status != NvCtrlSuccess && status != NvCtrlNoAttribute ) { goto finish; } status = NvCtrlGetStringAttribute(t->h, NV_CTRL_STRING_GLX_OPENGL_RENDERER, &opengl_renderer); if ( status != NvCtrlSuccess && status != NvCtrlNoAttribute ) { goto finish; } status = NvCtrlGetStringAttribute(t->h, NV_CTRL_STRING_GLX_OPENGL_VERSION, &opengl_version); if ( status != NvCtrlSuccess && status != NvCtrlNoAttribute ) { goto finish; } status = NvCtrlGetStringAttribute(t->h, NV_CTRL_STRING_GLX_OPENGL_EXTENSIONS, &opengl_extensions); if ( status != NvCtrlSuccess && status != NvCtrlNoAttribute ) { goto finish; } if ( opengl_extensions != NULL ) { formated_ext_str = format_extension_list(opengl_extensions); if ( formated_ext_str != NULL ) { free(opengl_extensions); opengl_extensions = formated_ext_str; } } /* Get FBConfig information */ status = NvCtrlGetVoidAttribute(t->h, NV_CTRL_ATTR_GLX_FBCONFIG_ATTRIBS, (void *)(&fbconfig_attribs)); if ( status != NvCtrlSuccess && status != NvCtrlNoAttribute ) { goto finish; } /* Print results */ nv_msg(TAB, "direct rendering: %s", NULL_TO_EMPTY(direct_rendering)); nv_msg(TAB, "GLX extensions:"); nv_msg(" ", "%s", NULL_TO_EMPTY(glx_extensions)); nv_msg(" ", "\n"); nv_msg(TAB, "server glx vendor string: %s", NULL_TO_EMPTY(server_vendor)); nv_msg(TAB, "server glx version string: %s", NULL_TO_EMPTY(server_version)); nv_msg(TAB, "server glx extensions:"); nv_msg(" ", "%s", NULL_TO_EMPTY(server_extensions)); nv_msg(" ", "\n"); nv_msg(TAB, "client glx vendor string: %s", NULL_TO_EMPTY(client_vendor)); nv_msg(TAB, "client glx version string: %s", NULL_TO_EMPTY(client_version)); nv_msg(TAB, "client glx extensions:"); nv_msg(" ", "%s", NULL_TO_EMPTY(client_extensions)); nv_msg(" ", "\n"); nv_msg(TAB, "OpenGL vendor string: %s", NULL_TO_EMPTY(opengl_vendor)); nv_msg(TAB, "OpenGL renderer string: %s", NULL_TO_EMPTY(opengl_renderer)); nv_msg(TAB, "OpenGL version string: %s", NULL_TO_EMPTY(opengl_version)); nv_msg(TAB, "OpenGL extensions:"); nv_msg(" ", "%s", NULL_TO_EMPTY(opengl_extensions)); #ifdef GLX_VERSION_1_3 if ( fbconfig_attribs != NULL ) { nv_msg(" ", "\n"); print_fbconfig_attribs(fbconfig_attribs); } #endif fflush(stdout); /* Free memory used */ SAFE_FREE(server_vendor); SAFE_FREE(server_version); SAFE_FREE(server_extensions); SAFE_FREE(client_vendor); SAFE_FREE(client_version); SAFE_FREE(client_extensions); SAFE_FREE(direct_rendering); SAFE_FREE(glx_extensions); SAFE_FREE(opengl_vendor); SAFE_FREE(opengl_renderer); SAFE_FREE(opengl_version); SAFE_FREE(opengl_extensions); SAFE_FREE(fbconfig_attribs); } /* Done looking at all screens */ /* Fall through */ finish: if ( status == NvCtrlError ) { nv_error_msg("Error fetching GLX Information: %s", NvCtrlAttributesStrError(status) ); } /* Free any leftover memory used */ SAFE_FREE(server_vendor); SAFE_FREE(server_version); SAFE_FREE(server_extensions); SAFE_FREE(client_vendor); SAFE_FREE(client_version); SAFE_FREE(client_extensions); SAFE_FREE(direct_rendering); SAFE_FREE(glx_extensions); SAFE_FREE(opengl_vendor); SAFE_FREE(opengl_renderer); SAFE_FREE(opengl_version); SAFE_FREE(opengl_extensions); SAFE_FREE(fbconfig_attribs); nv_free_ctrl_handles_array(handles_array); } /* print_glxinfo() */ nvidia-settings/src/parse.c0000664000175000017500000030244112236467170016113 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include "NVCtrl.h" #include "parse.h" #include "NvCtrlAttributes.h" #include "query-assign.h" #include "common-utils.h" /* local helper functions */ static char **nv_strtok(char *s, char c, int *n); static void nv_free_strtoks(char **s, int n); static int ctoi(const char c); static int count_number_of_chars(char *o, char d); static uint32 display_device_name_to_display_device_mask(const char *str); /* * Table of all attribute names recognized by the attribute string * parser. Binds attribute names to attribute integers (for use in * the NvControl protocol). The flags describe qualities of each * attribute. */ #define F NV_PARSER_TYPE_FRAMELOCK #define C NV_PARSER_TYPE_COLOR_ATTRIBUTE #define N NV_PARSER_TYPE_NO_CONFIG_WRITE #define G NV_PARSER_TYPE_GUI_ATTRIBUTE #define P NV_PARSER_TYPE_PACKED_ATTRIBUTE #define D NV_PARSER_TYPE_VALUE_IS_DISPLAY #define A NV_PARSER_TYPE_NO_QUERY_ALL #define Z NV_PARSER_TYPE_NO_ZERO_VALUE #define H NV_PARSER_TYPE_100Hz #define K NV_PARSER_TYPE_1000Hz #define S NV_PARSER_TYPE_STRING_ATTRIBUTE #define I NV_PARSER_TYPE_SDI #define W NV_PARSER_TYPE_VALUE_IS_SWITCH_DISPLAY #define M NV_PARSER_TYPE_SDI_CSC #define T NV_PARSER_TYPE_HIJACK_DISPLAY_DEVICE #define V NV_PARSER_TYPE_VALUE_IS_DISPLAY_ID const AttributeTableEntry attributeTable[] = { /* name constant flags description */ /* Version information */ { "OperatingSystem", NV_CTRL_OPERATING_SYSTEM, N, "The operating system on which the X server is running. 0-Linux, 1-FreeBSD, 2-SunOS." }, { "NvidiaDriverVersion", NV_CTRL_STRING_NVIDIA_DRIVER_VERSION, S|N, "The NVIDIA X driver version." }, { "NvControlVersion", NV_CTRL_STRING_NV_CONTROL_VERSION, S|N, "The NV-CONTROL X driver extension version." }, { "GLXServerVersion", NV_CTRL_STRING_GLX_SERVER_VERSION, S|N, "The GLX X server extension version." }, { "GLXClientVersion", NV_CTRL_STRING_GLX_CLIENT_VERSION, S|N, "The GLX client version." }, { "OpenGLVersion", NV_CTRL_STRING_GLX_OPENGL_VERSION, S|N, "The OpenGL version." }, { "XRandRVersion", NV_CTRL_STRING_XRANDR_VERSION, S|N, "The X RandR version." }, { "XF86VidModeVersion", NV_CTRL_STRING_XF86VIDMODE_VERSION, S|N, "The XF86 Video Mode X extension version." }, { "XvVersion", NV_CTRL_STRING_XV_VERSION, S|N, "The Xv X extension version." }, { "ScreenPosition", NV_CTRL_STRING_SCREEN_RECTANGLE, S|N, "Returns the physical X Screen's initial position and size (in absolute coordinates) within the desktop as the \"token=value \" string: \"x=#, y=#, width=#, height=#\"." }, /* X screen */ { "Ubb", NV_CTRL_UBB, 0, "Is UBB enabled for the specified X screen." }, { "Overlay", NV_CTRL_OVERLAY, 0, "Is the RGB overlay enabled for the specified X screen." }, { "Stereo", NV_CTRL_STEREO, 0, "The stereo mode for the specified X screen." }, { "TwinView", NV_CTRL_TWINVIEW, 0, "Is TwinView enabled for the specified X screen." }, { "ConnectedDisplays", NV_CTRL_CONNECTED_DISPLAYS, D, "DEPRECATED: use \"-q dpys\" instead." }, { "EnabledDisplays", NV_CTRL_ENABLED_DISPLAYS, D, "DEPRECATED: use \"-q dpys\" instead." }, { "AssociatedDisplays", NV_CTRL_ASSOCIATED_DISPLAY_DEVICES, N|D, "DEPRECATED: use \"-q xscreens -V all\" instead." }, { "ProbeDisplays", NV_CTRL_PROBE_DISPLAYS, A|D, "When this attribute is queried, the X driver re-probes the hardware to detect which display devices are connected to the GPU or DPU driving the specified X screen." }, { "InitialPixmapPlacement", NV_CTRL_INITIAL_PIXMAP_PLACEMENT, N, "Controls where X pixmaps are initially created." }, { "MultiGpuDisplayOwner", NV_CTRL_MULTIGPU_DISPLAY_OWNER, N, "GPU ID of the GPU that has the display device(s) used for showing the X screen." }, { "HWOverlay", NV_CTRL_HWOVERLAY, 0, "When a workstation overlay is in use, this value is 1 if the hardware overlay is used, or 0 if the overlay is emulated." }, { "OnDemandVBlankInterrupts", NV_CTRL_ONDEMAND_VBLANK_INTERRUPTS, 0, "Enable/Disable/Query of on-demand vertical blanking interrupt control on the GPU. The 'OnDemandVBlankInterrupts' X server configuration option must be enabled for this option to be available." }, { "GlyphCache", NV_CTRL_GLYPH_CACHE, N, "Enable or disable caching of glyphs (text) in video memory." }, { "SwitchToDisplays", NV_CTRL_SWITCH_TO_DISPLAYS, D|N|W, "Used to set which displays should be active." }, { "NotebookDisplayChangeLidEvent", NV_CTRL_NOTEBOOK_DISPLAY_CHANGE_LID_EVENT, N, "Reports notebook lid open/close events." }, { "NotebookInternalLCD", NV_CTRL_NOTEBOOK_INTERNAL_LCD, N|D, "DEPRECATED." }, { "Depth30Allowed", NV_CTRL_DEPTH_30_ALLOWED, N, "Returns whether the NVIDIA X driver supports depth 30 on the specified X screen or GPU." }, { "NoScanout", NV_CTRL_NO_SCANOUT, N, "Returns whether the special \"NoScanout\" mode is enabled on the specified X screen or GPU." }, { "XServerUniqueId", NV_CTRL_X_SERVER_UNIQUE_ID, N, "Returns a pseudo-unique identification number for the X server." }, { "PixmapCache", NV_CTRL_PIXMAP_CACHE, N, "Controls whether pixmaps are allocated in a cache." }, { "PixmapCacheRoundSizeKB", NV_CTRL_PIXMAP_CACHE_ROUNDING_SIZE_KB, N, "Controls the number of kilobytes to add to the pixmap cache when there is not enough room." }, { "AccelerateTrapezoids", NV_CTRL_ACCELERATE_TRAPEZOIDS, N, "Enable or disable GPU acceleration of RENDER Trapezoids." }, /* OpenGL */ { "SyncToVBlank", NV_CTRL_SYNC_TO_VBLANK, 0, "Enables sync to vertical blanking for OpenGL clients. This setting only takes effect on OpenGL clients started after it is set." }, { "LogAniso", NV_CTRL_LOG_ANISO, 0, "Enables anisotropic filtering for OpenGL clients; on some NVIDIA hardware, this can only be enabled or disabled; on other hardware different levels of anisotropic filtering can be specified. This setting only takes effect on OpenGL clients started after it is set." }, { "FSAA", NV_CTRL_FSAA_MODE, 0, "The full screen antialiasing setting for OpenGL clients. This setting only takes effect on OpenGL clients started after it is set. Enabling antialiasing will disable FXAA." }, { "TextureSharpen", NV_CTRL_TEXTURE_SHARPEN, 0, "Enables texture sharpening for OpenGL clients. This setting only takes effect on OpenGL clients started after it is set." }, { "ForceGenericCpu", NV_CTRL_FORCE_GENERIC_CPU, N, "Inhibit the use of CPU-specific features such as MMX, SSE, or 3DNOW! for OpenGL clients; this option may result in performance loss, but may be useful in conjunction with software such as the Valgrind memory debugger. This setting only takes effect on OpenGL clients started after it is set." }, { "GammaCorrectedAALines", NV_CTRL_OPENGL_AA_LINE_GAMMA, 0, "For OpenGL clients, allow gamma-corrected antialiased lines to consider variances in the color display capabilities of output devices when rendering smooth lines. Only available on recent Quadro GPUs. This setting only takes effect on OpenGL clients started after it is set." }, { "TextureClamping", NV_CTRL_TEXTURE_CLAMPING, 0, "Define the behavior of OpenGL texture clamping for unbordered textures. If enabled (1), the conformant behavior is used. If disabled (0), GL_CLAMP is remapped to GL_CLAMP_TO_EDGE to avoid seams in applications that rely on this behavior, which was the only option in some very old hardware." }, { "FXAA", NV_CTRL_FXAA, 0, "Enables or disables the use of FXAA, Fast Approximate Anti-Aliasing. Enabling FXAA will disable regular antialiasing modes." }, { "AllowFlipping", NV_CTRL_FLIPPING_ALLOWED, 0, "Defines the swap behavior of OpenGL. When 1, OpenGL will swap by flipping when possible; When 0, OpenGL will always swap by blitting." }, { "FSAAAppControlled", NV_CTRL_FSAA_APPLICATION_CONTROLLED, 0, "When Application Control for FSAA is enabled, then what the application requests is used, and the FSAA attribute is ignored. If this is disabled, then any application setting is overridden with the FSAA attribute." }, { "LogAnisoAppControlled", NV_CTRL_LOG_ANISO_APPLICATION_CONTROLLED, 0, "When Application Control for LogAniso is enabled, then what the application requests is used, and the LogAniso attribute is ignored. If this is disabled, then any application setting is overridden with the LogAniso attribute." }, { "ForceStereoFlipping", NV_CTRL_FORCE_STEREO, 0, "When 1, OpenGL will force stereo flipping even when no stereo drawables are visible (if the device is configured to support it, see the \"Stereo\" X config option). When 0, fall back to the default behavior of only flipping when a stereo drawable is visible." }, { "OpenGLImageSettings", NV_CTRL_IMAGE_SETTINGS, 0, "The image quality setting for OpenGL clients. This setting only takes effect on OpenGL clients started after it is set." }, { "XineramaStereoFlipping", NV_CTRL_XINERAMA_STEREO, 0, "When 1, OpenGL will allow stereo flipping on multiple X screens configured with Xinerama. When 0, flipping is allowed only on one X screen at a time." }, { "ShowSLIHUD", NV_CTRL_SHOW_SLI_HUD, 0, "If this is enabled (1), the driver will draw information about the current SLI mode into a \"heads-up display\" inside OpenGL windows accelerated with SLI. This setting only takes effect on OpenGL clients started after it is set." }, { "ShowSLIVisualIndicator", NV_CTRL_SHOW_SLI_VISUAL_INDICATOR, 0, "If this is enabled (1), the driver will draw information about the current SLI mode into a \"visual indicator\" inside OpenGL windows accelerated with SLI. This setting only takes effect on OpenGL clients started after it is set." }, { "ShowMultiGpuVisualIndicator", NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR, 0, "If this is enabled (1), the driver will draw information about the current MultiGPU mode into a \"visual indicator\" inside OpenGL windows accelerated with SLI. This setting only takes effect on OpenGL clients started after it is set." }, { "FSAAAppEnhanced", NV_CTRL_FSAA_APPLICATION_ENHANCED, 0, "Controls how the FSAA attribute is applied when FSAAAppControlled is disabled. When FSAAAppEnhanced is disabled, OpenGL applications will be forced to use the FSAA mode specified by the FSAA attribute. When the FSAAAppEnhanced attribute is enabled, only those applications that have selected a multisample FBConfig will be made to use the FSAA mode specified." }, { "GammaCorrectedAALinesValue", NV_CTRL_OPENGL_AA_LINE_GAMMA_VALUE, 0, "Returns the gamma value used by OpenGL when gamma-corrected antialiased lines are enabled." }, { "StereoEyesExchange", NV_CTRL_STEREO_EYES_EXCHANGE, 0, "Swaps the left and right eyes of stereo images." }, { "SLIMode", NV_CTRL_STRING_SLI_MODE, S|N, "Returns a string describing the current SLI mode, if any." }, { "SliMosaicModeAvailable", NV_CTRL_SLI_MOSAIC_MODE_AVAILABLE, N, "Returns whether or not SLI Mosaic Mode is supported." }, { "MultiGpuMode", NV_CTRL_STRING_MULTIGPU_MODE, S|N, "Returns a string describing the current MultiGPU mode, if any." }, /* GPU */ { "BusType", NV_CTRL_BUS_TYPE, N, "Returns the type of bus connecting the specified device to the computer. If the target is an X screen, then it uses the GPU driving the X screen as the device." }, { "PCIEMaxLinkSpeed", NV_CTRL_GPU_PCIE_MAX_LINK_SPEED, N, "Returns the maximum speed that the PCIe link between the GPU and the system may be trained to. This is expressed in gigatransfers per second (GT/s). The link may be dynamically trained to a slower speed, based on the GPU's utilization and performance settings." }, { "PCIEMaxLinkWidth", NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH, N, "Returns the maximum width that the PCIe link between the GPU and the system may be trained to. This is expressed in number of lanes. The trained link width may vary dynamically and possibly be narrower based on the GPU's utilization and performance settings." }, { "PCIECurrentLinkSpeed", NV_CTRL_GPU_PCIE_CURRENT_LINK_SPEED, N, "Returns the current PCIe link speed, in gigatransfers per second (GT/s)." }, { "PCIECurrentLinkWidth", NV_CTRL_GPU_PCIE_CURRENT_LINK_WIDTH, N, "Returns the current PCIe link width of the GPU, in number of lanes." }, { "VideoRam", NV_CTRL_VIDEO_RAM, N, "Returns the total amount of memory available to the specified GPU (or the GPU driving the specified X screen). Note: if the GPU supports TurboCache(TM), the value reported may exceed the amount of video memory installed on the GPU. The value reported for integrated GPUs may likewise exceed the amount of dedicated system memory set aside by the system BIOS for use by the integrated GPU." }, { "TotalDedicatedGPUMemory",NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY, N, "Returns the amount of total dedicated memory on the specified GPU in MB." }, { "UsedDedicatedGPUMemory", NV_CTRL_USED_DEDICATED_GPU_MEMORY, N, "Returns the amount of dedicated memory used on the specified GPU in MB." }, { "Irq", NV_CTRL_IRQ, N, "Returns the interrupt request line used by the specified device. If the target is an X screen, then it uses the GPU driving the X screen as the device." }, { "CUDACores", NV_CTRL_GPU_CORES, N, "Returns number of CUDA cores supported by the graphics pipeline." }, { "GPUMemoryInterface", NV_CTRL_GPU_MEMORY_BUS_WIDTH, N, "Returns bus bandwidth of the GPU's memory interface." }, { "GPUCoreTemp", NV_CTRL_GPU_CORE_TEMPERATURE, N, "Reports the current core temperature in Celsius of the GPU driving the X screen." }, { "GPUAmbientTemp", NV_CTRL_AMBIENT_TEMPERATURE, N, "Reports the current temperature in Celsius of the immediate neighborhood of the GPU driving the X screen." }, { "GPUOverclockingState", NV_CTRL_GPU_OVERCLOCKING_STATE, N, "The current overclocking state; the value of this attribute controls the availability of additional overclocking attributes. Note that this attribute is unavailable unless overclocking support has been enabled by the system administrator." }, { "GPU2DClockFreqs", NV_CTRL_GPU_2D_CLOCK_FREQS, N|P, "The GPU and memory clock frequencies when operating in 2D mode. New clock frequencies are tested before being applied, and may be rejected. Note that if the target clocks are too aggressive, their testing may render the system unresponsive. Also note that while this attribute may always be queried, it cannot be set unless GPUOverclockingState is set to MANUAL. Since the target clocks may be rejected, the requester should read this attribute after the set to determine success or failure." }, { "GPU3DClockFreqs", NV_CTRL_GPU_3D_CLOCK_FREQS, N|P, "The GPU and memory clock frequencies when operating in 3D mode. New clock frequencies are tested before being applied, and may be rejected. Note that if the target clocks are too aggressive, their testing may render the system unresponsive. Also note that while this attribute may always be queried, it cannot be set unless GPUOverclockingState is set to MANUAL. Since the target clocks may be rejected, the requester should read this attribute after the set to determine success or failure." }, { "GPUDefault2DClockFreqs", NV_CTRL_GPU_DEFAULT_2D_CLOCK_FREQS, N|P, "Returns the default memory and GPU core clocks when operating in 2D mode." }, { "GPUDefault3DClockFreqs", NV_CTRL_GPU_DEFAULT_3D_CLOCK_FREQS, N|P, "Returns the default memory and GPU core clocks when operating in 3D mode." }, { "GPUCurrentClockFreqs", NV_CTRL_GPU_CURRENT_CLOCK_FREQS, N|P, "Returns the current GPU and memory clocks of the graphics device driving the X screen." }, { "GPUCurrentProcessorClockFreqs", NV_CTRL_GPU_CURRENT_PROCESSOR_CLOCK_FREQS, N, "Returns the current processor clock of the graphics device driving the X screen." }, { "GPUCurrentClockFreqsString", NV_CTRL_STRING_GPU_CURRENT_CLOCK_FREQS, S|N, "Returns the current GPU, memory and Processor clocks of the graphics device driving the X screen." }, { "BusRate", NV_CTRL_BUS_RATE, N, "If the device is on an AGP bus, then BusRate returns the configured AGP rate. If the device is on a PCI Express bus, then this attribute returns the width of the physical link." }, { "PCIDomain", NV_CTRL_PCI_DOMAIN, N, "Returns the PCI domain number for the specified device." }, { "PCIBus", NV_CTRL_PCI_BUS, N, "Returns the PCI bus number for the specified device." }, { "PCIDevice", NV_CTRL_PCI_DEVICE, N, "Returns the PCI device number for the specified device." }, { "PCIFunc", NV_CTRL_PCI_FUNCTION, N, "Returns the PCI function number for the specified device." }, { "PCIID", NV_CTRL_PCI_ID, N|P, "Returns the PCI vendor and device ID of the specified device." }, { "PCIEGen", NV_CTRL_GPU_PCIE_GENERATION, N, "Returns the PCIe generation that this GPU, in this system, is compliant with." }, { "GPUErrors", NV_CTRL_NUM_GPU_ERRORS_RECOVERED, N, "Returns the number of GPU errors occurred." }, { "GPUPowerSource", NV_CTRL_GPU_POWER_SOURCE, N, "Reports the type of power source of the GPU." }, { "GPUCurrentPerfMode", NV_CTRL_GPU_CURRENT_PERFORMANCE_MODE, N, "Reports the current performance mode of the GPU driving the X screen. Running a 3D app, for example, will change this performance mode if Adaptive Clocking is enabled." }, { "GPUCurrentPerfLevel", NV_CTRL_GPU_CURRENT_PERFORMANCE_LEVEL, N, "Reports the current Performance level of the GPU driving the X screen. Each Performance level has associated NVClock and Mem Clock values." }, { "GPUAdaptiveClockState", NV_CTRL_GPU_ADAPTIVE_CLOCK_STATE, N, "Reports if Adaptive Clocking is Enabled on the GPU driving the X screen." }, { "GPUPerfModes", NV_CTRL_STRING_PERFORMANCE_MODES, S|N, "Returns a string with all the performance modes defined for this GPU along with their associated NV Clock and Memory Clock values." }, { "GPUPowerMizerMode", NV_CTRL_GPU_POWER_MIZER_MODE, 0, "Allows setting different GPU powermizer modes." }, { "GPUPowerMizerDefaultMode", NV_CTRL_GPU_POWER_MIZER_DEFAULT_MODE, N, "Reports the default powermizer mode of the GPU, if any." }, { "ECCSupported", NV_CTRL_GPU_ECC_SUPPORTED, N, "Reports whether the underlying GPU supports ECC. All of the other ECC attributes are only applicable if this attribute indicates that ECC is supported." }, { "ECCStatus", NV_CTRL_GPU_ECC_STATUS, N, "Reports whether ECC is enabled." }, { "ECCConfigurationSupported", NV_CTRL_GPU_ECC_CONFIGURATION_SUPPORTED, N, "Reports whether ECC whether the ECC configuration setting can be changed." }, { "ECCConfiguration", NV_CTRL_GPU_ECC_CONFIGURATION, N, "Returns the current ECC configuration setting." }, { "ECCDefaultConfiguration", NV_CTRL_GPU_ECC_DEFAULT_CONFIGURATION, N, "Returns the default ECC configuration setting." }, { "ECCDoubleBitErrors", NV_CTRL_GPU_ECC_DOUBLE_BIT_ERRORS, N, "Returns the number of double-bit ECC errors detected by the targeted GPU since the last POST." }, { "ECCAggregateDoubleBitErrors", NV_CTRL_GPU_ECC_AGGREGATE_DOUBLE_BIT_ERRORS, N, "Returns the number of double-bit ECC errors detected by the targeted GPU since the last counter reset." }, { "GPUFanControlState", NV_CTRL_GPU_COOLER_MANUAL_CONTROL, N, "The current fan control state; the value of this attribute controls the availability of additional fan control attributes. Note that this attribute is unavailable unless fan control support has been enabled by setting the \"Coolbits\" X config option." }, { "GPUCurrentFanSpeed", NV_CTRL_THERMAL_COOLER_LEVEL, N, "Returns the GPU fan's currently programmed speed, as a percentage of the maximum speed." }, { "GPUResetFanSpeed", NV_CTRL_THERMAL_COOLER_LEVEL_SET_DEFAULT, N, "Resets the GPU fan's speed to its default." }, { "GPUCurrentFanSpeedRPM", NV_CTRL_THERMAL_COOLER_SPEED, N, "Returns the GPU fan's tachometer-measured speed in rotations per minute (RPM)." }, { "GPUFanControlType", NV_CTRL_THERMAL_COOLER_CONTROL_TYPE, N, "Returns how the GPU fan is controlled. '1' means the fan can only be toggled on and off; '2' means the fan has variable speed. '0' means the fan is restricted and cannot be adjusted under end user control." }, { "GPUFanTarget", NV_CTRL_THERMAL_COOLER_TARGET, N, "Returns the objects the fan cools. '1' means the GPU, '2' means video memory, '4' means the power supply, and '7' means all of the above." }, { "ThermalSensorReading", NV_CTRL_THERMAL_SENSOR_READING, N, "Returns the thermal sensor's current reading." }, { "ThermalSensorProvider", NV_CTRL_THERMAL_SENSOR_PROVIDER, N, "Returns the hardware device that provides the thermal sensor." }, { "ThermalSensorTarget", NV_CTRL_THERMAL_SENSOR_TARGET, N, "Returns what hardware component the thermal sensor is measuring." }, { "GPUDoublePrecisionBoostImmediate", NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE, N, "Toggles GPU double precision; the change is applied immediately. Only available when the change can be made immediately." }, { "GPUDoublePrecisionBoostReboot", NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT, N, "Toggles GPU double precision; the change is applied on the next reboot. Only available when the change requires a reboot." }, { "BaseMosaic", NV_CTRL_BASE_MOSAIC, N, "Returns the current Base Mosaic configuration." }, { "GpuUUID", NV_CTRL_STRING_GPU_UUID, S|N, "Returns the global unique identifier of the GPU." }, { "MultiGpuMasterPossible", NV_CTRL_MULTIGPU_MASTER_POSSIBLE, N, "Returns whether or not the GPU can be configured as the master GPU for a Multi GPU configuration (SLI, SLI Mosaic, Base Mosaic, ...)." }, /* Framelock */ { "FrameLockAvailable", NV_CTRL_FRAMELOCK, N|F|G, "Returns whether the underlying GPU supports Frame Lock. All of the other frame lock attributes are only applicable if this attribute is enabled (Supported)." }, { "FrameLockMaster", NV_CTRL_FRAMELOCK_MASTER, N|F|G|D, "DEPRECATED: use \"FrameLockDisplayConfig\" instead." }, { "FrameLockPolarity", NV_CTRL_FRAMELOCK_POLARITY, N|F|G, "Sync to the rising edge of the Frame Lock pulse, the falling edge of the Frame Lock pulse, or both." }, { "FrameLockSyncDelay", NV_CTRL_FRAMELOCK_SYNC_DELAY, N|F|G, "Returns the delay between the frame lock pulse and the GPU sync. This is an 11 bit value which is multiplied by 7.81 to determine the sync delay in microseconds." }, { "FrameLockSyncInterval", NV_CTRL_FRAMELOCK_SYNC_INTERVAL, N|F|G, "This defines the number of house sync pulses for each Frame Lock sync period. This only applies to the server, and only when recieving house sync. A value of zero means every house sync pulse is one frame period." }, { "FrameLockPort0Status", NV_CTRL_FRAMELOCK_PORT0_STATUS, N|F|G, "Input/Output status of the RJ45 port0." }, { "FrameLockPort1Status", NV_CTRL_FRAMELOCK_PORT1_STATUS, N|F|G, "Input/Output status of the RJ45 port1." }, { "FrameLockHouseStatus", NV_CTRL_FRAMELOCK_HOUSE_STATUS, N|F|G, "Returns whether or not the house sync signal was detected on the BNC connector of the frame lock board." }, { "FrameLockEnable", NV_CTRL_FRAMELOCK_SYNC, N|F|G, "Enable/disable the syncing of display devices to the frame lock pulse as specified by previous calls to FrameLockMaster and FrameLockSlaves." }, { "FrameLockSyncReady", NV_CTRL_FRAMELOCK_SYNC_READY, N|F|G, "Reports whether a slave frame lock board is receiving sync, whether or not any display devices are using the signal." }, { "FrameLockStereoSync", NV_CTRL_FRAMELOCK_STEREO_SYNC, N|F|G, "This indicates that the GPU stereo signal is in sync with the frame lock stereo signal." }, { "FrameLockTestSignal", NV_CTRL_FRAMELOCK_TEST_SIGNAL, N|F|G, "To test the connections in the sync group, tell the master to enable a test signal, then query port[01] status and sync_ready on all slaves. When done, tell the master to disable the test signal. Test signal should only be manipulated while FrameLockEnable is enabled. The FrameLockTestSignal is also used to reset the Universal Frame Count (as returned by the glXQueryFrameCountNV() function in the GLX_NV_swap_group extension). Note: for best accuracy of the Universal Frame Count, it is recommended to toggle the FrameLockTestSignal on and off after enabling frame lock." }, { "FrameLockEthDetected", NV_CTRL_FRAMELOCK_ETHERNET_DETECTED, N|F|G, "The frame lock boards are cabled together using regular cat5 cable, connecting to RJ45 ports on the backplane of the card. There is some concern that users may think these are Ethernet ports and connect them to a router/hub/etc. The hardware can detect this and will shut off to prevent damage (either to itself or to the router). FrameLockEthDetected may be called to find out if Ethernet is connected to one of the RJ45 ports. An appropriate error message should then be displayed." }, { "FrameLockVideoMode", NV_CTRL_FRAMELOCK_VIDEO_MODE, N|F|G, "Get/set what video mode is used to interpret the house sync signal. This should only be set on the master." }, { "FrameLockSyncRate", NV_CTRL_FRAMELOCK_SYNC_RATE, N|F|G, "Returns the refresh rate that the frame lock board is sending to the GPU, in mHz (Millihertz) (i.e., to get the refresh rate in Hz, divide the returned value by 1000)." }, { "FrameLockTiming", NV_CTRL_FRAMELOCK_TIMING, N|F|G, "This is 1 when the GPU is both receiving and locked to an input timing signal. Timing information may come from the following places: another frame lock device that is set to master, the house sync signal, or the GPU's internal timing from a display device." }, { "FramelockUseHouseSync", NV_CTRL_USE_HOUSE_SYNC, N|F|G, "When 1, the server (master) frame lock device will propagate the incoming house sync signal as the outgoing frame lock sync signal. If the frame lock device cannot detect a frame lock sync signal, it will default to using the internal timings from the GPU connected to the primary connector." }, { "FrameLockSlaves", NV_CTRL_FRAMELOCK_SLAVES, N|F|G|D, "DEPRECATED: use \"FrameLockDisplayConfig\" instead." }, { "FrameLockMasterable", NV_CTRL_FRAMELOCK_MASTERABLE, N|F|G|D, "DEPRECATED: use \"FrameLockDisplayConfig\" instead." }, { "FrameLockSlaveable", NV_CTRL_FRAMELOCK_SLAVEABLE, N|F|G|D, "DEPRECATED: use \"FrameLockDisplayConfig\" instead." }, { "FrameLockFPGARevision", NV_CTRL_FRAMELOCK_FPGA_REVISION, N|F|G, "Returns the FPGA revision of the Frame Lock device." }, { "FrameLockSyncRate4", NV_CTRL_FRAMELOCK_SYNC_RATE_4, N|F|G, "Returns the refresh rate that the frame lock board is sending to the GPU in 1/10000 Hz (i.e., to get the refresh rate in Hz, divide the returned value by 10000)." }, { "FrameLockSyncDelayResolution", NV_CTRL_FRAMELOCK_SYNC_DELAY_RESOLUTION, N|F|G, "Returns the number of nanoseconds that one unit of FrameLockSyncDelay corresponds to." }, { "FrameLockIncomingHouseSyncRate", NV_CTRL_FRAMELOCK_INCOMING_HOUSE_SYNC_RATE, N|F|G, "Returns the rate of the incoming house sync signal to the frame lock board, in mHz (Millihertz) (i.e., to get the house sync rate in Hz, divide the returned value by 1000)." }, /* GVO */ { "GvoSupported", NV_CTRL_GVO_SUPPORTED, I|N, "Returns whether this X screen supports GVO; if this screen does not support GVO output, then all other GVO attributes are unavailable." }, { "GvoSyncMode", NV_CTRL_GVO_SYNC_MODE, I, "Selects the GVO sync mode; possible values are: FREE_RUNNING - GVO does not sync to any external signal. GENLOCK - the GVO output is genlocked to an incoming sync signal; genlocking locks at hsync. This requires that the output video format exactly match the incoming sync video format. FRAMELOCK - the GVO output is frame locked to an incoming sync signal; frame locking locks at vsync. This requires that the output video format have the same refresh rate as the incoming sync video format." }, { "GvoSyncSource", NV_CTRL_GVO_SYNC_SOURCE, I, "If the GVO sync mode is set to either GENLOCK or FRAMELOCK, this controls which sync source is used as the incoming sync signal (either Composite or SDI). If the GVO sync mode is FREE_RUNNING, this attribute has no effect." }, { "GvioRequestedVideoFormat", NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT, I, "Specifies the requested output video format for a GVO device, or the requested capture format for a GVI device." }, { "GvoOutputVideoFormat", NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT, I|A, "DEPRECATED: use \"GvioRequestedVideoFormat\" instead." }, { "GviSyncOutputFormat", NV_CTRL_GVI_SYNC_OUTPUT_FORMAT, I|N, "Returns the output sync signal from the GVI device." }, { "GvioDetectedVideoFormat", NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT, I|N, "Returns the input video format detected by the GVO or GVI device. For GVI devices, the jack+channel must be passed through via the display mask param where the jack number is in the lower 16 bits and the channel number is in the upper 16 bits." }, { "GvoInputVideoFormat", NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT, I|N|A, "DEPRECATED: use \"GvioDetectedVideoFormat\" instead." }, { "GvoDataFormat", NV_CTRL_GVO_DATA_FORMAT, I, "Configures how the data in the source (either the X screen or the GLX pbuffer) is interpreted and displayed by the GVO device." }, { "GvoCompositeSyncInputDetected", NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED, I|N, "Indicates whether Composite Sync input is detected." }, { "GvoCompositeSyncInputDetectMode", NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE, I|N, "Get/set the Composite Sync input detect mode." }, { "GvoSdiSyncInputDetected", NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED, I|N, "Indicates whether SDI Sync input is detected, and what type." }, { "GvoVideoOutputs", NV_CTRL_GVO_VIDEO_OUTPUTS, I|N, "Indicates which GVO video output connectors are currently transmitting data." }, { "GvoSyncDelayPixels", NV_CTRL_GVO_SYNC_DELAY_PIXELS, I, "Controls the skew between the input sync and the output sync in numbers of pixels from hsync; this is a 12-bit value. If the GVO Capabilities has the Advanced Sync Skew bit set, then setting this value will set a sync advance instead of a delay." }, { "GvoSyncDelayLines", NV_CTRL_GVO_SYNC_DELAY_LINES, I, "Controls the skew between the input sync and the output sync in numbers of lines from vsync; this is a 12-bit value. If the GVO Capabilities has the Advanced Sync Skew bit set, then setting this value will set a sync advance instead of a delay." }, { "GvoInputVideoFormatReacquire", NV_CTRL_GVO_INPUT_VIDEO_FORMAT_REACQUIRE, I|N, "Forces input detection to reacquire the input format." }, { "GvoGlxLocked", NV_CTRL_GVO_GLX_LOCKED, I|N, "Indicates that GVO configuration is locked by GLX; this occurs when the GLX_NV_video_out function calls glXGetVideoDeviceNV(). All GVO output resources are locked until either glXReleaseVideoDeviceNV() is called or the X Display used when calling glXGetVideoDeviceNV() is closed." }, { "GvoOverrideHwCsc", NV_CTRL_GVO_OVERRIDE_HW_CSC, I, "Override the SDI hardware's Color Space Conversion with the values controlled through XNVCTRLSetGvoColorConversion() and XNVCTRLGetGvoColorConversion()." }, { "GvoCapabilities", NV_CTRL_GVO_CAPABILITIES, I|N, "Returns a description of the GVO capabilities that differ between NVIDIA SDI products. This value is a bitmask where each bit indicates whether that capability is available." }, { "GvoCompositeTermination", NV_CTRL_GVO_COMPOSITE_TERMINATION, I, "Enable or disable 75 ohm termination of the SDI composite input signal." }, { "GvoFlipQueueSize", NV_CTRL_GVO_FLIP_QUEUE_SIZE, I, "Sets/Returns the GVO flip queue size. This value is used by the GLX_NV_video_out extension to determine the size of the internal flip queue when pbuffers are sent to the video device (via glXSendPbufferToVideoNV()). This attribute is applied to GLX when glXGetVideoDeviceNV() is called by the application." }, { "GvoLockOwner", NV_CTRL_GVO_LOCK_OWNER, I|N, "Indicates that the GVO device is available or in use (by GLX, Clone Mode, or TwinView)." }, { "GvoOutputVideoLocked", NV_CTRL_GVO_OUTPUT_VIDEO_LOCKED, I|N, "Returns whether or not the GVO output video is locked to the GPU output signal." }, { "GvoSyncLockStatus", NV_CTRL_GVO_SYNC_LOCK_STATUS, I|N, "Returns whether or not the GVO device is locked to the input reference signal." }, { "GvoANCTimeCodeGeneration", NV_CTRL_GVO_ANC_TIME_CODE_GENERATION, I, "Controls whether the GVO device generates time codes in the ANC region of the SDI video output stream." }, { "GvoComposite", NV_CTRL_GVO_COMPOSITE, I, "Enables/Disables SDI compositing. This attribute is only available when an SDI input source is detected and is in genlock mode." }, { "GvoCompositeAlphaKey", NV_CTRL_GVO_COMPOSITE_ALPHA_KEY, I, "When SDI compositing is enabled, this enables/disables alpha blending." }, { "GvoCompositeNumKeyRanges", NV_CTRL_GVO_COMPOSITE_NUM_KEY_RANGES, I|N, "Returns the number of ranges available for each channel (Y/Luma, Cr, and Cb) that are used SDI compositing through color keying." }, { "GvioFirmwareVersion", NV_CTRL_STRING_GVIO_FIRMWARE_VERSION, I|S|N, "Indicates the version of the firmware on the GVO or GVI device." }, { "GvoFirmwareVersion", NV_CTRL_STRING_GVIO_FIRMWARE_VERSION, I|S|N|A,"DEPRECATED: use \"GvioFirmwareVersion\" instead." }, { "GvoSyncToDisplay", NV_CTRL_GVO_SYNC_TO_DISPLAY, I|N, "Controls synchronization of the non-SDI display to the SDI display when both are active." }, { "GvoFullRangeColor", NV_CTRL_GVO_FULL_RANGE_COLOR, I, "Allow full range color data [4-1019]. If disabled, color data is clamped to [64-940]." }, { "IsGvoDisplay", NV_CTRL_IS_GVO_DISPLAY, N|D, "Returns whether or not the given display device is driven by the GVO device." }, { "GvoEnableRGBData", NV_CTRL_GVO_ENABLE_RGB_DATA, I, "Indicates that RGB data is being sent via a PASSTHU mode." }, { "GvoAudioBlanking", NV_CTRL_GVO_AUDIO_BLANKING, I, "Indicates that the GVO device should drop audio ancillary data packets when frames are repeated." }, { "GviNumJacks", NV_CTRL_GVI_NUM_JACKS, I|N, "Returns the number of input (BNC) jacks on a GVI device that can read video streams." }, { "GviMaxLinksPerStream", NV_CTRL_GVI_MAX_LINKS_PER_STREAM, I|N, "Returns the maximum number of links that can make up a stream." }, { "GviDetectedChannelBitsPerComponent", NV_CTRL_GVI_DETECTED_CHANNEL_BITS_PER_COMPONENT, I|N, "Returns the detected bits per component on the given jack+channel of the GVI device. The jack+channel must be passed through via the display mask param where the jack number is in the lower 16 bits and the channel number is in the upper 16 bits." }, { "GviRequestedStreamBitsPerComponent", NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT, I, "Indicates the number of bits per component for a capture stream." }, { "GviDetectedChannelComponentSampling", NV_CTRL_GVI_DETECTED_CHANNEL_COMPONENT_SAMPLING, I|N, "Returns the detected sampling format on the given jack+channel of the GVI device. The jack+channel must be passed through via the display mask param where the jack number is in the lower 16 bits and the channel number is in the upper 16 bits." }, { "GviRequestedStreamComponentSampling", NV_CTRL_GVI_REQUESTED_STREAM_COMPONENT_SAMPLING, I, "Indicates the sampling format for a capture stream." }, { "GviRequestedStreamChromaExpand", NV_CTRL_GVI_REQUESTED_STREAM_CHROMA_EXPAND, I, "Indicates whether 4:2:2 -> 4:4:4 chroma expansion is enabled for the capture stream." }, { "GviDetectedChannelColorSpace", NV_CTRL_GVI_DETECTED_CHANNEL_COLOR_SPACE, I|N, "Returns the detected color space (RGB, YCRCB, etc) for the given jack+channel of the GVI device. The jack+channel must be passed through via the display mask param where the jack number is in the lower 16 bits and the channel number is in the upper 16 bits." }, { "GviDetectedChannelLinkID", NV_CTRL_GVI_DETECTED_CHANNEL_LINK_ID, I|N, "Returns the detected link identifier for the given jack+channel of the GVI device. The jack+channel must be passed through via the display mask param where the jack number is in the lower 16 bits and the channel number is in the upper 16 bits." }, { "GviDetectedChannelSMPTE352Identifier", NV_CTRL_GVI_DETECTED_CHANNEL_SMPTE352_IDENTIFIER, I|N, "Returns the detected 4-byte SMPTE 352 identifier from the given jack+channel of the GVI device. The jack+channel must be passed through via the display mask param where the jack number is in the lower 16 bits and the channel number is in the upper 16 bits." }, { "GviGlobalIdentifier", NV_CTRL_GVI_GLOBAL_IDENTIFIER, I|N, "Returns the global identifier for the given NV-CONTROL GVI device." }, { "GviMaxChannelsPerJack", NV_CTRL_GVI_MAX_CHANNELS_PER_JACK, I|N, "Returns the maximum supported number of channels per single jack on a GVI device." }, { "GviMaxStreams", NV_CTRL_GVI_MAX_STREAMS, I|N, "Returns the maximum supported number of streams that can be configured on a GVI device." }, { "GviNumCaptureSurfaces", NV_CTRL_GVI_NUM_CAPTURE_SURFACES, I|N, "Controls the number of capture buffers for storing incoming video from the GVI device." }, { "GviBoundGpu", NV_CTRL_GVI_BOUND_GPU, I|N, "Returns the target index of the GPU currently attached to the GVI device." }, { "GviTestMode", NV_CTRL_GVI_TEST_MODE, I|N, "Enable or disable GVI test mode." }, { "GvoCSCMatrix", 0, I|M|N, "Sets the GVO Color Space Conversion (CSC) matrix. Accepted values are \"ITU_601\", \"ITU_709\", \"ITU_177\", and \"Identity\"." }, /* Display */ { "Brightness", BRIGHTNESS_VALUE|ALL_CHANNELS, N|C|G, "Controls the overall brightness of the display." }, { "RedBrightness", BRIGHTNESS_VALUE|RED_CHANNEL, C|G, "Controls the brightness of the color red in the display." }, { "GreenBrightness", BRIGHTNESS_VALUE|GREEN_CHANNEL, C|G, "Controls the brightness of the color green in the display." }, { "BlueBrightness", BRIGHTNESS_VALUE|BLUE_CHANNEL, C|G, "Controls the brightness of the color blue in the display." }, { "Contrast", CONTRAST_VALUE|ALL_CHANNELS, N|C|G, "Controls the overall contrast of the display." }, { "RedContrast", CONTRAST_VALUE|RED_CHANNEL, C|G, "Controls the contrast of the color red in the display." }, { "GreenContrast", CONTRAST_VALUE|GREEN_CHANNEL, C|G, "Controls the contrast of the color green in the display." }, { "BlueContrast", CONTRAST_VALUE|BLUE_CHANNEL, C|G, "Controls the contrast of the color blue in the display." }, { "Gamma", GAMMA_VALUE|ALL_CHANNELS, N|C|G, "Controls the overall gamma of the display." }, { "RedGamma", GAMMA_VALUE|RED_CHANNEL, C|G, "Controls the gamma of the color red in the display." }, { "GreenGamma", GAMMA_VALUE|GREEN_CHANNEL, C|G, "Controls the gamma of the color green in the display." }, { "BlueGamma", GAMMA_VALUE|BLUE_CHANNEL, C|G, "Controls the gamma of the color blue in the display." }, { "Dithering", NV_CTRL_DITHERING, 0, "Controls the dithering: auto (0), enabled (1), disabled (2)." }, { "CurrentDithering", NV_CTRL_CURRENT_DITHERING, 0, "Returns the current dithering state: enabled (1), disabled (0)." }, { "DitheringMode", NV_CTRL_DITHERING_MODE, 0, "Controls the dithering mode when CurrentDithering=1; auto (0), temporally repeating dithering pattern (1), static dithering pattern (2), temporally stochastic dithering (3)." }, { "CurrentDitheringMode", NV_CTRL_CURRENT_DITHERING_MODE, 0, "Returns the current dithering mode: none (0), temporally repeating dithering pattern (1), static dithering pattern (2), temporally stochastic dithering (3)." }, { "DitheringDepth", NV_CTRL_DITHERING_DEPTH, 0, "Controls the dithering depth when CurrentDithering=1; auto (0), 6 bits per channel (1), 8 bits per channel (2)." }, { "CurrentDitheringDepth", NV_CTRL_CURRENT_DITHERING_DEPTH, 0, "Returns the current dithering depth: none (0), 6 bits per channel (1), 8 bits per channel (2)." }, { "DigitalVibrance", NV_CTRL_DIGITAL_VIBRANCE, 0, "Sets the digital vibrance level of the display device." }, { "ImageSharpening", NV_CTRL_IMAGE_SHARPENING, 0, "Adjusts the sharpness of the display's image quality by amplifying high frequency content." }, { "ImageSharpeningDefault", NV_CTRL_IMAGE_SHARPENING_DEFAULT, 0, "Returns default value of image sharpening." }, { "FrontendResolution", NV_CTRL_FRONTEND_RESOLUTION, N|P, "Returns the dimensions of the frontend (current) resolution as determined by the NVIDIA X Driver. This attribute is a packed integer; the width is packed in the upper 16 bits and the height is packed in the lower 16-bits." }, { "BackendResolution", NV_CTRL_BACKEND_RESOLUTION, N|P, "Returns the dimensions of the backend resolution as determined by the NVIDIA X Driver. The backend resolution is the resolution (supported by the display device) the GPU is set to scale to. If this resolution matches the frontend resolution, GPU scaling will not be needed/used. This attribute is a packed integer; the width is packed in the upper 16-bits and the height is packed in the lower 16-bits." }, { "FlatpanelNativeResolution", NV_CTRL_FLATPANEL_NATIVE_RESOLUTION, N|P, "Returns the dimensions of the native resolution of the flat panel as determined by the NVIDIA X Driver. The native resolution is the resolution at which a flat panel must display any image. All other resolutions must be scaled to this resolution through GPU scaling or the DFP's native scaling capabilities in order to be displayed. This attribute is only valid for flat panel (DFP) display devices. This attribute is a packed integer; the width is packed in the upper 16-bits and the height is packed in the lower 16-bits." }, { "FlatpanelBestFitResolution", NV_CTRL_FLATPANEL_BEST_FIT_RESOLUTION, N|P, "Returns the dimensions of the resolution, selected by the X driver, from the DFP's EDID that most closely matches the frontend resolution of the current mode. The best fit resolution is selected on a per-mode basis. This attribute is only valid for flat panel (DFP) display devices. This attribute is a packed integer; the width is packed in the upper 16-bits and the height is packed in the lower 16-bits." }, { "DFPScalingActive", NV_CTRL_DFP_SCALING_ACTIVE, N, "Returns the current state of DFP scaling. DFP scaling is mode-specific (meaning it may vary depending on which mode is currently set). DFP scaling is active if the GPU is set to scale to the best fit resolution (GPUScaling is set to use FlatpanelBestFitResolution) and the best fit and native resolutions are different." }, { "GPUScaling", NV_CTRL_GPU_SCALING, P, "Controls what the GPU scales to and how. This attribute is a packed integer; the scaling target (native/best fit) is packed in the upper 16-bits and the scaling method is packed in the lower 16-bits." }, { "GPUScalingDefaultTarget", NV_CTRL_GPU_SCALING_DEFAULT_TARGET, 0, "Returns the default gpu scaling target for the Flatpanel." }, { "GPUScalingDefaultMethod", NV_CTRL_GPU_SCALING_DEFAULT_METHOD, 0, "Returns the default gpu scaling method for the Flatpanel." }, { "GPUScalingActive", NV_CTRL_GPU_SCALING_ACTIVE, N, "Returns the current state of GPU scaling. GPU scaling is mode-specific (meaning it may vary depending on which mode is currently set). GPU scaling is active if the frontend timing (current resolution) is different than the target resolution. The target resolution is either the native resolution of the flat panel or the best fit resolution supported by the flat panel. What (and how) the GPU should scale to is controlled through the GPUScaling attribute." }, { "RefreshRate", NV_CTRL_REFRESH_RATE, N|H, "Returns the refresh rate of the specified display device in cHz (Centihertz) (to get the refresh rate in Hz, divide the returned value by 100)." }, { "RefreshRate3", NV_CTRL_REFRESH_RATE_3, N|K, "Returns the refresh rate of the specified display device in mHz (Millihertz) (to get the refresh rate in Hz, divide the returned value by 1000)." }, { "OverscanCompensation", NV_CTRL_OVERSCAN_COMPENSATION, 0, "Adjust the amount of overscan compensation scaling, in pixels, to apply to the specified display device." }, { "ColorSpace", NV_CTRL_COLOR_SPACE, 0, "Sets the color space of the signal sent to the display device." }, { "ColorRange", NV_CTRL_COLOR_RANGE, 0, "Sets the color range of the signal sent to the display device." }, { "SynchronousPaletteUpdates", NV_CTRL_SYNCHRONOUS_PALETTE_UPDATES, 0, "Controls whether colormap updates are synchronized with X rendering." }, { "CurrentMetaModeID", NV_CTRL_CURRENT_METAMODE_ID, N, "The ID of the current MetaMode." }, { "CurrentMetaMode", NV_CTRL_STRING_CURRENT_METAMODE_VERSION_2, S|N, "Controls the current MetaMode." }, { "XineramaInfoOrder", NV_CTRL_STRING_NVIDIA_XINERAMA_INFO_ORDER, S|N, "Controls the nvidiaXineramaInfoOrder." }, { "RandROutputID", NV_CTRL_DISPLAY_RANDR_OUTPUT_ID, N, "The RandR Output ID that corresponds to the display device." }, { "FrameLockDisplayConfig", NV_CTRL_FRAMELOCK_DISPLAY_CONFIG, N, "Controls the FrameLock mode of operation for the display device." }, { "Hdmi3D", NV_CTRL_DPY_HDMI_3D, N, "Returns whether the specified display device is currently using HDMI 3D Frame Packed Stereo mode. If so, the result of refresh rate queries will be doubled." }, { "BacklightBrightness", NV_CTRL_BACKLIGHT_BRIGHTNESS, N, "Controls the backlight brightness of an internal panel." }, /* TV */ { "TVOverScan", NV_CTRL_TV_OVERSCAN, 0, "Adjusts the amount of overscan on the specified display device." }, { "TVFlickerFilter", NV_CTRL_TV_FLICKER_FILTER, 0, "Adjusts the amount of flicker filter on the specified display device." }, { "TVBrightness", NV_CTRL_TV_BRIGHTNESS, 0, "Adjusts the amount of brightness on the specified display device." }, { "TVHue", NV_CTRL_TV_HUE, 0, "Adjusts the amount of hue on the specified display device." }, { "TVContrast", NV_CTRL_TV_CONTRAST, 0, "Adjusts the amount of contrast on the specified display device." }, { "TVSaturation", NV_CTRL_TV_SATURATION, 0, "Adjusts the amount of saturation on the specified display device." }, /* X Video */ { "XVideoSyncToDisplay", NV_CTRL_XV_SYNC_TO_DISPLAY, D|Z|N, "Controls which display device is synced to by the texture and blitter adaptors when they are set to synchronize to the vertical blanking." }, { "XVideoSyncToDisplayID", NV_CTRL_XV_SYNC_TO_DISPLAY_ID, V, "Controls which display device is synced to by the texture and blitter adaptors when they are set to synchronize to the vertical blanking." }, /* 3D Vision Pro */ {"3DVisionProResetTransceiverToFactorySettings", NV_CTRL_3D_VISION_PRO_RESET_TRANSCEIVER_TO_FACTORY_SETTINGS, N, "Resets the 3D Vision Pro transceiver to its factory settings."}, {"3DVisionProTransceiverChannel", NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL, N, "Controls the channel that is currently used by the 3D Vision Pro transceiver."}, {"3DVisionProTransceiverMode", NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE, N, "Controls the mode in which the 3D Vision Pro transceiver operates."}, {"3DVisionProTransceiverChannelFrequency", NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_FREQUENCY, N|T, "Returns the frequency of the channel(in kHz) of the 3D Vision Pro transceiver."}, {"3DVisionProTransceiverChannelQuality", NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY, N|T, "Returns the quality of the channel(in percentage) of the 3D Vision Pro transceiver."}, {"3DVisionProTransceiverChannelCount", NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_COUNT, N, "Returns the number of channels on the 3D Vision Pro transceiver."}, {"3DVisionProPairGlasses", NV_CTRL_3D_VISION_PRO_PAIR_GLASSES, N, "Puts the 3D Vision Pro transceiver into pairing mode to gather additional glasses."}, {"3DVisionProUnpairGlasses", NV_CTRL_3D_VISION_PRO_UNPAIR_GLASSES, N, "Tells a specific pair of glasses to unpair."}, {"3DVisionProDiscoverGlasses", NV_CTRL_3D_VISION_PRO_DISCOVER_GLASSES, N, "Tells the 3D Vision Pro transceiver about the glasses that have been paired using NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_BEACON."}, {"3DVisionProIdentifyGlasses", NV_CTRL_3D_VISION_PRO_IDENTIFY_GLASSES, N, "Causes glasses LEDs to flash for a short period of time."}, {"3DVisionProGlassesSyncCycle", NV_CTRL_3D_VISION_PRO_GLASSES_SYNC_CYCLE, N|T, "Controls the sync cycle duration(in milliseconds) of the glasses."}, {"3DVisionProGlassesMissedSyncCycles", NV_CTRL_3D_VISION_PRO_GLASSES_MISSED_SYNC_CYCLES, N|T, "Returns the number of state sync cycles recently missed by the glasses."}, {"3DVisionProGlassesBatteryLevel", NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL, N|T, "Returns the battery level(in percentage) of the glasses."}, {"3DVisionProTransceiverHardwareRevision", NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_HARDWARE_REVISION, S|N, "Returns the hardware revision of the 3D Vision Pro transceiver."}, {"3DVisionProTransceiverFirmwareVersionA", NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_A, S|N, "Returns the firmware version of chip A of the 3D Vision Pro transceiver."}, {"3DVisionProTransceiverFirmwareDateA", NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_A, S|N, "Returns the date of the firmware of chip A of the 3D Vision Pro transceiver."}, {"3DVisionProTransceiverFirmwareVersionB", NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_B, S|N, "Returns the firmware version of chip B of the 3D Vision Pro transceiver."}, {"3DVisionProTransceiverFirmwareDateB", NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_B, S|N, "Returns the date of the firmware of chip B of the 3D Vision Pro transceiver."}, {"3DVisionProTransceiverAddress", NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_ADDRESS, S|N, "Returns the RF address of the 3D Vision Pro transceiver."}, {"3DVisionProGlassesFirmwareVersionA", NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_VERSION_A, S|N|T, "Returns the firmware version of chip A of the glasses."}, {"3DVisionProGlassesFirmwareDateA", NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_DATE_A, S|N|T, "Returns the date of the firmware of chip A of the glasses."}, {"3DVisionProGlassesAddress", NV_CTRL_STRING_3D_VISION_PRO_GLASSES_ADDRESS, S|N|T, "Returns the RF address of the glasses."}, {"3DVisionProGlassesName", NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME, S|N|T, "Controls the name the glasses should use."}, {"GPUUtilization", NV_CTRL_STRING_GPU_UTILIZATION, S|N, "Returns the current percentage utilization of the GPU components." }, { NULL, 0, 0, NULL } }; #undef F #undef C #undef N #undef G #undef P #undef D #undef A #undef Z #undef H #undef K #undef S #undef I #undef W #undef M #undef T #undef V /* * When new integer attributes are added to NVCtrl.h, an entry should * be added in the above attributeTable[]. The below #if should also * be updated to indicate the last attribute that the table knows * about. */ #if NV_CTRL_LAST_ATTRIBUTE != NV_CTRL_THERMAL_COOLER_SPEED #warning "Have you forgotten to add a new integer attribute to attributeTable?" #endif /* * targetTypeTable[] - this table stores an association of the values * for each attribute target type. */ const TargetTypeEntry targetTypeTable[] = { { "X Screen", /* name */ "screen", /* parsed_name */ X_SCREEN_TARGET, /* target_index */ NV_CTRL_TARGET_TYPE_X_SCREEN, /* nvctrl */ ATTRIBUTE_TYPE_X_SCREEN, /* permission_bit */ NV_TRUE, /* uses_display_devices */ 1, 6 }, /* required major,minor protocol rev */ { "GPU", /* name */ "gpu", /* parsed_name */ GPU_TARGET, /* target_index */ NV_CTRL_TARGET_TYPE_GPU, /* nvctrl */ ATTRIBUTE_TYPE_GPU, /* permission_bit */ NV_TRUE, /* uses_display_devices */ 1, 10 }, /* required major,minor protocol rev */ { "Frame Lock Device", /* name */ "framelock", /* parsed_name */ FRAMELOCK_TARGET, /* target_index */ NV_CTRL_TARGET_TYPE_FRAMELOCK, /* nvctrl */ ATTRIBUTE_TYPE_FRAMELOCK, /* permission_bit */ NV_FALSE, /* uses_display_devices */ 1, 10 }, /* required major,minor protocol rev */ { "VCS", /* name */ "vcs", /* parsed_name */ VCS_TARGET, /* target_index */ NV_CTRL_TARGET_TYPE_VCSC, /* nvctrl */ ATTRIBUTE_TYPE_VCSC, /* permission_bit */ NV_FALSE, /* uses_display_devices */ 1, 12 }, /* required major,minor protocol rev */ { "SDI Input Device", /* name */ "gvi", /* parsed_name */ GVI_TARGET, /* target_index */ NV_CTRL_TARGET_TYPE_GVI, /* nvctrl */ ATTRIBUTE_TYPE_GVI, /* permission_bit */ NV_FALSE, /* uses_display_devices */ 1, 18 }, /* required major,minor protocol rev */ { "Fan", /* name */ "fan", /* parsed_name */ COOLER_TARGET, /* target_index */ NV_CTRL_TARGET_TYPE_COOLER, /* nvctrl */ ATTRIBUTE_TYPE_COOLER, /* permission_bit */ NV_FALSE, /* uses_display_devices */ 1, 20 }, /* required major,minor protocol rev */ { "Thermal Sensor", /* name */ "thermalsensor", /* parsed_name */ THERMAL_SENSOR_TARGET, /* target_index */ NV_CTRL_TARGET_TYPE_THERMAL_SENSOR, /* nvctrl */ ATTRIBUTE_TYPE_THERMAL_SENSOR, /* permission_bit */ NV_FALSE, /* uses_display_devices */ 1, 23 }, /* required major,minor protocol rev */ { "3D Vision Pro Transceiver", /* name */ "svp", /* parsed_name */ NVIDIA_3D_VISION_PRO_TRANSCEIVER_TARGET, /* target_index */ NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER, /* nvctrl */ ATTRIBUTE_TYPE_3D_VISION_PRO_TRANSCEIVER, /* permission_bit */ NV_FALSE, /* uses_display_devices */ 1, 25 }, /* required major,minor protocol rev */ { "Display Device", /* name */ "dpy", /* parsed_name */ DISPLAY_TARGET, /* target_index */ NV_CTRL_TARGET_TYPE_DISPLAY, /* nvctrl */ ATTRIBUTE_TYPE_DISPLAY, /* permission_bit */ NV_FALSE, /* uses_display_devices */ 1, 27 }, /* required major,minor protocol rev */ }; const int targetTypeTableLen = ARRAY_LEN(targetTypeTable); const TargetTypeEntry *nv_get_target_type_entry_by_nvctrl(int nvctrl) { int i; for (i = 0; i < targetTypeTableLen; i++) { if (targetTypeTable[i].nvctrl == nvctrl) { return &targetTypeTable[i]; } } return NULL; } const TargetTypeEntry *nv_get_target_type_entry_by_name(const char *name) { int i; for (i = 0; i < targetTypeTableLen; i++) { if (nv_strcasecmp(targetTypeTable[i].parsed_name, name)) { return &targetTypeTable[i]; } } return NULL; } /* * nv_get_sdi_csc_matrix() - see comments in parse.h */ static const float sdi_csc_itu601[15] = { 0.2991, 0.5870, 0.1150, 0.0625, 0.85547, // Y 0.5000, -0.4185, -0.0810, 0.5000, 0.87500, // Cr -0.1685, -0.3310, 0.5000, 0.5000, 0.87500, // Cb }; static const float sdi_csc_itu709[15] = { 0.2130, 0.7156, 0.0725, 0.0625, 0.85547, // Y 0.5000, -0.4542, -0.0455, 0.5000, 0.87500, // Cr -0.1146, -0.3850, 0.5000, 0.5000, 0.87500, // Cb }; static const float sdi_csc_itu177[15] = { 0.412391, 0.357584, 0.180481, 0.0, 0.85547, // Y 0.019331, 0.119195, 0.950532, 0.0, 0.87500, // Cr 0.212639, 0.715169, 0.072192, 0.0, 0.87500, // Cb }; static const float sdi_csc_identity[15] = { 0.0000, 1.0000, 0.0000, 0.0000, 1.0, // Y (Green) 1.0000, 0.0000, 0.0000, 0.0000, 1.0, // Cr (Red) 0.0000, 0.0000, 1.0000, 0.0000, 1.0, // Cb (Blue) }; const float * nv_get_sdi_csc_matrix(char *s) { if (nv_strcasecmp(s, "itu_601")) { return sdi_csc_itu601; } else if (nv_strcasecmp(s, "itu_709")) { return sdi_csc_itu709; } else if (nv_strcasecmp(s, "itu_177")) { return sdi_csc_itu177; } else if (nv_strcasecmp(s, "identity")) { return sdi_csc_identity; } return NULL; } /*! * Return whether the string defined by 'start' and 'end' is a simple numerical * value; and if so, assigns the value to where 'val' points. * * \param[in] start Start of the string to parse. * \param[in] end End of the string to parse, or NULL if the string is NULL- * terminated. * \param[out] val Points to the integer that should hold the parsed value, * if the string is a numeric. * * \return Return NV_TRUE if the string was a simple numerical value and * 'val' was assigned; else, returns NV_FALSE and 'val' is not * modified. */ int nv_parse_numerical(const char *start, const char *end, int *val) { int num = 0; const char *s; for (s = start; *s && (!end || (s < end)); s++) { if (!isdigit(*s)) { return NV_FALSE; } num = (num * 10) + ctoi(*s); } *val = num; return NV_TRUE; } /*! * Parse the string as a (special case) X screen number. * * Return whether the string defined by 'start' and 'end' is a simple numerical * value that was applied to the ParsedAttribute 'a' as an X screen target * type/id. * * \param[in] start Start of the string to parse. * \param[in] end End of the string to parse, or NULL if the string is NULL- * terminated. * \param[out] a ParsedAttribute to set as an X screen target if the string * is found to be a simple numeric. * * \return Return NV_TRUE if the string was a simple numerical value and 'a' * was modified; else, return NV_FALSE. */ static int nv_parse_special_xscreen_target(ParsedAttribute *a, const char *start, const char *end) { if (!nv_parse_numerical(start, end, &(a->target_id))) { return FALSE; } a->flags |= NV_PARSER_HAS_TARGET; a->target_type = NV_CTRL_TARGET_TYPE_X_SCREEN; return NV_TRUE; } /*! * Parse the string as one of either: an X Display name, just an X screen, and/ * or a target specification in which the string can be in one of the following * formats: * * {screen} * {host}:{display}.{screen} * {host}:{display}[{target-type}:{target-id} * * This is a helper for nv_parse_attribute_string() for parsing all the text * before the DISPLAY_NAME_SEPARATOR. * * \param[in] start Start of the string to parse. * \param[in] end End of the string to parse. * \param[out] a ParsedAttribute to be modified with the X Display and/or * target type + target id or generic specification * information. * * \return Return NV_PARSER_STATUS_SUCCESS if the string was successfully * parsed; Else, one of the NV_PARSER_STATUS_XXX errors that describes * the parsing error encountered. */ static int nv_parse_display_and_target(const char *start, const char *end, /* exclusive */ ParsedAttribute *a) { int len; const char *s, *pOpen, *pClose; const char *startDisplayName; const char *endDisplayName; /* Set target specification related defaults */ a->display = NULL; a->target_id = -1; a->target_type = -1; a->target_name = NULL; a->target_specification = NULL; a->flags &= ~(NV_PARSER_HAS_X_DISPLAY | NV_PARSER_HAS_TARGET); /* * If the string consists of digits only, then this is a special case where * the X screen number is being specified. */ if (nv_parse_special_xscreen_target(a, start, end)) { return NV_PARSER_STATUS_SUCCESS; } /* * If we get here, then there are non-digit characters; look for a pair of * brackets, and treat the contents as a target specification. */ pOpen = pClose = NULL; for (s = start; s < end; s++) { if (*s == '[') pOpen = s; if (*s == ']') pClose = s; } startDisplayName = start; endDisplayName = end; if (pOpen && pClose && (pClose > pOpen) && ((pClose - pOpen) > 1)) { /* * check that there is no stray text between the closing bracket and the * end of our parsable string. */ if ((end - pClose) > 1) { return NV_PARSER_STATUS_TARGET_SPEC_TRAILING_GARBAGE; } /* * Save everything between the pair of brackets as the target * specification to be parsed (against the list of targets on the * specified/default X Display) later. */ len = pClose - pOpen - 1; a->target_specification = nvstrndup(pOpen + 1, len); /* * The X Display name should end on the opening bracket of the target * specification. */ endDisplayName = pOpen; } /* treat everything between start and end as an X Display name */ if (startDisplayName < endDisplayName) { a->display = nvstrndup(startDisplayName, endDisplayName - startDisplayName); a->flags |= NV_PARSER_HAS_X_DISPLAY; /* * this will attempt to parse out any screen number from the * display name */ nv_assign_default_display(a, NULL); } return NV_PARSER_STATUS_SUCCESS; } /* * nv_parse_attribute_string() - see comments in parse.h */ int nv_parse_attribute_string(const char *str, int query, ParsedAttribute *a) { char *s, *tmp, *name, *start, *display_device_name, *equal_sign, *no_spaces = NULL; char tmpname[NV_PARSER_MAX_NAME_LEN]; const AttributeTableEntry *t; int len, ret; #define stop(x) { if (no_spaces) free(no_spaces); return (x); } if (!a) stop(NV_PARSER_STATUS_BAD_ARGUMENT); /* clear the ParsedAttribute struct */ memset((void *) a, 0, sizeof(ParsedAttribute)); a->target_id = -1; a->target_type = -1; /* remove any white space from the string, to simplify parsing */ no_spaces = remove_spaces(str); if (!no_spaces) stop(NV_PARSER_STATUS_EMPTY_STRING); /* * temporarily terminate the string at the equal sign, so that the * DISPLAY_NAME_SEPARATOR search does not extend too far */ equal_sign = NULL; if (query == NV_PARSER_ASSIGNMENT) { equal_sign = strchr(no_spaces, '='); } if (equal_sign) { *equal_sign = '\0'; } /* * get the display name... i.e.,: everything before the * DISPLAY_NAME_SEPARATOR */ s = strchr(no_spaces, DISPLAY_NAME_SEPARATOR); /* * If we found a DISPLAY_NAME_SEPARATOR, and there is some text * before it, parse that text as an X Display name, X screen, * and/or a target specification. */ if ((s) && (s != no_spaces)) { ret = nv_parse_display_and_target(no_spaces, s, a); if (ret != NV_PARSER_STATUS_SUCCESS) { stop(ret); } } if (equal_sign) { *equal_sign = '='; } /* move past the DISPLAY_NAME_SEPARATOR */ if (s) s++; else s = no_spaces; /* read the attribute name */ name = s; len = 0; while (*s && isalnum(*s)) { s++; len++; } if (len == 0) stop(NV_PARSER_STATUS_ATTR_NAME_MISSING); if (len >= NV_PARSER_MAX_NAME_LEN) stop(NV_PARSER_STATUS_ATTR_NAME_TOO_LONG); strncpy(tmpname, name, len); tmpname[len] = '\0'; /* look up the requested name */ for (t = attributeTable; t->name; t++) { if (nv_strcasecmp(tmpname, t->name)) { a->name = t->name; a->attr = t->attr; a->flags |= t->flags; break; } } if (!a->name) stop(NV_PARSER_STATUS_UNKNOWN_ATTR_NAME); /* read the display device name, if any */ if (*s == '[') { s++; start = s; while (*s && *s != ']') s++; display_device_name = nvstrndup(start, s - start); a->display_device_mask = display_device_name_to_display_device_mask(display_device_name); /* * stop parsing if the display device mask is invalid (and the * display device mask is not hijacked for something other than * display) */ if ((a->display_device_mask == INVALID_DISPLAY_DEVICE_MASK) && !(a->flags & NV_PARSER_TYPE_HIJACK_DISPLAY_DEVICE)) stop(NV_PARSER_STATUS_BAD_DISPLAY_DEVICE); a->flags |= NV_PARSER_HAS_DISPLAY_DEVICE; if (*s == ']') s++; } if (query == NV_PARSER_ASSIGNMENT) { /* there should be an equal sign */ if (*s == '=') s++; else stop(NV_PARSER_STATUS_MISSING_EQUAL_SIGN); /* read the value */ tmp = s; if (a->flags & NV_PARSER_TYPE_COLOR_ATTRIBUTE) { /* color attributes are floating point */ a->val.f = strtod(s, &tmp); } else if ((a->flags & NV_PARSER_TYPE_STRING_ATTRIBUTE) || (a->flags & NV_PARSER_TYPE_VALUE_IS_DISPLAY_ID)) { a->val.str = strdup(s); tmp = s + strlen(s); } else if (a->flags & NV_PARSER_TYPE_PACKED_ATTRIBUTE) { /* * Either a single 32-bit integer or two 16-bit * integers, separated by ','. * Passing base as 0 allows packed values to be specified * in hex (Bug 377242) */ a->val.i = strtol(s, &tmp, 0); if (tmp && *tmp == ',') { a->val.i = (a->val.i & 0xffff) << 16; a->val.i |= strtol((tmp + 1), &tmp, 0) & 0xffff; } } else if (a->flags & NV_PARSER_TYPE_VALUE_IS_DISPLAY) { if (nv_strcasecmp(s, "alldisplays")) { a->flags |= NV_PARSER_TYPE_ASSIGN_ALL_DISPLAYS; tmp = s + strlen(s); } else { uint32 mask = 0; mask = display_device_name_to_display_device_mask(s); if (mask && (mask != INVALID_DISPLAY_DEVICE_MASK) && ((mask & (DISPLAY_DEVICES_WILDCARD_CRT | DISPLAY_DEVICES_WILDCARD_TV | DISPLAY_DEVICES_WILDCARD_DFP)) == 0)) { a->val.i = mask; tmp = s + strlen(s); } else { a->val.i = strtol(s, &tmp, 0); } } } else if (a->flags & NV_PARSER_TYPE_SDI_CSC) { /* String that names a standard CSC matrix */ a->val.pf = nv_get_sdi_csc_matrix(s); tmp = s + strlen(s); } else { /* all other attributes are integer */ a->val.i = strtol(s, &tmp, 0); } if (tmp && (s != tmp)) a->flags |= NV_PARSER_HAS_VAL; s = tmp; if (!(a->flags & NV_PARSER_HAS_VAL)) stop(NV_PARSER_STATUS_NO_VALUE); } /* this should be the end of the string */ if (*s != '\0') stop(NV_PARSER_STATUS_TRAILING_GARBAGE); stop(NV_PARSER_STATUS_SUCCESS); } /* nv_parse_attribute_string() */ /* * nv_parse_strerror() - given the error status returned by * nv_parse_attribute_string(), return a string describing the * error. */ const char *nv_parse_strerror(int status) { switch (status) { case NV_PARSER_STATUS_SUCCESS : return "No error"; break; case NV_PARSER_STATUS_BAD_ARGUMENT : return "Bad argument"; break; case NV_PARSER_STATUS_EMPTY_STRING : return "Emtpy string"; break; case NV_PARSER_STATUS_ATTR_NAME_TOO_LONG : return "The attribute name is too long"; break; case NV_PARSER_STATUS_ATTR_NAME_MISSING : return "Missing attribute name"; break; case NV_PARSER_STATUS_BAD_DISPLAY_DEVICE : return "Malformed display device identification"; break; case NV_PARSER_STATUS_MISSING_EQUAL_SIGN : return "Missing equal sign after attribute name"; break; case NV_PARSER_STATUS_NO_VALUE : return "No attribute value specified"; break; case NV_PARSER_STATUS_TRAILING_GARBAGE : return "Trailing garbage"; break; case NV_PARSER_STATUS_UNKNOWN_ATTR_NAME : return "Unrecognized attribute name"; break; case NV_PARSER_STATUS_MISSING_COMMA: return "Missing comma in packed integer value"; break; case NV_PARSER_STATUS_TARGET_SPEC_NO_COLON: return "No colon in target specification"; break; case NV_PARSER_STATUS_TARGET_SPEC_BAD_TARGET: return "Bad target in target specification"; break; case NV_PARSER_STATUS_TARGET_SPEC_NO_TARGET_ID: return "No target ID in target specification"; break; case NV_PARSER_STATUS_TARGET_SPEC_BAD_TARGET_ID: return "Bad target ID in target specification"; break; case NV_PARSER_STATUS_TARGET_SPEC_TRAILING_GARBAGE: return "Trailing garbage after target specification"; break; case NV_PARSER_STATUS_TARGET_SPEC_NO_TARGETS: return "No targets match target specification"; break; default: return "Unknown error"; break; } } /* nv_parse_strerror() */ /* * *sigh* strcasecmp() is a BSDism, and when building with "-ansi" we * don't get the prototype, so reimplement it to avoid a compiler * warning. Returns NV_TRUE if a match, returns NV_FALSE if there is * no match. */ int nv_strcasecmp(const char *a, const char *b) { if (!a && !b) return NV_TRUE; if (!a && b) return NV_FALSE; if ( a && !b) return NV_FALSE; while (toupper(*a) == toupper(*b)) { a++; b++; if ((*a == '\0') && (*b == '\0')) return NV_TRUE; } return NV_FALSE; } /* nv_strcasecmp() */ /* * display_name_to_display_device_mask() - parse the string that describes a * display device mask; the string is a comma-separated list of * display device names, where valid names are: * * CRT-[0,7] TV-[0,7] and DFP[0,7] * * Non-specific names ("CRT", "TV", and "DFP") are also allowed; if * these are specified, then the appropriate WILDCARD flag in the * upper-most byte of the display device mask is set: * * DISPLAY_DEVICES_WILDCARD_CRT * DISPLAY_DEVICES_WILDCARD_TV * DISPLAY_DEVICES_WILDCARD_DFP * * If a parse error occurs, INVALID_DISPLAY_DEVICE_MASK is returned, * otherwise the display mask is returned. */ static uint32 display_device_name_to_display_device_mask(const char *str) { uint32 mask = 0; char *s, **toks, *endptr; int i, n; unsigned long int num; /* sanity check */ if (!str || !*str) return INVALID_DISPLAY_DEVICE_MASK; /* remove spaces from the string */ s = remove_spaces(str); if (!s || !*s) return INVALID_DISPLAY_DEVICE_MASK; /* * can the string be interpreted as a number? if so, use the number * as the mask */ num = strtoul(s, &endptr, 0); if (*endptr == '\0') { free(s); return (uint32) num; } /* break up the string by commas */ toks = nv_strtok(s, ',', &n); if (!toks) { free(s); return INVALID_DISPLAY_DEVICE_MASK; } /* match each token, updating mask as appropriate */ for (i = 0; i < n; i++) { if (nv_strcasecmp(toks[i], "CRT-0")) mask |= ((1 << 0) << 0); else if (nv_strcasecmp(toks[i], "CRT-1")) mask |= ((1 << 1) << 0); else if (nv_strcasecmp(toks[i], "CRT-2")) mask |= ((1 << 2) << 0); else if (nv_strcasecmp(toks[i], "CRT-3")) mask |= ((1 << 3) << 0); else if (nv_strcasecmp(toks[i], "CRT-4")) mask |= ((1 << 4) << 0); else if (nv_strcasecmp(toks[i], "CRT-5")) mask |= ((1 << 5) << 0); else if (nv_strcasecmp(toks[i], "CRT-6")) mask |= ((1 << 6) << 0); else if (nv_strcasecmp(toks[i], "CRT-7")) mask |= ((1 << 7) << 0); else if (nv_strcasecmp(toks[i], "TV-0" )) mask |= ((1 << 0) << 8); else if (nv_strcasecmp(toks[i], "TV-1" )) mask |= ((1 << 1) << 8); else if (nv_strcasecmp(toks[i], "TV-2" )) mask |= ((1 << 2) << 8); else if (nv_strcasecmp(toks[i], "TV-3" )) mask |= ((1 << 3) << 8); else if (nv_strcasecmp(toks[i], "TV-4" )) mask |= ((1 << 4) << 8); else if (nv_strcasecmp(toks[i], "TV-5" )) mask |= ((1 << 5) << 8); else if (nv_strcasecmp(toks[i], "TV-6" )) mask |= ((1 << 6) << 8); else if (nv_strcasecmp(toks[i], "TV-7" )) mask |= ((1 << 7) << 8); else if (nv_strcasecmp(toks[i], "DFP-0")) mask |= ((1 << 0) << 16); else if (nv_strcasecmp(toks[i], "DFP-1")) mask |= ((1 << 1) << 16); else if (nv_strcasecmp(toks[i], "DFP-2")) mask |= ((1 << 2) << 16); else if (nv_strcasecmp(toks[i], "DFP-3")) mask |= ((1 << 3) << 16); else if (nv_strcasecmp(toks[i], "DFP-4")) mask |= ((1 << 4) << 16); else if (nv_strcasecmp(toks[i], "DFP-5")) mask |= ((1 << 5) << 16); else if (nv_strcasecmp(toks[i], "DFP-6")) mask |= ((1 << 6) << 16); else if (nv_strcasecmp(toks[i], "DFP-7")) mask |= ((1 << 7) << 16); else if (nv_strcasecmp(toks[i], "CRT")) mask |= DISPLAY_DEVICES_WILDCARD_CRT; else if (nv_strcasecmp(toks[i], "TV")) mask |= DISPLAY_DEVICES_WILDCARD_TV; else if (nv_strcasecmp(toks[i], "DFP")) mask |= DISPLAY_DEVICES_WILDCARD_DFP; else { mask = INVALID_DISPLAY_DEVICE_MASK; break; } } nv_free_strtoks(toks, n); free(s); return mask; } /* display_name_to_display_device_mask() */ /* * display_device_mask_to_display_name() - construct a string * describing the given display device mask. The returned pointer * points to a newly allocated string, so callers to this function * are responsible for freeing the memory. */ #define DISPLAY_DEVICE_STRING_LEN 256 char *display_device_mask_to_display_device_name(const uint32 mask) { char *s; int first = NV_TRUE; uint32 devcnt, devmask; char *display_device_name_string; display_device_name_string = nvalloc(DISPLAY_DEVICE_STRING_LEN); s = display_device_name_string; devmask = 1 << BITSHIFT_CRT; devcnt = 0; while (devmask & BITMASK_ALL_CRT) { if (devmask & mask) { if (first) first = NV_FALSE; else s += sprintf(s, ", "); s += sprintf(s, "CRT-%X", devcnt); } devmask <<= 1; devcnt++; } devmask = 1 << BITSHIFT_DFP; devcnt = 0; while (devmask & BITMASK_ALL_DFP) { if (devmask & mask) { if (first) first = NV_FALSE; else s += sprintf(s, ", "); s += sprintf(s, "DFP-%X", devcnt); } devmask <<= 1; devcnt++; } devmask = 1 << BITSHIFT_TV; devcnt = 0; while (devmask & BITMASK_ALL_TV) { if (devmask & mask) { if (first) first = NV_FALSE; else s += sprintf(s, ", "); s += sprintf(s, "TV-%X", devcnt); } devmask <<= 1; devcnt++; } if (mask & DISPLAY_DEVICES_WILDCARD_CRT) { if (first) first = NV_FALSE; else s += sprintf(s, ", "); s += sprintf(s, "CRT"); } if (mask & DISPLAY_DEVICES_WILDCARD_TV) { if (first) first = NV_FALSE; else s += sprintf(s, ", "); s += sprintf(s, "TV"); } if (mask & DISPLAY_DEVICES_WILDCARD_DFP) { if (first) first = NV_FALSE; else s += sprintf(s, ", "); s += sprintf(s, "DFP"); } *s = '\0'; return (display_device_name_string); } /* display_device_mask_to_display_name() */ /* * expand_display_device_mask_wildcards() - build a display mask by * taking any of the real display mask bits; if there are any wildcard * flags set, or in all display devices of that type into the display * mask. */ uint32 expand_display_device_mask_wildcards(const uint32 d) { uint32 mask = d & VALID_DISPLAY_DEVICES_MASK; if (d & DISPLAY_DEVICES_WILDCARD_CRT) mask |= BITMASK_ALL_CRT; if (d & DISPLAY_DEVICES_WILDCARD_TV) mask |= BITMASK_ALL_TV; if (d & DISPLAY_DEVICES_WILDCARD_DFP) mask |= BITMASK_ALL_DFP; return mask; } /* * nv_assign_default_display() - assign an X display, if none has been * assigned already. Also, parse the display name to find any * specified X screen. */ void nv_assign_default_display(ParsedAttribute *a, const char *display) { char *colon, *dot; if (!(a->flags & NV_PARSER_HAS_X_DISPLAY)) { if (display) a->display = strdup(display); else a->display = NULL; a->flags |= NV_PARSER_HAS_X_DISPLAY; } if (!(a->flags & NV_PARSER_HAS_TARGET) && a->display) { colon = strchr(a->display, ':'); if (colon) { dot = strchr(colon, '.'); if (dot) { /* * if all characters after the '.' are digits, interpret it as a * screen number. */ nv_parse_special_xscreen_target(a, dot + 1, NULL); } } } } /* * nv_parsed_attribute_init() - initialize a ParsedAttribute linked * list */ ParsedAttribute *nv_parsed_attribute_init(void) { return nvalloc(sizeof(ParsedAttribute)); } /* * nv_parsed_attribute_add() - add a new parsed attribute node to the * linked list */ void nv_parsed_attribute_add(ParsedAttribute *head, ParsedAttribute *a) { ParsedAttribute *p, *t; p = nvalloc(sizeof(ParsedAttribute)); for (t = head; t->next; t = t->next); t->next = p; if (a->display) t->display = strdup(a->display); else t->display = NULL; t->target_type = a->target_type; t->target_id = a->target_id; t->attr = a->attr; t->val = a->val; t->display_device_mask = a->display_device_mask; t->flags = a->flags; t->targets = a->targets; } /* * nv_parsed_attribute_free() - free the linked list */ void nv_parsed_attribute_free(ParsedAttribute *p) { ParsedAttribute *n; while(p) { n = p->next; if (p->display) free(p->display); nv_target_list_free(p->targets); free(p); p = n; } } /* * nv_parsed_attribute_clean() - clean out the ParsedAttribute list, * so that only the empty head node remains. */ void nv_parsed_attribute_clean(ParsedAttribute *p) { nv_parsed_attribute_free(p->next); if (p->display) free(p->display); if (p->name) free(p->name); free(p->target_name); memset(p, 0, sizeof(*p)); } /* nv_parsed_attribute_clean() */ /* * nv_get_attribute_name() - scan the attributeTable for the name that * corresponds to the attribute constant. */ const char *nv_get_attribute_name(const int attr, const int flagsMask, const int flags) { int i; for (i = 0; attributeTable[i].name; i++) { if (attributeTable[i].attr == attr && (attributeTable[i].flags & flagsMask) == (flags & flagsMask)) { return attributeTable[i].name; } } return NULL; } /* nv_get_attribute_name() */ /* * nv_standardize_screen_name() - standardize the X Display name, by * inserting the hostname (if necessary), and using the specified * screen number. If 'screen' is -1, use the screen number already in * the string. If 'screen' is -2, do not put a screen number in the * Display name. */ char *nv_standardize_screen_name(const char *orig, int screen) { char *display_name, *screen_name, *colon, *dot, *tmp; struct utsname uname_buf; int len; /* get the string describing this display connection */ if (!orig) return NULL; /* create a working copy */ display_name = strdup(orig); if (!display_name) return NULL; /* skip past the host */ colon = strchr(display_name, ':'); if (!colon) return NULL; /* if no host is specified, prepend the local hostname */ /* XXX should we try to catch "localhost"? */ if (display_name == colon) { if (uname(&uname_buf) == 0) { len = strlen(display_name) + strlen(uname_buf.nodename) + 1; tmp = nvalloc(len); snprintf(tmp, len, "%s%s", uname_buf.nodename, display_name); free(display_name); display_name = tmp; colon = strchr(display_name, ':'); if (!colon) return NULL; } } /* * if the screen parameter is -1, then extract the screen number, * either from the string or default to 0 */ if (screen == -1) { dot = strchr(colon, '.'); if (dot) { screen = atoi(dot + 1); } else { screen = 0; } } /* * find the separation between the display and the screen; if we * find it, then truncate the string before the screen, so that we * can append the correct screen number. */ dot = strchr(colon, '.'); if (dot) *dot = '\0'; /* * if the screen parameter is -2, then do not write out a screen * number. */ if (screen == -2) { screen_name = display_name; } else { len = strlen(display_name) + 8; screen_name = nvalloc(len); snprintf(screen_name, len, "%s.%d", display_name, screen); free(display_name); } return (screen_name); } /* nv_standardize_screen_name() */ /* * allocate an output string, and copy the input string to the output * string, omitting whitespace */ char *remove_spaces(const char *o) { int len; char *m, *no_spaces; if (!o) return (NULL); len = strlen (o); no_spaces = nvalloc(len + 1); m = no_spaces; while (*o) { if (!isspace (*o)) { *m++ = *o; } o++; } *m = '\0'; len = m - no_spaces + 1; no_spaces = realloc (no_spaces, len); return (no_spaces); } /* remove_spaces() */ /* * allocate an output string and copy the input string to this * output string, replacing any occurrences of the character * 'c' with the character 'r'. */ char *replace_characters(const char *o, const char c, const char r) { int len; char *m, *out; if (!o) return NULL; len = strlen(o); out = nvalloc(len + 1); m = out; while (*o != '\0') { *m++ = (*o == c) ? r : *o; o++; } *m = '\0'; len = (m - out + 1); out = nvrealloc(out, len); return out; } /* replace_characters() */ /**************************************************************************/ /* * nv_strtok () - returns a dynamically allocated array of strings, * which are the separate segments of the passed in string, divided by * the character indicated. The passed-by-reference argument num will * hold the number of segments found. When you are done with the * array of strings, it is best to call nvFreeStrToks () to free the * memory allocated here. */ static char **nv_strtok(char *s, char c, int *n) { int count, i, len; char **delims, **tokens, *m; count = count_number_of_chars(s, c); /* * allocate and set pointers to each division (each instance of the * dividing character, and the terminating NULL of the string) */ delims = nvalloc((count + 1) * sizeof(char *)); m = s; for (i = 0; i < count; i++) { while (*m != c) m++; delims[i] = m; m++; } delims[count] = (char *) strchr(s, '\0'); /* * so now, we have pointers to each delimiter; copy what's in between * the divisions (the tokens) into the dynamic array of strings */ tokens = nvalloc((count + 1) * sizeof(char *)); len = delims[0] - s; tokens[0] = nvstrndup(s, len); for (i = 1; i < count+1; i++) { len = delims[i] - delims[i-1]; tokens[i] = nvstrndup(delims[i-1]+1, len-1); } free(delims); *n = count+1; return (tokens); } /* nv_strtok() */ /* * nv_free_strtoks() - free an array of arrays, such as what is * allocated and returned by nv_strtok() */ static void nv_free_strtoks(char **s, int n) { int i; for (i = 0; i < n; i++) free(s[i]); free(s); } /* nv_free_strtoks() */ /* * character to integer conversion */ static int ctoi(const char c) { return (c - '0'); } /* ctoi */ /* * count_number_of_chars() - return the number of times the * character d appears in the string */ static int count_number_of_chars(char *o, char d) { int c = 0; while (*o) { if (*o == d) c++; o++; } return (c); } /* count_number_of_chars() */ /* * count_number_of_bits() - return the number of bits set * in the int. */ int count_number_of_bits(unsigned int mask) { int count = 0; while (mask) { count++; mask &= (mask-1); } return count; } /* count_number_of_bits() */ /** parse_skip_whitespace() ****************************************** * * Returns a pointer to the start of non-whitespace chars in string 'str' * **/ const char *parse_skip_whitespace(const char *str) { while (*str && (*str == ' ' || *str == '\t' || *str == '\n' || *str == '\r')) { str++; } return str; } /* parse_skip_whitespace() */ /** parse_chop_whitespace() ****************************************** * * Removes all trailing whitespace chars from the given string 'str' * ***/ void parse_chop_whitespace(char *str) { char *tmp = str + strlen(str) -1; while (tmp >= str && (*tmp == ' ' || *tmp == '\t' || *tmp == '\n' || *tmp == '\r')) { *tmp = '\0'; tmp--; } } /* parse_chop_whitespace() */ /** parse_skip_integer() ********************************************* * * Returns a pointer to the location just after any integer in string 'str' * **/ const char *parse_skip_integer(const char *str) { if (*str == '-' || *str == '+') { str++; } while (*str && *str >= '0' && *str <= '9') { str++; } return str; } /* parse_skip_integer() */ /** parse_read_integer() ********************************************* * * Reads an integer from string str and returns a pointer * **/ const char *parse_read_integer(const char *str, int *num) { str = parse_skip_whitespace(str); *num = atoi(str); str = parse_skip_integer(str); return parse_skip_whitespace(str); } /* parse_read_integer() */ /** parse_read_integer_pair() **************************************** * * Reads two integers separated by 'separator' and returns a pointer * to the location in 'str' where parsing finished. (After the two * integers). NULL is returned on failure. * **/ const char *parse_read_integer_pair(const char *str, char separator, int *a, int *b) { str = parse_read_integer(str, a); if (!str) return NULL; if (separator) { if (*str != separator) return NULL; str++; } return parse_read_integer(str, b); } /* parse_read_integer_pair() */ /** parse_read_name() ************************************************ * * Skips whitespace and copies characters up to and excluding the * terminating character 'term'. The location where parsing stopped * is returned, or NULL on failure. * * The 'term' value 0 is used to indicate that any whitespace should * be treated as a terminator. * **/ static int name_terminated(const char ch, const char term) { if (term == 0) { return (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r'); } else { return (ch == term); } } const char *parse_read_name(const char *str, char **name, char term) { const char *tmp; str = parse_skip_whitespace(str); tmp = str; while (*str && !name_terminated(*str, term)) { str++; } *name = nvalloc(str - tmp + 1); strncpy(*name, tmp, str -tmp); if (name_terminated(*str, term)) { str++; } return parse_skip_whitespace(str); } /* parse_read_name() */ /** parse_read_display_name() **************************************** * * Convert a 'CRT-1' style display device name into a device_mask * '0x00000002' bitmask. The location where parsing stopped is returned * or NULL if an error occurred. * **/ const char *parse_read_display_name(const char *str, unsigned int *mask) { if (!str || !mask) { return NULL; } str = parse_skip_whitespace(str); if (!strncmp(str, "CRT-", 4)) { *mask = 1 << (atoi(str+4)); } else if (!strncmp(str, "TV-", 3)) { *mask = (1 << (atoi(str+3))) << 8; } else if (!strncmp(str, "DFP-", 4)) { *mask = (1 << (atoi(str+4))) << 16; } else { return NULL; } while (*str && *str != ':') { str++; } if (*str == ':') { str++; } return parse_skip_whitespace(str); } /* parse_read_display_name() */ /** parse_read_display_id() ***************************************** * * Convert a 'DPY-#' style display device name into a display device * id. The location where parsing stopped is returned or NULL if an * error occurred. * **/ const char *parse_read_display_id(const char *str, unsigned int *id) { if (!str || !id) { return NULL; } str = parse_skip_whitespace(str); if (!strncmp(str, "DPY-", 4)) { *id = atoi(str+4); } else { return NULL; } while (*str && *str != ':') { str++; } if (*str == ':') { str++; } return parse_skip_whitespace(str); } /* parse_read_display_id() */ /** parse_read_float_range() ***************************************** * * Reads the maximum/minimum information from a string in the * following format: * "MIN-MAX" * or * "MIN" * **/ int parse_read_float_range(const char *str, float *min, float *max) { if (!str) return 0; str = parse_skip_whitespace(str); *min = atof(str); str = strstr(str, "-"); if (!str) { *max = *min; return 1; } str++; *max = atof(str); return 1; } /* parse_read_float_range() */ /** parse_token_value_pairs() **************************************** * * Parses the given string for "token=value, token=value, ..." pairs * and dispatches the handling of tokens to the given function with * the given data as an extra argument. * * Note that the value may be in parentheses: "token=(value), ..." * **/ int parse_token_value_pairs(const char *str, apply_token_func func, void *data) { char *token; char *value; char endChar; if (str) { /* Parse each token */ while (*str) { /* Read the token */ str = parse_read_name(str, &token, '='); if (!str) return 0; /* Read the value */ if (str && *str == '(') { str++; endChar = ')'; } else { endChar = ','; } str = parse_read_name(str, &value, endChar); if (!str) return 0; if (endChar == ')' && *str == ')') { str++; } if (*str == ',') { str++; } /* Remove trailing whitespace */ parse_chop_whitespace(token); parse_chop_whitespace(value); func(token, value, data); free(token); free(value); } } return 1; } /* parse_token_value_pairs() */ nvidia-settings/src/app-profiles.h0000664000175000017500000003224212236467170017406 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2013 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * app-profiles.h - prototypes for querying and assigning application profile * settings, as well as parsing and saving application profile configuration * files. */ #ifndef __APP_PROFILES_H__ #define __APP_PROFILES_H__ #include #include /* * A comment on the format of parsed configuration files: * * Each parsed file is described by a JSON object, with the following members: * filename: This is the name of the file. * rules: this is the same as the rules array in the original configuration file, * except inline profiles are moved into the profiles array. Also see * below. * profiles: this is a JSON object which is used as a per-file hashtable * mapping profile names to profiles. Note this differs from the * format of the original configuration file, which stores * profiles in an array. * order: this is a JSON object which describes the priority of the file * in the search path. This contains the following members: * major: the index of the top-level search path entry * minor: 0 if the file is in the top-level search path, or otherwise the order * of the file within the top-level directory as determined by * strcoll(3). * dirty: a flag indicating this file should be overwritten even if * validation does not detect any changes (used to handle invalid * configuration, e.g. duplicate profile names). * new: indicates whether the file object is new to the configuration or * loaded from disk * atime: time of last access as determined by time(2) during the * nv_app_profile_config_load() call. Used to check if our local copy * of the config file is stale. Undefined for new files * * Each rule in the configuration contains the following attributes: * id: This is a unique integer that identifies the rule. * pattern: This is the same as the pattern attribute in the rule read in * from the original configuration. * profile: This is a string describing the name of the profile applied by * the rule. * * The priority of the rule is implicitly determined by its position in the * configuration. * * Each profile in the configuration contains the following attributes: * settings: This is an array of setting objects, and is the same as * the settings array of the original profile read in from the * original configuration. * * The name of the profile is implicitly determined by its key in its container * JSON object. */ /* * The AppProfileConfig struct contains the current profile configuration * as determined by nvidia-settings. This configuration contains a list * of files which contain rules and profiles. */ typedef struct AppProfileConfigRec { /* * JSON object containing our global app profile options. Currently * contains the following members: * enabled: boolean indicating whether app profiles are enabled. */ json_t *global_options; /* * JSON array of parsed files, each containing a rules and profiles array * along with other metadata. */ json_t *parsed_files; /* * We maintain secondary hashtables of profile and rule locations stored as * JSON objects for quicker lookup of individual profiles and rules. This is * also used to ensure that globally there are no two profiles with the same * name (regardless of their file of origin). */ json_t *profile_locations; json_t *rule_locations; size_t next_free_rule_id; /* * Copy of the global configuration filename */ char *global_config_file; /* * Copy of the search path. This is needed to determine the order of files * in the parsed_files array above */ char **search_path; size_t search_path_count; } AppProfileConfig; /* * Save configuration specified by the JSON array updates to disk. See * nv_app_profile_config_validate() below for the format of this array. * backup indicates whether this should also make backups of the original files * before saving. * Returns 0 if successful, or a negative integer if an error was encountered. * If error_str is non-NULL, *error_str is set to NULL on success, or a * dynamically-allocated string if an error occurred. */ int nv_app_profile_config_save_updates(AppProfileConfig *config, json_t *updates, int backup, char **error_str); /* * Load an application profile configuration from disk, using a list of files specified by search_path. */ AppProfileConfig *nv_app_profile_config_load(const char *global_config_file, char **search_path, size_t search_path_count); /* * Duplicate the configuration; the copy can then be edited and compared against * the original. */ AppProfileConfig *nv_app_profile_config_dup(AppProfileConfig *old_config); /* * Toggle whether application profiles are enabled for this user. */ void nv_app_profile_config_set_enabled(AppProfileConfig *config, int enabled); /* * Destroy the configuration and free its backing memory. */ void nv_app_profile_config_free(AppProfileConfig *config); /* * Validate the configuration specified by new_config against the pristine copy * specified by old_config, and generate a list of changes needed in order to * achieve the new configuration. * * This returns a JSON array which must be freed via json_decref(), containing * a list of update objects. Each update object contains the following * attributes: * * filename (string): the filename of the file that changed * text (string): the new JSON that should be used * * This array can be passed directly to nv_app_profile_config_save_updates() to * be saved to disk. */ json_t *nv_app_profile_config_validate(AppProfileConfig *new_config, AppProfileConfig *old_config); #define INVALID_RULE_ID -1 // Accessor functions const json_t *nv_app_profile_config_get_profile(AppProfileConfig *config, const char *profile_name); const json_t *nv_app_profile_config_get_rule(AppProfileConfig *config, int id); const char *nv_app_profile_config_get_rule_filename(AppProfileConfig *config, int id); const char *nv_app_profile_config_get_profile_filename(AppProfileConfig *config, const char *profile_name); int nv_app_profile_config_get_enabled(AppProfileConfig *config); // Opaque iterator functions typedef struct AppProfileConfigProfileIterRec AppProfileConfigProfileIter; typedef struct AppProfileConfigRuleIterRec AppProfileConfigRuleIter; AppProfileConfigProfileIter *nv_app_profile_config_profile_iter(AppProfileConfig *config); AppProfileConfigProfileIter *nv_app_profile_config_profile_iter_next(AppProfileConfigProfileIter *iter); const char *nv_app_profile_config_profile_iter_filename(AppProfileConfigProfileIter *iter); const char *nv_app_profile_config_profile_iter_name(AppProfileConfigProfileIter *iter); json_t *nv_app_profile_config_profile_iter_val(AppProfileConfigProfileIter *iter); AppProfileConfigRuleIter *nv_app_profile_config_rule_iter(AppProfileConfig *config); AppProfileConfigRuleIter *nv_app_profile_config_rule_iter_next(AppProfileConfigRuleIter *iter); json_t *nv_app_profile_config_rule_iter_val(AppProfileConfigRuleIter *iter); size_t nv_app_profile_config_rule_iter_pri(AppProfileConfigRuleIter *iter); const char *nv_app_profile_config_rule_iter_filename(AppProfileConfigRuleIter *iter); size_t nv_app_profile_config_count_rules(AppProfileConfig *config); /* * Update or create a new profile. Returns TRUE if this operation resulted in * the creation of a new profile. */ int nv_app_profile_config_update_profile(AppProfileConfig *config, const char *filename, const char *profile_name, json_t *new_profile); /* * Delete a profile from the configuration. */ void nv_app_profile_config_delete_profile(AppProfileConfig *config, const char *profile_name); /* * Create a new rule. The rule will be given priority over all rules defined in * the same file in the search path. Returns the ID of the newly-created rule. * The memory pointed to by rule must be allocated by malloc(), and should not * be freed explicitly by the caller. */ int nv_app_profile_config_create_rule(AppProfileConfig *config, const char *filename, json_t *new_rule); /* * Update the attributes of an existing rule by its ID. If filename is * non-NULL and differs from the file in which the rule currently resides, * this operation will move the rule to the file specified by filename, * potentially altering the rule's priority in the process. Returns TRUE * if the rule is moved as a result of this operation. */ int nv_app_profile_config_update_rule(AppProfileConfig *config, const char *filename, int id, json_t *rule); /* * Delete the rule with the given ID from the configuration. */ void nv_app_profile_config_delete_rule(AppProfileConfig *config, int id); size_t nv_app_profile_config_get_rule_priority(AppProfileConfig *config, int id); void nv_app_profile_config_set_abs_rule_priority(AppProfileConfig *config, int id, size_t pri); /* * Change the priority of the rule in the rule list. Existing rules with * equal or lower priority in the list will be moved down in the list to make * room. This operation also changes the source file of the rule as needed to * ensure the rule's priority will be consistent with its location in the search * path. */ void nv_app_profile_config_change_rule_priority(AppProfileConfig *config, int id, int delta); /* * This function walks the list of parsed files, and marks any files which have * changed since the configuration was loaded on disk dirty for the validation * step to generate an update for them. * * This function returns TRUE if any files read in this configuration have * changed since this configuration was loaded from disk. */ int nv_app_profile_config_check_backing_files(AppProfileConfig *config); /* * Utility function to strip comments and translate hex/octal values to decimal * so the JSON parser can understand. */ char *nv_app_profile_cfg_file_syntax_to_json(const char *orig_s); int nv_app_profile_config_check_valid_source_file(AppProfileConfig *config, const char *filename, char **reason); /* * Constructs a list of suggested filenames from the default search path and * parsed files list. If an item in the search path appears in the prefix of a * path to a parsed file, it will *not* appear in the list. The resulting json_t * object should be freed via json_decref() once the caller is done using it. */ json_t *nv_app_profile_config_get_source_filenames(AppProfileConfig *config); /* * Given a valid filename in the search path, this function constructs the name * of the file that will be used as a backup file for display to the end user. * The returned string should be freed by the caller. */ char *nv_app_profile_config_get_backup_filename(AppProfileConfig *config, const char *filename); /* * Constructs an unused profile name for use with a new profile. The returned * string should be freed by the caller. */ char *nv_app_profile_config_get_unused_profile_name(AppProfileConfig *config); /* * This function looks for all rules referring to the profile name given by * orig_name and updates them to refer to the profile name given by new_name. * Returns TRUE if any rules have been altered as a result of this operation. */ int nv_app_profile_config_profile_name_change_fixup(AppProfileConfig *config, const char *orig_name, const char *new_name); #endif // __APP_PROFILES_H__ nvidia-settings/src/gtk+-2.x/0000775000175000017500000000000012236467170016076 5ustar albertoalbertonvidia-settings/src/gtk+-2.x/ctkgpu.h0000664000175000017500000000514512236467170017551 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_GPU_H__ #define __CTK_GPU_H__ #include #include #include "ctkevent.h" #include "ctkconfig.h" #include "NvCtrlAttributes.h" G_BEGIN_DECLS #define CTK_TYPE_GPU (ctk_gpu_get_type()) #define CTK_GPU(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_GPU, CtkGpu)) #define CTK_GPU_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_GPU, CtkGpuClass)) #define CTK_IS_GPU(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_GPU)) #define CTK_IS_GPU_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_GPU)) #define CTK_GPU_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_GPU, CtkGpuClass)) typedef struct _CtkGpu CtkGpu; typedef struct _CtkGpuClass CtkGpuClass; struct _CtkGpu { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; CtkEvent *ctk_event; GtkWidget *displays; GtkWidget *gpu_memory_used_label; GtkWidget *gpu_utilization_label; GtkWidget *video_utilization_label; GtkWidget *pcie_utilization_label; gint gpu_memory; gint gpu_utilization; gint gpu_cores; gint gpu_uuid; gint memory_interface; gboolean pcie_gen_queriable; }; struct _CtkGpuClass { GtkVBoxClass parent_class; }; GType ctk_gpu_get_type (void) G_GNUC_CONST; GtkWidget* ctk_gpu_new (NvCtrlAttributeHandle *handle, CtrlHandleTarget *t, CtkEvent *ctk_event, CtkConfig *ctk_config); void get_bus_type_str(NvCtrlAttributeHandle *handle, gchar **bus); gchar *get_bus_id_str(NvCtrlAttributeHandle *handle); GtkTextBuffer *ctk_gpu_create_help(GtkTextTagTable *, CtkGpu *); void ctk_gpu_page_select(GtkWidget *); void ctk_gpu_page_unselect(GtkWidget *); G_END_DECLS #endif /* __CTK_GPU_H__ */ nvidia-settings/src/gtk+-2.x/ctkdropdownmenu.h0000664000175000017500000000653312236467170021501 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_DROP_DOWN_MENU_H__ #define __CTK_DROP_DOWN_MENU_H__ #include "NvCtrlAttributes.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_DROP_DOWN_MENU (ctk_drop_down_menu_get_type()) #define CTK_DROP_DOWN_MENU(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_DROP_DOWN_MENU, \ CtkDropDownMenu)) #define CTK_DROP_DOWN_MENU_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_DROP_DOWN_MENU, \ CtkDropDownMenuClass)) #define CTK_IS_DROP_DOWN_MENU(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_DROP_DOWN_MENU)) #define CTK_IS_DROP_DOWN_MENU_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_DROP_DOWN_MENU)) #define CTK_DROP_DOWN_MENU_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_DROP_DOWN_MENU, \ CtkDropDownMenuClass)) #define CTK_DROP_DOWN_MENU_FLAG_MONOSPACE 0x1 #define CTK_DROP_DOWN_MENU_FLAG_COMBO 0x2 typedef struct _CtkDropDownMenu CtkDropDownMenu; typedef struct _CtkDropDownMenuClass CtkDropDownMenuClass; typedef struct _CtkDropDownMenuValue CtkDropDownMenuValue; struct _CtkDropDownMenuValue { GtkWidget *menu_item; gint value; gchar *glist_item; }; struct _CtkDropDownMenu { GtkVBox parent; GtkWidget *menu; GtkWidget *option_menu; guint flags; gint num_entries; gint current_selected_item; GList *glist; // currently selected item in the drop down GtkWidget *current_selected_item_widget; CtkDropDownMenuValue *values; }; struct _CtkDropDownMenuClass { GtkVBoxClass parent_class; }; GType ctk_drop_down_menu_get_type (void) G_GNUC_CONST; GtkWidget* ctk_drop_down_menu_new (guint flags); GtkWidget* ctk_drop_down_menu_append_item (CtkDropDownMenu *d, const gchar *name, const gint value); gint ctk_drop_down_menu_get_current_value (CtkDropDownMenu *d); const char *ctk_drop_down_menu_get_current_name (CtkDropDownMenu *d); void ctk_drop_down_menu_set_current_value (CtkDropDownMenu *d, gint value); void ctk_drop_down_menu_set_value_sensitive (CtkDropDownMenu *d, gint value, gboolean sensitive); void ctk_drop_down_menu_reset (CtkDropDownMenu *d); GObject *ctk_drop_down_menu_change_object(GtkWidget* widget); G_END_DECLS #endif /* __CTK_DROP_DOWN_MENU_H__*/ nvidia-settings/src/gtk+-2.x/ctkutils.h0000664000175000017500000000613012236467170020111 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_UTILS_H__ #define __CTK_UTILS_H__ #include #include #include "ctkconfig.h" G_BEGIN_DECLS // GValues must be initialized before they are used. This macro is // only available since glib 2.30 #ifndef G_VALUE_INIT # define G_VALUE_INIT { 0, { { 0 } } } #endif gchar *get_pcie_generation_string(NvCtrlAttributeHandle *handle); gchar *get_pcie_link_width_string(NvCtrlAttributeHandle *handle, gint attribute); gchar *get_pcie_link_speed_string(NvCtrlAttributeHandle *handle, gint attribute); gchar* create_gpu_name_string(NvCtrlAttributeHandle *gpu_handle); gchar* create_display_name_list_string(NvCtrlAttributeHandle *handle, unsigned int attr); GtkWidget *add_table_row_with_help_text(GtkWidget *table, CtkConfig *ctk_config, const char *help, const gint row, const gint col, // 0 = left, 1 = right const gfloat name_xalign, // 0 = top, 1 = bottom const gfloat name_yalign, const gchar *name, const gfloat value_xalign, const gfloat value_yalign, const gchar *value); GtkWidget *add_table_row(GtkWidget *, const gint, const gfloat, const gfloat, const gchar *, const gfloat, const gfloat, const gchar *); GtkWidget * ctk_get_parent_window(GtkWidget *child); void ctk_display_error_msg(GtkWidget *parent, gchar *msg); void ctk_display_warning_msg(GtkWidget *parent, gchar *msg); void ctk_empty_container(GtkWidget *); void update_display_enabled_flag(NvCtrlAttributeHandle *handle, gboolean *display_enabled); gboolean ctk_check_min_gtk_version(guint required_major, guint required_minor, guint required_micro); void ctk_force_text_colors_on_widget(GtkWidget *widget); G_END_DECLS #endif /* __CTK_UTILS_H__ */ nvidia-settings/src/gtk+-2.x/ctklicense.h0000664000175000017500000000421512236467170020375 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2009 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_LICENSE_DIALOG_H__ #define __CTK_LICENSE_DIALOG_H__ #include "ctkevent.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_LICENSE_DIALOG (ctk_license_dialog_get_type()) #define CTK_LICENSE_DIALOG(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_LICENSE_DIALOG, \ CtkLicenseDialog)) #define CTK_LICENSE_DIALOG_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_LICENSE_DIALOG, \ CtkLicenseDialogClass)) #define CTK_IS_LICENSE_DIALOG(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_LICENSE_DIALOG)) #define CTK_IS_LICENSE_DIALOG_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_LICENSE_DIALOG)) #define CTK_LICENSE_DIALOG_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_LICENSE_DIALOG, \ CtkLicenseDialogClass)) typedef struct _CtkLicenseDialog CtkLicenseDialog; typedef struct _CtkLicenseDialogClass CtkLicenseDialogClass; struct _CtkLicenseDialog { GtkVBox parent; GtkWidget *window; GtkWidget *dialog; }; struct _CtkLicenseDialogClass { GtkVBoxClass parent_class; }; GType ctk_license_dialog_get_type (void) G_GNUC_CONST; GtkWidget* ctk_license_dialog_new (GtkWidget *object, gchar *panel_name); gint ctk_license_run_dialog(CtkLicenseDialog *ctk_license_dialog); G_END_DECLS #endif /* __CTK_LICENSE_DIALOG_H__ */ nvidia-settings/src/gtk+-2.x/ctkimagesliders.h0000664000175000017500000000523212236467170021423 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_IMAGE_SLIDERS_H__ #define __CTK_IMAGE_SLIDERS_H__ #include "ctkevent.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_IMAGE_SLIDERS (ctk_image_sliders_get_type()) #define CTK_IMAGE_SLIDERS(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_IMAGE_SLIDERS, \ CtkImageSliders)) #define CTK_IMAGE_SLIDERS_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_IMAGE_SLIDERS, \ CtkImageSlidersClass)) #define CTK_IS_IMAGE_SLIDERS(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_IMAGE_SLIDERS)) #define CTK_IS_IMAGE_SLIDERS_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_IMAGE_SLIDERS)) #define CTK_IMAGE_SLIDERS_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_IMAGE_SLIDERS, \ CtkImageSlidersClass)) typedef struct _CtkImageSliders CtkImageSliders; typedef struct _CtkImageSlidersClass CtkImageSlidersClass; struct _CtkImageSliders { GtkVBox parent; NvCtrlAttributeHandle *handle; char *name; CtkConfig *ctk_config; CtkEvent *ctk_event; GtkWidget *reset_button; GtkWidget *frame; GtkWidget *digital_vibrance; GtkWidget *image_sharpening; }; struct _CtkImageSlidersClass { GtkVBoxClass parent_class; }; GType ctk_image_sliders_get_type (void) G_GNUC_CONST; GtkWidget* ctk_image_sliders_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *, GtkWidget *reset_button, char *name); void ctk_image_sliders_reset(CtkImageSliders *); void ctk_image_sliders_setup(CtkImageSliders *ctk_image_sliders); void add_image_sliders_help(CtkImageSliders *ctk_image_sliders, GtkTextBuffer *b, GtkTextIter *i); G_END_DECLS #endif /* __CTK_IMAGE_SLIDERS_H__ */ nvidia-settings/src/gtk+-2.x/ctkevent.h0000664000175000017500000000425512236467170020100 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_EVENT_H__ #define __CTK_EVENT_H__ #include #include "NvCtrlAttributes.h" G_BEGIN_DECLS #define CTK_TYPE_EVENT (ctk_event_get_type()) #define CTK_EVENT(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_EVENT, CtkEvent)) #define CTK_EVENT_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_EVENT, CtkEventClass)) #define CTK_IS_EVENT(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_EVENT)) #define CTK_IS_EVENT_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_EVENT)) #define CTK_EVENT_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_EVENT, CtkEventClass)) typedef struct _CtkEvent CtkEvent; typedef struct _CtkEventClass CtkEventClass; typedef struct _CtkEventStruct CtkEventStruct; struct _CtkEvent { GtkObject parent; NvCtrlAttributeHandle *handle; }; struct _CtkEventClass { GtkObjectClass parent_class; }; struct _CtkEventStruct { gint attribute; gint value; guint display_mask; gboolean is_availability_changed; }; GType ctk_event_get_type (void) G_GNUC_CONST; GtkObject* ctk_event_new (NvCtrlAttributeHandle*); void ctk_event_emit(CtkEvent *ctk_event, unsigned int mask, int attrib, int value); void ctk_event_emit_string(CtkEvent *ctk_event, unsigned int mask, int attrib); #define CTK_EVENT_NAME(x) ("CTK_EVENT_" #x) G_END_DECLS #endif /* __CTK_EVENT_H__ */ nvidia-settings/src/gtk+-2.x/ctkclocks.c0000664000175000017500000013060712236467170020231 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /**** INCLUDES ***************************************************************/ #include #include #include "ctkbanner.h" #include "ctkclocks.h" #include "ctklicense.h" #include "ctkscale.h" #include "ctkhelp.h" #include "ctkevent.h" #include "ctkconstants.h" #include "ctkdropdownmenu.h" /**** DEFINES ****************************************************************/ /* GUI padding space around frames */ #define FRAME_PADDING 5 /**** MACROS *****************************************************************/ /* Setting/Getting GPU and Memory frequencies from packed int */ #define GET_GPU_CLOCK(C) ( (C) >> 16 ) #define GET_MEM_CLOCK(C) ( (C) & 0xFFFF ) #define MAKE_CLOCKS(G, M) ( ((G) << 16) | ((M) & 0xFFFF) ) /**** PROTOTYPES *************************************************************/ static void overclocking_state_update_gui(CtkClocks *ctk_object); static void overclocking_state_toggled(GtkWidget *widget, gpointer user_data); static void overclocking_state_received(GtkObject *object, gpointer arg1, gpointer user_data); static void auto_detection_state_received(GtkObject *object, gpointer arg1, gpointer user_data); static void sync_gui_to_modify_clocks(CtkClocks *ctk_object, int which_clocks); static void set_clocks_value(CtkClocks *ctk_object, int clocks, int which_clocks); static void adjustment_value_changed(GtkAdjustment *adjustment, gpointer user_data); static void clock_menu_changed(GtkWidget *widget, gpointer user_data); static void apply_clocks_clicked(GtkWidget *widget, gpointer user_data); static void detect_clocks_clicked(GtkWidget *widget, gpointer user_data); static void reset_clocks_clicked(GtkWidget *widget, gpointer user_data); static void clocks_received(GtkObject *object, gpointer arg1, gpointer user_data); /**** GLOBALS ****************************************************************/ static gboolean __license_accepted = FALSE; /* Tooltips */ static const char * __enable_button_help = "The Enable Overclocking checkbox enables access to GPU and graphics card " "memory interface overclocking functionality. Note that overclocking your " "GPU and/or graphics card memory interface is not recommended and is done " "at your own risk. You should never have to enable this."; static const char * __clock_menu_help = "Selects which clock frequencies to modify. Standard (2D) only affects 2D " "applications. Performance (3D) only affects 3D applications."; static const char * __graphics_clock_help = "The Graphics Clock Frequency is the core clock speed that the NVIDIA " "GPU will be set to when the graphics card is operating in this mode (2D/3D)."; static const char * __mem_clock_help = "The Memory Clock Frequency is the clock speed of the memory interface on " "the graphics card. On some systems, the clock frequency is required to " "be the same for both 2D and 3D modes. For these systems, setting the 2D " "memory clock frequency will also set the 3D memory clock frequency."; static const char * __apply_button_help = "The Apply button allows you to set the desired clock frequencies for the " "GPU and graphics card memory interface. Slider positions are only applied " "after clicking this button."; static const char * __detect_button_help = "The Auto Detect button determines the maximum clock setting that is safe " "on your system at this instant. The maximum clock setting determined here " "can vary on consecutive runs and depends on how well the system handles the " "auto-detection stress tests. This is only available for 3D clock " "frequencies. You must click the Apply button to set the results found."; static const char * __cancel_button_help = "The Cancel Detection button allows you to cancel testing for the optimal 3D " "clock frequencies."; static const char * __reset_button_help = "The Reset Hardware Defaults button lets you restore the original GPU and " "memory interface clock frequencies."; /* Messages */ static const char * __detect_confirm_msg = "To find the best 3D clock frequencies your system supports,\n" "a series of tests will take place. This testing may take several " "minutes.\n"; static const char * __detect_wait_msg = "Optimal 3D clock frequencies are being probed, please wait..."; static const char * __canceled_msg = "Probing for optimal 3D clock frequencies has been canceled."; /**** FUNCTIONS **************************************************************/ /***** * * Returns the gpu overclocking ctk object type. * */ GType ctk_clocks_get_type(void) { static GType ctk_object_type = 0; if (!ctk_object_type) { static const GTypeInfo ctk_object_info = { sizeof (CtkClocksClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof(CtkClocks), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_object_type = g_type_register_static (GTK_TYPE_VBOX, "CtkClocks", &ctk_object_info, 0); } return ctk_object_type; } /* ctk_clocks_get_type() */ /***** * * Main CTK widget creation. * */ GtkWidget* ctk_clocks_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event) { GObject *object; CtkClocks *ctk_object; GtkObject *adjustment; GtkWidget *alignment; GtkWidget *scale; CtkDropDownMenu *menu; GtkWidget *label; GtkWidget *frame; GtkWidget *banner; GtkWidget *hbox; GtkWidget *vbox; ReturnStatus ret; /* NvCtrlxxx function return value */ int value, i = 0; int clocks_2D; NVCTRLAttributeValidValuesRec ranges_2D; NVCTRLAttributeValidValuesRec range_detection; int clocks_3D; NVCTRLAttributeValidValuesRec ranges_3D; Bool overclocking_enabled; Bool auto_detection_available = FALSE; Bool probing_optimal = FALSE; Bool can_access_2d_clocks; Bool can_access_3d_clocks; /* Make sure we have a handle */ g_return_val_if_fail(handle != NULL, NULL); /* If we can't query the overclocking state, don't load the page */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_OVERCLOCKING_STATE, &value); if ( ret != NvCtrlSuccess ) return NULL; overclocking_enabled = (value==NV_CTRL_GPU_OVERCLOCKING_STATE_MANUAL)?True:False; /* Check if overclocking is busy */ if ( overclocking_enabled ) { ret = NvCtrlGetValidAttributeValues(handle, NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION, &range_detection); if ( ret == NvCtrlSuccess ) { ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE, &value); if ( ret != NvCtrlSuccess ) return NULL; probing_optimal = (value == NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_BUSY); auto_detection_available = TRUE; } } /* Can we access the 2D clocks? */ can_access_2d_clocks = True; ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_2D_CLOCK_FREQS, &clocks_2D); if ( ret != NvCtrlSuccess ) can_access_2d_clocks = False; ret = NvCtrlGetValidAttributeValues(handle, NV_CTRL_GPU_2D_CLOCK_FREQS, &ranges_2D); if ( ret != NvCtrlSuccess ) can_access_2d_clocks = False; /* Can we access the 3D clocks? */ can_access_3d_clocks = True; ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_3D_CLOCK_FREQS, &clocks_3D); if ( ret != NvCtrlSuccess ) can_access_3d_clocks = False; ret = NvCtrlGetValidAttributeValues(handle, NV_CTRL_GPU_3D_CLOCK_FREQS, &ranges_3D); if ( ret != NvCtrlSuccess ) can_access_3d_clocks = False; /* If we can't access either of the clocks, don't load the page */ if ( !can_access_2d_clocks && !can_access_3d_clocks ) return NULL; /* Create the ctk object */ object = g_object_new(CTK_TYPE_CLOCKS, NULL); ctk_object = CTK_CLOCKS(object); /* Cache the handle and configuration */ ctk_object->handle = handle; ctk_object->ctk_config = ctk_config; ctk_object->overclocking_enabled = overclocking_enabled; ctk_object->auto_detection_available = auto_detection_available; ctk_object->probing_optimal = probing_optimal; if ( overclocking_enabled ) { __license_accepted = TRUE; } /* Create the Clock menu widget */ menu = (CtkDropDownMenu *) ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO); i = 0; if ( can_access_2d_clocks ) { ctk_drop_down_menu_append_item(menu, "2D Clock Frequencies", i++); } if ( can_access_3d_clocks ) { ctk_drop_down_menu_append_item(menu, "3D Clock Frequencies", i++); } ctk_object->clock_menu = GTK_WIDGET(menu); g_signal_connect(G_OBJECT(ctk_object->clock_menu), "changed", G_CALLBACK(clock_menu_changed), (gpointer) ctk_object); ctk_config_set_tooltip(ctk_config, ctk_object->clock_menu, __clock_menu_help); gtk_widget_set_sensitive(ctk_object->clock_menu, overclocking_enabled && !probing_optimal); /* Create the Graphics clock frequency slider widget */ if ( can_access_2d_clocks ) { adjustment = gtk_adjustment_new(GET_GPU_CLOCK(clocks_2D), GET_GPU_CLOCK(ranges_2D.u.range.min), GET_GPU_CLOCK(ranges_2D.u.range.max), 1, 5, 0.0); ctk_object->clocks_being_modified = CLOCKS_2D; } else { adjustment = gtk_adjustment_new(GET_GPU_CLOCK(clocks_3D), GET_GPU_CLOCK(ranges_3D.u.range.min), GET_GPU_CLOCK(ranges_3D.u.range.max), 1, 5, 0.0); ctk_object->clocks_being_modified = CLOCKS_3D; } scale = ctk_scale_new(GTK_ADJUSTMENT(adjustment), "GPU (MHz)", ctk_config, G_TYPE_INT); ctk_object->gpu_clk_scale = scale; g_signal_connect(adjustment, "value_changed", G_CALLBACK(adjustment_value_changed), (gpointer) ctk_object); ctk_config_set_tooltip(ctk_config, CTK_SCALE(ctk_object->gpu_clk_scale)->gtk_scale, __graphics_clock_help); gtk_widget_set_sensitive(ctk_object->gpu_clk_scale, overclocking_enabled && !probing_optimal); /* Create the Memory clock frequency slider widget */ if ( can_access_2d_clocks ) { adjustment = gtk_adjustment_new(GET_MEM_CLOCK(clocks_2D), GET_MEM_CLOCK(ranges_2D.u.range.min), GET_MEM_CLOCK(ranges_2D.u.range.max), 1, 5, 0.0); } else { adjustment = gtk_adjustment_new(GET_MEM_CLOCK(clocks_3D), GET_MEM_CLOCK(ranges_3D.u.range.min), GET_MEM_CLOCK(ranges_3D.u.range.max), 1, 5, 0.0); } scale = ctk_scale_new(GTK_ADJUSTMENT(adjustment), "Memory (MHz)", ctk_config, G_TYPE_INT); ctk_object->mem_clk_scale = scale; g_signal_connect(adjustment, "value_changed", G_CALLBACK(adjustment_value_changed), (gpointer) ctk_object); ctk_config_set_tooltip(ctk_config, CTK_SCALE(ctk_object->mem_clk_scale)->gtk_scale, __mem_clock_help); gtk_widget_set_sensitive(ctk_object->mem_clk_scale, overclocking_enabled && !probing_optimal); /* Create the Enable Overclocking checkbox widget */ ctk_object->enable_checkbox = gtk_check_button_new_with_label("Enable Overclocking"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_object->enable_checkbox), overclocking_enabled); gtk_widget_set_sensitive(ctk_object->enable_checkbox, overclocking_enabled && !probing_optimal); g_signal_connect(G_OBJECT(ctk_object->enable_checkbox), "toggled", G_CALLBACK(overclocking_state_toggled), (gpointer) ctk_object); ctk_config_set_tooltip(ctk_config, ctk_object->enable_checkbox, __enable_button_help); gtk_widget_set_sensitive(ctk_object->enable_checkbox, !probing_optimal); /* Create the Apply button widget */ ctk_object->apply_button = gtk_button_new_with_label("Apply"); g_signal_connect(G_OBJECT(ctk_object->apply_button), "clicked", G_CALLBACK(apply_clocks_clicked), (gpointer) ctk_object); ctk_config_set_tooltip(ctk_config, ctk_object->apply_button, __apply_button_help); gtk_widget_set_sensitive(ctk_object->apply_button, False); /* Create the Auto Detect button widget */ ctk_object->detect_button = gtk_button_new_with_label("Auto Detect"); g_signal_connect(G_OBJECT(ctk_object->detect_button), "clicked", G_CALLBACK(detect_clocks_clicked), (gpointer) ctk_object); ctk_config_set_tooltip(ctk_config, ctk_object->detect_button, __detect_button_help); if ( ctk_object->clocks_being_modified == CLOCKS_2D ) { gtk_widget_set_sensitive(ctk_object->detect_button, False); } else { gtk_widget_set_sensitive(ctk_object->detect_button, overclocking_enabled && auto_detection_available && !probing_optimal); } /* Create the Reset hardware button widget */ ctk_object->reset_button = gtk_button_new_with_label("Reset Hardware Defaults"); g_signal_connect(G_OBJECT(ctk_object->reset_button), "clicked", G_CALLBACK(reset_clocks_clicked), (gpointer) ctk_object); ctk_config_set_tooltip(ctk_config, ctk_object->reset_button, __reset_button_help); gtk_widget_set_sensitive(ctk_object->reset_button, False); /* Create the enable dialog */ ctk_object->license_dialog = ctk_license_dialog_new(GTK_WIDGET(ctk_object), "Clock Frequencies"); /* Create the auto detect dialog */ ctk_object->detect_dialog = gtk_dialog_new_with_buttons("Auto Detect Optimal 3D Clock Frequencies?", GTK_WINDOW(gtk_widget_get_parent(GTK_WIDGET(ctk_object))), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); label = gtk_label_new(__detect_confirm_msg); hbox = gtk_hbox_new(TRUE, 15); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 15); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ctk_object->detect_dialog)->vbox), hbox, FALSE, FALSE, 15); /* * Now that we've created all the widgets we care about, we're * ready to compose the panel */ /* Set container properties of the ctk object */ gtk_box_set_spacing(GTK_BOX(ctk_object), 10); banner = ctk_banner_image_new(BANNER_ARTWORK_CLOCK); gtk_box_pack_start(GTK_BOX(object), banner, FALSE, FALSE, 0); /* Add Overclocking checkbox */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->enable_checkbox, FALSE, FALSE, 0); /* Add Clock frequency frame */ frame = gtk_frame_new("Clock Frequencies"); vbox = gtk_vbox_new(FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(vbox), FRAME_PADDING); gtk_box_pack_start(GTK_BOX(object), frame, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(frame), vbox); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->clock_menu, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), ctk_object->gpu_clk_scale, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), ctk_object->mem_clk_scale, FALSE, FALSE, 5); /* Add the Apply, Auto Detect, and Reset buttons */ hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->apply_button, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(hbox), ctk_object->detect_button); gtk_container_add(GTK_CONTAINER(hbox), ctk_object->reset_button); alignment = gtk_alignment_new(1, 1, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), hbox); gtk_box_pack_start(GTK_BOX(object), alignment, TRUE, TRUE, 0); /* Setup the initial gui state */ sync_gui_to_modify_clocks(ctk_object, ctk_object->clocks_being_modified); /* Handle events from other NV-CONTROL clients */ g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_GPU_OVERCLOCKING_STATE), G_CALLBACK(overclocking_state_received), (gpointer) ctk_object); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_GPU_2D_CLOCK_FREQS), G_CALLBACK(clocks_received), (gpointer) ctk_object); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_GPU_3D_CLOCK_FREQS), G_CALLBACK(clocks_received), (gpointer) ctk_object); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS), G_CALLBACK(clocks_received), (gpointer) ctk_object); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE), G_CALLBACK(auto_detection_state_received), (gpointer) ctk_object); /* Show the widget */ gtk_widget_show_all(GTK_WIDGET(ctk_object)); return GTK_WIDGET(ctk_object); } /* ctk_clocks_new() */ /***** * * GPU overclocking help screen. * */ GtkTextBuffer *ctk_clocks_create_help(GtkTextTagTable *table, CtkClocks *ctk_object) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "Clock Frequency Overclocking Help"); ctk_help_para(b, &i, "WARNING: Overclocking has the potential of destroying your " "graphics card, CPU, RAM and any other component. It may " "also reduce the life expectancy of your components and " "void manufacturer warranties. DO THIS AT YOUR OWN RISK." ); ctk_help_heading(b, &i, "Enabling Clock Frequencies"); ctk_help_para(b, &i, "%s", __enable_button_help); ctk_help_para(b, &i, "GPU Overclocking functionality is currently limited to " "GeForce FX and newer non-mobile GPUs." ); ctk_help_heading(b, &i, "2D/3D Clock Frequencies"); ctk_help_para(b, &i, "The 2D clock frequencies are the standard clock " "frequencies used when only 2D applications are running." ); ctk_help_para(b, &i, "The 3D clock frequencies are the performance clock " "frequencies used when running 3D applications." ); ctk_help_heading(b, &i, "Graphics Clock Frequency"); ctk_help_para(b, &i, "%s", __graphics_clock_help); ctk_help_heading(b, &i, "Memory Clock Frequency"); ctk_help_para(b, &i, "%s", __mem_clock_help); ctk_help_heading(b, &i, "Applying Custom Clock Frequencies"); ctk_help_para(b, &i, "%s", __apply_button_help); ctk_help_heading(b, &i, "Auto Detect Optimal 3D Clock Frequencies"); ctk_help_para(b, &i, "%s", __detect_button_help); ctk_help_heading(b, &i, "Canceling Optimal 3D Clock Frequency Auto-" "detection."); ctk_help_para(b, &i, "%s", __cancel_button_help); ctk_help_para(b, &i, "This button is only available if the Optimal " "clocks are currently being probed."); ctk_help_heading(b, &i, "Restoring Hardware Default Frequencies"); ctk_help_para(b, &i, "%s", __reset_button_help); ctk_help_finish(b); return b; } /* ctk_clocks_create_help() */ /**** * * Updates sensitivity of widgets in relation to the state * of overclocking. * */ static void sync_gui_sensitivity(CtkClocks *ctk_object) { gboolean enabled = ctk_object->overclocking_enabled; gboolean probing = ctk_object->probing_optimal; gboolean modified = ctk_object->clocks_modified; gboolean moved = ctk_object->clocks_moved; /* Update the enable checkbox */ g_signal_handlers_block_by_func(G_OBJECT(ctk_object->enable_checkbox), G_CALLBACK(overclocking_state_toggled), (gpointer) ctk_object); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ctk_object->enable_checkbox), enabled); g_signal_handlers_unblock_by_func(G_OBJECT(ctk_object->enable_checkbox), G_CALLBACK(overclocking_state_toggled), (gpointer) ctk_object); gtk_widget_set_sensitive(ctk_object->enable_checkbox, !probing); /* Update the clock selection dropdown */ gtk_widget_set_sensitive(ctk_object->clock_menu, enabled && !probing); /* Update the Graphics clock slider */ gtk_widget_set_sensitive(ctk_object->gpu_clk_scale, enabled && !probing); /* Update the Memory clock slider */ gtk_widget_set_sensitive(ctk_object->mem_clk_scale, enabled && !probing); /* Update the Apply button */ gtk_widget_set_sensitive(ctk_object->apply_button, enabled && !probing && moved); /* Enable the Auto Detect button for 3D clocks only */ if ( probing ) { gtk_button_set_label(GTK_BUTTON(ctk_object->detect_button), "Cancel Detection"); gtk_widget_set_sensitive(ctk_object->detect_button, True); ctk_config_set_tooltip(ctk_object->ctk_config, ctk_object->detect_button, __cancel_button_help); } else { gboolean set_sensitive; gtk_button_set_label(GTK_BUTTON(ctk_object->detect_button), "Auto Detect"); set_sensitive = ((ctk_object->auto_detection_available) && (ctk_object->clocks_being_modified == CLOCKS_3D)) ? enabled : False; gtk_widget_set_sensitive(ctk_object->detect_button, set_sensitive); ctk_config_set_tooltip(ctk_object->ctk_config, ctk_object->detect_button, __detect_button_help); } /* Update the Reset hardware defaults button */ gtk_widget_set_sensitive(ctk_object->reset_button, enabled && !probing && (moved || modified)); } /* sync_gui_sensitivity() */ /**** * * Updates widgets in relation to current overclocking state. * */ static void overclocking_state_update_gui(CtkClocks *ctk_object) { ReturnStatus ret; int value; NVCTRLAttributeValidValuesRec range_detection; gboolean probing_optimal = TRUE; gboolean enabled; /* We need to check the overclocking state status with * the server every time someone tries to change the state * because the set might have failed. */ ret = NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_GPU_OVERCLOCKING_STATE, &value); if ( ret != NvCtrlSuccess ) enabled = False; else enabled = (value==NV_CTRL_GPU_OVERCLOCKING_STATE_MANUAL)?True:False; ctk_object->overclocking_enabled = enabled; /* We need to also make sure the server is not busy probing * for the optimal clocks. */ if ( enabled ) { ret = NvCtrlGetValidAttributeValues(ctk_object->handle, NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION, &range_detection); if ( ret == NvCtrlSuccess ) { ret = NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE, &value); if ( ret == NvCtrlSuccess ) { probing_optimal = (value == NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_BUSY); } ctk_object->probing_optimal = probing_optimal; ctk_object->auto_detection_available = TRUE; } } /* Sync the gui to be able to modify the clocks */ sync_gui_to_modify_clocks(ctk_object, ctk_object->clocks_being_modified); /* Update the status bar */ ctk_config_statusbar_message(ctk_object->ctk_config, "GPU overclocking %sabled.", enabled?"en":"dis"); } /* overclocking_state_update_gui() */ /***** * * Signal handler - Called when the user toggles the "Enable Overclocking" * button. * */ static void overclocking_state_toggled(GtkWidget *widget, gpointer user_data) { CtkClocks *ctk_object = CTK_CLOCKS(user_data); gboolean enabled; int value; gint result; /* Get enabled state */ enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); value = (enabled==1) ? NV_CTRL_GPU_OVERCLOCKING_STATE_MANUAL : NV_CTRL_GPU_OVERCLOCKING_STATE_NONE; /* Verify user knows the risks involved */ if ( enabled && !__license_accepted ) { result = ctk_license_run_dialog(CTK_LICENSE_DIALOG(ctk_object->license_dialog)); switch (result) { case GTK_RESPONSE_ACCEPT: __license_accepted = TRUE; break; case GTK_RESPONSE_REJECT: default: /* Cancel */ g_signal_handlers_block_by_func(G_OBJECT(ctk_object->enable_checkbox), G_CALLBACK(overclocking_state_toggled), (gpointer) ctk_object); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), FALSE); g_signal_handlers_unblock_by_func(G_OBJECT(ctk_object->enable_checkbox), G_CALLBACK(overclocking_state_toggled), (gpointer) ctk_object); return; } } /* Update the server */ NvCtrlSetAttribute(ctk_object->handle, NV_CTRL_GPU_OVERCLOCKING_STATE, value); /* Update the GUI */ overclocking_state_update_gui(ctk_object); } /* enable_overclocking_toggled() */ /***** * * Signal handler - Called when another NV-CONTROL client has set the * overclocking state. * */ static void overclocking_state_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkClocks *ctk_object = CTK_CLOCKS(user_data); /* Update GUI with enable status */ overclocking_state_update_gui(ctk_object); } /* overclocking_state_update_received() */ /***** * * Signal handler - Called when overclocking becomes busy due to * an NV-CONTROL client probing for the optimal clocks. * */ static void auto_detection_state_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct = (CtkEventStruct *) arg1; CtkClocks *ctk_object = CTK_CLOCKS(user_data); /* Update GUI with probing status */ ctk_object->probing_optimal = (event_struct->value == NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_BUSY); sync_gui_sensitivity(ctk_object); /* Update the status bar */ if ( ctk_object->probing_optimal ) { ctk_config_statusbar_message(ctk_object->ctk_config, "%s", __detect_wait_msg); } else { ctk_config_statusbar_message(ctk_object->ctk_config, "%s", __canceled_msg); } } /* auto_detection_state_received() */ /***** * * Syncs the gui to properly display the correct clocks the user wants to * modify, or has modified with another NV_CONTROL client. * */ static void sync_gui_to_modify_clocks(CtkClocks *ctk_object, int which_clocks) { GtkRange *gtk_range; GtkAdjustment *gtk_adjustment_gpu; GtkAdjustment *gtk_adjustment_mem; ReturnStatus ret; int clk_values; int default_clk_values; NVCTRLAttributeValidValuesRec clk_ranges; CtkDropDownMenu *menu; menu = CTK_DROP_DOWN_MENU(ctk_object->clock_menu); /* Obtain the current value and range of the desired clocks */ switch (which_clocks) { case CLOCKS_2D: ret = NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_GPU_2D_CLOCK_FREQS, &clk_values); if ( ret != NvCtrlSuccess ) return; ret = NvCtrlGetValidAttributeValues(ctk_object->handle, NV_CTRL_GPU_2D_CLOCK_FREQS, &clk_ranges); if ( ret != NvCtrlSuccess ) return; break; case CLOCKS_3D: ret = NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_GPU_3D_CLOCK_FREQS, &clk_values); if ( ret != NvCtrlSuccess ) return; ret = NvCtrlGetValidAttributeValues(ctk_object->handle, NV_CTRL_GPU_3D_CLOCK_FREQS, &clk_ranges); if ( ret != NvCtrlSuccess ) return; break; case CLOCKS_NONE: default: return; } /* See if the clocks were modified */ ret = NvCtrlGetAttribute(ctk_object->handle, which_clocks==CLOCKS_2D? NV_CTRL_GPU_DEFAULT_2D_CLOCK_FREQS: NV_CTRL_GPU_DEFAULT_3D_CLOCK_FREQS, &default_clk_values); ctk_object->clocks_modified = ((ret == NvCtrlSuccess) && (default_clk_values != clk_values)); if ( ctk_object->clocks_being_modified != which_clocks ) { ctk_object->clocks_moved = False; } ctk_object->clocks_being_modified = which_clocks; /* Make sure the dropdown reflects the right clock set */ g_signal_handlers_block_by_func(G_OBJECT(ctk_object->clock_menu), G_CALLBACK(clock_menu_changed), (gpointer) ctk_object); ctk_drop_down_menu_set_current_value(menu, (which_clocks==CLOCKS_2D)?0:1); g_signal_handlers_unblock_by_func(G_OBJECT(ctk_object->clock_menu), G_CALLBACK(clock_menu_changed), (gpointer) ctk_object); /* Make GPU and Memory clocks reflect the right range/values */ gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->gpu_clk_scale)->gtk_scale); gtk_adjustment_gpu = GTK_ADJUSTMENT(gtk_range->adjustment); g_signal_handlers_block_by_func(G_OBJECT(gtk_adjustment_gpu), G_CALLBACK(adjustment_value_changed), (gpointer) ctk_object); gtk_range_set_range(gtk_range, GET_GPU_CLOCK(clk_ranges.u.range.min), GET_GPU_CLOCK(clk_ranges.u.range.max)); g_signal_handlers_unblock_by_func(G_OBJECT(gtk_adjustment_gpu), G_CALLBACK(adjustment_value_changed), (gpointer) ctk_object); gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->mem_clk_scale)->gtk_scale); gtk_adjustment_mem = GTK_ADJUSTMENT(gtk_range->adjustment); g_signal_handlers_block_by_func(G_OBJECT(gtk_adjustment_mem), G_CALLBACK(adjustment_value_changed), (gpointer) ctk_object); gtk_range_set_range(gtk_range, GET_MEM_CLOCK(clk_ranges.u.range.min), GET_MEM_CLOCK(clk_ranges.u.range.max)); set_clocks_value(ctk_object, clk_values, which_clocks); g_signal_handlers_unblock_by_func(G_OBJECT(gtk_adjustment_mem), G_CALLBACK(adjustment_value_changed), (gpointer) ctk_object); /* Update the gui sensitivity */ sync_gui_sensitivity(ctk_object); } /* sync_gui_to_modify_clocks() */ /***** * * Helper function - Sets the value of the clock frequencies scales * */ static void set_clocks_value(CtkClocks *ctk_object, int clocks, int which_clocks) { GtkRange *gtk_range; /* Update the clock values */ if ( ctk_object->gpu_clk_scale ) { gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->gpu_clk_scale)->gtk_scale); gtk_range_set_value(gtk_range, GET_GPU_CLOCK(clocks)); } if ( ctk_object->mem_clk_scale ) { gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->mem_clk_scale)->gtk_scale); gtk_range_set_value(gtk_range, GET_MEM_CLOCK(clocks)); } } /* set_clocks_value() */ /***** * * Signal handler - Handles slider adjustments by the user. * */ static void adjustment_value_changed(GtkAdjustment *adjustment, gpointer user_data) { CtkClocks *ctk_object = CTK_CLOCKS(user_data); /* Enable the apply button */ gtk_widget_set_sensitive(ctk_object->apply_button, True); /* Enable the reset button */ gtk_widget_set_sensitive(ctk_object->reset_button, True); /* Set the clocks moved flag */ ctk_object->clocks_moved = True; } /* adjustment_value_changed() */ /***** * * Signal handler - User selected a clock set from the clock menu. * */ static void clock_menu_changed(GtkWidget *widget, gpointer user_data) { CtkClocks *ctk_object = CTK_CLOCKS(user_data); CtkDropDownMenu *menu = CTK_DROP_DOWN_MENU(widget); gint history; /* Sync to allow user to modify the clocks */ history = ctk_drop_down_menu_get_current_value(menu); switch (history) { default: /* Fall through */ case 0: /* 2D */ sync_gui_to_modify_clocks(ctk_object, CLOCKS_2D); break; case 1: /* 3D */ sync_gui_to_modify_clocks(ctk_object, CLOCKS_3D); break; } } /* clock_menu_changed() */ /***** * * Signal handler - User clicked the "apply" button. * */ static void apply_clocks_clicked(GtkWidget *widget, gpointer user_data) { CtkClocks *ctk_object = CTK_CLOCKS(user_data); GtkRange *gtk_range; ReturnStatus ret; int gpu_clk; int mem_clk; int clocks; /* Update server clocks with values from scales */ if ( !ctk_object->gpu_clk_scale || !ctk_object->mem_clk_scale ) return; /* Get new clock values from sliders */ gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->gpu_clk_scale)->gtk_scale); gpu_clk = gtk_range_get_value(gtk_range); gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->mem_clk_scale)->gtk_scale); mem_clk = gtk_range_get_value(gtk_range); clocks = MAKE_CLOCKS(gpu_clk, mem_clk); /* Set clocks on server */ ret = NvCtrlSetAttribute(ctk_object->handle, (ctk_object->clocks_being_modified==CLOCKS_2D) ? NV_CTRL_GPU_2D_CLOCK_FREQS : NV_CTRL_GPU_3D_CLOCK_FREQS, clocks); if ( ret != NvCtrlSuccess ) { ctk_config_statusbar_message(ctk_object->ctk_config, "Failed to set clock frequencies!"); return; } /* Clear the clocks moved flag */ ctk_object->clocks_moved = False; /* Sync up with the server */ sync_gui_to_modify_clocks(ctk_object, ctk_object->clocks_being_modified); gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->gpu_clk_scale)->gtk_scale); gpu_clk = gtk_range_get_value(gtk_range); gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->mem_clk_scale)->gtk_scale); mem_clk = gtk_range_get_value(gtk_range); ctk_config_statusbar_message(ctk_object->ctk_config, "Set %s clocks to (GPU) %i MHz, " "(Memory) %i MHz", (ctk_object->clocks_being_modified==CLOCKS_2D)? "2D":"3D", gpu_clk, mem_clk); } /* apply_clocks_clicked() */ /***** * * Signal handler - User clicked the 'reset hardware defaults' button. * */ static void reset_clocks_clicked(GtkWidget *widget, gpointer user_data) { CtkClocks *ctk_object = CTK_CLOCKS(user_data); int clocks; ReturnStatus ret; /* Get the default clock frequencies */ ret = NvCtrlGetAttribute(ctk_object->handle, (ctk_object->clocks_being_modified==CLOCKS_2D) ? NV_CTRL_GPU_DEFAULT_2D_CLOCK_FREQS : NV_CTRL_GPU_DEFAULT_3D_CLOCK_FREQS, &clocks); if ( ret != NvCtrlSuccess ) goto fail; /* Set clock frequencies to use default values */ ret = NvCtrlSetAttribute(ctk_object->handle, (ctk_object->clocks_being_modified==CLOCKS_2D) ? NV_CTRL_GPU_2D_CLOCK_FREQS : NV_CTRL_GPU_3D_CLOCK_FREQS, clocks); if ( ret != NvCtrlSuccess ) goto fail; /* Set slider positions */ set_clocks_value(ctk_object, clocks, ctk_object->clocks_being_modified); ctk_config_statusbar_message(ctk_object->ctk_config, "Reset %s clock frequency " "hardware defaults.", (ctk_object->clocks_being_modified==CLOCKS_2D)? "2D":"3D"); /* Disable the apply button */ gtk_widget_set_sensitive(ctk_object->apply_button, False); /* Disable the reset button */ gtk_widget_set_sensitive(ctk_object->reset_button, False); return; fail: ctk_config_statusbar_message(ctk_object->ctk_config, "Failed to reset clock frequencies!"); return; } /* reset_clocks_clicked() */ /***** * * Signal handler - User clicked the 'auto detect/cancel' button. * */ static void detect_clocks_clicked(GtkWidget *widget, gpointer user_data) { CtkClocks *ctk_object = CTK_CLOCKS(user_data); gint result; if ( ctk_object->probing_optimal ) { /* Stop the test for optimal clock freqs */ NvCtrlSetAttribute(ctk_object->handle, NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION, NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_CANCEL); } else { /* User must hit the OK button to start the testing */ gtk_widget_show_all(ctk_object->detect_dialog); result = gtk_dialog_run (GTK_DIALOG (ctk_object->detect_dialog)); gtk_widget_hide(ctk_object->detect_dialog); switch (result) { case GTK_RESPONSE_ACCEPT: /* Start the test for optimal clock freqs */ NvCtrlSetAttribute(ctk_object->handle, NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION, NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_START); break; case GTK_RESPONSE_REJECT: default: /* Do nothing. */ return; } } return; } /* detect_clocks_clicked() */ /***** * * Signal handler - Handles incoming NV-CONTROL messages caused by clocks * being changed. * */ static void clocks_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct = (CtkEventStruct *) arg1; CtkClocks *ctk_object = CTK_CLOCKS(user_data); int clocks = event_struct->value; /* Some hardware requires that the memory clocks be the same for * both the 2D and 3D clock frequency setting. Therefore, we * always need to check what the current clocks we're modifying * have been set to on clock events. */ switch (event_struct->attribute) { case NV_CTRL_GPU_2D_CLOCK_FREQS: sync_gui_to_modify_clocks(ctk_object, CLOCKS_2D); ctk_config_statusbar_message(ctk_object->ctk_config, "Set 2D clocks to (GPU) %i MHz, " "(Memory) %i MHz", GET_GPU_CLOCK(clocks), GET_MEM_CLOCK(clocks)); break; case NV_CTRL_GPU_3D_CLOCK_FREQS: sync_gui_to_modify_clocks(ctk_object, CLOCKS_3D); ctk_config_statusbar_message(ctk_object->ctk_config, "Set 3D clocks to (GPU) %i MHz, " "(Memory) %i MHz", GET_GPU_CLOCK(clocks), GET_MEM_CLOCK(clocks)); break; case NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS: ctk_object->probing_optimal = False; ctk_config_statusbar_message(ctk_object->ctk_config, "Found optimal 3D clocks: (GPU) %i MHz, " "(Memory) %i MHz", GET_GPU_CLOCK(clocks), GET_MEM_CLOCK(clocks)); /* Only update gui if user is on 3D clocks */ if ( ctk_object->clocks_being_modified == CLOCKS_3D ) { /* Update clock values */ set_clocks_value(ctk_object, clocks, CLOCKS_3D); /* Allow user to apply the settings */ if ( ctk_object->apply_button ) gtk_widget_set_sensitive(ctk_object->apply_button, True); } break; default: break; } } /* clocks_received() */ /***** * * Callback Function - This function gets called when the GPU Overclocking * page gets selected from the tree view. * */ void ctk_clocks_select(GtkWidget *widget) { CtkClocks *ctk_object = CTK_CLOCKS(widget); ReturnStatus ret; int value; /* See if we're busy probing for optimal clocks so we can tell the user */ ret = NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE, &value); if ( ret == NvCtrlSuccess && value == NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_BUSY ) { ctk_config_statusbar_message(ctk_object->ctk_config, "%s", __detect_wait_msg); } } nvidia-settings/src/gtk+-2.x/ctkgvo-banner.c0000664000175000017500000006320412236467170021007 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * The CtkGvoBanner widget is in charge of displaying the GVO Banner image. * The LEDs are drawn based on the state currently set by the * ctk_gvo_banner_update_video_output() and * ctk_gvo_banner_update_video_input() functions. It is the caller's * job to set the appropriate state so that the banner can be drawn correctly. */ #include #include #include "NvCtrlAttributes.h" #include "ctkhelp.h" #include "ctkgvo-banner.h" #include "ctkutils.h" #include "ctkbanner.h" #include "msg.h" /* values for controlling LED state */ #define GVO_LED_VID_OUT_NOT_IN_USE 0 #define GVO_LED_VID_OUT_HD_MODE 1 #define GVO_LED_VID_OUT_SD_MODE 2 #define GVO_LED_SDI_SYNC_NONE 0 #define GVO_LED_SDI_SYNC_HD 1 #define GVO_LED_SDI_SYNC_SD 2 #define GVO_LED_SDI_SYNC_ERROR 3 #define GVO_LED_COMP_SYNC_NONE 0 #define GVO_LED_COMP_SYNC_SYNC 1 /* LED colors */ #define LED_GREY 0 #define LED_GREEN 1 #define LED_YELLOW 2 #define LED_RED 3 /* How often the LEDs in the banner should be updated */ #define UPDATE_GVO_BANNER_TIME_INTERVAL 200 #define DEFAULT_GVO_PROBE_TIME_INTERVAL 1000 /* Position of LEDs relative to the SDI image, used for drawing LEDs */ static int __led_pos_x[] = { 74, 101, 128, 156 }; // From sdi.png static int __led_pos_y = 36; // From sdi.png /* local prototypes */ static void composite_callback(CtkBanner *ctk_banner, void *data); static gboolean update_gvo_banner_led_images(gpointer data); static gboolean update_gvo_banner_led_images_shared_sync_bnc(gpointer data); static void update_gvo_banner_led_state(CtkGvoBanner *ctk_gvo_banner); static void gvo_event_received(GtkObject *object, gpointer arg1, gpointer user_data); /* * ctk_gvo_banner_get_type() - Returns the GType for a CtkGvoBanner object */ GType ctk_gvo_banner_get_type(void) { static GType ctk_gvo_banner_type = 0; if (!ctk_gvo_banner_type) { static const GTypeInfo ctk_gvo_banner_info = { sizeof (CtkGvoBannerClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* constructor */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkGvoBanner), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_gvo_banner_type = g_type_register_static(GTK_TYPE_VBOX, "CtkGvoBanner", &ctk_gvo_banner_info, 0); } return ctk_gvo_banner_type; } /* ctk_gvo_banner_get_type() */ /* * ctk_gvo_banner_new() - constructor for the CtkGvoBanner widget */ GtkWidget* ctk_gvo_banner_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event) { GObject *object; CtkGvoBanner *ctk_gvo_banner; ReturnStatus ret; gint val; gint caps; /* make sure we have a handle */ g_return_val_if_fail(handle != NULL, NULL); /* check if this screen supports GVO */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GVO_SUPPORTED, &val); if ((ret != NvCtrlSuccess) || (val != NV_CTRL_GVO_SUPPORTED_TRUE)) { /* GVO not available */ return NULL; } /* get the GVO capabilities */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GVO_CAPABILITIES, &caps); if (ret != NvCtrlSuccess) { return NULL; } /* create the CtkGvoBanner object */ object = g_object_new(CTK_TYPE_GVO_BANNER, NULL); /* initialize fields in the CtkGvoBanner object */ ctk_gvo_banner = CTK_GVO_BANNER(object); ctk_gvo_banner->handle = handle; ctk_gvo_banner->ctk_config = ctk_config; ctk_gvo_banner->ctk_event = ctk_event; ctk_gvo_banner->parent_box = NULL; /* handle GVO devices that share the sync input differently */ ctk_gvo_banner->shared_sync_bnc = !!(caps & NV_CTRL_GVO_CAPABILITIES_SHARED_SYNC_BNC); /* create the banner image */ if (ctk_gvo_banner->shared_sync_bnc) { ctk_gvo_banner->image = ctk_banner_image_new_with_callback (BANNER_ARTWORK_SDI_SHARED_SYNC_BNC, composite_callback, ctk_gvo_banner); } else { ctk_gvo_banner->image = ctk_banner_image_new_with_callback(BANNER_ARTWORK_SDI, composite_callback, ctk_gvo_banner); } g_object_ref(ctk_gvo_banner->image); gtk_box_pack_start(GTK_BOX(ctk_gvo_banner), ctk_gvo_banner->image, FALSE, FALSE, 0); ctk_gvo_banner->ctk_banner = NULL; /* initialize LED state */ ctk_gvo_banner->state[GVO_BANNER_VID1] = GVO_LED_VID_OUT_NOT_IN_USE; ctk_gvo_banner->state[GVO_BANNER_VID2] = GVO_LED_VID_OUT_NOT_IN_USE; ctk_gvo_banner->state[GVO_BANNER_SDI] = GVO_LED_SDI_SYNC_NONE; ctk_gvo_banner->state[GVO_BANNER_COMP] = GVO_LED_COMP_SYNC_NONE; ctk_gvo_banner->img[GVO_BANNER_VID1] = LED_GREY; ctk_gvo_banner->img[GVO_BANNER_VID2] = LED_GREY; ctk_gvo_banner->img[GVO_BANNER_SDI] = LED_GREY; ctk_gvo_banner->img[GVO_BANNER_COMP] = LED_GREY; /* Get the current GVO state */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GVO_LOCK_OWNER, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVO_LOCK_OWNER_NONE; } ctk_gvo_banner->gvo_lock_owner = val; ret = NvCtrlGetAttribute(handle, NV_CTRL_GVO_SYNC_MODE, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVO_SYNC_MODE_FREE_RUNNING; } ctk_gvo_banner->sync_mode = val; ret = NvCtrlGetAttribute(handle, NV_CTRL_GVO_SYNC_SOURCE, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVO_SYNC_SOURCE_COMPOSITE; } ctk_gvo_banner->sync_source = val; ret = NvCtrlGetAttribute(handle, NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVIO_VIDEO_FORMAT_NONE; } ctk_gvo_banner->output_video_format = val; ret = NvCtrlGetAttribute(handle, NV_CTRL_GVO_DATA_FORMAT, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVO_DATA_FORMAT_R8G8B8_TO_YCRCB444; } ctk_gvo_banner->output_data_format = val; /* Update the current LED state */ update_gvo_banner_led_state(ctk_gvo_banner); /* * register a timeout function (directly with glib, not through * ctk_config) to update the LEDs */ if (ctk_gvo_banner->shared_sync_bnc) { g_timeout_add(UPDATE_GVO_BANNER_TIME_INTERVAL, update_gvo_banner_led_images_shared_sync_bnc, ctk_gvo_banner); } else { g_timeout_add(UPDATE_GVO_BANNER_TIME_INTERVAL, update_gvo_banner_led_images, ctk_gvo_banner); } /* Add a timer so we can probe the hardware */ ctk_config_add_timer(ctk_gvo_banner->ctk_config, DEFAULT_GVO_PROBE_TIME_INTERVAL, "Graphics To Video Probe", (GSourceFunc) ctk_gvo_banner_probe, (gpointer) ctk_gvo_banner); /* Listen for events */ g_signal_connect(G_OBJECT(ctk_gvo_banner->ctk_event), CTK_EVENT_NAME(NV_CTRL_GVO_LOCK_OWNER), G_CALLBACK(gvo_event_received), (gpointer) ctk_gvo_banner); g_signal_connect(G_OBJECT(ctk_gvo_banner->ctk_event), CTK_EVENT_NAME(NV_CTRL_GVO_SYNC_MODE), G_CALLBACK(gvo_event_received), (gpointer) ctk_gvo_banner); g_signal_connect(G_OBJECT(ctk_gvo_banner->ctk_event), CTK_EVENT_NAME(NV_CTRL_GVO_SYNC_SOURCE), G_CALLBACK(gvo_event_received), (gpointer) ctk_gvo_banner); g_signal_connect(G_OBJECT(ctk_gvo_banner->ctk_event), CTK_EVENT_NAME(NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT), G_CALLBACK(gvo_event_received), (gpointer) ctk_gvo_banner); g_signal_connect(G_OBJECT(ctk_gvo_banner->ctk_event), CTK_EVENT_NAME(NV_CTRL_GVO_DATA_FORMAT), G_CALLBACK(gvo_event_received), (gpointer) ctk_gvo_banner); /* show the GVO banner widget */ gtk_widget_show_all(GTK_WIDGET(ctk_gvo_banner)); return GTK_WIDGET(ctk_gvo_banner); } /* ctk_gvo_banner_new() */ /* * draw_led() - Updates the LED to the given color in the banner's * backing pixbuf. */ static void draw_led(CtkBanner *ctk_banner, int led, int color) { /* Which LED to draw */ int dst_x = ctk_banner->artwork_x +__led_pos_x[led]; int dst_y = ctk_banner->artwork_y +__led_pos_y; /* Offset LED color into LED position */ int offset_x = ctk_banner->artwork_x +__led_pos_x[led] -__led_pos_x[color]; int offset_y = ctk_banner->artwork_y; gdk_pixbuf_composite(ctk_banner->artwork.pixbuf, // src ctk_banner->back.pixbuf, // dest dst_x, // dest_x dst_y, // dest_y 10, // dest_width 10, // dest_height offset_x, // offset_x offset_y, // offset_y 1.0, // scale_x 1.0, // scale_y GDK_INTERP_BILINEAR, // interp_type 255); // overall_alpha } /* draw_led() */ /* * composite_callback() - Draws all the LEDs to the banner. */ static void composite_callback(CtkBanner *ctk_banner, void *data) { CtkGvoBanner *ctk_gvo_banner = (CtkGvoBanner *) data; int i; int last_led; /* Grab the latest banner widget */ ctk_gvo_banner->ctk_banner = GTK_WIDGET(ctk_banner); /* Draw the current state */ last_led = ctk_gvo_banner->shared_sync_bnc ? 3 : 4; for (i = 0; i < last_led; i++) { draw_led(ctk_banner, i, ctk_gvo_banner->img[i]); } } /* composite_callback() */ /* * update_led_image() - Updates the state of an LED and causes and * expose event. */ static void update_led_image(CtkGvoBanner *banner, int led, int color) { GtkWidget *ctk_banner = banner->ctk_banner; GdkRectangle rec = {0, __led_pos_y, 10, 10}; /* Update the state of the LED */ banner->img[led] = color; /* Draw the LED and tell gdk to draw it to the window */ if (ctk_banner && ctk_banner->window) { draw_led(CTK_BANNER(ctk_banner), led, color); rec.x = CTK_BANNER(ctk_banner)->artwork_x + __led_pos_x[led]; rec.y = CTK_BANNER(ctk_banner)->artwork_y + __led_pos_y; gdk_window_invalidate_rect(ctk_banner->window, &rec, TRUE); } } /* update_led_image() */ /* * update_gvo_banner_led_images() - called by a timer to update the LED images * based on current state */ static gboolean update_gvo_banner_led_images(gpointer data) { guint8 old, new; CtkGvoBanner *banner = (CtkGvoBanner *) data; /* * we store the flashing state here: * * 0 == no LED is currently flashing * 1 == some LED is flashing; currently "on" (lit) * 2 == some LED is flashing; currently "off" (grey) * * this is used to track the current state, so that we can make * all LEDs flash at the same time. */ gint flashing = 0; /* Vid 1 out */ old = banner->img[GVO_BANNER_VID1]; if (banner->state[GVO_BANNER_VID1] == GVO_LED_VID_OUT_HD_MODE) { new = (old == LED_GREY) ? LED_GREEN: LED_GREY; flashing = (new == LED_GREY) ? 2 : 1; } else if (banner->state[GVO_BANNER_VID1] == GVO_LED_VID_OUT_SD_MODE) { new = (old == LED_GREY) ? LED_YELLOW: LED_GREY; flashing = (new == LED_GREY) ? 2 : 1; } else { new = LED_GREY; } if (old != new) { update_led_image(banner, GVO_BANNER_VID1, new); } /* Vid 2 out */ old = banner->img[GVO_BANNER_VID2]; if (banner->state[GVO_BANNER_VID2] == GVO_LED_VID_OUT_HD_MODE) { if (flashing) { new = (flashing == 1) ? LED_GREEN: LED_GREY; } else { new = (old == LED_GREY) ? LED_GREEN: LED_GREY; flashing = (new == LED_GREY) ? 2 : 1; } } else if (banner->state[GVO_BANNER_VID2] == GVO_LED_VID_OUT_SD_MODE) { if (flashing) { new = (flashing == 1) ? LED_YELLOW: LED_GREY; } else { new = (old == LED_GREY) ? LED_YELLOW: LED_GREY; flashing = (new == LED_GREY) ? 2 : 1; } } else { new = LED_GREY; } if (old != new) { update_led_image(banner, GVO_BANNER_VID2, new); } /* SDI sync */ old = banner->img[GVO_BANNER_SDI]; if (banner->state[GVO_BANNER_SDI] == GVO_LED_SDI_SYNC_HD) { if (flashing) { new = (flashing == 1) ? LED_GREEN : LED_GREY; } else { new = (banner->img[GVO_BANNER_SDI] == LED_GREY) ? LED_GREEN : LED_GREY; flashing = (new == LED_GREY) ? 2 : 1; } } else if (banner->state[GVO_BANNER_SDI] == GVO_LED_SDI_SYNC_SD) { if (flashing) { new = (flashing == 1) ? LED_YELLOW : LED_GREY; } else { new = (banner->img[GVO_BANNER_SDI] == LED_GREY) ? LED_YELLOW : LED_GREY; flashing = (new == LED_GREY) ? 2 : 1; } } else if (banner->state[GVO_BANNER_SDI] == GVO_LED_SDI_SYNC_ERROR) { new = LED_YELLOW; } else { new = LED_GREY; } if (old != new) { update_led_image(banner, GVO_BANNER_SDI, new); } /* COMP sync */ old = banner->img[GVO_BANNER_COMP]; if (banner->state[GVO_BANNER_COMP] == GVO_LED_COMP_SYNC_SYNC) { if (flashing) { new = (flashing == 1) ? LED_GREEN : LED_GREY; } else { new = (banner->img[GVO_BANNER_COMP] == LED_GREY) ? LED_GREEN : LED_GREY; } } else { new = LED_GREY; } if (old != new) { update_led_image(banner, GVO_BANNER_COMP, new); } return TRUE; } /* update_gvo_banner_led_images() */ /* * update_gvo_banner_led_images_shared_sync_bnc() - called by a timer to * update the LED images based on current state for GVO devices that have * a shared input sync signal BNC connector. */ static gboolean update_gvo_banner_led_images_shared_sync_bnc(gpointer data) { guint8 old, new; CtkGvoBanner *banner = (CtkGvoBanner *) data; /* Flash is used to make all the LEDs flash at the same time. */ banner->flash = !banner->flash; /* Vid 1 out */ old = banner->img[GVO_BANNER_VID1]; if (banner->state[GVO_BANNER_VID1] != GVO_LED_VID_OUT_NOT_IN_USE) { new = banner->flash ? LED_GREEN : LED_GREY; } else { new = LED_GREY; } if (old != new) { update_led_image(banner, GVO_BANNER_VID1, new); } /* Vid 2 out */ old = banner->img[GVO_BANNER_VID2]; if (banner->state[GVO_BANNER_VID2] != GVO_LED_VID_OUT_NOT_IN_USE) { new = banner->flash ? LED_GREEN : LED_GREY; } else { new = LED_GREY; } if (old != new) { update_led_image(banner, GVO_BANNER_VID2, new); } /* Sync */ /* For this GVO device both the SDI and Composite sync signals * share the same LED. This LED doesn't care about the lock * status of the input signal/output video. */ old = banner->img[GVO_BANNER_SDI]; if ((banner->sync_mode != NV_CTRL_GVO_SYNC_MODE_FREE_RUNNING) && (((banner->sync_source == NV_CTRL_GVO_SYNC_SOURCE_COMPOSITE) && banner->state[GVO_BANNER_COMP] != GVO_LED_COMP_SYNC_NONE) || ((banner->sync_source == NV_CTRL_GVO_SYNC_SOURCE_SDI) && banner->state[GVO_BANNER_SDI] != GVO_LED_SDI_SYNC_NONE))) { if (banner->input_video_format != NV_CTRL_GVIO_VIDEO_FORMAT_NONE) { /* LED blinks if video format is detected */ new = banner->flash ? LED_GREEN : LED_GREY; } else { /* LED is solid green if the input video format is not detected. */ new = LED_GREEN; } } else { new = LED_GREY; } if (old != new) { update_led_image(banner, GVO_BANNER_SDI, new); } return TRUE; } /* update_gvo_banner_led_images_shared_sync_bnc() */ /* * ctk_gvo_banner_update_video_output() - update banner state of the * GVO video output LEDs accordingly, based on the current * output_video_format and output_data_format. */ static void update_video_output_state(CtkGvoBanner *banner, gint output_video_format, gint output_data_format) { if (output_video_format == NV_CTRL_GVIO_VIDEO_FORMAT_NONE) { banner->state[GVO_BANNER_VID1] = GVO_LED_VID_OUT_NOT_IN_USE; banner->state[GVO_BANNER_VID2] = GVO_LED_VID_OUT_NOT_IN_USE; } else if ((output_video_format == NV_CTRL_GVIO_VIDEO_FORMAT_487I_59_94_SMPTE259_NTSC) || (output_video_format == NV_CTRL_GVIO_VIDEO_FORMAT_576I_50_00_SMPTE259_PAL)) { banner->state[GVO_BANNER_VID1] = GVO_LED_VID_OUT_SD_MODE; banner->state[GVO_BANNER_VID2] = GVO_LED_VID_OUT_SD_MODE; } else { banner->state[GVO_BANNER_VID1] = GVO_LED_VID_OUT_HD_MODE; banner->state[GVO_BANNER_VID2] = GVO_LED_VID_OUT_HD_MODE; } if (output_data_format == NV_CTRL_GVO_DATA_FORMAT_R8G8B8_TO_YCRCB422) { banner->state[GVO_BANNER_VID2] = GVO_LED_VID_OUT_NOT_IN_USE; } } /* update_video_output_state() */ /* * ctk_gvo_banner_update_video_input() - update banner state of the * video input GVO banner LEDs accordingly, based on the current sdi * and composite input. */ static void update_video_input_state(CtkGvoBanner *banner, gint sdi, gint comp) { if (sdi == NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED_HD) { banner->state[GVO_BANNER_SDI] = GVO_LED_SDI_SYNC_HD; } else if (sdi == NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED_SD) { banner->state[GVO_BANNER_SDI] = GVO_LED_SDI_SYNC_SD; } else { banner->state[GVO_BANNER_SDI] = GVO_LED_SDI_SYNC_NONE; } banner->state[GVO_BANNER_COMP] = comp ? GVO_LED_COMP_SYNC_SYNC : GVO_LED_COMP_SYNC_NONE; } /* update_video_input_state() */ /* * update_gvo_banner_led_state() - Modifies the LED state based on the * current GVO state. */ static void update_gvo_banner_led_state(CtkGvoBanner *ctk_gvo_banner) { /* Update input state */ update_video_input_state(ctk_gvo_banner, ctk_gvo_banner->sdi_sync_input_detected, ctk_gvo_banner->composite_sync_input_detected); /* Update output state */ if (ctk_gvo_banner->gvo_lock_owner != NV_CTRL_GVO_LOCK_OWNER_NONE) { update_video_output_state(ctk_gvo_banner, ctk_gvo_banner->output_video_format, ctk_gvo_banner->output_data_format); } else { update_video_output_state(ctk_gvo_banner, NV_CTRL_GVIO_VIDEO_FORMAT_NONE, ctk_gvo_banner->output_data_format); } } /* update_gvo_banner_led_state() */ /* * ctk_gvo_banner_probe() - query the incoming signal and state of * the GVO board. */ gint ctk_gvo_banner_probe(gpointer data) { ReturnStatus ret; gint val; CtkGvoBanner *ctk_gvo_banner = CTK_GVO_BANNER(data); // XXX We could get notified of these (sync source/mode) and // not have to probe - i.e., it could be the job of the // caller/user of the ctk_gvo_banner widget to notify the // banner when these change. We don't however since doing // that could be prone to bitrot. /* query NV_CTRL_GVO_SYNC_MODE */ ret = NvCtrlGetAttribute(ctk_gvo_banner->handle, NV_CTRL_GVO_SYNC_MODE, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVO_SYNC_MODE_FREE_RUNNING; } ctk_gvo_banner->sync_mode = val; /* query NV_CTRL_GVO_SYNC_SOURCE */ ret = NvCtrlGetAttribute(ctk_gvo_banner->handle, NV_CTRL_GVO_SYNC_SOURCE, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVO_SYNC_SOURCE_COMPOSITE; } ctk_gvo_banner->sync_source = val; /* query NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT */ ret = NvCtrlGetAttribute(ctk_gvo_banner->handle, NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVIO_VIDEO_FORMAT_NONE; } ctk_gvo_banner->input_video_format = val; /* query COMPOSITE_SYNC_INPUT_DETECTED */ ret = NvCtrlGetAttribute(ctk_gvo_banner->handle, NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED_FALSE; } ctk_gvo_banner->composite_sync_input_detected = val; /* query SDI_SYNC_INPUT_DETECTED */ ret = NvCtrlGetAttribute(ctk_gvo_banner->handle, NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED_NONE; } ctk_gvo_banner->sdi_sync_input_detected = val; /* query SYNC_LOCK_STATUS */ ret = NvCtrlGetAttribute(ctk_gvo_banner->handle, NV_CTRL_GVO_SYNC_LOCK_STATUS, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVO_SYNC_LOCK_STATUS_UNLOCKED; } ctk_gvo_banner->sync_lock_status = val; /* Update the banner state */ update_gvo_banner_led_state(ctk_gvo_banner); /* Update the banner's parent */ if (ctk_gvo_banner->probe_callback) { ctk_gvo_banner->probe_callback(ctk_gvo_banner->probe_callback_data); } return TRUE; } /* ctk_gvo_banner_probe() */ /* * gvo_event_received() - Handles updating the state of the GVO banner * for event-driven NV-CONTROL attributes. */ static void gvo_event_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct = (CtkEventStruct *) arg1; CtkGvoBanner *ctk_gvo_banner = CTK_GVO_BANNER(user_data); gint attribute = event_struct->attribute; gint value = event_struct->value; switch (attribute) { case NV_CTRL_GVO_SYNC_MODE: ctk_gvo_banner->sync_mode = value; break; case NV_CTRL_GVO_SYNC_SOURCE: ctk_gvo_banner->sync_source = value; break; case NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT: ctk_gvo_banner->output_video_format = value; break; case NV_CTRL_GVO_DATA_FORMAT: ctk_gvo_banner->output_data_format = value; break; case NV_CTRL_GVO_LOCK_OWNER: ctk_gvo_banner->gvo_lock_owner = value; break; default: return; } update_gvo_banner_led_state(ctk_gvo_banner); } /* gvo_event_recieved() */ /* ctk_gvo_banner_set_parent() - Sets which parent page owns * (is currently displaying) the gvo banner widget. */ void ctk_gvo_banner_set_parent(CtkGvoBanner *ctk_gvo_banner, GtkWidget *new_parent_box, ctk_gvo_banner_probe_callback probe_callback, gpointer probe_callback_data) { /* Repack the banner into the new parent */ if (ctk_gvo_banner->parent_box != new_parent_box) { if (ctk_gvo_banner->parent_box) { gtk_container_remove(GTK_CONTAINER(ctk_gvo_banner->parent_box), GTK_WIDGET(ctk_gvo_banner)); } if (new_parent_box) { gtk_container_add(GTK_CONTAINER(new_parent_box), GTK_WIDGET(ctk_gvo_banner)); } } /* Start/stop the GVO probe */ if (!ctk_gvo_banner->parent_box && new_parent_box) { ctk_config_start_timer(ctk_gvo_banner->ctk_config, (GSourceFunc) ctk_gvo_banner_probe, (gpointer) ctk_gvo_banner); } else if (ctk_gvo_banner->parent_box && !new_parent_box) { ctk_config_stop_timer(ctk_gvo_banner->ctk_config, (GSourceFunc) ctk_gvo_banner_probe, (gpointer) ctk_gvo_banner); } /* Keep track of the current banner owner */ ctk_gvo_banner->parent_box = new_parent_box; ctk_gvo_banner->probe_callback = probe_callback; ctk_gvo_banner->probe_callback_data = probe_callback_data; /* If we are programming a callback, do an initial probe */ if (probe_callback) { ctk_gvo_banner_probe((gpointer)(ctk_gvo_banner)); } } /* ctk_gvo_banner_set_parent() */ nvidia-settings/src/gtk+-2.x/ctkcolorcontrols.c0000664000175000017500000005565212236467170021663 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2010 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include "ctkconfig.h" #include "ctkhelp.h" #include "ctkcolorcontrols.h" #include "ctkdropdownmenu.h" /* function prototypes */ static void ctk_color_controls_class_init(CtkColorControlsClass *ctk_object_class); static void ctk_color_controls_finalize(GObject *object); static gboolean build_color_space_table(CtkColorControls *ctk_color_controls, NVCTRLAttributeValidValuesRec valid); static gint map_nvctrl_value_to_table(CtkColorControls *ctk_color_controls, gint val); static gboolean update_color_space_menu_info(CtkColorControls *ctk_color_controls); static void setup_reset_button(CtkColorControls *ctk_color_controls); static void color_space_menu_changed(GtkWidget *widget, gpointer user_data); static void color_range_menu_changed(GtkWidget *widget, gpointer user_data); static void color_control_update_received(GtkObject *object, gpointer arg1, gpointer user_data); static gboolean setup_color_range_dropdown(CtkColorControls *ctk_color_controls); static void post_color_range_update(CtkColorControls *ctk_color_controls, gint color_range); static void post_color_space_update(CtkColorControls *ctk_color_controls, gint color_space); /* macros */ #define FRAME_PADDING 5 /* help text */ static const char * __color_controls_help = "The Color Controls allow changing the color space and color range " "of the display device."; static const char * __color_space_help = "The possible values for Color Space vary depending on the capabilities of " "the display device and the GPU, but may contain \"RGB\", \"YCbCr422\", " "and \"YCbCr444\"."; static const char * __color_range_help = "The possible values for Color Range are \"Limited\" and \"Full\"."; GType ctk_color_controls_get_type(void) { static GType ctk_color_controls_type = 0; if (!ctk_color_controls_type) { static const GTypeInfo ctk_color_controls_info = { sizeof (CtkColorControlsClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ctk_color_controls_class_init, /* class_init, */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkColorControls), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_color_controls_type = g_type_register_static (GTK_TYPE_VBOX, "CtkColorControls", &ctk_color_controls_info, 0); } return ctk_color_controls_type; } /* ctk_color_controls_get_type() */ static void ctk_color_controls_class_init(CtkColorControlsClass *ctk_object_class) { GObjectClass *gobject_class = (GObjectClass *)ctk_object_class; gobject_class->finalize = ctk_color_controls_finalize; } static void ctk_color_controls_finalize(GObject *object) { CtkColorControls *ctk_object = CTK_COLOR_CONTROLS(object); g_signal_handlers_disconnect_matched(G_OBJECT(ctk_object->ctk_event), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, (gpointer) ctk_object); } GtkWidget* ctk_color_controls_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event, GtkWidget *reset_button, char *name) { GObject *object; CtkColorControls *ctk_color_controls; GtkWidget *frame, *hbox, *label; GtkWidget *table, *separator; CtkDropDownMenu *menu; ReturnStatus ret1, ret2; NVCTRLAttributeValidValuesRec valid1, valid2; gint i; /* check if color configuration is supported */ ret1 = NvCtrlGetValidAttributeValues(handle, NV_CTRL_COLOR_SPACE, &valid1); ret2 = NvCtrlGetValidAttributeValues(handle, NV_CTRL_COLOR_RANGE, &valid2); if ((ret1 != NvCtrlSuccess) || (ret2 != NvCtrlSuccess)) { return NULL; } /* create the object */ object = g_object_new(CTK_TYPE_COLOR_CONTROLS, NULL); if (!object) { return NULL; } ctk_color_controls = CTK_COLOR_CONTROLS(object); ctk_color_controls->handle = handle; ctk_color_controls->ctk_config = ctk_config; ctk_color_controls->ctk_event = ctk_event; ctk_color_controls->reset_button = reset_button; ctk_color_controls->name = strdup(name); /* build a table holding available color space */ if (!build_color_space_table(ctk_color_controls, valid1)) { return NULL; } /* create main color box & frame */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, FALSE, FRAME_PADDING); ctk_color_controls->color_controls_box = hbox; frame = gtk_frame_new("Color Controls"); gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 0); table = gtk_table_new(1, 6, FALSE); gtk_container_add(GTK_CONTAINER(frame), table); gtk_table_set_row_spacings(GTK_TABLE(table), 5); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); /* dropdown list for color space */ menu = (CtkDropDownMenu *) ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO); for (i = 0; i < ctk_color_controls->color_space_table_size; i++) { switch (ctk_color_controls->color_space_table[i]) { case NV_CTRL_COLOR_SPACE_YCbCr422: ctk_drop_down_menu_append_item(menu, "YCbCr422", i); break; case NV_CTRL_COLOR_SPACE_YCbCr444: ctk_drop_down_menu_append_item(menu, "YCbCr444", i); break; default: case NV_CTRL_COLOR_SPACE_RGB: ctk_drop_down_menu_append_item(menu, "RGB", i); break; } } ctk_color_controls->color_space_menu = GTK_WIDGET(menu); ctk_config_set_tooltip(ctk_config, ctk_color_controls->color_space_menu, __color_space_help); /* If dropdown only has one item, disable it */ if (ctk_color_controls->color_space_table_size > 1) { gtk_widget_set_sensitive(ctk_color_controls->color_space_menu, True); } else { gtk_widget_set_sensitive(ctk_color_controls->color_space_menu, False); } g_signal_connect(G_OBJECT(ctk_color_controls->color_space_menu), "changed", G_CALLBACK(color_space_menu_changed), (gpointer) ctk_color_controls); /* pack the label & drop down */ hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Color Space: "); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_color_controls->color_space_menu, FALSE, FALSE, 0); /* V-bar */ hbox = gtk_hbox_new(FALSE, 0); separator = gtk_vseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), separator, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 2, 3, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); /* Build color widgets & pack them in table */ /* dropdown list for color range */ ctk_color_controls->color_range_menu = ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO); ctk_config_set_tooltip(ctk_config, ctk_color_controls->color_range_menu, __color_range_help); g_signal_connect(G_OBJECT(ctk_color_controls->color_range_menu), "changed", G_CALLBACK(color_range_menu_changed), (gpointer) ctk_color_controls); /* Packing label & dropdown */ hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 3, 4, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Color Range: "); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 4, 5, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_color_controls->color_range_menu, FALSE, FALSE, 0); gtk_widget_show_all(GTK_WIDGET(object)); ctk_color_controls_setup(ctk_color_controls); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_COLOR_RANGE), G_CALLBACK(color_control_update_received), (gpointer) ctk_color_controls); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_COLOR_SPACE), G_CALLBACK(color_control_update_received), (gpointer) ctk_color_controls); return GTK_WIDGET(object); } /* ctk_color_controls_new() */ /* * setup_reset_button() - enables the reset button if any of the current * settings are not the default. */ static void setup_reset_button(CtkColorControls *ctk_color_controls) { gint history; gint val; CtkDropDownMenu *color_space_menu, *color_range_menu; if (!GTK_WIDGET_SENSITIVE(ctk_color_controls->color_controls_box)) { /* Nothing is available, don't bother enabling the reset button yet. */ return; } /* The color space menu is always available */ color_space_menu = CTK_DROP_DOWN_MENU(ctk_color_controls->color_space_menu); history = color_space_menu->current_selected_item; val = ctk_color_controls->color_space_table[history]; if (val != NV_CTRL_COLOR_SPACE_RGB) { goto enable; } /* Color range is dependent on the color space */ if (GTK_WIDGET_SENSITIVE(ctk_color_controls->color_range_menu)) { color_range_menu = CTK_DROP_DOWN_MENU(ctk_color_controls->color_range_menu); history = color_range_menu->current_selected_item; val = ctk_color_controls->color_range_table[history]; if (val != NV_CTRL_COLOR_RANGE_FULL) { goto enable; } } /* Don't disable reset button here, since other settings that are not * managed by the ctk_image_slider here may need it enabled */ return; enable: gtk_widget_set_sensitive(ctk_color_controls->reset_button, TRUE); } /* * ctk_color_controls_setup() - Setup routine for color attributes. Used * in DFP setup stage as well as for updating the GUI when there is change in * color range or color space. */ void ctk_color_controls_setup(CtkColorControls *ctk_color_controls) { if (!ctk_color_controls) { return; } /* color space */ if (!update_color_space_menu_info(ctk_color_controls)) { gtk_widget_set_sensitive(ctk_color_controls->color_controls_box, FALSE); gtk_widget_hide_all(ctk_color_controls->color_controls_box); } setup_reset_button(ctk_color_controls); } /* ctk_color_controls_setup() */ static gboolean update_color_space_menu_info(CtkColorControls *ctk_color_controls) { gint color_space = NV_CTRL_COLOR_SPACE_RGB; /* color space */ if (NvCtrlSuccess != NvCtrlGetAttribute(ctk_color_controls->handle, NV_CTRL_COLOR_SPACE, &color_space)) { return FALSE; } color_space = map_nvctrl_value_to_table(ctk_color_controls, color_space); g_signal_handlers_block_by_func (G_OBJECT(ctk_color_controls->color_space_menu), G_CALLBACK(color_space_menu_changed), (gpointer) ctk_color_controls); ctk_drop_down_menu_set_current_value (CTK_DROP_DOWN_MENU(ctk_color_controls->color_space_menu), color_space); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_color_controls->color_space_menu), G_CALLBACK(color_space_menu_changed), (gpointer) ctk_color_controls); /* dynamically regenerate color range dropdown */ if (!setup_color_range_dropdown(ctk_color_controls)) { gtk_widget_set_sensitive(ctk_color_controls->color_range_menu, FALSE); } else { gtk_widget_set_sensitive(ctk_color_controls->color_range_menu, TRUE); } return TRUE; } /* update_color_space_menu_info() */ static void post_color_range_update(CtkColorControls *ctk_color_controls, gint color_range) { static const char *color_range_table[] = { "Full", /* NV_CTRL_COLOR_RANGE_FULL */ "Limited", /* NV_CTRL_COLOR_RANGE_LIMITED */ }; gtk_widget_set_sensitive(ctk_color_controls->reset_button, TRUE); ctk_config_statusbar_message(ctk_color_controls->ctk_config, "Color Range set to %s for %s.", color_range_table[color_range], ctk_color_controls->name); } static void post_color_space_update(CtkColorControls *ctk_color_controls, gint color_space) { static const char *color_space_table[] = { "RGB", /* NV_CTRL_COLOR_SPACE_RGB */ "YCbCr422", /* NV_CTRL_COLOR_SPACE_YCbCr422 */ "YCbCr444" /* NV_CTRL_COLOR_SPACE_YCbCr444 */ }; gtk_widget_set_sensitive(ctk_color_controls->reset_button, TRUE); ctk_config_statusbar_message(ctk_color_controls->ctk_config, "Color Space set to %s for %s.", color_space_table[ctk_color_controls->color_space_table[color_space]], ctk_color_controls->name); } static void color_range_menu_changed(GtkWidget *widget, gpointer user_data) { CtkColorControls *ctk_color_controls = CTK_COLOR_CONTROLS(user_data); CtkDropDownMenu *menu = CTK_DROP_DOWN_MENU(widget); gint history, color_range = NV_CTRL_COLOR_RANGE_FULL; history = ctk_drop_down_menu_get_current_value(menu); color_range = ctk_color_controls->color_range_table[history]; NvCtrlSetAttribute(ctk_color_controls->handle, NV_CTRL_COLOR_RANGE, color_range); /* reflecting the change to statusbar message and the reset button */ post_color_range_update(ctk_color_controls, color_range); } /* color_range_menu_changed() */ static void color_space_menu_changed(GtkWidget *widget, gpointer user_data) { CtkColorControls *ctk_color_controls = CTK_COLOR_CONTROLS(user_data); CtkDropDownMenu *menu = CTK_DROP_DOWN_MENU(widget); gint history, color_space = NV_CTRL_COLOR_SPACE_RGB; history = ctk_drop_down_menu_get_current_value(menu); color_space = ctk_color_controls->color_space_table[history]; NvCtrlSetAttribute(ctk_color_controls->handle, NV_CTRL_COLOR_SPACE, color_space); color_space = map_nvctrl_value_to_table(ctk_color_controls, color_space); /* reflecting the change in color space to other widgets & reset button */ ctk_color_controls_setup(ctk_color_controls); post_color_space_update(ctk_color_controls, color_space); } /* color_space_menu_changed() */ /* * ctk_color_controls_reset() - Resets the color range and * & color space when Reset HW Defaults is clicked */ void ctk_color_controls_reset(CtkColorControls *ctk_color_controls) { if (!ctk_color_controls) { return; } NvCtrlSetAttribute(ctk_color_controls->handle, NV_CTRL_COLOR_SPACE, NV_CTRL_COLOR_SPACE_RGB); NvCtrlSetAttribute(ctk_color_controls->handle, NV_CTRL_COLOR_RANGE, NV_CTRL_COLOR_RANGE_FULL); ctk_color_controls_setup(ctk_color_controls); } /* ctk_color_controls_reset() */ /* * add_color_controls_help() - */ void add_color_controls_help(CtkColorControls *ctk_color_controls, GtkTextBuffer *b, GtkTextIter *i) { if (!ctk_color_controls) { return; } ctk_help_heading(b, i, "Color Controls"); ctk_help_para(b, i, "%s", __color_controls_help); ctk_help_term(b, i, "Color Space"); ctk_help_para(b, i, "%s", __color_space_help); ctk_help_term(b, i, "Color Range"); ctk_help_para(b, i, "%s", __color_range_help); } /* add_color_controls_help() */ /* * When other client updated color controls * we should update the GUI to reflect the current color range * and color space. */ static void color_control_update_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkColorControls *ctk_object = CTK_COLOR_CONTROLS(user_data); CtkEventStruct *event_struct = (CtkEventStruct *) arg1; ctk_color_controls_setup(ctk_object); /* update status bar message */ switch (event_struct->attribute) { case NV_CTRL_COLOR_RANGE: post_color_range_update(ctk_object, event_struct->value); break; case NV_CTRL_COLOR_SPACE: post_color_space_update(ctk_object, event_struct->value); break; } } /* color_control_update_received() */ /* * build_color_space_table() - build a table of color space, showing * modes supported by the DFP. */ static gboolean build_color_space_table(CtkColorControls *ctk_color_controls, NVCTRLAttributeValidValuesRec valid) { gint i, n = 0, color_space_count = 0; gint mask = valid.u.bits.ints; if (valid.type != ATTRIBUTE_TYPE_INT_BITS) { return False; } /* count no. of supported color space */ while(mask) { mask = mask & (mask - 1); color_space_count++; } ctk_color_controls->color_space_table_size = color_space_count; ctk_color_controls->color_space_table = calloc(color_space_count, sizeof(ctk_color_controls->color_space_table[0])); if (!ctk_color_controls->color_space_table) { return False; } for (i = 0, n = 0; n < ctk_color_controls->color_space_table_size; i++) { if (valid.u.bits.ints & (1 << i)) { ctk_color_controls->color_space_table[n] = i; n++; } } return True; } /* build_color_space_table() */ /* * setup_color_range_dropdown() - dynamically generate dropdown list for * color range depending on selected color space. */ static gboolean setup_color_range_dropdown(CtkColorControls *ctk_color_controls) { gint i, n = 0, color_range_count = 0; gint mask, val; ReturnStatus ret; NVCTRLAttributeValidValuesRec valid; CtkDropDownMenu *d; ret = NvCtrlGetValidAttributeValues(ctk_color_controls->handle, NV_CTRL_COLOR_RANGE, &valid); if (ret != NvCtrlSuccess) { return FALSE; } if (valid.type != ATTRIBUTE_TYPE_INT_BITS) { return FALSE; } mask = valid.u.bits.ints; /* count no. of supported color space */ while(mask) { mask = mask & (mask - 1); color_range_count++; } if (ctk_color_controls->color_range_table) { free(ctk_color_controls->color_range_table); ctk_color_controls->color_range_table_size = 0; } ctk_color_controls->color_range_table_size = color_range_count; ctk_color_controls->color_range_table = calloc(color_range_count, sizeof(ctk_color_controls->color_range_table[0])); if (!ctk_color_controls->color_range_table) { return FALSE; } for (i = 0, n = 0; n < ctk_color_controls->color_range_table_size; i++) { if (valid.u.bits.ints & (1 << i)) { ctk_color_controls->color_range_table[n] = i; n++; } } /* dropdown list for color range */ d = (CtkDropDownMenu *) ctk_color_controls->color_range_menu; g_signal_handlers_block_by_func (G_OBJECT(ctk_color_controls->color_range_menu), G_CALLBACK(color_range_menu_changed), (gpointer) ctk_color_controls); ctk_drop_down_menu_reset(d); for (i = 0; i < ctk_color_controls->color_range_table_size; i++) { switch (ctk_color_controls->color_range_table[i]) { case NV_CTRL_COLOR_RANGE_FULL: ctk_drop_down_menu_append_item(d, "Full", i); break; default: case NV_CTRL_COLOR_RANGE_LIMITED: ctk_drop_down_menu_append_item(d, "Limited", i); break; } } /* color range */ if (NvCtrlSuccess != NvCtrlGetAttribute(ctk_color_controls->handle, NV_CTRL_COLOR_RANGE, &val)) { val = NV_CTRL_COLOR_RANGE_FULL; } ctk_drop_down_menu_set_current_value(d, val); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_color_controls->color_range_menu), G_CALLBACK(color_range_menu_changed), (gpointer) ctk_color_controls); /* If dropdown only has one item, disable it */ if (ctk_color_controls->color_range_table_size <= 1) { return FALSE; } return TRUE; } /* setup_color_range_dropdown() */ static gint map_nvctrl_value_to_table(CtkColorControls *ctk_color_controls, gint val) { int i; for (i = 0; i < ctk_color_controls->color_space_table_size; i++) { if (val == ctk_color_controls->color_space_table[i]) { return i; } } return 0; } /*map_nvctrl_value_to_table() */ nvidia-settings/src/gtk+-2.x/ctkpowermizer.h0000664000175000017500000000556012236467170021162 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_POWERMIZER_H__ #define __CTK_POWERMIZER_H__ #include "NvCtrlAttributes.h" #include "ctkconfig.h" #include "ctkevent.h" G_BEGIN_DECLS #define CTK_TYPE_POWERMIZER (ctk_powermizer_get_type()) #define CTK_POWERMIZER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_POWERMIZER, CtkPowermizer)) #define CTK_POWERMIZER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_POWERMIZER, CtkPowermizerClass)) #define CTK_IS_POWERMIZER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_POWERMIZER)) #define CTK_IS_POWERMIZER_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_POWERMIZER)) #define CTK_POWERMIZER_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_POWERMIZER, CtkPowermizerClass)) typedef struct _CtkPowermizer CtkPowermizer; typedef struct _CtkPowermizerClass CtkPowermizerClass; struct _CtkPowermizer { GtkVBox parent; NvCtrlAttributeHandle *attribute_handle; CtkConfig *ctk_config; GtkWidget *adaptive_clock_status; GtkWidget *gpu_clock; GtkWidget *memory_transfer_rate; GtkWidget *processor_clock; GtkWidget *power_source; GtkWidget *performance_level; GtkWidget *performance_table_hbox; GtkWidget *powermizer_menu; GtkWidget *powermizer_txt; GtkWidget *box_powermizer_menu; gchar *powermizer_menu_help; GtkWidget *configuration_button; gboolean dp_enabled; gboolean dp_toggle_warning_dlg_shown; gboolean hasDecoupledClock; gint attribute; gint powermizer_default_mode; GtkWidget *status; GtkWidget *link_width; GtkWidget *link_speed; gboolean pcie_gen_queriable; }; struct _CtkPowermizerClass { GtkVBoxClass parent_class; }; GType ctk_powermizer_get_type (void) G_GNUC_CONST; GtkWidget* ctk_powermizer_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *); GtkTextBuffer* ctk_powermizer_create_help (GtkTextTagTable *, CtkPowermizer *); void ctk_powermizer_start_timer (GtkWidget *); void ctk_powermizer_stop_timer (GtkWidget *); G_END_DECLS #endif /* __CTK_POWERMIZER_H__ */ nvidia-settings/src/gtk+-2.x/ctkecc.h0000664000175000017500000000457612236467170017517 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2009 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_ECC_H__ #define __CTK_ECC_H__ #include "NvCtrlAttributes.h" #include "ctkevent.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_ECC (ctk_ecc_get_type()) #define CTK_ECC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_ECC, CtkEcc)) #define CTK_ECC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_ECC, CtkEccClass)) #define CTK_IS_ECC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_ECC)) #define CTK_IS_ECC_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_ECC)) #define CTK_ECC_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_ECC, CtkEccClass)) typedef struct _CtkEcc CtkEcc; typedef struct _CtkEccClass CtkEccClass; struct _CtkEcc { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; GtkWidget* status; GtkWidget* dbit_error; GtkWidget* aggregate_dbit_error; GtkWidget* ecc_config_supported; GtkWidget* clear_button; GtkWidget* clear_aggregate_button; GtkWidget* reset_default_config_button; GtkWidget* configuration_status; gboolean ecc_enabled; gboolean ecc_configured; gboolean ecc_toggle_warning_dlg_shown; gboolean dbit_error_available; gboolean aggregate_dbit_error_available; }; struct _CtkEccClass { GtkVBoxClass parent_class; }; GType ctk_ecc_get_type (void) G_GNUC_CONST; GtkWidget* ctk_ecc_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *); GtkTextBuffer* ctk_ecc_create_help (GtkTextTagTable *, CtkEcc *); void ctk_ecc_start_timer (GtkWidget *); void ctk_ecc_stop_timer (GtkWidget *); G_END_DECLS #endif /* __CTK_ECC_H__ */ nvidia-settings/src/gtk+-2.x/ctkecc.c0000664000175000017500000005747612236467170017521 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2009 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include "msg.h" #include "ctkutils.h" #include "ctkhelp.h" #include "ctkecc.h" #include "ctkgpu.h" #include "ctkbanner.h" #define DEFAULT_UPDATE_ECC_STATUS_INFO_TIME_INTERVAL 1000 static const char *__ecc_settings_help = "This page allows you to change the Error Correction Code (ECC) " "setting for this GPU."; static const char *__ecc_status_help = "Returns the current hardware ECC setting " "for the targeted GPU."; static const char *__dbit_error_help = "Returns the number of double-bit ECC errors detected by " "the targeted GPU since the last system reboot."; static const char *__aggregate_dbit_error_help = "Returns the number of double-bit ECC errors detected by the " "targeted GPU since the last counter reset."; static const char *__configuration_status_help = "Returns the current ECC configuration setting or specifies new " "settings. Changes to these settings do not take effect until the next " "system reboot."; static const char *__clear_button_help = "This button is used to clear the ECC errors detected since the last system reboot."; static const char *__clear_aggregate_button_help = "This button is used to reset the aggregate ECC errors counter."; static const char *__reset_default_config_button_help = "The button is used to restore the GPU's default ECC configuration setting."; static void ecc_config_button_toggled(GtkWidget *, gpointer); static void show_ecc_toggle_warning_dlg(CtkEcc *); static void ecc_set_config_status(CtkEcc *); static void ecc_configuration_update_received(GtkObject *, gpointer, gpointer); static void post_ecc_configuration_update(CtkEcc *); GType ctk_ecc_get_type(void) { static GType ctk_ecc_type = 0; if (!ctk_ecc_type) { static const GTypeInfo ctk_ecc_info = { sizeof (CtkEccClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* constructor */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkEcc), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_ecc_type = g_type_register_static(GTK_TYPE_VBOX, "CtkEcc", &ctk_ecc_info, 0); } return ctk_ecc_type; } /* ctk_ecc_get_type() */ static void set_label_value(GtkWidget *widget, uint64_t val) { gchar *s; s = g_strdup_printf("%" PRIu64, val); gtk_label_set_text(GTK_LABEL(widget), s); g_free(s); } /* * add_table_int_row() - helper function to add label-value pair to table. */ static GtkWidget *add_table_int_row(CtkConfig *ctk_config, GtkWidget *table, const gchar *help, gchar *label1, uint64_t val, gint row, gboolean ecc_enabled) { GtkWidget *hbox2, *label, *eventbox; gtk_table_resize(GTK_TABLE(table), row+1, 2); hbox2 = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox2, 0, 1, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(label1); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); gtk_widget_set_sensitive(label, ecc_enabled); eventbox = gtk_event_box_new(); gtk_table_attach(GTK_TABLE(table), eventbox, 1, 2, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(NULL); set_label_value(label, val); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_container_add(GTK_CONTAINER(eventbox), label); ctk_config_set_tooltip(ctk_config, eventbox, help); gtk_widget_set_sensitive(label, ecc_enabled); return label; } /* add_table_int_row() */ /* * update_ecc_info() - update ECC status and configuration */ static gboolean update_ecc_info(gpointer user_data) { CtkEcc *ctk_ecc = CTK_ECC(user_data); int64_t val; ReturnStatus ret; if ( ctk_ecc->ecc_enabled == FALSE ) { return FALSE; } /* Query ECC Errors */ if ( ctk_ecc->dbit_error ) { ret = NvCtrlGetAttribute64(ctk_ecc->handle, NV_CTRL_GPU_ECC_DOUBLE_BIT_ERRORS, &val); if ( ret != NvCtrlSuccess ) { val = 0; } set_label_value(ctk_ecc->dbit_error, val); } if ( ctk_ecc->aggregate_dbit_error ) { ret = NvCtrlGetAttribute64(ctk_ecc->handle, NV_CTRL_GPU_ECC_AGGREGATE_DOUBLE_BIT_ERRORS, &val); if ( ret != NvCtrlSuccess ) { val = 0; } set_label_value(ctk_ecc->aggregate_dbit_error, val); } return TRUE; } /* update_ecc_info() */ /* * post_ecc_configuration_update() - this function update status bar string. */ static void post_ecc_configuration_update(CtkEcc *ctk_ecc) { gboolean configured = ctk_ecc->ecc_configured; gboolean enabled = ctk_ecc->ecc_enabled; const char *conf_string = configured ? "enabled" : "disabled"; char message[128]; if (configured != enabled) { snprintf(message, sizeof(message), "ECC will be %s after reboot.", conf_string); } else { snprintf(message, sizeof(message), "ECC %s.", conf_string); } ctk_config_statusbar_message(ctk_ecc->ctk_config, "%s", message); } /* post_ecc_configuration_update() */ /* * ecc_set_config_status() - set ECC configuration button status: caller * should make sure ctk_ecc->ecc_configured is set correctly before calling. */ static void ecc_set_config_status(CtkEcc *ctk_ecc) { g_signal_handlers_block_by_func(G_OBJECT(ctk_ecc->configuration_status), G_CALLBACK(ecc_config_button_toggled), (gpointer) ctk_ecc); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ctk_ecc->configuration_status), ctk_ecc->ecc_configured); g_signal_handlers_unblock_by_func(G_OBJECT(ctk_ecc->configuration_status), G_CALLBACK(ecc_config_button_toggled), (gpointer) ctk_ecc); } /* * ecc_configuration_update_received() - this function is called when the * NV_CTRL_GPU_ECC_CONFIGURATION attribute is changed by another * NV-CONTROL client. */ static void ecc_configuration_update_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct = (CtkEventStruct *) arg1; CtkEcc *ctk_ecc = CTK_ECC(user_data); ctk_ecc->ecc_configured = event_struct->value; /* set ECC configuration button status */ ecc_set_config_status(ctk_ecc); /* Update status bar message */ post_ecc_configuration_update(ctk_ecc); } /* * reset_default_config_button_clicked() - callback function for reset default * configuration button. */ static void reset_default_config_button_clicked(GtkWidget *widget, gpointer user_data) { gboolean status; ReturnStatus ret; CtkEcc *ctk_ecc = CTK_ECC(user_data); /* get default status and set it to ECC configuration */ ret = NvCtrlGetAttribute(ctk_ecc->handle, NV_CTRL_GPU_ECC_DEFAULT_CONFIGURATION, &status); if (ret != NvCtrlSuccess) { ctk_config_statusbar_message(ctk_ecc->ctk_config, "Failed to get default configuration!"); return; } ret = NvCtrlSetAttribute(ctk_ecc->handle, NV_CTRL_GPU_ECC_CONFIGURATION, status); if (ret != NvCtrlSuccess) { ctk_config_statusbar_message(ctk_ecc->ctk_config, "Failed to set default configuration!"); return; } ctk_ecc->ecc_configured = status; /* update ECC configuration button status */ ecc_set_config_status(ctk_ecc); /* show popup dialog*/ show_ecc_toggle_warning_dlg(ctk_ecc); gtk_widget_set_sensitive(ctk_ecc->reset_default_config_button, FALSE); ctk_config_statusbar_message(ctk_ecc->ctk_config, "Set to default configuration."); } /* reset_default_config_button_clicked() */ /* * clear_ecc_errors_button_clicked() - callback function for clear ecc errors * button */ static void clear_ecc_errors_button_clicked(GtkWidget *widget, gpointer user_data) { CtkEcc *ctk_ecc = CTK_ECC(user_data); NvCtrlSetAttribute(ctk_ecc->handle, NV_CTRL_GPU_ECC_RESET_ERROR_STATUS, NV_CTRL_GPU_ECC_RESET_ERROR_STATUS_VOLATILE); ctk_config_statusbar_message(ctk_ecc->ctk_config, "ECC errors cleared."); } /* clear_ecc_errors_button_clicked() */ /* * clear_aggregate_ecc_errors_button_clicked() - callback function for * clear aggregate ecc errors button. */ static void clear_aggregate_ecc_errors_button_clicked(GtkWidget *widget, gpointer user_data) { CtkEcc *ctk_ecc = CTK_ECC(user_data); NvCtrlSetAttribute(ctk_ecc->handle, NV_CTRL_GPU_ECC_RESET_ERROR_STATUS, NV_CTRL_GPU_ECC_RESET_ERROR_STATUS_AGGREGATE); ctk_config_statusbar_message(ctk_ecc->ctk_config, "ECC aggregate errors cleared."); } /* clear_aggregate_ecc_errors_button_clicked() */ static void show_ecc_toggle_warning_dlg(CtkEcc *ctk_ecc) { GtkWidget *dlg, *parent; /* return early if message dialog already shown */ if (ctk_ecc->ecc_toggle_warning_dlg_shown) { return; } ctk_ecc->ecc_toggle_warning_dlg_shown = TRUE; parent = ctk_get_parent_window(GTK_WIDGET(ctk_ecc)); dlg = gtk_message_dialog_new (GTK_WINDOW(parent), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Changes to the ECC setting " "require a system reboot before " "taking effect."); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy (dlg); } /* * ecc_config_button_toggled() - callback function for * enable ECC checkbox. */ static void ecc_config_button_toggled(GtkWidget *widget, gpointer user_data) { gboolean enabled; CtkEcc *ctk_ecc = CTK_ECC(user_data); ReturnStatus ret; enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); /* show popup dialog when user first time click ECC config */ show_ecc_toggle_warning_dlg(ctk_ecc); /* set the newly specified ECC value */ ret = NvCtrlSetAttribute(ctk_ecc->handle, NV_CTRL_GPU_ECC_CONFIGURATION, enabled); if (ret != NvCtrlSuccess) { ctk_config_statusbar_message(ctk_ecc->ctk_config, "Failed to set ECC configuration!"); return; } ctk_ecc->ecc_configured = enabled; gtk_widget_set_sensitive(ctk_ecc->reset_default_config_button, TRUE); /* Update status bar message */ post_ecc_configuration_update(ctk_ecc); } /* ecc_config_button_toggled() */ GtkWidget* ctk_ecc_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event) { GObject *object; CtkEcc *ctk_ecc; GtkWidget *hbox, *hbox2, *vbox, *hsep, *hseparator, *table; GtkWidget *banner, *label, *eventbox; int64_t dbit_error; int64_t aggregate_dbit_error; gint ecc_config_supported; gint val, row = 0; gboolean dbit_error_available; gboolean aggregate_dbit_error_available; gboolean ecc_enabled; gboolean ecc_default_status; ReturnStatus ret; gchar *ecc_enabled_string; /* make sure we have a handle */ g_return_val_if_fail(handle != NULL, NULL); /* * check if ECC support available. */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_ECC_SUPPORTED, &val); if (ret != NvCtrlSuccess || val != NV_CTRL_GPU_ECC_SUPPORTED_TRUE) { return NULL; } /* create the CtkEcc object */ object = g_object_new(CTK_TYPE_ECC, NULL); ctk_ecc = CTK_ECC(object); ctk_ecc->handle = handle; ctk_ecc->ctk_config = ctk_config; ctk_ecc->ecc_toggle_warning_dlg_shown = FALSE; dbit_error_available = TRUE; aggregate_dbit_error_available = TRUE; dbit_error = 0; aggregate_dbit_error = 0; /* Query ECC Status */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_ECC_STATUS, &val); if (ret != NvCtrlSuccess || val == NV_CTRL_GPU_ECC_STATUS_DISABLED) { ecc_enabled = FALSE; ecc_enabled_string = "Disabled"; } else { ecc_enabled = TRUE; ecc_enabled_string = "Enabled"; } ctk_ecc->ecc_enabled = ecc_enabled; /* Query ECC Configuration */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_ECC_CONFIGURATION, &val); if (ret != NvCtrlSuccess || val == NV_CTRL_GPU_ECC_CONFIGURATION_DISABLED) { ctk_ecc->ecc_configured = FALSE; } else { ctk_ecc->ecc_configured = TRUE; } /* get default status */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_ECC_DEFAULT_CONFIGURATION, &val); if (ret != NvCtrlSuccess || val == NV_CTRL_GPU_ECC_DEFAULT_CONFIGURATION_DISABLED) { ecc_default_status = FALSE; } else { ecc_default_status = TRUE; } /* Query ECC errors */ ret = NvCtrlGetAttribute64(handle, NV_CTRL_GPU_ECC_DOUBLE_BIT_ERRORS, &dbit_error); if ( ret != NvCtrlSuccess ) { dbit_error_available = FALSE; } ret = NvCtrlGetAttribute64(handle, NV_CTRL_GPU_ECC_AGGREGATE_DOUBLE_BIT_ERRORS, &aggregate_dbit_error); if ( ret != NvCtrlSuccess ) { aggregate_dbit_error_available = FALSE; } ctk_ecc->dbit_error_available = dbit_error_available; ctk_ecc->aggregate_dbit_error_available = aggregate_dbit_error_available; /* Query ECC configuration supported */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_ECC_CONFIGURATION_SUPPORTED, &ecc_config_supported); if ( ret != NvCtrlSuccess ) { ecc_config_supported = 0; } /* set container properties for the CtkEcc widget */ gtk_box_set_spacing(GTK_BOX(ctk_ecc), 5); /* banner */ banner = ctk_banner_image_new(BANNER_ARTWORK_GPU); gtk_box_pack_start(GTK_BOX(object), banner, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(object), vbox, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new("ECC Status"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); table = gtk_table_new(1, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); /* ECC Status */ hbox2 = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox2, 0, 1, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("ECC:"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); eventbox = gtk_event_box_new(); gtk_table_attach(GTK_TABLE(table), eventbox, 1, 2, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(ecc_enabled_string); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_container_add(GTK_CONTAINER(eventbox), label); ctk_config_set_tooltip(ctk_config, eventbox, __ecc_status_help); ctk_ecc->status = label; row += 3; /* Add ECC Errors */ if ( dbit_error_available ) { ctk_ecc->dbit_error = add_table_int_row(ctk_config, table, __dbit_error_help, "Double-bit ECC Errors:", dbit_error, row, ecc_enabled); row += 3; // add vertical padding between rows } if ( aggregate_dbit_error_available ) { ctk_ecc->aggregate_dbit_error = add_table_int_row(ctk_config, table, __aggregate_dbit_error_help, "Aggregate Double-bit ECC Errors:", aggregate_dbit_error, row, ecc_enabled); } /* ECC configuration settings */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new("ECC Configuration"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hsep = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hsep, TRUE, TRUE, 5); hbox2 = gtk_hbox_new(FALSE, 0); ctk_ecc->configuration_status = gtk_check_button_new_with_label("Enable ECC"); gtk_box_pack_start(GTK_BOX(hbox2), ctk_ecc->configuration_status, FALSE, FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox2), 5); gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ctk_ecc->configuration_status), ctk_ecc->ecc_configured); ctk_config_set_tooltip(ctk_config, ctk_ecc->configuration_status, __configuration_status_help); g_signal_connect(G_OBJECT(ctk_ecc->configuration_status), "clicked", G_CALLBACK(ecc_config_button_toggled), (gpointer) ctk_ecc); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_GPU_ECC_CONFIGURATION), G_CALLBACK(ecc_configuration_update_received), (gpointer) ctk_ecc); gtk_widget_set_sensitive(ctk_ecc->configuration_status, ecc_config_supported); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(ctk_ecc), hbox, FALSE, FALSE, 0); /* Add buttons */ if ( dbit_error_available ) { ctk_ecc->clear_button = gtk_button_new_with_label("Clear ECC Errors"); gtk_box_pack_end(GTK_BOX(hbox), ctk_ecc->clear_button, FALSE, FALSE, 0); ctk_config_set_tooltip(ctk_config, ctk_ecc->clear_button, __clear_button_help); gtk_widget_set_sensitive(ctk_ecc->clear_button, ecc_enabled); g_signal_connect(G_OBJECT(ctk_ecc->clear_button), "clicked", G_CALLBACK(clear_ecc_errors_button_clicked), (gpointer) ctk_ecc); } if ( aggregate_dbit_error_available ) { ctk_ecc->clear_aggregate_button = gtk_button_new_with_label("Clear Aggregate ECC Errors"); gtk_box_pack_end(GTK_BOX(hbox), ctk_ecc->clear_aggregate_button, FALSE, FALSE, 0); ctk_config_set_tooltip(ctk_config, ctk_ecc->clear_button, __clear_aggregate_button_help); gtk_widget_set_sensitive(ctk_ecc->clear_aggregate_button, ecc_enabled); g_signal_connect(G_OBJECT(ctk_ecc->clear_aggregate_button), "clicked", G_CALLBACK(clear_aggregate_ecc_errors_button_clicked), (gpointer) ctk_ecc); } ctk_ecc->reset_default_config_button = gtk_button_new_with_label("Reset Default Configuration"); eventbox = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(eventbox), ctk_ecc->reset_default_config_button); gtk_box_pack_end(GTK_BOX(hbox), eventbox, FALSE, FALSE, 5); ctk_config_set_tooltip(ctk_config, ctk_ecc->reset_default_config_button, __reset_default_config_button_help); gtk_widget_set_sensitive(ctk_ecc->reset_default_config_button, ecc_config_supported && (ecc_enabled != ecc_default_status)); g_signal_connect(G_OBJECT(ctk_ecc->reset_default_config_button), "clicked", G_CALLBACK(reset_default_config_button_clicked), (gpointer) ctk_ecc); /* Register a timer callback to update Ecc status info */ ctk_config_add_timer(ctk_ecc->ctk_config, DEFAULT_UPDATE_ECC_STATUS_INFO_TIME_INTERVAL, "ECC Settings", (GSourceFunc) update_ecc_info, (gpointer) ctk_ecc); gtk_widget_show_all(GTK_WIDGET(ctk_ecc)); update_ecc_info(ctk_ecc); return GTK_WIDGET(ctk_ecc); } GtkTextBuffer *ctk_ecc_create_help(GtkTextTagTable *table, CtkEcc *ctk_ecc) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_heading(b, &i, "ECC Settings Help"); ctk_help_para(b, &i, "%s", __ecc_settings_help); ctk_help_heading(b, &i, "ECC"); ctk_help_para(b, &i, "%s", __ecc_status_help); if (ctk_ecc->dbit_error_available) { ctk_help_heading(b, &i, "Double-bit ECC Errors"); ctk_help_para(b, &i, "%s", __dbit_error_help); } if (ctk_ecc->aggregate_dbit_error_available) { ctk_help_heading(b, &i, "Aggregate Double-bit ECC Errors"); ctk_help_para(b, &i, "%s", __aggregate_dbit_error_help); } ctk_help_heading(b, &i, "ECC Configuration"); ctk_help_para(b, &i, "%s", __configuration_status_help); ctk_help_heading(b, &i, "Enable ECC"); ctk_help_para(b, &i, "%s", __ecc_status_help); if (ctk_ecc->dbit_error_available) { ctk_help_heading(b, &i, "Clear ECC Errors"); ctk_help_para(b, &i, "%s", __clear_button_help); } if (ctk_ecc->aggregate_dbit_error_available) { ctk_help_heading(b, &i, "Clear Aggregate ECC Errors"); ctk_help_para(b, &i, "%s", __clear_aggregate_button_help); } ctk_help_heading(b, &i, "Reset Default Configuration"); ctk_help_para(b, &i, "%s", __reset_default_config_button_help); ctk_help_finish(b); return b; } void ctk_ecc_start_timer(GtkWidget *widget) { CtkEcc *ctk_ecc = CTK_ECC(widget); /* Start the ECC timer */ ctk_config_start_timer(ctk_ecc->ctk_config, (GSourceFunc) update_ecc_info, (gpointer) ctk_ecc); } void ctk_ecc_stop_timer(GtkWidget *widget) { CtkEcc *ctk_ecc = CTK_ECC(widget); /* Stop the ECC timer */ ctk_config_stop_timer(ctk_ecc->ctk_config, (GSourceFunc) update_ecc_info, (gpointer) ctk_ecc); } nvidia-settings/src/gtk+-2.x/ctkcolorcorrection.c0000664000175000017500000011111012236467170022145 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "NvCtrlAttributes.h" #include "rgb_xpm.h" #include "red_xpm.h" #include "green_xpm.h" #include "blue_xpm.h" #include "ctkcurve.h" #include "ctkscale.h" #include "ctkcolorcorrection.h" #include "ctkconfig.h" #include "ctkhelp.h" #include #include static const char *__active_color_help = "The Active Color Channel drop-down " "menu allows you to select the color channel controlled by the Brightness, " "Contrast and Gamma sliders. You can adjust the red, green or blue channels " "individually or all three channels at once."; static const char *__resest_button_help = "The Reset Hardware Defaults " "button restores the color correction settings to their default values."; static const char *__confirm_button_help = "Some color correction settings " "can yield an unusable display " "(e.g., making the display unreadably dark or light). When you " "change the color correction values, the '10 Seconds to Confirm' " "button will count down to zero. If you have not clicked the " "button by then to accept the changes, it will restore your previous values."; static const char *__color_curve_help = "The color curve graph changes to " "reflect your adjustments made with the Brightness, Contrast, and Gamma " "sliders."; static void option_menu_changed (GtkOptionMenu *, gpointer); static void set_button_sensitive (GtkButton *); static void reset_button_clicked (GtkButton *, gpointer); static void set_color_state (CtkColorCorrection *, gint, gint, gfloat, gboolean); static void confirm_button_clicked (GtkButton *, gpointer); static void adjustment_value_changed (GtkAdjustment *, gpointer); static gfloat get_attribute_channel_value (CtkColorCorrection *, gint, gint); static void flush_attribute_channel_values (CtkColorCorrection *, gint, gint); static void ctk_color_correction_class_init(CtkColorCorrectionClass *); static void apply_parsed_attribute_list(CtkColorCorrection *, ParsedAttribute *); static gboolean do_confirm_countdown (gpointer); static void update_confirm_text (CtkColorCorrection *); enum { CHANGED, LAST_SIGNAL }; static guint signals[LAST_SIGNAL] = { 0 }; #define RED RED_CHANNEL_INDEX #define GREEN GREEN_CHANNEL_INDEX #define BLUE BLUE_CHANNEL_INDEX #define ALL_CHANNELS_INDEX 3 #define CONTRAST (CONTRAST_INDEX - CONTRAST_INDEX) #define BRIGHTNESS (BRIGHTNESS_INDEX - CONTRAST_INDEX) #define GAMMA (GAMMA_INDEX - CONTRAST_INDEX) #define DEFAULT_CONFIRM_COLORCORRECTION_TIMEOUT 10 #define CREATE_COLOR_ADJUSTMENT(adj, attr, min, max) \ { \ gdouble _step_incr, _page_incr, _def; \ \ _step_incr = ((gdouble)((max) - (min)))/250.0; \ _page_incr = ((gdouble)((max) - (min)))/25.0; \ \ _def = get_attribute_channel_value(ctk_color_correction, \ (attr), ALL_CHANNELS); \ \ (adj) = gtk_adjustment_new(_def, (min), (max), \ _step_incr, _page_incr, 0.0); \ } GType ctk_color_correction_get_type( void ) { static GType ctk_color_correction_type = 0; if (!ctk_color_correction_type) { static const GTypeInfo ctk_color_correction_info = { sizeof (CtkColorCorrectionClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ctk_color_correction_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkColorCorrection), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_color_correction_type = g_type_register_static(GTK_TYPE_VBOX, "CtkColorCorrection", &ctk_color_correction_info, 0); } return ctk_color_correction_type; } static void ctk_color_correction_class_init(CtkColorCorrectionClass *ctk_color_correction_class) { signals[CHANGED] = g_signal_new("changed", G_OBJECT_CLASS_TYPE(ctk_color_correction_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(CtkColorCorrectionClass, changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } GtkWidget* ctk_color_correction_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, ParsedAttribute *p, CtkEvent *ctk_event) { GObject *object; CtkColorCorrection *ctk_color_correction; GtkRequisition requisition; GtkWidget *menu; GtkWidget *image; GtkWidget *label; GtkWidget *scale; GtkWidget *curve; GtkWidget *menu_item; GtkWidget *alignment; GtkWidget *mainhbox; GtkWidget *leftvbox; GtkWidget *rightvbox; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *button, *confirm_button, *confirm_label; GtkWidget *widget; GtkWidget *hsep; GtkWidget *eventbox; object = g_object_new(CTK_TYPE_COLOR_CORRECTION, NULL); ctk_color_correction = CTK_COLOR_CORRECTION(object); ctk_color_correction->handle = handle; ctk_color_correction->ctk_config = ctk_config; ctk_color_correction->confirm_timer = 0; ctk_color_correction->confirm_countdown = DEFAULT_CONFIRM_COLORCORRECTION_TIMEOUT; apply_parsed_attribute_list(ctk_color_correction, p); gtk_box_set_spacing(GTK_BOX(ctk_color_correction), 10); /* create the main hbox and the two main vboxes*/ mainhbox = gtk_hbox_new(FALSE, 10); gtk_box_pack_start(GTK_BOX(ctk_color_correction), mainhbox, FALSE, FALSE, 0); leftvbox = gtk_vbox_new(FALSE, 10); gtk_box_pack_start(GTK_BOX(mainhbox), leftvbox, FALSE, FALSE, 0); rightvbox = gtk_vbox_new(FALSE, 10); gtk_box_pack_start(GTK_BOX(mainhbox), rightvbox, TRUE, TRUE, 0); /* * Option menu: MIDDLE - LEFT * * This option menu allows the users to select which color_box * channel to apply contrast, brightness or gamma settings to. */ alignment = gtk_alignment_new(1, 1, 0, 0); gtk_box_pack_start(GTK_BOX(leftvbox), alignment, TRUE, TRUE, 0); vbox = gtk_vbox_new(FALSE, 5); label = gtk_label_new("Active Color Channel:"); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(alignment), vbox); menu = gtk_menu_new(); menu_item = gtk_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(menu_item), hbox); label = gtk_label_new("All Channels"); image = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_xpm_data(rgb_xpm)); gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10); menu_item = gtk_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(menu_item), hbox); label = gtk_label_new ("Red"); image = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_xpm_data(red_xpm)); gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10); menu_item = gtk_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(menu_item), hbox); label = gtk_label_new("Green"); image = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_xpm_data(green_xpm)); gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10); menu_item = gtk_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(menu_item), hbox); label = gtk_label_new("Blue"); image = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_xpm_data(blue_xpm)); gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10); ctk_color_correction->option_menu = gtk_option_menu_new (); gtk_option_menu_set_menu (GTK_OPTION_MENU(ctk_color_correction->option_menu), menu); gtk_box_pack_start(GTK_BOX(vbox), ctk_color_correction->option_menu, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(ctk_color_correction->option_menu), "color_channel", GINT_TO_POINTER(ALL_CHANNELS)); g_signal_connect(G_OBJECT(ctk_color_correction->option_menu), "changed", G_CALLBACK(option_menu_changed), (gpointer) ctk_color_correction); ctk_config_set_tooltip(ctk_config, ctk_color_correction->option_menu, __active_color_help); /* * Gamma curve: BOTTOM - LEFT * * This gamma curve plots the current color_box ramps in response * to user changes to contrast, brightness and gamma. */ alignment = gtk_alignment_new(0, 0, 1.0, 1.0); gtk_box_pack_start(GTK_BOX(leftvbox), alignment, TRUE, TRUE, 0); curve = ctk_curve_new(handle, GTK_WIDGET(ctk_color_correction)); eventbox = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(eventbox), curve); gtk_container_add(GTK_CONTAINER(alignment), eventbox); ctk_config_set_tooltip(ctk_config, eventbox, __color_curve_help); /* * Reset button: BOTTOM - RIGHT (see below) * * This button will reset the contrast, brightness and gamma * settings to their respective default values (for all channels). */ hbox = gtk_hbox_new(FALSE, 0); button = gtk_button_new_with_label("Reset Hardware Defaults"); gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); confirm_button = gtk_button_new(); confirm_label = gtk_label_new("Confirm Current Changes"); gtk_container_add(GTK_CONTAINER(confirm_button), confirm_label); eventbox = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(eventbox), confirm_button); gtk_box_pack_end(GTK_BOX(hbox), eventbox, FALSE, FALSE, 5); gtk_widget_set_sensitive(confirm_button, FALSE); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(reset_button_clicked), (gpointer) ctk_color_correction); g_signal_connect(G_OBJECT(confirm_button), "clicked", G_CALLBACK(confirm_button_clicked), (gpointer) ctk_color_correction); ctk_color_correction->confirm_label = confirm_label; ctk_color_correction->confirm_button = confirm_button; ctk_config_set_tooltip(ctk_config, eventbox, __confirm_button_help); ctk_config_set_tooltip(ctk_config, button, __resest_button_help); /* * Control sliders: MIDDLE - CENTER->RIGHT * * The user controls brightness, contrast and gamma values for * either or all of the possible color_box channels using these * sliders. */ /* brightness slider */ CREATE_COLOR_ADJUSTMENT(ctk_color_correction->brightness_adjustment, BRIGHTNESS_VALUE, BRIGHTNESS_MIN, BRIGHTNESS_MAX); g_object_set_data(G_OBJECT(ctk_color_correction->brightness_adjustment), "color_attribute", GINT_TO_POINTER(BRIGHTNESS_VALUE)); g_signal_connect(G_OBJECT(ctk_color_correction->brightness_adjustment), "value_changed", G_CALLBACK(adjustment_value_changed), (gpointer) ctk_color_correction); g_signal_connect_swapped (G_OBJECT(ctk_color_correction->brightness_adjustment), "value_changed", G_CALLBACK(set_button_sensitive), (gpointer) button); scale = ctk_scale_new (GTK_ADJUSTMENT(ctk_color_correction->brightness_adjustment), "Brightness", ctk_config, G_TYPE_DOUBLE); gtk_box_pack_start(GTK_BOX(rightvbox), scale, TRUE, TRUE, 0); widget = CTK_SCALE(scale)->gtk_scale; ctk_config_set_tooltip(ctk_config, widget, "The Brightness slider alters " "the amount of brightness for the selected color " "channel(s)."); /* contrast slider */ CREATE_COLOR_ADJUSTMENT(ctk_color_correction->contrast_adjustment, CONTRAST_VALUE, CONTRAST_MIN, CONTRAST_MAX); g_object_set_data(G_OBJECT(ctk_color_correction->contrast_adjustment), "color_attribute", GINT_TO_POINTER(CONTRAST_VALUE)); g_signal_connect(G_OBJECT(ctk_color_correction->contrast_adjustment), "value_changed", G_CALLBACK(adjustment_value_changed), (gpointer) ctk_color_correction); g_signal_connect_swapped (G_OBJECT(ctk_color_correction->contrast_adjustment), "value_changed", G_CALLBACK(set_button_sensitive), (gpointer) button); scale = ctk_scale_new (GTK_ADJUSTMENT(ctk_color_correction->contrast_adjustment), "Contrast", ctk_config, G_TYPE_DOUBLE); gtk_box_pack_start(GTK_BOX(rightvbox), scale, TRUE, TRUE, 0); widget = CTK_SCALE(scale)->gtk_scale; ctk_config_set_tooltip(ctk_config, widget, "The Contrast slider alters " "the amount of contrast for the selected color " "channel(s)."); /* gamma slider */ CREATE_COLOR_ADJUSTMENT(ctk_color_correction->gamma_adjustment, GAMMA_VALUE, GAMMA_MIN, GAMMA_MAX); g_object_set_data(G_OBJECT(ctk_color_correction->gamma_adjustment), "color_attribute", GINT_TO_POINTER(GAMMA_VALUE)); g_signal_connect(G_OBJECT(ctk_color_correction->gamma_adjustment), "value_changed", G_CALLBACK(adjustment_value_changed), (gpointer) ctk_color_correction); g_signal_connect_swapped (G_OBJECT(ctk_color_correction->gamma_adjustment), "value_changed", G_CALLBACK(set_button_sensitive), (gpointer) button); scale = ctk_scale_new (GTK_ADJUSTMENT(ctk_color_correction->gamma_adjustment), "Gamma", ctk_config, G_TYPE_DOUBLE); gtk_box_pack_start(GTK_BOX(rightvbox), scale, TRUE, TRUE, 0); widget = CTK_SCALE(scale)->gtk_scale; ctk_config_set_tooltip(ctk_config, widget, "The Gamma slider alters " "the amount of gamma for the selected color " "channel(s)."); /* horizontal separator */ vbox = gtk_vbox_new(FALSE, 10); gtk_box_pack_start(GTK_BOX(ctk_color_correction), vbox, FALSE, FALSE, 0); hsep = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), hsep, TRUE, TRUE, 0); /* * Reset button: BOTTOM - RIGHT (see above) * * The button was created earlier to make it accessible as event data * and still needs to be packed. */ alignment = gtk_alignment_new(1, 1, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), hbox); gtk_box_pack_start(GTK_BOX(object), alignment, TRUE, TRUE, 0); /* finally, show the widget */ gtk_widget_show_all(GTK_WIDGET(object)); /* * lock the size of the confirm button, so that it is not resized * when we change the button text later. * * Note: this assumes that the initial size of the button is the * largest size needed for any text placed in the button. In the * case of the confirm button, this works out: * * "Confirm Current Changes" <-- initial value * "%d Seconds to Confirm" */ gtk_widget_size_request(ctk_color_correction->confirm_label, &requisition); gtk_widget_set_size_request(ctk_color_correction->confirm_label, requisition.width, -1); return GTK_WIDGET(object); } static void option_menu_changed( GtkOptionMenu *option_menu, gpointer user_data ) { GtkObject *adjustment; gint history, attribute, channel; CtkColorCorrection *ctk_color_correction; gfloat value; gint i; ctk_color_correction = CTK_COLOR_CORRECTION(user_data); history = gtk_option_menu_get_history(option_menu); switch (history) { default: case 0: channel = ALL_CHANNELS; break; case 1: channel = RED_CHANNEL; break; case 2: channel = GREEN_CHANNEL; break; case 3: channel = BLUE_CHANNEL; break; } /* * store the currently selected color channel, so that * adjustment_value_changed() can update the correct channel(s) in * response to slider changes */ g_object_set_data(G_OBJECT(option_menu), "color_channel", GINT_TO_POINTER(channel)); for (i = 0; i < 3; i++) { if (i == 0) { adjustment = ctk_color_correction->brightness_adjustment; attribute = BRIGHTNESS_VALUE; } else if (i == 1) { adjustment = ctk_color_correction->contrast_adjustment; attribute = CONTRAST_VALUE; } else { adjustment = ctk_color_correction->gamma_adjustment; attribute = GAMMA_VALUE; } value = get_attribute_channel_value(ctk_color_correction, attribute, channel); g_signal_handlers_block_matched (G_OBJECT(adjustment), G_SIGNAL_MATCH_FUNC, 0, 0, NULL, G_CALLBACK(adjustment_value_changed), NULL); gtk_adjustment_set_value(GTK_ADJUSTMENT(adjustment), value); g_signal_handlers_unblock_matched (G_OBJECT(adjustment), G_SIGNAL_MATCH_FUNC, 0, 0, NULL, G_CALLBACK(adjustment_value_changed), NULL); } } static void set_button_sensitive( GtkButton *button ) { gtk_widget_set_sensitive (GTK_WIDGET (button), TRUE); } /** set_color_state() ******************* * * Stores color state to cur_slider_val[attribute][channel] * and prev_slider_val[attribute][channel]. * **/ static void set_color_state(CtkColorCorrection *ctk_color_correction, gint attribute_idx, gint channel_mask, gfloat value, gboolean all ) { if (channel_mask & RED_CHANNEL) { ctk_color_correction->cur_slider_val[attribute_idx][RED] = value; if (all) { ctk_color_correction->prev_slider_val[attribute_idx][RED] = value; } } if (channel_mask & GREEN_CHANNEL) { ctk_color_correction->cur_slider_val[attribute_idx][GREEN] = value; if (all) { ctk_color_correction->prev_slider_val[attribute_idx][GREEN] = value; } } if (channel_mask & BLUE_CHANNEL) { ctk_color_correction->cur_slider_val[attribute_idx][BLUE] = value; if (all) { ctk_color_correction->prev_slider_val[attribute_idx][BLUE] = value; } } if (channel_mask == ALL_CHANNELS) { ctk_color_correction->cur_slider_val [attribute_idx][ALL_CHANNELS_INDEX] = value; if (all) { ctk_color_correction->prev_slider_val [attribute_idx][ALL_CHANNELS_INDEX] = value; } } } /* set_color_state() */ /** confirm_button_clicked() ************* * * Callback function which stores current values to previous value when user * clicks Confirm button. * **/ static void confirm_button_clicked( GtkButton *button, gpointer user_data ) { CtkColorCorrection *ctk_color_correction = CTK_COLOR_CORRECTION(user_data); /* Store cur_slider_val[attribute][channel] to prev_slider_val[attribute][channel]. */ memcpy (ctk_color_correction->prev_slider_val, ctk_color_correction->cur_slider_val, sizeof(ctk_color_correction->cur_slider_val)); /* kill the timer */ g_source_remove(ctk_color_correction->confirm_timer); ctk_color_correction->confirm_timer = 0; /* Reset confirm button text */ gtk_label_set_text(GTK_LABEL(ctk_color_correction->confirm_label), "Confirm Current Changes"); gtk_widget_set_sensitive(ctk_color_correction->confirm_button, FALSE); } /* confirm_button_clicked() */ static void reset_button_clicked( GtkButton *button, gpointer user_data ) { CtkColorCorrection *ctk_color_correction; GtkOptionMenu *option_menu; ctk_color_correction = CTK_COLOR_CORRECTION(user_data); /* Set default values */ set_color_state(ctk_color_correction, CONTRAST, ALL_CHANNELS, CONTRAST_DEFAULT, TRUE); set_color_state(ctk_color_correction, BRIGHTNESS, ALL_CHANNELS, BRIGHTNESS_DEFAULT, TRUE); set_color_state(ctk_color_correction, GAMMA, ALL_CHANNELS, GAMMA_DEFAULT, TRUE); flush_attribute_channel_values(ctk_color_correction, ALL_VALUES, ALL_CHANNELS); option_menu = GTK_OPTION_MENU(ctk_color_correction->option_menu); if (gtk_option_menu_get_history(option_menu) == 0) { /* * gtk_option_menu_set_history will not emit the "changed" signal * unless the new index differs from the old one; reasonable, but * we need to cope with it here. */ gtk_option_menu_set_history(option_menu, 1); gtk_option_menu_set_history(option_menu, 0); } else { gtk_option_menu_set_history(option_menu, 0); } ctk_config_statusbar_message(ctk_color_correction->ctk_config, "Reset color correction hardware defaults."); gtk_widget_set_sensitive(GTK_WIDGET(ctk_color_correction->confirm_button), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(button), FALSE); /* kill the timer */ if (ctk_color_correction->confirm_timer) { g_source_remove(ctk_color_correction->confirm_timer); ctk_color_correction->confirm_timer = 0; } /* Reset confirm button text */ gtk_label_set_text(GTK_LABEL(ctk_color_correction->confirm_label), "Confirm Current Changes"); } static void adjustment_value_changed( GtkAdjustment *adjustment, gpointer user_data ) { CtkColorCorrection *ctk_color_correction; gint attribute, channel; gint attribute_idx; gfloat value; gchar *channel_str, *attribute_str; ctk_color_correction = CTK_COLOR_CORRECTION(user_data); user_data = g_object_get_data(G_OBJECT(adjustment), "color_attribute"); attribute = GPOINTER_TO_INT(user_data); user_data = g_object_get_data (G_OBJECT(ctk_color_correction->option_menu), "color_channel"); channel = GPOINTER_TO_INT(user_data); value = gtk_adjustment_get_value(adjustment); /* start timer for confirming changes */ ctk_color_correction->confirm_countdown = DEFAULT_CONFIRM_COLORCORRECTION_TIMEOUT; update_confirm_text(ctk_color_correction); if (ctk_color_correction->confirm_timer == 0) { ctk_color_correction->confirm_timer = g_timeout_add(1000, (GSourceFunc)do_confirm_countdown, (gpointer) (ctk_color_correction)); } switch (attribute) { case CONTRAST_VALUE: attribute_idx = CONTRAST; attribute_str = "contrast"; break; case BRIGHTNESS_VALUE: attribute_idx = BRIGHTNESS; attribute_str = "brightness"; break; case GAMMA_VALUE: attribute_idx = GAMMA; attribute_str = "gamma"; break; default: return; } switch (channel) { case RED_CHANNEL: channel_str = "red "; break; case GREEN_CHANNEL: channel_str = "green "; break; case BLUE_CHANNEL: channel_str = "blue "; break; case ALL_CHANNELS: channel_str = ""; break; default: return; } set_color_state(ctk_color_correction, attribute_idx, channel, value, FALSE); flush_attribute_channel_values(ctk_color_correction, attribute, channel); ctk_config_statusbar_message(ctk_color_correction->ctk_config, "Set %s%s to %f.", channel_str, attribute_str, value); gtk_widget_set_sensitive(ctk_color_correction->confirm_button, TRUE); } static gfloat get_attribute_channel_value(CtkColorCorrection *ctk_color_correction, gint attribute, gint channel) { int attribute_idx, channel_idx; switch (attribute) { case CONTRAST_VALUE: attribute_idx = CONTRAST; break; case BRIGHTNESS_VALUE: attribute_idx = BRIGHTNESS; break; case GAMMA_VALUE: attribute_idx = GAMMA; break; default: return 0.0; } switch (channel) { case ALL_CHANNELS: channel_idx = ALL_CHANNELS_INDEX; break; case RED_CHANNEL: channel_idx = RED_CHANNEL_INDEX; break; case GREEN_CHANNEL: channel_idx = GREEN_CHANNEL_INDEX; break; case BLUE_CHANNEL: channel_idx = BLUE_CHANNEL_INDEX; break; default: return 0.0; } return ctk_color_correction->cur_slider_val[attribute_idx][channel_idx]; } static void flush_attribute_channel_values( CtkColorCorrection *ctk_color_correction, gint attribute, gint channel ) { NvCtrlAttributeHandle *handle = ctk_color_correction->handle; NvCtrlSetColorAttributes(handle, ctk_color_correction->cur_slider_val[CONTRAST], ctk_color_correction->cur_slider_val[BRIGHTNESS], ctk_color_correction->cur_slider_val[GAMMA], attribute | channel); g_signal_emit(ctk_color_correction, signals[CHANGED], 0); } static void apply_parsed_attribute_list( CtkColorCorrection *ctk_color_correction, ParsedAttribute *p ) { int target_type, target_id; unsigned int attr = 0; set_color_state(ctk_color_correction, CONTRAST, ALL_CHANNELS, CONTRAST_DEFAULT, TRUE); set_color_state(ctk_color_correction, BRIGHTNESS, ALL_CHANNELS, BRIGHTNESS_DEFAULT, TRUE); set_color_state(ctk_color_correction, GAMMA, ALL_CHANNELS, GAMMA_DEFAULT, TRUE); target_type = NvCtrlGetTargetType(ctk_color_correction->handle); target_id = NvCtrlGetTargetId(ctk_color_correction->handle); while (p) { CtrlHandleTargetNode *node; if (!p->next) goto next_attribute; if (!(p->flags & NV_PARSER_TYPE_COLOR_ATTRIBUTE)) goto next_attribute; /* * Apply the parsed attribute's settings only if the color * correction's target matches one of the (parse attribute's) * specification targets. */ for (node = p->targets; node && node->next; node = node->next) { int attr_target_type = NvCtrlGetTargetType(node->t->h); int attr_target_id = NvCtrlGetTargetId(node->t->h); if ((attr_target_type != target_type) || (attr_target_id != target_id)) { continue; } switch (p->attr & (ALL_VALUES | ALL_CHANNELS)) { case (CONTRAST_VALUE | RED_CHANNEL): set_color_state(ctk_color_correction, CONTRAST, RED_CHANNEL, p->val.f, TRUE); break; case (CONTRAST_VALUE | GREEN_CHANNEL): set_color_state(ctk_color_correction, CONTRAST, GREEN_CHANNEL, p->val.f, TRUE); break; case (CONTRAST_VALUE | BLUE_CHANNEL): set_color_state(ctk_color_correction, CONTRAST, BLUE_CHANNEL, p->val.f, TRUE); break; case (CONTRAST_VALUE | ALL_CHANNELS): set_color_state(ctk_color_correction, CONTRAST, ALL_CHANNELS, p->val.f, TRUE); break; case (BRIGHTNESS_VALUE | RED_CHANNEL): set_color_state(ctk_color_correction, BRIGHTNESS, RED_CHANNEL, p->val.f, TRUE); break; case (BRIGHTNESS_VALUE | GREEN_CHANNEL): set_color_state(ctk_color_correction, BRIGHTNESS, GREEN_CHANNEL, p->val.f, TRUE); break; case (BRIGHTNESS_VALUE | BLUE_CHANNEL): set_color_state(ctk_color_correction, BRIGHTNESS, BLUE_CHANNEL, p->val.f, TRUE); break; case (BRIGHTNESS_VALUE | ALL_CHANNELS): set_color_state(ctk_color_correction, BRIGHTNESS, ALL_CHANNELS, p->val.f, TRUE); break; case (GAMMA_VALUE | RED_CHANNEL): set_color_state(ctk_color_correction, GAMMA, RED_CHANNEL, p->val.f, TRUE); break; case (GAMMA_VALUE | GREEN_CHANNEL): set_color_state(ctk_color_correction, GAMMA, GREEN_CHANNEL, p->val.f, TRUE); break; case (GAMMA_VALUE | BLUE_CHANNEL): set_color_state(ctk_color_correction, GAMMA, BLUE_CHANNEL, p->val.f, TRUE); break; case (GAMMA_VALUE | ALL_CHANNELS): set_color_state(ctk_color_correction, GAMMA, ALL_CHANNELS, p->val.f, TRUE); break; default: continue; } attr |= (p->attr & (ALL_VALUES | ALL_CHANNELS)); } next_attribute: p = p->next; } if (attr) { int i; /* * if all the separate color channels are the same for an * attribute, propagate the value to ALL_CHANNELS for that * attribute */ for (i = CONTRAST; i <= GAMMA; i++) { float val = ctk_color_correction->cur_slider_val[i][RED]; if ((ctk_color_correction->cur_slider_val[i][GREEN] == val) && (ctk_color_correction->cur_slider_val[i][BLUE] == val)) { set_color_state(ctk_color_correction, i, ALL_CHANNELS, val, TRUE); attr |= ALL_CHANNELS; } } NvCtrlSetColorAttributes(ctk_color_correction->handle, ctk_color_correction->cur_slider_val[CONTRAST], ctk_color_correction->cur_slider_val[BRIGHTNESS], ctk_color_correction->cur_slider_val[GAMMA], attr); } } /* apply_parsed_attribute_list() */ /** update_confirm_text() ************************************ * * Generates the text used to label confirmation button. * **/ static void update_confirm_text(CtkColorCorrection *ctk_color_correction) { gchar *str; str = g_strdup_printf("%d Seconds to Confirm", ctk_color_correction->confirm_countdown); gtk_label_set_text(GTK_LABEL(ctk_color_correction->confirm_label), str); g_free(str); } /* update_confirm_text() */ /** do_confirm_countdown() *********************************** * * timeout callback for reverting color correction slider changes if user not * confirm changes. * **/ static gboolean do_confirm_countdown(gpointer data) { gint attr, ch; CtkColorCorrection *ctk_color_correction = (CtkColorCorrection *)(data); unsigned int channels = 0; unsigned int attributes = 0; GtkOptionMenu *option_menu = GTK_OPTION_MENU(ctk_color_correction->option_menu); ctk_color_correction->confirm_countdown--; if (ctk_color_correction->confirm_countdown > 0) { update_confirm_text(ctk_color_correction); return True; } /* Countdown timed out, reset color settings to previous state */ for (attr = CONTRAST_INDEX; attr <= GAMMA_INDEX; attr++) { for (ch = RED; ch <= ALL_CHANNELS_INDEX; ch++) { /* Check for attribute channel value change. */ int index = attr - CONTRAST_INDEX; if (ctk_color_correction->cur_slider_val[index][ch] != ctk_color_correction->prev_slider_val[index][ch]) { ctk_color_correction->cur_slider_val[index][ch] = ctk_color_correction->prev_slider_val[index][ch]; attributes |= (1 << attr); channels |= (1 << ch); } } } if (attributes | channels) { flush_attribute_channel_values(ctk_color_correction, attributes, channels); } /* Refresh color correction page for current selected channel. */ option_menu_changed(option_menu, (gpointer)(ctk_color_correction)); /* Reset confirm button text */ gtk_label_set_text(GTK_LABEL(ctk_color_correction->confirm_label), "Confirm Current Changes"); /* Update status bar message */ ctk_config_statusbar_message(ctk_color_correction->ctk_config, "Reverted color correction changes, due to " "confirmation timeout."); ctk_color_correction->confirm_timer = 0; gtk_widget_set_sensitive(ctk_color_correction->confirm_button, FALSE); return False; } /* do_confirm_countdown() */ GtkTextBuffer *ctk_color_correction_create_help(GtkTextTagTable *table) { GtkTextIter i; GtkTextBuffer *b; const gchar *title = "X Server Color Correction"; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "%s Help", title); ctk_color_correction_tab_help(b, &i, title, FALSE /* randr */); ctk_help_heading(b, &i, "Reset Hardware Defaults"); ctk_help_para(b, &i, "%s", __resest_button_help); ctk_help_finish(b); return b; } void ctk_color_correction_tab_help(GtkTextBuffer *b, GtkTextIter *i, const gchar *title, gboolean randr) { ctk_help_heading(b, i, "Color Correction"); ctk_help_term(b, i, "Active Color Channel"); ctk_help_para(b, i, "%s", __active_color_help); ctk_help_term(b, i, "Brightness, Contrast and Gamma"); ctk_help_para(b, i, "The Brightness, Contrast and Gamma sliders " "allow you to adjust the brightness, contrast, " "or gamma values for the selected color channel(s). This " "helps you to compensate " "for variations in luminance between a source image and " "its output on a display device. This is useful when " "working with image processing applications to help " "provide more accurate color reproduction of images (such " "as photographs) when they are displayed on your " "monitor."); ctk_help_para(b, i, "Also, many 3D-accelerated games may appear too " "dark to play. Increasing the brightness and/or gamma " "value equally across all channels will make these games " "appear brighter, making them more playable."); ctk_help_para(b, i, "%s", __color_curve_help); if (randr) { ctk_help_para(b, i, "The %s tab uses the RandR extension to " "manipulate an RandR CRTC's gamma ramp.", title); } else { ctk_help_para(b, i, "The %s page uses the XF86VidMode extension " "to manipulate the X screen's gamma ramps", title); } ctk_help_term(b, i, "Confirm Current Changes"); ctk_help_para(b, i, "%s", __confirm_button_help); } nvidia-settings/src/gtk+-2.x/ctkditheringcontrols.h0000664000175000017500000000602512236467170022515 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2010 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_DITHERING_CONTROLS_H__ #define __CTK_DITHERING_CONTROLS_H__ #include "ctkevent.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_DITHERING_CONTROLS (ctk_dithering_controls_get_type()) #define CTK_DITHERING_CONTROLS(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_DITHERING_CONTROLS, \ CtkDitheringControls)) #define CTK_DITHERING_CONTROLS_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_DITHERING_CONTROLS, \ CtkDitheringControlsClass)) #define CTK_IS_DITHERING_CONTROLS(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_DITHERING_CONTROLS)) #define CTK_IS_DITHERING_CONTROLS_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_DITHERING_CONTROLS)) #define CTK_DITHERING_CONTROLS_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_DITHERING_CONTROLS, \ CtkDitheringControlsClass)) typedef struct _CtkDitheringControls CtkDitheringControls; typedef struct _CtkDitheringControlsClass CtkDitheringControlsClass; struct _CtkDitheringControls { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; char *name; GtkWidget *reset_button; CtkEvent *ctk_event; GtkWidget *dithering_controls_box; GtkWidget *dithering_mode_box; GtkWidget *dithering_depth_box; GtkWidget *dithering_config_menu; GtkWidget *dithering_mode_menu; GtkWidget *dithering_depth_menu; GtkWidget *dithering_config_txt; GtkWidget *dithering_mode_txt; GtkWidget *dithering_depth_txt; gint *dithering_mode_table; gint dithering_mode_table_size; }; struct _CtkDitheringControlsClass { GtkVBoxClass parent_class; }; GType ctk_dithering_controls_get_type (void) G_GNUC_CONST; GtkWidget* ctk_dithering_controls_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *, GtkWidget *, char *); void ctk_dithering_controls_reset (CtkDitheringControls*); void ctk_dithering_controls_setup (CtkDitheringControls*); void add_dithering_controls_help (CtkDitheringControls*, GtkTextBuffer *b, GtkTextIter *i); G_END_DECLS #endif /* __CTK_DITHERING_CONTROLS_H__ */ nvidia-settings/src/gtk+-2.x/ctkscale.h0000664000175000017500000000426612236467170020050 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_SCALE_H__ #define __CTK_SCALE_H__ #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_SCALE (ctk_scale_get_type()) #define CTK_SCALE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_SCALE, CtkScale)) #define CTK_SCALE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_SCALE, CtkScaleClass)) #define CTK_IS_SCALE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_SCALE)) #define CTK_IS_SCALE_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_SCALE)) #define CTK_SCALE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_SCALE, CtkScaleClass)) /* the widget within the CtkScale that to which tooltips should be attached */ #define CTK_SCALE_TOOLTIP_WIDGET(obj) \ ((CTK_SCALE(obj))->tooltip_widget) typedef struct _CtkScale CtkScale; typedef struct _CtkScaleClass CtkScaleClass; struct _CtkScale { GtkVBox parent; GtkAdjustment *gtk_adjustment; const gchar *label; GtkWidget *gtk_scale; GtkWidget *text_entry; gboolean text_entry_packed; GtkWidget *text_entry_container; GtkWidget *tooltip_widget; CtkConfig *ctk_config; gint value_type; }; struct _CtkScaleClass { GtkVBoxClass parent_class; }; GType ctk_scale_get_type (void) G_GNUC_CONST; GtkWidget* ctk_scale_new (GtkAdjustment *, const gchar *, CtkConfig *, gint); G_END_DECLS #endif /* __CTK_SCALE_H__ */ nvidia-settings/src/gtk+-2.x/ctkutils.c0000664000175000017500000003136312236467170020112 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "NVCtrlLib.h" #include "ctkutils.h" #include "msg.h" /* * This function checks that the GTK+ library in use is at least as new as the * given version number. Note this differs from gtk_check_version(), which * checks that the library in use is "compatible" with the given version (which * requires the library in use have both (1) a newer or equal version number and * (2) an equal major version number). */ gboolean ctk_check_min_gtk_version(guint required_major, guint required_minor, guint required_micro) { return (NV_VERSION3(required_major, required_minor, required_micro) <= NV_VERSION3(gtk_major_version, gtk_minor_version, gtk_micro_version)); } gchar *get_pcie_generation_string(NvCtrlAttributeHandle *handle) { ReturnStatus ret; gchar *s = NULL; int tmp; ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_PCIE_GENERATION, &tmp); if (ret == NvCtrlSuccess) { s = g_strdup_printf("Gen%u", tmp); } return s; } gchar *get_pcie_link_width_string(NvCtrlAttributeHandle *handle, int attribute) { ReturnStatus ret; gint tmp; gchar *s = NULL; ret = NvCtrlGetAttribute(handle, attribute, &tmp); if (ret != NvCtrlSuccess) { s = g_strdup_printf("Unknown"); } else { s = g_strdup_printf("x%d", tmp); } return s; } gchar *get_pcie_link_speed_string(NvCtrlAttributeHandle *handle, int attribute) { ReturnStatus ret; gint tmp; gchar *s = NULL; ret = NvCtrlGetAttribute(handle, attribute, &tmp); if (ret != NvCtrlSuccess) { s = g_strdup_printf("Unknown"); } else { s = g_strdup_printf("%.1f GT/s", tmp/1000.0); } return s; } /* * Used to check if current display enabled or disabled. */ void update_display_enabled_flag(NvCtrlAttributeHandle *handle, gboolean *display_enabled) { ReturnStatus ret; int val; /* Is display enabled? */ ret = NvCtrlGetAttribute(handle, NV_CTRL_DISPLAY_ENABLED, &val); *display_enabled = ((ret == NvCtrlSuccess) && (val == NV_CTRL_DISPLAY_ENABLED_TRUE)); } /* update_display_enabled_flag() */ gchar* create_gpu_name_string(NvCtrlAttributeHandle *gpu_handle) { gchar *gpu_name; gchar *gpu_product_name; ReturnStatus ret; ret = NvCtrlGetStringAttribute(gpu_handle, NV_CTRL_STRING_PRODUCT_NAME, &gpu_product_name); if (ret == NvCtrlSuccess && gpu_product_name) { gpu_name = g_strdup_printf("GPU %d - (%s)", NvCtrlGetTargetId(gpu_handle), gpu_product_name); } else { gpu_name = g_strdup_printf("GPU %d - (Unknown)", NvCtrlGetTargetId(gpu_handle)); } g_free(gpu_product_name); return gpu_name; } gchar* create_display_name_list_string(NvCtrlAttributeHandle *handle, unsigned int attr) { gchar *displays = NULL; gchar *typeIdName; gchar *logName; gchar *tmp_str; ReturnStatus ret; int *pData; int len; int i; Bool valid; /* List of Display Device connected on GPU */ ret = NvCtrlGetBinaryAttribute(handle, 0, attr, (unsigned char **)(&pData), &len); if (ret != NvCtrlSuccess) { goto done; } for (i = 0; i < pData[0]; i++) { int display_id = pData[i+1]; valid = XNVCTRLQueryTargetStringAttribute(NvCtrlGetDisplayPtr(handle), NV_CTRL_TARGET_TYPE_DISPLAY, display_id, 0, NV_CTRL_STRING_DISPLAY_DEVICE_NAME, &tmp_str); if (!valid) { logName = g_strdup("Unknown"); } else { logName = g_strdup(tmp_str); XFree(tmp_str); } valid = XNVCTRLQueryTargetStringAttribute(NvCtrlGetDisplayPtr(handle), NV_CTRL_TARGET_TYPE_DISPLAY, display_id, 0, NV_CTRL_STRING_DISPLAY_NAME_TYPE_ID, &tmp_str); if (!valid) { typeIdName = g_strdup_printf("DPY-%d", display_id); } else { typeIdName = g_strdup(tmp_str); XFree(tmp_str); } tmp_str = g_strdup_printf("%s (%s)", logName, typeIdName); g_free(logName); g_free(typeIdName); if (displays) { logName = g_strdup_printf("%s,\n%s", tmp_str, displays); g_free(displays); g_free(tmp_str); displays = logName; } else { displays = tmp_str; } } done: if (!displays) { displays = g_strdup("None"); } return displays; } GtkWidget *add_table_row_with_help_text(GtkWidget *table, CtkConfig *ctk_config, const char *help, const gint row, const gint col, // 0 = left, 1 = right const gfloat name_xalign, // 0 = top, 1 = bottom const gfloat name_yalign, const gchar *name, const gfloat value_xalign, const gfloat value_yalign, const gchar *value) { GtkWidget *label; label = gtk_label_new(name); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), name_xalign, name_yalign); gtk_table_attach(GTK_TABLE(table), label, col, col+1, row, row + 1, GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); if (value == NULL) label = gtk_label_new("Unknown"); else label = gtk_label_new(value); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), value_xalign, value_yalign); gtk_table_attach(GTK_TABLE(table), label, col+1, col+2, row, row + 1, GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); if ((help != NULL) || (ctk_config != NULL)) { ctk_config_set_tooltip(ctk_config, label, help); } return label; } GtkWidget *add_table_row(GtkWidget *table, const gint row, const gfloat name_xalign, // 0 = left, 1 = right const gfloat name_yalign, // 0 = top, 1 = bottom const gchar *name, const gfloat value_xalign, const gfloat value_yalign, const gchar *value) { return add_table_row_with_help_text(table, NULL, /* ctk_config */ NULL, /* help */ row, 0, /* col */ name_xalign, name_yalign, name, value_xalign, value_yalign, value); } /** ctk_get_parent_window() ****************************************** * * Returns the parent window of a widget, if one exists * **/ GtkWidget * ctk_get_parent_window(GtkWidget *child) { GtkWidget *parent = gtk_widget_get_parent(child); while (parent && !GTK_IS_WINDOW(parent)) { GtkWidget *last = parent; parent = gtk_widget_get_parent(last); if (!parent || parent == last) { /* GTK Error, can't find parent window! */ parent = NULL; break; } } return parent; } /* ctk_get_parent_window() */ /** ctk_display_error_msg() ****************************************** * * Displays an error message. * **/ void ctk_display_error_msg(GtkWidget *parent, gchar * msg) { GtkWidget *dlg; if (msg) { nv_error_msg("%s", msg); if (parent) { dlg = gtk_message_dialog_new (GTK_WINDOW(parent), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", msg); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); } } } /* ctk_display_error_msg() */ /** ctk_display_warning_msg() **************************************** * * Displays a warning message. * **/ void ctk_display_warning_msg(GtkWidget *parent, gchar * msg) { GtkWidget *dlg; if (msg) { nv_warning_msg("%s", msg); if (parent) { dlg = gtk_message_dialog_new (GTK_WINDOW(parent), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "%s", msg); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); } } } /* ctk_display_warning_msg() */ /** ctk_empty_container() ******************************************** * * Removes all (non internal) children widgets from a container * * XXX It might be useful later on to allow a callback to be called * for each widget that gets removed etc. * **/ void ctk_empty_container(GtkWidget *container) { GList *list; GList *node; list = gtk_container_get_children(GTK_CONTAINER(container)); node = list; while (node) { gtk_container_remove(GTK_CONTAINER(container), (GtkWidget *)(node->data)); node = node->next; } g_list_free(list); } /* ctk_empty_container() */ /* Updates the widget to use the text colors ('text' and 'base') for the * foreground and background colors. */ static void widget_use_text_colors_for_state(GtkWidget *widget, GtkStateType state) { gtk_widget_modify_fg(widget, state, &(widget->style->text[state])); gtk_widget_modify_bg(widget, state, &(widget->style->base[state])); } /* Callback for the "style-set" event, used to ensure that widgets that should * use the text colors for drawing still do so after a Theme update. */ static void force_text_colors_handler(GtkWidget *widget, GtkStyle *previous_style, gpointer user_data) { g_signal_handlers_block_by_func (G_OBJECT(widget), G_CALLBACK(force_text_colors_handler), user_data); /* Use text colors for foreground and background */ widget_use_text_colors_for_state(widget, GTK_STATE_NORMAL); widget_use_text_colors_for_state(widget, GTK_STATE_ACTIVE); widget_use_text_colors_for_state(widget, GTK_STATE_PRELIGHT); widget_use_text_colors_for_state(widget, GTK_STATE_SELECTED); widget_use_text_colors_for_state(widget, GTK_STATE_INSENSITIVE); g_signal_handlers_unblock_by_func (G_OBJECT(widget), G_CALLBACK(force_text_colors_handler), user_data); } void ctk_force_text_colors_on_widget(GtkWidget *widget) { /* Set the intial state */ force_text_colors_handler(widget, NULL, NULL); /* Ensure state is updated when style changes */ g_signal_connect(G_OBJECT(widget), "style-set", G_CALLBACK(force_text_colors_handler), (gpointer) NULL); } nvidia-settings/src/gtk+-2.x/ctkopengl.c0000664000175000017500000014225412236467170020240 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "ctkbanner.h" #include "ctkopengl.h" #include "ctkscale.h" #include "ctkconfig.h" #include "ctkhelp.h" static void vblank_sync_button_toggled (GtkWidget *, gpointer); static void post_vblank_sync_button_toggled(CtkOpenGL *, gboolean); static void post_allow_flipping_button_toggled(CtkOpenGL *, gboolean); static void post_force_stereo_button_toggled(CtkOpenGL *, gboolean); static void post_show_sli_visual_indicator_button_toggled(CtkOpenGL *, gboolean); static void post_show_multigpu_visual_indicator_button_toggled(CtkOpenGL *, gboolean); static void post_xinerama_stereo_button_toggled(CtkOpenGL *, gboolean); static void post_stereo_eyes_exchange_button_toggled(CtkOpenGL *, gboolean); static void post_aa_line_gamma_toggled(CtkOpenGL *, gboolean); static void post_use_conformant_clamping_button_toggled(CtkOpenGL *, gint); static void allow_flipping_button_toggled(GtkWidget *, gpointer); static void force_stereo_button_toggled (GtkWidget *, gpointer); static void xinerama_stereo_button_toggled (GtkWidget *, gpointer); static void stereo_eyes_exchange_button_toggled (GtkWidget *, gpointer); static void aa_line_gamma_toggled (GtkWidget *, gpointer); static void use_conformant_clamping_button_toggled(GtkWidget *, gpointer); static void show_sli_visual_indicator_button_toggled (GtkWidget *, gpointer); static void show_multigpu_visual_indicator_button_toggled (GtkWidget *, gpointer); static void value_changed (GtkObject *, gpointer, gpointer); static const gchar *get_image_settings_string(gint val); static gchar *format_image_settings_value(GtkScale *scale, gdouble arg1, gpointer user_data); static void post_slider_value_changed(CtkOpenGL *ctk_opengl, gint val); static void aa_line_gamma_update_received(GtkObject *object, gpointer arg1, gpointer user_data); static void post_image_settings_value_changed(CtkOpenGL *ctk_opengl, gint val); static void image_settings_value_changed(GtkRange *range, gpointer user_data); static void image_settings_update_received(GtkObject *object, gpointer arg1, gpointer user_data); static GtkWidget *create_slider(CtkOpenGL *ctk_opengl, GtkWidget *vbox, const gchar *name, const char *help, gint attribute, unsigned int bit); static void slider_changed(GtkAdjustment *adjustment, gpointer user_data); #define FRAME_PADDING 5 static const char *__sync_to_vblank_help = "When enabled, OpenGL applications will swap " "buffers during the vertical retrace; this option is " "applied to OpenGL applications that are started after " "this option is set."; static const char *__aa_line_gamma_checkbox_help = "Enable the antialiased lines gamma correction checkbox to make the " "gamma correction slider active."; static const char *__aa_line_gamma_slider_help = "This option allows Gamma-corrected " "antialiased lines to consider variances in the color " "display capabilities of output devices when rendering " "smooth lines. This option is applied to OpenGL applications " "that are started after this option is set."; static const char *__image_settings_slider_help = "The Image Settings slider controls the image quality setting."; static const char *__force_stereo_help = "Enabling this option causes OpenGL to force " "stereo flipping even if a stereo drawable is " "not visible. This option is applied " "immediately."; static const char *__xinerama_stereo_help = "Enabling this option causes OpenGL to allow " "stereo flipping on multiple X screens configured " "with Xinerama. This option is applied immediately."; static const char *__show_sli_visual_indicator_help = "Enabling this option causes OpenGL to draw " "information about the current SLI mode on the " "screen. This option is applied to OpenGL " "applications that are started after this option is " "set."; static const char *__show_multigpu_visual_indicator_help = "Enabling this option causes OpenGL to draw " "information about the current Multi-GPU mode on the " "screen. This option is applied to OpenGL " "applications that are started after this option is " "set."; static const char *__stereo_eyes_exchange_help = "Enabling this option causes OpenGL to draw the left " "eye image in the right eye and vice versa for stereo " "drawables. This option is applied immediately."; static const char *__use_conformant_clamping_help = "Disabling this option causes OpenGL to replace GL_CLAMP with " "GL_CLAMP_TO_EDGE for borderless 2D textures. This eliminates " "seams at the edges of textures in some older games such as " "Quake 3."; #define __SYNC_TO_VBLANK (1 << 1) #define __ALLOW_FLIPPING (1 << 2) #define __AA_LINE_GAMMA_VALUE (1 << 3) #define __AA_LINE_GAMMA (1 << 4) #define __FORCE_GENERIC_CPU (1 << 5) #define __FORCE_STEREO (1 << 6) #define __IMAGE_SETTINGS (1 << 7) #define __XINERAMA_STEREO (1 << 8) #define __SHOW_SLI_VISUAL_INDICATOR (1 << 9) #define __STEREO_EYES_EXCHANGE (1 << 10) #define __SHOW_MULTIGPU_VISUAL_INDICATOR (1 << 11) #define __CONFORMANT_CLAMPING (1 << 12) GType ctk_opengl_get_type( void ) { static GType ctk_opengl_type = 0; if (!ctk_opengl_type) { static const GTypeInfo ctk_opengl_info = { sizeof (CtkOpenGLClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init, */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkOpenGL), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_opengl_type = g_type_register_static (GTK_TYPE_VBOX, "CtkOpenGL", &ctk_opengl_info, 0); } return ctk_opengl_type; } GtkWidget* ctk_opengl_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event) { GObject *object; CtkOpenGL *ctk_opengl; GtkWidget *label; GtkWidget *banner; GtkWidget *frame; GtkWidget *hseparator; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *check_button; GtkWidget *scale; GtkObject *adjustment; gint sync_to_vblank; gint flipping_allowed; gint force_stereo; gint xinerama_stereo; gint stereo_eyes_exchange; NVCTRLAttributeValidValuesRec image_settings_valid; gint image_settings_value; gint aa_line_gamma; gint use_conformant_clamping; gint show_sli_visual_indicator; gint show_multigpu_visual_indicator; ReturnStatus ret_sync_to_vblank; ReturnStatus ret_flipping_allowed; ReturnStatus ret_force_stereo; ReturnStatus ret_xinerama_stereo; ReturnStatus ret_stereo_eyes_exchange; ReturnStatus ret_image_settings; ReturnStatus ret_aa_line_gamma; ReturnStatus ret_use_conformant_clamping; ReturnStatus ret_show_sli_visual_indicator; ReturnStatus ret_show_multigpu_visual_indicator; /* Query OpenGL settings */ ret_sync_to_vblank = NvCtrlGetAttribute(handle, NV_CTRL_SYNC_TO_VBLANK, &sync_to_vblank); ret_flipping_allowed = NvCtrlGetAttribute(handle, NV_CTRL_FLIPPING_ALLOWED, &flipping_allowed); ret_force_stereo = NvCtrlGetAttribute(handle, NV_CTRL_FORCE_STEREO, &force_stereo); ret_xinerama_stereo = NvCtrlGetAttribute(handle, NV_CTRL_XINERAMA_STEREO, &xinerama_stereo); ret_stereo_eyes_exchange = NvCtrlGetAttribute(handle, NV_CTRL_STEREO_EYES_EXCHANGE, &stereo_eyes_exchange); ret_image_settings = NvCtrlGetValidAttributeValues(handle, NV_CTRL_IMAGE_SETTINGS, &image_settings_valid); if ((ret_image_settings == NvCtrlSuccess) && (image_settings_valid.type == ATTRIBUTE_TYPE_RANGE)) { ret_image_settings = NvCtrlGetAttribute(handle, NV_CTRL_IMAGE_SETTINGS, &image_settings_value); } else { ret_image_settings = NvCtrlError; } ret_aa_line_gamma = NvCtrlGetAttribute(handle, NV_CTRL_OPENGL_AA_LINE_GAMMA, &aa_line_gamma); ret_use_conformant_clamping = NvCtrlGetAttribute(handle, NV_CTRL_TEXTURE_CLAMPING, &use_conformant_clamping); ret_show_sli_visual_indicator = NvCtrlGetAttribute(handle, NV_CTRL_SHOW_SLI_VISUAL_INDICATOR, &show_sli_visual_indicator); ret_show_multigpu_visual_indicator = NvCtrlGetAttribute(handle, NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR, &show_multigpu_visual_indicator); /* There are no OpenGL settings to change (OpenGL disabled?) */ if ((ret_sync_to_vblank != NvCtrlSuccess) && (ret_flipping_allowed != NvCtrlSuccess) && (ret_force_stereo != NvCtrlSuccess) && (ret_xinerama_stereo != NvCtrlSuccess) && (ret_stereo_eyes_exchange != NvCtrlSuccess) && (ret_image_settings != NvCtrlSuccess) && (ret_aa_line_gamma != NvCtrlSuccess) && (ret_use_conformant_clamping != NvCtrlSuccess) && (ret_show_sli_visual_indicator != NvCtrlSuccess) && (ret_show_multigpu_visual_indicator != NvCtrlSuccess)) { return NULL; } object = g_object_new(CTK_TYPE_OPENGL, NULL); ctk_opengl = CTK_OPENGL(object); ctk_opengl->handle = handle; ctk_opengl->ctk_config = ctk_config; ctk_opengl->active_attributes = 0; gtk_box_set_spacing(GTK_BOX(object), 10); banner = ctk_banner_image_new(BANNER_ARTWORK_OPENGL); gtk_box_pack_start(GTK_BOX(object), banner, FALSE, FALSE, 0); /* * Performance section: TOP->MIDDLE - LEFT->CENTER * * These settings directly influence OpenGLBox performance on the system *(related: multisample settings). */ hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, FALSE, 0); label = gtk_label_new("Performance"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 0); vbox = gtk_vbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(object), vbox, FALSE, FALSE, 0); /* * Sync to VBlank toggle: TOP->MIDDLE - LEFT->CENTER * * This toggle button specifies if OpenGLBox should sync to the vertical * retrace. */ if (ret_sync_to_vblank == NvCtrlSuccess) { label = gtk_label_new("Sync to VBlank"); check_button = gtk_check_button_new(); gtk_container_add(GTK_CONTAINER(check_button), label); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), sync_to_vblank); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(check_button), "toggled", G_CALLBACK(vblank_sync_button_toggled), (gpointer) ctk_opengl); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_SYNC_TO_VBLANK), G_CALLBACK(value_changed), (gpointer) ctk_opengl); ctk_config_set_tooltip(ctk_config, check_button, __sync_to_vblank_help); ctk_opengl->active_attributes |= __SYNC_TO_VBLANK; ctk_opengl->sync_to_vblank_button = check_button; } /* * allow flipping */ if (ret_flipping_allowed == NvCtrlSuccess) { label = gtk_label_new("Allow Flipping"); check_button = gtk_check_button_new(); gtk_container_add(GTK_CONTAINER(check_button), label); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), flipping_allowed); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(check_button), "toggled", G_CALLBACK(allow_flipping_button_toggled), (gpointer) ctk_opengl); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_FLIPPING_ALLOWED), G_CALLBACK(value_changed), (gpointer) ctk_opengl); ctk_config_set_tooltip(ctk_config, check_button, "Enabling this option allows OpenGL to swap " "by flipping when possible. This option is " "applied immediately."); ctk_opengl->active_attributes |= __ALLOW_FLIPPING; ctk_opengl->allow_flipping_button = check_button; } if (ret_force_stereo == NvCtrlSuccess) { label = gtk_label_new("Force Stereo Flipping"); check_button = gtk_check_button_new(); gtk_container_add(GTK_CONTAINER(check_button), label); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), force_stereo); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(check_button), "toggled", G_CALLBACK(force_stereo_button_toggled), (gpointer) ctk_opengl); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_FORCE_STEREO), G_CALLBACK(value_changed), (gpointer) ctk_opengl); ctk_config_set_tooltip(ctk_config, check_button, __force_stereo_help); ctk_opengl->active_attributes |= __FORCE_STEREO; ctk_opengl->force_stereo_button = check_button; } if (ret_xinerama_stereo == NvCtrlSuccess) { label = gtk_label_new("Allow Xinerama Stereo Flipping"); check_button = gtk_check_button_new(); gtk_container_add(GTK_CONTAINER(check_button), label); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), xinerama_stereo); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(check_button), "toggled", G_CALLBACK(xinerama_stereo_button_toggled), (gpointer) ctk_opengl); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_XINERAMA_STEREO), G_CALLBACK(value_changed), (gpointer) ctk_opengl); ctk_config_set_tooltip(ctk_config, check_button, __xinerama_stereo_help); ctk_opengl->active_attributes |= __XINERAMA_STEREO; ctk_opengl->xinerama_stereo_button = check_button; } if (ret_stereo_eyes_exchange == NvCtrlSuccess) { label = gtk_label_new("Exchange Stereo Eyes"); check_button = gtk_check_button_new(); gtk_container_add(GTK_CONTAINER(check_button), label); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), stereo_eyes_exchange); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(check_button), "toggled", G_CALLBACK(stereo_eyes_exchange_button_toggled), (gpointer) ctk_opengl); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_STEREO_EYES_EXCHANGE), G_CALLBACK(value_changed), (gpointer) ctk_opengl); ctk_config_set_tooltip(ctk_config, check_button, __stereo_eyes_exchange_help); ctk_opengl->active_attributes |= __STEREO_EYES_EXCHANGE; ctk_opengl->stereo_eyes_exchange_button = check_button; } /* * Image Quality settings. */ if (ret_image_settings == NvCtrlSuccess) { frame = gtk_frame_new("Image Settings"); gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 3); hbox = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox), FRAME_PADDING); gtk_container_add(GTK_CONTAINER(frame), hbox); /* create the slider */ adjustment = gtk_adjustment_new(image_settings_value, image_settings_valid.u.range.min, image_settings_valid.u.range.max, 1, 1, 0.0); scale = gtk_hscale_new(GTK_ADJUSTMENT(adjustment)); gtk_adjustment_set_value(GTK_ADJUSTMENT(adjustment), image_settings_value); gtk_scale_set_draw_value(GTK_SCALE(scale), TRUE); gtk_scale_set_value_pos(GTK_SCALE(scale), GTK_POS_TOP); gtk_container_add(GTK_CONTAINER(hbox), scale); g_signal_connect(G_OBJECT(scale), "format-value", G_CALLBACK(format_image_settings_value), (gpointer) ctk_opengl); g_signal_connect(G_OBJECT(scale), "value-changed", G_CALLBACK(image_settings_value_changed), (gpointer) ctk_opengl); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_IMAGE_SETTINGS), G_CALLBACK(image_settings_update_received), (gpointer) ctk_opengl); ctk_config_set_tooltip(ctk_config, scale, __image_settings_slider_help); ctk_opengl->active_attributes |= __IMAGE_SETTINGS; ctk_opengl->image_settings_scale = scale; } /* * Miscellaneous section: */ hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, FALSE, 0); label = gtk_label_new("Miscellaneous"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 0); vbox = gtk_vbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(object), vbox, FALSE, FALSE, 0); /* * NV_CTRL_OPENGL_AA_LINE_GAMMA */ if (ret_aa_line_gamma == NvCtrlSuccess) { label = gtk_label_new("Enable gamma correction for antialiased lines"); check_button = gtk_check_button_new(); gtk_container_add(GTK_CONTAINER(check_button), label); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), aa_line_gamma == NV_CTRL_OPENGL_AA_LINE_GAMMA_ENABLE); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(check_button), "toggled", G_CALLBACK(aa_line_gamma_toggled), (gpointer) ctk_opengl); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_OPENGL_AA_LINE_GAMMA), G_CALLBACK(value_changed), (gpointer) ctk_opengl); ctk_config_set_tooltip(ctk_opengl->ctk_config, check_button, __aa_line_gamma_checkbox_help); ctk_opengl->aa_line_gamma_button = check_button; ctk_opengl->active_attributes |= __AA_LINE_GAMMA; ctk_opengl->aa_line_gamma_scale = create_slider(ctk_opengl, vbox, "Gamma correction", __aa_line_gamma_slider_help, NV_CTRL_OPENGL_AA_LINE_GAMMA_VALUE, __AA_LINE_GAMMA_VALUE); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_OPENGL_AA_LINE_GAMMA_VALUE), G_CALLBACK(aa_line_gamma_update_received), (gpointer) ctk_opengl); if (ctk_opengl->aa_line_gamma_scale) gtk_widget_set_sensitive(ctk_opengl->aa_line_gamma_scale, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(check_button))); } /* * NV_CTRL_TEXTURE_CLAMPING */ if (ret_use_conformant_clamping == NvCtrlSuccess) { label = gtk_label_new("Use Conformant Texture Clamping"); check_button = gtk_check_button_new(); gtk_container_add(GTK_CONTAINER(check_button), label); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), use_conformant_clamping); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(check_button), "toggled", G_CALLBACK(use_conformant_clamping_button_toggled), (gpointer) ctk_opengl); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_TEXTURE_CLAMPING), G_CALLBACK(value_changed), (gpointer) ctk_opengl); ctk_config_set_tooltip(ctk_config, check_button, __use_conformant_clamping_help); ctk_opengl->active_attributes |= __CONFORMANT_CLAMPING; ctk_opengl->use_conformant_clamping_button = check_button; } if (ret_show_sli_visual_indicator == NvCtrlSuccess) { label = gtk_label_new("Enable SLI Visual Indicator"); check_button = gtk_check_button_new(); gtk_container_add(GTK_CONTAINER(check_button), label); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), show_sli_visual_indicator); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(check_button), "toggled", G_CALLBACK(show_sli_visual_indicator_button_toggled), (gpointer) ctk_opengl); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_SHOW_SLI_VISUAL_INDICATOR), G_CALLBACK(value_changed), (gpointer) ctk_opengl); ctk_config_set_tooltip(ctk_config, check_button, __show_sli_visual_indicator_help); ctk_opengl->active_attributes |= __SHOW_SLI_VISUAL_INDICATOR; ctk_opengl->show_sli_visual_indicator_button = check_button; } if (ret_show_multigpu_visual_indicator == NvCtrlSuccess) { label = gtk_label_new("Enable Multi-GPU Visual Indicator"); check_button = gtk_check_button_new(); gtk_container_add(GTK_CONTAINER(check_button), label); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), show_multigpu_visual_indicator); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(check_button), "toggled", G_CALLBACK(show_multigpu_visual_indicator_button_toggled), (gpointer) ctk_opengl); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR), G_CALLBACK(value_changed), (gpointer) ctk_opengl); ctk_config_set_tooltip(ctk_config, check_button, __show_multigpu_visual_indicator_help); ctk_opengl->active_attributes |= __SHOW_MULTIGPU_VISUAL_INDICATOR; ctk_opengl->show_multigpu_visual_indicator_button = check_button; } gtk_widget_show_all(GTK_WIDGET(object)); return GTK_WIDGET(object); } /* * Prints status bar message */ static void post_vblank_sync_button_toggled(CtkOpenGL *ctk_opengl, gboolean enabled) { ctk_config_statusbar_message(ctk_opengl->ctk_config, "OpenGL Sync to VBlank %s.", enabled ? "enabled" : "disabled"); } static void post_allow_flipping_button_toggled(CtkOpenGL *ctk_opengl, gboolean enabled) { ctk_config_statusbar_message(ctk_opengl->ctk_config, "OpenGL Flipping %s.", enabled ? "allowed" : "not allowed"); } static void post_force_stereo_button_toggled(CtkOpenGL *ctk_opengl, gboolean enabled) { ctk_config_statusbar_message(ctk_opengl->ctk_config, "OpenGL Stereo Flipping %s.", enabled ? "forced" : "not forced"); } static void post_show_sli_visual_indicator_button_toggled(CtkOpenGL *ctk_opengl, gboolean enabled) { ctk_config_statusbar_message(ctk_opengl->ctk_config, "OpenGL SLI Visual Indicator %s.", enabled ? "enabled" : "disabled"); } static void post_show_multigpu_visual_indicator_button_toggled(CtkOpenGL *ctk_opengl, gboolean enabled) { ctk_config_statusbar_message(ctk_opengl->ctk_config, "OpenGL Multi-GPU Visual Indicator %s.", enabled ? "enabled" : "disabled"); } static void post_xinerama_stereo_button_toggled(CtkOpenGL *ctk_opengl, gboolean enabled) { ctk_config_statusbar_message(ctk_opengl->ctk_config, "OpenGL Xinerama Stereo Flipping %s.", enabled ? "allowed" : "not allowed"); } static void post_stereo_eyes_exchange_button_toggled(CtkOpenGL *ctk_opengl, gboolean enabled) { ctk_config_statusbar_message(ctk_opengl->ctk_config, "OpenGL Stereo Eyes Exchanged %s.", enabled ? "enabled" : "disabled"); } static void post_aa_line_gamma_toggled(CtkOpenGL *ctk_opengl, gboolean enabled) { ctk_config_statusbar_message(ctk_opengl->ctk_config, "OpenGL gamma correction for antialiased " "lines %s.", enabled ? "enabled" : "disabled"); } static void post_use_conformant_clamping_button_toggled(CtkOpenGL *ctk_opengl, int clamping) { ctk_config_statusbar_message(ctk_opengl->ctk_config, "Use %sConformant OpenGL Texture Clamping", (clamping == NV_CTRL_TEXTURE_CLAMPING_SPEC) ? "" : "Non-"); } static void vblank_sync_button_toggled( GtkWidget *widget, gpointer user_data ) { CtkOpenGL *ctk_opengl; gboolean enabled; ctk_opengl = CTK_OPENGL(user_data); enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); NvCtrlSetAttribute(ctk_opengl->handle, NV_CTRL_SYNC_TO_VBLANK, enabled); post_vblank_sync_button_toggled(ctk_opengl, enabled); } static void allow_flipping_button_toggled(GtkWidget *widget, gpointer user_data) { CtkOpenGL *ctk_opengl; gboolean enabled; ctk_opengl = CTK_OPENGL(user_data); enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); NvCtrlSetAttribute(ctk_opengl->handle, NV_CTRL_FLIPPING_ALLOWED, enabled); post_allow_flipping_button_toggled(ctk_opengl, enabled); } static void force_stereo_button_toggled(GtkWidget *widget, gpointer user_data) { CtkOpenGL *ctk_opengl; gboolean enabled; ctk_opengl = CTK_OPENGL(user_data); enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); NvCtrlSetAttribute(ctk_opengl->handle, NV_CTRL_FORCE_STEREO, enabled); post_force_stereo_button_toggled(ctk_opengl, enabled); } static void show_sli_visual_indicator_button_toggled(GtkWidget *widget, gpointer user_data) { CtkOpenGL *ctk_opengl; gboolean enabled; ctk_opengl = CTK_OPENGL(user_data); enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); NvCtrlSetAttribute(ctk_opengl->handle, NV_CTRL_SHOW_SLI_VISUAL_INDICATOR, enabled); post_show_sli_visual_indicator_button_toggled(ctk_opengl, enabled); } static void show_multigpu_visual_indicator_button_toggled(GtkWidget *widget, gpointer user_data) { CtkOpenGL *ctk_opengl; gboolean enabled; ctk_opengl = CTK_OPENGL(user_data); enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); NvCtrlSetAttribute(ctk_opengl->handle, NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR, enabled); post_show_multigpu_visual_indicator_button_toggled(ctk_opengl, enabled); } static void xinerama_stereo_button_toggled(GtkWidget *widget, gpointer user_data) { CtkOpenGL *ctk_opengl; gboolean enabled; ctk_opengl = CTK_OPENGL(user_data); enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); NvCtrlSetAttribute(ctk_opengl->handle, NV_CTRL_XINERAMA_STEREO, enabled); post_xinerama_stereo_button_toggled(ctk_opengl, enabled); } static void stereo_eyes_exchange_button_toggled(GtkWidget *widget, gpointer user_data) { CtkOpenGL *ctk_opengl; gboolean enabled; ctk_opengl = CTK_OPENGL(user_data); enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); NvCtrlSetAttribute(ctk_opengl->handle, NV_CTRL_STEREO_EYES_EXCHANGE, enabled); post_stereo_eyes_exchange_button_toggled(ctk_opengl, enabled); } static void aa_line_gamma_toggled( GtkWidget *widget, gpointer user_data ) { CtkOpenGL *ctk_opengl; gboolean enabled; ReturnStatus ret; ctk_opengl = CTK_OPENGL(user_data); enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); ret = NvCtrlSetAttribute(ctk_opengl->handle, NV_CTRL_OPENGL_AA_LINE_GAMMA, enabled); if (ret != NvCtrlSuccess) return; if (ctk_opengl->aa_line_gamma_scale) gtk_widget_set_sensitive(ctk_opengl->aa_line_gamma_scale, enabled); post_aa_line_gamma_toggled(ctk_opengl, enabled); } static void use_conformant_clamping_button_toggled(GtkWidget *widget, gpointer user_data) { CtkOpenGL *ctk_opengl; int clamping; ctk_opengl = CTK_OPENGL(user_data); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { clamping = NV_CTRL_TEXTURE_CLAMPING_SPEC; } else { clamping = NV_CTRL_TEXTURE_CLAMPING_EDGE; } NvCtrlSetAttribute(ctk_opengl->handle, NV_CTRL_TEXTURE_CLAMPING, clamping); post_use_conformant_clamping_button_toggled(ctk_opengl, clamping); } /* * value_changed() - callback function for changed OpenGL settings. */ static void value_changed(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct; CtkOpenGL *ctk_opengl; gboolean enabled; GtkToggleButton *button; GCallback func; event_struct = (CtkEventStruct *) arg1; ctk_opengl = CTK_OPENGL(user_data); switch (event_struct->attribute) { case NV_CTRL_SYNC_TO_VBLANK: button = GTK_TOGGLE_BUTTON(ctk_opengl->sync_to_vblank_button); func = G_CALLBACK(vblank_sync_button_toggled); post_vblank_sync_button_toggled(ctk_opengl, event_struct->value); break; case NV_CTRL_FLIPPING_ALLOWED: button = GTK_TOGGLE_BUTTON(ctk_opengl->allow_flipping_button); func = G_CALLBACK(allow_flipping_button_toggled); post_allow_flipping_button_toggled(ctk_opengl, event_struct->value); break; case NV_CTRL_FORCE_STEREO: button = GTK_TOGGLE_BUTTON(ctk_opengl->force_stereo_button); func = G_CALLBACK(force_stereo_button_toggled); post_force_stereo_button_toggled(ctk_opengl, event_struct->value); break; case NV_CTRL_XINERAMA_STEREO: button = GTK_TOGGLE_BUTTON(ctk_opengl->xinerama_stereo_button); func = G_CALLBACK(xinerama_stereo_button_toggled); post_xinerama_stereo_button_toggled(ctk_opengl, event_struct->value); break; case NV_CTRL_STEREO_EYES_EXCHANGE: button = GTK_TOGGLE_BUTTON(ctk_opengl->stereo_eyes_exchange_button); func = G_CALLBACK(stereo_eyes_exchange_button_toggled); post_stereo_eyes_exchange_button_toggled(ctk_opengl, event_struct->value); break; case NV_CTRL_OPENGL_AA_LINE_GAMMA: button = GTK_TOGGLE_BUTTON(ctk_opengl->aa_line_gamma_button); func = G_CALLBACK(aa_line_gamma_toggled); post_aa_line_gamma_toggled(ctk_opengl, event_struct->value); gtk_widget_set_sensitive(ctk_opengl->aa_line_gamma_scale, event_struct->value); break; case NV_CTRL_TEXTURE_CLAMPING: button = GTK_TOGGLE_BUTTON(ctk_opengl->use_conformant_clamping_button); func = G_CALLBACK(use_conformant_clamping_button_toggled); post_use_conformant_clamping_button_toggled(ctk_opengl, event_struct->value); break; case NV_CTRL_SHOW_SLI_VISUAL_INDICATOR: button = GTK_TOGGLE_BUTTON(ctk_opengl->show_sli_visual_indicator_button); func = G_CALLBACK(show_sli_visual_indicator_button_toggled); post_show_sli_visual_indicator_button_toggled(ctk_opengl, event_struct->value); break; case NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR: button = GTK_TOGGLE_BUTTON(ctk_opengl->show_multigpu_visual_indicator_button); func = G_CALLBACK(show_multigpu_visual_indicator_button_toggled); post_show_multigpu_visual_indicator_button_toggled(ctk_opengl, event_struct->value); break; default: return; } enabled = gtk_toggle_button_get_active(button); if (enabled != event_struct->value) { g_signal_handlers_block_by_func(button, func, ctk_opengl); gtk_toggle_button_set_active(button, event_struct->value); g_signal_handlers_unblock_by_func(button, func, ctk_opengl); } } /* value_changed() */ /* * get_image_settings_string() - translate the NV-CONTROL image settings value * to a more comprehensible string. */ static const gchar *get_image_settings_string(gint val) { static const gchar *image_settings_strings[] = { "High Quality", "Quality", "Performance", "High Performance" }; if ((val < NV_CTRL_IMAGE_SETTINGS_HIGH_QUALITY) || (val > NV_CTRL_IMAGE_SETTINGS_HIGH_PERFORMANCE)) return "Unknown"; return image_settings_strings[val]; } /* get_image_settings_string() */ /* * format_image_settings_value() - callback for the "format-value" signal * from the image settings scale. */ static gchar *format_image_settings_value(GtkScale *scale, gdouble arg1, gpointer user_data) { return g_strdup(get_image_settings_string(arg1)); } /* format_image_settings_value() */ /* * post_image_settings_value_changed() - helper function for * image_settings_value_changed(); this does whatever work is necessary * after the image settings value has changed. */ static void post_image_settings_value_changed(CtkOpenGL *ctk_opengl, gint val) { ctk_config_statusbar_message(ctk_opengl->ctk_config, "Image Settings set to %s.", get_image_settings_string(val)); } /* post_image_settings_value_changed() */ /* * image_settings_value_changed() - callback for the "value-changed" signal * from the image settings scale. */ static void image_settings_value_changed(GtkRange *range, gpointer user_data) { CtkOpenGL *ctk_opengl = CTK_OPENGL(user_data); gint val = gtk_range_get_value(range); NvCtrlSetAttribute(ctk_opengl->handle, NV_CTRL_IMAGE_SETTINGS, val); post_image_settings_value_changed(ctk_opengl, val); } /* image_settings_value_changed() */ /* * image_settings_update_received() - this function is called when the * NV_CTRL_IMAGE_SETTINGS atribute is changed by another NV-CONTROL client. */ static void image_settings_update_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct = (CtkEventStruct *) arg1; CtkOpenGL *ctk_opengl = CTK_OPENGL(user_data); GtkRange *range = GTK_RANGE(ctk_opengl->image_settings_scale); g_signal_handlers_block_by_func(G_OBJECT(range), G_CALLBACK(image_settings_value_changed), (gpointer) ctk_opengl); gtk_range_set_value(range, event_struct->value); post_image_settings_value_changed(ctk_opengl, event_struct->value); g_signal_handlers_unblock_by_func(G_OBJECT(range), G_CALLBACK(image_settings_value_changed), (gpointer) ctk_opengl); } /* image_settings_update_received() */ /* * post_slider_value_changed() - helper function for * aa_line_gamma_value_changed(); this does whatever work is necessary * after the aa line gamma value has changed. */ static void post_slider_value_changed(CtkOpenGL *ctk_opengl, gint val) { ctk_config_statusbar_message(ctk_opengl->ctk_config, "OpenGL anti-aliased lines edge smoothness " "changed to %d%%.", val); } /* post_slider_value_changed() */ /* * slider_changed() - */ static void slider_changed(GtkAdjustment *adjustment, gpointer user_data) { CtkOpenGL *ctk_opengl = CTK_OPENGL(user_data); gint attribute, value; user_data = g_object_get_data(G_OBJECT(adjustment), "opengl_attribute"); attribute = GPOINTER_TO_INT(user_data); value = (gint) adjustment->value; NvCtrlSetAttribute(ctk_opengl->handle, attribute, value); post_slider_value_changed(ctk_opengl, value); } /* slider_changed() */ /* * aa_line_gamma_update_received() - this function is called when the * NV_CTRL_OPENGL_AA_LINE_GAMMA_VALUE attribute is changed by another NV-CONTROL * client. */ static void aa_line_gamma_update_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct = (CtkEventStruct *) arg1; CtkOpenGL *ctk_opengl = CTK_OPENGL(user_data); CtkScale *scale = CTK_SCALE(ctk_opengl->aa_line_gamma_scale); GtkAdjustment *adjustment; adjustment = GTK_ADJUSTMENT(scale->gtk_adjustment); g_signal_handlers_block_by_func(G_OBJECT(adjustment), G_CALLBACK(slider_changed), (gpointer) ctk_opengl); gtk_adjustment_set_value(GTK_ADJUSTMENT(adjustment), (gint)event_struct->value); post_slider_value_changed(ctk_opengl, event_struct->value); g_signal_handlers_unblock_by_func(G_OBJECT(adjustment), G_CALLBACK(slider_changed), (gpointer) ctk_opengl); } /* aa_line_gamma_update_received() */ static GtkWidget *create_slider(CtkOpenGL *ctk_opengl, GtkWidget *vbox, const gchar *name, const char *help, gint attribute, unsigned int bit) { GtkObject *adjustment; GtkWidget *scale, *widget; gint min, max, val, step_incr, page_incr; NVCTRLAttributeValidValuesRec range; ReturnStatus ret; /* get the attribute value */ ret = NvCtrlGetAttribute(ctk_opengl->handle, attribute, &val); if (ret != NvCtrlSuccess) return NULL; /* get the range for the attribute */ NvCtrlGetValidAttributeValues(ctk_opengl->handle, attribute, &range); if (range.type != ATTRIBUTE_TYPE_RANGE) return NULL; min = range.u.range.min; max = range.u.range.max; step_incr = ((max) - (min))/10; if (step_incr <= 0) step_incr = 1; page_incr = ((max) - (min))/25; if (page_incr <= 0) page_incr = 1; /* create the slider */ adjustment = gtk_adjustment_new(val, min, max, step_incr, page_incr, 0.0); g_object_set_data(G_OBJECT(adjustment), "opengl_attribute", GINT_TO_POINTER(attribute)); g_signal_connect(G_OBJECT(adjustment), "value_changed", G_CALLBACK(slider_changed), (gpointer) ctk_opengl); scale = ctk_scale_new(GTK_ADJUSTMENT(adjustment), name, ctk_opengl->ctk_config, G_TYPE_INT); gtk_box_pack_start(GTK_BOX(vbox), scale, TRUE, TRUE, 0); ctk_opengl->active_attributes |= bit; widget = CTK_SCALE(scale)->gtk_scale; ctk_config_set_tooltip(ctk_opengl->ctk_config, widget, help); return scale; } /* create_slider() */ GtkTextBuffer *ctk_opengl_create_help(GtkTextTagTable *table, CtkOpenGL *ctk_opengl) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "OpenGL Help"); if (ctk_opengl->active_attributes & __SYNC_TO_VBLANK) { ctk_help_heading(b, &i, "Sync to VBlank"); ctk_help_para(b, &i, "%s", __sync_to_vblank_help); } if (ctk_opengl->active_attributes & __ALLOW_FLIPPING) { ctk_help_heading(b, &i, "Allow Flipping"); ctk_help_para(b, &i, "Enabling this option allows OpenGL to swap " "by flipping when possible. Flipping is a mechanism " "of performing swaps where the OpenGL driver changes " "which buffer is scanned out by the DAC. The " "alternative swapping mechanism is blitting, where " "buffer contents are copied from the back buffer to " "the front buffer. It is usually faster to flip than " "it is to blit."); ctk_help_para(b, &i, "Note that this option is applied immediately, " "unlike most other OpenGL options which are only " "applied to OpenGL applications that are started " "after the option is set."); } if (ctk_opengl->active_attributes & __FORCE_STEREO) { ctk_help_heading(b, &i, "Force Stereo Flipping"); ctk_help_para(b, &i, "%s", __force_stereo_help); } if (ctk_opengl->active_attributes & __XINERAMA_STEREO) { ctk_help_heading(b, &i, "Allow Xinerama Stereo Flipping"); ctk_help_para(b, &i, "%s", __xinerama_stereo_help); } if (ctk_opengl->active_attributes & __STEREO_EYES_EXCHANGE) { ctk_help_heading(b, &i, "Exchange Stereo Eyes"); ctk_help_para(b, &i, "%s", __stereo_eyes_exchange_help); } if (ctk_opengl->active_attributes & __IMAGE_SETTINGS) { ctk_help_heading(b, &i, "Image Settings"); ctk_help_para(b, &i, "This setting gives you full control over the " "image quality in your applications."); ctk_help_para(b, &i, "Several quality settings are available for " "you to choose from with the Image Settings slider. " "Note that choosing higher image quality settings may " "result in decreased performance."); ctk_help_term(b, &i, "High Quality"); ctk_help_para(b, &i, "This setting results in the best image quality " "for your applications. It is not necessary for " "average users who run game applications, and designed " "for more advanced users to generate images that do not " "take advantage of the programming capability of the " "texture filtering hardware."); ctk_help_term(b, &i, "Quality"); ctk_help_para(b, &i, "This is the default setting that results in " "optimal image quality for your applications."); ctk_help_term(b, &i, "Performance"); ctk_help_para(b, &i, "This setting offers an optimal blend of image " "quality and performance. The result is optimal " "performance and good image quality for your " "applications."); ctk_help_term(b, &i, "High Performance"); ctk_help_para(b, &i, "This setting offers the highest frame rate " "possible, resulting in the best performance for your " "applications."); } if (ctk_opengl->active_attributes & __AA_LINE_GAMMA) { ctk_help_heading(b, &i, "Enable gamma correction for " "antialiased lines"); ctk_help_para(b, &i, "%s", __aa_line_gamma_checkbox_help ); } if (ctk_opengl->active_attributes & __AA_LINE_GAMMA_VALUE) { ctk_help_heading(b, &i, "Set gamma correction for " "antialiased lines"); ctk_help_para(b, &i, "%s", __aa_line_gamma_slider_help); } if (ctk_opengl->active_attributes & __CONFORMANT_CLAMPING) { ctk_help_heading(b, &i, "Use Conformant Texture Clamping"); ctk_help_para(b, &i, "%s", __use_conformant_clamping_help); } if (ctk_opengl->active_attributes & __SHOW_SLI_VISUAL_INDICATOR) { ctk_help_heading(b, &i, "SLI Visual Indicator"); ctk_help_para(b, &i, "This option draws information about the current " "SLI mode on top of OpenGL windows. Its behavior " "depends on which SLI mode is in use:"); ctk_help_term(b, &i, "Alternate Frame Rendering"); ctk_help_para(b, &i, "In AFR mode, a vertical green bar displays the " "amount of scaling currently being achieved. A longer " "bar indicates more scaling."); ctk_help_term(b, &i, "Split-Frame Rendering"); ctk_help_para(b, &i, "In this mode, OpenGL draws a horizontal green " "line showing where the screen is split. Everything " "above the line is drawn on one GPU and everything " "below is drawn on the other."); ctk_help_term(b, &i, "SLI Antialiasing"); ctk_help_para(b, &i, "In this mode, OpenGL draws a horizontal green " "line one third of the way across the screen. Above " "this line, the images from both GPUs are blended to " "produce the currently selected SLIAA mode. Below the " "line, the image from just one GPU is displayed without " "blending. This allows easy comparison between the " "SLIAA and single-GPU AA modes."); } if (ctk_opengl->active_attributes & __SHOW_MULTIGPU_VISUAL_INDICATOR) { ctk_help_heading(b, &i, "Multi-GPU Visual Indicator"); ctk_help_para(b, &i, "This option draws information about the current " "Multi-GPU mode on top of OpenGL windows. Its behavior " "depends on which Multi-GPU mode is in use:"); ctk_help_term(b, &i, "Alternate Frame Rendering"); ctk_help_para(b, &i, "In AFR mode, a vertical green bar displays the " "amount of scaling currently being achieved. A longer " "bar indicates more scaling."); ctk_help_term(b, &i, "Split-Frame Rendering"); ctk_help_para(b, &i, "In this mode, OpenGL draws a horizontal green " "line showing where the screen is split. Everything " "above the line is drawn on one GPU and everything " "below is drawn on the other."); ctk_help_term(b, &i, "Multi-GPU Antialiasing"); ctk_help_para(b, &i, "In this mode, OpenGL draws a horizontal green " "line one third of the way across the screen. Above " "this line, the images from both GPUs are blended to " "produce the currently selected multi-GPU AA mode. Below the " "line, the image from just one GPU is displayed without " "blending. This allows easy comparison between the " "multi-GPU AA and single-GPU AA modes."); } ctk_help_finish(b); return b; } nvidia-settings/src/gtk+-2.x/ctkwindow.c0000664000175000017500000015076412236467170020270 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * ctkwindow.c - implementation of the CtkWindow widget; this widget * displays a treeview on the left side, and one of several children * widgets on the right side, depending on which item in the treeview * is selected. */ #include #include #include #include #include #include "ctkwindow.h" #include "ctkframelock.h" #include "ctkgvi.h" #include "ctkgvo.h" #include "ctkgvo-sync.h" #include "ctkgvo-csc.h" #include "ctkconfig.h" #include "ctkutils.h" #include "ctkscreen.h" #include "ctkslimm.h" #include "ctkgpu.h" #include "ctkcolorcorrection.h" #include "ctkcolorcorrectionpage.h" #include "ctkxvideo.h" #include "ctkopengl.h" #include "ctkglx.h" #include "ctkmultisample.h" #include "ctkthermal.h" #include "ctkpowermizer.h" #include "ctkclocks.h" #include "ctkvcs.h" #include "ctkpowersavings.h" #include "ctk3dvisionpro.h" #include "ctkdisplaydevice.h" #include "ctkdisplayconfig.h" #include "ctkserver.h" #include "ctkecc.h" #include "ctkvdpau.h" #include "ctkappprofile.h" #include "ctkhelp.h" #include "ctkevent.h" #include "ctkconstants.h" #include "msg.h" #include "common-utils.h" #include "query-assign.h" /* column enumeration */ enum { CTK_WINDOW_LABEL_COLUMN = 0, CTK_WINDOW_WIDGET_COLUMN, CTK_WINDOW_HELP_COLUMN, CTK_WINDOW_CONFIG_FILE_ATTRIBUTES_FUNC_COLUMN, CTK_WINDOW_SELECT_WIDGET_FUNC_COLUMN, CTK_WINDOW_UNSELECT_WIDGET_FUNC_COLUMN, CTK_WINDOW_NUM_COLUMNS }; typedef struct { CtkWindow *window; CtkEvent *event; NvCtrlAttributeHandle *gpu_handle; GtkTextTagTable *tag_table; GtkTreeIter parent_iter; GtkTreeIter *display_iters; int num_displays; } UpdateDisplaysData; typedef void (*config_file_attributes_func_t)(GtkWidget *, ParsedAttribute *); typedef void (*select_widget_func_t)(GtkWidget *); typedef void (*unselect_widget_func_t)(GtkWidget *); static void ctk_window_class_init(CtkWindowClass *); static void ctk_window_real_destroy(GtkObject *); static void add_page(GtkWidget *, GtkTextBuffer *, CtkWindow *, GtkTreeIter *, GtkTreeIter *, const gchar *, config_file_attributes_func_t func, select_widget_func_t load_func, unselect_widget_func_t unload_func); static GtkWidget *create_quit_dialog(CtkWindow *ctk_window); static void quit_response(GtkWidget *, gint, gpointer); static void save_settings_and_exit(CtkWindow *); static void add_display_devices(CtkWindow *ctk_window, GtkTreeIter *iter, NvCtrlAttributeHandle *handle, CtkEvent *ctk_event, GtkTextTagTable *tag_table, UpdateDisplaysData *data, ParsedAttribute *p); static void update_display_devices(GtkObject *object, gpointer arg1, gpointer user_data); static void ctk_window_destroyed(GtkObject *object, gpointer arg1, gpointer user_data); static GObjectClass *parent_class; /* * ctk_window_get_type() - when first called, tells GTK about the * CtkWindow widget class, and gets an ID that uniquely identifies the * widget class. Upon subsequent calls, it just returns the ID. */ GType ctk_window_get_type(void) { static GType ctk_window_type = 0; if (!ctk_window_type) { static const GTypeInfo ctk_window_info = { sizeof(CtkWindowClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ctk_window_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(CtkWindow), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_window_type = g_type_register_static (GTK_TYPE_WINDOW, "CtkWindow", &ctk_window_info, 0); } return ctk_window_type; } /* ctk_window_get_type() */ /* * ctk_window_class_init() - initializes the fields of the widget's * class structure */ static void ctk_window_class_init(CtkWindowClass *ctk_window_class) { GtkObjectClass *object_class; object_class = (GtkObjectClass *) ctk_window_class; parent_class = g_type_class_peek_parent(ctk_window_class); object_class->destroy = ctk_window_real_destroy; } /* ctk_window_class_init() */ /* * ctk_window_real_destroy() - quit gtk. XXX Maybe we should write * the configuration file here? */ static void ctk_window_real_destroy(GtkObject *object) { GTK_OBJECT_CLASS(parent_class)->destroy(object); gtk_main_quit(); } /* ctk_window_real_destroy() */ /* * ctk_window_destroyed() - called when ctk_window destroyed. */ static void ctk_window_destroyed(GtkObject *object, gpointer arg1, gpointer user_data) { CtkWindow *ctk_window = CTK_WINDOW(object); save_settings_and_exit(ctk_window); } /* ctk_window_destroyed() */ /* * close_button_clicked() - called when the "Quit" button is clicked. */ static void close_button_clicked(GtkButton *button, gpointer user_data) { CtkWindow *ctk_window = CTK_WINDOW(user_data); CtkConfig *ctk_config = ctk_window->ctk_config; if (ctk_config->conf->booleans & CONFIG_PROPERTIES_SHOW_QUIT_DIALOG) { /* ask for confirmation */ gtk_widget_show_all(ctk_window->quit_dialog); } else { /* doesn't return */ save_settings_and_exit(ctk_window); } } /* close_button_clicked() */ /* * help_button_toggled() - callback when the help button is toggled; * hides or shows the help window. */ static void help_button_toggled(GtkToggleButton *button, gpointer user_data) { CtkWindow *ctk_window; gboolean enabled; ctk_window = CTK_WINDOW(user_data); enabled = gtk_toggle_button_get_active(button); if (enabled) { if (ctk_window->ctk_help == NULL) { ctk_window->ctk_help = ctk_help_new(GTK_WIDGET(button), ctk_window->help_tag_table); ctk_help_set_page(CTK_HELP(ctk_window->ctk_help), ctk_window->help_text_buffer); } gtk_widget_show_all(ctk_window->ctk_help); } else { gtk_widget_hide_all(ctk_window->ctk_help); } } /* help_button_toggled() */ /* * tree_selection_changed() - the selection in the tree changed; * change which page is viewed accordingly. */ static void tree_selection_changed(GtkTreeSelection *selection, gpointer user_data) { GtkTreeIter iter; CtkWindow *ctk_window = CTK_WINDOW(user_data); GtkTreeModel *model = GTK_TREE_MODEL(ctk_window->tree_store); GtkWidget *widget; GtkTextBuffer *help; select_widget_func_t select_func; unselect_widget_func_t unselect_func; if (!gtk_tree_selection_get_selected(selection, &model, &iter)) return; gtk_tree_model_get(model, &iter, CTK_WINDOW_WIDGET_COLUMN, &widget, -1); gtk_tree_model_get(model, &iter, CTK_WINDOW_HELP_COLUMN, &help, -1); gtk_tree_model_get(model, &iter, CTK_WINDOW_SELECT_WIDGET_FUNC_COLUMN, &select_func, -1); /* * remove the existing widget from the page viewer, if anything is * presently there */ if (ctk_window->page) { gtk_container_remove(GTK_CONTAINER(ctk_window->page_viewer), ctk_window->page); ctk_window->page = NULL; } /* Call the unselect func for the existing widget, if any */ if (ctk_window->widget) { gtk_tree_model_get(model, &(ctk_window->iter), CTK_WINDOW_UNSELECT_WIDGET_FUNC_COLUMN, &unselect_func, -1); if (unselect_func) { (*unselect_func)(ctk_window->widget); } } /* Pack the new widget */ if (widget) { ctk_window->page = widget; gtk_box_pack_start(GTK_BOX(ctk_window->page_viewer), widget, TRUE, TRUE, 2); } /* Call the select func for the new widget */ if (select_func) (*select_func)(widget); /* update the help page */ if (ctk_window->ctk_help != NULL) ctk_help_set_page(CTK_HELP(ctk_window->ctk_help), help); ctk_window->help_text_buffer = help; /* Keep track of the selected widget */ ctk_window->iter = iter; ctk_window->widget = widget; } /* tree_selection_changed() */ /* * row_activated_event() - callback for row-activated event * - handles key presses automatically * - allows the mouse to collapse/expand the menu even when the * expand button/triangle is not working. */ static void row_activated_event(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer user_data) { CtkWindow *ctk_window = CTK_WINDOW(user_data); if (gtk_tree_view_row_expanded(ctk_window->treeview, path)) { gtk_tree_view_collapse_row(ctk_window->treeview, path); } else { gtk_tree_view_expand_row(ctk_window->treeview, path, FALSE); } } static gboolean has_randr_gamma(NvCtrlAttributeHandle *handle) { ReturnStatus ret; int val; ret = NvCtrlGetAttribute(handle, NV_CTRL_ATTR_RANDR_GAMMA_AVAILABLE, &val); return ((ret == NvCtrlSuccess) && (val == 1)); } /* * ctk_window_new() - create a new CtkWindow widget */ GtkWidget *ctk_window_new(ParsedAttribute *p, ConfigProperties *conf, CtrlHandles *h) { GObject *object; CtkWindow *ctk_window; GtkWidget *sw; GtkWidget *hpane; GtkWidget *frame; GtkWidget *vbox, *hbox; GtkWidget *widget; GtkWidget *button; GtkWidget *toggle_button; GtkWidget *statusbar; GtkWidget *eventbox; GtkWidget *label; GtkRequisition req; gint width; GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; GtkTextTagTable *tag_table; GtkTextBuffer *help; CtkEvent *ctk_event; CtkConfig *ctk_config; gint column_offset, i; gboolean slimm_page_added; /* XXX Kludge to only show one SLIMM page */ /* create the new object */ object = g_object_new(CTK_TYPE_WINDOW, NULL); ctk_window = CTK_WINDOW(object); gtk_container_set_border_width(GTK_CONTAINER(ctk_window), CTK_WINDOW_PAD); ctk_window->attribute_list = p; /* create the config object */ ctk_window->ctk_config = CTK_CONFIG(ctk_config_new(conf, h)); ctk_config = ctk_window->ctk_config; /* create the quit dialog */ ctk_window->quit_dialog = create_quit_dialog(ctk_window); /* pack the bottom row of the window */ hbox = gtk_hbox_new(FALSE, 5); vbox = gtk_vbox_new(FALSE, 5); gtk_container_add(GTK_CONTAINER(ctk_window), vbox); gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); /* place the status bar */ statusbar = ctk_config_get_statusbar(ctk_config); eventbox = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(eventbox), statusbar); gtk_box_pack_start(GTK_BOX(hbox), eventbox, TRUE, TRUE, 0); ctk_config_set_tooltip(ctk_config, eventbox, "The status bar displays " "the most recent change that has been sent to the " "X server."); /* create and place the help toggle button */ toggle_button = gtk_toggle_button_new(); g_object_set(G_OBJECT(toggle_button), "label", GTK_STOCK_HELP, "use_stock", GINT_TO_POINTER(TRUE), NULL); gtk_widget_set_size_request(toggle_button, 100, -1); gtk_box_pack_start(GTK_BOX(hbox), toggle_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(toggle_button), "toggled", G_CALLBACK(help_button_toggled), (gpointer) ctk_window); ctk_window->ctk_help = NULL; tag_table = ctk_help_create_tag_table(); ctk_window->help_tag_table = tag_table; ctk_config_set_tooltip(ctk_config, toggle_button, "The Help button " "toggles the display of a help window which " "provides a detailed explanation of the available " "options in the current page."); /* create and place the close button */ button = gtk_button_new_from_stock(GTK_STOCK_QUIT); gtk_widget_set_size_request(button, 100, -1); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(close_button_clicked), (gpointer) ctk_window); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); ctk_config_set_tooltip(ctk_config, button, "The Quit button causes the " "current settings to be saved to the configuration " "file (~/.nvidia-settings-rc), and nvidia-settings " "to exit."); /* create the horizontal pane */ hpane = gtk_hpaned_new(); gtk_box_pack_start(GTK_BOX(vbox), hpane, TRUE, TRUE, 0); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); gtk_paned_pack1(GTK_PANED(hpane), frame, FALSE, FALSE); /* scrollable window */ sw = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(frame), sw); /* create the tree model */ ctk_window->tree_store = gtk_tree_store_new(CTK_WINDOW_NUM_COLUMNS, G_TYPE_STRING, /* Label */ G_TYPE_POINTER, /* Main widget */ G_TYPE_POINTER, /* Help widget */ G_TYPE_POINTER, /* Config file attr func */ G_TYPE_POINTER, /* Load widget func */ G_TYPE_POINTER); /* Unload widget func */ model = GTK_TREE_MODEL(ctk_window->tree_store); /* create the tree view */ ctk_window->treeview = GTK_TREE_VIEW(gtk_tree_view_new_with_model(model)); g_object_unref(ctk_window->tree_store); /* Added row activated event to the tree view */ g_signal_connect(ctk_window->treeview, "row_activated", G_CALLBACK(row_activated_event), GTK_OBJECT(ctk_window)); selection = gtk_tree_view_get_selection(ctk_window->treeview); gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); g_object_set(G_OBJECT(ctk_window->treeview), "headers-visible", FALSE, NULL); /* create the one visible column in the tree view */ renderer = gtk_cell_renderer_text_new(); column_offset = gtk_tree_view_insert_column_with_attributes (ctk_window->treeview, -1, NULL, renderer, "text", CTK_WINDOW_LABEL_COLUMN, NULL); column = gtk_tree_view_get_column(ctk_window->treeview, column_offset - 1); gtk_tree_view_column_set_clickable(GTK_TREE_VIEW_COLUMN(column), TRUE); /* pack the treeview in the scrollable window */ gtk_container_add(GTK_CONTAINER(sw), GTK_WIDGET(ctk_window->treeview)); /* create the container widget for the "pages" */ hbox = gtk_hbox_new(FALSE, 0); gtk_paned_pack2(GTK_PANED(hpane), hbox, TRUE, FALSE); ctk_window->page_viewer = hbox; ctk_window->page = NULL; /* X Server info & configuration */ if (h->targets[X_SCREEN_TARGET].n) { NvCtrlAttributeHandle *screen_handle = NULL; GtkWidget *child; int i; /* * XXX For now, just use the first handle in the list * to communicate with the X server for these two * pages. */ for (i = 0 ; i < h->targets[X_SCREEN_TARGET].n; i++) { if (h->targets[X_SCREEN_TARGET].t[i].h) { screen_handle = h->targets[X_SCREEN_TARGET].t[i].h; break; } } if (screen_handle) { /* X Server information */ child = ctk_server_new(screen_handle, ctk_config); add_page(child, ctk_server_create_help(tag_table, CTK_SERVER(child)), ctk_window, NULL, NULL, "X Server Information", NULL, NULL, NULL); /* X Server Display Configuration */ child = ctk_display_config_new(screen_handle, ctk_config); if (child) { add_page(child, ctk_display_config_create_help(tag_table, CTK_DISPLAY_CONFIG(child)), ctk_window, NULL, NULL, "X Server Display Configuration", NULL, ctk_display_config_selected, ctk_display_config_unselected); } } } /* add the per-screen entries into the tree model */ slimm_page_added = FALSE; for (i = 0; i < h->targets[X_SCREEN_TARGET].n; i++) { gchar *screen_name; GtkWidget *child; NvCtrlAttributeHandle *screen_handle = h->targets[X_SCREEN_TARGET].t[i].h; if (!screen_handle) continue; /* create the object for receiving NV-CONTROL events */ ctk_event = CTK_EVENT(ctk_event_new(screen_handle)); screen_name = g_strdup_printf("X Screen %d", NvCtrlGetTargetId(screen_handle)); /* create the screen entry */ gtk_tree_store_append(ctk_window->tree_store, &iter, NULL); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_LABEL_COLUMN, screen_name, -1); /* Screen information */ screen_name = NvCtrlGetDisplayName(screen_handle); child = ctk_screen_new(screen_handle, ctk_event); gtk_object_ref(GTK_OBJECT(child)); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_WIDGET_COLUMN, child, -1); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_HELP_COLUMN, ctk_screen_create_help(tag_table, CTK_SCREEN(child), screen_name), -1); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_CONFIG_FILE_ATTRIBUTES_FUNC_COLUMN, NULL, -1); if (!slimm_page_added) { /* SLI Mosaic Mode information */ child = ctk_slimm_new(screen_handle, ctk_event, ctk_config); if (child) { slimm_page_added = TRUE; help = ctk_slimm_create_help(tag_table, "SLI Mosaic Mode Settings"); add_page(child, help, ctk_window, &iter, NULL, "SLI Mosaic Mode Settings", NULL, NULL, NULL); } } /* * color correction, if RandR per-CRTC color correction is not * available */ if (!has_randr_gamma(screen_handle)) { child = ctk_color_correction_page_new(screen_handle, ctk_config, ctk_window->attribute_list, ctk_event); if (child) { help = ctk_color_correction_page_create_help(tag_table); add_page(child, help, ctk_window, &iter, NULL, "X Server Color Correction", NULL, NULL, NULL); } } /* xvideo settings */ child = ctk_xvideo_new(screen_handle, ctk_config, ctk_event); if (child) { help = ctk_xvideo_create_help(tag_table, CTK_XVIDEO(child)); add_page(child, help, ctk_window, &iter, NULL, "X Server XVideo Settings", NULL, NULL, NULL); } /* opengl settings */ child = ctk_opengl_new(screen_handle, ctk_config, ctk_event); if (child) { help = ctk_opengl_create_help(tag_table, CTK_OPENGL(child)); add_page(child, help, ctk_window, &iter, NULL, "OpenGL Settings", NULL, NULL, NULL); } /* GLX Information */ child = ctk_glx_new(screen_handle, ctk_config, ctk_event); if (child) { help = ctk_glx_create_help(tag_table, CTK_GLX(child)); add_page(child, help, ctk_window, &iter, NULL, "OpenGL/GLX Information", NULL, ctk_glx_probe_info, NULL); } /* multisample settings */ child = ctk_multisample_new(screen_handle, ctk_config, ctk_event); if (child) { help = ctk_multisample_create_help(tag_table, CTK_MULTISAMPLE(child)); add_page(child, help, ctk_window, &iter, NULL, "Antialiasing Settings", NULL, NULL, NULL); } /* VDPAU Information */ child = ctk_vdpau_new(screen_handle, ctk_config, ctk_event); if (child) { help = ctk_vdpau_create_help(tag_table, CTK_VDPAU(child)); add_page(child, help, ctk_window, &iter, NULL, "VDPAU Information", NULL, NULL, NULL); } /* gvo (Graphics To Video Out) */ child = ctk_gvo_new(screen_handle, ctk_config, ctk_event); if (child) { GtkWidget *gvo_parent = child; GtkTreeIter child_iter; help = ctk_gvo_create_help(tag_table); add_page(child, help, ctk_window, &iter, &child_iter, "Graphics to Video Out", NULL, ctk_gvo_select, ctk_gvo_unselect); /* GVO Sync options */ child = ctk_gvo_sync_new(screen_handle, GTK_WIDGET(ctk_window), ctk_config, ctk_event, CTK_GVO(gvo_parent)); if (child) { help = ctk_gvo_sync_create_help(tag_table, CTK_GVO_SYNC(child)); add_page(child, help, ctk_window, &child_iter, NULL, "Synchronization Options", NULL, ctk_gvo_sync_select, ctk_gvo_sync_unselect); } /* GVO color space conversion */ child = ctk_gvo_csc_new(screen_handle, ctk_config, ctk_event, CTK_GVO(gvo_parent)); if (child) { help = ctk_gvo_csc_create_help(tag_table, CTK_GVO_CSC(child)); add_page(child, help, ctk_window, &child_iter, NULL, "Color Space Conversion", NULL, ctk_gvo_csc_select, ctk_gvo_csc_unselect); } } } /* add the per-gpu entries into the tree model */ for (i = 0; i < h->targets[GPU_TARGET].n; i++) { gchar *gpu_name; GtkWidget *child; NvCtrlAttributeHandle *gpu_handle = h->targets[GPU_TARGET].t[i].h; UpdateDisplaysData *data; if (!gpu_handle) continue; /* create the gpu entry name */ gpu_name = create_gpu_name_string(gpu_handle); if (!gpu_name) continue; /* create the object for receiving NV-CONTROL events */ ctk_event = CTK_EVENT(ctk_event_new(gpu_handle)); /* create the gpu entry */ gtk_tree_store_append(ctk_window->tree_store, &iter, NULL); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_LABEL_COLUMN, gpu_name, -1); child = ctk_gpu_new(gpu_handle, h->targets[X_SCREEN_TARGET].t, ctk_event, ctk_config); gtk_object_ref(GTK_OBJECT(child)); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_WIDGET_COLUMN, child, -1); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_HELP_COLUMN, ctk_gpu_create_help(tag_table, CTK_GPU(child)), -1); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_CONFIG_FILE_ATTRIBUTES_FUNC_COLUMN, NULL, -1); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_SELECT_WIDGET_FUNC_COLUMN, ctk_gpu_page_select, -1); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_UNSELECT_WIDGET_FUNC_COLUMN, ctk_gpu_page_unselect, -1); /* power savings */ child = ctk_power_savings_new(gpu_handle, ctk_config, ctk_event); if (child) { help = ctk_power_savings_create_help(tag_table, CTK_POWER_SAVINGS(child)); add_page(child, help, ctk_window, &iter, NULL, "Power Savings Settings", NULL, NULL, NULL); } /* thermal information */ child = ctk_thermal_new(gpu_handle, ctk_config, ctk_event); if (child) { help = ctk_thermal_create_help(tag_table, CTK_THERMAL(child)); add_page(child, help, ctk_window, &iter, NULL, "Thermal Settings", NULL, ctk_thermal_start_timer, ctk_thermal_stop_timer); } /* Powermizer information */ child = ctk_powermizer_new(gpu_handle, ctk_config, ctk_event); if (child) { help = ctk_powermizer_create_help(tag_table, CTK_POWERMIZER(child)); add_page(child, help, ctk_window, &iter, NULL, "PowerMizer", NULL, ctk_powermizer_start_timer, ctk_powermizer_stop_timer); } /* clocks (GPU overclocking) */ child = ctk_clocks_new(gpu_handle, ctk_config, ctk_event); if (child) { help = ctk_clocks_create_help(tag_table, CTK_CLOCKS(child)); add_page(child, help, ctk_window, &iter, NULL, "Clock Frequencies", NULL, ctk_clocks_select, NULL); } /* ECC Information */ child = ctk_ecc_new(gpu_handle, ctk_config, ctk_event); if (child) { help = ctk_ecc_create_help(tag_table, CTK_ECC(child)); add_page(child, help, ctk_window, &iter, NULL, "ECC Settings", NULL, ctk_ecc_start_timer, ctk_ecc_stop_timer); } /* display devices */ data = calloc(1, sizeof(UpdateDisplaysData)); data->window = ctk_window; data->event = ctk_event; data->gpu_handle = gpu_handle; data->parent_iter = iter; data->tag_table = tag_table; g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_PROBE_DISPLAYS), G_CALLBACK(update_display_devices), (gpointer) data); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_MODE_SET_EVENT), G_CALLBACK(update_display_devices), (gpointer) data); add_display_devices(ctk_window, &iter, gpu_handle, ctk_event, tag_table, data, ctk_window->attribute_list); } /* add the per-vcs (e.g. Quadro Plex) entries into the tree model */ for (i = 0; i < h->targets[VCS_TARGET].n; i++) { gchar *vcs_product_name; gchar *vcs_name; GtkWidget *child; ReturnStatus ret; NvCtrlAttributeHandle *vcs_handle = h->targets[VCS_TARGET].t[i].h; if (!vcs_handle) continue; /* create the vcs entry name */ ret = NvCtrlGetStringAttribute(vcs_handle, NV_CTRL_STRING_VCSC_PRODUCT_NAME, &vcs_product_name); if (ret == NvCtrlSuccess && vcs_product_name) { vcs_name = g_strdup_printf("VCS %d - (%s)", NvCtrlGetTargetId(vcs_handle), vcs_product_name); XFree(vcs_product_name); } else { vcs_name = g_strdup_printf("VCS %d - (Unknown)", NvCtrlGetTargetId(vcs_handle)); } if (!vcs_name) continue; /* create the object for receiving NV-CONTROL events */ ctk_event = CTK_EVENT(ctk_event_new(vcs_handle)); /* create the vcs entry */ gtk_tree_store_append(ctk_window->tree_store, &iter, NULL); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_LABEL_COLUMN, vcs_name, -1); child = ctk_vcs_new(vcs_handle, ctk_config); gtk_object_ref(GTK_OBJECT(child)); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_WIDGET_COLUMN, child, -1); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_HELP_COLUMN, ctk_vcs_create_help(tag_table, CTK_VCS(child)), -1); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_CONFIG_FILE_ATTRIBUTES_FUNC_COLUMN, NULL, -1); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_SELECT_WIDGET_FUNC_COLUMN, ctk_vcs_start_timer, -1); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_UNSELECT_WIDGET_FUNC_COLUMN, ctk_vcs_stop_timer, -1); } /* add the per gvi entries into the tree model */ for (i = 0; i < h->targets[GVI_TARGET].n; i++) { gchar *gvi_name; GtkWidget *child; NvCtrlAttributeHandle *gvi_handle = h->targets[GVI_TARGET].t[i].h; if (!gvi_handle) continue; /* create the gvi entry name */ if (h->targets[GVI_TARGET].n > 1) { gvi_name = g_strdup_printf("Graphics to Video In %d", NvCtrlGetTargetId(gvi_handle)); } else { gvi_name = g_strdup_printf("Graphics to Video In"); } if (!gvi_name) continue; /* create the object for receiving NV-CONTROL events */ ctk_event = CTK_EVENT(ctk_event_new(gvi_handle)); /* create the gvi entry */ gtk_tree_store_append(ctk_window->tree_store, &iter, NULL); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_LABEL_COLUMN, gvi_name, -1); child = ctk_gvi_new(gvi_handle, ctk_config, ctk_event); gtk_object_ref(GTK_OBJECT(child)); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_WIDGET_COLUMN, child, -1); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_HELP_COLUMN, ctk_gvi_create_help(tag_table, CTK_GVI(child)), -1); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_CONFIG_FILE_ATTRIBUTES_FUNC_COLUMN, NULL, -1); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_SELECT_WIDGET_FUNC_COLUMN, ctk_gvi_start_timer, -1); gtk_tree_store_set(ctk_window->tree_store, &iter, CTK_WINDOW_UNSELECT_WIDGET_FUNC_COLUMN, ctk_gvi_stop_timer, -1); } /* * add the frame lock page, if any of the X screens support * frame lock */ for (i = 0; i < h->targets[X_SCREEN_TARGET].n; i++) { NvCtrlAttributeHandle *screen_handle = h->targets[X_SCREEN_TARGET].t[i].h; if (!screen_handle) continue; widget = ctk_framelock_new(screen_handle, GTK_WIDGET(ctk_window), ctk_config, ctk_window->attribute_list); if (!widget) continue; add_page(widget, ctk_framelock_create_help(tag_table), ctk_window, NULL, NULL, "Frame Lock", ctk_framelock_config_file_attributes, ctk_framelock_select, ctk_framelock_unselect); break; } /* add NVIDIA 3D VisionPro dongle configuration page */ for (i = 0; i < h->targets[NVIDIA_3D_VISION_PRO_TRANSCEIVER_TARGET].n; i++) { NvCtrlAttributeHandle *svp_handle = h->targets[NVIDIA_3D_VISION_PRO_TRANSCEIVER_TARGET].t[i].h; if (!svp_handle) continue; /* create the object for receiving NV-CONTROL events */ ctk_event = CTK_EVENT(ctk_event_new(svp_handle)); widget = ctk_3d_vision_pro_new(svp_handle, ctk_config, ctk_window->attribute_list, ctk_event); if (!widget) continue; help = ctk_3d_vision_pro_create_help(tag_table); add_page(widget, help, ctk_window, NULL, NULL, "NVIDIA 3D VisionPro", ctk_3d_vision_pro_config_file_attributes, ctk_3d_vision_pro_select, ctk_3d_vision_pro_unselect); } /* app profile configuration */ widget = ctk_app_profile_new(ctk_config); add_page(widget, ctk_app_profile_create_help(CTK_APP_PROFILE(widget), tag_table), ctk_window, NULL, NULL, "Application Profiles", NULL, NULL, NULL); /* nvidia-settings configuration */ add_page(GTK_WIDGET(ctk_window->ctk_config), ctk_config_create_help(ctk_config, tag_table), ctk_window, NULL, NULL, "nvidia-settings Configuration", NULL, NULL, NULL); /* * we're done with the current data in the parsed attribute list, * so clean it out */ nv_parsed_attribute_clean(ctk_window->attribute_list); /* * now that everything is packed in the treeview, connect the * signal handler, and autosize the columns in the treeview */ g_signal_connect(selection, "changed", G_CALLBACK(tree_selection_changed), GTK_OBJECT(ctk_window)); gtk_widget_show_all(GTK_WIDGET(ctk_window->treeview)); gtk_tree_view_expand_all(ctk_window->treeview); gtk_tree_view_columns_autosize(ctk_window->treeview); /* Make sure the first item is selected */ if ( gtk_tree_model_get_iter_first(model, &iter) ) { gtk_tree_selection_select_iter(selection, &iter); } /* set the window title */ gtk_window_set_title(GTK_WINDOW(object), "NVIDIA X Server Settings"); gtk_widget_show_all(GTK_WIDGET(object)); /* Set the minimum width of the tree view window to be something * reasonable. To do that, check the size of a label widget * with a reasonably long string and limit the tree view scroll * window's initial width to not extent past this. */ label = gtk_label_new("XXXXXX Server Display ConfigurationXXXX"); gtk_widget_size_request(label, &req); width = req.width; gtk_widget_destroy(label); /* Get the width of the tree view scroll window */ gtk_widget_size_request(sw, &req); /* If the scroll window is too wide, make it slimmer and * allow users to scroll horizontally (also allow resizing). */ if ( width < req.width ) { gtk_widget_set_size_request(sw, width, -1); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); } /* Add callback when window destroyed */ g_signal_connect(G_OBJECT(ctk_window), "destroy", G_CALLBACK(ctk_window_destroyed), (gpointer) ctk_window); return GTK_WIDGET(object); } /* ctk_window_new() */ /* * Set the currently active page to be the page that matches the * specified label. * * Note that child pages of X screens and GPUs cannot be uniquely * identified by their label alone (e.g., each GPU has a "PowerMizer" * page). To allow explicit control over which instance of a child * page is selected, the label can have the optional format * * "[PARENT LABEL], [CHILD LABEL]" * * E.g., * * "GPU 0 - (GeForce 7600 GT), PowerMizer" */ typedef struct { CtkWindow *ctk_window; const gchar *label; } ctk_window_set_active_page_args; static gboolean ctk_window_set_active_page_callback(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { GtkTreeIter parent; gboolean valid; gchar *iter_label; gchar *parent_label = "no parent"; gchar *qualified_label; ctk_window_set_active_page_args *args = data; /* get the parent's label, if there is a parent */ valid = gtk_tree_model_iter_parent(model, &parent, iter); if (valid) { gtk_tree_model_get(model, &parent, CTK_WINDOW_LABEL_COLUMN, &parent_label, -1); } gtk_tree_model_get(model, iter, CTK_WINDOW_LABEL_COLUMN, &iter_label, -1); qualified_label = nvstrcat(parent_label, ", ", iter_label, NULL); if ((strcmp(iter_label, args->label) == 0) || (strcmp(qualified_label, args->label) == 0)) { GtkTreeSelection* selection; selection = gtk_tree_view_get_selection(args->ctk_window->treeview); gtk_tree_selection_select_iter(selection, iter); free(qualified_label); return TRUE; /* stop walking the tree */ } free(qualified_label); return FALSE; /* keep walking the tree */ } void ctk_window_set_active_page(CtkWindow *ctk_window, const gchar *label) { GtkTreeModel *model = GTK_TREE_MODEL(ctk_window->tree_store); ctk_window_set_active_page_args args; if (!label) return; args.ctk_window = ctk_window; args.label = label; gtk_tree_model_foreach(model, ctk_window_set_active_page_callback, &args); } /* ctk_window_set_active_page() */ /* * add_page() - add a new page to ctk_window's tree_store, using iter * as a parent; the new child iter is written in pchild_iter, if * provided. */ static void add_page(GtkWidget *widget, GtkTextBuffer *help, CtkWindow *ctk_window, GtkTreeIter *iter, GtkTreeIter *child_iter, const gchar *label, config_file_attributes_func_t func, select_widget_func_t select_func, unselect_widget_func_t unselect_func) { GtkTreeIter tmp_child_iter; if (!widget) return; if (!child_iter) child_iter = &tmp_child_iter; /* * Add a reference to the object and sink (remove) the floating (gtk) * reference. This sink needs to happen before the page gets packed * to ensure that we become the propper owner of these widgets. This way, * page will not be destroyed when they are hidden (removed from the page * viewer), and we can properly destroy them when needed (for example, the * display device pages are destroyed/recreated on hotplug events.) */ g_object_ref(G_OBJECT(widget)); gtk_object_sink(GTK_OBJECT(widget)); gtk_tree_store_append(ctk_window->tree_store, child_iter, iter); gtk_tree_store_set(ctk_window->tree_store, child_iter, CTK_WINDOW_LABEL_COLUMN, label, -1); gtk_tree_store_set(ctk_window->tree_store, child_iter, CTK_WINDOW_WIDGET_COLUMN, widget, -1); gtk_tree_store_set(ctk_window->tree_store, child_iter, CTK_WINDOW_HELP_COLUMN, help, -1); gtk_tree_store_set(ctk_window->tree_store, child_iter, CTK_WINDOW_CONFIG_FILE_ATTRIBUTES_FUNC_COLUMN, func, -1); gtk_tree_store_set(ctk_window->tree_store, child_iter, CTK_WINDOW_SELECT_WIDGET_FUNC_COLUMN, select_func, -1); gtk_tree_store_set(ctk_window->tree_store, child_iter, CTK_WINDOW_UNSELECT_WIDGET_FUNC_COLUMN, unselect_func, -1); } /* add_page() */ /* * create_quit_dialog() - create a dialog box to prompt the user * whether they really want to quit. */ static GtkWidget *create_quit_dialog(CtkWindow *ctk_window) { GtkWidget *dialog; GtkWidget *hbox; GtkWidget *image; GdkPixbuf *pixbuf; GtkWidget *alignment; GtkWidget *label; dialog = gtk_dialog_new_with_buttons("Really quit?", GTK_WINDOW(ctk_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_QUIT, GTK_RESPONSE_OK, NULL); g_signal_connect(GTK_OBJECT(dialog), "response", G_CALLBACK(quit_response), GTK_OBJECT(ctk_window)); gtk_container_set_border_width(GTK_CONTAINER(dialog), 6); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); hbox = gtk_hbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(hbox), 6); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), hbox); pixbuf = gtk_widget_render_icon(dialog, GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG, NULL); image = gtk_image_new_from_pixbuf(pixbuf); g_object_unref(pixbuf); alignment = gtk_alignment_new(0.0, 0.0, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), image); gtk_box_pack_start(GTK_BOX(hbox), alignment, FALSE, FALSE, 2); label = gtk_label_new("Do you really want to quit?"); alignment = gtk_alignment_new(0.0, 0.0, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), label); gtk_box_pack_start(GTK_BOX(hbox), alignment, FALSE, FALSE, 0); /* Prevent the dialog from being deleted when closed */ g_signal_connect(G_OBJECT(dialog), "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), (gpointer) dialog); return dialog; } /* create_quit_dialog() */ /* * save_settings_and_exit() - save settings, perform cleanups, if * necessary, and terminate nvidia-settings. */ static void save_settings_and_exit(CtkWindow *ctk_window) { add_special_config_file_attributes(ctk_window); gtk_main_quit(); } /* * quit_response() - handle the response from the "really quit?" * dialog. */ static void quit_response(GtkWidget *button, gint response, gpointer user_data) { CtkWindow *ctk_window = CTK_WINDOW(user_data); if (response == GTK_RESPONSE_OK) { /* doesn't return */ save_settings_and_exit(ctk_window); } gtk_widget_hide_all(ctk_window->quit_dialog); } /* quit_response() */ /* * Ask all child widgets for any special attributes that should be * saved to the config file. */ static gboolean add_special_config_file_attributes_callback(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { GtkWidget *widget; config_file_attributes_func_t func; CtkWindow *ctk_window = data; gtk_tree_model_get(model, iter, CTK_WINDOW_WIDGET_COLUMN, &widget, CTK_WINDOW_CONFIG_FILE_ATTRIBUTES_FUNC_COLUMN, &func, -1); if (func) (*func)(widget, ctk_window->attribute_list); return FALSE; /* keep iterating over nodes in the tree */ } void add_special_config_file_attributes(CtkWindow *ctk_window) { GtkTreeModel *model = GTK_TREE_MODEL(ctk_window->tree_store); gtk_tree_model_foreach(model, add_special_config_file_attributes_callback, ctk_window); } /* add_special_config_file_attributes() */ /* * add_display_devices() - add the display device pages */ static void add_display_devices(CtkWindow *ctk_window, GtkTreeIter *iter, NvCtrlAttributeHandle *gpu_handle, CtkEvent *ctk_event_gpu, GtkTextTagTable *tag_table, UpdateDisplaysData *data, ParsedAttribute *p) { GtkTextBuffer *help; ReturnStatus ret; int *pData; int len; int i; NvCtrlAttributeHandle *display_handle; /* retrieve the list of connected display devices */ ret = NvCtrlGetBinaryAttribute(gpu_handle, 0, NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU, (unsigned char **)(&pData), &len); if ((ret != NvCtrlSuccess) || (pData[0] <= 0)) { return; } nvfree(data->display_iters); data->display_iters = calloc(pData[0], sizeof(GtkTreeIter)); data->num_displays = 0; if (!data->display_iters) return; /* * create pages for each of the display devices driven by this (gpu) * handle. */ for (i = 0; i < pData[0]; i++) { int display_id = pData[i+1]; char *logName; char *typeBaseName; char *typeIdName; GtkWidget *widget; gchar *title; CtkEvent *ctk_event; CtrlHandles *handles = ctk_window->ctk_config->pCtrlHandles; /* * Get the ctrl handle that was passed into ctk_main so that updated * backend color slider values, cached in the handle itself, can be * saved to the RC file when the UI is closed. */ display_handle = nv_get_target_handle(handles, NV_CTRL_TARGET_TYPE_DISPLAY, display_id); if (!display_handle) { display_handle = nv_add_target(handles, NvCtrlGetDisplayPtr(gpu_handle), NV_CTRL_TARGET_TYPE_DISPLAY, display_id); if (!display_handle) { continue; } } /* * Rebuild Sub-systems of display handle */ NvCtrlAttributeRebuildSubsystems(display_handle, NV_CTRL_ATTRIBUTES_ALL_SUBSYSTEMS); ctk_event = CTK_EVENT(ctk_event_new(display_handle)); /* Query display's names */ ret = NvCtrlGetStringAttribute(display_handle, NV_CTRL_STRING_DISPLAY_NAME_TYPE_BASENAME, &typeBaseName); if (ret != NvCtrlSuccess) { NvCtrlAttributeClose(display_handle); continue; } ret = NvCtrlGetStringAttribute(display_handle, NV_CTRL_STRING_DISPLAY_DEVICE_NAME, &logName); if (ret != NvCtrlSuccess) { logName = NULL; } ret = NvCtrlGetStringAttribute(display_handle, NV_CTRL_STRING_DISPLAY_NAME_TYPE_ID, &typeIdName); if (ret != NvCtrlSuccess) { typeIdName = NULL; } if (!logName && !typeIdName) { title = g_strdup_printf("DPY-%d - (Unknown)", display_id); } else { title = g_strdup_printf("%s - (%s)", typeIdName, logName); } XFree(logName); XFree(typeIdName); /* Create the page for the display */ widget = ctk_display_device_new(display_handle, ctk_window->ctk_config, ctk_event, ctk_event_gpu, title, typeBaseName, p); if (widget == NULL) { NvCtrlAttributeClose(display_handle); } else { help = ctk_display_device_create_help(tag_table, CTK_DISPLAY_DEVICE(widget)); add_page(widget, help, ctk_window, iter, &(data->display_iters[data->num_displays]), title, NULL, NULL, NULL); data->num_displays++; } XFree(typeBaseName); g_free(title); } } /* add_display_devices() */ /* * Select display page whose name is passed through 'name' parameter */ static void select_display_page(UpdateDisplaysData *data, gchar *name) { CtkWindow *ctk_window = data->window; GtkTreeSelection *tree_selection = gtk_tree_view_get_selection(ctk_window->treeview); gint num_displays = data->num_displays; while (num_displays) { GtkTreeIter *iter = &(data->display_iters[num_displays -1]); CtkDisplayDevice *ctk_obj = NULL; GtkWidget *widget = NULL; gtk_tree_model_get(GTK_TREE_MODEL(ctk_window->tree_store), iter, CTK_WINDOW_WIDGET_COLUMN, &widget, -1); ctk_obj = CTK_DISPLAY_DEVICE(widget); if (strcmp(name, ctk_obj->name) == 0) { gtk_tree_selection_select_iter(tree_selection, iter); break; } num_displays--; } } /* * update_display_devices() - Callback handler for the NV_CTRL_PROBE_DISPLAYS * NV-CONTROL event. Updates the list of display devices connected to the * GPU for which the event happened. * */ static void update_display_devices(GtkObject *object, gpointer arg1, gpointer user_data) { UpdateDisplaysData *data = (UpdateDisplaysData *) user_data; CtkWindow *ctk_window = data->window; NvCtrlAttributeHandle *gpu_handle = data->gpu_handle; GtkTreeIter parent_iter = data->parent_iter; GtkTextTagTable *tag_table = data->tag_table; GtkTreePath* parent_path; gboolean parent_expanded; GtkTreeSelection *tree_selection = gtk_tree_view_get_selection(ctk_window->treeview); GtkWidget *widget; gchar *selected_display_name = NULL; /* Keep track if the parent row is expanded */ parent_path = gtk_tree_model_get_path(GTK_TREE_MODEL(ctk_window->tree_store), &parent_iter); parent_expanded = gtk_tree_view_row_expanded(ctk_window->treeview, parent_path); /* Remove previous display devices */ while (data->num_displays) { GtkTreeIter *iter = &(data->display_iters[data->num_displays -1]); gboolean is_selected = FALSE; /* Select the parent (GPU) iter if we're removing the selected page */ if (gtk_tree_selection_iter_is_selected(tree_selection, iter)) { is_selected = TRUE; gtk_tree_selection_select_iter(tree_selection, &parent_iter); } /* Remove the entry */ gtk_tree_model_get(GTK_TREE_MODEL(ctk_window->tree_store), iter, CTK_WINDOW_WIDGET_COLUMN, &widget, -1); if (is_selected) { CtkDisplayDevice *ctk_obj = CTK_DISPLAY_DEVICE(widget); selected_display_name = g_strdup(ctk_obj->name); } gtk_tree_store_remove(ctk_window->tree_store, iter); /* unref the page so we don't leak memory */ g_object_unref(GTK_OBJECT(widget)); data->num_displays--; } /* Add back all the connected display devices */ gtk_tree_model_get(GTK_TREE_MODEL(ctk_window->tree_store), &parent_iter, CTK_WINDOW_WIDGET_COLUMN, &widget, -1); add_display_devices(ctk_window, &parent_iter, gpu_handle, CTK_GPU(widget)->ctk_event, tag_table, data, ctk_window->attribute_list); /* Expand the GPU entry if it used to be */ if (parent_expanded) { gtk_tree_view_expand_row(ctk_window->treeview, parent_path, TRUE); } if (selected_display_name) { select_display_page(data, selected_display_name); g_free(selected_display_name); } } /* update_display_devices() */ nvidia-settings/src/gtk+-2.x/ctkimagesliders.c0000664000175000017500000004116712236467170021425 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "ctkimagesliders.h" #include "ctkscale.h" #include "ctkconfig.h" #include "ctkhelp.h" #define FRAME_PADDING 5 static const char *__digital_vibrance_help = "The Digital Vibrance slider " "alters the level of Digital Vibrance for this display device."; static const char *__image_sharpening_help = "The Image Sharpening slider " "alters the level of Image Sharpening for this display device."; static void ctk_image_sliders_class_init(CtkImageSliders *ctk_object_class); static void ctk_image_sliders_finalize(GObject *object); static GtkWidget * add_scale(CtkConfig *ctk_config, int attribute, char *name, const char *help, gint value_type, gint default_value, gpointer callback_data); static void setup_scale(CtkImageSliders *ctk_image_sliders, int attribute, GtkWidget *scale); static void setup_reset_button(CtkImageSliders *ctk_image_sliders); static void scale_value_changed(GtkAdjustment *adjustment, gpointer user_data); static void scale_value_received(GtkObject *, gpointer arg1, gpointer); GType ctk_image_sliders_get_type(void) { static GType ctk_image_sliders_type = 0; if (!ctk_image_sliders_type) { static const GTypeInfo ctk_image_sliders_info = { sizeof (CtkImageSlidersClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ctk_image_sliders_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkImageSliders), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_image_sliders_type = g_type_register_static (GTK_TYPE_VBOX, "CtkImageSliders", &ctk_image_sliders_info, 0); } return ctk_image_sliders_type; } static void ctk_image_sliders_class_init( CtkImageSliders *ctk_object_class ) { GObjectClass *gobject_class = (GObjectClass *)ctk_object_class; gobject_class->finalize = ctk_image_sliders_finalize; } static void ctk_image_sliders_finalize( GObject *object ) { CtkImageSliders *ctk_image_sliders = CTK_IMAGE_SLIDERS(object); g_signal_handlers_disconnect_matched(G_OBJECT(ctk_image_sliders->ctk_event), G_SIGNAL_MATCH_DATA, 0, /* signal_id */ 0, /* detail */ NULL, /* closure */ NULL, /* func */ (gpointer) ctk_image_sliders); } GtkWidget* ctk_image_sliders_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event, GtkWidget *reset_button, char *name) { CtkImageSliders *ctk_image_sliders; GObject *object; GtkWidget *frame; GtkWidget *vbox; ReturnStatus status; gint val; /* * now that we know that we will have at least one attribute, * create the object */ object = g_object_new(CTK_TYPE_IMAGE_SLIDERS, NULL); if (!object) return NULL; ctk_image_sliders = CTK_IMAGE_SLIDERS(object); ctk_image_sliders->handle = handle; ctk_image_sliders->ctk_config = ctk_config; ctk_image_sliders->ctk_event = ctk_event; ctk_image_sliders->reset_button = reset_button; ctk_image_sliders->name = name; /* create the frame and vbox */ frame = gtk_frame_new(NULL); vbox = gtk_vbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(vbox), FRAME_PADDING); gtk_container_add(GTK_CONTAINER(frame), vbox); gtk_box_pack_start(GTK_BOX(object), frame, FALSE, FALSE, 0); ctk_image_sliders->frame = frame; /* Digital Vibrance */ ctk_image_sliders->digital_vibrance = add_scale(ctk_config, NV_CTRL_DIGITAL_VIBRANCE, "Digital Vibrance", __digital_vibrance_help, G_TYPE_INT, 0, /* default value */ ctk_image_sliders); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_DIGITAL_VIBRANCE), G_CALLBACK(scale_value_received), (gpointer) ctk_image_sliders); gtk_box_pack_start(GTK_BOX(vbox), ctk_image_sliders->digital_vibrance, TRUE, TRUE, 0); /* Image Sharpening */ status = NvCtrlGetAttribute(ctk_image_sliders->handle, NV_CTRL_IMAGE_SHARPENING_DEFAULT, &val); if (status != NvCtrlSuccess) { val = 0; } ctk_image_sliders->image_sharpening = add_scale(ctk_config, NV_CTRL_IMAGE_SHARPENING, "Image Sharpening", __image_sharpening_help, G_TYPE_INT, val, ctk_image_sliders); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_IMAGE_SHARPENING), G_CALLBACK(scale_value_received), (gpointer) ctk_image_sliders); gtk_box_pack_start(GTK_BOX(vbox), ctk_image_sliders->image_sharpening, TRUE, TRUE, 0); gtk_widget_show_all(GTK_WIDGET(object)); /* update the GUI */ ctk_image_sliders_setup(ctk_image_sliders); return GTK_WIDGET(object); } /* ctk_image_sliders_new() */ /* * add_scale() - if the specified attribute exists and we can * query its valid values, create a new scale widget */ static GtkWidget * add_scale(CtkConfig *ctk_config, int attribute, char *name, const char *help, gint value_type, gint default_value, gpointer callback_data) { GtkObject *adj; GtkWidget *scale; adj = gtk_adjustment_new(0, 0, 10, 1, 1, 0); g_object_set_data(G_OBJECT(adj), "attribute", GINT_TO_POINTER(attribute)); g_object_set_data(G_OBJECT(adj), "attribute name", name); g_object_set_data(G_OBJECT(adj), "attribute default value", GINT_TO_POINTER(default_value)); g_signal_connect(G_OBJECT(adj), "value_changed", G_CALLBACK(scale_value_changed), (gpointer) callback_data); scale = ctk_scale_new(GTK_ADJUSTMENT(adj), name, ctk_config, value_type); ctk_config_set_tooltip(ctk_config, CTK_SCALE_TOOLTIP_WIDGET(scale), help); return scale; } /* add_scale() */ /* * post_scale_value_changed() - helper function for * scale_value_changed() and value_changed(); this does whatever * work is necessary after the adjustment has been updated -- * currently, this just means posting a statusbar message. */ static void post_scale_value_changed(GtkAdjustment *adjustment, CtkImageSliders *ctk_image_sliders, gint value) { char *name = g_object_get_data(G_OBJECT(adjustment), "attribute name"); gtk_widget_set_sensitive(ctk_image_sliders->reset_button, TRUE); ctk_config_statusbar_message(ctk_image_sliders->ctk_config, "%s set to %d.", name, value); } /* post_scale_value_changed() */ /* * scale_value_changed() - callback when any of the adjustments * in the CtkImageSliders are changed: get the new value from the * adjustment, send it to the X server, and do any post-adjustment * work. */ static void scale_value_changed(GtkAdjustment *adjustment, gpointer user_data) { CtkImageSliders *ctk_image_sliders = CTK_IMAGE_SLIDERS(user_data); gint value; gint attribute; value = (gint) gtk_adjustment_get_value(adjustment); user_data = g_object_get_data(G_OBJECT(adjustment), "attribute"); attribute = GPOINTER_TO_INT(user_data); NvCtrlSetAttribute(ctk_image_sliders->handle, attribute, (int) value); post_scale_value_changed(adjustment, ctk_image_sliders, value); } /* scale_value_changed() */ /* * ctk_image_sliders_reset() - resets sliders to their default values */ void ctk_image_sliders_reset(CtkImageSliders *ctk_image_sliders) { GtkAdjustment *adj; gint val; if (!ctk_image_sliders) return; if (GTK_WIDGET_SENSITIVE(ctk_image_sliders->digital_vibrance)) { adj = CTK_SCALE(ctk_image_sliders->digital_vibrance)->gtk_adjustment; val = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(adj), "attribute default value")); NvCtrlSetAttribute(ctk_image_sliders->handle, NV_CTRL_DIGITAL_VIBRANCE, val); } if (GTK_WIDGET_SENSITIVE(ctk_image_sliders->image_sharpening)) { adj = CTK_SCALE(ctk_image_sliders->image_sharpening)->gtk_adjustment; val = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(adj), "attribute default value")); NvCtrlSetAttribute(ctk_image_sliders->handle, NV_CTRL_IMAGE_SHARPENING, val); } /* * The above may have triggered events. Such an event will * cause scale_value_changed() and post_scale_value_changed() to * be called when control returns to the gtk_main loop. * post_scale_value_changed() will write a status message to the * statusbar. * * However, the caller of ctk_image_sliders_reset() (e.g., * ctkdisplaydevice.c:reset_button_clicked()) may also want to * write a status message to the statusbar. To ensure that the * caller's statusbar message takes precedence (i.e., is the last * thing written to the statusbar), process any generated events * now, before returning to the caller. */ while (gtk_events_pending()) { gtk_main_iteration_do(FALSE); } ctk_image_sliders_setup(ctk_image_sliders); } /* ctk_image_sliders_reset() */ /* * scale_value_received() - callback function for changed image settings; this * is called when we receive an event indicating that another * NV-CONTROL client changed any of the settings that we care about. */ static void scale_value_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct; CtkImageSliders *ctk_image_sliders = CTK_IMAGE_SLIDERS(user_data); GtkAdjustment *adj; GtkWidget *scale; gint val; event_struct = (CtkEventStruct *) arg1; switch (event_struct->attribute) { case NV_CTRL_DIGITAL_VIBRANCE: scale = ctk_image_sliders->digital_vibrance; break; case NV_CTRL_IMAGE_SHARPENING: scale = ctk_image_sliders->image_sharpening; break; default: return; } if (event_struct->is_availability_changed) { setup_scale(ctk_image_sliders, event_struct->attribute, scale); } adj = CTK_SCALE(scale)->gtk_adjustment; val = gtk_adjustment_get_value(GTK_ADJUSTMENT(adj)); if (val != event_struct->value) { val = event_struct->value; g_signal_handlers_block_by_func(adj, scale_value_changed, ctk_image_sliders); gtk_adjustment_set_value(GTK_ADJUSTMENT(adj), val); post_scale_value_changed(GTK_ADJUSTMENT(adj), ctk_image_sliders, val); g_signal_handlers_unblock_by_func(adj, scale_value_changed, ctk_image_sliders); } } /* scale_value_received() */ /* * add_image_sliders_help() - */ void add_image_sliders_help(CtkImageSliders *ctk_image_sliders, GtkTextBuffer *b, GtkTextIter *i) { ctk_help_heading(b, i, "Digital Vibrance"); ctk_help_para(b, i, "Digital Vibrance, a mechanism for " "controlling color separation and intensity, boosts " "the color saturation of an image so that all images " "including 2D, 3D, and video appear brighter and " "crisper (even on flat panels) in your applications."); ctk_help_heading(b, i, "Image Sharpening"); ctk_help_para(b, i, "Use the Image Sharpening slider to adjust the " "sharpness of the image quality by amplifying high " "frequency content."); } /* add_image_sliders_help() */ /* Update GUI state of the scale to reflect current settings * on the X Driver. */ static void setup_scale(CtkImageSliders *ctk_image_sliders, int attribute, GtkWidget *scale) { ReturnStatus ret0, ret1; NVCTRLAttributeValidValuesRec valid; NvCtrlAttributeHandle *handle = ctk_image_sliders->handle; int val; GtkAdjustment *adj = CTK_SCALE(scale)->gtk_adjustment; /* Read settings from X server */ ret0 = NvCtrlGetValidAttributeValues(handle, attribute, &valid); ret1 = NvCtrlGetAttribute(handle, attribute, &val); if ((ret0 == NvCtrlSuccess) && (ret1 == NvCtrlSuccess) && (valid.type == ATTRIBUTE_TYPE_RANGE)) { g_signal_handlers_block_by_func(adj, scale_value_changed, ctk_image_sliders); adj->lower = valid.u.range.min; adj->upper = valid.u.range.max; gtk_adjustment_changed(GTK_ADJUSTMENT(adj)); gtk_adjustment_set_value(GTK_ADJUSTMENT(adj), val); g_signal_handlers_unblock_by_func(adj, scale_value_changed, ctk_image_sliders); gtk_widget_set_sensitive(scale, TRUE); } else { gtk_widget_set_sensitive(scale, FALSE); } } /* setup_scale() */ static void setup_reset_button(CtkImageSliders *ctk_image_sliders) { GtkWidget *scale; GtkAdjustment *adj; gint default_val; gint current_val; /* Reset button should be sensitive if all scales are sensitive and * at least one scale is set to the non-default value */ scale = ctk_image_sliders->digital_vibrance; if (GTK_WIDGET_SENSITIVE(scale)) { adj = CTK_SCALE(scale)->gtk_adjustment; current_val = (gint) gtk_adjustment_get_value(adj); default_val = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(adj), "attribute default value")); if (current_val != default_val) { goto enable; } } scale = ctk_image_sliders->image_sharpening; if (GTK_WIDGET_SENSITIVE(scale)) { adj = CTK_SCALE(scale)->gtk_adjustment; current_val = (gint) gtk_adjustment_get_value(adj); default_val = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(adj), "attribute default value")); if (current_val != default_val) { goto enable; } } /* Don't disable reset button here, since other settings that are not * managed by the ctk_image_slider here may need it enabled */ return; enable: gtk_widget_set_sensitive(ctk_image_sliders->reset_button, TRUE); } /* * Updates the page to reflect the current configuration of * the display device. */ void ctk_image_sliders_setup(CtkImageSliders *ctk_image_sliders) { if (!ctk_image_sliders) return; /* Update sliders */ /* NV_CTRL_DIGITAL_VIBRANCE */ setup_scale(ctk_image_sliders, NV_CTRL_DIGITAL_VIBRANCE, ctk_image_sliders->digital_vibrance); /* NV_CTRL_IMAGE_SHARPENING */ setup_scale(ctk_image_sliders, NV_CTRL_IMAGE_SHARPENING, ctk_image_sliders->image_sharpening); setup_reset_button(ctk_image_sliders); } /* ctk_image_sliders_setup() */ nvidia-settings/src/gtk+-2.x/ctkpowersavings.c0000664000175000017500000001571212236467170021501 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "ctkbanner.h" #include "ctkpowersavings.h" #include "ctkconfig.h" #include "ctkhelp.h" static void vblank_control_button_toggled (GtkWidget *, gpointer); static void post_vblank_control_button_toggled (CtkPowerSavings *, gboolean); static void value_changed (GtkObject *, gpointer, gpointer); static const char *__vblank_control_help = "When enabled, VBlank interrupts will be generated by the GPU " "only if they are required by the driver. Normally, VBlank " "interrupts are generated on every vertical refresh of every " "display device connected to the GPU. Enabling on-demand VBlank " "interrupt control can help conserve power."; GType ctk_power_savings_get_type(void) { static GType ctk_power_savings_type = 0; if (!ctk_power_savings_type) { static const GTypeInfo ctk_power_savings_info = { sizeof (CtkPowerSavingsClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init, */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkPowerSavings), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_power_savings_type = g_type_register_static (GTK_TYPE_VBOX, "CtkPowerSavings", &ctk_power_savings_info, 0); } return ctk_power_savings_type; } GtkWidget* ctk_power_savings_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event) { GObject *object; CtkPowerSavings *ctk_power_savings; GtkWidget *label; GtkWidget *banner; GtkWidget *hseparator; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *check_button; gint ondemand_vblank_control; /* query power savings settings */ if (NvCtrlGetAttribute(handle, NV_CTRL_ONDEMAND_VBLANK_INTERRUPTS, &ondemand_vblank_control) != NvCtrlSuccess) { return NULL; } object = g_object_new(CTK_TYPE_POWER_SAVINGS, NULL); ctk_power_savings = CTK_POWER_SAVINGS(object); ctk_power_savings->handle = handle; ctk_power_savings->ctk_config = ctk_config; gtk_box_set_spacing(GTK_BOX(object), 10); banner = ctk_banner_image_new(BANNER_ARTWORK_GPU); gtk_box_pack_start(GTK_BOX(object), banner, FALSE, FALSE, 0); /* 'Interrupts' section */ hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, FALSE, 0); label = gtk_label_new("Interrupts"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 0); vbox = gtk_vbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(object), vbox, FALSE, FALSE, 0); /* 'On-Demand VBlank interrupts' toggle */ label = gtk_label_new("On-Demand VBlank Interrupts"); check_button = gtk_check_button_new(); gtk_container_add(GTK_CONTAINER(check_button), label); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), ondemand_vblank_control); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(check_button), "toggled", G_CALLBACK(vblank_control_button_toggled), (gpointer)ctk_power_savings); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_ONDEMAND_VBLANK_INTERRUPTS), G_CALLBACK(value_changed), (gpointer)ctk_power_savings); ctk_config_set_tooltip(ctk_config, check_button, __vblank_control_help); ctk_power_savings->vblank_control_button = check_button; gtk_widget_show_all(GTK_WIDGET(object)); return GTK_WIDGET(object); } /* * Prints a status bar message. */ static void post_vblank_control_button_toggled(CtkPowerSavings *ctk_power_savings, gboolean enabled) { ctk_config_statusbar_message(ctk_power_savings->ctk_config, "On-Demand VBlank Interrupts %s.", enabled ? "enabled" : "disabled"); } static void vblank_control_button_toggled( GtkWidget *widget, gpointer user_data ) { CtkPowerSavings *ctk_power_savings; gboolean enabled; ctk_power_savings = CTK_POWER_SAVINGS(user_data); enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); NvCtrlSetAttribute(ctk_power_savings->handle, NV_CTRL_ONDEMAND_VBLANK_INTERRUPTS, enabled); post_vblank_control_button_toggled(ctk_power_savings, enabled); } /* * value_changed() - callback function for changed NV-CONTROL * attribute settings. */ static void value_changed(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct; CtkPowerSavings *ctk_power_savings; gboolean enabled; GtkToggleButton *button; GCallback func; event_struct = (CtkEventStruct *)arg1; ctk_power_savings = CTK_POWER_SAVINGS(user_data); switch (event_struct->attribute) { case NV_CTRL_ONDEMAND_VBLANK_INTERRUPTS: button = GTK_TOGGLE_BUTTON(ctk_power_savings->vblank_control_button); func = G_CALLBACK(vblank_control_button_toggled); post_vblank_control_button_toggled(ctk_power_savings, event_struct->value); break; default: return; } enabled = gtk_toggle_button_get_active(button); if (enabled != event_struct->value) { g_signal_handlers_block_by_func(button, func, ctk_power_savings); gtk_toggle_button_set_active(button, event_struct->value); g_signal_handlers_unblock_by_func(button, func, ctk_power_savings); } } GtkTextBuffer *ctk_power_savings_create_help(GtkTextTagTable *table, CtkPowerSavings *ctk_power_savings) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "Power Savings Help"); ctk_help_heading(b, &i, "On-Demand VBlank Interrupts"); ctk_help_para(b, &i, "%s", __vblank_control_help); ctk_help_finish(b); return b; } nvidia-settings/src/gtk+-2.x/ctkclocks.h0000664000175000017500000000575312236467170020241 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_CLOCKS_H__ #define __CTK_CLOCKS_H__ #include "ctkevent.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_CLOCKS (ctk_clocks_get_type()) #define CTK_CLOCKS(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_CLOCKS, CtkClocks)) #define CTK_CLOCKS_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_CLOCKS, CtkClocksClass)) #define CTK_IS_CLOCKS(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_CLOCKS)) #define CTK_IS_CLOCKS_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_CLOCKS)) #define CTK_CLOCKS_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_CLOCKS, CtkClocksClass)) #define CLOCKS_NONE 0 #define CLOCKS_2D 2 #define CLOCKS_3D 3 typedef struct _CtkClocks CtkClocks; typedef struct _CtkClocksClass CtkClocksClass; struct _CtkClocks { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; GtkWidget *license_dialog; GtkWidget *detect_dialog; GtkWidget *license_window; GtkWidget *enable_checkbox; /* Overclocking available */ GtkWidget *clock_menu; /* 2D/3D dropdown selector */ GtkWidget *gpu_clk_scale; /* Current 2D or 3D clock sliders */ GtkWidget *mem_clk_scale; GtkWidget *apply_button; /* Apply target clock frequencies */ GtkWidget *detect_button; /* Auto detects best 3D clock frequencies */ GtkWidget *reset_button; /* Reset hardware default frequencies */ int clocks_being_modified; /* Wether we're editing the 2D or 3D clocks */ Bool clocks_modified; /* The clocks were modified by the user */ Bool clocks_moved; /* The clock sliders were moved by the user */ Bool overclocking_enabled; /* Overclocking is enabled */ Bool auto_detection_available; /* Optimal clock detection is available */ Bool probing_optimal; /* Optimal clocks being probed */ }; struct _CtkClocksClass { GtkVBoxClass parent_class; }; GType ctk_clocks_get_type (void) G_GNUC_CONST; GtkWidget *ctk_clocks_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *); GtkTextBuffer *ctk_clocks_create_help (GtkTextTagTable *, CtkClocks *); void ctk_clocks_select (GtkWidget *widget); G_END_DECLS #endif /* __CTK_CLOCKS_H__ */ nvidia-settings/src/gtk+-2.x/ctkvcs.h0000664000175000017500000000522412236467170017547 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2006 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_VCS_H__ #define __CTK_VCS_H__ #include "ctkevent.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_VCS (ctk_vcs_get_type()) #define CTK_VCS(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_VCS, \ CtkVcs)) #define CTK_VCS_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_VCS, \ CtkVcsClass)) #define CTK_IS_VCS(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_VCS)) #define CTK_IS_VCS_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_VCS)) #define CTK_VCS_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_VCS, \ CtkVcsClass)) typedef struct FanEntry { gint fan_number; gint fan_speed; gint fan_failed; } FanEntry, *FanEntryPtr; typedef struct ThermalEntry { gint intake_temp; gint exhaust_temp; gint board_temp; } ThermalEntry, *ThermalEntryPtr; typedef struct PSUEntry { gint psu_current; gint psu_voltage; gint psu_power; gint psu_state; } PSUEntry, *PSUEntryPtr; typedef struct _CtkVcs { GtkVBox parent; CtkConfig *ctk_config; NvCtrlAttributeHandle *handle; GtkWidget *intake_temp; GtkWidget *exhaust_temp; GtkWidget *board_temp; GtkWidget *psu_state; GtkWidget *psu_current; GtkWidget *psu_voltage; GtkWidget *psu_power; GtkWidget *error_dialog_label; GtkWidget *error_dialog; GtkWidget *fan_status_container; GtkRequisition req; } CtkVcs; typedef struct _CtkVcsClass { GtkVBoxClass parent_class; } CtkVcsClass; GType ctk_vcs_get_type (void) G_GNUC_CONST; GtkWidget* ctk_vcs_new (NvCtrlAttributeHandle *, CtkConfig *); GtkTextBuffer *ctk_vcs_create_help(GtkTextTagTable *, CtkVcs *); void ctk_vcs_start_timer(GtkWidget *widget); void ctk_vcs_stop_timer(GtkWidget *widget); G_END_DECLS #endif /* __CTK_VCS_H__ */ nvidia-settings/src/gtk+-2.x/ctkglx.h0000664000175000017500000000376612236467170017557 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_GLX_H__ #define __CTK_GLX_H__ #include "ctkevent.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_GLX (ctk_glx_get_type()) #define CTK_GLX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_GLX, CtkGLX)) #define CTK_GLX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_GLX, CtkGLXClass)) #define CTK_IS_GLX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_GLX)) #define CTK_IS_GLX_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_GLX)) #define CTK_GLX_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_GLX, CtkGLXClass)) typedef struct _CtkGLX CtkGLX; typedef struct _CtkGLXClass CtkGLXClass; struct _CtkGLX { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; GtkWidget *glxinfo_vpane; Bool glxinfo_initialized; GtkWidget *show_fbc_button; GtkWidget *fbc_window; }; struct _CtkGLXClass { GtkVBoxClass parent_class; }; GType ctk_glx_get_type (void) G_GNUC_CONST; GtkWidget* ctk_glx_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *); GtkTextBuffer *ctk_glx_create_help(GtkTextTagTable *, CtkGLX *); void ctk_glx_probe_info(GtkWidget *widget); G_END_DECLS #endif /* __CTK_GLX_H__ */ nvidia-settings/src/gtk+-2.x/ctkdisplaydevice.h0000664000175000017500000000572312236467170021605 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_DISPLAYDEVICE_H__ #define __CTK_DISPLAYDEVICE_H__ #include "ctkevent.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_DISPLAY_DEVICE (ctk_display_device_get_type()) #define CTK_DISPLAY_DEVICE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_DISPLAY_DEVICE, \ CtkDisplayDevice)) #define CTK_DISPLAY_DEVICE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_DISPLAY_DEVICE, \ CtkDisplayDeviceClass)) #define CTK_IS_DISPLAY_DEVICE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_DISPLAY_DEVICE)) #define CTK_IS_DISPLAY_DEVICE_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_DISPLAY_DEVICE)) #define CTK_DISPLAY_DEVICE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_DISPLAY_DEVICE, \ CtkDisplayDeviceClass)) typedef struct _CtkDisplayDevice CtkDisplayDevice; typedef struct _CtkDisplayDeviceClass CtkDisplayDeviceClass; typedef struct InfoEntryRec { gboolean present; GtkWidget *hbox; GtkWidget *label; GtkWidget *txt; struct _CtkDisplayDevice *ctk_object; } InfoEntry; struct _CtkDisplayDevice { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; CtkEvent *ctk_event; CtkEvent *ctk_event_gpu; GtkWidget *image_sliders; GtkWidget *reset_button; GtkWidget *edid; GtkWidget *dithering_controls; GtkWidget *color_controls; gboolean color_correction_available; InfoEntry *info_entries; int num_info_entries; gboolean display_enabled; unsigned int active_attributes; char *name; gint signal_type; }; struct _CtkDisplayDeviceClass { GtkVBoxClass parent_class; }; GType ctk_display_device_get_type (void) G_GNUC_CONST; GtkWidget* ctk_display_device_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *, CtkEvent *, char *, char *, ParsedAttribute *); GtkTextBuffer *ctk_display_device_create_help(GtkTextTagTable *, CtkDisplayDevice *); G_END_DECLS #endif /* __CTK_DISPLAYDEVICE_H__ */ nvidia-settings/src/gtk+-2.x/ctkdisplayconfig.h0000664000175000017500000001640312236467170021610 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_DISPLAYCONFIG_H__ #define __CTK_DISPLAYCONFIG_H__ #include "ctkevent.h" #include "ctkconfig.h" #include "ctkdisplaylayout.h" #include "ctkdisplayconfig-utils.h" G_BEGIN_DECLS #define CTK_TYPE_DISPLAY_CONFIG (ctk_display_config_get_type()) #define CTK_DISPLAY_CONFIG(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_DISPLAY_CONFIG, \ CtkDisplayConfig)) #define CTK_DISPLAY_CONFIG_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_DISPLAY_CONFIG, \ CtkDisplayConfigClass)) #define CTK_IS_DISPLAY_CONFIG(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_DISPLAY_CONFIG)) #define CTK_IS_DISPLAY_CONFIG_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_DISPLAY_CONFIG)) #define CTK_DISPLAY_CONFIG_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_DISPLAY_CONFIG, \ CtkDisplayConfigClass)) typedef enum { SELECTABLE_ITEM_SCREEN, SELECTABLE_ITEM_DISPLAY } SelectableItemType; typedef struct SelectableItemRec { SelectableItemType type; union { nvDisplayPtr display; nvScreenPtr screen; } u; } SelectableItem; /* Display configuration special index */ #define DPY_CFG_DISABLED 0 #define DPY_CFG_X_SCREEN 1 #define DPY_CFG_NEW_X_SCREEN 2 typedef struct DisplayConfigOptionRec { int config; nvScreenPtr screen; } DisplayConfigOption; typedef struct _CtkDisplayConfig { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; gboolean page_selected; /* Is the display config page selected in the UI */ /* Layout */ nvLayoutPtr layout; GtkWidget *obj_layout; GtkWidget *label_layout; GtkWidget *chk_mosaic_enabled; GtkWidget *chk_xinerama_enabled; GtkWidget *chk_primary_display; gboolean primary_display_changed; GtkWidget *mnu_selected_item; SelectableItem *selected_item_table; int selected_item_table_len; GtkWidget *notebook; /* Tabbed notebook for display and X screen pages */ /* Display - Info */ GtkWidget *display_page; GtkWidget *txt_display_gpu; GtkWidget *box_display_config; GtkWidget *mnu_display_config; DisplayConfigOption *display_config_table; int display_config_table_len; /* Display - Settings */ GtkWidget *box_screen_drag_info_display; GtkWidget *box_display_resolution; GtkWidget *mnu_display_resolution; nvSelectedModePtr *resolution_table; int resolution_table_len; GtkWidget *mnu_display_refresh; nvModeLinePtr *refresh_table; /* Lookup table for refresh menu */ int refresh_table_len; GtkWidget *box_display_modename; GtkWidget *txt_display_modename; GtkWidget *box_display_stereo; GtkWidget *mnu_display_stereo; GtkWidget *box_display_orientation; GtkWidget *mnu_display_rotation; GtkWidget *mnu_display_reflection; GtkWidget *box_display_underscan; GtkWidget *txt_display_underscan; GtkWidget *sld_display_underscan; GtkObject *adj_display_underscan; GtkWidget *box_display_viewport; GtkWidget *box_display_viewport_in; GtkWidget *txt_display_viewport_in; GtkWidget *box_display_viewport_out; GtkWidget *txt_display_viewport_out; GtkWidget *box_display_position; GtkWidget *mnu_display_position_type; /* Absolute, Right of... */ GtkWidget *mnu_display_position_relative; /* List of available devices */ nvDisplayPtr *display_position_table; /* Lookup table for relative display position */ int display_position_table_len; GtkWidget *txt_display_position_offset; /* Absolute: +0+0 */ GtkWidget *box_display_panning; GtkWidget *txt_display_panning; /* X Screen - Info */ GtkWidget *screen_page; /* X Screen - Settings */ GtkWidget *box_screen_drag_info_screen; GtkWidget *box_screen_virtual_size; GtkWidget *txt_screen_virtual_size; GtkWidget *box_screen_depth; GtkWidget *mnu_screen_depth; GtkWidget *box_screen_stereo; GtkWidget *mnu_screen_stereo; GtkWidget *box_screen_position; GtkWidget *mnu_screen_position_type; /* Absolute, Right of... */ GtkWidget *mnu_screen_position_relative; /* List of available devices */ nvScreenPtr *screen_position_table; int screen_position_table_len; GtkWidget *txt_screen_position_offset; /* Absolute: +0+0 */ GtkWidget *box_screen_metamode; GtkWidget *btn_screen_metamode; GtkWidget *btn_screen_metamode_add; GtkWidget *btn_screen_metamode_delete; int *screen_depth_table; int screen_depth_table_len; /* Dialogs */ GtkWidget *dlg_display_disable; GtkWidget *txt_display_disable; GtkWidget *btn_display_disable_off; GtkWidget *btn_display_disable_cancel; GtkWidget *dlg_validation_override; GtkTextBuffer *buf_validation_override; GtkWidget *btn_validation_override_cancel; GtkWidget *box_validation_override_details; GtkWidget *btn_validation_override_show; /* Show details */ GtkWidget *dlg_validation_apply; GtkWidget *dlg_reset_confirm; GtkWidget *btn_reset_cancel; GtkWidget *dlg_display_confirm; GtkWidget *txt_display_confirm; GtkWidget *btn_display_apply_cancel; guint display_confirm_timer; int display_confirm_countdown; /* Timeout to reset display config */ SaveXConfDlg *save_xconfig_dlg; /* Buttons */ GtkWidget *btn_apply; gboolean apply_possible; /* True if all modifications are applicable */ gboolean reset_required; /* Reset required to apply */ gboolean forced_reset_allowed; /* OK to reset layout w/o user input */ gboolean notify_user_of_reset; /* User was notified of reset requirement */ gboolean ignore_reset_events; /* Ignore reset-causing events */ GdkPoint cur_screen_pos; /* Keep track of the selected X screen's position */ GtkWidget *btn_save; GtkWidget *btn_probe; GtkWidget *btn_advanced; gboolean advanced_mode; GtkWidget *btn_reset; int last_resolution_idx; } CtkDisplayConfig; typedef struct _CtkDisplayConfigClass { GtkVBoxClass parent_class; } CtkDisplayConfigClass; GType ctk_display_config_get_type (void) G_GNUC_CONST; GtkWidget* ctk_display_config_new (NvCtrlAttributeHandle *, CtkConfig *); GtkTextBuffer *ctk_display_config_create_help(GtkTextTagTable *, CtkDisplayConfig *); void ctk_display_config_selected(GtkWidget *); void ctk_display_config_unselected(GtkWidget *); G_END_DECLS #endif /* __CTK_DISPLAYCONFIG_H__ */ nvidia-settings/src/gtk+-2.x/ctkthermal.h0000664000175000017500000000720112236467170020405 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_THERMAL_H__ #define __CTK_THERMAL_H__ #include "NvCtrlAttributes.h" #include "ctkconfig.h" #include "ctkevent.h" G_BEGIN_DECLS #define CTK_TYPE_THERMAL (ctk_thermal_get_type()) #define CTK_THERMAL(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_THERMAL, CtkThermal)) #define CTK_THERMAL_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_THERMAL, CtkThermalClass)) #define CTK_IS_THERMAL(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_THERMAL)) #define CTK_IS_THERMAL_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_THERMAL)) #define CTK_THERMAL_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_THERMAL, CtkThermalClass)) typedef struct _CtkThermal CtkThermal; typedef struct _CtkThermalClass CtkThermalClass; typedef struct _CoolerControl { NVCTRLAttributeValidValuesRec range; NvCtrlAttributeHandle *handle; int level; Bool changed; /* Cooler level moved by user */ GtkWidget *widget; /* Cooler level control widget */ GtkAdjustment *adjustment; /* Track adjustment */ CtkEvent *event; /* Receive NV_CONTROL events */ } CoolerControlRec, *CoolerControlPtr; typedef struct { int format; const char *name; } nvctrlFormatName; typedef struct _SensorInfo { NvCtrlAttributeHandle *handle; int currentTemp; int minTemp; int maxTemp; GtkWidget *target_type; GtkWidget *provider_type; GtkWidget *temp_label; GtkWidget *core_gauge; } SensorInfoRec, *SensorInfoPtr; struct _CtkThermal { GtkVBox parent; NvCtrlAttributeHandle *attribute_handle; CtkConfig *ctk_config; GtkWidget *core_label; GtkWidget *core_gauge; GtkWidget *ambient_label; GtkWidget *apply_button; GtkWidget *reset_button; GtkWidget *enable_checkbox; GtkWidget *enable_dialog; GtkWidget *license_window; GtkWidget *fan_control_frame; GtkWidget *adaptive_clock_status; GtkWidget *fan_target; GtkWidget *fan_signal; GtkWidget *fan_control_policy; GtkWidget *cooler_table_hbox; GtkWidget *fan_information_box; gboolean cooler_control_enabled; gboolean settings_changed; gboolean show_fan_control_frame; gboolean enable_reset_button; CoolerControlPtr cooler_control; SensorInfoPtr sensor_info; int cooler_count; int sensor_count; gboolean thermal_sensor_target_type_supported; }; struct _CtkThermalClass { GtkVBoxClass parent_class; }; GType ctk_thermal_get_type (void) G_GNUC_CONST; GtkWidget* ctk_thermal_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *); GtkTextBuffer* ctk_thermal_create_help (GtkTextTagTable *, CtkThermal *); void ctk_thermal_start_timer (GtkWidget *); void ctk_thermal_stop_timer (GtkWidget *); G_END_DECLS #endif /* __CTK_THERMAL_H__ */ nvidia-settings/src/gtk+-2.x/ctkui.c0000664000175000017500000000466312236467170017372 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "ctkui.h" #include "ctkwindow.h" #include "nvidia_icon_pixdata.h" /* * This source file provides thin wrappers over the gtk routines, so * that nvidia-settings.c doesn't need to include gtk+ */ int ctk_init_check(int *argc, char **argv[]) { return gtk_init_check(argc, argv); } char *ctk_get_display(void) { return gdk_get_display(); } void ctk_main(ParsedAttribute *p, ConfigProperties *conf, CtrlHandles *h, const char *page) { int i, has_nv_control = FALSE; GList *list = NULL; GtkWidget *window; list = g_list_append (list, gdk_pixbuf_from_pixdata(&nvidia_icon_pixdata, TRUE, NULL)); gtk_window_set_default_icon_list(list); window = ctk_window_new(p, conf, h); for (i = 0; i < h->targets[X_SCREEN_TARGET].n; i++) { if (h->targets[X_SCREEN_TARGET].t[i].h) { has_nv_control = TRUE; break; } } if (!has_nv_control) { GtkWidget *dlg; dlg = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "You do not appear to be using the NVIDIA " "X driver. Please edit your X configuration " "file (just run `nvidia-xconfig` " "as root), and restart the X server."); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy (dlg); } ctk_window_set_active_page(CTK_WINDOW(window), page); gtk_main(); } nvidia-settings/src/gtk+-2.x/ctkframelock.c0000664000175000017500000057547512236467170020736 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "NvCtrlAttributes.h" #include "NVCtrlLib.h" #include #include #include #include #include "ctkutils.h" #include "ctkbanner.h" #include "ctkframelock.h" #include "ctkhelp.h" #include "ctkevent.h" #include "led_green_pixdata.h" #include "led_red_pixdata.h" #include "led_grey_pixdata.h" #include "rj45_input_pixdata.h" #include "rj45_output_pixdata.h" #include "rj45_unused_pixdata.h" #include "bnc_cable_pixdata.h" #include "parse.h" #include "msg.h" #include "common-utils.h" #define DEFAULT_UPDATE_STATUS_TIME_INTERVAL 1000 #define DEFAULT_TEST_LINK_TIME_INTERVAL 2000 #define DEFAULT_CHECK_FOR_ETHERNET_TIME_INTERVAL 10000 #define DEFAULT_ENABLE_CONFIRM_TIMEOUT 30 /* When enabling Frame Lock when * no server is specified, this * is the number of seconds the * user has to confirm that * everything is ok. */ #define POLARITY_RISING 0x1 #define POLARITY_FALLING 0x2 #define POLARITY_BOTH 0x3 #define FRAME_PADDING 5 enum { ENTRY_DATA_FRAMELOCK = 0, ENTRY_DATA_GPU, ENTRY_DATA_DISPLAY }; /* * These signals get hooked up (to the display_state_received() function) * for all frame lock display devices that are included in the list. When the * entry is removed, these signals also get removed. */ const char *__DisplaySignals[] = { CTK_EVENT_NAME(NV_CTRL_REFRESH_RATE), CTK_EVENT_NAME(NV_CTRL_REFRESH_RATE_3), CTK_EVENT_NAME(NV_CTRL_FRAMELOCK_DISPLAY_CONFIG), }; /* * These signals get hooked up (to the gpu_state_received() function) * for all frame lock devices that are included in the list. When the * frame lock device entry is removed, these signals also get removed for * that entry. */ const char *__GPUSignals[] = { CTK_EVENT_NAME(NV_CTRL_FRAMELOCK_SYNC), CTK_EVENT_NAME(NV_CTRL_FRAMELOCK_TEST_SIGNAL), }; /* * These signals get hooked up (to the framelock_state_received() function) * for all frame lock devices that are included in the list. When the * frame lock device entry is removed, these signals also get removed for * that entry. */ const char *__FrameLockSignals[] = { CTK_EVENT_NAME(NV_CTRL_USE_HOUSE_SYNC), CTK_EVENT_NAME(NV_CTRL_FRAMELOCK_SYNC_INTERVAL), CTK_EVENT_NAME(NV_CTRL_FRAMELOCK_POLARITY), CTK_EVENT_NAME(NV_CTRL_FRAMELOCK_VIDEO_MODE), }; typedef struct _nvListTreeRec nvListTreeRec, *nvListTreePtr; typedef struct _nvListEntryRec nvListEntryRec, *nvListEntryPtr; typedef struct _nvDisplayDataRec nvDisplayDataRec, *nvDisplayDataPtr; typedef struct _nvGPUDataRec nvGPUDataRec, *nvGPUDataPtr; typedef struct _nvFrameLockDataRec nvFrameLockDataRec, *nvFrameLockDataPtr; struct _nvListEntryRec { nvListTreePtr tree; GtkWidget *vbox; /* Holds all entry widgets and children */ GtkWidget *ebox; /* Event box for this entry's stuff */ GtkWidget *hbox; /* Box inside ebox */ GtkWidget *title_hbox; /* This entry's title data */ GtkWidget *padding_hbox; /* Padding to denote nested hierarchy */ GtkWidget *expander_hbox; GtkWidget *expander_button_image; /* Expander button widgets */ GtkWidget *expander_button; GtkWidget *expander_vbox; /* To align the button */ gboolean expanded; GtkWidget *label_hbox; GtkWidget *data_hbox; GtkWidget *child_vbox; /* Holds child entries */ gpointer data; /* Data (used to render entry) */ gint data_type; CtkEvent *ctk_event; /* For receiving events on the entry */ nvListEntryPtr parent; nvListEntryPtr children; int nchildren; nvListEntryPtr next_sibling; }; struct _nvListTreeRec { GtkWidget *vbox; /* Holds top level entries */ CtkFramelock *ctk_framelock; /* XXX Too bad we need this here */ nvListEntryPtr entries; /* Top level entries */ int nentries; nvListEntryPtr selected_entry; nvListEntryPtr server_entry; }; struct _nvDisplayDataRec { gpointer handle; /* NV-CONTROL Display Target */ gboolean serverable; gboolean clientable; GtkWidget *label; guint device_mask; GtkWidget *server_label; GtkWidget *server_checkbox; gboolean masterable; gboolean slaveable; GtkWidget *client_label; GtkWidget *client_checkbox; GtkWidget *rate_label; GtkWidget *rate_text; /* Rate in milliHz */ guint rate_mHz; guint rate_precision; gboolean hdmi3D; GtkWidget *stereo_label; GtkWidget *stereo_hbox; /* LED */ }; struct _nvGPUDataRec { gpointer handle; /* NV-CONTROL GPU Target */ gboolean enabled; /* Sync enabled */ GtkWidget *timing_label; GtkWidget *timing_hbox; /* LED */ GtkWidget *label; }; struct _nvFrameLockDataRec { gpointer handle; /* NV-CONTROL Frame Lock Target */ int server_id; int sync_delay_resolution; GtkWidget *label; GtkWidget *receiving_label; GtkWidget *receiving_hbox; /* LED */ GtkWidget *rate_label; GtkWidget *rate_text; GtkWidget *delay_label; GtkWidget *delay_text; GtkWidget *house_label; GtkWidget *house_sync_rate_label; GtkWidget *house_sync_rate_text; GtkWidget *house_hbox; /* LED */ GtkWidget *port0_label; GtkWidget *port0_hbox; /* IMAGE */ guint port0_ethernet_error; GtkWidget *port1_label; GtkWidget *port1_hbox; /* IMAGE */ guint port1_ethernet_error; GtkWidget *revision_label; GtkWidget *revision_text; GtkWidget *extra_info_hbox; }; static gchar *houseFormatStrings[] = { "Composite, Auto", /* VIDEO_MODE_COMPOSITE_AUTO */ "TTL", /* VIDEO_MODE_TTL */ "Composite, Bi-Level", /* VIDEO_MODE_COMPOSITE_BI_LEVEL */ "Composite, Tri-Level", /* VIDEO_MODE_COMPOSITE_TRI_LEVEL */ NULL }; static gchar *syncEdgeStrings[] = { "", /* None */ "Rising", /* NV_CTRL_FRAMELOCK_POLARITY_RISING_EDGE */ "Falling", /* NV_CTRL_FRAMELOCK_POLARITY_FALLING_EDGE */ "Both", /* NV_CTRL_FRAMELOCK_POLARITY_BOTH_EDGES */ NULL }; /* Tooltips */ static const char * __add_devices_button_help = "The Add Devices button adds to the frame lock group all Quadro Sync devices " "found on the specified X Server."; static const char * __remove_devices_button_help = "The Remove Devices button allows you to remove Quadro Sync, GPU or display " "devices from the frame lock group. Any device removed from the frame lock " "group will no longer be controlled."; static const char * __show_extra_info_button_help = "The Show Extra Info button displays extra information and settings " "for various devices."; static const char * __expand_all_button_help = "This button expands or collapses all the entries in the framelock device " "list."; static const char * __use_house_sync_button_help = "The Use House Sync if Present checkbox tells the server Quadro Sync device " "to generate the master frame lock signal from the incoming house sync signal " "(if a house sync signal is detected) instead of using internal timing from " "the server GPU/display device."; static const char * __sync_interval_scale_help = "The Sync Interval allows you to set the number of incoming house sync " "pulses the master frame lock board receives before generating an outgoing " "frame lock sync pulse. A value of 0 means a frame lock sync pulse is sent " "for every house sync pulse."; static const char * __sync_edge_combo_help = "The Sync Edge drop-down allows you to select which edge the master " "frame lock device will use to decode the incoming house sync signal."; static const char * __video_mode_help = "The Video Mode drop-down allows you to select which video mode the server " "Quadro Sync device will use to decode the incoming house sync signal. On " "some Quadro Sync devices, this will be auto-detected and will be reported " "as read-only information."; static const char * __detect_video_mode_button_help = "The Detect Video Mode button will attempt to automatically detect the format " "of the house sync signal by iterating through the list of known video modes."; static const char * __test_link_button_help = "The Test Link button will cause the master frame lock device to output a " "test signal for a short amount of time. During this time, the Sync Signal " "coming from the master frame lock device will be held high causing the rj45 " "ports throughout the frame lock group to stop blinking."; static const char * __sync_enable_button_help = "The Enable/Disable Frame Lock button will enable/disable frame lock on all " "devices listed in the Quadro Sync group. Enabling frame lock will lock the " "refresh rates of all members in the frame lock group."; static const char * __server_checkbox_help = "The Server checkbox sets which display device the underlying frame lock " "device should use to generate the frame lock sync signal. Only one display " "device can be selected as server for a frame lock group. To select another " "display device, the display device currently set as server should be " "unselected."; static const char * __client_checkbox_help = "The Client checkbox allows you to set whether or not this display device " "will be synchronized to the incoming frame lock sync signal."; static void add_framelock_devices(CtkFramelock *, gpointer, int); static void add_gpu_devices(CtkFramelock *, nvListEntryPtr); static void add_display_devices(CtkFramelock *, nvListEntryPtr); static void add_devices(CtkFramelock *, const gchar *, gboolean); static GtkWidget *create_add_devices_dialog(CtkFramelock *); static GtkWidget *create_remove_devices_dialog(CtkFramelock *); static GtkWidget *create_enable_confirm_dialog(CtkFramelock *); static void add_devices_response(GtkWidget *, gint, gpointer); static void add_devices_repond_ok(GtkWidget *, gpointer); static void remove_devices_response(GtkWidget *, gint, gpointer); static void expand_all_clicked(GtkWidget *, gpointer); static void error_msg(CtkFramelock *, const gchar *, ...); static void toggle_use_house_sync(GtkWidget *, gpointer); static void toggle_extra_info(GtkWidget *, gpointer); static void toggle_server(GtkWidget *, gpointer); static void toggle_client(GtkWidget *, gpointer); static void toggle_sync_enable(GtkWidget *, gpointer); static void toggle_test_link(GtkWidget *, gpointer); static void sync_interval_changed(GtkRange *, gpointer); static void changed_video_mode(GtkEditable *, gpointer); static void toggle_detect_video_mode(GtkToggleButton *, gpointer); static gboolean update_framelock_status(gpointer); static gboolean check_for_ethernet(gpointer); static void update_framelock_controls(CtkFramelock *); static void update_house_sync_controls(CtkFramelock *); static void update_expand_all_button_status(CtkFramelock *); static void apply_parsed_attribute_list(CtkFramelock *ctk_framelock, ParsedAttribute *list); static void gpu_state_received(GtkObject *object, gpointer arg1, gpointer user_data); static void framelock_state_received(GtkObject *object, gpointer arg1, gpointer user_data); #define SELECT_WIDGET(W, S) \ gtk_widget_modify_fg(GTK_WIDGET(W), GTK_STATE_NORMAL, \ &((GTK_WIDGET(W))->style->text[S])); \ gtk_widget_modify_bg(GTK_WIDGET(W), GTK_STATE_NORMAL, \ &((GTK_WIDGET(W))->style->base[S])); /************************************************************************/ /* * Widget creation helper functions */ /** create_error_msg_dialog() **************************************** * * Creates the error message dialog. This dialog is used by various * parts of the GUI to report errors. * */ static GtkWidget *create_error_msg_dialog(CtkFramelock *ctk_framelock) { GtkWidget *dialog; GtkWidget *hbox; GtkWidget *image; GtkWidget *alignment; GdkPixbuf *pixbuf; dialog = gtk_dialog_new_with_buttons("Error", ctk_framelock->parent_window, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); /* Prevent the dialog from being deleted when closed */ g_signal_connect(G_OBJECT(dialog), "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), (gpointer) dialog); g_signal_connect_swapped(GTK_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_hide_all), GTK_OBJECT(dialog)); gtk_container_set_border_width(GTK_CONTAINER(dialog), 6); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); hbox = gtk_hbox_new(FALSE, 12); gtk_container_set_border_width(GTK_CONTAINER(hbox), 6); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), hbox); pixbuf = gtk_widget_render_icon(dialog, GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG, NULL); image = gtk_image_new_from_pixbuf(pixbuf); g_object_unref(pixbuf); ctk_framelock->error_msg_label = gtk_label_new(NULL); alignment = gtk_alignment_new(0.0, 0.0, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), image); gtk_box_pack_start(GTK_BOX(hbox), alignment, FALSE, FALSE, 2); alignment = gtk_alignment_new(0.0, 0.0, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), ctk_framelock->error_msg_label); gtk_box_pack_start(GTK_BOX(hbox), alignment, FALSE, FALSE, 0); return dialog; } /** create_sync_state_button() *************************************** * * Creates the enable/disable frame lock button. This button has * two labels - one for each state it can be in such that an * informative icon. * */ static GtkWidget *create_sync_state_button(CtkFramelock *ctk_framelock) { GtkWidget *label; GtkWidget *hbox, *hbox2; GdkPixbuf *pixbuf; GtkWidget *image = NULL; GtkWidget *button; button = gtk_toggle_button_new(); /* create the enable syncing icon */ pixbuf = gtk_widget_render_icon(button, GTK_STOCK_EXECUTE, GTK_ICON_SIZE_BUTTON, "enable frame lock"); if (pixbuf) image = gtk_image_new_from_pixbuf(pixbuf); label = gtk_label_new("Enable Frame Lock"); hbox = gtk_hbox_new(FALSE, 2); if (image) gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox2 = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox2), hbox, FALSE, FALSE, 15); gtk_widget_show_all(hbox2); /* * XXX increment the reference count, so that when we do * gtk_container_remove() later, it doesn't get destroyed */ gtk_object_ref(GTK_OBJECT(hbox2)); ctk_framelock->enable_syncing_label = hbox2; /* create the disable syncing icon */ pixbuf = gtk_widget_render_icon(button, GTK_STOCK_STOP, GTK_ICON_SIZE_BUTTON, "disable frame lock"); if (pixbuf) image = gtk_image_new_from_pixbuf(pixbuf); label = gtk_label_new("Disable Frame Lock"); hbox = gtk_hbox_new(FALSE, 2); if (image) gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox2 = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox2), hbox, FALSE, FALSE, 15); gtk_widget_show_all(hbox2); /* * XXX increment the reference count, so that when we do * gtk_container_remove() later, it doesn't get destroyed */ gtk_object_ref(GTK_OBJECT(hbox2)); ctk_framelock->disable_syncing_label = hbox2; /* start with syncing disabled */ ctk_framelock->selected_syncing_label = ctk_framelock->enable_syncing_label; gtk_container_add(GTK_CONTAINER(button), ctk_framelock->selected_syncing_label); return (button); } /** create_add_devices_dialog() ************************************** * * Creates the dialog that will query for a server name from which * frame lock/gpu/display devices will be added to the current * frame lock group. * */ static GtkWidget *create_add_devices_dialog(CtkFramelock *ctk_framelock) { GtkWidget *dialog; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *label, *descr; GtkWidget *image; GdkPixbuf *pixbuf; GtkWidget *alignment; dialog = gtk_dialog_new_with_buttons("Add X Screen", ctk_framelock->parent_window, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); /* Prevent the dialog from being deleted when closed */ g_signal_connect(G_OBJECT(dialog), "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), (gpointer) dialog); g_signal_connect (GTK_OBJECT(dialog), "response", G_CALLBACK(add_devices_response), GTK_OBJECT(ctk_framelock)); gtk_container_set_border_width(GTK_CONTAINER(dialog), 6); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); hbox = gtk_hbox_new(FALSE, 12); gtk_container_set_border_width(GTK_CONTAINER(hbox), 6); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), hbox); pixbuf = gtk_widget_render_icon(dialog, GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG, NULL); image = gtk_image_new_from_pixbuf(pixbuf); g_object_unref(pixbuf); label = gtk_label_new("X Server:"); descr = gtk_label_new("Please specify the X server to be added to the " "frame lock group."); ctk_framelock->add_devices_entry = gtk_entry_new(); g_signal_connect(G_OBJECT(ctk_framelock->add_devices_entry), "activate", G_CALLBACK(add_devices_repond_ok), (gpointer) ctk_framelock); gtk_entry_set_text(GTK_ENTRY(ctk_framelock->add_devices_entry), NvCtrlGetDisplayName (ctk_framelock->attribute_handle)); gtk_entry_set_width_chars (GTK_ENTRY(ctk_framelock->add_devices_entry), 16); alignment = gtk_alignment_new(0.0, 0.0, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), image); gtk_box_pack_start(GTK_BOX(hbox), alignment, FALSE, FALSE, 2); vbox = gtk_vbox_new(FALSE, 12); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); alignment = gtk_alignment_new(0.0, 0.0, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), descr); gtk_box_pack_start(GTK_BOX(vbox), alignment, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 12); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_framelock->add_devices_entry, TRUE, TRUE, 0); return dialog; } /** create_remove_devices_dialog() *********************************** * * Creates the dialog that will query for a server name from which * frame lock/gpu/display devices will be added to the current * frame lock group. * */ static GtkWidget *create_remove_devices_dialog(CtkFramelock *ctk_framelock) { GtkWidget *dialog; GtkWidget *hbox; GtkWidget *image; GdkPixbuf *pixbuf; GtkWidget *alignment; dialog = gtk_dialog_new_with_buttons("Remove Device(s)", ctk_framelock->parent_window, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); /* Prevent the dialog from being deleted when closed */ g_signal_connect(G_OBJECT(dialog), "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), (gpointer) dialog); g_signal_connect(GTK_OBJECT(dialog), "response", G_CALLBACK(remove_devices_response), GTK_OBJECT(ctk_framelock)); gtk_container_set_border_width(GTK_CONTAINER(dialog), 6); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); hbox = gtk_hbox_new(FALSE, 12); gtk_container_set_border_width(GTK_CONTAINER(hbox), 6); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), hbox); pixbuf = gtk_widget_render_icon(dialog, GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG, NULL); image = gtk_image_new_from_pixbuf(pixbuf); g_object_unref(pixbuf); ctk_framelock->remove_devices_label = gtk_label_new(NULL); alignment = gtk_alignment_new(0.0, 0.0, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), image); gtk_box_pack_start(GTK_BOX(hbox), alignment, FALSE, FALSE, 2); alignment = gtk_alignment_new(0.0, 0.0, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), ctk_framelock->remove_devices_label); gtk_box_pack_start(GTK_BOX(hbox), alignment, FALSE, FALSE, 0); return dialog; } /** create_enable_confirm_dialog() *********************************** * * Creates the dialog that will confirm with the user when Frame Lock * is enabled without a server device specified. * */ static GtkWidget *create_enable_confirm_dialog(CtkFramelock *ctk_framelock) { GtkWidget *dialog; GtkWidget *hbox; /* Display ModeSwitch confirmation dialog */ dialog = gtk_dialog_new_with_buttons ("Confirm ModeSwitch", GTK_WINDOW(gtk_widget_get_parent(GTK_WIDGET(ctk_framelock))), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_YES, GTK_RESPONSE_ACCEPT, NULL); ctk_framelock->enable_confirm_cancel_button = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_NO, GTK_RESPONSE_REJECT); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); /* Display confirm dialog text (Dynamically generated) */ ctk_framelock->enable_confirm_text = gtk_label_new(""); /* Add the text to the dialog */ hbox = gtk_hbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_framelock->enable_confirm_text, TRUE, TRUE, 20); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 20); gtk_widget_show_all(GTK_DIALOG(dialog)->vbox); return dialog; } /************************************************************************/ /* * Helper functions */ /** my_button_new_with_label() *************************************** * * Creates a button with padding. * */ static GtkWidget *my_button_new_with_label(const gchar *txt, gint hpad, gint vpad) { GtkWidget *btn; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *label; btn = gtk_button_new(); hbox = gtk_hbox_new(FALSE, 0); vbox = gtk_vbox_new(FALSE, 0); label = gtk_label_new(txt); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, hpad); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, vpad); gtk_container_add(GTK_CONTAINER(btn), vbox); return btn; } /** my_toggle_button_new_with_label() ******************************** * * Creates a toggle button with padding. * */ static GtkWidget *my_toggle_button_new_with_label(const gchar *txt, gint hpad, gint vpad) { GtkWidget *btn; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *label; btn = gtk_toggle_button_new(); hbox = gtk_hbox_new(FALSE, 0); vbox = gtk_vbox_new(FALSE, 0); label = gtk_label_new(txt); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, hpad); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, vpad); gtk_container_add(GTK_CONTAINER(btn), vbox); return btn; } /** update_image() *************************************************** * * Updates the container to hold a duplicate of the given image. * */ static void update_image(GtkWidget *container, GdkPixbuf *new_pixbuf) { ctk_empty_container(container); gtk_box_pack_start(GTK_BOX(container), gtk_image_new_from_pixbuf(new_pixbuf), FALSE, FALSE, 0); gtk_widget_show_all(container); } /** get_display_name() *********************************************** * * Returns the name of the given display device. * * If 'simple' is 0, then the display device type will be * included in the name returned. * */ static gchar *get_display_name(nvDisplayDataPtr data, gboolean simple) { ReturnStatus ret; char *display_name; char *display_type = NULL; char *name; ret = NvCtrlGetStringAttribute(data->handle, NV_CTRL_STRING_DISPLAY_DEVICE_NAME, &display_name); if (ret != NvCtrlSuccess) { display_name = NULL; } if (!simple) { ret = NvCtrlGetStringAttribute(data->handle, NV_CTRL_STRING_DISPLAY_NAME_RANDR, &display_type); if (ret != NvCtrlSuccess) { display_type = NULL; } } if (display_type) { name = g_strconcat((display_name ? display_name : "Unknown Display"), " (", display_type, ")", NULL); XFree(display_type); } else { name = g_strconcat((display_name ? display_name : "Unknown Display"), NULL); } if (display_name) { XFree(display_name); } return name; } /** get_gpu_name() *************************************************** * * Returns the name of the given GPU. * * If 'simple' is 0, then the GPU ID will be included in the name * returned. * */ static gchar *get_gpu_name(nvGPUDataPtr data, gboolean simple) { ReturnStatus ret; char *product_name; char tmp[32]; char *name; ret = NvCtrlGetStringAttribute(data->handle, NV_CTRL_STRING_PRODUCT_NAME, &product_name); if (ret != NvCtrlSuccess) { product_name = NULL; } snprintf(tmp, 32, " (GPU %d)", NvCtrlGetTargetId(data->handle)); if (simple) { name = g_strconcat(product_name?product_name:"Unknown GPU", NULL); } else { name = g_strconcat(product_name?product_name:"Unknown GPU", tmp, NULL); } if (product_name) { free(product_name); } return name; } /** get_framelock_name() ********************************************* * * Returns the name of the given frame lock (Quadro Sync) device. * */ static char *get_framelock_name(nvFrameLockDataPtr data, gboolean simple) { char *server_name; char tmp[32]; char *name; /* NOTE: The display name of a non-X Screen target will * return the server name and server # only. * (i.e., it does not return a screen #) */ server_name = NvCtrlGetDisplayName(data->handle); snprintf(tmp, 32, " (Quadro Sync %d)", NvCtrlGetTargetId(data->handle)); name = g_strconcat(server_name?server_name:"Unknown X Server", tmp, NULL); return name; } /** list_entry_get_name() ******************************************** * * Returns the correct label for the given entry. * */ static gchar *list_entry_get_name(nvListEntryPtr entry, gboolean simple) { switch (entry->data_type) { case ENTRY_DATA_FRAMELOCK: return get_framelock_name((nvFrameLockDataPtr)(entry->data), simple); case ENTRY_DATA_GPU: return get_gpu_name((nvGPUDataPtr)(entry->data), simple); case ENTRY_DATA_DISPLAY: return get_display_name((nvDisplayDataPtr)(entry->data), simple); } return NULL; } /** update_entry_label() ********************************************* * * Sets the correct label for the given entry. * */ static void update_entry_label(CtkFramelock *ctk_framelock, nvListEntryPtr entry) { char *str; gboolean simple; simple = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(ctk_framelock->short_labels_button)); str = list_entry_get_name(entry, simple); switch (entry->data_type) { case ENTRY_DATA_FRAMELOCK: gtk_label_set_text(GTK_LABEL (((nvFrameLockDataPtr)(entry->data))->label), str?str:"Unknown Quadro Sync"); break; case ENTRY_DATA_GPU: gtk_label_set_text(GTK_LABEL (((nvGPUDataPtr)(entry->data))->label), str?str:"Unknown GPU"); break; case ENTRY_DATA_DISPLAY: gtk_label_set_text(GTK_LABEL (((nvDisplayDataPtr)(entry->data))->label), str?str:"Unknown Display"); break; } if (str) { g_free(str); } } /** error_msg() ****************************************************** * * Displays an error message dialog using the error message dialog. * */ static void error_msg(CtkFramelock *ctk_framelock, const gchar *fmt, ...) { gchar *msg; NV_VSNPRINTF(msg, fmt); gtk_label_set_line_wrap(GTK_LABEL(ctk_framelock->error_msg_label), TRUE); gtk_label_set_use_markup(GTK_LABEL(ctk_framelock->error_msg_label), TRUE); gtk_label_set_markup(GTK_LABEL(ctk_framelock->error_msg_label), msg); gtk_widget_show_all(ctk_framelock->error_msg_dialog); free(msg); } /** show_remove_devices_dialog() ************************************* * * Displays the remove devices dialog. * */ static void show_remove_devices_dialog(GtkWidget *button, CtkFramelock *ctk_framelock) { nvListTreePtr tree; nvListEntryPtr entry; gchar *str = NULL, *name; tree = (nvListTreePtr)(ctk_framelock->tree); entry = tree->selected_entry; if (!entry) return; name = list_entry_get_name(entry, 0); if (!name) { str = g_strconcat("Would you like to remove the selected entry " "from the group?" "\n\nNOTE: This will also remove any entries " "under this one.", NULL); } else if (entry->nchildren) { str = g_strconcat("Would you like to remove the following entry " "from the group?\n\n", name, "", "\n\nNOTE: This will also remove any entries " "under this one.", NULL); } else { str = g_strconcat("Would you like to remove the following entry " "from the group?\n\n", name, "", NULL); } if (name) { g_free(name); } gtk_label_set_line_wrap(GTK_LABEL(ctk_framelock->remove_devices_label), TRUE); gtk_label_set_use_markup(GTK_LABEL(ctk_framelock->remove_devices_label), TRUE); if (str) { gtk_label_set_markup(GTK_LABEL(ctk_framelock->remove_devices_label), str); g_free(str); } gtk_widget_show_all(ctk_framelock->remove_devices_dialog); } /** get_framelock_server_entry() ************************************* * * Retrieves the frame lock list entry that is related to the currently * selected server (display) list entry, if any. * */ static nvListEntryPtr get_framelock_server_entry(nvListTreePtr tree) { nvListEntryPtr entry; if (!tree || !tree->server_entry) { return NULL; } entry = tree->server_entry; while (entry) { if (entry->data_type == ENTRY_DATA_FRAMELOCK) { return entry; } entry = entry->parent; } return NULL; } /** get_gpu_server_entry() ******************************************* * * Retrieves the GPU list entry that is related to the currently * selected server (display) list entry, if any. * */ static nvListEntryPtr get_gpu_server_entry(nvListTreePtr tree) { nvListEntryPtr entry; if (!tree || !tree->server_entry) { return NULL; } entry = tree->server_entry; while (entry) { if (entry->data_type == ENTRY_DATA_GPU) { return entry; } entry = entry->parent; } return NULL; } /** get_display_server_entry() *************************************** * * Retrieves the display list entry that is the currently selected * server. * */ static nvListEntryPtr get_display_server_entry(nvListTreePtr tree) { return tree->server_entry; } /** get_display_server_data() **************************************** * * Retrieves the display list entry'sdata that is the currently * selected server. * */ static nvDisplayDataPtr get_display_server_data(nvListTreePtr tree) { nvListEntryPtr entry = get_display_server_entry(tree); if (!entry) { return NULL; } return (nvDisplayDataPtr)entry->data; } /** list_entry_update_framelock_controls() *************************** * * Updates a Quadro Sync list entry's GUI controls based on the current * frame lock status. * */ static void list_entry_update_framelock_controls(CtkFramelock *ctk_framelock, nvListEntryPtr entry) { nvFrameLockDataPtr data = (nvFrameLockDataPtr)(entry->data); gboolean framelock_enabled = ctk_framelock->framelock_enabled; gboolean show_all = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(ctk_framelock->extra_info_button)); /* Show/Hide frame lock widgets */ if (show_all) { gtk_widget_show(data->extra_info_hbox); } else { gtk_widget_hide(data->extra_info_hbox); } /* Activate Sync Rate when frame lock is enabled */ gtk_widget_set_sensitive(data->rate_label, framelock_enabled); gtk_widget_set_sensitive(data->rate_text, framelock_enabled); /* Activate Sync Delay when frame lock is enabled */ gtk_widget_set_sensitive(data->delay_label, framelock_enabled); gtk_widget_set_sensitive(data->delay_text, framelock_enabled); } /** list_entry_update_gpu_controls() ********************************* * * Updates a GPU list entry's GUI controls based on the current * frame lock status. * */ static void list_entry_update_gpu_controls(CtkFramelock *ctk_framelock, nvListEntryPtr entry) { /* No controls to update */ } static gboolean framelock_refresh_rates_compatible(int server, int client) { int range; /* client can be 0, e.g. if querying NV_CTRL_REFRESH_RATE{,_3} fails, * or if the display device is disabled. */ if (client == 0) { return FALSE; } range = ABS(((int64_t)(server - client) * 1000000) / client); /* Framelock can be achieved if the range between refresh rates is less * than 50 ppm */ return range <= 50; } /** list_entry_update_display_controls() ***************************** * * Updates a display device list entry's GUI controls based on * current frame lock status. * */ static void list_entry_update_display_controls(CtkFramelock *ctk_framelock, nvListEntryPtr entry) { nvDisplayDataPtr display_data = (nvDisplayDataPtr)(entry->data); gboolean framelock_enabled = ctk_framelock->framelock_enabled; gboolean sensitive; nvDisplayDataPtr server_data = get_display_server_data(entry->tree); /* Display can be set as the server if Framelock is disabled and the * display is serverable. */ sensitive = (!framelock_enabled && display_data->serverable); gtk_widget_set_sensitive(display_data->server_label, sensitive); gtk_widget_set_sensitive(display_data->server_checkbox, sensitive); /* Display can be set as a client if Framelock is disabled and the * display is clientable. Noce that if a server is currently selected, * and this display does not match the refresh rate, we still allow users * to select this display as a client - at which point we'll implicitly * disable the server. */ sensitive = (!framelock_enabled && display_data->clientable); gtk_widget_set_sensitive(display_data->client_label, sensitive); gtk_widget_set_sensitive(display_data->client_checkbox, sensitive); /* Gray out the display device's refresh rate when it is not the same as * the current server's, or the X server tells us the client cannot be * framelocked. */ sensitive = (display_data->clientable && (!server_data || framelock_refresh_rates_compatible(server_data->rate_mHz, display_data->rate_mHz))); gtk_widget_set_sensitive(display_data->rate_label, sensitive); gtk_widget_set_sensitive(display_data->rate_text, sensitive); gtk_widget_set_sensitive(display_data->label, sensitive); ctk_config_set_tooltip(ctk_framelock->ctk_config, entry->ebox, sensitive ? NULL : "This display device cannot be " "included in the frame lock group since it has a " "different refresh rate than that of the server."); /* If display cannot be a client, make sure it is not set as such */ if (!sensitive && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(display_data->client_checkbox))) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(display_data->client_checkbox), FALSE); } } /** list_entry_update_controls() ************************************* * * Updates the controls in the given entry list to reflect frame lock * sync status. This function is used to disable access to some * widgets while frame lock sync is enabled. * */ static void list_entry_update_controls(CtkFramelock *ctk_framelock, nvListEntryPtr entry) { if (!entry) return; switch (entry->data_type) { case ENTRY_DATA_FRAMELOCK: list_entry_update_framelock_controls(ctk_framelock, entry); break; case ENTRY_DATA_GPU: list_entry_update_gpu_controls(ctk_framelock, entry); break; case ENTRY_DATA_DISPLAY: list_entry_update_display_controls(ctk_framelock, entry); break; } /* * It is important that we recurse into children _after_ processing the * current node, since display entries may depend on data updated in GPU * entries (display entries are children of GPU entries). */ list_entry_update_controls(ctk_framelock, entry->children); list_entry_update_controls(ctk_framelock, entry->next_sibling); } /** has_client_selected() ******************************************** * * Returns TRUE if any of the displays in the tree are configured as * clients. * */ static gboolean has_client_selected(nvListEntryPtr entry) { if (!entry) return FALSE; if (entry->data_type == ENTRY_DATA_DISPLAY) { nvDisplayDataPtr data = (nvDisplayDataPtr) entry->data; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->client_checkbox))) { return TRUE; } } if (has_client_selected(entry->children)) { return TRUE; } return has_client_selected(entry->next_sibling); } /** has_server_selected() ******************************************** * * Returns TRUE if any of the displays in the tree are configured as * the server. * */ static gboolean has_server_selected(nvListEntryPtr entry) { if (!entry) return FALSE; if (entry->data_type == ENTRY_DATA_DISPLAY) { nvDisplayDataPtr data = (nvDisplayDataPtr) entry->data; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->server_checkbox))) { return TRUE; } } if (has_server_selected(entry->children)) { return TRUE; } return has_server_selected(entry->next_sibling); } /** has_display_selected() ******************************************* * * Returns TRUE if any of the displays are selected as a server or * client. * */ static gboolean has_display_selected(nvListEntryPtr entry) { if (!entry) return FALSE; if (entry->data_type == ENTRY_DATA_DISPLAY) { nvDisplayDataPtr data = (nvDisplayDataPtr) entry->data; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->client_checkbox)) || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->server_checkbox))) { return TRUE; } } if (has_display_selected(entry->children)) { return TRUE; } return has_display_selected(entry->next_sibling); } /** update_framelock_controls() ************************************** * * Enable/disable access to various GUI controls on the frame lock * page depending on the state of frame lock sync (frame lock * enabled/disabled). Also validates on client refresh rates * vs server refresh rate. * */ static void update_framelock_controls(CtkFramelock *ctk_framelock) { nvListTreePtr tree; gboolean framelock_enabled; gboolean something_selected; tree = (nvListTreePtr)(ctk_framelock->tree); framelock_enabled = ctk_framelock->framelock_enabled; /* Quadro Sync Buttons */ gtk_widget_set_sensitive(ctk_framelock->remove_devices_button, tree->selected_entry != NULL); gtk_widget_set_sensitive(ctk_framelock->extra_info_button, tree->nentries); g_signal_handlers_block_by_func (G_OBJECT(ctk_framelock->sync_state_button), G_CALLBACK(toggle_sync_enable), (gpointer) ctk_framelock); something_selected = has_display_selected(tree->entries); gtk_widget_set_sensitive(ctk_framelock->sync_state_button, something_selected); gtk_container_remove (GTK_CONTAINER(ctk_framelock->sync_state_button), ctk_framelock->selected_syncing_label); if (tree->nentries && framelock_enabled) { ctk_framelock->selected_syncing_label = ctk_framelock->disable_syncing_label; gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_framelock->sync_state_button), TRUE); } else { ctk_framelock->selected_syncing_label = ctk_framelock->enable_syncing_label; gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_framelock->sync_state_button), FALSE); } gtk_container_add(GTK_CONTAINER(ctk_framelock->sync_state_button), ctk_framelock->selected_syncing_label); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_framelock->sync_state_button), G_CALLBACK(toggle_sync_enable), (gpointer) ctk_framelock); gtk_widget_show_all(ctk_framelock->sync_state_button); /* Test link */ gtk_widget_set_sensitive(ctk_framelock->test_link_button, (framelock_enabled && tree->server_entry)); /* Update the frame lock Quadro Sync frame */ list_entry_update_controls(ctk_framelock, tree->entries); /* House Sync */ update_house_sync_controls(ctk_framelock); /* Update the expand/collapse all button status */ update_expand_all_button_status(ctk_framelock); } /** any_gpu_enabled() ************************************************ * * Returns TRUE if any of the gpus have frame lock enabled. * */ static gboolean any_gpu_enabled(nvListEntryPtr entry) { if (!entry) return FALSE; if (entry->data_type == ENTRY_DATA_GPU && ((nvGPUDataPtr)(entry->data))->enabled) { return TRUE; } if (any_gpu_enabled(entry->children)) { return TRUE; } if (any_gpu_enabled(entry->next_sibling)) { return TRUE; } return FALSE; } /************************************************************************/ /* * List Entry functions */ /** do_select_framelock_data() *************************************** * * This function defines how to set all the widgets in a frame lock * row as "selected" or "not selected" * */ static void do_select_framelock_data(nvFrameLockDataPtr data, gint select) { if (!data) { return; } SELECT_WIDGET(data->label, select); SELECT_WIDGET(data->receiving_label, select); SELECT_WIDGET(data->rate_label, select); SELECT_WIDGET(data->rate_text, select); SELECT_WIDGET(data->delay_label, select); SELECT_WIDGET(data->delay_text, select); SELECT_WIDGET(data->house_label, select); SELECT_WIDGET(data->port0_label, select); SELECT_WIDGET(data->port1_label, select); } /** do_select_gpu_data() ********************************************* * * This function defines how to set all the widgets in a GPU * row as "selected" or "not selected" * */ static void do_select_gpu_data(nvGPUDataPtr data, gint select) { if (!data) { return; } SELECT_WIDGET(data->label, select); SELECT_WIDGET(data->timing_label, select); } /** do_select_display_data() ***************************************** * * This function defines how to set all the widgets in a display * device row as "selected" or "not selected" * */ static void do_select_display_data(nvDisplayDataPtr data, gint select) { if (!data) { return; } SELECT_WIDGET(data->label, select); SELECT_WIDGET(data->server_label, select); SELECT_WIDGET(data->client_label, select); SELECT_WIDGET(data->rate_label, select); SELECT_WIDGET(data->rate_text, select); SELECT_WIDGET(data->stereo_label, select); } /** list_entry_set_select() ****************************************** * * This function sets which entry in the list is selected. If an * entry is already selected, it is unselected recursively. * */ static void list_entry_set_select(nvListEntryPtr entry, gint selected) { gint state; if (!entry || !entry->tree) { return; } /* Do the selection */ if (selected) { state = GTK_STATE_SELECTED; if (entry->tree->selected_entry) { /* Unselect previous entry */ list_entry_set_select ((nvListEntryPtr) entry->tree->selected_entry, False); } entry->tree->selected_entry = (void *)entry; } else { state = GTK_STATE_NORMAL; entry->tree->selected_entry = NULL; } /* Update the state of the entry's widgets */ SELECT_WIDGET(entry->ebox, state); if (!entry->data) { return; } switch (entry->data_type) { case ENTRY_DATA_FRAMELOCK: do_select_framelock_data((nvFrameLockDataPtr)(entry->data), state); break; case ENTRY_DATA_GPU: do_select_gpu_data((nvGPUDataPtr)(entry->data), state); break; case ENTRY_DATA_DISPLAY: do_select_display_data((nvDisplayDataPtr)(entry->data), state); break; default: break; } } /** list_entry_clicked() ********************************************* * * Called on the entry that the user clicked on. * */ static void list_entry_clicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { nvListEntryPtr entry = (nvListEntryPtr)(user_data); if (!entry || !entry->tree) { return; } if (entry != entry->tree->selected_entry) { list_entry_set_select(entry, True); /* Update GUI state */ update_framelock_controls(entry->tree->ctk_framelock); } } /** expander_button_clicked() **************************************** * * - Handles button clicks on an nvListEntry's expansion button * widget. * * This function either shows or hides the list entry's children * based on the state of the expansion widget. * */ static void expander_button_clicked(GtkWidget *widget, gpointer user_data) { nvListEntryPtr entry = (nvListEntryPtr) user_data; if (entry->expanded) { /* Collapse */ gtk_container_remove(GTK_CONTAINER(entry->expander_button), entry->expander_button_image); entry->expander_button_image = gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_set_size_request(entry->expander_button, 20, 20); gtk_container_add(GTK_CONTAINER(entry->expander_button), entry->expander_button_image); gtk_widget_show_all(entry->expander_button); gtk_widget_hide(entry->child_vbox); } else { /* Expand */ gtk_container_remove(GTK_CONTAINER(entry->expander_button), entry->expander_button_image); entry->expander_button_image = gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_set_size_request(entry->expander_button, 20, 20); gtk_container_add(GTK_CONTAINER(entry->expander_button), entry->expander_button_image); gtk_widget_show_all(entry->expander_button); gtk_widget_show(entry->child_vbox); } entry->expanded = !(entry->expanded); update_expand_all_button_status(entry->tree->ctk_framelock); } /** list_entry_add_expander_button() ********************************* * * - Adds a button to the left of a list entry's main data row. * * This button is used to show/hide the list entry's children. * */ static void list_entry_add_expander_button(nvListEntryPtr entry) { if (!entry || entry->expander_button) { return; } entry->expander_vbox = gtk_vbox_new(FALSE, 0); entry->expander_button = gtk_button_new(); entry->expander_button_image = gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_set_size_request(entry->expander_button, 20, 20); entry->expanded = True; g_signal_connect(G_OBJECT(entry->expander_button), "clicked", G_CALLBACK(expander_button_clicked), (gpointer) entry); gtk_container_add(GTK_CONTAINER(entry->expander_button), entry->expander_button_image); gtk_box_pack_start(GTK_BOX(entry->expander_vbox), entry->expander_button, TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(entry->expander_hbox), entry->expander_vbox, FALSE, FALSE, 0); } /** list_entry_remove_expander_button() ****************************** * * - Removes the button that is to the left of a list entry's main * data row. * * When a list entry has no more children, the expander button * should be removed. * */ static void list_entry_remove_expander_button(nvListEntryPtr entry) { if (!entry || !entry->expander_button) { return; } gtk_container_remove(GTK_CONTAINER(entry->expander_hbox), entry->expander_vbox); entry->expander_button = NULL; } /** list_entry_new() ************************************************* * * - Creates and returns a list entry. List entries are how rows of * a tree keep their parent-child relationship. * */ static nvListEntryPtr list_entry_new(nvListTreePtr tree) { nvListEntryPtr entry; entry = (nvListEntryPtr) calloc(1, sizeof(nvListEntryRec)); if (!entry) { return NULL; } entry->tree = tree; /* Create the vertical box that holds this entry and its children */ entry->vbox = gtk_vbox_new(FALSE, 0); /* Create the (top) row that holds this entry's data */ entry->ebox = gtk_event_box_new(); entry->hbox = gtk_hbox_new(FALSE, 15); entry->title_hbox = gtk_hbox_new(FALSE, 0); entry->padding_hbox = gtk_hbox_new(FALSE, 0); entry->expander_hbox = gtk_hbox_new(FALSE, 0); entry->label_hbox = gtk_hbox_new(FALSE, 0); entry->data_hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(entry->title_hbox), entry->padding_hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(entry->title_hbox), entry->expander_hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(entry->title_hbox), entry->label_hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(entry->hbox), entry->title_hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(entry->hbox), entry->data_hbox, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(entry->ebox), GTK_WIDGET(entry->hbox)); gtk_box_pack_start(GTK_BOX(entry->vbox), entry->ebox, TRUE, TRUE, 0); SELECT_WIDGET(entry->ebox, GTK_STATE_NORMAL); gtk_widget_set_events(entry->ebox, GDK_BUTTON_PRESS_MASK); g_signal_connect(G_OBJECT(entry->ebox), "button_press_event", G_CALLBACK(list_entry_clicked), (gpointer)entry); return entry; } static void framelock_data_free(nvFrameLockDataPtr data) { if (!data) return; if (data->handle) { NvCtrlAttributeClose(data->handle); } free(data); } static void gpu_data_free(nvGPUDataPtr data) { if (!data) return; if (data->handle) { NvCtrlAttributeClose(data->handle); } free(data); } static void display_data_free(nvDisplayDataPtr data) { if (!data) return; free(data); } /** list_entry_free() ************************************************ * * - Frees an existing list entry. * */ static void list_entry_free(nvListEntryPtr entry) { if (!entry) { return; } /* Remove signal callbacks */ if (entry->ctk_event) { g_signal_handlers_disconnect_matched(G_OBJECT(entry->ctk_event), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, (gpointer) entry); // XXX Free ctk_event object when we add that functionality. } /* Free any data associated with the entry */ if (entry->data) { switch (entry->data_type) { case ENTRY_DATA_FRAMELOCK: framelock_data_free((nvFrameLockDataPtr)entry->data); break; case ENTRY_DATA_GPU: gpu_data_free((nvGPUDataPtr)entry->data); break; case ENTRY_DATA_DISPLAY: display_data_free((nvDisplayDataPtr)entry->data); break; } } free(entry); } /** list_entry_add_child() ******************************************* * * - Adds the given child list entry to the parent list entry. * If this is the first child to be added, an expansion button will * be created for the parent. * */ static void list_entry_add_child(nvListEntryPtr parent, nvListEntryPtr child) { nvListEntryPtr entry; if (!parent || !child) { return; } /* Add the child into the parent's child list */ child->parent = parent; child->tree = parent->tree; if (!parent->children) { parent->children = child; } else { entry = parent->children; while (entry->next_sibling) { entry = entry->next_sibling; } entry->next_sibling = child; } /* If this is the parent's first child, create the expansion button * and child box that will hold the children. */ parent->nchildren++; if (parent->nchildren == 1) { /* Create the child box */ parent->child_vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(parent->vbox), parent->child_vbox, FALSE, FALSE, 0); gtk_widget_show(parent->child_vbox); /* Create the expansion button */ list_entry_add_expander_button(parent); gtk_widget_show(parent->expander_button); } /* Pack the child into the parent's child box */ gtk_box_pack_start(GTK_BOX(parent->child_vbox), child->vbox, FALSE, FALSE, 0); } /** list_entry_associate() ******************************************* * * - Associates an entry (and all its children) to a tree (or no * tree). Also makes sure that the tree being unassociated * no longer references the entry (or any of its children). * * - Mainly, this is a helper function for adding and removing * branches from trees. * */ static void list_entry_associate(nvListEntryPtr entry, nvListTreePtr tree) { nvListEntryPtr child; if (!entry) { return; } /* Remove references to the entry from the old tree */ if (entry->tree && (entry->tree != tree)) { /* Unselect ourself */ if (entry == entry->tree->selected_entry) { entry->tree->selected_entry = NULL; } /* Remove master entry */ if (entry == entry->tree->server_entry) { entry->tree->server_entry = NULL; } } /* Associate entry to the new tree */ entry->tree = tree; /* Associate entry's children to the new tree */ child = entry->children; while ( child ) { list_entry_associate(child, tree); child = child->next_sibling; } } /** list_entry_unparent() ******************************************** * * - Removes the given child entry from its parent. If this is the * last child to be removed, the parent's expansion button will be * removed. * */ static void list_entry_unparent(nvListEntryPtr child) { nvListEntryPtr entry; nvListEntryPtr prev; nvListEntryPtr parent; if (!child || !child->parent) { return; } /* Find the child in the parent list */ parent = child->parent; entry = parent->children; prev = parent; while (entry) { if (entry == child) { break; } prev = entry; entry = entry->next_sibling; } if (!entry) { return; /* Child not found! */ } /* Remove the child from the parent list */ if (prev == parent) { parent->children = entry->next_sibling; } else { prev->next_sibling = entry->next_sibling; } list_entry_associate(child, NULL); child->parent = NULL; /* Unpack the child from the parent's child box */ gtk_container_remove(GTK_CONTAINER(parent->child_vbox), child->vbox); /* If this was the parent's last child, remove the expansion button * and the child boxes used to hold children. */ parent->nchildren--; if (parent->nchildren == 0) { gtk_container_remove(GTK_CONTAINER(parent->vbox), parent->child_vbox); parent->child_vbox = NULL; list_entry_remove_expander_button(parent); } } /** list_entry_remove_children() ************************************* * * - Removes all children from the given list entry. This call is * recursive (children's children will also be removed) * */ static void list_entry_remove_children(nvListEntryPtr entry) { while (entry->children) { nvListEntryPtr child = entry->children; /* Remove this child's children. */ list_entry_remove_children(child); /* Unparent this child and free it */ list_entry_unparent(child); list_entry_free(child); } } /** list_entry_new_with_framelock() ********************************** * * - Creates a new list entry that will hold the given frame lock * data. * */ static nvListEntryPtr list_entry_new_with_framelock(nvFrameLockDataPtr data, nvListTreePtr tree) { nvListEntryPtr entry; GtkWidget *frame; GtkWidget *hbox; GtkWidget *vseparator; GtkWidget *padding; entry = list_entry_new(tree); if (!entry) { return NULL; } entry->data = (gpointer)(data); entry->data_type = ENTRY_DATA_FRAMELOCK; entry->ctk_event = CTK_EVENT(ctk_event_new(data->handle)); /* Pack the data's widgets into the list entry data hbox */ gtk_box_pack_start(GTK_BOX(entry->label_hbox), data->label, FALSE, FALSE, 5); frame = gtk_frame_new(NULL); hbox = gtk_hbox_new(FALSE, 5); padding = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox), 2); gtk_box_pack_end(GTK_BOX(entry->data_hbox), frame, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(frame), hbox); gtk_box_pack_start(GTK_BOX(hbox), data->receiving_hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->receiving_label, FALSE, FALSE, 0); vseparator = gtk_vseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), vseparator, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->rate_label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->rate_text, FALSE, FALSE, 0); vseparator = gtk_vseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), vseparator, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->house_hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->house_label, FALSE, FALSE, 0); vseparator = gtk_vseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), vseparator, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->port0_hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->port0_label, FALSE, FALSE, 0); vseparator = gtk_vseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), vseparator, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->port1_hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->port1_label, FALSE, FALSE, 0); /* Extra Info Section */ gtk_box_pack_start(GTK_BOX(hbox), data->extra_info_hbox, FALSE, FALSE, 0); vseparator = gtk_vseparator_new(); gtk_box_pack_start(GTK_BOX(data->extra_info_hbox), vseparator, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(data->extra_info_hbox), data->delay_label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(data->extra_info_hbox), data->delay_text, FALSE, FALSE, 0); vseparator = gtk_vseparator_new(); gtk_box_pack_start(GTK_BOX(data->extra_info_hbox), vseparator, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(data->extra_info_hbox), data->house_sync_rate_label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(data->extra_info_hbox), data->house_sync_rate_text, FALSE, FALSE, 0); vseparator = gtk_vseparator_new(); gtk_box_pack_start(GTK_BOX(data->extra_info_hbox), vseparator, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(data->extra_info_hbox), data->revision_label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(data->extra_info_hbox), data->revision_text, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), padding, FALSE, FALSE, 0); return entry; } /** list_entry_new_with_gpu() **************************************** * * - Creates a new list entry that will hold the given gpu data. * */ static nvListEntryPtr list_entry_new_with_gpu(nvGPUDataPtr data, nvListTreePtr tree) { nvListEntryPtr entry; GtkWidget *frame; GtkWidget *hbox; GtkWidget *padding; entry = list_entry_new(tree); if (!entry) { return NULL; } entry->data = (gpointer)(data); entry->data_type = ENTRY_DATA_GPU; entry->ctk_event = CTK_EVENT(ctk_event_new(data->handle)); /* Pack the data's widgets into the list entry data hbox */ gtk_box_pack_start(GTK_BOX(entry->label_hbox), data->label, FALSE, FALSE, 5); frame = gtk_frame_new(NULL); hbox = gtk_hbox_new(FALSE, 5); padding = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox), 2); gtk_box_pack_end(GTK_BOX(entry->data_hbox), frame, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(frame), hbox); gtk_box_pack_start(GTK_BOX(hbox), data->timing_hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->timing_label, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), padding, FALSE, FALSE, 0); return entry; } /** list_entry_new_with_display() ************************************ * * - Creates a new list entry that will hold the given display data. * */ static nvListEntryPtr list_entry_new_with_display(nvDisplayDataPtr data, nvListTreePtr tree) { nvListEntryPtr entry; GtkWidget *frame; GtkWidget *hbox; GtkWidget *vseparator; GtkWidget *padding; entry = list_entry_new(tree); if (!entry) { return NULL; } entry->data = (gpointer)(data); entry->data_type = ENTRY_DATA_DISPLAY; entry->ctk_event = CTK_EVENT(ctk_event_new(data->handle)); /* Pack the data's widgets into the list entry data hbox */ gtk_box_pack_start(GTK_BOX(entry->label_hbox), data->label, FALSE, FALSE, 5); frame = gtk_frame_new(NULL); hbox = gtk_hbox_new(FALSE, 5); padding = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox), 2); gtk_box_pack_end(GTK_BOX(entry->data_hbox), frame, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(frame), hbox); gtk_box_pack_start(GTK_BOX(hbox), data->stereo_hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->stereo_label, FALSE, FALSE, 0); vseparator = gtk_vseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), vseparator, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->rate_label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->rate_text, FALSE, FALSE, 0); vseparator = gtk_vseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), vseparator, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->server_checkbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->server_label, FALSE, FALSE, 0); vseparator = gtk_vseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), vseparator, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->client_checkbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), data->client_label, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), padding, FALSE, FALSE, 0); return entry; } /************************************************************************/ /* * functions relating to List Trees */ /** list_tree_new() ************************************************** * * - Creates a new list tree that will hold list entries. * */ static nvListTreePtr list_tree_new(CtkFramelock *ctk_framelock) { nvListTreePtr tree; tree = (nvListTreePtr) calloc(1, sizeof(nvListTreeRec)); if (!tree) { return NULL; } tree->vbox = gtk_vbox_new(FALSE, 0); tree->ctk_framelock = ctk_framelock; return tree; } /** list_tree_add_entry() ******************************************** * * - Adds a list entry to the tree list * */ static void list_tree_add_entry(nvListTreePtr tree, nvListEntryPtr entry) { nvListEntryPtr e; if (!tree || !entry) { return; } entry->tree = tree; entry->next_sibling = NULL; /* Add entry to the end of the list */ if (!tree->entries) { tree->entries = entry; } else { e = tree->entries; while (e->next_sibling) { e = e->next_sibling; } e->next_sibling = entry; } tree->nentries++; list_entry_associate(entry, tree); gtk_box_pack_start(GTK_BOX(tree->vbox), entry->vbox, FALSE, FALSE, 5); gtk_widget_show_all(GTK_WIDGET(entry->vbox)); } /** list_tree_remove_entry() ***************************************** * * - Removes a list entry from the tree list. * */ static void list_tree_remove_entry(nvListTreePtr tree, nvListEntryPtr entry) { nvListEntryPtr parent; if (!tree || !entry) { return; } /* Remove all children from the entry */ list_entry_remove_children(entry); /* Separate entry from its parent */ parent = entry->parent; if (parent) { /* * This is not a top-level entry so just * remove it from its parent */ list_entry_unparent(entry); } else { /* * This is a top-level entry, so remove it from * the tree. */ /* Find and remove entry from the list */ if (tree->entries == entry) { tree->entries = entry->next_sibling; } else { nvListEntryPtr e = tree->entries; while (e && e->next_sibling != entry) { e = e->next_sibling; } if (!e || e->next_sibling != entry) { return; /* Entry not found in tree! */ } e->next_sibling = entry->next_sibling; } entry->next_sibling = NULL; tree->nentries--; list_entry_associate(entry, NULL); gtk_container_remove(GTK_CONTAINER(tree->vbox), entry->vbox); } /* Get rid of the entry */ list_entry_free(entry); /* Remove parent if we were the last child */ if (parent && !parent->children) { list_tree_remove_entry(tree, parent); } } /** list_entry_setup_title() ***************************************** * * Returns the max width * */ static int list_entry_setup_title(nvListEntryPtr entry, int depth) { int max_width; int width; GtkRequisition req; if (!entry) return FALSE; /* Setup this entry's padding */ gtk_widget_set_size_request(entry->padding_hbox, depth * 25, -1); /* Calculate this entry's width */ gtk_widget_size_request(entry->title_hbox, &req); max_width = req.width; width = list_entry_setup_title(entry->children, depth +1); max_width = (width > max_width) ? width : max_width; width = list_entry_setup_title(entry->next_sibling, depth); max_width = (width > max_width) ? width : max_width; return max_width; } /** list_entry_set_title() ******************************************* * * Sets the width of the titles * */ static void list_entry_set_title(nvListEntryPtr entry, int width) { if (!entry) return; /* Set this entry's title width */ gtk_widget_set_size_request(entry->title_hbox, width, -1); list_entry_set_title(entry->children, width); list_entry_set_title(entry->next_sibling, width); } /** list_tree_align_titles() ***************************************** * * - Aligns the titles and sets up the padding of all the tree's * entries. * */ static void list_tree_align_titles(nvListTreePtr tree) { int max_width; /* Setup the left padding and calculate the max width * of the tree entries */ max_width = list_entry_setup_title(tree->entries, 0); /* Make sure all entry titles are the same width */ list_entry_set_title(tree->entries, max_width); } /** find_server_by_name() ******************************************** * * - Looks in the list tree for a list entry with a handle to a * server with the name 'server_name'. The first list entry found * with a handle to the named server is returned. * */ static nvListEntryPtr find_server_by_name(nvListTreePtr tree, gchar *server_name) { nvListEntryPtr entry; entry = tree->entries; while (entry) { gchar *name; switch (entry->data_type) { case ENTRY_DATA_FRAMELOCK: name = NvCtrlGetDisplayName (((nvFrameLockDataPtr)(entry->data))->handle); break; case ENTRY_DATA_GPU: name = NvCtrlGetDisplayName (((nvGPUDataPtr)(entry->data))->handle); break; case ENTRY_DATA_DISPLAY: name = NvCtrlGetDisplayName (((nvDisplayDataPtr)(entry->data))->handle); break; default: name = NULL; break; } if (name && !strcasecmp(server_name, name)){ free(name); return entry; } free(name); entry = entry->next_sibling; } return entry; } /** find_server_by_id() ******************************************** * * - Looks in the list tree for a framelock list entry with a target * server with an id 'server_id'. The first list entry found * with such a server id is returned. */ static nvListEntryPtr find_server_by_id(nvListTreePtr tree, int server_id) { nvListEntryPtr entry; entry = tree->entries; while (entry) { /* hold server id only in framelock entries */ if (entry->data_type == ENTRY_DATA_FRAMELOCK && ((nvFrameLockDataPtr)(entry->data))->server_id == server_id) { return entry; } entry = entry->next_sibling; } return entry; } /** get_server_id() **************************************** * * - Gets the X_SERVER_UNIQUE_ID nv-control attribute */ static gboolean get_server_id(NvCtrlAttributeHandle *handle, int *server_id) { ReturnStatus ret; ret = NvCtrlGetAttribute(handle, NV_CTRL_X_SERVER_UNIQUE_ID, server_id); if (ret != NvCtrlSuccess) { return FALSE; } return TRUE; } /**************************************************************************/ /* * Widget event and helper functions */ /** toggle_use_house_sync() ****************************************** * * Callback function for the 'use house sync' button. * This button allows access to other house sync settings. * */ static void toggle_use_house_sync(GtkWidget *widget, gpointer user_data) { CtkFramelock *ctk_framelock = CTK_FRAMELOCK(user_data); nvListEntryPtr entry; gboolean enabled; nvFrameLockDataPtr data; entry = get_framelock_server_entry((nvListTreePtr)(ctk_framelock->tree)); if (!entry) return; data = (nvFrameLockDataPtr)(entry->data); enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); NvCtrlSetAttribute(data->handle, NV_CTRL_USE_HOUSE_SYNC, enabled); update_house_sync_controls(ctk_framelock); NvCtrlGetAttribute(data->handle, NV_CTRL_USE_HOUSE_SYNC, &enabled); ctk_config_statusbar_message(ctk_framelock->ctk_config, "%s use of house sync signal.", (enabled ? "Enabled" : "Disabled")); } /** toggle_extra_info() ********************************************** * * Callback function for the 'show all info' button. * This button shows/hides extra information from the * frame lock list entries. * */ static void toggle_extra_info(GtkWidget *widget, gpointer data) { CtkFramelock *ctk_framelock = CTK_FRAMELOCK(data); gboolean enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); gtk_button_set_label(GTK_BUTTON(widget), enabled?"Hide Extra Info":"Show Extra Info"); update_framelock_controls(ctk_framelock); update_framelock_status(ctk_framelock); ctk_config_statusbar_message(ctk_framelock->ctk_config, "%s extra information.", (enabled ? "Showing" : "Hiding")); } /** update_expand_all_button_status() ************************ * * This function updates the state of expand all button based * on entries in the device list tree & user interaction. */ static void update_expand_all_button_status(CtkFramelock *ctk_framelock) { nvListTreePtr tree = (nvListTreePtr) ctk_framelock->tree; nvListEntryPtr entry, child; if (!tree) { return; } /* * This is set between !tree & !tree->entries checks because, we will * have to disable "Expand All" button in case there are no entries in the * tree, before we return from here because of NULL tree->entries value. */ gtk_widget_set_sensitive(ctk_framelock->expand_all_button, tree->nentries); if (!tree->entries) { return; } ctk_framelock->is_expanded = TRUE; for (entry = tree->entries; entry && ctk_framelock->is_expanded; entry = entry->next_sibling) { /* if any top-level entry is not expanded, then advertise "Expand All" */ if (!entry->expanded) { ctk_framelock->is_expanded = FALSE; break; } /* if any child entry is not expanded, then advertise "Expand All" */ child = entry->children; while (child) { if (!child->expanded) { ctk_framelock->is_expanded = FALSE; break; } child = child->next_sibling; } } /* based on the status of the entries, advertise "Expand/Collapse All" */ if (ctk_framelock->is_expanded) { gtk_button_set_label(GTK_BUTTON(ctk_framelock->expand_all_button), "Collapse All"); } else { gtk_button_set_label(GTK_BUTTON(ctk_framelock->expand_all_button), "Expand All"); } } /** list_entry_expand_collapse() ********************************************** * * This function expands/collapses the entry & all the corresponding * child entries. */ static void list_entry_expand_collapse(nvListEntryPtr entry, gboolean expand) { if (!entry || !entry->expander_button || !entry->child_vbox) { return; } gtk_container_remove(GTK_CONTAINER(entry->expander_button), entry->expander_button_image); if (expand) { /* Expand */ entry->expander_button_image = gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_SMALL_TOOLBAR); } else { /* Collapse */ entry->expander_button_image = gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_SMALL_TOOLBAR); } gtk_widget_set_size_request(entry->expander_button, 20, 20); gtk_container_add(GTK_CONTAINER(entry->expander_button), entry->expander_button_image); gtk_widget_show_all(entry->expander_button); if (expand) { /* Expand */ gtk_widget_show(entry->child_vbox); entry->expanded = TRUE; } else { /* Collapse */ gtk_widget_hide(entry->child_vbox); entry->expanded = FALSE; } list_entry_expand_collapse(entry->children, expand); list_entry_expand_collapse(entry->next_sibling, expand); } /** expand_all_clicked() ********************************************** * * Callback function for the 'Expand/Collapse All' button. * This button expands/collapses framelock list entries. */ static void expand_all_clicked(GtkWidget *widget, gpointer data) { CtkFramelock *ctk_framelock = CTK_FRAMELOCK(data); nvListTreePtr tree = (nvListTreePtr) ctk_framelock->tree; if (!tree->entries && !tree->nentries) { return; } /* expand or collapse all the entries */ list_entry_expand_collapse(tree->entries, !ctk_framelock->is_expanded); /* update the expand_all button status */ update_expand_all_button_status(ctk_framelock); } /** toggle_server() ************************************************** * * Callback function when a user toggles the 'server' checkbox of * a display device. * */ static void toggle_server(GtkWidget *widget, gpointer data) { nvListEntryPtr display_entry = (nvListEntryPtr)data; nvDisplayDataPtr display_data; nvGPUDataPtr gpu_data; nvListTreePtr tree; CtkFramelock *ctk_framelock; gboolean server_checked; if (display_entry->data_type != ENTRY_DATA_DISPLAY) { return; } display_data = (nvDisplayDataPtr)(display_entry->data); gpu_data = (nvGPUDataPtr)(display_entry->parent->data); tree = (nvListTreePtr)(display_entry->tree); ctk_framelock = tree->ctk_framelock; /* Make sure FrameLock is disabled on the GPU */ NvCtrlSetAttribute(gpu_data->handle, NV_CTRL_FRAMELOCK_SYNC, NV_CTRL_FRAMELOCK_SYNC_DISABLE); gpu_data->enabled = FALSE; ctk_framelock->framelock_enabled = any_gpu_enabled(tree->entries); server_checked = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(display_data->server_checkbox)); /* * If the device is selected as server, uncheck the client box for * that device & also uncheck server box for any other device if * it was selected as server before. */ if (server_checked) { nvDisplayDataPtr server_data = get_display_server_data(display_entry->tree); if (server_data && (server_data != display_data)) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(server_data->server_checkbox), FALSE); } tree->server_entry = display_entry; gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(display_data->client_checkbox), FALSE); NvCtrlSetAttribute(display_data->handle, NV_CTRL_FRAMELOCK_DISPLAY_CONFIG, NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_SERVER); } else { if (tree->server_entry == display_entry) { tree->server_entry = NULL; } NvCtrlSetAttribute(display_data->handle, NV_CTRL_FRAMELOCK_DISPLAY_CONFIG, NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_DISABLED); } /* Update GUI state */ update_framelock_controls(ctk_framelock); ctk_config_statusbar_message(ctk_framelock->ctk_config, "%s frame lock server device.", (server_checked ? "Selected" : "Unselected")); } /** toggle_client() ************************************************** * * Callback function when a user toggles the 'client' checkbox of * a display device. * */ static void toggle_client(GtkWidget *widget, gpointer data) { nvListEntryPtr display_entry = (nvListEntryPtr)data; nvDisplayDataPtr display_data; nvGPUDataPtr gpu_data; nvListTreePtr tree; CtkFramelock *ctk_framelock; gboolean client_checked; if (display_entry->data_type != ENTRY_DATA_DISPLAY) { return; } display_data = (nvDisplayDataPtr)(display_entry->data); gpu_data = (nvGPUDataPtr)(display_entry->parent->data); tree = (nvListTreePtr)(display_entry->tree); ctk_framelock = tree->ctk_framelock; /* Make sure FrameLock is disabled on the GPU */ NvCtrlSetAttribute(gpu_data->handle, NV_CTRL_FRAMELOCK_SYNC, NV_CTRL_FRAMELOCK_SYNC_DISABLE); gpu_data->enabled = FALSE; ctk_framelock->framelock_enabled = any_gpu_enabled(tree->entries); client_checked = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(display_data->client_checkbox)); /* * if the device is selected as client, uncheck the server box * for the same. */ if (client_checked) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(display_data->server_checkbox), FALSE); NvCtrlSetAttribute(display_data->handle, NV_CTRL_FRAMELOCK_DISPLAY_CONFIG, NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_CLIENT); } else { NvCtrlSetAttribute(display_data->handle, NV_CTRL_FRAMELOCK_DISPLAY_CONFIG, NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_DISABLED); } /* Update GUI state */ update_framelock_controls(ctk_framelock); ctk_config_statusbar_message(ctk_framelock->ctk_config, "%s frame lock client device.", (client_checked ? "Selected" : "Unselected")); } /** set_enable_sync_server() ***************************************** * * Function to enable/disable frame lock sync on the server gpu * device. * * This function returns TRUE if something was enabled. * */ static gboolean set_enable_sync_server(nvListTreePtr tree, gboolean enable) { nvListEntryPtr entry = get_gpu_server_entry(tree); nvGPUDataPtr data; ReturnStatus ret; if (!entry) return FALSE; data = (nvGPUDataPtr)(entry->data); ret = NvCtrlSetAttribute(data->handle, NV_CTRL_FRAMELOCK_SYNC, enable); if (ret != NvCtrlSuccess) return FALSE; ret = NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_SYNC, &enable); if (ret != NvCtrlSuccess) return FALSE; data->enabled = enable; return enable; } /** set_enable_sync_client() ***************************************** * * Function to enable/disable frame lock sync on a client gpu device. * * This function returns TRUE if something was enabled. * */ static gboolean set_enable_sync_clients(nvListEntryPtr entry_list, gboolean enable) { nvListEntryPtr entry; nvListEntryPtr server_gpu_entry; gboolean framelock_enabled = FALSE; gboolean something_enabled = FALSE; ReturnStatus ret; if (!entry_list) return FALSE; /* Get the server GPU entry */ server_gpu_entry = get_gpu_server_entry(entry_list->tree); /* Go through all entries and activate/disable all entries that * aren't the server. */ for (entry = entry_list; entry; entry = entry->next_sibling) { nvGPUDataPtr data; if (entry->children) { something_enabled = set_enable_sync_clients(entry->children, enable); framelock_enabled = (framelock_enabled || something_enabled); } if (entry == server_gpu_entry || entry->data_type != ENTRY_DATA_GPU) { continue; } data = (nvGPUDataPtr)(entry->data); /* Only send protocol if there is something to enable */ if (!has_client_selected(entry)) continue; ret = NvCtrlSetAttribute(data->handle, NV_CTRL_FRAMELOCK_SYNC, enable); if (ret != NvCtrlSuccess) continue; /* Verify state w/ the server */ ret = NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_SYNC, &(something_enabled)); if (ret != NvCtrlSuccess) continue; data->enabled = something_enabled; framelock_enabled = (framelock_enabled || something_enabled); } return framelock_enabled; } /** update_enable_confirm_text() ************************************* * * Generates the text used in the confirmation dialog. * **/ static void update_enable_confirm_text(CtkFramelock *ctk_framelock) { gchar *str; str = g_strdup_printf("Frame Lock has been enabled but no server\n" "device was selected. Would you like to keep\n" "Frame Lock enabled on the selected devices?\n" "\n" "Disabling Frame Lock in %d seconds...", ctk_framelock->enable_confirm_countdown); gtk_label_set_text(GTK_LABEL(ctk_framelock->enable_confirm_text), str); g_free(str); } /** do_enable_confirm_countdown() ************************************ * * Timeout callback for reverting enabling of Frame Lock. * **/ static gboolean do_enable_confirm_countdown(gpointer *user_data) { CtkFramelock *ctk_framelock = (CtkFramelock *) user_data; ctk_framelock->enable_confirm_countdown--; if (ctk_framelock->enable_confirm_countdown > 0) { update_enable_confirm_text(ctk_framelock); return True; } /* Force dialog to cancel */ gtk_dialog_response(GTK_DIALOG(ctk_framelock->enable_confirm_dialog), GTK_RESPONSE_REJECT); return False; } /** confirm_serverless_framelock() *********************************** * * Confirms with the user that Frame Lock has been enabled properly * in the case where no server was found in the configuration. * */ static Bool confirm_serverless_framelock(CtkFramelock *ctk_framelock) { gint result; /* Start the countdown timer */ ctk_framelock->enable_confirm_countdown = DEFAULT_ENABLE_CONFIRM_TIMEOUT; update_enable_confirm_text(ctk_framelock); ctk_framelock->enable_confirm_timer = g_timeout_add(1000, (GSourceFunc)do_enable_confirm_countdown, (gpointer)(ctk_framelock)); /* Show the confirm dialog */ gtk_window_set_transient_for (GTK_WINDOW(ctk_framelock->enable_confirm_dialog), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(ctk_framelock)))); gtk_widget_show_all(ctk_framelock->enable_confirm_dialog); gtk_widget_grab_focus(ctk_framelock->enable_confirm_cancel_button); result = gtk_dialog_run(GTK_DIALOG(ctk_framelock->enable_confirm_dialog)); gtk_widget_hide(ctk_framelock->enable_confirm_dialog); /* Kill the timer */ g_source_remove(ctk_framelock->enable_confirm_timer); return (result == GTK_RESPONSE_ACCEPT); } /** toggle_sync_enable() ********************************************* * * Callback function when a user toggles the 'Enable Frame Lock' * button. * */ static void toggle_sync_enable(GtkWidget *button, gpointer data) { CtkFramelock *ctk_framelock = (CtkFramelock *) data; guint val; gboolean enabled; gboolean something_enabled; gboolean framelock_enabled = FALSE; gboolean server_enabled = FALSE; nvListTreePtr tree = (nvListTreePtr) ctk_framelock->tree; nvListEntryPtr entry; enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); if (enabled) val = NV_CTRL_FRAMELOCK_SYNC_ENABLE; else val = NV_CTRL_FRAMELOCK_SYNC_DISABLE; /* If we are enabling frame lock, enable the master first */ if (enabled) { something_enabled = set_enable_sync_server(tree, val); framelock_enabled = (framelock_enabled || something_enabled); server_enabled = something_enabled; } /* Enable/Disable slaves */ something_enabled = set_enable_sync_clients(tree->entries, val); framelock_enabled = (framelock_enabled || something_enabled); /* If we are disabling frame lock, disable the master last */ if (!enabled) { something_enabled = set_enable_sync_server(tree, val); framelock_enabled = (framelock_enabled || something_enabled); } /* * toggle the TEST_SIGNAL, to guarantee accuracy of the universal * frame count (as returned by the glXQueryFrameCountNV() function * in the GLX_NV_swap_group extension) */ entry = get_gpu_server_entry(tree); if (enabled && entry && framelock_enabled) { nvGPUDataPtr data = (nvGPUDataPtr)(entry->data); NvCtrlSetAttribute(data->handle, NV_CTRL_FRAMELOCK_TEST_SIGNAL, NV_CTRL_FRAMELOCK_TEST_SIGNAL_ENABLE); NvCtrlSetAttribute(data->handle, NV_CTRL_FRAMELOCK_TEST_SIGNAL, NV_CTRL_FRAMELOCK_TEST_SIGNAL_DISABLE); } /* If frame lock was enabled but there was no server * specified, we should confirm with the user that * all is well since this may result in losing signal * on the client devices. */ if (framelock_enabled && !server_enabled) { /* If confirmation fails, disable frame lock */ if (!confirm_serverless_framelock(ctk_framelock)) { set_enable_sync_clients(tree->entries, NV_CTRL_FRAMELOCK_SYNC_DISABLE); set_enable_sync_server(tree, NV_CTRL_FRAMELOCK_SYNC_DISABLE); framelock_enabled = FALSE; } } ctk_framelock->framelock_enabled = framelock_enabled; update_framelock_controls(ctk_framelock); update_framelock_status(ctk_framelock); ctk_config_statusbar_message(ctk_framelock->ctk_config, "Frame Lock %s.", (enabled ? "enabled" : "disabled")); } /** test_link_done() ************************************************* * * Callback function for the frame lock test signal functionality. * This function is called once the test signal has finished. * */ static gint test_link_done(gpointer data) { CtkFramelock *ctk_framelock; nvListEntryPtr entry; ctk_framelock = CTK_FRAMELOCK(data); entry = get_gpu_server_entry((nvListTreePtr)ctk_framelock->tree); if (!entry) return FALSE; /* Test signal already disabled? */ if (!ctk_framelock->test_link_enabled) return FALSE; /* Disable the test signal */ ctk_framelock->test_link_enabled = FALSE; NvCtrlSetAttribute(((nvGPUDataPtr)(entry->data))->handle, NV_CTRL_FRAMELOCK_TEST_SIGNAL, NV_CTRL_FRAMELOCK_TEST_SIGNAL_DISABLE); gtk_grab_remove(ctk_framelock->test_link_button); gdk_window_set_cursor((GTK_WIDGET(ctk_framelock->parent_window))->window, NULL); /* un-press the test link button */ g_signal_handlers_block_by_func (G_OBJECT(ctk_framelock->test_link_button), G_CALLBACK(toggle_test_link), (gpointer) ctk_framelock); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_framelock->test_link_button), FALSE); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_framelock->test_link_button), G_CALLBACK(toggle_test_link), (gpointer) ctk_framelock); ctk_config_statusbar_message(ctk_framelock->ctk_config, "Test link complete."); return FALSE; } /** toggle_test_link() *********************************************** * * Callback function for the 'test link' button. This button * activates the frame lock test signal. * */ static void toggle_test_link(GtkWidget *button, gpointer data) { CtkFramelock *ctk_framelock; gboolean enabled = FALSE; nvListEntryPtr entry; ctk_framelock = CTK_FRAMELOCK(data); if (!ctk_framelock->framelock_enabled) goto fail; /* User cancels the test signal */ if (ctk_framelock->test_link_enabled) { test_link_done(ctk_framelock); return; } enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(ctk_framelock->test_link_button)); if (!enabled) goto fail; entry = get_gpu_server_entry((nvListTreePtr)ctk_framelock->tree); if (!entry) { enabled = FALSE; goto fail; } /* enable the test signal */ ctk_framelock->test_link_enabled = TRUE; gdk_window_set_cursor ((GTK_WIDGET(ctk_framelock->parent_window))->window, ctk_framelock->wait_cursor); gtk_grab_add(button); NvCtrlSetAttribute(((nvGPUDataPtr)(entry->data))->handle, NV_CTRL_FRAMELOCK_TEST_SIGNAL, NV_CTRL_FRAMELOCK_TEST_SIGNAL_ENABLE); ctk_config_statusbar_message(ctk_framelock->ctk_config, "Test link started."); /* register the "done" function */ g_timeout_add(DEFAULT_TEST_LINK_TIME_INTERVAL, test_link_done, (gpointer) ctk_framelock); return; fail: /* Reset the button */ g_signal_handlers_block_by_func(G_OBJECT(ctk_framelock->test_link_button), G_CALLBACK(toggle_test_link), (gpointer) ctk_framelock); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_framelock->test_link_button), enabled); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_framelock->test_link_button), G_CALLBACK(toggle_test_link), (gpointer) ctk_framelock); } /** sync_interval_changed() ***************************************** * * Callback function for when the user changes the house sync * interval. * */ static void sync_interval_changed(GtkRange *range, gpointer user_data) { CtkFramelock *ctk_framelock = (CtkFramelock *)user_data; nvListTreePtr tree = (nvListTreePtr)(ctk_framelock->tree); nvListEntryPtr entry = get_framelock_server_entry(tree); nvFrameLockDataPtr data = NULL; gint interval = gtk_range_get_value(range); if (!entry) { return; } data = (nvFrameLockDataPtr)(entry->data); NvCtrlSetAttribute(data->handle, NV_CTRL_FRAMELOCK_SYNC_INTERVAL, interval); } /* * format_sync_interval() - callback for the "format-value" signal from * the sync interval scale; return a string describing the current value of the * scale. */ static gchar *format_sync_interval(GtkScale *scale, gdouble arg1, gpointer user_data) { gint val = (gint)arg1; return g_strdup_printf("%d", val); } /** changed_sync_edge() ********************************************** * * Callback function for when the user changes a frame lock device's * sync edge. * */ static void changed_sync_edge(GtkEditable *editable, gpointer user_data) { CtkFramelock *ctk_framelock = (CtkFramelock *)user_data; nvListTreePtr tree = (nvListTreePtr)(ctk_framelock->tree); nvListEntryPtr entry = get_framelock_server_entry(tree); nvFrameLockDataPtr data; const gchar *str = gtk_entry_get_text(GTK_ENTRY(editable)); gint edge; if (!entry || !str) return; data = (nvFrameLockDataPtr) entry->data; for (edge = NV_CTRL_FRAMELOCK_POLARITY_RISING_EDGE; edge <= NV_CTRL_FRAMELOCK_POLARITY_BOTH_EDGES; edge++) { if (strcmp(syncEdgeStrings[edge], str) == 0) { NvCtrlSetAttribute(data->handle, NV_CTRL_FRAMELOCK_POLARITY, edge); return; } } } /** changed_video_mode() ********************************************* * * Callback function for when the user changes the house sync video * mode. * */ static void changed_video_mode(GtkEditable *editable, gpointer user_data) { CtkFramelock *ctk_framelock = (CtkFramelock *)user_data; nvListTreePtr tree = (nvListTreePtr)(ctk_framelock->tree); nvListEntryPtr entry = get_framelock_server_entry(tree); nvFrameLockDataPtr data; const gchar *str = gtk_entry_get_text(GTK_ENTRY(editable)); gint mode; if (!entry || !str) return; data = (nvFrameLockDataPtr) entry->data; for (mode = NV_CTRL_FRAMELOCK_VIDEO_MODE_NONE; mode <= NV_CTRL_FRAMELOCK_VIDEO_MODE_HDTV; mode++) { if (strcmp(houseFormatStrings[mode], str) == 0) { NvCtrlSetAttribute(data->handle, NV_CTRL_FRAMELOCK_VIDEO_MODE, mode); return; } } } /** detect_video_mode_time() ***************************************** * * Callback function called every time the video mode detection * timer goes off. * * see toggle_detect_video_mode() for details. * */ static gboolean detect_video_mode_timer(gpointer user_data) { CtkFramelock *ctk_framelock = CTK_FRAMELOCK(user_data); nvListTreePtr tree = (nvListTreePtr)(ctk_framelock->tree); nvListEntryPtr entry = get_framelock_server_entry(tree); nvFrameLockDataPtr data; gint house; /* Master gone... oops */ if (!entry) { goto done; } /* check if we now have house sync */ data = (nvFrameLockDataPtr)(entry->data); NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_HOUSE_STATUS, &house); if (house) { /* * We found house sync; use the current_detect_format */ update_house_sync_controls(ctk_framelock); ctk_config_statusbar_message (ctk_framelock->ctk_config, "House sync format detected as %s.", houseFormatStrings[ctk_framelock->current_detect_format]); goto done; } /* * we did not find house sync, yet, so move to the next format */ switch (ctk_framelock->current_detect_format) { case NV_CTRL_FRAMELOCK_VIDEO_MODE_COMPOSITE_AUTO: ctk_framelock->current_detect_format = NV_CTRL_FRAMELOCK_VIDEO_MODE_COMPOSITE_BI_LEVEL; break; case NV_CTRL_FRAMELOCK_VIDEO_MODE_COMPOSITE_BI_LEVEL: ctk_framelock->current_detect_format = NV_CTRL_FRAMELOCK_VIDEO_MODE_COMPOSITE_TRI_LEVEL; break; case NV_CTRL_FRAMELOCK_VIDEO_MODE_COMPOSITE_TRI_LEVEL: ctk_framelock->current_detect_format = NV_CTRL_FRAMELOCK_VIDEO_MODE_TTL; break; case NV_CTRL_FRAMELOCK_VIDEO_MODE_TTL: ctk_framelock->current_detect_format = NV_CTRL_FRAMELOCK_VIDEO_MODE_COMPOSITE_AUTO; ctk_config_statusbar_message(ctk_framelock->ctk_config, "Unable to detect house sync format."); goto done; break; } /* * Set the new video format */ NvCtrlSetAttribute(data->handle, NV_CTRL_FRAMELOCK_VIDEO_MODE, ctk_framelock->current_detect_format); return TRUE; done: /* untoggle the detect button */ g_signal_handlers_block_by_func (G_OBJECT(ctk_framelock->video_mode_detect), G_CALLBACK(toggle_detect_video_mode), (gpointer) ctk_framelock); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_framelock->video_mode_detect), FALSE); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_framelock->video_mode_detect), G_CALLBACK(toggle_detect_video_mode), (gpointer) ctk_framelock); return FALSE; } /** toggle_detect_video_mode() *************************************** * * Callback function for when the user clicks on the 'Detect' (video * mode) button. * * House Sync autodetection scheme: a modal push button is used to * request auto detection. When the button is pressed, we program the * first format type and then start a timer. * * From the timer, we check if we are getting a house sync; if we are, * then update the settings and unpress the button. If we are not, * program the next format in the sequence and try again. * * XXX what happens if the master gets changed while we are doing * this? * */ static void toggle_detect_video_mode(GtkToggleButton *button, gpointer user_data) { CtkFramelock *ctk_framelock = CTK_FRAMELOCK(user_data); nvListTreePtr tree = (nvListTreePtr)(ctk_framelock->tree); nvListEntryPtr entry = get_framelock_server_entry(tree); nvFrameLockDataPtr data; if (!gtk_toggle_button_get_active(button)) { g_source_remove(ctk_framelock->video_mode_detect_timer); ctk_framelock->video_mode_detect_timer = 0; ctk_config_statusbar_message(ctk_framelock->ctk_config, "Aborted house sync detection."); return; } if (!entry) return; data = (nvFrameLockDataPtr)(entry->data); ctk_framelock->current_detect_format = NV_CTRL_FRAMELOCK_VIDEO_MODE_COMPOSITE_AUTO; NvCtrlSetAttribute(data->handle, NV_CTRL_FRAMELOCK_VIDEO_MODE, ctk_framelock->current_detect_format); ctk_framelock->video_mode_detect_timer = g_timeout_add(500, detect_video_mode_timer, user_data); ctk_config_statusbar_message(ctk_framelock->ctk_config, "Attempting to detect house sync..."); } /** list_entry_update_framelock_status() ***************************** * * Updates the dynamic state of the GUI for a frame lock list entry by * querying the current state of the X Server. * */ static void list_entry_update_framelock_status(CtkFramelock *ctk_framelock, nvListEntryPtr entry) { nvFrameLockDataPtr data = (nvFrameLockDataPtr)(entry->data); gint rate, delay, house, port0, port1; gchar str[32]; gfloat fvalue; nvListTreePtr tree = (nvListTreePtr)(ctk_framelock->tree); nvListEntryPtr server_entry = get_framelock_server_entry(tree); gboolean use_house_sync; gboolean framelock_enabled; gboolean is_server; ReturnStatus ret; NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_SYNC_DELAY, &delay); NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_HOUSE_STATUS, &house); NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_PORT0_STATUS, &port0); NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_PORT1_STATUS, &port1); use_house_sync = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(ctk_framelock->use_house_sync)); framelock_enabled = ctk_framelock->framelock_enabled; is_server = (server_entry && (server_entry->data == data)); /* Receiving Sync */ if (!framelock_enabled || (is_server && !use_house_sync)) { gtk_widget_set_sensitive(data->receiving_label, FALSE); update_image(data->receiving_hbox, ctk_framelock->led_grey_pixbuf); } else { gint receiving; NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_SYNC_READY, &receiving); gtk_widget_set_sensitive(data->receiving_label, TRUE); update_image(data->receiving_hbox, (receiving ? ctk_framelock->led_green_pixbuf : ctk_framelock->led_red_pixbuf)); } /* Sync Rate */ gtk_widget_set_sensitive(data->rate_label, framelock_enabled); gtk_widget_set_sensitive(data->rate_text, framelock_enabled); ret = NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_SYNC_RATE_4, &rate); if (ret == NvCtrlSuccess) { snprintf(str, 32, "%d.%.4d Hz", (rate / 10000), (rate % 10000)); } else { NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_SYNC_RATE, &rate); snprintf(str, 32, "%d.%.3d Hz", (rate / 1000), (rate % 1000)); } gtk_label_set_text(GTK_LABEL(data->rate_text), str); /* Sync Delay (Skew) */ gtk_widget_set_sensitive(data->delay_label, framelock_enabled); gtk_widget_set_sensitive(data->delay_text, framelock_enabled); fvalue = ((gfloat) delay) * ((gfloat) data->sync_delay_resolution) / 1000.0; snprintf(str, 32, "%.2f uS", fvalue); // 10.2f gtk_label_set_text(GTK_LABEL(data->delay_text), str); /* Incoming signal rate */ gtk_widget_set_sensitive(data->house_sync_rate_label, framelock_enabled); gtk_widget_set_sensitive(data->house_sync_rate_text, framelock_enabled); ret = NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_INCOMING_HOUSE_SYNC_RATE, &rate); if (ret == NvCtrlSuccess) { snprintf(str, 32, "%d.%.4d Hz", (rate / 10000), (rate % 10000)); } else { snprintf(str, 32, "Unknown"); } gtk_label_set_text(GTK_LABEL(data->house_sync_rate_text), str); /* House Sync and Ports are always active */ update_image(data->house_hbox, (house ? ctk_framelock->led_green_pixbuf : ctk_framelock->led_red_pixbuf)); if ( !data->port0_ethernet_error ) { update_image(data->port0_hbox, ((port0==NV_CTRL_FRAMELOCK_PORT0_STATUS_INPUT) ? ctk_framelock->rj45_input_pixbuf : ctk_framelock->rj45_output_pixbuf)); } else { update_image(data->port0_hbox, ctk_framelock->rj45_unused_pixbuf); } if ( !data->port1_ethernet_error ) { update_image(data->port1_hbox, ((port1==NV_CTRL_FRAMELOCK_PORT0_STATUS_INPUT) ? ctk_framelock->rj45_input_pixbuf : ctk_framelock->rj45_output_pixbuf)); } else { update_image(data->port1_hbox, ctk_framelock->rj45_unused_pixbuf); } } /** list_entry_update_gpu_status() *********************************** * * Updates the dynamic state of the GUI for a gpu list entry by * querying the current state of the X Server. * */ static void list_entry_update_gpu_status(CtkFramelock *ctk_framelock, nvListEntryPtr entry) { nvGPUDataPtr data = (nvGPUDataPtr)(entry->data); gboolean framelock_enabled; gboolean has_server; gboolean has_client; gboolean use_house_sync; gint house = 0; framelock_enabled = ctk_framelock->framelock_enabled; use_house_sync = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(ctk_framelock->use_house_sync)); if (entry->parent && entry->parent->data) { nvFrameLockDataPtr framelock_data = (nvFrameLockDataPtr)(entry->parent->data); NvCtrlGetAttribute(framelock_data->handle, NV_CTRL_FRAMELOCK_HOUSE_STATUS, &house); } has_client = has_client_selected(entry); has_server = has_server_selected(entry); /* Update the Timing LED: * * We should disable the GPU Timing LED (which reports the sync status * between the GPU and the Quadro Sync device) when we don't care if the * GPU is in sync with the Quadro Sync device. This occurs when Frame Lock * is disabled, or when there are no devices selected for the GPU, or * in cases where the GPU is driving the sync signal to the Quadro Sync * device. */ if (!framelock_enabled || // Frame Lock is disabled. (!has_server && !has_client) || // No devices selected on GPU. (has_server && !use_house_sync) || // GPU always drives sync. (has_server && !house)) { // No house so GPU drives sync. gtk_widget_set_sensitive(data->timing_label, FALSE); update_image(data->timing_hbox, ctk_framelock->led_grey_pixbuf); } else { gint timing; NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_TIMING, &timing); gtk_widget_set_sensitive(data->timing_label, TRUE); update_image(data->timing_hbox, (timing ? ctk_framelock->led_green_pixbuf : ctk_framelock->led_red_pixbuf)); } } /** list_entry_update_display_status() ******************************* * * Updates the dynamic state of the GUI for a display list entry by * querying the current state of the X Server. * */ static void list_entry_update_display_status(CtkFramelock *ctk_framelock, nvListEntryPtr entry) { nvDisplayDataPtr data = (nvDisplayDataPtr)(entry->data); gboolean framelock_enabled; gboolean is_server; gboolean is_client; gboolean gpu_is_server; gboolean use_house_sync; nvListTreePtr tree = (nvListTreePtr)(ctk_framelock->tree); nvListEntryPtr gpu_server_entry = get_gpu_server_entry(tree); framelock_enabled = ctk_framelock->framelock_enabled; use_house_sync = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(ctk_framelock->use_house_sync)); is_server = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data->server_checkbox)); is_client = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(data->client_checkbox)); gpu_is_server = (gpu_server_entry && (gpu_server_entry == entry->parent)); /* Check Stereo Sync. If frame lock is disabled or this display device * is neither a client/server or the display device is a server and the * GPU driving it is not using the house sync signal, gray out the LED. */ if (!framelock_enabled || (!is_server && !is_client) || (is_server && gpu_is_server && !use_house_sync)) { gtk_widget_set_sensitive(data->stereo_label, FALSE); update_image(data->stereo_hbox, ctk_framelock->led_grey_pixbuf); } else { /* If the display's GPU is not receiving timing, activate the * stereo label but make sure to gray out the LED. */ gtk_widget_set_sensitive(data->stereo_label, TRUE); if (entry->parent) { GdkPixbuf *pixbuf = ctk_framelock->led_grey_pixbuf; nvGPUDataPtr gpu_data = (nvGPUDataPtr)(entry->parent->data); ReturnStatus ret; int val; ret = NvCtrlGetAttribute(gpu_data->handle, NV_CTRL_FRAMELOCK_TIMING, &val); if ((ret == NvCtrlSuccess) && (val == NV_CTRL_FRAMELOCK_TIMING_TRUE)) { ret = NvCtrlGetAttribute(gpu_data->handle, NV_CTRL_FRAMELOCK_STEREO_SYNC, &val); if (ret == NvCtrlSuccess) { pixbuf = (val == NV_CTRL_FRAMELOCK_STEREO_SYNC_TRUE) ? ctk_framelock->led_green_pixbuf : ctk_framelock->led_red_pixbuf; } } update_image(data->stereo_hbox, pixbuf); } } } /** list_entry_update_status() *************************************** * * Updates the (GUI) state of a list entry, its children and siblings * by querying the X Server. * */ static void list_entry_update_status(CtkFramelock *ctk_framelock, nvListEntryPtr entry) { if (!entry) return; list_entry_update_status(ctk_framelock, entry->children); switch (entry->data_type) { case ENTRY_DATA_FRAMELOCK: list_entry_update_framelock_status(ctk_framelock, entry); break; case ENTRY_DATA_GPU: list_entry_update_gpu_status(ctk_framelock, entry); break; case ENTRY_DATA_DISPLAY: list_entry_update_display_status(ctk_framelock, entry); break; } list_entry_update_status(ctk_framelock, entry->next_sibling); } /** update_framelock_status() **************************************** * * Updates the (GUI) state of all the frame lock list entries status * fields by querying the X Server. * */ static gboolean update_framelock_status(gpointer user_data) { CtkFramelock *ctk_framelock = CTK_FRAMELOCK(user_data); list_entry_update_status(ctk_framelock, ((nvListTreePtr)(ctk_framelock->tree))->entries); return TRUE; } /** check_for_ethernet() ********************************************* * * Queries Ethernet status for all frame lock devices and reports * on any error. * * XXX This assumes that the frame lock (Quadro Sync) devices are * top-level list entries, such that they are all siblings. * */ static gboolean check_for_ethernet(gpointer user_data) { CtkFramelock *ctk_framelock = CTK_FRAMELOCK(user_data); static gboolean first_error = TRUE; nvListEntryPtr entry; nvFrameLockDataPtr error_data = NULL; /* Look through the framelock entries and check the * Ethernet status on each one */ entry = ((nvListTreePtr)(ctk_framelock->tree))->entries; while (entry) { if (entry->data_type == ENTRY_DATA_FRAMELOCK) { nvFrameLockDataPtr data = (nvFrameLockDataPtr)(entry->data); gint val; NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_ETHERNET_DETECTED, &val); if (val & NV_CTRL_FRAMELOCK_ETHERNET_DETECTED_PORT0) { data->port0_ethernet_error = TRUE; error_data = data; } else { data->port0_ethernet_error = 0; } if (val & NV_CTRL_FRAMELOCK_ETHERNET_DETECTED_PORT1) { data->port1_ethernet_error = TRUE; error_data = data; } else { data->port1_ethernet_error = 0; } } entry = entry->next_sibling; } if (error_data) { if (first_error) { error_msg(ctk_framelock, "Frame Lock RJ45 error\n\n" "Either an Ethernet LAN cable is connected to the " "frame lock board on X Server '%s' or the linked " "PC is not turned on. Either disconnect the LAN " "cable or turn on the linked PC for proper " "operation.", NvCtrlGetDisplayName(error_data->handle) ); } first_error = FALSE; } else { first_error = TRUE; } return TRUE; } /** update_house_sync_controls() ************************************* * * Queries the X Server for house sync status information for the * currently selected frame lock server and updates the GUI. * */ static void update_house_sync_controls(CtkFramelock *ctk_framelock) { nvListEntryPtr entry; gboolean enabled; gboolean use_house; ReturnStatus ret; nvFrameLockDataPtr data; entry = get_framelock_server_entry((nvListTreePtr)(ctk_framelock->tree)); /* No server selected, can't set house sync settings */ if (!entry) { gtk_widget_set_sensitive(ctk_framelock->use_house_sync, FALSE); gtk_widget_set_sensitive(ctk_framelock->house_sync_frame, FALSE); return; } /* Get the current use house sync state from the X Server */ data = (nvFrameLockDataPtr)(entry->data); ret = NvCtrlGetAttribute(data->handle, NV_CTRL_USE_HOUSE_SYNC, &use_house); if (ret != NvCtrlSuccess) { use_house = TRUE; /* Can't toggle, attribute always on. */ } gtk_widget_set_sensitive(ctk_framelock->use_house_sync, (ret == NvCtrlSuccess)); g_signal_handlers_block_by_func (G_OBJECT(ctk_framelock->use_house_sync), G_CALLBACK(toggle_use_house_sync), (gpointer) ctk_framelock); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_framelock->use_house_sync), use_house); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_framelock->use_house_sync), G_CALLBACK(toggle_use_house_sync), (gpointer) ctk_framelock); enabled = ctk_framelock->framelock_enabled; gtk_widget_set_sensitive(ctk_framelock->house_sync_frame, !enabled); if (enabled || !use_house) { gtk_widget_set_sensitive(ctk_framelock->house_sync_vbox, FALSE); } else { gint sync_interval; gint sync_edge; gint house_format; nvFrameLockDataPtr data; gtk_widget_set_sensitive(ctk_framelock->house_sync_vbox, TRUE); data = (nvFrameLockDataPtr)(entry->data); /* Query current house sync settings from master frame lock device */ NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_SYNC_INTERVAL, &sync_interval); NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_POLARITY, &sync_edge); NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_VIDEO_MODE, &house_format); /* Update GUI to reflect server settings */ g_signal_handlers_block_by_func (G_OBJECT(ctk_framelock->sync_interval_scale), G_CALLBACK(sync_interval_changed), (gpointer) ctk_framelock); gtk_range_set_value(GTK_RANGE(ctk_framelock->sync_interval_scale), sync_interval); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_framelock->sync_interval_scale), G_CALLBACK(sync_interval_changed), (gpointer) ctk_framelock); if (sync_edge < NV_CTRL_FRAMELOCK_POLARITY_RISING_EDGE) sync_edge = NV_CTRL_FRAMELOCK_POLARITY_RISING_EDGE; if (sync_edge > NV_CTRL_FRAMELOCK_POLARITY_BOTH_EDGES) sync_edge = NV_CTRL_FRAMELOCK_POLARITY_BOTH_EDGES; gtk_entry_set_text (GTK_ENTRY(GTK_COMBO(ctk_framelock->sync_edge_combo)->entry), syncEdgeStrings[sync_edge]); if (house_format < NV_CTRL_FRAMELOCK_VIDEO_MODE_NONE) house_format = NV_CTRL_FRAMELOCK_VIDEO_MODE_NONE; if (house_format > NV_CTRL_FRAMELOCK_VIDEO_MODE_HDTV) house_format = NV_CTRL_FRAMELOCK_VIDEO_MODE_HDTV; if (!ctk_framelock->video_mode_read_only) { gtk_entry_set_text (GTK_ENTRY(GTK_COMBO(ctk_framelock->video_mode_widget)->entry), houseFormatStrings[house_format]); } else { gtk_label_set_text(GTK_LABEL(ctk_framelock->video_mode_widget), houseFormatStrings[house_format]); } } } static void update_display_rate_txt(nvDisplayDataPtr data, guint rate_mHz, int precision) { float fvalue; char str[32]; /* Don't overwrite REFRESH_RATE_3 with REFRESH_RATE data */ if (precision < data->rate_precision) { return; } data->rate_precision = precision; data->rate_mHz = rate_mHz; fvalue = ((float)(data->rate_mHz)) / 1000.0f; if (data->hdmi3D) { fvalue /= 2; } snprintf(str, 32, "%.*f Hz%s", precision, fvalue, data->hdmi3D ? " (Doubled for HDMI 3D)" : ""); gtk_label_set_text(GTK_LABEL(data->rate_text), str); } /** validate_clients_against_server() ******************************** * * Validates that the given client entries (siblings and any children * of 'entry') match the server display's refresh rate, and disables * any client entries that don't. * */ static void validate_clients_against_server(nvListEntryPtr entry, nvDisplayDataPtr server_display_data) { nvDisplayDataPtr display_data; if (!entry || !server_display_data) return; if (entry->data_type == ENTRY_DATA_DISPLAY) { display_data = (nvDisplayDataPtr)entry->data; if ((display_data != server_display_data) && (!framelock_refresh_rates_compatible(server_display_data->rate_mHz, display_data->rate_mHz))) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(display_data->client_checkbox), FALSE); } } validate_clients_against_server(entry->children, server_display_data); validate_clients_against_server(entry->next_sibling, server_display_data); } /** update_display_config() ****************************************** * * Updates the UI to reflect the current configuration of a display * device. This function is meant to be used as a handler for * NV_CTRL_FRAMELOCK_DISPLAY_CONFIG events, as well as initialization. * * As a side effect, calling this function may possibly disable the * currently selected server, incompatible clients, and/or framelock sync. * This occurs if a new framelock server is being configured, or a client is * selected that does not properly match the currently selected server's * refresh rate. * */ static void update_display_config(nvListEntryPtr display_entry, int config) { nvDisplayDataPtr display_data = (nvDisplayDataPtr)display_entry->data; ReturnStatus ret; NVCTRLAttributeValidValuesRec valid_config; gboolean serverable = FALSE; gboolean clientable = FALSE; nvDisplayDataPtr old_server_display_data; /* Get what is possible */ ret = NvCtrlGetValidAttributeValues(display_data->handle, NV_CTRL_FRAMELOCK_DISPLAY_CONFIG, &valid_config); if (ret == NvCtrlSuccess && (valid_config.type == ATTRIBUTE_TYPE_INT_BITS)) { if (valid_config.u.bits.ints & (1<serverable = serverable; display_data->clientable = clientable; if (!clientable && config == NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_CLIENT) { config = NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_DISABLED; } if (!serverable && config == NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_SERVER) { config = NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_DISABLED; } gtk_widget_set_sensitive(display_data->client_label, clientable); gtk_widget_set_sensitive(display_data->client_checkbox, clientable); gtk_widget_set_sensitive(display_data->server_label, serverable); gtk_widget_set_sensitive(display_data->server_checkbox, serverable); /* Ensure we'll end up in a valid configuration. * * If a client is being enabled: * - Disable the server if its refresh rate does not match. (It will be * up to the client to re-select a propper server.) * * If a (new) server is being enabled: * - Disable any previous server. * - Disable any configured clients that do not match the new server's * refresh rate. * */ old_server_display_data = get_display_server_data(display_entry->tree); if (config == NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_CLIENT) { /* Disable existing server if the rates don't match, and make user re- * select the server. */ if (old_server_display_data && (display_data != old_server_display_data) && (!framelock_refresh_rates_compatible(old_server_display_data->rate_mHz, display_data->rate_mHz))) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(old_server_display_data->server_checkbox), FALSE); } } else if (config == NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_SERVER) { /* Disable any previous servers */ if (old_server_display_data && (display_data != old_server_display_data)) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(old_server_display_data->server_checkbox), FALSE); } /* Disable any configured clients that don't match the new refresh * rate. */ validate_clients_against_server(display_entry->tree->entries, display_data); } /* Apply the setting to the display device */ g_signal_handlers_block_matched(G_OBJECT(display_entry->ctk_event), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, (gpointer)display_entry); if (config == NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_CLIENT) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(display_data->client_checkbox), TRUE); } else { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(display_data->client_checkbox), FALSE); } if (config == NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_SERVER) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(display_data->server_checkbox), TRUE); } else { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(display_data->server_checkbox), FALSE); } g_signal_handlers_unblock_matched(G_OBJECT(display_entry->ctk_event), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, (gpointer)display_entry); } /** display_state_received() ***************************************** * * Signal handler for display target events. * */ static void display_state_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event = (CtkEventStruct *) arg1; nvListEntryPtr display_entry = (nvListEntryPtr) user_data; nvDisplayDataPtr display_data; nvListTreePtr tree; CtkFramelock *ctk_framelock; int rateMultiplier = 1; int precision = 3; if (!display_entry || !display_entry->data || !display_entry->data_type != ENTRY_DATA_DISPLAY) { return; } display_data = (nvDisplayDataPtr) display_entry->data; tree = display_entry->tree; ctk_framelock = tree->ctk_framelock; switch (event->attribute) { case NV_CTRL_REFRESH_RATE: rateMultiplier = 10; precision = 2; /* fallthrough */ case NV_CTRL_REFRESH_RATE_3: update_display_rate_txt(display_data, event->value * rateMultiplier, /* rate_mHz */ precision); /* Update the UI */ update_framelock_controls(ctk_framelock); break; case NV_CTRL_FRAMELOCK_DISPLAY_CONFIG: update_display_config(display_entry, event->value); /* Update the UI */ update_framelock_controls(ctk_framelock); break; } } /** gpu_state_received() ********************************************* * * Signal handler for gpu target events. * */ static void gpu_state_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event = (CtkEventStruct *) arg1; nvListEntryPtr gpu_entry = (nvListEntryPtr) user_data; nvGPUDataPtr gpu_data; nvListTreePtr tree; CtkFramelock *ctk_framelock; if (!gpu_entry || !gpu_entry->data || !gpu_entry->data_type != ENTRY_DATA_GPU) { return; } gpu_data = (nvGPUDataPtr) gpu_entry->data; tree = gpu_entry->tree; ctk_framelock = tree->ctk_framelock; switch (event->attribute) { case NV_CTRL_FRAMELOCK_SYNC: /* Cache the enable/disable state of the gpu sync */ gpu_data->enabled = event->value; /* Look to see if any gpu is enabled/disabled */ ctk_framelock->framelock_enabled = any_gpu_enabled(tree->entries); g_signal_handlers_block_by_func (G_OBJECT(ctk_framelock->sync_state_button), G_CALLBACK(toggle_sync_enable), (gpointer) ctk_framelock); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_framelock->sync_state_button), ctk_framelock->framelock_enabled ? 1 : 0); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_framelock->sync_state_button), G_CALLBACK(toggle_sync_enable), (gpointer) ctk_framelock); update_framelock_controls(ctk_framelock); break; case NV_CTRL_FRAMELOCK_TEST_SIGNAL: switch (event->value) { case NV_CTRL_FRAMELOCK_TEST_SIGNAL_ENABLE: ctk_framelock->test_link_enabled = TRUE; gdk_window_set_cursor ((GTK_WIDGET(ctk_framelock->parent_window))->window, ctk_framelock->wait_cursor); gtk_grab_add(ctk_framelock->test_link_button); break; case NV_CTRL_FRAMELOCK_TEST_SIGNAL_DISABLE: ctk_framelock->test_link_enabled = FALSE; gtk_grab_remove(ctk_framelock->test_link_button); gdk_window_set_cursor ((GTK_WIDGET(ctk_framelock->parent_window))->window, NULL); break; default: /* Unknown state, ignore */ break; } g_signal_handlers_block_by_func (G_OBJECT(ctk_framelock->test_link_button), G_CALLBACK(toggle_test_link), (gpointer) ctk_framelock); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_framelock->test_link_button), ctk_framelock->test_link_enabled); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_framelock->test_link_button), G_CALLBACK(toggle_test_link), (gpointer) ctk_framelock); ctk_config_statusbar_message(ctk_framelock->ctk_config, (ctk_framelock->test_link_enabled ? "Test link started." : "Test link complete.")); break; default: /* Oops */ break; } } /* gpu_state_received() */ /** framelock_state_received() *************************************** * * Signal handler for frame lock target events. * */ static void framelock_state_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event = (CtkEventStruct *) arg1; nvListEntryPtr entry = (nvListEntryPtr) user_data; CtkFramelock *ctk_framelock = entry->tree->ctk_framelock; nvListEntryPtr server_entry = get_framelock_server_entry(entry->tree); gint sync_edge; gint house_format; if (server_entry && entry != server_entry) { /* Setting is being made to a non-server frame lock device, ignore */ return; } /* Process the new frame lock device setting */ switch (event->attribute) { case NV_CTRL_USE_HOUSE_SYNC: g_signal_handlers_block_by_func (G_OBJECT(ctk_framelock->use_house_sync), G_CALLBACK(toggle_use_house_sync), (gpointer) ctk_framelock); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_framelock->use_house_sync), event->value); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_framelock->use_house_sync), G_CALLBACK(toggle_use_house_sync), (gpointer) ctk_framelock); break; case NV_CTRL_FRAMELOCK_SYNC_INTERVAL: g_signal_handlers_block_by_func (G_OBJECT(ctk_framelock->sync_interval_scale), G_CALLBACK(sync_interval_changed), (gpointer) ctk_framelock); gtk_range_set_value(GTK_RANGE(ctk_framelock->sync_interval_scale), event->value); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_framelock->sync_interval_scale), G_CALLBACK(sync_interval_changed), (gpointer) ctk_framelock); break; case NV_CTRL_FRAMELOCK_POLARITY: sync_edge = event->value; if (sync_edge < NV_CTRL_FRAMELOCK_POLARITY_RISING_EDGE) sync_edge = NV_CTRL_FRAMELOCK_POLARITY_RISING_EDGE; if (sync_edge > NV_CTRL_FRAMELOCK_POLARITY_BOTH_EDGES) sync_edge = NV_CTRL_FRAMELOCK_POLARITY_BOTH_EDGES; g_signal_handlers_block_by_func (G_OBJECT(GTK_COMBO(ctk_framelock->sync_edge_combo)->entry), G_CALLBACK(changed_sync_edge), (gpointer) ctk_framelock); gtk_entry_set_text (GTK_ENTRY(GTK_COMBO(ctk_framelock->sync_edge_combo)->entry), syncEdgeStrings[sync_edge]); g_signal_handlers_unblock_by_func (G_OBJECT(GTK_COMBO(ctk_framelock->sync_edge_combo)->entry), G_CALLBACK(changed_sync_edge), (gpointer) ctk_framelock); break; case NV_CTRL_FRAMELOCK_VIDEO_MODE: house_format = event->value; if (house_format < NV_CTRL_FRAMELOCK_VIDEO_MODE_NONE) house_format = NV_CTRL_FRAMELOCK_VIDEO_MODE_NONE; if (house_format > NV_CTRL_FRAMELOCK_VIDEO_MODE_HDTV) house_format = NV_CTRL_FRAMELOCK_VIDEO_MODE_HDTV; if (!ctk_framelock->video_mode_read_only) { g_signal_handlers_block_by_func (G_OBJECT(GTK_COMBO(ctk_framelock->video_mode_widget)->entry), G_CALLBACK(changed_video_mode), (gpointer) ctk_framelock); gtk_entry_set_text (GTK_ENTRY(GTK_COMBO(ctk_framelock->video_mode_widget)->entry), houseFormatStrings[house_format]); g_signal_handlers_unblock_by_func (G_OBJECT(GTK_COMBO(ctk_framelock->video_mode_widget)->entry), G_CALLBACK(changed_video_mode), (gpointer) ctk_framelock); } else { gtk_label_set_text(GTK_LABEL(ctk_framelock->video_mode_widget), houseFormatStrings[house_format]); } break; default: /* Oops */ break; } update_house_sync_controls(ctk_framelock); } /**************************************************************************/ /* * Main Frame Lock Page Widget */ static GObjectClass *parent_class; /** ctk_framelock_class_init() *************************************** * * Initialize the object structure * */ static void ctk_framelock_class_init( CtkFramelockClass *ctk_framelock_class ) { parent_class = g_type_class_peek_parent(ctk_framelock_class); } /** ctk_framelock_get_type() ***************************************** * * registers the frame lock class and return the unique type id. * */ GType ctk_framelock_get_type( void ) { static GType ctk_framelock_type = 0; if (!ctk_framelock_type) { static const GTypeInfo ctk_framelock_info = { sizeof (CtkFramelockClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ctk_framelock_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkFramelock), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_framelock_type = g_type_register_static (GTK_TYPE_VBOX, "CtkFramelock", &ctk_framelock_info, 0); } return ctk_framelock_type; } /** ctk_framelock_new() ********************************************** * * returns a new instance of the frame lock class. * */ GtkWidget* ctk_framelock_new(NvCtrlAttributeHandle *handle, GtkWidget *parent_window, CtkConfig *ctk_config, ParsedAttribute *p) { GObject *object; CtkFramelock *ctk_framelock; GtkWidget *banner; ReturnStatus ret; unsigned int num_framelocks; gchar *string; gint val; GtkWidget *frame; GtkWidget *padding; GtkWidget *sw; /* Scrollable window */ GtkWidget *vp; /* Viewport */ GtkWidget *scale; GtkObject *adjustment; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *label; GtkWidget *combo; GList *glist; GtkWidget *button; GtkWidget *image; NVCTRLAttributeValidValuesRec valid; /* make sure we have a handle */ g_return_val_if_fail(handle != NULL, NULL); /* Only expose frame lock if there are frame lock boards in * the system. This isn't absolutely necessary, because the * frame lock control page does not have to include the current * NV-CONTROL handle in the frame lock group. However, we don't * want to expose the frame lock page unconditionally (it would * only confuse most users), so this is as good a condition as * anything else. * * XXX We could also add yet another checkbox in the nvidia-settings * Options page. */ ret = NvCtrlQueryTargetCount(handle, NV_CTRL_TARGET_TYPE_FRAMELOCK, (int *)&num_framelocks); if (ret != NvCtrlSuccess) return NULL; if (!num_framelocks) return NULL; /* 1. - Create the frame lock widgets */ /* create the frame lock page object */ object = g_object_new(CTK_TYPE_FRAMELOCK, NULL); ctk_framelock = CTK_FRAMELOCK(object); ctk_framelock->attribute_handle = handle; ctk_framelock->ctk_config = ctk_config; ctk_framelock->parent_window = GTK_WINDOW(parent_window); ctk_framelock->video_mode_read_only = TRUE; /* create the watch cursor */ ctk_framelock->wait_cursor = gdk_cursor_new(GDK_WATCH); /* create dialog windows */ ctk_framelock->add_devices_dialog = create_add_devices_dialog(ctk_framelock); ctk_framelock->remove_devices_dialog = create_remove_devices_dialog(ctk_framelock); ctk_framelock->error_msg_dialog = create_error_msg_dialog(ctk_framelock); ctk_framelock->enable_confirm_dialog = create_enable_confirm_dialog(ctk_framelock); /* create buttons */ button = my_button_new_with_label("Add Devices...", 15, 0); g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gtk_widget_show_all), (gpointer) ctk_framelock->add_devices_dialog); ctk_config_set_tooltip(ctk_config, button, __add_devices_button_help); ctk_framelock->add_devices_button = button; button = my_button_new_with_label("Remove Devices...", 15, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(show_remove_devices_dialog), GTK_OBJECT(ctk_framelock)); ctk_config_set_tooltip(ctk_config, button, __remove_devices_button_help); ctk_framelock->remove_devices_button = button; button = my_toggle_button_new_with_label("Short Names", 15, 0); // g_signal_connect(G_OBJECT(button), // "toggled", G_CALLBACK(toggle_short_names), // GTK_OBJECT(ctk_framelock)); ctk_framelock->short_labels_button = button; button = my_toggle_button_new_with_label("Show Extra Info", 15, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(toggle_extra_info), (gpointer) ctk_framelock); ctk_config_set_tooltip(ctk_config, button, __show_extra_info_button_help); ctk_framelock->extra_info_button = button; button = my_button_new_with_label("Expand All", 15, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(expand_all_clicked), (gpointer) ctk_framelock); ctk_config_set_tooltip(ctk_config, button, __expand_all_button_help); ctk_framelock->expand_all_button = button; button = gtk_check_button_new_with_label("Use House Sync if Present"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(toggle_use_house_sync), (gpointer) ctk_framelock); ctk_config_set_tooltip(ctk_config, button, __use_house_sync_button_help); ctk_framelock->use_house_sync = button; button = my_toggle_button_new_with_label("Detect", 15, 0); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(toggle_detect_video_mode), GTK_OBJECT(ctk_framelock)); ctk_config_set_tooltip(ctk_config, button, __detect_video_mode_button_help); ctk_framelock->video_mode_detect = button; button = my_toggle_button_new_with_label("Test Link", 15, 0); gtk_widget_set_sensitive(button, FALSE); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(toggle_test_link), GTK_OBJECT(ctk_framelock)); ctk_config_set_tooltip(ctk_config, button, __test_link_button_help); ctk_framelock->test_link_button = button; button = create_sync_state_button(ctk_framelock); gtk_widget_set_sensitive(button, FALSE); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(toggle_sync_enable), GTK_OBJECT(ctk_framelock)); ctk_config_set_tooltip(ctk_config, button, __sync_enable_button_help); ctk_framelock->sync_state_button = button; /* Create combo boxes */ /* Select video mode widget dropdown/label depending on * video mode is read-only. */ ret = NvCtrlGetValidAttributeValues(ctk_framelock->attribute_handle, NV_CTRL_FRAMELOCK_VIDEO_MODE, &valid); if ((ret == NvCtrlSuccess) && (valid.permissions & ATTRIBUTE_TYPE_WRITE)) { ctk_framelock->video_mode_read_only = FALSE; } if (!ctk_framelock->video_mode_read_only) { combo = gtk_combo_new(); glist = NULL; glist = g_list_append (glist, houseFormatStrings[NV_CTRL_FRAMELOCK_VIDEO_MODE_COMPOSITE_AUTO]); glist = g_list_append (glist, houseFormatStrings[NV_CTRL_FRAMELOCK_VIDEO_MODE_COMPOSITE_BI_LEVEL]); glist = g_list_append (glist, houseFormatStrings[NV_CTRL_FRAMELOCK_VIDEO_MODE_COMPOSITE_TRI_LEVEL]); glist = g_list_append (glist, houseFormatStrings[NV_CTRL_FRAMELOCK_VIDEO_MODE_TTL]); gtk_combo_set_popdown_strings(GTK_COMBO(combo), glist); gtk_editable_set_editable(GTK_EDITABLE(GTK_COMBO(combo)->entry), FALSE); g_signal_connect(G_OBJECT(GTK_EDITABLE(GTK_COMBO(combo)->entry)), "changed", G_CALLBACK(changed_video_mode), (gpointer) ctk_framelock); ctk_framelock->video_mode_widget = combo; } else { ctk_framelock->video_mode_widget = gtk_label_new("None"); } ctk_config_set_tooltip(ctk_config, ctk_framelock->video_mode_widget, __video_mode_help); combo = gtk_combo_new(); glist = NULL; glist = g_list_append (glist, syncEdgeStrings[NV_CTRL_FRAMELOCK_POLARITY_RISING_EDGE]); glist = g_list_append (glist, syncEdgeStrings[NV_CTRL_FRAMELOCK_POLARITY_FALLING_EDGE]); glist = g_list_append (glist, syncEdgeStrings[NV_CTRL_FRAMELOCK_POLARITY_BOTH_EDGES]); gtk_combo_set_popdown_strings(GTK_COMBO(combo), glist); gtk_editable_set_editable(GTK_EDITABLE(GTK_COMBO(combo)->entry), FALSE); g_signal_connect(G_OBJECT(GTK_EDITABLE(GTK_COMBO(combo)->entry)), "changed", G_CALLBACK(changed_sync_edge), (gpointer) ctk_framelock); ctk_config_set_tooltip(ctk_config, combo, __sync_edge_combo_help); ctk_framelock->sync_edge_combo = combo; /* Cache images */ ctk_framelock->led_grey_pixbuf = gdk_pixbuf_from_pixdata(&led_grey_pixdata, TRUE, NULL); ctk_framelock->led_green_pixbuf = gdk_pixbuf_from_pixdata(&led_green_pixdata, TRUE, NULL); ctk_framelock->led_red_pixbuf = gdk_pixbuf_from_pixdata(&led_red_pixdata, TRUE, NULL); ctk_framelock->rj45_input_pixbuf = gdk_pixbuf_from_pixdata(&rj45_input_pixdata, TRUE, NULL); ctk_framelock->rj45_output_pixbuf = gdk_pixbuf_from_pixdata(&rj45_output_pixdata, TRUE, NULL); ctk_framelock->rj45_unused_pixbuf = gdk_pixbuf_from_pixdata(&rj45_unused_pixdata, TRUE, NULL); g_object_ref(ctk_framelock->led_grey_pixbuf); g_object_ref(ctk_framelock->led_green_pixbuf); g_object_ref(ctk_framelock->led_red_pixbuf); g_object_ref(ctk_framelock->rj45_input_pixbuf); g_object_ref(ctk_framelock->rj45_output_pixbuf); g_object_ref(ctk_framelock->rj45_unused_pixbuf); /* create the custom tree */ ctk_framelock->tree = (gpointer)(list_tree_new(ctk_framelock)); /* 2. - Pack frame lock widgets */ gtk_box_set_spacing(GTK_BOX(ctk_framelock), 10); /* banner */ banner = ctk_banner_image_new(BANNER_ARTWORK_FRAMELOCK); gtk_box_pack_start(GTK_BOX(ctk_framelock), banner, FALSE, FALSE, 0); /* Quadro Sync Frame */ frame = gtk_frame_new(NULL); gtk_frame_set_label(GTK_FRAME(frame), "Quadro Sync Devices"); gtk_box_pack_start(GTK_BOX(ctk_framelock), frame, TRUE, TRUE, 0); /* scrollable window */ sw = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); padding = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(padding), FRAME_PADDING); gtk_container_add(GTK_CONTAINER(padding), sw); gtk_container_add(GTK_CONTAINER(frame), padding); /* create a viewport so we can have a white background */ vp = gtk_viewport_new(NULL, NULL); SELECT_WIDGET(vp, GTK_STATE_NORMAL); gtk_container_add(GTK_CONTAINER(sw), GTK_WIDGET(vp)); /** XXX **/gtk_widget_set_size_request(sw, -1, 200);/** XXX **/ /* add the custom tree & buttons */ vbox = ((nvListTreePtr)(ctk_framelock->tree))->vbox; gtk_container_set_border_width(GTK_CONTAINER(vbox), FRAME_PADDING); gtk_container_add(GTK_CONTAINER(vp), vbox); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_end(GTK_BOX(hbox), ctk_framelock->expand_all_button, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), ctk_framelock->extra_info_button, FALSE, FALSE, 0); // XXX Add me later.... // // gtk_box_pack_end(GTK_BOX(hbox), ctk_framelock->short_labels_button, // FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), ctk_framelock->remove_devices_button, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), ctk_framelock->add_devices_button, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(padding), hbox, FALSE, FALSE, 0); /* add the house sync frame */ frame = gtk_frame_new(NULL); ctk_framelock->house_sync_frame = frame; gtk_frame_set_label(GTK_FRAME(frame), "House Sync"); gtk_box_pack_start(GTK_BOX(ctk_framelock), frame, FALSE, FALSE, 0); padding = gtk_hbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(padding), FRAME_PADDING); gtk_container_add(GTK_CONTAINER(frame), padding); /* add house sync BNC connector image */ image = gtk_image_new_from_pixbuf (gdk_pixbuf_from_pixdata(&bnc_cable_pixdata, TRUE, NULL)); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), image, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(padding), hbox, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_framelock->use_house_sync, FALSE, FALSE, 0); padding = gtk_vbox_new(FALSE, 5); ctk_framelock->house_sync_vbox = padding; gtk_box_pack_start(GTK_BOX(vbox), padding, FALSE, FALSE, 0); /* add the house sync interval */ { GtkWidget *frame2 = gtk_frame_new(NULL); ret = NvCtrlGetValidAttributeValues(ctk_framelock->attribute_handle, NV_CTRL_FRAMELOCK_SYNC_INTERVAL, &valid); /* * pick a conservative default range if we could not query the * range from NV-CONTROL */ if ((ret != NvCtrlSuccess) || (valid.type != ATTRIBUTE_TYPE_RANGE)) { valid.type = ATTRIBUTE_TYPE_RANGE; valid.u.range.min = 0; valid.u.range.max = 4; } if (NvCtrlSuccess != NvCtrlGetAttribute(ctk_framelock->attribute_handle, NV_CTRL_FRAMELOCK_SYNC_INTERVAL, &val)) { return NULL; } hbox = gtk_hbox_new(FALSE, 5); label = gtk_label_new("Sync Interval:"); adjustment = gtk_adjustment_new(val, valid.u.range.min, valid.u.range.max, 1, 1, 0); scale = gtk_hscale_new(GTK_ADJUSTMENT(adjustment)); gtk_adjustment_set_value(GTK_ADJUSTMENT(adjustment), val); gtk_scale_set_draw_value(GTK_SCALE(scale), TRUE); gtk_scale_set_value_pos(GTK_SCALE(scale), GTK_POS_TOP); g_signal_connect(G_OBJECT(scale), "format-value", G_CALLBACK(format_sync_interval), (gpointer) ctk_framelock); g_signal_connect(G_OBJECT(scale), "value-changed", G_CALLBACK(sync_interval_changed), (gpointer) ctk_framelock); ctk_config_set_tooltip(ctk_config, scale, __sync_interval_scale_help); ctk_framelock->sync_interval_frame = frame2; ctk_framelock->sync_interval_scale = scale; gtk_box_pack_start(GTK_BOX(padding), frame2, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), scale, TRUE, TRUE, 5); gtk_container_add(GTK_CONTAINER(frame2), hbox); } /* add the house sync video mode & detect */ { GtkWidget *frame2 = gtk_frame_new(NULL); hbox = gtk_hbox_new(FALSE, 5); label = gtk_label_new("Sync Edge:"); ctk_framelock->sync_edge_frame = frame2; gtk_box_pack_start(GTK_BOX(padding), frame2, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(frame2), hbox); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_framelock->sync_edge_combo, FALSE, FALSE, 5); } /* add the house sync video mode & detect */ { GtkWidget *frame2 = gtk_frame_new(NULL); hbox = gtk_hbox_new(FALSE, 5); label = gtk_label_new("Video Mode:"); ctk_framelock->video_mode_frame = frame2; gtk_box_pack_start(GTK_BOX(padding), frame2, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(frame2), hbox); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_framelock->video_mode_widget, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_framelock->video_mode_detect, FALSE, TRUE, 5); } /* add main buttons */ hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_end(GTK_BOX(hbox), ctk_framelock->sync_state_button, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), ctk_framelock->test_link_button, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(ctk_framelock), hbox, FALSE, FALSE, 0); /* show everything */ gtk_widget_show_all(GTK_WIDGET(object)); /* apply the parsed attribute list */ apply_parsed_attribute_list(ctk_framelock, p); /* update state of frame lock controls */ update_framelock_controls(ctk_framelock); /* register a timer callback to update the status of the page */ string = g_strdup_printf("Frame Lock Connection Status (Screen %u)", NvCtrlGetTargetId(handle)); ctk_config_add_timer(ctk_config, DEFAULT_UPDATE_STATUS_TIME_INTERVAL, string, (GSourceFunc) update_framelock_status, (gpointer) ctk_framelock); g_free(string); /* register a timer callback to check the rj45 ports */ string = g_strdup_printf("Frame Lock RJ45 Check (Screen %u)", NvCtrlGetTargetId(handle)); ctk_config_add_timer(ctk_config, DEFAULT_CHECK_FOR_ETHERNET_TIME_INTERVAL, string, (GSourceFunc) check_for_ethernet, (gpointer) ctk_framelock); g_free(string); return GTK_WIDGET(object); } /* ctk_framelock_new() */ /************************************************************************/ /* * functions relating to add_devices_dialog */ /** add_devices_respond_ok() ***************************************** * * Callback function used to allow user to press the key * when entering the name of the X Server to add to the frame lock * group in the add_devices_dialog. * */ static void add_devices_repond_ok(GtkWidget *entry, gpointer data) { add_devices_response(entry, GTK_RESPONSE_OK, data); } /** add_devices_response() ******************************************* * * Callback function for the "response" event of the "Add X Server" * dialog box. * */ static void add_devices_response(GtkWidget *button, gint response, gpointer user_data) { CtkFramelock *ctk_framelock = CTK_FRAMELOCK(user_data); const gchar *display_name; /* hide the dialog box */ gtk_widget_hide_all(ctk_framelock->add_devices_dialog); /* set the focus back to the text entry */ gtk_widget_grab_focus(ctk_framelock->add_devices_entry); /* if the response is not "OK" then we're done */ if (response != GTK_RESPONSE_OK) return; /* get the display name specified by the user */ display_name = gtk_entry_get_text(GTK_ENTRY(ctk_framelock->add_devices_entry)); /* Add all devices found on the server */ add_devices(ctk_framelock, display_name, TRUE); if (!ctk_framelock->tree || !((nvListTreePtr)(ctk_framelock->tree))->nentries) { /* Nothing was added, nothing to update */ return; } /* Update frame lock controls */ update_framelock_controls(ctk_framelock); /* Update frame lock status */ update_framelock_status(ctk_framelock); /* Update status bar */ ctk_config_statusbar_message(ctk_framelock->ctk_config, "Added X server '%s'.", display_name); } /** remove_devices_response() **************************************** * * Callback function for the "response" event of the "Remove Devices" * dialog box. * */ static void remove_devices_response(GtkWidget *button, gint response, gpointer user_data) { CtkFramelock *ctk_framelock = CTK_FRAMELOCK(user_data); nvListTreePtr tree = (nvListTreePtr)(ctk_framelock->tree); nvListEntryPtr entry = tree->selected_entry; gchar *name; gtk_widget_hide_all(ctk_framelock->remove_devices_dialog); if (response != GTK_RESPONSE_OK) return; if (!entry) return; name = list_entry_get_name(entry, 0); /* Remove entry from list */ list_tree_remove_entry(tree, entry); /* If there are no entries left, Update the frame lock GUI */ if (!tree->nentries) { /* Nothing to house sync to */ if (ctk_framelock->use_house_sync) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_framelock->use_house_sync), FALSE); } /* Force frame lock state to OFF if it was on */ ctk_framelock->framelock_enabled = FALSE; } update_framelock_controls(ctk_framelock); /* Update status bar */ ctk_config_statusbar_message(ctk_framelock->ctk_config, "Removed '%s' from the frame lock group.", name); g_free(name); } /** add_display_device() ********************************************* * * Adds an display device to the give GPU entry. * */ static gboolean add_display_device(CtkFramelock *ctk_framelock, nvListEntryPtr gpu_entry, int display_id) { nvGPUDataPtr gpu_data = (nvGPUDataPtr)(gpu_entry->data); nvDisplayDataPtr display_data = NULL; nvListEntryPtr entry = NULL; nvListTreePtr tree = (nvListTreePtr)(ctk_framelock->tree); ReturnStatus ret; int val; int rate; int precision; gboolean hdmi3D; int i; display_data = (nvDisplayDataPtr) calloc(1, sizeof(nvDisplayDataRec)); if (!display_data) { goto fail; } display_data->handle = NvCtrlAttributeInit(NvCtrlGetDisplayPtr(gpu_data->handle), NV_CTRL_TARGET_TYPE_DISPLAY, display_id, NV_CTRL_ATTRIBUTES_NV_CONTROL_SUBSYSTEM); if (!display_data->handle) { goto fail; } /* Create, pack and link the display device UI widgets */ display_data->label = gtk_label_new(""); display_data->server_label = gtk_label_new("Server"); display_data->server_checkbox = gtk_check_button_new(); ctk_config_set_tooltip(ctk_framelock->ctk_config, display_data->server_checkbox, __server_checkbox_help); display_data->client_label = gtk_label_new("Client"); display_data->client_checkbox = gtk_check_button_new(); ctk_config_set_tooltip(ctk_framelock->ctk_config, display_data->client_checkbox, __client_checkbox_help); display_data->rate_label = gtk_label_new("Refresh:"); display_data->rate_text = gtk_label_new(""); display_data->stereo_label = gtk_label_new("Stereo"); display_data->stereo_hbox = gtk_hbox_new(FALSE, 0); entry = list_entry_new_with_display(display_data, tree); if (!entry) { goto fail; } list_entry_add_child(gpu_entry, entry); /* Query current configuration */ /* Name */ update_entry_label(ctk_framelock, entry); /* Refresh rate */ ret = NvCtrlGetAttribute(display_data->handle, NV_CTRL_REFRESH_RATE_3, &rate); if (ret != NvCtrlSuccess) { ret = NvCtrlGetAttribute(display_data->handle, NV_CTRL_REFRESH_RATE, &rate); if (ret != NvCtrlSuccess) { rate = 0; precision = 0; } else { rate = rate * 10; precision = 2; } } else { precision = 3; } update_display_rate_txt(display_data, rate, precision); /* HDMI 3D */ ret = NvCtrlGetDisplayAttribute(display_data->handle, display_data->device_mask, NV_CTRL_DPY_HDMI_3D, &hdmi3D); display_data->hdmi3D = hdmi3D; /* Configuration */ ret = NvCtrlGetAttribute(display_data->handle, NV_CTRL_FRAMELOCK_DISPLAY_CONFIG, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_DISABLED; } if (val == NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_SERVER) { tree->server_entry = entry; } update_display_config(entry, val); /* Update status (LEDs) based on current state */ list_entry_update_status(ctk_framelock, entry); /* Listen to events */ for (i = 0; i < ARRAY_LEN(__DisplaySignals); i++) { g_signal_connect(G_OBJECT(entry->ctk_event), __DisplaySignals[i], G_CALLBACK(display_state_received), (gpointer) entry); } g_signal_connect(G_OBJECT(display_data->server_checkbox), "toggled", G_CALLBACK(toggle_server), (gpointer) entry); g_signal_connect(G_OBJECT(display_data->client_checkbox), "toggled", G_CALLBACK(toggle_client), (gpointer) entry); return TRUE; fail: if (entry) { list_entry_free(entry); } else if (display_data) { display_data_free(display_data); } return FALSE; } /** add_display_devices() ******************************************** * * Adds (as children list entries) all enabled display devices that * are bound to the given GPU entry. * */ static void add_display_devices(CtkFramelock *ctk_framelock, nvListEntryPtr gpu_entry) { nvGPUDataPtr gpu_data; ReturnStatus ret; int *pData; if (!gpu_entry || gpu_entry->data_type != ENTRY_DATA_GPU) { return; } gpu_data = (nvGPUDataPtr)(gpu_entry->data); ret = NvCtrlGetBinaryAttribute(gpu_data->handle, 0, NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU, (unsigned char **)(&pData), NULL); if (ret == NvCtrlSuccess) { int i; for (i = 0; i < pData[0]; i++) { int display_id = pData[1+i]; Bool valid; int enabled; /* Only add enabled display devices */ valid = XNVCTRLQueryTargetAttribute(NvCtrlGetDisplayPtr(gpu_data->handle), NV_CTRL_TARGET_TYPE_DISPLAY, display_id, 0, NV_CTRL_DISPLAY_ENABLED, &enabled); if (valid && enabled) { add_display_device(ctk_framelock, gpu_entry, display_id); } } XFree(pData); } } /** add_gpu_devices() ************************************************ * * Adds (as children list entries) all GPU devices that are bound to * the given frame lock list entry. * */ static void add_gpu_devices(CtkFramelock *ctk_framelock, nvListEntryPtr framelock_entry) { unsigned int num_gpus; unsigned int gpu_id; unsigned int gpu_idx; nvGPUDataPtr gpu_data = NULL; nvFrameLockDataPtr framelock_data; nvListEntryPtr entry; ReturnStatus ret; unsigned char *data = NULL; int len = 0; int *gpus; if (!framelock_entry || framelock_entry->data_type != ENTRY_DATA_FRAMELOCK) { goto fail; } /* Get number of GPU devices connected to this frame lock board */ framelock_data = (nvFrameLockDataPtr)(framelock_entry->data); ret = NvCtrlGetBinaryAttribute(framelock_data->handle, 0, NV_CTRL_BINARY_DATA_GPUS_USING_FRAMELOCK, &data, &len); if (ret != NvCtrlSuccess) { goto fail; } gpus = (int *)data; num_gpus = gpus[0]; for (gpu_idx = 0; gpu_idx < num_gpus; gpu_idx++) { gpu_id = gpus[gpu_idx +1]; /* Create the GPU data structure */ gpu_data = (nvGPUDataPtr) calloc(1, sizeof(nvGPUDataRec)); if (!gpu_data) { goto fail; } /* Create the GPU handle and label */ gpu_data->handle = NvCtrlAttributeInit(NvCtrlGetDisplayPtr(framelock_data->handle), NV_CTRL_TARGET_TYPE_GPU, gpu_id, NV_CTRL_ATTRIBUTES_NV_CONTROL_SUBSYSTEM); gpu_data->label = gtk_label_new(""); gpu_data->timing_label = gtk_label_new("Timing"); gpu_data->timing_hbox = gtk_hbox_new(FALSE, 0); /* Create the GPU list entry */ entry = list_entry_new_with_gpu(gpu_data, (nvListTreePtr)(ctk_framelock->tree)); update_entry_label(ctk_framelock, entry); list_entry_update_status(ctk_framelock, entry); /* Add Displays tied to this GPU */ add_display_devices(ctk_framelock, entry); if (entry->children) { int i; list_entry_add_child(framelock_entry, entry); /* Check to see if we should reflect in the GUI that * frame lock is enabled. This should happen if we are * adding a gpu that has FRAMELOCK_SYNC set to enable. */ NvCtrlGetAttribute(gpu_data->handle, NV_CTRL_FRAMELOCK_SYNC, &(gpu_data->enabled)); ctk_framelock->framelock_enabled |= gpu_data->enabled; for (i = 0; i < ARRAY_LEN(__GPUSignals); i++) { g_signal_connect(G_OBJECT(entry->ctk_event), __GPUSignals[i], G_CALLBACK(gpu_state_received), (gpointer) entry); } } else { /* No Displays found, don't add this GPU device */ list_entry_free(entry); } } XFree(data); return; /* Handle failures */ fail: XFree(data); gpu_data_free(gpu_data); } /** add_framelock_devices() ****************************************** * * Adds all frame lock devices found on the given server handle to * the frame lock group, * */ static void add_framelock_devices(CtkFramelock *ctk_framelock, gpointer handle, int server_id) { unsigned int num_framelocks; unsigned int framelock_id; nvFrameLockDataPtr framelock_data = NULL; nvListEntryPtr entry; ReturnStatus ret; /* Get number of Quadro Sync devices on this server */ ret = NvCtrlQueryTargetCount(handle, NV_CTRL_TARGET_TYPE_FRAMELOCK, (int *)&num_framelocks); if (ret != NvCtrlSuccess) { goto fail; } /* Add frame lock devices found */ for (framelock_id = 0; framelock_id < num_framelocks; framelock_id++) { int val; char *revision_str = NULL; /* Create the frame lock data structure */ framelock_data = (nvFrameLockDataPtr) calloc(1, sizeof(nvFrameLockDataRec)); if (!framelock_data) { goto fail; } /* Create the frame lock handle */ framelock_data->handle = NvCtrlAttributeInit(NvCtrlGetDisplayPtr(handle), NV_CTRL_TARGET_TYPE_FRAMELOCK, framelock_id, NV_CTRL_ATTRIBUTES_NV_CONTROL_SUBSYSTEM); /* Gather framelock device information */ ret = NvCtrlGetAttribute(framelock_data->handle, NV_CTRL_FRAMELOCK_SYNC_DELAY_RESOLUTION, &val); if (ret == NvCtrlSuccess) { framelock_data->sync_delay_resolution = val; } else { /* Fall back to the GSync II's resolution when * working with an older X server */ framelock_data->sync_delay_resolution = 7810; } ret = NvCtrlGetAttribute(framelock_data->handle, NV_CTRL_FRAMELOCK_FPGA_REVISION, &val); if (ret != NvCtrlSuccess) { goto fail; } revision_str = g_strdup_printf("0x%X", val); /* Create the frame lock widgets */ framelock_data->label = gtk_label_new(""); framelock_data->receiving_label = gtk_label_new("Receiving"); framelock_data->receiving_hbox = gtk_hbox_new(FALSE, 0); framelock_data->rate_label = gtk_label_new("Rate:"); framelock_data->rate_text = gtk_label_new(""); framelock_data->delay_label = gtk_label_new("Delay:"); framelock_data->delay_text = gtk_label_new(""); framelock_data->house_label = gtk_label_new("House"); framelock_data->house_hbox = gtk_hbox_new(FALSE, 0); framelock_data->house_sync_rate_label = gtk_label_new("House Sync Rate:"); framelock_data->house_sync_rate_text = gtk_label_new(""); framelock_data->port0_label = gtk_label_new("Port 0"); framelock_data->port0_hbox = gtk_hbox_new(FALSE, 0); framelock_data->port1_label = gtk_label_new("Port 1"); framelock_data->port1_hbox = gtk_hbox_new(FALSE, 0); framelock_data->revision_label = gtk_label_new("FPGA Revision:"); framelock_data->revision_text = gtk_label_new(revision_str); g_free(revision_str); framelock_data->extra_info_hbox = gtk_hbox_new(FALSE, 5); framelock_data->server_id = server_id; /* Create the frame lock list entry */ entry = list_entry_new_with_framelock(framelock_data, (nvListTreePtr)(ctk_framelock->tree)); update_entry_label(ctk_framelock, entry); list_entry_update_status(ctk_framelock, entry); /* Add GPUs tied to this Quadro Sync */ add_gpu_devices(ctk_framelock, entry); if (entry->children) { int i; list_tree_add_entry((nvListTreePtr)(ctk_framelock->tree), entry); for (i = 0; i < ARRAY_LEN(__FrameLockSignals); i++) { g_signal_connect(G_OBJECT(entry->ctk_event), __FrameLockSignals[i], G_CALLBACK(framelock_state_received), (gpointer) entry); } } else { /* No GPUs found, don't add this frame lock device */ list_entry_free(entry); } } return; /* Handle failures */ fail: framelock_data_free(framelock_data); } /** add_devices() **************************************************** * * Adds all frame lock devices found on the given server to the * frame lock group, * */ static void add_devices(CtkFramelock *ctk_framelock, const gchar *display_name, gboolean error_dialog) { gpointer handle = NULL; Display *display; int server_id = -1; char *server_name = NULL; char *ptr; /* if no display name specified, print an error and return */ if (!display_name || (display_name[0] == '\0')) { if (error_dialog) { error_msg(ctk_framelock, "" "Unable to add X Server to frame lock group.\n\n" "No X Server specified."); } else { nv_error_msg("Unable to add X Server to frame lock group; " "no X Server specified."); } goto done; } /* * build the server name from the display name by removing any extra * server number and assuming ":0" if no server id is given */ /* +2 extra characters in case we need to append ":0" */ server_name = malloc(strlen(display_name) + 3); if (!server_name) { goto done; } sprintf(server_name, "%s", display_name); ptr = strchr(server_name, ':'); if (ptr) { /* Remove screen number information from server name */ ptr = strchr(ptr, '.'); if (ptr) *ptr = '\0'; } else { /* Assume sever id 0 if none given */ sprintf(server_name + strlen(server_name), ":0"); } /* open an X Display connection to that X server */ display = XOpenDisplay(server_name); if (!display) { if (error_dialog) { error_msg(ctk_framelock, "Unable " "to add devices to frame lock group\n\nUnable to " "connect to X Display '%s'.", server_name); } else { nv_error_msg("Unable to add devices to frame lock group; unable " "to connect to X Display '%s'.", server_name); } goto done; } /* create a new NV-CONTROL handle */ handle = NvCtrlAttributeInit(display, NV_CTRL_TARGET_TYPE_X_SCREEN, DefaultScreen(display), NV_CTRL_ATTRIBUTES_NV_CONTROL_SUBSYSTEM); if (!handle) { if (error_dialog) { error_msg(ctk_framelock, "Unable " "to add devices to frame lock group\n\nUnable to " "create NV-CONTROL handle."); } else { nv_error_msg("Unable to add devices to frame lock group; unable " "create NV-CONTROL handle."); } goto done; } /* Try to prevent users from adding the same X server more than once */ if (get_server_id(handle, &server_id) && server_id != -1 && find_server_by_id(ctk_framelock->tree, server_id)) { if (error_dialog) { error_msg(ctk_framelock, "Unable to add X server " "to frame lock Group\n\n" "The X server %s already belongs to the frame lock " "Group.", server_name); } else { nv_error_msg("Unable to add X server to frame lock group; " "the X server %s already belongs to the " "frame lock group.", server_name); } goto done; } /* Add frame lock devices found on server */ add_framelock_devices(ctk_framelock, handle, server_id); if (!ctk_framelock->tree || !((nvListTreePtr)(ctk_framelock->tree))->nentries) { if (error_dialog) { error_msg(ctk_framelock, "No frame lock devices " "found on server.\n\n" "This X Server does not support frame lock or " "no frame lock devices were available."); } else { nv_error_msg("No frame lock devices found on server; " "This X Server does not support frame lock or " "no frame lock devices were available."); } goto done; } /* Align the list entry titles */ list_tree_align_titles((nvListTreePtr)(ctk_framelock->tree)); /* Fall through */ done: if (server_name) { free(server_name); } if (handle) { NvCtrlAttributeClose(handle); } return; } /** add_entry_to_parsed_attributes() ********************************* * * Adds information regarding a list entry (GPU or Frame Lock device) * to the parsed attribute list. * */ #define __ADD_ATTR(ATTR,VAL) \ a.display = display_name; \ a.target_type = target_type; \ a.target_id = target_id; \ a.attr = (ATTR); \ a.val.i = (VAL); \ a.display_device_mask = 0; \ a.flags |= NV_PARSER_HAS_TARGET; \ nv_parsed_attribute_add(head, &a); static void add_entry_to_parsed_attributes(nvListEntryPtr entry, ParsedAttribute *head) { ParsedAttribute a; char *display_name = NULL; int target_type = 0; int target_id = 0; if (!entry) { return; } memset(&a, 0, sizeof(a)); switch (entry->data_type) { case ENTRY_DATA_FRAMELOCK: { int use_house_sync; nvFrameLockDataPtr data = (nvFrameLockDataPtr)(entry->data); display_name = NvCtrlGetDisplayName(data->handle); target_type = NV_CTRL_TARGET_TYPE_FRAMELOCK; target_id = NvCtrlGetTargetId(data->handle); NvCtrlGetAttribute(data->handle, NV_CTRL_USE_HOUSE_SYNC, &use_house_sync); __ADD_ATTR(NV_CTRL_USE_HOUSE_SYNC, use_house_sync); /* If use house sync is enabled, also save other house sync info */ if (use_house_sync) { int sync_interval; int sync_edge; int video_mode; NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_SYNC_INTERVAL, &sync_interval); NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_POLARITY, &sync_edge); NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_VIDEO_MODE, &video_mode); __ADD_ATTR(NV_CTRL_FRAMELOCK_SYNC_INTERVAL, sync_interval); __ADD_ATTR(NV_CTRL_FRAMELOCK_POLARITY, sync_edge); __ADD_ATTR(NV_CTRL_FRAMELOCK_VIDEO_MODE, video_mode); } if (display_name) { free(display_name); } } break; case ENTRY_DATA_GPU: /* Nothing to save for GPU targets */ break; case ENTRY_DATA_DISPLAY: { nvDisplayDataPtr data = (nvDisplayDataPtr)(entry->data); int config; ReturnStatus ret; display_name = NvCtrlGetDisplayName(data->handle); ret = NvCtrlGetAttribute(data->handle, NV_CTRL_FRAMELOCK_DISPLAY_CONFIG, &config); if (ret != NvCtrlSuccess) { config = NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_DISABLED; } target_type = NV_CTRL_TARGET_TYPE_DISPLAY; target_id = NvCtrlGetTargetId(data->handle); __ADD_ATTR(NV_CTRL_FRAMELOCK_DISPLAY_CONFIG, config); } break; default: /* Oops */ break; } } #undef __ADD_ATTR /** add_entries_to_parsed_attributes() ******************************* * * Adds GPU settings for server/clients to the parsed attribute * list. * */ static void add_entries_to_parsed_attributes(nvListEntryPtr entry, ParsedAttribute *head) { if (!entry) { return; } add_entry_to_parsed_attributes(entry, head); add_entries_to_parsed_attributes(entry->children, head); add_entries_to_parsed_attributes(entry->next_sibling, head); } /* ctk_framelock_config_file_attributes() **************************** * * Add to the ParsedAttribute list any attributes that we want saved * in the config file. * * This includes all the clients/server display configurations for all * GPUs and the house sync settings of the selected master frame lock * device. * */ void ctk_framelock_config_file_attributes(GtkWidget *w, ParsedAttribute *head) { CtkFramelock *ctk_framelock = (CtkFramelock *) w; /* Add attributes from all the list entries */ add_entries_to_parsed_attributes (((nvListTreePtr)(ctk_framelock->tree))->entries, head); /* Save the frame lock server's house sync settings */ add_entry_to_parsed_attributes (get_framelock_server_entry((nvListTreePtr)(ctk_framelock->tree)), head); } /** apply_parsed_attribute_list() *********************************** * * Given a list of parsed attributes from the config file, add all * X Servers (and their devices) that have to do with frame lock * to the current frame lock group. * */ static void apply_parsed_attribute_list(CtkFramelock *ctk_framelock, ParsedAttribute *list) { ParsedAttribute *p; char *server_name = NULL; /* Add frame lock devices for all servers */ for (p = list; p && p->next; p = p->next) { if (server_name) { free(server_name); } server_name = nv_standardize_screen_name(p->display, -2); if (!server_name) continue; /* Not a frame lock attribute */ if (!(p->flags & NV_PARSER_TYPE_FRAMELOCK)) continue; /* Server already added */ if (find_server_by_name ((nvListTreePtr)(ctk_framelock->tree), server_name)) continue; /* Add all the devices from this attribute's server */ add_devices(ctk_framelock, server_name, FALSE); } if (server_name) { free(server_name); } } /** ctk_framelock_create_help() ************************************** * * Function to create the frame lock help page. * */ GtkTextBuffer *ctk_framelock_create_help(GtkTextTagTable *table) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "Frame Lock Help"); ctk_help_para(b, &i, "The frame lock control page provides a way to " "manage an entire cluster of workstations in a frame lock " "group."); /* Quadro Sync Frame Help */ ctk_help_heading(b, &i, "Quadro Sync Section"); ctk_help_para(b, &i, "The Quadro Sync section allows you to configure the " "individual devices that make up the frame lock group."); ctk_help_heading(b, &i, "Quadro Sync Device Entry Information"); ctk_help_para(b, &i, "Quadro Sync (frame lock board) device entries " "display the following information:"); ctk_help_para(b, &i, "The X server name and Quadro Sync board ID."); ctk_help_para(b, &i, "Receiving LED: This indicates whether the frame " "lock board is receiving a sync pulse. Green means a " "signal is detected; red means a signal is not detected. " "The sync pulse can come from one of the following sources: " "The House Sync signal, an external signal from another " "frame lock device coming into Port0/Port1, or the internal " "timing from the primary GPU's display device"); ctk_help_para(b, &i, "Rate Information: This is the sync rate that the " "frame lock board is receiving."); ctk_help_para(b, &i, "House LED: This indicates whether the frame lock " "board is receiving synchronization from the house (BNC) " "connector. This LED mirrors the status of the BNC LED on " "the backplane of the frame lock board."); ctk_help_para(b, &i, "Port0, Port1 Images: These indicate the status of " "the RJ45 ports on the backplane of the frame lock board. " "Green LEDs indicate that the port is configured for " "input, while yellow LEDs indicate that the port is " "configured for output."); ctk_help_para(b, &i, "Delay Information: The sync delay (in microseconds) " "between the frame lock pulse and the GPU pulse."); ctk_help_heading(b, &i, "GPU Device Entry Information"); ctk_help_para(b, &i, "GPU Device entries display the GPU name and number " "of a GPU connected to a Quadro Sync device. Display " "devices driven by the GPU will be listed under this entry."); ctk_help_para(b, &i, "Timing LED: This indicates that the GPU " "is synchronized with the incoming timing signal from the " "Quadro Sync device"); ctk_help_heading(b, &i, "Display Device Entry Information"); ctk_help_para(b, &i, "Display Device entries display information and " "configuration options for configuring how the display " "device should behave in the frame lock group. Setting of " "options is only available while frame lock is disabled. " "The following options are available:"); ctk_help_para(b, &i, "%s", __server_checkbox_help); ctk_help_para(b, &i, "%s", __client_checkbox_help); ctk_help_para(b, &i, "Stereo LED: This indicates whether or not the " "display device is synced to the stereo signal coming from " "the Quadro Sync device. This LED is only available to " "display devices set as clients when frame lock is enabled. " "The Stereo LED is dependent on the parent GPU being in sync " "with the input timing signal."); ctk_help_heading(b, &i, "Adding Devices"); ctk_help_para(b, &i, "%s", __add_devices_button_help); ctk_help_para(b, &i, "If the X Server is remote, be sure you have " "configured remote access (via `xhost`, for example) " "such that you are allowed to establish a connection."); ctk_help_heading(b, &i, "Removing Devices"); ctk_help_para(b, &i, "%s", __remove_devices_button_help); /* House Sync Frame Help */ ctk_help_heading(b, &i, "House Sync Section"); ctk_help_para(b, &i, "The House Sync section allows you to configure " "the selected server Quadro Sync board for using an incoming " "house sync signal instead of internal GPU timings. This " "section is only accessible by selecting a server display " "device (See Display Device Information above."); ctk_help_heading(b, &i, "Use House Sync on Server"); ctk_help_para(b, &i, "%s", __use_house_sync_button_help); ctk_help_para(b, &i, "If this option is checked and no house signal " "is detected (House LED is red), the Quadro Sync device " "will fall back to using internal timings from the primary " "GPU."); ctk_help_heading(b, &i, "Sync Interval"); ctk_help_para(b, &i, "%s", __sync_interval_scale_help); ctk_help_heading(b, &i, "Sync Edge"); ctk_help_para(b, &i, "%s", __sync_edge_combo_help); ctk_help_para(b, &i, "Syncing to the rising (leading) edge should be " "suitable for bi-level and TTL signals. Syncing to the " "falling edge should be used for tri-level signals. " "Syncing to both edges should only be needed for TTL " "signals that have problems syncing to the rising edge " "only."); ctk_help_heading(b, &i, "Video Mode"); ctk_help_para(b, &i, "%s", __video_mode_help); ctk_help_heading(b, &i, "Video Mode Detect"); ctk_help_para(b, &i, "%s", __detect_video_mode_button_help); /* Button Help */ ctk_help_heading(b, &i, "Test Link"); ctk_help_para(b, &i, "Use this toggle button to enable testing of " "the cabling between all members of the frame lock group. " "This will cause all frame lock boards to receive a sync " "pulse, but the GPUs will not lock to the frame lock " "pulse. When Test Link is enabled, no other settings may " "be changed until you disable Test Link."); ctk_help_heading(b, &i, "Enable Frame Lock"); ctk_help_para(b, &i, "%s", __sync_enable_button_help); ctk_help_para(b, &i, "Only devices selected as clients or server will be " "enabled."); /* Misc Help */ ctk_help_heading(b, &i, "Miscellaneous"); ctk_help_para(b, &i, "The frame lock control page registers several " "timers that are executed periodically; these are listed " "in the 'Active Timers' section of the 'nvidia-settings " "Configuration' page. Most notably is the 'Frame Lock " "Connection Status' timer: this will poll all members of " "the frame lock group for status information."); ctk_help_finish(b); return b; } /** ctk_framelock_select() ******************************************* * * Callback function for when the frame lock page is being displayed * in the control panel. * */ void ctk_framelock_select(GtkWidget *w) { CtkFramelock *ctk_framelock = CTK_FRAMELOCK(w); /* Start the frame lock timers */ ctk_config_start_timer(ctk_framelock->ctk_config, (GSourceFunc) update_framelock_status, (gpointer) ctk_framelock); ctk_config_start_timer(ctk_framelock->ctk_config, (GSourceFunc) check_for_ethernet, (gpointer) ctk_framelock); } /** ctk_framelock_unselect() ***************************************** * * Callback function for when the frame lock page is no longer being * displayed by the control panel. (User clicked on another page.) * */ void ctk_framelock_unselect(GtkWidget *w) { CtkFramelock *ctk_framelock = CTK_FRAMELOCK(w); /* Stop the frame lock timers */ ctk_config_stop_timer(ctk_framelock->ctk_config, (GSourceFunc) update_framelock_status, (gpointer) ctk_framelock); ctk_config_stop_timer(ctk_framelock->ctk_config, (GSourceFunc) check_for_ethernet, (gpointer) ctk_framelock); } nvidia-settings/src/gtk+-2.x/ctkvdpau.h0000664000175000017500000000652312236467170020076 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2012 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_VDPAU_H__ #define __CTK_VDPAU_H__ #include "ctkevent.h" #include "ctkconfig.h" #include "vdpau/vdpau.h" #include "vdpau/vdpau_x11.h" G_BEGIN_DECLS #define CTK_TYPE_VDPAU (ctk_vdpau_get_type()) #define CTK_VDPAU(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_VDPAU, CtkVDPAU)) #define CTK_VDPAU_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_VDPAU, CtkVDPAUClass)) #define CTK_IS_VDPAU(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_VDPAU)) #define CTK_IS_VDPAU_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_VDPAU)) #define CTK_VDPAU_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_VDPAU, CtkVDPAUClass)) struct VDPAUDeviceImpl { VdpGetErrorString *GetErrorString; VdpGetProcAddress *GetProcAddress; VdpGetApiVersion *GetApiVersion; VdpGetInformationString *GetInformationString; VdpVideoSurfaceQueryCapabilities *VideoSurfaceQueryCapabilities; VdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities *VideoSurfaceQueryGetPutBitsYCbCrCapabilities; VdpOutputSurfaceQueryCapabilities *OutputSurfaceQueryCapabilities; VdpOutputSurfaceQueryGetPutBitsNativeCapabilities *OutputSurfaceQueryGetPutBitsNativeCapabilities; VdpOutputSurfaceQueryPutBitsYCbCrCapabilities *OutputSurfaceQueryPutBitsYCbCrCapabilities; VdpBitmapSurfaceQueryCapabilities *BitmapSurfaceQueryCapabilities; VdpDecoderQueryCapabilities *DecoderQueryCapabilities; VdpVideoMixerQueryFeatureSupport *VideoMixerQueryFeatureSupport; VdpVideoMixerQueryParameterSupport *VideoMixerQueryParameterSupport; VdpVideoMixerQueryAttributeSupport *VideoMixerQueryAttributeSupport; VdpVideoMixerQueryParameterValueRange *VideoMixerQueryParameterValueRange; VdpVideoMixerQueryAttributeValueRange *VideoMixerQueryAttributeValueRange; } VDPAUDeviceFunctions; /* Generic description structure */ typedef struct { const char *name; uint32_t id; uint32_t aux; /* optional extra parameter... */ } Desc; typedef struct _CtkVDPAU CtkVDPAU; typedef struct _CtkVDPAUClass CtkVDPAUClass; struct _CtkVDPAU { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; GtkWidget* notebook; GtkWidget* surfaceVbox; GtkWidget* baseInfoVbox; }; struct _CtkVDPAUClass { GtkVBoxClass parent_class; }; GType ctk_vdpau_get_type (void) G_GNUC_CONST; GtkWidget* ctk_vdpau_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *); GtkTextBuffer* ctk_vdpau_create_help (GtkTextTagTable *, CtkVDPAU *); G_END_DECLS #endif /* __CTK_VDPAU_H__ */ nvidia-settings/src/gtk+-2.x/ctkscale.c0000664000175000017500000002077012236467170020041 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "ctkscale.h" #include static void ctk_scale_finalize(GObject *object); static void ctk_scale_init(CtkScaleClass *ctk_object_class); enum { PROP_0, PROP_GTK_ADJUSTMENT, PROP_LABEL }; GType ctk_scale_get_type( void ) { static GType ctk_scale_type = 0; if (!ctk_scale_type) { static const GTypeInfo ctk_scale_info = { sizeof (CtkScaleClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ctk_scale_init, /* class_init, */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkScale), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_scale_type = g_type_register_static (GTK_TYPE_VBOX, "CtkScale", &ctk_scale_info, 0); } return ctk_scale_type; } static void ctk_scale_init(CtkScaleClass *ctk_object_class) { GObjectClass *gobject_class = (GObjectClass *)ctk_object_class; gobject_class->finalize = ctk_scale_finalize; } static void ctk_scale_finalize(GObject *object) { CtkScale *ctk_scale = CTK_SCALE(object); g_signal_handlers_disconnect_matched(G_OBJECT(ctk_scale->ctk_config), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, (gpointer) G_OBJECT(ctk_scale)); } /* * ctk_scale_key_event() - GTK's default handling of the up/down keys * for hscale widgets is odd, so override it: the up key and the page * up key increase the adjustment value; similarly, the down key and * the page down key decrease the adjustment value. */ static gboolean ctk_scale_key_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { CtkScale *ctk_scale = CTK_SCALE(user_data); GdkEventKey *key_event = (GdkEventKey *) event; GtkAdjustment *adjustment = GTK_ADJUSTMENT(ctk_scale->gtk_adjustment); gdouble newval; switch (key_event->keyval) { case GDK_Left: case GDK_KP_Left: case GDK_Down: case GDK_KP_Down: newval = adjustment->value - adjustment->step_increment; break; case GDK_Right: case GDK_KP_Right: case GDK_Up: case GDK_KP_Up: newval = adjustment->value + adjustment->step_increment; break; case GDK_Page_Down: case GDK_KP_Page_Down: newval = adjustment->value - adjustment->page_increment; break; case GDK_Page_Up: case GDK_KP_Page_Up: newval = adjustment->value + adjustment->page_increment; break; default: return FALSE; } gtk_adjustment_set_value(adjustment, newval); return TRUE; } static void adjustment_value_changed( GtkAdjustment *adjustment, gpointer user_data ) { CtkScale *ctk_scale = CTK_SCALE(user_data); gchar text[7]; switch (ctk_scale->value_type) { case G_TYPE_INT: g_snprintf(text, 6, "%d", (gint) adjustment->value); break; case G_TYPE_DOUBLE: default: g_snprintf(text, 6, "%2.3f", adjustment->value); break; } gtk_entry_set_text(GTK_ENTRY(ctk_scale->text_entry), text); } static void text_entry_activate( GtkEntry *entry, gpointer user_data ) { CtkScale *ctk_scale = CTK_SCALE(user_data); gdouble newval = g_strtod(gtk_entry_get_text(entry), NULL); gtk_adjustment_set_value(ctk_scale->gtk_adjustment, newval); } /* * text_entry_toggled() - */ static void text_entry_toggled(CtkConfig *ctk_config, gpointer user_data) { CtkScale *ctk_scale = CTK_SCALE(user_data); if (ctk_config_slider_text_entry_shown(ctk_config)) { if (!ctk_scale->text_entry_packed) { gtk_container_add(GTK_CONTAINER(ctk_scale->text_entry_container), ctk_scale->text_entry); } gtk_widget_show(ctk_scale->text_entry); ctk_scale->text_entry_packed = TRUE; } else { if (ctk_scale->text_entry_packed) { gtk_container_remove (GTK_CONTAINER(ctk_scale->text_entry_container), ctk_scale->text_entry); } gtk_widget_hide(ctk_scale->text_entry); ctk_scale->text_entry_packed = FALSE; } } /* text_entry_toggled() */ /* * ctk_scale_new() - constructor for the Scale widget */ GtkWidget* ctk_scale_new(GtkAdjustment *gtk_adjustment, const gchar *label_text, CtkConfig *ctk_config, gint value_type) { GObject *object; CtkScale *ctk_scale; GtkWidget *label; GtkWidget *frame; GtkWidget *hbox; g_return_val_if_fail(GTK_IS_ADJUSTMENT(gtk_adjustment), NULL); g_return_val_if_fail(label_text != NULL, NULL); /* create and initialize the object */ object = g_object_new(CTK_TYPE_SCALE, NULL); ctk_scale = CTK_SCALE(object); ctk_scale->gtk_adjustment = gtk_adjustment; ctk_scale->label = label_text; ctk_scale->ctk_config = ctk_config; ctk_scale->value_type = value_type; gtk_box_set_spacing (GTK_BOX (object), 2); /* scale label */ label = gtk_label_new(ctk_scale->label); gtk_box_pack_start(GTK_BOX (object), label, FALSE, FALSE, 0); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); /* frame around slider and text box */ frame = gtk_frame_new(NULL); gtk_box_pack_start(GTK_BOX(object), frame, TRUE, TRUE, 0); ctk_scale->tooltip_widget = frame; /* hbox to contain slider and text box */ hbox = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(ctk_scale->tooltip_widget), hbox); /* text entry */ ctk_scale->text_entry = gtk_entry_new_with_max_length(6); gtk_entry_set_width_chars(GTK_ENTRY(ctk_scale->text_entry), 6); /* text entry container */ ctk_scale->text_entry_container = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(ctk_scale->text_entry_container), GTK_SHADOW_NONE); gtk_container_set_border_width (GTK_CONTAINER(ctk_scale->text_entry_container), 0); gtk_container_add(GTK_CONTAINER(ctk_scale->text_entry_container), ctk_scale->text_entry); ctk_scale->text_entry_packed = TRUE; g_object_ref(G_OBJECT(ctk_scale->text_entry)); gtk_box_pack_start(GTK_BOX(hbox), ctk_scale->text_entry_container, FALSE, FALSE, 0); text_entry_toggled(ctk_scale->ctk_config, (gpointer) ctk_scale); /* wire up the adjustment events */ adjustment_value_changed(ctk_scale->gtk_adjustment, G_OBJECT(ctk_scale)); g_signal_connect(G_OBJECT(ctk_scale->gtk_adjustment), "value_changed", G_CALLBACK(adjustment_value_changed), (gpointer) ctk_scale); g_signal_connect(G_OBJECT(ctk_scale->text_entry), "activate", G_CALLBACK(text_entry_activate), (gpointer) ctk_scale); g_signal_connect(G_OBJECT(ctk_config), "slider_text_entry_toggled", G_CALLBACK(text_entry_toggled), (gpointer) ctk_scale); /* the slider */ ctk_scale->gtk_scale = gtk_hscale_new(GTK_ADJUSTMENT(ctk_scale->gtk_adjustment)); gtk_scale_set_draw_value(GTK_SCALE(ctk_scale->gtk_scale), FALSE); gtk_scale_set_digits(GTK_SCALE(ctk_scale->gtk_scale), 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_scale->gtk_scale, TRUE, TRUE, 3); g_signal_connect(ctk_scale->gtk_scale, "key_press_event", G_CALLBACK(ctk_scale_key_event), G_OBJECT(ctk_scale)); return GTK_WIDGET (object); } /* ctk_scale_new() */ nvidia-settings/src/gtk+-2.x/ctkconfig.h0000664000175000017500000000754112236467170020225 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * The CtkConfig widget controls configuration options of the control * panel itself (rather than configuration options of the NVIDIA * X/GLX driver). */ #ifndef __CTK_CONFIG_H__ #define __CTK_CONFIG_H__ #include #include "config-file.h" G_BEGIN_DECLS #define CTK_TYPE_CONFIG (ctk_config_get_type()) #define CTK_CONFIG(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_CONFIG, CtkConfig)) #define CTK_CONFIG_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_CONFIG, CtkConfigClass)) #define CTK_IS_CONFIG(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_CONFIG)) #define CTK_IS_CONFIG_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_CONFIG)) #define CTK_CONFIG_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_CONFIG, CtkConfigClass)) typedef struct _CtkConfig CtkConfig; typedef struct _CtkConfigClass CtkConfigClass; typedef struct _CtkStatusBar CtkStatusBar; typedef struct _CtkToolTips CtkToolTips; struct _CtkStatusBar { GtkWidget *widget; guint prev_message_id; // determines if ctk_config_statusbar_message() will update the statusbar gboolean enabled; }; struct _CtkToolTips { GtkTooltips *object; }; struct _CtkConfig { GtkVBox parent; CtkStatusBar status_bar; CtkToolTips tooltips; GtkListStore *list_store; ConfigProperties *conf; GtkWidget *timer_list; GtkWidget *timer_list_box; GtkWidget *button_save_rc; GtkWidget *rc_file_selector; gboolean timer_list_visible; CtrlHandles *pCtrlHandles; GList *help_data; }; struct _CtkConfigClass { GtkVBoxClass parent_class; }; GType ctk_config_get_type (void) G_GNUC_CONST; GtkWidget* ctk_config_new (ConfigProperties *, CtrlHandles*); void ctk_config_statusbar_message (CtkConfig *, const char *, ...) NV_ATTRIBUTE_PRINTF(2, 3); GtkWidget* ctk_config_get_statusbar (CtkConfig *); void ctk_config_set_tooltip (CtkConfig *, GtkWidget *, const gchar *); GtkTextBuffer *ctk_config_create_help (CtkConfig *, GtkTextTagTable *); void ctk_config_add_timer(CtkConfig *, guint, gchar *, GSourceFunc, gpointer); void ctk_config_remove_timer(CtkConfig *, GSourceFunc); void ctk_config_start_timer(CtkConfig *, GSourceFunc, gpointer); void ctk_config_stop_timer(CtkConfig *, GSourceFunc, gpointer); gboolean ctk_config_slider_text_entry_shown(CtkConfig *); void ctk_config_set_tooltip_and_add_help_data(CtkConfig *config, GtkWidget *widget, GList **help_data_list, const gchar *label, const gchar *help_text, const gchar *extended_help_text); // Helper functions for other components which use CtkStatusBar void ctk_statusbar_init(CtkStatusBar *status_bar); void ctk_statusbar_message(CtkStatusBar *status_bar, const gchar *str); void ctk_statusbar_clear(CtkStatusBar *status_bar); G_END_DECLS #endif /* __CTK_CONFIG_H__ */ nvidia-settings/src/gtk+-2.x/ctk3dvisionpro.h0000664000175000017500000001126612236467170021236 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2010 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_3D_VISION_PRO_H__ #define __CTK_3D_VISION_PRO_H__ #include "parse.h" #include "ctkevent.h" #include "ctkconfig.h" #define NUM_GLASSES_INFO_ATTRIBS 2 #define GLASSES_NAME_MAX_LENGTH 128 G_BEGIN_DECLS #define CTK_TYPE_3D_VISION_PRO (ctk_3d_vision_pro_get_type()) #define CTK_3D_VISION_PRO(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), CTK_TYPE_3D_VISION_PRO, \ Ctk3DVisionPro)) #define CTK_3D_VISION_PRO_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), CTK_TYPE_3D_VISION_PRO, \ Ctk3DVisionProClass)) #define CTK_IS_3D_VISION_PRO(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj), CTK_TYPE_3D_VISION_PRO)) #define CTK_IS_3D_VISION_PRO_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE((klass), CTK_TYPE_3D_VISION_PRO)) #define CTK_3D_VISION_PRO_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS((obj), CTK_TYPE_3D_VISION_PRO, \ Ctk3DVisionProClass)) typedef struct _Ctk3DVisionPro Ctk3DVisionPro; typedef struct _Ctk3DVisionProClass Ctk3DVisionProClass; typedef enum { SVP_SHORT_RANGE = 1, SVP_MEDIUM_RANGE, SVP_LONG_RANGE } SVP_RANGE; typedef struct GlassesInfoRec { unsigned int glasses_id; char name[GLASSES_NAME_MAX_LENGTH]; int battery; GtkWidget *label[NUM_GLASSES_INFO_ATTRIBS]; GtkWidget *hbox[NUM_GLASSES_INFO_ATTRIBS]; GtkWidget *image; } GlassesInfo; typedef struct HtuInfoRec { SVP_RANGE channel_range; int channel_num; int signal_strength; guint num_glasses; GlassesInfo** glasses_info; struct HtuInfoRec *next; } HtuInfo; typedef struct WidgetSizeRec { GtkWidget *widget; int width; } WidgetSize; typedef struct GlassesInfoTableRec { WidgetSize glasses_header_sizes[NUM_GLASSES_INFO_ATTRIBS]; GtkWidget *data_table; GtkWidget *data_viewport, *full_viewport; GtkWidget *vscrollbar, *hscrollbar; int rows; int columns; } GlassesInfoTable; typedef struct _AddGlassesDlg { GtkWidget *parent; GtkWidget *dlg_add_glasses; GlassesInfo** glasses_info; GlassesInfoTable table; int new_glasses; Bool in_pairing; int pairing_attempts; } AddGlassesDlg; struct _Ctk3DVisionPro { GtkVBox parent; NvCtrlAttributeHandle *handle; GtkWindow *parent_wnd; CtkConfig *ctk_config; GtkWidget *menu; guint num_htu; HtuInfo** htu_info; GlassesInfoTable table; GtkLabel *glasses_num_label; GtkWidget *identify_button; GtkWidget *refresh_button; GtkWidget *rename_button; GtkWidget *remove_button; GtkLabel *channel_num_label; GtkLabel *signal_strength_label; GtkWidget *signal_strength_image; AddGlassesDlg *add_glasses_dlg; }; struct _Ctk3DVisionProClass { GtkVBoxClass parent_class; void (*changed) (Ctk3DVisionPro *); }; GType ctk_3d_vision_pro_get_type (void) G_GNUC_CONST; GtkWidget* ctk_3d_vision_pro_new (NvCtrlAttributeHandle *, CtkConfig *, ParsedAttribute *, CtkEvent *); GtkTextBuffer *ctk_3d_vision_pro_create_help (GtkTextTagTable *); void ctk_3d_vision_pro_select (GtkWidget *w); void ctk_3d_vision_pro_unselect (GtkWidget *w); void ctk_3d_vision_pro_config_file_attributes(GtkWidget *w, ParsedAttribute *head); G_END_DECLS #endif /* __CTK_3D_VISION_PRO_H__ */ nvidia-settings/src/gtk+-2.x/ctkapcrulemodel.h0000664000175000017500000000626112236467170021432 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2013 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // Tree model implementation for operating on rules in an AppProfileConfig #ifndef __CTK_APC_RULE_MODEL_H__ #define __CTK_APC_RULE_MODEL_H__ #include #include #include "app-profiles.h" G_BEGIN_DECLS #define CTK_TYPE_APC_RULE_MODEL (ctk_apc_rule_model_get_type()) #define CTK_APC_RULE_MODEL(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_APC_RULE_MODEL, CtkApcRuleModel)) #define CTK_APC_RULE_MODEL_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_APC_RULE_MODEL, CtkApcRuleModelClass)) #define CTK_IS_APC_RULE_MODEL(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_APC_RULE_MODEL)) #define CTK_IS_APC_RULE_MODEL_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_APC_RULE_MODEL)) #define CTK_APC_RULE_MODEL_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_APC_RULE_MODEL, CtkApcRuleModelClass)) enum { CTK_APC_RULE_MODEL_COL_ID = 0, CTK_APC_RULE_MODEL_COL_FEATURE, CTK_APC_RULE_MODEL_COL_MATCHES, CTK_APC_RULE_MODEL_COL_PROFILE_NAME, CTK_APC_RULE_MODEL_COL_FILENAME, CTK_APC_RULE_MODEL_N_COLUMNS }; typedef struct _CtkApcRuleModel CtkApcRuleModel; typedef struct _CtkApcRuleModelClass CtkApcRuleModelClass; struct _CtkApcRuleModel { GObject parent; gint stamp; AppProfileConfig *config; // A sortable array of rule IDs (int) cached from the config, // used for presentation and iteration. GArray *rules; }; struct _CtkApcRuleModelClass { GObjectClass parent_class; }; GType ctk_apc_rule_model_class_get_type (void) G_GNUC_CONST; CtkApcRuleModel *ctk_apc_rule_model_new (AppProfileConfig *config); int ctk_apc_rule_model_create_rule(CtkApcRuleModel *rule_model, const char *filename, json_t *new_rule); void ctk_apc_rule_model_update_rule(CtkApcRuleModel *rule_model, const char *filename, int id, json_t *rule); void ctk_apc_rule_model_delete_rule(CtkApcRuleModel *rule_model, int id); void ctk_apc_rule_model_set_abs_rule_priority(CtkApcRuleModel *rule_model, int id, size_t pri); void ctk_apc_rule_model_change_rule_priority(CtkApcRuleModel *rule_model, int id, int delta); void ctk_apc_rule_model_attach(CtkApcRuleModel *rule_model, AppProfileConfig *config); G_END_DECLS #endif nvidia-settings/src/gtk+-2.x/ctkappprofile.c0000664000175000017500000050001512236467170021106 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2013 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #define _GNU_SOURCE #include #include #include #include #include #include #include "ctkutils.h" #include "ctkbanner.h" #include "ctkhelp.h" #include "ctkappprofile.h" #include "common-utils.h" #include "msg.h" #define UPDATE_RULE_LABEL "Update Rule" #define UPDATE_PROFILE_LABEL "Update Profile" #define STATUSBAR_UPDATE_WARNING "This will take effect after changes are saved." enum { PROFILE_SETTING_GL_FSAA_MODE, PROFILE_SETTING_GL_LOG_MAX_ANISO, PROFILE_SETTING_GL_NO_DSO_FINALIZER, PROFILE_SETTING_GL_SINGLE_THREADED, PROFILE_SETTING_GL_SYNC_DISPLAY_DEVICE, PROFILE_SETTING_GL_SYNC_TO_VBLANK, PROFILE_SETTING_GL_SORT_FBCONFIGS, PROFILE_SETTING_GL_ALLOW_UNOFFICIAL_PROTOCOL, PROFILE_SETTING_GL_SELINUX_BOOLEANS, PROFILE_SETTING_GL_SHADER_DISK_CACHE, PROFILE_SETTING_GL_SHADER_DISK_CACHE_PATH, PROFILE_SETTING_GL_YIELD, PROFILE_SETTING_GL_THREADED_OPTIMIZATIONS, PROFILE_SETTING_GL_DOOM3, PROFILE_SETTING_GL_EXTENSION_STRING_VERSION, NUM_PROFILE_SETTINGS }; static const char *profile_setting_keys[] = { "GLFSAAMode", // PROFILE_SETTING_GL_FSAA_MODE "GLLogMaxAniso", // PROFILE_SETTING_GL_LOG_MAX_ANISO "GLNoDsoFinalizer", // PROFILE_SETTING_GL_NO_DSO_FINALIZER "GLSingleThreaded", // PROFILE_SETTING_GL_SINGLE_THREADED "GLSyncDisplayDevice", // PROFILE_SETTING_GL_SYNC_DISPLAY_DEVICE "GLSyncToVblank", // PROFILE_SETTING_GL_SYNC_TO_VBLANK "GLSortFbconfigs", // PROFILE_SETTING_GL_SORT_FBCONFIGS "GLAllowUnofficialProtocol", // PROFILE_SETTING_GL_ALLOW_UNOFFICIAL_PROTOCOL "GLSELinuxBooleans", // PROFILE_SETTING_GL_SELINUX_BOOLEANS "GLShaderDiskCache", // PROFILE_SETTING_GL_SHADER_DISK_CACHE "GLShaderDiskCachePath", // PROFILE_SETTING_GL_SHADER_DISK_CACHE_PATH "GLYield", // PROFILE_SETTING_GL_YIELD "GLThreadedOptimizations", // PROFILE_SETTING_GL_THREADED_OPTIMIZATIONS "GLDoom3", // PROFILE_SETTING_GL_DOOM3 "GLExtensionStringVersion" // PROFILE_SETTING_GL_EXTENSION_STRING_VERSION }; /* * XXX: it might be a good idea to generate some of these descriptions * dynamically based on other tables used by nvidia-settings */ static const char *profile_setting_descriptions[] = { // PROFILE_SETTING_GL_FSAA_MODE "This setting enables full-scene antialiasing in a process using OpenGL. This expects " "the same integer value that can be used to configure FSAA through nvidia-settings " "and the NV-CONTROL X extension. To see available FSAA values, run:\n\n" "\tnvidia-settings --query=fsaa --verbose", // PROFILE_SETTING_GL_LOG_MAX_ANISO "This enables anisotropic texture filtering. The possible values are:\n\n" "\t0\tNo anisotropic filtering\n" "\t1\t2x anisotropic filtering\n" "\t2\t4x anisotropic filtering\n" "\t3\t8x anisotropic filtering\n" "\t4\t16x anisotropic filtering", // PROFILE_SETTING_GL_NO_DSO_FINALIZER "This works around problems with certain multithreaded applications in which " "one thread exits while others are executing OpenGL code. This may be set to true or false.", // PROFILE_SETTING_GL_SINGLE_THREADED "This works around some legacy dynamic loaders which can cause applications linked against pthreads " "which dlopen() libGL multiple times to crash. This may be set to true or false. ", // PROFILE_SETTING_GL_SYNC_DISPLAY_DEVICE "This allows an application to specify target a display device to sync with if sync to vblank is enabled. " "This should be set to a string containing a valid display device name (for example, \"CRT-1\").", // PROFILE_SETTING_GL_SYNC_TO_VBLANK "This enables sync to vblank for an application. This may be set to true or false. ", // PROFILE_SETTING_GL_SORT_FBCONFIGS "By default the NVIDIA GLX implementation will sort FBConfigs as described by the specification. This " "may be set to false to disable this behavior.", // PROFILE_SETTING_GL_ALLOW_UNOFFICIAL_PROTOCOL "Setting this to true will allow the client-side NVIDIA GLX implementation to send \"incomplete\" GLX protocol.", // PROFILE_SETTING_GL_SELINUX_BOOLEANS "This allows the user to override driver detection of specific SELinux policy booleans, which may " "work around problems when running the driver under SELinux in permissive mode. This should be set to a " "string value; see __GL_SELINUX_BOOLEANS in the README for a description of legal string formats.", // PROFILE_SETTING_GL_SHADER_DISK_CACHE "This enables the shader disk cache for direct rendering. This value may be set to true or false.", // PROFILE_SETTING_GL_SHADER_DISK_CACHE_PATH "This setting affects where shader caches are stored on disk for a given application. " "This value should be set to a string containing a valid pathname.", // PROFILE_SETTING_GL_YIELD "This controls how the NVIDIA graphics driver will perform a yield. This may be set to one of the following strings:\n\n" "\t\"USLEEP\"\tOpenGL will call usleep(0) to yield\n" "\t\"NOTHING\"\tOpenGL will never yield\n" "\t\tOpenGL will call sched_yield() to yield (default)", // PROFILE_SETTING_GL_THREADED_OPTIMIZATIONS "This setting enables multi-threaded optimizations in the OpenGL driver which may improve application performance. " "This may be set to true or false.", // PROFILE_SETTING_GL_DOOM3 "This enables optimal SLI and Multi-GPU settings for games such as Doom 3 and Quake 4. " "This may be set to true or false.", // PROFILE_SETTING_GL_EXTENSION_STRING_VERSION "This forces the extension string returned by glXQueryExtensionsString() to one that appeared in an earlier " "version of the NVIDIA graphics driver. This may work around bugs in certain applications which expect an extension " "string to be smaller than a certain size. This value should be set to a string value or integer containing the " "desired version number (e.g. \"17700\" to force the extension string in the 177.* driver series).", }; enum { RULE_FEATURE_PROCNAME, RULE_FEATURE_DSO, RULE_FEATURE_TRUE, NUM_RULE_FEATURES }; static const char *rule_feature_label_strings[] = { "Process Name (procname)", // RULE_FEATURE_PROCNAME "Shared Object Name (dso)", // RULE_FEATURE_DSO "Always Applies (true)" // RULE_FEATURE_TRUE }; static const char *rule_feature_identifiers[] = { "procname", // RULE_FEATURE_PROCNAME "dso", // RULE_FEATURE_DSO "true" // RULE_FEATURE_TRUE }; #define MATCHES_INPUT_DESCRIPTION "\"Matches this string...\" text entry box" static const char *rule_feature_help_text[] = { "Patterns using this feature compare the string provided by the " MATCHES_INPUT_DESCRIPTION " " "against the pathname of the current process with the leading directory components removed, " "and match if they are equal.", // RULE_FEATURE_PROCNAME "Patterns using this feature compare the string provided by the " MATCHES_INPUT_DESCRIPTION " " "against the list of currently loaded libraries in the current process, and match if " "the string matches one of the entries in the list (with leading directory components removed).", // RULE_FEATURE_DSO "Patterns using this feature will always match the process, regardless of the " "contents of the string specified in the " MATCHES_INPUT_DESCRIPTION ".", // RULE_FEATURE_TRUE }; enum { SETTING_LIST_STORE_COL_SETTING, SETTING_LIST_STORE_NUM_COLS, }; /* * Struct containing metadata on widgets created via * populate_{toolbar,tree_view}(). */ typedef struct _WidgetDataItem { gchar *label; GtkWidget *widget; guint flags; } WidgetDataItem; /* * Template used to construct toolbar buttons and generate help text with populate_toolbar(). */ typedef struct _ToolbarItemTemplate { const gchar *text; const gchar *icon_id; GCallback callback; gpointer user_data; guint flags; const gchar *help_text; const gchar *extended_help_text; } ToolbarItemTemplate; #define TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED (1 << 0) /* * Template used to construct tree view columns and generate help text with * populate_tree_view(). */ typedef struct _TreeViewColumnTemplate { const gchar *title; GtkTreeCellDataFunc renderer_func; gpointer func_data; const gchar *attribute; gint attr_col; gint min_width; gboolean sortable; gint sort_column_id; gboolean editable; GCallback edit_callback; const gchar *help_text; const gchar *extended_help_text; } TreeViewColumnTemplate; #if JSON_INTEGER_IS_LONG_LONG # define JSON_INTEGER_HEX_FORMAT "llx" #else # define JSON_INTEGER_HEX_FORMAT "lx" #endif /* * Function prototypes */ static void app_profile_class_init(CtkAppProfileClass *ctk_object_class); static void app_profile_finalize(GObject *object); static void edit_rule_dialog_destroy(EditRuleDialog *dialog); static void edit_profile_dialog_destroy(EditProfileDialog *dialog); static void save_app_profile_changes_dialog_destroy(SaveAppProfileChangesDialog *dialog); /* * Get a UTF8 bullet string suitable for printing */ static const char *get_bullet(void) { gint len; static gboolean initialized = FALSE; static gchar bullet[8]; // Convert unicode "bullet" character into a UTF8 string if (!initialized) { len = g_unichar_to_utf8(0x2022, bullet); bullet[len] = '\0'; initialized = TRUE; } return bullet; } static char *vmarkup_string(const char *s, gboolean add_markup, const char *tag, va_list ap) { char *escaped_s; GString *tagged_str; char *tagged_s_return; char *attrib, *attrib_val; if (!add_markup) { return strdup(s); } tagged_str = g_string_new(""); escaped_s = g_markup_escape_text(s, -1); g_string_append_printf(tagged_str, "<%s ", tag); do { attrib = va_arg(ap, char *); if (attrib) { attrib_val = va_arg(ap, char *); g_string_append_printf(tagged_str, "%s=\"%s\"", attrib, attrib_val); } } while (attrib); g_string_append_printf(tagged_str, ">%s", escaped_s, tag); tagged_s_return = strdup(tagged_str->str); g_string_free(tagged_str, TRUE); free(escaped_s); return tagged_s_return; } static char *markup_string(const char *s, gboolean add_markup, const char *tag, ...) { char *tagged_s; va_list ap; va_start(ap, tag); tagged_s = vmarkup_string(s, add_markup, tag, ap); va_end(ap); return tagged_s; } GType ctk_app_profile_get_type(void) { static GType ctk_app_profile_type = 0; if (!ctk_app_profile_type) { static const GTypeInfo ctk_app_profile_info = { sizeof (CtkAppProfileClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) app_profile_class_init, /* constructor */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkAppProfile), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_app_profile_type = g_type_register_static(GTK_TYPE_VBOX, "CtkAppProfile", &ctk_app_profile_info, 0); } return ctk_app_profile_type; } /* ctk_app_profile_get_type() */ static void app_profile_class_init(CtkAppProfileClass *ctk_object_class) { GObjectClass *gobject_class = G_OBJECT_CLASS(ctk_object_class); gobject_class->finalize = app_profile_finalize; } static void app_profile_finalize(GObject *object) { CtkAppProfile *ctk_app_profile = CTK_APP_PROFILE(object); edit_rule_dialog_destroy(ctk_app_profile->edit_rule_dialog); edit_profile_dialog_destroy(ctk_app_profile->edit_profile_dialog); save_app_profile_changes_dialog_destroy(ctk_app_profile->save_app_profile_changes_dialog); ctk_help_data_list_free_full(ctk_app_profile->global_settings_help_data); ctk_help_data_list_free_full(ctk_app_profile->rules_help_data); ctk_help_data_list_free_full(ctk_app_profile->rules_columns_help_data); ctk_help_data_list_free_full(ctk_app_profile->profiles_help_data); ctk_help_data_list_free_full(ctk_app_profile->profiles_columns_help_data); ctk_help_data_list_free_full(ctk_app_profile->save_reload_help_data); } static void button_set_label_and_stock_icon(GtkButton *button, const gchar *label_text, const gchar *icon_id) { GtkWidget *hbox; GtkWidget *icon; GtkWidget *label; GtkWidget *button_child; hbox = gtk_hbox_new(FALSE, 0); icon = gtk_image_new_from_stock(icon_id, GTK_ICON_SIZE_SMALL_TOOLBAR); label = gtk_label_new(label_text); gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); button_child = gtk_bin_get_child(GTK_BIN(button)); if (button_child) { gtk_container_remove(GTK_CONTAINER(button), button_child); } gtk_widget_show_all(GTK_WIDGET(hbox)); gtk_container_add(GTK_CONTAINER(button), hbox); } static gint find_widget_in_widget_data_list_cb(gconstpointer a, gconstpointer b) { const WidgetDataItem *item = (const WidgetDataItem *)a; const char *label = (const char *)b; return strcmp(item->label, label); } static GtkWidget *find_widget_in_widget_data_list(GList *list, const char *label) { GList *list_item; WidgetDataItem *item; list_item = g_list_find_custom(list, (gconstpointer)label, find_widget_in_widget_data_list_cb); assert(list_item); item = (WidgetDataItem *)list_item->data; return item->widget; } static void widget_data_list_free_cb(gpointer data, gpointer user_data) { WidgetDataItem *item = (WidgetDataItem *)data; free(item->label); // Don't free item->widget; it's owned by its parent widget free(item); } static void widget_data_list_free_full(GList *list) { g_list_foreach(list, widget_data_list_free_cb, NULL); g_list_free(list); } static void tree_view_cursor_changed_toolbar_item_ghost(GtkTreeView *tree_view, gpointer user_data) { GtkTreePath *path; GtkWidget *widget = (GtkWidget *)user_data; gtk_tree_view_get_cursor(tree_view, &path, NULL); if (path) { gtk_widget_set_sensitive(widget, TRUE); } else { gtk_widget_set_sensitive(widget, FALSE); } gtk_tree_path_free(path); } /* Simple helper function to fill a toolbar with buttons from a table */ static void populate_toolbar(GtkToolbar *toolbar, const ToolbarItemTemplate *item, size_t num_items, GList **help_data, GList **widget_data, GtkTreeView *selection_tree_view) { WidgetDataItem *widget_data_item; GtkWidget *widget; GtkWidget *icon; if (help_data) { *help_data = NULL; } if (widget_data) { *widget_data = NULL; } while (num_items--) { if (item->icon_id) { icon = gtk_image_new_from_stock(item->icon_id, GTK_ICON_SIZE_SMALL_TOOLBAR); } else { icon = NULL; } widget = gtk_toolbar_append_item(toolbar, item->text, item->help_text, NULL, icon, item->callback, item->user_data); if (help_data) { ctk_help_data_list_prepend(help_data, item->text, item->help_text, item->extended_help_text); } if (widget_data) { widget_data_item = malloc(sizeof(WidgetDataItem)); widget_data_item->label = strdup(item->text); widget_data_item->widget = widget; *widget_data = g_list_prepend(*widget_data, widget_data_item); } if (item->flags & TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED) { assert(selection_tree_view); g_signal_connect(G_OBJECT(selection_tree_view), "cursor-changed", G_CALLBACK(tree_view_cursor_changed_toolbar_item_ghost), (gpointer)widget); tree_view_cursor_changed_toolbar_item_ghost(selection_tree_view, (gpointer)widget); } item++; } if (help_data) { *help_data = g_list_reverse(*help_data); } if (widget_data) { *widget_data = g_list_reverse(*widget_data); } } typedef struct CellRendererRegisterKeyDataRec { GtkTreeView *tree_view; } CellRendererRegisterKeyData; static void destroy_cell_renderer_register_key_data(gpointer data, GClosure *closure) { free((CellRendererRegisterKeyData *)data); } static void tree_view_get_cursor_path_and_column_idx(GtkTreeView *tree_view, GtkTreePath **path, gint *column_idx, gint *column_count) { GtkTreeViewColumn *focus_column; GList *column_list, *column_in_list; column_list = gtk_tree_view_get_columns(tree_view); gtk_tree_view_get_cursor(tree_view, path, &focus_column); // Lame... column_in_list = g_list_find(column_list, focus_column); *column_idx = g_list_position(column_list, column_in_list); *column_count = g_list_length(column_list); g_list_free(column_list); } static void cell_renderer_editable(gpointer data, gpointer user_data) { gboolean this_editable; GtkCellRenderer *renderer = GTK_CELL_RENDERER(data); gboolean *editable = (gboolean *)user_data; if (*editable) { return; } g_object_get(G_OBJECT(renderer), "editable", &this_editable, NULL); if (this_editable) { *editable = TRUE; } } static gboolean tree_view_column_is_editable(GtkTreeViewColumn *tree_column) { gboolean editable = FALSE; GList *renderers = gtk_tree_view_column_get_cell_renderers(tree_column); g_list_foreach(renderers, cell_renderer_editable, &editable); return editable; } static gboolean cell_renderer_widget_key_press_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { CellRendererRegisterKeyData *data = (CellRendererRegisterKeyData *)user_data; GtkTreeView *tree_view; GtkTreeModel *tree_model; GdkEventKey *key_event; gint column_idx, column_count; GtkTreeViewColumn *column; GtkTreePath *path; gint depth, *indices, row_idx; gint row_count; gint dx, dy; if (event->type == GDK_KEY_PRESS) { key_event = (GdkEventKey *)event; dx = dy = 0; if ((key_event->keyval == GDK_Tab) || (key_event->keyval == GDK_ISO_Left_Tab)) { dx = (key_event->state & GDK_SHIFT_MASK) ? -1 : 1; } else if (key_event->keyval == GDK_Up) { dy = -1; } else if ((key_event->keyval == GDK_Down) || (key_event->keyval == GDK_Return)) { dy = 1; } if (dx || dy) { assert(!dx || !dy); tree_view = data->tree_view; tree_model = gtk_tree_view_get_model(tree_view); row_count = gtk_tree_model_iter_n_children(tree_model, NULL); // Done editing this cell gtk_cell_editable_editing_done(GTK_CELL_EDITABLE(widget)); gtk_cell_editable_remove_widget(GTK_CELL_EDITABLE(widget)); // Get currently highlighted row tree_view_get_cursor_path_and_column_idx(tree_view, &path, &column_idx, &column_count); depth = gtk_tree_path_get_depth(path); assert(depth == 1); (void)depth; indices = gtk_tree_path_get_indices(path); row_idx = indices[0]; gtk_tree_path_free(path); if (dx) { do { column_idx += dx; assert(column_count >= 1); if (column_idx < 0) { // go to previous row, if possible row_idx--; column_idx = column_count - 1; } else if (column_idx >= column_count) { // go to next row, if possible row_idx++; column_idx = 0; } column = gtk_tree_view_get_column(tree_view, column_idx); } while (!tree_view_column_is_editable(column) && (row_idx >= 0) && (row_idx < row_count)); } else { row_idx += dy; column = gtk_tree_view_get_column(tree_view, column_idx); } if ((row_idx >= 0) && (row_idx < row_count)) { path = gtk_tree_path_new(); gtk_tree_path_append_index(path, row_idx); gtk_tree_view_set_cursor(tree_view, path, column, TRUE); gtk_tree_path_free(path); } return TRUE; } } // Use default handlers return FALSE; } static gboolean cell_renderer_widget_focus_out_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { // Done editing this cell gtk_cell_editable_editing_done(GTK_CELL_EDITABLE(widget)); gtk_cell_editable_remove_widget(GTK_CELL_EDITABLE(widget)); // Use default handlers return FALSE; } static void cell_renderer_register_key_shortcuts(GtkCellRenderer *renderer, GtkCellEditable *editable, gchar *path, gpointer user_data) { if (GTK_IS_WIDGET(editable)) { GtkWidget *widget = GTK_WIDGET(editable); g_signal_connect(G_OBJECT(widget), "key-press-event", G_CALLBACK(cell_renderer_widget_key_press_event), user_data); g_signal_connect(G_OBJECT(widget), "focus-out-event", G_CALLBACK(cell_renderer_widget_focus_out_event), user_data); } else { // XXX implement other types? } } /* Simple helper function to fill a tree view with text columns */ static void populate_tree_view(GtkTreeView *tree_view, const TreeViewColumnTemplate *column_template, CtkAppProfile *ctk_app_profile, size_t num_columns, GList **help_data) { GtkCellRenderer *cell_renderer; GtkTreeViewColumn *tree_view_column; GtkWidget *label; if (help_data) { *help_data = NULL; } while (num_columns--) { cell_renderer = gtk_cell_renderer_text_new(); tree_view_column = gtk_tree_view_column_new(); label = gtk_label_new(column_template->title); if (column_template->help_text) { ctk_config_set_tooltip(ctk_app_profile->ctk_config, label, column_template->help_text); } // Necessary since the label isn't part of the CtkAppProfile's hierarchy gtk_widget_show(label); gtk_tree_view_column_set_widget(tree_view_column, label); gtk_tree_view_column_pack_start(tree_view_column, cell_renderer, FALSE); if (column_template->renderer_func) { assert(!column_template->attribute); gtk_tree_view_column_set_cell_data_func(tree_view_column, cell_renderer, column_template->renderer_func, column_template->func_data, NULL); } else { gtk_tree_view_column_add_attribute(tree_view_column, cell_renderer, column_template->attribute, column_template->attr_col); assert(column_template->attribute); } if (column_template->min_width > 0) { gtk_tree_view_column_set_min_width(tree_view_column, column_template->min_width); } if (column_template->sortable) { gtk_tree_view_column_set_sort_column_id(tree_view_column, column_template->sort_column_id); } if (column_template->editable) { CellRendererRegisterKeyData *rk_data = malloc(sizeof(CellRendererRegisterKeyData)); rk_data->tree_view = tree_view; g_object_set(G_OBJECT(cell_renderer), "editable", TRUE, NULL); g_signal_connect(G_OBJECT(cell_renderer), "edited", column_template->edit_callback, column_template->func_data); // Generic code to implement navigating between fields with // tab/shift-tab. The "editing-started" signal is only available // in GTK+ versions >= 2.6. if (ctk_check_min_gtk_version(2, 6, 0)) { g_signal_connect_data(G_OBJECT(cell_renderer), "editing-started", G_CALLBACK(cell_renderer_register_key_shortcuts), (gpointer)rk_data, destroy_cell_renderer_register_key_data, 0); } } if (help_data) { ctk_help_data_list_prepend(help_data, column_template->title, column_template->help_text, column_template->extended_help_text); } gtk_tree_view_append_column(tree_view, tree_view_column); column_template++; } if (help_data) { *help_data = g_list_reverse(*help_data); } } static void rule_order_renderer_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { char *markup; GtkTreePath *path; gint *indices, depth; path = gtk_tree_model_get_path(model, iter); indices = gtk_tree_path_get_indices(path); depth = gtk_tree_path_get_depth(path); assert(depth == 1); (void)depth; markup = nvasprintf("%d", indices[0] + 1); g_object_set(cell, "markup", markup, NULL); free(markup); gtk_tree_path_free(path); } static void rule_pattern_renderer_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { char *feature, *matches; char *feature_plain; char *feature_markup; char *matches_markup; char *markup; gtk_tree_model_get(model, iter, CTK_APC_RULE_MODEL_COL_FEATURE, &feature, CTK_APC_RULE_MODEL_COL_MATCHES, &matches, -1); feature_plain = nvasprintf("[%s]", feature); feature_markup = markup_string(feature_plain, TRUE, "span", "color", "#444411", "style", "italic", NULL); matches_markup = g_markup_escape_text(matches, -1); markup = nvstrcat(feature_markup, " ", matches_markup, NULL); g_object_set(cell, "markup", markup, NULL); free(markup); free(feature_markup); free(matches_markup); free(feature_plain); free(feature); free(matches); } static inline void setting_get_key_value(const json_t *setting, char **key, char **value, gboolean add_markup) { json_t *json_value; const char *plain_key; char *plain_value; if (key) { plain_key = json_string_value(json_object_get(setting, "key")); *key = markup_string(plain_key, add_markup, "span", "color", "#000033", NULL); } if (value) { json_value = json_object_get(setting, "value"); switch(json_typeof(json_value)) { case JSON_STRING: case JSON_TRUE: case JSON_FALSE: case JSON_REAL: plain_value = json_dumps(json_value, JSON_ENCODE_ANY); break; case JSON_INTEGER: // Prefer hex to integer values plain_value = nvasprintf("0x%" JSON_INTEGER_HEX_FORMAT, json_integer_value(json_value)); break; default: plain_value = strdup("?"); assert(0); } *value = markup_string(plain_value, add_markup, "span", "color", "#003300", NULL); free(plain_value); } } char *serialize_settings(const json_t *settings, gboolean add_markup) { char *old_markup, *markup; char *one_setting, *value; char *key; json_t *setting; size_t i, size; if (!settings) { return markup_string("(no such profile)", add_markup, "span", "color", "#555555", NULL); } old_markup = strdup(""); for (i = 0, size = json_array_size(settings); i < size; i++) { if (i != 0) { markup = nvstrcat(old_markup, ", ", NULL); free(old_markup); old_markup = markup; } setting = json_array_get(settings, i); setting_get_key_value(setting, &key, &value, add_markup); one_setting = nvasprintf("%s=%s", key, value); markup = nvstrcat(old_markup, one_setting, NULL); free(one_setting); free(key); free(value); free(old_markup); old_markup = markup; } return old_markup; } static void rule_profile_settings_renderer_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { CtkAppProfile *ctk_app_profile = (CtkAppProfile *)data; char *settings_string; const json_t *profile; char *profile_name; json_t *settings; gtk_tree_model_get(model, iter, CTK_APC_RULE_MODEL_COL_PROFILE_NAME, &profile_name, -1); profile = ctk_apc_profile_model_get_profile(ctk_app_profile->apc_profile_model, profile_name); settings = json_object_get(profile, "settings"); settings_string = serialize_settings(settings, TRUE); g_object_set(cell, "markup", settings_string, NULL); free(settings_string); free(profile_name); } static void increase_rule_priority_callback(GtkWidget *widget, gpointer user_data) { GtkTreeViewColumn *focus_column; GtkTreeIter iter; GtkTreePath *path; CtkAppProfile *ctk_app_profile = (CtkAppProfile *)user_data; GValue id = G_VALUE_INIT; // Get currently highlighted row gtk_tree_view_get_cursor(ctk_app_profile->main_rule_view, &path, &focus_column); if (!path) { return; } if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(ctk_app_profile->apc_rule_model), &iter, path)) { return; } gtk_tree_model_get_value(GTK_TREE_MODEL(ctk_app_profile->apc_rule_model), &iter, CTK_APC_RULE_MODEL_COL_ID, &id); // Increment the row ctk_apc_rule_model_change_rule_priority(ctk_app_profile->apc_rule_model, g_value_get_int(&id), -1); ctk_config_statusbar_message(ctk_app_profile->ctk_config, "Priority of rule increased. %s", STATUSBAR_UPDATE_WARNING); gtk_tree_path_free(path); g_value_unset(&id); } static void decrease_rule_priority_callback(GtkWidget *widget, gpointer user_data) { GtkTreeViewColumn *focus_column; GtkTreeIter iter; GtkTreePath *path; CtkAppProfile *ctk_app_profile = (CtkAppProfile *)user_data; GValue id = G_VALUE_INIT; // Get currently highlighted row gtk_tree_view_get_cursor(ctk_app_profile->main_rule_view, &path, &focus_column); if (!path) { return; } if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(ctk_app_profile->apc_rule_model), &iter, path)) { return; } gtk_tree_model_get_value(GTK_TREE_MODEL(ctk_app_profile->apc_rule_model), &iter, CTK_APC_RULE_MODEL_COL_ID, &id); // Decrement the row ctk_apc_rule_model_change_rule_priority(ctk_app_profile->apc_rule_model, g_value_get_int(&id), 1); ctk_config_statusbar_message(ctk_app_profile->ctk_config, "Priority of rule decreased. %s", STATUSBAR_UPDATE_WARNING); gtk_tree_path_free(path); g_value_unset(&id); } static void string_list_free_cb(gpointer data, gpointer user_data) { free(data); } static void string_list_free_full(GList *list) { g_list_foreach(list, string_list_free_cb, NULL); g_list_free(list); } static GList *get_source_filenames(CtkAppProfile *ctk_app_profile) { size_t i, size; json_t *json_filename, *json_filenames; GList *filenames = NULL; json_filenames = nv_app_profile_config_get_source_filenames(ctk_app_profile->cur_config); for (i = 0, size = json_array_size(json_filenames); i < size; i++) { json_filename = json_array_get(json_filenames, i); filenames = g_list_prepend(filenames, strdup(json_string_value(json_filename))); } filenames = g_list_reverse(filenames); json_decref(json_filenames); return filenames; } static gboolean append_profile_name(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { GList **profile_names = (GList **)data; gchar *profile_name; gtk_tree_model_get(model, iter, CTK_APC_PROFILE_MODEL_COL_NAME, &profile_name, -1); *profile_names = g_list_prepend(*profile_names, profile_name); return FALSE; } static GList *get_profile_names(CtkAppProfile *ctk_app_profile) { GList *profile_names = NULL; gtk_tree_model_foreach(GTK_TREE_MODEL(ctk_app_profile->apc_profile_model), append_profile_name, (gpointer)&profile_names); profile_names = g_list_reverse(profile_names); return profile_names; } static gboolean unref_setting_object(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { json_t *setting; gtk_tree_model_get(model, iter, SETTING_LIST_STORE_COL_SETTING, &setting, -1); json_decref(setting); return FALSE; } static void load_settings_from_profile(CtkAppProfile *ctk_app_profile, GtkListStore *list_store, const char *profile_name) { GtkTreeIter iter; size_t i, size; const json_t *profile; const json_t *settings; json_t *setting; gtk_tree_model_foreach(GTK_TREE_MODEL(list_store), unref_setting_object, NULL); gtk_list_store_clear(list_store); profile = ctk_apc_profile_model_get_profile(ctk_app_profile->apc_profile_model, profile_name); if (!profile) { return; } settings = json_object_get(profile, "settings"); if (!settings) { return; } for (i = 0, size = json_array_size(settings); i < size; i++) { setting = json_deep_copy(json_array_get(settings, i)); gtk_list_store_append(list_store, &iter); gtk_list_store_set(list_store, &iter, SETTING_LIST_STORE_COL_SETTING, setting, -1); } } static void edit_rule_dialog_load_profile(EditRuleDialog *dialog, const char *profile_name) { GList *strings; GtkCombo *combo; // profile name combo = GTK_COMBO(dialog->profile_name_combo); strings = get_profile_names(CTK_APP_PROFILE(dialog->parent)); gtk_combo_set_popdown_strings(combo, strings); if (!profile_name) { if (g_list_length(strings)) { // Choose first string in the list g_string_assign(dialog->profile_name, (gchar *)strings->data); } else { g_string_assign(dialog->profile_name, ""); } } else { g_string_assign(dialog->profile_name, profile_name); } gtk_entry_set_text(GTK_ENTRY(combo->entry), dialog->profile_name->str); string_list_free_full(strings); // profile settings load_settings_from_profile(CTK_APP_PROFILE(dialog->parent), dialog->profile_settings_store, dialog->profile_name->str); } static void edit_rule_dialog_load_values(EditRuleDialog *dialog) { GList *strings; GtkCombo *combo; char *profile_name_copy; // window title gtk_window_set_title(GTK_WINDOW(dialog->top_window), dialog->new_rule ? "Add new rule" : "Edit existing rule"); // add/edit button button_set_label_and_stock_icon(GTK_BUTTON(dialog->add_edit_rule_button), "Update Rule", dialog->new_rule ? GTK_STOCK_ADD : GTK_STOCK_PREFERENCES); // source file combo = GTK_COMBO(dialog->source_file_combo); strings = get_source_filenames(CTK_APP_PROFILE(dialog->parent)); gtk_combo_set_popdown_strings(combo, strings); if (dialog->new_rule) { if (g_list_length(strings)) { // Choose first string in the list g_string_assign(dialog->source_file, (gchar *)strings->data); } else { g_string_assign(dialog->source_file, ""); } } gtk_entry_set_text(GTK_ENTRY(combo->entry), dialog->source_file->str); string_list_free_full(strings); // feature and matches ctk_drop_down_menu_set_current_value(CTK_DROP_DOWN_MENU(dialog->feature_menu), dialog->feature); gtk_entry_set_text(dialog->matches_entry, dialog->matches->str); // profile name and settings profile_name_copy = dialog->new_rule ? NULL : strdup(dialog->profile_name->str); edit_rule_dialog_load_profile(dialog, profile_name_copy); free(profile_name_copy); } static void edit_rule_dialog_show(EditRuleDialog *dialog) { // Temporarily disable the "changed" signal to prevent races between // the update below and callbacks which fire when the window opens g_signal_handler_block(G_OBJECT(dialog->feature_menu), dialog->feature_changed_signal); g_signal_handler_block(G_OBJECT(GTK_COMBO(dialog->profile_name_combo)->entry), dialog->rule_profile_name_changed_signal); edit_rule_dialog_load_values(dialog); gtk_widget_show_all(dialog->top_window); g_signal_handler_unblock(G_OBJECT(dialog->feature_menu), dialog->feature_changed_signal); g_signal_handler_unblock(G_OBJECT(GTK_COMBO(dialog->profile_name_combo)->entry), dialog->rule_profile_name_changed_signal); // disable focusing to main window until this window closed gtk_window_set_transient_for(GTK_WINDOW(dialog->top_window), GTK_WINDOW(gtk_widget_get_toplevel(dialog->parent))); gtk_widget_set_sensitive(dialog->parent, FALSE); } static void add_rule_callback(GtkWidget *widget, gpointer user_data) { CtkAppProfile *ctk_app_profile = (CtkAppProfile *)user_data; EditRuleDialog *dialog = ctk_app_profile->edit_rule_dialog; dialog->new_rule = TRUE; dialog->rule_id = -1; g_string_assign(dialog->source_file, ""); dialog->feature = RULE_FEATURE_PROCNAME; g_string_assign(dialog->matches, ""); g_string_assign(dialog->profile_name, ""); edit_rule_dialog_show(dialog); } static gint parse_feature(const char *feature_str) { size_t i; for (i = 0; i < ARRAY_LEN(rule_feature_identifiers); i++) { if (!strcmp(feature_str, rule_feature_identifiers[i])) { return i; } } return 0; } static void edit_rule_callbacks_common(CtkAppProfile *ctk_app_profile, GtkTreePath *path) { EditRuleDialog *dialog = ctk_app_profile->edit_rule_dialog; gint id; gchar *feature, *matches, *profile_name, *filename; GtkTreeIter iter; if (!path) { return; } if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(ctk_app_profile->apc_rule_model), &iter, path)) { return; } gtk_tree_model_get(GTK_TREE_MODEL(ctk_app_profile->apc_rule_model), &iter, CTK_APC_RULE_MODEL_COL_ID, &id, CTK_APC_RULE_MODEL_COL_FEATURE, &feature, CTK_APC_RULE_MODEL_COL_MATCHES, &matches, CTK_APC_RULE_MODEL_COL_PROFILE_NAME, &profile_name, CTK_APC_RULE_MODEL_COL_FILENAME, &filename, -1); dialog->new_rule = FALSE; dialog->rule_id = id; g_string_assign(dialog->source_file, filename); dialog->feature = parse_feature(feature); g_string_assign(dialog->matches, matches); g_string_assign(dialog->profile_name, profile_name); edit_rule_dialog_show(dialog); free(filename); free(feature); free(matches); free(profile_name); } static void edit_rule_callback(GtkWidget *widget, gpointer user_data) { GtkTreeViewColumn *focus_column; GtkTreePath *path; CtkAppProfile *ctk_app_profile = (CtkAppProfile *)user_data; // Get currently highlighted row gtk_tree_view_get_cursor(ctk_app_profile->main_rule_view, &path, &focus_column); edit_rule_callbacks_common(ctk_app_profile, path); gtk_tree_path_free(path); } static void choose_next_row_in_list_view(GtkTreeView *tree_view, GtkTreeModel *tree_model, GtkTreePath **path) { gint num_rows; gint depth, *indices; num_rows = gtk_tree_model_iter_n_children(tree_model, NULL); depth = gtk_tree_path_get_depth(*path); indices = gtk_tree_path_get_indices(*path); assert(depth == 1); (void)depth; if ((num_rows > 0) && (indices[0] == num_rows)) { // Choose the previous row instead of the current one gtk_tree_path_free(*path); *path = gtk_tree_path_new(); gtk_tree_path_append_index(*path, num_rows - 1); } } static void delete_rule_callback_common(CtkAppProfile *ctk_app_profile) { GtkTreeViewColumn *focus_column; GtkTreeIter iter; GtkTreePath *path; gint id; // Get currently highlighted row gtk_tree_view_get_cursor(ctk_app_profile->main_rule_view, &path, &focus_column); if (!path) { return; } if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(ctk_app_profile->apc_rule_model), &iter, path)) { return; } gtk_tree_model_get(GTK_TREE_MODEL(ctk_app_profile->apc_rule_model), &iter, CTK_APC_RULE_MODEL_COL_ID, &id, -1); // Delete the row ctk_apc_rule_model_delete_rule(ctk_app_profile->apc_rule_model, id); // Select next rule in the list, if available choose_next_row_in_list_view(ctk_app_profile->main_rule_view, GTK_TREE_MODEL(ctk_app_profile->apc_rule_model), &path); gtk_tree_view_set_cursor(ctk_app_profile->main_rule_view, path, NULL, FALSE); ctk_config_statusbar_message(ctk_app_profile->ctk_config, "Rule deleted. %s", STATUSBAR_UPDATE_WARNING); gtk_tree_path_free(path); } static void delete_rule_callback(GtkWidget *widget, gpointer user_data) { CtkAppProfile *ctk_app_profile = (CtkAppProfile *)user_data; delete_rule_callback_common(ctk_app_profile); } static gboolean rules_tree_view_key_press_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { CtkAppProfile *ctk_app_profile = (CtkAppProfile *)user_data; GdkEventKey *key_event; if (event->type == GDK_KEY_PRESS) { key_event = (GdkEventKey *)event; if (key_event->keyval == GDK_Delete) { delete_rule_callback_common(ctk_app_profile); return TRUE; } } // Use default handlers return FALSE; } static gboolean rule_browse_button_clicked(GtkWidget *widget, gpointer user_data) { EditRuleDialog *dialog = (EditRuleDialog *)user_data; const gchar *filename = dialog->source_file->str; gint result; gtk_window_set_transient_for(GTK_WINDOW(dialog->file_sel), GTK_WINDOW(dialog->top_window)); gtk_file_selection_set_filename(GTK_FILE_SELECTION(dialog->file_sel), filename); result = gtk_dialog_run(GTK_DIALOG(dialog->file_sel)); switch (result) { case GTK_RESPONSE_ACCEPT: case GTK_RESPONSE_OK: filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(dialog->file_sel)); gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(dialog->source_file_combo)->entry), filename); default: break; } gtk_widget_hide(dialog->file_sel); return FALSE; } static gboolean profile_browse_button_clicked(GtkWidget *widget, gpointer user_data) { EditProfileDialog *dialog = (EditProfileDialog *)user_data; const gchar *filename = dialog->source_file->str; gint result; gtk_window_set_transient_for(GTK_WINDOW(dialog->file_sel), GTK_WINDOW(dialog->top_window)); gtk_file_selection_set_filename(GTK_FILE_SELECTION(dialog->file_sel), filename); result = gtk_dialog_run(GTK_DIALOG(dialog->file_sel)); switch (result) { case GTK_RESPONSE_ACCEPT: case GTK_RESPONSE_OK: filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(dialog->file_sel)); gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(dialog->source_file_combo)->entry), filename); default: break; } gtk_widget_hide(dialog->file_sel); return FALSE; } static const char __rule_pattern_help[] = "In this section, you write the pattern that will be used to determine whether " "the settings in this rule will apply to a given application."; static const char __rule_pattern_extended_help[] = "A pattern is comprised of two parts: a feature of the " "process which will be retrieved by the driver at runtime, and a string against " "which the driver will compare the feature and determine if there is a match. " "If the pattern matches, then the settings determined by the rule's associated " "profile will be applied to the process, assuming they don't conflict with " "settings determined by other matching rules with higher priority.\n\n" "See the \"Supported Features\" help section for a list of supported features."; static const char __rule_profile_help[] = "In this section, you choose the profile that will be applied if the rule's pattern " "matches a given process."; static const char __rule_profile_extended_help[] = "This section contains a drop-down box for choosing a profile name, and convenience " "buttons for modifying an existing profile or creating a new profile to be used by " "the rule. This section also has a table which lets you preview the settings that " "will be applied by the given profile. The table is read-only: to modify individual " "settings, click the \"Edit Profile\" button."; static void config_create_source_file_entry(CtkConfig *ctk_config, GtkWidget **pcontainer, GtkWidget **psource_file_combo, GList **help_data_list, const char *name, GCallback browse_button_clicked_callback, gpointer user_data) { GtkWidget *hbox; GtkWidget *label; GtkWidget *combo_box; GtkWidget *browse_button; GString *help_string; help_string = g_string_new(""); hbox = gtk_hbox_new(FALSE, 0); gtk_box_set_spacing(GTK_BOX(hbox), 4); label = gtk_label_new("Source File"); g_string_printf(help_string, "You can specify the source file where the %s is defined in this drop-down box.", name); ctk_config_set_tooltip_and_add_help_data(ctk_config, label, help_data_list, "Source File", help_string->str, NULL); combo_box = gtk_combo_new(); browse_button = gtk_button_new(); button_set_label_and_stock_icon(GTK_BUTTON(browse_button), "Browse...", GTK_STOCK_OPEN); g_string_printf(help_string, "Clicking this button opens a file selection dialog box which allows you to choose an " "appropriate configuration file for the %s.", name); ctk_config_set_tooltip_and_add_help_data(ctk_config, browse_button, help_data_list, "Browse...", help_string->str, NULL); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), combo_box, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), browse_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(browse_button), "clicked", browse_button_clicked_callback, user_data); *pcontainer = hbox; *psource_file_combo = combo_box; g_string_free(help_string, TRUE); } static void feature_changed(GtkWidget *widget, gpointer user_data) { EditRuleDialog *dialog = (EditRuleDialog *)user_data; dialog->feature = ctk_drop_down_menu_get_current_value(CTK_DROP_DOWN_MENU(dialog->feature_menu)); } static GtkWidget *create_feature_menu(EditRuleDialog *dialog) { size_t i; dialog->feature_menu = ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO); for (i = 0; i < NUM_RULE_FEATURES; i++) { ctk_drop_down_menu_append_item(CTK_DROP_DOWN_MENU(dialog->feature_menu), rule_feature_label_strings[i], i); } dialog->feature_changed_signal = g_signal_connect(G_OBJECT(dialog->feature_menu), "changed", G_CALLBACK(feature_changed), (gpointer)dialog); return dialog->feature_menu; } static void rule_profile_name_changed(GtkWidget *widget, gpointer user_data) { const char *profile_name; EditRuleDialog *dialog; dialog = (EditRuleDialog *)user_data; profile_name = gtk_entry_get_text(GTK_ENTRY(widget)); g_string_assign(dialog->profile_name, profile_name); load_settings_from_profile(CTK_APP_PROFILE(dialog->parent), dialog->profile_settings_store, profile_name); } typedef struct FindPathOfProfileParamsRec { const char *profile_name; // in GtkTreePath *path; // out } FindPathOfProfileParams; /* * find_path_of_profile() is a callback to gtk_tree_model_foreach which looks * through the CtkApcProfileModel for a profile with the given profile name. * For this to work properly, find_path_of_profile_params should be initialized * as follows before calling gtk_tree_model_foreach(): * profile_name: the name of the profile * path: NULL */ static gboolean find_path_of_profile(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { char *profile_name; FindPathOfProfileParams *find_path_of_profile_params = (FindPathOfProfileParams *)data; gtk_tree_model_get(model, iter, CTK_APC_PROFILE_MODEL_COL_NAME, &profile_name, -1); if (!strcmp(profile_name, find_path_of_profile_params->profile_name)) { find_path_of_profile_params->path = gtk_tree_path_copy(path); return TRUE; // Done } else { return FALSE; // Keep going } } static void edit_profile_callbacks_common(CtkAppProfile *ctk_app_profile, GtkTreePath *path, GtkWidget *caller); static void edit_profile_dialog_show(EditProfileDialog *dialog); static gboolean rule_profile_entry_edit_profile_button_clicked(GtkWidget *widget, gpointer user_data) { EditRuleDialog *rule_dialog = (EditRuleDialog *)user_data; CtkAppProfile *ctk_app_profile = CTK_APP_PROFILE(rule_dialog->parent); FindPathOfProfileParams find_path_of_profile_params; memset(&find_path_of_profile_params, 0, sizeof(FindPathOfProfileParams)); find_path_of_profile_params.profile_name = rule_dialog->profile_name->str; find_path_of_profile_params.path = NULL; gtk_tree_model_foreach(GTK_TREE_MODEL(ctk_app_profile->apc_profile_model), find_path_of_profile, &find_path_of_profile_params); edit_profile_callbacks_common(ctk_app_profile, find_path_of_profile_params.path, rule_dialog->top_window); gtk_tree_path_free(find_path_of_profile_params.path); return FALSE; } static void add_profile_callbacks_common(CtkAppProfile *ctk_app_profile, GtkWidget *caller); static gboolean rule_profile_entry_new_profile_button_clicked(GtkWidget *widget, gpointer user_data) { EditRuleDialog *rule_dialog = (EditRuleDialog *)user_data; CtkAppProfile *ctk_app_profile = CTK_APP_PROFILE(rule_dialog->parent); add_profile_callbacks_common(ctk_app_profile, rule_dialog->top_window); return FALSE; } static GtkWidget *create_rule_profile_name_entry(EditRuleDialog *dialog) { GtkWidget *hbox; GtkWidget *button; GtkWidget *label; GtkWidget *combo_box; hbox = gtk_hbox_new(FALSE, 8); label = gtk_label_new("Profile Name"); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); dialog->profile_name_combo = combo_box = gtk_combo_new(); gtk_box_pack_start(GTK_BOX(hbox), combo_box, TRUE, TRUE, 0); dialog->rule_profile_name_changed_signal = g_signal_connect(G_OBJECT(GTK_COMBO(combo_box)->entry), "changed", G_CALLBACK(rule_profile_name_changed), (gpointer)dialog); button = gtk_button_new_with_label("Edit Profile"); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(rule_profile_entry_edit_profile_button_clicked), (gpointer)dialog); button = gtk_button_new_with_label("New Profile"); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(rule_profile_entry_new_profile_button_clicked), (gpointer)dialog); return hbox; } static void setting_key_renderer_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { const char *key; json_t *setting; gtk_tree_model_get(model, iter, SETTING_LIST_STORE_COL_SETTING, &setting, -1); key = json_string_value(json_object_get(setting, "key")); g_object_set(cell, "text", key, NULL); } static void setting_type_renderer_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { const char *type = NULL; json_t *setting, *value; gtk_tree_model_get(model, iter, SETTING_LIST_STORE_COL_SETTING, &setting, -1); value = json_object_get(setting, "value"); switch(json_typeof(value)) { case JSON_STRING: type = "string"; break; case JSON_INTEGER: type = "int"; break; case JSON_REAL: type = "float"; break; case JSON_TRUE: case JSON_FALSE: type = "bool"; break; default: assert(0); } g_object_set(cell, "text", type, NULL); } static void setting_value_renderer_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { json_t *setting; char *value; gtk_tree_model_get(model, iter, SETTING_LIST_STORE_COL_SETTING, &setting, -1); setting_get_key_value(setting, NULL, &value, TRUE); g_object_set(cell, "markup", value, NULL); free(value); } static gboolean run_error_dialog(GtkWindow *window, GString *fatal_errors, GString *nonfatal_errors, const char *op_string) { GString *error_string; GtkWidget *error_dialog; gboolean success; gint result; if (!fatal_errors->len && !nonfatal_errors->len) { return TRUE; } error_string = g_string_new(""); if (fatal_errors->len) { g_string_append_printf(error_string, "nvidia-settings encountered the following configuration errors:\n\n" "%s\n", fatal_errors->str); } if (nonfatal_errors->len) { g_string_append_printf(error_string, "%snvidia-settings encountered the following configuration issues:\n\n" "%s\n", fatal_errors->len ? "Also, " : "", nonfatal_errors->str); } if (fatal_errors->len) { g_string_append_printf(error_string, "Please fix the configuration errors before attempting to %s.\n", op_string); } else { g_string_append_printf(error_string, "Continue to %s anyway?\n", op_string); } error_dialog = gtk_message_dialog_new(window, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, fatal_errors->len ? GTK_MESSAGE_ERROR : GTK_MESSAGE_QUESTION, fatal_errors->len ? GTK_BUTTONS_CLOSE : GTK_BUTTONS_YES_NO, "%s", error_string->str); result = gtk_dialog_run(GTK_DIALOG(error_dialog)); if (!fatal_errors->len) { success = (result == GTK_RESPONSE_YES); } else { success = FALSE; } gtk_widget_destroy(error_dialog); return success; } static inline gboolean check_valid_source_file(CtkAppProfile *ctk_app_profile, const char *source_file_str, char **reason) { return !!nv_app_profile_config_check_valid_source_file(ctk_app_profile->cur_config, source_file_str, reason); } // Check for inconsistencies and errors in the rule dialog box settings, // and warn the user if any are detected static gboolean edit_rule_dialog_validate(EditRuleDialog *dialog) { CtkAppProfile *ctk_app_profile = CTK_APP_PROFILE(dialog->parent); GString *fatal_errors; GString *nonfatal_errors; gboolean success; char *reason; fatal_errors = g_string_new(""); nonfatal_errors = g_string_new(""); if (!check_valid_source_file(ctk_app_profile, dialog->source_file->str, &reason)) { g_string_append_printf(fatal_errors, "%s\tThe source filename \"%s\" is not valid in this configuration " "because %s\n", get_bullet(), dialog->source_file->str, reason); free(reason); } if (!ctk_apc_profile_model_get_profile(ctk_app_profile->apc_profile_model, dialog->profile_name->str)) { g_string_append_printf(nonfatal_errors, "%s\tThe profile \"%s\" referenced by this rule does not exist.\n", get_bullet(), dialog->profile_name->str); } success = run_error_dialog(GTK_WINDOW(dialog->top_window), fatal_errors, nonfatal_errors, "save this rule"); g_string_free(fatal_errors, TRUE); g_string_free(nonfatal_errors, TRUE); return success; } static void edit_rule_dialog_save_changes(GtkWidget *widget, gpointer user_data) { EditRuleDialog *dialog = (EditRuleDialog *)user_data; CtkAppProfile *ctk_app_profile = CTK_APP_PROFILE(dialog->parent); GtkWidget *source_file_entry = GTK_COMBO(dialog->source_file_combo)->entry; json_t *rule_json = json_object(); json_t *pattern_json = json_object(); // Get the latest values from our widgets g_string_assign(dialog->matches, gtk_entry_get_text(GTK_ENTRY(dialog->matches_entry))); g_string_assign(dialog->source_file, gtk_entry_get_text(GTK_ENTRY(source_file_entry))); // Check for inconsistencies and errors if (!edit_rule_dialog_validate(dialog)) { return; } // Construct the update object json_object_set_new(pattern_json, "feature", json_string(rule_feature_identifiers[dialog->feature])); json_object_set_new(pattern_json, "matches", json_string(dialog->matches->str)); json_object_set_new(rule_json, "profile", json_string(dialog->profile_name->str)); json_object_set_new(rule_json, "pattern", pattern_json); // Update the rule in the configuration if (dialog->new_rule) { ctk_apc_rule_model_create_rule(ctk_app_profile->apc_rule_model, dialog->source_file->str, rule_json); } else { ctk_apc_rule_model_update_rule(ctk_app_profile->apc_rule_model, dialog->source_file->str, dialog->rule_id, rule_json); } json_decref(rule_json); // Close the window, and re-sensitize the parent gtk_widget_set_sensitive(dialog->parent, TRUE); gtk_widget_hide(dialog->top_window); ctk_config_statusbar_message(ctk_app_profile->ctk_config, "Rule updated. %s", STATUSBAR_UPDATE_WARNING); } static void edit_rule_dialog_cancel(GtkWidget *widget, gpointer user_data) { EditRuleDialog *dialog = (EditRuleDialog *)user_data; // Close the window, and re-sensitize the parent gtk_widget_set_sensitive(dialog->parent, TRUE); gtk_widget_hide(dialog->top_window); } static ToolbarItemTemplate *get_edit_rule_dialog_toolbar_items(EditRuleDialog *dialog, size_t *num_items) { ToolbarItemTemplate *items_copy; const ToolbarItemTemplate items[] = { { .text = UPDATE_RULE_LABEL, .help_text = "The Update Rule button allows you to save changes made to the rule definition.", .icon_id = GTK_STOCK_SAVE, .callback = G_CALLBACK(edit_rule_dialog_save_changes), .user_data = dialog, .flags = 0, }, { .text = "Cancel", .help_text = "The Cancel button allows you to discard any changes made to the rule definition.", .icon_id = GTK_STOCK_CANCEL, .callback = G_CALLBACK(edit_rule_dialog_cancel), .user_data = dialog, .flags = 0, } }; items_copy = malloc(sizeof(items)); memcpy(items_copy, items, sizeof(items)); *num_items = ARRAY_LEN(items); return items_copy; } static gboolean edit_rule_dialog_handle_delete(GtkWidget *widget, GdkEvent *event, gpointer user_data) { EditRuleDialog *dialog = (EditRuleDialog *)user_data; gtk_widget_set_sensitive(dialog->parent, TRUE); gtk_widget_hide(widget); return TRUE; } static EditRuleDialog* edit_rule_dialog_new(CtkAppProfile *ctk_app_profile) { ToolbarItemTemplate *edit_rule_dialog_toolbar_items; size_t num_edit_rule_dialog_toolbar_items; EditRuleDialog *dialog; GtkWidget *label; GtkWidget *container; GtkWidget *main_vbox, *vbox; GtkWidget *feature_menu, *profile_name_entry; GtkWidget *table; GtkWidget *frame; GtkWidget *entry; GtkWidget *tree_view; GtkWidget *toolbar; GtkWidget *alignment; GtkWidget *scroll_win; GList *toolbar_help_items; GList *toolbar_widget_items; const TreeViewColumnTemplate settings_tree_view_columns[] = { { .title = "Key", .renderer_func = setting_key_renderer_func, .func_data = NULL, .min_width = 200, .help_text = "Each entry in the \"Key\" column describes a key for a setting." }, { .title = "Type", .renderer_func = setting_type_renderer_func, .min_width = 100, .func_data = NULL, .help_text = "Each entry in the \"Type\" column describes the underlying JSON type for " "a setting value." }, { .title = "Value", .renderer_func = setting_value_renderer_func, .func_data = NULL, .help_text = "Each entry in the \"Value\" column describes the value of a setting." } }; dialog = malloc(sizeof(EditRuleDialog)); if (!dialog) { return NULL; } dialog->help_data = NULL; dialog->parent = GTK_WIDGET(ctk_app_profile); dialog->top_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_modal(GTK_WINDOW(dialog->top_window), TRUE); g_signal_connect(G_OBJECT(dialog->top_window), "delete-event", G_CALLBACK(edit_rule_dialog_handle_delete), dialog); dialog->source_file = g_string_new(""); dialog->feature = RULE_FEATURE_PROCNAME; dialog->matches = g_string_new(""); dialog->profile_name = g_string_new(""); dialog->profile_settings_store = gtk_list_store_new(SETTING_LIST_STORE_NUM_COLS, G_TYPE_POINTER); dialog->file_sel = gtk_file_selection_new("Please select a source file for the rule"); gtk_widget_set_size_request(dialog->top_window, 500, 480); gtk_container_set_border_width(GTK_CONTAINER(dialog->top_window), 8); main_vbox = gtk_vbox_new(FALSE, 0); gtk_box_set_spacing(GTK_BOX(main_vbox), 8); gtk_container_add(GTK_CONTAINER(dialog->top_window), main_vbox); config_create_source_file_entry(ctk_app_profile->ctk_config, &container, &dialog->source_file_combo, &dialog->help_data, "rule", G_CALLBACK(rule_browse_button_clicked), (gpointer)dialog); gtk_box_pack_start(GTK_BOX(main_vbox), container, FALSE, FALSE, 0); frame = gtk_frame_new("Rule Pattern"); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); label = gtk_frame_get_label_widget(GTK_FRAME(frame)); ctk_config_set_tooltip_and_add_help_data(ctk_app_profile->ctk_config, label, &dialog->help_data, "Rule Pattern", __rule_pattern_help, __rule_pattern_extended_help); // Add widgets to the "Rule Pattern" section vbox = gtk_vbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(vbox), 4); label = gtk_label_new("The following profile will be used if..."); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); table = gtk_table_new(2, 2, FALSE); label = gtk_label_new("This feature:"); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); feature_menu = create_feature_menu(dialog); gtk_table_attach_defaults(GTK_TABLE(table), feature_menu, 1, 2, 0, 1); label = gtk_label_new("Matches this string:"); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); entry = gtk_entry_new(); dialog->matches_entry = GTK_ENTRY(entry); gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 1, 2); gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(frame), vbox); gtk_box_pack_start(GTK_BOX(main_vbox), frame, FALSE, FALSE, 0); frame = gtk_frame_new("Rule Profile"); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); label = gtk_frame_get_label_widget(GTK_FRAME(frame)); ctk_config_set_tooltip_and_add_help_data(ctk_app_profile->ctk_config, label, &dialog->help_data, "Rule Profile", __rule_profile_help, __rule_profile_extended_help); vbox = gtk_vbox_new(FALSE, 8); gtk_container_set_border_width(GTK_CONTAINER(vbox), 8); profile_name_entry = create_rule_profile_name_entry(dialog); gtk_box_pack_start(GTK_BOX(vbox), profile_name_entry, FALSE, FALSE, 0); label = gtk_label_new("This profile will apply the following settings..."); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->profile_settings_store)); populate_tree_view(GTK_TREE_VIEW(tree_view), settings_tree_view_columns, ctk_app_profile, ARRAY_LEN(settings_tree_view_columns), NULL); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree_view), TRUE); scroll_win = gtk_scrolled_window_new(NULL, NULL); gtk_container_add(GTK_CONTAINER(scroll_win), tree_view); gtk_box_pack_start(GTK_BOX(vbox), scroll_win, TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(frame), vbox); gtk_box_pack_start(GTK_BOX(main_vbox), frame, TRUE, TRUE, 0); alignment = gtk_alignment_new(1.0, 0.5, 0.0, 0.0); toolbar = gtk_toolbar_new(); dialog->help_data = g_list_reverse(dialog->help_data); edit_rule_dialog_toolbar_items = get_edit_rule_dialog_toolbar_items(dialog, &num_edit_rule_dialog_toolbar_items); populate_toolbar(GTK_TOOLBAR(toolbar), edit_rule_dialog_toolbar_items, num_edit_rule_dialog_toolbar_items, &toolbar_help_items, &toolbar_widget_items, NULL); dialog->help_data = g_list_concat(dialog->help_data, toolbar_help_items); // Save off the "Update Rule" button for later use dialog->add_edit_rule_button = find_widget_in_widget_data_list(toolbar_widget_items, UPDATE_RULE_LABEL); widget_data_list_free_full(toolbar_widget_items); free(edit_rule_dialog_toolbar_items); gtk_container_add(GTK_CONTAINER(alignment), toolbar); gtk_box_pack_start(GTK_BOX(main_vbox), alignment, FALSE, FALSE, 0); return dialog; } static void edit_rule_dialog_destroy(EditRuleDialog *dialog) { g_string_free(dialog->source_file, TRUE); g_string_free(dialog->matches, TRUE); g_string_free(dialog->profile_name, TRUE); ctk_help_data_list_free_full(dialog->help_data); free(dialog); } static void edit_profile_dialog_settings_new_row(GtkTreeView *tree_view, GtkTreeModel *tree_model, GtkTreePath **path, GtkTreeViewColumn **column) { GtkTreeIter iter; json_t *setting = json_object(); json_object_set(setting, "key", json_string("")); json_object_set(setting, "value", json_false()); gtk_list_store_append(GTK_LIST_STORE(tree_model), &iter); gtk_list_store_set(GTK_LIST_STORE(tree_model), &iter, SETTING_LIST_STORE_COL_SETTING, setting, -1); *path = gtk_tree_model_get_path(tree_model, &iter); *column = gtk_tree_view_get_column(tree_view, 0); } static void edit_profile_dialog_add_setting(GtkWidget *widget, gpointer user_data) { EditProfileDialog *dialog = (EditProfileDialog *)user_data; GtkTreePath *path; GtkTreeViewColumn *column; edit_profile_dialog_settings_new_row(dialog->settings_view, GTK_TREE_MODEL(dialog->settings_store), &path, &column); gtk_widget_grab_focus(GTK_WIDGET(dialog->settings_view)); gtk_tree_view_set_cursor(dialog->settings_view, path, column, TRUE); gtk_tree_path_free(path); } static void edit_profile_dialog_delete_setting_common(EditProfileDialog *dialog) { GtkTreeIter iter; GtkTreePath *path; GtkTreeViewColumn *focus_column; // Set the focus to NULL to terminate any editing currently taking place // XXX: Since this row is about to be deleted, set the // setting_update_canceled flag to ensure that the model isn't saving // anything to this row and displaying bogus warnings to the user. dialog->setting_update_canceled = TRUE; gtk_window_set_focus(GTK_WINDOW(dialog->top_window), NULL); dialog->setting_update_canceled = FALSE; // Get currently highlighted row gtk_tree_view_get_cursor(dialog->settings_view, &path, &focus_column); if (!path) { return; } if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->settings_store), &iter, path)) { return; } // Delete the row gtk_list_store_remove(dialog->settings_store, &iter); // Select next setting in the list, if available choose_next_row_in_list_view(dialog->settings_view, GTK_TREE_MODEL(dialog->settings_store), &path); gtk_tree_view_set_cursor(dialog->settings_view, path, NULL, FALSE); gtk_tree_path_free(path); } static void edit_profile_dialog_delete_setting(GtkWidget *widget, gpointer user_data) { EditProfileDialog *dialog = (EditProfileDialog *)user_data; edit_profile_dialog_delete_setting_common(dialog); } static void edit_profile_dialog_edit_setting(GtkWidget *widget, gpointer user_data) { EditProfileDialog *dialog = (EditProfileDialog *)user_data; GtkTreePath *path; GtkTreeViewColumn *first_column; // Get currently highlighted row gtk_tree_view_get_cursor(dialog->settings_view, &path, NULL); if (!path) { return; } first_column = gtk_tree_view_get_column(dialog->settings_view, 0); assert(first_column); gtk_widget_grab_focus(GTK_WIDGET(dialog->settings_view)); gtk_tree_view_set_cursor(dialog->settings_view, path, first_column, TRUE); gtk_tree_path_free(path); } static gboolean append_setting(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { json_t *settings = (json_t *)data; json_t *setting; gtk_tree_model_get(model, iter, SETTING_LIST_STORE_COL_SETTING, &setting, -1); json_array_append(settings, setting); return FALSE; } static void edit_profile_dialog_update_settings(EditProfileDialog *dialog) { json_array_clear(dialog->settings); gtk_tree_model_foreach(GTK_TREE_MODEL(dialog->settings_store), append_setting, (gpointer)dialog->settings); } static gboolean widget_get_visible(GtkWidget *widget) { gboolean visible; g_object_get(G_OBJECT(widget), "visible", &visible, NULL); return visible; } static const gchar *get_canonical_setting_key(const gchar *key) { size_t i; for (i = 0; i < NUM_PROFILE_SETTINGS; i++) { if (!strcasecmp(key, profile_setting_keys[i])) { return profile_setting_keys[i]; } } return NULL; } static gboolean check_unrecognized_setting_keys(const json_t *settings) { const json_t *setting; const char *setting_key; size_t i, size; for (i = 0, size = json_array_size(settings); i < size; i++) { setting = json_array_get(settings, i); setting_key = json_string_value(json_object_get(setting, "key")); if (!get_canonical_setting_key(setting_key)) { return TRUE; } } return FALSE; } // Check for inconsistencies and errors in the profile dialog box settings, // and warn the user if any are detected static gboolean edit_profile_dialog_validate(EditProfileDialog *dialog) { CtkAppProfile *ctk_app_profile = CTK_APP_PROFILE(dialog->parent); GString *fatal_errors; GString *nonfatal_errors; gboolean success; char *reason; fatal_errors = g_string_new(""); nonfatal_errors = g_string_new(""); if (!strcmp(dialog->name->str, "")) { g_string_append_printf(nonfatal_errors, "%s\tThe profile name is empty.\n", get_bullet()); } if ((dialog->new_profile || strcmp(dialog->name->str, dialog->orig_name->str)) && ctk_apc_profile_model_get_profile(ctk_app_profile->apc_profile_model, dialog->name->str)) { if (dialog->new_profile) { g_string_append_printf(nonfatal_errors, "%s\tA profile with the name \"%s\" already exists and will be " "overwritten.\n", get_bullet(), dialog->name->str); } else { g_string_append_printf(nonfatal_errors, "%s\tRenaming this profile from \"%s\" to \"%s\" will " "overwrite an existing profile.\n", get_bullet(), dialog->orig_name->str, dialog->name->str); } } if (!check_valid_source_file(ctk_app_profile, dialog->source_file->str, &reason)) { g_string_append_printf(fatal_errors, "%s\tThe source filename \"%s\" is not valid in this configuration " "because %s\n", get_bullet(), dialog->source_file->str, reason); free(reason); } if (check_unrecognized_setting_keys(dialog->settings)) { g_string_append_printf(nonfatal_errors, "%s\tThis profile has settings with keys that may not be recognized " "by the NVIDIA graphics driver. Consult the on-line help for a list " "of valid keys.\n", get_bullet()); } success = run_error_dialog(GTK_WINDOW(dialog->top_window), fatal_errors, nonfatal_errors, "save this profile"); g_string_free(fatal_errors, TRUE); g_string_free(nonfatal_errors, TRUE); return success; } static void edit_profile_dialog_save_changes(GtkWidget *widget, gpointer user_data) { EditProfileDialog *profile_dialog = (EditProfileDialog *)user_data; EditRuleDialog *rule_dialog; CtkAppProfile *ctk_app_profile = CTK_APP_PROFILE(profile_dialog->parent); GtkWidget *source_file_entry = GTK_COMBO(profile_dialog->source_file_combo)->entry; json_t *profile_json = json_object(); GtkCombo *combo; GList *source_filenames; gboolean rules_fixed_up = FALSE; rule_dialog = ctk_app_profile->edit_rule_dialog; // Set the focus to NULL to terminate any editing currently taking place gtk_window_set_focus(GTK_WINDOW(profile_dialog->top_window), NULL); // Get the latest values from our widgets g_string_assign(profile_dialog->name, gtk_entry_get_text(GTK_ENTRY(profile_dialog->name_entry))); g_string_assign(profile_dialog->source_file, gtk_entry_get_text(GTK_ENTRY(source_file_entry))); edit_profile_dialog_update_settings(profile_dialog); // TODO delete any unset settings (nil key and value)? // Check for inconsistencies and errors if (!edit_profile_dialog_validate(profile_dialog)) { return; } // Construct the update object, using a deep copy of the settings array. json_object_set_new(profile_json, "settings", json_deep_copy(profile_dialog->settings)); // If this is an edit and the profile name changed, delete the old profile if (!profile_dialog->new_profile && strcmp(profile_dialog->name->str, profile_dialog->orig_name->str)) { ctk_apc_profile_model_delete_profile(ctk_app_profile->apc_profile_model, profile_dialog->orig_name->str); if (ctk_app_profile->ctk_config->conf->booleans & CONFIG_PROPERTIES_UPDATE_RULES_ON_PROFILE_NAME_CHANGE) { rules_fixed_up = nv_app_profile_config_profile_name_change_fixup( ctk_app_profile->cur_config, profile_dialog->orig_name->str, profile_dialog->name->str); } } // Update the profile in the configuration ctk_apc_profile_model_update_profile(ctk_app_profile->apc_profile_model, profile_dialog->source_file->str, profile_dialog->name->str, profile_json); // Refresh the view in the rule, if necessary if (widget_get_visible(rule_dialog->top_window)) { // XXX could this be abstracted? edit_rule_dialog_load_profile(rule_dialog, profile_dialog->name->str); source_filenames = get_source_filenames(ctk_app_profile); combo = GTK_COMBO(rule_dialog->source_file_combo); gtk_combo_set_popdown_strings(combo, source_filenames); gtk_entry_set_text(GTK_ENTRY(combo->entry), rule_dialog->source_file->str); string_list_free_full(source_filenames); } json_decref(profile_json); ctk_config_statusbar_message(ctk_app_profile->ctk_config, "Profile \"%s\" updated. %s%s", profile_dialog->name->str, rules_fixed_up ? "Some rules have been updated to refer " "to the new profile name. " : "", STATUSBAR_UPDATE_WARNING); // Close the window, and re-sensitize the caller gtk_widget_set_sensitive(profile_dialog->caller, TRUE); gtk_widget_hide(profile_dialog->top_window); } static void edit_profile_dialog_cancel(GtkWidget *widget, gpointer user_data) { EditProfileDialog *dialog = (EditProfileDialog *)user_data; // Close the window, and re-sensitize the caller gtk_widget_set_sensitive(dialog->caller, TRUE); gtk_widget_hide(dialog->top_window); } static void get_profile_dialog_toolbar_items(EditProfileDialog *dialog, ToolbarItemTemplate **settings_items_copy, size_t *num_settings_items, ToolbarItemTemplate **dialog_items_copy, size_t *num_dialog_items) { const ToolbarItemTemplate settings_items[] = { { .text = "Add Setting", .help_text = "The Add Setting button allows you to create a new setting in the profile.", .icon_id = GTK_STOCK_ADD, .callback = G_CALLBACK(edit_profile_dialog_add_setting), .user_data = dialog, .flags = 0, }, { .text = "Delete Setting", .help_text = "The Delete Setting button allows you to delete a highlighted setting from the profile.", .extended_help_text = "A setting can also be deleted from the profile by highlighting it in the list " "and hitting the Delete key.", .icon_id = GTK_STOCK_REMOVE, .callback = G_CALLBACK(edit_profile_dialog_delete_setting), .user_data = dialog, .flags = TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED }, { .text = "Edit Setting", .help_text = "The Edit Setting button allows you to edit a highlighted setting in the profile.", .extended_help_text = "This will activate an entry box in the setting's key column. To modify the setting's " "value, hit the Tab key or Right Arrow key, or double-click on the value.", .icon_id = GTK_STOCK_PREFERENCES, .callback = G_CALLBACK(edit_profile_dialog_edit_setting), .user_data = dialog, .flags = TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED }, }; const ToolbarItemTemplate dialog_items[] = { { .text = UPDATE_PROFILE_LABEL, .help_text = "The Update Profile button allows you to save changes made to the profile definition.", .icon_id = GTK_STOCK_SAVE, .callback = G_CALLBACK(edit_profile_dialog_save_changes), .user_data = dialog, .flags = 0, }, { .text = "Cancel", .help_text = "The Cancel button allows you to discard any changes made to the profile definition.", .icon_id = GTK_STOCK_CANCEL, .callback = G_CALLBACK(edit_profile_dialog_cancel), .user_data = dialog, .flags = 0, } }; *settings_items_copy = malloc(sizeof(settings_items)); memcpy(*settings_items_copy, settings_items, sizeof(settings_items)); *num_settings_items = ARRAY_LEN(settings_items); *dialog_items_copy = malloc(sizeof(dialog_items)); memcpy(*dialog_items_copy, dialog_items, sizeof(dialog_items)); *num_dialog_items = ARRAY_LEN(dialog_items); } static void edit_profile_dialog_statusbar_message(EditProfileDialog *dialog, const char *fmt, ...) { va_list ap; gchar *str; va_start(ap, fmt); str = g_strdup_vprintf(fmt, ap); va_end(ap); ctk_statusbar_message(&dialog->error_statusbar, str); g_free(str); } static void edit_profile_dialog_statusbar_clear(EditProfileDialog *dialog) { ctk_statusbar_clear(&dialog->error_statusbar); } static void setting_key_edited(GtkCellRendererText *renderer, gchar *path_s, gchar *new_text, gpointer user_data) { EditProfileDialog *dialog = (EditProfileDialog *)user_data; GtkTreePath *path; GtkTreeIter iter; json_t *setting; const gchar *canonical_key; if (dialog->setting_update_canceled) { // Don't update anything return; } path = gtk_tree_path_new_from_string(path_s); if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->settings_store), &iter, path)) { // The row might have been deleted. Cancel any update return; } edit_profile_dialog_statusbar_clear(dialog); gtk_tree_model_get(GTK_TREE_MODEL(dialog->settings_store), &iter, SETTING_LIST_STORE_COL_SETTING, &setting, -1); canonical_key = get_canonical_setting_key(new_text); if (!canonical_key) { edit_profile_dialog_statusbar_message(dialog, "The key [%s] is not recognized by nvidia-settings. " "Please check for spelling errors (keys " "are NOT case sensitive).", new_text); } if (canonical_key) { json_object_set_new(setting, "key", json_string(canonical_key)); } else { json_object_set_new(setting, "key", json_string(new_text)); } gtk_tree_path_free(path); } static gboolean is_valid_setting_value(json_t *value, char **invalid_type_str) { switch (json_typeof(value)) { case JSON_STRING: case JSON_TRUE: case JSON_FALSE: case JSON_REAL: case JSON_INTEGER: *invalid_type_str = NULL; return TRUE; case JSON_NULL: *invalid_type_str = "null"; return FALSE; case JSON_OBJECT: *invalid_type_str = "object"; return FALSE; case JSON_ARRAY: *invalid_type_str = "array"; return FALSE; default: assert(0); return FALSE; } } static void setting_value_edited(GtkCellRendererText *renderer, gchar *path_s, gchar *new_text, gpointer user_data) { gchar *invalid_type_str = NULL; gchar *new_text_in_json; EditProfileDialog *dialog = (EditProfileDialog *)user_data; GtkTreePath *path; GtkTreeIter iter; json_t *setting; json_t *value; json_error_t error; gboolean update_value = TRUE; if (dialog->setting_update_canceled) { // Don't update anything return; } path = gtk_tree_path_new_from_string(path_s); if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->settings_store), &iter, path)) { return; } edit_profile_dialog_statusbar_clear(dialog); gtk_tree_model_get(GTK_TREE_MODEL(dialog->settings_store), &iter, SETTING_LIST_STORE_COL_SETTING, &setting, -1); new_text_in_json = nv_app_profile_cfg_file_syntax_to_json(new_text); value = json_loads(new_text_in_json, JSON_DECODE_ANY, &error); if (!value) { edit_profile_dialog_statusbar_message(dialog, "The value [%s] was not understood by the JSON parser.", new_text); update_value = FALSE; } else if (!is_valid_setting_value(value, &invalid_type_str)) { edit_profile_dialog_statusbar_message(dialog, "A value of type \"%s\" is not allowed in the configuration.", invalid_type_str); update_value = FALSE; } if (update_value) { json_object_set_new(setting, "value", value); } else { json_decref(value); } free(new_text_in_json); gtk_tree_path_free(path); } static TreeViewColumnTemplate *get_profile_settings_tree_view_columns(EditProfileDialog *dialog, size_t *num_columns) { TreeViewColumnTemplate *settings_tree_view_columns_copy; const TreeViewColumnTemplate settings_tree_view_columns[] = { { .title = "Key", .renderer_func = setting_key_renderer_func, .func_data = dialog, .min_width = 200, .editable = TRUE, .edit_callback = G_CALLBACK(setting_key_edited), .help_text = "Each entry in the \"Key\" column describes a key for a setting. " "Any string is a valid key in the configuration, but only some strings " "will be understood by the driver at runtime. See the \"Supported Setting Keys\" " "section in the Application Profiles help page for a list of valid " "application profile setting keys. To edit a setting key, double-click " "on the cell containing the key." }, { .title = "Type", .renderer_func = setting_type_renderer_func, .min_width = 100, .func_data = NULL, .help_text = "Each entry in the \"Type\" column describes the underlying JSON type for " "a setting value. Supported JSON types are: string, true, false, and number. " "This column is read-only." }, { .title = "Value", .renderer_func = setting_value_renderer_func, .func_data = dialog, .editable = TRUE, .edit_callback = G_CALLBACK(setting_value_edited), .help_text = "Each entry in the \"Value\" column describes the value of a setting. To " "edit a setting value, double-click on the cell containing the value. " "Valid input is: an arbitrary string in double-quotes, true, false, or " "an integer or floating-point number. Numbers can optionally be written in " "hexadecimal or octal." } }; settings_tree_view_columns_copy = malloc(sizeof(settings_tree_view_columns)); memcpy(settings_tree_view_columns_copy, settings_tree_view_columns, sizeof(settings_tree_view_columns)); *num_columns = ARRAY_LEN(settings_tree_view_columns); return settings_tree_view_columns_copy; } static gboolean profile_settings_tree_view_key_press_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gboolean propagate = FALSE; // Whether to call other handlers in the stack EditProfileDialog *dialog = (EditProfileDialog *)user_data; GdkEventKey *key_event; if (event->type == GDK_KEY_PRESS) { key_event = (GdkEventKey *)event; if (key_event->keyval == GDK_Delete) { edit_profile_dialog_delete_setting_common(dialog); propagate = TRUE; } } return propagate; } static gboolean edit_profile_dialog_handle_delete(GtkWidget *widget, GdkEvent *event, gpointer user_data) { EditProfileDialog *dialog = (EditProfileDialog *)user_data; gtk_widget_set_sensitive(dialog->caller, TRUE); gtk_widget_hide(widget); return TRUE; } static gboolean edit_profile_dialog_generate_name_button_clicked(GtkWidget *widget, gpointer user_data) { EditProfileDialog *dialog = (EditProfileDialog *)user_data; CtkAppProfile *ctk_app_profile = CTK_APP_PROFILE(dialog->parent); char *unused_profile_name; unused_profile_name = nv_app_profile_config_get_unused_profile_name(ctk_app_profile->cur_config); g_string_assign(dialog->name, unused_profile_name); gtk_entry_set_text(GTK_ENTRY(dialog->name_entry), dialog->name->str); return FALSE; } static const char __profile_name_help[] = "This entry box contains the current profile name, which is a unique identifier for " "this profile. Renaming the profile to an existing profile will cause the existing " "profile to be overwritten with this profile's contents."; static const char __generate_name_button_help[] = "This button generates a unique name that is not currently used " "by the configuration. This can be used to quickly add a new profile without " "needing to worry about collisions with existing profile names."; static EditProfileDialog *edit_profile_dialog_new(CtkAppProfile *ctk_app_profile) { EditProfileDialog *dialog; GtkWidget *hbox; GtkWidget *label; GtkWidget *main_vbox; GtkWidget *container; GtkWidget *entry; GtkWidget *toolbar; GtkWidget *tree_view; GtkWidget *scroll_win; GtkWidget *alignment; GtkWidget *button; GList *toolbar_widget_items; ToolbarItemTemplate *edit_profile_settings_toolbar_items, *edit_profile_dialog_toolbar_items; size_t num_edit_profile_settings_toolbar_items, num_edit_profile_dialog_toolbar_items; TreeViewColumnTemplate *settings_tree_view_columns; size_t num_settings_tree_view_columns; dialog = malloc(sizeof(EditProfileDialog)); if (!dialog) { return NULL; } settings_tree_view_columns = get_profile_settings_tree_view_columns(dialog, &num_settings_tree_view_columns); get_profile_dialog_toolbar_items(dialog, &edit_profile_settings_toolbar_items, &num_edit_profile_settings_toolbar_items, &edit_profile_dialog_toolbar_items, &num_edit_profile_dialog_toolbar_items); dialog->parent = GTK_WIDGET(ctk_app_profile); dialog->top_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); dialog->top_help_data = NULL; dialog->setting_toolbar_help_data = NULL; dialog->bottom_help_data = NULL; gtk_window_set_modal(GTK_WINDOW(dialog->top_window), TRUE); g_signal_connect(G_OBJECT(dialog->top_window), "delete-event", G_CALLBACK(edit_profile_dialog_handle_delete), dialog); gtk_widget_set_size_request(dialog->top_window, 500, 480); gtk_container_set_border_width(GTK_CONTAINER(dialog->top_window), 8); dialog->name = g_string_new(""); dialog->orig_name = g_string_new(""); dialog->source_file = g_string_new(""); dialog->settings = json_array(); dialog->settings_store = gtk_list_store_new(SETTING_LIST_STORE_NUM_COLS, G_TYPE_POINTER); dialog->file_sel = gtk_file_selection_new("Please select a source file for the profile"); main_vbox = gtk_vbox_new(FALSE, 0); gtk_box_set_spacing(GTK_BOX(main_vbox), 8); gtk_container_add(GTK_CONTAINER(dialog->top_window), main_vbox); hbox = gtk_hbox_new(FALSE, 0); gtk_box_set_spacing(GTK_BOX(hbox), 4); label = gtk_label_new("Profile Name"); dialog->name_entry = entry = gtk_entry_new(); ctk_config_set_tooltip_and_add_help_data(ctk_app_profile->ctk_config, label, &dialog->top_help_data, "Profile Name", __profile_name_help, NULL); dialog->generate_name_button = button = gtk_button_new_with_label("Generate Name"); ctk_config_set_tooltip_and_add_help_data(ctk_app_profile->ctk_config, button, &dialog->top_help_data, "Generate Name", __generate_name_button_help, NULL); dialog->top_help_data = g_list_reverse(dialog->top_help_data); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(edit_profile_dialog_generate_name_button_clicked), (gpointer)dialog); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(main_vbox), hbox, FALSE, FALSE, 0); config_create_source_file_entry(ctk_app_profile->ctk_config, &container, &dialog->source_file_combo, &dialog->top_help_data, "profile", G_CALLBACK(profile_browse_button_clicked), (gpointer)dialog); gtk_box_pack_start(GTK_BOX(main_vbox), container, FALSE, FALSE, 0); toolbar = gtk_toolbar_new(); tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->settings_store)); populate_toolbar(GTK_TOOLBAR(toolbar), edit_profile_settings_toolbar_items, num_edit_profile_settings_toolbar_items, &dialog->setting_toolbar_help_data, NULL, GTK_TREE_VIEW(tree_view)); gtk_box_pack_start(GTK_BOX(main_vbox), toolbar, FALSE, FALSE, 0); populate_tree_view(GTK_TREE_VIEW(tree_view), settings_tree_view_columns, ctk_app_profile, num_settings_tree_view_columns, &dialog->setting_column_help_data); g_signal_connect(G_OBJECT(tree_view), "key-press-event", G_CALLBACK(profile_settings_tree_view_key_press_event), (gpointer)dialog); dialog->settings_view = GTK_TREE_VIEW(tree_view); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree_view), TRUE); scroll_win = gtk_scrolled_window_new(NULL, NULL); gtk_container_add(GTK_CONTAINER(scroll_win), tree_view); gtk_box_pack_start(GTK_BOX(main_vbox), scroll_win, TRUE, TRUE, 0); dialog->setting_update_canceled = FALSE; ctk_statusbar_init(&dialog->error_statusbar); gtk_box_pack_start(GTK_BOX(main_vbox), dialog->error_statusbar.widget, FALSE, FALSE, 0); alignment = gtk_alignment_new(1.0, 0.5, 0.0, 0.0); toolbar = gtk_toolbar_new(); populate_toolbar(GTK_TOOLBAR(toolbar), edit_profile_dialog_toolbar_items, num_edit_profile_dialog_toolbar_items, &dialog->bottom_help_data, &toolbar_widget_items, NULL); // Save off the "Update Profile" button for later use dialog->add_edit_profile_button = find_widget_in_widget_data_list(toolbar_widget_items, UPDATE_PROFILE_LABEL); widget_data_list_free_full(toolbar_widget_items); gtk_container_add(GTK_CONTAINER(alignment), toolbar); gtk_box_pack_start(GTK_BOX(main_vbox), alignment, FALSE, FALSE, 0); free(edit_profile_settings_toolbar_items); free(edit_profile_dialog_toolbar_items); free(settings_tree_view_columns); return dialog; } static void edit_profile_dialog_destroy(EditProfileDialog *dialog) { g_string_free(dialog->name, TRUE); g_string_free(dialog->orig_name, TRUE); g_string_free(dialog->source_file, TRUE); json_decref(dialog->settings); ctk_help_data_list_free_full(dialog->top_help_data); ctk_help_data_list_free_full(dialog->setting_column_help_data); ctk_help_data_list_free_full(dialog->setting_toolbar_help_data); ctk_help_data_list_free_full(dialog->bottom_help_data); free(dialog); } static void rules_tree_view_row_activated_callback(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) { CtkAppProfile *ctk_app_profile = (CtkAppProfile *)user_data; edit_rule_callbacks_common(ctk_app_profile, path); } static GtkWidget* create_rules_page(CtkAppProfile *ctk_app_profile) { GtkWidget *vbox; GtkWidget *scroll_win; GtkWidget *tree_view; GtkWidget *toolbar; GtkTreeModel *model; const ToolbarItemTemplate rules_toolbar_items[] = { { .text = "Add Rule", .help_text = "The Add Rule button allows you to create a new rule for applying custom settings " "to applications which match a given pattern.", .extended_help_text = "See the \"Add/Edit Rule Dialog Box\" help section for more " "information on adding new rules.", .icon_id = GTK_STOCK_ADD, .callback = (GCallback)add_rule_callback, .user_data = ctk_app_profile, .flags = 0, }, { .text = "Delete Rule", .help_text = "The Delete Rule button allows you to remove a highlighted rule from the list.", .icon_id = GTK_STOCK_REMOVE, .callback = (GCallback)delete_rule_callback, .user_data = ctk_app_profile, .flags = TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED }, { .text = "Increase Rule Priority", .help_text = "This increases the priority of the highlighted rule in the list. If multiple rules " "with a conflicting driver setting match the same application, the application will " "take on the setting value of the highest-priority rule (lowest number) in the list.", .extended_help_text = "Note that the priority of a rule is partially determined by the source file " "where the rule is defined, since the NVIDIA driver prioritizes rules based " "on their position along the configuration file search path. Hence, nvidia-settings " "may move the rule to a different source file if it is necessary for the rule to achieve " "a particular priority.", .icon_id = GTK_STOCK_GO_UP, .callback = (GCallback)increase_rule_priority_callback, .user_data = ctk_app_profile, .flags = TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED }, { .text = "Decrease Rule Priority", .help_text = "This decreases the priority of the highlighted rule in the list. If multiple rules " "with a conflicting driver setting match the same application, the application will " "take on the setting value of the highest-priority rule (lowest number) in the list.", .icon_id = GTK_STOCK_GO_DOWN, .callback = (GCallback)decrease_rule_priority_callback, .user_data = ctk_app_profile, .flags = TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED }, { .text = "Edit Rule", .help_text = "The Edit Rule button allows you to edit a highlighted rule in the list.", .extended_help_text = "See the \"Add/Edit Rule Dialog Box\" help section for more " "information on editing rules.", // Would be nice to use GTK_STOCK_EDIT here, but unfortunately only // available from 2.6 onwards... .icon_id = GTK_STOCK_PREFERENCES, .callback = (GCallback)edit_rule_callback, .user_data = ctk_app_profile, .flags = TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED }, }; const TreeViewColumnTemplate rules_tree_view_columns[] = { // TODO asterisk column to denote changes { .title = "Priority", .renderer_func = rule_order_renderer_func, .func_data = NULL, .help_text = "This column describes the priority of each rule in the configuration. " "If two rules match the same process and affect settings which overlap, " "the overlapping settings will be set to the values specified by the rule " "with the lower number (higher priority) in this column." }, { .title = "Pattern", .renderer_func = rule_pattern_renderer_func, .func_data = NULL, .help_text = "This column describes the pattern against which the driver will compare " "the currently running process to determine if it should apply profile settings. ", .extended_help_text = "See the \"Supported Features\" help section for more information on " "supported pattern types." }, { .title = "Profile Settings", .renderer_func = rule_profile_settings_renderer_func, .func_data = (gpointer)ctk_app_profile, .help_text = "This column describes the settings that will be applied to processes " "that match the pattern in each rule. Note that profile settings are properties " "of the profile itself, and not the associated rule." }, { .title = "Profile Name", .attribute = "text", .attr_col = CTK_APC_RULE_MODEL_COL_PROFILE_NAME, .help_text = "This column describes the name of the profile that will be applied to processes " "that match the pattern in each rule." }, { .title = "Source File", .attribute = "text", .attr_col = CTK_APC_RULE_MODEL_COL_FILENAME, .help_text = "This column describes the configuration file where the rule is defined. Note that " "the NVIDIA® Linux Graphics Driver searches for application profiles along a fixed " "search path, and the location of the configuration file in the search path can " "affect a rule's priority. See the README for more details." }, }; vbox = gtk_vbox_new(FALSE, 0); /* Create the toolbar and main tree view */ toolbar = gtk_toolbar_new(); model = GTK_TREE_MODEL(ctk_app_profile->apc_rule_model); tree_view = gtk_tree_view_new_with_model(model); populate_toolbar(GTK_TOOLBAR(toolbar), rules_toolbar_items, ARRAY_LEN(rules_toolbar_items), &ctk_app_profile->rules_help_data, NULL, GTK_TREE_VIEW(tree_view)); gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); scroll_win = gtk_scrolled_window_new(NULL, NULL); populate_tree_view(GTK_TREE_VIEW(tree_view), rules_tree_view_columns, ctk_app_profile, ARRAY_LEN(rules_tree_view_columns), &ctk_app_profile->rules_columns_help_data); g_signal_connect(G_OBJECT(tree_view), "row-activated", G_CALLBACK(rules_tree_view_row_activated_callback), (gpointer)ctk_app_profile); g_signal_connect(G_OBJECT(tree_view), "key-press-event", G_CALLBACK(rules_tree_view_key_press_event), (gpointer)ctk_app_profile); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree_view), TRUE); gtk_tree_view_set_reorderable(GTK_TREE_VIEW(tree_view), TRUE); gtk_container_add(GTK_CONTAINER(scroll_win), tree_view); ctk_app_profile->main_rule_view = GTK_TREE_VIEW(tree_view); gtk_box_pack_start(GTK_BOX(vbox), scroll_win, TRUE, TRUE, 0); return vbox; } static void profile_settings_renderer_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { char *settings_string; json_t *settings; gtk_tree_model_get(model, iter, CTK_APC_PROFILE_MODEL_COL_SETTINGS, &settings, -1); settings_string = serialize_settings(settings, TRUE); g_object_set(cell, "markup", settings_string, NULL); free(settings_string); json_decref(settings); } static void delete_profile_callback_common(CtkAppProfile *ctk_app_profile) { GtkTreeViewColumn *focus_column; GtkTreeIter iter; GtkTreePath *path; char *profile_name; // Get currently highlighted row gtk_tree_view_get_cursor(ctk_app_profile->main_profile_view, &path, &focus_column); if (!path) { return; } if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(ctk_app_profile->apc_profile_model), &iter, path)) { return; } gtk_tree_model_get(GTK_TREE_MODEL(ctk_app_profile->apc_profile_model), &iter, CTK_APC_PROFILE_MODEL_COL_NAME, &profile_name, -1); // Delete the row ctk_apc_profile_model_delete_profile(ctk_app_profile->apc_profile_model, profile_name); // Select next profile in the list, if available choose_next_row_in_list_view(ctk_app_profile->main_profile_view, GTK_TREE_MODEL(ctk_app_profile->apc_profile_model), &path); gtk_tree_view_set_cursor(ctk_app_profile->main_profile_view, path, NULL, FALSE); ctk_config_statusbar_message(ctk_app_profile->ctk_config, "Profile \"%s\" deleted. %s", profile_name, STATUSBAR_UPDATE_WARNING); gtk_tree_path_free(path); free(profile_name); } static void delete_profile_callback(GtkWidget *widget, gpointer user_data) { CtkAppProfile *ctk_app_profile = (CtkAppProfile *)user_data; delete_profile_callback_common(ctk_app_profile); } static gboolean profiles_tree_view_key_press_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { CtkAppProfile *ctk_app_profile = (CtkAppProfile *)user_data; GdkEventKey *key_event; if (event->type == GDK_KEY_PRESS) { key_event = (GdkEventKey *)event; if (key_event->keyval == GDK_Delete) { delete_profile_callback_common(ctk_app_profile); return TRUE; } } // Use default handlers return FALSE; } static void edit_profile_dialog_load_values(EditProfileDialog *dialog) { GList *strings; GtkCombo *combo; // window title gtk_window_set_title(GTK_WINDOW(dialog->top_window), dialog->new_profile ? "Add new profile" : "Edit existing profile"); // add/edit button button_set_label_and_stock_icon(GTK_BUTTON(dialog->add_edit_profile_button), "Update Profile", dialog->new_profile ? GTK_STOCK_ADD : GTK_STOCK_PREFERENCES); // profile name gtk_entry_set_text(GTK_ENTRY(dialog->name_entry), dialog->name->str); // source file combo = GTK_COMBO(dialog->source_file_combo); strings = get_source_filenames(CTK_APP_PROFILE(dialog->parent)); gtk_combo_set_popdown_strings(combo, strings); if (dialog->new_profile) { if (g_list_length(strings)) { // Choose first string in the list g_string_assign(dialog->source_file, (gchar *)strings->data); } else { g_string_assign(dialog->source_file, ""); } } gtk_entry_set_text(GTK_ENTRY(combo->entry), dialog->source_file->str); string_list_free_full(strings); // profile settings if (!dialog->new_profile) { load_settings_from_profile(CTK_APP_PROFILE(dialog->parent), dialog->settings_store, dialog->name->str); } else { gtk_list_store_clear(dialog->settings_store); } } static void edit_profile_dialog_show(EditProfileDialog *dialog) { edit_profile_dialog_load_values(dialog); gtk_widget_show_all(dialog->top_window); // disable focusing to calling window until this window closed gtk_window_set_transient_for(GTK_WINDOW(dialog->top_window), GTK_WINDOW(gtk_widget_get_toplevel(dialog->caller))); gtk_widget_set_sensitive(dialog->caller, FALSE); } static void add_profile_callbacks_common(CtkAppProfile *ctk_app_profile, GtkWidget *caller) { EditProfileDialog *dialog = ctk_app_profile->edit_profile_dialog; char *unused_profile_name = nv_app_profile_config_get_unused_profile_name(ctk_app_profile->cur_config); dialog->new_profile = TRUE; dialog->caller = caller; g_string_assign(dialog->name, unused_profile_name); g_string_truncate(dialog->orig_name, 0); free(unused_profile_name); edit_profile_dialog_show(dialog); } static void add_profile_callback(GtkWidget *widget, gpointer user_data) { CtkAppProfile *ctk_app_profile = (CtkAppProfile *)user_data; add_profile_callbacks_common(ctk_app_profile, GTK_WIDGET(ctk_app_profile)); } static void edit_profile_callbacks_common(CtkAppProfile *ctk_app_profile, GtkTreePath *path, GtkWidget *caller) { GtkTreeIter iter; EditProfileDialog *dialog = ctk_app_profile->edit_profile_dialog; gchar *name, *filename; json_t *settings; if (!path) { return; } if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(ctk_app_profile->apc_profile_model), &iter, path)) { return; } gtk_tree_model_get(GTK_TREE_MODEL(ctk_app_profile->apc_profile_model), &iter, CTK_APC_PROFILE_MODEL_COL_NAME, &name, CTK_APC_PROFILE_MODEL_COL_SETTINGS, &settings, CTK_APC_PROFILE_MODEL_COL_FILENAME, &filename, -1); dialog->new_profile = FALSE; dialog->caller = caller; g_string_assign(dialog->name, name); g_string_assign(dialog->orig_name, name); dialog->settings = json_deep_copy(settings); g_string_assign(dialog->source_file, filename); edit_profile_dialog_show(dialog); json_decref(settings); free(name); free(filename); } static void edit_profile_callback(GtkWidget *widget, gpointer user_data) { GtkTreeViewColumn *focus_column; GtkTreePath *path; CtkAppProfile *ctk_app_profile = (CtkAppProfile *)user_data; // Get currently highlighted row gtk_tree_view_get_cursor(ctk_app_profile->main_profile_view, &path, &focus_column); edit_profile_callbacks_common(ctk_app_profile, path, GTK_WIDGET(ctk_app_profile)); gtk_tree_path_free(path); } static void profiles_tree_view_row_activated_callback(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) { CtkAppProfile *ctk_app_profile = (CtkAppProfile *)user_data; edit_profile_callbacks_common(ctk_app_profile, path, GTK_WIDGET(ctk_app_profile)); } static GtkWidget* create_profiles_page(CtkAppProfile *ctk_app_profile) { GtkWidget *vbox; GtkWidget *toolbar; GtkWidget *scroll_win; GtkWidget *tree_view; GtkTreeModel *model; const ToolbarItemTemplate profiles_toolbar_items[] = { { .text = "Add Profile", .help_text = "The Add Profile button allows you to create a new profile for applying custom settings " "to applications which match a given pattern.", .extended_help_text = "See the \"Add/Edit Profile Dialog Box\" help section for more " "information on adding new profiles.", .icon_id = GTK_STOCK_ADD, .callback = (GCallback)add_profile_callback, .user_data = ctk_app_profile, .flags = 0 }, { .text = "Delete Profile", .help_text = "The Delete Profile button allows you to remove a highlighted profile from the list.", .icon_id = GTK_STOCK_REMOVE, .callback = (GCallback)delete_profile_callback, .user_data = ctk_app_profile, .flags = TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED }, { .text = "Edit Profile", .help_text = "The Edit Profile button allows you to edit a highlighted profile in the list.", .extended_help_text = "See the \"Add/Edit Profile Dialog Box\" help section for more " "information on editing profiles.", // Would be nice to use GTK_STOCK_EDIT here, but unfortunately only // available from 2.6 onwards... .icon_id = GTK_STOCK_PREFERENCES, .callback = (GCallback)edit_profile_callback, .user_data = ctk_app_profile, .flags = TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED }, }; const TreeViewColumnTemplate profiles_tree_view_columns[] = { // TODO asterisk column to denote changes { .title = "Profile Name", .attribute = "text", .attr_col = CTK_APC_PROFILE_MODEL_COL_NAME, .sortable = TRUE, .sort_column_id = CTK_APC_PROFILE_MODEL_COL_NAME, .help_text = "This column describes the name of the profile." }, { .title = "Profile Settings", .renderer_func = profile_settings_renderer_func, .func_data = NULL, .sortable = TRUE, .sort_column_id = CTK_APC_PROFILE_MODEL_COL_SETTINGS, .help_text = "This column describes the settings that will be applied by rules " "which use this profile." }, { .title = "Source File", .attribute = "text", .attr_col = CTK_APC_PROFILE_MODEL_COL_FILENAME, .sortable = TRUE, .sort_column_id = CTK_APC_PROFILE_MODEL_COL_FILENAME, .help_text = "This column describes the configuration file where the profile is defined." }, }; vbox = gtk_vbox_new(FALSE, 0); /* Create the toolbar and main tree view */ toolbar = gtk_toolbar_new(); model = GTK_TREE_MODEL(ctk_app_profile->apc_profile_model); tree_view = gtk_tree_view_new_with_model(model); populate_toolbar(GTK_TOOLBAR(toolbar), profiles_toolbar_items, ARRAY_LEN(profiles_toolbar_items), &ctk_app_profile->profiles_help_data, NULL, GTK_TREE_VIEW(tree_view)); gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); scroll_win = gtk_scrolled_window_new(NULL, NULL); populate_tree_view(GTK_TREE_VIEW(tree_view), profiles_tree_view_columns, ctk_app_profile, ARRAY_LEN(profiles_tree_view_columns), &ctk_app_profile->profiles_columns_help_data); g_signal_connect(G_OBJECT(tree_view), "row-activated", G_CALLBACK(profiles_tree_view_row_activated_callback), (gpointer)ctk_app_profile); g_signal_connect(G_OBJECT(tree_view), "key-press-event", G_CALLBACK(profiles_tree_view_key_press_event), (gpointer)ctk_app_profile); ctk_app_profile->main_profile_view = GTK_TREE_VIEW(tree_view); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree_view), TRUE); gtk_container_add(GTK_CONTAINER(scroll_win), tree_view); gtk_box_pack_start(GTK_BOX(vbox), scroll_win, TRUE, TRUE, 0); return vbox; } static char *get_default_global_config_file(void) { const char *homeStr = getenv("HOME"); if (homeStr) { return nvstrcat(homeStr, "/.nv/nvidia-application-profile-globals-rc", NULL); } else { nv_error_msg("The environment variable HOME is not set. Any " "modifications to global application profile settings " "will not be saved."); return NULL; } } #define SEARCH_PATH_NUM_FILES 4 static char **get_default_search_path(size_t *num_files) { size_t i = 0; char **filenames = malloc(SEARCH_PATH_NUM_FILES * sizeof(char *)); const char *homeStr = getenv("HOME"); if (homeStr) { filenames[i++] = nvstrcat(homeStr, "/.nv/nvidia-application-profiles-rc", NULL); filenames[i++] = nvstrcat(homeStr, "/.nv/nvidia-application-profiles-rc.d", NULL); } filenames[i++] = strdup("/etc/nvidia/nvidia-application-profiles-rc"); filenames[i++] = strdup("/etc/nvidia/nvidia-application-profiles-rc.d"); *num_files = i; assert(i <= SEARCH_PATH_NUM_FILES); return filenames; } static void free_search_path(char **search_path, size_t search_path_size) { while (search_path_size--) { free(search_path[search_path_size]); } free(search_path); } static void app_profile_load_global_settings(CtkAppProfile *ctk_app_profile, AppProfileConfig *config) { // Temporarily disable propagating statusbar messages since the // enabled_check_button_toggled() callback will otherwise update the // statusbar ctk_app_profile->ctk_config->status_bar.enabled = FALSE; gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(ctk_app_profile->enable_check_button), nv_app_profile_config_get_enabled(config)); ctk_app_profile->ctk_config->status_bar.enabled = TRUE; } static void app_profile_reload(CtkAppProfile *ctk_app_profile) { char *global_config_file; char **search_path; size_t search_path_size; nv_app_profile_config_free(ctk_app_profile->cur_config); nv_app_profile_config_free(ctk_app_profile->gold_config); search_path = get_default_search_path(&search_path_size); global_config_file = get_default_global_config_file(); ctk_app_profile->gold_config = nv_app_profile_config_load(global_config_file, search_path, search_path_size); ctk_app_profile->cur_config = nv_app_profile_config_dup(ctk_app_profile->gold_config); free_search_path(search_path, search_path_size); free(global_config_file); ctk_apc_profile_model_attach(ctk_app_profile->apc_profile_model, ctk_app_profile->cur_config); ctk_apc_rule_model_attach(ctk_app_profile->apc_rule_model, ctk_app_profile->cur_config); app_profile_load_global_settings(ctk_app_profile, ctk_app_profile->cur_config); } static void reload_callback(GtkWidget *widget, gpointer user_data) { CtkAppProfile *ctk_app_profile = (CtkAppProfile *)user_data; json_t *updates; gboolean do_reload = TRUE; GString *fatal_errors = g_string_new(""); GString *nonfatal_errors = g_string_new(""); static const char unsaved_changes_error[] = "There are unsaved changes in the configuration which will be permanently lost if " "the configuration is reloaded from disk.\n"; static const char files_altered_error[] = "Some configuration files may have been modified externally since the configuration " "was last loaded from disk.\n"; updates = nv_app_profile_config_validate(ctk_app_profile->cur_config, ctk_app_profile->gold_config); if (json_array_size(updates) > 0) { g_string_append_printf(nonfatal_errors, "%s\t%s", get_bullet(), unsaved_changes_error); } if (nv_app_profile_config_check_backing_files(ctk_app_profile->cur_config)) { g_string_append_printf(nonfatal_errors, "%s\t%s", get_bullet(), files_altered_error); } do_reload = run_error_dialog(GTK_WINDOW(gtk_widget_get_toplevel( GTK_WIDGET(ctk_app_profile))), fatal_errors, nonfatal_errors, "reload the configuration from disk"); if (do_reload) { app_profile_reload(ctk_app_profile); ctk_config_statusbar_message(ctk_app_profile->ctk_config, "Application profile configuration reloaded from disk."); } g_string_free(fatal_errors, TRUE); g_string_free(nonfatal_errors, TRUE); } static void save_changes_callback(GtkWidget *widget, gpointer user_data); static ToolbarItemTemplate *get_save_reload_toolbar_items(CtkAppProfile *ctk_app_profile, size_t *num_save_reload_toolbar_items) { ToolbarItemTemplate *save_reload_toolbar_items_copy; const ToolbarItemTemplate save_reload_toolbar_items[] = { { .text = "Save Changes", .help_text = "The Save Changes button allows you to save any changes to application profile " "configuration files to disk.", .extended_help_text = "This button displays a dialog box which allows you to preview the changes " "that will be made to the JSON configuration files, and toggle whether nvidia-settings " "should make backup copies of the original files before overwriting existing files.", .icon_id = GTK_STOCK_SAVE, .callback = (GCallback)save_changes_callback, .user_data = ctk_app_profile, .flags = 0, }, { .text = "Reload", .help_text = "The Reload button allows you to reload application profile configuration from " "disk, reverting any unsaved changes.", .extended_help_text = "If nvidia-settings detects unsaved changes in the configuration, this button will " "display a dialog box to warn you before attempting to reload.", .icon_id = GTK_STOCK_REFRESH, .callback = (GCallback)reload_callback, .user_data = ctk_app_profile, .flags = 0, } }; save_reload_toolbar_items_copy = malloc(sizeof(save_reload_toolbar_items)); memcpy(save_reload_toolbar_items_copy, save_reload_toolbar_items, sizeof(save_reload_toolbar_items)); *num_save_reload_toolbar_items = ARRAY_LEN(save_reload_toolbar_items); return save_reload_toolbar_items_copy; } static void save_app_profile_changes_dialog_save_changes(GtkWidget *widget, gpointer user_data) { gboolean do_save = TRUE; gboolean do_reload = TRUE; gboolean do_backup = TRUE; gint result; int ret; GtkWidget *error_dialog; SaveAppProfileChangesDialog *dialog = (SaveAppProfileChangesDialog *)user_data; CtkAppProfile *ctk_app_profile = CTK_APP_PROFILE(dialog->parent); char *write_errors = NULL; static const char config_files_changed_string[] = "nvidia-settings has detected that configuration files have changed " "since the configuration was last loaded. Saving the configuration " "may cause these changes to be permanently lost. Continue anyway?\n"; static const char write_errors_occurred_prefix[] = "nvidia-settings encountered errors when writing to the configuration:\n"; static const char write_errors_occurred_suffix[] = "\nSome changes may not have been saved. Reload the configuration anyway?\n"; // First check for possible conflicts if (nv_app_profile_config_check_backing_files(ctk_app_profile->cur_config)) { error_dialog = gtk_message_dialog_new(GTK_WINDOW(dialog->top_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "%s", config_files_changed_string); result = gtk_dialog_run(GTK_DIALOG(error_dialog)); if (result != GTK_RESPONSE_YES) { do_save = FALSE; } gtk_widget_destroy(error_dialog); } do_backup = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->backup_check_button)); if (do_save) { ret = nv_app_profile_config_save_updates(ctk_app_profile->cur_config, dialog->updates, do_backup, &write_errors); if (ret < 0) { if (!write_errors) { write_errors = strdup("Unknown error."); } error_dialog = gtk_message_dialog_new(GTK_WINDOW(dialog->top_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "%s%s%s", write_errors_occurred_prefix, write_errors, write_errors_occurred_suffix); result = gtk_dialog_run(GTK_DIALOG(error_dialog)); if (result != GTK_RESPONSE_YES) { do_reload = FALSE; } gtk_widget_destroy(error_dialog); } free(write_errors); if (do_reload) { app_profile_reload(CTK_APP_PROFILE(dialog->parent)); } ctk_config_statusbar_message(ctk_app_profile->ctk_config, "Application profile configuration saved to disk."); } json_decref(dialog->updates); dialog->updates = NULL; gtk_widget_set_sensitive(dialog->parent, TRUE); gtk_widget_hide(dialog->top_window); } static void save_app_profile_changes_dialog_cancel(GtkWidget *widget, gpointer user_data) { SaveAppProfileChangesDialog *dialog = (SaveAppProfileChangesDialog *)user_data; json_decref(dialog->updates); dialog->updates = NULL; gtk_widget_set_sensitive(dialog->parent, TRUE); gtk_widget_hide(dialog->top_window); } static ToolbarItemTemplate *get_save_app_profile_changes_toolbar_items(SaveAppProfileChangesDialog *dialog, size_t *num_items) { ToolbarItemTemplate *items_copy; const ToolbarItemTemplate items[] = { { .text = "Save Changes", .help_text = "Save the changes to disk.", .icon_id = GTK_STOCK_SAVE, .callback = G_CALLBACK(save_app_profile_changes_dialog_save_changes), .user_data = dialog, .flags = 0, }, { .text = "Cancel", .help_text = "Cancel the save operation.", .icon_id = GTK_STOCK_CANCEL, .callback = G_CALLBACK(save_app_profile_changes_dialog_cancel), .user_data = dialog, .flags = 0, } }; items_copy = malloc(sizeof(items)); memcpy(items_copy, items, sizeof(items)); *num_items = ARRAY_LEN(items); return items_copy; } static void save_app_profile_changes_dialog_set_preview_visibility(SaveAppProfileChangesDialog *dialog, gboolean visible) { dialog->show_preview = visible; if (visible) { gtk_widget_show(dialog->preview_vbox); gtk_window_set_resizable(GTK_WINDOW(dialog->top_window), TRUE); gtk_widget_set_size_request(dialog->preview_vbox, -1, 400); gtk_button_set_label(GTK_BUTTON(dialog->preview_button), "Hide Preview"); } else { gtk_widget_hide(dialog->preview_vbox); gtk_window_set_resizable(GTK_WINDOW(dialog->top_window), FALSE); gtk_button_set_label(GTK_BUTTON(dialog->preview_button), "Show Preview"); } } static gboolean save_app_profile_changes_show_preview_button_clicked(GtkWidget *widget, gpointer user_data) { SaveAppProfileChangesDialog *save_dialog = (SaveAppProfileChangesDialog *)user_data; // Toggle visibility of the preview window save_app_profile_changes_dialog_set_preview_visibility(save_dialog, !save_dialog->show_preview); return FALSE; } static void save_app_profile_settings_dialog_load_current_update(SaveAppProfileChangesDialog *dialog) { CtkAppProfile *ctk_app_profile; size_t i, size; CtkDropDownMenu *menu; const char *filename; const char *text; char *backup_filename; GtkTextBuffer *text_buffer; json_t *update, *update_filename; ctk_app_profile = CTK_APP_PROFILE(dialog->parent); menu = CTK_DROP_DOWN_MENU(dialog->preview_file_menu); filename = ctk_drop_down_menu_get_current_name(menu); text = NULL; for (i = 0, size = json_array_size(dialog->updates); i < size; i++) { update = json_array_get(dialog->updates, i); update_filename = json_object_get(update, "filename"); if (!strcmp(json_string_value(update_filename), filename)) { text = json_string_value(json_object_get(update, "text")); } } backup_filename = nv_app_profile_config_get_backup_filename(ctk_app_profile->cur_config, filename); gtk_entry_set_text(GTK_ENTRY(dialog->preview_backup_entry), backup_filename); free(backup_filename); text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(dialog->preview_text_view)); if (text) { gtk_text_buffer_set_text(text_buffer, text, -1); } else { gtk_text_buffer_set_text(text_buffer, "", -1); } } static void save_app_profile_changes_dialog_preview_changed(GtkWidget *widget, gpointer user_data) { SaveAppProfileChangesDialog *dialog = (SaveAppProfileChangesDialog *)user_data; save_app_profile_settings_dialog_load_current_update(dialog); } static gboolean save_app_profile_changes_dialog_handle_delete(GtkWidget *widget, GdkEvent *event, gpointer user_data) { SaveAppProfileChangesDialog *dialog = (SaveAppProfileChangesDialog *)user_data; gtk_widget_set_sensitive(dialog->parent, TRUE); gtk_widget_hide(widget); return TRUE; } static SaveAppProfileChangesDialog *save_app_profile_changes_dialog_new(CtkAppProfile *ctk_app_profile) { ToolbarItemTemplate *toolbar_items; size_t num_toolbar_items; GtkWidget *toolbar; GtkWidget *alignment; GtkWidget *vbox, *preview_vbox, *hbox; GtkWidget *label; GtkWidget *menu; GtkWidget *check_button; GtkWidget *scroll_win, *text_view; SaveAppProfileChangesDialog *dialog = malloc(sizeof(SaveAppProfileChangesDialog)); dialog->parent = GTK_WIDGET(ctk_app_profile); dialog->top_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); dialog->show_preview = FALSE; gtk_window_set_title(GTK_WINDOW(dialog->top_window), "Save Changes"); gtk_window_set_modal(GTK_WINDOW(dialog->top_window), TRUE); gtk_container_set_border_width(GTK_CONTAINER(dialog->top_window), 8); g_signal_connect(G_OBJECT(dialog->top_window), "delete-event", G_CALLBACK(save_app_profile_changes_dialog_handle_delete), dialog); gtk_widget_set_size_request(dialog->top_window, 500, -1); vbox = gtk_vbox_new(FALSE, 0); gtk_box_set_spacing(GTK_BOX(vbox), 8); gtk_container_add(GTK_CONTAINER(dialog->top_window), vbox); label = gtk_label_new("The following files will be modified after the configuration is saved."); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 8); dialog->preview_file_menu = menu = ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO); gtk_box_pack_start(GTK_BOX(hbox), menu, TRUE, TRUE, 0); dialog->preview_changed_signal = g_signal_connect(G_OBJECT(menu), "changed", G_CALLBACK(save_app_profile_changes_dialog_preview_changed), (gpointer)dialog); dialog->preview_button = gtk_button_new_with_label("Show Preview"); gtk_box_pack_start(GTK_BOX(hbox), dialog->preview_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(dialog->preview_button), "clicked", G_CALLBACK(save_app_profile_changes_show_preview_button_clicked), (gpointer)dialog); ctk_config_set_tooltip(ctk_app_profile->ctk_config, dialog->preview_button, "This button allows you to toggle previewing the new contents of " "the currently selected configuration file."); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); dialog->preview_vbox = preview_vbox = gtk_vbox_new(FALSE, 8); hbox = gtk_hbox_new(FALSE, 8); label = gtk_label_new("Backup filename"); ctk_config_set_tooltip(ctk_app_profile->ctk_config, label, "This text field contains the filename that nvidia-settings will use " "to back up the currently selected configuration file when saving the " "configuration."); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); dialog->preview_backup_entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(hbox), dialog->preview_backup_entry, TRUE, TRUE, 0); gtk_entry_set_editable(GTK_ENTRY(dialog->preview_backup_entry), FALSE); gtk_box_pack_start(GTK_BOX(preview_vbox), hbox, FALSE, FALSE, 0); scroll_win = gtk_scrolled_window_new(NULL, NULL); dialog->preview_text_view = text_view = gtk_text_view_new(); gtk_text_view_set_editable(GTK_TEXT_VIEW(text_view), FALSE); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_view), GTK_WRAP_CHAR); gtk_container_add(GTK_CONTAINER(scroll_win), text_view); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll_win), GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(preview_vbox), scroll_win, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), preview_vbox, TRUE, TRUE, 0); dialog->backup_check_button = check_button = gtk_check_button_new_with_label("Back up original files"); // Enable backups by default gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), TRUE); ctk_config_set_tooltip(ctk_app_profile->ctk_config, check_button, "This checkbox determines whether nvidia-settings will attempt to back up " "the original configuration files before saving the new configuration."); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 0); alignment = gtk_alignment_new(1.0, 0.5, 0.0, 0.0); toolbar = gtk_toolbar_new(); toolbar_items = get_save_app_profile_changes_toolbar_items(dialog, &num_toolbar_items); populate_toolbar(GTK_TOOLBAR(toolbar), toolbar_items, num_toolbar_items, NULL, NULL, NULL); free(toolbar_items); gtk_container_add(GTK_CONTAINER(alignment), toolbar); gtk_box_pack_start(GTK_BOX(vbox), alignment, FALSE, FALSE, 0); return dialog; } static void save_app_profile_changes_dialog_destroy(SaveAppProfileChangesDialog *dialog) { json_decref(dialog->updates); ctk_help_data_list_free_full(dialog->help_data); free(dialog); } static GList *get_update_filenames(json_t *updates) { GList *update_filenames = NULL; json_t *update, *update_filename_json; gchar *update_filename; size_t i, size; for (i = 0, size = json_array_size(updates); i < size; i++) { update = json_array_get(updates, i); update_filename_json = json_object_get(update, "filename"); update_filename = strdup(json_string_value(update_filename_json)); update_filenames = g_list_prepend(update_filenames, update_filename); } return update_filenames; } static void add_preview_file(gpointer data, gpointer user_data) { const char *filename = (const char*)data; CtkDropDownMenu *menu = (CtkDropDownMenu *)user_data; ctk_drop_down_menu_append_item(menu, filename, 0); } static void save_app_profile_changes_dialog_load_values(SaveAppProfileChangesDialog *dialog) { GList *update_filenames; update_filenames = get_update_filenames(dialog->updates); ctk_drop_down_menu_reset(CTK_DROP_DOWN_MENU(dialog->preview_file_menu)); g_list_foreach(update_filenames, add_preview_file, (gpointer)dialog->preview_file_menu); save_app_profile_settings_dialog_load_current_update(dialog); string_list_free_full(update_filenames); } static void save_app_profile_changes_dialog_show(SaveAppProfileChangesDialog *dialog) { // Temporarily disable the "changed" signal to prevent races between the // update below and callbacks which fire when the window opens g_signal_handler_block(G_OBJECT(dialog->preview_file_menu), dialog->preview_changed_signal); save_app_profile_changes_dialog_load_values(dialog); gtk_widget_show_all(dialog->top_window); // Hide preview window by default save_app_profile_changes_dialog_set_preview_visibility(dialog, dialog->show_preview); g_signal_handler_unblock(G_OBJECT(dialog->preview_file_menu), dialog->preview_changed_signal); gtk_window_set_transient_for(GTK_WINDOW(dialog->top_window), GTK_WINDOW(gtk_widget_get_toplevel(dialog->parent))); gtk_widget_set_sensitive(dialog->parent, FALSE); } static void save_changes_callback(GtkWidget *widget, gpointer user_data) { CtkAppProfile *ctk_app_profile = (CtkAppProfile *)user_data; SaveAppProfileChangesDialog *dialog = ctk_app_profile->save_app_profile_changes_dialog; json_t *updates; nv_app_profile_config_check_backing_files(ctk_app_profile->cur_config); updates = nv_app_profile_config_validate(ctk_app_profile->cur_config, ctk_app_profile->gold_config); if (json_array_size(updates)) { dialog->updates = updates; save_app_profile_changes_dialog_show(dialog); } } static const char __enabling_application_profiles_help[] = "Application profile support can be toggled by clicking on the \"Enable application profiles\" " "checkbox. Note that changes to this setting will not be saved to disk until the \"Save Changes\" " "button is clicked."; static const char __rules_page_help[] = "The Rules page allows you to specify rules for assigning profiles to applications."; static const char __rules_page_extended_help[] = "Rules are presented in a list sorted by priority; higher-priority items appear farther " "up in the list and have a smaller priority number. Dragging and dropping a rule in this list " "reorders it (potentially modifying its source file; see below), and double-clicking on a " "given rule will open a dialog box which lets the user edit the rule (see the \"Add/Edit Rule " "Dialog Box\" help section for more information). A rule can be deleted by highlighting it in " "the view and hitting the Delete key.\n\n" "Note that changes made to rules in this page are not saved to disk until the \"Save Changes\" " "button is clicked."; static const char __profiles_page_help[] = "The Profiles page allows you to create and modify profiles in the configuration."; static const char __profiles_page_extended_help[] = "Profiles are presented in a list which can be sorted by profile name, profile settings, and " "originating source file. Double-clicking on a profile will open a dialog box which lets the user " "edit the rule (see the \"Add/Edit Profile Dialog Box\" help section for more information). A " "profile can be deleted by highlighting it in the view and hitting the Delete key.\n\n" "Note that changes made to profiles in this page are not saved to disk until the \"Save Changes\" " "button is clicked."; GtkTextBuffer *ctk_app_profile_create_help(CtkAppProfile *ctk_app_profile, GtkTextTagTable *table) { size_t j; GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "Application Profiles Help"); ctk_help_para(b, &i, "Use this page to configure application profiles for " "use with the NVIDIA® Linux Graphics Driver. Application profiles " "are collections of settings that are applied on a per-process basis. " "When the driver is loaded into the process, it detects various attributes " "of the running process and determines whether settings should be applied " "based on these attributes. This mechanism allows users to selectively override " "driver settings for a particular application without the need to set environment " "variables on the command line prior to running the application."); ctk_help_para(b, &i, "Application profile configuration consists of \"rules\" and \"profiles\". A \"profile\" defines " "what settings to use, and a \"rule\" identifies an application and defines what profile " "should be used with that application."); ctk_help_para(b, &i, "A rule identifies an application by describing various features of the application; for example, " "the name of the application binary (e.g. \"glxgears\") or a shared library loaded into the application " "(e.g. \"libpthread.so.0\"). The particular features supported by this NVIDIA® Linux implementation " "are listed below in the \"Supported Features\" section."); ctk_help_para(b, &i, "For more information on application profiles, please consult the README."); ctk_help_heading(b, &i, "Global Settings"); ctk_help_para(b, &i, "These settings apply to all profiles and rules within the configuration. "); ctk_help_data_list_print_terms(b, &i, ctk_app_profile->global_settings_help_data); ctk_help_heading(b, &i, "Rules Page"); ctk_help_para(b, &i, __rules_page_help); ctk_help_para(b, &i, __rules_page_extended_help); ctk_help_para(b, &i, "There are several buttons above the list of rules " "which can be used to modify the configuration:"); ctk_help_data_list_print_terms(b, &i, ctk_app_profile->rules_help_data); ctk_help_heading(b, &i, "Rule Properties"); ctk_help_para(b, &i, "Each row in the list of rules is divided into several " "columns which describe different properties of a rule: "); ctk_help_data_list_print_terms(b, &i, ctk_app_profile->rules_columns_help_data); ctk_help_heading(b, &i, "Add/Edit Rule Dialog Box"); ctk_help_para(b, &i, "When adding a new rule or editing an existing rule, nvidia-settings " "opens a dialog box for you to modify the rule's attributes. "); ctk_help_data_list_print_terms(b, &i, ctk_app_profile->edit_rule_dialog->help_data); ctk_help_heading(b, &i, "Profiles Page"); ctk_help_para(b, &i, __profiles_page_help); ctk_help_para(b, &i, __profiles_page_extended_help); ctk_help_para(b, &i, "There are several buttons above the list of profiles " "which can be used to modify the configuration:"); ctk_help_data_list_print_terms(b, &i, ctk_app_profile->profiles_help_data); ctk_help_heading(b, &i, "Profile Properties"); ctk_help_para(b, &i, "Each row in the list of profiles is divided into several " "columns which describe different properties of a profile:"); ctk_help_data_list_print_terms(b, &i, ctk_app_profile->profiles_columns_help_data); ctk_help_heading(b, &i, "Add/Edit Profile Dialog Box"); ctk_help_para(b, &i, "When adding a new profile or editing an existing profile, nvidia-settings " "opens a dialog box for you to modify the profile's attributes. " "See \"Editing Settings in a Profile\" for information on editing settings."); ctk_help_data_list_print_terms(b, &i, ctk_app_profile->edit_profile_dialog->top_help_data); ctk_help_data_list_print_terms(b, &i, ctk_app_profile->edit_profile_dialog->bottom_help_data); ctk_help_heading(b, &i, "Editing Settings in a Profile"); ctk_help_para(b, &i, "Settings in a profile are presented in a list view with the following columns: "); ctk_help_data_list_print_terms(b, &i, ctk_app_profile->edit_profile_dialog->setting_column_help_data); ctk_help_para(b, &i, "Settings can be modified using the following toolbar buttons: "); ctk_help_data_list_print_terms(b, &i, ctk_app_profile->edit_profile_dialog->setting_toolbar_help_data); ctk_help_heading(b, &i, "Saving and Reverting Changes"); ctk_help_para(b, &i, "Changes made to the application profile configuration will not take effect until " "they are saved to disk. Buttons to save and restore the configuration " "are located on the bottom of the Application Profiles page."); ctk_help_data_list_print_terms(b, &i, ctk_app_profile->save_reload_help_data); ctk_help_heading(b, &i, "Supported Features"); ctk_help_para(b, &i, "This NVIDIA® Linux Graphics Driver supports detection of the following features:"); for (j = 0; j < NUM_RULE_FEATURES; j++) { ctk_help_term(b, &i, "%s", rule_feature_label_strings[j]); ctk_help_para(b, &i, "%s", rule_feature_help_text[j]); } ctk_help_heading(b, &i, "Supported Setting Keys"); ctk_help_para(b, &i, "This NVIDIA® Linux Graphics Driver supports the following application profile setting " "keys. For more information on a given key, please consult the README."); for (j = 0; j < NUM_PROFILE_SETTINGS; j++) { ctk_help_term(b, &i, "%s", profile_setting_keys[j]); ctk_help_para(b, &i, "%s", profile_setting_descriptions[j]); } ctk_help_finish(b); return b; } static void enabled_check_button_toggled(GtkToggleButton *toggle_button, gpointer user_data) { CtkAppProfile *ctk_app_profile = (CtkAppProfile *)user_data; nv_app_profile_config_set_enabled(ctk_app_profile->cur_config, gtk_toggle_button_get_active(toggle_button)); ctk_config_statusbar_message(ctk_app_profile->ctk_config, "Application profiles are %s. %s", gtk_toggle_button_get_active(toggle_button) ? "enabled" : "disabled", STATUSBAR_UPDATE_WARNING); } GtkWidget* ctk_app_profile_new(CtkConfig *ctk_config) { GObject *object; CtkAppProfile *ctk_app_profile; GtkWidget *banner; GtkWidget *hseparator; GtkWidget *hbox; GtkWidget *label; GtkWidget *alignment; GtkWidget *notebook; GtkWidget *rules_page, *profiles_page; GtkWidget *toolbar; char *global_config_file; char **search_path; size_t search_path_size; ToolbarItemTemplate *save_reload_toolbar_items; size_t num_save_reload_toolbar_items; /* Create the CtkAppProfile object */ object = g_object_new(CTK_TYPE_APP_PROFILE, NULL); ctk_app_profile = CTK_APP_PROFILE(object); ctk_app_profile->ctk_config = ctk_config; gtk_box_set_spacing(GTK_BOX(ctk_app_profile), 10); /* Load app profile settings */ // TODO only load this if the page is exposed search_path = get_default_search_path(&search_path_size); global_config_file = get_default_global_config_file(); ctk_app_profile->gold_config = nv_app_profile_config_load(global_config_file, search_path, search_path_size); ctk_app_profile->cur_config = nv_app_profile_config_dup(ctk_app_profile->gold_config); free_search_path(search_path, search_path_size); free(global_config_file); ctk_app_profile->apc_profile_model = ctk_apc_profile_model_new(ctk_app_profile->cur_config); ctk_app_profile->apc_rule_model = ctk_apc_rule_model_new(ctk_app_profile->cur_config); /* Create the banner */ banner = ctk_banner_image_new(BANNER_ARTWORK_CONFIG); gtk_box_pack_start(GTK_BOX(ctk_app_profile), banner, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(ctk_app_profile), hbox, FALSE, FALSE, 0); label = gtk_label_new("Application Profiles"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); ctk_app_profile->enable_check_button = gtk_check_button_new_with_label("Enable application profiles"); gtk_box_pack_start(GTK_BOX(ctk_app_profile), ctk_app_profile->enable_check_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(ctk_app_profile->enable_check_button), "toggled", G_CALLBACK(enabled_check_button_toggled), (gpointer)ctk_app_profile); ctk_app_profile->global_settings_help_data = NULL; ctk_config_set_tooltip_and_add_help_data(ctk_app_profile->ctk_config, ctk_app_profile->enable_check_button, &ctk_app_profile->global_settings_help_data, "Enabling Application Profiles", __enabling_application_profiles_help, NULL); app_profile_load_global_settings(ctk_app_profile, ctk_app_profile->cur_config); // XXX add a search box? /* Create the primary notebook for rule/profile config */ ctk_app_profile->notebook = notebook = gtk_notebook_new(); /* Build the rules page */ rules_page = create_rules_page(ctk_app_profile); label = gtk_label_new("Rules"); ctk_config_set_tooltip(ctk_app_profile->ctk_config, label, __rules_page_help); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), rules_page, label); /* Build the profiles page */ profiles_page = create_profiles_page(ctk_app_profile); label = gtk_label_new("Profiles"); ctk_config_set_tooltip(ctk_app_profile->ctk_config, label, __profiles_page_help); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), profiles_page, label); /* Add the notebook to the main container */ gtk_box_pack_start(GTK_BOX(ctk_app_profile), notebook, TRUE, TRUE, 0); /* Create the save and restore buttons */ alignment = gtk_alignment_new(1.0, 0.5, 0.0, 0.0); toolbar = gtk_toolbar_new(); save_reload_toolbar_items = get_save_reload_toolbar_items(ctk_app_profile, &num_save_reload_toolbar_items); populate_toolbar(GTK_TOOLBAR(toolbar), save_reload_toolbar_items, num_save_reload_toolbar_items, &ctk_app_profile->save_reload_help_data, NULL, NULL); free(save_reload_toolbar_items); gtk_container_add(GTK_CONTAINER(alignment), toolbar); gtk_box_pack_start(GTK_BOX(ctk_app_profile), alignment, FALSE, FALSE, 0); gtk_widget_show_all(GTK_WIDGET(ctk_app_profile)); /* Create edit profile/rule window */ ctk_app_profile->edit_rule_dialog = edit_rule_dialog_new(ctk_app_profile); ctk_app_profile->edit_profile_dialog = edit_profile_dialog_new(ctk_app_profile); ctk_app_profile->save_app_profile_changes_dialog = save_app_profile_changes_dialog_new(ctk_app_profile); return GTK_WIDGET(ctk_app_profile); } nvidia-settings/src/gtk+-2.x/ctkdisplayconfig.c0000664000175000017500000110552512236467170021610 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include "msg.h" #include "parse.h" #include "lscf.h" #include "nvvr.h" #include "ctkutils.h" #include "ctkbanner.h" #include "ctkevent.h" #include "ctkhelp.h" #include "ctkdisplayconfig.h" #include "ctkdisplaylayout.h" #include "ctkdisplayconfig-utils.h" void layout_selected_callback(nvLayoutPtr layout, void *data); void layout_modified_callback(nvLayoutPtr layout, void *data); static void setup_layout_frame(CtkDisplayConfig *ctk_object); static void setup_selected_item_dropdown(CtkDisplayConfig *ctk_object); static void selected_item_changed(GtkWidget *widget, gpointer user_data); static void update_selected_page(CtkDisplayConfig *ctk_object); static void setup_display_page(CtkDisplayConfig *ctk_object); static void mosaic_state_toggled(GtkWidget *widget, gpointer user_data); static void display_config_changed(GtkWidget *widget, gpointer user_data); static void display_resolution_changed(GtkWidget *widget, gpointer user_data); static void display_refresh_changed(GtkWidget *widget, gpointer user_data); static void display_stereo_changed(GtkWidget *widget, gpointer user_data); static void display_rotation_changed(GtkWidget *widget, gpointer user_data); static void display_reflection_changed(GtkWidget *widget, gpointer user_data); static void display_underscan_value_changed(GtkAdjustment *adjustment, gpointer user_data); static void display_underscan_activate(GtkWidget *widget, gpointer user_data); static void display_position_type_changed(GtkWidget *widget, gpointer user_data); static void display_position_offset_activate(GtkWidget *widget, gpointer user_data); static void display_position_relative_changed(GtkWidget *widget, gpointer user_data); static void display_viewport_in_activate(GtkWidget *widget, gpointer user_data); static void display_viewport_out_activate(GtkWidget *widget, gpointer user_data); static void display_panning_activate(GtkWidget *widget, gpointer user_data); static void setup_screen_page(CtkDisplayConfig *ctk_object); static void screen_virtual_size_activate(GtkWidget *widget, gpointer user_data); static gboolean txt_focus_out(GtkWidget *widget, GdkEvent *event, gpointer user_data); static void screen_depth_changed(GtkWidget *widget, gpointer user_data); static void screen_stereo_changed(GtkWidget *widget, gpointer user_data); static void screen_position_type_changed(GtkWidget *widget, gpointer user_data); static void screen_position_offset_activate(GtkWidget *widget, gpointer user_data); static void screen_position_relative_changed(GtkWidget *widget, gpointer user_data); static void screen_metamode_clicked(GtkWidget *widget, gpointer user_data); static void screen_metamode_activate(GtkWidget *widget, gpointer user_data); static void screen_metamode_add_clicked(GtkWidget *widget, gpointer user_data); static void screen_metamode_delete_clicked(GtkWidget *widget, gpointer user_data); static void xinerama_state_toggled(GtkWidget *widget, gpointer user_data); static void apply_clicked(GtkWidget *widget, gpointer user_data); static void save_clicked(GtkWidget *widget, gpointer user_data); static void probe_clicked(GtkWidget *widget, gpointer user_data); static void advanced_clicked(GtkWidget *widget, gpointer user_data); static void reset_clicked(GtkWidget *widget, gpointer user_data); static void validation_details_clicked(GtkWidget *widget, gpointer user_data); static void display_config_attribute_changed(GtkObject *object, gpointer arg1, gpointer user_data); static void reset_layout(CtkDisplayConfig *ctk_object); static gboolean force_layout_reset(gpointer user_data); static void user_changed_attributes(CtkDisplayConfig *ctk_object); static XConfigPtr xconfig_generate(XConfigPtr xconfCur, Bool merge, Bool *merged, void *callback_data); /*** D E F I N I T I O N S ***************************************************/ #define DEFAULT_SWITCH_MODE_TIMEOUT 15 /* When switching modes, this is the * number of seconds the user has to * accept the new mode before we switch * back to the original mode. */ #define TAB " " #define BIGTAB " " #define GTK_RESPONSE_USER_DISPLAY_ENABLE_TWINVIEW 1 #define GTK_RESPONSE_USER_DISPLAY_ENABLE_XSCREEN 2 #define MIN_LAYOUT_SCREENSIZE 600 typedef struct SwitchModeCallbackInfoRec { CtkDisplayConfig *ctk_object; int screen; } SwitchModeCallbackInfo; /* Return values used by X config generation functions */ #define XCONFIG_GEN_OK 0 #define XCONFIG_GEN_ERROR 1 #define XCONFIG_GEN_ABORT 2 /* Validation types */ #define VALIDATE_APPLY 0 #define VALIDATE_SAVE 1 /* Underscan range of values */ #define UNDERSCAN_MIN_PERCENT 0 #define UNDERSCAN_MAX_PERCENT 35 /*** G L O B A L S ***********************************************************/ static int __position_table[] = { CONF_ADJ_ABSOLUTE, CONF_ADJ_RIGHTOF, CONF_ADJ_LEFTOF, CONF_ADJ_ABOVE, CONF_ADJ_BELOW, CONF_ADJ_RELATIVE }; /* Layout tooltips */ static const char * __layout_hidden_label_help = "To select a display, use the \"Selection\" dropdown menu."; static const char * __layout_xinerama_button_help = "The Enable Xinerama checkbox enables the Xinerama X extension; changing " "this option will require restarting your X server. Note that when Xinerama " "is enabled, resolution changes will also require restarting your X server."; static const char * __selected_item_help = "The Selection drop-down allows you to pick which X screen or display device " "to configure."; /* Display tooltips */ static const char * __dpy_configuration_mnu_help = "The Configure drop-down allows you to select the desired configuration " "for the currently selected display device."; static const char * __layout_sli_mosaic_button_help = "The Enable SLI Mosaic checkbox enables SLI Mosaic for all GPUs"; static const char * __layout_base_mosaic_surround_button_help = "The Enable Base Mosaic (Surround) checkbox enables Surround, where up to 3 " "displays are supported."; static const char * __layout_base_mosaic_full_button_help = "The Enable Base Mosaic checkbox enables Base Mosaic."; static const char * __dpy_resolution_mnu_help = "The Resolution drop-down allows you to select a desired resolution " "for the currently selected display device. The 'scaled' qualifier indicates " "an aspect-scaled common resolution simulated through a MetaMode ViewPort " "configuration."; static const char * __dpy_refresh_mnu_help = "The Refresh drop-down allows you to select a desired refresh rate " "for the currently selected display device. Note that the selected " "resolution may restrict the available refresh rates."; static const char * __dpy_stereo_help = "The Display Passive Stereo Eye drop-down allows you to select a desired " "stereo eye the display should output when Passive Stereo (Mode 4) is " "enabled."; static const char * __dpy_rotation_help = "The Display Rotation drop-down allows you to select the desired orientation " "for the display."; static const char * __dpy_reflection_help = "The Display Reflection drop-down allows you to choose the axes across which " "monitor contents should be reflected."; static const char * __dpy_viewport_in_help = "This defines the width and height in pixels of the region that should be " "displayed from the desktop."; static const char * __dpy_viewport_out_help = "This defines the width, height, and offset of the output region in raster " "space, into which the ViewPortIn is to be displayed (along with any " "transform, such as rotation, reflection, etc.)"; static const char * __dpy_position_type_help = "The Position Type drop-down allows you to set how the selected display " "device is placed within the X screen. This is only available when " "multiple display devices are present."; static const char * __dpy_position_relative_help = "The Position Relative drop-down allows you to set which other display " "device (within the X screen) the selected display device should be " "relative to. This is only available when multiple display " "devices are present."; static const char * __dpy_underscan_text_help = "The Underscan feature allows configuration of an underscan border " "(in pixels) around the ViewPortOut."; static const char * __dpy_position_offset_help = "The Position Offset identifies the top left of the display device " "as an offset from the top left of the X screen position. This is only " "available when multiple display devices are present."; static const char * __dpy_panning_help = "The Panning Domain sets the total width/height that the display " "device may pan within."; static const char * __dpy_primary_help = "The primary display is often used by window managers to know which of the " "displays in a multi-display setup to show information and other " "important windows etc; changing this option may require restarting your X " "server, depending on your window manager."; /* Screen tooltips */ static const char * __screen_virtual_size_help = "The Virtual Size allows setting the size of the resulting X screen. " "The virtual size must be at least large enough to hold all the display " "devices that are currently enabled for scanout."; static const char * __screen_depth_help = "The Depth drop-down allows setting of the color quality for the selected " "screen; changing this option will require restarting your X server."; static const char * __screen_stereo_help = "The Stereo Mode drop-down allows setting of the stereo mode for the selected " "screen; changing this option will require restarting your X server."; static const char * __screen_position_type_help = "The Position Type drop-down appears when two or more X screens are active. " "This allows you to set how the selected screen " "is placed within the X server layout; changing this option will require " "restarting your X server."; static const char * __screen_position_relative_help = "The Position Relative drop-down appears when two or more X screens " "are active. This allows you to set which other Screen " "the selected screen should be relative to; changing this option will " "require restarting your X server."; static const char * __screen_position_offset_help = "The Position Offset drop-down appears when two or more X screens " "are active. This identifies the top left of the selected Screen as " "an offset from the top left of the X server layout in absolute coordinates; " "changing this option will require restarting your X server."; static const char * __screen_metamode_help = "The MetaMode selection menu allows you to set the currently displayed " "MetaMode for the selected screen; This option can be applied to " "your currently running X server."; static const char * __screen_metamode_add_button_help = "The Add MetaMode button allows you to create a new MetaMode for the " "selected screen; This option can be applied to your currently " "running X server."; static const char * __screen_metamode_delete_button_help = "The Delete MetaMode button allows you to delete the currently selected " "MetaMode for the screen; This option can be applied to your currently " "running X server."; /* General button tooltips */ static const char * __apply_button_help = "The Apply button allows you to apply changes made to the server layout."; static const char * __detect_displays_button_help = "The Detect Displays button allows you to probe for new display devices " "that may have been hotplugged."; static const char * __advanced_button_help = "The Advanced/Basic button toggles between a basic view, and an advanced view " "with extra configuration options."; static const char * __reset_button_help = "The Reset button will re-probe the X server for current configuration. Any " "alterations you may have made (and not applied) will be lost."; static const char * __save_button_help = "The Save to X Configuration File button allows you to save the current " "X server configuration settings to an X configuration file."; /*** F U N C T I O N S *******************************************************/ /** get_cur_screen_pos() ********************************************* * * Grabs a copy of the currently selected screen position. * **/ static void get_cur_screen_pos(CtkDisplayConfig *ctk_object) { nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!screen) return; ctk_object->cur_screen_pos.x = screen->dim.x; ctk_object->cur_screen_pos.y = screen->dim.y; } /* get_cur_screen_pos() */ /** check_screen_pos_changed() *************************************** * * Checks to see if the screen's position changed. If so this * function sets the apply_possible flag to FALSE. * **/ static void check_screen_pos_changed(CtkDisplayConfig *ctk_object) { GdkPoint old_pos; /* Cache the old position */ old_pos.x = ctk_object->cur_screen_pos.x; old_pos.y = ctk_object->cur_screen_pos.y; /* Get the new position */ get_cur_screen_pos(ctk_object); if (old_pos.x != ctk_object->cur_screen_pos.x || old_pos.y != ctk_object->cur_screen_pos.y) { ctk_object->apply_possible = FALSE; } } /* check_screen_pos_changed() */ /** layout_supports_depth_30() *************************************** * * Returns TRUE if all the screens in the layout are driven by GPUs * that support depth 30. * **/ static gboolean layout_supports_depth_30(nvLayoutPtr layout) { nvScreenPtr screen; for (screen = layout->screens; screen; screen = screen->next_in_layout) { if (!screen->allow_depth_30) { return FALSE; } } return TRUE; } /* layout_supports_depth_30() */ /** register_layout_events() ***************************************** * * Registers to display-configuration related events relating to all * parts of the given layout structure. * **/ static void register_layout_events(CtkDisplayConfig *ctk_object) { nvLayoutPtr layout = ctk_object->layout; nvScreenPtr screen; nvGpuPtr gpu; /* Register for GPU events */ for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { if (!gpu->handle) continue; g_signal_connect(G_OBJECT(gpu->ctk_event), CTK_EVENT_NAME(NV_CTRL_PROBE_DISPLAYS), G_CALLBACK(display_config_attribute_changed), (gpointer) ctk_object); g_signal_connect(G_OBJECT(gpu->ctk_event), CTK_EVENT_NAME(NV_CTRL_MODE_SET_EVENT), G_CALLBACK(display_config_attribute_changed), (gpointer) ctk_object); } /* Register for X screen events */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { if (!screen->handle) continue; g_signal_connect(G_OBJECT(screen->ctk_event), CTK_EVENT_NAME(NV_CTRL_STRING_NVIDIA_XINERAMA_INFO_ORDER), G_CALLBACK(display_config_attribute_changed), (gpointer) ctk_object); g_signal_connect(G_OBJECT(screen->ctk_event), CTK_EVENT_NAME(NV_CTRL_STRING_MOVE_METAMODE), G_CALLBACK(display_config_attribute_changed), (gpointer) ctk_object); g_signal_connect(G_OBJECT(screen->ctk_event), CTK_EVENT_NAME(NV_CTRL_STRING_DELETE_METAMODE), G_CALLBACK(display_config_attribute_changed), (gpointer) ctk_object); } } /* register_layout_events() */ /** unregister_layout_events() ***************************************** * * Unregisters display-configuration related events relating to all * parts of the given layout structure as registered by * Unregisters all Screen/Gpu events. * **/ static void unregister_layout_events(CtkDisplayConfig *ctk_object) { nvLayoutPtr layout = ctk_object->layout; nvScreenPtr screen; nvGpuPtr gpu; /* Unregister GPU events */ for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { if (!gpu->handle) continue; g_signal_handlers_disconnect_matched(G_OBJECT(gpu->ctk_event), G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, // Signal ID 0, // Signal Detail NULL, // Closure G_CALLBACK(display_config_attribute_changed), (gpointer) ctk_object); } /* Unregister X screen events */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { if (!screen->handle) continue; g_signal_handlers_disconnect_matched(G_OBJECT(screen->ctk_event), G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, // Signal ID 0, // Signal Detail NULL, // Closure G_CALLBACK(display_config_attribute_changed), (gpointer) ctk_object); } } /* unregister_layout_events() */ /** consolidate_xinerama() ******************************************* * * Ensures that all X screens have the same depth if Xinerama is * enabled. * **/ static void consolidate_xinerama(CtkDisplayConfig *ctk_object, nvScreenPtr screen) { nvLayoutPtr layout = ctk_object->layout; nvScreenPtr other; if (!layout->xinerama_enabled) return; /* If no screen was given, pick one */ if (!screen) { screen = layout_get_a_screen(layout, NULL); } if (!screen) return; /** * Make sure all screens support depth 30, and if not, * we should set depth 24. **/ if ((screen->depth == 30) && (layout_supports_depth_30(layout) == FALSE)) { screen->depth = 24; } /* If Xinerama is enabled, all screens must have the same depth. */ for (other = layout->screens; other; other = other->next_in_layout) { if (other == screen) continue; other->depth = screen->depth; } } /* consolidate_xinerama() */ /** update_btn_apply() ************************************************** * * Updates the apply button's sensitivity * **/ static void update_btn_apply(CtkDisplayConfig *ctk_object, Bool sensitive) { gtk_widget_set_sensitive(ctk_object->btn_apply, sensitive); } /* update_btn_apply() */ /** xconfigPrint() ****************************************************** * * xconfigPrint() - this is the one entry point that a user of the * XF86Config-Parser library must provide. * **/ void xconfigPrint(MsgType t, const char *msg) { typedef struct { MsgType msg_type; char *prefix; FILE *stream; int newline; } MessageTypeAttributes; char *prefix = NULL; int i, newline = FALSE; FILE *stream = stdout; const MessageTypeAttributes msg_types[] = { { ParseErrorMsg, "PARSE ERROR: ", stderr, TRUE }, { ParseWarningMsg, "PARSE WARNING: ", stderr, TRUE }, { ValidationErrorMsg, "VALIDATION ERROR: ", stderr, TRUE }, { InternalErrorMsg, "INTERNAL ERROR: ", stderr, TRUE }, { WriteErrorMsg, "ERROR: ", stderr, TRUE }, { WarnMsg, "WARNING: ", stderr, TRUE }, { ErrorMsg, "ERROR: ", stderr, TRUE }, { DebugMsg, "DEBUG: ", stdout, FALSE }, { UnknownMsg, NULL, stdout, FALSE }, }; for (i = 0; msg_types[i].msg_type != UnknownMsg; i++) { if (msg_types[i].msg_type == t) { prefix = msg_types[i].prefix; newline = msg_types[i].newline; stream = msg_types[i].stream; break; } } if (newline) fprintf(stream, "\n"); fprintf(stream, "%s %s\n", prefix, msg); if (newline) fprintf(stream, "\n"); } /* xconfigPrint */ /** generate_xconf_metamode_str() ************************************ * * Returns the metamode strings of a screen: * * "mode1_1, mode1_2, mode1_3 ... ; mode 2_1, mode 2_2, mode 2_3 ... ; ..." * **/ static int generate_xconf_metamode_str(CtkDisplayConfig *ctk_object, nvScreenPtr screen, gchar **pMetamode_strs) { nvLayoutPtr layout = screen->layout; gchar *metamode_strs = NULL; gchar *metamode_str; gchar *tmp; int metamode_idx; nvMetaModePtr metamode; int len = 0; int start_width; int start_height; int vendrel = NvCtrlGetVendorRelease(layout->handle); char *vendstr = NvCtrlGetServerVendor(layout->handle); int xorg_major; int xorg_minor; Bool longStringsOK; /* Only X.Org 7.2 or > supports long X config lines */ xorg_major = (vendrel / 10000000); xorg_minor = (vendrel / 100000) % 100; if (g_strrstr(vendstr, "X.Org") && ((xorg_major > 7) || ((xorg_major == 7) && (xorg_minor >= 2)))) { longStringsOK = TRUE; } else { longStringsOK = FALSE; } /* In basic view, always specify the currently selected * metamode first in the list so the X server starts * in this mode. */ if (!ctk_object->advanced_mode) { metamode_strs = screen_get_metamode_str(screen, screen->cur_metamode_idx, 0); len = strlen(metamode_strs); start_width = screen->cur_metamode->edim.width; start_height = screen->cur_metamode->edim.height; } else { start_width = screen->metamodes->edim.width; start_height = screen->metamodes->edim.height; } for (metamode_idx = 0, metamode = screen->metamodes; (metamode_idx < screen->num_metamodes) && metamode; metamode_idx++, metamode = metamode->next) { int metamode_len; /* Only write out metamodes that were specified by the user */ if (!IS_METAMODE_SOURCE_USER(metamode->source)) { continue; } /* The current mode was already included */ if (!ctk_object->advanced_mode && (metamode_idx == screen->cur_metamode_idx)) continue; /* XXX In basic mode, only write out metamodes that are smaller than * the starting (selected) metamode. This is to work around * a bug in XRandR where starting with a root window that is * smaller that the bounding box of all the metamodes will result * in an unwanted panning domain being setup for the first mode. */ if ((!ctk_object->advanced_mode) && ((metamode->edim.width > start_width) || (metamode->edim.height > start_height))) continue; metamode_str = screen_get_metamode_str(screen, metamode_idx, 0); if (!metamode_str) continue; metamode_len = strlen(metamode_str); if (!longStringsOK && (len + metamode_len > 900)) { GtkWidget *dlg; gchar *msg; GtkWidget *parent; gint result; msg = g_strdup_printf ("Truncate the MetaMode list?\n" "\n" "Long MetaMode strings (greater than 900 characters) are not\n" "supported by the current X server. Truncating the MetaMode\n" "list, so that the MetaMode string fits within 900 characters,\n" "will cause only the first %d MetaModes to be written to the X\n" "configuration file.\n" "\n" "NOTE: Writing all the MetaModes to the X Configuration\n" "file may result in parse errors and failing to start the\n" "X server.", metamode_idx); parent = ctk_get_parent_window(GTK_WIDGET(ctk_object)); if (!parent) { nv_warning_msg("%s", msg); g_free(msg); break; } dlg = gtk_message_dialog_new (GTK_WINDOW(parent), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, "%s", msg); gtk_dialog_add_buttons(GTK_DIALOG(dlg), "Truncate MetaModes", GTK_RESPONSE_YES, "Write all MetaModes", GTK_RESPONSE_NO, "Cancel", GTK_RESPONSE_CANCEL, NULL); result = gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); g_free(msg); if (result == GTK_RESPONSE_YES) { break; /* Crop the list of metamodes */ } else if (result == GTK_RESPONSE_NO) { longStringsOK = 1; /* Write the full list of metamodes */ } else { return XCONFIG_GEN_ABORT; /* Don't save the X config file */ } } if (!metamode_strs) { metamode_strs = metamode_str; len += metamode_len; } else { tmp = g_strconcat(metamode_strs, "; ", metamode_str, NULL); g_free(metamode_str); g_free(metamode_strs); metamode_strs = tmp; len += metamode_len +2; } } *pMetamode_strs = metamode_strs; return XCONFIG_GEN_OK; } /* generate_xconf_metamode_str() */ /** assign_screen_positions() **************************************** * * Assign the initial position of the X screens. * * - If Xinerama is enabled or the X server ABI >= 12, query to the SCREEN_RECTANGLE returns position. * * - Otherwise assume "right-of" orientation. * **/ static void assign_screen_positions(CtkDisplayConfig *ctk_object) { nvLayoutPtr layout = ctk_object->layout; nvScreenPtr prev_screen = NULL; nvScreenPtr screen; char *screen_info; GdkRectangle screen_parsed_info; ReturnStatus ret; /* Setup screen positions */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { screen_info = NULL; if (screen->handle) { ret = NvCtrlGetStringAttribute (screen->handle, NV_CTRL_STRING_SCREEN_RECTANGLE, &screen_info); if (ret != NvCtrlSuccess) { screen_info = NULL; } } if (screen_info) { /* Parse the positioning information */ screen_parsed_info.x = -1; screen_parsed_info.y = -1; screen_parsed_info.width = -1; screen_parsed_info.height = -1; parse_token_value_pairs(screen_info, apply_screen_info_token, &screen_parsed_info); if (screen_parsed_info.x >= 0 && screen_parsed_info.y >= 0 && screen_parsed_info.width >= 0 && screen_parsed_info.height) { ctk_display_layout_set_screen_position (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, CONF_ADJ_ABSOLUTE, NULL, screen_parsed_info.x, screen_parsed_info.y); } XFree(screen_info); } else if (prev_screen) { /* Set this screen right of the previous */ ctk_display_layout_set_screen_position (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, CONF_ADJ_RIGHTOF, prev_screen, 0, 0); } prev_screen = screen; } } /* assign_screen_positions() */ /* Widget creation functions *****************************************/ /** ctk_display_config_get_type() ************************************ * * Returns the display configuration type. * **/ GType ctk_display_config_get_type(void) { static GType ctk_display_config_type = 0; if (!ctk_display_config_type) { static const GTypeInfo ctk_display_config_info = { sizeof (CtkDisplayConfigClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof(CtkDisplayConfig), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_display_config_type = g_type_register_static (GTK_TYPE_VBOX, "CtkDisplayConfig", &ctk_display_config_info, 0); } return ctk_display_config_type; } /* ctk_display_config_get_type() */ /** create_validation_dialog() *************************************** * * Creates the Validation Information dialog widget. * **/ static GtkWidget * create_validation_dialog(CtkDisplayConfig *ctk_object) { GtkWidget *dialog; GtkWidget *image; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *label; GtkWidget *button; GtkWidget *scrolled_window; GtkWidget *textview; GtkTextBuffer *buffer; /* Display validation override confirmation dialog */ dialog = gtk_dialog_new_with_buttons ("Layout Inconsistencie(s)", GTK_WINDOW(gtk_widget_get_parent(GTK_WIDGET(ctk_object))), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, NULL); /* Main horizontal box */ hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 5); /* Pack the information icon */ image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG); gtk_misc_set_alignment(GTK_MISC(image), 0.0f, 0.0f); gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 5); /* Main vertical box */ vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5); /* Pack the main message */ label = gtk_label_new("The current layout has some inconsistencies."); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.0f); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); /* Details button */ button = gtk_button_new(); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(validation_details_clicked), (gpointer) ctk_object); ctk_object->btn_validation_override_show = button; /* Text view */ textview = gtk_text_view_new(); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(textview), FALSE); gtk_text_view_set_editable(GTK_TEXT_VIEW(textview), FALSE); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_WORD); gtk_text_view_set_left_margin(GTK_TEXT_VIEW(textview), 5); gtk_text_view_set_pixels_above_lines(GTK_TEXT_VIEW(textview), 5); buffer = gtk_text_buffer_new(NULL); gtk_text_view_set_buffer(GTK_TEXT_VIEW(textview), GTK_TEXT_BUFFER(buffer)); ctk_object->buf_validation_override = buffer; scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(scrolled_window), textview); /* Pack the scrolled window */ hbox = gtk_hbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), scrolled_window, TRUE, TRUE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); ctk_object->box_validation_override_details = hbox; /* Action Buttons */ gtk_dialog_add_button(GTK_DIALOG(dialog), "Auto Fix", GTK_RESPONSE_APPLY); gtk_dialog_add_button(GTK_DIALOG(dialog), "Ignore", GTK_RESPONSE_ACCEPT); /* Keep track of the cancel button so we can set focus on it */ button = gtk_dialog_add_button(GTK_DIALOG(dialog), "Cancel", GTK_RESPONSE_REJECT); ctk_object->btn_validation_override_cancel = button; gtk_widget_show_all(GTK_DIALOG(dialog)->vbox); return dialog; } /* create_validation_dialog() */ /** create_validation_apply_dialog() ********************************* * * Creates the Validation Apply Information dialog widget. * **/ static GtkWidget * create_validation_apply_dialog(CtkDisplayConfig *ctk_object) { GtkWidget *dialog; GtkWidget *image; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *label; gchar bullet[8]; // UTF8 Bullet string int len; gchar *str; /* Convert the Unicode "Bullet" Character into a UTF8 string */ len = g_unichar_to_utf8(0x2022, bullet); bullet[len] = '\0'; /* Display validation override confirmation dialog */ dialog = gtk_dialog_new_with_buttons ("Cannot Apply", GTK_WINDOW(gtk_widget_get_parent(GTK_WIDGET(ctk_object))), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, NULL); ctk_object->dlg_validation_apply = dialog; /* Main horizontal box */ hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 5); /* Pack the information icon */ image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG); gtk_misc_set_alignment(GTK_MISC(image), 0.0f, 0.0f); gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 5); /* Main vertical box */ vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5); /* Pack the main message */ str = g_strdup_printf("The current settings cannot be completely applied\n" "due to one or more of the following reasons:\n" "\n" "%s The location of an X screen has changed.\n" "%s The location type of an X screen has changed.\n" "%s The color depth of an X screen has changed.\n" "%s An X screen has been added or removed.\n" "%s Xinerama is being enabled/disabled.\n" "\n" "For all the requested settings to take effect,\n" "you must save the configuration to the X config\n" "file and restart the X server.", bullet, bullet, bullet, bullet, bullet); label = gtk_label_new(str); g_free(str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.0f); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); /* Action Buttons */ gtk_dialog_add_button(GTK_DIALOG(dialog), "Apply What Is Possible", GTK_RESPONSE_ACCEPT); gtk_dialog_add_button(GTK_DIALOG(dialog), "Cancel", GTK_RESPONSE_REJECT); gtk_widget_show_all(GTK_DIALOG(dialog)->vbox); return dialog; } /* create_validation_apply_dialog() */ /** user_changed_attributes() ************************************* * * Turns off forced reset (of the layout config when the current * X server configuration changes). * **/ static void user_changed_attributes(CtkDisplayConfig *ctk_object) { if (ctk_object->forced_reset_allowed) { update_btn_apply(ctk_object, TRUE); ctk_object->forced_reset_allowed = FALSE; } } /* user_changed_attributes() */ /** screen_primary_display_toggled() ****************************** * * Sets the primary display for a screen. * **/ static void screen_primary_display_toggled(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); gint enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); nvScreenPtr screen = display->screen; if (enabled) { screen->primaryDisplay = display; ctk_object->primary_display_changed = TRUE; } user_changed_attributes(ctk_object); } /* screen_primary_display_toggled() */ /** screen_size_changed() ***************************************** * * Hides layout widget. * **/ static void screen_size_changed(GdkScreen *screen, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); gint h = gdk_screen_get_height(screen); if ( h < MIN_LAYOUT_SCREENSIZE ) { gtk_widget_hide_all(ctk_object->obj_layout); gtk_widget_show(ctk_object->label_layout); return; } gtk_widget_hide(ctk_object->label_layout); gtk_widget_show_all(ctk_object->obj_layout); } /* screen_size_changed() */ /** update_gui() ***************************************************** * * Sync state of all widgets to reflect current configuration * **/ static void update_gui(CtkDisplayConfig *ctk_object) { setup_display_page(ctk_object); setup_screen_page(ctk_object); setup_selected_item_dropdown(ctk_object); update_selected_page(ctk_object); setup_layout_frame(ctk_object); } /* update_gui() */ /** ctk_display_config_new() ***************************************** * * Display Configuration widget creation. * **/ GtkWidget* ctk_display_config_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config) { GObject *object; CtkDisplayConfig *ctk_object; GtkWidget *banner; GtkWidget *frame; GtkWidget *hbox; GtkWidget *vbox; GdkScreen *screen; GtkWidget *label; GtkWidget *eventbox; GtkWidget *hseparator; GtkRequisition req; GSList *labels = NULL; GSList *slitem; gint max_width; GtkWidget *menu; GtkWidget *menu_item; gchar *err_str = NULL; gchar *layout_str = NULL; gchar *sli_mode = NULL; ReturnStatus ret; /* * Get SLI Mode. If SLI Mode is "Mosaic", do not * load this page * */ ret = NvCtrlGetStringAttribute(handle, NV_CTRL_STRING_SLI_MODE, &sli_mode); if (ret == NvCtrlSuccess && !g_ascii_strcasecmp(sli_mode, "Mosaic")) { XFree(sli_mode); return NULL; } if (sli_mode) { XFree(sli_mode); } /* * Create the ctk object * */ object = g_object_new(CTK_TYPE_DISPLAY_CONFIG, NULL); ctk_object = CTK_DISPLAY_CONFIG(object); ctk_object->handle = handle; ctk_object->ctk_config = ctk_config; ctk_object->apply_possible = TRUE; ctk_object->reset_required = FALSE; ctk_object->forced_reset_allowed = TRUE; ctk_object->notify_user_of_reset = TRUE; ctk_object->ignore_reset_events = FALSE; ctk_object->primary_display_changed = FALSE; ctk_object->last_resolution_idx = -1; /* Set container properties of the object & pack the banner */ gtk_box_set_spacing(GTK_BOX(ctk_object), 5); banner = ctk_banner_image_new(BANNER_ARTWORK_DISPLAY_CONFIG); gtk_box_pack_start(GTK_BOX(object), banner, FALSE, FALSE, 0); /* * Create the display configuration widgets * */ /* Load the layout structure from the X server */ ctk_object->layout = layout_load_from_server(handle, &err_str); /* If we failed to load, tell the user why */ if (err_str || !ctk_object->layout) { gchar *str; if (!err_str) { str = g_strdup("Unable to load X Server Display " "Configuration page."); } else { str = g_strdup_printf("Unable to load X Server Display " "Configuration page:\n\n%s", err_str); g_free(err_str); } label = gtk_label_new(str); g_free(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_container_add(GTK_CONTAINER(object), label); /* Show the GUI */ gtk_widget_show_all(GTK_WIDGET(ctk_object)); return GTK_WIDGET(ctk_object); } /* Register all Screen/Gpu events. */ register_layout_events(ctk_object); /* Create the layout widget */ ctk_object->obj_layout = ctk_display_layout_new(handle, ctk_config, ctk_object->layout, 300, /* min width */ 225); /* min height */ /* Make sure all X screens have the same depth if Xinerama is enabled */ consolidate_xinerama(ctk_object, NULL); /* Make sure we have some kind of positioning */ assign_screen_positions(ctk_object); /* Grab the current screen position for "apply possible" tracking */ get_cur_screen_pos(ctk_object); /* * Create the widgets * */ /* Create label to replace layout widget */ eventbox = gtk_event_box_new(); layout_str = g_strdup_printf("(hidden because screen height is less than %d pixels)", MIN_LAYOUT_SCREENSIZE); ctk_object->label_layout = gtk_label_new(layout_str); gtk_container_add(GTK_CONTAINER(eventbox), ctk_object->label_layout); ctk_config_set_tooltip(ctk_config, eventbox, __layout_hidden_label_help); g_free(layout_str); screen = gtk_widget_get_screen(GTK_WIDGET(ctk_object)); g_signal_connect(G_OBJECT(screen), "size-changed", G_CALLBACK(screen_size_changed), (gpointer) ctk_object); /* Mosaic button */ ctk_object->chk_mosaic_enabled = gtk_check_button_new_with_label(""); g_signal_connect(G_OBJECT(ctk_object->chk_mosaic_enabled), "toggled", G_CALLBACK(mosaic_state_toggled), (gpointer) ctk_object); /* Xinerama button */ ctk_object->chk_xinerama_enabled = gtk_check_button_new_with_label("Enable Xinerama"); ctk_config_set_tooltip(ctk_config, ctk_object->chk_xinerama_enabled, __layout_xinerama_button_help); g_signal_connect(G_OBJECT(ctk_object->chk_xinerama_enabled), "toggled", G_CALLBACK(xinerama_state_toggled), (gpointer) ctk_object); /* Selected display/X screen dropdown */ ctk_object->mnu_selected_item = gtk_option_menu_new(); ctk_config_set_tooltip(ctk_config, ctk_object->mnu_selected_item, __selected_item_help); g_signal_connect(G_OBJECT(ctk_object->mnu_selected_item), "changed", G_CALLBACK(selected_item_changed), (gpointer) ctk_object); /* Display configuration (Disabled, TwinView, Separate X screen) */ ctk_object->mnu_display_config = gtk_option_menu_new(); ctk_config_set_tooltip(ctk_config, ctk_object->mnu_display_config, __dpy_configuration_mnu_help); g_signal_connect(G_OBJECT(ctk_object->mnu_display_config), "changed", G_CALLBACK(display_config_changed), (gpointer) ctk_object); /* Display disable dialog */ ctk_object->txt_display_disable = gtk_label_new(""); ctk_object->dlg_display_disable = gtk_dialog_new_with_buttons ("Disable Display Device", GTK_WINDOW(gtk_widget_get_parent(GTK_WIDGET(ctk_object))), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, NULL); ctk_object->btn_display_disable_off = gtk_dialog_add_button(GTK_DIALOG(ctk_object->dlg_display_disable), "Remove", GTK_RESPONSE_ACCEPT); ctk_object->btn_display_disable_cancel = gtk_dialog_add_button(GTK_DIALOG(ctk_object->dlg_display_disable), "Ignore", GTK_RESPONSE_CANCEL); gtk_window_set_resizable(GTK_WINDOW(ctk_object->dlg_display_disable), FALSE); /* Display resolution */ ctk_object->mnu_display_resolution = gtk_option_menu_new(); ctk_config_set_tooltip(ctk_config, ctk_object->mnu_display_resolution, __dpy_resolution_mnu_help); g_signal_connect(G_OBJECT(ctk_object->mnu_display_resolution), "changed", G_CALLBACK(display_resolution_changed), (gpointer) ctk_object); /* Display refresh */ ctk_object->mnu_display_refresh = gtk_option_menu_new(); ctk_config_set_tooltip(ctk_config, ctk_object->mnu_display_refresh, __dpy_refresh_mnu_help); g_signal_connect(G_OBJECT(ctk_object->mnu_display_refresh), "changed", G_CALLBACK(display_refresh_changed), (gpointer) ctk_object); /* Display modeline modename */ ctk_object->txt_display_modename = gtk_label_new(""); gtk_label_set_selectable(GTK_LABEL(ctk_object->txt_display_modename), TRUE); /* Display passive stereo eye dropdown */ ctk_object->mnu_display_stereo = gtk_option_menu_new(); menu = gtk_menu_new(); menu_item = gtk_menu_item_new_with_label("None"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Left"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Right"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_option_menu_set_menu (GTK_OPTION_MENU(ctk_object->mnu_display_stereo), menu); ctk_config_set_tooltip(ctk_config, ctk_object->mnu_display_stereo, __dpy_stereo_help); g_signal_connect(G_OBJECT(ctk_object->mnu_display_stereo), "changed", G_CALLBACK(display_stereo_changed), (gpointer) ctk_object); /* Display rotation dropdown */ ctk_object->mnu_display_rotation = gtk_option_menu_new(); menu = gtk_menu_new(); menu_item = gtk_menu_item_new_with_label("No Rotation"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Rotate Left"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Invert"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Rotate Right"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_option_menu_set_menu (GTK_OPTION_MENU(ctk_object->mnu_display_rotation), menu); ctk_config_set_tooltip(ctk_config, ctk_object->mnu_display_rotation, __dpy_rotation_help); g_signal_connect(G_OBJECT(ctk_object->mnu_display_rotation), "changed", G_CALLBACK(display_rotation_changed), (gpointer) ctk_object); /* Display reflection dropdown */ ctk_object->mnu_display_reflection = gtk_option_menu_new(); menu = gtk_menu_new(); menu_item = gtk_menu_item_new_with_label("No Reflection"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Reflect along X"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Reflect along Y"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Reflect along XY"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_option_menu_set_menu (GTK_OPTION_MENU(ctk_object->mnu_display_reflection), menu); ctk_config_set_tooltip(ctk_config, ctk_object->mnu_display_reflection, __dpy_reflection_help); g_signal_connect(G_OBJECT(ctk_object->mnu_display_reflection), "changed", G_CALLBACK(display_reflection_changed), (gpointer) ctk_object); /* Display Underscan text box and slider */ ctk_object->txt_display_underscan = gtk_entry_new_with_max_length(6); gtk_entry_set_width_chars(GTK_ENTRY(ctk_object->txt_display_underscan), 6); gtk_entry_set_text(GTK_ENTRY(ctk_object->txt_display_underscan), "0"); ctk_config_set_tooltip(ctk_config, ctk_object->txt_display_underscan, __dpy_underscan_text_help); g_signal_connect(G_OBJECT(ctk_object->txt_display_underscan), "activate", G_CALLBACK(display_underscan_activate), (gpointer) ctk_object); ctk_object->adj_display_underscan = gtk_adjustment_new(0, UNDERSCAN_MIN_PERCENT, UNDERSCAN_MAX_PERCENT, 1, 1, 0.0); ctk_object->sld_display_underscan = gtk_hscale_new(GTK_ADJUSTMENT(ctk_object->adj_display_underscan)); gtk_scale_set_draw_value(GTK_SCALE(ctk_object->sld_display_underscan), FALSE); ctk_config_set_tooltip(ctk_config, ctk_object->sld_display_underscan, __dpy_underscan_text_help); g_signal_connect(G_OBJECT(ctk_object->adj_display_underscan), "value_changed", G_CALLBACK(display_underscan_value_changed), (gpointer) ctk_object); /* Display Position Type (Absolute/Relative Menu) */ ctk_object->mnu_display_position_type = gtk_option_menu_new(); menu = gtk_menu_new(); menu_item = gtk_menu_item_new_with_label("Absolute"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Right of"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Left of"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Above"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Below"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Clones"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_option_menu_set_menu (GTK_OPTION_MENU(ctk_object->mnu_display_position_type), menu); ctk_config_set_tooltip(ctk_config, ctk_object->mnu_display_position_type, __dpy_position_type_help); g_signal_connect(G_OBJECT(ctk_object->mnu_display_position_type), "changed", G_CALLBACK(display_position_type_changed), (gpointer) ctk_object); /* Display Position Relative (Display device to be relative to) */ ctk_object->mnu_display_position_relative = gtk_option_menu_new(); ctk_config_set_tooltip(ctk_config, ctk_object->mnu_display_position_relative, __dpy_position_relative_help); g_signal_connect(G_OBJECT(ctk_object->mnu_display_position_relative), "changed", G_CALLBACK(display_position_relative_changed), (gpointer) ctk_object); /* Display Position Offset (Absolute position) */ ctk_object->txt_display_position_offset = gtk_entry_new(); ctk_config_set_tooltip(ctk_config, ctk_object->txt_display_position_offset, __dpy_position_offset_help); g_signal_connect(G_OBJECT(ctk_object->txt_display_position_offset), "activate", G_CALLBACK(display_position_offset_activate), (gpointer) ctk_object); /* Display ViewPortIn */ ctk_object->txt_display_viewport_in = gtk_entry_new(); ctk_config_set_tooltip(ctk_config, ctk_object->txt_display_viewport_in, __dpy_viewport_in_help); g_signal_connect(G_OBJECT(ctk_object->txt_display_viewport_in), "activate", G_CALLBACK(display_viewport_in_activate), (gpointer) ctk_object); g_signal_connect(G_OBJECT(ctk_object->txt_display_viewport_in), "focus-out-event", G_CALLBACK(txt_focus_out), (gpointer) ctk_object); /* Display ViewPortOut */ ctk_object->txt_display_viewport_out = gtk_entry_new(); ctk_config_set_tooltip(ctk_config, ctk_object->txt_display_viewport_out, __dpy_viewport_out_help); g_signal_connect(G_OBJECT(ctk_object->txt_display_viewport_out), "activate", G_CALLBACK(display_viewport_out_activate), (gpointer) ctk_object); g_signal_connect(G_OBJECT(ctk_object->txt_display_viewport_out), "focus-out-event", G_CALLBACK(txt_focus_out), (gpointer) ctk_object); /* Display Panning */ ctk_object->txt_display_panning = gtk_entry_new(); ctk_config_set_tooltip(ctk_config, ctk_object->txt_display_panning, __dpy_panning_help); g_signal_connect(G_OBJECT(ctk_object->txt_display_panning), "activate", G_CALLBACK(display_panning_activate), (gpointer) ctk_object); g_signal_connect(G_OBJECT(ctk_object->txt_display_panning), "focus-out-event", G_CALLBACK(txt_focus_out), (gpointer) ctk_object); /* X screen virtual size */ ctk_object->txt_screen_virtual_size = gtk_entry_new(); ctk_config_set_tooltip(ctk_config, ctk_object->txt_screen_virtual_size, __screen_virtual_size_help); g_signal_connect(G_OBJECT(ctk_object->txt_screen_virtual_size), "activate", G_CALLBACK(screen_virtual_size_activate), (gpointer) ctk_object); g_signal_connect(G_OBJECT(ctk_object->txt_screen_virtual_size), "focus-out-event", G_CALLBACK(txt_focus_out), (gpointer) ctk_object); /* X screen depth */ ctk_object->mnu_screen_depth = gtk_option_menu_new(); ctk_config_set_tooltip(ctk_config, ctk_object->mnu_screen_depth, __screen_depth_help); g_signal_connect(G_OBJECT(ctk_object->mnu_screen_depth), "changed", G_CALLBACK(screen_depth_changed), (gpointer) ctk_object); /* Screen Stereo Mode */ ctk_object->mnu_screen_stereo = gtk_option_menu_new(); menu = gtk_menu_new(); menu_item = gtk_menu_item_new_with_label("Disabled"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("DCC Glasses"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("BlueLine Glasses"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Onboard (DIN)"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Passive Eye Per Display"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Vertical Interlaced"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Color Interleaved"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Horizontal Interlaced"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Checkerboard 3D DLP"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Inverse Checkerboard 3D DLP"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("NVIDIA 3D Vision"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("NVIDIA 3D Vision Pro"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("HDMI 3D"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_option_menu_set_menu (GTK_OPTION_MENU(ctk_object->mnu_screen_stereo), menu); ctk_config_set_tooltip(ctk_config, ctk_object->mnu_screen_stereo, __screen_stereo_help); g_signal_connect(G_OBJECT(ctk_object->mnu_screen_stereo), "changed", G_CALLBACK(screen_stereo_changed), (gpointer) ctk_object); /* Screen Position Type (Absolute/Relative Menu) */ ctk_object->mnu_screen_position_type = gtk_option_menu_new(); menu = gtk_menu_new(); menu_item = gtk_menu_item_new_with_label("Absolute"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Right of"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Left of"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Above"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label("Below"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); // XXX Add better support for this later. //menu_item = gtk_menu_item_new_with_label("Relative to"); //gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_option_menu_set_menu (GTK_OPTION_MENU(ctk_object->mnu_screen_position_type), menu); ctk_config_set_tooltip(ctk_config, ctk_object->mnu_screen_position_type, __screen_position_type_help); g_signal_connect(G_OBJECT(ctk_object->mnu_screen_position_type), "changed", G_CALLBACK(screen_position_type_changed), (gpointer) ctk_object); /* Screen Position Relative (Screen to be relative to) */ ctk_object->mnu_screen_position_relative = gtk_option_menu_new(); ctk_config_set_tooltip(ctk_config, ctk_object->mnu_screen_position_relative, __screen_position_relative_help); g_signal_connect(G_OBJECT(ctk_object->mnu_screen_position_relative), "changed", G_CALLBACK(screen_position_relative_changed), (gpointer) ctk_object); /* Screen Position Offset (Absolute position) */ ctk_object->txt_screen_position_offset = gtk_entry_new(); ctk_config_set_tooltip(ctk_config, ctk_object->txt_screen_position_offset, __screen_position_offset_help); g_signal_connect(G_OBJECT(ctk_object->txt_screen_position_offset), "activate", G_CALLBACK(screen_position_offset_activate), (gpointer) ctk_object); /* X screen metamode */ ctk_object->btn_screen_metamode = gtk_button_new(); ctk_config_set_tooltip(ctk_config, ctk_object->btn_screen_metamode, __screen_metamode_help); g_signal_connect(G_OBJECT(ctk_object->btn_screen_metamode), "clicked", G_CALLBACK(screen_metamode_clicked), (gpointer) ctk_object); ctk_object->btn_screen_metamode_add = gtk_button_new_with_label("Add"); ctk_config_set_tooltip(ctk_config, ctk_object->btn_screen_metamode_add, __screen_metamode_add_button_help); g_signal_connect(G_OBJECT(ctk_object->btn_screen_metamode_add), "clicked", G_CALLBACK(screen_metamode_add_clicked), (gpointer) ctk_object); ctk_object->btn_screen_metamode_delete = gtk_button_new_with_label("Delete"); ctk_config_set_tooltip(ctk_config, ctk_object->btn_screen_metamode_delete, __screen_metamode_delete_button_help); g_signal_connect(G_OBJECT(ctk_object->btn_screen_metamode_delete), "clicked", G_CALLBACK(screen_metamode_delete_clicked), (gpointer) ctk_object); /* Create the Validation dialog */ ctk_object->dlg_validation_override = create_validation_dialog(ctk_object); /* Create the Apply Validation dialog */ ctk_object->dlg_validation_apply = create_validation_apply_dialog(ctk_object); gtk_window_set_resizable(GTK_WINDOW(ctk_object->dlg_validation_apply), FALSE); /* Reset confirmation dialog */ ctk_object->dlg_reset_confirm = gtk_dialog_new_with_buttons ("Confirm Reset", GTK_WINDOW(gtk_widget_get_parent(GTK_WIDGET(ctk_object))), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); ctk_object->btn_reset_cancel = gtk_dialog_add_button(GTK_DIALOG(ctk_object->dlg_reset_confirm), GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT); gtk_window_set_resizable(GTK_WINDOW(ctk_object->dlg_reset_confirm), FALSE); /* Display ModeSwitch confirmation dialog */ ctk_object->dlg_display_confirm = gtk_dialog_new_with_buttons ("Confirm ModeSwitch", GTK_WINDOW(gtk_widget_get_parent(GTK_WIDGET(ctk_object))), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); ctk_object->btn_display_apply_cancel = gtk_dialog_add_button(GTK_DIALOG(ctk_object->dlg_display_confirm), GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT); gtk_window_set_resizable(GTK_WINDOW(ctk_object->dlg_display_confirm), FALSE); /* Display confirm dialog text (Dynamically generated) */ ctk_object->txt_display_confirm = gtk_label_new(""); /* X config save dialog */ ctk_object->save_xconfig_dlg = create_save_xconfig_dialog(GTK_WIDGET(ctk_object), TRUE, // Merge toggleable xconfig_generate, (void *)ctk_object); /* Apply button */ ctk_object->btn_apply = gtk_button_new_with_label("Apply"); update_btn_apply(ctk_object, FALSE); ctk_config_set_tooltip(ctk_config, ctk_object->btn_apply, __apply_button_help); g_signal_connect(G_OBJECT(ctk_object->btn_apply), "clicked", G_CALLBACK(apply_clicked), (gpointer) ctk_object); /* Probe button */ ctk_object->btn_probe = gtk_button_new_with_label("Detect Displays"); ctk_config_set_tooltip(ctk_config, ctk_object->btn_probe, __detect_displays_button_help); g_signal_connect(G_OBJECT(ctk_object->btn_probe), "clicked", G_CALLBACK(probe_clicked), (gpointer) ctk_object); /* Advanced button */ ctk_object->btn_advanced = gtk_button_new_with_label("Advanced..."); ctk_config_set_tooltip(ctk_config, ctk_object->btn_advanced, __advanced_button_help); g_signal_connect(G_OBJECT(ctk_object->btn_advanced), "clicked", G_CALLBACK(advanced_clicked), (gpointer) ctk_object); /* Reset button */ ctk_object->btn_reset = gtk_button_new_with_label("Reset"); ctk_config_set_tooltip(ctk_config, ctk_object->btn_reset, __reset_button_help); g_signal_connect(G_OBJECT(ctk_object->btn_reset), "clicked", G_CALLBACK(reset_clicked), (gpointer) ctk_object); /* Save button */ ctk_object->btn_save = gtk_button_new_with_label ("Save to X Configuration File"); ctk_config_set_tooltip(ctk_config, ctk_object->btn_save, __save_button_help); g_signal_connect(G_OBJECT(ctk_object->btn_save), "clicked", G_CALLBACK(save_clicked), (gpointer) ctk_object); { /* Layout section */ frame = gtk_frame_new("Layout"); /* main panel */ gtk_box_pack_start(GTK_BOX(ctk_object), frame, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), 5); gtk_container_add(GTK_CONTAINER(frame), vbox); /* Pack the layout widget */ gtk_box_pack_start(GTK_BOX(vbox), ctk_object->obj_layout, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), eventbox, TRUE, TRUE, 0); /* Mosaic checkbox */ gtk_box_pack_start(GTK_BOX(vbox), ctk_object->chk_mosaic_enabled, FALSE, FALSE, 0); /* Xinerama checkbox */ gtk_box_pack_start(GTK_BOX(vbox), ctk_object->chk_xinerama_enabled, FALSE, FALSE, 0); } /* Selection */ label = gtk_label_new("Selection:"); labels = g_slist_append(labels, label); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(ctk_object), hbox, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->mnu_selected_item, TRUE, TRUE, 0); { /* Display page */ vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(ctk_object), vbox, FALSE, FALSE, 0); ctk_object->display_page = vbox; /* Info on how to drag X screens around */ hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); label = gtk_label_new(""); labels = g_slist_append(labels, label); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); label = gtk_label_new("(CTRL-Click + Drag to move X screens)"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); ctk_object->box_screen_drag_info_display = hbox; /* Display Configuration */ label = gtk_label_new("Configuration:"); labels = g_slist_append(labels, label); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->mnu_display_config, TRUE, TRUE, 0); ctk_object->box_display_config = hbox; /* Display resolution and refresh dropdowns */ label = gtk_label_new("Resolution:"); labels = g_slist_append(labels, label); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->mnu_display_resolution, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->mnu_display_refresh, TRUE, TRUE, 0); ctk_object->box_display_resolution = hbox; /* Modeline modename info */ label = gtk_label_new("Mode Name:"); labels = g_slist_append(labels, label); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->txt_display_modename, FALSE, FALSE, 0); ctk_object->box_display_modename = hbox; /* Display passive stereo eye dropdown */ label = gtk_label_new("Stereo Eye:"); labels = g_slist_append(labels, label); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->mnu_display_stereo, TRUE, TRUE, 0); ctk_object->box_display_stereo = hbox; /* Display rotation & reflection dropdowns */ { GtkWidget *hbox2 = gtk_hbox_new(TRUE, 5); label = gtk_label_new("Orientation:"); labels = g_slist_append(labels, label); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox2), hbox, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->mnu_display_rotation, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_end(GTK_BOX(hbox2), hbox, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->mnu_display_reflection, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, TRUE, 0); ctk_object->box_display_orientation = hbox2; } /* Display underscan */ { GtkWidget *hbox2 = gtk_hbox_new(TRUE, 0); label = gtk_label_new("Underscan:"); labels = g_slist_append(labels, label); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox2), hbox, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->txt_display_underscan, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->sld_display_underscan, TRUE, TRUE, 3); gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, TRUE, 0); ctk_object->box_display_underscan = hbox2; } /* Display positioning */ label = gtk_label_new("Position:"); labels = g_slist_append(labels, label); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->mnu_display_position_type, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->mnu_display_position_relative, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->txt_display_position_offset, TRUE, TRUE, 0); ctk_object->box_display_position = hbox; /* Display ViewPortIn */ label = gtk_label_new("ViewPortIn:"); labels = g_slist_append(labels, label); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->txt_display_viewport_in, TRUE, TRUE, 0); ctk_object->box_display_viewport_in = hbox; /* Display ViewPortOut */ label = gtk_label_new("ViewPortOut:"); labels = g_slist_append(labels, label); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->txt_display_viewport_out, TRUE, TRUE, 0); ctk_object->box_display_viewport_out = hbox; /* Display panning text entry */ label = gtk_label_new("Panning:"); labels = g_slist_append(labels, label); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->txt_display_panning, TRUE, TRUE, 0); ctk_object->box_display_panning = hbox; /* checkbox for primary display of X screen */ hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); ctk_object->chk_primary_display = gtk_check_button_new_with_label("Make this the primary display " "for the X screen"); ctk_config_set_tooltip(ctk_config, ctk_object->chk_primary_display, __dpy_primary_help); g_signal_connect(G_OBJECT(ctk_object->chk_primary_display), "toggled", G_CALLBACK(screen_primary_display_toggled), (gpointer) ctk_object); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->chk_primary_display, TRUE, TRUE, 0); /* Up the object ref count to make sure that the page and its widgets * do not get freed if/when the page is removed from the notebook. */ g_object_ref(ctk_object->display_page); gtk_widget_show_all(ctk_object->display_page); } /* Display sub-section */ { /* X screen page */ vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(ctk_object), vbox, FALSE, FALSE, 0); ctk_object->screen_page = vbox; /* Info on how to drag X screens around */ hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); label = gtk_label_new(""); labels = g_slist_append(labels, label); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); label = gtk_label_new("(CTRL-Click + Drag to move X screens)"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); ctk_object->box_screen_drag_info_screen = hbox; /* X screen virtual size */ label = gtk_label_new("Virtual Size:"); labels = g_slist_append(labels, label); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->txt_screen_virtual_size, TRUE, TRUE, 0); ctk_object->box_screen_virtual_size = hbox; /* X screen depth dropdown */ label = gtk_label_new("Color Depth:"); labels = g_slist_append(labels, label); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->mnu_screen_depth, TRUE, TRUE, 0); ctk_object->box_screen_depth = hbox; /* X screen stereo dropdown */ label = gtk_label_new("Stereo Mode:"); labels = g_slist_append(labels, label); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->mnu_screen_stereo, TRUE, TRUE, 0); ctk_object->box_screen_stereo = hbox; /* X screen positioning */ label = gtk_label_new("Position:"); labels = g_slist_append(labels, label); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->mnu_screen_position_type, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->mnu_screen_position_relative, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->txt_screen_position_offset, TRUE, TRUE, 0); ctk_object->box_screen_position = hbox; /* X screen metamode drop down & buttons */ label = gtk_label_new("MetaMode:"); labels = g_slist_append(labels, label); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->btn_screen_metamode, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->btn_screen_metamode_add, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->btn_screen_metamode_delete, TRUE, TRUE, 0); ctk_object->box_screen_metamode = hbox; /* Up the object ref count to make sure that the page and its widgets * do not get freed if/when the page is removed from the notebook. */ g_object_ref(ctk_object->screen_page); gtk_widget_show_all(ctk_object->screen_page); } /* X screen sub-section */ /* Align all the configuration labels */ max_width = 0; for (slitem = labels; slitem; slitem = slitem->next) { label = slitem->data; gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_widget_size_request(label, &req); if (req.width > max_width) { max_width = req.width; } } for (slitem = labels; slitem; slitem = slitem->next) { label = slitem->data; gtk_widget_set_size_request(label, max_width, -1); } g_slist_free(labels); { /* Buttons */ hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_end(GTK_BOX(ctk_object), hbox, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), ctk_object->btn_save, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_end(GTK_BOX(ctk_object), hbox, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), ctk_object->btn_reset, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), ctk_object->btn_advanced, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), ctk_object->btn_probe, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), ctk_object->btn_apply, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_end(GTK_BOX(ctk_object), hseparator, FALSE, TRUE, 5); } { /* Dialogs */ /* Display Disable Dialog */ hbox = gtk_hbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->txt_display_disable, FALSE, FALSE, 20); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(ctk_object->dlg_display_disable)->vbox), hbox, TRUE, TRUE, 20); gtk_widget_show_all(GTK_DIALOG(ctk_object->dlg_display_disable)->vbox); /* Reset Confirm Dialog */ label = gtk_label_new("Do you really want to reset the " "configuration?"); hbox = gtk_hbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 20); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(ctk_object->dlg_reset_confirm)->vbox), hbox, TRUE, TRUE, 20); gtk_widget_show_all(GTK_DIALOG(ctk_object->dlg_reset_confirm)->vbox); /* Apply Confirm Dialog */ hbox = gtk_hbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->txt_display_confirm, TRUE, TRUE, 20); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(ctk_object->dlg_display_confirm)->vbox), hbox, TRUE, TRUE, 20); gtk_widget_show_all(GTK_DIALOG(ctk_object->dlg_display_confirm)->vbox); } /* If mosaic mode is enabled, start in advanced mode */ if (ctk_object->layout && ctk_object->layout->gpus && ctk_object->layout->gpus->mosaic_enabled) { advanced_clicked(ctk_object->btn_advanced, ctk_object); } /* Show the GUI */ gtk_widget_show_all(GTK_WIDGET(ctk_object)); update_gui(ctk_object); /* Register to receive updates when layout changed */ ctk_display_layout_register_callbacks(CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), layout_selected_callback, (void *)ctk_object, layout_modified_callback, (void *)ctk_object); return GTK_WIDGET(ctk_object); } /* ctk_display_config_new() */ /** ctk_display_config_create_help() ********************************* * * Creates the Display Configuration help page. * **/ GtkTextBuffer *ctk_display_config_create_help(GtkTextTagTable *table, CtkDisplayConfig *ctk_object) { GtkTextIter i; GtkTextBuffer *b; nvGpuPtr gpu = NULL; if (ctk_object->layout) { gpu = ctk_object->layout->gpus; } b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "Display Configuration Help"); ctk_help_para(b, &i, "This page gives access to configuration of " "the X server's display devices."); ctk_help_para(b, &i, ""); ctk_help_heading(b, &i, "Layout Section"); ctk_help_para(b, &i, "This section shows information and configuration " "settings for the X server layout."); ctk_help_heading(b, &i, "Layout Image"); ctk_help_para(b, &i, "The layout image shows the geometric relationship " "that display devices and X screens have to each other. " "You may drag display devices around to reposition them. " "When in advanced view, the display's panning domain may " "be resized by holding SHIFT while dragging. Also, The " "X screen a display belongs to may be selected by holding " "down the CONTROL key while clicking on the display, and can " "be moved by holding CONTROL-Click and dragging."); ctk_help_heading(b, &i, "Layout Hidden Label"); ctk_help_para(b, &i, "%s", __layout_hidden_label_help); if (gpu) { switch (gpu->mosaic_type) { case MOSAIC_TYPE_SLI_MOSAIC: ctk_help_heading(b, &i, "Enable SLI Mosaic"); ctk_help_para(b, &i, "%s", __layout_sli_mosaic_button_help); break; case MOSAIC_TYPE_BASE_MOSAIC: ctk_help_heading(b, &i, "Enable Base Mosaic"); ctk_help_para(b, &i, "%s", __layout_base_mosaic_full_button_help); break; case MOSAIC_TYPE_BASE_MOSAIC_LIMITED: ctk_help_heading(b, &i, "Enable Base Mosaic (Surround)"); ctk_help_para(b, &i, "%s", __layout_base_mosaic_surround_button_help); break; default: break; } } ctk_help_heading(b, &i, "Enable Xinerama"); ctk_help_para(b, &i, "%s This setting is only available when multiple " "X screens are present.", __layout_xinerama_button_help); ctk_help_heading(b, &i, "Selection"); ctk_help_para(b, &i, "%s", __selected_item_help); ctk_help_para(b, &i, ""); ctk_help_heading(b, &i, "Display Options"); ctk_help_para(b, &i, "The following options are available when a display " "device is selected in the Selection drop-down to configure " "the settings for that display device."); ctk_help_heading(b, &i, "Configuration"); ctk_help_para(b, &i, "%s \"Disabled\" disables the selected display " "device. \"X screen \" associates the selected " "display device with the specified X Screen. \"New X screen " "(requires X restart)\" creates a new X Screen and " "associates the selected display device with it.", __dpy_configuration_mnu_help); ctk_help_heading(b, &i, "Resolution"); ctk_help_para(b, &i, "%s", __dpy_resolution_mnu_help); ctk_help_heading(b, &i, "Refresh"); ctk_help_para(b, &i, "The Refresh drop-down is to the right of the " "Resolution drop-down. %s", __dpy_refresh_mnu_help); ctk_help_heading(b, &i, "Mode Name"); ctk_help_para(b, &i, "The Mode name is the name of the modeline that is " "currently chosen for the selected display device. " "This is only available when advanced view is enabled."); ctk_help_heading(b, &i, "Stereo Eye"); ctk_help_para(b, &i, "%s", __dpy_stereo_help); ctk_help_heading(b, &i, "Orientation"); ctk_help_para(b, &i, "The Orientation drop-downs control how the desktop " "image is rotated and/or reflected. %s %s Note that " "reflection is applied before rotation.", __dpy_rotation_help, __dpy_reflection_help); ctk_help_heading(b, &i, "Underscan"); ctk_help_para(b, &i, "%s The aspect ratio of the ViewPortOut is preserved " " and the ViewPortIn is updated to exactly match this new " "size. This feature is formerly known as Overscan " "Compensation.", __dpy_underscan_text_help); ctk_help_heading(b, &i, "Position Type"); ctk_help_para(b, &i, "%s", __dpy_position_type_help); ctk_help_heading(b, &i, "Position Relative"); ctk_help_para(b, &i, "%s", __dpy_position_relative_help); ctk_help_heading(b, &i, "Position Offset"); ctk_help_para(b, &i, "%s", __dpy_position_offset_help); ctk_help_heading(b, &i, "ViewPortIn"); ctk_help_para(b, &i, "%s", __dpy_viewport_in_help); ctk_help_heading(b, &i, "ViewPortOut"); ctk_help_para(b, &i, "%s", __dpy_viewport_out_help); ctk_help_heading(b, &i, "Panning"); ctk_help_para(b, &i, "%s This is only available when advanced " "view is enabled.", __dpy_panning_help); ctk_help_heading(b, &i, "Primary Display"); ctk_help_para(b, &i, "%s", __dpy_primary_help); ctk_help_para(b, &i, ""); ctk_help_heading(b, &i, "X Screen Options"); ctk_help_para(b, &i, "The following options are available when an X " "screen is selected in the Selection drop-down to configure " "the settings for that X screen."); ctk_help_heading(b, &i, "Virtual Size"); ctk_help_para(b, &i, "%s The Virtual screen size must be at least " "304x200, and the width must be a multiple of 8.", __screen_virtual_size_help); ctk_help_heading(b, &i, "Color Depth"); ctk_help_para(b, &i, "%s", __screen_depth_help); ctk_help_heading(b, &i, "Stereo Mode"); ctk_help_para(b, &i, "%s", __screen_stereo_help); ctk_help_heading(b, &i, "Position Type"); ctk_help_para(b, &i, "%s", __screen_position_type_help); ctk_help_heading(b, &i, "Position Relative"); ctk_help_para(b, &i, "%s", __screen_position_relative_help); ctk_help_heading(b, &i, "Position Offset"); ctk_help_para(b, &i, "%s", __screen_position_offset_help); ctk_help_heading(b, &i, "MetaMode Selection"); ctk_help_para(b, &i, "%s This is only available when advanced view " "is enabled.", __screen_metamode_help); ctk_help_heading(b, &i, "Add Metamode"); ctk_help_para(b, &i, "%s This is only available when advanced view " "is enabled.", __screen_metamode_add_button_help); ctk_help_heading(b, &i, "Delete Metamode"); ctk_help_para(b, &i, "%s This is only available when advanced view " "is enabled.", __screen_metamode_delete_button_help); ctk_help_para(b, &i, ""); ctk_help_heading(b, &i, "Buttons"); ctk_help_heading(b, &i, "Apply"); ctk_help_para(b, &i, "%s Note that not all settings can be applied to an " "active X server; " "these require restarting the X server after saving the " "desired settings to the X configuration file. Examples " "of such settings include changing the position of any X " "screen, adding/removing an X screen, and changing the X " "screen color depth.", __apply_button_help); ctk_help_heading(b, &i, "Detect Displays"); ctk_help_para(b, &i, "%s", __detect_displays_button_help); ctk_help_heading(b, &i, "Advanced/Basic..."); ctk_help_para(b, &i, "%s The Basic view modifies the currently active " "MetaMode for an X screen, while the advanced view exposes " "all the MetaModes available on an X screen, and lets you " "modify each of them.", __advanced_button_help); ctk_help_heading(b, &i, "Reset"); ctk_help_para(b, &i, "%s", __reset_button_help); ctk_help_heading(b, &i, "Save to X Configuration File"); ctk_help_para(b, &i, "%s", __save_button_help); ctk_help_finish(b); return b; } /* ctk_display_config_create_help() */ /* Widget setup & helper functions ***********************************/ static void setup_mosaic_config(CtkDisplayConfig *ctk_object) { nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); nvGpuPtr gpu; const char *tooltip; const gchar *label; if (!display || !display->gpu || !ctk_object->advanced_mode || display->gpu->mosaic_type == MOSAIC_TYPE_UNSUPPORTED) { gtk_widget_hide(ctk_object->chk_mosaic_enabled); return; } gtk_widget_show(ctk_object->chk_mosaic_enabled); gpu = display->gpu; switch (gpu->mosaic_type) { case MOSAIC_TYPE_SLI_MOSAIC: tooltip = __layout_sli_mosaic_button_help; label = "Enable SLI Mosaic"; break; case MOSAIC_TYPE_BASE_MOSAIC: tooltip = __layout_base_mosaic_full_button_help; label = "Enable Base Mosaic"; break; case MOSAIC_TYPE_BASE_MOSAIC_LIMITED: tooltip = __layout_base_mosaic_surround_button_help; label = "Enable Base Mosaic (Surround)"; break; default: gtk_widget_hide(ctk_object->chk_mosaic_enabled); return; } g_signal_handlers_block_by_func (G_OBJECT(ctk_object->chk_mosaic_enabled), G_CALLBACK(mosaic_state_toggled), (gpointer) ctk_object); gtk_button_set_label(GTK_BUTTON(ctk_object->chk_mosaic_enabled), label); ctk_config_set_tooltip(ctk_object->ctk_config, ctk_object->chk_mosaic_enabled, tooltip); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_object->chk_mosaic_enabled), gpu->mosaic_enabled); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object->chk_mosaic_enabled), G_CALLBACK(mosaic_state_toggled), (gpointer) ctk_object); } /** setup_layout_frame() ********************************************* * * Sets up the layout frame to reflect the currently selected layout. * **/ static void setup_layout_frame(CtkDisplayConfig *ctk_object) { nvLayoutPtr layout = ctk_object->layout; GdkScreen *s; /* * Hide/Shows the layout widget based on the current screen size. * If the screen is too small, the layout widget is hidden and a * message is shown instead. */ s = gtk_widget_get_screen(GTK_WIDGET(ctk_object)); screen_size_changed(s, ctk_object); setup_mosaic_config(ctk_object); /* Xinerama requires 2 or more X screens */ if (layout->num_screens < 2) { layout->xinerama_enabled = 0; gtk_widget_hide(ctk_object->chk_xinerama_enabled); return; } gtk_widget_show(ctk_object->chk_xinerama_enabled); g_signal_handlers_block_by_func (G_OBJECT(ctk_object->chk_xinerama_enabled), G_CALLBACK(xinerama_state_toggled), (gpointer) ctk_object); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_object->chk_xinerama_enabled), layout->xinerama_enabled); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object->chk_xinerama_enabled), G_CALLBACK(xinerama_state_toggled), (gpointer) ctk_object); } /* setup_layout_frame() */ /** update_selected_page() *********************************************** * * Makes sure the correct page (Display or X Screen) is selected based on * the currently selected items. * **/ static void update_selected_page(CtkDisplayConfig *ctk_object) { nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); gtk_widget_hide(ctk_object->display_page); gtk_widget_hide(ctk_object->screen_page); if (display) { gtk_widget_show(ctk_object->display_page); } else if (screen) { gtk_widget_show(ctk_object->screen_page); } } /* update_selected_page() */ /** generate_selected_item_dropdown() ************************************ * * Drop down menu for selecting current display/X screen. * **/ static GtkWidget* generate_selected_item_dropdown(CtkDisplayConfig *ctk_object, nvDisplayPtr cur_display, nvScreenPtr cur_screen, int *cur_idx) { GtkWidget *menu; GtkWidget *menu_item; nvLayoutPtr layout = ctk_object->layout; nvGpuPtr gpu; nvDisplayPtr display; nvScreenPtr screen; int idx; char *str; char *tmp; gboolean show_gpu_info; /* (Re)allocate the lookup table */ if (ctk_object->selected_item_table) { free(ctk_object->selected_item_table); } ctk_object->selected_item_table_len = layout->num_screens; for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { ctk_object->selected_item_table_len += gpu->num_displays; } ctk_object->selected_item_table = calloc(ctk_object->selected_item_table_len, sizeof(SelectableItem)); if (!ctk_object->selected_item_table) { ctk_object->selected_item_table_len = 0; gtk_option_menu_remove_menu (GTK_OPTION_MENU(ctk_object->mnu_selected_item)); gtk_widget_set_sensitive(ctk_object->mnu_selected_item, False); return NULL; } /* Create the dropdown menu and fill the lookup table */ menu = gtk_menu_new(); idx = 0; show_gpu_info = ((layout->num_gpus > 1) || ctk_object->advanced_mode) ? True : False; /* Add X screens */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { if (!cur_display && (cur_screen == screen)) { *cur_idx = idx; } str = g_strdup_printf("X screen %d", screen->scrnum); menu_item = gtk_menu_item_new_with_label(str); g_free(str); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); ctk_object->selected_item_table[idx].type = SELECTABLE_ITEM_SCREEN; ctk_object->selected_item_table[idx].u.screen = screen; idx++; } /* Add displays */ for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { for (display = gpu->displays; display; display = display->next_on_gpu) { if (cur_display == display) { *cur_idx = idx; } str = g_strdup_printf("%s (%s", display->logName, display->typeIdName); if (show_gpu_info) { tmp = str; str = g_strdup_printf("%s on GPU-%d", tmp, NvCtrlGetTargetId(gpu->handle)); g_free(tmp); } tmp = str; str = g_strdup_printf("%s)", tmp); g_free(tmp); menu_item = gtk_menu_item_new_with_label(str); g_free(str); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); ctk_object->selected_item_table[idx].type = SELECTABLE_ITEM_DISPLAY; ctk_object->selected_item_table[idx].u.display = display; idx++; } } return menu; } /* generate_selected_item_dropdown() */ /** setup_selected_item_dropdown() ****************************** * * Setup display modelname dropdown menu. * **/ static void setup_selected_item_dropdown(CtkDisplayConfig *ctk_object) { GtkWidget *menu; nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); int cur_idx = 0; if (!display && !screen) { gtk_widget_set_sensitive(ctk_object->mnu_selected_item, False); gtk_widget_hide(ctk_object->mnu_selected_item); return; } gtk_widget_set_sensitive(ctk_object->mnu_selected_item, True); gtk_widget_show(ctk_object->mnu_selected_item); menu = generate_selected_item_dropdown(ctk_object, display, screen, &cur_idx); if (!menu) { gtk_widget_set_sensitive(ctk_object->mnu_selected_item, False); return; } /* Setup the menu and select the current model */ g_signal_handlers_block_by_func (G_OBJECT(ctk_object->mnu_selected_item), G_CALLBACK(selected_item_changed), (gpointer) ctk_object); gtk_option_menu_set_menu (GTK_OPTION_MENU(ctk_object->mnu_selected_item), menu); gtk_option_menu_set_history (GTK_OPTION_MENU(ctk_object->mnu_selected_item), cur_idx); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object->mnu_selected_item), G_CALLBACK(selected_item_changed), (gpointer) ctk_object); } /* setup_selected_item_dropdown() */ /** setup_display_modename() ***************************************** * * Updates the modeline modename of the selected display * **/ static void setup_display_modename(CtkDisplayConfig *ctk_object) { nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!display || !display->screen || !ctk_object->advanced_mode) { gtk_widget_hide(ctk_object->box_display_modename); return; } gtk_widget_show(ctk_object->box_display_modename); if (!display->cur_mode || !display->cur_mode->modeline) { gtk_label_set(GTK_LABEL(ctk_object->txt_display_modename), ""); gtk_widget_set_sensitive(ctk_object->box_display_modename, FALSE); return; } gtk_widget_set_sensitive(ctk_object->box_display_modename, TRUE); gtk_label_set(GTK_LABEL(ctk_object->txt_display_modename), display->cur_mode->modeline->data.identifier); } /* setup_display_modename() */ /** setup_display_config() ******************************************* * * Updates the "Configure" dropdown menu to list the currently * available configurations of the selected display. * **/ static void setup_display_config(CtkDisplayConfig *ctk_object) { nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); nvLayoutPtr layout = ctk_object->layout; nvScreenPtr screen = NULL; int num_screens_on_gpu = 0; DisplayConfigOption *options; int max_options; int cur_option = -1; int num_options = 0; /* Allocate the max space we'll need for the lookup table (list all the * X screens + disable + new) */ max_options = layout->num_screens + 2; options = nvalloc(max_options * sizeof(DisplayConfigOption)); /* Don't allow disabling the last display device */ if (layout->num_screens > 1 || !display->screen || display->screen->num_displays >= 1) { if (!display->screen) { cur_option = num_options; } options[num_options].config = DPY_CFG_DISABLED; num_options++; } /* Include the possible X screen(s) that this display can be part of */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { if (screen_has_gpu(screen, display->gpu) || display->gpu->mosaic_enabled) { int max_displays = get_screen_max_displays(screen); num_screens_on_gpu++; if (display->screen == screen) { cur_option = num_options; } else if (max_displays >= 0 && screen->num_displays > max_displays) { /* Skip screens that are full */ continue; } options[num_options].config = DPY_CFG_X_SCREEN; options[num_options].screen = screen; num_options++; } } /* Only allow creation of a new X screen if Mosaic mode is disabled, the GPU * can support another X screen, and the display is not already the only * display in the X screen. */ if (!display->gpu->mosaic_enabled && (num_screens_on_gpu < display->gpu->max_displays) && (!display->screen || (display->screen->num_displays > 1))) { options[num_options].config = DPY_CFG_NEW_X_SCREEN; num_options++; } /* Apply the new options */ nvfree(ctk_object->display_config_table); ctk_object->display_config_table = options; ctk_object->display_config_table_len = num_options; { GtkWidget *menu = gtk_menu_new(); int i; gchar *label; for (i = 0; i < num_options; i++) { GtkWidget *menu_item = NULL; switch (options[i].config) { case DPY_CFG_DISABLED: menu_item = gtk_menu_item_new_with_label("Disabled"); break; case DPY_CFG_NEW_X_SCREEN: menu_item = gtk_menu_item_new_with_label("New X screen (requires X " "restart)"); break; case DPY_CFG_X_SCREEN: label = g_strdup_printf("X screen %d", options[i].screen->scrnum); menu_item = gtk_menu_item_new_with_label(label); g_free(label); break; } if (menu_item) { gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); } } g_signal_handlers_block_by_func(G_OBJECT(ctk_object->mnu_display_config), G_CALLBACK(display_config_changed), (gpointer) ctk_object); gtk_option_menu_set_menu (GTK_OPTION_MENU(ctk_object->mnu_display_config), menu); gtk_option_menu_set_history(GTK_OPTION_MENU(ctk_object->mnu_display_config), cur_option); gtk_widget_set_sensitive(ctk_object->mnu_display_config, TRUE); g_signal_handlers_unblock_by_func(G_OBJECT(ctk_object->mnu_display_config), G_CALLBACK(display_config_changed), (gpointer) ctk_object); } } /* setup_display_config() */ /** setup_display_refresh_dropdown() ********************************* * * Generates the refresh rate dropdown based on the currently selected * display. * **/ static void setup_display_refresh_dropdown(CtkDisplayConfig *ctk_object) { GtkWidget *menu; GtkWidget *menu_item; nvModeLinePtr modeline; nvModeLinePtr auto_modeline; nvModeLinePtr modelines; nvModeLinePtr cur_modeline; float cur_rate; /* Refresh Rate */ int cur_idx = 0; /* Currently selected modeline */ gchar *name; /* Modeline's label for the dropdown menu */ nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* Get selection information */ if (!display || !display->cur_mode || !display->cur_mode->modeline) { goto fail; } modelines = display->modelines; cur_modeline = display->cur_mode->modeline; cur_rate = cur_modeline->refresh_rate; /* Create the menu index -> modeline pointer lookup table */ if (ctk_object->refresh_table) { free(ctk_object->refresh_table); ctk_object->refresh_table_len = 0; } ctk_object->refresh_table = calloc(display->num_modelines, sizeof(nvModeLinePtr)); if (!ctk_object->refresh_table) { goto fail; } /* Generate the refresh dropdown */ menu = gtk_menu_new(); /* Special case the 'nvidia-auto-select' mode. */ if (IS_NVIDIA_DEFAULT_MODE(cur_modeline)) { menu_item = gtk_menu_item_new_with_label("Auto"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); ctk_object->refresh_table[ctk_object->refresh_table_len++] = cur_modeline; modelines = NULL; /* Skip building rest of refresh dropdown */ } /* Generate the refresh rate dropdown from the modelines list */ auto_modeline = NULL; for (modeline = modelines; modeline; modeline = modeline->next) { nvModeLinePtr m; int count_ref; /* # modelines with similar refresh rates */ int num_ref; /* Modeline # in a group of similar refresh rates */ /* Ignore modelines of different resolution */ if (modeline->data.hdisplay != cur_modeline->data.hdisplay || modeline->data.vdisplay != cur_modeline->data.vdisplay) { continue; } /* Ignore special modes */ if (IS_NVIDIA_DEFAULT_MODE(modeline)) { continue; } name = g_strdup_printf("%0.*f Hz", (display->is_sdi ? 3 : 0), modeline->refresh_rate); /* Get a unique number for this modeline */ count_ref = 0; /* # modelines with similar refresh rates */ num_ref = 0; /* Modeline # in a group of similar refresh rates */ for (m = modelines; m; m = m->next) { float m_rate = m->refresh_rate; gchar *tmp = g_strdup_printf("%.0f Hz", m_rate); if (!IS_NVIDIA_DEFAULT_MODE(m) && m->data.hdisplay == modeline->data.hdisplay && m->data.vdisplay == modeline->data.vdisplay && !g_ascii_strcasecmp(tmp, name) && m != auto_modeline) { count_ref++; /* Modelines with similar refresh rates get a * unique # (num_ref) */ if (m == modeline) { num_ref = count_ref; /* This modeline's # */ } } g_free(tmp); } /* Is default refresh rate for resolution */ if (!ctk_object->refresh_table_len && !display->is_sdi) { auto_modeline = modeline; g_free(name); name = g_strdup("Auto"); /* In advanced mode, all modelines are selectable */ } else if (count_ref > 1 && ctk_object->advanced_mode) { gchar *tmp; tmp = g_strdup_printf("%s (%d)", name, num_ref); g_free(name); name = tmp; /* in simple mode only show one refresh rate */ } else if (num_ref > 1 && !ctk_object->advanced_mode) { continue; } /* Add "DoubleScan" and "Interlace" information */ if (g_ascii_strcasecmp(name, "Auto")) { gchar *extra = NULL; gchar *tmp; if (modeline->data.flags & V_DBLSCAN) { extra = g_strdup_printf("DoubleScan"); } if (modeline->data.flags & V_INTERLACE) { if (extra) { tmp = g_strdup_printf("%s, Interlace", extra); g_free(extra); extra = tmp; } else { extra = g_strdup_printf("Interlace"); } } if (extra) { tmp = g_strdup_printf("%s (%s)", name, extra); g_free(extra); g_free(name); name = tmp; } } /* Keep track of the selected modeline */ if (cur_modeline == modeline) { cur_idx = ctk_object->refresh_table_len; /* Find a close match to the selected modeline */ } else if (ctk_object->refresh_table_len && ctk_object->refresh_table[cur_idx] != cur_modeline) { /* Found a better resolution */ if (modeline->data.hdisplay == cur_modeline->data.hdisplay && modeline->data.vdisplay == cur_modeline->data.vdisplay) { float prev_rate = ctk_object->refresh_table[cur_idx]->refresh_rate; float rate = modeline->refresh_rate; if (ctk_object->refresh_table[cur_idx]->data.hdisplay != cur_modeline->data.hdisplay || ctk_object->refresh_table[cur_idx]->data.vdisplay != cur_modeline->data.vdisplay) { cur_idx = ctk_object->refresh_table_len; } /* Found a better refresh rate */ if (rate == cur_rate && prev_rate != cur_rate) { cur_idx = ctk_object->refresh_table_len; } } } /* Add the modeline entry to the dropdown */ menu_item = gtk_menu_item_new_with_label(name); g_free(name); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); ctk_object->refresh_table[ctk_object->refresh_table_len++] = modeline; } /* Setup the menu and select the current modeline */ g_signal_handlers_block_by_func(G_OBJECT(ctk_object->mnu_display_refresh), G_CALLBACK(display_refresh_changed), (gpointer) ctk_object); gtk_option_menu_set_menu (GTK_OPTION_MENU(ctk_object->mnu_display_refresh), menu); gtk_option_menu_set_history(GTK_OPTION_MENU(ctk_object->mnu_display_refresh), cur_idx); gtk_widget_set_sensitive(ctk_object->mnu_display_refresh, True); g_signal_handlers_unblock_by_func(G_OBJECT(ctk_object->mnu_display_refresh), G_CALLBACK(display_refresh_changed), (gpointer) ctk_object); /* If dropdown only has one item, disable it */ if (ctk_object->refresh_table_len > 1) { gtk_widget_set_sensitive(ctk_object->mnu_display_refresh, True); } else { gtk_widget_set_sensitive(ctk_object->mnu_display_refresh, False); } /* Update the modename label */ setup_display_modename(ctk_object); return; /* Handle failures */ fail: gtk_widget_set_sensitive(ctk_object->mnu_display_refresh, False); setup_display_modename(ctk_object); } /* setup_display_refresh_dropdown() */ /** get_default_modeline() ******************************************* * * Finds the default modeline in the list of modelines. * * Returns the default modeline if found, NULL otherwise. * */ static nvModeLinePtr get_default_modeline(const nvDisplayPtr display) { nvModeLinePtr modeline = display->modelines; while (modeline) { if (IS_NVIDIA_DEFAULT_MODE(modeline)) { return modeline; } modeline = modeline->next; } return NULL; } /** allocate_selected_mode() ***************************************** * * Allocates, fills and returns a nvSelectedModePtr. * */ static nvSelectedModePtr allocate_selected_mode(char *name, nvModeLinePtr modeline, Bool isSpecial, NVVRSize *viewPortIn, NVVRBoxRecXYWH *viewPortOut) { nvSelectedModePtr selected_mode; selected_mode = (nvSelectedModePtr)nvalloc(sizeof(nvSelectedMode)); selected_mode->label = gtk_menu_item_new_with_label(name); selected_mode->modeline = modeline; selected_mode->isSpecial = isSpecial; selected_mode->isScaled = (viewPortIn || viewPortOut); if (viewPortIn) { selected_mode->viewPortIn.width = viewPortIn->w; selected_mode->viewPortIn.height = viewPortIn->h; } if (viewPortOut) { selected_mode->viewPortOut.x = viewPortOut->x; selected_mode->viewPortOut.y = viewPortOut->y; selected_mode->viewPortOut.width = viewPortOut->w; selected_mode->viewPortOut.height = viewPortOut->h; } return selected_mode; } /** free_selected_modes() ******************************************** * * Recursively frees each item of a list of selected modes. * */ static void free_selected_modes(nvSelectedModePtr selected_mode) { if (selected_mode) { free_selected_modes(selected_mode->next); free(selected_mode); } } /** append_unique_selected_mode() ************************************ * * Appends a selected mode to the given list only if it doesn't already exist. * Special modes ("Auto", "Off") are not checked. Two selected modes are unique * if their [hv]display differ in the case of regular modes, or if the * ViewPortIn of the given mode doesn't match any existing [hv]display. * Returns TRUE if the selected mode has been added, FALSE otherwise. * */ static Bool append_unique_selected_mode(nvSelectedModePtr head, const nvSelectedModePtr mode) { int targetWidth, targetHeight; nvSelectedModePtr iter, prev = NULL; if (mode->isScaled) { targetWidth = mode->viewPortIn.width; targetHeight = mode->viewPortIn.height; } else { targetWidth = mode->modeline->data.hdisplay; targetHeight = mode->modeline->data.vdisplay; } /* Keep the list sorted by targeted resolution */ iter = head; while (iter) { int currentWidth, currentHeight; nvModeLinePtr ml = iter->modeline; if (!ml || iter->isSpecial) { goto next; } if (iter->isScaled) { currentWidth = iter->viewPortIn.width; currentHeight = iter->viewPortIn.height; } else { currentWidth = ml->data.hdisplay; currentHeight = ml->data.vdisplay; } /* If we are past the sort order, stop looping */ if ((targetWidth > currentWidth) || ((targetWidth == currentWidth) && (targetHeight > currentHeight))) { break; } if (ml && !mode->isSpecial && (targetWidth == currentWidth) && (targetHeight == currentHeight)) { return FALSE; } next: prev = iter; iter = iter->next; } if (prev == NULL) { return FALSE; } /* Insert the selected mode */ mode->next = prev->next; prev->next = mode; return TRUE; } /** matches_current_selected_mode() ********************************** * * Checks whether the provided selected mode matches the current mode. * * We need to distinguish between custom modes and scaled modes. * * Custom modes are modes with custom ViewPort settings, such as an * Underscan configuration. These modes don't have an entry in the * resolution dropdown menu. Instead, the corresponding modeline must be * selected. * * Scaled modes are generated by the CPL, have a fixed ViewPort{In,Out} * configuration and are displayed in the dropdown menu in basic mode. * * Therefore, we compare the raster size and the ViewPorts first, then only * the raster size. This works because the list of selected_modes is * generated before the scaled ones. The latter can then overwrite the * cur_selected_mode if we find a better match. * * Returns TRUE if the provided selected mode matches the current mode, FALSE * otherwise. * */ static Bool matches_current_selected_mode(const nvDisplayPtr display, const nvSelectedModePtr selected_mode, const Bool compare_viewports) { nvModeLinePtr ml1, ml2; nvModePtr cur_mode; Bool mode_match; if (!display || !display->cur_mode || !selected_mode) { return FALSE; } cur_mode = display->cur_mode; ml1 = cur_mode->modeline; ml2 = selected_mode->modeline; if (!ml1 || !ml2) { return FALSE; } mode_match = ((ml1->data.hdisplay == ml2->data.hdisplay) && (ml1->data.vdisplay == ml2->data.vdisplay)); if (compare_viewports) { nvSize rotatedViewPortIn; memcpy(&rotatedViewPortIn, &selected_mode->viewPortIn, sizeof(nvSize)); if (cur_mode->rotation == ROTATION_90 || cur_mode->rotation == ROTATION_270) { int temp = rotatedViewPortIn.width; rotatedViewPortIn.width = rotatedViewPortIn.height; rotatedViewPortIn.height = temp; } return (mode_match && viewports_in_match(cur_mode->viewPortIn, rotatedViewPortIn) && viewports_out_match(cur_mode->viewPortOut, selected_mode->viewPortOut)); } else { return (!IS_NVIDIA_DEFAULT_MODE(ml1) && mode_match); } } /** generate_selected_modes() **************************************** * * Generates a list of selected modes. The list is generated by parsing * modelines. This function makes sure that each item of the list is unique * and sorted. * */ static void generate_selected_modes(const nvDisplayPtr display) { nvSelectedModePtr selected_mode = NULL; nvModeLinePtr modeline; /* Add the off item */ selected_mode = allocate_selected_mode("Off", NULL /* modeline */, TRUE /* isSpecial */, NULL /* viewPortIn */, NULL /* viewPortOut */); display->num_selected_modes = 1; display->selected_modes = selected_mode; modeline = display->modelines; while (modeline) { gchar *name; Bool isSpecial; if (IS_NVIDIA_DEFAULT_MODE(modeline)) { name = g_strdup_printf("Auto"); isSpecial = TRUE; } else { name = g_strdup_printf("%dx%d", modeline->data.hdisplay, modeline->data.vdisplay); isSpecial = FALSE; } selected_mode = allocate_selected_mode(name, modeline, isSpecial, NULL /* viewPortIn */, NULL /* viewPortOut */); g_free(name); if (append_unique_selected_mode(display->selected_modes, selected_mode)) { display->num_selected_modes++; if (matches_current_selected_mode(display, selected_mode, FALSE /* compare_viewports */)) { display->cur_selected_mode = selected_mode; } } else { free(selected_mode); } modeline = modeline->next; } } /** generate_scaled_selected_modes() ********************************* * * Appends a list of scaled selected modes. The list is generated by parsing * an array of common resolutions. This function makes sure that each item * of the list is unique and sorted. The generated items are appended to the * list of selected modes returned by generate_selected_modes(). * */ static void generate_scaled_selected_modes(const nvDisplayPtr display) { int resIndex; nvModeLinePtr default_modeline; nvSelectedModePtr selected_mode = NULL; const NVVRSize *commonResolutions; NVVRSize raster; gchar *name; if (!display || !display->modelines) { return; } default_modeline = get_default_modeline(display); if (default_modeline == NULL) { return; } raster.w = default_modeline->data.hdisplay; raster.h = default_modeline->data.vdisplay; commonResolutions = NVVRGetCommonResolutions(); resIndex = 0; while ((commonResolutions[resIndex].w != -1) && (commonResolutions[resIndex].h != -1)) { NVVRBoxRecXYWH viewPortOut; NVVRSize viewPortIn = commonResolutions[resIndex]; resIndex++; /* Skip resolutions that are bigger than the maximum raster size */ if ((viewPortIn.w > raster.w) || (viewPortIn.h > raster.h)) { continue; } viewPortOut = NVVRGetScaledViewPortOut(&raster, &viewPortIn, NVVR_SCALING_ASPECT_SCALED); name = g_strdup_printf("%dx%d (scaled)", viewPortIn.w, viewPortIn.h); selected_mode = allocate_selected_mode(name, default_modeline, FALSE /* isSpecial */, &viewPortIn, &viewPortOut); g_free(name); if (append_unique_selected_mode(display->selected_modes, selected_mode)) { display->num_selected_modes++; if (matches_current_selected_mode(display, selected_mode, TRUE /* compare_viewports */)) { display->cur_selected_mode = selected_mode; } } else { free(selected_mode); } } } /** setup_display_resolution_dropdown() ****************************** * * Generates the resolution dropdown based on the currently selected * display. * **/ static void setup_display_resolution_dropdown(CtkDisplayConfig *ctk_object) { GtkWidget *menu; GtkWidget *menu_item; nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); nvSelectedModePtr selected_mode; int cur_idx = 0; /* Currently selected modeline (resolution) */ /* Get selection information */ if (!display->screen || !display->cur_mode) { gtk_widget_hide(ctk_object->box_display_resolution); return; } gtk_widget_show(ctk_object->box_display_resolution); gtk_widget_set_sensitive(ctk_object->box_display_resolution, TRUE); /* Generate dropdown content */ free_selected_modes(display->selected_modes); /* Create the selected modes lookup table for the dropdown */ display->cur_selected_mode = NULL; generate_selected_modes(display); if (!ctk_object->advanced_mode) { generate_scaled_selected_modes(display); } if (ctk_object->resolution_table) { free(ctk_object->resolution_table); ctk_object->resolution_table_len = 0; } ctk_object->resolution_table = calloc(display->num_selected_modes, sizeof(nvSelectedModePtr)); if (!ctk_object->resolution_table) { goto fail; } if (display->cur_mode->modeline) { cur_idx = 1; /* Modeline is set, start off as 'nvidia-auto-select' */ } else { cur_idx = 0; /* Modeline not set, start off as 'off'. */ } /* Start the menu generation */ menu = gtk_menu_new(); /* Fill dropdown menu */ selected_mode = display->selected_modes; while (selected_mode) { menu_item = selected_mode->label; gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); ctk_object->resolution_table[ctk_object->resolution_table_len] = selected_mode; if (selected_mode == display->cur_selected_mode) { cur_idx = ctk_object->resolution_table_len; } if (selected_mode->isSpecial && !selected_mode->modeline && display->screen->num_displays <= 1) { gtk_widget_set_sensitive(menu_item, FALSE); } ctk_object->resolution_table_len++; selected_mode = selected_mode->next; } /* Setup the menu and select the current mode */ g_signal_handlers_block_by_func (G_OBJECT(ctk_object->mnu_display_resolution), G_CALLBACK(display_resolution_changed), (gpointer) ctk_object); gtk_option_menu_set_menu (GTK_OPTION_MENU(ctk_object->mnu_display_resolution), menu); gtk_option_menu_set_history (GTK_OPTION_MENU(ctk_object->mnu_display_resolution), cur_idx); ctk_object->last_resolution_idx = cur_idx; /* If dropdown has only one item, disable menu selection */ if (ctk_object->resolution_table_len > 1) { gtk_widget_set_sensitive(ctk_object->mnu_display_resolution, TRUE); } else { gtk_widget_set_sensitive(ctk_object->mnu_display_resolution, FALSE); } g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object->mnu_display_resolution), G_CALLBACK(display_resolution_changed), (gpointer) ctk_object); /* Update refresh dropdown */ setup_display_refresh_dropdown(ctk_object); return; /* Handle failures */ fail: gtk_option_menu_remove_menu (GTK_OPTION_MENU(ctk_object->mnu_display_resolution)); gtk_widget_set_sensitive(ctk_object->mnu_display_resolution, FALSE); setup_display_refresh_dropdown(ctk_object); } /* setup_display_resolution_dropdown() */ /** setup_display_stereo_dropdown() ********************************** * * Configures the display stereo mode dropdown to reflect the * stereo eye for the currently selected display. * **/ static void setup_display_stereo_dropdown(CtkDisplayConfig *ctk_object) { nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); nvModePtr mode; int idx; if (!display->cur_mode || !screen || !screen->stereo_supported || (screen->stereo != NV_CTRL_STEREO_PASSIVE_EYE_PER_DPY)) { gtk_widget_hide(ctk_object->box_display_stereo); return; } mode = display->cur_mode; /* Set the selected passive stereo eye */ g_signal_handlers_block_by_func (G_OBJECT(ctk_object->mnu_display_stereo), G_CALLBACK(display_stereo_changed), (gpointer) ctk_object); switch (mode->passive_stereo_eye) { default: /* Oops */ case PASSIVE_STEREO_EYE_NONE: idx = 0; break; case PASSIVE_STEREO_EYE_LEFT: idx = 1; break; case PASSIVE_STEREO_EYE_RIGHT: idx = 2; break; } gtk_option_menu_set_history (GTK_OPTION_MENU(ctk_object->mnu_display_stereo), idx); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object->mnu_display_stereo), G_CALLBACK(display_stereo_changed), (gpointer) ctk_object); gtk_widget_show(ctk_object->box_display_stereo); } /* setup_display_stereo_dropdown() */ /** are_display_composition_transformations_allowed() **************** * * Checks whether display composition transformations are allowed * given the list of GPU flags. * **/ static Bool are_display_composition_transformations_allowed(nvScreenPtr screen) { int i, j; Bool ret = TRUE; if (!screen) { return FALSE; } for (i = 0; i < screen->num_gpus; i++) { nvGpuPtr gpu = screen->gpus[i]; for (j = 0; j < gpu->num_flags; j++) { switch (gpu->flags[j]) { case NV_CTRL_BINARY_DATA_GPU_FLAGS_STEREO_DISPLAY_TRANSFORM_EXCLUSIVE: if (screen->stereo != NV_CTRL_STEREO_OFF) { ret = FALSE; } break; case NV_CTRL_BINARY_DATA_GPU_FLAGS_OVERLAY_DISPLAY_TRANSFORM_EXCLUSIVE: if (screen->overlay != NV_CTRL_OVERLAY_OFF) { ret = FALSE; } break; default: /* We don't care about other flags */ break; } } } return ret; } /** setup_display_rotation_dropdown() ******************************** * * Configures the display rotation dropdown to reflect the current * rotation configuration. * **/ static void setup_display_rotation_dropdown(CtkDisplayConfig *ctk_object) { nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); int idx; /* Set the selected rotation */ g_signal_handlers_block_by_func (G_OBJECT(ctk_object->mnu_display_rotation), G_CALLBACK(display_rotation_changed), (gpointer) ctk_object); switch (display->cur_mode->rotation) { default: /* Oops */ case ROTATION_0: idx = 0; break; case ROTATION_90: // Rotate left idx = 1; break; case ROTATION_180: // Invert idx = 2; break; case ROTATION_270: // Rotate right idx = 3; break; } gtk_option_menu_set_history (GTK_OPTION_MENU(ctk_object->mnu_display_rotation), idx); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object->mnu_display_rotation), G_CALLBACK(display_rotation_changed), (gpointer) ctk_object); } /* setup_display_rotation_dropdown() */ /** setup_display_reflection_dropdown() ****************************** * * Configures the display reflection dropdown to reflect the current * reflection configuration. * **/ static void setup_display_reflection_dropdown(CtkDisplayConfig *ctk_object) { nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); int idx; /* Set the selected reflection */ g_signal_handlers_block_by_func (G_OBJECT(ctk_object->mnu_display_reflection), G_CALLBACK(display_reflection_changed), (gpointer) ctk_object); switch (display->cur_mode->reflection) { default: /* Oops */ case REFLECTION_NONE: idx = 0; break; case REFLECTION_X: idx = 1; break; case REFLECTION_Y: idx = 2; break; case REFLECTION_XY: idx = 3; break; } gtk_option_menu_set_history (GTK_OPTION_MENU(ctk_object->mnu_display_reflection), idx); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object->mnu_display_reflection), G_CALLBACK(display_reflection_changed), (gpointer) ctk_object); } /* setup_display_reflection_dropdown() */ /** setup_display_orientation() ************************************** * * Sets up the display orientation section to reflect the rotation * and reflection settings for the currently selected display. * **/ static void setup_display_orientation(CtkDisplayConfig *ctk_object) { nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* Display needs to be included in an X screen to show widgets */ if (!display || !display->screen) { gtk_widget_hide(ctk_object->box_display_orientation); return; } gtk_widget_show(ctk_object->box_display_orientation); /* If the display is off, disable the orientation widgets */ if (!display->cur_mode || !display->cur_mode->modeline || !are_display_composition_transformations_allowed(display->screen)) { gtk_widget_set_sensitive(ctk_object->box_display_orientation, FALSE); return; } gtk_widget_set_sensitive(ctk_object->box_display_orientation, TRUE); /* Setup the display orientation widgets */ setup_display_rotation_dropdown(ctk_object); setup_display_reflection_dropdown(ctk_object); } /** setup_display_underscan() ***************************************** * * Sets up the display underscan to reflect the ViewPortOut settings * for the currently selected display. * * Tries to detect whether the current ViewPortOut configuration * corresponds to a border; then sets the underscan text entry and * slider accordingly. Defaults to 0. **/ static void setup_display_underscan(CtkDisplayConfig *ctk_object) { nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); nvModePtr cur_mode; nvSize raster_size; gfloat adj_value; gint hpixel_value; gchar *txt_entry; if (!display || !display->screen || ctk_object->advanced_mode) { gtk_widget_hide(ctk_object->box_display_underscan); return; } gtk_widget_show(ctk_object->box_display_underscan); cur_mode = display->cur_mode; /* * If the display is off or a scaled mode is selected, disable the * underscan widget. */ if (!cur_mode || !cur_mode->modeline || (display->cur_selected_mode && display->cur_selected_mode->isScaled)) { gtk_widget_set_sensitive(ctk_object->box_display_underscan, FALSE); return; } gtk_widget_set_sensitive(ctk_object->box_display_underscan, TRUE); raster_size.height = cur_mode->modeline->data.vdisplay; raster_size.width = cur_mode->modeline->data.hdisplay; get_underscan_settings_from_viewportout(raster_size, cur_mode->viewPortOut, &adj_value, &hpixel_value); /* Setup the slider */ g_signal_handlers_block_by_func (G_OBJECT(ctk_object->adj_display_underscan), G_CALLBACK(display_underscan_value_changed), (gpointer) ctk_object); gtk_adjustment_set_value(GTK_ADJUSTMENT(ctk_object->adj_display_underscan), (adj_value < 0) ? 0 : adj_value); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object-> adj_display_underscan), G_CALLBACK(display_underscan_value_changed), (gpointer) ctk_object); /* Setup the text entry */ g_signal_handlers_block_by_func (G_OBJECT(ctk_object->txt_display_underscan), G_CALLBACK(display_underscan_activate), (gpointer) ctk_object); if (hpixel_value < 0) { txt_entry = g_strdup_printf("n/a"); } else { txt_entry = g_strdup_printf("%d", hpixel_value); } gtk_entry_set_text(GTK_ENTRY(ctk_object->txt_display_underscan), txt_entry); g_free(txt_entry); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object-> txt_display_underscan), G_CALLBACK(display_underscan_activate), (gpointer) ctk_object); } /* setup_display_underscan() */ /** setup_display_viewport_in() ************************************** * * Sets up the display ViewPortIn text entry to reflect the currently * selected display device/mode. * **/ static void setup_display_viewport_in(CtkDisplayConfig *ctk_object) { char *tmp_str; nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); nvModePtr mode; if (!display || !display->screen || !ctk_object->advanced_mode) { gtk_widget_hide(ctk_object->box_display_viewport_in); return; } gtk_widget_show(ctk_object->box_display_viewport_in); if (!display->cur_mode || !display->cur_mode->modeline) { gtk_widget_set_sensitive(ctk_object->box_display_viewport_in, FALSE); return; } gtk_widget_set_sensitive(ctk_object->box_display_viewport_in, TRUE); /* Update the text */ mode = display->cur_mode; tmp_str = g_strdup_printf("%dx%d", mode->viewPortIn.width, mode->viewPortIn.height); gtk_entry_set_text(GTK_ENTRY(ctk_object->txt_display_viewport_in), tmp_str); g_free(tmp_str); } /* setup_display_viewport_in() */ /** setup_display_viewport_out() ************************************* * * Sets up the display ViewPortOut text entry to reflect the currently * selected display device/mode. * **/ static void setup_display_viewport_out(CtkDisplayConfig *ctk_object) { char *tmp_str; nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); nvModePtr mode; if (!display || !display->screen || !ctk_object->advanced_mode) { gtk_widget_hide(ctk_object->box_display_viewport_out); return; } gtk_widget_show(ctk_object->box_display_viewport_out); if (!display->cur_mode || !display->cur_mode->modeline) { gtk_widget_set_sensitive(ctk_object->box_display_viewport_out, FALSE); return; } gtk_widget_set_sensitive(ctk_object->box_display_viewport_out, TRUE); /* Update the text */ mode = display->cur_mode; tmp_str = g_strdup_printf("%dx%d%+d%+d", mode->viewPortOut.width, mode->viewPortOut.height, mode->viewPortOut.x, mode->viewPortOut.y); gtk_entry_set_text(GTK_ENTRY(ctk_object->txt_display_viewport_out), tmp_str); g_free(tmp_str); } /* setup_display_viewport_out() */ /** setup_display_position_type() ************************************ * * Sets up the display position type dropdown to reflect the position * settings for the currently selected display (absolute/relative/ * none). * **/ static void setup_display_position_type(CtkDisplayConfig *ctk_object) { nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* Handle cases where the position type should be hidden */ if (!display || !display->screen || !display->cur_mode) { gtk_widget_hide(ctk_object->mnu_display_position_type); return; } gtk_widget_show(ctk_object->mnu_display_position_type); /* Set absolute/relative positioning */ g_signal_handlers_block_by_func (G_OBJECT(ctk_object->mnu_display_position_type), G_CALLBACK(display_position_type_changed), (gpointer) ctk_object); gtk_option_menu_set_history (GTK_OPTION_MENU(ctk_object->mnu_display_position_type), display->cur_mode->position_type); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object->mnu_display_position_type), G_CALLBACK(display_position_type_changed), (gpointer) ctk_object); } /* setup_display_position_type() */ /** setup_display_position_relative() ******************************** * * Setup which display the selected display is relative to. * **/ static void setup_display_position_relative(CtkDisplayConfig *ctk_object) { nvDisplayPtr display; nvDisplayPtr relative_to; int idx; int selected_idx; GtkWidget *menu; GtkWidget *menu_item; display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* No need to show dropdown if display position is absolute */ if (!display || !display->screen || !display->cur_mode || !display->gpu) { goto fail; } /* Allocate the display lookup table for the dropdown */ if (ctk_object->display_position_table) { free(ctk_object->display_position_table); } ctk_object->display_position_table_len = display->screen->num_displays -1; ctk_object->display_position_table = calloc(ctk_object->display_position_table_len, sizeof(nvDisplayPtr)); if (!ctk_object->display_position_table) { goto fail; } /* Generate the lookup table and display dropdown */ idx = 0; selected_idx = 0; menu = gtk_menu_new(); for (relative_to = display->screen->displays; relative_to; relative_to = relative_to->next_in_screen) { if (relative_to == display) continue; if (relative_to == display->cur_mode->relative_to) { selected_idx = idx; } ctk_object->display_position_table[idx] = relative_to; menu_item = gtk_menu_item_new_with_label(relative_to->logName); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); idx++; } /* Set the menu and the selected display */ g_signal_handlers_block_by_func (G_OBJECT(ctk_object->mnu_display_position_relative), G_CALLBACK(display_position_relative_changed), (gpointer) ctk_object); gtk_option_menu_set_menu (GTK_OPTION_MENU(ctk_object->mnu_display_position_relative), menu); gtk_option_menu_set_history (GTK_OPTION_MENU(ctk_object->mnu_display_position_relative), selected_idx); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object->mnu_display_position_relative), G_CALLBACK(display_position_relative_changed), (gpointer) ctk_object); /* Disable the widget if there is only one possibility */ gtk_widget_set_sensitive (ctk_object->mnu_display_position_relative, (idx > 1)); /* Hide the dropdown if the display position is absolute */ if (display->cur_mode->position_type == CONF_ADJ_ABSOLUTE) { gtk_widget_hide(ctk_object->mnu_display_position_relative); return; } gtk_widget_show(ctk_object->mnu_display_position_relative); return; fail: if (ctk_object->display_position_table) { free(ctk_object->display_position_table); ctk_object->display_position_table = NULL; } ctk_object->display_position_table_len = 0; gtk_widget_hide(ctk_object->mnu_display_position_relative); } /* setup_display_position_relative() */ /** setup_display_position_offset() ********************************** * * Sets up the display position offset text entry to reflect the * currently selected display device. * **/ static void setup_display_position_offset(CtkDisplayConfig *ctk_object) { char *tmp_str; nvDisplayPtr display; nvModePtr mode; display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* Handle cases where the position offset should be hidden */ if (!display || !display->screen || !display->cur_mode || !display->cur_mode->modeline || display->cur_mode->position_type != CONF_ADJ_ABSOLUTE) { gtk_widget_hide(ctk_object->txt_display_position_offset); return; } gtk_widget_show(ctk_object->txt_display_position_offset); /* Update the position text */ mode = display->cur_mode; tmp_str = g_strdup_printf("%+d%+d", mode->pan.x - mode->metamode->edim.x, mode->pan.y - mode->metamode->edim.y); gtk_entry_set_text(GTK_ENTRY(ctk_object->txt_display_position_offset), tmp_str); g_free(tmp_str); } /* setup_display_position_offset() */ /** setup_display_position() ***************************************** * * Sets up the display position section to reflect the position * settings for the currently selected display (absolute/relative/ * none). * **/ static void setup_display_position(CtkDisplayConfig *ctk_object) { nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* Need at least 2 displays in the X screen to configure position */ if (!display || !display->screen || (display->screen->num_displays < 2)) { gtk_widget_hide(ctk_object->box_display_position); return; } gtk_widget_show(ctk_object->box_display_position); /* If the display is off, disable the position widgets */ if (!display->cur_mode || !display->cur_mode->modeline) { gtk_widget_set_sensitive(ctk_object->box_display_position, FALSE); return; } gtk_widget_set_sensitive(ctk_object->box_display_position, TRUE); /* Setup the display position widgets */ setup_display_position_type(ctk_object); setup_display_position_relative(ctk_object); setup_display_position_offset(ctk_object); } /* setup_display_position */ /** setup_primary_display() ****************************************** * * Sets up the primary display device for an X screen. * **/ static void setup_primary_display(CtkDisplayConfig *ctk_object) { nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* Hide the checkbox if this screen only has one display */ if (!display->screen || display->screen->num_displays <= 1) { gtk_widget_hide(ctk_object->chk_primary_display); return; } gtk_widget_show(ctk_object->chk_primary_display); g_signal_handlers_block_by_func (G_OBJECT(ctk_object->chk_primary_display), G_CALLBACK(screen_primary_display_toggled), (gpointer) ctk_object); if ( display->screen && display == display->screen->primaryDisplay ) { // Primary display checkbox should be checked. gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_object->chk_primary_display), TRUE); } else { // This display does not have a screen or is not the screen's // primary display. gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_object->chk_primary_display), FALSE); } g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object->chk_primary_display), G_CALLBACK(screen_primary_display_toggled), (gpointer) ctk_object); } /* setup_primary_display() */ /** setup_display_panning() ****************************************** * * Sets up the display panning text entry to reflect the currently * selected display. * **/ static void setup_display_panning(CtkDisplayConfig *ctk_object) { char *tmp_str; nvDisplayPtr display; nvModePtr mode; display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!display || !display->screen || !ctk_object->advanced_mode) { gtk_widget_hide(ctk_object->box_display_panning); return; } gtk_widget_show(ctk_object->box_display_panning); if (!display->cur_mode || !display->cur_mode->modeline) { gtk_widget_set_sensitive(ctk_object->box_display_panning, FALSE); return; } gtk_widget_set_sensitive(ctk_object->box_display_panning, TRUE); /* Update the panning text */ mode = display->cur_mode; tmp_str = g_strdup_printf("%dx%d", mode->pan.width, mode->pan.height); gtk_entry_set_text(GTK_ENTRY(ctk_object->txt_display_panning), tmp_str); g_free(tmp_str); } /* setup_display_panning */ /** setup_display_page() ******************************************** * * Updates the display frame to reflect the current state of the * currently selected display. * **/ static void setup_display_page(CtkDisplayConfig *ctk_object) { nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!display) { return; } /* Enable display widgets and setup widget information */ gtk_widget_set_sensitive(ctk_object->display_page, True); if (display->gpu->layout->num_screens > 1) { gtk_widget_show(ctk_object->box_screen_drag_info_display); } else { gtk_widget_hide(ctk_object->box_screen_drag_info_display); } setup_display_config(ctk_object); setup_display_modename(ctk_object); setup_display_resolution_dropdown(ctk_object); setup_display_stereo_dropdown(ctk_object); setup_display_orientation(ctk_object); setup_display_underscan(ctk_object); setup_display_viewport_in(ctk_object); setup_display_viewport_out(ctk_object); setup_display_position(ctk_object); setup_display_panning(ctk_object); setup_primary_display(ctk_object); } /* setup_display_page() */ /** setup_screen_virtual_size() ************************************** * * Sets up the UI for configuring the virtual width/height of the * currently selected X screen. * **/ static void setup_screen_virtual_size(CtkDisplayConfig *ctk_object) { char *tmp_str; nvScreenPtr screen; screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* Only show this box for no-scanout screens */ if (!screen || !screen->no_scanout) { gtk_widget_hide(ctk_object->box_screen_virtual_size); return; } gtk_widget_show(ctk_object->box_screen_virtual_size); /* Update the virtual size text */ tmp_str = g_strdup_printf("%dx%d", screen->dim.width, screen->dim.height); gtk_entry_set_text(GTK_ENTRY(ctk_object->txt_screen_virtual_size), tmp_str); g_free(tmp_str); } /* setup_screen_virtual_size() */ /** grow_screen_depth_table() ************************************** * * realloc the screen_depth_table, if possible. * **/ static gboolean grow_screen_depth_table(CtkDisplayConfig *ctk_object) { int *tmp = realloc(ctk_object->screen_depth_table, sizeof(int) * (ctk_object->screen_depth_table_len + 1)); if (!tmp) { return False; } ctk_object->screen_depth_table = tmp; ctk_object->screen_depth_table_len++; return True; } /* grow_screen_depth_table() */ /** setup_screen_depth_dropdown() ************************************ * * Generates the color depth dropdown based on the currently selected * display device. * **/ static void setup_screen_depth_dropdown(CtkDisplayConfig *ctk_object) { GtkWidget *menu; GtkWidget *menu_item; int cur_idx; gboolean add_depth_30_option; nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!screen) { gtk_widget_hide(ctk_object->box_screen_depth); return; } if (ctk_object->screen_depth_table) { free(ctk_object->screen_depth_table); } ctk_object->screen_depth_table = NULL; ctk_object->screen_depth_table_len = 0; menu = gtk_menu_new(); /* If Xinerama is enabled, only allow depth 30 if all * gpu/screens have support for depth 30. */ if (ctk_object->layout->xinerama_enabled) { add_depth_30_option = layout_supports_depth_30(screen->layout); } else { add_depth_30_option = screen->allow_depth_30; } if (add_depth_30_option) { if (grow_screen_depth_table(ctk_object)) { menu_item = gtk_menu_item_new_with_label ("1.1 Billion Colors (Depth 30) - Experimental"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); ctk_object->screen_depth_table[ctk_object->screen_depth_table_len-1] = 30; } } if (grow_screen_depth_table(ctk_object)) { menu_item = gtk_menu_item_new_with_label("16.7 Million Colors (Depth 24)"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); ctk_object->screen_depth_table[ctk_object->screen_depth_table_len-1] = 24; } if (grow_screen_depth_table(ctk_object)) { menu_item = gtk_menu_item_new_with_label("65,536 Colors (Depth 16)"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); ctk_object->screen_depth_table[ctk_object->screen_depth_table_len-1] = 16; } if (grow_screen_depth_table(ctk_object)) { menu_item = gtk_menu_item_new_with_label("32,768 Colors (Depth 15)"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); ctk_object->screen_depth_table[ctk_object->screen_depth_table_len-1] = 15; } if (grow_screen_depth_table(ctk_object)) { menu_item = gtk_menu_item_new_with_label("256 Colors (Depth 8)"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); ctk_object->screen_depth_table[ctk_object->screen_depth_table_len-1] = 8; } g_signal_handlers_block_by_func(G_OBJECT(ctk_object->mnu_screen_depth), G_CALLBACK(screen_depth_changed), (gpointer) ctk_object); gtk_option_menu_set_menu (GTK_OPTION_MENU(ctk_object->mnu_screen_depth), menu); for (cur_idx = 0; cur_idx < ctk_object->screen_depth_table_len; cur_idx++) { if (screen->depth == ctk_object->screen_depth_table[cur_idx]) { gtk_option_menu_set_history (GTK_OPTION_MENU(ctk_object->mnu_screen_depth), cur_idx); } } g_signal_handlers_unblock_by_func(G_OBJECT(ctk_object->mnu_screen_depth), G_CALLBACK(screen_depth_changed), (gpointer) ctk_object); gtk_widget_show(ctk_object->box_screen_depth); return; } /* setup_screen_depth_dropdown() */ /** setup_screen_stereo_dropdown() *********************************** * * Configures the screen stereo mode dropdown to reflect the * stereo mode for the currently selected screen. * **/ static void setup_screen_stereo_dropdown(CtkDisplayConfig *ctk_object) { nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!ctk_object->box_screen_stereo) return; /* Handle cases where the position type should be hidden */ if (!screen || !screen->stereo_supported) { gtk_widget_hide(ctk_object->box_screen_stereo); return; } /* Set the selected positioning type */ g_signal_handlers_block_by_func (G_OBJECT(ctk_object->mnu_screen_stereo), G_CALLBACK(screen_stereo_changed), (gpointer) ctk_object); gtk_option_menu_set_history (GTK_OPTION_MENU(ctk_object->mnu_screen_stereo), screen->stereo); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object->mnu_screen_stereo), G_CALLBACK(screen_stereo_changed), (gpointer) ctk_object); gtk_widget_show(ctk_object->box_screen_stereo); } /* setup_screen_stereo_dropdown() */ /** setup_screen_position_type() ************************************* * * Configures the screen position type dropdown to reflect the * position setting for the currently selected screen. * **/ static void setup_screen_position_type(CtkDisplayConfig *ctk_object) { nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* Handle cases where the position type should be hidden */ if (!screen) { gtk_widget_hide(ctk_object->mnu_screen_position_type); return; } gtk_widget_show(ctk_object->mnu_screen_position_type); /* Set the selected positioning type */ g_signal_handlers_block_by_func (G_OBJECT(ctk_object->mnu_screen_position_type), G_CALLBACK(screen_position_type_changed), (gpointer) ctk_object); gtk_option_menu_set_history (GTK_OPTION_MENU(ctk_object->mnu_screen_position_type), screen->position_type); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object->mnu_screen_position_type), G_CALLBACK(screen_position_type_changed), (gpointer) ctk_object); } /* setup_screen_position_type() */ /** setup_screen_position_relative() ********************************* * * Setup which screen the selected screen is relative to. * **/ static void setup_screen_position_relative(CtkDisplayConfig *ctk_object) { nvLayoutPtr layout = ctk_object->layout; nvScreenPtr screen; nvScreenPtr relative_to; int idx; int selected_idx; GtkWidget *menu; GtkWidget *menu_item; screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!screen) { goto fail; } /* Count the number of screens, not including the current one */ ctk_object->screen_position_table_len = layout->num_screens; if (ctk_object->screen_position_table_len > 0) { ctk_object->screen_position_table_len--; } /* Allocate the screen lookup table for the dropdown */ if (ctk_object->screen_position_table) { free(ctk_object->screen_position_table); } ctk_object->screen_position_table = calloc(ctk_object->screen_position_table_len, sizeof(nvScreenPtr)); if (!ctk_object->screen_position_table) { goto fail; } /* Generate the lookup table and screen dropdown */ idx = 0; selected_idx = 0; menu = gtk_menu_new(); for (relative_to = layout->screens; relative_to; relative_to = relative_to->next_in_layout) { gchar *tmp_str; if (relative_to == screen) continue; if (relative_to == screen->relative_to) { selected_idx = idx; } ctk_object->screen_position_table[idx] = relative_to; tmp_str = g_strdup_printf("X screen %d", relative_to->scrnum); menu_item = gtk_menu_item_new_with_label(tmp_str); g_free(tmp_str); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); idx++; } /* Set the menu and the selected display */ g_signal_handlers_block_by_func (G_OBJECT(ctk_object->mnu_screen_position_relative), G_CALLBACK(screen_position_relative_changed), (gpointer) ctk_object); gtk_option_menu_set_menu (GTK_OPTION_MENU(ctk_object->mnu_screen_position_relative), menu); gtk_option_menu_set_history (GTK_OPTION_MENU(ctk_object->mnu_screen_position_relative), selected_idx); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object->mnu_screen_position_relative), G_CALLBACK(screen_position_relative_changed), (gpointer) ctk_object); /* Disable the widget if there is only one possibility */ gtk_widget_set_sensitive (ctk_object->mnu_screen_position_relative, (idx > 1)); /* Hide the dropdown if the screen position is absolute */ if (screen->position_type == CONF_ADJ_ABSOLUTE) { gtk_widget_hide(ctk_object->mnu_screen_position_relative); return; } gtk_widget_show(ctk_object->mnu_screen_position_relative); return; fail: if (ctk_object->screen_position_table) { free(ctk_object->screen_position_table); ctk_object->screen_position_table = NULL; } ctk_object->screen_position_table_len = 0; gtk_widget_hide(ctk_object->mnu_screen_position_relative); } /* setup_screen_position_relative() */ /** setup_screen_position_offset() *********************************** * * Sets up the screen position offset text entry to reflect the * currently selected screen. * **/ static void setup_screen_position_offset(CtkDisplayConfig *ctk_object) { char *tmp_str; nvScreenPtr screen; screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* Handle cases where the position offset should be hidden */ if (!screen || (screen->position_type != CONF_ADJ_ABSOLUTE && screen->position_type != CONF_ADJ_RELATIVE)) { gtk_widget_hide(ctk_object->txt_screen_position_offset); return; } gtk_widget_show(ctk_object->txt_screen_position_offset); /* Update the position text */ tmp_str = g_strdup_printf("%+d%+d", screen->dim.x, screen->dim.y); gtk_entry_set_text(GTK_ENTRY(ctk_object->txt_screen_position_offset), tmp_str); g_free(tmp_str); } /* setup_screen_position_offset() */ /** setup_screen_position() ****************************************** * * Sets up the screen position section to reflect the position * settings for the currently selected screen. * **/ static void setup_screen_position(CtkDisplayConfig *ctk_object) { nvLayoutPtr layout = ctk_object->layout; nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* Need at least 2 X screens to configure position */ if (!screen || (layout->num_screens < 2)) { gtk_widget_hide(ctk_object->box_screen_position); return; } gtk_widget_show(ctk_object->box_screen_position); /* Setup the screen position widgets */ setup_screen_position_type(ctk_object); setup_screen_position_relative(ctk_object); setup_screen_position_offset(ctk_object); } /* setup_screen_position() */ /** setup_screen_metamode() ****************************************** * * Generates the metamode dropdown for the selected screen * **/ static void setup_screen_metamode(CtkDisplayConfig *ctk_object) { nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); gchar *str; /* Only show the metamodes in advanced mode for screens * that support scanout. */ if (!screen || screen->no_scanout || !ctk_object->advanced_mode) { gtk_widget_hide(ctk_object->box_screen_metamode); return; } /* Update the metamode selector button */ str = g_strdup_printf("%d - ...", screen->cur_metamode_idx +1); gtk_button_set_label(GTK_BUTTON(ctk_object->btn_screen_metamode), str); g_free(str); /* Only allow deletes if there are more than 1 metamodes */ gtk_widget_set_sensitive(ctk_object->btn_screen_metamode_delete, ((screen->num_metamodes > 1) ? True : False)); gtk_widget_show(ctk_object->box_screen_metamode); } /* setup_screen_metamode() */ /** setup_screen_page() ********************************************* * * Sets up the screen frame to reflect the currently selected screen. * **/ static void setup_screen_page(CtkDisplayConfig *ctk_object) { nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!screen) { return; } /* Enable display widgets and setup widget information */ gtk_widget_set_sensitive(ctk_object->screen_page, True); if (screen->layout->num_screens > 1) { gtk_widget_show(ctk_object->box_screen_drag_info_screen); } else { gtk_widget_hide(ctk_object->box_screen_drag_info_screen); } setup_screen_virtual_size(ctk_object); setup_screen_depth_dropdown(ctk_object); setup_screen_stereo_dropdown(ctk_object); setup_screen_position(ctk_object); setup_screen_metamode(ctk_object); } /* setup_screen_page() */ /** validation_fix_crowded_metamodes() ******************************* * * Goes through each screen's metamodes and ensures that at most * (max supported) display devices are active (have a modeline set) per * metamode. This function also checks to make sure that there is at least * one display device active for each metamode. * **/ static gint validation_fix_crowded_metamodes(CtkDisplayConfig *ctk_object, nvScreenPtr screen) { nvDisplayPtr display; nvModePtr first_mode = NULL; nvModePtr mode; int num; int i, j; int max_displays = get_screen_max_displays(screen); /* Verify each metamode with the metamodes that come before it */ for (i = 0; i < screen->num_metamodes; i++) { /* Keep track of the first mode in case we need to assign * a default resolution */ first_mode = NULL; /* Count the number of display devices that have a mode * set for this metamode. NULL out the modes of extra * display devices once we've counted max supported display devices * that have a (non NULL) mode set. */ num = 0; for (display = screen->displays; display; display = display->next_in_screen) { /* Check the mode that corresponds with the metamode */ mode = display->modes; for (j = 0; j < i; j++) { mode = mode->next; } if (!first_mode) { first_mode = mode; } if (mode->modeline) { num++; } /* Disable extra modes */ if (max_displays >= 0 && num > max_displays) { ctk_display_layout_set_mode_modeline (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), mode, NULL /* modeline */, NULL /* viewPortIn */, NULL /* viewPortOut */); nv_info_msg(TAB, "Setting display device '%s' as Off " "for MetaMode %d on Screen %d. (There are " "already %d active display devices for this " "MetaMode.", display->logName, i, screen->scrnum, max_displays); } } /* Handle the case where a metamode has no active display device */ if (!num) { /* There are other modelines, so we can safely delete this one */ if (screen->num_metamodes > 1) { /* Delete the metamode */ ctk_display_layout_delete_screen_metamode (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, i, TRUE); nv_info_msg(TAB, "Removed MetaMode %d on Screen %d (No " "active display devices)\n", i, screen->scrnum); /* Since we just deleted the current metamode, we * need to check the i'th metamode "again" since this * is effectively the next metamode. */ i--; /* This is the only modeline, activate the first display */ } else if (first_mode) { /* Select the first modeline in the modepool */ ctk_display_layout_set_mode_modeline (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), first_mode, first_mode->display->modelines, NULL /* viewPortIn */, NULL /* viewPortOut */); nv_info_msg(TAB, "Activating display device '%s' for MetaMode " "%d on Screen %d. (Minimally, a Screen must have " "one MetaMode with at least one active display " "device.)", first_mode->display->logName, i, screen->scrnum); } } } return 1; } /* validation_fix_crowded_metamodes() */ /** validation_auto_fix_screen() ************************************* * * Do what we can to make this screen conform to validation. * **/ static gint validation_auto_fix_screen(CtkDisplayConfig *ctk_object, nvScreenPtr screen) { gint status = 1; status &= validation_fix_crowded_metamodes(ctk_object, screen); return status; } /* validation_auto_fix_screen() */ /** validation_auto_fix() ******************************************** * * Attempts to fix any problems found in the layout. Returns 1 if * the layout is in a valid state when done. Returns 0 if there * was a problem and the layout validation error could not be fixed * by this function. * **/ static gint validation_auto_fix(CtkDisplayConfig *ctk_object) { nvLayoutPtr layout = ctk_object->layout; nvScreenPtr screen; gint success = 1; /* Auto fix each screen */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { if (!validation_auto_fix_screen(ctk_object, screen)) { success = 0; break; } } if (!success) { nv_warning_msg("Failed to auto fix X configuration."); /* XXX We should pop up a dialog box to let the user know * there are still problems. */ } return success; } /* validation_auto_fix() */ /** validate_screen() ************************************************ * * This function returns NULL if the screen is found to be in a * valid state. To be in a valid state the screen's metamodes must * adhere to the following: * * - Have at least 1 display device activated for all metamodes. * * - Have at most (max supported) display devices activated for all * metamodes. * * - All metamodes must have a coherent offset (The top left corner * of the bounding box of all the metamodes must be the same.) * * If the screen is found to be in an invalid state, a string * describing the problem is returned. This string should be freed * by the user when done with it. * **/ static gchar * validate_screen(nvScreenPtr screen) { nvDisplayPtr display; nvModePtr mode; int i, j; int max_displays = get_screen_max_displays(screen); int num_displays; gchar *err_str = NULL; gchar *tmp; gchar *tmp2; gchar bullet[8]; // UTF8 Bullet string int len; /* Convert the Unicode "Bullet" Character into a UTF8 string */ len = g_unichar_to_utf8(0x2022, bullet); bullet[len] = '\0'; for (i = 0; i < screen->num_metamodes; i++) { /* Count the number of display devices used in the metamode */ num_displays = 0; for (display = screen->displays; display; display = display->next_in_screen) { mode = display->modes; for (j = 0; j < i; j++) { mode = mode->next; } if (mode->modeline) { num_displays++; } } /* There must be at least one display active in the metamode. */ if (!num_displays) { tmp = g_strdup_printf("%s MetaMode %d of Screen %d does not have " "an active display device.\n\n", bullet, i+1, screen->scrnum); tmp2 = g_strconcat((err_str ? err_str : ""), tmp, NULL); g_free(err_str); g_free(tmp); err_str = tmp2; } /* There can be at most max supported displays active in the metamode. */ if (max_displays >= 0 && num_displays > max_displays) { tmp = g_strdup_printf("%s MetaMode %d of Screen %d has more than " "%d active display devices.\n\n", bullet, i+1, screen->scrnum, max_displays); tmp2 = g_strconcat((err_str ? err_str : ""), tmp, NULL); g_free(err_str); g_free(tmp); err_str = tmp2; } } return err_str; } /* validate_screen() */ /** validate_layout() ************************************************ * * Makes sure that the layout is ready for applying/saving. * * If the layout is found to be invalid the user is prompted to * cancel the operation or to ignore and continue despite the * errors. * **/ static int validate_layout(CtkDisplayConfig *ctk_object, int validation_type) { nvLayoutPtr layout = ctk_object->layout; nvScreenPtr screen; gchar *err_strs = NULL; gchar *err_str; gchar *tmp; gint result; int num_absolute = 0; /* Validate each screen and count the number of screens using abs. pos. */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { err_str = validate_screen(screen); if (err_str) { tmp = g_strconcat((err_strs ? err_strs : ""), err_str, NULL); g_free(err_strs); g_free(err_str); err_strs = tmp; } if (screen->position_type == CONF_ADJ_ABSOLUTE) { num_absolute++; } } if (validation_type == VALIDATE_SAVE) { /* Warn user when they are using absolute positioning with * multiple X screens. */ if (num_absolute > 1) { GtkWidget *dlg; GtkWidget *parent = ctk_get_parent_window(GTK_WIDGET(ctk_object)); if (parent) { dlg = gtk_message_dialog_new (GTK_WINDOW(parent), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Multiple X screens are set to use absolute " "positioning. Though it is valid to do so, one or more " "X screens may be (or may become) unreachable due to " "overlapping and/or dead space. It is recommended to " "only use absolute positioning for the first X screen, " "and relative positioning for all subsequent X screens."); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); } } } /* Layout is valid */ if (!err_strs) { return 1; } /* Layout is not valid, ask the user what we should do */ gtk_text_buffer_set_text (GTK_TEXT_BUFFER(ctk_object->buf_validation_override), err_strs, -1); g_free(err_strs); gtk_widget_hide(ctk_object->box_validation_override_details); gtk_window_resize(GTK_WINDOW(ctk_object->dlg_validation_override), 350, 1); gtk_window_set_resizable(GTK_WINDOW(ctk_object->dlg_validation_override), FALSE); gtk_button_set_label(GTK_BUTTON(ctk_object->btn_validation_override_show), "Show Details..."); /* Show the confirm dialog */ gtk_window_set_transient_for (GTK_WINDOW(ctk_object->dlg_validation_override), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(ctk_object)))); gtk_widget_grab_focus(ctk_object->btn_validation_override_cancel); gtk_widget_show(ctk_object->dlg_validation_override); result = gtk_dialog_run(GTK_DIALOG(ctk_object->dlg_validation_override)); gtk_widget_hide(ctk_object->dlg_validation_override); switch (result) { case GTK_RESPONSE_ACCEPT: /* User wants to ignore the validation warnings */ return 1; case GTK_RESPONSE_APPLY: /* User wants to auto fix the warnings */ result = validation_auto_fix(ctk_object); /* Update the GUI to reflect any updates made by auto fix */ update_gui(ctk_object); return result; case GTK_RESPONSE_REJECT: default: /* User wants to heed the validation warnings */ return 0; } return 0; } /* validate_layout() */ /** validate_apply() ************************************************* * * Informs the user if we can't apply for whatever reason. This * function returns FALSE if we should not continue the apply or * TRUE if we should continue the apply operation(s). * **/ static gboolean validate_apply(CtkDisplayConfig *ctk_object) { gint result; if (ctk_object->apply_possible) { return TRUE; } /* Show the "can't apply" dialog */ /* If we can't apply, let the user know. * * XXX - Show more details as to why exactly we can't apply. */ gtk_window_set_transient_for (GTK_WINDOW(ctk_object->dlg_validation_apply), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(ctk_object)))); gtk_widget_show(ctk_object->dlg_validation_apply); result = gtk_dialog_run(GTK_DIALOG(ctk_object->dlg_validation_apply)); gtk_widget_hide(ctk_object->dlg_validation_apply); switch (result) { case GTK_RESPONSE_ACCEPT: /* User wants to ignore the validation warnings */ return TRUE; case GTK_RESPONSE_REJECT: default: return FALSE; } return FALSE; } /* validate_apply() */ /* Callback handlers *************************************************/ /** layout_selected_callback() *************************************** * * Called every time the user selects a new display or screen from * the layout image. * **/ void layout_selected_callback(nvLayoutPtr layout, void *data) { CtkDisplayConfig *ctk_object = (CtkDisplayConfig *)data; /* Reconfigure GUI to display information about the selected screen. */ setup_display_page(ctk_object); setup_screen_page(ctk_object); setup_selected_item_dropdown(ctk_object); update_selected_page(ctk_object); get_cur_screen_pos(ctk_object); } /* layout_selected_callback() */ /** layout_modified_callback() *************************************** * * Called every time the user moves a screen/display in the layout * image. * **/ void layout_modified_callback(nvLayoutPtr layout, void *data) { CtkDisplayConfig *ctk_object = (CtkDisplayConfig *)data; /* Sync the information displayed by the GUI to match the settings * of the currently selected display device. */ setup_display_viewport_in(ctk_object); setup_display_viewport_out(ctk_object); setup_display_position(ctk_object); setup_display_panning(ctk_object); setup_screen_position(ctk_object); setup_screen_virtual_size(ctk_object); /* If the positioning of the X screen changes, we cannot apply */ check_screen_pos_changed(ctk_object); user_changed_attributes(ctk_object); } /* layout_modified_callback() */ /* Widget signal handlers ********************************************/ /** selected_item_changed() ********************************* * * Called when user selects a new display or X screen. * **/ static void selected_item_changed(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); gint idx; SelectableItem *item; idx = gtk_option_menu_get_history(GTK_OPTION_MENU(widget)); item = &(ctk_object->selected_item_table[idx]); switch (item->type) { case SELECTABLE_ITEM_SCREEN: ctk_display_layout_select_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), item->u.screen); break; case SELECTABLE_ITEM_DISPLAY: ctk_display_layout_select_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), item->u.display); break; } setup_display_page(ctk_object); setup_screen_page(ctk_object); update_selected_page(ctk_object); } /* selected_item_changed() */ /** do_enable_display_on_new_xscreen() ******************************* * * Adds the display device to a new X screen in the layout. * * This handles the "Disabled -> New X screen" transition. * **/ static void do_enable_display_on_new_xscreen(CtkDisplayConfig *ctk_object, nvDisplayPtr display) { nvLayoutPtr layout = ctk_object->layout; nvScreenPtr screen; nvGpuPtr gpu; nvScreenPtr rightmost = NULL; nvScreenPtr other; nvMetaModePtr metamode; nvModePtr mode; int num_screens_on_gpu = 0; gpu = display->gpu; for (screen = layout->screens; screen; screen = screen->next_in_layout) { if (screen_has_gpu(screen, gpu)) { num_screens_on_gpu++; } } /* Make sure we're allowed to enable this display */ if (gpu->mosaic_enabled || (num_screens_on_gpu >= gpu->max_displays) || display->screen) { return; } /* Get resources */ screen = (nvScreenPtr)calloc(1, sizeof(nvScreen)); metamode = (nvMetaModePtr)calloc(1, sizeof(nvMetaMode)); if (!screen) return; if (!metamode) { free(screen); return; } /* Setup the display */ screen_link_display(screen, display); /* Setup the mode */ mode = display->modes; mode->metamode = metamode; mode_set_modeline(mode, display->modelines, NULL /* viewPortIn */, NULL /* viewPortOut */); mode->position_type = CONF_ADJ_ABSOLUTE; /* Setup the initial metamode */ metamode->id = -1; metamode->source = METAMODE_SOURCE_NVCONTROL; metamode->switchable = True; /* Setup the screen */ screen->scrnum = layout->num_screens; screen->display_owner_gpu_id = -1; link_screen_to_gpu(screen, gpu); other = layout_get_a_screen(layout, gpu); screen->depth = other ? other->depth : 24; screen->metamodes = metamode; screen->num_metamodes = 1; screen->cur_metamode = metamode; screen->cur_metamode_idx = 0; /* Compute the right-most screen */ for (other = layout->screens; other; other = other->next_in_layout) { if (!rightmost || ((other->dim.x + other->dim.width) > (rightmost->dim.x + rightmost->dim.width))) { rightmost = other; } } /* Make the screen right-of the right-most screen */ if (rightmost) { screen->position_type = CONF_ADJ_RIGHTOF; screen->relative_to = rightmost; screen->dim.x = mode->pan.x = rightmost->dim.x; screen->dim.y = mode->pan.y = rightmost->dim.y; } else { screen->position_type = CONF_ADJ_ABSOLUTE; screen->relative_to = NULL; screen->dim.x = mode->pan.x; screen->dim.y = mode->pan.y; } /* Add the screen at the end of the layout's screen list */ layout_add_screen(layout, screen); /* We can't dynamically add new X screens */ ctk_object->apply_possible = FALSE; } /** do_enable_display_on_xscreen() *********************************** * * Adds the display device to an existing X screen. * * Handles the "Disabled -> Existing X screen" transition. * **/ static void do_enable_display_on_xscreen(CtkDisplayConfig *ctk_object, nvDisplayPtr display, nvScreenPtr screen) { nvMetaModePtr metamode; nvModePtr mode; int max_displays = get_screen_max_displays(screen); /* Make sure we're allowed to enable this display */ if (max_displays >= 0 && screen->num_displays > max_displays) { return; } /* Inject the display (create modes) into all the existing metamodes */ display_remove_modes(display); for (metamode = screen->metamodes; metamode; metamode = metamode->next) { nvDisplayPtr other; nvModePtr rightmost = NULL; /* Get the right-most mode of the metamode */ for (other = screen->displays; other; other = other->next_in_screen) { for (mode = other->modes; mode; mode = mode->next) { if (!rightmost || ((mode->pan.x + mode->pan.width) > (rightmost->pan.x + rightmost->pan.width))) { rightmost = mode; } } } /* Create the nvidia-auto-select mode for the display */ mode = mode_parse(display, "nvidia-auto-select"); mode->metamode = metamode; /* Set the currently selected mode */ if (metamode == screen->cur_metamode) { display->cur_mode = mode; } /* Position the new mode to the right of the right-most metamode */ if (rightmost) { mode->position_type = CONF_ADJ_RIGHTOF; mode->relative_to = rightmost->display; mode->pan.x = rightmost->display->cur_mode->pan.x; mode->pan.y = rightmost->display->cur_mode->pan.y; } else { mode->position_type = CONF_ADJ_ABSOLUTE; mode->relative_to = NULL; mode->pan.x = metamode->dim.x + metamode->dim.width; mode->pan.y = metamode->dim.y; } /* Add the mode at the end of the display's mode list */ xconfigAddListItem((GenericListPtr *)(&display->modes), (GenericListPtr)mode); display->num_modes++; } /* Link the screen and display together */ screen_link_display(screen, display); } /** do_configure_display_on_new_xscreen() **************************** * * Configures the display's GPU for Multiple X screens. * * Handles the "X screen -> New X screen" transition. * **/ static void do_configure_display_on_new_xscreen(CtkDisplayConfig *ctk_object, nvDisplayPtr display) { ctk_display_layout_disable_display(CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), display); do_enable_display_on_new_xscreen(ctk_object, display); } /** do_configure_display_on_xscreen() ******************************** * * Moves the display from it's current screen to the new given X * screen. * **/ static void do_configure_display_on_xscreen(CtkDisplayConfig *ctk_object, nvDisplayPtr display, nvScreenPtr use_screen) { if (display->screen == use_screen) { return; } ctk_display_layout_disable_display(CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), display); do_enable_display_on_xscreen(ctk_object, display, use_screen); } /** do_query_remove_display() **************************************** * * Asks the user about removing a display device from the layout. * **/ static gboolean do_query_remove_display(CtkDisplayConfig *ctk_object, nvDisplayPtr display) { gint result; /* Show the display disable dialog */ gtk_window_set_transient_for (GTK_WINDOW(ctk_object->dlg_display_disable), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(ctk_object)))); gtk_widget_show_all(ctk_object->dlg_display_disable); gtk_widget_grab_focus(ctk_object->btn_display_disable_cancel); result = gtk_dialog_run(GTK_DIALOG(ctk_object->dlg_display_disable)); gtk_widget_hide(ctk_object->dlg_display_disable); switch (result) { case GTK_RESPONSE_ACCEPT: return True; case GTK_RESPONSE_CANCEL: default: /* Cancel */ return False; } return False; } /* do_query_remove_display() */ /** do_disable_display() ********************************************* * * Confirms disabling of the display device. * **/ static void do_disable_display(CtkDisplayConfig *ctk_object, nvDisplayPtr display) { nvGpuPtr gpu = display->gpu; gchar *str; /* Setup the remove display dialog */ if (ctk_object->advanced_mode) { str = g_strdup_printf("Disable the display device %s (%s) " "on GPU-%d (%s)?", display->logName, display->typeIdName, NvCtrlGetTargetId(gpu->handle), gpu->name); } else { str = g_strdup_printf("Disable the display device %s (%s)?", display->logName, display->typeIdName); } gtk_label_set_text (GTK_LABEL(ctk_object->txt_display_disable), str); g_free(str); gtk_button_set_label(GTK_BUTTON(ctk_object->btn_display_disable_off), "Disable"); gtk_button_set_label(GTK_BUTTON(ctk_object->btn_display_disable_cancel), "Cancel"); /* Confirm with user before disabling */ if (do_query_remove_display(ctk_object, display)) { gboolean screen_disabled = (display->screen->num_displays == 1) ? TRUE : FALSE; ctk_display_layout_disable_display(CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), display); /* If the display was the last one on the X screen, make note that we * can't actually remove the X screen without a restart. */ if (screen_disabled) { ctk_object->apply_possible = FALSE; } } } /* do_disable_display() */ static Bool display_build_modepool(nvDisplayPtr display, Bool *updated) { if (!display->modelines) { char *tokens = NULL; gchar *err_str = NULL; NvCtrlStringOperation(display->handle, 0, NV_CTRL_STRING_OPERATION_BUILD_MODEPOOL, "", &tokens); XFree(tokens); *updated = TRUE; if (!display_add_modelines_from_server(display, display->gpu, &err_str)) { nv_warning_msg("%s", err_str); g_free(err_str); return FALSE; } } return display->modelines ? TRUE : FALSE; } static void do_enable_mosaic(CtkDisplayConfig *ctk_object) { nvLayoutPtr layout = ctk_object->layout; nvGpuPtr gpu; nvScreenPtr mosaic_screen; /* Pick first X screen as mosaic X screen */ mosaic_screen = layout->screens; /* Consolidate all GPUs */ for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { if (!screen_has_gpu(mosaic_screen, gpu)) { link_screen_to_gpu(mosaic_screen, gpu); } gpu->mosaic_enabled = TRUE; } /* Consolidate all enabled displays */ for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { nvDisplayPtr display; for (display = gpu->displays; display; display = display->next_on_gpu) { if (display->screen && display->screen != mosaic_screen) { do_configure_display_on_xscreen(ctk_object, display, mosaic_screen); } } } } static void do_disable_mosaic(CtkDisplayConfig *ctk_object) { nvLayoutPtr layout = ctk_object->layout; nvGpuPtr gpu; nvScreenPtr mosaic_screen; /* Track the original Mosaic X screen */ mosaic_screen = layout->screens; /* Disable Mosaic on all GPUs, and move the enabled displays that are not * on the display owner GPU to their own X screen */ for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { gpu->mosaic_enabled = FALSE; if (gpu != mosaic_screen->display_owner_gpu) { nvDisplayPtr display; for (display = gpu->displays; display; display = display->next_on_gpu) { if (!display->screen) { continue; } do_configure_display_on_new_xscreen(ctk_object, display); } } } /* Re-link the original screen to the GPU (unlinks all other gpus from the * screen.) */ mosaic_screen->num_gpus = 0; link_screen_to_gpu(mosaic_screen, mosaic_screen->display_owner_gpu); } static void mosaic_state_toggled(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); gboolean enabled; enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); /* Can't dynamically toggle Mosaic */ ctk_object->apply_possible = FALSE; if (enabled) { do_enable_mosaic(ctk_object); } else { do_disable_mosaic(ctk_object); } /* Update the GUI */ ctk_display_layout_update_zorder(CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); ctk_display_layout_update(CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); update_gui(ctk_object); user_changed_attributes(ctk_object); } /** display_config_changed() ***************************************** * * Called when user selects an option in the display configuration menu. * **/ static void display_config_changed(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); nvLayoutPtr layout = ctk_object->layout; nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); gboolean update = FALSE; nvScreenPtr screen; gint table_idx; DisplayConfigOption *option; if (!display) { return; } table_idx = gtk_option_menu_get_history(GTK_OPTION_MENU(ctk_object->mnu_display_config)); option = &(ctk_object->display_config_table[table_idx]); switch (option->config) { case DPY_CFG_DISABLED: if (display->screen) { do_disable_display(ctk_object, display); update = TRUE; } break; case DPY_CFG_NEW_X_SCREEN: if (!display_build_modepool(display, &update)) { return; } if (!display->screen) { do_enable_display_on_new_xscreen(ctk_object, display); } else { do_configure_display_on_new_xscreen(ctk_object, display); } update = TRUE; break; case DPY_CFG_X_SCREEN: if (display->screen == option->screen) { return; } if (!display_build_modepool(display, &update)) { return; } if (!display->screen) { do_enable_display_on_xscreen(ctk_object, display, option->screen); } else { do_configure_display_on_xscreen(ctk_object, display, option->screen); } update = TRUE; break; } /* Sync the GUI */ if (update) { /* Update the z-order */ ctk_display_layout_update_zorder(CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* Recalculate */ ctk_display_layout_update(CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* Auto fix all screens on the gpu */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { if (!screen_has_gpu(screen, display->gpu)) { continue; } validation_auto_fix_screen(ctk_object, screen); } /* Final update */ ctk_display_layout_update(CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); update_gui(ctk_object); user_changed_attributes(ctk_object); } } /* display_config_changed() */ /** display_refresh_changed() **************************************** * * Called when user selects a new refresh rate for a display. * **/ static void display_refresh_changed(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); gint idx; nvModeLinePtr modeline; nvDisplayPtr display; /* Get the modeline and display to set */ idx = gtk_option_menu_get_history(GTK_OPTION_MENU(widget)); modeline = ctk_object->refresh_table[idx]; display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* In Basic view, we assume the user most likely wants * to change which metamode is being used. */ if (!ctk_object->advanced_mode && (display->screen->num_displays == 1)) { int metamode_idx = display_find_closest_mode_matching_modeline(display, modeline); /* Select the new metamode */ if (metamode_idx >= 0) { ctk_display_layout_set_screen_metamode (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), display->screen, metamode_idx); } } /* Update the display's currently selected mode */ ctk_display_layout_set_mode_modeline (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), display->cur_mode, modeline, &display->cur_mode->viewPortIn, &display->cur_mode->viewPortOut); /* Update the modename */ setup_display_modename(ctk_object); user_changed_attributes(ctk_object); } /* display_refresh_changed() */ /** display_resolution_changed() ************************************* * * Called when user selects a new resolution for a display device. * **/ static void display_resolution_changed(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); gint idx; gint last_idx; nvSelectedModePtr selected_mode; nvDisplayPtr display; /* Get the modeline and display to set */ idx = gtk_option_menu_get_history(GTK_OPTION_MENU(widget)); selected_mode = ctk_object->resolution_table[idx]; display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* cache the selected index */ last_idx = ctk_object->last_resolution_idx; ctk_object->last_resolution_idx = idx; /* Ignore selecting same resolution */ if (idx == last_idx) { return; } /* In Basic view, we assume the user most likely wants * to change which metamode is being used. */ if (!ctk_object->advanced_mode && (display->screen->num_displays == 1)) { int metamode_idx = display_find_closest_mode_matching_modeline(display, selected_mode->modeline); /* Select the new metamode */ if (metamode_idx >= 0) { ctk_display_layout_set_screen_metamode (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), display->screen, metamode_idx); } } /* Select the new modeline for its resolution */ if (selected_mode->isScaled) { ctk_display_layout_set_mode_modeline (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), display->cur_mode, selected_mode->modeline, &selected_mode->viewPortIn, &selected_mode->viewPortOut); } else { ctk_display_layout_set_mode_modeline (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), display->cur_mode, selected_mode->modeline, NULL /* viewPortIn */, NULL /* viewPortOut */); } /* Update the UI */ setup_display_page(ctk_object); user_changed_attributes(ctk_object); } /* display_resolution_changed() */ /** display_stereo_changed() ***************************** * * Called when user selects a new passive stereo eye * configuration. * **/ static void display_stereo_changed(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); nvDisplayPtr display; nvModePtr mode; gint idx; /* Update the current mode on the selected display */ display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (display && display->cur_mode) { mode = display->cur_mode; idx = gtk_option_menu_get_history(GTK_OPTION_MENU(widget)); switch (idx) { case 1: mode->passive_stereo_eye = PASSIVE_STEREO_EYE_LEFT; break; case 2: mode->passive_stereo_eye = PASSIVE_STEREO_EYE_RIGHT; break; default: case 0: mode->passive_stereo_eye = PASSIVE_STEREO_EYE_NONE; break; } } user_changed_attributes(ctk_object); } /* display_stereo_changed() */ /** display_rotation_changed() *************************************** * * Called when user selects a new rotation orientation. * **/ static void display_rotation_changed(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); nvDisplayPtr display; gint idx; Rotation rotation; /* Update the current mode on the selected display */ display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!display || !display->cur_mode || !display->cur_mode->modeline) { return; } idx = gtk_option_menu_get_history(GTK_OPTION_MENU(widget)); switch (idx) { case 1: rotation = ROTATION_90; break; case 2: rotation = ROTATION_180; break; case 3: rotation = ROTATION_270; break; default: case 0: rotation = ROTATION_0; break; } ctk_display_layout_set_display_rotation (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), display, rotation); } /* display_rotation_changed() */ /** display_reflection_changed() ************************************* * * Called when user selects a new reflection axis. * **/ static void display_reflection_changed(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); nvDisplayPtr display; gint idx; Reflection reflection; /* Update the current mode on the selected display */ display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!display || !display->cur_mode || !display->cur_mode->modeline) { return; } idx = gtk_option_menu_get_history(GTK_OPTION_MENU(widget)); switch (idx) { case 1: reflection = REFLECTION_X; break; case 2: reflection = REFLECTION_Y; break; case 3: reflection = REFLECTION_XY; break; default: case 0: reflection = REFLECTION_NONE; break; } ctk_display_layout_set_display_reflection (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), display, reflection); } /* display_reflection_changed() */ /** post_display_underscan_value_changed() **************************** * * Modifies the ViewPortOut of the current mode according to the value * of the Underscan slider. * **/ static void post_display_underscan_value_changed(CtkDisplayConfig *ctk_object, const int hpixel_value) { CtkDisplayLayout *ctk_display; nvDisplayPtr display; nvModePtr cur_mode; nvSize raster_size; GdkRectangle rotatedViewPortIn; ctk_display = CTK_DISPLAY_LAYOUT(ctk_object->obj_layout); display = ctk_display_layout_get_selected_display(ctk_display); cur_mode = display->cur_mode; if (!cur_mode || !cur_mode->modeline) { return; } raster_size.height = cur_mode->modeline->data.vdisplay; raster_size.width = cur_mode->modeline->data.hdisplay; /* Update ViewPortOut, ViewPortIn and panning. Erase previous data */ apply_underscan_to_viewportout(raster_size, hpixel_value, &cur_mode->viewPortOut); if (cur_mode->rotation == ROTATION_90 || cur_mode->rotation == ROTATION_270) { rotatedViewPortIn.width = cur_mode->viewPortOut.height; rotatedViewPortIn.height = cur_mode->viewPortOut.width; } else { rotatedViewPortIn.width = cur_mode->viewPortOut.width; rotatedViewPortIn.height = cur_mode->viewPortOut.height; } ctk_display_layout_set_mode_viewport_in(ctk_display, cur_mode, rotatedViewPortIn.width, rotatedViewPortIn.height, TRUE /* update_panning_size */); /* Enable the apply button */ gtk_widget_set_sensitive(ctk_object->btn_apply, TRUE); } /** display_underscan_value_changed() ********************************* * * Called when user modifies the value of the Underscan slider. * **/ static void display_underscan_value_changed(GtkAdjustment *adjustment, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); nvDisplayPtr display; nvModePtr cur_mode; int hpixel_value; gfloat value; gchar *txt_entry; display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!display) { return; } cur_mode = display->cur_mode; if (!cur_mode || !cur_mode->modeline) { return; } value = (gfloat) gtk_adjustment_get_value(adjustment); hpixel_value = cur_mode->modeline->data.hdisplay * (value / 100); txt_entry = g_strdup_printf("%d", hpixel_value); gtk_entry_set_text(GTK_ENTRY(ctk_object->txt_display_underscan), txt_entry); g_free(txt_entry); post_display_underscan_value_changed(ctk_object, hpixel_value); } /** display_underscan_activate() ************************************** * * Called when user modifies the display Underscan text entry. * * This then calls display_underscan_value_changed() by * modifying the value of the Underscan slider. * **/ static void display_underscan_activate(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); const gchar *txt_entry = gtk_entry_get_text(GTK_ENTRY(widget)); nvDisplayPtr display; nvModePtr cur_mode; int hdisplay, hpixel_value; gfloat adj_value; display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!display) { return; } cur_mode = display->cur_mode; if (!cur_mode || !cur_mode->modeline) { return; } parse_read_integer(txt_entry, &hpixel_value); hdisplay = cur_mode->modeline->data.hdisplay; adj_value = ((gfloat) hpixel_value / hdisplay) * 100; /* Sanitize adjustment value */ adj_value = NV_MIN(adj_value, UNDERSCAN_MAX_PERCENT); adj_value = NV_MAX(adj_value, UNDERSCAN_MIN_PERCENT); /* This sends a value_changed signal to the adjustment object */ gtk_adjustment_set_value(GTK_ADJUSTMENT(ctk_object->adj_display_underscan), adj_value); } /** display_position_type_changed() ********************************** * * Called when user selects a new display position method (relative/ * absolute) * **/ static void display_position_type_changed(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); nvDisplayPtr display; gint position_idx; int position_type; gint relative_to_idx; nvDisplayPtr relative_to; display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* Get the new position type */ position_idx = gtk_option_menu_get_history (GTK_OPTION_MENU(ctk_object->mnu_display_position_type)); position_type = __position_table[position_idx]; relative_to_idx = gtk_option_menu_get_history (GTK_OPTION_MENU(ctk_object->mnu_display_position_relative)); if (relative_to_idx >= 0 && relative_to_idx < ctk_object->display_position_table_len) { relative_to = ctk_object->display_position_table[relative_to_idx]; /* Update the layout */ ctk_display_layout_set_display_position (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), display, position_type, relative_to, display->cur_mode->pan.x, display->cur_mode->pan.y); } /* Cannot apply if the screen position changed */ check_screen_pos_changed(ctk_object); /* Update GUI */ setup_display_position_relative(ctk_object); setup_display_position_offset(ctk_object); user_changed_attributes(ctk_object); } /* display_position_type_changed() */ /** display_position_relative_changed() ****************************** * * Called when user selects a new display to be positioned relative * to. * **/ static void display_position_relative_changed(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); nvDisplayPtr display; gint position_idx; gint relative_to_idx; int position_type; nvDisplayPtr relative_to; display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); /* Get the new display to be relative to */ position_idx = gtk_option_menu_get_history (GTK_OPTION_MENU(ctk_object->mnu_display_position_type)); position_type = __position_table[position_idx]; relative_to_idx = gtk_option_menu_get_history (GTK_OPTION_MENU(ctk_object->mnu_display_position_relative)); if (relative_to_idx >= 0 && relative_to_idx < ctk_object->display_position_table_len) { relative_to = ctk_object->display_position_table[relative_to_idx]; /* Update the relative position */ ctk_display_layout_set_display_position (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), display, position_type, relative_to, 0, 0); } /* Cannot apply if we change the relative position */ check_screen_pos_changed(ctk_object); /* Update the GUI */ setup_display_position_offset(ctk_object); user_changed_attributes(ctk_object); } /* display_position_relative_changed() */ /** display_position_offset_activate() ******************************* * * Called when user modifies the display position offset text entry. * **/ static void display_position_offset_activate(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); const gchar *str = gtk_entry_get_text(GTK_ENTRY(widget)); int x, y; nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!display) return; /* Parse user input */ str = parse_read_integer_pair(str, 0, &x, &y); if (!str) { /* Reset the display position */ setup_display_position_offset(ctk_object); return; } /* Make coordinates relative to top left of Screen */ x += display->cur_mode->metamode->edim.x; y += display->cur_mode->metamode->edim.y; /* Update the absolute position */ ctk_display_layout_set_display_position (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), display, CONF_ADJ_ABSOLUTE, NULL, x, y); user_changed_attributes(ctk_object); } /* display_position_offset_activate() */ /** display_viewport_in_activate() *********************************** * * Called when user modifies the display ViewPortIn text entry. * **/ static void display_viewport_in_activate(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); const gchar *str = gtk_entry_get_text(GTK_ENTRY(widget)); int w, h; nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!display || !display->cur_mode) { return; } str = parse_read_integer_pair(str, 'x', &w, &h); if (!str) { /* Reset the mode's ViewPortIn */ setup_display_viewport_in(ctk_object); return; } ctk_display_layout_set_mode_viewport_in (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), display->cur_mode, w, h, FALSE /* update_panning_size */); } /* display_viewport_in_activate() */ /** display_viewport_out_activate() ********************************** * * Called when user modifies the display ViewPortOut text entry. * **/ static void display_viewport_out_activate(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); const gchar *str = gtk_entry_get_text(GTK_ENTRY(widget)); int w, h, x, y; nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!display || !display->cur_mode) { return; } str = parse_read_integer_pair(str, 'x', &w, &h); if (!str) { /* Reset the mode's ViewPortOut */ setup_display_viewport_out(ctk_object); return; } str = parse_read_integer_pair(str, 0, &x, &y); if (!str) { /* Reset the mode's ViewPortOut */ setup_display_viewport_out(ctk_object); return; } ctk_display_layout_set_mode_viewport_out (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), display->cur_mode, x, y, w, h); } /* display_viewport_out_activate() */ /** display_panning_activate() *************************************** * * Called when user modifies the display position text entry. * **/ static void display_panning_activate(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); const gchar *str = gtk_entry_get_text(GTK_ENTRY(widget)); int x, y; nvDisplayPtr display = ctk_display_layout_get_selected_display (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!display) { return; } str = parse_read_integer_pair(str, 'x', &x, &y); if (!str) { /* Reset the display panning */ setup_display_panning(ctk_object); return; } ctk_display_layout_set_display_panning (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), display, x, y); } /* display_panning_activate() */ /** screen_virtual_size_activate() *********************************** * * Called when user modifies the screen virtual size text entry. * **/ static void screen_virtual_size_activate(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); const gchar *str = gtk_entry_get_text(GTK_ENTRY(widget)); int x, y; nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!screen || !screen->no_scanout) { return; } str = parse_read_integer_pair(str, 'x', &x, &y); if (!str) { /* Reset the display panning */ setup_screen_virtual_size(ctk_object); return; } ctk_display_layout_set_screen_virtual_size (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, x, y); setup_screen_virtual_size(ctk_object); } /* screen_virtual_size_activate() */ /** txt_focus_out() ************************************************** * * Called when user leaves a txt entry * **/ static gboolean txt_focus_out(GtkWidget *widget, GdkEvent *event, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); if (widget == ctk_object->txt_display_viewport_in) { display_viewport_in_activate(widget, user_data); } else if (widget == ctk_object->txt_display_viewport_out) { display_viewport_out_activate(widget, user_data); } else if (widget == ctk_object->txt_display_panning) { display_panning_activate(widget, user_data); } else if (widget == ctk_object->txt_screen_virtual_size) { screen_virtual_size_activate(widget, user_data); } return FALSE; } /* txt_focus_out() */ /** screen_depth_changed() ******************************************* * * Called when user selects a new color depth for a screen. * **/ static void screen_depth_changed(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); gint idx = gtk_option_menu_get_history(GTK_OPTION_MENU(widget)); int depth; nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!screen) return; if (idx >= ctk_object->screen_depth_table_len) return; depth = ctk_object->screen_depth_table[idx]; if (depth == 30) { GtkWidget *dlg; GtkWidget *parent = ctk_get_parent_window(GTK_WIDGET(ctk_object)); dlg = gtk_message_dialog_new (GTK_WINDOW(parent), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Note that Depth 30 requires recent X " "server updates for correct operation. " "Also, some X applications may not work " "correctly with depth 30.\n\n" "Please see the Chapter \"Configuring " "Depth 30 Displays\" " "in the README for details."); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy (dlg); } ctk_display_layout_set_screen_depth (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, depth); /* Update default screen depth in SMF using libscf functions */ update_scf_depth(depth); consolidate_xinerama(ctk_object, screen); /* Can't apply screen depth changes */ ctk_object->apply_possible = FALSE; user_changed_attributes(ctk_object); } /* screen_depth_changed() */ /** screen_stereo_changed() ****************************************** * * Called when user selects a new stereo mode for a screen. * **/ static void screen_stereo_changed(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); gint idx = gtk_option_menu_get_history(GTK_OPTION_MENU(widget)); nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!screen) return; screen->stereo = idx; /* Can't apply screen stereo changes */ ctk_object->apply_possible = FALSE; user_changed_attributes(ctk_object); /* Changing this can modify how the display page looks */ setup_display_page(ctk_object); } /* screen_stereo_changed() */ /** screen_position_type_changed() *********************************** * * Called when user selects a new screen position method (relative/ * absolute) * **/ static void screen_position_type_changed(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); gint position_idx; int position_type; gint relative_to_idx; nvScreenPtr relative_to; if (!screen) return; /* Get the new position type */ position_idx = gtk_option_menu_get_history (GTK_OPTION_MENU(ctk_object->mnu_screen_position_type)); position_type = __position_table[position_idx]; relative_to_idx = gtk_option_menu_get_history (GTK_OPTION_MENU(ctk_object->mnu_screen_position_relative)); if (relative_to_idx >= 0 && relative_to_idx < ctk_object->screen_position_table_len) { relative_to = ctk_object->screen_position_table[relative_to_idx]; /* Update the layout */ ctk_display_layout_set_screen_position (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, position_type, relative_to, screen->dim.x, screen->dim.y); } /* Cannot apply changes to screen positioning */ ctk_object->apply_possible = FALSE; /* Update the GUI */ setup_screen_position_relative(ctk_object); setup_screen_position_offset(ctk_object); user_changed_attributes(ctk_object); } /* screen_position_type_changed() */ /** screen_position_relative_changed() ******************************* * * Called when user selects a new screen to be positioned relative * to. * **/ static void screen_position_relative_changed(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); gint position_idx; gint relative_to_idx; int position_type; nvScreenPtr relative_to; if (!screen) return; /* Get the new X screen to be relative to */ position_idx = gtk_option_menu_get_history (GTK_OPTION_MENU(ctk_object->mnu_screen_position_type)); position_type = __position_table[position_idx]; relative_to_idx = gtk_option_menu_get_history (GTK_OPTION_MENU(ctk_object->mnu_screen_position_relative)); if (relative_to_idx >= 0 && relative_to_idx < ctk_object->screen_position_table_len) { relative_to = ctk_object->screen_position_table[relative_to_idx]; /* Update the relative position */ ctk_display_layout_set_screen_position (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, position_type, relative_to, 0, 0); } /* Cannot apply changes to screen positioning */ ctk_object->apply_possible = FALSE; /* Update the GUI */ setup_screen_position_offset(ctk_object); user_changed_attributes(ctk_object); } /* screen_position_relative_changed() */ /** screen_position_offset_activate() ******************************** * * Called when user modifies the screen position offset text entry. * **/ static void screen_position_offset_activate(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); const gchar *str = gtk_entry_get_text(GTK_ENTRY(widget)); int x, y; nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!screen) return; /* Parse user input */ str = parse_read_integer_pair(str, 0, &x, &y); if (!str) { /* Reset the display position */ setup_screen_position_offset(ctk_object); return; } /* Cannot apply changes to screen positioning */ ctk_object->apply_possible = FALSE; /* Update the absolute position */ ctk_display_layout_set_screen_position (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, screen->position_type, screen->relative_to, x, y); user_changed_attributes(ctk_object); } /* screen_position_offset_activate() */ /** screen_metamode_clicked() **************************************** * * Called when user selects a new metamode for the selected screen * **/ static void screen_metamode_clicked(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); GtkWidget *menu; GtkWidget *menu_item; int i; gchar *str; gchar *tmp; nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!screen) return; /* Generate the popup menu */ menu = gtk_menu_new(); for (i = 0; i < screen->num_metamodes; i++) { /* Setup the menu item text */ tmp = screen_get_metamode_str(screen, i, 0); str = g_strdup_printf("%d - \"%s\"", i+1, tmp); menu_item = gtk_menu_item_new_with_label(str); g_free(str); g_free(tmp); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(screen_metamode_activate), (gpointer) ctk_object); } /* Show the popup menu */ gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 1, gtk_get_current_event_time()); } /* screen_metamode_clicked() */ /** screen_metamode_activate() *************************************** * * Called when user selects a new metamode for the selected screen * **/ static void screen_metamode_activate(GtkWidget *widget, gpointer user_data) { GtkMenuItem *item = (GtkMenuItem *) widget; CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); const gchar *str = gtk_label_get_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(item)))); int idx; gchar *name; if (!screen || !str) return; idx = atoi(str) -1; name = g_strdup_printf("%d - ...", idx+1); gtk_button_set_label(GTK_BUTTON(ctk_object->btn_screen_metamode), name); g_free(name); ctk_display_layout_set_screen_metamode (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, idx); /* Sync the display frame */ setup_display_page(ctk_object); user_changed_attributes(ctk_object); } /* screen_metamode_activate() */ /** screen_metamode_add_clicked() ************************************ * * Called when user clicks on the display's "Add" metamode button. * **/ static void screen_metamode_add_clicked(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!screen) return; /* Add a new metamode to the screen */ ctk_display_layout_add_screen_metamode (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen); /* Update the GUI */ setup_display_page(ctk_object); setup_screen_page(ctk_object); user_changed_attributes(ctk_object); } /* screen_metamode_add_clicked() */ /** screen_metamode_delete_clicked() ********************************* * * Called when user clicks on the display's "Delete" metamode button. * **/ static void screen_metamode_delete_clicked(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); nvScreenPtr screen = ctk_display_layout_get_selected_screen (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout)); if (!screen) return; ctk_display_layout_delete_screen_metamode (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, screen->cur_metamode_idx, TRUE); /* Update the GUI */ setup_display_page(ctk_object); setup_screen_page(ctk_object); user_changed_attributes(ctk_object); } /* screen_metamode_delete_clicked() */ /** xinerama_state_toggled() ***************************************** * * Called when user toggles the state of the "Enable Xinerama" * button. * **/ static void xinerama_state_toggled(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); ctk_object->layout->xinerama_enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); /* Can't dynamically enable Xinerama */ ctk_object->apply_possible = FALSE; /* Make sure all screens have the same depth when Xinerama is enabled */ consolidate_xinerama(ctk_object, NULL); setup_screen_page(ctk_object); user_changed_attributes(ctk_object); } /* xinerama_state_toggled() */ /** update_display_confirm_text() ************************************ * * Generates the text used in the confirmation dialog. * **/ static void update_display_confirm_text(CtkDisplayConfig *ctk_object, int screen) { gchar *str; str = g_strdup_printf("The mode on X screen %d has been set.\n" "Would you like to keep the current settings?\n\n" "Reverting in %d seconds...", screen, ctk_object->display_confirm_countdown); gtk_label_set_text(GTK_LABEL(ctk_object->txt_display_confirm), str); g_free(str); } /* update_display_confirm_text() */ /** do_display_confirm_countdown() *********************************** * * timeout callback for reverting a modeline setting. * **/ static gboolean do_display_confirm_countdown(gpointer data) { SwitchModeCallbackInfo *info = (SwitchModeCallbackInfo *) data; CtkDisplayConfig *ctk_object = info->ctk_object; int screen = info->screen; ctk_object->display_confirm_countdown--; if (ctk_object->display_confirm_countdown > 0) { update_display_confirm_text(ctk_object, screen); return True; } /* Force dialog to cancel */ gtk_dialog_response(GTK_DIALOG(ctk_object->dlg_display_confirm), GTK_RESPONSE_REJECT); return False; } /* do_display_confirm_countdown() */ /** switch_to_current_metamode() ************************************* * * Switches to the current screen metamode using NV_CTRL_CURRENT_METAMODE_ID * **/ static Bool switch_to_current_metamode(CtkDisplayConfig *ctk_object, nvScreenPtr screen, const char *cur_metamode_str) { ReturnStatus ret; gint result; nvMetaModePtr metamode; int new_width; int new_height; int new_rate; int old_rate; static SwitchModeCallbackInfo info; GtkWidget *dlg; GtkWidget *parent; gchar *msg; Bool modified_current_metamode; if (!screen->handle || !screen->cur_metamode) goto fail; metamode = screen->cur_metamode; new_width = metamode->edim.width; new_height = metamode->edim.height; new_rate = metamode->id; /* Find the parent window for displaying dialogs */ parent = ctk_get_parent_window(GTK_WIDGET(ctk_object)); if (!parent) goto fail; /* Get the current mode so we can fall back on that if the * mode switch fails, or the user does not confirm. */ ret = NvCtrlGetAttribute(screen->handle, NV_CTRL_CURRENT_METAMODE_ID, (int *)&old_rate); if (ret != NvCtrlSuccess) { nv_warning_msg("Failed to get current (fallback) mode for " "display device!"); goto fail; } nv_info_msg(TAB, "Current mode (id: %d)", old_rate); nv_info_msg(TAB, "Current mode string: %s", cur_metamode_str); /* Switch to the new mode */ if (new_rate > 0 ) { nv_info_msg(TAB, "Switching to mode: %dx%d (id: %d)...", new_width, new_height, new_rate); ret = NvCtrlSetAttribute(screen->handle, NV_CTRL_CURRENT_METAMODE_ID, new_rate); modified_current_metamode = FALSE; } else { nv_info_msg(TAB, "Modifying current MetaMode to: %s...", metamode->cpl_str); ret = NvCtrlSetStringAttribute(screen->handle, NV_CTRL_STRING_CURRENT_METAMODE, metamode->cpl_str, NULL); if (ret == NvCtrlSuccess) { metamode->id = old_rate; } modified_current_metamode = TRUE; } if (ret != NvCtrlSuccess) { nv_warning_msg("Failed to set MetaMode (%d) '%s' " "(Mode: %dx%d, id: %d) on X screen %d!", screen->cur_metamode_idx+1, metamode->cpl_str, new_width, new_height, new_rate, NvCtrlGetTargetId(screen->handle)); if (screen->num_metamodes > 1) { msg = g_strdup_printf("Failed to set MetaMode (%d) '%s' " "(Mode %dx%d, id: %d) on X screen %d\n\n" "Would you like to remove this MetaMode?", screen->cur_metamode_idx+1, metamode->cpl_str, new_width, new_height, new_rate, NvCtrlGetTargetId(screen->handle)); dlg = gtk_message_dialog_new (GTK_WINDOW(parent), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO, "%s", msg); } else { msg = g_strdup_printf("Failed to set MetaMode (%d) '%s' " "(Mode %dx%d, id: %d) on X screen %d.", screen->cur_metamode_idx+1, metamode->cpl_str, new_width, new_height, new_rate, NvCtrlGetTargetId(screen->handle)); dlg = gtk_message_dialog_new (GTK_WINDOW(parent), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "%s", msg); } result = gtk_dialog_run(GTK_DIALOG(dlg)); switch (result) { case GTK_RESPONSE_YES: ctk_display_layout_delete_screen_metamode (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, screen->cur_metamode_idx, TRUE); nv_info_msg(TAB, "Removed MetaMode %d on Screen %d.\n", screen->cur_metamode_idx+1, NvCtrlGetTargetId(screen)); /* Update the GUI */ setup_display_page(ctk_object); setup_screen_page(ctk_object); break; case GTK_RESPONSE_OK: /* Nothing to do with last metamode */ default: /* Ignore the bad metamode */ break; } g_free(msg); gtk_widget_destroy(dlg); goto fail; } /* Setup the counter callback data */ info.ctk_object = ctk_object; info.screen = NvCtrlGetTargetId(screen->handle); /* Start the countdown timer */ ctk_object->display_confirm_countdown = DEFAULT_SWITCH_MODE_TIMEOUT; update_display_confirm_text(ctk_object, info.screen); ctk_object->display_confirm_timer = g_timeout_add(1000, (GSourceFunc)do_display_confirm_countdown, (gpointer)(&info)); /* Show the confirm dialog */ gtk_window_set_transient_for (GTK_WINDOW(ctk_object->dlg_display_confirm), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(ctk_object)))); gtk_widget_show_all(ctk_object->dlg_display_confirm); gtk_widget_grab_focus(ctk_object->btn_display_apply_cancel); result = gtk_dialog_run(GTK_DIALOG(ctk_object->dlg_display_confirm)); gtk_widget_hide(ctk_object->dlg_display_confirm); /* Kill the timer */ g_source_remove(ctk_object->display_confirm_timer); switch (result) { case GTK_RESPONSE_ACCEPT: break; case GTK_RESPONSE_REJECT: default: /* Fall back to previous settings */ if (!modified_current_metamode) { nv_info_msg(TAB, "Switching back to mode (id: %d)...", old_rate); ret = NvCtrlSetAttribute(screen->handle, NV_CTRL_CURRENT_METAMODE_ID, old_rate); } else { nv_info_msg(TAB, "Re-writing previous current MetaMode to: %s...", cur_metamode_str); ret = NvCtrlSetStringAttribute(screen->handle, NV_CTRL_STRING_CURRENT_METAMODE, cur_metamode_str, NULL); if (ret != NvCtrlSuccess) { nv_warning_msg("Failed to re-write current MetaMode (%d) to " "'%s' on X screen %d!", old_rate, cur_metamode_str, NvCtrlGetTargetId(screen->handle)); } } goto fail; } return TRUE; fail: return FALSE; } /* switch_to_current_metamode() */ /** link_metamode_string_by_id() ************************************* * * Looks in the list of strings (metamode_strs) for a metamode with * the given id (defined by string 'id_str'). If found, sets the metamode * id and x_id appropriately. * **/ static void link_metamode_string_by_id(char *metamode_strs, int match_id, nvMetaModePtr metamode) { int x_idx = 0; char *m; for (m = metamode_strs; m && strlen(m); m += strlen(m) +1) { char *str = strstr(m, "id="); if (str) { int id = atoi(str+3); if (id && (id == match_id)) { metamode->id = id; metamode->x_idx = x_idx; metamode->x_str_entry = m; return; } } x_idx++; } } /** add_cpl_metamode_to_X() ****************************************** * * Adds the given metamode to the given X screen. * **/ static Bool add_cpl_metamode_to_X(nvScreenPtr screen, nvMetaModePtr metamode, int metamode_idx) { ReturnStatus ret; char *tokens; ret = NvCtrlStringOperation(screen->handle, 0, NV_CTRL_STRING_OPERATION_ADD_METAMODE, metamode->cpl_str, &tokens); /* Grab the metamode ID from the returned tokens */ if ((ret != NvCtrlSuccess) || !tokens) { nv_error_msg("Failed to add MetaMode '%s' to X for " "screen %d", metamode->cpl_str, screen->scrnum); return FALSE; } parse_token_value_pairs(tokens, apply_metamode_token, metamode); XFree(tokens); metamode->x_idx = metamode_idx; nv_info_msg(TAB, "Added MetaMode (# %d, ID: %d) > [%s]", metamode_idx, metamode->id, metamode->cpl_str); return TRUE; } /** stub_metamode_str() ********************************************** * * Stubs out a metamode string. * **/ static void stub_metamode_str(char *str) { if (str) { while (*str) { *str = ' '; str++; } } } /** setup_metamodes_for_apply() ************************************** * * Prepares the list of CPL metamodes to be applied to the X server. * **/ static void setup_metamodes_for_apply(nvScreenPtr screen, char *metamode_strs) { nvMetaModePtr metamode; ReturnStatus ret; char *tmp; int metamode_idx; for (metamode = screen->metamodes, metamode_idx = 0; metamode; metamode = metamode->next, metamode_idx++) { metamode->id = -1; metamode->x_idx = -1; /* Get metamode string from CPL */ metamode->cpl_str = screen_get_metamode_str(screen, metamode_idx, 1); if (!metamode->cpl_str) { continue; } /* Parse CPL string into X metamode string */ ret = NvCtrlStringOperation(screen->handle, 0, NV_CTRL_STRING_OPERATION_PARSE_METAMODE, metamode->cpl_str, &metamode->x_str); if ((ret != NvCtrlSuccess) || !metamode->x_str) { continue; } /* Identify metamode id and position in X */ tmp = strstr(metamode->x_str, "id="); if (tmp) { int id = atoi(tmp+3); link_metamode_string_by_id(metamode_strs, id, metamode); } } } /** cleanup_metamodes_for_apply() ************************************ * * Releases memory used for applying metamodes to X. * **/ static void cleanup_metamodes_for_apply(nvScreenPtr screen) { nvMetaModePtr metamode; for (metamode = screen->metamodes; metamode; metamode = metamode->next) { cleanup_metamode(metamode); } } /** remove_duplicate_cpl_metamodes() ********************************* * * Removes duplicate metamodes in the CPL * **/ static void remove_duplicate_cpl_metamodes(CtkDisplayConfig *ctk_object, nvScreenPtr screen) { nvMetaModePtr m1; nvMetaModePtr m2; int m1_idx; int m1_old_idx; int m2_idx; m1 = screen->metamodes; m1_idx = 0; m1_old_idx = 0; while (m1) { Bool found = FALSE; if (!m1->x_str) { m1 = m1->next; m1_idx++; m1_old_idx++; continue; } for (m2 = screen->metamodes, m2_idx = 0; m2 != m1; m2 = m2->next, m2_idx++) { if (!m2->x_str) { continue; } if (strcmp(m1->x_str, m2->x_str)) { continue; } /* m1 and m2 are the same, delete m1 (since it comes after) */ if (m1 == screen->cur_metamode) { ctk_display_layout_set_screen_metamode (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, m2_idx); } m1 = m1->next; ctk_display_layout_delete_screen_metamode (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, m1_idx, FALSE); nv_info_msg(TAB, "Removed MetaMode %d on Screen %d (is " "duplicate of MetaMode %d)\n", m1_old_idx+1, screen->scrnum, m2_idx+1); found = TRUE; break; } if (!found) { m1 = m1->next; m1_idx++; } m1_old_idx++; } } /** preprocess_metamodes() ******************************************* * * Does preprocess work to the metamode strings: * * - Generates the metamode strings for the screen's metamodes * that will be used for creating the metamode list on the X * Server. * * - Stubs out each string in the metamode_strs list that should * not be deleted (it has a matching metamode in "screen".) * * - Adds new metamodes to the X server screen that are specified * in "screen" but not found in metamode_strs. * **/ static void preprocess_metamodes(CtkDisplayConfig *ctk_object, nvScreenPtr screen, char *x_metamode_strs, char *cur_x_metamode_str, int num_x_metamodes, int cur_x_metamode_idx) { nvMetaModePtr metamode; Bool cur_x_metamode_matched = FALSE; /* Generate metamode strings and match CPL metamodes to X */ setup_metamodes_for_apply(screen, x_metamode_strs); /* Remove duplicate metamodes in CPL based on parsed string */ remove_duplicate_cpl_metamodes(ctk_object, screen); /* Add metamodes from the CPL that aren't in X */ for (metamode = screen->metamodes; metamode; metamode = metamode->next) { /* CPL metamode was found in X, stub out the string entry in the X * metamodes list so we don't delete it later. */ if (metamode->x_str_entry) { stub_metamode_str(metamode->x_str_entry); /* Track if the current X metamode matched a CPL metamode */ if (metamode->x_str_entry == cur_x_metamode_str) { cur_x_metamode_matched = TRUE; } continue; } /* CPL metamode was not found in X, so we should add it. */ /* Don't add the current metamode (yet). If the current X metamode * string does not get stubbed out (i.e. it does not match to another * CPL metamode), then it can be modify via * NV_CTRL_STRING_CURRENT_METAMODE instead of adding a new metamode, * switching to it and deleting the old one. */ if (metamode == screen->cur_metamode) { continue; } if (add_cpl_metamode_to_X(screen, metamode, num_x_metamodes)) { num_x_metamodes++; } } /* If the currently selected CPL metamode did not match any X metamode, and * the current active X metamode matched to another CPL metamode, then the * currently selected CPL metamode will need to be added and switched to. */ if (screen->cur_metamode->id < 0) { if (cur_x_metamode_matched) { if (add_cpl_metamode_to_X(screen, screen->cur_metamode, num_x_metamodes)) { num_x_metamodes++; } } else { /* Current metamode will be overridden, so stub it here so that it * does not get deleted later. */ stub_metamode_str(cur_x_metamode_str); screen->cur_metamode->x_idx = cur_x_metamode_idx; } } } /* preprocess_metamodes() */ /** screen_move_metamode() ******************************************* * * Updates the X ordering of the given metamode so that it appears at * 'metamode_idx'. * **/ static Bool screen_move_metamode(nvScreenPtr screen, nvMetaModePtr metamode, int metamode_idx) { char *update_str; int len; ReturnStatus ret; if (!metamode->cpl_str) { goto fail; } /* Append the index we want */ len = 24 + strlen(metamode->cpl_str); update_str = malloc(len); snprintf(update_str, len, "index=%d :: %s", metamode_idx, metamode->cpl_str); ret = NvCtrlSetStringAttribute(screen->handle, NV_CTRL_STRING_MOVE_METAMODE, update_str, NULL); if (ret != NvCtrlSuccess) { goto fail; } nv_info_msg(TAB, "Moved MetaMode (id:%d from idx: %d to idx %d) > %s", metamode->id, metamode->x_idx, metamode_idx, metamode->cpl_str); /* We moved the metamode to position metamode_idx, so bump the * index of all metamodes from the new position to the old one. * This assumes that metamodes are always moved forward in the * the list and not backwards. */ { int from_idx = metamode_idx; // New position int to_idx = metamode->x_idx; // Old position nvMetaModePtr m; for (m = screen->metamodes; m; m = m->next) { if ((m->x_idx >= from_idx) && (m->x_idx < to_idx)) { m->x_idx++; } } /* Note the new location of the metamode */ metamode->x_idx = metamode_idx; } return TRUE; fail: nv_error_msg("Failed to move MetaMode (id:%d from idx: %d to idx %d) > %s", metamode->id, metamode->x_idx, metamode_idx, metamode->cpl_str ? metamode->cpl_str : "NULL"); return FALSE; } /** order_metamodes() ************************************************ * * Makes sure the metamodes are ordered properly by moving each * metamode to its correct location in the server's metamode list. * **/ static void order_metamodes(nvScreenPtr screen) { nvMetaModePtr metamode; int metamode_idx; for (metamode = screen->metamodes, metamode_idx = 0; metamode; metamode = metamode->next, metamode_idx++) { /* MetaMode is already in correct spot */ if (metamode_idx == metamode->x_idx) { continue; } screen_move_metamode(screen, metamode, metamode_idx); } } /* order_metamodes() */ /** postprocess_metamodes() ****************************************** * * Does post processing work on the metamode list: * * - Deletes any metamode left in the metamode_strs * **/ static void postprocess_metamodes(nvScreenPtr screen, char *metamode_strs) { char *metamode_str, *tmp; const char *str; ReturnStatus ret; int idx; /* Delete metamodes that were not cleared out from the metamode_strs */ for (metamode_str = metamode_strs, idx = 0; metamode_str && strlen(metamode_str); metamode_str += strlen(metamode_str) +1, idx++) { /* Skip tokens */ str = strstr(metamode_str, "::"); if (!str) continue; str = parse_skip_whitespace(str +2); tmp = strdup(str); if (!tmp) continue; /* Delete the metamode */ ret = NvCtrlSetStringAttribute(screen->handle, NV_CTRL_STRING_DELETE_METAMODE, tmp, NULL); if (ret == NvCtrlSuccess) { nvMetaModePtr metamode; nv_info_msg(TAB, "Removed MetaMode > %s", str); /* MetaModes after the one that was deleted will have * moved up an index, so update the book keeping here. */ for (metamode = screen->metamodes; metamode; metamode = metamode->next) { if (metamode->x_idx >= idx) { metamode->x_idx--; } } } free(tmp); } /* Reorder the list of metamodes */ order_metamodes(screen); /* Cleanup */ cleanup_metamodes_for_apply(screen); } /** update_screen_metamodes() **************************************** * * Updates the screen's metamode list. * **/ static int update_screen_metamodes(CtkDisplayConfig *ctk_object, nvScreenPtr screen) { char *metamode_strs = NULL; char *cur_full_metamode_str = NULL; char *cur_metamode_ptr = NULL; /* Pointer into metamode_strs */ int cur_metamode_id; /* ID of current MetaMode on X screen */ int cur_metamode_idx; int num_metamodes_in_X; char *str; const char *cur_metamode_str; int len; int clear_apply = 0; /* Set if we should clear the apply button */ ReturnStatus ret; /* Make sure the screen has a valid handle to make the updates */ if (!screen->handle) { return 1; } nv_info_msg("", "Updating Screen %d's MetaModes:", NvCtrlGetTargetId(screen->handle)); /* To update the metamode list of the screen: * * (preprocess) * - Get the current list of metamodes for this screen * - Add all the new metamodes at the end of the list * * (mode switch) * - Do a modeswitch, if we need to * * (postprocess) * - Delete any unused mode * - Move metamodes to the correct location */ /* Get the list of the current metamodes */ ret = NvCtrlGetBinaryAttribute(screen->handle, 0, NV_CTRL_BINARY_DATA_METAMODES_VERSION_2, (unsigned char **)&metamode_strs, &len); if (ret != NvCtrlSuccess) goto done; /* Get the current metamode for the screen */ ret = NvCtrlGetStringAttribute(screen->handle, NV_CTRL_STRING_CURRENT_METAMODE_VERSION_2, &cur_full_metamode_str); if (ret != NvCtrlSuccess) goto done; /* Get the current metamode index for the screen */ ret = NvCtrlGetAttribute(screen->handle, NV_CTRL_CURRENT_METAMODE_ID, &cur_metamode_id); if (ret != NvCtrlSuccess) goto done; /* Skip tokens */ cur_metamode_str = strstr(cur_full_metamode_str, "::"); if (cur_metamode_str) { cur_metamode_str = parse_skip_whitespace(cur_metamode_str +2); } else { cur_metamode_str = cur_full_metamode_str; } /* Count the number of metamodes in X */ num_metamodes_in_X = 0; for (str = metamode_strs; str && strlen(str); str += strlen(str) +1) { num_metamodes_in_X++; } /* Find cur_metamode_str inside metamode_strs */ cur_metamode_ptr = NULL; cur_metamode_idx = 0; for (str = metamode_strs; str && strlen(str); str += strlen(str) +1) { const char *tmp; tmp = strstr(str, "::"); if (!tmp) continue; tmp = parse_skip_whitespace(tmp +2); if (!tmp) continue; if (!strcasecmp(tmp, cur_metamode_str)) { cur_metamode_ptr = str; break; } cur_metamode_idx++; } if (!cur_metamode_ptr) { nv_error_msg("Failed to identify current MetaMode in X list of " "MetaModes for screen %d", screen->scrnum); return 1; } /* Add new metamodes and relate MetaModes from CPL to X */ preprocess_metamodes(ctk_object, screen, metamode_strs, cur_metamode_ptr, num_metamodes_in_X, cur_metamode_idx); /* Update the current metamode. * * At this point, the metamode we want to set as the current metamode should * exist in the X server, or we will need to clobber the current X * metamode with new data. * * - If the current CPL MetaMode is the same as the current X MetaMode, * do nothing. * * - If the current CPL MetaMode is a different X MetaMode, switch to it. * * - If the current CPL MetaMode is not the same as the current X MetaMode. * and both the CPL MetaMode is not some other X MetaMode, and the current * X MetaMode is not some other CPL MetaMode, then we can modify the * current X MetaMode to be the CPL MetaMode. * * - If the current CPL MetaMode is not the same as the current X MetaMode, * and we matched the current X MetaMode to some other CPL MetaMode, then * we should add the current CPL MetaMode to X and switch to it. */ if (screen->cur_metamode->id != cur_metamode_id) { if (switch_to_current_metamode(ctk_object, screen, cur_metamode_str)) { ctk_config_statusbar_message(ctk_object->ctk_config, "Switched to MetaMode %dx%d.", screen->cur_metamode->edim.width, screen->cur_metamode->edim.height); nv_info_msg(TAB, "Using > %s", screen->cur_metamode->cpl_str); clear_apply = 1; } } else { clear_apply = 1; } /* Post process the metamodes list */ postprocess_metamodes(screen, metamode_strs); done: XFree(metamode_strs); XFree(cur_full_metamode_str); return clear_apply; } /* update_screen_metamodes() */ /** apply_clicked() ************************************************** * * Called when user clicks on the "Apply" button. * **/ static void apply_clicked(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); nvScreenPtr screen; ReturnStatus ret; gboolean clear_apply = TRUE; /* Make sure we can apply */ if (!validate_apply(ctk_object)) { return; } /* Make sure the layout is ready to be applied */ if (!validate_layout(ctk_object, VALIDATE_APPLY)) { return; } /* Temporarily unregister events */ unregister_layout_events(ctk_object); /* Update all X screens */ for (screen = ctk_object->layout->screens; screen; screen = screen->next_in_layout) { if (!screen->handle) continue; if (screen->no_scanout) continue; if (!update_screen_metamodes(ctk_object, screen)) { clear_apply = FALSE; } if (screen->primaryDisplay && ctk_object->primary_display_changed) { ret = NvCtrlSetStringAttribute(screen->handle, NV_CTRL_STRING_NVIDIA_XINERAMA_INFO_ORDER, screen->primaryDisplay->typeIdName, NULL); if (ret != NvCtrlSuccess) { nv_error_msg("Failed to set primary display for screen %d", screen->scrnum); } else { /* Make sure other parts of nvidia-settings get updated */ ctk_event_emit_string(screen->ctk_event, 0, NV_CTRL_STRING_NVIDIA_XINERAMA_INFO_ORDER); ctk_object->primary_display_changed = FALSE; } } } /* Clear the apply button if all went well, and we were able to apply * everything. */ if (ctk_object->apply_possible && clear_apply) { gtk_widget_set_sensitive(widget, False); ctk_object->forced_reset_allowed = TRUE; } /* XXX Run the GTK main loop to flush any pending layout events * that should be ignored. This is done because the GTK main loop * seems to only ignore the first blocked event received when it * finally runs. */ while (gtk_events_pending()) { gtk_main_iteration_do(FALSE); } /* re-register to receive events */ register_layout_events(ctk_object); update_gui(ctk_object); } /* apply_clicked() */ /** makeXConfigModeline() ******************************************** * * Returns a copy of an XF86Config-parser modeline structure. * */ static XConfigModeLinePtr makeXConfigModeline(nvModeLinePtr modeline) { XConfigModeLinePtr xconf_modeline; if (!modeline) return NULL; xconf_modeline = (XConfigModeLinePtr) malloc(sizeof(XConfigModeLineRec)); if (!xconf_modeline) return NULL; *xconf_modeline = modeline->data; if (modeline->xconfig_name) { xconf_modeline->identifier = xconfigStrdup(modeline->xconfig_name); } else if (modeline->data.identifier) { xconf_modeline->identifier = xconfigStrdup(modeline->data.identifier); } if (modeline->data.clock) { xconf_modeline->clock = xconfigStrdup(modeline->data.clock); } if (modeline->data.comment) { xconf_modeline->comment = xconfigStrdup(modeline->data.comment); } return xconf_modeline; } /* makeXConfigModeline() */ /* * add_modelines_to_monitor() - Given a list of modes "modes", this * function adds all the user-specified modelines in use to the * X config monitor "monitor"'s modeline list. */ static Bool add_modelines_to_monitor(XConfigMonitorPtr monitor, nvModePtr modes) { XConfigModeLinePtr modeline; nvModePtr mode; /* Add modelines from the list of modes given */ for (mode = modes; mode; mode = mode->next) { if (!mode->modeline) continue; /* Only add modelines that originated from the X config * or that were added through NV-CONTROL. */ if (!(mode->modeline->source & MODELINE_SOURCE_USER)) continue; /* Don't add the same modeline twice */ if ((mode->modeline->source & MODELINE_SOURCE_XCONFIG)) { if (xconfigFindModeLine(mode->modeline->xconfig_name, monitor->modelines)) continue; } else { if (xconfigFindModeLine(mode->modeline->data.identifier, monitor->modelines)) continue; } /* Dupe the modeline and add it to the monitor section */ modeline = makeXConfigModeline(mode->modeline); if (!modeline) continue; /* Append to the end of the modeline list */ xconfigAddListItem((GenericListPtr *)(&monitor->modelines), (GenericListPtr)modeline); } return TRUE; } /* add_modelines_to_monitor() */ /* * add_monitor_to_xconfig() - Adds the given display device's information * to the X configuration structure. */ static Bool add_monitor_to_xconfig(nvDisplayPtr display, XConfigPtr config, int monitor_id) { XConfigMonitorPtr monitor; XConfigOptionPtr opt = NULL; ReturnStatus ret; char *range_str = NULL; char *tmp; char *v_source = NULL; char *h_source = NULL; float min, max; unsigned int i, j, len; monitor = (XConfigMonitorPtr)calloc(1, sizeof(XConfigMonitorRec)); if (!monitor) goto fail; monitor->identifier = malloc(32); snprintf(monitor->identifier, 32, "Monitor%d", monitor_id); monitor->vendor = xconfigStrdup("Unknown"); /* XXX */ /* Copy the model name string, stripping any '"' characters */ len = strlen(display->logName); monitor->modelname = malloc(len + 1); for (i = 0, j = 0; i < len; i++, j++) { if (display->logName[i] == '\"') { if (++i >= len) break; } monitor->modelname[j] = display->logName[i]; } monitor->modelname[j] = '\0'; /* Get the Horizontal Sync ranges from nv-control */ ret = NvCtrlGetStringAttribute(display->handle, NV_CTRL_STRING_VALID_HORIZ_SYNC_RANGES, &range_str); if (ret != NvCtrlSuccess) { nv_error_msg("Unable to determine valid horizontal sync ranges " "for display device '%s' (GPU: %s)!", display->logName, display->gpu->name); goto fail; } /* Skip tokens */ tmp = strstr(range_str, "::"); if (tmp) { *tmp = '\0'; tmp += 2; } if (!parse_read_float_range(tmp, &min, &max)) { nv_error_msg("Unable to determine valid horizontal sync ranges " "for display device '%s' (GPU: %s)!", display->logName, display->gpu->name); goto fail; } monitor->n_hsync = 1; monitor->hsync[0].lo = min; monitor->hsync[0].hi = max; parse_token_value_pairs(range_str, apply_monitor_token, (void *)(&h_source)); free(range_str); range_str = NULL; /* Get the Horizontal Sync ranges from nv-control */ ret = NvCtrlGetStringAttribute(display->handle, NV_CTRL_STRING_VALID_VERT_REFRESH_RANGES, &range_str); if (ret != NvCtrlSuccess) { nv_error_msg("Unable to determine valid vertical refresh ranges " "for display device '%s' (GPU: %s)!", display->logName, display->gpu->name); goto fail; } /* Skip tokens */ tmp = strstr(range_str, "::"); if (tmp) { *tmp = '\0'; tmp += 2; } if (!parse_read_float_range(tmp, &min, &max)) { nv_error_msg("Unable to determine valid vertical refresh ranges " "for display device '%s' (GPU: %s)!", display->logName, display->gpu->name); goto fail; } monitor->n_vrefresh = 1; monitor->vrefresh[0].lo = min; monitor->vrefresh[0].hi = max; parse_token_value_pairs(range_str, apply_monitor_token, (void *)(&v_source)); free(range_str); range_str = NULL; if (h_source && v_source) { monitor->comment = g_strdup_printf(" # HorizSync source: %s, " "VertRefresh source: %s\n", h_source, v_source); } free(h_source); free(v_source); /* Add other options */ xconfigAddNewOption(&opt, "DPMS", NULL); monitor->options = opt; /* Add modelines used by this display */ add_modelines_to_monitor(monitor, display->modes); /* Append the monitor to the end of the monitor list */ xconfigAddListItem((GenericListPtr *)(&config->monitors), (GenericListPtr)monitor); display->conf_monitor = monitor; return TRUE; fail: free(range_str); free(h_source); free(v_source); if (monitor) { xconfigFreeMonitorList(&monitor); } return FALSE; } /* add_monitor_to_xconfig() */ /* * add_device_to_xconfig() - Adds the given device (GPU)'s information * to the X configuration file. If a valid screen order number is given, * it is also included (This is required for having separate X screens * driven by a single GPU.) */ static XConfigDevicePtr add_device_to_xconfig(nvGpuPtr gpu, XConfigPtr config, int device_id, int screen_id, int print_bus_id) { XConfigDevicePtr device; device = (XConfigDevicePtr)calloc(1, sizeof(XConfigDeviceRec)); if (!device) goto fail; /* Fill out the device information */ device->identifier = malloc(32); snprintf(device->identifier, 32, "Device%d", device_id); device->driver = xconfigStrdup("nvidia"); device->vendor = xconfigStrdup("NVIDIA Corporation"); device->board = xconfigStrdup(gpu->name); if (print_bus_id && gpu->pci_bus_id) { device->busid = strdup(gpu->pci_bus_id); } device->chipid = -1; device->chiprev = -1; device->irq = -1; device->screen = screen_id; /* Append to the end of the device list */ xconfigAddListItem((GenericListPtr *)(&config->devices), (GenericListPtr)device); return device; fail: if (device) { xconfigFreeDeviceList(&device); } return NULL; } /* add_device_to_xconfig() */ /* * add_display_to_screen() - Sets up the display subsection of * the X config screen structure with information from the given * screen. */ static Bool add_display_to_screen(nvScreenPtr screen, XConfigScreenPtr conf_screen) { XConfigDisplayPtr conf_display; /* Clear the display list */ xconfigFreeDisplayList(&conf_screen->displays); /* Add a single display subsection for the default depth */ xconfigAddDisplay(&conf_screen->displays, conf_screen->defaultdepth); if (!conf_screen->displays) goto fail; /* Configure the virtual screen size */ if (screen->no_scanout) { conf_display = conf_screen->displays; conf_display->virtualX = screen->dim.width; conf_display->virtualY = screen->dim.height; } /* XXX Don't do any further tweaking to the display subsection. * All mode configuration should be done through the 'MetaModes" * X Option. The modes generated by xconfigAddDisplay() will * be used as a fallback. */ return TRUE; fail: xconfigFreeDisplayList(&conf_screen->displays); return FALSE; } /* add_display_to_screen() */ /* * add_screen_to_xconfig() - Adds the given X screen's information * to the X configuration structure. */ static int add_screen_to_xconfig(CtkDisplayConfig *ctk_object, nvScreenPtr screen, XConfigPtr config) { XConfigScreenPtr conf_screen; nvDisplayPtr display; nvDisplayPtr other; char *metamode_strs; int ret; conf_screen = (XConfigScreenPtr)calloc(1, sizeof(XConfigScreenRec)); if (!conf_screen) goto fail; /* Fill out the screen information */ conf_screen->identifier = malloc(32); snprintf(conf_screen->identifier, 32, "Screen%d", screen->scrnum); /* Tie the screen to its device section */ conf_screen->device_name = xconfigStrdup(screen->conf_device->identifier); conf_screen->device = screen->conf_device; if (screen->no_scanout) { /* Configure screen for no scanout */ /* Set the UseDisplayDevice option to "none" */ xconfigAddNewOption(&conf_screen->options, "UseDisplayDevice", "none"); } else { /* Configure screen for scanout */ /* Find the first display on the screen */ display = screen->displays;; if (!display) { nv_error_msg("Unable to find a display device for screen %d!", screen->scrnum); goto fail; } /* Create the screen's only Monitor section from the first display */ if (!add_monitor_to_xconfig(display, config, screen->scrnum)) { nv_error_msg("Failed to add display device '%s' to screen %d!", display->logName, screen->scrnum); goto fail; } /* Tie the screen to the monitor section */ conf_screen->monitor_name = xconfigStrdup(display->conf_monitor->identifier); conf_screen->monitor = display->conf_monitor; /* Add the modelines of all other connected displays to the monitor */ for (other = display->next_in_screen; other; other = other->next_in_screen) { add_modelines_to_monitor(display->conf_monitor, other->modes); } /* Set the Stereo option */ { char buf[32]; snprintf(buf, 32, "%d", screen->stereo); xconfigAddNewOption(&conf_screen->options, "Stereo", buf); } /* Set the nvidiaXineramaInfoOrder option */ if (screen->primaryDisplay) { xconfigAddNewOption(&conf_screen->options, "nvidiaXineramaInfoOrder", screen->primaryDisplay->typeIdName); } /* Create the "metamode" option string. */ ret = generate_xconf_metamode_str(ctk_object, screen, &metamode_strs); if (ret != XCONFIG_GEN_OK) goto bail; /* If no user specified metamodes were found, add * whatever the currently selected metamode is */ if (!metamode_strs) { metamode_strs = screen_get_metamode_str(screen, screen->cur_metamode_idx, 0); } if (metamode_strs) { xconfigAddNewOption(&conf_screen->options, "metamodes", metamode_strs); free(metamode_strs); } /* Set Mosaic configuration */ if (screen->display_owner_gpu->mosaic_enabled) { xconfigAddNewOption(&conf_screen->options, "MultiGPU", "Off"); switch (screen->display_owner_gpu->mosaic_type) { case MOSAIC_TYPE_SLI_MOSAIC: xconfigAddNewOption(&conf_screen->options, "SLI", "Mosaic"); xconfigAddNewOption(&conf_screen->options, "BaseMosaic", "off"); break; case MOSAIC_TYPE_BASE_MOSAIC: case MOSAIC_TYPE_BASE_MOSAIC_LIMITED: xconfigAddNewOption(&conf_screen->options, "SLI", "off"); xconfigAddNewOption(&conf_screen->options, "BaseMosaic", "on"); break; default: nv_warning_msg("Uknonwn mosaic mode %d", screen->display_owner_gpu->mosaic_type); xconfigAddNewOption(&conf_screen->options, "SLI", screen->sli_mode ? screen->sli_mode : "Off"); xconfigAddNewOption(&conf_screen->options, "BaseMosaic", "off"); break; } } else { /* Set SLI configuration */ if (screen->sli_mode && !g_ascii_strcasecmp(screen->sli_mode, "Mosaic")) { xconfigAddNewOption(&conf_screen->options, "SLI", "Off"); } else { xconfigAddNewOption(&conf_screen->options, "SLI", screen->sli_mode ? screen->sli_mode : "Off"); } xconfigAddNewOption(&conf_screen->options, "MultiGPU", screen->multigpu_mode ? screen->multigpu_mode : "Off"); xconfigAddNewOption(&conf_screen->options, "BaseMosaic", "off"); } } /* Setup the display section */ conf_screen->defaultdepth = screen->depth; /* Setup the display subsection of the screen */ if (!add_display_to_screen(screen, conf_screen)) { nv_error_msg("Failed to add Display section for screen %d!", screen->scrnum); goto fail; } /* Append to the end of the screen list */ xconfigAddListItem((GenericListPtr *)(&config->screens), (GenericListPtr)conf_screen); screen->conf_screen = conf_screen; return XCONFIG_GEN_OK; /* Handle failure cases */ fail: ret = XCONFIG_GEN_ERROR; bail: if (conf_screen) { xconfigFreeScreenList(&conf_screen); } return ret; } /* add_screen_to_xconfig() */ /* * get_device_screen_id() - Returns the screen number that should be * used in the device section that maps to the given screen's screen * section. */ static int get_device_screen_id(nvGpuPtr gpu, nvScreenPtr screen) { nvLayoutPtr layout = gpu->layout; nvScreenPtr other; int device_screen_id; int num_screens_on_gpu; /* Go through the GPU's screens and figure out what the * GPU-relative screen number should be for the given * screen's device section. * * This is done by counting the number of screens that * have a screen number that is lower than the given * screen, and that's the relative position of this * screen wrt the GPU. */ device_screen_id = 0; num_screens_on_gpu = 0; for (other = layout->screens; other; other = other->next_in_layout) { if (!screen_has_gpu(other, gpu)) { continue; } num_screens_on_gpu++; if (other == screen) continue; if (screen->scrnum > other->scrnum) { device_screen_id++; } } /* If there is only one screen on the GPU, the device * section shouldn't specify a "Screen #" */ if (num_screens_on_gpu < 2) return -1; return device_screen_id; } /* get_device_screen_id() */ /* * add_screens_to_xconfig() - Adds all the X screens in the given * layout to the X configuration structure. */ static int add_screens_to_xconfig(CtkDisplayConfig *ctk_object, nvLayoutPtr layout, XConfigPtr config) { nvScreenPtr screen; int device_screen_id; int print_bus_ids; int ret; /* Clear the screen list */ xconfigFreeMonitorList(&config->monitors); xconfigFreeDeviceList(&config->devices); xconfigFreeScreenList(&config->screens); /* Don't print the bus ID in the case where we have a single * GPU driving a single X screen */ if ((layout->num_gpus == 1) && (layout->num_screens == 1)) { print_bus_ids = 0; } else { print_bus_ids = 1; } /* Generate the Device sections and Screen sections */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { nvGpuPtr gpu = screen->display_owner_gpu; /* Figure out what screen number to use for the device section. */ device_screen_id = get_device_screen_id(gpu, screen); /* Each screen needs a unique device section * * Note that the device id used to name the * device section is the same as the screen * number such that the name of the two sections * match. */ screen->conf_device = add_device_to_xconfig(gpu, config, screen->scrnum, device_screen_id, print_bus_ids); if (!screen->conf_device) { nv_error_msg("Failed to add device '%s' to X config.", gpu->name); goto fail; } ret = add_screen_to_xconfig(ctk_object, screen, config); if (ret == XCONFIG_GEN_ERROR) { nv_error_msg("Failed to add X screen %d to X config.", screen->scrnum); } if (ret != XCONFIG_GEN_OK) goto bail; } return XCONFIG_GEN_OK; /* Handle failure cases */ fail: ret = XCONFIG_GEN_ERROR; bail: xconfigFreeMonitorList(&config->monitors); xconfigFreeDeviceList(&config->devices); xconfigFreeScreenList(&config->screens); return ret; } /* add_screens_to_xconfig() */ /* * add_adjacency_to_xconfig() - Adds the given X screen's positioning * information to an X config structure. */ static Bool add_adjacency_to_xconfig(nvScreenPtr screen, XConfigPtr config) { XConfigAdjacencyPtr adj; XConfigLayoutPtr conf_layout = config->layouts; adj = (XConfigAdjacencyPtr) calloc(1, sizeof(XConfigAdjacencyRec)); if (!adj) return FALSE; adj->scrnum = screen->scrnum; adj->screen = screen->conf_screen; adj->screen_name = xconfigStrdup(screen->conf_screen->identifier); /* Position the X screen */ if (screen->position_type == CONF_ADJ_ABSOLUTE) { adj->x = screen->dim.x; adj->y = screen->dim.y; } else { adj->where = screen->position_type; adj->refscreen = xconfigStrdup(screen->relative_to->conf_screen->identifier); adj->x = screen->x_offset; adj->y = screen->y_offset; } /* Append to the end of the screen list */ xconfigAddListItem((GenericListPtr *)(&conf_layout->adjacencies), (GenericListPtr)adj); return TRUE; } /* add_adjacency_to_xconfig() */ /* * add_layout_to_xconfig() - Adds layout (adjacency/X screen * positioning) information to the X config structure based * in the layout given. */ static Bool add_layout_to_xconfig(nvLayoutPtr layout, XConfigPtr config) { XConfigLayoutPtr conf_layout; nvScreenPtr screen; int scrnum; /* Just modify the first layout */ conf_layout = config->layouts; if (!conf_layout) { nv_error_msg("Unable to generate initial layout!"); goto fail; } /* Clean up the adjacencies */ xconfigFreeAdjacencyList(&conf_layout->adjacencies); /* Assign the adjacencies (in order) */ scrnum = 0; do { /* Find the next screen to write */ screen = NULL; for (screen = layout->screens; screen; screen = screen->next_in_layout) { if (screen->scrnum == scrnum) break; } if (screen) { if (!add_adjacency_to_xconfig(screen, config)) goto fail; } scrnum++; } while (screen); /* Setup for Xinerama */ xconfigAddNewOption(&conf_layout->options, "Xinerama", (layout->xinerama_enabled ? "1" : "0")); layout->conf_layout = conf_layout; return TRUE; fail: return FALSE; } /* add_layout_to_xconfig() */ /* * generateXConfig() - Generates an X config structure based * on the layout given. */ static int generateXConfig(CtkDisplayConfig *ctk_object, XConfigPtr *pConfig) { nvLayoutPtr layout = ctk_object->layout; XConfigPtr config = NULL; GenerateOptions go; char *server_vendor; int ret; if (!pConfig) goto fail; /* XXX Assume we are creating an X config file for the local system */ xconfigGenerateLoadDefaultOptions(&go); xconfigGetXServerInUse(&go); /* Query actual server X.Org/XFree86 */ server_vendor = NvCtrlGetServerVendor(layout->handle); if (server_vendor && g_strrstr(server_vendor, "X.Org")) { go.xserver = X_IS_XORG; } else { go.xserver = X_IS_XF86; } /* Generate the basic layout */ config = xconfigGenerate(&go); /* Repopulate the X config file with the right information */ ret = add_screens_to_xconfig(ctk_object, layout, config); if (ret == XCONFIG_GEN_ERROR) { nv_error_msg("Failed to add X screens to X config."); } if (ret != XCONFIG_GEN_OK) goto bail; if (!add_layout_to_xconfig(layout, config)) { nv_error_msg("Failed to add server layout to X config."); goto fail; } /* Check if composite should be disabled */ { const char *composite_disabled_str = NULL; nvScreenPtr screen; /* See if any X screens have overlay, cioverlay, ubb or stereo enabled, * or depth 8. */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { composite_disabled_str = xconfigValidateComposite(config, &go, 1, // composite_specified layout->xinerama_enabled, screen->depth, screen->overlay && screen->hw_overlay, screen->overlay && !screen->hw_overlay, screen->ubb, screen->stereo ); if (composite_disabled_str) { break; } } if (composite_disabled_str) { if (!config->extensions) { config->extensions = nvalloc(sizeof(XConfigExtensionsRec)); } xconfigRemoveNamedOption(&(config->extensions->options), "Composite", NULL); xconfigAddNewOption(&config->extensions->options, "Composite", "Disable"); } } *pConfig = config; return XCONFIG_GEN_OK; /* Handle failure cases */ fail: ret = XCONFIG_GEN_ERROR; bail: if (config) { xconfigFreeConfig(&config); } return ret; } /* generateXConfig() */ /** xconfig_generate() *********************************************** * * Callback to generate an X config structure based on the current * display configuration. * **/ static XConfigPtr xconfig_generate(XConfigPtr xconfCur, Bool merge, Bool *merged, void *callback_data) { CtkDisplayConfig *ctk_object = (CtkDisplayConfig *)callback_data; XConfigPtr xconfGen = NULL; gint result; *merged = FALSE; /* Generate an X config structure from our layout */ result = generateXConfig(ctk_object, &xconfGen); if ((result != XCONFIG_GEN_OK) || !xconfGen) { goto fail; } /* If we're not merging, we're done */ if (!xconfCur || !merge) { return xconfGen; } /* Merge xconfGen into xconfCur */ result = xconfigMergeConfigs(xconfCur, xconfGen); if (!result) { gchar *err_msg = g_strdup_printf("Failed to merge generated " "configuration with existing " "X config file!"); ctk_display_warning_msg(ctk_get_parent_window(GTK_WIDGET(ctk_object)), err_msg); g_free(err_msg); return xconfGen; } /* Merge worked */ xconfigFreeConfig(&xconfGen); *merged = TRUE; return xconfCur; fail: if (xconfGen) { xconfigFreeConfig(&xconfGen); } return NULL; } /* xconfig_generate() */ /** save_clicked() *************************************************** * * Called when the user clicks on the "Save" button. * **/ static void save_clicked(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); /* Make sure the layout is ready to be saved */ if (!validate_layout(ctk_object, VALIDATE_SAVE)) { return; } /* Run the save dialog */ run_save_xconfig_dialog(ctk_object->save_xconfig_dlg); } /* save_clicked() */ /** advanced_clicked() *********************************************** * * Called when user clicks on the "Advanced..." button. * **/ static void advanced_clicked(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); /* Toggle advanced options for the display */ ctk_object->advanced_mode = !(ctk_object->advanced_mode); /* Show advanced display options */ if (ctk_object->advanced_mode) { gtk_button_set_label(GTK_BUTTON(widget), "Basic..."); ctk_display_layout_set_advanced_mode (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), 1); /* Show basic display options */ } else { gtk_button_set_label(GTK_BUTTON(widget), "Advanced..."); ctk_display_layout_set_advanced_mode (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), 0); } /* Update the GUI to show the right widgets */ update_gui(ctk_object); } /* advanced_clicked() */ /** probe_clicked() ************************************************** * * Called when user clicks on the "Probe" button. * **/ static void probe_clicked(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); unsigned int probed_displays; nvLayoutPtr layout = ctk_object->layout; nvGpuPtr gpu; ReturnStatus ret; /* Probe each GPU for display changes */ for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { if (!gpu->handle) continue; ret = NvCtrlGetAttribute(gpu->handle, NV_CTRL_PROBE_DISPLAYS, (int *)&probed_displays); if (ret != NvCtrlSuccess) { nv_error_msg("Failed to probe for display devices on GPU-%d '%s'.", NvCtrlGetTargetId(gpu->handle), gpu->name); continue; } /* Emit the probe event to ourself so changes are handled * consistently. */ ctk_event_emit(gpu->ctk_event, 0, NV_CTRL_PROBE_DISPLAYS, probed_displays); } } /* probe_clicked() */ /** layout_change_is_applyable() *********************************** * * Determine whether an updated layout should let the user press the Apply * button. * **/ static gboolean layout_change_is_applyable(const nvLayoutPtr old, const nvLayoutPtr new) { const nvGpu *gpu; /* The update should be applyable if any active display devices were * removed. */ for (gpu = old->gpus; gpu; gpu = gpu->next_in_layout) { const nvDisplay *dpy; for (dpy = gpu->displays; dpy; dpy = dpy->next_on_gpu) { /* See if the display was active in the old layout. */ if (!dpy->cur_mode || !dpy->cur_mode->modeline) { continue; } /* This display device had an active mode in the old layout. See if * it's still connected in the new layout. */ if (!layout_get_display(new, NvCtrlGetTargetId(dpy->handle))) { return True; } } } return False; } /** reset_layout() ************************************************* * * Load current X server settings. * **/ static void reset_layout(CtkDisplayConfig *ctk_object) { gchar *err_str = NULL; nvLayoutPtr layout; gboolean allow_apply; /* Load the current layout */ layout = layout_load_from_server(ctk_object->handle, &err_str); /* See if we should allow the user to press the Apply button to make the new * layout take effect, e.g. if an active display device disappeared. */ allow_apply = layout_change_is_applyable(ctk_object->layout, layout); /* Handle errors loading the new layout */ if (!layout || err_str) { if (err_str) { nv_error_msg("%s", err_str); g_free(err_str); } return; } /* Free existing layout */ unregister_layout_events(ctk_object); layout_free(ctk_object->layout); /* Setup the new layout */ ctk_object->layout = layout; ctk_display_layout_set_layout((CtkDisplayLayout *)(ctk_object->obj_layout), ctk_object->layout); register_layout_events(ctk_object); /* Make sure all X screens have the same depth if Xinerama is enabled */ consolidate_xinerama(ctk_object, NULL); /* Make sure X screens have some kind of position */ assign_screen_positions(ctk_object); update_gui(ctk_object); /* Get new position */ get_cur_screen_pos(ctk_object); /* Update the apply button */ ctk_object->apply_possible = TRUE; update_btn_apply(ctk_object, allow_apply); ctk_object->forced_reset_allowed = TRUE; /* OK to reset w/o user input */ ctk_object->notify_user_of_reset = TRUE; /* Notify user of new changes */ ctk_object->reset_required = FALSE; /* No reset required to apply */ } /* reset_layout() */ /** reset_clicked() ************************************************** * * Called when user clicks on the "Reset" button. * **/ static void reset_clicked(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); gint result; /* Show the confirm dialog */ gtk_window_set_transient_for (GTK_WINDOW(ctk_object->dlg_reset_confirm), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(ctk_object)))); gtk_widget_grab_focus(ctk_object->btn_reset_cancel); gtk_widget_show(ctk_object->dlg_reset_confirm); result = gtk_dialog_run(GTK_DIALOG(ctk_object->dlg_reset_confirm)); gtk_widget_hide(ctk_object->dlg_reset_confirm); switch (result) { case GTK_RESPONSE_ACCEPT: /* User wants to reset the configuration */ break; case GTK_RESPONSE_REJECT: default: /* User doesn't want to reset the configuration */ return; } reset_layout(ctk_object); } /* reset_clicked() */ /** force_layout_reset() ****************************************** * * Pop up dialog box to user when the layout needs to be reloaded * due to changes made to the server layout by another client. * **/ static gboolean force_layout_reset(gpointer user_data) { gint result; GtkWidget *parent; GtkWidget *dlg; CtkDisplayConfig *ctk_object = (CtkDisplayConfig *) user_data; if ((ctk_object->forced_reset_allowed) ) { /* It is OK to force a reset of the layout since no * changes have been made. */ reset_layout(ctk_object); goto done; } /* It is not OK to force a reset of the layout since the user * may have changed some settings. The user will need to * reset the layout manually. */ ctk_object->reset_required = TRUE; /* If the X server display configuration page is not currently * selected, we will need to notify the user once they get * back to it. */ if (!ctk_object->page_selected) goto done; /* Notify the user of the required reset if they haven't * already been notified. */ if (!ctk_object->notify_user_of_reset) goto done; parent = ctk_get_parent_window(GTK_WIDGET(ctk_object)); dlg = gtk_message_dialog_new (GTK_WINDOW(parent), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, "Your current changes to the X server display configuration may no " "longer be applied due to changes made to the running X server.\n\n" "You may either reload the current X server settings and lose any " "configuration setup in this page, or select \"Cancel\" and save " "your changes to the X configuration file (requires restarting X " "to take effect.)\n\n" "If you select \"Cancel\", you will only be allowed to apply " "settings once you have reset the configuration."); gtk_dialog_add_buttons(GTK_DIALOG(dlg), "Reload current X server settings", GTK_RESPONSE_YES, "Cancel", GTK_RESPONSE_CANCEL, NULL); result = gtk_dialog_run(GTK_DIALOG(dlg)); switch (result) { case GTK_RESPONSE_YES: reset_layout(ctk_object); break; case GTK_RESPONSE_CANCEL: /* Fall through */ default: /* User does not want to reset the layout, don't allow them * to apply their changes (but allow them to save their changes) * until they have reloaded the layout manually. */ ctk_object->notify_user_of_reset = FALSE; update_btn_apply(ctk_object, FALSE); break; } gtk_widget_destroy(dlg); done: ctk_object->ignore_reset_events = FALSE; return FALSE; } /* force_layout_reset() */ /** display_config_attribute_changed() ******************************* * * Callback function for all display config page related events * change. * * Display configuration changes usually involve multiple related * events in succession. To avoid reloading the layout for every * event, we register the force_layout_reset() function (once per * block of events) to be called when the app becomes idle (which * will happen once there are no more pending events) using * g_idle_add(). Once force_layout_reset() is called, it will * unregister itself by returning FALSE. * **/ static void display_config_attribute_changed(GtkObject *object, gpointer arg1, gpointer user_data) { CtkDisplayConfig *ctk_object = (CtkDisplayConfig *) user_data; if (ctk_object->ignore_reset_events) return; ctk_object->ignore_reset_events = TRUE; /* queue force_layout_reset() to be called once all other pending * events are consumed. */ g_idle_add(force_layout_reset, (gpointer)ctk_object); } /* display_config_attribute_changed() */ /** ctk_display_config_unselected() ********************************** * * Called when display config page is unselected. * **/ void ctk_display_config_unselected(GtkWidget *widget) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(widget); ctk_object->page_selected = FALSE; } /* ctk_display_config_unselected() */ /** ctk_display_config_selected() *********************************** * * Called when display config page is selected. * **/ void ctk_display_config_selected(GtkWidget *widget) { CtkDisplayConfig *ctk_object=CTK_DISPLAY_CONFIG(widget); ctk_object->page_selected = TRUE; /* Handle case where a layout reset is required but we could * not notify the user since the X server display configuration * page was not selected */ if (ctk_object->reset_required) { force_layout_reset(ctk_object); } } /* ctk_display_config_selected() */ /** validation_details_clicked() ************************************* * * Callback for when the user clicks on the "Show/Hide Details" * button in the validation confirmation dialog. * **/ static void validation_details_clicked(GtkWidget *widget, gpointer user_data) { CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data); gboolean show = !(GTK_WIDGET_VISIBLE(ctk_object->box_validation_override_details)); if (show) { gtk_widget_show_all(ctk_object->box_validation_override_details); gtk_window_set_resizable (GTK_WINDOW(ctk_object->dlg_validation_override), TRUE); gtk_widget_set_size_request (ctk_object->box_validation_override_details, 450, 150); gtk_button_set_label (GTK_BUTTON(ctk_object->btn_validation_override_show), "Hide Details..."); } else { gtk_widget_hide(ctk_object->box_validation_override_details); gtk_window_set_resizable (GTK_WINDOW(ctk_object->dlg_validation_override), FALSE); gtk_button_set_label (GTK_BUTTON(ctk_object->btn_validation_override_show), "Show Details..."); } } /* validation_details_clicked() */ nvidia-settings/src/gtk+-2.x/ctkconstants.h0000664000175000017500000000164112236467170020767 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * constants used through out the nvidia-settings gtk+ gui */ #ifndef __CTK_CONSTANTS_H__ #define __CTK_CONSTANTS_H__ #define CTK_WINDOW_PAD 7 #endif /* __CTK_CONSTANTS_H__ */ nvidia-settings/src/gtk+-2.x/ctkdisplayconfig-utils.h0000664000175000017500000001407012236467170022744 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2006 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_DISPLAYCONFIG_UTILS_H__ #define __CTK_DISPLAYCONFIG_UTILS_H__ #include #include "XF86Config-parser/xf86Parser.h" #include "ctkdisplaylayout.h" G_BEGIN_DECLS /* Token parsing handlers */ void apply_modeline_token(char *token, char *value, void *data); void apply_metamode_token(char *token, char *value, void *data); void apply_monitor_token(char *token, char *value, void *data); void apply_screen_info_token(char *token, char *value, void *data); /* Mode functions */ void clamp_rect_to_viewportin(GdkRectangle *rect, const nvMode *mode); void clamp_mode_panning(nvModePtr mode); void get_viewportin_rect(const nvMode *mode, GdkRectangle *rect); void mode_set_modeline(nvModePtr mode, nvModeLinePtr modeline, const nvSize *providedViewPortIn, const GdkRectangle *providedViewPortOut); Bool mode_set_rotation(nvModePtr mode, Rotation rotation); nvModePtr mode_parse(nvDisplayPtr display, const char *mode_str); void apply_underscan_to_viewportout(const nvSize raster_size, const int hpixel_value, GdkRectangle *viewPortOut); void get_underscan_settings_from_viewportout(const nvSize raster_size, const GdkRectangle viewPortOut, gfloat *percent_value, gint *pixel_value); /* ModeLine functions */ Bool modelines_match(nvModeLinePtr modeline1, nvModeLinePtr modeline2); void modeline_free(nvModeLinePtr m); /* ViewPort functions */ Bool viewports_in_match(const nvSize viewPortIn1, const nvSize viewPortIn2); Bool viewports_out_match(const GdkRectangle viewPortOut1, const GdkRectangle viewPortOut2); /* Display functions */ int display_find_closest_mode_matching_modeline(nvDisplayPtr display, nvModeLinePtr modeline); Bool display_has_modeline(nvDisplayPtr display, nvModeLinePtr modeline); Bool display_add_modelines_from_server(nvDisplayPtr display, nvGpuPtr gpu, gchar **err_str); void display_remove_modes(nvDisplayPtr display); Bool display_set_modes_rotation(nvDisplayPtr display, Rotation rotation); /* Metamode functions */ void cleanup_metamode(nvMetaModePtr metamode); /* Screen functions */ void clamp_screen_size_rect(GdkRectangle *rect); int get_screen_max_displays(nvScreenPtr screen); void renumber_xscreens(nvLayoutPtr layout); void screen_unlink_display(nvDisplayPtr display); void screen_link_display(nvScreenPtr screen, nvDisplayPtr display); void screen_remove_display(nvDisplayPtr display); gchar * screen_get_metamode_str(nvScreenPtr screen, int metamode_idx, int force_target_id_name); void link_screen_to_gpu(nvScreenPtr screen, nvGpuPtr gpu); Bool screen_has_gpu(nvScreenPtr screen, nvGpuPtr match_gpu); /* GPU functions */ void gpu_remove_and_free_display(nvDisplayPtr display); nvDisplayPtr gpu_add_display_from_server(nvGpuPtr gpu, unsigned int display_id, gchar **err_str); Bool gpu_add_screenless_modes_to_displays(nvGpuPtr gpu); /* Layout functions */ void layout_free(nvLayoutPtr layout); void layout_add_screen(nvLayoutPtr layout, nvScreenPtr screen); nvLayoutPtr layout_load_from_server(NvCtrlAttributeHandle *handle, gchar **err_str); nvScreenPtr layout_get_a_screen(nvLayoutPtr layout, nvGpuPtr preferred_gpu); nvDisplayPtr layout_get_display(const nvLayoutPtr layout, const unsigned int display_id); void layout_remove_and_free_screen(nvScreenPtr screen); /* Save X config dialog */ typedef XConfigPtr (* generate_xconfig_callback) (XConfigPtr xconfCur, Bool merge, Bool *merged, gpointer callback_data); typedef struct _SaveXConfDlg { GtkWidget *parent; GtkWidget *top_window; /* Callback functions for generating the XConfig struct */ generate_xconfig_callback xconf_gen_func; void *callback_data; Bool merge_toggleable; /* When possible, user able to toggle merge */ GtkWidget *dlg_xconfig_save; /* Save X config dialog */ GtkWidget *scr_xconfig_save; /* Scroll window */ GtkWidget *txt_xconfig_save; /* Text view of file contents */ GtkTextBuffer *buf_xconfig_save; /* Text buffer (Actual) file contents */ GtkWidget *btn_xconfig_merge; /* Merge with existing X config */ GtkWidget *btn_xconfig_preview; /* Show/Hide button */ GtkWidget *box_xconfig_save; /* Show/Hide this box */ GtkWidget *dlg_xconfig_file; /* File save dialog */ GtkWidget *btn_xconfig_file; GtkWidget *txt_xconfig_file; } SaveXConfDlg; SaveXConfDlg *create_save_xconfig_dialog(GtkWidget *parent, Bool merge_toggleable, generate_xconfig_callback xconf_gen_func, gpointer callback_data); void run_save_xconfig_dialog(SaveXConfDlg *dlg); G_END_DECLS #endif /* __CTK_DISPLAYCONFIG_UTILS_H__ */ nvidia-settings/src/gtk+-2.x/ctkui.h0000664000175000017500000000210712236467170017366 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_UI_H__ #define __CTK_UI_H__ #include "NvCtrlAttributes.h" #include "parse.h" #include "config-file.h" int ctk_init_check(int *argc, char **argv[]); char *ctk_get_display(void); void ctk_main(ParsedAttribute*, ConfigProperties*, CtrlHandles*, const char *page); #endif /* __CTK_UI_H__ */ nvidia-settings/src/gtk+-2.x/ctkserver.c0000664000175000017500000004371412236467170020263 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include /* malloc */ #include /* snprintf */ #include #include #include #include "ctkbanner.h" #include "ctkserver.h" #include "ctkevent.h" #include "ctkhelp.h" #include "ctkutils.h" GType ctk_server_get_type(void) { static GType ctk_server_type = 0; if (!ctk_server_type) { static const GTypeInfo ctk_server_info = { sizeof (CtkServerClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof(CtkServer), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_server_type = g_type_register_static (GTK_TYPE_VBOX, "CtkServer", &ctk_server_info, 0); } return ctk_server_type; } /* * Code taken and modified from xdpyinfo.c * * Copyright Information for xdpyinfo: * *********************************************************************** * * xdpyinfo - print information about X display connection * * Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. 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 OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. * * Author: Jim Fulton, MIT X Consortium * *********************************************************************** * */ static gchar * get_server_vendor_version(NvCtrlAttributeHandle *handle) { int vendrel = NvCtrlGetVendorRelease(handle); char *vendstr = NvCtrlGetServerVendor(handle); gchar *version = NULL; gchar *tmp; if (vendrel < 0 || !vendstr) return NULL; /* XFree86 */ if (g_strrstr(vendstr, "XFree86")) { if (vendrel < 336) { /* * vendrel was set incorrectly for 3.3.4 and 3.3.5, so handle * those cases here. */ version = g_strdup_printf("%d.%d.%d", vendrel / 100, (vendrel / 10) % 10, vendrel % 10); } else if (vendrel < 3900) { /* 3.3.x versions, other than the exceptions handled above */ if (((vendrel / 10) % 10) || (vendrel % 10)) { if (vendrel % 10) { version = g_strdup_printf("%d.%d.%d.%d", vendrel / 1000, (vendrel / 100) % 10, (vendrel / 10) % 10, vendrel % 10); } else { version = g_strdup_printf("%d.%d.%d", vendrel / 1000, (vendrel / 100) % 10, (vendrel / 10) % 10); } } else { version = g_strdup_printf("%d.%d", vendrel / 1000, (vendrel / 100) % 10); } } else if (vendrel < 40000000) { /* 4.0.x versions */ if (vendrel % 10) { version = g_strdup_printf("%d.%d.%d", vendrel / 1000, (vendrel / 10) % 10, vendrel % 10); } else { version = g_strdup_printf("%d.%d", vendrel / 1000, (vendrel / 10) % 10); } } else { /* post-4.0.x */ if (vendrel % 1000) { version = g_strdup_printf("%d.%d.%d.%d", vendrel / 10000000, (vendrel / 100000) % 100, (vendrel / 1000) % 100, vendrel % 1000); } else { version = g_strdup_printf("%d.%d.%d", vendrel / 10000000, (vendrel / 100000) % 100, (vendrel / 1000) % 100); } } } /* X.Org */ if (g_strrstr(vendstr, "X.Org")) { tmp = g_strdup_printf("%d.%d.%d", vendrel / 10000000, (vendrel / 100000) % 100, (vendrel / 1000) % 100); if (vendrel % 1000) { version = g_strdup_printf("%s.%d", tmp, vendrel % 1000); } else { version = g_strdup(tmp); } g_free(tmp); } /* DMX */ if (g_strrstr(vendstr, "DMX")) { int major, minor, year, month, day; major = vendrel / 100000000; vendrel -= major * 100000000; minor = vendrel / 1000000; vendrel -= minor * 1000000; year = vendrel / 10000; vendrel -= year * 10000; month = vendrel / 100; vendrel -= month * 100; day = vendrel; /* Add other epoch tests here */ if (major > 0 && minor > 0) year += 2000; /* Do some sanity tests in case there is * another server with the same vendor * string. That server could easily use * values < 100000000, which would have * the effect of keeping our major * number 0. */ if (major > 0 && major <= 20 && minor >= 0 && minor <= 99 && year >= 2000 && month >= 1 && month <= 12 && day >= 1 && day <= 31) version = g_strdup_printf("%d.%d.%04d%02d%02d\n", major, minor, year, month, day); } /* Add the vendor release number */ if (version) { tmp = g_strdup_printf("%s (%d)", version, vendrel); } else { tmp = g_strdup_printf("%d", vendrel); } g_free(version); version = tmp; return version; } /* * CTK Server widget creation * */ GtkWidget* ctk_server_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config) { GObject *object; CtkServer *ctk_object; GtkWidget *label; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *banner; GtkWidget *hseparator; GtkWidget *table; gchar *os; gchar *arch; gchar *driver_version; gchar *dname = NvCtrlGetDisplayName(handle); gchar *display_name; gchar *server_version; gchar *vendor_str; gchar *vendor_ver; gchar *nv_control_server_version; gchar *num_screens; ReturnStatus ret; int tmp, os_val; int xinerama_enabled; /* * get the data that we will display below * */ /* NV_CTRL_XINERAMA */ ret = NvCtrlGetAttribute(handle, NV_CTRL_XINERAMA, &xinerama_enabled); if (ret != NvCtrlSuccess) { xinerama_enabled = FALSE; } /* NV_CTRL_OPERATING_SYSTEM */ os_val = NV_CTRL_OPERATING_SYSTEM_LINUX; ret = NvCtrlGetAttribute(handle, NV_CTRL_OPERATING_SYSTEM, &os_val); os = NULL; if (ret == NvCtrlSuccess) { if (os_val == NV_CTRL_OPERATING_SYSTEM_LINUX) os = "Linux"; else if (os_val == NV_CTRL_OPERATING_SYSTEM_FREEBSD) os = "FreeBSD"; else if (os_val == NV_CTRL_OPERATING_SYSTEM_SUNOS) os = "SunOS"; } if (!os) os = "Unknown"; /* NV_CTRL_ARCHITECTURE */ ret = NvCtrlGetAttribute(handle, NV_CTRL_ARCHITECTURE, &tmp); arch = NULL; if (ret == NvCtrlSuccess) { if (tmp == NV_CTRL_ARCHITECTURE_X86) arch = "x86"; else if (tmp == NV_CTRL_ARCHITECTURE_X86_64) arch = "x86_64"; else if (tmp == NV_CTRL_ARCHITECTURE_IA64) arch = "ia64"; else if (tmp == NV_CTRL_ARCHITECTURE_ARM) arch = "ARM"; } if (!arch) arch = "Unknown"; os = g_strdup_printf("%s-%s", os, arch); /* NV_CTRL_STRING_NVIDIA_DRIVER_VERSION */ ret = NvCtrlGetStringAttribute(handle, NV_CTRL_STRING_NVIDIA_DRIVER_VERSION, &driver_version); if (ret != NvCtrlSuccess) driver_version = NULL; /* Display Name */ display_name = nv_standardize_screen_name(dname, -2); /* X Server Version */ server_version = g_strdup_printf("%d.%d", NvCtrlGetProtocolVersion(handle), NvCtrlGetProtocolRevision(handle)); /* Server Vendor String */ vendor_str = g_strdup(NvCtrlGetServerVendor(handle)); /* Server Vendor Version */ vendor_ver = get_server_vendor_version(handle); /* NV_CTRL_STRING_NV_CONTROL_VERSION */ ret = NvCtrlGetStringAttribute(handle, NV_CTRL_STRING_NV_CONTROL_VERSION, &nv_control_server_version); if (ret != NvCtrlSuccess) nv_control_server_version = NULL; /* # Logical X Screens */ if (xinerama_enabled) { num_screens = g_strdup_printf("%d (Xinerama)", NvCtrlGetScreenCount(handle)); } else { num_screens = g_strdup_printf("%d", NvCtrlGetScreenCount(handle)); } /* now, create the object */ object = g_object_new(CTK_TYPE_SERVER, NULL); ctk_object = CTK_SERVER(object); /* cache the attribute handle */ ctk_object->handle = handle; /* set container properties of the object */ gtk_box_set_spacing(GTK_BOX(ctk_object), 10); /* banner */ if (os_val == NV_CTRL_OPERATING_SYSTEM_LINUX) { banner = ctk_banner_image_new(BANNER_ARTWORK_PENGUIN); } else if (os_val == NV_CTRL_OPERATING_SYSTEM_FREEBSD) { banner = ctk_banner_image_new(BANNER_ARTWORK_BSD); } else if (os_val == NV_CTRL_OPERATING_SYSTEM_SUNOS) { banner = ctk_banner_image_new(BANNER_ARTWORK_SOLARIS); } else { banner = ctk_banner_image_new(BANNER_ARTWORK_PENGUIN); } gtk_box_pack_start(GTK_BOX(ctk_object), banner, FALSE, FALSE, 0); /* * This displays basic System information, including * display name, Operating system type and the NVIDIA driver version. */ vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(ctk_object), vbox, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new("System Information"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); table = gtk_table_new(2, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); add_table_row(table, 0, 0, 0.5, "Operating System:", 0, 0.5, os); add_table_row(table, 1, 0, 0.5, "NVIDIA Driver Version:", 0, 0.5, driver_version); /* * This displays basic X Server information, including * version number, vendor information and the number of * X Screens. */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new("X Server Information"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); table = gtk_table_new(15, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); add_table_row(table, 0, 0, 0.5, "Display Name:", 0, 0.5, display_name); /* separator */ add_table_row(table, 4, 0, 0.5, "Server Version Number:", 0, 0.5, server_version); add_table_row(table, 5, 0, 0.5, "Server Vendor String:", 0, 0.5, vendor_str); add_table_row(table, 6, 0, 0.5, "Server Vendor Version:", 0, 0.5, vendor_ver); /* separator */ add_table_row(table, 10, 0, 0, "NV-CONTROL Version:", 0, 0, nv_control_server_version); /* separator */ add_table_row(table, 14, 0, 0, "Screens:", 0, 0, num_screens); /* print special trademark text for FreeBSD */ if (os_val == NV_CTRL_OPERATING_SYSTEM_FREEBSD) { hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), hseparator, FALSE, FALSE, 0); label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), "" "\n" "The mark FreeBSD is a registered trademark " "of The FreeBSD Foundation and is used by " "NVIDIA with the permission of The FreeBSD " "Foundation." "\n\n" "The FreeBSD Logo is a trademark of The " "FreeBSD Foundation and is used by NVIDIA " "with the permission of The FreeBSD " "Foundation." "\n" ""); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); } g_free(display_name); g_free(os); XFree(driver_version); g_free(server_version); g_free(vendor_str); g_free(vendor_ver); XFree(nv_control_server_version); g_free(num_screens); gtk_widget_show_all(GTK_WIDGET(object)); return GTK_WIDGET(object); } /* * Server Information help screen */ GtkTextBuffer *ctk_server_create_help(GtkTextTagTable *table, CtkServer *ctk_object) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "X Server Information Help"); ctk_help_heading(b, &i, "Operating System"); ctk_help_para(b, &i, "This is the operating system on which the NVIDIA " "X driver is running; possible values are " "'Linux', 'FreeBSD', and 'SunOS'. This also specifies the " "platform on which the operating system is running, such " "as x86, x86_64, or ia64."); ctk_help_heading(b, &i, "NVIDIA Driver Version"); ctk_help_para(b, &i, "This is the version of the NVIDIA Accelerated " "Graphics Driver currently in use."); ctk_help_heading(b, &i, "Display Name"); ctk_help_para(b, &i, "This is the display connection string used to " "communicate with the X Server."); ctk_help_heading(b, &i, "Server Version"); ctk_help_para(b, &i, "This is the version number of the X Server."); ctk_help_heading(b, &i, "Server Vendor String"); ctk_help_para(b, &i, "This is the X Server vendor information string."); ctk_help_heading(b, &i, "Server Vendor Version"); ctk_help_para(b, &i, "This is the version number of the X Server " "vendor."); ctk_help_heading(b, &i, "NV-CONTROL Version"); ctk_help_para(b, &i, "This is the version number of the NV-CONTROL X extension, " "used by nvidia-settings to communicate with the " "NVIDIA X driver."); ctk_help_heading(b, &i, "Screens"); ctk_help_para(b, &i, "This is the number of X Screens on the " "display. (When Xinerama is enabled this is always 1)."); ctk_help_finish(b); return b; } nvidia-settings/src/gtk+-2.x/ctkcurve.h0000664000175000017500000000366512236467170020107 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_CURVE_H__ #define __CTK_CURVE_H__ G_BEGIN_DECLS #define CTK_TYPE_CURVE (ctk_curve_get_type()) #define CTK_CURVE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_CURVE, CtkCurve)) #define CTK_CURVE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_CURVE, CtkCurveClass)) #define CTK_IS_CURVE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_CURVE)) #define CTK_IS_CURVE_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_CURVE)) #define CTK_CURVE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_CURVE, CtkCurveClass)) typedef struct _CtkCurve CtkCurve; typedef struct _CtkCurveClass CtkCurveClass; struct _CtkCurve { GtkDrawingArea parent; NvCtrlAttributeHandle *handle; GtkWidget *color; GdkColor gdk_color_red; GdkColor gdk_color_green; GdkColor gdk_color_blue; GdkColormap *gdk_colormap; GdkPixmap *gdk_pixmap; GdkGC *gdk_gc; gint width; gint height; }; struct _CtkCurveClass { GtkDrawingAreaClass parent_class; }; GType ctk_curve_get_type (void) G_GNUC_CONST; GtkWidget* ctk_curve_new (NvCtrlAttributeHandle *, GtkWidget *); G_END_DECLS #endif /* __CTK_CURVE_H__ */ nvidia-settings/src/gtk+-2.x/ctklicense.c0000664000175000017500000002506012236467170020371 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2009 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /**** INCLUDES ***************************************************************/ #include #include #include "ctklicense.h" #include "ctkutils.h" #include "ctkconfig.h" #include "ctkhelp.h" #include "ctkbanner.h" static const char * __license_pre_msg = "Please read and accept the following license agreement:"; static const char * __license_msg = "TERMS AND CONDITIONS\n" "\n" "WARNING: THE SOFTWARE UTILITY YOU ARE ABOUT TO " "ENABLE (\"UTILITY\") MAY CAUSE SYSTEM DAMAGE AND " "VOID WARRANTIES. THIS UTILITY RUNS YOUR COMPUTER " "SYSTEM OUT OF THE MANUFACTURER'S DESIGN " "SPECIFICATIONS, INCLUDING, BUT NOT LIMITED TO: " "HIGHER SYSTEM VOLTAGES, ABOVE NORMAL " "TEMPERATURES, EXCESSIVE FREQUENCIES, AND " "CHANGES TO BIOS THAT MAY CORRUPT THE BIOS. YOUR " "COMPUTER'S OPERATING SYSTEM MAY HANG AND RESULT " "IN DATA LOSS OR CORRUPTED IMAGES. DEPENDING ON " "THE MANUFACTURER OF YOUR COMPUTER SYSTEM, THE " "COMPUTER SYSTEM, HARDWARE AND SOFTWARE " "WARRANTIES MAY BE VOIDED, AND YOU MAY NOT " "RECEIVE ANY FURTHER MANUFACTURER SUPPORT." "NVIDIA DOES NOT PROVIDE CUSTOMER SERVICE SUPPORT " "FOR THIS UTILITY. IT IS FOR THESE REASONS THAT " "ABSOLUTELY NO WARRANTY OR GUARANTEE IS EITHER " "EXPRESS OR IMPLIED. BEFORE ENABLING AND USING, YOU " "SHOULD DETERMINE THE SUITABILITY OF THE UTILITY " "FOR YOUR INTENDED USE, AND YOU SHALL ASSUME ALL " "RESPONSIBILITY IN CONNECTION THEREWITH." "\n" "\n" "DISCLAIMER OF WARRANTIES\n" "\n" "ALL MATERIALS, INFORMATION, AND SOFTWARE " "PRODUCTS, INCLUDED IN OR MADE AVAILABLE THROUGH " "THIS UTILITY ARE PROVIDED \"AS IS\" AND \"AS AVAILABLE\" " "FOR YOUR USE. THE UTILITY IS PROVIDED WITHOUT " "WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, " "INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF " "MERCHANTABILITY, FITNESS FOR A PARTICULAR " "PURPOSE, OR NONINFRINGEMENT. NVIDIA AND ITS " "SUBSIDIARIES DO NOT WARRANT THAT THE UTILITY IS " "RELIABLE OR CORRECT; THAT ANY DEFECTS OR ERRORS " "WILL BE CORRECTED; OR THAT THE UTILITY IS FREE OF " "VIRUSES OR OTHER HARMFUL COMPONENTS. YOUR USE " "OF THE UTILITY IS SOLELY AT YOUR RISK. BECAUSE SOME " "JURISDICTIONS DO NOT PERMIT THE EXCLUSION OF " "CERTAIN WARRANTIES, THESE EXCLUSIONS MAY NOT " "APPLY TO YOU." "\n" "\n" "LIMITATION OF LIABILITY\n" "\n" "UNDER NO CIRCUMSTANCES SHALL NVIDIA AND ITS " "SUBSIDIARIES BE LIABLE FOR ANY DIRECT, INDIRECT, " "PUNITIVE, INCIDENTAL, SPECIAL, OR CONSEQUENTIAL " "DAMAGES THAT RESULT FROM THE USE OF, OR INABILITY " "TO USE, THE UTILITY. THIS LIMITATION APPLIES WHETHER " "THE ALLEGED LIABILITY IS BASED ON CONTRACT, TORT, " "NEGLIGENCE, STRICT LIABILITY, OR ANY OTHER BASIS, " "EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF " "SUCH DAMAGE. BECAUSE SOME JURISDICTIONS DO NOT " "ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR " "CONSEQUENTIAL DAMAGES, NVIDIA'S LIABILITY IN SUCH " "JURISDICTIONS SHALL BE LIMITED TO THE EXTENT " "PERMITTED BY LAW." "\n" "IF YOU HAVE READ, UNDERSTOOD, AND AGREE TO ALL OF " "THE ABOVE TERMS AND CONDITIONS, CLICK THE \"YES\" " "BUTTON BELOW." "\n" "IF YOU DO NOT AGREE WITH ALL OF THE ABOVE TERMS " "AND CONDITIONS, THEN CLICK ON THE \"NO\" BUTTON " "BELOW, AND DO NOT ENABLE OR USE THE UTILITY."; GType ctk_license_dialog_get_type(void) { static GType ctk_license_dialog_type = 0; if (!ctk_license_dialog_type) { static const GTypeInfo ctk_license_dialog_info = { sizeof (CtkLicenseDialogClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init, */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkLicenseDialog), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_license_dialog_type = g_type_register_static(GTK_TYPE_VBOX, "CtkLicenseDialog", &ctk_license_dialog_info, 0); } return ctk_license_dialog_type; } /***** * * Callback Function - This function gets called when the user scrolls * the license agreement text. Once the user has scrolled to the end * of the document, the YES button is activated. * */ static void license_scrolled(GtkRange *range, gpointer user_data) { CtkLicenseDialog *ctk_license_dialog = CTK_LICENSE_DIALOG(user_data); GtkAdjustment *adj = gtk_range_get_adjustment(range); /* Enable the dialog's "YES" button once user reaches end of license */ if ( adj->value + adj->page_size >= adj->upper ) { gtk_dialog_set_response_sensitive(GTK_DIALOG( ctk_license_dialog->dialog), GTK_RESPONSE_ACCEPT, TRUE); } } /***** * * ctk_license_run_dialog() - Resize license dialog window and run license * dialog. * */ gint ctk_license_run_dialog(CtkLicenseDialog *ctk_license_dialog) { gint w, h; gint result; GtkRange *range; GtkAdjustment *adj; GdkScreen * s = gtk_window_get_screen(GTK_WINDOW(GTK_DIALOG(ctk_license_dialog->dialog))); /* Reset dialog window size */ gtk_window_get_size(GTK_WINDOW(GTK_DIALOG(ctk_license_dialog->dialog)), &w, &h); /* Make license dialog default to 55% of the screen height */ h = (gint)(0.55f * gdk_screen_get_height(s)); w = 1; gtk_window_resize(GTK_WINDOW(GTK_DIALOG(ctk_license_dialog->dialog)), w, h); /* Reset scroll bar to the top */ range = GTK_RANGE(GTK_SCROLLED_WINDOW(ctk_license_dialog->window)->vscrollbar); adj = gtk_range_get_adjustment(range); gtk_adjustment_set_value(adj, 0.0f); gtk_widget_show_all(ctk_license_dialog->dialog); /* Sensitize the YES button */ if ( adj->page_size >= adj->upper ) { gtk_dialog_set_response_sensitive(GTK_DIALOG( ctk_license_dialog->dialog), GTK_RESPONSE_ACCEPT, TRUE); } else { gtk_dialog_set_response_sensitive(GTK_DIALOG( ctk_license_dialog->dialog), GTK_RESPONSE_ACCEPT, FALSE); } result = gtk_dialog_run (GTK_DIALOG(ctk_license_dialog->dialog)); gtk_widget_hide_all(ctk_license_dialog->dialog); return result; } GtkWidget* ctk_license_dialog_new(GtkWidget *parent, gchar *panel_name) { GObject *object; CtkLicenseDialog *ctk_license_dialog; GtkWidget *hbox, *label, *scrollWin, *event; gchar *enable_message; object = g_object_new(CTK_TYPE_LICENSE_DIALOG, NULL); ctk_license_dialog = CTK_LICENSE_DIALOG(object); /* Create the enable dialog */ ctk_license_dialog->dialog = gtk_dialog_new_with_buttons("License Agreement", GTK_WINDOW(gtk_widget_get_parent( GTK_WIDGET(parent))), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_YES, GTK_RESPONSE_ACCEPT, GTK_STOCK_NO, GTK_RESPONSE_REJECT, NULL ); hbox = gtk_hbox_new(TRUE, 10); label = gtk_label_new(__license_pre_msg); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 10); gtk_box_pack_start(GTK_BOX(GTK_DIALOG( ctk_license_dialog->dialog)->vbox), hbox, FALSE, FALSE, 10); scrollWin = gtk_scrolled_window_new(NULL, NULL); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new(""); event = gtk_event_box_new(); ctk_force_text_colors_on_widget(event); ctk_license_dialog->window = scrollWin; gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_label_set_markup(GTK_LABEL(label), __license_msg); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollWin), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_container_add(GTK_CONTAINER(event), hbox); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollWin), event); hbox = gtk_hbox_new(TRUE, 10); gtk_box_pack_start(GTK_BOX(hbox), scrollWin, TRUE, TRUE, 10); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ctk_license_dialog->dialog)->vbox), hbox, TRUE, TRUE, 10); hbox = gtk_hbox_new(FALSE, 10); enable_message = g_strdup_printf("To use the features on the %s panel you\n" "must agree to the terms of the preceding " "license agreement.\nDo you accept this " "agreement?", panel_name); label = gtk_label_new(enable_message); g_free(enable_message); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 15); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ctk_license_dialog->dialog)->vbox), hbox, FALSE, FALSE, 10); g_signal_connect((gpointer) GTK_RANGE(GTK_SCROLLED_WINDOW(scrollWin)->vscrollbar), "value_changed", G_CALLBACK(license_scrolled), (gpointer) ctk_license_dialog); return GTK_WIDGET(object); } /* ctk_license_dialog_new() */ nvidia-settings/src/gtk+-2.x/ctkedid.h0000664000175000017500000000436512236467170017666 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_EDID_H__ #define __CTK_EDID_H__ #include "ctkevent.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_EDID (ctk_edid_get_type()) #define CTK_EDID(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_EDID, \ CtkEdid)) #define CTK_EDID_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_EDID, \ CtkEdidClass)) #define CTK_IS_EDID(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_EDID)) #define CTK_IS_EDID_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_EDID)) #define CTK_EDID_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_EDID, \ CtkEdidClass)) typedef struct _CtkEdid CtkEdid; typedef struct _CtkEdidClass CtkEdidClass; struct _CtkEdid { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; GtkWidget *button; GtkWidget *file_selector; GtkWidget *file_format_binary_radio_button; GtkWidget *file_format_ascii_radio_button; const gchar *filename; char *name; gint file_format; }; struct _CtkEdidClass { GtkVBoxClass parent_class; }; GType ctk_edid_get_type (void) G_GNUC_CONST; GtkWidget* ctk_edid_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *, char *name); void ctk_edid_setup(CtkEdid *ctk_object); void add_acquire_edid_help(GtkTextBuffer *b, GtkTextIter *i); G_END_DECLS #endif /* __CTK_EDID_H__ */ nvidia-settings/src/gtk+-2.x/ctkbanner.c0000664000175000017500000004122712236467170020217 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2006 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * * This source file implements the banner widget. */ #include #include #include #include "ctkbanner.h" #include "common-utils.h" /* pixdata headers */ #include "background_pixdata.h" #include "background_tall_pixdata.h" #include "logo_pixdata.h" #include "logo_tall_pixdata.h" #include "antialias_pixdata.h" #include "bsd_pixdata.h" #include "clock_pixdata.h" #include "color_pixdata.h" #include "config_pixdata.h" #include "crt_pixdata.h" #include "dfp_pixdata.h" #include "display_config_pixdata.h" #include "framelock_pixdata.h" #include "glx_pixdata.h" #include "gpu_pixdata.h" #include "help_pixdata.h" #include "opengl_pixdata.h" #include "penguin_pixdata.h" #include "gvi_pixdata.h" #include "sdi_pixdata.h" #include "sdi_shared_sync_bnc_pixdata.h" #include "slimm_pixdata.h" #include "solaris_pixdata.h" #include "thermal_pixdata.h" #include "vcs_pixdata.h" #include "vdpau_pixdata.h" #include "x_pixdata.h" #include "xvideo_pixdata.h" #include "svp_3dvp_pixdata.h" static void ctk_banner_class_init (CtkBannerClass *); static void ctk_banner_finalize (GObject *); static gboolean ctk_banner_expose_event (GtkWidget *, GdkEventExpose *); static void ctk_banner_size_request (GtkWidget *, GtkRequisition *); static gboolean ctk_banner_configure_event (GtkWidget *, GdkEventConfigure *); static GObjectClass *parent_class; /* global shared copy of background and logo images */ static PBuf Background = { 0, 0, NULL }; static PBuf TallBackground = { 0, 0, NULL }; static PBuf Logo = { 0, 0, NULL }; static PBuf TallLogo = { 0, 0, NULL }; GType ctk_banner_get_type( void ) { static GType ctk_banner_type = 0; if (!ctk_banner_type) { static const GTypeInfo ctk_banner_info = { sizeof (CtkBannerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ctk_banner_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkBanner), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_banner_type = g_type_register_static(GTK_TYPE_DRAWING_AREA, "CtkBanner", &ctk_banner_info, 0); } return ctk_banner_type; } static void ctk_banner_class_init( CtkBannerClass *ctk_banner_class ) { GObjectClass *gobject_class; GtkWidgetClass *widget_class; widget_class = (GtkWidgetClass *) ctk_banner_class; gobject_class = (GObjectClass *) ctk_banner_class; parent_class = g_type_class_peek_parent(ctk_banner_class); gobject_class->finalize = ctk_banner_finalize; widget_class->expose_event = ctk_banner_expose_event; widget_class->size_request = ctk_banner_size_request; widget_class->configure_event = ctk_banner_configure_event; } static void ctk_banner_finalize( GObject *object ) { CtkBanner *ctk_banner = CTK_BANNER(object); if (ctk_banner->back.pixbuf) g_object_unref(ctk_banner->back.pixbuf); if (ctk_banner->artwork.pixbuf) g_object_unref(ctk_banner->artwork.pixbuf); if (ctk_banner->logo->pixbuf) g_object_unref(ctk_banner->logo->pixbuf); if (ctk_banner->background->pixbuf) g_object_unref(ctk_banner->background->pixbuf); } static gboolean ctk_banner_expose_event( GtkWidget *widget, GdkEventExpose *event ) { CtkBanner *ctk_banner = CTK_BANNER(widget); GdkRectangle *rects; int n_rects; int i; /* copy the backing pixbuf into the exposed portion of the window */ gdk_region_get_rectangles(event->region, &rects, &n_rects); for (i = 0; i < n_rects; i++) { gdk_draw_pixbuf(widget->window, widget->style->fg_gc[GTK_STATE_NORMAL], ctk_banner->back.pixbuf, rects[i].x, rects[i].y, rects[i].x, rects[i].y, rects[i].width, rects[i].height, GDK_RGB_DITHER_NORMAL, 0, 0); } g_free(rects); return FALSE; } /* * ctk_banner_configure_event() - the banner was configured; composite * the backing pixbuf image */ static gboolean ctk_banner_configure_event( GtkWidget *widget, GdkEventConfigure *event ) { CtkBanner *ctk_banner = CTK_BANNER(widget); int x, y, w, h, needed_w, needed_h; /* free the pixbuf we already have one */ if (ctk_banner->back.pixbuf) g_object_unref(ctk_banner->back.pixbuf); /* allocate a backing pixbuf the size of the new window */ ctk_banner->back.pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, // colorSpace FALSE, // has_alpha (no alpha needed for backing pixbuf) gdk_pixbuf_get_bits_per_sample (ctk_banner->background->pixbuf), event->width, event->height); ctk_banner->back.w = gdk_pixbuf_get_width(ctk_banner->back.pixbuf); ctk_banner->back.h = gdk_pixbuf_get_height(ctk_banner->back.pixbuf); /* clear the backing pixbuf to black */ gdk_pixbuf_fill(ctk_banner->back.pixbuf, 0x00000000); /* copy the base image into the backing pixbuf */ w = NV_MIN(ctk_banner->background->w, ctk_banner->back.w); h = NV_MIN(ctk_banner->background->h, ctk_banner->back.h); gdk_pixbuf_copy_area(ctk_banner->background->pixbuf, // src 0, // src_x 0, // src_y w, // width h, // height ctk_banner->back.pixbuf, // dest 0, // dest_x 0); // dest_y /* * composite the logo into the backing pixbuf; positioned in the * upper right corner of the backing pixbuf. We should only do * this, though, if the backing pixbuf is large enough to contain * the logo */ needed_w = ctk_banner->logo->w + ctk_banner->logo_pad_x; needed_h = ctk_banner->logo->h + ctk_banner->logo_pad_y; if ((ctk_banner->back.w >= needed_w) && (ctk_banner->back.h >= needed_h)) { w = ctk_banner->logo->w; h = ctk_banner->logo->h; x = ctk_banner->back.w - w; y = 0; ctk_banner->logo_x = x - ctk_banner->logo_pad_x; ctk_banner->logo_y = y + ctk_banner->logo_pad_y; gdk_pixbuf_composite(ctk_banner->logo->pixbuf, // src ctk_banner->back.pixbuf, // dest ctk_banner->logo_x, // dest_x ctk_banner->logo_y, // dest_y w, // dest_width h, // dest_height ctk_banner->logo_x, // offset_x ctk_banner->logo_y, // offset_y 1.0, // scale_x 1.0, // scale_y GDK_INTERP_BILINEAR, // interp_type 255); // overall_alpha } /* * composite the artwork into the lower left corner of the backing * pixbuf */ needed_w = ctk_banner->artwork.w + ctk_banner->artwork_pad_x; needed_h = ctk_banner->artwork.h; if ((ctk_banner->back.w >= needed_w) && (ctk_banner->back.h >= needed_h)) { w = ctk_banner->artwork.w; h = ctk_banner->artwork.h; x = 0; y = ctk_banner->back.h - h; ctk_banner->artwork_x = x + ctk_banner->artwork_pad_x; ctk_banner->artwork_y = y; gdk_pixbuf_composite(ctk_banner->artwork.pixbuf, // src ctk_banner->back.pixbuf, // dest ctk_banner->artwork_x, // dest_x ctk_banner->artwork_y, // dest_y w, // dest_width h, // dest_height ctk_banner->artwork_x, // offset_x ctk_banner->artwork_y, // offset_y 1.0, // scale_x 1.0, // scale_y GDK_INTERP_BILINEAR, // interp_type 255); // overall_alpha /* Do any user-specific compositing */ if (ctk_banner->callback_func) { ctk_banner->callback_func(ctk_banner, ctk_banner->callback_data); } } return FALSE; } static void ctk_banner_size_request( GtkWidget *widget, GtkRequisition *requisition ) { CtkBanner *ctk_banner = CTK_BANNER(widget); requisition->width = NV_MAX(400, ctk_banner->logo->w + ctk_banner->artwork.w + ctk_banner->logo_pad_x + ctk_banner->artwork_pad_x); requisition->height = ctk_banner->background->h; } /* * select_artwork() - given a BannerArtworkType, lookup the pixdata * and other related data */ static gboolean select_artwork(BannerArtworkType artwork, gboolean *tall, int *pad_x, const GdkPixdata **pixdata) { static const struct { BannerArtworkType artwork; gboolean tall; int pad_x; const GdkPixdata *pixdata; } ArtworkTable[] = { /* artwork tall pad_x pixdata */ { BANNER_ARTWORK_ANTIALIAS, FALSE, 16, &antialias_pixdata }, { BANNER_ARTWORK_BSD, TRUE, 16, &bsd_pixdata }, { BANNER_ARTWORK_CLOCK, FALSE, 16, &clock_pixdata }, { BANNER_ARTWORK_COLOR, FALSE, 16, &color_pixdata }, { BANNER_ARTWORK_CONFIG, FALSE, 16, &config_pixdata }, { BANNER_ARTWORK_CRT, FALSE, 16, &crt_pixdata }, { BANNER_ARTWORK_DFP, FALSE, 16, &dfp_pixdata }, { BANNER_ARTWORK_DISPLAY_CONFIG, FALSE, 16, &display_config_pixdata }, { BANNER_ARTWORK_FRAMELOCK, FALSE, 16, &framelock_pixdata }, { BANNER_ARTWORK_GLX, FALSE, 16, &glx_pixdata }, { BANNER_ARTWORK_GPU, FALSE, 16, &gpu_pixdata }, { BANNER_ARTWORK_GVI, FALSE, 16, &gvi_pixdata }, { BANNER_ARTWORK_HELP, FALSE, 16, &help_pixdata }, { BANNER_ARTWORK_OPENGL, FALSE, 16, &opengl_pixdata }, { BANNER_ARTWORK_PENGUIN, TRUE, 16, &penguin_pixdata }, { BANNER_ARTWORK_SDI, FALSE, 16, &sdi_pixdata }, { BANNER_ARTWORK_SDI_SHARED_SYNC_BNC, FALSE, 16, &sdi_shared_sync_bnc_pixdata }, { BANNER_ARTWORK_SLIMM, FALSE, 16, &slimm_pixdata }, { BANNER_ARTWORK_SOLARIS, TRUE, 16, &solaris_pixdata }, { BANNER_ARTWORK_THERMAL, FALSE, 16, &thermal_pixdata }, { BANNER_ARTWORK_VCS, FALSE, 16, &vcs_pixdata }, { BANNER_ARTWORK_VDPAU, FALSE, 16, &vdpau_pixdata }, { BANNER_ARTWORK_X, FALSE, 16, &x_pixdata }, { BANNER_ARTWORK_XVIDEO, FALSE, 16, &xvideo_pixdata }, { BANNER_ARTWORK_SVP, FALSE, 16, &svp_3dvp_pixdata }, { BANNER_ARTWORK_INVALID, FALSE, 16, NULL }, }; int i; for (i = 0; ArtworkTable[i].artwork != BANNER_ARTWORK_INVALID; i++) { if (ArtworkTable[i].artwork == artwork) { *tall = ArtworkTable[i].tall; *pad_x = ArtworkTable[i].pad_x; *pixdata = ArtworkTable[i].pixdata; return TRUE; } } return FALSE; } /* * ctk_banner_new() - allocate new banner object; open and read in * pixbufs that we will need later. */ GtkWidget* ctk_banner_new(BannerArtworkType artwork) { GObject *object; CtkBanner *ctk_banner; const GdkPixdata *pixdata; int tall, pad_x; if (!select_artwork(artwork, &tall, &pad_x, &pixdata)) { return NULL; } object = g_object_new(CTK_TYPE_BANNER, NULL); ctk_banner = CTK_BANNER(object); ctk_banner->back.pixbuf = NULL; ctk_banner->artwork.pixbuf = NULL; ctk_banner->artwork_pad_x = pad_x; /* load the global images */ if (!Background.pixbuf) { Background.pixbuf = gdk_pixbuf_from_pixdata(&background_pixdata, TRUE, NULL); Background.w = gdk_pixbuf_get_width(Background.pixbuf); Background.h = gdk_pixbuf_get_height(Background.pixbuf); } g_object_ref(Background.pixbuf); if (!TallBackground.pixbuf) { TallBackground.pixbuf = gdk_pixbuf_from_pixdata(&background_tall_pixdata, TRUE, NULL); TallBackground.w = gdk_pixbuf_get_width(TallBackground.pixbuf); TallBackground.h = gdk_pixbuf_get_height(TallBackground.pixbuf); } g_object_ref(TallBackground.pixbuf); if (!Logo.pixbuf) { Logo.pixbuf = gdk_pixbuf_from_pixdata(&logo_pixdata, TRUE, NULL); Logo.w = gdk_pixbuf_get_width(Logo.pixbuf); Logo.h = gdk_pixbuf_get_height(Logo.pixbuf); } g_object_ref(Logo.pixbuf); if (!TallLogo.pixbuf) { TallLogo.pixbuf = gdk_pixbuf_from_pixdata(&logo_tall_pixdata, TRUE, NULL); TallLogo.w = gdk_pixbuf_get_width(TallLogo.pixbuf); TallLogo.h = gdk_pixbuf_get_height(TallLogo.pixbuf); } g_object_ref(TallLogo.pixbuf); /* * assign fields based on whether the artwork is tall; XXX these * may need to be tweaked */ if (tall) { ctk_banner->logo_pad_x = 11; ctk_banner->logo_pad_y = 0; ctk_banner->background = &TallBackground; ctk_banner->logo = &TallLogo; } else { ctk_banner->logo_pad_x = 10; ctk_banner->logo_pad_y = 10; ctk_banner->background = &Background; ctk_banner->logo = &Logo; } /* load the artwork pixbuf */ ctk_banner->artwork.pixbuf = gdk_pixbuf_from_pixdata(pixdata, TRUE, NULL); ctk_banner->artwork.w = gdk_pixbuf_get_width(ctk_banner->artwork.pixbuf); ctk_banner->artwork.h = gdk_pixbuf_get_height(ctk_banner->artwork.pixbuf); return GTK_WIDGET(object); } void ctk_banner_set_composite_callback (CtkBanner *ctk_banner, ctk_banner_composite_callback func, void *data) { ctk_banner->callback_func = func; ctk_banner->callback_data = data; } /* * CTK composited banner image widget creation * */ GtkWidget* ctk_banner_image_new_with_callback(BannerArtworkType artwork, ctk_banner_composite_callback callback, void *data) { GtkWidget *image; GtkWidget *hbox; GtkWidget *frame; image = ctk_banner_new(artwork); if (!image) return NULL; ctk_banner_set_composite_callback(CTK_BANNER(image), callback, data); hbox = gtk_hbox_new(FALSE, 0); frame = gtk_frame_new(NULL); gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(frame), image); return hbox; } GtkWidget* ctk_banner_image_new(BannerArtworkType artwork) { return ctk_banner_image_new_with_callback(artwork, NULL, NULL); } nvidia-settings/src/gtk+-2.x/ctkmultisample.h0000664000175000017500000000514412236467170021311 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_MULTISAMPLE_H__ #define __CTK_MULTISAMPLE_H__ #include "ctkevent.h" #include "ctkconfig.h" #include "ctkdropdownmenu.h" G_BEGIN_DECLS #define CTK_TYPE_MULTISAMPLE (ctk_multisample_get_type()) #define CTK_MULTISAMPLE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_MULTISAMPLE, CtkMultisample)) #define CTK_MULTISAMPLE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_MULTISAMPLE, \ CtkMultisampleClass)) #define CTK_IS_MULTISAMPLE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_MULTISAMPLE)) #define CTK_IS_MULTISAMPLE_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_MULTISAMPLE)) #define CTK_MULTISAMPLE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_MULTISAMPLE, \ CtkMultisampleClass)) typedef struct _CtkMultisample CtkMultisample; typedef struct _CtkMultisampleClass CtkMultisampleClass; struct _CtkMultisample { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; GtkWidget *fsaa_app_override_check_button; GtkWidget *fsaa_menu; GtkWidget *fsaa_scale; GtkWidget *fxaa_enable_check_button; GtkWidget *log_aniso_app_override_check_button; GtkWidget *log_aniso_scale; GtkWidget *texture_sharpening_button; CtkDropDownMenu *d; guint active_attributes; gint fsaa_translation_table[NV_CTRL_FSAA_MODE_MAX + 1]; gint fsaa_translation_table_size; }; struct _CtkMultisampleClass { GtkVBoxClass parent_class; }; GType ctk_multisample_get_type (void) G_GNUC_CONST; GtkWidget* ctk_multisample_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *); GtkTextBuffer *ctk_multisample_create_help(GtkTextTagTable *, CtkMultisample *); G_END_DECLS #endif /* __CTK_MULTISAMPLE_H__ */ nvidia-settings/src/gtk+-2.x/ctkgvo-sync.h0000664000175000017500000000625412236467170020525 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_GVO_SYNC_H__ #define __CTK_GVO_SYNC_H__ #include "ctkevent.h" #include "ctkconfig.h" #include "ctkgvo.h" G_BEGIN_DECLS #define CTK_TYPE_GVO_SYNC (ctk_gvo_sync_get_type()) #define CTK_GVO_SYNC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_GVO_SYNC, \ CtkGvoSync)) #define CTK_GVO_SYNC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_GVO_SYNC, \ CtkGvoSyncClass)) #define CTK_IS_GVO_SYNC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_GVO_SYNC)) #define CTK_IS_GVO_SYNC_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_GVO_SYNC)) #define CTK_GVO_SYNC_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_GVO_SYNC, \ CtkGvoSyncClass)) typedef struct _CtkGvoSync CtkGvoSync; typedef struct _CtkGvoSyncClass CtkGvoSyncClass; struct _CtkGvoSync { GtkVBox parent; NvCtrlAttributeHandle *handle; GtkWidget *parent_window; CtkConfig *ctk_config; CtkEvent *ctk_event; /* State */ gint caps; // SDI device capabilities gint sync_mode; // NV_CTRL_GVO_SYNC_MODE gint input_video_format; // NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT gint sync_source; // NV_CTRL_ SDI and COMP sync formats... gint sdi_sync_input_detected; gint comp_sync_input_detected; gint comp_mode; gint sync_lock_status; // Genlocked/Framelock status /* Widgets */ GtkWidget *frame; CtkGvo *gvo_parent; GtkWidget *banner_box; GtkWidget *input_video_format_text_entry; GtkWidget *input_video_format_detect_button; GtkWidget *composite_termination_button; GtkWidget *sync_mode_menu; GtkWidget *sync_format_menu; // SDI/Composite sync format GtkWidget *sync_lock_status_text; GtkWidget *hsync_delay_spin_button; GtkWidget *vsync_delay_spin_button; GdkCursor *wait_cursor; }; struct _CtkGvoSyncClass { GtkVBoxClass parent_class; }; GType ctk_gvo_sync_get_type (void) G_GNUC_CONST; GtkWidget* ctk_gvo_sync_new (NvCtrlAttributeHandle *, GtkWidget *, CtkConfig *, CtkEvent *, CtkGvo *); GtkTextBuffer* ctk_gvo_sync_create_help(GtkTextTagTable *, CtkGvoSync *); void ctk_gvo_sync_select(GtkWidget *); void ctk_gvo_sync_unselect(GtkWidget *); //GtkTextBuffer* ctk_gvo_sync_create_help (GtkTextTagTable *table); G_END_DECLS #endif /* __CTK_GVO_SYNC_H__ */ nvidia-settings/src/gtk+-2.x/ctkxvideo.c0000664000175000017500000003310012236467170020237 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "NvCtrlAttributes.h" #include "NVCtrlLib.h" #include "msg.h" #include "ctkbanner.h" #include "ctkxvideo.h" #include "ctkutils.h" #include "ctkhelp.h" static const char *__xv_sync_to_display_help = "This controls which display device will be synched to when " "XVideo Sync To VBlank is enabled."; #define FRAME_PADDING 5 #define __XV_SYNC_TO_DISPLAY 1 GType ctk_xvideo_get_type( void ) { static GType ctk_xvideo_type = 0; if (!ctk_xvideo_type) { static const GTypeInfo ctk_xvideo_info = { sizeof (CtkXVideoClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof(CtkXVideo), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_xvideo_type = g_type_register_static (GTK_TYPE_VBOX, "CtkXVideo", &ctk_xvideo_info, 0); } return ctk_xvideo_type; } /* * Updates the status bar for when a change occured. */ static void post_xv_sync_to_display_update(CtkXVideo *ctk_xvideo, GtkWidget *active_button) { const gchar *label; label = gtk_button_get_label(GTK_BUTTON(active_button)); ctk_config_statusbar_message(ctk_xvideo->ctk_config, "XVideo application syncing to %s.", label); } /* * xv_sync_to_display_id_toggled() - callback function for changes to the * sync_to_display radio button group; if the specified radio button is * active, send xv_sync_to_display state to the server */ static void xv_sync_to_display_id_toggled(GtkWidget *widget, gpointer user_data) { CtkXVideo *ctk_xvideo = CTK_XVIDEO(user_data); gboolean enabled; gint device_id; enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); if (!enabled) { /* Ignore 'disable' events. */ return; } user_data = g_object_get_data(G_OBJECT(widget), "display_id"); device_id = GPOINTER_TO_INT(user_data); NvCtrlSetAttribute(ctk_xvideo->handle, NV_CTRL_XV_SYNC_TO_DISPLAY_ID, device_id); post_xv_sync_to_display_update(ctk_xvideo, widget); } /* * Sets the radio button at the given index as enabled. */ static void xv_sync_to_display_set_enabled(CtkXVideo *ctk_xvideo, GtkWidget *button, gboolean update_status) { /* turn off signal handling. Note that we only disable events * for the button being enabled since we ignore disable events. */ g_signal_handlers_block_by_func (G_OBJECT(button), G_CALLBACK(xv_sync_to_display_id_toggled), (gpointer) ctk_xvideo); /* set the button as active */ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); /* turn on signal handling */ g_signal_handlers_unblock_by_func (G_OBJECT(button), G_CALLBACK(xv_sync_to_display_id_toggled), (gpointer) ctk_xvideo); if (update_status) { post_xv_sync_to_display_update(ctk_xvideo, button); } } /* * xv_sync_to_display_radio_button_add() - create a radio button and plug it * into the xv_sync_display_buttons radio group. */ static GtkWidget *xv_sync_to_display_radio_button_add(CtkXVideo *ctk_xvideo, GtkWidget *last_button, gint display_id) { Bool valid; char *name; char *randr; gchar *label; GtkWidget *button; GSList *slist; valid = XNVCTRLQueryTargetStringAttribute(NvCtrlGetDisplayPtr(ctk_xvideo->handle), NV_CTRL_TARGET_TYPE_DISPLAY, display_id, 0, NV_CTRL_STRING_DISPLAY_DEVICE_NAME, &name); if (!valid) { name = NULL; } valid = XNVCTRLQueryTargetStringAttribute(NvCtrlGetDisplayPtr(ctk_xvideo->handle), NV_CTRL_TARGET_TYPE_DISPLAY, display_id, 0, NV_CTRL_STRING_DISPLAY_NAME_RANDR, &randr); if (!valid) { randr = NULL; } if (name && randr) { label = g_strdup_printf("%s (%s)", name, randr); } else { label = g_strdup_printf("%s", name ? name : (randr ? randr : "Unknown")); } XFree(name); XFree(randr); if (last_button) { slist = gtk_radio_button_get_group(GTK_RADIO_BUTTON(last_button)); } else { slist = NULL; } button = gtk_radio_button_new_with_label(slist, label); g_free(label); gtk_box_pack_start(GTK_BOX(ctk_xvideo->xv_sync_to_display_button_box), button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(button), "display_id", GINT_TO_POINTER(display_id)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(xv_sync_to_display_id_toggled), (gpointer) ctk_xvideo); ctk_config_set_tooltip(ctk_xvideo->ctk_config, button, __xv_sync_to_display_help); return button; } /* * Rebuilds the list of display devices available for syncing. */ static void xv_sync_to_display_rebuild_buttons(CtkXVideo *ctk_xvideo, gboolean update_status) { ReturnStatus ret; int enabled_display_id; int *pData; int len; int i; GtkWidget *last_button; /* Remove all buttons */ ctk_empty_container(ctk_xvideo->xv_sync_to_display_button_box); /* Rebuild the list based on the curren configuration */ ret = NvCtrlGetAttribute(ctk_xvideo->handle, NV_CTRL_XV_SYNC_TO_DISPLAY_ID, &enabled_display_id); if (ret != NvCtrlSuccess) { nv_warning_msg("Failed to query XV Sync display ID on X screen %d.", NvCtrlGetTargetId(ctk_xvideo->handle)); return; } ret = NvCtrlGetBinaryAttribute(ctk_xvideo->handle, 0, NV_CTRL_BINARY_DATA_DISPLAYS_ENABLED_ON_XSCREEN, (unsigned char **)(&pData), &len); if (ret != NvCtrlSuccess) { nv_warning_msg("Failed to query list of displays assigned to X screen " " %d.", NvCtrlGetTargetId(ctk_xvideo->handle)); return; } /* Add a button for each display device */ last_button = NULL; for (i = 0; i < pData[0]; i++) { GtkWidget *button; int display_id = pData[1+i]; button = xv_sync_to_display_radio_button_add(ctk_xvideo, last_button, display_id); if (!button) { continue; } /* Make sure the enabled display is marked as so */ if (display_id == enabled_display_id) { xv_sync_to_display_set_enabled(ctk_xvideo, button, update_status); } /* Track the first button */ if (!last_button) { ctk_xvideo->xv_sync_to_display_buttons = button; } last_button = button; } gtk_widget_show_all(ctk_xvideo->xv_sync_to_display_button_box); } /* * Handles NV_CTRL_ENABLED_DISPLAYS events and updates * the list of displays in the UI. */ static void enabled_displays_handler(GtkObject *object, gpointer arg1, gpointer user_data) { CtkXVideo *ctk_xvideo = CTK_XVIDEO(user_data); xv_sync_to_display_rebuild_buttons(ctk_xvideo, TRUE); } /* * Handler for NV_CTRL_XV_SYNC_TO_DISPLAY_ID events. */ static void xv_sync_to_display_id_handler(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct = (CtkEventStruct *) arg1; CtkXVideo *ctk_xvideo = CTK_XVIDEO(user_data); GSList *slist; /* Find the right button and enable it */ slist = gtk_radio_button_get_group(GTK_RADIO_BUTTON(ctk_xvideo->xv_sync_to_display_buttons)); while (slist) { GtkWidget *button = GTK_WIDGET(slist->data); user_data = g_object_get_data(G_OBJECT(button), "display_id"); if (GPOINTER_TO_INT(user_data) == event_struct->value) { xv_sync_to_display_set_enabled(ctk_xvideo, button, TRUE); break; } slist = g_slist_next(slist); } } /* * ctk_xvideo_new() - constructor for the XVideo widget */ GtkWidget* ctk_xvideo_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event) { GObject *object; CtkXVideo *ctk_xvideo; GtkWidget *banner; GtkWidget *frame; GtkWidget *alignment; GtkWidget *vbox; int xv_overlay_present, xv_texture_present, xv_blitter_present; gboolean show_page; ReturnStatus ret; /* * before we do anything else, determine if any of the Xv adapters * are present */ ret = NvCtrlGetAttribute(handle, NV_CTRL_ATTR_EXT_XV_OVERLAY_PRESENT, &xv_overlay_present); if (ret != NvCtrlSuccess) { xv_overlay_present = FALSE; } ret = NvCtrlGetAttribute(handle, NV_CTRL_ATTR_EXT_XV_TEXTURE_PRESENT, &xv_texture_present); if (ret != NvCtrlSuccess) { xv_texture_present = FALSE; } ret = NvCtrlGetAttribute(handle, NV_CTRL_ATTR_EXT_XV_BLITTER_PRESENT, &xv_blitter_present); if (ret != NvCtrlSuccess) { xv_blitter_present = FALSE; } if (!xv_overlay_present && !xv_texture_present && !xv_blitter_present) { return NULL; } /* If nothing to show, bail */ show_page = FALSE; if (xv_texture_present || xv_blitter_present) { int display_id; ret = NvCtrlGetAttribute(handle, NV_CTRL_XV_SYNC_TO_DISPLAY_ID, &display_id); if (ret == NvCtrlSuccess) { show_page = TRUE; } } if (!show_page) { return NULL; } /* create the XVideo widget */ object = g_object_new(CTK_TYPE_XVIDEO, NULL); ctk_xvideo = CTK_XVIDEO(object); ctk_xvideo->handle = handle; ctk_xvideo->ctk_config = ctk_config; ctk_xvideo->active_attributes = 0; gtk_box_set_spacing(GTK_BOX(ctk_xvideo), 10); /* Video film banner */ banner = ctk_banner_image_new(BANNER_ARTWORK_XVIDEO); gtk_box_pack_start(GTK_BOX(object), banner, FALSE, FALSE, 0); /* Sync to display selection */ frame = gtk_frame_new("Sync to this display device"); gtk_box_pack_start(GTK_BOX(object), frame, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), FRAME_PADDING); gtk_container_add(GTK_CONTAINER(frame), vbox); ctk_xvideo->xv_sync_to_display_button_box = vbox; xv_sync_to_display_rebuild_buttons(ctk_xvideo, FALSE); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_XV_SYNC_TO_DISPLAY_ID), G_CALLBACK(xv_sync_to_display_id_handler), (gpointer) ctk_xvideo); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_ENABLED_DISPLAYS), G_CALLBACK(enabled_displays_handler), (gpointer) ctk_xvideo); alignment = gtk_alignment_new(1, 1, 0, 0); gtk_box_pack_start(GTK_BOX(object), alignment, TRUE, TRUE, 0); /* finally, show the widget */ gtk_widget_show_all(GTK_WIDGET(ctk_xvideo)); return GTK_WIDGET(ctk_xvideo); } GtkTextBuffer *ctk_xvideo_create_help(GtkTextTagTable *table, CtkXVideo *ctk_xvideo) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "X Server XVideo Settings Help"); ctk_help_para(b, &i, "The X Server XVideo Settings page uses the XVideo " "X extension."); if (ctk_xvideo->active_attributes & __XV_SYNC_TO_DISPLAY) { ctk_help_heading(b, &i, "Sync to this display device"); ctk_help_para(b, &i, "%s", __xv_sync_to_display_help); } ctk_help_finish(b); return b; } nvidia-settings/src/gtk+-2.x/ctkgvi.h0000664000175000017500000000433712236467170017545 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2009 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_GVI_H__ #define __CTK_GVI_H__ #include "NvCtrlAttributes.h" #include "ctkevent.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_GVI (ctk_gvi_get_type()) #define CTK_GVI(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_GVI, CtkGvi)) #define CTK_GVI_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_GVI, CtkGviClass)) #define CTK_IS_GVI(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_GVI)) #define CTK_IS_GVI_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_GVI)) #define CTK_GVI_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_GVI, CtkGviClass)) typedef struct _CtkGvi CtkGvi; typedef struct _CtkGviClass CtkGviClass; struct _CtkGvi { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; int num_jacks; int max_channels_per_jack; GtkWidget *gpu_name; GtkWidget *jack_channel_omenu; GtkWidget *input_info_vbox; GtkWidget *show_detailed_info_btn; unsigned int cur_jack_channel; unsigned int *jack_channel_table; }; struct _CtkGviClass { GtkVBoxClass parent_class; }; GType ctk_gvi_get_type (void) G_GNUC_CONST; GtkWidget* ctk_gvi_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *); GtkTextBuffer* ctk_gvi_create_help (GtkTextTagTable *, CtkGvi *); void ctk_gvi_start_timer (GtkWidget *); void ctk_gvi_stop_timer (GtkWidget *); G_END_DECLS #endif /* __CTK_GVI_H__ */ nvidia-settings/src/gtk+-2.x/ctkwindow.h0000664000175000017500000000526112236467170020264 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_WINDOW_H__ #define __CTK_WINDOW_H__ #include #include "NvCtrlAttributes.h" #include "parse.h" #include "config-file.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_WINDOW (ctk_window_get_type()) #define CTK_WINDOW(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_WINDOW, CtkWindow)) #define CTK_WINDOW_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_WINDOW, CtkWindowClass)) #define CTK_IS_WINDOW(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_WINDOW)) #define CTK_IS_WINDOW_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_WINDOW)) #define CTK_WINDOW_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_WINDOW, CtkWindowClass)) #define CTK_DISPLAY_DEVICE_CRT_MASK 0x000000FF #define CTK_DISPLAY_DEVICE_TV_MASK 0x0000FF00 #define CTK_DISPLAY_DEVICE_DFP_MASK 0x00FF0000 typedef struct _CtkWindow CtkWindow; typedef struct _CtkWindowClass CtkWindowClass; struct _CtkWindow { GtkWindow parent; GtkTreeStore *tree_store; GtkTreeView *treeview; GtkWidget *page_viewer; GtkWidget *page; CtkConfig *ctk_config; GtkWidget *ctk_help; GtkWidget *quit_dialog; ParsedAttribute *attribute_list; GtkTreeIter iter; GtkWidget *widget; GtkTextTagTable *help_tag_table; GtkTextBuffer *help_text_buffer; }; struct _CtkWindowClass { GtkWindowClass parent_class; }; GType ctk_window_get_type (void) G_GNUC_CONST; GtkWidget* ctk_window_new (ParsedAttribute *, ConfigProperties *conf, CtrlHandles *h); void ctk_window_set_active_page(CtkWindow *ctk_window, const gchar *label); void add_special_config_file_attributes(CtkWindow *ctk_window); G_END_DECLS #endif /* __CTK_WINDOW_H__ */ nvidia-settings/src/gtk+-2.x/ctkditheringcontrols.c0000664000175000017500000011044712236467170022514 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2010 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include "ctkconfig.h" #include "ctkhelp.h" #include "ctkditheringcontrols.h" #include "ctkdropdownmenu.h" /* function prototypes */ static void ctk_dither_controls_class_init(CtkDitheringControlsClass *ctk_object_class); static void ctk_dither_controls_finalize(GObject *object); static gboolean build_dithering_mode_table(CtkDitheringControls *ctk_dithering_controls); static gint map_nvctrl_value_to_table(CtkDitheringControls *ctk_dithering_controls, gint val); static Bool update_dithering_info(gpointer user_data); static void setup_dithering_info(CtkDitheringControls *ctk_dithering_controls); static void setup_reset_button(CtkDitheringControls *ctk_dithering_controls); static void setup_dithering_config_menu(CtkDitheringControls *ctk_dithering_controls); static void setup_dithering_mode_menu(CtkDitheringControls *ctk_dithering_controls); static void setup_dithering_depth_menu(CtkDitheringControls *ctk_dithering_controls); static void dithering_depth_menu_changed(GtkWidget *dithering_depth_menu, gpointer user_data); static void dithering_mode_menu_changed(GtkWidget *dithering_mode_menu, gpointer user_data); static void dithering_config_menu_changed(GtkWidget *dithering_config_menu, gpointer user_data); static void dithering_update_received(GtkObject *object, gpointer arg1, gpointer user_data); static void post_dithering_config_update(CtkDitheringControls *ctk_dithering_controls, gint dithering_config); static void post_dithering_mode_update(CtkDitheringControls *ctk_dithering_controls, gint dithering_mode); static void post_dithering_depth_update(CtkDitheringControls *ctk_dithering_controls, gint dithering_depth); static gint map_dithering_config_menu_idx_to_nvctrl(gint idx); static gint map_dithering_depth_menu_idx_to_nvctrl(gint idx); /* macros */ #define FRAME_PADDING 5 /* help text */ static const char * __dithering_help = "The Dithering Controls show the current state of dithering and allow " "changing the dithering configuration, mode and/or depth."; static const char * __dithering_config_help = "Dithering will be performed when dithering is enabled here and the " "panel's bitdepth is less than that of the GPU's internal pixel pipeline."; static const char * __dithering_mode_help = "Dithering mode can be Dynamic 2x2, Static 2x2 or Temporal " "depending on the type of the display device."; static const char * __dithering_depth_help = "The depth can be adjusted to 6 or 8 bits per channel depending on " "the type of display device."; GType ctk_dithering_controls_get_type(void) { static GType ctk_dithering_controls_type = 0; if (!ctk_dithering_controls_type) { static const GTypeInfo ctk_dithering_controls_info = { sizeof (CtkDitheringControlsClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ctk_dither_controls_class_init, /* class_init, */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkDitheringControls), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_dithering_controls_type = g_type_register_static (GTK_TYPE_VBOX, "CtkDitheringControls", &ctk_dithering_controls_info, 0); } return ctk_dithering_controls_type; } /* ctk_dithering_controls_get_type() */ static void ctk_dither_controls_class_init(CtkDitheringControlsClass *ctk_object_class) { GObjectClass *gobject_class = (GObjectClass *)ctk_object_class; gobject_class->finalize = ctk_dither_controls_finalize; } static void ctk_dither_controls_finalize(GObject *object) { CtkDitheringControls *ctk_object = CTK_DITHERING_CONTROLS(object); g_signal_handlers_disconnect_matched(G_OBJECT(ctk_object->ctk_event), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, (gpointer) ctk_object); } GtkWidget* ctk_dithering_controls_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event, GtkWidget *reset_button, char *name) { GObject *object; CtkDitheringControls *ctk_dithering_controls; GtkWidget *frame, *vbox, *hbox, *label; GtkWidget *table, *separator; CtkDropDownMenu *menu; ReturnStatus ret; int tmp; /* test that dithering is available before creating the widget */ ret = NvCtrlGetAttribute(handle, NV_CTRL_DITHERING, &tmp); if (ret != NvCtrlSuccess) { return NULL; } /* create the object */ object = g_object_new(CTK_TYPE_DITHERING_CONTROLS, NULL); if (!object) { return NULL; } ctk_dithering_controls = CTK_DITHERING_CONTROLS(object); ctk_dithering_controls->handle = handle; ctk_dithering_controls->ctk_event = ctk_event; ctk_dithering_controls->ctk_config = ctk_config; ctk_dithering_controls->reset_button = reset_button; ctk_dithering_controls->name = strdup(name); /* create main dithering box & frame */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, FALSE, FRAME_PADDING); ctk_dithering_controls->dithering_controls_box = hbox; frame = gtk_frame_new("Dithering Controls"); gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 0); table = gtk_table_new(5, 4, FALSE); gtk_container_add(GTK_CONTAINER(frame), table); gtk_table_set_row_spacings(GTK_TABLE(table), 5); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); /* Build Dithering widgets & pack them in table */ /* dropdown list for dithering configuration */ menu = (CtkDropDownMenu *) ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO); ctk_drop_down_menu_append_item(menu, "Auto", 0); ctk_drop_down_menu_append_item(menu, "Enabled", 1); ctk_drop_down_menu_append_item(menu, "Disabled", 2); ctk_dithering_controls->dithering_config_menu = GTK_WIDGET(menu); ctk_config_set_tooltip(ctk_config, ctk_dithering_controls->dithering_config_menu, __dithering_config_help); g_signal_connect(G_OBJECT(ctk_dithering_controls->dithering_config_menu), "changed", G_CALLBACK(dithering_config_menu_changed), (gpointer) ctk_dithering_controls); /* Packing label & dropdown */ hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Dithering: "); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_dithering_controls->dithering_config_menu, FALSE, FALSE, 0); /* Build CurrentDithering widget */ hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 2, 3, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Current Dithering: "); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 3, 4, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(NULL); ctk_dithering_controls->dithering_config_txt = label; gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); /* H-bar 1 */ vbox = gtk_vbox_new(FALSE, 0); separator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), separator, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), vbox, 0, 4, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); /* dropdown list for dithering modes - populated in setup */ ctk_dithering_controls->dithering_mode_menu = ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO); ctk_config_set_tooltip(ctk_config, ctk_dithering_controls->dithering_mode_menu, __dithering_mode_help); g_signal_connect(G_OBJECT(ctk_dithering_controls->dithering_mode_menu), "changed", G_CALLBACK(dithering_mode_menu_changed), (gpointer) ctk_dithering_controls); /* pack the label & drop down */ hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Mode: "); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); ctk_dithering_controls->dithering_mode_box = hbox; gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_dithering_controls->dithering_mode_menu, FALSE, FALSE, 0); /* Build CurrentMode widget */ hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 2, 3, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Current Mode: "); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 3, 4, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(NULL); ctk_dithering_controls->dithering_mode_txt = label; gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); /* H-bar 2 */ vbox = gtk_vbox_new(FALSE, 0); separator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), separator, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), vbox, 0, 4, 3, 4, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); /* dithering depth */ menu = (CtkDropDownMenu *) ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO); ctk_drop_down_menu_append_item(menu, "Auto", 0); ctk_drop_down_menu_append_item(menu, "6 bpc", 1); ctk_drop_down_menu_append_item(menu, "8 bpc", 2); ctk_dithering_controls->dithering_depth_menu = GTK_WIDGET(menu); ctk_config_set_tooltip(ctk_config, ctk_dithering_controls->dithering_depth_menu, __dithering_depth_help); g_signal_connect(G_OBJECT(ctk_dithering_controls->dithering_depth_menu), "changed", G_CALLBACK(dithering_depth_menu_changed), (gpointer) ctk_dithering_controls); /* Packing label & dropdown */ hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, 4, 5, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Depth: "); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); ctk_dithering_controls->dithering_depth_box = hbox; gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 4, 5, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_dithering_controls->dithering_depth_menu, FALSE, FALSE, 0); /* Build CurrentDitheringDepth widget */ hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 2, 3, 4, 5, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Current Depth: "); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 3, 4, 4, 5, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(NULL); ctk_dithering_controls->dithering_depth_txt = label; gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show_all(GTK_WIDGET(object)); ctk_dithering_controls_setup(ctk_dithering_controls); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_DITHERING), G_CALLBACK(dithering_update_received), (gpointer) ctk_dithering_controls); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_DITHERING_MODE), G_CALLBACK(dithering_update_received), (gpointer) ctk_dithering_controls); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_DITHERING_DEPTH), G_CALLBACK(dithering_update_received), (gpointer) ctk_dithering_controls); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_CURRENT_DITHERING), G_CALLBACK(dithering_update_received), (gpointer) ctk_dithering_controls); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_CURRENT_DITHERING_MODE), G_CALLBACK(dithering_update_received), (gpointer) ctk_dithering_controls); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_CURRENT_DITHERING_DEPTH), G_CALLBACK(dithering_update_received), (gpointer) ctk_dithering_controls); return GTK_WIDGET(object); } /* ctk_dithering_controls_new() */ /* * setup_reset_button() - enables the reset button if any of the current * settings are not the default. */ static void setup_reset_button(CtkDitheringControls *ctk_dithering_controls) { gint history; gint val; CtkDropDownMenu *dithering_config_menu; CtkDropDownMenu *dithering_mode_menu; CtkDropDownMenu *dithering_depth_menu; if (!GTK_WIDGET_SENSITIVE(ctk_dithering_controls->dithering_controls_box)) { /* Nothing is available, don't bother enabling the reset button yet. */ return; } /* The config menu is always available */ dithering_config_menu = CTK_DROP_DOWN_MENU(ctk_dithering_controls->dithering_config_menu); history = ctk_drop_down_menu_get_current_value(dithering_config_menu); val = map_dithering_config_menu_idx_to_nvctrl(history); if (val != NV_CTRL_DITHERING_AUTO) { goto enable; } if (GTK_WIDGET_SENSITIVE(ctk_dithering_controls->dithering_mode_box)) { dithering_mode_menu = CTK_DROP_DOWN_MENU(ctk_dithering_controls->dithering_mode_menu); history = ctk_drop_down_menu_get_current_value(dithering_mode_menu); val = ctk_dithering_controls->dithering_mode_table[history]; if (val != NV_CTRL_DITHERING_MODE_AUTO) { goto enable; } } if (GTK_WIDGET_SENSITIVE(ctk_dithering_controls->dithering_depth_box)) { dithering_depth_menu = CTK_DROP_DOWN_MENU(ctk_dithering_controls->dithering_depth_menu); history = ctk_drop_down_menu_get_current_value(dithering_depth_menu); val = map_dithering_depth_menu_idx_to_nvctrl(history); if (val != NV_CTRL_DITHERING_DEPTH_AUTO) { goto enable; } } /* Don't disable reset button here, since other settings that are not * managed by the ctk_image_slider here may need it enabled */ return; enable: gtk_widget_set_sensitive(ctk_dithering_controls->reset_button, TRUE); } static void setup_dithering_depth_menu(CtkDitheringControls *ctk_dithering_controls) { CtkDropDownMenu *dithering_depth_menu; gint val; ReturnStatus ret; dithering_depth_menu = CTK_DROP_DOWN_MENU(ctk_dithering_controls->dithering_depth_menu); /* dithering depth */ ret = NvCtrlGetAttribute(ctk_dithering_controls->handle, NV_CTRL_DITHERING_DEPTH, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_DITHERING_DEPTH_AUTO; } g_signal_handlers_block_by_func (G_OBJECT(ctk_dithering_controls->dithering_depth_menu), G_CALLBACK(dithering_depth_menu_changed), (gpointer) ctk_dithering_controls); ctk_drop_down_menu_set_current_value(dithering_depth_menu, val); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_dithering_controls->dithering_depth_menu), G_CALLBACK(dithering_depth_menu_changed), (gpointer) ctk_dithering_controls); } static void setup_dithering_mode_menu(CtkDitheringControls *ctk_dithering_controls) { CtkDropDownMenu *dithering_mode_menu; gint val, i; ReturnStatus ret; dithering_mode_menu = CTK_DROP_DOWN_MENU(ctk_dithering_controls->dithering_mode_menu); /* setup dithering modes */ build_dithering_mode_table(ctk_dithering_controls); g_signal_handlers_block_by_func (G_OBJECT(ctk_dithering_controls->dithering_mode_menu), G_CALLBACK(dithering_mode_menu_changed), (gpointer) ctk_dithering_controls); /* populate dropdown list for dithering modes */ ctk_drop_down_menu_reset(dithering_mode_menu); for (i = 0; i < ctk_dithering_controls->dithering_mode_table_size; i++) { switch (ctk_dithering_controls->dithering_mode_table[i]) { case NV_CTRL_DITHERING_MODE_DYNAMIC_2X2: ctk_drop_down_menu_append_item(dithering_mode_menu, "Dynamic 2x2", i); break; case NV_CTRL_DITHERING_MODE_STATIC_2X2: ctk_drop_down_menu_append_item(dithering_mode_menu, "Static 2x2", i); break; case NV_CTRL_DITHERING_MODE_TEMPORAL: ctk_drop_down_menu_append_item(dithering_mode_menu, "Temporal", i); break; default: case NV_CTRL_DITHERING_MODE_AUTO: ctk_drop_down_menu_append_item(dithering_mode_menu, "Auto", i); break; } } /* dithering mode */ ret = NvCtrlGetAttribute(ctk_dithering_controls->handle, NV_CTRL_DITHERING_MODE, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_DITHERING_MODE_AUTO; } val = map_nvctrl_value_to_table(ctk_dithering_controls, val); ctk_drop_down_menu_set_current_value(dithering_mode_menu, val); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_dithering_controls->dithering_mode_menu), G_CALLBACK(dithering_mode_menu_changed), (gpointer) ctk_dithering_controls); } static void setup_dithering_config_menu(CtkDitheringControls *ctk_dithering_controls) { CtkDropDownMenu *dithering_config_menu; gint val; dithering_config_menu = CTK_DROP_DOWN_MENU(ctk_dithering_controls->dithering_config_menu); /* dithering */ if (NvCtrlSuccess != NvCtrlGetAttribute(ctk_dithering_controls->handle, NV_CTRL_DITHERING, &val)) { val = NV_CTRL_DITHERING_AUTO; return; } g_signal_handlers_block_by_func (G_OBJECT(ctk_dithering_controls->dithering_config_menu), G_CALLBACK(dithering_config_menu_changed), (gpointer) ctk_dithering_controls); ctk_drop_down_menu_set_current_value(dithering_config_menu, val); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_dithering_controls->dithering_config_menu), G_CALLBACK(dithering_config_menu_changed), (gpointer) ctk_dithering_controls); } /* * ctk_dithering_controls_setup() - Setup routine for dithering attributes. Used * in DFP setup stage as well as for updating the GUI when there is change in * dithering mode or config (enabled/disabled). */ void ctk_dithering_controls_setup(CtkDitheringControls *ctk_dithering_controls) { if (!ctk_dithering_controls) { return; } /* setup dithering config menu */ setup_dithering_config_menu(ctk_dithering_controls); /* setup dithering mode menu */ setup_dithering_mode_menu(ctk_dithering_controls); /* setup dithering depth menu */ setup_dithering_depth_menu(ctk_dithering_controls); setup_dithering_info(ctk_dithering_controls); } /* ctk_dithering_controls_setup() */ static void setup_dithering_info(CtkDitheringControls *ctk_dithering_controls) { if (!update_dithering_info((gpointer)ctk_dithering_controls)) { gtk_widget_hide(ctk_dithering_controls->dithering_controls_box); } else { gtk_widget_show(ctk_dithering_controls->dithering_controls_box); } setup_reset_button(ctk_dithering_controls); } /* setup_dithering_info() */ static Bool update_dithering_info(gpointer user_data) { CtkDitheringControls *ctk_dithering_controls = CTK_DITHERING_CONTROLS(user_data); ReturnStatus ret; gint val; ret = NvCtrlGetAttribute(ctk_dithering_controls->handle, NV_CTRL_DITHERING, &val); if (ret != NvCtrlSuccess) { /* Dithering is not currently available */ return FALSE; } if (val == NV_CTRL_DITHERING_ENABLED || val == NV_CTRL_DITHERING_AUTO) { gtk_widget_set_sensitive(ctk_dithering_controls->dithering_mode_box, TRUE); gtk_widget_set_sensitive(ctk_dithering_controls->dithering_depth_box, TRUE); } else if (val == NV_CTRL_DITHERING_DISABLED) { gtk_widget_set_sensitive(ctk_dithering_controls->dithering_mode_box, FALSE); gtk_widget_set_sensitive(ctk_dithering_controls->dithering_depth_box, FALSE); } /* current dithering */ ret = NvCtrlGetAttribute(ctk_dithering_controls->handle, NV_CTRL_CURRENT_DITHERING, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_CURRENT_DITHERING_DISABLED; } if (val == NV_CTRL_CURRENT_DITHERING_ENABLED) { gtk_label_set_text(GTK_LABEL(ctk_dithering_controls->dithering_config_txt), "Enabled"); } else { gtk_label_set_text(GTK_LABEL(ctk_dithering_controls->dithering_config_txt), "Disabled"); } /* current dithering mode */ ret = NvCtrlGetAttribute(ctk_dithering_controls->handle, NV_CTRL_CURRENT_DITHERING_MODE, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_CURRENT_DITHERING_MODE_NONE; } switch (val) { case NV_CTRL_CURRENT_DITHERING_MODE_DYNAMIC_2X2: gtk_label_set_text(GTK_LABEL(ctk_dithering_controls->dithering_mode_txt), "Dynamic 2x2"); break; case NV_CTRL_CURRENT_DITHERING_MODE_STATIC_2X2: gtk_label_set_text(GTK_LABEL(ctk_dithering_controls->dithering_mode_txt), "Static 2x2"); break; case NV_CTRL_CURRENT_DITHERING_MODE_TEMPORAL: gtk_label_set_text(GTK_LABEL(ctk_dithering_controls->dithering_mode_txt), "Temporal"); break; default: case NV_CTRL_CURRENT_DITHERING_MODE_NONE: gtk_label_set_text(GTK_LABEL(ctk_dithering_controls->dithering_mode_txt), "None"); break; } /* current dithering depth */ ret = NvCtrlGetAttribute(ctk_dithering_controls->handle, NV_CTRL_CURRENT_DITHERING_DEPTH, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_CURRENT_DITHERING_DEPTH_NONE; } switch (val) { case NV_CTRL_CURRENT_DITHERING_DEPTH_6_BITS: gtk_label_set_text(GTK_LABEL(ctk_dithering_controls->dithering_depth_txt), "6 bpc"); break; case NV_CTRL_CURRENT_DITHERING_DEPTH_8_BITS: gtk_label_set_text(GTK_LABEL(ctk_dithering_controls->dithering_depth_txt), "8 bpc"); break; default: case NV_CTRL_CURRENT_DITHERING_DEPTH_NONE: gtk_label_set_text(GTK_LABEL(ctk_dithering_controls->dithering_depth_txt), "None"); break; } return TRUE; } /* update_dithering_info() */ static void post_dithering_config_update(CtkDitheringControls *ctk_dithering_controls, gint dithering_config) { static const char *dither_config_table[] = { "Auto", /* NV_CTRL_DITHERING_AUTO */ "Enabled", /* NV_CTRL_DITHERING_ENABLED */ "Disabled" /* NV_CTRL_DITHERING_DISABLED */ }; if (dithering_config < NV_CTRL_DITHERING_AUTO || dithering_config > NV_CTRL_DITHERING_DISABLED) { return; } gtk_widget_set_sensitive(ctk_dithering_controls->reset_button, TRUE); ctk_config_statusbar_message(ctk_dithering_controls->ctk_config, "Dithering set to %s for %s.", dither_config_table[dithering_config], ctk_dithering_controls->name); } static void post_dithering_mode_update(CtkDitheringControls *ctk_dithering_controls, gint dithering_mode) { static const char *dither_mode_table[] = { "Auto", /* NV_CTRL_DITHERING_MODE_AUTO */ "Dynamic 2x2", /* NV_CTRL_DITHERING_MODE_DYNAMIC_2X2 */ "Static 2x2", /* NV_CTRL_DITHERING_MODE_STATIC_2X2 */ "Temporal", /* NV_CTRL_DITHERING_MODE_TEMPORAL */ }; if (dithering_mode < NV_CTRL_DITHERING_MODE_AUTO || dithering_mode > NV_CTRL_DITHERING_MODE_TEMPORAL) { return; } gtk_widget_set_sensitive(ctk_dithering_controls->reset_button, TRUE); ctk_config_statusbar_message(ctk_dithering_controls->ctk_config, "Dithering mode set to %s for %s.", dither_mode_table[dithering_mode], ctk_dithering_controls->name); } static void post_dithering_depth_update(CtkDitheringControls *ctk_dithering_controls, gint dithering_depth) { static const char *dither_depth_table[] = { "Auto", /* NV_CTRL_DITHERING_DEPTH_AUTO */ "6 bpc", /* NV_CTRL_DITHERING_DEPTH_6_BITS */ "8 bpc" /* NV_CTRL_DITHERING_DEPTH_8_BITS */ }; if (dithering_depth < NV_CTRL_DITHERING_DEPTH_AUTO || dithering_depth > NV_CTRL_DITHERING_DEPTH_8_BITS) { return; } gtk_widget_set_sensitive(ctk_dithering_controls->reset_button, TRUE); ctk_config_statusbar_message(ctk_dithering_controls->ctk_config, "Dithering depth set to %s for %s.", dither_depth_table[dithering_depth], ctk_dithering_controls->name); } static void dithering_config_menu_changed(GtkWidget *dithering_config_menu, gpointer user_data) { CtkDitheringControls *ctk_dithering_controls = CTK_DITHERING_CONTROLS(user_data); CtkDropDownMenu *menu = CTK_DROP_DOWN_MENU(dithering_config_menu); gint history, dithering_config = NV_CTRL_DITHERING_AUTO; history = ctk_drop_down_menu_get_current_value(menu); dithering_config = map_dithering_config_menu_idx_to_nvctrl(history); NvCtrlSetAttribute(ctk_dithering_controls->handle, NV_CTRL_DITHERING, dithering_config); /* reflecting the change in configuration to other widgets & reset button */ setup_dithering_info(ctk_dithering_controls); post_dithering_config_update(ctk_dithering_controls, dithering_config); } /* dithering_config_menu_changed() */ static void dithering_mode_menu_changed(GtkWidget *dithering_mode_menu, gpointer user_data) { CtkDitheringControls *ctk_dithering_controls = CTK_DITHERING_CONTROLS(user_data); CtkDropDownMenu *menu = CTK_DROP_DOWN_MENU(dithering_mode_menu); gint history, dithering_mode = NV_CTRL_DITHERING_MODE_AUTO; history = ctk_drop_down_menu_get_current_value(menu); dithering_mode = ctk_dithering_controls->dithering_mode_table[history]; NvCtrlSetAttribute(ctk_dithering_controls->handle, NV_CTRL_DITHERING_MODE, dithering_mode); dithering_mode = map_nvctrl_value_to_table(ctk_dithering_controls, dithering_mode); /* reflecting the change in mode to the reset button */ setup_dithering_info(ctk_dithering_controls); post_dithering_mode_update(ctk_dithering_controls, dithering_mode); } /* dithering_mode_menu_changed() */ static void dithering_depth_menu_changed(GtkWidget *dithering_depth_menu, gpointer user_data) { CtkDitheringControls *ctk_dithering_controls = CTK_DITHERING_CONTROLS(user_data); CtkDropDownMenu *menu = CTK_DROP_DOWN_MENU(dithering_depth_menu); gint history, dithering_depth = NV_CTRL_DITHERING_DEPTH_AUTO; history = ctk_drop_down_menu_get_current_value(menu); dithering_depth = map_dithering_depth_menu_idx_to_nvctrl(history); NvCtrlSetAttribute(ctk_dithering_controls->handle, NV_CTRL_DITHERING_DEPTH, dithering_depth); /* reflecting the change in configuration to other widgets & reset button */ setup_dithering_info(ctk_dithering_controls); post_dithering_depth_update(ctk_dithering_controls, dithering_depth); } /* dithering_depth_menu_changed() */ /* * ctk_dithering_controls_reset() - Resets the dithering config (enabled/disabled) * & dithering mode when Reset HW Defaults is clicked */ void ctk_dithering_controls_reset(CtkDitheringControls *ctk_dithering_controls) { if (!ctk_dithering_controls) { return; } NvCtrlSetAttribute(ctk_dithering_controls->handle, NV_CTRL_DITHERING, NV_CTRL_DITHERING_AUTO); NvCtrlSetAttribute(ctk_dithering_controls->handle, NV_CTRL_DITHERING_MODE, NV_CTRL_DITHERING_MODE_AUTO); NvCtrlSetAttribute(ctk_dithering_controls->handle, NV_CTRL_DITHERING_DEPTH, NV_CTRL_DITHERING_DEPTH_AUTO); setup_dithering_info(ctk_dithering_controls); } /* ctk_dithering_controls_reset() */ /* * add_dithering_controls_help() - */ void add_dithering_controls_help(CtkDitheringControls *ctk_dithering_controls, GtkTextBuffer *b, GtkTextIter *i) { if (!ctk_dithering_controls) { return; } ctk_help_heading(b, i, "Dithering Controls"); ctk_help_para(b, i, "%s", __dithering_help); ctk_help_term(b, i, "Dithering"); ctk_help_para(b, i, "%s", __dithering_config_help); ctk_help_term(b, i, "Mode"); ctk_help_para(b, i, "%s", __dithering_mode_help); ctk_help_term(b, i, "Depth"); ctk_help_para(b, i, "%s", __dithering_depth_help); } /* add_dithering_controls_help() */ /* * When dithering configuration is enabled/disabled, * we should update the GUI to reflect the current state & mode. */ static void dithering_update_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkDitheringControls *ctk_object = CTK_DITHERING_CONTROLS(user_data); CtkEventStruct *event_struct = (CtkEventStruct *) arg1; ctk_dithering_controls_setup(ctk_object); /* update status bar message */ switch (event_struct->attribute) { case NV_CTRL_DITHERING: post_dithering_config_update(ctk_object, event_struct->value); break; case NV_CTRL_DITHERING_MODE: post_dithering_mode_update(ctk_object, event_struct->value); break; case NV_CTRL_DITHERING_DEPTH: post_dithering_depth_update(ctk_object, event_struct->value); break; } } /* dithering_update_received() */ /* * build_dithering_mode_table() - build a table of dithering modes, showing * modes supported by the hardware. */ static gboolean build_dithering_mode_table(CtkDitheringControls *ctk_dithering_controls) { ReturnStatus ret; NVCTRLAttributeValidValuesRec valid; gint i, n = 0, num_of_modes = 0, mask; if (ctk_dithering_controls->dithering_mode_table_size > 0 && ctk_dithering_controls->dithering_mode_table != NULL) { ctk_dithering_controls->dithering_mode_table_size = 0; free(ctk_dithering_controls->dithering_mode_table); } ret = NvCtrlGetValidAttributeValues(ctk_dithering_controls->handle, NV_CTRL_DITHERING_MODE, &valid); if (ret != NvCtrlSuccess || valid.type != ATTRIBUTE_TYPE_INT_BITS) { /* * We do not have valid information to build a mode table * so we need to create default data for the placeholder menu. */ ctk_dithering_controls->dithering_mode_table_size = 1; ctk_dithering_controls->dithering_mode_table = calloc(1, sizeof(ctk_dithering_controls->dithering_mode_table[0])); if (ctk_dithering_controls->dithering_mode_table) { ctk_dithering_controls->dithering_mode_table[0] = NV_CTRL_DITHERING_MODE_AUTO; } else { ctk_dithering_controls->dithering_mode_table_size = 0; } return False; } /* count no. of supported modes */ mask = valid.u.bits.ints; while(mask) { mask = mask & (mask - 1); num_of_modes++; } ctk_dithering_controls->dithering_mode_table_size = num_of_modes; ctk_dithering_controls->dithering_mode_table = calloc(num_of_modes, sizeof(ctk_dithering_controls->dithering_mode_table[0])); if (!ctk_dithering_controls->dithering_mode_table) { ctk_dithering_controls->dithering_mode_table_size = 0; return False; } for (i = 0; i < num_of_modes; i++) { if (valid.u.bits.ints & (1 << i)) { ctk_dithering_controls->dithering_mode_table[n] = i; n++; } } return True; } /* build_dithering_mode_table() */ static gint map_nvctrl_value_to_table(CtkDitheringControls *ctk_dithering_controls, gint val) { int i; for (i = 0; i < ctk_dithering_controls->dithering_mode_table_size; i++) { if (val == ctk_dithering_controls->dithering_mode_table[i]) { return i; } } return 0; } /*map_nvctrl_value_to_table() */ static gint map_dithering_config_menu_idx_to_nvctrl(gint idx) { switch (idx) { case 2: return NV_CTRL_DITHERING_DISABLED; case 1: return NV_CTRL_DITHERING_ENABLED; default: /* fallthrough; w/ warning? */ case 0: return NV_CTRL_DITHERING_AUTO; } } static gint map_dithering_depth_menu_idx_to_nvctrl(gint idx) { switch (idx) { case 2: return NV_CTRL_DITHERING_DEPTH_8_BITS; case 1: return NV_CTRL_DITHERING_DEPTH_6_BITS; default: /* fallthrough; w/ warning? */ case 0: return NV_CTRL_DITHERING_DEPTH_AUTO; } } nvidia-settings/src/gtk+-2.x/ctkcolorcorrectionpage.h0000664000175000017500000000564012236467170023021 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2012 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_COLOR_CORRECTION_PAGE_H__ #define __CTK_COLOR_CORRECTION_PAGE_H__ #include "parse.h" #include "ctkevent.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_COLOR_CORRECTION_PAGE (ctk_color_correction_page_get_type()) #define CTK_COLOR_CORRECTION_PAGE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), CTK_TYPE_COLOR_CORRECTION_PAGE, \ CtkColorCorrectionPage)) #define CTK_COLOR_CORRECTION_PAGE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), CTK_TYPE_COLOR_CORRECTION_PAGE, \ CtkColorCorrectionPageClass)) #define CTK_IS_COLOR_CORRECTION_PAGE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj), CTK_TYPE_COLOR_CORRECTION_PAGE)) #define CTK_IS_COLOR_CORRECTION_PAGE_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE((klass), CTK_TYPE_COLOR_CORRECTION_PAGE)) #define CTK_COLOR_CORRECTION_PAGE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS((obj), CTK_TYPE_COLOR_CORRECTION_PAGE, \ CtkColorCorrectionPageClass)) typedef struct _CtkColorCorrectionPage CtkColorCorrectionPage; typedef struct _CtkColorCorrectionPageClass CtkColorCorrectionPageClass; struct _CtkColorCorrectionPage { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; GtkWidget *option_menu; GtkObject *brightness_adjustment; GtkObject *contrast_adjustment; GtkObject *gamma_adjustment; GtkWidget *confirm_button; GtkWidget *confirm_label; gint confirm_countdown; guint confirm_timer; gfloat cur_slider_val[3][4]; // as [attribute][channel] gfloat prev_slider_val[3][4]; // as [attribute][channel] guint enabled_display_devices; }; struct _CtkColorCorrectionPageClass { GtkVBoxClass parent_class; void (*changed) (CtkColorCorrectionPage *); }; GType ctk_color_correction_page_get_type (void) G_GNUC_CONST; GtkWidget* ctk_color_correction_page_new (NvCtrlAttributeHandle *, CtkConfig *, ParsedAttribute *, CtkEvent *); GtkTextBuffer *ctk_color_correction_page_create_help(GtkTextTagTable *); G_END_DECLS #endif /* __CTK_COLOR_CORRECTION_PAGE_H__ */ nvidia-settings/src/gtk+-2.x/ctkcolorcorrection.h0000664000175000017500000000570312236467170022164 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_COLOR_CORRECTION_H__ #define __CTK_COLOR_CORRECTION_H__ #include "parse.h" #include "ctkevent.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_COLOR_CORRECTION (ctk_color_correction_get_type()) #define CTK_COLOR_CORRECTION(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), CTK_TYPE_COLOR_CORRECTION, \ CtkColorCorrection)) #define CTK_COLOR_CORRECTION_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), CTK_TYPE_COLOR_CORRECTION, \ CtkColorCorrectionClass)) #define CTK_IS_COLOR_CORRECTION(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj), CTK_TYPE_COLOR_CORRECTION)) #define CTK_IS_COLOR_CORRECTION_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE((klass), CTK_TYPE_COLOR_CORRECTION)) #define CTK_COLOR_CORRECTION_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS((obj), CTK_TYPE_COLOR_CORRECTION, \ CtkColorCorrectionClass)) typedef struct _CtkColorCorrection CtkColorCorrection; typedef struct _CtkColorCorrectionClass CtkColorCorrectionClass; struct _CtkColorCorrection { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; GtkWidget *option_menu; GtkObject *brightness_adjustment; GtkObject *contrast_adjustment; GtkObject *gamma_adjustment; GtkWidget *confirm_button; GtkWidget *confirm_label; gint confirm_countdown; guint confirm_timer; gfloat cur_slider_val[3][4]; // as [attribute][channel] gfloat prev_slider_val[3][4]; // as [attribute][channel] guint enabled_display_devices; }; struct _CtkColorCorrectionClass { GtkVBoxClass parent_class; void (*changed) (CtkColorCorrection *); }; GType ctk_color_correction_get_type (void) G_GNUC_CONST; GtkWidget* ctk_color_correction_new (NvCtrlAttributeHandle *, CtkConfig *, ParsedAttribute *, CtkEvent *); GtkTextBuffer *ctk_color_correction_create_help(GtkTextTagTable *); void ctk_color_correction_tab_help(GtkTextBuffer *b, GtkTextIter *i, const gchar *title, gboolean randr); G_END_DECLS #endif /* __CTK_COLOR_CORRECTION_H__ */ nvidia-settings/src/gtk+-2.x/ctkgvo-csc.c0000664000175000017500000012330212236467170020306 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "ctkbanner.h" #include "ctkconfig.h" #include "ctkhelp.h" #include "ctkdropdownmenu.h" #include "ctkgvo-csc.h" #include "msg.h" /* * The CtkGvoCsc widget is used to provide a way for configuring * custom Color Space Conversion Matrices, Offsets, and Scale Factors * on NVIDIA SDI products. At the top, we have a checkbox that * enables overriding the default CSC matrix. If that checkbox is not * checked, then everything else on the page is insensitive. * * When the "override" checkbox is checked, then the user can modify * each of the 15 floating point values that comprise the 3x3 matrix, * 1x3 offset vector, and 1x3 scale vector. * * The user can also select from an "Initialization" dropdown menu, to * initialize the CSC with any of "ITU-601", "ITU-709", "ITU-177", or * "Identity". * * Finally, the user can select how they want changes to be applied: * by default, they have to click the "Apply" button to flush their * changes from nvidia-settings out over NV-CONTROL to the NVIDIA * driver. Alternatively, the user can check the "Apply Changes * Immediately" checkbox, which will cause changes to be sent to the * NVIDIA driver whenever the user makes any changes to the CSC. This * is handy to tweak values in "realtime" while SDI output is enabled. * * Note that on older NVIDIA SDI products, changes to CSC require * stopping and restarting SDI output. Furthermore, on older NVIDIA * SDI products, CSC only applies to OpenGL SDI output. On newer * NVIDIA SDI products, the CSC can be applied in real time while CSC * is enabled, and can apply both to OpenGL and normal X desktop over * SDI. */ /* * TODO: ability to save/restore CSC to/from file. */ /* local prototypes */ static void override_button_toggled (GtkToggleButton *overrideButton, gpointer user_data); static void override_state_toggled (CtkGvoCsc *data, gboolean enabled); static void make_entry (CtkGvoCsc *ctk_gvo_csc, GtkWidget *table, GtkWidget **widget, float value, int row, int column); static void make_label (CtkGvoCsc *ctk_gvo_csc, GtkWidget *table, const char *str, int row, int column); static void spin_button_value_changed (GtkWidget *button, gpointer user_data); static void apply_immediate_button_toggled (GtkToggleButton *applyImmediateButton, gpointer user_data); static void apply_button_clicked (GtkButton *button, gpointer user_data); static void initialize_csc_dropdown_changed (CtkDropDownMenu *combo, gpointer user_data); static void set_apply_button_sensitive (CtkGvoCsc *ctk_gvo_csc); static void apply_csc_values (CtkGvoCsc *ctk_gvo_csc); static void gvo_csc_event_received (GtkObject *object, gpointer arg1, gpointer user_data); static GtkWidget *build_opengl_only_msg (void); /* * Color Space Conversion Standards */ #define CSC_STANDARD_ITU_601 0 #define CSC_STANDARD_ITU_709 1 #define CSC_STANDARD_ITU_177 2 #define CSC_STANDARD_IDENTITY 3 #define CSC_STANDARD_ITU_601_STRING "ITU-601" #define CSC_STANDARD_ITU_709_STRING "ITU-709" #define CSC_STANDARD_ITU_177_STRING "ITU-177" #define CSC_STANDARD_IDENTITY_STRING "Identity" #define FRAME_BORDER 5 /* General information help */ static const char * __override_help = "The Override default Color Space Conversion checkbox will toggle use of " "custom CSC."; static const char * __initialize_help = "The Initialize Color Space Conversion drop down menu, when selected, " "populates the Color Space Conversion Matrix, Offset, and Scale with the " "values from the selected standard."; static const char * __csc_help = "The color space conversion matrix defines the parameters used for " "converting the color data."; static const char * __apply_immediately_help = "The Apply Changes Immediately checkbox toggles whether or not changes made " "to the CSC matrix immediately take effect."; static const char * __apply_help = "The Apply button sends the new values of the color space conversion matrix " "to the server."; GType ctk_gvo_csc_get_type(void) { static GType ctk_gvo_csc_type = 0; if (!ctk_gvo_csc_type) { static const GTypeInfo ctk_gvo_csc_info = { sizeof (CtkGvoCscClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init, */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkGvoCsc), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_gvo_csc_type = g_type_register_static (GTK_TYPE_VBOX, "CtkGvoCsc", &ctk_gvo_csc_info, 0); } return ctk_gvo_csc_type; } /* * ctk_gvo_csc_new() - create a CtkGvoCsc widget */ GtkWidget* ctk_gvo_csc_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event, CtkGvo *gvo_parent) { GObject *object; CtkGvoCsc *ctk_gvo_csc; GtkWidget *frame; GtkWidget *hbox, *hbox2; GtkWidget *vbox, *vbox2; GtkWidget *label; GtkWidget *alignment; ReturnStatus ret; int row, column, override, caps; float initialCSCMatrix[3][3]; float initialCSCOffset[3]; float initialCSCScale[3]; /* retrieve all the NV-CONTROL attributes that we will need */ ret = NvCtrlGetGvoColorConversion(handle, initialCSCMatrix, initialCSCOffset, initialCSCScale); if (ret != NvCtrlSuccess) return NULL; ret = NvCtrlGetAttribute(handle, NV_CTRL_GVO_OVERRIDE_HW_CSC, &override); if (ret != NvCtrlSuccess) return NULL; ret = NvCtrlGetAttribute(handle, NV_CTRL_GVO_CAPABILITIES, &caps); if (ret != NvCtrlSuccess) return NULL; /* * XXX setup to receive events when another NV-CONTROL client * changes any of the above attributes */ /* create the object */ object = g_object_new(CTK_TYPE_GVO_CSC, NULL); ctk_gvo_csc = CTK_GVO_CSC(object); ctk_gvo_csc->handle = handle; ctk_gvo_csc->ctk_config = ctk_config; ctk_gvo_csc->ctk_event = ctk_event; ctk_gvo_csc->gvo_parent = gvo_parent; ctk_gvo_csc->caps = caps; gtk_box_set_spacing(GTK_BOX(object), 10); /* banner */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, FALSE, 0); ctk_gvo_csc->banner_box = hbox; /* checkbox to enable override of HW CSC */ ctk_gvo_csc->overrideButton = gtk_check_button_new_with_label ("Override default Color Space Conversion"); ctk_config_set_tooltip(ctk_config, ctk_gvo_csc->overrideButton, __override_help); g_signal_connect(GTK_OBJECT(ctk_gvo_csc->overrideButton), "toggled", G_CALLBACK(override_button_toggled), ctk_gvo_csc); frame = gtk_frame_new(NULL); gtk_container_set_border_width(GTK_CONTAINER(frame), FRAME_BORDER); vbox2 = gtk_vbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(vbox2), 5); gtk_box_pack_start(GTK_BOX(vbox2), ctk_gvo_csc->overrideButton, FALSE, // expand FALSE, // fill 0); // padding gtk_container_add(GTK_CONTAINER(frame), vbox2); gtk_box_pack_start(GTK_BOX(ctk_gvo_csc), frame, FALSE, // expand FALSE, // fill 0); // padding /* create an hbox to store everything else */ hbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(ctk_gvo_csc), hbox, FALSE, // expand FALSE, // fill 0); // padding vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, // expand FALSE, // fill 0); // padding ctk_gvo_csc->cscOptions = hbox; /* create a drop-down menu for the possible initializing values */ frame = gtk_frame_new(NULL); gtk_container_set_border_width(GTK_CONTAINER(frame), FRAME_BORDER); vbox2 = gtk_vbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(vbox2), 5); gtk_container_add(GTK_CONTAINER(frame), vbox2); hbox = gtk_hbox_new(FALSE, // homogeneous 10); // spacing gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, // expand FALSE, // fill 0); // padding label = gtk_label_new("Initialize Color Space Conversion with:"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, // expand FALSE, // fill 5); // padding ctk_gvo_csc->initializeDropDown = ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_MONOSPACE); ctk_config_set_tooltip (ctk_config, CTK_DROP_DOWN_MENU(ctk_gvo_csc->initializeDropDown)->option_menu, __initialize_help); ctk_drop_down_menu_append_item (CTK_DROP_DOWN_MENU(ctk_gvo_csc->initializeDropDown), CSC_STANDARD_ITU_601_STRING, CSC_STANDARD_ITU_601); ctk_drop_down_menu_append_item (CTK_DROP_DOWN_MENU(ctk_gvo_csc->initializeDropDown), CSC_STANDARD_ITU_709_STRING, CSC_STANDARD_ITU_709); ctk_drop_down_menu_append_item (CTK_DROP_DOWN_MENU(ctk_gvo_csc->initializeDropDown), CSC_STANDARD_ITU_177_STRING, CSC_STANDARD_ITU_177); ctk_drop_down_menu_append_item (CTK_DROP_DOWN_MENU(ctk_gvo_csc->initializeDropDown), CSC_STANDARD_IDENTITY_STRING, CSC_STANDARD_IDENTITY); gtk_widget_show_all(ctk_gvo_csc->initializeDropDown); gtk_box_pack_start(GTK_BOX(hbox), ctk_gvo_csc->initializeDropDown, FALSE, // expand FALSE, // fill 5); // padding ctk_drop_down_menu_set_current_value (CTK_DROP_DOWN_MENU(ctk_gvo_csc->initializeDropDown), CSC_STANDARD_ITU_601); g_signal_connect(G_OBJECT(ctk_gvo_csc->initializeDropDown), "changed", G_CALLBACK(initialize_csc_dropdown_changed), (gpointer) ctk_gvo_csc); gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, // expand FALSE, // fill 0); // padding /* create an hbox to store the CSC matrix, offset, and scale */ hbox = gtk_hbox_new(FALSE, // homogeneous 10); // spacing gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, // expand FALSE, // fill 0); // padding /* create the CSC matrix */ frame = gtk_frame_new(NULL); gtk_container_set_border_width(GTK_CONTAINER(frame), FRAME_BORDER); gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, // expand FALSE, // fill 0); // padding ctk_gvo_csc->matrixTable = gtk_table_new(4, // rows 4, // columns FALSE); // homogeneous gtk_container_add(GTK_CONTAINER(frame), ctk_gvo_csc->matrixTable); /* add labels to the matrix table */ make_label(ctk_gvo_csc, ctk_gvo_csc->matrixTable, "Y" , 1, 0); make_label(ctk_gvo_csc, ctk_gvo_csc->matrixTable, "Cr", 2, 0); make_label(ctk_gvo_csc, ctk_gvo_csc->matrixTable, "Cb", 3, 0); make_label(ctk_gvo_csc, ctk_gvo_csc->matrixTable, "Red" , 0, 1); make_label(ctk_gvo_csc, ctk_gvo_csc->matrixTable, "Green", 0, 2); make_label(ctk_gvo_csc, ctk_gvo_csc->matrixTable, "Blue" , 0, 3); /* create the 3x3 matrix */ for (row = 0; row < 3; row++) { for (column = 0; column < 3; column++) { ctk_gvo_csc->matrix[row][column] = initialCSCMatrix[row][column]; make_entry(ctk_gvo_csc, ctk_gvo_csc->matrixTable, &ctk_gvo_csc->matrixWidget[row][column], ctk_gvo_csc->matrix[row][column], row + 1, column+1); ctk_config_set_tooltip(ctk_config, ctk_gvo_csc->matrixWidget[row][column], __csc_help); } } /* create the CSC offset */ frame = gtk_frame_new(NULL); gtk_container_set_border_width(GTK_CONTAINER(frame), FRAME_BORDER); gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, // expand FALSE, // fill 0); // padding ctk_gvo_csc->offsetTable = gtk_table_new(4, // rows 1, // columns FALSE); // homogeneous make_label(ctk_gvo_csc, ctk_gvo_csc->offsetTable, "Offset", 0, 0); gtk_container_add(GTK_CONTAINER(frame), ctk_gvo_csc->offsetTable); for (row = 0; row < 3; row++) { ctk_gvo_csc->offset[row] = initialCSCOffset[row]; make_entry(ctk_gvo_csc, ctk_gvo_csc->offsetTable, &ctk_gvo_csc->offsetWidget[row], ctk_gvo_csc->offset[row], row+1, 0); ctk_config_set_tooltip(ctk_config, ctk_gvo_csc->offsetWidget[row], __csc_help); } /* create the CSC scale */ frame = gtk_frame_new(NULL); gtk_container_set_border_width(GTK_CONTAINER(frame), FRAME_BORDER); gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, // expand FALSE, // fill 0); // padding ctk_gvo_csc->scaleTable = gtk_table_new(4, // rows 1, // columns FALSE); // homogeneous make_label(ctk_gvo_csc, ctk_gvo_csc->scaleTable, "Scale" , 0, 0); gtk_container_add(GTK_CONTAINER(frame), ctk_gvo_csc->scaleTable); for (row = 0; row < 3; row++) { ctk_gvo_csc->scale[row] = initialCSCScale[row]; make_entry(ctk_gvo_csc, ctk_gvo_csc->scaleTable, &ctk_gvo_csc->scaleWidget[row], ctk_gvo_csc->scale[row], row+1, 0); ctk_config_set_tooltip(ctk_config, ctk_gvo_csc->scaleWidget[row], __csc_help); } /* * create checkbox for immediate apply; only expose if the X * server can support apply CSC values immediately */ if (caps & NV_CTRL_GVO_CAPABILITIES_APPLY_CSC_IMMEDIATELY) { ctk_gvo_csc->applyImmediateButton = gtk_check_button_new_with_label("Apply Changes Immediately"); ctk_config_set_tooltip(ctk_config, ctk_gvo_csc->applyImmediateButton, __apply_immediately_help); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_gvo_csc->applyImmediateButton), FALSE); g_signal_connect(GTK_OBJECT(ctk_gvo_csc->applyImmediateButton), "toggled", G_CALLBACK(apply_immediate_button_toggled), ctk_gvo_csc); } else { ctk_gvo_csc->applyImmediateButton = NULL; } ctk_gvo_csc->applyImmediately = FALSE; /* * create an apply button; pack the button in an alignment inside * an hbox, so that we can properly position the apply button on * the far right */ ctk_gvo_csc->applyButton = gtk_button_new_from_stock(GTK_STOCK_APPLY); ctk_config_set_tooltip(ctk_config, ctk_gvo_csc->applyButton, __apply_help); g_signal_connect(GTK_OBJECT(ctk_gvo_csc->applyButton), "clicked", G_CALLBACK(apply_button_clicked), ctk_gvo_csc); alignment = gtk_alignment_new(1.0, // xalign 0.5, // yalign 0.0, // xscale 0.0); // yscale gtk_container_add(GTK_CONTAINER(alignment), ctk_gvo_csc->applyButton); hbox2 = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox2), alignment, TRUE, // expand TRUE, // fill 0); // padding /* create a frame to pack the apply stuff in */ frame = gtk_frame_new(NULL); gtk_container_set_border_width(GTK_CONTAINER(frame), FRAME_BORDER); vbox2 = gtk_vbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(vbox2), 5); hbox = gtk_hbox_new(FALSE, 10); /* pack applyImmediateButton, but only if we created it */ if (ctk_gvo_csc->applyImmediateButton) { gtk_box_pack_start(GTK_BOX(hbox), ctk_gvo_csc->applyImmediateButton, FALSE, // expand FALSE, // fill 0); // padding } /* pack the Apply button */ gtk_box_pack_start(GTK_BOX(hbox), hbox2, TRUE, // expand TRUE, // fill 0); // padding /* pack the hbox inside a vbox so that we have proper y padding */ gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, // expand FALSE, // fill 0); // padding /* pack the vbox inside the frame */ gtk_container_add(GTK_CONTAINER(frame), vbox2); gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, // expand FALSE, // fill 0); // padding /* * if custom CSC will not be applied to the X screen, make that * clear to the user */ if ((caps & NV_CTRL_GVO_CAPABILITIES_APPLY_CSC_TO_X_SCREEN) == 0) { label = build_opengl_only_msg(); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, // expand FALSE, // fill 0); // padding } /* * initialize the override button to what we read in * NV_CTRL_GVO_OVERRIDE_HW_CSC */ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_gvo_csc->overrideButton), override); override_state_toggled(ctk_gvo_csc, override); /* Listen to server events */ g_signal_connect(G_OBJECT(ctk_gvo_csc->ctk_event), CTK_EVENT_NAME(NV_CTRL_GVO_CSC_CHANGED_EVENT), G_CALLBACK(gvo_csc_event_received), (gpointer) ctk_gvo_csc); g_signal_connect(G_OBJECT(ctk_gvo_csc->ctk_event), CTK_EVENT_NAME(NV_CTRL_GVO_OVERRIDE_HW_CSC), G_CALLBACK(gvo_csc_event_received), (gpointer) ctk_gvo_csc); /* show the page */ gtk_widget_show_all(GTK_WIDGET(object)); return GTK_WIDGET(object); } /* ctk_gvo_csc_new() */ /* * override_button_toggled() - the override checkbox has been toggled; * change the sensitivity of the widget; note that we do not send any * NV-CONTROL protocol here if override has been enabled -- that is * deferred until the user hits apply. */ static void override_button_toggled(GtkToggleButton *overrideButton, gpointer user_data) { CtkGvoCsc *ctk_gvo_csc = (CtkGvoCsc *) user_data; gboolean enabled = gtk_toggle_button_get_active(overrideButton); override_state_toggled(ctk_gvo_csc, enabled); /* * if override was enabled, don't send NV-CONTROL protocol, yet, * unless applyImmediately was enabled; otherwise, wait until the * user applies it. However, if override was disabled, apply that * immediately. */ if (enabled) { if (ctk_gvo_csc->applyImmediately) { NvCtrlSetAttribute(ctk_gvo_csc->handle, NV_CTRL_GVO_OVERRIDE_HW_CSC, NV_CTRL_GVO_OVERRIDE_HW_CSC_TRUE); } else { // make the "Apply" button hot gtk_widget_set_sensitive(ctk_gvo_csc->applyButton, TRUE); } } else { NvCtrlSetAttribute(ctk_gvo_csc->handle, NV_CTRL_GVO_OVERRIDE_HW_CSC, NV_CTRL_GVO_OVERRIDE_HW_CSC_FALSE); } } /* override_button_toggled() */ /* * override_state_toggled() - change the state of */ static void override_state_toggled(CtkGvoCsc *ctk_gvo_csc, gboolean enabled) { gtk_widget_set_sensitive(ctk_gvo_csc->cscOptions, enabled); } /* override_state_toggled() */ /* * make_entry() - helper function to create an adjustment, create a * numeric text entry with spin buttons, and pack the entry into the * provided table. */ static void make_entry(CtkGvoCsc *ctk_gvo_csc, GtkWidget *table, GtkWidget **widget, float value, int row, int column) { GtkAdjustment *adj; adj = (GtkAdjustment *) gtk_adjustment_new(value, // value -1.0, // lower 1.0, // upper 0.001, // step incr 0.1, // page incr 0); // page size *widget = gtk_spin_button_new(adj, // adjustment 0.001, // climb rate 6); // number of digits gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(*widget), TRUE); g_signal_connect(G_OBJECT(*widget), "value-changed", G_CALLBACK(spin_button_value_changed), ctk_gvo_csc); gtk_table_attach(GTK_TABLE(table), *widget, column, // left attach column + 1, // right_attach row, // top_attach row + 1, // bottom_attach 0, // xoptions 0, // yoptions 10, // xpadding 10); // ypadding } /* make_entry() */ /* * make_label() - helper function to create a lable and pack it in the * given table. */ static void make_label(CtkGvoCsc *ctk_gvo_csc, GtkWidget *table, const char *str, int row, int column) { GtkWidget *label; label = gtk_label_new(str); gtk_table_attach(GTK_TABLE(table), label, column, column + 1, // right_attach row, // top_attach row + 1, // bottom_attach 0, // xoptions 0, // yoptions 4, // xpadding 4); // ypadding } /* make_label() */ /* * spin_button_value_changed() - one of the spin buttons changed; */ static void spin_button_value_changed(GtkWidget *button, gpointer user_data) { CtkGvoCsc *ctk_gvo_csc = (CtkGvoCsc *) user_data; gdouble value; int row, column; value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(button)); /* which spinbutton was it? */ for (row = 0; row < 3; row++) { for (column = 0; column < 3; column++) { if (ctk_gvo_csc->matrixWidget[row][column] == button) { ctk_gvo_csc->matrix[row][column] = value; goto done; } } if (ctk_gvo_csc->offsetWidget[row] == button) { ctk_gvo_csc->offset[row] = value; goto done; } if (ctk_gvo_csc->scaleWidget[row] == button) { ctk_gvo_csc->scale[row] = value; goto done; } } done: /* * the data has changed, make sure the apply button is sensitive */ set_apply_button_sensitive(ctk_gvo_csc); /* if we are supposed to apply immediately, send the data now */ if (ctk_gvo_csc->applyImmediately) { apply_csc_values(ctk_gvo_csc); } } /* spin_button_value_changed() */ /* * apply_immediate_button_toggled() - the "apply immediately" button * has been toggled; change the sensitivity of the "Apply" button, and * possibly send the current settings to the X server. */ static void apply_immediate_button_toggled(GtkToggleButton *applyImmediateButton, gpointer user_data) { CtkGvoCsc *ctk_gvo_csc = (CtkGvoCsc *) user_data; gboolean enabled = gtk_toggle_button_get_active(applyImmediateButton); /* cache the current state */ ctk_gvo_csc->applyImmediately = enabled; /* * the Apply button's sensitivity is the opposite of the Immediate * apply checkbox -- if changes are applied immediately, then the * Apply button is not needed */ gtk_widget_set_sensitive(ctk_gvo_csc->applyButton, !enabled); /* * if the apply immediately button is enabled, then flush our * current values to the X server */ if (enabled) { apply_csc_values(ctk_gvo_csc); } } /* apply_immediate_button_toggled() */ /* * apply_button_clicked() - the apply button has been toggled, send * the current settings to the X server, and make this button * insensitive. */ static void apply_button_clicked(GtkButton *button, gpointer user_data) { CtkGvoCsc *ctk_gvo_csc = (CtkGvoCsc *) user_data; apply_csc_values(ctk_gvo_csc); gtk_widget_set_sensitive(ctk_gvo_csc->applyButton, FALSE); } /* apply_button_clicked() */ /* * initialize_csc_dropdown_changed() - the "initialize" dropdown menu * changed; update the values in the matrix, offset, and scale */ static void initialize_csc_dropdown_changed(CtkDropDownMenu *menu, gpointer user_data) { CtkGvoCsc *ctk_gvo_csc = (CtkGvoCsc *) user_data; const float *std = NULL; gint column, row, value; value = ctk_drop_down_menu_get_current_value(menu); switch (value) { case CSC_STANDARD_ITU_601: std = nv_get_sdi_csc_matrix("itu_601"); break; case CSC_STANDARD_ITU_709: std = nv_get_sdi_csc_matrix("itu_709"); break; case CSC_STANDARD_ITU_177: std = nv_get_sdi_csc_matrix("itu_177"); break; case CSC_STANDARD_IDENTITY: std = nv_get_sdi_csc_matrix("identity"); break; default: return; } if (!std) { return; } for (row = 0; row < 3; row++) { for (column = 0; column < 3; column++) { ctk_gvo_csc->matrix[row][column] = std[row*5 + column]; gtk_spin_button_set_value (GTK_SPIN_BUTTON(ctk_gvo_csc->matrixWidget[row][column]), ctk_gvo_csc->matrix[row][column]); } ctk_gvo_csc->offset[row] = std[row*5 + 3]; gtk_spin_button_set_value (GTK_SPIN_BUTTON(ctk_gvo_csc->offsetWidget[row]), ctk_gvo_csc->offset[row]); ctk_gvo_csc->scale[row] = std[row*5 + 4]; gtk_spin_button_set_value (GTK_SPIN_BUTTON(ctk_gvo_csc->scaleWidget[row]), ctk_gvo_csc->scale[row]); } /* * the data has changed, make sure the apply button is sensitive */ set_apply_button_sensitive(ctk_gvo_csc); /* if we are supposed to apply immediately, send the data now */ if (ctk_gvo_csc->applyImmediately) { apply_csc_values(ctk_gvo_csc); } } /* initialize_csc_dropdown_changed() */ /* * set_apply_button_sensitive() - make the "Apply" button sensitive */ static void set_apply_button_sensitive(CtkGvoCsc *ctk_gvo_csc) { /* if data is applied immediately, then we don't */ if (ctk_gvo_csc->applyImmediately) return; gtk_widget_set_sensitive(ctk_gvo_csc->applyButton, TRUE); } /* set_apply_button_sensitive() */ /* * apply_csc_values() - apply the current CSC values to the X server * and make sure CSC override is enabled */ static void apply_csc_values(CtkGvoCsc *ctk_gvo_csc) { NvCtrlSetGvoColorConversion(ctk_gvo_csc->handle, ctk_gvo_csc->matrix, ctk_gvo_csc->offset, ctk_gvo_csc->scale); NvCtrlSetAttribute(ctk_gvo_csc->handle, NV_CTRL_GVO_OVERRIDE_HW_CSC, NV_CTRL_GVO_OVERRIDE_HW_CSC_TRUE); } /* apply_csc_values() */ /* * GVO CSC event handler. */ static void gvo_csc_event_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct = (CtkEventStruct *) arg1; CtkGvoCsc *ctk_gvo_csc = CTK_GVO_CSC(user_data); GtkWidget *widget; gint attribute = event_struct->attribute; gint value = event_struct->value; ReturnStatus ret; float newCSCMatrix[3][3]; float newCSCOffset[3]; float newCSCScale[3]; int row, column; switch (attribute) { case NV_CTRL_GVO_CSC_CHANGED_EVENT: /* Re-query the GVO CSC matrix */ ret = NvCtrlGetGvoColorConversion(ctk_gvo_csc->handle, newCSCMatrix, newCSCOffset, newCSCScale); if (ret == NvCtrlSuccess) { for (row = 0; row < 3; row++) { for (column = 0; column < 3; column++) { g_signal_handlers_block_by_func (G_OBJECT(ctk_gvo_csc->matrixWidget[row][column]), G_CALLBACK(spin_button_value_changed), (gpointer) ctk_gvo_csc); ctk_gvo_csc->matrix[row][column] = newCSCMatrix[row][column]; gtk_spin_button_set_value (GTK_SPIN_BUTTON(ctk_gvo_csc->matrixWidget[row][column]), ctk_gvo_csc->matrix[row][column]); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_gvo_csc->matrixWidget[row][column]), G_CALLBACK(spin_button_value_changed), (gpointer) ctk_gvo_csc); } g_signal_handlers_block_by_func (G_OBJECT(ctk_gvo_csc->offsetWidget[row]), G_CALLBACK(spin_button_value_changed), (gpointer) ctk_gvo_csc); ctk_gvo_csc->offset[row] = newCSCOffset[row]; gtk_spin_button_set_value (GTK_SPIN_BUTTON(ctk_gvo_csc->offsetWidget[row]), ctk_gvo_csc->offset[row]); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_gvo_csc->offsetWidget[row]), G_CALLBACK(spin_button_value_changed), (gpointer) ctk_gvo_csc); g_signal_handlers_block_by_func (G_OBJECT(ctk_gvo_csc->scaleWidget[row]), G_CALLBACK(spin_button_value_changed), (gpointer) ctk_gvo_csc); ctk_gvo_csc->scale[row] = newCSCScale[row]; gtk_spin_button_set_value (GTK_SPIN_BUTTON(ctk_gvo_csc->scaleWidget[row]), ctk_gvo_csc->scale[row]); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_gvo_csc->scaleWidget[row]), G_CALLBACK(spin_button_value_changed), (gpointer) ctk_gvo_csc); } } gtk_widget_set_sensitive(ctk_gvo_csc->applyButton, FALSE); break; case NV_CTRL_GVO_OVERRIDE_HW_CSC: widget = ctk_gvo_csc->overrideButton; g_signal_handlers_block_by_func(G_OBJECT(widget), G_CALLBACK(override_button_toggled), (gpointer) ctk_gvo_csc); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), value); override_state_toggled(ctk_gvo_csc, value); gtk_widget_set_sensitive(ctk_gvo_csc->applyButton, FALSE); g_signal_handlers_unblock_by_func(G_OBJECT(widget), G_CALLBACK(override_button_toggled), (gpointer) ctk_gvo_csc); break; default: nv_error_msg("Unhandled GVO CSC event received: %d\n", attribute); break; } } /* * build_opengl_only_msg() - build a message to inform the user that * custom CSC will only be applied to OpenGL GVO output; this returns * a frame containing the message. */ static GtkWidget *build_opengl_only_msg(void) { GdkPixbuf *pixbuf; GtkWidget *label; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *frame; GtkWidget *image = NULL; /* create the label */ label = gtk_label_new("Note that the overridden Color Space Conversion " "will only apply to OpenGL applications " "using the GLX_NV_video_out extension."); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); /* create the information icon */ pixbuf = gtk_widget_render_icon(label, GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG, "CSC information message"); /* create a pixmap from the icon */ if (pixbuf) { image = gtk_image_new_from_pixbuf(pixbuf); } else { image = NULL; } /* create an hbox and pack the icon and label in it */ hbox = gtk_hbox_new(FALSE, 5); if (image) { gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, // expand FALSE, // fill 5); // padding } gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, // expand FALSE, // fill 5); // padding /* pack the hbox in a vbox to get vertical padding */ vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, // expand FALSE, // fill 5); // padding /* pack the whole thing in a frame */ frame = gtk_frame_new(NULL); gtk_container_set_border_width(GTK_CONTAINER(frame), FRAME_BORDER); gtk_container_add(GTK_CONTAINER(frame), vbox); return frame; } /* build_opengl_only_msg() */ void ctk_gvo_csc_select(GtkWidget *widget) { CtkGvoCsc *ctk_gvo_csc = CTK_GVO_CSC(widget); CtkGvo *ctk_gvo = ctk_gvo_csc->gvo_parent; /* Grab the GVO banner */ ctk_gvo_banner_set_parent(CTK_GVO_BANNER(ctk_gvo->banner), ctk_gvo_csc->banner_box, NULL, NULL); } void ctk_gvo_csc_unselect(GtkWidget *widget) { CtkGvoCsc *ctk_gvo_csc = CTK_GVO_CSC(widget); CtkGvo *ctk_gvo = ctk_gvo_csc->gvo_parent; /* Release the GVO banner */ ctk_gvo_banner_set_parent(CTK_GVO_BANNER(ctk_gvo->banner), NULL, NULL, NULL); } /* * ctk_gvo_csc_create_help() - Create color space conversion help page */ GtkTextBuffer *ctk_gvo_csc_create_help(GtkTextTagTable *table, CtkGvoCsc *ctk_gvo_csc) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "Color Space Conversion Help"); ctk_help_para(b, &i, "This page gives access to configuration of " "the SDI (GVO) color space conversion."); ctk_help_heading(b, &i, "Override default Color Space Conversion"); ctk_help_para(b, &i, "%s", __override_help); ctk_help_heading(b, &i, "Initialize Color Space Conversion"); ctk_help_para(b, &i, "%s", __initialize_help); ctk_help_heading(b, &i, "Color Space Conversion Matrix, Offset and Scale"); ctk_help_para(b, &i, "%s RGB color is converted to YCrCb in the " "following manner:", __csc_help); ctk_help_para(b, &i, "Y = Ky + Sy * ( Ry*R + Gy*G + By*B )\n" "Cb = Kcb + Scb * ( Rcb*R + Gcb*G + Bcb*B )\n" "Cr = Kcr + Scr * ( Rcr*R + Gcr*G + Bcr*B )"); ctk_help_para(b, &i, "Where:"); ctk_help_para(b, &i, "Ky = Y (luma) Offset\n" "Kcb = Cr (red chroma) Offset\n" "Kcr = Cb (blue chroma) Offset"); ctk_help_para(b, &i, "Sy = Y scaling factor\n" "Scb = Cb Scaling factor\n" "Scr = Cr Scaling factor"); ctk_help_para(b, &i, "Ry = Red coefficient for Y\n" "Rcb = Red coefficient for Cb\n" "Rcr = Red coefficient for Cr"); ctk_help_para(b, &i, "Gy = Green coefficient for Y\n" "Gcb = Green coefficient for Cb\n" "Gcr = Green coefficient for Cr"); ctk_help_para(b, &i, "By = Blue coefficient for Y\n" "Bcb = Blue coefficient for Cb\n" "Bcr = Blue coefficient for Cr"); if (ctk_gvo_csc->caps & NV_CTRL_GVO_CAPABILITIES_APPLY_CSC_IMMEDIATELY) { ctk_help_heading(b, &i, "Apply Changes Immediately"); ctk_help_para(b, &i, "%s", __apply_immediately_help); } ctk_help_heading(b, &i, "Apply"); ctk_help_para(b, &i, "%s", __apply_help); ctk_help_finish(b); return b; } /* ctk_gvo_csc_create_help() */ nvidia-settings/src/gtk+-2.x/ctkthermal.c0000664000175000017500000017100612236467170020405 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "ctkutils.h" #include "ctkscale.h" #include "ctkhelp.h" #include "ctkthermal.h" #include "ctklicense.h" #include "ctkgauge.h" #include "ctkbanner.h" #define FRAME_PADDING 10 #define DEFAULT_UPDATE_THERMAL_INFO_TIME_INTERVAL 1000 static gboolean __license_accepted = FALSE; static gboolean update_thermal_info(gpointer); static gboolean update_cooler_info(gpointer); static void sync_gui_sensitivity(CtkThermal *ctk_thermal); static void sync_gui_to_modify_cooler_level(CtkThermal *ctk_thermal); static gboolean sync_gui_to_update_cooler_event(gpointer user_data); static void cooler_control_checkbox_toggled(GtkWidget *widget, gpointer user_data); static void cooler_operating_level_changed(GtkObject *object, gpointer arg1, gpointer user_data); static void apply_button_clicked(GtkWidget *widget, gpointer user_data); static void reset_button_clicked(GtkWidget *widget, gpointer user_data); static void adjustment_value_changed(GtkAdjustment *adjustment, gpointer user_data); static void draw_sensor_gui(GtkWidget *vbox1, CtkThermal *ctk_thermal, gboolean new_target_type, gint cur_sensor_idx, NvCtrlAttributeHandle *sensor_handle, gint reading, gint lower, gint upper, gint target, gint provider); static GtkWidget *pack_gauge(GtkWidget *hbox, gint lower, gint upper, CtkConfig *ctk_config, const char *help); static const char *__core_threshold_help = "The Core Slowdown Threshold Temperature is the temperature " "at which the NVIDIA Accelerated Graphics driver will throttle " "the GPU to prevent damage, in \xc2\xb0" /* split for g_utf8_validate() */ "C."; static const char *__core_temp_help = "The Core Temperature is the Graphics Processing Unit's " "(GPU) current core temperature, in \xc2\xb0" /* split for g_utf8_validate() */ "C."; static const char *__ambient_temp_help = "The Ambient Temperature is the current temperature in the " "GPU's immediate neighbourhood, in \xc2\xb0" /* split for g_utf8_validate() */ "C."; static const char *__temp_level_help = "This is a graphical representation of the current GPU core " "temperature relative to the maximum GPU Core Slowdown " "Threshold temperature."; static const char *__thermal_sensor_id_help = "This shows the thermal sensor's index."; static const char *__thermal_sensor_target_help = "This shows what hardware component the thermal sensor is measuring."; static const char *__thermal_sensor_provider_help = "This shows the hardware device that provides the thermal sensor."; static const char *__thermal_sensor_reading_help = "This shows the thermal sensor's current reading."; static const char * __enable_button_help = "The Enable GPU Fan Settings checkbox enables access to control GPU Fan " "Speed. This option is available after enabling coolbits for GPU Fan control." "Note that controlling your GPU Fan Speed is not recommended and " "is done at your own risk. You should never have to enable this."; static const char * __fan_id_help = "This shows the GPU Fan's index."; static const char * __fan_rpm_help = "This shows the current GPU Fan Speed in rotations per minute (RPM)."; static const char * __fan_speed_help = "This shows the current GPU Fan Speed level as a percentage."; static const char * __fan_control_type_help = "Fan Type indicates if and how this fan may be controlled. Possible " "types are Variable, Toggle or Restricted. Variable fans can be " "freely adjusted within a given range, while Toggle fans can " "be turned either ON or OFF. Restricted fans are not adjustable " "under end user control."; static const char * __fan_cooling_target_help = "Fan target shows which graphics device component is being cooled by " "a given fan. The target may be GPU, Memory, Power Supply or " "All."; static const char * __apply_button_help = "The Apply button allows you to set the desired speed for the " "GPU Fans. Slider positions are only applied " "after clicking this button."; static const char * __reset_button_help = "The Reset Hardware Defaults button lets you restore the original GPU " "Fan Speed and Fan control policy."; GType ctk_thermal_get_type(void) { static GType ctk_thermal_type = 0; if (!ctk_thermal_type) { static const GTypeInfo ctk_thermal_info = { sizeof (CtkThermalClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* constructor */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkThermal), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_thermal_type = g_type_register_static(GTK_TYPE_VBOX, "CtkThermal", &ctk_thermal_info, 0); } return ctk_thermal_type; } /* ctk_thermal_get_type() */ /* * update_cooler_info() - Update all cooler information */ static gboolean update_cooler_info(gpointer user_data) { int i, speed, level, cooler_type, cooler_target; gchar *tmp_str; CtkThermal *ctk_thermal; GtkWidget *table, *label, *eventbox; gint ret; gint row_idx; /* Where to insert into the cooler info table */ ctk_thermal = CTK_THERMAL(user_data); /* Since table cell management in GTK lacks, just remove and rebuild * the table from scratch. */ /* Dump out the old table */ ctk_empty_container(ctk_thermal->cooler_table_hbox); /* Generate a new table */ table = gtk_table_new(1, 5, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); gtk_box_pack_start(GTK_BOX(ctk_thermal->cooler_table_hbox), table, FALSE, FALSE, 0); label = gtk_label_new("ID"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); eventbox = gtk_event_box_new(); gtk_table_attach(GTK_TABLE(table), eventbox, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); gtk_container_add(GTK_CONTAINER(eventbox), label); ctk_config_set_tooltip(ctk_thermal->ctk_config, eventbox, __fan_id_help); label = gtk_label_new("Speed (RPM)"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); eventbox = gtk_event_box_new(); gtk_table_attach(GTK_TABLE(table), eventbox, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); gtk_container_add(GTK_CONTAINER(eventbox), label); ctk_config_set_tooltip(ctk_thermal->ctk_config, eventbox, __fan_rpm_help); label = gtk_label_new("Speed (%)"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); eventbox = gtk_event_box_new(); gtk_table_attach(GTK_TABLE(table), eventbox, 2, 3, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); gtk_container_add(GTK_CONTAINER(eventbox), label); ctk_config_set_tooltip(ctk_thermal->ctk_config, eventbox, __fan_speed_help); label = gtk_label_new("Control Type"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); eventbox = gtk_event_box_new(); gtk_table_attach(GTK_TABLE(table), eventbox, 3, 4, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); gtk_container_add(GTK_CONTAINER(eventbox), label); ctk_config_set_tooltip(ctk_thermal->ctk_config, eventbox, __fan_control_type_help); label = gtk_label_new("Cooling Target"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); eventbox = gtk_event_box_new(); gtk_table_attach(GTK_TABLE(table), eventbox, 4, 5, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); gtk_container_add(GTK_CONTAINER(eventbox), label); ctk_config_set_tooltip(ctk_thermal->ctk_config, eventbox, __fan_cooling_target_help); /* Fill the cooler info */ for (i = 0; i < ctk_thermal->cooler_count; i++) { row_idx = i+1; gtk_table_resize(GTK_TABLE(table), row_idx+1, 5); tmp_str = g_strdup_printf("%d", i); label = gtk_label_new(tmp_str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row_idx, row_idx+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); free(tmp_str); ret = NvCtrlGetAttribute(ctk_thermal->cooler_control[i].handle, NV_CTRL_THERMAL_COOLER_SPEED, &speed); if (ret == NvCtrlSuccess) { tmp_str = g_strdup_printf("%d", speed); } else { tmp_str = g_strdup_printf("Unsupported"); } label = gtk_label_new(tmp_str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, row_idx, row_idx+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); free(tmp_str); ret = NvCtrlGetAttribute(ctk_thermal->cooler_control[i].handle, NV_CTRL_THERMAL_COOLER_LEVEL, &level); if (ret != NvCtrlSuccess) { /* cooler information no longer available */ return FALSE; } tmp_str = g_strdup_printf("%d", level); label = gtk_label_new(tmp_str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 2, 3, row_idx, row_idx+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); free(tmp_str); ret = NvCtrlGetAttribute(ctk_thermal->cooler_control[i].handle, NV_CTRL_THERMAL_COOLER_CONTROL_TYPE, &cooler_type); if (ret != NvCtrlSuccess) { /* cooler information no longer available */ return FALSE; } if (cooler_type == NV_CTRL_THERMAL_COOLER_CONTROL_TYPE_VARIABLE) { tmp_str = g_strdup_printf("Variable"); } else if (cooler_type == NV_CTRL_THERMAL_COOLER_CONTROL_TYPE_TOGGLE) { tmp_str = g_strdup_printf("Toggle"); } else if (cooler_type == NV_CTRL_THERMAL_COOLER_CONTROL_TYPE_NONE) { tmp_str = g_strdup_printf("Restricted"); } label = gtk_label_new(tmp_str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 3, 4, row_idx, row_idx+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); free(tmp_str); ret = NvCtrlGetAttribute(ctk_thermal->cooler_control[i].handle, NV_CTRL_THERMAL_COOLER_TARGET, &cooler_target); if (ret != NvCtrlSuccess) { /* cooler information no longer available */ return FALSE; } switch(cooler_target) { case NV_CTRL_THERMAL_COOLER_TARGET_GPU: tmp_str = g_strdup_printf("GPU"); break; case NV_CTRL_THERMAL_COOLER_TARGET_MEMORY: tmp_str = g_strdup_printf("Memory"); break; case NV_CTRL_THERMAL_COOLER_TARGET_POWER_SUPPLY: tmp_str = g_strdup_printf("Power Supply"); break; case NV_CTRL_THERMAL_COOLER_TARGET_GPU_RELATED: tmp_str = g_strdup_printf("GPU, Memory, and Power Supply"); break; default: break; } label = gtk_label_new(tmp_str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 4, 5, row_idx, row_idx+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); free(tmp_str); } gtk_widget_show_all(table); /* X driver takes fraction of second to refresh newly set value */ if (!ctk_thermal->cooler_control_enabled) { sync_gui_to_modify_cooler_level(ctk_thermal); } return TRUE; } /* update_cooler_info() */ static gboolean update_thermal_info(gpointer user_data) { gint reading, ambient; CtkThermal *ctk_thermal; NvCtrlAttributeHandle *handle; gint ret, i, core; gchar *s; ctk_thermal = CTK_THERMAL(user_data); if (!ctk_thermal->thermal_sensor_target_type_supported) { handle = ctk_thermal->attribute_handle; ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_CORE_TEMPERATURE, &core); if (ret != NvCtrlSuccess) { /* thermal information no longer available */ return FALSE; } s = g_strdup_printf(" %d C ", core); gtk_label_set_text(GTK_LABEL(ctk_thermal->core_label), s); g_free(s); ctk_gauge_set_current(CTK_GAUGE(ctk_thermal->core_gauge), core); ctk_gauge_draw(CTK_GAUGE(ctk_thermal->core_gauge)); if (ctk_thermal->ambient_label) { ret = NvCtrlGetAttribute(handle, NV_CTRL_AMBIENT_TEMPERATURE, &ambient); if (ret != NvCtrlSuccess) { /* thermal information no longer available */ return FALSE; } s = g_strdup_printf(" %d C ", ambient); gtk_label_set_text(GTK_LABEL(ctk_thermal->ambient_label), s); g_free(s); } } else { for (i = 0; i < ctk_thermal->sensor_count; i++) { handle = ctk_thermal->sensor_info[i].handle; ret = NvCtrlGetAttribute(handle, NV_CTRL_THERMAL_SENSOR_READING, &reading); /* querying THERMAL_SENSOR_READING failed: assume the temperature is 0 */ if (ret != NvCtrlSuccess) { reading = 0; } if (ctk_thermal->sensor_info[i].temp_label) { s = g_strdup_printf(" %d C ", reading); gtk_label_set_text( GTK_LABEL(ctk_thermal->sensor_info[i].temp_label), s); g_free(s); } if (ctk_thermal->sensor_info[i].core_gauge) { ctk_gauge_set_current( CTK_GAUGE(ctk_thermal->sensor_info[i].core_gauge), reading); ctk_gauge_draw(CTK_GAUGE(ctk_thermal->sensor_info[i].core_gauge)); } } } if ( ctk_thermal->cooler_count ) { update_cooler_info(ctk_thermal); } return TRUE; } /* update_thermal_info() */ /**** * * Updates widgets in relation to current cooler control state. * */ static void cooler_control_state_update_gui(CtkThermal *ctk_thermal) { ReturnStatus ret; int value; gboolean enabled; /* We need to check the cooler control state status with * the server every time someone tries to change the state * because the set might have failed. */ ret = NvCtrlGetAttribute(ctk_thermal->attribute_handle, NV_CTRL_GPU_COOLER_MANUAL_CONTROL, &value); if (ret != NvCtrlSuccess) { enabled = FALSE; } else { enabled = (value==NV_CTRL_GPU_COOLER_MANUAL_CONTROL_TRUE); } ctk_thermal->cooler_control_enabled = enabled; /* Sync the gui to be able to modify the fan speed */ sync_gui_to_modify_cooler_level(ctk_thermal); /* Update the status bar */ ctk_config_statusbar_message(ctk_thermal->ctk_config, "GPU Fan control %sabled.", enabled?"en":"dis"); } /* cooler_control_state_update_gui() */ /***** * * Signal handler - Called when the user toggles the "Enable Cooler control" * button. * */ static void cooler_control_state_toggled(GtkWidget *widget, gpointer user_data) { CtkThermal *ctk_thermal = CTK_THERMAL(user_data); gboolean enabled; int value; gint result; /* Get enabled state */ enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); value = (enabled==1) ? NV_CTRL_GPU_COOLER_MANUAL_CONTROL_TRUE : NV_CTRL_GPU_COOLER_MANUAL_CONTROL_FALSE; /* Verify user knows the risks involved */ if ( enabled && !__license_accepted ) { result = ctk_license_run_dialog(CTK_LICENSE_DIALOG(ctk_thermal->enable_dialog)); switch (result) { case GTK_RESPONSE_ACCEPT: __license_accepted = TRUE; break; case GTK_RESPONSE_REJECT: default: /* Cancel */ g_signal_handlers_block_by_func(G_OBJECT( ctk_thermal->enable_checkbox), G_CALLBACK(cooler_control_state_toggled), (gpointer) ctk_thermal); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), FALSE); g_signal_handlers_unblock_by_func(G_OBJECT( ctk_thermal->enable_checkbox), G_CALLBACK(cooler_control_state_toggled), (gpointer) ctk_thermal); return; } } /* Update the server */ NvCtrlSetAttribute(ctk_thermal->attribute_handle, NV_CTRL_GPU_COOLER_MANUAL_CONTROL, value); /* Update the GUI */ cooler_control_state_update_gui(ctk_thermal); } /* cooler_control_state_toggled() */ /***** * * Signal handler - Called when another NV-CONTROL client has set the * cooler control state. * */ static void cooler_control_state_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkThermal *ctk_thermal = CTK_THERMAL(user_data); /* Update GUI with enable status */ cooler_control_state_update_gui(ctk_thermal); } /* cooler_control_state_update_received() */ /**** * * Updates sensitivity of widgets in relation to the state * of cooler control. * */ static void sync_gui_sensitivity(CtkThermal *ctk_thermal) { gboolean enabled = ctk_thermal->cooler_control_enabled; gboolean settings_changed = ctk_thermal->settings_changed; gint i; if ( ctk_thermal->cooler_count && ctk_thermal->show_fan_control_frame ) { /* Update the enable checkbox */ g_signal_handlers_block_by_func(G_OBJECT(ctk_thermal->enable_checkbox), G_CALLBACK(cooler_control_state_toggled), (gpointer) ctk_thermal); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ctk_thermal->enable_checkbox), enabled); g_signal_handlers_unblock_by_func(G_OBJECT(ctk_thermal->enable_checkbox), G_CALLBACK(cooler_control_state_toggled), (gpointer) ctk_thermal); /* Update the cooler control widgets */ for (i = 0; i < ctk_thermal->cooler_count; i++) { gtk_widget_set_sensitive(ctk_thermal->cooler_control[i].widget, enabled); } /* Update the Apply button */ gtk_widget_set_sensitive(ctk_thermal->apply_button, enabled && settings_changed); /* Update the Reset button */ gtk_widget_set_sensitive(ctk_thermal->reset_button, enabled && ctk_thermal->enable_reset_button); } } /* sync_gui_sensitivity() */ /***** * * Signal handler - User clicked the "apply" button. * */ static void apply_button_clicked(GtkWidget *widget, gpointer user_data) { CtkThermal *ctk_thermal = CTK_THERMAL(user_data); ReturnStatus ret; gint cooler_level; gint i; /* Set cooler's level on server */ for (i = 0; i < ctk_thermal->cooler_count; i++) { if ( ctk_thermal->cooler_control[i].changed ) { if ( ctk_thermal->cooler_control[i].adjustment ) { cooler_level = gtk_adjustment_get_value( ctk_thermal->cooler_control[i].adjustment); } else { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( ctk_thermal->cooler_control[i].widget))) { cooler_level = ctk_thermal->cooler_control[i].range.u.range.max; } else { cooler_level = ctk_thermal->cooler_control[i].range.u.range.min; } } ret = NvCtrlSetAttribute(ctk_thermal->cooler_control[i].handle, NV_CTRL_THERMAL_COOLER_LEVEL, cooler_level); if ( ret != NvCtrlSuccess ) { ctk_config_statusbar_message(ctk_thermal->ctk_config, "Failed to set new Fan Speed!"); return; } } } ctk_thermal->cooler_control[i].changed = FALSE; ctk_thermal->settings_changed = FALSE; ctk_thermal->enable_reset_button = TRUE; /* Sync up with the server current fan speed */ sync_gui_to_modify_cooler_level(ctk_thermal); /* Update the gui sensitivity */ sync_gui_sensitivity(ctk_thermal); /* Enable the reset button */ gtk_widget_set_sensitive(ctk_thermal->reset_button, TRUE); ctk_config_statusbar_message(ctk_thermal->ctk_config, "Set new Fan Speed."); } /* apply_button_clicked() */ /***** * * Signal handler - User clicked the 'reset hardware defaults' button. * */ static void reset_button_clicked(GtkWidget *widget, gpointer user_data) { CtkThermal *ctk_thermal = CTK_THERMAL(user_data); ReturnStatus ret; gboolean reset_failed = FALSE; gint i; /* Set cooler related values to default */ for (i = 0; i < ctk_thermal->cooler_count; i++) { ret = NvCtrlSetAttribute(ctk_thermal->cooler_control[i].handle, NV_CTRL_THERMAL_COOLER_LEVEL_SET_DEFAULT, NV_CTRL_THERMAL_COOLER_LEVEL_SET_DEFAULT); if ( ret != NvCtrlSuccess ) { reset_failed = TRUE; } } ctk_thermal->enable_reset_button = FALSE; /* Update GUI to reflect current values */ cooler_control_state_update_gui(ctk_thermal); /* Disable the apply button */ gtk_widget_set_sensitive(ctk_thermal->apply_button, FALSE); /* Disable the reset button */ gtk_widget_set_sensitive(ctk_thermal->reset_button, ctk_thermal->enable_reset_button); /* Set statusbar messages */ if ( reset_failed ) { ctk_config_statusbar_message(ctk_thermal->ctk_config, "Failed to reset fan speed default value!"); } else { ctk_config_statusbar_message(ctk_thermal->ctk_config, "Reset to fan speed default value."); } return; } /* reset_button_clicked() */ /***** * * Signal handler - Handles slider adjustments by the user. * */ static void adjustment_value_changed(GtkAdjustment *adjustment, gpointer user_data) { CtkThermal *ctk_thermal = CTK_THERMAL(user_data); gint i; /* Set flag for cooler whose operating level value changed */ for (i = 0; i < ctk_thermal->cooler_count; i++) { if (ctk_thermal->cooler_control[i].adjustment == adjustment) { ctk_thermal->cooler_control[i].changed = TRUE; } } ctk_thermal->settings_changed = TRUE; /* Enable the apply button */ gtk_widget_set_sensitive(ctk_thermal->apply_button, TRUE); /* Disable the reset button */ gtk_widget_set_sensitive(ctk_thermal->reset_button, FALSE); } /* adjustment_value_changed() */ /***** * * Syncs the gui to properly display the correct cooler level the user wants to * modify, or has modified with another NV_CONTROL client. * */ static void sync_gui_to_modify_cooler_level(CtkThermal *ctk_thermal) { GtkRange *gtk_range; GtkAdjustment *gtk_adjustment_fan; NVCTRLAttributeValidValuesRec cooler_range; gboolean can_access_cooler_level = TRUE; ReturnStatus ret; gint val, i, enabled; gint cooler_level; for (i = 0; i < ctk_thermal->cooler_count; i++) { /* Obtain the current value and range of the fan speed */ ret = NvCtrlGetAttribute(ctk_thermal->cooler_control[i].handle, NV_CTRL_THERMAL_COOLER_LEVEL, &cooler_level); if ( ret != NvCtrlSuccess ) { can_access_cooler_level = FALSE; } ctk_thermal->cooler_control[i].level = cooler_level; if ( can_access_cooler_level && ctk_thermal->show_fan_control_frame ) { /* Make cooler control slider reflect the right range/values */ if ( ctk_thermal->cooler_control[i].adjustment ) { ret = NvCtrlGetValidAttributeValues (ctk_thermal->cooler_control[i].handle, NV_CTRL_THERMAL_COOLER_LEVEL, &cooler_range); if ( ret != NvCtrlSuccess ) { can_access_cooler_level = FALSE; } ctk_thermal->cooler_control[i].range = cooler_range; if ( can_access_cooler_level ) { gtk_adjustment_fan = ctk_thermal->cooler_control[i].adjustment; gtk_range = GTK_RANGE(CTK_SCALE( ctk_thermal->cooler_control[i].widget)-> gtk_scale); g_signal_handlers_block_by_func(G_OBJECT(gtk_adjustment_fan), G_CALLBACK(adjustment_value_changed), (gpointer) ctk_thermal); gtk_range_set_range(gtk_range, ctk_thermal->cooler_control[i].range.u.range.min, ctk_thermal->cooler_control[i].range.u.range.max); val = gtk_adjustment_get_value(gtk_adjustment_fan); if (val != ctk_thermal->cooler_control[i].level) { gtk_adjustment_set_value(gtk_adjustment_fan, ctk_thermal->cooler_control[i].level); } g_signal_handlers_unblock_by_func(G_OBJECT( gtk_adjustment_fan), G_CALLBACK( adjustment_value_changed), (gpointer) ctk_thermal); } } else { /* Make cooler control checkbox reflect the right value */ g_signal_handlers_block_by_func(G_OBJECT( ctk_thermal->cooler_control[i].widget), G_CALLBACK( cooler_control_checkbox_toggled), (gpointer) ctk_thermal); enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( ctk_thermal->cooler_control[i].widget)); if (enabled && ctk_thermal->cooler_control[i].level) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( ctk_thermal->cooler_control[i].widget), !enabled); } g_signal_handlers_unblock_by_func(G_OBJECT( ctk_thermal->cooler_control[i].widget), G_CALLBACK(cooler_control_checkbox_toggled), (gpointer) ctk_thermal); } } } /* Update the gui sensitivity */ sync_gui_sensitivity(ctk_thermal); } /* sync_gui_to_modify_cooler_level() */ /***** * * Helper function - calls sync_gui_to_modify_cooler_level() * */ static gboolean sync_gui_to_update_cooler_event(gpointer user_data) { CtkThermal *ctk_thermal = (CtkThermal *) user_data; sync_gui_to_modify_cooler_level(ctk_thermal); return FALSE; } /* sync_gui_to_update_cooler_event() */ /***** * * Callback function when another NV_CONTROL client changed cooler level. * */ static void cooler_operating_level_changed(GtkObject *object, gpointer arg1, gpointer user_data) { /* sync_gui_to_modify_cooler_level() to be called once when all other * pending events are consumed. */ g_idle_add(sync_gui_to_update_cooler_event, (gpointer) user_data); } /* cooler_operating_level_changed() */ /***** * * Signal handler - Handles checkbox toggling by the user. * */ static void cooler_control_checkbox_toggled(GtkWidget *widget, gpointer user_data) { CtkThermal *ctk_thermal = CTK_THERMAL(user_data); gint i; /* Set bit for cooler whose value want to change */ for (i = 0; i < ctk_thermal->cooler_count; i++) { if ((ctk_thermal->cooler_control[i].widget) == widget) { ctk_thermal->cooler_control[i].changed = TRUE; ctk_thermal->settings_changed = TRUE; } } /* Enable the apply button */ gtk_widget_set_sensitive(ctk_thermal->apply_button, TRUE); } /* cooler_control_checkbox_toggled() */ static const nvctrlFormatName targetFormatNames[] = { { NV_CTRL_THERMAL_SENSOR_TARGET_NONE, "None" }, { NV_CTRL_THERMAL_SENSOR_TARGET_GPU, "GPU" }, { NV_CTRL_THERMAL_SENSOR_TARGET_MEMORY, "MEMORY" }, { NV_CTRL_THERMAL_SENSOR_TARGET_POWER_SUPPLY, "Power Supply" }, { NV_CTRL_THERMAL_SENSOR_TARGET_BOARD, "BOARD" }, { -1, NULL }, }; static const nvctrlFormatName providerFormatNames[] = { { NV_CTRL_THERMAL_SENSOR_PROVIDER_NONE, "None" }, { NV_CTRL_THERMAL_SENSOR_PROVIDER_GPU_INTERNAL, "GPU Internal" }, { NV_CTRL_THERMAL_SENSOR_PROVIDER_ADM1032, "ADM1032" }, { NV_CTRL_THERMAL_SENSOR_PROVIDER_ADT7461, "ADT7461" }, { NV_CTRL_THERMAL_SENSOR_PROVIDER_MAX6649, "MAX6649" }, { NV_CTRL_THERMAL_SENSOR_PROVIDER_MAX1617, "MAX1617" }, { NV_CTRL_THERMAL_SENSOR_PROVIDER_LM99, "LM99" }, { NV_CTRL_THERMAL_SENSOR_PROVIDER_LM89, "LM89" }, { NV_CTRL_THERMAL_SENSOR_PROVIDER_LM64, "LM64" }, { NV_CTRL_THERMAL_SENSOR_PROVIDER_G781, "G781" }, { NV_CTRL_THERMAL_SENSOR_PROVIDER_ADT7473, "ADT7473" }, { NV_CTRL_THERMAL_SENSOR_PROVIDER_SBMAX6649, "SBMAX6649" }, { NV_CTRL_THERMAL_SENSOR_PROVIDER_VBIOSEVT, "VBIOSEVT" }, { NV_CTRL_THERMAL_SENSOR_PROVIDER_OS, "OS" }, { -1, NULL }, }; /* * get_nvctrl_format_name() - return the name of the nvcontrol format */ static const char *get_nvctrl_format_name(const nvctrlFormatName *nvctrlFormatNames, const gint format) { gint i; for (i = 0; nvctrlFormatNames[i].name; i++) { if (nvctrlFormatNames[i].format == format) { return nvctrlFormatNames[i].name; } } return "Unknown"; } /* get_nvctrl_format_name() */ /* * pack_gauge() - pack gauge gui in hbox */ static GtkWidget *pack_gauge(GtkWidget *hbox, gint lower, gint upper, CtkConfig *ctk_config, const char *help) { GtkWidget *vbox, *frame, *eventbox, *gauge; /* GPU Core Temperature Gauge */ vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); frame = gtk_frame_new("Temperature"); gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox), FRAME_PADDING); gtk_container_add(GTK_CONTAINER(frame), hbox); gauge = ctk_gauge_new(lower, upper); eventbox = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(eventbox), gauge); gtk_box_pack_start(GTK_BOX(hbox), eventbox, FALSE, FALSE, 0); ctk_config_set_tooltip(ctk_config, eventbox, help); return gauge; } /* pack_gauge() */ /***** * * draw_sensor_gui() - prints sensor related information * */ static void draw_sensor_gui(GtkWidget *vbox1, CtkThermal *ctk_thermal, gboolean new_target_type, gint cur_sensor_idx, NvCtrlAttributeHandle *sensor_handle, gint reading, gint lower, gint upper, gint target, gint provider) { GtkWidget *hbox, *hbox1, *hbox2, *vbox, *vbox2, *table; GtkWidget *frame, *label, *hsep; GtkWidget *eventbox = NULL; gchar *s; hbox = gtk_hbox_new(FALSE, FRAME_PADDING); gtk_container_set_border_width(GTK_CONTAINER(hbox), 10); hbox1 = gtk_hbox_new(FALSE, FRAME_PADDING); gtk_box_pack_start(GTK_BOX(vbox1), hbox1, FALSE, FALSE, 0); vbox2 = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox1), vbox2, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); /* GPU sensor ID */ hbox2 = gtk_hbox_new(FALSE, 0); s = g_strdup_printf("ID: %d", cur_sensor_idx); label = gtk_label_new(s); g_free(s); gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); table = gtk_table_new(4, 4, FALSE); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); /* sensor target type */ if (target) { add_table_row_with_help_text(table, ctk_thermal->ctk_config, __thermal_sensor_target_help, 0, 0, 0, 0.5, "Target:", 0, 0.5, get_nvctrl_format_name(targetFormatNames, target)); ctk_thermal->sensor_info[cur_sensor_idx].target_type = label; } else { ctk_thermal->sensor_info[cur_sensor_idx].target_type = NULL; } /* sensor provider type */ if (provider) { add_table_row_with_help_text(table, ctk_thermal->ctk_config, __thermal_sensor_provider_help, 1, 0, 0, 0.5, "Provider:", 0, 0.5, get_nvctrl_format_name(providerFormatNames, provider)); ctk_thermal->sensor_info[cur_sensor_idx].provider_type = label; } else { ctk_thermal->sensor_info[cur_sensor_idx].provider_type = NULL; } /* thermal sensor reading */ if (reading) { hbox2 = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox2, 0, 1, 3, 4, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0); label = gtk_label_new("Temperature:"); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); frame = gtk_frame_new(NULL); eventbox = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(eventbox), frame); gtk_table_attach(GTK_TABLE(table), eventbox, 1, 2, 3, 4, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0); label = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(frame), label); ctk_thermal->sensor_info[cur_sensor_idx].temp_label = label; ctk_config_set_tooltip(ctk_thermal->ctk_config, eventbox, __thermal_sensor_reading_help); } else { ctk_thermal->sensor_info[cur_sensor_idx].temp_label = NULL; } /* GPU Core Temperature Gauge */ ctk_thermal->sensor_info[cur_sensor_idx].core_gauge = pack_gauge(hbox, lower, upper, ctk_thermal->ctk_config, __temp_level_help); /* add horizontal bar between sensors */ if (cur_sensor_idx+1 != ctk_thermal->sensor_count) { hbox1 = gtk_hbox_new(FALSE, 0); hsep = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox2), hbox1, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox1), hsep, TRUE, TRUE, 10); } } /* draw_sensor_gui() */ GtkWidget* ctk_thermal_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event) { GObject *object; CtkThermal *ctk_thermal; CtrlHandles *h; GtkObject *adjustment; GtkWidget *hbox = NULL, *hbox1, *hbox2, *table, *vbox; GtkWidget *frame, *banner, *label; GtkWidget *vbox1; GtkWidget *eventbox = NULL, *entry; GtkWidget *fan_control_frame; GtkWidget *hsep; GtkWidget *scale; GtkWidget *alignment; ReturnStatus ret; ReturnStatus ret1; NvCtrlAttributeHandle *cooler_handle; NvCtrlAttributeHandle *sensor_handle; NVCTRLAttributeValidValuesRec cooler_range; NVCTRLAttributeValidValuesRec sensor_range; gint trigger, core, ambient; gint upper; gchar *s; gint i, j; gint cooler_level; gint cooler_control_type; gchar *name = NULL; int *pDataCooler = NULL, *pDataSensor = NULL; gint cooler_count = 0, sensor_count = 0; int len, value; int major = 0, minor = 0; Bool can_access_cooler_level; Bool cooler_control_enabled; int cur_cooler_idx = 0; int cur_sensor_idx = 0; Bool thermal_sensor_target_type_supported = FALSE; /* make sure we have a handle */ g_return_val_if_fail(handle != NULL, NULL); /* * Check for NV-CONTROL protocol version. * In version 1.23 we added support for querying per sensor information * This used for backward compatibility between new nvidia-settings * and older X driver */ ret = NvCtrlGetAttribute(handle, NV_CTRL_ATTR_NV_MAJOR_VERSION, &major); ret1 = NvCtrlGetAttribute(handle, NV_CTRL_ATTR_NV_MINOR_VERSION, &minor); if ((ret == NvCtrlSuccess) && (ret1 == NvCtrlSuccess) && ((major > 1) || ((major == 1) && (minor > 22)))) { thermal_sensor_target_type_supported = TRUE; } if (!thermal_sensor_target_type_supported) { /* check if this screen supports thermal querying */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_CORE_TEMPERATURE, &core); if (ret != NvCtrlSuccess) { /* thermal information unavailable */ return NULL; } ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_MAX_CORE_THRESHOLD, &upper); if (ret != NvCtrlSuccess) { /* thermal information unavailable */ return NULL; } ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_CORE_THRESHOLD, &trigger); if (ret != NvCtrlSuccess) { /* thermal information unavailable */ return NULL; } } /* Query the list of sensors attached to this GPU */ ret = NvCtrlGetBinaryAttribute(handle, 0, NV_CTRL_BINARY_DATA_THERMAL_SENSORS_USED_BY_GPU, (unsigned char **)(&pDataSensor), &len); if ( ret == NvCtrlSuccess ) { sensor_count = pDataSensor[0]; } /* Query the list of coolers attached to this GPU */ ret = NvCtrlGetBinaryAttribute(handle, 0, NV_CTRL_BINARY_DATA_COOLERS_USED_BY_GPU, (unsigned char **)(&pDataCooler), &len); if ( ret == NvCtrlSuccess ) { cooler_count = pDataCooler[0]; } /* return if sensor and Fan information not available */ if ((thermal_sensor_target_type_supported && !sensor_count) && !cooler_count) { XFree(pDataSensor); XFree(pDataCooler); return NULL; } /* create the CtkThermal object */ object = g_object_new(CTK_TYPE_THERMAL, NULL); ctk_thermal = CTK_THERMAL(object); ctk_thermal->attribute_handle = handle; ctk_thermal->ctk_config = ctk_config; ctk_thermal->settings_changed = FALSE; ctk_thermal->show_fan_control_frame = TRUE; ctk_thermal->cooler_count = cooler_count; ctk_thermal->sensor_count = sensor_count; ctk_thermal->thermal_sensor_target_type_supported = thermal_sensor_target_type_supported; /* set container properties for the CtkThermal widget */ gtk_box_set_spacing(GTK_BOX(ctk_thermal), 10); /* banner */ banner = ctk_banner_image_new(BANNER_ARTWORK_THERMAL); gtk_box_pack_start(GTK_BOX(object), banner, FALSE, FALSE, 0); /* Check if we can control cooler state */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_COOLER_MANUAL_CONTROL, &value); if ( ret != NvCtrlSuccess ) { ctk_thermal->show_fan_control_frame = FALSE; value = NV_CTRL_GPU_COOLER_MANUAL_CONTROL_FALSE; } cooler_control_enabled = (value == NV_CTRL_GPU_COOLER_MANUAL_CONTROL_TRUE); can_access_cooler_level = TRUE; ctk_thermal->cooler_control_enabled = cooler_control_enabled; ctk_thermal->enable_reset_button = FALSE; if ( cooler_control_enabled ) { __license_accepted = TRUE; } /* Retrieve CtrlHandles from ctk_config */ h = ctk_config->pCtrlHandles; /* Thermal Information */ vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(object), vbox, FALSE, FALSE, 0); if (thermal_sensor_target_type_supported) { if ( ctk_thermal->sensor_count == 0 ) { goto sensor_end; } hbox1 = gtk_hbox_new(FALSE, FRAME_PADDING); gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 0); label = gtk_label_new("Thermal Sensor Information"); gtk_box_pack_start(GTK_BOX(hbox1), label, FALSE, FALSE, 0); hsep = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox1), hsep, TRUE, TRUE, 0); if (ctk_thermal->sensor_count > 0) { ctk_thermal->sensor_info = (SensorInfoPtr) malloc(ctk_thermal->sensor_count * sizeof(SensorInfoRec)); } for (j = 1; j <= ctk_thermal->sensor_count; j++) { gint reading, target, provider; sensor_handle = h->targets[THERMAL_SENSOR_TARGET].t[pDataSensor[j]].h; if ( !sensor_handle ) { continue; } ctk_thermal->sensor_info[cur_sensor_idx].handle = sensor_handle; /* check if this screen supports thermal querying */ ret = NvCtrlGetAttribute(sensor_handle, NV_CTRL_THERMAL_SENSOR_READING, &reading); if (ret != NvCtrlSuccess) { /* sensor information unavailable */ reading = 0; } ret = NvCtrlGetValidAttributeValues(sensor_handle, NV_CTRL_THERMAL_SENSOR_READING, &sensor_range); if (ret != NvCtrlSuccess) { /* sensor information unavailable */ sensor_range.u.range.min = sensor_range.u.range.max = 0; } ret = NvCtrlGetAttribute(sensor_handle, NV_CTRL_THERMAL_SENSOR_TARGET, &target); if (ret != NvCtrlSuccess) { /* sensor information unavailable */ target = 0; } ret = NvCtrlGetAttribute(sensor_handle, NV_CTRL_THERMAL_SENSOR_PROVIDER, &provider); if (ret != NvCtrlSuccess) { /* sensor information unavailable */ provider = 0; } /* print sensor related information */ draw_sensor_gui(vbox, ctk_thermal, thermal_sensor_target_type_supported, cur_sensor_idx, sensor_handle, reading, sensor_range.u.range.min, sensor_range.u.range.max, target, provider); cur_sensor_idx++; } } else { /* GPU Core Threshold Temperature */ vbox1 = gtk_vbox_new(FALSE, 0); hbox1 = gtk_hbox_new(FALSE, 0); frame = gtk_frame_new("Slowdown Threshold"); gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox1), vbox1, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox1), frame, FALSE, FALSE, 0); hbox2 = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox2), FRAME_PADDING); gtk_container_add(GTK_CONTAINER(frame), hbox2); label = gtk_label_new("Degrees: "); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); eventbox = gtk_event_box_new(); gtk_box_pack_start(GTK_BOX(hbox2), eventbox, FALSE, FALSE, 0); entry = gtk_entry_new_with_max_length(5); gtk_container_add(GTK_CONTAINER(eventbox), entry); gtk_widget_set_sensitive(entry, FALSE); gtk_entry_set_width_chars(GTK_ENTRY(entry), 5); s = g_strdup_printf(" %d ", trigger); gtk_entry_set_text(GTK_ENTRY(entry), s); g_free(s); ctk_config_set_tooltip(ctk_config, eventbox, __core_threshold_help); label = gtk_label_new(" C"); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); /* GPU Core Temperature */ table = gtk_table_new(2, 2, FALSE); gtk_box_pack_end(GTK_BOX(vbox1), table, FALSE, FALSE, 0); hbox2 = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox2, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Core Temperature:"); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); frame = gtk_frame_new(NULL); eventbox = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(eventbox), frame); gtk_table_attach(GTK_TABLE(table), eventbox, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0); label = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(frame), label); ctk_thermal->core_label = label; ctk_config_set_tooltip(ctk_config, eventbox, __core_temp_help); /* Ambient Temperature */ ret = NvCtrlGetAttribute(handle, NV_CTRL_AMBIENT_TEMPERATURE, &ambient); if (ret == NvCtrlSuccess) { hbox2 = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox2, 0, 1, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Ambient Temperature:"); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); frame = gtk_frame_new(NULL); eventbox = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(eventbox), frame); gtk_table_attach(GTK_TABLE(table), eventbox, 1, 2, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0); label = gtk_label_new(NULL); gtk_container_add(GTK_CONTAINER(frame), label); ctk_thermal->ambient_label = label; ctk_config_set_tooltip(ctk_config, eventbox, __ambient_temp_help); } else { ctk_thermal->ambient_label = NULL; } /* GPU Core Temperature Gauge */ ctk_thermal->core_gauge = pack_gauge(hbox1, 25, upper, ctk_config, __temp_level_help); } sensor_end: /* Check for if Fans present on GPU */ if ( ctk_thermal->cooler_count == 0 ) { goto end; } /* Fan Information Title */ vbox = gtk_vbox_new(FALSE, 5); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(object), vbox, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new("Fan Information"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hsep = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hsep, TRUE, TRUE, 5); ctk_thermal->fan_information_box = vbox; /* Fan Information Table */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); ctk_thermal->cooler_table_hbox = hbox; /* Create cooler level control sliders/checkbox */ ctk_thermal->cooler_control = (CoolerControlPtr) calloc(ctk_thermal->cooler_count, sizeof(CoolerControlRec)); for (j = 1; j <= ctk_thermal->cooler_count; j++) { cooler_handle = h->targets[COOLER_TARGET].t[pDataCooler[j]].h; if ( !cooler_handle ) { continue; } /* Get current cooler level and range */ ret = NvCtrlGetAttribute(cooler_handle, NV_CTRL_THERMAL_COOLER_LEVEL, &cooler_level); if ( ret != NvCtrlSuccess ) { can_access_cooler_level = FALSE; } ret = NvCtrlGetValidAttributeValues(cooler_handle, NV_CTRL_THERMAL_COOLER_LEVEL, &cooler_range); if ( ret != NvCtrlSuccess ) { can_access_cooler_level = FALSE; } ctk_thermal->cooler_control[cur_cooler_idx].level = cooler_level; ctk_thermal->cooler_control[cur_cooler_idx].range = cooler_range; ctk_thermal->cooler_control[cur_cooler_idx].handle = cooler_handle; /* Create the object for receiving NV-CONTROL events */ ctk_thermal->cooler_control[cur_cooler_idx].event = CTK_EVENT(ctk_event_new(cooler_handle)); if ( can_access_cooler_level && ctk_thermal->show_fan_control_frame ) { /* * Get NV_CTRL_THERMAL_COOLER_CONTROL_TYPE to decide cooler * control widget should be slider or checkbox. */ ret = NvCtrlGetAttribute(cooler_handle, NV_CTRL_THERMAL_COOLER_CONTROL_TYPE, &cooler_control_type); if ((ret == NvCtrlSuccess) && (cooler_control_type == NV_CTRL_THERMAL_COOLER_CONTROL_TYPE_VARIABLE)) { adjustment = gtk_adjustment_new(cooler_level, cooler_range.u.range.min, cooler_range.u.range.max, 1, 5, 0.0); name = g_strdup_printf("Fan %d Speed", cur_cooler_idx); scale = ctk_scale_new(GTK_ADJUSTMENT(adjustment), name, ctk_config, G_TYPE_INT); ctk_thermal->cooler_control[cur_cooler_idx].widget = scale; ctk_thermal->cooler_control[cur_cooler_idx].adjustment = GTK_ADJUSTMENT(adjustment); g_signal_connect(adjustment, "value_changed", G_CALLBACK(adjustment_value_changed), (gpointer) ctk_thermal); } else if ((ret == NvCtrlSuccess) && (cooler_control_type == NV_CTRL_THERMAL_COOLER_CONTROL_TYPE_TOGGLE)) { name = g_strdup_printf("Fan-%d Speed", cur_cooler_idx); ctk_thermal->cooler_control[cur_cooler_idx].widget = gtk_check_button_new_with_label(name); g_signal_connect(G_OBJECT(ctk_thermal->cooler_control [cur_cooler_idx].widget), "toggled", G_CALLBACK(cooler_control_checkbox_toggled), (gpointer) ctk_thermal); ctk_thermal->cooler_control[cur_cooler_idx].adjustment = NULL; } free(name); gtk_widget_set_sensitive(ctk_thermal->cooler_control [cur_cooler_idx].widget, cooler_control_enabled); } cur_cooler_idx++; } if ( ctk_thermal->cooler_count && ctk_thermal->show_fan_control_frame ) { /* Create the enable dialog */ ctk_thermal->enable_dialog = ctk_license_dialog_new(GTK_WIDGET(ctk_thermal), "Thermal Settings"); /* Create the Enable Cooler control checkbox widget */ ctk_thermal->enable_checkbox = gtk_check_button_new_with_label("Enable GPU Fan Settings"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_thermal->enable_checkbox), cooler_control_enabled); g_signal_connect(G_OBJECT(ctk_thermal->enable_checkbox), "toggled", G_CALLBACK(cooler_control_state_toggled), (gpointer) ctk_thermal); ctk_config_set_tooltip(ctk_config, ctk_thermal->enable_checkbox, __enable_button_help); /* Create the Apply button widget */ ctk_thermal->apply_button = gtk_button_new_with_label("Apply"); g_signal_connect(G_OBJECT(ctk_thermal->apply_button), "clicked", G_CALLBACK(apply_button_clicked), (gpointer) ctk_thermal); ctk_config_set_tooltip(ctk_config, ctk_thermal->apply_button, __apply_button_help); gtk_widget_set_sensitive(ctk_thermal->apply_button, FALSE); /* Create the Reset hardware button widget */ ctk_thermal->reset_button = gtk_button_new_with_label("Reset Hardware Defaults"); g_signal_connect(G_OBJECT(ctk_thermal->reset_button), "clicked", G_CALLBACK(reset_button_clicked), (gpointer) ctk_thermal); ctk_config_set_tooltip(ctk_config, ctk_thermal->reset_button, __reset_button_help); gtk_widget_set_sensitive(ctk_thermal->reset_button, FALSE); /* Add Cooler Control frame */ hbox = gtk_hbox_new(FALSE, 5); fan_control_frame = gtk_frame_new(NULL); gtk_container_set_border_width(GTK_CONTAINER(vbox), 0); gtk_box_pack_start(GTK_BOX(vbox), fan_control_frame, FALSE, FALSE, 5); vbox = gtk_vbox_new(FALSE, 0); vbox1 = gtk_vbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(vbox1), 5); gtk_container_add(GTK_CONTAINER(fan_control_frame), vbox); gtk_box_pack_start(GTK_BOX(vbox), ctk_thermal->enable_checkbox, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), vbox1, FALSE, FALSE, 0); for (i = 0; i < ctk_thermal->cooler_count; i++) { if (ctk_thermal->cooler_control[i].widget) { gtk_box_pack_start(GTK_BOX(vbox1), ctk_thermal->cooler_control[i].widget, FALSE, FALSE, 5); } } /* Add the Apply and Reset buttons */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_thermal->apply_button, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_thermal->reset_button, FALSE, FALSE, 0); alignment = gtk_alignment_new(1, 1, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), hbox); gtk_box_pack_start(GTK_BOX(vbox), alignment, TRUE, TRUE, 5); for (i = 0; i < ctk_thermal->cooler_count; i++) { g_signal_connect(G_OBJECT(ctk_thermal->cooler_control[i].event), CTK_EVENT_NAME(NV_CTRL_THERMAL_COOLER_LEVEL), G_CALLBACK(cooler_operating_level_changed), (gpointer) ctk_thermal); } g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_GPU_COOLER_MANUAL_CONTROL), G_CALLBACK(cooler_control_state_received), (gpointer) ctk_thermal); } end: XFree(pDataSensor); pDataSensor = NULL; XFree(pDataCooler); pDataCooler = NULL; /* sync GUI to current server settings */ sync_gui_to_modify_cooler_level(ctk_thermal); update_thermal_info(ctk_thermal); /* Register a timer callback to update the temperatures */ s = g_strdup_printf("Thermal Monitor (GPU %d)", NvCtrlGetTargetId(handle)); ctk_config_add_timer(ctk_thermal->ctk_config, DEFAULT_UPDATE_THERMAL_INFO_TIME_INTERVAL, s, (GSourceFunc) update_thermal_info, (gpointer) ctk_thermal); g_free(s); gtk_widget_show_all(GTK_WIDGET(ctk_thermal)); return GTK_WIDGET(ctk_thermal); } GtkTextBuffer *ctk_thermal_create_help(GtkTextTagTable *table, CtkThermal *ctk_thermal) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "Thermal Settings Help"); /* if sensor not available skip online help */ if (!ctk_thermal->sensor_count) { goto next_help; } if (!ctk_thermal->thermal_sensor_target_type_supported) { ctk_help_heading(b, &i, "Slowdown Threshold"); ctk_help_para(b, &i, "%s", __core_threshold_help); ctk_help_heading(b, &i, "Core Temperature"); ctk_help_para(b, &i, "%s", __core_temp_help); if (ctk_thermal->ambient_label) { ctk_help_heading(b, &i, "Ambient Temperature"); ctk_help_para(b, &i, "%s", __ambient_temp_help); } } else { ctk_help_title(b, &i, "Thermal Sensor Information Help"); ctk_help_heading(b, &i, "ID"); ctk_help_para(b, &i, "%s", __thermal_sensor_id_help); ctk_help_heading(b, &i, "Temperature"); ctk_help_para(b, &i, "%s", __thermal_sensor_reading_help); ctk_help_heading(b, &i, "Target"); ctk_help_para(b, &i, "%s", __thermal_sensor_target_help); ctk_help_heading(b, &i, "Provider"); ctk_help_para(b, &i, "%s", __thermal_sensor_provider_help); } ctk_help_heading(b, &i, "Level"); ctk_help_para(b, &i, "%s", __temp_level_help); next_help: /* if Fan not available skip online help */ if (!ctk_thermal->cooler_count) { goto done; } ctk_help_title(b, &i, "GPU Fan Settings Help"); ctk_help_heading(b, &i, "ID"); ctk_help_para(b, &i, "%s", __fan_id_help); ctk_help_heading(b, &i, "Speed (RPM)"); ctk_help_para(b, &i,"%s", __fan_rpm_help); ctk_help_heading(b, &i, "Speed (%%)"); ctk_help_para(b, &i, "%s", __fan_speed_help); ctk_help_heading(b, &i, "Type"); ctk_help_para(b, &i, "%s", __fan_control_type_help); ctk_help_heading(b, &i, "Cooling Target"); ctk_help_para(b, &i, "%s", __fan_cooling_target_help); ctk_help_heading(b, &i, "Enable GPU Fan Settings"); ctk_help_para(b, &i, "%s", __enable_button_help); if ( ctk_thermal->show_fan_control_frame ) { ctk_help_heading(b, &i, "Enable GPU Fan Settings"); ctk_help_para(b, &i, "%s", __apply_button_help); ctk_help_heading(b, &i, "Enable GPU Fan Settings"); ctk_help_para(b, &i, "%s", __reset_button_help); } done: ctk_help_finish(b); return b; } void ctk_thermal_start_timer(GtkWidget *widget) { CtkThermal *ctk_thermal = CTK_THERMAL(widget); /* Start the thermal timer */ ctk_config_start_timer(ctk_thermal->ctk_config, (GSourceFunc) update_thermal_info, (gpointer) ctk_thermal); } void ctk_thermal_stop_timer(GtkWidget *widget) { CtkThermal *ctk_thermal = CTK_THERMAL(widget); /* Stop the thermal timer */ ctk_config_stop_timer(ctk_thermal->ctk_config, (GSourceFunc) update_thermal_info, (gpointer) ctk_thermal); } nvidia-settings/src/gtk+-2.x/ctkapcprofilemodel.c0000664000175000017500000006016712236467170022123 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2013 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // Tree model implementation for operating on profiles in an AppProfileConfig #include #include #include "ctkapcprofilemodel.h" #include "ctkappprofile.h" #include #include static GObjectClass *parent_class = NULL; // Forward declarations static void apc_profile_model_init(CtkApcProfileModel *prof_model); static void apc_profile_model_finalize(GObject *object); static void apc_profile_model_tree_model_init(GtkTreeModelIface *iface); static GtkTreeModelFlags apc_profile_model_get_flags(GtkTreeModel *tree_model); static gint apc_profile_model_get_n_columns(GtkTreeModel *tree_model); static GType apc_profile_model_get_column_type(GtkTreeModel *tree_model, gint index); static gboolean apc_profile_model_get_iter(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path); static GtkTreePath *apc_profile_model_get_path(GtkTreeModel *tree_model, GtkTreeIter *iter); static gboolean apc_profile_model_iter_next(GtkTreeModel *tree_model, GtkTreeIter *iter); static gboolean apc_profile_model_iter_children(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent); static gboolean apc_profile_model_iter_has_child(GtkTreeModel *tree_model, GtkTreeIter *iter); static gint apc_profile_model_iter_n_children(GtkTreeModel *tree_model, GtkTreeIter *iter); static gboolean apc_profile_model_iter_nth_child(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, gint n); static gboolean apc_profile_model_iter_parent(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child); static void apc_profile_model_class_init(CtkApcProfileModelClass *klass); static void apc_profile_model_get_value(GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value); static void apc_profile_model_tree_sortable_init(GtkTreeSortableIface *iface); static gboolean apc_profile_model_get_sort_column_id(GtkTreeSortable *sortable, gint *sort_column_id, GtkSortType *order); static void apc_profile_model_set_sort_column_id(GtkTreeSortable *sortable, gint sort_column_id, GtkSortType order); static void apc_profile_model_set_sort_func(GtkTreeSortable *sortable, gint sort_column_id, GtkTreeIterCompareFunc sort_func, gpointer user_data, GDestroyNotify destroy); static void apc_profile_model_set_default_sort_func(GtkTreeSortable *sortable, GtkTreeIterCompareFunc sort_func, gpointer user_data, GDestroyNotify destroy); static gboolean apc_profile_model_has_default_sort_func(GtkTreeSortable *sortable); GType ctk_apc_profile_model_get_type(void) { static GType apc_profile_model_type = 0; if (!apc_profile_model_type) { static const GTypeInfo apc_profile_model_info = { sizeof (CtkApcProfileModelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) apc_profile_model_class_init, /* constructor */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkApcProfileModel), 0, /* n_preallocs */ (GInstanceInitFunc) apc_profile_model_init, /* instance_init */ NULL /* value_table */ }; static const GInterfaceInfo tree_model_info = { (GInterfaceInitFunc) apc_profile_model_tree_model_init, /* interface_init */ NULL, /* interface_finalize */ NULL /* interface_data */ }; static const GInterfaceInfo tree_sortable_info = { (GInterfaceInitFunc) apc_profile_model_tree_sortable_init, /* interface_init */ NULL, /* interface_finalize */ NULL /* interface_data */ }; apc_profile_model_type = g_type_register_static(G_TYPE_OBJECT, "CtkApcProfileModel", &apc_profile_model_info, 0); g_type_add_interface_static(apc_profile_model_type, GTK_TYPE_TREE_MODEL, &tree_model_info); g_type_add_interface_static(apc_profile_model_type, GTK_TYPE_TREE_SORTABLE, &tree_sortable_info); } return apc_profile_model_type; } static void apc_profile_model_class_init(CtkApcProfileModelClass *klass) { GObjectClass *object_class; parent_class = (GObjectClass *)g_type_class_peek_parent(klass); object_class = (GObjectClass *)klass; object_class->finalize = apc_profile_model_finalize; } static gint apc_profile_model_sort_name(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data) { gint result; gchar *profile_name_a, *profile_name_b; gtk_tree_model_get(model, a, CTK_APC_PROFILE_MODEL_COL_NAME, &profile_name_a, -1); gtk_tree_model_get(model, b, CTK_APC_PROFILE_MODEL_COL_NAME, &profile_name_b, -1); result = strcmp(profile_name_a, profile_name_b); free(profile_name_a); free(profile_name_b); return result; } static gint apc_profile_model_sort_filename(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data) { gint result; gchar *filename_a, *filename_b; gtk_tree_model_get(model, a, CTK_APC_PROFILE_MODEL_COL_FILENAME, &filename_a, -1); gtk_tree_model_get(model, b, CTK_APC_PROFILE_MODEL_COL_FILENAME, &filename_b, -1); result = strcmp(filename_a, filename_b); free(filename_a); free(filename_b); return result; } static gint apc_profile_model_sort_settings(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data) { gint result; json_t *settings_a, *settings_b; char *settings_string_a, *settings_string_b; gtk_tree_model_get(model, a, CTK_APC_PROFILE_MODEL_COL_SETTINGS, &settings_a, -1); gtk_tree_model_get(model, b, CTK_APC_PROFILE_MODEL_COL_SETTINGS, &settings_b, -1); settings_string_a = serialize_settings(settings_a, FALSE); settings_string_b = serialize_settings(settings_b, FALSE); result = strcmp(settings_string_a, settings_string_b); free(settings_string_a); free(settings_string_b); json_decref(settings_a); json_decref(settings_b); return result; } static void apc_profile_model_init(CtkApcProfileModel *prof_model) { prof_model->stamp = g_random_int(); // random int to catch iterator type mismatches prof_model->config = NULL; prof_model->profiles = g_array_new(FALSE, TRUE, sizeof(char *)); prof_model->sort_column_id = CTK_APC_PROFILE_MODEL_DEFAULT_SORT_COL; prof_model->order = GTK_SORT_DESCENDING; prof_model->sort_funcs[CTK_APC_PROFILE_MODEL_COL_NAME] = apc_profile_model_sort_name; prof_model->sort_funcs[CTK_APC_PROFILE_MODEL_COL_FILENAME] = apc_profile_model_sort_filename; prof_model->sort_funcs[CTK_APC_PROFILE_MODEL_COL_SETTINGS] = apc_profile_model_sort_settings; memset(prof_model->sort_user_data, 0, sizeof(prof_model->sort_user_data)); memset(prof_model->sort_destroy_notify, 0, sizeof(prof_model->sort_destroy_notify)); } static void apc_profile_model_finalize(GObject *object) { guint i; CtkApcProfileModel *prof_model = CTK_APC_PROFILE_MODEL(object); for (i = 0; i < prof_model->profiles->len; i++) { char *profile_name = g_array_index(prof_model->profiles, char*, i); free(profile_name); } for (i = 0; i < CTK_APC_PROFILE_MODEL_N_COLUMNS; i++) { if (prof_model->sort_destroy_notify[i]) { (*prof_model->sort_destroy_notify[i])( prof_model->sort_user_data[i] ); } } g_array_free(prof_model->profiles, TRUE); parent_class->finalize(object); } static void apc_profile_model_tree_model_init(GtkTreeModelIface *iface) { iface->get_flags = apc_profile_model_get_flags; iface->get_n_columns = apc_profile_model_get_n_columns; iface->get_column_type = apc_profile_model_get_column_type; iface->get_iter = apc_profile_model_get_iter; iface->get_path = apc_profile_model_get_path; iface->get_value = apc_profile_model_get_value; iface->iter_next = apc_profile_model_iter_next; iface->iter_children = apc_profile_model_iter_children; iface->iter_has_child = apc_profile_model_iter_has_child; iface->iter_n_children = apc_profile_model_iter_n_children; iface->iter_nth_child = apc_profile_model_iter_nth_child; iface->iter_parent = apc_profile_model_iter_parent; } static void apc_profile_model_tree_sortable_init(GtkTreeSortableIface *iface) { iface->get_sort_column_id = apc_profile_model_get_sort_column_id; iface->set_sort_column_id = apc_profile_model_set_sort_column_id; iface->set_sort_func = apc_profile_model_set_sort_func; iface->set_default_sort_func = apc_profile_model_set_default_sort_func; iface->has_default_sort_func = apc_profile_model_has_default_sort_func; } static GtkTreeModelFlags apc_profile_model_get_flags(GtkTreeModel *tree_model) { return GTK_TREE_MODEL_LIST_ONLY; } static gint apc_profile_model_get_n_columns(GtkTreeModel *tree_model) { return CTK_APC_PROFILE_MODEL_N_COLUMNS; } static GType apc_profile_model_get_column_type(GtkTreeModel *tree_model, gint index) { switch (index) { case CTK_APC_PROFILE_MODEL_COL_NAME: return G_TYPE_STRING; case CTK_APC_PROFILE_MODEL_COL_FILENAME: return G_TYPE_STRING; case CTK_APC_PROFILE_MODEL_COL_SETTINGS: return G_TYPE_POINTER; default: assert(0); return G_TYPE_INVALID; } } static inline void set_iter_to_index(GtkTreeIter *iter, intptr_t idx) { iter->user_data = (gpointer)idx; iter->user_data2 = NULL; // unused iter->user_data3 = NULL; // unused } static gboolean apc_profile_model_get_iter(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path) { CtkApcProfileModel *prof_model; gint depth, *indices; intptr_t n; assert(path); prof_model = CTK_APC_PROFILE_MODEL(tree_model); indices = gtk_tree_path_get_indices(path); depth = gtk_tree_path_get_depth(path); assert(depth == 1); (void)(depth); n = indices[0]; if (n >= prof_model->profiles->len || n < 0) { return FALSE; } iter->stamp = prof_model->stamp; set_iter_to_index(iter, n); return TRUE; } static GtkTreePath *apc_profile_model_get_path(GtkTreeModel *tree_model, GtkTreeIter *iter) { GtkTreePath *path; intptr_t n; g_return_val_if_fail(iter, NULL); n = (intptr_t)iter->user_data; path = gtk_tree_path_new(); gtk_tree_path_append_index(path, n); return path; } static void apc_profile_model_get_value(GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value) { const char *profile_name; const char *filename; CtkApcProfileModel *prof_model; const json_t *profile; json_t *settings; intptr_t n; g_value_init(value, apc_profile_model_get_column_type(tree_model, column)); prof_model = CTK_APC_PROFILE_MODEL(tree_model); n = (intptr_t)iter->user_data; profile_name = g_array_index(prof_model->profiles, char*, n); switch (column) { case CTK_APC_PROFILE_MODEL_COL_NAME: g_value_set_string(value, profile_name); break; case CTK_APC_PROFILE_MODEL_COL_FILENAME: filename = nv_app_profile_config_get_profile_filename(prof_model->config, profile_name); assert(filename); g_value_set_string(value, filename); break; case CTK_APC_PROFILE_MODEL_COL_SETTINGS: profile = nv_app_profile_config_get_profile(prof_model->config, profile_name); settings = json_deep_copy(json_object_get(profile, "settings")); assert(settings); g_value_set_pointer(value, settings); break; default: assert(0); break; } } static gboolean apc_profile_model_iter_next(GtkTreeModel *tree_model, GtkTreeIter *iter) { CtkApcProfileModel *prof_model; intptr_t n; prof_model = CTK_APC_PROFILE_MODEL(tree_model); if (!iter) { return FALSE; } n = (intptr_t)iter->user_data; n++; if (n >= prof_model->profiles->len) { return FALSE; } set_iter_to_index(iter, n); return TRUE; } static gboolean apc_profile_model_iter_children(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent) { CtkApcProfileModel *prof_model = CTK_APC_PROFILE_MODEL(tree_model); if (parent) { return FALSE; } // (parent == NULL) => return first profile if (!prof_model->profiles->len) { return FALSE; } iter->stamp = prof_model->stamp; set_iter_to_index(iter, 0); return TRUE; } static gboolean apc_profile_model_iter_has_child(GtkTreeModel *tree_model, GtkTreeIter *iter) { return FALSE; } static gint apc_profile_model_iter_n_children(GtkTreeModel *tree_model, GtkTreeIter *iter) { CtkApcProfileModel *prof_model = CTK_APC_PROFILE_MODEL(tree_model); return iter ? 0 : (gint)prof_model->profiles->len; } static gboolean apc_profile_model_iter_nth_child(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, gint n_in) { intptr_t n = (intptr_t)n_in; CtkApcProfileModel *prof_model = CTK_APC_PROFILE_MODEL(tree_model); if (parent || (n < 0) || (n >= prof_model->profiles->len)) { return FALSE; } iter->stamp = prof_model->stamp; set_iter_to_index(iter, n); return TRUE; } static gboolean apc_profile_model_iter_parent(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child) { return FALSE; } void ctk_apc_profile_model_attach(CtkApcProfileModel *prof_model, AppProfileConfig *config) { GtkTreePath *path; GtkTreeIter iter; AppProfileConfigProfileIter *prof_iter; const char *profile_name, *dup_profile_name; gint i; prof_model->config = config; // Clear existing profiles from the model path = gtk_tree_path_new_from_indices(0, -1); for (i = 0; i < prof_model->profiles->len; i++) { // Emit a "row-deleted" signal for each deleted profile // (we can just keep calling this on row 0) gtk_tree_model_row_deleted(GTK_TREE_MODEL(prof_model), path); } gtk_tree_path_free(path); g_array_set_size(prof_model->profiles, 0); // Load the profiles from the config into the model for (prof_iter = nv_app_profile_config_profile_iter(config), i = 0; prof_iter; prof_iter = nv_app_profile_config_profile_iter_next(prof_iter)) { profile_name = nv_app_profile_config_profile_iter_name(prof_iter); dup_profile_name = strdup(profile_name); g_array_append_val(prof_model->profiles, dup_profile_name); // emit a "row-inserted" signal for each new profile path = gtk_tree_path_new_from_indices(i++, -1); apc_profile_model_get_iter(GTK_TREE_MODEL(prof_model), &iter, path); gtk_tree_model_row_inserted(GTK_TREE_MODEL(prof_model), path, &iter); gtk_tree_path_free(path); } } CtkApcProfileModel *ctk_apc_profile_model_new(AppProfileConfig *config) { CtkApcProfileModel *prof_model; prof_model = CTK_APC_PROFILE_MODEL(g_object_new(CTK_TYPE_APC_PROFILE_MODEL, NULL)); assert(prof_model); ctk_apc_profile_model_attach(prof_model, config); return prof_model; } static gint find_index_of_profile(CtkApcProfileModel *prof_model, const char *profile_name) { gint i; for (i = 0; i < prof_model->profiles->len; i++) { if (!strcmp(g_array_index(prof_model->profiles, char*, i), profile_name)) { return i; } } return -1; } void ctk_apc_profile_model_update_profile(CtkApcProfileModel *prof_model, const char *filename, const char *profile_name, json_t *profile) { int profile_created; GtkTreeIter iter; GtkTreePath *path; gint n; profile_created = nv_app_profile_config_update_profile(prof_model->config, filename, profile_name, profile); if (profile_created) { char *dup_profile_name = strdup(profile_name); n = prof_model->profiles->len; g_array_append_val(prof_model->profiles, dup_profile_name); // emit a "row-inserted" signal path = gtk_tree_path_new_from_indices(n, -1); apc_profile_model_get_iter(GTK_TREE_MODEL(prof_model), &iter, path); gtk_tree_model_row_inserted(GTK_TREE_MODEL(prof_model), path, &iter); gtk_tree_path_free(path); // TODO resort the array if necessary } else { // emit a "row-changed" signal n = find_index_of_profile(prof_model, profile_name); path = gtk_tree_path_new_from_indices(n, -1); apc_profile_model_get_iter(GTK_TREE_MODEL(prof_model), &iter, path); gtk_tree_model_row_changed(GTK_TREE_MODEL(prof_model), path, &iter); gtk_tree_path_free(path); } } void ctk_apc_profile_model_delete_profile(CtkApcProfileModel *prof_model, const char *profile_name) { GtkTreePath *path; gint n; n = find_index_of_profile(prof_model, profile_name); assert(n >= 0); nv_app_profile_config_delete_profile(prof_model->config, profile_name); g_array_remove_index(prof_model->profiles, n); // emit a "row-deleted" signal path = gtk_tree_path_new_from_indices(n, -1); gtk_tree_model_row_deleted(GTK_TREE_MODEL(prof_model), path); gtk_tree_path_free(path); } // XXX Not available in GTK+-2.2.1 #ifndef GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID # define GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID -2 #endif static gboolean apc_profile_model_get_sort_column_id(GtkTreeSortable *sortable, gint *sort_column_id, GtkSortType *order) { CtkApcProfileModel *prof_model = CTK_APC_PROFILE_MODEL(sortable); if (sort_column_id) { *sort_column_id = prof_model->sort_column_id; } if (order) { *order = prof_model->order; } return (prof_model->sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID) && (prof_model->sort_column_id != GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID); } static gint compare_profiles(gconstpointer a, gconstpointer b, gpointer user_data) { gint result; GtkTreeIter iter_a, iter_b; intptr_t ia, ib; char * const *buf; gint sort_column_id; CtkApcProfileModel *prof_model = (CtkApcProfileModel *)user_data; sort_column_id = prof_model->sort_column_id; if (sort_column_id <= GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID) { return 0; } // XXX hack: get the position of these pointers in the container array buf = (char * const *)prof_model->profiles->data; ia = ((char * const *)a - buf); ib = ((char * const *)b - buf); // Build iterators to be used by the comparison function iter_a.stamp = prof_model->stamp; set_iter_to_index(&iter_a, ia); iter_b.stamp = prof_model->stamp; set_iter_to_index(&iter_b, ib); result = (*prof_model->sort_funcs[sort_column_id])(GTK_TREE_MODEL(prof_model), &iter_a, &iter_b, prof_model->sort_user_data[sort_column_id]); return (prof_model->order == GTK_SORT_DESCENDING) ? -result : result; } static void apc_profile_model_resort(CtkApcProfileModel *prof_model) { // Emit the "sort-column-changed" signal gtk_tree_sortable_sort_column_changed(GTK_TREE_SORTABLE(prof_model)); // Reorder the model based on the sort func g_array_sort_with_data(prof_model->profiles, compare_profiles, (gpointer)prof_model); } static void apc_profile_model_set_sort_column_id(GtkTreeSortable *sortable, gint sort_column_id, GtkSortType order) { CtkApcProfileModel *prof_model = CTK_APC_PROFILE_MODEL(sortable); if ((prof_model->sort_column_id != sort_column_id) || (prof_model->order != order)) { prof_model->sort_column_id = sort_column_id; prof_model->order = order; apc_profile_model_resort(prof_model); } } static void apc_profile_model_set_sort_func(GtkTreeSortable *sortable, gint sort_column_id, GtkTreeIterCompareFunc sort_func, gpointer user_data, GDestroyNotify destroy) { CtkApcProfileModel *prof_model = CTK_APC_PROFILE_MODEL(sortable); g_return_if_fail((sort_column_id >= 0) && (sort_column_id < CTK_APC_PROFILE_MODEL_N_COLUMNS)); prof_model->sort_funcs[sort_column_id] = sort_func; if (prof_model->sort_destroy_notify[sort_column_id]) { (*prof_model->sort_destroy_notify[sort_column_id])( prof_model->sort_user_data[sort_column_id] ); } prof_model->sort_user_data[sort_column_id] = user_data; prof_model->sort_destroy_notify[sort_column_id] = destroy; if (sort_column_id == prof_model->sort_column_id) { apc_profile_model_resort(prof_model); } } static void apc_profile_model_set_default_sort_func(GtkTreeSortable *sortable, GtkTreeIterCompareFunc sort_func, gpointer user_data, GDestroyNotify destroy) { // do nothing } static gboolean apc_profile_model_has_default_sort_func(GtkTreeSortable *sortable) { return FALSE; } nvidia-settings/src/gtk+-2.x/ctk3dvisionpro.c0000664000175000017500000021343312236467170021231 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2010 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "NvCtrlAttributes.h" #include "NVCtrlLib.h" #include "ctkbanner.h" #include "ctk3dvisionpro.h" #include "ctkconfig.h" #include "ctkhelp.h" #include "ctkdropdownmenu.h" #include "ctkutils.h" #include #include #include #include /* * Icons. */ #include "svp_battery_0.h" #include "svp_battery_25.h" #include "svp_battery_50.h" #include "svp_battery_75.h" #include "svp_battery_100.h" #include "svp_status_nosignal.h" #include "svp_status_verylow.h" #include "svp_status_low.h" #include "svp_status_good.h" #include "svp_status_verygood.h" #include "svp_status_excellent.h" #include "svp_add_glasses.h" //----------------------------------------------------------------------------- #define HTU(idx) (ctk_3d_vision_pro->htu_info[(idx)]) #define MAX_ATTRIB_LENGTH 128 #define PAIRING_TIMEOUT 3 #define PAIRING_DURATION 60 #define POLL_PAIRING_TIMEOUT 2000 //mS #define POLL_PAIRING_CYCLE ((POLL_PAIRING_TIMEOUT / 1000) * 2) #define CHANNEL_RANGE_TO_OPTION_MENU_IDX(range) ((range) - 1) #define OPTION_MENU_IDX_TO_CHANNEL_RANGE(menu) ((menu) + 1) enum { CHANGED, LAST_SIGNAL }; typedef struct _RenameGlassesDlg { GtkWidget *parent; GtkWidget *mnu_glasses_name; GtkWidget *dlg_rename_glasses; int glasses_selected_index; char *glasses_new_name; } RenameGlassesDlg; typedef struct _IdentifyGlassesDlg { GtkWidget *parent; GtkWidget *mnu_glasses_name; GtkWidget *dlg_identify_glasses; int glasses_selected_index; } IdentifyGlassesDlg; typedef struct _ChannelRangeDlg { GtkWidget *parent; GtkWidget *dlg_channel_range; } ChannelRangeDlg; typedef struct _SelectChannelDlg { GtkWidget *parent; GtkWidget *dlg_select_channel; } SelectChannelDlg; typedef struct _RemoveGlassesDlg { GtkWidget *parent; GtkWidget *dlg_remove_glasses; GtkWidget *mnu_glasses_name; int glasses_selected_index; } RemoveGlassesDlg; typedef void (*BUTTON_CLICK)(GtkButton *button, gpointer user_data); static void channel_range_changed(GtkWidget *widget, gpointer user_data); //----------------------------------------------------------------------------- static guint __signals[LAST_SIGNAL] = { 0 }; const char *__mnu_glasses_name_tooltip = "Select glasses name"; const char *__goggle_info_tooltip = "Displays the list of glasses synced " "to the hub and their battery levels"; const char *__channel_range_tooltip = "Change the 3D Vision Pro Hub range. " "Click the arrow and then select the hub range that you want."; const char *__add_glasses_tooltip = "Add more glasses to sync to the hub. " "Click this button to open the Add glasses dialog that lets you synchronize " "another pair of stereo glasses with the hub."; const char *__refresh_tooltip = "Updates the list of glasses that are " "synchronized with the hub."; const char *__identify_tooltip = "Identify a pair of glasses. " "Causes the LED on the selected pair of glasses to blink."; const char *__rename_tooltip = "Rename a pair of glasses. " "Opens the Rename glasses dialog that lets you assign a different name to " "the selected pair of glasses."; const char *__remove_glasses_tooltip = "Remove a pair of glasses currently " "synced to the hub. This removes the selected pair of glasses from the " "glasses information table and disconnects the glasses from the hub."; /****************************************************************************** * * Various helper and Widget callback functions * ******************************************************************************/ static const char** get_battery_status_icon(int battery) { if (battery == 0) { return (const char **)&svp_battery_0_xpm; } else if (battery < 50) { return (const char **)&svp_battery_25_xpm; } else if (battery < 75) { return (const char **)&svp_battery_50_xpm; } else if (battery < 100) { return (const char **)&svp_battery_75_xpm; } else if (battery == 100) { return (const char **)&svp_battery_100_xpm; } return NULL; } static const char** get_signal_strength_icon(int signal_strength) { if (signal_strength == 0) { return (const char **)&svp_status_nosignal_xpm; } else if (signal_strength < 25) { return (const char **)&svp_status_verylow_xpm; } else if (signal_strength < 50) { return (const char **)&svp_status_low_xpm; } else if (signal_strength < 75) { return (const char **)&svp_status_good_xpm; } else if (signal_strength < 100) { return (const char **)&svp_status_verygood_xpm; } else if (signal_strength == 100) { return (const char **)&svp_status_excellent_xpm; } return NULL; } static void ctk_3d_vision_pro_class_init(Ctk3DVisionProClass *ctk_3d_vision_pro_class) { __signals[CHANGED] = g_signal_new("changed", G_OBJECT_CLASS_TYPE(ctk_3d_vision_pro_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(Ctk3DVisionProClass, changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } GType ctk_3d_vision_pro_get_type(void) { static GType ctk_3d_vision_pro_type = 0; if (!ctk_3d_vision_pro_type) { static const GTypeInfo ctk_3d_vision_pro_info = { sizeof (Ctk3DVisionProClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ctk_3d_vision_pro_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (Ctk3DVisionPro), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_3d_vision_pro_type = g_type_register_static(GTK_TYPE_VBOX, "Ctk3DVisionPro", &ctk_3d_vision_pro_info, 0); } return ctk_3d_vision_pro_type; } static GtkWidget *add_button(char *label, BUTTON_CLICK handler, Ctk3DVisionPro *ctk_3d_vision_pro, GtkWidget *pack_in, const char *tooltip) { GtkWidget *button; GtkWidget *hbox; GtkWidget *alignment; hbox = gtk_hbox_new(FALSE, 0); button = gtk_button_new_with_label(label); gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(handler), (gpointer) ctk_3d_vision_pro); ctk_config_set_tooltip(ctk_3d_vision_pro->ctk_config, button, tooltip); alignment = gtk_alignment_new(0, 1, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), hbox); gtk_box_pack_start(GTK_BOX(pack_in), alignment, TRUE, TRUE, 0); return button; } static GtkWidget * add_label(char *text, GtkWidget *pack_in) { GtkWidget *hbox; GtkWidget *alignment; GtkWidget *label; hbox = gtk_hbox_new(FALSE, 5); alignment = gtk_alignment_new(0, 1, 0, 0); gtk_box_pack_start(GTK_BOX(hbox), alignment, TRUE, TRUE, 0); label = gtk_label_new(text); gtk_container_add(GTK_CONTAINER(alignment), label); gtk_box_pack_start(GTK_BOX(pack_in), hbox, FALSE, FALSE, 0); return label; } static void glasses_name_changed(GtkWidget *widget, gpointer user_data) { RemoveGlassesDlg *dlg = (RemoveGlassesDlg *)user_data; CtkDropDownMenu *menu = CTK_DROP_DOWN_MENU(widget); dlg->glasses_selected_index = ctk_drop_down_menu_get_current_value(menu); } static GtkWidget *create_glasses_list_menu(Ctk3DVisionPro *ctk_3d_vision_pro, GlassesInfo **glasses_info, guint num_glasses, gpointer dlg) { CtkDropDownMenu *mnu_glasses_name; int i; mnu_glasses_name = (CtkDropDownMenu *) ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO); g_signal_connect(G_OBJECT(mnu_glasses_name), "changed", G_CALLBACK(glasses_name_changed), (gpointer) dlg); ctk_config_set_tooltip(ctk_3d_vision_pro->ctk_config, GTK_WIDGET(mnu_glasses_name), __mnu_glasses_name_tooltip); g_signal_handlers_block_by_func(G_OBJECT(mnu_glasses_name), G_CALLBACK(glasses_name_changed), (gpointer) dlg); for (i = 0; i < num_glasses; i++) { ctk_drop_down_menu_append_item(mnu_glasses_name, glasses_info[i]->name, i); } /* Setup the menu and select the glasses name */ ctk_drop_down_menu_set_current_value(mnu_glasses_name, 0); /* If dropdown has only one item, disable menu selection */ if (num_glasses > 1) { gtk_widget_set_sensitive(GTK_WIDGET(mnu_glasses_name), True); } else { gtk_widget_set_sensitive(GTK_WIDGET(mnu_glasses_name), False); } g_signal_handlers_unblock_by_func (G_OBJECT(mnu_glasses_name), G_CALLBACK(glasses_name_changed), (gpointer) dlg); return GTK_WIDGET(mnu_glasses_name); } static const char *new_glasses_name_activate(GtkWidget *widget, gpointer user_data) { RenameGlassesDlg *dlg = (RenameGlassesDlg *)user_data; const gchar *str = gtk_entry_get_text(GTK_ENTRY(widget)); // Store new glasses name in dialog box dlg->glasses_new_name = realloc(dlg->glasses_new_name, strlen(str) + 1); strncpy(dlg->glasses_new_name, str, strlen(str) + 1); return str; } static gboolean new_glasses_name_focus_out(GtkWidget *widget, GdkEvent *event, gpointer user_data) { new_glasses_name_activate(widget, user_data); return FALSE; } /* display_panning_focus_out() */ static void update_glasses_info_data_table(GlassesInfoTable *table, GlassesInfo** glasses_info) { int i; GtkRequisition req; if (table->rows > 0) { gtk_table_resize(GTK_TABLE(table->data_table), table->rows, table->columns); } for (i = 0; i < table->rows; i++) { char str[NUM_GLASSES_INFO_ATTRIBS + 1][MAX_ATTRIB_LENGTH]; int cell = 0; snprintf((char *)(&(str[cell++])), MAX_ATTRIB_LENGTH, "%s", glasses_info[i]->name); snprintf((char *)(&(str[cell++])), MAX_ATTRIB_LENGTH, "%d", glasses_info[i]->battery); // destroy older widgets if (glasses_info[i]->image) { gtk_widget_destroy (glasses_info[i]->image); } for (cell = 0; cell < NUM_GLASSES_INFO_ATTRIBS; cell++) { if (glasses_info[i]->label[cell]) { gtk_widget_destroy (glasses_info[i]->label[cell]); } if (glasses_info[i]->hbox[cell]) { gtk_widget_destroy (glasses_info[i]->hbox[cell]); } } for (cell = 0; cell < NUM_GLASSES_INFO_ATTRIBS; cell++) { GtkWidget *hbox; GtkWidget * label; GtkWidget *image; hbox = gtk_hbox_new(FALSE, 0); glasses_info[i]->hbox[cell] = hbox; label = gtk_label_new(str[cell]); glasses_info[i]->label[cell] = label; gtk_label_set_justify( GTK_LABEL(label), GTK_JUSTIFY_CENTER); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_table_attach(GTK_TABLE(table->data_table), hbox, cell, cell+1, i+1, i+2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); if (cell == 1) { const char **bat_icon = get_battery_status_icon(glasses_info[i]->battery); GdkPixbuf *pixbuf = gdk_pixbuf_new_from_xpm_data(bat_icon); image = gtk_image_new_from_pixbuf(pixbuf); glasses_info[i]->image = image; gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); } /* Make sure the table headers are the same width * as their table data column */ gtk_widget_size_request(label, &req); if (table->glasses_header_sizes[cell].width > req.width ) { gtk_widget_set_size_request(label, table->glasses_header_sizes[cell].width, -1); } else if (table->glasses_header_sizes[cell].width < req.width ) { table->glasses_header_sizes[cell].width = req.width + 6; gtk_widget_set_size_request(table->glasses_header_sizes[cell].widget, table->glasses_header_sizes[cell].width, -1); } } } } static void create_glasses_info_table(GlassesInfoTable *table, GlassesInfo** glasses_info, GtkWidget *pack_in, CtkConfig *ctk_config) { GtkWidget *hbox, *hbox1; GtkWidget *vbox; GtkWidget *label; GtkWidget *hseparator; GtkWidget *data_viewport, *full_viewport; GtkWidget *vscrollbar, *hscrollbar, *vpan; GtkWidget *data_table, *header_table; GtkRequisition req; GtkWidget *event; /* For setting the background color to white */ gchar *goggle_info_titles[NUM_GLASSES_INFO_ATTRIBS] = {"Glasses Name", "Battery Level (%)"}; int i; /* Create clist in a scroll box */ hbox1 = gtk_hbox_new(FALSE, 0); label = gtk_label_new("Glasses Information"); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox1), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox1), hseparator, TRUE, TRUE, 5); hbox = gtk_hbox_new(FALSE, 0); vbox = gtk_vbox_new(FALSE, 5); vpan = gtk_vpaned_new(); data_viewport = gtk_viewport_new(NULL, NULL); gtk_widget_set_size_request(data_viewport, 250, 100); vscrollbar = gtk_vscrollbar_new(gtk_viewport_get_vadjustment (GTK_VIEWPORT(data_viewport))); full_viewport = gtk_viewport_new(NULL, NULL); gtk_widget_set_size_request(full_viewport, 300, 150); hscrollbar = gtk_hscrollbar_new(gtk_viewport_get_hadjustment (GTK_VIEWPORT(full_viewport))); table->data_viewport = data_viewport; table->full_viewport = full_viewport; table->vscrollbar = vscrollbar; table->hscrollbar = hscrollbar; /* Create the header table */ header_table = gtk_table_new(1, NUM_GLASSES_INFO_ATTRIBS, FALSE); for ( i = 0; i < NUM_GLASSES_INFO_ATTRIBS; i++ ) { GtkWidget * btn = gtk_button_new_with_label(goggle_info_titles[i]); ctk_config_set_tooltip(ctk_config, btn, __goggle_info_tooltip); gtk_table_attach(GTK_TABLE(header_table), btn, i, i+1, 0, 1, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); table->glasses_header_sizes[i].widget = btn; gtk_widget_size_request(btn, &req); table->glasses_header_sizes[i].width = req.width; } /* Create the data table */ data_table = gtk_table_new(table->rows, table->columns, FALSE); event = gtk_event_box_new(); ctk_force_text_colors_on_widget(event); gtk_container_add (GTK_CONTAINER(event), data_table); gtk_container_add(GTK_CONTAINER(data_viewport), event); /* Pack the glasses info header and data tables */ vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), header_table, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), data_viewport, TRUE, TRUE, 0); gtk_container_add (GTK_CONTAINER(full_viewport), vbox); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), full_viewport, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hscrollbar, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), vscrollbar, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); // gtk_paned_pack1 (GTK_PANED (vpan), scrollWin, TRUE, FALSE); gtk_paned_pack2 (GTK_PANED (vpan), vbox, TRUE, FALSE); gtk_box_pack_start(GTK_BOX(pack_in), vpan, TRUE, TRUE, 0); /* Fill the data table */ table->data_table = data_table; update_glasses_info_data_table(table, glasses_info); } static void init_glasses_info_widgets(GlassesInfo *glasses) { int i; for (i = 0; i < NUM_GLASSES_INFO_ATTRIBS; i++) { glasses->label[i] = NULL; glasses->hbox[i] = NULL; } glasses->image = NULL; } static void callback_glasses_paired(GtkObject *object, gpointer arg1, gpointer user_data) { int battery_level; char *glasses_name = NULL; unsigned int glasses_id; GlassesInfo *glasses; ReturnStatus ret; CtkEventStruct *event_struct; char temp[64]; //scratchpad memory used to construct labels. int index; Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data); AddGlassesDlg *dlg = ctk_3d_vision_pro->add_glasses_dlg; event_struct = (CtkEventStruct *) arg1; glasses_id = event_struct->value; /* It is possible for the user to accidentally try pairing a glass even if * it is already paired leading to multiple entries. To avoid this, return if * the glass entry is already present in the local table. */ if (dlg) { for (index = 0; index < dlg->new_glasses; index++) { if (dlg->glasses_info[index]->glasses_id == glasses_id) { return; } } } ret = NvCtrlGetStringDisplayAttribute(ctk_3d_vision_pro->handle, glasses_id, NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME, &glasses_name); if (ret != NvCtrlSuccess) { glasses_name = NULL; } ret = NvCtrlGetDisplayAttribute(ctk_3d_vision_pro->handle, glasses_id, NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL, (int *)&battery_level); if (ret != NvCtrlSuccess) { battery_level = 0; } // Create glasses_info glasses = (GlassesInfo *)malloc(sizeof(GlassesInfo)); strncpy(glasses->name, glasses_name, sizeof(glasses->name));; glasses->name[sizeof(glasses->name) - 1] = '\0'; glasses->battery = battery_level; glasses->glasses_id = glasses_id; init_glasses_info_widgets(glasses); if (dlg) { // add entry into local glasses_info structure. dlg->new_glasses++; dlg->glasses_info = (GlassesInfo **)realloc(dlg->glasses_info, sizeof(GlassesInfo *) * dlg->new_glasses); dlg->glasses_info[dlg->new_glasses - 1] = glasses; // update dialog boxes glasses info table dlg->table.rows++; update_glasses_info_data_table(&(dlg->table), dlg->glasses_info); gtk_widget_show_all(GTK_WIDGET(dlg->table.data_table)); } /* This is to avoid multiple entries of a glass's information * being displayed by nvidia-settings. Return in case the glass * entry is already present in the HTU table. */ for (index = 0; index < HTU(0)->num_glasses; index++) { if (HTU(0)->glasses_info[index]->glasses_id == glasses_id) { return; } } // Add glasses_info into HTU(0)->glasses_info list. HTU(0)->glasses_info = realloc(HTU(0)->glasses_info, (HTU(0)->num_glasses + 1) * sizeof(GlassesInfo *)); HTU(0)->glasses_info[HTU(0)->num_glasses] = glasses; init_glasses_info_widgets(HTU(0)->glasses_info[HTU(0)->num_glasses]); HTU(0)->num_glasses += 1; // update glasses info table ctk_3d_vision_pro->table.rows += 1; update_glasses_info_data_table(&(ctk_3d_vision_pro->table), HTU(0)->glasses_info); gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->table.data_table)); snprintf(temp, sizeof(temp), "Glasses Connected: %d", HTU(0)->num_glasses); gtk_label_set_text(ctk_3d_vision_pro->glasses_num_label, temp); gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->glasses_num_label)); free(glasses_name); } static void callback_glasses_unpaired(GtkObject *object, gpointer arg1, gpointer user_data) { int j; unsigned int glasses_id = 0; GlassesInfo *glasses = NULL; char temp[64]; //scratchpad memory used to construct labels. CtkEventStruct *event_struct; int overwrite = FALSE; Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data); event_struct = (CtkEventStruct *) arg1; glasses_id = event_struct->value; for (j = 0; j < (HTU(0)->num_glasses); j++) { if (!overwrite && HTU(0)->glasses_info[j]->glasses_id == glasses_id) { if (j != HTU(0)->num_glasses - 1) { overwrite = TRUE; } glasses = HTU(0)->glasses_info[j]; } if (overwrite && HTU(0)->num_glasses > 1) { HTU(0)->glasses_info[j] = HTU(0)->glasses_info[j + 1]; } } HTU(0)->num_glasses--; HTU(0)->glasses_info = (GlassesInfo **)realloc(HTU(0)->glasses_info, sizeof(GlassesInfo *) * HTU(0)->num_glasses); gtk_widget_destroy (glasses->label[0]); gtk_widget_destroy (glasses->label[1]); gtk_widget_destroy (glasses->image); gtk_widget_destroy (glasses->hbox[0]); gtk_widget_destroy (glasses->hbox[1]); // update glasses info table ctk_3d_vision_pro->table.rows--; update_glasses_info_data_table(&(ctk_3d_vision_pro->table), HTU(0)->glasses_info); gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->table.data_table)); snprintf(temp, sizeof(temp), "Glasses Connected: %d", HTU(0)->num_glasses); gtk_label_set_text(ctk_3d_vision_pro->glasses_num_label, temp); gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->glasses_num_label)); free(glasses); } static gboolean poll_pairing(gpointer user_data) { Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data); if (ctk_3d_vision_pro->add_glasses_dlg->pairing_attempts > PAIRING_DURATION / POLL_PAIRING_CYCLE) { return FALSE; } if (ctk_3d_vision_pro->add_glasses_dlg->in_pairing) { /* Enable pairing for PAIRING_TIMEOUT seconds */ NvCtrlSetAttribute(ctk_3d_vision_pro->handle, NV_CTRL_3D_VISION_PRO_PAIR_GLASSES, PAIRING_TIMEOUT); XFlush(NvCtrlGetDisplayPtr(ctk_3d_vision_pro->handle)); } ctk_3d_vision_pro->add_glasses_dlg->in_pairing = !(ctk_3d_vision_pro->add_glasses_dlg->in_pairing); ctk_3d_vision_pro->add_glasses_dlg->pairing_attempts++; return TRUE; } static void enable_widgets(Ctk3DVisionPro *ctk_3d_vision_pro, Bool enable) { gtk_widget_set_sensitive(ctk_3d_vision_pro->refresh_button, enable); gtk_widget_set_sensitive(ctk_3d_vision_pro->identify_button, enable); gtk_widget_set_sensitive(ctk_3d_vision_pro->rename_button, enable); gtk_widget_set_sensitive(ctk_3d_vision_pro->remove_button, enable); gtk_widget_set_sensitive(ctk_3d_vision_pro->table.data_viewport, enable); gtk_widget_set_sensitive(ctk_3d_vision_pro->table.full_viewport, enable); gtk_widget_set_sensitive(ctk_3d_vision_pro->table.vscrollbar, enable); gtk_widget_set_sensitive(ctk_3d_vision_pro->table.hscrollbar, enable); } static void svp_config_changed(GtkWidget *widget, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct; Ctk3DVisionPro *ctk_3d_vision_pro; char temp[64]; event_struct = (CtkEventStruct *) arg1; ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data); switch (event_struct->attribute) { case NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL: if (HTU(0)->channel_num != event_struct->value) { HTU(0)->channel_num = event_struct->value; snprintf(temp, sizeof(temp), "%d", HTU(0)->channel_num); gtk_label_set_text(ctk_3d_vision_pro->channel_num_label, temp); gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->channel_num_label)); } break; case NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE: { SVP_RANGE range; CtkDropDownMenu *menu = CTK_DROP_DOWN_MENU(widget); range = ctk_drop_down_menu_get_current_value(menu); if (range != CHANNEL_RANGE_TO_OPTION_MENU_IDX(event_struct->value)) { g_signal_handlers_block_by_func(ctk_3d_vision_pro->menu, channel_range_changed, ctk_3d_vision_pro); HTU(0)->channel_range = event_struct->value; ctk_drop_down_menu_set_current_value(menu, CHANNEL_RANGE_TO_OPTION_MENU_IDX(event_struct->value)); enable_widgets(ctk_3d_vision_pro, (HTU(0)->channel_range == SVP_LONG_RANGE ? FALSE : TRUE)); g_signal_handlers_unblock_by_func(ctk_3d_vision_pro->menu, channel_range_changed, ctk_3d_vision_pro); } break; } case NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY: if (HTU(0)->signal_strength != event_struct->value) { const char **signal_strength_icon; GdkPixbuf *pixbuf; HTU(0)->signal_strength = event_struct->value; snprintf(temp, sizeof(temp), "[%d%%]", HTU(0)->signal_strength); gtk_label_set_text(ctk_3d_vision_pro->signal_strength_label, temp); signal_strength_icon = get_signal_strength_icon(HTU(0)->signal_strength); pixbuf = gdk_pixbuf_new_from_xpm_data(signal_strength_icon); gtk_image_set_from_pixbuf(GTK_IMAGE(ctk_3d_vision_pro->signal_strength_image), pixbuf); gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->signal_strength_label)); gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->signal_strength_image)); } break; case NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME: { int i; for (i = 0; i < HTU(0)->num_glasses; i++) { ReturnStatus ret; char *glasses_name = NULL; GlassesInfo *glasses = glasses = HTU(0)->glasses_info[i]; ret = NvCtrlGetStringDisplayAttribute(ctk_3d_vision_pro->handle, glasses->glasses_id, NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME, &glasses_name); if (ret != NvCtrlSuccess || glasses_name == NULL) { continue; } strncpy(glasses->name, glasses_name, sizeof(glasses->name)); glasses->name[sizeof(glasses->name)-1] = '\0'; free(glasses_name); } update_glasses_info_data_table(&(ctk_3d_vision_pro->table), HTU(0)->glasses_info); gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->table.data_table)); break; } default: ; } } /****************************************************************************** * * Create dialog boxes and Button click callbacks * ******************************************************************************/ static void refresh_button_clicked(GtkButton *button, gpointer user_data) { Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data); int i; char temp[64]; const char **signal_strength_icon; GdkPixbuf *pixbuf; Bool ret; for (i = 0; i < HTU(0)->num_glasses; i++) { int battery_level; GlassesInfo *glasses = glasses = HTU(0)->glasses_info[i]; ret = NvCtrlGetDisplayAttribute(ctk_3d_vision_pro->handle, glasses->glasses_id, NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL, (int *)&battery_level); if (ret != NvCtrlSuccess) { battery_level = 0; } glasses->battery = battery_level; } update_glasses_info_data_table(&(ctk_3d_vision_pro->table), HTU(0)->glasses_info); gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->table.data_table)); ret = NvCtrlGetDisplayAttribute(ctk_3d_vision_pro->handle, HTU(0)->channel_num, NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY, (int *)&(HTU(0)->signal_strength)); if (ret != TRUE) { HTU(0)->signal_strength = 0; } snprintf(temp, sizeof(temp), "[%d%%]", HTU(0)->signal_strength); gtk_label_set_text(ctk_3d_vision_pro->signal_strength_label, temp); signal_strength_icon = get_signal_strength_icon(HTU(0)->signal_strength); pixbuf = gdk_pixbuf_new_from_xpm_data(signal_strength_icon); gtk_image_set_from_pixbuf(GTK_IMAGE(ctk_3d_vision_pro->signal_strength_image), pixbuf); gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->signal_strength_label)); gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->signal_strength_image)); } //============================================================================= static AddGlassesDlg *create_add_glasses_dlg(Ctk3DVisionPro *ctk_3d_vision_pro) { AddGlassesDlg *dlg; GtkWidget *label; GtkWidget *hbox; GtkWidget *image; GtkWidget *parent = GTK_WIDGET(ctk_3d_vision_pro); dlg = (AddGlassesDlg *)malloc(sizeof(AddGlassesDlg)); if (dlg == NULL) { return NULL; } dlg->parent = parent; dlg->new_glasses = 0; dlg->glasses_info = NULL; dlg->in_pairing = TRUE; dlg->pairing_attempts = 0; /* Create the dialog */ dlg->dlg_add_glasses = gtk_dialog_new_with_buttons ("Add glasses", ctk_3d_vision_pro->parent_wnd, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(dlg->dlg_add_glasses), GTK_RESPONSE_REJECT); label = gtk_label_new("1. Press button on the glasses\n" " to initiate the connection."); hbox = gtk_hbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dlg->dlg_add_glasses)->vbox), hbox, TRUE, TRUE, 5); hbox = gtk_hbox_new(TRUE, 0); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dlg->dlg_add_glasses)->vbox), hbox, TRUE, TRUE, 5); image = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_xpm_data( svp_add_glasses_xpm)); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg->dlg_add_glasses)->vbox), image, FALSE, FALSE, 0); label = gtk_label_new("2. List of glasses connected:"); hbox = gtk_hbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dlg->dlg_add_glasses)->vbox), hbox, TRUE, TRUE, 5); //generate menu option for glasses' name hbox = gtk_hbox_new(TRUE, 0); // create glasses info table dlg->table.rows = 0; dlg->table.columns = NUM_GLASSES_INFO_ATTRIBS; create_glasses_info_table(&(dlg->table), dlg->glasses_info, hbox, ctk_3d_vision_pro->ctk_config); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dlg->dlg_add_glasses)->vbox), hbox, TRUE, TRUE, 5); gtk_dialog_set_has_separator(GTK_DIALOG(dlg->dlg_add_glasses), TRUE); gtk_widget_show_all(GTK_DIALOG(dlg->dlg_add_glasses)->vbox); return dlg; } static void add_glasses_button_clicked(GtkButton *button, gpointer user_data) { Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data); AddGlassesDlg *dlg; gint result; int i; char *s; dlg = create_add_glasses_dlg(ctk_3d_vision_pro); if (dlg == NULL) { return; } ctk_3d_vision_pro->add_glasses_dlg = dlg; if (HTU(0)->channel_range == SVP_LONG_RANGE) { gtk_widget_set_sensitive(dlg->table.data_viewport, FALSE); gtk_widget_set_sensitive(dlg->table.full_viewport, FALSE); gtk_widget_set_sensitive(dlg->table.vscrollbar, FALSE); gtk_widget_set_sensitive(dlg->table.hscrollbar, FALSE); } s = g_strdup_printf("NVIDIA 3D VisionPro Pairing"); ctk_config_add_timer(ctk_3d_vision_pro->ctk_config, POLL_PAIRING_TIMEOUT, s, (GSourceFunc) poll_pairing, (gpointer)ctk_3d_vision_pro); g_free(s); gtk_window_set_transient_for (GTK_WINDOW(dlg->dlg_add_glasses), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(dlg->parent)))); gtk_window_resize(GTK_WINDOW(dlg->dlg_add_glasses), 350, 1); gtk_window_set_resizable(GTK_WINDOW(dlg->dlg_add_glasses), FALSE); ctk_config_start_timer(ctk_3d_vision_pro->ctk_config, (GSourceFunc) poll_pairing, (gpointer) ctk_3d_vision_pro); gtk_widget_show(dlg->dlg_add_glasses); result = gtk_dialog_run(GTK_DIALOG(dlg->dlg_add_glasses)); gtk_widget_hide(dlg->dlg_add_glasses); ctk_config_stop_timer(ctk_3d_vision_pro->ctk_config, (GSourceFunc) poll_pairing, (gpointer)ctk_3d_vision_pro); /* Handle user's response */ switch (result) { case GTK_RESPONSE_ACCEPT: break; default: for (i = 0; i < dlg->new_glasses; i++) { NvCtrlSetAttribute(ctk_3d_vision_pro->handle, NV_CTRL_3D_VISION_PRO_UNPAIR_GLASSES, dlg->glasses_info[i]->glasses_id); } break; } free(dlg->glasses_info); free(dlg); ctk_3d_vision_pro->add_glasses_dlg = NULL; } //============================================================================= static RemoveGlassesDlg *create_remove_glasses_dlg(Ctk3DVisionPro *ctk_3d_vision_pro) { RemoveGlassesDlg *dlg; GtkWidget *label; GtkWidget *hbox; GtkWidget *parent = GTK_WIDGET(ctk_3d_vision_pro); dlg = (RemoveGlassesDlg *)malloc(sizeof(RemoveGlassesDlg)); if (dlg == NULL) { return NULL; } dlg->parent = parent; /* Create the dialog */ dlg->dlg_remove_glasses = gtk_dialog_new_with_buttons ("Remove glasses", ctk_3d_vision_pro->parent_wnd, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(dlg->dlg_remove_glasses), GTK_RESPONSE_REJECT); label = gtk_label_new("Remove glasses synced to this hub:"); hbox = gtk_hbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 20); //generate menu option for glasses' name dlg->mnu_glasses_name = create_glasses_list_menu(ctk_3d_vision_pro, HTU(0)->glasses_info, HTU(0)->num_glasses, (gpointer)dlg); gtk_box_pack_start(GTK_BOX(hbox), dlg->mnu_glasses_name, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dlg->dlg_remove_glasses)->vbox), hbox, TRUE, TRUE, 20); gtk_dialog_set_has_separator(GTK_DIALOG(dlg->dlg_remove_glasses), TRUE); gtk_widget_show_all(GTK_DIALOG(dlg->dlg_remove_glasses)->vbox); return dlg; } static void remove_button_clicked(GtkButton *button, gpointer user_data) { Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data); CtkDropDownMenu *menu; RemoveGlassesDlg *dlg; gint result; dlg = create_remove_glasses_dlg(ctk_3d_vision_pro); if (dlg == NULL) { return; } dlg->glasses_selected_index = -1; gtk_window_set_transient_for (GTK_WINDOW(dlg->dlg_remove_glasses), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(dlg->parent)))); gtk_window_resize(GTK_WINDOW(dlg->dlg_remove_glasses), 350, 1); gtk_window_set_resizable(GTK_WINDOW(dlg->dlg_remove_glasses), FALSE); gtk_widget_show(dlg->dlg_remove_glasses); result = gtk_dialog_run(GTK_DIALOG(dlg->dlg_remove_glasses)); gtk_widget_hide(dlg->dlg_remove_glasses); /* Handle user's response */ switch (result) { case GTK_RESPONSE_OK: menu = CTK_DROP_DOWN_MENU(dlg->mnu_glasses_name); dlg->glasses_selected_index = ctk_drop_down_menu_get_current_value(menu); if (dlg->glasses_selected_index >= 0 && dlg->glasses_selected_index < HTU(0)->num_glasses) { unsigned int glasses_id = HTU(0)->glasses_info[dlg->glasses_selected_index]->glasses_id; NvCtrlSetAttribute(ctk_3d_vision_pro->handle, NV_CTRL_3D_VISION_PRO_UNPAIR_GLASSES, glasses_id); } break; default: /* do nothing. */ break; } free(dlg); } //============================================================================= static IdentifyGlassesDlg *create_identify_glasses_dlg(Ctk3DVisionPro *ctk_3d_vision_pro) { IdentifyGlassesDlg *dlg; GtkWidget *label; GtkWidget *hbox; GtkWidget *parent = GTK_WIDGET(ctk_3d_vision_pro); dlg = (IdentifyGlassesDlg *)malloc(sizeof(IdentifyGlassesDlg)); if (dlg == NULL) { return NULL; } dlg->parent = parent; /* Create the dialog */ dlg->dlg_identify_glasses = gtk_dialog_new_with_buttons ("Identify glasses", ctk_3d_vision_pro->parent_wnd, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(dlg->dlg_identify_glasses), GTK_RESPONSE_REJECT); label = gtk_label_new("Identify selected glasses:"); hbox = gtk_hbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 20); /* Select glasses to identify */ dlg->mnu_glasses_name = create_glasses_list_menu(ctk_3d_vision_pro, HTU(0)->glasses_info, HTU(0)->num_glasses, (gpointer)dlg); gtk_box_pack_start(GTK_BOX(hbox), dlg->mnu_glasses_name, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dlg->dlg_identify_glasses)->vbox), hbox, TRUE, TRUE, 20); gtk_dialog_set_has_separator(GTK_DIALOG(dlg->dlg_identify_glasses), TRUE); gtk_widget_show_all(GTK_DIALOG(dlg->dlg_identify_glasses)->vbox); return dlg; } static void identify_button_clicked(GtkButton *button, gpointer user_data) { Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data); IdentifyGlassesDlg *dlg; gint result; unsigned int glasses_id; dlg = create_identify_glasses_dlg(ctk_3d_vision_pro); if (dlg == NULL) { return; } dlg->glasses_selected_index = -1; gtk_window_set_transient_for (GTK_WINDOW(dlg->dlg_identify_glasses), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(dlg->parent)))); gtk_window_resize(GTK_WINDOW(dlg->dlg_identify_glasses), 350, 1); gtk_window_set_resizable(GTK_WINDOW(dlg->dlg_identify_glasses), FALSE); gtk_widget_show(dlg->dlg_identify_glasses); result = gtk_dialog_run(GTK_DIALOG(dlg->dlg_identify_glasses)); gtk_widget_hide(dlg->dlg_identify_glasses); /* Handle user's response */ switch (result) { case GTK_RESPONSE_OK: dlg->glasses_selected_index = ctk_drop_down_menu_get_current_value(CTK_DROP_DOWN_MENU(dlg->mnu_glasses_name)); if (dlg->glasses_selected_index >= 0 && dlg->glasses_selected_index < HTU(0)->num_glasses) { glasses_id = HTU(0)->glasses_info[dlg->glasses_selected_index]->glasses_id; NvCtrlSetAttribute(ctk_3d_vision_pro->handle, NV_CTRL_3D_VISION_PRO_IDENTIFY_GLASSES, glasses_id); } break; default: /* do nothing. */ break; } free(dlg); } //============================================================================= static RenameGlassesDlg *create_rename_glasses_dlg(Ctk3DVisionPro *ctk_3d_vision_pro) { RenameGlassesDlg *dlg; GtkWidget *label; GtkWidget *hbox; GtkWidget *new_glasses_name; const char *__new_glasses_name_tooltip = "Add new glasses name"; GtkWidget *parent = GTK_WIDGET(ctk_3d_vision_pro); dlg = (RenameGlassesDlg *)malloc(sizeof(RenameGlassesDlg)); if (dlg == NULL) { return NULL; } dlg->parent = parent; /* Create the dialog */ dlg->dlg_rename_glasses = gtk_dialog_new_with_buttons ("Rename glasses", ctk_3d_vision_pro->parent_wnd, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(dlg->dlg_rename_glasses), GTK_RESPONSE_REJECT); label = gtk_label_new("Name:"); hbox = gtk_hbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 20); /* Select glasses to remove */ dlg->mnu_glasses_name = create_glasses_list_menu(ctk_3d_vision_pro, HTU(0)->glasses_info, HTU(0)->num_glasses, (gpointer)dlg); gtk_box_pack_start(GTK_BOX(hbox), dlg->mnu_glasses_name, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dlg->dlg_rename_glasses)->vbox), hbox, TRUE, TRUE, 20); new_glasses_name = gtk_entry_new(); ctk_config_set_tooltip(ctk_3d_vision_pro->ctk_config, new_glasses_name, __new_glasses_name_tooltip); g_signal_connect(G_OBJECT(new_glasses_name), "activate", G_CALLBACK(new_glasses_name_activate), (gpointer) dlg); g_signal_connect(G_OBJECT(new_glasses_name), "focus-out-event", G_CALLBACK(new_glasses_name_focus_out), (gpointer) dlg); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg->dlg_rename_glasses)->vbox), new_glasses_name, TRUE, TRUE, 0); gtk_dialog_set_has_separator(GTK_DIALOG(dlg->dlg_rename_glasses), TRUE); gtk_widget_show_all(GTK_DIALOG(dlg->dlg_rename_glasses)->vbox); return dlg; } static void rename_button_clicked(GtkButton *button, gpointer user_data) { Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data); RenameGlassesDlg *dlg; gint result; dlg = create_rename_glasses_dlg(ctk_3d_vision_pro); if (dlg == NULL) { return; } dlg->glasses_new_name = NULL; dlg->glasses_selected_index = -1; gtk_window_set_transient_for (GTK_WINDOW(dlg->dlg_rename_glasses), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(dlg->parent)))); gtk_window_resize(GTK_WINDOW(dlg->dlg_rename_glasses), 350, 1); gtk_window_set_resizable(GTK_WINDOW(dlg->dlg_rename_glasses), FALSE); gtk_widget_show(dlg->dlg_rename_glasses); do { result = gtk_dialog_run(GTK_DIALOG(dlg->dlg_rename_glasses)); if (result == GTK_RESPONSE_ACCEPT) { int i; dlg->glasses_selected_index = ctk_drop_down_menu_get_current_value(CTK_DROP_DOWN_MENU(dlg->mnu_glasses_name)); if (dlg->glasses_new_name == NULL || strlen(dlg->glasses_new_name) == 0) { continue; } for (i = 0; i < HTU(0)->num_glasses; i++) { if (!strncmp(dlg->glasses_new_name, HTU(0)->glasses_info[i]->name, sizeof(HTU(0)->glasses_info[i]->name))) { break; } } if (i == HTU(0)->num_glasses) { if (dlg->glasses_selected_index >= 0 && dlg->glasses_selected_index < HTU(0)->num_glasses) { ReturnStatus ret; unsigned int glasses_id = HTU(0)->glasses_info[dlg->glasses_selected_index]->glasses_id; ret = NvCtrlSetStringDisplayAttribute(ctk_3d_vision_pro->handle, glasses_id, NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME, dlg->glasses_new_name, NULL); if (ret != NvCtrlSuccess) { continue; } strncpy(HTU(0)->glasses_info[dlg->glasses_selected_index]->name, dlg->glasses_new_name, sizeof(HTU(0)->glasses_info[dlg->glasses_selected_index]->name)); HTU(0)->glasses_info[dlg->glasses_selected_index]->name[GLASSES_NAME_MAX_LENGTH - 1] = '\0'; update_glasses_info_data_table(&(ctk_3d_vision_pro->table), HTU(0)->glasses_info); gtk_widget_show_all(GTK_WIDGET(ctk_3d_vision_pro->table.data_table)); } break; } } } while (result != GTK_RESPONSE_REJECT); gtk_widget_hide(dlg->dlg_rename_glasses); free(dlg->glasses_new_name); free(dlg); } //============================================================================= static ChannelRangeDlg *create_channel_range_change_dlg(Ctk3DVisionPro *ctk_3d_vision_pro, SVP_RANGE range) { ChannelRangeDlg *dlg; GtkWidget *label = NULL; GtkWidget *hbox; GtkWidget *parent = GTK_WIDGET(ctk_3d_vision_pro); dlg = (ChannelRangeDlg *)malloc(sizeof(ChannelRangeDlg)); if (dlg == NULL) { return NULL; } dlg->parent = parent; /* Create the dialog */ dlg->dlg_channel_range = gtk_dialog_new_with_buttons ("Modify Hub Range", ctk_3d_vision_pro->parent_wnd, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_YES, GTK_RESPONSE_YES, GTK_STOCK_NO, GTK_RESPONSE_NO, NULL); gtk_dialog_set_default_response(GTK_DIALOG(dlg->dlg_channel_range), GTK_RESPONSE_REJECT); switch (range) { case SVP_SHORT_RANGE: label = gtk_label_new("You have changed transceiver range to short range (less than 5m.).\n" "Only glasses in this range will be available.\n\n" "Do you want to apply changes?"); break; case SVP_MEDIUM_RANGE: label = gtk_label_new("You have changed transceiver range to medium range (less than 15m.).\n" "Only glasses in this range will be available.\n\n" "Do you want to apply changes?"); break; case SVP_LONG_RANGE: label = gtk_label_new("You have changed transceiver range to long range.\n\n" "Do you want to apply changes?"); break; } hbox = gtk_hbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 20); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dlg->dlg_channel_range)->vbox), hbox, TRUE, TRUE, 20); gtk_dialog_set_has_separator(GTK_DIALOG(dlg->dlg_channel_range), TRUE); gtk_widget_show_all(GTK_DIALOG(dlg->dlg_channel_range)->vbox); return dlg; } static void channel_range_changed( GtkWidget *widget, gpointer user_data ) { Ctk3DVisionPro *ctk_3d_vision_pro = CTK_3D_VISION_PRO(user_data); CtkDropDownMenu *menu = CTK_DROP_DOWN_MENU(widget); ChannelRangeDlg *dlg; gint result; SVP_RANGE range; SVP_RANGE prev_range; range = OPTION_MENU_IDX_TO_CHANNEL_RANGE(ctk_drop_down_menu_get_current_value(menu)); prev_range = HTU(0)->channel_range; if (HTU(0)->channel_range == range) { return; } dlg = create_channel_range_change_dlg(ctk_3d_vision_pro, range); gtk_window_set_transient_for (GTK_WINDOW(dlg->dlg_channel_range), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(dlg->parent)))); gtk_window_resize(GTK_WINDOW(dlg->dlg_channel_range), 350, 1); gtk_window_set_resizable(GTK_WINDOW(dlg->dlg_channel_range), FALSE); gtk_widget_show(dlg->dlg_channel_range); result = gtk_dialog_run(GTK_DIALOG(dlg->dlg_channel_range)); gtk_widget_hide(dlg->dlg_channel_range); /* Handle user's response */ switch (result) { case GTK_RESPONSE_YES: HTU(0)->channel_range = range; /* Send NV-Control command */ NvCtrlSetAttribute(ctk_3d_vision_pro->handle, NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE, (HTU(0)->channel_range)); enable_widgets(ctk_3d_vision_pro, (HTU(0)->channel_range == SVP_LONG_RANGE ? FALSE : TRUE)); break; case GTK_RESPONSE_NO: ctk_drop_down_menu_set_current_value(menu, CHANNEL_RANGE_TO_OPTION_MENU_IDX(prev_range)); break; default: /* do nothing. */ break; } free(dlg); } //***************************************************************************** GtkWidget* ctk_3d_vision_pro_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, ParsedAttribute *p, CtkEvent *ctk_event) { GObject *object; Ctk3DVisionPro *ctk_3d_vision_pro; GtkWidget *mainhbox; GtkWidget *leftvbox; GtkWidget *rightvbox; GtkWidget *banner; GtkWidget *alignment; GtkWidget *vbox; GtkWidget *vbox1, *vbox2; GtkWidget *frame_vbox; GtkWidget *label; GtkWidget *frame; GtkWidget *hbox; GtkWidget *hbox1; GtkWidget *hseparator; int i; GtkWidget *image; CtkDropDownMenu *menu; char temp[64]; //scratchpad memory used to construct labels. unsigned char *paired_glasses_list = NULL; int len; ReturnStatus ret; object = g_object_new(CTK_TYPE_3D_VISION_PRO, NULL); ctk_3d_vision_pro = CTK_3D_VISION_PRO(object); ctk_3d_vision_pro->handle = handle; ctk_3d_vision_pro->ctk_config = ctk_config; ctk_3d_vision_pro->add_glasses_dlg = NULL; // populate ctk_3d_vision_pro... // query attributes and fill the data .. ctk_3d_vision_pro->num_htu = 1; ctk_3d_vision_pro->htu_info = (HtuInfo **) malloc(sizeof(HtuInfo *) * ctk_3d_vision_pro->num_htu);; for (i = 0; i < ctk_3d_vision_pro->num_htu; i++) { HtuInfo *htu = (HtuInfo*) malloc(sizeof(HtuInfo)); HTU(i) = htu; } ret = NvCtrlGetAttribute(handle, NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL, (int *)&(HTU(0)->channel_num)); if (ret != NvCtrlSuccess) { HTU(0)->channel_num = 0; } ret = NvCtrlGetDisplayAttribute(handle, HTU(0)->channel_num, NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY, (int *)&(HTU(0)->signal_strength)); if (ret != NvCtrlSuccess) { HTU(0)->signal_strength = 0; } ret = NvCtrlGetAttribute(handle, NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE, (int *)&(HTU(0)->channel_range)); if (ret != NvCtrlSuccess || (!(HTU(0)->channel_range == SVP_SHORT_RANGE || HTU(0)->channel_range == SVP_MEDIUM_RANGE || HTU(0)->channel_range == SVP_LONG_RANGE))) { HTU(0)->channel_range = SVP_SHORT_RANGE; } ret = NvCtrlGetBinaryAttribute(handle, 0, NV_CTRL_BINARY_DATA_GLASSES_PAIRED_TO_3D_VISION_PRO_TRANSCEIVER, &paired_glasses_list, &len); if (ret != NvCtrlSuccess) { HTU(0)->num_glasses = 0; HTU(0)->glasses_info = NULL; } else { HTU(0)->num_glasses = ((unsigned int *)paired_glasses_list)[0]; HTU(0)->glasses_info = (GlassesInfo **)malloc(sizeof(GlassesInfo *) * HTU(0)->num_glasses); } for (i = 0; i < HTU(0)->num_glasses; i++) { int battery_level; char *glasses_name; GlassesInfo *glasses = (GlassesInfo *)malloc(sizeof(GlassesInfo)); unsigned int glasses_id = ((unsigned int *)paired_glasses_list)[i+1]; HTU(0)->glasses_info[i] = glasses; ret = NvCtrlGetStringDisplayAttribute(handle, glasses_id, NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME, &glasses_name); if (ret != NvCtrlSuccess) { glasses_name = NULL; } ret = NvCtrlGetDisplayAttribute(handle, glasses_id, NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL, (int *)&battery_level); if (ret != NvCtrlSuccess) { battery_level = 0; } strncpy(glasses->name, glasses_name, sizeof(glasses->name)); glasses->name[sizeof(glasses->name) - 1] = '\0'; glasses->battery = battery_level; glasses->glasses_id = glasses_id; init_glasses_info_widgets(glasses); free(glasses_name); } //----------------------------------------------------------------------------- // Construct and display NVIDIA 3D VisionPro page gtk_box_set_spacing(GTK_BOX(ctk_3d_vision_pro), 5); /* * Banner: TOP - LEFT -> RIGHT * * This image serves as a visual reference for basic color_box correction * purposes. */ banner = ctk_banner_image_new(BANNER_ARTWORK_SVP); gtk_box_pack_start(GTK_BOX(ctk_3d_vision_pro), banner, FALSE, FALSE, 0); mainhbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(ctk_3d_vision_pro), mainhbox, FALSE, FALSE, 0); //----------------------------------------------------------------------------- // left vertical box leftvbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(mainhbox), leftvbox, FALSE, FALSE, 0); frame = gtk_frame_new("Glasses"); gtk_box_pack_start(GTK_BOX(leftvbox), frame, FALSE, FALSE, 0); frame_vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(frame_vbox), 5); gtk_container_add(GTK_CONTAINER(frame), frame_vbox); alignment = gtk_alignment_new(0, 1, 0, 0); gtk_box_pack_start(GTK_BOX(frame_vbox), alignment, TRUE, TRUE, 0); snprintf(temp, sizeof(temp), "Glasses Connected: %d", HTU(0)->num_glasses); label = gtk_label_new(temp); gtk_container_add(GTK_CONTAINER(alignment), label); ctk_3d_vision_pro->glasses_num_label = GTK_LABEL(label); hbox = gtk_hbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(hbox), 5); alignment = gtk_alignment_new(0, 1, 0, 0); gtk_box_pack_start(GTK_BOX(frame_vbox), alignment, TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(alignment), hbox); add_button("Add Glasses", add_glasses_button_clicked, ctk_3d_vision_pro, hbox, __add_glasses_tooltip); ctk_3d_vision_pro->refresh_button = add_button("Refresh", refresh_button_clicked, ctk_3d_vision_pro, hbox, __refresh_tooltip); ctk_3d_vision_pro->identify_button = add_button("Identify", identify_button_clicked, ctk_3d_vision_pro, hbox, __identify_tooltip); ctk_3d_vision_pro->rename_button = add_button("Rename", rename_button_clicked, ctk_3d_vision_pro, hbox, __rename_tooltip); ctk_3d_vision_pro->remove_button = add_button("Remove", remove_button_clicked, ctk_3d_vision_pro, hbox, __remove_glasses_tooltip); ctk_3d_vision_pro->table.rows = HTU(0)->num_glasses; ctk_3d_vision_pro->table.columns = NUM_GLASSES_INFO_ATTRIBS; create_glasses_info_table(&(ctk_3d_vision_pro->table), HTU(0)->glasses_info, frame_vbox, ctk_3d_vision_pro->ctk_config); //----------------------------------------------------------------------------- // right vertical box rightvbox = gtk_vbox_new(FALSE, 10); gtk_box_pack_start(GTK_BOX(mainhbox), rightvbox, FALSE, FALSE, 0); frame = gtk_frame_new("RF Hub"); gtk_box_pack_start(GTK_BOX(rightvbox), frame, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), 5); gtk_container_add(GTK_CONTAINER(frame), vbox); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); vbox1 = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), vbox1, FALSE, FALSE, 0); vbox2 = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), vbox2, FALSE, FALSE, 0); snprintf(temp, sizeof(temp), "RF Hubs Connected:"); label = add_label(temp, vbox1); hbox1 = gtk_hbox_new(FALSE, 5); snprintf(temp, sizeof(temp), "Signal Strength:"); label = add_label(temp, hbox1); gtk_box_pack_start(GTK_BOX(vbox1), hbox1, FALSE, FALSE, 0); snprintf(temp, sizeof(temp), "%d", ctk_3d_vision_pro->num_htu); hbox1 = gtk_hbox_new(FALSE, 5); label = add_label(temp, hbox1); gtk_box_pack_start(GTK_BOX(vbox2), hbox1, FALSE, FALSE, 0); hbox1 = gtk_hbox_new(FALSE, 5); snprintf(temp, sizeof(temp), "[%d%%]", HTU(0)->signal_strength); image = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_xpm_data( get_signal_strength_icon(HTU(0)->signal_strength))); gtk_box_pack_start(GTK_BOX(hbox1), image, FALSE, FALSE, 0); label = add_label(temp, hbox1); ctk_3d_vision_pro->signal_strength_label = GTK_LABEL(label); ctk_3d_vision_pro->signal_strength_image = image; gtk_box_pack_start(GTK_BOX(vbox2), hbox1, FALSE, FALSE, 0); snprintf(temp, sizeof(temp), "Current Channel ID:"); label = add_label(temp, vbox1); snprintf(temp, sizeof(temp), "%d", HTU(0)->channel_num); label = add_label(temp, vbox2); ctk_3d_vision_pro->channel_num_label = GTK_LABEL(label); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), hseparator, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 5); label = add_label("Hub Range:", hbox); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 5); menu = (CtkDropDownMenu *) ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO); ctk_drop_down_menu_append_item(menu, "Short Range (up to 5 meters)", 0); ctk_drop_down_menu_append_item(menu, "Medium Range (up to 15 meters)", 1); ctk_drop_down_menu_append_item(menu, "Long Range", 2); ctk_3d_vision_pro->menu = GTK_WIDGET(menu); alignment = gtk_alignment_new(0, 1, 0, 0); gtk_box_pack_start(GTK_BOX(hbox), alignment, TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(alignment), ctk_3d_vision_pro->menu); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(ctk_3d_vision_pro->menu), "channel_range", GINT_TO_POINTER(0)); ctk_drop_down_menu_set_current_value((menu), CHANNEL_RANGE_TO_OPTION_MENU_IDX(HTU(0)->channel_range)); g_signal_connect(G_OBJECT(ctk_3d_vision_pro->menu), "changed", G_CALLBACK(channel_range_changed), (gpointer) ctk_3d_vision_pro); enable_widgets(ctk_3d_vision_pro, (HTU(0)->channel_range == SVP_LONG_RANGE ? FALSE : TRUE)); ctk_config_set_tooltip(ctk_config, ctk_3d_vision_pro->menu, __channel_range_tooltip); ctk_3d_vision_pro->parent_wnd = GTK_WINDOW(gtk_widget_get_parent(GTK_WIDGET(ctk_3d_vision_pro))); /* finally, show the widget */ gtk_widget_show_all(GTK_WIDGET(object)); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_3D_VISION_PRO_GLASSES_PAIR_EVENT), G_CALLBACK(callback_glasses_paired), (gpointer) ctk_3d_vision_pro); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_3D_VISION_PRO_GLASSES_UNPAIR_EVENT), G_CALLBACK(callback_glasses_unpaired), (gpointer) ctk_3d_vision_pro); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL), G_CALLBACK(svp_config_changed), (gpointer) ctk_3d_vision_pro); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE), G_CALLBACK(svp_config_changed), (gpointer) ctk_3d_vision_pro); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY), G_CALLBACK(svp_config_changed), (gpointer) ctk_3d_vision_pro); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME), G_CALLBACK(svp_config_changed), (gpointer) ctk_3d_vision_pro); return GTK_WIDGET(object); } GtkTextBuffer *ctk_3d_vision_pro_create_help(GtkTextTagTable *table) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "NVIDIA® 3D VisionPro™ help"); ctk_help_para(b, &i, "Use this page to configure the NVIDIA® 3D VisionPro™ hub " "and glasses. You can set up new glasses, change the " "hub's range, view which glasses are synchronized with " "the hub, and select a different channel to improve the " "hub-to-glasses signal strength."); ctk_help_para(b, &i, "NVIDIA® 3D Vision™ Pro is the professional version " "of the 3D Vision™ stereo glasses and emitter. While " "the 3D Vision kit uses infrared (IR) communication " "from the emitter to the stereo glasses, the 3D Vision " "Pro kit uses radio frequency (RF) bi-directional " "communication between the emitter and the stereo " "glasses. This allows multiple 3D Vision Pro hubs to " "be used in the same area without conflicts."); ctk_help_para(b, &i, "3D Vision Pro does not require line of sight between " "the hub and the 3D Vision Pro glasses. This provides " "more flexibility in the location, distance, and " "position of the glasses with respect to the emitter."); ctk_help_heading(b, &i, "Glasses Section"); ctk_help_para(b, &i, "This section contains various actions/configurations " "that can be performed with the NVIDIA 3D VisionPro RF " "glasses. This section also displays a list of glasses " "synced to the hub and their battery levels."); ctk_help_heading(b, &i, "Glasses Connected"); ctk_help_para(b, &i, "Shows how many glasses are connected and synchronized " "with the hub."); ctk_help_heading(b, &i, "Add glasses"); ctk_help_para(b, &i, "%s", __add_glasses_tooltip); ctk_help_para(b, &i, "This action is used to set up new 3D Vision Pro Glasses. " "On clicking this button the hub enters into pairing mode. " "Follow the instructions on Add Glasses dialog box. " "On pairing the new glasses, they appear in the glasses " "information table. Choose 'Save' to save the newly paired " " glasses or 'Cancel' if do not wish to store them."); ctk_help_heading(b, &i, "Refresh Glasses' Information"); ctk_help_para(b, &i, "%s", __refresh_tooltip); ctk_help_para(b, &i, "Refresh glasses information is typically required when- \n" "o Glasses move in and out of the range.\n" "o Get the updated battery level of all the glasses."); ctk_help_heading(b, &i, "Identify glasses"); ctk_help_para(b, &i, "Select the glasses from the list of paired glasses that " "you want to identify. Hub will communicate with the " "selected glasses and make LED on the glasses blink " "for a few seconds."); ctk_help_heading(b, &i, "Rename glasses"); ctk_help_para(b, &i, "%s", __rename_tooltip); ctk_help_para(b, &i, "Select the glasses from the list of paired glasses " "that you want to rename and provide an unique new name."); ctk_help_heading(b, &i, "Remove glasses"); ctk_help_para(b, &i, "%s", __remove_glasses_tooltip); ctk_help_para(b, &i, "Select the glasses from the list of paired glasses " "that you want to remove. On removal glasses get " "unpaired and will not sync to the hub."); ctk_help_heading(b, &i, "Glasses Information"); ctk_help_para(b, &i, "%s", __goggle_info_tooltip); ctk_help_heading(b, &i, "Glasses Name"); ctk_help_para(b, &i, "Each pair of glasses has an unique name and the name should " "start and end with an alpha-numeric character. " "Glasses can be renamed using Rename button."); ctk_help_heading(b, &i, "Battery Level"); ctk_help_para(b, &i, "Displays battery level icon along with the value in " "percentage."); ctk_help_heading(b, &i, "RF Hub section"); ctk_help_para(b, &i, "This section contains various actions that can be " "performed on the NVIDIA® 3D VisionPro™ hub. This " "section also displays signal strength of the channel " "currently used and current channel ID."); ctk_help_heading(b, &i, "Signal strength"); ctk_help_para(b, &i, "Shows the signal strength of the current hub channel as an icon " "and also value in percentage. \n" "Signal strength is from one of the six ranges below-\n" "\tExcellent\t\t [100%%]\n" "\tVery Good\t [>75%% - <100%%]\n" "\tGood \t\t [>50%% - <75%%]\n" "\tLow \t\t [>25%% - <50%%]\n" "\tVery Low \t\t [>0%% - <25%%]\n" "\tNo Signal\t\t [0%%]"); ctk_help_heading(b, &i, "Hub Range"); ctk_help_para(b, &i, "%s", __channel_range_tooltip); ctk_help_para(b, &i, "The hub range is the farthest distance that the " "glasses can synchronize with the 3D Vision Pro Hub. " "You can reduce the hub range to limit the experience " "to a small group, or increase the range to include " "everyone in a large room.\n" "Possible values for transceiver range are 'Short " "Range' 'Medium Range' and 'Long Range'."); ctk_help_para(b, &i, "Short Range: \n" "Allows glasses within a 5-meter (16.5-foot) range to " "be synced with the hub. This range is typically used " "for sharing 3D simulations and training information " "on a local workstation."); ctk_help_para(b, &i, "Medium Range: \n" "Allows glasses within a 15-meter (49-foot) range to " "be synced with the hub. This range is typically used " "for sharing a presentation with a limited audience or " "interacting with 3D CAD models during a collaborative " "design session."); ctk_help_para(b, &i, "Long Range: \n" "All glasses detected within the range and frequency of " "the hub will be synced. This range is typically used " "in a theater or visualization center."); ctk_help_finish(b); return b; } /* ctk_3d_vision_pro_select() ******************************************* * * Callback function for when the 3D Vision Pro page is being displayed * in the control panel. * */ void ctk_3d_vision_pro_select(GtkWidget *w) { } /* ctk_3d_vision_pro_unselect() ***************************************** * * Callback function for when the 3D VisionPro page is no longer being * displayed by the control panel. (User clicked on another page.) * */ void ctk_3d_vision_pro_unselect(GtkWidget *w) { } /* ctk_3d_vision_pro_config_file_attributes() **************************** * * Add to the ParsedAttribute list any attributes that we want saved * in the config file. * */ void ctk_3d_vision_pro_config_file_attributes(GtkWidget *w, ParsedAttribute *head) { } nvidia-settings/src/gtk+-2.x/ctkhelp.h0000664000175000017500000000745112236467170017710 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_HELP_H__ #define __CTK_HELP_H__ #include #include "common-utils.h" G_BEGIN_DECLS #define CTK_TYPE_HELP (ctk_help_get_type()) #define CTK_HELP(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_HELP, CtkHelp)) #define CTK_HELP_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_HELP, CtkHelpClass)) #define CTK_IS_HELP(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_HELP)) #define CTK_IS_HELP_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_HELP)) #define CTK_HELP_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_HELP, CtkHelpClass)) typedef struct _CtkHelp CtkHelp; typedef struct _CtkHelpClass CtkHelpClass; typedef struct _CtkHelpDataItem CtkHelpDataItem; struct _CtkHelp { GtkWindow parent; GtkWidget *text_viewer; GtkTextBuffer *default_help; GtkTextTagTable *tag_table; GtkWidget *toggle_button; }; struct _CtkHelpDataItem { // Header for the help section (usually corresponds to a label) gchar *label; // A brief summary of the contents gchar *help_text; // If non-NULL, elaborates on help_text above gchar *extended_help_text; }; struct _CtkHelpClass { GtkWindowClass parent_class; }; GType ctk_help_get_type (void) G_GNUC_CONST; GtkWidget *ctk_help_new (GtkWidget *, GtkTextTagTable *); void ctk_help_set_page (CtkHelp *, GtkTextBuffer *); GtkTextTagTable *ctk_help_create_tag_table (void); void ctk_help_title (GtkTextBuffer *, GtkTextIter *, const gchar *, ...) NV_ATTRIBUTE_PRINTF(3, 4); void ctk_help_para (GtkTextBuffer *, GtkTextIter *, const gchar *, ...) NV_ATTRIBUTE_PRINTF(3, 4); void ctk_help_heading (GtkTextBuffer *, GtkTextIter *, const gchar *, ...) NV_ATTRIBUTE_PRINTF(3, 4); void ctk_help_term (GtkTextBuffer *, GtkTextIter *, const gchar *, ...) NV_ATTRIBUTE_PRINTF(3, 4); void ctk_help_finish (GtkTextBuffer *); void ctk_help_reset_hardware_defaults(GtkTextBuffer *, GtkTextIter *, gchar *); gchar *ctk_help_create_reset_hardware_defaults_text(gchar*, gchar *); void ctk_help_data_list_prepend(GList **list, const gchar *label, const gchar *help_text, const gchar *extended_help_text); void ctk_help_data_list_free_full(GList *list); void ctk_help_data_list_print_terms(GtkTextBuffer *b, GtkTextIter *i, GList *help_data_list); void ctk_help_data_list_print_sections(GtkTextBuffer *b, GtkTextIter *i, GList *help_data_list); #define CTK_HELP_TITLE_TAG "title" #define CTK_HELP_HEADING_TAG "heading" #define CTK_HELP_HEADING_NOT_EDITABLE_TAG "not_editable" #define CTK_HELP_WORD_WRAP_TAG "word_wrap" #define CTK_HELP_MARGIN_TAG "margin" #define CTK_HELP_SINGLE_SPACE_TAG "single-space" #define CTK_HELP_BOLD_TAG "bold" G_END_DECLS #endif /* __CTK_HELP_H__ */ nvidia-settings/src/gtk+-2.x/ctkconfig.c0000664000175000017500000010727312236467170020223 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * The CtkConfig widget controls configuration options of the control * panel itself (rather than configuration options of the NVIDIA X/GLX * driver). */ #include "ctkconfig.h" #include "ctkhelp.h" #include "ctkwindow.h" #include "ctkutils.h" #include "ctkbanner.h" #include #include #include #include static const char *__tooltip_help = "When ToolTips are enabled, descriptions will be displayed next to options " "when the mouse is held over them."; static const char *__status_bar_help = "The status bar in the bottom " "left of the nvidia-settings GUI displays the most " "recent change that has been sent to the X " "server. The 'Display Status Bar' check box " "controls whether this status bar is displayed."; static const char *__slider_text_entries_help = "When the \"Slider Text Entries\" option is enabled, the current " "value of an attribute controlled by a slider is " "displayed and can be modified with a text entry " "shown next to the slider."; static const char *__x_display_names_help = "When the current settings are saved to the " "configuration file, the attributes can either be " "qualified with just the screen to which the attribute " "should be applied, or the attribute can be qualified with " "the entire X Display name. If you want to be able to " "use the same configuration file across multiple " "computers, be sure to leave this option unchecked. " "It is normally recommended to leave this option " "unchecked."; static const char *__show_quit_dialog_help = "When this option is enabled, nvidia-settings will ask if you " "really want to quit when the quit button is pressed."; static const char *__save_current_config_help = "When nvidia-settings exits, it saves the current X server " "configuration to a configuration file (\"~/.nvidia-settings-rc\", " "by default). Use this button to save the current X server " "configuration immediately, optionally to a different file."; static const char *__update_rules_on_profile_name_change_help = "If this option is enabled, changing the name of a profile in the " "Application Profile page of nvidia-settings will cause any rules " "that refer to that profile to also be updated to refer to the new " "profile name."; static void ctk_config_class_init(CtkConfigClass *ctk_config_class); static void display_status_bar_toggled(GtkWidget *, gpointer); static void tooltips_toggled(GtkWidget *, gpointer); static void slider_text_entries_toggled(GtkWidget *, gpointer); static void display_name_toggled(GtkWidget *widget, gpointer user_data); static void show_quit_dialog_toggled(GtkWidget *widget, gpointer user_data); static void update_rules_on_profile_name_change_toggled(GtkWidget *widget, gpointer user_data); static void save_rc_clicked(GtkWidget *widget, gpointer user_data); static GtkWidget *create_timer_list(CtkConfig *); static guint signals[1]; GType ctk_config_get_type( void ) { static GType ctk_config_type = 0; if (!ctk_config_type) { static const GTypeInfo ctk_config_info = { sizeof (CtkConfigClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ctk_config_class_init, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkConfig), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_config_type = g_type_register_static (GTK_TYPE_VBOX, "CtkConfig", &ctk_config_info, 0); } return ctk_config_type; } static void config_finalize(GObject *object) { CtkConfig *ctk_config = CTK_CONFIG(object); ctk_help_data_list_free_full(ctk_config->help_data); } static void ctk_config_class_init(CtkConfigClass *ctk_config_class) { GObjectClass *gobject_class = G_OBJECT_CLASS(ctk_config_class); gobject_class->finalize = config_finalize; signals[0] = g_signal_new("slider_text_entry_toggled", G_OBJECT_CLASS_TYPE(ctk_config_class), G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ctk_statusbar_init(CtkStatusBar *status_bar) { status_bar->widget = gtk_statusbar_new(); status_bar->prev_message_id = 0; status_bar->enabled = TRUE; gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR(status_bar->widget), FALSE); /* XXX force the status bar window to be vertically centered */ gtk_misc_set_alignment (GTK_MISC(GTK_STATUSBAR(status_bar->widget)->label), 0.0, 0.5); } GtkWidget* ctk_config_new(ConfigProperties *conf, CtrlHandles *pCtrlHandles) { gint i; GObject *object; CtkConfig *ctk_config; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *banner; GtkWidget *label; GtkWidget *hseparator; GtkWidget *check_button; GtkWidget *alignment; gboolean b; struct { const char *label; unsigned int mask; GCallback toggled_callback; const char *help_text; } config_check_button_entries[] = { { "Enable ToolTips", CONFIG_PROPERTIES_TOOLTIPS, G_CALLBACK(tooltips_toggled), __tooltip_help }, { "Display Status Bar", CONFIG_PROPERTIES_DISPLAY_STATUS_BAR, G_CALLBACK(display_status_bar_toggled), __status_bar_help }, { "Slider Text Entries", CONFIG_PROPERTIES_SLIDER_TEXT_ENTRIES, G_CALLBACK(slider_text_entries_toggled), __slider_text_entries_help }, { "Include X Display Names in the Config File", CONFIG_PROPERTIES_INCLUDE_DISPLAY_NAME_IN_CONFIG_FILE, G_CALLBACK(display_name_toggled), __x_display_names_help }, { "Show \"Really Quit?\" Dialog", CONFIG_PROPERTIES_SHOW_QUIT_DIALOG, G_CALLBACK(show_quit_dialog_toggled), __show_quit_dialog_help }, { "Update Rules when an Application Profile Name changes", CONFIG_PROPERTIES_UPDATE_RULES_ON_PROFILE_NAME_CHANGE, G_CALLBACK(update_rules_on_profile_name_change_toggled), __update_rules_on_profile_name_change_help }, }; object = g_object_new(CTK_TYPE_CONFIG, NULL); ctk_config = CTK_CONFIG(object); ctk_config->conf = conf; ctk_config->pCtrlHandles = pCtrlHandles; gtk_box_set_spacing(GTK_BOX(ctk_config), 10); /* initialize the statusbar widget */ ctk_statusbar_init(&ctk_config->status_bar); /* initialize the tooltips widget */ ctk_config->tooltips.object = gtk_tooltips_new(); /* banner */ banner = ctk_banner_image_new(BANNER_ARTWORK_CONFIG); gtk_box_pack_start(GTK_BOX(ctk_config), banner, FALSE, FALSE, 0); /* "nvidia-settings Configuration" */ hbox = gtk_hbox_new (FALSE, 5); gtk_box_pack_start(GTK_BOX(ctk_config), hbox, FALSE, FALSE, 0); label = gtk_label_new("nvidia-settings Configuration"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 0); /* check buttons: Enable tooltips, Display statusbar, and Display slider text entries */ vbox = gtk_vbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(ctk_config), vbox, FALSE, FALSE, 0); ctk_config->help_data = NULL; for (i = 0; i < ARRAY_LEN(config_check_button_entries); i++) { label = gtk_label_new(config_check_button_entries[i].label); check_button = gtk_check_button_new(); gtk_container_add(GTK_CONTAINER(check_button), label); b = !!(ctk_config->conf->booleans & config_check_button_entries[i].mask); if (config_check_button_entries[i].mask == CONFIG_PROPERTIES_TOOLTIPS) { if (b) { gtk_tooltips_enable(ctk_config->tooltips.object); } else { gtk_tooltips_disable(ctk_config->tooltips.object); } } gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), b); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(check_button), "toggled", config_check_button_entries[i].toggled_callback, ctk_config); ctk_config_set_tooltip_and_add_help_data(ctk_config, check_button, &ctk_config->help_data, config_check_button_entries[i].label, config_check_button_entries[i].help_text, NULL); } ctk_config->help_data = g_list_reverse(ctk_config->help_data); /* timer list */ ctk_config->timer_list_box = gtk_hbox_new(FALSE, 0); ctk_config->timer_list = create_timer_list(ctk_config); g_object_ref(ctk_config->timer_list); ctk_config->timer_list_visible = FALSE; gtk_box_pack_start(GTK_BOX(ctk_config), ctk_config->timer_list_box, TRUE, TRUE, 0); /* "Save Current Configuration" button */ label = gtk_label_new("Save Current Configuration"); hbox = gtk_hbox_new(FALSE, 0); ctk_config->button_save_rc = gtk_button_new(); alignment = gtk_alignment_new(1, 1, 0, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 15); gtk_container_add(GTK_CONTAINER(ctk_config->button_save_rc), hbox); gtk_container_add(GTK_CONTAINER(alignment), ctk_config->button_save_rc); gtk_box_pack_start(GTK_BOX(ctk_config), alignment, TRUE, TRUE, 0); /* Create the file selector for rc file */ ctk_config->rc_file_selector = gtk_file_selection_new ("Please select a file to save to"); g_signal_connect(G_OBJECT(ctk_config->button_save_rc), "clicked", G_CALLBACK(save_rc_clicked), (gpointer) ctk_config); gtk_file_selection_set_filename (GTK_FILE_SELECTION(ctk_config->rc_file_selector), DEFAULT_RC_FILE); ctk_config_set_tooltip(ctk_config, ctk_config->button_save_rc, __save_current_config_help); gtk_widget_show_all(GTK_WIDGET(ctk_config)); return GTK_WIDGET(ctk_config); } /* * save_rc_clicked() - called when "Save Current Configuration" button * is clicked. */ static void save_rc_clicked(GtkWidget *widget, gpointer user_data) { gint result; const gchar *rc_filename = NULL; CtkConfig *ctk_config = CTK_CONFIG(user_data); CtkWindow *ctk_window = CTK_WINDOW(ctk_get_parent_window(GTK_WIDGET(ctk_config))); result = gtk_dialog_run(GTK_DIALOG(ctk_config->rc_file_selector)); gtk_widget_hide(ctk_config->rc_file_selector); switch (result) { case GTK_RESPONSE_ACCEPT: case GTK_RESPONSE_OK: rc_filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION(ctk_config->rc_file_selector)); break; default: return; } /* write the configuration file */ add_special_config_file_attributes(ctk_window); nv_write_config_file(rc_filename, ctk_config->pCtrlHandles, ctk_window->attribute_list, ctk_config->conf); } void ctk_statusbar_clear(CtkStatusBar *status_bar) { if ((!status_bar->enabled) || (!status_bar->widget)) { return; } if (status_bar->prev_message_id) { gtk_statusbar_remove(GTK_STATUSBAR(status_bar->widget), 1, status_bar->prev_message_id); } } void ctk_statusbar_message(CtkStatusBar *status_bar, const gchar *str) { if ((!status_bar->enabled) || (!status_bar->widget)) { return; } if (status_bar->prev_message_id) { gtk_statusbar_remove(GTK_STATUSBAR(status_bar->widget), 1, status_bar->prev_message_id); } status_bar->prev_message_id = gtk_statusbar_push (GTK_STATUSBAR(status_bar->widget), 1, str); } /* ctk_config_statusbar_message() */ void ctk_config_statusbar_message(CtkConfig *ctk_config, const char *fmt, ...) { va_list ap; gchar *str; if ((!ctk_config) || (!(ctk_config->conf->booleans & CONFIG_PROPERTIES_DISPLAY_STATUS_BAR))) { return; } va_start(ap, fmt); str = g_strdup_vprintf(fmt, ap); va_end(ap); ctk_statusbar_message(&ctk_config->status_bar, str); g_free(str); } GtkWidget* ctk_config_get_statusbar(CtkConfig *ctk_config) { return ctk_config->status_bar.widget; } void ctk_config_set_tooltip(CtkConfig *ctk_config, GtkWidget *widget, const gchar *text) { gtk_tooltips_set_tip(ctk_config->tooltips.object, widget, text, NULL); } static void display_status_bar_toggled( GtkWidget *widget, gpointer user_data ) { CtkConfig *ctk_config = CTK_CONFIG(user_data); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { gtk_widget_show(ctk_config->status_bar.widget); ctk_config->conf->booleans |= CONFIG_PROPERTIES_DISPLAY_STATUS_BAR; ctk_config_statusbar_message(ctk_config, "Status bar enabled."); } else { gtk_widget_hide(ctk_config->status_bar.widget); if (ctk_config->status_bar.prev_message_id) { gtk_statusbar_remove(GTK_STATUSBAR(ctk_config->status_bar.widget), 1, ctk_config->status_bar.prev_message_id); } ctk_config->status_bar.prev_message_id = 0; ctk_config->conf->booleans &= ~CONFIG_PROPERTIES_DISPLAY_STATUS_BAR; } } static void tooltips_toggled(GtkWidget *widget, gpointer user_data) { CtkConfig *ctk_config = CTK_CONFIG(user_data); gboolean active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); if (active) { gtk_tooltips_enable(ctk_config->tooltips.object); ctk_config->conf->booleans |= CONFIG_PROPERTIES_TOOLTIPS; } else { gtk_tooltips_disable(ctk_config->tooltips.object); ctk_config->conf->booleans &= ~CONFIG_PROPERTIES_TOOLTIPS; } ctk_config_statusbar_message(ctk_config, "Tooltips %s.", active ? "enabled" : "disabled"); } static void slider_text_entries_toggled(GtkWidget *widget, gpointer user_data) { CtkConfig *ctk_config = CTK_CONFIG(user_data); gboolean active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); if (active) { ctk_config->conf->booleans |= CONFIG_PROPERTIES_SLIDER_TEXT_ENTRIES; } else { ctk_config->conf->booleans &= ~CONFIG_PROPERTIES_SLIDER_TEXT_ENTRIES; } ctk_config_statusbar_message(ctk_config, "Slider text entries %s.", active ? "enabled" : "disabled"); g_signal_emit(ctk_config, signals[0], 0); } static void display_name_toggled(GtkWidget *widget, gpointer user_data) { CtkConfig *ctk_config = CTK_CONFIG(user_data); gboolean active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); if (active) { ctk_config->conf->booleans |= CONFIG_PROPERTIES_INCLUDE_DISPLAY_NAME_IN_CONFIG_FILE; } else { ctk_config->conf->booleans &= ~CONFIG_PROPERTIES_INCLUDE_DISPLAY_NAME_IN_CONFIG_FILE; } ctk_config_statusbar_message(ctk_config, "Including X Display Names in Config File %s.", active ? "enabled" : "disabled"); } static void show_quit_dialog_toggled(GtkWidget *widget, gpointer user_data) { CtkConfig *ctk_config = CTK_CONFIG(user_data); gboolean active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); if (active) { ctk_config->conf->booleans |= CONFIG_PROPERTIES_SHOW_QUIT_DIALOG; } else { ctk_config->conf->booleans &= ~CONFIG_PROPERTIES_SHOW_QUIT_DIALOG; } ctk_config_statusbar_message(ctk_config, "Quit confirmation dialog %s.", active ? "enabled" : "disabled"); } static void update_rules_on_profile_name_change_toggled(GtkWidget *widget, gpointer user_data) { CtkConfig *ctk_config = CTK_CONFIG(user_data); gboolean active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); if (active) { ctk_config->conf->booleans |= CONFIG_PROPERTIES_UPDATE_RULES_ON_PROFILE_NAME_CHANGE; } else { ctk_config->conf->booleans &= ~CONFIG_PROPERTIES_UPDATE_RULES_ON_PROFILE_NAME_CHANGE; } ctk_config_statusbar_message(ctk_config, "Updating rules when an application profile " "name changes is %s.", active ? "enabled" : "disabled"); } gboolean ctk_config_slider_text_entry_shown(CtkConfig *ctk_config) { return !!(ctk_config->conf->booleans & CONFIG_PROPERTIES_SLIDER_TEXT_ENTRIES); } GtkTextBuffer *ctk_config_create_help(CtkConfig *ctk_config, GtkTextTagTable *table) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "nvidia-settings Configuration Help"); ctk_help_data_list_print_sections(b, &i, ctk_config->help_data); ctk_help_heading(b, &i, "Active Timers"); ctk_help_para(b, &i, "Some attributes are polled periodically " "to ensure the reported values are up-to-date. " "Each row in the 'Active Timers' table reflects " "the configuration of one of these timers and " "controls how frequently, if at all, a given " "attribute is polled. The 'Description' field " "describes the function of a timer, the 'Enabled' " "field allows enabling/disabling it, the 'Time " "Interval' field controls the delay between two " "consecutive polls (in milliseconds). The Active " "Timers table is only visible when timers are active."); ctk_help_finish(b); return b; } /* create_help() */ /****************************************************************************/ /* max time interval is 60 seconds, and min time interval is .1 seconds */ #define MAX_TIME_INTERVAL (60 * 1000) #define MIN_TIME_INTERVAL (100) static void enabled_renderer_func(GtkTreeViewColumn*, GtkCellRenderer*, GtkTreeModel*, GtkTreeIter*, gpointer); static void description_renderer_func(GtkTreeViewColumn*, GtkCellRenderer*, GtkTreeModel*, GtkTreeIter*, gpointer); static void time_interval_renderer_func(GtkTreeViewColumn*, GtkCellRenderer*, GtkTreeModel*, GtkTreeIter*, gpointer); static void time_interval_edited(GtkCellRendererText*, const gchar*, const gchar*, gpointer); static void timer_enable_toggled(GtkCellRendererToggle*, gchar*, gpointer); enum { TIMER_CONFIG_COLUMN = 0, FUNCTION_COLUMN, DATA_COLUMN, HANDLE_COLUMN, OWNER_ENABLE_COLUMN, NUM_COLUMNS, }; static GtkWidget *create_timer_list(CtkConfig *ctk_config) { GtkTreeModel *model; GtkWidget *treeview; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkWidget *sw; GtkWidget *vbox; GtkWidget *label; GtkWidget *alignment; sw = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); ctk_config->list_store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_POINTER, /* TIMER_CONFIG_COLUMN */ G_TYPE_POINTER, /* FUNCTION_COLUMN */ G_TYPE_POINTER, /* DATA_COLUMN */ G_TYPE_UINT, /* HANDLE_COLUMN */ G_TYPE_BOOLEAN); /* OWNER_ENABLE_COLUMN */ model = GTK_TREE_MODEL(ctk_config->list_store); treeview = gtk_tree_view_new_with_model(model); g_object_unref(ctk_config->list_store); /* Enable */ renderer = gtk_cell_renderer_toggle_new(); g_signal_connect(renderer, "toggled", G_CALLBACK(timer_enable_toggled), ctk_config); column = gtk_tree_view_column_new_with_attributes("Enabled", renderer, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); gtk_tree_view_column_set_resizable(column, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, enabled_renderer_func, GINT_TO_POINTER (TIMER_CONFIG_COLUMN), NULL); /* Description */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("Description", renderer, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, description_renderer_func, GINT_TO_POINTER (TIMER_CONFIG_COLUMN), NULL); /* Time interval */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("Time Interval", renderer, NULL); g_signal_connect(renderer, "edited", G_CALLBACK(time_interval_edited), ctk_config); gtk_tree_view_column_set_cell_data_func(column, renderer, time_interval_renderer_func, GINT_TO_POINTER (TIMER_CONFIG_COLUMN), NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); gtk_tree_view_column_set_resizable(column, FALSE); gtk_container_add(GTK_CONTAINER(sw), treeview); vbox = gtk_vbox_new(FALSE, 5); label = gtk_label_new("Active Timers:"); alignment = gtk_alignment_new(0.0, 0.0, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), label); gtk_box_pack_start(GTK_BOX(vbox), alignment, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); /* create the tooltip for the treeview (can't do it per column) */ ctk_config_set_tooltip(ctk_config, treeview, "The Active Timers describe operations that " "nvidia-settings will perform at regular " "intervals."); return vbox; } /* create_timer_list() */ static void enabled_renderer_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { gint column; TimerConfigProperty *timer_config; gboolean value; column = GPOINTER_TO_INT(data); gtk_tree_model_get(model, iter, column, &timer_config, -1); value = timer_config->user_enabled; g_object_set(GTK_CELL_RENDERER(cell), "active", value, NULL); } static void description_renderer_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { gint column; TimerConfigProperty *timer_config; gchar *value; column = GPOINTER_TO_INT(data); gtk_tree_model_get(model, iter, column, &timer_config, -1); value = timer_config->description; g_object_set(GTK_CELL_RENDERER(cell), "text", value, NULL); } static void time_interval_renderer_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { gint column = GPOINTER_TO_INT(data); TimerConfigProperty *timer_config; guint value; gchar str[32]; gtk_tree_model_get(model, iter, column, &timer_config, -1); value = timer_config->interval; snprintf(str, 32, "%d ms", value); g_object_set(GTK_CELL_RENDERER(cell), "text", str, NULL); g_object_set(GTK_CELL_RENDERER(cell), "editable", TRUE, NULL); } static void time_interval_edited(GtkCellRendererText *cell, const gchar *path_string, const gchar *new_text, gpointer user_data) { CtkConfig *ctk_config = CTK_CONFIG(user_data); GtkTreeModel *model = GTK_TREE_MODEL(ctk_config->list_store); GtkTreePath *path; GtkTreeIter iter; guint handle; GSourceFunc function; gpointer data; guint interval; TimerConfigProperty *timer_config; gboolean owner_enabled; interval = strtol(new_text, (char **)NULL, 10); if ((interval == 0) || (interval == UINT_MAX)) return; if (interval > MAX_TIME_INTERVAL) interval = MAX_TIME_INTERVAL; if (interval < MIN_TIME_INTERVAL) interval = MIN_TIME_INTERVAL; path = gtk_tree_path_new_from_string(path_string); gtk_tree_model_get_iter(model, &iter, path); gtk_tree_path_free(path); gtk_tree_model_get(model, &iter, TIMER_CONFIG_COLUMN, &timer_config, OWNER_ENABLE_COLUMN, &owner_enabled, HANDLE_COLUMN, &handle, FUNCTION_COLUMN, &function, DATA_COLUMN, &data, -1); timer_config->interval = interval; /* Restart the timer if it is already running */ if (timer_config->user_enabled && owner_enabled) { g_source_remove(handle); handle = g_timeout_add(interval, function, data); gtk_list_store_set(ctk_config->list_store, &iter, HANDLE_COLUMN, handle, -1); } } static void timer_enable_toggled(GtkCellRendererToggle *cell, gchar *path_string, gpointer user_data) { CtkConfig *ctk_config = CTK_CONFIG(user_data); GtkTreeModel *model = GTK_TREE_MODEL(ctk_config->list_store); GtkTreePath *path; GtkTreeIter iter; guint handle; GSourceFunc function; gpointer data; TimerConfigProperty *timer_config; gboolean owner_enabled; path = gtk_tree_path_new_from_string(path_string); gtk_tree_model_get_iter(model, &iter, path); gtk_tree_path_free(path); gtk_tree_model_get(model, &iter, TIMER_CONFIG_COLUMN, &timer_config, OWNER_ENABLE_COLUMN, &owner_enabled, HANDLE_COLUMN, &handle, FUNCTION_COLUMN, &function, DATA_COLUMN, &data, -1); timer_config->user_enabled ^= 1; /* Start/stop the timer only when the owner widget has enabled it */ if (owner_enabled) { if (timer_config->user_enabled) { handle = g_timeout_add(timer_config->interval, function, data); gtk_list_store_set(ctk_config->list_store, &iter, HANDLE_COLUMN, handle, -1); } else { g_source_remove(handle); } } ctk_config_statusbar_message(ctk_config, "Timer \"%s\" %s.", timer_config->description, timer_config->user_enabled ? "enabled" : "disabled"); } void ctk_config_add_timer(CtkConfig *ctk_config, guint interval, gchar *descr, GSourceFunc function, gpointer data) { GtkTreeIter iter; ConfigProperties *conf = ctk_config->conf; TimerConfigProperty *timer_config; if (strchr(descr, '_') || strchr(descr, ',')) return; timer_config = conf->timers; while (timer_config != NULL) { if (strcmp(timer_config->description, descr) == 0) break; timer_config = timer_config->next; } if (timer_config == NULL) { timer_config = g_malloc(sizeof(TimerConfigProperty)); if (timer_config == NULL) return; timer_config->description = g_strdup(descr); timer_config->user_enabled = TRUE; timer_config->interval = interval; timer_config->next = conf->timers; conf->timers = timer_config; } /* Timer defaults to user enabled/owner disabled */ gtk_list_store_append(ctk_config->list_store, &iter); gtk_list_store_set(ctk_config->list_store, &iter, TIMER_CONFIG_COLUMN, timer_config, OWNER_ENABLE_COLUMN, FALSE, FUNCTION_COLUMN, function, DATA_COLUMN, data, -1); /* make the timer list visible if it is not */ if (!ctk_config->timer_list_visible) { gtk_box_pack_start(GTK_BOX(ctk_config->timer_list_box), ctk_config->timer_list, TRUE, TRUE, 0); gtk_widget_show_all(ctk_config->timer_list_box); ctk_config->timer_list_visible = TRUE; } } void ctk_config_remove_timer(CtkConfig *ctk_config, GSourceFunc function) { GtkTreeModel *model; GtkTreeIter iter; GSourceFunc func; gboolean valid; guint handle; TimerConfigProperty *timer_config; gboolean owner_enabled; model = GTK_TREE_MODEL(ctk_config->list_store); valid = gtk_tree_model_get_iter_first(model, &iter); while (valid) { gtk_tree_model_get(model, &iter, TIMER_CONFIG_COLUMN, &timer_config, FUNCTION_COLUMN, &func, OWNER_ENABLE_COLUMN, &owner_enabled, HANDLE_COLUMN, &handle, -1); if (func == function) { /* Remove the timer if it was running */ if (timer_config->user_enabled && owner_enabled) { g_source_remove(handle); } gtk_list_store_remove(ctk_config->list_store, &iter); break; } valid = gtk_tree_model_iter_next(model, &iter); } /* if there are no more entries, hide the timer list */ valid = gtk_tree_model_get_iter_first(model, &iter); if (!valid) { gtk_container_remove(GTK_CONTAINER(ctk_config->timer_list_box), ctk_config->timer_list); ctk_config->timer_list_visible = FALSE; } } void ctk_config_start_timer(CtkConfig *ctk_config, GSourceFunc function, gpointer data) { GtkTreeModel *model; GtkTreeIter iter; GSourceFunc func; gboolean valid; guint handle; TimerConfigProperty *timer_config; gboolean owner_enabled; gpointer model_data; model = GTK_TREE_MODEL(ctk_config->list_store); valid = gtk_tree_model_get_iter_first(model, &iter); while (valid) { gtk_tree_model_get(model, &iter, TIMER_CONFIG_COLUMN, &timer_config, OWNER_ENABLE_COLUMN, &owner_enabled, HANDLE_COLUMN, &handle, FUNCTION_COLUMN, &func, DATA_COLUMN, &model_data, -1); if ((func == function) && (model_data == data)) { /* Start the timer if is enabled by the user and it is not already running. */ if (timer_config->user_enabled && !owner_enabled) { handle = g_timeout_add(timer_config->interval, function, data); gtk_list_store_set(ctk_config->list_store, &iter, HANDLE_COLUMN, handle, -1); } gtk_list_store_set(ctk_config->list_store, &iter, OWNER_ENABLE_COLUMN, TRUE, -1); break; } valid = gtk_tree_model_iter_next(model, &iter); } } void ctk_config_stop_timer(CtkConfig *ctk_config, GSourceFunc function, gpointer data) { GtkTreeModel *model; GtkTreeIter iter; GSourceFunc func; gboolean valid; guint handle; TimerConfigProperty *timer_config; gboolean owner_enabled; gpointer model_data; model = GTK_TREE_MODEL(ctk_config->list_store); valid = gtk_tree_model_get_iter_first(model, &iter); while (valid) { gtk_tree_model_get(model, &iter, TIMER_CONFIG_COLUMN, &timer_config, OWNER_ENABLE_COLUMN, &owner_enabled, HANDLE_COLUMN, &handle, FUNCTION_COLUMN, &func, DATA_COLUMN, &model_data, -1); if ((func == function) && (model_data == data)) { /* Remove the timer if was running. */ if (timer_config->user_enabled && owner_enabled) { g_source_remove(handle); } gtk_list_store_set(ctk_config->list_store, &iter, OWNER_ENABLE_COLUMN, FALSE, -1); break; } valid = gtk_tree_model_iter_next(model, &iter); } } /* * Helper function to add a tooltip to a widget *and* append a section to the * help text for that widget, for pages which use CtkHelpDataItem lists */ void ctk_config_set_tooltip_and_add_help_data(CtkConfig *config, GtkWidget *widget, GList **help_data_list, const gchar *label, const gchar *help_text, const gchar *extended_help_text) { ctk_help_data_list_prepend(help_data_list, label, help_text, extended_help_text); ctk_config_set_tooltip(config, widget, help_text); } nvidia-settings/src/gtk+-2.x/ctkscreen.h0000664000175000017500000000422212236467170020230 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_SCREEN_H__ #define __CTK_SCREEN_H__ #include #include "NvCtrlAttributes.h" #include "ctkevent.h" G_BEGIN_DECLS #define CTK_TYPE_SCREEN (ctk_screen_get_type()) #define CTK_SCREEN(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_SCREEN, CtkScreen)) #define CTK_SCREEN_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_SCREEN, CtkScreenClass)) #define CTK_IS_SCREEN(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_SCREEN)) #define CTK_IS_SCREEN_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_SCREEN)) #define CTK_SCREEN_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_SCREEN, CtkScreenClass)) typedef struct _CtkScreen CtkScreen; typedef struct _CtkScreenClass CtkScreenClass; struct _CtkScreen { GtkVBox parent; NvCtrlAttributeHandle *handle; GtkWidget *dimensions; GtkWidget *displays; GtkWidget *gpu_errors; int stereo_available; }; struct _CtkScreenClass { GtkVBoxClass parent_class; }; typedef struct { int stereo_mode; const char *name; } _CtkStereoMode; GType ctk_screen_get_type (void) G_GNUC_CONST; GtkWidget* ctk_screen_new (NvCtrlAttributeHandle *handle, CtkEvent *ctk_event); GtkTextBuffer *ctk_screen_create_help(GtkTextTagTable *, CtkScreen *, const gchar *); G_END_DECLS #endif /* __CTK_SCREEN_H__ */ nvidia-settings/src/gtk+-2.x/ctkslimm.h0000664000175000017500000000530712236467170020077 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_SLIMM_H__ #define __CTK_SLIMM_H__ #include #include "NvCtrlAttributes.h" #include "ctkevent.h" #include "ctkdisplaylayout.h" #include "ctkconfig.h" #include "ctkdisplayconfig-utils.h" #include "XF86Config-parser/xf86Parser.h" G_BEGIN_DECLS #define CTK_TYPE_SLIMM (ctk_slimm_get_type()) #define CTK_SLIMM(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_SLIMM, CtkSLIMM)) #define CTK_SLIMM_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_SLIMM, CtkSLIMMClass)) #define CTK_IS_SLIMM(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_SLIMM)) #define CTK_IS_SLIMM_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_SLIMM)) #define CTK_SLIMM_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_SLIMM, CtkSLIMMClass)) typedef struct _CtkSLIMM CtkSLIMM; typedef struct _CtkSLIMMClass CtkSLIMMClass; struct _CtkSLIMM { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; GtkWidget *mnu_display_config; GtkWidget *mnu_display_resolution; GtkWidget *mnu_display_refresh; GtkWidget *spbtn_hedge_overlap; GtkWidget *spbtn_vedge_overlap; GtkWidget *lbl_total_size; GtkWidget *box_total_size; GtkWidget *btn_save_config; SaveXConfDlg *save_xconfig_dlg; GtkWidget *cbtn_slimm_enable; nvModeLinePtr *resolution_table; nvModeLinePtr *refresh_table; int resolution_table_len; int refresh_table_len; gboolean mnu_refresh_disabled; nvModeLinePtr modelines; nvModeLinePtr cur_modeline; gint num_modelines; int max_screen_width; int max_screen_height; }; struct _CtkSLIMMClass { GtkVBoxClass parent_class; }; GType ctk_slimm_get_type (void) G_GNUC_CONST; GtkWidget* ctk_slimm_new (NvCtrlAttributeHandle *handle, CtkEvent *ctk_event, CtkConfig *ctk_config); GtkTextBuffer *ctk_slimm_create_help(GtkTextTagTable *, const gchar *); G_END_DECLS #endif /* __CTK_SLIMM_H__ */ nvidia-settings/src/gtk+-2.x/ctkvdpau.c0000664000175000017500000016556412236467170020104 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2012 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * * The VDPAU page is based on vdpauinfo 0.0.6: * * http://cgit.freedesktop.org/~aplattner/vdpauinfo/ * http://people.freedesktop.org/~aplattner/vdpau/vdpauinfo-0.0.6.tar.gz * * which has the following copyright and license: * * Copyright (c) 2008 Wladimir J. van der Laan * * 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. */ #include #include #include #include #include #include "ctkutils.h" #include "ctkhelp.h" #include "ctkvdpau.h" #include "ctkbanner.h" const gchar* __vdpau_information_label_help = "This page shows information about the Video Decode and Presentation API for " "Unix-like systems (VDPAU) library."; const gchar* __base_information_help = "This tab shows the VDPAU API version and supported codecs."; const gchar* __vdpau_api_version_help = "This shows the VDPAU API version."; const gchar* __supported_codecs_help = "This shows the supported codecs."; const gchar* __surface_limits_help = "This tab shows the maximum supported resolution and formats for video, " "bitmap and output surfaces."; const gchar* __video_surface_help = "This shows the maximum supported resolution and formats for video surfaces."; const gchar* __bitmap_surface_help = "This shows the maximum supported resolution and formats for bitmap surfaces."; const gchar* __ouput_surface_help = "This shows the maximum supported resolution and formats for output surfaces."; const gchar* __decoder_limits_help = "This tab shows the maximum level, number of macroblocks and resolution for " "each supported VDPAU decoder."; const gchar* __video_mixer_help = "This tab shows the capabilities of the VDPAU video mixer: the features, " "parameters, and attributes."; const gchar* __video_mixer_feature_help = "This shows the features supported by the video mixer."; const gchar* __video_mixer_parameter_help = "This shows the video mixer parameters and any applicable ranges."; const gchar* __video_mixer_attribute_help = "This shows the video mixer attributes and any applicable ranges."; static int queryOutputSurface(CtkVDPAU *ctk_vdpau, VdpDevice device, VdpGetProcAddress *getProcAddress); static int queryBitmapSurface(CtkVDPAU *ctk_vdpau, VdpDevice device, VdpGetProcAddress *getProcAddress); #define GETADDR(device, function_id, function_pointer) \ getProcAddress(device, function_id, function_pointer) static void getAddressVDPAUDeviceFunctions(VdpDevice device, VdpGetProcAddress *getProcAddress) { GETADDR(device, VDP_FUNC_ID_GET_ERROR_STRING, (void**)&VDPAUDeviceFunctions.GetErrorString); GETADDR(device, VDP_FUNC_ID_GET_PROC_ADDRESS, (void**)&VDPAUDeviceFunctions.GetProcAddress); GETADDR(device, VDP_FUNC_ID_GET_API_VERSION, (void**)&VDPAUDeviceFunctions.GetApiVersion); GETADDR(device, VDP_FUNC_ID_GET_INFORMATION_STRING, (void**)&VDPAUDeviceFunctions.GetInformationString); GETADDR(device, VDP_FUNC_ID_VIDEO_SURFACE_QUERY_CAPABILITIES, (void**)&VDPAUDeviceFunctions.VideoSurfaceQueryCapabilities); GETADDR(device, VDP_FUNC_ID_VIDEO_SURFACE_QUERY_GET_PUT_BITS_Y_CB_CR_CAPABILITIES, (void**)&VDPAUDeviceFunctions.VideoSurfaceQueryGetPutBitsYCbCrCapabilities); GETADDR(device, VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_CAPABILITIES, (void**)&VDPAUDeviceFunctions.OutputSurfaceQueryCapabilities); GETADDR(device, VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_GET_PUT_BITS_NATIVE_CAPABILITIES, (void**)&VDPAUDeviceFunctions.OutputSurfaceQueryGetPutBitsNativeCapabilities); GETADDR(device, VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_PUT_BITS_Y_CB_CR_CAPABILITIES, (void**)&VDPAUDeviceFunctions.OutputSurfaceQueryPutBitsYCbCrCapabilities); GETADDR(device, VDP_FUNC_ID_BITMAP_SURFACE_QUERY_CAPABILITIES, (void**)&VDPAUDeviceFunctions.BitmapSurfaceQueryCapabilities); GETADDR(device, VDP_FUNC_ID_DECODER_QUERY_CAPABILITIES, (void**)&VDPAUDeviceFunctions.DecoderQueryCapabilities); GETADDR(device, VDP_FUNC_ID_VIDEO_MIXER_QUERY_FEATURE_SUPPORT, (void**)&VDPAUDeviceFunctions.VideoMixerQueryFeatureSupport); GETADDR(device, VDP_FUNC_ID_VIDEO_MIXER_QUERY_PARAMETER_SUPPORT, (void**)&VDPAUDeviceFunctions.VideoMixerQueryParameterSupport); GETADDR(device, VDP_FUNC_ID_VIDEO_MIXER_QUERY_ATTRIBUTE_SUPPORT, (void**)&VDPAUDeviceFunctions.VideoMixerQueryAttributeSupport); GETADDR(device, VDP_FUNC_ID_VIDEO_MIXER_QUERY_PARAMETER_VALUE_RANGE, (void**)&VDPAUDeviceFunctions.VideoMixerQueryParameterValueRange); GETADDR(device, VDP_FUNC_ID_VIDEO_MIXER_QUERY_ATTRIBUTE_VALUE_RANGE, (void**)&VDPAUDeviceFunctions.VideoMixerQueryAttributeValueRange); } #undef GETADDR /* * queryBaseInfo() - Query basic VDPAU information */ static int queryBaseInfo(CtkVDPAU *ctk_vdpau, VdpDevice device, VdpGetProcAddress *getProcAddress) { static const Desc decoder_list[] = { {"MPEG1", VDP_DECODER_PROFILE_MPEG1, 0x01}, {"MPEG2", VDP_DECODER_PROFILE_MPEG2_SIMPLE, 0x02}, {"MPEG2", VDP_DECODER_PROFILE_MPEG2_MAIN, 0x02}, {"H264", VDP_DECODER_PROFILE_H264_BASELINE, 0x04}, {"H264", VDP_DECODER_PROFILE_H264_MAIN, 0x04}, {"H264", VDP_DECODER_PROFILE_H264_HIGH, 0x04}, {"VC1", VDP_DECODER_PROFILE_VC1_SIMPLE, 0x08}, {"VC1" , VDP_DECODER_PROFILE_VC1_MAIN, 0x08}, {"VC1", VDP_DECODER_PROFILE_VC1_ADVANCED, 0x08}, {"MPEG4", VDP_DECODER_PROFILE_MPEG4_PART2_SP, 0x10}, {"MPEG4", VDP_DECODER_PROFILE_MPEG4_PART2_ASP, 0x10}, {"DIVX4", VDP_DECODER_PROFILE_DIVX4_QMOBILE, 0x20}, {"DIVX4", VDP_DECODER_PROFILE_DIVX4_MOBILE, 0x20}, {"DIVX4", VDP_DECODER_PROFILE_DIVX4_HOME_THEATER, 0x20}, {"DIVX4", VDP_DECODER_PROFILE_DIVX4_HD_1080P, 0x20}, {"DIVX5", VDP_DECODER_PROFILE_DIVX5_QMOBILE, 0x40}, {"DIVX5", VDP_DECODER_PROFILE_DIVX5_MOBILE, 0x40}, {"DIVX5", VDP_DECODER_PROFILE_DIVX5_HOME_THEATER, 0x40}, {"DIVX5", VDP_DECODER_PROFILE_DIVX5_HD_1080P, 0x40}, }; const size_t decoder_list_count = sizeof(decoder_list)/sizeof(Desc); GtkWidget *vbox, *hbox; GtkWidget *table; GtkWidget *label, *event; uint32_t api; GtkWidget *eventbox; int x, count = 0; uint32_t decoder_mask = 0; if (VDPAUDeviceFunctions.GetApiVersion && (VDPAUDeviceFunctions.GetApiVersion(&api) != VDP_STATUS_OK)) { return -1; } /* Add base information */ vbox = gtk_vbox_new(FALSE, 0); eventbox = gtk_event_box_new(); ctk_force_text_colors_on_widget(eventbox); gtk_container_add(GTK_CONTAINER(eventbox), vbox); gtk_notebook_append_page(GTK_NOTEBOOK(ctk_vdpau->notebook), eventbox, gtk_label_new("Base Information")); hbox = gtk_hbox_new(FALSE, 0); table = gtk_table_new(2, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 10); gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 10); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); add_table_row_with_help_text(table, ctk_vdpau->ctk_config, __vdpau_api_version_help, 0, 0, 0, 0, "API version:", 0, 0, g_strdup_printf("%i", api)); label = gtk_label_new("Supported Codecs:"); event = gtk_event_box_new(); ctk_force_text_colors_on_widget(event); gtk_container_add(GTK_CONTAINER(event), label); ctk_config_set_tooltip(ctk_vdpau->ctk_config, event, __supported_codecs_help); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), event, 0, 1, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0); for (x = 0; x < decoder_list_count; x++) { VdpBool is_supported = FALSE; VdpStatus ret; uint32_t max_level, max_macroblocks, max_width, max_height; ret = VDPAUDeviceFunctions.DecoderQueryCapabilities(device, decoder_list[x].id, &is_supported, &max_level, &max_macroblocks, &max_width, &max_height); if (ret == VDP_STATUS_OK && is_supported) { gchar *str; if (decoder_mask & decoder_list[x].aux) { continue; } gtk_table_resize(GTK_TABLE(table), 2+count, 2); str = g_strdup_printf("%s", decoder_list[x].name); label = gtk_label_new(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); g_free(str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, count+1, count+2, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0); count++; decoder_mask |= decoder_list[x].aux; } } ctk_vdpau->baseInfoVbox = vbox; return 0; } /* queryBaseInfo() */ /**************** Video surface ************/ static const Desc ycbcr_types[] = { {"NV12", VDP_YCBCR_FORMAT_NV12, 0}, {"YV12", VDP_YCBCR_FORMAT_YV12, 0}, {"UYVY", VDP_YCBCR_FORMAT_UYVY, 0}, {"YUYV", VDP_YCBCR_FORMAT_YUYV, 0}, {"Y8U8V8A8", VDP_YCBCR_FORMAT_Y8U8V8A8, 0}, {"V8U8Y8A8", VDP_YCBCR_FORMAT_V8U8Y8A8, 0}, }; static const size_t ycbcr_type_count = sizeof(ycbcr_types)/sizeof(Desc); static const Desc rgb_types[] = { {"B8G8R8A8", VDP_RGBA_FORMAT_B8G8R8A8, 0}, {"R8G8B8A8", VDP_RGBA_FORMAT_R8G8B8A8, 0}, {"R10G10B10A2", VDP_RGBA_FORMAT_R10G10B10A2, 0}, {"B10G10R10A2", VDP_RGBA_FORMAT_B10G10R10A2, 0}, {"A8", VDP_RGBA_FORMAT_A8, 0}, }; static const size_t rgb_type_count = sizeof(rgb_types)/sizeof(Desc); /* * queryVideoSurface() - Query Video surface limits. * */ static int queryVideoSurface(CtkVDPAU *ctk_vdpau, VdpDevice device, VdpGetProcAddress *getProcAddress) { static const Desc chroma_types[] = { {"420", VDP_CHROMA_TYPE_420, 0}, {"422", VDP_CHROMA_TYPE_422, 0}, {"444", VDP_CHROMA_TYPE_444, 0}, }; const size_t chroma_type_count = sizeof(chroma_types)/sizeof(Desc); VdpStatus ret; int x; GtkWidget *vbox, *hbox; GtkWidget *table; GtkWidget *label, *hseparator, *scrollWin; GtkWidget *eventbox, *event; GString *str1 = g_string_new(""); int count = 0; if ((VDPAUDeviceFunctions.VideoSurfaceQueryGetPutBitsYCbCrCapabilities == NULL) || (VDPAUDeviceFunctions.VideoSurfaceQueryGetPutBitsYCbCrCapabilities == NULL)) { return -1; } /* Add Video surface limits */ vbox = gtk_vbox_new(FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new("Video Surface:"); eventbox = gtk_event_box_new(); ctk_force_text_colors_on_widget(eventbox); event = gtk_event_box_new(); ctk_force_text_colors_on_widget(event); gtk_container_add(GTK_CONTAINER(event), label); ctk_config_set_tooltip(ctk_vdpau->ctk_config, event, __video_surface_help); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), event, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); scrollWin = gtk_scrolled_window_new(NULL, NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollWin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(eventbox), hbox); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollWin), eventbox); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5); /* Add tab to notebook */ gtk_notebook_append_page(GTK_NOTEBOOK(ctk_vdpau->notebook), scrollWin, gtk_label_new("Surface Limits")); ctk_vdpau->surfaceVbox = vbox; /* Generate a new table */ table = gtk_table_new(1, 4, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); label = gtk_label_new("Name"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Width"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Height"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 2, 3, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Types"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 3, 4, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); /* fill data to the table */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0); for (x = 0; x < chroma_type_count; x++) { VdpBool is_supported = FALSE; uint32_t max_width, max_height; ret = VDPAUDeviceFunctions.VideoSurfaceQueryCapabilities(device, chroma_types[x].id, &is_supported, &max_width, &max_height); if (ret == VDP_STATUS_OK && is_supported) { int y; gchar *str = NULL; gtk_table_resize(GTK_TABLE(table), count+2, 4); str = g_strdup_printf("%s", chroma_types[x].name); label = gtk_label_new(str); g_free(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, count+1, count+2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); str = g_strdup_printf("%i", max_width); label = gtk_label_new(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); g_free(str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, count+1, count+2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); str = g_strdup_printf("%i", max_height); label = gtk_label_new(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); g_free(str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 2, 3, count+1, count+2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); /* Find out supported formats */ str1 = g_string_erase (str1, 0, -1); for (y = 0; y < ycbcr_type_count; y++) { is_supported = FALSE; ret = VDPAUDeviceFunctions.VideoSurfaceQueryGetPutBitsYCbCrCapabilities (device, chroma_types[x].id, ycbcr_types[y].id, &is_supported); if (ret == VDP_STATUS_OK && is_supported) { const gchar* s = g_strdup_printf("%s ", ycbcr_types[y].name); str1 = g_string_append(str1, s); } } label = gtk_label_new(g_strdup_printf("%s", str1->str)); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 3, 4, count+1, count+2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); } count++; } g_string_free(str1, TRUE); queryOutputSurface(ctk_vdpau, device, getProcAddress); queryBitmapSurface(ctk_vdpau, device, getProcAddress); return 0; } /* queryVideoSurface() */ /******************* Decoder ****************/ /* * queryDecoderCaps() - Query decoder capabilities. */ static int queryDecoderCaps(CtkVDPAU *ctk_vdpau, VdpDevice device, VdpGetProcAddress *getProcAddress) { static const Desc decoder_profiles[] = { {"MPEG1", VDP_DECODER_PROFILE_MPEG1, 0}, {"MPEG2 Simple", VDP_DECODER_PROFILE_MPEG2_SIMPLE, 0}, {"MPEG2 Main", VDP_DECODER_PROFILE_MPEG2_MAIN, 0}, {"H264 Baseline", VDP_DECODER_PROFILE_H264_BASELINE, 0}, {"H264 Main", VDP_DECODER_PROFILE_H264_MAIN, 0}, {"H264 High", VDP_DECODER_PROFILE_H264_HIGH, 0}, {"VC1 Simple", VDP_DECODER_PROFILE_VC1_SIMPLE, 0}, {"VC1 Main", VDP_DECODER_PROFILE_VC1_MAIN, 0}, {"VC1 Advanced", VDP_DECODER_PROFILE_VC1_ADVANCED, 0}, {"MPEG4 part 2 simple profile", VDP_DECODER_PROFILE_MPEG4_PART2_SP, 0}, {"MPEG4 part 2 advanced simple profile", VDP_DECODER_PROFILE_MPEG4_PART2_ASP, 0}, {"DIVX4 QMobile", VDP_DECODER_PROFILE_DIVX4_QMOBILE, 0}, {"DIVX4 Mobile", VDP_DECODER_PROFILE_DIVX4_MOBILE, 0}, {"DIVX4 Home Theater", VDP_DECODER_PROFILE_DIVX4_HOME_THEATER, 0}, {"DIVX4 HD 1080P", VDP_DECODER_PROFILE_DIVX4_HD_1080P, 0}, {"DIVX5 QMobile", VDP_DECODER_PROFILE_DIVX5_QMOBILE, 0}, {"DIVX5 Mobile", VDP_DECODER_PROFILE_DIVX5_MOBILE, 0}, {"DIVX5 Home Theater", VDP_DECODER_PROFILE_DIVX5_HOME_THEATER, 0}, {"DIVX5 HD 1080P", VDP_DECODER_PROFILE_DIVX5_HD_1080P, 0}, }; const size_t decoder_profile_count = sizeof(decoder_profiles)/sizeof(Desc); VdpStatus ret; int x, count = 0; GtkWidget *vbox, *hbox; GtkWidget *table; GtkWidget *label, *hseparator; GtkWidget *eventbox; if (VDPAUDeviceFunctions.DecoderQueryCapabilities == NULL) { return -1; } /* Add Decoder capabilities */ vbox = gtk_vbox_new(FALSE, 0); eventbox = gtk_event_box_new(); ctk_force_text_colors_on_widget(eventbox); gtk_container_add(GTK_CONTAINER(eventbox), vbox); /* Add tab to notebook */ gtk_notebook_append_page(GTK_NOTEBOOK(ctk_vdpau->notebook), eventbox, gtk_label_new("Decoder Limits")); /* Generate a new table */ table = gtk_table_new(2, 5, FALSE); ctk_force_text_colors_on_widget(table); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); label = gtk_label_new("Name"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Level"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Macroblocks"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 2, 3, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Width"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 3, 4, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Height"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 4, 5, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); /* separator between heading and data */ hseparator = gtk_hseparator_new(); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 5, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0); /* Enter the data values */ for (x = 0; x < decoder_profile_count; x++) { VdpBool is_supported = FALSE; uint32_t max_level, max_macroblocks, max_width, max_height; ret = VDPAUDeviceFunctions.DecoderQueryCapabilities(device, decoder_profiles[x].id, &is_supported, &max_level, &max_macroblocks, &max_width, &max_height); if (ret == VDP_STATUS_OK && is_supported) { gchar *str = NULL; gtk_table_resize(GTK_TABLE(table), count+4, 5); str = g_strdup_printf("%s", decoder_profiles[x].name); label = gtk_label_new(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); g_free(str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, count+3, count+4, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); str = g_strdup_printf("%i", max_level); label = gtk_label_new(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); g_free(str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, count+3, count+4, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); str = g_strdup_printf("%i", max_macroblocks); label = gtk_label_new(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); g_free(str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 2, 3, count+3, count+4, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); str = g_strdup_printf("%i", max_width); label = gtk_label_new(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); g_free(str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 3, 4, count+3, count+4, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); str = g_strdup_printf("%i", max_height); label = gtk_label_new(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); g_free(str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 4, 5, count+3, count+4, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); } count++; } return 0; } /* queryDecoderCaps() */ /* * queryOutputSurface() - Query Output surface information */ static int queryOutputSurface(CtkVDPAU *ctk_vdpau, VdpDevice device, VdpGetProcAddress *getProcAddress) { VdpStatus ret; int x, y, count = 0; GString *str1 = g_string_new(""); GtkWidget *vbox, *hbox; GtkWidget *table; GtkWidget *label, *hseparator; GtkWidget *eventbox; if ((VDPAUDeviceFunctions.OutputSurfaceQueryCapabilities == NULL) || (VDPAUDeviceFunctions.OutputSurfaceQueryGetPutBitsNativeCapabilities == NULL)) { return -1; } /* Add Output surface information */ vbox = ctk_vdpau->surfaceVbox; hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new("Output Surface:"); eventbox = gtk_event_box_new(); ctk_force_text_colors_on_widget(eventbox); gtk_container_add(GTK_CONTAINER(eventbox), label); ctk_config_set_tooltip(ctk_vdpau->ctk_config, eventbox, __ouput_surface_help); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), eventbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); /* Generate a new table */ table = gtk_table_new(1, 5, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); label = gtk_label_new("Name"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Width"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Height"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 2, 3, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Native"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 3, 4, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Types"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 4, 5, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0); /* fill output surface data */ for (x = 0; x < rgb_type_count; x++) { VdpBool is_supported, native=FALSE; uint32_t max_width, max_height; ret = VDPAUDeviceFunctions.OutputSurfaceQueryCapabilities(device, rgb_types[x].id, &is_supported, &max_width, &max_height); VDPAUDeviceFunctions.OutputSurfaceQueryGetPutBitsNativeCapabilities (device, rgb_types[x].id, &native); if (ret == VDP_STATUS_OK && is_supported) { gchar *str = NULL; gtk_table_resize(GTK_TABLE(table), count+2, 5); str = g_strdup_printf("%s", rgb_types[x].name); label = gtk_label_new(str); g_free(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, count+1, count+2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); str = g_strdup_printf("%i", max_width); label = gtk_label_new(str); g_free(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, count+1, count+2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); str = g_strdup_printf("%i", max_height); label = gtk_label_new(str); g_free(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 2, 3, count+1, count+2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); str = g_strdup_printf("%c", native?'y':'-'); label = gtk_label_new(str); g_free(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 3, 4, count+1, count+2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); str1 = g_string_erase (str1, 0, -1); /* Find out supported formats */ for (y = 0; y < ycbcr_type_count; y++) { is_supported = FALSE; ret = VDPAUDeviceFunctions.OutputSurfaceQueryPutBitsYCbCrCapabilities (device, rgb_types[x].id, ycbcr_types[y].id, &is_supported); if (ret == VDP_STATUS_OK && is_supported) { gchar* s = g_strdup_printf("%s ", ycbcr_types[y].name); str1 = g_string_append(str1, s); } } label = gtk_label_new(g_strdup_printf("%s", str1->str)); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 4, 5, count+1, count+2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); } count++; } return 0; } /* queryOutputSurface() */ /* * queryBitmapSurface() - Query Bitmap surface limits */ static int queryBitmapSurface(CtkVDPAU *ctk_vdpau, VdpDevice device, VdpGetProcAddress *getProcAddress) { VdpStatus ret; int x, count = 0; GtkWidget *vbox, *hbox; GtkWidget *table; GtkWidget *label, *hseparator; GtkWidget *eventbox; if (VDPAUDeviceFunctions.BitmapSurfaceQueryCapabilities == NULL) { return -1; } /* Add Bitmap surface information */ vbox = ctk_vdpau->surfaceVbox; hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new("Bitmap Surface:"); eventbox = gtk_event_box_new(); ctk_force_text_colors_on_widget(eventbox); gtk_container_add(GTK_CONTAINER(eventbox), label); ctk_config_set_tooltip(ctk_vdpau->ctk_config, eventbox, __bitmap_surface_help); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), eventbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); /* Generate a new table */ table = gtk_table_new(1, 5, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); label = gtk_label_new("Name"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Width"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Height"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 2, 3, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0); /* fill the Bitmap surface data */ for (x = 0; x < rgb_type_count; x++) { VdpBool is_supported; uint32_t max_width, max_height; ret = VDPAUDeviceFunctions.BitmapSurfaceQueryCapabilities(device, rgb_types[x].id, &is_supported, &max_width, &max_height); if (ret == VDP_STATUS_OK && is_supported) { gchar *str = NULL; gtk_table_resize(GTK_TABLE(table), count+2, 5); str = g_strdup_printf("%s", rgb_types[x].name); label = gtk_label_new(str); g_free(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, count+1, count+2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); str = g_strdup_printf("%i", max_width); label = gtk_label_new(str); g_free(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, count+1, count+2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); str = g_strdup_printf("%i", max_height); label = gtk_label_new(str); g_free(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 2, 3, count+1, count+2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); } count++; } return 0; } /* queryBitmapSurface() */ /******************* Video mixer ****************/ /* Type for value ranges */ enum DataType { DT_NONE, DT_INT, DT_UINT, DT_FLOAT }; /* * display_range() - Print the range */ static void display_range(GtkTable *table, gint x, uint32_t aux, uint32_t minval, uint32_t maxval) { gchar *str1 = NULL, *str2 = NULL; GtkWidget *label; switch(aux) { case DT_INT: { str1 = g_strdup_printf("%i", minval); str2 = g_strdup_printf("%i", maxval); break; } case DT_UINT: { str1 = g_strdup_printf("%u", minval); str2 = g_strdup_printf("%u", maxval); break; } case DT_FLOAT: { str1 = g_strdup_printf("%.2f",*((float*)&minval)); str2 = g_strdup_printf("%.2f", *((float*)&maxval)); break; } default: /* Ignore value which we don't know how to display */; } label = gtk_label_new(str1); g_free(str1); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 2, 3, x+3, x+4, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(str2); g_free(str2); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 3, 4, x+3, x+4, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); } /* display_range() */ /* * queryVideoMixer() - Query Video mixer information */ static int queryVideoMixer(CtkVDPAU *ctk_vdpau, VdpDevice device, VdpGetProcAddress *getProcAddress) { static const Desc mixer_features[] = { {"DEINTERLACE_TEMPORAL", VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL, 0}, {"DEINTERLACE_TEMPORAL_SPATIAL", VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL, 0}, {"INVERSE_TELECINE", VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE, 0}, {"NOISE_REDUCTION", VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION, 0}, {"SHARPNESS", VDP_VIDEO_MIXER_FEATURE_SHARPNESS, 0}, {"LUMA_KEY", VDP_VIDEO_MIXER_FEATURE_LUMA_KEY, 0}, {"HIGH QUALITY SCALING - L1", VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1, 0}, {"HIGH QUALITY SCALING - L2", VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2, 0}, {"HIGH QUALITY SCALING - L3", VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3, 0}, {"HIGH QUALITY SCALING - L4", VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4, 0}, {"HIGH QUALITY SCALING - L5", VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L5, 0}, {"HIGH QUALITY SCALING - L6", VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L6, 0}, {"HIGH QUALITY SCALING - L7", VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L7, 0}, {"HIGH QUALITY SCALING - L8", VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L8, 0}, {"HIGH QUALITY SCALING - L9", VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L9, 0}, }; static const size_t mixer_features_count = sizeof(mixer_features)/sizeof(Desc); static const Desc mixer_parameters[] = { {"VIDEO_SURFACE_WIDTH", VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH,DT_UINT}, {"VIDEO_SURFACE_HEIGHT", VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT,DT_UINT}, {"CHROMA_TYPE",VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE,DT_NONE}, {"LAYERS",VDP_VIDEO_MIXER_PARAMETER_LAYERS,DT_UINT}, }; static const size_t mixer_parameters_count = sizeof(mixer_parameters)/sizeof(Desc); static const Desc mixer_attributes[] = { {"BACKGROUND_COLOR", VDP_VIDEO_MIXER_ATTRIBUTE_BACKGROUND_COLOR,DT_NONE}, {"CSC_MATRIX", VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX,DT_NONE}, {"NOISE_REDUCTION_LEVEL", VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL,DT_FLOAT}, {"SHARPNESS_LEVEL", VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL,DT_FLOAT}, {"LUMA_KEY_MIN_LUMA", VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MIN_LUMA,DT_NONE}, {"LUMA_KEY_MAX_LUMA", VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA,DT_NONE}, }; static const size_t mixer_attributes_count = sizeof(mixer_attributes)/sizeof(Desc); VdpStatus ret; int x, count = 0; GtkWidget *vbox, *hbox; GtkWidget *table; GtkWidget *label, *hseparator; GtkWidget *eventbox; GtkWidget *scrollWin, *event; if (VDPAUDeviceFunctions.VideoMixerQueryFeatureSupport == NULL) { return -1; } /* Add Video mixer information */ vbox = gtk_vbox_new(FALSE, 0); label = gtk_label_new("Video Mixer:"); eventbox = gtk_event_box_new(); ctk_force_text_colors_on_widget(eventbox); gtk_container_add(GTK_CONTAINER(eventbox), label); ctk_config_set_tooltip(ctk_vdpau->ctk_config, eventbox, __video_mixer_help); scrollWin = gtk_scrolled_window_new(NULL, NULL); hbox = gtk_hbox_new(FALSE, 0); event = gtk_event_box_new(); ctk_force_text_colors_on_widget(event); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollWin), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); gtk_container_add(GTK_CONTAINER(event), hbox); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollWin), event); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5); gtk_widget_set_size_request(scrollWin, -1, 50); /* Add tab to notebook */ gtk_notebook_append_page(GTK_NOTEBOOK(ctk_vdpau->notebook), scrollWin, gtk_label_new("Video Mixer")); /* Generate a new table */ table = gtk_table_new(2, 5, FALSE); ctk_force_text_colors_on_widget(table); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); label = gtk_label_new("Feature Name"); eventbox = gtk_event_box_new(); ctk_force_text_colors_on_widget(eventbox); gtk_container_add(GTK_CONTAINER(eventbox), label); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), eventbox, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); ctk_config_set_tooltip(ctk_vdpau->ctk_config, eventbox, __video_mixer_feature_help); label = gtk_label_new("Supported"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); ctk_config_set_tooltip(ctk_vdpau->ctk_config, eventbox, __video_mixer_attribute_help); /* separator between heading and data */ hseparator = gtk_hseparator_new(); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 5, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0); /* fill Mixer feature data */ for (x = 0; x < mixer_features_count; x++) { gchar *str = NULL; /* There seems to be a bug in VideoMixerQueryFeatureSupport, * is_supported is only set if the feature is not supported */ VdpBool is_supported = TRUE; ret = VDPAUDeviceFunctions.VideoMixerQueryFeatureSupport (device, mixer_features[x].id, &is_supported); is_supported = (ret == VDP_STATUS_OK && is_supported); gtk_table_resize(GTK_TABLE(table), count+4, 5); str = g_strdup_printf("%s", mixer_features[x].name); label = gtk_label_new(str); g_free(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, count+3, count+4, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); str = g_strdup_printf("%c", is_supported?'y':'-'); label = gtk_label_new(str); g_free(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, count+3, count+4, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); count++; } if (VDPAUDeviceFunctions.VideoMixerQueryParameterSupport == NULL) { return -1; } /* Generate a new table */ count = 0; table = gtk_table_new(2, 5, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); label = gtk_label_new("Parameter Name"); eventbox = gtk_event_box_new(); ctk_force_text_colors_on_widget(eventbox); gtk_container_add(GTK_CONTAINER(eventbox), label); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), eventbox, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); ctk_config_set_tooltip(ctk_vdpau->ctk_config, eventbox, __video_mixer_parameter_help); label = gtk_label_new("Supported"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Min"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 2, 3, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Max"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 3, 4, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); /* separator between heading and data */ hseparator = gtk_hseparator_new(); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 5, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0); /* fill the Mixer parameter data */ for (x = 0; x < mixer_parameters_count; x++) { uint32_t minval, maxval; VdpBool is_supported = FALSE; gchar *str = NULL; ret = VDPAUDeviceFunctions.VideoMixerQueryParameterSupport (device, mixer_parameters[x].id, &is_supported); is_supported = (ret == VDP_STATUS_OK && is_supported); gtk_table_resize(GTK_TABLE(table), count+4, 5); str = g_strdup_printf("%s", mixer_parameters[x].name); label = gtk_label_new(str); g_free(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, count+3, count+4, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); str = g_strdup_printf("%c", is_supported?'y':'-'); label = gtk_label_new(str); g_free(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, count+3, count+4, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); count++; if (is_supported && mixer_parameters[x].aux != DT_NONE) { ret = VDPAUDeviceFunctions.VideoMixerQueryParameterValueRange (device, mixer_parameters[x].id, (void*)&minval, (void*)&maxval); display_range(GTK_TABLE(table), count-1, mixer_parameters[x].aux, minval, maxval); } } if (VDPAUDeviceFunctions.VideoMixerQueryAttributeSupport == NULL) { return -1; } /* Generate a new table */ count = 0; table = gtk_table_new(2, 5, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); label = gtk_label_new("Attribute Name"); eventbox = gtk_event_box_new(); ctk_force_text_colors_on_widget(eventbox); gtk_container_add(GTK_CONTAINER(eventbox), label); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), eventbox, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); ctk_config_set_tooltip(ctk_vdpau->ctk_config, eventbox, __video_mixer_attribute_help); label = gtk_label_new("Supported"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Min"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 2, 3, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Max"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 3, 4, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); /* separator between heading and data */ hseparator = gtk_hseparator_new(); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 5, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0); /* fill the Attributes data */ for (x = 0; x < mixer_attributes_count; x++) { VdpBool is_supported = FALSE; gchar *str = NULL; uint32_t minval, maxval; ret = VDPAUDeviceFunctions.VideoMixerQueryAttributeSupport (device, mixer_attributes[x].id, &is_supported); is_supported = (ret == VDP_STATUS_OK && is_supported); gtk_table_resize(GTK_TABLE(table), count+4, 5); str = g_strdup_printf("%s", mixer_attributes[x].name); label = gtk_label_new(str); g_free(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, count+3, count+4, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); str = g_strdup_printf("%c", is_supported?'y':'-'); label = gtk_label_new(str); g_free(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, count+3, count+4, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); count++; if (is_supported && mixer_attributes[x].aux != DT_NONE) { ret = VDPAUDeviceFunctions.VideoMixerQueryAttributeValueRange (device, mixer_attributes[x].id, (void*)&minval, (void*)&maxval); display_range(GTK_TABLE(table), count-1, mixer_attributes[x].aux, minval, maxval); } } return 0; } /* queryVideoMixer() */ GType ctk_vdpau_get_type(void) { static GType ctk_vdpau_type = 0; if (!ctk_vdpau_type) { static const GTypeInfo ctk_vdpau_info = { sizeof (CtkVDPAUClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* constructor */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkVDPAU), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_vdpau_type = g_type_register_static(GTK_TYPE_VBOX, "CtkVDPAU", &ctk_vdpau_info, 0); } return ctk_vdpau_type; } /* ctk_vdpau_get_type() */ GtkWidget* ctk_vdpau_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event) { GObject *object; CtkVDPAU *ctk_vdpau; GtkWidget *banner; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *vbox3; GtkWidget *notebook; GtkWidget *scrollWin; GtkWidget *event; /* For setting the background color to white */ void *vdpau_handle = NULL; VdpDevice device; VdpGetProcAddress *getProcAddress = NULL; VdpStatus ret; VdpDeviceCreateX11 *VDPAUDeviceCreateX11 = NULL; /* make sure we have a handle */ g_return_val_if_fail(handle != NULL, NULL); /* Create the ctk vdpau object */ object = g_object_new(CTK_TYPE_VDPAU, NULL); ctk_vdpau = CTK_VDPAU(object); /* Cache the attribute handle */ ctk_vdpau->handle = handle; /* Set container properties of the object */ ctk_vdpau->ctk_config = ctk_config; gtk_box_set_spacing(GTK_BOX(ctk_vdpau), 10); /* Image banner */ banner = ctk_banner_image_new(BANNER_ARTWORK_VDPAU); gtk_box_pack_start(GTK_BOX(ctk_vdpau), banner, FALSE, FALSE, 0); /* open VDPAU library */ vdpau_handle = dlopen("libvdpau.so.1", RTLD_NOW); if (!vdpau_handle) { goto fail; } VDPAUDeviceCreateX11 = dlsym(vdpau_handle, "vdp_device_create_x11"); if (!VDPAUDeviceCreateX11) { goto fail; } /* get device and ProcAddress */ ret = VDPAUDeviceCreateX11(NvCtrlGetDisplayPtr(handle), NvCtrlGetScreen(handle), &device, &getProcAddress); if ((ret != VDP_STATUS_OK) || !device || !getProcAddress) { goto fail; } getAddressVDPAUDeviceFunctions(device, getProcAddress); /* Return early if any function is NULL */ if (VDPAUDeviceFunctions.GetErrorString == NULL && VDPAUDeviceFunctions.GetProcAddress == NULL && VDPAUDeviceFunctions.GetApiVersion == NULL && VDPAUDeviceFunctions.GetInformationString == NULL && VDPAUDeviceFunctions.VideoSurfaceQueryCapabilities == NULL && VDPAUDeviceFunctions.VideoSurfaceQueryGetPutBitsYCbCrCapabilities == NULL && VDPAUDeviceFunctions.OutputSurfaceQueryCapabilities == NULL && VDPAUDeviceFunctions.OutputSurfaceQueryGetPutBitsNativeCapabilities == NULL && VDPAUDeviceFunctions.OutputSurfaceQueryPutBitsYCbCrCapabilities == NULL && VDPAUDeviceFunctions.BitmapSurfaceQueryCapabilities == NULL && VDPAUDeviceFunctions.DecoderQueryCapabilities == NULL && VDPAUDeviceFunctions.VideoMixerQueryFeatureSupport == NULL && VDPAUDeviceFunctions.VideoMixerQueryParameterSupport == NULL && VDPAUDeviceFunctions.VideoMixerQueryAttributeSupport == NULL && VDPAUDeviceFunctions.VideoMixerQueryParameterValueRange == NULL && VDPAUDeviceFunctions.VideoMixerQueryAttributeValueRange == NULL) { goto fail; } /* Information Scroll Box */ vbox3 = gtk_vbox_new(FALSE, 5); vbox = gtk_vbox_new(FALSE, 5); scrollWin = gtk_scrolled_window_new(NULL, NULL); hbox = gtk_hbox_new(FALSE, 0); event = gtk_event_box_new(); ctk_force_text_colors_on_widget(event); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollWin), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); gtk_container_add(GTK_CONTAINER(event), hbox); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollWin), event); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5); gtk_widget_set_size_request(scrollWin, -1, 50); gtk_box_pack_start(GTK_BOX(vbox3), scrollWin, TRUE, TRUE, 5); /* Create tabbed notebook for widget */ notebook = gtk_notebook_new(); gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP); gtk_box_pack_start(GTK_BOX(ctk_vdpau), notebook, TRUE, TRUE, 0); /* Create first tab for device info */ ctk_vdpau->notebook = notebook; /* Query and print VDPAU information */ queryBaseInfo(ctk_vdpau, device, getProcAddress); queryVideoSurface(ctk_vdpau, device, getProcAddress); queryDecoderCaps(ctk_vdpau, device, getProcAddress); queryVideoMixer(ctk_vdpau, device, getProcAddress); gtk_widget_show_all(GTK_WIDGET(object)); /* close the handle */ if (vdpau_handle) { dlclose(vdpau_handle); } return GTK_WIDGET(object); fail: if (vdpau_handle) { dlclose(vdpau_handle); } return NULL; } GtkTextBuffer *ctk_vdpau_create_help(GtkTextTagTable *table, CtkVDPAU *ctk_vdpau) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "VDPAU Information Help"); ctk_help_para(b, &i, "%s", __vdpau_information_label_help); ctk_help_heading(b, &i, "Base Information"); ctk_help_para(b, &i, "%s", __base_information_help); ctk_help_heading(b, &i, "API Version"); ctk_help_para(b, &i, "%s", __vdpau_api_version_help); ctk_help_heading(b, &i, "Supported Codecs"); ctk_help_para(b, &i, "%s", __supported_codecs_help); ctk_help_heading(b, &i, "Surface Limits"); ctk_help_para(b, &i, "%s", __surface_limits_help); ctk_help_heading(b, &i, "Video Surface"); ctk_help_para(b, &i, "%s", __video_surface_help); ctk_help_heading(b, &i, "Output Surface"); ctk_help_para(b, &i, "%s", __ouput_surface_help); ctk_help_heading(b, &i, "Bitmap Surface"); ctk_help_para(b, &i, "%s", __bitmap_surface_help); ctk_help_heading(b, &i, "Decoder Limits"); ctk_help_para(b, &i, "%s", __decoder_limits_help); ctk_help_heading(b, &i, "Video Mixer"); ctk_help_para(b, &i, "%s", __video_mixer_help); ctk_help_term(b, &i, "Feature"); ctk_help_para(b, &i, "%s", __video_mixer_feature_help); ctk_help_term(b, &i, "Parameter"); ctk_help_para(b, &i, "%s", __video_mixer_parameter_help); ctk_help_term(b, &i, "Attribute"); ctk_help_para(b, &i, "%s", __video_mixer_attribute_help); ctk_help_finish(b); return b; } nvidia-settings/src/gtk+-2.x/ctkmultisample.c0000664000175000017500000016645312236467170021317 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "NvCtrlAttributes.h" #include "ctkmultisample.h" #include "ctkconfig.h" #include "ctkhelp.h" #include "ctkbanner.h" /* local prototypes */ static void build_fsaa_translation_table(CtkMultisample *ctk_multisample, NVCTRLAttributeValidValuesRec valid); static int map_nv_ctrl_fsaa_value_to_slider(CtkMultisample *ctk_multisample, int value); static gchar *format_fsaa_value(GtkScale *scale, gdouble arg1, gpointer user_data); static GtkWidget *create_fsaa_setting_menu(CtkMultisample *ctk_multisample, CtkEvent *ctk_event, gboolean override, gboolean enhance); static void fsaa_setting_checkbox_toggled(GtkWidget *widget, gpointer user_data); static void fsaa_setting_menu_changed(GtkObject *object, gpointer user_data); static void fsaa_setting_update_received(GtkObject *object, gpointer arg1, gpointer user_data); static void post_fsaa_value_changed(CtkMultisample *ctk_multisample, gint val); static void fsaa_value_changed(GtkRange *range, gpointer user_data); static void fsaa_update_received(GtkObject *object, gpointer arg1, gpointer user_data); static void fxaa_checkbox_toggled(GtkWidget *widget, gpointer user_data); static void fxaa_update_received(GtkObject *object, gpointer arg1, gpointer user_data); static void post_fxaa_toggled(CtkMultisample *ctk_multisample, gboolean enable); static void post_log_aniso_app_override_toggled(CtkMultisample *ctk_multisample, gboolean override); static void log_aniso_app_override_toggled(GtkWidget *widget, gpointer user_data); static void log_app_override_update_received(GtkObject *object, gpointer arg1, gpointer user_data); static const gchar *get_log_aniso_name(gint val); static gchar *format_log_aniso_value(GtkScale *scale, gdouble arg1, gpointer user_data); static void post_log_aniso_value_changed(CtkMultisample *ctk_multisample, gint val); static void log_aniso_value_changed(GtkRange *range, gpointer user_data); static void log_aniso_range_update_received(GtkObject *object, gpointer arg1, gpointer user_data); static void post_texture_sharpening_toggled(CtkMultisample *ctk_multisample, gboolean enabled); static void texture_sharpening_toggled(GtkWidget *widget, gpointer user_data); static void texture_sharpening_update_received(GtkObject *object, gpointer arg1, gpointer user_data); static void update_fxaa_from_fsaa_change(CtkMultisample *ctk_multisample, int fsaa_value); static void update_fsaa_from_fxaa_change(CtkMultisample *ctk_multisample, gboolean fxaa_enabled); static gchar *applicationSettings[] = { "Use Application Settings", "Override Application Settings", "Enhance Application Settings" }; static const char *__aa_override_app_help = "Enable the Antialiasing \"Override Application Setting\" " "checkbox to make the antialiasing slider active and " "override any application antialiasing setting with the " "value of the slider."; static const char *__aa_menu_help = "The Application Antialiasing Settings Menu allows the antialiasing " "setting of OpenGL applications to be overridden with the value of " "the slider."; static const char *__aa_slider_help = "The Antialiasing slider controls the level of antialiasing. Using " "antialiasing disables FXAA."; static const char *__aniso_override_app_help = "Enable the Anisotropic Filtering \"Override Application Setting\" " "checkbox to make the anisotropic filtering slider " "active and override any application anisotropic " "filtering setting with the value of the slider."; static const char *__aniso_slider_help = "The Anisotropic Filtering slider controls the " "level of automatic anisotropic texture filtering."; static const char *__fxaa_enable_help = "Enable Fast Approximate Anti-Aliasing. This option is applied to " "OpenGL applications that are started after this option is set. Enabling " "FXAA disables triple buffering, antialiasing, and other antialiasing " "setting methods."; static const char *__texture_sharpening_help = "To improve image quality, select this option " "to sharpen textures when running OpenGL applications " "with antialiasing enabled."; /* * bits indicating which attributes require documenting in the online * help */ #define __FSAA_NONE (1 << NV_CTRL_FSAA_MODE_NONE) #define __FSAA_2x (1 << NV_CTRL_FSAA_MODE_2x) #define __FSAA_2x_5t (1 << NV_CTRL_FSAA_MODE_2x_5t) #define __FSAA_15x15 (1 << NV_CTRL_FSAA_MODE_15x15) #define __FSAA_2x2 (1 << NV_CTRL_FSAA_MODE_2x2) #define __FSAA_4x (1 << NV_CTRL_FSAA_MODE_4x) #define __FSAA_4x_9t (1 << NV_CTRL_FSAA_MODE_4x_9t) #define __FSAA_8x (1 << NV_CTRL_FSAA_MODE_8x) #define __FSAA_16x (1 << NV_CTRL_FSAA_MODE_16x) #define __FSAA_8xS (1 << NV_CTRL_FSAA_MODE_8xS) #define __FSAA_8xQ (1 << NV_CTRL_FSAA_MODE_8xQ) #define __FSAA_16xS (1 << NV_CTRL_FSAA_MODE_16xS) #define __FSAA_16xQ (1 << NV_CTRL_FSAA_MODE_16xQ) #define __FSAA_32xS (1 << NV_CTRL_FSAA_MODE_32xS) #define __FSAA_32x (1 << NV_CTRL_FSAA_MODE_32x) #define __FSAA_64xS (1 << NV_CTRL_FSAA_MODE_64xS) #define __FSAA (1 << (NV_CTRL_FSAA_MODE_MAX + 1)) #define __FSAA_ENHANCE (1 << (NV_CTRL_FSAA_MODE_MAX + 2)) #define __FXAA (1 << (NV_CTRL_FSAA_MODE_MAX + 3)) #define __LOG_ANISO_RANGE (1 << (NV_CTRL_FSAA_MODE_MAX + 4)) #define __TEXTURE_SHARPEN (1 << (NV_CTRL_FSAA_MODE_MAX + 5)) #define FRAME_PADDING 5 GType ctk_multisample_get_type( void ) { static GType ctk_multisample_type = 0; if (!ctk_multisample_type) { static const GTypeInfo ctk_multisample_info = { sizeof (CtkMultisampleClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkMultisample), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_multisample_type = g_type_register_static(GTK_TYPE_VBOX, "CtkMultisample", &ctk_multisample_info, 0); } return ctk_multisample_type; } /* * ctk_multisample_new() - constructor for the Multisample widget */ GtkWidget *ctk_multisample_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event) { GObject *object; CtkMultisample *ctk_multisample; GtkWidget *hbox, *vbox = NULL; GtkWidget *banner; GtkWidget *frame; GtkWidget *check_button; GtkWidget *menu; GtkWidget *scale; GtkObject *adjustment; gint min, max; gint val, app_control, override, enhance, mode, i; NVCTRLAttributeValidValuesRec valid; ReturnStatus ret, ret0; /* create the new object */ object = g_object_new(CTK_TYPE_MULTISAMPLE, NULL); ctk_multisample = CTK_MULTISAMPLE(object); ctk_multisample->handle = handle; ctk_multisample->ctk_config = ctk_config; ctk_multisample->active_attributes = 0; gtk_box_set_spacing(GTK_BOX(object), 10); /* banner */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, FALSE, 0); banner = ctk_banner_image_new(BANNER_ARTWORK_ANTIALIAS); gtk_box_pack_start(GTK_BOX(hbox), banner, TRUE, TRUE, 0); /* FSAA slider */ ret = NvCtrlGetValidAttributeValues(handle, NV_CTRL_FSAA_MODE, &valid); if (ret == NvCtrlSuccess) { build_fsaa_translation_table(ctk_multisample, valid); ret = NvCtrlGetAttribute(handle, NV_CTRL_FSAA_MODE, &mode); val = map_nv_ctrl_fsaa_value_to_slider(ctk_multisample, mode); ret0 = NvCtrlGetAttribute(handle, NV_CTRL_FSAA_APPLICATION_CONTROLLED, &app_control); /* * The NV-CONTROL extension works in terms of whether the * application controls FSAA, but we invert the logic so that * we expose a checkbox to allow nvidia-settings to override * the application's setting. */ override = !app_control; if ((ret == NvCtrlSuccess) && (ret0 == NvCtrlSuccess) && (ctk_multisample->fsaa_translation_table_size > 1)) { /* create "Antialiasing Settings" frame */ frame = gtk_frame_new("Antialiasing Settings"); gtk_box_pack_start(GTK_BOX(object), frame, FALSE, FALSE, 0); /* create the vbox to store the widgets inside the frame */ vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), FRAME_PADDING); gtk_container_add(GTK_CONTAINER(frame), vbox); /* "Application Setting" widget */ ret = NvCtrlGetAttribute(ctk_multisample->handle, NV_CTRL_FSAA_APPLICATION_ENHANCED, &enhance); if (ret == NvCtrlSuccess) { /* Create a menu */ ctk_multisample->active_attributes |= __FSAA_ENHANCE; menu = create_fsaa_setting_menu(ctk_multisample, ctk_event, override, enhance); ctk_multisample->fsaa_menu = menu; hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), menu, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); } else { /* Create a checkbox */ check_button = gtk_check_button_new_with_label ("Override Application Setting"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), override); g_signal_connect(G_OBJECT(check_button), "toggled", G_CALLBACK(fsaa_setting_checkbox_toggled), (gpointer) ctk_multisample); ctk_config_set_tooltip(ctk_config, check_button, __aa_override_app_help); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 0); ctk_multisample->fsaa_app_override_check_button = check_button; } g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME (NV_CTRL_FSAA_APPLICATION_CONTROLLED), G_CALLBACK(fsaa_setting_update_received), (gpointer) ctk_multisample); /* Antialiasing scale */ min = 0; max = ctk_multisample->fsaa_translation_table_size - 1; /* create the slider */ adjustment = gtk_adjustment_new(val, min, max, 1, 1, 0.0); scale = gtk_hscale_new(GTK_ADJUSTMENT(adjustment)); gtk_adjustment_set_value(GTK_ADJUSTMENT(adjustment), val); gtk_scale_set_draw_value(GTK_SCALE(scale), TRUE); gtk_scale_set_value_pos(GTK_SCALE(scale), GTK_POS_TOP); gtk_box_pack_start(GTK_BOX(vbox), scale, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(scale), "format-value", G_CALLBACK(format_fsaa_value), (gpointer) ctk_multisample); g_signal_connect(G_OBJECT(scale), "value-changed", G_CALLBACK(fsaa_value_changed), (gpointer) ctk_multisample); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_FSAA_MODE), G_CALLBACK(fsaa_update_received), (gpointer) ctk_multisample); ctk_config_set_tooltip(ctk_config, scale, __aa_slider_help); ctk_multisample->active_attributes |= __FSAA; ctk_multisample->fsaa_scale = scale; gtk_widget_set_sensitive(GTK_WIDGET(ctk_multisample->fsaa_scale), override); for (i = 0; i < ctk_multisample->fsaa_translation_table_size; i++) ctk_multisample->active_attributes |= (1 << ctk_multisample->fsaa_translation_table[i]); /* FXAA Option button */ check_button = gtk_check_button_new_with_label("Enable FXAA"); if (mode == NV_CTRL_FSAA_MODE_NONE) { ret = NvCtrlGetAttribute(handle, NV_CTRL_FXAA, &val); if (val == NV_CTRL_FXAA_ENABLE) { gtk_widget_set_sensitive(GTK_WIDGET(scale), FALSE); } } else { val = NV_CTRL_FXAA_DISABLE; } gtk_widget_set_sensitive(GTK_WIDGET(check_button), (mode == NV_CTRL_FSAA_MODE_NONE)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), val); g_signal_connect(G_OBJECT(check_button), "toggled", G_CALLBACK(fxaa_checkbox_toggled), (gpointer) ctk_multisample); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_FXAA), G_CALLBACK(fxaa_update_received), (gpointer) ctk_multisample); ctk_config_set_tooltip(ctk_config, check_button, __fxaa_enable_help); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 0); ctk_multisample->active_attributes |= __FXAA; ctk_multisample->fxaa_enable_check_button = check_button; } } /* Anisotropic filtering slider */ ret = NvCtrlGetValidAttributeValues(handle, NV_CTRL_LOG_ANISO, &valid); ctk_multisample->log_aniso_scale = NULL; if (ret == NvCtrlSuccess) { ret = NvCtrlGetAttribute(handle, NV_CTRL_LOG_ANISO, &val); ret0 = NvCtrlGetAttribute(handle, NV_CTRL_LOG_ANISO_APPLICATION_CONTROLLED, &app_control); /* * The NV-CONTROL extension works in terms of whether the * application controls LOG_ANISO, but we invert the logic so * that we expose a checkbox to allow nvidia-settings to * override the application's setting. */ override = !app_control; if ((ret == NvCtrlSuccess) && (ret0 == NvCtrlSuccess) && (valid.type == ATTRIBUTE_TYPE_RANGE)) { /* create "Anisotropic Filtering" frame */ frame = gtk_frame_new("Anisotropic Filtering"); gtk_box_pack_start(GTK_BOX(object), frame, FALSE, FALSE, 0); /* create the vbox to store the widgets inside the frame */ vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), FRAME_PADDING); gtk_container_add(GTK_CONTAINER(frame), vbox); /* "Override Application Setting" checkbox */ check_button = gtk_check_button_new_with_label ("Override Application Setting"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), override); g_signal_connect(G_OBJECT(check_button), "toggled", G_CALLBACK(log_aniso_app_override_toggled), (gpointer) ctk_multisample); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME (NV_CTRL_LOG_ANISO_APPLICATION_CONTROLLED), G_CALLBACK(log_app_override_update_received), (gpointer) ctk_multisample); ctk_config_set_tooltip(ctk_config, check_button, __aniso_override_app_help); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 0); ctk_multisample->log_aniso_app_override_check_button =check_button; /* Aniso scale */ min = valid.u.range.min; max = valid.u.range.max; /* create the slider */ adjustment = gtk_adjustment_new(val, min, max, 1, 1, 0.0); scale = gtk_hscale_new(GTK_ADJUSTMENT(adjustment)); gtk_adjustment_set_value(GTK_ADJUSTMENT(adjustment), val); gtk_scale_set_draw_value(GTK_SCALE(scale), TRUE); gtk_scale_set_value_pos(GTK_SCALE(scale), GTK_POS_TOP); gtk_box_pack_start(GTK_BOX(vbox), scale, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(scale), "format-value", G_CALLBACK(format_log_aniso_value), (gpointer) ctk_multisample); g_signal_connect(G_OBJECT(scale), "value-changed", G_CALLBACK(log_aniso_value_changed), (gpointer) ctk_multisample); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_LOG_ANISO), G_CALLBACK(log_aniso_range_update_received), (gpointer) ctk_multisample); ctk_config_set_tooltip(ctk_config, scale, __aniso_slider_help); ctk_multisample->active_attributes |= __LOG_ANISO_RANGE; ctk_multisample->log_aniso_scale = scale; gtk_widget_set_sensitive(GTK_WIDGET(scale), override); } } /* * Texture sharpen * * If one of the supported multisample modes was enabled by the * user, this check button controls texture sharpening. */ ret = NvCtrlGetAttribute(handle, NV_CTRL_TEXTURE_SHARPEN, &val); if (ret == NvCtrlSuccess) { /* create "TextureSharpening" frame */ frame = gtk_frame_new("Texture Quality"); gtk_box_pack_start(GTK_BOX(object), frame, FALSE, FALSE, 0); /* create the vbox to store the widgets inside the frame */ vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), FRAME_PADDING); gtk_container_add(GTK_CONTAINER(frame), vbox); /* "Texture Sharpening" checkbox */ check_button = gtk_check_button_new_with_label("Texture Sharpening"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), val); gtk_box_pack_start(GTK_BOX(vbox), check_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(check_button), "toggled", G_CALLBACK(texture_sharpening_toggled), (gpointer) ctk_multisample); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_TEXTURE_SHARPEN), G_CALLBACK(texture_sharpening_update_received), (gpointer) ctk_multisample); ctk_config_set_tooltip(ctk_config, check_button, __texture_sharpening_help); ctk_multisample->active_attributes |= __TEXTURE_SHARPEN; ctk_multisample->texture_sharpening_button = check_button; } /* if nothing is available, teardown this object and return NULL */ if (!ctk_multisample->active_attributes) { /* XXX how to teardown? */ return NULL; } gtk_widget_show_all(GTK_WIDGET(object)); return GTK_WIDGET(object); } /* ctk_multisample_new() */ /* * build_fsaa_translation_table() - given the ValidValues rec for the * FSAA_MODE attribute, scan through the bits.ints field (which has * bits set to indicate which integer attributes are valid for the * attribute), assigning fsaa_translation_table[] as appropriate. * fsaa_translation_table[] will map from slider value to * NV_CTRL_FSAA_MODE value. */ static void build_fsaa_translation_table(CtkMultisample *ctk_multisample, NVCTRLAttributeValidValuesRec valid) { gint i, n = 0; gint index_8xs = -1; gint index_16x = -1; gint index_32x = -1; gint index_32xs = -1; gint mask = valid.u.bits.ints; ctk_multisample->fsaa_translation_table_size = 0; memset(ctk_multisample->fsaa_translation_table, 0, sizeof(gint) * (NV_CTRL_FSAA_MODE_MAX + 1)); if (valid.type != ATTRIBUTE_TYPE_INT_BITS) return; for (i = 0; i <= NV_CTRL_FSAA_MODE_MAX; i++) { if (mask & (1 << i)) { ctk_multisample->fsaa_translation_table[n] = i; /* index_8xs and index_16x are needed below */ if (i == NV_CTRL_FSAA_MODE_8xS) index_8xs = n; if (i == NV_CTRL_FSAA_MODE_16x) index_16x = n; if (i == NV_CTRL_FSAA_MODE_32x) index_32x = n; if (i == NV_CTRL_FSAA_MODE_32xS) index_32xs = n; n++; } } /* * XXX 8xS was added to the NV_CTRL_FSAA_MODE list after 16x, but should * appear before it in the slider. Same with 32x and 32xS. If both were * added to the fsaa_translation_table[], then re-order them appropriately. */ if ((index_8xs != -1) && (index_16x != -1)) { ctk_multisample->fsaa_translation_table[index_8xs] = NV_CTRL_FSAA_MODE_16x; ctk_multisample->fsaa_translation_table[index_16x] = NV_CTRL_FSAA_MODE_8xS; } if ((index_32x != -1) && (index_32xs != -1)) { ctk_multisample->fsaa_translation_table[index_32x] = NV_CTRL_FSAA_MODE_32xS; ctk_multisample->fsaa_translation_table[index_32xs] = NV_CTRL_FSAA_MODE_32x; } ctk_multisample->fsaa_translation_table_size = n; } /* build_fsaa_translation_table() */ /* * map_nv_ctrl_fsaa_value_to_slider() - given an NV_CTRL_FSAA_MODE_* * value, map that to a slider value. There is no good way to do * this, so just scan the lookup table for the NV_CTRL value and * return the table index. */ static int map_nv_ctrl_fsaa_value_to_slider(CtkMultisample *ctk_multisample, int value) { int i; for (i = 0; i < ctk_multisample->fsaa_translation_table_size; i++) { if (ctk_multisample->fsaa_translation_table[i] == value) return i; } return 0; } /* map_nv_ctrl_fsaa_value_to_slider() */ /* * format_fsaa_value() - callback for the "format-value" signal from * the fsaa scale; return a string describing the current value of the * scale. */ static gchar *format_fsaa_value(GtkScale *scale, gdouble arg1, gpointer user_data) { CtkMultisample *ctk_multisample; gint val; ctk_multisample = CTK_MULTISAMPLE(user_data); val = arg1; if (val > NV_CTRL_FSAA_MODE_MAX) val = NV_CTRL_FSAA_MODE_MAX; if (val < 0) val = 0; val = ctk_multisample->fsaa_translation_table[val]; return g_strdup(NvCtrlGetMultisampleModeName(val)); } /* format_fsaa_value() */ /* * create_fsaa_setting_menu() - Helper function that creates the * FSAA application control dropdown menu. */ static GtkWidget *create_fsaa_setting_menu(CtkMultisample *ctk_multisample, CtkEvent *ctk_event, gboolean override, gboolean enhance) { CtkDropDownMenu *d; gint idx, i; /* Create the menu */ d = (CtkDropDownMenu *) ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO); for (i = 0; i < ARRAY_LEN(applicationSettings); i++) { ctk_drop_down_menu_append_item(d, applicationSettings[i], i); } if (!override) { idx = 0; } else { if (!enhance) { idx = 1; } else { idx = 2; } } /* set the menu item */ ctk_drop_down_menu_set_current_value(d, idx); ctk_config_set_tooltip(ctk_multisample->ctk_config, d->menu, __aa_menu_help); g_signal_connect(G_OBJECT(d), "changed", G_CALLBACK(fsaa_setting_menu_changed), (gpointer) ctk_multisample); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME (NV_CTRL_FSAA_APPLICATION_ENHANCED), G_CALLBACK(fsaa_setting_update_received), (gpointer) ctk_multisample); return GTK_WIDGET(d); } /* create_fsaa_setting_menu() */ /* * post_fsaa_setting_changed() - helper function for update_fsaa_setting() * and fsaa_menu_update_received(); This does whatever work is necessary * after the dropdown/checkbox has changed -- update the slider's * sensitivity and post a statusbar message. */ static void post_fsaa_setting_changed(CtkMultisample *ctk_multisample, gboolean override, gboolean enhance) { GtkWidget *fxaa_checkbox = ctk_multisample->fxaa_enable_check_button; gboolean fxaa_value = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(fxaa_checkbox)); if (ctk_multisample->fsaa_scale) { gtk_widget_set_sensitive (GTK_WIDGET(ctk_multisample->fsaa_scale), (override && (fxaa_value == NV_CTRL_FXAA_DISABLE))); } ctk_config_statusbar_message(ctk_multisample->ctk_config, "%s Application's Antialiasing Settings.", (!override ? "Using" : (enhance ? "Enhancing" : "Overriding"))); } /* post_fsaa_setting_changed() */ /* * update_fsaa_setting() - Helper function for updating the server when the * user changes the Application's Antialiasing settings. * */ static void update_fsaa_setting(CtkMultisample *ctk_multisample, gboolean override, gboolean enhance) { GtkRange *range = GTK_RANGE(ctk_multisample->fsaa_scale); NvCtrlSetAttribute(ctk_multisample->handle, NV_CTRL_FSAA_APPLICATION_CONTROLLED, !override); if (ctk_multisample->active_attributes & __FSAA_ENHANCE) { NvCtrlSetAttribute(ctk_multisample->handle, NV_CTRL_FSAA_APPLICATION_ENHANCED, enhance); } if (!override) { NvCtrlSetAttribute(ctk_multisample->handle, NV_CTRL_FSAA_MODE, NV_CTRL_FSAA_MODE_NONE); g_signal_handlers_block_by_func(G_OBJECT(range), G_CALLBACK(fsaa_value_changed), (gpointer) ctk_multisample); gtk_range_set_value(range, NV_CTRL_FSAA_MODE_NONE); g_signal_handlers_unblock_by_func(G_OBJECT(range), G_CALLBACK(fsaa_value_changed), (gpointer) ctk_multisample); update_fxaa_from_fsaa_change(ctk_multisample, NV_CTRL_FSAA_MODE_NONE); } post_fsaa_setting_changed(ctk_multisample, override, enhance); } /* update_fsaa_setting() */ /* * fsaa_setting_checkbox_toggled() - called when the FSAA Application * checkbox is changed; update the server and set the sensitivity of * the fsaa slider. */ static void fsaa_setting_checkbox_toggled(GtkWidget *widget, gpointer user_data) { CtkMultisample *ctk_multisample = CTK_MULTISAMPLE(user_data); gboolean override; override = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); update_fsaa_setting(ctk_multisample, override, FALSE /* enhance */ ); } /* fsaa_setting_checkbox_toggled() */ /* * fsaa_setting_menu_changed() - called when the FSAA Application * menu is changed; update the server and set the sensitivity of * the fsaa slider. */ static void fsaa_setting_menu_changed(GtkObject *object, gpointer user_data) { CtkMultisample *ctk_multisample = CTK_MULTISAMPLE(user_data); gint idx; gboolean override; gboolean enhance; CTK_DROP_DOWN_MENU(ctk_multisample->fsaa_menu)->current_selected_item_widget = GTK_WIDGET(object); idx = ctk_drop_down_menu_get_current_value (CTK_DROP_DOWN_MENU(ctk_multisample->fsaa_menu)); /* The FSAA dropdown menu is setup this way: * * 0 == app * 1 == override * 2 == enhance */ override = (idx > 0); enhance = (idx == 2); update_fsaa_setting(ctk_multisample, override, enhance); } /* fsaa_setting_menu_changed() */ /* * fsaa_setting_update_received() - callback function for when the * NV_CTRL_FSAA_APPLICATION_CONTROLLED/ENHANCE attribute is changed by another * NV-CONTROL client. */ static void fsaa_setting_update_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct = (CtkEventStruct *) arg1; CtkMultisample *ctk_multisample = CTK_MULTISAMPLE(user_data); gint idx; gboolean override; gboolean enhance = FALSE; gint val; ReturnStatus ret; switch (event_struct->attribute) { case NV_CTRL_FSAA_APPLICATION_CONTROLLED: override = !event_struct->value; if (!override) { idx = 0; } else if (ctk_multisample->active_attributes & __FSAA_ENHANCE) { ret = NvCtrlGetAttribute(ctk_multisample->handle, NV_CTRL_FSAA_APPLICATION_ENHANCED, &val); if (ret == NvCtrlSuccess) { enhance = val; idx = enhance ? 2 : 1; } else { enhance = FALSE; idx = 0; } } else { idx = 1; } break; case NV_CTRL_FSAA_APPLICATION_ENHANCED: enhance = event_struct->value; ret = NvCtrlGetAttribute(ctk_multisample->handle, NV_CTRL_FSAA_APPLICATION_CONTROLLED, &val); if (ret == NvCtrlSuccess) { override = !val; /* = !app_controlled */ } else { override = FALSE; } if (override) { idx = enhance ? 2 : 1; } else { idx = 0; } break; default: return; } if (ctk_multisample->fsaa_menu) { /* Update the dropdown menu */ GtkWidget *menu = ctk_multisample->fsaa_menu; g_signal_handlers_block_by_func (G_OBJECT(menu), G_CALLBACK(fsaa_setting_menu_changed), (gpointer) ctk_multisample); ctk_drop_down_menu_set_current_value (CTK_DROP_DOWN_MENU(ctk_multisample->fsaa_menu), idx); g_signal_handlers_unblock_by_func (G_OBJECT(menu), G_CALLBACK(fsaa_setting_menu_changed), (gpointer) ctk_multisample); } else { /* Update the checkbox */ GtkWidget *button = ctk_multisample->fsaa_app_override_check_button; g_signal_handlers_block_by_func (G_OBJECT(button), G_CALLBACK(fsaa_setting_checkbox_toggled), (gpointer) ctk_multisample); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), override); g_signal_handlers_unblock_by_func (G_OBJECT(button), G_CALLBACK(fsaa_setting_checkbox_toggled), (gpointer) ctk_multisample); } post_fsaa_setting_changed(ctk_multisample, override, enhance); } /* fsaa_setting_update_received() */ /* * post_fsaa_value_changed() - helper function for * fsaa_value_changed() and fsaa_update_received(); this does whatever * work is necessary after the fsaa value is changed -- currently just * post a statusbar message. */ static void post_fsaa_value_changed(CtkMultisample *ctk_multisample, gint val) { ctk_config_statusbar_message(ctk_multisample->ctk_config, "Antialiasing set to %s.", NvCtrlGetMultisampleModeName(val)); } /* post_fsaa_value_changed() */ /* * update_fxaa_from_fsaa_change - helper function for changes to fsaa in order * to update fxaa and enable/disable fxaa or fsaa widgets based on the new * value of fsaa. */ static void update_fxaa_from_fsaa_change(CtkMultisample *ctk_multisample, int fsaa_value) { GtkRange *fsaa_range = GTK_RANGE(ctk_multisample->fsaa_scale); GtkWidget *fsaa_menu = ctk_multisample->fsaa_menu; GtkWidget *fxaa_checkbox = ctk_multisample->fxaa_enable_check_button; gboolean fxaa_value; /* The FSAA dropdown menu is: 0 == app, 1 == override, 2 == enhance */ gint fsaa_idx = CTK_DROP_DOWN_MENU(fsaa_menu)->current_selected_item; if (fsaa_value != NV_CTRL_FSAA_MODE_NONE) { g_signal_handlers_block_by_func(G_OBJECT(fxaa_checkbox), G_CALLBACK(fxaa_checkbox_toggled), (gpointer) ctk_multisample); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fxaa_checkbox), FALSE); g_signal_handlers_unblock_by_func(G_OBJECT(fxaa_checkbox), G_CALLBACK(fxaa_checkbox_toggled), (gpointer) ctk_multisample); } fxaa_value = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(fxaa_checkbox)); gtk_widget_set_sensitive(GTK_WIDGET(fsaa_range), (fsaa_idx != 0) && // not app controlled (fxaa_value == NV_CTRL_FXAA_DISABLE)); gtk_widget_set_sensitive(GTK_WIDGET(fxaa_checkbox), fsaa_value == NV_CTRL_FSAA_MODE_NONE); } /* update_fxaa_from_fsaa_change() */ /* * update_fsaa_from_fxaa_change - helper function for changes to fxaa in order * to update fsaa and enable/disable fxaa or fsaa widgets based on the new * value of fxaa. */ static void update_fsaa_from_fxaa_change (CtkMultisample *ctk_multisample, gboolean fxaa_enabled) { GtkWidget *fxaa_checkbox = ctk_multisample->fxaa_enable_check_button; GtkRange *fsaa_range = GTK_RANGE(ctk_multisample->fsaa_scale); gint fsaa_value_none = map_nv_ctrl_fsaa_value_to_slider(ctk_multisample, 0); GtkWidget *fsaa_menu = ctk_multisample->fsaa_menu; /* The FSAA dropdown menu is: 0 == app, 1 == override, 2 == enhance */ gint fsaa_idx = CTK_DROP_DOWN_MENU(fsaa_menu)->current_selected_item; gint fsaa_val; if (fxaa_enabled == NV_CTRL_FXAA_ENABLE) { g_signal_handlers_block_by_func(G_OBJECT(fsaa_range), G_CALLBACK(fsaa_value_changed), (gpointer) ctk_multisample); gtk_range_set_value(fsaa_range, fsaa_value_none); g_signal_handlers_unblock_by_func(G_OBJECT(fsaa_range), G_CALLBACK(fsaa_value_changed), (gpointer) ctk_multisample); } fsaa_val = gtk_range_get_value(fsaa_range); if (fsaa_val > NV_CTRL_FSAA_MODE_MAX) fsaa_val = NV_CTRL_FSAA_MODE_MAX; if (fsaa_val < 0) fsaa_val = 0; fsaa_val = ctk_multisample->fsaa_translation_table[fsaa_val]; gtk_widget_set_sensitive(GTK_WIDGET(fxaa_checkbox), (fxaa_enabled == NV_CTRL_FXAA_ENABLE) || (fsaa_val == NV_CTRL_FSAA_MODE_NONE)); gtk_widget_set_sensitive(GTK_WIDGET(fsaa_range), (fsaa_idx != 0) && // not app controlled (fxaa_enabled == NV_CTRL_FXAA_DISABLE)); } /* update_fsaa_from_fxaa_change */ /* * fsaa_value_changed() - callback for the "value-changed" signal from * fsaa scale. */ static void fsaa_value_changed(GtkRange *range, gpointer user_data) { CtkMultisample *ctk_multisample; gint val; ctk_multisample = CTK_MULTISAMPLE(user_data); val = gtk_range_get_value(range); if (val > NV_CTRL_FSAA_MODE_MAX) val = NV_CTRL_FSAA_MODE_MAX; if (val < 0) val = 0; val = ctk_multisample->fsaa_translation_table[val]; NvCtrlSetAttribute(ctk_multisample->handle, NV_CTRL_FSAA_MODE, val); update_fxaa_from_fsaa_change(ctk_multisample, val); post_fsaa_value_changed(ctk_multisample, val); } /* fsaa_value_changed() */ /* * fxaa_checkbox_toggled - callback for a change to * the FXAA settings in the control panel */ static void fxaa_checkbox_toggled(GtkWidget *widget, gpointer user_data) { CtkMultisample *ctk_multisample = CTK_MULTISAMPLE(user_data); gboolean enabled; enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); NvCtrlSetAttribute(ctk_multisample->handle, NV_CTRL_FXAA, enabled); update_fsaa_from_fxaa_change(ctk_multisample, enabled); post_fxaa_toggled(ctk_multisample, enabled); } /* fxaa_checkbox_toggled */ /* * fxaa_update_received() - callback function for when the * NV_CTRL_FXAA attribute is changed by another NV-CONTROL * client. */ static void fxaa_update_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct = (CtkEventStruct *) arg1; CtkMultisample *ctk_multisample = CTK_MULTISAMPLE(user_data); gboolean fxaa_value = event_struct->value; GtkWidget *check_button = ctk_multisample->fxaa_enable_check_button; g_signal_handlers_block_by_func(G_OBJECT(check_button), G_CALLBACK(fxaa_checkbox_toggled), (gpointer) ctk_multisample); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), fxaa_value); update_fsaa_from_fxaa_change(ctk_multisample, fxaa_value); g_signal_handlers_unblock_by_func(G_OBJECT(check_button), G_CALLBACK(fxaa_checkbox_toggled), (gpointer) ctk_multisample); post_fxaa_toggled(ctk_multisample, fxaa_value); } /* fxaa_update_received() */ /* * post_fxaa_toggled() - helper function for fxaa_button_toggled() * and fxaa_update_received(); this does whatever work is necessary * after the app control check button has been toggled. */ static void post_fxaa_toggled(CtkMultisample *ctk_multisample, gboolean enable) { ctk_config_statusbar_message(ctk_multisample->ctk_config, "FXAA " "%s.", enable ? "enabled" : "disabled"); } /* post_fxaa_toggled() */ /* * fsaa_update_received() - callback function for when the * NV_CTRL_FSAA_MODE attribute is changed by another NV-CONTROL * client. */ static void fsaa_update_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct; CtkMultisample *ctk_multisample; GtkRange *range; gint val; event_struct = (CtkEventStruct *) arg1; ctk_multisample = CTK_MULTISAMPLE(user_data); range = GTK_RANGE(ctk_multisample->fsaa_scale); val = map_nv_ctrl_fsaa_value_to_slider(ctk_multisample, event_struct->value); g_signal_handlers_block_by_func(G_OBJECT(range), G_CALLBACK(fsaa_value_changed), (gpointer) ctk_multisample); gtk_range_set_value(range, val); update_fxaa_from_fsaa_change(ctk_multisample, event_struct->value); g_signal_handlers_unblock_by_func(G_OBJECT(range), G_CALLBACK(fsaa_value_changed), (gpointer) ctk_multisample); post_fsaa_value_changed(ctk_multisample, event_struct->value); } /* fsaa_update_received() */ /* * post_log_aniso_app_override_toggled() - helper function for * log_aniso_app_override_toggled() and * log_aniso_app_override_update_received(); this does whatever work is * necessary after the app control check button has been toggled -- * update the slider's sensitivity and post a statusbar message. */ static void post_log_aniso_app_override_toggled(CtkMultisample *ctk_multisample, gboolean override) { if (ctk_multisample->log_aniso_scale) { gtk_widget_set_sensitive (GTK_WIDGET(ctk_multisample->log_aniso_scale), override); } ctk_config_statusbar_message(ctk_multisample->ctk_config, "Application Anisotropic Filtering Override " "%s.", override ? "enabled" : "disabled"); } /* post_log_aniso_app_override_toggled() */ /* * log_aniso_app_override_toggled() - called when the LOG_ANISO * "Override Application Setting" check button is toggled; update the * server and set the sensitivity of the log_aniso slider. */ static void log_aniso_app_override_toggled(GtkWidget *widget, gpointer user_data) { CtkMultisample *ctk_multisample = CTK_MULTISAMPLE(user_data); GtkRange *range = GTK_RANGE(ctk_multisample->log_aniso_scale); gboolean override; override = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); NvCtrlSetAttribute(ctk_multisample->handle, NV_CTRL_LOG_ANISO_APPLICATION_CONTROLLED, !override); if (!override) { NvCtrlSetAttribute(ctk_multisample->handle, NV_CTRL_LOG_ANISO, 0 /* default(?) */); g_signal_handlers_block_by_func(G_OBJECT(range), G_CALLBACK(log_aniso_value_changed), (gpointer) ctk_multisample); gtk_range_set_value(range, 0); g_signal_handlers_unblock_by_func(G_OBJECT(range), G_CALLBACK(log_aniso_value_changed), (gpointer) ctk_multisample); } post_log_aniso_app_override_toggled(ctk_multisample, override); } /* log_aniso_app_override_toggled() */ /* * log_app_override_update_received() - callback function for when the * NV_CTRL_LOG_ANISO_APPLICATION_CONTROLLED attribute is changed by * another NV-CONTROL client. */ static void log_app_override_update_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct = (CtkEventStruct *) arg1; CtkMultisample *ctk_multisample = CTK_MULTISAMPLE(user_data); gboolean override = !event_struct->value; GtkWidget *check_button; check_button = ctk_multisample->log_aniso_app_override_check_button; g_signal_handlers_block_by_func(G_OBJECT(check_button), G_CALLBACK(log_aniso_app_override_toggled), (gpointer) ctk_multisample); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), override); post_log_aniso_app_override_toggled(ctk_multisample, override); g_signal_handlers_unblock_by_func(G_OBJECT(check_button), G_CALLBACK (log_aniso_app_override_toggled), (gpointer) ctk_multisample); } /* log_app_override_update_received() */ /* * get_log_aniso_name() - translate a log_aniso integer value to an * aniso name. */ static const gchar *get_log_aniso_name(gint val) { static const gchar *log_aniso_names[] = { "1x", "2x", "4x", "8x", "16x" }; if ((val < 0) || (val > 4)) return "Unknown"; return log_aniso_names[val]; } /* get_log_aniso_name() */ /* * format_log_aniso_value() - callback for the "format-value" signal * from the log aniso scale. */ static gchar *format_log_aniso_value(GtkScale *scale, gdouble arg1, gpointer user_data) { return g_strdup(get_log_aniso_name(arg1)); } /* format_log_aniso_value() */ /* * post_log_aniso_value_changed() - helper function for * log_aniso_value_changed(); this does whatever work is necessary * after the log aniso value has changed -- currently just post a * statusbar message. */ static void post_log_aniso_value_changed(CtkMultisample *ctk_multisample, gint val) { ctk_config_statusbar_message(ctk_multisample->ctk_config, "Anisotropic Filtering set to %s.", get_log_aniso_name(val)); } /* post_log_aniso_value_changed() */ /* * log_aniso_value_changed() - callback for the "value-changed" signal * from the log aniso scale. */ static void log_aniso_value_changed(GtkRange *range, gpointer user_data) { CtkMultisample *ctk_multisample; gint val; ctk_multisample = CTK_MULTISAMPLE(user_data); val = gtk_range_get_value(range); NvCtrlSetAttribute(ctk_multisample->handle, NV_CTRL_LOG_ANISO, val); post_log_aniso_value_changed(ctk_multisample, val); } /* log_aniso_value_changed() */ /* * log_aniso_range_update_received() - callback function for when the * NV_CTRL_LOG_ANISO attribute is changed by another NV-CONTROL * client. */ static void log_aniso_range_update_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct; CtkMultisample *ctk_multisample; GtkRange *range; event_struct = (CtkEventStruct *) arg1; ctk_multisample = CTK_MULTISAMPLE(user_data); range = GTK_RANGE(ctk_multisample->log_aniso_scale); g_signal_handlers_block_by_func(G_OBJECT(range), G_CALLBACK(log_aniso_value_changed), (gpointer) ctk_multisample); gtk_range_set_value(range, event_struct->value); post_log_aniso_value_changed(ctk_multisample, event_struct->value); g_signal_handlers_unblock_by_func(G_OBJECT(range), G_CALLBACK(log_aniso_value_changed), (gpointer) ctk_multisample); } /* log_aniso_range_update_received() */ /* * post_texture_sharpening_toggled() - helper function for * texture_sharpening_toggled() and * texture_sharpening_update_received(); this does whatever work is * necessary after the texture sharpening button has been toggled -- * currently, just post a statusbar message. */ static void post_texture_sharpening_toggled(CtkMultisample *ctk_multisample, gboolean enabled) { ctk_config_statusbar_message(ctk_multisample->ctk_config, "Texture sharpening %s.", enabled ? "enabled" : "disabled"); } /* post_texture_sharpening_toggled() */ /* * texture_sharpening_toggled() - callback for the "toggled" signal * from the texture sharpening check button. */ static void texture_sharpening_toggled(GtkWidget *widget, gpointer user_data) { CtkMultisample *ctk_multisample; gboolean enabled; ctk_multisample = CTK_MULTISAMPLE(user_data); enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); NvCtrlSetAttribute(ctk_multisample->handle, NV_CTRL_TEXTURE_SHARPEN, enabled); post_texture_sharpening_toggled(ctk_multisample, enabled); } /* texture_sharpening_toggled() */ /* * texture_sharpening_update_received() - callback function for when * the NV_CTRL_TEXTURE_SHARPEN attribute is changed by another * NV-CONTROL client. */ static void texture_sharpening_update_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct; CtkMultisample *ctk_multisample; GtkToggleButton *button; event_struct = (CtkEventStruct *) arg1; ctk_multisample = CTK_MULTISAMPLE(user_data); button = GTK_TOGGLE_BUTTON(ctk_multisample->texture_sharpening_button); g_signal_handlers_block_by_func(G_OBJECT(button), G_CALLBACK(texture_sharpening_toggled), (gpointer) ctk_multisample); gtk_toggle_button_set_active(button, event_struct->value); post_texture_sharpening_toggled(ctk_multisample, event_struct->value); g_signal_handlers_unblock_by_func(G_OBJECT(button), G_CALLBACK(texture_sharpening_toggled), (gpointer) ctk_multisample); } /* texture_sharpening_update_received() */ /* * ctk_multisample_create_help() - create a GtkTextBuffer describing * the available image quality options. */ GtkTextBuffer *ctk_multisample_create_help(GtkTextTagTable *table, CtkMultisample *ctk_multisample) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "Antialiasing Help"); if (ctk_multisample->active_attributes & __FSAA) { ctk_help_heading(b, &i, "Antialiasing Settings"); ctk_help_para(b, &i, "Antialiasing is a technique used in OpenGL " "to smooth the edges of objects in a scene to reduce " "the jagged 'stairstep' effect that sometimes appears " "along the edges of 3D objects. This is accomplished " "by rendering an image larger than normal (with " "multiple 'samples' per pixel), and then using a " "filter to average multiple samples into a " "single pixel."); ctk_help_para(b, &i, "Several antialiasing " "methods are available which you may select between " "with the Antialiasing slider. Note that increasing " "the number of samples used during Antialiased " "rendering may decrease performance."); ctk_help_para(b, &i, "You can also configure Antialiasing " "using the __GL_FSAA_MODE environment variable (see " "the README for details). The __GL_FSAA_MODE " "environment variable overrides the value in " "nvidia-settings."); ctk_help_term(b, &i, "Application Antialiasing Settings"); if (ctk_multisample->active_attributes & __FSAA_ENHANCE) { ctk_help_para(b, &i, "%s", __aa_menu_help); ctk_help_para(b, &i, "Use Application Settings will let applications " "choose the AA mode."); ctk_help_para(b, &i, "Override Application Settings will override " "all OpenGL applications to use the mode selected by " "the slider."); ctk_help_para(b, &i, "Enhance Application Settings will make " "applications that are requesting some type of " "antialiasing mode use the mode selected by the " "slider."); } else { ctk_help_para(b, &i, "%s", __aa_override_app_help); } if (ctk_multisample->active_attributes & __FSAA_NONE) { ctk_help_term(b, &i, "Off"); ctk_help_para(b, &i, "Disables antialiasing in OpenGL " "applications. " "Select this option if you require maximum " "performance in your applications."); } if (ctk_multisample->active_attributes & __FSAA_2x) { ctk_help_term(b, &i, "2x (2xMS)"); ctk_help_para(b, &i, "This enables antialiasing using the 2x (2xMS)" "Bilinear mode. This mode offers improved image " "quality and high performance in OpenGL " "applications."); } if (ctk_multisample->active_attributes & __FSAA_2x_5t) { ctk_help_term(b, &i, "2x Quincunx"); ctk_help_para(b, &i, "This enables the patented Quincunx " "Antialiasing technique available in the GeForce " "GPU family. " "Quincunx Antialiasing offers the quality of the " "slower, 4x antialiasing mode, but at nearly the " "performance of the faster, 2x mode."); } if (ctk_multisample->active_attributes & __FSAA_15x15) { ctk_help_term(b, &i, "1.5 x 1.5"); ctk_help_para(b, &i, "This enables antialiasing using the 1.5x1.5 " "mode. This mode offers improved image quality and " "high performance in OpenGL applications."); } if (ctk_multisample->active_attributes & __FSAA_2x2) { ctk_help_term(b, &i, "2 x 2 Supersampling"); ctk_help_para(b, &i, "This enables antialiasing using the 2x2 " "Supersampling mode. This mode offers higher image " "quality at the expense of some performance in " "OpenGL applications."); } if (ctk_multisample->active_attributes & __FSAA_4x) { ctk_help_term(b, &i, "4x (4xMS)"); ctk_help_para(b, &i, "This enables antialiasing using the 4x (4xMS)" "Bilinear mode. This mode offers higher image " "quality at the expense of some performance in " "OpenGL applications."); } if (ctk_multisample->active_attributes & __FSAA_4x_9t) { ctk_help_term(b, &i, "4x, 9-tap Gaussian"); ctk_help_para(b, &i, "This enables antialiasing using the 4x, " "9-tap (Gaussian) mode. This mode offers higher " "image quality but at the expense of some " "performance in OpenGL applications."); } if (ctk_multisample->active_attributes & __FSAA_8x) { ctk_help_term(b, &i, "8x (4xMS, 4xCS)"); ctk_help_para(b, &i, "This enables antialiasing using the 8x " "(4xMS, 4xCS) mode. This mode offers better image " "quality than the 4x mode."); } if (ctk_multisample->active_attributes & __FSAA_8xS) { ctk_help_term(b, &i, "8x (4xSS, 2xMS)"); ctk_help_para(b, &i, "This enables antialiasing using the 8x " "(4xSS, 2xMS) mode. This mode offers better image " "quality than the 4x mode."); } if (ctk_multisample->active_attributes & __FSAA_16x) { ctk_help_term(b, &i, "16x (4xMS, 12xCS)"); ctk_help_para(b, &i, "This enables antialiasing using the 16x " "(4xMS, 12xCS) mode. This mode offers better image " "quality than the 8x mode."); } if (ctk_multisample->active_attributes & __FSAA_8xQ) { ctk_help_term(b, &i, "8x (8xMS)"); ctk_help_para(b, &i, "This enables antialiasing using the 8x (8xMS) " "mode. This mode offers better image " "quality than the 8x mode."); } if (ctk_multisample->active_attributes & __FSAA_16xS) { ctk_help_term(b, &i, "16x (4xSS, 4xMS)"); ctk_help_para(b, &i, "This enables antialiasing using the 16x " "(4xSS, 4xMS) mode. This mode offers better image " "quality than the 16x mode."); } if (ctk_multisample->active_attributes & __FSAA_16xQ) { ctk_help_term(b, &i, "16x (8xMS, 8xCS)"); ctk_help_para(b, &i, "This enables antialiasing using the 16x " "(8xMS, 8xCS) mode. This mode offers better image " "quality than the 16x mode."); } if (ctk_multisample->active_attributes & __FSAA_32xS) { ctk_help_term(b, &i, "32x (4xSS, 8xMS)"); ctk_help_para(b, &i, "This enables antialiasing using the 32x " "(4xSS, 8xMS) mode. This mode offers better image " "quality than the 16x mode."); } } if (ctk_multisample->active_attributes & __FXAA) { ctk_help_term(b, &i, "Enable FXAA"); ctk_help_para(b, &i, "%s", __fxaa_enable_help); } if (ctk_multisample->active_attributes & __LOG_ANISO_RANGE) { ctk_help_heading(b, &i, "Anisotropic Filtering"); ctk_help_para(b, &i, "Anisotropic filtering is a technique used to " "improve the quality of textures applied to the " "surfaces of 3D objects when drawn at a sharp angle. " "Use the Anisotropic filtering slider to set the degree " "of anisotropic filtering for improved image quality. " "Enabling this option improves image quality at the " "expense of some performance."); ctk_help_para(b, &i, "You can also configure Anisotropic filtering " "using the __GL_LOG_MAX_ANISO environment variable " "(see the README for details). The " "__GL_LOG_MAX_ANISO environment variable overrides " "the value in nvidia-settings."); ctk_help_term(b, &i, "Override Application Setting"); ctk_help_para(b, &i, "%s", __aniso_override_app_help); ctk_help_para(b, &i, "%s", __aniso_slider_help); } if (ctk_multisample->active_attributes & __TEXTURE_SHARPEN) { ctk_help_heading(b, &i, "Texture Sharpening"); ctk_help_para(b, &i, "%s", __texture_sharpening_help); } ctk_help_finish(b); return b; } /* ctk_multisample_create_help() */ nvidia-settings/src/gtk+-2.x/ctkapcrulemodel.c0000664000175000017500000006067412236467170021435 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2013 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // Tree model implementation for operating on rules in an AppProfileConfig #include #include #include "ctkutils.h" #include "ctkapcrulemodel.h" static GObjectClass *parent_class = NULL; // Forward declarations GType ctk_apc_rule_model_get_type(void); static void apc_rule_model_class_init(CtkApcRuleModelClass *klass); static void apc_rule_model_init(CtkApcRuleModel *rule_model); static void apc_rule_model_finalize(GObject *object); static void apc_rule_model_tree_model_init(GtkTreeModelIface *iface); static void apc_rule_model_drag_source_init(GtkTreeDragSourceIface *iface); static void apc_rule_model_drag_dest_init(GtkTreeDragDestIface *iface); static GtkTreeModelFlags apc_rule_model_get_flags(GtkTreeModel *tree_model); static gint apc_rule_model_get_n_columns(GtkTreeModel *tree_model); static GType apc_rule_model_get_column_type(GtkTreeModel *tree_model, gint index); static gboolean apc_rule_model_get_iter(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path); static GtkTreePath *apc_rule_model_get_path(GtkTreeModel *tree_model, GtkTreeIter *iter); static void apc_rule_model_get_value(GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value); static gboolean apc_rule_model_iter_next(GtkTreeModel *tree_model, GtkTreeIter *iter); static gboolean apc_rule_model_iter_children(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent); static gboolean apc_rule_model_iter_has_child(GtkTreeModel *tree_model, GtkTreeIter *iter); static gint apc_rule_model_iter_n_children(GtkTreeModel *tree_model, GtkTreeIter *iter); static gboolean apc_rule_model_iter_nth_child(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, gint n); static gboolean apc_rule_model_iter_parent(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child); CtkApcRuleModel *ctk_apc_rule_model_new(AppProfileConfig *config); int ctk_apc_rule_model_create_rule(CtkApcRuleModel *rule_model, const char *filename, json_t *new_rule); void ctk_apc_rule_model_update_rule(CtkApcRuleModel *rule_model, const char *filename, int id, json_t *rule); void ctk_apc_rule_model_delete_rule(CtkApcRuleModel *rule_model, int id); static void apc_rule_model_post_set_rule_priority_common(CtkApcRuleModel *rule_model, int id); void ctk_apc_rule_model_set_abs_rule_priority(CtkApcRuleModel *rule_model, int id, size_t pri); void ctk_apc_rule_model_change_rule_priority(CtkApcRuleModel *rule_model, int id, int delta); static gboolean apc_rule_model_row_draggable(GtkTreeDragSource *drag_source, GtkTreePath *path); static gboolean apc_rule_model_drag_data_get(GtkTreeDragSource *drag_source, GtkTreePath *path, GtkSelectionData *selection_data); static gboolean apc_rule_model_drag_data_delete(GtkTreeDragSource *drag_source, GtkTreePath *path); static gboolean apc_rule_model_drag_data_received(GtkTreeDragDest *drag_dest, GtkTreePath *dest, GtkSelectionData *selection_data); static gboolean apc_rule_model_row_drop_possible(GtkTreeDragDest *drag_dest, GtkTreePath *dest_path, GtkSelectionData *selection_data); GType ctk_apc_rule_model_get_type(void) { static GType apc_rule_model_type = 0; if (!apc_rule_model_type) { static const GTypeInfo apc_rule_model_info = { sizeof (CtkApcRuleModelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) apc_rule_model_class_init, /* constructor */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkApcRuleModel), 0, /* n_preallocs */ (GInstanceInitFunc) apc_rule_model_init, /* instance_init */ NULL /* value_table */ }; static const GInterfaceInfo tree_model_info = { (GInterfaceInitFunc) apc_rule_model_tree_model_init, /* interface_init */ NULL, /* interface_finalize */ NULL /* interface_data */ }; static const GInterfaceInfo drag_source_info = { (GInterfaceInitFunc) apc_rule_model_drag_source_init, /* interface_init */ NULL, /* interface_finalize */ NULL /* interface_data */ }; static const GInterfaceInfo drag_dest_info = { (GInterfaceInitFunc) apc_rule_model_drag_dest_init, /* interface_init */ NULL, /* interface_finalize */ NULL /* interface_data */ }; apc_rule_model_type = g_type_register_static(G_TYPE_OBJECT, "CtkApcRuleModel", &apc_rule_model_info, 0); g_type_add_interface_static(apc_rule_model_type, GTK_TYPE_TREE_MODEL, &tree_model_info); g_type_add_interface_static(apc_rule_model_type, GTK_TYPE_TREE_DRAG_SOURCE, &drag_source_info); g_type_add_interface_static(apc_rule_model_type, GTK_TYPE_TREE_DRAG_DEST, &drag_dest_info); } return apc_rule_model_type; } static void apc_rule_model_class_init(CtkApcRuleModelClass *klass) { GObjectClass *object_class; parent_class = (GObjectClass *)g_type_class_peek_parent(klass); object_class = (GObjectClass *)klass; object_class->finalize = apc_rule_model_finalize; } static void apc_rule_model_init(CtkApcRuleModel *rule_model) { rule_model->stamp = g_random_int(); // random int to catch iterator type mismatches rule_model->config = NULL; rule_model->rules = g_array_new(FALSE, FALSE, sizeof(gint)); } static void apc_rule_model_finalize(GObject *object) { CtkApcRuleModel *rule_model = CTK_APC_RULE_MODEL(object); g_array_free(rule_model->rules, TRUE); parent_class->finalize(object); } static void apc_rule_model_tree_model_init(GtkTreeModelIface *iface) { iface->get_flags = apc_rule_model_get_flags; iface->get_n_columns = apc_rule_model_get_n_columns; iface->get_column_type = apc_rule_model_get_column_type; iface->get_iter = apc_rule_model_get_iter; iface->get_path = apc_rule_model_get_path; iface->get_value = apc_rule_model_get_value; iface->iter_next = apc_rule_model_iter_next; iface->iter_children = apc_rule_model_iter_children; iface->iter_has_child = apc_rule_model_iter_has_child; iface->iter_n_children = apc_rule_model_iter_n_children; iface->iter_nth_child = apc_rule_model_iter_nth_child; iface->iter_parent = apc_rule_model_iter_parent; } static void apc_rule_model_drag_source_init(GtkTreeDragSourceIface *iface) { iface->row_draggable = apc_rule_model_row_draggable; iface->drag_data_get = apc_rule_model_drag_data_get; iface->drag_data_delete = apc_rule_model_drag_data_delete; } static void apc_rule_model_drag_dest_init(GtkTreeDragDestIface *iface) { iface->drag_data_received = apc_rule_model_drag_data_received; iface->row_drop_possible = apc_rule_model_row_drop_possible; } static gboolean apc_rule_model_row_draggable(GtkTreeDragSource *drag_source, GtkTreePath *path) { return TRUE; } static gboolean apc_rule_model_drag_data_get(GtkTreeDragSource *drag_source, GtkTreePath *path, GtkSelectionData *selection_data) { if (gtk_tree_set_row_drag_data(selection_data, GTK_TREE_MODEL(drag_source), path)) { return TRUE; } else { // XXX text targets? return FALSE; } } static gboolean apc_rule_model_drag_data_delete(GtkTreeDragSource *drag_source, GtkTreePath *path) { CtkApcRuleModel *rule_model; gint *indices, depth; rule_model = CTK_APC_RULE_MODEL(drag_source); indices = gtk_tree_path_get_indices(path); depth = gtk_tree_path_get_depth(path); if (depth != 1) { return FALSE; } if ((indices[0] < 0) || (indices[0] > rule_model->rules->len)) { return FALSE; } // XXX the actual deletion is handled in the data_received() callback // If we ever use targets other than the view itself, this will need to have // a real implementation. return TRUE; } static gboolean apc_rule_model_drag_data_received(GtkTreeDragDest *drag_dest, GtkTreePath *dest, GtkSelectionData *selection_data) { CtkApcRuleModel *rule_model; GtkTreeModel *tree_model = GTK_TREE_MODEL(drag_dest); GtkTreeModel *src_model = NULL; GtkTreeIter iter; GtkTreePath *src = NULL; gint *dest_indices, dest_depth; gint src_depth; gint dest_n; GValue id = G_VALUE_INIT; if (gtk_tree_get_row_drag_data(selection_data, &src_model, &src) && (src_model == tree_model)) { // Move the given row rule_model = CTK_APC_RULE_MODEL(drag_dest); dest_indices = gtk_tree_path_get_indices(dest); dest_depth = gtk_tree_path_get_depth(dest); assert(dest_depth == 1); (void)(dest_depth); dest_n = dest_indices[0]; src_depth = gtk_tree_path_get_depth(src); assert(src_depth == 1); (void)(src_depth); gtk_tree_model_get_iter(tree_model, &iter, src); gtk_tree_model_get_value(tree_model, &iter, CTK_APC_RULE_MODEL_COL_ID, &id); // Move the rule to the right location ctk_apc_rule_model_set_abs_rule_priority(rule_model, g_value_get_int(&id), dest_n); gtk_tree_path_free(src); } else { // XXX text targets? } return TRUE; } static gboolean apc_rule_model_row_drop_possible(GtkTreeDragDest *drag_dest, GtkTreePath *dest_path, GtkSelectionData *selection_data) { CtkApcRuleModel *rule_model; gint n, *indices, depth; rule_model = CTK_APC_RULE_MODEL(drag_dest); indices = gtk_tree_path_get_indices(dest_path); depth = gtk_tree_path_get_depth(dest_path); assert(depth >= 1); n = indices[0]; return (depth == 1) && (n >= 0) && (n <= rule_model->rules->len); } static GtkTreeModelFlags apc_rule_model_get_flags(GtkTreeModel *tree_model) { return GTK_TREE_MODEL_LIST_ONLY; } static gint apc_rule_model_get_n_columns(GtkTreeModel *tree_model) { return CTK_APC_RULE_MODEL_N_COLUMNS; } static GType apc_rule_model_get_column_type(GtkTreeModel *tree_model, gint index) { switch (index) { case CTK_APC_RULE_MODEL_COL_ID: return G_TYPE_INT; case CTK_APC_RULE_MODEL_COL_FEATURE: return G_TYPE_STRING; case CTK_APC_RULE_MODEL_COL_MATCHES: return G_TYPE_STRING; case CTK_APC_RULE_MODEL_COL_PROFILE_NAME: return G_TYPE_STRING; case CTK_APC_RULE_MODEL_COL_FILENAME: return G_TYPE_STRING; default: assert(0); return G_TYPE_INVALID; } } static gboolean apc_rule_model_get_iter(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path) { CtkApcRuleModel *rule_model; gint depth, *indices; intptr_t n; assert(path); rule_model = CTK_APC_RULE_MODEL(tree_model); indices = gtk_tree_path_get_indices(path); depth = gtk_tree_path_get_depth(path); assert(depth == 1); (void)(depth); n = indices[0]; if (n >= rule_model->rules->len || n < 0) { return FALSE; } iter->stamp = rule_model->stamp; iter->user_data = (gpointer)n; iter->user_data2 = NULL; // unused iter->user_data3 = NULL; // unused return TRUE; } static GtkTreePath *apc_rule_model_get_path(GtkTreeModel *tree_model, GtkTreeIter *iter) { GtkTreePath *path; intptr_t n = (intptr_t)iter->user_data; g_return_val_if_fail(iter, NULL); path = gtk_tree_path_new(); gtk_tree_path_append_index(path, n); return path; } static void apc_rule_model_get_value(GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value) { const char *filename; CtkApcRuleModel *rule_model; const json_t *rule; const json_t *rule_pattern; int rule_id; intptr_t n; g_value_init(value, apc_rule_model_get_column_type(tree_model, column)); rule_model = CTK_APC_RULE_MODEL(tree_model); n = (intptr_t)iter->user_data; rule_id = g_array_index(rule_model->rules, gint, n); rule = nv_app_profile_config_get_rule(rule_model->config, rule_id); rule_pattern = json_object_get(rule, "pattern"); switch (column) { case CTK_APC_RULE_MODEL_COL_ID: g_value_set_int(value, rule_id); break; case CTK_APC_RULE_MODEL_COL_FEATURE: g_value_set_string(value, json_string_value(json_object_get(rule_pattern, "feature"))); break; case CTK_APC_RULE_MODEL_COL_MATCHES: g_value_set_string(value, json_string_value(json_object_get(rule_pattern, "matches"))); break; case CTK_APC_RULE_MODEL_COL_PROFILE_NAME: g_value_set_string(value, json_string_value(json_object_get(rule, "profile"))); break; case CTK_APC_RULE_MODEL_COL_FILENAME: filename = nv_app_profile_config_get_rule_filename(rule_model->config, rule_id); assert(filename); g_value_set_string(value, filename); break; default: assert(0); break; } } static gboolean apc_rule_model_iter_next(GtkTreeModel *tree_model, GtkTreeIter *iter) { CtkApcRuleModel *rule_model; intptr_t n; rule_model = CTK_APC_RULE_MODEL(tree_model); if (!iter) { return FALSE; } n = (intptr_t)iter->user_data; n++; if (n >= rule_model->rules->len) { return FALSE; } iter->user_data = (gpointer)n; return TRUE; } static gboolean apc_rule_model_iter_children(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent) { CtkApcRuleModel *rule_model = CTK_APC_RULE_MODEL(tree_model); if (parent) { return FALSE; } // (parent == NULL) => return first profile if (!rule_model->rules->len) { return FALSE; } iter->stamp = rule_model->stamp; iter->user_data = (gpointer)0; iter->user_data2 = NULL; iter->user_data3 = NULL; return TRUE; } static gboolean apc_rule_model_iter_has_child(GtkTreeModel *tree_model, GtkTreeIter *iter) { return FALSE; } static gint apc_rule_model_iter_n_children(GtkTreeModel *tree_model, GtkTreeIter *iter) { CtkApcRuleModel *rule_model = CTK_APC_RULE_MODEL(tree_model); return iter ? 0 : rule_model->rules->len; } static gboolean apc_rule_model_iter_nth_child(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, gint n_in) { CtkApcRuleModel *rule_model = CTK_APC_RULE_MODEL(tree_model); intptr_t n = (intptr_t)n_in; if (parent || (n < 0) || (n >= rule_model->rules->len)) { return FALSE; } iter->stamp = rule_model->stamp; iter->user_data = (gpointer)n; iter->user_data2 = NULL; // unused iter->user_data3 = NULL; // unused return TRUE; } static gboolean apc_rule_model_iter_parent(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child) { return FALSE; } void ctk_apc_rule_model_attach(CtkApcRuleModel *rule_model, AppProfileConfig *config) { GtkTreePath *path; GtkTreeIter iter; json_t *rule; AppProfileConfigRuleIter *rule_iter; gint i; gint id; rule_model->config = config; // Clear existing rules from the model path = gtk_tree_path_new_from_indices(0, -1); for (i = 0; i < rule_model->rules->len; i++) { // Emit a "row-deleted" signal for each deleted rule // (we can just keep calling this on row 0) gtk_tree_model_row_deleted(GTK_TREE_MODEL(rule_model), path); } gtk_tree_path_free(path); g_array_set_size(rule_model->rules, 0); // Load rules from the config into the model for (rule_iter = nv_app_profile_config_rule_iter(config), i = 0; rule_iter; rule_iter = nv_app_profile_config_rule_iter_next(rule_iter)) { rule = nv_app_profile_config_rule_iter_val(rule_iter); id = (int)json_integer_value(json_object_get(rule, "id")); g_array_append_val(rule_model->rules, id); // Emit a "row-inserted" signal for each new rule path = gtk_tree_path_new_from_indices(i++, -1); apc_rule_model_get_iter(GTK_TREE_MODEL(rule_model), &iter, path); gtk_tree_model_row_inserted(GTK_TREE_MODEL(rule_model), path, &iter); gtk_tree_path_free(path); } } CtkApcRuleModel *ctk_apc_rule_model_new(AppProfileConfig *config) { CtkApcRuleModel *rule_model; rule_model = CTK_APC_RULE_MODEL(g_object_new(CTK_TYPE_APC_RULE_MODEL, NULL)); assert(rule_model); ctk_apc_rule_model_attach(rule_model, config); return rule_model; } int ctk_apc_rule_model_create_rule(CtkApcRuleModel *rule_model, const char *filename, json_t *new_rule) { GtkTreeIter iter; GtkTreePath *path; gint n; int rule_id; rule_id = nv_app_profile_config_create_rule(rule_model->config, filename, new_rule); n = (gint)nv_app_profile_config_get_rule_priority(rule_model->config, rule_id); g_array_insert_val(rule_model->rules, n, rule_id); // Emit a "row-inserted" signal path = gtk_tree_path_new_from_indices(n, -1); apc_rule_model_get_iter(GTK_TREE_MODEL(rule_model), &iter, path); gtk_tree_model_row_inserted(GTK_TREE_MODEL(rule_model), path, &iter); gtk_tree_path_free(path); return rule_id; } static gint find_index_of_rule(CtkApcRuleModel *rule_model, int id) { gint i; for (i = 0; i < rule_model->rules->len; i++) { if (g_array_index(rule_model->rules, gint, i) == id) { return i; } } return -1; } void ctk_apc_rule_model_update_rule(CtkApcRuleModel *rule_model, const char *filename, int id, json_t *rule) { int rule_moved; GtkTreeIter iter; GtkTreePath *path; gint n; size_t new_pri, old_pri; gint *new_order; GArray *new_rules; int cur_id; rule_moved = nv_app_profile_config_update_rule(rule_model->config, filename, id, rule); if (rule_moved) { // Compute the new ordering new_rules = g_array_new(FALSE, FALSE, sizeof(gint)); new_order = malloc(sizeof(gint) * rule_model->rules->len); for (old_pri = 0; old_pri < rule_model->rules->len; old_pri++) { cur_id = g_array_index(rule_model->rules, gint, old_pri); new_pri = nv_app_profile_config_get_rule_priority(rule_model->config, cur_id); new_order[new_pri] = old_pri; } for (new_pri = 0; new_pri < rule_model->rules->len; new_pri++) { cur_id = g_array_index(rule_model->rules, gint, new_order[new_pri]); g_array_append_val(new_rules, cur_id); } g_array_free(rule_model->rules, TRUE); rule_model->rules = new_rules; // emit a "rows-reordered" signal path = gtk_tree_path_new(); gtk_tree_model_rows_reordered(GTK_TREE_MODEL(rule_model), path, NULL, new_order); gtk_tree_path_free(path); free(new_order); } else { // emit a "row-changed" signal n = find_index_of_rule(rule_model, id); path = gtk_tree_path_new_from_indices(n, -1); apc_rule_model_get_iter(GTK_TREE_MODEL(rule_model), &iter, path); gtk_tree_model_row_changed(GTK_TREE_MODEL(rule_model), path, &iter); gtk_tree_path_free(path); } } void ctk_apc_rule_model_delete_rule(CtkApcRuleModel *rule_model, int id) { GtkTreePath *path; gint n; n = find_index_of_rule(rule_model, id); assert(n >= 0); nv_app_profile_config_delete_rule(rule_model->config, id); g_array_remove_index(rule_model->rules, n); // emit a "row-deleted" signal path = gtk_tree_path_new_from_indices(n, -1); gtk_tree_model_row_deleted(GTK_TREE_MODEL(rule_model), path); gtk_tree_path_free(path); } static void apc_rule_model_post_set_rule_priority_common(CtkApcRuleModel *rule_model, int id) { gint *new_order; size_t old_pri, new_pri; int cur_id; gint n; GArray *new_rules; GtkTreePath *path; GtkTreeIter iter; // Compute the new ordering new_rules = g_array_new(FALSE, FALSE, sizeof(gint)); new_order = malloc(sizeof(gint) * rule_model->rules->len); for (old_pri = 0; old_pri < rule_model->rules->len; old_pri++) { cur_id = g_array_index(rule_model->rules, gint, old_pri); new_pri = nv_app_profile_config_get_rule_priority(rule_model->config, cur_id); new_order[new_pri] = old_pri; } for (new_pri = 0; new_pri < rule_model->rules->len; new_pri++) { cur_id = g_array_index(rule_model->rules, gint, new_order[new_pri]); g_array_append_val(new_rules, cur_id); } g_array_free(rule_model->rules, TRUE); rule_model->rules = new_rules; // emit a "rows-reordered" signal path = gtk_tree_path_new(); gtk_tree_model_rows_reordered(GTK_TREE_MODEL(rule_model), path, NULL, new_order); gtk_tree_path_free(path); free(new_order); // emit a "row-changed" signal for the rule whose priority has changed n = find_index_of_rule(rule_model, id); path = gtk_tree_path_new_from_indices(n, -1); apc_rule_model_get_iter(GTK_TREE_MODEL(rule_model), &iter, path); gtk_tree_model_row_changed(GTK_TREE_MODEL(rule_model), path, &iter); gtk_tree_path_free(path); } void ctk_apc_rule_model_set_abs_rule_priority(CtkApcRuleModel *rule_model, int id, size_t pri) { nv_app_profile_config_set_abs_rule_priority(rule_model->config, id, pri); apc_rule_model_post_set_rule_priority_common(rule_model, id); } void ctk_apc_rule_model_change_rule_priority(CtkApcRuleModel *rule_model, int id, int delta) { nv_app_profile_config_change_rule_priority(rule_model->config, id, delta); apc_rule_model_post_set_rule_priority_common(rule_model, id); } nvidia-settings/src/gtk+-2.x/ctkgvo.c0000664000175000017500000007635712236467170017561 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "NvCtrlAttributes.h" #include "ctkhelp.h" #include "ctkgvo.h" #include "ctkdropdownmenu.h" #include "ctkutils.h" #include "ctkbanner.h" #include "ctkgvo-banner.h" #include "msg.h" #define TABLE_PADDING 5 /* General information help */ static const char *__general_firmware_version_help = "The Firmware Version reports the version of the firmware running on the " "SDI device."; static const char *__general_current_sdi_resolution_help = "The Current SDI Resolution reports the current active resolution that the " "SDI device is driving or 'Inactive' if SDI is currently disabled."; static const char *__general_current_sdi_state_help = "The Current SDI state reports the current usage of the SDI device."; static const char *__requested_sdi_video_format_help = "The Requested SDI Video Format indicates what video format is currently " "requested through NV-CONTROL."; static const char *__requested_sdi_data_format_help = "The Requested SDI Data Format indicates what data format is currently " "requested through NV-CONTROL."; /* local prototypes */ static void query_video_format_details(CtkGvo *ctk_gvo); static void register_for_gvo_events(CtkGvo *ctk_gvo, CtkEvent *ctk_event); static void update_gvo_current_info(CtkGvo *ctk_gvo); static void gvo_event_received(GtkObject *object, gpointer arg1, gpointer user_data); /* * video format table -- should this be moved into NV-CONTROL? */ const GvioFormatName videoFormatNames[] = { { NV_CTRL_GVIO_VIDEO_FORMAT_487I_59_94_SMPTE259_NTSC, "720 x 487i 59.94 Hz (SMPTE259) NTSC"}, { NV_CTRL_GVIO_VIDEO_FORMAT_576I_50_00_SMPTE259_PAL, "720 x 576i 50.00 Hz (SMPTE259) PAL"}, { NV_CTRL_GVIO_VIDEO_FORMAT_720P_23_98_SMPTE296, "1280 x 720p 23.98 Hz (SMPTE296)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_720P_24_00_SMPTE296, "1280 x 720p 24.00 Hz (SMPTE296)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_720P_25_00_SMPTE296, "1280 x 720p 25.00 Hz (SMPTE296)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_720P_29_97_SMPTE296, "1280 x 720p 29.97 Hz (SMPTE296)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_720P_30_00_SMPTE296, "1280 x 720p 30.00 Hz (SMPTE296)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_720P_50_00_SMPTE296, "1280 x 720p 50.00 Hz (SMPTE296)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_720P_59_94_SMPTE296, "1280 x 720p 59.94 Hz (SMPTE296)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_720P_60_00_SMPTE296, "1280 x 720p 60.00 Hz (SMPTE296)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1035I_59_94_SMPTE260, "1920 x 1035i 59.94 Hz (SMPTE260)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1035I_60_00_SMPTE260, "1920 x 1035i 60.00 Hz (SMPTE260)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_47_96_SMPTE274, "1920 x 1080i 47.96 Hz (SMPTE274)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_48_00_SMPTE274, "1920 x 1080i 48.00 Hz (SMPTE274)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_50_00_SMPTE295, "1920 x 1080i 50.00 Hz (SMPTE295)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_50_00_SMPTE274, "1920 x 1080i 50.00 Hz (SMPTE274)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_59_94_SMPTE274, "1920 x 1080i 59.94 Hz (SMPTE274)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_60_00_SMPTE274, "1920 x 1080i 60.00 Hz (SMPTE274)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_23_976_SMPTE274, "1920 x 1080p 23.976 Hz (SMPTE274)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_24_00_SMPTE274, "1920 x 1080p 24.00 Hz (SMPTE274)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_25_00_SMPTE274, "1920 x 1080p 25.00 Hz (SMPTE274)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_29_97_SMPTE274, "1920 x 1080p 29.97 Hz (SMPTE274)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_30_00_SMPTE274, "1920 x 1080p 30.00 Hz (SMPTE274)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_23_98_SMPTE274, "1920 x 1080PsF 23.98 Hz (SMPTE274)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_24_00_SMPTE274, "1920 x 1080PsF 24.00 Hz (SMPTE274)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_25_00_SMPTE274, "1920 x 1080PsF 25.00 Hz (SMPTE274)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_29_97_SMPTE274, "1920 x 1080PsF 29.97 Hz (SMPTE274)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_30_00_SMPTE274, "1920 x 1080PsF 30.00 Hz (SMPTE274)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_47_96_SMPTE372, "2048 x 1080i 47.96 Hz (SMPTE372)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_48_00_SMPTE372, "2048 x 1080i 48.00 Hz (SMPTE372)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_50_00_SMPTE372, "2048 x 1080i 50.00 Hz (SMPTE372)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_59_94_SMPTE372, "2048 x 1080i 59.94 Hz (SMPTE372)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_60_00_SMPTE372, "2048 x 1080i 60.00 Hz (SMPTE372)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_23_98_SMPTE372, "2048 x 1080p 23.98 Hz (SMPTE372)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_24_00_SMPTE372, "2048 x 1080p 24.00 Hz (SMPTE372)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_25_00_SMPTE372, "2048 x 1080p 25.00 Hz (SMPTE372)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_29_97_SMPTE372, "2048 x 1080p 29.97 Hz (SMPTE372)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_30_00_SMPTE372, "2048 x 1080p 30.00 Hz (SMPTE372)" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_50_00_3G_LEVEL_A_SMPTE274, "1920 x 1080p 50.00 Hz (SMPTE274) 3G Level A" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_59_94_3G_LEVEL_A_SMPTE274, "1920 x 1080p 59.94 Hz (SMPTE274) 3G Level A" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_60_00_3G_LEVEL_A_SMPTE274, "1920 x 1080p 60.00 Hz (SMPTE274) 3G Level A" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_60_00_3G_LEVEL_B_SMPTE274, "1920 x 1080p 60.00 Hz (SMPTE274) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_60_00_3G_LEVEL_B_SMPTE274, "1920 x 1080i 60.00 Hz (SMPTE274) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_60_00_3G_LEVEL_B_SMPTE372, "2048 x 1080i 60.00 Hz (SMPTE372) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_50_00_3G_LEVEL_B_SMPTE274, "1920 x 1080p 50.00 Hz (SMPTE274) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_50_00_3G_LEVEL_B_SMPTE274, "1920 x 1080i 50.00 Hz (SMPTE274) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_50_00_3G_LEVEL_B_SMPTE372, "2048 x 1080i 50.00 Hz (SMPTE372) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_30_00_3G_LEVEL_B_SMPTE274, "1920 x 1080p 30.00 Hz (SMPTE274) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_30_00_3G_LEVEL_B_SMPTE372, "2048 x 1080p 30.00 Hz (SMPTE372) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_25_00_3G_LEVEL_B_SMPTE274, "1920 x 1080p 25.00 Hz (SMPTE274) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_25_00_3G_LEVEL_B_SMPTE372, "2048 x 1080p 25.00 Hz (SMPTE372) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_24_00_3G_LEVEL_B_SMPTE274, "1920 x 1080p 24.00 Hz (SMPTE274) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_24_00_3G_LEVEL_B_SMPTE372, "2048 x 1080p 24.00 Hz (SMPTE372) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_48_00_3G_LEVEL_B_SMPTE274, "1920 x 1080i 48.00 Hz (SMPTE274) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_48_00_3G_LEVEL_B_SMPTE372, "2048 x 1080i 48.00 Hz (SMPTE372) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_59_94_3G_LEVEL_B_SMPTE274, "1920 x 1080p 59.94 Hz (SMPTE274) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_59_94_3G_LEVEL_B_SMPTE274, "1920 x 1080i 59.94 Hz (SMPTE274) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_59_94_3G_LEVEL_B_SMPTE372, "2048 x 1080i 59.94 Hz (SMPTE372) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_29_97_3G_LEVEL_B_SMPTE274, "1920 x 1080p 29.97 Hz (SMPTE274) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_29_97_3G_LEVEL_B_SMPTE372, "2048 x 1080p 29.97 Hz (SMPTE372) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_23_98_3G_LEVEL_B_SMPTE274, "1920 x 1080p 23.98 Hz (SMPTE274) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_23_98_3G_LEVEL_B_SMPTE372, "2048 x 1080p 23.98 Hz (SMPTE372) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_47_96_3G_LEVEL_B_SMPTE274, "1920 x 1080i 47.96 Hz (SMPTE274) 3G Level B" }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_47_96_3G_LEVEL_B_SMPTE372, "2048 x 1080i 47.96 Hz (SMPTE372) 3G Level B" }, { -1, NULL }, }; static GvioFormatDetails videoFormatDetails[] = { { NV_CTRL_GVIO_VIDEO_FORMAT_487I_59_94_SMPTE259_NTSC, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_576I_50_00_SMPTE259_PAL, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_720P_23_98_SMPTE296, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_720P_24_00_SMPTE296, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_720P_25_00_SMPTE296, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_720P_29_97_SMPTE296, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_720P_30_00_SMPTE296, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_720P_50_00_SMPTE296, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_720P_59_94_SMPTE296, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_720P_60_00_SMPTE296, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1035I_59_94_SMPTE260, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1035I_60_00_SMPTE260, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_47_96_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_48_00_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_50_00_SMPTE295, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_50_00_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_59_94_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_60_00_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_23_976_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_24_00_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_25_00_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_29_97_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_30_00_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_23_98_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_24_00_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_25_00_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_29_97_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_30_00_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_47_96_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_48_00_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_50_00_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_59_94_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_60_00_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_23_98_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_24_00_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_25_00_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_29_97_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_30_00_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_50_00_3G_LEVEL_A_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_59_94_3G_LEVEL_A_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_60_00_3G_LEVEL_A_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_60_00_3G_LEVEL_B_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_60_00_3G_LEVEL_B_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_60_00_3G_LEVEL_B_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_50_00_3G_LEVEL_B_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_50_00_3G_LEVEL_B_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_50_00_3G_LEVEL_B_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_30_00_3G_LEVEL_B_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_30_00_3G_LEVEL_B_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_25_00_3G_LEVEL_B_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_25_00_3G_LEVEL_B_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_24_00_3G_LEVEL_B_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_24_00_3G_LEVEL_B_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_48_00_3G_LEVEL_B_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_48_00_3G_LEVEL_B_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_59_94_3G_LEVEL_B_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_59_94_3G_LEVEL_B_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_59_94_3G_LEVEL_B_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_29_97_3G_LEVEL_B_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_29_97_3G_LEVEL_B_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080P_23_98_3G_LEVEL_B_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048P_23_98_3G_LEVEL_B_SMPTE372, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_1080I_47_96_3G_LEVEL_B_SMPTE274, 0, 0, 0 }, { NV_CTRL_GVIO_VIDEO_FORMAT_2048I_47_96_3G_LEVEL_B_SMPTE372, 0, 0, 0 }, { -1, -1, -1, -1 }, }; static const GvioFormatName dataFormatNames[] = { { NV_CTRL_GVO_DATA_FORMAT_R8G8B8_TO_YCRCB444, "RGB -> YCrCb (4:4:4)" }, { NV_CTRL_GVO_DATA_FORMAT_R8G8B8_TO_YCRCB422, "RGB -> YCrCb (4:2:2)" }, { NV_CTRL_GVO_DATA_FORMAT_X8X8X8_444_PASSTHRU, "RGB (4:4:4)" }, { NV_CTRL_GVO_DATA_FORMAT_R8G8B8A8_TO_YCRCBA4444, "RGBA -> YCrCbA (4:4:4:4)" }, { NV_CTRL_GVO_DATA_FORMAT_R8G8B8Z10_TO_YCRCBZ4444, "RGBZ -> YCrCbZ (4:4:4:4)" }, { NV_CTRL_GVO_DATA_FORMAT_R8G8B8A8_TO_YCRCBA4224, "RGBA -> YCrCbA (4:2:2:4)" }, { NV_CTRL_GVO_DATA_FORMAT_R8G8B8Z10_TO_YCRCBZ4224, "RGBZ -> YCrCbZ (4:2:2:4)" }, { NV_CTRL_GVO_DATA_FORMAT_X8X8X8A8_4444_PASSTHRU, "RGBA (4:4:4:4)" }, { NV_CTRL_GVO_DATA_FORMAT_X8X8X8Z8_4444_PASSTHRU, "RGBZ (4:4:4:4)" }, { NV_CTRL_GVO_DATA_FORMAT_X10X10X10_444_PASSTHRU, "RGBA (4:4:4)" }, { NV_CTRL_GVO_DATA_FORMAT_X10X8X8_444_PASSTHRU, "RGB (4:4:4)" }, { NV_CTRL_GVO_DATA_FORMAT_X10X8X8A10_4444_PASSTHRU, "RGBA (4:4:4:4)" }, { NV_CTRL_GVO_DATA_FORMAT_X10X8X8Z10_4444_PASSTHRU, "RGBZ (4:4:4:4)" }, { NV_CTRL_GVO_DATA_FORMAT_DUAL_R8G8B8_TO_DUAL_YCRCB422, "Dual RGB -> Dual YCrCb (4:2:2)" }, { NV_CTRL_GVO_DATA_FORMAT_DUAL_X8X8X8_TO_DUAL_422_PASSTHRU, "Dual RGB (4:2:2)" }, { NV_CTRL_GVO_DATA_FORMAT_R10G10B10_TO_YCRCB422, "RGB -> YCrCb (4:2:2)" }, { NV_CTRL_GVO_DATA_FORMAT_R10G10B10_TO_YCRCB444, "RGB -> YCrCb (4:4:4)" }, { NV_CTRL_GVO_DATA_FORMAT_X12X12X12_444_PASSTHRU, "RGB (4:4:4)" }, { NV_CTRL_GVO_DATA_FORMAT_R12G12B12_TO_YCRCB444, "RGB -> YCrCb (4:4:4)" }, { NV_CTRL_GVO_DATA_FORMAT_X8X8X8_422_PASSTHRU, "RGB (4:2:2)" }, { NV_CTRL_GVO_DATA_FORMAT_X8X8X8A8_4224_PASSTHRU, "RGB (4:2:2:4)" }, { NV_CTRL_GVO_DATA_FORMAT_X8X8X8Z8_4224_PASSTHRU, "RGB (4:2:2:4)" }, { NV_CTRL_GVO_DATA_FORMAT_X10X10X10_422_PASSTHRU, "RGB (4:2:2)" }, { NV_CTRL_GVO_DATA_FORMAT_X10X8X8_422_PASSTHRU, "RGB (4:2:2)" }, { NV_CTRL_GVO_DATA_FORMAT_X10X8X8A10_4224_PASSTHRU, "RGBA (4:2:2:4)" }, { NV_CTRL_GVO_DATA_FORMAT_X10X8X8Z10_4224_PASSTHRU, "RGBZ (4:2:2:4)" }, { NV_CTRL_GVO_DATA_FORMAT_X12X12X12_422_PASSTHRU, "RGB (4:2:2)" }, { NV_CTRL_GVO_DATA_FORMAT_R12G12B12_TO_YCRCB422, "RGB -> YCrCb (4:2:2)" }, { -1, NULL }, }; /**** Utility Functions ******************************************************/ /* * ctk_gvio_get_video_format_name() - return the name of the given video format */ const char *ctk_gvio_get_video_format_name(const gint format) { gint i; for (i = 0; videoFormatNames[i].name; i++) { if (videoFormatNames[i].format == format) { return videoFormatNames[i].name; } } return "Unknown"; } /* ctk_gvio_get_video_format_name() */ /* * ctk_gvo_get_video_format_resolution() - return the width and height of the * given video format */ void ctk_gvo_get_video_format_resolution(const gint format, gint *w, gint *h) { gint i; *w = *h = 0; for (i = 0; videoFormatDetails[i].format != -1; i++) { if (videoFormatDetails[i].format == format) { *w = videoFormatDetails[i].width; *h = videoFormatDetails[i].height; return; } } } /* ctk_gvo_get_video_format_resolution() */ /* * ctk_gvo_get_data_format_name() - return the name of the given data format */ const char *ctk_gvo_get_data_format_name(const gint format) { gint i; for (i = 0; dataFormatNames[i].name; i++) { if (dataFormatNames[i].format == format) { return dataFormatNames[i].name; } } return "Unknown"; } /* ctk_gvo_get_data_format_name() */ /* * ctk_gvo_get_type() - Returns the CtkGvo "class" type */ GType ctk_gvo_get_type(void) { static GType ctk_gvo_type = 0; if (!ctk_gvo_type) { static const GTypeInfo ctk_gvo_info = { sizeof (CtkGvoClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* constructor */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkGvo), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_gvo_type = g_type_register_static(GTK_TYPE_VBOX, "CtkGvo", &ctk_gvo_info, 0); } return ctk_gvo_type; } /* ctk_gvo_get_type() */ /**** Creation Functions *****************************************************/ /* * ctk_gvo_new() - constructor for the CtkGvo widget */ GtkWidget* ctk_gvo_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event) { GObject *object; CtkGvo *ctk_gvo; GtkWidget *hbox; ReturnStatus ret; gchar scratch[64], *firmware, *string; gint val; GtkWidget *frame, *table; /* make sure we have a handle */ g_return_val_if_fail(handle != NULL, NULL); /* Check if this screen supports GVO */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GVO_SUPPORTED, &val); if ((ret != NvCtrlSuccess) || (val != NV_CTRL_GVO_SUPPORTED_TRUE)) { /* GVO not available */ return NULL; } /* create and initialize the object */ object = g_object_new(CTK_TYPE_GVO, NULL); ctk_gvo = CTK_GVO(object); ctk_gvo->handle = handle; /* * Query the validness, width, height and refresh rate for each * video format */ query_video_format_details(ctk_gvo); /* set container properties for the widget */ gtk_box_set_spacing(GTK_BOX(ctk_gvo), 10); /* banner */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, FALSE, 0); ctk_gvo->banner_box = hbox; ctk_gvo->banner = ctk_gvo_banner_new(handle, ctk_config, ctk_event); g_object_ref(ctk_gvo->banner); /* * General information */ frame = gtk_frame_new("General Information"); gtk_box_pack_start(GTK_BOX(object), frame, FALSE, FALSE, 0); table = gtk_table_new(3, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); gtk_container_add(GTK_CONTAINER(frame), table); /* GVO_FIRMWARE_VERSION */ string = NULL; ret = NvCtrlGetStringAttribute(handle, NV_CTRL_STRING_GVIO_FIRMWARE_VERSION, &string); if ((ret == NvCtrlSuccess) && (string)) { firmware = strdup(string); } else { /* * NV_CTRL_STRING_GVO_FIRMWARE_VERSION was added later, so * older X servers may not know about it; fallback to * NV_CTRL_GVO_FIRMWARE_VERSION */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GVO_FIRMWARE_VERSION, &val); if (ret == NvCtrlSuccess) { snprintf(scratch, 64, "1.%02d", val); firmware = strdup(scratch); } else { firmware = strdup("???"); } } add_table_row(table, 0, 0, 0.5, "Firmware Version:", 0, 0.5, firmware); ctk_gvo->current_resolution_label = add_table_row(table, 1, 0, 0.5, "Current SDI Resolution:", 0, 0.5, "Inactive"); ctk_gvo->current_state_label = add_table_row(table, 2, 0, 0.5, "Current SDI State:", 0, 0.5, "Inactive"); /* * Requested SDI Configuration */ frame = gtk_frame_new("Requested SDI Configuration"); gtk_box_pack_start(GTK_BOX(object), frame, FALSE, FALSE, 0); table = gtk_table_new(2, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); gtk_container_add(GTK_CONTAINER(frame), table); ctk_gvo->current_output_video_format_label = add_table_row(table, 3, 0, 0.5, "Requested SDI Video Format:", 0, 0.5, "Inactive"); ctk_gvo->current_output_data_format_label = add_table_row(table, 4, 0, 0.5, "Requested SDI Data Format:", 0, 0.5, "Inactive"); /* * Set the initial UI state */ update_gvo_current_info(ctk_gvo); /* * Start listening for events */ register_for_gvo_events(ctk_gvo, ctk_event); /* show the GVO widget */ gtk_widget_show_all(GTK_WIDGET(ctk_gvo)); return GTK_WIDGET(ctk_gvo); } /* ctk_gvo_new() */ /**** Initialization Functions ***********************************************/ /* * query_video_format_details() - initialize the videoFormatDetails[] * table by querying each of refresh rate, width, and height from * NV-CONTROL. */ static void query_video_format_details(CtkGvo *ctk_gvo) { ReturnStatus ret; NVCTRLAttributeValidValuesRec valid; gint i, val; /* Valid output video formats */ ret = NvCtrlGetValidAttributeValues(ctk_gvo->handle, NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT, &valid); if ((ret != NvCtrlSuccess) || (valid.type != ATTRIBUTE_TYPE_INT_BITS)) { ctk_gvo->valid_output_video_format_mask[0] = 0; } else { ctk_gvo->valid_output_video_format_mask[0] = valid.u.bits.ints; } ret = NvCtrlGetValidAttributeValues(ctk_gvo->handle, NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT2, &valid); if ((ret != NvCtrlSuccess) || (valid.type != ATTRIBUTE_TYPE_INT_BITS)) { ctk_gvo->valid_output_video_format_mask[1] = 0; } else { ctk_gvo->valid_output_video_format_mask[1] = valid.u.bits.ints; } ret = NvCtrlGetValidAttributeValues(ctk_gvo->handle, NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT3, &valid); if ((ret != NvCtrlSuccess) || (valid.type != ATTRIBUTE_TYPE_INT_BITS)) { ctk_gvo->valid_output_video_format_mask[2] = 0; } else { ctk_gvo->valid_output_video_format_mask[2] = valid.u.bits.ints; } for (i = 0; videoFormatDetails[i].format != -1; i++) { ret = NvCtrlGetDisplayAttribute(ctk_gvo->handle, videoFormatDetails[i].format, NV_CTRL_GVIO_VIDEO_FORMAT_REFRESH_RATE, &val); if (ret != NvCtrlSuccess) val = 0; videoFormatDetails[i].rate = val; ret = NvCtrlGetDisplayAttribute(ctk_gvo->handle, videoFormatDetails[i].format, NV_CTRL_GVIO_VIDEO_FORMAT_WIDTH, &val); if (ret != NvCtrlSuccess) val = 0; videoFormatDetails[i].width = val; ret = NvCtrlGetDisplayAttribute(ctk_gvo->handle, videoFormatDetails[i].format, NV_CTRL_GVIO_VIDEO_FORMAT_HEIGHT, &val); if (ret != NvCtrlSuccess) val = 0; videoFormatDetails[i].height = val; } } /* query_video_format_details() */ /* * register_for_gvo_events() - Configure ctk_gvo object to listen for * GVO related evens. */ static void register_for_gvo_events(CtkGvo *ctk_gvo, CtkEvent *ctk_event) { g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT), G_CALLBACK(gvo_event_received), (gpointer) ctk_gvo); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_GVO_DATA_FORMAT), G_CALLBACK(gvo_event_received), (gpointer) ctk_gvo); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_GVO_LOCK_OWNER), G_CALLBACK(gvo_event_received), (gpointer) ctk_gvo); } /* register_for_gvo_events() */ /**** Common Update Functions ************************************************/ /* * update_gvo_current_info() - Updates the page's information to reflect * the GVO device's current state. */ static void update_gvo_current_info(CtkGvo *ctk_gvo) { int width; int height; ReturnStatus ret; gchar res_string[64], state_string[64]; int output_video_format; int output_data_format; int lock_owner; ret = NvCtrlGetAttribute(ctk_gvo->handle, NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT, &output_video_format); if (ret != NvCtrlSuccess) { output_video_format = NV_CTRL_GVIO_VIDEO_FORMAT_NONE; } ret = NvCtrlGetAttribute(ctk_gvo->handle, NV_CTRL_GVO_DATA_FORMAT, &output_data_format); if (ret != NvCtrlSuccess) { output_data_format = -1; } ret = NvCtrlGetAttribute(ctk_gvo->handle, NV_CTRL_GVO_LOCK_OWNER, &lock_owner); if (ret != NvCtrlSuccess) { lock_owner = NV_CTRL_GVO_LOCK_OWNER_NONE; } /* Get the current video format sizes */ ctk_gvo_get_video_format_resolution(output_video_format, &width, &height); switch (lock_owner) { case NV_CTRL_GVO_LOCK_OWNER_NONE: snprintf(res_string, 64, "Inactive"); snprintf(state_string, 64, "Inactive"); break; case NV_CTRL_GVO_LOCK_OWNER_CLONE: /* fall through for compatibility */ case NV_CTRL_GVO_LOCK_OWNER_X_SCREEN: snprintf(res_string, 64, "%d x %d", width, height); snprintf(state_string, 64, "In use by X"); break; case NV_CTRL_GVO_LOCK_OWNER_GLX: snprintf(res_string, 64, "%d x %d", width, height); snprintf(state_string, 64, "In use by GLX"); break; default: return; } if (ctk_gvo->current_resolution_label) { gtk_label_set_text(GTK_LABEL(ctk_gvo->current_resolution_label), res_string); } if (ctk_gvo->current_state_label) { gtk_label_set_text(GTK_LABEL(ctk_gvo->current_state_label), state_string); } if (ctk_gvo->current_output_video_format_label) { gtk_label_set_text (GTK_LABEL(ctk_gvo->current_output_video_format_label), ctk_gvio_get_video_format_name(output_video_format)); } if (ctk_gvo->current_output_data_format_label) { gtk_label_set_text (GTK_LABEL(ctk_gvo->current_output_data_format_label), ctk_gvo_get_data_format_name(output_data_format)); } } /* update_gvo_current_info() */ /**** Event Handlers *********************************************************/ /* * gvo_event_received() - Handles GVO NV-CONTROL events. */ static void gvo_event_received(GtkObject *object, gpointer arg1, gpointer user_data) { update_gvo_current_info(CTK_GVO(user_data)); } /* gvo_event_received(() */ /**** Callback Handlers ******************************************************/ /* * ctk_gvo_select() - Called when the ctk_gvo page is selected */ void ctk_gvo_select(GtkWidget *widget) { CtkGvo *ctk_gvo = CTK_GVO(widget); /* Grab the GVO banner */ ctk_gvo_banner_set_parent(CTK_GVO_BANNER(ctk_gvo->banner), ctk_gvo->banner_box, NULL, NULL); } /* ctk_gvo_select() */ /* * ctk_gvo_unselect() - Called when a page other than the ctk_gvo * page is selected and the ctk_gvo page was the last page to be * selected. */ void ctk_gvo_unselect(GtkWidget *widget) { CtkGvo *ctk_gvo = CTK_GVO(widget); /* Release the GVO banner */ ctk_gvo_banner_set_parent(CTK_GVO_BANNER(ctk_gvo->banner), NULL, NULL, NULL); } /* ctk_gvo_unselect() */ /* * ctk_gvo_create_help() - Creates the GVO help page. */ GtkTextBuffer* ctk_gvo_create_help(GtkTextTagTable *table) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "GVO (Graphics to Video Out) Help"); ctk_help_para(b, &i, "This page gives access to general information about " "the SDI device as well as configuration of Clone Mode."); ctk_help_heading(b, &i, "General Information"); ctk_help_para(b, &i, "This section shows information about the SDI device " "that is associated with the X screen."); ctk_help_heading(b, &i, "Firmware Version"); ctk_help_para(b, &i, "%s", __general_firmware_version_help); ctk_help_heading(b, &i, "Current SDI Resolution"); ctk_help_para(b, &i, "%s", __general_current_sdi_resolution_help); ctk_help_heading(b, &i, "Current SDI State"); ctk_help_para(b, &i, "%s", __general_current_sdi_state_help); ctk_help_heading(b, &i, "Requested SDI Video Format"); ctk_help_para(b, &i, "%s", __requested_sdi_video_format_help); ctk_help_heading(b, &i, "Requested SDI Data Format"); ctk_help_para(b, &i, "%s", __requested_sdi_data_format_help); ctk_help_finish(b); return b; } /* ctk_gvo_create_help() */ nvidia-settings/src/gtk+-2.x/ctkcurve.c0000664000175000017500000002051012236467170020066 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "NvCtrlAttributes.h" #include "ctkcurve.h" #define REQUESTED_WIDTH 94 #define REQUESTED_HEIGHT 94 static void ctk_curve_class_init (CtkCurveClass *); static void ctk_curve_finalize (GObject *); static gboolean ctk_curve_expose_event (GtkWidget *, GdkEventExpose *); static void ctk_curve_size_request (GtkWidget *, GtkRequisition *); static gboolean ctk_curve_configure_event(GtkWidget *, GdkEventConfigure *); static void plot_color_ramp (GdkPixmap *, GdkGC *, gushort *, gint, gint, gint); static void draw(CtkCurve *ctk_curve); static GObjectClass *parent_class; GType ctk_curve_get_type( void ) { static GType ctk_curve_type = 0; if (!ctk_curve_type) { static const GTypeInfo ctk_curve_info = { sizeof (CtkCurveClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ctk_curve_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkCurve), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_curve_type = g_type_register_static (GTK_TYPE_DRAWING_AREA, "CtkCurve", &ctk_curve_info, 0); } return ctk_curve_type; } static void ctk_curve_class_init( CtkCurveClass *ctk_curve_class ) { GObjectClass *gobject_class; GtkWidgetClass *widget_class; widget_class = (GtkWidgetClass *) ctk_curve_class; gobject_class = (GObjectClass *) ctk_curve_class; parent_class = g_type_class_peek_parent(ctk_curve_class); gobject_class->finalize = ctk_curve_finalize; widget_class->expose_event = ctk_curve_expose_event; widget_class->size_request = ctk_curve_size_request; widget_class->configure_event = ctk_curve_configure_event; } static void ctk_curve_finalize( GObject *object ) { CtkCurve *ctk_curve; GdkColormap *gdk_colormap; GdkColor *gdk_color; ctk_curve = CTK_CURVE(object); gdk_colormap = ctk_curve->gdk_colormap; gdk_color = &ctk_curve->gdk_color_red; gdk_colormap_free_colors(gdk_colormap, gdk_color, 1); gdk_color = &ctk_curve->gdk_color_green; gdk_colormap_free_colors(gdk_colormap, gdk_color, 1); gdk_color = &ctk_curve->gdk_color_blue; gdk_colormap_free_colors(gdk_colormap, gdk_color, 1); g_object_unref(gdk_colormap); } static gboolean ctk_curve_expose_event( GtkWidget *widget, GdkEventExpose *event ) { gint width, height; CtkCurve *ctk_curve; ctk_curve = CTK_CURVE(widget); width = widget->allocation.width - 2 * widget->style->xthickness; height = widget->allocation.height - 2 * widget->style->ythickness; gtk_paint_shadow(widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_IN, &event->area, widget, "ctk_curve", 0, 0, widget->allocation.width, widget->allocation.height); gdk_gc_set_function(ctk_curve->gdk_gc, GDK_COPY); gdk_draw_drawable(widget->window, ctk_curve->gdk_gc, ctk_curve->gdk_pixmap, 0, 0, widget->style->xthickness, widget->style->ythickness, width, height); return FALSE; } static gboolean ctk_curve_configure_event ( GtkWidget *widget, GdkEventConfigure *event ) { CtkCurve *ctk_curve = CTK_CURVE(widget); ctk_curve->width = event->width; ctk_curve->height = event->height; if (ctk_curve->gdk_pixmap) g_object_unref(ctk_curve->gdk_pixmap); if (ctk_curve->gdk_gc) g_object_unref(ctk_curve->gdk_gc); ctk_curve->gdk_pixmap = gdk_pixmap_new(widget->window, ctk_curve->width, ctk_curve->height, -1); ctk_curve->gdk_gc = gdk_gc_new(ctk_curve->gdk_pixmap); draw(ctk_curve); return FALSE; } static void plot_color_ramp( GdkPixmap *gdk_pixmap, GdkGC *gdk_gc, gushort *color_ramp, gint n_color_ramp_entries, gint width, gint height ) { gfloat x, dx, y; GdkPoint *gdk_points; gint i; gdk_points = g_malloc(width * sizeof(GdkPoint)); x = 0; dx = (n_color_ramp_entries - 1.0) / (width - 1.0); for (i = 0; i < width; i++, x += dx) { y = (gfloat) color_ramp[(int) (x + 0.5)]; gdk_points[i].x = i; gdk_points[i].y = height - ((height - 1) * (y / 65535) + 0.5); } gdk_draw_lines(gdk_pixmap, gdk_gc, gdk_points, width); g_free(gdk_points); } static void ctk_curve_size_request( GtkWidget *widget, GtkRequisition *requisition ) { requisition->width = REQUESTED_WIDTH; requisition->height = REQUESTED_HEIGHT; } static void color_changed( GtkWidget *widget ) { GdkRectangle rectangle; rectangle.x = widget->style->xthickness; rectangle.y = widget->style->ythickness; rectangle.width = widget->allocation.width - 2 * rectangle.x; rectangle.height = widget->allocation.height - 2 * rectangle.y; if (GTK_WIDGET_DRAWABLE(widget)) { draw(CTK_CURVE(widget)); /* only draw when visible */ gdk_window_invalidate_rect(widget->window, &rectangle, FALSE); } } GtkWidget* ctk_curve_new(NvCtrlAttributeHandle *handle, GtkWidget *color) { GObject *object; CtkCurve *ctk_curve; GdkColormap *gdk_colormap; GdkColor *gdk_color; object = g_object_new(CTK_TYPE_CURVE, NULL); ctk_curve = CTK_CURVE(object); ctk_curve->handle = handle; ctk_curve->color = color; ctk_curve->gdk_pixmap = NULL; ctk_curve->gdk_gc = NULL; ctk_curve->gdk_colormap = gdk_colormap = gdk_colormap_get_system(); g_object_ref(gdk_colormap); gdk_color = &ctk_curve->gdk_color_red; memset(gdk_color, 0, sizeof(GdkColor)); gdk_color->red = 65535; gdk_colormap_alloc_color(gdk_colormap, gdk_color, FALSE, TRUE); gdk_color = &ctk_curve->gdk_color_green; memset(gdk_color, 0, sizeof(GdkColor)); gdk_color->green = 65535; gdk_colormap_alloc_color(gdk_colormap, gdk_color, FALSE, TRUE); gdk_color = &ctk_curve->gdk_color_blue; memset(gdk_color, 0, sizeof(GdkColor)); gdk_color->blue = 65535; gdk_colormap_alloc_color(gdk_colormap, gdk_color, FALSE, TRUE); g_signal_connect_swapped(G_OBJECT(ctk_curve->color), "changed", G_CALLBACK(color_changed), (gpointer) ctk_curve); return GTK_WIDGET(object); } static void draw(CtkCurve *ctk_curve) { GtkWidget *widget = GTK_WIDGET(ctk_curve); gushort *lut; gint n_lut_entries; gdk_gc_set_function(ctk_curve->gdk_gc, GDK_COPY); gdk_draw_rectangle(ctk_curve->gdk_pixmap, widget->style->black_gc, TRUE, 0, 0, ctk_curve->width, ctk_curve->height); gdk_gc_set_function(ctk_curve->gdk_gc, GDK_XOR); gdk_gc_set_foreground(ctk_curve->gdk_gc, &ctk_curve->gdk_color_red); NvCtrlGetColorRamp(ctk_curve->handle, RED_CHANNEL, &lut, &n_lut_entries); plot_color_ramp(ctk_curve->gdk_pixmap, ctk_curve->gdk_gc, lut, n_lut_entries, ctk_curve->width, ctk_curve->height); gdk_gc_set_foreground(ctk_curve->gdk_gc, &ctk_curve->gdk_color_green); NvCtrlGetColorRamp(ctk_curve->handle, GREEN_CHANNEL, &lut, &n_lut_entries); plot_color_ramp(ctk_curve->gdk_pixmap, ctk_curve->gdk_gc, lut, n_lut_entries, ctk_curve->width, ctk_curve->height); gdk_gc_set_foreground(ctk_curve->gdk_gc, &ctk_curve->gdk_color_blue); NvCtrlGetColorRamp(ctk_curve->handle, BLUE_CHANNEL, &lut, &n_lut_entries); plot_color_ramp(ctk_curve->gdk_pixmap, ctk_curve->gdk_gc, lut, n_lut_entries, ctk_curve->width, ctk_curve->height); } nvidia-settings/src/gtk+-2.x/ctkdisplaylayout.h0000664000175000017500000005034112236467170021657 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_DISPLAYLAYOUT_H__ #define __CTK_DISPLAYLAYOUT_H__ #include "ctkevent.h" #include "ctkconfig.h" #include "XF86Config-parser/xf86Parser.h" G_BEGIN_DECLS #define CTK_TYPE_DISPLAY_LAYOUT (ctk_display_layout_get_type()) #define CTK_DISPLAY_LAYOUT(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_DISPLAY_LAYOUT, \ CtkDisplayLayout)) #define CTK_DISPLAY_LAYOUT_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_DISPLAY_LAYOUT, \ CtkDisplayLayoutClass)) #define CTK_IS_DISPLAY_LAYOUT(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_DISPLAY_LAYOUT)) #define CTK_IS_DISPLAY_LAYOUT_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_DISPLAY_LAYOUT)) #define CTK_DISPLAY_LAYOUT_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_DISPLAY_LAYOUT, \ CtkDisplayLayoutClass)) #define CTK_DISPLAY_LAYOUT_TOOLTIP_WIDGET(obj) \ ((CTK_SCALE(obj))->tooltip_widget) /* Maximums */ #define MAX_DEVICES 64 /* Max number of GPUs */ /* XF86VIDMODE */ #define V_PHSYNC 0x0001 #define V_NHSYNC 0x0002 #define V_PVSYNC 0x0004 #define V_NVSYNC 0x0008 #define V_INTERLACE 0x0010 #define V_DBLSCAN 0x0020 #define V_CSYNC 0x0040 #define V_PCSYNC 0x0080 #define V_NCSYNC 0x0100 #define V_HSKEW 0x0200 /* hskew provided */ #define V_BCAST 0x0400 #define V_CUSTOM 0x0800 /* timing numbers customized by editor */ #define V_VSCAN 0x1000 /* NV-CONTROL modeline sources */ #define MODELINE_SOURCE_XSERVER 0x001 #define MODELINE_SOURCE_XCONFIG 0x002 #define MODELINE_SOURCE_BUILTIN 0x004 #define MODELINE_SOURCE_VESA 0x008 #define MODELINE_SOURCE_EDID 0x010 #define MODELINE_SOURCE_NVCONTROL 0x020 #define MODELINE_SOURCE_USER \ ((MODELINE_SOURCE_XCONFIG)|(MODELINE_SOURCE_NVCONTROL)) /*** M A C R O S *************************************************************/ /* Determines if the mode is the nvidia-auto-select mode. */ #define IS_NVIDIA_DEFAULT_MODE(m) \ (!strcmp(( m )->data.identifier, "nvidia-auto-select")) /* Calculates the horizontal refresh rate (sync) of the modeline in kHz */ #define GET_MODELINE_HSYNC(m) \ (((double)((m)->data.clock)) / (2.0f * (double)((m)->data.htotal))) /* Determines if the metamode was created/modified by the user */ #define IS_METAMODE_SOURCE_USER(s) \ (((s) == METAMODE_SOURCE_XCONFIG) || \ ((s) == METAMODE_SOURCE_NVCONTROL) || \ ((s) == METAMODE_SOURCE_RANDR)) /*** T Y P E D E F I N I T I O N S *****************************************/ typedef enum { PASSIVE_STEREO_EYE_NONE = 0, PASSIVE_STEREO_EYE_LEFT, PASSIVE_STEREO_EYE_RIGHT, } PassiveStereoEye; typedef enum { ROTATION_0 = 0, ROTATION_90, ROTATION_180, ROTATION_270, } Rotation; typedef enum { REFLECTION_NONE = 0, REFLECTION_X, REFLECTION_Y, REFLECTION_XY, } Reflection; typedef enum { METAMODE_SOURCE_XCONFIG = 0, METAMODE_SOURCE_IMPLICIT, METAMODE_SOURCE_NVCONTROL, METAMODE_SOURCE_RANDR, } MetaModeSource; typedef enum { MOSAIC_TYPE_UNSUPPORTED = 0, MOSAIC_TYPE_SLI_MOSAIC, MOSAIC_TYPE_BASE_MOSAIC, MOSAIC_TYPE_BASE_MOSAIC_LIMITED, } MosaicType; typedef struct nvSizeRec { int width; int height; } nvSize; typedef struct nvModeLineRec { struct nvModeLineRec *next; XConfigModeLineRec data; /* Modeline information */ double refresh_rate; /* in Hz */ /* Extra information */ unsigned int source; char *xconfig_name; } nvModeLine, *nvModeLinePtr; typedef struct nvSelectedModeRec { struct nvSelectedModeRec *next; GtkWidget *label; /* Label shown in dropdown menu */ nvModeLinePtr modeline; /* Modeline this mode references */ Bool isSpecial; /* Whether this mode is "Off" or "Auto" */ Bool isScaled; /* Whether custom viewports are set */ nvSize viewPortIn; GdkRectangle viewPortOut; } nvSelectedMode, *nvSelectedModePtr; /* Mode (A particular configuration for a display within an X screen) * * NOTE: When metamodes are duplicated, the modes are memcpy'ed over, so * if new variables are added to the nvModeRec that shouldn't (just) * be copied, be sure to update this in * ctk_display_layout_add_screen_metamode(). */ typedef struct nvModeRec { struct nvModeRec *next; /* Defines a single mode for a display device as part of an X screen's * metamode. * * "WxH_Hz +x+y @WxH" * * "modeline_reference_name +offset @panning" */ struct nvDisplayRec *display; /* Display device mode belongs to */ struct nvMetaModeRec *metamode; /* Metamode the mode is in */ struct nvModeLineRec *modeline; /* Modeline this mode references */ int dummy; /* Dummy mode, don't print out */ nvSize viewPortIn; /* Viewport In */ GdkRectangle pan; /* Panning Domain (absolute) */ GdkRectangle viewPortOut; /* ViewPort Out (WH) */ int position_type; /* Relative, Absolute, etc. */ struct nvDisplayRec *relative_to; /* Display Relative/RightOf etc */ PassiveStereoEye passive_stereo_eye; /* Stereo mode 4 per-dpy setting */ Rotation rotation; Reflection reflection; } nvMode, *nvModePtr; /* Display Device (CRT, DFP, TV, Projector ...) */ typedef struct nvDisplayRec { struct nvDisplayRec *next_on_gpu; struct nvDisplayRec *next_in_screen; XConfigMonitorPtr conf_monitor; NvCtrlAttributeHandle *handle; /* NV-CONTROL handle to device */ struct nvGpuRec *gpu; /* GPU the display belongs to */ struct nvScreenRec *screen; /* X screen the display is tied to */ char *logName; /* Display name (from NV-CONTROL) */ char *typeBaseName; /* e.g. "CRT", "DFP", "TV" */ char *typeIdName; /* e.g. "DFP-1", "TV-0" */ char *dpGuidName; /* e.g. "DP-GUID-11111111-1111-1111-1111-111111111111" */ char *edidHashName; /* e.g. "DPY-EDID-11111111-1111-1111-1111-111111111111" */ char *targetIdName; /* e.g. "DPY-3" */ char *randrName; /* e.g. "VGA-1", "DVI-I-2" */ Bool is_sdi; /* Is an SDI display */ nvModeLinePtr modelines; /* Modelines validated by X */ int num_modelines; nvSelectedModePtr selected_modes; /* List of modes to show in the dropdown menu */ int num_selected_modes; nvSelectedModePtr cur_selected_mode; /* Current mode selected in the dropdown menu */ nvModePtr modes; /* List of modes this display uses */ int num_modes; nvModePtr cur_mode; /* Current mode display uses */ } nvDisplay, *nvDisplayPtr; /* MetaMode (A particular configuration for an X screen) */ typedef struct nvMetaModeRec { struct nvMetaModeRec *next; int id; /* Magic id */ int x_idx; /* Used to re-order metamodes on apply */ MetaModeSource source; /* Source of the metamode */ Bool switchable; /* Can the metamode be accessed through Ctrl Alt +- */ // Used for drawing & moving metamode boxes GdkRectangle dim; /* Bounding box of all modes */ // Used for applying and generating metamodes (effective dimensions) GdkRectangle edim; /* Bounding box of all non-NULL modes */ /* Used to apply the metamode to the running X server */ char *cpl_str; /* metamode string from CPL */ char *x_str; /* parsed CPL string from X */ char *x_str_entry; /* Points to string in metamode strings buffer */ } nvMetaMode, *nvMetaModePtr; /* X Screen */ typedef struct nvScreenRec { struct nvScreenRec *next_in_layout; XConfigScreenPtr conf_screen; XConfigDevicePtr conf_device; /* An X screen may have one or more displays connected to it * if TwinView is on. * * If NoScanout is enabled, the X screen will not make use * of display device(s). * */ NvCtrlAttributeHandle *handle; /* NV-CONTROL handle to X screen */ CtkEvent *ctk_event; int scrnum; struct nvLayoutRec *layout; /* Layout this X screen belongs to */ struct nvGpuRec **gpus; /* List of GPUs driving this screen */ int num_gpus; int display_owner_gpu_id; /* Display owner GPU, or -1 */ struct nvGpuRec *display_owner_gpu; /* GPU to use for Device section */ int max_width; /* Max based on all GPUs */ int max_height; int max_displays; Bool allow_depth_30; int depth; /* Depth of the screen */ int stereo; /* Stereo mode enabled on this screen */ int overlay; /* Overlay enabled on this screen */ int hw_overlay; int ubb; nvDisplayPtr displays; /* List of displays using this screen */ int num_displays; /* # of displays using this screen */ nvMetaModePtr metamodes; /* List of metamodes */ int num_metamodes; /* # modes per display device */ nvMetaModePtr cur_metamode; /* Current metamode to display */ int cur_metamode_idx; /* Current metamode to display */ nvDisplayPtr primaryDisplay; // Used for generating metamode strings. GdkRectangle dim; /* Bounding box of all metamodes (Absolute coords) */ int position_type; /* Relative, Absolute, etc. */ struct nvScreenRec *relative_to; /* Screen Relative/RightOf etc */ int x_offset; /* Offsets for relative positioning */ int y_offset; Bool sli; char *sli_mode; char *multigpu_mode; Bool no_scanout; /* This screen has no display devices */ Bool stereo_supported; /* Can stereo be configured on this screen */ } nvScreen, *nvScreenPtr; /* GVO Mode information */ typedef struct GvoModeDataRec { unsigned int id; /* NV-CONTROL ID */ char *name; unsigned int rate; /* Refresh rate */ } GvoModeData; /* GPU (Device) */ typedef struct nvGpuRec { struct nvGpuRec *next_in_layout; /* List of all GPUs */ NvCtrlAttributeHandle *handle; /* NV-CONTROL handle to GPU */ CtkEvent *ctk_event; struct nvLayoutRec *layout; /* Layout this GPU belongs to */ int max_width; int max_height; int max_displays; Bool allow_depth_30; Bool multigpu_master_possible; MosaicType mosaic_type; Bool mosaic_enabled; char *name; /* Name of the GPU */ char *uuid; /* e.g. "GPU-11111111-1111-1111-1111-111111111111" */ gchar *pci_bus_id; GvoModeData *gvo_mode_data; /* Information about GVO modes available */ unsigned int num_gvo_modes; unsigned int *flags_memory; /* Pointer to memory alloced for flags */ unsigned int *flags; /* Array of flags queried from the X server */ int num_flags; nvDisplayPtr displays; /* Linked list of displays connected to GPU */ int num_displays; } nvGpu, *nvGpuPtr; /* Layout */ typedef struct nvLayoutRec { XConfigLayoutPtr conf_layout; char *filename; NvCtrlAttributeHandle *handle; nvGpuPtr gpus; /* Linked list of GPUs (next_in_layout) */ int num_gpus; nvScreenPtr screens; /* Linked list of X screens (next_in_layout) */ int num_screens; /* Used for drawing the layout */ GdkRectangle dim; /* Bounding box of All X screens (Absolute coords) */ int xinerama_enabled; } nvLayout, *nvLayoutPtr; typedef void (* ctk_display_layout_selected_callback) (nvLayoutPtr, void *); typedef void (* ctk_display_layout_modified_callback) (nvLayoutPtr, void *); /* Stores information about a screen or display that * is being moved/panned. */ typedef struct ModifyInfoRec { /* What to move */ nvDisplayPtr display; nvScreenPtr screen; GdkRectangle orig_screen_dim; // Used when moding display = moding screen. int orig_position_type; // Original values of what is being GdkRectangle orig_dim; // modified. int *target_position_type; // Pointers to values of thing that GdkRectangle *target_dim; // is being modified. /* Snapping */ int snap; // Should we snap or not? int best_snap_v; int best_snap_h; int modify_dirty; // Sync the modify_dim before moving/panning. int modify_panning; // Modifying panning (instead of position) GdkRectangle modify_dim; // Dimensions to snap from GdkRectangle src_dim; // Pre-snap (To allow snapping of pan box on move) GdkRectangle dst_dim; // Post-snap position } ModifyInfo; // Something selectable/visible. typedef struct _ZNode { enum { ZNODE_TYPE_DISPLAY, ZNODE_TYPE_SCREEN, } type; union { nvDisplayPtr display; nvScreenPtr screen; } u; } ZNode; typedef struct _CtkDisplayLayout { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; GtkWidget *drawing_area; /* Drawing area */ GtkWidget *tooltip_area; /* Tooltip area */ GtkTooltips *tooltip_group; /* Tooltip group */ /* Layout configuration */ nvLayoutPtr layout; /* Double buffering of layout image */ GdkPixmap *pixmap; /* Image information */ GdkRectangle img_dim; float scale; /* Colors */ GdkColor *color_palettes; /* Colors to use to display screens */ GdkColor fg_color; GdkColor bg_color; GdkColor select_color; /* Pango layout for strings in layout image */ PangoLayout *pango_layout; /* List of visible elements in the layout */ ZNode *Zorder; /* Z ordering of visible elements in layout */ int Zcount; /* Count of visible elements in the z order */ nvDisplayPtr selected_display; /* Currently selected display */ nvScreenPtr selected_screen; /* Selected screen */ /* Settings */ int snap_strength; int advanced_mode; /* Allow advanced layout modifications: */ /* - panning */ /* - multiple modes */ /* State */ int clicked_outside; /* User clicked outside displays, don't move */ ModifyInfo modify_info; /* Used to move/pan screens/displays */ int button1; int button2; int button3; int mouse_x; int mouse_y; int last_mouse_x; int last_mouse_y; ctk_display_layout_selected_callback selected_callback; void *selected_callback_data; ctk_display_layout_modified_callback modified_callback; void *modified_callback_data; } CtkDisplayLayout; typedef struct _CtkDisplayLayoutClass { GtkVBoxClass parent_class; } CtkDisplayLayoutClass; GType ctk_display_layout_get_type (void) G_GNUC_CONST; GtkWidget* ctk_display_layout_new (NvCtrlAttributeHandle *, CtkConfig *, nvLayoutPtr, /* Layout to display */ int, /* Width of image */ int /* Height of image */ ); void ctk_display_layout_update (CtkDisplayLayout *); void ctk_display_layout_set_layout (CtkDisplayLayout *, nvLayoutPtr); void ctk_display_layout_update_zorder(CtkDisplayLayout *ctk_object); nvDisplayPtr ctk_display_layout_get_selected_display (CtkDisplayLayout *); nvScreenPtr ctk_display_layout_get_selected_screen (CtkDisplayLayout *); void ctk_display_layout_set_mode_modeline(CtkDisplayLayout *, nvModePtr mode, nvModeLinePtr modeline, const nvSize *viewPortIn, const GdkRectangle *viewPortOut); void ctk_display_layout_set_mode_viewport_in(CtkDisplayLayout *ctk_object, nvModePtr mode, int w, int h, Bool update_panning_size); void ctk_display_layout_set_mode_viewport_out(CtkDisplayLayout *ctk_object, nvModePtr mode, int x, int y, int w, int h); void ctk_display_layout_set_display_position (CtkDisplayLayout *ctk_object, nvDisplayPtr display, int position_type, nvDisplayPtr relative_to, int x, int y); void ctk_display_layout_set_display_panning (CtkDisplayLayout *ctk_object, nvDisplayPtr display, int width, int height); void ctk_display_layout_set_display_rotation (CtkDisplayLayout *ctk_object, nvDisplayPtr display, Rotation rotation); void ctk_display_layout_set_display_reflection (CtkDisplayLayout *ctk_object, nvDisplayPtr display, Reflection reflection); void ctk_display_layout_select_display (CtkDisplayLayout *ctk_object, nvDisplayPtr display); void ctk_display_layout_select_screen (CtkDisplayLayout *ctk_object, nvScreenPtr screen); void ctk_display_layout_update_display_count (CtkDisplayLayout *, nvDisplayPtr); void ctk_display_layout_set_screen_virtual_size (CtkDisplayLayout *ctk_object, nvScreenPtr screen, int width, int height); void ctk_display_layout_set_screen_depth (CtkDisplayLayout *ctk_object, nvScreenPtr screen, int depth); void ctk_display_layout_set_screen_position (CtkDisplayLayout *ctk_object, nvScreenPtr screen, int position_type, nvScreenPtr relative_to, int x, int y); void ctk_display_layout_set_screen_metamode (CtkDisplayLayout *, nvScreenPtr screen, int new_mode); void ctk_display_layout_add_screen_metamode (CtkDisplayLayout *, nvScreenPtr); void ctk_display_layout_delete_screen_metamode (CtkDisplayLayout *, nvScreenPtr, int metamode_idx, Bool reselect); void ctk_display_layout_disable_display (CtkDisplayLayout *ctk_object, nvDisplayPtr display); void ctk_display_layout_set_advanced_mode (CtkDisplayLayout *ctk_object, int advanced_mode); void ctk_display_layout_register_callbacks(CtkDisplayLayout *ctk_object, ctk_display_layout_selected_callback, void *selected_callback_data, ctk_display_layout_modified_callback, void *modified_callback_data); G_END_DECLS #endif /* __CTK_DISPLAYLAYOUT_H__ */ nvidia-settings/src/gtk+-2.x/ctkdropdownmenu.c0000664000175000017500000002410512236467170021467 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "ctkdropdownmenu.h" enum { DROP_DOWN_MENU_CHANGED_SIGNAL, LAST_SIGNAL }; static guint __signals[LAST_SIGNAL] = { 0 }; static void ctk_drop_down_menu_class_init(CtkDropDownMenuClass *ctk_drop_down_menu_class); static void ctk_drop_down_menu_free(GObject *object); GType ctk_drop_down_menu_get_type( void ) { static GType ctk_drop_down_menu_type = 0; if (!ctk_drop_down_menu_type) { static const GTypeInfo ctk_drop_down_menu_info = { sizeof (CtkDropDownMenuClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ctk_drop_down_menu_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkDropDownMenu), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_drop_down_menu_type = g_type_register_static(GTK_TYPE_VBOX, "CtkDropDownMenu", &ctk_drop_down_menu_info, 0); } return ctk_drop_down_menu_type; } static void ctk_drop_down_menu_class_init(CtkDropDownMenuClass *ctk_drop_down_menu_class) { GObjectClass *gobject_class; gobject_class = (GObjectClass *) ctk_drop_down_menu_class; gobject_class->finalize = ctk_drop_down_menu_free; __signals[DROP_DOWN_MENU_CHANGED_SIGNAL] = g_signal_new("changed", G_TYPE_FROM_CLASS(ctk_drop_down_menu_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } /* * changed() - emit the "changed" signal */ static void changed(GtkWidget *menu, gpointer user_data) { CtkDropDownMenu *d = CTK_DROP_DOWN_MENU(user_data); g_signal_emit(G_OBJECT(d), __signals[DROP_DOWN_MENU_CHANGED_SIGNAL], 0); } /* changed() */ /* * ctk_drop_down_menu_free() - free internal data allocated by the * CtkDropDownMenu */ static void ctk_drop_down_menu_free(GObject *object) { CtkDropDownMenu *d; d = CTK_DROP_DOWN_MENU(object); g_free(d->values); if (d->glist) { g_list_free(d->glist); } } /* ctk_drop_down_menu_free() */ /* * ctk_drop_down_menu_change_object() - abstract out the actual widget * that is being used, so that users of CtkDropDownMenu don't have to * know if the gtk widget is GtkCombo or GtkOptionMenu or anything else. */ GObject *ctk_drop_down_menu_change_object(GtkWidget* widget) { CtkDropDownMenu *d = CTK_DROP_DOWN_MENU(widget); if (d->flags & CTK_DROP_DOWN_MENU_FLAG_COMBO) { return G_OBJECT(GTK_EDITABLE(GTK_COMBO(d->menu)->entry)); } else { return G_OBJECT(d->option_menu); } } /* ctk_drop_down_menu_change_object() */ /* * ctk_drop_down_menu_changed() - callback function for GtkCombo menu * changed. */ static void ctk_drop_down_menu_changed(GtkEditable *editable, gpointer user_data) { int i; CtkDropDownMenu *d = CTK_DROP_DOWN_MENU(user_data); const gchar *str = gtk_entry_get_text(GTK_ENTRY(editable)); for (i = 0; i < d->num_entries; i++) { if (strcmp(d->values[i].glist_item, str) == 0) { d->current_selected_item = i; break; } } g_signal_emit(G_OBJECT(d), __signals[DROP_DOWN_MENU_CHANGED_SIGNAL], 0); } /* * ctk_drop_down_menu_new() - constructor for the CtkDropDownMenu widget */ GtkWidget* ctk_drop_down_menu_new(guint flags) { GObject *object; CtkDropDownMenu *d; GtkWidget *menu_widget; // used to emit "changed" signal object = g_object_new(CTK_TYPE_DROP_DOWN_MENU, NULL); d = CTK_DROP_DOWN_MENU(object); d->flags = flags; d->values = NULL; d->num_entries = 0; if (flags & CTK_DROP_DOWN_MENU_FLAG_COMBO) { d->menu = gtk_combo_new(); menu_widget = d->menu; g_signal_connect(G_OBJECT(GTK_EDITABLE(GTK_COMBO(d->menu)->entry)), "changed", G_CALLBACK(ctk_drop_down_menu_changed), (gpointer) d); } else { d->option_menu = gtk_option_menu_new(); d->menu = gtk_menu_new(); gtk_option_menu_set_menu(GTK_OPTION_MENU(d->option_menu), d->menu); menu_widget = d->option_menu; g_signal_connect(G_OBJECT(d->option_menu), "changed", G_CALLBACK(changed), (gpointer) d); } gtk_box_set_spacing(GTK_BOX(d), 0); gtk_box_pack_start(GTK_BOX(d), menu_widget, FALSE, FALSE, 0); return GTK_WIDGET(d); } /* ctk_drop_down_menu_new() */ /* * ctk_drop_down_menu_reset() - Clears the internal menu */ void ctk_drop_down_menu_reset(CtkDropDownMenu *d) { if (d->glist) { g_list_free(d->glist); d->glist = NULL; } if (d->values) { g_free(d->values); d->values = NULL; } d->num_entries = 0; if (!(d->flags & CTK_DROP_DOWN_MENU_FLAG_COMBO)) { d->menu = gtk_menu_new(); gtk_option_menu_set_menu(GTK_OPTION_MENU(d->option_menu), d->menu); } } /* ctk_drop_down_menu_reset() */ /* * ctk_drop_down_menu_append_item() - add a new entry to the drop down * menu */ GtkWidget *ctk_drop_down_menu_append_item(CtkDropDownMenu *d, const gchar *name, const gint value) { GtkWidget *label = NULL; d->values = g_realloc(d->values, sizeof(CtkDropDownMenuValue) * (d->num_entries + 1)); if (d->flags & CTK_DROP_DOWN_MENU_FLAG_COMBO) { d->glist = g_list_append(d->glist, g_strdup(name)); gtk_combo_set_popdown_strings(GTK_COMBO(d->menu), d->glist); gtk_editable_set_editable(GTK_EDITABLE(GTK_COMBO(d->menu)->entry), FALSE); d->values[d->num_entries].glist_item = g_strdup(name); } else { GtkWidget *menu_item, *alignment; gchar *str; menu_item = gtk_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(d->menu), menu_item); if (d->flags & CTK_DROP_DOWN_MENU_FLAG_MONOSPACE) { str = g_strconcat("", name, "", NULL); label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), str); g_free(str); } else { label = gtk_label_new(name); } alignment = gtk_alignment_new(0, 0, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), label); gtk_container_add(GTK_CONTAINER(menu_item), alignment); d->values[d->num_entries].menu_item = menu_item; } d->values[d->num_entries].value = value; d->num_entries++; return label; } /* ctk_drop_down_menu_append_item() */ /* * ctk_drop_down_menu_get_current_value() - return the current value * selected in the drop down menu, or 0 if the current item is undefined. */ gint ctk_drop_down_menu_get_current_value(CtkDropDownMenu *d) { gint i; if (d->flags & CTK_DROP_DOWN_MENU_FLAG_COMBO) { i = d->current_selected_item; } else { i = gtk_option_menu_get_history(GTK_OPTION_MENU(d->option_menu)); } if (i < d->num_entries) { return d->values[i].value; } else { return 0; /* XXX??? */ } } /* ctk_drop_down_menu_get_current_value() */ /* * ctk_drop_down_menu_get_current_name() - get the current name in the menu, or * an empty string if the current item is undefined. The returned string points * to internally allocated storage in the widget and must not be modified, * freed, or stored. */ const char *ctk_drop_down_menu_get_current_name(CtkDropDownMenu *d) { gint i; if (d->flags & CTK_DROP_DOWN_MENU_FLAG_COMBO) { i = d->current_selected_item; } else { i = gtk_option_menu_get_history(GTK_OPTION_MENU(d->option_menu)); } if (i < d->num_entries) { return d->values[i].glist_item; } else { return ""; /* XXX??? */ } } /* * ctk_drop_down_menu_set_current_value() - set the current value in * the menu */ void ctk_drop_down_menu_set_current_value(CtkDropDownMenu *d, gint value) { gint i; for (i = 0; i < d->num_entries; i++) { if (d->values[i].value == value) { if (d->flags & CTK_DROP_DOWN_MENU_FLAG_COMBO) { gtk_entry_set_text (GTK_ENTRY(GTK_COMBO(d->menu)->entry), d->values[i].glist_item); } else { gtk_option_menu_set_history(GTK_OPTION_MENU(d->option_menu), i); } return; } } } /* ctk_drop_down_menu_set_current_value() */ /* * ctk_drop_down_menu_set_value_sensitive() - set the specified * value's sensitivity */ void ctk_drop_down_menu_set_value_sensitive(CtkDropDownMenu *d, gint value, gboolean sensitive) { if (d->flags & CTK_DROP_DOWN_MENU_FLAG_COMBO) { ctk_drop_down_menu_set_current_value(d, value); gtk_widget_set_sensitive(GTK_WIDGET(GTK_COMBO(d->menu)->entry), sensitive); } else { gint i; for (i = 0; i < d->num_entries; i++) { if (d->values[i].value == value) { gtk_widget_set_sensitive(d->values[i].menu_item, sensitive); return; } } } } /* ctk_drop_down_menu_set_value_sensitive() */ nvidia-settings/src/gtk+-2.x/ctkgauge.h0000664000175000017500000000406012236467170020041 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_GAUGE_H__ #define __CTK_GAUGE_H__ G_BEGIN_DECLS #define CTK_TYPE_GAUGE (ctk_gauge_get_type()) #define CTK_GAUGE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_GAUGE, CtkGauge)) #define CTK_GAUGE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_GAUGE, CtkGaugeClass)) #define CTK_IS_GAUGE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_GAUGE)) #define CTK_IS_GAUGE_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_GAUGE)) #define CTK_GAUGE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_GAUGE, CtkGaugeClass)) typedef struct _CtkGauge CtkGauge; typedef struct _CtkGaugeClass CtkGaugeClass; struct _CtkGauge { GtkDrawingArea parent; gint lower, upper; gint current; GdkColormap *gdk_colormap; GdkColor gdk_color_gray; GdkColor gdk_color_red; GdkColor gdk_color_yellow; GdkColor gdk_color_green; GdkPixmap *gdk_pixmap; GdkGC *gdk_gc; PangoLayout *pango_layout; gint width, height; }; struct _CtkGaugeClass { GtkDrawingAreaClass parent_class; }; GType ctk_gauge_get_type (void) G_GNUC_CONST; GtkWidget* ctk_gauge_new (gint, gint); void ctk_gauge_set_current (CtkGauge *, gint); void ctk_gauge_draw (CtkGauge *); G_END_DECLS #endif /* __CTK_GAUGE_H__ */ nvidia-settings/src/gtk+-2.x/ctkdisplaydevice.c0000664000175000017500000006553212236467170021604 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004,2012 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include "ctkbanner.h" #include "ctkdisplaydevice.h" #include "ctkditheringcontrols.h" #include "ctkcolorcontrols.h" #include "ctkimagesliders.h" #include "ctkedid.h" #include "ctkcolorcorrection.h" #include "ctkconfig.h" #include "ctkhelp.h" #include "ctkutils.h" static void ctk_display_device_class_init(CtkDisplayDeviceClass *); static void ctk_display_device_finalize(GObject *); static void reset_button_clicked(GtkButton *button, gpointer user_data); static void update_device_info(CtkDisplayDevice *ctk_object); static void display_device_setup(CtkDisplayDevice *ctk_object); static void enabled_displays_received(GtkObject *object, gpointer arg1, gpointer user_data); static void callback_link_changed(GtkObject *object, gpointer arg1, gpointer user_data); static void callback_refresh_rate_changed(GtkObject *object, gpointer arg1, gpointer user_data); static gboolean update_tv_encoder_info(InfoEntry *entry); static gboolean update_chip_info(InfoEntry *entry); static gboolean update_signal_info(InfoEntry *entry); static gboolean update_link_info(InfoEntry *entry); static gboolean update_refresh_rate(InfoEntry *entry); static gboolean register_link_events(InfoEntry *entry); static gboolean unregister_link_events(InfoEntry *entry); static gboolean register_refresh_rate_events(InfoEntry *entry); static gboolean unregister_refresh_rate_events(InfoEntry *entry); static void add_color_correction_tab(CtkDisplayDevice *ctk_object, CtkConfig *ctk_config, CtkEvent *ctk_event, GtkWidget *notebook, ParsedAttribute *p); #define FRAME_PADDING 5 static const char *__info_help = "This section describes basic information about the connection to the display " "device."; static const char* __tv_encoder_name_help = "The TV Encoder name displays the name of the TV Encoder."; static const char *__info_chip_location_help = "Report whether the display device is driven by the on-chip controller " "(internal), or a separate controller chip elsewhere on the graphics " "board (external)."; static const char *__info_link_help = "For DVI connections, reports whether the specified display device is " "driven by a single link or dual link connection. For DisplayPort " "connections, reports the bandwidth of the connection."; static const char *__info_signal_help = "Report whether the flat panel is driven by an LVDS, TMDS, or DisplayPort " "signal."; static const char * __refresh_rate_help = "The refresh rate displays the rate at which the screen is currently " "refreshing the image."; typedef gboolean (*InfoEntryFunc)(InfoEntry *entry); typedef struct { const char *str; const gchar **tooltip; InfoEntryFunc update_func; /* return FALSE if not present */ InfoEntryFunc register_events_func; InfoEntryFunc unregister_events_func; } InfoEntryData; static InfoEntryData __info_entry_data[] = { { "TV Encoder:", &__tv_encoder_name_help, update_tv_encoder_info, NULL, NULL, }, { "Chip Location", &__info_chip_location_help, update_chip_info, NULL, NULL, }, { "Signal", &__info_signal_help, update_signal_info, NULL, NULL, }, { "Connection link", &__info_link_help, update_link_info, register_link_events, unregister_link_events, }, { "Refresh Rate", &__refresh_rate_help, update_refresh_rate, register_refresh_rate_events, unregister_refresh_rate_events, }, }; GType ctk_display_device_get_type(void) { static GType ctk_object_type = 0; if (!ctk_object_type) { static const GTypeInfo ctk_object_info = { sizeof (CtkDisplayDeviceClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ctk_display_device_class_init, NULL, /* class_finalize, */ NULL, /* class_data */ sizeof (CtkDisplayDevice), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_object_type = g_type_register_static(GTK_TYPE_VBOX, "CtkDisplayDevice", &ctk_object_info, 0); } return ctk_object_type; } static void ctk_display_device_class_init( CtkDisplayDeviceClass *ctk_object_class ) { GObjectClass *gobject_class = (GObjectClass *)ctk_object_class; gobject_class->finalize = ctk_display_device_finalize; } static void ctk_display_device_finalize( GObject *object ) { CtkDisplayDevice *ctk_object = CTK_DISPLAY_DEVICE(object); int i; g_signal_handlers_disconnect_matched(G_OBJECT(ctk_object->ctk_event_gpu), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, (gpointer) ctk_object); for (i = 0; i < ctk_object->num_info_entries; i++) { InfoEntryData *entryData = &__info_entry_data[i]; InfoEntry *entry = &ctk_object->info_entries[i]; if (entryData->unregister_events_func) { entryData->unregister_events_func(entry); } } g_free(ctk_object->name); } /* * ctk_display_device_new() - constructor for the dissplay device page. */ GtkWidget* ctk_display_device_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event, CtkEvent *ctk_event_gpu, char *name, char *typeBaseName, ParsedAttribute *p) { GObject *object; CtkDisplayDevice *ctk_object; GtkWidget *banner; GtkWidget *hbox, *tmpbox; GtkWidget *alignment; GtkWidget *notebook; GtkWidget *nbox; GtkWidget *align; GtkWidget *label; GtkWidget *hseparator; GtkWidget *button; gchar *str; int i; object = g_object_new(CTK_TYPE_DISPLAY_DEVICE, NULL); if (!object) return NULL; ctk_object = CTK_DISPLAY_DEVICE(object); ctk_object->handle = handle; ctk_object->ctk_event = ctk_event; ctk_object->ctk_event_gpu = ctk_event_gpu; ctk_object->ctk_config = ctk_config; ctk_object->name = g_strdup(name); ctk_object->color_correction_available = FALSE; gtk_box_set_spacing(GTK_BOX(object), 10); /* Banner */ if (strcmp(typeBaseName, "CRT") == 0) { banner = ctk_banner_image_new(BANNER_ARTWORK_CRT); } else { banner = ctk_banner_image_new(BANNER_ARTWORK_DFP); } gtk_box_pack_start(GTK_BOX(object), banner, FALSE, FALSE, 0); /* Create tabbed notebook for widget */ notebook = gtk_notebook_new(); gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP); gtk_box_pack_start(GTK_BOX(object), notebook, TRUE, TRUE, 0); /* Create first tab for device info */ nbox = gtk_vbox_new(FALSE, FRAME_PADDING); gtk_container_set_border_width(GTK_CONTAINER(nbox), FRAME_PADDING); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), nbox, gtk_label_new("Information")); /* Device info */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(nbox), hbox, FALSE, FALSE, 0); label = gtk_label_new("Display Device Information"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); /* create the hbox to store device info */ hbox = gtk_hbox_new(FALSE, FRAME_PADDING); gtk_box_pack_start(GTK_BOX(nbox), hbox, FALSE, FALSE, FRAME_PADDING); /* * insert a vbox between the frame and the widgets, so that the * widgets don't expand to fill all of the space within the * frame */ tmpbox = gtk_vbox_new(FALSE, FRAME_PADDING); gtk_container_set_border_width(GTK_CONTAINER(tmpbox), FRAME_PADDING); gtk_container_add(GTK_CONTAINER(hbox), tmpbox); /* Create and add the information widgets */ ctk_object->num_info_entries = ARRAY_LEN(__info_entry_data); ctk_object->info_entries = calloc(ctk_object->num_info_entries, sizeof(InfoEntry)); if (!ctk_object->info_entries) { ctk_object->num_info_entries = 0; } for (i = 0; i < ctk_object->num_info_entries; i++) { InfoEntryData *entryData = __info_entry_data+i; InfoEntry *entry = ctk_object->info_entries+i; gchar *str; entry->ctk_object = ctk_object; str = g_strconcat(entryData->str, ":", NULL); entry->label = gtk_label_new(str); g_free(str); entry->txt = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(entry->label), 0.0f, 0.5f); gtk_misc_set_alignment(GTK_MISC(entry->txt), 0.0f, 0.5f); ctk_config_set_tooltip(ctk_config, entry->label, *(entryData->tooltip)); ctk_config_set_tooltip(ctk_config, entry->txt, *(entryData->tooltip)); entry->hbox = gtk_hbox_new(FALSE, FRAME_PADDING); gtk_box_pack_start(GTK_BOX(entry->hbox), entry->label, FALSE, TRUE, FRAME_PADDING); gtk_box_pack_start(GTK_BOX(entry->hbox), entry->txt, FALSE, TRUE, FRAME_PADDING); gtk_box_pack_start(GTK_BOX(tmpbox), entry->hbox, FALSE, FALSE, 0); } /* pack the EDID button */ ctk_object->edid = ctk_edid_new(ctk_object->handle, ctk_object->ctk_config, ctk_object->ctk_event, ctk_object->name); hbox = gtk_hbox_new(FALSE, 0); align = gtk_alignment_new(0, 1, 1, 1); gtk_container_add(GTK_CONTAINER(align), hbox); gtk_box_pack_end(GTK_BOX(nbox), align, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_object->edid, TRUE, TRUE, 0); /* * Create layout for second tab for controls but don't add the tab until we * make sure it's required */ nbox = gtk_vbox_new(FALSE, FRAME_PADDING); gtk_container_set_border_width(GTK_CONTAINER(nbox), FRAME_PADDING); /* pack the reset button */ button = gtk_button_new_with_label("Reset Hardware Defaults"); str = ctk_help_create_reset_hardware_defaults_text(typeBaseName, name); ctk_config_set_tooltip(ctk_config, button, str); ctk_object->reset_button = button; alignment = gtk_alignment_new(1, 1, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), button); gtk_box_pack_end(GTK_BOX(nbox), alignment, FALSE, FALSE, 0); /* pack the color controls */ ctk_object->color_controls = ctk_color_controls_new(handle, ctk_config, ctk_event, ctk_object->reset_button, name); if (ctk_object->color_controls) { gtk_box_pack_start(GTK_BOX(nbox), ctk_object->color_controls, FALSE, FALSE, 0); } /* pack the dithering controls */ ctk_object->dithering_controls = ctk_dithering_controls_new(handle, ctk_config, ctk_event, ctk_object->reset_button, name); if (ctk_object->dithering_controls) { gtk_box_pack_start(GTK_BOX(nbox), ctk_object->dithering_controls, FALSE, FALSE, 0); } /* pack the image sliders */ ctk_object->image_sliders = ctk_image_sliders_new(handle, ctk_config, ctk_event, ctk_object->reset_button, name); if (ctk_object->image_sliders) { gtk_box_pack_start(GTK_BOX(nbox), ctk_object->image_sliders, FALSE, FALSE, 0); } /* If no controls are created, don't add a controls tab */ if (ctk_object->color_controls || ctk_object->dithering_controls || ctk_object->image_sliders) { gtk_notebook_append_page(GTK_NOTEBOOK(notebook), nbox, gtk_label_new("Controls")); } /* add the color correction tab if RandR is available */ add_color_correction_tab(ctk_object, ctk_config, ctk_event, notebook, p); /* Update the GUI */ gtk_widget_show_all(GTK_WIDGET(object)); display_device_setup(ctk_object); /* Listen to events */ g_signal_connect(G_OBJECT(ctk_object->reset_button), "clicked", G_CALLBACK(reset_button_clicked), (gpointer) ctk_object); g_signal_connect(G_OBJECT(ctk_event_gpu), CTK_EVENT_NAME(NV_CTRL_ENABLED_DISPLAYS), G_CALLBACK(enabled_displays_received), (gpointer) ctk_object); for (i = 0; i < ctk_object->num_info_entries; i++) { InfoEntryData *entryData = __info_entry_data+i; InfoEntry *entry = ctk_object->info_entries+i; if (entryData->register_events_func) { entryData->register_events_func(entry); } } return GTK_WIDGET(object); } /* ctk_display_device_new() */ /* * reset_button_clicked() - callback when the reset button is clicked */ static void reset_button_clicked(GtkButton *button, gpointer user_data) { CtkDisplayDevice *ctk_object = CTK_DISPLAY_DEVICE(user_data); /* Disable the reset button here and allow the controls below to (re)enable * it if need be,. */ gtk_widget_set_sensitive(ctk_object->reset_button, FALSE); ctk_color_controls_reset(CTK_COLOR_CONTROLS(ctk_object->color_controls)); ctk_dithering_controls_reset (CTK_DITHERING_CONTROLS(ctk_object->dithering_controls)); ctk_image_sliders_reset(CTK_IMAGE_SLIDERS(ctk_object->image_sliders)); ctk_config_statusbar_message(ctk_object->ctk_config, "Reset hardware defaults for %s.", ctk_object->name); } /* reset_button_clicked() */ /* * ctk_display_device_create_help() - construct the display device help page */ GtkTextBuffer *ctk_display_device_create_help(GtkTextTagTable *table, CtkDisplayDevice *ctk_object) { GtkTextIter i; GtkTextBuffer *b; GtkTooltipsData *td; int j; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "%s Help", ctk_object->name); ctk_help_heading(b, &i, "Device Information"); ctk_help_para(b, &i, "%s", __info_help); for (j = 0; j < ARRAY_LEN(__info_entry_data); j++) { InfoEntryData *entryData = __info_entry_data+j; InfoEntry *entry = ctk_object->info_entries+j; if (entry->present) { ctk_help_term(b, &i, "%s", entryData->str); ctk_help_para(b, &i, "%s", *entryData->tooltip); } } add_acquire_edid_help(b, &i); add_color_controls_help (CTK_COLOR_CONTROLS(ctk_object->color_controls), b, &i); add_dithering_controls_help (CTK_DITHERING_CONTROLS(ctk_object->dithering_controls), b, &i); add_image_sliders_help (CTK_IMAGE_SLIDERS(ctk_object->image_sliders), b, &i); if (ctk_object->color_correction_available) { ctk_color_correction_tab_help(b, &i, "X Server Color Correction", TRUE); } td = gtk_tooltips_data_get(GTK_WIDGET(ctk_object->reset_button)); ctk_help_reset_hardware_defaults(b, &i, td->tip_text); ctk_help_finish(b); return b; } /* ctk_display_device_create_help() */ static gboolean update_tv_encoder_info(InfoEntry *entry) { CtkDisplayDevice *ctk_object = entry->ctk_object; ReturnStatus ret; char *str; ret = NvCtrlGetStringDisplayAttribute(ctk_object->handle, 0, NV_CTRL_STRING_TV_ENCODER_NAME, &str); if (ret != NvCtrlSuccess) { return FALSE; } gtk_label_set_text(GTK_LABEL(entry->txt), str); XFree(str); return TRUE; } static gboolean update_chip_info(InfoEntry *entry) { CtkDisplayDevice *ctk_object = entry->ctk_object; ReturnStatus ret; gint val; const gchar *str; ret = NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_FLATPANEL_CHIP_LOCATION, &val); if (ret != NvCtrlSuccess) { return FALSE; } switch (val) { case NV_CTRL_FLATPANEL_CHIP_LOCATION_INTERNAL: str = "Internal"; break; case NV_CTRL_FLATPANEL_CHIP_LOCATION_EXTERNAL: str = "External"; break; default: str = "Unknown"; break; } gtk_label_set_text(GTK_LABEL(entry->txt), str); return TRUE; } static gboolean update_signal_info(InfoEntry *entry) { CtkDisplayDevice *ctk_object = entry->ctk_object; ReturnStatus ret; gint val; const char *str; ret = NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_FLATPANEL_SIGNAL, &val); if (ret != NvCtrlSuccess) { return FALSE; } switch (val) { case NV_CTRL_FLATPANEL_SIGNAL_LVDS: str = "LVDS"; break; case NV_CTRL_FLATPANEL_SIGNAL_TMDS: str = "TMDS"; break; case NV_CTRL_FLATPANEL_SIGNAL_DISPLAYPORT: str = "DisplayPort"; break; default: str = "Unknown"; break; } gtk_label_set_text(GTK_LABEL(entry->txt), str); ctk_object->signal_type = val; return TRUE; } /* NOTE: Link information is dependent on signal type, and this function * assumes the signal type is queried first. */ static gboolean update_link_info(InfoEntry *entry) { CtkDisplayDevice *ctk_object = entry->ctk_object; ReturnStatus ret; gint val; const char *link; char tmp[32]; ret = NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_FLATPANEL_LINK, &val); if (ret != NvCtrlSuccess) { return FALSE; } if (ctk_object->signal_type == NV_CTRL_FLATPANEL_SIGNAL_DISPLAYPORT) { int lanes; lanes = val + 1; ret = NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_DISPLAYPORT_LINK_RATE, &val); if ((ret == NvCtrlSuccess) && (val == NV_CTRL_DISPLAYPORT_LINK_RATE_DISABLED)) { link = "Disabled"; } else { if (ret != NvCtrlSuccess) { val = 0; } if (val > 0) { snprintf(tmp, 32, "%d lane%s @ %.2f Gbps", lanes, lanes == 1 ? "" : "s", val * 0.27); } else { snprintf(tmp, 32, "%d lane%s @ unknown bandwidth", lanes, lanes == 1 ? "" : "s"); } link = tmp; } } else { // LVDS or TMDS switch(val) { case NV_CTRL_FLATPANEL_LINK_SINGLE: link = "Single"; break; case NV_CTRL_FLATPANEL_LINK_DUAL: link = "Dual"; break; default: link = "Unknown"; break; } } gtk_label_set_text(GTK_LABEL(entry->txt), link); return TRUE; } static gboolean update_refresh_rate(InfoEntry *entry) { CtkDisplayDevice *ctk_object = entry->ctk_object; ReturnStatus ret; gint val; gboolean hdmi3D; char *str; float fvalue; ret = NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_REFRESH_RATE, &val); if (ret != NvCtrlSuccess) { return FALSE; } ret = NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_DPY_HDMI_3D, &hdmi3D); if (ret != NvCtrlSuccess) { return FALSE; } fvalue = ((float)(val)) / 100.0f; if (hdmi3D) { fvalue /= 2; } str = g_strdup_printf("%.2f Hz%s", fvalue, hdmi3D ? " (HDMI 3D)" : ""); gtk_label_set_text(GTK_LABEL(entry->txt), str); g_free(str); return TRUE; } /* * update_device_info() - (Re)Queries the static display device information. */ static void update_device_info(CtkDisplayDevice *ctk_object) { int i; int max_width; GtkRequisition req; max_width = 0; for (i = 0; i < ctk_object->num_info_entries; i++) { InfoEntryData *entryData = __info_entry_data+i; InfoEntry *entry = ctk_object->info_entries+i; entry->present = entryData->update_func(entry); if (entry->present) { gtk_widget_show(entry->hbox); gtk_widget_size_request(entry->label, &req); if (max_width < req.width) { max_width = req.width; } } else { gtk_widget_hide(entry->hbox); } } for (i = 0; i < ctk_object->num_info_entries; i++) { InfoEntry *entry = ctk_object->info_entries+i; if (entry->present) { gtk_widget_set_size_request(entry->label, max_width, -1); } } } /* update_device_info() */ /* * Updates the display device page to reflect the current * configuration of the display device. */ static void display_device_setup(CtkDisplayDevice *ctk_object) { /* Disable the reset button here and allow the controls below to (re)enable * it if need be,. */ gtk_widget_set_sensitive(ctk_object->reset_button, FALSE); update_display_enabled_flag(ctk_object->handle, &ctk_object->display_enabled); /* Update info */ update_device_info(ctk_object); ctk_edid_setup(CTK_EDID(ctk_object->edid)); /* Update controls */ ctk_color_controls_setup(CTK_COLOR_CONTROLS(ctk_object->color_controls)); ctk_dithering_controls_setup (CTK_DITHERING_CONTROLS(ctk_object->dithering_controls)); ctk_image_sliders_setup(CTK_IMAGE_SLIDERS(ctk_object->image_sliders)); } /* display_device_setup() */ static gboolean register_link_events(InfoEntry *entry) { CtkDisplayDevice *ctk_object = entry->ctk_object; g_signal_connect(G_OBJECT(ctk_object->ctk_event), CTK_EVENT_NAME(NV_CTRL_FLATPANEL_LINK), G_CALLBACK(callback_link_changed), (gpointer) entry); g_signal_connect(G_OBJECT(ctk_object->ctk_event), CTK_EVENT_NAME(NV_CTRL_DISPLAYPORT_LINK_RATE), G_CALLBACK(callback_link_changed), (gpointer) entry); return TRUE; } static gboolean unregister_link_events(InfoEntry *entry) { CtkDisplayDevice *ctk_object = entry->ctk_object; g_signal_handlers_disconnect_matched(G_OBJECT(ctk_object->ctk_event), G_SIGNAL_MATCH_DATA, 0, /* signal_id */ 0, /* detail */ NULL, /* closure */ NULL, /* func */ (gpointer) entry); return TRUE; } static gboolean register_refresh_rate_events(InfoEntry *entry) { CtkDisplayDevice *ctk_object = entry->ctk_object; g_signal_connect(G_OBJECT(ctk_object->ctk_event), CTK_EVENT_NAME(NV_CTRL_REFRESH_RATE), G_CALLBACK(callback_refresh_rate_changed), (gpointer) entry); return TRUE; } static gboolean unregister_refresh_rate_events(InfoEntry *entry) { CtkDisplayDevice *ctk_object = entry->ctk_object; g_signal_handlers_disconnect_matched(G_OBJECT(ctk_object->ctk_event), G_SIGNAL_MATCH_DATA, 0, /* signal_id */ 0, /* detail */ NULL, /* closure */ NULL, /* func */ (gpointer) entry); return TRUE; } /* * When the list of enabled displays on the GPU changes, * this page should disable/enable access based on whether * or not the display device is enabled. */ static void enabled_displays_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkDisplayDevice *ctk_object = CTK_DISPLAY_DEVICE(user_data); /* Requery display information only if display disabled */ display_device_setup(ctk_object); } /* enabled_displays_received() */ static void callback_link_changed(GtkObject *object, gpointer arg1, gpointer user_data) { InfoEntry *entry = (InfoEntry *)user_data; update_link_info(entry); } static void callback_refresh_rate_changed(GtkObject *object, gpointer arg1, gpointer user_data) { InfoEntry *entry = (InfoEntry *)user_data; update_refresh_rate(entry); } static void add_color_correction_tab(CtkDisplayDevice *ctk_object, CtkConfig *ctk_config, CtkEvent *ctk_event, GtkWidget *notebook, ParsedAttribute *p) { ReturnStatus ret; gint val; GtkWidget *ctk_color_correction; GtkWidget *box; ret = NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_ATTR_RANDR_GAMMA_AVAILABLE, &val); if (ret != NvCtrlSuccess) { return; } if (val != 1) { return; } ctk_color_correction = ctk_color_correction_new(ctk_object->handle, ctk_config, p, ctk_event); if (ctk_color_correction == NULL) { return; } ctk_object->color_correction_available = TRUE; box = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(box), FRAME_PADDING); gtk_box_pack_start(GTK_BOX(box), ctk_color_correction, TRUE, TRUE, 0); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), box, gtk_label_new("Color Correction")); } nvidia-settings/src/gtk+-2.x/ctkgauge.c0000664000175000017500000002172312236467170020041 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "ctkgauge.h" #define REQUESTED_WIDTH 116 #define REQUESTED_HEIGHT 86 static void ctk_gauge_class_init (CtkGaugeClass *); static void ctk_gauge_finalize (GObject *); static gboolean ctk_gauge_expose_event (GtkWidget *, GdkEventExpose *); static void ctk_gauge_size_request (GtkWidget *, GtkRequisition *); static gboolean ctk_gauge_configure_event (GtkWidget *, GdkEventConfigure *); static void draw (CtkGauge *); static GdkColor* get_foreground_color (CtkGauge *, gint); static GObjectClass *parent_class; GType ctk_gauge_get_type( void ) { static GType ctk_gauge_type = 0; if (!ctk_gauge_type) { static const GTypeInfo ctk_gauge_info = { sizeof (CtkGaugeClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ctk_gauge_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkGauge), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_gauge_type = g_type_register_static(GTK_TYPE_DRAWING_AREA, "CtkGauge", &ctk_gauge_info, 0); } return ctk_gauge_type; } static void ctk_gauge_class_init( CtkGaugeClass *ctk_gauge_class ) { GObjectClass *gobject_class; GtkWidgetClass *widget_class; widget_class = (GtkWidgetClass *) ctk_gauge_class; gobject_class = (GObjectClass *) ctk_gauge_class; parent_class = g_type_class_peek_parent(ctk_gauge_class); gobject_class->finalize = ctk_gauge_finalize; widget_class->expose_event = ctk_gauge_expose_event; widget_class->size_request = ctk_gauge_size_request; widget_class->configure_event = ctk_gauge_configure_event; } static void ctk_gauge_finalize( GObject *object ) { CtkGauge *ctk_gauge; GdkColormap *gdk_colormap; GdkColor *gdk_color; ctk_gauge = CTK_GAUGE(object); gdk_colormap = ctk_gauge->gdk_colormap; gdk_color = &ctk_gauge->gdk_color_gray; gdk_colormap_free_colors(gdk_colormap, gdk_color, 1); gdk_color = &ctk_gauge->gdk_color_red; gdk_colormap_free_colors(gdk_colormap, gdk_color, 1); gdk_color = &ctk_gauge->gdk_color_yellow; gdk_colormap_free_colors(gdk_colormap, gdk_color, 1); gdk_color = &ctk_gauge->gdk_color_green; gdk_colormap_free_colors(gdk_colormap, gdk_color, 1); g_object_unref(gdk_colormap); } static gboolean ctk_gauge_expose_event( GtkWidget *widget, GdkEventExpose *event ) { gint width, height; CtkGauge *ctk_gauge; ctk_gauge = CTK_GAUGE(widget); width = widget->allocation.width - 2 * widget->style->xthickness; height = widget->allocation.height - 2 * widget->style->ythickness; gtk_paint_shadow(widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_IN, &event->area, widget, "ctk_gauge", 0, 0, widget->allocation.width, widget->allocation.height); gdk_gc_set_function(ctk_gauge->gdk_gc, GDK_COPY); gdk_draw_drawable(widget->window, ctk_gauge->gdk_gc, ctk_gauge->gdk_pixmap, 0, 0, widget->style->xthickness, widget->style->ythickness, width, height); return FALSE; } static gboolean ctk_gauge_configure_event ( GtkWidget *widget, GdkEventConfigure *event ) { CtkGauge *ctk_gauge = CTK_GAUGE(widget); ctk_gauge->width = event->width; ctk_gauge->height = event->height; if (ctk_gauge->gdk_pixmap) g_object_unref(ctk_gauge->gdk_pixmap); if (ctk_gauge->gdk_gc) g_object_unref(ctk_gauge->gdk_gc); ctk_gauge->gdk_pixmap = gdk_pixmap_new(widget->window, ctk_gauge->width, ctk_gauge->height, -1); ctk_gauge->gdk_gc = gdk_gc_new(ctk_gauge->gdk_pixmap); draw(ctk_gauge); return FALSE; } static void ctk_gauge_size_request( GtkWidget *widget, GtkRequisition *requisition ) { requisition->width = REQUESTED_WIDTH; requisition->height = REQUESTED_HEIGHT; } GtkWidget* ctk_gauge_new(gint lower, gint upper) { GObject *object; CtkGauge *ctk_gauge; GdkColormap *gdk_colormap; GdkColor *gdk_color; object = g_object_new(CTK_TYPE_GAUGE, NULL); ctk_gauge = CTK_GAUGE(object); ctk_gauge->lower = lower; ctk_gauge->upper = upper; ctk_gauge->gdk_pixmap = NULL; ctk_gauge->gdk_gc = NULL; ctk_gauge->pango_layout = gtk_widget_create_pango_layout(GTK_WIDGET(ctk_gauge), NULL); ctk_gauge->gdk_colormap = gdk_colormap = gdk_colormap_get_system(); g_object_ref(gdk_colormap); gdk_color = &ctk_gauge->gdk_color_gray; memset(gdk_color, 0, sizeof(GdkColor)); gdk_color->red = 32768; gdk_color->green = 32768; gdk_color->blue = 32768; gdk_colormap_alloc_color(gdk_colormap, gdk_color, FALSE, TRUE); gdk_color = &ctk_gauge->gdk_color_red; memset(gdk_color, 0, sizeof(GdkColor)); gdk_color->red = 65535; gdk_colormap_alloc_color(gdk_colormap, gdk_color, FALSE, TRUE); gdk_color = &ctk_gauge->gdk_color_yellow; memset(gdk_color, 0, sizeof(GdkColor)); gdk_color->red = 65535; gdk_color->green = 65535; gdk_colormap_alloc_color(gdk_colormap, gdk_color, FALSE, TRUE); gdk_color = &ctk_gauge->gdk_color_green; memset(gdk_color, 0, sizeof(GdkColor)); gdk_color->green = 65535; gdk_colormap_alloc_color(gdk_colormap, gdk_color, FALSE, TRUE); return GTK_WIDGET(object); } void ctk_gauge_set_current(CtkGauge *ctk_gauge, gint current) { gchar *ts; g_return_if_fail(CTK_IS_GAUGE(ctk_gauge)); ctk_gauge->current = current; ts = g_strdup_printf("%d\xc2\xb0" /* split for g_utf8_validate() */ "C", current); pango_layout_set_text(ctk_gauge->pango_layout, ts, -1); g_free(ts); } static GdkColor* get_foreground_color(CtkGauge *ctk_gauge, gint i) { if (i >= 7) return &ctk_gauge->gdk_color_red; else if (i > 3) return &ctk_gauge->gdk_color_yellow; else return &ctk_gauge->gdk_color_green; } static void draw(CtkGauge *ctk_gauge) { GtkWidget *widget; gint x1, x2, y, width, i, percent, pos; gint upper, lower, range, current; lower = ctk_gauge->lower; upper = ctk_gauge->upper; range = upper - lower; current = ctk_gauge->current; gdk_gc_set_function(ctk_gauge->gdk_gc, GDK_COPY); widget = GTK_WIDGET(ctk_gauge); gdk_draw_rectangle(ctk_gauge->gdk_pixmap, widget->style->black_gc, TRUE, 0, 0, ctk_gauge->width, ctk_gauge->height); width = ctk_gauge->width / 5; y = ctk_gauge->height / 5; percent = (range > 0) ? (((current - lower) * 100) / range) : 0; pos = (percent >= 95) ? 10 : (percent / 10); x1 = (ctk_gauge->width / 2) - width - 4; x2 = x1 + width + 2; gdk_gc_set_foreground(ctk_gauge->gdk_gc, &ctk_gauge->gdk_color_gray); for (i = 10; i > pos; i--) { gdk_draw_rectangle(ctk_gauge->gdk_pixmap, ctk_gauge->gdk_gc, TRUE, x1, y, width, 2); gdk_draw_rectangle(ctk_gauge->gdk_pixmap, ctk_gauge->gdk_gc, TRUE, x2, y, width, 2); y += 2 * 2; } for (i = i; i > 0; i--) { gdk_gc_set_foreground(ctk_gauge->gdk_gc, get_foreground_color(ctk_gauge, i)); gdk_draw_rectangle(ctk_gauge->gdk_pixmap, ctk_gauge->gdk_gc, TRUE, x1, y, width, 2); gdk_draw_rectangle(ctk_gauge->gdk_pixmap, ctk_gauge->gdk_gc, TRUE, x2, y, width, 2); y += 2 * 2; } gdk_gc_set_foreground(ctk_gauge->gdk_gc, &ctk_gauge->gdk_color_gray); gdk_draw_layout(ctk_gauge->gdk_pixmap, ctk_gauge->gdk_gc, x1, y, ctk_gauge->pango_layout); } void ctk_gauge_draw(CtkGauge *ctk_gauge) { GtkWidget *widget; GdkRectangle rectangle; g_return_if_fail(CTK_IS_GAUGE(ctk_gauge)); widget = GTK_WIDGET(ctk_gauge); rectangle.x = widget->style->xthickness; rectangle.y = widget->style->ythickness; rectangle.width = widget->allocation.width - 2 * rectangle.x; rectangle.height = widget->allocation.height - 2 * rectangle.y; if (GTK_WIDGET_DRAWABLE(widget)) { draw(ctk_gauge); /* only draw when visible */ gdk_window_invalidate_rect(widget->window, &rectangle, FALSE); } } nvidia-settings/src/gtk+-2.x/ctkcolorcontrols.h0000664000175000017500000000542712236467170021663 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2010 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_COLOR_CONTROLS_H__ #define __CTK_COLOR_CONTROLS_H__ #include "ctkevent.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_COLOR_CONTROLS (ctk_color_controls_get_type()) #define CTK_COLOR_CONTROLS(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_COLOR_CONTROLS, \ CtkColorControls)) #define CTK_COLOR_CONTROLS_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_COLOR_CONTROLS, \ CtkColorControlsClass)) #define CTK_IS_COLOR_CONTROLS(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_COLOR_CONTROLS)) #define CTK_IS_COLOR_CONTROLS_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_COLOR_CONTROLS)) #define CTK_COLOR_CONTROLS_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_COLOR_CONTROLS, \ CtkCOLORControlsClass)) typedef struct _CtkColorControls CtkColorControls; typedef struct _CtkColorControlsClass CtkColorControlsClass; struct _CtkColorControls { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; CtkEvent *ctk_event; GtkWidget *reset_button; GtkWidget *color_controls_box; GtkWidget *color_range_menu; GtkWidget *color_space_menu; gint *color_space_table; gint color_space_table_size; gint *color_range_table; gint color_range_table_size; gint default_color_config; gint default_color_space; char *name; }; struct _CtkColorControlsClass { GtkVBoxClass parent_class; }; GType ctk_color_controls_get_type (void) G_GNUC_CONST; GtkWidget* ctk_color_controls_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *, GtkWidget *, char *); void ctk_color_controls_reset (CtkColorControls*); void ctk_color_controls_setup (CtkColorControls*); void add_color_controls_help (CtkColorControls*, GtkTextBuffer *b, GtkTextIter *i); G_END_DECLS #endif /* __CTK_COLOR_CONTROLS_H__ */ nvidia-settings/src/gtk+-2.x/ctkglx.c0000664000175000017500000011361412236467170017544 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include "glxinfo.h" /* xxx_abbrev functions */ #include "ctkbanner.h" #include "ctkglx.h" #include "ctkutils.h" #include "ctkconfig.h" #include "ctkhelp.h" #include "ctkconstants.h" #include /* GLX #defines */ /* Number of FBConfigs attributes reported in gui */ #define NUM_FBCONFIG_ATTRIBS 32 /* FBConfig tooltips */ static const char * __show_fbc_help = "Show the GLX Frame Buffer Configurations table in a new window."; static const char * __fid_help = "fid (Frame buffer ID) - Frame Buffer Configuration ID."; static const char * __vid_help = "vid (XVisual ID) - ID of the associated X Visual."; static const char * __vt_help = "vt (XVisual Type) - Type of the associated X Visual. " "Possible X visual types are 'tc', 'dc', 'pc', 'sc', 'gs', 'sg' and '.' " "which mean TrueColor, DirectColor, PseudoColor, StaticColor, GrayScale, " "StaticGray and None, respectively."; static const char * __bfs_help = "bfs (buffer size) - Number of bits per color in the color buffer."; static const char * __lvl_help = "lvl (level) - Frame buffer level. Level zero is the default frame " "buffer. Positive levels are the overlay frame buffers (on top of the " "default frame buffer). Negative levels are the underlay frame buffers " "(under the default frame buffer)."; static const char * __bf_help = "bf (Buffer format) - Color buffer format. 'rgb' means each element of the " "pixel buffer holds red, green, blue, and alpha values. 'ci' means each " "element of the pixel buffer holds a color index value, where the actual " "color is defined by a color map."; static const char * __db_help = "db (Double buffer) - 'y' if the configuration has front and back color " "buffers that are swappable. '-' if this is not supported."; static const char * __st_help = "st (Stereo buffer) - 'y' if the configuration has left and right color " "buffers that are rendered to in stereo. '-' if this is not supported."; static const char * __rs_help = "rs (Red size) - Number of bits per color used for red. " "Undefined for configurations that use color indexing."; static const char * __gs_help = "gs (Green size) - Number of bits per color used for green. " "Undefined for configurations that use color indexing."; static const char * __bs_help = "bs (Blue size) - Number of bits per color used for blue. " "Undefined for configurations that use color indexing."; static const char * __as_help = "as (Alpha size) - Number of bits per color used for alpha. " "Undefined for configurations that use color indexing."; static const char * __aux_help = "aux (Auxiliary buffers) - Number of available auxiliary color buffers."; static const char * __dpt_help = "dpt (Depth buffer size) - Number of bits per color in the depth buffer."; static const char * __stn_help = "stn (Stencil size) - Number of bits per element in the stencil buffer."; static const char * __acr_help = "acr (Accumulator red size) - Number of bits per color used for red " "in the accumulator buffer."; static const char * __acg_help = "acg (Accumulator green size) - Number of bits per color used for green " "in the accumulator buffer."; static const char * __acb_help = "acb (Accumulator blue size) - Number of bits per color used for blue " "in the accumulator buffer."; static const char * __aca_help = "aca (Accumulator alpha size) - Number of bits per color used for alpha " "in the accumulator buffer."; static const char * __mvs_help = "mvs (Multisample coverage samples) - Number of coverage samples per multisample."; static const char * __mcs_help = "mcs (Multisample color samples) - Number of color samples per multisample."; static const char * __mb_help = "mb (Multisample buffer count) - Number of multisample buffers."; static const char * __cav_help = "cav (Caveats) - Caveats for this configuration. A frame buffer " "configuration may have the following caveats: 'NonC' if it supports " "any non-conformant visual extension. 'Slow' if it has reduced " "performance. '-' if it has no caveats."; static const char * __pbw_help = "pbw (Pbuffer width) - Width of pbuffer (in hexadecimal)."; static const char * __pbh_help = "pbh (Pbuffer height) - Height of pbuffer (in hexadecimal)."; static const char * __pbp_help = "pbp (Pbuffer max pixels) - Max number of pixels in pbuffer (in " "hexadecimal)."; static const char * __trt_help = "trt (Transparency type) - Type of transparency (RGBA or Index)."; static const char * __trr_help = "trr (Transparency red value) - Red value considered transparent."; static const char * __trg_help = "trg (Transparency green value) - Green value considered transparent."; static const char * __trb_help = "trb (Transparency blue value) - Blue value considered transparent."; static const char * __tra_help = "tra (Transparency alpha value) - Alpha value considered transparent."; static const char * __tri_help = "tri (Transparency index value) - Color index value considered transparent."; GType ctk_glx_get_type(void) { static GType ctk_glx_type = 0; if (!ctk_glx_type) { static const GTypeInfo ctk_glx_info = { sizeof (CtkGLXClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init, */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkGLX), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_glx_type = g_type_register_static (GTK_TYPE_VBOX, "CtkGLX", &ctk_glx_info, 0); } return ctk_glx_type; } /* ctk_glx_get_type() */ static void dummy_button_signal(GtkWidget *widget, gpointer user_data) { /* This is a dummy function so tooltips are enabled * for the fbconfig table column titles */ } /* * show_fbc_toggled() - called when the show GLX Frame Buffer Configurations * button has been toggled. */ static void show_fbc_toggled(GtkWidget *widget, gpointer user_data) { CtkGLX *ctk_glx = user_data; gboolean enabled; /* get the enabled state */ enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); if (enabled) { gtk_widget_show_all(ctk_glx->fbc_window); } else { gtk_widget_hide(ctk_glx->fbc_window); } ctk_config_statusbar_message(ctk_glx->ctk_config, "Show GLX Frame Buffer Configurations button %s.", enabled ? "enabled" : "disabled"); } /* show_fbc_toggled() */ /* * fbc_window_destroy() - called when the window displaying the * GLX Frame Buffer Configurations table is closed. */ static gboolean fbc_window_destroy(GtkWidget *widget, GdkEvent *event, gpointer user_data) { CtkGLX *ctk_glx = user_data; gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_glx->show_fbc_button), FALSE); return TRUE; } /* fbc_window_destroy() */ /* Creates the GLX information widget * * NOTE: The GLX information other than the FBConfigs will * be setup when this page is hooked up and the "parent-set" * signal is thrown. This will result in calling the * ctk_glx_probe_info() function. */ typedef struct WidgetSizeRec { GtkWidget *widget; int width; } WidgetSize; GtkWidget* ctk_glx_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event) { GObject *object; CtkGLX *ctk_glx; GtkWidget *label; GtkWidget *banner; GtkWidget *hseparator; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *scrollWin; GtkWidget *event; /* For setting the background color to white */ GtkWidget *data_table, *header_table; GtkWidget *data_viewport, *full_viewport; GtkWidget *vscrollbar, *hscrollbar; GtkWidget *show_fbc_button, *window; GtkRequisition req; ReturnStatus ret; char * glx_info_str = NULL; /* Test if GLX supported */ GLXFBConfigAttr *fbconfig_attribs = NULL; /* FBConfig data */ int i; /* Iterator */ int num_fbconfigs = 0; char *err_str = NULL; gchar *fbconfig_titles[NUM_FBCONFIG_ATTRIBS] = { "fid", "vid", "vt", "bfs", "lvl", "bf", "db", "st", "rs", "gs", "bs", "as", "aux", "dpt", "stn", "acr", "acg", "acb", "aca", "mvs", "mcs", "mb", "cav", "pbw", "pbh", "pbp", "trt", "trr", "trg", "trb", "tra", "tri" }; WidgetSize fbconfig_header_sizes[NUM_FBCONFIG_ATTRIBS]; const char *fbconfig_tooltips[NUM_FBCONFIG_ATTRIBS] = { __fid_help, __vid_help, __vt_help, __bfs_help, __lvl_help, __bf_help, __db_help, __st_help, __rs_help, __gs_help, __bs_help, __as_help, __aux_help, __dpt_help, __stn_help, __acr_help, __acg_help, __acb_help, __aca_help, __mvs_help, __mcs_help, __mb_help, __cav_help, __pbw_help, __pbh_help, __pbp_help, __trt_help, __trr_help, __trg_help, __trb_help, __tra_help, __tri_help }; /* Create the ctk glx object */ object = g_object_new(CTK_TYPE_GLX, NULL); ctk_glx = CTK_GLX(object); /* Cache the attribute handle */ ctk_glx->handle = handle; /* Set container properties of the object */ ctk_glx->ctk_config = ctk_config; gtk_box_set_spacing(GTK_BOX(ctk_glx), 10); /* Image banner */ banner = ctk_banner_image_new(BANNER_ARTWORK_GLX); gtk_box_pack_start(GTK_BOX(ctk_glx), banner, FALSE, FALSE, 0); /* Determine if GLX is supported */ ret = NvCtrlGetStringAttribute(ctk_glx->handle, NV_CTRL_STRING_GLX_SERVER_VENDOR, &glx_info_str); free(glx_info_str); if ( ret != NvCtrlSuccess ) { err_str = "Failed to query the GLX server vendor."; goto fail; } /* Information Scroll Box */ scrollWin = gtk_scrolled_window_new(NULL, NULL); hbox = gtk_hbox_new(FALSE, 0); vbox = gtk_vbox_new(FALSE, 5); event = gtk_event_box_new(); ctk_force_text_colors_on_widget(event); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollWin), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); gtk_container_add(GTK_CONTAINER(event), hbox); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollWin), event); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5); ctk_glx->glxinfo_vpane = vbox; gtk_widget_set_size_request(scrollWin, -1, 50); /* GLX 1.3 supports frame buffer configurations */ #ifdef GLX_VERSION_1_3 /* Grab the FBConfigs */ ret = NvCtrlGetVoidAttribute(handle, NV_CTRL_ATTR_GLX_FBCONFIG_ATTRIBS, (void *)(&fbconfig_attribs)); if ( ret != NvCtrlSuccess ) { err_str = "Failed to query list of GLX frame buffer configurations."; goto fail; } /* Count the number of fbconfigs */ if ( fbconfig_attribs ) { for (num_fbconfigs = 0; fbconfig_attribs[num_fbconfigs].fbconfig_id != 0; num_fbconfigs++); } if ( ! num_fbconfigs ) { err_str = "No frame buffer configurations found."; goto fail; } show_fbc_button = gtk_toggle_button_new_with_label( "Show GLX Frame Buffer Configurations"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(show_fbc_button), FALSE); ctk_config_set_tooltip(ctk_config, show_fbc_button, __show_fbc_help); g_signal_connect(G_OBJECT(show_fbc_button), "clicked", G_CALLBACK(show_fbc_toggled), (gpointer) ctk_glx); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "GLX Frame Buffer Configurations"); gtk_container_set_border_width(GTK_CONTAINER(window), CTK_WINDOW_PAD); gtk_widget_set_size_request(window, 400, 200); g_signal_connect(G_OBJECT(window), "destroy-event", G_CALLBACK(fbc_window_destroy), (gpointer) ctk_glx); g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(fbc_window_destroy), (gpointer) ctk_glx); ctk_glx->fbc_window = window; ctk_glx->show_fbc_button = show_fbc_button; hbox = gtk_hbox_new(FALSE, 0); vbox = gtk_vbox_new(FALSE, 10); data_viewport = gtk_viewport_new(NULL, NULL); gtk_widget_set_size_request(data_viewport, 400, 50); vscrollbar = gtk_vscrollbar_new(gtk_viewport_get_vadjustment (GTK_VIEWPORT(data_viewport))); full_viewport = gtk_viewport_new(NULL, NULL); gtk_widget_set_size_request(full_viewport, 400, 50); hscrollbar = gtk_hscrollbar_new(gtk_viewport_get_hadjustment (GTK_VIEWPORT(full_viewport))); /* * NODE: Because clists have a hard time displaying tooltips in their * column labels/buttons, we make the fbconfig table using a * table widget. */ /* Create the header table */ header_table = gtk_table_new(num_fbconfigs, NUM_FBCONFIG_ATTRIBS, FALSE); for ( i = 0; i < NUM_FBCONFIG_ATTRIBS; i++ ) { GtkWidget * btn = gtk_button_new_with_label(fbconfig_titles[i]); g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(dummy_button_signal), (gpointer) ctk_glx); ctk_config_set_tooltip(ctk_config, btn, fbconfig_tooltips[i]); gtk_table_attach(GTK_TABLE(header_table), btn, i, i+1, 0, 1, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); fbconfig_header_sizes[i].widget = btn; gtk_widget_size_request(btn, &req); fbconfig_header_sizes[i].width = req.width; } /* Create the data table */ data_table = gtk_table_new(num_fbconfigs, NUM_FBCONFIG_ATTRIBS, FALSE); event = gtk_event_box_new(); ctk_force_text_colors_on_widget(event); gtk_container_add (GTK_CONTAINER(event), data_table); gtk_container_add(GTK_CONTAINER(data_viewport), event); /* Pack the fbconfig header and data tables */ vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), header_table, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), data_viewport, TRUE, TRUE, 0); gtk_container_add (GTK_CONTAINER(full_viewport), vbox); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), full_viewport, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hscrollbar, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), vscrollbar, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(window), hbox); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), show_fbc_button, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), scrollWin, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hseparator, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(ctk_glx), vbox, TRUE, TRUE, 0); /* Fill the data table */ if ( fbconfig_attribs ) { /* Populate FBConfig table */ i = 0; while ( fbconfig_attribs[i].fbconfig_id != 0 ) { char str[NUM_FBCONFIG_ATTRIBS + 1][16]; int cell = 0; /* Used for putting information into cells */ if ( fbconfig_attribs[i].fbconfig_id ) { snprintf((char *) (&(str[cell++])), 16, "0x%02X", fbconfig_attribs[i].fbconfig_id); } else { sprintf((char *) (&(str[cell++])),"."); } if ( fbconfig_attribs[i].visual_id ) { snprintf((char *) (&(str[cell++])), 16, "0x%02X", fbconfig_attribs[i].visual_id); } else { sprintf((char *) (&(str[cell++])),"."); } snprintf((char *) (&(str[cell++])), 16, "%s", x_visual_type_abbrev(fbconfig_attribs[i].x_visual_type)); snprintf((char *) (&(str[cell++])), 16, "%3d", fbconfig_attribs[i].buffer_size); snprintf((char *) (&(str[cell++])), 16, "%2d", fbconfig_attribs[i].level); snprintf((char *) (&(str[cell++])), 16, "%s", render_type_abbrev(fbconfig_attribs[i].render_type) ); snprintf((char *) (&(str[cell++])), 16, "%c", fbconfig_attribs[i].doublebuffer ? 'y' : '.'); snprintf((char *) (&(str[cell++])), 16, "%c", fbconfig_attribs[i].stereo ? 'y' : '.'); snprintf((char *) (&(str[cell++])), 16, "%2d", fbconfig_attribs[i].red_size); snprintf((char *) (&(str[cell++])), 16, "%2d", fbconfig_attribs[i].green_size); snprintf((char *) (&(str[cell++])), 16, "%2d", fbconfig_attribs[i].blue_size); snprintf((char *) (&(str[cell++])), 16, "%2d", fbconfig_attribs[i].alpha_size); snprintf((char *) (&(str[cell++])), 16, "%2d", fbconfig_attribs[i].aux_buffers); snprintf((char *) (&(str[cell++])), 16, "%2d", fbconfig_attribs[i].depth_size); snprintf((char *) (&(str[cell++])), 16, "%2d", fbconfig_attribs[i].stencil_size); snprintf((char *) (&(str[cell++])), 16, "%2d", fbconfig_attribs[i].accum_red_size); snprintf((char *) (&(str[cell++])), 16, "%2d", fbconfig_attribs[i].accum_green_size); snprintf((char *) (&(str[cell++])), 16, "%2d", fbconfig_attribs[i].accum_blue_size); snprintf((char *) (&(str[cell++])), 16, "%2d", fbconfig_attribs[i].accum_alpha_size); if (fbconfig_attribs[i].multi_sample_valid) { snprintf((char *) (&(str[cell++])), 16, "%2d", fbconfig_attribs[i].multi_samples); if (fbconfig_attribs[i].multi_sample_coverage_valid) { snprintf((char *) (&(str[cell++])), 16, "%2d", fbconfig_attribs[i].multi_samples_color); } else { snprintf((char *) (&(str[cell++])), 16, "%2d", fbconfig_attribs[i].multi_samples); } } else { snprintf((char *) (&(str[cell++])), 16, " 0"); snprintf((char *) (&(str[cell++])), 16, " 0"); } snprintf((char *) (&(str[cell++])), 16, "%1d", fbconfig_attribs[i].multi_sample_buffers); snprintf((char *) (&(str[cell++])), 16, "%s", caveat_abbrev( fbconfig_attribs[i].config_caveat) ); snprintf((char *) (&(str[cell++])), 16, "0x%04X", fbconfig_attribs[i].pbuffer_width); snprintf((char *) (&(str[cell++])), 16, "0x%04X", fbconfig_attribs[i].pbuffer_height); snprintf((char *) (&(str[cell++])), 16, "0x%07X", fbconfig_attribs[i].pbuffer_max); snprintf((char *) (&(str[cell++])), 16, "%s", transparent_type_abbrev(fbconfig_attribs[i].transparent_type)); snprintf((char *) (&(str[cell++])), 16, "%3d", fbconfig_attribs[i].transparent_red_value); snprintf((char *) (&(str[cell++])), 16, "%3d", fbconfig_attribs[i].transparent_green_value); snprintf((char *) (&(str[cell++])), 16, "%3d", fbconfig_attribs[i].transparent_blue_value); snprintf((char *) (&(str[cell++])), 16, "%3d", fbconfig_attribs[i].transparent_alpha_value); snprintf((char *) (&(str[cell++])), 16, "%3d", fbconfig_attribs[i].transparent_index_value); str[NUM_FBCONFIG_ATTRIBS][0] = '\0'; /* Populate row cells */ for ( cell = 0; cell < NUM_FBCONFIG_ATTRIBS ; cell++) { GtkWidget * label = gtk_label_new( str[cell] ); gtk_label_set_justify( GTK_LABEL(label), GTK_JUSTIFY_CENTER); gtk_table_attach(GTK_TABLE(data_table), label, cell, cell+1, i+1, i+2, GTK_EXPAND, GTK_EXPAND, 0, 0); /* Make sure the table headers are the same width * as their table data column */ gtk_widget_size_request(label, &req); if ( fbconfig_header_sizes[cell].width > req.width ) { gtk_widget_set_size_request(label, fbconfig_header_sizes[cell].width, -1); } else if ( fbconfig_header_sizes[cell].width < req.width ) { fbconfig_header_sizes[cell].width = req.width + 6; gtk_widget_set_size_request(fbconfig_header_sizes[cell].widget, fbconfig_header_sizes[cell].width, -1); } } i++; } /* Done - Populating FBconfig table */ free(fbconfig_attribs); } /* Done - FBConfigs exist */ #endif /* GLX_VERSION_1_3 */ gtk_widget_show_all(GTK_WIDGET(object)); return GTK_WIDGET(object); /* Failure (no GLX) */ fail: if (err_str) { label = gtk_label_new(err_str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_container_add(GTK_CONTAINER(ctk_glx), label); } /* Free memory that may have been allocated */ free(fbconfig_attribs); gtk_widget_show_all(GTK_WIDGET(object)); return GTK_WIDGET(object); } /* ctk_glx_new */ /* Probes for GLX information and sets up the results * in the GLX widget. */ void ctk_glx_probe_info(GtkWidget *widget) { CtkGLX *ctk_glx = CTK_GLX(widget); ReturnStatus ret; char *direct_rendering = NULL; char *glx_extensions = NULL; char *server_vendor = NULL; char *server_version = NULL; char *server_extensions = NULL; char *client_vendor = NULL; char *client_version = NULL; char *client_extensions = NULL; char *opengl_vendor = NULL; char *opengl_renderer = NULL; char *opengl_version = NULL; char *opengl_extensions = NULL; char *ptr; GtkWidget *hseparator; GtkWidget *hbox, *hbox2; GtkWidget *vbox, *vbox2; GtkWidget *label; GtkWidget *table; /* Make sure the widget was initialized and that glx information * has not yet been initialized. */ if ( !ctk_glx || !ctk_glx->glxinfo_vpane || ctk_glx->glxinfo_initialized ) { return; } /* Get GLX information */ ret = NvCtrlGetStringAttribute(ctk_glx->handle, NV_CTRL_STRING_GLX_DIRECT_RENDERING, &direct_rendering); if ( ret != NvCtrlSuccess ) { goto done; } ret = NvCtrlGetStringAttribute(ctk_glx->handle, NV_CTRL_STRING_GLX_GLX_EXTENSIONS, &glx_extensions); if ( ret != NvCtrlSuccess ) { goto done; } /* Get Server GLX information */ ret = NvCtrlGetStringAttribute(ctk_glx->handle, NV_CTRL_STRING_GLX_SERVER_VENDOR, &server_vendor); if ( ret != NvCtrlSuccess ) { goto done; } ret = NvCtrlGetStringAttribute(ctk_glx->handle, NV_CTRL_STRING_GLX_SERVER_VERSION, &server_version); if ( ret != NvCtrlSuccess ) { goto done; } ret = NvCtrlGetStringAttribute(ctk_glx->handle, NV_CTRL_STRING_GLX_SERVER_EXTENSIONS, &server_extensions); if ( ret != NvCtrlSuccess ) { goto done; } /* Get Client GLX information */ ret = NvCtrlGetStringAttribute(ctk_glx->handle, NV_CTRL_STRING_GLX_CLIENT_VENDOR, &client_vendor); if ( ret != NvCtrlSuccess ) { goto done; } ret = NvCtrlGetStringAttribute(ctk_glx->handle, NV_CTRL_STRING_GLX_CLIENT_VERSION, &client_version); if ( ret != NvCtrlSuccess ) { goto done; } ret = NvCtrlGetStringAttribute(ctk_glx->handle, NV_CTRL_STRING_GLX_CLIENT_EXTENSIONS, &client_extensions); if ( ret != NvCtrlSuccess ) { goto done; } /* Get OpenGL information */ ret = NvCtrlGetStringAttribute(ctk_glx->handle, NV_CTRL_STRING_GLX_OPENGL_VENDOR, &opengl_vendor); if ( ret != NvCtrlSuccess ) { goto done; } ret = NvCtrlGetStringAttribute(ctk_glx->handle, NV_CTRL_STRING_GLX_OPENGL_RENDERER, &opengl_renderer); if ( ret != NvCtrlSuccess ) { goto done; } ret = NvCtrlGetStringAttribute(ctk_glx->handle, NV_CTRL_STRING_GLX_OPENGL_VERSION, &opengl_version); if ( ret != NvCtrlSuccess ) { goto done; } ret = NvCtrlGetStringAttribute(ctk_glx->handle, NV_CTRL_STRING_GLX_OPENGL_EXTENSIONS, &opengl_extensions); if ( ret != NvCtrlSuccess ) { goto done; } /* Modify extension lists so they show only one name per line */ for ( ptr = glx_extensions; ptr != NULL && ptr[0] != '\0'; ptr++ ) { if ( ptr[0] == ' ' ) ptr[0] = '\n'; } for ( ptr = server_extensions; ptr != NULL && ptr[0] != '\0'; ptr++ ) { if ( ptr[0] == ' ' ) ptr[0] = '\n'; } for ( ptr = client_extensions; ptr != NULL && ptr[0] != '\0'; ptr++ ) { if ( ptr[0] == ' ' ) ptr[0] = '\n'; } for ( ptr = opengl_extensions; ptr != NULL && ptr[0] != '\0'; ptr++ ) { if ( ptr[0] == ' ' ) ptr[0] = '\n'; } /* Add (Shared) GLX information to widget */ vbox = ctk_glx->glxinfo_vpane; vbox2 = gtk_vbox_new(FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new("GLX Information"); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), vbox2, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); hbox = gtk_hbox_new(FALSE, 0); hbox2 = gtk_hbox_new(FALSE, 0); table = gtk_table_new(2, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); add_table_row(table, 0, 0, 0, "Direct Rendering:", 0, 0, direct_rendering); add_table_row(table, 1, 0, 0, "GLX Extensions:", 0, 0, glx_extensions); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), hbox2, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0); /* Add server GLX information to widget */ hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new("Server GLX Information"); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); hbox = gtk_hbox_new(FALSE, 0); hbox2 = gtk_hbox_new(FALSE, 0); table = gtk_table_new(3, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); add_table_row(table, 0, 0, 0, "Vendor:", 0, 0, server_vendor); add_table_row(table, 1, 0, 0, "Version:", 0, 0, server_version); add_table_row(table, 2, 0, 0, "Extensions:", 0, 0, server_extensions); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), hbox2, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0); /* Add client GLX information to widget */ hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new("Client GLX Information"); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); hbox = gtk_hbox_new(FALSE, 0); hbox2 = gtk_hbox_new(FALSE, 0); table = gtk_table_new(3, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); add_table_row(table, 0, 0, 0, "Vendor:", 0, 0, client_vendor); add_table_row(table, 1, 0, 0, "Version:", 0, 0, client_version); add_table_row(table, 2, 0, 0, "Extensions:", 0, 0, client_extensions); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), hbox2, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0); /* Add OpenGL information to widget */ hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new("OpenGL Information"); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); hbox = gtk_hbox_new(FALSE, 0); hbox2 = gtk_hbox_new(FALSE, 0); table = gtk_table_new(4, 2, FALSE); vbox2 = gtk_vbox_new(FALSE, 0); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); add_table_row(table, 0, 0, 0, "Vendor:", 0, 0, opengl_vendor); add_table_row(table, 1, 0, 0, "Renderer:", 0, 0, opengl_renderer); add_table_row(table, 2, 0, 0, "Version:", 0, 0, opengl_version); add_table_row(table, 3, 0, 0, "Extensions:", 0, 0, opengl_extensions); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), hbox2, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), vbox2, TRUE, TRUE, 2); /* Show the information */ gtk_widget_show_all(GTK_WIDGET(ctk_glx)); ctk_glx->glxinfo_initialized = True; /* Fall through */ done: /* Free temp strings */ free(direct_rendering); free(glx_extensions); free(server_vendor); free(server_version); free(server_extensions); free(client_vendor); free(client_version); free(client_extensions); free(opengl_vendor); free(opengl_renderer); free(opengl_version); free(opengl_extensions); } /* ctk_glx_probe_info() */ GtkTextBuffer *ctk_glx_create_help(GtkTextTagTable *table, CtkGLX *ctk_glx) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "GLX Help"); ctk_help_para(b, &i, "This page in the NVIDIA X Server Control Panel describes " "information about the OpenGL extension to the X Server " "(GLX)." ); ctk_help_heading(b, &i, "Direct Rendering"); ctk_help_para(b, &i, "This will tell you if direct rendering is available. If " "direct rendering is available, then a program running on " "the same computer that the control panel is running on " "will be able to bypass the X Server and take advantage of " "faster rendering. If direct rendering is not available, " "then indirect rendering will be used and all rendering " "will happen through the X Server." ); ctk_help_heading(b, &i, "GLX Extensions"); ctk_help_para(b, &i, "This is the list of GLX extensions that are supported by " "both the client (libraries) and server (GLX extension to " "the X Server)." ); ctk_help_heading(b, &i, "Server GLX Vendor String"); ctk_help_para(b, &i, "This is the vendor supplying the GLX extension running on " "the X Server." ); ctk_help_heading(b, &i, "Server GLX Version String"); ctk_help_para(b, &i, "This is the version of the GLX extension running on the X " "Server." ); ctk_help_heading(b, &i, "Server GLX Extensions"); ctk_help_para(b, &i, "This is the list of extensions supported by the GLX " "extension running on the X Server." ); ctk_help_heading(b, &i, "Client GLX Vendor String"); ctk_help_para(b, &i, "This is the vendor supplying the GLX libraries." ); ctk_help_heading(b, &i, "Client GLX Version String"); ctk_help_para(b, &i, "This is the version of the GLX libraries." ); ctk_help_heading(b, &i, "Client GLX Extensions"); ctk_help_para(b, &i, "This is the list of extensions supported by the GLX " "libraries." ); ctk_help_heading(b, &i, "OpenGL Vendor String"); ctk_help_para(b, &i, "This is the name of the vendor providing the OpenGL " "implementation." ); ctk_help_heading(b, &i, "OpenGL Renderer String"); ctk_help_para(b, &i, "This shows the details of the graphics card on which " "OpenGL is running." ); ctk_help_heading(b, &i, "OpenGL Version String"); ctk_help_para(b, &i, "This is the version of the OpenGL implementation." ); ctk_help_heading(b, &i, "OpenGL Extensions"); ctk_help_para(b, &i, "This is the list of OpenGL extensions that are supported " "by this driver." ); ctk_help_heading(b, &i, "Show GLX Frame Buffer Configurations"); ctk_help_para(b, &i, "%s", __show_fbc_help); ctk_help_heading(b, &i, "GLX Frame Buffer Configurations"); ctk_help_para(b, &i, "This table lists the supported frame buffer " "configurations for the display."); ctk_help_para(b, &i, "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n" "\t%s\n\n", __fid_help, __vid_help, __vt_help, __bfs_help, __lvl_help, __bf_help, __db_help, __st_help, __rs_help, __gs_help, __bs_help, __as_help, __aux_help, __dpt_help, __stn_help, __acr_help, __acg_help, __acb_help, __aca_help, __mvs_help, __mcs_help, __mb_help, __cav_help, __pbw_help, __pbh_help, __pbp_help, __trt_help, __trr_help, __trg_help, __trb_help, __tra_help, __tri_help ); ctk_help_finish(b); return b; } /* ctk_glx_create_help() */ nvidia-settings/src/gtk+-2.x/ctkvcs.c0000664000175000017500000007363012236467170017550 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2006 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include /* malloc */ #include /* snprintf */ #include #include #include #include #include "ctkbanner.h" #include "msg.h" #include "ctkvcs.h" #include "ctkevent.h" #include "ctkhelp.h" #include "ctkutils.h" #define DEFAULT_UPDATE_VCS_INFO_TIME_INTERVAL 5000 #define VCS_PSU_STATE_NORMAL 0 #define VCS_PSU_STATE_ABNORMAL 1 static gboolean update_vcs_info(gpointer); static gboolean update_fan_status(CtkVcs *ctk_object); static void apply_fan_entry_token(char *token, char *value, void *data) { FanEntryPtr pFanEntry = (FanEntryPtr) data; if (!strcasecmp("fan", token)) { pFanEntry->fan_number = atoi(value); } else if (!strcasecmp("speed", token)) { pFanEntry->fan_speed = atoi(value); } else if (!strcasecmp("fail", token)) { pFanEntry->fan_failed = atoi(value); } else { nv_warning_msg("Unknown Fan Entry token value pair: %s=%s", token, value); } } static void apply_thermal_entry_token(char *token, char *value, void *data) { ThermalEntryPtr pThermalEntry = (ThermalEntryPtr) data; if (!strcasecmp("intake", token)) { pThermalEntry->intake_temp = atoi(value); } else if (!strcasecmp("exhaust", token)) { pThermalEntry->exhaust_temp = atoi(value); } else if (!strcasecmp("board", token)) { pThermalEntry->board_temp = atoi(value); } else { nv_warning_msg("Unknown Thermal Entry token value pair: %s=%s", token, value); } } static void apply_psu_entry_token(char *token, char *value, void *data) { PSUEntryPtr pPSUEntry = (PSUEntryPtr) data; if (!strcasecmp("current", token)) { pPSUEntry->psu_current = atoi(value); } else if (!strcasecmp("power", token)) { if (!strcasecmp("unknown", value)) { pPSUEntry->psu_power = -1; } else { pPSUEntry->psu_power = atoi(value); } } else if (!strcasecmp("voltage", token)) { if (!strcasecmp("unknown", value)) { pPSUEntry->psu_voltage = -1; } else { pPSUEntry->psu_voltage = atoi(value); } } else if (!strcasecmp("state", token)) { if (!strcasecmp("normal", value)) { pPSUEntry->psu_state = VCS_PSU_STATE_NORMAL; } else { pPSUEntry->psu_state = VCS_PSU_STATE_ABNORMAL; } } else { nv_warning_msg("Unknown PSU Entry token value pair: %s=%s", token, value); } } GType ctk_vcs_get_type(void) { static GType ctk_vcs_type = 0; if (!ctk_vcs_type) { static const GTypeInfo ctk_vcs_info = { sizeof (CtkVcsClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof(CtkVcs), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_vcs_type = g_type_register_static (GTK_TYPE_VBOX, "CtkVcs", &ctk_vcs_info, 0); } return ctk_vcs_type; } static gboolean update_vcs_info(gpointer user_data) { char output_str[16]; char *temp_str = NULL; char *psu_str = NULL; CtkVcs *ctk_object = CTK_VCS(user_data); ThermalEntry thermEntry; PSUEntry psuEntry; gboolean high_perf_mode; /* These queries should always succeed for Canoas 2.0 and above */ if ((NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_VCSC_HIGH_PERF_MODE, &high_perf_mode) != NvCtrlSuccess) || (NvCtrlGetStringAttribute(ctk_object->handle, NV_CTRL_STRING_VCSC_TEMPERATURES, &temp_str) != NvCtrlSuccess) || (NvCtrlGetStringAttribute(ctk_object->handle, NV_CTRL_STRING_VCSC_PSU_INFO, &psu_str) != NvCtrlSuccess)) { return FALSE; } /* Extract out thermal and PSU entry tokens */ /* First Invalidate thermal and psu entries */ thermEntry.intake_temp = -1; thermEntry.exhaust_temp = -1; thermEntry.board_temp = -1; psuEntry.psu_current = -1; psuEntry.psu_power = -1; psuEntry.psu_voltage = -1; psuEntry.psu_state = -1; if (temp_str) { parse_token_value_pairs(temp_str, apply_thermal_entry_token, &thermEntry); } if (psu_str) { parse_token_value_pairs(psu_str, apply_psu_entry_token, &psuEntry); } if ((thermEntry.intake_temp != -1) && (thermEntry.exhaust_temp != -1) && (thermEntry.board_temp != -1)) { if (ctk_object->intake_temp) { g_snprintf(output_str, 16, "%d C", thermEntry.intake_temp); gtk_label_set_text(GTK_LABEL(ctk_object->intake_temp), output_str); } if (ctk_object->exhaust_temp) { g_snprintf(output_str, 16, "%d C", thermEntry.exhaust_temp); gtk_label_set_text(GTK_LABEL(ctk_object->exhaust_temp), output_str); } if (ctk_object->board_temp) { g_snprintf(output_str, 16, "%d C", thermEntry.board_temp); gtk_label_set_text(GTK_LABEL(ctk_object->board_temp), output_str); } } if ((psuEntry.psu_current != -1) && (psuEntry.psu_state != -1)) { if (ctk_object->psu_current) { g_snprintf(output_str, 16, "%d A", psuEntry.psu_current); gtk_label_set_text(GTK_LABEL(ctk_object->psu_current), output_str); } if (ctk_object->psu_state) { switch (psuEntry.psu_state) { case VCS_PSU_STATE_NORMAL: g_snprintf(output_str, 16, "Normal"); break; case VCS_PSU_STATE_ABNORMAL: g_snprintf(output_str, 16, "Abnormal"); break; default: g_snprintf(output_str, 16, "Unknown"); break; } gtk_label_set_text(GTK_LABEL(ctk_object->psu_state), output_str); } } if (ctk_object->psu_power && psuEntry.psu_power != -1) { g_snprintf(output_str, 16, "%d W", psuEntry.psu_power); gtk_label_set_text(GTK_LABEL(ctk_object->psu_power), output_str); } if (ctk_object->psu_voltage && psuEntry.psu_voltage != -1) { g_snprintf(output_str, 16, "%d V", psuEntry.psu_voltage); gtk_label_set_text(GTK_LABEL(ctk_object->psu_voltage), output_str); } if (!update_fan_status(ctk_object)) { return FALSE; } return TRUE; } /** create_error_dialog() ********************************* * * Creates a generic error message dialog widget * **/ static GtkWidget * create_error_dialog(CtkVcs *ctk_object) { GtkWidget *dialog; GtkWidget *image; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *label; /* Display validation override confirmation dialog */ dialog = gtk_dialog_new_with_buttons ("Cannot Apply", GTK_WINDOW(gtk_widget_get_parent(GTK_WIDGET(ctk_object))), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, NULL); /* Main horizontal box */ hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 5); /* Pack the information icon */ image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG); gtk_misc_set_alignment(GTK_MISC(image), 0.0f, 0.0f); gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 5); /* Main vertical box */ vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5); label = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.0f); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); ctk_object->error_dialog_label = label; /* Action Buttons */ gtk_dialog_add_button(GTK_DIALOG(dialog), "OK", GTK_RESPONSE_ACCEPT); gtk_widget_show_all(GTK_DIALOG(dialog)->vbox); return dialog; } /* create_error_dialog() */ static void vcs_perf_checkbox_toggled(GtkWidget *widget, gpointer user_data) { CtkVcs *ctk_object = CTK_VCS(user_data); gint enabled; gint ret; enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); ret = NvCtrlSetAttribute(ctk_object->handle, NV_CTRL_VCSC_HIGH_PERF_MODE, enabled); if (ret != NvCtrlSuccess) { if (ctk_object->error_dialog_label) { gchar *str; str = g_strdup_printf("Failed to %s High Performance mode!", (enabled ? "enable" : "disable")); gtk_label_set_text(GTK_LABEL(ctk_object->error_dialog_label), str); gtk_window_set_resizable(GTK_WINDOW(ctk_object->error_dialog), FALSE); gtk_window_set_transient_for (GTK_WINDOW(ctk_object->error_dialog), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(ctk_object)))); gtk_widget_show(ctk_object->error_dialog); gtk_dialog_run(GTK_DIALOG(ctk_object->error_dialog)); gtk_widget_hide(ctk_object->error_dialog); } goto fail; } return; fail: g_signal_handlers_block_by_func(G_OBJECT(widget), G_CALLBACK(vcs_perf_checkbox_toggled), (gpointer) ctk_object); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), !enabled); gtk_widget_set_sensitive(widget, FALSE); g_signal_handlers_unblock_by_func(G_OBJECT(widget), G_CALLBACK(vcs_perf_checkbox_toggled), (gpointer) ctk_object); } static gboolean update_fan_status(CtkVcs *ctk_object) { gint ret; char *fan_entry_str = NULL; char *tokens; GtkWidget *table; GtkWidget *label; FanEntry current_fan; gchar output_str[16]; gint current_row; if (!ctk_object->fan_status_container) { return FALSE; } ret = NvCtrlGetStringAttribute(ctk_object->handle, NV_CTRL_STRING_VCSC_FAN_STATUS, &fan_entry_str); if (ret != NvCtrlSuccess) { return FALSE; } ctk_empty_container(ctk_object->fan_status_container); /* Generate the new table */ table = gtk_table_new(1, 3, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); gtk_box_pack_start(GTK_BOX(ctk_object->fan_status_container), table, FALSE, FALSE, 0); label = gtk_label_new("Fan Number"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_widget_set_size_request(label, ctk_object->req.width, -1); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Fan Speed"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Fan Status"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 2, 3, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); /* Parse string of fan entries and populate table */ current_row = 1; for (tokens = strtok(fan_entry_str, ";"); tokens; tokens = strtok(NULL, ";")) { /* Invalidate fan entry */ current_fan.fan_number = -1; current_fan.fan_speed = -1; current_fan.fan_failed = -1; parse_token_value_pairs(tokens, apply_fan_entry_token, ¤t_fan); if ((current_fan.fan_number != -1) && (current_fan.fan_speed != -1) && (current_fan.fan_failed != -1)) { gtk_table_resize(GTK_TABLE(table), current_row + 1, 3); g_snprintf(output_str, 16, "%d", current_fan.fan_number); label = gtk_label_new(output_str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_widget_set_size_request(label, ctk_object->req.width, -1); gtk_table_attach(GTK_TABLE(table), label, 0, 1, current_row, current_row + 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); g_snprintf(output_str, 16, "%d rpm", current_fan.fan_speed); label = gtk_label_new(output_str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, current_row, current_row + 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); if (!current_fan.fan_failed) { g_snprintf(output_str, 16, "Ok"); } else { g_snprintf(output_str, 16, "Failed"); } label = gtk_label_new(output_str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 2, 3, current_row, current_row + 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); current_row++; } else { nv_warning_msg("Incomplete Fan Entry (fan=%d, speed=%d, failFlag=%d)", current_fan.fan_number, current_fan.fan_speed, current_fan.fan_failed); } } gtk_widget_show_all(table); XFree(fan_entry_str); return TRUE; } /* * CTK VCS (Visual Computing System) widget creation * */ GtkWidget* ctk_vcs_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config) { GObject *object; CtkVcs *ctk_object; GtkWidget *label; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *event; GtkWidget *banner; GtkWidget *hseparator; GtkWidget *table; GtkWidget *scrollWin; GtkWidget *checkbutton; gchar *product_name; gchar *serial_number; gchar *build_date; gchar *product_id; gchar *firmware_version; gchar *hardware_version; gint current_row; gboolean high_perf_mode; ReturnStatus ret; gchar *s; char *psu_str = NULL; PSUEntry psuEntry; GtkWidget *vbox_scroll, *hbox_scroll; /* * get the static string data that we will display below */ /* Product Name */ ret = NvCtrlGetStringAttribute(handle, NV_CTRL_STRING_VCSC_PRODUCT_NAME, &product_name); if (ret != NvCtrlSuccess) { product_name = g_strdup("Unable to determine"); } /* Serial Number */ ret = NvCtrlGetStringAttribute(handle, NV_CTRL_STRING_VCSC_SERIAL_NUMBER, &serial_number); if (ret != NvCtrlSuccess) { serial_number = g_strdup("Unable to determine"); } /* Build Date */ ret = NvCtrlGetStringAttribute(handle, NV_CTRL_STRING_VCSC_BUILD_DATE, &build_date); if (ret != NvCtrlSuccess) { build_date = g_strdup("Unable to determine"); } /* Product ID */ ret = NvCtrlGetStringAttribute(handle, NV_CTRL_STRING_VCSC_PRODUCT_ID, &product_id); if (ret != NvCtrlSuccess) { product_id = g_strdup("Unable to determine"); } /* Firmware Version */ ret = NvCtrlGetStringAttribute(handle, NV_CTRL_STRING_VCSC_FIRMWARE_VERSION, &firmware_version); if (ret != NvCtrlSuccess) { firmware_version = g_strdup("Unable to determine"); } /* Hardware Version */ ret = NvCtrlGetStringAttribute(handle, NV_CTRL_STRING_VCSC_HARDWARE_VERSION, &hardware_version); if (ret != NvCtrlSuccess) { hardware_version = g_strdup("Unable to determine"); } /* now, create the object */ object = g_object_new(CTK_TYPE_VCS, NULL); ctk_object = CTK_VCS(object); /* cache the attribute handle */ ctk_object->handle = handle; ctk_object->ctk_config = ctk_config; /* set container properties of the object */ gtk_box_set_spacing(GTK_BOX(ctk_object), 10); /* banner */ banner = ctk_banner_image_new(BANNER_ARTWORK_VCS); gtk_box_pack_start(GTK_BOX(ctk_object), banner, FALSE, FALSE, 0); /* * This displays basic System information, including * display name, Operating system type and the NVIDIA driver version. */ vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(ctk_object), vbox, TRUE, TRUE, 0); /* General purpose error dialog */ ctk_object->error_dialog = create_error_dialog(ctk_object); if (NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_VCSC_HIGH_PERF_MODE, &high_perf_mode) == NvCtrlSuccess) { hbox = gtk_hbox_new(FALSE, 0); checkbutton = gtk_check_button_new_with_label("Enable High Performance Mode"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), high_perf_mode); g_signal_connect(G_OBJECT(checkbutton), "toggled", G_CALLBACK(vcs_perf_checkbox_toggled), (gpointer) ctk_object); gtk_box_pack_start(GTK_BOX(hbox), checkbutton, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); } /* Create the Scrolling Window */ scrollWin = gtk_scrolled_window_new(NULL, NULL); hbox_scroll = gtk_hbox_new(FALSE, 0); vbox_scroll = gtk_vbox_new(FALSE, 5); event = gtk_event_box_new(); ctk_force_text_colors_on_widget(event); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollWin), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); gtk_container_add(GTK_CONTAINER(event), hbox_scroll); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollWin), event); gtk_box_pack_start(GTK_BOX(hbox_scroll), vbox_scroll, TRUE, TRUE, 5); gtk_widget_set_size_request(scrollWin, -1, 50); gtk_box_pack_start(GTK_BOX(vbox), scrollWin, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox_scroll), hbox, FALSE, FALSE, 0); label = gtk_label_new("VCS Information"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); table = gtk_table_new(5, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox_scroll), table, FALSE, FALSE, 0); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); add_table_row(table, 0, 0, 0.5, "Product Name:", 0, 0.5, product_name); add_table_row(table, 1, 0, 0.5, "Serial Number:", 0, 0.5, serial_number); add_table_row(table, 2, 0, 0.5, "Build Date:", 0, 0.5, build_date); add_table_row(table, 3, 0, 0.5, "Product ID:", 0, 0.5, product_id); add_table_row(table, 4, 0, 0.5, "Firmware version:", 0, 0.5, firmware_version); add_table_row(table, 5, 0, 0.5, "Hardware version:", 0, 0.5, hardware_version); g_free(product_name); g_free(serial_number); g_free(build_date); g_free(product_id); g_free(firmware_version); g_free(hardware_version); /* Query Canoas 2.0 specific details */ if ((NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_VCSC_HIGH_PERF_MODE, &high_perf_mode) == NvCtrlSuccess) && (NvCtrlGetStringAttribute(ctk_object->handle, NV_CTRL_STRING_VCSC_PSU_INFO, &psu_str) == NvCtrlSuccess)) { GtkWidget *vbox_padding; /* Show the additional queried information */ /* Populate scrolling window with data */ vbox_padding = gtk_vbox_new(FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox_scroll), vbox_padding, FALSE, FALSE, 1); gtk_box_pack_start(GTK_BOX(vbox_scroll), hbox, FALSE, FALSE, 0); label = gtk_label_new("VCS Thermal Information"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); table = gtk_table_new(3, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox_scroll), table, FALSE, FALSE, 0); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); label = gtk_label_new("Intake Temperature:"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); ctk_object->intake_temp = label; label = gtk_label_new("Exhaust Temperature:"); /* This is the current largest label. Get its size */ gtk_widget_size_request(label, &ctk_object->req); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); ctk_object->exhaust_temp = label; label = gtk_label_new("Board Temperature:"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); ctk_object->board_temp = label; /* Populate table for PSU information */ psuEntry.psu_current = -1; psuEntry.psu_power = -1; psuEntry.psu_voltage = -1; psuEntry.psu_state = -1; if (psu_str) { parse_token_value_pairs(psu_str, apply_psu_entry_token, &psuEntry); } vbox_padding = gtk_vbox_new(FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox_scroll), vbox_padding, FALSE, FALSE, 1); gtk_box_pack_start(GTK_BOX(vbox_scroll), hbox, FALSE, FALSE, 0); label = gtk_label_new("VCS Power Supply Unit Information"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); table = gtk_table_new(4, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox_scroll), table, FALSE, FALSE, 0); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); label = gtk_label_new("PSU State:"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_widget_set_size_request(label, ctk_object->req.width, -1); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); ctk_object->psu_state = label; label = gtk_label_new("PSU Current:"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_widget_set_size_request(label, ctk_object->req.width, -1); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); ctk_object->psu_current = label; current_row = 2; if (psuEntry.psu_power != -1) { label = gtk_label_new("PSU Power:"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_widget_set_size_request(label, ctk_object->req.width, -1); gtk_table_attach(GTK_TABLE(table), label, 0, 1, current_row, current_row + 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, current_row, current_row + 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); ctk_object->psu_power = label; current_row++; } if (psuEntry.psu_voltage != -1) { label = gtk_label_new("PSU Voltage:"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_widget_set_size_request(label, ctk_object->req.width, -1); gtk_table_attach(GTK_TABLE(table), label, 0, 1, current_row, current_row + 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, current_row, current_row + 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); ctk_object->psu_voltage = label; } /* Create container for fan status table */ vbox_padding = gtk_vbox_new(FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox_scroll), vbox_padding, FALSE, FALSE, 1); gtk_box_pack_start(GTK_BOX(vbox_scroll), hbox, FALSE, FALSE, 0); label = gtk_label_new("VCS Fan Status"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox_scroll), hbox, FALSE, FALSE, 0); ctk_object->fan_status_container = hbox; /* Register a timer callback to update the dynamic information */ s = g_strdup_printf("VCS Monitor (VCS %d)", NvCtrlGetTargetId(ctk_object->handle)); ctk_config_add_timer(ctk_object->ctk_config, DEFAULT_UPDATE_VCS_INFO_TIME_INTERVAL, s, (GSourceFunc) update_vcs_info, (gpointer) ctk_object); g_free(s); update_vcs_info(ctk_object); } gtk_widget_show_all(GTK_WIDGET(object)); return GTK_WIDGET(object); } /* * VCS help screen */ GtkTextBuffer *ctk_vcs_create_help(GtkTextTagTable *table, CtkVcs *ctk_object) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "VCS (Visual Computing System) Help"); ctk_help_heading(b, &i, "Product Name"); ctk_help_para(b, &i, "This is the product name of the VCS."); ctk_help_heading(b, &i, "Serial Number"); ctk_help_para(b, &i, "This is the unique serial number of the VCS."); ctk_help_heading(b, &i, "Build Date"); ctk_help_para(b, &i, "This is the date the VCS was build, " "shown in a 'week.year' format"); ctk_help_heading(b, &i, "Product ID"); ctk_help_para(b, &i, "This identifies the VCS configuration."); ctk_help_heading(b, &i, "Firmware Version"); ctk_help_para(b, &i, "This is the firmware version currently running on " "the VCS."); ctk_help_heading(b, &i, "Hardware Version"); ctk_help_para(b, &i, "This is the hardware version of the VCS."); ctk_help_finish(b); return b; } void ctk_vcs_start_timer(GtkWidget *widget) { CtkVcs *ctk_vcs = CTK_VCS(widget); /* Start the VCS timer */ ctk_config_start_timer(ctk_vcs->ctk_config, (GSourceFunc) update_vcs_info, (gpointer) ctk_vcs); } void ctk_vcs_stop_timer(GtkWidget *widget) { CtkVcs *ctk_vcs = CTK_VCS(widget); /* Stop the VCS timer */ ctk_config_stop_timer(ctk_vcs->ctk_config, (GSourceFunc) update_vcs_info, (gpointer) ctk_vcs); } nvidia-settings/src/gtk+-2.x/ctkgvo-csc.h0000664000175000017500000000526512236467170020322 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_GVO_CSC_H__ #define __CTK_GVO_CSC_H__ #include "ctkevent.h" #include "ctkconfig.h" #include "ctkgvo.h" G_BEGIN_DECLS #define CTK_TYPE_GVO_CSC (ctk_gvo_csc_get_type()) #define CTK_GVO_CSC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_GVO_CSC, \ CtkGvoCsc)) #define CTK_GVO_CSC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_GVO_CSC, \ CtkGvoCscClass)) #define CTK_IS_GVO_CSC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_GVO_CSC)) #define CTK_IS_GVO_CSC_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_GVO_CSC)) #define CTK_GVO_CSC_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_GVO_CSC, \ CtkGvoCscClass)) typedef struct _CtkGvoCsc CtkGvoCsc; typedef struct _CtkGvoCscClass CtkGvoCscClass; struct _CtkGvoCsc { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; CtkEvent *ctk_event; CtkGvo *gvo_parent; GtkWidget *banner_box; int caps; float matrix[3][3]; // [row][column] float offset[3]; float scale[3]; gboolean applyImmediately; GtkWidget *matrixWidget[3][3]; GtkWidget *offsetWidget[3]; GtkWidget *scaleWidget[3]; GtkWidget *matrixTable; GtkWidget *offsetTable; GtkWidget *scaleTable; GtkWidget *overrideButton; GtkWidget *initializeDropDown; GtkWidget *applyImmediateButton; GtkWidget *applyButton; GtkWidget *cscOptions; }; struct _CtkGvoCscClass { GtkVBoxClass parent_class; }; GType ctk_gvo_csc_get_type (void) G_GNUC_CONST; GtkWidget* ctk_gvo_csc_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *, CtkGvo *); GtkTextBuffer *ctk_gvo_csc_create_help(GtkTextTagTable *, CtkGvoCsc *); void ctk_gvo_csc_select(GtkWidget *); void ctk_gvo_csc_unselect(GtkWidget *); G_END_DECLS #endif /* __CTK_GVO_CSC_H__ */ nvidia-settings/src/gtk+-2.x/ctkdisplaylayout.c0000664000175000017500000037457212236467170021671 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include /* malloc */ #include /* strlen */ #include #include #include #include #include "ctkevent.h" #include "ctkhelp.h" #include "ctkdisplaylayout.h" #include "ctkdisplayconfig-utils.h" #include "ctkutils.h" /* GUI look and feel */ #define DEFAULT_SNAP_STRENGTH 100 #define MAX_LAYOUT_WIDTH 0x00007FFF /* 16 bit signed int (32767) */ #define MAX_LAYOUT_HEIGHT 0x00007FFF #define LAYOUT_IMG_OFFSET 2 /* Border + White trimming */ #define LAYOUT_IMG_BORDER_PADDING 8 #define LAYOUT_IMG_FG_COLOR "black" #define LAYOUT_IMG_BG_COLOR "#AAAAAA" #define LAYOUT_IMG_SELECT_COLOR "#FF8888" /* Device (GPU) Coloring */ #define BG_SCR_ON 0 /* Screen viewing area (Has modeline set) */ #define BG_PAN_ON 1 /* Screen panning area (Has modeline set) */ #define BG_SCR_OFF 2 /* Screen viewing area (Off/Disabled) */ #define BG_PAN_OFF 3 /* Screen panning area (Off/Disabled) */ #define NUM_COLOR_PALETTES MAX_DEVICES /* One palette for each possible Device/GPU */ #define NUM_COLORS_PER_PALETTE 4 /* Number of colors in a device's palette */ #define NUM_COLORS ((NUM_COLOR_PALETTES) * (NUM_COLORS_PER_PALETTE)) #define COLOR_PALETTE_STEP_VALUE 0x181818 #if MAX_DEVICES != 64 #warning "Each GPU needs a color palette!" #endif /* Each device will need a unique color palette */ int __palettes_color_names[NUM_COLORS] = { 0xD9DBF4, /* Blue */ 0xFFDB94, /* Orange */ 0xE2D4F0, /* Purple */ 0xEAF1C9, /* Beige */ 0x96E562, /* Green */ 0xFFD6E9, /* Pink */ 0xEEEE7E, /* Yellow */ 0xC9EAF1, /* Teal */ 0xB9F282, 0xB298FE, 0x84FAE3, 0xE1928D, 0xFF8FE6, 0xB2F9BF, 0xA2E0FC, 0xFEBBAF, 0xF5B2FA, 0xA2B4F7, 0x96FA94, 0xE0F7A8, 0xFFFE9E, 0xF096BA, 0xB0FFE9, 0xFD8B9E, 0xB996DA, 0x83F3B0, 0xFFAF8C, 0xE086FE, 0xC4E1CB, 0xCDA3F7, 0xF1CEBE, 0xC0CFFF, 0x8A8AFA, 0xE8D399, 0xE381B6, 0xABB7A3, 0xDFE4E0, 0xA6FCD2, 0xFD85CC, 0x98E387, 0xF1E8AF, 0x82C2FF, 0xCCF599, 0xAA83F9, 0xD3FCC4, 0xFCB4CE, 0x8FECF8, 0xA8F4A5, 0xB0F1FF, 0x91A5FA, 0xB3C6EF, 0xE1B6EC, 0xD3C1FB, 0xDEE4BD, 0xD9F982, 0xFEE5C4, 0xEAB6B9, 0xB6E5E7, 0x81DCF2, 0x81F08F, 0xDCAACC, 0xCCF0D7, 0xF49FD4, 0xC0B7C2 }; /*** P R O T O T Y P E S *****************************************************/ static gboolean expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data); static gboolean configure_event_callback (GtkWidget *widget, GdkEventConfigure *event, gpointer data); static gboolean motion_event_callback (GtkWidget *widget, GdkEventMotion *event, gpointer data); static gboolean button_press_event_callback (GtkWidget *widget, GdkEventButton *event, gpointer data); static gboolean button_release_event_callback (GtkWidget *widget, GdkEventButton *event, gpointer data); static void calc_metamode(nvScreenPtr screen, nvMetaModePtr metamode); static Bool sync_layout(CtkDisplayLayout *ctk_object); /*** F U N C T I O N S *******************************************************/ /** queue_layout_redraw() ******************************************** * * Queues an expose event to happen on ourselves so we know to * redraw later. * **/ static void queue_layout_redraw(CtkDisplayLayout *ctk_object) { GtkWidget *drawing_area = ctk_object->drawing_area; GtkAllocation *allocation = &(drawing_area->allocation); GdkRectangle rect; if (!drawing_area->window) { return; } /* Queue an expose event */ rect.x = allocation->x; rect.y = allocation->x; rect.width = allocation->width; rect.height = allocation->height; gdk_window_invalidate_rect(drawing_area->window, &rect, TRUE); } /* queue_layout_redraw() */ /** zorder_layout() ************************************************** * * In order to draw and allow selecting display devices, we need to * keep them in a Z-ordered list. This function creates the initial * Z-order list for the given layout based on the devices it has. * **/ static void zorder_layout(CtkDisplayLayout *ctk_object) { nvLayoutPtr layout = ctk_object->layout; nvGpuPtr gpu; nvScreenPtr screen; nvDisplayPtr display; int z; /* Clean up */ if (ctk_object->Zorder) { free(ctk_object->Zorder); ctk_object->Zorder = NULL; } ctk_object->Zcount = 0; /* Count the number of Z-orderable elements in the layout */ ctk_object->Zcount = layout->num_screens; for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { ctk_object->Zcount += gpu->num_displays; } /* If there is nothing Z-orderable, we're done */ if (!ctk_object->Zcount) { return; } /* Create the Z-order buffer */ ctk_object->Zorder = calloc(ctk_object->Zcount, sizeof(ZNode)); if (!ctk_object->Zorder) { ctk_object->Zcount = 0; return; } /* Populate the Z-order list */ z = 0; /* Add screens */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { /* Add displays that belong to the screen */ for (display = screen->displays; display; display = display->next_in_screen) { ctk_object->Zorder[z].type = ZNODE_TYPE_DISPLAY; ctk_object->Zorder[z].u.display = display; z++; } /* Add the screen */ ctk_object->Zorder[z].type = ZNODE_TYPE_SCREEN; ctk_object->Zorder[z].u.screen = screen; z++; } /* Add displays that don't have screens */ for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { for (display = gpu->displays; display; display = display->next_on_gpu) { if (display->screen) continue; ctk_object->Zorder[z].type = ZNODE_TYPE_DISPLAY; ctk_object->Zorder[z].u.display = display; z++; } } } /* zorder_layout() */ /** get_metamode() *************************************************** * * Returns a screen's metamode_idx'th metamode, clamping to the last * available metamode in the list. * **/ static nvMetaModePtr get_metamode(nvScreenPtr screen, int metamode_idx) { nvMetaModePtr metamode = screen->metamodes; while (metamode && metamode->next && metamode_idx) { metamode = metamode->next; metamode_idx--; } return metamode; } /* get_metamode() */ /** get_mode() ******************************************************* * * Returns a display device's mode_idx'th mode. * **/ static nvModePtr get_mode(nvDisplayPtr display, int mode_idx) { nvModePtr mode = display->modes; while (mode && mode->next && mode_idx) { mode = mode->next; mode_idx--; } return mode; } /* get_mode() */ /** get_screen_rect ************************************************** * * Returns the dimension array to use as the screen's dimensions. * **/ static GdkRectangle *get_screen_rect(nvScreenPtr screen, Bool edim) { if (!screen) return NULL; if (screen->no_scanout || !screen->cur_metamode) { return &(screen->dim); } return edim ? &(screen->cur_metamode->edim) : &(screen->cur_metamode->dim); } /** get_modify_info() ************************************************ * * Gather information prior to moving/panning. * * Returns TRUE if something is selected and movable. * **/ static Bool get_modify_info(CtkDisplayLayout *ctk_object) { ModifyInfo *info = &(ctk_object->modify_info); Bool use_screen_instead; GdkRectangle *screen_rect; info->screen = ctk_object->selected_screen; info->display = ctk_object->selected_display; /* There must be an associated screen to move */ if (!info->screen) { info->display = NULL; return FALSE; } /* Don't allow modifying displays without modes */ if (info->display && !info->display->cur_mode) { info->screen = NULL; info->display = NULL; return FALSE; } /* Gather the initial screen dimensions */ screen_rect = get_screen_rect(info->screen, 0); info->orig_screen_dim = *(screen_rect); /* If a display device is being moved (not panned) and * it is the only display device in the screen to use * absolute positioning, then really we want to move * its associated screen. */ if (!ctk_object->modify_info.modify_panning && info->display && info->display->cur_mode->position_type == CONF_ADJ_ABSOLUTE) { nvDisplayPtr display; /* Make sure all other displays in the screen use * relative positioning. */ use_screen_instead = TRUE; for (display = info->display->screen->displays; display; display = display->next_in_screen) { if (display == info->display) continue; if (!display->cur_mode) continue; if (display->cur_mode->position_type == CONF_ADJ_ABSOLUTE) { use_screen_instead = FALSE; } } if (use_screen_instead) { info->display = NULL; } } /* Gather the initial state of what is being moved */ if (info->display) { info->target_position_type = &(info->display->cur_mode->position_type); info->target_dim = &(info->display->cur_mode->pan); } else { info->target_position_type = &(info->screen->position_type); info->target_dim = screen_rect; } info->orig_position_type = *(info->target_position_type); info->orig_dim = *(info->target_dim); /* Initialize where we moved to */ info->dst_dim = info->orig_dim; /* Initialize snapping */ info->best_snap_v = ctk_object->snap_strength +1; info->best_snap_h = ctk_object->snap_strength +1; /* Make sure the modify dim is up to date */ if (info->modify_dirty) { info->modify_dim = info->orig_dim; info->modify_dirty = 0; } return TRUE; } /* get_modify_info() */ /** sync_scaling() *************************************************** * * Computes the scaling required to display the layout image. * **/ static Bool sync_scaling(CtkDisplayLayout *ctk_object) { GdkRectangle *dim = &(ctk_object->layout->dim); float wscale; float hscale; float prev_scale = ctk_object->scale; wscale = (float)(ctk_object->img_dim.width) / (float)(dim->width); hscale = (float)(ctk_object->img_dim.height) / (float)(dim->height); if (wscale * dim->height > ctk_object->img_dim.height) { ctk_object->scale = hscale; } else { ctk_object->scale = wscale; } return (prev_scale != ctk_object->scale); } /* sync_scaling() */ /** point_in_dim() *************************************************** * * Determines if a point lies within the given dimensions * **/ static int point_in_rect(const GdkRectangle *rect, int x, int y) { if (x > rect->x && x < (rect->x + rect->width) && y > rect->y && y < (rect->y + rect->height)) { return 1; } return 0; } static int point_in_display(nvDisplayPtr display, int x, int y) { if (!display->cur_mode) { return 0; } return point_in_rect(&(display->cur_mode->pan), x, y); } static int point_in_screen(nvScreenPtr screen, int x, int y) { GdkRectangle *screen_rect = get_screen_rect(screen, 1); return point_in_rect(screen_rect, x, y); } /** get_point_relative_position() ************************************ * * Returns where the point (x, y) is, relative to the given rectangle * as: above, below, left-of, right-of, inside/clones. * **/ static int get_point_relative_position(GdkRectangle *rect, int x, int y) { float m1, b1; float m2, b2; float l1, l2; /* Point insize dim */ if (point_in_rect(rect, x, y)) { return CONF_ADJ_RELATIVE; } /* Compute cross lines of dimensions */ m1 = ((float) rect->height) / ((float) rect->width); b1 = ((float) rect->y) - (m1 * ((float) rect->x)); m2 = -m1; b2 = ((float) rect->y) + ((float) rect->height) - (m2 * ((float) rect->x)); /* Compute where point is relative to cross lines */ l1 = m1 * ((float) x) + b1 - ((float) y); l2 = m2 * ((float) x) + b2 - ((float) y); if (l1 > 0.0f) { if (l2 > 0.0f) { return CONF_ADJ_ABOVE; } else { return CONF_ADJ_RIGHTOF; } } else { if (l2 > 0.0f) { return CONF_ADJ_LEFTOF; } else { return CONF_ADJ_BELOW; } } } /* get_point_relative_position() */ /** offset functions ************************************************* * * Offsetting functions * * These functions do the dirty work of actually moving display * devices around in the layout. * **/ static void offset_mode(nvModePtr mode, int x, int y) { mode->pan.x += x; mode->pan.y += y; } static void offset_display(nvDisplayPtr display, int x, int y) { nvModePtr mode; for (mode = display->modes; mode; mode = mode->next) { offset_mode(mode, x, y); } } static void offset_metamode(nvScreenPtr screen, nvMetaModePtr metamode, int idx, int x, int y) { nvDisplayPtr display; metamode->dim.x += x; metamode->dim.y += y; metamode->edim.x += x; metamode->edim.y += y; for (display = screen->displays; display; display = display->next_in_screen) { nvModePtr mode = get_mode(display, idx); if (mode) { offset_mode(mode, x, y); } } } static void offset_screen(nvScreenPtr screen, int x, int y) { nvMetaModePtr metamode; nvDisplayPtr display; screen->dim.x += x; screen->dim.y += y; for (metamode = screen->metamodes; metamode; metamode = metamode->next) { metamode->dim.x += x; metamode->dim.y += y; metamode->edim.x += x; metamode->edim.y += y; } for (display = screen->displays; display; display = display->next_in_screen) { offset_display(display, x, y); } } /* Offsets the entire layout by offsetting its X screens and display devices */ static void offset_layout(nvLayoutPtr layout, int x, int y) { nvGpuPtr gpu; nvScreenPtr screen; nvDisplayPtr display; layout->dim.x += x; layout->dim.y += y; /* Offset screens */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { offset_screen(screen, x, y); } /* Offset disabled displays */ for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { for (display = gpu->displays; display; display = display->next_on_gpu) { if (display->screen) { continue; } offset_display(display, x, y); } } } /* offset functions */ /** resolve_display() ************************************************ * * Figures out where the current mode of the given display should be * placed in relation to the layout. * * XXX This function assumes there are no relationship loops * **/ static int resolve_display(nvDisplayPtr display, int mode_idx, GdkRectangle *pos) { nvModePtr mode = get_mode(display, mode_idx); GdkRectangle relative_pos; if (!mode) return 0; /* Set the dimensions */ pos->width = mode->pan.width; pos->height = mode->pan.height; /* Find the position */ switch (mode->position_type) { case CONF_ADJ_ABSOLUTE: pos->x = mode->pan.x; pos->y = mode->pan.y; break; case CONF_ADJ_RIGHTOF: resolve_display(mode->relative_to, mode_idx, &relative_pos); pos->x = relative_pos.x + relative_pos.width; pos->y = relative_pos.y; break; case CONF_ADJ_LEFTOF: resolve_display(mode->relative_to, mode_idx, &relative_pos); pos->x = relative_pos.x - pos->width; pos->y = relative_pos.y; break; case CONF_ADJ_BELOW: resolve_display(mode->relative_to, mode_idx, &relative_pos); pos->x = relative_pos.x; pos->y = relative_pos.y + relative_pos.height; break; case CONF_ADJ_ABOVE: resolve_display(mode->relative_to, mode_idx, &relative_pos); pos->x = relative_pos.x; pos->y = relative_pos.y - pos->height; break; case CONF_ADJ_RELATIVE: /* Clone */ resolve_display(mode->relative_to, mode_idx, &relative_pos); pos->x = relative_pos.x; pos->y = relative_pos.y; break; default: return 0; } return 1; } /* resolve_display() */ /** resolve_displays_in_screen() ************************************* * * Resolves relative display positions into absolute positions for * the currently selected metamode of the screen. * **/ static void resolve_displays_in_screen(nvScreenPtr screen, int resolve_all_modes) { nvDisplayPtr display; GdkRectangle rect; int first_idx; int last_idx; int mode_idx; if (resolve_all_modes) { first_idx = 0; last_idx = screen->num_metamodes -1; } else { first_idx = screen->cur_metamode_idx; last_idx = first_idx; } /* Resolve the current mode of each display in the screen */ for (display = screen->displays; display; display = display->next_in_screen) { for (mode_idx = first_idx; mode_idx <= last_idx; mode_idx++) { if (resolve_display(display, mode_idx, &rect)) { nvModePtr mode = get_mode(display, mode_idx); mode->pan.x = rect.x; mode->pan.y = rect.y; } } } /* Get the new position of the metamode(s) */ for (mode_idx = first_idx; mode_idx <= last_idx; mode_idx++) { calc_metamode(screen, get_metamode(screen, mode_idx)); } } /* resolve_displays_in_screen() */ /** resolve_screen() ************************************************* * * Figures out where the current metamode of the given screen should be * placed in relation to the layout. * * XXX This function assumes there are no relationship loops * **/ static int resolve_screen(nvScreenPtr screen, GdkRectangle *pos) { GdkRectangle *screen_rect = get_screen_rect(screen, 0); GdkRectangle relative_pos; if (!screen_rect) return 0; /* Set the dimensions */ pos->width = screen_rect->width; pos->height = screen_rect->height; /* Find the position */ switch (screen->position_type) { case CONF_ADJ_ABSOLUTE: pos->x = screen_rect->x; pos->y = screen_rect->y; break; case CONF_ADJ_RIGHTOF: resolve_screen(screen->relative_to, &relative_pos); pos->x = relative_pos.x + relative_pos.width; pos->y = relative_pos.y; break; case CONF_ADJ_LEFTOF: resolve_screen(screen->relative_to, &relative_pos); pos->x = relative_pos.x - pos->width; pos->y = relative_pos.y; break; case CONF_ADJ_BELOW: resolve_screen(screen->relative_to, &relative_pos); pos->x = relative_pos.x; pos->y = relative_pos.y + relative_pos.height; break; case CONF_ADJ_ABOVE: resolve_screen(screen->relative_to, &relative_pos); pos->x = relative_pos.x; pos->y = relative_pos.y - pos->height; break; case CONF_ADJ_RELATIVE: /* Clone */ resolve_screen(screen->relative_to, &relative_pos); pos->x = relative_pos.x; pos->y = relative_pos.y; break; default: return 0; } return 1; } /* resolve_screen() */ /* resolve_screen_in_layout() *************************************** * * Resolves relative screen positions into absolute positions for * the currently selected metamode of the screen. * **/ static void resolve_screen_in_layout(nvScreenPtr screen) { GdkRectangle pos; int x, y; GdkRectangle *screen_rect; /* Resolve the current screen location */ if (resolve_screen(screen, &pos)) { /* Move the screen and the displays by offsetting */ screen_rect = get_screen_rect(screen, 0); x = pos.x - screen_rect->x; y = pos.y - screen_rect->y; offset_screen(screen, x, y); } } /* resolve_screen_in_layout() */ /** resolve_layout() ************************************************* * * Resolves relative positions into absolute positions for the * the *current* layout. * **/ static void resolve_layout(nvLayoutPtr layout) { nvScreenPtr screen; /* First, resolve TwinView relationships */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { resolve_displays_in_screen(screen, 0); } /* Next, resolve X screen relationships */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { resolve_screen_in_layout(screen); } } /* resolve_layout() */ /** calc_metamode() ************************************************** * * Calculates the dimensions of a metamode. * * - Calculates the smallest bounding box that can hold the given * metamode of the X screen. * **/ static void calc_metamode(nvScreenPtr screen, nvMetaModePtr metamode) { nvDisplayPtr display; nvModePtr mode; int init = 1; int einit = 1; GdkRectangle *dim; // Bounding box for all modes, including NULL modes. GdkRectangle *edim; // Bounding box for non-NULL modes. if (!screen || !metamode) { return; } dim = &(metamode->dim); edim = &(metamode->edim); memset(dim, 0, sizeof(*dim)); memset(edim, 0, sizeof(*edim)); for (display = screen->displays; display; display = display->next_in_screen) { /* Get the display's mode that is part of the metamode. */ for (mode = display->modes; mode; mode = mode->next) { if (mode->metamode == metamode) break; } if (!mode) continue; if (init) { *dim = mode->pan; init = 0; } else { gdk_rectangle_union(dim, &(mode->pan), dim); } /* Don't include NULL modes in the effective dimension calculation */ if (!mode->modeline) continue; if (einit) { *edim = mode->pan; einit = 0; } else { gdk_rectangle_union(edim, &(mode->pan), edim); } } } /** calc_screen() **************************************************** * * Calculates the dimensions of an X screen * * - Calculates the smallest bounding box that can hold all of the * metamodes of the X screen. * **/ static void calc_screen(nvScreenPtr screen) { nvMetaModePtr metamode; GdkRectangle *dim; if (!screen || screen->no_scanout) return; dim = &(screen->dim); metamode = screen->metamodes; if (!metamode) { memset(dim, 0, sizeof(*dim)); return; } /* Init screen dimensions to size of first metamode */ calc_metamode(screen, metamode); *dim = metamode->dim; for (metamode = metamode->next; metamode; metamode = metamode->next) { calc_metamode(screen, metamode); gdk_rectangle_union(dim, &(metamode->dim), dim); } } /** calc_layout() **************************************************** * * Calculates the dimensions (width & height) of the layout. This is * the smallest bounding box that holds all the metamodes of all X * screens as well as dummy modes for disabled displays. * As a side effect, the dimensions of all metamodes for all X * screens are (re)calculated. * **/ static void calc_layout(nvLayoutPtr layout) { nvGpuPtr gpu; nvScreenPtr screen; nvDisplayPtr display; int init = 1; GdkRectangle *dim; int x, y; if (!layout) return; resolve_layout(layout); dim = &(layout->dim); memset(dim, 0, sizeof(*dim)); for (screen = layout->screens; screen; screen = screen->next_in_layout) { GdkRectangle *screen_rect; calc_screen(screen); screen_rect = get_screen_rect(screen, 0); if (init) { *dim = *screen_rect; init = 0; continue; } gdk_rectangle_union(dim, screen_rect, dim); } /* Position disabled display devices off to the top right */ x = dim->x + dim->width; y = dim->y; for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { for (display = gpu->displays; display; display = display->next_on_gpu) { if (display->screen) continue; display->cur_mode->pan.x = x; display->cur_mode->pan.y = y; x += display->cur_mode->pan.width; dim->width += display->cur_mode->pan.width; dim->height = NV_MAX(dim->height, display->cur_mode->pan.height); } } } /** realign_screen() ************************************************* * * Makes sure that all the top left corners of all the screen's metamodes * coincide. This is done by offsetting metamodes back to the screen's * bounding box top left corner. * **/ static Bool realign_screen(nvScreenPtr screen) { nvMetaModePtr metamode; int idx; Bool modified = FALSE; /* Calculate dimensions of screen and all metamodes */ calc_screen(screen); /* Offset metamodes back to screen's top left corner */ for (metamode = screen->metamodes, idx = 0; metamode; metamode = metamode->next, idx++) { int offset_x = (screen->dim.x - metamode->dim.x); int offset_y = (screen->dim.y - metamode->dim.y); if (offset_x || offset_y) { offset_metamode(screen, metamode, idx, offset_x, offset_y); modified = TRUE; } } return modified; } /** set_screen_metamode() ******************************************** * * Updates the layout structure to make the screen and each of its * displays point to the correct metamode/mode. * **/ static void set_screen_metamode(nvLayoutPtr layout, nvScreenPtr screen, int new_metamode_idx) { nvDisplayPtr display; /* Set which metamode the screen is pointing to */ screen->cur_metamode_idx = new_metamode_idx; screen->cur_metamode = get_metamode(screen, new_metamode_idx); /* Make each display within the screen point to the new mode */ for (display = screen->displays; display; display = display->next_in_screen) { display->cur_mode = get_mode(display, new_metamode_idx); } } /** reposition_screen() ********************************************** * * Call this after the relative position of a display has changed * to make sure the display's screen's absolute position does not * change as a result. (This function should be called before * calling calc_layout() such that the screen's top left position * can be preserved correctly.) * **/ static void reposition_screen(nvScreenPtr screen, int resolve_all_modes) { int orig_screen_x = screen->dim.x; int orig_screen_y = screen->dim.y; /* Resolve new relative positions. In basic mode, * relative position changes apply to all modes of a * display so we should resolve all modes (since they * were all changed.) */ resolve_displays_in_screen(screen, resolve_all_modes); /* Reestablish the screen's original position */ screen->dim.x = orig_screen_x; screen->dim.y = orig_screen_y; realign_screen(screen); } /* reposition_screen() */ /** switch_screen_to_absolute() ************************************** * * Prepare a screen for using absolute positioning. This is needed * since screens using relative positioning may not have all their * metamodes's top left corner coincide. This function makes sure * that all metamodes in the screen have the same top left corner by * offsetting the modes of metamodes that are offset from the screen's * bounding box top left corner. * **/ static void switch_screen_to_absolute(nvScreenPtr screen) { screen->position_type = CONF_ADJ_ABSOLUTE; screen->relative_to = NULL; realign_screen(screen); } /* switch_screen_to_absolute() */ /** snap_dim_to_dim() *********************************************** * * Snaps the sides of two rectangles together. * * Snaps the dimensions of "src" to those of "snap" if any part * of the "src" rectangle is within "snap_strength" of the "snap" * rectangle. The resulting, snapped, rectangle is returned in * "dst", along with the deltas (how far we needed to jump in order * to produce a snap) in the vertical and horizontal directions. * * No vertically snapping occurs if 'best_vert' is NULL. * No horizontal snapping occurs if 'best_horz' is NULL. * **/ static void snap_dim_to_dim(GdkRectangle *dst, GdkRectangle *src, GdkRectangle *snap, int snap_strength, int *best_vert, int *best_horz) { int dist; /* Snap vertically */ if (best_vert) { /* Snap top side to top side */ dist = abs(snap->y - src->y); if (dist < *best_vert) { dst->y = snap->y; *best_vert = dist; } /* Snap top side to bottom side */ dist = abs((snap->y + snap->height) - src->y); if (dist < *best_vert) { dst->y = snap->y + snap->height; *best_vert = dist; } /* Snap bottom side to top side */ dist = abs(snap->y - (src->y + src->height)); if (dist < *best_vert) { dst->y = snap->y - src->height; *best_vert = dist; } /* Snap bottom side to bottom side */ dist = abs((snap->y + snap->height) - (src->y + src->height)); if (dist < *best_vert) { dst->y = snap->y + snap->height - src->height; *best_vert = dist; } /* Snap midlines */ if (/* Top of 'src' is above bottom of 'snap' */ (src->y <= snap->y + snap->height + snap_strength) && /* Bottom of 'src' is below top of 'snap' */ (src->y + src->height >= snap->y - snap_strength)) { /* Snap vertically */ dist = abs((snap->y + snap->height/2) - (src->y + src->height/2)); if (dist < *best_vert) { dst->y = snap->y + snap->height/2 - src->height/2; *best_vert = dist; } } } /* Snap horizontally */ if (best_horz) { /* Snap left side to left side */ dist = abs(snap->x - src->x); if (dist < *best_horz) { dst->x = snap->x; *best_horz = dist; } /* Snap left side to right side */ dist = abs((snap->x + snap->width) - src->x); if (dist < *best_horz) { dst->x = snap->x + snap->width; *best_horz = dist; } /* Snap right side to left side */ dist = abs(snap->x - (src->x + src->width)); if (dist < *best_horz) { dst->x = snap->x - src->width; *best_horz = dist; } /* Snap right side to right side */ dist = abs((snap->x + snap->width) - (src->x + src->width)); if (dist < *best_horz) { dst->x = snap->x + snap->width - src->width; *best_horz = dist; } /* Snap midlines */ if (/* Left of 'src' is before right of 'snap' */ (src->x <= snap->x + snap->width + snap_strength) && /* Right of 'src' is after left of 'snap' */ (src->x + src->width >= snap->x - snap_strength)) { /* Snap vertically */ dist = abs((snap->x + snap->width/2) - (src->x + src->width/2)); if (dist < *best_horz) { dst->x = snap->x + snap->width/2 - src->width/2; *best_horz = dist; } } } } /* snap_dim_to_dim() */ /** snap_side_to_dim() ********************************************** * * Snaps the sides of src to snap and stores the result in dst * * Returns 1 if a snap occurred. * **/ static void snap_side_to_dim(GdkRectangle *dst, GdkRectangle *src, GdkRectangle *snap, int *best_vert, int *best_horz) { int dist; /* Snap vertically */ if (best_vert) { /* Snap side to top side */ dist = abs(snap->y - (src->y + src->height)); if (dist < *best_vert) { dst->height = snap->y - src->y; *best_vert = dist; } /* Snap side to bottom side */ dist = abs((snap->y + snap->height) - (src->y + src->height)); if (dist < *best_vert) { dst->height = snap->y + snap->height - src->y; *best_vert = dist; } } /* Snap horizontally */ if (best_horz) { /* Snap side to left side */ dist = abs(snap->x - (src->x + src->width)); if (dist < *best_horz) { dst->width = snap->x - src->x; *best_horz = dist; } /* Snap side to right side */ dist = abs((snap->x + snap->width) - (src->x + src->width)); if (dist < *best_horz) { dst->width = snap->x + snap->width - src->x; *best_horz = dist; } } } /* snap_side_to_dim() */ /** snap_move() ***************************************************** * * Snaps the modify info's source dimensions (src_dim) to other * displays/screens by moving the top left coord of the src_dim * such that one or two of the edges of the src_dim line up * with the closest other screen/display's dimensions. The results * of the snap are placed into the destination dimensions (dst_dim). * **/ static void snap_move(CtkDisplayLayout *ctk_object) { ModifyInfo *info = &(ctk_object->modify_info); int *bv; int *bh; int i; int dist; nvLayoutPtr layout = ctk_object->layout; nvScreenPtr screen; nvDisplayPtr other; GdkRectangle *screen_rect; /* Snap to other display's modes */ if (info->display) { for (i = 0; i < ctk_object->Zcount; i++) { if (ctk_object->Zorder[i].type != ZNODE_TYPE_DISPLAY) continue; other = ctk_object->Zorder[i].u.display; /* Other display must have a mode */ if (!other || !other->cur_mode || !other->screen || other == info->display) continue; /* Don't snap to displays that are somehow related. * XXX Check for nested relations. */ if (((other->cur_mode->position_type != CONF_ADJ_ABSOLUTE) && (other->cur_mode->relative_to == info->display)) || ((info->display->cur_mode->position_type != CONF_ADJ_ABSOLUTE) && (info->display->cur_mode->relative_to == other))) { continue; } /* NOTE: When the display devices' screens are relative to each * other, we may still want to allow snapping of the non- * related edges. This is useful, for example, when two * screens have a right of/left of relationship and * one of them is taller. */ bv = &info->best_snap_v; bh = &info->best_snap_h; if (((other->screen->position_type == CONF_ADJ_RIGHTOF) || (other->screen->position_type == CONF_ADJ_LEFTOF)) && (other->screen->relative_to == info->screen)) { bh = NULL; } if (((info->screen->position_type == CONF_ADJ_RIGHTOF) || (info->screen->position_type == CONF_ADJ_LEFTOF)) && (info->screen->relative_to == other->screen)) { bh = NULL; } if (((other->screen->position_type == CONF_ADJ_ABOVE) || (other->screen->position_type == CONF_ADJ_BELOW)) && (other->screen->relative_to == info->screen)) { bv = NULL; } if (((info->screen->position_type == CONF_ADJ_ABOVE) || (info->screen->position_type == CONF_ADJ_BELOW)) && (info->screen->relative_to == other->screen)) { bv = NULL; } /* Snap to other display's panning dimensions */ snap_dim_to_dim(&(info->dst_dim), &(info->src_dim), &(other->cur_mode->pan), ctk_object->snap_strength, bv, bh); /* Snap to other display's dimensions */ { GdkRectangle rect; get_viewportin_rect(other->cur_mode, &rect); snap_dim_to_dim(&(info->dst_dim), &(info->src_dim), &rect, ctk_object->snap_strength, bv, bh); } } } /* Done snapping to other displays */ /* Snap to dimensions of other X screens */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { if (screen == info->screen) continue; /* NOTE: When the (display devices') screens are relative to * each other, we may still want to allow snapping of the * non-related edges. This is useful, for example, when * two screens have a right of/left of relationship and * one of them is taller. */ bv = &info->best_snap_v; bh = &info->best_snap_h; if (((screen->position_type == CONF_ADJ_RIGHTOF) || (screen->position_type == CONF_ADJ_LEFTOF)) && (screen->relative_to == info->screen)) { bh = NULL; } if (((info->screen->position_type == CONF_ADJ_RIGHTOF) || (info->screen->position_type == CONF_ADJ_LEFTOF)) && (info->screen->relative_to == screen)) { bh = NULL; } /* If we aren't snapping horizontally with the other screen, * we shouldn't snap vertically either if we are moving the * top-most display in the screen. */ if (!bh && info->display && info->display->cur_mode->pan.y == info->screen->dim.y) { bv = NULL; } if (((screen->position_type == CONF_ADJ_ABOVE) || (screen->position_type == CONF_ADJ_BELOW)) && (screen->relative_to == info->screen)) { bv = NULL; } if (((info->screen->position_type == CONF_ADJ_ABOVE) || (info->screen->position_type == CONF_ADJ_BELOW)) && (info->screen->relative_to == screen)) { bv = NULL; } /* If we aren't snapping vertically with the other screen, * we shouldn't snap horizontally either if this is the * left-most display in the screen. */ if (!bv && info->display && info->display->cur_mode->pan.x == info->screen->dim.x) { bh = NULL; } screen_rect = get_screen_rect(screen, 0); snap_dim_to_dim(&(info->dst_dim), &(info->src_dim), screen_rect, ctk_object->snap_strength, bv, bh); } /* Snap to the maximum screen dimensions */ bv = &info->best_snap_v; bh = &info->best_snap_h; if (info->display) { dist = abs( (info->screen->dim.x + info->screen->max_width) -(info->src_dim.x + info->src_dim.width)); if (dist < *bh) { info->dst_dim.x = info->screen->dim.x + info->screen->max_width - info->src_dim.width; *bh = dist; } dist = abs( (info->screen->dim.y + info->screen->max_height) -(info->src_dim.y + info->src_dim.height)); if (dist < *bv) { info->dst_dim.y = info->screen->dim.y + info->screen->max_height - info->src_dim.height; *bv = dist; } } } /* snap_move() */ /** snap_pan() ****************************************************** * * Snaps the modify info's source dimensions (src_dim) bottom right * edge(s) to other displays/screens by growing/shrinking the * size of the src_dim such that the edge(s) of the src_dim line up * with the closest other screen/display's dimensions. The results * of the snap are placed into the destination dimensions (dst_dim). * * This is used for changing both the panning domain of a display * device as well as setting a (no-scanout) screen's virtual size. * **/ static void snap_pan(CtkDisplayLayout *ctk_object) { ModifyInfo *info = &(ctk_object->modify_info); int *bv; int *bh; int i; int dist; nvLayoutPtr layout = ctk_object->layout; nvScreenPtr screen; nvDisplayPtr other; GdkRectangle *screen_rect; if (info->display) { /* Snap to multiples of the display's dimensions */ const nvSize *cur_mode_size = &(info->display->cur_mode->viewPortIn); bh = &(info->best_snap_h); bv = &(info->best_snap_v); dist = info->src_dim.width % cur_mode_size->width; if (dist < *bh) { info->dst_dim.width = cur_mode_size->width * (int)(info->src_dim.width / cur_mode_size->width); *bh = dist; } dist = cur_mode_size->width - (info->src_dim.width % cur_mode_size->width); if (dist < *bh) { info->dst_dim.width = cur_mode_size->width * (1 + (int)(info->src_dim.width / cur_mode_size->width)); *bh = dist; } dist = abs(info->src_dim.height % cur_mode_size->height); if (dist < *bv) { info->dst_dim.height = cur_mode_size->height * (int)(info->src_dim.height / cur_mode_size->height); *bv = dist; } dist = cur_mode_size->height - (info->src_dim.height % cur_mode_size->height); if (dist < *bv) { info->dst_dim.height = cur_mode_size->height * (1 + (int)(info->src_dim.height / cur_mode_size->height)); *bv = dist; } } /* Snap to other display's modes */ for (i = 0; i < ctk_object->Zcount; i++) { if (ctk_object->Zorder[i].type != ZNODE_TYPE_DISPLAY) continue; other = ctk_object->Zorder[i].u.display; /* Other display must have a mode */ if (!other || !other->cur_mode || !other->screen || other == info->display) continue; /* NOTE: When display devices are relative to each other, * we may still want to allow snapping of the non-related * edges. This is useful, for example, when two * displays have a right of/left of relationship and * one of the displays is taller. */ bv = &info->best_snap_v; bh = &info->best_snap_h; /* Don't snap horizontally to other displays that are somehow * related on the right edge of the display being panned. */ if (info->display) { if ((other->cur_mode->position_type == CONF_ADJ_RIGHTOF) && other->cur_mode->relative_to == info->display) { bh = NULL; } if ((info->display->cur_mode->position_type == CONF_ADJ_LEFTOF) && info->display->cur_mode->relative_to == other) { bh = NULL; } } if ((other->screen->position_type == CONF_ADJ_RIGHTOF) && other->screen->relative_to == info->screen) { bh = NULL; } if ((info->screen->position_type == CONF_ADJ_LEFTOF) && info->screen->relative_to == other->screen) { bh = NULL; } /* Don't snap vertically to other displays that are somehow * related on the bottom edge of the display being panned. */ if (info->display) { if ((other->cur_mode->position_type == CONF_ADJ_BELOW) && other->cur_mode->relative_to == info->display) { bv = NULL; } if ((info->display->cur_mode->position_type == CONF_ADJ_ABOVE) && info->display->cur_mode->relative_to == other) { bv = NULL; } } if ((other->screen->position_type == CONF_ADJ_BELOW) && other->screen->relative_to == info->screen) { bv = NULL; } if ((info->screen->position_type == CONF_ADJ_ABOVE) && info->screen->relative_to == other->screen) { bv = NULL; } /* Snap to other display panning dimensions */ snap_side_to_dim(&(info->dst_dim), &(info->src_dim), &(other->cur_mode->pan), bv, bh); /* Snap to other display dimensions */ { GdkRectangle rect; get_viewportin_rect(other->cur_mode, &rect); snap_side_to_dim(&(info->dst_dim), &(info->src_dim), &rect, bv, bh); } } /* Snap to dimensions of other X screens */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { if (screen == info->screen) continue; bv = &info->best_snap_v; bh = &info->best_snap_h; /* Don't snap horizontally to other screens that are somehow * related on the right edge of the (display's) screen being * panned. */ if ((screen->position_type == CONF_ADJ_RIGHTOF) && (screen->relative_to == info->screen)) { bh = NULL; } if ((info->screen->position_type == CONF_ADJ_LEFTOF) && (info->screen->relative_to == screen)) { bh = NULL; } /* Don't snap vertically to other screens that are somehow * related on the bottom edge of the (display's) screen being * panned. */ if ((screen->position_type == CONF_ADJ_BELOW) && (screen->relative_to == info->screen)) { bv = NULL; } if ((info->screen->position_type == CONF_ADJ_ABOVE) && (info->screen->relative_to == screen)) { bv = NULL; } screen_rect = get_screen_rect(screen, 0); snap_side_to_dim(&(info->dst_dim), &(info->src_dim), screen_rect, bv, bh); } bh = &(info->best_snap_h); bv = &(info->best_snap_v); /* Snap to the maximum screen width */ dist = abs((info->screen->dim.x + info->screen->max_width) -(info->src_dim.x + info->src_dim.width)); if (dist < *bh) { info->dst_dim.width = info->screen->dim.x + info->screen->max_width - info->src_dim.x; *bh = dist; } /* Snap to the maximum screen height */ dist = abs((info->screen->dim.y + info->screen->max_height) -(info->src_dim.y + info->src_dim.height)); if (dist < *bv) { info->dst_dim.height = info->screen->dim.y + info->screen->max_height - info->src_dim.y; *bv = dist; } } /* snap_pan() */ /** move_selected() ************************************************** * * Moves whatever is selected by the given x and y offsets. This * function handles movement of relative and absolute positions as * well as snapping. * * Returns 1 if the layout was modified * **/ static int move_selected(CtkDisplayLayout *ctk_object, int x, int y, int snap) { nvLayoutPtr layout = ctk_object->layout; ModifyInfo *info = &(ctk_object->modify_info); int modified = 0; GdkRectangle *dim; /* Temp dimensions */ GdkRectangle *sdim; /* Temp screen dimensions */ info->modify_panning = 0; if (!get_modify_info(ctk_object)) return 0; /* Should we snap */ info->snap = snap; /* Moving something that is using relative positioning can be done * fairly cleanly with common code, so do that here. */ if (info->orig_position_type != CONF_ADJ_ABSOLUTE) { int p_x = (ctk_object->mouse_x - ctk_object->img_dim.x) / ctk_object->scale; int p_y = (ctk_object->mouse_y - ctk_object->img_dim.y) / ctk_object->scale; if (info->display) { dim = &(info->display->cur_mode->relative_to->cur_mode->pan); } else { dim = get_screen_rect(info->screen->relative_to, 0); } if (dim) { /* Compute the new orientation based on the mouse position */ *(info->target_position_type) = get_point_relative_position(dim, p_x, p_y); /* For displays, while in basic mode, make sure that the * relative position applies to all metamodes. */ if (info->display) { if (!ctk_object->advanced_mode) { nvModePtr mode; for (mode = info->display->modes; mode; mode = mode->next) { mode->position_type = *(info->target_position_type); } } /* Make sure the screen position does not change */ reposition_screen(info->screen, !ctk_object->advanced_mode); /* Always update the modify dim for relative positioning */ info->modify_dirty = 1; } } } else { /* Move via absolute positioning */ /* Compute pre-snap dimensions */ info->modify_dim.x += x; info->modify_dim.y += y; info->dst_dim = info->modify_dim; /* Snap to other screens and displays */ if (snap && ctk_object->snap_strength) { info->src_dim = info->dst_dim; snap_move(ctk_object); if (info->display) { /* Also snap display's panning box to other screens/displays */ info->src_dim.width = info->display->cur_mode->pan.width; info->src_dim.height = info->display->cur_mode->pan.height; info->dst_dim.width = info->src_dim.width; info->dst_dim.height = info->src_dim.height; snap_move(ctk_object); } } /* Get the bounding dimensions of what is being moved */ dim = info->target_dim; sdim = get_screen_rect(info->screen, 1); /* Prevent moving out of the max layout bounds */ x = MAX_LAYOUT_WIDTH - dim->width; if (info->dst_dim.x > x) { info->modify_dim.x += x - info->dst_dim.x; info->dst_dim.x = x; } y = MAX_LAYOUT_HEIGHT - dim->height; if (info->dst_dim.y > y) { info->modify_dim.y += y - info->dst_dim.y; info->dst_dim.y = y; } x = layout->dim.width - MAX_LAYOUT_WIDTH; if (info->dst_dim.x < x) { info->modify_dim.x += x - info->dst_dim.x; info->dst_dim.x = x; } y = layout->dim.height - MAX_LAYOUT_HEIGHT; if (info->dst_dim.y < y) { info->modify_dim.y += y - info->dst_dim.y; info->dst_dim.y = y; } /* Prevent screen from growing too big */ x = sdim->x + info->screen->max_width - dim->width; if (info->dst_dim.x > x) { info->modify_dim.x += x - info->dst_dim.x; info->dst_dim.x = x; } y = sdim->y + info->screen->max_height - dim->height; if (info->dst_dim.y > y) { info->modify_dim.y += y - info->dst_dim.y; info->dst_dim.y = y; } x = sdim->x + sdim->width - info->screen->max_width; if (info->dst_dim.x < x) { info->modify_dim.x += x - info->dst_dim.x; info->dst_dim.x = x; } y = sdim->y + sdim->height - info->screen->max_height; if (info->dst_dim.y < y) { info->modify_dim.y += y - info->dst_dim.y; info->dst_dim.y = y; } /* Apply the move */ if (!info->display) { /* Move the screen */ x = info->dst_dim.x - info->orig_dim.x; y = info->dst_dim.y - info->orig_dim.y; offset_screen(info->screen, x, y); } else { /* Move the display to its destination */ info->display->cur_mode->pan.x = info->dst_dim.x; info->display->cur_mode->pan.y = info->dst_dim.y; /* If the screen of the display that was moved is using absolute * positioning, we should check to see if the position of the * metamode has changed and if so, offset other metamodes on the * screen (hence moving the screen's position.) * * If the screen is using relative positioning, don't offset * metamodes since the screen's position is based on another * screen which will get resolved later. */ if (info->screen->position_type == CONF_ADJ_ABSOLUTE && info->screen->cur_metamode) { resolve_displays_in_screen(info->screen, 0); calc_metamode(info->screen, info->screen->cur_metamode); x = info->screen->cur_metamode->dim.x - info->orig_screen_dim.x; y = info->screen->cur_metamode->dim.y - info->orig_screen_dim.y; if (x || y) { nvDisplayPtr other; nvModePtr mode; for (other = info->screen->displays; other; other = other->next_in_screen) { for (mode = other->modes; mode; mode = mode->next) { /* Only move non-current modes */ if (mode == other->cur_mode) continue; /* Don't move modes that are relative */ if (mode->position_type != CONF_ADJ_ABSOLUTE) continue; offset_mode(mode, x, y); } } } } } } /* Recalculate layout dimensions and scaling */ if (sync_layout(ctk_object)) { modified = 1; } /* If what we moved required the layout to be shifted, offset * the modify dim (used for snapping) by the same displacement. */ x = info->target_dim->x - info->dst_dim.x; y = info->target_dim->y - info->dst_dim.y; if (x || y) { info->modify_dim.x += x; info->modify_dim.y += y; } /* Check if the item being moved has a new position */ if (*(info->target_position_type) != info->orig_position_type || info->target_dim->x != info->orig_dim.x || info->target_dim->y != info->orig_dim.y) { modified = 1; } // XXX Screen could have changed position due to display moving. return modified; } /* move_selected() */ /** pan_selected() *************************************************** * * Changes the size of the panning domain of the selected display. * **/ static int pan_selected(CtkDisplayLayout *ctk_object, int x, int y, int snap) { ModifyInfo *info = &(ctk_object->modify_info); int modified = 0; GdkRectangle *dim; int extra; info->modify_panning = 1; if (!get_modify_info(ctk_object)) return 0; /* Only allow changing the panning of displays and the size * of no-scanout screens. */ if (!info->display && !info->screen->no_scanout) return 0; info->snap = snap; /* Compute pre-snap dimensions */ info->modify_dim.width += x; info->modify_dim.height += y; /* Don't allow the thing being modified to get too small */ if (info->display) { clamp_rect_to_viewportin(&(info->modify_dim), info->display->cur_mode); } else if (info->screen->no_scanout) { clamp_screen_size_rect(&(info->modify_dim)); } info->dst_dim.width = info->modify_dim.width; info->dst_dim.height = info->modify_dim.height; /* Snap to other screens and dimensions */ if (snap && ctk_object->snap_strength) { info->src_dim = info->dst_dim; snap_pan(ctk_object); } /* Make sure no-scanout virtual screen width is at least a multiple of 8 */ if (info->screen->no_scanout) { extra = (info->dst_dim.width % 8); if (extra > 0) { info->dst_dim.width += (8 - extra); } } /* Panning should not cause us to exceed the maximum layout dimensions */ x = MAX_LAYOUT_WIDTH - info->dst_dim.x; if (info->dst_dim.width > x) { info->modify_dim.width += x - info->dst_dim.width; info->dst_dim.width = x; } y = MAX_LAYOUT_HEIGHT - info->dst_dim.y; if (info->dst_dim.height > y) { info->modify_dim.height += y - info->dst_dim.height; info->dst_dim.height = y; } /* Panning should not cause us to exceed the maximum screen dimensions */ dim = get_screen_rect(info->screen, 1); x = dim->x + info->screen->max_width - info->dst_dim.x; if (info->dst_dim.width > x) { info->modify_dim.width += x - info->dst_dim.width; info->dst_dim.width = x; } y = dim->y + info->screen->max_height - info->dst_dim.y; if (info->dst_dim.height > y) { info->modify_dim.height += y - info->dst_dim.height; info->dst_dim.height = y; } /* Panning domain can never be smaller then the display ViewPortIn */ if (info->display) { clamp_rect_to_viewportin(&(info->dst_dim), info->display->cur_mode); } else if (info->screen->no_scanout) { clamp_screen_size_rect(&(info->dst_dim)); } /* Assign the new size */ info->target_dim->width = info->dst_dim.width; info->target_dim->height = info->dst_dim.height; /* Recalculate layout dimensions and scaling */ if (sync_layout(ctk_object)) { modified = 1; } /* Check if the item being moved has a new position */ /* Report if anything changed */ if (info->target_dim->width != info->orig_dim.width || info->target_dim->height != info->orig_dim.height) { modified = 1; } // XXX Screen could have changed position due to display moving. return modified; } /* pan_selected() */ /** get_screen_zorder_move_data() ************************************ * * Looks for the screen in the Z order, and if the position given * where the screen is to be moved to is different than there the * screen currently is, returns a backup buffer of the zorder of * the screen and its displays (also also returns the current zorder * position of the screen). * **/ static ZNode *get_screen_zorder_move_data(CtkDisplayLayout *ctk_object, nvScreenPtr screen, int move_to, int *screen_at) { ZNode *tmpzo; int i; if (!screen) return NULL; for (i = 0; i < ctk_object->Zcount; i++) { if (ctk_object->Zorder[i].type == ZNODE_TYPE_SCREEN && ctk_object->Zorder[i].u.screen == screen) { /* Only move screen if it is not moving to the same location */ if (move_to != i) { tmpzo = malloc((1 + screen->num_displays) * sizeof(ZNode)); if (!tmpzo) return NULL; memcpy(tmpzo, ctk_object->Zorder + i - screen->num_displays, (1 + screen->num_displays)*sizeof(ZNode)); if (screen_at) { *screen_at = i; } return tmpzo; } break; } } return NULL; } /* get_screen_zorder_move_data() */ /** select_screen() ************************************************** * * Selects the given screen (by moving it and all of its displays * to the top of the zorder). * **/ static void select_screen(CtkDisplayLayout *ctk_object, nvScreenPtr screen) { int move_to = 0; int screen_at; ZNode *tmpzo; if (!screen) { goto done; } /* Move the screen and its displays to the top */ move_to = 0 + screen->num_displays; tmpzo = get_screen_zorder_move_data(ctk_object, screen, move_to, &screen_at); if (!tmpzo) { goto done; } /* Move other nodes down to make room at the top */ memmove(ctk_object->Zorder + 1 + screen->num_displays, ctk_object->Zorder, (screen_at - screen->num_displays)*sizeof(ZNode)); /* Copy the screen and its displays to the top */ memcpy(ctk_object->Zorder, tmpzo, (1 + screen->num_displays)*sizeof(ZNode)); free(tmpzo); done: ctk_object->selected_screen = screen; } /* select_screen() */ /** select_display() ************************************************* * * Moves the specified display to the top of the Z-order. * **/ static void select_display(CtkDisplayLayout *ctk_object, nvDisplayPtr display) { int i; if (!display) { select_screen(ctk_object, NULL); goto done; } /* Move the screen and its displays to the top of the Z order */ select_screen(ctk_object, display->screen); /* Move the display to the top of the Z order */ for (i = 0; i < ctk_object->Zcount; i++) { /* Find the display */ if (ctk_object->Zorder[i].type == ZNODE_TYPE_DISPLAY && ctk_object->Zorder[i].u.display == display) { /* Move all nodes above this one down by one location */ if (i > 0) { memmove(ctk_object->Zorder + 1, ctk_object->Zorder, i*sizeof(ZNode)); /* Place the display at the top */ ctk_object->Zorder[0].type = ZNODE_TYPE_DISPLAY; ctk_object->Zorder[0].u.display = display; } break; } } done: ctk_object->selected_display = display; } /* select_display() */ /** select_default_item() ******************************************** * * Select the top left most element (display/screen). * */ #define DIST_SQR(D) (((D).x * (D).x) + ((D).y * (D).y)) static void select_default_item(CtkDisplayLayout *ctk_object) { nvDisplayPtr sel_display = NULL; nvScreenPtr sel_screen = NULL; nvScreenPtr screen; nvDisplayPtr display; int i; int best_dst = -1; // Distance squared to element. int dst; /* Clear the selection */ ctk_object->selected_display = NULL; ctk_object->selected_screen = NULL; for (i = 0; i < ctk_object->Zcount; i++) { if (ctk_object->Zorder[i].type == ZNODE_TYPE_DISPLAY) { display = ctk_object->Zorder[i].u.display; /* Ignore disabled displays */ if (!display->cur_mode) continue; dst = DIST_SQR(display->cur_mode->pan); if (best_dst < 0 || dst < best_dst) { best_dst = dst; sel_display = display; sel_screen = NULL; } } else if (ctk_object->Zorder[i].type == ZNODE_TYPE_SCREEN) { screen = ctk_object->Zorder[i].u.screen; /* Only select no-scanout screens */ if (screen->num_displays > 0) continue; dst = DIST_SQR(screen->dim); if (best_dst < 0 || dst < best_dst) { best_dst = dst; sel_display = NULL; sel_screen = screen; } } } if (sel_display) { select_display(ctk_object, sel_display); } else if (sel_screen) { select_screen(ctk_object, sel_screen); } } /* select_default_item() */ /** get_display_tooltip() ******************************************** * * Returns the text to use for displaying a tooltip from the given * display: * * MONITOR NAME : WIDTHxHEIGHT @ HERTZ (GPU NAME) * * The caller should free the string that is returned. * **/ static char *get_display_tooltip(nvDisplayPtr display, Bool advanced) { char *tip; /* No display given */ if (!display) { return NULL; } /* Display does not have a screen (not configured) */ if (!(display->screen)) { tip = g_strdup_printf("%s : Disabled (GPU: %s)", display->logName, display->gpu->name); /* Basic view */ } else if (!advanced) { /* Display has no mode */ if (!display->cur_mode) { tip = g_strdup_printf("%s", display->logName); /* Display does not have a current modeline (Off) */ } else if (!(display->cur_mode->modeline)) { tip = g_strdup_printf("%s : Off", display->logName); /* Display has mode/modeline */ } else { float ref = display->cur_mode->modeline->refresh_rate; tip = g_strdup_printf("%s : %dx%d @ %.*f Hz", display->logName, display->cur_mode->modeline->data.hdisplay, display->cur_mode->modeline->data.vdisplay, (display->is_sdi ? 3 : 0), ref); } /* Advanced view */ } else { /* Display has no mode */ if (!display->cur_mode) { tip = g_strdup_printf("%s\n(X Screen %d)\n(GPU: %s)", display->logName, display->screen->scrnum, display->gpu->name); /* Display does not have a current modeline (Off) */ } else if (!(display->cur_mode->modeline)) { tip = g_strdup_printf("%s : Off\n(X Screen %d)\n(GPU: %s)", display->logName, display->screen->scrnum, display->gpu->name); /* Display has mode/modeline */ } else { float ref = display->cur_mode->modeline->refresh_rate; tip = g_strdup_printf("%s : %dx%d @ %.*f Hz\n(X Screen %d)\n" "(GPU: %s)", display->logName, display->cur_mode->modeline->data.hdisplay, display->cur_mode->modeline->data.vdisplay, (display->is_sdi ? 3 : 0), ref, display->screen->scrnum, display->gpu->name); } } return tip; } /* get_display_tooltip() */ /** get_screen_tooltip() ********************************************* * * Returns the text to use for displaying a tooltip from the given * screen. The caller should free the string that is returned. * **/ static char *get_screen_tooltip(nvScreenPtr screen) { char *tip; /* No display given */ if (!screen) { return NULL; } tip = g_strdup_printf("X Screen %d%s", screen->scrnum, screen->no_scanout ? " : No Scanout" : ""); return tip; } /* get_screen_tooltip() */ /** get_tooltip_under_mouse() **************************************** * * Returns the tooltip text that should be used to give information * about the item under the mouse at x, y. * * The caller should free the string that is returned. * **/ static char *get_tooltip_under_mouse(CtkDisplayLayout *ctk_object, int x, int y) { static nvDisplayPtr last_display = NULL; static nvScreenPtr last_screen = NULL; int i; nvDisplayPtr display = NULL; nvScreenPtr screen = NULL; char *tip = NULL; /* Scale and offset x & y so they reside in clickable area */ x = (x -ctk_object->img_dim.x) / ctk_object->scale; y = (y -ctk_object->img_dim.y) / ctk_object->scale; /* Go through the Z-order looking for what we are under */ for (i = 0; i < ctk_object->Zcount; i++) { if (ctk_object->Zorder[i].type == ZNODE_TYPE_DISPLAY) { display = ctk_object->Zorder[i].u.display; if (point_in_display(display, x, y)) { screen = NULL; if (display == last_display) { goto found; } tip = get_display_tooltip(display, ctk_object->advanced_mode); goto found; } } else if (ctk_object->Zorder[i].type == ZNODE_TYPE_SCREEN) { screen = ctk_object->Zorder[i].u.screen; if (point_in_screen(screen, x, y)) { display = NULL; if (screen == last_screen) { goto found; } tip = get_screen_tooltip(screen); goto found; } } } /* Handle mouse over nothing for the first time */ if (last_display || last_screen) { last_display = NULL; last_screen = NULL; return g_strdup("No Display"); } return NULL; found: last_display = display; last_screen = screen; return tip; } /* get_tooltip_under_mouse() */ /** click_layout() *************************************************** * * Preforms a click in the layout, possibly selecting a display. * **/ static int click_layout(CtkDisplayLayout *ctk_object, int x, int y) { int i; nvDisplayPtr cur_selected_display = ctk_object->selected_display; nvScreenPtr cur_selected_screen = ctk_object->selected_screen; nvDisplayPtr display; nvScreenPtr screen; GdkModifierType state; /* Assume user didn't actually click inside a display for now */ ctk_object->clicked_outside = 1; ctk_object->selected_display = NULL; ctk_object->selected_screen = NULL; gdk_window_get_pointer (GTK_WIDGET(ctk_get_parent_window(ctk_object->drawing_area))->window, NULL, NULL, &state); /* Look through the Z-order for the next element */ for (i = 0; i < ctk_object->Zcount; i++) { if (ctk_object->Zorder[i].type == ZNODE_TYPE_DISPLAY) { display = ctk_object->Zorder[i].u.display; if (point_in_display(display, x, y)) { select_display(ctk_object, display); ctk_object->clicked_outside = 0; break; } } else if (ctk_object->Zorder[i].type == ZNODE_TYPE_SCREEN) { screen = ctk_object->Zorder[i].u.screen; if (point_in_screen(screen, x, y)) { select_screen(ctk_object, screen); ctk_object->clicked_outside = 0; break; } } } /* Select display's X screen when CTRL is held down on click */ if (ctk_object->selected_screen && (state & GDK_CONTROL_MASK)) { ctk_object->selected_display = NULL; } /* Don't allow clicking outside - reselect what was last selected */ if (ctk_object->clicked_outside) { ctk_object->selected_display = cur_selected_display; ctk_object->selected_screen = cur_selected_screen; } else { /* Sync modify dimensions to what was newly selected */ ctk_object->modify_info.modify_dirty = 1; } return 1; } /* click_layout() */ /** ctk_display_layout_get_type() ************************************ * * Returns the CtkDisplayLayout type. * **/ GType ctk_display_layout_get_type(void) { static GType ctk_display_layout_type = 0; if (!ctk_display_layout_type) { static const GTypeInfo ctk_display_layout_info = { sizeof (CtkDisplayLayoutClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof(CtkDisplayLayout), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_display_layout_type = g_type_register_static (GTK_TYPE_VBOX, "CtkDisplayLayout", &ctk_display_layout_info, 0); } return ctk_display_layout_type; } /* ctk_display_layout_get_type() */ /** ctk_display_layout_new() ***************************************** * * CTK Display Layout widget creation. * */ GtkWidget* ctk_display_layout_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, nvLayoutPtr layout, int width, int height) { GObject *object; CtkDisplayLayout *ctk_object; GtkWidget *tmp; PangoFontDescription *font_description; int i, j; /* Make sure we have a handle */ g_return_val_if_fail(handle != NULL, NULL); /* Create the ctk object */ object = g_object_new(CTK_TYPE_DISPLAY_LAYOUT, NULL); ctk_object = CTK_DISPLAY_LAYOUT(object); ctk_object->selected_callback = NULL; ctk_object->selected_callback_data = NULL; ctk_object->modified_callback = NULL; ctk_object->modified_callback_data = NULL; ctk_object->Zorder = NULL; ctk_object->Zcount = 0; /* Setup widget properties */ ctk_object->ctk_config = ctk_config; ctk_object->handle = handle; ctk_object->layout = layout; sync_layout(ctk_object); zorder_layout(ctk_object); select_default_item(ctk_object); /* Setup Pango layout/font */ ctk_object->pango_layout = gtk_widget_create_pango_layout(GTK_WIDGET(ctk_object), NULL); pango_layout_set_alignment(ctk_object->pango_layout, PANGO_ALIGN_CENTER); font_description = pango_font_description_new(); pango_font_description_set_family(font_description, "Sans"); pango_font_description_set_weight(font_description, PANGO_WEIGHT_BOLD); pango_layout_set_font_description(ctk_object->pango_layout, font_description); /* Setup colors */ gdk_color_parse(LAYOUT_IMG_FG_COLOR, &(ctk_object->fg_color)); gdk_color_parse(LAYOUT_IMG_BG_COLOR, &(ctk_object->bg_color)); gdk_color_parse(LAYOUT_IMG_SELECT_COLOR, &(ctk_object->select_color)); /* Parse the device color palettes */ ctk_object->color_palettes = calloc(NUM_COLORS, sizeof(GdkColor)); for (i = 0; i < NUM_COLOR_PALETTES; i++) { for (j = 0; j < NUM_COLORS_PER_PALETTE; j++) { int color = __palettes_color_names[i] - (j * COLOR_PALETTE_STEP_VALUE); int index = i * NUM_COLORS_PER_PALETTE + j; /* * Convert the reference 24 bit 0xRRGGBB hex value to the GdkColor * struct that uses 16 bit ints for each color value. We also need * to shift the color values to the most significant end of these * fields. */ ctk_object->color_palettes[index].red = (color & 0xff0000) >> 8; ctk_object->color_palettes[index].green = (color & 0xff00); ctk_object->color_palettes[index].blue = (color & 0xff) << 8; } } /* Setup the layout state variables */ ctk_object->snap_strength = DEFAULT_SNAP_STRENGTH; /* Make the drawing area */ tmp = gtk_drawing_area_new(); gtk_widget_add_events(tmp, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); g_signal_connect (G_OBJECT (tmp), "expose_event", G_CALLBACK (expose_event_callback), (gpointer)(ctk_object)); g_signal_connect (G_OBJECT (tmp), "configure_event", G_CALLBACK (configure_event_callback), (gpointer)(ctk_object)); g_signal_connect (G_OBJECT (tmp), "motion_notify_event", G_CALLBACK (motion_event_callback), (gpointer)(ctk_object)); g_signal_connect (G_OBJECT (tmp), "button_press_event", G_CALLBACK (button_press_event_callback), (gpointer)(ctk_object)); g_signal_connect (G_OBJECT (tmp), "button_release_event", G_CALLBACK (button_release_event_callback), (gpointer)(ctk_object)); GTK_WIDGET_SET_FLAGS(tmp, GTK_DOUBLE_BUFFERED); ctk_object->drawing_area = tmp; gtk_widget_set_size_request(tmp, width, height); /* Set container properties of the object */ gtk_box_set_spacing(GTK_BOX(ctk_object), 0); ctk_object->tooltip_area = gtk_event_box_new(); ctk_object->tooltip_group = gtk_tooltips_new(); gtk_tooltips_enable(ctk_object->tooltip_group); gtk_tooltips_set_tip(ctk_object->tooltip_group, ctk_object->tooltip_area, "*** No Display ***", NULL); gtk_container_add(GTK_CONTAINER(ctk_object->tooltip_area), tmp); gtk_box_pack_start(GTK_BOX(object), ctk_object->tooltip_area, TRUE, TRUE, 0); return GTK_WIDGET(ctk_object); } /* ctk_display_layout_new() */ /** get_widget_fg_gc() *********************************************** * * Returns the foreground graphics context of the given widget. If * this function returns NULL, then drawing on this widget is not * currently possible and should be avoided. * **/ static GdkGC *get_widget_fg_gc(GtkWidget *widget) { GtkStyle *style = gtk_widget_get_style(widget); if (!style) return NULL; return style->fg_gc[GTK_WIDGET_STATE(widget)]; } /* get_widget_fg_gc() */ /** draw_rect() ****************************************************** * * Draws a solid or wireframe rectangle to scale of the given color * in the given widget. * **/ static void draw_rect(CtkDisplayLayout *ctk_object, GdkRectangle *rect, GdkColor *color, int fill) { GtkWidget *drawing_area = ctk_object->drawing_area; GdkGC *fg_gc = get_widget_fg_gc(drawing_area); /* Setup color to use */ gdk_gc_set_rgb_fg_color(fg_gc, color); /* Draw the rectangle */ gdk_draw_rectangle(ctk_object->pixmap, fg_gc, fill, ctk_object->img_dim.x + ctk_object->scale * rect->x, ctk_object->img_dim.y + ctk_object->scale * rect->y, ctk_object->scale * rect->width, ctk_object->scale * rect->height); } /* draw_rect() */ /** draw_rect_strs() ************************************************* * * Draws possibly 2 rows of text in the middle of a bounding, * scaled rectangle. If the text does not fit, it is not drawn. * **/ static void draw_rect_strs(CtkDisplayLayout *ctk_object, GdkRectangle *rect, GdkColor *color, const char *str_1, const char *str_2) { GtkWidget *drawing_area = ctk_object->drawing_area; GdkGC *fg_gc = get_widget_fg_gc(drawing_area); char *str; int txt_w; int txt_h; int txt_x, txt_x1, txt_x2; int txt_y, txt_y1, txt_y2; int draw_1 = 0; int draw_2 = 0; if (str_1) { pango_layout_set_text(ctk_object->pango_layout, str_1, -1); pango_layout_get_pixel_size(ctk_object->pango_layout, &txt_w, &txt_h); if (txt_w +8 <= ctk_object->scale * rect->width && txt_h +8 <= ctk_object->scale * rect->height) { draw_1 = 1; } } if (str_2) { pango_layout_set_text(ctk_object->pango_layout, str_2, -1); pango_layout_get_pixel_size(ctk_object->pango_layout, &txt_w, &txt_h); if (txt_w +8 <= ctk_object->scale * rect->width && txt_h +8 <= ctk_object->scale * rect->height) { draw_2 = 1; } str = g_strconcat(str_1, "\n", str_2, NULL); pango_layout_set_text(ctk_object->pango_layout, str, -1); pango_layout_get_pixel_size(ctk_object->pango_layout, &txt_w, &txt_h); if (draw_1 && draw_2 && txt_h +8 > ctk_object->scale * rect->height) { draw_2 = 0; } g_free(str); } if (draw_1 && !draw_2) { pango_layout_set_text(ctk_object->pango_layout, str_1, -1); pango_layout_get_pixel_size(ctk_object->pango_layout, &txt_w, &txt_h); txt_x1 = ctk_object->scale*(rect->x + rect->width / 2) - (txt_w / 2); txt_y1 = ctk_object->scale*(rect->y + rect->height / 2) - (txt_h / 2); /* Write name */ gdk_gc_set_rgb_fg_color(fg_gc, color); gdk_draw_layout(ctk_object->pixmap, fg_gc, ctk_object->img_dim.x + txt_x1, ctk_object->img_dim.y + txt_y1, ctk_object->pango_layout); } else if (!draw_1 && draw_2) { pango_layout_set_text(ctk_object->pango_layout, str_2, -1); pango_layout_get_pixel_size(ctk_object->pango_layout, &txt_w, &txt_h); txt_x2 = ctk_object->scale*(rect->x + rect->width / 2) - (txt_w / 2); txt_y2 = ctk_object->scale*(rect->y + rect->height / 2) - (txt_h / 2); /* Write dimensions */ gdk_gc_set_rgb_fg_color(fg_gc, color); gdk_draw_layout(ctk_object->pixmap, fg_gc, ctk_object->img_dim.x + txt_x2, ctk_object->img_dim.y + txt_y2, ctk_object->pango_layout); } else if (draw_1 && draw_2) { str = g_strconcat(str_1, "\n", str_2, NULL); pango_layout_set_text(ctk_object->pango_layout, str, -1); pango_layout_get_pixel_size(ctk_object->pango_layout, &txt_w, &txt_h); txt_x = ctk_object->scale*(rect->x + rect->width / 2) - (txt_w / 2); txt_y = ctk_object->scale*(rect->y + rect->height / 2) - (txt_h / 2); /* Write both */ gdk_gc_set_rgb_fg_color(fg_gc, color); gdk_draw_layout(ctk_object->pixmap, fg_gc, ctk_object->img_dim.x + txt_x, ctk_object->img_dim.y + txt_y, ctk_object->pango_layout); g_free(str); } } /* draw_rect_strs() */ /** draw_display() *************************************************** * * Draws a display to scale within the layout. * **/ static void draw_display(CtkDisplayLayout *ctk_object, nvDisplayPtr display) { nvModePtr mode; int base_color_idx; int color_idx; char *tmp_str; GdkRectangle rect; if (!display || !(display->cur_mode)) { return; } mode = display->cur_mode; base_color_idx = NUM_COLORS_PER_PALETTE * NvCtrlGetTargetId(display->gpu->handle); /* Draw panning */ color_idx = base_color_idx + ((mode->modeline) ? BG_PAN_ON : BG_PAN_OFF); draw_rect(ctk_object, &(mode->pan), &(ctk_object->color_palettes[color_idx]), 1); draw_rect(ctk_object, &(mode->pan), &(ctk_object->fg_color), 0); /* Draw ViewPortIn */ get_viewportin_rect(mode, &rect); color_idx = base_color_idx + ((mode->modeline) ? BG_SCR_ON : BG_SCR_OFF); draw_rect(ctk_object, &rect, &(ctk_object->color_palettes[color_idx]), 1); draw_rect(ctk_object, &rect, &(ctk_object->fg_color), 0); /* Draw text information */ if (!mode->display->screen) { tmp_str = g_strdup("(Disabled)"); } else if (mode->modeline) { tmp_str = g_strdup_printf("%dx%d", mode->viewPortIn.width, mode->viewPortIn.height); } else { tmp_str = g_strdup("(Off)"); } draw_rect_strs(ctk_object, &rect, &(ctk_object->fg_color), display->logName, tmp_str); g_free(tmp_str); } /* draw_display() */ /** draw_screen() **************************************************** * * Draws a screen to scale within the layout. * **/ static void draw_screen(CtkDisplayLayout *ctk_object, nvScreenPtr screen) { GtkWidget *drawing_area = ctk_object->drawing_area; GdkGC *fg_gc = get_widget_fg_gc(drawing_area); GdkRectangle *sdim; /* Screen dimensions */ GdkColor bg_color; /* Background color */ GdkColor bd_color; /* Border color */ char *tmp_str; if (!screen) return; /* Draw the screen effective size */ gdk_color_parse("#888888", &bg_color); gdk_color_parse("#777777", &bd_color); sdim = get_screen_rect(screen, 1); /* Draw the screen background */ draw_rect(ctk_object, sdim, &bg_color, 1); /* Draw the screen border with dashed lines */ gdk_gc_set_line_attributes(fg_gc, 1, GDK_LINE_ON_OFF_DASH, GDK_CAP_NOT_LAST, GDK_JOIN_ROUND); draw_rect(ctk_object, sdim, &(ctk_object->fg_color), 0); gdk_gc_set_line_attributes(fg_gc, 1, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_ROUND); /* Show the name of the screen if no-scanout is selected */ if (screen->no_scanout) { tmp_str = g_strdup_printf("X Screen %d", screen->scrnum); draw_rect_strs(ctk_object, &(screen->dim), &(ctk_object->fg_color), tmp_str, "(No Scanout)"); g_free(tmp_str); } } /* draw_screen() */ /** draw_layout() **************************************************** * * Draws a layout. * **/ static void draw_layout(CtkDisplayLayout *ctk_object) { GtkWidget *drawing_area = ctk_object->drawing_area; GdkGC *fg_gc = get_widget_fg_gc(drawing_area); GdkColor bg_color; /* Background color */ GdkColor bd_color; /* Border color */ int i; gdk_color_parse("#888888", &bg_color); gdk_color_parse("#777777", &bd_color); /* Draw the Z-order back to front */ for (i = ctk_object->Zcount - 1; i >= 0; i--) { if (ctk_object->Zorder[i].type == ZNODE_TYPE_DISPLAY) { draw_display(ctk_object, ctk_object->Zorder[i].u.display); } else if (ctk_object->Zorder[i].type == ZNODE_TYPE_SCREEN) { draw_screen(ctk_object, ctk_object->Zorder[i].u.screen); } } /* Hilite the selected item */ if (ctk_object->selected_display || ctk_object->selected_screen) { int w, h; int size; /* Hilite line size */ int offset; /* Hilite box offset */ GdkRectangle vpiRect; GdkRectangle *rect; if (ctk_object->selected_display) { get_viewportin_rect(ctk_object->selected_display->cur_mode, &vpiRect); rect = &vpiRect; } else { rect = get_screen_rect(ctk_object->selected_screen, 0); } /* Draw red selection border */ w = (int)(ctk_object->scale * rect->width); h = (int)(ctk_object->scale * rect->height); /* Setup color to use */ gdk_gc_set_rgb_fg_color(fg_gc, &(ctk_object->select_color)); /* If dislay is too small, just color the whole thing */ size = 3; offset = (size/2) +1; if ((w -(2* offset) < 0) || (h -(2 *offset) < 0)) { draw_rect(ctk_object, rect, &(ctk_object->select_color), 1); draw_rect(ctk_object, rect, &(ctk_object->fg_color), 0); } else { gdk_gc_set_line_attributes(fg_gc, size, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_draw_rectangle(ctk_object->pixmap, fg_gc, 0, ctk_object->img_dim.x +(ctk_object->scale * rect->x) +offset, ctk_object->img_dim.y +(ctk_object->scale * rect->y) +offset, w -(2 * offset), h -(2 * offset)); gdk_gc_set_line_attributes(fg_gc, 1, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); } /* Uncomment to show bounding box of selected screen's metamodes */ /* if (ctk_object->selected_screen) { // Shows the screen dimensions used to write to the X config file gdk_color_parse("#00FF00", &bg_color); draw_rect(ctk_object, ctk_object->selected_screen->dim, &(bg_color), 0); if (ctk_object->selected_screen->cur_metamode) { // Shows the effective screen dimensions used in conjunction // with display devices that are "off" gdk_color_parse("#0000FF", &bg_color); draw_rect(ctk_object, &(ctk_object->selected_screen->cur_metamode->viewPortIn), &(bg_color), 0); // Shows the current screen dimensions used for relative // positioning of the screen (w/o displays that are "off") gdk_color_parse("#FF00FF", &bg_color); draw_rect(ctk_object, &(ctk_object->selected_screen->cur_metamode->edim), &(bg_color), 0); } } //*/ /* Uncomment to show unsnapped dimensions */ /* { gdk_color_parse("#DD4444", &bg_color); if (ctk_object->modify_info.modify_dirty) { gdk_gc_set_line_attributes(fg_gc, 1, GDK_LINE_ON_OFF_DASH, GDK_CAP_NOT_LAST, GDK_JOIN_ROUND); } draw_rect(ctk_object, ctk_object->modify_info.modify_dim, &bg_color, 0); if (ctk_object->modify_info.modify_dirty) { gdk_gc_set_line_attributes(fg_gc, 1, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_ROUND); } } //*/ } } /* draw_layout() */ /** clear_layout() *************************************************** * * Clears the layout. * **/ static void clear_layout(CtkDisplayLayout *ctk_object) { GtkWidget *drawing_area = ctk_object->drawing_area; GtkAllocation *allocation = &(drawing_area->allocation); GdkGC *fg_gc = get_widget_fg_gc(drawing_area); GdkColor color; /* Clear to background color */ gdk_gc_set_rgb_fg_color(fg_gc, &(ctk_object->bg_color)); gdk_draw_rectangle(ctk_object->pixmap, fg_gc, TRUE, 2, 2, allocation->width -4, allocation->height -4); /* Add white trim */ gdk_color_parse("white", &color); gdk_gc_set_rgb_fg_color(fg_gc, &color); gdk_draw_rectangle(ctk_object->pixmap, fg_gc, FALSE, 1, 1, allocation->width -3, allocation->height -3); /* Add layout border */ gdk_gc_set_rgb_fg_color(fg_gc, &(ctk_object->fg_color)); gdk_draw_rectangle(ctk_object->pixmap, fg_gc, FALSE, 0, 0, allocation->width -1, allocation->height -1); } /* clear_layout() */ /** sync_layout() **************************************************** * * Recalculates the X screen positions in the layout such that the * top-left most X screen is at 0x0. * **/ static Bool sync_layout(CtkDisplayLayout *ctk_object) { nvLayoutPtr layout = ctk_object->layout; nvScreenPtr screen; Bool modified = FALSE; /* Align all metamodes of each screen */ for (screen = layout->screens; screen; screen = screen->next_in_layout) { if (realign_screen(screen)) { modified = TRUE; } } /* Resolve final screen positions */ calc_layout(layout); /* Offset layout back to (0,0) */ if (layout->dim.x || layout->dim.y) { offset_layout(layout, -layout->dim.x, -layout->dim.y); modified = TRUE; } if (sync_scaling(ctk_object)) { modified = TRUE; } return modified; } /** ctk_display_layout_update() ************************************** * * Causes a recalculation of the layout. * **/ void ctk_display_layout_update(CtkDisplayLayout *ctk_object) { /* Recalculate layout dimensions and scaling */ sync_layout(ctk_object); ctk_object->modify_info.modify_dirty = 1; queue_layout_redraw(ctk_object); } /* ctk_display_layout_update() */ /** ctk_display_layout_set_layout() ********************************** * * Configures the display layout widget to show the given layout. * **/ void ctk_display_layout_set_layout(CtkDisplayLayout *ctk_object, nvLayoutPtr layout) { /* Setup for the new layout */ ctk_object->layout = layout; sync_layout(ctk_object); zorder_layout(ctk_object); select_default_item(ctk_object); /* Update */ ctk_display_layout_update(ctk_object); } /* ctk_display_layout_set_layout() */ /** ctk_display_layout_update_zorder() ******************************* * * Updates the layout by re-building the Z-order list. * **/ void ctk_display_layout_update_zorder(CtkDisplayLayout *ctk_object) { zorder_layout(ctk_object); queue_layout_redraw(ctk_object); } /* ctk_display_layout_update_zorder() */ /** ctk_display_layout_get_selected_display() ************************ * * Returns the selected display. * **/ nvDisplayPtr ctk_display_layout_get_selected_display(CtkDisplayLayout *ctk_object) { return ctk_object->selected_display; } /* ctk_display_layout_get_selected_display() */ /** ctk_display_layout_get_selected_screen() ************************* * * Returns the selected screen. * **/ nvScreenPtr ctk_display_layout_get_selected_screen(CtkDisplayLayout *ctk_object) { return ctk_object->selected_screen; } /* ctk_display_layout_get_selected_screen() */ /** ctk_display_layout_set_screen_metamode() ************************* * * Sets which metamode the screen should use. * **/ void ctk_display_layout_set_screen_metamode(CtkDisplayLayout *ctk_object, nvScreenPtr screen, int new_metamode_idx) { if (!screen) return; /* Make sure the metamode exists */ if (new_metamode_idx < 0) { new_metamode_idx = 0; } else if (new_metamode_idx >= screen->num_metamodes) { new_metamode_idx = screen->num_metamodes -1; } /* Select the new metamode and recalculate layout dimensions and scaling */ set_screen_metamode(ctk_object->layout, screen, new_metamode_idx); /* Update the layout */ ctk_display_layout_update(ctk_object); } /* ctk_display_layout_set_screen_metamode() */ /** ctk_display_layout_add_screen_metamode() ************************* * * Adds a new metamode to the screen. * **/ void ctk_display_layout_add_screen_metamode(CtkDisplayLayout *ctk_object, nvScreenPtr screen) { nvDisplayPtr display; nvMetaModePtr metamode; if (!screen) return; /* Add a metamode to the screen */ metamode = (nvMetaModePtr)calloc(1, sizeof(nvMetaMode)); if (!metamode) return; /* Duplicate the currently selected metamode */ metamode->id = -1; metamode->source = METAMODE_SOURCE_NVCONTROL; /* Add the metamode after the currently selected metamode */ metamode->next = screen->cur_metamode->next; screen->cur_metamode->next = metamode; screen->num_metamodes++; /* Add a mode to each display */ for (display = screen->displays; display; display = display->next_in_screen) { nvModePtr mode; /* Create the mode */ mode = (nvModePtr)calloc(1, sizeof(nvMode)); if (!mode) goto fail; /* Duplicate the currently selected mode */ if (display->cur_mode) { memcpy(mode, display->cur_mode, sizeof(*mode)); } /* Link the mode to the metamode */ mode->metamode = metamode; /* Add the mode after the currently selected mode */ mode->next = display->cur_mode->next; display->cur_mode->next = mode; display->num_modes++; } /* Select the newly created metamode */ ctk_display_layout_set_screen_metamode(ctk_object, screen, (screen->cur_metamode_idx+1)); return; fail: /* XXX Need to bail better: * - Remove metamode from screen * - Remove any excess metamodes from the displays */ queue_layout_redraw(ctk_object); return; } /* ctk_display_layout_add_screen_metamode() */ /** ctk_display_layout_delete_screen_metamode() ********************** * * Deletes a metamode from the screen (also deletes corresponding * modes from the screen's displays.) * **/ void ctk_display_layout_delete_screen_metamode(CtkDisplayLayout *ctk_object, nvScreenPtr screen, int metamode_idx, Bool reselect) { nvDisplayPtr display; nvMetaModePtr metamode; nvMetaModePtr metamode_prev; nvModePtr mode ; nvModePtr mode_prev; int i; if (!screen || metamode_idx >= screen->num_metamodes) { return; } /* Don't delete the last metamode */ if (screen->num_metamodes <= 1) { return; } /* Find the metamode */ metamode_prev = NULL; metamode = screen->metamodes; i = 0; while (metamode && i < metamode_idx) { metamode_prev = metamode; metamode = metamode->next; i++; } /* Remove the metamode from the list */ if (!metamode_prev) { screen->metamodes = screen->metamodes->next; } else { metamode_prev->next = metamode->next; } screen->num_metamodes--; if (screen->cur_metamode == metamode) { screen->cur_metamode = metamode->next; } if (screen->cur_metamode_idx >= screen->num_metamodes) { screen->cur_metamode_idx = screen->num_metamodes -1; } cleanup_metamode(metamode); free(metamode); /* Delete the mode from each display in the screen */ for (display = screen->displays; display; display = display->next_in_screen) { /* Find the mode */ mode_prev = NULL; mode = display->modes; for (i = 0; i != metamode_idx; i++) { mode_prev = mode; mode = mode->next; } /* Remove the mode from the list */ if (!mode_prev) { display->modes = display->modes->next; } else { mode_prev->next = mode->next; } display->num_modes--; if (display->cur_mode == mode) { display->cur_mode = mode->next; } /* Delete the mode */ free(mode); } /* Update which metamode should be selected */ if (reselect) { ctk_display_layout_set_screen_metamode (ctk_object, screen, screen->cur_metamode_idx); } queue_layout_redraw(ctk_object); } /* ctk_display_layout_delete_screen_metamode() */ /** ctk_display_layout_disable_display() ***************************** * * Disables a display (removes it from its X screen. * **/ void ctk_display_layout_disable_display(CtkDisplayLayout *ctk_object, nvDisplayPtr display) { nvScreenPtr screen = display->screen; /* Remove display from the X screen */ screen_remove_display(display); /* If the screen is empty, remove it */ if (!screen->num_displays) { layout_remove_and_free_screen(screen); /* Unselect the screen if it was selected */ if (screen == ctk_object->selected_screen) { ctk_object->selected_screen = NULL; } /* Make sure screen numbers are consistent */ renumber_xscreens(ctk_object->layout); } /* Add the fake mode to the display */ gpu_add_screenless_modes_to_displays(display->gpu); /* Re-select the display to sync the loss of the screen */ if (display == ctk_object->selected_display) { select_display(ctk_object, display); } queue_layout_redraw(ctk_object); } /* ctk_display_layout_disable_display() */ /** ctk_display_layout_set_mode_modeline() *************************** * * Sets which modeline, ViewPortIn and ViewPortOut the mode should use. * **/ void ctk_display_layout_set_mode_modeline(CtkDisplayLayout *ctk_object, nvModePtr mode, nvModeLinePtr modeline, const nvSize *viewPortIn, const GdkRectangle *viewPortOut) { nvModeLinePtr old_modeline; if (!mode) { return; } /* Set the new modeline */ old_modeline = mode->modeline; mode_set_modeline(mode, modeline, viewPortIn, viewPortOut); /* In advanced mode, changing the resolution a display uses for a * particular metamode should make this metamode non-implicit. */ if (ctk_object->advanced_mode && (old_modeline != modeline) && mode->metamode) { mode->metamode->source = METAMODE_SOURCE_NVCONTROL; } /* Update the layout */ ctk_display_layout_update(ctk_object); } /* ctk_display_layout_set_display_modeline() */ /*! * Sets the ViewPortIn for the given mode. * * If a modification occurs, this function will call the modified_callback * handler registered, if any. * * \param[in] ctk_object The Display Layout object * \param[in] mode The mode to be modified * \param[in] w The width of the ViewPortIn to set * \param[in] h The height of the ViewPortIn to set */ void ctk_display_layout_set_mode_viewport_in(CtkDisplayLayout *ctk_object, nvModePtr mode, int w, int h, Bool update_panning_size) { Bool modified = TRUE; if (!mode || !mode->modeline) { return; } if (w < 1) { w = 1; } if (h < 1) { h = 1; } mode->viewPortIn.width = w; mode->viewPortIn.height = h; if (update_panning_size) { mode->pan.width = w; mode->pan.height = h; } clamp_mode_panning(mode); if (modified) { /* Update the layout */ ctk_display_layout_update(ctk_object); /* Notify the modification */ if (ctk_object->modified_callback) { ctk_object->modified_callback(ctk_object->layout, ctk_object->modified_callback_data); } } } /*! * Sets the ViewPortOut for the given mode. * * If a modification occurs, this function will call the modified_callback * handler registered, if any. * * \param[in] ctk_object The Display Layout object * \param[in] mode The mode to be modified * \param[in] x The X offset of the ViewPortOut to set * \param[in] y The Y offset of the ViewPortOut to set * \param[in] w The width of the ViewPortOut to set * \param[in] h The height of the ViewPortOut to set */ void ctk_display_layout_set_mode_viewport_out(CtkDisplayLayout *ctk_object, nvModePtr mode, int x, int y, int w, int h) { Bool modified = TRUE; int extra; if (!mode || !mode->modeline) { return; } /* Clamp ViewPortOut to raster size. If the ViewPortOut extends past the * raster size, reduce the ViewPortOut offset before reducing the * dimensions */ extra = (x + w) - mode->modeline->data.hdisplay; if (extra > 0) { if (extra > x) { w = mode->modeline->data.hdisplay; x = 0; } else { x -= extra; } } extra = (y + h) - mode->modeline->data.vdisplay; if (extra > 0) { if (extra > y) { h = mode->modeline->data.vdisplay; y = 0; } else { y -= extra; } } if (w < 1) { w = 1; } if (h < 1) { h = 1; } if (x < 0) { x = 0; } if (y < 0) { y = 0; } mode->viewPortOut.x = x; mode->viewPortOut.y = y; mode->viewPortOut.width = w; mode->viewPortOut.height = h; if (modified) { /* Update the layout */ ctk_display_layout_update(ctk_object); /* Notify the modification */ if (ctk_object->modified_callback) { ctk_object->modified_callback(ctk_object->layout, ctk_object->modified_callback_data); } } } /** ctk_display_layout_set_display_position() ************************ * * Sets the absolute/relative position of the display. * **/ void ctk_display_layout_set_display_position(CtkDisplayLayout *ctk_object, nvDisplayPtr display, int position_type, nvDisplayPtr relative_to, int x, int y) { int modified = 0; int resolve_all_modes = !ctk_object->advanced_mode; if (!display) return; if (position_type != CONF_ADJ_ABSOLUTE && !relative_to) return; /* XXX When configuring a relative position, make sure * all displays that are relative to us become absolute. * This is to avoid relationship loops. Eventually, we'll want * to be able to handle weird loops since X does this. */ if (position_type != CONF_ADJ_ABSOLUTE) { nvDisplayPtr other; nvModePtr mode; for (other = display->screen->displays; other; other = other->next_in_screen) { if (!resolve_all_modes) { mode = other->cur_mode; if (mode && mode->relative_to == display) { mode->position_type = CONF_ADJ_ABSOLUTE; mode->relative_to = NULL; } } else { for (mode = other->modes; mode; mode = mode->next) { if (mode->relative_to == display) { mode->position_type = CONF_ADJ_ABSOLUTE; mode->relative_to = NULL; } } } } } /* Set the new positioning type */ if (!resolve_all_modes) { display->cur_mode->position_type = position_type; display->cur_mode->relative_to = relative_to; } else { nvModePtr mode; for (mode = display->modes; mode; mode = mode->next) { mode->position_type = position_type; mode->relative_to = relative_to; } } switch (position_type) { case CONF_ADJ_ABSOLUTE: /* Do the move by offsetting */ ctk_object->modify_info.modify_dirty = 1; modified = move_selected(ctk_object, x - display->cur_mode->pan.x, y - display->cur_mode->pan.y, 0); /* Report back result of move */ if (ctk_object->modified_callback && (modified || x != display->cur_mode->pan.x || y != display->cur_mode->pan.y)) { ctk_object->modified_callback (ctk_object->layout, ctk_object->modified_callback_data); } break; default: /* Make sure the screen position does not change */ reposition_screen(display->screen, resolve_all_modes); /* Recalculate the layout */ ctk_display_layout_update(ctk_object); break; } queue_layout_redraw(ctk_object); } /* ctk_display_layout_set_display_position() */ /** ctk_display_layout_set_display_panning() ************************* * * Sets the panning domain of the display. * **/ void ctk_display_layout_set_display_panning(CtkDisplayLayout *ctk_object, nvDisplayPtr display, int width, int height) { int modified = 0; if (!display) return; /* Change the panning */ ctk_object->modify_info.modify_dirty = 1; modified = pan_selected(ctk_object, width - display->cur_mode->pan.width, height - display->cur_mode->pan.height, 0); /* Report back result of move */ if (ctk_object->modified_callback && (modified || width != display->cur_mode->pan.width || height != display->cur_mode->pan.height)) { ctk_object->modified_callback(ctk_object->layout, ctk_object->modified_callback_data); } queue_layout_redraw(ctk_object); } /* ctk_display_layout_set_display_panning() */ /*! * Sets the rotation orientation for the display. * * In basic mode, this function will make all modes on the display have the * same rotation. In advanced mode, only the current mode will have its * rotation orientation modified. * * If a modification occurs, this function will call the modified_callback * handler registered, if any. * * \param[in] ctk_object The Display Layout object * \param[in] display The display who's modes are to be modified * \param[in] rotation The rotation to set */ void ctk_display_layout_set_display_rotation(CtkDisplayLayout *ctk_object, nvDisplayPtr display, Rotation rotation) { Bool modified; if (!display->cur_mode || !display->cur_mode->modeline) { return; } if (ctk_object->advanced_mode) { /* In advanced mode, only set the rotation of the current mode */ modified = mode_set_rotation(display->cur_mode, rotation); } else { /* In basic mode, make all the modes have the same rotation */ modified = display_set_modes_rotation(display, rotation); } if (modified) { /* Update the layout */ ctk_display_layout_update(ctk_object); /* Notify the modification */ if (ctk_object->modified_callback) { ctk_object->modified_callback(ctk_object->layout, ctk_object->modified_callback_data); } } } /*! * Sets the reflection orientation for the display. * * In basic mode, this function will make all modes on the display have the * same reflection. In advanced mode, only the current mode will have its * reflection orientation modified. * * If a modification occurs, this function will call the modified_callback * handler registered, if any. * * \param[in] ctk_object The Display Layout object * \param[in] display The display who's modes are to be modified * \param[in] reflection The reflection to set */ void ctk_display_layout_set_display_reflection(CtkDisplayLayout *ctk_object, nvDisplayPtr display, Reflection reflection) { Bool modified = FALSE; if (!display->cur_mode || !display->cur_mode->modeline) { return; } if (ctk_object->advanced_mode) { /* In advanced mode, only set the reflection of the current mode */ if (display->cur_mode->reflection != reflection) { modified = TRUE; } display->cur_mode->reflection = reflection; } else { nvModePtr mode; /* In basic mode, make all the modes have the same reflection */ for (mode = display->modes; mode; mode = mode->next) { if (mode->reflection != reflection) { mode->reflection = reflection; modified = TRUE; } } } if (modified) { /* Update the layout */ ctk_display_layout_update(ctk_object); /* Notify the modification */ if (ctk_object->modified_callback) { ctk_object->modified_callback(ctk_object->layout, ctk_object->modified_callback_data); } } } /** ctk_display_layout_select_display() *********************** * * Updates the currently selected display. * **/ void ctk_display_layout_select_display(CtkDisplayLayout *ctk_object, nvDisplayPtr display) { /* Select the new display */ select_display(ctk_object, display); queue_layout_redraw(ctk_object); } /* ctk_display_layout_select_display() */ /** ctk_display_layout_select_screen() ************************ * * Makes the given screen the thing that is selected. * **/ void ctk_display_layout_select_screen(CtkDisplayLayout *ctk_object, nvScreenPtr screen) { /* Select the new display */ ctk_object->selected_display = NULL; select_screen(ctk_object, screen); queue_layout_redraw(ctk_object); } /* ctk_display_layout_select_screen() */ /** ctk_display_layout_set_screen_virtual_size() ********************* * * Sets the virtual size of the screen * **/ void ctk_display_layout_set_screen_virtual_size(CtkDisplayLayout *ctk_object, nvScreenPtr screen, int width, int height) { int modified; if (!screen || !screen->no_scanout) return; /* Do the panning by offsetting */ // XXX May want to pan non-selected screen, // though right now this just works out // since what we want to pan is always // what is selected. ctk_object->modify_info.modify_dirty = 1; modified = pan_selected(ctk_object, width - screen->dim.width, height - screen->dim.height, 0); if (ctk_object->modified_callback && (modified || width != screen->dim.width || height != screen->dim.height)) { ctk_object->modified_callback(ctk_object->layout, ctk_object->modified_callback_data); } queue_layout_redraw(ctk_object); } /* ctk_display_layout_set_screen_virtual_size() */ /** ctk_display_layout_set_screen_depth() **************************** * * Sets which modeline the screen should use. * **/ void ctk_display_layout_set_screen_depth(CtkDisplayLayout *ctk_object, nvScreenPtr screen, int depth) { /* Setup screen's default depth */ if (screen) { screen->depth = depth; } } /* ctk_display_layout_set_screen_depth() */ /** ctk_display_layout_set_screen_position() ************************* * * Sets the absolute/relative position of the screen. * **/ void ctk_display_layout_set_screen_position(CtkDisplayLayout *ctk_object, nvScreenPtr screen, int position_type, nvScreenPtr relative_to, int x, int y) { int modified = 0; nvLayoutPtr layout = ctk_object->layout; if (!screen) return; if (position_type != CONF_ADJ_ABSOLUTE && !relative_to) return; /* XXX When configuring a relative position, make sure * all screens that are relative to us become absolute. * This is to avoid relationship loops. Eventually, we'll want * to be able to handle weird loops since X does this. */ if (position_type != CONF_ADJ_ABSOLUTE) { nvScreenPtr other; for (other = layout->screens; other; other = other->next_in_layout) { if (other->relative_to == screen) { switch_screen_to_absolute(other); } } } /* Set the new positioning type */ switch (position_type) { case CONF_ADJ_ABSOLUTE: { int x_offset = x - screen->dim.x; int y_offset = y - screen->dim.y; GdkRectangle *sdim; /* Make sure this screen use absolute positioning */ switch_screen_to_absolute(screen); /* Do the move by offsetting */ offset_screen(screen, x_offset, y_offset); /* Recalculate the layout */ ctk_display_layout_update(ctk_object); /* Report back result of move */ sdim = get_screen_rect(screen, 1); if (x != sdim->x || y != sdim->y) { modified = 1; } if (ctk_object->modified_callback && modified) { ctk_object->modified_callback (ctk_object->layout, ctk_object->modified_callback_data); } } break; case CONF_ADJ_RELATIVE: screen->x_offset = x; screen->y_offset = y; /* Fall Through */ default: /* Set the desired positioning */ screen->relative_to = relative_to; screen->position_type = position_type; /* Other relative positioning */ /* XXX Need to validate cases where displays are * positioned relative to each other in a * circular setup * * eg. CRT-0 left of CRT-1 * CRT-1 clones CRT-0 <- Shouldn't allow this * * also: * * CRT-0 left of CRT-1 * CRT-1 left of CRT-2 * CRT-2 clones CRT-0 ... Eep! */ /* Recalculate the layout */ ctk_display_layout_update(ctk_object); break; } queue_layout_redraw(ctk_object); } /* ctk_display_layout_set_screen_position() */ /** ctk_display_layout_set_advanced_mode() *************************** * * Enables/Disables the user's ability to modify advanced layout * bells and whistles. * * In advanced mode the user has access to: * * - Per-display panning. * - Modeline timing modifications. (Add/Delete) * - Multiple metamodes. (Add/Delete) * * * In basic mode: * * - User can only modify the current metamode. * * **/ void ctk_display_layout_set_advanced_mode(CtkDisplayLayout *ctk_object, int advanced_mode) { ctk_object->advanced_mode = advanced_mode; } /* ctk_display_layout_set_allow_panning() */ /** ctk_display_layout_register_callbacks() ************************** * * Sets up callbacks so users of the display layout can receive * notifications. * **/ void ctk_display_layout_register_callbacks(CtkDisplayLayout *ctk_object, ctk_display_layout_selected_callback selected_callback, void *selected_callback_data, ctk_display_layout_modified_callback modified_callback, void *modified_callback_data) { ctk_object->selected_callback = selected_callback; ctk_object->selected_callback_data = selected_callback_data; ctk_object->modified_callback = modified_callback; ctk_object->modified_callback_data = modified_callback_data; } /* ctk_display_layout_register_callbacks() */ /** expose_event_callback() ****************************************** * * Handles expose events. * **/ static gboolean expose_event_callback(GtkWidget *widget, GdkEventExpose *event, gpointer data) { CtkDisplayLayout *ctk_object = CTK_DISPLAY_LAYOUT(data); GdkGC *fg_gc = get_widget_fg_gc(widget); GdkGCValues old_gc_values; if (event->count || !widget->window || !fg_gc) { return TRUE; } /* Redraw the layout */ gdk_window_begin_paint_rect(widget->window, &event->area); gdk_gc_get_values(fg_gc, &old_gc_values); clear_layout(ctk_object); draw_layout(ctk_object); gdk_gc_set_values(fg_gc, &old_gc_values, GDK_GC_FOREGROUND); gdk_draw_pixmap(widget->window, fg_gc, ctk_object->pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); gdk_window_end_paint(widget->window); return TRUE; } /* expose_event_callback() */ /** configure_event_callback() *************************************** * * Handles configure events. * **/ static gboolean configure_event_callback(GtkWidget *widget, GdkEventConfigure *event, gpointer data) { CtkDisplayLayout *ctk_object = CTK_DISPLAY_LAYOUT(data); int width = widget->allocation.width; int height = widget->allocation.height; ctk_object->img_dim.x = LAYOUT_IMG_OFFSET + LAYOUT_IMG_BORDER_PADDING; ctk_object->img_dim.y = LAYOUT_IMG_OFFSET + LAYOUT_IMG_BORDER_PADDING; ctk_object->img_dim.width = width -2*(ctk_object->img_dim.x); ctk_object->img_dim.height = height -2*(ctk_object->img_dim.y); sync_scaling(ctk_object); ctk_object->pixmap = gdk_pixmap_new(widget->window, width, height, -1); return TRUE; } /* configure_event_callback() */ /** motion_event_callback() ****************************************** * * Handles mouse motion events. * **/ static gboolean motion_event_callback(GtkWidget *widget, GdkEventMotion *event, gpointer data) { CtkDisplayLayout *ctk_object = CTK_DISPLAY_LAYOUT(data); static int init = 1; int modify_panning; int x; int y; GdkModifierType state; /* Handle hints so we don't get overwhelmed with motion events */ if (event->is_hint) { gdk_window_get_pointer(event->window, &x, &y, &state); } else { x = event->x; y = event->y; state = event->state; } /* Swap between panning and moving */ if (ctk_object->advanced_mode && (state & GDK_SHIFT_MASK)) { modify_panning = 1; } else { modify_panning = 0; } if ((ctk_object->modify_info.modify_panning != modify_panning) || init) { init = 0; ctk_object->modify_info.modify_dirty = 1; } /* Nothing to do if mouse didn't move */ if (ctk_object->last_mouse_x == x && ctk_object->last_mouse_y == y) { return TRUE; } ctk_object->mouse_x = x; ctk_object->mouse_y = y; /* Modify screen layout */ if (ctk_object->button1 && !ctk_object->clicked_outside) { int modified = 0; int delta_x = (x - ctk_object->last_mouse_x) / ctk_object->scale; int delta_y = (y - ctk_object->last_mouse_y) / ctk_object->scale; if (!modify_panning) { modified = move_selected(ctk_object, delta_x, delta_y, 1); } else { modified = pan_selected(ctk_object, delta_x, delta_y, 1); } if (modified) { GtkWidget *drawing_area = ctk_object->drawing_area; if (ctk_object->modified_callback) { ctk_object->modified_callback(ctk_object->layout, ctk_object->modified_callback_data); } /* Queue and process expose event so we redraw ASAP */ queue_layout_redraw(ctk_object); gdk_window_process_updates(drawing_area->window, TRUE); } /* Update the tooltip under the mouse */ } else { char *tip = get_tooltip_under_mouse(ctk_object, x, y); if (tip) { gtk_tooltips_set_tip(ctk_object->tooltip_group, ctk_object->tooltip_area, tip, NULL); gtk_tooltips_force_window(ctk_object->tooltip_group); g_free(tip); } } ctk_object->last_mouse_x = x; ctk_object->last_mouse_y = y; return TRUE; } /* motion_event_callback() */ /** button_press_event_callback() ************************************ * * Handles mouse button press events. * **/ static gboolean button_press_event_callback(GtkWidget *widget, GdkEventButton *event, gpointer data) { CtkDisplayLayout *ctk_object = CTK_DISPLAY_LAYOUT(data); /* Scale and offset x & y so they reside in the clickable area */ int x = (event->x -ctk_object->img_dim.x) / ctk_object->scale; int y = (event->y -ctk_object->img_dim.y) / ctk_object->scale; GdkEvent *next_event; ctk_object->last_mouse_x = event->x; ctk_object->last_mouse_y = event->y; /* Check to see if a double click event is pending * and ignore this click if that is the case. */ next_event = gdk_event_peek(); if (next_event) { if (next_event->type == GDK_2BUTTON_PRESS) { /* Double click event detected, ignore the * preceding GDK_BUTTON_PRESS */ return TRUE; } } /* Handle double clicks */ if (event->type == GDK_2BUTTON_PRESS) { /* XXX Flash the display or screen */ return TRUE; } /* XXX Ignore triple clicks */ if (event->type != GDK_BUTTON_PRESS) return TRUE; switch (event->button) { /* Handle selection of displays/X screens */ case Button1: ctk_object->button1 = 1; click_layout(ctk_object, x, y); /* Report back selection event */ if (ctk_object->selected_callback) { ctk_object->selected_callback(ctk_object->layout, ctk_object->selected_callback_data); } queue_layout_redraw(ctk_object); break; default: break; } return TRUE; } /* button_press_event_callback() */ /** button_release_event_callback() ********************************** * * Handles mouse button release events. * **/ static gboolean button_release_event_callback(GtkWidget *widget, GdkEventButton *event, gpointer data) { CtkDisplayLayout *ctk_object = CTK_DISPLAY_LAYOUT(data); switch (event->button) { case Button1: ctk_object->button1 = 0; break; case Button2: ctk_object->button2 = 0; break; case Button3: ctk_object->button3 = 0; break; default: break; } return TRUE; } /* button_release_event_callback() */ nvidia-settings/src/gtk+-2.x/ctkgvo-banner.h0000664000175000017500000000632412236467170021014 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_GVO_BANNER_H__ #define __CTK_GVO_BANNER_H__ #include "NvCtrlAttributes.h" #include "ctkconfig.h" #include "ctkevent.h" G_BEGIN_DECLS #define CTK_TYPE_GVO_BANNER (ctk_gvo_banner_get_type()) #define CTK_GVO_BANNER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_GVO_BANNER, CtkGvoBanner)) #define CTK_GVO_BANNER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_GVO_BANNER, CtkGvoBannerClass)) #define CTK_IS_GVO_BANNER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_GVO_BANNER)) #define CTK_IS_GVO_BANNER_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_GVO_BANNER)) #define CTK_GVO_BANNER_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_GVO_BANNER, CtkGvoBannerClass)) typedef gint (* ctk_gvo_banner_probe_callback) (gpointer data); typedef struct _CtkGvoBanner CtkGvoBanner; typedef struct _CtkGvoBannerClass CtkGvoBannerClass; #define GVO_BANNER_VID1 0 #define GVO_BANNER_VID2 1 #define GVO_BANNER_SDI 2 #define GVO_BANNER_COMP 3 struct _CtkGvoBanner { GtkVBox parent; NvCtrlAttributeHandle *handle; GtkWidget *parent_box; CtkConfig *ctk_config; CtkEvent *ctk_event; gint sync_mode; gint sync_source; gboolean shared_sync_bnc; // GVO device has single sync BNC GtkWidget *image; // Image GtkWidget *ctk_banner; // CtkBanner widget using the image gboolean flash; // Used to flash the LEDs at the same time guint8 img[4]; // Current color of LEDs guint state[4]; // Current state of LEDs ctk_gvo_banner_probe_callback probe_callback; // Function to call gpointer probe_callback_data; // Other GVO state probed gint gvo_lock_owner; gint output_video_format; gint output_data_format; gint input_video_format; gint composite_sync_input_detected; gint sdi_sync_input_detected; gint sync_lock_status; }; struct _CtkGvoBannerClass { GtkVBoxClass parent_class; }; GType ctk_gvo_banner_get_type (void) G_GNUC_CONST; GtkWidget* ctk_gvo_banner_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *); gint ctk_gvo_banner_probe(gpointer data); void ctk_gvo_banner_set_parent(CtkGvoBanner *ctk_gvo_banner, GtkWidget *new_parent_box, ctk_gvo_banner_probe_callback probe_callback, gpointer probe_callback_data); G_END_DECLS #endif /* __CTK_GVO_BANNER_H__*/ nvidia-settings/src/gtk+-2.x/ctkappprofile.h0000664000175000017500000001250712236467170021117 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2013 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_APP_PROFILE_H__ #define __CTK_APP_PROFILE_H__ #include "NvCtrlAttributes.h" #include "app-profiles.h" #include "ctkevent.h" #include "ctkconfig.h" #include "ctkapcprofilemodel.h" #include "ctkapcrulemodel.h" #include "ctkdropdownmenu.h" G_BEGIN_DECLS #define CTK_TYPE_APP_PROFILE (ctk_app_profile_get_type()) #define CTK_APP_PROFILE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_APP_PROFILE, CtkAppProfile)) #define CTK_APP_PROFILE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_APP_PROFILE, CtkAppProfileClass)) #define CTK_IS_APP_PROFILE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_APP_PROFILE)) #define CTK_IS_APP_PROFILE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_APP_PROFILE)) #define CTK_APP_PROFILE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_APP_PROFILE, CtkAppProfileClass)) typedef struct _CtkAppProfile CtkAppProfile; typedef struct _CtkAppProfileClass CtkAppProfileClass; typedef struct _EditRuleDialog { GtkWidget *parent; GtkWidget *top_window; gboolean new_rule; gint rule_id; // Canonical dialog box values GString *source_file; gint feature; GString *matches; GString *profile_name; // Widgets GtkWidget *source_file_combo; GtkWidget *feature_menu; GtkEntry *matches_entry; GtkWidget *profile_name_combo; GtkListStore *profile_settings_store; GtkWidget *file_sel; GtkWidget *add_edit_rule_button; // Data for constructing the help text for this dialog GList *help_data; // Signals gulong rule_profile_name_changed_signal; gulong feature_changed_signal; } EditRuleDialog; typedef struct _EditProfileDialog { GtkWidget *parent; // For convenience the profile dialog box can be opened // from the main window *or* the rule dialog box. Track // which is the caller here. GtkWidget *caller; GtkWidget *top_window; gboolean new_profile; // Canonical dialog box values GString *name; GString *orig_name; // The original name, before any editing took place GString *source_file; json_t *settings; // Widgets GtkWidget *name_entry; GtkWidget *generate_name_button; GtkWidget *source_file_combo; GtkWidget *file_sel; GtkWidget *add_edit_profile_button; // Used in the special case where a currently edited row // will be deleted, in which case we don't want to update // the model. gboolean setting_update_canceled; CtkStatusBar error_statusbar; // Data for constructing the help text for this dialog GList *top_help_data; GList *setting_column_help_data; GList *setting_toolbar_help_data; GList *bottom_help_data; GtkTreeView *settings_view; GtkListStore *settings_store; } EditProfileDialog; typedef struct _SaveAppProfileChangesDialog { GtkWidget *parent; GtkWidget *top_window; gboolean show_preview; // Canonical dialog box values json_t *updates; // Widgets GtkWidget *preview_button; GtkWidget *preview_backup_entry; GtkWidget *preview_text_view; GtkWidget *preview_file_menu; GtkWidget *preview_vbox; GtkWidget *backup_check_button; // Data for constructing the help text for this dialog GList *help_data; // Signals gulong preview_changed_signal; } SaveAppProfileChangesDialog; struct _CtkAppProfile { GtkVBox parent; CtkConfig *ctk_config; AppProfileConfig *gold_config, *cur_config; // Interfaces layered on top of the config object for use with GtkTreeView CtkApcProfileModel *apc_profile_model; CtkApcRuleModel *apc_rule_model; // Widgets GtkTreeView *main_profile_view; GtkTreeView *main_rule_view; GtkWidget *notebook; GtkWidget *enable_check_button; // Dialog boxes EditRuleDialog *edit_rule_dialog; EditProfileDialog *edit_profile_dialog; SaveAppProfileChangesDialog *save_app_profile_changes_dialog; // Data for constructing the help text for this page GList *global_settings_help_data; GList *rules_help_data; GList *rules_columns_help_data; GList *profiles_help_data; GList *profiles_columns_help_data; GList *save_reload_help_data; // TODO: provide undo functionality }; struct _CtkAppProfileClass { GtkVBoxClass parent_class; }; GType ctk_app_profile_get_type (void) G_GNUC_CONST; GtkWidget* ctk_app_profile_new (CtkConfig *); GtkTextBuffer* ctk_app_profile_create_help (CtkAppProfile *, GtkTextTagTable *); char *serialize_settings(const json_t *settings, gboolean add_markup); G_END_DECLS #endif /* __CTK_APP_PROFILE_H__ */ nvidia-settings/src/gtk+-2.x/ctkframelock.h0000664000175000017500000001100712236467170020713 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_FRAMELOCK_H__ #define __CTK_FRAMELOCK_H__ #include "NvCtrlAttributes.h" #include "ctkconfig.h" #include "parse.h" G_BEGIN_DECLS #define CTK_TYPE_FRAMELOCK (ctk_framelock_get_type()) #define CTK_FRAMELOCK(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), \ CTK_TYPE_FRAMELOCK, CtkFramelock)) #define CTK_FRAMELOCK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass), \ CTK_TYPE_FRAMELOCK, CtkFramelockClass)) #define CTK_IS_FRAMELOCK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj), CTK_TYPE_FRAMELOCK)) #define CTK_IS_FRAMELOCK_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE((klass), CTK_TYPE_FRAMELOCK)) #define CTK_FRAMELOCK_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS((obj), \ CTK_TYPE_FRAMELOCK, CtkFramelockClass)) typedef struct _CtkFramelock CtkFramelock; typedef struct _CtkFramelockClass CtkFramelockClass; struct _CtkFramelock { GtkVBox parent; NvCtrlAttributeHandle *attribute_handle; CtkConfig *ctk_config; GtkWindow *parent_window; GdkCursor *wait_cursor; /* Device tree & buttons */ gpointer tree; GtkWidget *add_devices_button; GtkWidget *remove_devices_button; GtkWidget *short_labels_button; GtkWidget *extra_info_button; GtkWidget *expand_all_button; gboolean is_expanded; /* House sync */ GtkWidget *house_sync_frame; GtkWidget *house_sync_vbox; GtkWidget *use_house_sync; GtkWidget *sync_interval_frame; GtkWidget *sync_interval_scale; GtkWidget *sync_edge_frame; GtkWidget *sync_edge_combo; GtkWidget *video_mode_frame; GtkWidget *video_mode_widget; GtkWidget *video_mode_detect; gint current_detect_format; guint video_mode_detect_timer; gboolean video_mode_read_only; /* Dialogs */ GtkWidget *add_devices_dialog; GtkWidget *add_devices_entry; GtkWidget *remove_devices_dialog; GtkWidget *remove_devices_label; GtkTreeIter remove_devices_iter; GtkWidget *error_msg_dialog; GtkWidget *error_msg_label; GtkWidget *enable_confirm_dialog; GtkWidget *enable_confirm_text; GtkWidget *enable_confirm_cancel_button; guint enable_confirm_timer; int enable_confirm_countdown; /* Buttons */ GtkWidget *test_link_button; gboolean test_link_enabled; GtkWidget *sync_state_button; GtkWidget *enable_syncing_label; GtkWidget *disable_syncing_label; GtkWidget *selected_syncing_label; gboolean framelock_enabled; /* Images */ GdkPixbuf *led_grey_pixbuf; GdkPixbuf *led_green_pixbuf; GdkPixbuf *led_red_pixbuf; GdkPixbuf *rj45_input_pixbuf; GdkPixbuf *rj45_output_pixbuf; GdkPixbuf *rj45_unused_pixbuf; }; struct _CtkFramelockClass { GtkVBoxClass parent_class; }; GType ctk_framelock_get_type (void) G_GNUC_CONST; GtkWidget* ctk_framelock_new (NvCtrlAttributeHandle *, GtkWidget *, CtkConfig *, ParsedAttribute *); GtkTextBuffer *ctk_framelock_create_help(GtkTextTagTable *); void ctk_framelock_config_file_attributes(GtkWidget *, ParsedAttribute *); void ctk_framelock_select (GtkWidget *); void ctk_framelock_unselect (GtkWidget *); G_END_DECLS #endif /* __CTK_FRAMELOCK_H__ */ nvidia-settings/src/gtk+-2.x/ctkdisplayconfig-utils.c0000664000175000017500000041032312236467170022740 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2006 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include /* malloc */ #include /* strlen, strdup */ #include /* lseek, close */ #include #include #include #include #include #include #include #include "msg.h" #include "parse.h" #include "command-line.h" #include "common-utils.h" #include "ctkdisplayconfig-utils.h" #include "ctkutils.h" #include "ctkgpu.h" static void xconfig_update_buffer(GtkWidget *widget, gpointer user_data); static gchar *display_pick_config_name(nvDisplayPtr display, int force_target_id_name); static Bool screen_check_metamodes(nvScreenPtr screen); /*****************************************************************************/ /** TOKEN PARSING FUNCTIONS **************************************************/ /*****************************************************************************/ /** apply_modeline_token() ******************************************* * * Modifies the modeline structure given with the token/value pair * given. * **/ void apply_modeline_token(char *token, char *value, void *data) { nvModeLinePtr modeline = (nvModeLinePtr) data; if (!modeline || !token || !strlen(token)) { return; } /* Modeline source */ if (!strcasecmp("source", token)) { if (!value || !strlen(value)) { nv_warning_msg("Modeline 'source' token requires a value!"); } else if (!strcasecmp("xserver", value)) { modeline->source |= MODELINE_SOURCE_XSERVER; } else if (!strcasecmp("xconfig", value)) { modeline->source |= MODELINE_SOURCE_XCONFIG; } else if (!strcasecmp("builtin", value)) { modeline->source |= MODELINE_SOURCE_BUILTIN; } else if (!strcasecmp("vesa", value)) { modeline->source |= MODELINE_SOURCE_VESA; } else if (!strcasecmp("edid", value)) { modeline->source |= MODELINE_SOURCE_EDID; } else if (!strcasecmp("nv-control", value)) { modeline->source |= MODELINE_SOURCE_NVCONTROL; } else { nv_warning_msg("Unknown modeline source '%s'", value); } /* X config name */ } else if (!strcasecmp("xconfig-name", token)) { if (!value || !strlen(value)) { nv_warning_msg("Modeline 'xconfig-name' token requires a value!"); } else { if (modeline->xconfig_name) { free(modeline->xconfig_name); } modeline->xconfig_name = g_strdup(value); } /* Unknown token */ } else { nv_warning_msg("Unknown modeline token value pair: %s=%s", token, value); } } /* apply_modeline_token() */ /** apply_metamode_token() ******************************************* * * Modifies the metamode structure given with the token/value pair * given. * **/ void apply_metamode_token(char *token, char *value, void *data) { nvMetaModePtr metamode = (nvMetaModePtr) data; if (!metamode || !token || !strlen(token)) { return; } /* Metamode ID */ if (!strcasecmp("id", token)) { if (!value || !strlen(value)) { nv_warning_msg("MetaMode 'id' token requires a value!"); } else { metamode->id = atoi(value); } /* Source */ } else if (!strcasecmp("source", token)) { if (!value || !strlen(value)) { nv_warning_msg("MetaMode 'source' token requires a value!"); } else if (!strcasecmp("xconfig", value)) { metamode->source = METAMODE_SOURCE_XCONFIG; } else if (!strcasecmp("implicit", value)) { metamode->source = METAMODE_SOURCE_IMPLICIT; } else if (!strcasecmp("nv-control", value)) { metamode->source = METAMODE_SOURCE_NVCONTROL; } else if (!strcasecmp("randr", value)) { metamode->source = METAMODE_SOURCE_RANDR; } else { nv_warning_msg("Unknown MetaMode source '%s'", value); } /* Switchable */ } else if (!strcasecmp("switchable", token)) { if (!value || !strlen(value)) { nv_warning_msg("MetaMode 'switchable' token requires a value!"); } else { if (!strcasecmp(value, "yes")) { metamode->switchable = TRUE; } else { metamode->switchable = FALSE; } } /* Unknown token */ } else { nv_warning_msg("Unknown MetaMode token value pair: %s=%s", token, value); } } /* apply_metamode_token() */ /** apply_monitor_token() ******************************************** * * Reads the source of a refresh/sync range value * **/ void apply_monitor_token(char *token, char *value, void *data) { char **source = (char **)data; if (!source || !token || !strlen(token)) { return; } /* Vert sync or horiz refresh source */ if (!strcasecmp("source", token)) { if (*source) free(*source); *source = strdup(value); /* Unknown token */ } else { nv_warning_msg("Unknown monitor range token value pair: %s=%s", token, value); } } /* apply_monitor_token() */ /** apply_screen_info_token() **************************************** * * Modifies the GdkRectangle structure (pointed to by data) with * information from the token-value pair given. Currently accepts * position and width/height data. * **/ void apply_screen_info_token(char *token, char *value, void *data) { GdkRectangle *screen_info = (GdkRectangle *)data; if (!screen_info || !token || !strlen(token)) { return; } if (!strcasecmp("x", token)) { screen_info->x = atoi(value); } else if (!strcasecmp("y", token)) { screen_info->y = atoi(value); } else if (!strcasecmp("width", token)) { screen_info->width = atoi(value); } else if (!strcasecmp("height", token)) { screen_info->height = atoi(value); /* Unknown token */ } else { nv_warning_msg("Unknown screen info token value pair: %s=%s", token, value); } } /*****************************************************************************/ /** MODELINE FUNCTIONS *******************************************************/ /*****************************************************************************/ /** modeline_parse() ************************************************* * * Converts a modeline string to an modeline structure that the * display configuration page can use * * Modeline strings have the following format: * * "mode_name" dot_clock timings flags * **/ static nvModeLinePtr modeline_parse(nvDisplayPtr display, nvGpuPtr gpu, const char *modeline_str, const int broken_doublescan_modelines) { nvModeLinePtr modeline = NULL; const char *str = modeline_str; char *tmp; char *tokens, *nptr; double htotal, vtotal, factor; gdouble pclk; if (!str) return NULL; modeline = (nvModeLinePtr)calloc(1, sizeof(nvModeLine)); if (!modeline) return NULL; /* Parse the modeline tokens */ tmp = strstr(str, "::"); if (tmp) { tokens = strdup(str); tokens[ tmp-str ] = '\0'; str = tmp +2; parse_token_value_pairs(tokens, apply_modeline_token, (void *)modeline); free(tokens); } /* Read the mode name */ str = parse_skip_whitespace(str); if (!str || *str != '"') goto fail; str++; str = parse_read_name(str, &(modeline->data.identifier), '"'); if (!str) goto fail; /* Read dot clock */ str = parse_read_name(str, &(modeline->data.clock), 0); if (!str) goto fail; /* Read the mode timings */ str = parse_read_integer(str, &(modeline->data.hdisplay)); str = parse_read_integer(str, &(modeline->data.hsyncstart)); str = parse_read_integer(str, &(modeline->data.hsyncend)); str = parse_read_integer(str, &(modeline->data.htotal)); str = parse_read_integer(str, &(modeline->data.vdisplay)); str = parse_read_integer(str, &(modeline->data.vsyncstart)); str = parse_read_integer(str, &(modeline->data.vsyncend)); str = parse_read_integer(str, &(modeline->data.vtotal)); /* Parse modeline flags */ while ((str = parse_read_name(str, &tmp, 0)) && strlen(tmp)) { if (!xconfigNameCompare(tmp, "+hsync")) { modeline->data.flags |= XCONFIG_MODE_PHSYNC; } else if (!xconfigNameCompare(tmp, "-hsync")) { modeline->data.flags |= XCONFIG_MODE_NHSYNC; } else if (!xconfigNameCompare(tmp, "+vsync")) { modeline->data.flags |= XCONFIG_MODE_PVSYNC; } else if (!xconfigNameCompare(tmp, "-vsync")) { modeline->data.flags |= XCONFIG_MODE_NVSYNC; } else if (!xconfigNameCompare(tmp, "interlace")) { modeline->data.flags |= XCONFIG_MODE_INTERLACE; } else if (!xconfigNameCompare(tmp, "doublescan")) { modeline->data.flags |= XCONFIG_MODE_DBLSCAN; } else if (!xconfigNameCompare(tmp, "composite")) { modeline->data.flags |= XCONFIG_MODE_CSYNC; } else if (!xconfigNameCompare(tmp, "+csync")) { modeline->data.flags |= XCONFIG_MODE_PCSYNC; } else if (!xconfigNameCompare(tmp, "-csync")) { modeline->data.flags |= XCONFIG_MODE_NCSYNC; } else if (!xconfigNameCompare(tmp, "hskew")) { str = parse_read_integer(str, &(modeline->data.hskew)); if (!str) { free(tmp); goto fail; } modeline->data.flags |= XCONFIG_MODE_HSKEW; } else if (!xconfigNameCompare(tmp, "bcast")) { modeline->data.flags |= XCONFIG_MODE_BCAST; } else if (!xconfigNameCompare(tmp, "CUSTOM")) { modeline->data.flags |= XCONFIG_MODE_CUSTOM; } else if (!xconfigNameCompare(tmp, "vscan")) { str = parse_read_integer(str, &(modeline->data.vscan)); if (!str) { free(tmp); goto fail; } modeline->data.flags |= XCONFIG_MODE_VSCAN; } else { nv_warning_msg("Invalid modeline keyword '%s' in modeline '%s'", tmp, modeline_str); goto fail; } free(tmp); } modeline->refresh_rate = 0; if (display->is_sdi && gpu->num_gvo_modes) { /* Fetch the SDI refresh rate of the mode from the gvo mode table */ int i; for (i = 0; i < gpu->num_gvo_modes; i++) { if (gpu->gvo_mode_data[i].id && gpu->gvo_mode_data[i].name && !strcmp(gpu->gvo_mode_data[i].name, modeline->data.identifier)) { modeline->refresh_rate = gpu->gvo_mode_data[i].rate; modeline->refresh_rate /= 1000.0; break; } } } if (modeline->refresh_rate == 0) { /* * Calculate the vertical refresh rate of the modeline in Hz; * divide by two for double scan modes (if the double scan * modeline isn't broken; i.e., already has a correct vtotal), and * multiply by two for interlaced modes (so that we report the * field rate, rather than the frame rate) */ htotal = (double) modeline->data.htotal; vtotal = (double) modeline->data.vtotal; /* * Use g_ascii_strtod(), so that we do not have to change the locale * to "C". */ pclk = g_ascii_strtod((const gchar *)modeline->data.clock, (gchar **)&nptr); if ((pclk == 0.0) || !nptr || *nptr != '\0' || ((htotal * vtotal) == 0)) { nv_warning_msg("Failed to compute the refresh rate " "for the modeline '%s'", str); goto fail; } modeline->refresh_rate = (pclk * 1000000.0) / (htotal * vtotal); factor = 1.0; if ((modeline->data.flags & V_DBLSCAN) && !broken_doublescan_modelines) { factor *= 0.5; } if (modeline->data.flags & V_INTERLACE) { factor *= 2.0; } modeline->refresh_rate *= factor; } return modeline; /* Handle failures */ fail: free(modeline); return NULL; } /* modeline_parse() */ /*****************************************************************************/ /** MODE FUNCTIONS ***********************************************************/ /*****************************************************************************/ /*! * Clamps the given dimensions to be no smaller than the mode's viewPortIn * * \param[in, out] rect The GdkRectangle to clamp. * \param[in] mode The mode to clamp against. */ void clamp_rect_to_viewportin(GdkRectangle *rect, const nvMode *mode) { if (rect->width < mode->viewPortIn.width) { rect->width = mode->viewPortIn.width; } if (rect->height < mode->viewPortIn.height) { rect->height = mode->viewPortIn.height; } } /*! * Clamps the mode's panning domain to the mode's viewPortIn dimensions * * \param[in, out] mode The mode who's panning to clamp. */ void clamp_mode_panning(nvModePtr mode) { clamp_rect_to_viewportin(&(mode->pan), mode); } /*! * Fills a rectangle struct with both position and size information of the * given mode's viewPortIn. * * \param[in] mode The mode to return information for. * \param[in, out] rect The GdkRectangle structure to populate. */ void get_viewportin_rect(const nvMode *mode, GdkRectangle *rect) { rect->x = mode->pan.x; rect->y = mode->pan.y; rect->width = mode->viewPortIn.width; rect->height = mode->viewPortIn.height; } void mode_set_modeline(nvModePtr mode, nvModeLinePtr modeline, const nvSize *providedViewPortIn, const GdkRectangle *providedViewPortOut) { int width; int height; Bool panning_modified; /* Figure out what dimensions to use */ if (providedViewPortIn) { width = providedViewPortIn->width; height = providedViewPortIn->height; } else if (modeline) { width = modeline->data.hdisplay; height = modeline->data.vdisplay; } else { /* NULL modeline given (display is being turned off), use a default * resolution to show the display. */ if (mode->display->modelines) { // XXX assumes that the first modeline in the display's list is the // default (nvidia-auto-select). width = mode->display->modelines->data.hdisplay; height = mode->display->modelines->data.vdisplay; } else { /* display has no modelines, 800x600 seems reasonable */ width = 800; height = 600; } } /* Reset the viewPortOut to match the full visible size of the modeline */ // XXX Only do this if viewport out has not been tweaked? // XXX - Should we do any clamping? if (providedViewPortOut) { mode->viewPortOut = *providedViewPortOut; } else { mode->viewPortOut.x = 0; mode->viewPortOut.y = 0; mode->viewPortOut.width = width; mode->viewPortOut.height = height; } /* Oriented the dimensions to use for the viewPortIn and Panning */ if ((mode->rotation == ROTATION_90) || (mode->rotation == ROTATION_270)) { int temp = width; width = height; height = temp; } /* XXX Later, keep a flag in nvModePtr to track if the panning has * been modified */ panning_modified = (mode->pan.width != mode->viewPortIn.width) || (mode->pan.height != mode->viewPortIn.height); /* XXX Only set this if the user has not modified viewPortIn... */ { mode->viewPortIn.width = width; mode->viewPortIn.height = height; /* Panning domain must include viewPortIn */ clamp_mode_panning(mode); } /* Only set this if the user has not modified panning... */ if (!panning_modified) { mode->pan.width = width; mode->pan.height = height; } mode->modeline = modeline; } /*! * Sets the mode to have the specified rotation * * \param[in] mode The mode to modify * \param[in] rotation The rotation to set * * \return TRUE if a new rotation was set, FALSE if the mode was already * set to the rotation given. */ Bool mode_set_rotation(nvModePtr mode, Rotation rotation) { Bool old_is_horiz; Bool new_is_horiz; int tmp; if (mode->rotation == rotation) { return FALSE; } /* Set the new rotation orientation and swap if we need to*/ old_is_horiz = ((mode->rotation == ROTATION_0) || (mode->rotation == ROTATION_180)) ? TRUE : FALSE; new_is_horiz = ((rotation == ROTATION_0) || (rotation == ROTATION_180)) ? TRUE : FALSE; mode->rotation = rotation; if (old_is_horiz != new_is_horiz) { tmp = mode->viewPortIn.width; mode->viewPortIn.width = mode->viewPortIn.height; mode->viewPortIn.height = tmp; tmp = mode->pan.width; mode->pan.width = mode->pan.height; mode->pan.height = tmp; } /* Mark mode as being modified */ if (mode->metamode) { mode->metamode->source = METAMODE_SOURCE_NVCONTROL; } return TRUE; } /** apply_mode_attribute_token() ************************************* * * Modifies the nvMode structure (pointed to by data) with * information from the token-value pair given. Currently accepts * stereo (mode) data. * * Unknown token and/or values are silently ignored. * **/ static void apply_mode_attribute_token(char *token, char *value, void *data) { nvModePtr mode = (nvModePtr)data; if (!mode || !token || !strlen(token)) { return; } /* stereo */ if (!strcasecmp("stereo", token)) { if (!strcasecmp("PassiveLeft", value)) { mode->passive_stereo_eye = PASSIVE_STEREO_EYE_LEFT; } else if (!strcasecmp("PassiveRight", value)) { mode->passive_stereo_eye = PASSIVE_STEREO_EYE_RIGHT; } /* ViewPortIn */ } else if (!strcasecmp("viewportin", token)) { parse_read_integer_pair(value, 'x', &(mode->viewPortIn.width), &(mode->viewPortIn.height)); /* ViewPortOut */ } else if (!strcasecmp("viewportout", token)) { const char *str; str = parse_read_integer_pair(value, 'x', &(mode->viewPortOut.width), &(mode->viewPortOut.height)); str = parse_read_integer_pair(str, 0, &(mode->viewPortOut.x), &(mode->viewPortOut.y)); } /* Rotation */ if (!strcasecmp("rotation", token)) { if (!strcasecmp("left", value) || !strcasecmp("CCW", value) || !strcasecmp("90", value)) { mode->rotation = ROTATION_90; } else if (!strcasecmp("invert", value) || !strcasecmp("inverted", value) || !strcasecmp("180", value)) { mode->rotation = ROTATION_180; } else if (!strcasecmp("right", value) || !strcasecmp("CW", value) || !strcasecmp("270", value)) { mode->rotation = ROTATION_270; } } /* Reflection */ if (!strcasecmp("reflection", token)) { if (!strcasecmp("x", value)) { mode->reflection = REFLECTION_X; } else if (!strcasecmp("y", value)) { mode->reflection = REFLECTION_Y; } else if (!strcasecmp("xy", value)) { mode->reflection = REFLECTION_XY; } } } /* apply_mode_attribute_token() */ /** mode_parse() ***************************************************** * * Converts a mode string (dpy specific part of a metamode) to a * mode structure that the display configuration page can use. * * Mode strings have the following format: * * "mode_name +X+Y @WxH {token=value, ...}" * **/ nvModePtr mode_parse(nvDisplayPtr display, const char *mode_str) { nvModePtr mode; char *mode_name; /* Modeline reference name */ const char *str = mode_str; nvModeLinePtr modeline; if (!str || !display) return NULL; /* Allocate a Mode structure */ mode = (nvModePtr)calloc(1, sizeof(nvMode)); if (!mode) return NULL; mode->display = display; /* Set default values */ mode->rotation = ROTATION_0; mode->reflection = REFLECTION_NONE; mode->passive_stereo_eye = PASSIVE_STEREO_EYE_NONE; mode->position_type = CONF_ADJ_ABSOLUTE; /* Read the mode name */ str = parse_read_name(str, &mode_name, 0); if (!str || !mode_name) goto fail; /* Find the display's modeline that matches the given mode name */ modeline = display->modelines; while (modeline) { if (!strcmp(mode_name, modeline->data.identifier)) { break; } modeline = modeline->next; } /* If we can't find a matching modeline, set the NULL mode. */ if (!modeline) { if (strcmp(mode_str, "NULL")) { nv_warning_msg("Mode name '%s' does not match any modelines for " "display device '%s' in modeline '%s'.", mode_name, display->logName, mode_str); } free(mode_name); mode_set_modeline(mode, NULL /* modeline */, NULL /* viewPortIn */, NULL /* viewPortOut */); return mode; } free(mode_name); /* Don't call mode_set_modeline() here since we want to apply the values * from the string we're parsing, so just link the modeline */ mode->modeline = modeline; /* Read mode information */ while (*str) { /* Read panning */ if (*str == '@') { str++; str = parse_read_integer_pair(str, 'x', &(mode->pan.width), &(mode->pan.height)); } /* Read position */ else if (*str == '+') { str++; str = parse_read_integer_pair(str, 0, &(mode->pan.x), &(mode->pan.y)); } /* Read extra params */ else if (*str == '{') { const char *end; char *tmp; str++; end = strchr(str, '}'); if (!end) goto fail; /* Dupe the string so we can parse it properly */ tmp = nvstrndup(str, (size_t)(end-str)); if (!tmp) goto fail; parse_token_value_pairs(tmp, apply_mode_attribute_token, mode); free(tmp); if (end && (*end == '}')) { str = ++end; } } /* Mode parse error - Ack! */ else { nv_error_msg("Unknown mode token: %s", str); str = NULL; } /* Catch errors */ if (!str) goto fail; } /* Initialize defaults for the viewports if unspecified */ if ((mode->viewPortOut.width == 0) || (mode->viewPortOut.height == 0)) { mode->viewPortOut.width = mode->modeline->data.hdisplay; mode->viewPortOut.height = mode->modeline->data.vdisplay; } if ((mode->viewPortIn.width == 0) || (mode->viewPortIn.height == 0)) { mode->viewPortIn.width = mode->viewPortOut.width; mode->viewPortIn.height = mode->viewPortOut.height; } /* If rotation is specified, swap W/H if they are still set to the * modeline's unrotated dimensions. Panning should not be rotated * here since it is returned rotated by the X driver. */ if (((mode->rotation == ROTATION_90) || (mode->rotation == ROTATION_270)) && (mode->viewPortIn.width == mode->viewPortOut.width) && (mode->viewPortIn.height == mode->viewPortOut.height)) { int tmp = mode->viewPortIn.width; mode->viewPortIn.width = mode->viewPortIn.height; mode->viewPortIn.height = tmp; } /* Clamp the panning domain */ clamp_mode_panning(mode); return mode; /* Handle failures */ fail: if (mode) { free(mode); } return NULL; } /* mode_parse() */ /** apply_underscan_to_viewportout() ********************************** * * Modifies the given ViewPortOut with an underscan border of the given size in * horizontal pixels. The original aspect ratio is preserved. * */ void apply_underscan_to_viewportout(const nvSize raster_size, const int hpixel_value, GdkRectangle *viewPortOut) { float scale_factor, x_offset, y_offset; /* Preserve aspect ratio */ scale_factor = (float) raster_size.width / raster_size.height; x_offset = (float) hpixel_value; y_offset = x_offset / scale_factor; viewPortOut->x = (gint) x_offset; viewPortOut->y = (gint) y_offset; viewPortOut->width = (gint) (raster_size.width - (2 * x_offset)); viewPortOut->height = (gint) (raster_size.height - (2 * y_offset)); /* Limit ViewPortOut to a minimum size */ viewPortOut->width = NV_MAX(viewPortOut->width, 10); viewPortOut->height = NV_MAX(viewPortOut->height, 10); } /** get_underscan_percent_from_viewportout() ************************** * * Retrieve underscan from the current ViewPortOut. * * We could just try to revert the formula, i.e. check that: * viewPortOut.width + (2 * viewPortOut.x) == raster.width && * viewPortOut.height + (2 * viewPortOut.y) == raster.height * * But this doesn't match the case where the initial ViewPortOut * computation had rounding issues. * * Instead, we compute a new ViewPortOut from the current x offset * and check that the result matches the current ViewPortOut. * * Returns the underscan value in percentage. Defaults to -1 if no * underscan could be found. * */ void get_underscan_settings_from_viewportout(const nvSize raster_size, const GdkRectangle viewPortOut, gfloat *percent_value, gint *pixel_value) { GdkRectangle dummyViewPortOut; if (!percent_value || !pixel_value) { return; } apply_underscan_to_viewportout(raster_size, (int) viewPortOut.x, &dummyViewPortOut); if (!memcmp(&viewPortOut, &dummyViewPortOut, sizeof(GdkRectangle))) { *percent_value = (gfloat) viewPortOut.x / raster_size.width * 100; *pixel_value = viewPortOut.x; } else { *percent_value = -1; *pixel_value = -1; } } /** mode_get_str() *************************************************** * * Returns the mode string of the given mode in the following format: * * "mode_name @WxH +X+Y" * **/ static gchar *mode_get_str(nvModePtr mode, int force_target_id_name) { gchar *mode_str; gchar *tmp; gchar *flags_str; nvDisplayPtr display = mode->display; nvScreenPtr screen; nvGpuPtr gpu; /* Make sure the mode has everything it needs to be displayed */ if (!mode || !mode->metamode || !display) { return NULL; } /* Don't include dummy modes */ if (mode->dummy && !mode->modeline) { return NULL; } screen = display->screen; gpu = display->gpu; if (!screen || !gpu) { return NULL; } /* Pick a suitable display name qualifier */ mode_str = display_pick_config_name(display, force_target_id_name); if (mode_str[0] != '\0') { tmp = mode_str; mode_str = g_strconcat(tmp, ": ", NULL); g_free(tmp); } /* NULL mode */ if (!mode->modeline) { tmp = g_strconcat(mode_str, "NULL", NULL); g_free(mode_str); return tmp; } /* Mode name */ tmp = g_strconcat(mode_str, mode->modeline->data.identifier, NULL); g_free(mode_str); mode_str = tmp; /* Panning domain */ if ((mode->pan.width != mode->viewPortIn.width) || (mode->pan.height != mode->viewPortIn.height)) { tmp = g_strdup_printf("%s @%dx%d", mode_str, mode->pan.width, mode->pan.height); g_free(mode_str); mode_str = tmp; } /* Offset */ /* * XXX Later, we'll want to allow the user to select how * the metamodes are generated: * * Programmability: * make mode->viewPortIn relative to screen->dim * * Coherency: * make mode->viewPortIn relative to mode->metamode->edim * * * XXX Also, we may want to take in consideration the * TwinViewOrientation when writing out position * information. */ tmp = g_strdup_printf("%s +%d+%d", mode_str, /* Make mode position relative */ mode->pan.x - mode->metamode->edim.x, mode->pan.y - mode->metamode->edim.y); g_free(mode_str); mode_str = tmp; /* Mode Flags */ flags_str = NULL; /* Passive Stereo Eye */ if (screen->stereo_supported && (screen->stereo == NV_CTRL_STEREO_PASSIVE_EYE_PER_DPY)) { const char *str = NULL; switch (mode->passive_stereo_eye) { case PASSIVE_STEREO_EYE_LEFT: str = "PassiveLeft"; break; case PASSIVE_STEREO_EYE_RIGHT: str = "PassiveRight"; break; case 0: default: str = NULL; break; } if (str) { tmp = g_strdup_printf("%s, stereo=%s", (flags_str ? flags_str : ""), str); g_free(flags_str); flags_str = tmp; } } /* Rotation */ if (mode->rotation != ROTATION_0) { const char *str = NULL; switch (mode->rotation) { case ROTATION_90: str = "left"; break; case ROTATION_180: str = "invert"; break; case ROTATION_270: str = "right"; break; default: break; } if (str) { tmp = g_strdup_printf("%s, rotation=%s", (flags_str ? flags_str : ""), str); g_free(flags_str); flags_str = tmp; } } /* Reflection */ if (mode->reflection != REFLECTION_NONE) { const char *str = NULL; switch (mode->reflection) { case REFLECTION_X: str = "X"; break; case REFLECTION_Y: str = "Y"; break; case REFLECTION_XY: str = "XY"; break; default: break; } if (str) { tmp = g_strdup_printf("%s, reflection=%s", (flags_str ? flags_str : ""), str); g_free(flags_str); flags_str = tmp; } } /* ViewPortIn */ { int width; int height; /* Only write out the ViewPortIn if it is specified and differs from the * ViewPortOut. */ if ((mode->rotation == ROTATION_90) || (mode->rotation == ROTATION_270)) { width = mode->viewPortOut.height; height = mode->viewPortOut.width; } else { width = mode->viewPortOut.width; height = mode->viewPortOut.height; } if (mode->viewPortIn.width && mode->viewPortIn.height && ((mode->viewPortIn.width != width) || (mode->viewPortIn.height != height))) { tmp = g_strdup_printf("%s, viewportin=%dx%d", (flags_str ? flags_str : ""), mode->viewPortIn.width, mode->viewPortIn.height); g_free(flags_str); flags_str = tmp; } } /* ViewPortOut */ if (mode->viewPortOut.x || mode->viewPortOut.y || (mode->viewPortOut.width && mode->viewPortOut.height && ((mode->viewPortOut.width != mode->modeline->data.hdisplay) || (mode->viewPortOut.height != mode->modeline->data.vdisplay)))) { tmp = g_strdup_printf("%s, viewportout=%dx%d%+d%+d", (flags_str ? flags_str : ""), mode->viewPortOut.width, mode->viewPortOut.height, mode->viewPortOut.x, mode->viewPortOut.y); g_free(flags_str); flags_str = tmp; } if (flags_str) { tmp = g_strdup_printf("%s {%s}", mode_str, flags_str+2 // Skip the first comma and whitespace ); g_free(mode_str); mode_str = tmp; } return mode_str; } /* mode_get_str() */ /*****************************************************************************/ /** DISPLAY FUNCTIONS ********************************************************/ /*****************************************************************************/ /** display_names_match() ******************************************** * * Determines if two (display) names are the same. Returns FALSE if * either name is NULL. * **/ static Bool display_names_match(const char *name1, const char *name2) { if (!name1 || !name2) { return FALSE; } return (strcasecmp(name1, name2) == 0) ? TRUE : FALSE; } /** display_pick_config_name() *************************************** * * Returns one of the display's names to be used for writing * configuration. * * If 'generic' is TRUE, then the most generic name possible is * returned. This depends on the current existence of other display * devices, and the name returned here will not collide with the name * of other display devices. * **/ static gchar *display_pick_config_name(nvDisplayPtr display, int force_target_id_name) { nvScreenPtr screen; nvGpuPtr gpu; /* Use target ID name for talking to X server */ if (force_target_id_name) { return g_strdup(display->targetIdName); } screen = display->screen; gpu = display->gpu; /* If one of the Mosaic modes is configured, and the X server supports * GPU UUIDs, qualify the display device with the GPU UUID. */ if (screen->num_gpus >= 1 && gpu->mosaic_enabled && gpu->uuid) { return g_strconcat(gpu->uuid, ".", display->randrName, NULL); } /* If the X screen is driven by a single display on a single GPU, omit the * display name qualifier, so the configuration will be portable. */ if (screen->num_displays == 1 && gpu->num_displays == 1) { return g_strdup(""); } /* Otherwise, use the RandR based name */ return g_strdup(display->randrName); } /** display_find_closest_mode_matching_modeline() ******************** * * Helper function that returns the mode index of the display's mode * that best matches the given modeline. * * A best match is: * * - The modelines match in width & height. * - Then, the modelines match the ViewPortIn. * - Then, the modelines match the ViewPortOut. * **/ int display_find_closest_mode_matching_modeline(nvDisplayPtr display, nvModeLinePtr modeline) { const int targetWidth = modeline->data.hdisplay; const int targetHeight = modeline->data.vdisplay; nvModePtr mode, best_mode = NULL; int mode_idx; int best_idx = -1; mode_idx = 0; for (mode = display->modes; mode; mode = mode->next) { if (!mode->modeline) { continue; } else if (mode->modeline->data.hdisplay == targetWidth && mode->modeline->data.vdisplay == targetHeight) { nvModePtr tmp_mode = mode; int tmp_idx = mode_idx; /* We already have a match. Let's figure out if the * currently considered mode is the closer to what we * want. */ if (best_mode) { Bool current_match_vpin = (mode->viewPortIn.width == targetWidth && mode->viewPortIn.height == targetHeight); Bool best_match_vpin = (best_mode->viewPortIn.width == targetWidth && best_mode->viewPortIn.height == targetHeight); Bool best_match_vpout = (best_mode->viewPortOut.width == targetWidth && best_mode->viewPortOut.height == targetHeight); /* Try to find reasons why we should prefer the * previous match over the currently considered * mode. * * We first check which one has a matching ViewPortIn * If it's the case for both of them, then we compare * ViewPortOut. * * If both are equally close, we keep our previous * match. */ if ((!current_match_vpin && best_match_vpin) || (current_match_vpin && best_match_vpin && best_match_vpout)) { tmp_mode = best_mode; tmp_idx = best_idx; } /* Fallthrough. */ } best_mode = tmp_mode; best_idx = tmp_idx; } mode_idx++; } return best_idx; } /* display_find_closest_mode_matching_modeline() */ /** modeline_free() ************************************* * * Helper function that frees an nvModeLinePtr and * associated memory. * **/ void modeline_free(nvModeLinePtr m) { if (m->xconfig_name) { free(m->xconfig_name); } if (m->data.identifier) { free(m->data.identifier); } if (m->data.comment) { free(m->data.comment); } if (m->data.clock) { free(m->data.clock); } free(m); } /** modelines_match() ************************************* * * Helper function that returns True or False based on whether * the modeline arguments match each other. * **/ Bool modelines_match(nvModeLinePtr modeline1, nvModeLinePtr modeline2) { if (!modeline1 || !modeline2) { return FALSE; } if (!g_ascii_strcasecmp(modeline1->data.clock, modeline2->data.clock) && modeline1->data.hdisplay == modeline2->data.hdisplay && modeline1->data.hsyncstart == modeline2->data.hsyncstart && modeline1->data.hsyncend == modeline2->data.hsyncend && modeline1->data.htotal == modeline2->data.htotal && modeline1->data.vdisplay == modeline2->data.vdisplay && modeline1->data.vsyncstart == modeline2->data.vsyncstart && modeline1->data.vsyncend == modeline2->data.vsyncend && modeline1->data.vtotal == modeline2->data.vtotal && modeline1->data.vscan == modeline2->data.vscan && modeline1->data.flags == modeline2->data.flags && modeline1->data.hskew == modeline2->data.hskew && !g_ascii_strcasecmp(modeline1->data.identifier, modeline2->data.identifier)) { return TRUE; } else { return FALSE; } } /* modelines_match() */ /** viewport_in_match() ********************************************** * * Helper function that returns TRUE of FALSE based on whether * the ViewPortIn arguments match each other. * **/ Bool viewports_in_match(const nvSize viewPortIn1, const nvSize viewPortIn2) { return ((viewPortIn1.width == viewPortIn2.width) && (viewPortIn1.height == viewPortIn2.height)); } /** viewport_out_match() ********************************************* * * Helper function that returns TRUE of FALSE based on whether * the ViewPortOut arguments match each other. * **/ Bool viewports_out_match(const GdkRectangle viewPortOut1, const GdkRectangle viewPortOut2) { return ((viewPortOut1.x == viewPortOut2.x) && (viewPortOut1.y == viewPortOut2.y) && (viewPortOut1.width == viewPortOut2.width) && (viewPortOut1.height == viewPortOut2.height)); } /** display_has_modeline() ******************************************* * * Helper function that returns TRUE or FALSE based on whether * the display passed as argument supports the given modeline. * **/ Bool display_has_modeline(nvDisplayPtr display, nvModeLinePtr modeline) { nvModeLinePtr m; for (m = display->modelines; m; m = m->next) { if (modelines_match(m, modeline)) { return TRUE; } } return FALSE; } /* display_has_modeline() */ /** display_remove_modelines() *************************************** * * Clears the display device's modeline list. * **/ static void display_remove_modelines(nvDisplayPtr display) { nvModeLinePtr modeline; if (display) { while (display->modelines) { modeline = display->modelines; display->modelines = display->modelines->next; modeline_free(modeline); } display->num_modelines = 0; } } /* display_remove_modelines() */ /** display_add_modelines_from_server() ****************************** * * Queries the display's current modepool (modelines list). * **/ Bool display_add_modelines_from_server(nvDisplayPtr display, nvGpuPtr gpu, gchar **err_str) { nvModeLinePtr modeline; char *modeline_strs = NULL; char *str; int len; ReturnStatus ret, ret1; int major = 0, minor = 0; int broken_doublescan_modelines; /* * check the version of the NV-CONTROL protocol -- versions <= * 1.13 had a bug in how they reported double scan modelines * (vsyncstart, vsyncend, and vtotal were doubled); determine * if this X server has this bug, so that we can use * broken_doublescan_modelines to correctly compute the * refresh rate. */ broken_doublescan_modelines = 1; ret = NvCtrlGetAttribute(display->handle, NV_CTRL_ATTR_NV_MAJOR_VERSION, &major); ret1 = NvCtrlGetAttribute(display->handle, NV_CTRL_ATTR_NV_MINOR_VERSION, &minor); if ((ret == NvCtrlSuccess) && (ret1 == NvCtrlSuccess) && ((major > 1) || ((major == 1) && (minor > 13)))) { broken_doublescan_modelines = 0; } /* Free any old mode lines */ display_remove_modelines(display); /* Get the validated modelines for the display */ ret = NvCtrlGetBinaryAttribute(display->handle, 0, NV_CTRL_BINARY_DATA_MODELINES, (unsigned char **)&modeline_strs, &len); if (ret != NvCtrlSuccess) { *err_str = g_strdup_printf("Failed to query modelines of display " "device %d '%s'.", NvCtrlGetTargetId(display->handle), display->logName); nv_error_msg("%s", *err_str); goto fail; } /* Parse each modeline */ str = modeline_strs; while (strlen(str)) { modeline = modeline_parse(display, gpu, str, broken_doublescan_modelines); if (!modeline) { *err_str = g_strdup_printf("Failed to parse the following " "modeline of display device\n" "%d '%s' :\n\n%s", NvCtrlGetTargetId(display->handle), display->logName, str); nv_error_msg("%s", *err_str); goto fail; } /* Add the modeline at the end of the display's modeline list */ xconfigAddListItem((GenericListPtr *)(&display->modelines), (GenericListPtr)modeline); display->num_modelines++; /* Get next modeline string */ str += strlen(str) +1; } XFree(modeline_strs); return TRUE; /* Handle the failure case */ fail: display_remove_modelines(display); XFree(modeline_strs); return FALSE; } /* display_add_modelines_from_server() */ /** display_get_mode_str() ******************************************* * * Returns the mode string of the display's 'mode_idx''s * mode. * **/ static gchar *display_get_mode_str(nvDisplayPtr display, int mode_idx, int force_target_id_name) { nvModePtr mode = display->modes; while (mode && mode_idx) { mode = mode->next; mode_idx--; } if (mode) { return mode_get_str(mode, force_target_id_name); } return NULL; } /* display_get_mode_str() */ /** display_remove_modes() ******************************************* * * Removes all modes currently referenced by this screen, also * freeing any memory used. * **/ void display_remove_modes(nvDisplayPtr display) { nvModePtr mode; if (display) { while (display->modes) { mode = display->modes; display->modes = mode->next; free(mode); } display->num_modes = 0; display->cur_mode = NULL; } } /* display_remove_modes() */ /*! * Sets all the modes on the display to the specified rotation * * \param[in] mode The display who's modes are to be modified * \param[in] rotation The rotation to set * * \return TRUE if a new rotation was set for at least one mode, FALSE if all * of the modes on the display were already set to the rotation given. */ Bool display_set_modes_rotation(nvDisplayPtr display, Rotation rotation) { nvModePtr mode; Bool modified = FALSE; for (mode = display->modes; mode; mode = mode->next) { if (mode_set_rotation(mode, rotation)) { modified = TRUE; } } return modified; } /** display_free() *************************************************** * * Frees memory used by a display * **/ static void display_free(nvDisplayPtr display) { if (display) { display_remove_modes(display); display_remove_modelines(display); XFree(display->logName); XFree(display->typeBaseName); XFree(display->typeIdName); XFree(display->dpGuidName); XFree(display->edidHashName); XFree(display->targetIdName); XFree(display->randrName); free(display); } } /* display_free() */ /*****************************************************************************/ /** SCREEN FUNCTIONS *********************************************************/ /*****************************************************************************/ /*! * Clamps the given (screen) dimensions to the minimum allowed screen size. * * \param[in, out] rect The dimensions to clamp */ void clamp_screen_size_rect(GdkRectangle *rect) { if (rect->width < 304) { rect->width = 304; } if (rect->height < 200) { rect->height = 200; } } /** get_screen_max_displays () *************************************** * * Returns the maximum number of allowable enabled displays for the X screen. * This is based on the screen's driving GPU's max number of enabled displays, * in conjunction with whether or not Mosaic is enabled and which type. * Surround (Base Mosaic) only supports up to 3 enabled display devices, * while other modes (Base Mosaic and SLI Mosaic) support unlimited displays. * **/ int get_screen_max_displays(nvScreenPtr screen) { nvGpuPtr gpu = screen->display_owner_gpu; /* If mosaic is enabled, check the type so we can properly limit the number * of display devices */ if (gpu->mosaic_enabled) { if (gpu->mosaic_type == MOSAIC_TYPE_BASE_MOSAIC_LIMITED) { return 3; } return -1; /* Not limited */ } return screen->max_displays; } /** screen_find_named_display() ************************************** * * Finds a display named 'display_name' in the list of displays on the * given screen, or NULL if no display matched 'display_name'. * **/ static nvDisplayPtr screen_find_named_display(nvScreenPtr screen, char *display_name) { nvDisplayPtr display; nvDisplayPtr possible_display = NULL; if (!display_name) { return NULL; } /* Look for exact matches */ for (display = screen->displays; display; display = display->next_in_screen) { /* Look for an exact match */ if (display_names_match(display->typeIdName, display_name)) { return display; } if (display_names_match(display->dpGuidName, display_name)) { return display; } if (display_names_match(display->targetIdName, display_name)) { return display; } if (display_names_match(display->randrName, display_name)) { return display; } /* Allow matching to generic names, but only return these * if no other name matched */ if (!possible_display) { if (display_names_match(display->typeBaseName, display_name)) { possible_display = display; } if (display_names_match(display->edidHashName, display_name)) { possible_display = display; } } } return possible_display; } /** renumber_xscreens() ********************************************** * * Ensures that the screens are numbered from 0 to (n-1). * **/ void renumber_xscreens(nvLayoutPtr layout) { nvScreenPtr screen; nvScreenPtr lowest; int scrnum; scrnum = 0; do { /* Find screen w/ lowest # >= current screen index being assigned */ lowest = NULL; for (screen = layout->screens; screen; screen = screen->next_in_layout) { if ((screen->scrnum >= scrnum) && (!lowest || (lowest->scrnum > screen->scrnum))) { lowest = screen; } } if (lowest) { lowest->scrnum = scrnum; } /* Assign next screen number */ scrnum++; } while (lowest); } /* renumber_xscreens() */ /** screen_link_display() ******************************************** * * Makes the given display part of the screen * **/ void screen_link_display(nvScreenPtr screen, nvDisplayPtr display) { if (!display || !screen || (display->screen == screen)) return; display->screen = screen; display->next_in_screen = NULL; /* Add the display at the end of the screen's display list */ if (!screen->displays) { screen->displays = display; } else { nvDisplayPtr last; for (last = screen->displays; last; last = last->next_in_screen) { if (!last->next_in_screen) { last->next_in_screen = display; break; } } } screen->num_displays++; } /* screen_link_display() */ /** screen_unlink_display() ****************************************** * * Removes the display from the screen's list of displays * **/ void screen_unlink_display(nvDisplayPtr display) { nvScreenPtr screen; if (!display || !display->screen) return; screen = display->screen; /* Remove the display from the screen */ if (screen->displays == display) { screen->displays = display->next_in_screen; } else { nvDisplayPtr cur = screen->displays; while (cur) { if (cur->next_in_screen == display) { cur->next_in_screen = display->next_in_screen; break; } cur = cur->next_in_screen; } } screen->num_displays--; display->screen = NULL; } /* screen_unlink_display() */ static void screen_link_displays(nvScreenPtr screen) { ReturnStatus ret; int *pData; int len; int i; ret = NvCtrlGetBinaryAttribute (screen->handle, 0, NV_CTRL_BINARY_DATA_DISPLAYS_ASSIGNED_TO_XSCREEN, (unsigned char **)(&pData), &len); if (ret != NvCtrlSuccess) { nv_warning_msg("Failed to query list of displays assigned to X screen " " %d.", NvCtrlGetTargetId(screen->handle)); return; } // For each id in pData for (i = 0; i < pData[0]; i++) { nvDisplayPtr display; display = layout_get_display(screen->layout, pData[i+1]); if (!display) { nv_warning_msg("Failed to find display %d assigned to X screen " " %d.", pData[i+1], NvCtrlGetTargetId(screen->handle)); continue; } screen_link_display(screen, display); } XFree(pData); } /** screen_remove_display() ****************************************** * * Removes a display device from the screen * **/ void screen_remove_display(nvDisplayPtr display) { nvScreenPtr screen; nvDisplayPtr other; nvModePtr mode; if (!display || !display->screen) return; screen = display->screen; /* Make any display relative to this one use absolute position */ for (other = screen->displays; other; other = other->next_in_screen) { if (other == display) continue; for (mode = other->modes; mode; mode = mode->next) { if (mode->relative_to == display) { mode->position_type = CONF_ADJ_ABSOLUTE; mode->relative_to = NULL; } } } /* Remove the display from the screen */ screen_unlink_display(display); /* Clean up old references */ if (screen->primaryDisplay == display) { screen->primaryDisplay = NULL; } display_remove_modes(display); } /* screen_remove_display() */ /** screen_remove_displays() ***************************************** * * Removes all displays currently pointing at this screen, also * freeing any memory used. * **/ static void screen_remove_displays(nvScreenPtr screen) { if (!screen) return; while (screen->displays) { screen_remove_display(screen->displays); } } /* screen_remove_displays() */ /** screen_get_metamode_str() **************************************** * * Returns a screen's metamode string for the given metamode index * as: * * "mode1_1, mode1_2, mode1_3 ... " * **/ gchar *screen_get_metamode_str(nvScreenPtr screen, int metamode_idx, int force_target_id_name) { nvDisplayPtr display; gchar *metamode_str = NULL; gchar *mode_str; gchar *tmp; for (display = screen->displays; display; display = display->next_in_screen) { mode_str = display_get_mode_str(display, metamode_idx, force_target_id_name); if (!mode_str) continue; if (!metamode_str) { metamode_str = mode_str; } else { tmp = g_strdup_printf("%s, %s", metamode_str, mode_str); g_free(mode_str); g_free(metamode_str); metamode_str = tmp; } } if (!metamode_str) { metamode_str = strdup("NULL"); } return metamode_str; } /* screen_get_metamode_str() */ /** cleanup_metamode() *********************************************** * * Frees any internal memory used by the metamode. * **/ void cleanup_metamode(nvMetaModePtr metamode) { if (metamode->cpl_str) { free(metamode->cpl_str); metamode->cpl_str = NULL; } if (metamode->x_str) { XFree(metamode->x_str); metamode->x_str = NULL; } metamode->x_str_entry = NULL; } /** screen_remove_metamodes() **************************************** * * Removes all metamodes currently referenced by this screen, also * freeing any memory used. * **/ static void screen_remove_metamodes(nvScreenPtr screen) { nvDisplayPtr display; nvMetaModePtr metamode; if (!screen) return; /* Remove the modes from this screen's displays */ for (display = screen->displays; display; display = display->next_in_screen) { display_remove_modes(display); } /* Clear the screen's metamode list */ while (screen->metamodes) { metamode = screen->metamodes; screen->metamodes = metamode->next; cleanup_metamode(metamode); free(metamode); } screen->num_metamodes = 0; screen->cur_metamode = NULL; screen->cur_metamode_idx = -1; } /* screen_remove_metamodes() */ /** mode_strtok() *************************************************** * * Special strtok function for parsing modes. This function ignores * anything between curly braces, including commas when parsing tokens * delimited by commas. * **/ static char *mode_strtok(char *str) { static char *intStr = NULL; char *start; if (str) { intStr = str; } if (!intStr || *intStr == '\0') { return NULL; } /* Mark off the next token value */ start = intStr; while (*intStr != '\0') { if (*intStr == '{') { while (*intStr != '}' && *intStr != '\0') { intStr++; } } if (*intStr == ',') { *intStr = '\0'; intStr++; break; } intStr++; } return start; } /** screen_add_metamode() ******************************************** * * Parses a metamode string and adds the appropriate modes to the * screen's display devices (at the end of the list) * **/ static Bool screen_add_metamode(nvScreenPtr screen, const char *metamode_str, gchar **err_str) { char *mode_str_itr; const char *tokens_end; const char *metamode_modes; nvMetaModePtr metamode = NULL; int mode_count = 0; if (!screen || !metamode_str) { goto fail; } metamode = (nvMetaModePtr)calloc(1, sizeof(nvMetaMode)); if (!metamode) goto fail; /* Read the MetaMode ID (along with any metamode tokens) */ tokens_end = strstr(metamode_str, "::"); if (tokens_end) { char *tokens = strdup(metamode_str); if (!tokens) goto fail; tokens[tokens_end-metamode_str] = '\0'; parse_token_value_pairs(tokens, apply_metamode_token, (void *)metamode); free(tokens); metamode_modes = tokens_end + 2; } else { /* No tokens? Try the old "ID: METAMODE_STR" syntax */ metamode_modes = parse_read_integer(metamode_str, &(metamode->id)); metamode->source = METAMODE_SOURCE_NVCONTROL; if (*metamode_modes == ':') { metamode_modes++; } } metamode_modes = parse_skip_whitespace(metamode_modes); if (strcmp(metamode_modes, "NULL")) { /* Process each mode in the metamode string */ char *metamode_copy = strdup(metamode_modes); if (!metamode_copy) goto fail; for (mode_str_itr = mode_strtok(metamode_copy); mode_str_itr; mode_str_itr = mode_strtok(NULL)) { nvModePtr mode; nvDisplayPtr display; unsigned int display_id; const char *orig_mode_str = parse_skip_whitespace(mode_str_itr); const char *mode_str; /* Parse the display device (NV-CONTROL target) id from the name */ mode_str = parse_read_display_id(mode_str_itr, &display_id); if (!mode_str) { nv_warning_msg("Failed to read a display device name on screen " "%d while parsing metamode:\n\n'%s'", screen->scrnum, orig_mode_str); continue; } /* Match device id to an existing display */ display = layout_get_display(screen->layout, display_id); if (!display) { nv_warning_msg("Failed to find display device %d on screen %d " "while parsing metamode:\n\n'%s'", display_id, screen->scrnum, orig_mode_str); continue; } /* Parse the mode */ mode = mode_parse(display, mode_str); if (!mode) { nv_warning_msg("Failed to parse mode '%s'\non screen %d\n" "from metamode:\n\n'%s'", mode_str, screen->scrnum, orig_mode_str); continue; } /* Make the mode part of the metamode */ mode->metamode = metamode; /* On older X driver NV_CTRL_BINARY_DATA_DISPLAYS_ASSIGNED_TO_XSCREEN * attribute is Not Available so we are unable to link displays to * the screen implicitly. * To avoid display->cur_mode = NULL link displays explicitly. */ screen_link_display(screen, display); /* Make sure each display has the right number of (NULL) modes */ screen_check_metamodes(screen); /* Add the mode at the end of the display's mode list */ xconfigAddListItem((GenericListPtr *)(&display->modes), (GenericListPtr)mode); display->num_modes++; mode_count++; } free(metamode_copy); /* Make sure something was added */ if (mode_count == 0) { nv_warning_msg("Failed to find any display on screen %d\n" "while parsing metamode:\n\n'%s'", screen->scrnum, metamode_str); goto fail; } } /* Add the metamode to the end of the screen's metamode list */ xconfigAddListItem((GenericListPtr *)(&screen->metamodes), (GenericListPtr)metamode); return TRUE; fail: /* Cleanup */ if (metamode) { free(metamode); } return FALSE; } /* screen_add_metamode() */ /** screen_check_metamodes() ***************************************** * * Makes sure all displays associated with the screen have the right * number of mode entries. * **/ static Bool screen_check_metamodes(nvScreenPtr screen) { nvDisplayPtr display; nvMetaModePtr metamode; nvModePtr mode; nvModePtr last_mode = NULL; for (display = screen->displays; display; display = display->next_in_screen) { if (display->num_modes == screen->num_metamodes) continue; mode = display->modes; metamode = screen->metamodes; while (mode && metamode) { mode = mode->next; metamode = metamode->next; if (mode) { last_mode = mode; } } /* Each display must have as many modes as its screen has metamodes */ while (metamode) { /* Create a dummy mode */ mode = mode_parse(display, "NULL"); mode->dummy = 1; mode->metamode = metamode; /* Duplicate position information of the last mode */ if (last_mode) { mode->pan.x = last_mode->pan.x; mode->pan.y = last_mode->pan.y; mode->position_type = last_mode->position_type; mode->relative_to = last_mode->relative_to; } /* Add the mode at the end of display's mode list */ xconfigAddListItem((GenericListPtr *)(&display->modes), (GenericListPtr)mode); display->num_modes++; metamode = metamode->next; } /* XXX Shouldn't need to remove extra modes. while (mode) { } */ } return TRUE; } /* screen_check_metamodes() */ /** screen_assign_dummy_metamode_positions() ************************* * * Assign the initial (top left) position of dummy modes to * match the top left of the first non-dummy mode * **/ static void screen_assign_dummy_metamode_positions(nvScreenPtr screen) { nvDisplayPtr display; nvModePtr ok_mode; nvModePtr mode; for (display = screen->displays; display; display = display->next_in_screen) { /* Get the first non-dummy mode */ for (ok_mode = display->modes; ok_mode; ok_mode = ok_mode->next) { if (!ok_mode->dummy) break; } if (ok_mode) { for (mode = display->modes; mode; mode = mode->next) { if (!mode->dummy) continue; mode->pan.x = ok_mode->pan.x; mode->pan.y = ok_mode->pan.y; } } } } /* screen_assign_dummy_metamode_positions() */ /** screen_add_metamodes() ******************************************* * * Adds all the appropriate modes on all display devices of this * screen by parsing all the metamode strings. * **/ static Bool screen_add_metamodes(nvScreenPtr screen, gchar **err_str) { nvDisplayPtr display; char *metamode_strs = NULL; /* Screen's list metamode strings */ char *cur_metamode_str; /* Current metamode */ char *str; /* Temp pointer for parsing */ int len; ReturnStatus ret; int i; /* Get the list of metamodes for the screen */ ret = NvCtrlGetBinaryAttribute(screen->handle, 0, NV_CTRL_BINARY_DATA_METAMODES_VERSION_2, (unsigned char **)&metamode_strs, &len); if (ret != NvCtrlSuccess) { *err_str = g_strdup_printf("Failed to query list of metamodes on\n" "screen %d.", screen->scrnum); nv_error_msg("%s", *err_str); goto fail; } /* Get the current metamode for the screen */ ret = NvCtrlGetStringAttribute(screen->handle, NV_CTRL_STRING_CURRENT_METAMODE_VERSION_2, &cur_metamode_str); if (ret != NvCtrlSuccess) { *err_str = g_strdup_printf("Failed to query current metamode of\n" "screen %d.", screen->scrnum); nv_error_msg("%s", *err_str); goto fail; } /* Remove any existing modes on all displays */ screen_remove_metamodes(screen); /* Parse each mode in the metamode strings */ for (str = metamode_strs; (str && strlen(str)); str += strlen(str) +1) { /* Add the individual metamodes to the screen, * This populates the display device's mode list. */ if (!screen_add_metamode(screen, str, err_str)) { nv_warning_msg("Failed to add metamode '%s' to screen %d.", str, screen->scrnum); continue; } /* Keep track of the current metamode */ if (!strcmp(str, cur_metamode_str)) { screen->cur_metamode_idx = screen->num_metamodes; } /* Keep count of the metamode */ screen->num_metamodes++; /* Make sure each display device gets a mode */ screen_check_metamodes(screen); } XFree(metamode_strs); metamode_strs = NULL; if (!screen->metamodes) { nv_warning_msg("Failed to add any metamode to screen %d.", screen->scrnum); goto fail; } /* Assign the top left position of dummy modes */ screen_assign_dummy_metamode_positions(screen); /* Make the screen point at the current metamode */ screen->cur_metamode = screen->metamodes; for (i = 0; i < screen->cur_metamode_idx; i++) { screen->cur_metamode = screen->cur_metamode->next; } /* Make each display within the screen point to the current mode */ for (display = screen->displays; display; display = display->next_in_screen) { display->cur_mode = display->modes; for (i = 0; i < screen->cur_metamode_idx; i++) { display->cur_mode = display->cur_mode->next; } } return TRUE; /* Failure case */ fail: /* Remove modes we may have added */ screen_remove_metamodes(screen); XFree(metamode_strs); return FALSE; } /* screen_add_metamodes() */ /** screen_free() **************************************************** * * Frees memory used by a screen structure * **/ static void screen_free(nvScreenPtr screen) { if (screen) { screen_remove_metamodes(screen); screen_remove_displays(screen); if (screen->handle) { NvCtrlAttributeClose(screen->handle); } nvfree(screen->gpus); screen->num_gpus = 0; XFree(screen->sli_mode); XFree(screen->multigpu_mode); free(screen); } } /* screen_free() */ /** link_screen_to_gpu() ********************************************* * * Updates the X screen to track the given GPU as a driver. * **/ void link_screen_to_gpu(nvScreenPtr screen, nvGpuPtr gpu) { screen->num_gpus++; screen->gpus = nvrealloc(screen->gpus, screen->num_gpus * sizeof(nvGpuPtr)); screen->gpus[screen->num_gpus -1] = gpu; /* Consolidate screen's capabilities based on all GPUs involved */ if (screen->num_gpus == 1) { screen->max_width = gpu->max_width; screen->max_height = gpu->max_height; screen->max_displays = gpu->max_displays; screen->allow_depth_30 = gpu->allow_depth_30; screen->display_owner_gpu = gpu; return; } screen->max_width = MIN(screen->max_width, gpu->max_width); screen->max_height = MIN(screen->max_height, gpu->max_height); screen->allow_depth_30 = screen->allow_depth_30 && gpu->allow_depth_30; if (screen->max_displays <= 0) { screen->max_displays = gpu->max_displays; } else if (gpu->max_displays > 0) { screen->max_displays = MIN(screen->max_displays, gpu->max_displays); } /* Set the display owner GPU. */ if (screen->display_owner_gpu_id >= 0) { /* Link to the multi GPU display owner, if it is specified */ if (screen->display_owner_gpu_id == NvCtrlGetTargetId(gpu->handle)) { screen->display_owner_gpu = gpu; } } else if (gpu->multigpu_master_possible && !screen->display_owner_gpu->multigpu_master_possible) { /* Pick the best GPU to be the display owner. This is the first * GPU that can be a multigpu master, or the first linked GPU, * if none of the GPU(s) can be set as master. */ screen->display_owner_gpu = gpu; } } /** screen_has_gpu() ************************************************* * * Returns whether or not the screen is driven by the given GPU. * **/ Bool screen_has_gpu(nvScreenPtr screen, nvGpuPtr gpu) { int i; if (!gpu) { return FALSE; } for (i = 0; i < screen->num_gpus; i++) { if (gpu == screen->gpus[i]) { return TRUE; } } return FALSE; } /*****************************************************************************/ /** GPU FUNCTIONS ************************************************************/ /*****************************************************************************/ /** gpu_remove_and_free_display() ************************************ * * Removes a display from the GPU and frees it. * **/ void gpu_remove_and_free_display(nvDisplayPtr display) { nvGpuPtr gpu; nvScreenPtr screen; if (!display || !display->gpu) return; gpu = display->gpu; screen = display->screen; /* Remove the display from the X screen */ if (screen) { screen_remove_display(display); if (!screen->num_displays) { layout_remove_and_free_screen(screen); } } /* Remove the display from the GPU */ if (gpu->displays == display) { gpu->displays = display->next_on_gpu; } else { nvDisplayPtr cur; for (cur = gpu->displays; cur; cur = cur->next_on_gpu) { if (cur->next_on_gpu == display) { cur->next_on_gpu = display->next_on_gpu; break; } } } gpu->num_displays--; display_free(display); } /* gpu_remove_and_free_display() */ /** gpu_remove_displays() ******************************************** * * Removes all displays from the gpu * **/ static void gpu_remove_displays(nvGpuPtr gpu) { if (!gpu) return; while (gpu->displays) { gpu_remove_and_free_display(gpu->displays); } } /* gpu_remove_displays() */ /** gpu_add_display() ************************************************ * * Adds the display to (the end of) the GPU display list. * **/ static void gpu_add_display(nvGpuPtr gpu, nvDisplayPtr display) { if (!display || !gpu || (display->gpu == gpu)) return; display->gpu = gpu; display->next_on_gpu = NULL; /* Add the display at the end of the GPU's display list */ if (!gpu->displays) { gpu->displays = display; } else { nvDisplayPtr last; for (last = gpu->displays; last; last = last->next_on_gpu) { if (!last->next_on_gpu) { last->next_on_gpu = display; break; } } } gpu->num_displays++; } /* gpu_add_display() */ /** gpu_query_gvo_mode_info() **************************************** * * Adds GVO mode information to the GPU's gvo mode data table at * the given table index. * **/ static Bool gpu_query_gvo_mode_info(nvGpuPtr gpu, int mode_id, int table_idx) { ReturnStatus ret1, ret2; GvoModeData *data; int rate; char *name; if (!gpu || table_idx >= gpu->num_gvo_modes) { return FALSE; } data = &(gpu->gvo_mode_data[table_idx]); ret1 = NvCtrlGetDisplayAttribute(gpu->handle, mode_id, NV_CTRL_GVIO_VIDEO_FORMAT_REFRESH_RATE, &(rate)); ret2 = NvCtrlGetStringDisplayAttribute(gpu->handle, mode_id, NV_CTRL_STRING_GVIO_VIDEO_FORMAT_NAME, &(name)); if ((ret1 == NvCtrlSuccess) && (ret2 == NvCtrlSuccess)) { data->id = mode_id; data->rate = rate; data->name = name; return TRUE; } XFree(name); return FALSE; } /** display_add_name_from_server() *********************************** * * Queries and adds the NV-CONTROL name to the display device. * **/ static const struct DisplayNameInfoRec { int attr; Bool canBeNull; const char *nameDescription; size_t offset; } DisplayNamesTable[] = { { NV_CTRL_STRING_DISPLAY_DEVICE_NAME, FALSE, "Log Name", offsetof(nvDisplay, logName) }, { NV_CTRL_STRING_DISPLAY_NAME_TYPE_BASENAME, FALSE, "Type Base Name", offsetof(nvDisplay, typeBaseName) }, { NV_CTRL_STRING_DISPLAY_NAME_TYPE_ID, FALSE, "Type ID", offsetof(nvDisplay, typeIdName) }, { NV_CTRL_STRING_DISPLAY_NAME_DP_GUID, TRUE, "DP GUID Name", offsetof(nvDisplay, dpGuidName) }, { NV_CTRL_STRING_DISPLAY_NAME_EDID_HASH, TRUE, "EDID Hash Name", offsetof(nvDisplay, edidHashName) }, { NV_CTRL_STRING_DISPLAY_NAME_TARGET_INDEX, FALSE, "Target Index Name", offsetof(nvDisplay, targetIdName) }, { NV_CTRL_STRING_DISPLAY_NAME_RANDR, FALSE, "RandR Name", offsetof(nvDisplay, randrName) }, }; static Bool display_add_name_from_server(nvDisplayPtr display, const struct DisplayNameInfoRec *displayNameInfo, gchar **err_str) { ReturnStatus ret; char *str; ret = NvCtrlGetStringAttribute(display->handle, displayNameInfo->attr, &str); if (ret == NvCtrlSuccess) { *((char **)(((char *)display) + displayNameInfo->offset)) = str; } else if (!displayNameInfo->canBeNull) { *err_str = g_strdup_printf("Failed to query name '%s' of display " "device DPY-%d.", displayNameInfo->nameDescription, NvCtrlGetTargetId(display->handle)); nv_error_msg("%s", *err_str); return FALSE; } return TRUE; } /** gpu_add_display_from_server() ************************************ * * Adds the display with the device id given to the GPU structure. * **/ nvDisplayPtr gpu_add_display_from_server(nvGpuPtr gpu, unsigned int display_id, gchar **err_str) { ReturnStatus ret; nvDisplayPtr display; int i; /* Create the display structure */ display = (nvDisplayPtr)calloc(1, sizeof(nvDisplay)); if (!display) goto fail; /* Make an NV-CONTROL handle to talk to the display */ display->handle = NvCtrlAttributeInit(NvCtrlGetDisplayPtr(gpu->handle), NV_CTRL_TARGET_TYPE_DISPLAY, display_id, NV_CTRL_ATTRIBUTES_NV_CONTROL_SUBSYSTEM); if (!display->handle) { *err_str = g_strdup_printf("Failed to create NV-CONTROL handle for\n" "display %d (on GPU-%d).", display_id, NvCtrlGetTargetId(gpu->handle)); nv_error_msg("%s", *err_str); goto fail; } /* Query the display information */ for (i = 0; i < ARRAY_LEN(DisplayNamesTable); i++) { if (!display_add_name_from_server(display, DisplayNamesTable + i, err_str)) { goto fail; } } /* Query if this display is an SDI display */ ret = NvCtrlGetAttribute(display->handle, NV_CTRL_IS_GVO_DISPLAY, &(display->is_sdi)); if (ret != NvCtrlSuccess) { nv_warning_msg("Failed to query if display device\n" "%d connected to GPU-%d '%s' is an\n" "SDI device.", display_id, NvCtrlGetTargetId(gpu->handle), gpu->name); display->is_sdi = FALSE; } /* Load the SDI mode table so we can report accurate refresh rates. */ if (display->is_sdi && !gpu->gvo_mode_data) { unsigned int valid1 = 0; unsigned int valid2 = 0; unsigned int valid3 = 0; NVCTRLAttributeValidValuesRec valid; ret = NvCtrlGetValidAttributeValues(gpu->handle, NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT, &valid); if ((ret != NvCtrlSuccess) || (valid.type != ATTRIBUTE_TYPE_INT_BITS)) { valid1 = 0; } else { valid1 = valid.u.bits.ints; } ret = NvCtrlGetValidAttributeValues(gpu->handle, NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT2, &valid); if ((ret != NvCtrlSuccess) || (valid.type != ATTRIBUTE_TYPE_INT_BITS)) { valid2 = 0; } else { valid2 = valid.u.bits.ints; } ret = NvCtrlGetValidAttributeValues(gpu->handle, NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT3, &valid); if ((ret != NvCtrlSuccess) || (valid.type != ATTRIBUTE_TYPE_INT_BITS)) { valid3 = 0; } else { valid3 = valid.u.bits.ints; } /* Count the number of valid modes there are */ gpu->num_gvo_modes = count_number_of_bits(valid1); gpu->num_gvo_modes += count_number_of_bits(valid2); gpu->num_gvo_modes += count_number_of_bits(valid3); if (gpu->num_gvo_modes > 0) { gpu->gvo_mode_data = calloc(gpu->num_gvo_modes, sizeof(GvoModeData)); } if (!gpu->gvo_mode_data) { gpu->num_gvo_modes = 0; } else { // Gather all the bits and dump them into the array int idx = 0; // Index into gvo_mode_data. int id = 0; // Mode ID while (valid1) { if (valid1 & 1) { if (gpu_query_gvo_mode_info(gpu, id, idx)) { idx++; } } valid1 >>= 1; id++; } while (valid2) { if (valid2 & 1) { if (gpu_query_gvo_mode_info(gpu, id, idx)) { idx++; } } valid2 >>= 1; id++; } while (valid3) { if (valid3 & 1) { if (gpu_query_gvo_mode_info(gpu, id, idx)) { idx++; } } valid3 >>= 1; id++; } } } /* Query the modelines for the display device */ if (!display_add_modelines_from_server(display, gpu, err_str)) { nv_warning_msg("Failed to add modelines to display device %d " "'%s'\nconnected to GPU-%d '%s'.", display_id, display->logName, NvCtrlGetTargetId(gpu->handle), gpu->name); goto fail; } /* Add the display at the end of gpu's display list */ gpu_add_display(gpu, display); return display; /* Failure case */ fail: display_free(display); return NULL; } /* gpu_add_display_from_server() */ /** gpu_add_displays_from_server() *********************************** * * Adds the display devices connected on the GPU to the GPU structure * **/ static Bool gpu_add_displays_from_server(nvGpuPtr gpu, gchar **err_str) { ReturnStatus ret; int *pData; int len; int i; /* Clean up the GPU list */ gpu_remove_displays(gpu); /* Get list of displays connected to this GPU */ ret = NvCtrlGetBinaryAttribute(gpu->handle, 0, NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU, (unsigned char **)(&pData), &len); if (ret != NvCtrlSuccess) { *err_str = g_strdup_printf("Failed to query list of displays \n" "connected to GPU-%d '%s'.", NvCtrlGetTargetId(gpu->handle), gpu->name); nv_error_msg("%s", *err_str); goto fail; } /* Add each connected display */ for (i = 0; i < pData[0]; i++) { if (!gpu_add_display_from_server(gpu, pData[i+1], err_str)) { nv_warning_msg("Failed to add display device %d to GPU-%d " "'%s'.", pData[i+1], NvCtrlGetTargetId(gpu->handle), gpu->name); XFree(pData); goto fail; } } XFree(pData); return TRUE; fail: gpu_remove_displays(gpu); return FALSE; } /* gpu_add_displays_from_server() */ /** gpu_add_screenless_modes_to_displays() *************************** * * Adds fake modes to display devices that have no screens so we * can show them on the layout page. * **/ Bool gpu_add_screenless_modes_to_displays(nvGpuPtr gpu) { nvDisplayPtr display; nvModePtr mode; for (display = gpu->displays; display; display = display->next_on_gpu) { if (display->screen) continue; if (display->modes) continue; /* Create a fake mode */ mode = (nvModePtr)calloc(1, sizeof(nvMode)); if (!mode) return FALSE; mode->display = display; mode->dummy = 1; mode_set_modeline(mode, NULL /* modeline */, NULL /* viewPortIn */, NULL /* viewPortOut */); /* Add the mode to the display */ display->modes = mode; display->cur_mode = mode; display->num_modes = 1; } return TRUE; } /* gpu_add_screenless_modes_to_displays() */ /** gpu_free() ******************************************************* * * Frees memory used by the gpu. * **/ static void gpu_free(nvGpuPtr gpu) { if (gpu) { gpu_remove_displays(gpu); XFree(gpu->name); XFree(gpu->uuid); XFree(gpu->flags_memory); g_free(gpu->pci_bus_id); free(gpu->gvo_mode_data); if (gpu->handle) { NvCtrlAttributeClose(gpu->handle); } free(gpu); } } /* gpu_free() */ /*****************************************************************************/ /** LAYOUT FUNCTIONS *********************************************************/ /*****************************************************************************/ /** layout_add_gpu() ************************************************* * * Adds a GPU to the (end of the) layout's list of GPUs. * **/ static void layout_add_gpu(nvLayoutPtr layout, nvGpuPtr gpu) { gpu->layout = layout; gpu->next_in_layout = NULL; if (!layout->gpus) { layout->gpus = gpu; } else { nvGpuPtr last; for (last = layout->gpus; last; last = last->next_in_layout) { if (!last->next_in_layout) { last->next_in_layout = gpu; break; } } } layout->num_gpus++; } /* layout_add_gpu() */ /** layout_add_screen() ********************************************** * * Adds a screen to the (end of the) layout's list of screens. * **/ void layout_add_screen(nvLayoutPtr layout, nvScreenPtr screen) { screen->layout = layout; screen->next_in_layout = NULL; if (!layout->screens) { layout->screens = screen; } else { nvScreenPtr last; for (last = layout->screens; last; last = last->next_in_layout) { if (!last->next_in_layout) { last->next_in_layout = screen; break; } } } layout->num_screens++; } /* layout_add_screen() */ /** layout_remove_and_free_screen() ********************************** * * Removes a screen from the layout and frees it. * **/ void layout_remove_and_free_screen(nvScreenPtr screen) { nvLayoutPtr layout = screen->layout; nvScreenPtr other; if (!screen) return; /* Make sure other screens in the layout aren't relative * to this screen */ for (other = layout->screens; other; other = other->next_in_layout) { if (other->relative_to == screen) { other->position_type = CONF_ADJ_ABSOLUTE; other->relative_to = NULL; } } /* Remove the screen from the layout */ if (layout->screens == screen) { layout->screens = screen->next_in_layout; } else { nvScreenPtr cur; for (cur = layout->screens; cur; cur = cur->next_in_layout) { if (cur->next_in_layout == screen) { cur->next_in_layout = screen->next_in_layout; break; } } } layout->num_screens--; screen_free(screen); } /* layout_remove_and_free_screen() */ /** layout_remove_gpus() ********************************************* * * Removes all GPUs from the layout structure. * **/ static void layout_remove_gpus(nvLayoutPtr layout) { nvGpuPtr gpu; if (!layout) return; while (layout->gpus) { gpu = layout->gpus; layout->gpus = gpu->next_in_layout; gpu_free(gpu); } layout->num_gpus = 0; } /* layout_remove_gpus() */ /** layout_add_gpu_from_server() ************************************* * * Adds a GPU to the layout structure. * **/ static Bool layout_add_gpu_from_server(nvLayoutPtr layout, unsigned int gpu_id, gchar **err_str) { ReturnStatus ret; Display *dpy; nvGpuPtr gpu = NULL; unsigned int *pData; int len; int val; /* Create the GPU structure */ gpu = (nvGpuPtr)calloc(1, sizeof(nvGpu)); if (!gpu) goto fail; /* Make an NV-CONTROL handle to talk to the GPU */ dpy = NvCtrlGetDisplayPtr(layout->handle); gpu->layout = layout; gpu->handle = NvCtrlAttributeInit(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu_id, NV_CTRL_ATTRIBUTES_NV_CONTROL_SUBSYSTEM); if (!gpu->handle) { *err_str = g_strdup_printf("Failed to create NV-CONTROL handle for " "GPU-%d.", gpu_id); nv_error_msg("%s", *err_str); goto fail; } gpu->ctk_event = CTK_EVENT(ctk_event_new(gpu->handle)); /* Query the GPU information */ ret = NvCtrlGetStringAttribute(gpu->handle, NV_CTRL_STRING_PRODUCT_NAME, &gpu->name); if (ret != NvCtrlSuccess) { *err_str = g_strdup_printf("Failed to query GPU name of GPU-%d.", gpu_id); nv_error_msg("%s", *err_str); goto fail; } ret = NvCtrlGetStringAttribute(gpu->handle, NV_CTRL_STRING_GPU_UUID, &gpu->uuid); if (ret != NvCtrlSuccess) { nv_warning_msg("Failed to query GPU UUID of GPU-%d '%s'. GPU UUID " "qualifiers will not be used.", gpu_id, gpu->name); gpu->uuid = NULL; } gpu->pci_bus_id = get_bus_id_str(gpu->handle); ret = NvCtrlGetAttribute(gpu->handle, NV_CTRL_MAX_SCREEN_WIDTH, (int *)&(gpu->max_width)); if (ret != NvCtrlSuccess) { *err_str = g_strdup_printf("Failed to query MAX SCREEN WIDTH on " "GPU-%d '%s'.", gpu_id, gpu->name); nv_error_msg("%s", *err_str); goto fail; } ret = NvCtrlGetAttribute(gpu->handle, NV_CTRL_MAX_SCREEN_HEIGHT, (int *)&(gpu->max_height)); if (ret != NvCtrlSuccess) { *err_str = g_strdup_printf("Failed to query MAX SCREEN HEIGHT on " "GPU-%d '%s'.", gpu_id, gpu->name); nv_error_msg("%s", *err_str); goto fail; } ret = NvCtrlGetAttribute(gpu->handle, NV_CTRL_MAX_DISPLAYS, (int *)&(gpu->max_displays)); if (ret != NvCtrlSuccess) { *err_str = g_strdup_printf("Failed to query MAX DISPLAYS on " "GPU-%d '%s'.", gpu_id, gpu->name); nv_error_msg("%s", *err_str); goto fail; } ret = NvCtrlGetAttribute(gpu->handle, NV_CTRL_DEPTH_30_ALLOWED, &(gpu->allow_depth_30)); if (ret != NvCtrlSuccess) { gpu->allow_depth_30 = FALSE; } ret = NvCtrlGetAttribute(gpu->handle, NV_CTRL_MULTIGPU_MASTER_POSSIBLE, &(gpu->multigpu_master_possible)); if (ret != NvCtrlSuccess) { gpu->multigpu_master_possible = FALSE; } ret = NvCtrlGetBinaryAttribute(gpu->handle, 0, NV_CTRL_BINARY_DATA_GPU_FLAGS, (unsigned char **)&pData, &len); if (ret != NvCtrlSuccess) { gpu->num_flags = 0; gpu->flags_memory = NULL; gpu->flags = NULL; } else { gpu->flags_memory = pData; gpu->num_flags = pData[0]; gpu->flags = &pData[1]; } /* Determine available and current Mosaic configuration */ gpu->mosaic_type = MOSAIC_TYPE_UNSUPPORTED; gpu->mosaic_enabled = FALSE; ret = NvCtrlGetAttribute(gpu->handle, NV_CTRL_SLI_MOSAIC_MODE_AVAILABLE, &(val)); if ((ret == NvCtrlSuccess) && (val == NV_CTRL_SLI_MOSAIC_MODE_AVAILABLE_TRUE)) { char *sli_str; gpu->mosaic_type = MOSAIC_TYPE_SLI_MOSAIC; ret = NvCtrlGetStringAttribute(gpu->handle, NV_CTRL_STRING_SLI_MODE, &sli_str); if ((ret == NvCtrlSuccess) && sli_str) { if (!strcasecmp(sli_str, "Mosaic")) { gpu->mosaic_enabled = TRUE; } XFree(sli_str); } } else { NVCTRLAttributeValidValuesRec valid; ret = NvCtrlGetValidAttributeValues(gpu->handle, NV_CTRL_BASE_MOSAIC, &valid); if ((ret == NvCtrlSuccess) && (valid.type == ATTRIBUTE_TYPE_INT_BITS)) { if (valid.u.bits.ints & NV_CTRL_BASE_MOSAIC_FULL) { gpu->mosaic_type = MOSAIC_TYPE_BASE_MOSAIC; } else if (valid.u.bits.ints & NV_CTRL_BASE_MOSAIC_LIMITED) { gpu->mosaic_type = MOSAIC_TYPE_BASE_MOSAIC_LIMITED; } if (gpu->mosaic_type != MOSAIC_TYPE_UNSUPPORTED) { ret = NvCtrlGetAttribute(gpu->handle, NV_CTRL_BASE_MOSAIC, &(val)); if ((ret == NvCtrlSuccess) && (val == NV_CTRL_BASE_MOSAIC_FULL || val == NV_CTRL_BASE_MOSAIC_LIMITED)) { gpu->mosaic_enabled = TRUE; } } } } /* Add the display devices to the GPU */ if (!gpu_add_displays_from_server(gpu, err_str)) { nv_warning_msg("Failed to add displays to GPU-%d '%s'.", gpu_id, gpu->name); goto fail; } /* Add the GPU at the end of the layout's GPU list */ layout_add_gpu(layout, gpu); return TRUE; /* Failure case */ fail: gpu_free(gpu); return FALSE; } /* layout_add_gpu_from_server() */ /** layout_add_gpus_from_server() ************************************ * * Adds the GPUs found on the server to the layout structure. * **/ static int layout_add_gpus_from_server(nvLayoutPtr layout, gchar **err_str) { ReturnStatus ret; int ngpus; int i; /* Clean up the GPU list */ layout_remove_gpus(layout); /* Query the number of GPUs on the server */ ret = NvCtrlQueryTargetCount(layout->handle, NV_CTRL_TARGET_TYPE_GPU, &ngpus); if (ret != NvCtrlSuccess || !ngpus) { *err_str = g_strdup("Failed to query number of GPUs (or no GPUs " "found) in the system."); nv_error_msg("%s", *err_str); goto fail; } /* Add each GPU */ for (i = 0; i < ngpus; i++) { if (!layout_add_gpu_from_server(layout, i, err_str)) { nv_warning_msg("Failed to add GPU-%d to layout.", i); goto fail; } } return layout->num_gpus; /* Failure case */ fail: layout_remove_gpus(layout); return 0; } /* layout_add_gpus_from_server() */ /** layout_remove_screens() ****************************************** * * Removes all X screens from the layout structure. * **/ static void layout_remove_screens(nvLayoutPtr layout) { if (!layout) return; while (layout->screens) { layout_remove_and_free_screen(layout->screens); } } /* layout_remove_screens() */ /** link_screen_to_gpus() ******************************************** * * Finds the GPU(s) driving the screen and tracks the link(s). * **/ static Bool link_screen_to_gpus(nvLayoutPtr layout, nvScreenPtr screen) { Bool status = FALSE; ReturnStatus ret; int *pData = NULL; int len; int i; int scrnum = NvCtrlGetTargetId(screen->handle); /* Link the screen to the display owner GPU. If there is no display owner, * which is the case when SLI Mosaic is configured, link the screen to the * first (multi gpu master possible) GPU we find. */ ret = NvCtrlGetAttribute(screen->handle, NV_CTRL_MULTIGPU_DISPLAY_OWNER, &(screen->display_owner_gpu_id)); if (ret != NvCtrlSuccess) { screen->display_owner_gpu_id = -1; } ret = NvCtrlGetBinaryAttribute(screen->handle, 0, NV_CTRL_BINARY_DATA_GPUS_USED_BY_XSCREEN, (unsigned char **)(&pData), &len); if ((ret != NvCtrlSuccess) || !pData || (pData[0] < 1)) { goto done; } /* Point to all the gpus */ for (i = 0; i < pData[0]; i++) { nvGpuPtr gpu; for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { int gpuid = NvCtrlGetTargetId(gpu->handle); if (gpuid != pData[1+i]) { continue; } link_screen_to_gpu(screen, gpu); } } /* Make sure a display owner was picked */ if (screen->num_gpus <= 0) { nv_error_msg("Failed to link X screen %d to any GPU.", scrnum); goto done; } status = TRUE; done: if (pData) { XFree(pData); } return status; } /** layout_add_screen_from_server() ********************************** * * Adds an X screen to the layout structure. * **/ static Bool layout_add_screen_from_server(nvLayoutPtr layout, unsigned int screen_id, gchar **err_str) { Display *display; nvScreenPtr screen; int val, tmp; ReturnStatus ret; gchar *primary_str = NULL; screen = (nvScreenPtr)calloc(1, sizeof(nvScreen)); if (!screen) goto fail; screen->scrnum = screen_id; /* Make an NV-CONTROL handle to talk to the screen (use the * first gpu's display) */ display = NvCtrlGetDisplayPtr(layout->gpus->handle); screen->handle = NvCtrlAttributeInit(display, NV_CTRL_TARGET_TYPE_X_SCREEN, screen_id, NV_CTRL_ATTRIBUTES_NV_CONTROL_SUBSYSTEM); if (!screen->handle) { *err_str = g_strdup_printf("Failed to create NV-CONTROL handle for\n" "screen %d.", screen_id); nv_error_msg("%s", *err_str); goto fail; } /* Query the current stereo mode */ ret = NvCtrlGetAttribute(screen->handle, NV_CTRL_STEREO, &val); if (ret == NvCtrlSuccess) { screen->stereo_supported = TRUE; screen->stereo = val; } else { screen->stereo_supported = FALSE; } /* Query the current overlay state */ ret = NvCtrlGetAttribute(screen->handle, NV_CTRL_OVERLAY, &val); if (ret == NvCtrlSuccess) { screen->overlay = val; } else { screen->overlay = NV_CTRL_OVERLAY_OFF; } ret = NvCtrlGetAttribute(screen->handle, NV_CTRL_HWOVERLAY, &val); if (ret == NvCtrlSuccess) { screen->hw_overlay = val; } else { screen->hw_overlay = NV_CTRL_HWOVERLAY_FALSE; } /* Query the current UBB state */ ret = NvCtrlGetAttribute(screen->handle, NV_CTRL_UBB, &val); if (ret == NvCtrlSuccess) { screen->ubb = val; } else { screen->ubb = NV_CTRL_UBB_OFF; } /* See if the screen is set to not scanout */ ret = NvCtrlGetAttribute(screen->handle, NV_CTRL_NO_SCANOUT, &val); if (ret != NvCtrlSuccess) { /* Don't make it a fatal error if NV_CTRL_NO_SCANOUT can't be * queried, since some drivers may not support this attribute. */ val = NV_CTRL_NO_SCANOUT_DISABLED; *err_str = g_strdup_printf("Failed to query NoScanout for " "screen %d.", screen_id); nv_warning_msg("%s", *err_str); g_free(*err_str); *err_str = NULL; } screen->no_scanout = (val == NV_CTRL_NO_SCANOUT_ENABLED); /* Link screen to the GPUs driving it */ if (!link_screen_to_gpus(layout, screen)) { *err_str = g_strdup_printf("Failed to find GPU that drives screen %d.", screen_id); nv_warning_msg("%s", *err_str); goto fail; } /* Query SLI status */ ret = NvCtrlGetAttribute(screen->handle, NV_CTRL_SHOW_SLI_VISUAL_INDICATOR, &tmp); screen->sli = (ret == NvCtrlSuccess); /* Query SLI mode */ ret = NvCtrlGetStringAttribute(screen->handle, NV_CTRL_STRING_SLI_MODE, &screen->sli_mode); if (ret != NvCtrlSuccess) { screen->sli_mode = NULL; } /* Query MULTIGPU mode */ ret = NvCtrlGetStringAttribute(screen->handle, NV_CTRL_STRING_MULTIGPU_MODE, &screen->multigpu_mode); if (ret != NvCtrlSuccess) { screen->multigpu_mode = NULL; } /* Listen to NV-CONTROL events on this screen handle */ screen->ctk_event = CTK_EVENT(ctk_event_new(screen->handle)); /* Query the depth of the screen */ screen->depth = NvCtrlGetScreenPlanes(screen->handle); /* Initialize the virtual X screen size */ screen->dim.width = NvCtrlGetScreenWidth(screen->handle); screen->dim.height = NvCtrlGetScreenHeight(screen->handle); /* Add the screen to the layout */ layout_add_screen(layout, screen); /* Link displays to the screen */ screen_link_displays(screen); /* Parse the screen's metamodes (ties displays on the gpu to the screen) */ if (!screen->no_scanout) { if (!screen_add_metamodes(screen, err_str)) { nv_warning_msg("Failed to add metamodes to screen %d.", screen_id); goto fail; } /* Query & parse the screen's primary display */ screen->primaryDisplay = NULL; ret = NvCtrlGetStringAttribute(screen->handle, NV_CTRL_STRING_NVIDIA_XINERAMA_INFO_ORDER, &primary_str); if (ret == NvCtrlSuccess && primary_str) { char *str; /* The TwinView Xinerama Info Order string may be a comma-separated * list of display device names, though we could add full support * for ordering these, just keep track of a single display here. */ str = strchr(primary_str, ','); if (!str) { str = nvstrdup(primary_str); } else { str = nvstrndup(primary_str, str-primary_str); } XFree(primary_str); screen->primaryDisplay = screen_find_named_display(screen, str); nvfree(str); } } return TRUE; fail: if (screen) { if (screen->layout) { layout_remove_and_free_screen(screen); } else { screen_free(screen); } } return FALSE; } /* layout_add_screen_from_server() */ /** layout_add_screens_from_server() ********************************* * * Adds the screens found on the server to the layout structure. * **/ static int layout_add_screens_from_server(nvLayoutPtr layout, gchar **err_str) { ReturnStatus ret; int i, nscreens; layout_remove_screens(layout); ret = NvCtrlQueryTargetCount(layout->handle, NV_CTRL_TARGET_TYPE_X_SCREEN, &nscreens); if (ret != NvCtrlSuccess || !nscreens) { *err_str = g_strdup("Failed to query number of X screens (or no X " "screens found) in the system."); nv_error_msg("%s", *err_str); nscreens = 0; goto fail; } for (i = 0; i < nscreens; i++) { if (!layout_add_screen_from_server(layout, i, err_str)) { nv_warning_msg("Failed to add X screen %d to layout.", i); g_free(*err_str); *err_str = NULL; } } return nscreens; fail: layout_remove_screens(layout); return 0; } /* layout_add_screens_from_server() */ /** layout_add_screenless_modes_to_displays()************************* * * Adds fake modes to display devices that are currently not * associated with an X screen so we can see them on the layout. * **/ static Bool layout_add_screenless_modes_to_displays(nvLayoutPtr layout) { nvGpuPtr gpu; for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { /* Add fake modes to screenless display devices */ if (!gpu_add_screenless_modes_to_displays(gpu)) { nv_warning_msg("Failed to add screenless modes to GPU-%d '%s'.", NvCtrlGetTargetId(gpu->handle), gpu->name); return FALSE; } } return TRUE; } /* layout_add_screenless_modes_to_displays() */ /** layout_free() **************************************************** * * Frees a layout structure. * **/ void layout_free(nvLayoutPtr layout) { if (layout) { layout_remove_gpus(layout); free(layout); } } /* layout_free() */ /** layout_load_from_server() **************************************** * * Loads layout information from the X server. * **/ nvLayoutPtr layout_load_from_server(NvCtrlAttributeHandle *handle, gchar **err_str) { nvLayoutPtr layout = NULL; ReturnStatus ret; int tmp; /* Allocate the layout structure */ layout = (nvLayoutPtr)calloc(1, sizeof(nvLayout)); if (!layout) goto fail; /* Cache the handle for talking to the X server */ layout->handle = handle; /* Is Xinerama enabled? */ ret = NvCtrlGetAttribute(handle, NV_CTRL_XINERAMA, &layout->xinerama_enabled); if (ret != NvCtrlSuccess) { *err_str = g_strdup("Failed to query status of Xinerama."); nv_error_msg("%s", *err_str); goto fail; } /* does the driver know about NV_CTRL_CURRENT_METAMODE_ID? */ ret = NvCtrlGetAttribute(handle, NV_CTRL_CURRENT_METAMODE_ID, &tmp); if (ret != NvCtrlSuccess) { char *displayName = NvCtrlGetDisplayName(handle); *err_str = g_strdup_printf("The NVIDIA X driver on %s is not new\n" "enough to support the nvidia-settings " "Display Configuration page.", displayName ? displayName : "this X server"); free(displayName); nv_warning_msg("%s", *err_str); goto fail; } if (!layout_add_gpus_from_server(layout, err_str)) { nv_warning_msg("Failed to add GPU(s) to layout for display " "configuration page."); goto fail; } if (!layout_add_screens_from_server(layout, err_str)) { nv_warning_msg("Failed to add screens(s) to layout for display " "configuration page."); goto fail; } if (!layout_add_screenless_modes_to_displays(layout)) { nv_warning_msg("Failed to add screenless modes to layout for " "display configuration page."); goto fail; } return layout; /* Failure case */ fail: layout_free(layout); return NULL; } /* layout_load_from_server() */ /** layout_get_a_screen() ******************************************** * * Returns a screen from the layout. if 'preferred_gpu' is set, * screens from that gpu are preferred. The screen with the lowest * number is returned. * **/ nvScreenPtr layout_get_a_screen(nvLayoutPtr layout, nvGpuPtr preferred_gpu) { nvScreenPtr screen = NULL; nvScreenPtr cur; Bool found_preferred_gpu; if (!layout || !layout->screens) return NULL; screen = layout->screens; found_preferred_gpu = screen_has_gpu(screen, preferred_gpu); for (cur = screen->next_in_layout; cur; cur = cur->next_in_layout) { Bool gpu_match = screen_has_gpu(cur, preferred_gpu); /* Pick screens that are driven by the preferred gpu */ if (gpu_match) { if (!found_preferred_gpu) { screen = cur; continue; } } else if (found_preferred_gpu) { continue; } /* Pick lower numbered screens */ if (screen->scrnum > cur->scrnum) { screen = cur; } } return screen; } /* layout_get_a_screen() */ /** layout_get_display() ********************************************* * * Returns the display with the matching display id or NULL if not * found. * **/ nvDisplayPtr layout_get_display(const nvLayoutPtr layout, const unsigned int display_id) { nvGpuPtr gpu; nvDisplayPtr display; for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { for (display = gpu->displays; display; display = display->next_on_gpu) { if (NvCtrlGetTargetId(display->handle) == display_id) { return display; } } } return NULL; } /* layout_get_display() */ /*****************************************************************************/ /** XCONFIG FUNCTIONS ********************************************************/ /*****************************************************************************/ /* * update_banner() - add our banner at the top of the config, but * first we need to remove any lines that already include our prefix * (because presumably they are a banner from an earlier run of * nvidia-settings) * * Code adapted from nvidia-xconfig */ extern const char *pNV_ID; static void update_banner(XConfigPtr config) { static const char *banner = "X configuration file generated by nvidia-settings\n"; static const char *prefix = "# nvidia-settings: "; char *s = config->comment; char *line, *eol, *tmp; /* remove all lines that begin with the prefix */ while (s && (line = strstr(s, prefix))) { eol = strchr(line, '\n'); /* find the end of the line */ if (eol) { eol++; if (*eol == '\0') eol = NULL; } if (line == s) { /* the line with the prefix is at the start */ if (eol) { /* there is more after the prefix line */ tmp = g_strdup(eol); g_free(s); s = tmp; } else { /* the prefix line is the only line */ g_free(s); s = NULL; } } else { /* prefix line is in the middle or end */ *line = '\0'; tmp = g_strconcat(s, eol, NULL); g_free(s); s = tmp; } } /* add our prefix lines at the start of the comment */ config->comment = g_strconcat(prefix, banner, "# ", pNV_ID, "\n", (s ? s : ""), NULL); if (s) g_free(s); } /* update_banner() */ /** save_xconfig_file() ********************************************** * * Saves the X config file text from buf into a file called * filename. If filename already exists, a backup file named * 'filename.backup' is created. * **/ static int save_xconfig_file(SaveXConfDlg *dlg, gchar *filename, char *buf, mode_t mode) { gchar *backup_filename = NULL; FILE *fp = NULL; gchar *err_msg = NULL; struct stat st; int ret = 0; if (!buf || !filename) goto done; /* Backup any existing file */ if ((access(filename, F_OK) == 0)) { /* Verify the file-write permission */ if ((access(filename, W_OK) != 0)) { err_msg = g_strdup_printf("You do not have adequate permission to" " open the existing X configuration file '%s' for writing.", filename); /* Verify the user permissions */ if (stat(filename, &st) == 0) { if ((getuid() != 0) && (st.st_uid == 0) && !(st.st_mode & (S_IWGRP | S_IWOTH))) err_msg = g_strconcat(err_msg, " You must be 'root'" " to modify the file.", NULL); } goto done; } backup_filename = g_strdup_printf("%s.backup", filename); nv_info_msg("", "X configuration file '%s' already exists, " "backing up file as '%s'", filename, backup_filename); /* Delete any existing backup file */ if (access(backup_filename, F_OK) == 0) { if (unlink(backup_filename) != 0) { err_msg = g_strdup_printf("Unable to remove old X config backup " "file '%s'.", backup_filename); goto done; } } /* Make the current x config file the backup */ if (rename(filename, backup_filename)) { err_msg = g_strdup_printf("Unable to create new X config backup " "file '%s'.", backup_filename); goto done; } } /* Write out the X config file */ fp = fopen(filename, "w"); if (!fp) { err_msg = g_strdup_printf("Unable to open X config file '%s' for writing.", filename); goto done; } fprintf(fp, "%s", buf); ret = 1; done: /* Display any errors that might have occurred */ if (err_msg) { ctk_display_error_msg(ctk_get_parent_window(GTK_WIDGET(dlg->parent)), err_msg); g_free(err_msg); } if (fp) fclose(fp); g_free(backup_filename); return ret; } /* save_xconfig_file() */ /** get_non_regular_file_type_description() ************************** * * Returns a string that describes the mode type of a file. * */ static const char *get_non_regular_file_type_description(mode_t mode) { if (S_ISDIR(mode)) { return "directory"; } else if (S_ISCHR(mode)) { return "character device file"; } else if (S_ISBLK(mode)) { return "block device file"; } else if (S_ISFIFO(mode)) { return "FIFO"; } else if (S_ISLNK(mode)) { return "symbolic link"; } else if (S_ISSOCK(mode)) { return "socket"; } else if (!S_ISREG(mode)) { return "non-regular file"; } return NULL; } /* get_non_regular_file_type_description() */ /** update_xconfig_save_buffer() ************************************ * * Updates the "preview" buffer to hold the right contents based on * how the user wants the X config file to be generated (and what is * possible.) * * Also updates the state of the "Merge" checkbox in the case where * the named file can/cannot be parsed as a valid X config file. * */ static void update_xconfig_save_buffer(SaveXConfDlg *dlg) { const gchar *filename; XConfigPtr xconfCur = NULL; XConfigPtr xconfGen = NULL; XConfigError xconfErr; char *tmp_filename; int tmp_fd; struct stat st; void *buf; GtkTextIter buf_start, buf_end; gboolean merge; gboolean merged; gboolean mergeable = FALSE; gchar *err_msg = NULL; /* Get how the user wants to generate the X config file */ merge = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dlg->btn_xconfig_merge)); filename = gtk_entry_get_text(GTK_ENTRY(dlg->txt_xconfig_file)); /* Assume we can save until we find out otherwise */ gtk_dialog_set_response_sensitive(GTK_DIALOG(dlg->dlg_xconfig_save), GTK_RESPONSE_ACCEPT, TRUE); /* Find out if the file is mergable */ if (filename && (stat(filename, &st) == 0)) { const char *non_regular_file_type_description = get_non_regular_file_type_description(st.st_mode); const char *test_filename; /* Make sure this is a regular file */ if (non_regular_file_type_description) { err_msg = g_strdup_printf("Invalid file '%s': File exits but is a " "%s!", filename, non_regular_file_type_description); gtk_widget_set_sensitive(dlg->btn_xconfig_merge, FALSE); gtk_dialog_set_response_sensitive(GTK_DIALOG(dlg->dlg_xconfig_save), GTK_RESPONSE_ACCEPT, FALSE); goto fail; } /* Must be able to open the file */ test_filename = xconfigOpenConfigFile(filename, NULL); if (!test_filename || strcmp(test_filename, filename)) { xconfigCloseConfigFile(); } else { GenerateOptions gop; /* Must be able to parse the file as an X config file */ xconfErr = xconfigReadConfigFile(&xconfCur); xconfigCloseConfigFile(); if ((xconfErr != XCONFIG_RETURN_SUCCESS) || !xconfCur) { /* If we failed to parse the config file, we should not * allow a merge. */ err_msg = g_strdup_printf("Failed to parse existing X " "config file '%s'!", filename); ctk_display_warning_msg (ctk_get_parent_window(GTK_WIDGET(dlg->parent)), err_msg); xconfCur = NULL; } else { /* Sanitize the X config file */ xconfigGenerateLoadDefaultOptions(&gop); xconfigGetXServerInUse(&gop); if (!xconfigSanitizeConfig(xconfCur, NULL, &gop)) { err_msg = g_strdup_printf("Failed to sanitize existing X " "config file '%s'!", filename); ctk_display_warning_msg (ctk_get_parent_window(GTK_WIDGET(dlg->parent)), err_msg); xconfigFreeConfig(&xconfCur); xconfCur = NULL; } else { mergeable = TRUE; } } /* If we're not actually doing a merge, close the file */ if (!merge && xconfCur) { xconfigFreeConfig(&xconfCur); } } } /* If we have to merge but we cannot, prevent user from saving */ if (merge && !xconfCur && !dlg->merge_toggleable) { gtk_dialog_set_response_sensitive(GTK_DIALOG(dlg->dlg_xconfig_save), GTK_RESPONSE_ACCEPT, FALSE); goto fail; } merge = (merge && xconfCur); /* Generate the X config file */ xconfGen = dlg->xconf_gen_func(xconfCur, merge, &merged, dlg->callback_data); if (!xconfGen) { err_msg = g_strdup_printf("Failed to generate X config file!"); goto fail; } /* Update merge status */ g_signal_handlers_block_by_func (G_OBJECT(dlg->btn_xconfig_merge), G_CALLBACK(xconfig_update_buffer), (gpointer) dlg); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(dlg->btn_xconfig_merge), merged); g_signal_handlers_unblock_by_func (G_OBJECT(dlg->btn_xconfig_merge), G_CALLBACK(xconfig_update_buffer), (gpointer) dlg); gtk_widget_set_sensitive(dlg->btn_xconfig_merge, dlg->merge_toggleable && mergeable); /* We're done with the user's X config, so do some cleanup, * but make sure to handle the case where the generation * function modifies the user's X config structure instead * of generating a new one. */ if (xconfGen == xconfCur) { xconfCur = NULL; } else { xconfigFreeConfig(&xconfCur); } /* Update the X config banner */ update_banner(xconfGen); /* Setup the X config file preview buffer by writing to a temp file */ tmp_filename = g_strdup_printf("/tmp/.xconfig.tmp.XXXXXX"); tmp_fd = mkstemp(tmp_filename); if (!tmp_fd) { err_msg = g_strdup_printf("Failed to create temp X config file '%s' " "for display.", tmp_filename); g_free(tmp_filename); goto fail; } xconfigWriteConfigFile(tmp_filename, xconfGen); xconfigFreeConfig(&xconfGen); lseek(tmp_fd, 0, SEEK_SET); fstat(tmp_fd, &st); buf = mmap(0, st.st_size, PROT_READ, MAP_PRIVATE, tmp_fd, 0); /* Clear the GTK buffer */ gtk_text_buffer_get_bounds (GTK_TEXT_BUFFER(dlg->buf_xconfig_save), &buf_start, &buf_end); gtk_text_buffer_delete (GTK_TEXT_BUFFER(dlg->buf_xconfig_save), &buf_start, &buf_end); /* Set the new GTK buffer contents */ gtk_text_buffer_set_text(GTK_TEXT_BUFFER(dlg->buf_xconfig_save), buf, st.st_size); munmap(buf, st.st_size); close(tmp_fd); remove(tmp_filename); g_free(tmp_filename); return; fail: /* Clear the GTK buffer */ gtk_text_buffer_get_bounds (GTK_TEXT_BUFFER(dlg->buf_xconfig_save), &buf_start, &buf_end); gtk_text_buffer_delete (GTK_TEXT_BUFFER(dlg->buf_xconfig_save), &buf_start, &buf_end); if (err_msg) { ctk_display_warning_msg(ctk_get_parent_window(GTK_WIDGET(dlg->parent)), err_msg); g_free(err_msg); } if (xconfGen) { xconfigFreeConfig(&xconfGen); } if (xconfCur) { xconfigFreeConfig(&xconfCur); } return; } /* update_xconfig_save_buffer() */ /** xconfig_preview_clicked() **************************************** * * Called when the user clicks on the "Preview" button of the * X config save dialog. * **/ static void xconfig_preview_clicked(GtkWidget *widget, gpointer user_data) { SaveXConfDlg *dlg = (SaveXConfDlg *)user_data; gboolean show = !GTK_WIDGET_VISIBLE(dlg->box_xconfig_save); if (show) { gtk_widget_show_all(dlg->box_xconfig_save); gtk_window_set_resizable(GTK_WINDOW(dlg->dlg_xconfig_save), TRUE); gtk_widget_set_size_request(dlg->txt_xconfig_save, 450, 350); gtk_button_set_label(GTK_BUTTON(dlg->btn_xconfig_preview), "Hide Preview..."); } else { gtk_widget_hide(dlg->box_xconfig_save); gtk_window_set_resizable(GTK_WINDOW(dlg->dlg_xconfig_save), FALSE); gtk_button_set_label(GTK_BUTTON(dlg->btn_xconfig_preview), "Show Preview..."); } } /* xconfig_preview_clicked() */ /** xconfig_update_buffer() ****************************************** * * Called when the user selects a new X config filename. * **/ static void xconfig_update_buffer(GtkWidget *widget, gpointer user_data) { SaveXConfDlg *dlg = (SaveXConfDlg *)user_data; update_xconfig_save_buffer(dlg); } /* xconfig_update_buffer() */ /** xconfig_file_clicked() ******************************************* * * Called when the user clicks on the "Browse..." button of the * X config save dialog. * **/ static void xconfig_file_clicked(GtkWidget *widget, gpointer user_data) { SaveXConfDlg *dlg = (SaveXConfDlg *)user_data; const gchar *filename = gtk_entry_get_text(GTK_ENTRY(dlg->txt_xconfig_file)); gint result; /* Ask user for a filename */ gtk_window_set_transient_for (GTK_WINDOW(dlg->dlg_xconfig_file), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(dlg->parent)))); gtk_file_selection_set_filename (GTK_FILE_SELECTION(dlg->dlg_xconfig_file), filename); result = gtk_dialog_run(GTK_DIALOG(dlg->dlg_xconfig_file)); gtk_widget_hide(dlg->dlg_xconfig_file); switch (result) { case GTK_RESPONSE_ACCEPT: case GTK_RESPONSE_OK: filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION(dlg->dlg_xconfig_file)); gtk_entry_set_text(GTK_ENTRY(dlg->txt_xconfig_file), filename); update_xconfig_save_buffer(dlg); break; default: return; } } /* xconfig_file_clicked() */ /** run_save_xconfig_dialog() **************************************** * * run_save_xconfig_dialog() - Takes care of running the "Save X * Configuration File" dialog. Generates the X config file by * calling the registered callback and takes care of keeping * track of the requested filename etc. * **/ void run_save_xconfig_dialog(SaveXConfDlg *dlg) { void *buf; GtkTextIter buf_start, buf_end; gchar *filename; const gchar *tmp_filename; struct stat st; gint result; /* Generate the X config file save buffer */ update_xconfig_save_buffer(dlg); /* Show the save dialog */ gtk_window_set_transient_for (GTK_WINDOW(dlg->dlg_xconfig_save), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(dlg->parent)))); gtk_widget_hide(dlg->box_xconfig_save); gtk_window_resize(GTK_WINDOW(dlg->dlg_xconfig_save), 350, 1); gtk_window_set_resizable(GTK_WINDOW(dlg->dlg_xconfig_save), FALSE); gtk_button_set_label(GTK_BUTTON(dlg->btn_xconfig_preview), "Show preview..."); gtk_widget_show(dlg->dlg_xconfig_save); result = gtk_dialog_run(GTK_DIALOG(dlg->dlg_xconfig_save)); gtk_widget_hide(dlg->dlg_xconfig_save); /* Handle user's response */ switch (result) { case GTK_RESPONSE_ACCEPT: /* Get the filename to write to */ tmp_filename = gtk_entry_get_text(GTK_ENTRY(dlg->txt_xconfig_file)); filename = tilde_expansion(tmp_filename); if (!filename) { nv_error_msg("Failed to get X configuration filename!"); break; } /* If the file exists, make sure it is a regular file */ if (stat(filename, &st) == 0) { const char *non_regular_file_type_description = get_non_regular_file_type_description(st.st_mode); if (non_regular_file_type_description) { nv_error_msg("Failed to write X configuration to file '%s': " "File exists but is a %s.", filename, non_regular_file_type_description); break; } } /* Get the buffer to write */ gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(dlg->buf_xconfig_save), &buf_start, &buf_end); buf = (void *) gtk_text_buffer_get_text (GTK_TEXT_BUFFER(dlg->buf_xconfig_save), &buf_start, &buf_end, FALSE); if (!buf) { nv_error_msg("Failed to read X configuration buffer!"); break; } /* Save the X config file */ nv_info_msg("", "Writing X config file '%s'", filename); save_xconfig_file(dlg, filename, (char *)buf, 0644); g_free(buf); g_free(filename); break; case GTK_RESPONSE_REJECT: default: /* do nothing. */ break; } } /* run_save_xconfig_dialog() */ /** create_save_xconfig_dialog() ************************************* * * Creates the "Save X Configuration" button widget * **/ SaveXConfDlg *create_save_xconfig_dialog(GtkWidget *parent, Bool merge_toggleable, generate_xconfig_callback xconf_gen_func, void *callback_data) { SaveXConfDlg *dlg; GtkWidget *hbox; GtkWidget *hbox2; gchar *filename; const char *tmp_filename; dlg = malloc(sizeof(SaveXConfDlg)); if (!dlg) return NULL; dlg->parent = parent; dlg->xconf_gen_func = xconf_gen_func; dlg->merge_toggleable = merge_toggleable; dlg->callback_data = callback_data; /* Setup the default filename */ tmp_filename = xconfigOpenConfigFile(NULL, NULL); if (tmp_filename) { filename = g_strdup(tmp_filename); } else { filename = g_strdup(""); } xconfigCloseConfigFile(); if (!filename) { free(dlg); return NULL; } /* Create the dialog */ dlg->dlg_xconfig_save = gtk_dialog_new_with_buttons ("Save X Configuration", GTK_WINDOW(gtk_widget_get_parent(GTK_WIDGET(parent))), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(dlg->dlg_xconfig_save), GTK_RESPONSE_REJECT); gtk_dialog_set_has_separator(GTK_DIALOG(dlg->dlg_xconfig_save), TRUE); /* Create the preview button */ dlg->btn_xconfig_preview = gtk_button_new(); g_signal_connect(G_OBJECT(dlg->btn_xconfig_preview), "clicked", G_CALLBACK(xconfig_preview_clicked), (gpointer) dlg); /* Create the preview text window & buffer */ dlg->txt_xconfig_save = gtk_text_view_new(); gtk_text_view_set_left_margin (GTK_TEXT_VIEW(dlg->txt_xconfig_save), 5); dlg->buf_xconfig_save = gtk_text_buffer_new(NULL); gtk_text_view_set_buffer(GTK_TEXT_VIEW(dlg->txt_xconfig_save), GTK_TEXT_BUFFER(dlg->buf_xconfig_save)); dlg->scr_xconfig_save = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(dlg->scr_xconfig_save), GTK_SHADOW_IN); /* Create the filename text entry */ dlg->txt_xconfig_file = gtk_entry_new(); gtk_widget_set_size_request(dlg->txt_xconfig_file, 300, -1); gtk_entry_set_text(GTK_ENTRY(dlg->txt_xconfig_file), filename); g_signal_connect(G_OBJECT(dlg->txt_xconfig_file), "activate", G_CALLBACK(xconfig_update_buffer), (gpointer) dlg); /* Create the filename browse button */ dlg->btn_xconfig_file = gtk_button_new_with_label("Browse..."); g_signal_connect(G_OBJECT(dlg->btn_xconfig_file), "clicked", G_CALLBACK(xconfig_file_clicked), (gpointer) dlg); dlg->dlg_xconfig_file = gtk_file_selection_new("Please select the X configuration file"); /* Create the merge checkbox */ dlg->btn_xconfig_merge = gtk_check_button_new_with_label("Merge with existing file."); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dlg->btn_xconfig_merge), TRUE); gtk_widget_set_sensitive(dlg->btn_xconfig_merge, merge_toggleable); g_signal_connect(G_OBJECT(dlg->btn_xconfig_merge), "toggled", G_CALLBACK(xconfig_update_buffer), (gpointer) dlg); /* Pack the preview button */ hbox = gtk_hbox_new(FALSE, 0); hbox2 = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), dlg->btn_xconfig_preview, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg->dlg_xconfig_save)->vbox), hbox, FALSE, FALSE, 5); /* Pack the preview window */ hbox = gtk_hbox_new(TRUE, 0); gtk_container_add(GTK_CONTAINER(dlg->scr_xconfig_save), dlg->txt_xconfig_save); gtk_box_pack_start(GTK_BOX(hbox), dlg->scr_xconfig_save, TRUE, TRUE, 5); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dlg->dlg_xconfig_save)->vbox), hbox, TRUE, TRUE, 0); dlg->box_xconfig_save = hbox; /* Pack the filename text entry and browse button */ hbox = gtk_hbox_new(FALSE, 0); hbox2 = gtk_hbox_new(FALSE, 5); gtk_box_pack_end(GTK_BOX(hbox2), dlg->btn_xconfig_file, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox2), dlg->txt_xconfig_file, TRUE, TRUE, 0); gtk_box_pack_end(GTK_BOX(hbox), hbox2, TRUE, TRUE, 5); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg->dlg_xconfig_save)->vbox), hbox, FALSE, FALSE, 5); /* Pack the merge checkbox */ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg->dlg_xconfig_save)->vbox), dlg->btn_xconfig_merge, FALSE, FALSE, 5); gtk_widget_show_all(GTK_DIALOG(dlg->dlg_xconfig_save)->vbox); return dlg; } /* create_save_xconfig_button() */ nvidia-settings/src/gtk+-2.x/ctkgvo.h0000664000175000017500000000521112236467170017543 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_GVO_H__ #define __CTK_GVO_H__ #include "NvCtrlAttributes.h" #include "ctkconfig.h" #include "ctkevent.h" #include "ctkgvo-banner.h" G_BEGIN_DECLS #define CTK_TYPE_GVO (ctk_gvo_get_type()) #define CTK_GVO(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_GVO, CtkGvo)) #define CTK_GVO_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_GVO, CtkGvoClass)) #define CTK_IS_GVO(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_GVO)) #define CTK_IS_GVO_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_GVO)) #define CTK_GVO_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_GVO, CtkGvoClass)) typedef struct _CtkGvo CtkGvo; typedef struct _CtkGvoClass CtkGvoClass; struct _CtkGvo { GtkVBox parent; NvCtrlAttributeHandle *handle; /* State */ guint valid_output_video_format_mask[3]; /* Widgets */ GtkWidget *banner_box; GtkWidget *banner; GtkWidget *current_resolution_label; GtkWidget *current_state_label; GtkWidget *current_output_video_format_label; GtkWidget *current_output_data_format_label; }; struct _CtkGvoClass { GtkVBoxClass parent_class; }; typedef struct { int format; const char *name; } GvioFormatName; typedef struct { int format; int rate; int width; int height; } GvioFormatDetails; GType ctk_gvo_get_type (void) G_GNUC_CONST; GtkWidget* ctk_gvo_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *); void ctk_gvo_select (GtkWidget *); void ctk_gvo_unselect (GtkWidget *); GtkTextBuffer* ctk_gvo_create_help (GtkTextTagTable *); const char *ctk_gvio_get_video_format_name(const gint format); const char *ctk_gvo_get_data_format_name(const gint format); void ctk_gvo_get_video_format_resolution(const gint format, gint *w, gint *h); G_END_DECLS #endif /* __CTK_GVO_H__*/ nvidia-settings/src/gtk+-2.x/ctkslimm.c0000664000175000017500000016542712236467170020104 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "NvCtrlAttributes.h" #include #include #include #include "msg.h" #include "parse.h" #include "common-utils.h" #include "ctkbanner.h" #include "ctkslimm.h" #include "ctkdisplayconfig-utils.h" #include "ctkhelp.h" #include "ctkutils.h" #include "ctkdropdownmenu.h" /* Static function declarations */ static void setup_display_refresh_dropdown(CtkSLIMM *ctk_object); static void setup_display_resolution_dropdown(CtkSLIMM *ctk_object); static void setup_total_size_label(CtkSLIMM *ctk_object); static void display_refresh_changed(GtkWidget *widget, gpointer user_data); static void display_resolution_changed(GtkWidget *widget, gpointer user_data); static void display_config_changed(GtkWidget *widget, gpointer user_data); static void txt_overlap_activated(GtkWidget *widget, gpointer user_data); static void slimm_checkbox_toggled(GtkWidget *widget, gpointer user_data); static void save_xconfig_button_clicked(GtkWidget *widget, gpointer user_data); static void add_slimm_options(XConfigPtr xconf, gchar *metamode_str); static void remove_slimm_options(XConfigPtr xconf); static nvDisplayPtr find_active_display(nvLayoutPtr layout); static nvDisplayPtr intersect_modelines(nvLayoutPtr layout); static void remove_duplicate_modelines(nvDisplayPtr display); static Bool other_displays_have_modeline(nvLayoutPtr layout, nvDisplayPtr display, nvModeLinePtr modeline); typedef struct GridConfigRec { int rows; int columns; Bool valid; // Is this layout valid } GridConfig; typedef struct DpyLocRec { // Display Location int x; int y; } DpyLoc; /** * The gridConfigs array enumerates the display grid configurations * that are presently supported. * **/ static GridConfig gridConfigs[] = { {4, 4, FALSE}, // rows, columns, valid {5, 3, FALSE}, {3, 5, FALSE}, {3, 4, FALSE}, {4, 3, FALSE}, {3, 3, FALSE}, {2, 8, FALSE}, {8, 2, FALSE}, {2, 7, FALSE}, {7, 2, FALSE}, {2, 6, FALSE}, {6, 2, FALSE}, {2, 5, FALSE}, {5, 2, FALSE}, {1, 16, FALSE}, {16, 1, FALSE}, {1, 15, FALSE}, {15, 1, FALSE}, {1, 14, FALSE}, {14, 1, FALSE}, {1, 13, FALSE}, {13, 1, FALSE}, {1, 12, FALSE}, {12, 1, FALSE}, {1, 11, FALSE}, {11, 1, FALSE}, {1, 10, FALSE}, {10, 1, FALSE}, {1, 9, FALSE}, {9, 1, FALSE}, {2, 2, FALSE}, {2, 3, FALSE}, {2, 4, FALSE}, {3, 1, FALSE}, {3, 2, FALSE}, {1, 3, FALSE}, {2, 1, FALSE}, {1, 2, FALSE}, {4, 1, FALSE}, {1, 4, FALSE}, }; GType ctk_slimm_get_type() { static GType ctk_slimm_type = 0; if (!ctk_slimm_type) { static const GTypeInfo info_ctk_slimm = { sizeof (CtkSLIMMClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkSLIMM), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_slimm_type = g_type_register_static(GTK_TYPE_VBOX, "CtkSLIMM", &info_ctk_slimm, 0); } return ctk_slimm_type; } static void remove_slimm_options(XConfigPtr xconf) { /* Remove SLI Mosaic Option */ xconfigRemoveNamedOption(&xconf->layouts->adjacencies->screen->options, "SLI", NULL); /* Remove MetaMode Option */ xconfigRemoveNamedOption(&xconf->layouts->adjacencies->screen->options, "MetaModes", NULL); } /* get_ith_valid_grid_config() * Returns valid grid configuration from gridConfig list. */ static GridConfig *get_ith_valid_grid_config(int idx) { int i, count = 0; for (i = 0; i < ARRAY_LEN(gridConfigs); i++) { if (!gridConfigs[i].valid) continue; if (count == idx) return &gridConfigs[i]; count++; } return NULL; } /* get_ith_valid_grid_config() */ static void add_slimm_options(XConfigPtr xconf, gchar *metamode_str) { XConfigAdjacencyPtr adj; XConfigScreenPtr screen; /* Make sure there is only one screen specified in the main layout */ adj = xconf->layouts->adjacencies; while (adj->next) { xconfigRemoveListItem((GenericListPtr *)(&adj), (GenericListPtr)adj->next); } /* * Now fix up the screen in the Device section (to prevent failure with * separate x screen config * */ xconf->layouts->adjacencies->screen->device->screen = -1; /* Write out SLI Mosaic Option */ xconfigAddNewOption(&(xconf->layouts->adjacencies->screen->options), "SLI", "Mosaic"); /* Write out MetaMode Option */ xconfigAddNewOption(&(xconf->layouts->adjacencies->screen->options), "MetaModes", metamode_str); /* Remove Virtual size specification */ for (screen = xconf->layouts->adjacencies->screen; screen; screen = screen->next) { if ((screen->displays->virtualX) || (screen->displays->virtualY)) { screen->displays->virtualX = 0; screen->displays->virtualY = 0; } } } static XConfigPtr xconfig_generate(XConfigPtr xconfCur, Bool merge, Bool *merged, void *callback_data) { CtkSLIMM *ctk_object = (CtkSLIMM *)callback_data; CtkDropDownMenu *menu = CTK_DROP_DOWN_MENU(ctk_object->mnu_display_config); gint idx; gint xctr,yctr; gint x_displays,y_displays; gint h_overlap, v_overlap; gchar *metamode_str = NULL; gchar *tmpstr; gint checkbox_state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ctk_object->cbtn_slimm_enable)); /* Make sure we're being asked to merge */ if (!xconfCur || !merge) { *merged = FALSE; return NULL; } if (checkbox_state) { GridConfig *grid_config; /* SLI MM needs to be enabled */ idx = ctk_drop_down_menu_get_current_value(menu); /* Get grid configuration values from index */ grid_config = get_ith_valid_grid_config(idx); if (grid_config) { x_displays = grid_config->columns; y_displays = grid_config->rows; } else { x_displays = y_displays = 0; } h_overlap = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ctk_object->spbtn_hedge_overlap)); v_overlap = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ctk_object->spbtn_vedge_overlap)); for (yctr = 0; yctr < y_displays;yctr++) { for (xctr = 0; xctr < x_displays;xctr++) { tmpstr = g_strdup_printf("%s +%d+%d", ctk_object->cur_modeline->data.identifier, ctk_object->cur_modeline->data.hdisplay * xctr - h_overlap * xctr, ctk_object->cur_modeline->data.vdisplay * yctr - v_overlap * yctr); if (metamode_str) { metamode_str = g_strconcat(metamode_str, ", ", tmpstr, NULL); g_free(tmpstr); } else { metamode_str = tmpstr; } } } add_slimm_options(xconfCur, metamode_str); } else { /* SLI MM needs to be disabled */ remove_slimm_options(xconfCur); } *merged = TRUE; return xconfCur; } static void set_overlap_controls_status(CtkSLIMM *ctk_object) { CtkDropDownMenu *menu; GridConfig *grid_config; gint config_idx, x_displays, y_displays; menu = CTK_DROP_DOWN_MENU(ctk_object->mnu_display_config); config_idx = ctk_drop_down_menu_get_current_value(menu); /* Get grid configuration values from index */ grid_config = get_ith_valid_grid_config(config_idx); if (grid_config) { x_displays = grid_config->columns; y_displays = grid_config->rows; } else { x_displays = y_displays = 0; } gtk_widget_set_sensitive(ctk_object->spbtn_hedge_overlap, x_displays > 1 ? True : False); gtk_widget_set_sensitive(ctk_object->spbtn_vedge_overlap, y_displays > 1 ? True : False); } static Bool compute_screen_size(CtkSLIMM *ctk_object, gint *width, gint *height) { gint config_idx; GridConfig *grid_config; gint x_displays,y_displays; gint h_overlap, v_overlap; CtkDropDownMenu *menu; if (!ctk_object->cur_modeline) { return FALSE; } menu = CTK_DROP_DOWN_MENU(ctk_object->mnu_display_config); config_idx = ctk_drop_down_menu_get_current_value(menu); /* Get grid configuration values from index */ grid_config = get_ith_valid_grid_config(config_idx); if (grid_config) { x_displays = grid_config->columns; y_displays = grid_config->rows; } else { x_displays = y_displays = 0; } h_overlap = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ctk_object->spbtn_hedge_overlap)); v_overlap = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(ctk_object->spbtn_vedge_overlap)); /* Total X Screen Size Calculation */ *width = x_displays * ctk_object->cur_modeline->data.hdisplay - (x_displays - 1) * h_overlap; *height = y_displays * ctk_object->cur_modeline->data.vdisplay - (y_displays - 1) * v_overlap; return TRUE; } static void save_xconfig_button_clicked(GtkWidget *widget, gpointer user_data) { CtkSLIMM *ctk_object = CTK_SLIMM(user_data); gint width, height; Bool error = FALSE; gchar *err_msg = NULL; /* Make sure the screen size is acceptable */ if (!compute_screen_size(ctk_object, &width, &height)) { error = TRUE; err_msg = g_strdup("Unknown screen size!"); } else if ((width > ctk_object->max_screen_width) || (height > ctk_object->max_screen_height)) { error = TRUE; err_msg = g_strdup_printf("The configured X screen size of %dx%d is \n" "too large. The maximum supported size is\n" "%dx%d.", width, height, ctk_object->max_screen_width, ctk_object->max_screen_height); } if (error) { GtkWidget *dlg; GtkWidget *parent; parent = ctk_get_parent_window(GTK_WIDGET(ctk_object)); dlg = gtk_message_dialog_new (GTK_WINDOW(parent), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "%s", err_msg); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); g_free(err_msg); return; } /* Run the save dialog */ run_save_xconfig_dialog(ctk_object->save_xconfig_dlg); } static void txt_overlap_activated(GtkWidget *widget, gpointer user_data) { CtkSLIMM *ctk_object = CTK_SLIMM(user_data); /* Update total size label */ setup_total_size_label(ctk_object); } static void display_config_changed(GtkWidget *widget, gpointer user_data) { CtkSLIMM *ctk_object = CTK_SLIMM(user_data); /* Update total size label */ setup_total_size_label(ctk_object); /* Update the sensitivity of the overlap controls */ set_overlap_controls_status(ctk_object); } static void display_refresh_changed(GtkWidget *widget, gpointer user_data) { CtkSLIMM *ctk_object = CTK_SLIMM(user_data); CtkDropDownMenu *menu = CTK_DROP_DOWN_MENU(widget); gint idx; /* Get the modeline and display to set */ idx = ctk_drop_down_menu_get_current_value(menu); /* Select the new modeline as current modeline */ ctk_object->cur_modeline = ctk_object->refresh_table[idx]; } static void display_resolution_changed(GtkWidget *widget, gpointer user_data) { CtkSLIMM *ctk_object = CTK_SLIMM(user_data); CtkDropDownMenu *menu = CTK_DROP_DOWN_MENU(widget); gint idx; nvModeLinePtr modeline; /* Get the modeline and display to set */ idx = ctk_drop_down_menu_get_current_value(menu); modeline = ctk_object->resolution_table[idx]; /* Ignore selecting same resolution */ if (ctk_object->cur_modeline == modeline || (ctk_object->cur_modeline && modeline && ctk_object->cur_modeline->data.hdisplay == modeline->data.hdisplay && ctk_object->cur_modeline->data.vdisplay == modeline->data.vdisplay)) { return; } /* Select the new modeline as current modeline */ ctk_object->cur_modeline = modeline; /* Adjust H and V overlap maximums and redraw total size label */ gtk_spin_button_set_range(GTK_SPIN_BUTTON(ctk_object->spbtn_hedge_overlap), -modeline->data.hdisplay, modeline->data.hdisplay); gtk_spin_button_set_range(GTK_SPIN_BUTTON(ctk_object->spbtn_vedge_overlap), -modeline->data.vdisplay, modeline->data.vdisplay); setup_total_size_label(ctk_object); /* Regenerate the refresh menu */ setup_display_refresh_dropdown(ctk_object); } static void slimm_checkbox_toggled(GtkWidget *widget, gpointer user_data) { CtkSLIMM *ctk_object = CTK_SLIMM(user_data); gint enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); if (enabled) { if (ctk_object->mnu_refresh_disabled) { ctk_object->mnu_refresh_disabled = False; gtk_widget_set_sensitive(ctk_object->mnu_display_refresh, True); } gtk_widget_set_sensitive(ctk_object->mnu_display_resolution, True); gtk_widget_set_sensitive(ctk_object->mnu_display_config, True); gtk_widget_set_sensitive(ctk_object->box_total_size, True); set_overlap_controls_status(ctk_object); } else { if (GTK_WIDGET_SENSITIVE(ctk_object->mnu_display_refresh)) { ctk_object->mnu_refresh_disabled = True; gtk_widget_set_sensitive(ctk_object->mnu_display_refresh, False); } gtk_widget_set_sensitive(ctk_object->mnu_display_resolution, False); gtk_widget_set_sensitive(ctk_object->mnu_display_config, False); gtk_widget_set_sensitive(ctk_object->spbtn_hedge_overlap, False); gtk_widget_set_sensitive(ctk_object->spbtn_vedge_overlap, False); gtk_widget_set_sensitive(ctk_object->box_total_size, False); } } /** setup_total_size_label() ********************************* * * Generates and sets the label showing total X Screen size of all displays * combined. * **/ static void setup_total_size_label(CtkSLIMM *ctk_object) { gint width, height; gchar *xscreen_size; if (!compute_screen_size(ctk_object, &width, &height)) { return; } xscreen_size = g_strdup_printf("%d x %d", width, height); gtk_label_set_text(GTK_LABEL(ctk_object->lbl_total_size), xscreen_size); g_free(xscreen_size); } /** setup_display_refresh_dropdown() ********************************* * * Generates the refresh rate dropdown based on the currently selected * display. * **/ static void setup_display_refresh_dropdown(CtkSLIMM *ctk_object) { CtkDropDownMenu *menu; nvModeLinePtr modeline; float cur_rate; /* Refresh Rate */ int cur_idx = 0; /* Currently selected modeline */ gchar *name; /* Modeline's label for the dropdown menu */ /* Get selection information */ if (!ctk_object->cur_modeline) { goto fail; } cur_rate = ctk_object->cur_modeline->refresh_rate; /* Create the menu index -> modeline pointer lookup table */ if (ctk_object->refresh_table) { free(ctk_object->refresh_table); ctk_object->refresh_table_len = 0; } ctk_object->refresh_table = calloc(ctk_object->num_modelines, sizeof(nvModeLinePtr)); if (!ctk_object->refresh_table) { goto fail; } /* Generate the refresh dropdown */ menu = CTK_DROP_DOWN_MENU(ctk_object->mnu_display_refresh); ctk_drop_down_menu_reset(menu); g_signal_handlers_block_by_func (G_OBJECT(ctk_object->mnu_display_refresh), G_CALLBACK(display_refresh_changed), (gpointer) ctk_object); /* Generate the refresh rate dropdown from the modelines list */ for (modeline = ctk_object->modelines; modeline; modeline = modeline->next) { float modeline_rate; nvModeLinePtr m; int count_ref; /* # modelines with similar refresh rates */ int num_ref; /* Modeline # in a group of similar refresh rates */ gchar *extra = NULL; gchar *tmp; /* Ignore modelines of different resolution */ if (modeline->data.hdisplay != ctk_object->cur_modeline->data.hdisplay || modeline->data.vdisplay != ctk_object->cur_modeline->data.vdisplay) { continue; } modeline_rate = modeline->refresh_rate; name = g_strdup_printf("%.0f Hz", modeline_rate); /* Get a unique number for this modeline */ count_ref = 0; /* # modelines with similar refresh rates */ num_ref = 0; /* Modeline # in a group of similar refresh rates */ for (m = ctk_object->modelines; m; m = m->next) { float m_rate = m->refresh_rate; gchar *tmp = g_strdup_printf("%.0f Hz", m_rate); if (m->data.hdisplay == modeline->data.hdisplay && m->data.vdisplay == modeline->data.vdisplay && !g_ascii_strcasecmp(tmp, name)) { count_ref++; /* Modelines with similar refresh rates get a unique # (num_ref) */ if (m == modeline) { num_ref = count_ref; /* This modeline's # */ } } g_free(tmp); } if (num_ref > 1) { continue; } /* Add "DoubleScan" and "Interlace" information */ if (modeline->data.flags & V_DBLSCAN) { extra = g_strdup_printf("DoubleScan"); } if (modeline->data.flags & V_INTERLACE) { if (extra) { tmp = g_strdup_printf("%s, Interlace", extra); g_free(extra); extra = tmp; } else { extra = g_strdup_printf("Interlace"); } } if (extra) { tmp = g_strdup_printf("%s (%s)", name, extra); g_free(extra); g_free(name); name = tmp; } /* Keep track of the selected modeline */ if (ctk_object->cur_modeline == modeline) { cur_idx = ctk_object->refresh_table_len; /* Find a close match to the selected modeline */ } else if (ctk_object->refresh_table_len && ctk_object->refresh_table[cur_idx] != ctk_object->cur_modeline) { /* Resolution must match */ if (modeline->data.hdisplay == ctk_object->cur_modeline->data.hdisplay && modeline->data.vdisplay == ctk_object->cur_modeline->data.vdisplay) { float prev_rate = ctk_object->refresh_table[cur_idx]->refresh_rate; float rate = modeline->refresh_rate; /* Found better resolution */ if (ctk_object->refresh_table[cur_idx]->data.hdisplay != ctk_object->cur_modeline->data.hdisplay || ctk_object->refresh_table[cur_idx]->data.vdisplay != ctk_object->cur_modeline->data.vdisplay) { cur_idx = ctk_object->refresh_table_len; } /* Found a better refresh rate */ if (rate == cur_rate && prev_rate != cur_rate) { cur_idx = ctk_object->refresh_table_len; } } } /* Add the modeline entry to the dropdown */ ctk_drop_down_menu_append_item(menu, name, ctk_object->refresh_table_len); g_free(name); ctk_object->refresh_table[ctk_object->refresh_table_len++] = modeline; } /* Setup the menu and select the current mode */ ctk_object->cur_modeline = ctk_object->refresh_table[cur_idx]; ctk_drop_down_menu_set_current_value(menu, cur_idx); gtk_widget_set_sensitive(ctk_object->mnu_display_refresh, True); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object->mnu_display_refresh), G_CALLBACK(display_refresh_changed), (gpointer) ctk_object); return; /* Handle failures */ fail: gtk_widget_set_sensitive(ctk_object->mnu_display_refresh, False); } /* setup_display_refresh_dropdown() */ /** setup_display_resolution_dropdown() ****************************** * * Generates the resolution dropdown based on the currently selected * display. * **/ static void setup_display_resolution_dropdown(CtkSLIMM *ctk_object) { CtkDropDownMenu *menu; nvModeLinePtr modeline; nvModeLinePtr cur_modeline = ctk_object->cur_modeline; int cur_idx = 0; /* Currently selected modeline (resolution) */ /* Create the modeline lookup table for the dropdown */ if (ctk_object->resolution_table) { free(ctk_object->resolution_table); ctk_object->resolution_table_len = 0; } ctk_object->resolution_table = calloc((ctk_object->num_modelines + 1), sizeof(nvModeLinePtr)); if (!ctk_object->resolution_table) { goto fail; } /* Start the menu generation */ menu = CTK_DROP_DOWN_MENU(ctk_object->mnu_display_resolution); modeline = ctk_object->modelines; cur_idx = 0; g_signal_handlers_block_by_func (G_OBJECT(ctk_object->mnu_display_resolution), G_CALLBACK(display_resolution_changed), (gpointer) ctk_object); /* Generate the resolution menu */ while (modeline) { nvModeLinePtr m; gchar *name; /* Find the first resolution that matches the current res W & H */ m = ctk_object->modelines; while (m != modeline) { if (modeline->data.hdisplay == m->data.hdisplay && modeline->data.vdisplay == m->data.vdisplay) { break; } m = m->next; } /* Add resolution if it is the first of its kind */ if (m == modeline) { /* Set the current modeline idx if not already set by default */ if (cur_modeline) { if (!IS_NVIDIA_DEFAULT_MODE(cur_modeline) && cur_modeline->data.hdisplay == modeline->data.hdisplay && cur_modeline->data.vdisplay == modeline->data.vdisplay) { cur_idx = ctk_object->resolution_table_len; } } name = g_strdup_printf("%dx%d", modeline->data.hdisplay, modeline->data.vdisplay); ctk_drop_down_menu_append_item(menu, name, ctk_object->resolution_table_len); g_free(name); ctk_object->resolution_table[ctk_object->resolution_table_len++] = modeline; } modeline = modeline->next; } /* Setup the menu and select the current mode */ ctk_drop_down_menu_set_current_value(menu, cur_idx); /* If dropdown has only one item, disable menu selection */ if (ctk_object->resolution_table_len > 1) { gtk_widget_set_sensitive(ctk_object->mnu_display_resolution, True); } else { gtk_widget_set_sensitive(ctk_object->mnu_display_resolution, False); } g_signal_handlers_unblock_by_func (G_OBJECT(ctk_object->mnu_display_resolution), G_CALLBACK(display_resolution_changed), (gpointer) ctk_object); return; /* Handle failures */ fail: gtk_widget_set_sensitive(ctk_object->mnu_display_resolution, False); } /* setup_display_resolution_dropdown() */ // Adds the value to the array if it does not already exist static Bool add_array_value(int array[][2], int max_len, int *cur_len, int val) { int i; /* Find the value */ for (i = 0; i < *cur_len; i++) { if (array[i][0] == val) { array[i][1]++; return TRUE; } } /* Add the value */ if (*cur_len < max_len) { array[*cur_len][0] = val; array[*cur_len][1] = 1; (*cur_len)++; return TRUE; } /* Value not found and array is full */ return FALSE; } static Bool parse_slimm_layout(CtkSLIMM *ctk_slimm, nvLayoutPtr layout, int *hoverlap, int *voverlap, int *grid_config_id) { ReturnStatus ret; char *metamode_str = NULL; char *str; const char *mode_str; const char *tmp; char *mode_name = NULL; gchar *err_msg = NULL; static DpyLoc *locs = NULL; // Location of displays static int max_locs = 0; // Maximum number of supported displays basically static int max_rows = 0; static int max_cols = 0; int loc_idx; int num_locs; int rows; int cols; int found; nvModeLinePtr *cur_modeline; // Used to assign the current modeline nvDisplayPtr display = find_active_display(layout); if (display == NULL) { err_msg = "Active display not found."; goto fail; } /* Point at the display's current modeline so we can patch it */ cur_modeline = &(display->cur_mode->modeline); *cur_modeline = NULL; /* Make space for the display location array */ if (!locs) { for (loc_idx = 0; loc_idx < ARRAY_LEN(gridConfigs); loc_idx++ ) { if ( max_rows < gridConfigs[loc_idx].rows) { max_rows = gridConfigs[loc_idx].rows; } if ( max_cols < gridConfigs[loc_idx].columns) { max_cols = gridConfigs[loc_idx].columns; } if (max_locs < (gridConfigs[loc_idx].rows * gridConfigs[loc_idx].columns)) { max_locs = gridConfigs[loc_idx].rows * gridConfigs[loc_idx].columns; } } locs = malloc(max_locs * sizeof(DpyLoc)); if (!locs) { err_msg = "Out of memory."; goto fail; } } /* Get the current metamode string */ ret = NvCtrlGetStringAttribute(ctk_slimm->handle, NV_CTRL_STRING_CURRENT_METAMODE, &metamode_str); if ((ret != NvCtrlSuccess) || !metamode_str) { err_msg = "Error querying current MetaMode."; goto fail; } /* Point to the start of the metamodes, skipping any tokens */ str = strstr(metamode_str, "::"); if (str) { str += 2; } else { str = metamode_str; } /* Parse each metamode */ num_locs = 0; mode_str = strtok(str, ","); while (mode_str) { /* Parse each mode */ mode_str = parse_skip_whitespace(mode_str); /* Skip the display name */ tmp = strstr(mode_str, ":"); if (tmp) tmp++; tmp = parse_skip_whitespace(tmp); /* Read the mode name */ tmp = parse_read_name(tmp, &mode_name, 0); if (!tmp || !mode_name) { err_msg = "Failed to parse mode name from MetaMode."; goto fail; } if (!(*cur_modeline)) { /* Match the mode name to one of the modelines */ *cur_modeline = display->modelines; while (*cur_modeline) { if (!strcmp(mode_name, (*cur_modeline)->data.identifier)) { break; } *cur_modeline = (*cur_modeline)->next; } } else if (strcmp(mode_name, (*cur_modeline)->data.identifier)) { /* Modes don't all have the same mode name */ free(mode_name); err_msg = "MetaMode using mismatched modes."; goto fail; } free(mode_name); /* Read mode for position information */ found = 0; while (*tmp && !found) { if (*tmp == '+') { if (num_locs >= max_locs) { /* Too many displays, not supported */ err_msg = "Too many displays in MetaMode."; goto fail; } tmp++; tmp = parse_read_integer_pair(tmp, 0, &(locs[num_locs].x), &(locs[num_locs].y)); num_locs++; found = 1; } else { tmp++; } /* Catch errors */ if (!tmp) { err_msg = "Failed to parse location information from " "MetaMode."; goto fail; } } /* Assume 0,0 positioning if position info not found */ if (!found) { if (num_locs >= max_locs) { /* Too many displays, not supported */ err_msg = "Too many displays in MetaMode."; goto fail; } tmp++; tmp = parse_read_integer_pair(tmp, 0, &(locs[num_locs].x), &(locs[num_locs].y)); num_locs++; } /* Parse next mode */ mode_str = strtok(NULL, ","); } /* Make sure we were able to find the current modeline */ if ( !(*cur_modeline)) { err_msg = "Unable to identify current resolution and refresh rate."; goto fail; } // Now that we've parsed all the points, count the number of rows/cols. { int row_loc[max_rows][2]; // As position, count int col_loc[max_cols][2]; // As position, count int i; int found; rows = 0; cols = 0; for (loc_idx = 0; loc_idx < num_locs; loc_idx++) { if (!add_array_value(row_loc, max_rows, &rows, locs[loc_idx].y)) { err_msg = "Too many rows."; goto fail; } if (!add_array_value(col_loc, max_cols, &cols, locs[loc_idx].x)) { err_msg = "Too many columns."; goto fail; } } /* Make sure that each row has the same number of columns, * and that each column has the same number of rows */ for (i = 0; i < rows; i++) { if (row_loc[i][1] != cols) { err_msg = "Rows have varying number of columns."; goto fail; } } for (i = 0; i < cols; i++) { if (col_loc[i][1] != rows) { err_msg = "Columns have varying number of rows."; goto fail; } } /* Make sure this is a known/supported grid config */ found = 0; for (i = 0; i < ARRAY_LEN(gridConfigs); i++) { if ((gridConfigs[i].rows == rows) && (gridConfigs[i].columns == cols)) { *grid_config_id = i; found = 1; break; } } if (!found) { err_msg = "Unknown grid configuration."; return FALSE; } /* Calculate row overlap */ *voverlap = 0; found = 0; if (rows > 1) { int loc = row_loc[0][0]; int best_dist = 0; // Best overlap distance for (i = 1; i < rows; i++) { int overlap = (row_loc[i][0] - loc); int dist = (overlap >= 0) ? overlap : -overlap; if (!found || dist < best_dist) { best_dist = dist; *voverlap = overlap; found = 1; } } } if (*voverlap > 0) { *voverlap = (*cur_modeline)->data.vdisplay - *voverlap; } else if (*voverlap < 0) { *voverlap += (*cur_modeline)->data.vdisplay; } /* Calculate column overlap */ *hoverlap = 0; found = 0; if (cols > 1) { int loc = col_loc[0][0]; int best_dist = 0; // Best overlap distance for (i = 1; i < cols; i++) { int overlap = (col_loc[i][0] - loc); int dist = (overlap >= 0) ? overlap : -overlap; if (!found || dist < best_dist) { best_dist = dist; *hoverlap = overlap; found = 1; } } } if (*hoverlap > 0) { *hoverlap = (*cur_modeline)->data.hdisplay - *hoverlap; } else if (*hoverlap < 0) { *hoverlap += (*cur_modeline)->data.hdisplay; } } XFree(metamode_str); return TRUE; fail: *hoverlap = 0; *voverlap = 0; *grid_config_id = 0; if (err_msg) { nv_warning_msg("Unable to determine current SLI Mosaic Mode " "configuration (will fall back to default): %s\n", err_msg); } if (metamode_str) { XFree(metamode_str); } return FALSE; } static void remove_duplicate_modelines(nvDisplayPtr display) { nvModeLinePtr m, nextm; m = display->modelines; if (!m) { return; } /* Remove nvidia-auto-select modeline first */ if (IS_NVIDIA_DEFAULT_MODE(m)) { display->modelines = m->next; if (m == display->cur_mode->modeline) { display->cur_mode->modeline = m->next; } modeline_free(m); display->num_modelines--; } /* Remove duplicate modelines in active display - assuming sorted order*/ for (m = display->modelines; m;) { nextm = m->next; if (!nextm) break; if (modelines_match(m, nextm)) { /* nextm is a duplicate - remove it. */ m->next = nextm->next; if (nextm == display->cur_mode->modeline) { display->cur_mode->modeline = m; } modeline_free(nextm); display->num_modelines--; } else { m = nextm; } } } static Bool other_displays_have_modeline(nvLayoutPtr layout, nvDisplayPtr display, nvModeLinePtr modeline) { nvGpuPtr gpu; nvDisplayPtr d; for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { for (d = gpu->displays; d; d = d->next_on_gpu) { if (display == d) continue; if (d->modelines == NULL) continue; if (!display_has_modeline(d, modeline)) { return FALSE; } } } return TRUE; } static nvDisplayPtr find_active_display(nvLayoutPtr layout) { nvGpuPtr gpu; nvDisplayPtr display; for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { for (display = gpu->displays; display; display = display->next_on_gpu) { if (display->modelines) return display; } } return NULL; } static nvDisplayPtr intersect_modelines(nvLayoutPtr layout) { nvDisplayPtr display; nvModeLinePtr m, prev; /** * * Only need to go through one active display, and eliminate all modelines * in this display that do not exist in other displays (being driven by * this or any other GPU) * */ display = find_active_display(layout); if (display == NULL) return NULL; prev = NULL; m = display->modelines; while (m) { if (!other_displays_have_modeline(layout, display, m)) { if (prev) { /* Remove past beginning */ prev->next = m->next; } else { /* Remove first entry */ display->modelines = m->next; } if (m == display->cur_mode->modeline) { display->cur_mode->modeline = 0; } modeline_free(m); display->num_modelines--; if (prev) { m = prev->next; } else { m = display->modelines; } } else { prev = m; m = m->next; } } remove_duplicate_modelines(display); return display; } #define STEREO_IS_3D_VISION(stereo) \ (((stereo) == NV_CTRL_STEREO_3D_VISION) || \ ((stereo) == NV_CTRL_STEREO_3D_VISION_PRO)) static int get_display_stereo_mode(nvDisplayPtr display) { if ((display->screen == NULL) || (display->screen->stereo_supported == FALSE)) { return NV_CTRL_STEREO_OFF; } else { return display->screen->stereo; } } GtkWidget* ctk_slimm_new(NvCtrlAttributeHandle *handle, CtkEvent *ctk_event, CtkConfig *ctk_config) { GObject *object; CtkSLIMM *ctk_slimm; GtkWidget *label; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *banner; GtkWidget *checkbutton; GtkWidget *hseparator; GtkWidget *table; GtkWidget *button; GtkWidget *spinbutton; CtkSLIMM *ctk_object; CtkDropDownMenu *menu; gchar *err_str = NULL; gchar *str; gchar *tmp; gchar *sli_mode = NULL; ReturnStatus ret; ReturnStatus ret1; int major = 0, minor = 0; gint val; nvLayoutPtr layout; nvDisplayPtr display; int iter; int grid_menu_selected_id; int count; Bool trust_slimm_available = FALSE; int vcs_target_count; int hoverlap = 0; int voverlap = 0; int grid_config_id = 0; /* now, create the object */ object = g_object_new(CTK_TYPE_SLIMM, NULL); ctk_slimm = CTK_SLIMM(object); /* cache the attribute handle */ ctk_slimm->handle = handle; ctk_slimm->ctk_config = ctk_config; ctk_object = ctk_slimm; /* * Check for NV-CONTROL protocol version. * This is used to not trust old X drivers which always reported * it available (on NV50+). */ ret = NvCtrlGetAttribute(handle, NV_CTRL_ATTR_NV_MAJOR_VERSION, &major); ret1 = NvCtrlGetAttribute(handle, NV_CTRL_ATTR_NV_MINOR_VERSION, &minor); if ((ret == NvCtrlSuccess) && (ret1 == NvCtrlSuccess) && ((major > 1) || ((major == 1) && (minor > 23)))) { trust_slimm_available = TRUE; } vcs_target_count = ctk_config->pCtrlHandles->targets[VCS_TARGET].n; /* return on old X drivers if target is other than VCS. */ if (!vcs_target_count && !trust_slimm_available) { return NULL; } /* Check if this screen supports SLI Mosaic Mode */ ret = NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_SLI_MOSAIC_MODE_AVAILABLE, &val); if ((ret == NvCtrlSuccess) && (val == NV_CTRL_SLI_MOSAIC_MODE_AVAILABLE_FALSE)) { /* Mosaic not supported */ return NULL; } /* Query the maximum screen sizes */ ret = NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_MAX_SCREEN_WIDTH, &ctk_slimm->max_screen_width); if (ret != NvCtrlSuccess) { return NULL; } ret = NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_MAX_SCREEN_HEIGHT, &ctk_slimm->max_screen_height); if (ret != NvCtrlSuccess) { return NULL; } /* * Create the display configuration widgets * */ /* Load the layout structure from the X server */ layout = layout_load_from_server(handle, &err_str); if (!err_str && layout) { nvGpuPtr gpu; int num_displays = 0; int min_displays = 0; int i; int num_valid = 0; for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { num_displays += gpu->num_displays; } /* Mark configs that have enough displays as valid */ for (i = 0; i < ARRAY_LEN(gridConfigs); i++) { GridConfig *grid = &(gridConfigs[i]); if (!min_displays || (min_displays > (grid->rows * grid->columns))) { min_displays = grid->rows * grid->columns; } if (num_displays >= (grid->rows * grid->columns)) { grid->valid = TRUE; num_valid++; } } /* Make sure we have enough displays for the minimum config */ if (num_valid <= 0) { err_str = g_strdup_printf("Not enough display devices to " "configure SLI Mosaic Mode.\nYou must " "have at least %d Display%s connected, " "but only %d Display%s detected.", min_displays, (min_displays != 1) ? "s" : "", num_displays, (num_displays != 1) ? "s were" : " was"); layout_free(layout); layout = NULL; } else { parse_slimm_layout(ctk_slimm, layout, &hoverlap, &voverlap, &grid_config_id); } } /* If we failed to load, tell the user why */ if (err_str || !layout) { goto slimm_fail; } display = intersect_modelines(layout); if (display == NULL) { err_str = g_strdup("Unable to find active display with " "intersected modelines."); goto slimm_fail; } else if ((display->modelines == NULL) && (display->cur_mode->modeline == NULL)) { /* The modepool for the active display did not have any modes in * its modepool matching any of the modes on the modepool of any * other display in the layout, causing intersect_modelines to * remove every mode from the list of available modes for SLI mosaic * mode. * * This can happen if one display had its modepool trimmed and modified * to support 3D vision, while other displays (either on X screens * without stereo currently enabled, or on screenless GPUs) did not. * Find if that is the case, and display an informative message if so. */ nvGpuPtr gpu; nvDisplayPtr d; int stereo = get_display_stereo_mode(display); for (gpu = layout->gpus; gpu; gpu = gpu->next_in_layout) { for (d = gpu->displays; d; d = d->next_on_gpu) { int other_stereo; if (display == d) { continue; } other_stereo = get_display_stereo_mode(d); if ((STEREO_IS_3D_VISION(stereo) && !STEREO_IS_3D_VISION(other_stereo)) || (!STEREO_IS_3D_VISION(stereo) && STEREO_IS_3D_VISION(other_stereo))) { err_str = g_strdup("Unable to find common modelines between\n" "all connected displays due to 3D vision\n" "being enabled on some displays and not\n" "others. Please make sure that 3D vision\n" "is enabled on all connected displays\n" "before enabling SLI mosaic mode."); goto slimm_fail; } } } /* The intersected modepool was empty, but not because of a mismatch * in 3D Vision settings. */ err_str = g_strdup("Unable to find find common modelines between " "all connected displays."); goto slimm_fail; } /* Extract modelines and cur_modeline and free layout structure */ ctk_object->modelines = display->modelines; if (display->cur_mode->modeline) { ctk_object->cur_modeline = display->cur_mode->modeline; } else { ctk_object->cur_modeline = ctk_object->modelines; } ctk_object->num_modelines = display->num_modelines; /* XXX Since we've hijacked the layout's modelines, * we can stub out the layout's pointer and free it. */ display->modelines = NULL; display->cur_mode->modeline = NULL; display->num_modelines = 0; layout_free(layout); layout = NULL; /* set container properties of the object */ gtk_box_set_spacing(GTK_BOX(ctk_slimm), 10); /* banner */ banner = ctk_banner_image_new(BANNER_ARTWORK_SLIMM); gtk_box_pack_start(GTK_BOX(ctk_slimm), banner, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(ctk_slimm), vbox, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); checkbutton = gtk_check_button_new_with_label("Use SLI Mosaic Mode"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); ctk_slimm->cbtn_slimm_enable = checkbutton; g_signal_connect(G_OBJECT(checkbutton), "toggled", G_CALLBACK(slimm_checkbox_toggled), (gpointer) ctk_object); gtk_box_pack_start(GTK_BOX(hbox), checkbutton, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new("Display Configuration (rows x columns)"); hseparator = gtk_hseparator_new(); gtk_widget_show(hseparator); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 10); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); /* Option menu for Display Grid Configuration */ menu = (CtkDropDownMenu *) ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO); ctk_slimm->mnu_display_config = GTK_WIDGET(menu); grid_menu_selected_id = 0; count = 0; for (iter = 0; iter < ARRAY_LEN(gridConfigs); iter++) { /* Don't show invalid configs */ if (!gridConfigs[iter].valid) continue; tmp = g_strdup_printf("%d x %d grid", gridConfigs[iter].rows, gridConfigs[iter].columns); ctk_drop_down_menu_append_item(menu, tmp, count); /* Update grid_config_id to set menu history */ if (iter == grid_config_id) { grid_menu_selected_id = count; } count++; } ctk_drop_down_menu_set_current_value(menu, grid_menu_selected_id); g_signal_connect(G_OBJECT(ctk_object->mnu_display_config), "changed", G_CALLBACK(display_config_changed), (gpointer) ctk_object); label = gtk_label_new(""); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(menu), TRUE, TRUE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); table = gtk_table_new(20, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new("Resolution (per display)"); hseparator = gtk_hseparator_new(); gtk_widget_show(hseparator); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, 2, 3, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0.5, 0.5); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new("Refresh Rate"); hseparator = gtk_hseparator_new(); gtk_widget_show(hseparator); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0.5, 0.5); /* Option menu for resolutions */ hbox = gtk_hbox_new(FALSE, 0); ctk_slimm->mnu_display_resolution = ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO); /* Create a drop down menu */ setup_display_resolution_dropdown(ctk_object); label = gtk_label_new(""); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_box_pack_end(GTK_BOX(hbox), ctk_slimm->mnu_display_resolution, TRUE, TRUE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, 3, 4, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0.5, 0.5); g_signal_connect(G_OBJECT(ctk_object->mnu_display_resolution), "changed", G_CALLBACK(display_resolution_changed), (gpointer) ctk_object); /* Option menu for refresh rates */ hbox = gtk_hbox_new(FALSE, 0); ctk_slimm->mnu_display_refresh = ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO); setup_display_refresh_dropdown(ctk_object); g_signal_connect(G_OBJECT(ctk_object->mnu_display_refresh), "changed", G_CALLBACK(display_refresh_changed), (gpointer) ctk_object); label = gtk_label_new(""); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_box_pack_end(GTK_BOX(hbox), ctk_slimm->mnu_display_refresh, TRUE, TRUE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 3, 4, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0.5, 0.5); /* Edge Overlap section */ hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new("Edge Overlap"); hseparator = gtk_hseparator_new(); gtk_widget_show(hseparator); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, 8, 9, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0.5, 0.5); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new("Total Size"); hseparator = gtk_hseparator_new(); gtk_widget_show(hseparator); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 8, 9, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0.5, 0.5); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new("Horizontal:"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10); spinbutton = gtk_spin_button_new_with_range(-ctk_object->cur_modeline->data.hdisplay, ctk_object->cur_modeline->data.hdisplay, 1); ctk_slimm->spbtn_hedge_overlap = spinbutton; gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbutton), hoverlap); g_signal_connect(G_OBJECT(ctk_object->spbtn_hedge_overlap), "value-changed", G_CALLBACK(txt_overlap_activated), (gpointer) ctk_object); gtk_box_pack_start(GTK_BOX(hbox), spinbutton, FALSE, FALSE, 5); label = gtk_label_new("pixels"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, 9, 10, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0.5, 0.5); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new("Vertical: "); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10); spinbutton = gtk_spin_button_new_with_range(-ctk_object->cur_modeline->data.vdisplay, ctk_object->cur_modeline->data.vdisplay, 1); ctk_slimm->spbtn_vedge_overlap = spinbutton; gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbutton), voverlap); g_signal_connect(G_OBJECT(ctk_object->spbtn_vedge_overlap), "value-changed", G_CALLBACK(txt_overlap_activated), (gpointer) ctk_object); gtk_box_pack_start(GTK_BOX(hbox), spinbutton, FALSE, FALSE, 5); label = gtk_label_new("pixels"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, 10, 11, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0.5, 0.5); label = gtk_label_new("NULL"); ctk_slimm->lbl_total_size = label; setup_total_size_label(ctk_slimm); hbox = gtk_hbox_new(FALSE, 0); ctk_slimm->box_total_size = hbox; gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 9, 10, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0.5, 0.5); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new("Maximum Size"); hseparator = gtk_hseparator_new(); gtk_widget_show(hseparator); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 10, 11, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0.5, 0.5); tmp = g_strdup_printf("%dx%d", ctk_slimm->max_screen_width, ctk_slimm->max_screen_height); label = gtk_label_new(tmp); g_free(tmp); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 10); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 11, 12, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0.5, 0.5); label = gtk_label_new("Save to X Configuration File"); hbox = gtk_hbox_new(FALSE, 0); button = gtk_button_new(); ctk_slimm->btn_save_config = button; g_signal_connect(G_OBJECT(ctk_object->btn_save_config), "clicked", G_CALLBACK(save_xconfig_button_clicked), (gpointer) ctk_object); ctk_slimm->save_xconfig_dlg = create_save_xconfig_dialog(GTK_WIDGET(ctk_slimm), FALSE, // Merge toggleable xconfig_generate, (void *)ctk_slimm); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(button), hbox); gtk_table_attach(GTK_TABLE(table), button, 1, 2, 19, 20, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); /* If current SLI Mode != Mosaic, disable UI elements initially */ ret = NvCtrlGetStringAttribute(ctk_slimm->handle, NV_CTRL_STRING_SLI_MODE, &sli_mode); set_overlap_controls_status(ctk_slimm); if ((ret != NvCtrlSuccess) || (ret == NvCtrlSuccess && g_ascii_strcasecmp(sli_mode, "Mosaic"))) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), FALSE); slimm_checkbox_toggled(ctk_slimm->cbtn_slimm_enable, (gpointer) ctk_slimm); } if (sli_mode) { XFree(sli_mode); } gtk_widget_show_all(GTK_WIDGET(object)); return GTK_WIDGET(object); slimm_fail: if (layout) { layout_free(layout); } if (!err_str) { str = g_strdup("Unable to load SLI Mosaic Mode Settings page."); } else { str = g_strdup_printf("Unable to load SLI Mosaic Mode Settings " "page:\n\n%s", err_str); g_free(err_str); } label = gtk_label_new(str); g_free(str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_container_add(GTK_CONTAINER(object), label); /* Show the GUI */ gtk_widget_show_all(GTK_WIDGET(ctk_object)); return GTK_WIDGET(ctk_object); } GtkTextBuffer *ctk_slimm_create_help(GtkTextTagTable *table, const gchar *slimm_name) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "SLI Mosaic Mode Settings Help"); ctk_help_para(b, &i, "This page allows easy configuration " "of SLI Mosaic Mode."); ctk_help_heading(b, &i, "Use SLI Mosaic Mode"); ctk_help_para(b, &i, "This checkbox controls whether SLI Mosaic Mode is enabled " "or disabled."); ctk_help_heading(b, &i, "Display Configuration"); ctk_help_para(b, &i, "This drop down menu allows selection of the display grid " "configuration for SLI Mosaic Mode; the possible configurations " "are described as rows x columns."); ctk_help_heading(b, &i, "Resolution"); ctk_help_para(b, &i, "This drop down menu allows selection of the resolution to " "use for each of the displays in SLI Mosaic Mode. Note that only " "the resolutions that are available for each display will be " "shown here."); ctk_help_heading(b, &i, "Refresh Rate"); ctk_help_para(b, &i, "This drop down menu allows selection of the refresh rate " "to use for each of the displays in SLI Mosaic Mode. By default " "the highest refresh rate each of the displays can achieve at " "the selected resolution is chosen. This combo box gets updated " "when a new resolution is picked."); ctk_help_heading(b, &i, "Edge Overlap"); ctk_help_para(b, &i, "These two controls allow the user to specify the " "Horizontal and Vertical Edge Overlap values. The displays " "will overlap by the specified number of pixels when forming " "the grid configuration. For example, 4 flat panel displays " "forming a 2 x 2 grid in SLI Mosaic Mode with a resolution of " "1600x1200 and a Horizontal and Vertical Edge overlap of 50 " "will generate the following MetaMode: \"1600x1200+0+0," "1600x1200+1550+0,1600x1200+0+1150,1600x1200+1550+1150\"."); ctk_help_heading(b, &i, "Total Size"); ctk_help_para(b, &i, "This is the total size of the X screen formed using all " "displays in SLI Mosaic Mode."); ctk_help_heading(b, &i, "Save to X Configuration File"); ctk_help_para(b, &i, "Clicking this button saves the selected SLI Mosaic Mode " "settings into the X Configuration File."); ctk_help_finish(b); return b; } nvidia-settings/src/gtk+-2.x/ctkgvi.c0000664000175000017500000006333412236467170017542 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2009 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include "msg.h" #include "ctkutils.h" #include "ctkhelp.h" #include "ctkgvo.h" #include "ctkgvi.h" #include "ctkgpu.h" #include "ctkbanner.h" #include "ctkdropdownmenu.h" #define DEFAULT_UPDATE_VIDEO_FORMAT_INFO_TIME_INTERVAL 1000 static gboolean update_sdi_input_info(gpointer); GType ctk_gvi_get_type(void) { static GType ctk_gvi_type = 0; if (!ctk_gvi_type) { static const GTypeInfo ctk_gvi_info = { sizeof (CtkGviClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* constructor */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkGvi), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_gvi_type = g_type_register_static(GTK_TYPE_VBOX, "CtkGvi", &ctk_gvi_info, 0); } return ctk_gvi_type; } /* ctk_gvi_get_type() */ static const GvioFormatName samplingFormatNames[] = { { NV_CTRL_GVI_COMPONENT_SAMPLING_4444, "4:4:4:4"}, { NV_CTRL_GVI_COMPONENT_SAMPLING_4224, "4:2:2:4"}, { NV_CTRL_GVI_COMPONENT_SAMPLING_444, "4:4:4" }, { NV_CTRL_GVI_COMPONENT_SAMPLING_422, "4:2:2" }, { NV_CTRL_GVI_COMPONENT_SAMPLING_420, "4:2:0" }, { -1, NULL }, }; static const GvioFormatName bitFormatNames[] = { { NV_CTRL_GVI_BITS_PER_COMPONENT_8, "8 bpc" }, { NV_CTRL_GVI_BITS_PER_COMPONENT_10, "10 bpc"}, { NV_CTRL_GVI_BITS_PER_COMPONENT_12, "12 bpc"}, { -1, NULL }, }; static const GvioFormatName colorSpaceFormatNames[] = { { NV_CTRL_GVI_COLOR_SPACE_GBR, "GBR" }, { NV_CTRL_GVI_COLOR_SPACE_GBRA, "GBRA" }, { NV_CTRL_GVI_COLOR_SPACE_GBRD, "GBRD" }, { NV_CTRL_GVI_COLOR_SPACE_YCBCR, "YCbCr" }, { NV_CTRL_GVI_COLOR_SPACE_YCBCRA, "YCbCrA"}, { NV_CTRL_GVI_COLOR_SPACE_YCBCRD, "YCbCrD"}, { -1, NULL }, }; extern const GvioFormatName videoFormatNames[]; static gboolean update_sdi_input_info(gpointer user_data); /* * ctk_gvio_get_format_name() - retrun name of format. */ static const char *ctk_gvio_get_format_name(const GvioFormatName *formatTable, const gint format) { int i; for (i = 0; formatTable[i].name; i++) { if (formatTable[i].format == format) { return formatTable[i].name; } } return "Unknown"; } /* * update_sdi_input_info() - Update SDI input information. */ typedef struct { int video_format; int component_sampling; int color_space; int bpc; int link_id; int smpte352_id; } ChannelInfo; static void query_channel_info(CtkGvi *ctk_gvi, int jack, int channel, ChannelInfo *channel_info) { gint ret; unsigned int jack_channel = ((channel & 0xFFFF) << 16); jack_channel |= (jack & 0xFFFF); ret = NvCtrlGetDisplayAttribute(ctk_gvi->handle, jack_channel, NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT, &(channel_info->video_format)); if (ret != NvCtrlSuccess) { channel_info->video_format = NV_CTRL_GVIO_VIDEO_FORMAT_NONE; } ret = NvCtrlGetDisplayAttribute(ctk_gvi->handle, jack_channel, NV_CTRL_GVI_DETECTED_CHANNEL_COMPONENT_SAMPLING, &(channel_info->component_sampling)); if (ret != NvCtrlSuccess) { channel_info->component_sampling = NV_CTRL_GVI_COMPONENT_SAMPLING_UNKNOWN; } ret = NvCtrlGetDisplayAttribute(ctk_gvi->handle, jack_channel, NV_CTRL_GVI_DETECTED_CHANNEL_COLOR_SPACE, &(channel_info->color_space)); if (ret != NvCtrlSuccess) { channel_info->color_space = NV_CTRL_GVI_COLOR_SPACE_UNKNOWN; } ret = NvCtrlGetDisplayAttribute(ctk_gvi->handle, jack_channel, NV_CTRL_GVI_DETECTED_CHANNEL_BITS_PER_COMPONENT, &(channel_info->bpc)); if (ret != NvCtrlSuccess) { channel_info->bpc = NV_CTRL_GVI_BITS_PER_COMPONENT_UNKNOWN; } ret = NvCtrlGetDisplayAttribute(ctk_gvi->handle, jack_channel, NV_CTRL_GVI_DETECTED_CHANNEL_LINK_ID, &(channel_info->link_id)); if (ret != NvCtrlSuccess) { channel_info->link_id = NV_CTRL_GVI_LINK_ID_UNKNOWN; } ret = NvCtrlGetDisplayAttribute(ctk_gvi->handle, jack_channel, NV_CTRL_GVI_DETECTED_CHANNEL_SMPTE352_IDENTIFIER, &(channel_info->smpte352_id)); if (ret != NvCtrlSuccess) { channel_info->smpte352_id = 0x0; } } static void update_sdi_input_info_simple(CtkGvi *ctk_gvi) { GtkBox *vbox = GTK_BOX(ctk_gvi->input_info_vbox); GtkWidget *label; gchar *label_str; gint jack; gint channel; const char *vidfmt_str; GtkWidget *box = NULL; /* If not showing detailed information, * Show single entry for active jack/channel pairs as: * * Jack #, Channel #: VIDEO FORMAT */ for (jack = 0; jack < ctk_gvi->num_jacks; jack++) { ChannelInfo channel_infos[ctk_gvi->max_channels_per_jack]; ChannelInfo *channel_info; int num_active_channels = 0; int show_channel = 0; /* When 0 or 1 active channel detected */ /* Get information for each channel in the jack. */ for (channel = 0; channel < ctk_gvi->max_channels_per_jack; channel++) { channel_info = channel_infos + channel; query_channel_info(ctk_gvi, jack, channel, channel_info); if (channel_info->video_format != NV_CTRL_GVIO_VIDEO_FORMAT_NONE) { show_channel = channel; num_active_channels++; } } /* Populate the info table */ if (num_active_channels > 1) { box = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(vbox, box, FALSE, FALSE, 0); label_str = g_strdup_printf("Jack %d:", jack+1); label = gtk_label_new(label_str); g_free(label_str); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0); } for (channel = 0; channel < ctk_gvi->max_channels_per_jack; channel++) { channel_info = channel_infos + channel; vidfmt_str = ctk_gvio_get_format_name(videoFormatNames, channel_info->video_format); if (num_active_channels <= 1) { if (channel != show_channel) continue; label_str = g_strdup_printf("Jack %d: %s", jack+1, vidfmt_str); label = gtk_label_new(label_str); g_free(label_str); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_box_pack_start(vbox, label, FALSE, FALSE, 0); } else { label_str = g_strdup_printf("Channel %d: %s", channel+1, vidfmt_str); label = gtk_label_new(label_str); g_free(label_str); gtk_misc_set_padding(GTK_MISC(label), 5, 0); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0); } } } } static void jack_channel_changed(GtkWidget *widget, gpointer user_data) { CtkGvi *ctk_gvi = CTK_GVI(user_data); CtkDropDownMenu *menu = CTK_DROP_DOWN_MENU(widget); gint idx; /* Track new selection */ idx = ctk_drop_down_menu_get_current_value(menu); ctk_gvi->cur_jack_channel = ctk_gvi->jack_channel_table[idx]; update_sdi_input_info(ctk_gvi); } static GtkWidget *create_jack_channel_menu(CtkGvi *ctk_gvi) { CtkDropDownMenu *menu; gint idx; gchar *label_str; gint jack; gint channel; unsigned int jack_channel; gint selected_idx = 0; /* Create the menu */ menu = (CtkDropDownMenu *) ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO); /* Just show all jack/channel pairs in dropdown */ idx = 0; for (jack = 0; jack < ctk_gvi->num_jacks; jack++) { for (channel = 0; channel < ctk_gvi->max_channels_per_jack; channel++) { jack_channel = ((channel & 0xFFFF) << 16); jack_channel |= (jack & 0xFFFF); label_str = g_strdup_printf("Jack %d, Channel %d", jack+1, channel+1); ctk_drop_down_menu_append_item(menu, label_str, idx); g_free(label_str); ctk_gvi->jack_channel_table[idx] = jack_channel; if (jack_channel == ctk_gvi->cur_jack_channel) { selected_idx = idx; } idx++; } } ctk_drop_down_menu_set_current_value(menu, selected_idx); g_signal_connect(G_OBJECT(menu), "changed", G_CALLBACK(jack_channel_changed), (gpointer) ctk_gvi); return GTK_WIDGET(menu); } static void update_sdi_input_info_all(CtkGvi *ctk_gvi) { GtkBox *vbox = GTK_BOX(ctk_gvi->input_info_vbox); GtkWidget *box; GtkWidget *label; gchar *label_str; GtkWidget *table; gint jack; gint channel; const char *str; ChannelInfo channel_info; jack = ctk_gvi->cur_jack_channel & 0xFFFF; channel = (ctk_gvi->cur_jack_channel >> 16) & 0xFFFF; query_channel_info(ctk_gvi, jack, channel, &channel_info); box = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), box, FALSE, FALSE, 0); table = gtk_table_new(6, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 5); gtk_table_set_col_spacings(GTK_TABLE(table), 5); gtk_box_pack_start(GTK_BOX(box), table, FALSE, FALSE, 0); /* Show channel's information in table format */ label = gtk_label_new("Video Format:"); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); str = ctk_gvio_get_format_name(videoFormatNames, channel_info.video_format); label_str = g_strdup_printf("%s", str); label = gtk_label_new(label_str); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 0, 1); g_free(label_str); label = gtk_label_new("Component Sampling:"); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); str = ctk_gvio_get_format_name(samplingFormatNames, channel_info.component_sampling); label_str = g_strdup_printf("%s", str); label = gtk_label_new(label_str); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 1, 2); g_free(label_str); label = gtk_label_new("Color Space:"); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3); str = ctk_gvio_get_format_name(colorSpaceFormatNames, channel_info.color_space); label_str = g_strdup_printf("%s", str); label = gtk_label_new(label_str); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 2, 3); g_free(label_str); label = gtk_label_new("Bits Per Component:"); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 3, 4); str = ctk_gvio_get_format_name(bitFormatNames, channel_info.bpc); label_str = g_strdup_printf("%s", str); label = gtk_label_new(label_str); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 3, 4); g_free(label_str); label = gtk_label_new("Link ID:"); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 4, 5); if (channel_info.link_id == NV_CTRL_GVI_LINK_ID_UNKNOWN) { label_str = g_strdup_printf("Unknown"); } else { label_str = g_strdup_printf("%d", channel_info.link_id); } label = gtk_label_new(label_str); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 4, 5); g_free(label_str); label = gtk_label_new("SMPTE 352 Payload Identifier:"); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 5, 6); label_str = g_strdup_printf("0x%08x", (unsigned int) channel_info.smpte352_id); label = gtk_label_new(label_str); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 5, 6); g_free(label_str); } static gboolean update_sdi_input_info(gpointer user_data) { CtkGvi *ctk_gvi = CTK_GVI(user_data); gboolean show_detailed_info; show_detailed_info = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (ctk_gvi->show_detailed_info_btn)); /* Dump out the old list */ ctk_empty_container(ctk_gvi->input_info_vbox); if (!show_detailed_info) { gtk_widget_hide_all(GTK_WIDGET(ctk_gvi->jack_channel_omenu)); update_sdi_input_info_simple(ctk_gvi); } else { gtk_widget_show_all(GTK_WIDGET(ctk_gvi->jack_channel_omenu)); update_sdi_input_info_all(ctk_gvi); } gtk_widget_show_all(ctk_gvi->input_info_vbox); return TRUE; } static void show_detailed_info_button_toggled(GtkWidget *button, gpointer user_data) { CtkGvi *ctk_gvi = CTK_GVI(user_data); gboolean active; active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); if (active) { gtk_button_set_label(GTK_BUTTON(button), "Show Condensed Input Info"); } else { gtk_button_set_label(GTK_BUTTON(button), "Show Detailed Input Info"); } update_sdi_input_info(ctk_gvi); } static gchar* gpu_name_string(gint gpu, CtrlHandles *handle) { gchar *gpu_name; if ((gpu < 0) || (gpu >= handle->targets[GPU_TARGET].n)) { gpu_name = g_strdup_printf("None"); } else { NvCtrlAttributeHandle *gpu_handle = handle->targets[GPU_TARGET].t[gpu].h; gpu_name = create_gpu_name_string(gpu_handle); } return gpu_name; } static void bound_gpu_changed(GtkObject *object, gpointer arg1, gpointer user_data) { CtkGvi *ctk_gvi = (CtkGvi *) user_data; CtkEventStruct *event_struct = (CtkEventStruct *) arg1; gchar *gpu_name; gpu_name = gpu_name_string(event_struct->value, ctk_gvi->ctk_config->pCtrlHandles); gtk_label_set_label(GTK_LABEL(ctk_gvi->gpu_name), gpu_name); } GtkWidget* ctk_gvi_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event) { GObject *object; CtkGvi *ctk_gvi; GtkWidget *hbox, *vbox, *hsep, *hseparator, *table, *button; GtkWidget *banner, *label; gchar *bus, *pci_bus_id, *irq, *gpu_name; int tmp; ReturnStatus ret; gchar *firmware_version; gchar *s; /* make sure we have a handle */ g_return_val_if_fail(handle != NULL, NULL); /* * get the static data that we will display below */ /* Firmware Version */ ret = NvCtrlGetStringAttribute(handle, NV_CTRL_STRING_GVIO_FIRMWARE_VERSION, &firmware_version); if (ret != NvCtrlSuccess) { firmware_version = g_strdup("Unable to determine"); } /* Get Bus related information */ get_bus_type_str(handle, &bus); pci_bus_id = get_bus_id_str(handle); /* NV_CTRL_IRQ */ ret = NvCtrlGetAttribute(handle, NV_CTRL_IRQ, &tmp); if (ret != NvCtrlSuccess) { irq = NULL; } else { irq = g_strdup_printf("%d", tmp); } /* NV_CTRL_GVI_BOUND_GPU */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GVI_BOUND_GPU, &tmp); if (ret != NvCtrlSuccess) { tmp = -1; } gpu_name = gpu_name_string(tmp, ctk_config->pCtrlHandles); /* create the CtkGvi object */ object = g_object_new(CTK_TYPE_GVI, NULL); ctk_gvi = CTK_GVI(object); ctk_gvi->handle = handle; ctk_gvi->ctk_config = ctk_config; /* Query static GVI properties */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GVI_NUM_JACKS, &(ctk_gvi->num_jacks)); if (ret != NvCtrlSuccess) { ctk_gvi->num_jacks = 0; } ret = NvCtrlGetAttribute(handle, NV_CTRL_GVI_MAX_CHANNELS_PER_JACK, &(ctk_gvi->max_channels_per_jack)); if (ret != NvCtrlSuccess) { ctk_gvi->max_channels_per_jack = 0; } /* set container properties for the CtkGvi widget */ gtk_box_set_spacing(GTK_BOX(ctk_gvi), 5); /* banner */ banner = ctk_banner_image_new(BANNER_ARTWORK_GVI); gtk_box_pack_start(GTK_BOX(object), banner, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(object), vbox, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new("GVI Device Information"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); table = gtk_table_new(8, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); add_table_row(table, 0, 0, 0.5, "Firmware Version:", 0, 0.5, firmware_version); /* spacing */ add_table_row(table, 2, 0, 0.5, "Bus Type:", 0, 0.5, bus); add_table_row(table, 3, 0, 0.5, "Bus ID:", 0, 0.5, pci_bus_id); /* spacing */ add_table_row(table, 5, 0, 0.5, "IRQ:", 0, 0.5, irq); label = gtk_label_new("Bound GPU:"); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 7, 8, GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); label = gtk_label_new(gpu_name); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 7, 8, GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); ctk_gvi->gpu_name = label; g_free(firmware_version); g_free(bus); g_free(pci_bus_id); g_free(irq); g_free(gpu_name); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new("Input Information"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hsep = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hsep, TRUE, TRUE, 5); /* Create look up table to store jack chanel */ if (ctk_gvi->jack_channel_table) { free(ctk_gvi->jack_channel_table); } ctk_gvi->jack_channel_table = calloc(ctk_gvi->max_channels_per_jack * ctk_gvi->num_jacks, sizeof(unsigned int)); /* Jack+Channel selection dropdown (hidden in condensed view) */ ctk_gvi->jack_channel_omenu = create_jack_channel_menu(ctk_gvi); gtk_box_pack_start(GTK_BOX(vbox), ctk_gvi->jack_channel_omenu, FALSE, FALSE, 0); /* Jack input info box */ ctk_gvi->input_info_vbox = gtk_vbox_new(FALSE, 10); gtk_container_set_border_width(GTK_CONTAINER(ctk_gvi->input_info_vbox), 5); gtk_box_pack_start(GTK_BOX(vbox), ctk_gvi->input_info_vbox, FALSE, FALSE, 0); /* Register a timer callback to update the video format info */ s = g_strdup_printf("Graphics Video In (GVI %d)", NvCtrlGetTargetId(handle)); ctk_config_add_timer(ctk_gvi->ctk_config, DEFAULT_UPDATE_VIDEO_FORMAT_INFO_TIME_INTERVAL, s, (GSourceFunc) update_sdi_input_info, (gpointer) ctk_gvi); g_free(s); /* Condensed/Detailed view toggle button */ button = gtk_toggle_button_new_with_label("Show Detailed Input Info"); ctk_gvi->show_detailed_info_btn = button; hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 5); gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(show_detailed_info_button_toggled), GTK_OBJECT(ctk_gvi)); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_GVI_BOUND_GPU), G_CALLBACK(bound_gpu_changed), (gpointer) ctk_gvi); gtk_widget_show_all(GTK_WIDGET(ctk_gvi)); update_sdi_input_info(ctk_gvi); return GTK_WIDGET(ctk_gvi); } GtkTextBuffer *ctk_gvi_create_help(GtkTextTagTable *table, CtkGvi *ctk_gvi) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "GVI Device Information Help"); ctk_help_para(b, &i, "This page in the NVIDIA " "X Server Control Panel describes basic " "information about the Graphics Video In " "(GVI) device."); ctk_help_heading(b, &i, "Firmware Version"); ctk_help_para(b, &i, "The Firmware Version reports the version " "of the firmware running on the GVI device."); ctk_help_heading(b, &i, "Bus Type"); ctk_help_para(b, &i, "This is the bus type which is " "used to connect the NVIDIA GVI device to the rest of " "your computer; possible values are AGP, PCI, " "PCI Express and Integrated."); ctk_help_heading(b, &i, "Bus ID"); ctk_help_para(b, &i, "This is the GVI device's PCI identification string, " "reported in the form 'bus:device:function'. It uniquely " "identifies the GVI device's location in the host system."); ctk_help_heading(b, &i, "IRQ"); ctk_help_para(b, &i, "This is the interrupt request line assigned to " "this GVI device."); ctk_help_heading(b, &i, "Bound GPU"); ctk_help_para(b, &i, "An OpenGL application can bind a GVI device to a " "GPU using the GL_NV_video_capture OpenGL extension. The " "Bound GPU field reports if an OpenGL application has " "currently bound this GVI device to a GPU."); ctk_help_heading(b, &i, "Input Information"); ctk_help_para(b, &i, "This section shows the detected video format(s) on " "each jack of the GVI device. When condensed mode is " "selected, the detected video format is shown for each " "jack (and channel). When detailed mode is selected, " "information pertaining to the selected jack is reported. " "Note that the GVI device can only detect the following " "information if the incoming signal has a non-zero SMPTE " "352 payload identifier, which not all SDI devices provide."); ctk_help_para(b, &i, "Video Format: The detected SMPTE video format."); ctk_help_para(b, &i, "Component Sampling: The detected composition of the " "channel."); ctk_help_para(b, &i, "Color Space: The detected color space."); ctk_help_para(b, &i, "Bites Per Component: The detected number of bits " "per component."); ctk_help_para(b, &i, "Link ID: The detected link ID of the channel."); ctk_help_finish(b); return b; } void ctk_gvi_start_timer(GtkWidget *widget) { CtkGvi *ctk_gvi = CTK_GVI(widget); /* Start the GVI timer */ ctk_config_start_timer(ctk_gvi->ctk_config, (GSourceFunc) update_sdi_input_info, (gpointer) ctk_gvi); } void ctk_gvi_stop_timer(GtkWidget *widget) { CtkGvi *ctk_gvi = CTK_GVI(widget); /* Stop the GVI timer */ ctk_config_stop_timer(ctk_gvi->ctk_config, (GSourceFunc) update_sdi_input_info, (gpointer) ctk_gvi); } nvidia-settings/src/gtk+-2.x/ctkpowermizer.c0000664000175000017500000016715112236467170021162 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include "msg.h" #include "ctkutils.h" #include "ctkhelp.h" #include "ctkpowermizer.h" #include "ctkbanner.h" #include "ctkdropdownmenu.h" #define FRAME_PADDING 10 #define DEFAULT_UPDATE_POWERMIZER_INFO_TIME_INTERVAL 1000 static gboolean update_powermizer_info(gpointer); static void update_powermizer_menu_info(CtkPowermizer *ctk_powermizer); static void set_powermizer_menu_label_txt(CtkPowermizer *ctk_powermizer, gint powerMizerMode); static void powermizer_menu_changed(GtkWidget*, gpointer); static void update_powermizer_menu_event(GtkObject *object, gpointer arg1, gpointer user_data); static void dp_config_button_toggled(GtkWidget *, gpointer); static void dp_set_config_status(CtkPowermizer *); static void dp_update_config_status(CtkPowermizer *, gboolean); static void dp_configuration_update_received(GtkObject *, gpointer, gpointer); static void post_dp_configuration_update(CtkPowermizer *); static void show_dp_toggle_warning_dlg(CtkPowermizer *ctk_powermizer); static const char *__adaptive_clock_help = "The Adaptive Clocking status describes if this feature " "is currently enabled in this GPU."; static const char *__power_source_help = "The Power Source indicates whether the machine " "is running on AC or Battery power."; static const char *__current_pcie_link_width_help = "This is the current PCIe link width of the GPU, in number of lanes."; static const char *__current_pcie_link_speed_help = "This is the current PCIe link speed of the GPU, " "in gigatransfers per second (GT/s)."; static const char *__performance_level_help = "This indicates the current Performance Level of the GPU."; static const char *__gpu_clock_freq_help = "This indicates the current Graphics Clock frequency."; static const char *__memory_transfer_rate_freq_help = "This indicates the current Memory transfer rate."; static const char *__processor_clock_freq_help = "This indicates the current Processor Clock frequency."; static const char *__performance_levels_table_help = "This indicates the Performance Levels available for the GPU. Each " "performance level is indicated by a Performance Level number, along with " "the Graphics, Memory and Processor clocks for that level. The currently active " "performance level is shown in regular text. All other performance " "levels are shown in gray."; static const char *__powermizer_menu_help = "The Preferred Mode menu allows you to choose the preferred Performance " "State for the GPU, provided the GPU has multiple Performance Levels. " "If a single X server is running, the mode selected in nvidia-settings is what " "the system will be using; if two or more X servers are running, the behavior " "is undefined. "; static const char *__powermizer_auto_mode_help = "'Auto' mode lets the driver choose the best Performance State for your GPU. "; static const char *__powermizer_adaptive_mode_help = "'Adaptive' mode allows the GPU clocks to be adjusted based on GPU " "utilization. "; static const char *__powermizer_prefer_maximum_performance_help = "'Prefer Maximum Performance' hints to the driver to prefer higher GPU clocks, " "when possible. "; static const char *__powermizer_prefer_consistent_performance_help = "'Prefer Consistent Performance' hints to the driver to lock to GPU base clocks, " "when possible. "; static const char *__dp_configuration_button_help = "CUDA - Double Precision lets you enable " "increased double-precision calculations in CUDA applications. Available on " "GPUs with the capability for increased double-precision performance." " NOTE: Selecting a GPU reduces performance for non-CUDA applications, " "including games. To increase game performance, disable this checkbox."; GType ctk_powermizer_get_type(void) { static GType ctk_powermizer_type = 0; if (!ctk_powermizer_type) { static const GTypeInfo ctk_powermizer_info = { sizeof (CtkPowermizerClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* constructor */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkPowermizer), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_powermizer_type = g_type_register_static(GTK_TYPE_VBOX, "CtkPowermizer", &ctk_powermizer_info, 0); } return ctk_powermizer_type; } /* ctk_powermizer_get_type() */ typedef struct { gint perf_level; gint nvclock; gint processorclock; gint nvclockmin; gint nvclockmax; gint memtransferrate; gint memtransferratemin; gint memtransferratemax; gint processorclockmin; gint processorclockmax; } perfModeEntry, * perfModeEntryPtr; static void apply_perf_mode_token(char *token, char *value, void *data) { perfModeEntryPtr pEntry = (perfModeEntryPtr) data; if (!strcasecmp("perf", token)) { pEntry->perf_level = atoi(value); } else if (!strcasecmp("nvclock", token)) { pEntry->nvclock = atoi(value); } else if (!strcasecmp("nvclockmin", token)) { pEntry->nvclockmin = atoi(value); } else if (!strcasecmp("nvclockmax", token)) { pEntry->nvclockmax = atoi(value); } else if (!strcasecmp("memtransferrate", token)) { pEntry->memtransferrate = atoi(value); } else if (!strcasecmp("memtransferratemin", token)) { pEntry->memtransferratemin = atoi(value); } else if (!strcasecmp("memtransferratemax", token)) { pEntry->memtransferratemax = atoi(value); } else if (!strcasecmp("processorclock", token)) { pEntry->processorclock = atoi(value); } else if (!strcasecmp("processorclockmin", token)) { pEntry->processorclockmin = atoi(value); } else if (!strcasecmp("processorclockmax", token)) { pEntry->processorclockmax = atoi(value); } else { nv_warning_msg("Unknown Perf Mode token value pair: %s=%s", token, value); } } static void update_perf_mode_table(CtkPowermizer *ctk_powermizer, gint perf_level) { GtkWidget *table; GtkWidget *label; char *perf_modes = NULL; char *tmp_perf_modes = NULL; char *tokens; char tmp_str[24]; gint ret; gint row_idx = 0; /* Where to insert into the perf mode table */ gint col_idx = 0; /* Column index adjustment factor */ gboolean active; GtkWidget *vsep; perfModeEntryPtr pEntry = NULL; perfModeEntryPtr tmpEntry = NULL; gint index = 0; gint i = 0; /* Get the current list of perf levels */ ret = NvCtrlGetStringAttribute(ctk_powermizer->attribute_handle, NV_CTRL_STRING_PERFORMANCE_MODES, &perf_modes); if (ret != NvCtrlSuccess) { /* Bail */ return; } /* Calculate the number of rows we needed vseparator in the table */ tmp_perf_modes = g_strdup(perf_modes); for (tokens = strtok(tmp_perf_modes, ";"); tokens; tokens = strtok(NULL, ";")) { tmpEntry = realloc(pEntry, sizeof(*pEntry) * (index + 1)); if (!tmpEntry) { continue; } pEntry = tmpEntry; tmpEntry = NULL; /* Invalidate perf mode entry */ memset(pEntry + index, -1, sizeof(*pEntry)); parse_token_value_pairs(tokens, apply_perf_mode_token, (void *) &pEntry[index]); /* Only add complete perf mode entries */ if ((pEntry[index].perf_level != -1) && (pEntry[index].nvclockmax != -1)) { /* Set hasDecoupledClocks flag to decide new/old clock * interface to show. */ if (!ctk_powermizer->hasDecoupledClock && ((pEntry[index].nvclockmax != pEntry[index].nvclockmin) || (pEntry[index].memtransferratemax != pEntry[index].memtransferratemin) || (pEntry[index].processorclockmax != pEntry[index].processorclockmin))) { ctk_powermizer->hasDecoupledClock = TRUE; } row_idx++; } index++; } g_free(tmp_perf_modes); /* Since table cell management in GTK lacks, just remove and rebuild * the table from scratch. */ /* Dump out the old table */ ctk_empty_container(ctk_powermizer->performance_table_hbox); /* Generate a new table */ if (ctk_powermizer->hasDecoupledClock) { table = gtk_table_new(2, 15, FALSE); row_idx = row_idx + 3; col_idx = 0; gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); gtk_box_pack_start(GTK_BOX(ctk_powermizer->performance_table_hbox), table, FALSE, FALSE, 0); if (ctk_powermizer->performance_level) { label = gtk_label_new("Level"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); /* Vertical separator */ vsep = gtk_vseparator_new(); gtk_table_attach(GTK_TABLE(table), vsep, 1, 2, 0, row_idx, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0); } if (ctk_powermizer->gpu_clock) { /* Graphics clock */ label = gtk_label_new("Graphics Clock"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+2, col_idx+4, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Min"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+2, col_idx+3, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Max"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+3, col_idx+4, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); /* Vertical separator */ vsep = gtk_vseparator_new(); gtk_table_attach(GTK_TABLE(table), vsep, col_idx+4, col_idx+5, 0, row_idx, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0); col_idx += 4; } /* Memory transfer rate */ if (ctk_powermizer->memory_transfer_rate && pEntry[i].memtransferrate != -1) { label = gtk_label_new("Memory Transfer Rate"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+1, col_idx+3, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Min"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+1, col_idx+2, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Max"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+2, col_idx+3, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); /* Vertical separator */ vsep = gtk_vseparator_new(); gtk_table_attach(GTK_TABLE(table), vsep, col_idx+3, col_idx+4, 0, row_idx, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0); col_idx += 4; } if (ctk_powermizer->processor_clock) { /* Processor clock */ label = gtk_label_new("Processor Clock"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+1, col_idx+3, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Min"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+1, col_idx+2, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Max"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+2, col_idx+3, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); /* Vertical separator */ vsep = gtk_vseparator_new(); gtk_table_attach(GTK_TABLE(table), vsep, col_idx+3, col_idx+4, 0, row_idx, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0); } } else { table = gtk_table_new(1, 4, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); gtk_box_pack_start(GTK_BOX(ctk_powermizer->performance_table_hbox), table, FALSE, FALSE, 0); if (ctk_powermizer->performance_level) { label = gtk_label_new("Performance Level"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); } if (ctk_powermizer->gpu_clock) { label = gtk_label_new("Graphics Clock"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); col_idx++; } if (pEntry[i].memtransferrate != -1 && ctk_powermizer->memory_transfer_rate) { label = gtk_label_new("Memory Transfer Rate"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+1, col_idx+2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); col_idx++; } if (ctk_powermizer->processor_clock) { label = gtk_label_new("Processor Clock"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+1, col_idx+2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); } } /* Parse the perf levels and populate the table */ row_idx = 0; //reset value used to calculate vseparator. row_idx = 3; for (i = 0; i < index; i++) { col_idx = 0; /* Only add complete perf mode entries */ if (ctk_powermizer->hasDecoupledClock && (pEntry[i].perf_level != -1) && (pEntry[i].nvclockmax != -1)) { active = (pEntry[i].perf_level == perf_level); /* XXX Assume the perf levels are sorted by the server */ gtk_table_resize(GTK_TABLE(table), row_idx+1, 10); if (ctk_powermizer->performance_level) { g_snprintf(tmp_str, 24, "%d", pEntry[i].perf_level); label = gtk_label_new(tmp_str); gtk_widget_set_sensitive(label, active); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row_idx, row_idx+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); col_idx +=1; } if (ctk_powermizer->gpu_clock) { g_snprintf(tmp_str, 24, "%d MHz", pEntry[i].nvclockmin); label = gtk_label_new(tmp_str); gtk_widget_set_sensitive(label, active); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+1, col_idx+2, row_idx, row_idx+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); g_snprintf(tmp_str, 24, "%d MHz", pEntry[i].nvclockmax); label = gtk_label_new(tmp_str); gtk_widget_set_sensitive(label, active); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+2, col_idx+3, row_idx, row_idx+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); col_idx +=3; } if (ctk_powermizer->memory_transfer_rate && pEntry[i].memtransferrate != -1) { g_snprintf(tmp_str, 24, "%d MHz", pEntry[i].memtransferratemin); label = gtk_label_new(tmp_str); gtk_widget_set_sensitive(label, active); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+1, col_idx+2, row_idx, row_idx+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); g_snprintf(tmp_str, 24, "%d MHz", pEntry[i].memtransferratemax); label = gtk_label_new(tmp_str); gtk_widget_set_sensitive(label, active); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+2, col_idx+3, row_idx, row_idx+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); col_idx +=3; } if (ctk_powermizer->processor_clock) { g_snprintf(tmp_str, 24, "%d MHz", pEntry[i].processorclockmin); label = gtk_label_new(tmp_str); gtk_widget_set_sensitive(label, active); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+1, col_idx+2, row_idx, row_idx+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); g_snprintf(tmp_str, 24, "%d MHz", pEntry[i].processorclockmax); label = gtk_label_new(tmp_str); gtk_widget_set_sensitive(label, active); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx+2, col_idx+3, row_idx, row_idx+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); } row_idx++; } else if ((pEntry[i].perf_level != -1) && (pEntry[i].nvclock != -1)) { active = (pEntry[i].perf_level == perf_level); /* XXX Assume the perf levels are sorted by the server */ gtk_table_resize(GTK_TABLE(table), row_idx+1, 10); if (ctk_powermizer->performance_level) { g_snprintf(tmp_str, 24, "%d", pEntry[i].perf_level); label = gtk_label_new(tmp_str); gtk_widget_set_sensitive(label, active); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row_idx, row_idx+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); col_idx++; } if (ctk_powermizer->gpu_clock) { g_snprintf(tmp_str, 24, "%d MHz", pEntry[i].nvclock); label = gtk_label_new(tmp_str); gtk_widget_set_sensitive(label, active); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx, col_idx+1, row_idx, row_idx+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); col_idx++; } if (ctk_powermizer->memory_transfer_rate && pEntry[i].memtransferrate != -1) { g_snprintf(tmp_str, 24, "%d MHz", pEntry[i].memtransferrate); label = gtk_label_new(tmp_str); gtk_widget_set_sensitive(label, active); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx, col_idx+1, row_idx, row_idx+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); col_idx++; } if (ctk_powermizer->processor_clock) { g_snprintf(tmp_str, 24, "%d MHz", pEntry[i].processorclock); label = gtk_label_new(tmp_str); gtk_widget_set_sensitive(label, active); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, col_idx, col_idx+1, row_idx, row_idx+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); } row_idx++; } else { nv_warning_msg("Incomplete Perf Mode (perf=%d, nvclock=%d," " memtransferrate=%d)", pEntry[i].perf_level, pEntry[i].nvclock, pEntry[i].memtransferrate); } } gtk_widget_show_all(table); XFree(perf_modes); XFree(pEntry); pEntry = NULL; } static gboolean update_powermizer_info(gpointer user_data) { gint power_source, adaptive_clock, perf_level; gint gpu_clock, memory_transfer_rate; CtkPowermizer *ctk_powermizer; NvCtrlAttributeHandle *handle; gint ret; gchar *s; char *clock_string = NULL; perfModeEntry pEntry; ctk_powermizer = CTK_POWERMIZER(user_data); handle = ctk_powermizer->attribute_handle; ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_ADAPTIVE_CLOCK_STATE, &adaptive_clock); if (ret == NvCtrlSuccess && ctk_powermizer->adaptive_clock_status) { if (adaptive_clock == NV_CTRL_GPU_ADAPTIVE_CLOCK_STATE_ENABLED) { s = g_strdup_printf("Enabled"); } else if (adaptive_clock == NV_CTRL_GPU_ADAPTIVE_CLOCK_STATE_DISABLED) { s = g_strdup_printf("Disabled"); } else { s = g_strdup_printf("Error"); } gtk_label_set_text(GTK_LABEL(ctk_powermizer->adaptive_clock_status), s); g_free(s); } /* Get the current values of clocks */ ret = NvCtrlGetStringAttribute(ctk_powermizer->attribute_handle, NV_CTRL_STRING_GPU_CURRENT_CLOCK_FREQS, &clock_string); if (ret == NvCtrlSuccess && ctk_powermizer->gpu_clock) { /* Invalidate the entries */ memset(&pEntry, -1, sizeof(pEntry)); parse_token_value_pairs(clock_string, apply_perf_mode_token, &pEntry); if (pEntry.nvclock != -1) { gpu_clock = pEntry.nvclock; s = g_strdup_printf("%d Mhz", gpu_clock); gtk_label_set_text(GTK_LABEL(ctk_powermizer->gpu_clock), s); g_free(s); } if (ctk_powermizer->memory_transfer_rate && pEntry.memtransferrate != -1) { memory_transfer_rate = pEntry.memtransferrate; s = g_strdup_printf("%d Mhz", memory_transfer_rate); gtk_label_set_text(GTK_LABEL(ctk_powermizer->memory_transfer_rate), s); g_free(s); } if (ctk_powermizer->processor_clock && pEntry.processorclock != -1) { s = g_strdup_printf("%d Mhz", pEntry.processorclock); gtk_label_set_text(GTK_LABEL(ctk_powermizer->processor_clock), s); g_free(s); } } XFree(clock_string); ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_POWER_SOURCE, &power_source); if (ret == NvCtrlSuccess && ctk_powermizer->power_source) { if (power_source == NV_CTRL_GPU_POWER_SOURCE_AC) { s = g_strdup_printf("AC"); } else if (power_source == NV_CTRL_GPU_POWER_SOURCE_BATTERY) { s = g_strdup_printf("Battery"); } else { s = g_strdup_printf("Error"); } gtk_label_set_text(GTK_LABEL(ctk_powermizer->power_source), s); g_free(s); } if (ctk_powermizer->pcie_gen_queriable) { /* NV_CTRL_GPU_PCIE_CURRENT_LINK_WIDTH */ s = get_pcie_link_width_string(handle, NV_CTRL_GPU_PCIE_CURRENT_LINK_WIDTH); gtk_label_set_text(GTK_LABEL(ctk_powermizer->link_width), s); g_free(s); /* NV_CTRL_GPU_PCIE_MAX_LINK_SPEED */ s = get_pcie_link_speed_string(handle, NV_CTRL_GPU_PCIE_CURRENT_LINK_SPEED); gtk_label_set_text(GTK_LABEL(ctk_powermizer->link_speed), s); g_free(s); } ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_CURRENT_PERFORMANCE_LEVEL, &perf_level); if (ret == NvCtrlSuccess && ctk_powermizer->performance_level) { s = g_strdup_printf("%d", perf_level); gtk_label_set_text(GTK_LABEL(ctk_powermizer->performance_level), s); g_free(s); } if (ctk_powermizer->performance_level && ctk_powermizer->gpu_clock) { /* update the perf table */ update_perf_mode_table(ctk_powermizer, perf_level); } update_powermizer_menu_info(ctk_powermizer); return TRUE; } static gchar* get_powermizer_menu_label(const unsigned int val) { gchar *label = NULL; switch (val) { case NV_CTRL_GPU_POWER_MIZER_MODE_AUTO: label = g_strdup_printf("Auto"); break; case NV_CTRL_GPU_POWER_MIZER_MODE_ADAPTIVE: label = g_strdup_printf("Adaptive"); break; case NV_CTRL_GPU_POWER_MIZER_MODE_PREFER_MAXIMUM_PERFORMANCE: label = g_strdup_printf("Prefer Maximum Performance"); break; case NV_CTRL_GPU_POWER_MIZER_MODE_PREFER_CONSISTENT_PERFORMANCE: label = g_strdup_printf("Prefer Consistent Performance"); break; default: label = g_strdup_printf(""); break; } return label; } static gchar* get_powermizer_help_text(const unsigned int bit_mask) { const gboolean bAuto = bit_mask & (1 << NV_CTRL_GPU_POWER_MIZER_MODE_AUTO); const gboolean bAdaptive = bit_mask & (1 << NV_CTRL_GPU_POWER_MIZER_MODE_ADAPTIVE); const gboolean bMaximum = bit_mask & (1 << NV_CTRL_GPU_POWER_MIZER_MODE_PREFER_MAXIMUM_PERFORMANCE); const gboolean bConsistent = bit_mask & (1 << NV_CTRL_GPU_POWER_MIZER_MODE_PREFER_CONSISTENT_PERFORMANCE); gchar *text = NULL; text = g_strdup_printf("%s%s%s%s%s", __powermizer_menu_help, bAuto ? __powermizer_auto_mode_help : "", bAdaptive ? __powermizer_adaptive_mode_help : "", bMaximum ? __powermizer_prefer_maximum_performance_help : "", bConsistent ? __powermizer_prefer_consistent_performance_help : ""); return text; } static void create_powermizer_menu_entry(CtkDropDownMenu *menu, const unsigned int bit_mask, const unsigned int val) { gchar *label; if (!(bit_mask & (1 << val))) { return; } label = get_powermizer_menu_label(val); ctk_drop_down_menu_append_item(menu, label, val); g_free(label); } GtkWidget* ctk_powermizer_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event) { GObject *object; CtkPowermizer *ctk_powermizer; GtkWidget *hbox, *hbox2, *vbox, *vbox2, *hsep, *table; GtkWidget *banner, *label; CtkDropDownMenu *menu; ReturnStatus ret, ret1; gint attribute; gint val; gint row = 0; gchar *s = NULL; gint tmp; gboolean gpu_clock_available = FALSE; gboolean mem_transfer_rate_available = FALSE; gboolean processor_clock_available = FALSE; gboolean power_source_available = FALSE; gboolean perf_level_available = FALSE; gboolean adaptive_clock_state_available = FALSE; gboolean cuda_dp_ui = FALSE; gboolean pcie_gen_queriable = FALSE; NVCTRLAttributeValidValuesRec valid_modes; char *clock_string = NULL; perfModeEntry pEntry; /* make sure we have a handle */ g_return_val_if_fail(handle != NULL, NULL); /* check if this screen supports powermizer querying */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_POWER_SOURCE, &val); if (ret == NvCtrlSuccess) { power_source_available = TRUE; } ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_CURRENT_PERFORMANCE_LEVEL, &val); if (ret == NvCtrlSuccess) { perf_level_available = TRUE; } ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_ADAPTIVE_CLOCK_STATE, &val); if (ret == NvCtrlSuccess) { adaptive_clock_state_available = TRUE; } /* Check if reporting value of the clock supported */ ret = NvCtrlGetStringAttribute(handle, NV_CTRL_STRING_GPU_CURRENT_CLOCK_FREQS, &clock_string); if (ret == NvCtrlSuccess) { /* Invalidate the entries */ memset(&pEntry, -1, sizeof(pEntry)); parse_token_value_pairs(clock_string, apply_perf_mode_token, &pEntry); if (pEntry.nvclock != -1) { gpu_clock_available = TRUE; } if (pEntry.memtransferrate != -1) { mem_transfer_rate_available = TRUE; } if (pEntry.processorclock != -1) { processor_clock_available = TRUE; } } XFree(clock_string); /* NV_CTRL_GPU_PCIE_GENERATION */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_PCIE_GENERATION, &tmp); if (ret == NvCtrlSuccess) { pcie_gen_queriable = TRUE; } /* return early if query to attributes fail */ if (!power_source_available && !perf_level_available && !adaptive_clock_state_available && !gpu_clock_available && !processor_clock_available && !pcie_gen_queriable) { return NULL; } /* create the CtkPowermizer object */ object = g_object_new(CTK_TYPE_POWERMIZER, NULL); ctk_powermizer = CTK_POWERMIZER(object); ctk_powermizer->attribute_handle = handle; ctk_powermizer->ctk_config = ctk_config; ctk_powermizer->pcie_gen_queriable = pcie_gen_queriable; ctk_powermizer->hasDecoupledClock = FALSE; /* set container properties for the CtkPowermizer widget */ gtk_box_set_spacing(GTK_BOX(ctk_powermizer), 5); /* banner */ banner = ctk_banner_image_new(BANNER_ARTWORK_THERMAL); gtk_box_pack_start(GTK_BOX(object), banner, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(object), vbox, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new("PowerMizer Information"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hsep = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hsep, TRUE, TRUE, 5); table = gtk_table_new(21, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 10); /* Adaptive Clocking State */ if (adaptive_clock_state_available) { ctk_powermizer->adaptive_clock_status = add_table_row_with_help_text(table, ctk_config, __adaptive_clock_help, row++, //row 0, // column 0.0f, 0.5, "Adaptive Clocking:", 0.0, 0.5, NULL); } else { ctk_powermizer->adaptive_clock_status = NULL; } /* Clock Frequencies */ if (gpu_clock_available) { /* spacing */ row += 3; ctk_powermizer->gpu_clock = add_table_row_with_help_text(table, ctk_config, __gpu_clock_freq_help, row++, //row 0, // column 0.0f, 0.5, "Graphics Clock:", 0.0, 0.5, NULL); } else { ctk_powermizer->gpu_clock = NULL; } if (mem_transfer_rate_available) { ctk_powermizer->memory_transfer_rate = add_table_row_with_help_text(table, ctk_config, __memory_transfer_rate_freq_help, row++, //row 0, // column 0.0f, 0.5, "Memory Transfer Rate:", 0.0, 0.5, NULL); } else { ctk_powermizer->memory_transfer_rate = NULL; } /* Processor clock */ if (processor_clock_available) { /* spacing */ row += 3; ctk_powermizer->processor_clock = add_table_row_with_help_text(table, ctk_config, __processor_clock_freq_help, row++, //row 0, // column 0.0f, 0.5, "Processor Clock:", 0.0, 0.5, NULL); } else { ctk_powermizer->processor_clock = NULL; } /* Power Source */ if (power_source_available) { /* spacing */ row += 3; ctk_powermizer->power_source = add_table_row_with_help_text(table, ctk_config, __power_source_help, row++, //row 0, // column 0.0f, 0.5, "Power Source:", 0.0, 0.5, NULL); } else { ctk_powermizer->power_source = NULL; } /* Current PCIe Link Width */ if (ctk_powermizer->pcie_gen_queriable) { /* spacing */ row += 3; ctk_powermizer->link_width = add_table_row_with_help_text(table, ctk_config, __current_pcie_link_width_help, row++, //row 0, // column 0.0f, 0.5, "Current PCIe Link Width:", 0.0, 0.5, NULL); /* Current PCIe Link Speed */ ctk_powermizer->link_speed = add_table_row_with_help_text(table, ctk_config, __current_pcie_link_speed_help, row++, //row 0, // column 0.0f, 0.5, "Current PCIe Link Speed:", 0.0, 0.5, NULL); } else { ctk_powermizer->link_width = NULL; ctk_powermizer->link_speed = NULL; } /* Performance Level */ if (perf_level_available) { /* spacing */ row += 3; ctk_powermizer->performance_level = add_table_row_with_help_text(table, ctk_config, __performance_level_help, row++, //row 0, // column 0.0f, 0.5, "Performance Level:", 0.0, 0.5, NULL); } else { ctk_powermizer->performance_level = NULL; } gtk_table_resize(GTK_TABLE(table), row, 2); /* Available Performance Level Title */ if (perf_level_available && gpu_clock_available) { hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new("Performance Levels"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hsep = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hsep, TRUE, TRUE, 5); /* Available Performance Level Table */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); ctk_powermizer->performance_table_hbox = hbox; } /* Register a timer callback to update the temperatures */ s = g_strdup_printf("PowerMizer Monitor (GPU %d)", NvCtrlGetTargetId(handle)); ctk_config_add_timer(ctk_powermizer->ctk_config, DEFAULT_UPDATE_POWERMIZER_INFO_TIME_INTERVAL, s, (GSourceFunc) update_powermizer_info, (gpointer) ctk_powermizer); g_free(s); /* PowerMizer Settings */ ret = NvCtrlGetValidAttributeValues(ctk_powermizer->attribute_handle, NV_CTRL_GPU_POWER_MIZER_MODE, &valid_modes); if ((ret == NvCtrlSuccess) && (valid_modes.type == ATTRIBUTE_TYPE_INT_BITS)) { const unsigned int bit_mask = valid_modes.u.bits.ints; hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); vbox2 = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 0); ctk_powermizer->box_powermizer_menu = vbox2; /* H-separator */ hbox2 = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox2), hbox2, FALSE, FALSE, 0); label = gtk_label_new("PowerMizer Settings"); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); hsep = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox2), hsep, TRUE, TRUE, 5); /* Specifying drop down list */ menu = (CtkDropDownMenu *) ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO); create_powermizer_menu_entry( menu, bit_mask, NV_CTRL_GPU_POWER_MIZER_MODE_AUTO); create_powermizer_menu_entry( menu, bit_mask, NV_CTRL_GPU_POWER_MIZER_MODE_ADAPTIVE); create_powermizer_menu_entry( menu, bit_mask, NV_CTRL_GPU_POWER_MIZER_MODE_PREFER_MAXIMUM_PERFORMANCE); create_powermizer_menu_entry( menu, bit_mask, NV_CTRL_GPU_POWER_MIZER_MODE_PREFER_CONSISTENT_PERFORMANCE); ctk_powermizer->powermizer_menu = GTK_WIDGET(menu); g_signal_connect(G_OBJECT(ctk_powermizer->powermizer_menu), "changed", G_CALLBACK(powermizer_menu_changed), (gpointer) ctk_powermizer); ctk_powermizer->powermizer_menu_help = get_powermizer_help_text(bit_mask); ctk_config_set_tooltip(ctk_config, ctk_powermizer->powermizer_menu, ctk_powermizer->powermizer_menu_help); /* Packing the drop down list */ table = gtk_table_new(1, 4, FALSE); gtk_box_pack_start(GTK_BOX(vbox2), table, FALSE, FALSE, 0); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 0); gtk_container_set_border_width(GTK_CONTAINER(table), 5); hbox2 = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox2, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Preferred Mode:"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); hbox2 = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox2, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); gtk_box_pack_start(GTK_BOX(hbox2), ctk_powermizer->powermizer_menu, FALSE, FALSE, 0); hbox2 = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox2, 2, 3, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Current Mode:"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); hbox2 = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox2, 3, 4, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(""); ctk_powermizer->powermizer_txt = label; gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); update_powermizer_menu_info(ctk_powermizer); } /* * check if CUDA - Double Precision Boost support available. */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE, &val); if (ret == NvCtrlSuccess) { attribute = NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE; cuda_dp_ui = TRUE; } else { ret1 = NvCtrlGetAttribute(handle, NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT, &val); if (ret1 == NvCtrlSuccess) { attribute = NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT; cuda_dp_ui = TRUE; } } if (cuda_dp_ui) { ctk_powermizer->attribute = attribute; ctk_powermizer->dp_toggle_warning_dlg_shown = FALSE; /* Query CUDA - Double Precision Boost Status */ dp_update_config_status(ctk_powermizer, val); /* CUDA - Double Precision Boost configuration settings */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new("CUDA"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hsep = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hsep, TRUE, TRUE, 5); hbox2 = gtk_hbox_new(FALSE, 0); ctk_powermizer->configuration_button = gtk_check_button_new_with_label("CUDA - Double precision"); gtk_box_pack_start(GTK_BOX(hbox2), ctk_powermizer->configuration_button, FALSE, FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox2), 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_powermizer->configuration_button), ctk_powermizer->dp_enabled); /* Packing */ table = gtk_table_new(1, 1, FALSE); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); gtk_table_attach(GTK_TABLE(table), hbox2, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); if (attribute == NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT) { GtkWidget *separator; gtk_table_resize(GTK_TABLE(table), 1, 3); /* V-bar */ hbox2 = gtk_hbox_new(FALSE, 0); separator = gtk_vseparator_new(); gtk_box_pack_start(GTK_BOX(hbox2), separator, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox2, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); ctk_powermizer->status = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(ctk_powermizer->status), 0.0f, 0.5f); hbox2 = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox2), ctk_powermizer->status, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox2, 2, 3, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); } ctk_config_set_tooltip(ctk_config, ctk_powermizer->configuration_button, __dp_configuration_button_help); g_signal_connect(G_OBJECT(ctk_powermizer->configuration_button), "clicked", G_CALLBACK(dp_config_button_toggled), (gpointer) ctk_powermizer); if (attribute == NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE) { g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE), G_CALLBACK(dp_configuration_update_received), (gpointer) ctk_powermizer); } else if (attribute == NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT) { g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT), G_CALLBACK(dp_configuration_update_received), (gpointer) ctk_powermizer); } } else { ctk_powermizer->configuration_button = NULL; } /* Updating the powermizer page */ update_powermizer_info(ctk_powermizer); gtk_widget_show_all(GTK_WIDGET(ctk_powermizer)); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_GPU_POWER_MIZER_MODE), G_CALLBACK(update_powermizer_menu_event), (gpointer) ctk_powermizer); return GTK_WIDGET(ctk_powermizer); } static void post_powermizer_menu_update(CtkPowermizer *ctk_powermizer) { CtkDropDownMenu *menu = CTK_DROP_DOWN_MENU(ctk_powermizer->powermizer_menu); const char *label = ctk_drop_down_menu_get_current_name(menu); ctk_config_statusbar_message(ctk_powermizer->ctk_config, "Preferred Mode set to %s.", label); } static void update_powermizer_menu_event(GtkObject *object, gpointer arg1, gpointer user_data) { CtkPowermizer *ctk_powermizer = CTK_POWERMIZER(user_data); update_powermizer_menu_info(ctk_powermizer); post_powermizer_menu_update(ctk_powermizer); } static void set_powermizer_menu_label_txt(CtkPowermizer *ctk_powermizer, gint powerMizerMode) { gint actualPowerMizerMode; gchar *label; if (powerMizerMode == NV_CTRL_GPU_POWER_MIZER_MODE_AUTO) { actualPowerMizerMode = ctk_powermizer->powermizer_default_mode; } else { actualPowerMizerMode = powerMizerMode; } label = get_powermizer_menu_label(actualPowerMizerMode); gtk_label_set_text(GTK_LABEL(ctk_powermizer->powermizer_txt), label); g_free(label); } static void update_powermizer_menu_info(CtkPowermizer *ctk_powermizer) { gint powerMizerMode, defaultPowerMizerMode; ReturnStatus ret1, ret2; CtkDropDownMenu *menu; if (!ctk_powermizer->powermizer_menu) { return; } menu = CTK_DROP_DOWN_MENU(ctk_powermizer->powermizer_menu); ret1 = NvCtrlGetAttribute(ctk_powermizer->attribute_handle, NV_CTRL_GPU_POWER_MIZER_MODE, &powerMizerMode); ret2 = NvCtrlGetAttribute(ctk_powermizer->attribute_handle, NV_CTRL_GPU_POWER_MIZER_DEFAULT_MODE, &defaultPowerMizerMode); if ((ret1 != NvCtrlSuccess) || (ret2 != NvCtrlSuccess)) { gtk_widget_hide(ctk_powermizer->box_powermizer_menu); } else { g_signal_handlers_block_by_func(G_OBJECT(ctk_powermizer->powermizer_menu), G_CALLBACK(powermizer_menu_changed), (gpointer) ctk_powermizer); ctk_powermizer->powermizer_default_mode = defaultPowerMizerMode; ctk_drop_down_menu_set_current_value(menu, powerMizerMode); set_powermizer_menu_label_txt(ctk_powermizer, powerMizerMode); g_signal_handlers_unblock_by_func(G_OBJECT(ctk_powermizer->powermizer_menu), G_CALLBACK(powermizer_menu_changed), (gpointer) ctk_powermizer); gtk_widget_show(ctk_powermizer->box_powermizer_menu); } } static void powermizer_menu_changed(GtkWidget *widget, gpointer user_data) { CtkPowermizer *ctk_powermizer = CTK_POWERMIZER(user_data); CtkDropDownMenu *menu = CTK_DROP_DOWN_MENU(widget); guint powerMizerMode; ReturnStatus ret; const char *label = ctk_drop_down_menu_get_current_name(menu); powerMizerMode = ctk_drop_down_menu_get_current_value(menu); ret = NvCtrlSetAttribute(ctk_powermizer->attribute_handle, NV_CTRL_GPU_POWER_MIZER_MODE, powerMizerMode); if (ret != NvCtrlSuccess) { ctk_config_statusbar_message(ctk_powermizer->ctk_config, "Unable to set Preferred Mode to %s.", label); return; } set_powermizer_menu_label_txt(ctk_powermizer, powerMizerMode); post_powermizer_menu_update(ctk_powermizer); } static void show_dp_toggle_warning_dlg(CtkPowermizer *ctk_powermizer) { GtkWidget *dlg, *parent; /* return early if message dialog already shown */ if (ctk_powermizer->dp_toggle_warning_dlg_shown) { return; } ctk_powermizer->dp_toggle_warning_dlg_shown = TRUE; parent = ctk_get_parent_window(GTK_WIDGET(ctk_powermizer)); dlg = gtk_message_dialog_new (GTK_WINDOW(parent), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Changes to the CUDA - Double precision " "setting " "require a system reboot before " "taking effect."); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy (dlg); } /* show_dp_toggle_warning_dlg() */ /* * post_dp_configuration_update() - this function updates status bar string. */ static void post_dp_configuration_update(CtkPowermizer *ctk_powermizer) { gboolean enabled = ctk_powermizer->dp_enabled; const char *conf_string = enabled ? "enabled" : "disabled"; char message[128]; if (ctk_powermizer->attribute == NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT) { snprintf(message, sizeof(message), "CUDA - Double precision will " "be %s after reboot.", conf_string); } else { snprintf(message, sizeof(message), "CUDA - Double precision %s.", conf_string); } ctk_config_statusbar_message(ctk_powermizer->ctk_config, "%s", message); } /* post_dp_configuration_update() */ /* * dp_set_config_status() - set CUDA - Double Precision Boost configuration * button status. */ static void dp_set_config_status(CtkPowermizer *ctk_powermizer) { GtkWidget *configuration_button = ctk_powermizer->configuration_button; g_signal_handlers_block_by_func(G_OBJECT(configuration_button), G_CALLBACK(dp_config_button_toggled), (gpointer) ctk_powermizer); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(configuration_button), ctk_powermizer->dp_enabled); g_signal_handlers_unblock_by_func(G_OBJECT(configuration_button), G_CALLBACK(dp_config_button_toggled), (gpointer) ctk_powermizer); } /* dp_set_config_status() */ /* * dp_update_config_status - get current CUDA - Double Precision Boost status. */ static void dp_update_config_status(CtkPowermizer *ctk_powermizer, gboolean val) { if ((ctk_powermizer->attribute == NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE && val == NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE_DISABLED) || (ctk_powermizer->attribute == NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT && val == NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT_DISABLED)) { ctk_powermizer->dp_enabled = FALSE; } else { ctk_powermizer->dp_enabled = TRUE; } } /* dp_update_config_status() */ /* * dp_configuration_update_received() - this function is called when the * NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE attribute is changed by another * NV-CONTROL client. */ static void dp_configuration_update_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct = (CtkEventStruct *) arg1; CtkPowermizer *ctk_powermizer = CTK_POWERMIZER(user_data); ctk_powermizer->dp_enabled = event_struct->value; /* set CUDA - Double Precision Boost configuration buttion status */ dp_set_config_status(ctk_powermizer); /* Update status bar message */ post_dp_configuration_update(ctk_powermizer); } /* dp_configuration_update_received() */ /* * dp_config_button_toggled() - callback function for * enable CUDA - Double Precision Boost checkbox. */ static void dp_config_button_toggled(GtkWidget *widget, gpointer user_data) { gboolean enabled; CtkPowermizer *ctk_powermizer = CTK_POWERMIZER(user_data); ReturnStatus ret; enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); /* show popup dialog when user first time click DP config */ if (ctk_powermizer->attribute == NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT) { show_dp_toggle_warning_dlg(ctk_powermizer); } /* set the newly specified CUDA - Double Precision Boost value */ ret = NvCtrlSetAttribute(ctk_powermizer->attribute_handle, ctk_powermizer->attribute, enabled); if (ret != NvCtrlSuccess) { ctk_config_statusbar_message(ctk_powermizer->ctk_config, "Failed to set " "CUDA - Double precision " "configuration!"); return; } ctk_powermizer->dp_enabled = enabled; dp_set_config_status(ctk_powermizer); if (ctk_powermizer->status) { gtk_label_set_text(GTK_LABEL(ctk_powermizer->status), "pending reboot"); } /* Update status bar message */ post_dp_configuration_update(ctk_powermizer); } /* dp_config_button_toggled() */ GtkTextBuffer *ctk_powermizer_create_help(GtkTextTagTable *table, CtkPowermizer *ctk_powermizer) { GtkTextIter i; GtkTextBuffer *b; gchar *s; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "PowerMizer Monitor Help"); ctk_help_para(b, &i, "This page shows powermizer monitor options " "available on this GPU."); if (ctk_powermizer->adaptive_clock_status) { ctk_help_heading(b, &i, "Adaptive Clocking"); ctk_help_para(b, &i, "%s", __adaptive_clock_help); } if (ctk_powermizer->gpu_clock) { ctk_help_heading(b, &i, "Clock Frequencies"); if (ctk_powermizer->memory_transfer_rate && ctk_powermizer->processor_clock) { s = "This indicates the GPU's current Graphics Clock, " "Memory transfer rate and Processor Clock frequencies."; } else if (ctk_powermizer->memory_transfer_rate) { s = "This indicates the GPU's current Graphics Clock and " "Memory transfer rate."; } else { s = "This indicates the GPU's current Graphics Clock ferquencies."; } ctk_help_para(b, &i, "%s", s); } if (ctk_powermizer->power_source) { ctk_help_heading(b, &i, "Power Source"); ctk_help_para(b, &i, "%s", __power_source_help); } if (ctk_powermizer->pcie_gen_queriable) { ctk_help_heading(b, &i, "Current PCIe link width"); ctk_help_para(b, &i, "%s", __current_pcie_link_width_help); ctk_help_heading(b, &i, "Current PCIe link speed"); ctk_help_para(b, &i, "%s", __current_pcie_link_speed_help); } if (ctk_powermizer->performance_level) { ctk_help_heading(b, &i, "Performance Level"); ctk_help_para(b, &i, "%s", __performance_level_help); ctk_help_heading(b, &i, "Performance Levels (Table)"); ctk_help_para(b, &i, "%s", __performance_levels_table_help); } if (ctk_powermizer->powermizer_menu) { ctk_help_heading(b, &i, "PowerMizer Settings"); ctk_help_para(b, &i, "%s", ctk_powermizer->powermizer_menu_help); } if (ctk_powermizer->configuration_button) { ctk_help_heading(b, &i, "CUDA - Double precision"); ctk_help_para(b, &i, "%s", __dp_configuration_button_help); } ctk_help_finish(b); return b; } void ctk_powermizer_start_timer(GtkWidget *widget) { CtkPowermizer *ctk_powermizer = CTK_POWERMIZER(widget); /* Start the powermizer timer */ ctk_config_start_timer(ctk_powermizer->ctk_config, (GSourceFunc) update_powermizer_info, (gpointer) ctk_powermizer); } void ctk_powermizer_stop_timer(GtkWidget *widget) { CtkPowermizer *ctk_powermizer = CTK_POWERMIZER(widget); /* Stop the powermizer timer */ ctk_config_stop_timer(ctk_powermizer->ctk_config, (GSourceFunc) update_powermizer_info, (gpointer) ctk_powermizer); } nvidia-settings/src/gtk+-2.x/ctkopengl.h0000664000175000017500000000462312236467170020242 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_OPENGL_H__ #define __CTK_OPENGL_H__ #include "ctkevent.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_OPENGL (ctk_opengl_get_type()) #define CTK_OPENGL(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_OPENGL, CtkOpenGL)) #define CTK_OPENGL_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_OPENGL, CtkOpenGLClass)) #define CTK_IS_OPENGL(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_OPENGL)) #define CTK_IS_OPENGL_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_OPENGL)) #define CTK_OPENGL_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_OPENGL, CtkOpenGLClass)) typedef struct _CtkOpenGL CtkOpenGL; typedef struct _CtkOpenGLClass CtkOpenGLClass; struct _CtkOpenGL { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; GtkWidget *sync_to_vblank_button; GtkWidget *allow_flipping_button; GtkWidget *use_conformant_clamping_button; GtkWidget *force_stereo_button; GtkWidget *xinerama_stereo_button; GtkWidget *stereo_eyes_exchange_button; GtkWidget *image_settings_scale; GtkWidget *aa_line_gamma_button; GtkWidget *aa_line_gamma_scale; GtkWidget *show_sli_visual_indicator_button; GtkWidget *show_multigpu_visual_indicator_button; unsigned int active_attributes; }; struct _CtkOpenGLClass { GtkVBoxClass parent_class; }; GType ctk_opengl_get_type (void) G_GNUC_CONST; GtkWidget* ctk_opengl_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *); GtkTextBuffer *ctk_opengl_create_help(GtkTextTagTable *, CtkOpenGL *); G_END_DECLS #endif /* __CTK_OPENGL_H__ */ nvidia-settings/src/gtk+-2.x/ctkscreen.c0000664000175000017500000004176312236467170020236 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "NvCtrlAttributes.h" #include "NVCtrlLib.h" #include #include #include #include #include "parse.h" #include "ctkscreen.h" #include "ctkhelp.h" #include "ctkutils.h" #include "ctkbanner.h" static const _CtkStereoMode stereoMode[] = { { NV_CTRL_STEREO_OFF, "Stereo Disabled" }, { NV_CTRL_STEREO_DDC, "DDC Stereo" }, { NV_CTRL_STEREO_BLUELINE, "Blueline Stereo" }, { NV_CTRL_STEREO_DIN, "Onboard DIN Stereo" }, { NV_CTRL_STEREO_PASSIVE_EYE_PER_DPY, "Passive One-Eye-per-Display Stereo" }, { NV_CTRL_STEREO_VERTICAL_INTERLACED, "Vertical Interlaced Stereo" }, { NV_CTRL_STEREO_COLOR_INTERLACED, "Color Interleaved Stereo" }, { NV_CTRL_STEREO_HORIZONTAL_INTERLACED, "Horizontal Interlaced Stereo" }, { NV_CTRL_STEREO_CHECKERBOARD_PATTERN, "Checkerboard Pattern Stereo" }, { NV_CTRL_STEREO_INVERSE_CHECKERBOARD_PATTERN, "Inverse Checkerboard Stereo" }, { NV_CTRL_STEREO_3D_VISION, "NVIDIA 3D Vision Stereo" }, { NV_CTRL_STEREO_3D_VISION_PRO, "NVIDIA 3D Vision Pro Stereo" }, { NV_CTRL_STEREO_HDMI_3D, "HDMI 3D Stereo" }, }; void ctk_screen_event_handler(GtkWidget *widget, XRRScreenChangeNotifyEvent *ev, gpointer data); static void associated_displays_received(GtkObject *object, gpointer arg1, gpointer user_data); static void info_update_gpu_error(GtkObject *object, gpointer arg1, gpointer user_data); static const char *get_stereo_mode_string(int stereo_mode) { int i; for (i = 0; i < ARRAY_LEN(stereoMode); i++) { if (stereoMode[i].stereo_mode == stereo_mode) { return stereoMode[i].name; } } return "Unknown"; } GType ctk_screen_get_type( void ) { static GType ctk_screen_type = 0; if (!ctk_screen_type) { static const GTypeInfo info_ctk_screen = { sizeof (CtkScreenClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkScreen), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_screen_type = g_type_register_static(GTK_TYPE_VBOX, "CtkScreen", &info_ctk_screen, 0); } return ctk_screen_type; } /* Generates a list of display devices for the logical X screen * given as "handle". */ static gchar *make_display_device_list(NvCtrlAttributeHandle *handle) { return create_display_name_list_string(handle, NV_CTRL_BINARY_DATA_DISPLAYS_ENABLED_ON_XSCREEN); } /* make_display_device_list() */ /* * Calculations of the screen dimensions and resolution are based on * the xdpyinfo utility code. * * Copyright Information for xdpyinfo: * *********************************************************************** * * xdpyinfo - print information about X display connection * * Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. 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 OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. * * Author: Jim Fulton, MIT X Consortium * *********************************************************************** * */ GtkWidget* ctk_screen_new(NvCtrlAttributeHandle *handle, CtkEvent *ctk_event) { GObject *object; CtkScreen *ctk_screen; GtkWidget *label; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *banner; GtkWidget *hseparator; GtkWidget *table; ReturnStatus ret; gchar *screen_number; gchar *display_name; gchar *dimensions; gchar *resolution; gchar *depth; gchar *gpus; gchar *displays; gint gpu_errors; gint stereo_mode; char tmp[16]; double xres, yres; int *pData; int len; int i; /* * get the data that we will display below */ screen_number = g_strdup_printf("%d", NvCtrlGetTargetId(handle)); display_name = NvCtrlGetDisplayName(handle); dimensions = g_strdup_printf("%dx%d pixels (%dx%d millimeters)", NvCtrlGetScreenWidth(handle), NvCtrlGetScreenHeight(handle), NvCtrlGetScreenWidthMM(handle), NvCtrlGetScreenHeightMM(handle)); /* * there are 2.54 centimeters to an inch; so there are 25.4 millimeters. * * dpi = N pixels / (M millimeters / (25.4 millimeters / 1 inch)) * = N pixels / (M inch / 25.4) * = N * 25.4 pixels / M inch */ xres = (((double) NvCtrlGetScreenWidth(handle)) * 25.4) / ((double) NvCtrlGetScreenWidthMM(handle)); yres = (((double) NvCtrlGetScreenHeight(handle)) * 25.4) / ((double) NvCtrlGetScreenHeightMM(handle)); resolution = g_strdup_printf("%dx%d dots per inch", (int) (xres + 0.5), (int) (yres + 0.5)); depth = g_strdup_printf("%d", NvCtrlGetScreenPlanes(handle)); /* get the list of GPUs driving this (logical) X screen */ gpus = NULL; ret = NvCtrlGetBinaryAttribute(handle, 0, NV_CTRL_BINARY_DATA_GPUS_USED_BY_LOGICAL_XSCREEN, (unsigned char **)(&pData), &len); if (ret == NvCtrlSuccess) { for (i = 1; i <= pData[0]; i++) { gchar *tmp_str; gchar *gpu_name; Bool valid; valid = XNVCTRLQueryTargetStringAttribute(NvCtrlGetDisplayPtr(handle), NV_CTRL_TARGET_TYPE_GPU, pData[i], 0, NV_CTRL_STRING_PRODUCT_NAME, &gpu_name); if (!valid) { gpu_name = "Unknown"; } if (gpus) { tmp_str = g_strdup_printf("%s,\n%s (GPU %d)", gpus, gpu_name, pData[i]); } else { tmp_str = g_strdup_printf("%s (GPU %d)", gpu_name, pData[i]); } if (valid) { XFree(gpu_name); } g_free(gpus); gpus = tmp_str; } if (!gpus) { gpus = g_strdup("None"); } XFree(pData); } /* get the list of Display Devices displaying this X screen */ displays = make_display_device_list(handle); /* get the number of gpu errors occurred */ gpu_errors = 0; ret = NvCtrlGetAttribute(handle, NV_CTRL_NUM_GPU_ERRORS_RECOVERED, (int *)&gpu_errors); snprintf(tmp, 16, "%d", gpu_errors); /* now, create the object */ object = g_object_new(CTK_TYPE_SCREEN, NULL); ctk_screen = CTK_SCREEN(object); /* cache the attribute handle */ ctk_screen->handle = handle; /* get the stereo mode set for this X screen */ ret = NvCtrlGetAttribute(handle, NV_CTRL_STEREO, (int *)&stereo_mode); ctk_screen->stereo_available = (ret == NvCtrlSuccess); /* set container properties of the object */ gtk_box_set_spacing(GTK_BOX(ctk_screen), 10); /* banner */ banner = ctk_banner_image_new(BANNER_ARTWORK_X); gtk_box_pack_start(GTK_BOX(ctk_screen), banner, FALSE, FALSE, 0); /* * Screen information: TOP->MIDDLE - LEFT->RIGHT * * This displays basic X Screen information, including * the X Screen number, the display connection used to * talk to the X Screen, dimensions, resolution, depth (planes) * the list of GPUs driving the X Screen and the list of * display devices displaying the X Screen. */ vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(ctk_screen), vbox, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new("X Screen Information"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); table = gtk_table_new(20, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); add_table_row(table, 0, 0, 0.5, "Screen Number:", 0, 0.5, screen_number); add_table_row(table, 1, 0, 0.5, "Display Name:", 0, 0.5, display_name); /* spacing */ ctk_screen->dimensions = add_table_row(table, 5, 0, 0.5, "Dimensions:", 0, 0.5, dimensions); add_table_row(table, 6, 0, 0.5, "Resolution:", 0, 0.5, resolution); add_table_row(table, 7, 0, 0.5, "Depth:", 0, 0.5, depth); /* spacing */ add_table_row(table, 11, 0, 0, "GPUs:", 0, 0, gpus); /* spacing */ ctk_screen->displays = add_table_row(table, 15, 0, 0, "Displays:", 0, 0, displays); /* gpu errors */ ctk_screen->gpu_errors = add_table_row(table, 19, 0, 0, "Recovered GPU Errors:", 0, 0, tmp); if (ctk_screen->stereo_available) { add_table_row(table, 20, 0, 0, "Stereo Mode:", 0, 0, get_stereo_mode_string(stereo_mode)); } g_free(screen_number); free(display_name); g_free(dimensions); g_free(resolution); g_free(depth); g_free(gpus); g_free(displays); /* Handle updates to the list of associated display devices */ g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_ASSOCIATED_DISPLAY_DEVICES), G_CALLBACK(associated_displays_received), (gpointer) ctk_screen); /* Setup widget to handle XRRScreenChangeNotify events */ g_signal_connect(G_OBJECT(ctk_event), "CTK_EVENT_RRScreenChangeNotify", G_CALLBACK(ctk_screen_event_handler), (gpointer) ctk_screen); /* Setup widget to reflect the latest number of gpu errors */ g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_NUM_GPU_ERRORS_RECOVERED), G_CALLBACK(info_update_gpu_error), (gpointer) ctk_screen); gtk_widget_show_all(GTK_WIDGET(object)); return GTK_WIDGET(object); } GtkTextBuffer *ctk_screen_create_help(GtkTextTagTable *table, CtkScreen *ctk_screen, const gchar *screen_name) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "X Screen Information Help"); ctk_help_para(b, &i, "This page in the NVIDIA " "X Server Control Panel describes basic " "information about the X Screen '%s'.", screen_name); ctk_help_heading(b, &i, "Screen Number"); ctk_help_para(b, &i, "This is the X Screen number."); ctk_help_heading(b, &i, "Display Name"); ctk_help_para(b, &i, "This is the display connection string used to " "communicate with the X Screen on the X Server."); ctk_help_heading(b, &i, "Dimensions"); ctk_help_para(b, &i, "This displays the X Screen's horizontal and " "vertical dimensions in pixels and millimeters."); ctk_help_heading(b, &i, "Resolution"); ctk_help_para(b, &i, "This is the resolution (in dots per inch) of the " "X Screen."); ctk_help_heading(b, &i, "Depth"); ctk_help_para(b, &i, "This is the number of planes (depth) the X Screen " "has available."); ctk_help_heading(b, &i, "GPUs"); ctk_help_para(b, &i, "This is the list of GPUs that drive this X Screen."); ctk_help_heading(b, &i, "Display Devices"); ctk_help_para(b, &i, "This is the list of Display Devices (CRTs, TVs etc) " "enabled on this X Screen."); ctk_help_heading(b, &i, "Recovered GPU Errors"); ctk_help_para(b, &i, "The GPU can encounter errors, either due to bugs in " "the NVIDIA driver, or due to corruption of the command " "stream as it is sent from the NVIDIA X driver to the GPU. " "When the GPU encounters one of these errors, it reports it " "to the NVIDIA X driver and the NVIDIA X driver attempts to " "recover from the error. This reports how many errors the " "GPU received and the NVIDIA X driver successfully recovered " "from."); if (ctk_screen->stereo_available) { ctk_help_heading(b, &i, "Stereo Mode"); ctk_help_para(b, &i, "This is the stereo mode set for the X screen."); } ctk_help_finish(b); return b; } /* * When XConfigureRequest events happens outside of the control panel, * they are trapped by this function so the gui can be updated * with the new screen information. */ void ctk_screen_event_handler(GtkWidget *widget, XRRScreenChangeNotifyEvent *ev, gpointer data) { CtkScreen *ctk_screen = (CtkScreen *) data; gchar *dimensions = g_strdup_printf("%dx%d pixels (%dx%d millimeters)", ev->width, ev->height, ev->mwidth, ev->mheight); gtk_label_set_text(GTK_LABEL(ctk_screen->dimensions), dimensions); g_free(dimensions); } /* ctk_screen_event_handler() */ /* * When the list of associated displays on this screen changes, we should * update the display device list shown on the page. */ static void associated_displays_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkScreen *ctk_object = CTK_SCREEN(user_data); gchar *str; str = make_display_device_list(ctk_object->handle); gtk_label_set_text(GTK_LABEL(ctk_object->displays), str); g_free(str); } /* associated_displays_received() */ /* * When the number of gpu errors occurred changes, * update the count showed on the page. */ static void info_update_gpu_error(GtkObject *object, gpointer arg1, gpointer data) { CtkScreen *ctk_screen = (CtkScreen *) data; ReturnStatus ret; gint gpu_errors = 0; char tmp[16]; /* get the number of gpu errors occurred */ ret = NvCtrlGetAttribute(ctk_screen->handle, NV_CTRL_NUM_GPU_ERRORS_RECOVERED, (int *)&gpu_errors); if (ret == NvCtrlSuccess) { snprintf(tmp, 16, "%d", gpu_errors); gtk_label_set_text(GTK_LABEL(ctk_screen->gpu_errors), tmp); } } /* info_update_gpu_error() */ nvidia-settings/src/gtk+-2.x/ctkgvo-sync.c0000664000175000017500000013346612236467170020526 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "ctkbanner.h" #include "ctkgvo.h" #include "ctkgvo-sync.h" #include "ctkconfig.h" #include "ctkhelp.h" #include "ctkdropdownmenu.h" /* * The CtkGvoSync widget is used to provide a way for configuring * how the SDI device synchronises with an input signal source. */ #define FRAME_BORDER 5 #define TABLE_PADDING 5 #define DEFAULT_DETECT_INPUT_TIME_INTERVAL 2000 #define SYNC_FORMAT_SDI 0 #define SYNC_FORMAT_COMP_AUTO 1 #define SYNC_FORMAT_COMP_BI_LEVEL 2 #define SYNC_FORMAT_COMP_TRI_LEVEL 3 static const GvioFormatName syncFormatNames[] = { { SYNC_FORMAT_SDI, "SDI Sync" }, { SYNC_FORMAT_COMP_AUTO, "COMP Sync" }, { SYNC_FORMAT_COMP_BI_LEVEL, "COMP Sync (Bi-level)" }, { SYNC_FORMAT_COMP_TRI_LEVEL, "COMP Sync (Tri-level)" }, { -1, NULL }, }; extern const GvioFormatName videoFormatNames[]; /* local prototypes */ static GtkWidget *start_menu(const gchar *name, GtkWidget *table, const gint row); static void finish_menu(GtkWidget *menu, GtkWidget *table, const gint row); static gboolean query_init_gvo_sync_state(CtkGvoSync *ctk_gvo_sync); static void init_composite_termination(CtkGvoSync *ctk_gvo_sync); static void init_sync_format_menu(CtkGvoSync *ctk_gvo_sync); static void register_for_gvo_sync_events(CtkGvoSync *ctk_gvo_sync); static void update_gvo_sync_sensitivity(CtkGvoSync *ctk_gvo_sync); static void update_input_video_format_text_entry(CtkGvoSync *ctk_gvo_sync); static void post_composite_termination_toggled(CtkGvoSync *ctk_gvo_sync, gboolean enabled); static void detect_input_toggled(GtkToggleButton *togglebutton, CtkGvoSync *ctk_gvo_sync); static gint detect_input_done(gpointer data); static void composite_termination_toggled(GtkWidget *button, CtkGvoSync *ctk_gvo_sync); static void sync_mode_changed(CtkDropDownMenu *menu, gpointer user_data); static void sync_format_changed(CtkDropDownMenu *menu, gpointer user_data); static void hsync_delay_changed(GtkSpinButton *spinbutton, gpointer user_data); static void vsync_delay_changed(GtkSpinButton *spinbutton, gpointer user_data); static void gvo_sync_event_received(GtkObject *object, gpointer arg1, gpointer user_data); static gint gvo_sync_probe_callback(gpointer data); /* Help tooltips */ static const char * __input_video_format_help = "The Input Video Format text entry indicates the input video format detected " "on the input BNC."; static const char * __input_video_format_detect_help = "The Input Video Format Detect button will (re)detect the video format on " "the input BNC."; static const char * __composite_termination_help = "The Enable Composite Termination checkbox enables the 75 ohm termination " "of the composite input signal"; static const char * __sync_mode_help = "The Sync Mode dropdown allows you to select how the SDI device syncs its " "output to the input signal."; static const char * __sync_format_help = "The Sync Format dropdown allows you to select the format of the input sync " "signal."; static const char * __sync_status_help = "The Sync Status reports on how the SDI device is currently syncing to the " "input sync signal."; static const char * __hsync_delay_help = "The HSync Delay entry allows you to specify the horizontal delay between the " "input signal and the output signal generated by the SDI device."; static const char * __hsync_advance_help = "The HSync Advance entry allows you to specify the horizontal advance between " "the input signal and the output signal generated by the SDI device."; static const char * __vsync_delay_help = "The VSync Delay entry allows you to specify the vertical delay between the " "input signal and the output signal generated by the SDI device."; static const char * __vsync_advance_help = "The VSync Advance entry allows you to specify the vertical advance between " "the input signal and the output signal generated by the SDI device."; /**** Utility Functions ******************************************************/ /* * ctk_gvo_sync_get_type() - Returns the CtkGvoSync "class" type */ GType ctk_gvo_sync_get_type(void) { static GType ctk_gvo_sync_type = 0; if (!ctk_gvo_sync_type) { static const GTypeInfo ctk_gvo_sync_info = { sizeof (CtkGvoSyncClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init, */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkGvoSync), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_gvo_sync_type = g_type_register_static (GTK_TYPE_VBOX, "CtkGvoSync", &ctk_gvo_sync_info, 0); } return ctk_gvo_sync_type; } /* ctk_gvo_sync_get_type() */ /* * max_input_video_format_text_entry_length() */ static int max_input_video_format_text_entry_length(void) { gint i, tmp, max = 0; for (i = 0; videoFormatNames[i].name; i++) { tmp = strlen(videoFormatNames[i].name); if (max < tmp) max = tmp; } return max; } /* max_input_video_format_text_entry_length() */ /* * get_current_sync_format() - given the current state of the * sync source and composite detection mode, return the value * to use for the sync format dropdown. */ static gint get_current_sync_format(CtkGvoSync *ctk_gvo_sync) { /* Setup the sync format menu */ if (ctk_gvo_sync->sync_source == NV_CTRL_GVO_SYNC_SOURCE_SDI) { return SYNC_FORMAT_SDI; } else if (ctk_gvo_sync->comp_mode == NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE_AUTO) { return SYNC_FORMAT_COMP_AUTO; } else if (ctk_gvo_sync->comp_mode == NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE_BI_LEVEL) { return SYNC_FORMAT_COMP_BI_LEVEL; } else if (ctk_gvo_sync->comp_mode == NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE_TRI_LEVEL){ return SYNC_FORMAT_COMP_TRI_LEVEL; } // should not get here return SYNC_FORMAT_SDI; } /* get_current_sync_format() */ /* * sync_signal_detected() - Returns whether or not a sync signal * is currently detected. */ static gboolean sync_signal_detected(CtkGvoSync *ctk_gvo_sync) { /* Is a sync signal detected? */ if ((ctk_gvo_sync->comp_sync_input_detected != NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED_FALSE) || (ctk_gvo_sync->sdi_sync_input_detected != NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED_NONE)) { return TRUE; } return FALSE; } /* * set_sync_format_menu() - Selects the sync format drop down menu * entry based on the current sync source and composite detection mode. */ static void set_sync_format_menu(CtkGvoSync *ctk_gvo_sync) { gint val = get_current_sync_format(ctk_gvo_sync); ctk_drop_down_menu_set_current_value (CTK_DROP_DOWN_MENU(ctk_gvo_sync->sync_format_menu), val); } /* * update_sync_lock_status_text() - Sets the correct text based on the * current state of input sync lock. */ static void update_sync_lock_status_text(CtkGvoSync *ctk_gvo_sync) { gchar *str = "Free Running"; switch (ctk_gvo_sync->sync_mode) { case NV_CTRL_GVO_SYNC_MODE_FREE_RUNNING: gtk_widget_set_sensitive(ctk_gvo_sync->sync_lock_status_text, FALSE); break; case NV_CTRL_GVO_SYNC_MODE_GENLOCK: gtk_widget_set_sensitive(ctk_gvo_sync->sync_lock_status_text, TRUE); if (ctk_gvo_sync->sync_lock_status == NV_CTRL_GVO_SYNC_LOCK_STATUS_LOCKED) { str = "GenLocked"; } break; case NV_CTRL_GVO_SYNC_MODE_FRAMELOCK: gtk_widget_set_sensitive(ctk_gvo_sync->sync_lock_status_text, TRUE); if (ctk_gvo_sync->sync_lock_status == NV_CTRL_GVO_SYNC_LOCK_STATUS_LOCKED) { str = "FrameLocked"; } break; default: gtk_widget_set_sensitive(ctk_gvo_sync->sync_lock_status_text, FALSE); str = "Unknown"; break; } gtk_label_set_text(GTK_LABEL(ctk_gvo_sync->sync_lock_status_text), str); } /* update_sync_lock_status_text() */ /**** Creation Functions *****************************************************/ /* * ctk_gvo_sync_new() - create a CtkGvoSync widget */ GtkWidget* ctk_gvo_sync_new(NvCtrlAttributeHandle *handle, GtkWidget *parent_window, CtkConfig *ctk_config, CtkEvent *ctk_event, CtkGvo *gvo_parent) { GObject *object; CtkGvoSync *ctk_gvo_sync; GtkWidget *frame; GtkWidget *hbox; GtkWidget *label; GtkWidget *alignment; GtkWidget *button; GtkWidget *table, *menu; gint val, i; NVCTRLAttributeValidValuesRec valid; ReturnStatus ret; gint row; const char *help_text; /* make sure we have a handle */ g_return_val_if_fail(handle != NULL, NULL); /* create and initialize the object */ object = g_object_new(CTK_TYPE_GVO_SYNC, NULL); ctk_gvo_sync = CTK_GVO_SYNC(object); ctk_gvo_sync->handle = handle; ctk_gvo_sync->parent_window = parent_window; ctk_gvo_sync->ctk_config = ctk_config; ctk_gvo_sync->ctk_event = ctk_event; ctk_gvo_sync->gvo_parent = gvo_parent; /* Query the current GVO state */ if ( !query_init_gvo_sync_state(ctk_gvo_sync) ) { // Free the object g_object_ref(object); gtk_object_sink(GTK_OBJECT(object)); g_object_unref(object); return NULL; } /* set container properties for the widget */ gtk_box_set_spacing(GTK_BOX(object), 10); /* banner */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, FALSE, 0); ctk_gvo_sync->banner_box = hbox; /* * Sync options */ frame = gtk_frame_new("Sync Options"); ctk_gvo_sync->frame = frame; gtk_box_pack_start(GTK_BOX(object), frame, FALSE, FALSE, 0); table = gtk_table_new(6, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 0); gtk_table_set_col_spacings(GTK_TABLE(table), 0); gtk_container_add(GTK_CONTAINER(frame), table); /* input video format */ label = gtk_label_new("Input Video Format: "); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, TABLE_PADDING, TABLE_PADDING); hbox = gtk_hbox_new(FALSE, 5); ctk_gvo_sync->input_video_format_text_entry = gtk_entry_new(); ctk_config_set_tooltip(ctk_config, ctk_gvo_sync->input_video_format_text_entry, __input_video_format_help); gtk_entry_set_width_chars (GTK_ENTRY(ctk_gvo_sync->input_video_format_text_entry), max_input_video_format_text_entry_length()); gtk_widget_set_sensitive(ctk_gvo_sync->input_video_format_text_entry, FALSE); update_input_video_format_text_entry(ctk_gvo_sync); gtk_box_pack_start(GTK_BOX(hbox), ctk_gvo_sync->input_video_format_text_entry, TRUE, TRUE, 0); /* Input video format detect button */ button = gtk_toggle_button_new_with_label("Detect"); alignment = gtk_alignment_new(1, 1, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), button); ctk_gvo_sync->input_video_format_detect_button = button; ctk_config_set_tooltip(ctk_config, button, __input_video_format_detect_help); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(detect_input_toggled), ctk_gvo_sync); gtk_box_pack_start(GTK_BOX(hbox), alignment, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, TABLE_PADDING, TABLE_PADDING); /* Composite Termination */ if (ctk_gvo_sync->caps & NV_CTRL_GVO_CAPABILITIES_COMPOSITE_TERMINATION) { button = gtk_check_button_new_with_label("Enable Composite Termination"); ctk_config_set_tooltip(ctk_config, button, __composite_termination_help); alignment = gtk_alignment_new(1, 1, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), button); gtk_table_attach(GTK_TABLE(table), alignment, 0, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL, TABLE_PADDING, TABLE_PADDING); ctk_gvo_sync->composite_termination_button = button; init_composite_termination(ctk_gvo_sync); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(composite_termination_toggled), ctk_gvo_sync); row = 3; } else { ctk_gvo_sync->composite_termination_button = NULL; row = 2; } /* Sync Mode */ menu = start_menu("Sync Mode: ", table, row); ctk_drop_down_menu_append_item(CTK_DROP_DOWN_MENU(menu), "Free Running", NV_CTRL_GVO_SYNC_MODE_FREE_RUNNING); ctk_drop_down_menu_append_item(CTK_DROP_DOWN_MENU(menu), "GenLock", NV_CTRL_GVO_SYNC_MODE_GENLOCK); ctk_drop_down_menu_append_item(CTK_DROP_DOWN_MENU(menu), "FrameLock", NV_CTRL_GVO_SYNC_MODE_FRAMELOCK); finish_menu(menu, table, row); row++; ctk_gvo_sync->sync_mode_menu = menu; ctk_config_set_tooltip(ctk_config, CTK_DROP_DOWN_MENU(menu)->option_menu, __sync_mode_help); ctk_drop_down_menu_set_current_value (CTK_DROP_DOWN_MENU(ctk_gvo_sync->sync_mode_menu), ctk_gvo_sync->sync_mode); g_signal_connect(G_OBJECT(ctk_gvo_sync->sync_mode_menu), "changed", G_CALLBACK(sync_mode_changed), (gpointer) ctk_gvo_sync); /* Sync Format */ menu = start_menu("Sync Format: ", table, row); for (i = 0; syncFormatNames[i].name; i++) { ctk_drop_down_menu_append_item(CTK_DROP_DOWN_MENU(menu), syncFormatNames[i].name, syncFormatNames[i].format); } finish_menu(menu, table, row); row++; ctk_gvo_sync->sync_format_menu = menu; ctk_config_set_tooltip(ctk_config, CTK_DROP_DOWN_MENU(menu)->option_menu, __sync_format_help); init_sync_format_menu(ctk_gvo_sync); g_signal_connect(G_OBJECT(ctk_gvo_sync->sync_format_menu), "changed", G_CALLBACK(sync_format_changed), (gpointer) ctk_gvo_sync); /* Sync Status */ label = gtk_label_new("Sync Status:"); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_FILL, GTK_FILL, TABLE_PADDING, TABLE_PADDING); ctk_gvo_sync->sync_lock_status_text = gtk_label_new(""); update_sync_lock_status_text(ctk_gvo_sync); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_gvo_sync->sync_lock_status_text, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, row, row+1, GTK_FILL /*| GTK_EXPAND*/, GTK_FILL, TABLE_PADDING, TABLE_PADDING); row++; /* * Synchronization Skew (Delay/Advance) */ /* NV_CTRL_GVO_SYNC_DELAY_PIXELS */ ret = NvCtrlGetValidAttributeValues(handle, NV_CTRL_GVO_SYNC_DELAY_PIXELS, &valid); if ((ret == NvCtrlSuccess) && (valid.type == ATTRIBUTE_TYPE_RANGE)) { ret = NvCtrlGetAttribute(handle, NV_CTRL_GVO_SYNC_DELAY_PIXELS, &val); if (ret != NvCtrlSuccess) val = 0; if (ctk_gvo_sync->caps & NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW) { label = gtk_label_new("HSync Advance:"); help_text = __hsync_advance_help; } else { label = gtk_label_new("HSync Delay:"); help_text = __hsync_delay_help; } gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_FILL, GTK_FILL, TABLE_PADDING, TABLE_PADDING); ctk_gvo_sync->hsync_delay_spin_button = gtk_spin_button_new_with_range(valid.u.range.min, valid.u.range.max, 1); ctk_config_set_tooltip(ctk_config, ctk_gvo_sync->hsync_delay_spin_button, help_text); gtk_spin_button_set_value (GTK_SPIN_BUTTON(ctk_gvo_sync->hsync_delay_spin_button), val); g_signal_connect(G_OBJECT(ctk_gvo_sync->hsync_delay_spin_button), "value-changed", G_CALLBACK(hsync_delay_changed), ctk_gvo_sync); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_gvo_sync->hsync_delay_spin_button, FALSE, FALSE, 0); label = gtk_label_new("(pixels)"); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, row, row+1, GTK_FILL /*| GTK_EXPAND*/, GTK_FILL, TABLE_PADDING, TABLE_PADDING); row++; } /* NV_CTRL_GVO_SYNC_DELAY_LINES */ ret = NvCtrlGetValidAttributeValues(handle, NV_CTRL_GVO_SYNC_DELAY_LINES, &valid); if ((ret == NvCtrlSuccess) && (valid.type == ATTRIBUTE_TYPE_RANGE)) { ret = NvCtrlGetAttribute(handle, NV_CTRL_GVO_SYNC_DELAY_LINES, &val); if (ret != NvCtrlSuccess) val = 0; if (ctk_gvo_sync->caps & NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW) { label = gtk_label_new("VSync Advance:"); help_text = __vsync_advance_help; } else { label = gtk_label_new("VSync Delay:"); help_text = __vsync_delay_help; } gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_FILL, GTK_FILL, TABLE_PADDING, TABLE_PADDING); ctk_gvo_sync->vsync_delay_spin_button = gtk_spin_button_new_with_range(valid.u.range.min, valid.u.range.max, 1); ctk_config_set_tooltip(ctk_config, ctk_gvo_sync->vsync_delay_spin_button, help_text); gtk_spin_button_set_value (GTK_SPIN_BUTTON(ctk_gvo_sync->vsync_delay_spin_button), val); g_signal_connect(G_OBJECT(ctk_gvo_sync->vsync_delay_spin_button), "value-changed", G_CALLBACK(vsync_delay_changed), ctk_gvo_sync); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_gvo_sync->vsync_delay_spin_button, FALSE, FALSE, 0); label = gtk_label_new("(lines)"); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, row, row+1, GTK_FILL /*| GTK_EXPAND*/, GTK_FILL, TABLE_PADDING, TABLE_PADDING); row++; } /* create the watch cursor (for use when the "Detect" button is toggled" */ ctk_gvo_sync->wait_cursor = gdk_cursor_new(GDK_WATCH); /* Set UI sensitivity */ update_gvo_sync_sensitivity(ctk_gvo_sync); /* Start listening for events */ register_for_gvo_sync_events(ctk_gvo_sync); /* show the page */ gtk_widget_show_all(GTK_WIDGET(object)); return GTK_WIDGET(object); } /* ctk_gvo_sync_new() */ /* * start_menu() - Start the creation of a labeled dropdown menu. (Packs * the dropdown label into the table row. */ static GtkWidget *start_menu(const gchar *name, GtkWidget *table, const gint row) { GtkWidget *menu, *label, *alignment; label = gtk_label_new(name); alignment = gtk_alignment_new(0, 0, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), label); gtk_table_attach(GTK_TABLE(table), alignment, 0, 1, row, row+1, GTK_FILL, GTK_FILL, TABLE_PADDING, TABLE_PADDING); menu = ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_MONOSPACE); return menu; } /* * finish_menu() - Finish/Finalize a dropdown menu. (Packs the menu in * the table row.) */ static void finish_menu(GtkWidget *menu, GtkWidget *table, const gint row) { gtk_widget_show_all(menu); gtk_table_attach(GTK_TABLE(table), menu, 1, 2, row, row+1, GTK_FILL | GTK_EXPAND, GTK_FILL, TABLE_PADDING, TABLE_PADDING); } /**** Initialization Functions ***********************************************/ /* * query_init_gvo_sync_state() - Query the initial GVO state so we can setup * the UI correctly. */ static gboolean query_init_gvo_sync_state(CtkGvoSync *ctk_gvo_sync) { gint val; ReturnStatus ret; /* Check if this screen supports GVO */ ret = NvCtrlGetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_SUPPORTED, &val); if ((ret != NvCtrlSuccess) || (val != NV_CTRL_GVO_SUPPORTED_TRUE)) { /* GVO not available */ return FALSE; } /* Get this GVO device's capabilities */ ret = NvCtrlGetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_CAPABILITIES, &val); if (ret != NvCtrlSuccess) return FALSE; ctk_gvo_sync->caps = val; /* Query the current input video formats */ ret = NvCtrlGetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVIO_VIDEO_FORMAT_NONE; } ctk_gvo_sync->input_video_format = val; /* Query the sync mode */ ret = NvCtrlGetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_SYNC_MODE, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVO_SYNC_MODE_FREE_RUNNING; } ctk_gvo_sync->sync_mode = val; /* query COMPOSITE_SYNC_INPUT_DETECTED */ ret = NvCtrlGetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED_FALSE; } ctk_gvo_sync->comp_sync_input_detected = val; /* query COMPOSITE_SYNC_INPUT_DETECT_MODE */ ret = NvCtrlGetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE_AUTO; } ctk_gvo_sync->comp_mode = val; /* query SDI_SYNC_INPUT_DETECTED */ ret = NvCtrlGetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED_NONE; } ctk_gvo_sync->sdi_sync_input_detected = val; /* query sync source */ ret = NvCtrlGetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_SYNC_SOURCE, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVO_SYNC_SOURCE_SDI; } ctk_gvo_sync->sync_source = val; /* Query framelock/genlock status */ ret = NvCtrlGetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_SYNC_LOCK_STATUS, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVO_SYNC_LOCK_STATUS_UNLOCKED; } ctk_gvo_sync->sync_lock_status = val; return TRUE; } /* query_init_gvo_sync_state() */ /* * init_composite_termination() - Initialize the state of the composite * termination button. */ static void init_composite_termination(CtkGvoSync *ctk_gvo_sync) { ReturnStatus ret; gint val; if (!ctk_gvo_sync->composite_termination_button) return; ret = NvCtrlGetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_COMPOSITE_TERMINATION, &val); if (ret != NvCtrlSuccess) { val = NV_CTRL_GVO_COMPOSITE_TERMINATION_DISABLE; } gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_gvo_sync->composite_termination_button), val == NV_CTRL_GVO_COMPOSITE_TERMINATION_ENABLE); } /* init_composite_termination() */ /* * init_sync_format_menu() - initialize the sync format menu */ static void init_sync_format_menu(CtkGvoSync *ctk_gvo_sync) { set_sync_format_menu(ctk_gvo_sync); } /* init_sync_format_menu() */ /* * register_for_gvo_sync_events() - Configure ctk_gvo_sync object to listen * for GVO synchronization related evens. */ static void register_for_gvo_sync_events(CtkGvoSync *ctk_gvo_sync) { g_signal_connect(G_OBJECT(ctk_gvo_sync->ctk_event), CTK_EVENT_NAME(NV_CTRL_GVO_SYNC_MODE), G_CALLBACK(gvo_sync_event_received), (gpointer) ctk_gvo_sync); g_signal_connect(G_OBJECT(ctk_gvo_sync->ctk_event), CTK_EVENT_NAME(NV_CTRL_GVO_SYNC_SOURCE), G_CALLBACK(gvo_sync_event_received), (gpointer) ctk_gvo_sync); g_signal_connect(G_OBJECT(ctk_gvo_sync->ctk_event), CTK_EVENT_NAME(NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE), G_CALLBACK(gvo_sync_event_received), (gpointer) ctk_gvo_sync); g_signal_connect(G_OBJECT(ctk_gvo_sync->ctk_event), CTK_EVENT_NAME(NV_CTRL_GVO_SYNC_DELAY_PIXELS), G_CALLBACK(gvo_sync_event_received), (gpointer) ctk_gvo_sync); g_signal_connect(G_OBJECT(ctk_gvo_sync->ctk_event), CTK_EVENT_NAME(NV_CTRL_GVO_SYNC_DELAY_LINES), G_CALLBACK(gvo_sync_event_received), (gpointer) ctk_gvo_sync); g_signal_connect(G_OBJECT(ctk_gvo_sync->ctk_event), CTK_EVENT_NAME(NV_CTRL_GVO_COMPOSITE_TERMINATION), G_CALLBACK(gvo_sync_event_received), (gpointer) ctk_gvo_sync); } /* register_for_gvo_sync_events() */ /**** Common Update Functions ************************************************/ /* * update_gvo_sync_sensitivity() - Updates the sensitivity of various UI * widgets based on whether or not an input sync signal is detected. * */ static void update_gvo_sync_sensitivity(CtkGvoSync *ctk_gvo_sync) { gboolean sensitive; /* Allow selection of the sync format if we're not free-running */ sensitive = (ctk_gvo_sync->sync_mode != NV_CTRL_GVO_SYNC_MODE_FREE_RUNNING); gtk_widget_set_sensitive(ctk_gvo_sync->sync_format_menu, sensitive); /* Update options that require a valid sync signal */ sensitive = (sensitive && sync_signal_detected(ctk_gvo_sync)); if (ctk_gvo_sync->hsync_delay_spin_button) { gtk_widget_set_sensitive(ctk_gvo_sync->hsync_delay_spin_button, sensitive); } if (ctk_gvo_sync->vsync_delay_spin_button) { gtk_widget_set_sensitive(ctk_gvo_sync->vsync_delay_spin_button, sensitive); } } /* update_gvo_sync_sensitivity() */ /* * update_input_video_format_text_entry() - Displays the currently detected * input video format. */ static void update_input_video_format_text_entry(CtkGvoSync *ctk_gvo_sync) { gint i; const gchar *str; if (ctk_gvo_sync->sync_mode == NV_CTRL_GVO_SYNC_MODE_FREE_RUNNING) { str = "Free Running"; } else { str = "No incoming signal detected"; for (i = 0; videoFormatNames[i].name; i++) { if (videoFormatNames[i].format == ctk_gvo_sync->input_video_format) { str = videoFormatNames[i].name; } } } gtk_entry_set_text(GTK_ENTRY(ctk_gvo_sync->input_video_format_text_entry), str); } /* update_input_video_format_text_entry() */ /* * post_composite_termination_toggled() - Call this function after * the composite termination attribute has changed. */ static void post_composite_termination_toggled(CtkGvoSync *ctk_gvo_sync, gboolean enabled) { /* update the statusbar */ ctk_config_statusbar_message(ctk_gvo_sync->ctk_config, "Composite Termination %s.", enabled ? "Enabled" : "Disabled"); } /* post_composite_termination_toggled() */ /* * post_sync_mode_menu_changed() - Call this function after the sync mode * menu has changed. * */ static void post_sync_mode_menu_changed(CtkGvoSync *ctk_gvo_sync, gint value) { char *name; /* Update the UI */ update_input_video_format_text_entry(ctk_gvo_sync); update_gvo_sync_sensitivity(ctk_gvo_sync); switch (value) { case NV_CTRL_GVO_SYNC_MODE_FREE_RUNNING: name = "Free Running"; break; case NV_CTRL_GVO_SYNC_MODE_GENLOCK: name = "GenLock"; break; case NV_CTRL_GVO_SYNC_MODE_FRAMELOCK: name = "FrameLock"; break; default: return; } ctk_config_statusbar_message(ctk_gvo_sync->ctk_config, "Sync Mode set to %s.", name); } /* post_sync_mode_menu_changed() */ /* * post_sync_format_menu_changed() - Call this function after the sync * format has changed. */ static void post_sync_format_menu_changed(CtkGvoSync *ctk_gvo_sync) { const char *name = "Unknown"; gint value; gint i; /* Update the status bar */ value = get_current_sync_format(ctk_gvo_sync); for (i = 0; syncFormatNames[i].name; i++) { if (syncFormatNames[i].format == value) { name = syncFormatNames[i].name; break; } } ctk_config_statusbar_message(ctk_gvo_sync->ctk_config, "Sync Format set to \"%s\".", name); } /* post_sync_format_menu_changed() */ /**** UI Event Handlers ************************************************/ /* * detect_input_toggled() - if the Detect button is enabled, then enable * INPUT_VIDEO_FORMAT_REACQUIRE, make everything else insensitive, * switch to the wait cursor, and queue detect_input_done() to be * called. */ static void detect_input_toggled(GtkToggleButton *togglebutton, CtkGvoSync *ctk_gvo_sync) { gboolean enabled; enabled = gtk_toggle_button_get_active(togglebutton); if (!enabled) return; /* grab the server */ gtk_grab_add(ctk_gvo_sync->input_video_format_detect_button); /* change the cursor */ gdk_window_set_cursor ((GTK_WIDGET(ctk_gvo_sync->parent_window))->window, ctk_gvo_sync->wait_cursor); /* make all other widgets insensitive */ gtk_widget_set_sensitive(ctk_gvo_sync->frame, FALSE); /* enable REACQUIRE */ NvCtrlSetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_INPUT_VIDEO_FORMAT_REACQUIRE, NV_CTRL_GVO_INPUT_VIDEO_FORMAT_REACQUIRE_TRUE); /* update the statusbar */ ctk_config_statusbar_message(ctk_gvo_sync->ctk_config, "Detecting incoming signal..."); /* register the "done" function */ g_timeout_add(DEFAULT_DETECT_INPUT_TIME_INTERVAL, detect_input_done, (gpointer) ctk_gvo_sync); } /* detect_input_toggled() */ /* * detect_input_done() - done detecting; disable REACQUIRE, make all * widgets sensitive again, and probe the new state */ static gint detect_input_done(gpointer data) { CtkGvoSync *ctk_gvo_sync = CTK_GVO_SYNC(data); /* disable REACQUIRE */ NvCtrlSetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_INPUT_VIDEO_FORMAT_REACQUIRE, NV_CTRL_GVO_INPUT_VIDEO_FORMAT_REACQUIRE_FALSE); /* reprobe */ ctk_gvo_banner_probe((gpointer)(ctk_gvo_sync->gvo_parent->banner)); /* un-press the detect button */ g_signal_handlers_block_by_func (G_OBJECT(ctk_gvo_sync->input_video_format_detect_button), G_CALLBACK(detect_input_toggled), (gpointer) ctk_gvo_sync); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_gvo_sync->input_video_format_detect_button), FALSE); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_gvo_sync->input_video_format_detect_button), G_CALLBACK(detect_input_toggled), (gpointer) ctk_gvo_sync); /* update the status bar */ ctk_config_statusbar_message(ctk_gvo_sync->ctk_config, "Done detecting incoming signal."); /* restore sensitivity */ gtk_widget_set_sensitive(ctk_gvo_sync->frame, TRUE); /* restore the cursor */ gdk_window_set_cursor((GTK_WIDGET(ctk_gvo_sync->parent_window))->window, NULL); /* ungrab the server */ gtk_grab_remove(ctk_gvo_sync->input_video_format_detect_button); return FALSE; } /* detect_input_done() */ /* * composite_termination_toggled() - Called when the user clicks * on the "Enable Composite Termination" check button. */ static void composite_termination_toggled(GtkWidget *button, CtkGvoSync *ctk_gvo_sync) { gboolean enabled; enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); NvCtrlSetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_COMPOSITE_TERMINATION, (enabled ? NV_CTRL_GVO_COMPOSITE_TERMINATION_ENABLE : NV_CTRL_GVO_COMPOSITE_TERMINATION_DISABLE)); post_composite_termination_toggled(ctk_gvo_sync, enabled); } /* composite_termination_toggled() */ /* * sync_mode_changed() - callback when the user makes a selection from the * sync mode menu. */ static void sync_mode_changed(CtkDropDownMenu *menu, gpointer user_data) { CtkGvoSync *ctk_gvo_sync = CTK_GVO_SYNC(user_data); gint value; value = ctk_drop_down_menu_get_current_value(menu); NvCtrlSetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_SYNC_MODE, value); if (value != NV_CTRL_GVO_SYNC_MODE_FREE_RUNNING) { NvCtrlSetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_SYNC_SOURCE, ctk_gvo_sync->sync_source); } ctk_gvo_sync->sync_mode = value; post_sync_mode_menu_changed(ctk_gvo_sync, value); } /* sync_mode_changed() */ /* * sync_format_changed() - callback when the user makes a selection from the * sync format menu (from the UI.) */ static void sync_format_changed(CtkDropDownMenu *menu, gpointer user_data) { CtkGvoSync *ctk_gvo_sync = CTK_GVO_SYNC(user_data); gint value, sync_source, comp_mode; value = ctk_drop_down_menu_get_current_value(menu); switch (value) { case SYNC_FORMAT_SDI: sync_source = NV_CTRL_GVO_SYNC_SOURCE_SDI; comp_mode = NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE_AUTO; break; case SYNC_FORMAT_COMP_AUTO: sync_source = NV_CTRL_GVO_SYNC_SOURCE_COMPOSITE; comp_mode = NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE_AUTO; break; case SYNC_FORMAT_COMP_BI_LEVEL: sync_source = NV_CTRL_GVO_SYNC_SOURCE_COMPOSITE; comp_mode = NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE_BI_LEVEL; break; case SYNC_FORMAT_COMP_TRI_LEVEL: sync_source = NV_CTRL_GVO_SYNC_SOURCE_COMPOSITE; comp_mode = NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE_TRI_LEVEL; break; default: return; } ctk_gvo_sync->sync_source = sync_source; ctk_gvo_sync->comp_mode = comp_mode; NvCtrlSetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_SYNC_SOURCE, sync_source); NvCtrlSetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE, comp_mode); post_sync_format_menu_changed(ctk_gvo_sync); } /* sync_format_changed() */ /* * hsync_delay_changed() - UI Callback function for when the user changes * the hsync delay. */ static void hsync_delay_changed(GtkSpinButton *spinbutton, gpointer user_data) { CtkGvoSync *ctk_gvo_sync = CTK_GVO_SYNC(user_data); gint val; val = gtk_spin_button_get_value(spinbutton); NvCtrlSetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_SYNC_DELAY_PIXELS, val); } /* hsync_delay_changed() */ /* * vsync_delay_changed() - UI Callback function for when the user changes * the vsync delay. */ static void vsync_delay_changed(GtkSpinButton *spinbutton, gpointer user_data) { CtkGvoSync *ctk_gvo_sync = CTK_GVO_SYNC(user_data); gint val; val = gtk_spin_button_get_value(spinbutton); NvCtrlSetAttribute(ctk_gvo_sync->handle, NV_CTRL_GVO_SYNC_DELAY_LINES, val); } /* vsync_delay_changed() */ /**** NV-CONTROL/Misc Event Handlers *****************************************/ /* * gvo_sync_event_received() - Callback function for handling * NV-CONTROL events. */ static void gvo_sync_event_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkEventStruct *event_struct = (CtkEventStruct *) arg1; CtkGvoSync *ctk_gvo_sync = CTK_GVO_SYNC(user_data); GtkWidget *widget; gint attribute = event_struct->attribute; gint value = event_struct->value; gboolean update_sync_format = FALSE; switch (attribute) { case NV_CTRL_GVO_SYNC_MODE: ctk_gvo_sync->sync_mode = value; widget = ctk_gvo_sync->sync_mode_menu; g_signal_handlers_block_by_func(G_OBJECT(widget), G_CALLBACK(sync_mode_changed), (gpointer) ctk_gvo_sync); ctk_drop_down_menu_set_current_value (CTK_DROP_DOWN_MENU(widget), value); g_signal_handlers_unblock_by_func(G_OBJECT(widget), G_CALLBACK(sync_mode_changed), (gpointer) ctk_gvo_sync); post_sync_mode_menu_changed(ctk_gvo_sync, value); break; case NV_CTRL_GVO_SYNC_SOURCE: ctk_gvo_sync->sync_source = value; update_sync_format = TRUE; break; case NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE: ctk_gvo_sync->comp_mode = value; update_sync_format = TRUE; break; case NV_CTRL_GVO_SYNC_DELAY_PIXELS: widget = ctk_gvo_sync->hsync_delay_spin_button; if (widget) { g_signal_handlers_block_by_func(G_OBJECT(widget), G_CALLBACK(hsync_delay_changed), (gpointer) ctk_gvo_sync); gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), value); g_signal_handlers_unblock_by_func(G_OBJECT(widget), G_CALLBACK(hsync_delay_changed), (gpointer) ctk_gvo_sync); } break; case NV_CTRL_GVO_SYNC_DELAY_LINES: widget = ctk_gvo_sync->vsync_delay_spin_button; if (widget) { g_signal_handlers_block_by_func(G_OBJECT(widget), G_CALLBACK(vsync_delay_changed), (gpointer) ctk_gvo_sync); gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), value); g_signal_handlers_unblock_by_func(G_OBJECT(widget), G_CALLBACK(vsync_delay_changed), (gpointer) ctk_gvo_sync); } break; case NV_CTRL_GVO_COMPOSITE_TERMINATION: widget = ctk_gvo_sync->composite_termination_button; if (widget) { g_signal_handlers_block_by_func (G_OBJECT(widget), G_CALLBACK(composite_termination_toggled), ctk_gvo_sync); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), value); g_signal_handlers_unblock_by_func (G_OBJECT(widget), G_CALLBACK(composite_termination_toggled), ctk_gvo_sync); post_composite_termination_toggled(ctk_gvo_sync, value); } break; } /* Update the sync format menu */ if (update_sync_format) { widget = ctk_gvo_sync->sync_format_menu; g_signal_handlers_block_by_func(G_OBJECT(widget), G_CALLBACK(sync_format_changed), (gpointer) ctk_gvo_sync); set_sync_format_menu(ctk_gvo_sync); g_signal_handlers_unblock_by_func(G_OBJECT(widget), G_CALLBACK(sync_format_changed), (gpointer) ctk_gvo_sync); post_sync_format_menu_changed(ctk_gvo_sync); } } /* gvo_sync_event_received() */ /* * gvo_sync_probe_callback() - Callback function for when the * sync signals are probed. */ static gint gvo_sync_probe_callback(gpointer data) { CtkGvoSync *ctk_gvo_sync = CTK_GVO_SYNC(data); CtkGvo *ctk_gvo = ctk_gvo_sync->gvo_parent; /* update our copies of some SDI state variables */ ctk_gvo_sync->input_video_format = CTK_GVO_BANNER(ctk_gvo->banner)->input_video_format; ctk_gvo_sync->comp_sync_input_detected = CTK_GVO_BANNER(ctk_gvo->banner)->composite_sync_input_detected; ctk_gvo_sync->sdi_sync_input_detected = CTK_GVO_BANNER(ctk_gvo->banner)->sdi_sync_input_detected; ctk_gvo_sync->sync_lock_status = CTK_GVO_BANNER(ctk_gvo->banner)->sync_lock_status; /* update the UI */ update_input_video_format_text_entry(ctk_gvo_sync); update_sync_lock_status_text(ctk_gvo_sync); update_gvo_sync_sensitivity(ctk_gvo_sync); return TRUE; } /* gvo_sync_probe_callback() */ /* * ctk_gvo_sync_select() - Callback function for when the GVO * sync config page is selected. */ void ctk_gvo_sync_select(GtkWidget *widget) { CtkGvoSync *ctk_gvo_sync = CTK_GVO_SYNC(widget); CtkGvo *ctk_gvo = ctk_gvo_sync->gvo_parent; /* Grab the GVO banner */ ctk_gvo_banner_set_parent(CTK_GVO_BANNER(ctk_gvo->banner), ctk_gvo_sync->banner_box, gvo_sync_probe_callback, ctk_gvo_sync); } /* * ctk_gvo_sync_unselect() - Callback function for when the GVO * sync config page is unselected. */ void ctk_gvo_sync_unselect(GtkWidget *widget) { CtkGvoSync *ctk_gvo_sync = CTK_GVO_SYNC(widget); CtkGvo *ctk_gvo = ctk_gvo_sync->gvo_parent; /* Release the GVO banner */ ctk_gvo_banner_set_parent(CTK_GVO_BANNER(ctk_gvo->banner), NULL, NULL, NULL); } /* * ctk_gvo_sync_create_help() - GVO sync configuration help page * creation. */ GtkTextBuffer* ctk_gvo_sync_create_help(GtkTextTagTable *table, CtkGvoSync *ctk_gvo_sync) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "GVO (Graphics to Video Out) Synchronization " "options"); ctk_help_para(b, &i, "This page gives access to configuration of the " "SDI synchronization options."); ctk_help_heading(b, &i, "Input Video Format"); ctk_help_para(b, &i, "%s", __input_video_format_help); ctk_help_heading(b, &i, "Input Video Format Detect"); ctk_help_para(b, &i, "%s", __input_video_format_detect_help); ctk_help_heading(b, &i, "Composite Termination"); ctk_help_para(b, &i, "%s. This allows the composite signal to be daisy " "chained from a server load.", __composite_termination_help); ctk_help_heading(b, &i, "Sync Mode"); ctk_help_para(b, &i, "%s", __sync_mode_help); ctk_help_heading(b, &i, "Sync Format"); ctk_help_para(b, &i, "%s", __sync_format_help); ctk_help_heading(b, &i, "Sync Status"); ctk_help_para(b, &i, "%s", __sync_status_help); if ( ctk_gvo_sync->caps & NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW ) { ctk_help_heading(b, &i, "HSync Advance"); ctk_help_para(b, &i, "%s", __hsync_advance_help); ctk_help_heading(b, &i, "VSync Advance"); ctk_help_para(b, &i, "%s", __vsync_advance_help); } else { ctk_help_heading(b, &i, "HSync Delay"); ctk_help_para(b, &i, "%s", __hsync_delay_help); ctk_help_heading(b, &i, "VSync Delay"); ctk_help_para(b, &i, "%s", __vsync_delay_help); } ctk_help_finish(b); return b; } nvidia-settings/src/gtk+-2.x/ctkbanner.h0000664000175000017500000000670312236467170020224 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2006 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_BANNER_H__ #define __CTK_BANNER_H__ G_BEGIN_DECLS #define CTK_TYPE_BANNER (ctk_banner_get_type()) #define CTK_BANNER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_BANNER, CtkBanner)) #define CTK_BANNER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_BANNER, CtkBannerClass)) #define CTK_IS_BANNER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_BANNER)) #define CTK_IS_BANNER_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_BANNER)) #define CTK_BANNER_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_BANNER, CtkBannerClass)) /* * enum for the banner artwork */ typedef enum { BANNER_ARTWORK_ANTIALIAS, BANNER_ARTWORK_BSD, BANNER_ARTWORK_CLOCK, BANNER_ARTWORK_COLOR, BANNER_ARTWORK_CONFIG, BANNER_ARTWORK_CRT, BANNER_ARTWORK_DFP, BANNER_ARTWORK_DISPLAY_CONFIG, BANNER_ARTWORK_FRAMELOCK, BANNER_ARTWORK_GLX, BANNER_ARTWORK_GPU, BANNER_ARTWORK_GVI, BANNER_ARTWORK_HELP, BANNER_ARTWORK_OPENGL, BANNER_ARTWORK_PENGUIN, BANNER_ARTWORK_SDI, BANNER_ARTWORK_SDI_SHARED_SYNC_BNC, BANNER_ARTWORK_SLIMM, BANNER_ARTWORK_SOLARIS, BANNER_ARTWORK_THERMAL, BANNER_ARTWORK_VCS, BANNER_ARTWORK_VDPAU, BANNER_ARTWORK_X, BANNER_ARTWORK_XVIDEO, BANNER_ARTWORK_SVP, BANNER_ARTWORK_INVALID } BannerArtworkType; typedef struct _CtkBanner CtkBanner; typedef struct _CtkBannerClass CtkBannerClass; typedef void (* ctk_banner_composite_callback) (CtkBanner *, void *); typedef struct { int w, h; GdkPixbuf *pixbuf; } PBuf; struct _CtkBanner { GtkDrawingArea parent; guint8 *image_data; PBuf back; PBuf artwork; int artwork_x; /* Position within banner where artwork is drawn */ int artwork_y; ctk_banner_composite_callback callback_func; void * callback_data; PBuf *background; PBuf *logo; int logo_x; /* Position within banner where logo is drawn */ int logo_y; int logo_pad_x; int logo_pad_y; int artwork_pad_x; }; struct _CtkBannerClass { GtkDrawingAreaClass parent_class; }; GType ctk_banner_get_type (void) G_GNUC_CONST; GtkWidget* ctk_banner_new (BannerArtworkType); void ctk_banner_set_composite_callback (CtkBanner *, ctk_banner_composite_callback, void *); GtkWidget* ctk_banner_image_new (BannerArtworkType artwork); GtkWidget* ctk_banner_image_new_with_callback (BannerArtworkType artwork, ctk_banner_composite_callback, void *); G_END_DECLS #endif /* __CTK_BANNER_H__ */ nvidia-settings/src/gtk+-2.x/ctkxvideo.h0000664000175000017500000000416412236467170020254 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_XVIDEO_H__ #define __CTK_XVIDEO_H__ #include "NvCtrlAttributes.h" #include "ctkconfig.h" #include "ctkevent.h" G_BEGIN_DECLS #define CTK_TYPE_XVIDEO (ctk_xvideo_get_type()) #define CTK_XVIDEO(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_XVIDEO, CtkXVideo)) #define CTK_XVIDEO_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_XVIDEO, CtkXVideoClass)) #define CTK_IS_XVIDEO(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_XVIDEO)) #define CTK_IS_XVIDEO_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_XVIDEO)) #define CTK_XVIDEO_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_XVIDEO, CtkXVideoClass)) typedef struct _CtkXVideo CtkXVideo; typedef struct _CtkXVideoClass CtkXVideoClass; struct _CtkXVideo { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; GtkWidget *xv_sync_to_display_buttons; /* first button in group */ GtkWidget *xv_sync_to_display_button_box; unsigned int active_attributes; }; struct _CtkXVideoClass { GtkVBoxClass parent_class; }; GType ctk_xvideo_get_type (void) G_GNUC_CONST; GtkWidget* ctk_xvideo_new (NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event); GtkTextBuffer *ctk_xvideo_create_help(GtkTextTagTable *, CtkXVideo *); G_END_DECLS #endif /* __CTK_XVIDEO_H__ */ nvidia-settings/src/gtk+-2.x/ctkcolorcorrectionpage.c0000664000175000017500000000724012236467170023012 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2012 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "NvCtrlAttributes.h" #include "ctkbanner.h" #include "ctkcolorcorrectionpage.h" #include "ctkcolorcorrection.h" #include "ctkconfig.h" #include "ctkhelp.h" #include #include GType ctk_color_correction_page_get_type( void ) { static GType ctk_color_correction_page_type = 0; if (!ctk_color_correction_page_type) { static const GTypeInfo ctk_color_correction_page_info = { sizeof (CtkColorCorrectionPageClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkColorCorrectionPage), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_color_correction_page_type = g_type_register_static(GTK_TYPE_VBOX, "CtkColorCorrectionPage", &ctk_color_correction_page_info, 0); } return ctk_color_correction_page_type; } GtkWidget* ctk_color_correction_page_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, ParsedAttribute *p, CtkEvent *ctk_event) { CtkColorCorrectionPage *ctk_color_correction_page; ReturnStatus ret; GObject *object; GtkWidget *banner; GtkWidget *ctk_color_correction; gint val; /* check if the VidMode extension is present */ ret = NvCtrlGetAttribute(handle, NV_CTRL_ATTR_EXT_VM_PRESENT, &val); if ((ret != NvCtrlSuccess) || (val == FALSE)) { return NULL; } /* check if the noScanout mode enabled */ ret = NvCtrlGetAttribute(handle, NV_CTRL_NO_SCANOUT, &val); if ((ret == NvCtrlSuccess) && (val == NV_CTRL_NO_SCANOUT_ENABLED)) { return NULL; } /* allocate the color correction widget */ ctk_color_correction = ctk_color_correction_new(handle, ctk_config, p, ctk_event); if (ctk_color_correction == NULL) { return NULL; } /* create the new page */ object = g_object_new(CTK_TYPE_COLOR_CORRECTION_PAGE, NULL); ctk_color_correction_page = CTK_COLOR_CORRECTION_PAGE(object); gtk_box_set_spacing(GTK_BOX(ctk_color_correction_page), 10); /* * pack the banner at the top of the page, followed by the color * correction widget */ banner = ctk_banner_image_new(BANNER_ARTWORK_COLOR); gtk_box_pack_start(GTK_BOX(ctk_color_correction_page), banner, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(ctk_color_correction_page), ctk_color_correction, TRUE, TRUE, 0); gtk_widget_show_all(GTK_WIDGET(object)); return GTK_WIDGET(object); } GtkTextBuffer *ctk_color_correction_page_create_help(GtkTextTagTable *table) { return ctk_color_correction_create_help(table); } nvidia-settings/src/gtk+-2.x/ctkedid.c0000664000175000017500000003126612236467170017661 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include /* memcpy(), strerror() */ #include #include #include "ctkedid.h" #include "ctkscale.h" #include "ctkconfig.h" #include "ctkhelp.h" #include #include #include #include #include #define FRAME_PADDING 5 /* file formats */ #define FILE_FORMAT_BINARY 1 #define FILE_FORMAT_ASCII 2 /* default file names */ #define DEFAULT_EDID_FILENAME_BINARY "edid.bin" #define DEFAULT_EDID_FILENAME_ASCII "edid.txt" static const char *__acquire_edid_help = "The Acquire EDID button allows you to save the display device's EDID " "(Extended Display Identification Data) information to a file. By " "default it saves information in binary format but one can also choose " "to save in ASCII format."; static void file_format_changed(GtkWidget *widget, gpointer user_data); static void normalize_filename(CtkEdid *ctk_edid); static void button_clicked(GtkButton *button, gpointer user_data); static gboolean write_edid_to_file(CtkConfig *ctk_config, const gchar *filename, int format, unsigned char *data, int len); GType ctk_edid_get_type(void) { static GType ctk_edid_type = 0; if (!ctk_edid_type) { static const GTypeInfo ctk_edid_info = { sizeof (CtkEdidClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init, */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkEdid), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_edid_type = g_type_register_static (GTK_TYPE_VBOX, "CtkEdid", &ctk_edid_info, 0); } return ctk_edid_type; } void ctk_edid_setup(CtkEdid *ctk_object) { ReturnStatus ret; gint val; ret = NvCtrlGetAttribute(ctk_object->handle, NV_CTRL_EDID_AVAILABLE, &val); if ((ret != NvCtrlSuccess) || (val != NV_CTRL_EDID_AVAILABLE_TRUE)) { gtk_widget_set_sensitive(ctk_object->button, FALSE); return; } gtk_widget_set_sensitive(ctk_object->button, TRUE); } GtkWidget* ctk_edid_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event, char *name) { CtkEdid *ctk_edid; GObject *object; GtkWidget *frame, *vbox, *label, *hbox, *alignment; /* create the object */ object = g_object_new(CTK_TYPE_EDID, NULL); if (!object) return NULL; ctk_edid = CTK_EDID(object); ctk_edid->handle = handle; ctk_edid->ctk_config = ctk_config; ctk_edid->name = name; ctk_edid->filename = DEFAULT_EDID_FILENAME_BINARY; ctk_edid->file_format = FILE_FORMAT_BINARY; ctk_edid->file_selector = gtk_file_selection_new("Please select file where " "EDID data will be " "saved."); gtk_file_selection_set_select_multiple (GTK_FILE_SELECTION(ctk_edid->file_selector), FALSE); /* create the frame and vbox */ frame = gtk_frame_new(NULL); vbox = gtk_vbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(vbox), FRAME_PADDING); gtk_container_add(GTK_CONTAINER(frame), vbox); gtk_box_pack_start(GTK_BOX(object), frame, FALSE, FALSE, 0); /* create the button and label */ label = gtk_label_new("Acquire EDID..."); hbox = gtk_hbox_new(FALSE, 0); ctk_edid->button = gtk_button_new(); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 15); gtk_container_add(GTK_CONTAINER(ctk_edid->button), hbox); alignment = gtk_alignment_new(1, 1, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), ctk_edid->button); gtk_box_pack_end(GTK_BOX(vbox), alignment, TRUE, TRUE, 0); ctk_config_set_tooltip(ctk_config, ctk_edid->button, __acquire_edid_help); g_signal_connect(G_OBJECT(ctk_edid->button), "clicked", G_CALLBACK(button_clicked), (gpointer) ctk_edid); /* adding file format selection option to file selector dialog */ frame = gtk_frame_new(NULL); gtk_box_pack_start (GTK_BOX(GTK_FILE_SELECTION(ctk_edid->file_selector)->main_vbox), frame, FALSE, FALSE, 15); gtk_box_reorder_child (GTK_BOX(GTK_FILE_SELECTION(ctk_edid->file_selector)->main_vbox), frame, 0); hbox = gtk_hbox_new(FALSE, 10); gtk_container_set_border_width(GTK_CONTAINER(hbox), FRAME_PADDING); gtk_container_add(GTK_CONTAINER(frame), hbox); label = gtk_label_new("EDID File Format: "); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); ctk_edid->file_format_binary_radio_button = gtk_radio_button_new_with_label(NULL, "Binary"); gtk_box_pack_start(GTK_BOX(hbox), ctk_edid->file_format_binary_radio_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(ctk_edid->file_format_binary_radio_button), "toggled", G_CALLBACK(file_format_changed), (gpointer) ctk_edid); ctk_edid->file_format_ascii_radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(ctk_edid->file_format_binary_radio_button), "ASCII"); gtk_box_pack_start(GTK_BOX(hbox), ctk_edid->file_format_ascii_radio_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(ctk_edid->file_format_ascii_radio_button), "toggled", G_CALLBACK(file_format_changed), (gpointer) ctk_edid); gtk_window_set_resizable(GTK_WINDOW(ctk_edid->file_selector), FALSE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(ctk_edid->file_format_binary_radio_button), TRUE); gtk_widget_show_all(GTK_FILE_SELECTION(ctk_edid->file_selector)->main_vbox); gtk_widget_show_all(GTK_WIDGET(object)); ctk_edid_setup(ctk_edid); return GTK_WIDGET(object); } /* ctk_edid_new() */ static void normalize_filename(CtkEdid *ctk_edid) { char *buffer = NULL, *filename = NULL; char *end = NULL, *slash = NULL; int len = 0, n; ctk_edid->filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(ctk_edid->file_selector)); len = strlen(ctk_edid->filename); filename = malloc(len + 1); if (!filename) { goto done; } strncpy(filename, ctk_edid->filename, len); /* * It is possible that filename is entered without any extension, * in that case we need to make room for the extension string e.g. * '.bin' or '.txt', so total buffer length will be filename plus 5. */ buffer = malloc(len + 5); if (!buffer) { goto done; } /* find the last forward slash (or the start of the filename) */ slash = strrchr(filename, '/'); if (!slash) { slash = filename; } /* * find where to truncate the filename: either the last period * after 'slash', or the end of the filename */ for (end = filename + len; end > slash; end--) { if (*end == '.') break; } if (end == slash) { end = filename + len; } /* * print the characters between filename and end; then append the * suffix */ n = end - filename; strncpy(buffer, filename, n); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(ctk_edid->file_format_binary_radio_button))) { ctk_edid->file_format = FILE_FORMAT_BINARY; snprintf(buffer + n, 5, ".bin"); } else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(ctk_edid->file_format_ascii_radio_button))) { ctk_edid->file_format = FILE_FORMAT_ASCII; snprintf(buffer + n, 5, ".txt"); } /* modify the file name as per the format selected */ gtk_file_selection_set_filename(GTK_FILE_SELECTION(ctk_edid->file_selector), buffer); done: free(filename); free(buffer); } static void file_format_changed(GtkWidget *widget, gpointer user_data) { CtkEdid *ctk_edid = CTK_EDID(user_data); normalize_filename(ctk_edid); } static void button_clicked(GtkButton *button, gpointer user_data) { ReturnStatus ret; CtkEdid *ctk_edid = CTK_EDID(user_data); unsigned char *data = NULL; int len = 0; gint result; /* Grab EDID information */ ret = NvCtrlGetBinaryAttribute(ctk_edid->handle, 0, NV_CTRL_BINARY_DATA_EDID, &data, &len); if (ret != NvCtrlSuccess) { ctk_config_statusbar_message(ctk_edid->ctk_config, "No EDID available for %s.", ctk_edid->name); } else { /* Ask user for filename */ gtk_file_selection_set_filename(GTK_FILE_SELECTION(ctk_edid->file_selector), ctk_edid->filename); result = gtk_dialog_run(GTK_DIALOG(ctk_edid->file_selector)); gtk_widget_hide(ctk_edid->file_selector); switch ( result ) { case GTK_RESPONSE_ACCEPT: case GTK_RESPONSE_OK: normalize_filename(ctk_edid); ctk_edid->filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(ctk_edid->file_selector)); write_edid_to_file(ctk_edid->ctk_config, ctk_edid->filename, ctk_edid->file_format, data, len); break; default: return; } } /* EDID available */ if (data) { XFree(data); } } /* button_clicked() */ static gboolean write_edid_to_file(CtkConfig *ctk_config, const gchar *filename, int format, unsigned char *data, int len) { int i; FILE *fp = NULL; char *msg = ""; char *tmpbuf = NULL, *pbuf = NULL; if (format == FILE_FORMAT_ASCII) { fp = fopen(filename, "wt"); if (!fp) { msg = "ASCII Mode: Unable to open file for writing"; goto fail; } /* * for printing every member we reserve 2 locations i.e. %02x and * one extra space to comply with NVIDIA Windows Control Panel * ASCII file output, so in all 3 bytes are required for every entry. */ tmpbuf = calloc(1, 1 + (len * 3)); if (!tmpbuf) { msg = "ASCII Mode: Could not allocate enough memory"; goto fail; } pbuf = tmpbuf; for (i = 0; i < len; i++) { if (sprintf(pbuf, "%02x ", data[i]) < 0) { msg = "ASCII Mode: Unable to write to buffer"; goto fail; } pbuf = pbuf + 3; } /* being extra cautious */ sprintf(pbuf, "%c", '\0'); if (fprintf(fp, "%s", tmpbuf) < 0) { msg = "ASCII Mode: Unable to write to file"; goto fail; } free(tmpbuf); tmpbuf = pbuf = NULL; } else { fp = fopen(filename, "wb"); if (!fp) { msg = "Binary Mode: Unable to open file for writing"; goto fail; } if (fwrite(data, 1, len, fp) != len) { msg = "Binary Mode: Unable to write to file"; goto fail; } } fclose(fp); ctk_config_statusbar_message(ctk_config, "EDID written to %s.", filename); return TRUE; fail: free(tmpbuf); tmpbuf = pbuf = NULL; if (fp) { fclose(fp); } ctk_config_statusbar_message(ctk_config, "Unable to write EDID to file '%s': %s (%s).", filename, msg, strerror(errno)); return FALSE; } /* write_edid_to_file() */ void add_acquire_edid_help(GtkTextBuffer *b, GtkTextIter *i) { ctk_help_heading(b, i, "Acquire EDID"); ctk_help_para(b, i, "%s", __acquire_edid_help); } /* add_acquire_edid_help() */ nvidia-settings/src/gtk+-2.x/ctkserver.h0000664000175000017500000000371512236467170020265 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_SERVER_H__ #define __CTK_SERVER_H__ #include "ctkevent.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_SERVER (ctk_server_get_type()) #define CTK_SERVER(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_SERVER, \ CtkServer)) #define CTK_SERVER_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_SERVER, \ CtkServerClass)) #define CTK_IS_SERVER(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_SERVER)) #define CTK_IS_SERVER_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_SERVER)) #define CTK_SERVER_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_SERVER, \ CtkServerClass)) typedef struct _CtkServer { GtkVBox parent; CtkConfig *ctk_config; NvCtrlAttributeHandle *handle; } CtkServer; typedef struct _CtkServerClass { GtkVBoxClass parent_class; } CtkServerClass; GType ctk_server_get_type (void) G_GNUC_CONST; GtkWidget* ctk_server_new (NvCtrlAttributeHandle *, CtkConfig *); GtkTextBuffer *ctk_server_create_help(GtkTextTagTable *, CtkServer *); G_END_DECLS #endif /* __CTK_SERVER_H__ */ nvidia-settings/src/gtk+-2.x/ctkapcprofilemodel.h0000664000175000017500000000731512236467170022124 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2013 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // Tree model implementation for operating on profiles in an AppProfileConfig #ifndef __CTK_APC_PROFILE_MODEL_H__ #define __CTK_APC_PROFILE_MODEL_H__ #include #include #include "app-profiles.h" G_BEGIN_DECLS #define CTK_TYPE_APC_PROFILE_MODEL (ctk_apc_profile_model_get_type()) #define CTK_APC_PROFILE_MODEL(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_APC_PROFILE_MODEL, CtkApcProfileModel)) #define CTK_APC_PROFILE_MODEL_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_APC_PROFILE_MODEL, CtkApcProfileModelClass)) #define CTK_IS_APC_PROFILE_MODEL(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_APC_PROFILE_MODEL)) #define CTK_IS_APC_PROFILE_MODEL_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_APC_PROFILE_MODEL)) #define CTK_APC_PROFILE_MODEL_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_APC_PROFILE_MODEL, CtkApcProfileModelClass)) enum { CTK_APC_PROFILE_MODEL_COL_NAME = 0, CTK_APC_PROFILE_MODEL_COL_FILENAME, CTK_APC_PROFILE_MODEL_COL_SETTINGS, CTK_APC_PROFILE_MODEL_N_COLUMNS, CTK_APC_PROFILE_MODEL_DEFAULT_SORT_COL = CTK_APC_PROFILE_MODEL_COL_NAME }; typedef struct _CtkApcProfileModel CtkApcProfileModel; typedef struct _CtkApcProfileModelClass CtkApcProfileModelClass; #define CTK_APC_PROFILE_MODEL_MAX_ITERS 16 struct _CtkApcProfileModel { GObject parent; gint stamp; AppProfileConfig *config; // A sortable array of profile names cached from the config, used for // presentation and iteration. GArray *profiles; gint sort_column_id; GtkSortType order; GtkTreeIterCompareFunc sort_funcs[CTK_APC_PROFILE_MODEL_N_COLUMNS]; gpointer sort_user_data[CTK_APC_PROFILE_MODEL_N_COLUMNS]; GDestroyNotify sort_destroy_notify[CTK_APC_PROFILE_MODEL_N_COLUMNS]; }; struct _CtkApcProfileModelClass { GObjectClass parent_class; }; GType ctk_apc_profile_model_class_get_type (void) G_GNUC_CONST; GType ctk_apc_profile_model_get_type(void) G_GNUC_CONST; CtkApcProfileModel *ctk_apc_profile_model_new (AppProfileConfig *config); void ctk_apc_profile_model_update_profile(CtkApcProfileModel *prof_model, const char *filename, const char *profile_name, json_t *profile); void ctk_apc_profile_model_delete_profile(CtkApcProfileModel *prof_model, const char *profile_name); void ctk_apc_profile_model_attach(CtkApcProfileModel *prof_model, AppProfileConfig *config); // Thin wrapper around nv_app_profile_config_get_profile() to promote // modularity (all requests for config data should go through the models). static inline const json_t *ctk_apc_profile_model_get_profile(CtkApcProfileModel *prof_model, const char *profile_name) { return nv_app_profile_config_get_profile(prof_model->config, profile_name); } G_END_DECLS #endif nvidia-settings/src/gtk+-2.x/ctkpowersavings.h0000664000175000017500000000421212236467170021477 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CTK_POWER_SAVINGS_H__ #define __CTK_POWER_SAVINGS_H__ #include "ctkevent.h" #include "ctkconfig.h" G_BEGIN_DECLS #define CTK_TYPE_POWER_SAVINGS (ctk_power_savings_get_type()) #define CTK_POWER_SAVINGS(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_POWER_SAVINGS, CtkPowerSavings)) #define CTK_POWER_SAVINGS_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_POWER_SAVINGS, CtkPowerSavingsClass)) #define CTK_IS_POWER_SAVINGS(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_POWER_SAVINGS)) #define CTK_IS_POWER_SAVINGS_CLASS(class) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_POWER_SAVINGS)) #define CTK_POWER_SAVINGS_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_POWER_SAVINGS, CtkPowerSavingsClass)) typedef struct _CtkPowerSavings CtkPowerSavings; typedef struct _CtkPowerSavingsClass CtkPowerSavingsClass; struct _CtkPowerSavings { GtkVBox parent; NvCtrlAttributeHandle *handle; CtkConfig *ctk_config; GtkWidget *vblank_control_button; }; struct _CtkPowerSavingsClass { GtkVBoxClass parent_class; }; GType ctk_power_savings_get_type (void) G_GNUC_CONST; GtkWidget* ctk_power_savings_new (NvCtrlAttributeHandle *, CtkConfig *, CtkEvent *); GtkTextBuffer *ctk_power_savings_create_help(GtkTextTagTable *, CtkPowerSavings *); G_END_DECLS #endif /* __CTK_POWER_SAVINGS_H__ */ nvidia-settings/src/gtk+-2.x/ctkgpu.c0000664000175000017500000006507212236467170017551 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "NvCtrlAttributes.h" #include #include #include #include "msg.h" #include "parse.h" #include "ctkbanner.h" #include "ctkgpu.h" #include "ctkhelp.h" #include "ctkutils.h" #include "XF86Config-parser/xf86Parser.h" static void probe_displays_received(GtkObject *object, gpointer arg1, gpointer user_data); static gboolean update_gpu_usage(gpointer); #define ARRAY_ELEMENTS 16 #define DEFAULT_UPDATE_GPU_INFO_TIME_INTERVAL 3000 typedef struct { gint graphics; gint video; gint pcie; } utilizationEntry, * utilizationEntryPtr; GType ctk_gpu_get_type( void ) { static GType ctk_gpu_type = 0; if (!ctk_gpu_type) { static const GTypeInfo info_ctk_gpu = { sizeof (CtkGpuClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkGpu), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_gpu_type = g_type_register_static(GTK_TYPE_VBOX, "CtkGpu", &info_ctk_gpu, 0); } return ctk_gpu_type; } static gchar *make_display_device_list(NvCtrlAttributeHandle *handle) { return create_display_name_list_string(handle, NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU); } /* make_display_device_list() */ void get_bus_type_str(NvCtrlAttributeHandle *handle, gchar **bus) { int tmp, ret, bus_type; gchar *bus_type_str, *bus_rate, *pcie_gen; bus_type = 0xffffffff; bus_type_str = "Unknown"; ret = NvCtrlGetAttribute(handle, NV_CTRL_BUS_TYPE, &bus_type); if (ret == NvCtrlSuccess) { if (bus_type == NV_CTRL_BUS_TYPE_AGP) bus_type_str = "AGP"; else if (bus_type == NV_CTRL_BUS_TYPE_PCI) bus_type_str = "PCI"; else if (bus_type == NV_CTRL_BUS_TYPE_PCI_EXPRESS) bus_type_str = "PCI Express"; else if (bus_type == NV_CTRL_BUS_TYPE_INTEGRATED) bus_type_str = "Integrated"; } /* NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH */ bus_rate = NULL; if (bus_type == NV_CTRL_BUS_TYPE_AGP || bus_type == NV_CTRL_BUS_TYPE_PCI_EXPRESS) { ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH, &tmp); if (ret == NvCtrlSuccess) { if (bus_type == NV_CTRL_BUS_TYPE_PCI_EXPRESS) { bus_rate = g_strdup_printf("x%u", tmp); } else { bus_rate = g_strdup_printf("%uX", tmp); } } } /* NV_CTRL_GPU_PCIE_GENERATION */ pcie_gen = NULL; if (bus_type == NV_CTRL_BUS_TYPE_PCI_EXPRESS) { pcie_gen = get_pcie_generation_string(handle); } /* concatenate all the available bus related information */ if (bus_rate || pcie_gen) { *bus = g_strdup_printf("%s %s%s%s", bus_type_str, bus_rate ? bus_rate : "", bus_rate ? " " : "", pcie_gen ? pcie_gen : ""); g_free(bus_rate); g_free(pcie_gen); } else { *bus = g_strdup(bus_type_str); } } gchar *get_bus_id_str(NvCtrlAttributeHandle *handle) { int ret; int pci_domain, pci_bus, pci_device, pci_func; gchar *bus_id; /* NV_CTRL_PCI_DOMAIN & NV_CTRL_PCI_BUS & * NV_CTRL_PCI_DEVICE & NV__CTRL_PCI_FUNCTION */ ret = NvCtrlGetAttribute(handle, NV_CTRL_PCI_DOMAIN, &pci_domain); if (ret != NvCtrlSuccess) { return NULL; } ret = NvCtrlGetAttribute(handle, NV_CTRL_PCI_BUS, &pci_bus); if (ret != NvCtrlSuccess) { return NULL; } ret = NvCtrlGetAttribute(handle, NV_CTRL_PCI_DEVICE, &pci_device); if (ret != NvCtrlSuccess) { return NULL; } ret = NvCtrlGetAttribute(handle, NV_CTRL_PCI_FUNCTION, &pci_func); if (ret != NvCtrlSuccess) { return NULL; } bus_id = g_malloc(32); if (!bus_id) { return NULL; } xconfigFormatPciBusString(bus_id, 32, pci_domain, pci_bus, pci_device, pci_func); return bus_id; } GtkWidget* ctk_gpu_new( NvCtrlAttributeHandle *handle, CtrlHandleTarget *t, CtkEvent *ctk_event, CtkConfig *ctk_config ) { GObject *object; CtkGpu *ctk_gpu; GtkWidget *label; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *banner; GtkWidget *hseparator; GtkWidget *table; char *product_name, *vbios_version, *video_ram, *gpu_memory_text, *irq; char *gpu_uuid; gchar *pci_bus_id; gchar pci_device_id[ARRAY_ELEMENTS]; gchar pci_vendor_id[ARRAY_ELEMENTS]; int pci_id; int tmp; ReturnStatus ret; gchar *screens; gchar *displays; gchar *tmp_str; gchar *gpu_cores; gchar *memory_interface; gchar *bus = NULL; gchar *link_speed_str = NULL; gchar *link_width_str = NULL; gchar *pcie_gen_str = NULL; int xinerama_enabled; int *pData; int len; int i; int row = 0; int total_rows = 21; int gpu_memory; /* * get the data that we will display below * * XXX should be able to update any of this if an attribute * changes. */ /* NV_CTRL_XINERAMA */ ret = NvCtrlGetAttribute(handle, NV_CTRL_XINERAMA, &xinerama_enabled); if (ret != NvCtrlSuccess) { xinerama_enabled = FALSE; } /* NV_CTRL_STRING_PRODUCT_NAME */ ret = NvCtrlGetStringAttribute(handle, NV_CTRL_STRING_PRODUCT_NAME, &product_name); if (ret != NvCtrlSuccess) { product_name = NULL; } ret = NvCtrlGetStringAttribute(handle, NV_CTRL_STRING_GPU_UUID, &gpu_uuid); if (ret != NvCtrlSuccess) { gpu_uuid = NULL; } /* Get Bus related information */ pci_bus_id = get_bus_id_str(handle); /* NV_CTRL_PCI_ID */ memset(&pci_device_id, 0, sizeof(pci_device_id)); memset(&pci_vendor_id, 0, sizeof(pci_vendor_id)); ret = NvCtrlGetAttribute(handle, NV_CTRL_PCI_ID, &pci_id); if (ret == NvCtrlSuccess) { snprintf(pci_device_id, ARRAY_ELEMENTS, "0x%04x", (pci_id & 0xFFFF)); snprintf(pci_vendor_id, ARRAY_ELEMENTS, "0x%04x", (pci_id >> 16)); } /* NV_CTRL_STRING_VBIOS_VERSION */ ret = NvCtrlGetStringAttribute(handle, NV_CTRL_STRING_VBIOS_VERSION, &vbios_version); if (ret != NvCtrlSuccess) vbios_version = NULL; /* NV_CTRL_VIDEO_RAM */ ret = NvCtrlGetAttribute(handle, NV_CTRL_VIDEO_RAM, &tmp); if (ret != NvCtrlSuccess) { video_ram = NULL; } else { video_ram = g_strdup_printf("%d MB", tmp >> 10); } /* NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY */ ret = NvCtrlGetAttribute(handle, NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY, &gpu_memory); if (ret != NvCtrlSuccess) { gpu_memory_text = NULL; } else { gpu_memory_text = g_strdup_printf("%d MB", gpu_memory); } /* NV_CTRL_GPU_CORES */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_CORES, &tmp); if (ret != NvCtrlSuccess) { gpu_cores = NULL; } else { gpu_cores = g_strdup_printf("%d", tmp); } /* NV_CTRL_GPU_MEMORY_BUS_WIDTH */ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_MEMORY_BUS_WIDTH, &tmp); if (ret != NvCtrlSuccess) { memory_interface = NULL; } else { memory_interface = g_strdup_printf("%d-bit", tmp); } /* NV_CTRL_IRQ */ ret = NvCtrlGetAttribute(handle, NV_CTRL_IRQ, &tmp); if (ret != NvCtrlSuccess) { irq = NULL; } else { irq = g_strdup_printf("%d", tmp); } /* List of X Screens using the GPU */ screens = NULL; ret = NvCtrlGetBinaryAttribute(handle, 0, NV_CTRL_BINARY_DATA_XSCREENS_USING_GPU, (unsigned char **)(&pData), &len); if (ret == NvCtrlSuccess) { if (pData[0] == 0) { screens = g_strdup("None"); } else { NvCtrlAttributeHandle *screen_handle; if (xinerama_enabled) { screens = g_strdup("Screen 0 (Xinerama)"); /* XXX Use the only screen handle we have. * This is currently OK since we only * query xinerama attributes with this * handle below. If we needed to query * a screen-specific attribute below, * then we would need to get a handle * for the correct screen instead. */ screen_handle = t[0].h; } else { for (i = 1; i <= pData[0]; i++) { if (screens) { tmp_str = g_strdup_printf("%s,\nScreen %d", screens, pData[i]); } else { tmp_str = g_strdup_printf("Screen %d", pData[i]); } g_free(screens); screens = tmp_str; } screen_handle = t[pData[1]].h; } ret = NvCtrlGetAttribute(screen_handle, NV_CTRL_SHOW_SLI_VISUAL_INDICATOR, &tmp); if (ret == NvCtrlSuccess) { tmp_str = g_strdup_printf("%s (SLI)", screens); g_free(screens); screens = tmp_str; } } XFree(pData); } if (!screens) { screens = g_strdup("Unknown"); } /* now, create the object */ object = g_object_new(CTK_TYPE_GPU, NULL); ctk_gpu = CTK_GPU(object); /* cache the attribute handle */ ctk_gpu->handle = handle; ctk_gpu->gpu_cores = (gpu_cores != NULL) ? 1 : 0; ctk_gpu->gpu_uuid = (gpu_uuid != NULL) ? 1 : 0; ctk_gpu->memory_interface = (memory_interface != NULL) ? 1 : 0; ctk_gpu->ctk_config = ctk_config; ctk_gpu->ctk_event = ctk_event; ctk_gpu->pcie_gen_queriable = FALSE; ctk_gpu->gpu_memory = gpu_memory; /* set container properties of the object */ gtk_box_set_spacing(GTK_BOX(ctk_gpu), 10); /* banner */ banner = ctk_banner_image_new(BANNER_ARTWORK_GPU); gtk_box_pack_start(GTK_BOX(ctk_gpu), banner, FALSE, FALSE, 0); /* PCIe link information */ get_bus_type_str(handle, &bus); pcie_gen_str = get_pcie_generation_string(handle); if (pcie_gen_str) { ctk_gpu->pcie_gen_queriable = TRUE; link_speed_str = get_pcie_link_speed_string(ctk_gpu->handle, NV_CTRL_GPU_PCIE_MAX_LINK_SPEED); link_width_str = get_pcie_link_width_string(ctk_gpu->handle, NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH); } /* * GPU information: TOP->MIDDLE - LEFT->RIGHT * * This displays basic display adapter information, including * product name, bios version, bus type, video ram and interrupt * line. */ vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(ctk_gpu), vbox, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new("Graphics Card Information"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); table = gtk_table_new(total_rows, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); add_table_row(table, row++, 0, 0.5, "Graphics Processor:", 0, 0.5, product_name); if ( ctk_gpu->gpu_uuid ) { add_table_row(table, row++, 0, 0.5, "GPU UUID:", 0, 0.5, gpu_uuid); } if ( ctk_gpu->gpu_cores ) { gtk_table_resize(GTK_TABLE(table), ++total_rows, 2); add_table_row(table, row++, 0, 0.5, "CUDA Cores:", 0, 0.5, gpu_cores); } if ( vbios_version ) { add_table_row(table, row++, 0, 0.5, "VBIOS Version:", 0, 0.5, vbios_version); } add_table_row(table, row++, 0, 0.5, "Total Memory:", 0, 0.5, video_ram); add_table_row(table, row++, 0, 0.5, "Total Dedicated Memory:", 0, 0.5, gpu_memory_text); ctk_gpu->gpu_memory_used_label = add_table_row(table, row++, 0, 0.5, "Used Dedicated Memory:", 0, 0.5, NULL); if ( ctk_gpu->memory_interface ) { gtk_table_resize(GTK_TABLE(table), ++total_rows, 2); add_table_row(table, row++, 0, 0.5, "Memory Interface:", 0, 0.5, memory_interface); } ctk_gpu->gpu_utilization_label = add_table_row(table, row++, 0, 0.5, "GPU Utilization:", 0, 0.5, NULL); ctk_gpu->video_utilization_label = add_table_row(table, row++, 0, 0.5, "Video Engine Utilization:", 0, 0.5, NULL); /* spacing */ row += 3; add_table_row(table, row++, 0, 0.5, "Bus Type:", 0, 0.5, bus); if ( pci_bus_id ) { add_table_row(table, row++, 0, 0.5, "Bus ID:", 0, 0.5, pci_bus_id); } if ( pci_device_id[0] ) { add_table_row(table, row++, 0, 0.5, "PCI Device ID:", 0, 0.5, pci_device_id); } if (pci_vendor_id[0] ) { add_table_row(table, row++, 0, 0.5, "PCI Vendor ID:", 0, 0.5, pci_vendor_id); } if ( irq ) { add_table_row(table, row++, 0, 0.5, "IRQ:", 0, 0.5, irq); } if (ctk_gpu->pcie_gen_queriable) { /* spacing */ row += 3; add_table_row(table, row++, 0, 0.5, "PCIe Generation:", 0, 0.5, pcie_gen_str); add_table_row(table, row++, 0, 0.5, "Maximum PCIe Link Width:", 0, 0.5, link_width_str); add_table_row(table, row++, 0, 0.5, "Maximum PCIe Link Speed:", 0, 0.5, link_speed_str); ctk_gpu->pcie_utilization_label = add_table_row(table, row++, 0, 0.5, "PCIe Bandwidth Utilization:", 0, 0.5, NULL); g_free(link_speed_str); g_free(link_width_str); g_free(pcie_gen_str); row++; } update_gpu_usage(ctk_gpu); /* spacing */ row += 3; add_table_row(table, row++, 0, 0, "X Screens:", 0, 0, screens); /* spacing */ displays = make_display_device_list(handle); row += 3; ctk_gpu->displays = add_table_row(table, row, 0, 0, "Display Devices:", 0, 0, displays); XFree(product_name); XFree(vbios_version); g_free(video_ram); g_free(gpu_cores); g_free(memory_interface); g_free(pci_bus_id); g_free(irq); g_free(screens); g_free(displays); g_free(bus); g_free(gpu_memory_text); gtk_widget_show_all(GTK_WIDGET(object)); /* Handle events */ g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_PROBE_DISPLAYS), G_CALLBACK(probe_displays_received), (gpointer) ctk_gpu); tmp_str = g_strdup_printf("Memory Used (GPU %d)", NvCtrlGetTargetId(handle)); ctk_config_add_timer(ctk_gpu->ctk_config, DEFAULT_UPDATE_GPU_INFO_TIME_INTERVAL, tmp_str, (GSourceFunc) update_gpu_usage, (gpointer) ctk_gpu); g_free(tmp_str); return GTK_WIDGET(object); } GtkTextBuffer *ctk_gpu_create_help(GtkTextTagTable *table, CtkGpu *ctk_gpu) { GtkTextIter i; GtkTextBuffer *b; b = gtk_text_buffer_new(table); gtk_text_buffer_get_iter_at_offset(b, &i, 0); ctk_help_title(b, &i, "Graphics Card Information Help"); ctk_help_para(b, &i, "This page in the NVIDIA " "X Server Control Panel describes basic " "information about the Graphics Processing Unit " "(GPU)."); ctk_help_heading(b, &i, "Graphics Processor"); ctk_help_para(b, &i, "This is the product name of the GPU."); if (ctk_gpu->gpu_uuid) { ctk_help_heading(b, &i, "GPU UUID"); ctk_help_para(b, &i, "This is the global unique identifier " "of the GPU."); } if (ctk_gpu->gpu_cores) { ctk_help_heading(b, &i, "CUDA Cores"); ctk_help_para(b, &i, "This is the number of CUDA cores supported by " "the graphics pipeline."); } ctk_help_heading(b, &i, "VBIOS Version"); ctk_help_para(b, &i, "This is the Video BIOS version."); ctk_help_heading(b, &i, "Total Memory"); ctk_help_para(b, &i, "This is the overall amount of memory " "available to your GPU. With TurboCache(TM) GPUs, " "this value may exceed the amount of video " "memory installed on the graphics card. With " "integrated GPUs, the value may exceed the amount of " "dedicated system memory set aside by the system " "BIOS for use by the integrated GPU."); ctk_help_heading(b, &i, "Total Dedicated Memory"); ctk_help_para(b, &i, "This is the amount of memory dedicated " "exclusively to your GPU."); ctk_help_heading(b, &i, "Used Dedicated Memory"); ctk_help_para(b, &i, "This is the amount of dedicated memory used " "by your GPU."); if (ctk_gpu->memory_interface) { ctk_help_heading(b, &i, "Memory Interface"); ctk_help_para(b, &i, "This is the bus bandwidth of the GPU's " "memory interface."); } ctk_help_heading(b, &i, "GPU Utilization"); ctk_help_para(b, &i, "This is the percentage usage of graphics engine."); ctk_help_heading(b, &i, "Video Engine Utilization"); ctk_help_para(b, &i, "This is the percentage usage of video engine"); ctk_help_heading(b, &i, "Bus Type"); ctk_help_para(b, &i, "This is the bus type which is " "used to connect the NVIDIA GPU to the rest of " "your computer; possible values are AGP, PCI, " "PCI Express and Integrated."); ctk_help_heading(b, &i, "Bus ID"); ctk_help_para(b, &i, "This is the GPU's PCI identification string, " "in X configuration file 'BusID' format: " "\"bus:device:function\", or, if the PCI domain of the GPU " "is non-zero, \"bus@domain:device:function\". Note " "that all values are in decimal (as opposed to hexadecimal, " "which is how `lspci` formats its BusID values)."); ctk_help_heading(b, &i, "PCI Device ID"); ctk_help_para(b, &i, "This is the PCI Device ID of the GPU."); ctk_help_heading(b, &i, "PCI Vendor ID"); ctk_help_para(b, &i, "This is the PCI Vendor ID of the GPU."); ctk_help_heading(b, &i, "IRQ"); ctk_help_para(b, &i, "This is the interrupt request line assigned to " "this GPU."); if (ctk_gpu->pcie_gen_queriable) { ctk_help_heading(b, &i, "PCIe Generation"); ctk_help_para(b, &i, "This is the PCIe generation that this GPU, in " "this system, is compliant with."); ctk_help_heading(b, &i, "Maximum PCIe Link Width"); ctk_help_para(b, &i, "This is the maximum width that the PCIe link " "between the GPU and the system may be trained to. This " "is expressed in number of lanes. The trained link " "width may vary dynamically and possibly be narrower " "based on the GPU's utilization and performance " "settings."); ctk_help_heading(b, &i, "Maximum PCIe Link Speed"); ctk_help_para(b, &i, "This is the maximum speed that the PCIe link " "between the GPU and the system may be trained to. " "This is expressed in gigatransfers per second " "(GT/s). The link may be dynamically trained to a " "slower speed, based on the GPU's utilization and " "performance settings."); ctk_help_heading(b, &i, "PCIe Bandwidth Utilization"); ctk_help_para(b, &i, "This is the percentage usage of " "PCIe bandwidth."); } ctk_help_heading(b, &i, "X Screens"); ctk_help_para(b, &i, "This is the list of X Screens driven by this GPU."); ctk_help_heading(b, &i, "Display Devices"); ctk_help_para(b, &i, "This is the list of Display Devices (CRTs, TVs etc) " "enabled on this GPU."); ctk_help_finish(b); return b; } static void probe_displays_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkGpu *ctk_object = CTK_GPU(user_data); gchar *str; str = make_display_device_list(ctk_object->handle); gtk_label_set_text(GTK_LABEL(ctk_object->displays), str); g_free(str); } static void apply_gpu_utilization_token(char *token, char *value, void *data) { utilizationEntryPtr pEntry = (utilizationEntryPtr) data; if (!strcasecmp("graphics", token)) { pEntry->graphics = atoi(value); } else if (!strcasecmp("video", token)) { pEntry->video = atoi(value); } else if (!strcasecmp("pcie", token)) { pEntry->pcie = atoi(value); } else { nv_warning_msg("Unknown GPU utilization token value pair: %s=%s", token, value); } } static gboolean update_gpu_usage(gpointer user_data) { CtkGpu *ctk_gpu; gchar *memory_text; gchar *utilization_text = NULL; ReturnStatus ret; gchar *utilizationStr = NULL; gint value = 0; utilizationEntry entry; ctk_gpu = CTK_GPU(user_data); ret = NvCtrlGetAttribute(ctk_gpu->handle, NV_CTRL_USED_DEDICATED_GPU_MEMORY, &value); if (ret != NvCtrlSuccess || value > ctk_gpu->gpu_memory || value < 0) { gtk_label_set_text(GTK_LABEL(ctk_gpu->gpu_memory_used_label), "Unknown"); return FALSE; } else { if (ctk_gpu->gpu_memory > 0) { memory_text = g_strdup_printf("%d MB (%.0f%%)", value, 100.0 * (double) value / (double) ctk_gpu->gpu_memory); } else { memory_text = g_strdup_printf("%d MB", value); } gtk_label_set_text(GTK_LABEL(ctk_gpu->gpu_memory_used_label), memory_text); g_free(memory_text); } /* GPU utilization */ ret = NvCtrlGetStringAttribute(ctk_gpu->handle, NV_CTRL_STRING_GPU_UTILIZATION, &utilizationStr); if (ret != NvCtrlSuccess) { gtk_label_set_text(GTK_LABEL(ctk_gpu->gpu_utilization_label), "Unknown"); gtk_label_set_text(GTK_LABEL(ctk_gpu->video_utilization_label), "Unknown"); if (ctk_gpu->pcie_utilization_label) { gtk_label_set_text(GTK_LABEL(ctk_gpu->pcie_utilization_label), "Unknown"); } return FALSE; } else { memset(&entry, -1, sizeof(&entry)); parse_token_value_pairs(utilizationStr, apply_gpu_utilization_token, &entry); if (entry.graphics != -1) { utilization_text = g_strdup_printf("%d %%", entry.graphics); gtk_label_set_text(GTK_LABEL(ctk_gpu->gpu_utilization_label), utilization_text); } if (entry.video != -1) { utilization_text = g_strdup_printf("%d %%", entry.video); gtk_label_set_text(GTK_LABEL(ctk_gpu->video_utilization_label), utilization_text); } if ((entry.pcie != -1) && (ctk_gpu->pcie_utilization_label)) { utilization_text = g_strdup_printf("%d %%", entry.pcie); gtk_label_set_text(GTK_LABEL(ctk_gpu->pcie_utilization_label), utilization_text); } g_free(utilization_text); } return TRUE; } void ctk_gpu_page_select(GtkWidget *widget) { CtkGpu *ctk_gpu = CTK_GPU(widget); /* Update GPU usage */ update_gpu_usage(ctk_gpu); /* Start the gpu timer */ ctk_config_start_timer(ctk_gpu->ctk_config, (GSourceFunc) update_gpu_usage, (gpointer) ctk_gpu); } void ctk_gpu_page_unselect(GtkWidget *widget) { CtkGpu *ctk_gpu = CTK_GPU(widget); /* Stop the gpu timer */ ctk_config_stop_timer(ctk_gpu->ctk_config, (GSourceFunc) update_gpu_usage, (gpointer) ctk_gpu); } nvidia-settings/src/gtk+-2.x/ctkevent.c0000664000175000017500000010370712236467170020075 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * ctkevent.c - the CtkEvent object registers a new input source (the * filedescriptor associated with the NV-CONTROL Display connection) * with the glib main loop, and emits signals when any relevant * NV-CONTROL events occur. GUI elements can then register * callback(s) on the CtkEvent object & Signal(s). * * In short: * NV-CONTROL -> event -> glib -> CtkEvent -> signal -> GUI */ #include #include #include /* Xrandr */ #include /* Xrandr */ #include "ctkevent.h" #include "NVCtrlLib.h" #include "msg.h" static void ctk_event_class_init(CtkEventClass *ctk_event_class); static gboolean ctk_event_prepare(GSource *, gint *); static gboolean ctk_event_check(GSource *); static gboolean ctk_event_dispatch(GSource *, GSourceFunc, gpointer); /* List of who to contact on dpy events */ typedef struct __CtkEventNodeRec { CtkEvent *ctk_event; int target_type; int target_id; struct __CtkEventNodeRec *next; } CtkEventNode; /* dpys should have a single event source object */ typedef struct __CtkEventSourceRec { GSource source; Display *dpy; GPollFD event_poll_fd; int event_base; int randr_event_base; CtkEventNode *ctk_events; struct __CtkEventSourceRec *next; } CtkEventSource; static guint binary_signals[NV_CTRL_BINARY_DATA_LAST_ATTRIBUTE + 1]; static guint string_signals[NV_CTRL_STRING_LAST_ATTRIBUTE + 1]; static guint signals[NV_CTRL_LAST_ATTRIBUTE + 1]; static guint signal_RRScreenChangeNotify; /* List of event sources to track (one per dpy) */ CtkEventSource *event_sources = NULL; GType ctk_event_get_type(void) { static GType ctk_event_type = 0; if (!ctk_event_type) { static const GTypeInfo ctk_event_info = { sizeof(CtkEventClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ctk_event_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(CtkEvent), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_event_type = g_type_register_static (GTK_TYPE_OBJECT, "CtkEvent", &ctk_event_info, 0); } return ctk_event_type; } /* ctk_event_get_type() */ static void ctk_event_class_init(CtkEventClass *ctk_event_class) { gint i; /* clear the signal array */ for (i = 0; i <= NV_CTRL_LAST_ATTRIBUTE; i++) signals[i] = 0; #define MAKE_SIGNAL(x) \ signals[x] = g_signal_new(("CTK_EVENT_" #x), \ G_OBJECT_CLASS_TYPE(ctk_event_class), \ G_SIGNAL_RUN_LAST, 0, NULL, NULL, \ g_cclosure_marshal_VOID__POINTER, \ G_TYPE_NONE, 1, G_TYPE_POINTER); /* create signals for all the NV-CONTROL attributes */ MAKE_SIGNAL(NV_CTRL_DIGITAL_VIBRANCE); MAKE_SIGNAL(NV_CTRL_BUS_TYPE); MAKE_SIGNAL(NV_CTRL_VIDEO_RAM); MAKE_SIGNAL(NV_CTRL_IRQ); MAKE_SIGNAL(NV_CTRL_OPERATING_SYSTEM); MAKE_SIGNAL(NV_CTRL_SYNC_TO_VBLANK); MAKE_SIGNAL(NV_CTRL_LOG_ANISO); MAKE_SIGNAL(NV_CTRL_FSAA_MODE); MAKE_SIGNAL(NV_CTRL_TEXTURE_SHARPEN); MAKE_SIGNAL(NV_CTRL_UBB); MAKE_SIGNAL(NV_CTRL_OVERLAY); MAKE_SIGNAL(NV_CTRL_STEREO); MAKE_SIGNAL(NV_CTRL_EMULATE); MAKE_SIGNAL(NV_CTRL_TWINVIEW); MAKE_SIGNAL(NV_CTRL_CONNECTED_DISPLAYS); MAKE_SIGNAL(NV_CTRL_ENABLED_DISPLAYS); MAKE_SIGNAL(NV_CTRL_FRAMELOCK); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_MASTER); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_POLARITY); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_SYNC_DELAY); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_SYNC_INTERVAL); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_PORT0_STATUS); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_PORT1_STATUS); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_HOUSE_STATUS); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_SYNC); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_SYNC_READY); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_TIMING); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_STEREO_SYNC); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_TEST_SIGNAL); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_ETHERNET_DETECTED); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_VIDEO_MODE); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_SYNC_RATE); MAKE_SIGNAL(NV_CTRL_OPENGL_AA_LINE_GAMMA); MAKE_SIGNAL(NV_CTRL_FLIPPING_ALLOWED); MAKE_SIGNAL(NV_CTRL_FORCE_STEREO); MAKE_SIGNAL(NV_CTRL_ARCHITECTURE); MAKE_SIGNAL(NV_CTRL_TEXTURE_CLAMPING); MAKE_SIGNAL(NV_CTRL_FSAA_APPLICATION_CONTROLLED); MAKE_SIGNAL(NV_CTRL_LOG_ANISO_APPLICATION_CONTROLLED); MAKE_SIGNAL(NV_CTRL_IMAGE_SHARPENING); MAKE_SIGNAL(NV_CTRL_TV_OVERSCAN); MAKE_SIGNAL(NV_CTRL_TV_FLICKER_FILTER); MAKE_SIGNAL(NV_CTRL_TV_BRIGHTNESS); MAKE_SIGNAL(NV_CTRL_TV_HUE); MAKE_SIGNAL(NV_CTRL_TV_CONTRAST); MAKE_SIGNAL(NV_CTRL_TV_SATURATION); MAKE_SIGNAL(NV_CTRL_TV_RESET_SETTINGS); MAKE_SIGNAL(NV_CTRL_GPU_CORE_TEMPERATURE); MAKE_SIGNAL(NV_CTRL_GPU_CORE_THRESHOLD); MAKE_SIGNAL(NV_CTRL_GPU_DEFAULT_CORE_THRESHOLD); MAKE_SIGNAL(NV_CTRL_GPU_MAX_CORE_THRESHOLD); MAKE_SIGNAL(NV_CTRL_AMBIENT_TEMPERATURE); MAKE_SIGNAL(NV_CTRL_GVO_SUPPORTED); MAKE_SIGNAL(NV_CTRL_GVO_SYNC_MODE); MAKE_SIGNAL(NV_CTRL_GVO_SYNC_SOURCE); MAKE_SIGNAL(NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT); MAKE_SIGNAL(NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT); MAKE_SIGNAL(NV_CTRL_GVO_DATA_FORMAT); MAKE_SIGNAL(NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED); MAKE_SIGNAL(NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE); MAKE_SIGNAL(NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED); MAKE_SIGNAL(NV_CTRL_GVO_VIDEO_OUTPUTS); MAKE_SIGNAL(NV_CTRL_GVO_FIRMWARE_VERSION); MAKE_SIGNAL(NV_CTRL_GVO_SYNC_DELAY_PIXELS); MAKE_SIGNAL(NV_CTRL_GVO_SYNC_DELAY_LINES); MAKE_SIGNAL(NV_CTRL_GVO_INPUT_VIDEO_FORMAT_REACQUIRE); MAKE_SIGNAL(NV_CTRL_GVO_GLX_LOCKED); MAKE_SIGNAL(NV_CTRL_GVIO_VIDEO_FORMAT_WIDTH); MAKE_SIGNAL(NV_CTRL_GVIO_VIDEO_FORMAT_HEIGHT); MAKE_SIGNAL(NV_CTRL_GVIO_VIDEO_FORMAT_REFRESH_RATE); MAKE_SIGNAL(NV_CTRL_GPU_OVERCLOCKING_STATE); MAKE_SIGNAL(NV_CTRL_GPU_2D_CLOCK_FREQS); MAKE_SIGNAL(NV_CTRL_GPU_3D_CLOCK_FREQS); MAKE_SIGNAL(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS); MAKE_SIGNAL(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE); MAKE_SIGNAL(NV_CTRL_FLATPANEL_LINK); MAKE_SIGNAL(NV_CTRL_USE_HOUSE_SYNC); MAKE_SIGNAL(NV_CTRL_IMAGE_SETTINGS); MAKE_SIGNAL(NV_CTRL_XINERAMA_STEREO); MAKE_SIGNAL(NV_CTRL_BUS_RATE); MAKE_SIGNAL(NV_CTRL_SHOW_SLI_VISUAL_INDICATOR); MAKE_SIGNAL(NV_CTRL_XV_SYNC_TO_DISPLAY); MAKE_SIGNAL(NV_CTRL_GVO_OVERRIDE_HW_CSC); MAKE_SIGNAL(NV_CTRL_GVO_COMPOSITE_TERMINATION); MAKE_SIGNAL(NV_CTRL_ASSOCIATED_DISPLAY_DEVICES); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_SLAVES); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_MASTERABLE); MAKE_SIGNAL(NV_CTRL_PROBE_DISPLAYS); MAKE_SIGNAL(NV_CTRL_REFRESH_RATE); MAKE_SIGNAL(NV_CTRL_INITIAL_PIXMAP_PLACEMENT); MAKE_SIGNAL(NV_CTRL_GLYPH_CACHE); MAKE_SIGNAL(NV_CTRL_PCI_BUS); MAKE_SIGNAL(NV_CTRL_PCI_DEVICE); MAKE_SIGNAL(NV_CTRL_PCI_FUNCTION); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_FPGA_REVISION); MAKE_SIGNAL(NV_CTRL_MAX_SCREEN_WIDTH); MAKE_SIGNAL(NV_CTRL_MAX_SCREEN_HEIGHT); MAKE_SIGNAL(NV_CTRL_MAX_DISPLAYS); MAKE_SIGNAL(NV_CTRL_MULTIGPU_DISPLAY_OWNER); MAKE_SIGNAL(NV_CTRL_GPU_SCALING); MAKE_SIGNAL(NV_CTRL_GPU_SCALING_DEFAULT_TARGET); MAKE_SIGNAL(NV_CTRL_GPU_SCALING_DEFAULT_METHOD); MAKE_SIGNAL(NV_CTRL_FRONTEND_RESOLUTION); MAKE_SIGNAL(NV_CTRL_BACKEND_RESOLUTION); MAKE_SIGNAL(NV_CTRL_FLATPANEL_NATIVE_RESOLUTION); MAKE_SIGNAL(NV_CTRL_FLATPANEL_BEST_FIT_RESOLUTION); MAKE_SIGNAL(NV_CTRL_GPU_SCALING_ACTIVE); MAKE_SIGNAL(NV_CTRL_DFP_SCALING_ACTIVE); MAKE_SIGNAL(NV_CTRL_FSAA_APPLICATION_ENHANCED); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_SYNC_RATE_4); MAKE_SIGNAL(NV_CTRL_GVO_LOCK_OWNER); MAKE_SIGNAL(NV_CTRL_NUM_GPU_ERRORS_RECOVERED); MAKE_SIGNAL(NV_CTRL_REFRESH_RATE_3); MAKE_SIGNAL(NV_CTRL_GVO_OUTPUT_VIDEO_LOCKED); MAKE_SIGNAL(NV_CTRL_GVO_SYNC_LOCK_STATUS); MAKE_SIGNAL(NV_CTRL_GVO_ANC_TIME_CODE_GENERATION); MAKE_SIGNAL(NV_CTRL_ONDEMAND_VBLANK_INTERRUPTS); MAKE_SIGNAL(NV_CTRL_GVO_COMPOSITE); MAKE_SIGNAL(NV_CTRL_GVO_COMPOSITE_ALPHA_KEY); MAKE_SIGNAL(NV_CTRL_GVO_COMPOSITE_NUM_KEY_RANGES); MAKE_SIGNAL(NV_CTRL_NOTEBOOK_DISPLAY_CHANGE_LID_EVENT); MAKE_SIGNAL(NV_CTRL_MODE_SET_EVENT); MAKE_SIGNAL(NV_CTRL_OPENGL_AA_LINE_GAMMA_VALUE); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_SLAVEABLE); MAKE_SIGNAL(NV_CTRL_DISPLAYPORT_LINK_RATE); MAKE_SIGNAL(NV_CTRL_STEREO_EYES_EXCHANGE); MAKE_SIGNAL(NV_CTRL_NO_SCANOUT); MAKE_SIGNAL(NV_CTRL_GVO_CSC_CHANGED_EVENT); MAKE_SIGNAL(NV_CTRL_X_SERVER_UNIQUE_ID); MAKE_SIGNAL(NV_CTRL_PIXMAP_CACHE); MAKE_SIGNAL(NV_CTRL_PIXMAP_CACHE_ROUNDING_SIZE_KB); MAKE_SIGNAL(NV_CTRL_IS_GVO_DISPLAY); MAKE_SIGNAL(NV_CTRL_PCI_ID); MAKE_SIGNAL(NV_CTRL_GVO_FULL_RANGE_COLOR); MAKE_SIGNAL(NV_CTRL_SLI_MOSAIC_MODE_AVAILABLE); MAKE_SIGNAL(NV_CTRL_GVO_ENABLE_RGB_DATA); MAKE_SIGNAL(NV_CTRL_IMAGE_SHARPENING_DEFAULT); MAKE_SIGNAL(NV_CTRL_GVI_NUM_JACKS); MAKE_SIGNAL(NV_CTRL_GVI_MAX_LINKS_PER_STREAM); MAKE_SIGNAL(NV_CTRL_GVI_DETECTED_CHANNEL_BITS_PER_COMPONENT); MAKE_SIGNAL(NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT); MAKE_SIGNAL(NV_CTRL_GVI_DETECTED_CHANNEL_COMPONENT_SAMPLING); MAKE_SIGNAL(NV_CTRL_GVI_REQUESTED_STREAM_COMPONENT_SAMPLING); MAKE_SIGNAL(NV_CTRL_GVI_REQUESTED_STREAM_CHROMA_EXPAND); MAKE_SIGNAL(NV_CTRL_GVI_DETECTED_CHANNEL_COLOR_SPACE); MAKE_SIGNAL(NV_CTRL_GVI_DETECTED_CHANNEL_LINK_ID); MAKE_SIGNAL(NV_CTRL_GVI_DETECTED_CHANNEL_SMPTE352_IDENTIFIER); MAKE_SIGNAL(NV_CTRL_GVI_GLOBAL_IDENTIFIER); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_SYNC_DELAY_RESOLUTION); MAKE_SIGNAL(NV_CTRL_GPU_COOLER_MANUAL_CONTROL); MAKE_SIGNAL(NV_CTRL_THERMAL_COOLER_LEVEL); MAKE_SIGNAL(NV_CTRL_THERMAL_COOLER_LEVEL_SET_DEFAULT); MAKE_SIGNAL(NV_CTRL_THERMAL_COOLER_CONTROL_TYPE); MAKE_SIGNAL(NV_CTRL_THERMAL_COOLER_TARGET); MAKE_SIGNAL(NV_CTRL_GPU_ECC_CONFIGURATION); MAKE_SIGNAL(NV_CTRL_GPU_POWER_MIZER_MODE); MAKE_SIGNAL(NV_CTRL_GVI_SYNC_OUTPUT_FORMAT); MAKE_SIGNAL(NV_CTRL_GVI_MAX_CHANNELS_PER_JACK); MAKE_SIGNAL(NV_CTRL_GVI_MAX_STREAMS); MAKE_SIGNAL(NV_CTRL_GVI_NUM_CAPTURE_SURFACES); MAKE_SIGNAL(NV_CTRL_OVERSCAN_COMPENSATION); MAKE_SIGNAL(NV_CTRL_GPU_PCIE_GENERATION); MAKE_SIGNAL(NV_CTRL_GVI_BOUND_GPU); MAKE_SIGNAL(NV_CTRL_ACCELERATE_TRAPEZOIDS); MAKE_SIGNAL(NV_CTRL_GPU_CORES); MAKE_SIGNAL(NV_CTRL_GPU_MEMORY_BUS_WIDTH); MAKE_SIGNAL(NV_CTRL_GVI_TEST_MODE); MAKE_SIGNAL(NV_CTRL_COLOR_SPACE); MAKE_SIGNAL(NV_CTRL_COLOR_RANGE); MAKE_SIGNAL(NV_CTRL_DITHERING); MAKE_SIGNAL(NV_CTRL_DITHERING_MODE); MAKE_SIGNAL(NV_CTRL_DITHERING_DEPTH); MAKE_SIGNAL(NV_CTRL_CURRENT_DITHERING); MAKE_SIGNAL(NV_CTRL_CURRENT_DITHERING_MODE); MAKE_SIGNAL(NV_CTRL_CURRENT_DITHERING_DEPTH); MAKE_SIGNAL(NV_CTRL_THERMAL_SENSOR_READING); MAKE_SIGNAL(NV_CTRL_THERMAL_SENSOR_PROVIDER); MAKE_SIGNAL(NV_CTRL_THERMAL_SENSOR_TARGET); MAKE_SIGNAL(NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR); MAKE_SIGNAL(NV_CTRL_GPU_CURRENT_PROCESSOR_CLOCK_FREQS); MAKE_SIGNAL(NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS); MAKE_SIGNAL(NV_CTRL_GPU_PCIE_MAX_LINK_SPEED); MAKE_SIGNAL(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL); MAKE_SIGNAL(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE); MAKE_SIGNAL(NV_CTRL_SYNCHRONOUS_PALETTE_UPDATES); MAKE_SIGNAL(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY); MAKE_SIGNAL(NV_CTRL_3D_VISION_PRO_GLASSES_MISSED_SYNC_CYCLES); MAKE_SIGNAL(NV_CTRL_GVO_ANC_PARITY_COMPUTATION); MAKE_SIGNAL(NV_CTRL_3D_VISION_PRO_GLASSES_PAIR_EVENT); MAKE_SIGNAL(NV_CTRL_3D_VISION_PRO_GLASSES_UNPAIR_EVENT); MAKE_SIGNAL(NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH); MAKE_SIGNAL(NV_CTRL_GPU_PCIE_CURRENT_LINK_WIDTH); MAKE_SIGNAL(NV_CTRL_GPU_PCIE_CURRENT_LINK_SPEED); MAKE_SIGNAL(NV_CTRL_GVO_AUDIO_BLANKING); MAKE_SIGNAL(NV_CTRL_CURRENT_METAMODE_ID); MAKE_SIGNAL(NV_CTRL_DISPLAY_ENABLED); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_INCOMING_HOUSE_SYNC_RATE); MAKE_SIGNAL(NV_CTRL_FXAA); MAKE_SIGNAL(NV_CTRL_DISPLAY_RANDR_OUTPUT_ID); MAKE_SIGNAL(NV_CTRL_FRAMELOCK_DISPLAY_CONFIG); MAKE_SIGNAL(NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY); MAKE_SIGNAL(NV_CTRL_USED_DEDICATED_GPU_MEMORY); MAKE_SIGNAL(NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE); MAKE_SIGNAL(NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT); MAKE_SIGNAL(NV_CTRL_DPY_HDMI_3D); MAKE_SIGNAL(NV_CTRL_BASE_MOSAIC); MAKE_SIGNAL(NV_CTRL_MULTIGPU_MASTER_POSSIBLE); MAKE_SIGNAL(NV_CTRL_GPU_POWER_MIZER_DEFAULT_MODE); MAKE_SIGNAL(NV_CTRL_XV_SYNC_TO_DISPLAY_ID); MAKE_SIGNAL(NV_CTRL_BACKLIGHT_BRIGHTNESS); MAKE_SIGNAL(NV_CTRL_THERMAL_COOLER_SPEED); #undef MAKE_SIGNAL /* * When new integer attributes are added to NVCtrl.h, a * MAKE_SIGNAL() line should be added above. The below #if should * also be updated to indicate the last attribute that ctkevent.c * knows about. */ #if NV_CTRL_LAST_ATTRIBUTE != NV_CTRL_THERMAL_COOLER_SPEED #warning "There are attributes that do not emit signals!" #endif /* make signals for string attribute */ for (i = 0; i <= NV_CTRL_STRING_LAST_ATTRIBUTE; i++) string_signals[i] = 0; #define MAKE_STRING_SIGNAL(x) \ string_signals[x] = g_signal_new(("CTK_EVENT_" #x), \ G_OBJECT_CLASS_TYPE(ctk_event_class), \ G_SIGNAL_RUN_LAST, 0, NULL, NULL, \ g_cclosure_marshal_VOID__POINTER, \ G_TYPE_NONE, 1, G_TYPE_POINTER); MAKE_STRING_SIGNAL(NV_CTRL_STRING_PRODUCT_NAME); MAKE_STRING_SIGNAL(NV_CTRL_STRING_VBIOS_VERSION); MAKE_STRING_SIGNAL(NV_CTRL_STRING_NVIDIA_DRIVER_VERSION); MAKE_STRING_SIGNAL(NV_CTRL_STRING_DISPLAY_DEVICE_NAME); MAKE_STRING_SIGNAL(NV_CTRL_STRING_TV_ENCODER_NAME); MAKE_STRING_SIGNAL(NV_CTRL_STRING_GVIO_FIRMWARE_VERSION); MAKE_STRING_SIGNAL(NV_CTRL_STRING_CURRENT_MODELINE); MAKE_STRING_SIGNAL(NV_CTRL_STRING_ADD_MODELINE); MAKE_STRING_SIGNAL(NV_CTRL_STRING_DELETE_MODELINE); MAKE_STRING_SIGNAL(NV_CTRL_STRING_CURRENT_METAMODE); MAKE_STRING_SIGNAL(NV_CTRL_STRING_ADD_METAMODE); MAKE_STRING_SIGNAL(NV_CTRL_STRING_DELETE_METAMODE); MAKE_STRING_SIGNAL(NV_CTRL_STRING_VCSC_PRODUCT_NAME); MAKE_STRING_SIGNAL(NV_CTRL_STRING_VCSC_PRODUCT_ID); MAKE_STRING_SIGNAL(NV_CTRL_STRING_VCSC_SERIAL_NUMBER); MAKE_STRING_SIGNAL(NV_CTRL_STRING_VCSC_BUILD_DATE); MAKE_STRING_SIGNAL(NV_CTRL_STRING_VCSC_FIRMWARE_VERSION); MAKE_STRING_SIGNAL(NV_CTRL_STRING_VCSC_FIRMWARE_REVISION); MAKE_STRING_SIGNAL(NV_CTRL_STRING_VCSC_HARDWARE_VERSION); MAKE_STRING_SIGNAL(NV_CTRL_STRING_VCSC_HARDWARE_REVISION); MAKE_STRING_SIGNAL(NV_CTRL_STRING_MOVE_METAMODE); MAKE_STRING_SIGNAL(NV_CTRL_STRING_VALID_HORIZ_SYNC_RANGES); MAKE_STRING_SIGNAL(NV_CTRL_STRING_VALID_VERT_REFRESH_RANGES); MAKE_STRING_SIGNAL(NV_CTRL_STRING_XINERAMA_SCREEN_INFO); MAKE_STRING_SIGNAL(NV_CTRL_STRING_NVIDIA_XINERAMA_INFO_ORDER); MAKE_STRING_SIGNAL(NV_CTRL_STRING_SLI_MODE); MAKE_STRING_SIGNAL(NV_CTRL_STRING_PERFORMANCE_MODES); MAKE_STRING_SIGNAL(NV_CTRL_STRING_GVIO_VIDEO_FORMAT_NAME); MAKE_STRING_SIGNAL(NV_CTRL_STRING_GPU_CURRENT_CLOCK_FREQS); MAKE_STRING_SIGNAL(NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME); MAKE_STRING_SIGNAL(NV_CTRL_STRING_CURRENT_METAMODE_VERSION_2); MAKE_STRING_SIGNAL(NV_CTRL_STRING_DISPLAY_NAME_TYPE_BASENAME); MAKE_STRING_SIGNAL(NV_CTRL_STRING_DISPLAY_NAME_TYPE_ID); MAKE_STRING_SIGNAL(NV_CTRL_STRING_DISPLAY_NAME_DP_GUID); MAKE_STRING_SIGNAL(NV_CTRL_STRING_DISPLAY_NAME_EDID_HASH); MAKE_STRING_SIGNAL(NV_CTRL_STRING_DISPLAY_NAME_TARGET_INDEX); MAKE_STRING_SIGNAL(NV_CTRL_STRING_DISPLAY_NAME_RANDR); MAKE_STRING_SIGNAL(NV_CTRL_STRING_GPU_UUID); MAKE_STRING_SIGNAL(NV_CTRL_STRING_GPU_UTILIZATION); MAKE_STRING_SIGNAL(NV_CTRL_STRING_MULTIGPU_MODE); #undef MAKE_STRING_SIGNAL #if NV_CTRL_STRING_LAST_ATTRIBUTE != NV_CTRL_STRING_MULTIGPU_MODE #warning "There are attributes that do not emit signals!" #endif /* make signals for binary attribute */ for (i = 0; i <= NV_CTRL_BINARY_DATA_LAST_ATTRIBUTE; i++) binary_signals[i] = 0; #define MAKE_BINARY_SIGNAL(x) \ binary_signals[x] = g_signal_new(("CTK_EVENT_" #x), \ G_OBJECT_CLASS_TYPE(ctk_event_class), \ G_SIGNAL_RUN_LAST, 0, NULL, NULL, \ g_cclosure_marshal_VOID__POINTER, \ G_TYPE_NONE, 1, G_TYPE_POINTER); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_MODELINES); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_XSCREENS_USING_GPU); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_GPUS_USED_BY_XSCREEN); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_GPUS_USING_FRAMELOCK); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_DISPLAY_VIEWPORT); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_FRAMELOCKS_USED_BY_GPU); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_GPUS_USING_VCSC); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_VCSCS_USED_BY_GPU); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_COOLERS_USED_BY_GPU); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_GPUS_USED_BY_LOGICAL_XSCREEN); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_THERMAL_SENSORS_USED_BY_GPU); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_DISPLAY_TARGETS); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_METAMODES_VERSION_2); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_DISPLAYS_ENABLED_ON_XSCREEN); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_DISPLAYS_ASSIGNED_TO_XSCREEN); MAKE_BINARY_SIGNAL(NV_CTRL_BINARY_DATA_GPU_FLAGS); #undef MAKE_BINARY_SIGNAL #if NV_CTRL_BINARY_DATA_LAST_ATTRIBUTE != NV_CTRL_BINARY_DATA_GPU_FLAGS #warning "There are attributes that do not emit signals!" #endif /* Make XRandR signal */ signal_RRScreenChangeNotify = g_signal_new("CTK_EVENT_RRScreenChangeNotify", G_OBJECT_CLASS_TYPE(ctk_event_class), G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); } /* ctk_event_class_init */ /* - ctk_event_register_source() * * Keep track of event sources globally to support * dispatching events on a dpy to multiple CtkEvent * objects. Since the driver only sends out one event * notification per dpy (client), there should only be one * event source attached per unique dpy. When an event * is received, the dispatching function should then * emit a signal to every CtkEvent object that * requests event notification from the dpy for the * given target type/id (X screen, GPU etc). */ static void ctk_event_register_source(CtkEvent *ctk_event) { Display *dpy = NvCtrlGetDisplayPtr(ctk_event->handle); CtkEventSource *event_source; CtkEventNode *event_node; if (!dpy) { return; } /* Do we already have an event source for this dpy? */ event_source = event_sources; while (event_source) { if (event_source->dpy == dpy) { break; } event_source = event_source->next; } /* create a new input source */ if (!event_source) { GSource *source; static GSourceFuncs ctk_source_funcs = { ctk_event_prepare, ctk_event_check, ctk_event_dispatch, NULL, /* finalize */ NULL, /* closure_callback */ NULL, /* closure_marshal */ }; source = g_source_new(&ctk_source_funcs, sizeof(CtkEventSource)); event_source = (CtkEventSource *) source; if (!event_source) { return; } event_source->dpy = dpy; event_source->event_poll_fd.fd = ConnectionNumber(dpy); event_source->event_poll_fd.events = G_IO_IN; event_source->event_base = NvCtrlGetEventBase(ctk_event->handle); event_source->randr_event_base = NvCtrlGetXrandrEventBase(ctk_event->handle); /* add the input source to the glib main loop */ g_source_add_poll(source, &event_source->event_poll_fd); g_source_attach(source, NULL); /* add the source to the global list of sources */ event_source->next = event_sources; event_sources = event_source; } /* Add the ctk_event object to the source's list of event objects */ event_node = (CtkEventNode *)g_malloc(sizeof(CtkEventNode)); if (!event_node) { return; } event_node->ctk_event = ctk_event; event_node->target_type = NvCtrlGetTargetType(ctk_event->handle); event_node->target_id = NvCtrlGetTargetId(ctk_event->handle); event_node->next = event_source->ctk_events; event_source->ctk_events = event_node; /* * This next bit of code is to make sure that the randr_event_base * for this event source is valid in the case where a NON X Screen * target type handle is used to create the initial event source * (Resulting in randr_event_base being == -1), followed by an * X Screen target type handle registering itself to receive * XRandR events on the existing dpy/event source. */ if (event_source->randr_event_base == -1 && event_node->target_type == NV_CTRL_TARGET_TYPE_X_SCREEN) { event_source->randr_event_base = NvCtrlGetXrandrEventBase(ctk_event->handle); } } /* ctk_event_register_source() */ GtkObject *ctk_event_new(NvCtrlAttributeHandle *handle) { GObject *object; CtkEvent *ctk_event; /* create the new object */ object = g_object_new(CTK_TYPE_EVENT, NULL); ctk_event = CTK_EVENT(object); ctk_event->handle = handle; /* Register to receive (dpy) events */ ctk_event_register_source(ctk_event); return GTK_OBJECT(ctk_event); } /* ctk_event_new() */ static gboolean ctk_event_prepare(GSource *source, gint *timeout) { CtkEventSource *event_source = (CtkEventSource *) source; *timeout = -1; /* * Check if any events are pending on the Display connection */ return XPending(event_source->dpy); } static gboolean ctk_event_check(GSource *source) { CtkEventSource *event_source = (CtkEventSource *) source; /* * XXX We could check for (event_source->event_poll_fd.revents & G_IO_IN), * but doing so caused some events to be missed as they came in with only * the G_IO_OUT flag set which is odd. */ return XPending(event_source->dpy); } static int get_screen_of_root(Display *dpy, Window root) { int screen = -1; /* Find the screen the window belongs to */ screen = XScreenCount(dpy); while (screen > 0) { screen--; if (root == RootWindow(dpy, screen)) { break; } } return screen; } #define CTK_EVENT_BROADCAST(ES, SIG, PTR, TYPE, ID) \ do { \ CtkEventNode *e = (ES)->ctk_events; \ while (e) { \ if (e->target_type == (TYPE) && \ e->target_id == (ID)) { \ g_signal_emit(e->ctk_event, SIG, 0, PTR); \ } \ e = e->next; \ } \ } while (0) static gboolean ctk_event_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) { XEvent event; CtkEventSource *event_source = (CtkEventSource *) source; CtkEventStruct event_struct; memset(&event_struct, 0, sizeof(event_struct)); /* * if ctk_event_dispatch() is called, then either * ctk_event_prepare() or ctk_event_check() returned TRUE, so we * know there is an event pending */ XNextEvent(event_source->dpy, &event); /* * Handle the ATTRIBUTE_CHANGED_EVENT NV-CONTROL event */ if (event_source->event_base != -1 && (event.type == (event_source->event_base + ATTRIBUTE_CHANGED_EVENT))) { XNVCtrlAttributeChangedEvent *nvctrlevent = (XNVCtrlAttributeChangedEvent *) &event; /* make sure the attribute is in our signal array */ if ((nvctrlevent->attribute <= NV_CTRL_LAST_ATTRIBUTE) && (signals[nvctrlevent->attribute] != 0)) { event_struct.attribute = nvctrlevent->attribute; event_struct.value = nvctrlevent->value; event_struct.display_mask = nvctrlevent->display_mask; /* * XXX Is emitting a signal with g_signal_emit() really * the "correct" way of dispatching the event? */ CTK_EVENT_BROADCAST(event_source, signals[nvctrlevent->attribute], &event_struct, NV_CTRL_TARGET_TYPE_X_SCREEN, nvctrlevent->screen); } /* * Handle the TARGET_ATTRIBUTE_CHANGED_EVENT NV-CONTROL event */ } else if (event_source->event_base != -1 && (event.type == (event_source->event_base +TARGET_ATTRIBUTE_CHANGED_EVENT))) { XNVCtrlAttributeChangedEventTarget *nvctrlevent = (XNVCtrlAttributeChangedEventTarget *) &event; /* make sure the attribute is in our signal array */ if ((nvctrlevent->attribute <= NV_CTRL_LAST_ATTRIBUTE) && (signals[nvctrlevent->attribute] != 0)) { event_struct.attribute = nvctrlevent->attribute; event_struct.value = nvctrlevent->value; event_struct.display_mask = nvctrlevent->display_mask; /* * XXX Is emitting a signal with g_signal_emit() really * the "correct" way of dispatching the event? */ CTK_EVENT_BROADCAST(event_source, signals[nvctrlevent->attribute], &event_struct, nvctrlevent->target_type, nvctrlevent->target_id); } /* * Handle the TARGET_ATTRIBUTE_AVAILABILITY_CHANGED_EVENT * NV-CONTROL event. */ } else if (event_source->event_base != -1 && (event.type == (event_source->event_base + TARGET_ATTRIBUTE_AVAILABILITY_CHANGED_EVENT))) { XNVCtrlAttributeChangedEventTargetAvailability *nvctrlevent = (XNVCtrlAttributeChangedEventTargetAvailability *) &event; /* make sure the attribute is in our signal array */ if ((nvctrlevent->attribute <= NV_CTRL_LAST_ATTRIBUTE) && (signals[nvctrlevent->attribute] != 0)) { event_struct.attribute = nvctrlevent->attribute; event_struct.value = nvctrlevent->value; event_struct.display_mask = nvctrlevent->display_mask; event_struct.is_availability_changed = TRUE; /* * XXX Is emitting a signal with g_signal_emit() really * the "correct" way of dispatching the event? */ CTK_EVENT_BROADCAST(event_source, signals[nvctrlevent->attribute], &event_struct, nvctrlevent->target_type, nvctrlevent->target_id); } /* * Handle the TARGET_STRING_ATTRIBUTE_CHANGED_EVENT * NV-CONTROL event. */ } else if (event_source->event_base != -1 && (event.type == (event_source->event_base + TARGET_STRING_ATTRIBUTE_CHANGED_EVENT))) { XNVCtrlStringAttributeChangedEventTarget *nvctrlevent = (XNVCtrlStringAttributeChangedEventTarget *) &event; /* make sure the attribute is in our signal array */ if ((nvctrlevent->attribute <= NV_CTRL_STRING_LAST_ATTRIBUTE) && (string_signals[nvctrlevent->attribute] != 0)) { event_struct.attribute = nvctrlevent->attribute; event_struct.value = 0; event_struct.display_mask = nvctrlevent->display_mask; /* * XXX Is emitting a signal with g_signal_emit() really * the "correct" way of dispatching the event */ CTK_EVENT_BROADCAST(event_source, string_signals[nvctrlevent->attribute], &event_struct, nvctrlevent->target_type, nvctrlevent->target_id); } /* * Handle the TARGET_BINARY_ATTRIBUTE_CHANGED_EVENT * NV-CONTROL event. */ } else if (event_source->event_base != -1 && (event.type == (event_source->event_base + TARGET_BINARY_ATTRIBUTE_CHANGED_EVENT))) { XNVCtrlBinaryAttributeChangedEventTarget *nvctrlevent = (XNVCtrlBinaryAttributeChangedEventTarget *) &event; /* make sure the attribute is in our signal array */ if ((nvctrlevent->attribute <= NV_CTRL_BINARY_DATA_LAST_ATTRIBUTE) && (binary_signals[nvctrlevent->attribute] != 0)) { event_struct.attribute = nvctrlevent->attribute; event_struct.value = 0; event_struct.display_mask = nvctrlevent->display_mask; /* * XXX Is emitting a signal with g_signal_emit() really * the "correct" way of dispatching the event */ CTK_EVENT_BROADCAST(event_source, binary_signals[nvctrlevent->attribute], &event_struct, nvctrlevent->target_type, nvctrlevent->target_id); } /* * Also handle XRandR events. */ } else if (event_source->randr_event_base != -1 && (event.type == (event_source->randr_event_base + RRScreenChangeNotify))) { XRRScreenChangeNotifyEvent *xrandrevent = (XRRScreenChangeNotifyEvent *)&event; int screen; /* Find the screen the window belongs to */ screen = get_screen_of_root(xrandrevent->display, xrandrevent->root); if (screen >= 0) { CTK_EVENT_BROADCAST(event_source, signal_RRScreenChangeNotify, &event, NV_CTRL_TARGET_TYPE_X_SCREEN, screen); } /* * Trap events that get registered but are not handled * properly. */ } else { nv_warning_msg("Unknown event type %d.", event.type); } return TRUE; } /* ctk_event_dispatch() */ /* ctk_event_emit() - Emits signal(s) on a registered ctk_event object. * This function is primarily used to simulate NV-CONTROL events such * that various parts of nvidia-settings can communicate (internally) */ void ctk_event_emit(CtkEvent *ctk_event, unsigned int mask, int attrib, int value) { CtkEventStruct event; CtkEventSource *source; Display *dpy = NvCtrlGetDisplayPtr(ctk_event->handle); if (attrib > NV_CTRL_LAST_ATTRIBUTE) return; /* Find the event source */ source = event_sources; while (source) { if (source->dpy == dpy) { break; } source = source->next; } if (!source) return; /* Broadcast event to all relevant ctk_event objects */ event.attribute = attrib; event.value = value; event.display_mask = mask; CTK_EVENT_BROADCAST(source, signals[attrib], &event, NvCtrlGetTargetType(ctk_event->handle), NvCtrlGetTargetId(ctk_event->handle)); } /* ctk_event_emit() */ /* ctk_event_emit_string() - Emits signal(s) on a registered ctk_event object. * This function is primarily used to simulate NV-CONTROL events such * that various parts of nvidia-settings can communicate (internally) */ void ctk_event_emit_string(CtkEvent *ctk_event, unsigned int mask, int attrib) { CtkEventStruct event; CtkEventSource *source; Display *dpy = NvCtrlGetDisplayPtr(ctk_event->handle); if (attrib > NV_CTRL_STRING_LAST_ATTRIBUTE) return; /* Find the event source */ source = event_sources; while (source) { if (source->dpy == dpy) { break; } source = source->next; } if (!source) return; /* Broadcast event to all relevant ctk_event objects */ event.attribute = attrib; event.value = 0; event.display_mask = mask; CTK_EVENT_BROADCAST(source, string_signals[attrib], &event, NvCtrlGetTargetType(ctk_event->handle), NvCtrlGetTargetId(ctk_event->handle)); } /* ctk_event_emit_string() */ nvidia-settings/src/gtk+-2.x/ctkhelp.c0000664000175000017500000003325712236467170017706 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "ctkhelp.h" #include "common-utils.h" #include "ctkconstants.h" #include "ctkbanner.h" #include #include static GtkTextBuffer *create_default_help(CtkHelp *ctk_help); static void close_button_clicked(GtkButton *button, gpointer user_data); static gboolean window_destroy(GtkWidget *widget, GdkEvent *event, gpointer user_data); GType ctk_help_get_type( void ) { static GType ctk_help_type = 0; if (!ctk_help_type) { static const GTypeInfo ctk_help_info = { sizeof (CtkHelpClass), NULL, /* base_init */ NULL, /* base_finalize */ NULL, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CtkHelp), 0, /* n_preallocs */ NULL, /* instance_init */ NULL /* value_table */ }; ctk_help_type = g_type_register_static (GTK_TYPE_WINDOW, "CtkHelp", &ctk_help_info, 0); } return ctk_help_type; } GtkWidget* ctk_help_new(GtkWidget *toggle_button, GtkTextTagTable *tag_table) { GObject *object; CtkHelp *ctk_help; GtkWidget *vbox, *hbox; GtkWidget *hseparator; GtkWidget *alignment; GtkWidget *button; GtkWidget *sw; GtkWidget *banner; GtkWidget *frame; GtkWidget *textview; object = g_object_new(CTK_TYPE_HELP, NULL); ctk_help = CTK_HELP(object); ctk_help->toggle_button = toggle_button; gtk_window_set_title(GTK_WINDOW(ctk_help), "NVIDIA X Server Settings Help"); gtk_window_set_default_size(GTK_WINDOW(ctk_help), -1, 400); gtk_container_set_border_width(GTK_CONTAINER(ctk_help), CTK_WINDOW_PAD); vbox = gtk_vbox_new(FALSE, 5); gtk_container_add(GTK_CONTAINER(ctk_help), vbox); /* create the banner */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); banner = ctk_banner_image_new(BANNER_ARTWORK_HELP); gtk_box_pack_start(GTK_BOX(hbox), banner, TRUE, TRUE, 0); /* create the scroll window to hold the text viewer */ frame = gtk_frame_new(NULL); gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); sw = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_container_add(GTK_CONTAINER(frame), sw); /* create the text viewer */ textview = gtk_text_view_new(); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(textview), FALSE); gtk_text_view_set_editable(GTK_TEXT_VIEW(textview), FALSE); ctk_help->text_viewer = textview; gtk_container_add(GTK_CONTAINER(sw), ctk_help->text_viewer); g_object_set(G_OBJECT(ctk_help->text_viewer), "pixels-inside-wrap", 10, NULL); /* save the tag table */ ctk_help->tag_table = tag_table; /* create the default help text */ ctk_help->default_help = create_default_help(ctk_help); gtk_text_view_set_buffer (GTK_TEXT_VIEW(ctk_help->text_viewer), ctk_help->default_help); /* place a horizontal separator */ hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), hseparator, FALSE, FALSE, 0); /* create and place the close button */ hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); alignment = gtk_alignment_new(1, 1, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), button); gtk_box_pack_start(GTK_BOX(hbox), alignment, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(close_button_clicked), (gpointer) ctk_help); /* handle destructive events to the window */ g_signal_connect(G_OBJECT(ctk_help), "destroy-event", G_CALLBACK(window_destroy), (gpointer) ctk_help); g_signal_connect(G_OBJECT(ctk_help), "delete-event", G_CALLBACK(window_destroy), (gpointer) ctk_help); return GTK_WIDGET(ctk_help); } void ctk_help_set_page(CtkHelp *ctk_help, GtkTextBuffer *buffer) { GtkTextBuffer *b; GtkTextIter iter; GtkTextView *view; GtkTextMark *mark; if (buffer) { b = buffer; } else { b = ctk_help->default_help; } view = GTK_TEXT_VIEW(ctk_help->text_viewer); /* set the buffer in the TextView */ gtk_text_view_set_buffer(view, b); /* ensure that the top of the buffer is displayed */ gtk_text_buffer_get_start_iter(b, &iter); mark = gtk_text_buffer_create_mark(b, NULL, &iter, TRUE); gtk_text_view_scroll_to_mark(view, mark, 0.0, TRUE, 0.0, 0.0); gtk_text_buffer_place_cursor(b, &iter); } static GtkTextBuffer *create_default_help(CtkHelp *ctk_help) { GtkTextIter iter, start, end; GtkTextBuffer *buffer; buffer = gtk_text_buffer_new(ctk_help->tag_table); gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0); gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, "\nNVIDIA X Server Settings Help", -1, CTK_HELP_TITLE_TAG, NULL); gtk_text_buffer_insert(buffer, &iter, "\n\nThere is no help available " "for this page.", -1); /* * Apply CTK_HELP_HEADING_NOT_EDITABLE_TAG and * CTK_HELP_WORD_WRAP_TAG to the whole buffer */ gtk_text_buffer_get_bounds(buffer, &start, &end); gtk_text_buffer_apply_tag_by_name (buffer, CTK_HELP_HEADING_NOT_EDITABLE_TAG, &start, &end); gtk_text_buffer_apply_tag_by_name (buffer, CTK_HELP_WORD_WRAP_TAG, &start, &end); gtk_text_buffer_apply_tag_by_name (buffer, CTK_HELP_MARGIN_TAG, &start, &end); return buffer; } GtkTextTagTable *ctk_help_create_tag_table(void) { GtkTextTagTable *table; GtkTextTag *tag; table = gtk_text_tag_table_new(); /* CTK_HELP_TITLE_TAG */ tag = gtk_text_tag_new(CTK_HELP_TITLE_TAG); g_object_set(G_OBJECT(tag), "weight", PANGO_WEIGHT_BOLD, "size", 15 * PANGO_SCALE, NULL); gtk_text_tag_table_add(table, tag); /* CTK_HELP_HEADING_TAG */ tag = gtk_text_tag_new(CTK_HELP_HEADING_TAG); g_object_set(G_OBJECT(tag), "weight", PANGO_WEIGHT_BOLD, "size", 12 * PANGO_SCALE, NULL); gtk_text_tag_table_add(table, tag); /* CTK_HELP_HEADING_NOT_EDITABLE */ tag = gtk_text_tag_new(CTK_HELP_HEADING_NOT_EDITABLE_TAG); g_object_set(G_OBJECT(tag), "editable", FALSE, NULL); gtk_text_tag_table_add(table, tag); /* CTK_HELP_WORD_WRAP_TAG */ tag = gtk_text_tag_new(CTK_HELP_WORD_WRAP_TAG); g_object_set(G_OBJECT(tag), "wrap_mode", GTK_WRAP_WORD, NULL); gtk_text_tag_table_add(table, tag); /* CTK_HELP_MARGIN_TAG */ tag = gtk_text_tag_new(CTK_HELP_MARGIN_TAG); g_object_set(G_OBJECT(tag), "left_margin", 10, "right_margin", 10, NULL); gtk_text_tag_table_add(table, tag); /* CTK_HELP_SINGLE_SPACE_TAG */ tag = gtk_text_tag_new(CTK_HELP_SINGLE_SPACE_TAG); g_object_set(G_OBJECT(tag), "pixels_inside_wrap", 0, NULL); gtk_text_tag_table_add(table, tag); /* CTK_HELP_BOLD_TAG */ tag = gtk_text_tag_new(CTK_HELP_BOLD_TAG); g_object_set(G_OBJECT(tag), "weight", PANGO_WEIGHT_BOLD, NULL); gtk_text_tag_table_add(table, tag); return table; } static void close_button_clicked(GtkButton *button, gpointer user_data) { CtkHelp *ctk_help = CTK_HELP(user_data); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ctk_help->toggle_button), FALSE); } /* close_button_clicked() */ static gboolean window_destroy(GtkWidget *widget, GdkEvent *event, gpointer user_data) { CtkHelp *ctk_help = CTK_HELP(user_data); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ctk_help->toggle_button), FALSE); return TRUE; } /*****************************************************************************/ /* * Utility functions for building a help GtkTextBuffer. */ void ctk_help_title(GtkTextBuffer *buffer, GtkTextIter *iter, const gchar *fmt, ...) { gchar *a, *b; NV_VSNPRINTF(a, fmt); b = g_strconcat("\n", a, "\n", NULL); gtk_text_buffer_insert_with_tags_by_name(buffer, iter, b, -1, CTK_HELP_TITLE_TAG, NULL); g_free(b); free(a); } void ctk_help_para(GtkTextBuffer *buffer, GtkTextIter *iter, const gchar *fmt, ...) { gchar *a, *b; NV_VSNPRINTF(a, fmt); b = g_strconcat("\n", a, "\n", NULL); gtk_text_buffer_insert(buffer, iter, b, -1); g_free(b); free(a); } void ctk_help_heading(GtkTextBuffer *buffer, GtkTextIter *iter, const gchar *fmt, ...) { gchar *a, *b; NV_VSNPRINTF(a, fmt); b = g_strconcat("\n", a, "\n", NULL); gtk_text_buffer_insert_with_tags_by_name(buffer, iter, b, -1, CTK_HELP_HEADING_TAG, NULL); g_free(b); free(a); } void ctk_help_term(GtkTextBuffer *buffer, GtkTextIter *iter, const gchar *fmt, ...) { gchar *a, *b; NV_VSNPRINTF(a, fmt); b = g_strconcat("\n", a, NULL); gtk_text_buffer_insert_with_tags_by_name(buffer, iter, b, -1, CTK_HELP_BOLD_TAG, NULL); g_free(b); free(a); } void ctk_help_finish(GtkTextBuffer *buffer) { GtkTextIter start, end; gtk_text_buffer_get_bounds(buffer, &start, &end); gtk_text_buffer_apply_tag_by_name (buffer, CTK_HELP_HEADING_NOT_EDITABLE_TAG, &start, &end); gtk_text_buffer_apply_tag_by_name (buffer, CTK_HELP_WORD_WRAP_TAG, &start, &end); gtk_text_buffer_apply_tag_by_name (buffer, CTK_HELP_MARGIN_TAG, &start, &end); gtk_text_buffer_apply_tag_by_name (buffer, CTK_HELP_SINGLE_SPACE_TAG, &start, &end); } gchar *ctk_help_create_reset_hardware_defaults_text(gchar *type, gchar *name) { return g_strconcat("The Reset ", type, " Hardware Defaults button restores ", "all ", name, " settings to their default values.", NULL); } void ctk_help_reset_hardware_defaults(GtkTextBuffer *b, GtkTextIter *i, gchar *text) { ctk_help_heading(b, i, "Reset Hardware Defaults"); ctk_help_para(b, i, "%s", text); } static void help_data_list_free_cb(gpointer data, gpointer user_data) { CtkHelpDataItem *item = (CtkHelpDataItem *)data; free(item->label); free(item->help_text); free(item); } void ctk_help_data_list_prepend(GList **list, const gchar *label, const gchar *help_text, const gchar *extended_help_text) { CtkHelpDataItem *item = nvalloc(sizeof(CtkHelpDataItem)); assert(label); assert(help_text); item->label = nvstrdup(label); item->help_text = nvstrdup(help_text); item->extended_help_text = extended_help_text ? nvstrdup(extended_help_text) : NULL; *list = g_list_prepend(*list, item); } void ctk_help_data_list_free_full(GList *list) { g_list_foreach(list, help_data_list_free_cb, NULL); g_list_free(list); } static void help_data_list_print_helper(GtkTextBuffer *b, GtkTextIter *i, GList *help_data_list, gboolean use_headings) { CtkHelpDataItem *item; GList *cur; GString *temp_string; temp_string = g_string_new(""); for (cur = help_data_list; cur; cur = cur->next) { item = (CtkHelpDataItem *)cur->data; if (use_headings) { ctk_help_heading(b, i, "%s", item->label); } else { ctk_help_term(b, i, "%s", item->label); } g_string_printf(temp_string, "%s", item->help_text); if (item->extended_help_text) { g_string_append_printf(temp_string, " %s", item->extended_help_text); } ctk_help_para(b, i, "%s", temp_string->str); } g_string_free(temp_string, TRUE); } void ctk_help_data_list_print_terms(GtkTextBuffer *b, GtkTextIter *i, GList *help_data_list) { help_data_list_print_helper(b, i, help_data_list, FALSE); } void ctk_help_data_list_print_sections(GtkTextBuffer *b, GtkTextIter *i, GList *help_data_list) { help_data_list_print_helper(b, i, help_data_list, TRUE); } nvidia-settings/src/libXNVCtrl/0000775000175000017500000000000012236467170016620 5ustar albertoalbertonvidia-settings/src/libXNVCtrl/NVCtrl.c0000664000175000017500000011221012236467170020131 0ustar albertoalberto/* * Copyright (c) 2008 NVIDIA, Corporation * * 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 (including the next * paragraph) 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. */ /* * Make sure that XTHREADS is defined, so that the * LockDisplay/UnlockDisplay macros are expanded properly and the * libXNVCtrl library properly protects the Display connection. */ #if !defined(XTHREADS) #define XTHREADS #endif /* XTHREADS */ #define NEED_EVENTS #define NEED_REPLIES #include #include #include #include #include #include #include "NVCtrlLib.h" #include "nv_control.h" #define NVCTRL_EXT_EXISTS 1 #define NVCTRL_EXT_NEED_TARGET_SWAP 2 #define NVCTRL_EXT_64_BIT_ATTRIBUTES 4 /* SetAttributeAndGetStatus supports target type other than X_SCREEN */ #define NVCTRL_EXT_HAS_TARGET_SET_GET 8 #define NVCTRL_EXT_NEED_CHECK (~(uintptr_t)0) static XExtensionInfo _nvctrl_ext_info_data; static XExtensionInfo *nvctrl_ext_info = &_nvctrl_ext_info_data; static /* const */ char *nvctrl_extension_name = NV_CONTROL_NAME; #define XNVCTRLCheckExtension(dpy,i,val) \ XextCheckExtension (dpy, i, nvctrl_extension_name, val) #define XNVCTRLSimpleCheckExtension(dpy,i) \ XextSimpleCheckExtension (dpy, i, nvctrl_extension_name) static uintptr_t version_flags(Display *dpy, XExtDisplayInfo *info); static Bool wire_to_event(Display *dpy, XEvent *host, xEvent *wire); // This is needed to define nvctrl_extension_hooks static XEXT_GENERATE_CLOSE_DISPLAY (close_display, nvctrl_ext_info) static /* const */ XExtensionHooks nvctrl_extension_hooks = { NULL, /* create_gc */ NULL, /* copy_gc */ NULL, /* flush_gc */ NULL, /* free_gc */ NULL, /* create_font */ NULL, /* free_font */ close_display, /* close_display */ wire_to_event, /* wire_to_event */ NULL, /* event_to_wire */ NULL, /* error */ NULL, /* error_string */ }; static XEXT_GENERATE_FIND_DISPLAY (find_display, nvctrl_ext_info, nvctrl_extension_name, &nvctrl_extension_hooks, NV_CONTROL_EVENTS, (XPointer)NVCTRL_EXT_NEED_CHECK) /* * NV-CONTROL versions 1.8 and 1.9 pack the target_type and target_id * fields in reversed order. In order to talk to one of these servers, * we need to swap these fields. */ static void XNVCTRLCheckTargetData(Display *dpy, XExtDisplayInfo *info, int *target_type, int *target_id) { uintptr_t flags = version_flags(dpy, info); /* We need to swap the target_type and target_id */ if (flags & NVCTRL_EXT_NEED_TARGET_SWAP) { int tmp; tmp = *target_type; *target_type = *target_id; *target_id = tmp; } } Bool XNVCTRLQueryExtension ( Display *dpy, int *event_basep, int *error_basep ){ XExtDisplayInfo *info = find_display (dpy); if (XextHasExtension(info)) { if (event_basep) *event_basep = info->codes->first_event; if (error_basep) *error_basep = info->codes->first_error; return True; } else { return False; } } /* * Retrieve any cached flags that depend on the version of the NV-CONTROL * extension. */ static uintptr_t version_flags(Display *dpy, XExtDisplayInfo *info) { uintptr_t data = (uintptr_t)info->data; /* If necessary, determine the NV-CONTROL version */ if (data & NVCTRL_EXT_NEED_CHECK) { int major, minor; data = 0; if (XNVCTRLQueryVersion(dpy, &major, &minor)) { data |= NVCTRL_EXT_EXISTS; if (major == 1 && (minor == 8 || minor == 9)) { data |= NVCTRL_EXT_NEED_TARGET_SWAP; } if ((major > 1) || ((major == 1) && (minor > 18))) { data |= NVCTRL_EXT_HAS_TARGET_SET_GET; } if ((major > 1) || ((major == 1) && (minor > 20))) { data |= NVCTRL_EXT_64_BIT_ATTRIBUTES; } } info->data = (XPointer)data; } return data; } Bool XNVCTRLQueryVersion ( Display *dpy, int *major, int *minor ){ XExtDisplayInfo *info = find_display (dpy); xnvCtrlQueryExtensionReply rep; xnvCtrlQueryExtensionReq *req; if(!XextHasExtension(info)) return False; XNVCTRLCheckExtension (dpy, info, False); LockDisplay (dpy); GetReq (nvCtrlQueryExtension, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlQueryExtension; if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { UnlockDisplay (dpy); SyncHandle (); return False; } if (major) *major = rep.major; if (minor) *minor = rep.minor; UnlockDisplay (dpy); SyncHandle (); return True; } Bool XNVCTRLIsNvScreen ( Display *dpy, int screen ){ XExtDisplayInfo *info = find_display (dpy); xnvCtrlIsNvReply rep; xnvCtrlIsNvReq *req; Bool isnv; if(!XextHasExtension(info)) return False; XNVCTRLCheckExtension (dpy, info, False); LockDisplay (dpy); GetReq (nvCtrlIsNv, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlIsNv; req->screen = screen; if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { UnlockDisplay (dpy); SyncHandle (); return False; } isnv = rep.isnv; UnlockDisplay (dpy); SyncHandle (); return isnv; } Bool XNVCTRLQueryTargetCount ( Display *dpy, int target_type, int *value ){ XExtDisplayInfo *info = find_display (dpy); xnvCtrlQueryTargetCountReply rep; xnvCtrlQueryTargetCountReq *req; if(!XextHasExtension(info)) return False; XNVCTRLCheckExtension (dpy, info, False); LockDisplay (dpy); GetReq (nvCtrlQueryTargetCount, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlQueryTargetCount; req->target_type = target_type; if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { UnlockDisplay (dpy); SyncHandle (); return False; } if (value) *value = rep.count; UnlockDisplay (dpy); SyncHandle (); return True; } void XNVCTRLSetTargetAttribute ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, int value ){ XExtDisplayInfo *info = find_display (dpy); xnvCtrlSetAttributeReq *req; XNVCTRLSimpleCheckExtension (dpy, info); XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id); LockDisplay (dpy); GetReq (nvCtrlSetAttribute, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlSetAttribute; req->target_type = target_type; req->target_id = target_id; req->display_mask = display_mask; req->attribute = attribute; req->value = value; UnlockDisplay (dpy); SyncHandle (); } void XNVCTRLSetAttribute ( Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, int value ){ XNVCTRLSetTargetAttribute (dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, display_mask, attribute, value); } Bool XNVCTRLSetTargetAttributeAndGetStatus ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, int value ){ XExtDisplayInfo *info = find_display (dpy); xnvCtrlSetAttributeAndGetStatusReq *req; xnvCtrlSetAttributeAndGetStatusReply rep; Bool success; uintptr_t flags; if(!XextHasExtension(info)) return False; flags = version_flags(dpy, info); if (!(flags & NVCTRL_EXT_EXISTS)) return False; if (!(flags & NVCTRL_EXT_HAS_TARGET_SET_GET) && target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) return False; XNVCTRLCheckExtension (dpy, info, False); LockDisplay (dpy); GetReq (nvCtrlSetAttributeAndGetStatus, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlSetAttributeAndGetStatus; req->target_type = target_type; req->target_id = target_id; req->display_mask = display_mask; req->attribute = attribute; req->value = value; if (!_XReply (dpy, (xReply *) &rep, 0, False)) { UnlockDisplay (dpy); SyncHandle (); return False; } UnlockDisplay (dpy); SyncHandle (); success = rep.flags; return success; } Bool XNVCTRLSetAttributeAndGetStatus ( Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, int value ){ return XNVCTRLSetTargetAttributeAndGetStatus(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, display_mask, attribute, value); } Bool XNVCTRLQueryTargetAttribute ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, int *value ){ XExtDisplayInfo *info = find_display (dpy); xnvCtrlQueryAttributeReply rep; xnvCtrlQueryAttributeReq *req; Bool exists; if(!XextHasExtension(info)) return False; XNVCTRLCheckExtension (dpy, info, False); XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id); LockDisplay (dpy); GetReq (nvCtrlQueryAttribute, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlQueryAttribute; req->target_type = target_type; req->target_id = target_id; req->display_mask = display_mask; req->attribute = attribute; if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { UnlockDisplay (dpy); SyncHandle (); return False; } exists = rep.flags; if (exists && value) *value = rep.value; UnlockDisplay (dpy); SyncHandle (); return exists; } Bool XNVCTRLQueryAttribute ( Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, int *value ){ return XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, display_mask, attribute, value); } Bool XNVCTRLQueryTargetAttribute64 ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, int64_t *value ){ XExtDisplayInfo *info = find_display(dpy); xnvCtrlQueryAttribute64Reply rep; xnvCtrlQueryAttributeReq *req; Bool exists; if (!XextHasExtension(info)) return False; XNVCTRLCheckExtension(dpy, info, False); XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id); LockDisplay(dpy); GetReq(nvCtrlQueryAttribute, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlQueryAttribute64; req->target_type = target_type; req->target_id = target_id; req->display_mask = display_mask; req->attribute = attribute; if (!_XReply(dpy, (xReply *)&rep, 0, xTrue)) { UnlockDisplay(dpy); SyncHandle(); return False; } exists = rep.flags; if (exists && value) *value = rep.value_64; UnlockDisplay(dpy); SyncHandle(); return exists; } Bool XNVCTRLQueryTargetStringAttribute ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, char **ptr ){ XExtDisplayInfo *info = find_display (dpy); xnvCtrlQueryStringAttributeReply rep; xnvCtrlQueryStringAttributeReq *req; Bool exists; int length, numbytes, slop; if (!ptr) return False; if(!XextHasExtension(info)) return False; XNVCTRLCheckExtension (dpy, info, False); XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id); LockDisplay (dpy); GetReq (nvCtrlQueryStringAttribute, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlQueryStringAttribute; req->target_type = target_type; req->target_id = target_id; req->display_mask = display_mask; req->attribute = attribute; if (!_XReply (dpy, (xReply *) &rep, 0, False)) { UnlockDisplay (dpy); SyncHandle (); return False; } length = rep.length; numbytes = rep.n; slop = numbytes & 3; exists = rep.flags; if (exists) { *ptr = (char *) Xmalloc(numbytes); } if (!exists || !*ptr) { _XEatData(dpy, length); UnlockDisplay (dpy); SyncHandle (); return False; } else { _XRead(dpy, (char *) *ptr, numbytes); if (slop) _XEatData(dpy, 4-slop); } UnlockDisplay (dpy); SyncHandle (); return exists; } Bool XNVCTRLQueryStringAttribute ( Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, char **ptr ){ return XNVCTRLQueryTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, display_mask, attribute, ptr); } Bool XNVCTRLSetTargetStringAttribute ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, const char *ptr ){ XExtDisplayInfo *info = find_display (dpy); xnvCtrlSetStringAttributeReq *req; xnvCtrlSetStringAttributeReply rep; int size; Bool success; if(!XextHasExtension(info)) return False; XNVCTRLCheckExtension (dpy, info, False); size = strlen(ptr)+1; LockDisplay (dpy); GetReq (nvCtrlSetStringAttribute, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlSetStringAttribute; req->target_type = target_type; req->target_id = target_id; req->display_mask = display_mask; req->attribute = attribute; req->length += ((size + 3) & ~3) >> 2; req->num_bytes = size; Data(dpy, ptr, size); if (!_XReply (dpy, (xReply *) &rep, 0, False)) { UnlockDisplay (dpy); SyncHandle (); return False; } UnlockDisplay (dpy); SyncHandle (); success = rep.flags; return success; } Bool XNVCTRLSetStringAttribute ( Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, const char *ptr ){ return XNVCTRLSetTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, display_mask, attribute, ptr); } static Bool XNVCTRLQueryValidTargetAttributeValues32 ( Display *dpy, XExtDisplayInfo *info, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, NVCTRLAttributeValidValuesRec *values ){ xnvCtrlQueryValidAttributeValuesReply rep; xnvCtrlQueryValidAttributeValuesReq *req; Bool exists; LockDisplay (dpy); GetReq (nvCtrlQueryValidAttributeValues, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlQueryValidAttributeValues; req->target_type = target_type; req->target_id = target_id; req->display_mask = display_mask; req->attribute = attribute; if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { UnlockDisplay (dpy); SyncHandle (); return False; } exists = rep.flags; if (exists) { values->type = rep.attr_type; if (rep.attr_type == ATTRIBUTE_TYPE_RANGE) { values->u.range.min = rep.min; values->u.range.max = rep.max; } if (rep.attr_type == ATTRIBUTE_TYPE_INT_BITS) { values->u.bits.ints = rep.bits; } values->permissions = rep.perms; } UnlockDisplay (dpy); SyncHandle (); return exists; } Bool XNVCTRLQueryValidTargetStringAttributeValues ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, NVCTRLAttributeValidValuesRec *values ){ XExtDisplayInfo *info = find_display(dpy); Bool exists; xnvCtrlQueryValidAttributeValuesReply rep; xnvCtrlQueryValidAttributeValuesReq *req; if (!values) return False; if (!XextHasExtension(info)) return False; XNVCTRLCheckExtension(dpy, info, False); LockDisplay(dpy); GetReq (nvCtrlQueryValidAttributeValues, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlQueryValidStringAttributeValues; req->target_type = target_type; req->target_id = target_id; req->display_mask = display_mask; req->attribute = attribute; if (!_XReply(dpy, (xReply *)&rep, 0, xTrue)) { UnlockDisplay(dpy); SyncHandle(); return False; } exists = rep.flags; if (exists) { values->type = rep.attr_type; values->permissions = rep.perms; } UnlockDisplay(dpy); SyncHandle(); return exists; } static Bool XNVCTRLQueryValidTargetAttributeValues64 ( Display *dpy, XExtDisplayInfo *info, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, NVCTRLAttributeValidValuesRec *values ){ xnvCtrlQueryValidAttributeValues64Reply rep; xnvCtrlQueryValidAttributeValuesReq *req; Bool exists; LockDisplay(dpy); GetReq(nvCtrlQueryValidAttributeValues, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlQueryValidAttributeValues64; req->target_type = target_type; req->target_id = target_id; req->display_mask = display_mask; req->attribute = attribute; if (!_XReply(dpy, (xReply *)&rep, sz_xnvCtrlQueryValidAttributeValues64Reply_extra, xTrue)) { UnlockDisplay(dpy); SyncHandle(); return False; } exists = rep.flags; if (exists) { values->type = rep.attr_type; if (rep.attr_type == ATTRIBUTE_TYPE_RANGE) { values->u.range.min = rep.min_64; values->u.range.max = rep.max_64; } if (rep.attr_type == ATTRIBUTE_TYPE_INT_BITS) { values->u.bits.ints = rep.bits_64; } values->permissions = rep.perms; } UnlockDisplay(dpy); SyncHandle(); return exists; } Bool XNVCTRLQueryValidTargetAttributeValues ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, NVCTRLAttributeValidValuesRec *values ){ XExtDisplayInfo *info = find_display(dpy); Bool exists; uintptr_t flags; if (!values) return False; if (!XextHasExtension(info)) return False; XNVCTRLCheckExtension(dpy, info, False); XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id); flags = version_flags(dpy,info); if (!(flags & NVCTRL_EXT_EXISTS)) return False; if (flags & NVCTRL_EXT_64_BIT_ATTRIBUTES) { exists = XNVCTRLQueryValidTargetAttributeValues64(dpy, info, target_type, target_id, display_mask, attribute, values); } else { exists = XNVCTRLQueryValidTargetAttributeValues32(dpy, info, target_type, target_id, display_mask, attribute, values); } return exists; } Bool XNVCTRLQueryValidAttributeValues ( Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, NVCTRLAttributeValidValuesRec *values ){ return XNVCTRLQueryValidTargetAttributeValues(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, display_mask, attribute, values); } static Bool QueryAttributePermissionsInternal ( Display *dpy, unsigned int attribute, NVCTRLAttributePermissionsRec *permissions, unsigned int reqType ){ XExtDisplayInfo *info = find_display (dpy); xnvCtrlQueryAttributePermissionsReply rep; xnvCtrlQueryAttributePermissionsReq *req; Bool exists; if(!XextHasExtension(info)) return False; XNVCTRLCheckExtension (dpy, info, False); LockDisplay(dpy); GetReq(nvCtrlQueryAttributePermissions, req); req->reqType = info->codes->major_opcode; req->nvReqType = reqType; req->attribute = attribute; if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { UnlockDisplay (dpy); SyncHandle(); return False; } exists = rep.flags; if (exists && permissions) { permissions->type = rep.attr_type; permissions->permissions = rep.perms; } UnlockDisplay(dpy); SyncHandle(); return exists; } Bool XNVCTRLQueryAttributePermissions ( Display *dpy, unsigned int attribute, NVCTRLAttributePermissionsRec *permissions ){ return QueryAttributePermissionsInternal(dpy, attribute, permissions, X_nvCtrlQueryAttributePermissions); } Bool XNVCTRLQueryStringAttributePermissions ( Display *dpy, unsigned int attribute, NVCTRLAttributePermissionsRec *permissions ){ return QueryAttributePermissionsInternal(dpy, attribute, permissions, X_nvCtrlQueryStringAttributePermissions); } Bool XNVCTRLQueryBinaryDataAttributePermissions ( Display *dpy, unsigned int attribute, NVCTRLAttributePermissionsRec *permissions ){ return QueryAttributePermissionsInternal(dpy, attribute, permissions, X_nvCtrlQueryBinaryDataAttributePermissions); } Bool XNVCTRLQueryStringOperationAttributePermissions ( Display *dpy, unsigned int attribute, NVCTRLAttributePermissionsRec *permissions ){ return QueryAttributePermissionsInternal(dpy, attribute, permissions, X_nvCtrlQueryStringOperationAttributePermissions); } void XNVCTRLSetGvoColorConversion ( Display *dpy, int screen, float colorMatrix[3][3], float colorOffset[3], float colorScale[3] ){ XExtDisplayInfo *info = find_display (dpy); xnvCtrlSetGvoColorConversionReq *req; XNVCTRLSimpleCheckExtension (dpy, info); LockDisplay (dpy); GetReq (nvCtrlSetGvoColorConversion, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlSetGvoColorConversion; req->screen = screen; req->cscMatrix_y_r = colorMatrix[0][0]; req->cscMatrix_y_g = colorMatrix[0][1]; req->cscMatrix_y_b = colorMatrix[0][2]; req->cscMatrix_cr_r = colorMatrix[1][0]; req->cscMatrix_cr_g = colorMatrix[1][1]; req->cscMatrix_cr_b = colorMatrix[1][2]; req->cscMatrix_cb_r = colorMatrix[2][0]; req->cscMatrix_cb_g = colorMatrix[2][1]; req->cscMatrix_cb_b = colorMatrix[2][2]; req->cscOffset_y = colorOffset[0]; req->cscOffset_cr = colorOffset[1]; req->cscOffset_cb = colorOffset[2]; req->cscScale_y = colorScale[0]; req->cscScale_cr = colorScale[1]; req->cscScale_cb = colorScale[2]; UnlockDisplay (dpy); SyncHandle (); } Bool XNVCTRLQueryGvoColorConversion ( Display *dpy, int screen, float colorMatrix[3][3], float colorOffset[3], float colorScale[3] ){ XExtDisplayInfo *info = find_display (dpy); xnvCtrlQueryGvoColorConversionReply rep; xnvCtrlQueryGvoColorConversionReq *req; if(!XextHasExtension(info)) return False; XNVCTRLCheckExtension (dpy, info, False); LockDisplay (dpy); GetReq (nvCtrlQueryGvoColorConversion, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlQueryGvoColorConversion; req->screen = screen; if (!_XReply(dpy, (xReply *) &rep, 0, xFalse)) { UnlockDisplay (dpy); SyncHandle (); return False; } _XRead(dpy, (char *)(colorMatrix), 36); _XRead(dpy, (char *)(colorOffset), 12); _XRead(dpy, (char *)(colorScale), 12); UnlockDisplay (dpy); SyncHandle (); return True; } Bool XNVCtrlSelectTargetNotify ( Display *dpy, int target_type, int target_id, int notify_type, Bool onoff ){ XExtDisplayInfo *info = find_display (dpy); xnvCtrlSelectTargetNotifyReq *req; if(!XextHasExtension (info)) return False; XNVCTRLCheckExtension (dpy, info, False); LockDisplay (dpy); GetReq (nvCtrlSelectTargetNotify, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlSelectTargetNotify; req->target_type = target_type; req->target_id = target_id; req->notifyType = notify_type; req->onoff = onoff; UnlockDisplay (dpy); SyncHandle (); return True; } Bool XNVCtrlSelectNotify ( Display *dpy, int screen, int type, Bool onoff ){ XExtDisplayInfo *info = find_display (dpy); xnvCtrlSelectNotifyReq *req; if(!XextHasExtension (info)) return False; XNVCTRLCheckExtension (dpy, info, False); LockDisplay (dpy); GetReq (nvCtrlSelectNotify, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlSelectNotify; req->screen = screen; req->notifyType = type; req->onoff = onoff; UnlockDisplay (dpy); SyncHandle (); return True; } Bool XNVCTRLQueryTargetBinaryData ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, unsigned char **ptr, int *len ){ XExtDisplayInfo *info = find_display (dpy); xnvCtrlQueryBinaryDataReply rep; xnvCtrlQueryBinaryDataReq *req; Bool exists; int length, numbytes, slop; if (!ptr) return False; if(!XextHasExtension(info)) return False; XNVCTRLCheckExtension (dpy, info, False); XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id); LockDisplay (dpy); GetReq (nvCtrlQueryBinaryData, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlQueryBinaryData; req->target_type = target_type; req->target_id = target_id; req->display_mask = display_mask; req->attribute = attribute; if (!_XReply (dpy, (xReply *) &rep, 0, False)) { UnlockDisplay (dpy); SyncHandle (); return False; } length = rep.length; numbytes = rep.n; slop = numbytes & 3; exists = rep.flags; if (exists) { *ptr = (unsigned char *) Xmalloc(numbytes); } if (!exists || !*ptr) { _XEatData(dpy, length); UnlockDisplay (dpy); SyncHandle (); return False; } else { _XRead(dpy, (char *) *ptr, numbytes); if (slop) _XEatData(dpy, 4-slop); } if (len) *len = numbytes; UnlockDisplay (dpy); SyncHandle (); return exists; } Bool XNVCTRLQueryBinaryData ( Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, unsigned char **ptr, int *len ){ return XNVCTRLQueryTargetBinaryData(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, display_mask, attribute, ptr, len); } Bool XNVCTRLStringOperation ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, const char *pIn, char **ppOut ) { XExtDisplayInfo *info = find_display(dpy); xnvCtrlStringOperationReq *req; xnvCtrlStringOperationReply rep; Bool ret; int inSize, outSize, length, slop; if (!XextHasExtension(info)) return False; if (!ppOut) return False; *ppOut = NULL; XNVCTRLCheckExtension(dpy, info, False); XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id); if (pIn) { inSize = strlen(pIn) + 1; } else { inSize = 0; } LockDisplay(dpy); GetReq(nvCtrlStringOperation, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlStringOperation; req->target_type = target_type; req->target_id = target_id; req->display_mask = display_mask; req->attribute = attribute; req->length += ((inSize + 3) & ~3) >> 2; req->num_bytes = inSize; if (pIn) { Data(dpy, pIn, inSize); } if (!_XReply (dpy, (xReply *) &rep, 0, False)) { UnlockDisplay(dpy); SyncHandle(); return False; } length = rep.length; outSize = rep.num_bytes; slop = outSize & 3; if (outSize) *ppOut = (char *) Xmalloc(outSize); if (!*ppOut) { _XEatData(dpy, length); } else { _XRead(dpy, (char *) *ppOut, outSize); if (slop) _XEatData(dpy, 4-slop); } ret = rep.ret; UnlockDisplay(dpy); SyncHandle(); return ret; } Bool XNVCTRLBindWarpPixmapName ( Display *dpy, int screen, Pixmap pix, const char *name, unsigned int dataType, unsigned int vertexCount ) { XExtDisplayInfo *info = find_display(dpy); xnvCtrlBindWarpPixmapNameReq *req; unsigned int nameLen; if (!XextHasExtension(info)) return False; if (!name) return False; nameLen = strlen(name) + 1; XNVCTRLCheckExtension(dpy, info, False); LockDisplay(dpy); GetReq(nvCtrlBindWarpPixmapName, req); req->reqType = info->codes->major_opcode; req->nvReqType = X_nvCtrlBindWarpPixmapName; req->length += ((nameLen + 3) & ~3) >> 2; req->num_bytes = nameLen; req->screen = screen; req->pixmap = pix; req->dataType = dataType; req->vertexCount = vertexCount; Data(dpy, name, nameLen); UnlockDisplay(dpy); SyncHandle(); return True; } static Bool wire_to_event (Display *dpy, XEvent *host, xEvent *wire) { XExtDisplayInfo *info = find_display (dpy); XNVCtrlEvent *re; xnvctrlEvent *event; XNVCtrlEventTarget *reTarget; xnvctrlEventTarget *eventTarget; XNVCtrlEventTargetAvailability *reTargetAvailability; XNVCtrlStringEventTarget *reTargetString; XNVCtrlBinaryEventTarget *reTargetBinary; XNVCTRLCheckExtension (dpy, info, False); switch ((wire->u.u.type & 0x7F) - info->codes->first_event) { case ATTRIBUTE_CHANGED_EVENT: re = (XNVCtrlEvent *) host; event = (xnvctrlEvent *) wire; re->attribute_changed.type = event->u.u.type & 0x7F; re->attribute_changed.serial = _XSetLastRequestRead(dpy, (xGenericReply*) event); re->attribute_changed.send_event = ((event->u.u.type & 0x80) != 0); re->attribute_changed.display = dpy; re->attribute_changed.time = event->u.attribute_changed.time; re->attribute_changed.screen = event->u.attribute_changed.screen; re->attribute_changed.display_mask = event->u.attribute_changed.display_mask; re->attribute_changed.attribute = event->u.attribute_changed.attribute; re->attribute_changed.value = event->u.attribute_changed.value; break; case TARGET_ATTRIBUTE_CHANGED_EVENT: reTarget = (XNVCtrlEventTarget *) host; eventTarget = (xnvctrlEventTarget *) wire; reTarget->attribute_changed.type = eventTarget->u.u.type & 0x7F; reTarget->attribute_changed.serial = _XSetLastRequestRead(dpy, (xGenericReply*) eventTarget); reTarget->attribute_changed.send_event = ((eventTarget->u.u.type & 0x80) != 0); reTarget->attribute_changed.display = dpy; reTarget->attribute_changed.time = eventTarget->u.attribute_changed.time; reTarget->attribute_changed.target_type = eventTarget->u.attribute_changed.target_type; reTarget->attribute_changed.target_id = eventTarget->u.attribute_changed.target_id; reTarget->attribute_changed.display_mask = eventTarget->u.attribute_changed.display_mask; reTarget->attribute_changed.attribute = eventTarget->u.attribute_changed.attribute; reTarget->attribute_changed.value = eventTarget->u.attribute_changed.value; break; case TARGET_ATTRIBUTE_AVAILABILITY_CHANGED_EVENT: reTargetAvailability = (XNVCtrlEventTargetAvailability *) host; eventTarget = (xnvctrlEventTarget *) wire; reTargetAvailability->attribute_changed.type = eventTarget->u.u.type & 0x7F; reTargetAvailability->attribute_changed.serial = _XSetLastRequestRead(dpy, (xGenericReply*) eventTarget); reTargetAvailability->attribute_changed.send_event = ((eventTarget->u.u.type & 0x80) != 0); reTargetAvailability->attribute_changed.display = dpy; reTargetAvailability->attribute_changed.time = eventTarget->u.availability_changed.time; reTargetAvailability->attribute_changed.target_type = eventTarget->u.availability_changed.target_type; reTargetAvailability->attribute_changed.target_id = eventTarget->u.availability_changed.target_id; reTargetAvailability->attribute_changed.display_mask = eventTarget->u.availability_changed.display_mask; reTargetAvailability->attribute_changed.attribute = eventTarget->u.availability_changed.attribute; reTargetAvailability->attribute_changed.availability = eventTarget->u.availability_changed.availability; reTargetAvailability->attribute_changed.value = eventTarget->u.availability_changed.value; break; case TARGET_STRING_ATTRIBUTE_CHANGED_EVENT: reTargetString = (XNVCtrlStringEventTarget *) host; eventTarget = (xnvctrlEventTarget *) wire; reTargetString->attribute_changed.type = eventTarget->u.u.type & 0x7F; reTargetString->attribute_changed.serial = _XSetLastRequestRead(dpy, (xGenericReply*) eventTarget); reTargetString->attribute_changed.send_event = ((eventTarget->u.u.type & 0x80) != 0); reTargetString->attribute_changed.display = dpy; reTargetString->attribute_changed.time = eventTarget->u.attribute_changed.time; reTargetString->attribute_changed.target_type = eventTarget->u.attribute_changed.target_type; reTargetString->attribute_changed.target_id = eventTarget->u.attribute_changed.target_id; reTargetString->attribute_changed.display_mask = eventTarget->u.attribute_changed.display_mask; reTargetString->attribute_changed.attribute = eventTarget->u.attribute_changed.attribute; break; case TARGET_BINARY_ATTRIBUTE_CHANGED_EVENT: reTargetBinary = (XNVCtrlBinaryEventTarget *) host; eventTarget = (xnvctrlEventTarget *) wire; reTargetBinary->attribute_changed.type = eventTarget->u.u.type & 0x7F; reTargetBinary->attribute_changed.serial = _XSetLastRequestRead(dpy, (xGenericReply*) eventTarget); reTargetBinary->attribute_changed.send_event = ((eventTarget->u.u.type & 0x80) != 0); reTargetBinary->attribute_changed.display = dpy; reTargetBinary->attribute_changed.time = eventTarget->u.attribute_changed.time; reTargetBinary->attribute_changed.target_type = eventTarget->u.attribute_changed.target_type; reTargetBinary->attribute_changed.target_id = eventTarget->u.attribute_changed.target_id; reTargetBinary->attribute_changed.display_mask = eventTarget->u.attribute_changed.display_mask; reTargetBinary->attribute_changed.attribute = eventTarget->u.attribute_changed.attribute; break; default: return False; } return True; } nvidia-settings/src/libXNVCtrl/NVCtrlLib.h0000664000175000017500000005517012236467170020600 0ustar albertoalberto/* * Copyright (c) 2008 NVIDIA, Corporation * * 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 (including the next * paragraph) 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. */ #ifndef __NVCTRLLIB_H #define __NVCTRLLIB_H #include "NVCtrl.h" #if defined __cplusplus extern "C" { #endif /* * XNVCTRLQueryExtension - * * Returns True if the extension exists, returns False otherwise. * event_basep and error_basep are the extension event and error * bases. Currently, no extension specific errors or events are * defined. */ Bool XNVCTRLQueryExtension ( Display *dpy, int *event_basep, int *error_basep ); /* * XNVCTRLQueryVersion - * * Returns True if the extension exists, returns False otherwise. * major and minor are the extension's major and minor version * numbers. */ Bool XNVCTRLQueryVersion ( Display *dpy, int *major, int *minor ); /* * XNVCTRLIsNvScreen * * Returns True is the specified screen is controlled by the NVIDIA * driver. Returns False otherwise. */ Bool XNVCTRLIsNvScreen ( Display *dpy, int screen ); /* * XNVCTRLQueryTargetCount - * * Returns True if the target type exists. Returns False otherwise. * If XNVCTRLQueryTargetCount returns True, value will contain the * count of existing targets on the server of the specified target * type. * * Please see "Attribute Targets" in NVCtrl.h for the list of valid * target types. * * Possible errors: * BadValue - The target doesn't exist. */ Bool XNVCTRLQueryTargetCount ( Display *dpy, int target_type, int *value ); /* * XNVCTRLSetAttribute - * * Sets the attribute to the given value. The attributes and their * possible values are listed in NVCtrl.h. * * Not all attributes require the display_mask parameter; see * NVCtrl.h for details. * * Calling this function is equivalent to calling XNVCTRLSetTargetAttribute() * with the target_type set to NV_CTRL_TARGET_TYPE_X_SCREEN and * target_id set to 'screen'. * * Possible errors: * BadValue - The screen or attribute doesn't exist. * BadMatch - The NVIDIA driver is not present on that screen. */ void XNVCTRLSetAttribute ( Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, int value ); /* * XNVCTRLSetTargetAttribute - * * Sets the attribute to the given value. The attributes and their * possible values are listed in NVCtrl.h. * * Not all attributes require the display_mask parameter; see * NVCtrl.h for details. * * Possible errors: * BadValue - The target or attribute doesn't exist. * BadMatch - The NVIDIA driver is not present on that target. */ void XNVCTRLSetTargetAttribute ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, int value ); /* * XNVCTRLSetAttributeAndGetStatus - * * Same as XNVCTRLSetAttribute(). * In addition, XNVCTRLSetAttributeAndGetStatus() returns * True if the operation succeeds, False otherwise. * */ Bool XNVCTRLSetAttributeAndGetStatus ( Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, int value ); /* * XNVCTRLSetTargetAttributeAndGetStatus - * * Same as XNVCTRLSetTargetAttribute(). * In addition, XNVCTRLSetTargetAttributeAndGetStatus() returns * True if the operation succeeds, False otherwise. * */ Bool XNVCTRLSetTargetAttributeAndGetStatus ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, int value ); /* * XNVCTRLQueryAttribute - * * Returns True if the attribute exists. Returns False otherwise. * If XNVCTRLQueryAttribute returns True, value will contain the * value of the specified attribute. * * Not all attributes require the display_mask parameter; see * NVCtrl.h for details. * * Calling this function is equivalent to calling * XNVCTRLQueryTargetAttribute() with the target_type set to * NV_CTRL_TARGET_TYPE_X_SCREEN and target_id set to 'screen'. * * Possible errors: * BadValue - The screen doesn't exist. * BadMatch - The NVIDIA driver is not present on that screen. */ Bool XNVCTRLQueryAttribute ( Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, int *value ); /* * XNVCTRLQueryTargetAttribute - * * Returns True if the attribute exists. Returns False otherwise. * If XNVCTRLQueryTargetAttribute returns True, value will contain the * value of the specified attribute. * * Not all attributes require the display_mask parameter; see * NVCtrl.h for details. * * Possible errors: * BadValue - The target doesn't exist. * BadMatch - The NVIDIA driver does not control the target. */ Bool XNVCTRLQueryTargetAttribute ( Display *dpy, int target_Type, int target_id, unsigned int display_mask, unsigned int attribute, int *value ); /* * XNVCTRLQueryTargetAttribute64 - * * Returns True if the attribute exists. Returns False otherwise. * If XNVCTRLQueryTargetAttribute returns True, value will contain the * value of the specified attribute. * * Not all attributes require the display_mask parameter; see * NVCtrl.h for details. * * Note: this function behaves like XNVCTRLQueryTargetAttribute(), * but supports 64-bit integer attributes. * * Possible errors: * BadValue - The target doesn't exist. * BadMatch - The NVIDIA driver does not control the target. */ Bool XNVCTRLQueryTargetAttribute64 ( Display *dpy, int target_Type, int target_id, unsigned int display_mask, unsigned int attribute, int64_t *value ); /* * XNVCTRLQueryStringAttribute - * * Returns True if the attribute exists. Returns False otherwise. * If XNVCTRLQueryStringAttribute returns True, *ptr will point to an * allocated string containing the string attribute requested. It is * the caller's responsibility to free the string when done. * * Calling this function is equivalent to calling * XNVCTRLQueryTargetStringAttribute() with the target_type set to * NV_CTRL_TARGET_TYPE_X_SCREEN and target_id set to 'screen'. * * Possible errors: * BadValue - The screen doesn't exist. * BadMatch - The NVIDIA driver is not present on that screen. * BadAlloc - Insufficient resources to fulfill the request. */ Bool XNVCTRLQueryStringAttribute ( Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, char **ptr ); /* * XNVCTRLQueryTargetStringAttribute - * * Returns True if the attribute exists. Returns False otherwise. * If XNVCTRLQueryTargetStringAttribute returns True, *ptr will point * to an allocated string containing the string attribute requested. * It is the caller's responsibility to free the string when done. * * Possible errors: * BadValue - The target doesn't exist. * BadMatch - The NVIDIA driver does not control the target. * BadAlloc - Insufficient resources to fulfill the request. */ Bool XNVCTRLQueryTargetStringAttribute ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, char **ptr ); /* * XNVCTRLSetStringAttribute - * * Returns True if the operation succeded. Returns False otherwise. * * Possible X errors: * BadValue - The screen doesn't exist. * BadMatch - The NVIDIA driver is not present on that screen. * BadAlloc - Insufficient resources to fulfill the request. */ Bool XNVCTRLSetStringAttribute ( Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, const char *ptr ); /* * XNVCTRLSetTargetStringAttribute - * * Returns True if the operation succeded. Returns False otherwise. * * Possible X errors: * BadValue - The screen doesn't exist. * BadMatch - The NVIDIA driver is not present on that screen. * BadAlloc - Insufficient resources to fulfill the request. */ Bool XNVCTRLSetTargetStringAttribute ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, const char *ptr ); /* * XNVCTRLQueryValidAttributeValues - * * Returns True if the attribute exists. Returns False otherwise. If * XNVCTRLQueryValidAttributeValues returns True, values will indicate * the valid values for the specified attribute; see the description * of NVCTRLAttributeValidValues in NVCtrl.h. * * Calling this function is equivalent to calling * XNVCTRLQueryValidTargetAttributeValues() with the target_type set to * NV_CTRL_TARGET_TYPE_X_SCREEN and target_id set to 'screen'. */ Bool XNVCTRLQueryValidAttributeValues ( Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, NVCTRLAttributeValidValuesRec *values ); /* * XNVCTRLQueryValidTargetAttributeValues - * * Returns True if the attribute exists. Returns False otherwise. If * XNVCTRLQueryValidTargetAttributeValues returns True, values will indicate * the valid values for the specified attribute. */ Bool XNVCTRLQueryValidTargetAttributeValues ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, NVCTRLAttributeValidValuesRec *values ); /* * XNVCTRLQueryValidTargetStringAttributeValues - * * Returns True if the attribute exists. Returns False otherwise. If * XNVCTRLQueryValidTargetStringAttributeValues returns True, values will * indicate the valid values for the specified attribute. */ Bool XNVCTRLQueryValidTargetStringAttributeValues ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, NVCTRLAttributeValidValuesRec *values ); /* * XNVCTRLQueryAttributePermissions - * * Returns True if the attribute exists. Returns False otherwise. If * XNVCTRLQueryAttributePermissions returns True, permissions will * indicate the permission flags for the attribute. It excludes read * and write permissions. */ Bool XNVCTRLQueryAttributePermissions ( Display *dpy, unsigned int attribute, NVCTRLAttributePermissionsRec *permissions ); /* * XNVCTRLQueryStringAttributePermissions - * * Returns True if the attribute exists. Returns False otherwise. If * XNVCTRLQueryStringAttributePermissions returns True, permissions will * indicate the permission flags for the attribute. */ Bool XNVCTRLQueryStringAttributePermissions ( Display *dpy, unsigned int attribute, NVCTRLAttributePermissionsRec *permissions ); /* * XNVCTRLQueryBinaryDataAttributePermissions - * * Returns True if the attribute exists. Returns False otherwise. If * XNVCTRLQueryBinaryDataAttributePermissions returns True, permissions * will indicate the permission flags for the attribute. */ Bool XNVCTRLQueryBinaryDataAttributePermissions ( Display *dpy, unsigned int attribute, NVCTRLAttributePermissionsRec *permissions ); /* * XNVCTRLQueryStringOperationAttributePermissions - * * Returns True if the attribute exists. Returns False otherwise. If * XNVCTRLQueryStringOperationAttributePermissions returns True, * permissions will indicate the permission flags for the attribute. */ Bool XNVCTRLQueryStringOperationAttributePermissions ( Display *dpy, unsigned int attribute, NVCTRLAttributePermissionsRec *permissions ); /* * XNVCTRLSetGvoColorConversion - * * Sets the color conversion matrix, offset, and scale that should be * used for GVO (Graphic to Video Out). * * The Color Space Conversion data is ordered like this: * * colorMatrix[0][0] // r.Y * colorMatrix[0][1] // g.Y * colorMatrix[0][2] // b.Y * * colorMatrix[1][0] // r.Cr * colorMatrix[1][1] // g.Cr * colorMatrix[1][2] // b.Cr * * colorMatrix[2][0] // r.Cb * colorMatrix[2][1] // g.Cb * colorMatrix[2][2] // b.Cb * * colorOffset[0] // Y * colorOffset[1] // Cr * colorOffset[2] // Cb * * colorScale[0] // Y * colorScale[1] // Cr * colorScale[2] // Cb * * where the data is used according to the following formulae: * * Y = colorOffset[0] + colorScale[0] * * (R * colorMatrix[0][0] + * G * colorMatrix[0][1] + * B * colorMatrix[0][2]); * * Cr = colorOffset[1] + colorScale[1] * * (R * colorMatrix[1][0] + * G * colorMatrix[1][1] + * B * colorMatrix[1][2]); * * Cb = colorOffset[2] + colorScale[2] * * (R * colorMatrix[2][0] + * G * colorMatrix[2][1] + * B * colorMatrix[2][2]); * * Possible errors: * BadMatch - The NVIDIA driver is not present on that screen. * BadImplementation - GVO is not available on that screen. */ void XNVCTRLSetGvoColorConversion ( Display *dpy, int screen, float colorMatrix[3][3], float colorOffset[3], float colorScale[3] ); /* * XNVCTRLQueryGvoColorConversion - * * Retrieves the color conversion matrix and color offset * that are currently being used for GVO (Graphic to Video Out). * * The values are ordered within the arrays according to the comments * for XNVCTRLSetGvoColorConversion(). * * Possible errors: * BadMatch - The NVIDIA driver is not present on that screen. * BadImplementation - GVO is not available on that screen. */ Bool XNVCTRLQueryGvoColorConversion ( Display *dpy, int screen, float colorMatrix[3][3], float colorOffset[3], float colorScale[3] ); /* * XNVCTRLQueryBinaryData - * * Returns True if the attribute exists. Returns False otherwise. * If XNVCTRLQueryBinaryData returns True, *ptr will point to an * allocated block of memory containing the binary data attribute * requested. It is the caller's responsibility to free the data * when done. len will list the length of the binary data. * * Calling this function is equivalent to calling * XNVCTRLQueryTargetBinaryData() with the target_type set to * NV_CTRL_TARGET_TYPE_X_SCREEN and target_id set to 'screen'. * * Possible errors: * BadValue - The screen doesn't exist. * BadMatch - The NVIDIA driver is not present on that screen. * BadAlloc - Insufficient resources to fulfill the request. */ Bool XNVCTRLQueryBinaryData ( Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, unsigned char **ptr, int *len ); /* * XNVCTRLQueryTargetBinaryData - * * Returns True if the attribute exists. Returns False otherwise. * If XNVCTRLQueryTargetBinaryData returns True, *ptr will point to an * allocated block of memory containing the binary data attribute * requested. It is the caller's responsibility to free the data * when done. len will list the length of the binary data. * * Possible errors: * BadValue - The target doesn't exist. * BadMatch - The NVIDIA driver does not control the target. * BadAlloc - Insufficient resources to fulfill the request. */ Bool XNVCTRLQueryTargetBinaryData ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, unsigned char **ptr, int *len ); /* * XNVCTRLStringOperation - * * Takes a string as input and returns a Xmalloc'ed string as output. * Returns True on success and False on failure. */ Bool XNVCTRLStringOperation ( Display *dpy, int target_type, int target_id, unsigned int display_mask, unsigned int attribute, const char *pIn, char **ppOut ); /* * XNVCTRLBindWarpPixmapName - * * Binds a Pixmap to a string name and some meta-data. If the Pixmap is None, * a previously bound name will be released from its Pixmap. * * These names are to be used with the "WarpMesh", "BlendTexture" and * "OffsetTexture" MetaMode attributes. * * Returns True if successful, or False if the screen is not * controlled by the NVIDIA driver. * * dataType should be one of: * - NV_CTRL_WARP_DATA_TYPE_BLEND_OR_OFFSET_TEXTURE * - NV_CTRL_WARP_DATA_TYPE_MESH_TRIANGLESTRIP_XYUVRQ * - NV_CTRL_WARP_DATA_TYPE_MESH_TRIANGLES_XYUVRQ * * For dataType = NV_CTRL_WARP_DATA_TYPE_MESH_*, the named Pixmap is expected * to have a width multiple of 1024 pixels, have a depth of 32 and contain a * binary representation of a list of six-component vertices. Each of these * components is a 32-bit floating point value. * * The XY components should contain normalized vertex coordinates, to be * rendered as a triangle list or strip. The X and Y components' [0,1] range * map to the display's MetaMode ViewportOut X and Y, respectively. * * The U, V, R, and Q components should contain normalized, projective texture * coordinates: * U, V: 2D texture coordinate. U and V components' [0,1] range maps to the * display's MetaMode ViewportIn X and Y, respectively. * R: unused * Q: Used for interpolation purposes. This is typically the third component * of the result of a multiplication by a 3x3 projective transform matrix. * * vertexCount should contain the amount of vertices represented by the Pixmap * and is ignored if dataType = NV_CTRL_WARP_DATA_TYPE_BLEND_OR_OFFSET_TEXTURE. * * Possible errors: * BadValue - The screen index is out of range * BadMatch - The screen isn't being driven by the NVIDIA driver * BadMatch - If pixmap_id is None, couldn't find the name to release. * BadPixmap - Couldn't find the Pixmap referenced by pixmap_id. * BadMatch - pixmap_id names a Pixmap owned by a different screen. * BadValue - dataType isn't one of NV_CTRL_WARP_DATA_TYPE_*. * BadAlloc - Insufficient resources to fulfill the request. * Possible errors if dataType is NV_CTRL_WARP_DATA_TYPE_MESH_*: * BadMatch - The Pixmap's width isn't a multiple of 1024. * BadMatch - The Pixmap's depth isn't 32. * BadMatch - The Pixmap cannot contain vertexCount XYUVRQ vertices. * BadValue - Invalid vertexCount for the data type. */ Bool XNVCTRLBindWarpPixmapName ( Display *dpy, int screen, Pixmap pixmap_id, const char *name, unsigned int dataType, unsigned int vertexCount ); /* * XNVCtrlSelectNotify - * * This enables/disables receiving of NV-CONTROL events. The type * specifies the type of event to enable (currently, the only * type that can be requested per-screen with XNVCtrlSelectNotify() * is ATTRIBUTE_CHANGED_EVENT); onoff controls whether receiving this * type of event should be enabled (True) or disabled (False). * * Returns True if successful, or False if the screen is not * controlled by the NVIDIA driver. */ Bool XNVCtrlSelectNotify ( Display *dpy, int screen, int type, Bool onoff ); /* * XNVCtrlSelectTargetNotify - * * This enables/disables receiving of NV-CONTROL events that happen on * the specified target. The notify_type specifies the type of event to * enable (currently, the only type that can be requested per-target with * XNVCtrlSelectTargetNotify() is TARGET_ATTRIBUTE_CHANGED_EVENT); onoff * controls whether receiving this type of event should be enabled (True) * or disabled (False). * * Returns True if successful, or False if the target is not * controlled by the NVIDIA driver. */ Bool XNVCtrlSelectTargetNotify ( Display *dpy, int target_type, int target_id, int notify_type, Bool onoff ); /* * XNVCtrlEvent structure */ typedef struct { int type; unsigned long serial; Bool send_event; /* always FALSE, we don't allow send_events */ Display *display; Time time; int screen; unsigned int display_mask; unsigned int attribute; int value; } XNVCtrlAttributeChangedEvent; typedef union { int type; XNVCtrlAttributeChangedEvent attribute_changed; long pad[24]; } XNVCtrlEvent; /* * XNVCtrlEventTarget structure */ typedef struct { int type; unsigned long serial; Bool send_event; /* always FALSE, we don't allow send_events */ Display *display; Time time; int target_type; int target_id; unsigned int display_mask; unsigned int attribute; int value; } XNVCtrlAttributeChangedEventTarget; typedef union { int type; XNVCtrlAttributeChangedEventTarget attribute_changed; long pad[24]; } XNVCtrlEventTarget; /* * XNVCtrlEventTargetAvailability structure */ typedef struct { int type; unsigned long serial; Bool send_event; /* always FALSE, we don't allow send_events */ Display *display; Time time; int target_type; int target_id; unsigned int display_mask; unsigned int attribute; int value; Bool availability; } XNVCtrlAttributeChangedEventTargetAvailability; typedef union { int type; XNVCtrlAttributeChangedEventTargetAvailability attribute_changed; long pad[24]; } XNVCtrlEventTargetAvailability; /* * XNVCtrlStringEventTarget structure */ typedef struct { int type; unsigned long serial; Bool send_event; /* always FALSE, we don't allow send_events */ Display *display; Time time; int target_type; int target_id; unsigned int display_mask; unsigned int attribute; } XNVCtrlStringAttributeChangedEventTarget; typedef union { int type; XNVCtrlStringAttributeChangedEventTarget attribute_changed; long pad[24]; } XNVCtrlStringEventTarget; /* * XNVCtrlBinaryEventTarget structure */ typedef struct { int type; unsigned long serial; Bool send_event; /* always FALSE, we don't allow send_events */ Display *display; Time time; int target_type; int target_id; unsigned int display_mask; unsigned int attribute; } XNVCtrlBinaryAttributeChangedEventTarget; typedef union { int type; XNVCtrlBinaryAttributeChangedEventTarget attribute_changed; long pad[24]; } XNVCtrlBinaryEventTarget; #if defined __cplusplus } /* extern "C" */ #endif #endif /* __NVCTRLLIB_H */ nvidia-settings/src/libXNVCtrl/NVCtrl.h0000664000175000017500000055546612236467170020166 0ustar albertoalberto/* * Copyright (c) 2010 NVIDIA, Corporation * * 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 (including the next * paragraph) 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. */ #ifndef __NVCTRL_H #define __NVCTRL_H #include /**************************************************************************/ /* * Attribute Targets * * Targets define attribute groups. For example, some attributes are only * valid to set on a GPU, others are only valid when talking about an * X Screen. Target types are then what is used to identify the target * group of the attribute you wish to set/query. * * Here are the supported target types: */ #define NV_CTRL_TARGET_TYPE_X_SCREEN 0 #define NV_CTRL_TARGET_TYPE_GPU 1 #define NV_CTRL_TARGET_TYPE_FRAMELOCK 2 #define NV_CTRL_TARGET_TYPE_VCSC 3 /* Visual Computing System */ #define NV_CTRL_TARGET_TYPE_GVI 4 #define NV_CTRL_TARGET_TYPE_COOLER 5 /* e.g., fan */ #define NV_CTRL_TARGET_TYPE_THERMAL_SENSOR 6 #define NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER 7 #define NV_CTRL_TARGET_TYPE_DISPLAY 8 /**************************************************************************/ /* * Attributes * * Some attributes may only be read; some may require a display_mask * argument and others may be valid only for specific target types. * This information is encoded in the "permission" comment after each * attribute #define, and can be queried at run time with * XNVCTRLQueryValidAttributeValues() and/or * XNVCTRLQueryValidTargetAttributeValues() * * Key to Integer Attribute "Permissions": * * R: The attribute is readable (in general, all attributes will be * readable) * * W: The attribute is writable (attributes may not be writable for * various reasons: they represent static system information, they * can only be changed by changing an XF86Config option, etc). * * D: The attribute requires the display mask argument. The * attributes NV_CTRL_CONNECTED_DISPLAYS and NV_CTRL_ENABLED_DISPLAYS * will be a bitmask of what display devices are connected and what * display devices are enabled for use in X, respectively. Each bit * in the bitmask represents a display device; it is these bits which * should be used as the display_mask when dealing with attributes * designated with "D" below. For attributes that do not require the * display mask, the argument is ignored. * * Alternatively, NV-CONTROL versions 1.27 and greater allow these * attributes to be accessed via display target types, in which case * the display_mask is ignored. * * G: The attribute may be queried using an NV_CTRL_TARGET_TYPE_GPU * target type via XNVCTRLQueryTargetAttribute(). * * F: The attribute may be queried using an NV_CTRL_TARGET_TYPE_FRAMELOCK * target type via XNVCTRLQueryTargetAttribute(). * * X: When Xinerama is enabled, this attribute is kept consistent across * all Physical X Screens; assignment of this attribute will be * broadcast by the NVIDIA X Driver to all X Screens. * * V: The attribute may be queried using an NV_CTRL_TARGET_TYPE_VCSC * target type via XNVCTRLQueryTargetAttribute(). * * I: The attribute may be queried using an NV_CTRL_TARGET_TYPE_GVI target type * via XNVCTRLQueryTargetAttribute(). * * Q: The attribute is a 64-bit integer attribute; use the 64-bit versions * of the appropriate query interfaces. * * C: The attribute may be queried using an NV_CTRL_TARGET_TYPE_COOLER target * type via XNVCTRLQueryTargetAttribute(). * * S: The attribute may be queried using an NV_CTRL_TARGET_TYPE_THERMAL_SENSOR * target type via XNVCTRLQueryTargetAttribute(). * * T: The attribute may be queried using an * NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER target type * via XNVCTRLQueryTargetAttribute(). * * NOTE: Unless mentioned otherwise, all attributes may be queried using * an NV_CTRL_TARGET_TYPE_X_SCREEN target type via * XNVCTRLQueryTargetAttribute(). */ /**************************************************************************/ /* * Integer attributes: * * Integer attributes can be queried through the XNVCTRLQueryAttribute() and * XNVCTRLQueryTargetAttribute() function calls. * * Integer attributes can be set through the XNVCTRLSetAttribute() and * XNVCTRLSetTargetAttribute() function calls. * * Unless otherwise noted, all integer attributes can be queried/set * using an NV_CTRL_TARGET_TYPE_X_SCREEN target. Attributes that cannot * take an NV_CTRL_TARGET_TYPE_X_SCREEN also cannot be queried/set through * XNVCTRLQueryAttribute()/XNVCTRLSetAttribute() (Since these assume * an X Screen target). */ /* * NV_CTRL_FLATPANEL_SCALING - not supported */ #define NV_CTRL_FLATPANEL_SCALING 2 /* RWDG */ #define NV_CTRL_FLATPANEL_SCALING_DEFAULT 0 #define NV_CTRL_FLATPANEL_SCALING_NATIVE 1 #define NV_CTRL_FLATPANEL_SCALING_SCALED 2 #define NV_CTRL_FLATPANEL_SCALING_CENTERED 3 #define NV_CTRL_FLATPANEL_SCALING_ASPECT_SCALED 4 /* * NV_CTRL_FLATPANEL_DITHERING is deprecated; NV_CTRL_DITHERING should * be used instead. */ #define NV_CTRL_FLATPANEL_DITHERING 3 /* RWDG */ #define NV_CTRL_FLATPANEL_DITHERING_DEFAULT 0 #define NV_CTRL_FLATPANEL_DITHERING_ENABLED 1 #define NV_CTRL_FLATPANEL_DITHERING_DISABLED 2 /* * NV_CTRL_DITHERING - the requested dithering configuration; * possible values are: * * 0: auto (the driver will decide when to dither) * 1: enabled (the driver will always dither when possible) * 2: disabled (the driver will never dither) */ #define NV_CTRL_DITHERING 3 /* RWDG */ #define NV_CTRL_DITHERING_AUTO 0 #define NV_CTRL_DITHERING_ENABLED 1 #define NV_CTRL_DITHERING_DISABLED 2 /* * NV_CTRL_DIGITAL_VIBRANCE - sets the digital vibrance level for the * specified display device. */ #define NV_CTRL_DIGITAL_VIBRANCE 4 /* RWDG */ /* * NV_CTRL_BUS_TYPE - returns the bus type through which the specified device * is connected to the computer. * When this attribute is queried on an X screen target, the bus type of the * GPU driving the X screen is returned. */ #define NV_CTRL_BUS_TYPE 5 /* R--GI */ #define NV_CTRL_BUS_TYPE_AGP 0 #define NV_CTRL_BUS_TYPE_PCI 1 #define NV_CTRL_BUS_TYPE_PCI_EXPRESS 2 #define NV_CTRL_BUS_TYPE_INTEGRATED 3 /* * NV_CTRL_TOTAL_GPU_MEMORY - returns the total amount of memory available * to the specified GPU (or the GPU driving the specified X * screen). Note: if the GPU supports TurboCache(TM), the value * reported may exceed the amount of video memory installed on the * GPU. The value reported for integrated GPUs may likewise exceed * the amount of dedicated system memory set aside by the system * BIOS for use by the integrated GPU. */ #define NV_CTRL_TOTAL_GPU_MEMORY 6 /* R--G */ #define NV_CTRL_VIDEO_RAM NV_CTRL_TOTAL_GPU_MEMORY /* * NV_CTRL_IRQ - returns the interrupt request line used by the specified * device. * When this attribute is queried on an X screen target, the IRQ of the GPU * driving the X screen is returned. */ #define NV_CTRL_IRQ 7 /* R--GI */ /* * NV_CTRL_OPERATING_SYSTEM - returns the operating system on which * the X server is running. */ #define NV_CTRL_OPERATING_SYSTEM 8 /* R--G */ #define NV_CTRL_OPERATING_SYSTEM_LINUX 0 #define NV_CTRL_OPERATING_SYSTEM_FREEBSD 1 #define NV_CTRL_OPERATING_SYSTEM_SUNOS 2 /* * NV_CTRL_SYNC_TO_VBLANK - enables sync to vblank for OpenGL clients. * This setting is only applied to OpenGL clients that are started * after this setting is applied. */ #define NV_CTRL_SYNC_TO_VBLANK 9 /* RW-X */ #define NV_CTRL_SYNC_TO_VBLANK_OFF 0 #define NV_CTRL_SYNC_TO_VBLANK_ON 1 /* * NV_CTRL_LOG_ANISO - enables anisotropic filtering for OpenGL * clients; on some NVIDIA hardware, this can only be enabled or * disabled; on other hardware different levels of anisotropic * filtering can be specified. This setting is only applied to OpenGL * clients that are started after this setting is applied. */ #define NV_CTRL_LOG_ANISO 10 /* RW-X */ /* * NV_CTRL_FSAA_MODE - the FSAA setting for OpenGL clients; possible * FSAA modes: * * NV_CTRL_FSAA_MODE_2x "2x Bilinear Multisampling" * NV_CTRL_FSAA_MODE_2x_5t "2x Quincunx Multisampling" * NV_CTRL_FSAA_MODE_15x15 "1.5 x 1.5 Supersampling" * NV_CTRL_FSAA_MODE_2x2 "2 x 2 Supersampling" * NV_CTRL_FSAA_MODE_4x "4x Bilinear Multisampling" * NV_CTRL_FSAA_MODE_4x_9t "4x Gaussian Multisampling" * NV_CTRL_FSAA_MODE_8x "2x Bilinear Multisampling by 4x Supersampling" * NV_CTRL_FSAA_MODE_16x "4x Bilinear Multisampling by 4x Supersampling" * NV_CTRL_FSAA_MODE_8xS "4x Multisampling by 2x Supersampling" * * This setting is only applied to OpenGL clients that are started * after this setting is applied. */ #define NV_CTRL_FSAA_MODE 11 /* RW-X */ #define NV_CTRL_FSAA_MODE_NONE 0 #define NV_CTRL_FSAA_MODE_2x 1 #define NV_CTRL_FSAA_MODE_2x_5t 2 #define NV_CTRL_FSAA_MODE_15x15 3 #define NV_CTRL_FSAA_MODE_2x2 4 #define NV_CTRL_FSAA_MODE_4x 5 #define NV_CTRL_FSAA_MODE_4x_9t 6 #define NV_CTRL_FSAA_MODE_8x 7 #define NV_CTRL_FSAA_MODE_16x 8 #define NV_CTRL_FSAA_MODE_8xS 9 #define NV_CTRL_FSAA_MODE_8xQ 10 #define NV_CTRL_FSAA_MODE_16xS 11 #define NV_CTRL_FSAA_MODE_16xQ 12 #define NV_CTRL_FSAA_MODE_32xS 13 #define NV_CTRL_FSAA_MODE_32x 14 #define NV_CTRL_FSAA_MODE_64xS 15 #define NV_CTRL_FSAA_MODE_MAX NV_CTRL_FSAA_MODE_64xS /* * NV_CTRL_TEXTURE_SHARPEN - enables texture sharpening for OpenGL * clients. This setting is only applied to OpenGL clients that are * started after this setting is applied. */ #define NV_CTRL_TEXTURE_SHARPEN 12 /* RW-X */ #define NV_CTRL_TEXTURE_SHARPEN_OFF 0 #define NV_CTRL_TEXTURE_SHARPEN_ON 1 /* * NV_CTRL_UBB - returns whether UBB is enabled for the specified X * screen. */ #define NV_CTRL_UBB 13 /* R-- */ #define NV_CTRL_UBB_OFF 0 #define NV_CTRL_UBB_ON 1 /* * NV_CTRL_OVERLAY - returns whether the RGB overlay is enabled for * the specified X screen. */ #define NV_CTRL_OVERLAY 14 /* R-- */ #define NV_CTRL_OVERLAY_OFF 0 #define NV_CTRL_OVERLAY_ON 1 /* * NV_CTRL_STEREO - returns whether stereo (and what type) is enabled * for the specified X screen. */ #define NV_CTRL_STEREO 16 /* R-- */ #define NV_CTRL_STEREO_OFF 0 #define NV_CTRL_STEREO_DDC 1 #define NV_CTRL_STEREO_BLUELINE 2 #define NV_CTRL_STEREO_DIN 3 #define NV_CTRL_STEREO_PASSIVE_EYE_PER_DPY 4 #define NV_CTRL_STEREO_VERTICAL_INTERLACED 5 #define NV_CTRL_STEREO_COLOR_INTERLACED 6 #define NV_CTRL_STEREO_HORIZONTAL_INTERLACED 7 #define NV_CTRL_STEREO_CHECKERBOARD_PATTERN 8 #define NV_CTRL_STEREO_INVERSE_CHECKERBOARD_PATTERN 9 #define NV_CTRL_STEREO_3D_VISION 10 #define NV_CTRL_STEREO_3D_VISION_PRO 11 #define NV_CTRL_STEREO_HDMI_3D 12 /* * NV_CTRL_EMULATE - controls OpenGL software emulation of future * NVIDIA GPUs. */ #define NV_CTRL_EMULATE 17 /* RW- */ #define NV_CTRL_EMULATE_NONE 0 /* * NV_CTRL_TWINVIEW - returns whether TwinView is enabled for the * specified X screen. */ #define NV_CTRL_TWINVIEW 18 /* R-- */ #define NV_CTRL_TWINVIEW_NOT_ENABLED 0 #define NV_CTRL_TWINVIEW_ENABLED 1 /* * NV_CTRL_CONNECTED_DISPLAYS - returns a display mask indicating the last * cached state of the display devices connected to the GPU or GPU driving * the specified X screen. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. */ #define NV_CTRL_CONNECTED_DISPLAYS 19 /* R--G */ /* * NV_CTRL_ENABLED_DISPLAYS - returns a display mask indicating what * display devices are enabled for use on the specified X screen or * GPU. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. */ #define NV_CTRL_ENABLED_DISPLAYS 20 /* R--G */ /**************************************************************************/ /* * Integer attributes specific to configuring Frame Lock on boards that * support it. */ /* * NV_CTRL_FRAMELOCK - returns whether the underlying GPU supports * Frame Lock. All of the other frame lock attributes are only * applicable if NV_CTRL_FRAMELOCK is _SUPPORTED. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. */ #define NV_CTRL_FRAMELOCK 21 /* R--G */ #define NV_CTRL_FRAMELOCK_NOT_SUPPORTED 0 #define NV_CTRL_FRAMELOCK_SUPPORTED 1 /* * NV_CTRL_FRAMELOCK_MASTER is deprecated; NV_CTRL_FRAMELOCK_DISPLAY_CONFIG * should be used instead. */ #define NV_CTRL_FRAMELOCK_MASTER 22 /* RW-G */ #define NV_CTRL_FRAMELOCK_MASTER_FALSE 0 // deprecated #define NV_CTRL_FRAMELOCK_MASTER_TRUE 1 // deprecated /* * NV_CTRL_FRAMELOCK_POLARITY - sync either to the rising edge of the * frame lock pulse, the falling edge of the frame lock pulse or both. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN * target. */ #define NV_CTRL_FRAMELOCK_POLARITY 23 /* RW-F */ #define NV_CTRL_FRAMELOCK_POLARITY_RISING_EDGE 0x1 #define NV_CTRL_FRAMELOCK_POLARITY_FALLING_EDGE 0x2 #define NV_CTRL_FRAMELOCK_POLARITY_BOTH_EDGES 0x3 /* * NV_CTRL_FRAMELOCK_SYNC_DELAY - delay between the frame lock pulse * and the GPU sync. This value must be multiplied by * NV_CTRL_FRAMELOCK_SYNC_DELAY_RESOLUTION to determine the sync delay in * nanoseconds. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN * target. * * USAGE NODE: NV_CTRL_FRAMELOCK_SYNC_DELAY_MAX and * NV_CTRL_FRAMELOCK_SYNC_DELAY_FACTOR are deprecated. * The Sync Delay _MAX and _FACTOR are different for different * Quadro Sync products and so, to be correct, the valid values for * NV_CTRL_FRAMELOCK_SYNC_DELAY must be queried to get the range * of acceptable sync delay values, and * NV_CTRL_FRAMELOCK_SYNC_DELAY_RESOLUTION must be queried to * obtain the correct factor. */ #define NV_CTRL_FRAMELOCK_SYNC_DELAY 24 /* RW-F */ #define NV_CTRL_FRAMELOCK_SYNC_DELAY_MAX 2047 // deprecated #define NV_CTRL_FRAMELOCK_SYNC_DELAY_FACTOR 7.81 // deprecated /* * NV_CTRL_FRAMELOCK_SYNC_INTERVAL - how many house sync pulses * between the frame lock sync generation (0 == sync every house sync); * this only applies to the master when receiving house sync. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN * target. */ #define NV_CTRL_FRAMELOCK_SYNC_INTERVAL 25 /* RW-F */ /* * NV_CTRL_FRAMELOCK_PORT0_STATUS - status of the rj45 port0. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN * target. */ #define NV_CTRL_FRAMELOCK_PORT0_STATUS 26 /* R--F */ #define NV_CTRL_FRAMELOCK_PORT0_STATUS_INPUT 0 #define NV_CTRL_FRAMELOCK_PORT0_STATUS_OUTPUT 1 /* * NV_CTRL_FRAMELOCK_PORT1_STATUS - status of the rj45 port1. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN * target. */ #define NV_CTRL_FRAMELOCK_PORT1_STATUS 27 /* R--F */ #define NV_CTRL_FRAMELOCK_PORT1_STATUS_INPUT 0 #define NV_CTRL_FRAMELOCK_PORT1_STATUS_OUTPUT 1 /* * NV_CTRL_FRAMELOCK_HOUSE_STATUS - returns whether or not the house * sync signal was detected on the BNC connector of the frame lock * board. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN * target. */ #define NV_CTRL_FRAMELOCK_HOUSE_STATUS 28 /* R--F */ #define NV_CTRL_FRAMELOCK_HOUSE_STATUS_NOT_DETECTED 0 #define NV_CTRL_FRAMELOCK_HOUSE_STATUS_DETECTED 1 /* * NV_CTRL_FRAMELOCK_SYNC - enable/disable the syncing of display * devices to the frame lock pulse as specified by previous calls to * NV_CTRL_FRAMELOCK_DISPLAY_CONFIG. * * This attribute can only be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_GPU target. This attribute cannot be * queried using a NV_CTRL_TARGET_TYPE_X_SCREEN. */ #define NV_CTRL_FRAMELOCK_SYNC 29 /* RW-G */ #define NV_CTRL_FRAMELOCK_SYNC_DISABLE 0 #define NV_CTRL_FRAMELOCK_SYNC_ENABLE 1 /* * NV_CTRL_FRAMELOCK_SYNC_READY - reports whether a frame lock * board is receiving sync (regardless of whether or not any display * devices are using the sync). * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN * target. */ #define NV_CTRL_FRAMELOCK_SYNC_READY 30 /* R--F */ #define NV_CTRL_FRAMELOCK_SYNC_READY_FALSE 0 #define NV_CTRL_FRAMELOCK_SYNC_READY_TRUE 1 /* * NV_CTRL_FRAMELOCK_STEREO_SYNC - this indicates that the GPU stereo * signal is in sync with the frame lock stereo signal. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN * target. */ #define NV_CTRL_FRAMELOCK_STEREO_SYNC 31 /* R--G */ #define NV_CTRL_FRAMELOCK_STEREO_SYNC_FALSE 0 #define NV_CTRL_FRAMELOCK_STEREO_SYNC_TRUE 1 /* * NV_CTRL_FRAMELOCK_TEST_SIGNAL - to test the connections in the sync * group, tell the master to enable a test signal, then query port[01] * status and sync_ready on all slaves. When done, tell the master to * disable the test signal. Test signal should only be manipulated * while NV_CTRL_FRAMELOCK_SYNC is enabled. * * The TEST_SIGNAL is also used to reset the Universal Frame Count (as * returned by the glXQueryFrameCountNV() function in the * GLX_NV_swap_group extension). Note: for best accuracy of the * Universal Frame Count, it is recommended to toggle the TEST_SIGNAL * on and off after enabling frame lock. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. */ #define NV_CTRL_FRAMELOCK_TEST_SIGNAL 32 /* RW-G */ #define NV_CTRL_FRAMELOCK_TEST_SIGNAL_DISABLE 0 #define NV_CTRL_FRAMELOCK_TEST_SIGNAL_ENABLE 1 /* * NV_CTRL_FRAMELOCK_ETHERNET_DETECTED - The frame lock boards are * cabled together using regular cat5 cable, connecting to rj45 ports * on the backplane of the card. There is some concern that users may * think these are ethernet ports and connect them to a * router/hub/etc. The hardware can detect this and will shut off to * prevent damage (either to itself or to the router). * NV_CTRL_FRAMELOCK_ETHERNET_DETECTED may be called to find out if * ethernet is connected to one of the rj45 ports. An appropriate * error message should then be displayed. The _PORT0 and _PORT1 * values may be or'ed together. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN * target. */ #define NV_CTRL_FRAMELOCK_ETHERNET_DETECTED 33 /* R--F */ #define NV_CTRL_FRAMELOCK_ETHERNET_DETECTED_NONE 0 #define NV_CTRL_FRAMELOCK_ETHERNET_DETECTED_PORT0 0x1 #define NV_CTRL_FRAMELOCK_ETHERNET_DETECTED_PORT1 0x2 /* * NV_CTRL_FRAMELOCK_VIDEO_MODE - get/set what video mode is used * to interperate the house sync signal. This should only be set * on the master. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN * target. */ #define NV_CTRL_FRAMELOCK_VIDEO_MODE 34 /* RW-F */ #define NV_CTRL_FRAMELOCK_VIDEO_MODE_NONE 0 #define NV_CTRL_FRAMELOCK_VIDEO_MODE_TTL 1 #define NV_CTRL_FRAMELOCK_VIDEO_MODE_NTSCPALSECAM 2 #define NV_CTRL_FRAMELOCK_VIDEO_MODE_HDTV 3 /* * During FRAMELOCK bring-up, the above values were redefined to * these: */ #define NV_CTRL_FRAMELOCK_VIDEO_MODE_COMPOSITE_AUTO 0 #define NV_CTRL_FRAMELOCK_VIDEO_MODE_TTL 1 #define NV_CTRL_FRAMELOCK_VIDEO_MODE_COMPOSITE_BI_LEVEL 2 #define NV_CTRL_FRAMELOCK_VIDEO_MODE_COMPOSITE_TRI_LEVEL 3 /* * NV_CTRL_FRAMELOCK_SYNC_RATE - this is the refresh rate that the * frame lock board is sending to the GPU, in milliHz. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN * target. */ #define NV_CTRL_FRAMELOCK_SYNC_RATE 35 /* R--F */ /**************************************************************************/ /* * NV_CTRL_FORCE_GENERIC_CPU - inhibit the use of CPU specific * features such as MMX, SSE, or 3DNOW! for OpenGL clients; this * option may result in performance loss, but may be useful in * conjunction with software such as the Valgrind memory debugger. * This setting is only applied to OpenGL clients that are started * after this setting is applied. * * USAGE NOTE: This attribute is deprecated. CPU compatibility is now * checked each time during initialization. */ #define NV_CTRL_FORCE_GENERIC_CPU 37 /* RW-X */ #define NV_CTRL_FORCE_GENERIC_CPU_DISABLE 0 #define NV_CTRL_FORCE_GENERIC_CPU_ENABLE 1 /* * NV_CTRL_OPENGL_AA_LINE_GAMMA - for OpenGL clients, allow * Gamma-corrected antialiased lines to consider variances in the * color display capabilities of output devices when rendering smooth * lines. Only available on recent Quadro GPUs. This setting is only * applied to OpenGL clients that are started after this setting is * applied. */ #define NV_CTRL_OPENGL_AA_LINE_GAMMA 38 /* RW-X */ #define NV_CTRL_OPENGL_AA_LINE_GAMMA_DISABLE 0 #define NV_CTRL_OPENGL_AA_LINE_GAMMA_ENABLE 1 /* * NV_CTRL_FRAMELOCK_TIMING - this is TRUE when the gpu is both receiving * and locked to an input timing signal. Timing information may come from * the following places: Another frame lock device that is set to master, * the house sync signal, or the GPU's internal timing from a display * device. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. */ #define NV_CTRL_FRAMELOCK_TIMING 39 /* R--G */ #define NV_CTRL_FRAMELOCK_TIMING_FALSE 0 #define NV_CTRL_FRAMELOCK_TIMING_TRUE 1 /* * NV_CTRL_FLIPPING_ALLOWED - when TRUE, OpenGL will swap by flipping * when possible; when FALSE, OpenGL will alway swap by blitting. */ #define NV_CTRL_FLIPPING_ALLOWED 40 /* RW-X */ #define NV_CTRL_FLIPPING_ALLOWED_FALSE 0 #define NV_CTRL_FLIPPING_ALLOWED_TRUE 1 /* * NV_CTRL_ARCHITECTURE - returns the architecture on which the X server is * running. */ #define NV_CTRL_ARCHITECTURE 41 /* R-- */ #define NV_CTRL_ARCHITECTURE_X86 0 #define NV_CTRL_ARCHITECTURE_X86_64 1 #define NV_CTRL_ARCHITECTURE_IA64 2 #define NV_CTRL_ARCHITECTURE_ARM 3 /* * NV_CTRL_TEXTURE_CLAMPING - texture clamping mode in OpenGL. By * default, _SPEC is used, which forces OpenGL texture clamping to * conform with the OpenGL specification. _EDGE forces NVIDIA's * OpenGL implementation to remap GL_CLAMP to GL_CLAMP_TO_EDGE, * which is not strictly conformant, but some applications rely on * the non-conformant behavior. */ #define NV_CTRL_TEXTURE_CLAMPING 42 /* RW-X */ #define NV_CTRL_TEXTURE_CLAMPING_EDGE 0 #define NV_CTRL_TEXTURE_CLAMPING_SPEC 1 /* * The NV_CTRL_CURSOR_SHADOW attributes are no longer supported; use * an ARGB cursor instead. */ #define NV_CTRL_CURSOR_SHADOW 43 /* --- */ #define NV_CTRL_CURSOR_SHADOW_DISABLE 0 #define NV_CTRL_CURSOR_SHADOW_ENABLE 1 #define NV_CTRL_CURSOR_SHADOW_ALPHA 44 /* --- */ #define NV_CTRL_CURSOR_SHADOW_RED 45 /* --- */ #define NV_CTRL_CURSOR_SHADOW_GREEN 46 /* --- */ #define NV_CTRL_CURSOR_SHADOW_BLUE 47 /* --- */ #define NV_CTRL_CURSOR_SHADOW_X_OFFSET 48 /* --- */ #define NV_CTRL_CURSOR_SHADOW_Y_OFFSET 49 /* --- */ /* * When Application Control for FSAA is enabled, then what the * application requests is used, and NV_CTRL_FSAA_MODE is ignored. If * this is disabled, then any application setting is overridden with * NV_CTRL_FSAA_MODE */ #define NV_CTRL_FSAA_APPLICATION_CONTROLLED 50 /* RW-X */ #define NV_CTRL_FSAA_APPLICATION_CONTROLLED_ENABLED 1 #define NV_CTRL_FSAA_APPLICATION_CONTROLLED_DISABLED 0 /* * When Application Control for LogAniso is enabled, then what the * application requests is used, and NV_CTRL_LOG_ANISO is ignored. If * this is disabled, then any application setting is overridden with * NV_CTRL_LOG_ANISO */ #define NV_CTRL_LOG_ANISO_APPLICATION_CONTROLLED 51 /* RW-X */ #define NV_CTRL_LOG_ANISO_APPLICATION_CONTROLLED_ENABLED 1 #define NV_CTRL_LOG_ANISO_APPLICATION_CONTROLLED_DISABLED 0 /* * IMAGE_SHARPENING adjusts the sharpness of the display's image * quality by amplifying high frequency content. Valid values will * normally be in the range [0,32). Only available on GeForceFX or * newer. */ #define NV_CTRL_IMAGE_SHARPENING 52 /* RWDG */ /* * NV_CTRL_TV_OVERSCAN - not supported */ #define NV_CTRL_TV_OVERSCAN 53 /* RWDG */ /* * NV_CTRL_TV_FLICKER_FILTER - not supported */ #define NV_CTRL_TV_FLICKER_FILTER 54 /* RWDG */ /* * NV_CTRL_TV_BRIGHTNESS - not supported */ #define NV_CTRL_TV_BRIGHTNESS 55 /* RWDG */ /* * NV_CTRL_TV_HUE - not supported */ #define NV_CTRL_TV_HUE 56 /* RWDG */ /* * NV_CTRL_TV_CONTRAST - not suppoerted */ #define NV_CTRL_TV_CONTRAST 57 /* RWDG */ /* * NV_CTRL_TV_SATURATION - not supported */ #define NV_CTRL_TV_SATURATION 58 /* RWDG */ /* * NV_CTRL_TV_RESET_SETTINGS - not supported */ #define NV_CTRL_TV_RESET_SETTINGS 59 /* -WDG */ /* * NV_CTRL_GPU_CORE_TEMPERATURE reports the current core temperature * of the GPU driving the X screen. */ #define NV_CTRL_GPU_CORE_TEMPERATURE 60 /* R--G */ /* * NV_CTRL_GPU_CORE_THRESHOLD reports the current GPU core slowdown * threshold temperature, NV_CTRL_GPU_DEFAULT_CORE_THRESHOLD and * NV_CTRL_GPU_MAX_CORE_THRESHOLD report the default and MAX core * slowdown threshold temperatures. * * NV_CTRL_GPU_CORE_THRESHOLD reflects the temperature at which the * GPU is throttled to prevent overheating. */ #define NV_CTRL_GPU_CORE_THRESHOLD 61 /* R--G */ #define NV_CTRL_GPU_DEFAULT_CORE_THRESHOLD 62 /* R--G */ #define NV_CTRL_GPU_MAX_CORE_THRESHOLD 63 /* R--G */ /* * NV_CTRL_AMBIENT_TEMPERATURE reports the current temperature in the * immediate neighbourhood of the GPU driving the X screen. */ #define NV_CTRL_AMBIENT_TEMPERATURE 64 /* R--G */ /* * NV_CTRL_PBUFFER_SCANOUT_SUPPORTED - returns whether this X screen * supports scanout of FP pbuffers; * * if this screen does not support PBUFFER_SCANOUT, then all other * PBUFFER_SCANOUT attributes are unavailable. * * PBUFFER_SCANOUT is supported if and only if: * - Twinview is configured with clone mode. The secondary screen is used to * scanout the pbuffer. * - The desktop is running in with 16 bits per pixel. */ #define NV_CTRL_PBUFFER_SCANOUT_SUPPORTED 65 /* R-- */ #define NV_CTRL_PBUFFER_SCANOUT_FALSE 0 #define NV_CTRL_PBUFFER_SCANOUT_TRUE 1 /* * NV_CTRL_PBUFFER_SCANOUT_XID indicates the XID of the pbuffer used for * scanout. */ #define NV_CTRL_PBUFFER_SCANOUT_XID 66 /* RW- */ /**************************************************************************/ /* * The NV_CTRL_GVO_* integer attributes are used to configure GVO * (Graphics to Video Out). This functionality is available, for * example, on the Quadro FX 4000 SDI graphics board. * * The following is a typical usage pattern for the GVO attributes: * * - query NV_CTRL_GVO_SUPPORTED to determine if the X screen supports GV0. * * - specify NV_CTRL_GVO_SYNC_MODE (one of FREE_RUNNING, GENLOCK, or * FRAMELOCK); if you specify GENLOCK or FRAMELOCK, you should also * specify NV_CTRL_GVO_SYNC_SOURCE. * * - Use NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED and * NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED to detect what input syncs are * present. * * (If no analog sync is detected but it is known that a valid * bi-level or tri-level sync is connected set * NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE appropriately and * retest with NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED). * * - if syncing to input sync, query the * NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT attribute; note that Input video * format can only be queried after SYNC_SOURCE is specified. * * - specify the NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT * * - specify the NV_CTRL_GVO_DATA_FORMAT * * - specify any custom Color Space Conversion (CSC) matrix, offset, * and scale with XNVCTRLSetGvoColorConversion(). * * - if using the GLX_NV_video_out extension to display one or more * pbuffers, call glXGetVideoDeviceNV() to lock the GVO output for use * by the GLX client; then bind the pbuffer(s) to the GVO output with * glXBindVideoImageNV() and send pbuffers to the GVO output with * glXSendPbufferToVideoNV(); see the GLX_NV_video_out spec for more * details. * * - if using the GLX_NV_present_video extension, call * glXBindVideoDeviceNV() to bind the GVO video device to current * OpenGL context. * * Note that setting most GVO attributes only causes the value to be * cached in the X server. The values will be flushed to the hardware * either when the next MetaMode is set that uses the GVO display * device, or when a GLX pbuffer is bound to the GVO output (with * glXBindVideoImageNV()). * * Note that GLX_NV_video_out/GLX_NV_present_video and X screen use * are mutually exclusive. If a MetaMode is currently using the GVO * device, then glXGetVideoDeviceNV and glXBindVideoImageNV() will * fail. Similarly, if a GLX client has locked the GVO output (via * glXGetVideoDeviceNV or glXBindVideoImageNV), then setting a * MetaMode that uses the GVO device will fail. The * NV_CTRL_GVO_GLX_LOCKED event will be sent when a GLX client locks * the GVO output. * */ /* * NV_CTRL_GVO_SUPPORTED - returns whether this X screen supports GVO; * if this screen does not support GVO output, then all other GVO * attributes are unavailable. */ #define NV_CTRL_GVO_SUPPORTED 67 /* R-- */ #define NV_CTRL_GVO_SUPPORTED_FALSE 0 #define NV_CTRL_GVO_SUPPORTED_TRUE 1 /* * NV_CTRL_GVO_SYNC_MODE - selects the GVO sync mode; possible values * are: * * FREE_RUNNING - GVO does not sync to any external signal * * GENLOCK - the GVO output is genlocked to an incoming sync signal; * genlocking locks at hsync. This requires that the output video * format exactly match the incoming sync video format. * * FRAMELOCK - the GVO output is frame locked to an incoming sync * signal; frame locking locks at vsync. This requires that the output * video format have the same refresh rate as the incoming sync video * format. */ #define NV_CTRL_GVO_SYNC_MODE 68 /* RW- */ #define NV_CTRL_GVO_SYNC_MODE_FREE_RUNNING 0 #define NV_CTRL_GVO_SYNC_MODE_GENLOCK 1 #define NV_CTRL_GVO_SYNC_MODE_FRAMELOCK 2 /* * NV_CTRL_GVO_SYNC_SOURCE - if NV_CTRL_GVO_SYNC_MODE is set to either * GENLOCK or FRAMELOCK, this controls which sync source is used as * the incoming sync signal (either Composite or SDI). If * NV_CTRL_GVO_SYNC_MODE is FREE_RUNNING, this attribute has no * effect. */ #define NV_CTRL_GVO_SYNC_SOURCE 69 /* RW- */ #define NV_CTRL_GVO_SYNC_SOURCE_COMPOSITE 0 #define NV_CTRL_GVO_SYNC_SOURCE_SDI 1 /* * NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT - specifies the desired output video * format for GVO devices or the desired input video format for GVI devices. * * Note that for GVO, the valid video formats may vary depending on * the NV_CTRL_GVO_SYNC_MODE and the incoming sync video format. See * the definition of NV_CTRL_GVO_SYNC_MODE. * * Note that when querying the ValidValues for this data type, the * values are reported as bits within a bitmask * (ATTRIBUTE_TYPE_INT_BITS); unfortunately, there are more valid * value bits than will fit in a single 32-bit value. To solve this, * query the ValidValues for NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT to * check which of the first 31 VIDEO_FORMATS are valid, query the * ValidValues for NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT2 to check which * of the 32-63 VIDEO_FORMATS are valid, and query the ValidValues of * NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT3 to check which of the 64-95 * VIDEO_FORMATS are valid. * * Note: Setting this attribute on a GVI device may also result in the * following NV-CONTROL attributes being reset on that device (to * ensure the configuration remains valid): * NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT * NV_CTRL_GVI_REQUESTED_STREAM_COMPONENT_SAMPLING */ #define NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT 70 /* RW--I */ #define NV_CTRL_GVIO_VIDEO_FORMAT_NONE 0 #define NV_CTRL_GVIO_VIDEO_FORMAT_487I_59_94_SMPTE259_NTSC 1 #define NV_CTRL_GVIO_VIDEO_FORMAT_576I_50_00_SMPTE259_PAL 2 #define NV_CTRL_GVIO_VIDEO_FORMAT_720P_59_94_SMPTE296 3 #define NV_CTRL_GVIO_VIDEO_FORMAT_720P_60_00_SMPTE296 4 #define NV_CTRL_GVIO_VIDEO_FORMAT_1035I_59_94_SMPTE260 5 #define NV_CTRL_GVIO_VIDEO_FORMAT_1035I_60_00_SMPTE260 6 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080I_50_00_SMPTE295 7 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080I_50_00_SMPTE274 8 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080I_59_94_SMPTE274 9 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080I_60_00_SMPTE274 10 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080P_23_976_SMPTE274 11 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080P_24_00_SMPTE274 12 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080P_25_00_SMPTE274 13 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080P_29_97_SMPTE274 14 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080P_30_00_SMPTE274 15 #define NV_CTRL_GVIO_VIDEO_FORMAT_720P_50_00_SMPTE296 16 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080I_48_00_SMPTE274 17 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080I_47_96_SMPTE274 18 #define NV_CTRL_GVIO_VIDEO_FORMAT_720P_30_00_SMPTE296 19 #define NV_CTRL_GVIO_VIDEO_FORMAT_720P_29_97_SMPTE296 20 #define NV_CTRL_GVIO_VIDEO_FORMAT_720P_25_00_SMPTE296 21 #define NV_CTRL_GVIO_VIDEO_FORMAT_720P_24_00_SMPTE296 22 #define NV_CTRL_GVIO_VIDEO_FORMAT_720P_23_98_SMPTE296 23 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_25_00_SMPTE274 24 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_29_97_SMPTE274 25 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_30_00_SMPTE274 26 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_24_00_SMPTE274 27 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_23_98_SMPTE274 28 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048P_30_00_SMPTE372 29 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048P_29_97_SMPTE372 30 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048I_60_00_SMPTE372 31 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048I_59_94_SMPTE372 32 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048P_25_00_SMPTE372 33 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048I_50_00_SMPTE372 34 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048P_24_00_SMPTE372 35 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048P_23_98_SMPTE372 36 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048I_48_00_SMPTE372 37 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048I_47_96_SMPTE372 38 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080P_50_00_3G_LEVEL_A_SMPTE274 39 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080P_59_94_3G_LEVEL_A_SMPTE274 40 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080P_60_00_3G_LEVEL_A_SMPTE274 41 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080P_60_00_3G_LEVEL_B_SMPTE274 42 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080I_60_00_3G_LEVEL_B_SMPTE274 43 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048I_60_00_3G_LEVEL_B_SMPTE372 44 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080P_50_00_3G_LEVEL_B_SMPTE274 45 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080I_50_00_3G_LEVEL_B_SMPTE274 46 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048I_50_00_3G_LEVEL_B_SMPTE372 47 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080P_30_00_3G_LEVEL_B_SMPTE274 48 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048P_30_00_3G_LEVEL_B_SMPTE372 49 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080P_25_00_3G_LEVEL_B_SMPTE274 50 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048P_25_00_3G_LEVEL_B_SMPTE372 51 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080P_24_00_3G_LEVEL_B_SMPTE274 52 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048P_24_00_3G_LEVEL_B_SMPTE372 53 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080I_48_00_3G_LEVEL_B_SMPTE274 54 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048I_48_00_3G_LEVEL_B_SMPTE372 55 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080P_59_94_3G_LEVEL_B_SMPTE274 56 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080I_59_94_3G_LEVEL_B_SMPTE274 57 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048I_59_94_3G_LEVEL_B_SMPTE372 58 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080P_29_97_3G_LEVEL_B_SMPTE274 59 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048P_29_97_3G_LEVEL_B_SMPTE372 60 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080P_23_98_3G_LEVEL_B_SMPTE274 61 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048P_23_98_3G_LEVEL_B_SMPTE372 62 #define NV_CTRL_GVIO_VIDEO_FORMAT_1080I_47_96_3G_LEVEL_B_SMPTE274 63 #define NV_CTRL_GVIO_VIDEO_FORMAT_2048I_47_96_3G_LEVEL_B_SMPTE372 64 /* * The following are deprecated; NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT and the * corresponding NV_CTRL_GVIO_* formats should be used instead. */ #define NV_CTRL_GVO_OUTPUT_VIDEO_FORMAT 70 /* RW- */ #define NV_CTRL_GVO_VIDEO_FORMAT_NONE 0 #define NV_CTRL_GVO_VIDEO_FORMAT_487I_59_94_SMPTE259_NTSC 1 #define NV_CTRL_GVO_VIDEO_FORMAT_576I_50_00_SMPTE259_PAL 2 #define NV_CTRL_GVO_VIDEO_FORMAT_720P_59_94_SMPTE296 3 #define NV_CTRL_GVO_VIDEO_FORMAT_720P_60_00_SMPTE296 4 #define NV_CTRL_GVO_VIDEO_FORMAT_1035I_59_94_SMPTE260 5 #define NV_CTRL_GVO_VIDEO_FORMAT_1035I_60_00_SMPTE260 6 #define NV_CTRL_GVO_VIDEO_FORMAT_1080I_50_00_SMPTE295 7 #define NV_CTRL_GVO_VIDEO_FORMAT_1080I_50_00_SMPTE274 8 #define NV_CTRL_GVO_VIDEO_FORMAT_1080I_59_94_SMPTE274 9 #define NV_CTRL_GVO_VIDEO_FORMAT_1080I_60_00_SMPTE274 10 #define NV_CTRL_GVO_VIDEO_FORMAT_1080P_23_976_SMPTE274 11 #define NV_CTRL_GVO_VIDEO_FORMAT_1080P_24_00_SMPTE274 12 #define NV_CTRL_GVO_VIDEO_FORMAT_1080P_25_00_SMPTE274 13 #define NV_CTRL_GVO_VIDEO_FORMAT_1080P_29_97_SMPTE274 14 #define NV_CTRL_GVO_VIDEO_FORMAT_1080P_30_00_SMPTE274 15 #define NV_CTRL_GVO_VIDEO_FORMAT_720P_50_00_SMPTE296 16 #define NV_CTRL_GVO_VIDEO_FORMAT_1080I_48_00_SMPTE274 17 #define NV_CTRL_GVO_VIDEO_FORMAT_1080I_47_96_SMPTE274 18 #define NV_CTRL_GVO_VIDEO_FORMAT_720P_30_00_SMPTE296 19 #define NV_CTRL_GVO_VIDEO_FORMAT_720P_29_97_SMPTE296 20 #define NV_CTRL_GVO_VIDEO_FORMAT_720P_25_00_SMPTE296 21 #define NV_CTRL_GVO_VIDEO_FORMAT_720P_24_00_SMPTE296 22 #define NV_CTRL_GVO_VIDEO_FORMAT_720P_23_98_SMPTE296 23 #define NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_25_00_SMPTE274 24 #define NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_29_97_SMPTE274 25 #define NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_30_00_SMPTE274 26 #define NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_24_00_SMPTE274 27 #define NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_23_98_SMPTE274 28 #define NV_CTRL_GVO_VIDEO_FORMAT_2048P_30_00_SMPTE372 29 #define NV_CTRL_GVO_VIDEO_FORMAT_2048P_29_97_SMPTE372 30 #define NV_CTRL_GVO_VIDEO_FORMAT_2048I_60_00_SMPTE372 31 #define NV_CTRL_GVO_VIDEO_FORMAT_2048I_59_94_SMPTE372 32 #define NV_CTRL_GVO_VIDEO_FORMAT_2048P_25_00_SMPTE372 33 #define NV_CTRL_GVO_VIDEO_FORMAT_2048I_50_00_SMPTE372 34 #define NV_CTRL_GVO_VIDEO_FORMAT_2048P_24_00_SMPTE372 35 #define NV_CTRL_GVO_VIDEO_FORMAT_2048P_23_98_SMPTE372 36 #define NV_CTRL_GVO_VIDEO_FORMAT_2048I_48_00_SMPTE372 37 #define NV_CTRL_GVO_VIDEO_FORMAT_2048I_47_96_SMPTE372 38 /* * NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT - indicates the input video format * detected for GVO or GVI devices; the possible values are the * NV_CTRL_GVIO_VIDEO_FORMAT constants. * * For GVI devices, the jack number should be specified in the lower * 16 bits of the "display_mask" parameter, while the channel number should be * specified in the upper 16 bits. */ #define NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT 71 /* R--I */ /* * The following is deprecated. Use NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT, * instead. */ #define NV_CTRL_GVO_INPUT_VIDEO_FORMAT 71 /* R-- */ /* * NV_CTRL_GVO_DATA_FORMAT - This controls how the data in the source * (either the X screen or the GLX pbuffer) is interpretted and * displayed. * * Note: some of the below DATA_FORMATS have been renamed. For * example, R8G8B8_TO_RGB444 has been renamed to X8X8X8_444_PASSTHRU. * This is to more accurately reflect DATA_FORMATS where the * per-channel data could be either RGB or YCrCb -- the point is that * the driver and GVO hardware do not perform any implicit color space * conversion on the data; it is passed through to the SDI out. */ #define NV_CTRL_GVO_DATA_FORMAT 72 /* RW- */ #define NV_CTRL_GVO_DATA_FORMAT_R8G8B8_TO_YCRCB444 0 #define NV_CTRL_GVO_DATA_FORMAT_R8G8B8A8_TO_YCRCBA4444 1 #define NV_CTRL_GVO_DATA_FORMAT_R8G8B8Z10_TO_YCRCBZ4444 2 #define NV_CTRL_GVO_DATA_FORMAT_R8G8B8_TO_YCRCB422 3 #define NV_CTRL_GVO_DATA_FORMAT_R8G8B8A8_TO_YCRCBA4224 4 #define NV_CTRL_GVO_DATA_FORMAT_R8G8B8Z10_TO_YCRCBZ4224 5 #define NV_CTRL_GVO_DATA_FORMAT_R8G8B8_TO_RGB444 6 // renamed #define NV_CTRL_GVO_DATA_FORMAT_X8X8X8_444_PASSTHRU 6 #define NV_CTRL_GVO_DATA_FORMAT_R8G8B8A8_TO_RGBA4444 7 // renamed #define NV_CTRL_GVO_DATA_FORMAT_X8X8X8A8_4444_PASSTHRU 7 #define NV_CTRL_GVO_DATA_FORMAT_R8G8B8Z10_TO_RGBZ4444 8 // renamed #define NV_CTRL_GVO_DATA_FORMAT_X8X8X8Z8_4444_PASSTHRU 8 #define NV_CTRL_GVO_DATA_FORMAT_Y10CR10CB10_TO_YCRCB444 9 // renamed #define NV_CTRL_GVO_DATA_FORMAT_X10X10X10_444_PASSTHRU 9 #define NV_CTRL_GVO_DATA_FORMAT_Y10CR8CB8_TO_YCRCB444 10 // renamed #define NV_CTRL_GVO_DATA_FORMAT_X10X8X8_444_PASSTHRU 10 #define NV_CTRL_GVO_DATA_FORMAT_Y10CR8CB8A10_TO_YCRCBA4444 11 // renamed #define NV_CTRL_GVO_DATA_FORMAT_X10X8X8A10_4444_PASSTHRU 11 #define NV_CTRL_GVO_DATA_FORMAT_Y10CR8CB8Z10_TO_YCRCBZ4444 12 // renamed #define NV_CTRL_GVO_DATA_FORMAT_X10X8X8Z10_4444_PASSTHRU 12 #define NV_CTRL_GVO_DATA_FORMAT_DUAL_R8G8B8_TO_DUAL_YCRCB422 13 #define NV_CTRL_GVO_DATA_FORMAT_DUAL_Y8CR8CB8_TO_DUAL_YCRCB422 14 // renamed #define NV_CTRL_GVO_DATA_FORMAT_DUAL_X8X8X8_TO_DUAL_422_PASSTHRU 14 #define NV_CTRL_GVO_DATA_FORMAT_R10G10B10_TO_YCRCB422 15 #define NV_CTRL_GVO_DATA_FORMAT_R10G10B10_TO_YCRCB444 16 #define NV_CTRL_GVO_DATA_FORMAT_Y12CR12CB12_TO_YCRCB444 17 // renamed #define NV_CTRL_GVO_DATA_FORMAT_X12X12X12_444_PASSTHRU 17 #define NV_CTRL_GVO_DATA_FORMAT_R12G12B12_TO_YCRCB444 18 #define NV_CTRL_GVO_DATA_FORMAT_X8X8X8_422_PASSTHRU 19 #define NV_CTRL_GVO_DATA_FORMAT_X8X8X8A8_4224_PASSTHRU 20 #define NV_CTRL_GVO_DATA_FORMAT_X8X8X8Z8_4224_PASSTHRU 21 #define NV_CTRL_GVO_DATA_FORMAT_X10X10X10_422_PASSTHRU 22 #define NV_CTRL_GVO_DATA_FORMAT_X10X8X8_422_PASSTHRU 23 #define NV_CTRL_GVO_DATA_FORMAT_X10X8X8A10_4224_PASSTHRU 24 #define NV_CTRL_GVO_DATA_FORMAT_X10X8X8Z10_4224_PASSTHRU 25 #define NV_CTRL_GVO_DATA_FORMAT_X12X12X12_422_PASSTHRU 26 #define NV_CTRL_GVO_DATA_FORMAT_R12G12B12_TO_YCRCB422 27 /* * NV_CTRL_GVO_DISPLAY_X_SCREEN - no longer supported */ #define NV_CTRL_GVO_DISPLAY_X_SCREEN 73 /* RW- */ #define NV_CTRL_GVO_DISPLAY_X_SCREEN_ENABLE 1 #define NV_CTRL_GVO_DISPLAY_X_SCREEN_DISABLE 0 /* * NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED - indicates whether * Composite Sync input is detected. */ #define NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED 74 /* R-- */ #define NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED_FALSE 0 #define NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED_TRUE 1 /* * NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE - get/set the * Composite Sync input detect mode. */ #define NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE 75 /* RW- */ #define NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE_AUTO 0 #define NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE_BI_LEVEL 1 #define NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE_TRI_LEVEL 2 /* * NV_CTRL_GVO_SYNC_INPUT_DETECTED - indicates whether SDI Sync input * is detected, and what type. */ #define NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED 76 /* R-- */ #define NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED_NONE 0 #define NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED_HD 1 #define NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED_SD 2 /* * NV_CTRL_GVO_VIDEO_OUTPUTS - indicates which GVO video output * connectors are currently outputing data. */ #define NV_CTRL_GVO_VIDEO_OUTPUTS 77 /* R-- */ #define NV_CTRL_GVO_VIDEO_OUTPUTS_NONE 0 #define NV_CTRL_GVO_VIDEO_OUTPUTS_VIDEO1 1 #define NV_CTRL_GVO_VIDEO_OUTPUTS_VIDEO2 2 #define NV_CTRL_GVO_VIDEO_OUTPUTS_VIDEO_BOTH 3 /* * NV_CTRL_GVO_FPGA_VERSION - indicates the version of the Firmware on * the GVO device. Deprecated; use * NV_CTRL_STRING_GVIO_FIRMWARE_VERSION instead. */ #define NV_CTRL_GVO_FIRMWARE_VERSION 78 /* R-- */ /* * NV_CTRL_GVO_SYNC_DELAY_PIXELS - controls the delay between the * input sync and the output sync in numbers of pixels from hsync; * this is a 12 bit value. * * If the NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW bit is set, * then setting this value will set an advance instead of a delay. */ #define NV_CTRL_GVO_SYNC_DELAY_PIXELS 79 /* RW- */ /* * NV_CTRL_GVO_SYNC_DELAY_LINES - controls the delay between the input * sync and the output sync in numbers of lines from vsync; this is a * 12 bit value. * * If the NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW bit is set, * then setting this value will set an advance instead of a delay. */ #define NV_CTRL_GVO_SYNC_DELAY_LINES 80 /* RW- */ /* * NV_CTRL_GVO_INPUT_VIDEO_FORMAT_REACQUIRE - must be set for a period * of about 2 seconds for the new InputVideoFormat to be properly * locked to. In nvidia-settings, we do a reacquire whenever genlock * or frame lock mode is entered into, when the user clicks the * "detect" button. This value can be written, but always reads back * _FALSE. */ #define NV_CTRL_GVO_INPUT_VIDEO_FORMAT_REACQUIRE 81 /* -W- */ #define NV_CTRL_GVO_INPUT_VIDEO_FORMAT_REACQUIRE_FALSE 0 #define NV_CTRL_GVO_INPUT_VIDEO_FORMAT_REACQUIRE_TRUE 1 /* * NV_CTRL_GVO_GLX_LOCKED - indicates that GVO configurability is * locked by GLX; this occurs when either glXGetVideoDeviceNV (part of * GLX_NV_video_out) or glXBindVideoDeviceNV (part of * GLX_NV_present_video) is called. All GVO output resources are * locked until released by the GLX_NV_video_out/GLX_NV_present_video * client. * * When GVO is locked, setting of the following GVO NV-CONTROL attributes will * not happen immediately and will instead be cached. The GVO resource will * need to be disabled/released and re-enabled/claimed for the values to be * flushed. These attributes are: * NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT * NV_CTRL_GVO_DATA_FORMAT * NV_CTRL_GVO_FLIP_QUEUE_SIZE * * This attribute is deprecated and may be removed in a future release. Its * functionality has been replaced by NV_CTRL_GVO_LOCK_OWNER. */ #define NV_CTRL_GVO_GLX_LOCKED 82 /* R-- */ #define NV_CTRL_GVO_GLX_LOCKED_FALSE 0 #define NV_CTRL_GVO_GLX_LOCKED_TRUE 1 /* * NV_CTRL_GVIO_VIDEO_FORMAT_{WIDTH,HEIGHT,REFRESH_RATE} - query the * width, height, and refresh rate for the specified * NV_CTRL_GVIO_VIDEO_FORMAT_*. So that this can be queried with * existing interfaces, XNVCTRLQueryAttribute() should be used, and * the video format specified in the display_mask field; eg: * * XNVCTRLQueryAttribute (dpy, * screen, * NV_CTRL_GVIO_VIDEO_FORMAT_487I_59_94_SMPTE259_NTSC, * NV_CTRL_GVIO_VIDEO_FORMAT_WIDTH, * &value); * * Note that Refresh Rate is in milliHertz values */ #define NV_CTRL_GVIO_VIDEO_FORMAT_WIDTH 83 /* R--I */ #define NV_CTRL_GVIO_VIDEO_FORMAT_HEIGHT 84 /* R--I */ #define NV_CTRL_GVIO_VIDEO_FORMAT_REFRESH_RATE 85 /* R--I */ /* The following are deprecated; use the NV_CTRL_GVIO_* versions, instead */ #define NV_CTRL_GVO_VIDEO_FORMAT_WIDTH 83 /* R-- */ #define NV_CTRL_GVO_VIDEO_FORMAT_HEIGHT 84 /* R-- */ #define NV_CTRL_GVO_VIDEO_FORMAT_REFRESH_RATE 85 /* R-- */ /* * NV_CTRL_GVO_X_SCREEN_PAN_[XY] - no longer supported */ #define NV_CTRL_GVO_X_SCREEN_PAN_X 86 /* RW- */ #define NV_CTRL_GVO_X_SCREEN_PAN_Y 87 /* RW- */ /* * NV_CTRL_GPU_OVERCLOCKING_STATE - query the current or set a new * overclocking state; the value of this attribute controls the * availability of additional overclocking attributes (see below). * * Note: this attribute is unavailable unless overclocking support * has been enabled in the X server (by the user). */ #define NV_CTRL_GPU_OVERCLOCKING_STATE 88 /* RW-G */ #define NV_CTRL_GPU_OVERCLOCKING_STATE_NONE 0 #define NV_CTRL_GPU_OVERCLOCKING_STATE_MANUAL 1 /* * NV_CTRL_GPU_{2,3}D_CLOCK_FREQS - query or set the GPU and memory * clocks of the device driving the X screen. New clock frequencies * are tested before being applied, and may be rejected. * * Note: if the target clocks are too aggressive, their testing may * render the system unresponsive. * * Note: while this attribute can always be queried, it can't be set * unless NV_CTRL_GPU_OVERCLOCKING_STATE is set to _MANUAL. Since * the target clocks may be rejected, the requester should read this * attribute after the set to determine success or failure. * * NV_CTRL_GPU_{2,3}D_CLOCK_FREQS are "packed" integer attributes; the * GPU clock is stored in the upper 16 bits of the integer, and the * memory clock is stored in the lower 16 bits of the integer. All * clock values are in MHz. */ #define NV_CTRL_GPU_2D_CLOCK_FREQS 89 /* RW-G */ #define NV_CTRL_GPU_3D_CLOCK_FREQS 90 /* RW-G */ /* * NV_CTRL_GPU_DEFAULT_{2,3}D_CLOCK_FREQS - query the default memory * and GPU core clocks of the device driving the X screen. * * NV_CTRL_GPU_DEFAULT_{2,3}D_CLOCK_FREQS are "packed" integer * attributes; the GPU clock is stored in the upper 16 bits of the * integer, and the memory clock is stored in the lower 16 bits of the * integer. All clock values are in MHz. */ #define NV_CTRL_GPU_DEFAULT_2D_CLOCK_FREQS 91 /* R--G */ #define NV_CTRL_GPU_DEFAULT_3D_CLOCK_FREQS 92 /* R--G */ /* * NV_CTRL_GPU_CURRENT_CLOCK_FREQS - query the current GPU and memory * clocks of the graphics device driving the X screen. * * NV_CTRL_GPU_CURRENT_CLOCK_FREQS is a "packed" integer attribute; * the GPU clock is stored in the upper 16 bits of the integer, and * the memory clock is stored in the lower 16 bits of the integer. * All clock values are in MHz. All clock values are in MHz. */ #define NV_CTRL_GPU_CURRENT_CLOCK_FREQS 93 /* R--G */ /* * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS - Holds the last calculated * optimal 3D clock frequencies found by the * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION process. Querying this * attribute before having probed for the optimal clocks will return * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_INVALID * * Note: unless NV_CTRL_GPU_OVERCLOCKING_STATE is set to _MANUAL, the * optimal clock detection process is unavailable. */ #define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS 94 /* R--G */ #define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_INVALID 0 /* * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION - set to _START to * initiate testing for the optimal 3D clock frequencies. Once * found, the optimal clock frequencies will be returned by the * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS attribute asynchronously * (using an X event, see XNVCtrlSelectNotify). * * To cancel an ongoing test for the optimal clocks, set the * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION attribute to _CANCEL * * Note: unless NV_CTRL_GPU_OVERCLOCKING_STATE is set to _MANUAL, the * optimal clock detection process is unavailable. */ #define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION 95 /* -W-G */ #define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_START 0 #define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_CANCEL 1 /* * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE - query this * variable to know if a test is currently being run to * determine the optimal 3D clock frequencies. _BUSY means a * test is currently running, _IDLE means the test is not running. * * Note: unless NV_CTRL_GPU_OVERCLOCKING_STATE is set to _MANUAL, the * optimal clock detection process is unavailable. */ #define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE 96 /* R--G */ #define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_IDLE 0 #define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_BUSY 1 /* * NV_CTRL_FLATPANEL_CHIP_LOCATION - for the specified display device, * report whether the flat panel is driven by the on-chip controller, * or a separate controller chip elsewhere on the graphics board. * This attribute is only available for flat panels. */ #define NV_CTRL_FLATPANEL_CHIP_LOCATION 215/* R-DG */ #define NV_CTRL_FLATPANEL_CHIP_LOCATION_INTERNAL 0 #define NV_CTRL_FLATPANEL_CHIP_LOCATION_EXTERNAL 1 /* * NV_CTRL_FLATPANEL_LINK - report the number of links for a DVI connection, or * the main link's active lane count for DisplayPort. * This attribute is only available for flat panels. */ #define NV_CTRL_FLATPANEL_LINK 216/* R-DG */ #define NV_CTRL_FLATPANEL_LINK_SINGLE 0 #define NV_CTRL_FLATPANEL_LINK_DUAL 1 #define NV_CTRL_FLATPANEL_LINK_QUAD 3 /* * NV_CTRL_FLATPANEL_SIGNAL - for the specified display device, report * whether the flat panel is driven by an LVDS, TMDS, or DisplayPort signal. * This attribute is only available for flat panels. */ #define NV_CTRL_FLATPANEL_SIGNAL 217/* R-DG */ #define NV_CTRL_FLATPANEL_SIGNAL_LVDS 0 #define NV_CTRL_FLATPANEL_SIGNAL_TMDS 1 #define NV_CTRL_FLATPANEL_SIGNAL_DISPLAYPORT 2 /* * NV_CTRL_USE_HOUSE_SYNC - when TRUE, the server (master) frame lock * device will propagate the incoming house sync signal as the outgoing * frame lock sync signal. If the frame lock device cannot detect a * frame lock sync signal, it will default to using the internal timings * from the GPU connected to the primary connector. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN * target. */ #define NV_CTRL_USE_HOUSE_SYNC 218/* RW-F */ #define NV_CTRL_USE_HOUSE_SYNC_FALSE 0 #define NV_CTRL_USE_HOUSE_SYNC_TRUE 1 /* * NV_CTRL_EDID_AVAILABLE - report if an EDID is available for the * specified display device. * * This attribute may also be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN * target. */ #define NV_CTRL_EDID_AVAILABLE 219 /* R-DG */ #define NV_CTRL_EDID_AVAILABLE_FALSE 0 #define NV_CTRL_EDID_AVAILABLE_TRUE 1 /* * NV_CTRL_FORCE_STEREO - when TRUE, OpenGL will force stereo flipping * even when no stereo drawables are visible (if the device is configured * to support it, see the "Stereo" X config option). * When false, fall back to the default behavior of only flipping when a * stereo drawable is visible. */ #define NV_CTRL_FORCE_STEREO 220 /* RW- */ #define NV_CTRL_FORCE_STEREO_FALSE 0 #define NV_CTRL_FORCE_STEREO_TRUE 1 /* * NV_CTRL_IMAGE_SETTINGS - the image quality setting for OpenGL clients. * * This setting is only applied to OpenGL clients that are started * after this setting is applied. */ #define NV_CTRL_IMAGE_SETTINGS 221 /* RW-X */ #define NV_CTRL_IMAGE_SETTINGS_HIGH_QUALITY 0 #define NV_CTRL_IMAGE_SETTINGS_QUALITY 1 #define NV_CTRL_IMAGE_SETTINGS_PERFORMANCE 2 #define NV_CTRL_IMAGE_SETTINGS_HIGH_PERFORMANCE 3 /* * NV_CTRL_XINERAMA - return whether xinerama is enabled */ #define NV_CTRL_XINERAMA 222 /* R--G */ #define NV_CTRL_XINERAMA_OFF 0 #define NV_CTRL_XINERAMA_ON 1 /* * NV_CTRL_XINERAMA_STEREO - when TRUE, OpenGL will allow stereo flipping * on multiple X screens configured with Xinerama. * When FALSE, flipping is allowed only on one X screen at a time. */ #define NV_CTRL_XINERAMA_STEREO 223 /* RW- */ #define NV_CTRL_XINERAMA_STEREO_FALSE 0 #define NV_CTRL_XINERAMA_STEREO_TRUE 1 /* * NV_CTRL_BUS_RATE - if the bus type of the specified device is AGP, then * NV_CTRL_BUS_RATE returns the configured AGP transfer rate. If the bus type * is PCI Express, then this attribute returns the maximum link width. * When this attribute is queried on an X screen target, the bus rate of the * GPU driving the X screen is returned. */ #define NV_CTRL_BUS_RATE 224 /* R--GI */ /* * NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH - returns the maximum * PCIe link width, in number of lanes. */ #define NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH NV_CTRL_BUS_RATE /* * NV_CTRL_SHOW_SLI_HUD - when TRUE, OpenGL will draw information about the * current SLI mode. * Renamed this attribute to NV_CTRL_SHOW_SLI_VISUAL_INDICATOR */ #define NV_CTRL_SHOW_SLI_HUD NV_CTRL_SHOW_SLI_VISUAL_INDICATOR #define NV_CTRL_SHOW_SLI_HUD_FALSE NV_CTRL_SHOW_SLI_VISUAL_INDICATOR_FALSE #define NV_CTRL_SHOW_SLI_HUD_TRUE NV_CTRL_SHOW_SLI_VISUAL_INDICATOR_TRUE /* * NV_CTRL_SHOW_SLI_VISUAL_INDICATOR - when TRUE, OpenGL will draw information * about the current SLI mode. */ #define NV_CTRL_SHOW_SLI_VISUAL_INDICATOR 225 /* RW-X */ #define NV_CTRL_SHOW_SLI_VISUAL_INDICATOR_FALSE 0 #define NV_CTRL_SHOW_SLI_VISUAL_INDICATOR_TRUE 1 /* * NV_CTRL_XV_SYNC_TO_DISPLAY - this control is valid when TwinView and * XVideo Sync To VBlank are enabled. * It controls which display device will be synched to. */ #define NV_CTRL_XV_SYNC_TO_DISPLAY 226 /* RW- */ /* * NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT2 - this attribute is only * intended to be used to query the ValidValues for * NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT for VIDEO_FORMAT values between * 31 and 63. See NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT for details. */ #define NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT2 227 /* ---GI */ /* * The following is deprecated; use NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT2, * instead */ #define NV_CTRL_GVO_OUTPUT_VIDEO_FORMAT2 227 /* --- */ /* * NV_CTRL_GVO_OVERRIDE_HW_CSC - Override the SDI hardware's Color Space * Conversion with the values controlled through * XNVCTRLSetGvoColorConversion() and XNVCTRLGetGvoColorConversion(). If * this attribute is FALSE, then the values specified through * XNVCTRLSetGvoColorConversion() are ignored. */ #define NV_CTRL_GVO_OVERRIDE_HW_CSC 228 /* RW- */ #define NV_CTRL_GVO_OVERRIDE_HW_CSC_FALSE 0 #define NV_CTRL_GVO_OVERRIDE_HW_CSC_TRUE 1 /* * NV_CTRL_GVO_CAPABILITIES - this read-only attribute describes GVO * capabilities that differ between NVIDIA SDI products. This value * is a bitmask where each bit indicates whether that capability is * available. * * APPLY_CSC_IMMEDIATELY - whether the CSC matrix, offset, and scale * specified through XNVCTRLSetGvoColorConversion() will take affect * immediately, or only after SDI output is disabled and enabled * again. * * APPLY_CSC_TO_X_SCREEN - whether the CSC matrix, offset, and scale * specified through XNVCTRLSetGvoColorConversion() will also apply * to GVO output of an X screen, or only to OpenGL GVO output, as * enabled through the GLX_NV_video_out extension. * * COMPOSITE_TERMINATION - whether the 75 ohm termination of the * SDI composite input signal can be programmed through the * NV_CTRL_GVO_COMPOSITE_TERMINATION attribute. * * SHARED_SYNC_BNC - whether the SDI device has a single BNC * connector used for both (SDI & Composite) incoming signals. * * MULTIRATE_SYNC - whether the SDI device supports synchronization * of input and output video modes that match in being odd or even * modes (ie, AA.00 Hz modes can be synched to other BB.00 Hz modes and * AA.XX Hz can match to BB.YY Hz where .XX and .YY are not .00) */ #define NV_CTRL_GVO_CAPABILITIES 229 /* R-- */ #define NV_CTRL_GVO_CAPABILITIES_APPLY_CSC_IMMEDIATELY 0x00000001 #define NV_CTRL_GVO_CAPABILITIES_APPLY_CSC_TO_X_SCREEN 0x00000002 #define NV_CTRL_GVO_CAPABILITIES_COMPOSITE_TERMINATION 0x00000004 #define NV_CTRL_GVO_CAPABILITIES_SHARED_SYNC_BNC 0x00000008 #define NV_CTRL_GVO_CAPABILITIES_MULTIRATE_SYNC 0x00000010 #define NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW 0x00000020 /* * NV_CTRL_GVO_COMPOSITE_TERMINATION - enable or disable 75 ohm * termination of the SDI composite input signal. */ #define NV_CTRL_GVO_COMPOSITE_TERMINATION 230 /* RW- */ #define NV_CTRL_GVO_COMPOSITE_TERMINATION_ENABLE 1 #define NV_CTRL_GVO_COMPOSITE_TERMINATION_DISABLE 0 /* * NV_CTRL_ASSOCIATED_DISPLAY_DEVICES - display device mask indicating * which display devices are "associated" with the specified X screen * (ie: are available to the X screen for displaying the X screen). */ #define NV_CTRL_ASSOCIATED_DISPLAY_DEVICES 231 /* RW- */ /* * NV_CTRL_FRAMELOCK_SLAVES is deprecated; NV_CTRL_FRAMELOCK_DISPLAY_CONFIG * should be used instead. */ #define NV_CTRL_FRAMELOCK_SLAVES 232 /* RW-G */ /* * NV_CTRL_FRAMELOCK_MASTERABLE is deprecated; NV_CTRL_FRAMELOCK_DISPLAY_CONFIG * should be used instead. */ #define NV_CTRL_FRAMELOCK_MASTERABLE 233 /* R-DG */ /* * NV_CTRL_PROBE_DISPLAYS - re-probes the hardware to detect what * display devices are connected to the GPU or GPU driving the * specified X screen. Returns a display mask. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. */ #define NV_CTRL_PROBE_DISPLAYS 234 /* R--G */ /* * NV_CTRL_REFRESH_RATE - Returns the refresh rate of the specified * display device in 100 * Hz (ie. to get the refresh rate in Hz, divide * the returned value by 100.) * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. */ #define NV_CTRL_REFRESH_RATE 235 /* R-DG */ /* * NV_CTRL_GVO_FLIP_QUEUE_SIZE - The Graphics to Video Out interface * exposed through NV-CONTROL and the GLX_NV_video_out extension uses * an internal flip queue when pbuffers are sent to the video device * (via glXSendPbufferToVideoNV()). The NV_CTRL_GVO_FLIP_QUEUE_SIZE * can be used to query and assign the flip queue size. This * attribute is applied to GLX when glXGetVideoDeviceNV() is called by * the application. */ #define NV_CTRL_GVO_FLIP_QUEUE_SIZE 236 /* RW- */ /* * NV_CTRL_CURRENT_SCANLINE - query the current scanline for the * specified display device. */ #define NV_CTRL_CURRENT_SCANLINE 237 /* R-DG */ /* * NV_CTRL_INITIAL_PIXMAP_PLACEMENT - Controls where X pixmaps are initially * created. * * NV_CTRL_INITIAL_PIXMAP_PLACEMENT_FORCE_SYSMEM causes pixmaps to stay in * system memory. These pixmaps can't be accelerated by the NVIDIA driver; this * will cause blank windows if used with an OpenGL compositing manager. * NV_CTRL_INITIAL_PIXMAP_PLACEMENT_SYSMEM creates pixmaps in system memory * initially, but allows them to migrate to video memory. * NV_CTRL_INITIAL_PIXMAP_PLACEMENT_VIDMEM creates pixmaps in video memory * when enough resources are available. * NV_CTRL_INITIAL_PIXMAP_PLACEMENT_RESERVED is currently reserved for future * use. Behavior is undefined. * NV_CTRL_INITIAL_PIXMAP_PLACEMENT_GPU_SYSMEM creates pixmaps in GPU accessible * system memory when enough resources are available. */ #define NV_CTRL_INITIAL_PIXMAP_PLACEMENT 238 /* RW- */ #define NV_CTRL_INITIAL_PIXMAP_PLACEMENT_FORCE_SYSMEM 0 #define NV_CTRL_INITIAL_PIXMAP_PLACEMENT_SYSMEM 1 #define NV_CTRL_INITIAL_PIXMAP_PLACEMENT_VIDMEM 2 #define NV_CTRL_INITIAL_PIXMAP_PLACEMENT_RESERVED 3 #define NV_CTRL_INITIAL_PIXMAP_PLACEMENT_GPU_SYSMEM 4 /* * NV_CTRL_PCI_BUS - Returns the PCI bus number the specified device is using. */ #define NV_CTRL_PCI_BUS 239 /* R--GI */ /* * NV_CTRL_PCI_DEVICE - Returns the PCI device number the specified device is * using. */ #define NV_CTRL_PCI_DEVICE 240 /* R--GI */ /* * NV_CTRL_PCI_FUNCTION - Returns the PCI function number the specified device * is using. */ #define NV_CTRL_PCI_FUNCTION 241 /* R--GI */ /* * NV_CTRL_FRAMELOCK_FPGA_REVISION - Querys the FPGA revision of the * Frame Lock device. * * This attribute must be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_FRAMELOCK target. */ #define NV_CTRL_FRAMELOCK_FPGA_REVISION 242 /* R--F */ /* * NV_CTRL_MAX_SCREEN_{WIDTH,HEIGHT} - the maximum allowable size, in * pixels, of either the specified X screen (if the target_type of the * query is an X screen), or any X screen on the specified GPU (if the * target_type of the query is a GPU). */ #define NV_CTRL_MAX_SCREEN_WIDTH 243 /* R--G */ #define NV_CTRL_MAX_SCREEN_HEIGHT 244 /* R--G */ /* * NV_CTRL_MAX_DISPLAYS - the maximum number of display devices that * can be driven simultaneously on a GPU (e.g., that can be used in a * MetaMode at once). Note that this does not indicate the maximum * number of bits that can be set in NV_CTRL_CONNECTED_DISPLAYS, * because more display devices can be connected than are actively in * use. */ #define NV_CTRL_MAX_DISPLAYS 245 /* R--G */ /* * NV_CTRL_DYNAMIC_TWINVIEW - Returns whether or not the screen * supports dynamic twinview. */ #define NV_CTRL_DYNAMIC_TWINVIEW 246 /* R-- */ /* * NV_CTRL_MULTIGPU_DISPLAY_OWNER - Returns the (NV-CONTROL) GPU ID of * the GPU that has the display device(s) used for showing the X Screen. */ #define NV_CTRL_MULTIGPU_DISPLAY_OWNER 247 /* R-- */ /* * NV_CTRL_GPU_SCALING - not supported */ #define NV_CTRL_GPU_SCALING 248 /* RWDG */ #define NV_CTRL_GPU_SCALING_TARGET_INVALID 0 #define NV_CTRL_GPU_SCALING_TARGET_FLATPANEL_BEST_FIT 1 #define NV_CTRL_GPU_SCALING_TARGET_FLATPANEL_NATIVE 2 #define NV_CTRL_GPU_SCALING_METHOD_INVALID 0 #define NV_CTRL_GPU_SCALING_METHOD_STRETCHED 1 #define NV_CTRL_GPU_SCALING_METHOD_CENTERED 2 #define NV_CTRL_GPU_SCALING_METHOD_ASPECT_SCALED 3 /* * NV_CTRL_FRONTEND_RESOLUTION - not supported */ #define NV_CTRL_FRONTEND_RESOLUTION 249 /* R-DG */ /* * NV_CTRL_BACKEND_RESOLUTION - not supported */ #define NV_CTRL_BACKEND_RESOLUTION 250 /* R-DG */ /* * NV_CTRL_FLATPANEL_NATIVE_RESOLUTION - not supported */ #define NV_CTRL_FLATPANEL_NATIVE_RESOLUTION 251 /* R-DG */ /* * NV_CTRL_FLATPANEL_BEST_FIT_RESOLUTION - not supported */ #define NV_CTRL_FLATPANEL_BEST_FIT_RESOLUTION 252 /* R-DG */ /* * NV_CTRL_GPU_SCALING_ACTIVE - not supported */ #define NV_CTRL_GPU_SCALING_ACTIVE 253 /* R-DG */ /* * NV_CTRL_DFP_SCALING_ACTIVE - not supported */ #define NV_CTRL_DFP_SCALING_ACTIVE 254 /* R-DG */ /* * NV_CTRL_FSAA_APPLICATION_ENHANCED - Controls how the NV_CTRL_FSAA_MODE * is applied when NV_CTRL_FSAA_APPLICATION_CONTROLLED is set to * NV_CTRL_APPLICATION_CONTROLLED_DISABLED. When * NV_CTRL_FSAA_APPLICATION_ENHANCED is _DISABLED, OpenGL applications will * be forced to use the FSAA mode specified by NV_CTRL_FSAA_MODE. when set * to _ENABLED, only those applications that have selected a multisample * FBConfig will be made to use the NV_CTRL_FSAA_MODE specified. * * This attribute is ignored when NV_CTRL_FSAA_APPLICATION_CONTROLLED is * set to NV_CTRL_FSAA_APPLICATION_CONTROLLED_ENABLED. */ #define NV_CTRL_FSAA_APPLICATION_ENHANCED 255 /* RW-X */ #define NV_CTRL_FSAA_APPLICATION_ENHANCED_ENABLED 1 #define NV_CTRL_FSAA_APPLICATION_ENHANCED_DISABLED 0 /* * NV_CTRL_FRAMELOCK_SYNC_RATE_4 - This is the refresh rate that the * frame lock board is sending to the GPU with 4 digits of precision. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_FRAMELOCK. */ #define NV_CTRL_FRAMELOCK_SYNC_RATE_4 256 /* R--F */ /* * NV_CTRL_GVO_LOCK_OWNER - indicates that the GVO device is available * or in use (by GLX or an X screen). * * The GVO device is locked by GLX when either glXGetVideoDeviceNV * (part of GLX_NV_video_out) or glXBindVideoDeviceNV (part of * GLX_NV_present_video) is called. All GVO output resources are * locked until released by the GLX_NV_video_out/GLX_NV_present_video * client. * * The GVO device is locked/unlocked by an X screen, when the GVO device is * used in a MetaMode on an X screen. * * When the GVO device is locked, setting of the following GVO NV-CONTROL * attributes will not happen immediately and will instead be cached. The * GVO resource will need to be disabled/released and re-enabled/claimed for * the values to be flushed. These attributes are: * * NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT * NV_CTRL_GVO_DATA_FORMAT * NV_CTRL_GVO_FLIP_QUEUE_SIZE */ #define NV_CTRL_GVO_LOCK_OWNER 257 /* R-- */ #define NV_CTRL_GVO_LOCK_OWNER_NONE 0 #define NV_CTRL_GVO_LOCK_OWNER_GLX 1 #define NV_CTRL_GVO_LOCK_OWNER_CLONE /* no longer supported */ 2 #define NV_CTRL_GVO_LOCK_OWNER_X_SCREEN 3 /* * NV_CTRL_HWOVERLAY - when a workstation overlay is in use, reports * whether the hardware overlay is used, or if the overlay is emulated. */ #define NV_CTRL_HWOVERLAY 258 /* R-- */ #define NV_CTRL_HWOVERLAY_FALSE 0 #define NV_CTRL_HWOVERLAY_TRUE 1 /* * NV_CTRL_NUM_GPU_ERRORS_RECOVERED - Returns the number of GPU errors * occured. This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_X_SCREEN target. */ #define NV_CTRL_NUM_GPU_ERRORS_RECOVERED 259 /* R--- */ /* * NV_CTRL_REFRESH_RATE_3 - Returns the refresh rate of the specified * display device in 1000 * Hz (ie. to get the refresh rate in Hz, divide * the returned value by 1000.) * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. */ #define NV_CTRL_REFRESH_RATE_3 260 /* R-DG */ /* * NV_CTRL_ONDEMAND_VBLANK_INTERRUPTS - if the OnDemandVBlankInterrupts * X driver option is set to true, this attribute can be used to * determine if on-demand VBlank interrupt control is enabled on the * specified GPU, as well as to enable or disable this feature. */ #define NV_CTRL_ONDEMAND_VBLANK_INTERRUPTS 261 /* RW-G */ #define NV_CTRL_ONDEMAND_VBLANK_INTERRUPTS_OFF 0 #define NV_CTRL_ONDEMAND_VBLANK_INTERRUPTS_ON 1 /* * NV_CTRL_GPU_POWER_SOURCE reports the type of power source * of the GPU driving the X screen. */ #define NV_CTRL_GPU_POWER_SOURCE 262 /* R--G */ #define NV_CTRL_GPU_POWER_SOURCE_AC 0 #define NV_CTRL_GPU_POWER_SOURCE_BATTERY 1 /* * NV_CTRL_GPU_CURRENT_PERFORMANCE_MODE is deprecated */ #define NV_CTRL_GPU_CURRENT_PERFORMANCE_MODE 263 /* R--G */ #define NV_CTRL_GPU_CURRENT_PERFORMANCE_MODE_DESKTOP 0 #define NV_CTRL_GPU_CURRENT_PERFORMANCE_MODE_MAXPERF 1 /* NV_CTRL_GLYPH_CACHE - Enables RENDER Glyph Caching to VRAM */ #define NV_CTRL_GLYPH_CACHE 264 /* RW- */ #define NV_CTRL_GLYPH_CACHE_DISABLED 0 #define NV_CTRL_GLYPH_CACHE_ENABLED 1 /* * NV_CTRL_GPU_CURRENT_PERFORMANCE_LEVEL reports the current * Performance level of the GPU driving the X screen. Each * Performance level has associated NVClock and Mem Clock values. */ #define NV_CTRL_GPU_CURRENT_PERFORMANCE_LEVEL 265 /* R--G */ /* * NV_CTRL_GPU_ADAPTIVE_CLOCK_STATE reports if Adaptive Clocking * is Enabled on the GPU driving the X screen. */ #define NV_CTRL_GPU_ADAPTIVE_CLOCK_STATE 266 /* R--G */ #define NV_CTRL_GPU_ADAPTIVE_CLOCK_STATE_DISABLED 0 #define NV_CTRL_GPU_ADAPTIVE_CLOCK_STATE_ENABLED 1 /* * NV_CTRL_GVO_OUTPUT_VIDEO_LOCKED - Returns whether or not the GVO output * video is locked to the GPU. */ #define NV_CTRL_GVO_OUTPUT_VIDEO_LOCKED 267 /* R--- */ #define NV_CTRL_GVO_OUTPUT_VIDEO_LOCKED_FALSE 0 #define NV_CTRL_GVO_OUTPUT_VIDEO_LOCKED_TRUE 1 /* * NV_CTRL_GVO_SYNC_LOCK_STATUS - Returns whether or not the GVO device * is locked to the input ref signal. If the sync mode is set to * NV_CTRL_GVO_SYNC_MODE_GENLOCK, then this returns the genlock * sync status, and if the sync mode is set to NV_CTRL_GVO_SYNC_MODE_FRAMELOCK, * then this reports the frame lock status. */ #define NV_CTRL_GVO_SYNC_LOCK_STATUS 268 /* R--- */ #define NV_CTRL_GVO_SYNC_LOCK_STATUS_UNLOCKED 0 #define NV_CTRL_GVO_SYNC_LOCK_STATUS_LOCKED 1 /* * NV_CTRL_GVO_ANC_TIME_CODE_GENERATION - Allows SDI device to generate * time codes in the ANC region of the SDI video output stream. */ #define NV_CTRL_GVO_ANC_TIME_CODE_GENERATION 269 /* RW-- */ #define NV_CTRL_GVO_ANC_TIME_CODE_GENERATION_DISABLE 0 #define NV_CTRL_GVO_ANC_TIME_CODE_GENERATION_ENABLE 1 /* * NV_CTRL_GVO_COMPOSITE - Enables/Disables SDI compositing. This attribute * is only available when an SDI input source is detected and is in genlock * mode. */ #define NV_CTRL_GVO_COMPOSITE 270 /* RW-- */ #define NV_CTRL_GVO_COMPOSITE_DISABLE 0 #define NV_CTRL_GVO_COMPOSITE_ENABLE 1 /* * NV_CTRL_GVO_COMPOSITE_ALPHA_KEY - When compositing is enabled, this * enables/disables alpha blending. */ #define NV_CTRL_GVO_COMPOSITE_ALPHA_KEY 271 /* RW-- */ #define NV_CTRL_GVO_COMPOSITE_ALPHA_KEY_DISABLE 0 #define NV_CTRL_GVO_COMPOSITE_ALPHA_KEY_ENABLE 1 /* * NV_CTRL_GVO_COMPOSITE_LUMA_KEY_RANGE - Set the values of a luma * channel range. This is a packed int that has the following format * (in order of high-bits to low bits): * * Range # (11 bits), (Enabled 1 bit), min value (10 bits), max value (10 bits) * * To query the current values, pass the range # throught the display_mask * variable. */ #define NV_CTRL_GVO_COMPOSITE_LUMA_KEY_RANGE 272 /* RW-- */ #define NV_CTRL_GVO_COMPOSITE_MAKE_RANGE(range, enable, min, max) \ ((((min) & 0x3FF) << 0) | \ (((max) & 0x3FF) << 10) | \ (((enable) & 0x1) << 20) | \ (((range) & 0x7FF) << 21)) #define NV_CTRL_GVO_COMPOSITE_GET_RANGE(val, range, enable, min, max) \ (min) = ((val) >> 0) & 0x3FF; \ (max) = ((val) >> 10) & 0x3FF; \ (enable) = ((val) >> 20) & 0x1; \ (range) = ((val) >> 21) & 0x7FF; /* * NV_CTRL_GVO_COMPOSITE_CR_KEY_RANGE - Set the values of a CR * channel range. This is a packed int that has the following format * (in order of high-bits to low bits): * * Range # (11 bits), (Enabled 1 bit), min value (10 bits), max value (10 bits) * * To query the current values, pass the range # throught he display_mask * variable. */ #define NV_CTRL_GVO_COMPOSITE_CR_KEY_RANGE 273 /* RW-- */ /* * NV_CTRL_GVO_COMPOSITE_CB_KEY_RANGE - Set the values of a CB * channel range. This is a packed int that has the following format * (in order of high-bits to low bits): * * Range # (11 bits), (Enabled 1 bit), min value (10 bits), max value (10 bits) * * To query the current values, pass the range # throught he display_mask * variable. */ #define NV_CTRL_GVO_COMPOSITE_CB_KEY_RANGE 274 /* RW-- */ /* * NV_CTRL_GVO_COMPOSITE_NUM_KEY_RANGES - Returns the number of ranges * available for each channel (Y/Luma, Cr, and Cb.) */ #define NV_CTRL_GVO_COMPOSITE_NUM_KEY_RANGES 275 /* R--- */ /* * NV_CTRL_SWITCH_TO_DISPLAYS - Can be used to select which displays * to switch to (as a hotkey event). */ #define NV_CTRL_SWITCH_TO_DISPLAYS 276 /* -W- */ /* * NV_CTRL_NOTEBOOK_DISPLAY_CHANGE_LID_EVENT - Event that notifies * when a notebook lid change occurs (i.e. when the lid is opened or * closed.) This attribute can be queried to retrieve the current * notebook lid status (opened/closed.) */ #define NV_CTRL_NOTEBOOK_DISPLAY_CHANGE_LID_EVENT 277 /* RW- */ #define NV_CTRL_NOTEBOOK_DISPLAY_CHANGE_LID_EVENT_CLOSE 0 #define NV_CTRL_NOTEBOOK_DISPLAY_CHANGE_LID_EVENT_OPEN 1 /* * NV_CTRL_NOTEBOOK_INTERNAL_LCD - Returns the display device mask of * the intenal LCD of a notebook. */ #define NV_CTRL_NOTEBOOK_INTERNAL_LCD 278 /* R-- */ /* * NV_CTRL_DEPTH_30_ALLOWED - returns whether the NVIDIA X driver supports * depth 30 on the specified X screen or GPU. */ #define NV_CTRL_DEPTH_30_ALLOWED 279 /* R--G */ /* * NV_CTRL_MODE_SET_EVENT This attribute is sent as an event * when hotkey, ctrl-alt-+/- or randr event occurs. Note that * This attribute cannot be set or queried and is meant to * be received by clients that wish to be notified of when * mode set events occur. */ #define NV_CTRL_MODE_SET_EVENT 280 /* --- */ /* * NV_CTRL_OPENGL_AA_LINE_GAMMA_VALUE - the gamma value used by * OpenGL when NV_CTRL_OPENGL_AA_LINE_GAMMA is enabled */ #define NV_CTRL_OPENGL_AA_LINE_GAMMA_VALUE 281 /* RW-X */ /* * NV_CTRL_VCSC_HIGH_PERF_MODE - Is used to both query High Performance Mode * status on the Visual Computing System, and also to enable or disable High * Performance Mode. */ #define NV_CTRL_VCSC_HIGH_PERF_MODE 282 /* RW-V */ #define NV_CTRL_VCSC_HIGH_PERF_MODE_DISABLE 0 #define NV_CTRL_VCSC_HIGH_PERF_MODE_ENABLE 1 /* * NV_CTRL_DISPLAYPORT_LINK_RATE - returns the negotiated lane bandwidth of the * DisplayPort main link. The numerical value of this attribute is the link * rate in bps divided by 27000000. * This attribute is only available for DisplayPort flat panels. */ #define NV_CTRL_DISPLAYPORT_LINK_RATE 291 /* R-DG */ #define NV_CTRL_DISPLAYPORT_LINK_RATE_DISABLED 0x0 #define NV_CTRL_DISPLAYPORT_LINK_RATE_1_62GBPS 0x6 /* deprecated */ #define NV_CTRL_DISPLAYPORT_LINK_RATE_2_70GBPS 0xA /* deprecated */ /* * NV_CTRL_STEREO_EYES_EXCHANGE - Controls whether or not the left and right * eyes of a stereo image are flipped. */ #define NV_CTRL_STEREO_EYES_EXCHANGE 292 /* RW-X */ #define NV_CTRL_STEREO_EYES_EXCHANGE_OFF 0 #define NV_CTRL_STEREO_EYES_EXCHANGE_ON 1 /* * NV_CTRL_NO_SCANOUT - returns whether the special "NoScanout" mode is * enabled on the specified X screen or GPU; for details on this mode, * see the description of the "none" value for the "UseDisplayDevice" * X configuration option in the NVIDIA driver README. */ #define NV_CTRL_NO_SCANOUT 293 /* R--G */ #define NV_CTRL_NO_SCANOUT_DISABLED 0 #define NV_CTRL_NO_SCANOUT_ENABLED 1 /* * NV_CTRL_GVO_CSC_CHANGED_EVENT This attribute is sent as an event * when the color space conversion matrix has been altered by another * client. */ #define NV_CTRL_GVO_CSC_CHANGED_EVENT 294 /* --- */ /* * NV_CTRL_FRAMELOCK_SLAVEABLE is deprecated; NV_CTRL_FRAMELOCK_DISPLAY_CONFIG * should be used instead. */ #define NV_CTRL_FRAMELOCK_SLAVEABLE 295 /* R-DG */ /* * NV_CTRL_GVO_SYNC_TO_DISPLAY This attribute controls whether or not * the non-SDI display device will be sync'ed to the SDI display device * (when configured in TwinView, Clone Mode or when using the SDI device * with OpenGL). */ #define NV_CTRL_GVO_SYNC_TO_DISPLAY 296 /* --- */ #define NV_CTRL_GVO_SYNC_TO_DISPLAY_DISABLE 0 #define NV_CTRL_GVO_SYNC_TO_DISPLAY_ENABLE 1 /* * NV_CTRL_X_SERVER_UNIQUE_ID - returns a pseudo-unique identifier for this * X server. Intended for use in cases where an NV-CONTROL client communicates * with multiple X servers, and wants some level of confidence that two * X Display connections correspond to the same or different X servers. */ #define NV_CTRL_X_SERVER_UNIQUE_ID 297 /* R--- */ /* * NV_CTRL_PIXMAP_CACHE - This attribute controls whether the driver attempts to * store video memory pixmaps in a cache. The cache speeds up allocation and * deallocation of pixmaps, but could use more memory than when the cache is * disabled. */ #define NV_CTRL_PIXMAP_CACHE 298 /* RW-X */ #define NV_CTRL_PIXMAP_CACHE_DISABLE 0 #define NV_CTRL_PIXMAP_CACHE_ENABLE 1 /* * NV_CTRL_PIXMAP_CACHE_ROUNDING_SIZE_KB - When the pixmap cache is enabled and * there is not enough free space in the cache to fit a new pixmap, the driver * will round up to the next multiple of this number of kilobytes when * allocating more memory for the cache. */ #define NV_CTRL_PIXMAP_CACHE_ROUNDING_SIZE_KB 299 /* RW-X */ /* * NV_CTRL_IS_GVO_DISPLAY - returns whether or not a given display is an * SDI device. */ #define NV_CTRL_IS_GVO_DISPLAY 300 /* R-D */ #define NV_CTRL_IS_GVO_DISPLAY_FALSE 0 #define NV_CTRL_IS_GVO_DISPLAY_TRUE 1 /* * NV_CTRL_PCI_ID - Returns the PCI vendor and device ID of the specified * device. * * NV_CTRL_PCI_ID is a "packed" integer attribute; the PCI vendor ID is stored * in the upper 16 bits of the integer, and the PCI device ID is stored in the * lower 16 bits of the integer. */ #define NV_CTRL_PCI_ID 301 /* R--GI */ /* * NV_CTRL_GVO_FULL_RANGE_COLOR - Allow full range color data [4-1019] * without clamping to [64-940]. */ #define NV_CTRL_GVO_FULL_RANGE_COLOR 302 /* RW- */ #define NV_CTRL_GVO_FULL_RANGE_COLOR_DISABLED 0 #define NV_CTRL_GVO_FULL_RANGE_COLOR_ENABLED 1 /* * NV_CTRL_SLI_MOSAIC_MODE_AVAILABLE - Returns whether or not * SLI Mosaic Mode supported. */ #define NV_CTRL_SLI_MOSAIC_MODE_AVAILABLE 303 /* R-- */ #define NV_CTRL_SLI_MOSAIC_MODE_AVAILABLE_FALSE 0 #define NV_CTRL_SLI_MOSAIC_MODE_AVAILABLE_TRUE 1 /* * NV_CTRL_GVO_ENABLE_RGB_DATA - Allows clients to specify when * the GVO board should process colors as RGB when the output data * format is one of the NV_CTRL_GVO_DATA_FORMAT_???_PASSTRHU modes. */ #define NV_CTRL_GVO_ENABLE_RGB_DATA 304 /* RW- */ #define NV_CTRL_GVO_ENABLE_RGB_DATA_DISABLE 0 #define NV_CTRL_GVO_ENABLE_RGB_DATA_ENABLE 1 /* * NV_CTRL_IMAGE_SHARPENING_DEFAULT - Returns default value of * Image Sharpening. */ #define NV_CTRL_IMAGE_SHARPENING_DEFAULT 305 /* R-- */ /* * NV_CTRL_PCI_DOMAIN - Returns the PCI domain number the specified device is * using. */ #define NV_CTRL_PCI_DOMAIN 306 /* R--GI */ /* * NV_CTRL_GVI_NUM_JACKS - Returns the number of input BNC jacks available * on a GVI device. */ #define NV_CTRL_GVI_NUM_JACKS 307 /* R--I */ /* * NV_CTRL_GVI_MAX_LINKS_PER_STREAM - Returns the maximum supported number of * links that can be tied to one stream. */ #define NV_CTRL_GVI_MAX_LINKS_PER_STREAM 308 /* R--I */ /* * NV_CTRL_GVI_DETECTED_CHANNEL_BITS_PER_COMPONENT - Returns the detected * number of bits per component (BPC) of data on the given input jack+ * channel. * * The jack number should be specified in the lower 16 bits of the * "display_mask" parameter, while the channel number should be specified in * the upper 16 bits. */ #define NV_CTRL_GVI_DETECTED_CHANNEL_BITS_PER_COMPONENT 309 /* R--I */ #define NV_CTRL_GVI_BITS_PER_COMPONENT_UNKNOWN 0 #define NV_CTRL_GVI_BITS_PER_COMPONENT_8 1 #define NV_CTRL_GVI_BITS_PER_COMPONENT_10 2 #define NV_CTRL_GVI_BITS_PER_COMPONENT_12 3 /* * NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT - Specify the number of * bits per component (BPC) of data for the captured stream. * The stream number should be specified in the "display_mask" parameter. * * Note: Setting this attribute may also result in the following * NV-CONTROL attributes being reset on the GVI device (to ensure * the configuration remains valid): * NV_CTRL_GVI_REQUESTED_STREAM_COMPONENT_SAMPLING */ #define NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT 310 /* RW-I */ /* * NV_CTRL_GVI_DETECTED_CHANNEL_COMPONENT_SAMPLING - Returns the detected * sampling format for the input jack+channel. * * The jack number should be specified in the lower 16 bits of the * "display_mask" parameter, while the channel number should be specified in * the upper 16 bits. */ #define NV_CTRL_GVI_DETECTED_CHANNEL_COMPONENT_SAMPLING 311 /* R--I */ #define NV_CTRL_GVI_COMPONENT_SAMPLING_UNKNOWN 0 #define NV_CTRL_GVI_COMPONENT_SAMPLING_4444 1 #define NV_CTRL_GVI_COMPONENT_SAMPLING_4224 2 #define NV_CTRL_GVI_COMPONENT_SAMPLING_444 3 #define NV_CTRL_GVI_COMPONENT_SAMPLING_422 4 #define NV_CTRL_GVI_COMPONENT_SAMPLING_420 5 /* * NV_CTRL_GVI_REQUESTED_COMPONENT_SAMPLING - Specify the sampling format for * the captured stream. * The possible values are the NV_CTRL_GVI_DETECTED_COMPONENT_SAMPLING * constants. * The stream number should be specified in the "display_mask" parameter. */ #define NV_CTRL_GVI_REQUESTED_STREAM_COMPONENT_SAMPLING 312 /* RW-I */ /* * NV_CTRL_GVI_CHROMA_EXPAND - Enable or disable 4:2:2 -> 4:4:4 chroma * expansion for the captured stream. This value is ignored when a * COMPONENT_SAMPLING format is selected that does not use chroma subsampling, * or if a BITS_PER_COMPONENT value is selected that is not supported. * The stream number should be specified in the "display_mask" parameter. */ #define NV_CTRL_GVI_REQUESTED_STREAM_CHROMA_EXPAND 313 /* RW-I */ #define NV_CTRL_GVI_CHROMA_EXPAND_FALSE 0 #define NV_CTRL_GVI_CHROMA_EXPAND_TRUE 1 /* * NV_CTRL_GVI_DETECTED_CHANNEL_COLOR_SPACE - Returns the detected color space * of the input jack+channel. * * The jack number should be specified in the lower 16 bits of the * "display_mask" parameter, while the channel number should be specified in * the upper 16 bits. */ #define NV_CTRL_GVI_DETECTED_CHANNEL_COLOR_SPACE 314 /* R--I */ #define NV_CTRL_GVI_COLOR_SPACE_UNKNOWN 0 #define NV_CTRL_GVI_COLOR_SPACE_GBR 1 #define NV_CTRL_GVI_COLOR_SPACE_GBRA 2 #define NV_CTRL_GVI_COLOR_SPACE_GBRD 3 #define NV_CTRL_GVI_COLOR_SPACE_YCBCR 4 #define NV_CTRL_GVI_COLOR_SPACE_YCBCRA 5 #define NV_CTRL_GVI_COLOR_SPACE_YCBCRD 6 /* * NV_CTRL_GVI_DETECTED_CHANNEL_LINK_ID - Returns the detected link identifier * for the given input jack+channel. * * The jack number should be specified in the lower 16 bits of the * "display_mask" parameter, while the channel number should be specified in * the upper 16 bits. */ #define NV_CTRL_GVI_DETECTED_CHANNEL_LINK_ID 315 /* R--I */ #define NV_CTRL_GVI_LINK_ID_UNKNOWN 0xFFFF /* * NV_CTRL_GVI_DETECTED_CHANNEL_SMPTE352_IDENTIFIER - Returns the 4-byte * SMPTE 352 identifier from the given input jack+channel. * * The jack number should be specified in the lower 16 bits of the * "display_mask" parameter, while the channel number should be specified in * the upper 16 bits. */ #define NV_CTRL_GVI_DETECTED_CHANNEL_SMPTE352_IDENTIFIER 316 /* R--I */ /* * NV_CTRL_GVI_GLOBAL_IDENTIFIER - Returns a global identifier for the * GVI device. This identifier can be used to relate GVI devices named * in NV-CONTROL with those enumerated in OpenGL. */ #define NV_CTRL_GVI_GLOBAL_IDENTIFIER 317 /* R--I */ /* * NV_CTRL_FRAMELOCK_SYNC_DELAY_RESOLUTION - Returns the number of nanoseconds * that one unit of NV_CTRL_FRAMELOCK_SYNC_DELAY corresponds to. */ #define NV_CTRL_FRAMELOCK_SYNC_DELAY_RESOLUTION 318 /* R-- */ /* * NV_CTRL_GPU_COOLER_MANUAL_CONTROL - Query the current or set a new * cooler control state; the value of this attribute controls the * availability of additional cooler control attributes (see below). * * Note: this attribute is unavailable unless cooler control support * has been enabled in the X server (by the user). */ #define NV_CTRL_GPU_COOLER_MANUAL_CONTROL 319 /* RW-G */ #define NV_CTRL_GPU_COOLER_MANUAL_CONTROL_FALSE 0 #define NV_CTRL_GPU_COOLER_MANUAL_CONTROL_TRUE 1 /* * NV_CTRL_THERMAL_COOLER_LEVEL - Returns cooler's current operating * level. */ #define NV_CTRL_THERMAL_COOLER_LEVEL 320 /* RW-C */ /* NV_CTRL_THERMAL_COOLER_LEVEL_SET_DEFAULT - Sets default values of * cooler. */ #define NV_CTRL_THERMAL_COOLER_LEVEL_SET_DEFAULT 321 /* -W-C */ /* * NV_CTRL_THERMAL_COOLER_CONTROL_TYPE - * Returns a cooler's control signal characteristics. * The possible types are restricted, Variable and Toggle. */ #define NV_CTRL_THERMAL_COOLER_CONTROL_TYPE 322 /* R--C */ #define NV_CTRL_THERMAL_COOLER_CONTROL_TYPE_NONE 0 #define NV_CTRL_THERMAL_COOLER_CONTROL_TYPE_TOGGLE 1 #define NV_CTRL_THERMAL_COOLER_CONTROL_TYPE_VARIABLE 2 /* * NV_CTRL_THERMAL_COOLER_TARGET - Returns objects that cooler cools. * Targets may be GPU, Memory, Power Supply or All of these. * GPU_RELATED = GPU | MEMORY | POWER_SUPPLY * */ #define NV_CTRL_THERMAL_COOLER_TARGET 323 /* R--C */ #define NV_CTRL_THERMAL_COOLER_TARGET_NONE 0 #define NV_CTRL_THERMAL_COOLER_TARGET_GPU 1 #define NV_CTRL_THERMAL_COOLER_TARGET_MEMORY 2 #define NV_CTRL_THERMAL_COOLER_TARGET_POWER_SUPPLY 4 #define NV_CTRL_THERMAL_COOLER_TARGET_GPU_RELATED \ (NV_CTRL_THERMAL_COOLER_TARGET_GPU | \ NV_CTRL_THERMAL_COOLER_TARGET_MEMORY | \ NV_CTRL_THERMAL_COOLER_TARGET_POWER_SUPPLY) /* * NV_CTRL_GPU_ECC_SUPPORTED - Reports whether ECC is supported by the * targeted GPU. */ #define NV_CTRL_GPU_ECC_SUPPORTED 324 /* R--G */ #define NV_CTRL_GPU_ECC_SUPPORTED_FALSE 0 #define NV_CTRL_GPU_ECC_SUPPORTED_TRUE 1 /* * NV_CTRL_GPU_ECC_STATUS - Returns the current hardware ECC setting * for the targeted GPU. */ #define NV_CTRL_GPU_ECC_STATUS 325 /* R--G */ #define NV_CTRL_GPU_ECC_STATUS_DISABLED 0 #define NV_CTRL_GPU_ECC_STATUS_ENABLED 1 /* * NV_CTRL_GPU_ECC_CONFIGURATION - Reports whether ECC can be configured * dynamically for the GPU in question. */ #define NV_CTRL_GPU_ECC_CONFIGURATION_SUPPORTED 326 /* R--G */ #define NV_CTRL_GPU_ECC_CONFIGURATION_SUPPORTED_FALSE 0 #define NV_CTRL_GPU_ECC_CONFIGURATION_SUPPORTED_TRUE 1 /* * NV_CTRL_GPU_ECC_CONFIGURATION_SETTING - Returns the current ECC * configuration setting or specifies new settings. New settings do not * take effect until the next POST. */ #define NV_CTRL_GPU_ECC_CONFIGURATION 327 /* RW-G */ #define NV_CTRL_GPU_ECC_CONFIGURATION_DISABLED 0 #define NV_CTRL_GPU_ECC_CONFIGURATION_ENABLED 1 /* * NV_CTRL_GPU_ECC_DEFAULT_CONFIGURATION_SETTING - Returns the default * ECC configuration setting. */ #define NV_CTRL_GPU_ECC_DEFAULT_CONFIGURATION 328 /* R--G */ #define NV_CTRL_GPU_ECC_DEFAULT_CONFIGURATION_DISABLED 0 #define NV_CTRL_GPU_ECC_DEFAULT_CONFIGURATION_ENABLED 1 /* * NV_CTRL_GPU_ECC_SINGLE_BIT_ERRORS - Returns the number of single-bit * ECC errors detected by the targeted GPU since the last POST. * Note: this attribute is a 64-bit integer attribute. */ #define NV_CTRL_GPU_ECC_SINGLE_BIT_ERRORS 329 /* R--GQ */ /* * NV_CTRL_GPU_ECC_DOUBLE_BIT_ERRORS - Returns the number of double-bit * ECC errors detected by the targeted GPU since the last POST. * Note: this attribute is a 64-bit integer attribute. */ #define NV_CTRL_GPU_ECC_DOUBLE_BIT_ERRORS 330 /* R--GQ */ /* * NV_CTRL_GPU_ECC_AGGREGATE_SINGLE_BIT_ERRORS - Returns the number of * single-bit ECC errors detected by the targeted GPU since the * last counter reset. * Note: this attribute is a 64-bit integer attribute. */ #define NV_CTRL_GPU_ECC_AGGREGATE_SINGLE_BIT_ERRORS 331 /* R--GQ */ /* * NV_CTRL_GPU_ECC_AGGREGATE_DOUBLE_BIT_ERRORS - Returns the number of * double-bit ECC errors detected by the targeted GPU since the * last counter reset. * Note: this attribute is a 64-bit integer attribute. */ #define NV_CTRL_GPU_ECC_AGGREGATE_DOUBLE_BIT_ERRORS 332 /* R--GQ */ /* * NV_CTRL_GPU_ECC_RESET_ERROR_STATUS - Resets the volatile/aggregate * single-bit and double-bit error counters. This attribute is a * bitmask attribute. */ #define NV_CTRL_GPU_ECC_RESET_ERROR_STATUS 333 /* -W-G */ #define NV_CTRL_GPU_ECC_RESET_ERROR_STATUS_VOLATILE 0x00000001 #define NV_CTRL_GPU_ECC_RESET_ERROR_STATUS_AGGREGATE 0x00000002 /* * NV_CTRL_GPU_POWER_MIZER_MODE - Provides a hint to the driver * as to how to manage the performance of the GPU. * * ADAPTIVE - adjust GPU clocks based on GPU * utilization * PREFER_MAXIMUM_PERFORMANCE - raise GPU clocks to favor * maximum performance, to the extent * that thermal and other constraints * allow * AUTO - let the driver choose the performance * policy * PREFER_CONSISTENT_PERFORMANCE - lock to GPU base clocks */ #define NV_CTRL_GPU_POWER_MIZER_MODE 334 /* RW-G */ #define NV_CTRL_GPU_POWER_MIZER_MODE_ADAPTIVE 0 #define NV_CTRL_GPU_POWER_MIZER_MODE_PREFER_MAXIMUM_PERFORMANCE 1 #define NV_CTRL_GPU_POWER_MIZER_MODE_AUTO 2 #define NV_CTRL_GPU_POWER_MIZER_MODE_PREFER_CONSISTENT_PERFORMANCE 3 /* * NV_CTRL_GVI_SYNC_OUTPUT_FORMAT - Returns the output sync signal * from the GVI device. */ #define NV_CTRL_GVI_SYNC_OUTPUT_FORMAT 335 /* R--I */ /* * NV_CTRL_GVI_MAX_CHANNELS_PER_JACK - Returns the maximum * supported number of (logical) channels within a single physical jack of * a GVI device. For most SDI video formats, there is only one channel * (channel 0). But for 3G video formats (as specified in SMPTE 425), * as an example, there are two channels (channel 0 and channel 1) per * physical jack. */ #define NV_CTRL_GVI_MAX_CHANNELS_PER_JACK 336 /* R--I */ /* * NV_CTRL_GVI_MAX_STREAMS - Returns the maximum number of streams * that can be configured on the GVI device. */ #define NV_CTRL_GVI_MAX_STREAMS 337 /* R--I */ /* * NV_CTRL_GVI_NUM_CAPTURE_SURFACES - The GVI interface exposed through * NV-CONTROL and the GLX_NV_video_input extension uses internal capture * surfaces when frames are read from the GVI device. The * NV_CTRL_GVI_NUM_CAPTURE_SURFACES can be used to query and assign the * number of capture surfaces. This attribute is applied when * glXBindVideoCaptureDeviceNV() is called by the application. * * A lower number of capture surfaces will mean less video memory is used, * but can result in frames being dropped if the application cannot keep up * with the capture device. A higher number will prevent frames from being * dropped, making capture more reliable but will consume move video memory. */ #define NV_CTRL_GVI_NUM_CAPTURE_SURFACES 338 /* RW-I */ /* * NV_CTRL_OVERSCAN_COMPENSATION - not supported */ #define NV_CTRL_OVERSCAN_COMPENSATION 339 /* RWDG */ /* * NV_CTRL_GPU_PCIE_GENERATION - Reports the current PCIe generation. */ #define NV_CTRL_GPU_PCIE_GENERATION 341 /* R--GI */ #define NV_CTRL_GPU_PCIE_GENERATION1 0x00000001 #define NV_CTRL_GPU_PCIE_GENERATION2 0x00000002 #define NV_CTRL_GPU_PCIE_GENERATION3 0x00000003 /* * NV_CTRL_GVI_BOUND_GPU - Returns the NV_CTRL_TARGET_TYPE_GPU target_id of * the GPU currently bound to the GVI device. Returns -1 if no GPU is * currently bound to the GVI device. */ #define NV_CTRL_GVI_BOUND_GPU 342 /* R--I */ /* * NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT3 - this attribute is only * intended to be used to query the ValidValues for * NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT for VIDEO_FORMAT values between * 64 and 95. See NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT for details. */ #define NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT3 343 /* ---GI */ /* * NV_CTRL_ACCELERATE_TRAPEZOIDS - Toggles RENDER Trapezoid acceleration */ #define NV_CTRL_ACCELERATE_TRAPEZOIDS 344 /* RW- */ #define NV_CTRL_ACCELERATE_TRAPEZOIDS_DISABLE 0 #define NV_CTRL_ACCELERATE_TRAPEZOIDS_ENABLE 1 /* * NV_CTRL_GPU_CORES - Returns number of GPU cores supported by the graphics * pipeline. */ #define NV_CTRL_GPU_CORES 345 /* R--G */ /* * NV_CTRL_GPU_MEMORY_BUS_WIDTH - Returns memory bus bandwidth on the associated * subdevice. */ #define NV_CTRL_GPU_MEMORY_BUS_WIDTH 346 /* R--G */ /* * NV_CTRL_GVI_TEST_MODE - This attribute controls the GVI test mode. When * enabled, the GVI device will generate fake data as quickly as possible. All * GVI settings are still valid when this is enabled (e.g., the requested video * format is honored and sets the video size). * This may be used to test the pipeline. */ #define NV_CTRL_GVI_TEST_MODE 347 /* R--I */ #define NV_CTRL_GVI_TEST_MODE_DISABLE 0 #define NV_CTRL_GVI_TEST_MODE_ENABLE 1 /* * NV_CTRL_COLOR_SPACE - This option sets color space of the video * signal. */ #define NV_CTRL_COLOR_SPACE 348 /* RWDG */ #define NV_CTRL_COLOR_SPACE_RGB 0 #define NV_CTRL_COLOR_SPACE_YCbCr422 1 #define NV_CTRL_COLOR_SPACE_YCbCr444 2 /* * NV_CTRL_COLOR_RANGE - This option sets color range of the video * signal. */ #define NV_CTRL_COLOR_RANGE 349 /* RWDG */ #define NV_CTRL_COLOR_RANGE_FULL 0 #define NV_CTRL_COLOR_RANGE_LIMITED 1 /* * NV_CTRL_GPU_SCALING_DEFAULT_TARGET - not supported * * NV_CTRL_GPU_SCALING_DEFAULT_METHOD - not supported */ #define NV_CTRL_GPU_SCALING_DEFAULT_TARGET 350 /* R-DG */ #define NV_CTRL_GPU_SCALING_DEFAULT_METHOD 351 /* R-DG */ /* * NV_CTRL_DITHERING_MODE - Controls the dithering mode, when * NV_CTRL_CURRENT_DITHERING is Enabled. * * AUTO: allow the driver to choose the dithering mode automatically. * * DYNAMIC_2X2: use a 2x2 matrix to dither from the GPU's pixel * pipeline to the bit depth of the flat panel. The matrix values * are changed from frame to frame. * * STATIC_2X2: use a 2x2 matrix to dither from the GPU's pixel * pipeline to the bit depth of the flat panel. The matrix values * do not change from frame to frame. * * TEMPORAL: use a pseudorandom value from a uniform distribution calculated at * every pixel to achieve stochastic dithering. This method produces a better * visual result than 2x2 matrix approaches. */ #define NV_CTRL_DITHERING_MODE 352 /* RWDG */ #define NV_CTRL_DITHERING_MODE_AUTO 0 #define NV_CTRL_DITHERING_MODE_DYNAMIC_2X2 1 #define NV_CTRL_DITHERING_MODE_STATIC_2X2 2 #define NV_CTRL_DITHERING_MODE_TEMPORAL 3 /* * NV_CTRL_CURRENT_DITHERING - Returns the current dithering state. */ #define NV_CTRL_CURRENT_DITHERING 353 /* R-DG */ #define NV_CTRL_CURRENT_DITHERING_DISABLED 0 #define NV_CTRL_CURRENT_DITHERING_ENABLED 1 /* * NV_CTRL_CURRENT_DITHERING_MODE - Returns the current dithering * mode. */ #define NV_CTRL_CURRENT_DITHERING_MODE 354 /* R-DG */ #define NV_CTRL_CURRENT_DITHERING_MODE_NONE 0 #define NV_CTRL_CURRENT_DITHERING_MODE_DYNAMIC_2X2 1 #define NV_CTRL_CURRENT_DITHERING_MODE_STATIC_2X2 2 #define NV_CTRL_CURRENT_DITHERING_MODE_TEMPORAL 3 /* * NV_CTRL_THERMAL_SENSOR_READING - Returns the thermal sensor's current * reading. */ #define NV_CTRL_THERMAL_SENSOR_READING 355 /* R--S */ /* * NV_CTRL_THERMAL_SENSOR_PROVIDER - Returns the hardware device that * provides the thermal sensor. */ #define NV_CTRL_THERMAL_SENSOR_PROVIDER 356 /* R--S */ #define NV_CTRL_THERMAL_SENSOR_PROVIDER_NONE 0 #define NV_CTRL_THERMAL_SENSOR_PROVIDER_GPU_INTERNAL 1 #define NV_CTRL_THERMAL_SENSOR_PROVIDER_ADM1032 2 #define NV_CTRL_THERMAL_SENSOR_PROVIDER_ADT7461 3 #define NV_CTRL_THERMAL_SENSOR_PROVIDER_MAX6649 4 #define NV_CTRL_THERMAL_SENSOR_PROVIDER_MAX1617 5 #define NV_CTRL_THERMAL_SENSOR_PROVIDER_LM99 6 #define NV_CTRL_THERMAL_SENSOR_PROVIDER_LM89 7 #define NV_CTRL_THERMAL_SENSOR_PROVIDER_LM64 8 #define NV_CTRL_THERMAL_SENSOR_PROVIDER_G781 9 #define NV_CTRL_THERMAL_SENSOR_PROVIDER_ADT7473 10 #define NV_CTRL_THERMAL_SENSOR_PROVIDER_SBMAX6649 11 #define NV_CTRL_THERMAL_SENSOR_PROVIDER_VBIOSEVT 12 #define NV_CTRL_THERMAL_SENSOR_PROVIDER_OS 13 #define NV_CTRL_THERMAL_SENSOR_PROVIDER_UNKNOWN 0xFFFFFFFF /* * NV_CTRL_THERMAL_SENSOR_TARGET - Returns what hardware component * the thermal sensor is measuring. */ #define NV_CTRL_THERMAL_SENSOR_TARGET 357 /* R--S */ #define NV_CTRL_THERMAL_SENSOR_TARGET_NONE 0 #define NV_CTRL_THERMAL_SENSOR_TARGET_GPU 1 #define NV_CTRL_THERMAL_SENSOR_TARGET_MEMORY 2 #define NV_CTRL_THERMAL_SENSOR_TARGET_POWER_SUPPLY 4 #define NV_CTRL_THERMAL_SENSOR_TARGET_BOARD 8 #define NV_CTRL_THERMAL_SENSOR_TARGET_UNKNOWN 0xFFFFFFFF /* * NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR - when TRUE, OpenGL will * draw information about the current MULTIGPU mode. */ #define NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR 358 /* RW-X */ #define NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR_FALSE 0 #define NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR_TRUE 1 /* * NV_CTRL_GPU_CURRENT_PROCESSOR_CLOCK_FREQS - Returns GPU's processor * clock freqs. */ #define NV_CTRL_GPU_CURRENT_PROCESSOR_CLOCK_FREQS 359 /* RW-G */ /* * NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS - query the flags (various information * for the specified NV_CTRL_GVIO_VIDEO_FORMAT_*. So that this can be * queried with existing interfaces, the video format should be specified * in the display_mask field; eg: * * XNVCTRLQueryTargetAttribute(dpy, * NV_CTRL_TARGET_TYPE_GVI, * gvi, * NV_CTRL_GVIO_VIDEO_FORMAT_720P_60_00_SMPTE296, * NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS, * &flags); * * Note: The NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_1080P_NO_12BPC flag is set * for those 1080P 3G modes (level A and B) that do not support * 12 bits per component (when configuring a GVI stream.) */ #define NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS 360 /* R--I */ #define NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_NONE 0x00000000 #define NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_INTERLACED 0x00000001 #define NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_PROGRESSIVE 0x00000002 #define NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_PSF 0x00000004 #define NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_LEVEL_A 0x00000008 #define NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_LEVEL_B 0x00000010 #define NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G \ ((NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_LEVEL_A) | \ (NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_LEVEL_B)) #define NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_1080P_NO_12BPC 0x00000020 /* * NV_CTRL_GPU_PCIE_MAX_LINK_SPEED - returns maximum PCIe link speed, * in gigatransfers per second (GT/s). */ #define NV_CTRL_GPU_PCIE_MAX_LINK_SPEED 361 /* R--GI */ /* * NV_CTRL_3D_VISION_PRO_RESET_TRANSCEIVER_TO_FACTORY_SETTINGS - Resets the * 3D Vision Pro transceiver to its factory settings. */ #define NV_CTRL_3D_VISION_PRO_RESET_TRANSCEIVER_TO_FACTORY_SETTINGS 363 /* -W-T */ /* * NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL - Controls the channel that is * currently used by the 3D Vision Pro transceiver. */ #define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL 364 /* RW-T */ /* * NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE - Controls the mode in which the * 3D Vision Pro transceiver operates. * NV_CTRL_3D_VISION_PRO_TM_LOW_RANGE is bidirectional * NV_CTRL_3D_VISION_PRO_TM_MEDIUM_RANGE is bidirectional * NV_CTRL_3D_VISION_PRO_TM_HIGH_RANGE may be bidirectional just up to a * given range, and unidirectional beyond it * NV_CTRL_3D_VISION_PRO_TM_COUNT is the total number of * 3D Vision Pro transceiver modes */ #define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE 365 /* RW-T */ #define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE_INVALID 0 #define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE_LOW_RANGE 1 #define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE_MEDIUM_RANGE 2 #define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE_HIGH_RANGE 3 #define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE_COUNT 4 /* * NV_CTRL_SYNCHRONOUS_PALETTE_UPDATES - controls whether updates to the color * lookup table (LUT) are synchronous with respect to X rendering. For example, * if an X client sends XStoreColors followed by XFillRectangle, the driver will * guarantee that the FillRectangle request is not processed until after the * updated LUT colors are actually visible on the screen if * NV_CTRL_SYNCHRONOUS_PALETTE_UPDATES is enabled. Otherwise, the rendering may * occur first. * * This makes a difference for applications that use the LUT to animate, such as * XPilot. If you experience flickering in applications that use LUT * animations, try enabling this attribute. * * When synchronous updates are enabled, XStoreColors requests will be processed * at your screen's refresh rate. */ #define NV_CTRL_SYNCHRONOUS_PALETTE_UPDATES 367 /* RWDG */ #define NV_CTRL_SYNCHRONOUS_PALETTE_UPDATES_DISABLE 0 #define NV_CTRL_SYNCHRONOUS_PALETTE_UPDATES_ENABLE 1 /* * NV_CTRL_DITHERING_DEPTH - Controls the dithering depth when * NV_CTRL_CURRENT_DITHERING is ENABLED. Some displays connected * to the GPU via the DVI or LVDS interfaces cannot display the * full color range of ten bits per channel, so the GPU will * dither to either 6 or 8 bits per channel. */ #define NV_CTRL_DITHERING_DEPTH 368 /* RWDG */ #define NV_CTRL_DITHERING_DEPTH_AUTO 0 #define NV_CTRL_DITHERING_DEPTH_6_BITS 1 #define NV_CTRL_DITHERING_DEPTH_8_BITS 2 /* * NV_CTRL_CURRENT_DITHERING_DEPTH - Returns the current dithering * depth value. */ #define NV_CTRL_CURRENT_DITHERING_DEPTH 369 /* R-DG */ #define NV_CTRL_CURRENT_DITHERING_DEPTH_NONE 0 #define NV_CTRL_CURRENT_DITHERING_DEPTH_6_BITS 1 #define NV_CTRL_CURRENT_DITHERING_DEPTH_8_BITS 2 /* * NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_FREQUENCY - Returns the * frequency of the channel(in kHz) of the 3D Vision Pro transceiver. * Use the display_mask parameter to specify the channel number. */ #define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_FREQUENCY 370 /* R--T */ /* * NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY - Returns the * quality of the channel(in percentage) of the 3D Vision Pro transceiver. * Use the display_mask parameter to specify the channel number. */ #define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY 371 /* R--T */ /* * NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_COUNT - Returns the number of * channels on the 3D Vision Pro transceiver. */ #define NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_COUNT 372 /* R--T */ /* * NV_CTRL_3D_VISION_PRO_PAIR_GLASSES - Puts the 3D Vision Pro * transceiver into pairing mode to gather additional glasses. * NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_STOP - stops any pairing * NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_BEACON - starts continuous * pairing via beacon mode * Any other value, N - Puts the 3D Vision Pro transceiver into * authenticated pairing mode for N seconds. */ #define NV_CTRL_3D_VISION_PRO_PAIR_GLASSES 373 /* -W-T */ #define NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_STOP 0 #define NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_BEACON 0xFFFFFFFF /* * NV_CTRL_3D_VISION_PRO_UNPAIR_GLASSES - Tells a specific pair * of glasses to unpair. The glasses will "forget" the address * of the 3D Vision Pro transceiver to which they have been paired. * To unpair all the currently paired glasses, specify * the glasses id as 0. */ #define NV_CTRL_3D_VISION_PRO_UNPAIR_GLASSES 374 /* -W-T */ /* * NV_CTRL_3D_VISION_PRO_DISCOVER_GLASSES - Tells the 3D Vision Pro * transceiver about the glasses that have been paired using * NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_BEACON. Unless this is done, * the 3D Vision Pro transceiver will not know about glasses paired in * beacon mode. */ #define NV_CTRL_3D_VISION_PRO_DISCOVER_GLASSES 375 /* -W-T */ /* * NV_CTRL_3D_VISION_PRO_IDENTIFY_GLASSES - Causes glasses LEDs to * flash for a short period of time. */ #define NV_CTRL_3D_VISION_PRO_IDENTIFY_GLASSES 376 /* -W-T */ /* * NV_CTRL_3D_VISION_PRO_GLASSES_SYNC_CYCLE - Controls the * sync cycle duration(in milliseconds) of the glasses. * Use the display_mask parameter to specify the glasses id. */ #define NV_CTRL_3D_VISION_PRO_GLASSES_SYNC_CYCLE 378 /* RW-T */ /* * NV_CTRL_3D_VISION_PRO_GLASSES_MISSED_SYNC_CYCLES - Returns the * number of state sync cycles recently missed by the glasses. * Use the display_mask parameter to specify the glasses id. */ #define NV_CTRL_3D_VISION_PRO_GLASSES_MISSED_SYNC_CYCLES 379 /* R--T */ /* * NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL - Returns the * battery level(in percentage) of the glasses. * Use the display_mask parameter to specify the glasses id. */ #define NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL 380 /* R--T */ /* * NV_CTRL_GVO_ANC_PARITY_COMPUTATION - Controls the SDI device's computation * of the parity bit (bit 8) for ANC data words. */ #define NV_CTRL_GVO_ANC_PARITY_COMPUTATION 381 /* RW--- */ #define NV_CTRL_GVO_ANC_PARITY_COMPUTATION_AUTO 0 #define NV_CTRL_GVO_ANC_PARITY_COMPUTATION_ON 1 #define NV_CTRL_GVO_ANC_PARITY_COMPUTATION_OFF 2 /* * NV_CTRL_3D_VISION_PRO_GLASSES_PAIR_EVENT - This attribute is sent * as an event when glasses get paired in response to pair command * from any of the clients. */ #define NV_CTRL_3D_VISION_PRO_GLASSES_PAIR_EVENT 382 /* ---T */ /* * NV_CTRL_3D_VISION_PRO_GLASSES_UNPAIR_EVENT - This attribute is sent * as an event when glasses get unpaired in response to unpair command * from any of the clients. */ #define NV_CTRL_3D_VISION_PRO_GLASSES_UNPAIR_EVENT 383 /* ---T */ /* * NV_CTRL_GPU_PCIE_CURRENT_LINK_WIDTH - returns the current * PCIe link width, in number of lanes. */ #define NV_CTRL_GPU_PCIE_CURRENT_LINK_WIDTH 384 /* R--GI */ /* * NV_CTRL_GPU_PCIE_CURRENT_LINK_SPEED - returns the current * PCIe link speed, in megatransfers per second (GT/s). */ #define NV_CTRL_GPU_PCIE_CURRENT_LINK_SPEED 385 /* R--GI */ /* * NV_CTRL_GVO_AUDIO_BLANKING - specifies whether the GVO device should delete * audio ancillary data packets when frames are repeated. * * When a new frame is not ready in time, the current frame, including all * ancillary data packets, is repeated. When this data includes audio packets, * this can result in stutters or clicks. When this option is enabled, the GVO * device will detect when frames are repeated, identify audio ancillary data * packets, and mark them for deletion. * * This option is applied when the GVO device is bound. */ #define NV_CTRL_GVO_AUDIO_BLANKING 386 /* RW- */ #define NV_CTRL_GVO_AUDIO_BLANKING_DISABLE 0 #define NV_CTRL_GVO_AUDIO_BLANKING_ENABLE 1 /* * NV_CTRL_CURRENT_METAMODE_ID - switch modes to the MetaMode with * the specified ID. */ #define NV_CTRL_CURRENT_METAMODE_ID 387 /* RW- */ /* * NV_CTRL_DISPLAY_ENABLED - Returns whether or not the display device * is currently enabled. */ #define NV_CTRL_DISPLAY_ENABLED 388 /* R-D */ #define NV_CTRL_DISPLAY_ENABLED_TRUE 1 #define NV_CTRL_DISPLAY_ENABLED_FALSE 0 /* * NV_CTRL_FRAMELOCK_INCOMING_HOUSE_SYNC_RATE: this is the rate * of an incomming house sync signal to the frame lock board, in milliHz. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN * target. */ #define NV_CTRL_FRAMELOCK_INCOMING_HOUSE_SYNC_RATE 389 /* R--F */ /* * NV_CTRL_FXAA - enables FXAA. A pixel shader based anti- * aliasing method. */ #define NV_CTRL_FXAA 390 /* RW-X */ #define NV_CTRL_FXAA_DISABLE 0 #define NV_CTRL_FXAA_ENABLE 1 /* * NV_CTRL_DISPLAY_RANDR_OUTPUT_ID - the RandR Output ID (type RROutput) * that corresponds to the specified Display Device target. If a new * enough version of RandR is not available in the X server, * DISPLAY_RANDR_OUTPUT_ID will be 0. */ #define NV_CTRL_DISPLAY_RANDR_OUTPUT_ID 391 /* R-D- */ /* * NV_CTRL_FRAMELOCK_DISPLAY_CONFIG - Configures whether the display device * should listen, ignore or drive the framelock sync signal. * * Note that whether or not a display device may be set as a client/server * depends on the current configuration. For example, only one server may be * set per Quadro Sync device, and displays can only be configured as a client * if their refresh rate sufficiently matches the refresh rate of the server * device. * * Note that when querying the ValidValues for this data type, the values are * reported as bits within a bitmask (ATTRIBUTE_TYPE_INT_BITS); */ #define NV_CTRL_FRAMELOCK_DISPLAY_CONFIG 392 /* RWD */ #define NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_DISABLED 0 #define NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_CLIENT 1 #define NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_SERVER 2 /* * NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY - Returns the total amount of dedicated * GPU video memory, in MB, on the specified GPU. This excludes any TurboCache * padding included in the value returned by NV_CTRL_TOTAL_GPU_MEMORY. */ #define NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY 393 /* R--G */ /* * NV_CTRL_USED_DEDICATED_GPU_MEMORY- Returns the amount of video memory * currently used on the graphics card in MB. */ #define NV_CTRL_USED_DEDICATED_GPU_MEMORY 394 /* R--G */ /* * NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE * Some GPUs can make a tradeoff between double-precision floating-point * performance and clock speed. Enabling double-precision floating point * performance may benefit CUDA or OpenGL applications that require high * bandwidth double-precision performance. Disabling this feature may benefit * graphics applications that require higher clock speeds. * * This attribute is only available when toggling double precision boost * can be done immediately (without need for a rebooot). */ #define NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE 395 /* RW-G */ #define NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE_DISABLED 0 #define NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE_ENABLED 1 /* * NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT * Some GPUs can make a tradeoff between double-precision floating-point * performance and clock speed. Enabling double-precision floating point * performance may benefit CUDA or OpenGL applications that require high * bandwidth double-precision performance. Disabling this feature may benefit * graphics applications that require higher clock speeds. * * This attribute is only available when toggling double precision boost * requires a reboot. */ #define NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT 396 /* RW-G */ #define NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT_DISABLED 0 #define NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT_ENALED 1 /* * NV_CTRL_DPY_HDMI_3D - Returns whether the specified display device is * currently using HDMI 3D Frame Packed Stereo mode. Clients may use this * to help interpret the refresh rate returned by NV_CTRL_REFRESH_RATE or * NV_CTRL_REFRESH_RATE_3, which will be doubled when using HDMI 3D mode. * * This attribute may be queried through XNVCTRLQueryTargetAttribute() * using a NV_CTRL_TARGET_TYPE_GPU target. */ #define NV_CTRL_DPY_HDMI_3D 397 /* R-DG */ #define NV_CTRL_DPY_HDMI_3D_DISABLED 0 #define NV_CTRL_DPY_HDMI_3D_ENABLED 1 /* * NV_CTRL_BASE_MOSAIC - Returns whether Base Mosaic is currently enabled on the * given GPU. Querying the valid values of this attribute returns capabilities. */ #define NV_CTRL_BASE_MOSAIC 398 /* R--G */ #define NV_CTRL_BASE_MOSAIC_DISABLED 0 #define NV_CTRL_BASE_MOSAIC_FULL 1 #define NV_CTRL_BASE_MOSAIC_LIMITED 2 /* * NV_CTRL_MULTIGPU_MASTER_POSSIBLE - Returns whether the GPU can be configured * as the master GPU in a Multi GPU configuration (SLI, SLI Mosaic, * Base Mosaic). */ #define NV_CTRL_MULTIGPU_MASTER_POSSIBLE 399 /* R--G */ #define NV_CTRL_MULTIGPU_MASTER_POSSIBLE_FALSE 0 #define NV_CTRL_MULTIGPU_MASTER_POSSIBLE_TRUE 1 /* * NV_CTRL_GPU_POWER_MIZER_DEFAULT_MODE - Returns the default PowerMizer mode * for the given GPU. */ #define NV_CTRL_GPU_POWER_MIZER_DEFAULT_MODE 400 /* R--G */ /* * NV_CTRL_XV_SYNC_TO_DISPLAY_ID - When XVideo Sync To VBlank is enabled, this * controls which display device will be synched to. */ #define NV_CTRL_XV_SYNC_TO_DISPLAY_ID 401 /* RW- */ /* * NV_CTRL_BACKLIGHT_BRIGHTNESS - The backlight brightness of an internal panel. */ #define NV_CTRL_BACKLIGHT_BRIGHTNESS 402 /* RWD- */ /* * NV_CTRL_THERMAL_COOLER_SPEED - Returns cooler's current operating speed in * rotations per minute (RPM). */ #define NV_CTRL_THERMAL_COOLER_SPEED 405 /* R--C */ #define NV_CTRL_LAST_ATTRIBUTE NV_CTRL_THERMAL_COOLER_SPEED /**************************************************************************/ /* * String Attributes: * * String attributes can be queryied through the XNVCTRLQueryStringAttribute() * and XNVCTRLQueryTargetStringAttribute() function calls. * * String attributes can be set through the XNVCTRLSetStringAttribute() * function call. (There are currently no string attributes that can be * set on non-X Screen targets.) * * Unless otherwise noted, all string attributes can be queried/set using an * NV_CTRL_TARGET_TYPE_X_SCREEN target. Attributes that cannot take an * NV_CTRL_TARGET_TYPE_X_SCREEN target also cannot be queried/set through * XNVCTRLQueryStringAttribute()/XNVCTRLSetStringAttribute() (Since * these assume an X Screen target). */ /* * NV_CTRL_STRING_PRODUCT_NAME - the GPU product name on which the * specified X screen is running. * * This attribute may be queried through XNVCTRLQueryTargetStringAttribute() * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. */ #define NV_CTRL_STRING_PRODUCT_NAME 0 /* R--G */ /* * NV_CTRL_STRING_VBIOS_VERSION - the video bios version on the GPU on * which the specified X screen is running. */ #define NV_CTRL_STRING_VBIOS_VERSION 1 /* R--G */ /* * NV_CTRL_STRING_NVIDIA_DRIVER_VERSION - string representation of the * NVIDIA driver version number for the NVIDIA X driver in use. */ #define NV_CTRL_STRING_NVIDIA_DRIVER_VERSION 3 /* R--G */ /* * NV_CTRL_STRING_DISPLAY_DEVICE_NAME - name of the display device * specified in the display_mask argument. * * This attribute may be queried through XNVCTRLQueryTargetStringAttribute() * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. */ #define NV_CTRL_STRING_DISPLAY_DEVICE_NAME 4 /* R-DG */ /* * NV_CTRL_STRING_TV_ENCODER_NAME - name of the TV encoder used by the * specified display device; only valid if the display device is a TV. */ #define NV_CTRL_STRING_TV_ENCODER_NAME 5 /* R-DG */ /* * NV_CTRL_STRING_GVIO_FIRMWARE_VERSION - indicates the version of the * Firmware on the GVIO device. */ #define NV_CTRL_STRING_GVIO_FIRMWARE_VERSION 8 /* R--I */ /* * The following is deprecated; use NV_CTRL_STRING_GVIO_FIRMWARE_VERSION, * instead */ #define NV_CTRL_STRING_GVO_FIRMWARE_VERSION 8 /* R-- */ /* * NV_CTRL_STRING_CURRENT_MODELINE - Return the ModeLine currently * being used by the specified display device. * * This attribute may be queried through XNVCTRLQueryTargetStringAttribute() * using an NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. * * The ModeLine string may be prepended with a comma-separated list of * "token=value" pairs, separated from the ModeLine string by "::". * This "token=value" syntax is the same as that used in * NV_CTRL_BINARY_DATA_MODELINES */ #define NV_CTRL_STRING_CURRENT_MODELINE 9 /* R-DG */ /* * NV_CTRL_STRING_ADD_MODELINE - Adds a ModeLine to the specified * display device. The ModeLine is not added if validation fails. * * The ModeLine string should have the same syntax as a ModeLine in * the X configuration file; e.g., * * "1600x1200" 229.5 1600 1664 1856 2160 1200 1201 1204 1250 +HSync +VSync */ #define NV_CTRL_STRING_ADD_MODELINE 10 /* -WDG */ /* * NV_CTRL_STRING_DELETE_MODELINE - Deletes an existing ModeLine * from the specified display device. The currently selected * ModeLine cannot be deleted. (This also means you cannot delete * the last ModeLine.) * * The ModeLine string should have the same syntax as a ModeLine in * the X configuration file; e.g., * * "1600x1200" 229.5 1600 1664 1856 2160 1200 1201 1204 1250 +HSync +VSync */ #define NV_CTRL_STRING_DELETE_MODELINE 11 /* -WDG */ /* * NV_CTRL_STRING_CURRENT_METAMODE - Returns the metamode currently * being used by the specified X screen. The MetaMode string has the * same syntax as the MetaMode X configuration option, as documented * in the NVIDIA driver README. * * The returned string may be prepended with a comma-separated list of * "token=value" pairs, separated from the MetaMode string by "::". * This "token=value" syntax is the same as that used in * NV_CTRL_BINARY_DATA_METAMODES. */ #define NV_CTRL_STRING_CURRENT_METAMODE 12 /* RW-- */ #define NV_CTRL_STRING_CURRENT_METAMODE_VERSION_1 \ NV_CTRL_STRING_CURRENT_METAMODE /* * NV_CTRL_STRING_ADD_METAMODE - Adds a MetaMode to the specified * X Screen. * * It is recommended to not use this attribute, but instead use * NV_CTRL_STRING_OPERATION_ADD_METAMODE. */ #define NV_CTRL_STRING_ADD_METAMODE 13 /* -W-- */ /* * NV_CTRL_STRING_DELETE_METAMODE - Deletes an existing MetaMode from * the specified X Screen. The currently selected MetaMode cannot be * deleted. (This also means you cannot delete the last MetaMode). * The MetaMode string should have the same syntax as the MetaMode X * configuration option, as documented in the NVIDIA driver README. */ #define NV_CTRL_STRING_DELETE_METAMODE 14 /* -WD-- */ /* * NV_CTRL_STRING_VCSC_PRODUCT_NAME - Querys the product name of the * VCSC device. * * This attribute must be queried through XNVCTRLQueryTargetStringAttribute() * using a NV_CTRL_TARGET_TYPE_VCSC target. */ #define NV_CTRL_STRING_VCSC_PRODUCT_NAME 15 /* R---V */ /* * NV_CTRL_STRING_VCSC_PRODUCT_ID - Querys the product ID of the VCSC device. * * This attribute must be queried through XNVCTRLQueryTargetStringAttribute() * using a NV_CTRL_TARGET_TYPE_VCSC target. */ #define NV_CTRL_STRING_VCSC_PRODUCT_ID 16 /* R---V */ /* * NV_CTRL_STRING_VCSC_SERIAL_NUMBER - Querys the unique serial number * of the VCS device. * * This attribute must be queried through XNVCTRLQueryTargetStringAttribute() * using a NV_CTRL_TARGET_TYPE_VCSC target. */ #define NV_CTRL_STRING_VCSC_SERIAL_NUMBER 17 /* R---V */ /* * NV_CTRL_STRING_VCSC_BUILD_DATE - Querys the date of the VCS device. * the returned string is in the following format: "Week.Year" * * This attribute must be queried through XNVCTRLQueryTargetStringAttribute() * using a NV_CTRL_TARGET_TYPE_VCSC target. */ #define NV_CTRL_STRING_VCSC_BUILD_DATE 18 /* R---V */ /* * NV_CTRL_STRING_VCSC_FIRMWARE_VERSION - Querys the firmware version * of the VCS device. * * This attribute must be queried through XNVCTRLQueryTargetStringAttribute() * using a NV_CTRL_TARGET_TYPE_VCSC target. */ #define NV_CTRL_STRING_VCSC_FIRMWARE_VERSION 19 /* R---V */ /* * NV_CTRL_STRING_VCSC_FIRMWARE_REVISION - Querys the firmware revision * of the VCS device. * * This attribute must be queried through XNVCTRLQueryTargetStringAttribute() * using a NV_CTRL_TARGET_TYPE_VCS target. */ #define NV_CTRL_STRING_VCSC_FIRMWARE_REVISION 20 /* R---V */ /* * NV_CTRL_STRING_VCSC_HARDWARE_VERSION - Querys the hardware version * of the VCS device. * * This attribute must be queried through XNVCTRLQueryTargetStringAttribute() * using a NV_CTRL_TARGET_TYPE_VCSC target. */ #define NV_CTRL_STRING_VCSC_HARDWARE_VERSION 21 /* R---V */ /* * NV_CTRL_STRING_VCSC_HARDWARE_REVISION - Querys the hardware revision * of the VCS device. * * This attribute must be queried through XNVCTRLQueryTargetStringAttribute() * using a NV_CTRL_TARGET_TYPE_VCSC target. */ #define NV_CTRL_STRING_VCSC_HARDWARE_REVISION 22 /* R---V */ /* * NV_CTRL_STRING_MOVE_METAMODE - Moves a MetaMode to the specified * index location. The MetaMode must already exist in the X Screen's * list of MetaModes (as returned by the NV_CTRL_BINARY_DATA_METAMODES * attribute). If the index is larger than the number of MetaModes in * the list, the MetaMode is moved to the end of the list. The * MetaMode string should have the same syntax as the MetaMode X * configuration option, as documented in the NVIDIA driver README. * The MetaMode string must be prepended with a comma-separated list * of "token=value" pairs, separated from the MetaMode string by "::". * Currently, the only valid token is "index", which indicates where * in the MetaMode list the MetaMode should be moved to. * * Other tokens may be added in the future. * * E.g., * "index=5 :: CRT-0: 1024x768 @1024x768 +0+0" */ #define NV_CTRL_STRING_MOVE_METAMODE 23 /* -W-- */ /* * NV_CTRL_STRING_VALID_HORIZ_SYNC_RANGES - returns the valid * horizontal sync ranges used to perform mode validation for the * specified display device. The ranges are in the same format as the * "HorizSync" X config option: * * "horizsync-range may be a comma separated list of either discrete * values or ranges of values. A range of values is two values * separated by a dash." * * The values are in kHz. * * Additionally, the string may be prepended with a comma-separated * list of "token=value" pairs, separated from the HorizSync string by * "::". Valid tokens: * * Token Value * "source" "edid" - HorizSync is from the display device's EDID * "xconfig" - HorizSync is from the "HorizSync" entry in * the Monitor section of the X config file * "option" - HorizSync is from the "HorizSync" NVIDIA X * config option * "builtin" - HorizSync is from NVIDIA X driver builtin * default values * * Additional tokens and/or values may be added in the future. * * Example: "source=edid :: 30.000-62.000" */ #define NV_CTRL_STRING_VALID_HORIZ_SYNC_RANGES 24 /* R-DG */ /* * NV_CTRL_STRING_VALID_VERT_REFRESH_RANGES - returns the valid * vertical refresh ranges used to perform mode validation for the * specified display device. The ranges are in the same format as the * "VertRefresh" X config option: * * "vertrefresh-range may be a comma separated list of either discrete * values or ranges of values. A range of values is two values * separated by a dash." * * The values are in Hz. * * Additionally, the string may be prepended with a comma-separated * list of "token=value" pairs, separated from the VertRefresh string by * "::". Valid tokens: * * Token Value * "source" "edid" - VertRefresh is from the display device's EDID * "xconfig" - VertRefresh is from the "VertRefresh" entry in * the Monitor section of the X config file * "option" - VertRefresh is from the "VertRefresh" NVIDIA X * config option * "builtin" - VertRefresh is from NVIDIA X driver builtin * default values * * Additional tokens and/or values may be added in the future. * * Example: "source=edid :: 50.000-75.000" */ #define NV_CTRL_STRING_VALID_VERT_REFRESH_RANGES 25 /* R-DG */ /* * NV_CTRL_STRING_SCREEN_RECTANGLE - returns the physical X Screen's * initial position and size (in absolute coordinates) within the * desktop as the "token=value" string: "x=#, y=#, width=#, height=#" * * Querying this attribute returns success only when Xinerama is enabled * or the X server ABI is greater than equal to 12. */ #define NV_CTRL_STRING_XINERAMA_SCREEN_INFO 26 /* renamed */ #define NV_CTRL_STRING_SCREEN_RECTANGLE 26 /* R--- */ /* * NV_CTRL_STRING_TWINVIEW_XINERAMA_INFO_ORDER - used to specify the * order that display devices will be returned via Xinerama when * nvidiaXineramaInfo is enabled. Follows the same syntax as the * nvidiaXineramaInfoOrder X config option. */ #define NV_CTRL_STRING_NVIDIA_XINERAMA_INFO_ORDER 27 /* RW-- */ #define NV_CTRL_STRING_TWINVIEW_XINERAMA_INFO_ORDER \ NV_CTRL_STRING_NVIDIA_XINERAMA_INFO_ORDER /* for backwards compatibility: */ /* * NV_CTRL_STRING_SLI_MODE - returns a string describing the current * SLI mode, if any, or FALSE if SLI is not currently enabled. * * This string should be used for informational purposes only, and * should not be used to distinguish between SLI modes, other than to * recognize when SLI is disabled (FALSE is returned) or * enabled (the returned string is non-NULL and describes the current * SLI configuration). */ #define NV_CTRL_STRING_SLI_MODE 28 /* R---*/ /* * NV_CTRL_STRING_PERFORMANCE_MODES - returns a string with all the * performance modes defined for this GPU along with their associated * NV Clock and Memory Clock values. * Not all tokens will be reported on all GPUs, and additional tokens * may be added in the future. * For backwards compatibility we still provide nvclock, memclock, and * processorclock those are the same as nvclockmin, memclockmin and * processorclockmin. * * Each performance modes are returned as a comma-separated list of * "token=value" pairs. Each set of performance mode tokens are separated * by a ";". Valid tokens: * * Token Value * "perf" integer - the Performance level * "nvclock" integer - the GPU clocks (in MHz) for the perf level * "nvclockmin" integer - the GPU clocks min (in MHz) for the perf level * "nvclockmax" integer - the GPU clocks max (in MHz) for the perf level * "memclock" integer - the memory clocks (in MHz) for the perf level * "memclockmin" integer - the memory clocks min (in MHz) for the perf level * "memclockmax" integer - the memory clocks max (in MHz) for the perf level * "memtransferrate" integer - the memory transfer rate (in MHz) * for the perf level * "memtransferratemin" integer - the memory transfer rate min (in MHz) * for the perf level * "memtransferratemax" integer - the memory transfer rate max (in MHz) * for the perf level * "processorclock" integer - the processor clocks (in MHz) * for the perf level * "processorclockmin" integer - the processor clocks min (in MHz) * for the perf level * "processorclockmax" integer - the processor clocks max (in MHz) * for the perf level * * Example: * * perf=0, nvclock=324, nvclockmin=324, nvclockmax=324, memclock=324, * memclockmin=324, memclockmax=324, memtransferrate=648, * memtransferratemin=648,memtransferratemax=648 ; * perf=1, nvclock=324, nvclockmin=324, nvclockmax=640, memclock=810, * memclockmin=810, memclockmax=810, memtransferrate=1620, * memtransferrate=1620, memtransferrate=1620 ; * * This attribute may be queried through XNVCTRLQueryTargetStringAttribute() * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. */ #define NV_CTRL_STRING_PERFORMANCE_MODES 29 /* R--G */ /* * NV_CTRL_STRING_VCSC_FAN_STATUS - returns a string with status of all the * fans in the Visual Computing System, if such a query is supported. Fan * information is reported along with its tachometer reading (in RPM) and a * flag indicating whether the fan has failed or not. * * Valid tokens: * * Token Value * "fan" integer - the Fan index * "speed" integer - the tachometer reading of the fan in rpm * "fail" integer - flag to indicate whether the fan has failed * * Example: * * fan=0, speed=694, fail=0 ; fan=1, speed=693, fail=0 * * This attribute must be queried through XNVCTRLQueryTargetStringAttribute() * using a NV_CTRL_TARGET_TYPE_VCSC target. * */ #define NV_CTRL_STRING_VCSC_FAN_STATUS 30 /* R---V */ /* * NV_CTRL_STRING_VCSC_TEMPERATURES - returns a string with all Temperature * readings in the Visual Computing System, if such a query is supported. * Intake, Exhaust and Board Temperature values are reported in Celcius. * * Valid tokens: * * Token Value * "intake" integer - the intake temperature for the VCS * "exhaust" integer - the exhaust temperature for the VCS * "board" integer - the board temperature of the VCS * * Example: * * intake=29, exhaust=46, board=41 * * This attribute must be queried through XNVCTRLQueryTargetStringAttribute() * using a NV_CTRL_TARGET_TYPE_VCSC target. * */ #define NV_CTRL_STRING_VCSC_TEMPERATURES 31 /* R---V */ /* * NV_CTRL_STRING_VCSC_PSU_INFO - returns a string with all Power Supply Unit * related readings in the Visual Computing System, if such a query is * supported. Current in amperes, Power in watts, Voltage in volts and PSU * state may be reported. Not all PSU types support all of these values, and * therefore some readings may be unknown. * * Valid tokens: * * Token Value * "current" integer - the current drawn in amperes by the VCS * "power" integer - the power drawn in watts by the VCS * "voltage" integer - the voltage reading of the VCS * "state" integer - flag to indicate whether PSU is operating normally * * Example: * * current=10, power=15, voltage=unknown, state=normal * * This attribute must be queried through XNVCTRLQueryTargetStringAttribute() * using a NV_CTRL_TARGET_TYPE_VCSC target. * */ #define NV_CTRL_STRING_VCSC_PSU_INFO 32 /* R---V */ /* * NV_CTRL_STRING_GVIO_VIDEO_FORMAT_NAME - query the name for the specified * NV_CTRL_GVIO_VIDEO_FORMAT_*. So that this can be queried with existing * interfaces, XNVCTRLQueryStringAttribute() should be used, and the video * format specified in the display_mask field; eg: * * XNVCTRLQueryStringAttribute(dpy, * screen, * NV_CTRL_GVIO_VIDEO_FORMAT_720P_60_00_SMPTE296, * NV_CTRL_GVIO_VIDEO_FORMAT_NAME, * &name); */ #define NV_CTRL_STRING_GVIO_VIDEO_FORMAT_NAME 33 /* R--GI */ /* * The following is deprecated; use NV_CTRL_STRING_GVIO_VIDEO_FORMAT_NAME, * instead */ #define NV_CTRL_STRING_GVO_VIDEO_FORMAT_NAME 33 /* R--- */ /* * NV_CTRL_STRING_GPU_CURRENT_CLOCK_FREQS - returns a string with the * associated NV Clock, Memory Clock and Processor Clock values. * * Current valid tokens are "nvclock", "nvclockmin", "nvclockmax", * "memclock", "memclockmin", "memclockmax", "processorclock", * "processorclockmin" and "processorclockmax". * Not all tokens will be reported on all GPUs, and additional tokens * may be added in the future. * * Clock values are returned as a comma-separated list of * "token=value" pairs. * Valid tokens: * * Token Value * "nvclock" integer - the GPU clocks (in MHz) for the perf level * "nvclockmin" integer - the GPU clocks min (in MHz) for the perf level * "nvclockmax" integer - the GPU clocks max (in MHz) for the perf level * "memclock" integer - the memory clocks (in MHz) for the perf level * "memclockmin" integer - the memory clocks min (in MHz) for the perf level * "memclockmax" integer - the memory clocks (max in MHz) for the perf level * "memtransferrate" integer - the memory transfer rate (in MHz) * for the perf level * "memtransferratemin" integer - the memory transfer rate min (in MHz) * for the perf level * "memtransferratemax" integer - the memory transfer rate max (in MHz) * for the perf level * "processorclock" integer - the processor clocks (in MHz) * for the perf level * "processorclockmin" integer - the processor clocks min (in MHz) * for the perf level * "processorclockmax" integer - the processor clocks max (in MHz) * for the perf level * * Example: * * nvclock=324, nvclockmin=324, nvclockmax=324, * memclock=324, memclockmin=324, memclockmax=324, memtrasferrate=628 * * This attribute may be queried through XNVCTRLQueryTargetStringAttribute() * using an NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. */ #define NV_CTRL_STRING_GPU_CURRENT_CLOCK_FREQS 34 /* RW-G */ /* * NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_HARDWARE_REVISION - Returns the * hardware revision of the 3D Vision Pro transceiver. */ #define NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_HARDWARE_REVISION 35 /* R--T */ /* * NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_A - Returns the * firmware version of chip A of the 3D Vision Pro transceiver. */ #define NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_A 36 /* R--T */ /* * NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_A - Returns the * date of the firmware of chip A of the 3D Vision Pro transceiver. */ #define NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_A 37 /* R--T */ /* * NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_B - Returns the * firmware version of chip B of the 3D Vision Pro transceiver. */ #define NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_B 38 /* R--T */ /* * NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_B - Returns the * date of the firmware of chip B of the 3D Vision Pro transceiver. */ #define NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_B 39 /* R--T */ /* * NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_ADDRESS - Returns the RF address * of the 3D Vision Pro transceiver. */ #define NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_ADDRESS 40 /* R--T */ /* * NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_VERSION_A - Returns the * firmware version of chip A of the glasses. * Use the display_mask parameter to specify the glasses id. */ #define NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_VERSION_A 41 /* R--T */ /* * NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_DATE_A - Returns the * date of the firmware of chip A of the glasses. * Use the display_mask parameter to specify the glasses id. */ #define NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_DATE_A 42 /* R--T */ /* * NV_CTRL_STRING_3D_VISION_PRO_GLASSES_ADDRESS - Returns the RF address * of the glasses. * Use the display_mask parameter to specify the glasses id. */ #define NV_CTRL_STRING_3D_VISION_PRO_GLASSES_ADDRESS 43 /* R--T */ /* * NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME - Controls the name the * glasses should use. * Use the display_mask parameter to specify the glasses id. * Glasses' name should start and end with an alpha-numeric character. */ #define NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME 44 /* RW-T */ /* * NV_CTRL_STRING_CURRENT_METAMODE_VERSION_2 - Returns the metamode currently * being used by the specified X screen. The MetaMode string has the same * syntax as the MetaMode X configuration option, as documented in the NVIDIA * driver README. Also, see NV_CTRL_BINARY_DATA_METAMODES_VERSION_2 for more * details on the base syntax. * * The returned string may also be prepended with a comma-separated list of * "token=value" pairs, separated from the MetaMode string by "::". */ #define NV_CTRL_STRING_CURRENT_METAMODE_VERSION_2 45 /* RW-- */ /* * NV_CTRL_STRING_DISPLAY_NAME_TYPE_BASENAME - Returns a type name for the * display device ("CRT", "DFP", or "TV"). However, note that the determination * of the name is based on the protocol through which the X driver communicates * to the display device. E.g., if the driver communicates using VGA ,then the * basename is "CRT"; if the driver communicates using TMDS, LVDS, or DP, then * the name is "DFP". */ #define NV_CTRL_STRING_DISPLAY_NAME_TYPE_BASENAME 46 /* R-D- */ /* * NV_CTRL_STRING_DISPLAY_NAME_TYPE_ID - Returns the type-based name + ID for * the display device, e.g. "CRT-0", "DFP-1", "TV-2". If this device is a * DisplayPort 1.2 device, then this name will also be prepended with the * device's port address like so: "DFP-1.0.1.2.3". See * NV_CTRL_STRING_DISPLAY_NAME_TYPE_BASENAME for more information about the * construction of type-based names. */ #define NV_CTRL_STRING_DISPLAY_NAME_TYPE_ID 47 /* R-D- */ /* * NV_CTRL_STRING_DISPLAY_NAME_DP_GUID - Returns the GUID of the DisplayPort * display device. e.g. "DP-GUID-f16a5bde-79f3-11e1-b2ae-8b5a8969ba9c" * * The display device must be a DisplayPort 1.2 device. */ #define NV_CTRL_STRING_DISPLAY_NAME_DP_GUID 48 /* R-D- */ /* * NV_CTRL_STRING_DISPLAY_NAME_EDID_HASH - Returns the SHA-1 hash of the * display device's EDID in 8-4-4-4-12 UID format. e.g. * "DPY-EDID-f16a5bde-79f3-11e1-b2ae-8b5a8969ba9c" * * The display device must have a valid EDID. */ #define NV_CTRL_STRING_DISPLAY_NAME_EDID_HASH 49 /* R-D- */ /* * NV_CTRL_STRING_DISPLAY_NAME_TARGET_INDEX - Returns the current NV-CONTROL * target ID (name) of the display device. e.g. "DPY-1", "DPY-4" * * This name for the display device is not guarenteed to be the same between * different runs of the X server. */ #define NV_CTRL_STRING_DISPLAY_NAME_TARGET_INDEX 50 /* R-D- */ /* * NV_CTRL_STRING_DISPLAY_NAME_RANDR - Returns the RandR output name for the * display device. e.g. "VGA-1", "DVI-I-0", "DVI-D-3", "LVDS-1", "DP-2", * "HDMI-3", "eDP-6". This name should match If this device is a DisplayPort * 1.2 device, then this name will also be prepended with the device's port * address like so: "DVI-I-3.0.1.2.3" */ #define NV_CTRL_STRING_DISPLAY_NAME_RANDR 51 /* R-D- */ /* * NV_CTRL_STRING_GPU_UUID - Returns the UUID of the given GPU. */ #define NV_CTRL_STRING_GPU_UUID 52 /* R--G */ /* * NV_CTRL_STRING_GPU_UTILIZATION - Returns the current percentage usage * of the various components of the GPU. * * Current valid tokens are "graphics", "memory", "video" and "PCIe". * Not all tokens will be reported on all GPUs, and additional tokens * may be added in the future. * * Utilization values are returned as a comma-separated list of * "token=value" pairs. * Valid tokens: * * Token Value * "graphics" integer - the percentage usage of graphics engine. * "memory" integer - the percentage usage of FB. * "video" integer - the percentage usage of video engine. * "PCIe" integer - the percentage usage of PCIe bandwidth. * * * Example: * * graphics=45, memory=6, video=0, PCIe=0 * * This attribute may be queried through XNVCTRLQueryTargetStringAttribute() * using an NV_CTRL_TARGET_TYPE_GPU. */ #define NV_CTRL_STRING_GPU_UTILIZATION 53 /* R--G */ /* * NV_CTRL_STRING_MULTIGPU_MODE - returns a string describing the current * MULTIGPU mode, if any, or FALSE if MULTIGPU is not currently enabled. */ #define NV_CTRL_STRING_MULTIGPU_MODE 54 /* R--- */ #define NV_CTRL_STRING_LAST_ATTRIBUTE \ NV_CTRL_STRING_MULTIGPU_MODE /**************************************************************************/ /* * Binary Data Attributes: * * Binary data attributes can be queryied through the XNVCTRLQueryBinaryData() * and XNVCTRLQueryTargetBinaryData() function calls. * * There are currently no binary data attributes that can be set. * * Unless otherwise noted, all Binary data attributes can be queried * using an NV_CTRL_TARGET_TYPE_X_SCREEN target. Attributes that cannot take * an NV_CTRL_TARGET_TYPE_X_SCREEN target also cannot be queried through * XNVCTRLQueryBinaryData() (Since an X Screen target is assumed). */ /* * NV_CTRL_BINARY_DATA_EDID - Returns a display device's EDID information * data. * * This attribute may be queried through XNVCTRLQueryTargetBinaryData() * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. */ #define NV_CTRL_BINARY_DATA_EDID 0 /* R-DG */ /* * NV_CTRL_BINARY_DATA_MODELINES - Returns a display device's supported * ModeLines. ModeLines are returned in a buffer, separated by a single * '\0' and terminated by two consecutive '\0' s like so: * * "ModeLine 1\0ModeLine 2\0ModeLine 3\0Last ModeLine\0\0" * * This attribute may be queried through XNVCTRLQueryTargetBinaryData() * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. * * Each ModeLine string may be prepended with a comma-separated list * of "token=value" pairs, separated from the ModeLine string with a * "::". Valid tokens: * * Token Value * "source" "xserver" - the ModeLine is from the core X server * "xconfig" - the ModeLine was specified in the X config file * "builtin" - the NVIDIA driver provided this builtin ModeLine * "vesa" - this is a VESA standard ModeLine * "edid" - the ModeLine was in the display device's EDID * "nv-control" - the ModeLine was specified via NV-CONTROL * * "xconfig-name" - for ModeLines that were specified in the X config * file, this is the name the X config file * gave for the ModeLine. * * Note that a ModeLine can have several sources; the "source" token * can appear multiple times in the "token=value" pairs list. * Additional source values may be specified in the future. * * Additional tokens may be added in the future, so it is recommended * that any token parser processing the returned string from * NV_CTRL_BINARY_DATA_MODELINES be implemented to gracefully ignore * unrecognized tokens. * * E.g., * * "source=xserver, source=vesa, source=edid :: "1024x768_70" 75.0 1024 1048 1184 1328 768 771 777 806 -HSync -VSync" * "source=xconfig, xconfig-name=1600x1200_60.00 :: "1600x1200_60_0" 161.0 1600 1704 1880 2160 1200 1201 1204 1242 -HSync +VSync" */ #define NV_CTRL_BINARY_DATA_MODELINES 1 /* R-DG */ /* * NV_CTRL_BINARY_DATA_METAMODES - Returns an X Screen's supported * MetaModes. MetaModes are returned in a buffer separated by a * single '\0' and terminated by two consecutive '\0' s like so: * * "MetaMode 1\0MetaMode 2\0MetaMode 3\0Last MetaMode\0\0" * * The MetaMode string should have the same syntax as the MetaMode X * configuration option, as documented in the NVIDIA driver README. * Each MetaMode string may be prepended with a comma-separated list * of "token=value" pairs, separated from the MetaMode string with * "::". Currently, valid tokens are: * * Token Value * "id" - the id of this MetaMode; this is stored in * the Vertical Refresh field, as viewed * by the XRandR and XF86VidMode X * * extensions. * * "switchable" "yes"/"no" - whether this MetaMode may be switched to via * ctrl-alt-+/-; Implicit MetaModes (see * the "IncludeImplicitMetaModes" X * config option), for example, are not * normally made available through * ctrl-alt-+/-. * * "source" "xconfig" - the MetaMode was specified in the X * config file. * "implicit" - the MetaMode was implicitly added; see the * "IncludeImplicitMetaModes" X config option * for details. * "nv-control" - the MetaMode was added via the NV-CONTROL X * extension to the currently running X server. * "RandR" - the MetaMode was modified in response to an * RandR RRSetCrtcConfig request. * * Additional tokens may be added in the future, so it is recommended * that any token parser processing the returned string from * NV_CTRL_BINARY_DATA_METAMODES be implemented to gracefully ignore * unrecognized tokens. * * E.g., * * "id=50, switchable=yes, source=xconfig :: CRT-0: 1024x768 @1024x768 +0+0" */ #define NV_CTRL_BINARY_DATA_METAMODES 2 /* R-D- */ #define NV_CTRL_BINARY_DATA_METAMODES_VERSION_1 \ NV_CTRL_BINARY_DATA_METAMODES /* * NV_CTRL_BINARY_DATA_XSCREENS_USING_GPU - Returns the list of X * screens currently driven by the given GPU. * * The format of the returned data is: * * 4 CARD32 number of screens * 4 * n CARD32 screen indices * * This attribute can only be queried through XNVCTRLQueryTargetBinaryData() * using a NV_CTRL_TARGET_TYPE_GPU target. This attribute cannot be * queried using a NV_CTRL_TARGET_TYPE_X_SCREEN. */ #define NV_CTRL_BINARY_DATA_XSCREENS_USING_GPU 3 /* R-DG */ /* * NV_CTRL_BINARY_DATA_GPUS_USED_BY_XSCREEN - Returns the list of GPUs * currently in use by the given X screen. * * The format of the returned data is: * * 4 CARD32 number of GPUs * 4 * n CARD32 GPU indices */ #define NV_CTRL_BINARY_DATA_GPUS_USED_BY_XSCREEN 4 /* R--- */ /* * NV_CTRL_BINARY_DATA_GPUS_USING_FRAMELOCK - Returns the list of * GPUs currently connected to the given frame lock board. * * The format of the returned data is: * * 4 CARD32 number of GPUs * 4 * n CARD32 GPU indices * * This attribute can only be queried through XNVCTRLQueryTargetBinaryData() * using a NV_CTRL_TARGET_TYPE_FRAMELOCK target. This attribute cannot be * queried using a NV_CTRL_TARGET_TYPE_X_SCREEN. */ #define NV_CTRL_BINARY_DATA_GPUS_USING_FRAMELOCK 5 /* R-DF */ /* * NV_CTRL_BINARY_DATA_DISPLAY_VIEWPORT - Returns the Display Device's * viewport box into the given X Screen (in X Screen coordinates.) * * The format of the returned data is: * * 4 CARD32 Offset X * 4 CARD32 Offset Y * 4 CARD32 Width * 4 CARD32 Height */ #define NV_CTRL_BINARY_DATA_DISPLAY_VIEWPORT 6 /* R-DG */ /* * NV_CTRL_BINARY_DATA_FRAMELOCKS_USED_BY_GPU - Returns the list of * Framelock devices currently connected to the given GPU. * * The format of the returned data is: * * 4 CARD32 number of Framelocks * 4 * n CARD32 Framelock indices * * This attribute can only be queried through XNVCTRLQueryTargetBinaryData() * using a NV_CTRL_TARGET_TYPE_GPU target. This attribute cannot be * queried using a NV_CTRL_TARGET_TYPE_X_SCREEN. */ #define NV_CTRL_BINARY_DATA_FRAMELOCKS_USED_BY_GPU 7 /* R-DG */ /* * NV_CTRL_BINARY_DATA_GPUS_USING_VCSC - Returns the list of * GPU devices connected to the given VCS. * * The format of the returned data is: * * 4 CARD32 number of GPUs * 4 * n CARD32 GPU indices * * This attribute can only be queried through XNVCTRLQueryTargetBinaryData() * using a NV_CTRL_TARGET_TYPE_VCSC target. This attribute cannot be * queried using a NV_CTRL_TARGET_TYPE_X_SCREEN and cannot be queried using * a NV_CTRL_TARGET_TYPE_X_GPU */ #define NV_CTRL_BINARY_DATA_GPUS_USING_VCSC 8 /* R-DV */ /* * NV_CTRL_BINARY_DATA_VCSCS_USED_BY_GPU - Returns the VCSC device * that is controlling the given GPU. * * The format of the returned data is: * * 4 CARD32 number of VCS (always 1) * 4 * n CARD32 VCS indices * * This attribute can only be queried through XNVCTRLQueryTargetBinaryData() * using a NV_CTRL_TARGET_TYPE_GPU target. This attribute cannot be * queried using a NV_CTRL_TARGET_TYPE_X_SCREEN */ #define NV_CTRL_BINARY_DATA_VCSCS_USED_BY_GPU 9 /* R-DG */ /* * NV_CTRL_BINARY_DATA_COOLERS_USED_BY_GPU - Returns the coolers that * are cooling the given GPU. * * The format of the returned data is: * * 4 CARD32 number of COOLER * 4 * n CARD32 COOLER indices * * This attribute can only be queried through XNVCTRLQueryTargetBinaryData() * using a NV_CTRL_TARGET_TYPE_GPU target. This attribute cannot be * queried using a NV_CTRL_TARGET_TYPE_X_SCREEN */ #define NV_CTRL_BINARY_DATA_COOLERS_USED_BY_GPU 10 /* R-DG */ /* * NV_CTRL_BINARY_DATA_GPUS_USED_BY_LOGICAL_XSCREEN - Returns the list of * GPUs currently driving the given X screen. If Xinerama is enabled, this * will return all GPUs that are driving any X screen. * * The format of the returned data is: * * 4 CARD32 number of GPUs * 4 * n CARD32 GPU indices */ #define NV_CTRL_BINARY_DATA_GPUS_USED_BY_LOGICAL_XSCREEN 11 /* R--- */ /* * NV_CTRL_BINARY_DATA_THERMAL_SENSORS_USED_BY_GPU - Returns the sensors that * are attached to the given GPU. * * The format of the returned data is: * * 4 CARD32 number of SENSOR * 4 * n CARD32 SENSOR indices * * This attribute can only be queried through XNVCTRLQueryTargetBinaryData() * using a NV_CTRL_TARGET_TYPE_GPU target. This attribute cannot be * queried using a NV_CTRL_TARGET_TYPE_X_SCREEN */ #define NV_CTRL_BINARY_DATA_THERMAL_SENSORS_USED_BY_GPU 12 /* R--G */ /* * NV_CTRL_BINARY_DATA_GLASSES_PAIRED_TO_3D_VISION_PRO_TRANSCEIVER - Returns * the id of the glasses that are currently paired to the given * 3D Vision Pro transceiver. * * The format of the returned data is: * * 4 CARD32 number of glasses * 4 * n CARD32 id of glasses * * This attribute can only be queried through XNVCTRLQueryTargetBinaryData() * using a NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER target. */ #define NV_CTRL_BINARY_DATA_GLASSES_PAIRED_TO_3D_VISION_PRO_TRANSCEIVER 13 /* R--T */ /* * NV_CTRL_BINARY_DATA_DISPLAY_TARGETS - Returns all the display devices * currently connected to any GPU on the X server. * * The format of the returned data is: * * 4 CARD32 number of display devices * 4 * n CARD32 display device indices * * This attribute can only be queried through XNVCTRLQueryTargetBinaryData(). */ #define NV_CTRL_BINARY_DATA_DISPLAY_TARGETS 14 /* R--- */ /* * NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU - Returns the list of * display devices that are connected to the GPU target. * * The format of the returned data is: * * 4 CARD32 number of display devices * 4 * n CARD32 display device indices * * This attribute can only be queried through XNVCTRLQueryTargetBinaryData() * using a NV_CTRL_TARGET_TYPE_GPU target. */ #define NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU 15 /* R--G */ /* * NV_CTRL_BINARY_DATA_METAMODES_VERSION_2 - Returns values similar to * NV_CTRL_BINARY_DATA_METAMODES(_VERSION_1) but also returns extended syntax * information to indicate a specific display device, as well as other per- * display deviceflags as "token=value" pairs. For example: * * "DPY-1: 1280x1024 {Stereo=PassiveLeft}, * DPY-2: 1280x1024 {Stereo=PassiveRight}," * * The display device names have the form "DPY-%d", where the integer * part of the name is the NV-CONTROL target ID for that display device * for this instance of the X server. Note that display device NV-CONTROL * target IDs are not guaranteed to be the same from one run of the X * server to the next. */ #define NV_CTRL_BINARY_DATA_METAMODES_VERSION_2 16 /* R-D- */ /* * NV_CTRL_BINARY_DATA_DISPLAYS_ENABLED_ON_XSCREEN - Returns the list of * display devices that are currently scanning out the X screen target. * * The format of the returned data is: * * 4 CARD32 number of display devices * 4 * n CARD32 display device indices * * This attribute can only be queried through XNVCTRLQueryTargetBinaryData() * using a NV_CTRL_TARGET_TYPE_X_SCREEN target. */ #define NV_CTRL_BINARY_DATA_DISPLAYS_ENABLED_ON_XSCREEN 17 /* R--- */ /* * NV_CTRL_BINARY_DATA_DISPLAYS_ASSIGNED_TO_XSCREEN - Returns the list of * display devices that are currently assigned the X screen target. * * The format of the returned data is: * * 4 CARD32 number of display devices * 4 * n CARD32 display device indices * * This attribute can only be queried through XNVCTRLQueryTargetBinaryData() * using a NV_CTRL_TARGET_TYPE_X_SCREEN target. */ #define NV_CTRL_BINARY_DATA_DISPLAYS_ASSIGNED_TO_XSCREEN 18 /* R--- */ /* * NV_CTRL_BINARY_DATA_GPU_FLAGS - Returns a list of flags for the * given GPU. A flag can, for instance, be a capability which enables * of disables some features according to the GPU state. * * The format of the returned data is: * * 4 CARD32 number of GPU flags * 4 * n CARD32 GPU flag * * This attribute can only be queried through XNVCTRLQueryTargetBinaryData() * using a NV_CTRL_TARGET_TYPE_GPU target. */ #define NV_CTRL_BINARY_DATA_GPU_FLAGS 19 /* R--- */ /* Stereo and display composition transformations are mutually exclusive. */ #define NV_CTRL_BINARY_DATA_GPU_FLAGS_STEREO_DISPLAY_TRANSFORM_EXCLUSIVE 0 /* Overlay and display composition transformations are mutually exclusive. */ #define NV_CTRL_BINARY_DATA_GPU_FLAGS_OVERLAY_DISPLAY_TRANSFORM_EXCLUSIVE 1 /* Depth 8 and display composition transformations are mutually exclusive. */ #define NV_CTRL_BINARY_DATA_GPU_FLAGS_DEPTH_8_DISPLAY_TRANSFORM_EXCLUSIVE 2 #define NV_CTRL_BINARY_DATA_LAST_ATTRIBUTE NV_CTRL_BINARY_DATA_GPU_FLAGS /**************************************************************************/ /* * String Operation Attributes: * * These attributes are used with the XNVCTRLStringOperation() * function; a string is specified as input, and a string is returned * as output. * * Unless otherwise noted, all attributes can be operated upon using * an NV_CTRL_TARGET_TYPE_X_SCREEN target. */ /* * NV_CTRL_STRING_OPERATION_ADD_METAMODE - provide a MetaMode string * as input, and returns a string containing comma-separated list of * "token=value" pairs as output. Currently, the only output token is * "id", which indicates the id that was assigned to the MetaMode. * * All ModeLines referenced in the MetaMode must already exist for * each display device (as returned by the * NV_CTRL_BINARY_DATA_MODELINES attribute). * * The MetaMode string should have the same syntax as the MetaMode X * configuration option, as documented in the NVIDIA driver README. * * The input string can optionally be prepended with a string of * comma-separated "token=value" pairs, separated from the MetaMode * string by "::". Currently, the only valid token is "index" which * indicates the insertion index for the MetaMode. * * E.g., * * Input: "index=5 :: 1600x1200+0+0, 1600x1200+1600+0" * Output: "id=58" * * which causes the MetaMode to be inserted at position 5 in the * MetaMode list (all entries after 5 will be shifted down one slot in * the list), and the X server's containing mode stores 58 as the * VRefresh, so that the MetaMode can be uniquely identifed through * XRandR and XF86VidMode. */ #define NV_CTRL_STRING_OPERATION_ADD_METAMODE 0 /* * NV_CTRL_STRING_OPERATION_GTF_MODELINE - provide as input a string * of comma-separated "token=value" pairs, and returns a ModeLine * string, computed using the GTF formula using the parameters from * the input string. Valid tokens for the input string are "width", * "height", and "refreshrate". * * E.g., * * Input: "width=1600, height=1200, refreshrate=60" * Output: "160.96 1600 1704 1880 2160 1200 1201 1204 1242 -HSync +VSync" * * This operation does not have any impact on any display device's * modePool, and the ModeLine is not validated; it is simply intended * for generating ModeLines. */ #define NV_CTRL_STRING_OPERATION_GTF_MODELINE 1 /* * NV_CTRL_STRING_OPERATION_CVT_MODELINE - provide as input a string * of comma-separated "token=value" pairs, and returns a ModeLine * string, computed using the CVT formula using the parameters from * the input string. Valid tokens for the input string are "width", * "height", "refreshrate", and "reduced-blanking". The * "reduced-blanking" argument can be "0" or "1", to enable or disable * use of reduced blanking for the CVT formula. * * E.g., * * Input: "width=1600, height=1200, refreshrate=60, reduced-blanking=1" * Output: "130.25 1600 1648 1680 1760 1200 1203 1207 1235 +HSync -VSync" * * This operation does not have any impact on any display device's * modePool, and the ModeLine is not validated; it is simply intended * for generating ModeLines. */ #define NV_CTRL_STRING_OPERATION_CVT_MODELINE 2 /* * NV_CTRL_STRING_OPERATION_BUILD_MODEPOOL - build a ModePool for the * specified display device on the specified target (either an X * screen or a GPU). This is typically used to generate a ModePool * for a display device on a GPU on which no X screens are present. * * Currently, a display device's ModePool is static for the life of * the X server, so XNVCTRLStringOperation will return FALSE if * requested to build a ModePool on a display device that already has * a ModePool. * * The string input to BUILD_MODEPOOL may be NULL. If it is not NULL, * then it is interpreted as a double-colon ("::") separated list * of "option=value" pairs, where the options and the syntax of their * values are the X configuration options that impact the behavior of * modePool construction; namely: * * "ModeValidation" * "HorizSync" * "VertRefresh" * "FlatPanelProperties" * "TVStandard" * "ExactModeTimingsDVI" * "UseEdidFreqs" * * An example input string might look like: * * "ModeValidation=NoVesaModes :: HorizSync=50-110 :: VertRefresh=50-150" * * This request currently does not return a string. */ #define NV_CTRL_STRING_OPERATION_BUILD_MODEPOOL 3 /* DG */ /* * NV_CTRL_STRING_OPERATION_GVI_CONFIGURE_STREAMS - Configure the streams- * to-jack+channel topology for a GVI (Graphics capture board). * * The string input to GVI_CONFIGURE_STREAMS may be NULL. If this is the * case, then the current topology is returned. * * If the input string to GVI_CONFIGURE_STREAMS is not NULL, the string * is interpreted as a semicolon (";") separated list of comma-separated * lists of "option=value" pairs that define a stream's composition. The * available options and their values are: * * "stream": Defines which stream this comma-separated list describes. * Valid values are the integers between 0 and * NV_CTRL_GVI_NUM_STREAMS-1 (inclusive). * * "linkN": Defines a jack+channel pair to use for the given link N. * Valid options are the string "linkN", where N is an integer * between 0 and NV_CTRL_GVI_MAX_LINKS_PER_STREAM-1 (inclusive). * Valid values for these options are strings of the form * "jackX" and/or "jackX.Y", where X is an integer between 0 and * NV_CTRL_GVI_NUM_JACKS-1 (inclusive), and Y (optional) is an * integer between 0 and NV_CTRL_GVI_MAX_CHANNELS_PER_JACK-1 * (inclusive). * * An example input string might look like: * * "stream=0, link0=jack0, link1=jack1; stream=1, link0=jack2.1" * * This example specifies two streams, stream 0 and stream 1. Stream 0 * is defined to capture link0 data from the first channel (channel 0) of * BNC jack 0 and link1 data from the first channel of BNC jack 1. The * second stream (Stream 1) is defined to capture link0 data from channel 1 * (second channel) of BNC jack 2. * * This example shows a possible configuration for capturing 3G input: * * "stream=0, link0=jack0.0, link1=jack0.1" * * Applications should query the following attributes to determine * possible combinations: * * NV_CTRL_GVI_MAX_STREAMS * NV_CTRL_GVI_MAX_LINKS_PER_STREAM * NV_CTRL_GVI_NUM_JACKS * NV_CTRL_GVI_MAX_CHANNELS_PER_JACK * * Note: A jack+channel pair can only be tied to one link/stream. * * Upon successful configuration or querying of this attribute, a string * representing the current topology for all known streams on the device * will be returned. On failure, NULL is returned. * * Note: Setting this attribute may also result in the following * NV-CONTROL attributes being reset on the GVI device (to ensure * the configuration remains valid): * NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT * NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT * NV_CTRL_GVI_REQUESTED_STREAM_COMPONENT_SAMPLING */ #define NV_CTRL_STRING_OPERATION_GVI_CONFIGURE_STREAMS 4 /* RW-I */ /* * NV_CTRL_STRING_OPERATION_PARSE_METAMODE - Parses the given MetaMode string * and returns the validated MetaMode string - possibly re-calculating various * values such as ViewPortIn. If the MetaMode matches an existing MetaMode, * the details of the existing MetaMode are returned. If the MetaMode fails to * be parsed, NULL is returned. */ #define NV_CTRL_STRING_OPERATION_PARSE_METAMODE 5 /* R--- */ #define NV_CTRL_STRING_OPERATION_LAST_ATTRIBUTE \ NV_CTRL_STRING_OPERATION_PARSE_METAMODE /**************************************************************************/ /* * CTRLAttributeValidValuesRec - * * structure and related defines used by * XNVCTRLQueryValidAttributeValues() to describe the valid values of * a particular attribute. The type field will be one of: * * ATTRIBUTE_TYPE_INTEGER : the attribute is an integer value; there * is no fixed range of valid values. * * ATTRIBUTE_TYPE_BITMASK : the attribute is an integer value, * interpretted as a bitmask. * * ATTRIBUTE_TYPE_BOOL : the attribute is a boolean, valid values are * either 1 (on/true) or 0 (off/false). * * ATTRIBUTE_TYPE_RANGE : the attribute can have any integer value * between NVCTRLAttributeValidValues.u.range.min and * NVCTRLAttributeValidValues.u.range.max (inclusive). * * ATTRIBUTE_TYPE_INT_BITS : the attribute can only have certain * integer values, indicated by which bits in * NVCTRLAttributeValidValues.u.bits.ints are on (for example: if bit * 0 is on, then 0 is a valid value; if bit 5 is on, then 5 is a valid * value, etc). This is useful for attributes like NV_CTRL_FSAA_MODE, * which can only have certain values, depending on GPU. * * ATTRIBUTE_TYPE_64BIT_INTEGER : the attribute is a 64 bit integer value; * there is no fixed range of valid values. * * ATTRIBUTE_TYPE_STRING : the attribute is a string value; there is no fixed * range of valid values. * * ATTRIBUTE_TYPE_BINARY_DATA : the attribute is binary data; there is * no fixed range of valid values. * * ATTRIBUTE_TYPE_STRING_OPERATION : the attribute is a string; there is * no fixed range of valid values. * * * The permissions field of NVCTRLAttributeValidValuesRec is a bitmask * that may contain: * * ATTRIBUTE_TYPE_READ - Attribute may be read (queried.) * ATTRIBUTE_TYPE_WRITE - Attribute may be written to (set.) * ATTRIBUTE_TYPE_DISPLAY - Attribute is valid for display target types * (requires a display_mask if queried via * a GPU or X screen.) * ATTRIBUTE_TYPE_GPU - Attribute is valid for GPU target types. * ATTRIBUTE_TYPE_FRAMELOCK - Attribute is valid for Frame Lock target types. * ATTRIBUTE_TYPE_X_SCREEN - Attribute is valid for X Screen target types. * ATTRIBUTE_TYPE_XINERAMA - Attribute will be made consistent for all * X Screens when the Xinerama extension is enabled. * ATTRIBUTE_TYPE_VCSC - Attribute is valid for Visual Computing System * target types. * ATTRIBUTE_TYPE_GVI - Attribute is valid for Graphics Video In target * types. * ATTRIBUTE_TYPE_COOLER - Attribute is valid for Cooler target types. * ATTRIBUTE_TYPE_3D_VISION_PRO_TRANSCEIVER - Attribute is valid for 3D Vision * Pro Transceiver target types. * * See 'Key to Integer Attribute "Permissions"' at the top of this * file for a description of what these permission bits mean. */ #define ATTRIBUTE_TYPE_UNKNOWN 0 #define ATTRIBUTE_TYPE_INTEGER 1 #define ATTRIBUTE_TYPE_BITMASK 2 #define ATTRIBUTE_TYPE_BOOL 3 #define ATTRIBUTE_TYPE_RANGE 4 #define ATTRIBUTE_TYPE_INT_BITS 5 #define ATTRIBUTE_TYPE_64BIT_INTEGER 6 #define ATTRIBUTE_TYPE_STRING 7 #define ATTRIBUTE_TYPE_BINARY_DATA 8 #define ATTRIBUTE_TYPE_STRING_OPERATION 9 #define ATTRIBUTE_TYPE_READ 0x001 #define ATTRIBUTE_TYPE_WRITE 0x002 #define ATTRIBUTE_TYPE_DISPLAY 0x004 #define ATTRIBUTE_TYPE_GPU 0x008 #define ATTRIBUTE_TYPE_FRAMELOCK 0x010 #define ATTRIBUTE_TYPE_X_SCREEN 0x020 #define ATTRIBUTE_TYPE_XINERAMA 0x040 #define ATTRIBUTE_TYPE_VCSC 0x080 #define ATTRIBUTE_TYPE_GVI 0x100 #define ATTRIBUTE_TYPE_COOLER 0x200 #define ATTRIBUTE_TYPE_THERMAL_SENSOR 0x400 #define ATTRIBUTE_TYPE_3D_VISION_PRO_TRANSCEIVER 0x800 #define ATTRIBUTE_TYPE_ALL_TARGETS \ ((ATTRIBUTE_TYPE_DISPLAY) | \ (ATTRIBUTE_TYPE_GPU) | \ (ATTRIBUTE_TYPE_FRAMELOCK) | \ (ATTRIBUTE_TYPE_X_SCREEN) | \ (ATTRIBUTE_TYPE_VCSC) | \ (ATTRIBUTE_TYPE_GVI) | \ (ATTRIBUTE_TYPE_COOLER) | \ (ATTRIBUTE_TYPE_THERMAL_SENSOR) | \ (ATTRIBUTE_TYPE_3D_VISION_PRO_TRANSCEIVER)) typedef struct _NVCTRLAttributeValidValues { int type; union { struct { int64_t min; int64_t max; } range; struct { unsigned int ints; } bits; } u; unsigned int permissions; } NVCTRLAttributeValidValuesRec; typedef struct _NVCTRLAttributePermissions { int type; unsigned int permissions; } NVCTRLAttributePermissionsRec; /**************************************************************************/ /* * NV-CONTROL X event notification. * * To receive X event notifications dealing with NV-CONTROL, you should * call XNVCtrlSelectNotify() with one of the following set as the type * of event to receive (see NVCtrlLib.h for more information): */ #define ATTRIBUTE_CHANGED_EVENT 0 #define TARGET_ATTRIBUTE_CHANGED_EVENT 1 #define TARGET_ATTRIBUTE_AVAILABILITY_CHANGED_EVENT 2 #define TARGET_STRING_ATTRIBUTE_CHANGED_EVENT 3 #define TARGET_BINARY_ATTRIBUTE_CHANGED_EVENT 4 /* * To be used with XNVCTRLBindWarpPixmapName to specify the data type. */ #define NV_CTRL_WARP_DATA_TYPE_BLEND_OR_OFFSET_TEXTURE 0 #define NV_CTRL_WARP_DATA_TYPE_MESH_TRIANGLESTRIP_XYUVRQ 1 #define NV_CTRL_WARP_DATA_TYPE_MESH_TRIANGLES_XYUVRQ 2 #endif /* __NVCTRL_H */ nvidia-settings/src/libXNVCtrl/Makefile0000664000175000017500000000247112236467170020264 0ustar albertoalberto# Copyright (c) 2008 NVIDIA, Corporation # # 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 (including the next # paragraph) 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. RANLIB ?= ranlib CFLAGS += -fPIC libXNVCtrl.a : libXNVCtrl.a(NVCtrl.o) $(RANLIB) $@ NVCtrl.o : NVCtrl.h nv_control.h NVCtrlLib.h .INTERMEDIATE: NVCtrl.o clean :: rm -f libXNVCtrl.a *.o .PHONY: clean nvidia-settings/src/libXNVCtrl/nv_control.h0000664000175000017500000004341312236467170021161 0ustar albertoalberto/* * Copyright (c) 2008 NVIDIA, Corporation * * 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 (including the next * paragraph) 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. * * * NV-CONTROL Protocol Version History * * 1.0 - 1.5 NVIDIA Internal development versions * 1.6 Initial public version * 1.7 Added QueryBinaryData request * 1.8 Added TargetTypes * 1.9 Added QueryTargetCount request * 1.10 Fixed target type/id byte ordering for compatibility with * pre-1.8 NV-CONTROL clients * 1.11 NVIDIA Internal development version * 1.12 Added StringOperation request * 1.13 NVIDIA Internal development version * 1.14 Fixed an NV_CTRL_BINARY_DATA_MODELINES double scan modeline * reporting bug (vsyncstart, vsyncend, and vtotal were incorrectly * doubled) * 1.15 Added AVAILABILITY_TARGET_ATTRIBUTE_CHANGED_EVENT * 1.16 Added TARGET_STRING_ATTRIBUTE_CHANGED_EVENT * 1.17 Added TARGET_BINARY_ATTRIBUTE_CHANGED_EVENT * 1.18 Updated QueryTargetCount to return a count of 0, rather than * BadMatch, if an unknown TargetType is specified * 1.19 Added TargetType support for SetAttributeAndGetStatus and * SetStringAttribute requests * 1.20 Added COOLER TargetType * 1.21 Added initial 64-bit integer attribute support (read-only) * 1.22 Added X_nvCtrlQueryValidStringAttributeValues to check * string attribute permissions. * 1.23 Added SENSOR TargetType * 1.24 Fixed a bug where SLI_MOSAIC_MODE_AVAILABLE attribute would * report false positives via the GPU and X screen target types * 1.25 Added 3D_VISION_PRO_TRANSCEIVER TargetType * 1.26 Added XNVCTRLQueryXXXAttributePermissions. * 1.27 Added DISPLAY TargetType * 1.28 Added NV_CTRL_CURRENT_METAMODE_ID: clients should use this * attribute to switch MetaModes, rather than pass the MetaMode ID * through the RRSetScreenConfig protocol request. */ #ifndef __NVCONTROL_H #define __NVCONTROL_H #define NV_CONTROL_ERRORS 0 #define NV_CONTROL_EVENTS 5 #define NV_CONTROL_NAME "NV-CONTROL" #define NV_CONTROL_MAJOR 1 #define NV_CONTROL_MINOR 29 #define X_nvCtrlQueryExtension 0 #define X_nvCtrlIsNv 1 #define X_nvCtrlQueryAttribute 2 #define X_nvCtrlSetAttribute 3 #define X_nvCtrlQueryStringAttribute 4 #define X_nvCtrlQueryValidAttributeValues 5 #define X_nvCtrlSelectNotify 6 #define X_nvCtrlSetGvoColorConversionDeprecated 7 #define X_nvCtrlQueryGvoColorConversionDeprecated 8 #define X_nvCtrlSetStringAttribute 9 /* STUB X_nvCtrlQueryDDCCILutSize 10 */ /* STUB X_nvCtrlQueryDDCCISinglePointLutOperation 11 */ /* STUB X_nvCtrlSetDDCCISinglePointLutOperation 12 */ /* STUB X_nvCtrlQueryDDCCIBlockLutOperation 13 */ /* STUB X_nvCtrlSetDDCCIBlockLutOperation 14 */ /* STUB X_nvCtrlSetDDCCIRemoteProcedureCall 15 */ /* STUB X_nvCtrlQueryDDCCIDisplayControllerType 16 */ /* STUB X_nvCtrlQueryDDCCICapabilities 17 */ /* STUB X_nvCtrlQueryDDCCITimingReport 18 */ #define X_nvCtrlSetAttributeAndGetStatus 19 #define X_nvCtrlQueryBinaryData 20 #define X_nvCtrlSetGvoColorConversion 21 #define X_nvCtrlQueryGvoColorConversion 22 #define X_nvCtrlSelectTargetNotify 23 #define X_nvCtrlQueryTargetCount 24 #define X_nvCtrlStringOperation 25 #define X_nvCtrlQueryValidAttributeValues64 26 #define X_nvCtrlQueryAttribute64 27 #define X_nvCtrlQueryValidStringAttributeValues 28 #define X_nvCtrlQueryAttributePermissions 29 #define X_nvCtrlQueryStringAttributePermissions 30 #define X_nvCtrlQueryBinaryDataAttributePermissions 31 #define X_nvCtrlQueryStringOperationAttributePermissions 32 #define X_nvCtrlBindWarpPixmapName 33 #define X_nvCtrlLastRequest (X_nvCtrlBindWarpPixmapName + 1) /* Define 32 bit floats */ typedef float FLOAT32; #ifndef F32 #define F32 #endif typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; } xnvCtrlQueryExtensionReq; #define sz_xnvCtrlQueryExtensionReq 4 typedef struct { BYTE type; /* X_Reply */ CARD8 padb1; CARD16 sequenceNumber B16; CARD32 length B32; CARD16 major B16; CARD16 minor B16; CARD32 padl4 B32; CARD32 padl5 B32; CARD32 padl6 B32; CARD32 padl7 B32; CARD32 padl8 B32; } xnvCtrlQueryExtensionReply; #define sz_xnvCtrlQueryExtensionReply 32 typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD32 screen B32; } xnvCtrlIsNvReq; #define sz_xnvCtrlIsNvReq 8 typedef struct { BYTE type; /* X_Reply */ CARD8 padb1; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 isnv B32; CARD32 padl4 B32; CARD32 padl5 B32; CARD32 padl6 B32; CARD32 padl7 B32; CARD32 padl8 B32; } xnvCtrlIsNvReply; #define sz_xnvCtrlIsNvReply 32 typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD32 target_type B32; } xnvCtrlQueryTargetCountReq; #define sz_xnvCtrlQueryTargetCountReq 8 typedef struct { BYTE type; /* X_Reply */ CARD8 padb1; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 count B32; CARD32 padl4 B32; CARD32 padl5 B32; CARD32 padl6 B32; CARD32 padl7 B32; CARD32 padl8 B32; } xnvCtrlQueryTargetCountReply; #define sz_xnvCtrlQueryTargetCountReply 32 typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD16 target_id B16; /* X screen number or GPU number */ CARD16 target_type B16; /* X screen or GPU */ CARD32 display_mask B32; CARD32 attribute B32; } xnvCtrlQueryAttributeReq; #define sz_xnvCtrlQueryAttributeReq 16 typedef struct { BYTE type; BYTE pad0; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 flags B32; INT32 value B32; CARD32 pad4 B32; CARD32 pad5 B32; CARD32 pad6 B32; CARD32 pad7 B32; } xnvCtrlQueryAttributeReply; #define sz_xnvCtrlQueryAttributeReply 32 typedef struct { BYTE type; BYTE pad0; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 flags B32; CARD32 pad3 B32; int64_t value_64; CARD32 pad6 B32; CARD32 pad7 B32; } xnvCtrlQueryAttribute64Reply; #define sz_xnvCtrlQueryAttribute64Reply 32 typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD16 target_id B16; CARD16 target_type B16; CARD32 display_mask B32; CARD32 attribute B32; INT32 value B32; } xnvCtrlSetAttributeReq; #define sz_xnvCtrlSetAttributeReq 20 typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD16 target_id B16; CARD16 target_type B16; CARD32 display_mask B32; CARD32 attribute B32; INT32 value B32; } xnvCtrlSetAttributeAndGetStatusReq; #define sz_xnvCtrlSetAttributeAndGetStatusReq 20 typedef struct { BYTE type; BYTE pad0; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 flags B32; CARD32 pad3 B32; CARD32 pad4 B32; CARD32 pad5 B32; CARD32 pad6 B32; CARD32 pad7 B32; } xnvCtrlSetAttributeAndGetStatusReply; #define sz_xnvCtrlSetAttributeAndGetStatusReply 32 typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD16 target_id B16; /* X screen number or GPU number */ CARD16 target_type B16; /* X screen or GPU */ CARD32 display_mask B32; CARD32 attribute B32; } xnvCtrlQueryStringAttributeReq; #define sz_xnvCtrlQueryStringAttributeReq 16 typedef struct { BYTE type; BYTE pad0; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 flags B32; CARD32 n B32; /* Length of string */ CARD32 pad4 B32; CARD32 pad5 B32; CARD32 pad6 B32; CARD32 pad7 B32; } xnvCtrlQueryStringAttributeReply; #define sz_xnvCtrlQueryStringAttributeReply 32 typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD16 target_id B16; CARD16 target_type B16; CARD32 display_mask B32; CARD32 attribute B32; CARD32 num_bytes B32; } xnvCtrlSetStringAttributeReq; #define sz_xnvCtrlSetStringAttributeReq 20 typedef struct { BYTE type; BYTE pad0; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 flags B32; CARD32 pad3 B32; CARD32 pad4 B32; CARD32 pad5 B32; CARD32 pad6 B32; CARD32 pad7 B32; } xnvCtrlSetStringAttributeReply; #define sz_xnvCtrlSetStringAttributeReply 32 typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD16 target_id B16; /* X screen number or GPU number */ CARD16 target_type B16; /* X screen or GPU */ CARD32 display_mask B32; CARD32 attribute B32; } xnvCtrlQueryValidAttributeValuesReq; #define sz_xnvCtrlQueryValidAttributeValuesReq 16 typedef struct { BYTE type; BYTE pad0; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 flags B32; INT32 attr_type B32; INT32 min B32; INT32 max B32; CARD32 bits B32; CARD32 perms B32; } xnvCtrlQueryValidAttributeValuesReply; #define sz_xnvCtrlQueryValidAttributeValuesReply 32 typedef struct { BYTE type; BYTE pad0; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 flags B32; INT32 attr_type B32; int64_t min_64; int64_t max_64; CARD64 bits_64; CARD32 perms B32; CARD32 pad1 B32; } xnvCtrlQueryValidAttributeValues64Reply; #define sz_xnvCtrlQueryValidAttributeValues64Reply 48 #define sz_xnvCtrlQueryValidAttributeValues64Reply_extra ((48 - 32) >> 2) typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD32 attribute B32; } xnvCtrlQueryAttributePermissionsReq; #define sz_xnvCtrlQueryAttributePermissionsReq 8 typedef struct { BYTE type; BYTE pad0; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 flags B32; INT32 attr_type B32; CARD32 perms B32; CARD32 pad5 B32; CARD32 pad6 B32; CARD32 pad7 B32; CARD32 pad8 B32; } xnvCtrlQueryAttributePermissionsReply; #define sz_xnvCtrlQueryAttributePermissionsReply 32 /* Set GVO Color Conversion request (deprecated) */ typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD32 screen B32; FLOAT32 row1_col1 F32; FLOAT32 row1_col2 F32; FLOAT32 row1_col3 F32; FLOAT32 row1_col4 F32; FLOAT32 row2_col1 F32; FLOAT32 row2_col2 F32; FLOAT32 row2_col3 F32; FLOAT32 row2_col4 F32; FLOAT32 row3_col1 F32; FLOAT32 row3_col2 F32; FLOAT32 row3_col3 F32; FLOAT32 row3_col4 F32; } xnvCtrlSetGvoColorConversionDeprecatedReq; #define sz_xnvCtrlSetGvoColorConversionDeprecatedReq 56 /* Query GVO Color Conversion request (deprecated) */ typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD32 screen B32; } xnvCtrlQueryGvoColorConversionDeprecatedReq; #define sz_xnvCtrlQueryGvoColorConversionDeprecatedReq 8 /* Query GVO Color Conversion reply (deprecated) */ typedef struct { BYTE type; /* X_Reply */ BYTE pad0; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 pad3 B32; CARD32 pad4 B32; CARD32 pad5 B32; CARD32 pad6 B32; CARD32 pad7 B32; CARD32 pad8 B32; } xnvCtrlQueryGvoColorConversionDeprecatedReply; #define sz_xnvCtrlQueryGvoColorConversionDeprecatedReply 32 /* Set GVO Color Conversion request */ typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD32 screen B32; FLOAT32 cscMatrix_y_r F32; FLOAT32 cscMatrix_y_g F32; FLOAT32 cscMatrix_y_b F32; FLOAT32 cscMatrix_cr_r F32; FLOAT32 cscMatrix_cr_g F32; FLOAT32 cscMatrix_cr_b F32; FLOAT32 cscMatrix_cb_r F32; FLOAT32 cscMatrix_cb_g F32; FLOAT32 cscMatrix_cb_b F32; FLOAT32 cscOffset_y F32; FLOAT32 cscOffset_cr F32; FLOAT32 cscOffset_cb F32; FLOAT32 cscScale_y F32; FLOAT32 cscScale_cr F32; FLOAT32 cscScale_cb F32; } xnvCtrlSetGvoColorConversionReq; #define sz_xnvCtrlSetGvoColorConversionReq 68 /* Query GVO Color Conversion request */ typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD32 screen B32; } xnvCtrlQueryGvoColorConversionReq; #define sz_xnvCtrlQueryGvoColorConversionReq 8 /* Query GVO Color Conversion reply */ typedef struct { BYTE type; /* X_Reply */ BYTE pad0; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 pad3 B32; CARD32 pad4 B32; CARD32 pad5 B32; CARD32 pad6 B32; CARD32 pad7 B32; CARD32 pad8 B32; } xnvCtrlQueryGvoColorConversionReply; #define sz_xnvCtrlQueryGvoColorConversionReply 32 typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD16 target_id B16; /* X screen number or GPU number */ CARD16 target_type B16; /* X screen or GPU */ CARD32 display_mask B32; CARD32 attribute B32; } xnvCtrlQueryBinaryDataReq; #define sz_xnvCtrlQueryBinaryDataReq 16 typedef struct { BYTE type; BYTE pad0; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 flags B32; CARD32 n B32; CARD32 pad4 B32; CARD32 pad5 B32; CARD32 pad6 B32; CARD32 pad7 B32; } xnvCtrlQueryBinaryDataReply; #define sz_xnvCtrlQueryBinaryDataReply 32 typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD32 screen B32; CARD16 notifyType B16; CARD16 onoff B16; } xnvCtrlSelectNotifyReq; #define sz_xnvCtrlSelectNotifyReq 12 typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD16 target_id B16; /* X screen number or GPU number */ CARD16 target_type B16; /* X screen or GPU */ CARD32 display_mask B32; CARD32 attribute B32; CARD32 num_bytes B32; /* Length of string */ } xnvCtrlStringOperationReq; #define sz_xnvCtrlStringOperationReq 20 typedef struct { BYTE type; /* X_Reply */ CARD8 padb1; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 ret B32; CARD32 num_bytes B32; /* Length of string */ CARD32 padl4 B32; CARD32 padl5 B32; CARD32 padl6 B32; CARD32 padl7 B32; } xnvCtrlStringOperationReply; #define sz_xnvCtrlStringOperationReply 32 typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD32 screen B32; CARD32 pixmap B32; CARD32 num_bytes B32; /* Length of string */ CARD32 dataType B32; CARD32 vertexCount B32; } xnvCtrlBindWarpPixmapNameReq; #define sz_xnvCtrlBindWarpPixmapNameReq 24 typedef struct { union { struct { BYTE type; BYTE detail; CARD16 sequenceNumber B16; } u; struct { BYTE type; BYTE detail; CARD16 sequenceNumber B16; CARD32 time B32; CARD32 screen B32; CARD32 display_mask B32; CARD32 attribute B32; CARD32 value B32; CARD32 pad0 B32; CARD32 pad1 B32; } attribute_changed; } u; } xnvctrlEvent; /* * Leave target_type before target_id for the * xnvCtrlSelectTargetNotifyReq and xnvctrlEventTarget * structures, even though other request protocol structures * store target_id in the bottom 16-bits of the second DWORD of the * structures. The event-related structures were added in version * 1.8, and so there is no prior version with which to maintain * compatibility. */ typedef struct { CARD8 reqType; CARD8 nvReqType; CARD16 length B16; CARD16 target_type B16; /* Don't swap these */ CARD16 target_id B16; CARD16 notifyType B16; CARD16 onoff B16; } xnvCtrlSelectTargetNotifyReq; #define sz_xnvCtrlSelectTargetNotifyReq 12 typedef struct { union { struct { BYTE type; BYTE detail; CARD16 sequenceNumber B16; } u; struct { BYTE type; BYTE detail; CARD16 sequenceNumber B16; CARD32 time B32; CARD16 target_type B16; /* Don't swap these */ CARD16 target_id B16; CARD32 display_mask B32; CARD32 attribute B32; CARD32 value B32; CARD32 pad0 B32; CARD32 pad1 B32; } attribute_changed; struct { BYTE type; BYTE detail; CARD16 sequenceNumber B16; CARD32 time B32; CARD16 target_type B16; /* Don't swap these */ CARD16 target_id B16; CARD32 display_mask B32; CARD32 attribute B32; CARD32 value B32; CARD8 availability; CARD8 pad0; CARD16 pad1 B16; CARD32 pad2 B32; } availability_changed; } u; } xnvctrlEventTarget; #endif /* __NVCONTROL_H */ nvidia-settings/src/msg.h0000664000175000017500000000260612236467170015574 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __MSG_H__ #define __MSG_H__ #include #include #include "common-utils.h" void nv_error_msg(const char*, ...) NV_ATTRIBUTE_PRINTF(1, 2); void nv_deprecated_msg(const char*, ...) NV_ATTRIBUTE_PRINTF(1, 2); void nv_warning_msg(const char*, ...) NV_ATTRIBUTE_PRINTF(1, 2); void nv_info_msg(const char*, const char*, ...) NV_ATTRIBUTE_PRINTF(2, 3); void nv_msg(const char*, const char*, ...) NV_ATTRIBUTE_PRINTF(2, 3); void nv_msg_preserve_whitespace(const char*, const char*, ...) NV_ATTRIBUTE_PRINTF(2, 3); #endif /* __MSG_H__ */ nvidia-settings/src/libXNVCtrlAttributes/0000775000175000017500000000000012236467170020667 5ustar albertoalbertonvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributesXrandr.c0000664000175000017500000003405612236467170025501 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * XRandR backend */ #include #include /* 64 bit malloc */ #include #include #include /* To dynamically load libXrandr.so.2 */ #include #include /* Xrandr */ #include "NvCtrlAttributes.h" #include "NvCtrlAttributesPrivate.h" #include "NVCtrlLib.h" #include "common-utils.h" #include "msg.h" #include "parse.h" typedef struct __libXrandrInfoRec { /* libXrandr.so library handle */ void *handle; int ref_count; /* # users of the library */ /* XRandR functions used */ Bool (* XRRQueryExtension) (Display *dpy, int *event_base, int *error_base); Status (* XRRQueryVersion) (Display *dpy, int *major_versionp, int *minor_versionp); void (* XRRSelectInput) (Display *dpy, Window window, int mask); /* gamma-related entry points */ XRRCrtcGamma *(* XRRGetCrtcGamma)(Display *dpy, RRCrtc crtc); void (* XRRSetCrtcGamma)(Display *dpy, RRCrtc crtc, XRRCrtcGamma *gamma); void (* XRRFreeGamma)(XRRCrtcGamma *gamma); /* output and crtc querying functions */ XRROutputInfo *(* XRRGetOutputInfo) (Display *dpy, XRRScreenResources *resources, RROutput output); void (* XRRFreeOutputInfo)(XRROutputInfo *outputInfo); } __libXrandrInfo; static __libXrandrInfo *__libXrandr = NULL; /****************************************************************************** * * Opens libXrandr for usage * ****/ static Bool open_libxrandr(void) { const char *error_str = NULL; /* Initialize bookkeeping structure */ if ( !__libXrandr ) { __libXrandr = nvalloc(sizeof(__libXrandrInfo)); } /* Library was already opened */ if ( __libXrandr->handle ) { __libXrandr->ref_count++; return True; } /* We are the first to open the library */ __libXrandr->handle = dlopen("libXrandr.so.2", RTLD_LAZY); if ( !__libXrandr->handle ) { error_str = dlerror(); goto fail; } /* Resolve XRandR functions */ __libXrandr->XRRQueryExtension = NV_DLSYM(__libXrandr->handle, "XRRQueryExtension"); if ((error_str = dlerror()) != NULL) goto fail; __libXrandr->XRRQueryVersion = NV_DLSYM(__libXrandr->handle, "XRRQueryVersion"); if ((error_str = dlerror()) != NULL) goto fail; __libXrandr->XRRSelectInput = NV_DLSYM(__libXrandr->handle, "XRRSelectInput"); if ((error_str = dlerror()) != NULL) goto fail; /* the gamma entry points are optional: we don't check dlerror(3) */ __libXrandr->XRRGetCrtcGamma = NV_DLSYM(__libXrandr->handle, "XRRGetCrtcGamma"); __libXrandr->XRRSetCrtcGamma = NV_DLSYM(__libXrandr->handle, "XRRSetCrtcGamma"); __libXrandr->XRRFreeGamma = NV_DLSYM(__libXrandr->handle, "XRRFreeGamma"); /* the output/crtc functions are optional: we don't check dlerror(3) */ __libXrandr->XRRGetOutputInfo = NV_DLSYM(__libXrandr->handle, "XRRGetOutputInfo"); __libXrandr->XRRFreeOutputInfo = NV_DLSYM(__libXrandr->handle, "XRRFreeOutputInfo"); /* Up the ref count */ __libXrandr->ref_count++; return True; /* Handle failures */ fail: if ( error_str ) { nv_error_msg("libXrandr setup error : %s\n", error_str); } if ( __libXrandr ) { if ( __libXrandr->handle ) { dlclose(__libXrandr->handle); __libXrandr->handle = NULL; } free(__libXrandr); __libXrandr = NULL; } return False; } /* open_libxrandr() */ /****************************************************************************** * * Closes libXrandr when it is no longer being used. * ****/ static void close_libxrandr(void) { if ( __libXrandr && __libXrandr->handle && __libXrandr->ref_count ) { __libXrandr->ref_count--; #if !defined(NV_BSD) /* WAR for FreeBSD static TLS data bug */ if ( __libXrandr->ref_count == 0 ) { dlclose(__libXrandr->handle); __libXrandr->handle = NULL; free(__libXrandr); __libXrandr = NULL; } #endif } } /* close_libxrandr() */ static RROutput GetRandRCrtcForGamma(NvCtrlAttributePrivateHandle *h, NvCtrlXrandrAttributes *xrandr) { int output; RRCrtc crtc; ReturnStatus status; XRROutputInfo *pOutputInfo; XRRScreenResources screenResources; /* finding the RandR output only makes sense for display targets */ if (h->target_type != NV_CTRL_TARGET_TYPE_DISPLAY) { return None; } /* if the server does not support gamma manipulation, return */ if (!xrandr->gammaAvailable) { return None; } /* * if the libXrandr library does not provide the needed entry * points, return */ if ((__libXrandr->XRRGetOutputInfo == NULL) || (__libXrandr->XRRFreeOutputInfo == NULL)) { return None; } status = NvCtrlGetAttribute(h, NV_CTRL_DISPLAY_RANDR_OUTPUT_ID, &output); if (status != NvCtrlSuccess) { return None; } if (output == 0) { return None; } if ((__libXrandr->XRRGetOutputInfo == NULL) || (__libXrandr->XRRFreeOutputInfo == NULL)) { return None; } /* * XXX Normally, an X client should query XRRGetScreenResources(3) * to get an appropriately initialized XRRScreenResources data * structure. However, XRRGetOutputInfo(3) only uses * XRRScreenResources to get the configTimestamp for the protocol * request, and XRRGetScreenResources(3) can be an expensive * request (triggers reprobing all display hardware, etc). So, * just zero-initialize XRRScreenResources and pass it into * XRRGetOutputInfo(). */ memset(&screenResources, 0, sizeof(screenResources)); screenResources.configTimestamp = CurrentTime; pOutputInfo = __libXrandr->XRRGetOutputInfo(h->dpy, &screenResources, output); if (pOutputInfo == NULL) { return None; } crtc = pOutputInfo->crtc; __libXrandr->XRRFreeOutputInfo(pOutputInfo); return crtc; } /****************************************************************************** * * Initializes the NvCtrlXrandrAttributes Extension by linking the * libXrandr.so.2 library and resolving functions used. * ****/ NvCtrlXrandrAttributes * NvCtrlInitXrandrAttributes (NvCtrlAttributePrivateHandle *h) { NvCtrlXrandrAttributes * xrandr = NULL; /* Check parameters */ if (!h || !h->dpy) { goto fail; } /* allow RandR on X_SCREEN and DISPLAY target types */ if ((h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) && (h->target_type != NV_CTRL_TARGET_TYPE_DISPLAY)) { goto fail; } /* Open libXrandr.so.2 */ if ( !open_libxrandr() ) { /* Silently fail */ goto fail; } /* Create storage for XRandR attributes */ xrandr = nvalloc(sizeof(NvCtrlXrandrAttributes)); /* Verify server support of XRandR extension */ if ( !__libXrandr->XRRQueryExtension(h->dpy, &(xrandr->event_base), &(xrandr->error_base)) ) { goto fail; } /* Verify server version of the XRandR extension */ if ( !__libXrandr->XRRQueryVersion(h->dpy, &(xrandr->major_version), &(xrandr->minor_version)) || ((xrandr->major_version < MIN_RANDR_MAJOR) || ((xrandr->major_version == MIN_RANDR_MAJOR) && (xrandr->minor_version < MIN_RANDR_MINOR)))) { goto fail; } /* Register to receive XRandR events if this is an X screen */ if (h->target_type == NV_CTRL_TARGET_TYPE_X_SCREEN) { __libXrandr->XRRSelectInput(h->dpy, RootWindow(h->dpy, h->target_id), RRScreenChangeNotifyMask); } /* check if this configuration supports gamma manipulation */ xrandr->gammaAvailable = ((xrandr->major_version > 1) || ((xrandr->major_version == 1) && (xrandr->minor_version >= 2))) && (__libXrandr->XRRSetCrtcGamma != NULL); /* * get the RandR CRTC and gamma; the mapping of NV-CONTROL display * device target to RandR CRTC could change at each modeset, so * the frontend needs to reallocate this handle after each modeset */ xrandr->gammaCrtc = GetRandRCrtcForGamma(h, xrandr); if ((xrandr->gammaCrtc != None) && (__libXrandr->XRRGetCrtcGamma != NULL)) { xrandr->pGammaRamp = __libXrandr->XRRGetCrtcGamma(h->dpy, xrandr->gammaCrtc); NvCtrlInitGammaInputStruct(&xrandr->gammaInput); } return xrandr; fail: if ( xrandr ) { free(xrandr); } return NULL; } /* NvCtrlInitXrandrAttributes() */ /****************************************************************************** * * Frees and relinquishes any resource used by the NvCtrlXrandrAttributes * extension. * ****/ void NvCtrlXrandrAttributesClose (NvCtrlAttributePrivateHandle *h) { /* Check parameters */ if ( !h || !h->xrandr || h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN ) { return; } if ((h->xrandr->pGammaRamp != NULL) && (__libXrandr->XRRFreeGamma != NULL)) { __libXrandr->XRRFreeGamma(h->xrandr->pGammaRamp); } close_libxrandr(); free(h->xrandr); h->xrandr = NULL; } /* NvCtrlXrandrAttributesClose() */ /* * Get Xrandr String Attribute Values */ ReturnStatus NvCtrlXrandrGetStringAttribute (NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, char **ptr) { /* Validate */ if ( !h || !h->dpy || h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN ) { return NvCtrlBadHandle; } if ( !h->xrandr || !__libXrandr ) { return NvCtrlMissingExtension; } /* Get Xrandr major & minor versions */ if (attr == NV_CTRL_STRING_XRANDR_VERSION) { char str[16]; sprintf(str, "%d.%d", h->xrandr->major_version, h->xrandr->minor_version); *ptr = strdup(str); return NvCtrlSuccess; } return NvCtrlNoAttribute; } /* NvCtrlXrandrGetStringAttribute() */ ReturnStatus NvCtrlXrandrGetAttribute(NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, int64_t *val) { if (!h || !h->xrandr) { return NvCtrlBadHandle; } if (attr != NV_CTRL_ATTR_RANDR_GAMMA_AVAILABLE) { return NvCtrlNoAttribute; } if (h->target_type == NV_CTRL_TARGET_TYPE_X_SCREEN) { *val = h->xrandr->gammaAvailable; } else { *val = (h->xrandr->pGammaRamp != NULL); } return NvCtrlSuccess; } ReturnStatus NvCtrlXrandrGetColorAttributes(NvCtrlAttributePrivateHandle *h, float contrast[3], float brightness[3], float gamma[3]) { int i; if (!h->xrandr) return NvCtrlMissingExtension; for (i = FIRST_COLOR_CHANNEL; i <= LAST_COLOR_CHANNEL; i++) { contrast[i] = h->xrandr->gammaInput.contrast[i]; brightness[i] = h->xrandr->gammaInput.brightness[i]; gamma[i] = h->xrandr->gammaInput.gamma[i]; } return NvCtrlSuccess; } ReturnStatus NvCtrlXrandrSetColorAttributes(NvCtrlAttributePrivateHandle *h, float c[3], float b[3], float g[3], unsigned int bitmask) { unsigned short *tmpGammaArray[3]; if (!h || !h->dpy) { return NvCtrlBadHandle; } if (!h->xrandr) { return NvCtrlMissingExtension; } if (h->xrandr->pGammaRamp == NULL) { return NvCtrlMissingExtension; } if (h->xrandr->gammaCrtc == None) { return NvCtrlMissingExtension; } NvCtrlAssignGammaInput(&h->xrandr->gammaInput, c, b, g, bitmask); tmpGammaArray[RED_CHANNEL_INDEX] = h->xrandr->pGammaRamp->red; tmpGammaArray[GREEN_CHANNEL_INDEX] = h->xrandr->pGammaRamp->green; tmpGammaArray[BLUE_CHANNEL_INDEX] = h->xrandr->pGammaRamp->blue; NvCtrlUpdateGammaRamp(&h->xrandr->gammaInput, h->xrandr->pGammaRamp->size, tmpGammaArray, bitmask); __libXrandr->XRRSetCrtcGamma(h->dpy, h->xrandr->gammaCrtc, h->xrandr->pGammaRamp); XFlush(h->dpy); return NvCtrlSuccess; } ReturnStatus NvCtrlXrandrGetColorRamp(NvCtrlAttributePrivateHandle *h, unsigned int channel, uint16_t **lut, int *n) { if (!h || !h->dpy) { return NvCtrlBadHandle; } if (!h->xrandr) { return NvCtrlMissingExtension; } if (h->xrandr->pGammaRamp == NULL) { return NvCtrlMissingExtension; } *n = h->xrandr->pGammaRamp->size; switch (channel) { case RED_CHANNEL: *lut = h->xrandr->pGammaRamp->red; break; case GREEN_CHANNEL: *lut = h->xrandr->pGammaRamp->green; break; case BLUE_CHANNEL: *lut = h->xrandr->pGammaRamp->blue; break; default: return NvCtrlBadArgument; } return NvCtrlSuccess; } nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributesVidMode.c0000664000175000017500000001615612236467170025573 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004,2012 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "NvCtrlAttributes.h" #include "NvCtrlAttributesPrivate.h" #include "common-utils.h" #include "msg.h" #include #include #include NvCtrlVidModeAttributes * NvCtrlInitVidModeAttributes(NvCtrlAttributePrivateHandle *h) { NvCtrlVidModeAttributes *vm = NULL; int event, error, size, permissions = 0; Bool ret; /* Check parameters */ if (!h || !h->dpy || h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) { goto failed; } ret = XF86VidModeQueryExtension(h->dpy, &event, &error); if (!ret) goto failed; vm = nvalloc(sizeof(NvCtrlVidModeAttributes)); ret = XF86VidModeQueryVersion(h->dpy, &(vm->major_version), &(vm->minor_version)); if (!ret) goto failed; if (NV_VERSION2(vm->major_version, vm->minor_version) < NV_VERSION2(VM_MINMAJOR, VM_MINMINOR)) { nv_warning_msg("The version of the XF86VidMode extension present " "on this display (%d.%d) does not support updating " "gamma ramps. If you'd like to be able to adjust " "gamma ramps, please update your X server such that " "the version of the XF86VidMode extension is %d.%d " "or higher.", vm->major_version, vm->minor_version, VM_MINMAJOR, VM_MINMINOR); goto failed; } ret = XF86VidModeGetPermissions(h->dpy, h->target_id, &permissions); if (!ret) { goto failed; } if (((permissions & XF86VM_READ_PERMISSION) == 0) || ((permissions & XF86VM_WRITE_PERMISSION) == 0)) { goto failed; } ret = XF86VidModeGetGammaRampSize(h->dpy, h->target_id, &size); if (!ret) goto failed; vm->lut[RED_CHANNEL_INDEX] = nvalloc(sizeof(unsigned short) * size); vm->lut[GREEN_CHANNEL_INDEX] = nvalloc(sizeof(unsigned short) * size); vm->lut[BLUE_CHANNEL_INDEX] = nvalloc(sizeof(unsigned short) * size); vm->gammaRampSize = size; ret = XF86VidModeGetGammaRamp(h->dpy, h->target_id, size, vm->lut[RED_CHANNEL_INDEX], vm->lut[GREEN_CHANNEL_INDEX], vm->lut[BLUE_CHANNEL_INDEX]); if (!ret) goto failed; NvCtrlInitGammaInputStruct(&vm->gammaInput); return vm; failed: if (vm) { free(vm->lut[RED_CHANNEL_INDEX]); free(vm->lut[GREEN_CHANNEL_INDEX]); free(vm->lut[BLUE_CHANNEL_INDEX]); free(vm); } return NULL; } /* NvCtrlInitVidModeAttributes() */ ReturnStatus NvCtrlVidModeGetColorAttributes(NvCtrlAttributePrivateHandle *h, float contrast[3], float brightness[3], float gamma[3]) { int i; if (!h->vm) return NvCtrlMissingExtension; for (i = FIRST_COLOR_CHANNEL; i <= LAST_COLOR_CHANNEL; i++) { contrast[i] = h->vm->gammaInput.contrast[i]; brightness[i] = h->vm->gammaInput.brightness[i]; gamma[i] = h->vm->gammaInput.gamma[i]; } return NvCtrlSuccess; } /* NvCtrlGetColorAttributes() */ /* * NvCtrlSetColorAttributes() - update the color attributes specified * by bitmask, recompute the LUT, and send the LUT to the X server. * * The bitmask parameter is a bitmask of which channels (RED_CHANNEL, * GREEN_CHANNEL, and BLUE_CHANNEL) and which values (CONTRAST_VALUE, * BRIGHTNESS_VALUE, GAMMA_VALUE) should be updated. * * XXX future optimization: if each channel has the same c/b/g values, * don't need to compute the ramp separately per channel. * * XXX future optimization: if the input is the same as what we * already have, we don't actually need to recompute the ramp and send * it to the X server. */ ReturnStatus NvCtrlVidModeSetColorAttributes(NvCtrlAttributePrivateHandle *h, float c[3], float b[3], float g[3], unsigned int bitmask) { Bool ret; if (!h || !h->dpy || h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) { return NvCtrlBadHandle; } if (!h->vm) { return NvCtrlMissingExtension; } NvCtrlAssignGammaInput(&h->vm->gammaInput, c, b, g, bitmask); NvCtrlUpdateGammaRamp(&h->vm->gammaInput, h->vm->gammaRampSize, h->vm->lut, bitmask); ret = XF86VidModeSetGammaRamp(h->dpy, h->target_id, h->vm->gammaRampSize, h->vm->lut[RED_CHANNEL_INDEX], h->vm->lut[GREEN_CHANNEL_INDEX], h->vm->lut[BLUE_CHANNEL_INDEX]); return ret ? NvCtrlSuccess : NvCtrlError; } ReturnStatus NvCtrlVidModeGetColorRamp(NvCtrlAttributePrivateHandle *h, unsigned int channel, unsigned short **lut, int *n) { if (!h || !h->dpy || h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) { return NvCtrlBadHandle; } if (!h->vm) { return NvCtrlMissingExtension; } *n = h->vm->gammaRampSize; switch (channel) { case RED_CHANNEL: *lut = h->vm->lut[RED_CHANNEL_INDEX]; break; case GREEN_CHANNEL: *lut = h->vm->lut[GREEN_CHANNEL_INDEX]; break; case BLUE_CHANNEL: *lut = h->vm->lut[BLUE_CHANNEL_INDEX]; break; default: return NvCtrlBadArgument; } return NvCtrlSuccess; } /* * Get XF86 Video Mode String Attribute Values */ ReturnStatus NvCtrlVidModeGetStringAttribute (NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, char **ptr) { /* Validate */ if ( !h || !h->dpy || h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN ) { return NvCtrlBadHandle; } if ( !h->vm) { return NvCtrlMissingExtension; } /* Get Video Mode major & minor versions */ if (attr == NV_CTRL_STRING_XF86VIDMODE_VERSION) { char str[16]; sprintf(str, "%d.%d", h->vm->major_version, h->vm->minor_version); *ptr = strdup(str); return NvCtrlSuccess; } return NvCtrlNoAttribute; } /* NvCtrlVidModeGetStringAttribute() */ nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributesXv.c0000664000175000017500000001502712236467170024635 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "NvCtrlAttributes.h" #include "NvCtrlAttributesPrivate.h" #include #include #include #include #include "common-utils.h" #include "msg.h" typedef struct __libXvInfoRec { /* libXv.so library handle */ void *handle; int ref_count; /* # users of the library */ /* libXv functions used */ int (* XvQueryExtension) (Display *, unsigned int *, unsigned int *, unsigned int *, unsigned int *, unsigned int *); int (* XvQueryAdaptors) (Display *, Window, unsigned int *, XvAdaptorInfo **); } __libXvInfo; static __libXvInfo *__libXv = NULL; /* * Opens libXv for usage */ static Bool open_libxv(void) { const char *error_str = NULL; /* Initialize bookkeeping structure */ if ( !__libXv ) { __libXv = nvalloc(sizeof(__libXvInfo)); } /* Library was already opened */ if ( __libXv->handle ) { __libXv->ref_count++; return True; } /* We are the first to open the library */ __libXv->handle = dlopen("libXv.so.1", RTLD_LAZY); if ( __libXv->handle == NULL ) { error_str = dlerror(); goto fail; } /* Resolve Xv functions */ __libXv->XvQueryExtension = NV_DLSYM(__libXv->handle, "XvQueryExtension"); if ((error_str = dlerror()) != NULL) goto fail; __libXv->XvQueryAdaptors = NV_DLSYM(__libXv->handle, "XvQueryAdaptors"); if ((error_str = dlerror()) != NULL) goto fail; if ((error_str = dlerror()) != NULL) goto fail; /* Up the ref count */ __libXv->ref_count++; return True; fail: if ( error_str ) { nv_error_msg("libXv setup error : %s\n", error_str); } if ( __libXv ) { if ( __libXv->handle ) { dlclose(__libXv->handle); __libXv->handle = NULL; } free(__libXv); __libXv = NULL; } return False; } /* open_libxv() */ /* * Closes libXv when it is no longer used. */ static void close_libxv(void) { if ( __libXv && __libXv->handle && __libXv->ref_count ) { __libXv->ref_count--; if ( __libXv->ref_count == 0 ) { dlclose(__libXv->handle); __libXv->handle = NULL; free(__libXv); __libXv = NULL; } } } /* close_libxv() */ /* * NvCtrlInitXvAttributes() - scan through the list of Xv adaptors on * the given Display for the video overlay adaptor. Get the * attributes "XV_CONTRAST", "XV_BRIGHTNESS", "XV_SATURATION", * "XV_HUE" and "XV_SET_DEFAULTS". Returns a malloced and initialized * NvCtrlXvOverlayAttributes struct if an nv10 or nv17 video overlay * adaptor was found with all the needed attributes, or NULL * otherwise. */ NvCtrlXvAttributes * NvCtrlInitXvAttributes(NvCtrlAttributePrivateHandle *h) { NvCtrlXvAttributes *xv = NULL; XvAdaptorInfo *ainfo; unsigned int req, event_base, error_base, nadaptors; int ret, i; const char *error_str = NULL; const char *warn_str = NULL; /* Check parameters */ if ( !h || !h->dpy || h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN ) { goto fail; } /* Open libXv.so.1 */ if ( !open_libxv() ) { warn_str = "Failed to open libXv.so.1: this library " "is not present in your system or is not in your " "LD_LIBRARY_PATH."; goto fail; } /* Allocate the attributes structure */ xv = nvalloc(sizeof(NvCtrlXvAttributes)); /* Verify server support of Xv extension */ ret = __libXv->XvQueryExtension(h->dpy, &(xv->major_version), &(xv->minor_version), &req, &event_base, &error_base); if (ret != Success) goto fail; /* Get the list of adaptors */ ret = __libXv->XvQueryAdaptors(h->dpy, RootWindow(h->dpy, h->target_id), &nadaptors, &ainfo); if (ret != Success || !nadaptors || !ainfo) goto fail; for (i = 0; i < nadaptors; i++) { if ((strcmp(ainfo[i].name, "NV17 Video Overlay") == 0) || (strcmp(ainfo[i].name, "NV10 Video Overlay") == 0)) { xv->overlay = True; } if (strcmp(ainfo[i].name, "NV17 Video Texture") == 0) { xv->texture = True; } if (strcmp(ainfo[i].name, "NV05 Video Blitter") == 0) { xv->blitter = True; } } return xv; /* Handle failures */ fail: if (error_str) { nv_error_msg("libXv setup error: %s\n", error_str); } if (warn_str) { nv_warning_msg("libXv setup warning: %s\n", warn_str); } free(xv); return NULL; } /* NvCtrlInitXvAttributes() */ /* * Get Xv String Attribute values */ ReturnStatus NvCtrlXvGetStringAttribute(NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, char **ptr) { /* Validate */ if ( !h || !h->dpy || h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN ) { return NvCtrlBadHandle; } if ( !h->xv || !__libXv ) { return NvCtrlMissingExtension; } /* Get Xv major & minor versions */ if (attr == NV_CTRL_STRING_XV_VERSION) { char str[16]; sprintf(str, "%d.%d", h->xv->major_version, h->xv->minor_version); *ptr = strdup(str); return NvCtrlSuccess; } return NvCtrlNoAttribute; } /* NvCtrlXvGetStringAttribute() */ /* * Frees and relinquishes any resource used by the Xv Attributes */ void NvCtrlXvAttributesClose (NvCtrlAttributePrivateHandle *h) { if (!h || !h->xv) { return; } close_libxv(); free(h->xv); h->xv = NULL; } /* NvCtrlXvAttributesClose() */ nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributes.h0000664000175000017500000004072412236467170024326 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __NVCTRL_ATTRIBUTES__ #define __NVCTRL_ATTRIBUTES__ #include #include "NVCtrl.h" typedef void NvCtrlAttributeHandle; #define NV_FALSE 0 #define NV_TRUE 1 /* * Constants for controlling values (brightness, contrast, gamma) for * each color channel. The *INDEX constants are only meant for * internal use. The CHANNEL and VALUE constants are meant to be used * in a bitmask, so that multiple values for multiple channels may be * specified at once. */ #define RED_CHANNEL_INDEX 0 #define GREEN_CHANNEL_INDEX 1 #define BLUE_CHANNEL_INDEX 2 #define FIRST_COLOR_CHANNEL RED_CHANNEL_INDEX #define LAST_COLOR_CHANNEL BLUE_CHANNEL_INDEX #define CONTRAST_INDEX 3 #define BRIGHTNESS_INDEX 4 #define GAMMA_INDEX 5 #define RED_CHANNEL (1 << RED_CHANNEL_INDEX) #define GREEN_CHANNEL (1 << GREEN_CHANNEL_INDEX) #define BLUE_CHANNEL (1 << BLUE_CHANNEL_INDEX) #define ALL_CHANNELS (RED_CHANNEL|GREEN_CHANNEL|BLUE_CHANNEL) #define CONTRAST_VALUE (1 << CONTRAST_INDEX) #define BRIGHTNESS_VALUE (1 << BRIGHTNESS_INDEX) #define GAMMA_VALUE (1 << GAMMA_INDEX) #define ALL_VALUES (CONTRAST_VALUE|BRIGHTNESS_VALUE|GAMMA_VALUE) #define GAMMA_MAX 10.0 #define GAMMA_MIN (1.0 / GAMMA_MAX) #define GAMMA_DEFAULT 1.0 #define BRIGHTNESS_MAX 1.0 #define BRIGHTNESS_MIN -1.0 #define BRIGHTNESS_DEFAULT 0.0 #define CONTRAST_MAX 1.0 #define CONTRAST_MIN -1.0 #define CONTRAST_DEFAULT 0.0 /* * Valid integer attributes for NvCtrl[Get|Set]Attribute(); these are * in addition to the ones in NVCtrl.h */ #define NV_CTRL_ATTR_BASE (NV_CTRL_LAST_ATTRIBUTE + 1) #define NV_CTRL_ATTR_EXT_BASE (NV_CTRL_ATTR_BASE) #define NV_CTRL_ATTR_EXT_NV_PRESENT (NV_CTRL_ATTR_EXT_BASE + 0) #define NV_CTRL_ATTR_EXT_VM_PRESENT (NV_CTRL_ATTR_EXT_BASE + 1) #define NV_CTRL_ATTR_EXT_XV_OVERLAY_PRESENT (NV_CTRL_ATTR_EXT_BASE + 2) #define NV_CTRL_ATTR_EXT_XV_TEXTURE_PRESENT (NV_CTRL_ATTR_EXT_BASE + 3) #define NV_CTRL_ATTR_EXT_XV_BLITTER_PRESENT (NV_CTRL_ATTR_EXT_BASE + 4) #define NV_CTRL_ATTR_EXT_LAST_ATTRIBUTE \ (NV_CTRL_ATTR_EXT_XV_BLITTER_PRESENT) #define NV_CTRL_ATTR_NV_BASE \ (NV_CTRL_ATTR_EXT_LAST_ATTRIBUTE + 1) #define NV_CTRL_ATTR_NV_MAJOR_VERSION (NV_CTRL_ATTR_NV_BASE + 0) #define NV_CTRL_ATTR_NV_MINOR_VERSION (NV_CTRL_ATTR_NV_BASE + 1) #define NV_CTRL_ATTR_NV_LAST_ATTRIBUTE \ (NV_CTRL_ATTR_NV_MINOR_VERSION) /* GLX */ #define NV_CTRL_ATTR_GLX_BASE \ (NV_CTRL_ATTR_NV_LAST_ATTRIBUTE + 1) #define NV_CTRL_ATTR_GLX_FBCONFIG_ATTRIBS (NV_CTRL_ATTR_GLX_BASE + 0) #define NV_CTRL_ATTR_GLX_LAST_ATTRIBUTE \ (NV_CTRL_ATTR_GLX_FBCONFIG_ATTRIBS) /* RandR */ #define NV_CTRL_ATTR_RANDR_BASE \ (NV_CTRL_ATTR_GLX_LAST_ATTRIBUTE + 1) #define NV_CTRL_ATTR_RANDR_GAMMA_AVAILABLE (NV_CTRL_ATTR_RANDR_BASE + 0) #define NV_CTRL_ATTR_RANDR_LAST_ATTRIBUTE \ (NV_CTRL_ATTR_RANDR_GAMMA_AVAILABLE) #define NV_CTRL_ATTR_LAST_ATTRIBUTE (NV_CTRL_ATTR_RANDR_LAST_ATTRIBUTE) typedef enum { NvCtrlSuccess = 0, NvCtrlBadArgument, NvCtrlBadHandle, NvCtrlNoAttribute, NvCtrlMissingExtension, NvCtrlReadOnlyAttribute, NvCtrlWriteOnlyAttribute, NvCtrlAttributeNotAvailable, NvCtrlError } ReturnStatus; /* GLX FBConfig attribute structure */ typedef struct GLXFBConfigAttrRec { int fbconfig_id; int visual_id; int buffer_size; int level; int doublebuffer; int stereo; int aux_buffers; int red_size; int green_size; int blue_size; int alpha_size; int depth_size; int stencil_size; int accum_red_size; int accum_green_size; int accum_blue_size; int accum_alpha_size; int render_type; int drawable_type; int x_renderable; int x_visual_type; int config_caveat; int transparent_type; int transparent_index_value; int transparent_red_value; int transparent_green_value; int transparent_blue_value; int transparent_alpha_value; int pbuffer_width; int pbuffer_height; int pbuffer_max; int multi_sample_valid; int multi_samples; int multi_sample_buffers; int multi_sample_coverage_valid; int multi_samples_color; } GLXFBConfigAttr; /* * Additional NV-CONTROL string attributes for NvCtrlGetStringDisplayAttribute(); * these are in addition to the ones in NVCtrl.h */ #define NV_CTRL_STRING_NV_CONTROL_BASE (NV_CTRL_STRING_LAST_ATTRIBUTE + 1) #define NV_CTRL_STRING_NV_CONTROL_VERSION (NV_CTRL_STRING_NV_CONTROL_BASE) #define NV_CTRL_STRING_NV_CONTROL_LAST_ATTRIBUTE (NV_CTRL_STRING_NV_CONTROL_VERSION) /* * Valid string attributes for NvCtrlGetStringAttribute(); these are * in addition to the ones in NVCtrl.h */ #define NV_CTRL_STRING_GLX_BASE \ (NV_CTRL_STRING_NV_CONTROL_LAST_ATTRIBUTE + 1) #define NV_CTRL_STRING_GLX_DIRECT_RENDERING (NV_CTRL_STRING_GLX_BASE + 0) #define NV_CTRL_STRING_GLX_GLX_EXTENSIONS (NV_CTRL_STRING_GLX_BASE + 1) #define NV_CTRL_STRING_GLX_SERVER_VENDOR (NV_CTRL_STRING_GLX_BASE + 2) #define NV_CTRL_STRING_GLX_SERVER_VERSION (NV_CTRL_STRING_GLX_BASE + 3) #define NV_CTRL_STRING_GLX_SERVER_EXTENSIONS (NV_CTRL_STRING_GLX_BASE + 4) #define NV_CTRL_STRING_GLX_CLIENT_VENDOR (NV_CTRL_STRING_GLX_BASE + 5) #define NV_CTRL_STRING_GLX_CLIENT_VERSION (NV_CTRL_STRING_GLX_BASE + 6) #define NV_CTRL_STRING_GLX_CLIENT_EXTENSIONS (NV_CTRL_STRING_GLX_BASE + 7) #define NV_CTRL_STRING_GLX_OPENGL_VENDOR (NV_CTRL_STRING_GLX_BASE + 8) #define NV_CTRL_STRING_GLX_OPENGL_RENDERER (NV_CTRL_STRING_GLX_BASE + 9) #define NV_CTRL_STRING_GLX_OPENGL_VERSION (NV_CTRL_STRING_GLX_BASE + 10) #define NV_CTRL_STRING_GLX_OPENGL_EXTENSIONS (NV_CTRL_STRING_GLX_BASE + 11) #define NV_CTRL_STRING_GLX_LAST_ATTRIBUTE \ (NV_CTRL_STRING_GLX_OPENGL_EXTENSIONS) /* * Additional XRANDR string attributes for NvCtrlGetStringDisplayAttribute(); */ #define NV_CTRL_STRING_XRANDR_BASE (NV_CTRL_STRING_GLX_LAST_ATTRIBUTE + 1) #define NV_CTRL_STRING_XRANDR_VERSION (NV_CTRL_STRING_XRANDR_BASE) #define NV_CTRL_STRING_XRANDR_LAST_ATTRIBUTE (NV_CTRL_STRING_XRANDR_VERSION) /* * Additional XF86VidMode string attributes for NvCtrlGetStringDisplayAttribute(); */ #define NV_CTRL_STRING_XF86VIDMODE_BASE (NV_CTRL_STRING_XRANDR_LAST_ATTRIBUTE + 1) #define NV_CTRL_STRING_XF86VIDMODE_VERSION (NV_CTRL_STRING_XF86VIDMODE_BASE) #define NV_CTRL_STRING_XF86VIDMODE_LAST_ATTRIBUTE (NV_CTRL_STRING_XF86VIDMODE_VERSION) /* * Additional XVideo string attributes for NvCtrlGetStringDisplayAttribute(); */ #define NV_CTRL_STRING_XV_BASE (NV_CTRL_STRING_XF86VIDMODE_LAST_ATTRIBUTE + 1) #define NV_CTRL_STRING_XV_VERSION (NV_CTRL_STRING_XV_BASE) #define NV_CTRL_STRING_XV_LAST_ATTRIBUTE (NV_CTRL_STRING_XV_VERSION) /* * NvCtrlAttributeInit() - initializes the control panel backend; this * includes probing for the various extensions, downloading the * initial state of attributes, etc. Takes a Display pointer and * screen number, and returns an opaque handle on success; returns * NULL if the backend cannot use this screen. */ #define NV_CTRL_ATTRIBUTES_NV_CONTROL_SUBSYSTEM 0x1 #define NV_CTRL_ATTRIBUTES_XF86VIDMODE_SUBSYSTEM 0x2 #define NV_CTRL_ATTRIBUTES_XVIDEO_SUBSYSTEM 0x4 #define NV_CTRL_ATTRIBUTES_GLX_SUBSYSTEM 0x8 #define NV_CTRL_ATTRIBUTES_XRANDR_SUBSYSTEM 0x10 #define NV_CTRL_ATTRIBUTES_ALL_SUBSYSTEMS \ (NV_CTRL_ATTRIBUTES_NV_CONTROL_SUBSYSTEM | \ NV_CTRL_ATTRIBUTES_XF86VIDMODE_SUBSYSTEM | \ NV_CTRL_ATTRIBUTES_XVIDEO_SUBSYSTEM | \ NV_CTRL_ATTRIBUTES_GLX_SUBSYSTEM | \ NV_CTRL_ATTRIBUTES_XRANDR_SUBSYSTEM) NvCtrlAttributeHandle *NvCtrlAttributeInit(Display *dpy, int target_type, int target_id, unsigned int subsystems); void NvCtrlAttributeRebuildSubsystems(NvCtrlAttributeHandle *handle, unsigned int subsystem); char *NvCtrlGetDisplayName(NvCtrlAttributeHandle *handle); Display *NvCtrlGetDisplayPtr(NvCtrlAttributeHandle *handle); int NvCtrlGetScreen(NvCtrlAttributeHandle *handle); int NvCtrlGetTargetType(NvCtrlAttributeHandle *handle); int NvCtrlGetTargetId(NvCtrlAttributeHandle *handle); int NvCtrlGetScreenWidth(NvCtrlAttributeHandle *handle); int NvCtrlGetScreenHeight(NvCtrlAttributeHandle *handle); int NvCtrlGetEventBase(NvCtrlAttributeHandle *handle); int NvCtrlGetXrandrEventBase(NvCtrlAttributeHandle *handle); char *NvCtrlGetServerVendor(NvCtrlAttributeHandle *handle); int NvCtrlGetVendorRelease(NvCtrlAttributeHandle *handle); int NvCtrlGetProtocolVersion(NvCtrlAttributeHandle *handle); int NvCtrlGetProtocolRevision(NvCtrlAttributeHandle *handle); int NvCtrlGetScreenCount(NvCtrlAttributeHandle *handle); int NvCtrlGetScreenWidthMM(NvCtrlAttributeHandle *handle); int NvCtrlGetScreenHeightMM(NvCtrlAttributeHandle *handle); int NvCtrlGetScreenPlanes(NvCtrlAttributeHandle *handle); ReturnStatus NvCtrlGetColorAttributes (NvCtrlAttributeHandle *handle, float contrast[3], float brightness[3], float gamma[3]); ReturnStatus NvCtrlSetColorAttributes (NvCtrlAttributeHandle *handle, float contrast[3], float brightness[3], float gamma[3], unsigned int flags); /* * NvCtrlGetColorRamp() - get a pointer to the current color ramp for * the specified channel; values in the ramp are scaled [0,65536). If * NvCtrlSuccess is returned, lut will point to the color ramp, and n * will be the number of entries in the color ramp. */ ReturnStatus NvCtrlGetColorRamp (NvCtrlAttributeHandle *handle, unsigned int channel, unsigned short **lut, int *n); /* * NvCtrlQueryTargetCount() - query the number of targets available * on the server of the given target type. This is used, for example * to return the number of GPUs the server knows about. */ ReturnStatus NvCtrlQueryTargetCount(NvCtrlAttributeHandle *handle, int target_type, int *val); /* * NvCtrlGetAttribute()/NvCtrlSetAttribute() - these get and set * functions can be used to query and modify all integer attributes. * Modifications made via SetAttribute() are made immediately. The * attr argument is the attribute to query/modify; valid attributes * are those listed in NVCtrl.h and the NV_CTRL_ attributes #define'd * above. NvCtrlGetAttribute64() behaves like NvCtrlGetAttribute(), * but supports 64-bit integer attributes. */ ReturnStatus NvCtrlGetAttribute (NvCtrlAttributeHandle *handle, int attr, int *val); ReturnStatus NvCtrlSetAttribute (NvCtrlAttributeHandle *handle, int attr, int val); ReturnStatus NvCtrlGetAttribute64 (NvCtrlAttributeHandle *handle, int attr, int64_t *val); /* * NvCtrlGetVoidAttribute() - this function works like the * Get and GetString only it returns a void pointer. The * data type pointed to is dependent on which attribute you * are requesting. */ ReturnStatus NvCtrlGetVoidAttribute (NvCtrlAttributeHandle *handle, int attr, void **ptr); /* * NvCtrlGetValidAttributeValues() - get the valid settable values for * the specified attribute. See the description of * NVCTRLAttributeValidValuesRec in NVCtrl.h. */ ReturnStatus NvCtrlGetValidAttributeValues (NvCtrlAttributeHandle *handle, int attr, NVCTRLAttributeValidValuesRec *val); /* * NvCtrlGetStringAttribute() - get the string associated with the * specified attribute, where valid values are the NV_CTRL_STRING_ * #defines in NVCtrl.h. */ ReturnStatus NvCtrlGetStringAttribute (NvCtrlAttributeHandle *handle, int attr, char **ptr); /* * NvCtrlSetStringAttribute() - Set the string associated with the * specified attribute, where valid values are the NV_CTRL_STRING_ * #defines in NVCtrl.h that have the 'W' (Write) flag set. If 'ret' * is specified, (integer) result information is returned. */ ReturnStatus NvCtrlSetStringAttribute (NvCtrlAttributeHandle *handle, int attr, const char *ptr, int *ret); /* * The following four functions are identical to the above five, * except that they specify a particular display mask. */ ReturnStatus NvCtrlGetDisplayAttribute (NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, int *val); ReturnStatus NvCtrlSetDisplayAttribute (NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, int val); ReturnStatus NvCtrlGetDisplayAttribute64 (NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, int64_t *val); ReturnStatus NvCtrlGetVoidDisplayAttribute (NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, void **val); ReturnStatus NvCtrlGetValidDisplayAttributeValues (NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, NVCTRLAttributeValidValuesRec *val); ReturnStatus NvCtrlGetValidStringDisplayAttributeValues (NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, NVCTRLAttributeValidValuesRec *val); ReturnStatus NvCtrlGetStringDisplayAttribute (NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, char **ptr); ReturnStatus NvCtrlSetStringDisplayAttribute (NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, const char *ptr, int *ret); ReturnStatus NvCtrlGetBinaryAttribute(NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, unsigned char **data, int *len); /* * NvCtrlStringOperation() - Performs the string operation associated * with the specified attribute, where valid values are the * NV_CTRL_STRING_OPERATION_* #defines in NVCtrl.h. If 'ptrOut' * is specified, (string) result information is returned. */ ReturnStatus NvCtrlStringOperation(NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, const char *ptrIn, char **ptrOut); /* * NvCtrl[SG]etGvoColorConversion() - get and set the color conversion * matrix and offset used in the Graphics to Video Out (GVO) * extension. These should only be used if the NV_CTRL_GVO_SUPPORTED * attribute is TRUE. */ ReturnStatus NvCtrlSetGvoColorConversion(NvCtrlAttributeHandle *handle, float colorMatrix[3][3], float colorOffset[3], float colorScale[3]); ReturnStatus NvCtrlGetGvoColorConversion(NvCtrlAttributeHandle *handle, float colorMatrix[3][3], float colorOffset[3], float colorScale[3]); const char *NvCtrlGetMultisampleModeName(int multisample_mode); char *NvCtrlAttributesStrError (ReturnStatus status); void NvCtrlAttributeClose(NvCtrlAttributeHandle *handle); #endif /* __NVCTRL_ATTRIBUTES__ */ nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributesPrivate.h0000664000175000017500000002351212236467170025655 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004,2012 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __NVCTRL_ATTRIBUTES_PRIVATE__ #define __NVCTRL_ATTRIBUTES_PRIVATE__ #include "NvCtrlAttributes.h" #include "NVCtrl.h" #include /* GLX #defines */ #include /* Xrandr */ /* Make sure we are compiling with XRandR version 1.2 or greater */ #define MIN_RANDR_MAJOR 1 #define MIN_RANDR_MINOR 2 #if (RANDR_MAJOR < MIN_RANDR_MAJOR) || ((RANDR_MAJOR == MIN_RANDR_MAJOR) && (RANDR_MINOR < MIN_RANDR_MINOR)) #error XRandR version 1.2 or greater is required. #endif #define EXTENSION_NV_CONTROL 0x1 #define EXTENSION_XF86VIDMODE 0x2 #define EXTENSION_XVIDEO 0x4 #define EXTENSION_GLX 0x8 #define EXTENSION_XRANDR 0x10 /* caps bits */ #define NV_XF86VM_NUM_BITS 1 #define NV_CTRL_NUM_BITS (NV_CTRL_LAST_ATTRIBUTE + 1) #define NV_CTRL_STRING_NUM_BITS (NV_CTRL_STRING_LAST_ATTRIBUTE + 1) #define NV_XF86VM_CAPS_OFFSET 0 #define NV_CTRL_CAPS_OFFSET NV_XF86VM_NUM_BITS #define NV_CTRL_STRING_CAPS_OFFSET (NV_XF86VM_NUM_BITS + NV_CTRL_NUM_BITS) #define CAPS_XF86VM_GAMMA (1 << (0x1 + NV_XF86VM_CAPS_OFFSET)) /* minimum required version for the NV-CONTROL extension */ #define NV_MINMAJOR 1 #define NV_MINMINOR 11 /* minimum required version for the XF86VidMode extension */ #define VM_MINMAJOR 2 #define VM_MINMINOR 1 /* minimum required version for the XVideo extension */ #define XV_MINMAJOR 2 #define XV_MINMINOR 0 /* Use to resolve symbols in dynamically opened libraries */ #define NV_DLSYM(handle, symbol) ({ dlerror(); dlsym(handle, symbol); }) typedef struct __NvCtrlAttributes NvCtrlAttributes; typedef struct __NvCtrlVidModeAttributes NvCtrlVidModeAttributes; typedef struct __NvCtrlAttributePrivateHandle NvCtrlAttributePrivateHandle; typedef struct __NvCtrlNvControlAttributes NvCtrlNvControlAttributes; typedef struct __NvCtrlXvAttributes NvCtrlXvAttributes; typedef struct __NvCtrlXvOverlayAttributes NvCtrlXvOverlayAttributes; typedef struct __NvCtrlXvTextureAttributes NvCtrlXvTextureAttributes; typedef struct __NvCtrlXvBlitterAttributes NvCtrlXvBlitterAttributes; typedef struct __NvCtrlXvAttribute NvCtrlXvAttribute; typedef struct __NvCtrlXrandrAttributes NvCtrlXrandrAttributes; typedef struct { float brightness[3]; float contrast[3]; float gamma[3]; } NvCtrlGammaInput; struct __NvCtrlNvControlAttributes { int event_base; int error_base; int major_version; int minor_version; }; struct __NvCtrlVidModeAttributes { int major_version; int minor_version; unsigned short *lut[3]; int gammaRampSize; NvCtrlGammaInput gammaInput; }; struct __NvCtrlXvAttributes { unsigned int major_version; unsigned int minor_version; Bool overlay; Bool texture; Bool blitter; }; struct __NvCtrlXrandrAttributes { int event_base; int error_base; int major_version; int minor_version; Bool gammaAvailable; RRCrtc gammaCrtc; NvCtrlGammaInput gammaInput; XRRCrtcGamma *pGammaRamp; }; struct __NvCtrlAttributePrivateHandle { Display *dpy; /* display connection */ int target_type; /* Type of target this handle controls */ int target_id; /* screen num, gpu num (etc) of target */ /* Common attributes */ NvCtrlNvControlAttributes *nv; /* NV-CONTROL extension info */ /* Screen-specific attributes */ NvCtrlVidModeAttributes *vm; /* XF86VidMode extension info */ NvCtrlXvAttributes *xv; /* XVideo info */ Bool glx; /* GLX extension available */ NvCtrlXrandrAttributes *xrandr; /* XRandR extension info */ }; NvCtrlNvControlAttributes * NvCtrlInitNvControlAttributes (NvCtrlAttributePrivateHandle *); NvCtrlVidModeAttributes * NvCtrlInitVidModeAttributes (NvCtrlAttributePrivateHandle *); /* Xv attribute functions */ NvCtrlXvAttributes * NvCtrlInitXvAttributes (NvCtrlAttributePrivateHandle *); void NvCtrlXvAttributesClose (NvCtrlAttributePrivateHandle *); ReturnStatus NvCtrlXvGetStringAttribute (NvCtrlAttributePrivateHandle *, unsigned int, int, char **); /* GLX extension attribute functions */ Bool NvCtrlInitGlxAttributes (NvCtrlAttributePrivateHandle *); void NvCtrlGlxAttributesClose (NvCtrlAttributePrivateHandle *); ReturnStatus NvCtrlGlxGetVoidAttribute (NvCtrlAttributePrivateHandle *, unsigned int, int, void **); ReturnStatus NvCtrlGlxGetStringAttribute (NvCtrlAttributePrivateHandle *, unsigned int, int, char **); /* XRandR extension attribute functions */ NvCtrlXrandrAttributes * NvCtrlInitXrandrAttributes (NvCtrlAttributePrivateHandle *); void NvCtrlXrandrAttributesClose (NvCtrlAttributePrivateHandle *); ReturnStatus NvCtrlXrandrGetStringAttribute (NvCtrlAttributePrivateHandle *, unsigned int, int, char **); ReturnStatus NvCtrlXrandrGetColorAttributes(NvCtrlAttributePrivateHandle *h, float contrast[3], float brightness[3], float gamma[3]); ReturnStatus NvCtrlXrandrSetColorAttributes(NvCtrlAttributePrivateHandle *h, float c[3], float b[3], float g[3], unsigned int bitmask); ReturnStatus NvCtrlXrandrGetColorRamp(NvCtrlAttributePrivateHandle *h, unsigned int channel, uint16_t **lut, int *n); /* XF86 Video Mode extension attribute functions */ ReturnStatus NvCtrlVidModeGetColorAttributes(NvCtrlAttributePrivateHandle *h, float contrast[3], float brightness[3], float gamma[3]); ReturnStatus NvCtrlVidModeSetColorAttributes(NvCtrlAttributePrivateHandle *h, float c[3], float b[3], float g[3], unsigned int bitmask); ReturnStatus NvCtrlVidModeGetColorRamp(NvCtrlAttributePrivateHandle *h, unsigned int channel, uint16_t **lut, int *n); ReturnStatus NvCtrlVidModeGetStringAttribute (NvCtrlAttributePrivateHandle *, unsigned int, int, char **); ReturnStatus NvCtrlXrandrGetAttribute(NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, int64_t *val); /* Generic attribute functions */ ReturnStatus NvCtrlNvControlQueryTargetCount(NvCtrlAttributePrivateHandle *, int, int *); ReturnStatus NvCtrlNvControlGetAttribute (NvCtrlAttributePrivateHandle *, unsigned int, int, int64_t *); ReturnStatus NvCtrlNvControlSetAttribute (NvCtrlAttributePrivateHandle *, unsigned int, int, int); ReturnStatus NvCtrlNvControlSetAttributeWithReply (NvCtrlAttributePrivateHandle *, unsigned int, int, int); ReturnStatus NvCtrlNvControlGetValidAttributeValues (NvCtrlAttributePrivateHandle *, unsigned int, int, NVCTRLAttributeValidValuesRec *); ReturnStatus NvCtrlNvControlGetValidStringDisplayAttributeValues (NvCtrlAttributePrivateHandle *, unsigned int, int, NVCTRLAttributeValidValuesRec *); ReturnStatus NvCtrlNvControlGetStringAttribute (NvCtrlAttributePrivateHandle *, unsigned int, int, char **); ReturnStatus NvCtrlNvControlSetStringAttribute (NvCtrlAttributePrivateHandle *, unsigned int, int, const char *, int *); ReturnStatus NvCtrlNvControlGetBinaryAttribute(NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, unsigned char **data, int *len); ReturnStatus NvCtrlNvControlStringOperation (NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, const char *ptrIn, char **ptrOut); /* helper functions for XV86VidMode and RandR backends */ void NvCtrlInitGammaInputStruct(NvCtrlGammaInput *pGammaInput); void NvCtrlUpdateGammaRamp(const NvCtrlGammaInput *pGammaInput, int gammaRampSize, unsigned short *gammaRamp[3], unsigned int bitmask); void NvCtrlAssignGammaInput(NvCtrlGammaInput *pGammaInput, const float inContrast[3], const float inBrightness[3], const float inGamma[3], const unsigned int bitmask); #endif /* __NVCTRL_ATTRIBUTES_PRIVATE__ */ nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributesNvControl.c0000664000175000017500000003463012236467170026165 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "NvCtrlAttributes.h" #include "NvCtrlAttributesPrivate.h" #include "NVCtrlLib.h" #include "common-utils.h" #include "msg.h" #include #include /* * NvCtrlInitNvControlAttributes() - check for the NV-CONTROL * extension and make sure we have an adequate version. Returns a * malloced and initialized NvCtrlNvControlAttributes structure if * successful, or NULL otherwise. */ NvCtrlNvControlAttributes * NvCtrlInitNvControlAttributes (NvCtrlAttributePrivateHandle *h) { NvCtrlNvControlAttributes *nv; int ret, major, minor, event, error; ret = XNVCTRLQueryExtension (h->dpy, &event, &error); if (ret != True) { nv_warning_msg("NV-CONTROL extension not found on this Display."); return NULL; } ret = XNVCTRLQueryVersion (h->dpy, &major, &minor); if (ret != True) { nv_error_msg("Failed to query NV-CONTROL extension version."); return NULL; } if (NV_VERSION2(major, minor) < NV_VERSION2(NV_MINMAJOR, NV_MINMINOR)) { nv_error_msg("NV-CONTROL extension version %d.%d is too old; " "the minimum required version is %d.%d.", major, minor, NV_MINMAJOR, NV_MINMINOR); return NULL; } if (h->target_type == NV_CTRL_TARGET_TYPE_X_SCREEN) { ret = XNVCTRLIsNvScreen (h->dpy, h->target_id); if (ret != True) { nv_warning_msg("NV-CONTROL extension not present on screen %d " "of this Display.", h->target_id); return NULL; } } nv = nvalloc(sizeof(NvCtrlNvControlAttributes)); ret = XNVCtrlSelectTargetNotify(h->dpy, h->target_type, h->target_id, TARGET_ATTRIBUTE_CHANGED_EVENT, True); if (ret != True) { nv_warning_msg("Unable to select attribute changed NV-CONTROL " "events."); } /* * TARGET_ATTRIBUTE_AVAILABILITY_CHANGED_EVENT was added in NV-CONTROL * 1.15 */ if (NV_VERSION2(major, minor) >= NV_VERSION2(1, 15)) { ret = XNVCtrlSelectTargetNotify(h->dpy, h->target_type, h->target_id, TARGET_ATTRIBUTE_AVAILABILITY_CHANGED_EVENT, True); if (ret != True) { nv_warning_msg("Unable to select attribute changed NV-CONTROL " "events."); } } /* * TARGET_STRING_ATTRIBUTE_CHANGED_EVENT was added in NV-CONTROL * 1.16 */ if (NV_VERSION2(major, minor) >= NV_VERSION2(1, 16)) { ret = XNVCtrlSelectTargetNotify(h->dpy, h->target_type, h->target_id, TARGET_STRING_ATTRIBUTE_CHANGED_EVENT, True); if (ret != True) { nv_warning_msg("Unable to select attribute changed NV-CONTROL string" "events."); } } /* * TARGET_BINARY_ATTRIBUTE_CHANGED_EVENT was added in NV-CONTROL * 1.17 */ if (NV_VERSION2(major, minor) >= NV_VERSION2(1, 17)) { ret = XNVCtrlSelectTargetNotify(h->dpy, h->target_type, h->target_id, TARGET_BINARY_ATTRIBUTE_CHANGED_EVENT, True); if (ret != True) { nv_warning_msg("Unable to select attribute changed NV-CONTROL binary" "events."); } } nv->event_base = event; nv->error_base = error; nv->major_version = major; nv->minor_version = minor; return (nv); } /* NvCtrlInitNvControlAttributes() */ ReturnStatus NvCtrlNvControlQueryTargetCount(NvCtrlAttributePrivateHandle *h, int target_type, int *val) { int ret; ret = XNVCTRLQueryTargetCount(h->dpy, target_type, val); return (ret) ? NvCtrlSuccess : NvCtrlError; } /* NvCtrlNvControlQueryTargetCount() */ ReturnStatus NvCtrlNvControlGetAttribute (NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, int64_t *val) { ReturnStatus status; int value_32; int major, minor; major = h->nv->major_version; minor = h->nv->minor_version; if (attr <= NV_CTRL_LAST_ATTRIBUTE) { if (NV_VERSION2(major, minor) > NV_VERSION2(1, 20)) { status = XNVCTRLQueryTargetAttribute64(h->dpy, h->target_type, h->target_id, display_mask, attr, val); } else { status = XNVCTRLQueryTargetAttribute(h->dpy, h->target_type, h->target_id, display_mask, attr, &value_32); *val = value_32; } if (status) { return NvCtrlSuccess; } else { return NvCtrlAttributeNotAvailable; } } if ((attr >= NV_CTRL_ATTR_NV_BASE) && (attr <= NV_CTRL_ATTR_NV_LAST_ATTRIBUTE)) { if (!h->nv) return NvCtrlMissingExtension; switch (attr) { case NV_CTRL_ATTR_NV_MAJOR_VERSION: *val = major; return NvCtrlSuccess; case NV_CTRL_ATTR_NV_MINOR_VERSION: *val = minor; return NvCtrlSuccess; } } return NvCtrlNoAttribute; } /* NvCtrlNvControlGetAttribute() */ ReturnStatus NvCtrlNvControlSetAttribute (NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, int val) { Bool bRet; if (attr <= NV_CTRL_LAST_ATTRIBUTE) { bRet = XNVCTRLSetTargetAttributeAndGetStatus (h->dpy, h->target_type, h->target_id, display_mask, attr, val); if (!bRet) { return NvCtrlError; } return NvCtrlSuccess; } return NvCtrlNoAttribute; } ReturnStatus NvCtrlNvControlGetValidAttributeValues (NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, NVCTRLAttributeValidValuesRec *val) { if (attr <= NV_CTRL_LAST_ATTRIBUTE) { if (XNVCTRLQueryValidTargetAttributeValues (h->dpy, h->target_type, h->target_id, display_mask, attr, val)) { return NvCtrlSuccess; } else { return NvCtrlAttributeNotAvailable; } } return NvCtrlNoAttribute; } /* NvCtrlNvControlGetValidAttributeValues() */ ReturnStatus NvCtrlNvControlGetValidStringDisplayAttributeValues (NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, NVCTRLAttributeValidValuesRec *val) { if (attr <= NV_CTRL_STRING_LAST_ATTRIBUTE) { if (NV_VERSION2(h->nv->major_version, h->nv->minor_version) >= NV_VERSION2(1, 22)) { if (XNVCTRLQueryValidTargetStringAttributeValues (h->dpy, h->target_type, h->target_id, display_mask, attr, val)) { return NvCtrlSuccess; } else { return NvCtrlAttributeNotAvailable; } } else { if (val) { memset(val, 0, sizeof(NVCTRLAttributeValidValuesRec)); val->type = ATTRIBUTE_TYPE_STRING; val->permissions = ATTRIBUTE_TYPE_READ | ATTRIBUTE_TYPE_X_SCREEN; return NvCtrlSuccess; } else { return NvCtrlBadArgument; } } } return NvCtrlNoAttribute; } /* NvCtrlNvControlGetValidStringDisplayAttributeValues() */ ReturnStatus NvCtrlNvControlGetStringAttribute (NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, char **ptr) { /* Validate */ if (!h || !h->dpy) { return NvCtrlBadHandle; } if (attr == NV_CTRL_STRING_NV_CONTROL_VERSION) { char str[16]; if (h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) { return NvCtrlBadHandle; } sprintf(str, "%d.%d", h->nv->major_version, h->nv->minor_version); *ptr = strdup(str); return NvCtrlSuccess; } if (attr <= NV_CTRL_STRING_LAST_ATTRIBUTE) { if (XNVCTRLQueryTargetStringAttribute (h->dpy, h->target_type, h->target_id, display_mask, attr, ptr)) { return NvCtrlSuccess; } else { return NvCtrlAttributeNotAvailable; } } return NvCtrlNoAttribute; } /* NvCtrlNvControlGetStringAttribute() */ ReturnStatus NvCtrlNvControlSetStringAttribute (NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, const char *ptr, int *ret) { int tmp_int; /* Temp storage if ret is not specified */ if (attr <= NV_CTRL_LAST_ATTRIBUTE) { if ( !ret ) { ret = &tmp_int; } /* NV-CONTROL 1.19 and above has support for setting string attributes * on targets other than X screens. */ if (NV_VERSION2(h->nv->major_version, h->nv->minor_version) >= NV_VERSION2(1, 19)) { *ret = XNVCTRLSetTargetStringAttribute(h->dpy, h->target_type, h->target_id, display_mask, attr, ptr); } else { if (h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) { return NvCtrlBadHandle; } *ret = XNVCTRLSetStringAttribute(h->dpy, h->target_id, display_mask, attr, ptr); } if ( *ret ) { return NvCtrlSuccess; } else { return NvCtrlAttributeNotAvailable; } } return NvCtrlNoAttribute; } /* NvCtrlNvControlSetStringAttribute() */ ReturnStatus NvCtrlNvControlGetBinaryAttribute(NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, unsigned char **data, int *len) { Bool bret; if (!h->nv) return NvCtrlMissingExtension; /* the X_nvCtrlQueryBinaryData opcode was added in 1.7 */ if (NV_VERSION2(h->nv->major_version, h->nv->minor_version) < NV_VERSION2(1, 7)) { return NvCtrlNoAttribute; } bret = XNVCTRLQueryTargetBinaryData (h->dpy, h->target_type, h->target_id, display_mask, attr, data, len); if (!bret) { return NvCtrlError; } else { return NvCtrlSuccess; } } /* NvCtrlNvControlGetBinaryAttribute() */ ReturnStatus NvCtrlNvControlStringOperation(NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, const char *ptrIn, char **ptrOut) { if (attr <= NV_CTRL_STRING_OPERATION_LAST_ATTRIBUTE) { if (XNVCTRLStringOperation (h->dpy, h->target_type, h->target_id, display_mask, attr, ptrIn, ptrOut)) { return NvCtrlSuccess; } else { return NvCtrlAttributeNotAvailable; } } return NvCtrlNoAttribute; } /* NvCtrlNvControlStringOperation() */ ReturnStatus NvCtrlSetGvoColorConversion(NvCtrlAttributeHandle *handle, float colorMatrix[3][3], float colorOffset[3], float colorScale[3]) { NvCtrlAttributePrivateHandle *h; if (!handle) return NvCtrlBadHandle; h = (NvCtrlAttributePrivateHandle *) handle; if (!h->nv) return NvCtrlMissingExtension; if (h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) return NvCtrlBadHandle; XNVCTRLSetGvoColorConversion(h->dpy, h->target_id, colorMatrix, colorOffset, colorScale); return NvCtrlSuccess; } /* NvCtrlNvControlSetGvoColorConversion() */ ReturnStatus NvCtrlGetGvoColorConversion(NvCtrlAttributeHandle *handle, float colorMatrix[3][3], float colorOffset[3], float colorScale[3]) { NvCtrlAttributePrivateHandle *h; Bool bRet; if (!handle) return NvCtrlBadHandle; h = (NvCtrlAttributePrivateHandle *) handle; if (!h->nv) return NvCtrlMissingExtension; if (h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) return NvCtrlBadHandle; bRet = XNVCTRLQueryGvoColorConversion(h->dpy, h->target_id, colorMatrix, colorOffset, colorScale); if (!bRet) { return NvCtrlError; } else { return NvCtrlSuccess; } } /* NvCtrlNvControlGetGvoColorConversion() */ nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributes.c0000664000175000017500000007662612236467170024333 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004,2012 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "NvCtrlAttributes.h" #include "NvCtrlAttributesPrivate.h" #include "NVCtrlLib.h" #include "common-utils.h" #include "msg.h" #include "parse.h" #include #include #include #include /* pow(3) */ #include /* * NvCtrlAttributeInit() - XXX not sure how to handle errors */ NvCtrlAttributeHandle *NvCtrlAttributeInit(Display *dpy, int target_type, int target_id, unsigned int subsystems) { NvCtrlAttributePrivateHandle *h = NULL; h = nvalloc(sizeof (NvCtrlAttributePrivateHandle)); /* initialize the display and screen to the parameter values */ h->dpy = dpy; h->target_type = target_type; h->target_id = target_id; /* initialize the NV-CONTROL attributes; give up if this fails */ if (subsystems & NV_CTRL_ATTRIBUTES_NV_CONTROL_SUBSYSTEM) { h->nv = NvCtrlInitNvControlAttributes(h); if (!h->nv) goto failed; } /* * initialize X Screen specific attributes for X Screen * target types. */ if (target_type == NV_CTRL_TARGET_TYPE_X_SCREEN) { /* * initialize the XF86VidMode attributes; it is OK if this * fails */ if (subsystems & NV_CTRL_ATTRIBUTES_XF86VIDMODE_SUBSYSTEM) { h->vm = NvCtrlInitVidModeAttributes(h); } /* * initialize the XVideo extension and attributes; it is OK if * this fails */ if (subsystems & NV_CTRL_ATTRIBUTES_XVIDEO_SUBSYSTEM) { h->xv = NvCtrlInitXvAttributes(h); } /* * initialize the GLX extension and attributes; it is OK if * this fails */ if (subsystems & NV_CTRL_ATTRIBUTES_GLX_SUBSYSTEM) { h->glx = NvCtrlInitGlxAttributes(h); } } /* X Screen target type attribute subsystems */ /* * initialize the XRandR extension and attributes; this does not * require an X screen and it is OK if this fails */ if (subsystems & NV_CTRL_ATTRIBUTES_XRANDR_SUBSYSTEM) { h->xrandr = NvCtrlInitXrandrAttributes(h); } return (NvCtrlAttributeHandle *) h; failed: if (h) free (h); return NULL; } /* NvCtrlAttributeInit() */ /* * NvCtrlAttributeRebuildSubsystems() - Rebuild specified private subsystem handles */ void NvCtrlAttributeRebuildSubsystems(NvCtrlAttributeHandle *handle, unsigned int subsystem) { NvCtrlAttributePrivateHandle *h; if (!handle) { return; } h = (NvCtrlAttributePrivateHandle*)handle; if (subsystem & NV_CTRL_ATTRIBUTES_XRANDR_SUBSYSTEM) { NvCtrlXrandrAttributesClose(h); h->xrandr = NvCtrlInitXrandrAttributes(h); } } /* NvCtrlAttributeRebuildSubsystems() */ /* * NvCtrlGetDisplayName() - return a string of the form: * * [host]:[display].[screen] * * that describes the X screen associated with this * NvCtrlAttributeHandle. This is done by getting the string that * describes the display connection, and then substituting the correct * screen number. If no hostname is present in the display string, * uname.nodename is prepended. Returns NULL if any error occurs. */ char *NvCtrlGetDisplayName(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; char *display_name; if (!handle) return NULL; h = (NvCtrlAttributePrivateHandle *) handle; display_name = DisplayString(h->dpy); if (h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) { /* Return the display name and # without a screen number */ return nv_standardize_screen_name(display_name, -2); } return nv_standardize_screen_name(display_name, h->target_id); } /* NvCtrlGetDisplayName() */ /* * NvCtrlDisplayPtr() - returns the Display pointer associated with * this NvCtrlAttributeHandle. */ Display *NvCtrlGetDisplayPtr(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return NULL; h = (NvCtrlAttributePrivateHandle *) handle; return h->dpy; } /* NvCtrlDisplayPtr() */ /* * NvCtrlGetScreen() - returns the screen number associated with this * NvCtrlAttributeHandle. */ int NvCtrlGetScreen(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return -1; h = (NvCtrlAttributePrivateHandle *) handle; if (h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) return -1; return h->target_id; } /* NvCtrlGetScreen() */ /* * NvCtrlGetTargetType() - returns the target type associated with this * NvCtrlAttributeHandle. */ int NvCtrlGetTargetType(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return -1; h = (NvCtrlAttributePrivateHandle *) handle; return h->target_type; } /* NvCtrlGetTargetType() */ /* * NvCtrlGetTargetId() - returns the target id number associated with this * NvCtrlAttributeHandle. */ int NvCtrlGetTargetId(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return -1; h = (NvCtrlAttributePrivateHandle *) handle; return h->target_id; } /* NvCtrlGetTargetId() */ /* * NvCtrlGetScreenWidth() - return the width of the screen associated * with this NvCtrlAttributeHandle. */ int NvCtrlGetScreenWidth(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return -1; h = (NvCtrlAttributePrivateHandle *) handle; if (h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) return -1; return DisplayWidth(h->dpy, h->target_id); } /* NvCtrlGetScreenWidth() */ /* * NvCtrlGetScreenHeight() - return the height of the screen * associated with this NvCtrlAttributeHandle. */ int NvCtrlGetScreenHeight(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return -1; h = (NvCtrlAttributePrivateHandle *) handle; if (h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) return -1; return DisplayHeight(h->dpy, h->target_id); } /* NvCtrlGetScreenHeight() */ int NvCtrlGetEventBase(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return -1; h = (NvCtrlAttributePrivateHandle *) handle; if (!h->nv) return -1; return (h->nv->event_base); } /* NvCtrlGetEventBase() */ int NvCtrlGetXrandrEventBase(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return -1; h = (NvCtrlAttributePrivateHandle *) handle; if (!h->xrandr) return -1; return (h->xrandr->event_base); } /* NvCtrlGetXrandrEventBase() */ /* * NvCtrlGetServerVendor() - return the server vendor * information string associated with this * NvCtrlAttributeHandle. */ char *NvCtrlGetServerVendor(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return NULL; h = (NvCtrlAttributePrivateHandle *) handle; if (!h->dpy) return NULL; return ServerVendor(h->dpy); } /* NvCtrlGetServerVendor() */ /* * NvCtrlGetVendorRelease() - return the server vendor * release number associated with this NvCtrlAttributeHandle. */ int NvCtrlGetVendorRelease(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return -1; h = (NvCtrlAttributePrivateHandle *) handle; if (!h->dpy) return -1; return VendorRelease(h->dpy); } /* NvCtrlGetVendorRelease() */ /* * NvCtrlGetScreenCount() - return the number of (logical) * X Screens associated with this NvCtrlAttributeHandle. */ int NvCtrlGetScreenCount(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return -1; h = (NvCtrlAttributePrivateHandle *) handle; if (!h->dpy) return -1; return ScreenCount(h->dpy); } /* NvCtrlGetScreenCount() */ /* * NvCtrlGetProtocolVersion() - Returns the majoy version * number of the X protocol (server). */ int NvCtrlGetProtocolVersion(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return -1; h = (NvCtrlAttributePrivateHandle *) handle; if (!h->dpy) return -1; return ProtocolVersion(h->dpy); } /* NvCtrlGetProtocolVersion() */ /* * NvCtrlGetProtocolRevision() - Returns the revision number * of the X protocol (server). */ int NvCtrlGetProtocolRevision(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return -1; h = (NvCtrlAttributePrivateHandle *) handle; if (!h->dpy) return -1; return ProtocolRevision(h->dpy); } /* NvCtrlGetProtocolRevision() */ /* * NvCtrlGetScreenWidthMM() - return the width (in Millimeters) of the * screen associated with this NvCtrlAttributeHandle. */ int NvCtrlGetScreenWidthMM(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return -1; h = (NvCtrlAttributePrivateHandle *) handle; if (h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) return -1; return DisplayWidthMM(h->dpy, h->target_id); } /* NvCtrlGetScreenWidthMM() */ /* * NvCtrlGetScreenHeightMM() - return the height (in Millimeters) of the * screen associated with this NvCtrlAttributeHandle. */ int NvCtrlGetScreenHeightMM(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return -1; h = (NvCtrlAttributePrivateHandle *) handle; if (h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) return -1; return DisplayHeightMM(h->dpy, h->target_id); } /* NvCtrlGetScreenHeightMM() */ /* * NvCtrlGetScreenPlanes() - return the number of planes (the depth) * of the screen associated with this NvCtrlAttributeHandle. */ int NvCtrlGetScreenPlanes(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return -1; h = (NvCtrlAttributePrivateHandle *) handle; if (h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) return -1; return DisplayPlanes(h->dpy, h->target_id); } /* NvCtrlGetScreenPlanes() */ ReturnStatus NvCtrlQueryTargetCount(NvCtrlAttributeHandle *handle, int target_type, int *val) { NvCtrlAttributePrivateHandle *h; h = (NvCtrlAttributePrivateHandle *) handle; if (!h) return NvCtrlBadArgument; return NvCtrlNvControlQueryTargetCount(handle, target_type, val); } /* NvCtrlQueryTargetCount() */ ReturnStatus NvCtrlGetAttribute(NvCtrlAttributeHandle *handle, int attr, int *val) { if (!handle) return NvCtrlBadArgument; return NvCtrlGetDisplayAttribute(handle, 0, attr, val); } /* NvCtrlGetAttribute() */ ReturnStatus NvCtrlSetAttribute(NvCtrlAttributeHandle *handle, int attr, int val) { if (!handle) return NvCtrlBadArgument; return NvCtrlSetDisplayAttribute(handle, 0, attr, val); } /* NvCtrlSetAttribute() */ ReturnStatus NvCtrlGetAttribute64(NvCtrlAttributeHandle *handle, int attr, int64_t *val) { if (!handle) return NvCtrlBadArgument; return NvCtrlGetDisplayAttribute64(handle, 0, attr, val); } /* NvCtrlGetAttribute64() */ ReturnStatus NvCtrlGetVoidAttribute(NvCtrlAttributeHandle *handle, int attr, void **ptr) { if (!handle) return NvCtrlBadArgument; return NvCtrlGetVoidDisplayAttribute(handle, 0, attr, ptr); } /* NvCtrlGetVoidAttribute() */ ReturnStatus NvCtrlGetValidAttributeValues(NvCtrlAttributeHandle *handle, int attr, NVCTRLAttributeValidValuesRec *val) { if (!handle) return NvCtrlBadArgument; return NvCtrlGetValidDisplayAttributeValues(handle, 0, attr, val); } /* NvCtrlGetValidAttributeValues() */ ReturnStatus NvCtrlGetStringAttribute(NvCtrlAttributeHandle *handle, int attr, char **ptr) { if (!handle) return NvCtrlBadArgument; return NvCtrlGetStringDisplayAttribute(handle, 0, attr, ptr); } /* NvCtrlGetStringAttribute() */ ReturnStatus NvCtrlSetStringAttribute(NvCtrlAttributeHandle *handle, int attr, const char *ptr, int *ret) { if (!handle) return NvCtrlBadArgument; return NvCtrlSetStringDisplayAttribute(handle, 0, attr, ptr, ret); } /* NvCtrlSetStringAttribute() */ ReturnStatus NvCtrlGetDisplayAttribute64(NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, int64_t *val) { NvCtrlAttributePrivateHandle *h; h = (NvCtrlAttributePrivateHandle *) handle; if ((attr >= NV_CTRL_ATTR_EXT_BASE) && (attr <= NV_CTRL_ATTR_EXT_LAST_ATTRIBUTE)) { switch (attr) { case NV_CTRL_ATTR_EXT_NV_PRESENT: *val = (h->nv) ? True : False; break; case NV_CTRL_ATTR_EXT_VM_PRESENT: *val = (h->vm) ? True : False; break; case NV_CTRL_ATTR_EXT_XV_OVERLAY_PRESENT: *val = h->xv && h->xv->overlay; break; case NV_CTRL_ATTR_EXT_XV_TEXTURE_PRESENT: *val = h->xv && h->xv->texture; break; case NV_CTRL_ATTR_EXT_XV_BLITTER_PRESENT: *val = h->xv && h->xv->blitter; break; default: return NvCtrlNoAttribute; } return NvCtrlSuccess; } if (attr >= NV_CTRL_ATTR_RANDR_BASE && attr <= NV_CTRL_ATTR_RANDR_LAST_ATTRIBUTE) { return NvCtrlXrandrGetAttribute(h, display_mask, attr, val); } if (((attr >= 0) && (attr <= NV_CTRL_LAST_ATTRIBUTE)) || ((attr >= NV_CTRL_ATTR_NV_BASE) && (attr <= NV_CTRL_ATTR_NV_LAST_ATTRIBUTE))) { if (!h->nv) return NvCtrlMissingExtension; return NvCtrlNvControlGetAttribute(h, display_mask, attr, val); } return NvCtrlNoAttribute; } /* NvCtrlGetDisplayAttribute64() */ ReturnStatus NvCtrlGetDisplayAttribute(NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, int *val) { ReturnStatus status; int64_t value_64; status = NvCtrlGetDisplayAttribute64(handle, display_mask, attr, &value_64); *val = value_64; return status; } /* NvCtrlGetDisplayAttribute() */ ReturnStatus NvCtrlSetDisplayAttribute(NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, int val) { NvCtrlAttributePrivateHandle *h; h = (NvCtrlAttributePrivateHandle *) handle; if ((attr >= 0) && (attr <= NV_CTRL_LAST_ATTRIBUTE)) { if (!h->nv) return NvCtrlMissingExtension; return NvCtrlNvControlSetAttribute(h, display_mask, attr, val); } return NvCtrlNoAttribute; } ReturnStatus NvCtrlGetVoidDisplayAttribute(NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, void **ptr) { NvCtrlAttributePrivateHandle *h; h = (NvCtrlAttributePrivateHandle *) handle; if ( attr >= NV_CTRL_ATTR_GLX_BASE && attr >= NV_CTRL_ATTR_GLX_LAST_ATTRIBUTE ) { if ( !(h->glx) ) return NvCtrlMissingExtension; return NvCtrlGlxGetVoidAttribute(h, display_mask, attr, ptr); } return NvCtrlNoAttribute; } /* NvCtrlGetVoidDisplayAttribute() */ ReturnStatus NvCtrlGetValidDisplayAttributeValues(NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, NVCTRLAttributeValidValuesRec *val) { NvCtrlAttributePrivateHandle *h; h = (NvCtrlAttributePrivateHandle *) handle; if ((attr >= 0) && (attr <= NV_CTRL_LAST_ATTRIBUTE)) { if (!h->nv) return NvCtrlMissingExtension; return NvCtrlNvControlGetValidAttributeValues(h, display_mask, attr, val); } return NvCtrlNoAttribute; } /* NvCtrlGetValidDisplayAttributeValues() */ /* * GetValidStringDisplayAttributeValuesExtraAttr() -fill the * NVCTRLAttributeValidValuesRec strucure for extra string atrributes i.e. * NvCtrlNvControl*, NvCtrlGlx*, NvCtrlXrandr*, NvCtrlVidMode*, or NvCtrlXv*. */ static ReturnStatus GetValidStringDisplayAttributeValuesExtraAttr(NVCTRLAttributeValidValuesRec *val) { if (val) { memset(val, 0, sizeof(NVCTRLAttributeValidValuesRec)); val->type = ATTRIBUTE_TYPE_STRING; val->permissions = ATTRIBUTE_TYPE_READ | ATTRIBUTE_TYPE_X_SCREEN; return NvCtrlSuccess; } else { return NvCtrlBadArgument; } } /* GetValidStringDisplayAttributeValuesExtraAttr() */ /* * NvCtrlGetValidStringDisplayAttributeValues() -fill the * NVCTRLAttributeValidValuesRec structure for String attributes */ ReturnStatus NvCtrlGetValidStringDisplayAttributeValues(NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, NVCTRLAttributeValidValuesRec *val) { NvCtrlAttributePrivateHandle *h; h = (NvCtrlAttributePrivateHandle *) handle; if ((attr >= 0) && (attr <= NV_CTRL_STRING_LAST_ATTRIBUTE)) { if (!h->nv) return NvCtrlMissingExtension; return NvCtrlNvControlGetValidStringDisplayAttributeValues(h, display_mask, attr, val); } /* * The below string attributes are only available for X screen target * types */ if (h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN) { return NvCtrlAttributeNotAvailable; } if ((attr >= NV_CTRL_STRING_NV_CONTROL_BASE) && (attr <= NV_CTRL_STRING_NV_CONTROL_LAST_ATTRIBUTE)) { if (!h->nv) return NvCtrlMissingExtension; return GetValidStringDisplayAttributeValuesExtraAttr(val); } if ((attr >= NV_CTRL_STRING_GLX_BASE) && (attr <= NV_CTRL_STRING_GLX_LAST_ATTRIBUTE)) { if (!h->glx) return NvCtrlMissingExtension; return GetValidStringDisplayAttributeValuesExtraAttr(val); } if ((attr >= NV_CTRL_STRING_XRANDR_BASE) && (attr <= NV_CTRL_STRING_XRANDR_LAST_ATTRIBUTE)) { if (!h->xrandr) return NvCtrlMissingExtension; return GetValidStringDisplayAttributeValuesExtraAttr(val); } if ((attr >= NV_CTRL_STRING_XF86VIDMODE_BASE) && (attr <= NV_CTRL_STRING_XF86VIDMODE_LAST_ATTRIBUTE)) { if (!h->vm) return NvCtrlMissingExtension; return GetValidStringDisplayAttributeValuesExtraAttr(val); } if ((attr >= NV_CTRL_STRING_XV_BASE) && (attr <= NV_CTRL_STRING_XV_LAST_ATTRIBUTE)) { if (!h->xv) return NvCtrlMissingExtension; return GetValidStringDisplayAttributeValuesExtraAttr(val); } return NvCtrlNoAttribute; } /* NvCtrlGetValidStringDisplayAttributeValues() */ ReturnStatus NvCtrlGetStringDisplayAttribute(NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, char **ptr) { NvCtrlAttributePrivateHandle *h; h = (NvCtrlAttributePrivateHandle *) handle; if ((attr >= 0) && (attr <= NV_CTRL_STRING_LAST_ATTRIBUTE)) { if (!h->nv) return NvCtrlMissingExtension; return NvCtrlNvControlGetStringAttribute(h, display_mask, attr, ptr); } if ((attr >= NV_CTRL_STRING_NV_CONTROL_BASE) && (attr <= NV_CTRL_STRING_NV_CONTROL_LAST_ATTRIBUTE)) { if (!h->nv) return NvCtrlMissingExtension; return NvCtrlNvControlGetStringAttribute(h, display_mask, attr, ptr); } if ((attr >= NV_CTRL_STRING_GLX_BASE) && (attr <= NV_CTRL_STRING_GLX_LAST_ATTRIBUTE)) { if (!h->glx) return NvCtrlMissingExtension; return NvCtrlGlxGetStringAttribute(h, display_mask, attr, ptr); } if ((attr >= NV_CTRL_STRING_XRANDR_BASE) && (attr <= NV_CTRL_STRING_XRANDR_LAST_ATTRIBUTE)) { if (!h->xrandr) return NvCtrlMissingExtension; return NvCtrlXrandrGetStringAttribute(h, display_mask, attr, ptr); } if ((attr >= NV_CTRL_STRING_XF86VIDMODE_BASE) && (attr <= NV_CTRL_STRING_XF86VIDMODE_LAST_ATTRIBUTE)) { if (!h->vm) return NvCtrlMissingExtension; return NvCtrlVidModeGetStringAttribute(h, display_mask, attr, ptr); } if ((attr >= NV_CTRL_STRING_XV_BASE) && (attr <= NV_CTRL_STRING_XV_LAST_ATTRIBUTE)) { if (!h->xv) return NvCtrlMissingExtension; return NvCtrlXvGetStringAttribute(h, display_mask, attr, ptr); } return NvCtrlNoAttribute; } /* NvCtrlGetStringDisplayAttribute() */ ReturnStatus NvCtrlSetStringDisplayAttribute(NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, const char *ptr, int *ret) { NvCtrlAttributePrivateHandle *h; h = (NvCtrlAttributePrivateHandle *) handle; if ((attr >= 0) && (attr <= NV_CTRL_STRING_LAST_ATTRIBUTE)) { if (!h->nv) return NvCtrlMissingExtension; return NvCtrlNvControlSetStringAttribute(h, display_mask, attr, ptr, ret); } return NvCtrlNoAttribute; } ReturnStatus NvCtrlGetBinaryAttribute(NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, unsigned char **data, int *len) { NvCtrlAttributePrivateHandle *h; h = (NvCtrlAttributePrivateHandle *) handle; return NvCtrlNvControlGetBinaryAttribute(h, display_mask, attr, data, len); } /* NvCtrlGetBinaryAttribute() */ ReturnStatus NvCtrlStringOperation(NvCtrlAttributeHandle *handle, unsigned int display_mask, int attr, const char *ptrIn, char **ptrOut) { NvCtrlAttributePrivateHandle *h; h = (NvCtrlAttributePrivateHandle *) handle; if ((attr >= 0) && (attr <= NV_CTRL_STRING_OPERATION_LAST_ATTRIBUTE)) { if (!h->nv) return NvCtrlMissingExtension; return NvCtrlNvControlStringOperation(h, display_mask, attr, ptrIn, ptrOut); } return NvCtrlNoAttribute; } char *NvCtrlAttributesStrError(ReturnStatus status) { switch (status) { case NvCtrlSuccess: return "Success"; break; case NvCtrlBadArgument: return "Bad argument"; break; case NvCtrlBadHandle: return "Bad handle"; break; case NvCtrlNoAttribute: return "No such attribute"; break; case NvCtrlMissingExtension: return "Missing Extension"; break; case NvCtrlReadOnlyAttribute: return "Read only attribute"; break; case NvCtrlWriteOnlyAttribute: return "Write only attribute"; break; case NvCtrlAttributeNotAvailable: return "Attribute not available"; break; case NvCtrlError: /* fall through to default */ default: return "Unknown Error"; break; } } /* NvCtrlAttributesStrError() */ void NvCtrlAttributeClose(NvCtrlAttributeHandle *handle) { NvCtrlAttributePrivateHandle *h; if (!handle) return; h = (NvCtrlAttributePrivateHandle *) handle; /* * XXX should free any additional resources allocated by each * subsystem */ if ( h->glx ) { NvCtrlGlxAttributesClose(h); } if ( h->xrandr ) { NvCtrlXrandrAttributesClose(h); } if ( h->xv ) { NvCtrlXvAttributesClose(h); } free(h); } /* NvCtrlAttributeClose() */ /* * NvCtrlGetMultisampleModeName() - lookup a string describing the * NV-CONTROL constant. */ const char *NvCtrlGetMultisampleModeName(int multisample_mode) { static const char *mode_names[] = { "Off", /* FSAA_MODE_NONE */ "2x (2xMS)", /* FSAA_MODE_2x */ "2x Quincunx", /* FSAA_MODE_2x_5t */ "1.5 x 1.5", /* FSAA_MODE_15x15 */ "2 x 2 Supersampling", /* FSAA_MODE_2x2 */ "4x (4xMS)", /* FSAA_MODE_4x */ "4x, 9-tap Gaussian", /* FSAA_MODE_4x_9t */ "8x (4xMS, 4xCS)", /* FSAA_MODE_8x */ "16x (4xMS, 12xCS)", /* FSAA_MODE_16x */ "8x (4xSS, 2xMS)", /* FSAA_MODE_8xS */ "8x (8xMS)", /* FSAA_MODE_8xQ */ "16x (4xSS, 4xMS)", /* FSAA_MODE_16xS */ "16x (8xMS, 8xCS)", /* FSAA_MODE_16xQ */ "32x (4xSS, 8xMS)", /* FSAA_MODE_32xS */ "32x (8xMS, 24xCS)", /* FSAA_MODE_32x */ "64x (16xSS, 4xMS)", /* FSAA_MODE_64xS */ }; if ((multisample_mode < NV_CTRL_FSAA_MODE_NONE) || (multisample_mode > NV_CTRL_FSAA_MODE_MAX)) { return "Unknown Multisampling"; } return mode_names[multisample_mode]; } /* NvCtrlGetMultisampleModeName */ ReturnStatus NvCtrlGetColorAttributes(NvCtrlAttributeHandle *handle, float contrast[3], float brightness[3], float gamma[3]) { NvCtrlAttributePrivateHandle *h = (NvCtrlAttributePrivateHandle *) handle; if (h->target_type == NV_CTRL_TARGET_TYPE_X_SCREEN) { return NvCtrlVidModeGetColorAttributes(h, contrast, brightness, gamma); } else if (h->target_type == NV_CTRL_TARGET_TYPE_DISPLAY) { return NvCtrlXrandrGetColorAttributes(h, contrast, brightness, gamma); } return NvCtrlBadHandle; } ReturnStatus NvCtrlSetColorAttributes(NvCtrlAttributeHandle *handle, float c[3], float b[3], float g[3], unsigned int bitmask) { ReturnStatus status; int val = 0; NvCtrlAttributePrivateHandle *h = (NvCtrlAttributePrivateHandle *) handle; status = NvCtrlGetAttribute(h, NV_CTRL_ATTR_RANDR_GAMMA_AVAILABLE, &val); if ((status != NvCtrlSuccess || !val) && h->target_type == NV_CTRL_TARGET_TYPE_X_SCREEN) { return NvCtrlVidModeSetColorAttributes(h, c, b, g, bitmask); } else if (status == NvCtrlSuccess && val && h->target_type == NV_CTRL_TARGET_TYPE_DISPLAY) { return NvCtrlXrandrSetColorAttributes(h, c, b, g, bitmask); } return NvCtrlBadHandle; } ReturnStatus NvCtrlGetColorRamp(NvCtrlAttributeHandle *handle, unsigned int channel, uint16_t **lut, int *n) { NvCtrlAttributePrivateHandle *h = (NvCtrlAttributePrivateHandle *) handle; if (h->target_type == NV_CTRL_TARGET_TYPE_X_SCREEN) { return NvCtrlVidModeGetColorRamp(h, channel, lut, n); } else if (h->target_type == NV_CTRL_TARGET_TYPE_DISPLAY) { return NvCtrlXrandrGetColorRamp(h, channel, lut, n); } return NvCtrlBadHandle; } /* helper functions private to the libXNVCtrlAttributes backend */ void NvCtrlInitGammaInputStruct(NvCtrlGammaInput *pGammaInput) { int ch; for (ch = FIRST_COLOR_CHANNEL; ch <= LAST_COLOR_CHANNEL; ch++) { pGammaInput->brightness[ch] = BRIGHTNESS_DEFAULT; pGammaInput->contrast[ch] = CONTRAST_DEFAULT; pGammaInput->gamma[ch] = GAMMA_DEFAULT; } } /* * Compute the gammaRamp entry given its index, and the contrast, * brightness, and gamma. */ static unsigned short ComputeGammaRampVal(int gammaRampSize, int i, float contrast, float brightness, float gamma) { double j, half, scale; int shift, val, num; num = gammaRampSize - 1; shift = 16 - (ffs(gammaRampSize) - 1); scale = (double) num / 3.0; /* how much brightness and contrast affect the value */ j = (double) i; /* contrast */ contrast *= scale; if (contrast > 0.0) { half = ((double) num / 2.0) - 1.0; j -= half; j *= half / (half - contrast); j += half; } else { half = (double) num / 2.0; j -= half; j *= (half + contrast) / half; j += half; } if (j < 0.0) j = 0.0; /* gamma */ gamma = 1.0 / (double) gamma; if (gamma == 1.0) { val = (int) j; } else { val = (int) (pow (j / (double)num, gamma) * (double)num + 0.5); } /* brightness */ brightness *= scale; val += (int)brightness; if (val > num) val = num; if (val < 0) val = 0; val <<= shift; return (unsigned short) val; } void NvCtrlUpdateGammaRamp(const NvCtrlGammaInput *pGammaInput, int gammaRampSize, unsigned short *gammaRamp[3], unsigned int bitmask) { int i, ch; /* update the requested channels within the gammaRamp */ for (ch = FIRST_COLOR_CHANNEL; ch <= LAST_COLOR_CHANNEL; ch++) { /* only update requested channels */ if ((bitmask & (1 << ch)) == 0) { continue; } for (i = 0; i < gammaRampSize; i++) { gammaRamp[ch][i] = ComputeGammaRampVal(gammaRampSize, i, pGammaInput->contrast[ch], pGammaInput->brightness[ch], pGammaInput->gamma[ch]); } } } void NvCtrlAssignGammaInput(NvCtrlGammaInput *pGammaInput, const float inContrast[3], const float inBrightness[3], const float inGamma[3], const unsigned int bitmask) { int ch; /* clamp input, but only the input specified in the bitmask */ for (ch = FIRST_COLOR_CHANNEL; ch <= LAST_COLOR_CHANNEL; ch++) { /* only update requested channels */ if ((bitmask & (1 << ch)) == 0) { continue; } if (bitmask & CONTRAST_VALUE) { if (inContrast[ch] > CONTRAST_MAX) { pGammaInput->contrast[ch] = CONTRAST_MAX; } else if (inContrast[ch] < CONTRAST_MIN) { pGammaInput->contrast[ch] = CONTRAST_MIN; } else { pGammaInput->contrast[ch] = inContrast[ch]; } } if (bitmask & BRIGHTNESS_VALUE) { if (inBrightness[ch] > BRIGHTNESS_MAX) { pGammaInput->brightness[ch] = BRIGHTNESS_MAX; } else if (inBrightness[ch] < BRIGHTNESS_MIN) { pGammaInput->brightness[ch] = BRIGHTNESS_MIN; } else { pGammaInput->brightness[ch] = inBrightness[ch]; } } if (bitmask & GAMMA_VALUE) { if (inGamma[ch] > GAMMA_MAX) { pGammaInput->gamma[ch] = GAMMA_MAX; } else if (inGamma[ch] < GAMMA_MIN) { pGammaInput->gamma[ch] = GAMMA_MIN; } else { pGammaInput->gamma[ch] = inGamma[ch]; } } } } nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributesGlx.c0000664000175000017500000006344512236467170025001 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "NvCtrlAttributes.h" #include "NvCtrlAttributesPrivate.h" #include "NVCtrlLib.h" #include "common-utils.h" #include "msg.h" #include "parse.h" #include #include #include #include #include #include #include #include /* To dynamically load libGL.so */ #include /* GLX #defines */ typedef struct __libGLInfoRec { /* libGL.so library handle */ void *handle; int ref_count; /* # users of the library */ /* OpenGL functions used */ const GLubyte * (* glGetString) (GLenum); /* GLX functions used */ Bool (* glXQueryExtension) (Display *, int *, int *); const char * (* glXQueryServerString) (Display *, int, int); const char * (* glXGetClientString) (Display *, int); const char * (* glXQueryExtensionsString) (Display *, int); Bool (* glXIsDirect) (Display *, GLXContext); Bool (* glXMakeCurrent) (Display *, GLXDrawable, GLXContext); GLXContext (* glXCreateContext) (Display *, XVisualInfo *, GLXContext, Bool); void (* glXDestroyContext) (Display *, GLXContext); XVisualInfo * (* glXChooseVisual) (Display *, int, int *); #ifdef GLX_VERSION_1_3 GLXFBConfig * (* glXGetFBConfigs) (Display *, int, int *); int (* glXGetFBConfigAttrib) (Display *, GLXFBConfig, int, int *); XVisualInfo * (* glXGetVisualFromFBConfig) (Display *, GLXFBConfig); #endif /* GLX_VERSION_1_3 */ } __libGLInfo; static __libGLInfo *__libGL = NULL; /**** * * Provides a way to communicate GLX settings. * * * Currently available attributes: * * GLX Information ----------------- * * direct_rendering - STR * glx_extensions - STR * * * OpenGL -------------------------- * * opengl_vendor_str - STR * opengl_renderer_str - STR * opengl_version_str - STR * opengl_extensions - STR * * * Server GLX Information ---------- * * server_vendor_str - STR * server_version_str - STR * server_extensions - STR * * * Client GLX Information ---------- * * client_vendor_str - STR * client_version_str - STR * client_extensions - STR * * * GLX Frame Buffer Information ---- * * fbconfigs_attrib - ARRAY of GLXFBConfigAttr * ****/ /****************************************************************************** * * Opens libGL for usage * ****/ static Bool open_libgl(void) { const char *error_str = NULL; /* Initialize bookkeeping structure */ if ( !__libGL ) { __libGL = nvalloc(sizeof(__libGLInfo)); } /* Library was already opened */ if ( __libGL->handle ) { __libGL->ref_count++; return True; } /* We are the first to open the library */ __libGL->handle = dlopen("libGL.so.1", RTLD_LAZY); if ( !__libGL->handle ) { error_str = dlerror(); goto fail; } /* Resolve GLX functions */ __libGL->glGetString = NV_DLSYM(__libGL->handle, "glGetString"); if ((error_str = dlerror()) != NULL) goto fail; __libGL->glXQueryExtension = NV_DLSYM(__libGL->handle, "glXQueryExtension"); if ((error_str = dlerror()) != NULL) goto fail; __libGL->glXQueryServerString = NV_DLSYM(__libGL->handle, "glXQueryServerString"); if ((error_str = dlerror()) != NULL) goto fail; __libGL->glXGetClientString = NV_DLSYM(__libGL->handle, "glXGetClientString"); if ((error_str = dlerror()) != NULL) goto fail; __libGL->glXQueryExtensionsString = NV_DLSYM(__libGL->handle, "glXQueryExtensionsString"); if ((error_str = dlerror()) != NULL) goto fail; __libGL->glXIsDirect = NV_DLSYM(__libGL->handle, "glXIsDirect"); if ((error_str = dlerror()) != NULL) goto fail; __libGL->glXMakeCurrent = NV_DLSYM(__libGL->handle, "glXMakeCurrent"); if ((error_str = dlerror()) != NULL) goto fail; __libGL->glXCreateContext = NV_DLSYM(__libGL->handle, "glXCreateContext"); if ((error_str = dlerror()) != NULL) goto fail; __libGL->glXDestroyContext = NV_DLSYM(__libGL->handle, "glXDestroyContext"); if ((error_str = dlerror()) != NULL) goto fail; __libGL->glXChooseVisual = NV_DLSYM(__libGL->handle, "glXChooseVisual"); if ((error_str = dlerror()) != NULL) goto fail; #ifdef GLX_VERSION_1_3 __libGL->glXGetFBConfigs = NV_DLSYM(__libGL->handle, "glXGetFBConfigs"); if ((error_str = dlerror()) != NULL) goto fail; __libGL->glXGetFBConfigAttrib = NV_DLSYM(__libGL->handle, "glXGetFBConfigAttrib"); if ((error_str = dlerror()) != NULL) goto fail; __libGL->glXGetVisualFromFBConfig = NV_DLSYM(__libGL->handle, "glXGetVisualFromFBConfig"); if ((error_str = dlerror()) != NULL) goto fail; #endif /* GLX_VERSION_1_3 */ /* Up the ref count */ __libGL->ref_count++; return True; /* Handle failures */ fail: if ( error_str ) { nv_error_msg("libGL setup error : %s\n", error_str); } if ( __libGL ) { if ( __libGL->handle ) { dlclose(__libGL->handle); __libGL->handle = NULL; } free(__libGL); __libGL = NULL; } return False; } /* open_libgL() */ /****************************************************************************** * * Closes libGL - * ****/ static void close_libgl(void) { if ( __libGL && __libGL->handle && __libGL->ref_count ) { __libGL->ref_count--; if ( __libGL->ref_count == 0 ) { dlclose(__libGL->handle); __libGL->handle = NULL; free(__libGL); __libGL = NULL; } } } /* close_libgl() */ /****************************************************************************** * * NvCtrlInitGlxAttributes() * * Initializes the NvCtrlGlxAttributes Extension by linking the libGL.so.1 and * resolving functions used to retrieve GLX information. * * NOTE: A private dpy is kept due to a libGL.so.1 bug where closing the library * before closing the dpy will cause XCloseDisplay to segfault. * ****/ Bool NvCtrlInitGlxAttributes (NvCtrlAttributePrivateHandle *h) { int event_base; int error_base; /* Check parameters */ if ( !h || !h->dpy || h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN ) { return False; } /* Open libGL.so.1 */ if ( !open_libgl() ) { return False; } /* Verify server support of GLX extension */ if ( !__libGL->glXQueryExtension(h->dpy, &(error_base), &(event_base)) ) { return False; } return True; } /* NvCtrlInitGlxAttributes() */ /****************************************************************************** * * NvCtrlGlxAttributesClose() * * Frees and relinquishes any resource used by the NvCtrlGlxAttributes * extension. * ****/ void NvCtrlGlxAttributesClose (NvCtrlAttributePrivateHandle *h) { if ( !h || !h->glx ) { return; } close_libgl(); h->glx = False; } /* NvCtrlGlxAttributesClose() */ /****************************************************************************** * * get_fbconfig_attribs() * * * Returns an array of GLX Frame Buffer Configuration Attributes for the * given Display/Screen. * * NOTE: A separate display connection is used to avoid the dependence on * libGL when an XCloseDisplay is issued. If we did not, calling * XCloseDisplay AFTER the libGL library has been dlclose'ed (after * having made at least one GLX call) would cause a segfault. * ****/ #ifdef GLX_VERSION_1_3 static GLXFBConfigAttr * get_fbconfig_attribs(NvCtrlAttributePrivateHandle *h) { XVisualInfo * visinfo; GLXFBConfigAttr * fbcas = NULL; GLXFBConfig * fbconfigs = NULL; int nfbconfigs; int i; /* Used for indexing */ int ret; /* Return value of glXGetFBConfigAttr */ assert(h->target_type == NV_CTRL_TARGET_TYPE_X_SCREEN); /* Get all fbconfigs for the display/screen */ fbconfigs = (* (__libGL->glXGetFBConfigs)) (h->dpy, h->target_id, &nfbconfigs); if ( fbconfigs == NULL || nfbconfigs == 0 ) { goto fail; } /* Allocate to hold the fbconfig attributes */ fbcas = nvalloc((nfbconfigs + 1) * sizeof(GLXFBConfigAttr)); /* Query each fbconfig's attributes and populate the attrib array */ for ( i = 0; i < nfbconfigs; i++ ) { /* Get related visual id if any */ visinfo = (* (__libGL->glXGetVisualFromFBConfig)) (h->dpy, fbconfigs[i]); if ( visinfo ) { fbcas[i].visual_id = visinfo->visualid; XFree(visinfo); } else { fbcas[i].visual_id = 0; } ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_FBCONFIG_ID, &(fbcas[i].fbconfig_id)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_BUFFER_SIZE, &(fbcas[i].buffer_size)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_LEVEL, &(fbcas[i].level)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_DOUBLEBUFFER, &(fbcas[i].doublebuffer)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_STEREO, &(fbcas[i].stereo)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_AUX_BUFFERS, &(fbcas[i].aux_buffers)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_RED_SIZE, &(fbcas[i].red_size)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_GREEN_SIZE, &(fbcas[i].green_size)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_BLUE_SIZE, &(fbcas[i].blue_size)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_ALPHA_SIZE, &(fbcas[i].alpha_size)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_DEPTH_SIZE, &(fbcas[i].depth_size)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_STENCIL_SIZE, &(fbcas[i].stencil_size)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_ACCUM_RED_SIZE, &(fbcas[i].accum_red_size)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_ACCUM_GREEN_SIZE, &(fbcas[i].accum_green_size)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_ACCUM_BLUE_SIZE, &(fbcas[i].accum_blue_size)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_ACCUM_ALPHA_SIZE, &(fbcas[i].accum_alpha_size)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_RENDER_TYPE, &(fbcas[i].render_type)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_DRAWABLE_TYPE, &(fbcas[i].drawable_type)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_X_RENDERABLE, &(fbcas[i].x_renderable)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_X_VISUAL_TYPE, &(fbcas[i].x_visual_type)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_CONFIG_CAVEAT, &(fbcas[i].config_caveat)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_TRANSPARENT_TYPE, &(fbcas[i].transparent_type)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_TRANSPARENT_INDEX_VALUE, &(fbcas[i].transparent_index_value)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_TRANSPARENT_RED_VALUE, &(fbcas[i].transparent_red_value)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_TRANSPARENT_GREEN_VALUE, &(fbcas[i].transparent_green_value)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_TRANSPARENT_BLUE_VALUE, &(fbcas[i].transparent_blue_value)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_TRANSPARENT_ALPHA_VALUE, &(fbcas[i].transparent_alpha_value)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_MAX_PBUFFER_WIDTH, &(fbcas[i].pbuffer_width)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_MAX_PBUFFER_HEIGHT, &(fbcas[i].pbuffer_height)); if ( ret != Success ) goto fail; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_MAX_PBUFFER_PIXELS, &(fbcas[i].pbuffer_max)); if ( ret != Success ) goto fail; #if defined(GLX_SAMPLES_ARB) && defined (GLX_SAMPLE_BUFFERS_ARB) fbcas[i].multi_sample_valid = 1; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_SAMPLES_ARB, &(fbcas[i].multi_samples)); if ( ret != Success ) { fbcas[i].multi_sample_valid = 0; } else { ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_SAMPLE_BUFFERS_ARB, &(fbcas[i].multi_sample_buffers)); if ( ret != Success ) { fbcas[i].multi_sample_valid = 0; } } #if defined(GLX_COLOR_SAMPLES_NV) fbcas[i].multi_sample_coverage_valid = 1; ret = (* (__libGL->glXGetFBConfigAttrib))(h->dpy, fbconfigs[i], GLX_COLOR_SAMPLES_NV, &(fbcas[i].multi_samples_color)); if ( ret != Success ) { fbcas[i].multi_sample_coverage_valid = 0; } #else fbcas[i].multi_sample_coverage_valid = 0; #endif #else #warning Multisample extension not found, will not print multisample information! fbcas[i].multi_sample_valid = 0; #endif /* Multisample extension */ } /* Done reading fbconfig information */ XFree(fbconfigs); return fbcas; /* Handle failures */ fail: if ( fbcas ) { free(fbcas); } if ( fbconfigs ) { XFree(fbconfigs); } return NULL; } /* get_fbconfig_attribs() */ #endif /* GLX_VERSION_1_3 */ /****************************************************************************** * * NvCtrlGlxGetVoidAttribute() * * Retrieves various GLX attributes (other than strings and ints) * ****/ ReturnStatus NvCtrlGlxGetVoidAttribute (NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, void **ptr) { GLXFBConfigAttr * fbconfig_attribs = NULL; /* Validate */ if ( !h || !h->dpy || h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN ) { return NvCtrlBadHandle; } if ( !h->glx || !__libGL ) { return NvCtrlMissingExtension; } if ( !ptr ) { return NvCtrlBadArgument; } /* Fetch the right attribute */ switch ( attr ) { #ifdef GLX_VERSION_1_3 case NV_CTRL_ATTR_GLX_FBCONFIG_ATTRIBS: fbconfig_attribs = get_fbconfig_attribs(h); *ptr = fbconfig_attribs; break; #endif default: return NvCtrlNoAttribute; break; } /* Done fetching attribute */ if ( *ptr == NULL ) { return NvCtrlError; } return NvCtrlSuccess; } /* NvCtrlGlxGetAttribute */ /****************************************************************************** * * NvCtrlGlxGetStringAttribute() * * * Retrieves a particular GLX information string by calling the appropriate * OpenGL/GLX function. * * * But first, the following helper function may be used to set up a rendering * context such that valid information may be retrieved. (Having a context is * required for getting OpenGL and 'Direct rendering' information.) * * NOTE: A separate display connection is used to avoid the dependence on * libGL when an XCloseDisplay is issued. If we did not, calling * XCloseDisplay AFTER the libGL library has been dlclose'ed (after * having made at least one GLX call) would cause a segfault. * ****/ /* * Helper function for NvCtrlGlxGetStringAttribute for queries that require a * current context. If getDirect is true, then check if we can create a direct * GLX context and return "Yes" or "No". Otherwise, create a context and query * the GLX implementation for the string specified in prop. */ static const char *getString(NvCtrlAttributePrivateHandle *h, Bool getDirect, GLenum prop) { const char *str = NULL; /* These variables are required for getting some OpenGL/GLX Information */ Window win; Window root; GLXContext ctx; XVisualInfo *visinfo; XSetWindowAttributes win_attr; /* Used for creating a gc */ unsigned long mask; int width = 100; int height = 100; static int attribListSgl[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, None }; root = RootWindow(h->dpy, h->target_id); visinfo = __libGL->glXChooseVisual(h->dpy, h->target_id, &(attribListSgl[0])); if (!visinfo) { return NULL; } win_attr.background_pixel = 0; win_attr.border_pixel = 0; win_attr.colormap = XCreateColormap(h->dpy, root, visinfo->visual, AllocNone); win_attr.event_mask = 0; mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; win = XCreateWindow(h->dpy, root, 0, 0, width, height, 0, visinfo->depth, InputOutput, visinfo->visual, mask, &win_attr); ctx = __libGL->glXCreateContext(h->dpy, visinfo, NULL, True ); if ( ctx ) { __libGL->glXMakeCurrent(h->dpy, win, ctx); } if (getDirect) { str = ((*(__libGL->glXIsDirect))(h->dpy, ctx)) ? "Yes" : "No"; } else { str = (const char *) (* (__libGL->glGetString))(prop); } if (visinfo) { XFree(visinfo); } if (ctx) { __libGL->glXDestroyContext(h->dpy, ctx); } if (win) { XDestroyWindow(h->dpy, win); } return str; } ReturnStatus NvCtrlGlxGetStringAttribute (NvCtrlAttributePrivateHandle *h, unsigned int display_mask, int attr, char **ptr) { const char *str = NULL; /* Validate */ if ( !h || !h->dpy || h->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN ) { return NvCtrlBadHandle; } if ( !h->glx || !__libGL ) { return NvCtrlMissingExtension; } if ( !ptr ) { return NvCtrlBadArgument; } /* Get the right string */ switch (attr) { case NV_CTRL_STRING_GLX_DIRECT_RENDERING: str = getString(h, True, 0); break; case NV_CTRL_STRING_GLX_GLX_EXTENSIONS: str = (* (__libGL->glXQueryExtensionsString))(h->dpy, h->target_id); break; case NV_CTRL_STRING_GLX_SERVER_VENDOR: str = (* (__libGL->glXQueryServerString))(h->dpy, h->target_id, GLX_VENDOR); break; case NV_CTRL_STRING_GLX_SERVER_VERSION: str = (* (__libGL->glXQueryServerString))(h->dpy, h->target_id, GLX_VERSION); break; case NV_CTRL_STRING_GLX_SERVER_EXTENSIONS: str = (* (__libGL->glXQueryServerString))(h->dpy, h->target_id, GLX_EXTENSIONS); break; case NV_CTRL_STRING_GLX_CLIENT_VENDOR: str = (* (__libGL->glXGetClientString))(h->dpy, GLX_VENDOR); break; case NV_CTRL_STRING_GLX_CLIENT_VERSION: str = (* (__libGL->glXGetClientString))(h->dpy, GLX_VERSION); break; case NV_CTRL_STRING_GLX_CLIENT_EXTENSIONS: str = (* (__libGL->glXGetClientString))(h->dpy, GLX_EXTENSIONS); break; case NV_CTRL_STRING_GLX_OPENGL_VENDOR: str = getString(h, False, GL_VENDOR); break; case NV_CTRL_STRING_GLX_OPENGL_RENDERER: str = getString(h, False, GL_RENDERER); break; case NV_CTRL_STRING_GLX_OPENGL_VERSION: str = getString(h, False, GL_VERSION); break; case NV_CTRL_STRING_GLX_OPENGL_EXTENSIONS: str = getString(h, False, GL_EXTENSIONS); break; default: return NvCtrlNoAttribute; break; } /* Done - Fetching corresponding string attribute */ /* Copy the string and return it */ if ( !str || (*ptr = strdup(str)) == NULL ) { return NvCtrlError; } return NvCtrlSuccess; } /* NvCtrlGlxGetStringAttribute() */ nvidia-settings/src/src.mk0000664000175000017500000002656412236467170015766 0ustar albertoalberto############################################################################## # define the list of files that should be built and distributed in the # nvidia-settings source tarball; this is used by the NVIDIA driver # build when packaging the tarball, and by the nvidia-settings # makefile when building nvidia-settings. # # Defines NVIDIA_SETTINGS_SRC, NVIDIA_SETTINGS_EXTRA_DIST, and # NVIDIA_SETTINGS_DIST_FILES ############################################################################## # # files in the src directory of nvidia-settings # SRC_SRC += command-line.c SRC_SRC += config-file.c SRC_SRC += lscf.c SRC_SRC += msg.c SRC_SRC += nvidia-settings.c SRC_SRC += parse.c SRC_SRC += query-assign.c SRC_SRC += app-profiles.c SRC_SRC += glxinfo.c NVIDIA_SETTINGS_SRC += $(SRC_SRC) SRC_EXTRA_DIST += src.mk SRC_EXTRA_DIST += command-line.h SRC_EXTRA_DIST += option-table.h SRC_EXTRA_DIST += config-file.h SRC_EXTRA_DIST += lscf.h SRC_EXTRA_DIST += msg.h SRC_EXTRA_DIST += parse.h SRC_EXTRA_DIST += query-assign.h SRC_EXTRA_DIST += app-profiles.h SRC_EXTRA_DIST += glxinfo.h SRC_EXTRA_DIST += gen-manpage-opts.c NVIDIA_SETTINGS_EXTRA_DIST += $(SRC_EXTRA_DIST) # # files in the src/image_data directory of nvidia-settings # IMAGE_DATA_SRC += IMAGE_DATA_EXTRA_DIST += image_data/HOWTO-ADD-IMAGES IMAGE_DATA_EXTRA_DIST += image_data/antialias.png IMAGE_DATA_EXTRA_DIST += image_data/antialias_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/background.png IMAGE_DATA_EXTRA_DIST += image_data/background_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/background_tall.png IMAGE_DATA_EXTRA_DIST += image_data/background_tall_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/bnc_cable.png IMAGE_DATA_EXTRA_DIST += image_data/bnc_cable_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/bsd.png IMAGE_DATA_EXTRA_DIST += image_data/bsd_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/clock.png IMAGE_DATA_EXTRA_DIST += image_data/clock_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/color.png IMAGE_DATA_EXTRA_DIST += image_data/color_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/config.png IMAGE_DATA_EXTRA_DIST += image_data/config_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/crt.png IMAGE_DATA_EXTRA_DIST += image_data/crt_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/dfp.png IMAGE_DATA_EXTRA_DIST += image_data/dfp_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/display_config.png IMAGE_DATA_EXTRA_DIST += image_data/display_config_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/framelock.png IMAGE_DATA_EXTRA_DIST += image_data/framelock_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/glx.png IMAGE_DATA_EXTRA_DIST += image_data/glx_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/gpu.png IMAGE_DATA_EXTRA_DIST += image_data/gpu_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/gvi.png IMAGE_DATA_EXTRA_DIST += image_data/gvi_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/help.png IMAGE_DATA_EXTRA_DIST += image_data/help_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/led_green.png IMAGE_DATA_EXTRA_DIST += image_data/led_green_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/led_grey.png IMAGE_DATA_EXTRA_DIST += image_data/led_grey_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/led_red.png IMAGE_DATA_EXTRA_DIST += image_data/led_red_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/logo.png IMAGE_DATA_EXTRA_DIST += image_data/logo_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/logo_tall.png IMAGE_DATA_EXTRA_DIST += image_data/logo_tall_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/nvidia_icon.png IMAGE_DATA_EXTRA_DIST += image_data/nvidia_icon_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/opengl.png IMAGE_DATA_EXTRA_DIST += image_data/opengl_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/penguin.png IMAGE_DATA_EXTRA_DIST += image_data/penguin_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/png_to_c_header.sh IMAGE_DATA_EXTRA_DIST += image_data/rj45_input.png IMAGE_DATA_EXTRA_DIST += image_data/rj45_input_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/rj45_output.png IMAGE_DATA_EXTRA_DIST += image_data/rj45_output_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/rj45_unused.png IMAGE_DATA_EXTRA_DIST += image_data/rj45_unused_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/sdi.png IMAGE_DATA_EXTRA_DIST += image_data/sdi_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/sdi_shared_sync_bnc.png IMAGE_DATA_EXTRA_DIST += image_data/sdi_shared_sync_bnc_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/slimm.png IMAGE_DATA_EXTRA_DIST += image_data/slimm_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/solaris.png IMAGE_DATA_EXTRA_DIST += image_data/solaris_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/svp_3dvp.png IMAGE_DATA_EXTRA_DIST += image_data/svp_3dvp_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/thermal.png IMAGE_DATA_EXTRA_DIST += image_data/thermal_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/vcs.png IMAGE_DATA_EXTRA_DIST += image_data/vcs_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/vdpau.png IMAGE_DATA_EXTRA_DIST += image_data/vdpau_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/x.png IMAGE_DATA_EXTRA_DIST += image_data/x_pixdata.h IMAGE_DATA_EXTRA_DIST += image_data/xvideo.png IMAGE_DATA_EXTRA_DIST += image_data/xvideo_pixdata.h NVIDIA_SETTINGS_EXTRA_DIST += $(IMAGE_DATA_EXTRA_DIST) # # files in the src/libXNVCtrlAttributes directory of nvidia-settings # LIB_XNVCTRL_ATTRIBUTES_SRC += libXNVCtrlAttributes/NvCtrlAttributes.c LIB_XNVCTRL_ATTRIBUTES_SRC += libXNVCtrlAttributes/NvCtrlAttributesNvControl.c LIB_XNVCTRL_ATTRIBUTES_SRC += libXNVCtrlAttributes/NvCtrlAttributesVidMode.c LIB_XNVCTRL_ATTRIBUTES_SRC += libXNVCtrlAttributes/NvCtrlAttributesXv.c LIB_XNVCTRL_ATTRIBUTES_SRC += libXNVCtrlAttributes/NvCtrlAttributesGlx.c LIB_XNVCTRL_ATTRIBUTES_SRC += libXNVCtrlAttributes/NvCtrlAttributesXrandr.c NVIDIA_SETTINGS_SRC += $(LIB_XNVCTRL_ATTRIBUTES_SRC) LIB_XNVCTRL_ATTRIBUTES_EXTRA_DIST += libXNVCtrlAttributes/NvCtrlAttributes.h LIB_XNVCTRL_ATTRIBUTES_EXTRA_DIST += libXNVCtrlAttributes/NvCtrlAttributesPrivate.h NVIDIA_SETTINGS_EXTRA_DIST += $(LIB_XNVCTRL_ATTRIBUTES_EXTRA_DIST) # # files in the src/xpm_data directory of nvidia-settings # LIB_XPM_DATA_SRC += LIB_XPM_DATA_EXTRA_DIST += xpm_data/blue_xpm.h LIB_XPM_DATA_EXTRA_DIST += xpm_data/green_xpm.h LIB_XPM_DATA_EXTRA_DIST += xpm_data/red_xpm.h LIB_XPM_DATA_EXTRA_DIST += xpm_data/rgb_xpm.h LIB_XPM_DATA_EXTRA_DIST += xpm_data/svp_add_glasses.h LIB_XPM_DATA_EXTRA_DIST += xpm_data/svp_autopick_next_channel.h LIB_XPM_DATA_EXTRA_DIST += xpm_data/svp_battery_0.h LIB_XPM_DATA_EXTRA_DIST += xpm_data/svp_battery_100.h LIB_XPM_DATA_EXTRA_DIST += xpm_data/svp_battery_25.h LIB_XPM_DATA_EXTRA_DIST += xpm_data/svp_battery_50.h LIB_XPM_DATA_EXTRA_DIST += xpm_data/svp_battery_75.h LIB_XPM_DATA_EXTRA_DIST += xpm_data/svp_status_excellent.h LIB_XPM_DATA_EXTRA_DIST += xpm_data/svp_status_good.h LIB_XPM_DATA_EXTRA_DIST += xpm_data/svp_status_low.h LIB_XPM_DATA_EXTRA_DIST += xpm_data/svp_status_nosignal.h LIB_XPM_DATA_EXTRA_DIST += xpm_data/svp_status_verygood.h LIB_XPM_DATA_EXTRA_DIST += xpm_data/svp_status_verylow.h NVIDIA_SETTINGS_EXTRA_DIST += $(LIB_XPM_DATA_EXTRA_DIST) # # files in the src/gtk+-2.x directory of nvidia-settings # GTK_SRC += gtk+-2.x/ctkxvideo.c GTK_SRC += gtk+-2.x/ctkui.c GTK_SRC += gtk+-2.x/ctkframelock.c GTK_SRC += gtk+-2.x/ctkgauge.c GTK_SRC += gtk+-2.x/ctkcurve.c GTK_SRC += gtk+-2.x/ctkcolorcorrection.c GTK_SRC += gtk+-2.x/ctkcolorcorrectionpage.c GTK_SRC += gtk+-2.x/ctkscale.c GTK_SRC += gtk+-2.x/ctkmultisample.c GTK_SRC += gtk+-2.x/ctkconfig.c GTK_SRC += gtk+-2.x/ctkevent.c GTK_SRC += gtk+-2.x/ctkwindow.c GTK_SRC += gtk+-2.x/ctkopengl.c GTK_SRC += gtk+-2.x/ctkglx.c GTK_SRC += gtk+-2.x/ctkhelp.c GTK_SRC += gtk+-2.x/ctkimagesliders.c GTK_SRC += gtk+-2.x/ctkdisplaydevice.c GTK_SRC += gtk+-2.x/ctkditheringcontrols.c GTK_SRC += gtk+-2.x/ctkthermal.c GTK_SRC += gtk+-2.x/ctkpowermizer.c GTK_SRC += gtk+-2.x/ctkgvo.c GTK_SRC += gtk+-2.x/ctkgvo-csc.c GTK_SRC += gtk+-2.x/ctkdropdownmenu.c GTK_SRC += gtk+-2.x/ctkclocks.c GTK_SRC += gtk+-2.x/ctkutils.c GTK_SRC += gtk+-2.x/ctkedid.c GTK_SRC += gtk+-2.x/ctkserver.c GTK_SRC += gtk+-2.x/ctkdisplaylayout.c GTK_SRC += gtk+-2.x/ctkdisplayconfig.c GTK_SRC += gtk+-2.x/ctkscreen.c GTK_SRC += gtk+-2.x/ctkslimm.c GTK_SRC += gtk+-2.x/ctkgpu.c GTK_SRC += gtk+-2.x/ctkbanner.c GTK_SRC += gtk+-2.x/ctkvcs.c GTK_SRC += gtk+-2.x/ctkdisplayconfig-utils.c GTK_SRC += gtk+-2.x/ctkgvo-banner.c GTK_SRC += gtk+-2.x/ctkgvo-sync.c GTK_SRC += gtk+-2.x/ctkpowersavings.c GTK_SRC += gtk+-2.x/ctkgvi.c GTK_SRC += gtk+-2.x/ctklicense.c GTK_SRC += gtk+-2.x/ctkecc.c GTK_SRC += gtk+-2.x/ctkappprofile.c GTK_SRC += gtk+-2.x/ctkapcprofilemodel.c GTK_SRC += gtk+-2.x/ctkapcrulemodel.c GTK_SRC += gtk+-2.x/ctkcolorcontrols.c GTK_SRC += gtk+-2.x/ctk3dvisionpro.c GTK_SRC += gtk+-2.x/ctkvdpau.c NVIDIA_SETTINGS_SRC += $(GTK_SRC) GTK_EXTRA_DIST += gtk+-2.x/ctkxvideo.h GTK_EXTRA_DIST += gtk+-2.x/ctkui.h GTK_EXTRA_DIST += gtk+-2.x/ctkframelock.h GTK_EXTRA_DIST += gtk+-2.x/ctkgauge.h GTK_EXTRA_DIST += gtk+-2.x/ctkcurve.h GTK_EXTRA_DIST += gtk+-2.x/ctkcolorcorrection.h GTK_EXTRA_DIST += gtk+-2.x/ctkcolorcorrectionpage.h GTK_EXTRA_DIST += gtk+-2.x/ctkscale.h GTK_EXTRA_DIST += gtk+-2.x/ctkmultisample.h GTK_EXTRA_DIST += gtk+-2.x/ctkconfig.h GTK_EXTRA_DIST += gtk+-2.x/ctkevent.h GTK_EXTRA_DIST += gtk+-2.x/ctkwindow.h GTK_EXTRA_DIST += gtk+-2.x/ctkopengl.h GTK_EXTRA_DIST += gtk+-2.x/ctkglx.h GTK_EXTRA_DIST += gtk+-2.x/ctkhelp.h GTK_EXTRA_DIST += gtk+-2.x/ctkimagesliders.h GTK_EXTRA_DIST += gtk+-2.x/ctkdisplaydevice.h GTK_EXTRA_DIST += gtk+-2.x/ctkditheringcontrols.h GTK_EXTRA_DIST += gtk+-2.x/ctkconstants.h GTK_EXTRA_DIST += gtk+-2.x/ctkthermal.h GTK_EXTRA_DIST += gtk+-2.x/ctkpowermizer.h GTK_EXTRA_DIST += gtk+-2.x/ctkgvo.h GTK_EXTRA_DIST += gtk+-2.x/ctkgvo-csc.h GTK_EXTRA_DIST += gtk+-2.x/ctkdropdownmenu.h GTK_EXTRA_DIST += gtk+-2.x/ctkclocks.h GTK_EXTRA_DIST += gtk+-2.x/ctkutils.h GTK_EXTRA_DIST += gtk+-2.x/ctkedid.h GTK_EXTRA_DIST += gtk+-2.x/ctkserver.h GTK_EXTRA_DIST += gtk+-2.x/ctkdisplaylayout.h GTK_EXTRA_DIST += gtk+-2.x/ctkdisplayconfig.h GTK_EXTRA_DIST += gtk+-2.x/ctkscreen.h GTK_EXTRA_DIST += gtk+-2.x/ctkslimm.h GTK_EXTRA_DIST += gtk+-2.x/ctkgpu.h GTK_EXTRA_DIST += gtk+-2.x/ctkbanner.h GTK_EXTRA_DIST += gtk+-2.x/ctkvcs.h GTK_EXTRA_DIST += gtk+-2.x/ctkdisplayconfig-utils.h GTK_EXTRA_DIST += gtk+-2.x/ctkpowersavings.h GTK_EXTRA_DIST += gtk+-2.x/ctkgvo-banner.h GTK_EXTRA_DIST += gtk+-2.x/ctkgvo-sync.h GTK_EXTRA_DIST += gtk+-2.x/ctkgvi.h GTK_EXTRA_DIST += gtk+-2.x/ctklicense.h GTK_EXTRA_DIST += gtk+-2.x/ctkecc.h GTK_EXTRA_DIST += gtk+-2.x/ctkappprofile.h GTK_EXTRA_DIST += gtk+-2.x/ctkapcprofilemodel.h GTK_EXTRA_DIST += gtk+-2.x/ctkapcrulemodel.h GTK_EXTRA_DIST += gtk+-2.x/ctkcolorcontrols.h GTK_EXTRA_DIST += gtk+-2.x/ctk3dvisionpro.h GTK_EXTRA_DIST += gtk+-2.x/ctkvdpau.h NVIDIA_SETTINGS_EXTRA_DIST += $(GTK_EXTRA_DIST) # # files in the src/jansson directory of nvidia-settings # JANSSON_SRC += jansson/load.c JANSSON_SRC += jansson/value.c JANSSON_SRC += jansson/pack_unpack.c JANSSON_SRC += jansson/utf.c JANSSON_SRC += jansson/dump.c JANSSON_SRC += jansson/strconv.c JANSSON_SRC += jansson/strbuffer.c JANSSON_SRC += jansson/memory.c JANSSON_SRC += jansson/error.c JANSSON_SRC += jansson/hashtable.c NVIDIA_SETTINGS_SRC += $(JANSSON_SRC) JANSSON_EXTRA_DIST += jansson/utf.h JANSSON_EXTRA_DIST += jansson/jansson_config.h JANSSON_EXTRA_DIST += jansson/strbuffer.h JANSSON_EXTRA_DIST += jansson/jansson.h JANSSON_EXTRA_DIST += jansson/hashtable.h JANSSON_EXTRA_DIST += jansson/jansson_private.h NVIDIA_SETTINGS_EXTRA_DIST += $(JANSSON_EXTRA_DIST) NVIDIA_SETTINGS_DIST_FILES += $(NVIDIA_SETTINGS_SRC) NVIDIA_SETTINGS_DIST_FILES += $(NVIDIA_SETTINGS_EXTRA_DIST) nvidia-settings/src/lscf.c0000664000175000017500000001773312236467170015737 0ustar albertoalberto#include #include "lscf.h" #if defined(NV_SUNOS) /* Interface to the Solaris Service Management Facility. * This facility is responsible for running programs and services * and store their configuration information (named properties) * The configuration information for the X server are managed by * this facility. The functions in this source file use the library * libscf (Service Configuration Facility) to access and modify * the properties for the X server, more specifically the default depth. * On Solaris, changing the default depth in the xorg.conf file is not * enough. The session manager overrides the xorg.conf default depth: * it passes the option -defdepth to the X server with the value * retrieved from the Service Management Facility. * * For more information refer to the manpages of fmf(5), libsfc(3LIB), * and to the source code of svccfg(1M) available on cvs.opensolaris.org. */ #include static int lscf_init_handle(scf_handle_t **scf_handle, scf_scope_t **scf_scope); static int lscf_select(scf_handle_t *scf_handle, scf_scope_t *scf_scope, const char *selection, scf_service_t **current_svc); static int lscf_setprop_int(scf_handle_t *scf_handle, scf_scope_t *scf_scope, scf_service_t *current_svc, const char *group, const char *name, int value); /* UPDATE THE DEFAULT DEPTH PROPERTY IN SMF WITH THE LIBSCF FUNCTIONS */ int update_scf_depth(int depth) { static scf_handle_t *scf_handle = NULL; static scf_scope_t *scf_scope = NULL; scf_service_t *curren_svc = NULL; int status = 1; // Initialization of the handles lscf_init_handle(&scf_handle, &scf_scope); if (scf_handle == NULL) { status =0; goto done; } // Set the current selection if(!lscf_select(scf_handle, scf_scope, "application/x11/x11-server", ¤_svc)) { status =0; goto done; } // Set the depth property of the current selection if(!lscf_setprop_int(scf_handle, scf_scope, curren_svc, "options", "default_depth", depth)) { status =0; goto done; } done: if(curren_svc) scf_service_destroy(curren_svc); if(scf_scope) scf_scope_destroy(scf_scope); if(scf_handle) { scf_handle_unbind(scf_handle); scf_handle_destroy(scf_handle); } if (!status) { fprintf(stderr, "Unable to set X server default depth through Solaris " "Service Management Facility"); } return status; } /* INITIALIZATION OF THE HANDLES */ static int lscf_init_handle(scf_handle_t **scf_handle, scf_scope_t **scf_scope) { scf_handle_t *handle = NULL; scf_scope_t *scope = NULL;; *scf_handle = NULL; *scf_scope = NULL; // Create a new Service Configuration Facility // handle, needed for the communication with the // configuration repository. handle = scf_handle_create(SCF_VERSION); if (handle == NULL) { return 0; } // Bind the handle to the running svc.config daemon if (scf_handle_bind(handle) != 0) { scf_handle_destroy(handle); return 0; } // Allocate a new scope. A scope is a top level of the // SCF repository tree. scope = scf_scope_create(handle); if (scope == NULL) { scf_handle_unbind(handle); scf_handle_destroy(handle); return 0; } // Set the scope to the root of the local SCF repository tree. if (scf_handle_get_scope(handle, SCF_SCOPE_LOCAL, scope) !=0) { scf_scope_destroy(scope); scf_handle_unbind(handle); scf_handle_destroy(handle); return 0; } *scf_handle = handle; *scf_scope = scope; return 1; } /* EQUIVALENT TO THE SVCCFG SELECT COMMAND */ static int lscf_select(scf_handle_t *scf_handle, scf_scope_t *scf_scope, const char *selection, scf_service_t **current_svc) { scf_service_t *svc; // Services are children of a scope, and // contain configuration information for // the service. svc = scf_service_create(scf_handle); if (svc == NULL) { return 0; } // Set the service 'svc' to the service specified // by 'selection', in the scope 'scf_scope'. if (scf_scope_get_service(scf_scope, selection, svc) == SCF_SUCCESS) { *current_svc = svc; return 1; } scf_service_destroy(svc); return 0; } /* EQUIVALENT TO THE SVCCFG SETPROP COMMAND FOR AN INTEGER TYPED VALUE */ static int lscf_setprop_int(scf_handle_t *scf_handle, scf_scope_t *scf_scope, scf_service_t *current_svc, const char *group, const char *name, int value) { scf_transaction_entry_t *entry=NULL; scf_propertygroup_t *pg = NULL; scf_property_t *prop = NULL; scf_transaction_t *transax = NULL; scf_value_t *v = NULL; int status = 1; // Allocate a new transaction entry handle entry = scf_entry_create(scf_handle); if (entry == NULL) { status=0; goto done; } // Allocate a property group. pg = scf_pg_create(scf_handle); if (pg == NULL) { status=0; goto done; } // Allocate a property. A property is a named set // of values. prop = scf_property_create(scf_handle); if (prop == NULL) { status=0; goto done; } // Allocate a transaction, used to change // property groups. transax = scf_transaction_create(scf_handle); if (transax == NULL) { status=0; goto done; } // Allocate a value. v = scf_value_create(scf_handle); if (v == NULL) { status=0; goto done; } // Set the the property group 'pg' to the // groups specified by 'group' in the service // specified by 'current_svc' if (scf_service_get_pg(current_svc, group, pg) != SCF_SUCCESS) { status=0; goto done; } // Update the property group. if (scf_pg_update(pg) == -1) { status=0; goto done; } // Set up the transaction to modify the property group. if (scf_transaction_start(transax, pg) != SCF_SUCCESS) { status=0; goto done; } // Set the property 'prop' to the property // specified ny 'name' in the property group 'pg' if (scf_pg_get_property(pg, name, prop) == SCF_SUCCESS) { // Found // It should be already of integer type. // To be secure, reset the property type to integer. if (scf_transaction_property_change_type(transax, entry, name, SCF_TYPE_INTEGER) == -1) { status=0; goto done; } } else { // Not found // Add a new property to the property group. if (scf_transaction_property_new(transax, entry, name, SCF_TYPE_INTEGER) == -1) { status=0; goto done; } } // Set the integer value scf_value_set_integer(v, value); // Set up the value to the property. if (scf_entry_add_value(entry, v) != SCF_SUCCESS) { status=0; goto done; } // Commit the transaction if (scf_transaction_commit(transax) < 0) { status=0; } done: if (entry) scf_entry_destroy(entry); if (pg) scf_pg_destroy(pg); if (prop) scf_property_destroy(prop); if (transax) scf_transaction_destroy(transax); if (v) scf_value_destroy(v); return status; } #else // NOT SOLARIS int update_scf_depth(int depth) { return 1; } #endif nvidia-settings/src/version.mk0000664000175000017500000000003012236467170016640 0ustar albertoalbertoNVIDIA_VERSION = 331.20 nvidia-settings/src/command-line.c0000664000175000017500000002216412236467170017345 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include "option-table.h" #include "query-assign.h" #include "msg.h" #include "nvgetopt.h" #include "glxinfo.h" #include "NvCtrlAttributes.h" #include "common-utils.h" /* local prototypes */ static void print_attribute_help(char *attr); static void print_help(void); /* * verbosity, controls output of errors, warnings and other * information (used by msg.c). */ int __verbosity = VERBOSITY_DEPRECATED; int __terse = NV_FALSE; int __display_device_string = NV_FALSE; int __verbosity_level_changed = NV_FALSE; int __list_targets = NV_FALSE; /* * print_version() - print version information */ extern const char *pNV_ID; static void print_version(void) { nv_msg(NULL, ""); nv_msg(NULL, "%s", pNV_ID); nv_msg(TAB, "The NVIDIA X Server Settings tool."); nv_msg(NULL, ""); nv_msg(TAB, "This program is used to configure the " "NVIDIA Linux graphics driver."); nv_msg(TAB, "For more detail, please see the nvidia-settings(1) " "man page."); nv_msg(NULL, ""); nv_msg(TAB, "Copyright (C) 2004 - 2010 NVIDIA Corporation."); nv_msg(NULL, ""); } /* print_version() */ /* * print_attribute_help() - print information about the specified attribute. */ static void print_attribute_help(char *attr) { const AttributeTableEntry *entry; int found = 0; int list_all = 0; int show_desc = 1; if (!strcasecmp(attr, "all")) { list_all = 1; } else if (!strcasecmp(attr, "list")) { list_all = 1; show_desc = 0; } nv_msg(NULL, ""); for (entry = attributeTable; entry->name; entry++) { if (list_all || !strcasecmp(attr, entry->name)) { if (show_desc) { nv_msg(NULL, "Attribute '%s':", entry->name); if (entry->flags & NV_PARSER_TYPE_FRAMELOCK) { nv_msg(NULL, " - Is Frame Lock attribute."); } if (entry->flags & NV_PARSER_TYPE_NO_CONFIG_WRITE) { nv_msg(NULL, " - Attribute is not written to the rc file."); } if (entry->flags & NV_PARSER_TYPE_GUI_ATTRIBUTE) { nv_msg(NULL, " - Is GUI attribute."); } if (entry->flags & NV_PARSER_TYPE_PACKED_ATTRIBUTE) { nv_msg(NULL, " - Attribute value is packed integer."); } if (entry->flags & NV_PARSER_TYPE_VALUE_IS_DISPLAY) { nv_msg(NULL, " - Attribute value is a display mask."); } if (entry->flags & NV_PARSER_TYPE_NO_QUERY_ALL) { nv_msg(NULL, " - Attribute not queried in 'query all'."); } if (entry->flags & NV_PARSER_TYPE_NO_ZERO_VALUE) { nv_msg(NULL, " - Attribute cannot be zero."); } if (entry->flags & NV_PARSER_TYPE_100Hz) { nv_msg(NULL, " - Attribute value is in units of Centihertz (1/100Hz)."); } if (entry->flags & NV_PARSER_TYPE_1000Hz) { nv_msg(NULL, " - Attribute value is in units of Milihertz (1/1000 Hz)."); } if (entry->flags & NV_PARSER_TYPE_STRING_ATTRIBUTE) { nv_msg(NULL, " - Attribute value is string."); } if (entry->flags & NV_PARSER_TYPE_SDI) { nv_msg(NULL, " - Is SDI attribute."); } if (entry->flags & NV_PARSER_TYPE_VALUE_IS_SWITCH_DISPLAY) { nv_msg(NULL, " - Attribute value is switch display."); } if (entry->flags & NV_PARSER_TYPE_VALUE_IS_DISPLAY_ID) { nv_msg(NULL, " - Attribute value is a display id."); } nv_msg(TAB, "%s", entry->desc); nv_msg(NULL, ""); } else { nv_msg(NULL, "%s", entry->name); } found = 1; if (!list_all) break; } } if (!found && !list_all) { nv_error_msg("Unrecognized attribute name '%s'.\n", attr); } } /* print_attribute_help() */ static void print_help_helper(const char *name, const char *description) { nv_msg(TAB, "%s", name); nv_msg_preserve_whitespace(BIGTAB, "%s", description); nv_msg(NULL, ""); } /* * print_help() - loop through the __options[] table, and print the * description of each option. */ void print_help(void) { print_version(); nv_msg(NULL, ""); nv_msg(NULL, "nvidia-settings [options]"); nv_msg(NULL, ""); nvgetopt_print_help(__options, 0, print_help_helper); } /* * parse_command_line() - malloc an Options structure, initialize it * with defaults, and fill in any pertinent data from the commandline * arguments. This must be called after the gui is initialized (so * that the gui can remove its commandline arguments from argv). * * XXX it's unfortunate that we need to init the gui before calling * this, because many of the commandline options will cause us to not * even use the gui. */ Options *parse_command_line(int argc, char *argv[], char *dpy, CtrlHandlesArray *handles_array) { Options *op; int n, c; char *strval; op = nvalloc(sizeof(Options)); op->config = DEFAULT_RC_FILE; /* * initialize the controlled display to the gui display name * passed in. */ op->ctrl_display = dpy; while (1) { c = nvgetopt(argc, argv, __options, &strval, NULL, /* boolval */ NULL, /* intval */ NULL, /* doubleval */ NULL); /* disable_val */ if (c == -1) break; switch (c) { case 'v': print_version(); exit(0); break; case 'h': print_help(); exit(0); break; case 'l': op->only_load = 1; break; case 'n': op->no_load = 1; break; case 'r': op->rewrite = 1; break; case 'c': op->ctrl_display = strval; break; case 'p': op->page = strval; break; case 'V': __verbosity = VERBOSITY_DEFAULT; if (!strval) { /* user didn't give argument, assume "all" */ __verbosity = VERBOSITY_ALL; } else if (nv_strcasecmp(strval, "none") == NV_TRUE) { __verbosity = VERBOSITY_NONE; } else if (nv_strcasecmp(strval, "errors") == NV_TRUE) { __verbosity = VERBOSITY_ERROR; } else if (nv_strcasecmp(strval, "deprecations") == NV_TRUE) { __verbosity = VERBOSITY_DEPRECATED; } else if (nv_strcasecmp(strval, "warnings") == NV_TRUE) { __verbosity = VERBOSITY_WARNING; } else if (nv_strcasecmp(strval, "all") == NV_TRUE) { __verbosity = VERBOSITY_ALL; } else { nv_error_msg("Invalid verbosity level '%s'. Please run " "`%s --help` for usage information.\n", strval, argv[0]); exit(0); } __verbosity_level_changed = NV_TRUE; break; case 'a': n = op->num_assignments; op->assignments = nvrealloc(op->assignments, sizeof(char *) * (n+1)); op->assignments[n] = strval; op->num_assignments++; break; case 'q': n = op->num_queries; op->queries = nvrealloc(op->queries, sizeof(char *) * (n+1)); op->queries[n] = strval; op->num_queries++; break; case CONFIG_FILE_OPTION: op->config = strval; break; case 'g': print_glxinfo(NULL, handles_array); exit(0); break; case 't': __terse = NV_TRUE; break; case 'd': __display_device_string = NV_TRUE; break; case 'e': print_attribute_help(strval); exit(0); break; case 'L': __list_targets = NV_TRUE; break; default: nv_error_msg("Invalid commandline, please run `%s --help` " "for usage information.\n", argv[0]); exit(0); } } /* do tilde expansion on the config file path */ op->config = tilde_expansion(op->config); return op; } /* parse_command_line() */ nvidia-settings/src/common-unix/0000775000175000017500000000000012236467170017102 5ustar albertoalbertonvidia-settings/src/common-unix/virtual-resolutions/0000775000175000017500000000000012236467170023154 5ustar albertoalbertonvidia-settings/src/common-unix/virtual-resolutions/nvvr.h0000664000175000017500000000331212236467170024317 0ustar albertoalberto/* * Copyright (C) 2012-2013 NVIDIA Corporation * * 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. */ #ifndef NVVR_H #define NVVR_H #ifdef __cplusplus extern "C" { #endif typedef struct { int w, h; } NVVRSize; typedef struct { int x, y, w, h; } NVVRBoxRecXYWH; typedef enum NVVRScalingTypeEnum { NVVR_SCALING_ASPECT_SCALED = 0, NVVR_SCALING_SCALED, NVVR_SCALING_CENTERED, } NVVRScalingType; NVVRBoxRecXYWH NVVRGetScaledViewPortOut(const NVVRSize *raster, const NVVRSize *viewPortIn, const NVVRScalingType scaling); const NVVRSize* NVVRGetCommonResolutions(void); #ifdef __cplusplus } #endif #endif /* NVVR_H */ nvidia-settings/src/common-unix/virtual-resolutions/nvvr.c0000664000175000017500000001017012236467170024312 0ustar albertoalberto/* * Copyright (C) 2012-2013 NVIDIA Corporation * * 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. */ #include #include #include "nvvr.h" /*! * Compute ViewPortOut, given raster size, ViewPortIn size, and scaling type. * * ViewPortOut should fit within the raster size, scaled to the raster * size in one dimension, and scaled in the other dimension such that * the aspect ratio of ViewPortIn is preserved. * * \param[in] raster raster size * \param[in] viewPortIn ViewPortIn size * \param[in] scaled scaling type * * \return The ViewPortOut {x,y,w,h} */ NVVRBoxRecXYWH NVVRGetScaledViewPortOut(const NVVRSize *raster, const NVVRSize *viewPortIn, const NVVRScalingType scaling) { NVVRBoxRecXYWH viewPortOut; float scaleX, scaleY; memset(&viewPortOut, 0, sizeof(viewPortOut)); switch (scaling) { default: /* fall through */ case NVVR_SCALING_ASPECT_SCALED: scaleX = (float) raster->w / (float) viewPortIn->w; scaleY = (float) raster->h / (float) viewPortIn->h; if (scaleX < scaleY) { viewPortOut.w = raster->w; viewPortOut.h = viewPortIn->h * scaleX; viewPortOut.x = 0; viewPortOut.y = (raster->h - viewPortOut.h) / 2; } else { viewPortOut.w = viewPortIn->w * scaleY; viewPortOut.h = raster->h; viewPortOut.x = (raster->w - viewPortOut.w) / 2; viewPortOut.y = 0; } break; case NVVR_SCALING_SCALED: viewPortOut.x = 0; viewPortOut.y = 0; viewPortOut.w = raster->w; viewPortOut.h = raster->h; break; case NVVR_SCALING_CENTERED: /* if raster is smaller than viewPortIn, fall back to scaling */ if (raster->w >= viewPortIn->w) { viewPortOut.w = viewPortIn->w; viewPortOut.x = (raster->w - viewPortIn->w) / 2; } else { viewPortOut.w = raster->w; viewPortOut.x = 0; } if (raster->h >= viewPortIn->h) { viewPortOut.h = viewPortIn->h; viewPortOut.y = (raster->h - viewPortIn->h) / 2; } else { viewPortOut.h = raster->h; viewPortOut.y = 0; } break; } return viewPortOut; } /*! * Return a constant array of a (-1, -1) terminated list of common * resolutions. * * \return A constant array of NVVRSize. */ const NVVRSize* NVVRGetCommonResolutions() { static const NVVRSize commonRes[] = { { 3840, 2400 }, { 2560, 1600 }, { 2560, 1440 }, { 1920, 1200 }, { 1920, 1080 }, { 1680, 1050 }, { 1600, 1200 }, { 1440, 900 }, { 1366, 768 }, { 1280, 1024 }, { 1280, 800 }, { 1280, 720 }, { 1024, 768 }, { 800, 600 }, { 640, 480 }, { -1, -1 }, }; return commonRes; } nvidia-settings/src/common-unix/virtual-resolutions/src.mk0000664000175000017500000000025512236467170024276 0ustar albertoalberto# makefile fragment included by nvidia-settings VIRTUAL_RESOLUTIONS_SRC += nvvr.c VIRTUAL_RESOLUTIONS_EXTRA_DIST += nvvr.h VIRTUAL_RESOLUTIONS_EXTRA_DIST += src.mk nvidia-settings/src/jansson/0000775000175000017500000000000012236467170016304 5ustar albertoalbertonvidia-settings/src/jansson/dump.c0000664000175000017500000003001112236467170017410 0ustar albertoalberto/* * Copyright (c) 2009-2012 Petri Lehtinen * * Jansson is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ #define _GNU_SOURCE #include #include #include #include #include "jansson.h" #include "jansson_private.h" #include "strbuffer.h" #include "utf.h" #define MAX_INTEGER_STR_LENGTH 100 #define MAX_REAL_STR_LENGTH 100 struct object_key { size_t serial; const char *key; }; static int dump_to_strbuffer(const char *buffer, size_t size, void *data) { return strbuffer_append_bytes((strbuffer_t *)data, buffer, size); } static int dump_to_file(const char *buffer, size_t size, void *data) { FILE *dest = (FILE *)data; if(fwrite(buffer, size, 1, dest) != 1) return -1; return 0; } /* 32 spaces (the maximum indentation size) */ static char whitespace[] = " "; static int dump_indent(size_t flags, int depth, int space, json_dump_callback_t dump, void *data) { if(JSON_INDENT(flags) > 0) { int i, ws_count = JSON_INDENT(flags); if(dump("\n", 1, data)) return -1; for(i = 0; i < depth; i++) { if(dump(whitespace, ws_count, data)) return -1; } } else if(space && !(flags & JSON_COMPACT)) { return dump(" ", 1, data); } return 0; } static int dump_string(const char *str, json_dump_callback_t dump, void *data, size_t flags) { const char *pos, *end; int32_t codepoint; if(dump("\"", 1, data)) return -1; end = pos = str; while(1) { const char *text; char seq[13]; int length; while(*end) { end = utf8_iterate(pos, &codepoint); if(!end) return -1; /* mandatory escape or control char */ if(codepoint == '\\' || codepoint == '"' || codepoint < 0x20) break; /* slash */ if((flags & JSON_ESCAPE_SLASH) && codepoint == '/') break; /* non-ASCII */ if((flags & JSON_ENSURE_ASCII) && codepoint > 0x7F) break; pos = end; } if(pos != str) { if(dump(str, pos - str, data)) return -1; } if(end == pos) break; /* handle \, /, ", and control codes */ length = 2; switch(codepoint) { case '\\': text = "\\\\"; break; case '\"': text = "\\\""; break; case '\b': text = "\\b"; break; case '\f': text = "\\f"; break; case '\n': text = "\\n"; break; case '\r': text = "\\r"; break; case '\t': text = "\\t"; break; case '/': text = "\\/"; break; default: { /* codepoint is in BMP */ if(codepoint < 0x10000) { sprintf(seq, "\\u%04x", codepoint); length = 6; } /* not in BMP -> construct a UTF-16 surrogate pair */ else { int32_t first, last; codepoint -= 0x10000; first = 0xD800 | ((codepoint & 0xffc00) >> 10); last = 0xDC00 | (codepoint & 0x003ff); sprintf(seq, "\\u%04x\\u%04x", first, last); length = 12; } text = seq; break; } } if(dump(text, length, data)) return -1; str = pos = end; } return dump("\"", 1, data); } static int object_key_compare_keys(const void *key1, const void *key2) { return strcmp(((const struct object_key *)key1)->key, ((const struct object_key *)key2)->key); } static int object_key_compare_serials(const void *key1, const void *key2) { size_t a = ((const struct object_key *)key1)->serial; size_t b = ((const struct object_key *)key2)->serial; return a < b ? -1 : a == b ? 0 : 1; } static int do_dump(const json_t *json, size_t flags, int depth, json_dump_callback_t dump, void *data) { switch(json_typeof(json)) { case JSON_NULL: return dump("null", 4, data); case JSON_TRUE: return dump("true", 4, data); case JSON_FALSE: return dump("false", 5, data); case JSON_INTEGER: { char buffer[MAX_INTEGER_STR_LENGTH]; int size; size = snprintf(buffer, MAX_INTEGER_STR_LENGTH, "%" JSON_INTEGER_FORMAT, json_integer_value(json)); if(size < 0 || size >= MAX_INTEGER_STR_LENGTH) return -1; return dump(buffer, size, data); } case JSON_REAL: { char buffer[MAX_REAL_STR_LENGTH]; int size; double value = json_real_value(json); size = jsonp_dtostr(buffer, MAX_REAL_STR_LENGTH, value); if(size < 0) return -1; return dump(buffer, size, data); } case JSON_STRING: return dump_string(json_string_value(json), dump, data, flags); case JSON_ARRAY: { int i; int n; json_array_t *array; /* detect circular references */ array = json_to_array(json); if(array->visited) goto array_error; array->visited = 1; n = json_array_size(json); if(dump("[", 1, data)) goto array_error; if(n == 0) { array->visited = 0; return dump("]", 1, data); } if(dump_indent(flags, depth + 1, 0, dump, data)) goto array_error; for(i = 0; i < n; ++i) { if(do_dump(json_array_get(json, i), flags, depth + 1, dump, data)) goto array_error; if(i < n - 1) { if(dump(",", 1, data) || dump_indent(flags, depth + 1, 1, dump, data)) goto array_error; } else { if(dump_indent(flags, depth, 0, dump, data)) goto array_error; } } array->visited = 0; return dump("]", 1, data); array_error: array->visited = 0; return -1; } case JSON_OBJECT: { json_object_t *object; void *iter; const char *separator; int separator_length; if(flags & JSON_COMPACT) { separator = ":"; separator_length = 1; } else { separator = ": "; separator_length = 2; } /* detect circular references */ object = json_to_object(json); if(object->visited) goto object_error; object->visited = 1; iter = json_object_iter((json_t *)json); if(dump("{", 1, data)) goto object_error; if(!iter) { object->visited = 0; return dump("}", 1, data); } if(dump_indent(flags, depth + 1, 0, dump, data)) goto object_error; if(flags & JSON_SORT_KEYS || flags & JSON_PRESERVE_ORDER) { struct object_key *keys; size_t size, i; int (*cmp_func)(const void *, const void *); size = json_object_size(json); keys = jsonp_malloc(size * sizeof(struct object_key)); if(!keys) goto object_error; i = 0; while(iter) { keys[i].serial = hashtable_iter_serial(iter); keys[i].key = json_object_iter_key(iter); iter = json_object_iter_next((json_t *)json, iter); i++; } assert(i == size); if(flags & JSON_SORT_KEYS) cmp_func = object_key_compare_keys; else cmp_func = object_key_compare_serials; qsort(keys, size, sizeof(struct object_key), cmp_func); for(i = 0; i < size; i++) { const char *key; json_t *value; key = keys[i].key; value = json_object_get(json, key); assert(value); dump_string(key, dump, data, flags); if(dump(separator, separator_length, data) || do_dump(value, flags, depth + 1, dump, data)) { jsonp_free(keys); goto object_error; } if(i < size - 1) { if(dump(",", 1, data) || dump_indent(flags, depth + 1, 1, dump, data)) { jsonp_free(keys); goto object_error; } } else { if(dump_indent(flags, depth, 0, dump, data)) { jsonp_free(keys); goto object_error; } } } jsonp_free(keys); } else { /* Don't sort keys */ while(iter) { void *next = json_object_iter_next((json_t *)json, iter); dump_string(json_object_iter_key(iter), dump, data, flags); if(dump(separator, separator_length, data) || do_dump(json_object_iter_value(iter), flags, depth + 1, dump, data)) goto object_error; if(next) { if(dump(",", 1, data) || dump_indent(flags, depth + 1, 1, dump, data)) goto object_error; } else { if(dump_indent(flags, depth, 0, dump, data)) goto object_error; } iter = next; } } object->visited = 0; return dump("}", 1, data); object_error: object->visited = 0; return -1; } default: /* not reached */ return -1; } } char *json_dumps(const json_t *json, size_t flags) { strbuffer_t strbuff; char *result; if(strbuffer_init(&strbuff)) return NULL; if(json_dump_callback(json, dump_to_strbuffer, (void *)&strbuff, flags)) result = NULL; else result = jsonp_strdup(strbuffer_value(&strbuff)); strbuffer_close(&strbuff); return result; } int json_dumpf(const json_t *json, FILE *output, size_t flags) { return json_dump_callback(json, dump_to_file, (void *)output, flags); } int json_dump_file(const json_t *json, const char *path, size_t flags) { int result; FILE *output = fopen(path, "w"); if(!output) return -1; result = json_dumpf(json, output, flags); fclose(output); return result; } int json_dump_callback(const json_t *json, json_dump_callback_t callback, void *data, size_t flags) { if(!(flags & JSON_ENCODE_ANY)) { if(!json_is_array(json) && !json_is_object(json)) return -1; } return do_dump(json, flags, 0, callback, data); } nvidia-settings/src/jansson/strbuffer.h0000664000175000017500000000155212236467170020462 0ustar albertoalberto/* * Copyright (c) 2009-2012 Petri Lehtinen * * Jansson is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ #ifndef STRBUFFER_H #define STRBUFFER_H typedef struct { char *value; size_t length; /* bytes used */ size_t size; /* bytes allocated */ } strbuffer_t; int strbuffer_init(strbuffer_t *strbuff); void strbuffer_close(strbuffer_t *strbuff); void strbuffer_clear(strbuffer_t *strbuff); const char *strbuffer_value(const strbuffer_t *strbuff); char *strbuffer_steal_value(strbuffer_t *strbuff); int strbuffer_append(strbuffer_t *strbuff, const char *string); int strbuffer_append_byte(strbuffer_t *strbuff, char byte); int strbuffer_append_bytes(strbuffer_t *strbuff, const char *data, size_t size); char strbuffer_pop(strbuffer_t *strbuff); #endif nvidia-settings/src/jansson/strconv.c0000664000175000017500000000532412236467170020152 0ustar albertoalberto#include #include #include #include #include "jansson_private.h" #include "strbuffer.h" #if JSON_HAVE_LOCALECONV #include /* - This code assumes that the decimal separator is exactly one character. - If setlocale() is called by another thread between the call to localeconv() and the call to sprintf() or strtod(), the result may be wrong. setlocale() is not thread-safe and should not be used this way. Multi-threaded programs should use uselocale() instead. */ static void to_locale(strbuffer_t *strbuffer) { const char *point; char *pos; point = localeconv()->decimal_point; if(*point == '.') { /* No conversion needed */ return; } pos = strchr(strbuffer->value, '.'); if(pos) *pos = *point; } static void from_locale(char *buffer) { const char *point; char *pos; point = localeconv()->decimal_point; if(*point == '.') { /* No conversion needed */ return; } pos = strchr(buffer, *point); if(pos) *pos = '.'; } #endif int jsonp_strtod(strbuffer_t *strbuffer, double *out) { double value; char *end; #if JSON_HAVE_LOCALECONV to_locale(strbuffer); #endif errno = 0; value = strtod(strbuffer->value, &end); assert(end == strbuffer->value + strbuffer->length); if(errno == ERANGE && value != 0) { /* Overflow */ return -1; } *out = value; return 0; } int jsonp_dtostr(char *buffer, size_t size, double value) { int ret; char *start, *end; size_t length; ret = snprintf(buffer, size, "%.17g", value); if(ret < 0) return -1; length = (size_t)ret; if(length >= size) return -1; #if JSON_HAVE_LOCALECONV from_locale(buffer); #endif /* Make sure there's a dot or 'e' in the output. Otherwise a real is converted to an integer when decoding */ if(strchr(buffer, '.') == NULL && strchr(buffer, 'e') == NULL) { if(length + 3 >= size) { /* No space to append ".0" */ return -1; } buffer[length] = '.'; buffer[length + 1] = '0'; buffer[length + 2] = '\0'; length += 2; } /* Remove leading '+' from positive exponent. Also remove leading zeros from exponents (added by some printf() implementations) */ start = strchr(buffer, 'e'); if(start) { start++; end = start + 1; if(*start == '-') start++; while(*end == '0') end++; if(end != start) { memmove(start, end, length - (size_t)(end - buffer)); length -= (size_t)(end - start); } } return (int)length; } nvidia-settings/src/jansson/jansson_private.h0000664000175000017500000000464512236467170021673 0ustar albertoalberto/* * Copyright (c) 2009-2012 Petri Lehtinen * * Jansson is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ #ifndef JANSSON_PRIVATE_H #define JANSSON_PRIVATE_H #include #include "jansson.h" #include "hashtable.h" #include "strbuffer.h" #define container_of(ptr_, type_, member_) \ ((type_ *)((char *)ptr_ - offsetof(type_, member_))) /* On some platforms, max() may already be defined */ #ifndef max #define max(a, b) ((a) > (b) ? (a) : (b)) #endif /* va_copy is a C99 feature. In C89 implementations, it's sometimes available as __va_copy. If not, memcpy() should do the trick. */ #ifndef va_copy #ifdef __va_copy #define va_copy __va_copy #else #define va_copy(a, b) memcpy(&(a), &(b), sizeof(va_list)) #endif #endif typedef struct { json_t json; hashtable_t hashtable; size_t serial; int visited; } json_object_t; typedef struct { json_t json; size_t size; size_t entries; json_t **table; int visited; } json_array_t; typedef struct { json_t json; char *value; } json_string_t; typedef struct { json_t json; double value; } json_real_t; typedef struct { json_t json; json_int_t value; } json_integer_t; #define json_to_object(json_) container_of(json_, json_object_t, json) #define json_to_array(json_) container_of(json_, json_array_t, json) #define json_to_string(json_) container_of(json_, json_string_t, json) #define json_to_real(json_) container_of(json_, json_real_t, json) #define json_to_integer(json_) container_of(json_, json_integer_t, json) void jsonp_error_init(json_error_t *error, const char *source); void jsonp_error_set_source(json_error_t *error, const char *source); void jsonp_error_set(json_error_t *error, int line, int column, size_t position, const char *msg, ...); void jsonp_error_vset(json_error_t *error, int line, int column, size_t position, const char *msg, va_list ap); /* Locale independent string<->double conversions */ int jsonp_strtod(strbuffer_t *strbuffer, double *out); int jsonp_dtostr(char *buffer, size_t size, double value); /* Wrappers for custom memory functions */ void* jsonp_malloc(size_t size); void jsonp_free(void *ptr); char *jsonp_strdup(const char *str); /* Windows compatibility */ #ifdef _WIN32 #define snprintf _snprintf #define vsnprintf _vsnprintf #endif #endif nvidia-settings/src/jansson/hashtable.h0000664000175000017500000001120612236467170020410 0ustar albertoalberto/* * Copyright (c) 2009-2012 Petri Lehtinen * * This library is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ #ifndef HASHTABLE_H #define HASHTABLE_H struct hashtable_list { struct hashtable_list *prev; struct hashtable_list *next; }; /* "pair" may be a bit confusing a name, but think of it as a key-value pair. In this case, it just encodes some extra data, too */ struct hashtable_pair { size_t hash; struct hashtable_list list; json_t *value; size_t serial; char key[1]; }; struct hashtable_bucket { struct hashtable_list *first; struct hashtable_list *last; }; typedef struct hashtable { size_t size; struct hashtable_bucket *buckets; size_t num_buckets; /* index to primes[] */ struct hashtable_list list; } hashtable_t; #define hashtable_key_to_iter(key_) \ (&(container_of(key_, struct hashtable_pair, key)->list)) /** * hashtable_init - Initialize a hashtable object * * @hashtable: The (statically allocated) hashtable object * * Initializes a statically allocated hashtable object. The object * should be cleared with hashtable_close when it's no longer used. * * Returns 0 on success, -1 on error (out of memory). */ int hashtable_init(hashtable_t *hashtable); /** * hashtable_close - Release all resources used by a hashtable object * * @hashtable: The hashtable * * Destroys a statically allocated hashtable object. */ void hashtable_close(hashtable_t *hashtable); /** * hashtable_set - Add/modify value in hashtable * * @hashtable: The hashtable object * @key: The key * @serial: For addition order of keys * @value: The value * * If a value with the given key already exists, its value is replaced * with the new value. Value is "stealed" in the sense that hashtable * doesn't increment its refcount but decreases the refcount when the * value is no longer needed. * * Returns 0 on success, -1 on failure (out of memory). */ int hashtable_set(hashtable_t *hashtable, const char *key, size_t serial, json_t *value); /** * hashtable_get - Get a value associated with a key * * @hashtable: The hashtable object * @key: The key * * Returns value if it is found, or NULL otherwise. */ void *hashtable_get(hashtable_t *hashtable, const char *key); /** * hashtable_del - Remove a value from the hashtable * * @hashtable: The hashtable object * @key: The key * * Returns 0 on success, or -1 if the key was not found. */ int hashtable_del(hashtable_t *hashtable, const char *key); /** * hashtable_clear - Clear hashtable * * @hashtable: The hashtable object * * Removes all items from the hashtable. */ void hashtable_clear(hashtable_t *hashtable); /** * hashtable_iter - Iterate over hashtable * * @hashtable: The hashtable object * * Returns an opaque iterator to the first element in the hashtable. * The iterator should be passed to hashtable_iter_* functions. * The hashtable items are not iterated over in any particular order. * * There's no need to free the iterator in any way. The iterator is * valid as long as the item that is referenced by the iterator is not * deleted. Other values may be added or deleted. In particular, * hashtable_iter_next() may be called on an iterator, and after that * the key/value pair pointed by the old iterator may be deleted. */ void *hashtable_iter(hashtable_t *hashtable); /** * hashtable_iter_at - Return an iterator at a specific key * * @hashtable: The hashtable object * @key: The key that the iterator should point to * * Like hashtable_iter() but returns an iterator pointing to a * specific key. */ void *hashtable_iter_at(hashtable_t *hashtable, const char *key); /** * hashtable_iter_next - Advance an iterator * * @hashtable: The hashtable object * @iter: The iterator * * Returns a new iterator pointing to the next element in the * hashtable or NULL if the whole hastable has been iterated over. */ void *hashtable_iter_next(hashtable_t *hashtable, void *iter); /** * hashtable_iter_key - Retrieve the key pointed by an iterator * * @iter: The iterator */ void *hashtable_iter_key(void *iter); /** * hashtable_iter_serial - Retrieve the serial number pointed to by an iterator * * @iter: The iterator */ size_t hashtable_iter_serial(void *iter); /** * hashtable_iter_value - Retrieve the value pointed by an iterator * * @iter: The iterator */ void *hashtable_iter_value(void *iter); /** * hashtable_iter_set - Set the value pointed by an iterator * * @iter: The iterator * @value: The value to set */ void hashtable_iter_set(void *iter, json_t *value); #endif nvidia-settings/src/jansson/load.c0000664000175000017500000006053512236467170017400 0ustar albertoalberto/* * Copyright (c) 2009-2012 Petri Lehtinen * * Jansson is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ #define _GNU_SOURCE #include #include #include #include #include #include #include "jansson.h" #include "jansson_private.h" #include "strbuffer.h" #include "utf.h" #define STREAM_STATE_OK 0 #define STREAM_STATE_EOF -1 #define STREAM_STATE_ERROR -2 #define TOKEN_INVALID -1 #define TOKEN_EOF 0 #define TOKEN_STRING 256 #define TOKEN_INTEGER 257 #define TOKEN_REAL 258 #define TOKEN_TRUE 259 #define TOKEN_FALSE 260 #define TOKEN_NULL 261 /* Locale independent versions of isxxx() functions */ #define l_isupper(c) ('A' <= (c) && (c) <= 'Z') #define l_islower(c) ('a' <= (c) && (c) <= 'z') #define l_isalpha(c) (l_isupper(c) || l_islower(c)) #define l_isdigit(c) ('0' <= (c) && (c) <= '9') #define l_isxdigit(c) \ (l_isdigit(c) || 'A' <= (c) || (c) <= 'F' || 'a' <= (c) || (c) <= 'f') /* Read one byte from stream, convert to unsigned char, then int, and return. return EOF on end of file. This corresponds to the behaviour of fgetc(). */ typedef int (*get_func)(void *data); typedef struct { get_func get; void *data; char buffer[5]; size_t buffer_pos; int state; int line; int column, last_column; size_t position; } stream_t; typedef struct { stream_t stream; strbuffer_t saved_text; int token; union { char *string; json_int_t integer; double real; } value; } lex_t; #define stream_to_lex(stream) container_of(stream, lex_t, stream) /*** error reporting ***/ static void error_set(json_error_t *error, const lex_t *lex, const char *msg, ...) { va_list ap; char msg_text[JSON_ERROR_TEXT_LENGTH]; char msg_with_context[JSON_ERROR_TEXT_LENGTH]; int line = -1, col = -1; size_t pos = 0; const char *result = msg_text; if(!error) return; va_start(ap, msg); vsnprintf(msg_text, JSON_ERROR_TEXT_LENGTH, msg, ap); msg_text[JSON_ERROR_TEXT_LENGTH - 1] = '\0'; va_end(ap); if(lex) { const char *saved_text = strbuffer_value(&lex->saved_text); line = lex->stream.line; col = lex->stream.column; pos = lex->stream.position; if(saved_text && saved_text[0]) { if(lex->saved_text.length <= 20) { snprintf(msg_with_context, JSON_ERROR_TEXT_LENGTH, "%s near '%s'", msg_text, saved_text); msg_with_context[JSON_ERROR_TEXT_LENGTH - 1] = '\0'; result = msg_with_context; } } else { if(lex->stream.state == STREAM_STATE_ERROR) { /* No context for UTF-8 decoding errors */ result = msg_text; } else { snprintf(msg_with_context, JSON_ERROR_TEXT_LENGTH, "%s near end of file", msg_text); msg_with_context[JSON_ERROR_TEXT_LENGTH - 1] = '\0'; result = msg_with_context; } } } jsonp_error_set(error, line, col, pos, "%s", result); } /*** lexical analyzer ***/ static void stream_init(stream_t *stream, get_func get, void *data) { stream->get = get; stream->data = data; stream->buffer[0] = '\0'; stream->buffer_pos = 0; stream->state = STREAM_STATE_OK; stream->line = 1; stream->column = 0; stream->position = 0; } static int stream_get(stream_t *stream, json_error_t *error) { int c; if(stream->state != STREAM_STATE_OK) return stream->state; if(!stream->buffer[stream->buffer_pos]) { c = stream->get(stream->data); if(c == EOF) { stream->state = STREAM_STATE_EOF; return STREAM_STATE_EOF; } stream->buffer[0] = c; stream->buffer_pos = 0; if(0x80 <= c && c <= 0xFF) { /* multi-byte UTF-8 sequence */ int i, count; count = utf8_check_first(c); if(!count) goto out; assert(count >= 2); for(i = 1; i < count; i++) stream->buffer[i] = stream->get(stream->data); if(!utf8_check_full(stream->buffer, count, NULL)) goto out; stream->buffer[count] = '\0'; } else stream->buffer[1] = '\0'; } c = stream->buffer[stream->buffer_pos++]; stream->position++; if(c == '\n') { stream->line++; stream->last_column = stream->column; stream->column = 0; } else if(utf8_check_first(c)) { /* track the Unicode character column, so increment only if this is the first character of a UTF-8 sequence */ stream->column++; } return c; out: stream->state = STREAM_STATE_ERROR; error_set(error, stream_to_lex(stream), "unable to decode byte 0x%x", c); return STREAM_STATE_ERROR; } static void stream_unget(stream_t *stream, int c) { if(c == STREAM_STATE_EOF || c == STREAM_STATE_ERROR) return; stream->position--; if(c == '\n') { stream->line--; stream->column = stream->last_column; } else if(utf8_check_first(c)) stream->column--; assert(stream->buffer_pos > 0); stream->buffer_pos--; assert(stream->buffer[stream->buffer_pos] == c); } static int lex_get(lex_t *lex, json_error_t *error) { return stream_get(&lex->stream, error); } static void lex_save(lex_t *lex, int c) { strbuffer_append_byte(&lex->saved_text, c); } static int lex_get_save(lex_t *lex, json_error_t *error) { int c = stream_get(&lex->stream, error); if(c != STREAM_STATE_EOF && c != STREAM_STATE_ERROR) lex_save(lex, c); return c; } static void lex_unget(lex_t *lex, int c) { stream_unget(&lex->stream, c); } static void lex_unget_unsave(lex_t *lex, int c) { if(c != STREAM_STATE_EOF && c != STREAM_STATE_ERROR) { char d; stream_unget(&lex->stream, c); d = strbuffer_pop(&lex->saved_text); assert(c == d); } } static void lex_save_cached(lex_t *lex) { while(lex->stream.buffer[lex->stream.buffer_pos] != '\0') { lex_save(lex, lex->stream.buffer[lex->stream.buffer_pos]); lex->stream.buffer_pos++; lex->stream.position++; } } /* assumes that str points to 'u' plus at least 4 valid hex digits */ static int32_t decode_unicode_escape(const char *str) { int i; int32_t value = 0; assert(str[0] == 'u'); for(i = 1; i <= 4; i++) { char c = str[i]; value <<= 4; if(l_isdigit(c)) value += c - '0'; else if(l_islower(c)) value += c - 'a' + 10; else if(l_isupper(c)) value += c - 'A' + 10; else assert(0); } return value; } static void lex_scan_string(lex_t *lex, json_error_t *error) { int c; const char *p; char *t; int i; lex->value.string = NULL; lex->token = TOKEN_INVALID; c = lex_get_save(lex, error); while(c != '"') { if(c == STREAM_STATE_ERROR) goto out; else if(c == STREAM_STATE_EOF) { error_set(error, lex, "premature end of input"); goto out; } else if(0 <= c && c <= 0x1F) { /* control character */ lex_unget_unsave(lex, c); if(c == '\n') error_set(error, lex, "unexpected newline", c); else error_set(error, lex, "control character 0x%x", c); goto out; } else if(c == '\\') { c = lex_get_save(lex, error); if(c == 'u') { c = lex_get_save(lex, error); for(i = 0; i < 4; i++) { if(!l_isxdigit(c)) { error_set(error, lex, "invalid escape"); goto out; } c = lex_get_save(lex, error); } } else if(c == '"' || c == '\\' || c == '/' || c == 'b' || c == 'f' || c == 'n' || c == 'r' || c == 't') c = lex_get_save(lex, error); else { error_set(error, lex, "invalid escape"); goto out; } } else c = lex_get_save(lex, error); } /* the actual value is at most of the same length as the source string, because: - shortcut escapes (e.g. "\t") (length 2) are converted to 1 byte - a single \uXXXX escape (length 6) is converted to at most 3 bytes - two \uXXXX escapes (length 12) forming an UTF-16 surrogate pair are converted to 4 bytes */ lex->value.string = jsonp_malloc(lex->saved_text.length + 1); if(!lex->value.string) { /* this is not very nice, since TOKEN_INVALID is returned */ goto out; } /* the target */ t = lex->value.string; /* + 1 to skip the " */ p = strbuffer_value(&lex->saved_text) + 1; while(*p != '"') { if(*p == '\\') { p++; if(*p == 'u') { char buffer[4]; int length; int32_t value; value = decode_unicode_escape(p); p += 5; if(0xD800 <= value && value <= 0xDBFF) { /* surrogate pair */ if(*p == '\\' && *(p + 1) == 'u') { int32_t value2 = decode_unicode_escape(++p); p += 5; if(0xDC00 <= value2 && value2 <= 0xDFFF) { /* valid second surrogate */ value = ((value - 0xD800) << 10) + (value2 - 0xDC00) + 0x10000; } else { /* invalid second surrogate */ error_set(error, lex, "invalid Unicode '\\u%04X\\u%04X'", value, value2); goto out; } } else { /* no second surrogate */ error_set(error, lex, "invalid Unicode '\\u%04X'", value); goto out; } } else if(0xDC00 <= value && value <= 0xDFFF) { error_set(error, lex, "invalid Unicode '\\u%04X'", value); goto out; } else if(value == 0) { error_set(error, lex, "\\u0000 is not allowed"); goto out; } if(utf8_encode(value, buffer, &length)) assert(0); memcpy(t, buffer, length); t += length; } else { switch(*p) { case '"': case '\\': case '/': *t = *p; break; case 'b': *t = '\b'; break; case 'f': *t = '\f'; break; case 'n': *t = '\n'; break; case 'r': *t = '\r'; break; case 't': *t = '\t'; break; default: assert(0); } t++; p++; } } else *(t++) = *(p++); } *t = '\0'; lex->token = TOKEN_STRING; return; out: jsonp_free(lex->value.string); } #if JSON_INTEGER_IS_LONG_LONG #ifdef _MSC_VER // Microsoft Visual Studio #define json_strtoint _strtoi64 #else #define json_strtoint strtoll #endif #else #define json_strtoint strtol #endif static int lex_scan_number(lex_t *lex, int c, json_error_t *error) { const char *saved_text; char *end; double value; lex->token = TOKEN_INVALID; if(c == '-') c = lex_get_save(lex, error); if(c == '0') { c = lex_get_save(lex, error); if(l_isdigit(c)) { lex_unget_unsave(lex, c); goto out; } } else if(l_isdigit(c)) { c = lex_get_save(lex, error); while(l_isdigit(c)) c = lex_get_save(lex, error); } else { lex_unget_unsave(lex, c); goto out; } if(c != '.' && c != 'E' && c != 'e') { json_int_t value; lex_unget_unsave(lex, c); saved_text = strbuffer_value(&lex->saved_text); errno = 0; value = json_strtoint(saved_text, &end, 10); if(errno == ERANGE) { if(value < 0) error_set(error, lex, "too big negative integer"); else error_set(error, lex, "too big integer"); goto out; } assert(end == saved_text + lex->saved_text.length); lex->token = TOKEN_INTEGER; lex->value.integer = value; return 0; } if(c == '.') { c = lex_get(lex, error); if(!l_isdigit(c)) { lex_unget(lex, c); goto out; } lex_save(lex, c); c = lex_get_save(lex, error); while(l_isdigit(c)) c = lex_get_save(lex, error); } if(c == 'E' || c == 'e') { c = lex_get_save(lex, error); if(c == '+' || c == '-') c = lex_get_save(lex, error); if(!l_isdigit(c)) { lex_unget_unsave(lex, c); goto out; } c = lex_get_save(lex, error); while(l_isdigit(c)) c = lex_get_save(lex, error); } lex_unget_unsave(lex, c); if(jsonp_strtod(&lex->saved_text, &value)) { error_set(error, lex, "real number overflow"); goto out; } lex->token = TOKEN_REAL; lex->value.real = value; return 0; out: return -1; } static int lex_scan(lex_t *lex, json_error_t *error) { int c; strbuffer_clear(&lex->saved_text); if(lex->token == TOKEN_STRING) { jsonp_free(lex->value.string); lex->value.string = NULL; } c = lex_get(lex, error); while(c == ' ' || c == '\t' || c == '\n' || c == '\r') c = lex_get(lex, error); if(c == STREAM_STATE_EOF) { lex->token = TOKEN_EOF; goto out; } if(c == STREAM_STATE_ERROR) { lex->token = TOKEN_INVALID; goto out; } lex_save(lex, c); if(c == '{' || c == '}' || c == '[' || c == ']' || c == ':' || c == ',') lex->token = c; else if(c == '"') lex_scan_string(lex, error); else if(l_isdigit(c) || c == '-') { if(lex_scan_number(lex, c, error)) goto out; } else if(l_isalpha(c)) { /* eat up the whole identifier for clearer error messages */ const char *saved_text; c = lex_get_save(lex, error); while(l_isalpha(c)) c = lex_get_save(lex, error); lex_unget_unsave(lex, c); saved_text = strbuffer_value(&lex->saved_text); if(strcmp(saved_text, "true") == 0) lex->token = TOKEN_TRUE; else if(strcmp(saved_text, "false") == 0) lex->token = TOKEN_FALSE; else if(strcmp(saved_text, "null") == 0) lex->token = TOKEN_NULL; else lex->token = TOKEN_INVALID; } else { /* save the rest of the input UTF-8 sequence to get an error message of valid UTF-8 */ lex_save_cached(lex); lex->token = TOKEN_INVALID; } out: return lex->token; } static char *lex_steal_string(lex_t *lex) { char *result = NULL; if(lex->token == TOKEN_STRING) { result = lex->value.string; lex->value.string = NULL; } return result; } static int lex_init(lex_t *lex, get_func get, void *data) { stream_init(&lex->stream, get, data); if(strbuffer_init(&lex->saved_text)) return -1; lex->token = TOKEN_INVALID; return 0; } static void lex_close(lex_t *lex) { if(lex->token == TOKEN_STRING) jsonp_free(lex->value.string); strbuffer_close(&lex->saved_text); } /*** parser ***/ static json_t *parse_value(lex_t *lex, size_t flags, json_error_t *error); static json_t *parse_object(lex_t *lex, size_t flags, json_error_t *error) { json_t *object = json_object(); if(!object) return NULL; lex_scan(lex, error); if(lex->token == '}') return object; while(1) { char *key; json_t *value; if(lex->token != TOKEN_STRING) { error_set(error, lex, "string or '}' expected"); goto error; } key = lex_steal_string(lex); if(!key) return NULL; if(flags & JSON_REJECT_DUPLICATES) { if(json_object_get(object, key)) { jsonp_free(key); error_set(error, lex, "duplicate object key"); goto error; } } lex_scan(lex, error); if(lex->token != ':') { jsonp_free(key); error_set(error, lex, "':' expected"); goto error; } lex_scan(lex, error); value = parse_value(lex, flags, error); if(!value) { jsonp_free(key); goto error; } if(json_object_set_nocheck(object, key, value)) { jsonp_free(key); json_decref(value); goto error; } json_decref(value); jsonp_free(key); lex_scan(lex, error); if(lex->token != ',') break; lex_scan(lex, error); } if(lex->token != '}') { error_set(error, lex, "'}' expected"); goto error; } return object; error: json_decref(object); return NULL; } static json_t *parse_array(lex_t *lex, size_t flags, json_error_t *error) { json_t *array = json_array(); if(!array) return NULL; lex_scan(lex, error); if(lex->token == ']') return array; while(lex->token) { json_t *elem = parse_value(lex, flags, error); if(!elem) goto error; if(json_array_append(array, elem)) { json_decref(elem); goto error; } json_decref(elem); lex_scan(lex, error); if(lex->token != ',') break; lex_scan(lex, error); } if(lex->token != ']') { error_set(error, lex, "']' expected"); goto error; } return array; error: json_decref(array); return NULL; } static json_t *parse_value(lex_t *lex, size_t flags, json_error_t *error) { json_t *json; switch(lex->token) { case TOKEN_STRING: { json = json_string_nocheck(lex->value.string); break; } case TOKEN_INTEGER: { json = json_integer(lex->value.integer); break; } case TOKEN_REAL: { json = json_real(lex->value.real); break; } case TOKEN_TRUE: json = json_true(); break; case TOKEN_FALSE: json = json_false(); break; case TOKEN_NULL: json = json_null(); break; case '{': json = parse_object(lex, flags, error); break; case '[': json = parse_array(lex, flags, error); break; case TOKEN_INVALID: error_set(error, lex, "invalid token"); return NULL; default: error_set(error, lex, "unexpected token"); return NULL; } if(!json) return NULL; return json; } static json_t *parse_json(lex_t *lex, size_t flags, json_error_t *error) { json_t *result; lex_scan(lex, error); if(!(flags & JSON_DECODE_ANY)) { if(lex->token != '[' && lex->token != '{') { error_set(error, lex, "'[' or '{' expected"); return NULL; } } result = parse_value(lex, flags, error); if(!result) return NULL; if(!(flags & JSON_DISABLE_EOF_CHECK)) { lex_scan(lex, error); if(lex->token != TOKEN_EOF) { error_set(error, lex, "end of file expected"); json_decref(result); return NULL; } } if(error) { /* Save the position even though there was no error */ error->position = lex->stream.position; } return result; } typedef struct { const char *data; int pos; } string_data_t; static int string_get(void *data) { char c; string_data_t *stream = (string_data_t *)data; c = stream->data[stream->pos]; if(c == '\0') return EOF; else { stream->pos++; return (unsigned char)c; } } json_t *json_loads(const char *string, size_t flags, json_error_t *error) { lex_t lex; json_t *result; string_data_t stream_data; jsonp_error_init(error, ""); if (string == NULL) { error_set(error, NULL, "wrong arguments"); return NULL; } stream_data.data = string; stream_data.pos = 0; if(lex_init(&lex, string_get, (void *)&stream_data)) return NULL; result = parse_json(&lex, flags, error); lex_close(&lex); return result; } typedef struct { const char *data; size_t len; size_t pos; } buffer_data_t; static int buffer_get(void *data) { char c; buffer_data_t *stream = data; if(stream->pos >= stream->len) return EOF; c = stream->data[stream->pos]; stream->pos++; return (unsigned char)c; } json_t *json_loadb(const char *buffer, size_t buflen, size_t flags, json_error_t *error) { lex_t lex; json_t *result; buffer_data_t stream_data; jsonp_error_init(error, ""); if (buffer == NULL) { error_set(error, NULL, "wrong arguments"); return NULL; } stream_data.data = buffer; stream_data.pos = 0; stream_data.len = buflen; if(lex_init(&lex, buffer_get, (void *)&stream_data)) return NULL; result = parse_json(&lex, flags, error); lex_close(&lex); return result; } json_t *json_loadf(FILE *input, size_t flags, json_error_t *error) { lex_t lex; const char *source; json_t *result; if(input == stdin) source = ""; else source = ""; jsonp_error_init(error, source); if (input == NULL) { error_set(error, NULL, "wrong arguments"); return NULL; } if(lex_init(&lex, (get_func)fgetc, input)) return NULL; result = parse_json(&lex, flags, error); lex_close(&lex); return result; } json_t *json_load_file(const char *path, size_t flags, json_error_t *error) { json_t *result; FILE *fp; jsonp_error_init(error, path); if (path == NULL) { error_set(error, NULL, "wrong arguments"); return NULL; } fp = fopen(path, "rb"); if(!fp) { error_set(error, NULL, "unable to open %s: %s", path, strerror(errno)); return NULL; } result = json_loadf(fp, flags, error); fclose(fp); return result; } #define MAX_BUF_LEN 1024 typedef struct { char data[MAX_BUF_LEN]; size_t len; size_t pos; json_load_callback_t callback; void *arg; } callback_data_t; static int callback_get(void *data) { char c; callback_data_t *stream = data; if(stream->pos >= stream->len) { stream->pos = 0; stream->len = stream->callback(stream->data, MAX_BUF_LEN, stream->arg); if(stream->len == 0 || stream->len == (size_t)-1) return EOF; } c = stream->data[stream->pos]; stream->pos++; return (unsigned char)c; } json_t *json_load_callback(json_load_callback_t callback, void *arg, size_t flags, json_error_t *error) { lex_t lex; json_t *result; callback_data_t stream_data; memset(&stream_data, 0, sizeof(stream_data)); stream_data.callback = callback; stream_data.arg = arg; jsonp_error_init(error, ""); if (callback == NULL) { error_set(error, NULL, "wrong arguments"); return NULL; } if(lex_init(&lex, (get_func)callback_get, &stream_data)) return NULL; result = parse_json(&lex, flags, error); lex_close(&lex); return result; } nvidia-settings/src/jansson/jansson_config.h0000664000175000017500000000223712236467170021461 0ustar albertoalberto/* * Copyright (c) 2010-2012 Petri Lehtinen * * Jansson is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. * * * This file specifies a part of the site-specific configuration for * Jansson, namely those things that affect the public API in * jansson.h. * * The configure script copies this file to jansson_config.h and * replaces @var@ substitutions by values that fit your system. If you * cannot run the configure script, you can do the value substitution * by hand. */ #ifndef JANSSON_CONFIG_H #define JANSSON_CONFIG_H /* If your compiler supports the inline keyword in C, JSON_INLINE is defined to `inline', otherwise empty. In C++, the inline is always supported. */ #ifdef __cplusplus #define JSON_INLINE inline #else #define JSON_INLINE inline #endif /* If your compiler supports the `long long` type and the strtoll() library function, JSON_INTEGER_IS_LONG_LONG is defined to 1, otherwise to 0. */ #define JSON_INTEGER_IS_LONG_LONG 1 /* If locale.h and localeconv() are available, define to 1, otherwise to 0. */ #define JSON_HAVE_LOCALECONV 1 #endif nvidia-settings/src/jansson/strbuffer.c0000664000175000017500000000506712236467170020462 0ustar albertoalberto/* * Copyright (c) 2009-2012 Petri Lehtinen * * Jansson is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ #define _GNU_SOURCE #include #include #include "jansson_private.h" #include "strbuffer.h" #define STRBUFFER_MIN_SIZE 16 #define STRBUFFER_FACTOR 2 #define STRBUFFER_SIZE_MAX ((size_t)-1) int strbuffer_init(strbuffer_t *strbuff) { strbuff->size = STRBUFFER_MIN_SIZE; strbuff->length = 0; strbuff->value = jsonp_malloc(strbuff->size); if(!strbuff->value) return -1; /* initialize to empty */ strbuff->value[0] = '\0'; return 0; } void strbuffer_close(strbuffer_t *strbuff) { jsonp_free(strbuff->value); strbuff->size = 0; strbuff->length = 0; strbuff->value = NULL; } void strbuffer_clear(strbuffer_t *strbuff) { strbuff->length = 0; strbuff->value[0] = '\0'; } const char *strbuffer_value(const strbuffer_t *strbuff) { return strbuff->value; } char *strbuffer_steal_value(strbuffer_t *strbuff) { char *result = strbuff->value; strbuffer_init(strbuff); return result; } int strbuffer_append(strbuffer_t *strbuff, const char *string) { return strbuffer_append_bytes(strbuff, string, strlen(string)); } int strbuffer_append_byte(strbuffer_t *strbuff, char byte) { return strbuffer_append_bytes(strbuff, &byte, 1); } int strbuffer_append_bytes(strbuffer_t *strbuff, const char *data, size_t size) { if(size >= strbuff->size - strbuff->length) { size_t new_size; char *new_value; /* avoid integer overflow */ if (strbuff->size > STRBUFFER_SIZE_MAX / STRBUFFER_FACTOR || size > STRBUFFER_SIZE_MAX - 1 || strbuff->length > STRBUFFER_SIZE_MAX - 1 - size) return -1; new_size = max(strbuff->size * STRBUFFER_FACTOR, strbuff->length + size + 1); new_value = jsonp_malloc(new_size); if(!new_value) return -1; memcpy(new_value, strbuff->value, strbuff->length); jsonp_free(strbuff->value); strbuff->value = new_value; strbuff->size = new_size; } memcpy(strbuff->value + strbuff->length, data, size); strbuff->length += size; strbuff->value[strbuff->length] = '\0'; return 0; } char strbuffer_pop(strbuffer_t *strbuff) { if(strbuff->length > 0) { char c = strbuff->value[--strbuff->length]; strbuff->value[strbuff->length] = '\0'; return c; } else return '\0'; } nvidia-settings/src/jansson/utf.h0000664000175000017500000000176112236467170017260 0ustar albertoalberto/* * Copyright (c) 2009-2012 Petri Lehtinen * * Jansson is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ #ifndef UTF_H #define UTF_H #ifdef HAVE_CONFIG_H #include #ifdef HAVE_INTTYPES_H /* inttypes.h includes stdint.h in a standard environment, so there's no need to include stdint.h separately. If inttypes.h doesn't define int32_t, it's defined in config.h. */ #include #endif /* HAVE_INTTYPES_H */ #else /* !HAVE_CONFIG_H */ #ifdef _WIN32 typedef int int32_t; #else /* !_WIN32 */ /* Assume a standard environment */ #include #endif /* _WIN32 */ #endif /* HAVE_CONFIG_H */ int utf8_encode(int codepoint, char *buffer, int *size); int utf8_check_first(char byte); int utf8_check_full(const char *buffer, int size, int32_t *codepoint); const char *utf8_iterate(const char *buffer, int32_t *codepoint); int utf8_check_string(const char *string, int length); #endif nvidia-settings/src/jansson/memory.c0000664000175000017500000000173012236467170017761 0ustar albertoalberto/* * Copyright (c) 2009-2012 Petri Lehtinen * Copyright (c) 2011-2012 Basile Starynkevitch * * Jansson is free software; you can redistribute it and/or modify it * under the terms of the MIT license. See LICENSE for details. */ #include #include #include "jansson.h" #include "jansson_private.h" /* memory function pointers */ static json_malloc_t do_malloc = malloc; static json_free_t do_free = free; void *jsonp_malloc(size_t size) { if(!size) return NULL; return (*do_malloc)(size); } void jsonp_free(void *ptr) { if(!ptr) return; (*do_free)(ptr); } char *jsonp_strdup(const char *str) { char *new_str; new_str = jsonp_malloc(strlen(str) + 1); if(!new_str) return NULL; strcpy(new_str, str); return new_str; } void json_set_alloc_funcs(json_malloc_t malloc_fn, json_free_t free_fn) { do_malloc = malloc_fn; do_free = free_fn; } nvidia-settings/src/jansson/value.c0000664000175000017500000004442612236467170017576 0ustar albertoalberto/* * Copyright (c) 2009-2012 Petri Lehtinen * * Jansson is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ #define _GNU_SOURCE #include #include #include #include #include "jansson.h" #include "hashtable.h" #include "jansson_private.h" #include "utf.h" /* Work around nonstandard isnan() and isinf() implementations */ #ifndef isnan static JSON_INLINE int jansson_isnan(double x) { return x != x; } # define isnan jansson_isnan #endif #ifndef isinf static JSON_INLINE int jansson_isinf(double x) { return !isnan(x) && isnan(x - x); } # define isinf jansson_isinf #endif static JSON_INLINE void json_init(json_t *json, json_type type) { json->type = type; json->refcount = 1; } /*** object ***/ json_t *json_object(void) { json_object_t *object = jsonp_malloc(sizeof(json_object_t)); if(!object) return NULL; json_init(&object->json, JSON_OBJECT); if(hashtable_init(&object->hashtable)) { jsonp_free(object); return NULL; } object->serial = 0; object->visited = 0; return &object->json; } static void json_delete_object(json_object_t *object) { hashtable_close(&object->hashtable); jsonp_free(object); } size_t json_object_size(const json_t *json) { json_object_t *object; if(!json_is_object(json)) return 0; object = json_to_object(json); return object->hashtable.size; } json_t *json_object_get(const json_t *json, const char *key) { json_object_t *object; if(!json_is_object(json)) return NULL; object = json_to_object(json); return hashtable_get(&object->hashtable, key); } int json_object_set_new_nocheck(json_t *json, const char *key, json_t *value) { json_object_t *object; if(!value) return -1; if(!key || !json_is_object(json) || json == value) { json_decref(value); return -1; } object = json_to_object(json); if(hashtable_set(&object->hashtable, key, object->serial++, value)) { json_decref(value); return -1; } return 0; } int json_object_set_new(json_t *json, const char *key, json_t *value) { if(!key || !utf8_check_string(key, -1)) { json_decref(value); return -1; } return json_object_set_new_nocheck(json, key, value); } int json_object_del(json_t *json, const char *key) { json_object_t *object; if(!json_is_object(json)) return -1; object = json_to_object(json); return hashtable_del(&object->hashtable, key); } int json_object_clear(json_t *json) { json_object_t *object; if(!json_is_object(json)) return -1; object = json_to_object(json); hashtable_clear(&object->hashtable); object->serial = 0; return 0; } int json_object_update(json_t *object, json_t *other) { const char *key; json_t *value; if(!json_is_object(object) || !json_is_object(other)) return -1; json_object_foreach(other, key, value) { if(json_object_set_nocheck(object, key, value)) return -1; } return 0; } int json_object_update_existing(json_t *object, json_t *other) { const char *key; json_t *value; if(!json_is_object(object) || !json_is_object(other)) return -1; json_object_foreach(other, key, value) { if(json_object_get(object, key)) json_object_set_nocheck(object, key, value); } return 0; } int json_object_update_missing(json_t *object, json_t *other) { const char *key; json_t *value; if(!json_is_object(object) || !json_is_object(other)) return -1; json_object_foreach(other, key, value) { if(!json_object_get(object, key)) json_object_set_nocheck(object, key, value); } return 0; } void *json_object_iter(json_t *json) { json_object_t *object; if(!json_is_object(json)) return NULL; object = json_to_object(json); return hashtable_iter(&object->hashtable); } void *json_object_iter_at(json_t *json, const char *key) { json_object_t *object; if(!key || !json_is_object(json)) return NULL; object = json_to_object(json); return hashtable_iter_at(&object->hashtable, key); } void *json_object_iter_next(json_t *json, void *iter) { json_object_t *object; if(!json_is_object(json) || iter == NULL) return NULL; object = json_to_object(json); return hashtable_iter_next(&object->hashtable, iter); } const char *json_object_iter_key(void *iter) { if(!iter) return NULL; return hashtable_iter_key(iter); } json_t *json_object_iter_value(void *iter) { if(!iter) return NULL; return (json_t *)hashtable_iter_value(iter); } int json_object_iter_set_new(json_t *json, void *iter, json_t *value) { if(!json_is_object(json) || !iter || !value) return -1; hashtable_iter_set(iter, value); return 0; } void *json_object_key_to_iter(const char *key) { if(!key) return NULL; return hashtable_key_to_iter(key); } static int json_object_equal(json_t *object1, json_t *object2) { const char *key; json_t *value1, *value2; if(json_object_size(object1) != json_object_size(object2)) return 0; json_object_foreach(object1, key, value1) { value2 = json_object_get(object2, key); if(!json_equal(value1, value2)) return 0; } return 1; } static json_t *json_object_copy(json_t *object) { json_t *result; const char *key; json_t *value; result = json_object(); if(!result) return NULL; json_object_foreach(object, key, value) json_object_set_nocheck(result, key, value); return result; } static json_t *json_object_deep_copy(json_t *object) { json_t *result; const char *key; json_t *value; result = json_object(); if(!result) return NULL; json_object_foreach(object, key, value) json_object_set_new_nocheck(result, key, json_deep_copy(value)); return result; } /*** array ***/ json_t *json_array(void) { json_array_t *array = jsonp_malloc(sizeof(json_array_t)); if(!array) return NULL; json_init(&array->json, JSON_ARRAY); array->entries = 0; array->size = 8; array->table = jsonp_malloc(array->size * sizeof(json_t *)); if(!array->table) { jsonp_free(array); return NULL; } array->visited = 0; return &array->json; } static void json_delete_array(json_array_t *array) { size_t i; for(i = 0; i < array->entries; i++) json_decref(array->table[i]); jsonp_free(array->table); jsonp_free(array); } size_t json_array_size(const json_t *json) { if(!json_is_array(json)) return 0; return json_to_array(json)->entries; } json_t *json_array_get(const json_t *json, size_t index) { json_array_t *array; if(!json_is_array(json)) return NULL; array = json_to_array(json); if(index >= array->entries) return NULL; return array->table[index]; } int json_array_set_new(json_t *json, size_t index, json_t *value) { json_array_t *array; if(!value) return -1; if(!json_is_array(json) || json == value) { json_decref(value); return -1; } array = json_to_array(json); if(index >= array->entries) { json_decref(value); return -1; } json_decref(array->table[index]); array->table[index] = value; return 0; } static void array_move(json_array_t *array, size_t dest, size_t src, size_t count) { memmove(&array->table[dest], &array->table[src], count * sizeof(json_t *)); } static void array_copy(json_t **dest, size_t dpos, json_t **src, size_t spos, size_t count) { memcpy(&dest[dpos], &src[spos], count * sizeof(json_t *)); } static json_t **json_array_grow(json_array_t *array, size_t amount, int copy) { size_t new_size; json_t **old_table, **new_table; if(array->entries + amount <= array->size) return array->table; old_table = array->table; new_size = max(array->size + amount, array->size * 2); new_table = jsonp_malloc(new_size * sizeof(json_t *)); if(!new_table) return NULL; array->size = new_size; array->table = new_table; if(copy) { array_copy(array->table, 0, old_table, 0, array->entries); jsonp_free(old_table); return array->table; } return old_table; } int json_array_append_new(json_t *json, json_t *value) { json_array_t *array; if(!value) return -1; if(!json_is_array(json) || json == value) { json_decref(value); return -1; } array = json_to_array(json); if(!json_array_grow(array, 1, 1)) { json_decref(value); return -1; } array->table[array->entries] = value; array->entries++; return 0; } int json_array_insert_new(json_t *json, size_t index, json_t *value) { json_array_t *array; json_t **old_table; if(!value) return -1; if(!json_is_array(json) || json == value) { json_decref(value); return -1; } array = json_to_array(json); if(index > array->entries) { json_decref(value); return -1; } old_table = json_array_grow(array, 1, 0); if(!old_table) { json_decref(value); return -1; } if(old_table != array->table) { array_copy(array->table, 0, old_table, 0, index); array_copy(array->table, index + 1, old_table, index, array->entries - index); jsonp_free(old_table); } else array_move(array, index + 1, index, array->entries - index); array->table[index] = value; array->entries++; return 0; } int json_array_remove(json_t *json, size_t index) { json_array_t *array; if(!json_is_array(json)) return -1; array = json_to_array(json); if(index >= array->entries) return -1; json_decref(array->table[index]); array_move(array, index, index + 1, array->entries - index); array->entries--; return 0; } int json_array_clear(json_t *json) { json_array_t *array; size_t i; if(!json_is_array(json)) return -1; array = json_to_array(json); for(i = 0; i < array->entries; i++) json_decref(array->table[i]); array->entries = 0; return 0; } int json_array_extend(json_t *json, json_t *other_json) { json_array_t *array, *other; size_t i; if(!json_is_array(json) || !json_is_array(other_json)) return -1; array = json_to_array(json); other = json_to_array(other_json); if(!json_array_grow(array, other->entries, 1)) return -1; for(i = 0; i < other->entries; i++) json_incref(other->table[i]); array_copy(array->table, array->entries, other->table, 0, other->entries); array->entries += other->entries; return 0; } static int json_array_equal(json_t *array1, json_t *array2) { size_t i, size; size = json_array_size(array1); if(size != json_array_size(array2)) return 0; for(i = 0; i < size; i++) { json_t *value1, *value2; value1 = json_array_get(array1, i); value2 = json_array_get(array2, i); if(!json_equal(value1, value2)) return 0; } return 1; } static json_t *json_array_copy(json_t *array) { json_t *result; size_t i; result = json_array(); if(!result) return NULL; for(i = 0; i < json_array_size(array); i++) json_array_append(result, json_array_get(array, i)); return result; } static json_t *json_array_deep_copy(json_t *array) { json_t *result; size_t i; result = json_array(); if(!result) return NULL; for(i = 0; i < json_array_size(array); i++) json_array_append_new(result, json_deep_copy(json_array_get(array, i))); return result; } /*** string ***/ json_t *json_string_nocheck(const char *value) { json_string_t *string; if(!value) return NULL; string = jsonp_malloc(sizeof(json_string_t)); if(!string) return NULL; json_init(&string->json, JSON_STRING); string->value = jsonp_strdup(value); if(!string->value) { jsonp_free(string); return NULL; } return &string->json; } json_t *json_string(const char *value) { if(!value || !utf8_check_string(value, -1)) return NULL; return json_string_nocheck(value); } const char *json_string_value(const json_t *json) { if(!json_is_string(json)) return NULL; return json_to_string(json)->value; } int json_string_set_nocheck(json_t *json, const char *value) { char *dup; json_string_t *string; if(!json_is_string(json) || !value) return -1; dup = jsonp_strdup(value); if(!dup) return -1; string = json_to_string(json); jsonp_free(string->value); string->value = dup; return 0; } int json_string_set(json_t *json, const char *value) { if(!value || !utf8_check_string(value, -1)) return -1; return json_string_set_nocheck(json, value); } static void json_delete_string(json_string_t *string) { jsonp_free(string->value); jsonp_free(string); } static int json_string_equal(json_t *string1, json_t *string2) { return strcmp(json_string_value(string1), json_string_value(string2)) == 0; } static json_t *json_string_copy(json_t *string) { return json_string_nocheck(json_string_value(string)); } /*** integer ***/ json_t *json_integer(json_int_t value) { json_integer_t *integer = jsonp_malloc(sizeof(json_integer_t)); if(!integer) return NULL; json_init(&integer->json, JSON_INTEGER); integer->value = value; return &integer->json; } json_int_t json_integer_value(const json_t *json) { if(!json_is_integer(json)) return 0; return json_to_integer(json)->value; } int json_integer_set(json_t *json, json_int_t value) { if(!json_is_integer(json)) return -1; json_to_integer(json)->value = value; return 0; } static void json_delete_integer(json_integer_t *integer) { jsonp_free(integer); } static int json_integer_equal(json_t *integer1, json_t *integer2) { return json_integer_value(integer1) == json_integer_value(integer2); } static json_t *json_integer_copy(json_t *integer) { return json_integer(json_integer_value(integer)); } /*** real ***/ json_t *json_real(double value) { json_real_t *real; if(isnan(value) || isinf(value)) return NULL; real = jsonp_malloc(sizeof(json_real_t)); if(!real) return NULL; json_init(&real->json, JSON_REAL); real->value = value; return &real->json; } double json_real_value(const json_t *json) { if(!json_is_real(json)) return 0; return json_to_real(json)->value; } int json_real_set(json_t *json, double value) { if(!json_is_real(json) || isnan(value) || isinf(value)) return -1; json_to_real(json)->value = value; return 0; } static void json_delete_real(json_real_t *real) { jsonp_free(real); } static int json_real_equal(json_t *real1, json_t *real2) { return json_real_value(real1) == json_real_value(real2); } static json_t *json_real_copy(json_t *real) { return json_real(json_real_value(real)); } /*** number ***/ double json_number_value(const json_t *json) { if(json_is_integer(json)) return (double)json_integer_value(json); else if(json_is_real(json)) return json_real_value(json); else return 0.0; } /*** simple values ***/ json_t *json_true(void) { static json_t the_true = {JSON_TRUE, (size_t)-1}; return &the_true; } json_t *json_false(void) { static json_t the_false = {JSON_FALSE, (size_t)-1}; return &the_false; } json_t *json_null(void) { static json_t the_null = {JSON_NULL, (size_t)-1}; return &the_null; } /*** deletion ***/ void json_delete(json_t *json) { if(json_is_object(json)) json_delete_object(json_to_object(json)); else if(json_is_array(json)) json_delete_array(json_to_array(json)); else if(json_is_string(json)) json_delete_string(json_to_string(json)); else if(json_is_integer(json)) json_delete_integer(json_to_integer(json)); else if(json_is_real(json)) json_delete_real(json_to_real(json)); /* json_delete is not called for true, false or null */ } /*** equality ***/ int json_equal(json_t *json1, json_t *json2) { if(!json1 || !json2) return 0; if(json_typeof(json1) != json_typeof(json2)) return 0; /* this covers true, false and null as they are singletons */ if(json1 == json2) return 1; if(json_is_object(json1)) return json_object_equal(json1, json2); if(json_is_array(json1)) return json_array_equal(json1, json2); if(json_is_string(json1)) return json_string_equal(json1, json2); if(json_is_integer(json1)) return json_integer_equal(json1, json2); if(json_is_real(json1)) return json_real_equal(json1, json2); return 0; } /*** copying ***/ json_t *json_copy(json_t *json) { if(!json) return NULL; if(json_is_object(json)) return json_object_copy(json); if(json_is_array(json)) return json_array_copy(json); if(json_is_string(json)) return json_string_copy(json); if(json_is_integer(json)) return json_integer_copy(json); if(json_is_real(json)) return json_real_copy(json); if(json_is_true(json) || json_is_false(json) || json_is_null(json)) return json; return NULL; } json_t *json_deep_copy(json_t *json) { if(!json) return NULL; if(json_is_object(json)) return json_object_deep_copy(json); if(json_is_array(json)) return json_array_deep_copy(json); /* for the rest of the types, deep copying doesn't differ from shallow copying */ if(json_is_string(json)) return json_string_copy(json); if(json_is_integer(json)) return json_integer_copy(json); if(json_is_real(json)) return json_real_copy(json); if(json_is_true(json) || json_is_false(json) || json_is_null(json)) return json; return NULL; } nvidia-settings/src/jansson/jansson.h0000664000175000017500000002040112236467170020125 0ustar albertoalberto/* * Copyright (c) 2009-2012 Petri Lehtinen * * Jansson is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ #ifndef JANSSON_H #define JANSSON_H #include #include /* for size_t */ #include #include #ifdef __cplusplus extern "C" { #endif /* version */ #define JANSSON_MAJOR_VERSION 2 #define JANSSON_MINOR_VERSION 4 #define JANSSON_MICRO_VERSION 0 /* Micro version is omitted if it's 0 */ #define JANSSON_VERSION "2.4" /* Version as a 3-byte hex number, e.g. 0x010201 == 1.2.1. Use this for numeric comparisons, e.g. #if JANSSON_VERSION_HEX >= ... */ #define JANSSON_VERSION_HEX ((JANSSON_MAJOR_VERSION << 16) | \ (JANSSON_MINOR_VERSION << 8) | \ (JANSSON_MICRO_VERSION << 0)) /* types */ typedef enum { JSON_OBJECT, JSON_ARRAY, JSON_STRING, JSON_INTEGER, JSON_REAL, JSON_TRUE, JSON_FALSE, JSON_NULL } json_type; typedef struct { json_type type; size_t refcount; } json_t; #if JSON_INTEGER_IS_LONG_LONG #ifdef _WIN32 #define JSON_INTEGER_FORMAT "I64d" #else #define JSON_INTEGER_FORMAT "lld" #endif typedef long long json_int_t; #else #define JSON_INTEGER_FORMAT "ld" typedef long json_int_t; #endif /* JSON_INTEGER_IS_LONG_LONG */ #define json_typeof(json) ((json)->type) #define json_is_object(json) (json && json_typeof(json) == JSON_OBJECT) #define json_is_array(json) (json && json_typeof(json) == JSON_ARRAY) #define json_is_string(json) (json && json_typeof(json) == JSON_STRING) #define json_is_integer(json) (json && json_typeof(json) == JSON_INTEGER) #define json_is_real(json) (json && json_typeof(json) == JSON_REAL) #define json_is_number(json) (json_is_integer(json) || json_is_real(json)) #define json_is_true(json) (json && json_typeof(json) == JSON_TRUE) #define json_is_false(json) (json && json_typeof(json) == JSON_FALSE) #define json_is_boolean(json) (json_is_true(json) || json_is_false(json)) #define json_is_null(json) (json && json_typeof(json) == JSON_NULL) /* construction, destruction, reference counting */ json_t *json_object(void); json_t *json_array(void); json_t *json_string(const char *value); json_t *json_string_nocheck(const char *value); json_t *json_integer(json_int_t value); json_t *json_real(double value); json_t *json_true(void); json_t *json_false(void); #define json_boolean(val) ((val) ? json_true() : json_false()) json_t *json_null(void); static JSON_INLINE json_t *json_incref(json_t *json) { if(json && json->refcount != (size_t)-1) ++json->refcount; return json; } /* do not call json_delete directly */ void json_delete(json_t *json); static JSON_INLINE void json_decref(json_t *json) { if(json && json->refcount != (size_t)-1 && --json->refcount == 0) json_delete(json); } /* error reporting */ #define JSON_ERROR_TEXT_LENGTH 160 #define JSON_ERROR_SOURCE_LENGTH 80 typedef struct { int line; int column; int position; char source[JSON_ERROR_SOURCE_LENGTH]; char text[JSON_ERROR_TEXT_LENGTH]; } json_error_t; /* getters, setters, manipulation */ size_t json_object_size(const json_t *object); json_t *json_object_get(const json_t *object, const char *key); int json_object_set_new(json_t *object, const char *key, json_t *value); int json_object_set_new_nocheck(json_t *object, const char *key, json_t *value); int json_object_del(json_t *object, const char *key); int json_object_clear(json_t *object); int json_object_update(json_t *object, json_t *other); int json_object_update_existing(json_t *object, json_t *other); int json_object_update_missing(json_t *object, json_t *other); void *json_object_iter(json_t *object); void *json_object_iter_at(json_t *object, const char *key); void *json_object_key_to_iter(const char *key); void *json_object_iter_next(json_t *object, void *iter); const char *json_object_iter_key(void *iter); json_t *json_object_iter_value(void *iter); int json_object_iter_set_new(json_t *object, void *iter, json_t *value); #define json_object_foreach(object, key, value) \ for(key = json_object_iter_key(json_object_iter(object)); \ key && (value = json_object_iter_value(json_object_key_to_iter(key))); \ key = json_object_iter_key(json_object_iter_next(object, json_object_key_to_iter(key)))) static JSON_INLINE int json_object_set(json_t *object, const char *key, json_t *value) { return json_object_set_new(object, key, json_incref(value)); } static JSON_INLINE int json_object_set_nocheck(json_t *object, const char *key, json_t *value) { return json_object_set_new_nocheck(object, key, json_incref(value)); } static JSON_INLINE int json_object_iter_set(json_t *object, void *iter, json_t *value) { return json_object_iter_set_new(object, iter, json_incref(value)); } size_t json_array_size(const json_t *array); json_t *json_array_get(const json_t *array, size_t index); int json_array_set_new(json_t *array, size_t index, json_t *value); int json_array_append_new(json_t *array, json_t *value); int json_array_insert_new(json_t *array, size_t index, json_t *value); int json_array_remove(json_t *array, size_t index); int json_array_clear(json_t *array); int json_array_extend(json_t *array, json_t *other); static JSON_INLINE int json_array_set(json_t *array, size_t index, json_t *value) { return json_array_set_new(array, index, json_incref(value)); } static JSON_INLINE int json_array_append(json_t *array, json_t *value) { return json_array_append_new(array, json_incref(value)); } static JSON_INLINE int json_array_insert(json_t *array, size_t index, json_t *value) { return json_array_insert_new(array, index, json_incref(value)); } const char *json_string_value(const json_t *string); json_int_t json_integer_value(const json_t *integer); double json_real_value(const json_t *real); double json_number_value(const json_t *json); int json_string_set(json_t *string, const char *value); int json_string_set_nocheck(json_t *string, const char *value); int json_integer_set(json_t *integer, json_int_t value); int json_real_set(json_t *real, double value); /* pack, unpack */ json_t *json_pack(const char *fmt, ...); json_t *json_pack_ex(json_error_t *error, size_t flags, const char *fmt, ...); json_t *json_vpack_ex(json_error_t *error, size_t flags, const char *fmt, va_list ap); #define JSON_VALIDATE_ONLY 0x1 #define JSON_STRICT 0x2 int json_unpack(json_t *root, const char *fmt, ...); int json_unpack_ex(json_t *root, json_error_t *error, size_t flags, const char *fmt, ...); int json_vunpack_ex(json_t *root, json_error_t *error, size_t flags, const char *fmt, va_list ap); /* equality */ int json_equal(json_t *value1, json_t *value2); /* copying */ json_t *json_copy(json_t *value); json_t *json_deep_copy(json_t *value); /* decoding */ #define JSON_REJECT_DUPLICATES 0x1 #define JSON_DISABLE_EOF_CHECK 0x2 #define JSON_DECODE_ANY 0x4 typedef size_t (*json_load_callback_t)(void *buffer, size_t buflen, void *data); json_t *json_loads(const char *input, size_t flags, json_error_t *error); json_t *json_loadb(const char *buffer, size_t buflen, size_t flags, json_error_t *error); json_t *json_loadf(FILE *input, size_t flags, json_error_t *error); json_t *json_load_file(const char *path, size_t flags, json_error_t *error); json_t *json_load_callback(json_load_callback_t callback, void *data, size_t flags, json_error_t *error); /* encoding */ #define JSON_INDENT(n) (n & 0x1F) #define JSON_COMPACT 0x20 #define JSON_ENSURE_ASCII 0x40 #define JSON_SORT_KEYS 0x80 #define JSON_PRESERVE_ORDER 0x100 #define JSON_ENCODE_ANY 0x200 #define JSON_ESCAPE_SLASH 0x400 typedef int (*json_dump_callback_t)(const char *buffer, size_t size, void *data); char *json_dumps(const json_t *json, size_t flags); int json_dumpf(const json_t *json, FILE *output, size_t flags); int json_dump_file(const json_t *json, const char *path, size_t flags); int json_dump_callback(const json_t *json, json_dump_callback_t callback, void *data, size_t flags); /* custom memory allocation */ typedef void *(*json_malloc_t)(size_t); typedef void (*json_free_t)(void *); void json_set_alloc_funcs(json_malloc_t malloc_fn, json_free_t free_fn); #ifdef __cplusplus } #endif #endif nvidia-settings/src/jansson/hashtable.c0000664000175000017500000002024312236467170020404 0ustar albertoalberto/* * Copyright (c) 2009-2012 Petri Lehtinen * * This library is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ #include #include #include /* for JSON_INLINE */ #include "jansson_private.h" /* for container_of() */ #include "hashtable.h" typedef struct hashtable_list list_t; typedef struct hashtable_pair pair_t; typedef struct hashtable_bucket bucket_t; #define list_to_pair(list_) container_of(list_, pair_t, list) /* From http://www.cse.yorku.ca/~oz/hash.html */ static size_t hash_str(const void *ptr) { const char *str = (const char *)ptr; size_t hash = 5381; size_t c; while((c = (size_t)*str)) { hash = ((hash << 5) + hash) + c; str++; } return hash; } static JSON_INLINE void list_init(list_t *list) { list->next = list; list->prev = list; } static JSON_INLINE void list_insert(list_t *list, list_t *node) { node->next = list; node->prev = list->prev; list->prev->next = node; list->prev = node; } static JSON_INLINE void list_remove(list_t *list) { list->prev->next = list->next; list->next->prev = list->prev; } static JSON_INLINE int bucket_is_empty(hashtable_t *hashtable, bucket_t *bucket) { return bucket->first == &hashtable->list && bucket->first == bucket->last; } static void insert_to_bucket(hashtable_t *hashtable, bucket_t *bucket, list_t *list) { if(bucket_is_empty(hashtable, bucket)) { list_insert(&hashtable->list, list); bucket->first = bucket->last = list; } else { list_insert(bucket->first, list); bucket->first = list; } } static const size_t primes[] = { 5, 13, 23, 53, 97, 193, 389, 769, 1543, 3079, 6151, 12289, 24593, 49157, 98317, 196613, 393241, 786433, 1572869, 3145739, 6291469, 12582917, 25165843, 50331653, 100663319, 201326611, 402653189, 805306457, 1610612741 }; static JSON_INLINE size_t num_buckets(hashtable_t *hashtable) { return primes[hashtable->num_buckets]; } static pair_t *hashtable_find_pair(hashtable_t *hashtable, bucket_t *bucket, const char *key, size_t hash) { list_t *list; pair_t *pair; if(bucket_is_empty(hashtable, bucket)) return NULL; list = bucket->first; while(1) { pair = list_to_pair(list); if(pair->hash == hash && strcmp(pair->key, key) == 0) return pair; if(list == bucket->last) break; list = list->next; } return NULL; } /* returns 0 on success, -1 if key was not found */ static int hashtable_do_del(hashtable_t *hashtable, const char *key, size_t hash) { pair_t *pair; bucket_t *bucket; size_t index; index = hash % num_buckets(hashtable); bucket = &hashtable->buckets[index]; pair = hashtable_find_pair(hashtable, bucket, key, hash); if(!pair) return -1; if(&pair->list == bucket->first && &pair->list == bucket->last) bucket->first = bucket->last = &hashtable->list; else if(&pair->list == bucket->first) bucket->first = pair->list.next; else if(&pair->list == bucket->last) bucket->last = pair->list.prev; list_remove(&pair->list); json_decref(pair->value); jsonp_free(pair); hashtable->size--; return 0; } static void hashtable_do_clear(hashtable_t *hashtable) { list_t *list, *next; pair_t *pair; for(list = hashtable->list.next; list != &hashtable->list; list = next) { next = list->next; pair = list_to_pair(list); json_decref(pair->value); jsonp_free(pair); } } static int hashtable_do_rehash(hashtable_t *hashtable) { list_t *list, *next; pair_t *pair; size_t i, index, new_size; jsonp_free(hashtable->buckets); hashtable->num_buckets++; new_size = num_buckets(hashtable); hashtable->buckets = jsonp_malloc(new_size * sizeof(bucket_t)); if(!hashtable->buckets) return -1; for(i = 0; i < num_buckets(hashtable); i++) { hashtable->buckets[i].first = hashtable->buckets[i].last = &hashtable->list; } list = hashtable->list.next; list_init(&hashtable->list); for(; list != &hashtable->list; list = next) { next = list->next; pair = list_to_pair(list); index = pair->hash % new_size; insert_to_bucket(hashtable, &hashtable->buckets[index], &pair->list); } return 0; } int hashtable_init(hashtable_t *hashtable) { size_t i; hashtable->size = 0; hashtable->num_buckets = 0; /* index to primes[] */ hashtable->buckets = jsonp_malloc(num_buckets(hashtable) * sizeof(bucket_t)); if(!hashtable->buckets) return -1; list_init(&hashtable->list); for(i = 0; i < num_buckets(hashtable); i++) { hashtable->buckets[i].first = hashtable->buckets[i].last = &hashtable->list; } return 0; } void hashtable_close(hashtable_t *hashtable) { hashtable_do_clear(hashtable); jsonp_free(hashtable->buckets); } int hashtable_set(hashtable_t *hashtable, const char *key, size_t serial, json_t *value) { pair_t *pair; bucket_t *bucket; size_t hash, index; /* rehash if the load ratio exceeds 1 */ if(hashtable->size >= num_buckets(hashtable)) if(hashtable_do_rehash(hashtable)) return -1; hash = hash_str(key); index = hash % num_buckets(hashtable); bucket = &hashtable->buckets[index]; pair = hashtable_find_pair(hashtable, bucket, key, hash); if(pair) { json_decref(pair->value); pair->value = value; } else { /* offsetof(...) returns the size of pair_t without the last, flexible member. This way, the correct amount is allocated. */ pair = jsonp_malloc(offsetof(pair_t, key) + strlen(key) + 1); if(!pair) return -1; pair->hash = hash; pair->serial = serial; strcpy(pair->key, key); pair->value = value; list_init(&pair->list); insert_to_bucket(hashtable, bucket, &pair->list); hashtable->size++; } return 0; } void *hashtable_get(hashtable_t *hashtable, const char *key) { pair_t *pair; size_t hash; bucket_t *bucket; hash = hash_str(key); bucket = &hashtable->buckets[hash % num_buckets(hashtable)]; pair = hashtable_find_pair(hashtable, bucket, key, hash); if(!pair) return NULL; return pair->value; } int hashtable_del(hashtable_t *hashtable, const char *key) { size_t hash = hash_str(key); return hashtable_do_del(hashtable, key, hash); } void hashtable_clear(hashtable_t *hashtable) { size_t i; hashtable_do_clear(hashtable); for(i = 0; i < num_buckets(hashtable); i++) { hashtable->buckets[i].first = hashtable->buckets[i].last = &hashtable->list; } list_init(&hashtable->list); hashtable->size = 0; } void *hashtable_iter(hashtable_t *hashtable) { return hashtable_iter_next(hashtable, &hashtable->list); } void *hashtable_iter_at(hashtable_t *hashtable, const char *key) { pair_t *pair; size_t hash; bucket_t *bucket; hash = hash_str(key); bucket = &hashtable->buckets[hash % num_buckets(hashtable)]; pair = hashtable_find_pair(hashtable, bucket, key, hash); if(!pair) return NULL; return &pair->list; } void *hashtable_iter_next(hashtable_t *hashtable, void *iter) { list_t *list = (list_t *)iter; if(list->next == &hashtable->list) return NULL; return list->next; } void *hashtable_iter_key(void *iter) { pair_t *pair = list_to_pair((list_t *)iter); return pair->key; } size_t hashtable_iter_serial(void *iter) { pair_t *pair = list_to_pair((list_t *)iter); return pair->serial; } void *hashtable_iter_value(void *iter) { pair_t *pair = list_to_pair((list_t *)iter); return pair->value; } void hashtable_iter_set(void *iter, json_t *value) { pair_t *pair = list_to_pair((list_t *)iter); json_decref(pair->value); pair->value = value; } nvidia-settings/src/jansson/error.c0000664000175000017500000000272712236467170017611 0ustar albertoalberto#include #include "jansson_private.h" void jsonp_error_init(json_error_t *error, const char *source) { if(error) { error->text[0] = '\0'; error->line = -1; error->column = -1; error->position = 0; if(source) jsonp_error_set_source(error, source); else error->source[0] = '\0'; } } void jsonp_error_set_source(json_error_t *error, const char *source) { size_t length; if(!error || !source) return; length = strlen(source); if(length < JSON_ERROR_SOURCE_LENGTH) strcpy(error->source, source); else { size_t extra = length - JSON_ERROR_SOURCE_LENGTH + 4; strcpy(error->source, "..."); strcpy(error->source + 3, source + extra); } } void jsonp_error_set(json_error_t *error, int line, int column, size_t position, const char *msg, ...) { va_list ap; va_start(ap, msg); jsonp_error_vset(error, line, column, position, msg, ap); va_end(ap); } void jsonp_error_vset(json_error_t *error, int line, int column, size_t position, const char *msg, va_list ap) { if(!error) return; if(error->text[0] != '\0') { /* error already set */ return; } error->line = line; error->column = column; error->position = position; vsnprintf(error->text, JSON_ERROR_TEXT_LENGTH, msg, ap); error->text[JSON_ERROR_TEXT_LENGTH - 1] = '\0'; } nvidia-settings/src/jansson/utf.c0000664000175000017500000000766512236467170017264 0ustar albertoalberto/* * Copyright (c) 2009-2012 Petri Lehtinen * * Jansson is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ #include #include "utf.h" int utf8_encode(int32_t codepoint, char *buffer, int *size) { if(codepoint < 0) return -1; else if(codepoint < 0x80) { buffer[0] = (char)codepoint; *size = 1; } else if(codepoint < 0x800) { buffer[0] = 0xC0 + ((codepoint & 0x7C0) >> 6); buffer[1] = 0x80 + ((codepoint & 0x03F)); *size = 2; } else if(codepoint < 0x10000) { buffer[0] = 0xE0 + ((codepoint & 0xF000) >> 12); buffer[1] = 0x80 + ((codepoint & 0x0FC0) >> 6); buffer[2] = 0x80 + ((codepoint & 0x003F)); *size = 3; } else if(codepoint <= 0x10FFFF) { buffer[0] = 0xF0 + ((codepoint & 0x1C0000) >> 18); buffer[1] = 0x80 + ((codepoint & 0x03F000) >> 12); buffer[2] = 0x80 + ((codepoint & 0x000FC0) >> 6); buffer[3] = 0x80 + ((codepoint & 0x00003F)); *size = 4; } else return -1; return 0; } int utf8_check_first(char byte) { unsigned char u = (unsigned char)byte; if(u < 0x80) return 1; if(0x80 <= u && u <= 0xBF) { /* second, third or fourth byte of a multi-byte sequence, i.e. a "continuation byte" */ return 0; } else if(u == 0xC0 || u == 0xC1) { /* overlong encoding of an ASCII byte */ return 0; } else if(0xC2 <= u && u <= 0xDF) { /* 2-byte sequence */ return 2; } else if(0xE0 <= u && u <= 0xEF) { /* 3-byte sequence */ return 3; } else if(0xF0 <= u && u <= 0xF4) { /* 4-byte sequence */ return 4; } else { /* u >= 0xF5 */ /* Restricted (start of 4-, 5- or 6-byte sequence) or invalid UTF-8 */ return 0; } } int utf8_check_full(const char *buffer, int size, int32_t *codepoint) { int i; int32_t value = 0; unsigned char u = (unsigned char)buffer[0]; if(size == 2) { value = u & 0x1F; } else if(size == 3) { value = u & 0xF; } else if(size == 4) { value = u & 0x7; } else return 0; for(i = 1; i < size; i++) { u = (unsigned char)buffer[i]; if(u < 0x80 || u > 0xBF) { /* not a continuation byte */ return 0; } value = (value << 6) + (u & 0x3F); } if(value > 0x10FFFF) { /* not in Unicode range */ return 0; } else if(0xD800 <= value && value <= 0xDFFF) { /* invalid code point (UTF-16 surrogate halves) */ return 0; } else if((size == 2 && value < 0x80) || (size == 3 && value < 0x800) || (size == 4 && value < 0x10000)) { /* overlong encoding */ return 0; } if(codepoint) *codepoint = value; return 1; } const char *utf8_iterate(const char *buffer, int32_t *codepoint) { int count; int32_t value; if(!*buffer) return buffer; count = utf8_check_first(buffer[0]); if(count <= 0) return NULL; if(count == 1) value = (unsigned char)buffer[0]; else { if(!utf8_check_full(buffer, count, &value)) return NULL; } if(codepoint) *codepoint = value; return buffer + count; } int utf8_check_string(const char *string, int length) { int i; if(length == -1) length = strlen(string); for(i = 0; i < length; i++) { int count = utf8_check_first(string[i]); if(count == 0) return 0; else if(count > 1) { if(i + count > length) return 0; if(!utf8_check_full(&string[i], count, NULL)) return 0; i += count - 1; } } return 1; } nvidia-settings/src/jansson/pack_unpack.c0000664000175000017500000003641612236467170020741 0ustar albertoalberto/* * Copyright (c) 2009-2012 Petri Lehtinen * Copyright (c) 2011-2012 Graeme Smecher * * Jansson is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ #include #include "jansson.h" #include "jansson_private.h" #include "utf.h" typedef struct { const char *start; const char *fmt; char token; json_error_t *error; size_t flags; int line; int column; } scanner_t; static const char *type_names[] = { "object", "array", "string", "integer", "real", "true", "false", "null" }; #define type_name(x) type_names[json_typeof(x)] static const char *unpack_value_starters = "{[siIbfFOon"; static void scanner_init(scanner_t *s, json_error_t *error, size_t flags, const char *fmt) { s->error = error; s->flags = flags; s->fmt = s->start = fmt; s->line = 1; s->column = 0; } static void next_token(scanner_t *s) { const char *t = s->fmt; s->column++; /* skip space and ignored chars */ while(*t == ' ' || *t == '\t' || *t == '\n' || *t == ',' || *t == ':') { if(*t == '\n') { s->line++; s->column = 1; } else s->column++; t++; } s->token = *t; t++; s->fmt = t; } static void set_error(scanner_t *s, const char *source, const char *fmt, ...) { va_list ap; size_t pos; va_start(ap, fmt); pos = (size_t)(s->fmt - s->start); jsonp_error_vset(s->error, s->line, s->column, pos, fmt, ap); jsonp_error_set_source(s->error, source); va_end(ap); } static json_t *pack(scanner_t *s, va_list *ap); static json_t *pack_object(scanner_t *s, va_list *ap) { json_t *object = json_object(); next_token(s); while(s->token != '}') { const char *key; json_t *value; if(!s->token) { set_error(s, "", "Unexpected end of format string"); goto error; } if(s->token != 's') { set_error(s, "", "Expected format 's', got '%c'", s->token); goto error; } key = va_arg(*ap, const char *); if(!key) { set_error(s, "", "NULL object key"); goto error; } if(!utf8_check_string(key, -1)) { set_error(s, "", "Invalid UTF-8 in object key"); goto error; } next_token(s); value = pack(s, ap); if(!value) goto error; if(json_object_set_new_nocheck(object, key, value)) { set_error(s, "", "Unable to add key \"%s\"", key); goto error; } next_token(s); } return object; error: json_decref(object); return NULL; } static json_t *pack_array(scanner_t *s, va_list *ap) { json_t *array = json_array(); next_token(s); while(s->token != ']') { json_t *value; if(!s->token) { set_error(s, "", "Unexpected end of format string"); goto error; } value = pack(s, ap); if(!value) goto error; if(json_array_append_new(array, value)) { set_error(s, "", "Unable to append to array"); goto error; } next_token(s); } return array; error: json_decref(array); return NULL; } static json_t *pack(scanner_t *s, va_list *ap) { switch(s->token) { case '{': return pack_object(s, ap); case '[': return pack_array(s, ap); case 's': /* string */ { const char *str = va_arg(*ap, const char *); if(!str) { set_error(s, "", "NULL string argument"); return NULL; } if(!utf8_check_string(str, -1)) { set_error(s, "", "Invalid UTF-8 string"); return NULL; } return json_string_nocheck(str); } case 'n': /* null */ return json_null(); case 'b': /* boolean */ return va_arg(*ap, int) ? json_true() : json_false(); case 'i': /* integer from int */ return json_integer(va_arg(*ap, int)); case 'I': /* integer from json_int_t */ return json_integer(va_arg(*ap, json_int_t)); case 'f': /* real */ return json_real(va_arg(*ap, double)); case 'O': /* a json_t object; increments refcount */ return json_incref(va_arg(*ap, json_t *)); case 'o': /* a json_t object; doesn't increment refcount */ return va_arg(*ap, json_t *); default: set_error(s, "", "Unexpected format character '%c'", s->token); return NULL; } } static int unpack(scanner_t *s, json_t *root, va_list *ap); static int unpack_object(scanner_t *s, json_t *root, va_list *ap) { int ret = -1; int strict = 0; /* Use a set (emulated by a hashtable) to check that all object keys are accessed. Checking that the correct number of keys were accessed is not enough, as the same key can be unpacked multiple times. */ hashtable_t key_set; if(hashtable_init(&key_set)) { set_error(s, "", "Out of memory"); return -1; } if(root && !json_is_object(root)) { set_error(s, "", "Expected object, got %s", type_name(root)); goto out; } next_token(s); while(s->token != '}') { const char *key; json_t *value; int opt = 0; if(strict != 0) { set_error(s, "", "Expected '}' after '%c', got '%c'", (strict == 1 ? '!' : '*'), s->token); goto out; } if(!s->token) { set_error(s, "", "Unexpected end of format string"); goto out; } if(s->token == '!' || s->token == '*') { strict = (s->token == '!' ? 1 : -1); next_token(s); continue; } if(s->token != 's') { set_error(s, "", "Expected format 's', got '%c'", s->token); goto out; } key = va_arg(*ap, const char *); if(!key) { set_error(s, "", "NULL object key"); goto out; } next_token(s); if(s->token == '?') { opt = 1; next_token(s); } if(!root) { /* skipping */ value = NULL; } else { value = json_object_get(root, key); if(!value && !opt) { set_error(s, "", "Object item not found: %s", key); goto out; } } if(unpack(s, value, ap)) goto out; hashtable_set(&key_set, key, 0, json_null()); next_token(s); } if(strict == 0 && (s->flags & JSON_STRICT)) strict = 1; if(root && strict == 1 && key_set.size != json_object_size(root)) { long diff = (long)json_object_size(root) - (long)key_set.size; set_error(s, "", "%li object item(s) left unpacked", diff); goto out; } ret = 0; out: hashtable_close(&key_set); return ret; } static int unpack_array(scanner_t *s, json_t *root, va_list *ap) { size_t i = 0; int strict = 0; if(root && !json_is_array(root)) { set_error(s, "", "Expected array, got %s", type_name(root)); return -1; } next_token(s); while(s->token != ']') { json_t *value; if(strict != 0) { set_error(s, "", "Expected ']' after '%c', got '%c'", (strict == 1 ? '!' : '*'), s->token); return -1; } if(!s->token) { set_error(s, "", "Unexpected end of format string"); return -1; } if(s->token == '!' || s->token == '*') { strict = (s->token == '!' ? 1 : -1); next_token(s); continue; } if(!strchr(unpack_value_starters, s->token)) { set_error(s, "", "Unexpected format character '%c'", s->token); return -1; } if(!root) { /* skipping */ value = NULL; } else { value = json_array_get(root, i); if(!value) { set_error(s, "", "Array index %lu out of range", (unsigned long)i); return -1; } } if(unpack(s, value, ap)) return -1; next_token(s); i++; } if(strict == 0 && (s->flags & JSON_STRICT)) strict = 1; if(root && strict == 1 && i != json_array_size(root)) { long diff = (long)json_array_size(root) - (long)i; set_error(s, "", "%li array item(s) left unpacked", diff); return -1; } return 0; } static int unpack(scanner_t *s, json_t *root, va_list *ap) { switch(s->token) { case '{': return unpack_object(s, root, ap); case '[': return unpack_array(s, root, ap); case 's': if(root && !json_is_string(root)) { set_error(s, "", "Expected string, got %s", type_name(root)); return -1; } if(!(s->flags & JSON_VALIDATE_ONLY)) { const char **target; target = va_arg(*ap, const char **); if(!target) { set_error(s, "", "NULL string argument"); return -1; } if(root) *target = json_string_value(root); } return 0; case 'i': if(root && !json_is_integer(root)) { set_error(s, "", "Expected integer, got %s", type_name(root)); return -1; } if(!(s->flags & JSON_VALIDATE_ONLY)) { int *target = va_arg(*ap, int*); if(root) *target = (int)json_integer_value(root); } return 0; case 'I': if(root && !json_is_integer(root)) { set_error(s, "", "Expected integer, got %s", type_name(root)); return -1; } if(!(s->flags & JSON_VALIDATE_ONLY)) { json_int_t *target = va_arg(*ap, json_int_t*); if(root) *target = json_integer_value(root); } return 0; case 'b': if(root && !json_is_boolean(root)) { set_error(s, "", "Expected true or false, got %s", type_name(root)); return -1; } if(!(s->flags & JSON_VALIDATE_ONLY)) { int *target = va_arg(*ap, int*); if(root) *target = json_is_true(root); } return 0; case 'f': if(root && !json_is_real(root)) { set_error(s, "", "Expected real, got %s", type_name(root)); return -1; } if(!(s->flags & JSON_VALIDATE_ONLY)) { double *target = va_arg(*ap, double*); if(root) *target = json_real_value(root); } return 0; case 'F': if(root && !json_is_number(root)) { set_error(s, "", "Expected real or integer, got %s", type_name(root)); return -1; } if(!(s->flags & JSON_VALIDATE_ONLY)) { double *target = va_arg(*ap, double*); if(root) *target = json_number_value(root); } return 0; case 'O': if(root && !(s->flags & JSON_VALIDATE_ONLY)) json_incref(root); /* Fall through */ case 'o': if(!(s->flags & JSON_VALIDATE_ONLY)) { json_t **target = va_arg(*ap, json_t**); if(root) *target = root; } return 0; case 'n': /* Never assign, just validate */ if(root && !json_is_null(root)) { set_error(s, "", "Expected null, got %s", type_name(root)); return -1; } return 0; default: set_error(s, "", "Unexpected format character '%c'", s->token); return -1; } } json_t *json_vpack_ex(json_error_t *error, size_t flags, const char *fmt, va_list ap) { scanner_t s; va_list ap_copy; json_t *value; if(!fmt || !*fmt) { jsonp_error_init(error, ""); jsonp_error_set(error, -1, -1, 0, "NULL or empty format string"); return NULL; } jsonp_error_init(error, NULL); scanner_init(&s, error, flags, fmt); next_token(&s); va_copy(ap_copy, ap); value = pack(&s, &ap_copy); va_end(ap_copy); if(!value) return NULL; next_token(&s); if(s.token) { json_decref(value); set_error(&s, "", "Garbage after format string"); return NULL; } return value; } json_t *json_pack_ex(json_error_t *error, size_t flags, const char *fmt, ...) { json_t *value; va_list ap; va_start(ap, fmt); value = json_vpack_ex(error, flags, fmt, ap); va_end(ap); return value; } json_t *json_pack(const char *fmt, ...) { json_t *value; va_list ap; va_start(ap, fmt); value = json_vpack_ex(NULL, 0, fmt, ap); va_end(ap); return value; } int json_vunpack_ex(json_t *root, json_error_t *error, size_t flags, const char *fmt, va_list ap) { scanner_t s; va_list ap_copy; if(!root) { jsonp_error_init(error, ""); jsonp_error_set(error, -1, -1, 0, "NULL root value"); return -1; } if(!fmt || !*fmt) { jsonp_error_init(error, ""); jsonp_error_set(error, -1, -1, 0, "NULL or empty format string"); return -1; } jsonp_error_init(error, NULL); scanner_init(&s, error, flags, fmt); next_token(&s); va_copy(ap_copy, ap); if(unpack(&s, root, &ap_copy)) { va_end(ap_copy); return -1; } va_end(ap_copy); next_token(&s); if(s.token) { set_error(&s, "", "Garbage after format string"); return -1; } return 0; } int json_unpack_ex(json_t *root, json_error_t *error, size_t flags, const char *fmt, ...) { int ret; va_list ap; va_start(ap, fmt); ret = json_vunpack_ex(root, error, flags, fmt, ap); va_end(ap); return ret; } int json_unpack(json_t *root, const char *fmt, ...) { int ret; va_list ap; va_start(ap, fmt); ret = json_vunpack_ex(root, NULL, 0, fmt, ap); va_end(ap); return ret; } nvidia-settings/src/glxinfo.h0000664000175000017500000000234212236467170016451 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __GLXINFO_H__ #define __GLXINFO_H__ #include #include "query-assign.h" #ifndef GLX_VERSION_1_3 #warning GLX version 1.3 not defined, will not show FBConfig table! #else const char * render_type_abbrev(int rend_type); const char * transparent_type_abbrev(int trans_type); const char * x_visual_type_abbrev(int x_visual_type); const char * caveat_abbrev(int caveat); #endif void print_glxinfo(const char *display_name, CtrlHandlesArray *handles_array); #endif /* __GLXINFO_H__ */ nvidia-settings/src/config-file.c0000664000175000017500000007103412236467170017164 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * config-file.c - this source file contains functions for processing * the NVIDIA X Server control panel configuration file. * * The configuration file is simply a newline-separated list of * attribute strings, where the syntax of an attribute string is * described in the comments of parse.h * * The pound sign ('#') signifies the beginning of a comment; comments * continue until a newline. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "NvCtrlAttributes.h" #include "config-file.h" #include "query-assign.h" #include "parse.h" #include "msg.h" typedef struct { ParsedAttribute a; int line; CtrlHandles *h; } ParsedAttributeWrapper; static ParsedAttributeWrapper *parse_config_file(char *buf, const char *file, const int length, ConfigProperties *); static int process_config_file_attributes(const char *file, ParsedAttributeWrapper *w, const char *display_name, CtrlHandlesArray *handles_array); static void save_gui_parsed_attributes(ParsedAttributeWrapper *w, ParsedAttribute *p); static float get_color_value(int attr, float c[3], float b[3], float g[3]); static int parse_config_property(const char *file, const char *line, ConfigProperties *conf); static void write_config_properties(FILE *stream, ConfigProperties *conf, char *locale); static char *create_display_device_target_string(CtrlHandleTarget *t, ConfigProperties *conf); extern int __verbosity; extern int __verbosity_level_changed; /* * nv_read_config_file() - read the specified config file, building a * list of attributes to send. Once all attributes are read, send * them to the X server. * * mmap(2) the file into memory for easier manipulation. * * If an error occurs while parsing the configuration file, an error * message is printed to stderr, NV_FALSE is returned, and nothing is * sent to the X server. * * NOTE: The conf->locale should have already been setup by calling * init_config_properties() prior to calling this function. * * XXX should we do any sort of versioning to handle compatibility * problems in the future? */ int nv_read_config_file(const char *file, const char *display_name, ParsedAttribute *p, ConfigProperties *conf, CtrlHandlesArray *handles_array) { int fd, ret, length; struct stat stat_buf; char *buf, *locale; ParsedAttributeWrapper *w = NULL; if (!file) { /* * file is NULL, likely because tilde_expansion() failed and * returned NULL; silently fail */ return NV_FALSE; } /* open the file */ fd = open(file, O_RDONLY); if (fd == -1) { /* * It's OK if the file doesn't exist... but should we print a * warning? */ return NV_FALSE; } /* get the size of the file */ ret = fstat(fd, &stat_buf); if (ret == -1) { nv_error_msg("Unable to determine size of file '%s' (%s).", file, strerror(errno)); return NV_FALSE; } if (stat_buf.st_size == 0) { nv_warning_msg("File '%s' has zero size; not reading.", file); close(fd); return NV_TRUE; } length = stat_buf.st_size; /* map the file into memory */ buf = mmap(0, length, PROT_READ, MAP_SHARED, fd, 0); if (buf == (void *) -1) { nv_error_msg("Unable to mmap file '%s' for reading (%s).", file, strerror(errno)); return NV_FALSE; } /* * save the current locale, parse the actual text in the file * and restore the saved locale (could be changed). */ locale = strdup(conf->locale); w = parse_config_file(buf, file, length, conf); setlocale(LC_NUMERIC, locale); free(locale); /* unmap and close the file */ if (munmap (buf, stat_buf.st_size) == -1) { nv_error_msg("Unable to unmap file '%s' after reading (%s).", file, strerror(errno)); return NV_FALSE; } close(fd); if (!w) return NV_FALSE; /* process the parsed attributes */ ret = process_config_file_attributes(file, w, display_name, handles_array); /* * add any relevant parsed attributes back to the list to be * passed to the gui */ save_gui_parsed_attributes(w, p); if (w) free(w); return ret; } /* nv_read_config_file() */ /* * nv_write_config_file() - write a configuration file to the * specified filename. * * XXX how should this be handled? Currently, we just query all * writable attributes, writing their current value to file. * * XXX should query first, and only once we know we can't fail, then * write the file (to avoid deleting the existing file). */ int nv_write_config_file(const char *filename, CtrlHandles *h, ParsedAttribute *p, ConfigProperties *conf) { int screen, ret, entry, val, display, randr_gamma_available; FILE *stream; time_t now; ReturnStatus status; NVCTRLAttributePermissionsRec perms; NVCTRLAttributeValidValuesRec valid; CtrlHandleTarget *t; char *prefix, scratch[4]; const char *tmp; char *locale = "C"; if (!filename) { nv_error_msg("Unable to open configuration file for writing."); return NV_FALSE; } stream = fopen(filename, "w"); if (!stream) { nv_error_msg("Unable to open file '%s' for writing.", filename); return NV_FALSE; } /* write header */ now = time(NULL); fprintf(stream, "#\n"); fprintf(stream, "# %s\n", filename); fprintf(stream, "#\n"); fprintf(stream, "# Configuration file for nvidia-settings - the NVIDIA " "X Server Settings utility\n"); /* NOTE: ctime(3) generates a new line */ fprintf(stream, "# Generated on %s", ctime(&now)); fprintf(stream, "#\n"); /* * set the locale to "C" before writing the configuration file to * reduce the risk of locale related parsing problems. Restore * the original locale before exiting this function. */ if (setlocale(LC_NUMERIC, "C") == NULL) { nv_warning_msg("Error writing configuration file '%s': could " "not set the locale 'C'.", filename); locale = conf->locale; } /* write the values in ConfigProperties */ write_config_properties(stream, conf, locale); /* for each screen, query each attribute in the table */ fprintf(stream, "\n"); fprintf(stream, "# Attributes:\n"); fprintf(stream, "\n"); /* * Note: we only save writable attributes addressable by X screen here * followed by attributes for display target types. */ for (screen = 0; screen < h->targets[X_SCREEN_TARGET].n; screen++) { t = &h->targets[X_SCREEN_TARGET].t[screen]; /* skip it if we don't have a handle for this screen */ if (!t->h) continue; /* * construct the prefix that will be printed in the config * file in front of each attribute on this screen; this will * either be "[screen]" or "[displayname]". */ if (conf->booleans & CONFIG_PROPERTIES_INCLUDE_DISPLAY_NAME_IN_CONFIG_FILE) { prefix = t->name; } else { snprintf(scratch, 4, "%d", screen); prefix = scratch; } /* loop over all the entries in the table */ for (entry = 0; attributeTable[entry].name; entry++) { const AttributeTableEntry *a = &attributeTable[entry]; /* * skip all attributes that are not supposed to be written * to the config file */ if (a->flags & NV_PARSER_TYPE_NO_CONFIG_WRITE) continue; /* * special case the color attributes because we want to * print floats */ if (a->flags & NV_PARSER_TYPE_COLOR_ATTRIBUTE) { float c[3], b[3], g[3]; /* * if we are using RandR gamma, skip saving the color info */ status = NvCtrlGetAttribute(t->h, NV_CTRL_ATTR_RANDR_GAMMA_AVAILABLE, &val); if (status == NvCtrlSuccess && val) continue; status = NvCtrlGetColorAttributes(t->h, c, b, g); if (status != NvCtrlSuccess) continue; fprintf(stream, "%s%c%s=%f\n", prefix, DISPLAY_NAME_SEPARATOR, a->name, get_color_value(a->attr, c, b, g)); continue; } /* Ignore display attributes, they are written later on */ ret = nv_get_attribute_perms(h, a->attr, a->flags, &perms); if (!ret || (perms.permissions & ATTRIBUTE_TYPE_DISPLAY)) { continue; } /* Only write attributes that can be written */ status = NvCtrlGetValidAttributeValues(t->h, a->attr, &valid); if (status != NvCtrlSuccess || !(valid.permissions & ATTRIBUTE_TYPE_WRITE) || (valid.permissions & ATTRIBUTE_TYPE_DISPLAY)) {; continue; } status = NvCtrlGetAttribute(t->h, a->attr, &val); if (status != NvCtrlSuccess) { continue; } if (a->flags & NV_PARSER_TYPE_VALUE_IS_DISPLAY_ID) { const char *name = nv_get_display_target_config_name(h, val); if (name) { fprintf(stream, "%s%c%s=%s\n", prefix, DISPLAY_NAME_SEPARATOR, a->name, name); } continue; } fprintf(stream, "%s%c%s=%d\n", prefix, DISPLAY_NAME_SEPARATOR, a->name, val); } /* entry */ } /* screen */ /* * Write attributes addressable to display targets */ for (display = 0; display < h->targets[DISPLAY_TARGET].n; display++) { t = &h->targets[DISPLAY_TARGET].t[display]; /* skip it if we don't have a handle for this display */ if (!t->h) continue; /* * check to see if we have RANDR gamma available. We may * skip writing attributes if it is missing. */ status = NvCtrlGetAttribute(t->h, NV_CTRL_ATTR_RANDR_GAMMA_AVAILABLE, &randr_gamma_available); if (status != NvCtrlSuccess) { randr_gamma_available = 0; } /* Get the prefix we want to use for the display device target */ prefix = create_display_device_target_string(t, conf); /* loop over all the entries in the table */ for (entry = 0; attributeTable[entry].name; entry++) { const AttributeTableEntry *a = &attributeTable[entry]; /* * skip all attributes that are not supposed to be written * to the config file */ if (a->flags & NV_PARSER_TYPE_NO_CONFIG_WRITE) continue; /* * for the display target we only write color attributes for now */ if (a->flags & NV_PARSER_TYPE_COLOR_ATTRIBUTE) { float c[3], b[3], g[3]; if (!randr_gamma_available) continue; status = NvCtrlGetColorAttributes(t->h, c, b, g); if (status != NvCtrlSuccess) continue; fprintf(stream, "%s%c%s=%f\n", prefix, DISPLAY_NAME_SEPARATOR, a->name, get_color_value(a->attr, c, b, g)); continue; } /* Make sure this is a display attribute */ ret = nv_get_attribute_perms(h, a->attr, a->flags, &perms); if (!ret || !(perms.permissions & ATTRIBUTE_TYPE_DISPLAY)) { continue; } status = NvCtrlGetValidAttributeValues(t->h, a->attr, &valid); if (status != NvCtrlSuccess || !(valid.permissions & ATTRIBUTE_TYPE_WRITE) || !(valid.permissions & ATTRIBUTE_TYPE_DISPLAY)) { continue; } status = NvCtrlGetAttribute(t->h, a->attr, &val); if (status == NvCtrlSuccess) { fprintf(stream, "%s%c%s=%d\n", prefix, DISPLAY_NAME_SEPARATOR, a->name, val); } } free(prefix); } /* * loop the ParsedAttribute list, writing the attributes to file. * note that we ignore conf->include_display_name_in_config_file * when writing these parsed attributes; this is because parsed * attributes (like the framelock properties) require a display * name be specified (since there are multiple X servers * involved). */ while (p) { char target_str[64]; if (!p->next) { p = p->next; continue; } tmp = nv_get_attribute_name(p->attr, NV_PARSER_TYPE_STRING_ATTRIBUTE, p->flags); if (!tmp) { nv_error_msg("Failure to save unknown attribute %d.", p->attr); p = p->next; continue; } /* * if the parsed attribute has a target specification, and a * target type other than an X screen, include a target * specification in what we write to the .rc file. */ target_str[0] = '\0'; if ((p->flags & NV_PARSER_HAS_TARGET) && (p->target_type != NV_CTRL_TARGET_TYPE_X_SCREEN)) { const TargetTypeEntry *targetTypeEntry; /* Find the target name of the target type */ targetTypeEntry = nv_get_target_type_entry_by_nvctrl(p->target_type); if (targetTypeEntry) { snprintf(target_str, 64, "[%s:%d]", targetTypeEntry->parsed_name, p->target_id); } } if (p->flags & NV_PARSER_TYPE_HIJACK_DISPLAY_DEVICE) { fprintf(stream, "%s%s%c%s[0x%08x]=%d\n", p->display, target_str, DISPLAY_NAME_SEPARATOR, tmp, p->display_device_mask, p->val.i); } else { fprintf(stream, "%s%s%c%s=%d\n", p->display, target_str, DISPLAY_NAME_SEPARATOR, tmp, p->val.i); } p = p->next; } setlocale(LC_NUMERIC, conf->locale); /* close the configuration file */ ret = fclose(stream); if (ret != 0) { nv_error_msg("Failure while closing file '%s'.", filename); return NV_FALSE; } return NV_TRUE; } /* nv_write_config_file() */ /* * parse_config_file() - scan through the buffer; skipping comment * lines. Non-comment lines with non-whitespace characters are passed * on to nv_parse_attribute_string for parsing. * * If an error occurs, an error message is printed and NULL is * returned. If successful, a malloced array of * ParsedAttributeWrapper structs is returned. The last * ParsedAttributeWrapper in the array has line == -1. It is the * caller's responsibility to free the array. */ static ParsedAttributeWrapper *parse_config_file(char *buf, const char *file, const int length, ConfigProperties *conf) { int line, has_data, current_tmp_len, len, n, ret; char *cur, *c, *comment, *tmp; ParsedAttributeWrapper *w; cur = buf; line = 1; current_tmp_len = 0; n = 0; w = NULL; tmp = NULL; while (cur) { c = cur; comment = NULL; has_data = NV_FALSE;; while (((c - buf) < length) && (*c != '\n') && (*c != '\0')) { if (comment) { c++; continue; } if (*c == '#') { comment = c; continue; } if (!isspace(*c)) has_data = NV_TRUE; c++; } if (has_data) { if (!comment) comment = c; len = comment - cur; /* grow the tmp buffer if it's too small */ if (len >= current_tmp_len) { current_tmp_len = len + 1; if (tmp) { free(tmp); } tmp = nvalloc(sizeof(char) * current_tmp_len); } strncpy (tmp, cur, len); tmp[len] = '\0'; /* first, see if this line is a config property */ if (!parse_config_property(file, tmp, conf)) { w = nvrealloc(w, sizeof(ParsedAttributeWrapper) * (n+1)); ret = nv_parse_attribute_string(tmp, NV_PARSER_ASSIGNMENT, &w[n].a); if (ret != NV_PARSER_STATUS_SUCCESS) { nv_error_msg("Error parsing configuration file '%s' on " "line %d: '%s' (%s).", file, line, tmp, nv_parse_strerror(ret)); goto failed; } w[n].line = line; n++; } } if (((c - buf) >= length) || (*c == '\0')) cur = NULL; else cur = c + 1; line++; } free(tmp); /* mark the end of the array */ w = nvrealloc(w, sizeof(ParsedAttributeWrapper) * (n+1)); w[n].line = -1; return w; failed: if (w) free(w); free(tmp); return NULL; } /* parse_config_file() */ /* * process_config_file_attributes() - process the list of * attributes to be assigned that we acquired in parsing the config * file. */ static int process_config_file_attributes(const char *file, ParsedAttributeWrapper *w, const char *display_name, CtrlHandlesArray *handles_array) { int i; int old_verbosity = __verbosity; /* Override the verbosity in the default behavior so * nvidia-settings isn't so alarmist when loading the RC file. */ if (!__verbosity_level_changed) { __verbosity = VERBOSITY_NONE; } /* * make sure that all ParsedAttributes have displays (this will do * nothing if we already have a display name */ for (i = 0; w[i].line != -1; i++) { nv_assign_default_display(&w[i].a, display_name); } /* build the list of CtrlHandles */ for (i = 0; w[i].line != -1; i++) { w[i].h = nv_alloc_ctrl_handles_and_add_to_array(w[i].a.display, handles_array); } /* now process each attribute, passing in the correct CtrlHandles */ for (i = 0; w[i].line != -1; i++) { nv_process_parsed_attribute(&w[i].a, w[i].h, NV_TRUE, NV_FALSE, "on line %d of configuration file " "'%s'", w[i].line, file); /* * We do not fail if processing the attribute failed. If the * GPU or the X config changed (for example stereo is * disabled), some attributes written in the config file may * not be advertised by the NVCTRL extension (for example the * control to force stereo) */ } /* Reset the default verbosity */ if (!__verbosity_level_changed) { __verbosity = old_verbosity; } return NV_TRUE; } /* process_config_file_attributes() */ /* * save_gui_parsed_attributes() - scan through the parsed attribute * wrappers, and save any relevant attributes to the attribute list to * be passed to the gui. */ static void save_gui_parsed_attributes(ParsedAttributeWrapper *w, ParsedAttribute *p) { int i; for (i = 0; w[i].line != -1; i++) { if (w[i].a.flags & NV_PARSER_TYPE_GUI_ATTRIBUTE) { nv_parsed_attribute_add(p, &w[i].a); } } } /* save_gui_parsed_attributes() */ static float get_color_value(int attr, float c[3], float b[3], float g[3]) { switch (attr & (ALL_VALUES | ALL_CHANNELS)) { case (CONTRAST_VALUE | RED_CHANNEL): return c[RED_CHANNEL_INDEX]; case (CONTRAST_VALUE | GREEN_CHANNEL): return c[GREEN_CHANNEL_INDEX]; case (CONTRAST_VALUE | BLUE_CHANNEL): return c[BLUE_CHANNEL_INDEX]; case (BRIGHTNESS_VALUE | RED_CHANNEL): return b[RED_CHANNEL_INDEX]; case (BRIGHTNESS_VALUE | GREEN_CHANNEL): return b[GREEN_CHANNEL_INDEX]; case (BRIGHTNESS_VALUE | BLUE_CHANNEL): return b[BLUE_CHANNEL_INDEX]; case (GAMMA_VALUE | RED_CHANNEL): return g[RED_CHANNEL_INDEX]; case (GAMMA_VALUE | GREEN_CHANNEL): return g[GREEN_CHANNEL_INDEX]; case (GAMMA_VALUE | BLUE_CHANNEL): return g[BLUE_CHANNEL_INDEX]; default: return 0.0; } } /* get_color_value() */ /* * Table of ConfigProperties (properties of the nvidia-settings * utilities itself, rather than properties of the X screen(s) that * nvidia-settings is configuring). The table just binds string names * to the bitmask constants. */ typedef struct { char *name; unsigned int flag; } ConfigPropertiesTableEntry; ConfigPropertiesTableEntry configPropertyTable[] = { { "ToolTips", CONFIG_PROPERTIES_TOOLTIPS }, { "DisplayStatusBar", CONFIG_PROPERTIES_DISPLAY_STATUS_BAR }, { "SliderTextEntries", CONFIG_PROPERTIES_SLIDER_TEXT_ENTRIES }, { "IncludeDisplayNameInConfigFile", CONFIG_PROPERTIES_INCLUDE_DISPLAY_NAME_IN_CONFIG_FILE }, { "ShowQuitDialog", CONFIG_PROPERTIES_SHOW_QUIT_DIALOG }, { "UpdateRulesOnProfileNameChange", CONFIG_PROPERTIES_UPDATE_RULES_ON_PROFILE_NAME_CHANGE }, { NULL, 0 } }; /* * parse_config_property() - special case the config properties; if * the given line sets a config property, update conf as appropriate * and return NV_TRUE. If the given line does not describe a config * property, return NV_FALSE. */ static int parse_config_property(const char *file, const char *line, ConfigProperties *conf) { char *no_spaces, *s; char *locale; ConfigPropertiesTableEntry *t; char *timer, *token; TimerConfigProperty *c = NULL; int interval; int ret = NV_FALSE; unsigned int flag; no_spaces = remove_spaces(line); if (!no_spaces) goto done; s = strchr(no_spaces, '='); if (!s) goto done; *s = '\0'; if (nv_strcasecmp(no_spaces, "RcFileLocale")) { locale = ++s; if (setlocale(LC_NUMERIC, locale) == NULL) { nv_warning_msg("Error parsing configuration file '%s': could " "not set the specified locale '%s'.", file, locale); } } else if (nv_strcasecmp(no_spaces, "Timer")) { timer = ++s; token = strtok(timer, ","); if (!token) goto done; c = nvalloc(sizeof(TimerConfigProperty)); c->description = replace_characters(token, '_', ' '); token = strtok(NULL, ","); if (!token) goto done; if (nv_strcasecmp(token, "Yes")) { c->user_enabled = 1; } else if (nv_strcasecmp(token, "No")) { c->user_enabled = 0; } else { goto done; } token = strtok(NULL, ","); if (!token) goto done; parse_read_integer(token, &interval); c->interval = interval; c->next = conf->timers; conf->timers = c; } else { for (t = configPropertyTable, flag = 0; t->name; t++) { if (nv_strcasecmp(no_spaces, t->name)) { flag = t->flag; break; } } if (!flag) goto done; s++; if (nv_strcasecmp(s, "yes")) { conf->booleans |= flag; } else if (nv_strcasecmp(s, "no")) { conf->booleans &= ~flag; } else { goto done; } } ret = NV_TRUE; done: if ((ret != NV_TRUE) && c) { if (c->description) free(c->description); free(c); } if (no_spaces) free(no_spaces); return ret; } /* parse_config_property() */ /* * write_config_properties() - write the ConfigProperties to file; * this just amounts to looping through the table, and printing if * each property is enabled or disabled. */ static void write_config_properties(FILE *stream, ConfigProperties *conf, char *locale) { ConfigPropertiesTableEntry *t; TimerConfigProperty *c; char *description; fprintf(stream, "\n"); fprintf(stream, "# ConfigProperties:\n"); fprintf(stream, "\n"); fprintf(stream, "RcFileLocale = %s\n", locale); for (t = configPropertyTable; t->name; t++) { fprintf(stream, "%s = %s\n", t->name, (t->flag & conf->booleans) ? "Yes" : "No"); } for (c = conf->timers; (c != NULL); c = c->next) { description = replace_characters(c->description, ' ', '_'); fprintf(stream, "Timer = %s,%s,%u\n", description, c->user_enabled ? "Yes" : "No", c->interval); free(description); } } /* write_config_properties()*/ /* * init_config_properties() - initialize the ConfigProperties * structure. */ void init_config_properties(ConfigProperties *conf) { memset(conf, 0, sizeof(ConfigProperties)); conf->booleans = (CONFIG_PROPERTIES_TOOLTIPS | CONFIG_PROPERTIES_DISPLAY_STATUS_BAR | CONFIG_PROPERTIES_SLIDER_TEXT_ENTRIES | CONFIG_PROPERTIES_SHOW_QUIT_DIALOG | CONFIG_PROPERTIES_UPDATE_RULES_ON_PROFILE_NAME_CHANGE); conf->locale = strdup(setlocale(LC_NUMERIC, NULL)); } /* init_config_properties() */ /* * create_display_device_target_string() - create the string * to specify the display device target in the config file. */ static char *create_display_device_target_string(CtrlHandleTarget *t, ConfigProperties *conf) { char *target_name = NULL; char *target_prefix_name = NULL; char *display_name = NULL; char *s; int target_type; if (t->protoNames[NV_DPY_PROTO_NAME_RANDR]) { target_name = t->protoNames[NV_DPY_PROTO_NAME_RANDR]; } /* If we don't have a target name here, use the full name and return. */ if (!target_name) { return nvstrdup(t->name); } /* Get the display name if the user requested it to be used. */ if (conf->booleans & CONFIG_PROPERTIES_INCLUDE_DISPLAY_NAME_IN_CONFIG_FILE) { display_name = NvCtrlGetDisplayName(t->h); } /* Get the target type prefix. */ target_type = NvCtrlGetTargetType(t->h); if (target_type >= 0) { target_prefix_name = nvstrdup(targetTypeTable[target_type].parsed_name); nvstrtoupper(target_prefix_name); } /* Build the string */ if (display_name && target_prefix_name) { s = nvasprintf("%s[%s:%s]", display_name, target_prefix_name, target_name); } else if (target_prefix_name) { s = nvasprintf("[%s:%s]", target_prefix_name, target_name); } else if (display_name) { s = nvasprintf("%s[%s]", display_name, target_name); } else { s = nvasprintf("[%s]", target_name); } free(target_prefix_name); free(display_name); return s; } nvidia-settings/src/xpm_data/0000775000175000017500000000000012236467170016426 5ustar albertoalbertonvidia-settings/src/xpm_data/svp_status_nosignal.h0000664000175000017500000000104512236467170022704 0ustar albertoalberto/* XPM */ static const char * svp_status_nosignal_xpm[] = { "24 16 2 1", " c None", ". c #CECFCE", " ....", " ....", " ....", " .... ....", " .... ....", " .... ....", " .... .... ....", " .... .... ....", " .... .... ....", " .... .... .... ....", " .... .... .... ....", " .... .... .... ....", ".... .... .... .... ....", ".... .... .... .... ....", ".... .... .... .... ....", ".... .... .... .... ...."}; nvidia-settings/src/xpm_data/rgb_xpm.h0000664000175000017500000000077312236467170020244 0ustar albertoalberto/* XPM */ static const char *rgb_xpm[] = { "16 16 10 1", " c black", ". c navy", "X c blue", "o c #008000", "O c green", "+ c cyan", "@ c #800000", "# c red", "$ c white", "% c None", "%%%%%%%%%%%%%%%%", "%%%@ %%%%%%. %%%", "%%@$# %%%%.+X %%", "%@$$## %%.++XX %", "@$$$### .+++XXX ", "@###@@@ .XXX... ", "%@##@@ o .XX.. %", "%%@#@ o$O .X. %%", "%%%@ o$$OO . %%%", "%%%%o$$$OOO %%%%", "%%%%oOOOooo %%%%", "%%%%%oOOoo %%%%%", "%%%%%%oOo %%%%%%", "%%%%%%%o %%%%%%%", "%%%%%%%%%%%%%%%%", "%%%%%%%%%%%%%%%%" }; nvidia-settings/src/xpm_data/blue_xpm.h0000664000175000017500000000067112236467170020416 0ustar albertoalberto/* XPM */ static const char * blue_xpm[] = { "16 16 5 1", " c black", ". c navy", "X c blue", "o c cyan", "O c None", "OOOOOOOOOOOOOOOO", "OOOOOOO.OOOOOOOO", "OOOOOO.X OOOOOOO", "OOOOO.oXX OOOOOO", "OOOO.ooXXX OOOOO", "OOO.oooXXXX OOOO", "OO.ooooXXXXX OOO", "O.XXXXX...... OO", "OO.XXXX..... OOO", "OOO.XXX.... OOOO", "OOOO.XX... OOOOO", "OOOOO.X.. OOOOOO", "OOOOOO.. OOOOOOO", "OOOOOOO OOOOOOOO", "OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO" }; nvidia-settings/src/xpm_data/green_xpm.h0000664000175000017500000000067712236467170020575 0ustar albertoalberto/* XPM */ static const char * green_xpm[] = { "16 16 5 1", " c black", ". c #008000", "X c green", "o c white", "O c None", "OOOOOOOOOOOOOOOO", "OOOOOOO.OOOOOOOO", "OOOOOO.X OOOOOOO", "OOOOO.oXX OOOOOO", "OOOO.ooXXX OOOOO", "OOO.oooXXXX OOOO", "OO.ooooXXXXX OOO", "O.XXXXXX..... OO", "OO.XXXX..... OOO", "OOO.XXX.... OOOO", "OOOO.XX... OOOOO", "OOOOO.X.. OOOOOO", "OOOOOO.. OOOOOOO", "OOOOOOO OOOOOOOO", "OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO" }; nvidia-settings/src/xpm_data/svp_status_low.h0000664000175000017500000000123112236467170021670 0ustar albertoalberto/* XPM */ static const char * svp_status_low_xpm[] = { "24 16 10 1", " c None", ". c #CECFCE", "+ c #73BA00", "@ c #73B600", "# c #73B200", "$ c #6BB200", "% c #6BAE00", "& c #6BAA00", "* c #6BA600", "= c #6BA200", " ....", " ....", " ....", " .... ....", " .... ....", " .... ....", " .... .... ....", " .... .... ....", " .... .... ....", " ++++ .... .... ....", " +++@ .... .... ....", " +@@# .... .... ....", "++++ @@#$ .... .... ....", "+++@ ##%% .... .... ....", "+@@@ #%&& .... .... ....", "@@## &&*= .... .... ...."}; nvidia-settings/src/xpm_data/svp_add_glasses.h0000664000175000017500000022367212236467170021754 0ustar albertoalberto/* XPM */ static const char * svp_add_glasses_xpm[] = { "320 80 1507 2", " c #878687", ". c #878787", "+ c #868787", "@ c #868786", "# c #878786", "$ c #878686", "% c #868687", "& c #868686", "* c #868685", "= c #868586", "- c #868585", "; c #858585", "> c #858586", ", c #858686", "' c #858685", ") c #858485", "! c #848585", "~ c #858584", "{ c #848485", "] c #848584", "^ c #858484", "/ c #848484", "( c #838484", "_ c #848384", ": c #838384", "< c #838383", "[ c #848483", "} c #848383", "| c #838483", "1 c #828383", "2 c #838283", "3 c #838382", "4 c #888888", "5 c #898989", "6 c #838282", "7 c #828282", "8 c #828283", "9 c #828382", "0 c #8B8B8B", "a c #8D8D8D", "b c #8D8D8E", "c c #8E8D8D", "d c #8B8B8C", "e c #818282", "f c #828182", "g c #828181", "h c #828281", "i c #818182", "j c #818281", "k c #818181", "l c #908F8F", "m c #929292", "n c #939393", "o c #929393", "p c #8F9090", "q c #808181", "r c #818180", "s c #818081", "t c #808081", "u c #959595", "v c #989898", "w c #989897", "x c #808080", "y c #7F8180", "z c #818080", "A c #808180", "B c #7F8080", "C c #807F80", "D c #9A9A9A", "E c #9D9D9D", "F c #9D9D9E", "G c #81807F", "H c #80807F", "I c #7F807F", "J c #7F7F80", "K c #7F7F7F", "L c #807F7F", "M c #9F9F9F", "N c #A4A3A3", "O c #A3A3A3", "P c #A3A3A4", "Q c #A4A4A4", "R c #7F7F7E", "S c #7E7F7F", "T c #7F7E7E", "U c #7E7E7F", "V c #7E7E7E", "W c #7F7E7F", "X c #7E7F7E", "Y c #A5A5A4", "Z c #A9A9A9", "` c #A9AAAA", " . c #AAA9A9", ".. c #A1A1A2", "+. c #7E7D7E", "@. c #7E7E7D", "#. c #7D7D7E", "$. c #7D7E7E", "%. c #7E7D7D", "&. c #7D7E7D", "*. c #7D7D7D", "=. c #A8A9A9", "-. c #AFAFAF", ";. c #AFAEAF", ">. c #AFAFAE", ",. c #AEAFAE", "'. c #A6A6A6", "). c #7C7D7D", "!. c #7D7C7D", "~. c #7D7D7C", "{. c #7C7C7D", "]. c #ADADAD", "^. c #B4B4B4", "/. c #B5B5B4", "(. c #AAAAAA", "_. c #7C7D7C", ":. c #7D7C7C", "<. c #7C7C7C", "[. c #B1B1B1", "}. c #B9B9B9", "|. c #ADAEAD", "1. c #7B7B7B", "2. c #7C7B7B", "3. c #7B7C7B", "4. c #7B7B7C", "5. c #7C7B7C", "6. c #7C7C7B", "7. c #7B7C7C", "8. c #B3B3B3", "9. c #BBBBBB", "0. c #B0AFAF", "a. c #7B7B7A", "b. c #7A7A7A", "c. c #7A7B7B", "d. c #7A7A7B", "e. c #7B7A7A", "f. c #7A7B7A", "g. c #7B7A7B", "h. c #B6B6B6", "i. c #BDBDBD", "j. c #B2B2B2", "k. c #797A7A", "l. c #79797A", "m. c #7A797A", "n. c #7A7979", "o. c #7A7A79", "p. c #797A79", "q. c #797979", "r. c #8C8C8C", "s. c #BABABA", "t. c #BCBCBC", "u. c #BCBDBC", "v. c #BDBCBD", "w. c #BDBCBC", "x. c #898888", "y. c #787978", "z. c #797978", "A. c #797878", "B. c #787979", "C. c #787878", "D. c #797879", "E. c #787879", "F. c #969696", "G. c #777877", "H. c #777878", "I. c #787778", "J. c #787777", "K. c #787877", "L. c #777778", "M. c #777777", "N. c #A0A0A0", "O. c #BBBCBC", "P. c #BCBBBB", "Q. c #BCBBBC", "R. c #BCBCBB", "S. c #9C9C9C", "T. c #777677", "U. c #767777", "V. c #777776", "W. c #767677", "X. c #777676", "Y. c #767776", "Z. c #767676", "`. c #757675", " + c #767675", ".+ c #757676", "++ c #757576", "@+ c #767876", "#+ c #767576", "$+ c #747575", "%+ c #747474", "&+ c #737373", "*+ c #727272", "=+ c #737474", "-+ c #757574", ";+ c #757575", ">+ c #767575", ",+ c #BBBBBA", "'+ c #AEAFAF", ")+ c #757475", "!+ c #747574", "~+ c #747374", "{+ c #727273", "]+ c #717171", "^+ c #707070", "/+ c #6F6F6F", "(+ c #6F6F6E", "_+ c #6F7070", ":+ c #707171", "<+ c #727172", "[+ c #737372", "}+ c #747473", "|+ c #B7B7B7", "1+ c #737473", "2+ c #70706F", "3+ c #6D6D6D", "4+ c #6C6C6C", "5+ c #6C6B6C", "6+ c #6E6E6E", "7+ c #737374", "8+ c #909090", "9+ c #B8B8B8", "0+ c #747373", "a+ c #515151", "b+ c #393939", "c+ c #474747", "d+ c #575757", "e+ c #666666", "f+ c #6B6B6B", "g+ c #6A6A6A", "h+ c #9B9B9B", "i+ c #979797", "j+ c #545454", "k+ c #343434", "l+ c #424142", "m+ c #646464", "n+ c #737272", "o+ c #727372", "p+ c #727171", "q+ c #6F706F", "r+ c #4F4F4F", "s+ c #262626", "t+ c #2D2D2D", "u+ c #2E2E2E", "v+ c #353535", "w+ c #3D3D3D", "x+ c #444444", "y+ c #484848", "z+ c #4C4C4C", "A+ c #525252", "B+ c #5B5B5B", "C+ c #626263", "D+ c #686868", "E+ c #696969", "F+ c #A0A1A0", "G+ c #303030", "H+ c #1B1B1B", "I+ c #1A1A1A", "J+ c #191919", "K+ c #232323", "L+ c #424242", "M+ c #606060", "N+ c #727271", "O+ c #707072", "P+ c #717172", "Q+ c #717170", "R+ c #717072", "S+ c #717271", "T+ c #717071", "U+ c #696869", "V+ c #6C6B6B", "W+ c #383838", "X+ c #3E3E3E", "Y+ c #404040", "Z+ c #414141", "`+ c #5C5C5C", " @ c #656565", ".@ c #696A69", "+@ c #696868", "@@ c #717070", "#@ c #636463", "$@ c #1E1E1F", "%@ c #343435", "&@ c #545353", "*@ c #717272", "=@ c #707071", "-@ c #706F71", ";@ c #706F70", ">@ c #6F6F70", ",@ c #6F6E6F", "'@ c #676767", ")@ c #6A6A6B", "!@ c #626262", "~@ c #454545", "{@ c #3B3B3B", "]@ c #3A3A3A", "^@ c #373737", "/@ c #363636", "(@ c #4A4A4A", "_@ c #565656", ":@ c #616161", "<@ c #656666", "[@ c #666767", "}@ c #686969", "|@ c #6D6D6E", "1@ c #6E6E6D", "2@ c #6F766B", "3@ c #6C8361", "4@ c #6A9057", "5@ c #689B4F", "6@ c #679F4C", "7@ c #679D4C", "8@ c #699652", "9@ c #6B8B5A", "0@ c #6E7D65", "a@ c #70726E", "b@ c #707170", "c@ c #555555", "d@ c #181818", "e@ c #191819", "f@ c #1B1B1C", "g@ c #1C1C1C", "h@ c #272727", "i@ c #474847", "j@ c #6E6F6F", "k@ c #706E6F", "l@ c #6E706F", "m@ c #706F6F", "n@ c #5F5F5F", "o@ c #3C3C3C", "p@ c #323332", "q@ c #505150", "r@ c #5D5D5D", "s@ c #6E6E6F", "t@ c #6D7569", "u@ c #698C57", "v@ c #64AB41", "w@ c #60C12F", "x@ c #5FC929", "y@ c #5ECC28", "z@ c #5ECD27", "A@ c #5ECC27", "B@ c #5ECB28", "C@ c #5FC82B", "D@ c #62BA36", "E@ c #669E4A", "F@ c #6C8161", "G@ c #6E716E", "H@ c #676867", "I@ c #464646", "J@ c #2A2A2A", "K@ c #171717", "L@ c #1D1D1D", "M@ c #232222", "N@ c #585959", "O@ c #706F6E", "P@ c #6D6E6E", "Q@ c #6E6D6D", "R@ c #6E6D6E", "S@ c #6D6E6D", "T@ c #6D6D6C", "U@ c #6B6A6B", "V@ c #676868", "W@ c #636464", "X@ c #616262", "Y@ c #636363", "Z@ c #4B4B4B", "`@ c #404041", " # c #2C2C2C", ".# c #292929", "+# c #282828", "@# c #4D4D4D", "## c #656465", "$# c #687D5E", "%# c #62A541", "&# c #5EC729", "*# c #5DCD25", "=# c #60BE32", "-# c #64A942", ";# c #669A4D", "># c #689153", ",# c #689452", "'# c #659F48", ")# c #63B13C", "!# c #5FC62B", "~# c #5DCF25", "{# c #60BD32", "]# c #679550", "^# c #6D7667", "/# c #5B5A5B", "(# c #39393A", "_# c #1E1E1E", ":# c #1F1F1F", "<# c #515150", "[# c #6E6D6F", "}# c #6D6C6D", "|# c #6C6D6D", "1# c #676766", "2# c #626162", "3# c #5E5E5E", "4# c #595959", "5# c #4E4E4E", "6# c #222222", "7# c #212121", "8# c #313131", "9# c #373838", "0# c #5A5A5A", "a# c #627E55", "b# c #5EB234", "c# c #5BCD23", "d# c #5EBA31", "e# c #64954B", "f# c #687C5F", "g# c #6B7169", "h# c #6D6F6B", "i# c #6C7567", "j# c #69875A", "k# c #64A642", "l# c #5EC72A", "m# c #5ECA28", "n# c #65A046", "o# c #6B7567", "p# c #6C6D6C", "q# c #6C6C6D", "r# c #505050", "s# c #2F2F2F", "t# c #434343", "u# c #646364", "v# c #6C6C6B", "w# c #6B6C6C", "x# c #6B6C6B", "y# c #6A6B6B", "z# c #666766", "A# c #5D5E5E", "B# c #5C5B5C", "C# c #2B2B2B", "D# c #252525", "E# c #4A4B4A", "F# c #5A724E", "G# c #5DB432", "H# c #5ACA22", "I# c #5EA33C", "J# c #647959", "K# c #6A696A", "L# c #6B7168", "M# c #678D54", "N# c #5FBC31", "O# c #5DCC25", "P# c #649F46", "Q# c #6B7366", "R# c #161616", "S# c #191818", "T# c #202020", "U# c #2C2D2D", "V# c #303131", "W# c #6B6B6A", "X# c #585858", "Y# c #242424", "Z# c #2D3A27", "`# c #438C1E", " $ c #4FBF16", ".$ c #569835", "+$ c #636E5E", "@$ c #646463", "#$ c #678459", "$$ c #5FBC30", "%$ c #5DC827", "&$ c #65914F", "*$ c #6B6C6A", "=$ c #6A6B6A", "-$ c #3A393A", ";$ c #3A3A39", ">$ c #69696A", ",$ c #6A6A69", "'$ c #696A6A", ")$ c #60605F", "!$ c #5C5D5C", "~$ c #565556", "{$ c #232523", "]$ c #315F19", "^$ c #44B30D", "/$ c #3E9015", "($ c #34442C", "_$ c #505151", ":$ c #646663", "<$ c #656B63", "[$ c #666C63", "}$ c #686A65", "|$ c #658D51", "1$ c #5FB832", "2$ c #687C5E", "3$ c #1C1B1C", "4$ c #3D3D3C", "5$ c #383737", "6$ c #6A6969", "7$ c #696968", "8$ c #686869", "9$ c #686968", "0$ c #686867", "a$ c #646565", "b$ c #5F6060", "c$ c #535353", "d$ c #333333", "e$ c #283521", "f$ c #3C9112", "g$ c #43AF0C", "h$ c #2D5319", "i$ c #555854", "j$ c #627B55", "k$ c #5E9643", "l$ c #5CA837", "m$ c #5DAB36", "n$ c #5F9D41", "o$ c #648453", "p$ c #666D63", "q$ c #676F64", "r$ c #61A83D", "s$ c #5CCC23", "t$ c #639649", "u$ c #696B68", "v$ c #222121", "w$ c #222122", "x$ c #2A2929", "y$ c #3E3D3D", "z$ c #302F30", "A$ c #535453", "B$ c #686767", "C$ c #686768", "D$ c #676768", "E$ c #676667", "F$ c #676666", "G$ c #575758", "H$ c #525152", "I$ c #515051", "J$ c #4B4B4A", "K$ c #383837", "L$ c #2E521C", "M$ c #43AE0D", "N$ c #3A8A13", "O$ c #252F20", "P$ c #282E26", "Q$ c #3B6527", "R$ c #4CA81E", "S$ c #56C61E", "T$ c #5BC526", "U$ c #59C225", "V$ c #59C922", "W$ c #5BC029", "X$ c #609845", "Y$ c #667161", "Z$ c #648553", "`$ c #5CC528", " % c #5FB235", ".% c #667360", "+% c #242524", "@% c #1A191A", "#% c #323232", "$% c #666667", "%% c #656665", "&% c #656564", "*% c #646465", "=% c #646564", "-% c #656566", ";% c #666665", ">% c #666566", ",% c #666565", "'% c #626261", ")% c #606160", "!% c #5E5E5F", "~% c #595958", "{% c #555556", "]% c #535354", "^% c #414242", "/% c #242624", "(% c #356F18", "_% c #44B10D", ":% c #326519", "<% c #222322", "[% c #294A19", "}% c #3F9F0E", "|% c #47B112", "1% c #458625", "2% c #4C6C3D", "3% c #5F7C52", "4% c #5E9443", "5% c #5ABC29", "6% c #5AC425", "7% c #609148", "8% c #656762", "9% c #65725F", "0% c #5CC12A", "a% c #647F56", "b% c #262727", "c% c #1F1E1E", "d% c #191A1A", "e% c #171617", "f% c #373636", "g% c #656464", "h% c #636364", "i% c #626363", "j% c #646363", "k% c #626362", "l% c #616162", "m% c #5F5E5F", "n% c #59595A", "o% c #545554", "p% c #4D4D4E", "q% c #252A23", "r% c #398214", "s% c #42A90E", "t% c #2B4B1C", "u% c #222A1F", "v% c #367D13", "w% c #43B30B", "x% c #2F6714", "y% c #272D24", "z% c #585A56", "A% c #5F844C", "B% c #59C025", "C% c #5BB52E", "D% c #617558", "E% c #656864", "F% c #5FA040", "G% c #5BC725", "H% c #62894F", "I% c #232423", "J% c #1B1C1B", "K% c #1A1B1B", "L% c #2B2B2C", "M% c #2B2C2B", "N% c #3B3B3C", "O% c #636262", "P% c #606061", "Q% c #616261", "R% c #606161", "S% c #636263", "T% c #5B5B5A", "U% c #555454", "V% c #525151", "W% c #282E25", "X% c #3C8E13", "Y% c #40A30F", "Z% c #283D1E", "`% c #25371D", " & c #3D9B0E", ".& c #3D9A0E", "+& c #25371C", "@& c #151515", "#& c #4F564C", "$& c #5CA637", "%& c #58C522", "&& c #5F814D", "*& c #609446", "=& c #5ACA23", "-& c #608E49", ";& c #232223", ">& c #121112", ",& c #393839", "'& c #262625", ")& c #29292A", "!& c #4C4A4B", "~& c #565757", "{& c #5F5F60", "]& c #5F605F", "^& c #616160", "/& c #626161", "(& c #5E5F5E", "_& c #5D5D5E", ":& c #5B5C5C", "<& c #565555", "[& c #4E4F4E", "}& c #3E3E3D", "|& c #2A3026", "1& c #3D9013", "2& c #40A20F", "3& c #283B1E", "4& c #273C1C", "5& c #3FA40D", "6& c #3A8D10", "7& c #232C1E", "8& c #0F0F0F", "9& c #4C4D4C", "0& c #518D31", "a& c #59C921", "b& c #5D8548", "c& c #5F9245", "d& c #608F48", "e& c #333332", "f& c #242323", "g& c #20201F", "h& c #131313", "i& c #3D3D3E", "j& c #252524", "k& c #292A29", "l& c #575656", "m& c #636362", "n& c #2B2A2A", "o& c #605F5F", "p& c #5E5D5D", "q& c #5E5D5E", "r& c #585958", "s& c #4F4E4E", "t& c #4A4949", "u& c #41453F", "v& c #3D8917", "w& c #42A80F", "x& c #2B481D", "y& c #25361D", "z& c #3D9A0F", "A& c #3D9D0D", "B& c #243819", "C& c #141414", "D& c #5F685B", "E& c #4E9B27", "F& c #58C422", "G& c #5B7D4C", "H& c #616360", "I& c #5D9B3F", "J& c #5AC624", "K& c #5F884B", "L& c #444544", "M& c #151514", "N& c #222323", "O& c #1E1F1E", "P& c #1D1C1D", "Q& c #282829", "R& c #616060", "S& c #5D5C5C", "T& c #5D5C5D", "U& c #5F5F5E", "V& c #605F60", "W& c #5C5D5D", "X& c #555655", "Y& c #4D4E4D", "Z& c #494949", "`& c #474845", " * c #4A882B", ".* c #46B310", "+* c #32601B", "@* c #21271E", "#* c #347612", "$* c #42B20A", "%* c #39771A", "&* c #485243", "** c #646961", "=* c #55823F", "-* c #52BC1D", ";* c #50A625", ">* c #5D6E55", ",* c #5F695B", "'* c #5BAA34", ")* c #5AC126", "!* c #5F7C51", "~* c #1C1C1D", "{* c #151415", "]* c #262526", "^* c #292928", "/* c #353536", "(* c #2D2C2C", "_* c #333434", ":* c #616061", "<* c #5E5F5F", "[* c #5D5E5D", "}* c #5C5C5D", "|* c #595858", "1* c #535352", "2* c #2F2F30", "3* c #5A5A5B", "4* c #5F5E5E", "5* c #5D5D5C", "6* c #464647", "7* c #487133", "8* c #4EBA18", "9* c #3F891B", "0* c #262D23", "a* c #314E23", "b* c #50AC23", "c* c #5FCB28", "d* c #6CB647", "e* c #658E51", "f* c #4B6F39", "g* c #3F7E1F", "h* c #48AF14", "i* c #4DB41A", "j* c #45712F", "k* c #4E514E", "l* c #5D7A50", "m* c #59BF27", "n* c #5AB32E", "o* c #5F6E58", "p* c #5B5C5B", "q* c #212021", "r* c #151615", "s* c #333334", "t* c #333233", "u* c #252625", "v* c #414040", "w* c #5B5A5A", "x* c #545455", "y* c #45553C", "z* c #4BA71D", "A* c #4EB51A", "B* c #365527", "C* c #797D78", "D* c #7DA06C", "E* c #60B536", "F* c #4FBD17", "G* c #4BB811", "H* c #4BB810", "I* c #43B209", "J* c #47A618", "K* c #44742D", "L* c #3D4539", "M* c #5C6159", "N* c #5B993B", "O* c #58CA20", "P* c #5C973E", "Q* c #5F625D", "R* c #252425", "S* c #212020", "T* c #222221", "U* c #4F4E4F", "V* c #5E5E5D", "W* c #585859", "X* c #5B5B5C", "Y* c #484947", "Z* c #48802D", "`* c #4ABC11", " = c #418A1C", ".= c #545E4F", "+= c #8F8F91", "@= c #474843", "#= c #42562F", "$= c #477525", "%= c #4E8E22", "&= c #4D9121", "*= c #346815", "== c #3D5731", "-= c #40443D", ";= c #5A794A", ">= c #59BE26", ",= c #59BB28", "'= c #5D7650", ")= c #393838", "!= c #242525", "~= c #242425", "{= c #232322", "]= c #202120", "^= c #171618", "/= c #2B2A2B", "(= c #272827", "_= c #313030", ":= c #242423", "<= c #5D5E5C", "[= c #121212", "}= c #585A59", "|= c #5C5C5B", "1= c #37482F", "2= c #56A92C", "3= c #68D631", "4= c #87BB6D", "5= c #747971", "6= c #484844", "7= c #424137", "8= c #4F4E3E", "9= c #515041", "0= c #4B4B3C", "a= c #3B3D2E", "b= c #24241E", "c= c #3F3F3F", "d= c #586A4E", "e= c #58AA2F", "f= c #57C720", "g= c #5A9040", "h= c #5D605B", "i= c #262525", "j= c #3D3C3D", "k= c #282827", "l= c #353435", "m= c #2A2A29", "n= c #2B2B2A", "o= c #5D5C5E", "p= c #5C5D5E", "q= c #50504F", "r= c #2B2C2C", "s= c #555554", "t= c #5A5B5B", "u= c #B4B4B3", "v= c #ADCE9E", "w= c #67C937", "x= c #53BF1B", "y= c #4F8529", "z= c #5B6743", "A= c #585746", "B= c #505041", "C= c #4C4C3E", "D= c #4A4A3C", "E= c #404033", "F= c #313025", "G= c #252621", "H= c #424243", "I= c #40413F", "J= c #58714A", "K= c #56A52E", "L= c #56C81D", "M= c #58A035", "N= c #5B6955", "O= c #252626", "P= c #262726", "Q= c #1D1E1E", "R= c #2F302F", "S= c #272626", "T= c #282728", "U= c #313032", "V= c #313031", "W= c #2F2F2E", "X= c #4E4D4E", "Y= c #111111", "Z= c #343433", "`= c #585857", " - c #5A595A", ".- c #595A5A", "+- c #494A4A", "@- c #C9C9C9", "#- c #DBDBDD", "$- c #70716C", "%- c #4B712D", "&- c #58B81F", "*- c #5AC91C", "=- c #5BA72A", "-- c #5B7D3A", ";- c #525B3D", ">- c #454437", ",- c #3D3C30", "'- c #3A392E", ")- c #2C2C21", "!- c #292926", "~- c #474A46", "{- c #3A4B31", "]- c #54873B", "^- c #55B226", "/- c #56C51D", "(- c #57A132", "_- c #596B51", ":- c #5A5B5A", "<- c #272627", "[- c #272728", "}- c #3F423D", "|- c #53594E", "1- c #5B6256", "2- c #51554E", "3- c #40413E", "4- c #4B4A4B", "5- c #2E2E2D", "6- c #5A5A59", "7- c #595A59", "8- c #545453", "9- c #525251", "0- c #353534", "a- c #575657", "b- c #575858", "c- c #BBBBBD", "d- c #646461", "e- c #52513F", "f- c #64644D", "g- c #5F7F3F", "h- c #5AAC27", "i- c #57C819", "j- c #56C01A", "k- c #52A023", "l- c #487B24", "m- c #3F6124", "n- c #3D5726", "o- c #2D4817", "p- c #3C6526", "q- c #488629", "r- c #54C41C", "s- c #55BD20", "t- c #569237", "u- c #58674F", "v- c #272726", "w- c #201F20", "x- c #181819", "y- c #444942", "z- c #515E4A", "A- c #506249", "B- c #354333", "C- c #222D1E", "D- c #21281A", "E- c #2C2D2A", "F- c #393A39", "G- c #4D4C4D", "H- c #595859", "I- c #585757", "J- c #4E4F4F", "K- c #535253", "L- c #585758", "M- c #565657", "N- c #4F4F4E", "O- c #504F50", "P- c #444344", "Q- c #C6C6C6", "R- c #525240", "S- c #64634F", "T- c #5F5F4D", "U- c #5F5E4B", "V- c #5B6A42", "W- c #54882F", "X- c #51A81E", "Y- c #51BC17", "Z- c #52BE16", "`- c #4DB613", " ; c #48AF0F", ".; c #42AA0C", "+; c #50BB1B", "@; c #4BB815", "#; c #54B821", "$; c #539C2E", "%; c #547743", "&; c #565D53", "*; c #202121", "=; c #242324", "-; c #262627", ";; c #454445", ">; c #474B46", ",; c #3D4A36", "'; c #2A3E24", "); c #203A19", "!; c #3C6414", "~; c #34521D", "{; c #293822", "]; c #252E1F", "^; c #343534", "/; c #575857", "(; c #575756", "_; c #4C4C4B", ":; c #383939", "<; c #363737", "[; c #444545", "}; c #4E4E4F", "|; c #545354", "1; c #565655", "2; c #545555", "3; c #4D4E4E", "4; c #4F5050", "5; c #C3C3C3", "6; c #E9E9E9", "7; c #46463C", "8; c #61614C", "9; c #5F5E4C", "0; c #5E5D4A", "a; c #595847", "b; c #505040", "c; c #4C4C3D", "d; c #4D5938", "e; c #4D712F", "f; c #50862A", "g; c #4B9021", "h; c #3A840E", "i; c #438D1E", "j; c #4D8D2E", "k; c #4A7A32", "l; c #516C43", "m; c #50594E", "n; c #272828", "o; c #232424", "p; c #393B38", "q; c #222B1E", "r; c #1E2F1B", "s; c #3D691A", "t; c #7FC80C", "u; c #BBFF00", "v; c #6EAB11", "w; c #243A24", "x; c #2A3A20", "y; c #282B26", "z; c #3F3F40", "A; c #2C2B2C", "B; c #313231", "C; c #565756", "D; c #535454", "E; c #505051", "F; c #4E4D4D", "G; c #4A4A49", "H; c #474647", "I; c #3B3C3C", "J; c #3E3D3E", "K; c #484949", "L; c #525353", "M; c #434342", "N; c #C5C5C6", "O; c #DADADB", "P; c #C3C4C4", "Q; c #89898B", "R; c #ACACAC", "S; c #3F3F3D", "T; c #5F5F4B", "U; c #5C5B49", "V; c #555544", "W; c #4E4D3E", "X; c #4C4B3C", "Y; c #4C4B3D", "Z; c #4D4C3E", "`; c #494A3B", " > c #292B1E", ".> c #393C33", "+> c #616361", "@> c #3B3E3B", "#> c #0D0D0D", "$> c #2A2B2A", "%> c #1B1A1B", "&> c #393A3A", "*> c #383D36", "=> c #2F4923", "-> c #60AB15", ";> c #70C211", ">> c #8FD80A", ",> c #92D809", "'> c #2D4F22", ")> c #283A1F", "!> c #252A20", "~> c #2E2D2E", "{> c #2A292A", "]> c #212122", "^> c #555656", "/> c #4F4F50", "(> c #4B4A4A", "_> c #464545", ":> c #474646", "<> c #404140", "[> c #474748", "}> c #504F4F", "|> c #4F504F", "1> c #4E4E4D", "2> c #4D4D4C", "3> c #363635", "4> c #E3E3E5", "5> c #D3D3D4", "6> c #949495", "7> c #5C5C58", "8> c #48483D", "9> c #353529", "0> c #1A1A18", "a> c #41413C", "b> c #585846", "c> c #434235", "d> c #26261B", "e> c #494945", "f> c #070707", "g> c #090909", "h> c #101010", "i> c #202021", "j> c #1E1D1E", "k> c #191A19", "l> c #8A8A8A", "m> c #282727", "n> c #363837", "o> c #464B43", "p> c #252E26", "q> c #4E8415", "r> c #70C50F", "s> c #7ECB0E", "t> c #6CB512", "u> c #89DE0A", "v> c #538617", "w> c #202F21", "x> c #1F251B", "y> c #464645", "z> c #555455", "A> c #525352", "B> c #4C4B4B", "C> c #434444", "D> c #484748", "E> c #4A4B4B", "F> c #4C4D4D", "G> c #4D4C4C", "H> c #4B4B4C", "I> c #D7D7D7", "J> c #E1E1E2", "K> c #B3B3B4", "L> c #6C6C6A", "M> c #4B4B42", "N> c #474738", "O> c #565542", "P> c #605F4C", "Q> c #595846", "R> c #3C3B2E", "S> c #43423E", "T> c #525241", "U> c #4B4A3C", "V> c #373729", "W> c #2C2B23", "X> c #666664", "Y> c #4A4A4B", "Z> c #4C4C4D", "`> c #515152", " , c #121312", "., c #0B0B0B", "+, c #080808", "@, c #2C2C2B", "#, c #19191A", "$, c #383839", "%, c #232324", "&, c #353635", "*, c #272D25", "=, c #3B6219", "-, c #67BA0F", ";, c #6FCA0E", ">, c #82D40C", ",, c #88D607", "', c #3D6617", "), c #222D20", "!, c #292E25", "~, c #525253", "{, c #515252", "], c #414142", "^, c #454546", "/, c #414041", "(, c #C5C5C5", "_, c #EEEEEE", ":, c #D8D8D9", "<, c #4E4E49", "[, c #47473A", "}, c #64644F", "|, c #63634F", "1, c #5A5948", "2, c #555445", "3, c #444334", "4, c #141413", "5, c #4A493C", "6, c #49493A", "7, c #4B4A3B", "8, c #424334", "9, c #2A2A1F", "0, c #474642", "a, c #4B4C4C", "b, c #515050", "c, c #0E0E0E", "d, c #343334", "e, c #464944", "f, c #2A3125", "g, c #222E21", "h, c #2C4620", "i, c #3E7319", "j, c #467817", "k, c #294123", "l, c #2F3F2B", "m, c #3B4534", "n, c #424540", "o, c #3C3B3C", "p, c #1A1B1A", "q, c #3A3B3B", "r, c #535252", "s, c #515251", "t, c #454645", "u, c #434242", "v, c #373738", "w, c #A2A2A2", "x, c #DCDCDC", "y, c #EBEBEC", "z, c #C2C2C3", "A, c #737371", "B, c #49493F", "C, c #4D4C3D", "D, c #5A5945", "E, c #63624F", "F, c #646450", "G, c #62624E", "H, c #5E5D4B", "I, c #575647", "J, c #515040", "K, c #37372B", "L, c #2D2D2C", "M, c #48473E", "N, c #4A4A3B", "O, c #4B4B3D", "P, c #484739", "Q, c #343426", "R, c #33332B", "S, c #6E6E6C", "T, c #3C3D3C", "U, c #0C0C0C", "V, c #8C8B8C", "W, c #323032", "X, c #282C26", "Y, c #212A1D", "Z, c #25301F", "`, c #293625", " ' c #324430", ".' c #405538", "+' c #43513C", "@' c #3D413A", "#' c #424342", "$' c #40403F", "%' c #3A3A3B", "&' c #CCCCCC", "*' c #D9D9DA", "=' c #ACACAD", "-' c #5E5E5B", ";' c #444439", ">' c #5F5F4A", ",' c #63624E", "'' c #525143", ")' c #474538", "!' c #353528", "~' c #30302B", "{' c #434340", "]' c #48483A", "^' c #3E3E2F", "/' c #2D2C22", "(' c #51514C", "_' c #494848", ":' c #454444", "<' c #303031", "[' c #0A0A0A", "}' c #090908", "|' c #111110", "1' c #1E1E1D", "2' c #262825", "3' c #343932", "4' c #3E463A", "5' c #404A3C", "6' c #3C4239", "7' c #333531", "8' c #403F3F", "9' c #3E3F3E", "0' c #3D3C3C", "a' c #2A2A2B", "b' c #5A5A58", "c' c #454438", "d' c #51513F", "e' c #5F5E4A", "f' c #61614D", "g' c #60604C", "h' c #5F5F4C", "i' c #595A47", "j' c #3D3C31", "k' c #39382C", "l' c #2D2D22", "m' c #393931", "n' c #3A3A33", "o' c #787876", "p' c #494948", "q' c #100F10", "r' c #161516", "s' c #1C1D1D", "t' c #8E8E8D", "u' c #363536", "v' c #1C1A1C", "w' c #1D1C1C", "x' c #2D2D2E", "y' c #454646", "z' c #49494A", "A' c #3F403F", "B' c #383836", "C' c #484838", "D' c #585845", "E' c #5B5B48", "F' c #5C5C49", "G' c #5D5D4B", "H' c #5E5E4A", "I' c #555543", "J' c #4D4D3E", "K' c #49483A", "L' c #3B3B2F", "M' c #333225", "N' c #363530", "O' c #363736", "P' c #444445", "Q' c #4C4B4C", "R' c #1F2020", "S' c #363637", "T' c #919191", "U' c #434443", "V' c #393938", "W' c #424343", "X' c #3F4040", "Y' c #46463A", "Z' c #555542", "`' c #545342", " ) c #575645", ".) c #4C4C3C", "+) c #4A493B", "@) c #474638", "#) c #38382C", "$) c #2F2E24", "%) c #403F40", "&) c #0F0E0E", "*) c #1C1D1C", "=) c #151717", "-) c #343535", ";) c #2E2D2D", ">) c #3A3B3A", ",) c #4B4C4B", "') c #3C3B3B", ")) c #333232", "!) c #191918", "~) c #3D3D3A", "{) c #50503F", "]) c #515140", "^) c #4B493C", "/) c #454537", "() c #3A3A2E", "_) c #303023", ":) c #383834", "<) c #404141", "[) c #424141", "}) c #343333", "|) c #454544", "1) c #484948", "2) c #414241", "3) c #282929", "4) c #111011", "5) c #1B1A1A", "6) c #999999", "7) c #3B3A3A", "8) c #323132", "9) c #1A1A19", "0) c #302F2F", "a) c #3E3E3F", "b) c #3B3B3A", "c) c #3A3A3C", "d) c #42423B", "e) c #444436", "f) c #343327", "g) c #313028", "h) c #434243", "i) c #494A49", "j) c #474848", "k) c #0B0A0A", "l) c #201F1F", "m) c #383738", "n) c #4A494A", "o) c #3F3E3F", "p) c #373837", "q) c #3C3C3D", "r) c #44443A", "s) c #4A4A3A", "t) c #4A493A", "u) c #4B4B3B", "v) c #3D3C2E", "w) c #41413F", "x) c #3E3F3F", "y) c #484847", "z) c #434344", "A) c #0D0C0D", "B) c #373637", "C) c #181718", "D) c #161617", "E) c #414140", "F) c #474746", "G) c #444343", "H) c #454539", "I) c #4B4C3D", "J) c #464637", "K) c #403F30", "L) c #363629", "M) c #3B3B30", "N) c #51514E", "O) c #0B0A0B", "P) c #484747", "Q) c #363535", "R) c #3F3F3E", "S) c #454538", "T) c #3B3A2C", "U) c #38372A", "V) c #3F3F32", "W) c #5F5F58", "X) c #898984", "Y) c #A0A09E", "Z) c #464746", "`) c #484849", " ! c #2C2C2D", ".! c #282928", "+! c #494849", "@! c #464747", "#! c #464546", "$! c #444335", "%! c #3D3D2E", "&! c #37362A", "*! c #49483E", "=! c #73726D", "-! c #969693", ";! c #9F9F9E", ">! c #9A9A9B", ",! c #292828", "'! c #323233", ")! c #41413B", "!! c #3C3C2F", "~! c #424237", "{! c #5F5F57", "]! c #999997", "^! c #8A8A8B", "/! c #5C5C5E", "(! c #3D3E3E", "_! c #424241", ":! c #90908E", " = & - ; , * & * = , , = - > = = > = & = , & * - * & - = , - & > = > > * ; > = = - * ; & ' ' ; * - ' > , = > , & * & > ' , = , - * = = * , , = = ' * = ' = > & - - = - & = , , , = > * & , > = , * * ' ' > > & , * * > & * - > , = ' > , * ' = , ; ' = ; & = > > , > , - ' - * = & - ' ' = = * ; ; * ' , & > ; > - & ' , & > = * = - , & - ' & > * & > & > > > = , ; * & * , & ' & * = = * = - > ' ' & = ' > - ' > & > & , > ' ' * , > = , = , > * ; - > - * , , , , = = = , * > > & = > , & = * - * & * - > ' ' ' ' ' , - & * = > , ; ; > = & ' ; * = = , - , , - > = , > > - ' ' ; * ' = & , ; , * = , * & ' , = ; & ' = & = * ; & = - ; & , = = > , ", ") ; ; ; ; ; ; ; ; ! ; ; ; ) ; ; - ; ; ; ; ; ; ; ! ! ; ; ~ ; ; ~ ~ ) ; ; ; ; ; ; ; ; ; ; ; ; ; ) ~ ; ; ! ; ) ; ! ; ; ; ; ; ; ; ; ) ; ; ; ; ; ) ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ) { ; ; ; ; ; ! ; ; ~ ; ; ; ; ; ; ; ; ) ) ; ~ ; { ; { ; ; ) ) ; ; ; ] ; ; ] ; ; ; ; ; ; ; ; ~ ; ; ^ ; ] ; ; ; ; ; ; { ; ) ; ; ; ; ! ; ; ; ; ) ) ; ; ) ~ ; ; ; ~ ; ! ; ; ; ; ; ' ; ; ; ; ; ; ; ; ) ; ; ; ! ; ; ; ; ; ; ! ; ~ ; ~ ; ; ; ; ! ; ; ) ) ~ ! ; ; ; ! ; ; ; ; ; ; ) ; ! ) ; ; ~ ; ; ) ) ; ; ; ; ~ ; ~ ; ; ; ; ; ; ; ) ; ! ; ; ; ; ; { ; ; ; ; ~ ; ! ; ~ ) ; ; ~ ! ; ; ; ~ ) ; ; ; ; ; ; ; ! ; ; ; ! ; ; ; ; ; ; ; ) ; ; ; ; ; ; ; ; ; ; ; ! ; ! > ; ; ; ; ; ; ; ; ; ; ; ; ) ", "/ / / / ] / / / ] ] / ^ / / / / ] / / / / / ) { / / ^ / / / { ] / / / / / / ^ / / { ^ / / ] / / / / / / / / / / ] { { ^ ] / / / / / { ] ] ^ / { / / ^ ^ ] / { { { / / ~ / / / { / / / / / / ^ / / / ^ / / / { { { / / ^ ] ! / / / / / / / ^ / / / ] / / / / ^ { / / / / ^ ) / / { / { ^ / ! / / / ] { / / ^ / / / / / / / / ] / ^ ] ) / ] / / / / / / ] / / / / / { / / / / / ] / / / / / / / / / / / / ^ / ! / ^ ] / / / / / ~ / / / { / / { / / / / { / / ^ / / ] ~ / / / / ] / ^ / { / ^ / ^ ] / { / / / / / { / / ] / / / / / ~ / / ^ ] ^ / / / / ^ ) / / / / / ] / / / ^ / / / / / / / ] / / ] ] / ^ / / / / { / { / ^ ^ ] / / / / ] / { / / ^ / { / / / / ", "( _ : ( < / ( < / [ < [ } / < | [ : _ [ / : ( ( [ ( [ } _ [ [ ( _ ( : / } / ( / / } | } : / ( } _ [ / [ [ [ [ / [ } / [ } / / | : / < [ / < < [ } _ ( ( | / : / / / / | : [ } / < ( / } : [ / _ < : } / < | / | [ [ / | | } [ [ < [ } : ( < ( : } / | _ : ( / [ < : < ( [ < [ } : ( ( | ( : | _ ! - , ; = * ^ / / : _ : ( _ | / } | ( _ / } [ | | [ [ _ ( : / ( | [ [ } < } / < / [ } < } } / _ [ ( _ ( [ [ / / / _ / < / _ : ( [ < / | } | [ / | < | [ ( | | ( : : ( / : < ( | ( | / / ( [ _ _ < : _ } < ( [ / < / < [ _ / } / [ / / / | ( } [ } : _ / / | : ( ( _ _ [ [ _ ( [ : _ : ( } < / ( } [ < ( : [ } / : ( } [ : / < / _ [ : : ( / / : _ | [ } : [ _ [ ", "< < < < < < < < < < 1 < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < 2 < < < < < < < < < < < < < < 1 < < < < < < 3 < < < < < < < < < < < < < < < < < < 2 < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < 4 5 5 5 5 5 . < < < < < < < < < 3 < < 3 < < < 3 < < < < < < < < < < < < < < < < 3 < < < < 2 < < < < < < < < < 3 < < < < < < < < < < < < < < < < < < < < < 2 2 < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < 1 1 < < 2 < 2 < < 2 < < < < < < < < < < < < < < < < < < < < < < < < < 1 < < < < < < < < < < < 3 < < < < 6 3 ", "7 7 7 7 7 7 7 7 8 1 7 7 7 8 7 7 7 7 7 7 7 7 6 7 2 7 7 7 9 7 7 7 7 7 9 7 6 6 7 9 7 8 7 7 6 7 2 7 7 9 9 7 7 7 2 6 7 7 6 7 7 6 8 8 7 7 6 7 7 7 7 7 6 7 7 7 7 7 6 7 6 6 8 8 7 7 7 7 7 7 7 7 7 7 9 9 7 7 7 6 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 7 7 7 7 7 7 7 7 7 8 7 9 7 8 7 7 7 9 7 7 7 7 7 7 7 1 0 a a b b c d 9 7 7 7 7 7 7 7 9 7 7 8 6 7 1 7 6 7 8 1 7 7 8 7 8 7 7 7 7 7 6 7 6 7 8 9 9 7 7 7 8 7 7 9 7 9 7 8 7 9 7 9 9 7 6 7 8 6 7 8 7 7 8 8 8 7 7 7 7 8 7 8 7 7 7 7 8 3 7 7 6 8 1 7 8 7 6 7 6 6 7 7 7 7 6 6 7 7 7 7 8 < 8 7 7 7 2 9 7 3 7 9 7 7 7 7 7 7 7 7 6 7 9 7 7 7 7 7 7 8 7 7 9 8 7 7 3 7 7 9 7 7 8 7 1 1 2 7 2 6 9 8 7 7 6 7 7 7 7 7 7 7 6 7 8 6 6 7 3 ", "e 7 7 f 7 g h i j 7 h h g h h f f e k 7 g g e 7 7 7 e 7 k g e 7 f j f 7 7 f j f f 7 h i e f e 7 f h h h g f g 7 g e g g 7 f e 7 7 f h e e f k h i f 7 k f g 7 f i e e g e g e h j h 7 f h j 7 j k 7 i h 7 j i e 7 f f i g f 7 h 7 j h k f f 7 h 7 k j i f 7 e g 7 e e 7 7 g 7 f 7 j e j h f 7 i l m m n o m p f i 7 e j g j f 7 h f f f f i g h 7 7 f e h f f e i i e f 7 e f 7 g 7 7 g g f h j f j i 7 i e g e 7 j 7 i h g 7 7 e 7 e 7 g e 7 7 7 7 k f f i i 7 f i e j e g 7 h f e 7 f j j k g f f 7 e h i g i e 7 7 h 7 i f e h 7 f 7 j h h e h h h j i f j f f 7 7 j 7 f 7 f j 7 j h 7 g h h 7 7 i j 7 7 f e h f f 7 7 7 k h j f 7 h f k f 7 e 7 j 7 e 7 7 f ", "k k k k k k k k q k q k r q k k s k k k k k k k k k k k k k k k k k k k k k k k k k k k q k k k k k k k k k k k k k k k k k k k k k k k k k s k k k s r k k r k k r q k k k k k k s k k k k k k k q k k k k k k k k k k k r k r k k k k k k s k k k k k r k q k k k k k k k t k k k k k k q k k u v v v v w n k k k k k k k q k k k k k k q k s q k k r k s k k k k k k k k k k k k s k k k k k k k r k k k r k k k k k k k k k k k k k k r k k k q k k k k k k k k k k k k k k k k k k k k k k q k k k q k k k k k k k r k k k k k k k k k k k k k k k k q k k k q k k k s k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k q k k k k k r k k ", "x x x y z x x x x x t x x A t x x z x x x x z x A x x z t z x x t t x x B x x A A x x x x x x x q x z x x x x x x x x x x x x A x z B t x x x x A t A A x x A x x x x x x x t x x x x A x x x x x x x x x C x x x x t x x x x x x x A C t x x x x x z x x x x A x x x x x z x t z x x x x A x x D E E E F E v x x x x z x x A x x x x t x x t x x x x x t x x A A G x x x x x C x z x A x x x q x z z x s x x x A x x x A x x z x x x x x x x x t x x x x z q A z x t A z x x z A x x x x x x t x x x x x x x z x x C B x x x A x x B x x H x A x x x t x x s t x t x x t H x x x x x x x x x t x x x x x A x x x x t x x x x x A x x x x x t x x x x x x x x C ", "B I x J H B H C K L K J L K L B B x B J L J I B K L x B L K L K B x K L J H H J K J I L B I K K L K I K L L C x L K K J K K K I x K J I K C B x C K L L B K J K K J L C K I K K I K L K J K K K J B K I L K C J K K L J K K K J L L K K H C K L K J I J I I J J I B K K J K K B K J L I J J J K M N O P N Q E I K H I I H C J H J I J H B B K C L K I K J C K J J I J K B C K J B J L K J L K C J K K K K J J K x J I K K K K H I L J I x L L K I H I H J B J x I L K I I I L L C J J K J L K I I C K K I K L L J H K B L I B K J L I I K L J I H L L L I I J L L L K B L I C J H K I I K L L K B K H K K I J C J I L I I I J K I J I H H C H J x K L K L K H K ", "R S R T T U V K V W V W T X T S S W S R U V W K T X R X W V R K V R W K V S U U U V T V R K W V X X X V U W X R V R X S U V R U T T T X V W V K T X V R R W W U V U T V V U U U U X R X V W S X U W X X U W U U V T T R U K T X V T S X X U R R S U V R R V X R S V U V S X V T W V S T U T R T Y Z Z Z ` ...U W T X U S W U X V U T X U U K V W V X K R X V W U R S T V K T R U U V T X R V V W K K U K S U V U T W S S K U U V R S S K W T U U X R T U R X K U X K V T T W V U U V T K T U S V V X X T U V X V V V R X R S K U V V R V X X T X R T S R T T R K U V R V T U S T R X V X X V V S V T V X V U X T T V S V S V V U W R R K R X T R U W R R T V W ", "V +.V +.+.V V @.V V V #.#.V $.+.+.+.V +.V $.V V @.$.$.@.$.$.%.$.+.%.&.@.@.+.$.V V @.V V +.%.*.#.&.@.@.+.@.V @.$.@.$.&.V $.&.@.@.+.%.#.+.V V $.V +.%.&.@.V V #.%.V @.#.V @.@.V #.+.&.@.@.V V +.V V V V V @.V @.V +.&.@.V V &.V %.V $.+.+.%.V *.%.#.$.V +.$.+.#.#.@.+.V V V V &.@.V V #.&.&.%.%.+.=.-.;.>.-.,.'.$.$.V &.$.+.V V &.V +.+.$.%.V $.%.$.+.#.&.$.$.V $.V $.+.V @.@.@.%.&.&.@.V V $.$.V @.%.$.+.$.V +.%.+.V V &.V &.%.$.*.V @.V &.V %.V &.V @.#.$.@.@.+.&.V V V V @.#.V @.#.@.V +.V V V +.#.$.$.V +.#.$.@.$.V $.V +.V +.@.$.@.&.#.V #.#.V V +.@.$.V V @.#.V @.V $.V *.V +.+.V V &.#.V V V $.@.V $.+.$.V V $.$.V @.+.$.%.V &.@.+.V V V #.V %.&.#.V @.+.V ", "*.*.*.*.*.).*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.!.*.*.*.*.*.*.*.*.*.*.~.*.*.*.*.*.!.*.~.*.*.*.*.*.*.~.*.*.~.*.*.~.*.*.!.).~.*.*.*.*.*.).*.~.*.~.*.*.*.*.*.*.*.*.*.*.!.*.*.*.*.*.*.*.*.~.*.*.*.!.*.*.*.).~.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.!.*.*.*.*.{.*.*.].^.^.^.^./.(.*.*.*.).*.*.*.*.).*.*.*.*.!.*.*.*.*.*.*.~.).*.~.*.*.).*.*._.*.*.*.!.!.*.*.*.*.!.*.*.*.*.*.~.*.*.*.~.*.*.*.*.*.*.*.*.*.~.*.*.*.*.*.~.*.*.*.*.*.*.*.).*.*.*.*.*.*.*.~.~.*.*.*.~.*.*.).:.).*.*.*.*.*.*.*.).*.*.*.*.*.*.*.*.!.*.*.).*.*.*.*.*.*.*.*.*.*.*.~.~.*.*.*.*.*.*.*.*.).*.*.*.*.*.*.*.).!.*.*.).*.*.*.*.~.*.*.).*.*.~.*.*.*.*.*.*.*.*.*.*.*.*.", "<.<.<.<.<.<.<._.<.<.<.<.<.<.{.<.<.<.<.<.<.<.<.:.:.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.{.<.<.<.<.<.:.<.<.:.<.<.<.<.<.<.<.<.<.<.<.<.:.<.<.<.<.<.<.<.<.<.<.:.{.<.<.<.:.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.{.{.<.<.<.<.:.<.<.<.<.<.<.:.<.<.<.<.<.<.<.<.<.<.<.<.<.[.}.}.}.}.}.|.<.<.<.<._.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.:.<.<.<.<.<.<._.<.<.<.{.<.<.<.<.<.<.<._.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.{.<.:.<.<.<.<.<.:.<.<.<.<.<.<.<.<.<.<._.<.{.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.{.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.:.", "1.2.1.1.2.3.3.1.3.2.1.1.1.1.2.2.3.3.1.1.4.4.1.2.2.2.5.6.4.4.3.1.5.1.3.1.1.1.4.1.1.1.3.5.1.1.1.2.1.1.3.1.2.2.1.1.4.6.1.5.2.2.1.2.4.1.3.3.3.1.2.2.1.7.5.3.1.4.4.7.1.1.1.1.1.2.4.1.1.4.7.1.3.2.2.1.1.1.3.1.1.2.1.1.1.1.4.1.3.1.1.1.2.1.7.3.1.2.1.1.1.7.1.1.1.1.3.3.1.1.1.1.2.1.1.1.1.4.3.3.1.1.1.1.8.9.9.9.9.9.0.5.1.1.1.1.1.1.1.4.2.1.1.6.1.2.1.1.1.1.1.1.3.2.1.1.3.1.1.1.2.4.4.1.2.1.1.1.4.1.1.3.4.1.1.1.3.6.1.1.1.1.1.1.4.2.3.1.1.1.1.1.3.2.1.1.1.3.3.2.1.1.1.1.2.1.3.3.2.6.1.1.1.5.3.1.1.3.2.1.3.1.4.1.1.7.1.1.4.1.3.4.1.1.2.1.1.1.5.1.6.3.1.5.2.1.1.1.1.4.2.1.1.1.3.1.2.2.4.1.1.1.3.1.1.1.4.5.1.1.4.1.2.1.2.1.1.3.3.1.1.1.4.2.1.4.7.4.4.1.3.1.4.3.1.3.1.1.2.1.", "a.b.c.d.b.a.e.b.f.b.b.b.f.f.f.f.e.e.e.a.e.c.e.f.g.d.c.c.d.a.b.b.d.b.1.c.d.e.c.1.f.d.1.e.b.e.b.a.b.b.f.e.e.b.d.b.b.d.b.b.e.e.e.g.f.c.e.e.e.b.b.d.b.e.f.b.g.f.f.b.d.c.c.b.d.e.e.a.a.d.g.e.b.g.d.e.g.1.b.b.f.f.d.e.1.e.d.b.a.d.g.b.d.c.f.d.b.e.a.d.b.g.b.b.d.a.d.d.d.d.b.d.d.f.g.b.b.b.a.C k z s r h.i.i.i.i.i.j.q x x k V a.d.e.e.b.b.e.e.e.f.b.f.c.a.a.e.g.g.f.e.f.f.f.1.e.g.d.c.f.g.g.g.1.a.f.a.g.b.e.b.c.f.f.e.c.b.a.d.g.b.d.d.g.b.g.d.b.1.e.b.a.e.g.b.b.g.b.d.g.d.f.1.b.g.b.f.g.a.g.d.a.c.f.g.1.b.d.a.c.c.e.b.a.b.c.g.b.f.c.b.b.b.f.f.b.e.d.e.d.c.g.g.d.a.b.b.b.b.f.d.b.g.g.f.d.a.a.d.e.e.b.c.f.f.1.f.e.b.f.b.1.b.d.b.d.c.b.f.d.f.b.e.g.f.f.f.c.f.d.c.f.e.c.f.", "b.k.l.m.n.n.o.p.m.l.k.b.m.m.m.m.m.l.o.q.b.n.k.n.m.m.p.k.n.b.o.o.m.n.p.n.b.p.b.l.b.o.p.b.m.m.o.n.l.o.m.o.n.q.m.m.b.n.o.b.l.o.o.b.k.q.o.o.o.n.k.o.b.p.k.k.m.b.p.l.q.n.m.b.k.p.q.n.k.k.q.b.b.b.o.o.n.b.l.n.p.l.p.b.o.o.p.m.p.o.l.b.n.k.m.n.o.k.p.o.p.q.b.b.l.m.q.b.k.q.m.b.p.o.p.m.k.k.l.r.s.t.t.t.i.i.i.u.i.v.w.t.t.t.}.x.p.o.b.b.o.k.q.p.o.n.b.b.k.l.k.n.p.m.b.m.b.b.p.p.b.q.b.m.n.l.k.m.o.n.l.n.o.o.n.o.n.l.n.k.p.k.o.b.q.p.p.b.o.o.p.n.m.q.k.o.o.l.o.l.b.q.n.q.k.p.q.l.q.k.k.o.l.k.k.b.b.n.q.l.o.b.k.k.m.b.b.m.k.m.m.k.n.k.l.b.o.k.p.n.b.k.o.p.m.p.o.l.n.l.b.b.b.k.k.b.k.b.o.m.b.b.b.o.p.o.b.m.o.o.q.q.m.b.k.q.l.k.p.o.o.o.b.m.b.b.m.b.b.l.b.b.m.n.b.o.m.o.o.b.", "y.z.y.A.B.y.q.B.B.z.C.z.z.D.q.B.B.B.E.q.D.y.E.D.z.C.D.q.q.z.z.A.D.D.B.A.q.z.q.D.B.z.q.A.y.B.q.z.y.q.B.q.A.z.D.q.q.E.B.y.z.B.q.q.q.q.B.q.q.z.B.q.B.B.A.D.q.A.q.q.z.z.z.q.z.E.q.q.z.A.z.A.A.D.q.q.q.q.E.E.q.A.C.A.q.D.y.A.y.D.D.E.E.q.D.y.q.y.q.D.q.y.q.C.E.q.y.q.z.y.D.y.z.D.A.B.B.C.q.B.F.t.t.t.t.t.t.t.t.t.t.t.t.t.m C.y.q.B.D.B.D.A.C.y.q.q.B.y.B.q.q.q.D.q.z.q.y.z.z.q.B.B.y.A.q.D.q.A.B.D.C.q.q.y.A.D.q.C.D.B.A.B.B.B.z.D.C.D.z.z.B.z.q.z.B.q.E.z.z.y.q.q.B.C.A.z.y.A.q.B.z.z.B.B.D.B.E.q.q.q.D.C.z.q.z.D.B.q.E.A.q.q.q.D.q.q.D.A.E.D.E.A.A.B.B.E.C.z.D.q.q.A.y.y.y.E.D.q.A.A.D.B.z.q.z.B.z.E.q.B.q.q.z.A.q.E.B.A.q.D.E.C.B.q.q.B.z.z.C.E.q.q.E.B.A.E.z.y.E.", "C.C.G.H.I.G.H.C.H.C.C.C.G.H.J.H.I.I.H.C.H.H.K.C.K.L.J.C.I.J.H.G.J.H.L.H.K.C.H.C.K.L.C.L.C.K.I.K.H.C.K.M.K.H.H.I.G.C.K.C.K.I.H.C.J.C.C.I.K.C.L.L.C.C.C.C.J.C.I.G.C.H.I.J.K.K.J.K.K.C.C.K.G.H.L.G.C.C.C.I.M.K.C.M.I.G.I.K.C.K.C.H.I.C.L.H.C.I.H.M.H.C.L.C.M.C.K.C.H.L.M.I.K.K.C.M.M.I.J.G.I.N.O.t.P.Q.O.R.P.9.t.t.Q.S.H.M.C.L.C.L.K.M.J.G.C.C.H.J.H.C.I.H.K.K.M.C.I.L.C.J.H.I.I.C.J.K.C.G.H.C.C.C.C.K.C.C.G.K.J.K.K.L.C.J.C.J.I.I.H.H.H.C.I.K.C.L.C.C.H.I.C.G.C.C.G.C.L.K.H.H.I.H.C.C.K.H.H.K.C.C.K.L.C.H.M.L.C.C.I.J.C.K.L.H.H.L.K.J.G.K.H.G.H.M.G.H.H.C.K.M.H.H.H.H.C.I.H.I.M.H.H.C.J.G.C.C.K.C.C.K.I.I.C.L.K.I.L.C.H.C.I.C.C.G.K.I.G.C.H.H.C.C.L.C.J.C.K.H.H.C.", "T.U.V.W.M.M.X.M.U.Y.U.M.M.M.T.U.M.V.Y.V.U.M.U.T.M.V.Y.U.M.M.M.M.M.T.M.M.U.X.T.M.T.M.Y.Y.M.U.M.V.T.M.V.U.M.V.U.M.M.W.M.M.M.U.T.T.V.T.U.U.X.M.T.U.Y.M.Y.W.M.U.Z.M.T.Y.M.Z.M.U.T.U.U.V.M.M.M.X.W.M.Z.Z.`.Z. +.+.+.+.+.+Z..+++X.T.M.W.M.M.M.V.W.M.V.M.T.T.W.M.M.M.T.M.V.U.T.M.M.V.V.M.T.Y.M.V.g.(.9.9.9.9.9.9.9.9.9.'.o.T.M.W.M.M.V.M.M.U.M.T.U.T.M.Y.U.M.U.U.X.T.T.U.M.Y.M.U.V.M.M.M.T.M.M.M.M.V.T.T.V.M.M.V.T.M.W.M.U.M.Y.Y.M.X.W.W.Y.M.M.U.V.Y.M.M.Z.M.V.V.M.U.V.M.M.T.T.Y.V.W.W.V.W.W.M.T.T.X.T.M.Y.Y.V.Z.U.T.U.V.T.U.M.U.Y.U.V.V.M.Y.V.U.V.U.M.V.W.M.X.M.V.U.M.W.T.U.T.T.M.T.U.M.Z.Y.M.U.M.V.V.U.V.M.U.M.M.@+V.M.V.U.V.V.U.U.T.U.U.T.U.M.M.M.M.U.M.U.U.X.M.X.U.", "Z.Z.Z.Z.Z.Z.#+Z. +Z. + +Z.Z.Z.Z. +Z.Z.Z.#+Z.Z.#+Z.Z. +Z. +Z.Z.Z.Z.Z. + +Z.Z.Z.Z. +Z.#+Z.Z.Z.#+#+Z.Z.Z. +Z.Z.`. +#+Z.Z.Z.`.Z.Z.#+ +Z.Z.#+Z.Z. +Z.#+Z.#+Z.#+Z.++#+.+++ +Z.#+.+Z.Z.Z.#+Z. +Z.Z.Z.`.$+$+%+&+&+&+*+*+*+&+&+&+&+=+%+%+-+;+;+Z.Z. +Z.Z.Z..+ + + +Z.>+Z.Z. +.+ +Z.Z.Z.Z.>+Z. +Z.Z.#+W j.9.,+9.9.9.9.9.'+7.#+Z..+#+ +.+Z.Z.Z.Z. +Z.#+.+Z.Z. +Z.#+Z. +.+Z.#+Z.Z.Z. +.+Z.Z.Z.>+Z.#+Z.Z.#+Z.Z.Z.Z.Z.Z.Z..+Z.++Z.Z.Z. +Z.++ +.+#+Z. +Z.`.Z.Z.Z. +.+Z.Z.#+Z.Z.Z.#+Z.Z.Z.Z.Z.Z.Z.++#+ + +#+Z.Z.Z.>+Z.Z.#+ +Z.Z.#+Z.Z.Z..+Z.Z.Z.#+Z.>+Z. +Z..+Z.Z.Z.Z.Z.Z.Z.Z.Z..+Z.Z.#+Z.#+#+ +#+Z. +#+.+.+Z.Z.#+Z..+Z.Z.Z. + + +Z.Z..+Z.Z..+Z.Z.Z..+Z.Z.Z.Z.Z.Z.Z.Z.++ +Z.>+Z.", ";+;+$+;+;+;+;+;+;+;+;+;+;+)+;+;+;+;+$+$+;+)+;+;+$+;+$+;+;+$+;+;+$+;+;+;+;+;+;+;+;+;+)+;+;+;+;+;+;+;+;+;+;+;+;+)+;+;+;+;+;+-+$+-+;+;+)+;+;+;+;+;+;+$+$+;+!+;+;+;+;+;+;+;+$+;+;+;+;+)+;+;+;+)+;+~+%+{+*+]+^+^+/+/+(+/+/+/+_+^+]+:+]+<+*+[+&+&+%+%+}+%+%+;+;+-+;+;+-+;+;+;+;+;+;+$+;+;+$+;+-+;+;+& |+s.s.s.s.s.^.< ;+;+;+$+;+;+;+;+;+;+;+;+-+;+;+$+-+;+-+;+-+;+;+-+;+;+-+;+-+;+;+;+;+$+;+;+;+;+)+;+;+;+;+;+;+;+;+;+;+;+;+;+$+;+;+;+;+;+;+;+-+;+;+;+;+;+)+;+;+$+;+;+;+;+;+;+;+-+)+;+;+-+;+;+)+;+)+;+;+;+;+-+;+;+;+;+;+$+;+;+;+;+;+;+)+)+;+;+;+;+)+;+;+;+-+;+;+;+;+;+;+;+;+)+$+;+;+;+;+;+;+;+;+;+)+;+;+;+-+;+;+;+)+;+;+-+;+;+;+;+)+;+;+;+;+;+-+;+-+;+)+;+;+;+;+;+;+;+", "%+%+%+%+%+%+%+%+}+%+%+%+%+}+%+%+%+%+%+%+%+%+}+1+%+%+~+%+%+%+}+%+%+%+%+%+1+=+=+%+%+%+1+%+}+%+%+%+%+%+~+%+%+%+%+~+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+}+%+=+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+=+&+&+*+]+2+/+]+~+%+]+3+4+4+5+4+3+3+3+6+6+6+/+/+^+^+]+]+*+*+&+&+&+%+%+%+7+%+=+=+%+%+%+%+%+%+%+%+%+~+%+8+}.s.s.s.9+0 %+%+=+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+~+~+%+%+%+%+%+%+%+%+~+%+%+~+%+%+%+%+%+%+%+%+%+=+%+%+%+%+%+%+%+=+%+%+%+~+%+%+}+%+~+%+%+%+%+%+%+%+%+}+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+}+%+}+%+7+%+%+%+%+%+%+%+%+%+%+%+%+%+%+0+%+%+}+%+~+%+}+%+%+%+%+%+%+%+%+%+}+%+%+%+%+%+%+}+%+%+%+%+%+%+%+%+%+%+}+%+%+%+", "&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+1+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+7+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+*+*+]+^+6+]+a+b+c+d+e+4+/+/+/+6+6+4+f+g+g+g+f+4+4+3+3+6+/+/+^+]+]+*+*+*+*+&+&+&+&+&+&+&+&+&+&+&+&+&+%+h+}.}.}.i+&+&+&+&+&+1+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+4+j+k+l+m+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+&+", "{+*+*+*+*+*+*+{+*+*+*+*+*+*+*+*+*+*+*+*+n+*+*+*+*+*+*+*+*+*+*+*+*+*+{+*+*+*+*+*+*+n+{+o+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+o+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+p+]+q+6+3+^+r+s+t+u+v+w+x+y+z+A+B+C+D+f+4+3+f+g+D+E+E+g+g+f+4+3+6+6+/+^+^+]+]+*+*+*+*+*+*+*+{+*+*+*+*+%+Q }.F+*+*+{+*+*+*+*+*+*+*+*+*+*+*+*+{+*+*+*+*+*+n+*+*+*+*+*+n+*+*+*+*+*+*+*+*+n+*+*+*+*+*+*+*+*+{+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+5+A+G+H+I+J+K+L+M+{+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+o+*+*+*+*+*+*+*+*+*+*+*+{+*+{+{+*+o+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+o+*+*+*+*+*+{+*+{+*+*+{+*+*+*+*+*+*+*+*+*+*+*+*+{+*+*+*+", "]+]+]+N+O+]+]+]+P+:+]+]+]+]+]+]+]+]+]+]+]+]+]+P+P+]+]+]+]+]+]+p+]+]+]+p+]+Q+]+]+Q+]+R+]+P+]+]+]+]+]+]+]+p+]+]+]+]+Q+]+]+]+S+]+]+]+]+]+p+:+T+]+]+T+]+S+p+:+]+T+]+]+]+]+]+]+]+]+]+]+]+]+P+]+]+^+^+6+3+f+U+V+A+w+G+u+W+X+Y+Z+Z+Z+X+w+X+L+y+A+`+ @.@E+g+E+E+D++@U+g+f+4+3+3+6+/+^+^+^+]+]+Q+]+]+]+T+]+]+1.S.C.]+]+]+]+]+]+S+]+T+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+]+Q+]+]+]+]+@@]+<+]+]+]+]+]+P+]+]+]+:+]+]+]+]+Q+<+p+]+]+Q+]+]+]+S+]+Q+]+]+]+#@Z+s+J+H+I+J+I+I+H+$@%@&@6+]+]+]+P+]+]+]+]+]+]+]+p+]+]+]+]+]+]+]+]+p+]+]+:+T+Q+]+T+]+p+]+P+T+]+]+p+P+S+Q+]+N+T+]+S+]+S+]+]+*@]+]+]+]+S+]+]+:+]+:+]+p+:+]+]+]+P+]+]+]+P+]+]+]+]+p+]+]+]+S+P+Q+P+]+p+]+]+p+]+S+]+]+]+", "^+^+=@^+^+^+^+^+-@^+^+^+^+^+^+^+^+^+^+^+_+^+^+^+^+^+^+^+2+^+^+^+^+^+^+^+^+^+^+^+^+^+=@^+^+^+2+^+^+;@^+^+^+2+^+=@^+^+^+^+^+^+^+^+^+^+;@^+^+^+^+-@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+2+^+^+^+^+^+^+>@,@3+4+f+E+'@f+)@!@a+~@X+{@w+Y+L+Z+w+]@b+^@k+k+/@w+L+(@_@:@<@E+D+[@e+'@}@E+f+4+4+|@1@/+/+;@^+^+2@3@4@5@6@7@8@9@0@a@2+_+^+^+^+_+^+^+^+^+^+^+^+^+^+^+b@=@^+^+^+^+^+=@^+^+^+^+^+^+^+^+^+^+2+;@^+^+^+^+^+^+=@b@^+;@2+b@^+^+2+^+^+2+^+=@^+^+^+3+c@k+I+d@J+J+e@J+J+I+I+I+f@g@H+h@i@:@^+^+_+^+^+b@;@^+^+^+^+^+^+b@^+^+2+^+^+^+^+2+^+^+^+^+^+^+^+^+^+^+_+^+^+^+^+^+^+^+^+^+^+^+^+^+b@^+^+^+;@^+^+2+:+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+;@^+@@^+^+;@^+^+=@^+^+^+^+^+^+^+", "j@/+j@/+/+/+/+/+/+(+/+/+/+/+k@/+/+q+q+/+(+/+/+/+q+/+/+,@l@/+/+(+/+;@/+/+/+,@/+/+l@/+/+/+/+/+/+/+/+/+(+j@/+/+/+/+j@>@/+/+/+/+/+m@/+/+(+/+/+/+(+>@(+/+/+j@/+/+l@>@/+m@j@/+/+/+m@/+j@/+/+/+/+,@6+6+3+4+f+E+'@e+m+m+e+'@<@n@j+(@x+X+o@{@{@^@v+G+u+t+t+t+u+p@^@Z+q@r@m+[@D+D+'@'@D+g+f+4+3+s@t@u@v@w@x@y@z@A@B@C@D@E@F@G@(+/+/+/+m@/+/+,@/+/+k@q+j@/+(+/+/+/+/+m@/+/+/+/+/+/+>@(+/+/+(+>@/+j@/+j@/+/+/+/+/+m@,@/+/+/+/+,@/+/+m@/+(+/+/+H@I@J@K@J+d@d@d@J+J+J+J+I+I+I+H+H+H+g@L@M@b+N@/+/+/+/+/+/+>@/+/+/+/+/+/+/+/+/+>@/+j@/+/+/+/+/+/+/+/+/+/+/+/+>@/+q+/+/+/+O@/+/+/+/+/+/+j@/+m@/+/+>@q+/+/+/+/+(+/+(+>@/+/+/+/+/+/+j@l@/+/+/+/+/+,@/+/+/+,@/+/+/+/+/+/+j@/+,@,@(+", "6+6+6+6+6+6+6+6+6+6+6+P@6+6+6+1@6+6+6+6+6+P@6+6+6+6+6+6+1@1@6+6+Q@R@6+P@1@6+1@P@6+S@6+P@6+1@P@6+6+P@6+P@6+6+1@6+6+6+6+6+6+1@6+6+6+6+1@R@6+6+1@6+6+6+6+6+6+6+6+6+6+6+6+P@1@1@1@6+R@6+6+6+6+6+T@3+4+U@f+E+V@'@ @W@X@:@:@:@Y@Y@Y@n@c@Z@`@b+]@b+/@G+ #.#+#s+h@+#+# #v+X+@#B+m+D+ @##'@H@.@$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#6+6+6+6+6+6+|@6+6+1@6+6+6+P@6+6+6+6+6+6+6+6+1@6+S@P@P@6+6+R@6+6+6+6+6+R@Q@6+6+6+6+6+6+6+6+6+6+6+1@6+6+1@/#(#_#J+J+d@d@d@d@d@J+J+J+J+I+I+I+H+H+H+g@g@L@L@:#u+<#'@6+6+6+6+6+6+6+R@6+1@6+6+6+6+6+1@6+6+6+1@6+6+6+6+6+Q@6+6+6+Q@6+6+6+6+6+1@6+6+6+6+6+R@6+6+6+6+P@6+6+6+6+6+6+6+R@6+P@6+6+6+6+6+P@6+6+6+6+6+R@6+6+[#1@6+6+6+S@6+6+6+6+6+6+6+6+", "3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+}#}#3+3+|#3+3+3+3+3+|#3+3+|#3+3+3+3+3+3+}#3+3+3+3+3+3+3+|#3+3+|#|#|#3+3+3+3+3+3+3+3+3+3+3+3+T@3+3+3+3+}#3+3+3+3+3+3+3+3+}#|#|#3+3+4+4+f+g+E+D+1#e+ @m+Y@2#:@M+n@3#3#3#M+M+4#5#L+]@b+W+k+u+J@+#s+6#7#7#6#s+8#9#c+0#W@'@e+a#b#c#d#e#f#g#S@3+|#h#i#j#k#l#m#n#o#3+3+3+|#3+3+3+3+3+}#T@3+}#|#3+3+3+3+3+T@|#}#|#|#3+|#3+3+3+3+3+}#3+3+3+|#3+}#T@p#3+T@3+q#3+3+3+3+3+r#s#J+J+J+d@d@d@d@d@d@J+J+J+J+J+I+I+I+H+H+H+g@g@g@L@L@_#L@.#t#u#}#3+3+}#3+3+3+3+3+3+}#3+3+3+3+3+3+3+3+3+3+3+}#T@3+}#T@3+|#3+3+3+3+3+3+3+3+3+T@3+}#3+3+3+3+}#3+3+3+3+3+}#|#3+3+3+3+3+3+3+3+3+3+3+3+3+T@3+T@3+3+3+3+3+|#3+3+3+3+3+3+3+}#", "4+v#4+4+5+4+v#4+4+4+4+4+v#4+4+4+4+4+4+V+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+w#4+4+4+4+4+5+4+4+4+v#4+4+4+4+4+4+4+4+4+4+5+4+4+4+4+5+4+4+4+4+4+4+4+4+4+4+4+4+4+4+x#4+4+4+4+4+5+4+4+w#4+4+4+4+4+4+4+4+4+4+f+y#g+E+E+D+z#e+ @ @m+Y@!@:@M+n@A#`+B+B+B#`+d+z+X+W+^@k+t+C#.#D#6#7#K+h@+#.#s#b+E#F#G#H#I#J#H@D+E+K#f+4+4+4+4+L#M#N#O#P#Q#4+4+4+4+4+4+4+v#4+4+4+4+4+4+v#4+4+v#4+4+v#4+5+5+w#v#4+4+4+4+4+w#4+v#4+v#4+4+4+4+4+4+4+4+4+4+4+x+R#d@S#d@d@d@d@d@d@d@d@J+J+J+J+J+I+I+I+H+H+H+g@g@g@L@g@g@T#s+U#V# @4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+5+4+4+4+4+4+4+4+v#4+4+4+4+v#4+4+4+4+w#4+4+4+4+4+4+4+4+4+5+4+4+4+4+4+4+4+w#4+v#4+4+4+4+4+x#4+4+4+5+5+4+4+4+4+5+4+4+w#4+4+v#4+4+", "y#f+f+f+f+f+U@f+f+f+U@f+f+f+W#f+f+f+U@f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+y#U@f+f+f+U@f+y#y#W#f+f+y#f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+W#f+f+f+f+f+W#f+f+f+f+f+f+U@f+f+)@y#f+f+f+f+f+f+f+f+f+f+f+U@f+f+f+g+g+E+E+D+D+[@e+e+ @ @m+Y@!@:@M+n@3#`+B+4#X#4#4#a+L+b+v+k+t+.#s+D#Y#D#D#K+Y#s+Z#`# $.$+$##Y@@$e+D+E+g+g+f+f+f+x##$$$%$&$*$f+f+f+f+f+W#f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+=$f+W#f+f+y#f+f+f+f+f+f+f+f+f+f+f+f+c@g@6#H+d@K@d@d@d@d@d@d@d@J+J+J+J+J+I+I+I+H+H+H+g@g@H+L@T#s+J@8#-$o@;$g+U@f+f+f+f+f+W#f+f+f+U@f+f+f+f+f+f+f+f+f+y#f+f+f+f+f+U@f+f+U@f+f+f+f+f+f+f+f+y#f+f+f+f+f+f+U@f+U@f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+f+", "g+g+g+g+>$g+g+g+g+g+g+,$g+g+,$g+K#g+g+g+g+g+,$g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+,$g+g+g+g+g+g+g+K#g+g+,$g+g+K#,$K#g+g+,$g+g+g+g+g+g+g+g+'$g+g+'$g+,$'$g+g+,$g+g+g+'$g+g+g+g+g+g+g+g+g+g+g+g+,$g+g+g+g+g+E+E+}@D+V@D+D+'@e+e+ @m+Y@!@:@)$n@!$B+0#X#~$_@_@a+t#/@k+8#s+K+Y#D#Y#Y#Y#{$]$^$/$($X+_$Y@m+!@:$<$[$}$E+E+g+K#g+|$%$1$2$'$g+g+g+g+'$g+g+g+g+g+g+g+g+g+K#g+g+g+g+g+g+g+g+g+g+,$g+'$g+g+g+g+K#g+g+,$K#g+K#g+g+g+,$m+:#K+6#6#T#g@J+d@d@d@d@d@d@J+J+J+J+J+I+I+I+H+H+I+3$L@7#D#C#8#W+o@o@4$5$t#g+g+g+g+g+'$g+g+g+g+g+g+g+6$K#g+g+g+g+g+g+g+g+K#g+g+g+g+K#,$,$g+g+K#K#6$g+g+g+g+g+g+g+,$K#g+g+g+,$g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+g+,$g+g+'$g+'$,$g+g+g+g+g+g+g+", "U+E+7$7$U+E+E+}@U+E+E+U+E+E+E+E+8$E+E+E+E+U+E+9$E+E+}@E+E+E+E+U+9$E+E+E+E+7$E+E+U+E+}@}@E+}@E+U+U+E+E+E+E+7$}@E+E+E+7$E+E+7$E+E+E+E+E+E+E+E+E+U+D+}@}@7$E+E+E+E+}@E+7$7$}@7$E+E+E+7$E+E+}@E+E+E+E+E+7$E+E+E+E+D+0$D+D+'@'@e+e+a$m+Y@!@:@b$3#r@B+N@d+j+A+c$r#X+d$G+h@K+D#Y#Y#Y#e$f$g$h$6#h@s+{@i$j$k$l$m$n$o$p$V@E+E+q$r$s$t$u$E+E+E+}@E+E+E+7$E+E+9$E+E+7$E+E+E+E+E+E+U+U+U+U+E+E+E+E+7$7$+@}@E+E+E+E+E+E+E+E+E+E+E+ #6#K+7#7#v$7#:#g@I+d@d@d@d@J+J+J+J+J+I+I+I+I+H+L@w$D#x$G+^@{@{@{@]@]@y$z$A$}@7$E+E+E+}@E+E+E+E+U+E+E+U+E+E+E+}@E+E+E+E+U+E+E+E+E+E+E+E+E+E+E+7$U+8$E+E+E+E+E+E+E+7$U+E+E+7$7$E+E+E++@E+E+E+U+E+E+E+E+U+E+}@E+E+U+E+E+E+E+E+E+E+E+E+E+E+E+E+", "B$V@D+D+C$D+V@D+C$D+D$C$D+D+C$0$'@D+D+D+D$D+C$H@B$D+V@D+D+V@D+D+H@D+D+D+D+D+D+0$D+D+D+D+V@D+C$D+C$0$D+D+V@0$V@D$D+0$D+V@E$'@1#'@1#E$'@E$D+V@H@H@V@D+V@D+D+D+D+D+D+D+D+D+C$V@D+D+D+0$D+D+V@C$D+V@D$D+V@D+B$D+0$D+B$C$D+F$E$'@'@e+<@ @m+m+2#:@M+3#`+B+G$c@H$r#I$J$K$s#.#K+Y#Y#Y#L$M$N$O$7#:#7#P$Q$R$S$T$U$V$W$X$Y$'@D+D+Z$`$ %.%D+D+D+0$0$0$D+C$D+D$V@C$C$0$H@D+D+0$D+C$0$0$D+D+D+D+D+C$H@0$D+V@D+D+D+V@V@0$V@V@0$C$4$L@+%6#6#6#7#7#:#:#_#g@I+J+J+J+J+J+J+J+I+@%H+_#6#s+C##%K${@]@b+]@]@]@b+b+{@u+3#B$0$D+D+V@0$0$D+D+D+D+D+0$D+D+C$V@0$V@V@D+C$0$V@V@0$D+0$D+D+D+B$V@0$V@C$0$D+D+D+D+D+D+V@V@D+D+D+D+D+D+C$D+D+D+D$C$D+0$0$C$0$D+C$D+D$D+C$D+B$D$D+D+0$C$D+D+D+D+", "'@E$[@1#1#$%1#E$'@F$'@z#F$E$E$F$z#z#$%1#'@z#z#E$[@[@1#F$$%F$E$[@1#$%[@z#[@'@1#[@[@'@F$'@F$'@F$'@E$[@$%E$E$$%'@F$e+$%[@%% @####&%*%=%a$ @-%;%e+1#'@'@'@'@$%e+'@F$F$$%[@[@z#'@F$$%'@1#F$[@'@1#'@'@z#$%'@$%E$F$z#1#'@[@'@'@1#'@[@ @>%,%*% @m+C+'%)%!%r@B+~%{%]%r#5#r+^%s#h@D#Y#/%(%_%:%<%7#T#T#[%}%|%1%2%3%4%5%6%7%8%>%z#9%b#0%a%'@'@z#'@'@e+'@z#E$E$[@'@[@E$1#1#E$E$1#e+z#z#1#[@[@'@'@'@'@F$1#1#$%'@[@1#1#'@1#F$'@r#d@b%<%K+K+6#7#7#:#c%_#_#L@g@I+I+J+d%I+d@e%:#+%.#G+v+]@]@(#b+b+b+b+b+b+W+W+W+f%#%<@z#$%F$1#E$F$1#[@z#F$z#[@F$$%'@1#E$'@'@e+1#[@1#F$'@[@$%[@F$F$z#$%'@e+e+z#F$'@'@[@$%[@z#[@'@[@'@z#[@E$E$'@F$'@'@'@e+1#'@[@$%[@z#F$z#$%$%F$[@E$[@1#1#[@F$e+[@e+", "-%-%%%>%-%<@,%;%,%%%;%-%<@%%>%e+-%,%e+-%>%;%<@<@e+ @ @-%-%<@e+%%;% @e+,%-%<@-%>%%%-%<@-%<@;%-%,%%%<@-%%%%%-%-%e+ @-%g%&%Y@#@h%2#Y@C+i%j%h%#@##m+ @ @-%;%-% @>%,%%%%% @<@%%-%%%,%,%>%<@,%<@e+<@,%e+-% @,%>% @e+-%,%e+e+;%;%;%%%-%>% @-%##m+h%@$k%l%M+m%!$n%d+o%r#5#p%y+G+D#D#q%r%s%t%6#7#T#u%v%w%x%y%W+Z+z%A%B%C%D%g%<@E%F%G%H%<@;%;%-%e+-%>%;%,%;%<@;%,% @%%%%%% @ @<@,%;%,%>%<@%% @,%e+-%;%%% @ @>%e+e+;%,%e+B+I+Y#I%K+K+K+6#7#7#:#_#_#_#L@L@g@J%H+d%d@K%s#L%C#M%^@{@]@W+W+b+W+b+b+W+W+W+^@^@W+#%N%;% @<@ @;%,%%%-% @ @>%e+ @e+%% @>%,%%%e+,%-%e+,% @%%;%,% @;%e+,%e+-% @-%-%,%<@,% @,%%%>%e+-%,%<@>%,%<@%%;%%%e+>%-%>%-%-%-%,%e+ @;%%%%%%%;%<@>%>% @e+e+%%;%,%", "m+g%m+ @=%m+g%m+ @m+a$*%g%m+a$=%=%a$*%m+=% @m+g%g%g%a$m+g%a$*%=%m+m+m+m+m+m+*%=%*%=%m+m+g%m+##=%a$g%*%&%&%m+ @*% @&%#@u#O%l%P%Q%)%W@m+R%P%O%k%S%u###a$&%m+ @*%g%a$*%##a$=% @&% @=%m+g%a$m+*%*%&%m+a$ @&%g%*%g%g%=%m+=%g%a$m+&%m+&%a$a$ @a$j%W@k%i%:@)%3#r@T%X#U%V%5#Z@z+^@s+W%X%Y%Z%6#7#T#`% &.&+&@&H+v+Y+#&$&%&&&!@j%*%*&=&-&##&%*%g%=%=%a$a$*%&%g%*%&%a$ @&%*% @*%*% @&%=%m+g%##&%*%*%=%m+####=%m+*%m+*%=%=%6#7#D#K+K+K+;&6#7#T#:#:#_#_#L@g@g@J%H+H+>&,&1+'&)&.#+#t+k+K$b+W+W+W+W+W+^@^@/@v+v+^@J@!&*%*%##*%a$g%&%&%=%m+m+*%g%m+a$*%m+*%m+*%a$g%m+*%m+m+m+&%m+##&%=%##=%*%=%##m+*%a$m+a$g%m+g%g%m+=%=%a$a$g%g%*%a$a$=%g%m+=%&%##g%## @m+&%&%&%####=%g%m+&%g% @", "u#W@W@u#W@j%m+m+Y@h%j%h%j%Y@h%W@h%j%Y@Y@@$@$h%Y@#@Y@W@h%Y@@$#@Y@h%#@Y@j%@$h%Y@j%u#Y@#@@$Y@Y@Y@m+W@j%m+#@#@#@Y@j%Y@O%i%:@!@M+Q%~&T##%p%j%{&]&^&/&i%k%Y@#@u#u#j%h%u#u#Y@Y@@$@$h%j%W@h%Y@h%u#Y@h%@$Y@j%j%#@#@j%u#W@u##@u#h%Y@@$@$h%W@j%Y@h%Y@@$Y@O%i%Q%X@P%(&_&:&X#<&A+[&J$Z@}&|&1&2&3&6#T#T#4&5&6&7&K@8&I+Z+9&0&a&b&R%'%Y@c&H#d&#@j%@$@$h%W@@$u#h%Y@h%j%#@Y@#@Y@#@@$u#Y@@$j%Y@#@Y@u#@$j%j%Y@h%u#j%Y@j%j%Y@m+u#e&I+D#K+f&K+K+K+6#7#g&:#:#_#_#L@g@g@J%H+H+h&i&&+j&.#k&+#h@+#)&G+b+^@^@^@^@/@/@/@v+k+k+v+h@l&#@Y@@$j%Y@#@#@W@Y@@$@$#@#@j%W@#@W@Y@Y@h%u#u#j%@$j%Y@Y@W@W@#@h%#@h%Y@@$h%@$h%h%h%#@j%Y@#@h%h%j%#@h%#@#@Y@j%u#W@h%h%j%#@h%Y@#@Y@u#h%#@#@j%W@h%j%u#j%u#Y@Y@", "m&!@Y@!@C+k%C+!@!@S%S%C+m&O%i%O%C+!@O%C+O%S%!@!@S%!@O%!@!@k%O%!@k%k%!@S%!@!@!@!@C+!@!@k%k%S%!@Y@Y@!@!@m&!@C+C+C+Y@2#:@M+{&3#n@B+n&H+L@o@n@o&p&o&)%)%:@l%S%C+S%C+!@O%S%i%C+!@k%!@Y@!@!@k%!@C+!@O%k%k%O%C+!@O%!@C+Y@!@O%!@m&!@O%O%!@O%i%C+C+i%i%O%m&!@l%P%]&m%q&B#r&_@A+s&(@t&u&v&w&x&6#T#T#y&z&A&B&C&Y#x+X#D&E&F&G&n@M+H&I&J&K&C+!@Y@!@C+i%!@!@C+O%C+k%!@!@S%O%C+!@!@!@m&O%O%!@C+O%m&O%S%!@k%i%!@!@!@k%!@m&L&M&D#K+f&K+Y#Y#N&6#T#:#:#:#O&L@P&g@g@f@H+H+C&N%m@D#.#.#.#+#.#Q&h@d$b+^@/@/@/@v+k+k+d$d$k+8#J@{&!@!@O%i%!@Y@!@!@m&O%O%!@!@!@C+!@O%k%C+C+C+k%C+!@O%O%k%O%!@C+k%!@i%O%S%k%i%m&k%!@!@O%k%!@!@C+m&k%m&m&k%k%S%m&O%S%m&!@O%Y@k%C+i%!@O%k%!@!@k%O%O%C+C+k%C+", "l%l%Q%:@:@:@X@Q%X@:@:@Q%X@/&:@:@'%:@:@/&/&:@:@:@2#Q%'%!@!@:@/&:@:@:@:@:@l%:@X@l%Q%:@:@X@Q%:@/&l%:@/&:@:@:@:@X@'%:@R&M+b$!%r@B+S&T&Z+d@C&#%!$3#`+U&o&V&P%l%:@Q%:@X@'%/&:@l%/&!@:@'%'%:@:@X@X@/&l%!@Q%/&:@Q%/&/&:@Q%:@Q%:@:@Q%l%/&:@2#:@Q%2#Q%!@/&/&'%Q%R&R%n@3#W&B+X#X&V%Y&Z&`& *.*+*6#T#T#@*#*$*%*&*D+{+**=*-*;*>*!$b$,*'*)*!*:@/&l%l%:@/&/&:@X@Q%:@:@/&:@'%2#/&l%2#'%Q%!@X@:@l%/&:@X@:@:@Q%:@:@:@:@l%/&U%@&K+I%K+f&Y#Y#Y#K+6#7#T#:#:#O&L@~*g@g@f@H+H+{*{@6+]*.#.#^*.#+#.#+#C#^@/@/@/*v+v+k+d$d$#%8#d$(*_*X@2#:@:@:@l%X@l%X@/&:@'%'%2#Q%l%:@:@:@l%l%:@/&l%/&Q%:@/&:@:@/&:@:@X@!@:@:@/&2#:@:@:@Q%2#l%/&l%2#/&:@Q%2#X@l%Q%2#l%Q%:@:@:@2#'%Q%/&/&:@'%:@/&'%:@Q%l%l%", "M+:*:@M+M+R&R&M+M+M+)%R&M+M+:*R&)%)%M+R&)%M+M+M+P%M+M+M+R&M+:*M+^&R&)%)%^&M+)%M+M+M+M+R%)%M+M+:*R&P%)%)%R&)%M+R&R&R%b$<*[*}*0#X#|*[*1*_#C&2*n%q&3*}*r@4*o&]&)%M+R&)%M+P%:*R&P%R%P%R&R&M+P%P%P%:@M+R%M+R&M+M+M+M+M+:@M+P%M+)%)%M+M+P%M+)%:*M+)%M+R&M+P%)%P%]&!%p&5*0#d+j+r+Z@6*7*8*9*0*T#L@H+a*b*c*d*e*f*g*h*i*j*k*U&_&l*m*n*o*P%)%^&)%)%)%P%M+M+^&^&R%M+)%R%:*M+P%)%R&R&M+)%M+)%M+M+M+M+M+M+)%M+M+^&P%p*H+T#Y#K+Y#Y#Y#D#Y#K+6#q*T#:#:#_#L@g@g@g@H+H+H+r*o@3+h@+#.#+#+#+#+#.#+#d$^@v+v+k+s*d$t*#%8#G+G+#%u*v*P%M+M+R&P%R%P%M+M+P%)%M+^&M+M+R%R%R&:*R&:*M+M+R&M+P%R&R&M+M+)%M+M+^&P%)%M+P%M+)%R&M+:*M+R&)%)%M+M+P%:*R&)%P%:@R&M+P%P%R&R&M+R&)%M+R&M+R&M+:*M+P%R%R%", "n@n@n@n@n@n@n@n@n@{&n@n@n@{&o&n@n@n@n@o&{&n@n@]&n@n@{&n@o&n@n@n@n@n@n@n@n@n@o&n@]&o&n@n@]&{&n@o&{&m%o&n@]&n@o&n@n@o&3#4*r@B+w*|*d+<&4#&@L@@&t+j+!$4#0#}*`+r@4*3#]&n@n@n@n@n@]&n@n@n@o&V&n@)$n@]&V&o&{&n@]&m%n@n@{&n@o&n@)$n@n@n@n@n@o&o&{&V&n@n@n@{&M+(&n@!%(&r@T&0#X#x*q@z+y+y*z*A*B*c% #r#C*D*E*F*G*H*I*J*K*L*z+r@M*N*O*P*Q*]&<*n@o&{&n@n@]&n@n@n@n@n@o&o&{&n@n@o&V&n@n@{&o&{&b$]&n@{&o&n@]&V&)$n@]&.#H+D#K+Y#R*Y#D#D#j&K+6#S*T#:#:#_#L@g@g@J%H+H+H+R#w+6++#h@+#+#+#+#+#+#h@t+/@k+k+d$d$#%#%8#8#G+G+s#G+T*U*n@]&{&]&n@n@)$n@n@]&{&{&b$n@o&n@n@]&o&n@o&]&)$n@n@{&n@o&]&n@n@]&n@n@n@n@o&n@n@]&n@n@n@n@o&n@n@n@V&n@o&o&n@n@n@n@n@m%n@]&n@n@{&n@n@n@n@{&n@o&n@n@o&", "3#4*3#3#3#3#3#3#3#3#3#4*3#!%(&3#3#3#3#3#3#3#(&!%3#(&3#3#!%3#3#3#3#V*4*3#3#3#3#3#!%4*U&3#3#3#3#3#3#3#<*3#3#!%3#3#3#3#r@r@W&B+0#r&_@c@c$d+(@@&R#h@Z&`+X#W*4#X*`+`+r@r@(&3#3#!%3#A#3#4*3#3#3#3#3#3#!%3#!%3#3#!%3#3#!%3#3#3#3#3#3#3#3#3#(&4*A#3#4*(&3#!%3#3#3#r@r@!$B+n%d+j+r#z+y+Y*Z*`* =.=/ +=6+@=#=$=%=&=*===-=W+j+0#;=>=,='=3#3#3#3#3#!%3#3#3#3#3#4*3#3#3#3#3#3#m%3#4*3#3#3#!%3#3#(&(&4*3#3#!%3#3#3#)=R#s+Y#D#D#D#D#D#!=~={=6#]=T#T#:#_#_#g@g@H+H+H+I+^=4$@@/=(=+#(=+#h@h@h@h@+#k+k+k+d$#%G+_=8#G+G+s#u+s#u+:=_@3#3#3#3#3#3#3#3#!%3#!%4*3#3#3#3#3#3#3#3#3#4*3#3#(&3#3#!%(&3#3#3#3#3#3#3#4*4*3#3#4*3#!%3#3#3#3#3#!%3#3#3#3#(&3#3#3#U&(&3#3#!%3#3#3#3#3#3#3#3#q&V*", "[*r@r@5*r@r@r@r@_&r@r@r@r@r@r@r@q&r@r@r@r@r@5*r@5*r@r@r@r@[*r@r@r@r@r@[*r@r@r@r@r@[*r@<=r@r@5*r@r@V*r@T&r@r@r@p&T&r@r@`+`+B+4#X#_@c@c$A+_@Y+[=C&:#o@c@}=_@d+X#4#0#T%`+`+`+`+r@r@r@r@W&r@!$r@r@r@[*r@r@r@r@W&r@[*r@r@r@r@W&r@r@r@r@[*r@r@r@r@r@r@r@`+|=}*X*B+3*4#X#l&j+A+5#z+Z@W+1=2=3=4=5=6=7=8=8=9=0=a=b=w+c=W+r&d=e=f=g=h=[*r@r@_&r@r@r@r@r@r@r@r@T&r@r@r@r@p&r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@r@6*h&]*Y#Y#D#D#u*i=s+D#Y#K+6#7#T#T#T#_#_#L@g@H+H+H+I+d@j==+t+h@+#h@+#k=h@h@h@s+s#l=#%G+z$v+d$s#G+s#s#u+u+s#m=n=:&r@r@r@o=r@r@r@r@r@r@_&T&r@r@p&r@r@[*r@r@r@o=p&r@W&p=r@5*r@r@5*r@r@p&r@r@r@r@r@r@[*r@r@r@r@r@r@r@r@r@r@r@r@[*r@r@5*r@5*r@r@r@p&r@r@r@_&[*r@r@5*", ":&`+|=:&|=`+`+`+:&`+`+`+`+`+`+B#`+`+:&`+:&`+|=|=`+`+X*:&|=`+`+`+|=`+`+`+`+`+`+`+`+|=B#:&`+`+:&`+`+`+`+`+|=`+`+`+:&`+`+B#T%B+4#X#d+c@c$A+q=c@]@h&h&I+r=I@d+d+s=_@d+X#4#4#0#B+B+B+|=`+`+`+`+B#`+`+`+`+`+|=B#`+`+`+:&`+`+B#!$X*`+`+`+`+:&:&`+`+t=B+/#0#4#4#X#X#d+_@j+c$q@5#@#Z@#%M+u=v=w=x=y=z=A=B=C=D=E=F=G=H=o@I=J=K=L=M=N=`+`+`+`+:&`+`+|=:&`+`+`+`+`+|=`+`+`+|=`+:&`+`+`+`+`+`+`+`+`+|=`+`+`+|=A+R#Y#D#Y#u*O=s+P=s+s+D#!=K+w$7#7#T#T#_#Q=L@g@H+H+H+I+J+N%C.R=S=+#T=h@T=s+h@h@s+J@U=V=-$I@c$(@W=u+s#u+u+t+t+s#D#k+`+:&|=`+`+B#`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+:&|=`+`+`+`+`+`+B#`+|=B#`+:&`+|=`+`+`+`+`+`+`+`+S&`+`+`+|=`+|=`+`+`+:&`+:&`+`+`+`+`+`+`+`+`+", "B+B+3*B+B+B+B+B+B+B+B+/#T%B+B+t=t=B+B+B+B+B+B+B+B+B+B+B+T%B+B+B+B+B+B+/#B+B+T%B+B+B+B+B+B+B+B+T%B+t=B+B+B+3*B+t=3*B+/#B+0#0#4#4#d+_@j+A+r+X=A+/@Y=[=R#T#Z=Z&c@_@j+j+c@_@d+`=N@4#4#0# -0#0#B+B+B+t=B+B+T%B+T%B+B+B+B+B+t=T%w*B+B+t=/#B+0#0#.-4#4#X#d+_@c@c@j+A+a+r#5#z+z++-s#^+@-#-$-%-&-*-=---;->-,-'-)-!-~-{-]-^-/-(-_-t=T%B+T%t=B+:-/#t=t=T%t=B+B+t=B+t=B+/#T%B+B+B+B+B+B+T%B+B+B+B+T%/#B+B+~%$@T*s+D#D#s+s+<-P=s+s+D#Y#K+K+7#7#T#T#_#L@L@g@H+H+H+I+J+{@<.8#D#+#+#h@h@s+s+D#K+[-}-|-1-2-3-4-L+ #u+u+u+t+t+t+5-:#Y+B+B+B+B+B+B+/#B+:-B+B+B+B+/#B+B+T%B+B+B+B+B+B+B+B+T%B+B+T%B+B+B+3*B+B+T%B+B+B+t=B+B+B+B+B+B+t=B+T%B+:-t=t=B+B+3*B+B+B+B+B+/#w*B+B+B+B+B+B+B+", "0#0#0#6-0#.-0#0#0#0#0#7-.-0#4#.-0#0#0#0#0#0#.-0#0#0#0#6-.-0#0#0#0#6-.-0#.- -0#0#6-0#0#0#7-0# -0#6-0#6-0# -0#0#6-0#0#0#6-0#0#4#X#X#_@8-9-r#X=@#a+0-C&h&h&d@K+8#t#A+c@c$c$c$j+c@_@_@a-X#b-r&4#4#4#0# -6-0#0#.-0#0#0#0#0#.- -0#0#0#.-4#4#4#X#d+_@c@j+c$A+a+r#I$A+_$r+5#@#~@k+*+].c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-b*r-s-t-u-N@0#0#0#0#0#.-0#0#.-0#0#0#0#0#0# -0#0#0#0#0#0#0#.-0#0#.-.-.- -0#0#0#0#c@J@g@v-j&D#s+s+<-h@s+s+S=s+D#K+M@6#7#T#w-:#L@L@L@H+H+H+I+x-]@V d$D#h@k=h@h@s+!=.#/*y-z-A-B-C-D-E-X=F-C#u+t+t+t+ #t+C#g@G-0#0#n%0#0#.-0# -0#0#0#0#0#0#0#6-0#.-6-.-0#0#.- -6-.-0#0#0#.-0#0#6-0#0# -6-0# -.-0#0#0#6-0#6-.- -.-7-0#.-0#6-0#0#0# -0#0#0#n%0# -6-7-0#6-0#", "H-4#H-4#N@4#4#4#4#4#|*N@4#H-~%4#H-4#4#4#4#4#~%4#4#H-H-N@4#4#~%4#N@4#4#4#4#H-~%r&4#4#4#N@H-4#4#4#H-4#~%~%H-4#N@4#4#4#4#4#4#~%b-I-d+~$s=c$I$J-@#(@5#/@@&C&C&@&I+7#C#b+I@I$K-c$I$A+H$c$8-c@_@_@~&d+d+G$X#`=L-N@N@4#4#W*r&N@4#~%X#b-G$d+M-<&c@j+c$A+a+r+N-I$O-P-/@b+Y+X+]@b+<.Q--.&%R-S-T-U-V-W-X-Y-Z-`- ;.;+;@;#;$;%;&;X#~%N@4#~%~%4#4#H-4#r&4#~%4#4#4#4#4#4#4#4#4#4#~%4#4#4#4#H-4#4#4#4#4#4#~%/@L@.#Y#D#D#s+s+h@h@h@h@s+D#Y#Y#6#6#7#*;w-_#_#L@~*g@H+H+I+J+]@f ^@=;h@h@s+-;D#_*;;>;,;';);!;~;{;];^;G-#% #t+t+t+C#.#u+/@^@4#4#N@4#N@4#W*4#N@4#H-4#4#4#4#H-N@4#~%4#4#N@H-4#4#4#~%4#4#4#4#4#|*4#~%4#~%4#4#4#4#~%4#4#~%4#4#~%4#H-W*N@~%4#4#4#4#N@N@4#~%4#~%N@4#4#4#4#4#", "X#X#X#G$X#`=X#b-L-L-X#X#L-I-X#L-X#X#X#`=X#I-/;X#X#X#X#G$L-X#b-X#L-`=X#X#X#X#X#b-X#G$L-/;X#I-X#X#X#X#X#b-L-X#`=L-X#X#`=b-`=X#L-b-(;_@c@j+A+r#@#Z@Z&_;:;d@@&R#R#R#J+_#D#t+<;[;};A+A+a+a+a+H$A+1*]%|;c@s=_@_@_@~&a-l&d+d+d+d+d+_@1;2;j+j+A+a+r#N-3;5#4;z+W+d$j+D 5;N.^+3#E+Q-6;++7;8;9;0;a;b;c;d;e;f;g;h;i;j;k;l;m;j+_@d+/;L-L-X#`=L-X#G$G$`=b-X#b-X#b-X#b-X#X#`=`=X#X#I-X#X#`=`=b-X#`=X#L-b-X#n;7# # #^*D#s+s+h@h@h@h@s+D#Y#o;K+6#6#7#g&_#_#L@~*g@g@H+I+J+]@; ]@N&[-h@<-s+Y#o@p;q;r;s;t;u;v;w;x;y;z;I@A; # #.#t+]@I@c+B;X#L-X#X#X#X#b-X#X#L-L-L-L-/;`=X#X#`=b-X#X#X#`=X#`=X#X#G$X#b-X#X#`=`=X#X#`=/;X#X#X#X#X#X#X#X#X#X#L-X#X#`=X#L-L-/;X#`=X#`=b-`=X#b-I-X#X#X#X#", "d+d+d+(;d+~&d+a-d+d+d+a-d+d+d+(;(;d+a-~&~&l&~&d+C;d+d+~&a-d+(;a-~&(;a-~&d+C;d+a-a-d+d+~&C;d+_@d+~&(;a-d+d+(;a-a-(;l&d+~&d+d+a-d+_@c@x*D;c$E;F;_;G;H;Z&I;g@R#R#K@d@K@J+L@6#h@ #k+J;K;3;_$a+r#N-r+q=a+A+A+c$K-j+j+j+j+c@D;j+|;K-L;H$q@O-5#@#@#r+@#M;d$t#& N;O;P;Q;W*r+_@%+R;x S;A=T;U;V;W;X;c;Y;Z;`; >.>+>@>a+r+A+8-_@_@d+~&(;~&(;(;a-d+~&~&~&~&d+a-(;a-(;d+d+a-d+a-a-l&(;d+(;d+~&~&d+(;d+M-~&o@#>[=L@.#t+$>+#-;h@h@h@h@D#D#f&K+6#6#7#T#:#_#_#L@g@g@g@%>J+b+4 X+6#+#h@h@s+=;&>*>C-=>->;>>>,>'>)>!>~>I@J;{>s#{@~@t#k+]>u+_@M-d+d+d+(;d+(;d+~&(;~&~&a-d+l&d+d+(;~&d+(;l&~&M-d+M-d+a-d+d+C;C;~&a-d+d+d+(;(;d+d+d+a-a-a-C;d+d+C;d+a-a-d+(;M-~&C;~&C;~&l&d+a-(;a-d+l&(;", "_@_@_@_@^>c@_@1;~$_@1;~${%X&1;_@_@~$~$_@X&<&~$1;X&1;_@~${%^>1;^>_@c@~$1;_@_@^>~$_@^>~$_@_@^>^>_@_@1;_@~$^>^>^>_@~$~$<&^>1;_@~$_@~$X&c@j+1*I$/>@#(>Z&_>:><>7#@&K@K@d@J+J+I+H+:#K+h@ #s#k+X+[>@#O-4;U*[&J-N-r+}>r#_$a+a+I$I$|>/>r+1>2>G-G-5#t&/@3>g+9.4>5>6>7>8>9>0>T#v+5#r+i&a>U;b>B=c;X;c;c;C=c>d>e>& X+5#1>r#9-|;o%_@_@_@{%X&^>_@~$^>X&~$_@^>^><&~$_@1;^>1;<&^>_@_@1;1;_@_@1;1;_@_@~$^><&<&r#+#f>g>h>I+s+u+ #+#v-h@v-D#D#Y#Y#K+6#i>T#:#:#j>L@g@g@g@H+k>b+l>L+v$m>h@h@h@~=n>o>p>q>r>s>t>u>v>w>x>Y#:;Z@~@~@Y+#%6#K@e%y>c@{%_@~$_@_@_@_@^>_@~$_@_@_@{%~$_@_@{%~$^>^>~${%{%_@_@^>~$~$_@_@^>~$1;^><&^>1;^>^>1;X&<&~$_@1;{%~$<&~$<&~$1;_@_@_@1;1;<&c@_@X&_@1;_@~$_@1;", "o%x*j+2;j+c@2;x*s=U%2;o%j+U%x*z>x*U%j+c@x*j+j+o%z>x*c@s=s=U%s=c@x*U%U%2;o%U%U%o%o%z>j+x*c@j+x*U%U%o%x*j+j+z>j+s=j+j+2;2;2;j+o%U%o%x*|;A$A>V%|>@#B>Z&i@x+C>Y+h@R#d@K@J+J+I+I+I+H+L@T#D#+# #t+s#_*]@Z+D>E>3;N-F;X=G-F>9&G>F>H>E>(@Z@F>K;w+8#Z@i+I>J>K>L>M>N>O>P>Q>R>:=d$w+s#Q&S>T>c;D=Y;U>C=0=V>W>X>8 c=Y>Z>F;r#`>D;j+z>2;o%2;c@o%j+s=j+U%2;o%c@U%c@x*j+z>s=j+o%x*j+j+x*x*o%j+U%o%c@j+U%o%2;U%r+o@ ,.,+,.,h>d@D# #@,T=D#D#D#Y#K+6#6#T#T#:#:#_#L@L@P&g@H+#,$,l>L+7#n;s+s+s+%,&,o>*,=,-,;,>,,,',),!,b+I@I@X+s#6#d@R#J+)&+-A+c@z>j+j+z>j+x*o%s=x*U%U%j+U%o%U%2;o%U%c@c@s=z>c@U%U%s=o%c@x*o%s=o%j+U%x*z>j+x*z>z>U%j+s=j+z>U%z>U%o%2;2;o%U%c@U%j+U%s=x*x*U%s=o%o%o%j+x*", "]%]%A$&@|;A$j+c$|;&@D;c$c$&@c$c$8-c$c$&@]%]%8-]%A$c$|;]%c$&@A$&@c$&@c$D;]%c$|;c$c$&@A$c$]%c$c$D;A$8-c$A$]%c$A$|;c$c$D;]%]%c$c$c$A$&@c$A$~,{,q@/>X=Z@Z&I@P-],L+u+d@d@d@J+I+I+I+H+H+H+L@_#7#D#+# #s#8##%d$v+b+Z+^,Z&z+9&H>Y>(@E#Z&/,G+w+Z.(,_,:,a <,[,e-T;},|,1,2,3,W=o@+#Y=4,3>5,6,7,X;c;8,9,0,& $%b+a,Z@G>};b,V%~,&@]%D;A$D;j+c$c$c$c$c$D;c$j+&@A$]%D;c$&@|;]%]%c$c$c$c$A$c$|;]%&@c$8-A$|;]%b,P-^*@&c,.,+,.,c,@&T#.#J@s+6#6#6#6#7#T#T#:#:#_#L@L@L@g@H+J+W+l>x+7#(=s+s+s+K+d,e,f,g,h,i,j,k,l,m,n,y+o, #7#x-@&p,H+6#q,E>r,&@8-c$c$c$]%]%]%c$D;]%A$c$c$8-c$&@D;&@&@A$c$&@A$]%&@A$8-j+|;A$c$]%c$A$A$c$c$A$j+]%&@&@8-]%&@8-c$A$A$A$D;D;j+|;j+A$&@A$8-|;&@D;c$&@|;&@&@", "r,A+A+~,A+A+A+c$A+A>c$L;A+A>~,A>K-r,K-~,r,~,~,A+A+A+L;~,A+A>A+K-A+A+A+1*K-r,A>r,~,r,1*A+A+K-A+A+K-A+r,A>~,1*c$A>r,A>A+r,A>K-~,A+A+A+A+K-s,H$b,r+s&F>(>c+t,u,Y+Y+/*L@d@J+J+I+I+I+H+H+g@L@L@:#7#6#Y#s+J@u+#%k+v+#%d$k+v,b+]@W+_*d$4#w,x,y,z,A,B,C,D,E,F,G,E,H,I,J,K,{@v+L,@&K@L%M,N,O,P,Q,R,S,8 ^,T,B>Z&Z@p%/>E;{,A>A>A+K-r,A+~,~,r,A+~,A+A+A>A+~,r,A>~,~,A>A>A+A+L;A+A+r,A+A+A>A+~,1*~,A+A+~,a+y+W+ #7#C&h>U,g>g>U,[=L@s++#Y#7#T#T#:#:#_#_#_#_#_#P&g@H+J+,&V,L+T#T=s+D#D#{=W,t,X,Y,Z,`, '.'+'@'^;A;O&d@d@#,I+_#+##%Y+p%K-L;~,A>~,r,~,A+~,A>r,~,~,r,r,r,~,A+r,K-A+L;A+A+A>A+L;1*~,L;1*r,~,A>~,K-1*r,A+L;1*r,A+A>A>A+A+A+~,r,r,r,r,A+A+A+r,L;~,1*A>A+A+K-K-~,A+A+L;", "V%H$a+s,a+a+V%a+a+a+9-`>`>H$a+V%a+9-H$H$V%`>a+`>V%a+a+s,`>{,`>V%a+H$a+s,a+{,a+A+V%a+`>`>a+H$a+V%{,`>a+a+a+V%a+s,a+a+s,A+a+V%a+s,s,H$a+`>{,9-I$4;s&Y&G>G;y+~@#'$'z;%'K+K@J+J+I+I+H+H+g@g@L@L@_#:#7#K+Y#D#s++# #u+8#W+w+Y+L+Z& @M &'*'='-';'e->'E,F,,'G,S-P>'')'!'~'z;d$&>g@J+%,{']'^'/'('4 '@k+I@t&_'(>Z>5#r+_$`>s,a+a+a+a+a+a+`>s,`>s,a+a+V%a+a+a+{,V%`>a+9-a+H$`>9-9-s,H$V%`>`>s,s,{,a+{,`>V%5#:'b+<'C#T#@&h>#>['}'.,|'J+w$s+K+:#L@L@1'_#_#_#_#L@g@H+d@,&r.Z+T#h@D#D#D#6#s#`@D#2'3'4'5'6'7'+#_#K@d@H+J+L@+#u+v+8'(@_$a+s,9-s,s,H$s,a+a+s,a+{,A+s,`>`>s,s,`>V%a+{,A+a+V%`>A+{,a+V%s,`>V%s,s,{,s,`>s,a+`>V%{,A+a+`>H$`>a+s,9-s,a+a+H$9-`>`>s,a+H$H$s,a+`>a+`>s,s,", "r#I$E;r#a+I$r#I$E;_$r#b,r#I$I$q@r#r#q@<#q@E;b,r#b,E;E;r#q@q@r#b,E;b,r#r#I$<#q@r#I$b,r#r#b,r#q@<#b,q@_$<#_$_$b,r#r#b,b,I$_$b,q@I$E;I$r#q@E;I$r#|>};J-@#Z@t&[>[;L+9'i&0'a'J+I+I+I+H+H+H+g@g@g@L@_#_#:#6#Y#s+h@h@h@.# #8#/@t#X#g+k l>b'c'd'e'f'P>g'|,E,h'i']'j'k'l'c=v+%'{@J@J+~*{@m'n'o'U c=b+p'c+y+E#Z@3;};/>|>q@r#E;q@r#b,<#r#r#b,I$r#q@<#r#r#r#I$_$b,a+q@r#q@r#b,r#b,_$r#a+r#q@_$I$E;E;b,E;q@<#F;K;<>W+G+A;q*@&Y=c,.,g>['q'r'_#f&K+:#g@f@g@L@L@s'g@H+d@W+t'L+:#<-D#R*Y#T#W=w+u'N%o@/@s#R*v'd@p,w'J+_#+#x'^;i&y'z+r+r#q@<#q@<#E;r#_$r#<#a+q@b,r#r#b,q@b,r#<#b,b,E;b,_$a+r#q@q@<#q@b,<#<#E;_$<#b,E;r#E;b,q@r#q@r#q@<#I$r#<#b,r#q@r#I$<#b,b,r#E;I$b,r#b,b,r#_$I$<#", "/>O-r+r+4;4;r+}>|>q=r+r+4;q=r+}>r+r+r+r+r+q=}>r+}>r#q=r+|>q=4;4;O-/>q=}>}>|>/>r+r+r+r+r#r+|>|>r+r+q=q=}>/>}>/>/>r#4;q=q=q=/>q=/>/>/>4;q=|>r+/>O-[&[&1>@#a,z'[>~@u,A'0'w+k+_#J+H+I+I+H+H+g@g@L@L@_#_#T#T#6#D#h@J@ #G+]@r#6+m+A+E;B'C'D'E'F'U;G'H'F'I'J'K'L'L'M'N'H=O'w+o,N%:#H+t+H>^+M-#%P'D>H;c+Z&Q'G>F;[&/>[&}>/>|>|>r+O-r+r+/>r+/>}>r+|>|>O-r+r#r#r+|>q=r+/>/>/>r#O-|>r+/>}>r#r+}>}>}>O-r+O-}>O-|>@#y+`@W+<'C#%,K@[=h>U,['['#>h&H+T#6#R'L@H+g@g@H+H+K@S'T'U':#s+Y#6#6#+#V'w+b+k+/=6#J+K@g@H+d%:#J@u+l=i&y>z+U*O-|>r#}>}>|>O-O-r+q=r+O-r+|>4;}>q=|>r+|>r+O-q=/>q=O-|>r+/>q=/>|>/>r+r#r+/>4;q=|>/>}>O-q=|>}>r#}>/>/>r+r+q=}>}>|>/>}>q=}>O-r+|>4;}>r+}>|>/>q=|>q=", "5#U*N-J-U*};[&U*5#r+J-5#s&5#};5#s&s&J-5#J-s&N-};U*5#s&U*[&};[&U*5#J-};U*N-[&s&};s&r+N-};r+U*r+[&U*5#};N-[&J-r+s&[&U*N-};[&r+s&[&};s&U*[&N-[&r+};s&p%Y&F>B>(@Z&:>~@W'X'T,{@b+v-J+H+H+H+H+g@g@L@L@L@_#_#_#T#6#K++#s#o@j+/ / r@y+v,Y'Z'`' )a;b>I'b;.)+)U>@)L'#)$)L+/*%)y$w+Y+&>:#:#^@d$j=y>;;_>[>+-4-Q'9&1>5#r+5#N-U*J-s&s&5#};};J-U*J-5#5#r+N-N-U*};J-r+};r+5#[&J-N-5#s&5#J-};s&[&U*U*J-J-r+r+[&[&[&N-r+5#F>D>Y+W+_=r=j&I+[=Y=&).,g>U,h>R#*)6#6#:#p,J+J+=)-)u I@g@K+i=;)/@>)k+u+(=1'J+I+L@H+I+N&J@W=/@X+t,(>5#U*r+J-};s&J-s&[&[&s&[&U*[&s&J-5#5#J-s&[&U*};};5#U*J-N-s&[&J-};s&[&};5#U*r+};5#s&N-};J-[&[&5#U*5#N-r+r+};r+r+N-r+J-N-};s&J-J-5#U*r+N-5#s&5#};s&s&5#U*", "3;F;@#Y&@#3;Y&Y&p%X=@#@#p%F;Y&Y&X=F;@#3;Y&@#F;F;@#Y&F;F;F;@#Y&F;@#p%p%5#F;Y&p%F;X=F;F;@#Y&Y&F;@#Y&@#X=X=3;Y&3;F;p%@#p%@#1>Y&@#@#F;F;X=5#F;5#@#Y&Y&p%9&Z>_;,)(>K;c+~@#'A'w+')N%))_#!)H+I+H+H+g@L@L@L@_#_#_#_#T#6#+#/@'@7 X#L+{@~)Z;{)])T>J,J'N,N,5,^)X;/)()_):)z;')Y+8'<)z;[)c=})')y>|)P'_>c+1)(@Z@a,z+9&@#F;Y&p%X=F;@#3;Y&@#1>p%p%X=@#@#Y&3;Y&@#X=X=p%Y&3;F;3;@#p%F;3;3;p%Y&3;F;@#F;Y&F;X=@#F;p%1>p%3;Y&Y&F;a,i@2)b+#% #3)g@C&4)q'U,g>U,8&[=J+T#K+:#5)C&d$6)(@Y#v+7)V'8)/=K+H+K@H+g@I+9)Y#/=0)O'a)_>(@@#5#p%Y&3;@#1>F;F;3;F;Y&3;3;F;p%X=p%@#F;p%p%X=1>1>@#@#p%@#5#3;1>3;3;@#Y&p%5#X=F;F;Y&3;@#Y&X=1>F;Y&p%1>p%5#X=@#1>X=X=Y&p%1>@#3;@#@#3;3;@#Y&F;p%5#p%3;p%@#@#", "2>9&G-9&@#2>2>F>2>z+2>2>G-z+G>G>G>G>F>F>@#9&Z>G-9&F>@#9&G>G>9&G>9&Z>@#F>9&@#F>9&@#F>G>Z>2>2>G>Z>Z>z+G-2>F>G>2>2>G-F>G>z+@#z+G-z+G>G>G-@#F>2>@#z+F>F>G>@#,)a,(>+-p'I@[;u,`@w+{@b);$M%_#J+H+H+H+g@g@L@L@_#_#_#_#:#:#Y#~@Z+8#8#c)d)C,c;.)0=0=X;7,0=0=N,0=e)f)g)I@d$t#2)u,h)L+L+h)y>x+C>[;I@c+_'i)Y>Z@a,2>G-G>G-F>Z>G-G>G>2>z+z+@#G-9&F>G>G-G>9&Z>z+G>G-2>2>F>9&G>2>Z>9&G-G>G>2>9&Z>G-F>2>z+2>z+9&@#G-F>Z>G-Z>Z>9&2>Z@j)u,q,d$U#.#*;K@[=|'#>k).,#>h>R#:#K+J+l=K Q']@b+u+~=L@e@d@f@~*K@l)s+C#<'m)%)~@i)Z@Z>@#z+z+@#9&9&G-G>2>G-9&@#F>F>2>G>Z>G-Z>G-Z>G-2>2>Z>9&9&G-z+G>z+G>z+Z>z+9&2>2>Z>G>G>Z>2>z+9&Z>G>z+9&Z>2>G>@#G-z+@#G-G>z+G-2>F>2>@#G-F>2>G-z+G-2>F>G-2>2>Z>z+", "H>a,H>Z@_;Z@B>Q'B>,)Z@_;Q'H>_;_;z+Q'Z@Z@Z@B>B>H>_;Z@B>Z@B>B>Z@Z@Z@Q'Z@Z@,)Z@z+a,Z@_;Q'Z@Z@Z@Z@B>Z@H>Z@,)Z@,),),)Z@H>B>H>_;,)H>H>Z@Z@B>B>Z@H>_;,)Z@a,Z@,)a,E>(@Z&n)i@:>~@t#v*o)T,]@7)p)+#g@J+g@H+g@g@L@L@_#_#_#_#_#_#g@:#Y#s#q)r)s)t)N,U>0=u)N,N,7,U>O,v)9,w)]@x)P-C>|)x+x+|):'L&L&t,:>c+y+t&Y>(>Y>Z@a,B>Q'H>Q'H>Z@H>B>B>Z@B>H>Z@Z@B>,)a,Z@Z@H>Z@Z@Z@z+H>Z@H>Z@B>H>Z@B>z+,)a,B>Z@Z@B>H>z+B>Z@_;B>H>,)Z@a,H>a,a,H>,)Z@(@y)z)o@k+u+.#s+I+C&h>h>U,g>g>A)h&I+<-,&B)J@:#C)D)H+g@#,g@7#3) ##%(#E)I@+-,)B>Z@H>H>,)Z@H>B>Z@Z@Z@Z@Z@B>Z@Z@B>a,B>Z@Z@Z@H>,)Q'H>H>H>H>,)B>,)_;H>Z@Z@,),)Q'Z@a,Z@Z@Z@Q'Z@,)Z@Z@a,B>B>Z@Z@Z@Q'Z@Z@,)B>H>B>Q'Z@z+Z@Z@_;Z@Z@Z@Z@Z@H>H>B>,)_;Z@Z@", "(>Y>Z@4-(>Y>4-E#(@J$(@(@E>E#(@(@Y>Y>(@E#E>(>4-E#Y>(@Y>(@(@E#J$E#J$Y>E#Y>(>Y>(@Y>(>Y>(@(@E>(@Z@(>(>(@E#(>(@4-(>Y>E#4-(@4-4-(@(@E#(@(>(@E#(@(>J$Y>(>(@(@Y>Z@E#Y>Z&Z&y+i@F)x+G)l+c=w+{@b+&>&,+#L@d@H+g@g@g@L@L@_#_#_#_#:#7#6#G+X+H)t)6,+)0=0=I)c;+)J)K)L)M)N)[>v+|)#'~@~@I@6*_>y>~@:>H;c+y+_'+-t&(>4-E#(@J$4-4-E#(@E>Z@E>Y>(@J$(>4-E#(@J$Y>J$J$Y>(>J$Z@E#(>Y>E#(@E#(>(@4-Z@E#E#(>J$E#E#(@(@J$(@Y>Y>(@(@Y>(@(@(@J$(@(@E#(@(>G;y)[;X+p)<'$>n;c%@&[=h>8&O)+,[=g@I+I+d@H+_#L@d@w'K+.#u+-)N%L+:>G;(>4-4-E#E#(@E#J$E#J$E#E>E#(>E#(@E#(>(>(@E>4-Y>Y>(@(@(@(>E>E#4-Y>4-E#J$(@(@(>E>J$(@Y>(@E>(@Y>(@(>(@E#(@(>Y>4-(@E#E>E>(@(>Y>E#(>E#(@(@(@(>(>E>(@(@E#E>4-(>4-Y>(>Y>E#(@E>", "i)n)Z&(@z'z'G;t&t&i)Z&Z&Z&+-n)Z&+-i)t&(@t&i)Z&Z&(@Z&Z&i)+-t&z'z'(@Z&Z&+-i)z'i)t&t&z't&z'i)i)z'+-(@Z&t&Z&G;z'Z&t&t&(@n)+-(@z'z'i)(@i)+-+-t&(@+-n)n)n)Z&+-z'Z&t&z'p'p'y+P)H;L&G)L+Y+X+T,]@W+b+Q)m=_#I+I+H+g@g@L@_#_#_#:#:#T#8#R)S)6,N,u)0=N,/)T)U)V)W)X)Y)s@G+P-L+x+^,I@Z)I@6*Z)6*I@c+c+`)`)y+(@t&Z&n)n)z'Z&Z&z'Z&Z&Z&z't&(@i)t&n)z't&Z&Z&Z&i)z'z'i)n)z'i)+-Z&i)Z&n)z'+-i)z't&G;+-z'+-Z&i)G;t&+-t&z'G;i)i)(@Z&G;t&n)z't&z'i)z'(@y+y'Y+(##% !.!D#I+h&[=Y=c,h>J+R'R'I+J+]>h@n&G+^@i&t#c++!z'Z&Z&z'Z&z't&z'(@Z&i)Z&i)z'Z&G;i)t&i)i)(@t&G;Z&+-t&+-i)n)(@+-(@i)n)z'i)(@i)t&G;t&z'z'Z&z'n)n)i)+-n)Z&Z&z'z'G;t&n)G;Z&+-n)Z&i)Z&t&t&i)i)z't&n)i)(@Z&t&t&Z&G;n)t&z't&Z&z't&", "1)+!p'Z&`)1)Z&_'Z&1)y++!Z&+!+!1)+!_'+!`)Z&1)K;p'Z&1)K;_'K;K;+!`)Z&Z&`)1)K;+!1)p'+!1)y+y+`)p'+!p'Z&Z&p'y+Z&y+p'K;K;y+K;p'Z&Z&Z&+!y+`)K;_'_'Z&p'+!p'p'+!Z&Z&Z&p'Z&Z&1)D>c+@!#!;;U'M;`@8'}&I;b+^@V'f%x'6#J+J+H+g@L@L@L@_#_#_#8#Y+e)N>$!%!&!K,*!=!-!;!>!{+i&p@Z+[)W'x+^,c+i@[>P)c+j)j)[>j)`)Z&1)p'Z&Z&`)`)+!p'p'+!Z&1)+!1)Z&+!K;`)_'y+Z&Z&Z&`)Z&K;Z&p'K;y+`)K;1)y+Z&1)y+p'_'1)K;p'`)1)p'`)Z&K;y+y+Z&p'Z&Z&Z&y+_'Z&+!Z&Z&Z&`)K;+!1)y+Z&y+#!l+')/*s#J@s+T#d@h&R#I+S#$@D#,!t+'!(#c=:'H;p'y++!+!Z&Z&`)+!Z&K;p'1)`)y+1)p'K;`)`)p'+!`)Z&Z&+!_'K;_'p'y+p'`)Z&Z&Z&Z&_'Z&1)p'K;Z&_'`)K;K;p'K;_'y+Z&y+_'`)1)y+`)_'y+`)+!1)K;_'_'K;p'Z&K;1)p'_'K;`)1)p'p'_'K;p'p'p'_'+!Z&y++!y+", "y)y+y+y)y)i@y+j)y+y+[>y)j)y+P)y+y+D>y+y+P)D>j)P)y+i@y)j)y+y+y+y+y)y+y+y)D>j)y)y+y)P)D>D>y)y+P)y+c+[>y)y+y+i@y+y+y)D>D>P)y)j)y)y+j)y+y+y)y+y+j)j)y+D>j)D>y)y+y)y)j)y)@!:>c+H;I@~@x+#'2)Y+x)j=I;b+W+W+9##%+#L@H+J+H+g@L@L@I+J@c+)!!!~!{!X)]!S.^!/!%'t+#%(!#'Z+W'x+~@c+c+H;Z)@!F)I@@!D>y+y+P)y+y+j)D>j)y)y+y)j)y+y+D>y+y)j)j)j)D>y+i@i@y+y+[>P)y+D>y+P)y)i@y+D>j)y+i@y+y+[>y)P)y+i@j)y+y+i@c+y+D>y+P)P)j)D>y)y+j)[>i@y+D>y+D>y+y+y+[>P)D>j)y't#c=b+d$t++#'&D#D#h@C#G+/@w+L+[;I@j)D>y+j)y+c+y+y+y+j)y+y+P)y+y)y+[>y+j)j)y+y+y+y)y+j)P)D>y+i@y+y+P)y)j)j)D>j)y+i@D>y+c+[>D>y)[>y+D>y+y+D>j)y+y+j)y+j)y+y+y+y+D>y+i@y+y+y+D>y+j)y)y)[>[>j)D>y)i@[>y+y+j)y+y+j)y+y+P)y+", "c+c+c+c+c+c+c+c+6*c+c+c+@!F)c+@!H;@!c+@!6*@!c+c+c+@!:>c+c+F)c+F)c+c+@!c+F)Z)@!c+F)H;c+c+c+c+c+c+c+c+c+H;H;F)@!c+I@c+@!c+c+F)c+c+F)H;c+Z)c+F)c+@!c+F)c+c+H;@!H;c+:>F)c+F)F)I@I@|)~@x+t#_!`@c=X+w+{@]@W+^@W+3>s#<-_#J+d@J+I+H+W+r+W#:!5 $%a) # #k+o@c=c=o)Y+^%h)x+I@I@I@:>@!@!c+:>c+H;c+c+c+c+H;F)c+H;H;H;@!c+c+F)c+@!c+c+c+c+6*F)I@c+c+c+@!H;c+c+c+H;F)c+c+H;c+@!F)F)c+c+c+c+F)@!:>c+c+F)c+:>@!c+F)c+c+@!c+@!c+H;@!6*:>c+H;H;c+H;c+H;c+:>c+c+I@x+Z+o@c=t#^,Z)c+c+:>c+c+6*c+@!:>c+c+c+c+c+c+F)H;H;H;c+F)F)c+c+c+c+:>c+c+c+c+c+c+:>H;c+c+c+@!c+@!c+c+H;c+c+c+c+F)@!H;F)F)c+c+H;c+Z)@!F)c+c+c+c+c+c+F)c+c+c+I@c+c+@!c+H;c+c+c+c+@!c+c+c+c+c+F)H;F)H;Z)c+", "I@I@I@I@I@I@y'y'I@I@y'I@I@y'I@y'#!I@I@I@I@#!I@I@I@I@I@I@I@I@I@I@I@I@I@I@y'I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@#!I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@_>I@I@I@[;~@~@x+x+h)L+Z+Y+c=X+w+{@]@W+^@^@^@^@#%t+h@T#I+J+7#J@ # ##%:;w+w+(!w+w+c=Y+L+L+x+~@~@~@I@I@I@I@#!I@I@I@I@I@I@I@#!y'I@I@I@I@I@I@I@I@I@I@I@I@#!I@I@I@I@I@I@I@I@I@#!I@I@I@I@I@I@I@I@y>#!I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@y>I@I@I@I@I@y'I@#!I@I@I@I@I@I@I@I@I@I@I@I@I@I@~@t#Y+c=c=L+x+~@#!I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@#!I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@y'I@y>I@I@y'I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@y>I@I@y>I@y'I@I@I@I@I@I@I@#!", "~@~@;;~@~@~@~@[;~@~@~@[!~@~@;;~@~@;;|)~@~@~@~@~@~@[;|)~@~@~@~@~@~@~@~@~@[;~@~@~@;;~@_>~@;;~@~@~@^,~@~@~@_>~@~@~@~@~@~@~@~@[;|)~@~@~@~@~@~@~@~@~@~@|)|)~@~@~@~@~@~@~@~@~@L&[;~@~@x+x+x+x+t#t#L+E)v*c=(!w+o@]@b+W+^@^@^@:;:;^@l+t#t#x+x+~@~@~@;;~@~@~@;;~@~@~@;;|)~@~@~@~@~@~@~@;;L&|)~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@|)~@[;[;~@~@;;~@~@~@~@~@~@~@~@~@~@~@t,~@~@~@~@~@|)~@t,~@~@|)~@~@[;~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@[;~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@[;|);;~@~@~@~@|)~@~@~@~@[;|);;~@[;|);;[;~@~@~@|)~@|);;~@[;|)~@~@[;~@~@~@~@|)~@~@~@~@~@~@~@|)~@~@|)~@~@~@~@~@~@~@|)L&~@~@|)~@[;~@_>~@~@~@~@~@~@~@~@~@|)~@~@|)~@[;~@[;[;~@[;~@~@", ":'P'x+x+x+L&x+}!x+x+P'x+x+P'C>:'x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+P'x+L&x+|!L&x+1!x+x+x+x+x+x+L&P'x+x+x+x+L&x+x+x+x+x+x+x+x+L&x+x+x+x+x+x+x+x+x+x+x+L&x+x+x+z)x+x+x+x+:'L&x+x+x+x+x+}!x+t#U't#t#L+L+],Z+c=c=X+w+o@2!]@]@b+(#b+]@]@{@{@'){@0'y$X+X+c=<>v*[)L+L+t#t#t#x+x+x+x+x+x+x+x+:'P'x+:'x+C>x+x+x+x+x+x+x+x+x+x+P'x+x+:'L&x+x+x+x+x+x+P-x+L&x+x+:'x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+3!;;x+x+x+x+x+x+x+x+:'}!x+x+x+x+C>x+x+x+}!x+x+:'x+x+x+x+x+x+x+:'x+x+P-P'P'L&L&x+x+x+x+x+x+x+P'P':'x+x+x+x+P'x+x+x+x+x+x+:'x+x+P'4!x+:':'x+P-L&x+x+L&x+x+x+x+:'x+x+x+3!x+x+}!x+x+L&x+L&x+x+L&L&L&x+x+:'x+x+x+L&x+:'x+x+x+x+x+x+x+x+C>x+C>x+:'x+}!x+P'x+:'x+x+x+C>x+x+x+x+x+x+x+P-", "t#t#U't#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#G)t#t#z)z)t#t#t#t#t#t#U'G)t#t#t#t#t#t#t#t#t#U't#t#t#z)t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#z)t#t#G)t#t#t#z)t#t#t#t#U't#t#t#t#t#t#L+L+L+Z+Z+Y+Y+c=8'X+w+o@o@{@N%{@{@{@o@o@o@w+w+X+c=c=Y+Y+Z+],L+L+L+L+t#t#t#t#t#t#t#t#t#t#t#t#t#U't#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#U't#z)t#t#U't#t#t#t#t#t#t#t#z)t#t#t#t#t#U't#t#t#t#t#z)t#t#t#t#t#z)t#t#t#z)t#t#t#z)t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#U't#t#z)t#t#t#t#G)t#t#t#t#z)t#t#t#t#t#G)t#t#t#t#t#t#t#t#z)t#t#t#t#t#t#t#z)t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#C>t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#G)t#t#t#t#t#t#t#t#U'z)t#t#t#t#", "h)L+L+#'W'L+#'L+L+M;L+L+L+L+u,H=#'#'L+L+L+L+u,#'#'L+L+u,L+L+L+L+u,L+L+H=u,L+L+L+L+L+H=H=L+L+h)H=L+L+L+#'u,#'u,L+L+h)M;L+L+L+L+L+L+H=L+H=L+L+h)L+L+#'u,#'u,#'L+u,#'#'L+#'#'L+L+#'L+L+L+L+L+L+u,Z+2)[)],`@Y+`@$'A'X+9'w+w+w+y$i&w+w+X+a)A'c=Y+`@<>],],Z+Z+[)H=L+#'L+L+L+L+L+L+L+L+L+M;L+L+u,H=L+L+L+#'L+H=H=L+L+#'L+L+L+L+L+L+L+L+L+L+u,L+L+L+L+L+W'L+u,L+#'L+L+#'H=L+L+H=L+L+L+L+L+L+u,L+L+L+#'#'H=L+L+H=#'L+H=L+u,L+L+u,L+u,L+L+u,h)L+L+L+h)L+L+L+#'L+#'L+L+#'W'L+L+L+L+H=L+L+L+L+h)L+L+#'L+u,L+#'L+H=L+#'L+#'L+#'L+L+L+u,L+u,L+h)L+L+L+L+L+#'L+L+H=W'H=L+u,L+u,L+H=u,L+L+L+W'h)L+L+L+L+L+H=L+W'L+L+L+L+L+u,L+L+L+u,L+L+L+L+L+u,H=L+L+#'L+u,L+u,h)u,L+L+H=H=L+L+", "l+_!_!Z+[)],2)l+L+Z+_!Z+_!Z+_!L+Z+2)],],L+Z+L+[)],],2)_!],L+_!^%2)],^%Z+],2)[)[)Z+2)],_!_!_!Z+Z+_!_!L+],^%l+^%_!_!Z+],Z+L+_!l+^%^%_![)Z+Z+2)2)],2)l+_!l+],2)_!L+],l+L+^%^%L+2)^%_!_!Z+],^%^%2)^%],[)<)E)<><)c=$'z;%)9'5!5!5!R)R)R)c=X'X'Y+/,Y+`@Z+v*],Z+],Z+Z+2)^%Z+2)L+^%Z+2)],_!l+[)l+],[)],],Z+],Z+^%],Z+2)[)l+Z+Z+l+_!l+L+_!L+],[)_!Z+Z+l+Z+Z+l+2)[)2)^%_!L+_!l+2)Z+l+2)L+[)],Z+2)_!l+^%l+[)[)[)^%[)^%L+[)l+Z+],],^%2)Z+],l+[)[)Z+Z+L+L+^%2)2)Z+2)],],l+],L+^%L+2)],2)^%Z+l+[)2)Z+Z+[)2)L+],L+Z+^%L+Z+l+l+L+[)[)],Z+L+],^%^%],L+],[)L+],],L+^%_![)Z+2)],],^%^%Z+_!],L+[)],],],l+2)],^%],2)l+],[)^%],],_!^%],],^%Z+Z+[)2)Z+2)l+l+_!^%2)Z+],Z+Z+Z+[)Z+],_!],Z+", "<)/,<)Z+Z+E)Y+Z+Z+Z+Z+E)E)Z+<)Z+/,Z+v*Z+Z+Z+<)/,Z+Z+E)E)E)E)<)<)Z+Z+Z+/,Z+Z+Z+Z+<)<><)<)<>E)/,Z+Z+Z+E)Z+Z+<)E)<)E)Z+<>Z+Z+Z+Z+`@Z+E)<)<)Z+/,Z+<>/,<)Z+<)Z+/,Z+Z+/,Z+<)Z+E)Z+Z+Z+Z+E)E)/,Z+Z+Z+Z+E)`@Z+<)Z+X'Y+A'$'Y+%)Y+%)Y+8'X'Y+Y+A'%)%)8'/,<><)Z+Z+/,Z+Y+<>Z+Z+E)Z+Z+<)<)Z+Z+E)Z+E)Z+Z+v*Z+v*Z+/,Z+<)Z+Z+<)<)E)E)/,E)E)Z+<)/,Z+/,Z+Z+/,/,/,Z+Z+<)/,E)<)E)Z+/,Z+Z+Z+Z+Z+<)v*v*<)E)/,<>Z+<)E)Z+Z+Z+Z+Z+Z+Z+<)<)Z+/,/,Z+<)Z+Z+Z+`@/,/,/,<)Z+/,<>v*/,Z+Z+Z+`@E)E)Z+Z+Z+/,Z+Z+<>Z+Z+Z+`@Z+Z+/,Z+Z+<)<)<)Z+E)Z+Z+Z+/,E)Z+E)<)Z+Z+Z+Z+Z+Z+Z+Z+`@E)Z+Z+E)v*E)Z+<)/,Z+Z+Z+E)<)`@Y+Z+/,Z+E)/,Z+<>v*/,<>/,Z+<)E)/,Z+Z+<>Z+Z+Z+Z+<)Z+Z+<)Z+<)E)Z+v*Z+Z+Z+<)Z+Z+Z+Z+Z+Z+Z+", "Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+$'Y+Y+Y+$'Y+Y+X'Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+%)Y+Y+Y+Y+$'Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+%)Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+X'Y+Y+Y+$'Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+$'Y+Y+%)Y+Y+Y+Y+Y+Y+$'Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+$'Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+X'Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+%)X'Y+%)Y+Y+%)Y+Y+Y+Y+Y+Y+Y+$'Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+", "c=c=c=c=c=c=%)c=c=c=c=c=c=c=c=c=z;c=c=c=8'z;c=c=c=c=A'X'c=c=c=c=c=c=8'c=c=8'c=c=c=c=Y+c=c=A'z;c=c=c=c=A'c=c=8'8'c=c=c=c=c=c=c=c=c=c=8'c=c=c=$'c=c=c=c=A'c=c=c=8'c=c=c=8'c=z;z;c=c=z;c=c=c=A'c=A'c=c=c=c=c=$'8'c=c=A'8'c=c=c=c=8'%)c=c=c=z;c=A'c=c=z;z;c=c=c=z;c=c=c=c=c=c=A'8'c=8'c=c=c=c=c=8'c=c=c=c=c=c=A'A'c=A'c=z;A'c=c=c=c=c=c=c=c=c=c=A'c=c=c=A'8'8'c=c=c=c=A'c=c=c=c=z;8'c=z;z;z;c=A'c=c=c=c=c=c=c=c=c=c=8'c=A'c=c=z;c=A'c=c=z;8'c=c=c=c=c=c=6!c=c=c=c=c=X'c=A'c=c=c=c=c=c=c=c=A'c=c=c=c=c=z;c=c=z;c=c=A'c=c=c=z;c=z;$'c=c=c=c=c=c=z;8'8'c=c=8'c=c=c=c=A'8'c=c=c=c=8'c=c=c=c=z;c=c=A'A'c=c=A'$'c=c=8'c=c=z;z;%)c=c=c=c=c=c=c=c=c=8'c=c=c=8'c=c=c=c=c=z;c=", "x)5!9'x)5!9'9'5!c=X+5!9'9'R)5!a)9'a)o)x)9'9'X+5!X+X+x)X+5!R)5!X+5!5!a)a)9'x)o)9'5!9'5!5!c=a)x)X+x)o)a)a)9'X+a)X+5!9'5!o)9'X+9'R)X+X+9'x)X+X+a)x)X+X+a)X+x)9'a)x)x)5!a)a)X+X+5!5!X+9'R)c=X+X+X+5!o)o)5!9'R)a)c=o)X+X+X+5!5!X+o)X+9'9'X+x)a)a)5!9'9'X+9'5!a)o)X+9'5!X+c=x)X+5!X+a)X+5!5!a)X+9'X+R)a)a)X+5!a)9'X+X+a)a)9'a)o)9'9'5!a)5!5!5!a)a)a)c=9'o)X+X+a)9'x)9'5!X+o)5!o)9'5!X+9'X+5!5!x)X+9'R)X+5!a)X+a)5!X+R)X+c=X+9'9'X+5!5!X+5!X+9'9'X+o)5!9'9'5!9'9'5!5!R)X+X+a)X+x)9'R)X+o)o)X+X+5!o)a)x)X+a)a)x)9'X+X+X+x)9'a)X+X+R)a)5!a)X+R)o)R)5!X+a)9'5!X+9'9'o)c=X+R)o)x)5!5!X+a)X+x)a)R)X+X+a)X+9'o)a)a)R)X+x)X+9'9'R)X+5!X+x)a)X+X+o)X+x)a)X+o)9'9'9'R)c=c=X+5!X+", "x)5!9'x)5!9'9'5!c=X+5!9'9'R)5!a)9'a)o)x)9'9'X+5!X+X+x)X+5!R)5!X+5!5!a)a)9'x)o)9'5!9'5!5!c=a)x)X+x)o)a)a)9'X+a)X+5!9'5!o)9'X+9'R)X+X+9'x)X+X+a)x)X+X+a)X+x)9'a)x)x)5!a)a)X+X+5!5!X+9'R)c=X+X+X+5!o)o)5!9'R)a)c=o)X+X+X+5!5!X+o)X+9'9'X+x)a)a)5!9'9'X+9'5!a)o)X+9'5!X+c=x)X+5!X+a)X+5!5!a)X+9'X+R)a)a)X+5!a)9'X+X+a)a)9'a)o)9'9'5!a)5!5!5!a)a)a)c=9'o)X+X+a)9'x)9'5!X+o)5!o)9'5!X+9'X+5!5!x)X+9'R)X+5!a)X+a)5!X+R)X+c=X+9'9'X+5!5!X+5!X+9'9'X+o)5!9'9'5!9'9'5!5!R)X+X+a)X+x)9'R)X+o)o)X+X+5!o)a)x)X+a)a)x)9'X+X+X+x)9'a)X+X+R)a)5!a)X+R)o)R)5!X+a)9'5!X+9'9'o)c=X+R)o)x)5!5!X+a)X+x)a)R)X+X+a)X+9'o)a)a)R)X+x)X+9'9'R)X+5!X+x)a)X+X+o)X+x)a)X+o)9'9'9'R)c=c=X+5!X+"}; nvidia-settings/src/xpm_data/svp_battery_100.h0000664000175000017500000000066012236467170021523 0ustar albertoalberto/* XPM */ static const char * svp_battery_100_xpm[] = { "16 16 3 1", " c None", ". c #73BA00", "+ c #424542", " .... ", " .......... ", " .++++++++. ", " .+......+. ", " .+......+. ", " .++++++++. ", " .+......+. ", " .+......+. ", " .++++++++. ", " .+......+. ", " .+......+. ", " .++++++++. ", " .+......+. ", " .+......+. ", " .++++++++. ", " .......... "}; nvidia-settings/src/xpm_data/svp_status_excellent.h0000664000175000017500000000142712236467170023061 0ustar albertoalberto/* XPM */ static const char * svp_status_excellent_xpm[] = { "24 16 18 1", " c None", ". c #73BA00", "+ c #73B600", "@ c #73B200", "# c #73AE00", "$ c #6BAE00", "% c #6BAA00", "& c #6BA600", "* c #6BA200", "= c #6BB200", "- c #63A200", "; c #639E00", "> c #639A00", ", c #639600", "' c #5A9600", ") c #5A9200", "! c #5A8E00", "~ c #5A8A00", " ..++", " .++@", " ++@#", " ...+ @@$$", " ..++ @$%%", " ++@@ %%&*", " ...+ +@=$ %&-;", " ..++ @$$% --;>", " .++@ $%%& ;;>,", " .... +@@$ %&&- >>')", " ...+ @@$% &-;; ,))!", " .++@ $%%& -;>, ))!!", ".... ++@= %&&- ;>,' !!!~", "...+ @@$$ &--; ,')) !~~~", ".+++ @$%% -;;> ')!! ~~~~", "++@@ %%&* ;>,' )!!~ ~~~~"}; nvidia-settings/src/xpm_data/svp_status_verylow.h0000664000175000017500000000112112236467170022574 0ustar albertoalberto/* XPM */ static const char * svp_status_verylow_xpm[] = { "24 16 5 1", " c None", ". c #CECFCE", "+ c #73BA00", "@ c #73B600", "# c #73B200", " ....", " ....", " ....", " .... ....", " .... ....", " .... ....", " .... .... ....", " .... .... ....", " .... .... ....", " .... .... .... ....", " .... .... .... ....", " .... .... .... ....", "++++ .... .... .... ....", "+++@ .... .... .... ....", "+@@@ .... .... .... ....", "@@## .... .... .... ...."}; nvidia-settings/src/xpm_data/svp_battery_25.h0000664000175000017500000000067612236467170021460 0ustar albertoalberto/* XPM */ static const char * svp_battery_25_xpm[] = { "16 16 4 1", " c None", ". c #73BA00", "+ c #424542", "@ c #636163", " .... ", " .......... ", " .++++++++. ", " .+@@@@@@+. ", " .+@@@@@@+. ", " .++++++++. ", " .+@@@@@@+. ", " .+@@@@@@+. ", " .++++++++. ", " .+@@@@@@+. ", " .+@@@@@@+. ", " .++++++++. ", " .+......+. ", " .+......+. ", " .++++++++. ", " .......... "}; nvidia-settings/src/xpm_data/svp_autopick_next_channel.h0000664000175000017500000003607712236467170024051 0ustar albertoalberto/* XPM */ static const char * svp_autopick_next_channel_xpm[] = { "64 64 431 2", " c None", ". c #83E906", "+ c #84E906", "@ c #85E906", "# c #86E906", "$ c #82E906", "% c #111111", "& c #1B1B1B", "* c #82E806", "= c #1A1A1A", "- c #272727", "; c #333333", "> c #383838", ", c #373737", "' c #2F2F2F", ") c #252525", "! c #7FE206", "~ c #262626", "{ c #343434", "] c #3B3B3B", "^ c #3C3C3C", "/ c #303030", "( c #292929", "_ c #222222", ": c #1C1C1C", "< c #6BBE07", "[ c #70C905", "} c #81E606", "| c #242424", "1 c #2A2A2A", "2 c #374922", "3 c #62A411", "4 c #2E3D1B", "5 c #181818", "6 c #7FE306", "7 c #313131", "8 c #50791E", "9 c #5A9215", "0 c #212121", "a c #354721", "b c #62A60F", "c c #3A5E0F", "d c #61A50E", "e c #4E761E", "f c #2C2C2C", "g c #232323", "h c #4C7816", "i c #558914", "j c #81E506", "k c #84E706", "l c #82E706", "m c #79D606", "n c #282828", "o c #5E9D12", "p c #416019", "q c #466C17", "r c #60A20E", "s c #80E406", "t c #7FDE06", "u c #1F1F1F", "v c #6BB40E", "w c #2F3C1E", "x c #202020", "y c #5F9F10", "z c #3D5A1A", "A c #83E406", "B c #73C509", "C c #272925", "D c #6FBC0C", "E c #22271D", "F c #161616", "G c #79D406", "H c #263911", "I c #3A5817", "J c #121212", "K c #3D3D3D", "L c #587930", "M c #7BDA06", "N c #090909", "O c #83E806", "P c #75CF05", "Q c #0D0D0D", "R c #406713", "S c #568E10", "T c #4B6827", "U c #5A5E55", "V c #688545", "W c #6DA627", "X c #558A14", "Y c #69BD05", "Z c #6BBD05", "` c #020202", " . c #3D3D3E", ".. c #6E9440", "+. c #7ABA29", "@. c #7BC814", "#. c #67A712", "$. c #507622", "%. c #393939", "&. c #131313", "*. c #74CF05", "=. c #315605", "-. c #6F6F72", ";. c #737372", ">. c #5B5B4E", ",. c #4E4D31", "'. c #504F2C", "). c #38371F", "!. c #2E2E2E", "~. c #050505", "{. c #80E306", "]. c #538813", "^. c #8EC54B", "/. c #969694", "(. c #64644E", "_. c #605F34", ":. c #5C5B34", "<. c #545333", "[. c #49482C", "}. c #2F2E1D", "|. c #3B3B3C", "1. c #070707", "2. c #151515", "3. c #7ADB06", "4. c #6FC805", "5. c #99999A", "6. c #96C559", "7. c #76B11C", "8. c #718929", "9. c #6E6D39", "0. c #605F31", "a. c #494829", "b. c #3C3B22", "c. c #303023", "d. c #2F2F30", "e. c #191919", "f. c #171717", "g. c #50702A", "h. c #79B929", "i. c #536A38", "j. c #404040", "k. c #AEAEAE", "l. c #9F9FA0", "m. c #5B5A38", "n. c #78A620", "o. c #7BBD16", "p. c #72AD16", "q. c #63891A", "r. c #596922", "s. c #36361A", "t. c #43512F", "u. c #4E840F", "v. c #7DDF06", "w. c #80E206", "x. c #1D1D1D", "y. c #6C6C6E", "z. c #A0A0A3", "A. c #A7A7A6", "B. c #79A346", "C. c #699F26", "D. c #656765", "E. c #949495", "F. c #54544A", "G. c #686732", "H. c #646333", "I. c #5F7423", "J. c #6A9D16", "K. c #74B910", "L. c #75C00C", "M. c #79C812", "N. c #74C311", "O. c #7BDB06", "P. c #101010", "Q. c #515152", "R. c #98989B", "S. c #AFAFB0", "T. c #93938A", "U. c #6F6E54", "V. c #5F5E33", "W. c #454424", "X. c #528413", "Y. c #5B8A23", "Z. c #2C2E2E", "`. c #403F32", " + c #5D5C2D", ".+ c #525127", "++ c #535227", "@+ c #4D4C22", "#+ c #414024", "$+ c #5A5A52", "%+ c #4D4D4E", "&+ c #0C0C0C", "*+ c #808081", "=+ c #B8B8BB", "-+ c #ABABA9", ";+ c #7D7C69", ">+ c #626139", ",+ c #666530", "'+ c #727138", ")+ c #6A693D", "!+ c #545331", "~+ c #3B402E", "{+ c #558F10", "]+ c #4D840A", "^+ c #3D5022", "/+ c #51502A", "(+ c #515025", "_+ c #43421F", ":+ c #4E4D3D", "<+ c #646362", "[+ c #343436", "}+ c #1E1E1E", "|+ c #2D2D2D", "1+ c #363636", "2+ c #414141", "3+ c #777777", "4+ c #BBBBBD", "5+ c #A8A8A6", "6+ c #6B6B53", "7+ c #605F2F", "8+ c #6E6D34", "9+ c #78773E", "0+ c #77763F", "a+ c #69683A", "b+ c #504F31", "c+ c #3C3B26", "d+ c #42700B", "e+ c #5D9813", "f+ c #64941A", "g+ c #4C5B21", "h+ c #606059", "i+ c #5C5C5E", "j+ c #505050", "k+ c #636363", "l+ c #56552A", "m+ c #686731", "n+ c #706F39", "o+ c #6F6E3A", "p+ c #696836", "q+ c #5F5E30", "r+ c #3A391F", "s+ c #3A3A31", "t+ c #161617", "u+ c #314816", "v+ c #61951F", "w+ c #75B722", "x+ c #68AB15", "y+ c #62AF05", "z+ c #0A0A0A", "A+ c #484848", "B+ c #7C7C7C", "C+ c #575758", "D+ c #504F29", "E+ c #62612F", "F+ c #626131", "G+ c #5F5E2F", "H+ c #58572B", "I+ c #545329", "J+ c #424124", "K+ c #3A3926", "L+ c #171718", "M+ c #85E806", "N+ c #0F0F0F", "O+ c #3A3A3A", "P+ c #3E3E35", "Q+ c #57562A", "R+ c #555429", "S+ c #545328", "T+ c #555428", "U+ c #525126", "V+ c #3A391D", "W+ c #3C3C36", "X+ c #0E0E0E", "Y+ c #2A2A2C", "Z+ c #444334", "`+ c #545327", " @ c #565629", ".@ c #535226", "+@ c #4D4C20", "@@ c #4B4A22", "#@ c #535232", "$@ c #535247", "%@ c #262627", "&@ c #0B0B0B", "*@ c #141414", "=@ c #2B2B2D", "-@ c #474633", ";@ c #504F21", ">@ c #4A4920", ",@ c #4A4924", "'@ c #59583C", ")@ c #6F6E5C", "!@ c #7D7C74", "~@ c #777775", "{@ c #080808", "]@ c #252526", "^@ c #464640", "/@ c #575641", "(@ c #6D6C5E", "_@ c #777771", ":@ c #737373", "<@ c #515153", "[@ c #232324", "}@ c #333335", "|@ c #2D2D2F", "1@ c #0F0E0F", "2@ c #151415", "3@ c #101110", "4@ c #121213", "5@ c #181819", "6@ c #2A2A2B", "7@ c #1F2020", "8@ c #1A1A1B", "9@ c #3E3E3F", "0@ c #202120", "a@ c #222122", "b@ c #323232", "c@ c #1C1B1B", "d@ c #212221", "e@ c #3E3E3E", "f@ c #252424", "g@ c #2B2B2B", "h@ c #353635", "i@ c #1F1F1E", "j@ c #353434", "k@ c #353535", "l@ c #333433", "m@ c #333434", "n@ c #212122", "o@ c #474747", "p@ c #2E2D2D", "q@ c #323332", "r@ c #303031", "s@ c #1A1B19", "t@ c #1C1D1C", "u@ c #1B1A1B", "v@ c #424242", "w@ c #242423", "x@ c #1F1E1E", "y@ c #4B4A4A", "z@ c #454545", "A@ c #252625", "B@ c #302F31", "C@ c #363536", "D@ c #3B3A3B", "E@ c #131212", "F@ c #4C4B4B", "G@ c #272627", "H@ c #262625", "I@ c #454845", "J@ c #454846", "K@ c #444544", "L@ c #2F2E2F", "M@ c #1D1E1D", "N@ c #242525", "O@ c #4E4E4E", "P@ c #4B4B4B", "Q@ c #262526", "R@ c #252524", "S@ c #2A292A", "T@ c #383938", "U@ c #3D4539", "V@ c #40572F", "W@ c #344F1F", "X@ c #252E21", "Y@ c #3D3E3D", "Z@ c #2E2F2D", "`@ c #242227", " # c #282728", ".# c #4F4F4F", "+# c #303431", "@# c #2E4B1C", "## c #6DB20D", "$# c #7FC90A", "%# c #2A411E", "&# c #2A2E29", "*# c #3E3D3E", "=# c #232223", "-# c #515151", ";# c #525252", "># c #313132", ",# c #303730", "'# c #4A8413", ")# c #81DF0C", "!# c #88DF08", "~# c #3E6417", "{# c #1C1E20", "]# c #3A3B3A", "^# c #444444", "/# c #232322", "(# c #0F0F11", "_# c #151616", ":# c #545454", "<# c #363A35", "[# c #2F4E18", "}# c #519213", "|# c #528917", "1# c #374B27", "2# c #383937", "3# c #313130", "4# c #0F0F0E", "5# c #1F201F", "6# c #555555", "7# c #2E2D2E", "8# c #333533", "9# c #232722", "0# c #2F3A2E", "a# c #374437", "b# c #363D35", "c# c #2D2C2C", "d# c #1F1F20", "e# c #0C0B0C", "f# c #555556", "g# c #201F20", "h# c #232222", "i# c #393839", "j# c #363535", "k# c #333432", "l# c #282827", "m# c #1D1D1E", "n# c #1D1E1E", "o# c #1A1A19", "p# c #535354", "q# c #5A5A5B", "r# c #323333", "s# c #2E2E2D", "t# c #141415", "u# c #111212", "v# c #1C1C1B", "w# c #4C4C4D", "x# c #5B5B5C", " ", " ", " . + @ # @ + . ", " $ + . . + $ ", " . . ", " . . ", " ", " % & * . @ # @ . . ", " = - ; > , ' ) & ! . $ $ . . ", " ~ { ] ^ > / ( _ : < [ } . $ ", " | / { / 1 2 3 4 5 6 . + ", " ) 7 8 9 _ 0 - a b c . . ", " d e f g g h i ~ ) & j k l $ . ", " m : n | o p _ 0 g q r s . + ", " t u v w _ 0 x y z ( : j @ @ ", " A B C _ 0 x D E : | - k # # ", " F k G H g _ u y I 5 J K L M @ @ ", " N J O P Q x u R S T U V W X . + ", " J * Y Z ` : ...+.@.#.$.%. $ . ", " &.&. } *.=., -.;.>.,.'.)., !. . . ", " ~.&.F {. ].^./.(._.:.<.[.}.|.5 * + ", " 1.&.5 2. 3.4. g 5.6.7.8.9.0.a.b.c.d. } $ ", " 1.J F e.f.% g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w. . ", " J F f.= x.: F - y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O. . ", " P.f.f.5 = x.0 _ x = Q.R.S.T.U.V.W.X.Y.Z.`. +.+++@+#+$+%+ ", " &+f.5 e.e.= & u | - ( n | x. { *+=+-+;+>+,+'+)+!+~+{+]+^+/+(+_+:+<+[+ . ", " N F e.e.e.= & : }+0 | ( |+' { 1+2+3+4+5+6+7+8+9+0+a+b+c+/ d+e+f+g+h+i+ . ", " J e.= = & & : x.u g ~ ( 7 j+k+i+F.l+m+n+o+p+q+a.r+s+t+ u+v+w+x+y+ . + $ ", " z+F = = & : : : }+0 - A+B+C+%.D+E+F+G+H+I+.+J+K+/ L+ O.w.k M+M+O . ", " N+5 & & : : : x.x.!.O+d.P+l+Q+R+I+S+T+U+V+W+ ", " X+f.& : : x.x.& & Y+Z+`+S+ @.@+@@@#@$@%@ ", " &@*@= : : x.: =@-@;@>@,@'@)@!@~@ . ", " {@P.F = = ]@^@/@(@_@:@<@[@ ", " &@X+x.}@|@ ", " ", " ", " ", " ", " ", " X+F *@ ", " 1@2@5 5 = 5 &. ", " 3@F 5 5 5 5 e.= & = f. ", " N+&.f.e.5 f.5 5 5 e.= = & : : f.f. ", " 4@5@L+f.f.f.f.5 5 5 e.= = = = & x ( 6@ ", " N+_ 7@8@L+f.f.f.5 5 5 e.e.= = u - 7 %.9@- ", " 0@a@0 x x.= e.5 5 5 f.f.& 0 ( b@, O+%.%.O+c@ ", " : | d@x u x.x.: & e.5 : | n ; %.%.> > > , %.{ ", " *@| _ _ x u x.x.: & = F 2+e@f@g@/ { , , , 1+h@, 1 ", " X+g _ g g x i@}+: & & e.f.A+2+g - ~ ( j@1+k@{ l@; m@n@ ", " {@x | g g g x u }+: & & e.f.o@2+g - - - p@k@{ ; q@7 7 r@s@ ", " : f@g g | _ x u }+t@& u@e.f.A+v@g - - - n ; { / ' ' ' ' f ", " f.) w@) ) | _ x x x@t@& = e.f.y@z@g - ~ ~ A@|+B@C@D@/ !.!.!.A@ ", " E@~ | ) ) ) | _ 0 x u : : = e.f.F@A+_ G@H@| g / I@J@K@D@f f f L@M@ ", " % ~ ) N@) ) ) | _ 0 x u x.: & e.F O@P@0 Q@R@S@T@U@V@W@X@Y@k@1 g@1 Z@`@ ", " *@) #n ~ ~ ~ ) _ 0 0 }+x.: & = F .#O@0 Q@g ; +#@###$#%#&#*#!.f 1+K f ", " Q F =#( ( ~ | g _ 0 }+x.: : = f.-#;#0 ~ [@>#,#'#)#!#~#{#]#^#%.b@/#(# ", " 1.N Q *@x ~ ) g 0 x }+}+x.: = _#-#:#0 ) g 7 <#[#}#|#1#2# .3#0 F 4# ", " {@z+&@J & 0 _ 5#x.: x.x.& F -#6#0 ) _ 7#8#9#0#a#b#c#d#F N+ ", " 1.&@e#N+F x.}+}+& : = 2.;#f#g#h#0 p@i#j#k#l#m#2@Q ", " {@&@&@X+&.e.n#m#o#&.p#q#u ( ' r#s#| u@t#e# ", " z+&@Q u#_#v#f.w#x#' ' l#u f.J ", " {@&+Q X+&.~ ' | c@*@4# ", " z+X+&.5 &. ", " "}; nvidia-settings/src/xpm_data/svp_status_verygood.h0000664000175000017500000000142612236467170022733 0ustar albertoalberto/* XPM */ static const char * svp_status_verygood_xpm[] = { "24 16 18 1", " c None", ". c #CECFCE", "+ c #73BA00", "@ c #73B600", "# c #73B200", "$ c #6BB200", "% c #6BAE00", "& c #6BAA00", "* c #6BA600", "= c #63A200", "- c #639E00", "; c #639A00", "> c #639600", ", c #5A9600", "' c #5A9200", ") c #5A8E00", "! c #6BA200", "~ c #5A8A00", " ....", " ....", " ....", " +++@ ....", " ++@@ ....", " @@## ....", " +++@ @#$% ....", " ++@@ #%%& ....", " +@@# %&&* ....", " ++++ @##% &**= ....", " +++@ ##%& *=-- ....", " +@@# %&&* =-;> ....", "++++ @@#$ &**= -;>, ....", "+++@ ##%% *==- >,'' ....", "+@@@ #%&& =--; ,')) ....", "@@## &&*! -;>, '))~ ...."}; nvidia-settings/src/xpm_data/svp_status_good.h0000664000175000017500000000134512236467170022025 0ustar albertoalberto/* XPM */ static const char * svp_status_good_xpm[] = { "24 16 15 1", " c None", ". c #CECFCE", "+ c #73BA00", "@ c #73B600", "# c #73B200", "$ c #6BAE00", "% c #6BAA00", "& c #6BA600", "* c #6BB200", "= c #63A200", "- c #639E00", "; c #639A00", "> c #6BA200", ", c #639600", "' c #5A9600", " ....", " ....", " ....", " .... ....", " .... ....", " .... ....", " +++@ .... ....", " ++@@ .... ....", " +@@# .... ....", " ++++ @##$ .... ....", " +++@ ##$% .... ....", " +@@# $%%& .... ....", "++++ @@#* %&&= .... ....", "+++@ ##$$ &==- .... ....", "+@@@ #$%% =--; .... ....", "@@## %%&> -;,' .... ...."}; nvidia-settings/src/xpm_data/svp_battery_0.h0000664000175000017500000000067512236467170021370 0ustar albertoalberto/* XPM */ static const char * svp_battery_0_xpm[] = { "16 16 4 1", " c None", ". c #73BA00", "+ c #424542", "@ c #636163", " .... ", " .......... ", " .++++++++. ", " .+@@@@@@+. ", " .+@@@@@@+. ", " .++++++++. ", " .+@@@@@@+. ", " .+@@@@@@+. ", " .++++++++. ", " .+@@@@@@+. ", " .+@@@@@@+. ", " .++++++++. ", " .+@@@@@@+. ", " .+@@@@@@+. ", " .++++++++. ", " .......... "}; nvidia-settings/src/xpm_data/red_xpm.h0000664000175000017500000000067312236467170020243 0ustar albertoalberto/* XPM */ static const char * red_xpm[] = { "16 16 5 1", " c black", ". c #800000", "X c red", "o c white", "O c None", "OOOOOOOOOOOOOOOO", "OOOOOOO.OOOOOOOO", "OOOOOO.X OOOOOOO", "OOOOO.oXX OOOOOO", "OOOO.ooXXX OOOOO", "OOO.oooXXXX OOOO", "OO.ooooXXXXX OOO", "O.XXXXX...... OO", "OO.XXXX..... OOO", "OOO.XXX.... OOOO", "OOOO.XX... OOOOO", "OOOOO.X.. OOOOOO", "OOOOOO.. OOOOOOO", "OOOOOOO OOOOOOOO", "OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO" }; nvidia-settings/src/xpm_data/svp_battery_50.h0000664000175000017500000000067612236467170021456 0ustar albertoalberto/* XPM */ static const char * svp_battery_50_xpm[] = { "16 16 4 1", " c None", ". c #73BA00", "+ c #424542", "@ c #636163", " .... ", " .......... ", " .++++++++. ", " .+@@@@@@+. ", " .+@@@@@@+. ", " .++++++++. ", " .+@@@@@@+. ", " .+@@@@@@+. ", " .++++++++. ", " .+......+. ", " .+......+. ", " .++++++++. ", " .+......+. ", " .+......+. ", " .++++++++. ", " .......... "}; nvidia-settings/src/xpm_data/svp_battery_75.h0000664000175000017500000000067612236467170021465 0ustar albertoalberto/* XPM */ static const char * svp_battery_75_xpm[] = { "16 16 4 1", " c None", ". c #73BA00", "+ c #424542", "@ c #636163", " .... ", " .......... ", " .++++++++. ", " .+@@@@@@+. ", " .+@@@@@@+. ", " .++++++++. ", " .+......+. ", " .+......+. ", " .++++++++. ", " .+......+. ", " .+......+. ", " .++++++++. ", " .+......+. ", " .+......+. ", " .++++++++. ", " .......... "}; nvidia-settings/src/XF86Config-parser/0000775000175000017500000000000012236467170017744 5ustar albertoalbertonvidia-settings/src/XF86Config-parser/xf86tokens.h0000664000175000017500000001500012236467170022130 0ustar albertoalberto/* $XFree86: xc/programs/Xserver/hw/xfree86/parser/xf86tokens.h,v 1.20 2003/08/24 17:37:09 dawes Exp $ */ /* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ #ifndef _xf86_tokens_h #define _xf86_tokens_h /* Undefine symbols that some OSs might define */ #undef IOBASE /* * Each token should have a unique value regardless of the section * it is used in. */ typedef enum { /* errno-style tokens */ EOF_TOKEN = -4, LOCK_TOKEN = -3, ERROR_TOKEN = -2, /* value type tokens */ NUMBER = 1, STRING, /* Tokens that can appear in many sections */ SECTION, SUBSECTION, ENDSECTION, ENDSUBSECTION, IDENTIFIER, VENDOR, DASH, COMMA, OPTION, COMMENT, /* Frequency units */ HRZ, KHZ, MHZ, /* File tokens */ FONTPATH, RGBPATH, MODULEPATH, INPUTDEVICES, LOGFILEPATH, /* Server Flag tokens. These are deprecated in favour of generic Options */ NOTRAPSIGNALS, DONTZAP, DONTZOOM, DISABLEVIDMODE, ALLOWNONLOCAL, DISABLEMODINDEV, MODINDEVALLOWNONLOCAL, ALLOWMOUSEOPENFAIL, BLANKTIME, STANDBYTIME, SUSPENDTIME, OFFTIME, DEFAULTLAYOUT, /* Monitor tokens */ MODEL, MODELINE, DISPLAYSIZE, HORIZSYNC, VERTREFRESH, MODE, GAMMA, USEMODES, /* Modes tokens */ /* no new ones */ /* Mode tokens */ DOTCLOCK, HTIMINGS, VTIMINGS, FLAGS, HSKEW, BCAST, VSCAN, ENDMODE, /* Screen tokens */ OBSDRIVER, MDEVICE, MONITOR, SCREENNO, DEFAULTDEPTH, DEFAULTBPP, DEFAULTFBBPP, /* VideoAdaptor tokens */ VIDEOADAPTOR, /* Mode timing tokens */ TT_INTERLACE, TT_PHSYNC, TT_NHSYNC, TT_PVSYNC, TT_NVSYNC, TT_CSYNC, TT_PCSYNC, TT_NCSYNC, TT_DBLSCAN, TT_HSKEW, TT_BCAST, TT_VSCAN, TT_CUSTOM, /* Module tokens */ LOAD, LOAD_DRIVER, DISABLE, /* InputClass tokens */ MATCHPRODUCT, MATCHISPOINTER, MATCHISTOUCHPAD, MATCHISTOUCHSCREEN, MATCHISKEYBOARD, MATCHISJOYSTICK, MATCHISTABLET, MATCHOS, MATCHTAG, MATCHUSBID, MATCHPNPID, MATCHVENDOR, MATCHDRIVER, MATCHDEVICEPATH, /* Device tokens */ DRIVER, CHIPSET, CLOCKS, VIDEORAM, BOARD, IOBASE, RAMDAC, DACSPEED, BIOSBASE, MEMBASE, CLOCKCHIP, CHIPID, CHIPREV, CARD, BUSID, TEXTCLOCKFRQ, IRQ, /* Keyboard tokens */ AUTOREPEAT, XLEDS, KPROTOCOL, XKBKEYMAP, XKBCOMPAT, XKBTYPES, XKBKEYCODES, XKBGEOMETRY, XKBSYMBOLS, XKBDISABLE, PANIX106, XKBRULES, XKBMODEL, XKBLAYOUT, XKBVARIANT, XKBOPTIONS, /* The next two have become ServerFlags options */ VTINIT, VTSYSREQ, /* Obsolete keyboard tokens */ SERVERNUM, LEFTALT, RIGHTALT, SCROLLLOCK_TOK, RIGHTCTL, /* arguments for the above obsolete tokens */ CONF_KM_META, CONF_KM_COMPOSE, CONF_KM_MODESHIFT, CONF_KM_MODELOCK, CONF_KM_SCROLLLOCK, CONF_KM_CONTROL, /* Pointer tokens */ EMULATE3, BAUDRATE, SAMPLERATE, PRESOLUTION, CLEARDTR, CLEARRTS, CHORDMIDDLE, PROTOCOL, PDEVICE, EM3TIMEOUT, DEVICE_NAME, ALWAYSCORE, PBUTTONS, ZAXISMAPPING, /* Pointer Z axis mapping tokens */ XAXIS, YAXIS, /* Display tokens */ MODES, VIEWPORT, VIRTUAL, VISUAL, BLACK_TOK, WHITE_TOK, DEPTH, BPP, WEIGHT, /* Layout Tokens */ SCREEN, INACTIVE, INPUTDEVICE, /* Adjaceny Tokens */ RIGHTOF, LEFTOF, ABOVE, BELOW, RELATIVE, ABSOLUTE, /* Vendor Tokens */ VENDORNAME, /* DRI Tokens */ GROUP, BUFFERS } ParserTokens; #endif /* _xf86_tokens_h */ nvidia-settings/src/XF86Config-parser/Screen.c0000664000175000017500000005436312236467170021342 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ /* View/edit this file with tab stops set to 4 */ #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" extern LexRec val; static XConfigSymTabRec DisplayTab[] = { {ENDSUBSECTION, "endsubsection"}, {MODES, "modes"}, {VIEWPORT, "viewport"}, {VIRTUAL, "virtual"}, {VISUAL, "visual"}, {BLACK_TOK, "black"}, {WHITE_TOK, "white"}, {DEPTH, "depth"}, {BPP, "fbbpp"}, {WEIGHT, "weight"}, {OPTION, "option"}, {-1, ""}, }; #define CLEANUP xconfigFreeDisplayList static int addImpliedScreen(XConfigPtr config); XConfigDisplayPtr xconfigParseDisplaySubSection (void) { int token; PARSE_PROLOGUE (XConfigDisplayPtr, XConfigDisplayRec) ptr->black.red = ptr->black.green = ptr->black.blue = -1; ptr->white.red = ptr->white.green = ptr->white.blue = -1; ptr->frameX0 = ptr->frameY0 = -1; while ((token = xconfigGetToken (DisplayTab)) != ENDSUBSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case VIEWPORT: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (VIEWPORT_MSG, NULL); ptr->frameX0 = val.num; if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (VIEWPORT_MSG, NULL); ptr->frameY0 = val.num; break; case VIRTUAL: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (VIRTUAL_MSG, NULL); ptr->virtualX = val.num; if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (VIRTUAL_MSG, NULL); ptr->virtualY = val.num; break; case DEPTH: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (NUMBER_MSG, "Display"); ptr->depth = val.num; break; case BPP: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (NUMBER_MSG, "Display"); ptr->bpp = val.num; break; case VISUAL: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Display"); ptr->visual = val.str; break; case WEIGHT: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (WEIGHT_MSG, NULL); ptr->weight.red = val.num; if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (WEIGHT_MSG, NULL); ptr->weight.green = val.num; if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (WEIGHT_MSG, NULL); ptr->weight.blue = val.num; break; case BLACK_TOK: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (BLACK_MSG, NULL); ptr->black.red = val.num; if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (BLACK_MSG, NULL); ptr->black.green = val.num; if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (BLACK_MSG, NULL); ptr->black.blue = val.num; break; case WHITE_TOK: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (WHITE_MSG, NULL); ptr->white.red = val.num; if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (WHITE_MSG, NULL); ptr->white.green = val.num; if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (WHITE_MSG, NULL); ptr->white.blue = val.num; break; case MODES: { XConfigModePtr mptr; while ((token = xconfigGetSubTokenWithTab(&(ptr->comment), DisplayTab)) == STRING) { mptr = calloc (1, sizeof (XConfigModeRec)); mptr->mode_name = val.str; mptr->next = NULL; xconfigAddListItem((GenericListPtr *)(&ptr->modes), (GenericListPtr) mptr); } xconfigUnGetToken (token); } break; case OPTION: ptr->options = xconfigParseOption(ptr->options); break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } return ptr; } #undef CLEANUP static XConfigSymTabRec ScreenTab[] = { {ENDSECTION, "endsection"}, {IDENTIFIER, "identifier"}, {OBSDRIVER, "driver"}, {MDEVICE, "device"}, {MONITOR, "monitor"}, {VIDEOADAPTOR, "videoadaptor"}, {SCREENNO, "screenno"}, {SUBSECTION, "subsection"}, {DEFAULTDEPTH, "defaultcolordepth"}, {DEFAULTDEPTH, "defaultdepth"}, {DEFAULTBPP, "defaultbpp"}, {DEFAULTFBBPP, "defaultfbbpp"}, {OPTION, "option"}, {-1, ""}, }; #define CLEANUP xconfigFreeScreenList XConfigScreenPtr xconfigParseScreenSection (void) { int has_ident = FALSE; int has_driver= FALSE; int token; PARSE_PROLOGUE (XConfigScreenPtr, XConfigScreenRec) while ((token = xconfigGetToken (ScreenTab)) != ENDSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case IDENTIFIER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Identifier"); ptr->identifier = val.str; if (has_ident || has_driver) Error (ONLY_ONE_MSG,"Identifier or Driver"); has_ident = TRUE; break; case OBSDRIVER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Driver"); ptr->obsolete_driver = val.str; if (has_ident || has_driver) Error (ONLY_ONE_MSG,"Identifier or Driver"); has_driver = TRUE; break; case DEFAULTDEPTH: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (NUMBER_MSG, "DefaultDepth"); ptr->defaultdepth = val.num; break; case DEFAULTBPP: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (NUMBER_MSG, "DefaultBPP"); ptr->defaultbpp = val.num; break; case DEFAULTFBBPP: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (NUMBER_MSG, "DefaultFbBPP"); ptr->defaultfbbpp = val.num; break; case MDEVICE: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Device"); ptr->device_name = val.str; break; case MONITOR: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Monitor"); ptr->monitor_name = val.str; break; case VIDEOADAPTOR: { XConfigAdaptorLinkPtr aptr; if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "VideoAdaptor"); /* Don't allow duplicates */ for (aptr = ptr->adaptors; aptr; aptr = (XConfigAdaptorLinkPtr) aptr->next) if (xconfigNameCompare (val.str, aptr->adaptor_name) == 0) break; if (aptr == NULL) { aptr = calloc (1, sizeof (XConfigAdaptorLinkRec)); aptr->next = NULL; aptr->adaptor_name = val.str; xconfigAddListItem ((GenericListPtr *)(&ptr->adaptors), (GenericListPtr) aptr); } } break; case OPTION: ptr->options = xconfigParseOption(ptr->options); break; case SUBSECTION: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "SubSection"); { free(val.str); HANDLE_LIST (displays, xconfigParseDisplaySubSection, XConfigDisplayPtr); } break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } if (!has_ident && !has_driver) Error (NO_IDENT_MSG, NULL); return ptr; } void xconfigPrintScreenSection (FILE * cf, XConfigScreenPtr ptr) { XConfigAdaptorLinkPtr aptr; XConfigDisplayPtr dptr; XConfigModePtr mptr; while (ptr) { fprintf (cf, "Section \"Screen\"\n"); if (ptr->comment) fprintf (cf, "%s", ptr->comment); if (ptr->identifier) fprintf (cf, " Identifier \"%s\"\n", ptr->identifier); if (ptr->obsolete_driver) fprintf (cf, " Driver \"%s\"\n", ptr->obsolete_driver); if (ptr->device_name) fprintf (cf, " Device \"%s\"\n", ptr->device_name); if (ptr->monitor_name) fprintf (cf, " Monitor \"%s\"\n", ptr->monitor_name); if (ptr->defaultdepth) fprintf (cf, " DefaultDepth %d\n", ptr->defaultdepth); if (ptr->defaultbpp) fprintf (cf, " DefaultBPP %d\n", ptr->defaultbpp); if (ptr->defaultfbbpp) fprintf (cf, " DefaultFbBPP %d\n", ptr->defaultfbbpp); xconfigPrintOptionList(cf, ptr->options, 1); for (aptr = ptr->adaptors; aptr; aptr = aptr->next) { fprintf (cf, " VideoAdaptor \"%s\"\n", aptr->adaptor_name); } for (dptr = ptr->displays; dptr; dptr = dptr->next) { fprintf (cf, " SubSection \"Display\"\n"); if (dptr->comment) fprintf (cf, "%s", dptr->comment); if (dptr->frameX0 >= 0 || dptr->frameY0 >= 0) { fprintf (cf, " Viewport %d %d\n", dptr->frameX0, dptr->frameY0); } if (dptr->virtualX != 0 || dptr->virtualY != 0) { fprintf (cf, " Virtual %d %d\n", dptr->virtualX, dptr->virtualY); } if (dptr->depth) { fprintf (cf, " Depth %d\n", dptr->depth); } if (dptr->bpp) { fprintf (cf, " FbBPP %d\n", dptr->bpp); } if (dptr->visual) { fprintf (cf, " Visual \"%s\"\n", dptr->visual); } if (dptr->weight.red != 0) { fprintf (cf, " Weight %d %d %d\n", dptr->weight.red, dptr->weight.green, dptr->weight.blue); } if (dptr->black.red != -1) { fprintf (cf, " Black 0x%04x 0x%04x 0x%04x\n", dptr->black.red, dptr->black.green, dptr->black.blue); } if (dptr->white.red != -1) { fprintf (cf, " White 0x%04x 0x%04x 0x%04x\n", dptr->white.red, dptr->white.green, dptr->white.blue); } if (dptr->modes) { fprintf (cf, " Modes "); } for (mptr = dptr->modes; mptr; mptr = mptr->next) { fprintf (cf, " \"%s\"", mptr->mode_name); } if (dptr->modes) { fprintf (cf, "\n"); } xconfigPrintOptionList(cf, dptr->options, 2); fprintf (cf, " EndSubSection\n"); } fprintf (cf, "EndSection\n\n"); ptr = ptr->next; } } void xconfigFreeScreenList (XConfigScreenPtr *ptr) { XConfigScreenPtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->identifier); TEST_FREE ((*ptr)->monitor_name); TEST_FREE ((*ptr)->device_name); TEST_FREE ((*ptr)->comment); xconfigFreeOptionList (&((*ptr)->options)); xconfigFreeAdaptorLinkList (&((*ptr)->adaptors)); xconfigFreeDisplayList (&((*ptr)->displays)); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } void xconfigFreeAdaptorLinkList (XConfigAdaptorLinkPtr *ptr) { XConfigAdaptorLinkPtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->adaptor_name); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } void xconfigFreeDisplayList (XConfigDisplayPtr *ptr) { XConfigDisplayPtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { xconfigFreeModeList (&((*ptr)->modes)); xconfigFreeOptionList (&((*ptr)->options)); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } void xconfigFreeModeList (XConfigModePtr *ptr) { XConfigModePtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->mode_name); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } int xconfigValidateScreen (XConfigPtr p) { XConfigScreenPtr screen = p->screens; XConfigMonitorPtr monitor; XConfigDevicePtr device; XConfigAdaptorLinkPtr adaptor; /* * if we do not have a screen, just return TRUE; we'll add a * screen later during the Sanitize step */ if (!screen) return TRUE; while (screen) { if (screen->obsolete_driver && !screen->identifier) screen->identifier = screen->obsolete_driver; monitor = xconfigFindMonitor (screen->monitor_name, p->monitors); if (screen->monitor_name) { if (!monitor) { xconfigErrorMsg(ValidationErrorMsg, UNDEFINED_MONITOR_MSG, screen->monitor_name, screen->identifier); return (FALSE); } else { screen->monitor = monitor; if (!xconfigValidateMonitor(p, screen)) return (FALSE); } } device = xconfigFindDevice (screen->device_name, p->devices); if (!device) { xconfigErrorMsg(ValidationErrorMsg, UNDEFINED_DEVICE_MSG, screen->device_name, screen->identifier); return (FALSE); } else screen->device = device; adaptor = screen->adaptors; while (adaptor) { adaptor->adaptor = xconfigFindVideoAdaptor(adaptor->adaptor_name, p->videoadaptors); if (!adaptor->adaptor) { xconfigErrorMsg(ValidationErrorMsg, UNDEFINED_ADAPTOR_MSG, adaptor->adaptor_name, screen->identifier); return (FALSE); } else if (adaptor->adaptor->fwdref) { xconfigErrorMsg(ValidationErrorMsg, ADAPTOR_REF_TWICE_MSG, adaptor->adaptor_name, adaptor->adaptor->fwdref); return (FALSE); } adaptor->adaptor->fwdref = xconfigStrdup(screen->identifier); adaptor = adaptor->next; } screen = screen->next; } return (TRUE); } int xconfigSanitizeScreen(XConfigPtr p) { XConfigScreenPtr screen = p->screens; XConfigMonitorPtr monitor; if (!addImpliedScreen(p)) { return FALSE; } while (screen) { /* * if no monitor for this screen (either the monitor name, or * the actual monitor pointer), find a monitor: resolve * discrepancies between screen->monitor_name and * screen->monitor; otherwise use the first monitor in the * config; if we still don't have a monitor, add a new one */ if (!screen->monitor_name || !screen->monitor) { monitor = NULL; if (!monitor && screen->monitor) { monitor = screen->monitor; } if (!monitor && screen->monitor_name) { monitor = xconfigFindMonitor(screen->monitor_name, p->monitors); } if (!monitor && p->monitors) { monitor = p->monitors; } if (!monitor) { monitor = xconfigAddMonitor(p, 0); } if (monitor) { screen->monitor = monitor; if (screen->monitor_name) { free(screen->monitor_name); } screen->monitor_name = xconfigStrdup(monitor->identifier); if (!xconfigValidateMonitor(p, screen)) { return FALSE; } } } screen = screen->next; } return TRUE; } XConfigScreenPtr xconfigFindScreen (const char *ident, XConfigScreenPtr p) { while (p) { if (xconfigNameCompare (ident, p->identifier) == 0) return (p); p = p->next; } return (NULL); } XConfigModePtr xconfigFindMode (const char *name, XConfigModePtr p) { while (p) { if (xconfigNameCompare (name, p->mode_name) == 0) return (p); p = p->next; } return (NULL); } void xconfigAddMode(XConfigModePtr *pHead, const char *name) { XConfigModePtr mode; mode = xconfigAlloc(sizeof(XConfigModeRec)); mode->mode_name = xconfigStrdup(name); mode->next = *pHead; *pHead = mode; } void xconfigRemoveMode(XConfigModePtr *pHead, const char *name) { XConfigModePtr p = *pHead; XConfigModePtr last = NULL; while (p) { if (xconfigNameCompare(p->mode_name, name) == 0) { if (last) { last->next = p->next; } else { *pHead = p->next; } free(p->mode_name); free(p); return; } last = p; p = p->next; } } static int addImpliedScreen(XConfigPtr config) { XConfigScreenPtr screen; XConfigDevicePtr device; XConfigMonitorPtr monitor; if (config->screens) return TRUE; xconfigErrorMsg(WarnMsg, "No Screen specified, constructing implicit " "screen section.\n"); /* allocate the new screen section */ screen = calloc(1, sizeof(XConfigScreenRec)); if (!screen) return FALSE; screen->identifier = xconfigStrdup("Default Screen"); /* * Use the first device section if there is one. */ if (config->devices) { device = config->devices; screen->device_name = xconfigStrdup(device->identifier); screen->device = device; } /* * Use the first monitor section if there is one. */ if (config->monitors) { monitor = config->monitors; screen->monitor_name = xconfigStrdup(monitor->identifier); screen->monitor = monitor; } config->screens = screen; return TRUE; } nvidia-settings/src/XF86Config-parser/Files.c0000664000175000017500000002101512236467170021151 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ /* View/edit this file with tab stops set to 4 */ #include #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" extern LexRec val; static XConfigSymTabRec FilesTab[] = { {ENDSECTION, "endsection"}, {FONTPATH, "fontpath"}, {RGBPATH, "rgbpath"}, {MODULEPATH, "modulepath"}, {INPUTDEVICES, "inputdevices"}, {LOGFILEPATH, "logfile"}, {-1, ""}, }; static char * prependRoot (char *pathname) { return pathname; } #define CLEANUP xconfigFreeFiles XConfigFilesPtr xconfigParseFilesSection (void) { int i, j; int k, l; char *str; int token; PARSE_PROLOGUE (XConfigFilesPtr, XConfigFilesRec) while ((token = xconfigGetToken (FilesTab)) != ENDSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case FONTPATH: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "FontPath"); j = FALSE; str = prependRoot (val.str); if (ptr->fontpath == NULL) { ptr->fontpath = malloc (1); ptr->fontpath[0] = '\0'; i = strlen (str) + 1; } else { i = strlen (ptr->fontpath) + strlen (str) + 1; if (ptr->fontpath[strlen (ptr->fontpath) - 1] != ',') { i++; j = TRUE; } } ptr->fontpath = realloc (ptr->fontpath, i); if (j) strcat (ptr->fontpath, ","); strcat (ptr->fontpath, str); free (val.str); break; case RGBPATH: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "RGBPath"); ptr->rgbpath = val.str; break; case MODULEPATH: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "ModulePath"); l = FALSE; str = prependRoot (val.str); if (ptr->modulepath == NULL) { ptr->modulepath = malloc (1); ptr->modulepath[0] = '\0'; k = strlen (str) + 1; } else { k = strlen (ptr->modulepath) + strlen (str) + 1; if (ptr->modulepath[strlen (ptr->modulepath) - 1] != ',') { k++; l = TRUE; } } ptr->modulepath = realloc (ptr->modulepath, k); if (l) strcat (ptr->modulepath, ","); strcat (ptr->modulepath, str); free (val.str); break; case INPUTDEVICES: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "InputDevices"); l = FALSE; str = prependRoot (val.str); if (ptr->inputdevs == NULL) { ptr->inputdevs = malloc (1); ptr->inputdevs[0] = '\0'; k = strlen (str) + 1; } else { k = strlen (ptr->inputdevs) + strlen (str) + 1; if (ptr->inputdevs[strlen (ptr->inputdevs) - 1] != ',') { k++; l = TRUE; } } ptr->inputdevs = realloc (ptr->inputdevs, k); if (l) strcat (ptr->inputdevs, ","); strcat (ptr->inputdevs, str); free (val.str); break; case LOGFILEPATH: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "LogFile"); ptr->logfile = val.str; break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } return ptr; } #undef CLEANUP void xconfigPrintFileSection (FILE * cf, XConfigFilesPtr ptr) { char *p, *s; if (ptr == NULL) return; if (ptr->comment) fprintf (cf, "%s", ptr->comment); if (ptr->logfile) fprintf (cf, " LogFile \"%s\"\n", ptr->logfile); if (ptr->rgbpath) fprintf (cf, " RgbPath \"%s\"\n", ptr->rgbpath); if (ptr->modulepath) { s = ptr->modulepath; p = index (s, ','); while (p) { *p = '\000'; fprintf (cf, " ModulePath \"%s\"\n", s); *p = ','; s = p; s++; p = index (s, ','); } fprintf (cf, " ModulePath \"%s\"\n", s); } if (ptr->inputdevs) { s = ptr->inputdevs; p = index (s, ','); while (p) { *p = '\000'; fprintf (cf, " InputDevices \"%s\"\n", s); *p = ','; s = p; s++; p = index (s, ','); } fprintf (cf, " InputDevices \"%s\"\n", s); } if (ptr->fontpath) { s = ptr->fontpath; p = index (s, ','); while (p) { *p = '\000'; fprintf (cf, " FontPath \"%s\"\n", s); *p = ','; s = p; s++; p = index (s, ','); } fprintf (cf, " FontPath \"%s\"\n", s); } } void xconfigFreeFiles (XConfigFilesPtr *p) { if (p == NULL || *p == NULL) return; TEST_FREE ((*p)->logfile); TEST_FREE ((*p)->rgbpath); TEST_FREE ((*p)->modulepath); TEST_FREE ((*p)->inputdevs); TEST_FREE ((*p)->fontpath); TEST_FREE ((*p)->comment); free (*p); *p = NULL; } nvidia-settings/src/XF86Config-parser/Flags.c0000664000175000017500000004034012236467170021145 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ /* View/edit this file with tab stops set to 4 */ #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" #include #include "common-utils.h" extern LexRec val; static XConfigSymTabRec ServerFlagsTab[] = { {ENDSECTION, "endsection"}, {NOTRAPSIGNALS, "notrapsignals"}, {DONTZAP, "dontzap"}, {DONTZOOM, "dontzoom"}, {DISABLEVIDMODE, "disablevidmodeextension"}, {ALLOWNONLOCAL, "allownonlocalxvidtune"}, {DISABLEMODINDEV, "disablemodindev"}, {MODINDEVALLOWNONLOCAL, "allownonlocalmodindev"}, {ALLOWMOUSEOPENFAIL, "allowmouseopenfail"}, {OPTION, "option"}, {BLANKTIME, "blanktime"}, {STANDBYTIME, "standbytime"}, {SUSPENDTIME, "suspendtime"}, {OFFTIME, "offtime"}, {DEFAULTLAYOUT, "defaultserverlayout"}, {-1, ""}, }; #define CLEANUP xconfigFreeFlags XConfigFlagsPtr xconfigParseFlagsSection (void) { int token; PARSE_PROLOGUE (XConfigFlagsPtr, XConfigFlagsRec) while ((token = xconfigGetToken (ServerFlagsTab)) != ENDSECTION) { int hasvalue = FALSE; int strvalue = FALSE; int tokentype; switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; /* * these old keywords are turned into standard generic options. * we fall through here on purpose */ case DEFAULTLAYOUT: strvalue = TRUE; case BLANKTIME: case STANDBYTIME: case SUSPENDTIME: case OFFTIME: hasvalue = TRUE; case NOTRAPSIGNALS: case DONTZAP: case DONTZOOM: case DISABLEVIDMODE: case ALLOWNONLOCAL: case DISABLEMODINDEV: case MODINDEVALLOWNONLOCAL: case ALLOWMOUSEOPENFAIL: { int i = 0; while (ServerFlagsTab[i].token != -1) { if (ServerFlagsTab[i].token == token) { char buff[16]; char *valstr = NULL; if (hasvalue) { tokentype = xconfigGetSubToken(&(ptr->comment)); if (strvalue) { if (tokentype != STRING) Error (QUOTE_MSG, ServerFlagsTab[i].name); valstr = val.str; } else { if (tokentype != NUMBER) Error (NUMBER_MSG, ServerFlagsTab[i].name); snprintf(buff, 16, "%d", val.num); valstr = buff; } } xconfigAddNewOption(&ptr->options, ServerFlagsTab[i].name, valstr); } i++; } } break; case OPTION: ptr->options = xconfigParseOption(ptr->options); break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } return ptr; } #undef CLEANUP void xconfigPrintServerFlagsSection (FILE * f, XConfigFlagsPtr flags) { XConfigOptionPtr p; if ((!flags) || (!flags->options)) return; p = flags->options; fprintf (f, "Section \"ServerFlags\"\n"); if (flags->comment) fprintf (f, "%s", flags->comment); xconfigPrintOptionList(f, p, 1); fprintf (f, "EndSection\n\n"); } void xconfigAddNewOption (XConfigOptionPtr *pHead, const char *name, const char *val) { XConfigOptionPtr new; XConfigOptionPtr old = NULL; /* Don't allow duplicates */ if (*pHead != NULL && ((old = xconfigFindOption(*pHead, name)) != NULL)) { TEST_FREE(old->name); TEST_FREE(old->val); new = old; } else { new = calloc(1, sizeof (XConfigOptionRec)); new->next = NULL; } new->name = xconfigStrdup(name); new->val = xconfigStrdup(val); if (old == NULL) { xconfigAddListItem((GenericListPtr *)(pHead), (GenericListPtr)new); } } void xconfigFreeFlags (XConfigFlagsPtr *flags) { if (flags == NULL || *flags == NULL) return; xconfigFreeOptionList (&((*flags)->options)); TEST_FREE((*flags)->comment); free (*flags); *flags = NULL; } XConfigOptionPtr xconfigOptionListDup (XConfigOptionPtr opt) { XConfigOptionPtr newopt = NULL; while (opt) { xconfigAddNewOption(&newopt, opt->name, opt->val); if (newopt) { newopt->comment = xconfigStrdup(opt->comment); } opt = opt->next; } return newopt; } void xconfigFreeOptionList (XConfigOptionPtr *opt) { XConfigOptionPtr prev; if (opt == NULL || *opt == NULL) return; while (*opt) { TEST_FREE ((*opt)->name); TEST_FREE ((*opt)->val); TEST_FREE ((*opt)->comment); prev = *opt; *opt = (*opt)->next; free (prev); } } char * xconfigOptionName(XConfigOptionPtr opt) { if (opt) return opt->name; return 0; } char * xconfigOptionValue(XConfigOptionPtr opt) { if (opt) return opt->val; return 0; } XConfigOptionPtr xconfigNewOption(const char *name, const char *value) { XConfigOptionPtr opt; opt = calloc(1, sizeof (XConfigOptionRec)); if (!opt) return NULL; opt->name = xconfigStrdup(name); opt->val = xconfigStrdup(value); opt->next = NULL; return opt; } void xconfigRemoveOption(XConfigOptionPtr *pHead, XConfigOptionPtr opt) { xconfigRemoveListItem((GenericListPtr *)pHead, (GenericListPtr)opt); TEST_FREE(opt->name); TEST_FREE(opt->val); TEST_FREE(opt->comment); free(opt); } XConfigOptionPtr xconfigNextOption(XConfigOptionPtr list) { if (!list) return NULL; return list->next; } /* * this function searches the given option list for the named option and * returns a pointer to the option rec if found. If not found, it returns * NULL */ XConfigOptionPtr xconfigFindOption (XConfigOptionPtr list, const char *name) { while (list) { if (xconfigNameCompare (list->name, name) == 0) return (list); list = list->next; } return (NULL); } /* * this function searches the given option list for the named option. If * found and the option has a parameter, a pointer to the parameter is * returned. If the option does not have a parameter an empty string is * returned. If the option is not found, a NULL is returned. */ char * xconfigFindOptionValue (XConfigOptionPtr list, const char *name) { XConfigOptionPtr p = xconfigFindOption (list, name); if (p) { if (p->val) return (p->val); else return ""; } return (NULL); } /* * this function searches the given option list for the named option. If * found and the the value of the option is set to "1", "ON", "YES" or * "TRUE", 1 is returned. Otherwise, 0 is returned. */ int xconfigFindOptionBoolean (XConfigOptionPtr list, const char *name) { XConfigOptionPtr p = xconfigFindOption (list, name); if (p && p->val) { if ( strcasecmp(p->val, "1") == 0 || strcasecmp(p->val, "ON") == 0 || strcasecmp(p->val, "YES") == 0 || strcasecmp(p->val, "TRUE") == 0 ) { return 1; } } return 0; } /* the 2 given lists are merged. If an option with the same name is present in * both, the option from the user list - specified in the second argument - * is used. The end result is a single valid list of options. Duplicates * are freed, and the original lists are no longer guaranteed to be complete. */ XConfigOptionPtr xconfigOptionListMerge (XConfigOptionPtr head, XConfigOptionPtr tail) { XConfigOptionPtr a, b, ap = NULL, bp = NULL; a = tail; b = head; while (tail && b) { if (xconfigNameCompare (a->name, b->name) == 0) { if (b == head) head = a; else bp->next = a; if (a == tail) tail = a->next; else ap->next = a->next; a->next = b->next; b->next = NULL; xconfigFreeOptionList (&b); b = a->next; bp = a; a = tail; ap = NULL; } else { ap = a; if (!(a = a->next)) { a = tail; bp = b; b = b->next; ap = NULL; } } } if (head) { for (a = head; a->next; a = a->next) ; a->next = tail; } else head = tail; return (head); } char * xconfigULongToString(unsigned long i) { char *s; int l; l = (int)(ceil(log10((double)i) + 2.5)); s = malloc(l); if (!s) return NULL; sprintf(s, "%lu", i); return s; } XConfigOptionPtr xconfigParseOption(XConfigOptionPtr head) { XConfigOptionPtr option, cnew, old; char *name, *comment = NULL; int token; if ((token = xconfigGetSubToken(&comment)) != STRING) { xconfigErrorMsg(ParseErrorMsg, BAD_OPTION_MSG); if (comment) free(comment); return (head); } name = val.str; if ((token = xconfigGetSubToken(&comment)) == STRING) { option = xconfigNewOption(name, val.str); option->comment = comment; if ((token = xconfigGetToken(NULL)) == COMMENT) option->comment = xconfigAddComment(option->comment, val.str); else xconfigUnGetToken(token); } else { option = xconfigNewOption(name, NULL); option->comment = comment; if (token == COMMENT) option->comment = xconfigAddComment(option->comment, val.str); else xconfigUnGetToken(token); } old = NULL; /* Don't allow duplicates */ if (head != NULL && (old = xconfigFindOption(head, name)) != NULL) { cnew = old; free(option->name); TEST_FREE(option->val); TEST_FREE(option->comment); free(option); } else cnew = option; if (old == NULL) { xconfigAddListItem((GenericListPtr *)(&head), (GenericListPtr)cnew); } return head; } void xconfigPrintOptionList(FILE *fp, XConfigOptionPtr list, int tabs) { int i; if (!list) return; while (list) { for (i = 0; i < tabs; i++) fprintf(fp, " "); if (list->val) fprintf(fp, "Option \"%s\" \"%s\"", list->name, list->val); else fprintf(fp, "Option \"%s\"", list->name); if (list->comment) fprintf(fp, "%s", list->comment); else fputc('\n', fp); list = list->next; } } /* * Determines if the Composite extension should be disabled or not. * * - If the extension can be enabled, this function returns NULL. * * - If the extension should be disabled, this function returns a * string that lists the conflicting options that are enabled. */ const char *xconfigValidateComposite(XConfigPtr config, GenerateOptions *gop, int composite_specified, int xinerama_enabled, int depth, int overlay_enabled, int cioverlay_enabled, int ubb_enabled, int stereo_enabled) { int i, n, disable_composite; static char err_str[256]; int size = 256; char *s; const struct { const char *name; int value; } composite_incompatible_options[] = { { "Xinerama", xinerama_enabled }, { "Overlay", overlay_enabled }, { "CIOverlay", cioverlay_enabled }, { "UBB", ubb_enabled }, { "Stereo", stereo_enabled }, }; /* * We need to be careful to only set the option value if the X * server is going to recognize the Extension section and the * composite option. We guess whether the server will recognize * the option: if get_xserver_in_use() thinks the X server * supports the "Composite" extension, or the current config * already has an extension section, or the user specified the * composite option. */ if (!gop->supports_extension_section && !config->extensions && !composite_specified) { /* Composite can't be set in X config, so bail */ return NULL; } disable_composite = FALSE; s = err_str; n = 0; err_str[0] = '\0'; for (i = 0; i < ARRAY_LEN(composite_incompatible_options); i++) { int value = composite_incompatible_options[i].value; const char *name = composite_incompatible_options[i].name; int wrote; if (value) { disable_composite = TRUE; n++; wrote = snprintf(s, size, "%s%s", (n > 1) ? " or " : "", name); if (wrote <= 0) { break; } size -= wrote; s += wrote; } } /* Special case checking for depth 8 */ if (depth <= 8) { snprintf(s, size, "%sdepth=8", (n > 1) ? " or " : ""); } return disable_composite ? err_str : NULL; } nvidia-settings/src/XF86Config-parser/Vendor.c0000664000175000017500000001665112236467170021356 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ /* View/edit this file with tab stops set to 4 */ #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" extern LexRec val; static XConfigSymTabRec VendorSubTab[] = { {ENDSUBSECTION, "endsubsection"}, {IDENTIFIER, "identifier"}, {OPTION, "option"}, {-1, ""}, }; #define CLEANUP xconfigFreeVendorSubList XConfigVendSubPtr xconfigParseVendorSubSection (void) { int has_ident = FALSE; int token; PARSE_PROLOGUE (XConfigVendSubPtr, XConfigVendSubRec) while ((token = xconfigGetToken (VendorSubTab)) != ENDSUBSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case IDENTIFIER: if (xconfigGetSubToken (&(ptr->comment))) Error (QUOTE_MSG, "Identifier"); if (has_ident == TRUE) Error (MULTIPLE_MSG, "Identifier"); ptr->identifier = val.str; has_ident = TRUE; break; case OPTION: ptr->options = xconfigParseOption(ptr->options); break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } return ptr; } #undef CLEANUP static XConfigSymTabRec VendorTab[] = { {ENDSECTION, "endsection"}, {IDENTIFIER, "identifier"}, {OPTION, "option"}, {SUBSECTION, "subsection"}, {-1, ""}, }; #define CLEANUP xconfigFreeVendorList XConfigVendorPtr xconfigParseVendorSection (void) { int has_ident = FALSE; int token; PARSE_PROLOGUE (XConfigVendorPtr, XConfigVendorRec) while ((token = xconfigGetToken (VendorTab)) != ENDSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case IDENTIFIER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Identifier"); if (has_ident == TRUE) Error (MULTIPLE_MSG, "Identifier"); ptr->identifier = val.str; has_ident = TRUE; break; case OPTION: ptr->options = xconfigParseOption(ptr->options); break; case SUBSECTION: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "SubSection"); { HANDLE_LIST (subs, xconfigParseVendorSubSection, XConfigVendSubPtr); } break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } if (!has_ident) Error (NO_IDENT_MSG, NULL); return ptr; } #undef CLEANUP void xconfigPrintVendorSection (FILE * cf, XConfigVendorPtr ptr) { XConfigVendSubPtr pptr; while (ptr) { fprintf (cf, "Section \"Vendor\"\n"); if (ptr->comment) fprintf (cf, "%s", ptr->comment); if (ptr->identifier) fprintf (cf, " Identifier \"%s\"\n", ptr->identifier); xconfigPrintOptionList(cf, ptr->options, 1); for (pptr = ptr->subs; pptr; pptr = pptr->next) { fprintf (cf, " SubSection \"Vendor\"\n"); if (pptr->comment) fprintf (cf, "%s", pptr->comment); if (pptr->identifier) fprintf (cf, " Identifier \"%s\"\n", pptr->identifier); xconfigPrintOptionList(cf, pptr->options, 2); fprintf (cf, " EndSubSection\n"); } fprintf (cf, "EndSection\n\n"); ptr = ptr->next; } } void xconfigFreeVendorList (XConfigVendorPtr *p) { if (p == NULL || *p == NULL) return; xconfigFreeVendorSubList (&((*p)->subs)); TEST_FREE ((*p)->identifier); TEST_FREE ((*p)->comment); xconfigFreeOptionList (&((*p)->options)); free (*p); *p = NULL; } void xconfigFreeVendorSubList (XConfigVendSubPtr *ptr) { XConfigVendSubPtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->identifier); TEST_FREE ((*ptr)->name); TEST_FREE ((*ptr)->comment); xconfigFreeOptionList (&((*ptr)->options)); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } XConfigVendorPtr xconfigFindVendor (const char *name, XConfigVendorPtr list) { while (list) { if (xconfigNameCompare (list->identifier, name) == 0) return (list); list = list->next; } return (NULL); } nvidia-settings/src/XF86Config-parser/Read.c0000664000175000017500000003124312236467170020766 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" extern LexRec val; static XConfigSymTabRec TopLevelTab[] = { {SECTION, "section"}, {-1, ""}, }; #define CLEANUP xconfigFreeConfig #define READ_HANDLE_RETURN(f,func) \ if ((ptr->f=func) == NULL) { \ xconfigFreeConfig(&ptr); \ return XCONFIG_RETURN_PARSE_ERROR; \ } #define READ_HANDLE_LIST(field,func,type) \ { \ type p = func(); \ if (p == NULL) { \ xconfigFreeConfig(&ptr); \ return XCONFIG_RETURN_PARSE_ERROR; \ } else { \ xconfigAddListItem((GenericListPtr *)(&ptr->field), \ (GenericListPtr) p); \ } \ } #define READ_ERROR(a,b) \ do { \ xconfigErrorMsg(ParseErrorMsg, a, b); \ xconfigFreeConfig(&ptr); \ return XCONFIG_RETURN_PARSE_ERROR; \ } while (0) /* * xconfigReadConfigFile() - read the open XConfig file, returning the * parsed data as XConfigPtr. */ XConfigError xconfigReadConfigFile(XConfigPtr *configPtr) { int token; XConfigPtr ptr = NULL; *configPtr = NULL; ptr = xconfigAlloc(sizeof(XConfigRec)); while ((token = xconfigGetToken(TopLevelTab)) != EOF_TOKEN) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case SECTION: if (xconfigGetSubToken(&(ptr->comment)) != STRING) { xconfigErrorMsg(ParseErrorMsg, QUOTE_MSG, "Section"); xconfigFreeConfig(&ptr); return XCONFIG_RETURN_PARSE_ERROR; } xconfigSetSection(val.str); if (xconfigNameCompare(val.str, "files") == 0) { free(val.str); val.str = NULL; READ_HANDLE_RETURN(files, xconfigParseFilesSection()); } else if (xconfigNameCompare(val.str, "serverflags") == 0) { free(val.str); val.str = NULL; READ_HANDLE_RETURN(flags, xconfigParseFlagsSection()); } else if (xconfigNameCompare(val.str, "keyboard") == 0) { free(val.str); val.str = NULL; READ_HANDLE_LIST(inputs, xconfigParseKeyboardSection, XConfigInputPtr); } else if (xconfigNameCompare(val.str, "pointer") == 0) { free(val.str); val.str = NULL; READ_HANDLE_LIST(inputs, xconfigParsePointerSection, XConfigInputPtr); } else if (xconfigNameCompare(val.str, "videoadaptor") == 0) { free(val.str); val.str = NULL; READ_HANDLE_LIST(videoadaptors, xconfigParseVideoAdaptorSection, XConfigVideoAdaptorPtr); } else if (xconfigNameCompare(val.str, "device") == 0) { free(val.str); val.str = NULL; READ_HANDLE_LIST(devices, xconfigParseDeviceSection, XConfigDevicePtr); } else if (xconfigNameCompare(val.str, "monitor") == 0) { free(val.str); val.str = NULL; READ_HANDLE_LIST(monitors, xconfigParseMonitorSection, XConfigMonitorPtr); } else if (xconfigNameCompare(val.str, "modes") == 0) { free(val.str); val.str = NULL; READ_HANDLE_LIST(modes, xconfigParseModesSection, XConfigModesPtr); } else if (xconfigNameCompare(val.str, "screen") == 0) { free(val.str); val.str = NULL; READ_HANDLE_LIST(screens, xconfigParseScreenSection, XConfigScreenPtr); } else if (xconfigNameCompare(val.str, "inputdevice") == 0) { free(val.str); val.str = NULL; READ_HANDLE_LIST(inputs, xconfigParseInputSection, XConfigInputPtr); } else if ((xconfigNameCompare(val.str, "inputclass") == 0)) { free(val.str); val.str = NULL; READ_HANDLE_LIST(inputclasses, xconfigParseInputClassSection, XConfigInputClassPtr); } else if (xconfigNameCompare(val.str, "module") == 0) { free(val.str); val.str = NULL; READ_HANDLE_RETURN(modules, xconfigParseModuleSection()); } else if (xconfigNameCompare(val.str, "serverlayout") == 0) { free(val.str); val.str = NULL; READ_HANDLE_LIST(layouts, xconfigParseLayoutSection, XConfigLayoutPtr); } else if (xconfigNameCompare(val.str, "vendor") == 0) { free(val.str); val.str = NULL; READ_HANDLE_LIST(vendors, xconfigParseVendorSection, XConfigVendorPtr); } else if (xconfigNameCompare(val.str, "dri") == 0) { free(val.str); val.str = NULL; READ_HANDLE_RETURN(dri, xconfigParseDRISection()); } else if (xconfigNameCompare (val.str, "extensions") == 0) { free(val.str); val.str = NULL; READ_HANDLE_RETURN(extensions, xconfigParseExtensionsSection()); } else { READ_ERROR(INVALID_SECTION_MSG, xconfigTokenString()); free(val.str); val.str = NULL; } break; default: READ_ERROR(INVALID_KEYWORD_MSG, xconfigTokenString()); free(val.str); val.str = NULL; } } if (xconfigValidateConfig(ptr)) { ptr->filename = strdup(xconfigGetConfigFileName()); *configPtr = ptr; return XCONFIG_RETURN_SUCCESS; } else { xconfigFreeConfig(&ptr); return XCONFIG_RETURN_VALIDATION_ERROR; } } #undef CLEANUP /* * This function resolves name references and reports errors if the named * objects cannot be found. */ int xconfigValidateConfig(XConfigPtr p) { if (!xconfigValidateDevice(p)) return FALSE; if (!xconfigValidateScreen(p)) return FALSE; if (!xconfigValidateInput(p)) return FALSE; if (!xconfigValidateLayout(p)) return FALSE; return(TRUE); } /* * This function fixes up any problems that it finds in the config, * when possible. */ int xconfigSanitizeConfig(XConfigPtr p, const char *screenName, GenerateOptions *gop) { if (!xconfigSanitizeScreen(p)) return FALSE; if (!xconfigSanitizeLayout(p, screenName, gop)) return FALSE; return TRUE; } /* * adds an item to the end of the linked list. Any record whose first field * is a GenericListRec can be cast to this type and used with this function. */ void xconfigAddListItem (GenericListPtr *pHead, GenericListPtr new) { GenericListPtr p = *pHead; GenericListPtr last = NULL; while (p) { last = p; p = p->next; } if (last) { last->next = new; } else { *pHead = new; } } /* * removes an item from the linked list (but does not delete it). Any record * whose first field is a GenericListRec can be cast to this type and used * with this function. */ void xconfigRemoveListItem (GenericListPtr *pHead, GenericListPtr item) { GenericListPtr cur = *pHead; GenericListPtr prev = NULL; while (cur) { if (cur == item) { if (prev) { prev->next = item->next; } else { *pHead = item->next; } return; } prev = cur; cur = cur->next; } } /* * Test if one chained list contains the other. * In this case both list have the same endpoint (provided they don't loop) */ int xconfigItemNotSublist(GenericListPtr list_1, GenericListPtr list_2) { GenericListPtr p = list_1; GenericListPtr last_1 = NULL, last_2 = NULL; while (p) { last_1 = p; p = p->next; } p = list_2; while (p) { last_2 = p; p = p->next; } return (!(last_1 == last_2)); } void xconfigFreeConfig (XConfigPtr *p) { if (p == NULL || *p == NULL) return; xconfigFreeFiles (&((*p)->files)); xconfigFreeModules (&((*p)->modules)); xconfigFreeFlags (&((*p)->flags)); xconfigFreeMonitorList (&((*p)->monitors)); xconfigFreeModesList (&((*p)->modes)); xconfigFreeVideoAdaptorList (&((*p)->videoadaptors)); xconfigFreeDeviceList (&((*p)->devices)); xconfigFreeScreenList (&((*p)->screens)); xconfigFreeLayoutList (&((*p)->layouts)); xconfigFreeInputList (&((*p)->inputs)); xconfigFreeVendorList (&((*p)->vendors)); xconfigFreeDRI (&((*p)->dri)); TEST_FREE((*p)->comment); free (*p); *p = NULL; } nvidia-settings/src/XF86Config-parser/Util.c0000664000175000017500000001002112236467170021017 0ustar albertoalberto/* * nvidia-xconfig: A tool for manipulating X config files, * specifically for use by the NVIDIA Linux graphics driver. * * Copyright (C) 2005 NVIDIA Corporation * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . * * * Util.c */ #include #include #include #include #include "xf86Parser.h" #include "Configint.h" void *xconfigAlloc(size_t size) { void *m = malloc(size); if (!m) { fprintf(stderr, "memory allocation failure (%s)! \n", strerror(errno)); exit(1); } memset((char *) m, 0, size); return m; } /* xconfigAlloc() */ /* * xconfigStrdup() - wrapper for strdup() that checks the return * value; if an error occurs, an error is printed to stderr and exit * is called -- this function will only return on success. */ char *xconfigStrdup(const char *s) { char *m; if (!s) return NULL; m = strdup(s); if (!m) { fprintf(stderr, "memory allocation failure during strdup (%s)! \n", strerror(errno)); exit(1); } return m; } /* xconfigStrdup() */ /* * xconfigStrcat() - allocate a new string, copying all given strings * into it. taken from glib */ char *xconfigStrcat(const char *str, ...) { unsigned int l; va_list args; char *s; char *concat; l = 1 + strlen(str); va_start(args, str); s = va_arg(args, char *); while (s) { l += strlen(s); s = va_arg(args, char *); } va_end(args); concat = xconfigAlloc(l); concat[0] = 0; strcat(concat, str); va_start(args, str); s = va_arg(args, char *); while (s) { strcat(concat, s); s = va_arg(args, char *); } va_end(args); return concat; } /* xconfigStrcat() */ #define NV_FMT_BUF_LEN 64 extern int configLineNo; extern char *configSection; extern char *configPath; void xconfigErrorMsg(MsgType t, char *fmt, ...) { va_list ap; int len, current_len = NV_FMT_BUF_LEN; char *b, *pre = NULL, *msg; char scratch[64]; b = xconfigAlloc(current_len); while (1) { va_start(ap, fmt); len = vsnprintf(b, current_len, fmt, ap); va_end(ap); if ((len > -1) && (len < current_len)) { break; } else if (len > -1) { current_len = len + 1; } else { current_len += NV_FMT_BUF_LEN; } free(b); b = xconfigAlloc(current_len); } switch (t) { case ParseErrorMsg: sprintf(scratch, "%d", configLineNo); pre = xconfigStrcat("Parse error on line ", scratch, " of section ", configSection, " in file ", configPath, ".\n", NULL); break; case ParseWarningMsg: sprintf(scratch, "%d", configLineNo); pre = xconfigStrcat("Parse warning on line ", scratch, " of section ", configSection, " in file ", configPath, ".\n", NULL); break; case ValidationErrorMsg: pre = xconfigStrcat("Data incomplete in file ", configPath, ".\n", NULL); break; case InternalErrorMsg: break; case WriteErrorMsg: break; case WarnMsg: break; case ErrorMsg: break; case DebugMsg: break; case UnknownMsg: break; } if (pre) { msg = xconfigStrcat(pre, b, NULL); } else { msg = strdup(b); } /* call back into the host to print the message */ xconfigPrint(t, msg); free(b); free(msg); if (pre) free(pre); } nvidia-settings/src/XF86Config-parser/Input.c0000664000175000017500000005102612236467170021213 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ /* View/edit this file with tab stops set to 4 */ #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" extern LexRec val; static XConfigSymTabRec InputTab[] = { {ENDSECTION, "endsection"}, {IDENTIFIER, "identifier"}, {OPTION, "option"}, {DRIVER, "driver"}, {-1, ""}, }; static XConfigSymTabRec InputClassTab[] = { {ENDSECTION, "endsection"}, {IDENTIFIER, "identifier"}, {MATCHPRODUCT, "matchproduct"}, {MATCHVENDOR, "matchvendor"}, {MATCHOS, "matchos"}, {MATCHDEVICEPATH, "matchdevicepath"}, {MATCHPNPID, "matchpnpid"}, {MATCHUSBID, "matchusbid"}, {MATCHDRIVER, "matchdriver"}, {MATCHTAG, "matchtag"}, {MATCHISKEYBOARD, "matchiskeyboard"}, {MATCHISJOYSTICK, "matchisjoystick"}, {MATCHISTABLET, "matchistablet"}, {MATCHISTOUCHSCREEN, "matchistouchscreen"}, {MATCHISTOUCHPAD, "matchistouchpad"}, {MATCHISPOINTER, "matchispointer"}, {OPTION, "option"}, {DRIVER, "driver"}, {-1, ""}, }; #define CLEANUP xconfigFreeInputList XConfigInputPtr xconfigParseInputSection (void) { int has_ident = FALSE; int token; PARSE_PROLOGUE (XConfigInputPtr, XConfigInputRec) while ((token = xconfigGetToken (InputTab)) != ENDSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case IDENTIFIER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Identifier"); if (has_ident == TRUE) Error (MULTIPLE_MSG, "Identifier"); ptr->identifier = val.str; has_ident = TRUE; break; case DRIVER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Driver"); ptr->driver = val.str; break; case OPTION: ptr->options = xconfigParseOption(ptr->options); break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } if (!has_ident) Error (NO_IDENT_MSG, NULL); return ptr; } #undef CLEANUP #define CLEANUP xconfigFreeInputClassList XConfigInputClassPtr xconfigParseInputClassSection (void) { int has_ident = FALSE; int token; PARSE_PROLOGUE (XConfigInputClassPtr, XConfigInputClassRec) while ((token = xconfigGetToken (InputClassTab)) != ENDSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case IDENTIFIER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Identifier"); if (has_ident == TRUE) Error (MULTIPLE_MSG, "Identifier"); ptr->identifier = val.str; has_ident = TRUE; break; case DRIVER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Driver"); ptr->driver = val.str; break; case MATCHDEVICEPATH: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "MatchDevicePath"); ptr->match_device_path = val.str; break; case MATCHISPOINTER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "MatchIsPointer"); ptr->match_is_pointer = val.str; break; case MATCHISTOUCHPAD: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "MatchIsTouchpad"); ptr->match_is_touchpad = val.str; break; case MATCHISKEYBOARD: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "MatchIsKeyboard"); ptr->match_is_keyboard = val.str; break; case MATCHISTOUCHSCREEN: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "MatchIsTouchscreen"); ptr->match_is_touchscreen = val.str; break; case MATCHISJOYSTICK: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "MatchIsJoystick"); ptr->match_is_joystick = val.str; break; case MATCHISTABLET: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "MatchIsTablet"); ptr->match_is_tablet = val.str; break; case MATCHUSBID: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "MatchUSBID"); ptr->match_usb_id = val.str; break; case MATCHPNPID: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "MatchPnPID"); ptr->match_pnp_id = val.str; break; case MATCHPRODUCT: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "MatchProduct"); ptr->match_product = val.str; break; case MATCHDRIVER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "MatchDriver"); ptr->match_driver = val.str; break; case MATCHOS: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "MatchOS"); ptr->match_os = val.str; break; case MATCHTAG: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "MatchTag"); ptr->match_tag = val.str; break; case MATCHVENDOR: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "MatchVendor"); ptr->match_vendor = val.str; break; case OPTION: ptr->options = xconfigParseOption(ptr->options); break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } if (!has_ident) Error (NO_IDENT_MSG, NULL); return ptr; } #undef CLEANUP void xconfigPrintInputSection (FILE * cf, XConfigInputPtr ptr) { while (ptr) { fprintf (cf, "Section \"InputDevice\"\n"); if (ptr->comment) fprintf (cf, "%s", ptr->comment); if (ptr->identifier) fprintf (cf, " Identifier \"%s\"\n", ptr->identifier); if (ptr->driver) fprintf (cf, " Driver \"%s\"\n", ptr->driver); xconfigPrintOptionList(cf, ptr->options, 1); fprintf (cf, "EndSection\n\n"); ptr = ptr->next; } } void xconfigPrintInputClassSection (FILE * cf, XConfigInputClassPtr ptr) { while (ptr) { fprintf (cf, "Section \"InputClass\"\n"); if (ptr->comment) fprintf (cf, "%s", ptr->comment); if (ptr->identifier) fprintf (cf, " Identifier \"%s\"\n", ptr->identifier); if (ptr->driver) fprintf (cf, " Driver \"%s\"\n", ptr->driver); if (ptr->match_is_pointer) fprintf (cf, " MatchIsPointer \"%s\"\n", ptr->match_is_pointer); if (ptr->match_is_touchpad) fprintf (cf, " MatchIsTouchpad \"%s\"\n", ptr->match_is_touchpad); if (ptr->match_is_keyboard) fprintf (cf, " MatchIsKeyboard \"%s\"\n", ptr->match_is_keyboard); if (ptr->match_is_joystick) fprintf (cf, " MatchIsJoystick \"%s\"\n", ptr->match_is_joystick); if (ptr->match_is_touchscreen) fprintf (cf, " MatchIsTouchscreen \"%s\"\n", ptr->match_is_touchscreen); if (ptr->match_is_tablet) fprintf (cf, " MatchIsTablet \"%s\"\n", ptr->match_is_tablet); if (ptr->match_device_path) fprintf (cf, " MatchDevicePath \"%s\"\n", ptr->match_device_path); if (ptr->match_os) fprintf (cf, " MatchOS \"%s\"\n", ptr->match_os); if (ptr->match_pnp_id) fprintf (cf, " MatchPnPID \"%s\"\n", ptr->match_pnp_id); if (ptr->match_driver) fprintf (cf, " MatchDriver \"%s\"\n", ptr->match_driver); if (ptr->match_usb_id) fprintf (cf, " MatchUSBID \"%s\"\n", ptr->match_usb_id); if (ptr->match_tag) fprintf (cf, " MatchTag \"%s\"\n", ptr->match_tag); if (ptr->match_vendor) fprintf (cf, " MatchVendor \"%s\"\n", ptr->match_vendor); xconfigPrintOptionList(cf, ptr->options, 1); fprintf (cf, "EndSection\n\n"); ptr = ptr->next; } } void xconfigFreeInputList (XConfigInputPtr *ptr) { XConfigInputPtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->identifier); TEST_FREE ((*ptr)->driver); TEST_FREE ((*ptr)->comment); xconfigFreeOptionList (&((*ptr)->options)); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } void xconfigFreeInputClassList (XConfigInputClassPtr *ptr) { XConfigInputClassPtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->identifier); TEST_FREE ((*ptr)->driver); TEST_FREE ((*ptr)->comment); TEST_FREE ((*ptr)->match_product); TEST_FREE ((*ptr)->match_vendor); TEST_FREE ((*ptr)->match_driver); TEST_FREE ((*ptr)->match_device_path); TEST_FREE ((*ptr)->match_os); TEST_FREE ((*ptr)->match_pnp_id); TEST_FREE ((*ptr)->match_usb_id); TEST_FREE ((*ptr)->match_is_pointer); TEST_FREE ((*ptr)->match_is_touchpad); TEST_FREE ((*ptr)->match_is_touchscreen); TEST_FREE ((*ptr)->match_is_keyboard); TEST_FREE ((*ptr)->match_is_tablet); TEST_FREE ((*ptr)->match_is_joystick); xconfigFreeOptionList (&((*ptr)->options)); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } int xconfigValidateInput (XConfigPtr p) { XConfigInputPtr input = p->inputs; #if 0 /* Enable this later */ if (!input) { xconfigErrorMsg(ValidationErrorMsg, "At least one InputDevice section " "is required."); return (FALSE); } #endif while (input) { if (!input->driver) { xconfigErrorMsg(ValidationErrorMsg, UNDEFINED_INPUTDRIVER_MSG, input->identifier); return (FALSE); } input = input->next; } return (TRUE); } XConfigInputPtr xconfigFindInput (const char *ident, XConfigInputPtr p) { while (p) { if (xconfigNameCompare (ident, p->identifier) == 0) return (p); p = p->next; } return (NULL); } XConfigInputPtr xconfigFindInputByDriver (const char *driver, XConfigInputPtr p) { while (p) { if (xconfigNameCompare (driver, p->driver) == 0) return (p); p = p->next; } return (NULL); } static int getCoreInputDevice(GenerateOptions *gop, XConfigPtr config, XConfigLayoutPtr layout, const int mouse, const char *coreKeyword, const char *implicitDriverName, const char *defaultDriver0, const char *defaultDriver1, const char *foundMsg0, const char *foundMsg1) { XConfigInputPtr input, core = NULL; XConfigInputrefPtr inputRef; int found, firstTry; const char *found_msg = NULL; /* * First check if the core input device has been specified in the * active ServerLayout. If more than one is specified, remove the * core attribute from the later ones. */ for (inputRef = layout->inputs; inputRef; inputRef = inputRef->next) { XConfigOptionPtr opt1 = NULL, opt2 = NULL; input = inputRef->input; opt1 = xconfigFindOption(input->options, coreKeyword); opt2 = xconfigFindOption(inputRef->options, coreKeyword); if (opt1 || opt2) { if (!core) { core = input; } else { if (opt1) { xconfigRemoveOption(&input->options, opt1); } if (opt2) { xconfigRemoveOption(&inputRef->options, opt2); } xconfigErrorMsg(WarnMsg, "Duplicate %s devices; removing %s " "attribute from \"%s\"\n", coreKeyword, coreKeyword, input->identifier); } } } /* * XXX XFree86 allows the commandline to override the core input * devices; let's not bother with that, here. */ /* * if we didn't find a core input device above in the * serverLayout, scan through the config's entire input list and * pick the first one with the coreKeyword. */ if (!core) { for (input = config->inputs; input; input = input->next) { if (xconfigFindOption(input->options, coreKeyword)) { core = input; found_msg = foundMsg0; break; } } } /* * if we didn't find a core input device above, then select the * first input with the correct driver */ firstTry = TRUE; tryAgain: if (!core) { input = xconfigFindInput(implicitDriverName, config->inputs); if (!input && defaultDriver0) { input = xconfigFindInputByDriver(defaultDriver0, config->inputs); } if (!input && defaultDriver1) { input = xconfigFindInputByDriver(defaultDriver1, config->inputs); } if (input) { core = input; found_msg = foundMsg1; } } /* * if we didn't find a core input device above, then that means we * don't have any input devices of this type; try to add a new * input device of this type, and then try again to find a core * input device */ if (!core && firstTry) { firstTry = FALSE; xconfigErrorMsg(WarnMsg, "Unable to find %s in X configuration; " "attempting to add new %s section.", coreKeyword, coreKeyword); if (mouse) { xconfigAddMouse(gop, config); } else { xconfigAddKeyboard(gop, config); } goto tryAgain; } /* * if we *still* can't find a core input device, print a warning * message and give up; hopefully the X server's builtin config * will do. */ if (!core) { xconfigErrorMsg(WarnMsg, "Unable to determine %s; will rely on X " "server's built-in default configuration.", coreKeyword); /* don't return FALSE here -- we don't want nvidia-xconfig to fail */ return TRUE; } /* * make sure the core input device is in the layout's input list */ found = FALSE; for (inputRef = layout->inputs; inputRef; inputRef = inputRef->next) { if (inputRef->input == core) { found = TRUE; break; } } if (!found) { inputRef = calloc(1, sizeof(XConfigInputrefRec)); inputRef->input = core; inputRef->input_name = strdup(core->identifier); inputRef->next = layout->inputs; layout->inputs = inputRef; } /* * make sure the core input device has the core keyword set */ for (inputRef = layout->inputs; inputRef; inputRef = inputRef->next) { if (inputRef->input == core) { XConfigOptionPtr opt1 = NULL, opt2 = NULL; opt1 = xconfigFindOption(inputRef->input->options, coreKeyword); opt2 = xconfigFindOption(inputRef->options, coreKeyword); if (!opt1 && !opt2) { xconfigAddNewOption(&inputRef->options, coreKeyword, NULL); } break; } } if (found_msg) { xconfigErrorMsg(WarnMsg, "The %s device was not specified explicitly " "in the layout; using the %s.\n", coreKeyword, found_msg); } return TRUE; } /* * xconfigCheckCoreInputDevices() - check that the specified layout has a * corePointer and coreKeyboard. If it does not have them, they will * be added from the current list of input devices. */ int xconfigCheckCoreInputDevices(GenerateOptions *gop, XConfigPtr config, XConfigLayoutPtr layout) { int ret; ret = getCoreInputDevice(gop, config, layout, TRUE, "CorePointer", CONF_IMPLICIT_POINTER, "mouse", NULL, "first CorePointer in the config input list", "first mouse device"); if (!ret) return FALSE; ret = getCoreInputDevice(gop, config, layout, FALSE, "CoreKeyboard", CONF_IMPLICIT_KEYBOARD, "keyboard", "kbd", "first CoreKeyboard in the config input list", "first keyboard device"); if (!ret) return FALSE; return TRUE; } nvidia-settings/src/XF86Config-parser/src.mk0000664000175000017500000000157112236467170021070 0ustar albertoalberto# makefile fragment included by nvidia-xconfig and nvidia-settings XCONFIG_PARSER_SRC += DRI.c XCONFIG_PARSER_SRC += Device.c XCONFIG_PARSER_SRC += Extensions.c XCONFIG_PARSER_SRC += Files.c XCONFIG_PARSER_SRC += Flags.c XCONFIG_PARSER_SRC += Generate.c XCONFIG_PARSER_SRC += Input.c XCONFIG_PARSER_SRC += Keyboard.c XCONFIG_PARSER_SRC += Layout.c XCONFIG_PARSER_SRC += Merge.c XCONFIG_PARSER_SRC += Module.c XCONFIG_PARSER_SRC += Monitor.c XCONFIG_PARSER_SRC += Pointer.c XCONFIG_PARSER_SRC += Read.c XCONFIG_PARSER_SRC += Scan.c XCONFIG_PARSER_SRC += Screen.c XCONFIG_PARSER_SRC += Util.c XCONFIG_PARSER_SRC += Vendor.c XCONFIG_PARSER_SRC += Video.c XCONFIG_PARSER_SRC += Write.c XCONFIG_PARSER_EXTRA_DIST += Configint.h XCONFIG_PARSER_EXTRA_DIST += configProcs.h XCONFIG_PARSER_EXTRA_DIST += xf86Parser.h XCONFIG_PARSER_EXTRA_DIST += xf86tokens.h XCONFIG_PARSER_EXTRA_DIST += src.mk nvidia-settings/src/XF86Config-parser/Merge.c0000664000175000017500000005536112236467170021161 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" /* * xconfigAddRemovedOptionComment() - Makes a note in the comment * string "existing_comments" that a particular option has been * removed. * */ static void xconfigAddRemovedOptionComment(char **existing_comments, XConfigOptionPtr option) { int len; char *str; char *name, *value; if (!option || !existing_comments) return; name = xconfigOptionName(option); value = xconfigOptionValue(option); if (!name) return; if (value) { len = 32 + strlen(name) + strlen(value); str = malloc(len); if (!str) return; snprintf(str, len, "# Removed Option \"%s\" \"%s\"", name, value); } else { len = 32 + strlen(name); str = malloc(len); if (!str) return; snprintf(str, len, "# Removed Option \"%s\"", name); } *existing_comments = xconfigAddComment(*existing_comments, str); } /* xconfigAddRemovedOptionComment() */ /* * xconfigRemoveNamedOption() - Removes the named option from an option * list and (if specified) adds a comment to an existing comments string * */ void xconfigRemoveNamedOption(XConfigOptionPtr *pHead, const char *name, char **comments) { XConfigOptionPtr option; option = xconfigFindOption(*pHead, name); if (option) { if (comments) { xconfigAddRemovedOptionComment(comments, option); } xconfigRemoveOption(pHead, option); } } /* xconfigRemoveNamedOption() */ /* * xconfigOptionValuesDiffer() - return '1' if the option values for * option0 and option1 are different; return '0' if the option values * are the same. */ static int xconfigOptionValuesDiffer(XConfigOptionPtr option0, XConfigOptionPtr option1) { char *value0, *value1; value0 = value1 = NULL; if (!option0 && !option1) return 0; if (!option0 && option1) return 1; if ( option0 && !option1) return 1; value0 = xconfigOptionValue(option0); value1 = xconfigOptionValue(option1); if (!value0 && !value1) return 0; if (!value0 && value1) return 1; if ( value0 && !value1) return 1; return (strcmp(value0, value1) != 0); } /* xconfigOptionValuesDiffer() */ /* * xconfigMergeOption() - Merge option "name" from option source * list "srcHead" to option destination list "dstHead". * * Merging here means: * * If the option is not in the source config, do nothing to the * destination. Otherwise, either add or update the option in * the dest. If the option is modified, and a comment is given, * then the old option will be commented out instead of being * simply removed/replaced. */ static void xconfigMergeOption(XConfigOptionPtr *dstHead, XConfigOptionPtr *srcHead, const char *name, char **comments) { XConfigOptionPtr srcOption = xconfigFindOption(*srcHead, name); XConfigOptionPtr dstOption = xconfigFindOption(*dstHead, name); char *srcValue = NULL; if (!srcOption) { /* Option does not exist in src, do nothing to dst. */ return; } srcValue = xconfigOptionValue(srcOption); if (srcOption && !dstOption) { /* option exists in src but not in dst: add to dst */ xconfigAddNewOption(dstHead, name, srcValue); } else if (srcOption && dstOption) { /* * option exists in src and in dst; if the option values are * different, replace the dst's option value with src's option * value; note that xconfigAddNewOption() will remove the old * option first, if necessary */ if (xconfigOptionValuesDiffer(srcOption, dstOption)) { if (comments) { xconfigAddRemovedOptionComment(comments, dstOption); } xconfigAddNewOption(dstHead, name, srcValue); } } } /* xconfigMergeOption() */ /* * xconfigMergeFlags() - Updates the destination's list of server flag * options with the options found in the source config. * * Optons in the destination are either added or updated. Options that * are found in the destination config and not in the source config are * not modified. * * Returns 1 if the merge was successful and 0 if not. */ static int xconfigMergeFlags(XConfigPtr dstConfig, XConfigPtr srcConfig) { if (srcConfig->flags) { XConfigOptionPtr option; /* Flag section was not found, create a new one */ if (!dstConfig->flags) { dstConfig->flags = (XConfigFlagsPtr) calloc(1, sizeof(XConfigFlagsRec)); if (!dstConfig->flags) return 0; } option = srcConfig->flags->options; while (option) { xconfigMergeOption(&(dstConfig->flags->options), &(srcConfig->flags->options), xconfigOptionName(option), &(dstConfig->flags->comment)); option = option->next; } } return 1; } /* xconfigMergeFlags() */ /* * xconfigMergeMonitors() - Updates information in the destination monitor * with that of the source monitor. * */ static void xconfigMergeMonitors(XConfigMonitorPtr dstMonitor, XConfigMonitorPtr srcMonitor) { int i; /* Update vendor */ free(dstMonitor->vendor); dstMonitor->vendor = xconfigStrdup(srcMonitor->vendor); /* Update modelname */ free(dstMonitor->modelname); dstMonitor->modelname = xconfigStrdup(srcMonitor->modelname); /* Update horizontal sync */ dstMonitor->n_hsync = srcMonitor->n_hsync; for (i = 0; i < srcMonitor->n_hsync; i++) { dstMonitor->hsync[i].lo = srcMonitor->hsync[i].lo; dstMonitor->hsync[i].hi = srcMonitor->hsync[i].hi; } /* Update vertical sync */ dstMonitor->n_vrefresh = srcMonitor->n_vrefresh; for (i = 0; i < srcMonitor->n_hsync; i++) { dstMonitor->vrefresh[i].lo = srcMonitor->vrefresh[i].lo; dstMonitor->vrefresh[i].hi = srcMonitor->vrefresh[i].hi; } /* XXX Remove the destination monitor's "UseModes" references to * avoid having the wrong modelines tied to the new monitor. */ xconfigFreeModesLinkList(&dstMonitor->modes_sections); } /* xconfigMergeMonitors() */ /* * xconfigMergeAllMonitors() - This function ensures that all monitors in * the source config appear in the destination config by adding and/or * updating the "appropriate" destination monitor sections. * */ static int xconfigMergeAllMonitors(XConfigPtr dstConfig, XConfigPtr srcConfig) { XConfigMonitorPtr dstMonitor; XConfigMonitorPtr srcMonitor; /* Make sure all monitors in the src config are also in the dst config */ for (srcMonitor = srcConfig->monitors; srcMonitor; srcMonitor = srcMonitor->next) { dstMonitor = xconfigFindMonitor(srcMonitor->identifier, dstConfig->monitors); /* Monitor section was not found, create a new one and add it */ if (!dstMonitor) { dstMonitor = (XConfigMonitorPtr) calloc(1, sizeof(XConfigMonitorRec)); if (!dstMonitor) return 0; dstMonitor->identifier = xconfigStrdup(srcMonitor->identifier); xconfigAddListItem((GenericListPtr *)(&dstConfig->monitors), (GenericListPtr)dstMonitor); } /* Do the merge */ xconfigMergeMonitors(dstMonitor, srcMonitor); } return 1; } /* xconfigMergeAllMonitors() */ /* * xconfigMergeDevices() - Updates information in the destination device * with that of the source device. * */ static void xconfigMergeDevices(XConfigDevicePtr dstDevice, XConfigDevicePtr srcDevice) { // XXX Zero out the device section? /* Update driver */ free(dstDevice->driver); dstDevice->driver = xconfigStrdup(srcDevice->driver); /* Update vendor */ free(dstDevice->vendor); dstDevice->vendor = xconfigStrdup(srcDevice->vendor); /* Update bus ID */ free(dstDevice->busid); dstDevice->busid = xconfigStrdup(srcDevice->busid); /* Update board */ free(dstDevice->board); dstDevice->board = xconfigStrdup(srcDevice->board); /* Update chip info */ dstDevice->chipid = srcDevice->chipid; dstDevice->chiprev = srcDevice->chiprev; /* Update IRQ */ dstDevice->irq = srcDevice->irq; /* Update screen */ dstDevice->screen = srcDevice->screen; } /* xconfigMergeDevices() */ /* * xconfigMergeAllDevices() - This function ensures that all devices in * the source config appear in the destination config by adding and/or * updating the "appropriate" destination device sections. * */ static int xconfigMergeAllDevices(XConfigPtr dstConfig, XConfigPtr srcConfig) { XConfigDevicePtr dstDevice; XConfigDevicePtr srcDevice; /* Make sure all monitors in the src config are also in the dst config */ for (srcDevice = srcConfig->devices; srcDevice; srcDevice = srcDevice->next) { dstDevice = xconfigFindDevice(srcDevice->identifier, dstConfig->devices); /* Device section was not found, create a new one and add it */ if (!dstDevice) { dstDevice = (XConfigDevicePtr) calloc(1, sizeof(XConfigDeviceRec)); if (!dstDevice) return 0; dstDevice->identifier = xconfigStrdup(srcDevice->identifier); xconfigAddListItem((GenericListPtr *)(&dstConfig->devices), (GenericListPtr)dstDevice); } /* Do the merge */ xconfigMergeDevices(dstDevice, srcDevice); } return 1; } /* xconfigMergeAllDevices() */ /* * xconfigMergeDriverOptions() - Update the (Screen) driver options * of the destination config with information from the source config. * * - Assumes the source options are all found in the srcScreen->options. * - Updates only those options listed in the srcScreen->options. * */ static int xconfigMergeDriverOptions(XConfigScreenPtr dstScreen, XConfigScreenPtr srcScreen) { XConfigOptionPtr option; XConfigDisplayPtr display; option = srcScreen->options; while (option) { char *name = xconfigOptionName(option); /* Remove the option from all non-screen option lists */ if (dstScreen->device) { xconfigRemoveNamedOption(&(dstScreen->device->options), name, &(dstScreen->device->comment)); } if (dstScreen->monitor) { xconfigRemoveNamedOption(&(dstScreen->monitor->options), name, &(dstScreen->monitor->comment)); } for (display = dstScreen->displays; display; display = display->next) { xconfigRemoveNamedOption(&(display->options), name, &(display->comment)); } /* Update/Add the option to the screen's option list */ { // XXX Only add a comment if the value changed. XConfigOptionPtr old = xconfigFindOption(dstScreen->options, name); if (old && xconfigOptionValuesDiffer(option, old)) { xconfigRemoveNamedOption(&(dstScreen->options), name, &(dstScreen->comment)); } else { xconfigRemoveNamedOption(&(dstScreen->options), name, NULL); } } /* Add the option to the screen->options list */ xconfigAddNewOption(&dstScreen->options, name, xconfigOptionValue(option)); option = option->next; } return 1; } /* xconfigMergeDriverOptions() */ /* * xconfigMergeDisplays() - Duplicates display information from the * source screen to the destination screen. * */ static int xconfigMergeDisplays(XConfigScreenPtr dstScreen, XConfigScreenPtr srcScreen) { XConfigDisplayPtr dstDisplay; XConfigDisplayPtr srcDisplay; XConfigModePtr srcMode, dstMode, lastDstMode; /* Free all the displays in the destination screen */ xconfigFreeDisplayList(&dstScreen->displays); /* Copy all te displays */ for (srcDisplay = srcScreen->displays; srcDisplay; srcDisplay = srcDisplay->next) { /* Create a new display */ dstDisplay = xconfigAlloc(sizeof(XConfigDisplayRec)); if (!dstDisplay) return 0; /* Copy display fields */ dstDisplay->frameX0 = srcDisplay->frameX0; dstDisplay->frameY0 = srcDisplay->frameY0; dstDisplay->virtualX = srcDisplay->virtualX; dstDisplay->virtualY = srcDisplay->virtualY; dstDisplay->depth = srcDisplay->depth; dstDisplay->bpp = srcDisplay->bpp; dstDisplay->visual = xconfigStrdup(srcDisplay->visual); dstDisplay->weight = srcDisplay->weight; dstDisplay->black = srcDisplay->black; dstDisplay->white = srcDisplay->white; dstDisplay->comment = xconfigStrdup(srcDisplay->comment); /* Copy options over */ dstDisplay->options = xconfigOptionListDup(srcDisplay->options); /* Copy modes over */ lastDstMode = NULL; srcMode = srcDisplay->modes; dstMode = NULL; while (srcMode) { /* Copy the mode */ xconfigAddMode(&dstMode, srcMode->mode_name); /* Add mode at the end of the list */ if ( !lastDstMode ) { dstDisplay->modes = dstMode; } else { lastDstMode->next = dstMode; } lastDstMode = dstMode; srcMode = srcMode->next; } xconfigAddListItem((GenericListPtr *)(&dstScreen->displays), (GenericListPtr)dstDisplay); } return 1; } /* xconfigMergeDisplays() */ /* * xconfigMergeScreens() - Updates information in the destination screen * with that of the source screen. * * NOTE: This assumes the Monitor and Device sections have already been * merged. * */ static void xconfigMergeScreens(XConfigScreenPtr dstScreen, XConfigPtr dstConfig, XConfigScreenPtr srcScreen, XConfigPtr srcConfig) { /* Use the right device */ free(dstScreen->device_name); dstScreen->device_name = xconfigStrdup(srcScreen->device_name); dstScreen->device = xconfigFindDevice(dstScreen->device_name, dstConfig->devices); /* Use the right monitor */ free(dstScreen->monitor_name); dstScreen->monitor_name = xconfigStrdup(srcScreen->monitor_name); dstScreen->monitor = xconfigFindMonitor(dstScreen->monitor_name, dstConfig->monitors); /* Update the right default depth */ dstScreen->defaultdepth = srcScreen->defaultdepth; /* Copy over the display section */ xconfigMergeDisplays(dstScreen, srcScreen); /* Update the screen's driver options */ xconfigMergeDriverOptions(dstScreen, srcScreen); } /* xconfigMergeScreens() */ /* * xconfigMergeAllScreens() - This function ensures that all screens in * the source config appear in the destination config by adding and/or * updating the "appropriate" destination screen sections. * */ static int xconfigMergeAllScreens(XConfigPtr dstConfig, XConfigPtr srcConfig) { XConfigScreenPtr srcScreen; XConfigScreenPtr dstScreen; /* Make sure all src screens are in the dst config */ for (srcScreen = srcConfig->screens; srcScreen; srcScreen = srcScreen->next) { dstScreen = xconfigFindScreen(srcScreen->identifier, dstConfig->screens); /* Screen section was not found, create a new one and add it */ if (!dstScreen) { dstScreen = (XConfigScreenPtr) calloc(1, sizeof(XConfigScreenRec)); if (!dstScreen) return 0; dstScreen->identifier = xconfigStrdup(srcScreen->identifier); xconfigAddListItem((GenericListPtr *)(&dstConfig->screens), (GenericListPtr)dstScreen); } /* Do the merge */ xconfigMergeScreens(dstScreen, dstConfig, srcScreen, srcConfig); } return 1; } /* xconfigMergeAllScreens() */ /* * xconfigMergeLayout() - Updates information in the destination's first * layout with that of the source's first layout. * */ static int xconfigMergeLayout(XConfigPtr dstConfig, XConfigPtr srcConfig) { XConfigLayoutPtr srcLayout = srcConfig->layouts; XConfigLayoutPtr dstLayout = dstConfig->layouts; XConfigAdjacencyPtr srcAdj; XConfigAdjacencyPtr dstAdj; XConfigAdjacencyPtr lastDstAdj; if (!dstLayout || !srcLayout) { return 0; } /* Clear the destination's adjacency list */ xconfigFreeAdjacencyList(&dstLayout->adjacencies); /* Copy adjacencies over */ lastDstAdj = NULL; srcAdj = srcLayout->adjacencies; while (srcAdj) { /* Copy the adjacency */ dstAdj = (XConfigAdjacencyPtr) calloc(1, sizeof(XConfigAdjacencyRec)); dstAdj->scrnum = srcAdj->scrnum; dstAdj->screen_name = xconfigStrdup(srcAdj->screen_name); dstAdj->top_name = xconfigStrdup(srcAdj->top_name); dstAdj->bottom_name = xconfigStrdup(srcAdj->bottom_name); dstAdj->left_name = xconfigStrdup(srcAdj->left_name); dstAdj->right_name = xconfigStrdup(srcAdj->right_name); dstAdj->where = srcAdj->where; dstAdj->x = srcAdj->x; dstAdj->y = srcAdj->y; dstAdj->refscreen = xconfigStrdup(srcAdj->refscreen); dstAdj->screen = xconfigFindScreen(dstAdj->screen_name, dstConfig->screens); dstAdj->top = xconfigFindScreen(dstAdj->top_name, dstConfig->screens); dstAdj->bottom = xconfigFindScreen(dstAdj->bottom_name, dstConfig->screens); dstAdj->left = xconfigFindScreen(dstAdj->left_name, dstConfig->screens); dstAdj->right = xconfigFindScreen(dstAdj->right_name, dstConfig->screens); /* Add adjacency at the end of the list */ if (!lastDstAdj) { dstLayout->adjacencies = dstAdj; } else { lastDstAdj->next = dstAdj; } lastDstAdj = dstAdj; srcAdj = srcAdj->next; } /* Merge the options */ if (srcLayout->options) { XConfigOptionPtr srcOption; srcOption = srcLayout->options; while (srcOption) { xconfigMergeOption(&(dstLayout->options), &(srcLayout->options), xconfigOptionName(srcOption), &(dstLayout->comment)); srcOption = srcOption->next; } } return 1; } /* xconfigMergeLayout() */ /* * xconfigMergeExtensions() - Updates information in the destination's extension * section with that of the source's extension section. * Currently considering composite extension only. * */ static int xconfigMergeExtensions(XConfigPtr dstConfig, XConfigPtr srcConfig) { if (srcConfig->extensions) { XConfigOptionPtr option; /* Extension section was not found, create a new one */ if (!dstConfig->extensions) { dstConfig->extensions = (XConfigExtensionsPtr) calloc(1, sizeof(XConfigExtensionsRec)); if (!dstConfig->extensions) return 0; } option = srcConfig->extensions->options; while (option) { xconfigMergeOption(&(dstConfig->extensions->options), &(srcConfig->extensions->options), xconfigOptionName(option), &(dstConfig->extensions->comment)); option = option->next; } } return 1; } /* xconfigMergeExtensions() */ /* * xconfigMergeConfigs() - Merges the source X configuration with the * destination X configuration. * * NOTE: This function is currently only used for merging X config files * for display configuration reasons. As such, the merge assumes * that the dst config file is the target config file and that * mostly, only new display configuration information should be * copied from the source X config to the destination X config. * */ int xconfigMergeConfigs(XConfigPtr dstConfig, XConfigPtr srcConfig) { /* Make sure the X config is valid */ // make_xconfig_usable(dstConfig); /* Merge the server flag (Xinerama) section */ if (!xconfigMergeFlags(dstConfig, srcConfig)) { return 0; } /* Merge the monitor sections */ if (!xconfigMergeAllMonitors(dstConfig, srcConfig)) { return 0; } /* Merge the device sections */ if (!xconfigMergeAllDevices(dstConfig, srcConfig)) { return 0; } /* Merge the screen sections */ if (!xconfigMergeAllScreens(dstConfig, srcConfig)) { return 0; } /* Merge the first layout */ if (!xconfigMergeLayout(dstConfig, srcConfig)) { return 0; } /* Merge the extensions */ if (!xconfigMergeExtensions(dstConfig, srcConfig)) { return 0; } return 1; } /* xconfigMergeConfigs() */ nvidia-settings/src/XF86Config-parser/Monitor.c0000664000175000017500000007351212236467170021547 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ /* View/edit this file with tab stops set to 4 */ #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" extern LexRec val; static XConfigSymTabRec MonitorTab[] = { {ENDSECTION, "endsection"}, {IDENTIFIER, "identifier"}, {VENDOR, "vendorname"}, {MODEL, "modelname"}, {USEMODES, "usemodes"}, {MODELINE, "modeline"}, {DISPLAYSIZE, "displaysize"}, {HORIZSYNC, "horizsync"}, {VERTREFRESH, "vertrefresh"}, {MODE, "mode"}, {GAMMA, "gamma"}, {OPTION, "option"}, {-1, ""}, }; static XConfigSymTabRec ModesTab[] = { {ENDSECTION, "endsection"}, {IDENTIFIER, "identifier"}, {MODELINE, "modeline"}, {MODE, "mode"}, {-1, ""}, }; static XConfigSymTabRec TimingTab[] = { {TT_INTERLACE, "interlace"}, {TT_PHSYNC, "+hsync"}, {TT_NHSYNC, "-hsync"}, {TT_PVSYNC, "+vsync"}, {TT_NVSYNC, "-vsync"}, {TT_CSYNC, "composite"}, {TT_PCSYNC, "+csync"}, {TT_NCSYNC, "-csync"}, {TT_DBLSCAN, "doublescan"}, {TT_HSKEW, "hskew"}, {TT_BCAST, "bcast"}, {TT_VSCAN, "vscan"}, {TT_CUSTOM, "CUSTOM"}, {-1, ""}, }; static XConfigSymTabRec ModeTab[] = { {DOTCLOCK, "dotclock"}, {HTIMINGS, "htimings"}, {VTIMINGS, "vtimings"}, {FLAGS, "flags"}, {HSKEW, "hskew"}, {BCAST, "bcast"}, {VSCAN, "vscan"}, {ENDMODE, "endmode"}, {-1, ""}, }; #define CLEANUP xconfigFreeModeLineList XConfigModeLinePtr xconfigParseModeLine (void) { int token; PARSE_PROLOGUE (XConfigModeLinePtr, XConfigModeLineRec) /* Identifier */ if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error ("ModeLine identifier expected", NULL); ptr->identifier = val.str; /* DotClock */ if ((xconfigGetSubToken (&(ptr->comment)) != NUMBER) || !val.str) Error ("ModeLine dotclock expected", NULL); ptr->clock = xconfigStrdup(val.str); /* HDisplay */ if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error ("ModeLine Hdisplay expected", NULL); ptr->hdisplay = val.num; /* HSyncStart */ if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error ("ModeLine HSyncStart expected", NULL); ptr->hsyncstart = val.num; /* HSyncEnd */ if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error ("ModeLine HSyncEnd expected", NULL); ptr->hsyncend = val.num; /* HTotal */ if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error ("ModeLine HTotal expected", NULL); ptr->htotal = val.num; /* VDisplay */ if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error ("ModeLine Vdisplay expected", NULL); ptr->vdisplay = val.num; /* VSyncStart */ if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error ("ModeLine VSyncStart expected", NULL); ptr->vsyncstart = val.num; /* VSyncEnd */ if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error ("ModeLine VSyncEnd expected", NULL); ptr->vsyncend = val.num; /* VTotal */ if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error ("ModeLine VTotal expected", NULL); ptr->vtotal = val.num; token = xconfigGetSubTokenWithTab (&(ptr->comment), TimingTab); while ((token == TT_INTERLACE) || (token == TT_PHSYNC) || (token == TT_NHSYNC) || (token == TT_PVSYNC) || (token == TT_NVSYNC) || (token == TT_CSYNC) || (token == TT_PCSYNC) || (token == TT_NCSYNC) || (token == TT_DBLSCAN) || (token == TT_HSKEW) || (token == TT_VSCAN) || (token == TT_BCAST)) { switch (token) { case TT_INTERLACE: ptr->flags |= XCONFIG_MODE_INTERLACE; break; case TT_PHSYNC: ptr->flags |= XCONFIG_MODE_PHSYNC; break; case TT_NHSYNC: ptr->flags |= XCONFIG_MODE_NHSYNC; break; case TT_PVSYNC: ptr->flags |= XCONFIG_MODE_PVSYNC; break; case TT_NVSYNC: ptr->flags |= XCONFIG_MODE_NVSYNC; break; case TT_CSYNC: ptr->flags |= XCONFIG_MODE_CSYNC; break; case TT_PCSYNC: ptr->flags |= XCONFIG_MODE_PCSYNC; break; case TT_NCSYNC: ptr->flags |= XCONFIG_MODE_NCSYNC; break; case TT_DBLSCAN: ptr->flags |= XCONFIG_MODE_DBLSCAN; break; case TT_HSKEW: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (NUMBER_MSG, "Hskew"); ptr->hskew = val.num; ptr->flags |= XCONFIG_MODE_HSKEW; break; case TT_BCAST: ptr->flags |= XCONFIG_MODE_BCAST; break; case TT_VSCAN: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (NUMBER_MSG, "Vscan"); ptr->vscan = val.num; ptr->flags |= XCONFIG_MODE_VSCAN; break; case TT_CUSTOM: ptr->flags |= XCONFIG_MODE_CUSTOM; break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } token = xconfigGetSubTokenWithTab (&(ptr->comment), TimingTab); } xconfigUnGetToken (token); return (ptr); } XConfigModeLinePtr xconfigParseVerboseMode (void) { int token, token2; int had_dotclock = 0, had_htimings = 0, had_vtimings = 0; PARSE_PROLOGUE (XConfigModeLinePtr, XConfigModeLineRec) if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error ("Mode name expected", NULL); ptr->identifier = val.str; while ((token = xconfigGetToken (ModeTab)) != ENDMODE) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case DOTCLOCK: if ((xconfigGetSubToken (&(ptr->comment)) != NUMBER) || !val.str) Error (NUMBER_MSG, "DotClock"); ptr->clock = xconfigStrdup(val.str); had_dotclock = 1; break; case HTIMINGS: if (xconfigGetSubToken (&(ptr->comment)) == NUMBER) ptr->hdisplay = val.num; else Error ("Horizontal display expected", NULL); if (xconfigGetSubToken (&(ptr->comment)) == NUMBER) ptr->hsyncstart = val.num; else Error ("Horizontal sync start expected", NULL); if (xconfigGetSubToken (&(ptr->comment)) == NUMBER) ptr->hsyncend = val.num; else Error ("Horizontal sync end expected", NULL); if (xconfigGetSubToken (&(ptr->comment)) == NUMBER) ptr->htotal = val.num; else Error ("Horizontal total expected", NULL); had_htimings = 1; break; case VTIMINGS: if (xconfigGetSubToken (&(ptr->comment)) == NUMBER) ptr->vdisplay = val.num; else Error ("Vertical display expected", NULL); if (xconfigGetSubToken (&(ptr->comment)) == NUMBER) ptr->vsyncstart = val.num; else Error ("Vertical sync start expected", NULL); if (xconfigGetSubToken (&(ptr->comment)) == NUMBER) ptr->vsyncend = val.num; else Error ("Vertical sync end expected", NULL); if (xconfigGetSubToken (&(ptr->comment)) == NUMBER) ptr->vtotal = val.num; else Error ("Vertical total expected", NULL); had_vtimings = 1; break; case FLAGS: token = xconfigGetSubToken (&(ptr->comment)); if (token != STRING) Error (QUOTE_MSG, "Flags"); while (token == STRING) { token2 = xconfigGetStringToken (TimingTab); switch (token2) { case TT_INTERLACE: ptr->flags |= XCONFIG_MODE_INTERLACE; break; case TT_PHSYNC: ptr->flags |= XCONFIG_MODE_PHSYNC; break; case TT_NHSYNC: ptr->flags |= XCONFIG_MODE_NHSYNC; break; case TT_PVSYNC: ptr->flags |= XCONFIG_MODE_PVSYNC; break; case TT_NVSYNC: ptr->flags |= XCONFIG_MODE_NVSYNC; break; case TT_CSYNC: ptr->flags |= XCONFIG_MODE_CSYNC; break; case TT_PCSYNC: ptr->flags |= XCONFIG_MODE_PCSYNC; break; case TT_NCSYNC: ptr->flags |= XCONFIG_MODE_NCSYNC; break; case TT_DBLSCAN: ptr->flags |= XCONFIG_MODE_DBLSCAN; break; case TT_CUSTOM: ptr->flags |= XCONFIG_MODE_CUSTOM; break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error ("Unknown flag string", NULL); break; } token = xconfigGetSubToken (&(ptr->comment)); } xconfigUnGetToken (token); break; case HSKEW: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error ("Horizontal skew expected", NULL); ptr->flags |= XCONFIG_MODE_HSKEW; ptr->hskew = val.num; break; case VSCAN: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error ("Vertical scan count expected", NULL); ptr->flags |= XCONFIG_MODE_VSCAN; ptr->vscan = val.num; break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error ("Unexepcted token in verbose \"Mode\" entry\n", NULL); } } if (!had_dotclock) Error ("the dotclock is missing", NULL); if (!had_htimings) Error ("the horizontal timings are missing", NULL); if (!had_vtimings) Error ("the vertical timings are missing", NULL); return (ptr); } #undef CLEANUP #define CLEANUP xconfigFreeMonitorList XConfigMonitorPtr xconfigParseMonitorSection (void) { int has_ident = FALSE; int token; PARSE_PROLOGUE (XConfigMonitorPtr, XConfigMonitorRec) while ((token = xconfigGetToken (MonitorTab)) != ENDSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case IDENTIFIER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Identifier"); if (has_ident == TRUE) Error (MULTIPLE_MSG, "Identifier"); ptr->identifier = val.str; has_ident = TRUE; break; case VENDOR: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Vendor"); ptr->vendor = val.str; break; case MODEL: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "ModelName"); ptr->modelname = val.str; break; case MODE: HANDLE_LIST (modelines, xconfigParseVerboseMode, XConfigModeLinePtr); break; case MODELINE: HANDLE_LIST (modelines, xconfigParseModeLine, XConfigModeLinePtr); break; case DISPLAYSIZE: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (DISPLAYSIZE_MSG, NULL); ptr->width = val.realnum; if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (DISPLAYSIZE_MSG, NULL); ptr->height = val.realnum; break; case HORIZSYNC: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (HORIZSYNC_MSG, NULL); do { ptr->hsync[ptr->n_hsync].lo = val.realnum; switch (token = xconfigGetSubToken (&(ptr->comment))) { case COMMA: ptr->hsync[ptr->n_hsync].hi = ptr->hsync[ptr->n_hsync].lo; break; case DASH: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER || (float)val.realnum < ptr->hsync[ptr->n_hsync].lo) Error (HORIZSYNC_MSG, NULL); ptr->hsync[ptr->n_hsync].hi = val.realnum; if ((token = xconfigGetSubToken (&(ptr->comment))) == COMMA) break; ptr->n_hsync++; goto HorizDone; default: /* We cannot currently know if a '\n' was found, * or this is a real error */ ptr->hsync[ptr->n_hsync].hi = ptr->hsync[ptr->n_hsync].lo; ptr->n_hsync++; goto HorizDone; } if (ptr->n_hsync >= CONF_MAX_HSYNC) Error ("Sorry. Too many horizontal sync intervals.", NULL); ptr->n_hsync++; } while ((token = xconfigGetSubToken (&(ptr->comment))) == NUMBER); HorizDone: xconfigUnGetToken (token); break; case VERTREFRESH: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (VERTREFRESH_MSG, NULL); do { ptr->vrefresh[ptr->n_vrefresh].lo = val.realnum; switch (token = xconfigGetSubToken (&(ptr->comment))) { case COMMA: ptr->vrefresh[ptr->n_vrefresh].hi = ptr->vrefresh[ptr->n_vrefresh].lo; break; case DASH: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER || (float)val.realnum < ptr->vrefresh[ptr->n_vrefresh].lo) Error (VERTREFRESH_MSG, NULL); ptr->vrefresh[ptr->n_vrefresh].hi = val.realnum; if ((token = xconfigGetSubToken (&(ptr->comment))) == COMMA) break; ptr->n_vrefresh++; goto VertDone; default: /* We cannot currently know if a '\n' was found, * or this is a real error */ ptr->vrefresh[ptr->n_vrefresh].hi = ptr->vrefresh[ptr->n_vrefresh].lo; ptr->n_vrefresh++; goto VertDone; } if (ptr->n_vrefresh >= CONF_MAX_VREFRESH) Error ("Sorry. Too many vertical refresh intervals.", NULL); ptr->n_vrefresh++; } while ((token = xconfigGetSubToken (&(ptr->comment))) == NUMBER); VertDone: xconfigUnGetToken (token); break; case GAMMA: if( xconfigGetSubToken (&(ptr->comment)) != NUMBER ) { Error (INVALID_GAMMA_MSG, NULL); } else { ptr->gamma_red = ptr->gamma_green = ptr->gamma_blue = val.realnum; if( xconfigGetSubToken (&(ptr->comment)) == NUMBER ) { ptr->gamma_green = val.realnum; if( xconfigGetSubToken (&(ptr->comment)) == NUMBER ) { ptr->gamma_blue = val.realnum; } else { Error (INVALID_GAMMA_MSG, NULL); } } else xconfigUnGetToken (token); } break; case OPTION: ptr->options = xconfigParseOption(ptr->options); break; case USEMODES: { XConfigModesLinkPtr mptr; if ((token = xconfigGetSubToken (&(ptr->comment))) != STRING) Error (QUOTE_MSG, "UseModes"); /* add to the end of the list of modes sections referenced here */ mptr = calloc (1, sizeof (XConfigModesLinkRec)); mptr->next = NULL; mptr->modes_name = val.str; mptr->modes = NULL; xconfigAddListItem((GenericListPtr *)(&ptr->modes_sections), (GenericListPtr)mptr); } break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: xconfigErrorMsg(ParseErrorMsg, INVALID_KEYWORD_MSG, xconfigTokenString()); CLEANUP (&ptr); return NULL; break; } } if (!has_ident) Error (NO_IDENT_MSG, NULL); return ptr; } #undef CLEANUP #define CLEANUP xconfigFreeModesList XConfigModesPtr xconfigParseModesSection (void) { int has_ident = FALSE; int token; PARSE_PROLOGUE (XConfigModesPtr, XConfigModesRec) while ((token = xconfigGetToken (ModesTab)) != ENDSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case IDENTIFIER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Identifier"); if (has_ident == TRUE) Error (MULTIPLE_MSG, "Identifier"); ptr->identifier = val.str; has_ident = TRUE; break; case MODE: HANDLE_LIST (modelines, xconfigParseVerboseMode, XConfigModeLinePtr); break; case MODELINE: HANDLE_LIST (modelines, xconfigParseModeLine, XConfigModeLinePtr); break; default: xconfigErrorMsg(ParseErrorMsg, INVALID_KEYWORD_MSG, xconfigTokenString()); CLEANUP (&ptr); return NULL; break; } } if (!has_ident) Error (NO_IDENT_MSG, NULL); return ptr; } #undef CLEANUP void xconfigPrintMonitorSection (FILE * cf, XConfigMonitorPtr ptr) { int i; XConfigModeLinePtr mlptr; XConfigModesLinkPtr mptr; while (ptr) { mptr = ptr->modes_sections; fprintf (cf, "Section \"Monitor\"\n"); if (ptr->comment) fprintf (cf, "%s", ptr->comment); if (ptr->identifier) fprintf (cf, " Identifier \"%s\"\n", ptr->identifier); if (ptr->vendor) fprintf (cf, " VendorName \"%s\"\n", ptr->vendor); if (ptr->modelname) fprintf (cf, " ModelName \"%s\"\n", ptr->modelname); while (mptr) { fprintf (cf, " UseModes \"%s\"\n", mptr->modes_name); mptr = mptr->next; } if (ptr->width) fprintf (cf, " DisplaySize %d %d\n", ptr->width, ptr->height); for (i = 0; i < ptr->n_hsync; i++) { fprintf (cf, " HorizSync %2.1f - %2.1f\n", ptr->hsync[i].lo, ptr->hsync[i].hi); } for (i = 0; i < ptr->n_vrefresh; i++) { if (ptr->vrefresh[i].lo == ptr->vrefresh[i].hi) { fprintf (cf, " VertRefresh %2.1f\n", ptr->vrefresh[i].lo); } else { fprintf (cf, " VertRefresh %2.1f - %2.1f\n", ptr->vrefresh[i].lo, ptr->vrefresh[i].hi); } } if (ptr->gamma_red) { if (ptr->gamma_red == ptr->gamma_green && ptr->gamma_red == ptr->gamma_blue) { fprintf (cf, " Gamma %.4g\n", ptr->gamma_red); } else { fprintf (cf, " Gamma %.4g %.4g %.4g\n", ptr->gamma_red, ptr->gamma_green, ptr->gamma_blue); } } for (mlptr = ptr->modelines; mlptr; mlptr = mlptr->next) { fprintf (cf, " ModeLine \"%s\" %s ", mlptr->identifier, mlptr->clock); fprintf (cf, "%d %d %d %d %d %d %d %d", mlptr->hdisplay, mlptr->hsyncstart, mlptr->hsyncend, mlptr->htotal, mlptr->vdisplay, mlptr->vsyncstart, mlptr->vsyncend, mlptr->vtotal); if (mlptr->flags & XCONFIG_MODE_PHSYNC) fprintf (cf, " +hsync"); if (mlptr->flags & XCONFIG_MODE_NHSYNC) fprintf (cf, " -hsync"); if (mlptr->flags & XCONFIG_MODE_PVSYNC) fprintf (cf, " +vsync"); if (mlptr->flags & XCONFIG_MODE_NVSYNC) fprintf (cf, " -vsync"); if (mlptr->flags & XCONFIG_MODE_INTERLACE) fprintf (cf, " interlace"); if (mlptr->flags & XCONFIG_MODE_CSYNC) fprintf (cf, " composite"); if (mlptr->flags & XCONFIG_MODE_PCSYNC) fprintf (cf, " +csync"); if (mlptr->flags & XCONFIG_MODE_NCSYNC) fprintf (cf, " -csync"); if (mlptr->flags & XCONFIG_MODE_DBLSCAN) fprintf (cf, " doublescan"); if (mlptr->flags & XCONFIG_MODE_HSKEW) fprintf (cf, " hskew %d", mlptr->hskew); if (mlptr->flags & XCONFIG_MODE_BCAST) fprintf (cf, " bcast"); fprintf (cf, "\n"); } xconfigPrintOptionList(cf, ptr->options, 1); fprintf (cf, "EndSection\n\n"); ptr = ptr->next; } } void xconfigPrintModesSection (FILE * cf, XConfigModesPtr ptr) { XConfigModeLinePtr mlptr; while (ptr) { fprintf (cf, "Section \"Modes\"\n"); if (ptr->comment) fprintf (cf, "%s", ptr->comment); if (ptr->identifier) fprintf (cf, " Identifier \"%s\"\n", ptr->identifier); for (mlptr = ptr->modelines; mlptr; mlptr = mlptr->next) { fprintf (cf, " ModeLine \"%s\" %s ", mlptr->identifier, mlptr->clock); fprintf (cf, "%d %d %d %d %d %d %d %d", mlptr->hdisplay, mlptr->hsyncstart, mlptr->hsyncend, mlptr->htotal, mlptr->vdisplay, mlptr->vsyncstart, mlptr->vsyncend, mlptr->vtotal); if (mlptr->flags & XCONFIG_MODE_PHSYNC) fprintf (cf, " +hsync"); if (mlptr->flags & XCONFIG_MODE_NHSYNC) fprintf (cf, " -hsync"); if (mlptr->flags & XCONFIG_MODE_PVSYNC) fprintf (cf, " +vsync"); if (mlptr->flags & XCONFIG_MODE_NVSYNC) fprintf (cf, " -vsync"); if (mlptr->flags & XCONFIG_MODE_INTERLACE) fprintf (cf, " interlace"); if (mlptr->flags & XCONFIG_MODE_CSYNC) fprintf (cf, " composite"); if (mlptr->flags & XCONFIG_MODE_PCSYNC) fprintf (cf, " +csync"); if (mlptr->flags & XCONFIG_MODE_NCSYNC) fprintf (cf, " -csync"); if (mlptr->flags & XCONFIG_MODE_DBLSCAN) fprintf (cf, " doublescan"); if (mlptr->flags & XCONFIG_MODE_HSKEW) fprintf (cf, " hskew %d", mlptr->hskew); if (mlptr->flags & XCONFIG_MODE_VSCAN) fprintf (cf, " vscan %d", mlptr->vscan); if (mlptr->flags & XCONFIG_MODE_BCAST) fprintf (cf, " bcast"); if (mlptr->comment) fprintf (cf, "%s", mlptr->comment); else fprintf (cf, "\n"); } fprintf (cf, "EndSection\n\n"); ptr = ptr->next; } } void xconfigFreeMonitorList (XConfigMonitorPtr *ptr) { XConfigMonitorPtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->identifier); TEST_FREE ((*ptr)->vendor); TEST_FREE ((*ptr)->modelname); TEST_FREE ((*ptr)->comment); xconfigFreeOptionList (&((*ptr)->options)); xconfigFreeModeLineList (&((*ptr)->modelines)); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } void xconfigFreeModesList (XConfigModesPtr *ptr) { XConfigModesPtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->identifier); TEST_FREE ((*ptr)->comment); xconfigFreeModeLineList (&((*ptr)->modelines)); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } void xconfigFreeModeLineList (XConfigModeLinePtr *ptr) { XConfigModeLinePtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->identifier); TEST_FREE ((*ptr)->comment); TEST_FREE ((*ptr)->clock); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } void xconfigFreeModesLinkList (XConfigModesLinkPtr *ptr) { XConfigModesLinkPtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->modes_name); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } XConfigMonitorPtr xconfigFindMonitor (const char *ident, XConfigMonitorPtr p) { while (p) { if (xconfigNameCompare (ident, p->identifier) == 0) return (p); p = p->next; } return (NULL); } XConfigModesPtr xconfigFindModes (const char *ident, XConfigModesPtr p) { while (p) { if (xconfigNameCompare (ident, p->identifier) == 0) return (p); p = p->next; } return (NULL); } XConfigModeLinePtr xconfigFindModeLine (const char *ident, XConfigModeLinePtr p) { while (p) { if (xconfigNameCompare (ident, p->identifier) == 0) return (p); p = p->next; } return (NULL); } int xconfigValidateMonitor (XConfigPtr p, XConfigScreenPtr screen) { XConfigMonitorPtr monitor = screen->monitor; XConfigModesLinkPtr modeslnk = monitor->modes_sections; XConfigModesPtr modes; while(modeslnk) { modes = xconfigFindModes (modeslnk->modes_name, p->modes); if (!modes) { xconfigErrorMsg(ValidationErrorMsg, UNDEFINED_MODES_MSG, modeslnk->modes_name, screen->identifier); return (FALSE); } modeslnk->modes = modes; modeslnk = modeslnk->next; } return (TRUE); } nvidia-settings/src/XF86Config-parser/configProcs.h0000664000175000017500000001161712236467170022377 0ustar albertoalberto/* * Copyright (c) 1997-2001 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ /* Private procs. Public procs are in xf86Parser.h and xf86Optrec.h */ #include "xf86Parser.h" /* Device.c */ XConfigDevicePtr xconfigParseDeviceSection(void); void xconfigPrintDeviceSection(FILE *cf, XConfigDevicePtr ptr); int xconfigValidateDevice(XConfigPtr p); /* Files.c */ XConfigFilesPtr xconfigParseFilesSection(void); void xconfigPrintFileSection(FILE *cf, XConfigFilesPtr ptr); /* Flags.c */ XConfigFlagsPtr xconfigParseFlagsSection(void); void xconfigPrintServerFlagsSection(FILE *f, XConfigFlagsPtr flags); /* Input.c */ XConfigInputPtr xconfigParseInputSection(void); XConfigInputClassPtr xconfigParseInputClassSection(void); void xconfigPrintInputSection(FILE *f, XConfigInputPtr ptr); void xconfigPrintInputClassSection(FILE *f, XConfigInputClassPtr ptr); int xconfigValidateInput (XConfigPtr p); /* Keyboard.c */ XConfigInputPtr xconfigParseKeyboardSection(void); /* Layout.c */ XConfigLayoutPtr xconfigParseLayoutSection(void); void xconfigPrintLayoutSection(FILE *cf, XConfigLayoutPtr ptr); int xconfigValidateLayout(XConfigPtr p); int xconfigSanitizeLayout(XConfigPtr p, const char *screenName, GenerateOptions *gop); /* Module.c */ XConfigLoadPtr xconfigParseModuleSubSection(XConfigLoadPtr head, char *name); XConfigModulePtr xconfigParseModuleSection(void); void xconfigPrintModuleSection(FILE *cf, XConfigModulePtr ptr); /* Monitor.c */ XConfigModeLinePtr xconfigParseModeLine(void); XConfigModeLinePtr xconfigParseVerboseMode(void); XConfigMonitorPtr xconfigParseMonitorSection(void); XConfigModesPtr xconfigParseModesSection(void); void xconfigPrintMonitorSection(FILE *cf, XConfigMonitorPtr ptr); void xconfigPrintModesSection(FILE *cf, XConfigModesPtr ptr); int xconfigValidateMonitor(XConfigPtr p, XConfigScreenPtr screen); /* Pointer.c */ XConfigInputPtr xconfigParsePointerSection(void); /* Screen.c */ XConfigDisplayPtr xconfigParseDisplaySubSection(void); XConfigScreenPtr xconfigParseScreenSection(void); void xconfigPrintScreenSection(FILE *cf, XConfigScreenPtr ptr); int xconfigValidateScreen(XConfigPtr p); int xconfigSanitizeScreen(XConfigPtr p); /* Vendor.c */ XConfigVendorPtr xconfigParseVendorSection(void); XConfigVendSubPtr xconfigParseVendorSubSection (void); void xconfigPrintVendorSection(FILE * cf, XConfigVendorPtr ptr); /* Video.c */ XConfigVideoPortPtr xconfigParseVideoPortSubSection(void); XConfigVideoAdaptorPtr xconfigParseVideoAdaptorSection(void); void xconfigPrintVideoAdaptorSection(FILE *cf, XConfigVideoAdaptorPtr ptr); /* Read.c */ int xconfigValidateConfig(XConfigPtr p); /* Scan.c */ int xconfigGetToken(XConfigSymTabRec *tab); int xconfigGetSubToken(char **comment); int xconfigGetSubTokenWithTab(char **comment, XConfigSymTabRec *tab); void xconfigUnGetToken(int token); char *xconfigTokenString(void); void xconfigSetSection(char *section); int xconfigGetStringToken(XConfigSymTabRec *tab); char *xconfigGetConfigFileName(void); /* Write.c */ /* DRI.c */ XConfigBuffersPtr xconfigParseBuffers (void); XConfigDRIPtr xconfigParseDRISection (void); void xconfigPrintDRISection (FILE * cf, XConfigDRIPtr ptr); /* Util.c */ void *xconfigAlloc(size_t size); void xconfigErrorMsg(MsgType, char *fmt, ...); /* Extensions.c */ XConfigExtensionsPtr xconfigParseExtensionsSection (void); void xconfigPrintExtensionsSection (FILE * cf, XConfigExtensionsPtr ptr); /* Generate.c */ XConfigMonitorPtr xconfigAddMonitor(XConfigPtr config, int count); int xconfigAddMouse(GenerateOptions *gop, XConfigPtr config); int xconfigAddKeyboard(GenerateOptions *gop, XConfigPtr config); nvidia-settings/src/XF86Config-parser/DRI.c0000664000175000017500000001025112236467170020525 0ustar albertoalberto/* DRI.c -- DRI Section in XF86Config file * Created: Fri Mar 19 08:40:22 1999 by faith@precisioninsight.com * Revised: Thu Jun 17 16:08:05 1999 by faith@precisioninsight.com * * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. * All Rights Reserved. * * 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 (including the next * paragraph) 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 * PRECISION INSIGHT AND/OR ITS SUPPLIERS 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. * */ #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" extern LexRec val; static XConfigSymTabRec DRITab[] = { {ENDSECTION, "endsection"}, {GROUP, "group"}, {BUFFERS, "buffers"}, {MODE, "mode"}, {-1, ""}, }; #define CLEANUP xconfigFreeBuffersList XConfigBuffersPtr xconfigParseBuffers (void) { int token; PARSE_PROLOGUE (XConfigBuffersPtr, XConfigBuffersRec); if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) { Error("Buffers count expected", NULL); } ptr->count = val.num; if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) { Error("Buffers size expected", NULL); } ptr->size = val.num; if ((token = xconfigGetSubToken (&(ptr->comment))) == STRING) { ptr->flags = val.str; if ((token = xconfigGetToken (NULL)) == COMMENT) ptr->comment = xconfigAddComment(ptr->comment, val.str); else xconfigUnGetToken(token); } return ptr; } #undef CLEANUP #define CLEANUP xconfigFreeDRI XConfigDRIPtr xconfigParseDRISection (void) { int token; PARSE_PROLOGUE (XConfigDRIPtr, XConfigDRIRec); /* Zero is a valid value for this. */ ptr->group = -1; while ((token = xconfigGetToken (DRITab)) != ENDSECTION) { switch (token) { case GROUP: if ((token = xconfigGetSubToken (&(ptr->comment))) == STRING) ptr->group_name = val.str; else if (token == NUMBER) ptr->group = val.num; else Error (GROUP_MSG, NULL); break; case MODE: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (NUMBER_MSG, "Mode"); ptr->mode = val.num; break; case BUFFERS: HANDLE_LIST (buffers, xconfigParseBuffers, XConfigBuffersPtr); break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } return ptr; } #undef CLEANUP void xconfigPrintDRISection (FILE * cf, XConfigDRIPtr ptr) { /* we never need the DRI section for the NVIDIA driver */ return; } void xconfigFreeDRI (XConfigDRIPtr *ptr) { if (ptr == NULL || *ptr == NULL) return; xconfigFreeBuffersList (&((*ptr)->buffers)); TEST_FREE ((*ptr)->comment); free (*ptr); *ptr = NULL; } void xconfigFreeBuffersList (XConfigBuffersPtr *ptr) { XConfigBuffersPtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->flags); TEST_FREE ((*ptr)->comment); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } nvidia-settings/src/XF86Config-parser/Scan.c0000664000175000017500000007332312236467170021004 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ #include #include #include #include #include #if !defined(X_NOT_POSIX) #if defined(_POSIX_SOURCE) #include #else #define _POSIX_SOURCE #include #undef _POSIX_SOURCE #endif /* _POSIX_SOURCE */ #endif /* !X_NOT_POSIX */ #if !defined(PATH_MAX) #if defined(MAXPATHLEN) #define PATH_MAX MAXPATHLEN #else #define PATH_MAX 1024 #endif /* MAXPATHLEN */ #endif /* !PATH_MAX */ #if !defined(MAXHOSTNAMELEN) #define MAXHOSTNAMELEN 32 #endif /* !MAXHOSTNAMELEN */ #include "Configint.h" #include "xf86tokens.h" #define CONFIG_BUF_LEN 1024 static int StringToToken (char *, XConfigSymTabRec *); static FILE *configFile = NULL; static const char **builtinConfig = NULL; static int builtinIndex = 0; static int configPos = 0; /* current readers position */ static char *configBuf, *configRBuf; /* buffer for lines */ static int pushToken = LOCK_TOKEN; static int eol_seen = 0; /* private state to handle comments */ LexRec val; int configLineNo = 0; /* linenumber */ char *configSection = NULL; /* name of current section being parsed */ char *configPath; /* path to config file */ static int xconfigIsAlpha(char c) { return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))); } static int xconfigIsDigit(char c) { return ((c >= '0') && (c <= '9')); } static int xconfigIsUpper(char c) { return ((c >= 'A') && (c <= 'Z')); } static char xconfigToLower(char c) { if ((c >= 'A') && (c <= 'Z')) { return c + ('a' - 'A'); } else { return c; } } /* * xconfigStrToUL -- * * A portable, but restricted, version of strtoul(). It only understands * hex, octal, and decimal. But it's good enough for our needs. */ static unsigned int xconfigStrToUL (char *str) { int base = 10; char *p = str; unsigned int tot = 0; if (*p == '0') { p++; if ((*p == 'x') || (*p == 'X')) { p++; base = 16; } else base = 8; } while (*p) { if ((*p >= '0') && (*p <= ((base == 8) ? '7' : '9'))) { tot = tot * base + (*p - '0'); } else if ((base == 16) && (*p >= 'a') && (*p <= 'f')) { tot = tot * base + 10 + (*p - 'a'); } else if ((base == 16) && (*p >= 'A') && (*p <= 'F')) { tot = tot * base + 10 + (*p - 'A'); } else { return (tot); } p++; } return (tot); } /* * xconfigGetNextLine -- * * read from the configFile FILE stream until we encounter a new * line; this is effectively just a big wrapper for fgets(3). * * xconfigGetToken() assumes that we will read up to the next * newline; we need to grow configBuf and configRBuf as needed to * support that. */ static char *xconfigGetNextLine(void) { static int configBufLen = CONFIG_BUF_LEN; char *tmpConfigBuf, *tmpConfigRBuf; int c, i, pos = 0, eolFound = 0; char *ret = NULL; /* * reallocate the string if it was grown last time (i.e., is no * longer CONFIG_BUF_LEN); we malloc the new strings first, so * that if either of the mallocs fail, we can fall back on the * existing buffer allocations */ if (configBufLen != CONFIG_BUF_LEN) { tmpConfigBuf = malloc(CONFIG_BUF_LEN); tmpConfigRBuf = malloc(CONFIG_BUF_LEN); if (!tmpConfigBuf || !tmpConfigRBuf) { /* * at least one of the mallocs failed; keep the old buffers * and free any partial allocations */ free(tmpConfigBuf); free(tmpConfigRBuf); } else { /* * malloc succeeded; free the old buffers and use the new * buffers */ configBufLen = CONFIG_BUF_LEN; free(configBuf); free(configRBuf); configBuf = tmpConfigBuf; configRBuf = tmpConfigRBuf; } } /* read in another block of chars */ do { ret = fgets(configBuf + pos, configBufLen - pos - 1, configFile); if (!ret) break; /* search for EOL in the new block of chars */ for (i = pos; i < (configBufLen - 1); i++) { c = configBuf[i]; if (c == '\0') break; if ((c == '\n') || (c == '\r')) { eolFound = 1; break; } } /* * if we didn't find EOL, then grow the string and * read in more */ if (!eolFound) { tmpConfigBuf = realloc(configBuf, configBufLen + CONFIG_BUF_LEN); tmpConfigRBuf = realloc(configRBuf, configBufLen + CONFIG_BUF_LEN); if (!tmpConfigBuf || !tmpConfigRBuf) { /* * at least one of the reallocations failed; use the * new allocation that succeeded, but we have to * fallback to the previous configBufLen size and use * the string we have, even though we don't have an * EOL */ if (tmpConfigBuf) configBuf = tmpConfigBuf; if (tmpConfigRBuf) configRBuf = tmpConfigRBuf; break; } else { /* reallocation succeeded */ configBuf = tmpConfigBuf; configRBuf = tmpConfigRBuf; pos = i; configBufLen += CONFIG_BUF_LEN; } } } while (!eolFound); return ret; } /* * xconfigGetToken -- * Read next Token from the config file. Handle the global variable * pushToken. */ int xconfigGetToken (XConfigSymTabRec * tab) { int c, i; /* * First check whether pushToken has a different value than LOCK_TOKEN. * In this case rBuf[] contains a valid STRING/TOKEN/NUMBER. But in the * oth * case the next token must be read from the input. */ if (pushToken == EOF_TOKEN) return (EOF_TOKEN); else if (pushToken == LOCK_TOKEN) { /* * eol_seen is only set for the first token after a newline. */ eol_seen = 0; c = configBuf[configPos]; /* * Get start of next Token. EOF is handled, * whitespaces are skipped. */ again: if (!c) { char *ret; if (configFile) ret = xconfigGetNextLine(); else { if (builtinConfig[builtinIndex] == NULL) ret = NULL; else { ret = strncpy(configBuf, builtinConfig[builtinIndex], CONFIG_BUF_LEN); builtinIndex++; } } if (ret == NULL) { return (pushToken = EOF_TOKEN); } configLineNo++; configPos = 0; eol_seen = 1; } i = 0; for (;;) { c = configBuf[configPos++]; configRBuf[i++] = c; switch (c) { case ' ': case '\t': case '\r': continue; case '\n': i = 0; continue; } break; } if (c == '\0') goto again; if (c == '#') { do { configRBuf[i++] = (c = configBuf[configPos++]); } while ((c != '\n') && (c != '\r') && (c != '\0')); configRBuf[i] = '\0'; /* XXX no private copy. * Use xconfigAddComment when setting a comment. */ val.str = configRBuf; return (COMMENT); } /* GJA -- handle '-' and ',' * Be careful: "-hsync" is a keyword. */ else if ((c == ',') && !xconfigIsAlpha(configBuf[configPos])) { return COMMA; } else if ((c == '-') && !xconfigIsAlpha(configBuf[configPos])) { return DASH; } /* * Numbers are returned immediately ... */ if (xconfigIsDigit(c)) { int base; if (c == '0') if ((configBuf[configPos] == 'x') || (configBuf[configPos] == 'X')) base = 16; else base = 8; else base = 10; configRBuf[0] = c; i = 1; while (xconfigIsDigit(c = configBuf[configPos++]) || (c == '.') || (c == 'x') || (c == 'X') || ((base == 16) && (((c >= 'a') && (c <= 'f')) || ((c >= 'A') && (c <= 'F'))))) configRBuf[i++] = c; configPos--; /* GJA -- one too far */ configRBuf[i] = '\0'; val.num = xconfigStrToUL (configRBuf); val.realnum = atof (configRBuf); val.str = configRBuf; return (NUMBER); } /* * All Strings START with a \" ... */ else if (c == '\"') { i = -1; do { configRBuf[++i] = (c = configBuf[configPos++]); } while ((c != '\"') && (c != '\n') && (c != '\r') && (c != '\0')); configRBuf[i] = '\0'; val.str = malloc (strlen (configRBuf) + 1); strcpy (val.str, configRBuf); /* private copy ! */ return (STRING); } /* * ... and now we MUST have a valid token. The search is * handled later along with the pushed tokens. */ else { configRBuf[0] = c; i = 0; do { configRBuf[++i] = (c = configBuf[configPos++]);; } while ((c != ' ') && (c != '\t') && (c != '\n') && (c != '\r') && (c != '\0') && (c != '#')); --configPos; configRBuf[i] = '\0'; i = 0; } } else { /* * Here we deal with pushed tokens. Reinitialize pushToken again. If * the pushed token was NUMBER || STRING return them again ... */ int temp = pushToken; pushToken = LOCK_TOKEN; if (temp == COMMA || temp == DASH) return (temp); if (temp == NUMBER || temp == STRING) return (temp); } /* * Joop, at last we have to lookup the token ... */ if (tab) { i = 0; while (tab[i].token != -1) if (xconfigNameCompare (configRBuf, tab[i].name) == 0) return (tab[i].token); else i++; } return (ERROR_TOKEN); /* Error catcher */ } int xconfigGetSubToken (char **comment) { int token; for (;;) { token = xconfigGetToken(NULL); if (token == COMMENT) { if (comment) *comment = xconfigAddComment(*comment, val.str); } else return (token); } /*NOTREACHED*/ } int xconfigGetSubTokenWithTab (char **comment, XConfigSymTabRec *tab) { int token; for (;;) { token = xconfigGetToken(tab); if (token == COMMENT) { if (comment) *comment = xconfigAddComment(*comment, val.str); } else return (token); } /*NOTREACHED*/ } void xconfigUnGetToken (int token) { pushToken = token; } char *xconfigTokenString (void) { return configRBuf; } static int pathIsAbsolute(const char *path) { if (path && path[0] == '/') return 1; return 0; } /* A path is "safe" if it is relative and if it contains no ".." elements. */ static int pathIsSafe(const char *path) { if (pathIsAbsolute(path)) return 0; /* Compare with ".." */ if (!strcmp(path, "..")) return 0; /* Look for leading "../" */ if (!strncmp(path, "../", 3)) return 0; /* Look for trailing "/.." */ if ((strlen(path) > 3) && !strcmp(path + strlen(path) - 3, "/..")) return 0; /* Look for "/../" */ if (strstr(path, "/../")) return 0; return 1; } /* * This function substitutes the following escape sequences: * * %A cmdline argument as an absolute path (must be absolute to match) * %R cmdline argument as a relative path * %S cmdline argument as a "safe" path (relative, and no ".." elements) * %X default config file name ("XF86Config") * %H hostname * %E config file environment ($XF86CONFIG) as an absolute path * %F config file environment ($XF86CONFIG) as a relative path * %G config file environment ($XF86CONFIG) as a safe path * %P projroot * %M major version number * %% % * %& UNIXOS2 only: prepend X11ROOT env var */ #ifndef XCONFIGFILE #define XCONFIGFILE "xorg.conf" #endif #ifndef PROJECTROOT #define PROJECTROOT "/usr/X11R6" #endif #ifndef XCONFENV #define XCONFENV "XF86CONFIG" #endif #define XFREE86CFGFILE "XF86Config" #ifndef X_VERSION_MAJOR #ifdef XVERSION #if XVERSION > 40000000 #define X_VERSION_MAJOR (XVERSION / 10000000) #else #define X_VERSION_MAJOR (XVERSION / 1000) #endif #else #define X_VERSION_MAJOR 4 #endif #endif #define BAIL_OUT do { \ free(result); \ return NULL; \ } while (0) #define CHECK_LENGTH do { \ if (l > PATH_MAX) { \ BAIL_OUT; \ } \ } while (0) #define APPEND_STR(s) do { \ if (strlen(s) + l > PATH_MAX) { \ BAIL_OUT; \ } else { \ strcpy(result + l, s); \ l += strlen(s); \ } \ } while (0) static char *DoSubstitution(const char *template, const char *cmdline, const char *projroot, int *cmdlineUsed, int *envUsed, char *XConfigFile) { char *result; int i, l; static const char *env = NULL; static char *hostname = NULL; static char majorvers[3] = ""; if (!template) return NULL; if (cmdlineUsed) *cmdlineUsed = 0; if (envUsed) *envUsed = 0; result = malloc(PATH_MAX + 1); l = 0; for (i = 0; template[i]; i++) { if (template[i] != '%') { result[l++] = template[i]; CHECK_LENGTH; } else { switch (template[++i]) { case 'A': if (cmdline && pathIsAbsolute(cmdline)) { APPEND_STR(cmdline); if (cmdlineUsed) *cmdlineUsed = 1; } else BAIL_OUT; break; case 'R': if (cmdline && !pathIsAbsolute(cmdline)) { APPEND_STR(cmdline); if (cmdlineUsed) *cmdlineUsed = 1; } else BAIL_OUT; break; case 'S': if (cmdline && pathIsSafe(cmdline)) { APPEND_STR(cmdline); if (cmdlineUsed) *cmdlineUsed = 1; } else BAIL_OUT; break; case 'X': APPEND_STR(XConfigFile); break; case 'H': if (!hostname) { if ((hostname = malloc(MAXHOSTNAMELEN + 1))) { if (gethostname(hostname, MAXHOSTNAMELEN) == 0) { hostname[MAXHOSTNAMELEN] = '\0'; } else { free(hostname); hostname = NULL; } } } if (hostname) APPEND_STR(hostname); break; case 'E': if (!env) env = getenv(XCONFENV); if (env && pathIsAbsolute(env)) { APPEND_STR(env); if (envUsed) *envUsed = 1; } else BAIL_OUT; break; case 'F': if (!env) env = getenv(XCONFENV); if (env && !pathIsAbsolute(env)) { APPEND_STR(env); if (envUsed) *envUsed = 1; } else BAIL_OUT; break; case 'G': if (!env) env = getenv(XCONFENV); if (env && pathIsSafe(env)) { APPEND_STR(env); if (envUsed) *envUsed = 1; } else BAIL_OUT; break; case 'P': if (projroot && pathIsAbsolute(projroot)) APPEND_STR(projroot); else BAIL_OUT; break; case 'M': if (!majorvers[0]) { sprintf(majorvers, "%d", X_VERSION_MAJOR); } APPEND_STR(majorvers); break; case '%': result[l++] = '%'; CHECK_LENGTH; break; default: xconfigErrorMsg(InternalErrorMsg, "invalid escape %%%c found in path template\n", template[i]); BAIL_OUT; break; } } } return result; } /* * xconfigOpenConfigFile -- * * This function takes a config file search path (optional), a * command-line specified file name (optional) and the ProjectRoot * path (optional) and locates and opens a config file based on that * information. If a command-line file name is specified, then this * function fails if none of the located files. * * The return value is a pointer to the actual name of the file that * was opened. When no file is found, the return value is NULL. * * The escape sequences allowed in the search path are defined above. * */ /* * __root_configpath[] - this is the XconfigConfig search path used by * XFree86 when the server runs as root. */ static const char __root_configpath[] = "%A," /* */ "%R," /* (as relative path) */ "/etc/X11/%R," /* /etc/X11/ */ "%P/etc/X11/%R," /* /usr/X11R6/etc/X11/ */ "%E," /* $XF86CONFIG */ "%F," /* $XF86CONFIG (as relative path) */ "/etc/X11/%F," /* /etc/X11/$XF86CONFIG */ "%P/etc/X11/%F," /* /usr/X11R6/etc/X11/$XF86CONFIG */ "/etc/X11/%X-%M," /* /etc/X11/XF86Config-4 */ "/etc/X11/%X," /* /etc/X11/XF86Config */ "/etc/%X," /* /etc/XF86Config */ "%P/etc/X11/%X.%H," /* /usr/X11R6/etc/X11/XF86Config. */ "%P/etc/X11/%X-%M," /* /usr/X11R6/etc/X11/XF86Config-4 */ "%P/etc/X11/%X," /* /usr/X11R6/etc/X11/XF86Config */ "%P/lib/X11/%X.%H," /* /usr/X11R6/lib/X11/XF86Config. */ "%P/lib/X11/%X-%M," /* /usr/X11R6/lib/X11/XF86Config-4 */ "%P/lib/X11/%X"; /* /usr/X11R6/lib/X11/XF86Config */ /* * __user_configpath[] - this is the XF86Config search path used by * XFree86 when the server runs as a normal user */ static const char __user_configpath[] = "%A," /* XXX */ "%R," /* (as relative path) XXX */ "/etc/X11/%S," /* /etc/X11/ */ "%P/etc/X11/%S," /* /usr/X11R6/etc/X11/ */ "/etc/X11/%G," /* /etc/X11/$XF86CONFIG */ "%P/etc/X11/%G," /* /usr/X11R6/etc/X11/$XF86CONFIG */ "/etc/X11/%X-%M," /* /etc/X11/XF86Config-4 */ "/etc/X11/%X," /* /etc/X11/XF86Config */ "/etc/%X," /* /etc/XF86Config */ "%P/etc/X11/%X.%H," /* /usr/X11R6/etc/X11/XF86Config. */ "%P/etc/X11/%X-%M," /* /usr/X11R6/etc/X11/XF86Config-4 */ "%P/etc/X11/%X," /* /usr/X11R6/etc/X11/XF86Config */ "%P/lib/X11/%X.%H," /* /usr/X11R6/lib/X11/XF86Config. */ "%P/lib/X11/%X-%M," /* /usr/X11R6/lib/X11/XF86Config-4 */ "%P/lib/X11/%X"; /* /usr/X11R6/lib/X11/XF86Config */ const char *xconfigOpenConfigFile(const char *cmdline, const char *projroot) { const char *searchpath; char *pathcopy; const char *template; int cmdlineUsed = 0; configFile = NULL; configPos = 0; /* current readers position */ configLineNo = 0; /* linenumber */ pushToken = LOCK_TOKEN; /* * select the search path: XFree86 uses a slightly different path * depending on whether the user is root */ if (getuid() == 0) { searchpath = __root_configpath; } else { searchpath = __user_configpath; } if (!projroot) projroot = PROJECTROOT; pathcopy = strdup(searchpath); template = strtok(pathcopy, ","); /* First, search for a config file. */ while (template && !configFile) { if ((configPath = DoSubstitution(template, cmdline, projroot, &cmdlineUsed, NULL, XCONFIGFILE))) { if ((configFile = fopen(configPath, "r")) != 0) { if (cmdline && !cmdlineUsed) { fclose(configFile); configFile = NULL; } } } if (configPath && !configFile) { free(configPath); configPath = NULL; } template = strtok(NULL, ","); } /* Then search for fallback */ if (!configFile) { strcpy(pathcopy, searchpath); template = strtok(pathcopy, ","); while (template && !configFile) { if ((configPath = DoSubstitution(template, cmdline, projroot, &cmdlineUsed, NULL, XFREE86CFGFILE))) { if ((configFile = fopen(configPath, "r")) != 0) { if (cmdline && !cmdlineUsed) { fclose(configFile); configFile = NULL; } } } if (configPath && !configFile) { free(configPath); configPath = NULL; } template = strtok(NULL, ","); } } free(pathcopy); if (!configFile) { return NULL; } configBuf = malloc(CONFIG_BUF_LEN); configRBuf = malloc(CONFIG_BUF_LEN); configBuf[0] = '\0'; return configPath; } void xconfigCloseConfigFile (void) { free (configPath); configPath = NULL; free (configRBuf); configRBuf = NULL; free (configBuf); configBuf = NULL; if (configFile) { fclose (configFile); configFile = NULL; } else { builtinConfig = NULL; builtinIndex = 0; } } char *xconfigGetConfigFileName(void) { return configPath; } void xconfigSetSection (char *section) { if (configSection) free(configSection); configSection = malloc(strlen (section) + 1); strcpy (configSection, section); } /* * xconfigGetToken -- * Lookup a string if it is actually a token in disguise. */ char * xconfigAddComment(char *cur, char *add) { char *str; int len, curlen, iscomment, hasnewline = 0, endnewline; if (add == NULL || add[0] == '\0') return (cur); if (cur) { curlen = strlen(cur); if (curlen) hasnewline = cur[curlen - 1] == '\n'; eol_seen = 0; } else curlen = 0; str = add; iscomment = 0; while (*str) { if (*str != ' ' && *str != '\t') break; ++str; } iscomment = (*str == '#'); len = strlen(add); endnewline = add[len - 1] == '\n'; len += 1 + iscomment + (!hasnewline) + (!endnewline) + eol_seen; if ((str = realloc(cur, len + curlen)) == NULL) return (cur); cur = str; if (eol_seen || (curlen && !hasnewline)) cur[curlen++] = '\n'; if (!iscomment) cur[curlen++] = '#'; strcpy(cur + curlen, add); if (!endnewline) strcat(cur, "\n"); return (cur); } int xconfigGetStringToken (XConfigSymTabRec * tab) { return StringToToken (val.str, tab); } static int StringToToken (char *str, XConfigSymTabRec * tab) { int i; for (i = 0; tab[i].token != -1; i++) { if (!xconfigNameCompare (tab[i].name, str)) return tab[i].token; } return (ERROR_TOKEN); } /* * Compare two names. The characters '_', ' ', and '\t' are ignored * in the comparison. */ int xconfigNameCompare (const char *s1, const char *s2) { char c1, c2; if (!s1 || *s1 == 0) { if (!s2 || *s2 == 0) return (0); else return (1); } while (*s1 == '_' || *s1 == ' ' || *s1 == '\t') s1++; while (*s2 == '_' || *s2 == ' ' || *s2 == '\t') s2++; c1 = (xconfigIsUpper(*s1) ? xconfigToLower(*s1) : *s1); c2 = (xconfigIsUpper(*s2) ? xconfigToLower(*s2) : *s2); while (c1 == c2) { if (c1 == '\0') return (0); s1++; s2++; while (*s1 == '_' || *s1 == ' ' || *s1 == '\t') s1++; while (*s2 == '_' || *s2 == ' ' || *s2 == '\t') s2++; c1 = (xconfigIsUpper(*s1) ? xconfigToLower(*s1) : *s1); c2 = (xconfigIsUpper(*s2) ? xconfigToLower(*s2) : *s2); } return (c1 - c2); } /* * Compare two modelines. The modeline identifiers and comments are * ignored in the comparison. */ int xconfigModelineCompare(XConfigModeLinePtr m1, XConfigModeLinePtr m2) { if (!m1 && !m2) return (0); if (!m1 || !m2) return (1); if (m1->clock != m2->clock && m1->hdisplay != m2->hdisplay && m1->hsyncstart != m2->hsyncstart && m1->hsyncend != m2->hsyncend && m1->htotal != m2->htotal && m1->vdisplay != m2->vdisplay && m1->vsyncstart != m2->vsyncstart && m1->vsyncend != m2->vsyncend && m1->vtotal != m2->vtotal && m1->vscan != m2->vscan && m1->flags != m2->flags && m1->hskew != m2->hskew) return (1); return (0); } nvidia-settings/src/XF86Config-parser/Device.c0000664000175000017500000003703712236467170021321 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ /* View/edit this file with tab stops set to 4 */ #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" #include extern LexRec val; static XConfigSymTabRec DeviceTab[] = { {ENDSECTION, "endsection"}, {IDENTIFIER, "identifier"}, {VENDOR, "vendorname"}, {BOARD, "boardname"}, {CHIPSET, "chipset"}, {RAMDAC, "ramdac"}, {DACSPEED, "dacspeed"}, {CLOCKS, "clocks"}, {OPTION, "option"}, {VIDEORAM, "videoram"}, {BIOSBASE, "biosbase"}, {MEMBASE, "membase"}, {IOBASE, "iobase"}, {CLOCKCHIP, "clockchip"}, {CHIPID, "chipid"}, {CHIPREV, "chiprev"}, {CARD, "card"}, {DRIVER, "driver"}, {BUSID, "busid"}, {TEXTCLOCKFRQ, "textclockfreq"}, {IRQ, "irq"}, {SCREEN, "screen"}, {-1, ""}, }; #define CLEANUP xconfigFreeDeviceList XConfigDevicePtr xconfigParseDeviceSection (void) { int i; int has_ident = FALSE; int token; PARSE_PROLOGUE (XConfigDevicePtr, XConfigDeviceRec) /* Zero is a valid value for these */ ptr->chipid = -1; ptr->chiprev = -1; ptr->irq = -1; ptr->screen = -1; while ((token = xconfigGetToken (DeviceTab)) != ENDSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case IDENTIFIER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Identifier"); if (has_ident == TRUE) Error (MULTIPLE_MSG, "Identifier"); ptr->identifier = val.str; has_ident = TRUE; break; case VENDOR: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Vendor"); ptr->vendor = val.str; break; case BOARD: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Board"); ptr->board = val.str; break; case CHIPSET: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Chipset"); ptr->chipset = val.str; break; case CARD: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Card"); ptr->card = val.str; break; case DRIVER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Driver"); ptr->driver = val.str; break; case RAMDAC: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Ramdac"); ptr->ramdac = val.str; break; case DACSPEED: for (i = 0; i < CONF_MAXDACSPEEDS; i++) ptr->dacSpeeds[i] = 0; if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) { Error (DACSPEED_MSG, CONF_MAXDACSPEEDS); } else { ptr->dacSpeeds[0] = (int) (val.realnum * 1000.0 + 0.5); for (i = 1; i < CONF_MAXDACSPEEDS; i++) { if (xconfigGetSubToken (&(ptr->comment)) == NUMBER) ptr->dacSpeeds[i] = (int) (val.realnum * 1000.0 + 0.5); else { xconfigUnGetToken (token); break; } } } break; case VIDEORAM: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (NUMBER_MSG, "VideoRam"); ptr->videoram = val.num; break; case BIOSBASE: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (NUMBER_MSG, "BIOSBase"); ptr->bios_base = val.num; break; case MEMBASE: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (NUMBER_MSG, "MemBase"); ptr->mem_base = val.num; break; case IOBASE: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (NUMBER_MSG, "IOBase"); ptr->io_base = val.num; break; case CLOCKCHIP: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "ClockChip"); ptr->clockchip = val.str; break; case CHIPID: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (NUMBER_MSG, "ChipID"); ptr->chipid = val.num; break; case CHIPREV: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (NUMBER_MSG, "ChipRev"); ptr->chiprev = val.num; break; case CLOCKS: token = xconfigGetSubToken(&(ptr->comment)); for( i = ptr->clocks; token == NUMBER && i < CONF_MAXCLOCKS; i++ ) { ptr->clock[i] = (int)(val.realnum * 1000.0 + 0.5); token = xconfigGetSubToken(&(ptr->comment)); } ptr->clocks = i; xconfigUnGetToken (token); break; case TEXTCLOCKFRQ: if ((token = xconfigGetSubToken(&(ptr->comment))) != NUMBER) Error (NUMBER_MSG, "TextClockFreq"); ptr->textclockfreq = (int)(val.realnum * 1000.0 + 0.5); break; case OPTION: ptr->options = xconfigParseOption(ptr->options); break; case BUSID: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "BusID"); ptr->busid = val.str; break; case IRQ: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (QUOTE_MSG, "IRQ"); ptr->irq = val.num; break; case SCREEN: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (NUMBER_MSG, "Screen"); ptr->screen = val.num; break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } if (!has_ident) Error (NO_IDENT_MSG, NULL); return ptr; } #undef CLEANUP void xconfigPrintDeviceSection (FILE * cf, XConfigDevicePtr ptr) { int i; while (ptr) { fprintf (cf, "Section \"Device\"\n"); if (ptr->comment) fprintf (cf, "%s", ptr->comment); if (ptr->identifier) fprintf (cf, " Identifier \"%s\"\n", ptr->identifier); if (ptr->driver) fprintf (cf, " Driver \"%s\"\n", ptr->driver); if (ptr->vendor) fprintf (cf, " VendorName \"%s\"\n", ptr->vendor); if (ptr->board) fprintf (cf, " BoardName \"%s\"\n", ptr->board); if (ptr->chipset) fprintf (cf, " ChipSet \"%s\"\n", ptr->chipset); if (ptr->card) fprintf (cf, " Card \"%s\"\n", ptr->card); if (ptr->ramdac) fprintf (cf, " RamDac \"%s\"\n", ptr->ramdac); if (ptr->dacSpeeds[0] > 0 ) { fprintf (cf, " DacSpeed "); for (i = 0; i < CONF_MAXDACSPEEDS && ptr->dacSpeeds[i] > 0; i++ ) fprintf (cf, "%g ", (double) (ptr->dacSpeeds[i])/ 1000.0 ); fprintf (cf, "\n"); } if (ptr->videoram) fprintf (cf, " VideoRam %d\n", ptr->videoram); if (ptr->bios_base) fprintf (cf, " BiosBase 0x%lx\n", ptr->bios_base); if (ptr->mem_base) fprintf (cf, " MemBase 0x%lx\n", ptr->mem_base); if (ptr->io_base) fprintf (cf, " IOBase 0x%lx\n", ptr->io_base); if (ptr->clockchip) fprintf (cf, " ClockChip \"%s\"\n", ptr->clockchip); if (ptr->chipid != -1) fprintf (cf, " ChipId 0x%x\n", ptr->chipid); if (ptr->chiprev != -1) fprintf (cf, " ChipRev 0x%x\n", ptr->chiprev); xconfigPrintOptionList(cf, ptr->options, 1); if (ptr->clocks > 0 ) { fprintf (cf, " Clocks "); for (i = 0; i < ptr->clocks; i++ ) fprintf (cf, "%.1f ", (double)ptr->clock[i] / 1000.0 ); fprintf (cf, "\n"); } if (ptr->textclockfreq) { fprintf (cf, " TextClockFreq %.1f\n", (double)ptr->textclockfreq / 1000.0); } if (ptr->busid) fprintf (cf, " BusID \"%s\"\n", ptr->busid); if (ptr->screen > -1) fprintf (cf, " Screen %d\n", ptr->screen); if (ptr->irq >= 0) fprintf (cf, " IRQ %d\n", ptr->irq); fprintf (cf, "EndSection\n\n"); ptr = ptr->next; } } void xconfigFreeDeviceList (XConfigDevicePtr *ptr) { XConfigDevicePtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->identifier); TEST_FREE ((*ptr)->vendor); TEST_FREE ((*ptr)->board); TEST_FREE ((*ptr)->chipset); TEST_FREE ((*ptr)->card); TEST_FREE ((*ptr)->driver); TEST_FREE ((*ptr)->ramdac); TEST_FREE ((*ptr)->clockchip); TEST_FREE ((*ptr)->comment); xconfigFreeOptionList (&((*ptr)->options)); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } int xconfigValidateDevice (XConfigPtr p) { XConfigDevicePtr device = p->devices; if (!device) { xconfigErrorMsg(ValidationErrorMsg, "At least one Device section " "is required."); return (FALSE); } while (device) { if (!device->driver) { xconfigErrorMsg(ValidationErrorMsg, UNDEFINED_DRIVER_MSG, device->identifier); return (FALSE); } device = device->next; } return (TRUE); } XConfigDevicePtr xconfigFindDevice (const char *ident, XConfigDevicePtr p) { while (p) { if (xconfigNameCompare (ident, p->identifier) == 0) return (p); p = p->next; } return (NULL); } /* * Determine what bus type the busID string represents. The start of the * bus-dependent part of the string is returned as retID. */ static int isPci(const char* busID, const char **retID) { char *p, *s; int ret = FALSE; /* If no type field, Default to PCI */ if (isdigit(busID[0])) { if (retID) *retID = busID; return TRUE; } s = strdup(busID); p = strtok(s, ":"); if (p == NULL || *p == 0) { free(s); return FALSE; } if (!xconfigNameCompare(p, "pci") || !xconfigNameCompare(p, "agp")) { if (retID) *retID = busID + strlen(p) + 1; ret = TRUE; } free(s); return ret; } /* * Parse a BUS ID string, and return the PCI bus parameters if it was * in the correct format for a PCI bus id. */ int xconfigParsePciBusString(const char *busID, int *bus, int *device, int *func) { /* * The format is assumed to be "bus[@domain]:device[:func]", where domain, * bus, device and func are decimal integers. func may be omitted and * assumed to be zero. */ char *p, *s, *d; const char *id; int i; if (!isPci(busID, &id)) return FALSE; s = strdup(id); p = strtok(s, ":"); if (p == NULL || *p == 0) { free(s); return FALSE; } d = strpbrk(p, "@"); if (d != NULL) { *(d++) = 0; for (i = 0; d[i] != 0; i++) { if (!isdigit(d[i])) { free(s); return FALSE; } } } for (i = 0; p[i] != 0; i++) { if (!isdigit(p[i])) { free(s); return FALSE; } } *bus = atoi(p); if (d != NULL && *d != 0) *bus += atoi(d) << 8; p = strtok(NULL, ":"); if (p == NULL || *p == 0) { free(s); return FALSE; } for (i = 0; p[i] != 0; i++) { if (!isdigit(p[i])) { free(s); return FALSE; } } *device = atoi(p); *func = 0; p = strtok(NULL, ":"); if (p == NULL || *p == 0) { free(s); return TRUE; } for (i = 0; p[i] != 0; i++) { if (!isdigit(p[i])) { free(s); return FALSE; } } *func = atoi(p); free(s); return TRUE; } /* * xconfigFormatPciBusString : The function checks for the availability * of PCI domain & accordingly formats the busid string. */ void xconfigFormatPciBusString(char *str, int len, int domain, int bus, int device, int func) { if (domain) { snprintf(str, len, "PCI:%d@%d:%d:%d", bus, domain, device, func); } else { snprintf(str, len, "PCI:%d:%d:%d", bus, device, func); } str[len - 1] = '\0'; } nvidia-settings/src/XF86Config-parser/Write.c0000664000175000017500000001154012236467170021203 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ /* View/edit this file with tab stops set to 4 */ #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" #include #include #include #include #include #include int xconfigWriteConfigFile (const char *filename, XConfigPtr cptr) { FILE *cf; char *locale; if ((cf = fopen(filename, "w")) == NULL) { xconfigErrorMsg(WriteErrorMsg, "Unable to open the file \"%s\" for " "writing (%s).\n", filename, strerror(errno)); return FALSE; } /* * read the current locale and then set the standard "C" locale, * so that the X configuration writer does not use locale-specific * formatting. After writing the configuration file, we restore * the original locale. */ locale = setlocale(LC_ALL, NULL); if (locale) locale = strdup(locale); setlocale(LC_ALL, "C"); if (cptr->comment) fprintf (cf, "%s\n", cptr->comment); xconfigPrintLayoutSection (cf, cptr->layouts); if (cptr->files) { fprintf (cf, "Section \"Files\"\n"); xconfigPrintFileSection (cf, cptr->files); fprintf (cf, "EndSection\n\n"); } if (cptr->modules) { fprintf (cf, "Section \"Module\"\n"); xconfigPrintModuleSection (cf, cptr->modules); fprintf (cf, "EndSection\n\n"); } xconfigPrintVendorSection (cf, cptr->vendors); xconfigPrintServerFlagsSection (cf, cptr->flags); xconfigPrintInputSection (cf, cptr->inputs); xconfigPrintInputClassSection (cf, cptr->inputclasses); xconfigPrintVideoAdaptorSection (cf, cptr->videoadaptors); xconfigPrintModesSection (cf, cptr->modes); xconfigPrintMonitorSection (cf, cptr->monitors); xconfigPrintDeviceSection (cf, cptr->devices); xconfigPrintScreenSection (cf, cptr->screens); xconfigPrintDRISection (cf, cptr->dri); xconfigPrintExtensionsSection (cf, cptr->extensions); fclose(cf); /* restore the original locale */ if (locale) { setlocale(LC_ALL, locale); free(locale); } return TRUE; } nvidia-settings/src/XF86Config-parser/Keyboard.c0000664000175000017500000002507012236467170021654 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ /* View/edit this file with tab stops set to 4 */ #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" #include "ctype.h" extern LexRec val; static XConfigSymTabRec KeyboardTab[] = { {ENDSECTION, "endsection"}, {KPROTOCOL, "protocol"}, {AUTOREPEAT, "autorepeat"}, {XLEDS, "xleds"}, {PANIX106, "panix106"}, {XKBKEYMAP, "xkbkeymap"}, {XKBCOMPAT, "xkbcompat"}, {XKBTYPES, "xkbtypes"}, {XKBKEYCODES, "xkbkeycodes"}, {XKBGEOMETRY, "xkbgeometry"}, {XKBSYMBOLS, "xkbsymbols"}, {XKBDISABLE, "xkbdisable"}, {XKBRULES, "xkbrules"}, {XKBMODEL, "xkbmodel"}, {XKBLAYOUT, "xkblayout"}, {XKBVARIANT, "xkbvariant"}, {XKBOPTIONS, "xkboptions"}, /* The next two have become ServerFlags options */ {VTINIT, "vtinit"}, {VTSYSREQ, "vtsysreq"}, /* Obsolete keywords */ {SERVERNUM, "servernumlock"}, {LEFTALT, "leftalt"}, {RIGHTALT, "rightalt"}, {RIGHTALT, "altgr"}, {SCROLLLOCK_TOK, "scrolllock"}, {RIGHTCTL, "rightctl"}, {-1, ""}, }; /* Obsolete */ static XConfigSymTabRec KeyMapTab[] = { {CONF_KM_META, "meta"}, {CONF_KM_COMPOSE, "compose"}, {CONF_KM_MODESHIFT, "modeshift"}, {CONF_KM_MODELOCK, "modelock"}, {CONF_KM_SCROLLLOCK, "scrolllock"}, {CONF_KM_CONTROL, "control"}, {-1, ""}, }; #define CLEANUP xconfigFreeInputList XConfigInputPtr xconfigParseKeyboardSection (void) { char *s, *s1, *s2; int l; int token, ntoken; PARSE_PROLOGUE (XConfigInputPtr, XConfigInputRec) while ((token = xconfigGetToken (KeyboardTab)) != ENDSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case KPROTOCOL: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Protocol"); xconfigAddNewOption(&ptr->options, "Protocol", val.str); break; case AUTOREPEAT: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (AUTOREPEAT_MSG, NULL); s1 = xconfigULongToString(val.num); if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (AUTOREPEAT_MSG, NULL); s2 = xconfigULongToString(val.num); l = strlen(s1) + 1 + strlen(s2) + 1; s = malloc(l); sprintf(s, "%s %s", s1, s2); free(s1); free(s2); xconfigAddNewOption(&ptr->options, "AutoRepeat", s); break; case XLEDS: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) Error (XLEDS_MSG, NULL); s = xconfigULongToString(val.num); l = strlen(s) + 1; while ((token = xconfigGetSubToken(&(ptr->comment))) == NUMBER) { s1 = xconfigULongToString(val.num); l += (1 + strlen(s1)); s = realloc(s, l); strcat(s, " "); strcat(s, s1); free(s1); } xconfigUnGetToken (token); break; case SERVERNUM: xconfigErrorMsg(ParseWarningMsg, OBSOLETE_MSG, xconfigTokenString()); break; case LEFTALT: case RIGHTALT: case SCROLLLOCK_TOK: case RIGHTCTL: xconfigErrorMsg(ParseWarningMsg, OBSOLETE_MSG, xconfigTokenString()); break; ntoken = xconfigGetToken (KeyMapTab); switch (ntoken) { case EOF_TOKEN: xconfigErrorMsg(ParseErrorMsg, UNEXPECTED_EOF_MSG); CLEANUP (&ptr); return (NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } break; case VTINIT: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "VTInit"); xconfigErrorMsg(ParseWarningMsg, MOVED_TO_FLAGS_MSG, "VTInit"); break; case VTSYSREQ: xconfigErrorMsg(ParseWarningMsg, MOVED_TO_FLAGS_MSG, "VTSysReq"); break; case XKBDISABLE: xconfigAddNewOption(&ptr->options, "XkbDisable", NULL); break; case XKBKEYMAP: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "XKBKeymap"); xconfigAddNewOption(&ptr->options, "XkbKeymap", val.str); break; case XKBCOMPAT: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "XKBCompat"); xconfigAddNewOption(&ptr->options, "XkbCompat", val.str); break; case XKBTYPES: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "XKBTypes"); xconfigAddNewOption(&ptr->options, "XkbTypes", val.str); break; case XKBKEYCODES: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "XKBKeycodes"); xconfigAddNewOption(&ptr->options, "XkbKeycodes", val.str); break; case XKBGEOMETRY: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "XKBGeometry"); xconfigAddNewOption(&ptr->options, "XkbGeometry", val.str); break; case XKBSYMBOLS: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "XKBSymbols"); xconfigAddNewOption(&ptr->options, "XkbSymbols", val.str); break; case XKBRULES: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "XKBRules"); xconfigAddNewOption(&ptr->options, "XkbRules", val.str); break; case XKBMODEL: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "XKBModel"); xconfigAddNewOption(&ptr->options, "XkbModel", val.str); break; case XKBLAYOUT: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "XKBLayout"); xconfigAddNewOption(&ptr->options, "XkbLayout", val.str); break; case XKBVARIANT: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "XKBVariant"); xconfigAddNewOption(&ptr->options, "XkbVariant", val.str); break; case XKBOPTIONS: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "XKBOptions"); xconfigAddNewOption(&ptr->options, "XkbOptions", val.str); break; case PANIX106: xconfigAddNewOption(&ptr->options, "Panix106", NULL); break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } ptr->identifier = xconfigStrdup(CONF_IMPLICIT_KEYBOARD); ptr->driver = xconfigStrdup("keyboard"); xconfigAddNewOption(&ptr->options, "CoreKeyboard", NULL); return ptr; } nvidia-settings/src/XF86Config-parser/Pointer.c0000664000175000017500000001745412236467170021543 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ /* View/edit this file with tab stops set to 4 */ #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" extern LexRec val; static XConfigSymTabRec PointerTab[] = { {PROTOCOL, "protocol"}, {EMULATE3, "emulate3buttons"}, {EM3TIMEOUT, "emulate3timeout"}, {ENDSUBSECTION, "endsubsection"}, {ENDSECTION, "endsection"}, {PDEVICE, "device"}, {PDEVICE, "port"}, {BAUDRATE, "baudrate"}, {SAMPLERATE, "samplerate"}, {CLEARDTR, "cleardtr"}, {CLEARRTS, "clearrts"}, {CHORDMIDDLE, "chordmiddle"}, {PRESOLUTION, "resolution"}, {DEVICE_NAME, "devicename"}, {ALWAYSCORE, "alwayscore"}, {PBUTTONS, "buttons"}, {ZAXISMAPPING, "zaxismapping"}, {-1, ""}, }; static XConfigSymTabRec ZMapTab[] = { {XAXIS, "x"}, {YAXIS, "y"}, {-1, ""}, }; #define CLEANUP xconfigFreeInputList XConfigInputPtr xconfigParsePointerSection (void) { char *s, *s1, *s2; int l; int token; PARSE_PROLOGUE (XConfigInputPtr, XConfigInputRec) while ((token = xconfigGetToken (PointerTab)) != ENDSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case PROTOCOL: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Protocol"); xconfigAddNewOption(&ptr->options, "Protocol", val.str); break; case PDEVICE: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Device"); xconfigAddNewOption(&ptr->options, "Device", val.str); break; case EMULATE3: xconfigAddNewOption(&ptr->options, "Emulate3Buttons", NULL); break; case EM3TIMEOUT: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER || val.num < 0) Error (POSITIVE_INT_MSG, "Emulate3Timeout"); s = xconfigULongToString(val.num); xconfigAddNewOption(&ptr->options, "Emulate3Timeout", s); TEST_FREE(s); break; case CHORDMIDDLE: xconfigAddNewOption(&ptr->options, "ChordMiddle", NULL); break; case PBUTTONS: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER || val.num < 0) Error (POSITIVE_INT_MSG, "Buttons"); s = xconfigULongToString(val.num); xconfigAddNewOption(&ptr->options, "Buttons", s); TEST_FREE(s); break; case BAUDRATE: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER || val.num < 0) Error (POSITIVE_INT_MSG, "BaudRate"); s = xconfigULongToString(val.num); xconfigAddNewOption(&ptr->options, "BaudRate", s); TEST_FREE(s); break; case SAMPLERATE: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER || val.num < 0) Error (POSITIVE_INT_MSG, "SampleRate"); s = xconfigULongToString(val.num); xconfigAddNewOption(&ptr->options, "SampleRate", s); TEST_FREE(s); break; case PRESOLUTION: if (xconfigGetSubToken (&(ptr->comment)) != NUMBER || val.num < 0) Error (POSITIVE_INT_MSG, "Resolution"); s = xconfigULongToString(val.num); xconfigAddNewOption(&ptr->options, "Resolution", s); TEST_FREE(s); break; case CLEARDTR: xconfigAddNewOption(&ptr->options, "ClearDTR", NULL); break; case CLEARRTS: xconfigAddNewOption(&ptr->options, "ClearRTS", NULL); break; case ZAXISMAPPING: switch (xconfigGetToken(ZMapTab)) { case NUMBER: if (val.num < 0) Error (ZAXISMAPPING_MSG, NULL); s1 = xconfigULongToString(val.num); if (xconfigGetSubToken (&(ptr->comment)) != NUMBER || val.num < 0) Error (ZAXISMAPPING_MSG, NULL); s2 = xconfigULongToString(val.num); l = strlen(s1) + 1 + strlen(s2) + 1; s = malloc(l); sprintf(s, "%s %s", s1, s2); free(s1); free(s2); break; case XAXIS: s = xconfigStrdup("x"); break; case YAXIS: s = xconfigStrdup("y"); break; default: Error (ZAXISMAPPING_MSG, NULL); break; } xconfigAddNewOption(&ptr->options, "ZAxisMapping", s); TEST_FREE(s); break; case ALWAYSCORE: break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } ptr->identifier = xconfigStrdup(CONF_IMPLICIT_POINTER); ptr->driver = xconfigStrdup("mouse"); xconfigAddNewOption(&ptr->options, "CorePointer", NULL); return ptr; } #undef CLEANUP nvidia-settings/src/XF86Config-parser/Configint.h0000664000175000017500000002101712236467170022036 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2002 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ /* * These definitions are used through out the configuration file parser, but * they should not be visible outside of the parser. */ #ifndef _Configint_h_ #define _Configint_h_ #include #include #include #include #include "xf86Parser.h" typedef struct { int num; /* returned number */ char *str; /* private copy of the return-string */ double realnum; /* returned number as a real */ } LexRec, *LexPtr; #include "configProcs.h" #include #define TEST_FREE(a) \ if (a) { \ free (a); \ a = NULL; \ } #define PARSE_PROLOGUE(typeptr,typerec) \ typeptr ptr; \ if ((ptr = (typeptr) calloc(1, sizeof(typerec))) == NULL) { \ return NULL; \ } \ memset(ptr, 0, sizeof(typerec)); #define HANDLE_LIST(field,func,type) \ { \ type p = func(); \ if (p == NULL) { \ CLEANUP (&ptr); \ return (NULL); \ } else { \ xconfigAddListItem((GenericListPtr*)(&ptr->field), \ (GenericListPtr) p); \ } \ } #define Error(a,b) \ do { \ xconfigErrorMsg(ParseErrorMsg, a, b); \ CLEANUP (&ptr); \ return NULL; \ } while (0) /* * These are defines for error messages to promote consistency. * error messages are preceded by the line number, section and file name, * so these messages should be about the specific keyword and syntax in error. * To help limit namespace polution, end each with _MSG. * limit messages to 70 characters if possible. */ #define BAD_OPTION_MSG \ "The Option keyword requires 1 or 2 quoted strings to follow it." #define INVALID_KEYWORD_MSG \ "\"%s\" is not a valid keyword in this section." #define INVALID_SECTION_MSG \ "\"%s\" is not a valid section name." #define UNEXPECTED_EOF_MSG \ "Unexpected EOF. Missing EndSection keyword?" #define QUOTE_MSG \ "The %s keyword requires a quoted string to follow it." #define NUMBER_MSG \ "The %s keyword requires a number to follow it." #define POSITIVE_INT_MSG \ "The %s keyword requires a positive integer to follow it." #define ZAXISMAPPING_MSG \ "The ZAxisMapping keyword requires 2 positive numbers or X or Y to follow it." #define AUTOREPEAT_MSG \ "The AutoRepeat keyword requires 2 numbers (delay and rate) to follow it." #define XLEDS_MSG \ "The XLeds keyword requries one or more numbers to follow it." #define DACSPEED_MSG \ "The DacSpeed keyword must be followed by a list of up to %d numbers." #define DISPLAYSIZE_MSG \ "The DisplaySize keyword must be followed by the width and height in mm." #define HORIZSYNC_MSG \ "The HorizSync keyword must be followed by a list of numbers or ranges." #define VERTREFRESH_MSG \ "The VertRefresh keyword must be followed by a list of numbers or ranges." #define VIEWPORT_MSG \ "The Viewport keyword must be followed by an X and Y value." #define VIRTUAL_MSG \ "The Virtual keyword must be followed by a width and height value." #define WEIGHT_MSG \ "The Weight keyword must be followed by red, green and blue values." #define BLACK_MSG \ "The Black keyword must be followed by red, green and blue values." #define WHITE_MSG \ "The White keyword must be followed by red, green and blue values." #define SCREEN_MSG \ "The Screen keyword must be followed by an optional number, a screen name\n" \ "\tin quotes, and optional position/layout information." #define INVALID_SCR_MSG \ "Invalid Screen line." #define INPUTDEV_MSG \ "The InputDevice keyword must be followed by an input device name in quotes." #define INACTIVE_MSG \ "The Inactive keyword must be followed by a Device name in quotes." #define UNDEFINED_SCREEN_MSG \ "Undefined Screen \"%s\" referenced by ServerLayout \"%s\"." #define UNDEFINED_MONITOR_MSG \ "Undefined Monitor \"%s\" referenced by Screen \"%s\"." #define UNDEFINED_MODES_MSG \ "Undefined Modes Section \"%s\" referenced by Monitor \"%s\"." #define UNDEFINED_DEVICE_MSG \ "Undefined Device \"%s\" referenced by Screen \"%s\"." #define UNDEFINED_ADAPTOR_MSG \ "Undefined VideoAdaptor \"%s\" referenced by Screen \"%s\"." #define ADAPTOR_REF_TWICE_MSG \ "VideoAdaptor \"%s\" already referenced by Screen \"%s\"." #define UNDEFINED_DEVICE_LAY_MSG \ "Undefined Device \"%s\" referenced by ServerLayout \"%s\"." #define UNDEFINED_INPUT_MSG \ "Undefined InputDevice \"%s\" referenced by ServerLayout \"%s\"." #define NO_IDENT_MSG \ "This section must have an Identifier line." #define ONLY_ONE_MSG \ "This section must have only one of either %s line." #define UNDEFINED_DRIVER_MSG \ "Device section \"%s\" must have a Driver line." #define UNDEFINED_INPUTDRIVER_MSG \ "InputDevice section \"%s\" must have a Driver line." #define INVALID_GAMMA_MSG \ "gamma correction value(s) expected\n either one value or three r/g/b values." #define GROUP_MSG \ "The Group keyword must be followed by either a group name in quotes or\n" \ "\ta numerical group id." #define MULTIPLE_MSG \ "Multiple \"%s\" lines." /* Warning messages */ #define OBSOLETE_MSG \ "Ignoring obsolete keyword \"%s\"." #define MOVED_TO_FLAGS_MSG \ "Keyword \"%s\" is now an Option flag in the ServerFlags section." #endif /* _Configint_h_ */ nvidia-settings/src/XF86Config-parser/xf86Parser.h0000664000175000017500000005545212236467170022100 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ /* * This file specifies the external interface for the X configuration * file parser; based loosely on the XFree86 and Xorg X server * configuration code. */ #ifndef _xf86Parser_h_ #define _xf86Parser_h_ #include #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif // Unix variations: Linux #if !defined(NV_LINUX) && defined(__linux__) # define NV_LINUX #endif // defined(__linux__) // Unix variations: SunOS #if !defined(NV_SUNOS) && (defined(__sun__) || defined(__sun)) # define NV_SUNOS #endif // defined(__sun__) // Unix variations: FreeBSD #if !defined(NV_BSD) && defined(__FreeBSD__) # define NV_BSD #endif // defined(__FreeBSD__) /* * return codes */ typedef enum { XCONFIG_RETURN_SUCCESS = 0, XCONFIG_RETURN_NO_XCONFIG_FOUND, XCONFIG_RETURN_PARSE_ERROR, XCONFIG_RETURN_ALLOCATION_ERROR, XCONFIG_RETURN_VALIDATION_ERROR, XCONFIG_RETURN_INVALID_COMMAND_LINE, XCONFIG_RETURN_SANITY_ERROR, XCONFIG_RETURN_WRITE_ERROR } XConfigError; /* * Message types */ typedef enum { ParseErrorMsg, ParseWarningMsg, ValidationErrorMsg, InternalErrorMsg, WriteErrorMsg, WarnMsg, ErrorMsg, DebugMsg, UnknownMsg } MsgType; /* * The user of libXF86Config-parser should provide an implementation * of xconfigPrint() */ void xconfigPrint(MsgType t, const char *msg); /* * all records that need to be linked lists should contain a next * pointer as their first field, so that they can be cast as a * GenericListRec */ typedef struct { void *next; } GenericListRec, *GenericListPtr; /* * Options are stored in the XConfigOptionRec structure */ typedef struct __xconfigoptionrec { struct __xconfigoptionrec *next; char *name; char *val; char *comment; } XConfigOptionRec, *XConfigOptionPtr; /* * Files Section */ typedef struct { char *logfile; char *rgbpath; char *modulepath; char *inputdevs; char *fontpath; char *comment; } XConfigFilesRec, *XConfigFilesPtr; /* Values for load_type */ #define XCONFIG_LOAD_MODULE 0 #define XCONFIG_LOAD_DRIVER 1 #define XCONFIG_DISABLE_MODULE 2 /* * Modules Section */ typedef struct __xconfigloadrec { struct __xconfigloadrec *next; int type; char *name; XConfigOptionPtr opt; char *comment; } XConfigLoadRec, *XConfigLoadPtr; typedef struct { XConfigLoadPtr loads; XConfigLoadPtr disables; char *comment; } XConfigModuleRec, *XConfigModulePtr; #define CONF_IMPLICIT_KEYBOARD "Implicit Core Keyboard" #define CONF_IMPLICIT_POINTER "Implicit Core Pointer" /* * Modeline structure */ #define XCONFIG_MODE_PHSYNC 0x0001 #define XCONFIG_MODE_NHSYNC 0x0002 #define XCONFIG_MODE_PVSYNC 0x0004 #define XCONFIG_MODE_NVSYNC 0x0008 #define XCONFIG_MODE_INTERLACE 0x0010 #define XCONFIG_MODE_DBLSCAN 0x0020 #define XCONFIG_MODE_CSYNC 0x0040 #define XCONFIG_MODE_PCSYNC 0x0080 #define XCONFIG_MODE_NCSYNC 0x0100 #define XCONFIG_MODE_HSKEW 0x0200 /* hskew provided */ #define XCONFIG_MODE_BCAST 0x0400 #define XCONFIG_MODE_CUSTOM 0x0800 /* timing numbers customized by editor */ #define XCONFIG_MODE_VSCAN 0x1000 typedef struct __xconfigconfmodelinerec { struct __xconfigconfmodelinerec *next; char *identifier; char *clock; /* stored in MHz */ int hdisplay; int hsyncstart; int hsyncend; int htotal; int vdisplay; int vsyncstart; int vsyncend; int vtotal; int vscan; int flags; int hskew; char *comment; } XConfigModeLineRec, *XConfigModeLinePtr; /* * VideoPort and VideoAdapter XXX what are these? */ typedef struct __xconfigconfvideoportrec { struct __xconfigconfvideoportrec *next; char *identifier; XConfigOptionPtr options; char *comment; } XConfigVideoPortRec, *XConfigVideoPortPtr; typedef struct __xconfigconfvideoadaptorrec { struct __xconfigconfvideoadaptorrec *next; char *identifier; char *vendor; char *board; char *busid; char *driver; XConfigOptionPtr options; XConfigVideoPortPtr ports; char *fwdref; char *comment; } XConfigVideoAdaptorRec, *XConfigVideoAdaptorPtr; /* * Monitor Section */ #define CONF_MAX_HSYNC 8 #define CONF_MAX_VREFRESH 8 typedef struct { float hi, lo; } parser_range; typedef struct { int red, green, blue; } parser_rgb; typedef struct __xconfigconfmodesrec { struct __xconfigconfmodesrec *next; char *identifier; XConfigModeLinePtr modelines; char *comment; } XConfigModesRec, *XConfigModesPtr; typedef struct __xconfigconfmodeslinkrec { struct __xconfigconfmodeslinkrec *next; char *modes_name; XConfigModesPtr modes; } XConfigModesLinkRec, *XConfigModesLinkPtr; typedef struct __xconfigconfmonitorrec { struct __xconfigconfmonitorrec *next; char *identifier; char *vendor; char *modelname; int width; /* in mm */ int height; /* in mm */ XConfigModeLinePtr modelines; int n_hsync; parser_range hsync[CONF_MAX_HSYNC]; int n_vrefresh; parser_range vrefresh[CONF_MAX_VREFRESH]; float gamma_red; float gamma_green; float gamma_blue; XConfigOptionPtr options; XConfigModesLinkPtr modes_sections; char *comment; } XConfigMonitorRec, *XConfigMonitorPtr; /* * Device Section */ #define CONF_MAXDACSPEEDS 4 #define CONF_MAXCLOCKS 128 typedef struct __xconfigconfdevicerec { struct __xconfigconfdevicerec *next; char *identifier; char *vendor; char *board; char *chipset; char *busid; char *card; char *driver; char *ramdac; int dacSpeeds[CONF_MAXDACSPEEDS]; int videoram; int textclockfreq; unsigned long bios_base; unsigned long mem_base; unsigned long io_base; char *clockchip; int clocks; int clock[CONF_MAXCLOCKS]; int chipid; int chiprev; int irq; int screen; XConfigOptionPtr options; char *comment; } XConfigDeviceRec, *XConfigDevicePtr; /* * Screen Section */ typedef struct __xconfigmoderec { struct __xconfigmoderec *next; char *mode_name; } XConfigModeRec, *XConfigModePtr; typedef struct __xconfigconfdisplayrec { struct __xconfigconfdisplayrec *next; int frameX0; int frameY0; int virtualX; int virtualY; int depth; int bpp; char *visual; parser_rgb weight; parser_rgb black; parser_rgb white; XConfigModePtr modes; XConfigOptionPtr options; char *comment; } XConfigDisplayRec, *XConfigDisplayPtr; typedef struct __xconfigconfadaptorlinkrec { struct __xconfigconfadaptorlinkrec *next; char *adaptor_name; XConfigVideoAdaptorPtr adaptor; } XConfigAdaptorLinkRec, *XConfigAdaptorLinkPtr; typedef struct __xconfigconfscreenrec { struct __xconfigconfscreenrec *next; char *identifier; char *obsolete_driver; int defaultdepth; int defaultbpp; int defaultfbbpp; char *monitor_name; XConfigMonitorPtr monitor; char *device_name; XConfigDevicePtr device; XConfigAdaptorLinkPtr adaptors; XConfigDisplayPtr displays; XConfigOptionPtr options; char *comment; } XConfigScreenRec, *XConfigScreenPtr; /* * Input Section */ typedef struct __xconfigconfinputrec { struct __xconfigconfinputrec *next; char *identifier; char *driver; XConfigOptionPtr options; char *comment; } XConfigInputRec, *XConfigInputPtr; /* * Input Class Section */ typedef struct __xconfigconfinputclassrec { struct __xconfigconfinputclassrec *next; char *identifier; char *driver; char *match_is_pointer; char *match_is_touchpad; char *match_is_touchscreen; char *match_is_keyboard; char *match_is_joystick; char *match_is_tablet; char *match_tag; char *match_device_path; char *match_os; char *match_usb_id; char *match_pnp_id; char *match_product; char *match_driver; char *match_vendor; XConfigOptionPtr options; char *comment; } XConfigInputClassRec, *XConfigInputClassPtr; /* * Input Reference; used by layout to store list of XConfigInputPtrs */ typedef struct __xconfigconfinputrefrec { struct __xconfigconfinputrefrec *next; XConfigInputPtr input; char *input_name; XConfigOptionPtr options; } XConfigInputrefRec, *XConfigInputrefPtr; /* * Adjacency structure; used by layout to store list of * XConfigScreenPtrs */ /* Values for adj_where */ #define CONF_ADJ_OBSOLETE -1 #define CONF_ADJ_ABSOLUTE 0 #define CONF_ADJ_RIGHTOF 1 #define CONF_ADJ_LEFTOF 2 #define CONF_ADJ_ABOVE 3 #define CONF_ADJ_BELOW 4 #define CONF_ADJ_RELATIVE 5 typedef struct __xconfigconfadjacencyrec { struct __xconfigconfadjacencyrec *next; int scrnum; XConfigScreenPtr screen; char *screen_name; XConfigScreenPtr top; char *top_name; XConfigScreenPtr bottom; char *bottom_name; XConfigScreenPtr left; char *left_name; XConfigScreenPtr right; char *right_name; int where; int x; int y; char *refscreen; } XConfigAdjacencyRec, *XConfigAdjacencyPtr; /* * XConfigInactiveRec XXX what is this? */ typedef struct __xconfigconfinactiverec { struct __xconfigconfinactiverec *next; char *device_name; XConfigDevicePtr device; } XConfigInactiveRec, *XConfigInactivePtr; /* * Layout Section */ typedef struct __xconfigconflayoutrec { struct __xconfigconflayoutrec *next; char *identifier; XConfigAdjacencyPtr adjacencies; XConfigInactivePtr inactives; XConfigInputrefPtr inputs; XConfigOptionPtr options; char *comment; } XConfigLayoutRec, *XConfigLayoutPtr; /* * Vendor Section XXX what is this? */ typedef struct __xconfigconfvendsubrec { struct __xconfigconfvendsubrec *next; char *name; char *identifier; XConfigOptionPtr options; char *comment; } XConfigVendSubRec, *XConfigVendSubPtr; typedef struct __xconfigconfvendorrec { struct __xconfigconfvendorrec *next; char *identifier; XConfigOptionPtr options; XConfigVendSubPtr subs; char *comment; } XConfigVendorRec, *XConfigVendorPtr; /* * DRI section */ typedef struct __xconfigconfbuffersrec { struct __xconfigconfbuffersrec *next; int count; int size; char *flags; char *comment; } XConfigBuffersRec, *XConfigBuffersPtr; typedef struct { char *group_name; int group; int mode; XConfigBuffersPtr buffers; char * comment; } XConfigDRIRec, *XConfigDRIPtr; /* * ServerFlags Section */ typedef struct { XConfigOptionPtr options; char *comment; } XConfigFlagsRec, *XConfigFlagsPtr; /* * Extensions Section */ typedef struct { XConfigOptionPtr options; char *comment; } XConfigExtensionsRec, *XConfigExtensionsPtr; /* * Configuration file structure */ typedef struct { XConfigFilesPtr files; XConfigModulePtr modules; XConfigFlagsPtr flags; XConfigVideoAdaptorPtr videoadaptors; XConfigModesPtr modes; XConfigMonitorPtr monitors; XConfigDevicePtr devices; XConfigScreenPtr screens; XConfigInputPtr inputs; XConfigInputClassPtr inputclasses; XConfigLayoutPtr layouts; XConfigVendorPtr vendors; XConfigDRIPtr dri; XConfigExtensionsPtr extensions; char *comment; char *filename; } XConfigRec, *XConfigPtr; typedef struct { int token; /* id of the token */ char *name; /* pointer to the LOWERCASED name */ } XConfigSymTabRec, *XConfigSymTabPtr; /* * data structure containing options; used during generation of X * config, and when sanitizing an existing config */ #define X_IS_XF86 0 #define X_IS_XORG 1 typedef struct { int xserver; char *x_project_root; char *keyboard; char *mouse; char *keyboard_driver; int supports_extension_section; int autoloads_glx; } GenerateOptions; /* * Functions for open, reading, and writing XConfig files. */ const char *xconfigOpenConfigFile(const char *, const char *); XConfigError xconfigReadConfigFile(XConfigPtr *); int xconfigSanitizeConfig(XConfigPtr p, const char *screenName, GenerateOptions *gop); void xconfigCloseConfigFile(void); int xconfigWriteConfigFile(const char *, XConfigPtr); void xconfigFreeConfig(XConfigPtr *p); /* * Functions for searching for entries in lists */ XConfigDevicePtr xconfigFindDevice(const char *ident, XConfigDevicePtr p); XConfigLayoutPtr xconfigFindLayout(const char *name, XConfigLayoutPtr list); XConfigMonitorPtr xconfigFindMonitor(const char *ident, XConfigMonitorPtr p); XConfigModesPtr xconfigFindModes(const char *ident, XConfigModesPtr p); XConfigModeLinePtr xconfigFindModeLine(const char *ident, XConfigModeLinePtr p); XConfigScreenPtr xconfigFindScreen(const char *ident, XConfigScreenPtr p); XConfigModePtr xconfigFindMode(const char *name, XConfigModePtr p); XConfigInputPtr xconfigFindInput(const char *ident, XConfigInputPtr p); XConfigInputPtr xconfigFindInputByDriver(const char *driver, XConfigInputPtr p); XConfigVendorPtr xconfigFindVendor(const char *name, XConfigVendorPtr list); XConfigVideoAdaptorPtr xconfigFindVideoAdaptor(const char *ident, XConfigVideoAdaptorPtr p); /* * Functions for freeing lists */ void xconfigFreeDeviceList(XConfigDevicePtr *ptr); void xconfigFreeFiles(XConfigFilesPtr *p); void xconfigFreeFlags(XConfigFlagsPtr *flags); void xconfigFreeInputList(XConfigInputPtr *ptr); void xconfigFreeInputClassList(XConfigInputClassPtr *ptr); void xconfigFreeLayoutList(XConfigLayoutPtr *ptr); void xconfigFreeAdjacencyList(XConfigAdjacencyPtr *ptr); void xconfigFreeInputrefList(XConfigInputrefPtr *ptr); void xconfigFreeModules(XConfigModulePtr *ptr); void xconfigFreeMonitorList(XConfigMonitorPtr *ptr); void xconfigFreeModesList(XConfigModesPtr *ptr); void xconfigFreeModeLineList(XConfigModeLinePtr *ptr); void xconfigFreeOptionList(XConfigOptionPtr *opt); void xconfigFreeScreenList(XConfigScreenPtr *ptr); void xconfigFreeAdaptorLinkList(XConfigAdaptorLinkPtr *ptr); void xconfigFreeDisplayList(XConfigDisplayPtr *ptr); void xconfigFreeModeList(XConfigModePtr *ptr); void xconfigFreeVendorList(XConfigVendorPtr *p); void xconfigFreeVendorSubList(XConfigVendSubPtr *ptr); void xconfigFreeVideoAdaptorList(XConfigVideoAdaptorPtr *ptr); void xconfigFreeVideoPortList(XConfigVideoPortPtr *ptr); void xconfigFreeBuffersList (XConfigBuffersPtr *ptr); void xconfigFreeDRI(XConfigDRIPtr *ptr); void xconfigFreeExtensions(XConfigExtensionsPtr *ptr); void xconfigFreeModesLinkList(XConfigModesLinkPtr *ptr); /* * item/list manipulation */ void xconfigAddListItem(GenericListPtr *pHead, GenericListPtr c_new); void xconfigRemoveListItem(GenericListPtr *pHead, GenericListPtr item); int xconfigItemNotSublist(GenericListPtr list_1, GenericListPtr list_2); char *xconfigAddComment(char *cur, char *add); void xconfigAddNewLoadDirective(XConfigLoadPtr *pHead, char *name, int type, XConfigOptionPtr opts, int do_token); void xconfigRemoveLoadDirective(XConfigLoadPtr *pHead, XConfigLoadPtr load); /* * Functions for manipulating Options */ void xconfigAddNewOption(XConfigOptionPtr *pHead, const char *name, const char *val); void xconfigRemoveOption(XConfigOptionPtr *pHead, XConfigOptionPtr opt); void xconfigRemoveNamedOption(XConfigOptionPtr *head, const char *name, char **comments); XConfigOptionPtr xconfigOptionListDup(XConfigOptionPtr opt); char *xconfigOptionName(XConfigOptionPtr opt); char *xconfigOptionValue(XConfigOptionPtr opt); XConfigOptionPtr xconfigNewOption(const char *name, const char *value); XConfigOptionPtr xconfigNextOption(XConfigOptionPtr list); XConfigOptionPtr xconfigFindOption(XConfigOptionPtr list, const char *name); char *xconfigFindOptionValue(XConfigOptionPtr list, const char *name); int xconfigFindOptionBoolean (XConfigOptionPtr, const char *name); XConfigOptionPtr xconfigOptionListMerge(XConfigOptionPtr head, XConfigOptionPtr tail); /* * Miscellaneous utility routines */ char *xconfigStrdup(const char *s); char *xconfigStrcat(const char *str, ...); int xconfigNameCompare(const char *s1, const char *s2); int xconfigModelineCompare(XConfigModeLinePtr m1, XConfigModeLinePtr m2); char *xconfigULongToString(unsigned long i); XConfigOptionPtr xconfigParseOption(XConfigOptionPtr head); void xconfigPrintOptionList(FILE *fp, XConfigOptionPtr list, int tabs); int xconfigParsePciBusString(const char *busID, int *bus, int *device, int *func); void xconfigFormatPciBusString(char *str, int len, int domain, int bus, int device, int func); void xconfigAddDisplay(XConfigDisplayPtr *pHead, const int depth); void xconfigAddMode(XConfigModePtr *pHead, const char *name); void xconfigRemoveMode(XConfigModePtr *pHead, const char *name); XConfigPtr xconfigGenerate(GenerateOptions *gop); XConfigScreenPtr xconfigGenerateAddScreen(XConfigPtr config, int bus, int domain, int slot, char *boardname, int count); void xconfigGenerateAssignScreenAdjacencies(XConfigLayoutPtr layout); void xconfigGeneratePrintPossibleMice(void); void xconfigGeneratePrintPossibleKeyboards(void); void xconfigGenerateLoadDefaultOptions(GenerateOptions *gop); void xconfigGetXServerInUse(GenerateOptions *gop); const char *xconfigValidateComposite(XConfigPtr config, GenerateOptions *gop, int composite_enabled, int xinerama_enabled, int depth, int overlay_enabled, int cioverlay_enabled, int ubb_enabled, int stereo); /* * check (and update, if necessary) the inputs in the specified layout * section */ int xconfigCheckCoreInputDevices(GenerateOptions *gop, XConfigPtr config, XConfigLayoutPtr layout); /* * X config tools */ int xconfigMergeConfigs(XConfigPtr dstConfig, XConfigPtr srcConfig); #endif /* _xf86Parser_h_ */ nvidia-settings/src/XF86Config-parser/Extensions.c0000664000175000017500000000540012236467170022246 0ustar albertoalberto/* * Copyright 2004 Red Hat Inc., Raleigh, North Carolina. * * All Rights Reserved. * * 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 on 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 (including the * next paragraph) 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 * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS * 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. */ /* * Authors: * Kevin E. Martin * */ #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" extern LexRec val; static XConfigSymTabRec ExtensionsTab[] = { {ENDSECTION, "endsection"}, {OPTION, "option"}, {-1, ""}, }; #define CLEANUP xconfigFreeExtensions XConfigExtensionsPtr xconfigParseExtensionsSection (void) { int token; PARSE_PROLOGUE (XConfigExtensionsPtr, XConfigExtensionsRec); while ((token = xconfigGetToken (ExtensionsTab)) != ENDSECTION) { switch (token) { case OPTION: ptr->options = xconfigParseOption(ptr->options); break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } return ptr; } #undef CLEANUP void xconfigPrintExtensionsSection (FILE * cf, XConfigExtensionsPtr ptr) { XConfigOptionPtr p; if (ptr == NULL || ptr->options == NULL) return; p = ptr->options; fprintf (cf, "Section \"Extensions\"\n"); if (ptr->comment) fprintf (cf, "%s", ptr->comment); xconfigPrintOptionList(cf, p, 1); fprintf (cf, "EndSection\n\n"); } void xconfigFreeExtensions (XConfigExtensionsPtr *ptr) { if (ptr == NULL || *ptr == NULL) return; xconfigFreeOptionList (&((*ptr)->options)); TEST_FREE ((*ptr)->comment); free (*ptr); *ptr = NULL; } nvidia-settings/src/XF86Config-parser/Video.c0000664000175000017500000002170512236467170021163 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ /* View/edit this file with tab stops set to 4 */ #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" extern LexRec val; static XConfigSymTabRec VideoPortTab[] = { {ENDSUBSECTION, "endsubsection"}, {IDENTIFIER, "identifier"}, {OPTION, "option"}, {-1, ""}, }; #define CLEANUP xconfigFreeVideoPortList XConfigVideoPortPtr xconfigParseVideoPortSubSection (void) { int has_ident = FALSE; int token; PARSE_PROLOGUE (XConfigVideoPortPtr, XConfigVideoPortRec) while ((token = xconfigGetToken (VideoPortTab)) != ENDSUBSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case IDENTIFIER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Identifier"); if (has_ident == TRUE) Error (MULTIPLE_MSG, "Identifier"); ptr->identifier = val.str; has_ident = TRUE; break; case OPTION: ptr->options = xconfigParseOption(ptr->options); break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } return ptr; } #undef CLEANUP static XConfigSymTabRec VideoAdaptorTab[] = { {ENDSECTION, "endsection"}, {IDENTIFIER, "identifier"}, {VENDOR, "vendorname"}, {BOARD, "boardname"}, {BUSID, "busid"}, {DRIVER, "driver"}, {OPTION, "option"}, {SUBSECTION, "subsection"}, {-1, ""}, }; #define CLEANUP xconfigFreeVideoAdaptorList XConfigVideoAdaptorPtr xconfigParseVideoAdaptorSection (void) { int has_ident = FALSE; int token; PARSE_PROLOGUE (XConfigVideoAdaptorPtr, XConfigVideoAdaptorRec) while ((token = xconfigGetToken (VideoAdaptorTab)) != ENDSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case IDENTIFIER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Identifier"); ptr->identifier = val.str; if (has_ident == TRUE) Error (MULTIPLE_MSG, "Identifier"); has_ident = TRUE; break; case VENDOR: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Vendor"); ptr->vendor = val.str; break; case BOARD: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Board"); ptr->board = val.str; break; case BUSID: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "BusID"); ptr->busid = val.str; break; case DRIVER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Driver"); ptr->driver = val.str; break; case OPTION: ptr->options = xconfigParseOption(ptr->options); break; case SUBSECTION: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "SubSection"); { HANDLE_LIST (ports, xconfigParseVideoPortSubSection, XConfigVideoPortPtr); } break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } if (!has_ident) Error (NO_IDENT_MSG, NULL); return ptr; } void xconfigPrintVideoAdaptorSection (FILE * cf, XConfigVideoAdaptorPtr ptr) { XConfigVideoPortPtr pptr; while (ptr) { fprintf (cf, "Section \"VideoAdaptor\"\n"); if (ptr->comment) fprintf (cf, "%s", ptr->comment); if (ptr->identifier) fprintf (cf, " Identifier \"%s\"\n", ptr->identifier); if (ptr->vendor) fprintf (cf, " VendorName \"%s\"\n", ptr->vendor); if (ptr->board) fprintf (cf, " BoardName \"%s\"\n", ptr->board); if (ptr->busid) fprintf (cf, " BusID \"%s\"\n", ptr->busid); if (ptr->driver) fprintf (cf, " Driver \"%s\"\n", ptr->driver); xconfigPrintOptionList(cf, ptr->options, 1); for (pptr = ptr->ports; pptr; pptr = pptr->next) { fprintf (cf, " SubSection \"VideoPort\"\n"); if (pptr->comment) fprintf (cf, "%s", pptr->comment); if (pptr->identifier) fprintf (cf, " Identifier \"%s\"\n", pptr->identifier); xconfigPrintOptionList(cf, pptr->options, 2); fprintf (cf, " EndSubSection\n"); } fprintf (cf, "EndSection\n\n"); ptr = ptr->next; } } void xconfigFreeVideoAdaptorList (XConfigVideoAdaptorPtr *ptr) { XConfigVideoAdaptorPtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->identifier); TEST_FREE ((*ptr)->vendor); TEST_FREE ((*ptr)->board); TEST_FREE ((*ptr)->busid); TEST_FREE ((*ptr)->driver); TEST_FREE ((*ptr)->fwdref); TEST_FREE ((*ptr)->comment); xconfigFreeVideoPortList (&((*ptr)->ports)); xconfigFreeOptionList (&((*ptr)->options)); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } void xconfigFreeVideoPortList (XConfigVideoPortPtr *ptr) { XConfigVideoPortPtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->identifier); TEST_FREE ((*ptr)->comment); xconfigFreeOptionList (&((*ptr)->options)); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } XConfigVideoAdaptorPtr xconfigFindVideoAdaptor (const char *ident, XConfigVideoAdaptorPtr p) { while (p) { if (xconfigNameCompare (ident, p->identifier) == 0) return (p); p = p->next; } return (NULL); } nvidia-settings/src/XF86Config-parser/Layout.c0000664000175000017500000004575612236467170021406 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ /* View/edit this file with tab stops set to 4 */ #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" #include extern LexRec val; static XConfigSymTabRec LayoutTab[] = { {ENDSECTION, "endsection"}, {SCREEN, "screen"}, {IDENTIFIER, "identifier"}, {INACTIVE, "inactive"}, {INPUTDEVICE, "inputdevice"}, {OPTION, "option"}, {-1, ""}, }; static XConfigSymTabRec AdjTab[] = { {RIGHTOF, "rightof"}, {LEFTOF, "leftof"}, {ABOVE, "above"}, {BELOW, "below"}, {RELATIVE, "relative"}, {ABSOLUTE, "absolute"}, {-1, ""}, }; static int addImpliedLayout(XConfigPtr config, const char *screenName); #define CLEANUP xconfigFreeLayoutList XConfigLayoutPtr xconfigParseLayoutSection (void) { int has_ident = FALSE; int token; PARSE_PROLOGUE (XConfigLayoutPtr, XConfigLayoutRec) while ((token = xconfigGetToken (LayoutTab)) != ENDSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case IDENTIFIER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Identifier"); if (has_ident == TRUE) Error (MULTIPLE_MSG, "Identifier"); ptr->identifier = val.str; has_ident = TRUE; break; case INACTIVE: { XConfigInactivePtr iptr; iptr = calloc (1, sizeof (XConfigInactiveRec)); iptr->next = NULL; if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (INACTIVE_MSG, NULL); iptr->device_name = val.str; xconfigAddListItem((GenericListPtr *)(&ptr->inactives), (GenericListPtr) iptr); } break; case SCREEN: { XConfigAdjacencyPtr aptr; int absKeyword = 0; aptr = calloc (1, sizeof (XConfigAdjacencyRec)); aptr->next = NULL; aptr->scrnum = -1; aptr->where = CONF_ADJ_OBSOLETE; aptr->x = 0; aptr->y = 0; aptr->refscreen = NULL; if ((token = xconfigGetSubToken (&(ptr->comment))) == NUMBER) aptr->scrnum = val.num; else xconfigUnGetToken (token); token = xconfigGetSubToken(&(ptr->comment)); if (token != STRING) Error (SCREEN_MSG, NULL); aptr->screen_name = val.str; token = xconfigGetSubTokenWithTab(&(ptr->comment), AdjTab); switch (token) { case RIGHTOF: aptr->where = CONF_ADJ_RIGHTOF; break; case LEFTOF: aptr->where = CONF_ADJ_LEFTOF; break; case ABOVE: aptr->where = CONF_ADJ_ABOVE; break; case BELOW: aptr->where = CONF_ADJ_BELOW; break; case RELATIVE: aptr->where = CONF_ADJ_RELATIVE; break; case ABSOLUTE: aptr->where = CONF_ADJ_ABSOLUTE; absKeyword = 1; break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: xconfigUnGetToken (token); token = xconfigGetSubToken(&(ptr->comment)); if (token == STRING) aptr->where = CONF_ADJ_OBSOLETE; else aptr->where = CONF_ADJ_ABSOLUTE; } switch (aptr->where) { case CONF_ADJ_ABSOLUTE: if (absKeyword) token = xconfigGetSubToken(&(ptr->comment)); if (token == NUMBER) { aptr->x = val.num; token = xconfigGetSubToken(&(ptr->comment)); if (token != NUMBER) Error(INVALID_SCR_MSG, NULL); aptr->y = val.num; } else { if (absKeyword) Error(INVALID_SCR_MSG, NULL); else xconfigUnGetToken (token); } break; case CONF_ADJ_RIGHTOF: case CONF_ADJ_LEFTOF: case CONF_ADJ_ABOVE: case CONF_ADJ_BELOW: case CONF_ADJ_RELATIVE: token = xconfigGetSubToken(&(ptr->comment)); if (token != STRING) Error(INVALID_SCR_MSG, NULL); aptr->refscreen = val.str; if (aptr->where == CONF_ADJ_RELATIVE) { token = xconfigGetSubToken(&(ptr->comment)); if (token != NUMBER) Error(INVALID_SCR_MSG, NULL); aptr->x = val.num; token = xconfigGetSubToken(&(ptr->comment)); if (token != NUMBER) Error(INVALID_SCR_MSG, NULL); aptr->y = val.num; } break; case CONF_ADJ_OBSOLETE: /* top */ aptr->top_name = val.str; /* bottom */ if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (SCREEN_MSG, NULL); aptr->bottom_name = val.str; /* left */ if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (SCREEN_MSG, NULL); aptr->left_name = val.str; /* right */ if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (SCREEN_MSG, NULL); aptr->right_name = val.str; } xconfigAddListItem((GenericListPtr *)(&ptr->adjacencies), (GenericListPtr) aptr); } break; case INPUTDEVICE: { XConfigInputrefPtr iptr; iptr = calloc (1, sizeof (XConfigInputrefRec)); iptr->next = NULL; iptr->options = NULL; if (xconfigGetSubToken(&(ptr->comment)) != STRING) Error (INPUTDEV_MSG, NULL); iptr->input_name = val.str; while ((token = xconfigGetSubToken(&(ptr->comment))) == STRING) { xconfigAddNewOption(&iptr->options, val.str, NULL); } xconfigUnGetToken(token); xconfigAddListItem((GenericListPtr *)(&ptr->inputs), (GenericListPtr) iptr); } break; case OPTION: ptr->options = xconfigParseOption(ptr->options); break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } if (!has_ident) Error (NO_IDENT_MSG, NULL); return ptr; } #undef CLEANUP void xconfigPrintLayoutSection (FILE * cf, XConfigLayoutPtr ptr) { XConfigAdjacencyPtr aptr; XConfigInactivePtr iptr; XConfigInputrefPtr inptr; XConfigOptionPtr optr; while (ptr) { fprintf (cf, "Section \"ServerLayout\"\n"); if (ptr->comment) fprintf (cf, "%s", ptr->comment); if (ptr->identifier) fprintf (cf, " Identifier \"%s\"\n", ptr->identifier); for (aptr = ptr->adjacencies; aptr; aptr = aptr->next) { fprintf (cf, " Screen "); if (aptr->scrnum >= 0) fprintf (cf, "%2d", aptr->scrnum); else fprintf (cf, " "); fprintf (cf, " \"%s\"", aptr->screen_name); switch(aptr->where) { case CONF_ADJ_OBSOLETE: fprintf (cf, " \"%s\"", aptr->top_name); fprintf (cf, " \"%s\"", aptr->bottom_name); fprintf (cf, " \"%s\"", aptr->right_name); fprintf (cf, " \"%s\"\n", aptr->left_name); break; case CONF_ADJ_ABSOLUTE: if (aptr->x != -1) fprintf (cf, " %d %d\n", aptr->x, aptr->y); else fprintf (cf, "\n"); break; case CONF_ADJ_RIGHTOF: fprintf (cf, " RightOf \"%s\"\n", aptr->refscreen); break; case CONF_ADJ_LEFTOF: fprintf (cf, " LeftOf \"%s\"\n", aptr->refscreen); break; case CONF_ADJ_ABOVE: fprintf (cf, " Above \"%s\"\n", aptr->refscreen); break; case CONF_ADJ_BELOW: fprintf (cf, " Below \"%s\"\n", aptr->refscreen); break; case CONF_ADJ_RELATIVE: fprintf (cf, " Relative \"%s\" %d %d\n", aptr->refscreen, aptr->x, aptr->y); break; } } for (iptr = ptr->inactives; iptr; iptr = iptr->next) fprintf (cf, " Inactive \"%s\"\n", iptr->device_name); for (inptr = ptr->inputs; inptr; inptr = inptr->next) { fprintf (cf, " InputDevice \"%s\"", inptr->input_name); for (optr = inptr->options; optr; optr = optr->next) { fprintf(cf, " \"%s\"", optr->name); } fprintf(cf, "\n"); } xconfigPrintOptionList(cf, ptr->options, 1); fprintf (cf, "EndSection\n\n"); ptr = ptr->next; } } void xconfigFreeLayoutList (XConfigLayoutPtr *ptr) { XConfigLayoutPtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->identifier); TEST_FREE ((*ptr)->comment); xconfigFreeAdjacencyList (&((*ptr)->adjacencies)); xconfigFreeInputrefList (&((*ptr)->inputs)); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } void xconfigFreeAdjacencyList (XConfigAdjacencyPtr *ptr) { XConfigAdjacencyPtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->screen_name); TEST_FREE ((*ptr)->top_name); TEST_FREE ((*ptr)->bottom_name); TEST_FREE ((*ptr)->left_name); TEST_FREE ((*ptr)->right_name); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } void xconfigFreeInputrefList (XConfigInputrefPtr *ptr) { XConfigInputrefPtr prev; if (ptr == NULL || *ptr == NULL) return; while (*ptr) { TEST_FREE ((*ptr)->input_name); xconfigFreeOptionList (&((*ptr)->options)); prev = *ptr; *ptr = (*ptr)->next; free (prev); } } #define CheckScreen(str, ptr)\ if (str[0] != '\0') \ { \ screen = xconfigFindScreen (str, p->conf_screen_lst); \ if (!screen) \ { \ xconfigErrorMsg(ValidationErrorMsg, UNDEFINED_SCREEN_MSG, \ str, layout->identifier); \ return (FALSE); \ } \ else \ ptr = screen; \ } int xconfigValidateLayout (XConfigPtr p) { XConfigLayoutPtr layout = p->layouts; XConfigAdjacencyPtr adj; XConfigInactivePtr iptr; XConfigInputrefPtr inputRef; XConfigScreenPtr screen; XConfigDevicePtr device; XConfigInputPtr input; /* * if we do not have a layout, just return TRUE; we'll add a * layout later during the Sanitize step */ if (!layout) return TRUE; while (layout) { adj = layout->adjacencies; while (adj) { /* the first one can't be "" but all others can */ screen = xconfigFindScreen (adj->screen_name, p->screens); if (!screen) { xconfigErrorMsg(ValidationErrorMsg, UNDEFINED_SCREEN_MSG, adj->screen_name, layout->identifier); return (FALSE); } else adj->screen = screen; #if 0 CheckScreen (adj->top_name, adj->top); CheckScreen (adj->bottom_name, adj->bottom); CheckScreen (adj->left_name, adj->left); CheckScreen (adj->right_name, adj->right); #endif adj = adj->next; } /* I not believe the "inactives" list is used for anything */ iptr = layout->inactives; while (iptr) { device = xconfigFindDevice (iptr->device_name, p->devices); if (!device) { xconfigErrorMsg(ValidationErrorMsg, UNDEFINED_DEVICE_MSG, iptr->device_name, layout->identifier); return (FALSE); } else iptr->device = device; iptr = iptr->next; } /* * the layout->inputs list is also updated in * getCoreInputDevice() when no core input device is found in * the layout's input list */ inputRef = layout->inputs; while (inputRef) { input = xconfigFindInput (inputRef->input_name, p->inputs); if (!input) { xconfigErrorMsg(ValidationErrorMsg, UNDEFINED_INPUT_MSG, inputRef->input_name, layout->identifier); return (FALSE); } else { inputRef->input = input; } inputRef = inputRef->next; } layout = layout->next; } return (TRUE); } int xconfigSanitizeLayout(XConfigPtr p, const char *screenName, GenerateOptions *gop) { XConfigLayoutPtr layout = p->layouts; /* add an implicit layout if none exist */ if (!p->layouts) { if (!addImpliedLayout(p, screenName)) { return FALSE; } } /* check that input devices are assigned for each layout */ for (layout = p->layouts; layout; layout = layout->next) { if (!xconfigCheckCoreInputDevices(gop, p, layout)) { return FALSE; } } return TRUE; } XConfigLayoutPtr xconfigFindLayout (const char *name, XConfigLayoutPtr list) { while (list) { if (xconfigNameCompare (list->identifier, name) == 0) return (list); list = list->next; } return (NULL); } static int addImpliedLayout(XConfigPtr config, const char *screenName) { XConfigScreenPtr screen; XConfigLayoutPtr layout; XConfigAdjacencyPtr adj; if (config->layouts) return TRUE; /* * which screen section is the active one? * * If there is a -screen option, use that one, otherwise use the first * screen in the config's list. */ if (screenName) { screen = xconfigFindScreen(screenName, config->screens); if (!screen) { xconfigErrorMsg(ErrorMsg, "No Screen section called \"%s\"\n", screenName); return FALSE; } } else { screen = config->screens; } xconfigErrorMsg(WarnMsg, "No Layout specified, constructing implicit " "layout section using screen \"%s\".\n", screen->identifier); /* allocate the new layout section */ layout = calloc(1, sizeof(XConfigLayoutRec)); layout->identifier = xconfigStrdup("Default Layout"); adj = calloc(1, sizeof(XConfigAdjacencyRec)); adj->scrnum = -1; adj->screen = screen; adj->screen_name = xconfigStrdup(screen->identifier); layout->adjacencies = adj; config->layouts = layout; /* validate the Layout here to setup all the pointers */ if (!xconfigValidateLayout(config)) return FALSE; return TRUE; } nvidia-settings/src/XF86Config-parser/Module.c0000664000175000017500000002157012236467170021342 0ustar albertoalberto/* * * Copyright (c) 1997 Metro Link Incorporated * * 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 X CONSORTIUM 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. * * Except as contained in this notice, the name of the Metro Link shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Metro Link. * */ /* * Copyright (c) 1997-2003 by The XFree86 Project, Inc. * * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. * * Except as contained in this notice, the name of the copyright holder(s) * and author(s) shall not be used in advertising or otherwise to promote * the sale, use or other dealings in this Software without prior written * authorization from the copyright holder(s) and author(s). */ /* View/edit this file with tab stops set to 4 */ #include "xf86Parser.h" #include "xf86tokens.h" #include "Configint.h" extern LexRec val; static XConfigSymTabRec SubModuleTab[] = { {ENDSUBSECTION, "endsubsection"}, {OPTION, "option"}, {-1, ""}, }; static XConfigSymTabRec ModuleTab[] = { {ENDSECTION, "endsection"}, {LOAD, "load"}, {LOAD_DRIVER, "loaddriver"}, {DISABLE, "disable"}, {SUBSECTION, "subsection"}, {-1, ""}, }; #define CLEANUP xconfigFreeModules XConfigLoadPtr xconfigParseModuleSubSection (XConfigLoadPtr head, char *name) { int token; PARSE_PROLOGUE (XConfigLoadPtr, XConfigLoadRec) ptr->name = name; ptr->type = XCONFIG_LOAD_MODULE; ptr->opt = NULL; ptr->next = NULL; while ((token = xconfigGetToken (SubModuleTab)) != ENDSUBSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case OPTION: ptr->opt = xconfigParseOption(ptr->opt); break; case EOF_TOKEN: xconfigErrorMsg(ParseErrorMsg, UNEXPECTED_EOF_MSG); free(ptr); return NULL; default: xconfigErrorMsg(ParseErrorMsg, INVALID_KEYWORD_MSG, xconfigTokenString()); free(ptr); return NULL; break; } } xconfigAddListItem((GenericListPtr *)(&head), (GenericListPtr)ptr); return head; } XConfigModulePtr xconfigParseModuleSection (void) { int token; PARSE_PROLOGUE (XConfigModulePtr, XConfigModuleRec) while ((token = xconfigGetToken (ModuleTab)) != ENDSECTION) { switch (token) { case COMMENT: ptr->comment = xconfigAddComment(ptr->comment, val.str); break; case LOAD: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Load"); xconfigAddNewLoadDirective (&ptr->loads, val.str, XCONFIG_LOAD_MODULE, NULL, TRUE); break; case LOAD_DRIVER: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "LoadDriver"); xconfigAddNewLoadDirective (&ptr->loads, val.str, XCONFIG_LOAD_DRIVER, NULL, TRUE); break; case DISABLE: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "Disable"); xconfigAddNewLoadDirective (&ptr->disables, val.str, XCONFIG_DISABLE_MODULE, NULL, TRUE); break; case SUBSECTION: if (xconfigGetSubToken (&(ptr->comment)) != STRING) Error (QUOTE_MSG, "SubSection"); ptr->loads = xconfigParseModuleSubSection (ptr->loads, val.str); break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); break; } } return ptr; } #undef CLEANUP void xconfigPrintModuleSection (FILE * cf, XConfigModulePtr ptr) { XConfigLoadPtr lptr; if (ptr == NULL) return; if (ptr->comment) fprintf(cf, "%s", ptr->comment); for (lptr = ptr->loads; lptr; lptr = lptr->next) { switch (lptr->type) { case XCONFIG_LOAD_MODULE: if( lptr->opt == NULL ) { fprintf (cf, " Load \"%s\"", lptr->name); if (lptr->comment) fprintf(cf, "%s", lptr->comment); else fputc('\n', cf); } else { fprintf (cf, " SubSection \"%s\"\n", lptr->name); if (lptr->comment) fprintf(cf, "%s", lptr->comment); xconfigPrintOptionList(cf, lptr->opt, 2); fprintf (cf, " EndSubSection\n"); } break; case XCONFIG_LOAD_DRIVER: fprintf (cf, " LoadDriver \"%s\"", lptr->name); if (lptr->comment) fprintf(cf, "%s", lptr->comment); else fputc('\n', cf); break; #if 0 default: fprintf (cf, "# Unknown type \"%s\"\n", lptr->name); break; #endif } } for (lptr = ptr->disables; lptr; lptr = lptr->next) { switch (lptr->type) { case XCONFIG_DISABLE_MODULE: fprintf (cf, " Disable \"%s\"", lptr->name); if (lptr->comment) fprintf(cf, "%s", lptr->comment); else fputc('\n', cf); break; } } } void xconfigAddNewLoadDirective (XConfigLoadPtr *pHead, char *name, int type, XConfigOptionPtr opts, int do_token) { XConfigLoadPtr new; int token; new = calloc (1, sizeof (XConfigLoadRec)); new->name = name; new->type = type; new->opt = opts; new->next = NULL; if (do_token) { if ((token = xconfigGetToken(NULL)) == COMMENT) { new->comment = xconfigAddComment(new->comment, val.str); } else { xconfigUnGetToken(token); } } xconfigAddListItem((GenericListPtr *)pHead, (GenericListPtr)new); } void xconfigRemoveLoadDirective(XConfigLoadPtr *pHead, XConfigLoadPtr load) { xconfigRemoveListItem((GenericListPtr *)pHead, (GenericListPtr)load); TEST_FREE(load->name); TEST_FREE(load->comment); xconfigFreeOptionList(&(load->opt)); free(load); } static void FreeModule(XConfigLoadPtr lptr) { XConfigLoadPtr prev; while (lptr) { TEST_FREE (lptr->name); TEST_FREE (lptr->comment); prev = lptr; lptr = lptr->next; free (prev); } } void xconfigFreeModules (XConfigModulePtr *ptr) { if (ptr == NULL || *ptr == NULL) return; FreeModule((*ptr)->loads); FreeModule((*ptr)->disables); TEST_FREE ((*ptr)->comment); free (*ptr); *ptr = NULL; } nvidia-settings/src/XF86Config-parser/Generate.c0000664000175000017500000013565212236467170021656 0ustar albertoalberto/* * nvidia-xconfig: A tool for manipulating X config files, * specifically for use by the NVIDIA Linux graphics driver. * * Copyright (C) 2005 NVIDIA Corporation * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . * * * Generate.c */ #include #include #include #include #include #include #include #include #include "xf86Parser.h" #include "Configint.h" #define MOUSE_IDENTIFER "Mouse0" #define KEYBOARD_IDENTIFER "Keyboard0" #define SCREEN_IDENTIFIER "Screen%d" #define DEVICE_IDENTIFIER "Device%d" #define MONITOR_IDENTIFIER "Monitor%d" static int is_file(const char *filename); static void add_font_path(GenerateOptions *gop, XConfigPtr config); static void add_modules(GenerateOptions *gop, XConfigPtr config); static XConfigDevicePtr add_device(XConfigPtr config, int bus, int domain, int slot, char *boardname, int count); static void add_layout(GenerateOptions *gop, XConfigPtr config); static void add_inputref(XConfigPtr config, XConfigLayoutPtr layout, char *name, char *coreKeyword); /* * xconfigGenerate() - generate a new XConfig from scratch */ XConfigPtr xconfigGenerate(GenerateOptions *gop) { XConfigPtr config; config = xconfigAlloc(sizeof(XConfigRec)); /* add files, fonts, and modules */ config->files = xconfigAlloc(sizeof(XConfigFilesRec)); add_font_path(gop, config); add_modules(gop, config); /* add the keyboard and mouse */ xconfigAddKeyboard(gop, config); xconfigAddMouse(gop, config); /* add the layout */ add_layout(gop, config); return config; } /* xconfigGenerate() */ /* * xconfigGenerateAddScreen() - add a new screen to the config; bus * and slot can be -1 to be ignored; boardname can be NULL to be * ignored; count is used when building the identifier name, eg * '"Screen%d", count'. Note that this does not append the screen to * any layout's adjacency list. */ XConfigScreenPtr xconfigGenerateAddScreen(XConfigPtr config, int bus, int domain, int slot, char *boardname, int count) { XConfigScreenPtr screen, s; XConfigDevicePtr device; XConfigMonitorPtr monitor; monitor = xconfigAddMonitor(config, count); device = add_device(config, bus, domain, slot, boardname, count); screen = xconfigAlloc(sizeof(XConfigScreenRec)); screen->identifier = xconfigAlloc(32); snprintf(screen->identifier, 32, SCREEN_IDENTIFIER, count); screen->device_name = xconfigStrdup(device->identifier); screen->device = device; screen->monitor_name = xconfigStrdup(monitor->identifier); screen->monitor = monitor; screen->defaultdepth = 24; xconfigAddDisplay(&screen->displays, screen->defaultdepth); /* append to the end of the screen list */ if (!config->screens) { config->screens = screen; } else { for (s = config->screens; s->next; s = s->next); s->next = screen; } return screen; } /* xconfigGenerateAddScreen() */ /* * xconfigGenerateAssignScreenAdjacencies() - setup all the adjacency * information for the X screens in the given layout. Nothing fancy * here: just position all the screens horizontally, moving from left * to right. */ void xconfigGenerateAssignScreenAdjacencies(XConfigLayoutPtr layout) { XConfigAdjacencyPtr adj, prev = NULL; for (adj = layout->adjacencies; adj; adj = adj->next) { if (prev) { adj->where = CONF_ADJ_RIGHTOF; adj->refscreen = xconfigStrdup(prev->screen_name); } else { adj->x = adj->y = -1; } /* make sure all the obsolete positioning is empty */ adj->top = NULL; adj->top_name = NULL; adj->bottom = NULL; adj->bottom_name = NULL; adj->left = NULL; adj->left_name = NULL; adj->right = NULL; adj->right_name = NULL; prev = adj; } } /* xconfigGenerateAssignScreenAdjacencies() */ /*********************************************************************/ /* * is_file() */ static int is_file(const char *filename) { return (access(filename, F_OK) == 0); } /* is_file() */ /* * find_libdir() - attempt to find the X server library path; this is * either * * `pkg-config --variable=libdir xorg-server` * * or * * [X PROJECT ROOT]/lib */ static char *find_libdir(GenerateOptions *gop) { struct stat stat_buf; FILE *stream = NULL; char *s, *libdir = NULL; /* * run the pkg-config command and read the output; if the output * is a directory, then return that as the libdir */ stream = popen("pkg-config --variable=libdir xorg-server", "r"); if (stream) { char buf[256]; buf[0] = '\0'; while (1) { if (fgets(buf, 255, stream) == NULL) break; if (buf[0] != '\0') { /* truncate any newline */ s = strchr(buf, '\n'); if (s) *s = '\0'; if ((stat(buf, &stat_buf) == 0) && (S_ISDIR(stat_buf.st_mode))) { libdir = xconfigStrdup(buf); break; } } } pclose(stream); if (libdir) return libdir; } /* otherwise, just fallback to [X PROJECT ROOT]/lib */ return xconfigStrcat(gop->x_project_root, "/lib", NULL); } /* find_libdir() */ /* * add_font_path() - scan through the __font_paths[] array, * temporarily chop off the ":unscaled" appendage, and check for the * file "fonts.dir" in the directory. If fonts.dir exists, append the * path to config->files->fontpath. */ static void add_font_path(GenerateOptions *gop, XConfigPtr config) { int i, ret; char *path, *p, *orig, *fonts_dir, *libdir; /* * The below font path has been constructed from various examples * and uses some suggests from the Font De-uglification HOWTO */ static const char *__font_paths[] = { "LIBDIR/X11/fonts/local/", "LIBDIR/X11/fonts/misc/:unscaled", "LIBDIR/X11/fonts/100dpi/:unscaled", "LIBDIR/X11/fonts/75dpi/:unscaled", "LIBDIR/X11/fonts/misc/", "LIBDIR/X11/fonts/Type1/", "LIBDIR/X11/fonts/CID/", "LIBDIR/X11/fonts/Speedo/", "LIBDIR/X11/fonts/100dpi/", "LIBDIR/X11/fonts/75dpi/", "LIBDIR/X11/fonts/cyrillic/", "LIBDIR/X11/fonts/TTF/", "LIBDIR/X11/fonts/truetype/", "LIBDIR/X11/fonts/TrueType/", "LIBDIR/X11/fonts/Type1/sun/", "LIBDIR/X11/fonts/F3bitmaps/", "/usr/local/share/fonts/ttfonts", "/usr/share/fonts/default/Type1", "/usr/lib/openoffice/share/fonts/truetype", NULL }; /* * if a font server is running, set the font path to that * * XXX should we check the port the font server is using? */ #if defined(NV_SUNOS) ret = system("ps -e -o fname | grep -v grep | egrep \"^xfs$\" > /dev/null"); #elif defined(NV_BSD) ret = system("ps -e -o comm | grep -v grep | egrep \"^xfs$\" > /dev/null"); #else ret = system("ps -C xfs 2>&1 > /dev/null"); #endif if (WEXITSTATUS(ret) == 0) { config->files->fontpath = xconfigStrdup("unix/:7100"); } else { /* get the X server libdir */ libdir = find_libdir(gop); for (i = 0; __font_paths[i]; i++) { path = xconfigStrdup(__font_paths[i]); /* replace LIBDIR with libdir */ if (strncmp(path, "LIBDIR", 6) == 0) { p = xconfigStrcat(libdir, path + 6, NULL); free(path); path = p; } /* temporarily chop off any ":unscaled" appendage */ p = strchr(path, ':'); if (p) *p = '\0'; /* skip this entry if the fonts.dir does not exist */ fonts_dir = xconfigStrcat(path, "/fonts.dir", NULL); if (!is_file(fonts_dir)) { /* does not exist */ free(path); free(fonts_dir); continue; } free(fonts_dir); /* add the ":unscaled" back */ if (p) *p = ':'; /* * either use this path as the fontpath, or append to the * existing fontpath */ if (config->files->fontpath) { orig = config->files->fontpath; config->files->fontpath = xconfigStrcat(orig, ",", path, NULL); free(orig); free(path); } else { config->files->fontpath = path; } } /* free the libdir string */ free(libdir); } } /* add_font_path() */ /* * add_modules() */ static void add_modules(GenerateOptions *gop, XConfigPtr config) { XConfigLoadPtr l = NULL; /* * if the X server will automatically autoload GLX, then don't * bother adding a modules section; it is difficult for * nvidia-xconfig to know if modules like "type1" are present, * anyway. */ if (gop->autoloads_glx) return; config->modules = xconfigAlloc(sizeof(XConfigModuleRec)); xconfigAddNewLoadDirective(&l, xconfigStrdup("dbe"), XCONFIG_LOAD_MODULE, NULL, FALSE); xconfigAddNewLoadDirective(&l, xconfigStrdup("extmod"), XCONFIG_LOAD_MODULE, NULL, FALSE); xconfigAddNewLoadDirective(&l, xconfigStrdup("type1"), XCONFIG_LOAD_MODULE, NULL, FALSE); #if defined(NV_SUNOS) xconfigAddNewLoadDirective(&l, xconfigStrdup("IA"), XCONFIG_LOAD_MODULE, NULL, FALSE); xconfigAddNewLoadDirective(&l, xconfigStrdup("bitstream"), XCONFIG_LOAD_MODULE, NULL, FALSE); xconfigAddNewLoadDirective(&l, xconfigStrdup("xtsol"), XCONFIG_LOAD_MODULE, NULL, FALSE); #else xconfigAddNewLoadDirective(&l, xconfigStrdup("freetype"), XCONFIG_LOAD_MODULE, NULL, FALSE); #endif xconfigAddNewLoadDirective(&l, xconfigStrdup("glx"), XCONFIG_LOAD_MODULE, NULL, FALSE); config->modules->loads = l; } /* add_modules() */ /* * xconfigAddMonitor() - * * XXX pass EDID values into this... */ XConfigMonitorPtr xconfigAddMonitor(XConfigPtr config, int count) { XConfigMonitorPtr monitor, m; /* XXX need to query resman for the EDID */ monitor = xconfigAlloc(sizeof(XConfigMonitorRec)); monitor->identifier = xconfigAlloc(32); snprintf(monitor->identifier, 32, MONITOR_IDENTIFIER, count); monitor->vendor = xconfigStrdup("Unknown"); /* XXX */ monitor->modelname = xconfigStrdup("Unknown"); /* XXX */ /* XXX check EDID for freq ranges */ monitor->n_hsync = 1; monitor->hsync[0].lo = 28.0; monitor->hsync[0].hi = 33.0; monitor->n_vrefresh = 1; monitor->vrefresh[0].lo = 43.0; monitor->vrefresh[0].hi = 72.0; monitor->options = NULL; xconfigAddNewOption(&monitor->options, "DPMS", NULL); /* append to the end of the monitor list */ if (!config->monitors) { config->monitors = monitor; } else { for (m = config->monitors; m->next; m = m->next); m->next = monitor; } return monitor; } /* xconfigAddMonitor() */ /* * add_device() */ static XConfigDevicePtr add_device(XConfigPtr config, int bus, int domain, int slot, char *boardname, int count) { XConfigDevicePtr device, d; device = xconfigAlloc(sizeof(XConfigDeviceRec)); device->identifier = xconfigAlloc(32); snprintf(device->identifier, 32, DEVICE_IDENTIFIER, count); device->driver = xconfigStrdup("nvidia"); device->vendor = xconfigStrdup("NVIDIA Corporation"); if (bus != -1 && domain != -1 && slot != -1) { device->busid = xconfigAlloc(32); xconfigFormatPciBusString(device->busid, 32, domain, bus, slot, 0); } if (boardname) device->board = xconfigStrdup(boardname); device->chipid = -1; device->chiprev = -1; device->irq = -1; device->screen = -1; /* append to the end of the device list */ if (!config->devices) { config->devices = device; } else { for (d = config->devices; d->next; d = d->next); d->next = device; } return device; } /* add_device() */ void xconfigAddDisplay(XConfigDisplayPtr *pHead, const int depth) { XConfigDisplayPtr display; display = xconfigAlloc(sizeof(XConfigDisplayRec)); display->depth = depth; display->modes = NULL; display->frameX0 = -1; display->frameY0 = -1; display->black.red = -1; display->white.red = -1; display->next = *pHead; *pHead = display; } /* * add_layout() - add a layout section to the XConfigPtr */ static void add_layout(GenerateOptions *gop, XConfigPtr config) { XConfigLayoutPtr layout; XConfigAdjacencyPtr adj; XConfigScreenPtr screen; /* assume 1 X screen */ screen = xconfigGenerateAddScreen(config, -1, -1, -1, NULL, 0); /* create layout */ layout = xconfigAlloc(sizeof(XConfigLayoutRec)); layout->identifier = xconfigStrdup("Layout0"); adj = xconfigAlloc(sizeof(XConfigAdjacencyRec)); adj->scrnum = 0; adj->screen = screen; adj->screen_name = xconfigStrdup(screen->identifier); layout->adjacencies = adj; xconfigGenerateAssignScreenAdjacencies(layout); add_inputref(config, layout, MOUSE_IDENTIFER, "CorePointer"); add_inputref(config, layout, KEYBOARD_IDENTIFER, "CoreKeyboard"); layout->next = config->layouts; config->layouts = layout; } /* add_layout() */ /* * add_inputref() - add a new XConfigInputrefPtr to the given layout */ static void add_inputref(XConfigPtr config, XConfigLayoutPtr layout, char *name, char *coreKeyword) { XConfigInputrefPtr inputRef; inputRef = xconfigAlloc(sizeof(XConfigInputrefRec)); inputRef->input_name = xconfigStrdup(name); inputRef->input = xconfigFindInput(inputRef->input_name, config->inputs); inputRef->options = NULL; xconfigAddNewOption(&inputRef->options, coreKeyword, NULL); inputRef->next = layout->inputs; layout->inputs = inputRef; } /* add_inputref() */ /*********************************************************************/ /* * Mouse detection */ typedef struct { char *shortname; /* commandline name */ char *name; /* mouse name */ char *gpmproto; /* protocol used by gpm */ char *Xproto; /* XFree86 Protocol */ char *device; /* /dev/ file */ int emulate3; /* Emulate3Buttons */ } MouseEntry; /* * This table is based on data contained in * /usr/lib/python2.2/site-packages/rhpl/mouse.py on Red Hat Fedora * core 1. That file contains the following copyright: * * * mouse.py: mouse configuration data * * Copyright 1999-2002 Red Hat, Inc. */ static const MouseEntry __mice[] = { /* shortname name gpm protocol X protocol device emulate3 */ { "alpsps/2", "ALPS - GlidePoint (PS/2)", "ps/2", "GlidePointPS/2", "psaux", TRUE }, { "ascii", "ASCII - MieMouse (serial)", "ms3", "IntelliMouse", "ttyS", FALSE }, { "asciips/2", "ASCII - MieMouse (PS/2)", "ps/2", "NetMousePS/2", "psaux", TRUE }, { "atibm", "ATI - Bus Mouse", "Busmouse", "BusMouse", "atibm", TRUE }, { "generic", "Generic - 2 Button Mouse (serial)", "Microsoft", "Microsoft", "ttyS", TRUE }, { "generic3", "Generic - 3 Button Mouse (serial)", "Microsoft", "Microsoft", "ttyS", FALSE }, { "genericps/2", "Generic - 2 Button Mouse (PS/2)", "ps/2", "PS/2", "psaux", TRUE }, { "generic3ps/2", "Generic - 3 Button Mouse (PS/2)", "ps/2", "PS/2", "psaux", FALSE }, { "genericwheelps/2", "Generic - Wheel Mouse (PS/2)", "imps2", "IMPS/2", "psaux", FALSE }, { "genericusb", "Generic - 2 Button Mouse (USB)", "imps2", "IMPS/2", "input/mice", TRUE }, { "generic3usb", "Generic - 3 Button Mouse (USB)", "imps2", "IMPS/2", "input/mice", FALSE }, { "genericwheelusb", "Generic - Wheel Mouse (USB)", "imps2", "IMPS/2", "input/mice", FALSE }, { "geniusnm", "Genius - NetMouse (serial)", "ms3", "IntelliMouse", "ttyS", TRUE }, { "geniusnmps/2", "Genius - NetMouse (PS/2)", "netmouse", "NetMousePS/2", "psaux", TRUE }, { "geniusprops/2", "Genius - NetMouse Pro (PS/2)", "netmouse", "NetMousePS/2", "psaux", TRUE }, { "geniusscrollps/2", "Genius - NetScroll (PS/2)", "netmouse", "NetScrollPS/2", "psaux", TRUE }, { "geniusscrollps/2+", "Genius - NetScroll+ (PS/2)", "netmouse", "NetMousePS/2", "psaux", FALSE }, { "thinking", "Kensington - Thinking Mouse (serial)", "Microsoft", "ThinkingMouse", "ttyS", TRUE }, { "thinkingps/2", "Kensington - Thinking Mouse (PS/2)", "ps/2", "ThinkingMousePS/2", "psaux", TRUE }, { "logitech", "Logitech - C7 Mouse (serial, old C7 type)", "Logitech", "Logitech", "ttyS", FALSE }, { "logitechcc", "Logitech - CC Series (serial)", "logim", "MouseMan", "ttyS", FALSE }, { "logibm", "Logitech - Bus Mouse", "Busmouse", "BusMouse", "logibm", FALSE }, { "logimman", "Logitech - MouseMan/FirstMouse (serial)", "MouseMan", "MouseMan", "ttyS", FALSE }, { "logimmanps/2", "Logitech - MouseMan/FirstMouse (PS/2)", "ps/2", "PS/2", "psaux", FALSE }, { "logimman+", "Logitech - MouseMan+/FirstMouse+ (serial)", "pnp", "IntelliMouse", "ttyS", FALSE }, { "logimman+ps/2", "Logitech - MouseMan+/FirstMouse+ (PS/2)", "ps/2", "MouseManPlusPS/2", "psaux", FALSE }, { "logimmusb", "Logitech - MouseMan Wheel (USB)", "ps/2", "IMPS/2", "input/mice", FALSE }, { "logimmusboptical", "Logitech - Cordless Optical Mouse (USB)", "ps/2", "IMPS/2", "input/mice", FALSE }, { "microsoft", "Microsoft - Compatible Mouse (serial)", "Microsoft", "Microsoft", "ttyS", TRUE }, { "msnew", "Microsoft - Rev 2.1A or higher (serial)", "pnp", "Auto", "ttyS", TRUE }, { "msintelli", "Microsoft - IntelliMouse (serial)", "ms3", "IntelliMouse", "ttyS", FALSE }, { "msintellips/2", "Microsoft - IntelliMouse (PS/2)", "imps2", "IMPS/2", "psaux", FALSE }, { "msintelliusb", "Microsoft - IntelliMouse (USB)", "ps/2", "IMPS/2", "input/mice", FALSE }, { "msintelliusboptical","Microsoft - IntelliMouse Optical (USB)", "ps/2", "IMPS/2", "input/mice", FALSE }, { "msbm", "Microsoft - Bus Mouse", "Busmouse", "BusMouse", "inportbm", TRUE }, { "mousesystems", "Mouse Systems - Mouse (serial)", "MouseSystems", "MouseSystems", "ttyS", TRUE }, { "mmseries", "MM - Series (serial)", "MMSeries", "MMSeries", "ttyS", TRUE }, { "mmhittab", "MM - HitTablet (serial)", "MMHitTab", "MMHittab", "ttyS", TRUE }, { "sun", "Sun - Mouse", "sun", "sun", "sunmouse", FALSE }, { NULL, NULL, NULL, NULL, NULL, FALSE }, }; /* * This table maps between the mouse protocol name used for gpm and * for the X server "protocol" mouse option. */ typedef struct { char *gpmproto; char *Xproto; } ProtocolEntry; static const ProtocolEntry __protocols[] = { /* gpm protocol X protocol */ { "ms3", "IntelliMouse" }, { "Busmouse", "BusMouse" }, { "Microsoft", "Microsoft" }, { "imps2", "IMPS/2" }, { "netmouse", "NetMousePS/2" }, { "Logitech", "Logitech" }, { "logim", "MouseMan" }, { "MouseMan", "MouseMan" }, { "ps/2", "PS/2" }, { "pnp", "Auto" }, { "MouseSystems", "MouseSystems" }, { "MMSeries", "MMSeries" }, { "MMHitTab", "MMHittab" }, { "sun", "sun" }, { NULL, NULL }, }; /* * gpm_proto_to_X_proto() - map from gpm mouse protocol to X mouse * protocol */ static char* gpm_proto_to_X_proto(const char *gpm) { int i; for (i = 0; __protocols[i].gpmproto; i++) { if (strcmp(gpm, __protocols[i].gpmproto) == 0) { return __protocols[i].Xproto; } } return NULL; } /* gpm_proto_to_X_proto() */ /* * find_mouse_entry() - scan the __mice[] table for the entry that * corresponds to the specified value; return a pointer to the * matching entry in the table, if any. */ static const MouseEntry *find_mouse_entry(char *value) { int i; if (!value) return NULL; for (i = 0; __mice[i].name; i++) { if (strcmp(value, __mice[i].shortname) == 0) { return &__mice[i]; } } return NULL; } /* find_mouse_entry() */ /* * find_closest_mouse_entry() - scan the __mice[] table for the entry that * matches all of the specified values; any of the values can be NULL, * in which case we do not use them as part of the comparison. Note * that device is compared case sensitive, proto is compared case * insensitive, and emulate3 is just a boolean. */ static const MouseEntry *find_closest_mouse_entry(const char *device, const char *proto, const char *emulate3_str) { int i; int emulate3 = FALSE; /* * translate the emulate3 string into a boolean we can use below * for comparison */ if ((emulate3_str) && ((strcasecmp(emulate3_str, "yes") == 0) || (strcasecmp(emulate3_str, "true") == 0) || (strcasecmp(emulate3_str, "1") == 0))) { emulate3 = TRUE; } /* * skip the "/dev/" part of the device filename */ if (device && (strncmp(device, "/dev/", 5) == 0)) { device += 5; /* strlen("/dev/") */ } for (i = 0; __mice[i].name; i++) { if ((device) && (strcmp(device, __mice[i].device) != 0)) continue; if ((proto) && (strcasecmp(proto, __mice[i].Xproto)) != 0) continue; if ((emulate3_str) && (emulate3 != __mice[i].emulate3)) continue; return &__mice[i]; } return NULL; } /* find_closest_mouse_entry() */ /* * find_config_entry() - scan the specified filename for the specified * keyword; return the value that the keyword is assigned to, or NULL * if any error occurs. */ static char *find_config_entry(const char *filename, const char *keyword) { int fd = -1; char *data = NULL; char *value = NULL; char *buf = NULL; char *tmp, *start, *c, *end; struct stat stat_buf; size_t len; if ((fd = open(filename, O_RDONLY)) == -1) goto done; if (fstat(fd, &stat_buf) == -1) goto done; if ((data = mmap(0, stat_buf.st_size, PROT_READ, MAP_SHARED, fd, 0)) == (void *) -1) goto done; /* * create a sysmem copy of the buffer, so that we can explicitly * NULL terminate it */ buf = malloc(stat_buf.st_size + 1); if (!buf) goto done; memcpy(buf, data, stat_buf.st_size); buf[stat_buf.st_size] = '\0'; /* search for the keyword */ start = buf; while (TRUE) { tmp = strstr(start, keyword); if (!tmp) goto done; /* * make sure this line is not commented out: search back from * tmp: if we hit a "#" before a newline, then this line is * commented out and we should search again */ c = tmp; while ((c >= start) && (*c != '\n') && (*c != '#')) c--; if (*c == '#') { /* keyword was commented out... search again */ start = tmp+1; } else { /* keyword is not commented out */ break; } } start = tmp + strlen(keyword); end = strchr(start, '\n'); if (!end) goto done; /* there must be something between the start and the end */ if (start == end) goto done; /* take what is between as the value */ len = end - start; value = xconfigAlloc(len + 1); strncpy(value, start, len); value[len] = '\0'; /* if the first and last characters are quotation marks, remove them */ if ((value[0] == '\"') && (value[len-1] == '\"')) { tmp = xconfigAlloc(len - 1); strncpy(tmp, value + 1, len - 2); tmp[len-2] = '\0'; free(value); value = tmp; } done: if (buf) free(buf); if (data) munmap(data, stat_buf.st_size); if (fd != -1) close(fd); return value; } /* find_config_entry() */ /* * xconfigGeneratePrintPossibleMice() - print the mouse table to stdout */ void xconfigGeneratePrintPossibleMice(void) { int i; printf("%-25s%-35s\n\n", "Short Name", "Name"); for (i = 0; __mice[i].name; i++) { printf("%-25s%-35s\n", __mice[i].shortname, __mice[i].name); } printf("\n"); } /* xconfigGeneratePrintPossibleMice() */ /* * xconfigAddMouse() - determine the mouse type, and then add an * XConfigInputRec with the appropriate options. * * - if the user specified on the commandline, use that * * - if /etc/sysconfig/mouse exists and contains valid data, use * that * * - if /etc/conf.d/gpm exists and contains valid data, use that * * - infer the settings from the commandline options gpm is using XXX? * * - default to "auto" on /dev/mouse */ int xconfigAddMouse(GenerateOptions *gop, XConfigPtr config) { const MouseEntry *entry = NULL; XConfigInputPtr input; char *device_path, *comment = "default"; /* if the user specified on the commandline, use that */ if (gop->mouse) { entry = find_mouse_entry(gop->mouse); if (entry) { comment = "commandline input"; } else { xconfigErrorMsg(WarnMsg, "Unable to find mouse \"%s\".", gop->mouse); } } /* * if /etc/sysconfig/mouse exists, and contains valid data, use * that */ if (!entry) { char *protocol, *device, *emulate3; device = find_config_entry("/etc/sysconfig/mouse", "DEVICE="); protocol = find_config_entry("/etc/sysconfig/mouse", "XMOUSETYPE="); emulate3 = find_config_entry("/etc/sysconfig/mouse", "XEMU3="); if (device || protocol || emulate3) { entry = find_closest_mouse_entry(device, protocol, emulate3); if (entry) { comment = "data in \"/etc/sysconfig/mouse\""; } } } /* if /etc/conf.d/gpm exists and contains valid data, use that */ if (!entry) { char *protocol, *device; protocol = find_config_entry("/etc/conf.d/gpm", "MOUSE="); device = find_config_entry("/etc/conf.d/gpm", "MOUSEDEV="); if (protocol && device) { MouseEntry *e = xconfigAlloc(sizeof(MouseEntry)); e->shortname = "custom"; e->name = "inferred from /etc/conf.d/gpm"; e->gpmproto = protocol; e->Xproto = gpm_proto_to_X_proto(protocol); e->device = device + strlen("/dev/"); e->emulate3 = FALSE; // XXX? entry = e; comment = "data in \"/etc/conf.d/gpm\""; } } /* * XXX we could try to infer the settings from the commandline * options gpm is using */ if (!entry) { /* XXX implement me */ } /* at this point, we must have a mouse entry */ if (!entry) { MouseEntry *e = xconfigAlloc(sizeof(MouseEntry)); e->Xproto = "auto"; #if defined(NV_BSD) e->device = "sysmouse"; #else if (access("/dev/psaux", F_OK) == 0) { e->device = "psaux"; } else if (access("/dev/input/mice", F_OK) == 0) { e->device = "input/mice"; } else { e->device = "mouse"; } #endif e->emulate3 = FALSE; entry = e; } /* add a new mouse input section */ input = xconfigAlloc(sizeof(XConfigInputRec)); input->comment = xconfigStrcat(" # generated from ", comment, "\n", NULL); input->identifier = xconfigStrdup("Mouse0"); input->driver = xconfigStrdup("mouse"); device_path = xconfigStrcat("/dev/", entry->device, NULL); input->options = NULL; xconfigAddNewOption(&input->options, "Protocol", entry->Xproto); xconfigAddNewOption(&input->options, "Device", device_path); xconfigAddNewOption(&input->options, "Emulate3Buttons", (entry->emulate3 ? "yes" : "no")); TEST_FREE(device_path); /* * This will make wheel mice work, and non-wheel mice should * ignore ZAxisMapping */ xconfigAddNewOption(&input->options, "ZAxisMapping", "4 5"); input->next = config->inputs; config->inputs = input; return TRUE; } /* xconfigAddMouse() */ /*********************************************************************/ /* * keyboard detection */ typedef struct { char *keytable; char *name; char *layout; /* XkbLayout */ char *model; /* XkbModel */ char *variant; /* XkbVariant */ char *options; /* XkbOptions */ } KeyboardEntry; /* * This table is based on data contained in * /usr/lib/python2.2/site-packages/rhpl/keyboard_models.py on Red Hat * Fedora core 1. That file contains the following copyright: * * * keyboard_models.py - keyboard model list * * Brent Fox * Mike Fulbright * Jeremy Katz * * Copyright 2002 Red Hat, Inc. */ static const KeyboardEntry __keyboards[] = { /* keytable name layout model variant options */ { "be-latin1", "Belgian (be-latin1)", "be", "pc105", NULL, NULL }, { "bg", "Bulgarian", "bg,us", "pc105", NULL, "grp:shift_toggle,grp_led:scroll" }, { "br-abnt2", "Brazilian (ABNT2)", "br", "abnt2", NULL, NULL }, { "cf", "French Canadian", "ca_enhanced", "pc105", NULL, NULL }, { "croat", "Croatian", "hr", "pc105", NULL, NULL }, { "cz-us-qwertz", "Czechoslovakian (qwertz)", "cz,us", "pc105", NULL, "grp:shift_toggle,grp_led:scroll" }, { "cz-lat2", "Czechoslovakian", "cz_qwerty", "pc105", NULL, NULL }, { "de", "German", "de", "pc105", NULL, NULL }, { "de-latin1", "German (latin1)", "de", "pc105", NULL, NULL }, { "de-latin1-nodeadkeys", "German (latin1 w/ no deadkeys)", "de", "pc105", "nodeadkeys", NULL }, { "dvorak", "Dvorak", "dvorak", "pc105", NULL, NULL }, { "dk", "Danish", "dk", "pc105", NULL, NULL }, { "dk-latin1", "Danish (latin1)", "dk", "pc105", NULL, NULL }, { "es", "Spanish", "es", "pc105", NULL, NULL }, { "et", "Estonian", "ee", "pc105", NULL, NULL }, { "fi", "Finnish", "fi", "pc105", NULL, NULL }, { "fi-latin1", "Finnish (latin1)", "fi", "pc105", NULL, NULL }, { "fr", "French", "fr", "pc105", NULL, NULL }, { "fr-latin0", "French (latin0)", "fr", "pc105", NULL, NULL }, { "fr-latin1", "French (latin1)", "fr", "pc105", NULL, NULL }, { "fr-pc", "French (pc)", "fr", "pc105", NULL, NULL }, { "fr_CH", "Swiss French", "fr_CH", "pc105", NULL, NULL }, { "fr_CH-latin1", "Swiss French (latin1)", "fr_CH", "pc105", NULL, NULL }, { "gr", "Greek", "us,el", "pc105", NULL, "grp:shift_toggle,grp_led:scroll" }, { "hu", "Hungarian", "hu", "pc105", NULL, NULL }, { "hu101", "Hungarian (101 key)", "hu", "pc105", NULL, NULL }, { "is-latin1", "Icelandic", "is", "pc105", NULL, NULL }, { "it", "Italian", "it", "pc105", NULL, NULL }, { "it-ibm", "Italian (IBM)", "it", "pc105", NULL, NULL }, { "it2", "Italian (it2)", "it", "pc105", NULL, NULL }, { "jp106", "Japanese", "jp", "jp106", NULL, NULL }, { "la-latin1", "Latin American", "la", "pc105", NULL, NULL }, { "mk-utf", "Macedonian", "mk,us", "pc105", NULL, "grp:shift_toggle,grp_led:scroll" }, { "no", "Norwegian", "no", "pc105", NULL, NULL }, { "pl", "Polish", "pl", "pc105", NULL, NULL }, { "pt-latin1", "Portuguese", "pt", "pc105", NULL, NULL }, { "ro_win", "Romanian", "ro", "pc105", NULL, NULL }, { "ru", "Russian", "ru,us", "pc105", NULL, "grp:shift_toggle,grp_led:scroll" }, { "ru-cp1251", "Russian (cp1251)", "ru,us", "pc105", NULL, "grp:shift_toggle,grp_led:scroll" }, { "ru-ms", "Russian (Microsoft)", "ru,us", "pc105", NULL, "grp:shift_toggle,grp_led:scroll" }, { "ru1", "Russian (ru1)", "ru,us", "pc105", NULL, "grp:shift_toggle,grp_led:scroll" }, { "ru2", "Russian (ru2)", "ru,us", "pc105", NULL, "grp:shift_toggle,grp_led:scroll" }, { "ru_win", "Russian (win)", "ru,us", "pc105", NULL, "grp:shift_toggle,grp_led:scroll" }, { "speakup", "Speakup", "us", "pc105", NULL, NULL }, { "speakup-lt", "Speakup (laptop)", "us", "pc105", NULL, NULL }, { "sv-latin1", "Swedish", "se", "pc105", NULL, NULL }, { "sg", "Swiss German", "de_CH", "pc105", NULL, NULL }, { "sg-latin1", "Swiss German (latin1)", "de_CH", "pc105", NULL, NULL }, { "sk-qwerty", "Slovakian", "sk_qwerty", "pc105", NULL, NULL }, { "slovene", "Slovenian", "si", "pc105", NULL, NULL }, { "trq", "Turkish", "tr", "pc105", NULL, NULL }, { "uk", "United Kingdom", "gb", "pc105", NULL, NULL }, { "ua", "Ukrainian", "ua,us", "pc105", NULL, "grp:shift_toggle,grp_led:scroll" }, { "us-acentos", "U.S. International", "us_intl", "pc105", NULL, NULL }, { "us", "U.S. English", "us", "pc105", NULL, NULL }, { NULL, NULL, NULL, NULL, NULL, NULL }, }; /* * find_keyboard_entry() - scan the __keyboards[] table for the entry that * corresponds to the specified value; return a pointer to the * matching entry in the table, if any. */ static const KeyboardEntry *find_keyboard_entry(char *value) { int i; if (!value) return NULL; for (i = 0; __keyboards[i].name; i++) { if (strcmp(value, __keyboards[i].keytable) == 0) { return &__keyboards[i]; } } return NULL; } /* find_keyboard_entry() */ /* * xconfigGeneratePrintPossibleKeyboards() - print the keyboard table */ void xconfigGeneratePrintPossibleKeyboards(void) { int i; printf("%-25s%-35s\n\n", "Short Name", "Name"); for (i = 0; __keyboards[i].name; i++) { printf("%-25s%-35s\n", __keyboards[i].keytable, __keyboards[i].name); } printf("\n"); } /* xconfigGeneratePrintPossibleKeyboards() */ /* * xconfigAddKeyboard() - determine the keyboard type, and then add an * XConfigInputRec with the appropriate options. * * How to detect the keyboard: * * - if the user specified on the command line, use that * * - if /etc/sysconfig/keyboard exists, and contains a valid * KEYTABLE entry, use that */ int xconfigAddKeyboard(GenerateOptions *gop, XConfigPtr config) { char *value, *comment = "default"; const KeyboardEntry *entry = NULL; XConfigInputPtr input; /* * if the user specified on the command line, use that */ if (gop->keyboard) { entry = find_keyboard_entry(gop->keyboard); if (entry) { comment = "commandline input"; } else { xconfigErrorMsg(WarnMsg, "Unable to find keyboard \"%s\".", gop->keyboard); } } /* * if /etc/sysconfig/keyboard exists, and contains a valid * KEYTABLE entry, use that */ if (!entry) { value = find_config_entry("/etc/sysconfig/keyboard", "KEYTABLE="); entry = find_keyboard_entry(value); if (value) { free(value); } if (entry) { comment = "data in \"/etc/sysconfig/keyboard\""; } } /* add a new keyboard input section */ input = xconfigAlloc(sizeof(XConfigInputRec)); input->comment = xconfigStrcat(" # generated from ", comment, "\n", NULL); input->identifier = xconfigStrdup("Keyboard0"); /* * determine which keyboard driver should be used (either "kbd" or * "keyboard"); if the user specified a keyboard driver use that; * if 'ROOT/lib/modules/input/kbd_drv.(o|so)' exists, use "kbd"; * otherwise, use "keyboard". * On Solaris, use the default "keyboard" */ if (gop->keyboard_driver) { input->driver = gop->keyboard_driver; } else { #if defined(NV_SUNOS) || defined(NV_BSD) input->driver = xconfigStrdup("keyboard"); #else if (gop->xserver == X_IS_XORG) { input->driver = xconfigStrdup("kbd"); } else { input->driver = xconfigStrdup("keyboard"); } #endif } /* * set additional keyboard options, based on the Keyboard table * entry we found above */ input->options = NULL; if (entry) { if (entry->layout) xconfigAddNewOption(&input->options, "XkbLayout", entry->layout); if (entry->model) xconfigAddNewOption(&input->options, "XkbModel", entry->model); if (entry->variant) xconfigAddNewOption(&input->options, "XkbVariant", entry->variant); if (entry->options) xconfigAddNewOption(&input->options, "XkbOptions", entry->options); } input->next = config->inputs; config->inputs = input; return TRUE; } /* xconfigAddKeyboard() */ /* * xconfigGetDefaultProjectRoot() - scan some common directories for the X * project root. * * Users of this information should be careful to account for the * modular layout. */ static char *xconfigGetDefaultProjectRoot(void) { char *paths[] = { "/usr/X11R6", "/usr/X11", NULL }; struct stat stat_buf; int i; for (i = 0; paths[i]; i++) { if (stat(paths[i], &stat_buf) == -1) { continue; } if (S_ISDIR(stat_buf.st_mode)) { return paths[i]; } } /* default to "/usr/X11R6", I guess */ return paths[0]; } /* xconfigGetDefaultProjectRoot() */ /* * get_xserver_information() - parse the versionString (from `X * -version`) and assign relevant information that we infer from the X * server version. * * Note: this implementation should be shared with nvidia-installer */ static int get_xserver_information(const char *versionString, int *isXorg, int *isModular, int *autoloadsGLX, int *supportsExtensionSection) { #define XSERVER_VERSION_FORMAT_1 "X Window System Version" #define XSERVER_VERSION_FORMAT_2 "X.Org X Server" int major, minor, found; const char *ptr; /* check if this is an XFree86 X server */ if (strstr(versionString, "XFree86 Version")) { *isXorg = FALSE; *isModular = FALSE; *autoloadsGLX = FALSE; *supportsExtensionSection = FALSE; return TRUE; } /* this must be an X.Org X server */ *isXorg = TRUE; /* attempt to parse the major.minor version out of the string */ found = FALSE; if (((ptr = strstr(versionString, XSERVER_VERSION_FORMAT_1)) != NULL) && (sscanf(ptr, XSERVER_VERSION_FORMAT_1 " %d.%d", &major, &minor) == 2)) { found = TRUE; } if (!found && ((ptr = strstr(versionString, XSERVER_VERSION_FORMAT_2)) != NULL) && (sscanf(ptr, XSERVER_VERSION_FORMAT_2 " %d.%d", &major, &minor) == 2)) { found = TRUE; } /* if we can't parse the version, give up */ if (!found) return FALSE; /* * isModular: X.Org X11R6.x X servers are monolithic, all others * are modular */ if (major == 6) { *isModular = FALSE; } else { *isModular = TRUE; } /* * supportsExtensionSection: support for the "Extension" xorg.conf * section was added between X.Org 6.7 and 6.8. To account for * the X server version wrap, it is easier to check for X servers * that do not support the Extension section: 6.x (x < 8) X * servers. */ if ((major == 6) && (minor < 8)) { *supportsExtensionSection = FALSE; } else { *supportsExtensionSection = TRUE; } /* * support for autoloading GLX was added in X.Org 1.5. To account * for the X server version wrap, it is easier to check for X * servers that do not support GLX autoloading: 6.x, 7.x, or < 1.5 * X servers. */ if ((major == 6) || (major == 7) || ((major == 1) && (minor < 5))) { *autoloadsGLX = FALSE; } else { *autoloadsGLX = TRUE; } return TRUE; } /* get_xserver_information() */ /* * xconfigGetXServerInUse() - try to determine which X server is in use * (XFree86, Xorg); also determine if the X server supports the * Extension section of the X config file; support for the "Extension" * section was added between X.Org 6.7 and 6.8. * * Some of the parsing here mimics what is done in the * check_for_modular_xorg() function in nvidia-installer */ #define NV_LINE_LEN 1024 #define EXTRA_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/X11R6/bin:/usr/bin/X11" #if defined(NV_SUNOS) #define XSERVER_BIN_NAME "Xorg" #else #define XSERVER_BIN_NAME "X" #endif void xconfigGetXServerInUse(GenerateOptions *gop) { FILE *stream = NULL; int xserver = -1; int isXorg; int dummy, len, found; char *cmd, *ptr, *ret; gop->supports_extension_section = FALSE; gop->autoloads_glx = FALSE; /* run `X -version` with a PATH that hopefully includes the X binary */ cmd = xconfigStrcat("PATH=", gop->x_project_root, ":", EXTRA_PATH, ":$PATH ", XSERVER_BIN_NAME, " -version 2>&1", NULL); if ((stream = popen(cmd, "r"))) { char buf[NV_LINE_LEN]; /* read in as much of the input as we can fit into the buffer */ ptr = buf; do { len = NV_LINE_LEN - (ptr - buf) - 1; ret = fgets(ptr, len, stream); ptr = strchr(ptr, '\0'); } while ((ret != NULL) && (len > 1)); /* * process the `X -version` output to infer relevant * information from this X server */ found = get_xserver_information(buf, &isXorg, &dummy, /* isModular */ &gop->autoloads_glx, &gop->supports_extension_section); if (found) { if (isXorg) { xserver = X_IS_XORG; } else { xserver = X_IS_XF86; } } else { xconfigErrorMsg(WarnMsg, "Unable to parse X.Org version string."); } } /* Close the popen()'ed stream. */ pclose(stream); free(cmd); if (xserver == -1) { char *xorgpath; xorgpath = xconfigStrcat(gop->x_project_root, "/bin/Xorg", NULL); if (access(xorgpath, F_OK)==0) { xserver = X_IS_XORG; } else { xserver = X_IS_XF86; } free(xorgpath); } gop->xserver=xserver; } /* xconfigGetXServerInUse() */ /* * xconfigGenerateLoadDefaultOptions - initialize a GenerateOptions * structure with default values by peeking at the file system. */ void xconfigGenerateLoadDefaultOptions(GenerateOptions *gop) { memset(gop, 0, sizeof(GenerateOptions)); gop->x_project_root = xconfigGetDefaultProjectRoot(); /* XXX What to default the following to? gop->xserver gop->keyboard gop->mouse gop->keyboard_driver */ } /* xconfigGenerateLoadDefaultOptions() */ nvidia-settings/src/common-utils/0000775000175000017500000000000012236467170017257 5ustar albertoalbertonvidia-settings/src/common-utils/nvgetopt.c0000664000175000017500000002766112236467170021305 0ustar albertoalberto/* * Copyright (C) 2004-2010 NVIDIA Corporation * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . * * * nvgetopt.c - portable getopt_long() replacement; removes the need * for the stupid optstring argument. */ #include #include #include #include #include #include "nvgetopt.h" #include "common-utils.h" int nvgetopt(int argc, char *argv[], const NVGetoptOption *options, char **strval, int *boolval, int *intval, double *doubleval, int *disable_val) { char *c, *a, *arg, *name = NULL, *argument=NULL; int i, found = NVGETOPT_FALSE; int ret = 0; int negate = NVGETOPT_FALSE; int disable = NVGETOPT_FALSE; const NVGetoptOption *o = NULL; static int argv_index = 0; if (strval) *strval = NULL; if (boolval) *boolval = NVGETOPT_FALSE; if (intval) *intval = 0; if (doubleval) *doubleval = 0.0; if (disable_val) *disable_val = NVGETOPT_FALSE; argv_index++; /* if no more options, return -1 */ if (argv_index >= argc) return -1; /* get the argument in question */ arg = strdup(argv[argv_index]); /* look for "--" or "-" */ if ((arg[0] == '-') && (arg[1] == '-')) { name = arg + 2; } else if (arg[0] == '-') { name = arg + 1; } else { fprintf(stderr, "%s: invalid option: \"%s\"\n", argv[0], arg); goto done; } /* * if there is an "=" in the string, then assign argument and zero * out the equal sign so that name will match what is in the * option table. */ c = name; while (*c) { if (*c == '=') { argument = c + 1; *c = '\0'; break; } c++; } /* * if the string is terminated after one character, interpret it * as a short option. Otherwise, interpret it as a long option. */ if (name[1] == '\0') { /* short option */ for (i = 0; options[i].name; i++) { if (options[i].val == name[0]) { o = &options[i]; break; } } } else { /* long option */ for (i = 0; options[i].name; i++) { const char *tmpname; int tmp_negate; /* * if this option allows negation by prepending with * "--no-" (true for IS_BOOLEAN and ALLOW_DISABLE), then * skip any leading "no-" in the argument */ if ((options[i].flags & (NVGETOPT_IS_BOOLEAN | NVGETOPT_ALLOW_DISABLE)) && (name[0] == 'n') && (name[1] == 'o') && (name[2] == '-')) { tmpname = name + 3; tmp_negate = NVGETOPT_TRUE; } else { tmpname = name; tmp_negate = NVGETOPT_FALSE; } if (strcmp(tmpname, options[i].name) == 0) { o = &options[i]; negate = tmp_negate; break; } } } /* * if we didn't find a match, maybe this is multiple short options * stored together; is each character a short option? */ if (!o) { for (c = name; *c; c++) { found = NVGETOPT_FALSE; for (i = 0; options[i].name; i++) { if (options[i].val == *c) { found = NVGETOPT_TRUE; break; } } if (!found) break; } if (found) { /* * all characters individually are short options, so * interpret them that way */ for (i = 0; options[i].name; i++) { if (options[i].val == name[0]) { /* * don't allow options with arguments to be * processed in this way */ if (options[i].flags & NVGETOPT_HAS_ARGUMENT) break; /* * remove the first short option from * argv[argv_index] */ a = argv[argv_index]; if (a[0] == '-') a++; if (a[0] == '-') a++; if (a[0] == '+') a++; while(a[0]) { a[0] = a[1]; a++; } /* * decrement argv_index so that we process this * entry again */ argv_index--; o = &options[i]; break; } } } } /* if we didn't find an option, return */ if (!o) { fprintf(stderr, "%s: unrecognized option: \"%s\"\n", argv[0], arg); goto done; } /* if the option is boolean, record !negate as the boolean value */ if (o->flags & NVGETOPT_IS_BOOLEAN) { if (boolval) *boolval = !negate; } /* * if this option is flagged as "disable-able", then let the * "--no-" prefix get interpreted to mean that the option should * be disabled */ if ((o->flags & NVGETOPT_ALLOW_DISABLE) && (negate == NVGETOPT_TRUE)) { disable = NVGETOPT_TRUE; } /* * if the option takes an argument (either string or integer), and * we haven't already decided to disable the option, then we * either need to use what was after the "=" in this argv[] entry, * or we need to pull the next entry off of argv[] */ if ((o->flags & NVGETOPT_HAS_ARGUMENT) && !disable) { if (argument) { if (!argument[0]) { fprintf(stderr, "%s: option \"%s\" requires an " "argument.\n", argv[0], arg); goto done; } } else { /* * if the argument is optional, and we're either at the * end of the argv list, or the next argv starts with '-', * then assume there is no argument for this option */ if ((o->flags & NVGETOPT_ARGUMENT_IS_OPTIONAL) && ((argv_index == (argc - 1)) || (argv[argv_index + 1][0] == '-'))) { argument = NULL; goto argument_processing_done; } else { argv_index++; if (argv_index >= argc) { fprintf(stderr, "%s: option \"%s\" requires an " "argument.\n", argv[0], arg); goto done; } argument = argv[argv_index]; } } /* argument is now a valid string: parse it */ if ((o->flags & NVGETOPT_INTEGER_ARGUMENT) && (intval)) { /* parse the argument as an integer */ char *endptr; *intval = (int) strtol(argument, &endptr, 0); if (*endptr) { fprintf(stderr, "%s: \"%s\" is not a valid argument for " "option \"%s\".\n", argv[0], argument, arg); goto done; } } else if ((o->flags & NVGETOPT_STRING_ARGUMENT) && (strval)) { /* treat the argument as a string */ *strval = strdup(argument); } else if ((o->flags & NVGETOPT_DOUBLE_ARGUMENT) && (doubleval)) { /* parse the argument as a double */ char *endptr; *doubleval = (double) strtod(argument, &endptr); if (*endptr) { fprintf(stderr, "%s: \"%s\" is not a valid argument for " "option \"%s\".\n", argv[0], argument, arg); goto done; } } else { fprintf(stderr, "%s: error while assigning argument for " "option \"%s\".\n", argv[0], arg); goto done; } } else { /* if we have an argument when we shouldn't; complain */ if (argument) { fprintf(stderr, "%s: option \"%s\" does not take an argument, but " "was given an argument of \"%s\".\n", argv[0], arg, argument); goto done; } } argument_processing_done: ret = o->val; /* fall through */ done: if (disable_val) *disable_val = disable; free(arg); return ret; } /* nvgetopt() */ /* * cook_description() - the description string may contain text within * special characters which are interpreted by the manpage generator. * We want to omit those characters here. */ static char *cook_description(const char *description) { const char *src; char *s, *dst; if (!description) { return NULL; } s = strdup(description); if (!s) { return NULL; } for (src = description, dst = s; *src; src++) { if ((*src == '&') || (*src == '^')) { continue; } *dst = *src; dst++; } *dst = '\0'; return s; } void nvgetopt_print_help(const NVGetoptOption *options, unsigned int include_mask, nvgetopt_print_help_callback_ptr callback) { const NVGetoptOption *o; int i; for (i = 0; options[i].name; i++) { char *msg = NULL, *arg = NULL, *description = NULL; o = &options[i]; /* Skip options with no help text */ if (!o->description) { continue; } /* skip options who don't have all the bits of include_mask */ if ((o->flags & include_mask) != include_mask) { continue; } /* if we are going to need the argument, process it now */ arg = NULL; if (o->flags & NVGETOPT_HAS_ARGUMENT) { if (o->arg_name) { arg = strdup(o->arg_name); } else { char *tmp; arg = strdup(o->name); for (tmp = arg; tmp && *tmp; tmp++) { *tmp = toupper(*tmp); } } } msg = NULL; /* * create the long version of the option, possibly with an * argument; e.g., "--foo" or "--foo=BAR" */ if (arg) { msg = nvstrcat("--", o->name, "=", arg, NULL); } else { msg = nvstrcat("--", o->name, NULL); } /* * prepend the single character version of the option, * possibly with an argument; e.g., "-f" or "-f BAR" */ if (o->val <= UCHAR_MAX && o->val >= 0 && isalpha(o->val)) { char scratch[16]; char *tmp; snprintf(scratch, sizeof(scratch), "%c", o->val); if (arg) { tmp = nvstrcat("-", scratch, " ", arg, ", ", msg, NULL); } else { tmp = nvstrcat("-", scratch, ", ", msg, NULL); } free(msg); msg = tmp; } /* append the boolean version of the option; e.g., "--no-foo" */ if (((o->flags & NVGETOPT_IS_BOOLEAN) && !(o->flags & NVGETOPT_HAS_ARGUMENT)) || (o->flags & NVGETOPT_ALLOW_DISABLE)) { char *tmp = nvstrcat(msg, ", --no-", o->name, NULL); free(msg); msg = tmp; } /* process the description text */ description = cook_description(o->description); /* give the strings to the caller to format and print */ callback(msg, description); free(msg); free(arg); free(description); } } nvidia-settings/src/common-utils/src.mk0000664000175000017500000000110012236467170020367 0ustar albertoalberto# makefile fragment included by nvidia-xconfig, nvidia-settings, and nvidia-installer COMMON_UTILS_SRC += nvgetopt.c COMMON_UTILS_SRC += common-utils.c COMMON_UTILS_EXTRA_DIST += nvgetopt.h COMMON_UTILS_EXTRA_DIST += common-utils.h COMMON_UTILS_EXTRA_DIST += src.mk # gen-manpage-opts-helper.c is listed in EXTRA_DIST, rather than SRC, # because it is not compiled into the utilities themselves, but used # when building the utility's gen-manpage-opts COMMON_UTILS_EXTRA_DIST += gen-manpage-opts-helper.c COMMON_UTILS_EXTRA_DIST += gen-manpage-opts-helper.h nvidia-settings/src/common-utils/common-utils.h0000664000175000017500000001726012236467170022064 0ustar albertoalberto/* * Copyright (C) 2010-2012 NVIDIA Corporation * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ #ifndef __COMMON_UTILS_H__ #define __COMMON_UTILS_H__ #include #include #include #include #if !defined(TRUE) #define TRUE 1 #endif #if !defined(FALSE) #define FALSE 0 #endif #define ARRAY_LEN(_arr) (sizeof(_arr) / sizeof(_arr[0])) #define NV_MIN(x,y) ((x) < (y) ? (x) : (y)) #define NV_MAX(x,y) ((x) > (y) ? (x) : (y)) #define TAB " " #define BIGTAB " " #define VERBOSITY_NONE 0 /* nothing */ #define VERBOSITY_ERROR 1 /* errors only */ #define VERBOSITY_DEPRECATED 2 /* errors, deprecation messages and warnings */ #define VERBOSITY_WARNING 3 /* errors and warnings */ #define VERBOSITY_ALL 4 /* errors, warnings and other info */ #define VERBOSITY_DEFAULT VERBOSITY_ERROR /* * Define a printf format attribute macro. This definition is based on the one * from Xfuncproto.h, available in the 'xproto' package at * http://xorg.freedesktop.org/releases/individual/proto/ */ #if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 203) # define NV_ATTRIBUTE_PRINTF(x,y) __attribute__((__format__(__printf__,x,y))) #else /* not gcc >= 2.3 */ # define NV_ATTRIBUTE_PRINTF(x,y) #endif typedef struct { char **t; /* the text rows */ int n; /* number of rows */ int m; /* maximum row length */ } TextRows; void *nvalloc(size_t size); char *nvstrcat(const char *str, ...); void *nvrealloc(void *ptr, size_t size); char *nvstrdup(const char *s); char *nvstrndup(const char *s, size_t n); char *nvstrtolower(char *s); char *nvstrtoupper(char *s); char *nvstrchrnul(char *s, int c); char *nvasprintf(const char *fmt, ...) NV_ATTRIBUTE_PRINTF(1, 2); void nv_append_sprintf(char **buf, const char *fmt, ...) NV_ATTRIBUTE_PRINTF(2, 3); void nvfree(void *s); char *tilde_expansion(const char *str); char *nv_prepend_to_string_list(char *list, const char *item, const char *delim); TextRows *nv_format_text_rows(const char *prefix, const char *str, int width, int word_boundary); void nv_text_rows_append(TextRows *t, const char *msg); void nv_concat_text_rows(TextRows *t0, TextRows *t1); void nv_free_text_rows(TextRows *t); void reset_current_terminal_width(unsigned short new_val); void silence_fmt(int val); void fmtout(const char *fmt, ...) NV_ATTRIBUTE_PRINTF(1, 2); void fmtoutp(const char *prefix, const char *fmt, ...) NV_ATTRIBUTE_PRINTF(2, 3); void fmterr(const char *fmt, ...) NV_ATTRIBUTE_PRINTF(1, 2); void fmtwarn(const char *fmt, ...) NV_ATTRIBUTE_PRINTF(1, 2); void fmt(FILE *stream, const char *prefix, const char *fmt, ...) NV_ATTRIBUTE_PRINTF(3, 4); char *fget_next_line(FILE *fp, int *eof); int nv_open(const char *pathname, int flags, mode_t mode); int nv_get_file_length(const char *filename); void nv_set_file_length(const char *filename, int fd, int len); void *nv_mmap(const char *filename, size_t len, int prot, int flags, int fd); char *nv_basename(const char *path); char *nv_trim_space(char *string); char *nv_trim_char(char *string, char trim); char *nv_trim_char_strict(char *string, char trim); /* * NV_VSNPRINTF(): macro that assigns buf using vsnprintf(). This is * correct for differing semantics of the vsnprintf() return value: * * -1 when the buffer is not long enough (glibc < 2.1) * * or * * the length the string would have been if the buffer had been large * enough (glibc >= 2.1) * * This macro allocates memory for buf; the caller should free it when * done. */ #define NV_FMT_BUF_LEN 256 #define NV_VSNPRINTF(buf, fmt) \ do { \ if (!fmt) { \ (buf) = NULL; \ } else { \ va_list ap; \ int len, current_len = NV_FMT_BUF_LEN; \ \ while (1) { \ (buf) = nvalloc(current_len); \ \ va_start(ap, fmt); \ len = vsnprintf((buf), current_len, (fmt), ap); \ va_end(ap); \ \ if ((len > -1) && (len < current_len)) { \ break; \ } else if (len > -1) { \ current_len = len + 1; \ } else { \ current_len += NV_FMT_BUF_LEN; \ } \ \ nvfree(buf); \ } \ } \ } while (0) #if defined(__GNUC__) # define NV_INLINE __inline__ #else # define NV_INLINE #endif /* * Simple function which encodes a version number, given as major, minor, micro, * and nano, as a 64-bit unsigned integer. This is defined in an inline function * rather than as a macro for convenience so it can be examined by the debugger. * Encoded version numbers can be compared directly in version checks. */ static NV_INLINE uint64_t nv_encode_version(unsigned int major, unsigned int minor, unsigned int micro, unsigned int nano) { return (((uint64_t)(nano & 0xFFFF)) | (((uint64_t)(micro & 0xFFFF)) << 16) | (((uint64_t)(minor & 0xFFFF)) << 32) | (((uint64_t)(major & 0xFFFF)) << 48)); } /* * Wrapper macros for nv_encode_version(). For K in {2,3,4}, NV_VERSIONK() takes * a K-part version number. */ #define NV_VERSION2(major, minor) \ nv_encode_version(major, minor, 0, 0) #define NV_VERSION3(major, minor, micro) \ nv_encode_version(major, minor, micro, 0) #define NV_VERSION4(major, minor, micro, nano) \ nv_encode_version(major, minor, micro, nano) /* * Helper enum that can be used for boolean values that might or might not be * set. Care should be taken to avoid simple boolean testing, as a value of * NV_OPTIONAL_BOOL_DEFAULT would evaluate as true. * * The user is responsible for unconditionally initializing the default value of * any such booleans to NV_OPTIONAL_BOOL_DEFAULT, before any code path that * might optionally set their values is executed. */ typedef enum { NV_OPTIONAL_BOOL_DEFAULT = -1, NV_OPTIONAL_BOOL_FALSE = FALSE, NV_OPTIONAL_BOOL_TRUE = TRUE } NVOptionalBool; #endif /* __COMMON_UTILS_H__ */ nvidia-settings/src/common-utils/nvgetopt.h0000664000175000017500000001321612236467170021301 0ustar albertoalberto/* * Copyright (C) 2004-2010 NVIDIA Corporation * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . * * * nvgetopt.h */ #ifndef __NVGETOPT_H__ #define __NVGETOPT_H__ #define NVGETOPT_FALSE 0 #define NVGETOPT_TRUE 1 /* * mask of bits not used by nvgetopt in NVGetoptOption::flags; * these bits are available for use within specific users of * nvgetopt */ #define NVGETOPT_UNUSED_FLAG_RANGE 0xffff0000 /* * indicates that the option is a boolean value; the presence of the * option will be interpreted as a TRUE value; if the option is * prepended with '--no-', the option will be interpreted as a FALSE * value. On success, nvgetopt will return the parsed boolean value * through 'boolval'. */ #define NVGETOPT_IS_BOOLEAN 0x01 /* * indicates that the option takes an argument to be interpreted as a * string; on success, nvgetopt will return the parsed string argument * through 'strval'. */ #define NVGETOPT_STRING_ARGUMENT 0x02 /* * indicates that the option takes an argument to be interpreted as an * integer; on success, nvgetopt will return the parsed integer * argument through 'intval'. */ #define NVGETOPT_INTEGER_ARGUMENT 0x04 /* * indicates that the option takes an argument to be interpreted as * an double; on success, nvgetopt will return the parsed double * argument through 'doubleval'. */ #define NVGETOPT_DOUBLE_ARGUMENT 0x08 /* helper macro */ #define NVGETOPT_HAS_ARGUMENT (NVGETOPT_STRING_ARGUMENT | \ NVGETOPT_INTEGER_ARGUMENT | \ NVGETOPT_DOUBLE_ARGUMENT) /* * indicates that the option, which normally takes an argument, can be * disabled if the option is prepended with '--no-', in which case, * the option does not take an argument. If the option is disabled, * nvgetopt will return TRUE through 'disable_val'. * * Note that NVGETOPT_ALLOW_DISABLE can only be used with options that * take arguments. */ #define NVGETOPT_ALLOW_DISABLE 0x10 /* * indicates that the argument for this option is optional; if no * argument is present (either the option is already at the end of the * argv array, or the next option in argv starts with '-'), then the * option is returned without an argument. */ #define NVGETOPT_ARGUMENT_IS_OPTIONAL 0x20 /* * The NVGETOPT_HELP_ALWAYS flag is not used by nvgetopt() itself, but * is often used by other users of NVGetoptOption tables, who print * out basic and advanced help. In such cases, OPTION_HELP_ALWAYS is * used to indicate that the help for the option should always be * printed. */ #define NVGETOPT_HELP_ALWAYS 0x40 typedef struct { const char *name; int val; unsigned int flags; char *arg_name; /* not used by nvgetopt() */ char *description; /* not used by nvgetopt() */ } NVGetoptOption; /* * nvgetopt() - see the glibc getopt_long(3) manpage for usage * description. Options can be prepended with "--", "-", or "--no-". * * A global variable stores the current index into the argv array, so * subsequent calls to nvgetopt() will advance through argv[]. * * On success, the matching NVGetoptOption.val is returned. * * If the NVGETOPT_IS_BOOLEAN flag is set, boolval will be set to TRUE * (or FALSE, if the option string was prepended with "--no-"). * * disable_val will be assigned TRUE if the option string was * prepended with "--no-", otherwise it will be assigned FALSE. * * If an argument is successfully parsed, one of strval, intval, or * doubleval will be assigned, based on which of * NVGETOPT_STRING_ARGUMENT, NVGETOPT_INTEGER_ARGUMENT, or * NVGETOPT_DOUBLE_ARGUMENT is set in the option's flags. If strval * is assigned to a non-NULL value by nvgetopt, then it is the * caller's responsibility to free the string when done with it. * * On failure, an error is printed to stderr, and 0 is returned. * * When there are no more options to parse, -1 is returned. */ int nvgetopt(int argc, char *argv[], const NVGetoptOption *options, char **strval, int *boolval, int *intval, double *doubleval, int *disable_val); /* * nvgetopt_print_help() - print a help message for each option in the * provided NVGetoptOption array. This is useful for a utility's * "--help" output. * * Options will only be printed if they have every bit set that * include_mask includes. * * For each option, the provided callback function wil be called with * two strings: a name string that lists the option's name, and a * description string for the option. The callback function is * responsible for actually printing these strings. Examples: * * name = "-v, --version"; * description = "Print usage information for the common commandline " * "options and exit."; */ typedef void nvgetopt_print_help_callback_ptr(const char *name, const char *description); void nvgetopt_print_help(const NVGetoptOption *options, unsigned int include_mask, nvgetopt_print_help_callback_ptr callback); #endif /* __NVGETOPT_H__ */ nvidia-settings/src/common-utils/gen-manpage-opts-helper.c0000664000175000017500000001111112236467170024035 0ustar albertoalberto/* * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "nvgetopt.h" #include "gen-manpage-opts-helper.h" static void print_option(const NVGetoptOption *o) { char scratch[64], *s; int j, len; int italics, bold, omitWhiteSpace; /* if we are going to need the argument, process it now */ if (o->flags & NVGETOPT_HAS_ARGUMENT) { if (o->arg_name) { strcpy(scratch, o->arg_name); } else { len = strlen(o->name); for (j = 0; j < len; j++) scratch[j] = toupper(o->name[j]); scratch[len] = '\0'; } } printf(".TP\n.BI \""); /* Print the name of the option */ /* XXX We should backslashify the '-' characters in o->name. */ if (isalpha(o->val)) { /* '\-c' */ printf("\\-%c", o->val); if (o->flags & NVGETOPT_HAS_ARGUMENT) { /* ' " "ARG" "' */ printf(" \" \"%s\" \"", scratch); } /* ', ' */ printf(", "); } /* '\-\-name' */ printf("\\-\\-%s", o->name); /* '=" "ARG' */ if (o->flags & NVGETOPT_HAS_ARGUMENT) { printf("=\" \"%s", scratch); /* '" "' */ if ((o->flags & NVGETOPT_IS_BOOLEAN) || (o->flags & NVGETOPT_ALLOW_DISABLE)) { printf("\" \""); } } /* ', \-\-no\-name' */ if (((o->flags & NVGETOPT_IS_BOOLEAN) && !(o->flags & NVGETOPT_HAS_ARGUMENT)) || (o->flags & NVGETOPT_ALLOW_DISABLE)) { printf(", \\-\\-no\\-%s", o->name); } printf("\"\n"); /* Print the option description */ /* XXX Each sentence should be on its own line! */ /* * Print the option description: write each character one at a * time (ugh) so that we can special-case a few characters: * * '&' : toggles italics on and off * '^' : toggles bold on and off * '-' : is backslashified: "\-" * * Whitespace is omitted when italics or bold is on */ italics = 0; bold = 0; omitWhiteSpace = 0; for (s = o->description; s && *s; s++) { switch (*s) { case '&': if (italics) { printf("\n"); } else { printf("\n.I "); } omitWhiteSpace = italics; italics = !italics; break; case '^': if (bold) { printf("\n"); } else { printf("\n.B "); } omitWhiteSpace = bold; bold = !bold; break; case '-': printf("\\-"); omitWhiteSpace = 0; break; case ' ': if (!omitWhiteSpace) { printf(" "); } break; default: printf("%c", *s); omitWhiteSpace = 0; break; } } printf("\n"); } void gen_manpage_opts_helper(const NVGetoptOption *options) { int i; int has_advanced_options = 0; /* Print the "simple" options; i.e. the ones you get with --help. */ printf(".SH OPTIONS\n"); for (i = 0; options[i].name; i++) { const NVGetoptOption *o = &options[i]; if (!o->description) { continue; } if (!(o->flags & NVGETOPT_HELP_ALWAYS)) { has_advanced_options = 1; continue; } print_option(o); } if (has_advanced_options) { /* * If any exist, print the advanced options; i.e., the ones * you get with --advanced-help */ printf(".SH \"ADVANCED OPTIONS\"\n"); for (i = 0; options[i].name; i++) { const NVGetoptOption *o = &options[i]; if (!o->description) { continue; } if (o->flags & NVGETOPT_HELP_ALWAYS) { continue; } print_option(o); } } } nvidia-settings/src/common-utils/common-utils.c0000664000175000017500000005150012236467170022052 0ustar albertoalberto/* * Copyright (C) 2010-2012 NVIDIA Corporation * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "common-utils.h" /****************************************************************************/ /* Memory allocation helper functions */ /****************************************************************************/ /* * nvalloc() - calloc wrapper that checks for errors; if an error * occurs, an error is printed to stderr and exit is called -- this * function will only return on success. */ void *nvalloc(size_t size) { void *m = calloc(1, size); if (!m) { fprintf(stderr, "%s: memory allocation failure (%s)! \n", PROGRAM_NAME, strerror(errno)); exit(1); } return m; } /* nvalloc() */ /* * nvstrcat() - allocate a new string, copying all given strings * into it. taken from glib */ char *nvstrcat(const char *str, ...) { unsigned int l; va_list args; char *s; char *concat; l = 1 + strlen(str); va_start(args, str); s = va_arg(args, char *); while (s) { l += strlen(s); s = va_arg(args, char *); } va_end(args); concat = nvalloc(l); concat[0] = 0; strcat(concat, str); va_start(args, str); s = va_arg(args, char *); while (s) { strcat(concat, s); s = va_arg(args, char *); } va_end(args); return concat; } /* nvstrcat() */ /* * nvrealloc() - realloc wrapper that checks for errors; if an error * occurs, an error is printed to stderr and exit is called -- this * function will only return on success. */ void *nvrealloc(void *ptr, size_t size) { void *m; if (ptr == NULL) return nvalloc(size); m = realloc(ptr, size); if (!m) { fprintf(stderr, "%s: memory re-allocation failure (%s)! \n", PROGRAM_NAME, strerror(errno)); exit(1); } return m; } /* nvrealloc() */ /* * nvstrdup() - wrapper for strdup() that checks the return value; if * an error occurs, an error is printed to stderr and exit is called * -- this function will only return on success. */ char *nvstrdup(const char *s) { char *m; if (!s) return NULL; m = strdup(s); if (!m) { fprintf(stderr, "%s: memory allocation failure during strdup (%s)! \n", PROGRAM_NAME, strerror(errno)); exit(1); } return m; } /* nvstrdup() */ /* * nvstrndup() - implementation of strndup() that checks return values; if * an error occurs, an error is printed to stderr and exit is called * -- this function will only return on success. */ char *nvstrndup(const char *s, size_t n) { char *m; if (!s) return NULL; m = malloc(n + 1); if (!m) { fprintf(stderr, "%s: memory allocation failure during malloc (%s)! \n", PROGRAM_NAME, strerror(errno)); exit(1); } strncpy (m, s, n); m[n] = '\0'; return m; } /* nvstrndup() */ /* * nvstrtolower() - convert the given string to lowercase. */ char *nvstrtolower(char *s) { char *start = s; if (s == NULL) return NULL; while (*s) { *s = tolower(*s); s++; } return start; } /* nvstrtolower() */ /* * nvstrtoupper() - convert the given string to uppercase. */ char *nvstrtoupper(char *s) { char *start = s; if (s == NULL) return NULL; while (*s) { *s = toupper(*s); s++; } return start; } /* nvstrtoupper() */ /* * nvasprintf() - implementation of asprintf() that checks return values; if an * error occurs, an error is printed to stderr and exit is called. * -- this function will only return on success. */ char *nvasprintf(const char *fmt, ...) { char *str; NV_VSNPRINTF(str, fmt); return str; } /* nvasprintf() */ /* * nv_append_sprintf() - similar to glib's g_string_append_printf(), except * instead of operating on a GString it operates on a (char **). Appends a * formatted string to the end of the dynamically-allocated string pointed to by * *buf (or the empty string if *buf is NULL), potentially reallocating the * string in the process. This function only returns on succcess. */ void nv_append_sprintf(char **buf, const char *fmt, ...) { char *prefix, *suffix; prefix = *buf; NV_VSNPRINTF(suffix, fmt); if (!prefix) { *buf = suffix; } else { *buf = nvstrcat(prefix, suffix, NULL); free(prefix); free(suffix); } } /* * nvfree() - frees memory allocated with nvalloc(), provided * a non-NULL pointer is provided. */ void nvfree(void *s) { if (s) free(s); } /* nvfree() */ /****************************************************************************/ /* misc */ /****************************************************************************/ /* * tilde_expansion() - do tilde expansion on the given path name; * based loosely on code snippets found in the comp.unix.programmer * FAQ. The tilde expansion rule is: if a tilde ('~') is alone or * followed by a '/', then substitute the current user's home * directory; if followed by the name of a user, then substitute that * user's home directory. * * Returns NULL if its argument is NULL; otherwise, returns a malloced * and tilde-expanded string. */ char *tilde_expansion(const char *str) { char *prefix = NULL; const char *replace; char *user, *ret; struct passwd *pw; int len; if (!str) return NULL; if (str[0] != '~') return strdup(str); if ((str[1] == '/') || (str[1] == '\0')) { /* expand to the current user's home directory */ prefix = getenv("HOME"); if (!prefix) { /* $HOME isn't set; get the home directory from /etc/passwd */ pw = getpwuid(getuid()); if (pw) prefix = pw->pw_dir; } replace = str + 1; } else { /* expand to the specified user's home directory */ replace = strchr(str, '/'); if (!replace) replace = str + strlen(str); len = replace - str; user = malloc(len + 1); strncpy(user, str+1, len-1); user[len] = '\0'; pw = getpwnam(user); if (pw) prefix = pw->pw_dir; free (user); } if (!prefix) return strdup(str); ret = malloc(strlen(prefix) + strlen(replace) + 1); strcpy(ret, prefix); strcat(ret, replace); return ret; } /* tilde_expansion() */ /* * nv_prepend_to_string_list() - add a new string to a string list, delimited * by the given string delimiter. The original list is freed. */ char *nv_prepend_to_string_list(char *list, const char *item, const char *delim) { char *new_list = nvstrcat(item, list ? delim : NULL, list, NULL); nvfree(list); return new_list; } /****************************************************************************/ /* TextRows helper functions */ /****************************************************************************/ /* * nv_format_text_rows() - this function breaks the given string str * into some number of rows, where each row is not longer than the * specified width. * * If prefix is non-NULL, the first line is prepended with the prefix, * and subsequent lines are indented to line up with the prefix. * * If word_boundary is TRUE, then attempt to only break lines on * boundaries between words. */ TextRows *nv_format_text_rows(const char *prefix, const char *str, int width, int word_boundary) { int len, prefix_len, z, w, i; char *line, *buf, *local_prefix, *a, *b, *c; TextRows *t; /* initialize the TextRows structure */ t = (TextRows *) malloc(sizeof(TextRows)); if (!t) return NULL; t->t = NULL; t->n = 0; t->m = 0; if (!str) return t; buf = strdup(str); if (!buf) return t; z = strlen(buf); /* length of entire string */ a = buf; /* pointer to the start of the string */ /* initialize the prefix fields */ if (prefix) { prefix_len = strlen(prefix); local_prefix = strdup(prefix); } else { prefix_len = 0; local_prefix = NULL; } /* adjust the max width for any prefix */ w = width - prefix_len; do { /* * if the string will fit on one line, point b to the end of the * string */ if (z < w) b = a + z; /* * if the string won't fit on one line, move b to where the * end of the line should be, and then move b back until we * find a space; if we don't find a space before we back b all * the way up to a, just assign b to where the line should end. */ else { b = a + w; if (word_boundary) { while ((b >= a) && (!isspace(*b))) b--; if (b <= a) b = a + w; } } /* look for any newline between a and b, and move b to it */ for (c = a; c < b; c++) if (*c == '\n') { b = c; break; } /* * copy the string that starts at a and ends at b, prepending * with a prefix, if present */ len = b-a; len += prefix_len; line = (char *) malloc(len+1); if (local_prefix) strncpy(line, local_prefix, prefix_len); strncpy(line + prefix_len, a, len - prefix_len); line[len] = '\0'; /* append the new line to the array of text rows */ t->t = (char **) realloc(t->t, sizeof(char *) * (t->n + 1)); t->t[t->n] = line; t->n++; if (t->m < len) t->m = len; /* * adjust the length of the string and move the pointer to the * beginning of the new line */ z -= (b - a + 1); a = b + 1; /* move to the first non whitespace character (excluding newlines) */ if (word_boundary && isspace(*b)) { while ((z) && (isspace(*a)) && (*a != '\n')) a++, z--; } else { if (!isspace(*b)) z++, a--; } if (local_prefix) { for (i = 0; i < prefix_len; i++) local_prefix[i] = ' '; } } while (z > 0); if (local_prefix) free(local_prefix); free(buf); return t; } /* * nv_text_rows_append() - append the given msg to the existing TextRows */ void nv_text_rows_append(TextRows *t, const char *msg) { int len; t->t = realloc(t->t, sizeof(char *) * (t->n + 1)); if (msg) { t->t[t->n] = strdup(msg); len = strlen(msg); if (t->m < len) t->m = len; } else { t->t[t->n] = NULL; } t->n++; } /* * nv_concat_text_rows() - concatenate two text rows, storing the * result in t0 */ void nv_concat_text_rows(TextRows *t0, TextRows *t1) { int n, i; n = t0->n + t1->n; t0->t = realloc(t0->t, sizeof(char *) * n); for (i = 0; i < t1->n; i++) { t0->t[i + t0->n] = strdup(t1->t[i]); } t0->m = NV_MAX(t0->m, t1->m); t0->n = n; } /* nv_concat_text_rows() */ /* * nv_free_text_rows() - free the TextRows data structure allocated by * nv_format_text_rows() */ void nv_free_text_rows(TextRows *t) { int i; if (!t) return; for (i = 0; i < t->n; i++) free(t->t[i]); if (t->t) free(t->t); free(t); } /* nv_free_text_rows() */ /****************************************************************************/ /* printing helper functions */ /****************************************************************************/ #define DEFAULT_WIDTH 75 static unsigned short __terminal_width = 0; /* * reset_current_terminal_width() - if new_val is zero, then use the * TIOCGWINSZ ioctl to get the current width of the terminal, and * assign it the value to __terminal_width. If the ioctl fails, use a * hardcoded constant. If new_val is non-zero, then use new_val. */ void reset_current_terminal_width(unsigned short new_val) { struct winsize ws; if (new_val) { __terminal_width = new_val; return; } if (ioctl(STDERR_FILENO, TIOCGWINSZ, &ws) == -1 || ws.ws_col == 0) { __terminal_width = DEFAULT_WIDTH; } else { __terminal_width = ws.ws_col - 1; } } /* * Call silence_fmt(1) to turn fmtout(), fmtoutp() and format() into noops. */ static int __silent = 0; void silence_fmt(int val) { __silent = val; } static void vformat(FILE *stream, const int wb, const char *prefix, const char *buf) { int i; TextRows *t; if (!__terminal_width) reset_current_terminal_width(0); t = nv_format_text_rows(prefix, buf, __terminal_width, wb); for (i = 0; i < t->n; i++) fprintf(stream, "%s\n", t->t[i]); nv_free_text_rows(t); } #define NV_VFORMAT(stream, wb, prefix, fmt) \ do { \ char *buf; \ NV_VSNPRINTF(buf, fmt); \ vformat(stream, wb, prefix, buf); \ free (buf); \ } while(0) void fmtout(const char *fmt, ...) { if (__silent > 0) { return; } NV_VFORMAT(stdout, TRUE, NULL, fmt); } void fmtoutp(const char *prefix, const char *fmt, ...) { if (__silent > 0) { return; } NV_VFORMAT(stdout, TRUE, prefix, fmt); } void fmterr(const char *fmt, ...) { vformat(stderr, 0, NULL, ""); NV_VFORMAT(stderr, TRUE, "ERROR: ", fmt); vformat(stderr, 0, NULL, ""); } void fmtwarn(const char *fmt, ...) { vformat(stderr, 0, NULL, ""); NV_VFORMAT(stderr, TRUE, "WARNING: ", fmt); vformat(stderr, 0, NULL, ""); } void fmt(FILE *stream, const char *prefix, const char *fmt, ...) { if (__silent > 0) { return; } NV_VFORMAT(stream, TRUE, prefix, fmt); } /* * Read from the given FILE stream until a newline, EOF, or nul * terminator is encountered, writing data into a growable buffer. * The eof parameter is set to TRUE when EOF is encountered. In all * cases, the returned string is null-terminated. * * XXX this function will be rather slow because it uses fgetc() to * pull each character off the stream one at a time; this is done so * that each character can be examined as it's read so that we can * appropriately deal with EOFs and newlines. A better implementation * would use fgets(), but that would still require us to parse each * read line, checking for newlines or guessing if we hit an EOF. */ char *fget_next_line(FILE *fp, int *eof) { char *buf = NULL, *tmpbuf; char *c = NULL; int len = 0, buflen = 0; int ret; const int __fget_next_line_len = 32; if (eof) { *eof = FALSE; } while (1) { if (buflen == len) { /* buffer isn't big enough -- grow it */ buflen += __fget_next_line_len; tmpbuf = nvalloc(buflen); if (buf) { memcpy(tmpbuf, buf, len); nvfree(buf); } buf = tmpbuf; c = buf + len; } ret = fgetc(fp); if ((ret == EOF) && (eof)) { *eof = TRUE; } if ((ret == EOF) || (ret == '\n') || (ret == '\0')) { *c = '\0'; return buf; } *c = (char) ret; len++; c++; } /* while (1) */ return NULL; /* should never get here */ } char *nvstrchrnul(char *s, int c) { char *result = strchr(s, c); if (!result) { return (s + strlen(s)); } return result; } /****************************************************************************/ /* file helper functions */ /****************************************************************************/ /* * nv_open() - open(2) wrapper; prints an error message if open(2) * fails and calls exit(). This function only returns on success. */ int nv_open(const char *pathname, int flags, mode_t mode) { int fd; fd = open(pathname, flags, mode); if (fd == -1) { fprintf(stderr, "Failure opening %s (%s).\n", pathname, strerror(errno)); exit(1); } return fd; } /* nv_name() */ /* * nv_get_file_length() - stat(2) wrapper; prints an error message if * the system call fails and calls exit(). This function only returns * on success. */ int nv_get_file_length(const char *filename) { struct stat stat_buf; int ret; ret = stat(filename, &stat_buf); if (ret == -1) { fprintf(stderr, "Unable to determine '%s' file length (%s).\n", filename, strerror(errno)); exit(1); } return stat_buf.st_size; } /* nv_get_file_length() */ /* * nv_set_file_length() - wrapper for lseek() and write(); prints an * error message if the system calls fail and calls exit(). This * function only returns on success. */ void nv_set_file_length(const char *filename, int fd, int len) { if ((lseek(fd, len - 1, SEEK_SET) == -1) || (write(fd, "", 1) == -1)) { fprintf(stderr, "Unable to set file '%s' length %d (%s).\n", filename, fd, strerror(errno)); exit(1); } } /* nv_set_file_length() */ /* * nv_mmap() - mmap(2) wrapper; prints an error message if mmap(2) * fails and calls exit(). This function only returns on success. */ void *nv_mmap(const char *filename, size_t len, int prot, int flags, int fd) { void *ret; ret = mmap(0, len, prot, flags, fd, 0); if (ret == (void *) -1) { fprintf(stderr, "Unable to mmap file %s (%s).\n", filename, strerror(errno)); exit(1); } return ret; } /* nv_mmap() */ /* * nv_basename() - alternative to basename(3) which avoids differences in * behavior from different implementations: this implementation never modifies * the original string, and the return value can always be passed to free(3). */ char *nv_basename(const char *path) { char *last_slash = strrchr(path, '/'); if (last_slash) { return strdup(last_slash+1); } else { return strdup(path); } } /****************************************************************************/ /* string helper functions */ /****************************************************************************/ /* * nv_trim_space() - remove any leading and trailing whitespace from a string * and return a pointer to the modified string. The original string may be * modified; the returned value should *NOT* be deallocated with free(), since * it may point somewhere other than the beginning of the original string. If * the original string was a malloc()ed buffer, that string should be stored * separately from the returned value of nv_strip_space, and freed. */ char *nv_trim_space(char *string) { char *ret, *end; for (ret = string; *ret && isspace(*ret); ret++); for (end = ret + strlen(ret) - 1; end >= ret && isspace(*end); end--) { *end = '\0'; } return ret; } /* * trim_char() - helper function to remove a character from the initial and * final positions of a string, and optionally report how many replacements * were made. The returned value should not be free()d (see nv_trim_space()). */ static char *trim_char(char *string, char trim, int *count) { int len, replaced = 0; if (count) { *count = 0; } if (string == NULL || trim == '\0') { return string; } if (string[0] == trim) { string++; replaced++; } len = strlen(string); if (string[len - 1] == trim) { string[len - 1] = '\0'; replaced++; } if (count) { *count = replaced; } return string; } /* * nv_trim_char() - remove a character from the initial and final positions of * a string. The returned value should not be free()d (see nv_trim_space()). */ char *nv_trim_char(char *string, char trim) { return trim_char(string, trim, NULL); } /* * nv_trim_char_strict() - remove a character from the initial and final * positions of a string. If no replacements were made, or if replacements were * made at both positions, return the modified string. Otherwise, return NULL. * The returned value should not be free()d (see nv_trim_space()). */ char *nv_trim_char_strict(char *string, char trim) { int count; char *trimmed; trimmed = trim_char(string, trim, &count); if (count == 0 || count == 2) { return trimmed; } return NULL; } nvidia-settings/src/common-utils/gen-manpage-opts-helper.h0000664000175000017500000000156012236467170024051 0ustar albertoalberto/* * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #if !defined(__GEN_MANPAGE_OPTS_HELPER_H__) #define __GEN_MANPAGE_OPTS_HELPER_H__ #include "nvgetopt.h" void gen_manpage_opts_helper(const NVGetoptOption *options); #endif /* __GEN_MANPAGE_OPTS_HELPER_H__ */ nvidia-settings/src/Makefile0000664000175000017500000001473012236467170016276 0ustar albertoalberto# # nvidia-settings: A tool for configuring the NVIDIA X driver on Unix # and Linux systems. # # Copyright (C) 2008-2012 NVIDIA Corporation. # # This program is free software; you can redistribute it and/or modify it # under the terms and conditions of the GNU General Public License, # version 2, as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # ############################################################################## # include common variables and functions ############################################################################## UTILS_MK_DIR ?= .. include $(UTILS_MK_DIR)/utils.mk ############################################################################## # The calling Makefile may export any of the following variables; we # assign default values if they are not exported by the caller ############################################################################## ifndef X_LDFLAGS ifeq ($(TARGET_OS)-$(TARGET_ARCH),Linux-x86_64) X_LDFLAGS = -L/usr/X11R6/lib64 else X_LDFLAGS = -L/usr/X11R6/lib endif endif X_CFLAGS ?= PKG_CONFIG ?= pkg-config ifndef GTK_CFLAGS GTK_CFLAGS := $(shell $(PKG_CONFIG) --cflags gtk+-2.0) endif ifndef GTK_LDFLAGS GTK_LDFLAGS := $(shell $(PKG_CONFIG) --libs gtk+-2.0) endif ifndef VDPAU_CFLAGS VDPAU_CFLAGS := $(shell $(PKG_CONFIG) --cflags vdpau 2> /dev/null) ifeq ($(VDPAU_CFLAGS),) VDPAU_CFLAGS = -I /usr/include endif endif ifndef JANSSON_CFLAGS JANSSON_CFLAGS = -Wno-cast-qual ifeq ($(TARGET_ARCH),armv7l) JANSSON_CFLAGS += -Wno-unused-but-set-variable endif endif ############################################################################## # The XF86Config-parser, libXNVCtrl, and common-utils directories may # be in one of two places: either elsewhere in the driver source tree # when building nvidia-settings as part of the NVIDIA driver build (in # which case, XNVCTRL_DIR, XNVCTRL_ARCHIVE, XCONFIG_PARSER_DIR, # COMMON_UTILS_DIR and COMMON_UNIX_DIR should be defined by the calling # makefile), or directly in the source directory when building from the # nvidia-settings source tarball (in which case, the below conditional # assignments should be used) ############################################################################## XNVCTRL_DIR ?= libXNVCtrl XNVCTRL_ARCHIVE ?= $(XNVCTRL_DIR)/libXNVCtrl.a XCONFIG_PARSER_DIR ?= XF86Config-parser COMMON_UTILS_DIR ?= common-utils COMMON_UNIX_DIR ?= common-unix VIRTUAL_RESOLUTIONS_DIR ?= $(COMMON_UNIX_DIR)/virtual-resolutions ############################################################################## # assign variables ############################################################################## NVIDIA_SETTINGS = $(OUTPUTDIR)/nvidia-settings NVIDIA_SETTINGS_PROGRAM_NAME = "nvidia-settings" NVIDIA_SETTINGS_VERSION := $(NVIDIA_VERSION) CFLAGS += $(X_CFLAGS) ifeq ($(TARGET_OS),SunOS) LDFLAGS += -Wl,-rpath=/usr/X11R6/lib LIBS += -lscf endif LDFLAGS += $(X_LDFLAGS) # Some older Linux distributions do not have the dynamic library # libXxf86vm.so, though some newer Linux distributions do not have the # static library libXxf86vm.a. Statically link against libXxf86vm # when building nvidia-settings within the NVIDIA driver build, but # dynamically link against libXxf86vm in the public builds. ifdef NV_LINK_LIBXXF86VM_STATICALLY LIBS += -Wl,-Bstatic -lXxf86vm -Wl,-Bdynamic else LIBS += -lXxf86vm endif # Preferably, we would use pkg-config's "--libs-only-l" and # "--libs-only-L" options to get separate GTK_LDFLAGS and GTK_LIBS, # appending them to LDFLAGS and LIBS, respectively. However, the # pkg-config(1) man page cautions: # # [...] Note that the union of "--libs-only-l" and # "--libs-only-L" may be smaller than "--libs", due to flags such # as -rdynamic. # # So append all of GTK_LDFLAGS to LIBS, so that LIBS can go after # $(OBJECTS) on the link commandline, causing libraries for linking to # be named after the objects that depend on those libraries (needed # for "--as-needed" linker behavior). LIBS += -lX11 -lXext -lm $(LIBDL_LIBS) $(GTK_LDFLAGS) # Include all the source lists; dist-files.mk will define NVIDIA_SETTINGS_SRC include src.mk SRC += $(NVIDIA_SETTINGS_SRC) include $(XCONFIG_PARSER_DIR)/src.mk SRC += $(addprefix $(XCONFIG_PARSER_DIR)/,$(XCONFIG_PARSER_SRC)) include $(COMMON_UTILS_DIR)/src.mk SRC += $(addprefix $(COMMON_UTILS_DIR)/,$(COMMON_UTILS_SRC)) include $(VIRTUAL_RESOLUTIONS_DIR)/src.mk SRC += $(addprefix $(VIRTUAL_RESOLUTIONS_DIR)/,$(VIRTUAL_RESOLUTIONS_SRC)) SRC += $(STAMP_C) OBJS = $(call BUILD_OBJECT_LIST,$(SRC)) CFLAGS += -I . CFLAGS += -I image_data CFLAGS += -I $(XNVCTRL_DIR) CFLAGS += -I $(XCONFIG_PARSER_DIR)/.. CFLAGS += -I libXNVCtrlAttributes CFLAGS += -I xpm_data CFLAGS += -I gtk+-2.x CFLAGS += -I jansson CFLAGS += -I $(COMMON_UTILS_DIR) CFLAGS += -I $(VIRTUAL_RESOLUTIONS_DIR) CFLAGS += -I $(OUTPUTDIR) CFLAGS += $(VDPAU_CFLAGS) CFLAGS += -DPROGRAM_NAME=\"nvidia-settings\" $(call BUILD_OBJECT_LIST,$(GTK_SRC)): CFLAGS += $(GTK_CFLAGS) $(call BUILD_OBJECT_LIST,$(JANSSON_SRC)): CFLAGS += $(JANSSON_CFLAGS) ############################################################################## # build rules ############################################################################## .PNONY: all install NVIDIA_SETTINGS_install clean clobber all: $(NVIDIA_SETTINGS) install: NVIDIA_SETTINGS_install NVIDIA_SETTINGS_install: $(NVIDIA_SETTINGS) $(MKDIR) $(BINDIR) $(INSTALL) $(INSTALL_BIN_ARGS) $< $(BINDIR)/$(notdir $<) $(NVIDIA_SETTINGS): $(OBJS) $(XNVCTRL_ARCHIVE) $(call quiet_cmd,LINK) $(CFLAGS) $(LDFLAGS) $(BIN_LDFLAGS) -o $@ $(OBJS) \ $(XNVCTRL_ARCHIVE) $(LIBS) $(call quiet_cmd,STRIP_CMD) $@ # define the rule to build each object file $(foreach src,$(SRC),$(eval $(call DEFINE_OBJECT_RULE,TARGET,$(src)))) # define the rule to generate $(STAMP_C) $(eval $(call DEFINE_STAMP_C_RULE, $(OBJS),$(NVIDIA_SETTINGS_PROGRAM_NAME))) clean clobber: rm -rf $(NVIDIA_SETTINGS) *~ $(STAMP_C) \ $(OUTPUTDIR)/*.o $(OUTPUTDIR)/*.d nvidia-settings/src/query-assign.c0000664000175000017500000032521512236467170017434 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * query-assign.c - this source file contains functions for querying * and assigning attributes, as specified on the command line. Some * of this functionality is also shared with the config file * reader/writer. */ #include #include #include #include #include #include "NVCtrlLib.h" #include "parse.h" #include "msg.h" #include "query-assign.h" #include "common-utils.h" extern int __verbosity; extern int __terse; extern int __display_device_string; extern int __list_targets; /* local prototypes */ #define PRODUCT_NAME_LEN 64 static int process_attribute_queries(int, char**, const char *, CtrlHandlesArray *); static int process_attribute_assignments(int, char**, const char *, CtrlHandlesArray *); static int query_all(const char *, CtrlHandlesArray *); static int query_all_targets(const char *display_name, const int target_index, CtrlHandlesArray *); static void print_valid_values(const char *, int, uint32, NVCTRLAttributeValidValuesRec); static void print_additional_info(const char *name, int attr, NVCTRLAttributeValidValuesRec valid, const char *indent); static int validate_value(CtrlHandleTarget *t, ParsedAttribute *a, uint32 d, int target_type, char *whence); static CtrlHandles *nv_alloc_ctrl_handles(const char *display); static void nv_free_ctrl_handles(CtrlHandles *h); /* * nv_process_assignments_and_queries() - process any assignments or * queries specified on the commandline. If an error occurs, return * NV_FALSE. On success return NV_TRUE. */ int nv_process_assignments_and_queries(const Options *op, CtrlHandlesArray *handles_array) { int ret; if (op->num_queries) { ret = process_attribute_queries(op->num_queries, op->queries, op->ctrl_display, handles_array); if (!ret) return NV_FALSE; } if (op->num_assignments) { ret = process_attribute_assignments(op->num_assignments, op->assignments, op->ctrl_display, handles_array); if (!ret) return NV_FALSE; } return NV_TRUE; } /* nv_process_assignments_and_queries() */ /*! * Queries the NV-CONTROL string attribute and returns the string as a simple * char *. This is useful to avoid having to track how strings are allocated * so we can cleanup all strings via nvfree(). * * \param[in] t The CtrlHandleTarget to query the string on. * \param[in] attr The NV-CONTROL string to query. * * \return Return a nvalloc()'ed copy of the NV-CONTROL string; else, returns * NULL. */ static char *query_x_name(const CtrlHandleTarget *t, int attr) { ReturnStatus status; char *x_str; char *str = NULL; status = NvCtrlGetStringAttribute(t->h, attr, &x_str); if (status == NvCtrlSuccess) { str = nvstrdup(x_str); XFree(x_str); } return str; } /*! * Retrieves and adds all the display device names for the given target. * * \param[in/out] t The CtrlHandleTarget to load names for. */ static void load_display_target_proto_names(CtrlHandleTarget *t) { t->protoNames[NV_DPY_PROTO_NAME_TYPE_BASENAME] = query_x_name(t, NV_CTRL_STRING_DISPLAY_NAME_TYPE_BASENAME); t->protoNames[NV_DPY_PROTO_NAME_TYPE_ID] = query_x_name(t, NV_CTRL_STRING_DISPLAY_NAME_TYPE_ID); t->protoNames[NV_DPY_PROTO_NAME_DP_GUID] = query_x_name(t, NV_CTRL_STRING_DISPLAY_NAME_DP_GUID); t->protoNames[NV_DPY_PROTO_NAME_EDID_HASH] = query_x_name(t, NV_CTRL_STRING_DISPLAY_NAME_EDID_HASH); t->protoNames[NV_DPY_PROTO_NAME_TARGET_INDEX] = query_x_name(t, NV_CTRL_STRING_DISPLAY_NAME_TARGET_INDEX); t->protoNames[NV_DPY_PROTO_NAME_RANDR] = query_x_name(t, NV_CTRL_STRING_DISPLAY_NAME_RANDR); } /*! * Adds the default name for the given target to the list of protocol names at * the given proto name index. * * \param[in/out] t The CtrlHandleTarget to load names for. * \param[in] proto_idx The name index where to add the name. */ static void load_default_target_proto_name(CtrlHandleTarget *t, const int proto_idx) { const int target_type = NvCtrlGetTargetType(t->h); const int target_id = NvCtrlGetTargetId(t->h); const TargetTypeEntry *targetTypeEntry = nv_get_target_type_entry_by_nvctrl(target_type); if (proto_idx >= NV_PROTO_NAME_MAX) { return; } if (targetTypeEntry) { t->protoNames[proto_idx] = nvasprintf("%s-%d", targetTypeEntry->parsed_name, target_id); nvstrtoupper(t->protoNames[proto_idx]); } } /*! * Adds the GPU names to the given target to the list of protocol names. * * \param[in/out] t The CtrlHandleTarget to load names for. */ static void load_gpu_target_proto_names(CtrlHandleTarget *t) { load_default_target_proto_name(t, NV_GPU_PROTO_NAME_TYPE_ID); t->protoNames[NV_GPU_PROTO_NAME_UUID] = query_x_name(t, NV_CTRL_STRING_GPU_UUID); } /*! * Adds the all the appropriate names for the given target to the list of * protocol names. * * \param[in/out] t The CtrlHandleTarget to load names for. */ static void load_target_proto_names(CtrlHandleTarget *t) { const int target_type = NvCtrlGetTargetType(t->h); switch (target_type) { case NV_CTRL_TARGET_TYPE_DISPLAY: load_display_target_proto_names(t); break; case NV_CTRL_TARGET_TYPE_GPU: load_gpu_target_proto_names(t); break; default: load_default_target_proto_name(t, 0); break; } } /*! * Returns the CtrlHandleTarget from CtrlHandles with the given target type/ * target id. * * \param[in] handles Container for all the CtrlHandleTargets to search. * \param[in] target_type The target type of the CtrlHandleTarget to search. * \param[in] target_id The target id of the CtrlHandleTarget to search. * * \return Returns the matching CtrlHandleTarget from CtrlHandles on success; * else, returns NULL. */ static CtrlHandleTarget *nv_get_target(const CtrlHandles *handles, int target_type, int target_id) { const CtrlHandleTargets *targets; int i; if (!handles || target_type < 0 || target_type >= MAX_TARGET_TYPES) { return NULL; } targets = handles->targets + target_type; for (i = 0; i < targets->n; i++) { CtrlHandleTarget *target = targets->t + i; if (NvCtrlGetTargetId(target->h) == target_id) { return target; } } return NULL; } /*! * Returns the RandR name of the matching display target from the given * target ID and the list of target handles. * * \param[in] handles Container for all the CtrlHandleTargets to search. * \param[in] target_id The target id of the display CtrlHandleTarget to * search. * * \return Returns the NV_DPY_PROTO_NAME_RANDR name string from the matching * (display) CtrlHandleTarget from CtrlHandles on success; else, * returns NULL. * */ const char *nv_get_display_target_config_name(const CtrlHandles *handles, int target_id) { CtrlHandleTarget *t = nv_get_target(handles, NV_CTRL_TARGET_TYPE_DISPLAY, target_id); if (!t) { return NULL; } return t->protoNames[NV_DPY_PROTO_NAME_RANDR]; } /*! * Returns the NvCtrlAttributeHandle from CtrlHandles with the given target * type/target id. * * \param[in] handles Container for all the CtrlHandleTargets to search. * \param[in] target_type The target type of the CtrlHandleTarget to search. * \param[in] target_id The target id of the CtrlHandleTarget to search. * * \return Returns the NvCtrlAttributeHandle from the matching * CtrlHandleTarget from CtrlHandles on success; else, returns NULL. */ NvCtrlAttributeHandle *nv_get_target_handle(const CtrlHandles *handles, int target_type, int target_id) { CtrlHandleTarget *target; target = nv_get_target(handles, target_type, target_id); if (target) { return target->h; } return NULL; } /*! * Returns the first node (sentry) for tracking CtrlHandleTarget lists. * * \return Returns the sentry node to be used for tracking CtrlHandleTarget * list. */ static CtrlHandleTargetNode *nv_target_list_init(void) { return nvalloc(sizeof(CtrlHandleTargetNode)); } /*! * Appends the given CtrlHandleTarget 'target' to the end of the * CtrlHandleTarget list 'head' if 'target' is not already in the list. * * \param[in/out] head The first node in the CtrlHandleTarget list, to which * target should be inserted. * \param[in] target The CtrlHandleTarget to add to the list. */ static void nv_target_list_add(CtrlHandleTargetNode *head, CtrlHandleTarget *target) { CtrlHandleTargetNode *t; for (t = head; t->next; t = t->next) { if (t->t == target) { /* Already in list, ignore */ return; } } t->next = nv_target_list_init(); t->t = target; } /*! * Frees the memory used for tracking a list of CtrlHandleTargets. * * \param[in\out] head The first node in the CtrlHandleTarget list that is to * be freed. */ void nv_target_list_free(CtrlHandleTargetNode *head) { CtrlHandleTargetNode *n; while (head) { n = head->next; free(head); head = n; } } /*! * Adds all the targets (of target type 'targetType') that are both present * in the CtrlHandle, and known to be associated to 't' by querying the list * of associated targets to 't' from NV-CONTROL via binary attribute 'attr', * and possibly reciprocally adding the reverse relationship. * * \param[in\out] h The list of all managed targets from * which associations are to be made to/ * from. * \param[in\out] t The target to which association(s) are * being made. * \param[in] targetType The target type of the associated * targets being considered (queried.) * \param[in] attr The NV-CONTROL binary attribute that * should be queried to retrieve the list * of 'targetType' targets that are * associated to the (CtrlHandleTarget) * target 't'. * \param[in] implicit_reciprocal Whether or not to reciprocally add the * reverse relationship to the matching * targets. */ static void add_target_relationships(const CtrlHandles *h, CtrlHandleTarget *t, int targetType, int attr, int implicit_reciprocal) { ReturnStatus status; int *pData; int len; int i; status = NvCtrlGetBinaryAttribute(t->h, 0, attr, (unsigned char **)(&pData), &len); if ((status != NvCtrlSuccess) || !pData) { nv_error_msg("Error querying target relations"); return; } for (i = 0; i < pData[0]; i++) { int targetId = pData[i+1]; CtrlHandleTarget *r; r = nv_get_target(h, targetType, targetId); if (r) { nv_target_list_add(t->relations, r); if (implicit_reciprocal == NV_TRUE) { nv_target_list_add(r->relations, t); } } } XFree(pData); } /*! * Adds all associations to/from an X screen target. * * \param[in\out] h The list of all managed targets from which associations * are to be made to/from. * \param[in\out] t The X screen target to which association(s) are being * made. */ static void load_screen_target_relationships(CtrlHandles *h, CtrlHandleTarget *t) { add_target_relationships(h, t, NV_CTRL_TARGET_TYPE_GPU, NV_CTRL_BINARY_DATA_GPUS_USED_BY_LOGICAL_XSCREEN, NV_TRUE); add_target_relationships(h, t, NV_CTRL_TARGET_TYPE_DISPLAY, NV_CTRL_BINARY_DATA_DISPLAYS_ASSIGNED_TO_XSCREEN, NV_TRUE); } /*! * Adds all associations to/from a GPU target. * * \param[in\out] h The list of all managed targets from which associations * are to be made to/from. * \param[in\out] t The GPU target to which association(s) are being made. */ static void load_gpu_target_relationships(CtrlHandles *h, CtrlHandleTarget *t) { add_target_relationships(h, t, NV_CTRL_TARGET_TYPE_FRAMELOCK, NV_CTRL_BINARY_DATA_FRAMELOCKS_USED_BY_GPU, NV_FALSE); add_target_relationships(h, t, NV_CTRL_TARGET_TYPE_VCSC, NV_CTRL_BINARY_DATA_VCSCS_USED_BY_GPU, NV_FALSE); add_target_relationships(h, t, NV_CTRL_TARGET_TYPE_COOLER, NV_CTRL_BINARY_DATA_COOLERS_USED_BY_GPU, NV_TRUE); add_target_relationships(h, t, NV_CTRL_TARGET_TYPE_THERMAL_SENSOR, NV_CTRL_BINARY_DATA_THERMAL_SENSORS_USED_BY_GPU, NV_TRUE); add_target_relationships(h, t, NV_CTRL_TARGET_TYPE_DISPLAY, NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU, NV_TRUE); } /*! * Adds all associations to/from a FrameLock target. * * \param[in\out] h The list of all managed targets from which associations * are to be made to/from. * \param[in\out] t The FrameLock target to which association(s) are being * made. */ static void load_framelock_target_relationships(CtrlHandles *h, CtrlHandleTarget *t) { add_target_relationships(h, t, NV_CTRL_TARGET_TYPE_GPU, NV_CTRL_BINARY_DATA_GPUS_USING_FRAMELOCK, NV_FALSE); } /*! * Adds all associations to/from a VCS target. * * \param[in\out] h The list of all managed targets from which associations * are to be made to/from. * \param[in\out] t The VCS target to which association(s) are being made. */ static void load_vcs_target_relationships(CtrlHandles *h, CtrlHandleTarget *t) { add_target_relationships(h, t, NV_CTRL_TARGET_TYPE_GPU, NV_CTRL_BINARY_DATA_GPUS_USING_VCSC, NV_FALSE); } /*! * Adds all associations to/from a target. * * \param[in\out] h The list of all managed targets from which associations * are to be made to/from. * \param[in\out] t The target to which association(s) are being made. */ static void load_target_relationships(CtrlHandles *h, CtrlHandleTarget *t) { int target_type = NvCtrlGetTargetType(t->h); switch (target_type) { case NV_CTRL_TARGET_TYPE_X_SCREEN: load_screen_target_relationships(h, t); break; case NV_CTRL_TARGET_TYPE_GPU: load_gpu_target_relationships(h, t); break; case NV_CTRL_TARGET_TYPE_FRAMELOCK: load_framelock_target_relationships(h, t); break; case NV_CTRL_TARGET_TYPE_VCSC: load_vcs_target_relationships(h, t); break; default: break; } } /*! * Determines if the target 't' has the name 'name'. * * \param[in] t The target being considered. * \param[in] name The name to match against. * * \return Returns NV_TRUE if the given target 't' has the name 'name'; else * returns NV_FALSE. */ static int nv_target_has_name(const CtrlHandleTarget *t, const char *name) { int n; for (n = 0; n < NV_PROTO_NAME_MAX; n++) { if (t->protoNames[n] && nv_strcasecmp(t->protoNames[n], name)) { return NV_TRUE; } } return NV_FALSE; } /*! * Determines if the target 't' matches a given target type, target id, and/or * target name. * * \param[in] t The target being considered. * \param[in] name The name to match against. * * \return Returns NV_TRUE if the given target 't' has the name 'name'; else * returns NV_FALSE. */ static int target_has_qualification(const CtrlHandleTarget *t, int matchTargetType, int matchTargetId, const char *matchTargetName) { const CtrlHandleTargetNode *n; /* If no qualifications given, all targets match */ if ((matchTargetType < 0) && (matchTargetId < 0) && (!matchTargetName)) { return NV_TRUE; } /* Look for any matching relationship */ for (n = t->relations; n->next; n = n->next) { const CtrlHandleTarget *r = n->t; if (matchTargetType >= 0 && (matchTargetType != NvCtrlGetTargetType(r->h))) { continue; } if ((matchTargetId >= 0) && matchTargetId != NvCtrlGetTargetId(r->h)) { continue; } if (matchTargetName && !nv_target_has_name(r, matchTargetName)) { continue; } return NV_TRUE; } return NV_FALSE; } /*! * Resolves the two given strings sAAA and sBBB into a target type, target id, * and/or target name. The following target specifications are supported: * * "AAA" (BBB = NULL) * - All targets of type AAA, if AAA names a target type, or * - All targets named AAA if AAA does not name a target type. * * "BBB:AAA" * - All targets of type BBB with either target id AAA if AAA is a numerical * value, or target(s) named AAA otherwise. * * \param[in] sAAA If sBBB is NULL, this is either the target name, * or a target type. * \param[in] sBBB If not NULL, this is the target type as a string. * \param[out] targetType Assigned the target type, or -1 for all target types. * \param[out] targetId Assigned the target id, or -1 for all targets. * \param[out] targetName Assigned the target name, or NULL for all target * names. * * \return Returns NV_PARSER_STATUS_SUCCESS if sAAA and sBBB were successfully * parsed into at target specification; else, returns * NV_PARSER_STATUS_TARGET_SPEC_BAD_TARGET if a parsing failure * occurred. */ static int parse_single_target_specification(const char *sAAA, const char *sBBB, int *targetType, int *targetId, const char **targetName) { const TargetTypeEntry *targetTypeEntry; *targetType = -1; // Match all target types *targetId = -1; // Match all target ids *targetName = NULL; // Match all target names if (sBBB) { /* If BBB is specified, then it must name a target type */ targetTypeEntry = nv_get_target_type_entry_by_name(sBBB); if (!targetTypeEntry) { return NV_PARSER_STATUS_TARGET_SPEC_BAD_TARGET; } *targetType = targetTypeEntry->nvctrl; /* AAA can either be a name, or a target id */ if (!nv_parse_numerical(sAAA, NULL, targetId)) { *targetName = sAAA; } } else { /* If BBB is unspecified, then AAA could possibly name a target type */ targetTypeEntry = nv_get_target_type_entry_by_name(sAAA); if (targetTypeEntry) { *targetType = targetTypeEntry->nvctrl; } else { /* If not, then AAA is a target name */ *targetName = sAAA; } } return NV_PARSER_STATUS_SUCCESS; } /*! * Computes the list of targets from the list of CtrlHandles 'h' that match the * ParsedAttribute's target specification string. * * The following target specifications string formats are supported: * * "AAA" * - All targets of type AAA, if AAA names a target type, or * - All targets named AAA if AAA does not name a target type. * * "BBB:AAA" * - All targets of type BBB with either target id AAA if AAA is a numerical * value, or target(s) named AAA otherwise. * * "CCC.AAA" * - All target types (and/or names) AAA that have a relation to any target * types (and/or names) CCC. * * "CCC.BBB:AAA" * - All the targets named (or target id) AAA of the target type BBB that are * related to target type (and or name) CCC. * * "DDD:CCC.AAA" * - All target types (and/or names) AAA that are related to targets named * (or target id) CCC of the target type DDD. * * "DDD:CCC.BBB:AAA" * - All the targets named (or target id) AAA of the target type BBB that are * related to targets named (or target id) CCC of the target type DDD. * * \param[in/ou] a The ParsedAttribute whose target specification string * should be analyzed and converted into a list of targets. * \param[in] h The list of targets to choose from. * * \return Returns NV_PARSER_STATUS_SUCCESS if the ParsedAttribute's target * specification string was successfully parsed into a list of targets * (though this list could be empty, if no targets are found to * match!); else, returns one of the other NV_PARSER_STATUS_XXX * error codes that detail the particular parsing error. */ static int nv_infer_targets_from_specification(ParsedAttribute *a, CtrlHandles *h) { int ret = NV_PARSER_STATUS_SUCCESS; /* specification as: "XXX.YYY" or "XXX" */ char *sXXX = NULL; // Target1 string char *sYYY = NULL; // Target2 string /* XXX as: "BBB:AAA" or "AAA" */ char *sAAA = NULL; // Target1 name char *sBBB = NULL; // Target1 type name /* YYY as: "DDD:CCC" or "CCC" */ char *sCCC = NULL; // Target2 name char *sDDD = NULL; // Target2type name char *s; char *tmp; int i, j; int matchTargetType; int matchTargetId; const char *matchTargetName; int matchQualifierTargetType; int matchQualifierTargetId; const char *matchQualifierTargetName; tmp = nvstrdup(a->target_specification); /* Parse for 'YYY.XXX' or 'XXX' */ s = strchr(tmp, '.'); if (s) { *s = '\0'; sXXX = s+1; sYYY = tmp; } else { sXXX = tmp; } /* Parse for 'BBB:AAA' or 'AAA' (in XXX above) */ s = strchr(sXXX, ':'); if (s) { *s = '\0'; sBBB = sXXX; sAAA = s+1; } else { /* AAA is either a target type name, or a target name */ sAAA = sXXX; } /* Parse for 'DDD:CCC' or 'CCC' (in YYY above) */ if (sYYY) { s = strchr(sYYY, ':'); if (s) { *s = '\0'; sDDD = sYYY; sCCC = s+1; } else { /* CCC is either a target type name, or a target name */ sCCC = sYYY; } } /* Get target matching criteria */ ret = parse_single_target_specification(sAAA, sBBB, &matchTargetType, &matchTargetId, &matchTargetName); if (ret != NV_PARSER_STATUS_SUCCESS) { goto done; } /* Get target qualifier matching criteria */ ret = parse_single_target_specification(sCCC, sDDD, &matchQualifierTargetType, &matchQualifierTargetId, &matchQualifierTargetName); if (ret != NV_PARSER_STATUS_SUCCESS) { goto done; } /* Iterate over the target types */ for (i = 0; i < targetTypeTableLen; i++) { const TargetTypeEntry *targetTypeEntry = &(targetTypeTable[i]); CtrlHandleTargets *hts; if (matchTargetType >= 0 && (matchTargetType != targetTypeEntry->nvctrl)) { continue; } /* For each target of this type, match the id and/or name */ hts = &(h->targets[targetTypeEntry->target_index]); for (j = 0; j < hts->n; j++) { CtrlHandleTarget *t = &(hts->t[j]); if ((matchTargetId >= 0) && matchTargetId != NvCtrlGetTargetId(t->h)) { continue; } if (matchTargetName && !nv_target_has_name(t, matchTargetName)) { continue; } if (!target_has_qualification(t, matchQualifierTargetType, matchQualifierTargetId, matchQualifierTargetName)) { continue; } /* Target matches, add it to the list */ nv_target_list_add(a->targets, t); a->flags |= NV_PARSER_HAS_TARGET; } } done: if (tmp) { free(tmp); } return ret; } /* * nv_init_target() - Given the Display pointer, create an attribute * handle and initialize the handle target. */ static void nv_init_target(Display *dpy, CtrlHandleTarget *t, int target, int targetId) { NvCtrlAttributeHandle *handle; ReturnStatus status; char *tmp; int len, d, c; /* allocate the handle */ handle = NvCtrlAttributeInit(dpy, targetTypeTable[target].nvctrl, targetId, NV_CTRL_ATTRIBUTES_ALL_SUBSYSTEMS); t->h = handle; /* * silently fail: this might happen if not all X screens * are NVIDIA X screens */ if (!handle) { return; } /* * get a name for this target; in the case of * X_SCREEN_TARGET targets, just use the string returned * from NvCtrlGetDisplayName(); for other target types, * append a target specification. */ tmp = NvCtrlGetDisplayName(t->h); if (target == X_SCREEN_TARGET) { t->name = tmp; } else { len = strlen(tmp) + strlen(targetTypeTable[target].parsed_name) + 16; t->name = nvalloc(len); if (t->name) { snprintf(t->name, len, "%s[%s:%d]", tmp, targetTypeTable[target].parsed_name, targetId); free(tmp); } else { t->name = tmp; } } load_target_proto_names(t); t->relations = nv_target_list_init(); /* * get the enabled display device mask; for X screens and * GPUs we query NV-CONTROL; for anything else * (framelock), we just assign this to 0. */ if (targetTypeTable[target].uses_display_devices) { status = NvCtrlGetAttribute(t->h, NV_CTRL_ENABLED_DISPLAYS, &d); if (status != NvCtrlSuccess) { nv_error_msg("Error querying enabled displays on " "%s %d (%s).", targetTypeTable[target].name, targetId, NvCtrlAttributesStrError(status)); d = 0; } status = NvCtrlGetAttribute(t->h, NV_CTRL_CONNECTED_DISPLAYS, &c); if (status != NvCtrlSuccess) { nv_error_msg("Error querying connected displays on " "%s %d (%s).", targetTypeTable[target].name, targetId, NvCtrlAttributesStrError(status)); c = 0; } } else { d = 0; c = 0; } t->d = d; t->c = c; } /* * nv_add_ctrl_handle_target() - add a CtrlHandleTarget to the array * of Targets for the given target_index. This is used for dynamically * created targets that don't exist when the CtrlHandles are initialized. */ NvCtrlAttributeHandle *nv_add_target(CtrlHandles *handles, Display *dpy, int target_index, int display_id) { CtrlHandleTargets *dt; CtrlHandleTarget *t; if (!handles) { return NULL; } dt = &handles->targets[target_index]; dt->t = nvrealloc(dt->t, (dt->n+1) * sizeof(CtrlHandleTarget)); t = &dt->t[dt->n]; dt->n++; nv_init_target(dpy, t, target_index, display_id); return t->h; } /* * nv_alloc_ctrl_handles() - allocate a new CtrlHandles structure, * connect to the X server identified by display, and initialize an * NvCtrlAttributeHandle for each possible target (X screens, gpus, * FrameLock devices). */ CtrlHandles *nv_alloc_ctrl_handles(const char *display) { ReturnStatus status; CtrlHandles *h, *pQueryHandle = NULL; int i, j, val, len; int *pData = NULL; /* allocate the CtrlHandles struct */ h = nvalloc(sizeof(CtrlHandles)); /* store any given X display name */ if (display) { h->display = strdup(display); } else { h->display = NULL; } /* open the X display connection */ h->dpy = XOpenDisplay(h->display); if (!h->dpy) { nv_error_msg("Cannot open display '%s'.", XDisplayName(h->display)); return h; } /* * loop over each target type and setup the appropriate * information */ for (j = 0; j < targetTypeTableLen; j++) { const TargetTypeEntry *targetTypeEntry = &targetTypeTable[j]; int target = targetTypeEntry->target_index; CtrlHandleTargets *targets = &(h->targets[target]); /* * get the number of targets of this type; if this is an X * screen target, just use Xlib's ScreenCount() (note: to * support Xinerama: we'll want to use * NvCtrlQueryTargetCount() rather than ScreenCount()); for * other target types, use NvCtrlQueryTargetCount(). */ if (target == X_SCREEN_TARGET) { targets->n = ScreenCount(h->dpy); } else { /* * note: pQueryHandle should be assigned below by a * previous iteration of this loop; depends on X screen * targets getting handled first */ if (pQueryHandle) { /* * check that the NV-CONTROL protocol is new enough to * recognize this target type */ ReturnStatus ret1, ret2; int major, minor; ret1 = NvCtrlGetAttribute(pQueryHandle, NV_CTRL_ATTR_NV_MAJOR_VERSION, &major); ret2 = NvCtrlGetAttribute(pQueryHandle, NV_CTRL_ATTR_NV_MINOR_VERSION, &minor); if ((ret1 == NvCtrlSuccess) && (ret2 == NvCtrlSuccess) && ((major > targetTypeEntry->major) || ((major == targetTypeEntry->major) && (minor >= targetTypeEntry->minor)))) { if (target != DISPLAY_TARGET) { status = NvCtrlQueryTargetCount (pQueryHandle, targetTypeEntry->nvctrl, &val); } else { /* For targets that aren't simply enumerated, * query the list of valid IDs in pData which * will be used below */ status = NvCtrlGetBinaryAttribute(pQueryHandle, 0, NV_CTRL_BINARY_DATA_DISPLAY_TARGETS, (unsigned char **)(&pData), &len); if (status == NvCtrlSuccess) { val = pData[0]; } } } else { status = NvCtrlMissingExtension; } } else { status = NvCtrlMissingExtension; } if (status != NvCtrlSuccess) { nv_warning_msg("Unable to determine number of NVIDIA " "%ss on '%s'.", targetTypeEntry->name, XDisplayName(h->display)); val = 0; } targets->n = val; } /* if there are no targets of this type, skip */ if (targets->n == 0) { goto next_target_type; } /* allocate an array of CtrlHandleTarget's */ targets->t = nvalloc(targets->n * sizeof(CtrlHandleTarget)); /* * loop over all the targets of this type and setup the * CtrlHandleTarget's */ for (i = 0; i < targets->n; i++) { CtrlHandleTarget *t = &(targets->t[i]); int targetId; switch (target) { case DISPLAY_TARGET: /* Grab the target Id from the pData list */ targetId = pData[i+1]; break; case X_SCREEN_TARGET: case GPU_TARGET: case FRAMELOCK_TARGET: case VCS_TARGET: case GVI_TARGET: case COOLER_TARGET: case THERMAL_SENSOR_TARGET: case NVIDIA_3D_VISION_PRO_TRANSCEIVER_TARGET: default: targetId = i; } nv_init_target(h->dpy, t, target, targetId); /* * store this handle, if it exists, so that we can use it to * query other target counts later */ if (!pQueryHandle && t->h) { pQueryHandle = t->h; } } next_target_type: if (pData) { XFree(pData); pData = NULL; } } /* Load relationships to other targets */ for (i = 0; i < MAX_TARGET_TYPES; i++) { CtrlHandleTargets *targets = &(h->targets[i]); for (j = 0; j < targets->n; j++) { CtrlHandleTarget *t = &(targets->t[j]); load_target_relationships(h, t); } } return h; } /* nv_alloc_ctrl_handles() */ /* * nv_alloc_ctrl_handles_and_add_to_array() - if it doesn't exist, allocate a new * CtrlHandles structure via nv_alloc_ctrl_handles and add it to the * CtrlHandlesArray given and return the newly allocated handle. If it * does exist, simply return the existing handle. */ CtrlHandles * nv_alloc_ctrl_handles_and_add_to_array(const char *display, CtrlHandlesArray *handles_array) { CtrlHandles *handle = nv_get_ctrl_handles(display, handles_array); if (handle == NULL) { handle = nv_alloc_ctrl_handles(display); if (handle) { handles_array->array = nvrealloc(handles_array->array, sizeof(CtrlHandles *) * (handles_array->n + 1)); handles_array->array[handles_array->n] = handle; handles_array->n++; } } return handle; } /* * nv_free_ctrl_handles() - free the CtrlHandles structure allocated * by nv_alloc_ctrl_handles() */ static void nv_free_ctrl_handles(CtrlHandles *h) { if (!h) return; if (h->display) free(h->display); if (h->dpy) { int i; /* * XXX It is unfortunate that the display connection needs * to be closed before the backends have had a chance to * tear down their state. If future backends need to send * protocol in this case or perform similar tasks, we'll * have to add e.g. NvCtrlAttributeTearDown(), which would * need to be called before XCloseDisplay(). */ XCloseDisplay(h->dpy); h->dpy = NULL; for (i = 0; i < targetTypeTableLen; i++) { CtrlHandleTargets *targets = &(h->targets[targetTypeTable[i].target_index]); int j; for (j = 0; j < targets->n; j++) { CtrlHandleTarget *t = &(targets->t[j]); int n; NvCtrlAttributeClose(t->h); free(t->name); for (n = 0; n < NV_PROTO_NAME_MAX; n++) { if (t->protoNames[n]) { XFree(t->protoNames[n]); } } memset(t, 0, sizeof(*t)); } free(targets->t); } } free(h); } /* nv_free_ctrl_handles() */ /* * nv_free_ctrl_handles_array() - free an array of CtrlHandles. */ void nv_free_ctrl_handles_array(CtrlHandlesArray *handles_array) { int i; for (i = 0; i < handles_array->n; i++) { nv_free_ctrl_handles(handles_array->array[i]); } if (handles_array->array) { free(handles_array->array); } handles_array->n = 0; handles_array->array = NULL; } /* * nv_get_ctrl_handles() - return the CtrlHandles matching the given string. */ CtrlHandles *nv_get_ctrl_handles(const char *display, CtrlHandlesArray *handles_array) { int i; for (i=0; i < handles_array->n; i++) { if (nv_strcasecmp(display, handles_array->array[i]->display)) { return handles_array->array[i]; } } return NULL; } /*! * Adds all the targets of the target type (specified via a target type index) * to the list of targets to process for the ParsedAttribute. * * \param[in/out] a The ParsedAttribute to add targets to. * \param[in] h The list of targets to add from. * \param[in] targetIdx The target type index of the targets to add. */ static void include_target_idx_targets(ParsedAttribute *a, const CtrlHandles *h, int targetIdx) { const CtrlHandleTargets *targets = &(h->targets[targetIdx]); int i; for (i = 0; i < targets->n; i++) { CtrlHandleTarget *target = &(targets->t[i]); nv_target_list_add(a->targets, target); a->flags |= NV_PARSER_HAS_TARGET; } } /*! * Queries the permissions for the given attribute. * * \param[in] h CtrlHandles used to communicate with the X server. * \param[in] attr The attribute to query permissions for. * \param[in] flags The attribute flags to query permissions for. * \param[out] perms The permissions of the attribute. * * \return Returns TRUE if the permissions were queried successfully; else, * returns FALSE. */ Bool nv_get_attribute_perms(CtrlHandles *h, int attr, uint32 flags, NVCTRLAttributePermissionsRec *perms) { memset(perms, 0, sizeof(*perms)); if (flags & NV_PARSER_TYPE_COLOR_ATTRIBUTE) { /* Allow non NV-CONTROL attributes to be read/written on X screen * targets */ perms->type = ATTRIBUTE_TYPE_INTEGER; perms->permissions = ATTRIBUTE_TYPE_READ | ATTRIBUTE_TYPE_WRITE | ATTRIBUTE_TYPE_X_SCREEN; return NV_TRUE; } if (flags & NV_PARSER_TYPE_STRING_ATTRIBUTE) { return XNVCTRLQueryStringAttributePermissions(h->dpy, attr, perms); } return XNVCTRLQueryAttributePermissions(h->dpy, attr, perms); } /*! * Converts the ParsedAttribute 'a''s target specification (and/or target type * + id) into a list of CtrlHandleTarget to operate on. If the ParsedAttribute * has a target specification set, this is used to generate the list; Otherwise, * the target type and target id are used. If nothing is specified, all the * valid targets for the attribute are included. * * If this is a display attribute, and a (legacy) display mask string is given, * all non-display targets are further resolved into the corresponding display * targets that match the names represented by the display mask string. * * \param[in/out] a ParsedAttribute to resolve. * \param[in] h CtrlHandles to resolve the target specification against. * * \return Return NV_PARSER_STATUS_SUCCESS if the attribute's target * specification was successfully parsed into a list of targets to * operate on; else, returns one of the other NV_PARSER_STATUS_XXX * error codes that detail the particular parsing error. */ static int resolve_attribute_targets(ParsedAttribute *a, CtrlHandles *h, const char *whence) { NVCTRLAttributePermissionsRec perms; Bool status; int ret = NV_PARSER_STATUS_SUCCESS; int i; if (a->targets) { // Oops already parsed? // XXX thrown another error here? return NV_PARSER_STATUS_BAD_ARGUMENT; } status = nv_get_attribute_perms(h, a->attr, a->flags, &perms); if (!status) { // XXX Throw other error here...? return NV_PARSER_STATUS_TARGET_SPEC_NO_TARGETS; } a->targets = nv_target_list_init(); /* If a target specification string was given, use that to determine the * list of targets to include. */ if (a->target_specification) { ret = nv_infer_targets_from_specification(a, h); goto done; } /* If the target type and target id was given, use that. */ if (a->target_type >= 0 && a->target_id >= 0) { CtrlHandleTarget *target = nv_get_target(h, a->target_type, a->target_id); if (!target) { return NV_PARSER_STATUS_TARGET_SPEC_NO_TARGETS; } nv_target_list_add(a->targets, target); a->flags |= NV_PARSER_HAS_TARGET; goto done; } /* If a target type was given, but no target id, process all the targets * of that type. */ if (a->target_type >= 0) { const TargetTypeEntry *targetTypeEntry = nv_get_target_type_entry_by_nvctrl(a->target_type); if (!targetTypeEntry) { return NV_PARSER_STATUS_TARGET_SPEC_BAD_TARGET; } include_target_idx_targets(a, h, targetTypeEntry->target_index); goto done; } /* If no target type was given, assume all the appropriate targets for the * attribute by querying its permissions. */ for (i = 0; i < MAX_TARGET_TYPES; i++) { int permBit = targetTypeTable[i].permission_bit; if (!(perms.permissions & permBit)) { continue; } /* Add all targets of type that are valid for this attribute */ include_target_idx_targets(a, h, i); } done: /* If this attribute is a display attribute, include the related display * targets of the (resolved) non display targets. If a display mask is * specified via either name string or value, use that to limit the * displays added, otherwise include all related display targets. */ if (!(a->flags & NV_PARSER_TYPE_HIJACK_DISPLAY_DEVICE) && (perms.permissions & ATTRIBUTE_TYPE_DISPLAY)) { CtrlHandleTargetNode *head = nv_target_list_init(); CtrlHandleTargetNode *n; uint32 display_mask; int bit, i; char *name_list[32]; int num_names = 0; /* Convert user string into display device mask */ if (a->flags & NV_PARSER_HAS_DISPLAY_DEVICE) { display_mask = expand_display_device_mask_wildcards(a->display_device_mask); /* Warn that this usage is deprecated */ nv_warning_msg("Display mask usage as specified %s has been " "deprecated and will be removed in the future." "Please use display names and/or display target " "specification instead.", whence); } else { display_mask = VALID_DISPLAY_DEVICES_MASK; } /* Convert the bitmask into a list of names */ for (bit = 0; bit < 24; bit++) { uint32 mask = (1 << bit); if (!(mask & display_mask)) { continue; } name_list[num_names] = display_device_mask_to_display_device_name(mask); if (name_list[num_names]) { num_names++; } } /* Look at attribute's target list... */ for (n = a->targets; n->next; n = n->next) { CtrlHandleTarget *t = n->t; CtrlHandleTargetNode *n_other; int target_type; if (!t->h) { continue; } target_type = NvCtrlGetTargetType(t->h); /* Include display targets */ if (target_type == NV_CTRL_TARGET_TYPE_DISPLAY) { /* Make sure to include display targets in final list */ nv_target_list_add(head, t); continue; } /* Include non-display target's related display targets, if any */ for (n_other = t->relations; n_other->next; n_other = n_other->next) { CtrlHandleTarget *t_other = n_other->t; if (!t_other->h) { continue; } target_type = NvCtrlGetTargetType(t_other->h); if (target_type != NV_CTRL_TARGET_TYPE_DISPLAY) { continue; } for (i = 0; i < num_names; i++) { if (nv_strcasecmp(name_list[i], t_other->protoNames[NV_DPY_PROTO_NAME_TYPE_ID])) { nv_target_list_add(head, t_other); break; } } } } /* Cleanup */ for (i = 0; i < num_names; i++) { nvfree(name_list[i]); } /* Apply the new targets list */ nv_target_list_free(a->targets); a->targets = head; } /* Make sure at least one target was resolved */ if (ret == NV_PARSER_STATUS_SUCCESS) { if (!(a->flags & NV_PARSER_HAS_TARGET)) { return NV_PARSER_STATUS_TARGET_SPEC_NO_TARGETS; } } return ret; } /* * process_attribute_queries() - parse the list of queries, and call * nv_ctrl_process_parsed_attribute() to process each query. * * If any errors are encountered, an error message is printed and * NV_FALSE is returned. Otherwise, NV_TRUE is returned. */ static int process_attribute_queries(int num, char **queries, const char *display_name, CtrlHandlesArray *handles_array) { int query, ret, val; ParsedAttribute a; CtrlHandles *h; val = NV_FALSE; /* print a newline before we begin */ if (!__terse) nv_msg(NULL, ""); /* loop over each requested query */ for (query = 0; query < num; query++) { /* special case the "all" query */ if (nv_strcasecmp(queries[query], "all")) { query_all(display_name, handles_array); continue; } /* special case the target type queries */ if (nv_strcasecmp(queries[query], "screens") || nv_strcasecmp(queries[query], "xscreens")) { query_all_targets(display_name, X_SCREEN_TARGET, handles_array); continue; } if (nv_strcasecmp(queries[query], "gpus")) { query_all_targets(display_name, GPU_TARGET, handles_array); continue; } if (nv_strcasecmp(queries[query], "framelocks")) { query_all_targets(display_name, FRAMELOCK_TARGET, handles_array); continue; } if (nv_strcasecmp(queries[query], "vcs")) { query_all_targets(display_name, VCS_TARGET, handles_array); continue; } if (nv_strcasecmp(queries[query], "gvis")) { query_all_targets(display_name, GVI_TARGET, handles_array); continue; } if (nv_strcasecmp(queries[query], "fans")) { query_all_targets(display_name, COOLER_TARGET, handles_array); continue; } if (nv_strcasecmp(queries[query], "thermalsensors")) { query_all_targets(display_name, THERMAL_SENSOR_TARGET, handles_array); continue; } if (nv_strcasecmp(queries[query], "svps")) { query_all_targets(display_name, NVIDIA_3D_VISION_PRO_TRANSCEIVER_TARGET, handles_array); continue; } if (nv_strcasecmp(queries[query], "dpys")) { query_all_targets(display_name, DISPLAY_TARGET, handles_array); continue; } /* call the parser to parse queries[query] */ ret = nv_parse_attribute_string(queries[query], NV_PARSER_QUERY, &a); if (ret != NV_PARSER_STATUS_SUCCESS) { nv_error_msg("Error parsing query '%s' (%s).", queries[query], nv_parse_strerror(ret)); goto done; } /* make sure we have a display */ nv_assign_default_display(&a, display_name); /* allocate the CtrlHandles */ h = nv_alloc_ctrl_handles_and_add_to_array(a.display, handles_array); if (!h) { goto done; } /* call the processing engine to process the parsed query */ ret = nv_process_parsed_attribute(&a, h, NV_FALSE, NV_FALSE, "in query '%s'", queries[query]); if (ret == NV_FALSE) goto done; /* print a newline at the end */ if (!__terse) nv_msg(NULL, ""); } /* query */ val = NV_TRUE; done: return val; } /* process_attribute_queries() */ /* * process_attribute_assignments() - parse the list of * assignments, and call nv_process_parsed_attribute() to process * each assignment. * * If any errors are encountered, an error message is printed and * NV_FALSE is returned. Otherwise, NV_TRUE is returned. */ static int process_attribute_assignments(int num, char **assignments, const char *display_name, CtrlHandlesArray *handles_array) { int assignment, ret, val; ParsedAttribute a; CtrlHandles *h; val = NV_FALSE; /* print a newline before we begin */ nv_msg(NULL, ""); /* loop over each requested assignment */ for (assignment = 0; assignment < num; assignment++) { /* call the parser to parse assignments[assignment] */ ret = nv_parse_attribute_string(assignments[assignment], NV_PARSER_ASSIGNMENT, &a); if (ret != NV_PARSER_STATUS_SUCCESS) { nv_error_msg("Error parsing assignment '%s' (%s).", assignments[assignment], nv_parse_strerror(ret)); goto done; } /* make sure we have a display */ nv_assign_default_display(&a, display_name); /* allocate the CtrlHandles */ h = nv_alloc_ctrl_handles_and_add_to_array(a.display, handles_array); if (!h) { goto done; } /* call the processing engine to process the parsed assignment */ ret = nv_process_parsed_attribute(&a, h, NV_TRUE, NV_TRUE, "in assignment '%s'", assignments[assignment]); if (ret == NV_FALSE) goto done; /* print a newline at the end */ nv_msg(NULL, ""); } /* assignment */ val = NV_TRUE; done: return val; } /* nv_process_attribute_assignments() */ /* * validate_value() - query the valid values for the specified * attribute, and check that the value to be assigned is valid. */ static int validate_value(CtrlHandleTarget *t, ParsedAttribute *a, uint32 d, int target_type, char *whence) { int bad_val = NV_FALSE; NVCTRLAttributeValidValuesRec valid; ReturnStatus status; char d_str[256]; char *tmp_d_str; const TargetTypeEntry *targetTypeEntry; status = NvCtrlGetValidDisplayAttributeValues(t->h, d, a->attr, &valid); if (status != NvCtrlSuccess) { nv_error_msg("Unable to query valid values for attribute %s (%s).", a->name, NvCtrlAttributesStrError(status)); return NV_FALSE; } if (target_type != NV_CTRL_TARGET_TYPE_DISPLAY && valid.permissions & ATTRIBUTE_TYPE_DISPLAY) { tmp_d_str = display_device_mask_to_display_device_name(d); sprintf(d_str, ", display device: %s", tmp_d_str); free(tmp_d_str); } else { d_str[0] = '\0'; } switch (valid.type) { case ATTRIBUTE_TYPE_INTEGER: case ATTRIBUTE_TYPE_BITMASK: /* don't do any checks on integer or bitmask values */ break; case ATTRIBUTE_TYPE_BOOL: if ((a->val.i < 0) || (a->val.i > 1)) { bad_val = NV_TRUE; } break; case ATTRIBUTE_TYPE_RANGE: if (a->flags & NV_PARSER_TYPE_PACKED_ATTRIBUTE) { if (((a->val.i >> 16) < (valid.u.range.min >> 16)) || ((a->val.i >> 16) > (valid.u.range.max >> 16)) || ((a->val.i & 0xffff) < (valid.u.range.min & 0xffff)) || ((a->val.i & 0xffff) > (valid.u.range.max & 0xffff))) bad_val = NV_TRUE; } else { if ((a->val.i < valid.u.range.min) || (a->val.i > valid.u.range.max)) bad_val = NV_TRUE; } break; case ATTRIBUTE_TYPE_INT_BITS: if (a->flags & NV_PARSER_TYPE_PACKED_ATTRIBUTE) { unsigned int u, l; u = (((unsigned int) a->val.i) >> 16); l = (a->val.i & 0xffff); if ((u > 15) || ((valid.u.bits.ints & (1 << u << 16)) == 0) || (l > 15) || ((valid.u.bits.ints & (1 << l)) == 0)) { bad_val = NV_TRUE; } } else { if ((a->val.i > 31) || (a->val.i < 0) || ((valid.u.bits.ints & (1<val.i)) == 0)) { bad_val = NV_TRUE; } } break; default: bad_val = NV_TRUE; break; } /* is this value available for this target type? */ targetTypeEntry = nv_get_target_type_entry_by_nvctrl(target_type); if (!targetTypeEntry || !(targetTypeEntry->permission_bit & valid.permissions)) { bad_val = NV_TRUE; } /* if the value is bad, print why */ if (bad_val) { if (a->flags & NV_PARSER_TYPE_PACKED_ATTRIBUTE) { nv_warning_msg("The value pair %d,%d for attribute '%s' (%s%s) " "specified %s is invalid.", a->val.i >> 16, a->val.i & 0xffff, a->name, t->name, d_str, whence); } else { nv_warning_msg("The value %d for attribute '%s' (%s%s) " "specified %s is invalid.", a->val.i, a->name, t->name, d_str, whence); } print_valid_values(a->name, a->attr, a->flags, valid); return NV_FALSE; } return NV_TRUE; } /* validate_value() */ /* * print_valid_values() - prints the valid values for the specified * attribute. */ static void print_valid_values(const char *name, int attr, uint32 flags, NVCTRLAttributeValidValuesRec valid) { int bit, print_bit, last, last2, n, i; char str[256]; char *c; char str2[256]; char *c2; char **at; /* do not print any valid values information when we are in 'terse' mode */ if (__terse) return; #define INDENT " " switch (valid.type) { case ATTRIBUTE_TYPE_STRING: nv_msg(INDENT, "'%s' is a string attribute.", name); break; case ATTRIBUTE_TYPE_64BIT_INTEGER: nv_msg(INDENT, "'%s' is a 64 bit integer attribute.", name); break; case ATTRIBUTE_TYPE_INTEGER: if (flags & NV_PARSER_TYPE_PACKED_ATTRIBUTE) { nv_msg(INDENT, "'%s' is a packed integer attribute.", name); } else { nv_msg(INDENT, "'%s' is an integer attribute.", name); } break; case ATTRIBUTE_TYPE_BITMASK: nv_msg(INDENT, "'%s' is a bitmask attribute.", name); break; case ATTRIBUTE_TYPE_BOOL: nv_msg(INDENT, "'%s' is a boolean attribute; valid values are: " "1 (on/true) and 0 (off/false).", name); break; case ATTRIBUTE_TYPE_RANGE: if (flags & NV_PARSER_TYPE_PACKED_ATTRIBUTE) { nv_msg(INDENT, "The valid values for '%s' are in the ranges " "%" PRId64 " - %" PRId64 ", %" PRId64 " - %" PRId64 " (inclusive).", name, valid.u.range.min >> 16, valid.u.range.max >> 16, valid.u.range.min & 0xffff, valid.u.range.max & 0xffff); } else { nv_msg(INDENT, "The valid values for '%s' are in the range " "%" PRId64 " - %" PRId64 " (inclusive).", name, valid.u.range.min, valid.u.range.max); } break; case ATTRIBUTE_TYPE_INT_BITS: last = last2 = -1; /* scan through the bitmask once to get the last valid bits */ for (bit = 0; bit < 32; bit++) { if (valid.u.bits.ints & (1 << bit)) { if ((bit > 15) && (flags & NV_PARSER_TYPE_PACKED_ATTRIBUTE)) { last2 = bit; } else { last = bit; } } } /* now, scan through the bitmask again, building the string */ str[0] = '\0'; str2[0] = '\0'; c = str; c2 = str2; for (bit = 0; bit < 32; bit++) { if ((bit > 15) && (flags & NV_PARSER_TYPE_PACKED_ATTRIBUTE)) { print_bit = bit - 16; at = &c2; } else { print_bit = bit; at = &c; } if (valid.u.bits.ints & (1 << bit)) { if (*at == str || *at == str2) { *at += sprintf(*at, "%d", print_bit); } else if (bit == last || bit == last2) { *at += sprintf(*at, " and %d", print_bit); } else { *at += sprintf(*at, ", %d", print_bit); } } } if (flags & NV_PARSER_TYPE_PACKED_ATTRIBUTE) { nv_msg(INDENT, "Valid values for '%s' are: [%s], [%s].", name, str2, str); } else { nv_msg(INDENT, "Valid values for '%s' are: %s.", name, str); } break; } if (!(valid.permissions & ATTRIBUTE_TYPE_WRITE)) { nv_msg(INDENT, "'%s' is a read-only attribute.", name); } if (valid.permissions & ATTRIBUTE_TYPE_DISPLAY) { nv_msg(INDENT, "'%s' is display device specific.", name); } /* print the valid target types */ c = str; n = 0; for (i = 0; i < targetTypeTableLen; i++) { if (valid.permissions & targetTypeTable[i].permission_bit) { if (n > 0) c += sprintf(c, ", "); c += sprintf(c, "%s", targetTypeTable[i].name); n++; } } if (n == 0) sprintf(c, "None"); nv_msg(INDENT, "'%s' can use the following target types: %s.", name, str); if (__verbosity >= VERBOSITY_ALL) print_additional_info(name, attr, valid, INDENT); #undef INDENT } /* print_valid_values() */ /* * print_queried_value() - print the attribute value that we queried * from NV-CONTROL */ typedef enum { VerboseLevelTerse, VerboseLevelAbbreviated, VerboseLevelVerbose, } VerboseLevel; static void print_queried_value(const CtrlHandles *handles, CtrlHandleTarget *t, NVCTRLAttributeValidValuesRec *v, int val, uint32 flags, char *name, uint32 mask, const char *indent, const VerboseLevel level) { char d_str[64], val_str[64], *tmp_d_str; /* assign val_str */ if ((flags & NV_PARSER_TYPE_VALUE_IS_DISPLAY_ID) && (__display_device_string)) { const char *name = nv_get_display_target_config_name(handles, val); if (name) { snprintf(val_str, 64, "%s", name); } else { snprintf(val_str, 64, "%d", val); } } else if ((flags & NV_PARSER_TYPE_VALUE_IS_DISPLAY) && (__display_device_string)) { tmp_d_str = display_device_mask_to_display_device_name(val); snprintf(val_str, 64, "%s", tmp_d_str); free(tmp_d_str); } else if (flags & NV_PARSER_TYPE_100Hz) { snprintf(val_str, 64, "%.2f Hz", ((float) val) / 100.0); } else if (flags & NV_PARSER_TYPE_1000Hz) { snprintf(val_str, 64, "%.3f Hz", ((float) val) / 1000.0); } else if (v->type == ATTRIBUTE_TYPE_BITMASK) { snprintf(val_str, 64, "0x%08x", val); } else if (flags & NV_PARSER_TYPE_PACKED_ATTRIBUTE) { snprintf(val_str, 64, "%d,%d", val >> 16, val & 0xffff); } else { snprintf(val_str, 64, "%d", val); } /* append the display device name, if necessary */ if ((NvCtrlGetTargetType(t->h) != NV_CTRL_TARGET_TYPE_DISPLAY) && v->permissions & ATTRIBUTE_TYPE_DISPLAY) { tmp_d_str = display_device_mask_to_display_device_name(mask); snprintf(d_str, 64, "; display device: %s", tmp_d_str); free(tmp_d_str); } else { d_str[0] = '\0'; } /* print the value */ switch (level) { case VerboseLevelTerse: /* print value alone */ nv_msg(NULL, "%s", val_str); break; case VerboseLevelAbbreviated: /* print the value with indentation and the attribute name */ nv_msg(indent, "%s: %s", name, val_str); break; case VerboseLevelVerbose: /* * or print the value along with other information about the * attribute */ nv_msg(indent, "Attribute '%s' (%s%s): %s.", name, t->name, d_str, val_str); break; } } /* print_queried_value() */ /* * print_additional_fsaa_info() - print the currently available fsaa * modes with their corresponding names */ static void print_additional_fsaa_info(const char *name, unsigned int valid_fsaa_modes, const char *indent) { int bit; nv_msg(indent, "\n"); nv_msg(indent, "Note to assign 'FSAA' on the commandline, you may also " "need to assign\n"); nv_msg(indent, "'FSAAAppControlled' and 'FSAAAppEnhanced' to 0.\n"); nv_msg(indent, "\n"); nv_msg(indent, "Valid '%s' Values\n", name); nv_msg(indent, " value - description\n"); for (bit = 0; bit < 32; bit++) { /* FSAA is not a packed attribute */ if (valid_fsaa_modes & (1 << bit)) { nv_msg(indent, " %2u - %s\n", bit, NvCtrlGetMultisampleModeName(bit)); } } } /* * print_additional_info() - after printing the main information about * a queried attribute, we may want to add some more when in verbose mode. * This function is designed to handle this. Add a new 'case' here when * you want to print this additional information for a specific attr. */ static void print_additional_info(const char *name, int attr, NVCTRLAttributeValidValuesRec valid, const char *indent) { switch (attr) { case NV_CTRL_FSAA_MODE: print_additional_fsaa_info(name, valid.u.bits.ints, indent); break; // add more here } } /* * query_all() - loop through all target types, and query all attributes * for those targets. The current attribute values for all display * devices on all targets are printed, along with the valid values for * each attribute. * * If an error occurs, an error message is printed and NV_FALSE is * returned; if successful, NV_TRUE is returned. */ static int query_all(const char *display_name, CtrlHandlesArray *handles_array) { int bit, entry, val, i; uint32 mask; ReturnStatus status; NVCTRLAttributeValidValuesRec valid; CtrlHandles *h; h = nv_alloc_ctrl_handles_and_add_to_array(display_name, handles_array); if (!h) { return NV_FALSE; } #define INDENT " " /* * Loop through all target types. */ for (i = 0; i < targetTypeTableLen; i++) { CtrlHandleTargets *targets = &(h->targets[targetTypeTable[i].target_index]); int j; for (j = 0; j < targets->n; j++) { CtrlHandleTarget *t = &targets->t[j]; if (!t->h) continue; nv_msg(NULL, "Attributes queryable via %s:", t->name); if (!__terse) nv_msg(NULL, ""); for (entry = 0; attributeTable[entry].name; entry++) { const AttributeTableEntry *a = &attributeTable[entry]; /* skip the color attributes */ if (a->flags & NV_PARSER_TYPE_COLOR_ATTRIBUTE) continue; /* skip attributes that shouldn't be queried here */ if (a->flags & NV_PARSER_TYPE_NO_QUERY_ALL) continue; for (bit = 0; bit < 24; bit++) { mask = 1 << bit; /* * if this bit is not present in the screens's enabled * display device mask (and the X screen has enabled * display devices), skip to the next bit */ if (targetTypeTable[i].uses_display_devices && ((t->d & mask) == 0x0) && (t->d)) continue; if (a->flags & NV_PARSER_TYPE_STRING_ATTRIBUTE) { char *tmp_str = NULL; status = NvCtrlGetValidStringDisplayAttributeValues(t->h, mask, a->attr, &valid); if (status == NvCtrlAttributeNotAvailable) { goto exit_bit_loop; } if (status != NvCtrlSuccess) { nv_error_msg("Error while querying valid values for " "attribute '%s' on %s (%s).", a->name, t->name, NvCtrlAttributesStrError(status)); goto exit_bit_loop; } status = NvCtrlGetStringDisplayAttribute(t->h, mask, a->attr, &tmp_str); if (status == NvCtrlAttributeNotAvailable) { goto exit_bit_loop; } if (status != NvCtrlSuccess) { nv_error_msg("Error while querying attribute '%s' " "on %s (%s).", a->name, t->name, NvCtrlAttributesStrError(status)); goto exit_bit_loop; } if (__terse) { nv_msg(" ", "%s: %s", a->name, tmp_str); } else { nv_msg(" ", "Attribute '%s' (%s%s): %s ", a->name, t->name, "", tmp_str); } free(tmp_str); tmp_str = NULL; } else { status = NvCtrlGetValidDisplayAttributeValues(t->h, mask, a->attr, &valid); if (status == NvCtrlAttributeNotAvailable) goto exit_bit_loop; if (status != NvCtrlSuccess) { nv_error_msg("Error while querying valid values for " "attribute '%s' on %s (%s).", a->name, t->name, NvCtrlAttributesStrError(status)); goto exit_bit_loop; } status = NvCtrlGetDisplayAttribute(t->h, mask, a->attr, &val); if (status == NvCtrlAttributeNotAvailable) goto exit_bit_loop; if (status != NvCtrlSuccess) { nv_error_msg("Error while querying attribute '%s' " "on %s (%s).", a->name, t->name, NvCtrlAttributesStrError(status)); goto exit_bit_loop; } print_queried_value(h, t, &valid, val, a->flags, a->name, mask, INDENT, __terse ? VerboseLevelAbbreviated : VerboseLevelVerbose); } print_valid_values(a->name, a->attr, a->flags, valid); if (!__terse) nv_msg(NULL,""); if (valid.permissions & ATTRIBUTE_TYPE_DISPLAY) { continue; } /* fall through to exit_bit_loop */ exit_bit_loop: break; /* XXX force us out of the display device loop */ } /* bit */ } /* entry */ } /* j (targets) */ } /* i (target types) */ #undef INDENT return NV_TRUE; } /* query_all() */ /* * get_product_name() Returns the (GPU, X screen, display device or VCS) * product name of the given target. */ static char * get_product_name(NvCtrlAttributeHandle *h, int attr) { char *product_name; ReturnStatus status; status = NvCtrlGetStringAttribute(h, attr, &product_name); if (status != NvCtrlSuccess) return strdup("Unknown"); return product_name; } /* * Returns the (RandR) display device name to use for printing the given * display target. If 'show_connected_state' is true, "connected" will be * appended to the name. */ static void get_display_product_name(CtrlHandleTarget *t, char *buf, int len, Bool show_connect_state) { const CtrlHandleTargetNode *n; const char *connected_str = ""; /* Check to see if display is connected (has a GPU relation) */ if (show_connect_state) { for (n = t->relations; n->next; n = n->next) { int target_type = NvCtrlGetTargetType(n->t->h); if (target_type == NV_CTRL_TARGET_TYPE_GPU) { connected_str = ") (connected"; break; } } } snprintf(buf, len, "%s%s", t->protoNames[NV_DPY_PROTO_NAME_RANDR], connected_str); } /* * print_target_connections() Prints a list of all targets connected * to a given target using print_func if the connected targets require * special handling. */ static int print_target_connections(CtrlHandles *h, CtrlHandleTarget *t, const char *relation_str, unsigned int attrib, unsigned int target_index) { int *pData; int len, i; ReturnStatus status; char *product_name; char *target_name; const TargetTypeEntry *targetTypeEntry; Bool show_dpy_connection_state = (attrib == NV_CTRL_BINARY_DATA_DISPLAYS_ASSIGNED_TO_XSCREEN) ? NV_TRUE : NV_FALSE; targetTypeEntry = &(targetTypeTable[target_index]); /* Query the connected targets */ status = NvCtrlGetBinaryAttribute(t->h, 0, attrib, (unsigned char **) &pData, &len); if (status != NvCtrlSuccess) return NV_FALSE; if (pData[0] == 0) { nv_msg(" ", "Is not %s any %s.", relation_str, targetTypeEntry->name); nv_msg(NULL, ""); XFree(pData); return NV_TRUE; } nv_msg(" ", "Is %s the following %s%s:", relation_str, targetTypeEntry->name, ((pData[0] > 1) ? "s" : "")); /* List the connected targets */ for (i = 1; i <= pData[0]; i++) { CtrlHandleTarget *target = nv_get_target(h, targetTypeEntry->nvctrl, pData[i]); if (target) { target_name = target->name; switch (target_index) { case GPU_TARGET: product_name = get_product_name(target->h, NV_CTRL_STRING_PRODUCT_NAME); break; case VCS_TARGET: product_name = get_product_name(target->h, NV_CTRL_STRING_VCSC_PRODUCT_NAME); break; case DISPLAY_TARGET: product_name = nvalloc(PRODUCT_NAME_LEN); get_display_product_name(target, product_name, PRODUCT_NAME_LEN, show_dpy_connection_state); break; case NVIDIA_3D_VISION_PRO_TRANSCEIVER_TARGET: case THERMAL_SENSOR_TARGET: case COOLER_TARGET: case FRAMELOCK_TARGET: case GVI_TARGET: case X_SCREEN_TARGET: default: product_name = NULL; break; } } else { target_name = NULL; product_name = NULL; } if (!target_name) { nv_msg(" ", "Unknown %s", targetTypeEntry->name); } else if (product_name) { nv_msg(" ", "%s (%s)", target_name, product_name); } else { nv_msg(" ", "%s (%s %d)", target_name, targetTypeEntry->name, pData[i]); } free(product_name); } nv_msg(NULL, ""); XFree(pData); return NV_TRUE; } /* print_target_connections() */ /* * query_all_targets() - print a list of all the targets (of the * specified type) accessible via the Display connection. */ static int query_all_targets(const char *display_name, const int target_index, CtrlHandlesArray *handles_array) { CtrlHandles *h; CtrlHandleTarget *t; char *str, *name; int i; const TargetTypeEntry *targetTypeEntry; targetTypeEntry = &(targetTypeTable[target_index]); /* create handles */ h = nv_alloc_ctrl_handles_and_add_to_array(display_name, handles_array); if (!h) { return NV_FALSE; } /* build the standard X server name */ str = nv_standardize_screen_name(XDisplayName(h->display), -2); /* warn if we don't have any of the target type */ if (h->targets[target_index].n <= 0) { nv_warning_msg("No %ss on %s", targetTypeEntry->name, str); free(str); return NV_FALSE; } /* print how many of the target type we have */ nv_msg(NULL, "%d %s%s on %s", h->targets[target_index].n, targetTypeEntry->name, (h->targets[target_index].n > 1) ? "s" : "", str); nv_msg(NULL, ""); free(str); /* print information per target */ for (i = 0; i < h->targets[target_index].n; i++) { char product_name[PRODUCT_NAME_LEN]; Bool is_x_name = NV_FALSE; char *x_name = NULL; t = &h->targets[target_index].t[i]; str = NULL; if (target_index == NVIDIA_3D_VISION_PRO_TRANSCEIVER_TARGET) { snprintf(product_name, PRODUCT_NAME_LEN, "3D Vision Pro Transceiver %d", i); } else if (target_index == THERMAL_SENSOR_TARGET) { snprintf(product_name, PRODUCT_NAME_LEN, "Thermal Sensor %d", i); } else if (target_index == COOLER_TARGET) { snprintf(product_name, PRODUCT_NAME_LEN, "Fan %d", i); } else if (target_index == FRAMELOCK_TARGET) { snprintf(product_name, PRODUCT_NAME_LEN, "Quadro Sync %d", i); } else if (target_index == VCS_TARGET) { x_name = get_product_name(t->h, NV_CTRL_STRING_VCSC_PRODUCT_NAME); is_x_name = NV_TRUE; } else if (target_index == GVI_TARGET) { snprintf(product_name, PRODUCT_NAME_LEN, "SDI Input %d", i); } else if (target_index == DISPLAY_TARGET) { get_display_product_name(t, product_name, PRODUCT_NAME_LEN, NV_FALSE); } else { x_name = get_product_name(t->h, NV_CTRL_STRING_PRODUCT_NAME); is_x_name = NV_TRUE; } /* * use the name for the target handle, or "Not NVIDIA" if we * don't have a target handle name (this can happen for a * non-NVIDIA X screen) */ if (t->name) { name = t->name; } else { name = "Not NVIDIA"; } nv_msg(" ", "[%d] %s (%s)", i, name, is_x_name ? x_name : product_name); nv_msg(NULL, ""); if (x_name) { XFree(x_name); } /* Print connectivity information */ if (__verbosity >= VERBOSITY_ALL) { switch (target_index) { case GPU_TARGET: print_target_connections (h, t, "driving", NV_CTRL_BINARY_DATA_XSCREENS_USING_GPU, X_SCREEN_TARGET); print_target_connections (h, t, "connected to", NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU, DISPLAY_TARGET); print_target_connections (h, t, "connected to", NV_CTRL_BINARY_DATA_FRAMELOCKS_USED_BY_GPU, FRAMELOCK_TARGET); print_target_connections (h, t, "connected to", NV_CTRL_BINARY_DATA_VCSCS_USED_BY_GPU, VCS_TARGET); print_target_connections (h, t, "connected to", NV_CTRL_BINARY_DATA_COOLERS_USED_BY_GPU, COOLER_TARGET); print_target_connections (h, t, "connected to", NV_CTRL_BINARY_DATA_THERMAL_SENSORS_USED_BY_GPU, THERMAL_SENSOR_TARGET); break; case X_SCREEN_TARGET: print_target_connections (h, t, "driven by", NV_CTRL_BINARY_DATA_GPUS_USED_BY_XSCREEN, GPU_TARGET); print_target_connections (h, t, "assigned", NV_CTRL_BINARY_DATA_DISPLAYS_ASSIGNED_TO_XSCREEN, DISPLAY_TARGET); break; case FRAMELOCK_TARGET: print_target_connections (h, t, "connected to", NV_CTRL_BINARY_DATA_GPUS_USING_FRAMELOCK, GPU_TARGET); break; case VCS_TARGET: print_target_connections (h, t, "connected to", NV_CTRL_BINARY_DATA_GPUS_USING_VCSC, GPU_TARGET); break; case COOLER_TARGET: print_target_connections (h, t, "connected to", NV_CTRL_BINARY_DATA_COOLERS_USED_BY_GPU, COOLER_TARGET); break; case THERMAL_SENSOR_TARGET: print_target_connections (h, t, "connected to", NV_CTRL_BINARY_DATA_THERMAL_SENSORS_USED_BY_GPU, THERMAL_SENSOR_TARGET); break; default: break; } } } return NV_TRUE; } /* query_all_targets() */ /* * process_parsed_attribute_internal() - this function does the actual * attribute processing for nv_process_parsed_attribute(). * * If an error occurs, an error message is printed and NV_FALSE is * returned; if successful, NV_TRUE is returned. */ static int process_parsed_attribute_internal(const CtrlHandles *handles, CtrlHandleTarget *t, ParsedAttribute *a, uint32 d, int target_type, int assign, int verbose, char *whence, NVCTRLAttributeValidValuesRec valid) { ReturnStatus status; char str[32], *tmp_d_str; int ret; if (target_type != NV_CTRL_TARGET_TYPE_DISPLAY && valid.permissions & ATTRIBUTE_TYPE_DISPLAY) { tmp_d_str = display_device_mask_to_display_device_name(d); sprintf(str, ", display device: %s", tmp_d_str); free(tmp_d_str); } else { str[0] = '\0'; } if (assign) { if (a->flags & NV_PARSER_TYPE_STRING_ATTRIBUTE) { status = NvCtrlSetStringAttribute(t->h, a->attr, a->val.str, NULL); } else { ret = validate_value(t, a, d, target_type, whence); if (!ret) return NV_FALSE; status = NvCtrlSetDisplayAttribute(t->h, d, a->attr, a->val.i); if (status != NvCtrlSuccess) { nv_error_msg("Error assigning value %d to attribute '%s' " "(%s%s) as specified %s (%s).", a->val.i, a->name, t->name, str, whence, NvCtrlAttributesStrError(status)); return NV_FALSE; } if (verbose) { if (a->flags & NV_PARSER_TYPE_PACKED_ATTRIBUTE) { nv_msg(" ", "Attribute '%s' (%s%s) assigned value %d,%d.", a->name, t->name, str, a->val.i >> 16, a->val.i & 0xffff); } else { nv_msg(" ", "Attribute '%s' (%s%s) assigned value %d.", a->name, t->name, str, a->val.i); } } } } else { /* query */ if (a->flags & NV_PARSER_TYPE_STRING_ATTRIBUTE) { char *tmp_str = NULL; status = NvCtrlGetStringDisplayAttribute(t->h, d, a->attr, &tmp_str); if (status == NvCtrlAttributeNotAvailable) { nv_warning_msg("Error querying attribute '%s' specified %s; " "'%s' is not available on %s%s.", a->name, whence, a->name, t->name, str); } else if (status != NvCtrlSuccess) { nv_error_msg("Error while querying attribute '%s' " "(%s%s) specified %s (%s).", a->name, t->name, str, whence, NvCtrlAttributesStrError(status)); return NV_FALSE; } else { if (__terse) { nv_msg(NULL, "%s", tmp_str); } else { nv_msg(" ", "Attribute '%s' (%s%s): %s", a->name, t->name, str, tmp_str); } free(tmp_str); tmp_str = NULL; } } else { status = NvCtrlGetDisplayAttribute(t->h, d, a->attr, &a->val.i); if (status == NvCtrlAttributeNotAvailable) { nv_warning_msg("Error querying attribute '%s' specified %s; " "'%s' is not available on %s%s.", a->name, whence, a->name, t->name, str); } else if (status != NvCtrlSuccess) { nv_error_msg("Error while querying attribute '%s' " "(%s%s) specified %s (%s).", a->name, t->name, str, whence, NvCtrlAttributesStrError(status)); return NV_FALSE; } else { print_queried_value(handles, t, &valid, a->val.i, a->flags, a->name, d, " ", __terse ? VerboseLevelTerse : VerboseLevelVerbose); print_valid_values(a->name, a->attr, a->flags, valid); } } } /* query */ return NV_TRUE; } /* process_parsed_attribute_internal() */ /* * nv_process_parsed_attribute() - this is the processing engine for * all parsed attributes. * * A parsed attribute may or may not specify a target (X screen, GPU, * framelock device); if a target was specified, we validate that * target and process the attribute just for that target. If a target * was not specified, we process the attribute for all valid X * screens. * * A parsed attribute may or may not specify one or more display * devices. For attributes that require that a display device be * specified: if a display device mask is specified, we validate it * and process the attribute just for the display devices in the mask. * If a display device mask was not specified, then we process the * attribute for all enabled display devices on each of the targets * that have been requested. * * "Processing" a parsed attribute means either querying for the * current value of the attribute on all requested targets and display * devices (see above), or assigning the attribute on all requested * targets and display devices (see above). * * The majority of the work (determining which targets, which display * devices) is the same, regardless of what sort of processing we * actually need to do (thus this shared function). * * To accommodate the differences in processing needed for each of the * callers of this function, the parameters 'assign' and 'verbose' * are used; if assign is TRUE, then the attribute will be assigned * during processing, otherwise it will be queried. If verbose is * TRUE, then a message will be printed out during each assignment (or * query). * * The CtrlHandles argument contains an array of * NvCtrlAttributeHandle's (one for each target on this X server), as * well as the number of targets, an array of enabled display devices * for each target, and a string description of each target. * * The whence_fmt and following varargs are used by the callee to * describe where the attribute came from. A whence string should be * something like "on line 12 of config file ~/.nvidia-settings-rc" or * "in query ':0.0/fsaa'". Whence is used in the case of an error to * indicate where the error came from. * * If successful, the processing determined by 'assign' and 'verbose' * will be done and NV_TRUE will be returned. If an error occurs, an * error message will be printed and NV_FALSE will be returned. */ int nv_process_parsed_attribute(ParsedAttribute *a, CtrlHandles *h, int assign, int verbose, char *whence_fmt, ...) { int ret, val; char *whence, *tmp_d_str0, *tmp_d_str1; ReturnStatus status; CtrlHandleTargetNode *n; NVCTRLAttributeValidValuesRec valid; val = NV_FALSE; /* build the whence string */ NV_VSNPRINTF(whence, whence_fmt); if (!whence) whence = strdup("\0"); /* if we don't have a Display connection, abort now */ if (!h->dpy) { nv_error_msg("Unable to %s attribute %s specified %s (no Display " "connection).", assign ? "assign" : "query", a->name, whence); goto done; } /* Resolve any target specifications against the CtrlHandles that were * allocated. */ ret = resolve_attribute_targets(a, h, whence); if (ret != NV_PARSER_STATUS_SUCCESS) { nv_error_msg("Error resolving target specification '%s' " "(%s), specified %s.", a->target_specification ? a->target_specification : "", nv_parse_strerror(ret), whence); goto done; } /* loop over the requested targets */ for (n = a->targets; n->next; n = n->next) { CtrlHandleTarget *t = n->t; int target_type; uint32 mask; if (!t->h) continue; /* no handle on this target; silently skip */ target_type = NvCtrlGetTargetType(t->h); if (__list_targets) { const char *name = t->protoNames[0]; const char *randr_name = NULL; if (target_type == NV_CTRL_TARGET_TYPE_DISPLAY) { name = t->protoNames[NV_DPY_PROTO_NAME_TARGET_INDEX]; randr_name =t->protoNames[NV_DPY_PROTO_NAME_RANDR]; } nv_msg(TAB, "%s '%s' on %s%s%s%s\n", assign ? "Assign" : "Query", a->name, name, randr_name ? " (" : "", randr_name ? randr_name : "", randr_name ? ")" : "" ); continue; } /* special case the color attributes */ if (a->flags & NV_PARSER_TYPE_COLOR_ATTRIBUTE) { float v[3]; if (!assign) { nv_error_msg("Cannot query attribute '%s'", a->name); goto done; } /* * assign a->val.f to all values in the array; a->attr will * tell NvCtrlSetColorAttributes() which indices in the * array to use */ v[0] = v[1] = v[2] = a->val.f; status = NvCtrlSetColorAttributes(t->h, v, v, v, a->attr); if (status != NvCtrlSuccess) { nv_error_msg("Error assigning %f to attribute '%s' on %s " "specified %s (%s)", a->val.f, a->name, t->name, whence, NvCtrlAttributesStrError(status)); goto done; } continue; } /* * If we are assigning, and the value for this attribute is a * display device mask, then we need to validate the value against * either the mask of enabled display devices or the mask of * connected display devices. */ if (assign && (a->flags & NV_PARSER_TYPE_VALUE_IS_DISPLAY)) { char *display_device_descriptor = NULL; uint32 check_mask; /* use the complete mask if requested */ if (a->flags & NV_PARSER_TYPE_ASSIGN_ALL_DISPLAYS) { if (a->flags & NV_PARSER_TYPE_VALUE_IS_SWITCH_DISPLAY) { a->val.i = t->c; } else { a->val.i = t->d; } } /* * if we are hotkey switching, check against all connected * displays; otherwise, check against the currently active * display devices */ if (a->flags & NV_PARSER_TYPE_VALUE_IS_SWITCH_DISPLAY) { check_mask = t->c; display_device_descriptor = "connected"; } else { check_mask = t->d; display_device_descriptor = "enabled"; } if ((check_mask & a->val.i) != a->val.i) { tmp_d_str0 = display_device_mask_to_display_device_name(a->val.i); tmp_d_str1 = display_device_mask_to_display_device_name(check_mask); nv_error_msg("The attribute '%s' specified %s cannot be " "assigned the value of %s (the currently %s " "display devices are %s on %s).", a->name, whence, tmp_d_str0, display_device_descriptor, tmp_d_str1, t->name); free(tmp_d_str0); free(tmp_d_str1); continue; } } /* * If we are assigning, and the value for this attribute is a display * device id/name string, then we need to validate and convert the * given string against list of available display devices. The resulting * id, if any, is then fed back into the ParsedAttrinute's value as an * int which is ultimately written out to NV-CONTROL. */ if (assign && (a->flags & NV_PARSER_TYPE_VALUE_IS_DISPLAY_ID)) { CtrlHandleTargets *dpy_targets = &(h->targets[DISPLAY_TARGET]); int i; int found = NV_FALSE; int multi_match = NV_FALSE; int is_id; char *tmp = NULL; int id; /* See if value is a simple number */ id = strtol(a->val.str, &tmp, 0); is_id = (tmp && (tmp != a->val.str) && (*tmp == '\0')); for (i = 0; i < dpy_targets->n; i++) { CtrlHandleTarget *dpy_target = dpy_targets->t + i; if (is_id) { /* Value given as display device (target) ID */ if (id == NvCtrlGetTargetId(dpy_target->h)) { found = NV_TRUE; break; } } else { /* Value given as display device name */ if (nv_target_has_name(dpy_target, a->val.str)) { if (found) { multi_match = TRUE; break; } id = NvCtrlGetTargetId(dpy_target->h); found = NV_TRUE; /* Keep looking to make sure the name doesn't alias to * another display device. */ continue; } } } if (multi_match) { nv_error_msg("The attribute '%s' specified %s cannot be " "assigned the value of '%s' (This name matches " "multiple display devices, please use a non-" "ambiguous name.", a->name, whence, a->val.str); continue; } if (!found) { nv_error_msg("The attribute '%s' specified %s cannot be " "assigned the value of '%s' (This does not " "name an available display device).", a->name, whence, a->val.str); continue; } /* Put converted id back into a->val */ a->val.i = id; } /* * If we are assigning, and the value for this attribute is * not allowed to be zero, check that the value is not zero. */ if (assign && (a->flags & NV_PARSER_TYPE_NO_ZERO_VALUE)) { /* value must be non-zero */ if (!a->val.i) { if (a->flags & NV_PARSER_TYPE_VALUE_IS_DISPLAY) { tmp_d_str0 = "display device"; } else { tmp_d_str0 = "value"; } nv_error_msg("The attribute '%s' specified %s cannot be " "assigned the value of 0 (a valid, non-zero, " "%s must be specified).", a->name, whence, tmp_d_str0); continue; } } /* * If we are dealing with a frame lock attribute on a non-frame lock * target type, make sure frame lock is available. * * Also, when setting frame lock attributes on non-frame lock targets, * make sure frame lock is disabled. (Of course, don't check this for * the "enable frame lock" attribute, and special case the "Test * Signal" attribute.) */ if ((a->flags & NV_PARSER_TYPE_FRAMELOCK) && (target_type != NV_CTRL_TARGET_TYPE_FRAMELOCK)) { int available; status = NvCtrlGetAttribute(t->h, NV_CTRL_FRAMELOCK, &available); if (status != NvCtrlSuccess) { nv_error_msg("The attribute '%s' specified %s cannot be " "%s; error querying frame lock availability on " "%s (%s).", a->name, whence, assign ? "assigned" : "queried", t->name, NvCtrlAttributesStrError(status)); continue; } if (available != NV_CTRL_FRAMELOCK_SUPPORTED) { nv_error_msg("The attribute '%s' specified %s cannot be %s; " "frame lock is not supported/available on %s.", a->name, whence, assign ? "assigned" : "queried", t->name); continue; } /* Do assignments based on the frame lock sync status */ if (assign && (a->attr != NV_CTRL_FRAMELOCK_SYNC)) { int enabled; status = NvCtrlGetAttribute(t->h, NV_CTRL_FRAMELOCK_SYNC, &enabled); if (status != NvCtrlSuccess) { nv_error_msg("The attribute '%s' specified %s cannot be " "assigned; error querying frame lock sync " "status on %s (%s).", a->name, whence, t->name, NvCtrlAttributesStrError(status)); continue; } if (a->attr == NV_CTRL_FRAMELOCK_TEST_SIGNAL) { if (enabled != NV_CTRL_FRAMELOCK_SYNC_ENABLE) { nv_error_msg("The attribute '%s' specified %s cannot " "be assigned; frame lock sync is " "currently disabled on %s.", a->name, whence, t->name); continue; } } else if (enabled != NV_CTRL_FRAMELOCK_SYNC_DISABLE) { nv_warning_msg("The attribute '%s' specified %s cannot be " "assigned; frame lock sync is currently " "enabled on %s.", a->name, whence, t->name); continue; } } } /* * To properly handle SDI (GVO) attributes, we just need to make * sure that GVO is supported by the handle. */ if (a->flags & NV_PARSER_TYPE_SDI && target_type != NV_CTRL_TARGET_TYPE_GVI) { int available; status = NvCtrlGetAttribute(t->h, NV_CTRL_GVO_SUPPORTED, &available); if (status != NvCtrlSuccess) { nv_error_msg("The attribute '%s' specified %s cannot be " "%s; error querying SDI availability on " "%s (%s).", a->name, whence, assign ? "assigned" : "queried", t->name, NvCtrlAttributesStrError(status)); continue; } if (available != NV_CTRL_GVO_SUPPORTED_TRUE) { nv_error_msg("The attribute '%s' specified %s cannot be %s; " "SDI is not supported/available on %s.", a->name, whence, assign ? "assigned" : "queried", t->name); continue; } } /* Special case the GVO CSC attribute */ if (a->flags & NV_PARSER_TYPE_SDI_CSC) { float colorMatrix[3][3]; float colorOffset[3]; float colorScale[3]; int r, c; if (assign) { /* Make sure the standard is known */ if (!a->val.pf) { nv_error_msg("The attribute '%s' specified %s cannot be " "assigned; valid values are \"ITU_601\", " "\"ITU_709\", \"ITU_177\", and \"Identity\".", a->name, whence); continue; } for (r = 0; r < 3; r++) { for (c = 0; c < 3; c++) { colorMatrix[r][c] = a->val.pf[r*5 + c]; } colorOffset[r] = a->val.pf[r*5 + 3]; colorScale[r] = a->val.pf[r*5 + 4]; } status = NvCtrlSetGvoColorConversion(t->h, colorMatrix, colorOffset, colorScale); } else { status = NvCtrlGetGvoColorConversion(t->h, colorMatrix, colorOffset, colorScale); } if (status != NvCtrlSuccess) { nv_error_msg("The attribute '%s' specified %s cannot be " "%s; error on %s (%s).", a->name, whence, assign ? "assigned" : "queried", t->name, NvCtrlAttributesStrError(status)); continue; } /* Print results */ if (!assign) { #define INDENT " " nv_msg(INDENT, " Red Green Blue Offset Scale"); nv_msg(INDENT, "----------------------------------------------------"); nv_msg(INDENT, " Y % -.6f % -.6f % -.6f % -.6f % -.6f", colorMatrix[0][0], colorMatrix[0][1], colorMatrix[0][2], colorOffset[0], colorScale[0]); nv_msg(INDENT, "Cr % -.6f % -.6f % -.6f % -.6f % -.6f", colorMatrix[1][0], colorMatrix[1][1], colorMatrix[1][2], colorOffset[1], colorScale[1]); nv_msg(INDENT, "Cb % -.6f % -.6f % -.6f % -.6f % -.6f", colorMatrix[2][0], colorMatrix[2][1], colorMatrix[2][2], colorOffset[2], colorScale[2]); #undef INDENT } continue; } /* * special case the display device mask in the case that it * was "hijacked" for something other than a display device: * assign mask here so that it will be passed through to * process_parsed_attribute_internal() unfiltered */ if (a->flags & NV_PARSER_TYPE_HIJACK_DISPLAY_DEVICE) { mask = a->display_device_mask; } else { mask = 0; } if (a->flags & NV_PARSER_TYPE_STRING_ATTRIBUTE) { status = NvCtrlGetValidStringDisplayAttributeValues(t->h, mask, a->attr, &valid); } else { status = NvCtrlGetValidDisplayAttributeValues(t->h, mask, a->attr, &valid); } if (status != NvCtrlSuccess) { if (status == NvCtrlAttributeNotAvailable) { nv_warning_msg("Attribute '%s' specified %s is not " "available on %s.", a->name, whence, t->name); } else { nv_error_msg("Error querying valid values for attribute " "'%s' on %s specified %s (%s).", a->name, t->name, whence, NvCtrlAttributesStrError(status)); } continue; } /* * if this attribute is going to be assigned, then check * that the attribute is writable; if it's not, give up */ if (assign && !(valid.permissions & ATTRIBUTE_TYPE_WRITE)) { nv_error_msg("The attribute '%s' specified %s cannot be " "assigned (it is a read-only attribute).", a->name, whence); continue; } ret = process_parsed_attribute_internal(h, t, a, mask, target_type, assign, verbose, whence, valid); if (ret == NV_FALSE) { continue; } } /* done looping over requested targets */ val = NV_TRUE; done: if (whence) free(whence); return val; } /* nv_process_parsed_attribute() */ nvidia-settings/src/parse.h0000664000175000017500000002773712236467170016134 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * parse.h - prototypes and definitions for the parser. */ #ifndef __PARSE_H__ #define __PARSE_H__ /* * Flag values used in the flags field of the ParsedAttribute struct. */ #define NV_PARSER_HAS_X_DISPLAY (1<<0) #define NV_PARSER_HAS_TARGET (1<<2) #define NV_PARSER_HAS_DISPLAY_DEVICE (1<<3) #define NV_PARSER_HAS_VAL (1<<4) /* * Flag values used in the flags field of the AttributeTableEntry struct. */ #define NV_PARSER_TYPE_HIJACK_DISPLAY_DEVICE (1<<15) #define NV_PARSER_TYPE_FRAMELOCK (1<<16) #define NV_PARSER_TYPE_COLOR_ATTRIBUTE (1<<17) #define NV_PARSER_TYPE_NO_CONFIG_WRITE (1<<18) #define NV_PARSER_TYPE_GUI_ATTRIBUTE (1<<19) #define NV_PARSER_TYPE_PACKED_ATTRIBUTE (1<<20) #define NV_PARSER_TYPE_VALUE_IS_DISPLAY (1<<21) #define NV_PARSER_TYPE_NO_QUERY_ALL (1<<22) #define NV_PARSER_TYPE_NO_ZERO_VALUE (1<<23) #define NV_PARSER_TYPE_100Hz (1<<24) #define NV_PARSER_TYPE_STRING_ATTRIBUTE (1<<25) #define NV_PARSER_TYPE_ASSIGN_ALL_DISPLAYS (1<<26) #define NV_PARSER_TYPE_VALUE_IS_SWITCH_DISPLAY (1<<27) #define NV_PARSER_TYPE_1000Hz (1<<28) #define NV_PARSER_TYPE_SDI (1<<29) #define NV_PARSER_TYPE_SDI_CSC (1<<30) #define NV_PARSER_TYPE_VALUE_IS_DISPLAY_ID (1<<31) #define NV_PARSER_ASSIGNMENT 0 #define NV_PARSER_QUERY 1 #define NV_PARSER_MAX_NAME_LEN 256 #define DISPLAY_NAME_SEPARATOR '/' /* * error codes returned by nv_parse_attribute_string(). */ #define NV_PARSER_STATUS_SUCCESS 0 #define NV_PARSER_STATUS_BAD_ARGUMENT 1 #define NV_PARSER_STATUS_EMPTY_STRING 2 #define NV_PARSER_STATUS_ATTR_NAME_TOO_LONG 3 #define NV_PARSER_STATUS_ATTR_NAME_MISSING 4 #define NV_PARSER_STATUS_BAD_DISPLAY_DEVICE 5 #define NV_PARSER_STATUS_MISSING_EQUAL_SIGN 6 #define NV_PARSER_STATUS_NO_VALUE 7 #define NV_PARSER_STATUS_TRAILING_GARBAGE 8 #define NV_PARSER_STATUS_UNKNOWN_ATTR_NAME 9 #define NV_PARSER_STATUS_MISSING_COMMA 10 #define NV_PARSER_STATUS_TARGET_SPEC_NO_COLON 11 #define NV_PARSER_STATUS_TARGET_SPEC_BAD_TARGET 12 #define NV_PARSER_STATUS_TARGET_SPEC_NO_TARGET_ID 13 #define NV_PARSER_STATUS_TARGET_SPEC_BAD_TARGET_ID 14 #define NV_PARSER_STATUS_TARGET_SPEC_TRAILING_GARBAGE 15 #define NV_PARSER_STATUS_TARGET_SPEC_NO_TARGETS 16 /* * define useful types */ typedef unsigned int uint32; /* * The valid attribute names, and their corresponding protocol * attribute identifiers are stored in an array of * AttributeTableEntries. */ typedef struct _AttributeTableEntry { char *name; int attr; uint32 flags; char *desc; } AttributeTableEntry; /* * ParsedAttribute - struct filled out by * nv_parse_attribute_string(). */ typedef struct _ParsedAttribute { char *display; char *name; char *target_specification; /* * The target_type and target_id here are mostly set by the GUI to store * target-specific information, as well as the cmd line for handling the * case where an X screen is specified as part of the display (e.g. * "localhost:0.1"). Note that if the target_specification is specified, * the target_type and target_id are ignored when resolving to the list of * targets that should be operated on. */ int target_type; int target_id; char *target_name; int attr; union { int i; float f; const float *pf; char *str; } val; uint32 display_device_mask; uint32 flags; struct _ParsedAttribute *next; /* * Upon being resolved, the ParsedAttribute's target_type and target_id, * and/or target_specification get converted into a list of targets to * which the attribute should be processed. */ struct _CtrlHandleTargetNode *targets; } ParsedAttribute; /* * Attribute table; defined in parse.c */ extern const AttributeTableEntry attributeTable[]; /* * Indices into both targetTypeTable[] and CtrlHandles->targets[] array; stored * in TargetTypeEntry.target_index. */ #define X_SCREEN_TARGET 0 #define GPU_TARGET 1 #define FRAMELOCK_TARGET 2 #define VCS_TARGET 3 #define GVI_TARGET 4 #define COOLER_TARGET 5 #define THERMAL_SENSOR_TARGET 6 #define NVIDIA_3D_VISION_PRO_TRANSCEIVER_TARGET 7 #define DISPLAY_TARGET 8 #define MAX_TARGET_TYPES 9 /* * TargetTypeEntry - an array of these structures defines the values * associated with each target type. */ typedef struct { char *name; /* string describing the TargetType */ char *parsed_name; /* name used by parser */ int target_index; /* index into the CtrlHandles->targets[] array */ int nvctrl; /* NV-CONTROL target type value (NV_CTRL_TARGET_TYPE) */ /* flag set in NVCTRLAttributeValidValuesRec.permissions */ unsigned int permission_bit; /* whether this target type is aware of display devices */ int uses_display_devices; /* * the minimum NV-CONTROL Protocol version required to use this target * type; note that all future target types should be able to use 1.18, * since that version and later allows NV-CONTROL clients to query the * count of TargetTypes not recognized by the X server */ int major; int minor; } TargetTypeEntry; /* * TargetType table; defined in parse.c */ extern const TargetTypeEntry targetTypeTable[]; extern const int targetTypeTableLen; /* * accessor functions for getting target type info based on NV-CONTROL * attribute type or by a name. */ const TargetTypeEntry *nv_get_target_type_entry_by_nvctrl(int nvctrl); const TargetTypeEntry *nv_get_target_type_entry_by_name(const char *name); /* nv_get_sdi_csc_matrxi() - Returns an array of floats that specifies * all the color, offset and scale values for specifying one of the * Standard CSC. 's' is a string that names the matrix values to return. * The values are placed in the float buffer like so: * * { YR, YG, YB, YOffset, YScale, * CrR, CrG, CrB, CrOffset, CrScale, * CbR, CbG, CbB, CbOffset, CbScale } * */ const float * nv_get_sdi_csc_matrix(char *s); /* * nv_parse_attribute_string() - this function parses an attribute * string, the syntax for which is: * * {host}:{display}.{screen}/{attribute name}[{display devices}]={value} * * {host}:{display}.{screen} indicates which X server and X screen to * interact with; this is optional. If no X server is specified, then * the default X server is used. If no X screen is specified, then * all X screens on the X server are used. * * {screen}/ may be specified by itself (i.e.: without the * "{host}:{display}." part). * * Additionally, instead of specifying a screen, a target * specification (target type and id) may be given in brackets: * * [{target-type}:{target-id}]/{attribute name}... * * This can be used in place of "{screen}" when it is used by itself * on the left of the "/"; or, it can take the place of ".{screen}" * when used along with an X Display name: * * {host}:{display}[{target-type}:{target-id}]/{attribute name}... * * {attribute name} should be a string without any whitespace (a case * insensitive compare will be done to find a match in the * attributeTable in parse.c). {value} should be an integer. * * {display devices} is optional. If no display mask is specified, * then all display devices are assumed. * * The query parameter controls whether the attribute string is parsed * for setting or querying. If query == NV_PARSER_SET, then the * attribute string will be interpreted as described above. If query * == NV_PARSER_QUERY, the "={value}" portion of the string should be * omitted. * * If successful, NV_PARSER_STATUS_SUCCESS will be returned and the * ParsedAttribute struct will contain the attribute id corresponding * to the attribute name. If the X server or display devices were * given in the string, then those fields will be appropriately * assigned in the ParsedAttribute struct, and the * NV_PARSER_HAS_X_SERVER and NV_PARSER_HAS_DISPLAY_DEVICE_MASK bits * will be set in the flags field. */ int nv_parse_attribute_string(const char *, int, ParsedAttribute *); /* * nv_assign_default_display() - assigns the display name to the * ParsedAttribute struct. As a side affect, also assigns the screen * field, if a screen is specified in the display name. */ void nv_assign_default_display(ParsedAttribute *a, const char *display); /* * nv_parse_strerror() - given the error status returned by * nv_parse_attribute_string(), this function returns a string * describing the error. */ const char *nv_parse_strerror(int); int nv_strcasecmp(const char *, const char *); char *remove_spaces(const char *o); char *replace_characters(const char *o, const char c, const char r); /* * display_mask/display_name conversions: the NV-CONTROL X extension * identifies a display device by a bit in a display device mask. The * below functions translate between a display mask, and a string * describing the display devices. */ #define BITSHIFT_CRT 0 #define BITSHIFT_TV 8 #define BITSHIFT_DFP 16 #define BITMASK_ALL_CRT (0xff << BITSHIFT_CRT) #define BITMASK_ALL_TV (0xff << BITSHIFT_TV) #define BITMASK_ALL_DFP (0xff << BITSHIFT_DFP) #define INVALID_DISPLAY_DEVICE_MASK (0xffffffff) #define VALID_DISPLAY_DEVICES_MASK (0x00ffffff) #define DISPLAY_DEVICES_WILDCARD_MASK (0xff000000) #define DISPLAY_DEVICES_WILDCARD_CRT (1 << 24) #define DISPLAY_DEVICES_WILDCARD_TV (1 << 25) #define DISPLAY_DEVICES_WILDCARD_DFP (1 << 26) char *display_device_mask_to_display_device_name(const uint32); uint32 expand_display_device_mask_wildcards(const uint32); ParsedAttribute *nv_parsed_attribute_init(void); void nv_parsed_attribute_add(ParsedAttribute *head, ParsedAttribute *a); void nv_parsed_attribute_free(ParsedAttribute *p); void nv_parsed_attribute_clean(ParsedAttribute *p); const char *nv_get_attribute_name(const int attr, const int flagsMask, const int flags); char *nv_standardize_screen_name(const char *display_name, int screen); /* General parsing functions */ int nv_parse_numerical(const char *start, const char *end, int *val); const char *parse_skip_whitespace(const char *str); void parse_chop_whitespace(char *str); const char *parse_skip_integer(const char *str); const char *parse_read_integer(const char *str, int *num); const char *parse_read_integer_pair(const char *str, const char separator, int *a, int *b); const char *parse_read_name(const char *str, char **name, char term); const char *parse_read_display_name(const char *str, unsigned int *mask); const char *parse_read_display_id(const char *str, unsigned int *id); int parse_read_float_range(const char *str, float *min, float *max); int count_number_of_bits(unsigned int mask); /* Token parsing functions */ typedef void (* apply_token_func)(char *token, char *value, void *data); int parse_token_value_pairs(const char *str, apply_token_func func, void *data); #endif /* __PARSE_H__ */ nvidia-settings/src/gen-manpage-opts.c0000664000175000017500000000173012236467170020140 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2010 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include "nvgetopt.h" #include "option-table.h" #include "gen-manpage-opts-helper.h" int main(void) { gen_manpage_opts_helper(__options); return 0; } nvidia-settings/src/command-line.h0000664000175000017500000000645512236467170017357 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __COMMAND_LINE_H__ #define __COMMAND_LINE_H__ #include "common-utils.h" /* * Forward declaration to break circular dependancy with query-assign.h */ struct _CtrlHandlesArray; #define DEFAULT_RC_FILE "~/.nvidia-settings-rc" #define CONFIG_FILE_OPTION 1 /* * Options structure -- stores the parameters specified on the * commandline. */ typedef struct { char *ctrl_display; /* * The name of the display to control * (doesn't have to be the same as the * display on which the gui is shown */ char *config; /* * The name of the configuration file (to be * read from, and to be written to); defaults * to the value of the constant * DEFAULT_RC_FILE. */ char **assignments; /* * Dynamically allocated array of assignment * strings specified on the commandline. */ int num_assignments; /* * Number of assignment strings in the * assignment array. */ char **queries; /* * Dynamically allocated array of query * strings specified on the commandline. */ int num_queries; /* * Number of query strings in the query * array. */ int only_load; /* * If true, just read the configuration file, * send the attributes to the X server, and * exit. */ int no_load; /* * If true, do not load the configuration file. * The attributes are not sent to the X Server. */ int rewrite; /* * If true, write the X server configuration * to the configuration file and exit. */ char *page; /* * The default page to display in the GUI * when started. */ } Options; Options *parse_command_line(int argc, char *argv[], char *dpy, struct _CtrlHandlesArray *handles_array); #endif /* __COMMAND_LINE_H__ */ nvidia-settings/src/app-profiles.c0000664000175000017500000021564512236467170017413 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2013 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * app-profiles.c - this source file contains functions for querying and * assigning application profile settings, as well as parsing and saving * application profile configuration files. */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include "common-utils.h" #include "app-profiles.h" #include "msg.h" static char *slurp(FILE *fp) { int eof = FALSE; char *text = strdup(""); char *new_text; char *line = NULL; while (text && !eof) { line = fget_next_line(fp, &eof); if (!eof) { new_text = nvstrcat(text, "\n", line, NULL); free(text); text = new_text; } } free(line); return text; } static void splice_string(char **s, size_t b, size_t e, const char *replace) { char *tail = strdup(*s + e); *s = realloc(*s, b + strlen(replace) + strlen(tail) + 1); if (!*s) { return; } sprintf(*s + b, "%s%s", replace, tail); free(tail); } #define HEX_DIGITS "0123456789abcdefABCDEF" char *nv_app_profile_cfg_file_syntax_to_json(const char *orig_s) { char *s = strdup(orig_s); int quoted = FALSE; char *tok; size_t start, end, size; unsigned long long val; char *old_substr = NULL; char *endptr; char *new_substr = NULL; tok = s; while ((tok = strpbrk(tok, "\\\"#" HEX_DIGITS))) { switch (*tok) { case '\"': // Quotation mark quoted = !quoted; tok++; break; case '\\': // Escaped character tok++; if (*tok) { tok++; } break; case '#': // Comment if (!quoted) { char *end_tok = nvstrchrnul(tok, '\n'); start = tok - s; end = end_tok - s; splice_string(&s, start, end, ""); if (!s) { goto fail; } tok = s + start; } else { tok++; } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': // Numeric value size = strspn(tok, "Xx." HEX_DIGITS); if ((tok[0] == '0') && (tok[1] == 'x' || tok[1] == 'X' || isdigit(tok[1])) && !quoted) { old_substr = nvstrndup(tok, size); if (!old_substr) { goto fail; } errno = 0; val = strtoull(old_substr, &endptr, 0); if (errno || (endptr - old_substr != strlen(old_substr))) { // Invalid conversion, skip this string tok += size; free(old_substr); old_substr = NULL; } else { new_substr = nvasprintf("%llu", val); if (!new_substr) { goto fail; } else { start = tok - s; end = tok - s + size; splice_string(&s, start, end, new_substr); free(new_substr); new_substr = NULL; free(old_substr); old_substr = NULL; tok = s + start; } } } else { // Not hex or octal; let the JSON parser deal with it tok += size; } break; default: assert(!"Unhandled character"); break; } } assert(!new_substr); assert(!old_substr); return s; fail: free(old_substr); free(new_substr); free(s); return NULL; } static int open_and_stat(const char *filename, const char *perms, FILE **fp, struct stat *stat_buf) { int ret; *fp = fopen(filename, perms); if (!*fp) { if (errno != ENOENT) { nv_error_msg("Could not open file %s (%s)", filename, strerror(errno)); } return -1; } ret = fstat(fileno(*fp), stat_buf); if (ret == -1) { nv_error_msg("Could not stat file %s (%s)", filename, strerror(errno)); fclose(*fp); } return ret; } static char *nv_dirname(const char *path) { char *last_slash = strrchr(path, '/'); if (last_slash) { return nvstrndup(path, last_slash - path); } else { return nvstrdup("."); } } static json_t *app_profile_config_insert_file_object(AppProfileConfig *config, json_t *new_file) { json_t *json_filename, *json_new_filename; char *dirname; const char *filename, *new_filename; json_t *file; json_t *order, *file_order; size_t new_file_major, new_file_minor, file_order_major, file_order_minor; size_t i; size_t num_files; json_new_filename = json_object_get(new_file, "filename"); assert(json_new_filename); new_filename = json_string_value(json_new_filename); assert(nv_app_profile_config_check_valid_source_file(config, new_filename, NULL)); // Determine the correct location of the file in the search path dirname = NULL; new_file_major = -1; for (i = 0; i < config->search_path_count; i++) { if (!strcmp(new_filename, config->search_path[i])) { new_file_major = i; break; } else { if (!dirname) { dirname = nv_dirname(new_filename); } if (!strcmp(dirname, config->search_path[i])) { new_file_major = i; break; } } } free(dirname); new_file_minor = 0; num_files = json_array_size(config->parsed_files); for (i = 0; i < num_files; i++) { file = json_array_get(config->parsed_files, i); file_order = json_object_get(file, "order"); file_order_major = json_integer_value(json_object_get(file_order, "major")); file_order_minor = json_integer_value(json_object_get(file_order, "minor")); json_filename = json_object_get(file, "filename"); assert(json_filename); filename = json_string_value(json_filename); if (file_order_major < new_file_major) { } else if (file_order_major == new_file_major) { if (strcoll(filename, new_filename) > 0) { break; } new_file_minor++; } else { break; } } // Mark the order of the file order = json_object_get(new_file, "order"); json_object_set_new(order, "major", json_integer(new_file_major)); json_object_set_new(order, "minor", json_integer(new_file_minor)); // Add the new file json_array_insert(config->parsed_files, i, new_file); // Bump up minor for files after this one with the same major num_files = json_array_size(config->parsed_files); for ( ; i < num_files; i++) { file = json_array_get(config->parsed_files, i); file_order = json_object_get(file, "order"); file_order_major = json_integer_value(json_object_get(order, "major")); file_order_minor = json_integer_value(json_object_get(order, "minor")); if (file_order_major > new_file_major) { break; } json_object_set_new(file_order, "minor", json_integer(file_order_minor+1)); } return new_file; } /* * Create a new empty file object and adds it to the configuration. */ static json_t *app_profile_config_new_file(AppProfileConfig *config, const char *filename) { json_t *new_file = json_object(); json_object_set_new(new_file, "filename", json_string(filename)); json_object_set_new(new_file, "rules", json_array()); json_object_set_new(new_file, "profiles", json_object()); json_object_set_new(new_file, "dirty", json_false()); json_object_set_new(new_file, "new", json_true()); // order is set by app_profile_config_insert_file_object() below new_file = app_profile_config_insert_file_object(config, new_file); return new_file; } static char *rule_id_to_key_string(int id) { char *key; key = nvasprintf("%d", id); return key; } /* * Constructs a profile name that is guaranteed to be unique to this * configuration. This is used to handle the case where there are multiple * profiles with the same name (an invalid configuration). */ static char *app_profile_config_unique_profile_name(AppProfileConfig *config, const char *orig_name, const char *filename, int do_warn, int *needs_dirty) { json_t *json_gold_filename = json_object_get(config->profile_locations, orig_name); if (json_gold_filename) { int i = 0; char *new_name = NULL; do { free(new_name); new_name = nvasprintf("%s_duplicate_%d", orig_name, i++); } while (new_name && json_object_get(config->profile_locations, new_name)); if (do_warn) { nv_error_msg("The profile \"%s\" in the file \"%s\" has the same name " "as a profile defined in the file \"%s\", and will be renamed to \"%s\".", orig_name, filename, json_string_value(json_gold_filename), new_name); } if (needs_dirty) { *needs_dirty = TRUE; } return new_name; } else { return strdup(orig_name); } } char *nv_app_profile_config_get_unused_profile_name(AppProfileConfig *config) { char *temp_name, *unique_name; int salt = rand(); temp_name = nvasprintf("profile_%x", salt); unique_name = app_profile_config_unique_profile_name(config, temp_name, NULL, FALSE, NULL); free(temp_name); return unique_name; } static json_t *json_settings_parse(json_t *old_settings, const char *filename) { int uses_setting_objects; size_t i, size; json_t *old_setting; json_t *new_settings, *new_setting; json_t *json_key, *json_value; if (!json_is_array(old_settings)) { return NULL; } new_settings = json_array(); uses_setting_objects = json_array_size(old_settings) && json_is_object(json_array_get(old_settings, 0)); for (i = 0, size = json_array_size(old_settings); i < size; ) { old_setting = json_array_get(old_settings, i++); if (uses_setting_objects) { json_key = json_object_get(old_setting, "key"); if (!json_key) { json_key = json_object_get(old_setting, "k"); } json_value = json_object_get(old_setting, "value"); if (!json_value) { json_value = json_object_get(old_setting, "v"); } } else { if (i >= size) { nv_error_msg("App profile parse error in %s: Key/value array of odd length\n", filename); json_decref(new_settings); return NULL; } json_key = old_setting; json_value = json_array_get(old_settings, i++); } if (!json_is_string(json_key)) { nv_error_msg("App profile parse error in %s: Invalid key detected in settings array\n", filename); json_decref(new_settings); return NULL; } if (!json_is_integer(json_value) && !json_is_real(json_value) && !json_is_true(json_value) && !json_is_false(json_value) && !json_is_string(json_value)) { nv_error_msg("App profile parse error in %s: Invalid value detected in settings array\n", filename); json_decref(new_settings); return NULL; } new_setting = json_object(); json_object_set(new_setting, "key", json_key); json_object_set(new_setting, "value", json_value); json_array_append_new(new_settings, new_setting); } return new_settings; } /* * Load app profile settings from an already-open file. This operation is * atomic: either all of the settings from the file are added to the * configuration, or none are. */ static void app_profile_config_load_file(AppProfileConfig *config, const char *filename, struct stat *stat_buf, FILE *fp) { char *json_text = NULL; char *orig_text = NULL; size_t i, size; json_error_t error; json_t *orig_file = NULL; json_t *orig_json_profiles, *orig_json_rules; int next_free_rule_id = config->next_free_rule_id; int dirty = FALSE; json_t *new_file = NULL; json_t *new_json_profiles = NULL; json_t *new_json_rules = NULL; if (!S_ISREG(stat_buf->st_mode)) { // Silently ignore all but regular files goto done; } orig_text = slurp(fp); if (!orig_text) { nv_error_msg("Could not read from file %s", filename); goto done; } // Convert the file contents to JSON json_text = nv_app_profile_cfg_file_syntax_to_json(orig_text); if (!json_text) { nv_error_msg("App profile parse error in %s: text is not valid app profile configuration syntax", filename); goto done; } new_file = json_object(); json_object_set_new(new_file, "dirty", json_false()); json_object_set_new(new_file, "filename", json_string(filename)); new_json_profiles = json_object(); new_json_rules = json_array(); // Parse the resulting JSON orig_file = json_loads(json_text, 0, &error); if (!orig_file) { nv_error_msg("App profile parse error in %s: %s on %s, line %d\n", filename, error.text, error.source, error.line); goto done; } if (!json_is_object(orig_file)) { nv_error_msg("App profile parse error in %s: top-level config not an object!\n", filename); goto done; } orig_json_profiles = json_object_get(orig_file, "profiles"); if (orig_json_profiles) { /* * Note: we store profiles internally as members of an object, but the * config file syntax uses an array to store profiles. */ if (!json_is_array(orig_json_profiles)) { nv_error_msg("App profile parse error in %s: profiles value is not an array\n", filename); goto done; } size = json_array_size(orig_json_profiles); for (i = 0; i < size; i++) { const char *new_name; json_t *orig_json_profile, *orig_json_name, *orig_json_settings; json_t *new_json_profile, *new_json_settings; new_json_profile = json_object(); orig_json_profile = json_array_get(orig_json_profiles, i); if (!json_is_object(orig_json_profile)) { goto done; } orig_json_name = json_object_get(orig_json_profile, "name"); if (!json_is_string(orig_json_name)) { goto done; } orig_json_settings = json_object_get(orig_json_profile, "settings"); new_json_settings = json_settings_parse(orig_json_settings, filename); if (!new_json_settings) { goto done; } new_name = app_profile_config_unique_profile_name(config, json_string_value(orig_json_name), filename, TRUE, &dirty); json_object_set_new(new_json_profile, "settings", new_json_settings); json_object_set_new(new_json_profiles, new_name, new_json_profile); } } orig_json_rules = json_object_get(orig_file, "rules"); if (orig_json_rules) { if (!json_is_array(orig_json_rules)) { nv_error_msg("App profile parse error in %s: rules value is not an array\n", filename); goto done; } size = json_array_size(orig_json_rules); for (i = 0; i < size; i++) { int new_id; char *profile_name; json_t *orig_json_rule, *orig_json_pattern, *orig_json_profile; json_t *new_json_rule, *new_json_pattern; orig_json_rule = json_array_get(orig_json_rules, i); if (!json_is_object(orig_json_rule)) { goto done; } new_id = next_free_rule_id++; new_json_rule = json_object(); new_json_pattern = json_object(); orig_json_pattern = json_object_get(orig_json_rule, "pattern"); if (json_is_object(orig_json_pattern)) { // pattern object json_t *orig_json_feature, *orig_json_matches; orig_json_feature = json_object_get(orig_json_pattern, "feature"); if (!json_is_string(orig_json_feature)) { json_decref(new_json_rule); json_decref(new_json_pattern); goto done; } orig_json_matches = json_object_get(orig_json_pattern, "matches"); if (!json_is_string(orig_json_matches)) { json_decref(new_json_rule); json_decref(new_json_pattern); goto done; } json_object_set(new_json_pattern, "feature", orig_json_feature); json_object_set(new_json_pattern, "matches", orig_json_matches); } else if (json_is_string(orig_json_pattern)) { // procname json_object_set_new(new_json_pattern, "feature", json_string("procname")); json_object_set(new_json_pattern, "matches", orig_json_pattern); } else { json_decref(new_json_rule); json_decref(new_json_pattern); goto done; } json_object_set_new(new_json_rule, "pattern", new_json_pattern); orig_json_profile = json_object_get(orig_json_rule, "profile"); if (json_is_object(orig_json_profile) || json_is_array(orig_json_profile)) { // inline profile object json_t *new_json_profile; json_t *orig_json_settings, *orig_json_name; json_t *new_json_settings; if (json_is_object(orig_json_profile)) { orig_json_settings = json_object_get(orig_json_profile, "settings"); orig_json_name = json_object_get(orig_json_profile, "name"); } else { // must be array orig_json_settings = orig_json_profile; orig_json_name = NULL; } if (json_is_string(orig_json_name)) { profile_name = app_profile_config_unique_profile_name(config, json_string_value(orig_json_name), filename, TRUE, &dirty); } else if (!orig_json_name) { char *profile_name_template; profile_name_template = nvasprintf("inline_%d", new_id); profile_name = app_profile_config_unique_profile_name(config, profile_name_template, filename, FALSE, &dirty); free(profile_name_template); } else { json_decref(new_json_rule); goto done; } new_json_settings = json_settings_parse(orig_json_settings, filename); if (!profile_name || !new_json_settings) { free(profile_name); json_decref(new_json_settings); json_decref(new_json_rule); goto done; } new_json_profile = json_object(); json_object_set_new(new_json_profile, "settings", new_json_settings); json_object_set_new(new_json_profiles, profile_name, new_json_profile); } else if (json_is_string(orig_json_profile)) { // named profile profile_name = strdup(json_string_value(orig_json_profile)); } else { json_decref(new_json_rule); goto done; } json_object_set_new(new_json_rule, "profile", json_string(profile_name)); free(profile_name); json_object_set_new(new_json_rule, "id", json_integer(new_id)); json_array_append_new(new_json_rules, new_json_rule); } } json_object_set(new_file, "profiles", new_json_profiles); json_object_set(new_file, "rules", new_json_rules); json_object_set_new(new_file, "dirty", dirty ? json_true() : json_false()); json_object_set_new(new_file, "new", json_false()); // Don't use the atime in the stat_buf; instead measure it here json_object_set_new(new_file, "atime", json_integer(time(NULL))); // If we didn't fail anywhere above, add the file to our configuration app_profile_config_insert_file_object(config, new_file); // Add the profiles in this file to the global profiles list { const char *key; json_t *value; json_object_foreach(new_json_profiles, key, value) { json_object_set_new(config->profile_locations, key, json_string(filename)); } } // Add the rules in this file to the global rules list size = json_array_size(new_json_rules); for (i = 0; i < size; i++) { char *key; json_t *new_rule; new_rule = json_array_get(new_json_rules, i); key = rule_id_to_key_string(json_integer_value(json_object_get(new_rule, "id"))); json_object_set_new(config->rule_locations, key, json_string(filename)); free(key); } config->next_free_rule_id = next_free_rule_id; done: json_decref(orig_file); json_decref(new_file); json_decref(new_json_rules); json_decref(new_json_profiles); free(json_text); free(orig_text); } // Load app profile settings from a directory static void app_profile_config_load_files_from_directory(AppProfileConfig *config, const char *dirname) { FILE *fp; struct stat stat_buf; struct dirent **namelist; int i, n, ret; n = scandir(dirname, &namelist, NULL, alphasort); if (n < 0) { nv_error_msg("Failed to open directory \"%s\"", dirname); return; } for (i = 0; i < n; i++) { char *d_name = namelist[i]->d_name; char *full_path; // Skip "." and ".." if ((d_name[0] == '.') && ((d_name[1] == '\0') || ((d_name[1] == '.') && (d_name[2] == '\0')))) { continue; } full_path = nvstrcat(dirname, "/", d_name, NULL); ret = open_and_stat(full_path, "r", &fp, &stat_buf); if (ret < 0) { free(full_path); free(namelist[i]); continue; } app_profile_config_load_file(config, full_path, &stat_buf, fp); fclose(fp); free(full_path); free(namelist[i]); } free(namelist); } static json_t *app_profile_config_load_global_options(const char *global_config_file) { json_error_t error; json_t *options = json_object(); int ret; FILE *fp; struct stat stat_buf; char *option_text; json_t *options_from_file; json_t *option; // By default, app profiles are enabled json_object_set_new(options, "enabled", json_true()); if (!global_config_file) { return options; } ret = open_and_stat(global_config_file, "r", &fp, &stat_buf); if ((ret < 0) || !S_ISREG(stat_buf.st_mode)) { return options; } option_text = slurp(fp); fclose(fp); options_from_file = json_loads(option_text, 0, &error); free(option_text); if (!options_from_file) { nv_error_msg("App profile parse error in %s: %s on %s, line %d\n", global_config_file, error.text, error.source, error.line); return options; } // Load the "enabled" option option = json_object_get(options_from_file, "enabled"); if (option && (json_is_true(option) || json_is_false(option))) { json_object_set(options, "enabled", option); } json_decref(options_from_file); return options; } AppProfileConfig *nv_app_profile_config_load(const char *global_config_file, char **search_path, size_t search_path_count) { size_t i; AppProfileConfig *config = malloc(sizeof(AppProfileConfig)); if (!config) { return NULL; } // Initialize the config config->next_free_rule_id = 0; config->parsed_files = json_array(); config->profile_locations = json_object(); config->rule_locations = json_object(); if (global_config_file) { config->global_config_file = nvstrdup(global_config_file); } else { config->global_config_file = NULL; } config->global_options = app_profile_config_load_global_options(global_config_file); config->search_path = malloc(sizeof(char *) * search_path_count); config->search_path_count = search_path_count; for (i = 0; i < search_path_count; i++) { config->search_path[i] = strdup(search_path[i]); } for (i = 0; i < search_path_count; i++) { int ret; struct stat stat_buf; const char *filename = search_path[i]; FILE *fp; ret = open_and_stat(filename, "r", &fp, &stat_buf); if (ret < 0) { continue; } if (S_ISDIR(stat_buf.st_mode)) { // Parse files in the directory fclose(fp); app_profile_config_load_files_from_directory(config, filename); } else { // Load the individual file app_profile_config_load_file(config, filename, &stat_buf, fp); fclose(fp); continue; } } return config; } static int file_in_search_path(AppProfileConfig *config, const char *filename) { size_t i; for (i = 0; i < config->search_path_count; i++) { if (!strcmp(filename, config->search_path[i])) { return TRUE; } } return FALSE; } // Print an error message and optionally capture the error string for later use // Note: this assumes fmt is a string literal! #define LOG_ERROR(error_str, fmt, ...) do { \ if (error_str) { \ nv_append_sprintf(error_str, fmt "\n", __VA_ARGS__); \ } \ nv_error_msg(fmt, __VA_ARGS__); \ } while (0) /* * Creates parent directories as needed, similarly to "mkdir -p" */ static int nv_mkdirp(const char *dirname, char **error_str) { int ret = 0; char *parent_name; const char *cur, *next; struct stat stat_buf; cur = dirname; while (*cur && (next = strchr(cur + 1, '/'))) { parent_name = nvstrndup(dirname, next - dirname); ret = mkdir(parent_name, 0777); if ((ret < 0) && (errno != EEXIST)) { LOG_ERROR(error_str, "Could not create parent directory \"%s\" " "for full path \"%s\" (%s)", parent_name, dirname, strerror(errno)); free(parent_name); return ret; } cur = next; free(parent_name); } ret = mkdir(dirname, 0777); if (ret < 0) { if (errno != EEXIST) { LOG_ERROR(error_str, "Could not create directory \"%s\" (%s)", dirname, strerror(errno)); } else { ret = stat(dirname, &stat_buf); if (ret == 0) { if (!S_ISDIR(stat_buf.st_mode)) { LOG_ERROR(error_str, "Could not create directory \"%s\" " "(file exists, but not as a directory)", dirname); ret = -1; } } } } return ret; } char *nv_app_profile_config_get_backup_filename(AppProfileConfig *config, const char *filename) { char *basename = NULL; char *dirname = NULL; char *backup_name = NULL; if ((config->global_config_file && !strcmp(config->global_config_file, filename)) || file_in_search_path(config, filename)) { // Files in the top-level search path, and the global config file, can // be renamed from "$FILE" to "$FILE.backup" without affecting the // configuration backup_name = nvasprintf("%s.backup", filename); } else { // Files in a search path directory *cannot* be renamed from "$FILE" to // "$FILE.backup" without affecting the configuration due to the search // path rules. Instead, attempt to move them to a subdirectory called // ".backup". dirname = nv_dirname(filename); basename = nv_basename(filename); assert(file_in_search_path(config, dirname)); backup_name = nvasprintf("%s/.backup/%s", dirname, basename); } free(dirname); free(basename); return backup_name; } static int app_profile_config_backup_file(AppProfileConfig *config, const char *filename, char **error_str) { int ret; char *backup_name = nv_app_profile_config_get_backup_filename(config, filename); char *backup_dirname = nv_dirname(backup_name); ret = nv_mkdirp(backup_dirname, error_str); if (ret < 0) { LOG_ERROR(error_str, "Could not create backup directory \"%s\" (%s)", backup_name, strerror(errno)); goto done; } ret = rename(filename, backup_name); if (ret < 0) { if (errno == ENOENT) { // Clear the error; the file does not exist ret = 0; } else { LOG_ERROR(error_str, "Could not rename file \"%s\" to \"%s\" for backup (%s)", filename, backup_name, strerror(errno)); } } nv_info_msg("", "Backing up configuration file \"%s\" as \"%s\"\n", filename, backup_name); done: free(backup_dirname); free(backup_name); return ret; } static int app_profile_config_save_updates_to_file(AppProfileConfig *config, const char *filename, const char *update_text, int backup, char **error_str) { int file_is_new = FALSE; struct stat stat_buf; char *dirname = NULL; FILE *fp; int ret; ret = stat(filename, &stat_buf); if ((ret < 0) && (errno != ENOENT)) { LOG_ERROR(error_str, "Could not stat file \"%s\" (%s)", filename, strerror(errno)); goto done; } else if ((ret < 0) && (errno == ENOENT)) { file_is_new = TRUE; // Check if the prefix is in the search path dirname = nv_dirname(filename); if (file_in_search_path(config, dirname)) { // This file is in a directory in the search path ret = stat(dirname, &stat_buf); if ((ret < 0) && (errno != ENOENT)) { LOG_ERROR(error_str, "Could not stat file \"%s\" (%s)", dirname, strerror(errno)); goto done; } else if ((ret < 0) && errno == ENOENT) { // Attempt to create the directory in the search path ret = nv_mkdirp(dirname, error_str); if (ret < 0) { goto done; } } else if (S_ISREG(stat_buf.st_mode)) { // If the search path entry is currently a regular file, // unlink it and create a directory instead if (backup) { ret = app_profile_config_backup_file(config, dirname, error_str); if (ret < 0) { goto done; } } ret = unlink(dirname); if (ret < 0) { LOG_ERROR(error_str, "Could not remove the file \"%s\" (%s)", dirname, strerror(errno)); goto done; } ret = nv_mkdirp(dirname, error_str); if (ret < 0) { goto done; } } } else { // Attempt to create parent directories for this file ret = nv_mkdirp(dirname, error_str); if (ret < 0) { goto done; } } } else if (!S_ISREG(stat_buf.st_mode)) { // XXX: if this is a directory, we could recursively remove files here, // but that seems a little dangerous. Instead, complain and bail out // here. ret = -1; LOG_ERROR(error_str, "Refusing to write to file \"%s\" " "since it is not a regular file", filename); goto done; } if (!file_is_new && backup) { ret = app_profile_config_backup_file(config, filename, error_str); if (ret < 0) { goto done; } } ret = open_and_stat(filename, "w", &fp, &stat_buf); if (ret < 0) { LOG_ERROR(error_str, "Could not write to the file \"%s\" (%s)", filename, strerror(errno)); goto done; } nv_info_msg("", "Writing to configuration file \"%s\"\n", filename); fprintf(fp, "%s\n", update_text); fclose(fp); done: free(dirname); return ret; } int nv_app_profile_config_save_updates(AppProfileConfig *config, json_t *updates, int backup, char **error_str) { json_t *update; const char *filename; const char *update_text; size_t i, size; int ret = 0; int all_ret = 0; if (error_str) { *error_str = NULL; } for (i = 0, size = json_array_size(updates); i < size; i++) { update = json_array_get(updates, i); filename = json_string_value(json_object_get(update, "filename")); update_text = json_string_value(json_object_get(update, "text")); ret = app_profile_config_save_updates_to_file(config, filename, update_text, backup, error_str); if (ret < 0) { all_ret = -1; } } assert(all_ret <= 0); // This asserts an error string is set iff we are returning an error assert(!error_str || (!(*error_str) && (all_ret == 0)) || ((*error_str) && (all_ret < 0))); return all_ret; } AppProfileConfig *nv_app_profile_config_dup(AppProfileConfig *config) { size_t i; AppProfileConfig *new_config; new_config = malloc(sizeof(AppProfileConfig)); new_config->parsed_files = json_deep_copy(config->parsed_files); new_config->profile_locations = json_deep_copy(config->profile_locations); new_config->rule_locations = json_deep_copy(config->rule_locations); new_config->next_free_rule_id = config->next_free_rule_id; new_config->global_config_file = config->global_config_file ? strdup(config->global_config_file) : NULL; new_config->global_options = json_deep_copy(config->global_options); new_config->search_path = malloc(sizeof(char *) * config->search_path_count); new_config->search_path_count = config->search_path_count; for (i = 0; i < config->search_path_count; i++) { new_config->search_path[i] = strdup(config->search_path[i]); } return new_config; } void nv_app_profile_config_set_enabled(AppProfileConfig *config, int enabled) { json_t *global_options = config->global_options; json_object_set_new(global_options, "enabled", enabled ? json_true() : json_false()); } int nv_app_profile_config_get_enabled(AppProfileConfig *config) { json_t *global_options = config->global_options; json_t *enabled_json; enabled_json = json_object_get(global_options, "enabled"); assert(enabled_json); return json_is_true(enabled_json); } void nv_app_profile_config_free(AppProfileConfig *config) { size_t i; json_decref(config->global_options); json_decref(config->parsed_files); json_decref(config->profile_locations); json_decref(config->rule_locations); for (i = 0; i < config->search_path_count; i++) { free(config->search_path[i]); } free(config->search_path); free(config->global_config_file); free(config); } static json_t *app_profile_config_lookup_file(AppProfileConfig *config, const char *filename) { size_t i, size; json_t *json_file, *json_filename; size = json_array_size(config->parsed_files); for (i = 0; i < size; i++) { json_file = json_array_get(config->parsed_files, i); json_filename = json_object_get(json_file, "filename"); if (!strcmp(json_string_value(json_filename), filename)) { return json_file; } } return NULL; } static void app_profile_config_delete_file(AppProfileConfig *config, const char *filename) { size_t i, size; json_t *json_file, *json_filename; size = json_array_size(config->parsed_files); for (i = 0; i < size; i++) { json_file = json_array_get(config->parsed_files, i); json_filename = json_object_get(json_file, "filename"); if (!strcmp(json_string_value(json_filename), filename)) { json_array_remove(config->parsed_files, i); return; } } } static void app_profile_config_get_per_file_config(AppProfileConfig *config, const char *filename, json_t **file, json_t **rules, json_t **profiles) { *file = app_profile_config_lookup_file(config, filename); if (!*file) { *rules = NULL; *profiles = NULL; } else { *rules = json_object_get(*file, "rules"); *profiles = json_object_get(*file, "profiles"); } } /* * Convert the internal representation of an application profile to a * representation suitable for writing to disk. */ static json_t *app_profile_config_profile_output(const char *profile_name, const json_t *orig_profile) { json_t *new_profile = json_object(); json_object_set_new(new_profile, "name", json_string(profile_name)); json_object_set(new_profile, "settings", json_object_get(orig_profile, "settings")); return new_profile; } static json_t *app_profile_config_rule_output(const json_t *orig_rule) { json_t *new_rule = json_object(); json_object_set(new_rule, "pattern", json_object_get(orig_rule, "pattern")); json_object_set(new_rule, "profile", json_object_get(orig_rule, "profile")); return new_rule; } static char *config_to_cfg_file_syntax(json_t *old_rules, json_t *old_profiles) { char *output = NULL; const char *profile_name; json_t *root, *rules_array, *profiles_array; json_t *old_rule, *old_profile; json_t *new_rule, *new_profile; size_t i, size; root = json_object(); if (!root) { goto fail; } rules_array = json_array(); if (!rules_array) { goto fail; } json_object_set_new(root, "rules", rules_array); profiles_array = json_array(); if (!profiles_array) { goto fail; } json_object_set_new(root, "profiles", profiles_array); if (old_rules) { size = json_array_size(old_rules); for (i = 0; i < size; i++) { old_rule = json_array_get(old_rules, i); new_rule = app_profile_config_rule_output(old_rule); json_array_append_new(rules_array, new_rule); } } if (old_profiles) { json_object_foreach(old_profiles, profile_name, old_profile) { new_profile = app_profile_config_profile_output(profile_name, old_profile); json_array_append_new(profiles_array, new_profile); } } output = json_dumps(root, JSON_ENSURE_ASCII | JSON_INDENT(4)); fail: json_decref(root); return output; } static void add_files_from_config(AppProfileConfig *config, json_t *all_files, json_t *changed_files) { json_t *file, *filename; size_t i, size; for (i = 0, size = json_array_size(config->parsed_files); i < size; i++) { file = json_array_get(config->parsed_files, i); filename = json_object_get(file, "filename"); json_object_set_new(all_files, json_string_value(filename), json_true()); if (json_is_true(json_object_get(file, "dirty"))) { json_object_set_new(changed_files, json_string_value(filename), json_true()); } } } static json_t *app_profile_config_validate_global_options(AppProfileConfig *new_config, AppProfileConfig *old_config) { json_t *update = NULL; char *option_text; assert((!new_config->global_config_file && !old_config->global_config_file) || (!strcmp(new_config->global_config_file, old_config->global_config_file))); if (new_config->global_config_file && !json_equal(new_config->global_options, old_config->global_options)) { update = json_object(); json_object_set_new(update, "filename", json_string(new_config->global_config_file)); option_text = json_dumps(new_config->global_options, JSON_ENSURE_ASCII | JSON_INDENT(4)); json_object_set_new(update, "text", json_string(option_text)); free(option_text); } return update; } json_t *nv_app_profile_config_validate(AppProfileConfig *new_config, AppProfileConfig *old_config) { json_t *all_files, *changed_files; json_t *new_file, *new_rules, *old_rules; json_t *old_file, *new_profiles, *old_profiles; json_t *updates, *update; const char *filename; char *update_text; json_t *unused; updates = json_array(); // Determine if the global config file needs to be updated update = app_profile_config_validate_global_options(new_config, old_config); if (update) { json_array_append_new(updates, update); } // Build a set of files to examine: this is the union of files specified // by the old configuration and the new. all_files = json_object(); changed_files = json_object(); add_files_from_config(new_config, all_files, changed_files); add_files_from_config(old_config, all_files, changed_files); // For each file in the set, determine if it needs to be updated json_object_foreach(all_files, filename, unused) { app_profile_config_get_per_file_config(new_config, filename, &new_file, &new_rules, &new_profiles); app_profile_config_get_per_file_config(old_config, filename, &old_file, &old_rules, &old_profiles); // Simply compare the JSON objects if (!json_equal(old_rules, new_rules) || !json_equal(old_profiles, new_profiles)) { json_object_set_new(changed_files, filename, json_true()); } } // For each file that changed, generate an update record with the new JSON json_object_foreach(changed_files, filename, unused) { update = json_object(); json_object_set_new(update, "filename", json_string(filename)); app_profile_config_get_per_file_config(new_config, filename, &new_file, &new_rules, &new_profiles); update_text = config_to_cfg_file_syntax(new_rules, new_profiles); json_object_set_new(update, "text", json_string(update_text)); json_array_append_new(updates, update); free(update_text); } json_decref(all_files); json_decref(changed_files); return updates; } static int file_object_is_empty(const json_t *file) { const json_t *rules; const json_t *profiles; rules = json_object_get(file, "rules"); profiles = json_object_get(file, "profiles"); return (!json_array_size(rules) && !json_object_size(profiles)); } /* * Checks whether the given file is "empty" (contains no rules and profiles) * and "new" (created in the configuration and not loaded from disk), and * removes it from the configuration if both criteria are satisfied. */ static void app_profile_config_prune_empty_file(AppProfileConfig *config, const json_t *file) { char *filename; if (json_is_true(json_object_get(file, "new")) && file_object_is_empty(file)) { filename = strdup(json_string_value(json_object_get(file, "filename"))); app_profile_config_delete_file(config, filename); free(filename); } } int nv_app_profile_config_update_profile(AppProfileConfig *config, const char *filename, const char *profile_name, json_t *new_profile) { json_t *file; json_t *old_file = NULL; json_t *file_profiles; const char *old_filename; old_filename = json_string_value(json_object_get(config->profile_locations, profile_name)); if (old_filename) { // Existing profile old_file = app_profile_config_lookup_file(config, old_filename); assert(old_file); } // If there is an existing profile with a differing filename, delete it first if (old_filename && (strcmp(filename, old_filename) != 0)) { file = app_profile_config_lookup_file(config, old_filename); file_profiles = json_object_get(file, "profiles"); if (file) { json_object_del(file_profiles, profile_name); } } file = app_profile_config_lookup_file(config, filename); if (!file) { file = app_profile_config_new_file(config, filename); } file_profiles = json_object_get(file, "profiles"); json_object_set(file_profiles, profile_name, new_profile); json_object_set(config->profile_locations, profile_name, json_string(filename)); if (old_file) { app_profile_config_prune_empty_file(config, old_file); } return !old_filename; } void nv_app_profile_config_delete_profile(AppProfileConfig *config, const char *profile_name) { json_t *file = NULL; const char *filename = json_string_value(json_object_get(config->profile_locations, profile_name)); if (filename) { file = app_profile_config_lookup_file(config, filename); if (file) { json_object_del(json_object_get(file, "profiles"), profile_name); } } json_object_del(config->profile_locations, profile_name); if (file) { app_profile_config_prune_empty_file(config, file); } } int nv_app_profile_config_create_rule(AppProfileConfig *config, const char *filename, json_t *new_rule) { char *key; json_t *file, *file_rules; json_t *new_rule_copy; int new_id; file = app_profile_config_lookup_file(config, filename); if (!file) { file = app_profile_config_new_file(config, filename); } file_rules = json_object_get(file, "rules"); // Add the rule to the head of the per-file list json_array_append(file_rules, new_rule); new_rule_copy = json_array_get(file_rules, json_array_size(file_rules) - 1); new_id = config->next_free_rule_id++; json_object_set_new(new_rule_copy, "id", json_integer(new_id)); key = rule_id_to_key_string(new_id); json_object_set(config->rule_locations, key, json_string(filename)); free(key); return new_id; } static int lookup_rule_index_in_array(json_t *rules, int id) { json_t *rule, *rule_id; size_t i, size; for (i = 0, size = json_array_size(rules); i < size; i++) { rule = json_array_get(rules, i); rule_id = json_object_get(rule, "id"); if (json_integer_value(rule_id) == id) { return i; } } return -1; } int nv_app_profile_config_update_rule(AppProfileConfig *config, const char *filename, int id, json_t *new_rule) { json_t *old_file, *new_file; json_t *old_file_rules, *new_file_rules; json_t *new_rule_copy; const char *old_filename; char *key; int idx; int rule_moved; key = rule_id_to_key_string(id); old_filename = json_string_value(json_object_get(config->rule_locations, key)); assert(old_filename); old_file = app_profile_config_lookup_file(config, old_filename); assert(old_file); old_file_rules = json_object_get(old_file, "rules"); if (filename && (strcmp(filename, old_filename) != 0)) { // If the rule has a new file, delete the rule and re-add it new_file = app_profile_config_lookup_file(config, filename); rule_moved = TRUE; if (!new_file) { new_file = app_profile_config_new_file(config, filename); } new_file_rules = json_object_get(new_file, "rules"); idx = lookup_rule_index_in_array(old_file_rules, id); if (idx != -1) { json_array_remove(old_file_rules, idx); } json_array_insert(new_file_rules, 0, new_rule); new_rule_copy = json_array_get(new_file_rules, 0); json_object_set_new(new_rule_copy, "id", json_integer(id)); json_object_set_new(config->rule_locations, key, json_string(filename)); } else { // Otherwise, just edit the existing rule rule_moved = FALSE; idx = lookup_rule_index_in_array(old_file_rules, id); if (idx != -1) { json_array_set(old_file_rules, idx, new_rule); new_rule_copy = json_array_get(old_file_rules, idx); json_object_set_new(new_rule_copy, "id", json_integer(id)); } } free(key); app_profile_config_prune_empty_file(config, old_file); return rule_moved; } void nv_app_profile_config_delete_rule(AppProfileConfig *config, int id) { json_t *file, *file_rules; const char *filename; char *key; int idx; key = rule_id_to_key_string(id); filename = json_string_value(json_object_get(config->rule_locations, key)); assert(filename); file = app_profile_config_lookup_file(config, filename); assert(file); file_rules = json_object_get(file, "rules"); idx = lookup_rule_index_in_array(file_rules, id); if (idx != -1) { json_array_remove(file_rules, idx); } json_object_del(config->rule_locations, key); free(key); } size_t nv_app_profile_config_count_rules(AppProfileConfig *config) { return json_object_size(config->rule_locations); } static size_t app_profile_config_count_rules_before(AppProfileConfig *config, const char *filename) { size_t i, size; size_t num_rules = 0; json_t *cur_file, *cur_filename; for (i = 0, size = json_array_size(config->parsed_files); i < size; i++) { cur_file = json_array_get(config->parsed_files, i); cur_filename = json_object_get(cur_file, "filename"); if (!strcmp(filename, json_string_value(cur_filename))) { break; } num_rules += json_array_size(json_object_get(cur_file, "rules")); } return num_rules; } static void app_profile_config_insert_rule(AppProfileConfig *config, json_t *rule, size_t new_pri, const char *old_filename) { size_t i, j, size; size_t num_rules = 0; char *key; const char *filename; json_t *file, *file_rules; json_t *target[2]; size_t rules_before_target[2]; for (i = 0, j = 0, size = json_array_size(config->parsed_files); i < size; i++) { file = json_array_get(config->parsed_files, i); file_rules = json_object_get(file, "rules"); if ((num_rules <= new_pri) && (num_rules + json_array_size(file_rules) >= new_pri)) { // Potential target file for this rule rules_before_target[j] = num_rules; target[j++] = file; if (j >= 2) { break; } } num_rules += json_array_size(file_rules); } assert((j > 0) && (j <= 2)); // If possible, we prefer to keep the rule in the same file as before for (i = 0; i < j; i++) { filename = json_string_value(json_object_get(target[i], "filename")); if (!strcmp(filename, old_filename)) { break; } } i = (i == j) ? 0 : i; file_rules = json_object_get(target[i], "rules"); json_array_insert_new(file_rules, new_pri - rules_before_target[i], rule); // Update the hashtable to point to the new file key = rule_id_to_key_string(json_integer_value(json_object_get(rule, "id"))); filename = json_string_value(json_object_get(target[i], "filename")); json_object_set_new(config->rule_locations, key, json_string(filename)); free(key); } size_t nv_app_profile_config_get_rule_priority(AppProfileConfig *config, int id) { json_t *file, *file_rules; const char *filename; int idx; char *key; key = rule_id_to_key_string(id); filename = json_string_value(json_object_get(config->rule_locations, key)); assert(filename); file = app_profile_config_lookup_file(config, filename); assert(file); file_rules = json_object_get(file, "rules"); idx = lookup_rule_index_in_array(file_rules, id); free(key); return app_profile_config_count_rules_before(config, filename) + idx; } static void app_profile_config_set_abs_rule_priority_internal(AppProfileConfig *config, int id, size_t new_pri, size_t current_pri, size_t lowest_pri) { json_t *rule, *rule_copy; json_t *file, *file_rules; const char *filename; int idx; char *key; if (new_pri == current_pri) { return; } else if (new_pri >= lowest_pri) { new_pri = lowest_pri - 1; } key = rule_id_to_key_string(id); filename = json_string_value(json_object_get(config->rule_locations, key)); assert(filename); file = app_profile_config_lookup_file(config, filename); assert(file); file_rules = json_object_get(file, "rules"); idx = lookup_rule_index_in_array(file_rules, id); assert(idx >= 0); rule = json_array_get(file_rules, idx); rule_copy = json_deep_copy(rule); json_array_remove(file_rules, idx); app_profile_config_insert_rule(config, rule_copy, new_pri, filename); app_profile_config_prune_empty_file(config, file); free(key); } void nv_app_profile_config_set_abs_rule_priority(AppProfileConfig *config, int id, size_t new_pri) { size_t current_pri = nv_app_profile_config_get_rule_priority(config, id); size_t lowest_pri = nv_app_profile_config_count_rules(config); app_profile_config_set_abs_rule_priority_internal(config, id, new_pri, current_pri, lowest_pri); } void nv_app_profile_config_change_rule_priority(AppProfileConfig *config, int id, int delta) { size_t lowest_pri = nv_app_profile_config_count_rules(config); size_t current_pri = nv_app_profile_config_get_rule_priority(config, id); size_t new_pri; if ((delta < 0) && (((size_t)-delta) > current_pri)) { new_pri = 0; } else { new_pri = current_pri + delta; } app_profile_config_set_abs_rule_priority_internal(config, id, new_pri, current_pri, lowest_pri); } const json_t *nv_app_profile_config_get_profile(AppProfileConfig *config, const char *profile_name) { json_t *file, *file_profiles; json_t *filename = json_object_get(config->profile_locations, profile_name); if (!filename) { return NULL; } file = app_profile_config_lookup_file(config, json_string_value(filename)); file_profiles = json_object_get(file, "profiles"); return json_object_get(file_profiles, profile_name); } const json_t *nv_app_profile_config_get_rule(AppProfileConfig *config, int id) { char *key = rule_id_to_key_string(id); json_t *file, *rule, *filename; json_t *file_rules; int idx; filename = json_object_get(config->rule_locations, key); if (!filename) { free(key); return NULL; } file = app_profile_config_lookup_file(config, json_string_value(filename)); file_rules = json_object_get(file, "rules"); idx = lookup_rule_index_in_array(file_rules, id); if (idx != -1) { rule = json_array_get(file_rules, idx); } else { assert(0); rule = NULL; } free(key); return rule; } struct AppProfileConfigProfileIterRec { AppProfileConfig *config; size_t file_idx; json_t *profiles; void *profile_iter; }; AppProfileConfigProfileIter *nv_app_profile_config_profile_iter(AppProfileConfig *config) { AppProfileConfigProfileIter *iter = malloc(sizeof(AppProfileConfigProfileIter)); iter->config = config; iter->file_idx = 0; iter->profile_iter = NULL; return nv_app_profile_config_profile_iter_next(iter); } AppProfileConfigProfileIter *nv_app_profile_config_profile_iter_next(AppProfileConfigProfileIter *iter) { AppProfileConfig *config = iter->config; json_t *file; int advance = TRUE; size_t size; size = json_array_size(config->parsed_files); while ((iter->file_idx < size) && !iter->profile_iter) { file = json_array_get(config->parsed_files, iter->file_idx); iter->profiles = json_object_get(file, "profiles"); iter->profile_iter = json_object_iter(iter->profiles); iter->file_idx++; advance = FALSE; } if (!iter->profile_iter) { free(iter); return NULL; } if (advance) { iter->profile_iter = json_object_iter_next(iter->profiles, iter->profile_iter); } while ((iter->file_idx < size) && !iter->profile_iter) { file = json_array_get(config->parsed_files, iter->file_idx); iter->profiles = json_object_get(file, "profiles"); iter->profile_iter = json_object_iter(iter->profiles); iter->file_idx++; } if (!iter->profile_iter) { free(iter); return NULL; } return iter; } struct AppProfileConfigRuleIterRec { AppProfileConfig *config; size_t file_idx; int rule_idx; json_t *rules; }; AppProfileConfigRuleIter *nv_app_profile_config_rule_iter(AppProfileConfig *config) { AppProfileConfigRuleIter *iter = malloc(sizeof(AppProfileConfigRuleIter)); iter->file_idx = 0; iter->rule_idx = -1; iter->config = config; return nv_app_profile_config_rule_iter_next(iter); } AppProfileConfigRuleIter *nv_app_profile_config_rule_iter_next(AppProfileConfigRuleIter *iter) { AppProfileConfig *config = iter->config; json_t *file; int advance = TRUE; size_t size; size = json_array_size(config->parsed_files); while ((iter->file_idx < size) && (iter->rule_idx == -1)) { file = json_array_get(config->parsed_files, iter->file_idx); iter->rules = json_object_get(file, "rules"); if (json_array_size(iter->rules)) { iter->rule_idx = 0; } iter->file_idx++; advance = FALSE; } if (iter->rule_idx == -1) { free(iter); return NULL; } if (advance) { iter->rule_idx++; if (iter->rule_idx >= json_array_size(iter->rules)) { iter->rule_idx = -1; } } while ((iter->file_idx < size) && (iter->rule_idx == -1)) { file = json_array_get(config->parsed_files, iter->file_idx); iter->rules = json_object_get(file, "rules"); if (json_array_size(iter->rules)) { iter->rule_idx = 0; } iter->file_idx++; } if (iter->rule_idx == -1) { free(iter); return NULL; } return iter; } const char *nv_app_profile_config_profile_iter_name(AppProfileConfigProfileIter *iter) { return json_object_iter_key(iter->profile_iter); } json_t *nv_app_profile_config_profile_iter_val(AppProfileConfigProfileIter *iter) { return json_object_iter_value(iter->profile_iter); } size_t nv_app_profile_config_rule_iter_pri(AppProfileConfigRuleIter *iter) { json_t *rule = nv_app_profile_config_rule_iter_val(iter); return nv_app_profile_config_get_rule_priority(iter->config, json_integer_value(json_object_get(rule, "id"))); } json_t *nv_app_profile_config_rule_iter_val(AppProfileConfigRuleIter *iter) { return json_array_get(iter->rules, iter->rule_idx); } const char *nv_app_profile_config_profile_iter_filename(AppProfileConfigProfileIter *iter) { json_t *file = json_array_get(iter->config->parsed_files, iter->file_idx - 1); return json_string_value(json_object_get(file, "filename")); } const char *nv_app_profile_config_rule_iter_filename(AppProfileConfigRuleIter *iter) { json_t *file = json_array_get(iter->config->parsed_files, iter->file_idx - 1); return json_string_value(json_object_get(file, "filename")); } const char *nv_app_profile_config_get_rule_filename(AppProfileConfig *config, int id) { const char *filename; char *key; key = rule_id_to_key_string(id); filename = json_string_value(json_object_get(config->rule_locations, key)); free(key); return filename; } const char *nv_app_profile_config_get_profile_filename(AppProfileConfig *config, const char *profile_name) { return json_string_value(json_object_get(config->profile_locations, profile_name)); } static char *get_search_path_string(AppProfileConfig *config) { size_t i; char *new_s; char *s = strdup(""); for (i = 0; i < config->search_path_count; i++) { new_s = nvasprintf("%s\t\"%s\"\n", s, config->search_path[i]); free(s); s = new_s; } return s; } static int app_profile_config_check_is_prefix(const char *filename1, const char *filename2) { char *dirname1, *dirname2; int prefix_state; dirname1 = nv_dirname(filename1); dirname2 = nv_dirname(filename2); if (!strcmp(dirname1, filename2)) { prefix_state = 1; } else if (!strcmp(filename1, dirname2)) { prefix_state = -1; } else { prefix_state = 0; } free(dirname1); free(dirname2); return prefix_state; } int nv_app_profile_config_check_valid_source_file(AppProfileConfig *config, const char *filename, char **reason) { const json_t *parsed_file; size_t i, size; const char *cur_filename; char *dirname; char *search_path_string; int prefix_state; // Check if the source file can be found in the search path dirname = NULL; for (i = 0; i < config->search_path_count; i++) { if (!strcmp(filename, config->search_path[i])) { break; } else { if (!dirname) { dirname = nv_dirname(filename); } if (!strcmp(dirname, config->search_path[i])) { break; } } } free(dirname); if (i == config->search_path_count) { search_path_string = get_search_path_string(config); if (reason) { *reason = nvasprintf("the filename is not valid in the search path:\n\n%s\n", search_path_string); } free(search_path_string); return FALSE; } // Check if the source file is a prefix of some other file in the configuration, // or vice versa for (i = 0, size = json_array_size(config->parsed_files); i < size; i++) { parsed_file = json_array_get(config->parsed_files, i); cur_filename = json_string_value(json_object_get(parsed_file, "filename")); prefix_state = app_profile_config_check_is_prefix(filename, cur_filename); if (prefix_state) { if (prefix_state > 0) { if (reason) { *reason = nvasprintf("the filename is a prefix of the existing file \"%s\".", cur_filename); } } else if (reason) { *reason = nvasprintf("the filename would be placed in the directory \"%s\", " "but that is already a regular file in the configuration.", cur_filename); } return FALSE; } } return TRUE; } int nv_app_profile_config_check_backing_files(AppProfileConfig *config) { json_t *file; size_t i, size; const char *filename; FILE *fp; time_t saved_atime; struct stat stat_buf; int ret; int changed = FALSE; for (i = 0, size = json_array_size(config->parsed_files); i < size; i++) { file = json_array_get(config->parsed_files, i); if (json_is_false(json_object_get(file, "new"))) { // Stat the file and compare our saved atime to the file's mtime filename = json_string_value(json_object_get(file, "filename")); ret = open_and_stat(filename, "r", &fp, &stat_buf); if (ret >= 0) { fclose(fp); saved_atime = (time_t)json_integer_value(json_object_get(file, "atime")); if (stat_buf.st_mtime > saved_atime) { json_object_set_new(file, "dirty", json_true()); changed = TRUE; } } else { // I/O errors: assume something changed json_object_set_new(file, "dirty", json_true()); changed = TRUE; } } } return changed; } /* * Filenames in the search path ending in "*.d" are directories by convention, * and should not be listed as valid default filenames. */ static inline int check_has_directory_suffix(const char *filename) { size_t len = strlen(filename); return (len >= 2) && (filename[len-2] == '.') && (filename[len-1] == 'd'); } json_t *nv_app_profile_config_get_source_filenames(AppProfileConfig *config) { size_t i, j, size; const char *filename; json_t *filenames; json_t *file; int do_add_search_path_item; filenames = json_array(); for (i = 0, size = json_array_size(config->parsed_files); i < size; i++) { file = json_array_get(config->parsed_files, i); json_array_append(filenames, json_object_get(file, "filename")); } for (i = 0; i < config->search_path_count; i++) { do_add_search_path_item = !check_has_directory_suffix(config->search_path[i]); for (j = 0; (j < size) && do_add_search_path_item; j++) { file = json_array_get(config->parsed_files, j); filename = json_string_value(json_object_get(file, "filename")); if (!strcmp(config->search_path[i], filename) || app_profile_config_check_is_prefix(config->search_path[i], filename)) { do_add_search_path_item = FALSE; } } if (do_add_search_path_item) { json_array_append_new(filenames, json_string(config->search_path[i])); } } return filenames; } int nv_app_profile_config_profile_name_change_fixup(AppProfileConfig *config, const char *orig_name, const char *new_name) { int fixed_up = FALSE; size_t i, j; size_t num_files, num_rules; json_t *file, *rules, *rule, *rule_profile; const char *rule_profile_str; for (i = 0, num_files = json_array_size(config->parsed_files); i < num_files; i++) { file = json_array_get(config->parsed_files, i); rules = json_object_get(file, "rules"); for (j = 0, num_rules = json_array_size(rules); j < num_rules; j++) { rule = json_array_get(rules, j); rule_profile = json_object_get(rule, "profile"); assert(json_is_string(rule_profile)); rule_profile_str = json_string_value(rule_profile); if (!strcmp(rule_profile_str, orig_name)) { json_object_set_new(rule, "profile", json_string(new_name)); fixed_up = TRUE; } } } return fixed_up; } nvidia-settings/src/msg.c0000664000175000017500000001517512236467170015574 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "msg.h" #include "command-line.h" #include "common-utils.h" #include #include #include #include #include #include #include #include #if defined(__sun) #include #endif extern int __verbosity; static void format(FILE*, const char*, char *, int); static int get_terminal_width(void); #define NV_FORMAT(stream, prefix, fmt, whitespace) \ do { \ char *buf; \ NV_VSNPRINTF(buf, fmt); \ format(stream, prefix, buf, whitespace); \ free (buf); \ } while(0) /* * nv_error_msg() - print an error message, nicely formatted using the * format() function. * * This function should be used for all errors. */ void nv_error_msg(const char *fmt, ...) { if (__verbosity < VERBOSITY_ERROR) return; fprintf(stderr, "\n"); NV_FORMAT(stderr, "ERROR: ", fmt, False); fprintf(stderr, "\n"); } /* nv_error_msg() */ /* * nv_deprecated_msg() - print a deprecation message, nicely formatted using * the format() function. * * This function should be used for all deprecation messages. */ void nv_deprecated_msg(const char *fmt, ...) { if (__verbosity < VERBOSITY_DEPRECATED) return; fprintf(stderr, "\n"); NV_FORMAT(stderr, "DEPRECATED: ", fmt, False); fprintf(stderr, "\n"); } /* * nv_warning_msg() - print a warning message, nicely formatted using * the format() function. * * This function should be used for all warnings. */ void nv_warning_msg(const char *fmt, ...) { if (__verbosity < VERBOSITY_WARNING) return; fprintf(stdout, "\n"); NV_FORMAT(stdout, "WARNING: ", fmt, False); fprintf(stdout, "\n"); } /* nv_warning_msg() */ /* * nv_info_msg() - print an info message, nicely formatted using * the format() function. * * This function should be used to display verbose information. */ void nv_info_msg(const char *prefix, const char *fmt, ...) { if (__verbosity < VERBOSITY_ALL) return; NV_FORMAT(stdout, prefix, fmt, False); } /* nv_info_msg() */ /* * nv_msg() - print a message, nicely formatted using the format() * function. * * This function should be used to display messages independent * of the verbosity level. */ void nv_msg(const char *prefix, const char *fmt, ...) { NV_FORMAT(stdout, prefix, fmt, False); } /* nv_msg() */ /* * nv_msg_preserve_whitespace() - Prints the message, just like nv_msg() * using format(), the difference is, whitespace characters are not * skipped during the text processing. */ void nv_msg_preserve_whitespace(const char *prefix, const char *fmt, ...) { NV_FORMAT(stdout, prefix, fmt, True); } /* nv_msg_preserve_whitespace() */ /* * XXX gcc's '-ansi' option causes vsnprintf to not be defined, so * declare the prototype here. */ #if defined(__STRICT_ANSI__) int vsnprintf(char *str, size_t size, const char *format, va_list ap); #endif /* * format() - formats and prints the string buf so that no more than * 80 characters are printed across. */ static void format(FILE *stream, const char *prefix, char *buf, int preserveWhitespace) { int len, prefix_len, z, w, i, max_width; char *line, *local_prefix, *a, *b, *c; max_width = get_terminal_width(); /* loop until we've printed the entire string */ z = strlen(buf); a = buf; if (prefix) { prefix_len = strlen(prefix); local_prefix = nvalloc(prefix_len+1); strcpy(local_prefix, prefix); } else { prefix_len = 0; local_prefix = NULL; } do { w = max_width; /* adjust the max width for any prefix */ w -= prefix_len; /* * if the string will fit on one line, point b to the end of the * string */ if (z < w) b = a + z; /* * if the string won't fit on one line, move b to where the end of * the line should be, and then move b back until we find a space; * if we don't find a space before we back b all the way up to a, start * b at a, and move forward until we do find a space */ else { b = a + w; while ((b >= a) && (!isspace(*b))) b--; if (b <= a) { b = a; while (*b && !isspace(*b)) b++; } } /* look for any newline in the line, and move b to it */ for (c = a; c < b; c++) if (*c=='\n') { b = c; break; } /* print the string that starts at a and ends at b */ /* * XXX this could be done just by temporarily overwriting b * with '\0' */ len = b-a; line = nvalloc(len+1); strncpy(line, a, len); line[len] = '\0'; if (local_prefix) { fprintf(stream, "%s%s\n", local_prefix, line); } else { fprintf(stream, "%s\n", line); } free(line); /* * adjust the length of the string and move the pointer to the * beginning of the new line */ z -= (b - a + 1); a = b + 1; if (!preserveWhitespace) { /* move to the first non whitespace character */ while ((z > 0) && (isspace(*a))) a++, z--; } if (local_prefix) { for (i = 0; i < prefix_len; i++) local_prefix[i] = ' '; } } while (z > 0); if (local_prefix) free (local_prefix); } /* format() */ #define DEFAULT_MAX_WIDTH 75 static int get_terminal_width(void) { struct winsize ws; if (ioctl(STDERR_FILENO, TIOCGWINSZ, &ws) == -1 || ws.ws_col == 0) { return DEFAULT_MAX_WIDTH; } else { return (ws.ws_col - 1); } } nvidia-settings/src/config-file.h0000664000175000017500000000420612236467170017166 0ustar albertoalberto/* * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix * and Linux systems. * * Copyright (C) 2004 NVIDIA Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CONFIG_FILE_H__ #define __CONFIG_FILE_H__ #include "query-assign.h" /* * The ConfigProperties structure contains additional configuration * data to be written to the rc file; these are configuration * properties of the nvidia-settings utilities itself, rather than * properties of the X screen(s) that nvidia-settings is configuring. */ #define CONFIG_PROPERTIES_TOOLTIPS (1<<0) #define CONFIG_PROPERTIES_DISPLAY_STATUS_BAR (1<<1) #define CONFIG_PROPERTIES_SLIDER_TEXT_ENTRIES (1<<2) #define CONFIG_PROPERTIES_INCLUDE_DISPLAY_NAME_IN_CONFIG_FILE (1<<3) #define CONFIG_PROPERTIES_SHOW_QUIT_DIALOG (1<<4) #define CONFIG_PROPERTIES_UPDATE_RULES_ON_PROFILE_NAME_CHANGE (1<<5) typedef struct _TimerConfigProperty { char *description; unsigned int user_enabled; unsigned int interval; struct _TimerConfigProperty *next; } TimerConfigProperty; typedef struct { unsigned int booleans; char *locale; TimerConfigProperty *timers; } ConfigProperties; void init_config_properties(ConfigProperties *conf); int nv_read_config_file(const char *, const char *, ParsedAttribute *, ConfigProperties *, CtrlHandlesArray *); int nv_write_config_file(const char *, CtrlHandles *, ParsedAttribute *, ConfigProperties *); #endif /* __CONFIG_FILE_H__ */ nvidia-settings/COPYING0000664000175000017500000004325412236467170015105 0ustar albertoalberto GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. nvidia-settings/version.mk0000664000175000017500000000003012236467170016051 0ustar albertoalbertoNVIDIA_VERSION = 331.20 nvidia-settings/utils.mk0000664000175000017500000003035612236467170015542 0ustar albertoalberto# # Copyright (C) 2008 NVIDIA Corporation # # This program is free software; you can redistribute it and/or modify it # under the terms and conditions of the GNU General Public License, # version 2, as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # # utils.mk: common Makefile fragment used by nvidia-xconfig, # nvidia-installer, and nvidia-settings # ############################################################################## # The calling Makefile (when building as part of the NVIDIA graphics # driver) may export any of the following variables; we assign default # values if they are not exported by the caller ############################################################################## CC ?= gcc LD ?= ld # only set these warnings and optimizations if CFLAGS is unset CFLAGS ?= -Wall -O2 # always set these -f CFLAGS CFLAGS += -fno-strict-aliasing -fno-omit-frame-pointer -Wformat=2 CC_ONLY_CFLAGS ?= LDFLAGS ?= BIN_LDFLAGS ?= HOST_CC ?= $(CC) HOST_LD ?= $(LD) HOST_CFLAGS ?= $(CFLAGS) HOST_LDFLAGS ?= $(LDFLAGS) HOST_BIN_LDFLAGS ?= # always disable warnings that will break the build CFLAGS += -Wno-unused-parameter -Wno-format-zero-length HOST_CFLAGS += -Wno-unused-parameter -Wno-format-zero-length ifeq ($(DEBUG),1) STRIP_CMD ?= true CFLAGS += -O0 -g else STRIP_CMD ?= strip endif INSTALL ?= install INSTALL_BIN_ARGS ?= -m 755 INSTALL_DOC_ARGS ?= -m 644 M4 ?= m4 SED ?= sed M4 ?= m4 ECHO ?= echo PRINTF ?= printf MKDIR ?= mkdir -p RM ?= rm -f TOUCH ?= touch WHOAMI ?= whoami HOSTNAME_CMD ?= hostname DATE ?= date GZIP_CMD ?= gzip CHMOD ?= chmod NV_AUTO_DEPEND ?= 1 NV_VERBOSE ?= 0 ifndef TARGET_OS TARGET_OS := $(shell uname) endif ifeq ($(TARGET_OS),Linux) CFLAGS += -DNV_LINUX endif ifeq ($(TARGET_OS),FreeBSD) CFLAGS += -DNV_BSD endif ifeq ($(TARGET_OS),SunOS) CFLAGS += -DNV_SUNOS endif ifndef TARGET_ARCH TARGET_ARCH := $(shell uname -m) TARGET_ARCH := $(subst i386,x86,$(TARGET_ARCH)) TARGET_ARCH := $(subst i486,x86,$(TARGET_ARCH)) TARGET_ARCH := $(subst i586,x86,$(TARGET_ARCH)) TARGET_ARCH := $(subst i686,x86,$(TARGET_ARCH)) endif ifeq ($(TARGET_OS),Linux) LIBDL_LIBS = -ldl else LIBDL_LIBS = endif # This variable controls which floating-point ABI is targeted. For ARM, it # defaults to "gnueabi" for softfp. Another option is "gnueabihf" for # hard(fp). This is necessary to pick up the correct rtld_test binary. # All other architectures default to empty. ifeq ($(TARGET_ARCH),armv7l) TARGET_ARCH_ABI ?= gnueabi endif TARGET_ARCH_ABI ?= OUTPUTDIR ?= _out/$(TARGET_OS)_$(TARGET_ARCH) NV_QUIET_COMMAND_REMOVED_TARGET_PREFIX ?= CFLAGS += $(CC_ONLY_CFLAGS) ############################################################################## # This makefile uses the $(eval) builtin function, which was added in # GNU make 3.80. Check that the current make version recognizes it. # Idea suggested by: http://www.jgc.org/blog/cookbook-sample.pdf ############################################################################## _eval_available := $(eval _eval_available := T) ifneq ($(_eval_available),T) $(error This Makefile requires a GNU Make that supports 'eval'. Please upgrade to GNU make 3.80 or later) endif ############################################################################## # define variables used when installing the open source utilities from # the source tarball ############################################################################## PREFIX ?= /usr/local BINDIR = $(DESTDIR)$(PREFIX)/bin MANDIR = $(DESTDIR)$(PREFIX)/share/man/man1 ############################################################################## # default build rule, so that nothing here in utils.mk accidentally # gets selected as the default rule ############################################################################## default build: all ############################################################################## # get the definition of NVIDIA_VERSION from version.mk # # version.mk may be in one of two places: either in $(OUTPUTDIR) when # building as part of the NVIDIA driver build, or directly in the # source directory when building from the source tarball # # Throw an error if one of these two places did not define NVIDIA_VERSION. ############################################################################## VERSION_MK := $(wildcard $(OUTPUTDIR)/version.mk version.mk) include $(VERSION_MK) ifndef NVIDIA_VERSION $(error NVIDIA_VERSION undefined) endif ############################################################################## # Several of the functions below take an argument that indicates if # the expression is for the target platform (the system the built # program is going to run on) or the host platform (the system # performing the build). The argument is either "HOST" or "TARGET" # and needs to be converted: # # "HOST" -> "HOST_" # "TARGET" -> "" # # and prepended to "CC" or "CFLAGS" ############################################################################## host_target = $(patsubst HOST,HOST_,$(patsubst TARGET,,$(1))) host_target_cc = $(call host_target,$(1))CC host_target_cflags = $(call host_target,$(1))CFLAGS ############################################################################## # to generate the dependency files, use the compiler's "-MM" option to # generate output of the form "foo.o : foo.c foo.h"; then, use sed to # wrap the prerequisites with $(wildcard ...); the wildcard function # serves as an existence filter, so that files that are later removed # from the build do not cause stale references. Also, "-MM" will # cause the compiler to name the target as if it were in the current # directory ("foo.o: "); use sed to rename the target in the output # directory ("_out/Linux_x86/foo.o: ") so that the target actually # applies to the object files produced in the build. # # Arguments: # $(1): whether for host or target platform ("HOST" or "TARGET") # $(2): source filename # $(3): object filename ############################################################################## ifeq ($(NV_AUTO_DEPEND),1) AUTO_DEP_CMD = && $($(call host_target_cc,$(1))) \ -MM $$($(call host_target_cflags,$(1))) $$< | $$(SED) \ -e "s,: ,: $$$$\(wildcard ," \ -e "s,\([^\\]\)$$$$,\1)," \ -e "s;^$$(addsuffix .o,$$(notdir $$(basename $(2)))): ;$(3): ;" \ > $$(@:.o=.d) else AUTO_DEP_CMD = endif ############################################################################## # echo minimal compile information in the non-NV_VERBOSE case # # NV_MODULE_LOGGING_NAME can be set to prepend quiet build output with a # label of which build component is being built ############################################################################## NV_MODULE_LOGGING_NAME ?= ifeq ($(NV_VERBOSE),0) quiet_cmd = @$(PRINTF) \ " $(if $(NV_MODULE_LOGGING_NAME),[ %-17.17s ]) $(quiet_$(1))\n" \ "$(NV_MODULE_LOGGING_NAME)" && $($(1)) else quiet_cmd = $($(1)) endif # define LINK and HOST_LINK to be the same as CC; this is so that, # even though we use CC to link programs, we can have a different # quiet rule that uses '$@' as it's arg, rather than '$<' LINK = $(CC) HOST_LINK = $(HOST_CC) # strip NV_QUIET_COMMAND_REMOVED_TARGET_PREFIX from the target string define_quiet_cmd = $(1) $(patsubst $(NV_QUIET_COMMAND_REMOVED_TARGET_PREFIX)/%,%,$(2)) # define the quiet commands: quiet_CC = $(call define_quiet_cmd,CC ,$<) quiet_HOST_CC = $(call define_quiet_cmd,HOST_CC ,$<) quiet_LINK = $(call define_quiet_cmd,LINK ,$@) quiet_HOST_LINK = $(call define_quiet_cmd,HOST_LINK ,$@) quiet_M4 = $(call define_quiet_cmd,M4 ,$<) quiet_STRIP_CMD = $(call define_quiet_cmd,STRIP ,$@) ############################################################################## # Tell gmake to delete the target of a rule if it has changed and its # commands exit with a nonzero exit status. ############################################################################## .DELETE_ON_ERROR: ############################################################################## # function to generate a list of object files from their corresponding # source files; example usage: # # OBJS = $(call BUILD_OBJECT_LIST,$(SRC)) ############################################################################## BUILD_OBJECT_LIST = \ $(addprefix $(OUTPUTDIR)/,$(notdir $(addsuffix .o,$(basename $(1))))) ############################################################################## # function to generate a list of dependency files from their # corresponding source files; example usage: # # DEPS = $(call BUILD_DEPENDENCY_LIST,$(SRC)) ############################################################################## BUILD_DEPENDENCY_LIST = \ $(addprefix $(OUTPUTDIR)/,$(notdir $(addsuffix .d,$(basename $(1))))) ############################################################################## # functions to define a rule to build an object file; the first # argument whether the rule is for the target or host platform ("HOST" # or "TARGET"), the second argument is the source file to compile, and # the third argument (_WITH_OBJECT_NAME-only) is the object filename # to produce. Example usage: # # $(eval $(call DEFINE_OBJECT_RULE,TARGET,foo.c)) # # Note this also attempts to include the dependency file for this # source file. # # The DEFINE_OBJECT_RULE is functionally equivalent to # DEFINE_OBJECT_RULE_WITH_OBJECT_NAME, but infers the object file name # from the source file name (this is normally what you want). ############################################################################## define DEFINE_OBJECT_RULE_WITH_OBJECT_NAME $(3): $(2) @$(MKDIR) $(OUTPUTDIR) $$(call quiet_cmd,$(call host_target_cc,$(1))) \ $$($(call host_target_cflags,$(1))) -c $$< -o $$@ \ $(call AUTO_DEP_CMD,$(1),$(2),$(3)) -include $$(call BUILD_DEPENDENCY_LIST,$(3)) # declare empty rule for generating dependency file; we generate the # dependency files implicitly when compiling the source file (see # AUTO_DEP_CMD above), so we don't want gmake to spend time searching # for an explicit rule to generate the dependency file $$(call BUILD_DEPENDENCY_LIST,$(3)): ; endef define DEFINE_OBJECT_RULE $$(eval $$(call DEFINE_OBJECT_RULE_WITH_OBJECT_NAME,$(1),$(2),\ $$(call BUILD_OBJECT_LIST,$(2)))) endef ############################################################################## # STAMP_C - this is a source file that is generated during the build # to capture information about the build environment for the utility. # # The DEFINE_STAMP_C_RULE function is used to define the rule for # generating STAMP_C. First argument is a list of dependencies for # STAMP_C (g_stamp.o is filtered out of the list); second argument is # the name of the program being built. # # The includer of utils.mk should add $(STAMP_C) to its list of source # files ############################################################################## STAMP_C = $(OUTPUTDIR)/g_stamp.c define DEFINE_STAMP_C_RULE $$(STAMP_C): $$(filter-out \ $$(call BUILD_OBJECT_LIST,$$(STAMP_C)),$(1)) \ $$(VERSION_MK) @ $$(RM) $$@ @ $$(PRINTF) "const char NV_ID[] = \"nvidia id: " >> $$@ @ $$(PRINTF) "$(2): " >> $$@ @ $$(PRINTF) "version $$(NVIDIA_VERSION) " >> $$@ @ $$(PRINTF) "($$(shell $$(WHOAMI))@$$(shell $$(HOSTNAME_CMD))) " >> $$@ @ $$(PRINTF) "$$(shell $(DATE))\";\n" >> $$@ @ $$(PRINTF) "const char *pNV_ID = NV_ID + 11;\n" >> $$@ endef nvidia-settings/doc/0000775000175000017500000000000012236467170014607 5ustar albertoalbertonvidia-settings/doc/FRAMELOCK.txt0000664000175000017500000001412312236467170016654 0ustar albertoalberto This is a (very) brief summary of some of things that need to be done to write a Frame Lock NV-CONTROL client. ------------------------------------------------------------------------------- Section 1 - Writing a Frame Lock client for NV-CONTROL 1.8 (and earlier) Please see the sample NV-CONTROL clients in the "samples" directory for basic examples of how to set integer attributes. See the file ctkframelock.c for a much more involved example of how the nvidia-settings utility programs the Frame Lock attributes. The constants referenced below are defined in NVCtrl.h. Please see the comments in that file for an explanation of each attribute. It may also be instructive to grep ctkframelock.c to see how each attribute is used. Basic steps: - Open a Display connection to each X Screen you want to control in your Frame Lock cluster. Please make sure you have priviledges to establish the X connection. - Query the NV_CTRL_FRAMELOCK attribute to determine if Frame Lock is supported on each X screen. - Set NV_CTRL_FRAMELOCK_MASTER to NV_CTRL_FRAMELOCK_MASTER_TRUE on one node in the cluster; set it to NV_CTRL_FRAMELOCK_MASTER_FALSE to every other node in the cluster. - Set NV_CTRL_FRAMELOCK_POLARITY for each slave node in the cluster; most likely you want NV_CTRL_FRAMELOCK_POLARITY_RISING_EDGE. - Set NV_CTRL_FRAMELOCK_SYNC_DELAY as appropriate for each node. Most likely you want 0. - Set NV_CTRL_FRAMELOCK_SYNC_INTERVAL as appropriate if you are using house sync. Most likely, you just want 0. - Set NV_CTRL_FRAMELOCK_SYNC to NV_CTRL_FRAMELOCK_SYNC_ENABLE on each X screen to enable FrameLock. - (optional) set NV_CTRL_FRAMELOCK_TEST_SIGNAL to NV_CTRL_FRAMELOCK_TEST_SIGNAL_ENABLE followed immediately by NV_CTRL_FRAMELOCK_TEST_SIGNAL_DISABLE. This guarantees accuracy of the Universal Frame Count (as returned by glXQueryFrameCountNV()). - When you are done, set NV_CTRL_FRAMELOCK_SYNC to NV_CTRL_FRAMELOCK_SYNC_DISABLE on each X screen to disable Frame Lock. During operation, you can also query any of these on each X screen: NV_CTRL_FRAMELOCK_PORT0_STATUS NV_CTRL_FRAMELOCK_PORT1_STATUS NV_CTRL_FRAMELOCK_HOUSE_STATUS NV_CTRL_FRAMELOCK_SYNC_READY NV_CTRL_FRAMELOCK_STEREO_SYNC NV_CTRL_FRAMELOCK_ETHERNET_DETECTED NV_CTRL_FRAMELOCK_SYNC_RATE NV_CTRL_FRAMELOCK_TIMING (nvidia-settings registers a gtk+ timeout function and queries the state of these on each X screen every few seconds). ------------------------------------------------------------------------------- Section 2 - Writing a Frame Lock client for NV-CONTROL 1.9 (and later) Configuration of Frame Lock has changed in NV-CONTROL 1.9. There are two major differences: - Display Devices (instead of X Screens) are now selected as the clients & slaves of a Frame Lock group. - Frame Lock attributes should now be set/queried on GPUs (NV_CTRL_TARGET_TYPE_GPU) and Quadro Sync (Frame Lock) devices (NV_CTRL_TARGET_TYPE_FRAMELOCK) using the new NV-CONTROL targeting API. Please see the sample NV-CONTROL clients in the "samples" directory for basic examples of how to use the new targeting API (nv-control-targets.c), and a basic Frame Lock client (nv-control-framelock.c). See the file ctkframelock.c for a much more involved example of how the nvidia-settings utility programs the Frame Lock attributes. The constants referenced below are defined in NVCtrl.h. Please see the comments in that file for an explanation of each attribute. It may also be instructive to grep ctkframelock.c to see how each attribute is used. Querying frame lock capabilities of a system: - Query the number of Quadro Sync devices on the system by passing NV_CTRL_TARGET_TYPE_FRAMELOCK to XNVCTRLQueryTargetCount() - Query the GPUs attached to each Quadro Sync device by querying the NV_CTRL_GPUS_USING_FRAMELOCK attribute for each Quadro Sync device. - Query the enabled (available) display devices on each GPU through the NV_CTRL_ENABLED_DISPLAYS attribute. Configuring the Frame Lock group (This must be done while Frame Lock Sync is disabled on the GPU/Quadro Sync Device): - Set the Frame Lock Master Display Device on one of the GPUs through the NV_CTRL_FRAMELOCK_MASTER attribute. - Set the rest of the display devices as slaves through the NV_CTRL_FRAMELOCK_SLAVES attribute. - Set NV_CTRL_USE_HOUSE_SYNC to NV_CTRL_USE_HOUSE_SYNC_TRUE or NV_CTRL_USE_HOUSE_SYNC_FALSE on the master Quadro Sync device (this is the Quadro Sync device that is attached to the GPU that contains the display device currently set as the frame lock master.) Depending on whether or not you will be using a House Sync signal. - Set NV_CTRL_FRAMELOCK_POLARITY for each slave Quadro Sync device in the cluster; most likely you want NV_CTRL_FRAMELOCK_POLARITY_RISING_EDGE. - Set NV_CTRL_FRAMELOCK_SYNC_DELAY as appropriate for each Quadro Sync device. Most likely you want 0. - Set NV_CTRL_FRAMELOCK_SYNC_INTERVAL as appropriate if you are using house sync. Most likely, you just want 0. Enabling/Disabling Frame Lock: - Enable Frame Lock on each GPU by setting NV_CTRL_FRAMELOCK_SYNC to NV_CTRL_FRAMELOCK_SYNC_ENABLE. - (optional) set NV_CTRL_FRAMELOCK_TEST_SIGNAL to NV_CTRL_FRAMELOCK_TEST_SIGNAL_ENABLE followed immediately by NV_CTRL_FRAMELOCK_TEST_SIGNAL_DISABLE (on the GPU that contains the master Frame Lock display device.) This guarantees accuracy of the Universal Frame Count (as returned by glXQueryFrameCountNV()). - When you are done, set NV_CTRL_FRAMELOCK_SYNC to NV_CTRL_FRAMELOCK_SYNC_DISABLE on each GPU to disable Frame Lock. During operation, you can also query any of these on each GPU or Frame Lock device: NV_CTRL_FRAMELOCK_PORT0_STATUS NV_CTRL_FRAMELOCK_PORT1_STATUS NV_CTRL_FRAMELOCK_HOUSE_STATUS NV_CTRL_FRAMELOCK_SYNC_READY NV_CTRL_FRAMELOCK_STEREO_SYNC NV_CTRL_FRAMELOCK_ETHERNET_DETECTED NV_CTRL_FRAMELOCK_SYNC_RATE NV_CTRL_FRAMELOCK_TIMING nvidia-settings/doc/nvidia-settings.desktop0000664000175000017500000000233512236467170021315 0ustar albertoalberto[Desktop Entry] Type=Application Encoding=UTF-8 Name=NVIDIA X Server Settings Comment=Configure NVIDIA X Server Settings Exec=__UTILS_PATH__/nvidia-settings Icon=__PIXMAP_PATH__/nvidia-settings.png Categories=__NVIDIA_SETTINGS_DESKTOP_CATEGORIES__ # Translations provided by Sun Microsystems Name[de]=NVIDIA X-Server-Einstellungen Name[es]=Valores de configuración del servidor NVIDIA X Name[fr]=Paramètres du serveur X NVIDIA Name[it]=NVIDIA X Server Settings Name[ja]=NVIDIA X サーバー設定 Name[ko]=NVIDIA X 서버 설정 Name[pt_BR]=Configurações do NVIDIA X Server Name[zh_CN]=NVIDIA X 服务器设置 Name[zh_HK]=NVIDIA X 伺服器設定 Name[zh_TW]=NVIDIA X 伺服器設定 Comment[de]=Konfigurieren der NVIDIA X-Server-Einstellungen Comment[es]=Establezca los valores de configuración del servidor NVIDIA X Comment[fr]=Configurer les paramètres du serveur X NVIDIA Comment[it]=Configura NVIDIA X Server Settings Comment[ja]=NVIDIA X サーバー設定を構成します Comment[ko]=NVIDIA X 서버 설정 구성 Comment[pt_BR]=Definir &configurações de gerenciamento de usuário... Comment[zh_CN]=配置 NVIDIA X 服务器设置 Comment[zh_HK]=配置 NVIDIA X 伺服器設定 Comment[zh_TW]=配置 NVIDIA X 伺服器設定 nvidia-settings/doc/nvidia-settings.1.m40000664000175000017500000004542312236467170020330 0ustar albertoalbertochangequote([[[, ]]])dnl define(__OPTIONS__, [[[include([[[options.1.inc]]])dnl]]])dnl dnl Solaris man chokes on three-letter macros. ifelse(__BUILD_OS__,SunOS,[[[define(__URL__,UR)]]],[[[define(__URL__,URL)]]])dnl .\" Copyright (C) 2010 NVIDIA Corporation. __HEADER__ .\" Define the .__URL__ macro and then override it with the www.tmac package if it .\" exists. .de __URL__ \\$2 \(la \\$1 \(ra\\$3 .. .if \n[.g] .mso www.tmac .TH nvidia\-settings 1 "__DATE__" "nvidia\-settings __VERSION__" .SH NAME nvidia\-settings \- configure the NVIDIA graphics driver .SH SYNOPSIS .BI "nvidia\-settings [" "options" "]" .br .BI "nvidia\-settings [" "options" "] \-\-no\-config" .br .BI "nvidia\-settings [" "options" "] \-\-load\-config\-only" .br .BI "nvidia\-settings [" "options" "] {\-\-query=" attr " | \-\-assign=" attr = value "} ..." .br .BI "nvidia\-settings [" "options" "] \-\-glxinfo" .PP Options: .BI "[\-vh] [\-\-config=" configfile "] [\-c " ctrl-display "]" .br .I " \fB[\-\-verbose=\fP{\fInone \fP|\fI errors \fP|\fI deprecations \fP|\fI warnings \fP|\fI all\fP}\fB]" .br .I " \fB[\-\-describe=\fP{\fIall \fP|\fI list \fP|\fI attribute_name\fP}\fB]" .PP .I attr has the form: .ti +5 .IB DISPLAY / attribute_name [ display_devices ] .SH DESCRIPTION The .B nvidia\-settings utility is a tool for configuring the NVIDIA graphics driver. It operates by communicating with the NVIDIA X driver, querying and updating state as appropriate. This communication is done via the NV-CONTROL, GLX, XVideo, and RandR X extensions. .PP Values such as brightness and gamma, XVideo attributes, temperature, and OpenGL settings can be queried and configured via .B nvidia\-settings. .PP When .B nvidia\-settings starts, it reads the current settings from its configuration file and sends those settings to the X server. Then, it displays a graphical user interface (GUI) for configuring the current settings. When .B nvidia\-settings exits, it queries the current settings from the X server and saves them to the configuration file. dnl Call gen-manpage-opts to generate this section. __OPTIONS__ .SH "USER GUIDE" .SS Contents 1. Layout of the nvidia\-settings GUI .br 2. How OpenGL Interacts with nvidia\-settings .br 3. Loading Settings Automatically .br 4. Command Line Interface .br 5. X Display Names in the Config File .br 6. Connecting to Remote X Servers .br 7. Licensing .br 8. TODO .br .SS 1. Layout of the nvidia\-settings GUI The .B nvidia\-settings GUI is organized with a list of different categories on the left side. Only one entry in the list can be selected at once, and the selected category controls which "page" is displayed on the right side of the .B nvidia\-settings GUI. .PP The category list is organized in a tree: each X screen contains the relevant subcategories beneath it. Similarly, the Display Devices category for a screen contains all the enabled display devices beneath it. Besides each X screen, the other top level category is "nvidia\-settings Configuration", which configures behavior of the .B nvidia\-settings application itself. .PP Along the bottom of the .B nvidia\-settings GUI, from left to right, is: .TP 1) a status bar which indicates the most recently altered option; .TP 2) a Help button that toggles the display of a help window which provides a detailed explanation of the available options in the current page; and .TP 3) a Quit button to exit .B nvidia\-settings. .PP Most options throughout .B nvidia\-settings are applied immediately. Notable exceptions are OpenGL options which are only read by OpenGL when an OpenGL application starts. .PP Details about the options on each page of .B nvidia\-settings are available in the help window. .SS 2. How OpenGL Interacts with nvidia\-settings .PP When an OpenGL application starts, it downloads the current values from the X driver, and then reads the environment (see .I APPENDIX E: OPENGL ENVIRONMENT VARIABLE SETTINGS in the README). Settings from the X server override OpenGL's default values, and settings from the environment override values from the X server. .PP For example, by default OpenGL uses the FSAA setting requested by the application (normally, applications do not request any FSAA). An FSAA setting specified in .B nvidia\-settings would override the OpenGL application's request. Similarly, the .B __GL_FSAA_MODE environment variable will override the application's FSAA setting, as well as any FSAA setting specified in .B nvidia\-settings. .PP Note that an OpenGL application only retrieves settings from the X server when it starts, so if you make a change to an OpenGL value in .B nvidia\-settings, it will only apply to OpenGL applications which are started after that point in time. .SS 3. Loading Settings Automatically The NVIDIA X driver does not preserve values set with .B nvidia\-settings between runs of the X server (or even between logging in and logging out of X, with .BR xdm (1), .B gdm, or .B kdm ). This is intentional, because different users may have different preferences, thus these settings are stored on a per-user basis in a configuration file stored in the user's home directory. .PP The configuration file is named .IR ~/.nvidia\-settings\-rc . You can specify a different configuration file name with the .B \-\-config command line option. .PP After you have run .B nvidia\-settings once and have generated a configuration file, you can then run: .sp .ti +5 nvidia\-settings \-\-load\-config\-only .sp at any time in the future to upload these settings to the X server again. For example, you might place the above command in your .I ~/.xinitrc file so that your settings are applied automatically when you log in to X. .PP Your .I .xinitrc file, which controls what X applications should be started when you log into X (or startx), might look something like this: .nf nvidia\-settings \-\-load\-config\-only & xterm & evilwm .fi or: .nf nvidia\-settings \-\-load\-config\-only & gnome\-session .fi If you do not already have an .I ~/.xinitrc file, then chances are that .BR xinit (1) is using a system-wide xinitrc file. This system wide file is typically here: .nf /etc/X11/xinit/xinitrc .fi To use it, but also have .B nvidia\-settings upload your settings, you could create an .I ~/.xinitrc with the contents: .nf nvidia\-settings \-\-load\-config\-only & . /etc/X11/xinit/xinitrc .fi System administrators may choose to place the .B nvidia\-settings load command directly in the system xinitrc script. .PP Please see the .BR xinit (1) man page for further details of configuring your .I ~/.xinitrc file. .SS 4. Command Line Interface .B nvidia\-settings has a rich command line interface: all attributes that can be manipulated with the GUI can also be queried and set from the command line. The command line syntax for querying and assigning attributes matches that of the .I .nvidia\-settings\-rc configuration file. .PP The .B \-\-query option can be used to query the current value of attributes. This will also report the valid values for the attribute. You can run .B nvidia\-settings \-\-query all for a complete list of available attributes, what the current value is, what values are valid for the attribute, and through which target types (e.g., X screens, GPUs) the attributes can be addressed. Additionally, individual attributes may be specified like this: .nf nvidia\-settings \-\-query Overlay .fi An attribute name may be prepended with an X Display name and a forward slash to indicate a different X Display; e.g.: .nf nvidia\-settings \-\-query localhost:0.0/Overlay .fi An attribute name may also just be prepended with the screen number and a forward slash: .nf nvidia\-settings \-\-query 0/Overlay .fi in which case the default X Display will be used, but you can indicate to which X screen to direct the query (if your X server has multiple X screens). If no X screen is specified, then the attribute value will be queried for all valid targets of the attribute (eg GPUs, Displays X screens, etc). .PP Attributes can be addressed through "target types". A target type indicates the object that is queried when you query an attribute. The default target type is an X screen, but other possible target types are GPUs, Frame Lock devices, Visual Computing Systems, SDI Input Devices, and fans. .PP Target types give you different granularities with which to perform queries and assignments. Since X screens can span multiple GPUs (in the case of Xinerama, or SLI), and multiple X screens can exist on the same GPU, it is sometimes useful to address attributes by GPU rather than X screen. .PP A target specification is contained within brackets and may consist of a target type name, a colon, and the target id. The target type name can be one of .B screen, .B gpu, .B framelock, .B vcs, .B gvi, .B fan, .B thermalsensor, .B svp, or .B dpy; the target id is the index into the list of targets (for that target type). Target specifications can be used wherever an X screen is used in query and assignment commands; the target specification can be used either by itself on the left side of the forward slash, or as part of an X Display name. .PP For example, the following queries address X screen 0 on the localhost: .nf nvidia\-settings \-\-query 0/VideoRam nvidia\-settings \-\-query localhost:0.0/VideoRam nvidia\-settings \-\-query [screen:0]/VideoRam nvidia\-settings \-\-query localhost:0[screen:0]/VideoRam .fi To address GPU 0 instead, you can use either of: .nf nvidia\-settings \-\-query [gpu:0]/VideoRam nvidia\-settings \-\-query localhost:0[gpu:0]/VideoRam .fi Note that if a target specification is present, it will override any X screen specified in the display name as the target to process. For example, the following query would address GPU 0, and not X screen 1: .nf nvidia\-settings \-\-query localhost:0.1[gpu:0]/VideoRam .fi .PP A target name may be used instead of a target id, in which case all targets with matching names are processed. .PP For example, querying the DigitalVibrance of display device DVI-I-1 may be done like so: .nf nvidia\-settings \-\-query [dpy:DVI\-I\-1]/DigitalVibrance .fi When a target name is specified, the target type name may be omitted, though this should be used with caution since the name will be matched across all target types. The above example could be written as: .nf nvidia\-settings \-\-query [DVI\-I\-1]/DigitalVibrance .fi The target name may also simply be a target type name, in which case all targets of that type will be queried. .PP For exmple, querying the BusRate of all GPUs may be done like so: .nf nvidia\-settings \-\-query [gpu]/BusRate .fi .PP The target specification may also include a target qualifier. This is useful to limit processing to a subset of targets, based on an existing relationship(s) to other targets. The target qualifier is specified by prepending a target type name, a colon, the target id, and a period to the existing specification. Only one qualitfer may be specified. .PP For example, querying the RefreshRate of all DFP devices on GPU 1 may be done like so: .nf nvidia\-settings \-\-query [GPU:1.DPY:DFP]/RefreshRate .fi Likewise, a simple target name (or target type name) may be used as the qualifier. For example, to query the BusType of all GPUs that have DFPs can be done like so: .nf nvidia\-settings \-\-query [DFP.GPU]/BusType .fi .PP See the output of .nf nvidia\-settings \-\-query all .fi for what targets types can be used with each attribute. See the output of .nf nvidia\-settings \-\-query screens \-\-query gpus \-\-query framelocks \-\-query vcs \-\-query gvis \-\-query fans .fi for lists of targets for each target type. .PP The .B \-\-assign option can be used to assign a new value to an attribute. The valid values for an attribute are reported when the attribute is queried. The syntax for .B \-\-assign is the same as .B \-\-query, with the additional requirement that assignments also have an equal sign and the new value. For example: .nf nvidia\-settings \-\-assign FSAA=2 nvidia\-settings \-\-assign [CRT\-1]/DigitalVibrance=9 nvidia\-settings \-\-assign [gpu:0]/DigitalVibrance=0 .fi .PP Multiple queries and assignments may be specified on the command line for a single invocation of .B nvidia\-settings. Assignments are processed in the order they are entered on the command line. If multiple assignments are made to the same attribute or to multiple attributes with dependencies, then the later assignments will have priority. .PP If either the .B \-\-query or .B \-\-assign options are passed to .B nvidia\-settings, the GUI will not be presented, and .B nvidia\-settings will exit after processing the assignments and/or queries. In this case, settings contained within the .I ~/.nvidia\-settings\-rc configuration file will not be automatically uploaded to the X server, nor will the .I ~/.nvidia\-settings\-rc configuration file be automatically updated to reflect attribute assignments made via the .B \-\-assign option. .SS 5. X Display Names in the Config File In the Command Line Interface section above, it was noted that you can specify an attribute without any X Display qualifiers, with only an X screen qualifier, or with a full X Display name. For example: .nf nvidia\-settings \-\-query FSAA nvidia\-settings \-\-query 0/FSAA nvidia\-settings \-\-query stravinsky.nvidia.com:0/FSAA .fi In the first two cases, the default X Display will be used, in the second case, the screen from the default X Display can be overridden, and in the third case, the entire default X Display can be overridden. .PP The same possibilities are available in the .I ~/.nvidia\-settings\-rc configuration file. .PP For example, in a computer lab environment, you might log into any of multiple workstations, and your home directory is NFS mounted to each workstation. In such a situation, you might want your .I ~/.nvidia\-settings\-rc file to be applicable to all the workstations. Therefore, you would not want your config file to qualify each attribute with an X Display Name. Leave the "Include X Display Names in the Config File" option unchecked on the .B nvidia\-settings Configuration page (this is the default). .PP There may be cases when you do want attributes in the config file to be qualified with the X Display name. If you know what you are doing and want config file attributes to be qualified with an X Display, check the "Include X Display Names in the Config File" option on the .B nvidia\-settings Configuration page. .PP In the typical home user environment where your home directory is local to one computer and you are only configuring one X Display, then it does not matter whether each attribute setting is qualified with an X Display Name. .SS 6. Connecting to Remote X Servers .B nvidia\-settings is an X client, but uses two separate X connections: one to display the GUI, and another to communicate the NV-CONTROL requests. These two X connections do not need to be to the same X server. For example, you might run .B nvidia\-settings on the computer stravinsky.nvidia.com, export the display to the computer bartok.nvidia.com, but be configuring the X server on the computer schoenberg.nvidia.com: .nf nvidia\-settings \-\-display=bartok.nvidia.com:0 \\ \-\-ctrl\-display=schoenberg.nvidia.com:0 .fi If .B \-\-ctrl\-display is not specified, then the X Display to control is what .B \-\-display indicates. If .B \-\-display is also not specified, then the .I $DISPLAY environment variable is used. .PP Note, however, that you will need to have X permissions configured such that you can establish an X connection from the computer on which you are running .B nvidia\-settings (stravinsky.nvidia.com) to the computer where you are displaying the GUI (bartok.nvidia.com) and the computer whose X Display you are configuring (schoenberg.nvidia.com). .PP The simplest, most common, and least secure mechanism to do this is to use 'xhost' to allow access from the computer on which you are running .B nvidia\-settings. .nf (issued from bartok.nvidia.com) xhost +stravinsky.nvidia.com (issued from schoenberg.nvidia.com) xhost +stravinsky.nvidia.com .fi This will allow all X clients run on stravinsky.nvidia.com to connect and display on bartok.nvidia.com's X server and configure schoenberg.nvidia.com's X server. .PP Please see the .BR xauth (1) and .BR xhost (1) man pages, or refer to your system documentation on remote X applications and security. You might also Google for terms such as "remote X security" or "remote X Windows", and see documents such as the Remote X Apps mini-HOWTO: .sp .ti +5 .__URL__ http://www.tldp.org/HOWTO/Remote-X-Apps.html .sp Please also note that the remote X server to be controlled must be using the NVIDIA X driver. .SS 7. Licensing The source code to .B nvidia\-settings is released as GPL. The most recent official version of the source code is available here: .sp .ti +5 .__URL__ ftp://download.nvidia.com/XFree86/nvidia-settings/ .sp Note that .B nvidia\-settings is simply an NV-CONTROL client. It uses the NV-CONTROL X extension to communicate with the NVIDIA X server to query current settings and make changes to settings. .PP You can make additions directly to .B nvidia\-settings, or write your own NV-CONTROL client, using .B nvidia\-settings as an example. .PP Documentation on the NV-CONTROL extension and additional sample clients are available in the .B nvidia\-settings source tarball. Patches can be submitted to linux\-bugs@nvidia.com. .SS 8. TODO There are many things still to be added to .B nvidia\-settings, some of which include: .TP - different toolkits? The GUI for .B nvidia\-settings is cleanly abstracted from the back-end of .B nvidia\-settings that parses the configuration file and command line, communicates with the X server, etc. If someone were so inclined, a different front-end GUI could be implemented. .TP - write a design document explaining how .B nvidia\-settings is designed; presumably this would make it easier for people to become familiar with the code base. .PP If there are other things you would like to see added (or better yet, would like to add yourself), please contact linux\-bugs@nvidia.com. .SH FILES .TP .I ~/.nvidia\-settings\-rc .SH EXAMPLES .TP .B nvidia\-settings Starts the .B nvidia\-settings graphical interface. .TP .B nvidia\-settings \-\-load\-config\-only Loads the settings stored in .I ~/.nvidia\-settings\-rc and exits. .TP .B nvidia\-settings \-\-rewrite\-config\-file Writes the current X server configuration to .I ~/.nvidia\-settings\-rc file and exits. .TP .B nvidia\-settings \-\-query FSAA Query the value of the full-screen antialiasing setting. .TP .B nvidia\-settings \-\-assign RedGamma=2.0 \-\-assign BlueGamma=2.0 \-\-assign GreenGamma=2.0 Set the gamma of the screen to 2.0. .SH AUTHOR Aaron Plattner .br NVIDIA Corporation .SH "SEE ALSO" .BR nvidia\-xconfig (1)ifelse(__BUILD_OS__,Linux,[[[, .BR nvidia\-installer (1)]]]) .SH COPYRIGHT Copyright \(co 2010 NVIDIA Corporation. nvidia-settings/doc/src.mk0000664000175000017500000000050512236467170015727 0ustar albertoalberto# # files in the doc directory of nvidia-settings # DOC_SRC += DOC_EXTRA_DIST += NV-CONTROL-API.txt DOC_EXTRA_DIST += FRAMELOCK.txt DOC_EXTRA_DIST += nvidia-settings.1.m4 DOC_EXTRA_DIST += nvidia-settings.desktop DOC_EXTRA_DIST += nvidia-settings.png DOC_EXTRA_DIST += src.mk DOC_DIST_FILES := $(DOC_SRC) $(DOC_EXTRA_DIST)nvidia-settings/doc/version.mk0000664000175000017500000000003012236467170016616 0ustar albertoalbertoNVIDIA_VERSION = 331.20 nvidia-settings/doc/NV-CONTROL-API.txt0000664000175000017500000003634512236467170017433 0ustar albertoalberto NV-CONTROL X Extension - API specificiation v 1.6 1. INTRODUCTION The NV-CONTROL X extension provides a mechanism for X clients to query and set configuration parameters of the NVIDIA X driver. State set by the NV-CONTROL X extension is assumed to be persistent only for the current server generation. Attributes are configurable on a per X screen basis, and some attributes are also configurable on a per display device basis. Addtionally, some attributes can only be queried, though most can be both queried and modified. The NV-CONTROL extension provides a mechanism to determine what values are valid for an attribute, if an attribute is read-only, if it can be read and written, if it requires a display device qualifier, and if the the attribute is available on the specified X screen. Finally, NV-CONTROL clients may also request to be notified when an attribute is changed by any other NV-CONTROL client. 2. DISPLAY DEVICES A "Display Device" refers to some piece of hardware capable of displaying an image. Display devices are separated into the three general categories: analog CRTs, digital flatpanels, and TVs. Note that analog flatpanels fall under the category of analog CRTs. The NVIDIA X driver allows multiple display devices to display portions of the same X screen; this is configured through the TwinView feature of the NVIDIA X driver. TwinView is described in the Appendix on TwinView in the NVIDIA Linux driver text README file. A consequence of TwinView is that an X screen does not necessarily uniquely identify a display device. While most attributes controlled by the NV-CONTROL X extension apply to an entire X screen, some attributes can be controlled per display device. When querying and assigning such attributes, the particular display device is specified via a display device mask. A "display device mask" is an unsigned 32 bit value that identifies one or more display devices: the first 8 bits each identify a CRT, the next 8 bits each identify a TV, and the next 8 each identify a DFP. For example, 0x1 refers to CRT-0, 0x3 refers to CRT-0 and CRT-1, 0x10001 refers to CRT-0 and DFP-0, etc. 3. QUERYING THE EXTENSION NV-CONTROL clients can query for the existence of the NV-CONTROL X extension with: Bool XNVCTRLQueryExtension (Display *dpy, int *event_basep, int *error_basep); This function returns True if the extension exists, and returns False if the extension does not. It also returns the error and event bases. The arguments are: dpy - The connection to the X server. event_basep - The returned event base. Currently, only one extension specific event is defined. error_basep - The returned error base. Currently, no extension specific errors are defined. The version of the NV-CONTROL extension can be queried with: Bool XNVCTRLQueryVersion (Display *dpy, int *major, int *minor); This function returns True if the extension exists, and returns False if it does not. It also returns the major and minor version numbers of the extension. The arguments are: dpy - The connection to the X server. major - The returned major version number of the extension. minor - The returned minor version number of the extension. You can determine if a particular X screen is controlled by the NVIDIA X driver (and thus supports the NV-CONTROL X extension) with: Bool XNVCTRLIsNvScreen (Display *dpy, int screen); This function returns True if the specified screen is controlled by the NVIDIA driver, and thus supports the NV-CONTROL X extension. It returns False if the specified screen does not support the NV-CONTROL X extension. The arguments are: dpy - The connection to the X server. screen - the X screen to query. 4. QUERYING VALID ATTRIBUTE VALUES NV-CONTROL clients can query the valid values for any integer attribute with: Bool XNVCTRLQueryValidAttributeValues (Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, NVCTRLAttributeValidValuesRec *values); This function returns True if the attribute exists on the specified X screen, or False if the attribute is not available on the specified X screen. The arguments are: dpy - The connection to the X server. screen - the X screen to query. display_mask - for attributes that can be controlled on a per display device basis, the display_mask should uniquely identify a single display device. This argument is ignored for attributes that apply to the entire X screen. attribute - the integer attribute to query values - the returned NVCTRLAttributeValidValuesRec structure. The NVCTRLAttributeValidValuesRec structure is defined as: typedef struct _NVCTRLAttributeValidValues { int type; union { struct { int min; int max; } range; struct { unsigned int ints; } bits; } u; unsigned int permissions; } NVCTRLAttributeValidValuesRec; Where type can be one of: #define ATTRIBUTE_TYPE_UNKNOWN 0 #define ATTRIBUTE_TYPE_INTEGER 1 #define ATTRIBUTE_TYPE_BITMASK 2 #define ATTRIBUTE_TYPE_BOOL 3 #define ATTRIBUTE_TYPE_RANGE 4 #define ATTRIBUTE_TYPE_INT_BITS 5 ATTRIBUTE_TYPE_INTEGER indicates that the attribute is an integer value; any integer may be specified when setting this attribute. ATTRIBUTE_TYPE_BITMASK indicates that the attribute is an integer value, interpretted as a bitmask. This is the type, for example, of the NV_CTRL_CONNECTED_DISPLAYS attribute. ATTRIBUTE_TYPE_BOOL indicates that the attribute is a boolean; valid values are 1 (on/true) and 0 (off/false). ATTRIBUTE_TYPE_RANGE indicates that the attribute can have any integer value between NVCTRLAttributeValidValues.u.range.min and NVCTRLAttributeValidValues.u.range.max (inclusive). ATTRIBUTE_TYPE_INT_BITS indicates that the attribute can only have certain integer values, indicated by which bits in NVCTRLAttributeValidValues.u.bits.ints are on (for example: if bit 0 is on, then 0 is a valid value; if bit 5 is on, then 5 is a valid value, etc). This is the type, for example, of NV_CTRL_FSAA_MODE. The permissions field in NVCTRLAttributeValidValuesRec is a bitmask that can contain any of: #define ATTRIBUTE_TYPE_READ 0x1 #define ATTRIBUTE_TYPE_WRITE 0x2 #define ATTRIBUTE_TYPE_DISPLAY 0x4 ATTRIBUTE_TYPE_READ indicates that the attribute is readable; in general, all attributes will be readable. ATTRIBUTE_TYPE_WRITE indicates that the attribute is writable; attributes may not be writable for various reasons: they represent static system information, they can only be changed by changing an XF86Config option, etc. ATTRIBUTE_TYPE_DISPLAY indicates that the attribute can be controlled on a per display device basis, and thus XNVCTRLQueryAttribute() and XNVCTRLSetAttribute() require that a display device be specified. The XNVCTRLQueryValidAttributeValues() function can cause the following X protocol errors: BadValue - The screen does not exist. BadMatch - The NVIDIA driver is not present on that screen. 5. QUERYING ATTRIBUTE VALUES NV-CONTROL clients can query the current value of an integer attribute with: Bool XNVCTRLQueryAttribute (Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, int *value); This function returns True if the attribute exists, and stores the current attribute value in the memory pointed to by the value argument. False is returned if the attribute does not exist on the specified X screen. The arguments are: dpy - The connection to the X server. screen - the X screen to query. display_mask - if the attribute requires a display device, then this indicates the display device to query; this field is ignored if the attribute is not display device specific. You can determine if an attribute is display device specific by querying the valid values and checking for the ATTRIBUTE_TYPE_DISPLAY bit in the permissions field. attribute - the attribute to query. value - the returned attribute value. This function can cause the following X protocol errors: BadValue - The screen does not exist. BadMatch - The NVIDIA driver is not present on that screen. NV-CONTROL clients can query the read-only string attributes with: Bool XNVCTRLQueryStringAttribute (Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, char **ptr); This function returns True if the string attribute exists; or it returns False if the string attribute does not exist. If XNVCTRLQueryStringAttribute returns True, *ptr will point to an allocated string containing the string attribute requested. It is the caller's responsibility to free the string with XFree(). The arguments are: dpy - The connection to the X server. screen - the X screen to query. display_mask - if the attribute requires a display device, then this indicates the display device to query; this field is ignored if the attribute is not display device specific. attribute - the string attribute to query ptr - the returned allocated string This function can cause the following X protocol errors: BadValue - The screen does not exist. BadMatch - The NVIDIA driver is not present on that screen. BadAlloc - Insufficient resources to fulfill the request. See NVCtrl.h (distributed in the src/libXNVCtrl/ directory of the nvidia-settings source package) for a list of possible string attributes. 6. ASSIGNING ATTRIBUTE VALUES An integer attribute can be assigned a value with: void XNVCTRLSetAttribute (Display *dpy, int screen, unsigned int display_mask, unsigned int attribute, int value); This function sets the attribute to the given value. This function does not have a return value. Note that, because it does not return a value, XNVCTRLSetAttribute() only queues the request in the X command stream. The command will not actually be sent to the server until an X command that flushes the X command stream (such as XFlush(), or any API command that queries a value from the server) is called. The arguments are: dpy - The connection to the X server. screen - the X screen to query. display_mask - if the attribute requires a display device, then this indicates the display device to set; this field is ignored if the attribute is not display device specific. You can determine if an attribute is display device specific by querying the valid values and checking for the ATTRIBUTE_TYPE_DISPLAY bit in the permissions field. attribute - the attribute to set. value - the value the attribute should be set to. See NVCtrl.h (distributed in the src/libXNVCtrl/ directory of the nvidia-settings source package) for a list of possible integer attributes. This function can cause the following X protocol errors: BadMatch - The NVIDIA driver is not present on that screen. BadValue - The screen does not exist, or an invalid value is specified, or the attribute does not exist on the specified X screen, or the attribute requires a display device and display_mask does not uniquely identify a display device. Before calling XNVCTRLSetAttribute(), an NV-CONTROL client should use XNVCTRLQueryAttribute() or XNVCTRLQueryValidAttributeValues() to determine if the attribute exists on the specified X screen; if the attribute does not exist and XNVCTRLSetAttribute() is called for that attribute, then a BadValue X protocol error will be triggered. 7. SELECTING EVENT NOTIFICATION NV-CONTROL clients can enable NV-CONTROL events with: Bool XNVCtrlSelectNotify (Display *dpy, int screen, int type, Bool onoff); This function returns True if the extension exists, or False if the extension does not exist. The arguments are: dpy - The connection to the X server. screen - the X screen on which to enable events. type - the type of event to enable; currently, the only NV-CONTROL event type is ATTRIBUTE_CHANGED_EVENT. onoff - whether to enable (True) or disable (False) receiving this event type. This function can cause the following X protocol errors: BadValue - The screen does not exist. BadMatch - The NVIDIA driver is not present on that screen. When an NV-CONTROL client changes an integer attribute value, all other NV-CONTROL clients with ATTRIBUTE_CHANGED_EVENT notificaion enabled will receive an XEvent where XEvent.type is equal to: event_base + ATTRIBUTE_CHANGED_EVENT where event_base is the event base returned by XNVCTRLQueryExtension(). The XEvent can then be cast as an XNVCtrlAttributeChangedEvent structure: typedef struct { int type; unsigned long serial; Bool send_event; /* always FALSE, we don't allow send_events */ Display *display; Time time; int screen; unsigned int display_mask; unsigned int attribute; int value; } XNVCtrlAttributeChangedEvent; The screen, display_mask, attribute, and value fields correspond to the arguments passed to XNVCTRLSetAttribute(). 8. NV-CONTROL EXTENSION HISTORY Please see the NV-CONTROL Protocol Version History comment at the top of nv_control.h. nvidia-settings/doc/Makefile0000664000175000017500000000745312236467170016260 0ustar albertoalberto# # nvidia-settings: A tool for configuring the NVIDIA X driver on Unix # and Linux systems. # # Copyright (C) 2008-2012 NVIDIA Corporation. # # This program is free software; you can redistribute it and/or modify it # under the terms and conditions of the GNU General Public License, # version 2, as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # ############################################################################## # include common variables and functions ############################################################################## UTILS_MK_DIR ?= .. include $(UTILS_MK_DIR)/utils.mk ############################################################################## # The common-utils directory may be in one of two places: either # elsewhere in the driver source tree when building nvidia-settings as # part of the NVIDIA driver build (in which case, COMMON_UTILS_DIR # should be defined by the calling makefile), or directly in the # source directory when building from the nvidia-settings source # tarball (in which case, the below conditional assignments should be # used) ############################################################################## COMMON_UTILS_DIR ?= ../src/common-utils ############################################################################## # assign variables ############################################################################## MANPAGE_GZIP ?= 1 MANPAGE_gzipped = $(OUTPUTDIR)/nvidia-settings.1.gz MANPAGE_not_gzipped = $(OUTPUTDIR)/nvidia-settings.1 ifeq ($(MANPAGE_GZIP),1) MANPAGE = $(MANPAGE_gzipped) else MANPAGE = $(MANPAGE_not_gzipped) endif GEN_MANPAGE_OPTS = $(OUTPUTDIR)/gen-manpage-opts OPTIONS_1_INC = $(OUTPUTDIR)/options.1.inc common_cflags += -I $(COMMON_UTILS_DIR) common_cflags += -I ../src/libXNVCtrlAttributes CFLAGS += $(common_cflags) HOST_CFLAGS += $(common_cflags) ############################################################################## # build rules ############################################################################## .PNONY: all install MANPAGE_install clean clobber all: $(MANPAGE) install: MANPAGE_install MANPAGE_install: $(MANPAGE) $(MKDIR) $(MANDIR) $(INSTALL) $(INSTALL_DOC_ARGS) $< $(MANDIR)/$(notdir $<) clean clobber: rm -rf $(MANPAGE) *~ $(OUTPUTDIR)/*.o $(OUTPUTDIR)/*.d \ $(GEN_MANPAGE_OPTS) $(OPTIONS_1_INC) ############################################################################## # Documentation ############################################################################## AUTO_TEXT = ".\\\" WARNING: THIS FILE IS AUTO-GENERATED! Edit $< instead." doc: $(MANPAGE) GEN_MANPAGE_OPTS_SRC = ../src/gen-manpage-opts.c GEN_MANPAGE_OPTS_SRC += $(COMMON_UTILS_DIR)/gen-manpage-opts-helper.c GEN_MANPAGE_OPTS_OBJS = $(call BUILD_OBJECT_LIST,$(GEN_MANPAGE_OPTS_SRC)) $(foreach src, $(GEN_MANPAGE_OPTS_SRC), \ $(eval $(call DEFINE_OBJECT_RULE,HOST,$(src)))) $(GEN_MANPAGE_OPTS): $(GEN_MANPAGE_OPTS_OBJS) $(call quiet_cmd,HOST_LINK) \ $(HOST_CFLAGS) $(HOST_LDFLAGS) $(HOST_BIN_LDFLAGS) $^ -o $@ $(OPTIONS_1_INC): $(GEN_MANPAGE_OPTS) @./$< > $@ $(MANPAGE_not_gzipped): nvidia-settings.1.m4 $(OPTIONS_1_INC) $(VERSION_MK) $(call quiet_cmd,M4) \ -D__HEADER__=$(AUTO_TEXT) \ -D__BUILD_OS__=$(TARGET_OS) \ -D__VERSION__=$(NVIDIA_VERSION) \ -D__DATE__="`$(DATE) +%F`" \ -I $(OUTPUTDIR) \ $< > $@ $(MANPAGE_gzipped): $(MANPAGE_not_gzipped) $(GZIP_CMD) -9f < $< > $@ nvidia-settings/doc/nvidia-settings.png0000664000175000017500000004154712236467170020440 0ustar albertoalbertoPNG  IHDR>a MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3bKGD pHYs  tIME  IDATx}w$Wuܪ/M3F0P@ $@6"`56`~ |kzϻ F%,I gь4޼c箪{QUFBJ@tpϹ'ιuST:թNuST:թNuST:թNuST:թNuST:թNuST:JzHtq5LQ遈 @TYri(}"T;Lk7kHTff}DD`(d-"0 v/KX ?1yv?䋍z]MwlkB]`f"3A2"33\D0 bb[o=:H L`h.G4A0PՓϸ,.JL$,L}~|=@` HZw5@`4c^E+CEɾ3\**xrwMvܿ\u]{y؆i}g}{ T!Q3¥3[*]oXǸ2ab|Y*K8|GW?Z k V""4!vAVQI3Tj1TS 3Ujå]üv* >wP1Q:cuoDJ"HF:ȱ UzVߧ 舲(FZY^) \q><`Hy׳(4 @{zA6^w\ j& ~)8,?Wjae,z] BBV. 7ZR˪=E=oD-<5.Z.P,,ӘM C# zA@HĠ# A:$lH_aЄ.6r s^w\2:!od '| 'vNO 4B0:hinC[jt}b$ï%PaʧeaZ.;j+yTCP S&F"F $TLAh`DB1p\cӚA+   r=TRET~(Xג{>>ӱ5 ZZݱp(dSoHo.TvHA6J\wpY]h$B# `Kx^xh|pݕ7-#m@9a׵A+@4@OS7^W0^`]w'I#tK[K-{#F/~.L ۶!-%x?` p8HX Zh&;G JD"Ƥ$!= SK^hj@(r iY ]3|^O,G pH] ˷nݼ@غxa_,lâB1b1Ӵ+4!LMM "qKxzP#hEoKxN!*tD 6 g`Wx藿އkm-3HD+0a\5LdҊihy }whlJ$lw$Z 2G9R 493A`bj3)@BIm됍5b:C0qL3BN`45ÇC1@ۓmSY @$,1q~݈+܀՝kHخQV8_mfrH[ p +ɇD1j۷mXxmhM` I #9=w0',ݐu ۮ37xP(:[RʬmmsB~nvnr'#nb$  I^lnh7!BI'OA7t5ABBt4GEl_;45]Z2?7s+կݾwwĢ߈D0:3өq)1MY|83N6?[z;0K PPr,ms8_̝YJcm=&I"#  6Zڋ]V$`( 0hێuM7W!E`3vF5{Ty\ .e3/౏j&Ga=,@Aӡ,:(ܺKĤ.Тnjǜb3tH[P4lX 0HG(@8@!k R뛒mg]813G2 /~mz406haD۵nB0+bfF8=C0eib-HA]JRyуrDWAUI6{f/|`@_{6ngPt \X(ޏB1([c xnOXcУ-{~cwKղF DB@Ӂu]+k6h ۱%Fh>w[_/?˜DJpF:{hGNLjr/3`D=Z?$a &e "kFQRT.KssUzH#O}o0J [khl3÷&rE3[Xy>MC]U 2`wѽ>A怶&޴~:GN(KI *a&'#fV֮(n*\vv `r?acxtāG}/? cq:a߸mKXp0~އ^0,} L+8H[$?44+)⺻ou&Vd3 58<,r+I33#x#W:g]kUŎuXcaٴeO֎Cd1! phD0YQZY\T4!!tfhDЈX_@)m{6$k;AtGA֑Cg~_1]Rp8Az܂-ֺ)g"ҝ#PP0]f$AVWţOM׻놁j_֫>غ:Ne .*kTF2Haf<|fABTi4)xrQAād;mڄk564r*~W3&Kiu[tjcsm*@+|ũ~Szͥoj?Qi-nkZQT?K JVeHZ7~WFJnhV"Ibdxa?wLBV'?`nМ gsO͡O@RQ t =29,Xe;Us3q?QϔLɻdu,S ۤݠ`06M]<|zB1v Җ$$)'kXGcߴvɳ}` E7cu ̭$2 g2B$C))%RPJe(>3CJ'#{\WqX&{oS?G{˺OTResA0 Y <8cO,*y=Iђ84lV}.lI(>`Zӡ_N&pi MF,pk`p-M>so͡5O=[>[󅗅F00RW p>x|Ѥ6JIoI)H<HsÞ\Gq5k,%6Qg0$9sY N]j . mK x+/cL|{{7P\{RJ+q俱O/P̕5Lda|yz0Aiif?wpVd*fp9̷49pv~0N9v馮Чn[;r&'eӖe3HhLf&q>Yb, _ڸlKH)#B栦7ZӸ 7}53}vP2}8y+O7(.ڼ0n4]<$,ߚK `|...[j8CAѫi%HrmϭktW:l=iB*fvP$^j@$|&DGu(HQhXb G<_ٔ:=?cF~Mz϶~:ѪG,3@@ ug"&fyzh?[ĸmbU AҖ4M( &"@#v[?. mi*0v0 7LnT6Uv -Z|;oRO? ɮ13ΑM].K@)Ej NR |)Q|* }Q2 Z{q#.J)NNDI t1z+ Ϻv 3Dٶ]\J)f` #lL  & Ҏ` n:ڻc#b4^x)0˄].ކxg$"9SEQ D`.U``tU⦽IA_M&A)Uw ?2oK/) ^x>~ fDˋ 0܈cq~6;OV~0g&ڴh#63NFX%1iNV8@GK|E \[wgn]RJ6;Tٔri7@]nv}OZBmecfؿP M Lct !TU} ܋?x}>#SkxhĢR[k^`Oumҷ5 ~uݘVgQ Ǒ6sw/ް8#V =HXUBz'>8XXy\pnnX.ّ#O GKRDo[CmWa `{$KE$c8 #Zvt]y&mY*gP_~oERʋ2Ǥ*zdxaXu}g ̗J²llp3;O?rss*x5u]Nvm%˔"{hKIp,!_w/ t)0TZh &ZP* AZI @8hS[j#B:szVf x)wJ+O;vjbMdx12hU1̭% 'U@]_vn"ͫw !mA%N81Hǫ:Mc&N>YbK 0w\ ZA5ойAh1i;wO% 67q"fm 0"=gU@|F|Y/0 (AAF% Ō`P(MOy™9q҇V#Z  nd*Y:ODЎh# %y҃`si5N`Z [xbD!3G>_+fq8+F ǡiy˛L7i8Z 0uNԓ6Ϗ*07Bd1ISd̙9GrKh!򝏱 gu~#ci-ݠV\ `(f]ӰURھJ@/f|E HS穵AЂL!q7$vF" 0Xv*[@L"&N*/4 | K @ֈBJ BZwghQQ$gá1,fp6A3 @fivX6;~R,S\8~>|ضgÍ1N5t޶ul8ͷA1h:Mm}J91i,d`9lj Rab=/5bp8XƊ>@H181|FEY|!U)Vh >ѹ_ h kG6p!f+Ϥ$Gc'i⼒c|a'HVAX(5 *"XSa]+w A!᯿z ,@/fQlݱf"o&< X?N!*2a14v`Kf-}`M*]BHB?>RXоH ?XY/J3$3'e,M2ۖSf`in< m چ+{O!x 7[X8S2Otv῟SOXM'1>7!jr+=b6Q H3i41 J4rtjmU 1+8Y=DP69.t􍾠X)Uʃ i+2jZMtk`D(7x= ҹ;Vm}%sE{DQƙl&HSt熱ߝcnz0ش7vS"vȹ>J3{8$i:{v?ua טqմ&g$NDوp3398( eY_~C?=ӜlPjp5w#Bn' +dڇ 3<Oa"HgYKuQ H6{hxq )'Ա;:7оP3+ʃ l0?J8w8NϐE\)Ź!F{Cq^fi應T zu&|8BE;bWd4uXu a,B!CHς"I sC7Œ"e_Z> 3YLÊ6Ҷd;kNfMp1bv<-41vܽZBhЎ,Q0yю0h:8'ⶎuѩ=k}D0Ni 80y< L,$$\>g<?\ Ibs}nV:i=U~^O!`Yv8#msk眩dP% LabF`Q Ns(vcSy+~!`"=+ Gh] X*@蠀A̒cºD8:uG|5{2Ht iI#`p k.=Lv>]CNfASgi8(E!Ңt1ǎ3O,θ}i%;Vm?Q&( *:P8~8Dct$z+\ 0EJu8(և]5F ^߂~eE,J |Z =Ш=@SlM!ΌhR_Ѧ S3X#eD'3h1ˤiN4@)ILD霰N)FD:P6HZ."-Qce{wFf[zEO8.NuB^Gh]pfDQ?9pkڧ/*Ql-MA(W_kVu!\J~EDx53<:E퍫\1^" `KكrvV393bn s][N* 8m"DH5ytpB@( *|ҾEidH93`[n$R5upzHQ -g$=3q57C.' Zo[HX+AZqyKJX~y`ɖ^b%S4pKHP1hڿ={@ԃ(&]sP.pv?ZL\hKIhKS̹frH@>]j.>[ZZ(POŖ5xDAWya#E`a YgA~d te,.w w]7pBriecnyq嶈`#!<ٿCIJNy4w3øA`X_G vY!7=4|v%[O Aw)@]Ц~F̼N*xvzI8/fQ = 6sNVd͎ɳ8NĄx*ߣMW6\˟l\7BhtTʧT6jtAڐ%?`T f b&rO`I*X3r[s @@YK -MP &ڨ [" Xp{'mم/Nku0zvrS;tkUhئlnSqi#An0/l.:ЀB X2 w?Sc'qMf{|\Ƣ{زV-}V=&f֘ۤDZs ȋD m D;mt >l΍zl\uBt1}2c3O jtVm>=DhԂh#ؽ;vFomA4XB $-YN`M!Y/_VVL 's}oK_e}B sK>_YeմѸP*)-&`]6]d'ݿ8Fq:])(8MGƁ[Cv3yP!했8,| OУgyש^taV9h_ ]u.(q,T5Fٷ$nxeƒ,W_CB0waS`׭hڂvXkuFab֍mjZC_Th+t݊F . m|U:*_vCidRͷYlIP)H pM:Yg[@ͽcgv_(fdk/9-Qjlvfb%L0=oy1ѥ) N/v1=of|Vo͵oAuG#ƭIr`|mG'|<.+j5_^B;Xٗ\f?0ƻ6㊖\OQx !6 => J-:Md'oc&NO8K H1dɶQMdR K]$7BgRk⾵{?֒ݠ ӛ lUB*JEwi%TPWC Xy1ӫ_RCO`ifOvmƞd;m-am8H!@( /zv -s` t~6K21J&cבoz/-V-``sV` : Tj^߯0 pSbՂ__ UDz9LBk6'ZiKFaD]aF 6+@Q0ʌ%X*0ݿ~ᰖzwڸRljX 4Azo&HC vLdΆjk~xWssy}'tk_P), `(/$їhDm%e҃pj CQ'|utTUwX>Vo;WoŎU-֬7 fAvL"(JTlV6+!tS#[ P 4]rCB3 fp,t$imVk:rY9?]Pf 6q| Zqؒhufn '(N83DŽ\Tlzq̘Pfl5T:RF\.&CYj8/Qi8ѐpzɹ>HAԕhEw(v#@ =Ȉ7e[o)ۂ%4=@ P j JPW8N$(BWe cw K58*yeQy_iZf 6ut޸m:dYD" +hbF` Ng{' i$fY /ڳܷË!n>CJR(bWaYW"B`D]S̢.BAC6`ޫzݠ(.܍ӋyGq=sW TCШ>/uY"@+,Xk rZ4 Ěi T1ž[)|Q~SƵKTI|ZJ^0"ȀBӝY_\Еyy^ojuX {1=\s/ $i:Jb y]Zfg 6Psܼ‰A&&rB+8d^%ڵ{%g!|2> NvnڸwF pfWƘEǏ ^^/e*5}Gk_+ö Id Nm$ { V]-1(5-(}䁕P6^-)z-0+[0\WP^N^PQ!#/?M\^aH-I[qO+k ^VgG%.E?\;*V{哿i0F *&r$pV%,Zx T:թNuST:թNuST:թNuST:թNuST:թNuST:թN;ZK[#IENDB`nvidia-settings/Makefile0000664000175000017500000000153412236467170015505 0ustar albertoalberto# # nvidia-settings: A tool for configuring the NVIDIA X driver on Unix # and Linux systems. # # Copyright (C) 2008-2012 NVIDIA Corporation. # # This program is free software; you can redistribute it and/or modify it # under the terms and conditions of the GNU General Public License, # version 2, as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # .PHONY: all clean clobber install all clean clobber install: @$(MAKE) -C src $@ @$(MAKE) -C samples $@ @$(MAKE) -C doc $@ nvidia-settings/samples/0000775000175000017500000000000012236467170015506 5ustar albertoalbertonvidia-settings/samples/nv-control-events.c0000664000175000017500000007011212236467170021256 0ustar albertoalberto/* * Copyright (c) 2004-2008 NVIDIA, Corporation * * 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 (including the next * paragraph) 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. */ /* * nv-control-events.c - trivial sample NV-CONTROL client that * demonstrates how to handle NV-CONTROL events. */ #include #include #include #include #include #include #include "NVCtrl.h" #include "NVCtrlLib.h" #define EVENT_TYPE_START TARGET_ATTRIBUTE_CHANGED_EVENT #define EVENT_TYPE_END TARGET_BINARY_ATTRIBUTE_CHANGED_EVENT static const char *attr2str(int n); static const char *target2str(int n); static const char *targetTypeAndId2Str(int targetType, int targetId); struct target_info { int type; int count; unsigned int *pIds; // If Non-NULL, is list of target ids. }; static void print_usage(char **argv) { printf("Usage:\n"); printf("%s [-d ] [-a] [-c] [-b] [-s]\n", argv[0]); printf("\n"); printf("-d : X server display to connect to\n"); printf("-a: Listen for attribute availability events\n"); printf("-c: Listen for attribute changed events\n"); printf("-b: Listen for binary attribute changed events\n"); printf("-s: Listen for string attribute changed events\n"); printf("\n"); printf("By default (i.e., if none of -a, -c, -b, or -s are requested),\n" "all event types are enabled.\n"); } int main(int argc, char **argv) { Display *dpy; Bool ret; int event_base, error_base; int i, j, k; int sources = 0; struct target_info info[] = { { .type = NV_CTRL_TARGET_TYPE_X_SCREEN }, { .type = NV_CTRL_TARGET_TYPE_GPU }, { .type = NV_CTRL_TARGET_TYPE_DISPLAY }, { .type = NV_CTRL_TARGET_TYPE_FRAMELOCK }, { .type = NV_CTRL_TARGET_TYPE_VCSC }, { .type = NV_CTRL_TARGET_TYPE_GVI }, { .type = NV_CTRL_TARGET_TYPE_COOLER }, { .type = NV_CTRL_TARGET_TYPE_THERMAL_SENSOR }, { .type = NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER }, }; static const int num_target_types = sizeof(info) / sizeof(*info); int c; char *dpy_name = NULL; Bool anythingEnabled; #define EVENT_TYPE_ENTRY(_x) [_x] = { False, #_x } struct { Bool enabled; char *description; } eventTypes[] = { EVENT_TYPE_ENTRY(TARGET_ATTRIBUTE_CHANGED_EVENT), EVENT_TYPE_ENTRY(TARGET_ATTRIBUTE_AVAILABILITY_CHANGED_EVENT), EVENT_TYPE_ENTRY(TARGET_STRING_ATTRIBUTE_CHANGED_EVENT), EVENT_TYPE_ENTRY(TARGET_BINARY_ATTRIBUTE_CHANGED_EVENT), }; while ((c = getopt(argc, argv, "d:acbsh")) >= 0) { switch (c) { case 'd': dpy_name = optarg; break; case 'a': eventTypes[TARGET_ATTRIBUTE_AVAILABILITY_CHANGED_EVENT].enabled = True; break; case 'c': eventTypes[TARGET_ATTRIBUTE_CHANGED_EVENT].enabled = True; break; case 'b': eventTypes[TARGET_BINARY_ATTRIBUTE_CHANGED_EVENT].enabled = True; break; case 's': eventTypes[TARGET_STRING_ATTRIBUTE_CHANGED_EVENT].enabled = True; break; case '?': fprintf(stderr, "%s: Unknown argument '%c'\n", argv[0], optopt); /* fallthrough */ case 'h': print_usage(argv); return 1; } } anythingEnabled = False; for (i = EVENT_TYPE_START; i <= EVENT_TYPE_END; i++) { if (eventTypes[i].enabled) { anythingEnabled = True; break; } } if (!anythingEnabled) { for (i = EVENT_TYPE_START; i <= EVENT_TYPE_END; i++) { eventTypes[i].enabled = True; } } /* * Open a display connection, and make sure the NV-CONTROL X * extension is present on the screen we want to use. */ dpy = XOpenDisplay(dpy_name); if (!dpy) { fprintf(stderr, "Cannot open display '%s'.\n", XDisplayName(dpy_name)); return 1; } /* * check if the NV-CONTROL X extension is present on this X server */ ret = XNVCTRLQueryExtension(dpy, &event_base, &error_base); if (ret != True) { fprintf(stderr, "The NV-CONTROL X extension does not exist on '%s'.\n", XDisplayName(dpy_name)); return 1; } /* Query target counts */ for (i = 0; i < num_target_types; i++) { struct target_info *tinfo = &info[i]; if (tinfo->type == NV_CTRL_TARGET_TYPE_DISPLAY) { ret = XNVCTRLQueryTargetBinaryData(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, 0, 0, NV_CTRL_BINARY_DATA_DISPLAY_TARGETS, (unsigned char **)&(tinfo->pIds), &(tinfo->count)); if (ret != True) { fprintf(stderr, "Failed to query %s target count on '%s'.\n", target2str(tinfo->type), XDisplayName(dpy_name)); return 1; } tinfo->count = tinfo->pIds[0]; } else { ret = XNVCTRLQueryTargetCount(dpy, tinfo->type, &tinfo->count); if (ret != True) { fprintf(stderr, "Failed to query %s target count on '%s'.\n", target2str(tinfo->type), XDisplayName(dpy_name)); return 1; } } } printf("Registering to receive events...\n"); fflush(stdout); /* Register to receive events on all targets */ for (i = 0; i < num_target_types; i++) { struct target_info *tinfo = &info[i]; for (j = 0; j < tinfo->count; j++) { int target_id; if (tinfo->pIds) { target_id = tinfo->pIds[1+j]; } else { target_id = j; } for (k = EVENT_TYPE_START; k <= EVENT_TYPE_END; k++) { if (!eventTypes[k].enabled) { continue; } if ((k == TARGET_ATTRIBUTE_CHANGED_EVENT) && (tinfo->type == NV_CTRL_TARGET_TYPE_X_SCREEN)) { /* * Only register to receive events if this screen is * controlled by the NVIDIA driver. */ if (!XNVCTRLIsNvScreen(dpy, target_id)) { printf("- The NV-CONTROL X not available on X screen " "%d of '%s'.\n", i, XDisplayName(dpy_name)); continue; } /* * - Register to receive ATTRIBUTE_CHANGE_EVENT events. * These events are specific to attributes set on X * Screens. */ ret = XNVCtrlSelectNotify(dpy, target_id, ATTRIBUTE_CHANGED_EVENT, True); if (ret != True) { printf("- Unable to register to receive NV-CONTROL" "events on '%s'.\n", XDisplayName(dpy_name)); continue; } printf("+ Listening on X screen %d for " "ATTRIBUTE_CHANGED_EVENTs.\n", target_id); sources++; } /* * - Register to receive TARGET_ATTRIBUTE_CHANGED_EVENT events. * These events are specific to attributes set on various * devices and structures controlled by the NVIDIA driver. * Some possible targets include X Screens, GPUs, and Frame * Lock boards. */ ret = XNVCtrlSelectTargetNotify(dpy, tinfo->type, /* target type */ target_id, /* target ID */ k, /* eventType */ True); if (ret != True) { printf("- Unable to register on %s %d for %ss.\n", target2str(tinfo->type), target_id, eventTypes[k].description); continue; } printf("+ Listening on %s %d for %ss.\n", target2str(tinfo->type), target_id, eventTypes[k].description); sources++; } } } /* * Report the number of sources (things that we have registered to * listen for NV-CONTROL X Events on.) */ printf("\n"); printf("Listening on %d sources for NV-CONTROL X Events...\n", sources); /* * Loop forever, processing events */ while (True) { XEvent event; const char *target_str; /* block for the next event */ XNextEvent(dpy, &event); /* Handle ATTRIBUTE_CHANGED_EVENTS */ if (event.type == (event_base + ATTRIBUTE_CHANGED_EVENT)) { /* cast the X event as an XNVCtrlAttributeChangedEvent */ XNVCtrlAttributeChangedEvent *nvevent = (XNVCtrlAttributeChangedEvent *) &event; target_str = targetTypeAndId2Str(NV_CTRL_TARGET_TYPE_X_SCREEN, nvevent->screen); /* print out the event information */ printf("ATTRIBUTE_CHANGED_EVENTS: Target: %15s " "Display Mask: 0x%08x " "Attribute: (%3d) %-32s Value: %d (0x%08x)\n", target_str, nvevent->display_mask, nvevent->attribute, attr2str(nvevent->attribute), nvevent->value, nvevent->value ); /* Handle TARGET_ATTRIBUTE_CHANGED_EVENTS */ } else if (event.type == (event_base + TARGET_ATTRIBUTE_CHANGED_EVENT)) { /* cast the X event as an XNVCtrlAttributeChangedEventTarget */ XNVCtrlAttributeChangedEventTarget *nveventtarget = (XNVCtrlAttributeChangedEventTarget *) &event; target_str = targetTypeAndId2Str(nveventtarget->target_type, nveventtarget->target_id); /* print out the event information */ printf("TARGET_ATTRIBUTE_CHANGED_EVENT: Target: %15s " "Display Mask: 0x%08x " "Attribute: (%3d) %-32s Value: %d (0x%08x)\n", target_str, nveventtarget->display_mask, nveventtarget->attribute, attr2str(nveventtarget->attribute), nveventtarget->value, nveventtarget->value ); /* Handle TARGET_ATTRIBUTE_AVAILABILITY_CHANGED_EVENTS */ } else if (event.type == (event_base + TARGET_ATTRIBUTE_AVAILABILITY_CHANGED_EVENT)) { /* cast the X event as an XNVCtrlAttributeChangedEventTargetAvailability */ XNVCtrlAttributeChangedEventTargetAvailability *nveventavail = (XNVCtrlAttributeChangedEventTargetAvailability *) &event; target_str = targetTypeAndId2Str(nveventavail->target_type, nveventavail->target_id); /* print out the event information */ printf("TARGET_ATTRIBUTE_AVAILABILITY_CHANGED_EVENT: Target: %15s " "Display Mask: 0x%08x " "Attribute: (%3d) %-32s Available: %s\n", target_str, nveventavail->display_mask, nveventavail->attribute, attr2str(nveventavail->attribute), nveventavail->availability ? "Yes" : "No" ); } else if (event.type == (event_base + TARGET_STRING_ATTRIBUTE_CHANGED_EVENT)) { XNVCtrlStringAttributeChangedEventTarget *nveventstring = (XNVCtrlStringAttributeChangedEventTarget*) &event; target_str = targetTypeAndId2Str(nveventstring->target_type, nveventstring->target_id); /* print out the event information */ printf("TARGET_STRING_ATTRIBUTE_CHANGED_EVENT: Target: %15s " "Display Mask: 0x%08x " "Attribute: %3d\n", target_str, nveventstring->display_mask, nveventstring->attribute ); } else if (event.type == (event_base + TARGET_BINARY_ATTRIBUTE_CHANGED_EVENT)) { XNVCtrlBinaryAttributeChangedEventTarget *nveventbinary = (XNVCtrlBinaryAttributeChangedEventTarget *) &event; target_str = targetTypeAndId2Str(nveventbinary->target_type, nveventbinary->target_id); /* print out the event information */ printf("TARGET_BINARY_ATTRIBUTE_CHANGED_EVENT: Target: %15s " "Display Mask: 0x%08x " "Attribute: %3d\n", target_str, nveventbinary->display_mask, nveventbinary->attribute ); } else { printf("ERROR: unrecognized event type %d\n", event.type); } } return 0; } /* * target2str() - translate a target type into a string */ static const char *target2str(int n) { static char unknown[24]; switch (n) { case NV_CTRL_TARGET_TYPE_X_SCREEN: return "X Screen"; case NV_CTRL_TARGET_TYPE_GPU: return "GPU"; case NV_CTRL_TARGET_TYPE_DISPLAY: return "Display"; case NV_CTRL_TARGET_TYPE_FRAMELOCK: return "Frame Lock"; case NV_CTRL_TARGET_TYPE_VCSC: return "VCS"; case NV_CTRL_TARGET_TYPE_GVI: return "GVI"; case NV_CTRL_TARGET_TYPE_COOLER: return "Cooler"; case NV_CTRL_TARGET_TYPE_THERMAL_SENSOR: return "Thermal Sensor"; case NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER: return "3D Vision Pro Transceiver"; default: snprintf(unknown, 24, "Unknown (%d)", n); return unknown; } } static const char *targetTypeAndId2Str(int targetType, int targetId) { static char tmp[256]; snprintf(tmp, sizeof(tmp), "%s-%-3d", target2str(targetType), targetId); return tmp; } // Used to convert the NV-CONTROL #defines to human readable text. #define MAKE_ENTRY(ATTRIBUTE) { ATTRIBUTE, #ATTRIBUTE, NULL } typedef struct { int num; char *str; char *name; } AttrEntry; static AttrEntry attr_table[]; static const char *attr2str(int n) { AttrEntry *entry; entry = attr_table; while (entry->str) { if (entry->num == n) { if (!entry->name) { int len; entry->name = strdup(entry->str + 8); for (len = 0; len < strlen(entry->name); len++) { entry->name[len] = tolower(entry->name[len]); } } return entry->name; } entry++; } return NULL; } // Attribute -> String table, generated using: // // grep 'define.*\/\*' NVCtrl.h | sed 's/.*define \([^ ]*\).*/ MAKE_ENTRY(\1),/' > DATA | head DATA // static AttrEntry attr_table[] = { MAKE_ENTRY(NV_CTRL_FLATPANEL_SCALING), MAKE_ENTRY(NV_CTRL_FLATPANEL_DITHERING), MAKE_ENTRY(NV_CTRL_DITHERING), MAKE_ENTRY(NV_CTRL_DIGITAL_VIBRANCE), MAKE_ENTRY(NV_CTRL_BUS_TYPE), MAKE_ENTRY(NV_CTRL_VIDEO_RAM), MAKE_ENTRY(NV_CTRL_IRQ), MAKE_ENTRY(NV_CTRL_OPERATING_SYSTEM), MAKE_ENTRY(NV_CTRL_SYNC_TO_VBLANK), MAKE_ENTRY(NV_CTRL_LOG_ANISO), MAKE_ENTRY(NV_CTRL_FSAA_MODE), MAKE_ENTRY(NV_CTRL_TEXTURE_SHARPEN), MAKE_ENTRY(NV_CTRL_UBB), MAKE_ENTRY(NV_CTRL_OVERLAY), MAKE_ENTRY(NV_CTRL_STEREO), MAKE_ENTRY(NV_CTRL_EMULATE), MAKE_ENTRY(NV_CTRL_TWINVIEW), MAKE_ENTRY(NV_CTRL_CONNECTED_DISPLAYS), MAKE_ENTRY(NV_CTRL_ENABLED_DISPLAYS), MAKE_ENTRY(NV_CTRL_FRAMELOCK), MAKE_ENTRY(NV_CTRL_FRAMELOCK_MASTER), MAKE_ENTRY(NV_CTRL_FRAMELOCK_POLARITY), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SYNC_DELAY), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SYNC_INTERVAL), MAKE_ENTRY(NV_CTRL_FRAMELOCK_PORT0_STATUS), MAKE_ENTRY(NV_CTRL_FRAMELOCK_PORT1_STATUS), MAKE_ENTRY(NV_CTRL_FRAMELOCK_HOUSE_STATUS), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SYNC), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SYNC_READY), MAKE_ENTRY(NV_CTRL_FRAMELOCK_STEREO_SYNC), MAKE_ENTRY(NV_CTRL_FRAMELOCK_TEST_SIGNAL), MAKE_ENTRY(NV_CTRL_FRAMELOCK_ETHERNET_DETECTED), MAKE_ENTRY(NV_CTRL_FRAMELOCK_VIDEO_MODE), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SYNC_RATE), MAKE_ENTRY(NV_CTRL_FORCE_GENERIC_CPU), MAKE_ENTRY(NV_CTRL_OPENGL_AA_LINE_GAMMA), MAKE_ENTRY(NV_CTRL_FRAMELOCK_TIMING), MAKE_ENTRY(NV_CTRL_FLIPPING_ALLOWED), MAKE_ENTRY(NV_CTRL_ARCHITECTURE), MAKE_ENTRY(NV_CTRL_TEXTURE_CLAMPING), MAKE_ENTRY(NV_CTRL_FSAA_APPLICATION_CONTROLLED), MAKE_ENTRY(NV_CTRL_LOG_ANISO_APPLICATION_CONTROLLED), MAKE_ENTRY(NV_CTRL_IMAGE_SHARPENING), MAKE_ENTRY(NV_CTRL_TV_OVERSCAN), MAKE_ENTRY(NV_CTRL_TV_FLICKER_FILTER), MAKE_ENTRY(NV_CTRL_TV_BRIGHTNESS), MAKE_ENTRY(NV_CTRL_TV_HUE), MAKE_ENTRY(NV_CTRL_TV_CONTRAST), MAKE_ENTRY(NV_CTRL_TV_SATURATION), MAKE_ENTRY(NV_CTRL_TV_RESET_SETTINGS), MAKE_ENTRY(NV_CTRL_GPU_CORE_TEMPERATURE), MAKE_ENTRY(NV_CTRL_GPU_CORE_THRESHOLD), MAKE_ENTRY(NV_CTRL_GPU_DEFAULT_CORE_THRESHOLD), MAKE_ENTRY(NV_CTRL_GPU_MAX_CORE_THRESHOLD), MAKE_ENTRY(NV_CTRL_AMBIENT_TEMPERATURE), MAKE_ENTRY(NV_CTRL_PBUFFER_SCANOUT_SUPPORTED), MAKE_ENTRY(NV_CTRL_PBUFFER_SCANOUT_XID), MAKE_ENTRY(NV_CTRL_GVO_SUPPORTED), MAKE_ENTRY(NV_CTRL_GVO_SYNC_MODE), MAKE_ENTRY(NV_CTRL_GVO_SYNC_SOURCE), MAKE_ENTRY(NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT), MAKE_ENTRY(NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT), MAKE_ENTRY(NV_CTRL_GVO_DATA_FORMAT), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE), MAKE_ENTRY(NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED), MAKE_ENTRY(NV_CTRL_GVO_VIDEO_OUTPUTS), MAKE_ENTRY(NV_CTRL_GVO_FIRMWARE_VERSION), MAKE_ENTRY(NV_CTRL_GVO_SYNC_DELAY_PIXELS), MAKE_ENTRY(NV_CTRL_GVO_SYNC_DELAY_LINES), MAKE_ENTRY(NV_CTRL_GVO_INPUT_VIDEO_FORMAT_REACQUIRE), MAKE_ENTRY(NV_CTRL_GVO_GLX_LOCKED), MAKE_ENTRY(NV_CTRL_GVIO_VIDEO_FORMAT_WIDTH), MAKE_ENTRY(NV_CTRL_GVIO_VIDEO_FORMAT_HEIGHT), MAKE_ENTRY(NV_CTRL_GVIO_VIDEO_FORMAT_REFRESH_RATE), MAKE_ENTRY(NV_CTRL_GPU_OVERCLOCKING_STATE), MAKE_ENTRY(NV_CTRL_GPU_2D_CLOCK_FREQS), MAKE_ENTRY(NV_CTRL_GPU_3D_CLOCK_FREQS), MAKE_ENTRY(NV_CTRL_GPU_DEFAULT_2D_CLOCK_FREQS), MAKE_ENTRY(NV_CTRL_GPU_DEFAULT_3D_CLOCK_FREQS), MAKE_ENTRY(NV_CTRL_GPU_CURRENT_CLOCK_FREQS), MAKE_ENTRY(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS), MAKE_ENTRY(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION), MAKE_ENTRY(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE), MAKE_ENTRY(NV_CTRL_FLATPANEL_CHIP_LOCATION), MAKE_ENTRY(NV_CTRL_FLATPANEL_LINK), MAKE_ENTRY(NV_CTRL_FLATPANEL_SIGNAL), MAKE_ENTRY(NV_CTRL_USE_HOUSE_SYNC), MAKE_ENTRY(NV_CTRL_EDID_AVAILABLE), MAKE_ENTRY(NV_CTRL_FORCE_STEREO), MAKE_ENTRY(NV_CTRL_IMAGE_SETTINGS), MAKE_ENTRY(NV_CTRL_XINERAMA), MAKE_ENTRY(NV_CTRL_XINERAMA_STEREO), MAKE_ENTRY(NV_CTRL_BUS_RATE), MAKE_ENTRY(NV_CTRL_SHOW_SLI_VISUAL_INDICATOR), MAKE_ENTRY(NV_CTRL_XV_SYNC_TO_DISPLAY), MAKE_ENTRY(NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT2), MAKE_ENTRY(NV_CTRL_GVO_OVERRIDE_HW_CSC), MAKE_ENTRY(NV_CTRL_GVO_CAPABILITIES), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE_TERMINATION), MAKE_ENTRY(NV_CTRL_ASSOCIATED_DISPLAY_DEVICES), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SLAVES), MAKE_ENTRY(NV_CTRL_FRAMELOCK_MASTERABLE), MAKE_ENTRY(NV_CTRL_PROBE_DISPLAYS), MAKE_ENTRY(NV_CTRL_REFRESH_RATE), MAKE_ENTRY(NV_CTRL_GVO_FLIP_QUEUE_SIZE), MAKE_ENTRY(NV_CTRL_CURRENT_SCANLINE), MAKE_ENTRY(NV_CTRL_INITIAL_PIXMAP_PLACEMENT), MAKE_ENTRY(NV_CTRL_PCI_BUS), MAKE_ENTRY(NV_CTRL_PCI_DEVICE), MAKE_ENTRY(NV_CTRL_PCI_FUNCTION), MAKE_ENTRY(NV_CTRL_FRAMELOCK_FPGA_REVISION), MAKE_ENTRY(NV_CTRL_MAX_SCREEN_WIDTH), MAKE_ENTRY(NV_CTRL_MAX_SCREEN_HEIGHT), MAKE_ENTRY(NV_CTRL_MAX_DISPLAYS), MAKE_ENTRY(NV_CTRL_DYNAMIC_TWINVIEW), MAKE_ENTRY(NV_CTRL_MULTIGPU_DISPLAY_OWNER), MAKE_ENTRY(NV_CTRL_FSAA_APPLICATION_ENHANCED), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SYNC_RATE_4), MAKE_ENTRY(NV_CTRL_GVO_LOCK_OWNER), MAKE_ENTRY(NV_CTRL_HWOVERLAY), MAKE_ENTRY(NV_CTRL_NUM_GPU_ERRORS_RECOVERED), MAKE_ENTRY(NV_CTRL_REFRESH_RATE_3), MAKE_ENTRY(NV_CTRL_ONDEMAND_VBLANK_INTERRUPTS), MAKE_ENTRY(NV_CTRL_GPU_POWER_SOURCE), MAKE_ENTRY(NV_CTRL_GPU_CURRENT_PERFORMANCE_MODE), MAKE_ENTRY(NV_CTRL_GLYPH_CACHE), MAKE_ENTRY(NV_CTRL_GPU_CURRENT_PERFORMANCE_LEVEL), MAKE_ENTRY(NV_CTRL_GPU_ADAPTIVE_CLOCK_STATE), MAKE_ENTRY(NV_CTRL_GVO_OUTPUT_VIDEO_LOCKED), MAKE_ENTRY(NV_CTRL_GVO_SYNC_LOCK_STATUS), MAKE_ENTRY(NV_CTRL_GVO_ANC_TIME_CODE_GENERATION), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE_ALPHA_KEY), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE_LUMA_KEY_RANGE), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE_CR_KEY_RANGE), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE_CB_KEY_RANGE), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE_NUM_KEY_RANGES), MAKE_ENTRY(NV_CTRL_SWITCH_TO_DISPLAYS), MAKE_ENTRY(NV_CTRL_NOTEBOOK_DISPLAY_CHANGE_LID_EVENT), MAKE_ENTRY(NV_CTRL_NOTEBOOK_INTERNAL_LCD), MAKE_ENTRY(NV_CTRL_DEPTH_30_ALLOWED), MAKE_ENTRY(NV_CTRL_MODE_SET_EVENT), MAKE_ENTRY(NV_CTRL_OPENGL_AA_LINE_GAMMA_VALUE), MAKE_ENTRY(NV_CTRL_VCSC_HIGH_PERF_MODE), MAKE_ENTRY(NV_CTRL_DISPLAYPORT_LINK_RATE), MAKE_ENTRY(NV_CTRL_STEREO_EYES_EXCHANGE), MAKE_ENTRY(NV_CTRL_NO_SCANOUT), MAKE_ENTRY(NV_CTRL_GVO_CSC_CHANGED_EVENT), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SLAVEABLE ), MAKE_ENTRY(NV_CTRL_GVO_SYNC_TO_DISPLAY), MAKE_ENTRY(NV_CTRL_X_SERVER_UNIQUE_ID), MAKE_ENTRY(NV_CTRL_PIXMAP_CACHE), MAKE_ENTRY(NV_CTRL_PIXMAP_CACHE_ROUNDING_SIZE_KB), MAKE_ENTRY(NV_CTRL_IS_GVO_DISPLAY), MAKE_ENTRY(NV_CTRL_PCI_ID), MAKE_ENTRY(NV_CTRL_GVO_FULL_RANGE_COLOR), MAKE_ENTRY(NV_CTRL_SLI_MOSAIC_MODE_AVAILABLE), MAKE_ENTRY(NV_CTRL_GVO_ENABLE_RGB_DATA), MAKE_ENTRY(NV_CTRL_IMAGE_SHARPENING_DEFAULT), MAKE_ENTRY(NV_CTRL_PCI_DOMAIN), MAKE_ENTRY(NV_CTRL_GVI_NUM_JACKS), MAKE_ENTRY(NV_CTRL_GVI_MAX_LINKS_PER_STREAM), MAKE_ENTRY(NV_CTRL_GVI_DETECTED_CHANNEL_BITS_PER_COMPONENT), MAKE_ENTRY(NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT), MAKE_ENTRY(NV_CTRL_GVI_DETECTED_CHANNEL_COMPONENT_SAMPLING), MAKE_ENTRY(NV_CTRL_GVI_REQUESTED_STREAM_COMPONENT_SAMPLING), MAKE_ENTRY(NV_CTRL_GVI_REQUESTED_STREAM_CHROMA_EXPAND), MAKE_ENTRY(NV_CTRL_GVI_DETECTED_CHANNEL_COLOR_SPACE), MAKE_ENTRY(NV_CTRL_GVI_DETECTED_CHANNEL_LINK_ID), MAKE_ENTRY(NV_CTRL_GVI_DETECTED_CHANNEL_SMPTE352_IDENTIFIER), MAKE_ENTRY(NV_CTRL_GVI_GLOBAL_IDENTIFIER), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SYNC_DELAY_RESOLUTION), MAKE_ENTRY(NV_CTRL_GPU_COOLER_MANUAL_CONTROL), MAKE_ENTRY(NV_CTRL_THERMAL_COOLER_LEVEL), MAKE_ENTRY(NV_CTRL_THERMAL_COOLER_LEVEL_SET_DEFAULT), MAKE_ENTRY(NV_CTRL_THERMAL_COOLER_CONTROL_TYPE), MAKE_ENTRY(NV_CTRL_THERMAL_COOLER_TARGET), MAKE_ENTRY(NV_CTRL_GPU_ECC_SUPPORTED), MAKE_ENTRY(NV_CTRL_GPU_ECC_STATUS), MAKE_ENTRY(NV_CTRL_GPU_ECC_CONFIGURATION_SUPPORTED), MAKE_ENTRY(NV_CTRL_GPU_ECC_CONFIGURATION), MAKE_ENTRY(NV_CTRL_GPU_ECC_DEFAULT_CONFIGURATION), MAKE_ENTRY(NV_CTRL_GPU_ECC_SINGLE_BIT_ERRORS), MAKE_ENTRY(NV_CTRL_GPU_ECC_DOUBLE_BIT_ERRORS), MAKE_ENTRY(NV_CTRL_GPU_ECC_AGGREGATE_SINGLE_BIT_ERRORS), MAKE_ENTRY(NV_CTRL_GPU_ECC_AGGREGATE_DOUBLE_BIT_ERRORS), MAKE_ENTRY(NV_CTRL_GPU_ECC_RESET_ERROR_STATUS), MAKE_ENTRY(NV_CTRL_GPU_POWER_MIZER_MODE), MAKE_ENTRY(NV_CTRL_GVI_SYNC_OUTPUT_FORMAT), MAKE_ENTRY(NV_CTRL_GVI_MAX_CHANNELS_PER_JACK), MAKE_ENTRY(NV_CTRL_GVI_MAX_STREAMS ), MAKE_ENTRY(NV_CTRL_GVI_NUM_CAPTURE_SURFACES), MAKE_ENTRY(NV_CTRL_OVERSCAN_COMPENSATION), MAKE_ENTRY(NV_CTRL_GPU_PCIE_GENERATION), MAKE_ENTRY(NV_CTRL_GVI_BOUND_GPU), MAKE_ENTRY(NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT3), MAKE_ENTRY(NV_CTRL_ACCELERATE_TRAPEZOIDS), MAKE_ENTRY(NV_CTRL_GPU_CORES), MAKE_ENTRY(NV_CTRL_GPU_MEMORY_BUS_WIDTH), MAKE_ENTRY(NV_CTRL_GVI_TEST_MODE), MAKE_ENTRY(NV_CTRL_COLOR_SPACE), MAKE_ENTRY(NV_CTRL_COLOR_RANGE), MAKE_ENTRY(NV_CTRL_GPU_SCALING_DEFAULT_TARGET), MAKE_ENTRY(NV_CTRL_GPU_SCALING_DEFAULT_METHOD), MAKE_ENTRY(NV_CTRL_DITHERING_MODE), MAKE_ENTRY(NV_CTRL_CURRENT_DITHERING), MAKE_ENTRY(NV_CTRL_CURRENT_DITHERING_MODE), MAKE_ENTRY(NV_CTRL_THERMAL_SENSOR_READING), MAKE_ENTRY(NV_CTRL_THERMAL_SENSOR_PROVIDER), MAKE_ENTRY(NV_CTRL_THERMAL_SENSOR_TARGET), MAKE_ENTRY(NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR), MAKE_ENTRY(NV_CTRL_GPU_CURRENT_PROCESSOR_CLOCK_FREQS), MAKE_ENTRY(NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS), MAKE_ENTRY(NV_CTRL_GPU_PCIE_MAX_LINK_SPEED), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_RESET_TRANSCEIVER_TO_FACTORY_SETTINGS), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE), MAKE_ENTRY(NV_CTRL_SYNCHRONOUS_PALETTE_UPDATES), MAKE_ENTRY(NV_CTRL_DITHERING_DEPTH), MAKE_ENTRY(NV_CTRL_CURRENT_DITHERING_DEPTH), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_FREQUENCY), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_COUNT), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_PAIR_GLASSES), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_UNPAIR_GLASSES), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_DISCOVER_GLASSES), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_IDENTIFY_GLASSES), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_GLASSES_SYNC_CYCLE), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_GLASSES_MISSED_SYNC_CYCLES), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL), MAKE_ENTRY(NV_CTRL_GVO_ANC_PARITY_COMPUTATION), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_GLASSES_PAIR_EVENT), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_GLASSES_UNPAIR_EVENT), MAKE_ENTRY(NV_CTRL_GPU_PCIE_CURRENT_LINK_WIDTH), MAKE_ENTRY(NV_CTRL_GPU_PCIE_CURRENT_LINK_SPEED), MAKE_ENTRY(NV_CTRL_GVO_AUDIO_BLANKING), MAKE_ENTRY(NV_CTRL_CURRENT_METAMODE_ID), MAKE_ENTRY(NV_CTRL_DISPLAY_ENABLED), MAKE_ENTRY(NV_CTRL_FRAMELOCK_INCOMING_HOUSE_SYNC_RATE), MAKE_ENTRY(NV_CTRL_FXAA), MAKE_ENTRY(NV_CTRL_DISPLAY_RANDR_OUTPUT_ID), MAKE_ENTRY(NV_CTRL_FRAMELOCK_DISPLAY_CONFIG), MAKE_ENTRY(NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY), MAKE_ENTRY(NV_CTRL_USED_DEDICATED_GPU_MEMORY), MAKE_ENTRY(NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE), MAKE_ENTRY(NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT), MAKE_ENTRY(NV_CTRL_DPY_HDMI_3D), MAKE_ENTRY(NV_CTRL_BASE_MOSAIC), MAKE_ENTRY(NV_CTRL_MULTIGPU_MASTER_POSSIBLE), MAKE_ENTRY(NV_CTRL_GPU_POWER_MIZER_DEFAULT_MODE), MAKE_ENTRY(NV_CTRL_XV_SYNC_TO_DISPLAY_ID), { -1, NULL, NULL } }; nvidia-settings/samples/nv-control-dpy.c0000664000175000017500000013011012236467170020541 0ustar albertoalberto/* * Copyright (c) 2006-2008 NVIDIA, Corporation * * 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 (including the next * paragraph) 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. */ /* * nv-control-dpy.c - This sample NV-CONTROL client demonstrates how * to configure display devices using NV-CONTROL. This client * demonstrates many different pieces of display configuration * functionality, controlled through commandline options. */ #include #include #include #include #include #include "NVCtrl.h" #include "NVCtrlLib.h" #include "nv-control-screen.h" static char *display_device_name(int mask); static unsigned int display_device_mask(char *str); static char *remove_whitespace(char *str); static void parse_mode_string(char *modeString, char **modeName, unsigned int *mask); static char *find_modeline(char *modeString, char *pModeLines, int ModeLineLen); static void print_display_name(Display *dpy, int target_id, int attr, char *name) { Bool ret; char *str; ret = XNVCTRLQueryTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_DISPLAY, target_id, 0, attr, &str); if (!ret) { printf(" %18s : N/A\n", name); return; } printf(" %18s : %s\n", name, str); XFree(str); } int main(int argc, char *argv[]) { Display *dpy; Bool ret; int screen, display_devices, mask, major, minor, len, j; char *str, *start, *str0, *str1; char *displayDeviceNames[8]; int nDisplayDevice; /* * Open a display connection, and make sure the NV-CONTROL X * extension is present on the screen we want to use. */ dpy = XOpenDisplay(NULL); if (!dpy) { fprintf(stderr, "Cannot open display '%s'.\n\n", XDisplayName(NULL)); return 1; } screen = GetNvXScreen(dpy); ret = XNVCTRLQueryVersion(dpy, &major, &minor); if (ret != True) { fprintf(stderr, "The NV-CONTROL X extension does not exist " "on '%s'.\n\n", XDisplayName(NULL)); return 1; } printf("\nUsing NV-CONTROL extension %d.%d on %s\n", major, minor, XDisplayName(NULL)); /* * query the connected display devices on this X screen and print * basic information about each X screen */ ret = XNVCTRLQueryAttribute(dpy, screen, 0, NV_CTRL_CONNECTED_DISPLAYS, &display_devices); if (!ret) { fprintf(stderr, "Failed to query the enabled Display Devices.\n\n"); return 1; } printf("Connected Display Devices:\n"); nDisplayDevice = 0; for (mask = 1; mask < (1 << 24); mask <<= 1) { if (display_devices & mask) { XNVCTRLQueryStringAttribute(dpy, screen, mask, NV_CTRL_STRING_DISPLAY_DEVICE_NAME, &str); displayDeviceNames[nDisplayDevice++] = str; printf(" %s (0x%08x): %s\n", display_device_name(mask), mask, str); } } printf("\n"); /* * perform the requested action, based on the specified * commandline option */ if (argc <= 1) goto printHelp; /* * for each connected display device on this X screen, query the * list of modelines in the mode pool using * NV_CTRL_BINARY_DATA_MODELINES, then print the results */ if (strcmp(argv[1], "--print-modelines") == 0) { nDisplayDevice = 0; for (mask = 1; mask < (1 << 24); mask <<= 1) { if (!(display_devices & mask)) continue; ret = XNVCTRLQueryBinaryData(dpy, screen, mask, NV_CTRL_BINARY_DATA_MODELINES, (void *) &str, &len); if (!ret) { fprintf(stderr, "Failed to query ModeLines.\n\n"); return 1; } /* * the returned data is in the form: * * "ModeLine 1\0ModeLine 2\0ModeLine 3\0Last ModeLine\0\0" * * so walk from one "\0" to the next to print each ModeLine. */ printf("Modelines for %s:\n", displayDeviceNames[nDisplayDevice++]); start = str; for (j = 0; j < len; j++) { if (str[j] == '\0') { printf(" %s\n", start); start = &str[j+1]; } } XFree(str); } } /* * for each connected display device on this X screen, query the * current modeline using NV_CTRL_STRING_CURRENT_MODELINE */ else if (strcmp(argv[1], "--print-current-modeline") == 0) { nDisplayDevice = 0; for (mask = 1; mask < (1 << 24); mask <<= 1) { if (!(display_devices & mask)) continue; ret = XNVCTRLQueryStringAttribute(dpy, screen, mask, NV_CTRL_STRING_CURRENT_MODELINE, &str); if (!ret) { fprintf(stderr, "Failed to query current ModeLine.\n\n"); return 1; } printf("Current Modeline for %s:\n", displayDeviceNames[nDisplayDevice++]); printf(" %s\n\n", str); XFree(str); } } /* * add the specified modeline to the mode pool for the specified * display device, using NV_CTRL_STRING_ADD_MODELINE */ else if ((strcmp(argv[1], "--add-modeline") == 0) && argv[2] && argv[3]) { mask = strtol(argv[2], NULL, 0); ret = XNVCTRLSetStringAttribute(dpy, screen, mask, NV_CTRL_STRING_ADD_MODELINE, argv[3]); if (!ret) { fprintf(stderr, "Failed to add the modeline \"%s\" to %s's " "mode pool.\n\n", argv[3], display_device_name(mask)); return 1; } printf("Added modeline \"%s\" to %s's mode pool.\n\n", argv[3], display_device_name(mask)); } /* * delete the specified modeline from the mode pool for the * specified display device, using NV_CTRL_STRING_DELETE_MODELINE */ else if ((strcmp(argv[1], "--delete-modeline") == 0) && argv[2] && argv[3]) { mask = strtol(argv[2], NULL, 0); ret = XNVCTRLSetStringAttribute(dpy, screen, mask, NV_CTRL_STRING_DELETE_MODELINE, argv[3]); if (!ret) { fprintf(stderr, "Failed to delete the mode \"%s\" from %s's " "mode pool.\n\n", argv[3], display_device_name(mask)); return 1; } printf("Deleted modeline \"%s\" from %s's mode pool.\n\n", argv[3], display_device_name(mask)); } /* * generate a GTF modeline using NV_CTRL_STRING_OPERATION_GTF_MODELINE */ else if ((strcmp(argv[1], "--generate-gtf-modeline") == 0) && argv[2] && argv[3] && argv[4]) { char pGtfString[128]; char *pOut; snprintf(pGtfString, 128, "width=%s, height=%s, refreshrate=%s", argv[2], argv[3], argv[4]); ret = XNVCTRLStringOperation(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, 0, NV_CTRL_STRING_OPERATION_GTF_MODELINE, pGtfString, &pOut); if (!ret) { fprintf(stderr, "Failed to generate GTF ModeLine from " "\"%s\".\n\n", pGtfString); return 1; } printf("GTF ModeLine from \"%s\": %s\n\n", pGtfString, pOut); } /* * generate a CVT modeline using NV_CTRL_STRING_OPERATION_CVT_MODELINE */ else if ((strcmp(argv[1], "--generate-cvt-modeline") == 0) && argv[2] && argv[3] && argv[4] && argv[5]) { char pCvtString[128]; char *pOut; snprintf(pCvtString, 128, "width=%s, height=%s, refreshrate=%s, " "reduced-blanking=%s", argv[2], argv[3], argv[4], argv[5]); ret = XNVCTRLStringOperation(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, 0, NV_CTRL_STRING_OPERATION_CVT_MODELINE, pCvtString, &pOut); if (!ret) { fprintf(stderr, "Failed to generate CVT ModeLine from " "\"%s\".\n\n", pCvtString); return 1; } printf("CVT ModeLine from \"%s\": %s\n\n", pCvtString, pOut); } /* * query the MetaModes for the X screen, using * NV_CTRL_BINARY_DATA_METAMODES. */ else if (strcmp(argv[1], "--print-metamodes") == 0) { /* get list of metamodes */ ret = XNVCTRLQueryBinaryData(dpy, screen, 0, // n/a NV_CTRL_BINARY_DATA_METAMODES, (void *) &str, &len); if (!ret) { fprintf(stderr, "Failed to query MetaModes.\n\n"); return 1; } /* * the returned data is in the form: * * "MetaMode 1\0MetaMode 2\0MetaMode 3\0Last MetaMode\0\0" * * so walk from one "\0" to the next to print each MetaMode. */ printf("MetaModes:\n"); start = str; for (j = 0; j < len; j++) { if (str[j] == '\0') { printf(" %s\n", start); start = &str[j+1]; } } XFree(str); } /* * query the MetaModes for the X screen, using * NV_CTRL_BINARY_DATA_METAMODES_VERSION_2. */ else if (strcmp(argv[1], "--print-metamodes-version2") == 0) { /* get list of metamodes */ ret = XNVCTRLQueryBinaryData(dpy, screen, 0, // n/a NV_CTRL_BINARY_DATA_METAMODES_VERSION_2, (void *) &str, &len); if (!ret) { fprintf(stderr, "Failed to query MetaModes.\n\n"); return 1; } /* * the returned data is in the form: * * "MetaMode 1\0MetaMode 2\0MetaMode 3\0Last MetaMode\0\0" * * so walk from one "\0" to the next to print each MetaMode. */ printf("MetaModes:\n"); start = str; for (j = 0; j < len; j++) { if (str[j] == '\0') { printf(" %s\n", start); start = &str[j+1]; } } XFree(str); } /* * query the currently in use MetaMode. Note that an alternative * way to accomplish this is to use XRandR to query the current * mode's refresh rate, and then match the refresh rate to the id * reported in the returned NV_CTRL_BINARY_DATA_METAMODES data. */ else if (strcmp(argv[1], "--print-current-metamode") == 0) { ret = XNVCTRLQueryStringAttribute(dpy, screen, mask, NV_CTRL_STRING_CURRENT_METAMODE, &str); if (!ret) { fprintf(stderr, "Failed to query the current MetaMode.\n\n"); return 1; } printf("current metamode: \"%s\"\n\n", str); XFree(str); } /* * query the currently in use MetaMode. Note that an alternative * way to accomplish this is to use XRandR to query the current * mode's refresh rate, and then match the refresh rate to the id * reported in the returned NV_CTRL_BINARY_DATA_METAMODES_VERSION_2 data. */ else if (strcmp(argv[1], "--print-current-metamode-version2") == 0) { ret = XNVCTRLQueryStringAttribute(dpy, screen, mask, NV_CTRL_STRING_CURRENT_METAMODE_VERSION_2, &str); if (!ret) { fprintf(stderr, "Failed to query the current MetaMode.\n\n"); return 1; } printf("current metamode: \"%s\"\n\n", str); XFree(str); } /* * add the given MetaMode to X screen's list of MetaModes, using * NV_CTRL_STRING_OPERATION_ADD_METAMODE; example MetaMode string: * * "nvidia-auto-select, nvidia-auto-select" * * The output string will contain "id=#" which indicates the * unique identifier for this MetaMode. You can then use XRandR * to switch to this mode by matching the identifier with the * refresh rate reported via XRandR. * * For example: * * $ ./nv-control-dpy --add-metamode \ * "nvidia-auto-select, nvidia-auto-select" * * Using NV-CONTROL extension 1.12 on :0 * Connected Display Devices: * CRT-0 (0x00000001): EIZO F931 * CRT-1 (0x00000002): ViewSonic P815-4 * * Added MetaMode "nvidia-auto-select, nvidia-auto-select"; * pOut: "id=52" * * $ xrandr -q * SZ: Pixels Physical Refresh * 0 3200 x 1200 ( 821mm x 302mm ) 51 52 * *1 1600 x 600 ( 821mm x 302mm ) *50 * Current rotation - normal * Current reflection - none * Rotations possible - normal * Reflections possible - none * * $ xrandr -s 0 -r 52 */ else if ((strcmp(argv[1], "--add-metamode") == 0) && (argv[2])) { char *pOut; ret = XNVCTRLStringOperation(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, 0, NV_CTRL_STRING_OPERATION_ADD_METAMODE, argv[2], &pOut); if (!ret) { fprintf(stderr, "Failed to add the MetaMode \"%s\".\n\n", argv[2]); return 1; } printf("Added MetaMode \"%s\"; pOut: \"%s\"\n\n", argv[2], pOut); XFree(pOut); } /* * delete the given MetaMode from the X screen's list of * MetaModes, using NV_CTRL_STRING_DELETE_METAMODE */ else if ((strcmp(argv[1], "--delete-metamode") == 0) && (argv[1])) { ret = XNVCTRLSetStringAttribute(dpy, screen, 0, NV_CTRL_STRING_DELETE_METAMODE, argv[2]); if (!ret) { fprintf(stderr, "Failed to delete the MetaMode.\n\n"); return 1; } printf("Deleted MetaMode \"%s\".\n\n", argv[2]); } /* * query the valid frequency ranges for each display device, using * NV_CTRL_STRING_VALID_HORIZ_SYNC_RANGES and * NV_CTRL_STRING_VALID_VERT_REFRESH_RANGES */ else if (strcmp(argv[1], "--get-valid-freq-ranges") == 0) { nDisplayDevice = 0; for (mask = 1; mask < (1 << 24); mask <<= 1) { if (!(display_devices & mask)) continue; ret = XNVCTRLQueryStringAttribute (dpy, screen, mask, NV_CTRL_STRING_VALID_HORIZ_SYNC_RANGES, &str0); if (!ret) { fprintf(stderr, "Failed to query HorizSync for %s.\n\n", display_device_name(mask)); return 1; } ret = XNVCTRLQueryStringAttribute (dpy, screen, mask, NV_CTRL_STRING_VALID_VERT_REFRESH_RANGES, &str1); if (!ret) { fprintf(stderr, "Failed to query VertRefresh for %s.\n\n", display_device_name(mask)); XFree(str0); return 1; } printf("frequency information for %s:\n", displayDeviceNames[nDisplayDevice++]); printf(" HorizSync : \"%s\"\n", str0); printf(" VertRefresh : \"%s\"\n\n", str1); XFree(str0); XFree(str1); } } /* * attempt to build the modepool for each display device; this * will fail for any display device that already has a modepool */ else if (strcmp(argv[1], "--build-modepool") == 0) { for (mask = 1; mask < (1 << 24); mask <<= 1) { if (!(display_devices & mask)) continue; ret = XNVCTRLStringOperation (dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, mask, NV_CTRL_STRING_OPERATION_BUILD_MODEPOOL, argv[2], &str0); if (!ret) { fprintf(stderr, "Failed to build modepool for %s (it most " "likely already has a modepool).\n\n", display_device_name(mask)); } else { printf("Built modepool for %s.\n\n", display_device_name(mask)); } } } /* * query the associated display devices on this X screen; these * are the display devices that are available to the X screen for * use by MetaModes. */ else if (strcmp(argv[1], "--get-associated-dpys") == 0) { ret = XNVCTRLQueryAttribute(dpy, screen, 0, NV_CTRL_ASSOCIATED_DISPLAY_DEVICES, &mask); if (ret) { printf("associated display device mask: 0x%08x\n\n", mask); } else { fprintf(stderr, "failed to query the associated display device " "mask.\n\n"); return 1; } } /* * assign the associated display device mask for this X screen; * these are the display devices that are available to the X * screen for use by MetaModes. */ else if ((strcmp(argv[1], "--set-associated-dpys") == 0) && (argv[2])) { mask = strtol(argv[2], NULL, 0); ret = XNVCTRLSetAttributeAndGetStatus (dpy, screen, 0, NV_CTRL_ASSOCIATED_DISPLAY_DEVICES, mask); if (ret) { printf("set the associated display device mask to 0x%08x\n\n", mask); } else { fprintf(stderr, "failed to set the associated display device " "mask to 0x%08x\n\n", mask); return 1; } } /* * query information about the GPUs in the system */ else if (strcmp(argv[1], "--query-gpus") == 0) { int num_gpus, num_screens, i; unsigned int *pData; printf("GPU Information:\n"); /* Get the number of gpus in the system */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_GPU, &num_gpus); if (!ret) { fprintf(stderr, "Failed to query number of gpus.\n\n"); return 1; } printf(" number of GPUs: %d\n", num_gpus); /* List the X screen number of all X screens driven by each gpu */ for (i = 0; i < num_gpus; i++) { ret = XNVCTRLQueryTargetBinaryData (dpy, NV_CTRL_TARGET_TYPE_GPU, i, // target_id 0, NV_CTRL_BINARY_DATA_XSCREENS_USING_GPU, (unsigned char **) &pData, &len); if (!ret) { fprintf(stderr, "Failed to query list of X Screens\n"); return 1; } printf(" number of X screens using GPU %d: %d\n", i, pData[0]); /* List X Screen number of all X Screens driven by this GPU. */ printf(" Indices of X screens using GPU %d: ", i); for (j = 1; j <= pData[0]; j++) { printf(" %d", pData[j]); } printf("\n"); XFree(pData); } /* Get the number of X Screens in the system * * NOTE: If Xinerama is enabled, ScreenCount(dpy) will return 1, * where as querying the screen count information from * NV-CONTROL will return the number of underlying X Screens. */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, &num_screens); if (!ret) { fprintf(stderr, "Failed to query number of X Screens\n\n"); return 1; } printf("\n"); printf(" number of X screens (ScreenCount): %d\n", ScreenCount(dpy)); printf(" number of X screens (NV-CONTROL): %d\n\n", num_screens); for (i = 0; i < num_screens; i++) { ret = XNVCTRLQueryTargetBinaryData (dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, i, // target_id 0, NV_CTRL_BINARY_DATA_GPUS_USED_BY_XSCREEN, (unsigned char **) &pData, &len); if (!ret) { fprintf(stderr, "Failed to query list of gpus\n\n"); return 1; } printf(" number of GPUs used by X screen %d: %d\n", i, pData[0]); /* List gpu number of all gpus driven by this X screen */ printf(" Indices of GPUs used by X screen %d: ", i); for (j = 1; j <= pData[0]; j++) { printf(" %d", pData[j]); } printf("\n"); XFree(pData); } printf("\n"); } /* * probe for any newly connected display devices */ else if (strcmp(argv[1], "--probe-dpys") == 0) { int num_gpus, i; printf("Display Device Probed Information:\n\n"); /* Get the number of gpus in the system */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_GPU, &num_gpus); if (!ret) { fprintf(stderr, "Failed to query number of gpus\n\n"); return 1; } printf(" number of GPUs: %d\n", num_gpus); /* Probe and list the Display devices */ for (i = 0; i < num_gpus; i++) { /* Get the gpu name */ ret = XNVCTRLQueryTargetStringAttribute (dpy, NV_CTRL_TARGET_TYPE_GPU, i, 0, NV_CTRL_STRING_PRODUCT_NAME, &str); if (!ret) { fprintf(stderr, "Failed to query gpu name\n\n"); return 1; } /* Probe the GPU for new/old display devices */ ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, i, 0, NV_CTRL_PROBE_DISPLAYS, &display_devices); if (!ret) { fprintf(stderr, "Failed to probe the enabled Display " "Devices on GPU-%d (%s).\n\n", i, str); return 1; } printf(" display devices on GPU-%d (%s):\n", i, str); XFree(str); /* Report results */ for (mask = 1; mask < (1 << 24); mask <<= 1) { if (display_devices & mask) { XNVCTRLQueryTargetStringAttribute (dpy, NV_CTRL_TARGET_TYPE_GPU, i, mask, NV_CTRL_STRING_DISPLAY_DEVICE_NAME, &str); printf(" %s (0x%08x): %s\n", display_device_name(mask), mask, str); } } printf("\n"); } printf("\n"); } /* * query the nvidiaXineramaInfoOrder */ else if (strcmp(argv[1], "--query-nvidia-xinerama-info-order") == 0) { ret = XNVCTRLQueryTargetStringAttribute (dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, 0, NV_CTRL_STRING_NVIDIA_XINERAMA_INFO_ORDER, &str); if (!ret) { fprintf(stderr, "Failed to query nvidiaXineramaInfoOrder.\n\n"); return 1; } printf("nvidiaXineramaInfoOrder: %s\n\n", str); } /* * assign the nvidiaXineramaInfoOrder */ else if ((strcmp(argv[1], "--assign-nvidia-xinerama-info-order")== 0) && argv[2]) { ret = XNVCTRLSetStringAttribute (dpy, screen, 0, NV_CTRL_STRING_NVIDIA_XINERAMA_INFO_ORDER, argv[2]); if (!ret) { fprintf(stderr, "Failed to assign " "nvidiaXineramaInfoOrder = \"%s\".\n\n", argv[2]); return 1; } printf("assigned nvidiaXineramaInfoOrder: \"%s\"\n\n", argv[2]); } /* * use NV_CTRL_MAX_SCREEN_WIDTH and NV_CTRL_MAX_SCREEN_HEIGHT to * query the maximum screen dimensions on each GPU in the system */ else if (strcmp(argv[1], "--max-screen-size") == 0) { int num_gpus, i, width, height; /* Get the number of gpus in the system */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_GPU, &num_gpus); if (!ret) { fprintf(stderr, "Failed to query number of gpus.\n\n"); return 1; } for (i = 0; i < num_gpus; i++) { ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, i, 0, NV_CTRL_MAX_SCREEN_WIDTH, &width); if (!ret) { fprintf(stderr, "Failed to query the maximum screen " "width on GPU-%d\n\n", i); return 1; } ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, i, 0, NV_CTRL_MAX_SCREEN_HEIGHT, &height); if (!ret) { fprintf(stderr, "Failed to query the maximum screen " "height on GPU-%d.\n\n", i); return 1; } printf("GPU-%d: maximum X screen size: %d x %d.\n\n", i, width, height); } } /* * demonstrate how to use NV-CONTROL to query what modelines are * used by the MetaModes of the X screen: we first query all the * MetaModes, parse out the display device names and mode names, * and then lookup the modelines associated with those mode names * on those display devices * * this could be implemented much more efficiently, but * demonstrates the general idea */ else if (strcmp(argv[1], "--print-used-modelines") == 0) { char *pMetaModes, *pModeLines[8], *tmp, *modeString; char *modeLine, *modeName, *noWhiteSpace; int MetaModeLen, ModeLineLen[8]; unsigned int thisMask; /* first, we query the MetaModes on this X screen */ XNVCTRLQueryBinaryData(dpy, screen, 0, // n/a NV_CTRL_BINARY_DATA_METAMODES, (void *) &pMetaModes, &MetaModeLen); /* * then, we query the ModeLines for each display device on * this X screen; we'll need these later */ nDisplayDevice = 0; for (mask = 1; mask < (1 << 24); mask <<= 1) { if (!(display_devices & mask)) continue; XNVCTRLQueryBinaryData(dpy, screen, mask, NV_CTRL_BINARY_DATA_MODELINES, (void *) &str, &len); pModeLines[nDisplayDevice] = str; ModeLineLen[nDisplayDevice] = len; nDisplayDevice++; } /* now, parse each MetaMode */ str = start = pMetaModes; for (j = 0; j < MetaModeLen - 1; j++) { /* * if we found the end of a line, treat the string from * start to str[j] as a MetaMode */ if ((str[j] == '\0') && (str[j+1] != '\0')) { printf("MetaMode: %s\n", start); /* * remove any white space from the string to make * parsing easier */ noWhiteSpace = remove_whitespace(start); /* * the MetaMode may be preceded with "token=value" * pairs, separated by the main MetaMode with "::"; if * "::" exists in the string, skip past it */ tmp = strstr(noWhiteSpace, "::"); if (tmp) { tmp += 2; } else { tmp = noWhiteSpace; } /* split the MetaMode string by comma */ for (modeString = strtok(tmp, ","); modeString; modeString = strtok(NULL, ",")) { /* * retrieve the modeName and display device mask * for this segment of the Metamode */ parse_mode_string(modeString, &modeName, &thisMask); /* lookup the modeline that matches */ nDisplayDevice = 0; if (thisMask) { for (mask = 1; mask < (1 << 24); mask <<= 1) { if (!(display_devices & mask)) continue; if (thisMask & mask) break; nDisplayDevice++; } } modeLine = find_modeline(modeName, pModeLines[nDisplayDevice], ModeLineLen[nDisplayDevice]); printf(" %s: %s\n", display_device_name(thisMask), modeLine); } printf("\n"); free(noWhiteSpace); /* move to the next MetaMode */ start = &str[j+1]; } } } /* Display all names each display device goes by */ else if (strcmp(argv[1], "--print-display-names") == 0) { unsigned int *pData; int len, i; printf("Display Device Information:\n"); ret = XNVCTRLQueryTargetBinaryData(dpy, NV_CTRL_TARGET_TYPE_GPU, 0, 0, NV_CTRL_BINARY_DATA_DISPLAY_TARGETS, (unsigned char **) &pData, &len); if (!ret) { fprintf(stderr, "Failed to query number of display devices.\n\n"); return 1; } printf(" number of display devices: %d\n", pData[0]); for (i = 1; i <= pData[0]; i++) { printf("\n Display Device: %d\n", pData[i]); print_display_name(dpy, pData[i], NV_CTRL_STRING_DISPLAY_NAME_TYPE_BASENAME, "Type Basename"); print_display_name(dpy, pData[i], NV_CTRL_STRING_DISPLAY_NAME_TYPE_ID, "Type ID"); print_display_name(dpy, pData[i], NV_CTRL_STRING_DISPLAY_NAME_DP_GUID, "DP GUID"); print_display_name(dpy, pData[i], NV_CTRL_STRING_DISPLAY_NAME_EDID_HASH, "EDID HASH"); print_display_name(dpy, pData[i], NV_CTRL_STRING_DISPLAY_NAME_TARGET_INDEX, "Target Index"); print_display_name(dpy, pData[i], NV_CTRL_STRING_DISPLAY_NAME_RANDR, "RANDR"); } } /* * print help information */ else { printHelp: printf("\nnv-control-dpy [options]:\n\n"); printf(" ModeLine options:\n\n"); printf(" --print-modelines: print the modelines in the mode pool " "for each Display Device.\n\n"); printf(" --print-current-modeline: print the current modeline " "for each Display Device.\n\n"); printf(" --add-modeline [dpy mask] [modeline]: " "add new modeline.\n\n"); printf(" --delete-modeline [dpy mask] [modename]: " "delete modeline with modename.\n\n"); printf(" --generate-gtf-modeline [width] [height] [refreshrate]:" " use the GTF formula" " to generate a modeline for the specified parameters.\n\n"); printf(" --generate-cvt-modeline [width] [height] [refreshrate]" " [reduced-blanking]: use the CVT formula" " to generate a modeline for the specified parameters.\n\n"); printf(" MetaMode options:\n\n"); printf(" --print-metamodes: print the current MetaModes for the " "X screen\n\n"); printf(" --print-metamodes-version2: print the current MetaModes for " "the X screen with extended information\n\n"); printf(" --add-metamode [metamode]: add the specified " "MetaMode to the X screen's list of MetaModes.\n\n"); printf(" --delete-metamode [metamode]: delete the specified MetaMode " "from the X screen's list of MetaModes.\n\n"); printf(" --print-current-metamode: print the current MetaMode.\n\n"); printf(" --print-current-metamode-version2: print the current " "MetaMode with extended information.\n\n"); printf(" Misc options:\n\n"); printf(" --get-valid-freq-ranges: query the valid frequency " "information for each display device.\n\n"); printf(" --build-modepool: build a modepool for any display device " "that does not already have one.\n\n"); printf(" --get-associated-dpys: query the associated display device " "mask for this X screen\n\n"); printf(" --set-associated-dpys [mask]: set the associated display " "device mask for this X screen\n\n"); printf(" --query-gpus: print GPU information and relationship to " "X screens.\n\n"); printf(" --probe-dpys: probe GPUs for new display devices\n\n"); printf(" --query-nvidia-xinerama-info-order: query the " "nvidiaXineramaInfoOrder.\n\n"); printf(" --assign-nvidia-xinerama-info-order [order]: assign the " "nvidiaXineramaInfoOrder.\n\n"); printf(" --max-screen-size: query the maximum screen size " "on all GPUs in the system\n\n"); printf(" --print-used-modelines: print the modeline for each display " "device for each MetaMode on the X screen.\n\n"); printf(" --print-display-names: print all the names associated with " "each display device on the server\n\n"); } return 0; } /*****************************************************************************/ /* utility functions */ /*****************************************************************************/ /* * display_device_name() - return the display device name corresponding * to the specified display device mask. */ static char *display_device_name(int mask) { switch (mask) { case (1 << 0): return "CRT-0"; break; case (1 << 1): return "CRT-1"; break; case (1 << 2): return "CRT-2"; break; case (1 << 3): return "CRT-3"; break; case (1 << 4): return "CRT-4"; break; case (1 << 5): return "CRT-5"; break; case (1 << 6): return "CRT-6"; break; case (1 << 7): return "CRT-7"; break; case (1 << 8): return "TV-0"; break; case (1 << 9): return "TV-1"; break; case (1 << 10): return "TV-2"; break; case (1 << 11): return "TV-3"; break; case (1 << 12): return "TV-4"; break; case (1 << 13): return "TV-5"; break; case (1 << 14): return "TV-6"; break; case (1 << 15): return "TV-7"; break; case (1 << 16): return "DFP-0"; break; case (1 << 17): return "DFP-1"; break; case (1 << 18): return "DFP-2"; break; case (1 << 19): return "DFP-3"; break; case (1 << 20): return "DFP-4"; break; case (1 << 21): return "DFP-5"; break; case (1 << 22): return "DFP-6"; break; case (1 << 23): return "DFP-7"; break; default: return "Unknown"; } } /* display_device_name() */ /* * display_device_mask() - given a display device name, translate to * the display device mask */ static unsigned int display_device_mask(char *str) { if (strcmp(str, "CRT-0") == 0) return (1 << 0); if (strcmp(str, "CRT-1") == 0) return (1 << 1); if (strcmp(str, "CRT-2") == 0) return (1 << 2); if (strcmp(str, "CRT-3") == 0) return (1 << 3); if (strcmp(str, "CRT-4") == 0) return (1 << 4); if (strcmp(str, "CRT-5") == 0) return (1 << 5); if (strcmp(str, "CRT-6") == 0) return (1 << 6); if (strcmp(str, "CRT-7") == 0) return (1 << 7); if (strcmp(str, "TV-0") == 0) return (1 << 8); if (strcmp(str, "TV-1") == 0) return (1 << 9); if (strcmp(str, "TV-2") == 0) return (1 << 10); if (strcmp(str, "TV-3") == 0) return (1 << 11); if (strcmp(str, "TV-4") == 0) return (1 << 12); if (strcmp(str, "TV-5") == 0) return (1 << 13); if (strcmp(str, "TV-6") == 0) return (1 << 14); if (strcmp(str, "TV-7") == 0) return (1 << 15); if (strcmp(str, "DFP-0") == 0) return (1 << 16); if (strcmp(str, "DFP-1") == 0) return (1 << 17); if (strcmp(str, "DFP-2") == 0) return (1 << 18); if (strcmp(str, "DFP-3") == 0) return (1 << 19); if (strcmp(str, "DFP-4") == 0) return (1 << 20); if (strcmp(str, "DFP-5") == 0) return (1 << 21); if (strcmp(str, "DFP-6") == 0) return (1 << 22); if (strcmp(str, "DFP-7") == 0) return (1 << 23); return 0; } /* display_device_mask() */ /* * remove_whitespace() - return an allocated copy of the given string, * with any whitespace removed */ static char *remove_whitespace(char *str) { int len; char *ret, *s, *d; len = strlen(str); ret = malloc(len+1); for (s = str, d = ret; *s; s++) { if (!isspace(*s)) { *d = *s; d++; } } *d = '\0'; return ret; } /* remove_whitespace() */ /* * parse_mode_string() - extract the modeName and the display device * mask for the per-display device MetaMode string in 'modeString' */ static void parse_mode_string(char *modeString, char **modeName, unsigned int *mask) { char *colon, *s, tmp; colon = strchr(modeString, ':'); if (colon) { *colon = '\0'; *mask = display_device_mask(modeString); *colon = ':'; modeString = colon + 1; } else { *mask = 0; } /* * find the modename; trim off any panning domain or * offsets */ for (s = modeString; *s; s++) { if (*s == '@') break; if ((*s == '+') && isdigit(s[1])) break; if ((*s == '-') && isdigit(s[1])) break; } tmp = *s; *s = '\0'; *modeName = strdup(modeString); *s = tmp; } /* parse_mode_string() */ /* * find_modeline() - search the pModeLines list of ModeLines for the * mode named 'modeName'; return a pointer to the matching ModeLine, * or NULL if no match is found */ static char *find_modeline(char *modeName, char *pModeLines, int ModeLineLen) { char *start, *beginQuote, *endQuote; int j, match = 0; start = pModeLines; for (j = 0; j < ModeLineLen; j++) { if (pModeLines[j] == '\0') { /* * the modeline will contain the modeName in quotes; find * the begin and end of the quoted modeName, so that we * can compare it to modeName */ beginQuote = strchr(start, '"'); endQuote = beginQuote ? strchr(beginQuote+1, '"') : NULL; if (beginQuote && endQuote) { *endQuote = '\0'; match = (strcmp(modeName, beginQuote+1) == 0); *endQuote = '"'; /* * if we found a match, return a pointer to the start * of this modeLine */ if (match) return start; } start = &pModeLines[j+1]; } } return NULL; } /* find_modeline() */ nvidia-settings/samples/nv-control-3dvisionpro.c0000664000175000017500000000646712236467170022245 0ustar albertoalberto/* * Copyright (c) 2011 NVIDIA, Corporation * * 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 (including the next * paragraph) 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. */ /* * nv-control-3dvisionpro.c - Sample application that displays * the details of the glasses currently attached to the transceiver */ #include #include #include #include #include "NVCtrlLib.h" int main(int argc, char* argv[]) { Display *dpy; Bool ret; int i, target_id = 0, glass_id, num_of_glasses = 0; unsigned int *ptr; char *glass_name; int len; if(argc > 2) { printf("Too many Arguments\n"); return(0); } if(argc != 1) { target_id = atoi(argv[1]); } /* * open a connection to the X server indicated by the DISPLAY * environment variable */ dpy = XOpenDisplay(NULL); if (!dpy) { fprintf(stderr, "Cannot open display '%s'.\n", XDisplayName(NULL)); return 1; } /* * query the ids of the glasses connected to the Transceiver */ ret = XNVCTRLQueryTargetBinaryData(dpy, NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER, target_id, 0, NV_CTRL_BINARY_DATA_GLASSES_PAIRED_TO_3D_VISION_PRO_TRANSCEIVER, (unsigned char**) &ptr, &len); if (ret) { num_of_glasses = ptr[0]; printf("Total no. of glasses paired = %d\n", num_of_glasses); if (num_of_glasses > 0) { printf("\n"); printf("%-20s", "GlassId"); printf("%-s\n", "GlassName" ); } for (i = 0; i < num_of_glasses; i++) { glass_id = ptr[i+1]; ret = XNVCTRLQueryTargetStringAttribute (dpy, NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER, target_id, glass_id, NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME, &glass_name); if (ret) { printf("%-20d", glass_id); printf("%-s\n", glass_name); } else { printf("Error retrieving GlassName for Glassid %d\n", glass_id); } XFree(glass_name); } XFree(ptr); } /* * close the display connection */ XCloseDisplay(dpy); return 0; } nvidia-settings/samples/nv-control-dvc.c0000664000175000017500000001522412236467170020531 0ustar albertoalberto/* * Copyright (c) 2004 NVIDIA, Corporation * * 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 (including the next * paragraph) 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. */ /* * nv-control-dvc.c - trivial sample NV-CONTROL client that * demonstrates how to query and set integer attributes. * * The attribute NV_CTRL_DIGITAL_VIBRANCE ("Digital Vibrance Control") * is used as an example. This attribute is interesting because it * can be controlled on a per-display device basis. * * Please see the section "DISPLAY DEVICES" in NV-CONTROL-API.txt for * an explanation of display devices. */ #define __STDC_FORMAT_MACROS #include #include #include #include #include "NVCtrl.h" #include "NVCtrlLib.h" #include "nv-control-screen.h" /* * display_device_name() - return the display device name correspoding * to the display device mask. */ static char *display_device_name(int mask) { switch (mask) { case (1 << 0): return "CRT-0"; break; case (1 << 1): return "CRT-1"; break; case (1 << 2): return "CRT-2"; break; case (1 << 3): return "CRT-3"; break; case (1 << 4): return "CRT-4"; break; case (1 << 5): return "CRT-5"; break; case (1 << 6): return "CRT-6"; break; case (1 << 7): return "CRT-7"; break; case (1 << 8): return "TV-0"; break; case (1 << 9): return "TV-1"; break; case (1 << 10): return "TV-2"; break; case (1 << 11): return "TV-3"; break; case (1 << 12): return "TV-4"; break; case (1 << 13): return "TV-5"; break; case (1 << 14): return "TV-6"; break; case (1 << 15): return "TV-7"; break; case (1 << 16): return "DFP-0"; break; case (1 << 17): return "DFP-1"; break; case (1 << 18): return "DFP-2"; break; case (1 << 19): return "DFP-3"; break; case (1 << 20): return "DFP-4"; break; case (1 << 21): return "DFP-5"; break; case (1 << 22): return "DFP-6"; break; case (1 << 23): return "DFP-7"; break; default: return "Unknown"; } } /* display_device_name() */ int main(int argc, char *argv[]) { Display *dpy; Bool ret; int screen, retval, setval = -1; int display_devices, mask; NVCTRLAttributeValidValuesRec valid_values; /* * If there is a commandline argument, interpret it as the value * to use to set DVC. */ if (argc == 2) { setval = atoi(argv[1]); } /* * Open a display connection, and make sure the NV-CONTROL X * extension is present on the screen we want to use. */ dpy = XOpenDisplay(NULL); if (!dpy) { fprintf(stderr, "Cannot open display '%s'.\n", XDisplayName(NULL)); return 1; } screen = GetNvXScreen(dpy); /* * Get the bitmask of enabled display devices */ ret = XNVCTRLQueryAttribute(dpy, screen, 0, NV_CTRL_ENABLED_DISPLAYS, &display_devices); if (!ret) { fprintf(stderr, "Unable to determine enabled display devices for " "screen %d of '%s'\n", screen, XDisplayName(NULL)); return 1; } /* * loop over each enabled display device */ for (mask = 1; mask < (1<<24); mask <<= 1) { if (!(mask & display_devices)) continue; /* * Query the valid values for NV_CTRL_DIGITAL_VIBRANCE */ ret = XNVCTRLQueryValidAttributeValues(dpy, screen, mask, NV_CTRL_DIGITAL_VIBRANCE, &valid_values); if (!ret) { fprintf(stderr, "Unable to query the valid values for " "NV_CTRL_DIGITAL_VIBRANCE on display device %s of " "screen %d of '%s'.\n", display_device_name(mask), screen, XDisplayName(NULL)); return 1; } /* we assume that NV_CTRL_DIGITAL_VIBRANCE is a range type */ if (valid_values.type != ATTRIBUTE_TYPE_RANGE) { fprintf(stderr, "NV_CTRL_DIGITAL_VIBRANCE is not of " "type RANGE.\n"); return 1; } /* print the range of valid values */ printf("Valid values for NV_CTRL_DIGITAL_VIBRANCE: " "(%" PRId64 " - %" PRId64 ").\n", valid_values.u.range.min, valid_values.u.range.max); /* * if a value was specified on the commandline, set it; * otherwise, query the current value */ if (setval != -1) { XNVCTRLSetAttribute(dpy, screen, mask, NV_CTRL_DIGITAL_VIBRANCE, setval); XFlush(dpy); printf("Set NV_CTRL_DIGITAL_VIBRANCE to %d on display device " "%s of screen %d of '%s'.\n", setval, display_device_name(mask), screen, XDisplayName(NULL)); } else { ret = XNVCTRLQueryAttribute(dpy, screen, mask, NV_CTRL_DIGITAL_VIBRANCE, &retval); printf("The current value of NV_CTRL_DIGITAL_VIBRANCE " "is %d on display device %s of screen %d of '%s'.\n", retval, display_device_name(mask), screen, XDisplayName(NULL)); } } return 0; } nvidia-settings/samples/nv-control-gvi.c0000664000175000017500000010631212236467170020541 0ustar albertoalberto/* * Copyright (c) 2006-2007 NVIDIA, Corporation * * 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 (including the next * paragraph) 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. */ /* * nv-control-gvi.c - NV-CONTROL client that demonstrates how to * interact with the GVI capabilities on an X Server. */ #include #include #include #include #include "NVCtrl.h" #include "NVCtrlLib.h" /* Used to stringify NV_CTRL_XXX #defines */ #define ADD_NVCTRL_CASE(FMT) \ case (FMT): \ return #FMT; /* * Decode provided signal format. */ static char *VideoFormatName(int value) { switch(value) { ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_NONE); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_487I_59_94_SMPTE259_NTSC); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_576I_50_00_SMPTE259_PAL); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_720P_59_94_SMPTE296); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_720P_60_00_SMPTE296); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1035I_59_94_SMPTE260); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1035I_60_00_SMPTE260); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080I_50_00_SMPTE295); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080I_50_00_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080I_59_94_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080I_60_00_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080P_23_976_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080P_24_00_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080P_25_00_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080P_29_97_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080P_30_00_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_720P_50_00_SMPTE296); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080I_48_00_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080I_47_96_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_720P_30_00_SMPTE296); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_720P_29_97_SMPTE296); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_720P_25_00_SMPTE296); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_720P_24_00_SMPTE296); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_720P_23_98_SMPTE296); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_25_00_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_29_97_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_30_00_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_24_00_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_23_98_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048P_30_00_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048P_29_97_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048I_60_00_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048I_59_94_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048P_25_00_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048I_50_00_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048P_24_00_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048P_23_98_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048I_48_00_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048I_47_96_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080P_50_00_3G_LEVEL_A_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080P_59_94_3G_LEVEL_A_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080P_60_00_3G_LEVEL_A_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080P_60_00_3G_LEVEL_B_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080I_60_00_3G_LEVEL_B_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048I_60_00_3G_LEVEL_B_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080P_50_00_3G_LEVEL_B_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080I_50_00_3G_LEVEL_B_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048I_50_00_3G_LEVEL_B_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080P_30_00_3G_LEVEL_B_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048P_30_00_3G_LEVEL_B_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080P_25_00_3G_LEVEL_B_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048P_25_00_3G_LEVEL_B_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080P_24_00_3G_LEVEL_B_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048P_24_00_3G_LEVEL_B_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080I_48_00_3G_LEVEL_B_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048I_48_00_3G_LEVEL_B_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080P_59_94_3G_LEVEL_B_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080I_59_94_3G_LEVEL_B_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048I_59_94_3G_LEVEL_B_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080P_29_97_3G_LEVEL_B_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048P_29_97_3G_LEVEL_B_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080P_23_98_3G_LEVEL_B_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048P_23_98_3G_LEVEL_B_SMPTE372); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_1080I_47_96_3G_LEVEL_B_SMPTE274); ADD_NVCTRL_CASE(NV_CTRL_GVIO_VIDEO_FORMAT_2048I_47_96_3G_LEVEL_B_SMPTE372); default: return "Invalid Value"; } } static const char *SamplingName(int value) { switch (value) { default: ADD_NVCTRL_CASE(NV_CTRL_GVI_COMPONENT_SAMPLING_UNKNOWN); ADD_NVCTRL_CASE(NV_CTRL_GVI_COMPONENT_SAMPLING_4444); ADD_NVCTRL_CASE(NV_CTRL_GVI_COMPONENT_SAMPLING_4224); ADD_NVCTRL_CASE(NV_CTRL_GVI_COMPONENT_SAMPLING_444); ADD_NVCTRL_CASE(NV_CTRL_GVI_COMPONENT_SAMPLING_422); ADD_NVCTRL_CASE(NV_CTRL_GVI_COMPONENT_SAMPLING_420); return "Invalid Value"; } } static const char *BPCName(int value) { switch (value) { ADD_NVCTRL_CASE(NV_CTRL_GVI_BITS_PER_COMPONENT_UNKNOWN); ADD_NVCTRL_CASE(NV_CTRL_GVI_BITS_PER_COMPONENT_8); ADD_NVCTRL_CASE(NV_CTRL_GVI_BITS_PER_COMPONENT_10); ADD_NVCTRL_CASE(NV_CTRL_GVI_BITS_PER_COMPONENT_12); default: return "Invalid Value"; } } /* * do_help() * * Prints some help on how to use this app. * */ static void do_help(void) { printf("usage:\n"); printf("-q: query system GVI information.\n"); printf("-c : configure default GVI system topology.\n"); printf("-g #: Operate on specific GVI device.\n"); printf("-l: List GVI configuration space.\n"); printf("\n"); } /* do_help()*/ /* * do_query() * * Prints information for all GVI devices found on * the given X server. * */ static void do_query(Display *dpy, int use_gvi) { Bool ret; int num_gvi; int gvi; int last_gvi; int value; int num_jacks; int jack; int max_channels_per_jack; int channel; char *pOut; /* Query the number of GVI devices on the server */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_GVI, &num_gvi); if (!ret) { printf("Failed to query number of GVI devices!\n"); return; } printf("Found %d GVI device(s) on server.\n", num_gvi); if ( !num_gvi ) { return; } if (use_gvi >= 0 && use_gvi < num_gvi) { /* Only display information about 1 GVI device/ */ printf("Querying GVI device %d...\n", use_gvi); gvi = use_gvi; last_gvi = use_gvi; } else { /* Display all GVI devices */ printf("Querying all GVI devices...\n"); gvi = 0; last_gvi = num_gvi-1; } /* Display information about the GVI(s) */ for (; gvi <= last_gvi; gvi++) { printf("\n"); printf("- GVI Board %d :\n", gvi); ret = XNVCTRLQueryTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id 0, // display_mask NV_CTRL_STRING_GVIO_FIRMWARE_VERSION, &pOut); if (!ret) { printf(" - Failed to query firmware version of GVI %d.\n", gvi); continue; } printf(" - Firmware Version: %s\n", pOut); XFree(pOut); pOut = NULL; ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id 0, // display_mask NV_CTRL_GVI_GLOBAL_IDENTIFIER, &value); if (!ret) { printf(" - Failed to query global ID of GVI %d.\n", gvi); continue; } printf(" - Global ID: %d\n", value); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id 0, // display_mask NV_CTRL_GVI_NUM_CAPTURE_SURFACES, &value); if (!ret) { printf(" - Failed to number of capture surfaces of GVI %d.\n", gvi); continue; } printf(" - Number of capture surfaces: %d\n", value); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id 0, // display_mask NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT, &value); if (!ret) { printf(" - Failed to query requested video format on " "GVI %d.\n", gvi); continue; } printf(" - Requested video format: %d (%s)\n", value, VideoFormatName(value)); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id 0, // display_mask NV_CTRL_GVI_MAX_STREAMS, &value); if (!ret) { printf(" - Failed to query max number of streams on " "GVI %d.\n", gvi); continue; } printf(" - Max number of configurable streams: %d\n", value); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id 0, // display_mask NV_CTRL_GVI_MAX_LINKS_PER_STREAM, &value); if (!ret) { printf(" - Failed to query max number of links per stream on " "GVI %d.\n", gvi); continue; } printf(" - Max number of links per stream: %d\n", value); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id 0, // display_mask NV_CTRL_GVI_NUM_JACKS, &num_jacks); if (!ret) { printf(" - Failed to query number of input jacks on GVI " "%d.\n", gvi); continue; } printf(" - Number of input jacks on device: %d\n", num_jacks); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id 0, // display_mask NV_CTRL_GVI_MAX_CHANNELS_PER_JACK, &max_channels_per_jack); if (!ret) { printf(" - Failed to query maximum number of channels per " "jack on GVI %d.\n", gvi); continue; } printf(" - Maximum number of channels per jack on device: %d\n", max_channels_per_jack); /* Display per-jack/channel information */ for (jack = 0; jack < num_jacks; jack++) { printf(" - Jack %d\n", jack); for (channel = 0; channel < max_channels_per_jack; channel++) { unsigned int link_definition = ((channel & 0xFFFF)<<16); printf(" - Channel %d\n", channel); link_definition |= (jack & 0xFFFF); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id link_definition, // display_mask NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT, &value); if (!ret) { printf(" - Failed to query detected video format " "on jack %d, channel %d of GVI %d.\n", jack, channel, gvi); continue; } printf(" - Detected Video Format: %d (%s)\n", value, VideoFormatName(value) ); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id link_definition, // display_mask NV_CTRL_GVI_DETECTED_CHANNEL_SMPTE352_IDENTIFIER, &value); if (!ret) { printf(" - Failed to query detected SMPTE352 " "Identifier on jack %d, channel %d of GVI %d.\n", jack, channel, gvi); continue; } printf(" - Detected SMPTE352 Identifier: 0x%08x\n", value); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id link_definition, // display_mask NV_CTRL_GVI_DETECTED_CHANNEL_BITS_PER_COMPONENT, &value); if (!ret) { printf(" - Failed to query detected bits per " "component on jack %d, channel %d of GVI %d.\n", jack, channel, gvi); continue; } printf(" - Detected bits per component: "); switch (value) { case NV_CTRL_GVI_BITS_PER_COMPONENT_8: printf("8"); break; case NV_CTRL_GVI_BITS_PER_COMPONENT_10: printf("10"); break; case NV_CTRL_GVI_BITS_PER_COMPONENT_12: printf("12"); break; case NV_CTRL_GVI_BITS_PER_COMPONENT_UNKNOWN: /* Fall Through */ default: printf("Unknown"); break; } printf("\n"); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id link_definition, // display_mask NV_CTRL_GVI_DETECTED_CHANNEL_COMPONENT_SAMPLING, &value); if (!ret) { printf(" - Failed to query detected component " "sampling on jack %d, channel %d of GVI %d.\n", jack, channel, gvi); continue; } printf(" - Detected component sampling: "); switch (value) { case NV_CTRL_GVI_COMPONENT_SAMPLING_4444: printf("4:4:4:4"); break; case NV_CTRL_GVI_COMPONENT_SAMPLING_4224: printf("4:2:2:4"); break; case NV_CTRL_GVI_COMPONENT_SAMPLING_444: printf("4:4:4"); break; case NV_CTRL_GVI_COMPONENT_SAMPLING_422: printf("4:2:2"); break; case NV_CTRL_GVI_COMPONENT_SAMPLING_420: printf("4:2:0"); break; case NV_CTRL_GVI_COMPONENT_SAMPLING_UNKNOWN: /* Fall Through */ default: printf("Unknown"); break; } printf("\n"); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id link_definition, // display_mask NV_CTRL_GVI_DETECTED_CHANNEL_COLOR_SPACE, &value); if (!ret) { printf(" - Failed to query detected color space on " "jack %d, channel %d of GVI %d.\n", jack, channel, gvi); continue; } printf(" - Detected color space: "); switch (value) { case NV_CTRL_GVI_COLOR_SPACE_GBR: printf("GBR"); break; case NV_CTRL_GVI_COLOR_SPACE_GBRA: printf("GBRA"); break; case NV_CTRL_GVI_COLOR_SPACE_GBRD: printf("GBRD"); break; case NV_CTRL_GVI_COLOR_SPACE_YCBCR: printf("YCbCr"); break; case NV_CTRL_GVI_COLOR_SPACE_YCBCRA: printf("YCbCrA"); break; case NV_CTRL_GVI_COLOR_SPACE_YCBCRD: printf("YCbCrD"); break; case NV_CTRL_GVI_COLOR_SPACE_UNKNOWN: /* Fall Through */ default: printf("Unknown"); break; } printf("\n"); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id link_definition, // display_mask NV_CTRL_GVI_DETECTED_CHANNEL_LINK_ID, &value); if (!ret) { printf(" - Failed to query detected link ID on " "jack %d, channel %d of GVI %d.\n", jack, channel, gvi); continue; } printf(" - Detected Link ID: Link %d", value); if (value == NV_CTRL_GVI_LINK_ID_UNKNOWN) { printf(" (Unknown)"); } else if (value < 26) { printf(" (Link%c)", (int)('A')+value); } printf("\n"); } /* Done querying per-channel information */ } /* Done querying per-jack information */ /* Query stream (link to jack+channel) topology */ ret = XNVCTRLStringOperation(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id 0, // display_mask NV_CTRL_STRING_OPERATION_GVI_CONFIGURE_STREAMS, NULL, // pIn &pOut); if (!ret || !pOut) { printf(" - Failed to query stream topology configuration of " "GVI %d.\n", gvi); continue; } printf(" - Topology:\n"); printf("\n %s\n\n", pOut ? pOut : "No streams are configured."); /* Query per-stream settings */ if (pOut) { char *str = pOut; int i = 0; while ( (str = strstr(str, "stream=")) ) { printf(" - Stream %d\n", i); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id i, // display_mask (stream #) NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT, &value); if (!ret) { printf(" - Failed to query requested stream bits per component " "for stream %d of GVI %d.\n", i, gvi); continue; } printf(" - Requested bits per component: %d (%s)\n", value, BPCName(value)); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id i, // display_mask (stream #) NV_CTRL_GVI_REQUESTED_STREAM_COMPONENT_SAMPLING, &value); if (!ret) { printf(" - Failed to query requested stream component sampling " "for stream %d of GVI %d.\n", i, gvi); continue; } printf(" - Requested component sampling: %d (%s)\n", value, SamplingName(value)); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id i, // display_mask (stream #) NV_CTRL_GVI_REQUESTED_STREAM_CHROMA_EXPAND, &value); if (!ret) { printf(" - Failed to query requested stream chroma expand " "for stream %d of GVI %d.\n", i, gvi); continue; } printf(" - Requested chroma expand: %s\n", value ? "Enabled" : "Disabled"); i++; str++; } } XFree(pOut); pOut = NULL; } /* Done Querying information about GVI devices */ } /* do_query() */ static unsigned int firstbit (unsigned int mask) { return mask ^ ((mask - 1) & mask); } // List the configuration space of the GVI device. static void do_listconfig(Display *dpy, int gvi) { NVCTRLAttributeValidValuesRec values; unsigned int fmts[3]; int i; char *pOut = NULL; Bool ret; // Assume GVI device has been configured already. if (gvi < 0) { gvi = 0; } printf("Querying Valid Configuring Space of GVI device %d:\n\n", gvi); /* Query stream (link to jack+channel) topology */ ret = XNVCTRLStringOperation(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id 0, // display_mask NV_CTRL_STRING_OPERATION_GVI_CONFIGURE_STREAMS, NULL, // pIn &pOut); if (!ret || !pOut) { printf(" - Failed to query stream topology configuration of " "GVI %d.\n", gvi); return; } printf("- Current Topology:\n\n"); printf(" %s\n\n", pOut ? pOut : "No streams are configured."); XFree(pOut); pOut = NULL; ret = XNVCTRLQueryValidTargetAttributeValues(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, 0, // display_mask NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT, &values); if (!ret) { printf("- Failed to query valid video format values(1) of " "GVI %d.\n", gvi); return; } fmts[0] = values.u.bits.ints; ret = XNVCTRLQueryValidTargetAttributeValues(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, 0, // display_mask NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT2, &values); if (!ret) { printf("- Failed to query valid video format values(2) of " "GVI %d.\n", gvi); return; } fmts[1] = values.u.bits.ints; ret = XNVCTRLQueryValidTargetAttributeValues(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, 0, // display_mask NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT3, &values); if (!ret) { printf("- Failed to query valid video format values(3) of " "GVI %d.\n", gvi); return; } fmts[2] = values.u.bits.ints; printf("- Valid Formats (NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT): %08x\n", fmts[0]); printf("- Valid Formats (NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT2): %08x\n", fmts[1]); printf("- Valid Formats (NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT3): %08x\n", fmts[2]); printf("\n"); for (i = 0; i < 3; i++) { unsigned int fmt_list = fmts[i]; unsigned int fmt_bit; unsigned int fmt; unsigned int fmt_flags; unsigned int bpcs; unsigned int bpc_bit; unsigned int bpc; unsigned int samplings; unsigned int smp_bit; unsigned int sampling; while (fmt_list) { fmt_bit = firstbit(fmt_list); fmt_list &= (~fmt_bit); fmt = ffs(fmt_bit) - 1 + (32*i); printf("\n%s", VideoFormatName(fmt)); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, fmt, // display_mask NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS, (int *)&fmt_flags); if (!ret) { printf(" - Failed to query flag bits for video format for " "GVI %d.\n", gvi); } else if (fmt_flags == NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_NONE) { printf(" (No flags set): \n"); } else { printf(" (Flags:"); printf("%c", (fmt_flags & NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_INTERLACED) ? 'I' : '_'); printf("%c", (fmt_flags & NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_PROGRESSIVE) ? 'P' : '_'); printf("%c", (fmt_flags & NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_PSF) ? 'F' : '_'); printf("%c", (fmt_flags & NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_LEVEL_A) ? 'A' : '_'); printf("%c", (fmt_flags & NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_LEVEL_B) ? 'B' : '_'); printf("%c", (fmt_flags & NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_1080P_NO_12BPC) ? 'N' : '_'); printf("):\n"); } // Set the video format XNVCTRLSetTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, 0, // display_mask NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT, fmt); // Get all bits per component (on first jack/channel) ret = XNVCTRLQueryValidTargetAttributeValues(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, 0, // jack 0, channel 0 NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT, &values); if (!ret) { printf(" - Failed to query valid bits per component " "of GVI %d.\n", gvi); continue; } bpcs = values.u.bits.ints; while (bpcs) { bpc_bit = firstbit(bpcs); bpcs &= (~bpc_bit); bpc = ffs(bpc_bit) -1; printf(" %s:\n", BPCName(bpc)); // Set the bits per component XNVCTRLSetTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, 0, // jack 0, channel 0 NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT, bpc); // Get all component samplings (on first jack/channel) ret = XNVCTRLQueryValidTargetAttributeValues(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, 0, // display_mask NV_CTRL_GVI_REQUESTED_STREAM_COMPONENT_SAMPLING, &values); if (!ret) { printf(" - Failed to query valid component sampling " "values of GVI %d.\n", gvi); continue; } samplings = values.u.bits.ints; while (samplings) { smp_bit = firstbit(samplings); samplings &= (~smp_bit); sampling = ffs(smp_bit) -1; printf(" %s\n", SamplingName(sampling)); } // All component samplings } // Add BPC } // All formats } // All format lists } /* do_listconfig() */ static void do_configure(Display *dpy, int use_gvi, char *pIn) { Bool ret; char *pOut = NULL; if (use_gvi < 0) { use_gvi = 0; } printf("Configuring GVI device %d:\n\n", use_gvi); printf("Setting "); if (!pIn) { pIn = "stream=0, link0=jack0.0; " "stream=1, link0=jack1.0; " "stream=2, link0=jack2.0; " "stream=3, link0=jack3.0"; printf("default"); } else { printf("custom"); } printf(" configuration:\n\n"); printf(" \"%s\"\n\n", pIn); ret = XNVCTRLStringOperation(dpy, NV_CTRL_TARGET_TYPE_GVI, use_gvi, // target_id 0, // display_mask NV_CTRL_STRING_OPERATION_GVI_CONFIGURE_STREAMS, pIn, &pOut); if (!ret || !pOut) { printf(" - Failed to configure stream topology of GVI %d.\n", use_gvi); return; } printf("Topology:\n\n"); printf(" %s\n\n", pOut ? pOut : "No streams are configured."); XFree(pOut); pOut = NULL; } int main(int argc, char *argv[]) { Display *dpy; Bool ret; int major, minor; int use_gvi = -1; int i; char *topology_str = NULL; /* * Open a display connection, and make sure the NV-CONTROL X * extension is present on the screen we want to use. */ dpy = XOpenDisplay(NULL); if (!dpy) { printf("Cannot open display '%s'.\n", XDisplayName(NULL)); return 1; } /* Query the NV-CONTROL version */ ret = XNVCTRLQueryVersion(dpy, &major, &minor); if (ret != True) { printf("The NV-CONTROL X extension does not exist on '%s'.\n", XDisplayName(NULL)); return 1; } /* Print some information */ printf("Using NV-CONTROL extension %d.%d on %s\n\n", major, minor, XDisplayName(NULL)); /* See if user wants a specific GVI device */ for (i = 0; i < argc; i++) { if ((strcmp(argv[i], "-g") == 0) && ((i+1) < argc)) { use_gvi = strtol(argv[i+1], NULL, 10); } if ((strcmp(argv[i], "-c") == 0) && ((i+1) < argc)) { topology_str = argv[i+1]; } } /* Do what the user wants */ ret = 0; for (i = 0; i < argc; i++) { if (strcmp(argv[i], "-q") == 0) { do_query(dpy, use_gvi); ret = 1; break; } else if (strcmp(argv[i], "-c") == 0) { do_configure(dpy, use_gvi, topology_str); ret = 1; break; } else if (strcmp(argv[i], "-l") == 0) { do_listconfig(dpy, use_gvi); ret = 1; } } if (!ret) { do_help(); } return 0; } nvidia-settings/samples/nv-control-targets.c0000664000175000017500000002351512236467170021430 0ustar albertoalberto/* * Copyright (c) 2006-2008 NVIDIA, Corporation * * 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 (including the next * paragraph) 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. */ /* * nv-control-targets.c - NV-CONTROL client that demonstrates how to * talk to various target types on an X Server (X Screens, GPU, FrameLock) */ #include #include #include #include #include "NVCtrl.h" #include "NVCtrlLib.h" #include "nv-control-screen.h" static void print_display_device_target_indices(const int *pData) { int i, first = 1; for (i = 1; i <= pData[0]; i++) { if (!first) { printf(", "); } first = 0; printf("DPY-%d", pData[i]); } } int main(int argc, char *argv[]) { Display *dpy; Bool ret; int major, minor; int num_gpus, num_screens, num_syncs; int num_vcs; int num_gvis; int num_coolers; int num_thermal_sensors; int gpu, screen; int *pData; int len, j; char *str; /* * Open a display connection, and make sure the NV-CONTROL X * extension is present on the screen we want to use. */ dpy = XOpenDisplay(NULL); if (!dpy) { fprintf(stderr, "Cannot open display '%s'.\n", XDisplayName(NULL)); return 1; } screen = GetNvXScreen(dpy); ret = XNVCTRLQueryVersion(dpy, &major, &minor); if (ret != True) { fprintf(stderr, "The NV-CONTROL X extension does not exist on '%s'.\n", XDisplayName(NULL)); return 1; } /* Print some information */ printf("\n"); printf("Using NV-CONTROL extension %d.%d on %s\n", major, minor, XDisplayName(NULL)); /* Start printing server system information */ printf("\n"); printf("Server System Information:\n"); printf("\n"); /* Get the number of gpus in the system */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_GPU, &num_gpus); if (!ret) { fprintf(stderr, "Failed to query number of gpus\n"); return 1; } printf(" number of GPUs: %d\n", num_gpus); /* Get the number of X Screens in the system */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, &num_screens); if (!ret) { fprintf(stderr, "Failed to query number of xscreens\n"); return 1; } printf(" number of X Screens: %d\n", num_screens); /* Get the number of display devices in the system */ ret = XNVCTRLQueryTargetBinaryData (dpy, NV_CTRL_TARGET_TYPE_GPU, 0, // target_id 0, // display_mask NV_CTRL_BINARY_DATA_DISPLAY_TARGETS, (unsigned char **) &pData, &len); if (!ret) { fprintf(stderr, "Failed to query number of display devices\n"); return 1; } printf(" number of display devices: %d (", pData[0]); print_display_device_target_indices(pData); printf(")\n"); XFree(pData); /* Get the number of Frame Lock devices in the system */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_FRAMELOCK, &num_syncs); if (!ret) { fprintf(stderr, "Failed to query number of xscreens\n"); return 1; } printf(" number of Frame Lock Devices: %d\n", num_syncs); /* Get the number of Visual Computing System devices in * the system */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_VCSC, &num_vcs); if (!ret) { fprintf(stderr, "Failed to query number of VCS\n"); return 1; } printf(" number of Visual Computing System Devices: %d\n", num_vcs); /* Get the number of GVI devices in the system */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_GVI, &num_gvis); if (!ret) { fprintf(stderr, "Failed to query number of GVIs\n"); return 1; } printf(" number of Graphics Video Input Devices: %d\n", num_gvis); /* Get the number of Cooler devices in the system */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_COOLER, &num_coolers); if (!ret) { fprintf(stderr, "Failed to query number of Coolers\n"); return 1; } printf(" number of Cooler Devices: %d\n", num_coolers); /* Get the number of Thermal Sensor devices in the system */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_THERMAL_SENSOR, &num_thermal_sensors); if (!ret) { fprintf(stderr, "Failed to query number of Thermal Sensors\n"); return 1; } printf(" number of Thermal Sensor Devices: %d\n", num_thermal_sensors); /* display information about all GPUs */ for (gpu = 0; gpu < num_gpus; gpu++) { int *pDisplayData; printf("\n\n"); printf("GPU %d information:\n", gpu); /* GPU name */ ret = XNVCTRLQueryTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_STRING_PRODUCT_NAME, &str); if (!ret) { fprintf(stderr, "Failed to query gpu product name\n"); return 1; } printf(" Product Name : %s\n", str); XFree(str); str = NULL; /* GPU UUID */ ret = XNVCTRLQueryTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_STRING_GPU_UUID, &str); printf(" GPU UUID : %s\n", (ret ? str : "Unknown")); XFree(str); str = NULL; /* Connected Display Devices on GPU */ ret = XNVCTRLQueryTargetBinaryData (dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU, (unsigned char **) &pDisplayData, &len); if (!ret) { fprintf(stderr, "Failed to query connected displays\n"); return 1; } printf(" Connected Display Devices : "); print_display_device_target_indices(pDisplayData); XFree(pDisplayData); printf("\n"); /* X Screens driven by this GPU */ ret = XNVCTRLQueryTargetBinaryData (dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_BINARY_DATA_XSCREENS_USING_GPU, (unsigned char **) &pData, &len); if (!ret) { fprintf(stderr, "Failed to query list of X Screens\n"); return 1; } printf(" Number of X Screens on GPU %d : %d\n", gpu, pData[0]); /* List all X Screens on GPU */ for (j = 1; j <= pData[0]; j++) { screen = pData[j]; printf("\n"); printf(" X Screen %d information:\n", screen); /* Assigned Display Devices on X Screen */ ret = XNVCTRLQueryTargetBinaryData (dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, // target_id 0, // display_mask NV_CTRL_BINARY_DATA_DISPLAYS_ASSIGNED_TO_XSCREEN, (unsigned char **) &pDisplayData, &len); if (!ret) { fprintf(stderr, "Failed to query assigned displays\n"); return 1; } printf(" Assigned Display Devices : "); print_display_device_target_indices(pDisplayData); XFree(pDisplayData); printf("\n"); /* Enabled Display Devices on X Screen */ ret = XNVCTRLQueryTargetBinaryData (dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, // target_id 0, // display_mask NV_CTRL_BINARY_DATA_DISPLAYS_ENABLED_ON_XSCREEN, (unsigned char **) &pDisplayData, &len); if (!ret) { fprintf(stderr, "Failed to query assigned displays\n"); return 1; } printf(" Enabled Display Devices : "); print_display_device_target_indices(pDisplayData); XFree(pDisplayData); printf("\n"); } XFree(pData); } return 0; } nvidia-settings/samples/src.mk0000664000175000017500000000122012236467170016621 0ustar albertoalberto# # files in the samples directory of nvidia-settings # SAMPLES_SRC += SAMPLES_EXTRA_DIST += README SAMPLES_EXTRA_DIST += nv-control-dvc.c SAMPLES_EXTRA_DIST += nv-control-3dvisionpro.c SAMPLES_EXTRA_DIST += nv-control-dpy.c SAMPLES_EXTRA_DIST += nv-control-info.c SAMPLES_EXTRA_DIST += nv-control-events.c SAMPLES_EXTRA_DIST += nv-control-gvi.c SAMPLES_EXTRA_DIST += nv-control-targets.c SAMPLES_EXTRA_DIST += nv-control-framelock.c SAMPLES_EXTRA_DIST += nv-control-warpblend.c SAMPLES_EXTRA_DIST += nv-control-warpblend.h SAMPLES_EXTRA_DIST += nv-control-screen.h SAMPLES_EXTRA_DIST += src.mk SAMPLES_DIST_FILES := $(SAMPLES_SRC) $(SAMPLES_EXTRA_DIST)nvidia-settings/samples/nv-control-info.c0000664000175000017500000006074212236467170020715 0ustar albertoalberto/* * Copyright (c) 2004 NVIDIA, Corporation * * 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 (including the next * paragraph) 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. */ /* * nv-control-info.c - trivial sample NV-CONTROL client that * demonstrates how to determine if the NV-CONTROL extension is * present. */ #include #include #include #include #include "NVCtrl.h" #include "NVCtrlLib.h" // Used to convert the NV-CONTROL #defines to human readable text. #define MAKE_ENTRY(ATTRIBUTE) { ATTRIBUTE, #ATTRIBUTE, NULL } typedef struct { int num; char *str; char *name; } AttrEntry; static const char *attr2str(int n, AttrEntry *tbl) { AttrEntry *entry; entry = tbl; while (entry->str) { if (entry->num == n) { if (!entry->name) { int len; entry->name = strdup(entry->str + 8); for (len = 0; len < strlen(entry->name); len++) { entry->name[len] = tolower(entry->name[len]); } } return entry->name; } entry++; } return NULL; } // Attribute -> String table, generated using: // // grep 'define.*\/\*' NVCtrl.h | sed 's/.*define \([^ ]*\).*/ MAKE_ENTRY(\1),/' > DATA | head DATA // static AttrEntry attr_int_table[] = { MAKE_ENTRY(NV_CTRL_FLATPANEL_SCALING), MAKE_ENTRY(NV_CTRL_FLATPANEL_DITHERING), MAKE_ENTRY(NV_CTRL_DITHERING), MAKE_ENTRY(NV_CTRL_DIGITAL_VIBRANCE), MAKE_ENTRY(NV_CTRL_BUS_TYPE), MAKE_ENTRY(NV_CTRL_VIDEO_RAM), MAKE_ENTRY(NV_CTRL_IRQ), MAKE_ENTRY(NV_CTRL_OPERATING_SYSTEM), MAKE_ENTRY(NV_CTRL_SYNC_TO_VBLANK), MAKE_ENTRY(NV_CTRL_LOG_ANISO), MAKE_ENTRY(NV_CTRL_FSAA_MODE), MAKE_ENTRY(NV_CTRL_TEXTURE_SHARPEN), MAKE_ENTRY(NV_CTRL_UBB), MAKE_ENTRY(NV_CTRL_OVERLAY), MAKE_ENTRY(NV_CTRL_STEREO), MAKE_ENTRY(NV_CTRL_EMULATE), MAKE_ENTRY(NV_CTRL_TWINVIEW), MAKE_ENTRY(NV_CTRL_CONNECTED_DISPLAYS), MAKE_ENTRY(NV_CTRL_ENABLED_DISPLAYS), MAKE_ENTRY(NV_CTRL_FRAMELOCK), MAKE_ENTRY(NV_CTRL_FRAMELOCK_MASTER), MAKE_ENTRY(NV_CTRL_FRAMELOCK_POLARITY), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SYNC_DELAY), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SYNC_INTERVAL), MAKE_ENTRY(NV_CTRL_FRAMELOCK_PORT0_STATUS), MAKE_ENTRY(NV_CTRL_FRAMELOCK_PORT1_STATUS), MAKE_ENTRY(NV_CTRL_FRAMELOCK_HOUSE_STATUS), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SYNC), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SYNC_READY), MAKE_ENTRY(NV_CTRL_FRAMELOCK_STEREO_SYNC), MAKE_ENTRY(NV_CTRL_FRAMELOCK_TEST_SIGNAL), MAKE_ENTRY(NV_CTRL_FRAMELOCK_ETHERNET_DETECTED), MAKE_ENTRY(NV_CTRL_FRAMELOCK_VIDEO_MODE), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SYNC_RATE), MAKE_ENTRY(NV_CTRL_FORCE_GENERIC_CPU), MAKE_ENTRY(NV_CTRL_OPENGL_AA_LINE_GAMMA), MAKE_ENTRY(NV_CTRL_FRAMELOCK_TIMING), MAKE_ENTRY(NV_CTRL_FLIPPING_ALLOWED), MAKE_ENTRY(NV_CTRL_ARCHITECTURE), MAKE_ENTRY(NV_CTRL_TEXTURE_CLAMPING), MAKE_ENTRY(NV_CTRL_FSAA_APPLICATION_CONTROLLED), MAKE_ENTRY(NV_CTRL_LOG_ANISO_APPLICATION_CONTROLLED), MAKE_ENTRY(NV_CTRL_IMAGE_SHARPENING), MAKE_ENTRY(NV_CTRL_TV_OVERSCAN), MAKE_ENTRY(NV_CTRL_TV_FLICKER_FILTER), MAKE_ENTRY(NV_CTRL_TV_BRIGHTNESS), MAKE_ENTRY(NV_CTRL_TV_HUE), MAKE_ENTRY(NV_CTRL_TV_CONTRAST), MAKE_ENTRY(NV_CTRL_TV_SATURATION), MAKE_ENTRY(NV_CTRL_TV_RESET_SETTINGS), MAKE_ENTRY(NV_CTRL_GPU_CORE_TEMPERATURE), MAKE_ENTRY(NV_CTRL_GPU_CORE_THRESHOLD), MAKE_ENTRY(NV_CTRL_GPU_DEFAULT_CORE_THRESHOLD), MAKE_ENTRY(NV_CTRL_GPU_MAX_CORE_THRESHOLD), MAKE_ENTRY(NV_CTRL_AMBIENT_TEMPERATURE), MAKE_ENTRY(NV_CTRL_PBUFFER_SCANOUT_SUPPORTED), MAKE_ENTRY(NV_CTRL_PBUFFER_SCANOUT_XID), MAKE_ENTRY(NV_CTRL_GVO_SUPPORTED), MAKE_ENTRY(NV_CTRL_GVO_SYNC_MODE), MAKE_ENTRY(NV_CTRL_GVO_SYNC_SOURCE), MAKE_ENTRY(NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT), MAKE_ENTRY(NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT), MAKE_ENTRY(NV_CTRL_GVO_DATA_FORMAT), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE), MAKE_ENTRY(NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED), MAKE_ENTRY(NV_CTRL_GVO_VIDEO_OUTPUTS), MAKE_ENTRY(NV_CTRL_GVO_FIRMWARE_VERSION), MAKE_ENTRY(NV_CTRL_GVO_SYNC_DELAY_PIXELS), MAKE_ENTRY(NV_CTRL_GVO_SYNC_DELAY_LINES), MAKE_ENTRY(NV_CTRL_GVO_INPUT_VIDEO_FORMAT_REACQUIRE), MAKE_ENTRY(NV_CTRL_GVO_GLX_LOCKED), MAKE_ENTRY(NV_CTRL_GVIO_VIDEO_FORMAT_WIDTH), MAKE_ENTRY(NV_CTRL_GVIO_VIDEO_FORMAT_HEIGHT), MAKE_ENTRY(NV_CTRL_GVIO_VIDEO_FORMAT_REFRESH_RATE), MAKE_ENTRY(NV_CTRL_GPU_OVERCLOCKING_STATE), MAKE_ENTRY(NV_CTRL_GPU_2D_CLOCK_FREQS), MAKE_ENTRY(NV_CTRL_GPU_3D_CLOCK_FREQS), MAKE_ENTRY(NV_CTRL_GPU_DEFAULT_2D_CLOCK_FREQS), MAKE_ENTRY(NV_CTRL_GPU_DEFAULT_3D_CLOCK_FREQS), MAKE_ENTRY(NV_CTRL_GPU_CURRENT_CLOCK_FREQS), MAKE_ENTRY(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS), MAKE_ENTRY(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION), MAKE_ENTRY(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE), MAKE_ENTRY(NV_CTRL_FLATPANEL_CHIP_LOCATION), MAKE_ENTRY(NV_CTRL_FLATPANEL_LINK), MAKE_ENTRY(NV_CTRL_FLATPANEL_SIGNAL), MAKE_ENTRY(NV_CTRL_USE_HOUSE_SYNC), MAKE_ENTRY(NV_CTRL_EDID_AVAILABLE), MAKE_ENTRY(NV_CTRL_FORCE_STEREO), MAKE_ENTRY(NV_CTRL_IMAGE_SETTINGS), MAKE_ENTRY(NV_CTRL_XINERAMA), MAKE_ENTRY(NV_CTRL_XINERAMA_STEREO), MAKE_ENTRY(NV_CTRL_BUS_RATE), MAKE_ENTRY(NV_CTRL_SHOW_SLI_VISUAL_INDICATOR), MAKE_ENTRY(NV_CTRL_XV_SYNC_TO_DISPLAY), MAKE_ENTRY(NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT2), MAKE_ENTRY(NV_CTRL_GVO_OVERRIDE_HW_CSC), MAKE_ENTRY(NV_CTRL_GVO_CAPABILITIES), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE_TERMINATION), MAKE_ENTRY(NV_CTRL_ASSOCIATED_DISPLAY_DEVICES), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SLAVES), MAKE_ENTRY(NV_CTRL_FRAMELOCK_MASTERABLE), MAKE_ENTRY(NV_CTRL_PROBE_DISPLAYS), MAKE_ENTRY(NV_CTRL_REFRESH_RATE), MAKE_ENTRY(NV_CTRL_GVO_FLIP_QUEUE_SIZE), MAKE_ENTRY(NV_CTRL_CURRENT_SCANLINE), MAKE_ENTRY(NV_CTRL_INITIAL_PIXMAP_PLACEMENT), MAKE_ENTRY(NV_CTRL_PCI_BUS), MAKE_ENTRY(NV_CTRL_PCI_DEVICE), MAKE_ENTRY(NV_CTRL_PCI_FUNCTION), MAKE_ENTRY(NV_CTRL_FRAMELOCK_FPGA_REVISION), MAKE_ENTRY(NV_CTRL_MAX_SCREEN_WIDTH), MAKE_ENTRY(NV_CTRL_MAX_SCREEN_HEIGHT), MAKE_ENTRY(NV_CTRL_MAX_DISPLAYS), MAKE_ENTRY(NV_CTRL_DYNAMIC_TWINVIEW), MAKE_ENTRY(NV_CTRL_MULTIGPU_DISPLAY_OWNER), MAKE_ENTRY(NV_CTRL_FSAA_APPLICATION_ENHANCED), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SYNC_RATE_4), MAKE_ENTRY(NV_CTRL_GVO_LOCK_OWNER), MAKE_ENTRY(NV_CTRL_HWOVERLAY), MAKE_ENTRY(NV_CTRL_NUM_GPU_ERRORS_RECOVERED), MAKE_ENTRY(NV_CTRL_REFRESH_RATE_3), MAKE_ENTRY(NV_CTRL_ONDEMAND_VBLANK_INTERRUPTS), MAKE_ENTRY(NV_CTRL_GPU_POWER_SOURCE), MAKE_ENTRY(NV_CTRL_GPU_CURRENT_PERFORMANCE_MODE), MAKE_ENTRY(NV_CTRL_GLYPH_CACHE), MAKE_ENTRY(NV_CTRL_GPU_CURRENT_PERFORMANCE_LEVEL), MAKE_ENTRY(NV_CTRL_GPU_ADAPTIVE_CLOCK_STATE), MAKE_ENTRY(NV_CTRL_GVO_OUTPUT_VIDEO_LOCKED), MAKE_ENTRY(NV_CTRL_GVO_SYNC_LOCK_STATUS), MAKE_ENTRY(NV_CTRL_GVO_ANC_TIME_CODE_GENERATION), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE_ALPHA_KEY), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE_LUMA_KEY_RANGE), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE_CR_KEY_RANGE), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE_CB_KEY_RANGE), MAKE_ENTRY(NV_CTRL_GVO_COMPOSITE_NUM_KEY_RANGES), MAKE_ENTRY(NV_CTRL_SWITCH_TO_DISPLAYS), MAKE_ENTRY(NV_CTRL_NOTEBOOK_DISPLAY_CHANGE_LID_EVENT), MAKE_ENTRY(NV_CTRL_NOTEBOOK_INTERNAL_LCD), MAKE_ENTRY(NV_CTRL_DEPTH_30_ALLOWED), MAKE_ENTRY(NV_CTRL_MODE_SET_EVENT), MAKE_ENTRY(NV_CTRL_OPENGL_AA_LINE_GAMMA_VALUE), MAKE_ENTRY(NV_CTRL_VCSC_HIGH_PERF_MODE), MAKE_ENTRY(NV_CTRL_DISPLAYPORT_LINK_RATE), MAKE_ENTRY(NV_CTRL_STEREO_EYES_EXCHANGE), MAKE_ENTRY(NV_CTRL_NO_SCANOUT), MAKE_ENTRY(NV_CTRL_GVO_CSC_CHANGED_EVENT), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SLAVEABLE), MAKE_ENTRY(NV_CTRL_GVO_SYNC_TO_DISPLAY), MAKE_ENTRY(NV_CTRL_X_SERVER_UNIQUE_ID), MAKE_ENTRY(NV_CTRL_PIXMAP_CACHE), MAKE_ENTRY(NV_CTRL_PIXMAP_CACHE_ROUNDING_SIZE_KB), MAKE_ENTRY(NV_CTRL_IS_GVO_DISPLAY), MAKE_ENTRY(NV_CTRL_PCI_ID), MAKE_ENTRY(NV_CTRL_GVO_FULL_RANGE_COLOR), MAKE_ENTRY(NV_CTRL_SLI_MOSAIC_MODE_AVAILABLE), MAKE_ENTRY(NV_CTRL_GVO_ENABLE_RGB_DATA), MAKE_ENTRY(NV_CTRL_IMAGE_SHARPENING_DEFAULT), MAKE_ENTRY(NV_CTRL_PCI_DOMAIN), MAKE_ENTRY(NV_CTRL_GVI_NUM_JACKS), MAKE_ENTRY(NV_CTRL_GVI_MAX_LINKS_PER_STREAM), MAKE_ENTRY(NV_CTRL_GVI_DETECTED_CHANNEL_BITS_PER_COMPONENT), MAKE_ENTRY(NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT), MAKE_ENTRY(NV_CTRL_GVI_DETECTED_CHANNEL_COMPONENT_SAMPLING), MAKE_ENTRY(NV_CTRL_GVI_REQUESTED_STREAM_COMPONENT_SAMPLING), MAKE_ENTRY(NV_CTRL_GVI_REQUESTED_STREAM_CHROMA_EXPAND), MAKE_ENTRY(NV_CTRL_GVI_DETECTED_CHANNEL_COLOR_SPACE), MAKE_ENTRY(NV_CTRL_GVI_DETECTED_CHANNEL_LINK_ID), MAKE_ENTRY(NV_CTRL_GVI_DETECTED_CHANNEL_SMPTE352_IDENTIFIER), MAKE_ENTRY(NV_CTRL_GVI_GLOBAL_IDENTIFIER), MAKE_ENTRY(NV_CTRL_FRAMELOCK_SYNC_DELAY_RESOLUTION), MAKE_ENTRY(NV_CTRL_GPU_COOLER_MANUAL_CONTROL), MAKE_ENTRY(NV_CTRL_THERMAL_COOLER_LEVEL), MAKE_ENTRY(NV_CTRL_THERMAL_COOLER_LEVEL_SET_DEFAULT), MAKE_ENTRY(NV_CTRL_THERMAL_COOLER_CONTROL_TYPE), MAKE_ENTRY(NV_CTRL_THERMAL_COOLER_TARGET), MAKE_ENTRY(NV_CTRL_GPU_ECC_SUPPORTED), MAKE_ENTRY(NV_CTRL_GPU_ECC_STATUS), MAKE_ENTRY(NV_CTRL_GPU_ECC_CONFIGURATION_SUPPORTED), MAKE_ENTRY(NV_CTRL_GPU_ECC_CONFIGURATION), MAKE_ENTRY(NV_CTRL_GPU_ECC_DEFAULT_CONFIGURATION), MAKE_ENTRY(NV_CTRL_GPU_ECC_SINGLE_BIT_ERRORS), MAKE_ENTRY(NV_CTRL_GPU_ECC_DOUBLE_BIT_ERRORS), MAKE_ENTRY(NV_CTRL_GPU_ECC_AGGREGATE_SINGLE_BIT_ERRORS), MAKE_ENTRY(NV_CTRL_GPU_ECC_AGGREGATE_DOUBLE_BIT_ERRORS), MAKE_ENTRY(NV_CTRL_GPU_ECC_RESET_ERROR_STATUS), MAKE_ENTRY(NV_CTRL_GPU_POWER_MIZER_MODE), MAKE_ENTRY(NV_CTRL_GVI_SYNC_OUTPUT_FORMAT), MAKE_ENTRY(NV_CTRL_GVI_MAX_CHANNELS_PER_JACK), MAKE_ENTRY(NV_CTRL_GVI_MAX_STREAMS), MAKE_ENTRY(NV_CTRL_GVI_NUM_CAPTURE_SURFACES), MAKE_ENTRY(NV_CTRL_OVERSCAN_COMPENSATION), MAKE_ENTRY(NV_CTRL_GPU_PCIE_GENERATION), MAKE_ENTRY(NV_CTRL_GVI_BOUND_GPU), MAKE_ENTRY(NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT3), MAKE_ENTRY(NV_CTRL_ACCELERATE_TRAPEZOIDS), MAKE_ENTRY(NV_CTRL_GPU_CORES), MAKE_ENTRY(NV_CTRL_GPU_MEMORY_BUS_WIDTH), MAKE_ENTRY(NV_CTRL_GVI_TEST_MODE), MAKE_ENTRY(NV_CTRL_COLOR_SPACE), MAKE_ENTRY(NV_CTRL_COLOR_RANGE), MAKE_ENTRY(NV_CTRL_GPU_SCALING_DEFAULT_TARGET), MAKE_ENTRY(NV_CTRL_GPU_SCALING_DEFAULT_METHOD), MAKE_ENTRY(NV_CTRL_DITHERING_MODE), MAKE_ENTRY(NV_CTRL_CURRENT_DITHERING), MAKE_ENTRY(NV_CTRL_CURRENT_DITHERING_MODE), MAKE_ENTRY(NV_CTRL_THERMAL_SENSOR_READING), MAKE_ENTRY(NV_CTRL_THERMAL_SENSOR_PROVIDER), MAKE_ENTRY(NV_CTRL_THERMAL_SENSOR_TARGET), MAKE_ENTRY(NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR), MAKE_ENTRY(NV_CTRL_GPU_CURRENT_PROCESSOR_CLOCK_FREQS), MAKE_ENTRY(NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS), MAKE_ENTRY(NV_CTRL_GPU_PCIE_MAX_LINK_SPEED), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_RESET_TRANSCEIVER_TO_FACTORY_SETTINGS), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE), MAKE_ENTRY(NV_CTRL_SYNCHRONOUS_PALETTE_UPDATES), MAKE_ENTRY(NV_CTRL_DITHERING_DEPTH), MAKE_ENTRY(NV_CTRL_CURRENT_DITHERING_DEPTH), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_FREQUENCY), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_COUNT), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_PAIR_GLASSES), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_UNPAIR_GLASSES), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_DISCOVER_GLASSES), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_IDENTIFY_GLASSES), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_GLASSES_SYNC_CYCLE), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_GLASSES_MISSED_SYNC_CYCLES), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL), MAKE_ENTRY(NV_CTRL_GVO_ANC_PARITY_COMPUTATION), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_GLASSES_PAIR_EVENT), MAKE_ENTRY(NV_CTRL_3D_VISION_PRO_GLASSES_UNPAIR_EVENT), { -1, NULL, NULL } }; static AttrEntry attr_str_table[] = { MAKE_ENTRY(NV_CTRL_STRING_PRODUCT_NAME), MAKE_ENTRY(NV_CTRL_STRING_VBIOS_VERSION), MAKE_ENTRY(NV_CTRL_STRING_NVIDIA_DRIVER_VERSION), MAKE_ENTRY(NV_CTRL_STRING_DISPLAY_DEVICE_NAME), MAKE_ENTRY(NV_CTRL_STRING_TV_ENCODER_NAME), MAKE_ENTRY(NV_CTRL_STRING_GVIO_FIRMWARE_VERSION), MAKE_ENTRY(NV_CTRL_STRING_GVO_FIRMWARE_VERSION), MAKE_ENTRY(NV_CTRL_STRING_CURRENT_MODELINE), MAKE_ENTRY(NV_CTRL_STRING_ADD_MODELINE), MAKE_ENTRY(NV_CTRL_STRING_DELETE_MODELINE), MAKE_ENTRY(NV_CTRL_STRING_CURRENT_METAMODE), MAKE_ENTRY(NV_CTRL_STRING_ADD_METAMODE), MAKE_ENTRY(NV_CTRL_STRING_DELETE_METAMODE), MAKE_ENTRY(NV_CTRL_STRING_VCSC_PRODUCT_NAME), MAKE_ENTRY(NV_CTRL_STRING_VCSC_PRODUCT_ID), MAKE_ENTRY(NV_CTRL_STRING_VCSC_SERIAL_NUMBER), MAKE_ENTRY(NV_CTRL_STRING_VCSC_BUILD_DATE), MAKE_ENTRY(NV_CTRL_STRING_VCSC_FIRMWARE_VERSION), MAKE_ENTRY(NV_CTRL_STRING_VCSC_FIRMWARE_REVISION), MAKE_ENTRY(NV_CTRL_STRING_VCSC_HARDWARE_VERSION), MAKE_ENTRY(NV_CTRL_STRING_VCSC_HARDWARE_REVISION), MAKE_ENTRY(NV_CTRL_STRING_MOVE_METAMODE), MAKE_ENTRY(NV_CTRL_STRING_VALID_HORIZ_SYNC_RANGES), MAKE_ENTRY(NV_CTRL_STRING_VALID_VERT_REFRESH_RANGES), MAKE_ENTRY(NV_CTRL_STRING_XINERAMA_SCREEN_INFO), MAKE_ENTRY(NV_CTRL_STRING_NVIDIA_XINERAMA_INFO_ORDER), MAKE_ENTRY(NV_CTRL_STRING_SLI_MODE), MAKE_ENTRY(NV_CTRL_STRING_PERFORMANCE_MODES), MAKE_ENTRY(NV_CTRL_STRING_VCSC_FAN_STATUS), MAKE_ENTRY(NV_CTRL_STRING_VCSC_TEMPERATURES), MAKE_ENTRY(NV_CTRL_STRING_VCSC_PSU_INFO), MAKE_ENTRY(NV_CTRL_STRING_GVIO_VIDEO_FORMAT_NAME), MAKE_ENTRY(NV_CTRL_STRING_GVO_VIDEO_FORMAT_NAME), MAKE_ENTRY(NV_CTRL_STRING_GPU_CURRENT_CLOCK_FREQS), MAKE_ENTRY(NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_HARDWARE_REVISION), MAKE_ENTRY(NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_A), MAKE_ENTRY(NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_A), MAKE_ENTRY(NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_B), MAKE_ENTRY(NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_B), MAKE_ENTRY(NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_ADDRESS), MAKE_ENTRY(NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_VERSION_A), MAKE_ENTRY(NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_DATE_A), MAKE_ENTRY(NV_CTRL_STRING_3D_VISION_PRO_GLASSES_ADDRESS), MAKE_ENTRY(NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME), MAKE_ENTRY(NV_CTRL_STRING_CURRENT_METAMODE_VERSION_2), MAKE_ENTRY(NV_CTRL_STRING_DISPLAY_NAME_TYPE_BASENAME), MAKE_ENTRY(NV_CTRL_STRING_DISPLAY_NAME_TYPE_ID), MAKE_ENTRY(NV_CTRL_STRING_DISPLAY_NAME_DP_GUID), MAKE_ENTRY(NV_CTRL_STRING_DISPLAY_NAME_EDID_HASH), MAKE_ENTRY(NV_CTRL_STRING_DISPLAY_NAME_TARGET_INDEX), MAKE_ENTRY(NV_CTRL_STRING_DISPLAY_NAME_RANDR), { -1, NULL, NULL } }; static AttrEntry attr_bin_table[] = { MAKE_ENTRY(NV_CTRL_BINARY_DATA_EDID), MAKE_ENTRY(NV_CTRL_BINARY_DATA_MODELINES), MAKE_ENTRY(NV_CTRL_BINARY_DATA_METAMODES_VERSION_1), MAKE_ENTRY(NV_CTRL_BINARY_DATA_XSCREENS_USING_GPU), MAKE_ENTRY(NV_CTRL_BINARY_DATA_GPUS_USED_BY_XSCREEN), MAKE_ENTRY(NV_CTRL_BINARY_DATA_GPUS_USING_FRAMELOCK), MAKE_ENTRY(NV_CTRL_BINARY_DATA_DISPLAY_VIEWPORT), MAKE_ENTRY(NV_CTRL_BINARY_DATA_FRAMELOCKS_USED_BY_GPU), MAKE_ENTRY(NV_CTRL_BINARY_DATA_GPUS_USING_VCSC), MAKE_ENTRY(NV_CTRL_BINARY_DATA_VCSCS_USED_BY_GPU), MAKE_ENTRY(NV_CTRL_BINARY_DATA_COOLERS_USED_BY_GPU), MAKE_ENTRY(NV_CTRL_BINARY_DATA_GPUS_USED_BY_LOGICAL_XSCREEN), MAKE_ENTRY(NV_CTRL_BINARY_DATA_THERMAL_SENSORS_USED_BY_GPU), MAKE_ENTRY(NV_CTRL_BINARY_DATA_GLASSES_PAIRED_TO_3D_VISION_PRO_TRANSCEIVER), MAKE_ENTRY(NV_CTRL_BINARY_DATA_DISPLAY_TARGETS), MAKE_ENTRY(NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU), MAKE_ENTRY(NV_CTRL_BINARY_DATA_METAMODES_VERSION_2), { -1, NULL, NULL } }; static AttrEntry attr_strop_table[] = { MAKE_ENTRY(NV_CTRL_STRING_OPERATION_ADD_METAMODE), MAKE_ENTRY(NV_CTRL_STRING_OPERATION_GTF_MODELINE), MAKE_ENTRY(NV_CTRL_STRING_OPERATION_CVT_MODELINE), MAKE_ENTRY(NV_CTRL_STRING_OPERATION_BUILD_MODEPOOL), MAKE_ENTRY(NV_CTRL_STRING_OPERATION_GVI_CONFIGURE_STREAMS), { -1, NULL, NULL } }; static void print_perms(NVCTRLAttributePermissionsRec *perms) { printf("%c", (perms->permissions & ATTRIBUTE_TYPE_READ) ? 'R' : '_'); printf("%c", (perms->permissions & ATTRIBUTE_TYPE_WRITE) ? 'W' : '_'); printf("%c", (perms->permissions & ATTRIBUTE_TYPE_DISPLAY) ? 'D' : '_'); printf("%c", (perms->permissions & ATTRIBUTE_TYPE_GPU) ? 'G' : '_'); printf("%c", (perms->permissions & ATTRIBUTE_TYPE_FRAMELOCK) ? 'F' : '_'); printf("%c", (perms->permissions & ATTRIBUTE_TYPE_X_SCREEN) ? 'X' : '_'); printf("%c", (perms->permissions & ATTRIBUTE_TYPE_XINERAMA) ? 'I' : '_'); printf("%c", (perms->permissions & ATTRIBUTE_TYPE_VCSC) ? 'V' : '_'); printf("%c", (perms->permissions & ATTRIBUTE_TYPE_GVI) ? 'S' : '_'); printf("%c", (perms->permissions & ATTRIBUTE_TYPE_COOLER) ? 'C' : '_'); printf("%c", (perms->permissions & ATTRIBUTE_TYPE_THERMAL_SENSOR) ? 'T' : '_'); printf("%c", (perms->permissions & ATTRIBUTE_TYPE_3D_VISION_PRO_TRANSCEIVER) ? '3' : '_'); } /* Used to stringify NV_CTRL_XXX #defines */ #define ADD_NVCTRL_CASE(FMT) \ case (FMT): \ return #FMT; static const char *GetAttrTypeName(int value) { switch (value) { ADD_NVCTRL_CASE(ATTRIBUTE_TYPE_UNKNOWN); ADD_NVCTRL_CASE(ATTRIBUTE_TYPE_INTEGER); ADD_NVCTRL_CASE(ATTRIBUTE_TYPE_BITMASK); ADD_NVCTRL_CASE(ATTRIBUTE_TYPE_BOOL); ADD_NVCTRL_CASE(ATTRIBUTE_TYPE_RANGE); ADD_NVCTRL_CASE(ATTRIBUTE_TYPE_INT_BITS); ADD_NVCTRL_CASE(ATTRIBUTE_TYPE_64BIT_INTEGER); ADD_NVCTRL_CASE(ATTRIBUTE_TYPE_STRING); ADD_NVCTRL_CASE(ATTRIBUTE_TYPE_BINARY_DATA); ADD_NVCTRL_CASE(ATTRIBUTE_TYPE_STRING_OPERATION); default: return "Invalid Value"; } } int main(void) { Display *dpy; Bool ret; int event_base, error_base, major, minor, screens, i; char *str; /* * open a connection to the X server indicated by the DISPLAY * environment variable */ dpy = XOpenDisplay(NULL); if (!dpy) { fprintf(stderr, "Cannot open display '%s'.\n", XDisplayName(NULL)); return 1; } /* * check if the NV-CONTROL X extension is present on this X server */ ret = XNVCTRLQueryExtension(dpy, &event_base, &error_base); if (ret != True) { fprintf(stderr, "The NV-CONTROL X extension does not exist on '%s'.\n", XDisplayName(NULL)); return 1; } /* * query the major and minor extension version */ ret = XNVCTRLQueryVersion(dpy, &major, &minor); if (ret != True) { fprintf(stderr, "The NV-CONTROL X extension does not exist on '%s'.\n", XDisplayName(NULL)); return 1; } /* * print statistics thus far */ printf("NV-CONTROL X extension present\n"); printf(" version : %d.%d\n", major, minor); printf(" event base : %d\n", event_base); printf(" error base : %d\n", error_base); /* * loop over each screen, and determine if each screen is * controlled by the NVIDIA X driver (and thus supports the * NV-CONTROL X extension); then, query the string attributes on * the screen. */ screens = ScreenCount(dpy); for (i = 0; i < screens; i++) { if (XNVCTRLIsNvScreen(dpy, i)) { printf("Screen %d supports the NV-CONTROL X extension\n", i); ret = XNVCTRLQueryStringAttribute(dpy, i, 0, /* XXX not curently used */ NV_CTRL_STRING_PRODUCT_NAME, &str); if (ret) { printf(" GPU : %s\n", str); XFree(str); } ret = XNVCTRLQueryStringAttribute(dpy, i, 0, /* XXX not curently used */ NV_CTRL_STRING_VBIOS_VERSION, &str); if (ret) { printf(" VideoBIOS : %s\n", str); XFree(str); } ret = XNVCTRLQueryStringAttribute(dpy, i, 0, /* XXX not curently used */ NV_CTRL_STRING_NVIDIA_DRIVER_VERSION, &str); if (ret) { printf(" Driver version : %s\n", str); XFree(str); } } } /* * print attribute permission and type information. */ printf("Attributes (Integers):\n"); for (i = 0; i < NV_CTRL_LAST_ATTRIBUTE; i++) { const char *name = attr2str(i, attr_int_table); if (name) { NVCTRLAttributePermissionsRec perms; printf(" (%3d) [Perms: ", i); memset(&perms, 0, sizeof(NVCTRLAttributePermissionsRec)); XNVCTRLQueryAttributePermissions(dpy, i, &perms); print_perms(&perms); printf("] [ "); printf("%-32s", GetAttrTypeName(perms.type)); printf("] - %s\n", name); } } printf("Attributes (Strings):\n"); for (i = 0; i < NV_CTRL_STRING_LAST_ATTRIBUTE; i++) { const char *name = attr2str(i, attr_str_table); if (name) { NVCTRLAttributePermissionsRec perms; printf(" (%3d) [Perms: ", i); memset(&perms, 0, sizeof(NVCTRLAttributePermissionsRec)); XNVCTRLQueryStringAttributePermissions(dpy, i, &perms); print_perms(&perms); printf("] [ "); printf("%-32s", GetAttrTypeName(perms.type)); printf("] - %s\n", name); } } printf("Attributes (Binary Data):\n"); for (i = 0; i < NV_CTRL_BINARY_DATA_LAST_ATTRIBUTE; i++) { const char *name = attr2str(i, attr_bin_table); if (name) { NVCTRLAttributePermissionsRec perms; printf(" (%3d) [Perms: ", i); memset(&perms, 0, sizeof(NVCTRLAttributePermissionsRec)); XNVCTRLQueryBinaryDataAttributePermissions(dpy, i, &perms); print_perms(&perms); printf("] [ "); printf("%-32s", GetAttrTypeName(perms.type)); printf("] - %s\n", name); } } printf("Attributes (String Operations):\n"); for (i = 0; i < NV_CTRL_STRING_OPERATION_LAST_ATTRIBUTE; i++) { const char *name = attr2str(i, attr_strop_table); if (name) { NVCTRLAttributePermissionsRec perms; printf(" (%3d) [Perms: ", i); memset(&perms, 0, sizeof(NVCTRLAttributePermissionsRec)); XNVCTRLQueryStringOperationAttributePermissions(dpy, i, &perms); print_perms(&perms); printf("] [ "); printf("%-32s", GetAttrTypeName(perms.type)); printf("] - %s\n", name); } } /* * close the display connection */ XCloseDisplay(dpy); return 0; } nvidia-settings/samples/nv-control-framelock.c0000664000175000017500000004530512236467170021723 0ustar albertoalberto/* * Copyright (c) 2006-2007 NVIDIA, Corporation * * 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 (including the next * paragraph) 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. */ /* * nv-control-framelock.c - NV-CONTROL client that demonstrates how to * interact with the frame lock capabilities on an X Server. */ #include #include #include #include #include "NVCtrl.h" #include "NVCtrlLib.h" /* * do_help() * * Prints some help on how to use this app. * */ static void do_help(void) { printf("usage:\n"); printf("-q: query system frame lock information.\n"); printf("-e: enable frame lock on system.\n"); printf("-d: disable frame lock on system.\n"); printf("\n"); } /* do_help()*/ /* * do_query() * * Prints information for all frame lock (Quadro Sync) devices found on * the given X server. * */ static void do_query(Display *dpy) { Bool ret; int num_framelocks; int framelock; int gpu; int mask; char *name; int *data; int len; int i; int enabled; /* Query the number of frame lock devices on the server */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_FRAMELOCK, &num_framelocks); if (!ret) { printf("Failed to query number of frame lock devices!\n"); return; } printf("Found %d frame lock device(s) on server.\n", num_framelocks); if ( !num_framelocks ) { return; } /* Display information for all frame lock devices found */ for (framelock = 0; framelock < num_framelocks; framelock++) { printf("\n"); printf("- Frame Lock Board %d :\n", framelock); /* Query the GPUs connected to this frame lock device */ ret = XNVCTRLQueryTargetBinaryData (dpy, NV_CTRL_TARGET_TYPE_FRAMELOCK, framelock, // target_id 0, // display_mask NV_CTRL_BINARY_DATA_GPUS_USING_FRAMELOCK, (unsigned char **) &data, &len); if (!ret) { printf(" - Failed to query list of GPUs!\n"); continue; } /* Display information for all GPUs connected to frame lock device */ if ( !data[0] ) { printf(" - No GPUs found!\n"); } else { printf(" - Found %d GPU(s).\n", data[0]); } for (i = 1; i <= data[0]; i++) { gpu = data[i]; /* Query GPU product name */ ret = XNVCTRLQueryTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_STRING_PRODUCT_NAME, &name); if (!ret) { printf(" - Failed to query GPU %d product name.\n", gpu); continue; } printf(" - GPU %d (%s) :\n", gpu, name); /* Query GPU sync state */ printf(" - Sync : "); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_FRAMELOCK_SYNC, &enabled); if (!ret) { printf("Failed to query sync state.\n"); } else { printf("%sabled\n", enabled ? "En" : "Dis"); } /* Query GPU displays */ printf(" - Displays Mask : "); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_ENABLED_DISPLAYS, &mask); if (!ret) { printf("Failed to query enabled displays.\n"); } else { printf("0x%08x\n", mask); } /* Query GPU server (master) */ printf(" - Server Mask : "); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_FRAMELOCK_MASTER, &mask); if (!ret) { printf("Failed to query server mask.\n"); } else { printf("0x%08x\n", mask); } /* Query GPU clients (slaves) */ printf(" - Clients Mask : "); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_FRAMELOCK_SLAVES, &mask); if (!ret) { printf("Failed to query clients mask.\n"); } else { printf("0x%08x\n", mask); } } /* Done disabling GPUs */ XFree(data); } /* Done disabling Frame Lock Devices */ } /* do_query() */ /* * do_enable() * * Enables frame lock on the X Server by setting the first capable/available * display device as the frame lock server (master) and setting all other * display devices as clients (slaves). * * NOTE: It is up to the user to ensure that each display device is set with * the same refresh rate (mode timings). * */ static void do_enable(Display *dpy) { Bool ret; int num_framelocks; int framelock; int gpu; unsigned int mask; int *data; int len; int i; int enabled; int masterable; int pick_server = 1; int server_set = 0; /* Query the number of frame lock devices to enable */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_FRAMELOCK, &num_framelocks); if (!ret) { printf("Failed to query number of frame lock devices!\n"); return; } printf("Found %d frame lock device(s) on server.\n", num_framelocks); if ( !num_framelocks ) { return; } /* Enable frame lock on all GPUs connected to each frame lock device */ for (framelock = 0; framelock < num_framelocks; framelock++) { printf("\n"); printf("- Frame Lock Board %d :\n", framelock); /* Query the GPUs connected to this frame lock device */ ret = XNVCTRLQueryTargetBinaryData (dpy, NV_CTRL_TARGET_TYPE_FRAMELOCK, framelock, // target_id 0, // display_mask NV_CTRL_BINARY_DATA_GPUS_USING_FRAMELOCK, (unsigned char **) &data, &len); if (!ret) { printf(" - Failed to query list of GPUs!\n"); continue; } /* Enable frame lock on all GPUs connected to the frame lock device */ if ( !data[0] ) { printf(" - No GPUs found!\n"); } else { printf(" - Found %d GPU(s).\n", data[0]); } for (i = 1; i <= data[0]; i++) { gpu = data[i]; printf(" - Enabling Quadro Sync Device %d - GPU %d... ", framelock, gpu); /* Make sure frame lock is disabled */ XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_FRAMELOCK_SYNC, &enabled); if (enabled != NV_CTRL_FRAMELOCK_SYNC_DISABLE) { printf("Frame lock already enabled!\n"); continue; } /* Get the list of displays to enable */ ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_ENABLED_DISPLAYS, (int *)&mask); if (!ret) { printf("Failed to query enabled displays!\n"); continue; } /* Query if any of the enabled displays can be set as a * master on this GPU. */ ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id mask, // display_mask NV_CTRL_FRAMELOCK_MASTERABLE, &masterable); if (!ret) { printf("Failed to query masterable!\n"); continue; } /* Clear the master setting if any */ if (masterable) { XNVCTRLSetTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_FRAMELOCK_MASTER, 0); } /* Clear the slaves setting if any */ XNVCTRLSetTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_FRAMELOCK_SLAVES, 0); printf("\n"); /* Pick the first available/capable display device as master */ if (pick_server && masterable) { /* Just pick the first enabled display */ unsigned int master = (1<<31); while (master && !(master & masterable)) { master >>= 1; } if (master) { mask &= ~master; /* Make sure we're not using the House Sync signal. */ XNVCTRLSetTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_FRAMELOCK, framelock, // target_id 0, // display_mask NV_CTRL_USE_HOUSE_SYNC, NV_CTRL_USE_HOUSE_SYNC_FALSE); /* Set the master */ XNVCTRLSetTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_FRAMELOCK_MASTER, master); printf(" - Set Server Display : 0x%08x\n", master); pick_server = 0; server_set = 1; } } /* Set rest of enabled display devices as clients (slaves) */ if (mask) { XNVCTRLSetTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_FRAMELOCK_SLAVES, mask); printf(" - Set Client Display(s) : 0x%08x\n", mask); } /* Enable frame lock */ XNVCTRLSetTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_FRAMELOCK_SYNC, NV_CTRL_FRAMELOCK_SYNC_ENABLE); XFlush(dpy); printf(" - Frame Lock Sync Enabled.\n"); /* If we just enabled the server, also toggle the test signal * to guarantee accuracy of the universal frame count (as * returned by the glXQueryFrameCountNV() function in the * GLX_NV_swap_group extension). */ if (server_set) { XNVCTRLSetTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_FRAMELOCK_TEST_SIGNAL, NV_CTRL_FRAMELOCK_TEST_SIGNAL_ENABLE); XNVCTRLSetTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_FRAMELOCK_TEST_SIGNAL, NV_CTRL_FRAMELOCK_TEST_SIGNAL_DISABLE); printf(" - Frame Lock Test Signal Toggled.\n"); server_set = 0; } } /* Done enabling GPUs */ XFree(data); } /* Done enabling framelocks */ } static void do_disable(Display *dpy) { Bool ret; int num_framelocks; int framelock; int gpu; int *data; int len; int i; /* Query the number of frame lock devices to disable */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_FRAMELOCK, &num_framelocks); if (!ret) { printf("Failed to query number of frame lock devices!\n"); return; } printf("Found %d frame lock device(s) on server.\n", num_framelocks); if ( !num_framelocks ) { return; } /* Disable frame lock on all GPUs connected to each frame lock device */ for (framelock = 0; framelock < num_framelocks; framelock++) { printf("\n"); printf("- Frame Lock Board %d :\n", framelock); /* Query the GPUs connected to this frame lock device */ ret = XNVCTRLQueryTargetBinaryData (dpy, NV_CTRL_TARGET_TYPE_FRAMELOCK, framelock, // target_id 0, // display_mask NV_CTRL_BINARY_DATA_GPUS_USING_FRAMELOCK, (unsigned char **) &data, &len); if (!ret) { printf(" - Failed to query list of GPUs!\n"); continue; } /* Disable frame lock on all GPUs connected to the frame lock device */ if ( !data[0] ) { printf(" - No GPUs found!\n"); } else { printf(" - Found %d GPU(s).\n", data[0]); } for (i = 1; i <= data[0]; i++) { gpu = data[i]; printf(" - Disabling Quadro Sync Device %d - GPU %d... ", framelock, gpu); XNVCTRLSetTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, gpu, // target_id 0, // display_mask NV_CTRL_FRAMELOCK_SYNC, NV_CTRL_FRAMELOCK_SYNC_DISABLE); XFlush(dpy); printf("Done.\n"); } /* Done disabling GPUs */ XFree(data); } /* Done disabling Frame Lock Devices */ } /* do_disable() */ int main(int argc, char *argv[]) { Display *dpy; Bool ret; int major, minor; /* * Open a display connection, and make sure the NV-CONTROL X * extension is present on the screen we want to use. */ dpy = XOpenDisplay(NULL); if (!dpy) { printf("Cannot open display '%s'.\n", XDisplayName(NULL)); return 1; } /* Query the NV-CONTROL version */ ret = XNVCTRLQueryVersion(dpy, &major, &minor); if (ret != True) { printf("The NV-CONTROL X extension does not exist on '%s'.\n", XDisplayName(NULL)); return 1; } /* Print some information */ printf("Using NV-CONTROL extension %d.%d on %s\n\n", major, minor, XDisplayName(NULL)); if ((major < 1) || (major == 1 && minor < 9)) { printf("The NV-CONTROL X extension is too old. Version 1.9 or above " " is required for configuring Frame Lock via target types.\n"); return 1; } /* Do what the user wants */ if (argc <= 1 || (strcmp(argv[1], "-q") == 0)) { do_query(dpy); } else if (strcmp(argv[1], "-e") == 0) { do_enable(dpy); } else if (strcmp(argv[1], "-d") == 0) { do_disable(dpy); } else { do_help(); } return 0; } nvidia-settings/samples/version.mk0000664000175000017500000000003012236467170017515 0ustar albertoalbertoNVIDIA_VERSION = 331.20 nvidia-settings/samples/nv-control-screen.h0000664000175000017500000000421612236467170021240 0ustar albertoalberto/* * Copyright (c) 2010 NVIDIA Corporation * * 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 (including the next * paragraph) 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. */ /* * nv-control-screen.h - trivial helper for NV-CONTROL sample clients: use * the default screen if it is an NVIDIA X screen. If it isn't, then look * for the first NVIDIA X screen. Abort if no NVIDIA X screens are found. */ #ifndef __NV_CONTROL_SCREEN_H__ #define __NV_CONTROL_SCREEN_H__ #include #include #include #include "NVCtrlLib.h" static inline int GetNvXScreen(Display *dpy) { int defaultScreen, screen; defaultScreen = DefaultScreen(dpy); if (XNVCTRLIsNvScreen(dpy, defaultScreen)) { return defaultScreen; } for (screen = 0; screen < ScreenCount(dpy); screen++) { if (XNVCTRLIsNvScreen(dpy, screen)) { printf("Default X screen %d is not an NVIDIA X screen. " "Using X screen %d instead.\n", defaultScreen, screen); return screen; } } fprintf(stderr, "Unable to find any NVIDIA X screens; aborting.\n"); exit(1); } #endif /* __NV_CONTROL_SCREEN_H__ */ nvidia-settings/samples/nv-control-warpblend.h0000664000175000017500000004150112236467170021735 0ustar albertoalberto/* * Copyright (c) 2013 NVIDIA Corporation * * 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 (including the next * paragraph) 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. */ #include #include #include #include #include #include #include #include "NVCtrl.h" #include "NVCtrlLib.h" /* * The scanout composition pipeline provides infrastructure to: * - Individually transform the output of each display device using a user- * provided warping mesh, with perspective correction. * - Perform per-pixel intensity and black level adjustment from two separate * user-provided textures. This can be configured to apply before (desktop- * space) or after (display-space) warping by setting the BlendOrder token * to BlendAfterWarp or WarpAfterBlend. * * The composition equation is: * Output = Input * blendTexture * (1 − offsetTexture) + offsetTexture * * The above functionality is exposed through binding Pixmaps to names through * the XNVCTRLBindWarpPixmapName NV-CONTROL functionality, and passing these * bound names to the "WarpMesh", "BlendTexture" and "OffsetTexture" attributes * of the desired display in a MetaMode. * * The texture coordinates of the warping mesh indicate where to source from * the desktop in normalized ViewPortIn space, meaning that 0,0 and 1,1 map to * boundaries of the area that would otherwise be displayed if warping was * disabled. Coordinates outside these boundaries are accepted. * * Likewise, the mesh coordinates are in normalized ViewPortOut space, 0,0 and * 1,1 mapping to the boundaries of the visible region on the display device. * * Please also see the XNVCTRLBindWarpPixmapName documentation in NVCtrlLib.h. * * The below three wrappers are immediate interfaces to the same functionality. * These functions will create Pixmaps to encapsulate the data provided to them, * and leave them bound to the names generated from them, causing them to remain * allocated for the lifetime of the server. This makes them ill-suited for use * cases where the warp mesh data has to vary dynamically; accessing the * XNVCTRLBindWarpPixmapName functionality directly is recommended in that case. * * Please make sure the standard random number generator is seeded with a call * to srand() before using them. * * Refer to nv-control-warpblend.c for sample usage cases. * */ /* * XNVCTRLSetScanoutWarping * * xDpy: valid X display connection * screenId: X protocol screen number * nvDpyId: NV-CONTROL display target index; can be enumerated with the * NV_CTRL_BINARY_DATA_DISPLAYS_ENABLED_ON_XSCREEN request. * warpDatatype: NV_CTRL_WARP_DATA_TYPE_MESH_TRIANGLESTRIP_XYUVRQ or * NV_CTRL_WARP_DATA_TYPE_MESH_TRIANGLES_XYUVRQ. * vertexCount: number of vertices in the passed data; must be a multiple of 3 * if warpDataType is NV_CTRL_WARP_DATA_TYPE_MESH_TRIANGLES_XYUVRQ. * warpData: array of floating-point values representing the warping mesh, * with six components per vertice: * - X, Y: position in normalized ViewPortOut space. * - U, V: texture coordinate in normalized ViewPortIn space. * - R: unused. * - Q: perspective component for the position. * If warpData is NULL, the WarpMesh attribute will be removed for * the designated display device. */ static inline int XNVCTRLSetScanoutWarping( Display *xDpy, int screenId, int nvDpyId, int warpDataType, int vertexCount, const float *warpData); /* * XNVCTRLSetScanout[Intensity/Offset] * * xDpy: valid X display connection * screenId: X protocol screen number * nvDpyId: NV-CONTROL display target index; can be enumerated with the * NV_CTRL_BINARY_DATA_DISPLAYS_ENABLED_ON_XSCREEN request. * pixmap: XID naming a valid Pixmap to be used as Intensity/Offset data. * The pixmap does not have any size restrictions and will be scaled * to fit the ViewPortIn of the target display with filtering. * If the pixmap has a depth of 8, it will be treated as a single * color component replicated across all channels. * blendAfterWarp: if True, sets BlendOrder to BlendAfterWarp to apply the * composition in display-space; otherwise, it is applied in * desktop-space before any warping. */ static inline int XNVCTRLSetScanoutIntensity( Display *xDpy, int screenId, int nvDpyId, Pixmap intensityPixmap, Bool blendAfterWarp); static inline int XNVCTRLSetScanoutOffset( Display *xDpy, int screenId, int nvDpyId, Pixmap offsetPixmap, Bool blendAfterWarp); static inline int RemoveAttributeFromDisplayOfCurrentMetaMode( Display *xDpy, int screenId, int nvDpyId, const char *attribute) { char *pOldCurrentMetaMode = NULL; char *pCurrentMetaMode = NULL; char displayName[512]; char *pDisplay; char *pNextDisplay; char *pAttributeList; char *pTargetAttribute; char *newMetaMode = NULL; int error = 1; int attributeLen; if (!attribute) { goto cleanup; } attributeLen = strlen(attribute); XNVCTRLQueryStringAttribute(xDpy, screenId, 0, // displayMask NV_CTRL_STRING_CURRENT_METAMODE_VERSION_2, &pOldCurrentMetaMode); // Discard the metadata from the beginning of the MetaMode. pCurrentMetaMode = strstr(pOldCurrentMetaMode, "::"); pCurrentMetaMode += 2; // Keep a settable copy of this, to which we'll mirror the changes we want. newMetaMode = strdup(pCurrentMetaMode); if (!newMetaMode) { goto cleanup; } sprintf(displayName, "DPY-%i", nvDpyId); pDisplay = strstr(pCurrentMetaMode, displayName); if (!pDisplay) { // Requested Dpy not found in this MetaMode. goto cleanup; } // If there's another DPY after the one we want, finish the string there to // limit the scope of our search. pNextDisplay = strstr(pDisplay + 1, "DPY-"); if (pNextDisplay) { *pNextDisplay = '\0'; } // If it has an attribute list, start looking from there; if not, fail. if (!(pAttributeList = strstr(pDisplay, "{"))) { goto cleanup; } pTargetAttribute = strstr(pAttributeList, attribute); if (!pTargetAttribute) { goto cleanup; } // Found it; use the offset we found against our good copy of the mode to // mangle the attribute name. while (attributeLen--) { newMetaMode[pTargetAttribute - pCurrentMetaMode + attributeLen] = 'z'; } XNVCTRLSetStringAttribute(xDpy, screenId, 0, // displayMask NV_CTRL_STRING_CURRENT_METAMODE_VERSION_2, newMetaMode); XSync(xDpy, 0); error = 0; cleanup: if (newMetaMode) { free(newMetaMode); } if (pOldCurrentMetaMode) { free(pOldCurrentMetaMode); } return error; } // Given a comma-separated, list of A=B tokens this helper appends them to the // to the attribute list of the currently-set MetaMode. static inline int AddAttributesToDisplayOfCurrentMetaMode( Display *xDpy, int screenId, int nvDpyId, const char *attributes) { char *pOldCurrentMetaMode = NULL; char *pCurrentMetaMode = NULL; char displayName[512]; char *pDisplay; char *newMetaMode = NULL; int error = 1; XNVCTRLQueryStringAttribute(xDpy, screenId, 0, // displayMask NV_CTRL_STRING_CURRENT_METAMODE_VERSION_2, &pOldCurrentMetaMode); // Discard the metadata from the beginning of the MetaMode. pCurrentMetaMode = strstr(pOldCurrentMetaMode, "::"); pCurrentMetaMode += 2; sprintf(displayName, "DPY-%i", nvDpyId); pDisplay = strstr(pCurrentMetaMode, displayName); if (pDisplay) { int foundBeginAttr = 0; char newAttribute[256]; int endOfString = 1; int neededLength; while (*(++pDisplay)) { if (*pDisplay == '{') { foundBeginAttr = 1; } if (*pDisplay == '}') { endOfString = 0; break; } if (*pDisplay == ',' && !foundBeginAttr) { endOfString = 0; break; } } if (!endOfString) { *pDisplay = 0; pDisplay++; } if (endOfString) { // no attributes, no mode after sprintf(newAttribute, " {%s}", attributes); } if (foundBeginAttr) { // pDisplay had to be at the }, append an attribute and add the } back sprintf(newAttribute, ", %s}", attributes); } else { // No attributes for this Dpy, we need to add them and restore the , sprintf(newAttribute, " {%s},", attributes); } neededLength = strlen(pCurrentMetaMode) + strlen(newAttribute) + strlen(pDisplay); // Add potential null-terminators for each of the three components. newMetaMode = malloc(neededLength + 3); if (!newMetaMode) { goto cleanup; } // Put it back together with the new stuff in the middle sprintf(newMetaMode, "%s%s%s", pCurrentMetaMode, newAttribute, pDisplay); } else { // Requested Dpy not found in this MetaMode. goto cleanup; } XNVCTRLSetStringAttribute(xDpy, screenId, 0, // displayMask NV_CTRL_STRING_CURRENT_METAMODE_VERSION_2, newMetaMode); XSync(xDpy, 0); error = 0; cleanup: if (newMetaMode) { free(newMetaMode); } if (pOldCurrentMetaMode) { free(pOldCurrentMetaMode); } return error; } // This creates a copy of a given target Pixmap. static inline Pixmap ClonePixmap( Display *xDpy, int screenId, Pixmap targetPixmap) { Pixmap newPixmap = None; GC gc; unsigned int width, height, depth; // unneeded stuff below Window parent; int x, y; unsigned int borderWidth; XGetGeometry(xDpy, targetPixmap, &parent, &x, &y, &width, &height, &borderWidth, &depth); newPixmap = XCreatePixmap(xDpy, RootWindow(xDpy, screenId), width, height, depth); if (newPixmap == None) { return None; } gc = XCreateGC(xDpy, newPixmap, 0, NULL); XCopyArea(xDpy, targetPixmap, newPixmap, gc, 0, 0, width, height, 0, 0); XFreeGC(xDpy, gc); return newPixmap; } static inline int SetPixmapDataToAttribute( Display *xDpy, int screenId, int nvDpyId, Pixmap pixmap, Bool blendAfterWarp, const char* attributeName) { Bool ret = False; char tempName[256]; char newAttributes[256]; // Disable the attribute on that DPY if (pixmap == None) { return RemoveAttributeFromDisplayOfCurrentMetaMode(xDpy, screenId, nvDpyId, attributeName); } // Get our own copy of the immediate contents of this pixmap. pixmap = ClonePixmap(xDpy, screenId, pixmap); if (pixmap == None) { return 1; } // Generate a throwaway random name to bind it to. sprintf(tempName, "%d", rand()); if (blendAfterWarp) { sprintf(newAttributes, "%s=%s, BlendOrder=BlendAfterWarp", attributeName, tempName); } else { sprintf(newAttributes, "%s=%s, BlendOrder=WarpAfterBlend", attributeName, tempName); } ret = XNVCTRLBindWarpPixmapName(xDpy, screenId, pixmap, tempName, NV_CTRL_WARP_DATA_TYPE_BLEND_OR_OFFSET_TEXTURE, 0); // vertexCount, unneeded for blend/off. // Removes the ClonePixmap() reference, but the name above still holds one. XFreePixmap(xDpy, pixmap); if (!ret) { return 1; } if (AddAttributesToDisplayOfCurrentMetaMode(xDpy, screenId, nvDpyId, newAttributes)) { return 1; } XSync(xDpy, 0); return 0; } static inline int XNVCTRLSetScanoutWarping( Display *xDpy, int screenId, int nvDpyId, int warpDataType, int vertexCount, const float *warpData) { Pixmap pTempPix = 0; int neededSize; int rowSize; int neededRows; Bool ret = False; XImage *pTempImage = NULL; GC pGC = NULL; char *paddedBuffer = NULL; int error = 1; char tempName[256]; char newAttributes[256]; // Disable warping on that DPY if (warpData == NULL) { return RemoveAttributeFromDisplayOfCurrentMetaMode(xDpy, screenId, nvDpyId, "WarpMesh"); } // Generate a throwaway random name to bind the data we're going to upload. sprintf(tempName, "%d", rand()); if (!xDpy || !vertexCount || !warpData) { goto cleanup; } // Let's use a 1024-wide Pixmap always; figure out how many rows we need. neededSize = vertexCount * sizeof(float) * 6; rowSize = 1024 * 4; neededRows = (neededSize + (rowSize - 1)) / rowSize; // The spec mandates depth 32 for this type of data. pTempPix = XCreatePixmap(xDpy, RootWindow(xDpy, screenId), 1024, neededRows, 32); ret = XNVCTRLBindWarpPixmapName(xDpy, screenId, pTempPix, tempName, warpDataType, vertexCount); if (!ret) { goto cleanup; } paddedBuffer = malloc(1024 * neededRows * 4); if (!paddedBuffer) { goto cleanup; } memcpy(paddedBuffer, warpData, neededSize); pTempImage = XCreateImage(xDpy, DefaultVisual(xDpy, screenId), 32, ZPixmap, 0, paddedBuffer, 1024, neededRows, 32, 0); if (!pTempImage) { goto cleanup; } pGC = XCreateGC(xDpy, pTempPix, 0, NULL); XPutImage(xDpy, pTempPix, pGC, pTempImage, 0, 0, 0, 0, 1024, neededRows); // Data is now uploaded to named pixmap; set a mode with it sprintf(newAttributes, "WarpMesh=%s", tempName); if (AddAttributesToDisplayOfCurrentMetaMode(xDpy, screenId, nvDpyId, newAttributes)) { goto cleanup; } error = 0; cleanup: if (pGC) { XFreeGC(xDpy, pGC); } if (pTempImage) { XDestroyImage(pTempImage); paddedBuffer = NULL; } if (paddedBuffer) { free(paddedBuffer); } // The bound name still holds a reference to the Pixmap. if (pTempPix) { XFreePixmap(xDpy, pTempPix); } XSync(xDpy, 0); return error; } static inline int XNVCTRLSetScanoutIntensity( Display *xDpy, int screenId, int nvDpyId, Pixmap intensityPixmap, Bool blendAfterWarp) { return SetPixmapDataToAttribute(xDpy, screenId, nvDpyId, intensityPixmap, blendAfterWarp, "BlendTexture"); } static inline int XNVCTRLSetScanoutOffset( Display *xDpy, int screenId, int nvDpyId, Pixmap offsetPixmap, Bool blendAfterWarp) { return SetPixmapDataToAttribute(xDpy, screenId, nvDpyId, offsetPixmap, blendAfterWarp, "OffsetTexture"); } nvidia-settings/samples/Makefile0000664000175000017500000000723112236467170017151 0ustar albertoalberto# # NV-CONTROL samples: Sample tools for configuring the NVIDIA X driver on Unix # and Linux systems. # # Copyright (c) 2010 NVIDIA, Corporation # # 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 (including the next # paragraph) 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. # ############################################################################## # include common variables and functions ############################################################################## UTILS_MK_DIR ?= .. include $(UTILS_MK_DIR)/utils.mk ############################################################################## # The calling Makefile may export any of the following variables; we # assign default values if they are not exported by the caller ############################################################################## ifndef X_LDFLAGS ifeq ($(TARGET_OS)-$(TARGET_ARCH),Linux-x86_64) X_LDFLAGS = -L/usr/X11R6/lib64 else X_LDFLAGS = -L/usr/X11R6/lib endif endif X_CFLAGS ?= LIBXNVCTRL_DIR ?= ../src/libXNVCtrl CFLAGS += $(X_CFLAGS) CFLAGS += -I $(LIBXNVCTRL_DIR) LDFLAGS += $(X_LDFLAGS) LDFLAGS += -L $(LIBXNVCTRL_DIR) LIBS += -lXNVCtrl -lXext -lX11 ############################################################################## # samples ############################################################################## SAMPLE_SOURCES += nv-control-info.c SAMPLE_SOURCES += nv-control-dvc.c SAMPLE_SOURCES += nv-control-events.c SAMPLE_SOURCES += nv-control-dpy.c SAMPLE_SOURCES += nv-control-targets.c SAMPLE_SOURCES += nv-control-framelock.c SAMPLE_SOURCES += nv-control-gvi.c SAMPLE_SOURCES += nv-control-3dvisionpro.c SAMPLE_SOURCES += nv-control-warpblend.c ############################################################################## # build rules ############################################################################## .PHONY: all clean clobber install # define the rule to build each object file $(foreach src, $(SAMPLE_SOURCES), $(eval $(call DEFINE_OBJECT_RULE,TARGET,$(src)))) # define the rule to link each sample app from its corresponding object file define link_sample_from_object $$(OUTPUTDIR)/$(1:.c=): $$(call BUILD_OBJECT_LIST,$(1)) $$(call quiet_cmd,LINK) $$(CFLAGS) $$(LDFLAGS) $$(BIN_LDFLAGS) -o $$@ $$< $$(LIBS) all:: $$(OUTPUTDIR)/$(1:.c=) SAMPLES += $$(OUTPUTDIR)/$(1:.c=) endef $(foreach sample,$(SAMPLE_SOURCES),$(eval $(call link_sample_from_object,$(sample)))) clean clobber: rm -rf *~ $(OUTPUTDIR)/*.o $(OUTPUTDIR)/*.d $(SAMPLES) install: @# don't install samples, this is just to satisfy the top-level @# recursion rule nvidia-settings/samples/README0000664000175000017500000000331212236467170016365 0ustar albertoalbertoNV-CONTROL X Extension Samples The `nvidia-settings` application is fairly involved, and is not the easiest source code to read through for someone interested in learning how to use the NV-CONTROL X extension. The applications in this directory are trivial examples demonstrating how to use the NV-CONTROL X extension. For more thorough documentation on the extension, please see the NV-CONTROL-API.txt document (located in the doc/ directory of the nvidia-settings source package). Sample applications: nv-control-info: Demonstrates how to query for extension presence and basic information. nv-control-dvc: Demonstrates how to query and assign an integer attribute (NV_CTRL_DIGITAL_VIBRANCE); also shows how to handle multiple display devices. nv-control-events: Demonstrates how to register to receive and interpret NV-CONTROL events. nv-control-dpy: Demonstrates how to configure display devices using the NV-CONTROL X extension. nv-control-targets: Demonstrates how to query various attributes from varying target types (GPUs, X Screens, Frame Lock Boards) using the XNVCTRL target functions. nv-control-framelock: Demonstrates how to query frame lock related attributes. Also demonstrates how to enable/ disable frame lock. nv-control-gvi: Demonstrates how to interact with the Graphics-to- Video-In (GVI) capabilities of a GVI target via NV-CONTROL. nvidia-settings/samples/nv-control-warpblend.c0000664000175000017500000001303312236467170021727 0ustar albertoalberto/* * Copyright (c) 2013 NVIDIA Corporation * * 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 (including the next * paragraph) 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. */ #include "nv-control-warpblend.h" typedef struct __attribute__((packed)) { float x, y; } vertex2f; typedef struct __attribute__((packed)) { vertex2f pos; vertex2f tex; vertex2f tex2; } vertexDataRec; static inline float transformPoint(vertex2f *vec) { float w, oneOverW; float x_in, y_in; // Sample projection matrix generated from a trapezoid projection static const float mat[3][3] = { { 0.153978257544863,-0.097906833257365,0.19921875 }, { -0.227317623368679,0.222788944798964,0.25 }, { -0.585236541598693,-0.135471643796181,1 } }; x_in = vec->x; y_in = vec->y; vec->x = x_in * mat[0][0] + y_in * mat[0][1] + mat[0][2]; vec->y = x_in * mat[1][0] + y_in * mat[1][1] + mat[1][2]; w = x_in * mat[2][0] + y_in * mat[2][1] + mat[2][2]; oneOverW = 1.0 / w; vec->x *= oneOverW; vec->y *= oneOverW; return oneOverW; } int main(int ac, char **av) { Display *xDpy = XOpenDisplay(NULL); int screenId; GC gc; XGCValues values; Pixmap blendPixmap; vertexDataRec warpData[6]; int nvDpyId; if (!xDpy) { fprintf (stderr, "Could not open X Display %s!\n", XDisplayName(NULL)); return 1; } screenId = XDefaultScreen(xDpy); if (ac != 2) { fprintf (stderr, "Usage: ./nv-control-warpblend nvDpyId\n"); fprintf (stderr, "See 'nvidia-settings -q CurrentMetaMode' for currently connected DPYs.\n"); return 1; } nvDpyId = atoi(av[1]); // Start with two screen-aligned triangles, and warp them using the sample // keystone matrix in transformPoint. Make sure we save W for correct // perspective and pass it through as the last texture coordinate component. warpData[0].pos.x = 0.0f; warpData[0].pos.y = 0.0f; warpData[0].tex.x = 0.0f; warpData[0].tex.y = 0.0f; warpData[0].tex2.x = 0.0f; warpData[0].tex2.y = transformPoint(&warpData[0].pos); warpData[1].pos.x = 1.0f; warpData[1].pos.y = 0.0f; warpData[1].tex.x = 1.0f; warpData[1].tex.y = 0.0f; warpData[1].tex2.x = 0.0f; warpData[1].tex2.y = transformPoint(&warpData[1].pos); warpData[2].pos.x = 0.0f; warpData[2].pos.y = 1.0f; warpData[2].tex.x = 0.0f; warpData[2].tex.y = 1.0f; warpData[2].tex2.x = 0.0f; warpData[2].tex2.y = transformPoint(&warpData[2].pos); warpData[3].pos.x = 1.0f; warpData[3].pos.y = 0.0f; warpData[3].tex.x = 1.0f; warpData[3].tex.y = 0.0f; warpData[3].tex2.x = 0.0f; warpData[3].tex2.y = transformPoint(&warpData[3].pos); warpData[4].pos.x = 1.0f; warpData[4].pos.y = 1.0f; warpData[4].tex.x = 1.0f; warpData[4].tex.y = 1.0f; warpData[4].tex2.x = 0.0f; warpData[4].tex2.y = transformPoint(&warpData[4].pos); warpData[5].pos.x = 0.0f; warpData[5].pos.y = 1.0f; warpData[5].tex.x = 0.0f; warpData[5].tex.y = 1.0f; warpData[5].tex2.x = 0.0f; warpData[5].tex2.y = transformPoint(&warpData[5].pos); // Prime the random number generator, since the helper functions need it. srand(time(NULL)); // Apply our transformed warp data to the chosen display. XNVCTRLSetScanoutWarping(xDpy, screenId, nvDpyId, NV_CTRL_WARP_DATA_TYPE_MESH_TRIANGLES_XYUVRQ, 6, // 6 vertices for two triangles (float *)warpData); // Create a sample blending pixmap; let's make it solid white with a grey // border and rely on upscaling with filtering to feather the edges. // Start with a 32x32 pixmap. blendPixmap = XCreatePixmap(xDpy, RootWindow(xDpy, screenId), 32, 32, DefaultDepth(xDpy, screenId)); values.foreground = 0x77777777; gc = XCreateGC(xDpy, blendPixmap, GCForeground, &values); // Fill it fully with grey. XFillRectangle(xDpy, blendPixmap, gc, 0, 0, 32, 32); values.foreground = 0xffffffff; XChangeGC(xDpy, gc, GCForeground, &values); // Fill everything but a one-pixel border with white. XFillRectangle(xDpy, blendPixmap, gc, 1, 1, 30, 30); // Apply it to the display. blendAfterWarp is FALSE, so the edges will be // blended in warped space. XNVCTRLSetScanoutIntensity(xDpy, screenId, nvDpyId, blendPixmap, False); return 0; }