From 6790de5239449d30e514ede900fdb9895b04216a Mon Sep 17 00:00:00 2001 From: server Date: Mon, 20 Jan 2025 17:12:00 -0500 Subject: [PATCH] Mon Jan 20 05:12:00 PM EST 2025 --- Makefile | 8 +- README.md | 76 ++-- bin/QAnsel | Bin 143768 -> 148600 bytes bin/qansel-source-base.zip | Bin 34491 -> 37407 bytes bin/qansel-source-web.zip | Bin 11386700 -> 11386694 bytes build.sh | 2 + obj/bytecode.o | Bin 0 -> 61360 bytes obj/complex.o | Bin 0 -> 53600 bytes obj/context.o | Bin 0 -> 10488 bytes obj/display.o | Bin 0 -> 12304 bytes obj/hardware.o | Bin 0 -> 3480 bytes obj/kernel_cpu.o | Bin 0 -> 3488 bytes obj/main.o | Bin 0 -> 14048 bytes obj/openqasm.o | Bin 0 -> 46832 bytes src/.kernel.tmp.1 | 144 +++++++ src/.kernel.tmp.2 | Bin 0 -> 5187 bytes src/Makefile | 13 + src/build.sh | 43 +++ src/bytecode.c | 14 +- src/context.c | 12 +- src/examples/bb84.txt | 26 ++ src/examples/bellstate.txt | 5 + src/examples/belltest_c.txt | 56 +++ src/examples/belltest_q.txt | 67 ++++ src/examples/bombtester.txt | 59 +++ src/examples/decoherence.sh | 46 +++ src/examples/decoherence.txt | 12 + src/examples/encryption.txt | 33 ++ src/examples/halfadder.txt | 40 ++ src/examples/randombyte.txt | 11 + src/examples/reordering.txt | 13 + src/examples/send.sh | 28 ++ src/examples/slow.txt | 31 ++ src/examples/slower.txt | 34 ++ src/examples/slowest.txt | 24 ++ src/examples/swaptest.txt | 9 + src/examples/teleportation.txt | 31 ++ src/hardware.c | 5 +- src/hardware.h | 3 + src/kernel.cl.c | 405 ++++++++++++++++++++ src/kernel_cpu.c | 18 +- src/kernel_cpu.cl | 148 ++++++++ src/kernel_gpu.c | 673 +++++++++++++++++---------------- src/kernel_gpu.cl | 436 +++++++++++++++++++++ 44 files changed, 2144 insertions(+), 381 deletions(-) create mode 100644 obj/bytecode.o create mode 100644 obj/complex.o create mode 100644 obj/context.o create mode 100644 obj/display.o create mode 100644 obj/hardware.o create mode 100644 obj/kernel_cpu.o create mode 100644 obj/main.o create mode 100644 obj/openqasm.o create mode 100644 src/.kernel.tmp.1 create mode 100644 src/.kernel.tmp.2 create mode 100644 src/Makefile create mode 100644 src/build.sh create mode 100644 src/examples/bb84.txt create mode 100644 src/examples/bellstate.txt create mode 100644 src/examples/belltest_c.txt create mode 100644 src/examples/belltest_q.txt create mode 100644 src/examples/bombtester.txt create mode 100644 src/examples/decoherence.sh create mode 100644 src/examples/decoherence.txt create mode 100644 src/examples/encryption.txt create mode 100644 src/examples/halfadder.txt create mode 100644 src/examples/randombyte.txt create mode 100644 src/examples/reordering.txt create mode 100644 src/examples/send.sh create mode 100644 src/examples/slow.txt create mode 100644 src/examples/slower.txt create mode 100644 src/examples/slowest.txt create mode 100644 src/examples/swaptest.txt create mode 100644 src/examples/teleportation.txt create mode 100644 src/kernel.cl.c create mode 100644 src/kernel_cpu.cl create mode 100644 src/kernel_gpu.cl diff --git a/Makefile b/Makefile index 64a1ec0..82dfe97 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,14 @@ all: - bash build.sh + @bash build.sh simple: - bash build.sh simple + @bash build.sh simple source: - bash build.sh src + @bash build.sh src web: - bash build.sh www + @bash build.sh www requirements: sudo apt install libsdl2-dev diff --git a/README.md b/README.md index 365875b..2b3e1b2 100644 --- a/README.md +++ b/README.md @@ -10,18 +10,18 @@ Please click the `tree` link at the top and navigate to the code for the simulator. ``` -qansel-source-base.zip + qansel-source-base.zip ``` To compile it, navigate to the folder it installed within and run the following commands within that folder. ```sh -mkdir qansel -mv *qansel-source-base.zip qansel -cd qansel -unzip *qansel-source-base.zip -make + mkdir qansel + mv *qansel-source-base.zip qansel + cd qansel + unzip *qansel-source-base.zip + make ``` If you are compiling for a device which cannot support @@ -43,19 +43,19 @@ as standard input and the simulation results will be displayed as standard output. Below is an example using a here document. ```sh -$ ./QAnsel < qreg q[2]; -> creg c[2]; -> h q[0]; -> cx q[0], q[1]; -> measure q[0] -> c[0]; -> measure q[1] -> c[1]; -> sample c; -> EOF -00: 50.7% -01: 0.0% -10: 0.0% -11: 49.3% + $ ./QAnsel << EOF + > qreg q[2]; + > creg c[2]; + > h q[0]; + > cx q[0], q[1]; + > measure q[0] -> c[0]; + > measure q[1] -> c[1]; + > sample c; + > EOF + 00: 50.7% + 01: 0.0% + 10: 0.0% + 11: 49.3% ``` Please use the `-?` flag to see a help document. @@ -92,7 +92,7 @@ that can be found by clicking the `tree` button and navigating to the `bin` folder and downloading the following file. ``` -qansel-source-www.zip + qansel-source-web.zip ``` This web front end expects to connect to an API. The API @@ -104,12 +104,12 @@ added to the APIService schema. Below is an example of how this entry may look. ```sql -MariaDB [APIService]> select * from ServiceInfo; -+----+---------+---------------------------------+-------------+ -| id | service | path | parameters | -+----+---------+---------------------------------+-------------+ -| 1 | qansel | /home/server2/QAnsel/bin/QAnsel | -q14 -o5 -r | -+----+---------+---------------------------------+-------------+ + MariaDB [APIService]> select * from ServiceInfo; + +----+---------+---------------------------------+-------------+ + | id | service | path | parameters | + +----+---------+---------------------------------+-------------+ + | 1 | qansel | /fakepath/QAnsel | -q14 -o5 -r | + +----+---------+---------------------------------+-------------+ ``` The `-qX` parameter is useful here as it allows one to cap @@ -118,3 +118,27 @@ hardware running the simulator is not sufficient to handle large qubit counts. In this case, it is capped at 14 to make sure that programs that exceed the limitations of the GPU are rejected. +The web interface expects an API key. The API key is formed in three +parts `A:B:C` where `A` is the `APIService.AuthInfo.username`, `B` is +the `APIService.AuthInfo.authkey`, and `C` is the URL which it needs +to ping. It is important that the address does not contain `http://` +or `https://`. For example, if the address is `http://example.com/api`, +then `C` should simply be written as `example.com/api`. + +Once `A:B:C` is filled out, the entire thing needs to be converted to +a base64 string. This can be done in JavaScript in the developer console +in the web browser using the `btoa()` function. This final encoded string +functions as the API key for the web interface. Any equal signs at the +end of the API key should be removed. + +The web interface allows for appending the URL with `?apikey=` followed by +an API key to auto fill the API key. This can be useful if the service is +linked from another source (such as another website or an email) and will +prevent the user from having to input the APIkey themselves. + +## Android + +The Android app version of this project merely is enclose a web view +containing the web interface. This means it requires pinging a server +running the API for it to work. It must be compiled using Android Studio. + diff --git a/bin/QAnsel b/bin/QAnsel index f6ac158f043c105a25dd0835276ddb033820d61d..6c3dc2a62b841078e63f169af39b4ea49b94ab7f 100755 GIT binary patch literal 148600 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 delta 37800 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 delta 22166 zcmZs?b8u!syY?H~wl(p@wllG9+s+d^nIumpwr$(CZQGgn%--Lw^Pbw@`J?Z(s%uqO zS65%XuDbho=M;i<#DW17Wx*jZKtMoXKos&=wX=UvGa-S4fE+;mR}TS*v742xDWi*} znkp;^cxZmCMfAVs<_Ql13UT`Hv;PiFs&)>GTqs`z-%(bYWdV%R!ql!X&BkYpU}cS6 z%_O8q;#xk5sXX!#KzHnMKu_J)Rq;g7-+t;1)|pOzKz5oB@0jlSU{cH&fq)2?H%32> z$ih8}KwY)iRFJMU=yx4SMD@6K-ZX6pmsf_KAtR=@9HK|kgFY>4#=ZL4A+kyL561|b zzqI%f`Trx3ZX3e8jzx}@R?~0>rfOOk?bJl=-g679ng*Q%|TJ?z%_~vDPt($`Je-T zdn>+R$gU8UrW25n(kSi%$@518hmFF}AVE8Ki{z46+{e7SJtFRc4}i#L6CMsoC1+!Y zmy>rrR5|duGbB5NKPjFl5$=Fzj~Lm4;cItvfMtB!vgT*B4awTGq=bx)`iGUuUL?la zrBdVRV_DPXSVWwWILir~A$fJ2)@KNb6g2l9Ou3w8ZHAtk{x6W^`(kR3>V3Thv#i6x zs)SIgb+5E0PEwWn@4u1OpUp-FT<-=W#}}(B*G%NF?>e1->A!-yhPH`(0nHtljaSqh z0D-`D3IcO<9{=lK2pTqj?JBkpDDUA(cK36r&wxF+ga^#JTH79S&`M9eZMUgS_|RdN z>BaiMVx4_FEp|BQ&%}yK<^yJyEFA21z+2L~0`6vU;Hlhv21i1Ag}$LP2fy#-epY6W zK$hI;zP`Gz3%@`bAtAx~i2KCC+U4m7z}4CHnw4@pe_5WLZ(9LEpQ>HsTta(Ba3?_> zTjVR^XFCrf@t9?KmS|nYS@Nq9!k3_jUbn&NOUmvNM zoJMmh?2e>8_1gL>^I0j0Z&USS@$4q1jN5Vb^f%~#RHc)}s{QMBEluU0#(e)VR<>sUR0RM5N6L(~K>gSLm#pl@+Ykeo5rpRO6!suYfX-!Ba!C5 zUV=wKWf9bwd1SXML2y<`AFuu%hj-Y#8Oedjlr$(8aa?gvx{NSWIXB>nDROBi`%Ss_ zA^vApkg3R8q$d6tL;z3_5Fs!S5Tt)%cX2jhvNUow^)PZaWBfmo_m1c`2c-Ysb5oR+ z9S}n4KGC4RDmoJumleh!wagWVZEV8mM6hvRK-ijYerJaJyt6k*EYv@~<+mt~hJ@8( z4p3t8)1p|wkN{EQG?c1Gl+*(h>Uxo`6}XA)ov6Jo4hG#sU|!;ode`Duc(nZ7xWb!t zL|LiCOq~70?^#sdAx!$}5YVa>(!O>D3%)$Xp9J;bta8L54(W8MW^DxmkYku_e zShj%cL1$(xFSPTq@ths*&CgvZ_~4_);6Dp(lf$ZQZ>a_u1qT8G9tZ-0@;~crW9Dpc zW@}&paCBod`R~*9JSW!TzuN!W21j}u_5_>=elr@A(1%7{EqD2+DH!5LHCJqws2FV^ zkWpVgS$mh02{cjIQ?_;|;(Ci67}A8w7}7rsy0`s4J+Hg{-tO-PN=Cx3Ki;=au78ir z)V$D|LmFmHLeY!A5ZUIaaRn!+ess0 z_@7c|2+FgYocRJ2b_hwAZ>#Z8aW@aI4id3Id!b~f;?K%FzyP!TO#UKxQU0cW8Ma7Y z!(!oG;-*B|3unP%fYX7stTH%UOa+6qocDcYGX;CDVUmu{l@;GL+H}M`l6k&EmihGE z_wQxNdf;M*(oG1pAhfUld~2`p{e??EXbv&+^?tw%a*`O~>T*EggG+B4v?&?%!Dh)T zYo4oIHdPi1AX|v8fEcg4$%mQr?49$50n7FP5x|SK+_N1DopKgb%Jy;hk_zUAhzmkK2#L%G z%Pnmp0fWkosBkj+WIC{zc86-FoojQ$ALuLfPEhl}7*5`G%d2u_oH-~92w>KzrHgX; zEq1-(x*zK%+$h_d^dN(F^ol~U4}LZWm$TJN)86tKJnbV%c%JvruY8-_+_?;Vdam;k zJ%2PwA>m#Hvi11+vVebsVm(8`U-wm1ZUy-O9G?#Bx`}&Ee_T@Y^4E~XIX2_A{SXV+ z!Fs>mYfSn;Vo&)S1hJ*vNFV!b8*#jI*9htaUNXo^zQ#Cnukf5Xpw`Ks|Zzw&L_j^M*i&z;?=-;`AQipEq1RDevXJ>p?>xz7KSqLSBUkfC z@3zIyg(5hn1pbhAy)YYUGS6kcm|7yR+KC~p(I1XYSnFOrDQ|fdb1GyLd5*U-O|0hJ zttC$88&-DgO{+v%LY;~6vpmUt0>OeFP(gUDO%mI3v>J&$YW)%~iR8*)sL{*+L0C1p z+!T=X@#M1zrCrtqBPk_{J|2i)$+S)Jeu}#kXD%q%8U@ zIQ#E`&!RP)4LYczvxV_&*s&dp+he)Xf4+1r^e;B8{EPj3(%MdL45~Il0Jkm+)Fs+a z+CTy54}lge|N4sRN`{5&#Dq0Heu>J(rz~EJA|^1hWf_Y>HU+bmzHXv6R#(|`ww!)NElC&ESPaJR=m0ko<|Fx6b+Q_Nqfj}UxNdLp+u)9;3wbXso|%gKK%#RZS5 zG*!q?@KrXp*cytj3TSGXi8@5o4gcn63sdnLLepA?InyIuV3ai0ojAs!Z{iJ44%HpA zkM3v_ouKrtEVdMLRXdnav-fNo+b(iD6FX@}E%mC=Z-X7BAw{o32RM>0$?^Nt((>k$ ztQ&ywEzx}?s&!Wqr5h^*w}ls9do@d^RBPjU7QVE9LOs3_Pq3nWse_Q##_*PQn4N?Vw>aIPt$# zHDJ5UbU62SY@A-oME7ZU3AX!m_3KtPZ93o|KPtCxcBvhV1%$<^u^^LiHka4(=U83L z|7l(0rXNu*Xco)hA6Xck+U`RnYly`UD@n)*&d8`fSL53R$(FE>6Si*;d(eYr$EbVm z4Od@^tI8UIR>@jWS-K8E#~VDT#=p@;a|eUlnd4OLC|WS58bekosJ0P_HI?FVfGD|Q zsPkD1ZBII?2DFBxT*^USJwLPQB$W4}-@FVj{3$LO#@|lX8=sRtDz`paZ6Eco(*0fH z&R|OVr&F9(2fH60d_jaK_PmjAc- zD(dA;&+IFM-z)X)w5(dYqpRX?KmI23(I<-Jn;S!xl^cniMey?HfX9sxv`UxVhq;p^TNVERc&cn%Nlnc?T9cn?YpQD`w{+GU)>Bx6bn|AIRnJ2ESo^{J z=A!)8OeOi(cmk<#S=QEIX@CMcuWlcIf6tOq04}Wh$}_&@V(nS8Fm$#THNhYYhMDHr zwH@&cW_oJHR}lH0DlTDIC@Jmp?ylSUBHPzM`scd~!h8eYB*MRa6&lBaI3Ioy987ez zn)yC}|0J54a&3UDc@)?>$MZ0=Tz`8&Ik5Zm`VQVIyU7B9>&IHDo9;Y)^YEs;wd<^3 z0DLv?HnD#xJ6A$(EahwDFFxa8Dr>I>4S2(%bz+MY;MOzVnq<U-mNN@_op`rw=Y;39EBn&L7`OHj94<8p-s;Uc_p;4l zk61i*N$svRPl>N+SxoTOosBunu_K*2M`7BJv4-)CC{%>j?EIFa2s=DIC#$Ao2SLZVp ztrGid0$Kh7(3>zzaG8Ixu}GzRs>4kH-e1c>^PQdO*&g1ivuc3nL7GquJ%Cz+@28(j z6jiQ)S!8SO+P}!W^KF?m#O$!$|obFQG>W`krXgIGwl=o>XOMmCnlu{sl z$_Yh!WOCP?iZVZKu1aKgP8E9~b9NBF*Id899;BJK*OjzWlgwhG#HpP;?O0t&CEKOHQ~Dqe0iP){JSUkLM?e@gic((hni~r3339 z*>fs}&G0m0ceMh8OBC!x$GYR93<*mVj0kqsn2BWYbH7Uab`rK2OltP(g;DQ@YsN($51+(?r&KX+!`6&^DUyZ*uZ9>-6XYg1oB`T<%HcbrcOe?Xh=M&>5MDaf7LC!j`vU=CF@)mCol_pE|bw zjZ@J;kW2zWRE&M%)Y8OhhAHYb*r9czq+|Ops^2ohYKebmsf#V(IVyl`*;asQ8m3t( zQ(Yr|i^4v+UERpzlsS9+f>*P~4VLs_hm7M)0?dwj(@PO08Rj`N5-IsXriAW@NA7y@ z!$6@5DV1anYitdYCEB;Wu~|%3-s9_yrm1U5;GC@b29^ZoTbRE}gz zMSt7Xxw?~;<>&EM2TQfai5np0u*~L zL+T2h>P>1R+DGbyHcL8gw#tq;4*V-ogitn=Mf&%ylq2fl!^-FMYL$!K%f9kokc3Sa zOTNW}bG{FP?$pz6n9E)*{p}VQ%Wc*88{}C;@Vu|P{oMnxR|(Tcp_tuF;U?kl*#D8< zKb2|sTM0wm9Fl;5!~m6k;r)-`fKI;%0gx8x=(f%tZbKVbq}w4p{pNw2SB#QvP(BEv zm$)pfNb!g>4uC~(J1e&II#Q;NKbv;@xJ}ws$%|XoP2TEbd(*6rGDbmT%UVn2OqB#%JC2$DxtkR6e9m^Fh!u_xJxs|8F4*=5-0YtIy}i1=+n#~`G+2?wJ6>R;`t3mE;0Xd) z2x!so-C^IAWZI=e^xT8wn-56C2Ha|bAN$8J>62v+xCp8vWNLsAlZ6%g#}Sbw7yD-u zkrfyFS9f1o&swb@w}%O>eB{ocoU$^VGVb^G&IA^GUv~;0I1=i<{=_e(bG%6(h5oZ@ z@Zuh~P4w*gM;ga;f$dS!8{sT}^0VOe<75C_?|@#~MDXw2G~j~sJ)*XO zK2Zdo1kZy@M*DcTn$)J}B>N3DZ~@y^I@#-CZJXF0)V&Tt=SDP>(H zEp1W;Zx}xK&)#r;a6ZHeTD~1_zRe55{5`~ZHaHcBqU{==(u7+oW4lcTw!?~+yAH0l zut>L-T4p?IVMaG;yuktgWx(MLOEEJ-Xp%xTO}R7|uI?5`%Be~Qy_sF2QfzWeI!>c_ zlNvd=uN>TRP;nH49-9_=P&Ji9%Mfjowy9bd_a?XJ9H8sL1~$F(bpna+ipq&-TQQbr z)B$JTQY`)PWt?LvaNvRj@!iT-p2$wRx@(==_iiU^K>vI9Bsg0!3?KnGI18~&Kyvg+ zDjZxcuZ;O>kp7bY_PP(rH{`;j(xr8xxzZtlv%W7MuB8P#+kHktHq=tmEqGuib|jen zHk~IHKd5aIo}Op+Y*C6kN@?MR9`TX9KoD^`q0RF{RH?7RAqRQysM#j^=m0dn_|yzt zIHKVr_IF;?PnRa?K*>W zorlZS`2H#|L*bFvcTHvMm`2WIlG)JDo)FCj-=+u2dCA1Ba%gG0UWwf}4sfrq1=jdMg?2CH`KA5gMWEugw?@ibi4dw)GFs?s$dS>d5u1m z_VA!Od;omgIDZ{J0^g)uULMS&HS6Bk*3k^sV8q)Cxi7aheuuZOLSzv!`g~95P9~n|g zu~2j*CI+h~l4n@VSP6R)$%L*%nvdwwF6Pt*Q(h@>eglP7P{v`fr<=$;GcFMaxPISn zZ~%lc;q)PVi3V#^MOC;t;(+8M8%CZBRIa zrZW+CBHn!$0x98>4A@}<2Zz)=A52z(D2xr6wq4p9G*(v{eaxv4XDF}1e3Hhc`x%Bj zasE|GS1ra(JJzc2U7A-fcuR4U*4P-Ar2vVh1LLLxo~k}n&AhHXuPiJ*wcj>s{2y*x z0N-Q5pAW=|uQNj*l196dVtVzDj559+o2Ibu^)*7NHLM4sAGU97=9QxDjre zx9&a!=*ed$3qj~=Q$GBT{^WKUp7vk;t^JJn^ zm?ia~iRZ&o^fUXV=g0V_Xz-nunhC8j1%Je0$dQb4*18pc<} zF8_$~e0JpxNJHzyi)ts*C%hJ$u~bM`KE`NR0NS{y5G=Vw878dRx*)UfXJ_an$w8J7 znSm3!G#`dUc5I+^zwtx_WMxdcmH>hZj|Y)UR*yVVa4N+@CIz{Og?{3;z^B1SDm*j{ zij})gqMx7`IW5xYT!#LQIN-b0!}Zq=Y~}Ba=(#E5#dVbL#N&>?deLOobPXj{2pP@h zdO8m!W}XMb(!SHW&I>W)6;{I>sR1wUPj)VZ$K?7Hk?QL9QhmM8PQEbpXw?P6xNO|{A)Vn%;*e`F z)SbgV)iKN=Oh1HFUIzkym=Q-7GPakC9D~QV8lMr~cZS)`-_|SK{%)%qUUNQufjj*L>S@CWdalgnHnf!rh+F-9V^`r1?v%^-W#U~l6d@R ziJ2v=mEaax$!Xh_6o(9&$o(O&ZpJz1A%Cx<2YJeK>!L^kNB~8znC2AQvjXt}O+Jr9 z)FpLkU$ib4_QG(xVSc4E>vY^}D~YS5jW#@93>t7z^a3s+{VihzDN~tsEaNBE9RaN` zYLH1I(qbhW1q}0b#p49yqDzDn=hK0hf_r=d>QPfLlN#|U1oz59EaH-k+=U2(Owk_^ zik8rxE1tc*KmY@ozg@7(xnz)LoxD1Vg&4o@`E?)DCs`<6h(uPuns6yO81MXHC3)uR z_9-!XI47Lc(D|(wX|UTlCx)b>}OVQsc9|0ZTg{Gdw9Vo4DVd5c8VBH38ZN0?1SC<9;=H#)=ezm|Elsv z9RQf4J9&O)=JenWlaue5XhfX~Rdimbz^+B<5)>l1!w#sfw4xnkh^O4&;S;w>7q z4Md)t*VE>vq2f#e5q}^p6#Sv?i!EzShTSL;sxoC87pc}xfept*zIg?fnc`Z2b3uiP z8al?)yD-n)9lZ<}#MtCcW!)yr(>;iI!U4Ld54MBvG`joA4fg6#D(cG*i0;AsmXkW0vrc= z_Q5)kAy|n1j*CYHzxsfO;V`&ld+P9GTFMBWoPf)=?J^0Lg56H5WJ~lR*BYqlhXcl- zQapa92>O9l+iIJ=3w~oC18rd3Up(UCp4~4H0>PH@5dzdVW2abH;uHE>!hA46_)H)g z)!8{)9DhT!G-oQ|RI_Ag>BV@vOteKkP51G;AVQsKB9dV*Bu94{({Nt(ivSy9l7i9r ze(=4T`ijD9>35Q&yIut~rG=7%Uje3RCArQ2{9cIske4rmEZ9xy zC)dyzYwMfRxGA&-L&7~ZZKT84xfg=tXs*wVS3_oVkiyWACrsmVm;{XAL>hId#B6BH zI?vmYNr|;MaN#vOl6lmM83vj79a-wD3wwA7wJ1+-o`emSp!v&@z4^e^lK?iAcsKOD z;aDzb0Ex}CmTQNX()afdHzme~wTtT4i}4J7c9!fvO91t}W=B5<9f|UKnNvOZrkofs zd#2Vbh^j;!UQq2LzQ%?$HI3f2dD^_#PK)K{~)hnIpV>ER^M z7BUrBhFxjBQ}hl?4U^;j>Hw|2(cWX_)YU2kJe5K>o3DFa3Z&2pMho!kugEaYux4B3 zDM8Du*_9FnUb6UdC=YttDw^STYZcICK2uN^5XcZ1)*lw@~1|0rdu;ymwkDY zJzI-D;K2FCj(+~b2=LRo3Oyk#WwsuolT55pD2NMZ$6V<-DU>qcRr0RPMtjj$S1(Hu zAJtbio+Q0+!HH%&&_|{)fFtHtK*m`mUh+o9R{gPc|tlH@C6r?EviGri7BqG+d(s^~0nhZ#dh44?s-*Gg~Be3bRp^Ft*1_ z-Y6=F+t|9Bm{8XN&5l-z$PR8_+-1Mnm>0y%=fqwm4h1HS+2#Reo-)~Vg2fyAKG1a% z*dn)05v4re$3q23iHs3Y-b(~)d#6ySM}?H)Y1N=B1(l2*=iZNYJ}pHFU(Z8m0;hsB zcv^xBHp^-*1w^%~fvww#K5oHUcF$8-*--*IG7FAO@59gp=eZz|??~ zUjt+xiO5|f2S9|{K*I@H?%~dFg2Tr#^x}ECgIc##Kn$upZNFsnMD5jKhVMT za3JeiDyW!9qKa3?M|Gu~BO! zudVM}0KO$nLGC3+Cb~KBuydD;vRt;%T|7JXH5LwQ+X+^ic2~PRcbnwFM9J;$S-ie4 zR}I2(P1*vCQL%;E(_QLSJ^Z4M?8(x2Mkd|kFspPaczWeZc;vD#i^VH8bt5hlw11oC zDsq&j^uoIU057Ul(=MDI^||CgOeMA=tSR0CAg-2QZ~l#g1cQoT~{x~r3` zhSz~wQA|PVO)L3#T={sPBa64K9bnq~A;CLDif|Beru4eQR7&iAR(T3GZUZ2K2ya*R zyFx6qIXh5&^65*^&xUE*hs0YX<|K6==V;o8#aD{md_=IywCYlSc8N`4!8mt61bUp7B%--r5C6HzEY9aGEiS;+iT&e%I`8m;|Lb;{KxTw9bjuD{?9uF2>=O*5zGI%)oMX zh^UE*SYx!LFYc=pI^|)qZxAo~nwht2QZ}4mNcLU>4>v z+|vsiN1;02V%5YtCLkn00#;jON(+H45;(Ka=2veVp84U#k7}7~?ryduURP8f4Q;U7 zLkh#gNDgecr&x+J5ub&YZ&rYlBc&e6l*=!upe;s7Kd;pd?qg^%G|vVM&mIrgK|^9& z?6G%Ulb6=JtH;gx@QMoNA0=LZ)E{biaT0SRa0h)140g4@+s#7cbO4d(1L~m)m2$aKe3?MARBfxxp&G+~{cXhZn#0_abOrzxK%x!p3n%p`>Xay5W#J zKBGErbFpj@)KlEd6aGXA_IJBvS(BB+Y2gcZSGmILrwvW7*IX<*9$AP3?7lSuA^k`F zrA8KP%AGsA21Mg<#`s|C)b1o7(c4l%(GMPMw^ndQ$2m|v$;@(u9gMAwU~9%=4jF0~ zC&gmqPbs+-(xa7ZIG&?t8N6Csa>>bTQHtLD?tXm*Pyxh%f`wzm3x~+o+uMas2%@{6R2K2a73}CA#PSSGU=5Vq6I28z{ z;frpSsbgB1>ISFmbE$1h1ciN1t8GgUb^>-!4Ym$<$!`1b2eQoo;{HeavHs+H>`Re% z)m9qJcZ@IU5PZ)2#V!Ls3A$~~nH6l*r8+t70Th5TeBIM77KkO zllAwE5f!V}wYhx&%1B%3?Uv+EZ;D$r%3Zfd2b^-oKaW8UHoGh{97^O%WS+B%Cx*!R zeRnIvlTMNdc?Ss6(SIMYxp|pyIRtY|9NxeMu<7m*h$*;X4@|xN`>0(dG+m*#91z`x zjTTkb%D0Yn8IXpBlf}WUtCwxoOk=h*Z2VG9txgnLcHg7{10m`4XMUz4L+OHt487%& z6@&sMy&+f=kMu*JsT{7Hh}W;uD3TfrKV{#VXN8h~hHeD2=N4G;D0`2ReGyVxee~lx zvdL5r(p~stGjN^NFL=-c1c07(h}512W^A8lt_6>>U^aCIXoWyFKhOjsEL0<7dMA*G z2b%0K<>6dFVE6zUj@PRUH}4XkQKaXsuP2#_@8JZxs`nelIr>)XX%K$$(CnY*NxkqV zbVMKSLpJ#LAf`ldW%F?hc8g9^=dXvJA|_7?4`oCfH5`KCB`=&%O4ltPWYvmRWVXlB zd~^Zq_%PxKo}E5QW4*n;g5spnm4`_Mv;f1nY_)y9Y|v!_gf+D<0C~`r-dcY{(tv0$LtokakonV0_=#tNSaf|d0I&&B533sGsE5}PF$1#Ls-W3PcwiUO)U!H)v)V-&AKk?HzQ6I=EHMzobe-LD0#xJ<@OvAKpg zNjRJ!>ecFfFw_-Wr!f<7-Ut+u8X9Hn#Ig3$nW^uXxSun9o57Ur^i#NTn#RjAWtBt# z&PfGvcD0)QVfi(7`c#CdnR}|3pTf2p@@69tfs=o4ol~N=lSR(R4(x?FsiSnl!mp~i z2yRM*GZm;=k-|ESSm5UpACUT^*|r(}@+do4R~%`qBbuA@ukWYCVn#|`9Re#F`hI!m z=fzm5x9AntCzpCK`b++Hl58B(fhwi|0CN}+Vw0hq56wv<@)X@GQ|y0eVCtkBBUgqEHtok*L5oQ*(SFT%S-G+8klSYpq_Y6o>`Q zb@SpH6pFc^X2DXubJU{esw&-ejBM#@6G2moY3=_GE1YRS3JP&Wf?#O;sU8~!P}oXr z3oDTUX#7s*K=mEORo%k9U@|rjWM3Gf;hsjJbpAR1R7J|*KQWC-NH|L!lYYxX9XtL| zN*%|gQ0!j5Vfh3n?Xgn@DdK}Hd1Hl#bWhv_haPM1K-#gkA7P~E;@L1^jaxOjMbbv0U!UpGsFb7OT6$O%nz<{dqe>UNYPJy2J?%8Sk{z&Zm*<;IEuAylO- z-CHS#tn$WjHMdi5w2LD*tj*N$q-EWFV!PHuRIerNCrsv5Bleni`-KQ&l`+A{3gv{i z=eD)<5zhAdr_gv`?0S}4WWn$ly(O$=hHtWOE_23P*9zsw2&^Y1Tj?;j7r8#F|U102CLxol~Q zfe6GQ`Z0fhrb#RwM-LxysfOo|x$+fq_*FaRzbPmMusNP27T z^B@ZojC);D*2H;UE#3S}sS~1uJ|THnUZ>?PFaYd<2{x4Mh*)ov2|pxx+WEG~R+rRU zTA+8_J&0d<_zZp<_%9H;yK8KE<}~!|Ji}-_;s|6v?W!1lX8^Y+t$3ep)C%k=85zDq#zflU69HF!knG*%uW6BVNJ@(DH8^*YLe%_=o2T{7^GxFGPx-gt% zrg^5=RsdgZ89>{B)OMmI4N_D#b3g1)j#6Exw$eE3zlr~I^-d}Nk9twXB!fDp{V(bT z=!-cA5m)rB31p%ohO%8R|3}X^s8Y#8(1HIW?tz`eA$$LT`#NY45QP5$!JUlkUCeC% z2e)_sZ`{5CSM&oE0!HfJ$QM4uPzFr@Ju-@KCIqD9zdj`_GAJv?|7L8wu(%-+lk$n&mcfRSb;tGcmR!z|6gi9OWjW8fCJ@g^CPP2ED#ZtH!zPtAk|2OCT)V7AaJ{p zQzN#{EZ=ydFA+FP^xZ|b=2b^JAotnVtX?s)Zjqzs6?{iBEebb0I@4d4GuM?cXUWXC zH+K>=91`zCD;;l+;lQ0zy!5vP0P1O13nPN}Q(hG4d*=0S2j2~-Nku}YzvB5Y@m%;6 z^WGi;83Y>g$>{Ol;r|(+CbgOu1-5BTYYmx7m}TF+26Z`}AB_=CLCvWpL#alvp@$wo z#cI5W7!N<-lBy$8N_m+k8ijjmtOUz@a1rPtkM&;oEMG8NXlQ(16G;37^aE?I971ah zzZJqgQ$*Y~Z^At{s6&QP3U36sE7<=Lyc4oXkr#x6cmhHbL1g6Ywhn>s2dgeOZnx*ORPwn^t^j-b z8_GROSjxJf>glUy-C8?9>k%?vmNU*scg#Hfk1Vgz{9zaIkPFI)Gcb{Ad&Zg$i<1xx zHW`C@p^{$==SlBd44g6292%F_`J;C%lmAlN7lwbT*dx>ydG2)}lCy23Y}?qoof%j8 zWw7^?c0^L@p1|CRi@^L+#$bs)Bdai{e3D3%-%T;dxVSA892z?}ZKm5xaG4#q-u(mI8~Xzvk2 zTN2Bb@kkAr)u8SUdVI5_+MUo_-iY-!zNs+=xnN1yp+!Rjs1{1x?C}Dr;$6{1GgT9v zV8*j>ce)b=EsMzKdNPPYs}S{j_|61C`X}e%ASTC{q$?sgj(eucL(-@oTm{=A$|={1 zyo{gZuiV&+hJ?`&s@UT_UTv;%^Z|Yh-c$=x$z@+(`y156W(yNwNOc zlNTmO55(01V14+4ZS_Gec9d9$pL%(N=}cqU+KYe?-+q23Q_(0QI@>td=!Fkv?Y4Nh zFaE$<uIY+gDYL8MOOQJ=Bdphwx34D8^{|M#-#@wPder zSsJj_vaGrI)wS^~Lycu(n_mA>RA;xTb1O8SZ0r682%eU_x7tOthtjVJhJG>jY1Uio zD3eUKQhzj-{&_R8@n9dT(NnYDm@QHV4L>L|s)^d{$7&1)RtahL3t|*Q;wvOb3LVa4 zQWCdB5rda`PVq{arc6+{nun@AT(x5ib%`rhdc5B&f&W+_Q#_ zeR9A2E)~`#*s2q-&pb$M)_3r`Le8rpQvs zrkE^`#>dw;pb4~>@!83cm-h)x&o?*^RD( zbfU4n0^~eMfKdcryCg)Q?Yv&MwT$>nrX4|W)>@iRKf+jQ3kKB%b1*6HOl>V!Ee*+PrEPy5%Mp9v(jKkDp}fK4lk zcK6V569{N|BAKyX&gktG&@Bqh%#=zkieSgydeF0A(Npy%@QMTGzECy=5)mTg{ANgP zY=eF6_g0g|nB#`xZN&v(NXfZj`kz83R~^VoCu+fE9SeK3l{3F`tBe|0=NFroC1z-P zHdlT%wKSMNE+uFQVp(syg<&r-o`-ncHWK6bCA}MAd1n|j zkMa`TmXUV&kY7e~@8U4+U?`!r7C*99*o=t41Y2UdACP%8>zV)~%k1^jrL3pOVG8`2 z1pCpcMuX?uf#80aRMJr@sBzs}p{AbY>OFe)lXK6PkvtP17vfb9>(de;sf-5q#BJ2v z(W`dV-Udio3=+WGr zLh0C>_{<8>mfhc!_kgV%#@ElM<`Ot0O>Pdl&X?1~?HPuZv2cJw;6i0g!9`ldYS#r6 zb{9yV3r?KY!OFmCq{f&yClDx4VaWVdm=!ZDP9{gad=kFQ%Pm7&_SZuh2w)ce%qNM9 zB;}T3^_%&VZA$4}B3u~gz-#h}guj)e%^LRvg6IcWEy*zbHK0eG+|mzU*AG1P-HdW) z^{la_G}dB)4!r_8WD}n9hD*5e9G{wMWJ;L1LfvoL*cdE2&G22*=Kg%&wG-SyrG_=g z1+dNA&;`tQ>L8)0Z?K^55V6z{kWj;@HGmi-_58;xkrg9p0o#0%1pgHm+o6L1-T82! z0E%7zEE3R(485U*PZEl*qL^9R!p8?p?4L{%u>NC{{!hK!|CGw1wMJU_rvrt=$pDGX z^O{8c3Zpjcr0KJZa6xdV?F{39oEkecd|OfNx1X`$SOz&RH&0D2)vqxPYHzLbvuhkb z>M1_G0b#=jTjzT}#~U7B{2jEE28(;U%dVDZ2x?F>B9^_(*09JFFzn_(IP47tw~D-U z^>V|@HRIm)u=t%w2deHXD^aFtRRMH$KVl2NnBWBPZY1oU6?o9Vz1P#0xBpM41DA#J1$f|*IBp-8HKX_#Z?gp%A@ zL01JO&=_eFP39J66@3zXUlVJJ@9u^v%9`p6#mVYA!p*xN=3T?BRmv}*7~qenhHK!Z z_pi@@z~6q*Z6jLrQy(x%!ne7?hGEEja=m1xpab}0p*ReS5(V!I7HYvzR+Z-{PJGQ{ zL~Vs(adOGx`XZ8P(}awp?*#6TK^Q_=E?=6I;)wltDAO!({ZtB8y6Tjmesw<|j$ovL z2j|mX5{$t_U4}ekEKXX?9Dp%-{?fd=%*Ko29d6BY7M#tRMlHo3XayRwtL7Wum6Vwj zcaGa6$1YV5s4zfkwB<=f)3D67IbV{%X~3~?gR4@@si<;R zz8tH?_Lp>Bm6PgBzC^kiI|50ecsaDU@Q8=;ET>`r!0Lqsy(v8G@rxA zx}kic5V5D+ zc?vK%ihAwzxs%;L1u!O*-vp=K+L2%;9=% zEZ7_{#`GBqdD<+sZ74doi>GUoY*%7b!=dJvaY4D2vrYd}G zR1dyuhCb<6)qb(UUHDa^^BVGiW4XT#hx*E9_I+ z^&e;t^aaNS82mSd|9}4&3EzD(B#M;Jye6Nov|(-id+$X;#9)LWE2rIe0#Y-sf-TAz;{DLfdl_ zy&PL%ARguz*OOCe2WfqhkN1!~5`u+BGjj=KVCA-HKa`n4drQ$kj$psvAxuRbP(i3w ziU7-3MEM7zjR1#s08A&d?*~&rq|1VvpX_VMbwN5a2FoK!s8krhVN_uQ@oKXDhaU+* ziDc{Lr3X5%Tkx&BF5Sd+M&#w+G4_ojMHDpOjG7yQgh^dnV79x*-?_FyjxX1|)lh@c z92xGr^7nZ`i>PRyzqbSa65>N3;T_T$Z=Z}v>oEA{7fkHy{82GvbS)igcl+)Izpp3D zsVn6FQ^#3AHT}JRoFOG8HDYv#C?GK!k(#tL2uMhGIl88VfOJcDHwY+*v>+fY-Hm{R zGz0#d`1^j<@A;pd?QG}V_kEuGeD3FL=RWVf&J%^i$pOwWuq0C7_q|=u?q9O^9wtOl zo2-3eGx9%?daK;Oq!lbsXlkNWcGCth8Wr71+^c26{miEEnZ(Q;2*^ueCz%=ZpjUS_3 zSCyM3w$v(xY6;9ewdK$fZ7VVLZQ8A?=jMa50_>Tj(wut?yn1)-?ySFcbpn}T+I8`8m%}8C4S5WBPN<(`VPXqIcJK#X zIdvZ684IVcy|O==7mW-qNDSdID2c{eYZHt^@&4h9qqg$hUER7J%6V>sufdkCW#zN6!g?0hOlZE7^#YCH(v3=kWH6MK&#<}PPvuVXxMaJ`H- zgC2Wr>5EBClv>_3X7XoKa$|aL8c-VjB?v0B%&%ZgvmcdlI?&kV2C~o!D|J$yC0UfU z62A16U5rLo7%I*)H?=aZqAUsR`_ch_YI&Jy(W9`)cq~DV3-&YNfXw5uZdb{rpAgm* z-#|OhtA?YcN&jfvoo-12NJ7`<~K}?{K6L!g`heQq?}cXv_x{p4Y!dY;x=7 zNJ}**Ioq9I|8XVkhUL^L`Yma4baHvsj+7p@>JV8KxK2d0#l+*An@?aYSmDJ{RnAzI z&twrzfpO!8ixXZ$j?Al~t*j_M40KM5_9w+mBKuQjyv87>AR7bj7#*$3%mHoUDd$x_ zCpC81hIk&k6Ek-*2(L*!riZyunNzfd9xvUp};=3c4?A$ zFeZqiwl$MF^s~AnDFgsWUwC)K1M)(N9qIMlNaV&b!+@WgsQ`;gmXf6i8+S`9*sT3Y zZ9rpBT*BW9k-aCo=Tzkny+rvDszC$Oi|LW_ka_%Sq*obCVf9*a1Z$oA@lGpU*oaf4 zt~pmSsu?(Bf`n7e&yv5TlvOLU9W6&dkeEmT1Fr12dpFC%R=Pm*kto*cK9v>N<*XBj z@1q7OJk(}IIAG@uR9^&gfV;gckvNPvGkKD$)Ezh9b@lzHIBNY^ZN)X+ zb<5*53?Z+RPng5y<|b#`6Zgef`yG_o;BzK|Y-}hbLoS^+l|HD&2p3JB#20C$$QKpx zWW=M7RKJkcZeC)WmnGfh!Euv<0RkvUF~(%8T(u6$Vl3j+^Gc(WToUYDHxMuUkL%d{ zcT~TxDZPKM@8S10xxax}v_8A9>VfFcL9%Q}Ra>F2(>)p&oP4$PCi4eO`NO8R#<|Pm zJ3X!u?RH@IFzKXn`WWw3NNtZXtmZ+jA?SQan~j*jm0}BQ%E?7;H^&2;oyoLQqAZ>f zelQp&dHAg0@Tp$V2!VcUP}9~*+GNx#4WZX!JK&DzcptuIm|mvb`S6@!ljts*x-4H0 zwk3S6lNWHQww1(|F0mVbuPPfbF@T@kG}T#)^hq z{=3qe28F3*lUr7*sH>R6Fvl-AWAOx*cphzvPliLf-oj5?9qFgb8AgUZK4qNRm!g~0 z&xp%YyJC1Rp<$(Mpf;w79Q#FdHMyBT6(bP+!pqosJU}ADaf4!|Wn!E>g}j~*l(LaA z;XnS2f*yulm)V3X*3r==iZ5l{yC`;bJJ4sN?R)=C10qyOZ-=1`7uZ?8R6dNGMRk~S zH$NQb2-Oj=*q+k;HoQ;AZ-L{}d|aOES3||eCwlnHk^;_O0??X<)s%QEs2cNqol*(m zRu^vwHW1&+VJyNH-~D%c>UAGs;0Op&;$xm^S(6R4J`d>WXuZYo)GYB!wPIZuuWM0p z;|IJKRc0>*rOD(wQ)6K^UP{z*xLvxjnNCtxb0!h{yz^dS&_( zh3Ac(tpkIX>@|2N?#z)}ZnVvA%ve76dj{TAEE&8aTD}S7IeW*#$hB2uycO>b53rWf zijLbPW7qQ?2OV_6CX*d$V&WEV7l@`?nzx$;f@~_uiv+{w;*X-qw_9I{#J}3|kI+}z z24`{GtwM*5N#wgC2Slkh-LaW=IWoxozSa7RMNjNAtr`ijW=3IG+S-l`3AgQuwZ<@h znh2)Wd08C<=RRWDP+1ctqE@jw2`C~$Wvt=%$EJ&*PCAK$omAB%r+&O=rXKDtKFh%> z$wXnq*{&jHbeji!g0q!x%G`(QHMgoWitOtI^q zvG#jUK}?gAviVA=CiL_L&-Tt;GScFfUt7e|4HZm|&MrF!$Ou)IKN(;NO5qCApeGrQ zq;yd*3b4In36n4~-5LIz**lmWVUB|raA8sTr*_dB*g4dZ?rnCmHlmHN%E+VG`` z{}9`5LWo8cp=v4@B%er5(WL(gq0lydk`@1x+m1ruu_n%$#r>cddi1Cg@!AO9*gOmLg@(`ifVkzzyf(gRk36&Pjfw_aew;3jU^eHO9BcTjUj zp1`v)^hdF$98=0hbk8-%(};+*TWBkunVrUt9hAg#g38n8JX&sdjZvzLX$N*hAps4mGapO z@kna}glu7!V@IzX!YGd_XDta+E$nrYMoHx_(%c_2HP3jG2#~4-d)rPNF=^~d=7AIJ zV(HS{cSNqbjj7{SlmxC$rqf0BWnm$oB0k>VN?f|T!DUg#0UuCIU+k2Y1orU8AG}RV zecstA?oj>Y<=n|GkQRieEjw!&DEC;Pb2+zuL4gw%`;aeF`h@&EnXEOD(8qc%3$uK= z?csB#FXr6JxvCBfL9xRN+J}PQ&SjxA{Mhs&QXXRcSgb$~=6BJWidFZlKO0GW#stJA zH^xd>fCHm)ie%2jrx_?JX6cCzrPvQNb>sp3!;~-Vva29R8rW?QpA87*(W}w&l)Q%A zZat-ik)$ja-V_$?jK$XI5H+|fq_*0Jo>k#zdUp!AC^TPZzh|{pXGldX(4I5Sb)p9i z4~C{kG~Jtr`0)6Bj-wb~AM;!&#}bR&-WVk$ErxsJouvZ3SpstHqA)@1*oFobq~qMw zCY}Kik#)oZm9+v1l>_6jp)uW* zLn7EFy71A5k`~!l9`B`2^-2jvEeJmib4=Wxt8PI}Q;mKeO%g+_T`$tAKkLD0!fNX5 zz-U2?Qyc-g(IYJNk#W87I*h| zVf2S+qwM~LxZ<+`>MZ!@I^hFxUVL}53b~T*WfigxBys7eL9Dw6RHbnEp%%gmup$DT zBuIvrvf(X>E^A^xpJTElV#H4cNOcF%eG*cuXkgOQ@&R2ay7vW8e{&!LM}9q5e*O#1 zSx9d3q}_L|Bx(4m^Sn$vkm@pWJ+XolHrj7-x0ys{`&3IoNRYW!r!3K+>~lI@!u`NU z-_KUj7Gj>VUSRpHr_jEyoMZFKnWiLj^5?^&r(&F7I`Z16A=V4;@@s+nh(Fi#@BC=r zU))rkknmzAc}OpWceFh))`mU6u~Kt#%~{bg`b;mWz`+vCOYb&_y5=4qsGGOg2irOW z`vKp?VY6@C#TLI4r_zmt&o;|gY8t8AG`qOYA%ds6)%n( zsmtP&%4AY%cipq5Iao5QjK~hnNhA`aGoQ`rpr+mzkOArekJ8>0ElldaoYUau`{Eqe zmLD^=TEgfMcZtp4sRu9@cpoES2FrEj{mj)g(y(l+tIywyGn_)BZW_uQU}m}&1#^vH zYJ6>7!RT?s$|Z58%Wvo?>VD|dL}v$Oq?jP=(DX}`7+hq+cqsY9hu3`u_X$ceVR0Oh z8b6~Z$L-PS(DCdy(u_~$4`5UE8(-c5 zfUyF;`-Re#C=r`zst&`hiwEyi1^T3-b-!jWxgMel>(;A$>}vC44Y@C3;53+UeBe9^ z3!`mN_#AxKrzj-iDKVeow5gl+h!Uwyckq(nCPP#$27jZ)`>vXB8`gq8oCM<-@SykC zgESG^NOL~9!nMz4WXah!E)QW48U2Qw)V1x8Bl6y*ho(;_Y_IfN%JMH@JC;lPeTR({ z7cY6wpPu~)>`I*K9u?WZVCNL{KCQB?F!|hM#6cw*Kcz7bJI02~AGAMOJvco0giiI{ zV>vbOa)ZW0@|%@Kcs$N%rOj8cB>nr%L{|}Lo}QiuOFhZAsHwMuHCcQxk1^4mvo+rH zwVav84(X6voe7FTUi}v``rf#E=84Nt{TD~&p6lO+@H1@pvgJqan4VJl&tW7A(54K$ zf3Xi=WPDu)m&{OaX3S^>i}*lti~>BkFj%yIivaLkiIxV>WpwnF>>i5p&eoJQw4Siu z4|OfwEOVZ5Umx4bj2?9^m$>SuGkfOWNr!#T>VZe7zqG3Z(qG&409^*P(dI5h2*Mpf zm;P<(ISWdHa7)l-Xj^(Jf9-aoBgJvuc2k{wBGmSnlpQ+cGW=YZpnza=vUX2VrO)+wk0Qv_2VE`)4jsFh-Nsa*4p`ai-)+jj$ zb{WcVI7oCP4l;%-gqrKWfVq5uw7+s|uQBWWvDcnEiG+@3K|2pu#&If_TKt>S!FB9YU zbS&@uE;aZ?$UrRTS0#R70qvTX>|BX zku?G0qWxLMGx?a75E3+`2?AL+UZe#==gffvjPNA%shiWE^+)^JJP{5DQNA#`9`?_5x?Uf$k%A1u_umf6 z?|TH(@>>0GKLt@$L_Y<&z4-q)3AXz?zbKpk<#&CnTrUoBR{YQAPYb0Kwe|VmsOwc+ dXNTBDe}fH`<0*HDKCgZyvu|9E&Kf`LPwK!Sn&Z_%gY;I`h0{=xW;kY#H|pH4fK zY3qwY0qWOoHao5$T2Fzy5{xyt5bQ}C_j3|5@P9r&mTPXx=5|Wta*C@szFhv}%JAno zot;C&NpOG!^$lWUGOJvCF-{?b;HRToxr6W*DyCG=FB`YNnW^b|cHz%^Vu^QC^b{qw zDb<@MSz{pCg(-&)zv)$E}KvQ|26J;O5Ii zTzall@+5vZg#5c1-0o#r{^2N_0K2t&qh4<3?e_3<-CH7%LM=ysu1$BUwUD;>F3LUP z>l+V+mxEkoNPt{bnrks`vI*hmYQ0oWw!X~B+CZCLc!A}qPS3Yc#dUMEe{sxSdWIIRB{djkBvPskir)D2!6MX4gWAN@b7a8u= z$9v7@Wj4P6q^MWv)_eX9R;=3!uH9|W+CFk@zZW&Lz!3R*r1G)9%2(#;a;c$@}L+I7qjaJdP{3h!Un@wefCwZ}PGK`cO^K6mI=r6NX z7MUTt8o1uUV2AJHaGfLv9iCv9)FI7b0x(2YH5I`o(S%x>Ir_2{Aa{4^577{iKh}np z_EWAx`~Y9tCW5A#jiszrVNhWg)a+nQ9vo*2>U2q(CbmC{(tg@(k6uX^J7IwMB%aZC zcLJok!CCL|g88RZedk7@&KVbN?^=G$i(GW<5P24C{jy@MVKwkG%i)fmVYt@dX@dC| zFubWjL)_l?yPILuFC;152anrcg??1r z`~p!SjyTHbs}{!fQ3fzCotT6P4a@sa+c1ZcLa6^X& z(M6$Sklx&-DT!a;j+G;~N|?J?#bBcTX6~p{d0OZ*SDsXL52PD#Q*`>F;$Se%bk#?U zO2pGL2pO;h6qI^~)9|!`Vj_B!HV$bem+&6;L}ZzWc7O1I33c*A`gr>PLEI4+*}LEi z(XRSNk!AM{mOOgr=#whYkOfAH)mQ zPoy$=Z9{x&eUoose`2U`=%;BhPXu2y9rpWQCAh|Jj!!@SlI!uOg2LOn@Q`7u_mUU? z4WVUS9-Pn;E5D-#VjvrhH<-u4(hQq#UG>i_>k{N+gi#N4_qOwCt(`uT*N<=OPY+|g&2 zs5lU3-guP;3>SPS=7`i{jJ>*qwX(<$4-ZKd{(nQJl(WwRg+MyU0tkY(Fg8i7JEBoA zGdvA)#VIYvF7W+BabqpAyYXly*RfDkjK7X*BxwsHnFf$yl~aQ?&~7j|QFf2RIZ%We z`ZLw`y>K5VR5CAuX~OkA-ohgTiK@A$1Ngltb~TcR16&Ut4D`J=n?ArkmOXR0H>b?0 zj1nV4?+Z+|-#~}zP8q!)6n!V-EF?nS+Mu0Tl#_y#0x9zBY_mTZ5jJmucH(YSL3dcy%uYDGHtu1+yIf{SZB_3P|pm(h8c&PP-X_~ zH3s*}KW%p5m)yIRr#!1IAe&^BD0OzU3w35K)EfK}YC#Tv>>WB=jiAv<$_sIZDcWgfs{gC;cNq=dN~9AMUY8bo_`sAN#ubZSnBPj zgZ^6q(gry$jq5Nb?Hyfj%_^+^h6SgjNE7I!sa*wS%=~eFWK~ywt{L0M-NR~9N-2tD zF-+3Ht3@W_%5@#m-$ojE6be{b62s8OnH(Q^LcJ?6CgUB4Lxm?CU z$ielDRB9nAC`3FTWYk)fwrqNNB+vEAp_q;d#6#Q8z{yLy6 z2MLu~&{dBc*${#Ozyx3cumL!L|8hJ4K7ar~2p|Fw14sa*05SkMfC4}XpaM_>XaKYT zIsiR@0l)}g0x$zu0IUEu06X9-fCKOizzN_2a07S%yZ}A`KR^H=2oM4Y14IC#05O0# zKms5MkOD{pWB{@NIe05gC&zye?iumV^EYyh?ZJAggF0pJL50yqO)0ImQxfIGkg;0f>ocmsR@z5qXf zKOg`Q2mk?s0KtF|Kqw##5Dtg{L;|7!(SR60EFcaL4@dwc0+Im9fD}L~APtZX$N*#l zvH;nD96&B050DQi02Bg>0L6e3Kq;UMP!6a7R0661)qom6ZAU{$UH{~_{~FxvbsnKu z1Te69Dljmt|JUHUI=PvcJ29C!+c4X@{r@I6(=ir8jF1)iPqUhyN2Y7t0{^DK=G@)P zUC`f+u>A4r^YP4|u@EGng?`doD;Hdg){afzW6RWnz7@ydwhS&0Co8`hi_(Cn2!Z-h z$~+i(uT`ZP^X-1{_PLqE>Nl$*>1hi+3Tny^lp>2MkbR;9gOO3G^B41fl%~vqI-#)j z?(Cb8uSA{}gH0Ae2D>_$uVMS2P+vsJd{Tx#KKg%4H&-GhCl2+4*sALv?c0$BB3f_L zTw;U6@tUOTJNrK=|90G3A8XB}Bo<2kdXe5-!AOTI>CYm5|fYXhflQI-d`3l&^w+hR>8%-Mi-^eU~R@^32mk~A^}S8}i}O_? z3jE`!q?WypTo+XgQ8)|ZM#f&)DVgw*9rmz`9nW=F+bF7uV;QK8Fft2*b$ypgONZ+$ zTca<6G=U9nADyCY=(#Gf%nJ@a3ME652M@RF8{e?YtRXD|y;+vu>19a#QlC(<=^Gm^Wrr{rS$Ls!>Qifo9PaF^Z?%MowH8wjw z${V{2BjfCu3Ex1huwt;ctNIVV?WcG7VC$g<;wGB?I<^TF>!UJcA z6>W++cGIX~G%!YTqBpxSJSU3`N}I-tH-$?Knys~LTJ1pmYslhjRH>fnQ-<+V1sY_c zl-bt*dQ)}C)@+qaBE_k?=}n@4_M2K%T8>uh;c@8T(QA6zXEHwPP&{Av!KAa8yd0FMC5|xi2hI{ zM2O_6VATQI9?u2K3EdnyC4iZhn|OBDwf~rxY6rD2h6^ZJ*EaoPx#4)D*m*5?^_YHl zewiABHj{51vP&gpTl%>FMQf5OpzdI;Eq;1G4RAUN`N1zE? zS(g~^maXj~!)JcX3o7`M!1_`aH6_+!DmI(G_$3SUWN@J3SoG`(-gib+yvghSYw&cM z52DQF0#*W>WyycmY3t25L{o_J#vu#Fmpts2;#KI2p7n^N z1oFl}S}&bnJ{E-~bmZEW4 zrJ9(dGF3s@qK7-&$q!LR2~raD6o5@Tn+do z)|AN&XB!)zCml4qnPd7ZYM_3~tEQz{QDPeefo^-=qxuN@IQ|H*!E30bg)i`X&xU3C z&+~c3gtO)KsOl9wS|^xM#MK*ucf^3X8*moy9cO|mPqVC4R@PiYHxkOd`uzQXbHqHG z{AqU};~jr-ni0Cxi8gyV)kPOTYp~O!~`; zPf~`~>Yf7*DvQn=ntv6@9Sjr5Qtq8-rJ; ze^m~RS#j9AMDJhMe*DC0ozx>&iCz7}`6=oJb-ft6i{ueTZ6YnG0xH&&e ze|-Zfdx)g;(;AYC5pt=5)8Zpzz8|snhS^>?nU`T_O*nd zhw16JjktdWIM=hi7sFegwFK!%TA2TeIBljj)V^8F5PXyHL{|`*G|O>y^)3Sm#o?!% z_dFdO4Oc~Lomw)zA694_^p`ccSTUqL`FRT8KwTZNXzv`JNg^yzvqrVt8{`!m;QXkS zq2&s)y0U^!^uTF0SLC0V%ibpyvZ4&2HFdW7A*w{o*OCM=Bao~+8Y;*g9D8pA{5RHmh(FAIK{1yoOoQ?*OeRG`^#fr?T z)Su;?)vrraBOXtAH%MUUH(tiww1McYyTWYb1^$9&{s7xTK@==1-wpn;8Fz)XbY}qr!_M4^sK@@_V_fdBgv|Gd`a6(J zUU%SzN2bVMMvt*qK8PxW4fAIB2re&-WjNJyaSUf6LwB7GWb7+CCJN*2-SK6P2bM`# zc8|V}N}1l6w+5U@mu9ICYu1s^2=nyCGDI;cfp)19?h-Lq=%_x6FNM_1t;t}_Nyb+k zWt;PTaav&9h|Eatlrc8_i^FAp=IGQ%yZ?DBA z%rgt0%>GJrIV=oDL!W;Q=if;a+{Y67<`sU;Ni~;aSVPJR4Hnkx5PrX!F@V}VBwj7} zQA-K-?k73d!6zQ*F+rYSYQ0e^CT?;U;<3rf9nQ%=wK}rbtladQe6;8BTF4Mo8xwf+ zyd_WmBN{c#eAY&kB@(ajn1eeX^4^BA^ zv9Fu~#=krw38pUjuUGvOkzU@Fo*(reEWJ7gdeP#FzkK&z&2PYsEp_}-IHG(xyZ^{h zeS{gIK2cT05pyuNy*P~*$EOetA_%@M^>xQkCgPg;4OW4^JJ8fLBv!p?sf$rWZGD5e5Cz0;3Nt!klT@E2{r6+e>o(<=ujR<$Oc@h~#5GLaWscTd& zl%p5%lVH3gik#+ek*_Kxcb6U9it|OG7(!A0zHF}DkdaT!ZaunR4RI^eek8;4Liu(U zE!ZAVrq!oJ&1|5xrg0hDfvW`3XRVpS*~nsO;a@WxVD4Tle(*HThPwpAVdDX^CC zw3cFJ8AxJ_#T;@@|D$y%j5a_OtV7t6;xAsTwmwZ4EB(>ZBX4{~mD#RoCDQCXhH*o2 zK5MnWVSuvIs!V+>Neqn_5*Qx*h=y%8&k1KYd>%`V@s4iW0fO`$|EB*j@o{*r zGX_E8%;*x;)InjDG%K+AC;D`l(nEWD(0Nyv)73K_1z`$X-&Dtea5Th*zGcW*CUlZY zXR<6TsQ%Jhrqm&A@$>D&=>s#5WdLRwu{u|J2lVmyZLs>aK=#k}dnLGE&wAV7>x~cQ zSVLphGfl#;%jKI;M^I|W=Ra~G+gtN<`uGS@uM~}gxPi|ekiiNhs>`BJUfYe6MVthZ zw~(ZtUTS3N3v{b z1cG4S+JzBn!9ZP3j%ji24ESmXLwf^WYHXP{-3U6oB5FY#66y66K3*%QX09OqEkv~BFbj*m`LP%uP2 zDFRUlhOJCElA-uOEf&~OGIr&DGcqMe%dOrXxKvvF>N_H-bH7@LuR3AJj2cWBmC2p=kP7r2ZEgLSniw*g*ov ziXk*1OLtIlQXYzq1jqdbl|!Ec;y~a}8yZZ^AEi7VuCTg&VnMEv+&^{a3E|3d)zgDrI7}jnFE5R>Og|=@Lrc;G_+s-{@&CNxUC!mYZ zGmhuhlQ(E=TtymZ==qPi4+<&pHF+{-G%avMh+Kd&fBg&caU(C{$#p$H2&p}nH{|mh zW~SpNrQxO6#XKnbdyx!<>+#@{p7P5$_f#oyIk%1MOBM80o^G`D&dw6*N(bcRWUWU4pSA4GQrin>*Uv!*e%I8g;&UUv zi)9;7Xa$N;lAwG;DH_4_MUg61151mCZpGw<+4*XEbHHMAQM#UlU_Ln3K)oiqiRnRP z*v0oJ;j95qOFgdy&|%(1UWmq~=h~t_`6$147|i)iOXx@@h@Hp(?QIntPh^)()yuGS z@?*>(Tm&cZwxqQ8L>jwqGIndCL`wT^;@$xC2lci2A}DlLBybZ_$2|*&h`#FGy^Rob z)Kgj6gbo!wlo=sSykL&r1O|oDV3fwpHbWY{WJ!me|N-b*QUHUAg4oJnY3OR2sYgAdAI}de}uah$S)3l8qdxN z76^jClsAs2r}}*Y!J?X~9+mEz$3b(%BpFjAf<8~~EQM@3&!xvo#F*1A$=ej%6l2dX z_V!HNzgXwo8X_%7oek&08=Kmw1P(HXm7ItQCyHpClqEg=>Xby$5#BI>O zch1D#+CEI~7!HN(2@5kh>q$aZDw@*ESq4|zUqV?+-sNp584qlRG`E+qhl1V}WBn$< z7DmI^Cq2GjF`=sTUmhcu*8C`l`j&C0chQ9ImD~iKJ9I7iU|aazh+BNvhda z`xb=XlgPI=<$pjL{Lo5ANGA)jMV&T1FhR_bKUh#;&60?%32H?5GJdWI%V|wrzue%4C3XYAqs+N#<3LWqs}s zWmoX{4%ObmQdGsq8bhs{Twj_O4ty2CAVT4%( z@?x9iJ4L=K=K4##n6s#HB=AFtCC(t2!g`{#tX{y8WVTAZCXs-EH*iQ4= zZr;JKynW+6Vnw}@ZUYU8bd&ylI?2CTAo!rC_r3q}I1%EviuM=}{m6yvLZah*jO>ES z*l8oSA%@6ox5f;#H=mb6vP$d2;h?p&#I{y#Gu>gfc4x8N2l=NB3j}xvQOFIsKM3Ci z?(1y=9UJEHaEg0EP-45V>ains_x@0gq|Y*~!kJ>pqhQ(y!-0yJMxO>uNe(@SPN+^3 zqMHJxNzc6`59nXR1JS?V<2;Bu+-`c6sRyd7d{jvC+JE;CiG>)SG>!Va*W0LIgp|UG zg#twv>kUp>z^#-1dipz25~xWTR)?N?i5~_96I=M>cxNK$rFG5X)Kxr557A;`br(@e zCRO%J-(sC9wm&FseF@xgI*iOd6;=Oi3z}8laepmA;(AqT8%6#J3*Ez7PKIddV^Gqg zBjU`FN#i?P`*ltMLGQ4YqQ>v~a@$=jRxi7%quw=%B1$`S2bJ~;++{hf=oLlZjtuv{ zC@h=xdGOm!-9@i+ncCeJX9HZ}xumuZPdFM|q{}idI~hjJ(U4k)FLJi z`n=Fv(Z&TV11m(qH0|^K!F^-&^fjSRTNIq)xh5D$gn+fnZxz3|3Y(hY`Qodpa!856 zLmDE*{JgpQZOSHw15b*BdAqg~oP2#b*~#=ioLLlEpP|+5mNUPnTJwTCqJ`Rg z0fV*zPG2*-Zx`p8#C-{qb=6SH zn<35Gxy&9tqU;uoX^vI~JWd`Cnq)DjlghKBE+HuFwRB&_CX%J={);btz)Xg-ak}sh z>|hq3mCSXxjI-4^=`)H<|Fm@f#ETxao!E2Pp*hb+06*^nN-9IupO@^{233u`-x6f# zN{>&!c{4__roG2Z-l}=y60xUoBMugK`IEh{OGer1W4Uc%&zb{b&23AeyX+%69Ebb! z4!A(7qH^~fisZ4LYhAe`SKw6}V-D)L*qE7a*kyAYR!sd$ue@;vnsQZ}?PpNZIOorG zb%&6Y>dRfVi$AK8+zHF>O5G(@o9|$%IV7bNn`KHaugj#lwd3X0L3N^ZSA`s>=6<$( zIt37vU23Pop0T5LcDQM2bx3Dwszk?AvUs2h7+t?I3BEAurpg}|vdd(FafgQ!Z8$I- zrj2~J;|r|0y!39>W!HHNuW?jE?xTYil5&}Lu!@AM+B{d0Y(fbih`l9f;*}U%XL4t3 zU)Lg&`|&8uZqxoWS@uTEH~{kECW?zINx zBIA57zdfldhT3W&o_i^w%TeNi8u@ZzfyL-*+)SBFMK|~>mxDfWW@@^)LTR+LI*+i~ zND3-yj?Y_O^fIX#6*GtC9CH+ zZ^XapnM+!Hb%!`;R-w=U zFgv5#_)8)fM1ifem=y0(-PPv|5v8z^<>cK9tXxh$Q?$ctBnYrGO7Snk} zdcJ6EpBns7{7kyyy|AThj>$OJd5s7}Kb0TiWe4QFu}>k+X3M-(#e zx#8gR2`MD873z_!UD=yHmQ#a08H1-ii9Cpr*0Ol7HAM^%ogIY*5Y3lWx6>ZuI_M`) zZhk75r^0?a*E@0IZ}+ixQ$QpDB|0&O)?nX}o=`I#B>#ND=FC(jzSjRWJf=EjVca?> zqw~{8_D~AzaE&KXAY8)2aW|OL753sh!W=O!S2m}IBtJsE*}UKsXZ9)QpPd52VOi*H zu;*6(!eC(Dx3l%>S+hZTF#1cfmiCo>7h`HRd$Q^bhCPzPlp!3k+9C%85UII)r1WCv zt5*v*Lcx-#iAsBVHXlNXx6UD8is zsGW{+-d>iSCFnc{A8;DjIhOYmi?a;+>#szXm~v#;>c)X|WheaDSL|_!$v7VQV&fC3 zzK=@2g&+@p?CiePJjTIkkSZddxuM46>_5mn+fjjXRlm)iV=Yf};sn* z3+GzTucaSljBqF4Pqar;l%|VwNxbsw4UCW)d?lQ7Ri&U}vG`k97|3%)wL2-aB~GmX zI&Rao(uNR%Y#eI0C$Ndz_IQ=**ugA?UUqZSs_OSrY(_FjFl<(Rx2JD>z%Xx;iIFl$DHS`sYCnFqe)bxp4z4GfBrNr z%y^~^(A`8cgZbk|a_eTyB06~iL}CH?#Y0lYCldW>FyZCD$84fmUt7U5ufG^MDY!%sP;js^MbA{|O$kAIwDv zXYyp=GYbCeT1v^DTjXylTjM`j33nX{iq92^^(Xxv`F4rM=FA&xCWzX}e$8v8A3@RXf#X?XQrPhJkK=(KYxN0!`lYeebD`2DCh%7*gn}3 z{+6IdO3~FLAlGo)CQ~A1R@SGPh#=(ZQ?ERJ2skgnwMC%04=cd9+}QtUL>(}Y*V+qC-UROtO;b}{Z9%&&4d zuf9`NKUV$H_YDgbf&x@%+28!=%P3*z*{i@fpZct z#mqHTf7fLqh*Ov9^$aIg-7IpTU96Au4p*`~@?{;BF!&fn<&r;N&Ld!A{Z!J5Q%!^x z-;Kv-&J)LYvi2KvE4O=y$?nduD9jH^U-q;H4QHwGAg-_uQp|$oLNfjg_K2`QmhN)D z5k-G?mhfhuhYh~u)`AK0oLEQCo{&szt4f+;1YU(vMOK+G-#;cXR#JZ>4ajW5{%nhz zYm=y-3cGQ;Gti$xke2e0hD<0k+CJuwo7~(K{b~M-P#9}QtpMuS5_`<0SqDy(f@=UB z#Dk~TW$D$LHgEi5P|}-7`U=y;UAy0$sh8p({>NIo_gfYQ`dlQR zf_TxZ-W#%ifPVI=aCQc~hI0eB*^W*%OO}8Am=tfEQ1%df)HB(hl#xXv)mgd0@LE&d zg9o{^5F?t;s2D#qeo2#@Xufzonrwq9XcFetvdIy-uOt@X$pn1B`W>IPUE7rrf);A5 zaa31ph9eQCSR*R;`VaHneNFI0bI0GVeIswU!aKhnI&iL?4TZPX1++A#bb)bS$k!s8 z&*SOUdw30rl3W^XX)~1y>aP+_=eBK)hHmz;FcmuPZre-xPIYjhguApxcFpOQAdonW z(XF1qGXI_D5Nd1Aj{W#)^U-wRf(hNxwfXZd9^z`QN^b1ttrj>N`zn zVCDUuWss9?Jh^5^X*Y)VXo_TI)Foh4@&g=%sxs>ef@BJ+*KgZey)$eebsa6m5IIwfg@fF?*ARKYO@gu$)}!15LhS5DHTu ze;%nRD|HQgkS>?6a22)t?b8|j9G_#}+$gx&IHJ${@D)?;R#bjezfn?2zw1HZ(xQ4d z9G=yX83?^Dtx|nn9QM_qH(IVzE?>-#O`&)Bl%fZ@M!Dr!EG!Ru`deOw71P^VT3 zB+f2$O2a;$l>HTU5f?vR1A6`(*TH{_xJn+nx;6FNm@BAih%&9J#Z@KalYP_(^giW{ z7)7<;X@7U}Q0m!ePd;#ZrZcW+mmd2fWX{)-LDhx1-ZQDmdES;XePpf$kxUwn3{MJ1 zJDs_>)IajkZ`JM9Nz-+D^?U*jGnl06>Q&tg0kJ8t{dH5|Jy=^q2n2ud#$Z%7CswMH zd83!4-@5L%o6$LtgJj<5Eg;mzgcI>Qj1L`8*=^iHNyF)ntM|nGeSA5B{>o*FL9wXQ zH$T71mw?WY*w_bpVy)T}!*d6YPPV>kpVYc_x_mk!2D_+AqB*Uy(;XLcl2(J?@#9%p zhrtNrwytdxwV3{#&mgfMuEF%N<8wlRJS2Zs4I+%e5|_eTDWpU`*=JtOF-bCZlWmZw zwHZj8IVFb1{z|B0x0Wy;aFb?{ig8e4!PzMY(S4ovV*iG7|L$kc4pD~3cou@CH#4k3 z8S@T(kq`*aTxyY*m;Q-;c#6KZ0NVjxd}UD^{}fSFYmGXH%wvevN?Y!Rn^RO*O|S|H-L5&J`3{ zyjx^PC`&mAqGrd8;m~B9XInScrIm1gq5ZAgVNoCQ8Op7^b0os576FG|zfo$H{fFBy z2GUv(PNTZ>H|&{KLWI68guvkY4u*7KxM;0TvyrqY$CA~GI5bIOyZDw+>XBnp z?H|FDNQ|HuVUmmXoD7*lxGb>Uzld*sWtv9WAP!{mswR0B*uCWXXC3XI4Rxtcsd6}jz<(Wp+C;c5yQN;b2Xs&Sy9LyCfGxWLsZoD!`NK0=U(n;q zKQTYAP+-8wPnai0ehT5=V7K@nR-scmE1pO$IHotBuorRccnsQLDc8y9BYUSSXXvwk7VZim7cRjM;((?bptMl9HUO*U^f|Y zn56Cr#G7J&(IbwS;QdO+&84joG-ir8z;Lf_I(Uo8X4P@vkQ|ZYe2Dis_-9vWN{pK|m=FFQNN6ptU@AyS; z!m{L|mc#vCpFH@ptWM(OoOU|E>@?J!k8oEL^j=#hS_@&fVC}MTa_f}cI8sO^#R1XH zerqEApp`|o?i^0KzSL~P_a^2$rd5ut&sXg|Jbjm0SlX8^w8q=}?AR0Y4WIX`c=l-b zq3ZfxE8FRny}HRy<_mome_Po8H?8h1xk2#J@Sm+Z zpmB}W{_{WMtEbt<-+w&g8F%`5KcU5_$zQ8#=Ynkv1*b#YvLuYJ+Nj~B#r16VR~xd- zzy`unoOcL zon~=!b7Ruk7?Ui%K2)>33~3*;NY>ZC47F4}`e5G+%9YtKe*3$WpH!$jsNLx1obUdd zezlIJH190@Dm_4iVQLU{OFjCK^?~Ka?waY67X4jGBYMx;kuL4fd#n82s1lZ)07NXE zJ4A5zRJMlK*|!hz^@-88F6AYrx$)W%lxfWTK+g|J?|J~o>vD63Ln*TqWw)(z|eQWcrE&1*+vUg z>05~hur%T^!En1s6IA1^D#w740#JEZs~=RPRvhoy9K?R)7Sc0sc4~CuJ)V^&mEE8D zp0ReV8u=2mcxPCgSx`Qy8`)L|k*2H+B>h&gn>r{qB){c=i#cnyd%MYeh88OS{gz%n zgEWDcniR}neNoLK$(dSbVVle&I3pD)&ZN+w~ zxnl6-a{kNL69Z(nY7!#vUeyXk?xwAD2)rJ4qVBV@VFLA+CvlJ4*0o7q;t-5Y4PP;@ zxh4(WC7*>-9MhZxAqzKb;vuioU*Fx$W1Rc1rj0@>`xAWIDBa}`jt{vhKaDmp%G=|( z@yMRfM}J_0F((%L#r2(L>wvUrR@!HBPrl=sqjPx9-8&H7)js_U(4@~=Rwn)F@SP}i zXJcKLuL8=R-+<4y&g8FJU3bgd5%wtM2!&PnKNNAc*H=@iztanse4db8>^I|Ka&uc% z6I1Bag1!_fn8I0i7e)r7?9=$Qg(wgio%Gw^q|)D95Pg>Q>B2)Sx-~&urlr$MlAB@N z=7xW|))a>I;W_lD2DcthBd$D@L&EbIi;h@AIii1*8I83V!!O7wkTPk}`fi^K0DlJg zOn~pwiQh9%MzDEpw2JBMKlmrwCg#+ee(P~p$d+cxcGXA&Y7K@@Q#;k}sl+?g|jif#o4r`8OcV?>2S zhS{@n%X{5lY(iGnjILz}Rr={%qy`eTaSSfXIlJTy$ywn`ha73T87o(pBdEP`{&-XX$KJp6a4pHA|90_s zxilX zPn`hs%4f?pW}Sn&iL~t(hvI>xKW_0E4Dih6`Os}S?Nnvu-;c){k}L< zrAfN(qakF>WkHg#G}`0g(!j)xOlXf4I^3)E8l??;pu#8|%SSP9E9@z3>dC9yNv)C# zf+Ly74(DqPtQ5b!pw5Z{sl8MRQQVXkNo(D_b!k*9*(-?^%06qDo$1Bg@-5ksclGR2cjX_3-N0lJA4e9)q|^(fxl${^frRtjulup+@9je&t~Ot?NAbr*e}<7>QLKn zGGgP3=g2T~0>4|aLla9&p4dUAnl6QzOp_yBD?j`XyvH3eT&$zXDd+XzeLmU%-MT&L z5c5>b;FC{AECPO2gn04aoDtX}ZAU?yQ)b}C(qlSk{qKXQ}fNO_G?%^p;ua99sTRHP=BdA$zr0$=xZ{l+YjVLJg|G=?y_gw_*{37*@5R8 z4!n5LE2gJ1@F-H7`Eb$qsiJM>R)K-znaf?oR>?eLSuDJtz1btjk@dhh(K7|Z*>;)j zJH6O8Qad-@s6>#t{(YE<=Bp(dh>G|TvJ+(g_-&o8YMgj-$*z}BFqw|l#zjub;|Ljk zW!&fImy3QmX@1gA0xHURh-Kmn&fu+%Nu}tW=TP#gMv)6}CNNG<^;nCM%+Nx}%{~Lw zD^IyIACG_xsK(;aAtTEcg@Rh;`Ls?hujgi%=6{BbUx#4q8doYLxp?oYL5OzzdWlfQ zJh-&c0eB~7gEWUDD?U%2kwdc0tWo3Jv1ETT3kg1d7GN|Kqg94Lp3RFkgZCVf^?EHn%8(ZxP#B@P923dS;~tRl?2*+> zC(y@PZ1c?4l=2sGC4XWOKbStD{trn;gu%+*pGQ4w7X8I1NPVnxBZ-;0qoR1Lr07;5 z3fNW1K{4!%T+nL-3TF%C%%fRHZSt_0Byw?N;0jNgd3pmvp?k2srW?j$cP!WVK^!3i zMlMFoR@Y&)-*I(yVnI?g;1ZVjOtQu+rL1_3iO+S-%lt7Wd*VY?F~-L*d^Y zP^eN>8Z2UB6A5vBzgXh%nQbrN@p0;`jb~go7e**CJeddF*;V|^HJafeVG_A2nmK3x z^-W4ZF_ku(4?=G>gBLM7?sp!H@8l3omN|F)DtW3Vzw1=G4GajL)MC9v!X{9rpwZHu zR*0dZ+0jHgeu1GaWkkvnRL$1wuxjKUML%TK9>?NZ97S3{PpBBzRm2pyBo0-&? z61mGTVS*;{<2XI}6*N?&2S}yZWdWXRweJ2Nu6N=@VvaH2JfTtmvKR-cEGqNqC>gze zP*2DJsRV13mnt%oSYKVrvq}HAShGq=#xN&gHf^7(9?z0Vs$#tn=4hrO&nme{2+__9 zgE}&)HWujPoFrXcGX)~#bdVS#W_zaEamtig3WJ4Smh<;QB)@%wla%JY^}a0TP%lZp8!Wp|EfclSdWnPP zMTE*aV!T7L7HHmS-i?W9o=l0h^6m-+N|n(?<#9m%E~+0vBIH$sr)9(Zan0KPLg@vp zm1|uReG{htraT?UR83={1pmd{qzd)on8gwvqDD5a*aj-dv>uEK)};IG&}v#$-~JA% zx}-*XRcKw)OlK2Yv7t}rz&V>;ejz|zT0o&ySgR=MUU(=*?p!Yk+)x$CmN9+(7=EjV zB+>*0{h(YHW=+1B!>c3{)N1;g5RWnZfr2=zrS=0gNB8wI6z0*(h4u`2OOm=(p)49e~r{_{+&ATm_G9;QZe# z7t~)~y^=X#PI!sVGEQq@ueOW1jFvN2$(j4e+_e67W9EB>10kjD*E$5Zt@b#oeb;V9 zN$bM=k0v>*_*2W9nj?-jeQJH9qw(FN*ka1O1xvRBhb?)}NAUY=TQD+vKd);4u{DDE z`{7UBuU;gdSAWk|(iXY%#hL6&1tu%D>pGsBS>`8OZ*w+MT1{u;ktLh%8LHlOp1Hd3 zyx7-?s;drP(f6x7Ii*11>*2P|&%`#)iFI3>9>F14vNcjYUaZ9Q$lI3kvuh7WZKw_7 z+SQofA-G2R>8c&69Cxl{tq9@0c`u^;tj3a8*X~&*?@-Sdl6oI{$J!!$hUe@9>Mz?f zOuZEwcg&hG@6DI`@|N!fudNRTcXB4$DzcIR4#GBf2J{N9xGW*6{y-=l|zf za(PqF$GBxT8JA|xUAi-a?}-kt!cC41X`3@r^o-s=Rr?-3nJuRLe0^N_`UM^AmF@*W z%-SaVPnCCjL|r`N)$Y-z_1n-e{>8O7VcwQHPEuz$qD%vME#CgpnZIe~*MDJ8rT6^y zocPY@QR^@Lu$S%oH~M8Y|K4|LrrfghFu{k*e9E2w-*YSH@lOA}qio~usbXLBa`$pK zM)9WXQsUUjzCSxLq{Dte^!&>DUuI0pmOMNa?6$(4Vc*-sq8V3&j92I$>u1@ye1%iV zmw@9t*MD2_FR6SL3)`aarye+dW1ldANA=F1m9JMnUvv7=BOYeY!e=gZzbb`u7wvo* zc$VqJ`%I?5)mO252k&OKJv9C_d1l-C6Y~zq>iG3-35+wC(|)Ff)g|)xmz3%C@!M;1fiXG{~Qx3*35)uwuo|wNlJm%7v$|ZxR-rerxAi2PURT(`9z8jbQqW@wc*SMyk||{9X3m5`hwj+)jw0FKia)EhUr7$bca1_qnI2k zrq9{4Hbh`i$87i+Dp`rexziu+TB|!8lJ?KHOC*fws^xUp?pO&Z%ygT{8#*!a%($1}6@+jsZ9bLQMT zJLjH}kDt&}fS~W-Ef5dUkf?Ce#+#4xBuu~sFG>1-Xf80oAr5Qr3?t2pxPV1!^c4$e-l?rtm=ZthMV_HIn3&Nk_6Ny#MXi(<7LpgG9ZCUt#}bk~}B!A+sf z*}JK`pnn_Rb4zpu^UGjKwi;Aldp5Jm#n6AX^%G~y1UeH*2XEW7ZRkEx=~M=Y9n9{r zPW;~TJkQNm^nEbugkIL$`rV!Tmn}W^VVB^c1v}XppLNqhge^JX6=qeKBfb14KbV{; z-61w3;YlDU4Mg|ZDD+dYr$>61a_mTU$l$FB21W1GyaV<@;9?@kRQ9{!u3ox881fqw zxj2PS*2u?4kA`d$4N_A4Ko47G-J|_aB%yH5+mghX!Z0G%$}E?FPaAOiL$ulYymC~L z#6l;vz-NuHZLy+hn#+sL{`uiQ!QJ~~2eO0NaIQ3lQtHHuWS{&O+}&(n>BUG08fkSJ zW)mU@Ln&RfX|1n@z;^kgv3Y%A$4THJF9(n~j;N}2vAu#b?eX0Q*L8EuMPM0HmVDG~ zqdMpKyP{^UMuae8q|&t{YH5)|kKBj7c8|$_ym`-SrpHLs;)B!=eTc#rmrUob=qB@c zJXwOvUI@k4P6?r@oculLaw5vM8Bt^l-BKny2@XvY4{y>S2h`U5eiJC`Jj$PI$NRcb z9dyUuED)r$T`XjO3h_vgy@Cd3`e+~a%o6o{_+3b%9P=VK#!Zdht!)I?GIr=m=P;E5iVHQkp?%3NSH_%k9 zV}bva6u#o)<<~eWSbd9jaHeaMZJfMH4cFJqVHJWJ^Pd*yjb?%sZu|KJJ{{YVwvXxt zZYk7tKz}YR)LgZKIm{+)D)_CGo1f&NQ3HhxYkqivz8thK?&xVGhqt@$qDM@`LG<`1 z{zp7RxCx8*HTejwGcPw2Gey|W1u;HK^ct3GMlh^}AC_)s{RFn@UdipWNHhgYP;3Cc zpD{mUp4F1%l_2f=mFS*Xru-;=Mra|VtOK*3(7OAJQqbT2I0UF9rs7e7zWY5+qDO?kxzRt>mxzD2Mua^$O0Bb3pQUN8 z0N420Xi2=+(zLuqCCgb3BeW{Ybb82f^Gm1sT%D@U{+uJ}JhN^~HRl=^@n0D7ze%#4 zau)T{7PD2TWJwAwK3n58s1EokC#ps0hN%sbR{0>EKb5*JXIe0dTH!+zj?>XubWQbe zsM7|~9KANL{QQhR>#3hY{_(ayL?^RFdPA2lx1H(TZ%)-REqfDNG(eLs=fcb@a_<(0 zuQZUkAlBhN6o?QadMaAAZI9|hWQD#Do)W-J%1=JK>k)#@l@o$n>XQ5A&6PDQvRre% zQS5*OsDG^;2J!|pc?{q#7^5ER>62c)^h548%#1B-(LBmH{!r}X#y#xhmgY)>9CwSZ zK8nzkHz^)K*nRMvZ>+nqb%cwU6k;eUAEKxcrYpHQs97!eqoxOe(Ho;MfyB8jP>{Yw zyjCm0gOt0>JdFmnn;ug(SdiBMAa9I`?8>(fDv+sb&x_T0DprL!VB*zoe&(- zMK-1)_92^K2>tv^k});34N8^ITLv{X)EKVF^(v2)9+u?)K_W0X2Bz9cBPaT4LMjOT znbGtQceH`gTMRJQizW#=+}Q>yo>0UzkPU#`08R3+k0Np+SQ*%@K+=~UcIE#K$bb#L z11rdYvJZJ+iUmkB&?OId(ts2VNcYfBs|lz6@0toEUw}jn*v|a_G7O+B4hRu|fbmO_ zYXf~EQEI3NP-}t?0@{%S?G%AMiGf8gz=BnvTd)KWfCE7|)m{bR1<=Xl|4&>GN6x2n zEETJBMLywitz#pR=*`vJb41god)h(!l2wJy%aK}CB1qAA29aWXC3A6jQrdrsm8^m# zrHeZqx}xAc4%_Wku7f}Li=p+dx}@lBR#8*+^&Qi!%&<;E|Af)|b2FoOES6 ztCQYQ?6VLfJ@Bkb5w3cc*%AxmngtuurvUtR6EDg!RaDh zNA-F_(GU+gzTS9;?>Oc&i|}M=^9sO3LQglNSVrdBun8yP+w1^t<^kN?I+n=uA zzQ!6fs|=GJ(P=j;a^Nr=o?z%%RHsA6uw?K`^JIfrHA`xJncI`cGQ#;5KH(g-dC3`c zqb$HDvf>v`orXkWnacyAgXckm{{FE$tRCJ!DO;FGV9<6O@1I9bqV`f1V90x0Wbhq036^803LtwL2#7Jf=rNoq4sFY4?tQzx#mZb)FyNFq=aF8Fu{1OPg>|tvq0@?bG=2P7oM#-Y zkJp^?HLKCZdGe28T?^9Jq7sXRxKM$-wP#+7HbGNEuX!>9*U8G0tncvLmohG*zLAve zU1V<4W&1${lT?43QuIrUhd>!Y*3=`xjST%$Ic)kT8Irdf=*7t{eQysPoX7LMiq33j z&z&fTXFDF_s$o)}aq#7SD9Xp!TC9-C9i2B$9$ zB?gS)B_yLD&+|k}YVC!FBd2NU!g5{TEqevBv`v8#D>ng33@UCrbx@W|BYu*Ctc7b< z!!0#L<%TQRM5Q@IKcoH{GnPL!IGUMkrxgEI=8C2hPQ3b9B5Ki3UDmzLWg5d>AODW+_{%sdDTzESQP{wUUPn z-dI1*lwyu}I^D%^FE?zmjuk@tu(3<@6HTU7C!D@0kMp(wpt$s8Bw;dFbG(NK##*2hB>_<^ANNCWSMz;N;6ojnD4 zUy-2%(_>LwzOeG2cvh2cUhX#ry@_TtC+`>kgYCa_&W_qoUh&J-%{TQq>tlKq6GLQ6 zfA^C42h%AgBh=^bZ^t~J8&O{Vj$W!;5ohZTtD)Ts6Sp!%wfi);vL4>5w0e#qDkxc2 zd$gNXnZVQi@9zlM zEs3EYm@u_+crBo~UI-z}votcL{WRNwa(q2xykrfk7(_kA6l-awPIScjfj$H%+J7R_ zeea~bt&k@?Xem?|Y}S10SV)NS2klM257gM-i;E?0aL_>qlRJe28{0K@Z<~b|S`Arp z9Gd*EP;XOI)-YO!k`0xcEHP?&x>tOHG3wlQPEkh_&Ua{3<^JOf4y+9jJo`j`;`_?3 z{oNls?4zc;wbO+r+dmpm&3*Zf$&tFz^War@FnTtzqzjM?Hba(S$5db*26q0I$EOD- zJ%N3PL3RgyU8OdwfSt3wP@ol5V#a9vn)xM^R#kV7y7#l^bwj@Y;}0qPnuDm6d3tav zxhLMqzM3;{hu&Yw6OVo3j{^MOs~?qNNaYBb1+@+Eou{{&bBZJ11(GhPqKb>#4Pkm* zw)>LVJYG?goM%i#aUKT)*aj&bcakRw8aO8aqGgv}mcF@u!+>3F}tWl^cL z!Kt*qx3`kpeFX7IR;+fyvIvnqh3~nyVNjtF&J?5(aUl<=2eZ*45|X79jP)r;NbVKJ zJ0p9XAe|*4aFj$m1%6S|{H8r}=o%L%7hHQcK-RyxZmihSaQuLeje}LjNaQhn=aaWa zMSM5}qQ}1!c1`)6ifP>vVg_YM z_GkLjFQ1dl>&csUBjRt7w2VYAI~G3f^1~1UdQ2`>QhPs1yrAxQc-0fwcaIiWcj>EP z`qCJGY3NE9ilfZ8xe}mkvaGSqh$ugTaMt%SK~uHU(+w-~Sn(-&_b;Lj<)fo6@n@i` z^@>maK%(LLI2fz@HLv}P+ahDiiLGnVBZPAdBr1x|iOhe=12nPvoB8V9>0YSb(hZ!1 z%d?TJ()ab?O&K|2^xapHMfn_=s(i?7~u zE`dM37_UQjY+sFNul&NljAZzE{WsPJ0rRHq9HnrvPZSR>8He%U5eMST8?W4u?!wR7 z!i`#ju}h9{QVt0j89AZM|2AYoCDRTh0@6iNgcr7ju}NUv5s!pH!6Y$9Kv}sDImmci*Rc2%S0J#>e z$Qyko8r|)u$CC)wh+O%?y2s1TQY21IvDzaHat01^mGJeNR+E`$zXnq1v~gJbl1A9m z1VSvAafA=OZ#5yV>CSu(A8I`R^^<*s_h?5Ac}o>#nRF!xY2?P!s^h0UZn^qS&+kBM z(K*)yqfJY2*;K(?9k+GS z33=gien|-Lxjfe}DZ3H+&;*8}9hy9q3N_>e=NS)1ad3w)gAIx{bjsw4@(MRB-xU9{ zgJqr^#h7>~;4dpYGU2j;{t86ON%dzp1Es2-#5qp2$Pwn77R<5-leftGKFGD0d+u8l zrq?UVzdD9;egsmI!mFLa2Fp)fRAh0RQKB0DJ%efDk|gAO?^CNC9L3asUN@5gqo0C)j>0Dgb~KoB4V5C(_PzI;~Q~_!Lb$|vy6QBjq2Iv5E0eS#^fC0b|U<5D*m;g)x-vDL+bAScF z5?}?e2G{^>0d@d;fCIo0-~@06xBy%MZUA?H2f!2H1@H#=0DJ*{0DnLLAP@io1Ob8p zA%IZ8cR&~*91sDB1VjO%0Wp9dfLK5rARdqaNCYGSk^w1zR6rUa9gqRY1Y`lS0XcwN zKpr3;Pyi?d6ak6>C4f>u8K4|c0jLC20jk^PylQ&J+pHC8t@w%mKfVeI$>@2ofPoS0 zf`P&R|G3rB+`^mL+TFoEeLgaqC>=hcb|1uPaZRt#dC7i~TRP(nk`dMH&o>m&+wSc-1d|L&cb5cEvmeoBza7Jk-Zr|^*Dm{#mAXz?bC)B8A zxtm^8j6QtDlyU!B2iDl8u(voA#*N+wjXsqd-a^okehm+1)en6SeQ?cw#Uf1N;05}r z%#VlNt<#aHoPmof3vG-_(;}dH*S4h4TK~ zO7QdC-$YJi$X-!O_jEdqN@JZE^nT&?FCMA5S&gTV*>wUNDvrm&vqygBbN@gSy~j;F zot^K8VJ3*Fk;9Xh?!!8S9?4IH;kHi1z2&l8<*X&*(o&_Wl%S6^qZyM88#&MhTnfoj zadyyIyJ;B=Yb@Mn>tR@bQ>T04k_Dkr-iT`TC*3J%jqHZxBIu)dnxJ>D3XO*>#2a1z zwGtylgq3Uf`^Gk!r5njHmC|og2nN~J!=$(zT~xIQsGg^#Lrvt}42n^d1u6yM%GiaH z=YGF|^1-p)@X!P9lI)O=udbjXlUAs+@arjaof8()nS*XV;JLz9F+h|hD_58V>D@amx+df1RBrY}=_8L0;p z@VRS7O1hFa`I{CHZY;lATKN%@!Z`9GNpzirW6Dll+sne(`FL(<$58JW5WCt)SunTM zp{!fQbTEvJF*8r%RXRaLa{_g{H!=?_#Utq!! zR+h}+^tEj` zF*}lL$gSSqx8Kh@h`l3|XZCAiK@4V$-<%<}CK0Xp%D;qBCBD)*482VD8ZFM`gv&Rt za0#ly%pBT8Uxg8ex3}*tzy-WU^sb!rDO=!swy(*S;(%5CG%}oLojjU5njLuRLOB1? z`RzKvoC>FkQvVe6FW?J)4xkS!rdR1 z;;G133cRgZN5x4M`5k%V!hz4wo;vsWAe*#Pg85aln-#bBX3Yt`P4Kw)N6>>nz=;UF zh0;^+=RON!?nFxeT=)jeGJW{?ybz~$bm7Jocts<$nhrE*EWoYUyv1-ngB%6>vpYNb zm%^gv*us}Ah!VOgd!q5qPHBt~T8nXhq1vlus6FxNZTecj3U zZY<|9-;+krLy(!hK-fEsUGjV+@AVxbw=6RH6I4Uc9_~-~CLX+-PAo-cl&3&?rOOD@ z^CF~9K1q1X5)b4L3;!(yv-r+ip^eQ)2$j!N<;66}Y&Yi@8KurzL4R`(-IN3h z3rLBlE0YE0&WIpV1cqFeLykmg!+xyPL!~1c)M$0$ES#iFt1iED=aYw!+UJU;iaqMR zBm2u$Fyplxe$+7H4XOK$jQR%(W4inx4YB0gvd40%-SZTIYTnr6D1-d4SqpA8Yy2Kt z#)kL})SHtBJC%(AKK&;}p9aUk(CTLG4~C~~KRDk!-j{Mx*Z`||%D#%``0A7#nDq^( zn@ZUIK@TGro(*DU6DR0|{gs&n1yhVSPixc*6wH2E_2_!4VF=j&p?RNYeBxCe~meqy!;vf<~NS(_4wfYakC_|DXoC~Q^75;m3IB_OkQkzLV} zM1Qs}rN5qmf#Zz8Ez_lS(5&j`h`R^cTdnZUF1A&jYfT z%bbP&-FJy6e(F&gq9+L@@6*uqN6;@=yTFI*yJyItJz-<5hv{2L(eF~-prUjkP~gK; zgT}|z_+Yu;^N;Zf5+Tq{flge^8*x7#+sulUnO%QoxKEy&5F=#ptuM2GSS`~jSubXw z@A;D?jF6Atx8kNzp@A;3oC_RYI@ke9xtPdd3!@b6W@VU1cx+5q2;1Owc6?qBbah>J z1O*E_8c~j-NhxdKVuKYH!Bq8!)9U7WxD zQzTkrE<)n5chmlP${Rh9>R2|sjp^R}{55v`G8X160`vOPlAQR2yr)W|0ufxpPY0U< zMSsqmJl;`no*r@Cu55*dsazY2u|HQH<-uL_AFGjgec;Gv`Lu{ZMu1+{HHg-r=kF0j zk0#ZfUX=BqYBd&Vy8)YbG4!FzkKcuQ-^U+`Qf#VXs2Xwuz@;{WRXOLQ?THQJ-faCnN%cvEI#B_K^tD}#K`FqYboMi%|zXZ`MI#gp{c*6dS0g7epElt7UAP8Qw2goUV!!)mHGE0 ze(OqGb-p^iT?Tt&GQ8c1vAx$O@^vgkz$wztq+gL>k66!HchU1#=li?Ur>gH7HuKwJ znSV{`F#aNXTw@r)T8q`dF|+ztYYhAyqXDhRzm-mkw{C7>GwpDjSnfJgwbreyh&ZFn zcy;!U>r*3|X8Z4` zJu(NGx)Q8-GKS0wzj&Gq)JIlG=*yi|Jiu~Sb#iHV*;PizHioU-ZR}tPyHyoAGHD{z z2mR8Q;5uGnhM>}ov5slt8g4M^kn8eX=xi-Hm#X=?9*&&wZ#k()Us(?+KkR$}%s0HI zyH$c$)y$fvTVEdJ8!Jj_lPwDN?8tN)BAQY*78Ufd3wvlOq7#gEWgtCXPg4(4GzdQ) ztCo^<)@y@!LRbqL-<({AlWJwv9k$cbHfjFH-&`ek$c<=TTE(&M$G(Ii{j|&aEm?Fa3|2 zfHqHiPH+>m@}FM6ZO2J!>ilG@DoYiPgO~(T+QB3Lypb}xwyw$zH|kGuQ!I$H&V;n z?79RKG)y#;yO;a(QJxtFV#CX`8(yhZdnL^9QQjS+<;#tXbvh#)$otAmrv5EDBdnC^ z$j4D#&8SRqHikp00xIc$^(oZ}n8qwPx;!u*4k>#HzUmw50BpuI{gKg4hG}0d|C^5HC$xk}t z)z+E-v2x9=Q82BMaRv)fS!y>SUz;(q$kcVS7NGfUCW^#`|M{(&DNhx4{A0_C@k<#4 z3^Rvbhk=0e-q^^5i^z{>mpkJftT0mk+$$|(wfM|=;U9O?xOmCsIT54tjF*NLw{{q; z{gQl5z1V70Qc<{{Xz*B0>MhgK%-KasW+Qu2pmqE9NTyU7D)j$uOn5T-eLrDBY zUD^=(4C49Zh~jVIGQY<)Q$teYtZz=PPBEs9dQo@D{0{f)&u#s>jrteP2Yr{!D>@eS`r0J zjCm;aO*S+ZHr`J-OOmK=6?&~lR&tE()M#mlQczlMFMq&1?ANGn8#xj~T0*GUpk%go z6URexM42MUwi=*)KBXY`;Oap;sDr@BiUlN-MmBr1hgGj?u;F8xYNs|-QMo4TT(%|R zAqynaa7yO~?!?V4dCNJOdpwp8-ddFR>^Lw zI-K%Ib~G3+=~CCuw}g6|C~looBm~I~Ohq%ig8b^J81ZhiWoJ;o{7yvk`~J2Nmo{0# zCwualO6ftQTs|{jdF!^Ul+I|CfRE1h8njVFtuK{eclc{h97?^w>gF2t6Rh-ihxKE7 z-Vy8$>z8)smhre7&Q#=DGD=WOXWBv-VU9)44Wr3LntkM-yfwL~{!A4en1p8~6J{o1x=KM=E?@It<#Dyt%Z)-G!Yk6^>J#6(n)E6S`jW!6{0 z4@jn}CQScOW1l|3nID37pDrZpP)e1KS7Z4qrkhizG-J_3pw91kY5ae&UwF{%ws#$n z^+FtKaa;0u(oQ|=x8rp>c*{xYP-Z={rIUfUp*p4-f16xq&eo<)`KKKPQ!O2d^)jar zz}Rmf>K#Bv2^}~^L>5)eJgh+)T?RJsALH_y-GX1)-rK#AI9= z%{|!bMZ1hv=9nY*Fk@0^srOaI`mNm$wcA9y2;k~0I$&m=)&6`iNB-zY-TW5&e2yln zX{hXAy6ru>Oah6wOaCfl48BJ8{>JY3_gVuoiEyE7TOZ`T5L5>C_n@51?yH?loZ|O_ zf?zur&#`gszb>92Px>0@t(llr4qVmK*U0C17k``pUO_n325)fh_Cb_GR!ZEZwn ziO)(3-R&F1n zf$gJY@Vb8@lIw4jU-6(f(r(j?Tt6{$ly}c=GN+8+pZVKC1(kCR3?Dpt`+{IdLhqu? z4{)5`dW@p4(Ut!-V66X{_v1@j zjxm=n?n2nyj~CdN1Hrc10Q}MD%6=LR;|Khwn?g#;Hkk zMrEw=T6RIUASKOGjqGoSuvJ)*ic-lrO8OxGdWk1W*Bh#aP!@^~8~m>Fn`l}z^>49R z=j#%6`7uvIhkg=090$f_FWSU4=`)DK1w0wdQtju8>1(08_mc4Ih+SoFl?`x1SDBRB%X`F{@D4J;?fh06|`H>_tGw4Y3NFipE^&odh zW;+fG>jkgwVQ)PZZ!HmG_d_9ZiCM;#1Q8nkSgZPnE5mHWW{7@9X&a{E ziUpGAUgZh(usgvr)aXM&c#=9_5p5h!GD8z3V+~|l?)X;b!wFX_zVUt3v#?$pNiwZF zV3z1}K;o%ndtLEMJNU8VUU_VIfqmr#-!j1}tkAQF@l2g^1wHzvV81wi3_DjQU5KG} zb-;a=nLa1$bW!$e-I1@E6z&0>%(Gr{Ehp%eg8eCJ`>gS(uni%wURWi(v`eO)#tLHJ~N5ntvsV4#3JkmmTt)s%EUdri@*RE2$spz7tJ%-4@&D{Bmq8?wMk{$NQLH38)oTUY-|y5O}Qd^ z_QlZ`qJTM1%f&JjFu`Vht0fe{T{U#yQJn{@5($eQs{Y-u#POc$KxXsLieH1+_rapCU60 zJ3Q|3h@R;<>-&KZk{(i+5{APG@PAZ0>Td?+SJ)T>O(5H1&EB0nlsgIATn?Ph=n6ba zJy*ydLzDc`q|~J3gY-c{`Kx5RfLVFcrEx_xC7NjKf1DSm1|j8`yY?bicOY^8(e4rD26D!}p}8wKx&!Yd-H z6xFeNkL=~rI^&55_x$4ENiPxQ*Gal3aLCsq|t#bTaoNzl5 zoCk}(!w?UYq0}U8<{&6piHbr1H3&`5&N1$ZQ7$>1y=gSj;ilcnrk2?}ydYj#fxp`8 zXA^q!=uWNy*|BclM=06RtnJia4boKFZP$$!XzG!?*va%$>Unq!jriR~dP8D*Ouqfn zyQxtS)INur#22I>D=|d~F48&kAfXq-{Xp|{L&F0_PL?d;22Bt_HX&5Rpepvv>@K}; z!3%`a6tO&wjp~NETbK3s*)}b!Ne!E-wpzzLtQE^PYa4s@+UinM>#ZaDp;*~l6@!(5e=3?qg34|a=PR%5!#Po6nP-={bTh?O(i$J3zS(FDVs|wg zHZa{PHfb6#Im94GXcI$W>}GzYJmcsN&`I+!YaM4oCj(cC*YT`Bw{xL z1|J^lGDFzV4FAY4?sFedixa}oT5CGf7dre_Q#vbzmyJOZO5G;ibaIWAFeb3XL$WGH z<5rm#3S9$41Z9%$7}MMq-&t>T>~e@W@r1Dk$&nQ-O`gr5UQF7SS`=O+`=H=J#yi^- ztuGUAp*E;uVHUo8sPXpGvjeW47P&(thH4hbN7q~)93-*?ltwIuq+PFDHRL}sKIbD>QfBmnVo5{Y z#I>V6n^RCKESThsWppp~t(dRRI!(lHb=>7dCsq7OKqBDA^GRFuJ{-T}rx;T%xUb!n>WyA%r?AM_48 zYpTN-MrD0(m=1Ms^UJ%_ZR?sf^Q)O;6AH^rIP2JLu~A-D=X@hN3q-c}P0Xg9leQia z)R8N7bF3>(3%dOWl~hFazZUO}AdqQU+<#7k`0FN~3`d1$lxCr_sb=QDB(??zUsVXr zLh=XJpmxxaFEA58E`l>k*%JldH~w-f-TRsOPIKa03QUlJnBx7m90!r1G&(fgU-&f&@-<2)u-EHu!(!5BA9nm24&nKtcNu!coxwv8CCD5_^wi=)z13MAR=`%Eb}#B`Z69GUK+|MSDvZCYHA< zgF8O&d86_^JFn1|mmHN0G>VhB`TQfKYC9R3jF!}Eq+k!ebA#J4x|*Gr2@3OYb(rjm zBF+}W7BhP_*j^SJjsCY`RT^T01iQC^z0US!rn|P)Os;Qav9)*v|3P@TN?_8-QB{Fm z&{d1~pBQFyFN^1058-By8ILms21ud(?jkn2hR}4cn1@^z{JZSz$C4&vb4}yRDXB?R z^^KvM`8dhX1gq&*HCmlAJCFwhcZY$)Z-+>Uqp;lSO~$EI$-z>@i-2^;6GvDoov}%X zst@+B$zK&-ECdnKQ2T#FExLvkKX&g?jNRSTXQX5=(JEnACj9*LPm7G@YtQ?USM^N) z7vfA&V|)1g0=@<*>+vTeol+3Yn^)2@fC01CZ8py%V}M{PTQTUGan_*kiOm%wTH{vt4wq&W6Y=xn5v;Y?CGE-v)Vq>z*7_yGyn4 z;ECGV>T6sH^;5&XI|;J8)$+Uw?c;L>xbr4m!Dy5%zTMs)3uA#w@iz8vv9vUD49;g< zNnn%bIeI*Bw5Mqo=H~~lHG`t7e*2?!JBmhE|3$UaCc^+3c#^2qvgqkV89tpU3Sx{> z{J?dNO~r)IJN)gWYFlC~3TEYEVpK<3qnGP=PKDrw_+XG^lJA0*vyTb?!NJVEOaI}d z+IM>vNW|jWKFjgOXf=G+Xcp%&yTSXRZgmGxHdM9(z1*VeePZIlSl9JC$CG^FJbWUHfJzSyv6 z%|RtK$bGZxqvpID$=5Xw5BzjnOE<^b73&5em~W%>8)<@+C~Y)t4ZLJ-72{BpoC(uP zN5~O=&qt`z`Ie&^XGgp2Z?<3kgf|>ZwB{QGXO3XhtKFJAT7mY=3u}hYp!i`1*$?v- zb{f~`0*3?A(S?_nSHT#&A}1N~nA&e++eH(aB~(Z(;aI_@HKI$G7#`?fD2 z_el1xquE9BT;BQUb$m@Qql80K_mHKmr|gnVrp@~~KPAwDb+1p-;%hUz^-L1R#cjp! zV%io3iSKqcV2=&YnfIr=Q!>+Pk*c2J;FB|?)8IT@UV*G zes1Y3cBBIT?)fq78y20LiwS@9jHAB?@^5s$i#Rzm;;z%Cl zaatCmX%z<+^kq4If{c)xKN8x@H^hrg6S;tD09i%c>?^hObJ!JI#!!!M(qYUY3}& zluMlhwM^{nTM)1iXRu77*6l$|CH?tE6g=9t!EcB0#{ODqf3(?Cpyo01W#;n4{yo~${H~T7z(Svrp>@-{O1YVEJvx@qT&;>&pyYmlcBYhH2kW7v-Tx%J$H!mwXpD7(9 zXgG)oK`;o8j%{Du2eVI5j0#d9ab| z)fZ|!C9|JnC0Ow}t`=D!G4!v0ep;($87CcA;}K2FMpxG8ogXprvXcHxA^BeEz3fpuVkca@)cLOmAU zH(8jdx)x-18~sGKhi1?3x26{uB_Gt~*Bgn+3qHm5hb*4<680(L=s1l(S{uD@wV^ku zqAC(VMjjTveVUuWEvIX@BHo)U%7x1Mhccw&F|3GDy23*Wyv6rduwnbRW!!Y+~(1|%73wff&$N*=2v>gPC8H>K)IKfflJz_x$DYeK?lfxJYNds0&4;VPspm*bwwc@K2y-l(?f0Dg!W-w zBEGt9TKH@m{UoMt*Bdam^TDiiEXbIs-~0`nw{vi80~1Nq428_1pwNR*;R2_;zu8Kn zn$@i+awJq+*NzI=t7@pF6FpdX<=a|0A>^2ZSIj%+lfu(B@V82H#!t3UFt5U5Ia)0N zYJc?O5>SZ@3+Y&RRlev#Sby^t%WxMPQ-u<_Q3PbofLJMbj9`u|v8I~uP{$csYW?}- z=*8|A56-1Cvdgn0$rX3g_#u@X!bddI%v=&>SPpR-!j7U#)_|iEw!oBMSr}2jE@%B&mSx7OcNe4#50#0otXO)Red;=cFS_&Ee7`Py<5wWCIwD}-gt@Fw zee?6ly@qoJ+TwF7eYN`7 zzHU=JVHtdWWqtE<%i_Z=s?%qLT(e%bv|8iy)sHt9*=Ferv6MJz9n@x3a;Hz znzs4$imyD}icRaxUO)NVw61N(+z;!1mPT-IJMZIY{(;x9sdRCS=ysmQ*-^YxS1I0> ze!VWTHRSHC=yaa%Pkfyo@9nB)Pv%{uw3@c2(DZ+f~KtYIDN6X|hzr!=It&qFpX^rG;6!7==hq==|xl zJ#Bl`sYJm`32qlwb!HvNyq^AZ%GovFw`<*haMyoU$#g;eEA<<_?*DHs4Uz^fg*f-c zz;<&Nhk5EQ>0jk$yOJZUZXe&;eRu7a1?8EqV>zy5DFll-p0NE9%e~m?598fmXX-Dn zS4!}bT4$5mQpNJ%wp~o48?YCAE9sBNgz7FW7kB>BIlr^|U+I@E_exNxTF)bwQqRD7 zGT_kJ`MdU2o!h0Ocg|pfNV?yX<@3!hs?C}$cU7n1&pb7O(o?Up70a%@6jC}lSE^Jo zE%9P+cj+OENqt_t&8K!G-?3ahV^6M~!KPL99^KI^gYzHC-kF;wVW(_AGxJB+8_hch zA3gDqe#&~d@`O)>!<4P|nRU}wrAtfS();#Wr5M@$2?4e_7-x7=T-cAaBx3kfHxzP9J2@m@C*_L z&=Ps8>3!SQ`hbrtxw~zx&h%?L*D4#L9#bL#RLsD@2*gVofm=(l9$K<+&sy#2I@{Mu zF>z0u?y-GsIMW}M=?j50GhaI2biWurvFWFFtW}y`t|lnNk8Gfqq2Tl`H9?u_1v}O{ zFmV`9-?U?`l>*3R@V%!%<$?^zdU&g*^8mM$fZaOXedk&!=1EP$(=V0_i%zfHxz>UC z!JNs{$~ znts=Nmdtef-9SfN&!677du|JX!-FV+xIp!pvwbLK$UMn&^W8YdA#=Plk_pP

*xL6 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 literal 0 HcmV?d00001 diff --git a/obj/complex.o b/obj/complex.o new file mode 100644 index 0000000000000000000000000000000000000000..f050e3e35f32e3bad7478402503ee71338e8f58f GIT binary patch literal 53600 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

28CU7ioDfr>o+U}QHT+3Buac##% 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 literal 0 HcmV?d00001 diff --git a/obj/context.o b/obj/context.o new file mode 100644 index 0000000000000000000000000000000000000000..cbea66ec9fc3b3d12fe6e909aebd2c303e2325d7 GIT binary patch literal 10488 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 literal 0 HcmV?d00001 diff --git a/obj/hardware.o b/obj/hardware.o new file mode 100644 index 0000000000000000000000000000000000000000..4ac1d975898c4c0e5a7490153b948751a35b5ef1 GIT binary patch literal 3480 zcmb_dU1%It6h4#mM{C;M)*pmcSix$mc9K+uR*GyJrya0Vtpz8J9pGd?+Hc_|$^>B4`!0`J>ww!QzV*imVV}YbuF04~vGb=iIq>_jR% zx!?J|bMM@9@11vy{d-$94TNd%4Agr91vs>(?njv$g|*NI-KPKB`IiwW6WB9D{lZG} z^Ob6D^EvWZ$Y)?Zw5G@a8Y=(;t(m_OF(-`DcO*3ZBGZ}$qhtxZ z(U^lU&beS*Gz(xJpY%e)=koIu57yD2W-&ipd$9(ucojKU#nO)(3-gpv29Av`fHxmh zbvpEgvCtW$Ex>rVXfS;K30dRM1mvGPr`Y%fD0G+2_>X3OTEk-cm&e0-qpXdMmT!ds zj?T*36G7>4C95v9XIv-Vp38UxDI3}o_M7d)u9Z$WsSbdBU0qK{wmfV14Or<&=XQO& z-m$Io$*tU_nvvZTG@!k85VRvNzA}mtwmJ zM`NvsAFjt=3&QXewIZIW$KU4h$L09$d}|UZn-Kem$Jrc({`tE88y^2$*0+4d2oE84 zjmOzp5PBou+VXplgNGY7bPiX*pVdae)`m9%Kr8-KYePVj@D&oF71+6w5Ptg88s-1C2|m*VzuW}>0dbnAM+HJ-wZ(Q0pGMca_n}YLf)DL#fo~=djrgnZ5%^;SqN)7O0KN?u`&95N!LZf6 zP52haXER|@OveEy@a2V z@Vh1atc24U5_!JnIIV*`|5*jU3*%(pOL^q^Uz2co{(m&V|B>)}F|U}c>lD5i~DI(!KZk?q~PNI06jaB@~l2= zJvV6kh3DEsmhRa{JkS%CXMx_A&4TVaK_~8{Qa0WIdfM@9ecyrZZCTHX4)oFH_9{|eWu^hE(E0PK3k7xkm`Vkk~!%_1*Ime lp)H~6X&AM3ECJs?i>y=sQ(gz?j%=h~-T4 literal 0 HcmV?d00001 diff --git a/obj/kernel_cpu.o b/obj/kernel_cpu.o new file mode 100644 index 0000000000000000000000000000000000000000..21cdff3afaa5b18750f16fdbe2f603d0f12ca136 GIT binary patch literal 3488 zcmbtWUuauZ7(X|uTXpM_NQKG-^B^+Og|-T!70GOmyAMWW5ZZ#HP1B4@*H+V8?1WMw zReDM4@=&nC9{SLSJPg*yJ~(LC$u^i$rDBmHd5F;3g3(sYLuUPb=bn??+$NoW4&>bL z`+a}T`Ofb1?g#!o=Wmr&kde3c_GQukU;*vAU}VH7pchY4+Y8jFaDf>7aF4o30`Op z3k&BI76!YNW7oWee$dvmWs?(wfN}(7EeI@ag2kD}PbfbapSMxCZW$BHS`7zu*hWP( zbsNrCwAX#hSQ%}15G;bgZX!lfCsY`G9BnR`l-4gxDuvl8UjluoDo<4vsj7+{$sVJ2 z=;BKjWry4=_oza!gD#GBeJp{*NZy8pQWI#BwBj+bTdyv#8NP0YGPLsrOrd#9;cJ*K z&S8qpVj4+0_1X0<;L>vwoTG~G8Y#u5_+x6w!Q4^2c7a8`qv<6xO&1YL)dQOV0Q95fMU0~X{S37<3czqg_ zJ_Ve9H2#3j&Ykjp>S}K|=FV$y5w_Qam9e`O_SKU8U1|Rjk3u>AdpE_`8kDMz{dQ2z z?ymZu3S(~e$RYPrKpwaGiyDAEDRHHXy#sqj;x}op7-G*P494QavCBQt_s0TJrSy*& zN*o*>w23{f|pH7_q?lx5H;g zjYxD54ipv}=(!Y+48`QK|NG-d20FT9j!Z$Re}25uAdk5Oo`zJ1U$BH&!oZ`}SC=^b zdrPsZ6PqOdti&Zv5@qZM$GXbkT>k|aDCd8TZ$T{Ov~vxWW##%_Qf$MizXBV@H`{zj z%*%Mc16TW3-#1`avfb6I4$2Nz@$HnDbN?!S+!60gdja-p{4G}Dk78B4;*a+3T$`4h rmW~-xFizk{>p0_S87FsuShHOJMN(|Tc~(Bys>K&%e8d(@qBH()Dr&l@ literal 0 HcmV?d00001 diff --git a/obj/main.o b/obj/main.o new file mode 100644 index 0000000000000000000000000000000000000000..6d91d337bb4cde39424a87ba1a5a8431469cf9ea GIT binary patch literal 14048 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 ZAZ=w0W?ADB&_vmvruh4Xm+FDr{};%eWH$f+ literal 0 HcmV?d00001 diff --git a/obj/openqasm.o b/obj/openqasm.o new file mode 100644 index 0000000000000000000000000000000000000000..ff33d5531d263df2eba2f783817295a39add48e6 GIT binary patch literal 46832 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 literal 0 HcmV?d00001 diff --git a/src/.kernel.tmp.1 b/src/.kernel.tmp.1 new file mode 100644 index 0000000..2a8664f --- /dev/null +++ b/src/.kernel.tmp.1 @@ -0,0 +1,144 @@ +__kernel void kernel_dot +( + __global float* ptrR, + __global float* ptrA, + __global float* ptrB, + const int rowsA, + const int colsA, + const int rowsB, + const int colsB +) +{ + const int rowsR = rowsA; + const int colsR = colsB; + const int rowR = get_global_id(0); //{gpu_only} + const int colR = get_global_id(1); //{gpu_only} + + float rR = 0; + float iR = 0; + + for (int i = 0; i < colsA; i++) + { + const float rA = ptrA[(size_t)rowR * ((size_t)colsA * (size_t)2) + ((size_t)i * (size_t)2)]; + const float iA = ptrA[(size_t)rowR * ((size_t)colsA * (size_t)2) + ((size_t)i * (size_t)2) + (size_t)1]; + const float rB = ptrB[(size_t)i * ((size_t)colsB * (size_t)2) + ((size_t)colR * (size_t)2)]; + const float iB = ptrB[(size_t)i * ((size_t)colsB * (size_t)2) + ((size_t)colR * (size_t)2) + (size_t)1]; + + //(rA + iA)(rB + iB) + const float first = rA * rB; + const float outer = rA * iB; + const float inner = iA * rB; + const float lasts = iA * iB; + + rR += first + lasts; + iR += outer + inner; + } + ptrR[(size_t)rowR * ((size_t)colsR * (size_t)2) + ((size_t)colR * (size_t)2)] = rR; + ptrR[(size_t)rowR * ((size_t)colsR * (size_t)2) + ((size_t)colR * (size_t)2) + (size_t)1] = iR; +} + +__kernel void kernel_knk +( + __global float* ptrR, + __global float* ptrA, + __global float* ptrB, + const int rowsA, + const int colsA, + const int rowsB, + const int colsB +) +{ + const int rowsR = rowsA * rowsB; + const int colsR = colsA * colsB; + const int rowR = get_global_id(0); //{gpu_only} + for (int colR = 0; colR < colsR; colR++) + { + const int rowA = rowR / rowsB; + const int colA = colR / colsB; + const int rowB = rowR % rowsB; + const int colB = colR % colsB; + + const int posA = rowA * (colsA * 2) + (colA * 2); + const int posB = rowB * (colsB * 2) + (colB * 2); + + const float rA = ptrA[posA]; + const float iA = ptrA[posA + 1]; + const float rB = ptrB[posB]; + const float iB = ptrB[posB + 1]; + + //(rA + iA)(rB + iB) + const float first = rA * rB; + const float outer = rA * iB; + const float inner = iA * rB; + const float lasts = iA * iB; + ptrR[rowR * (colsR * 2) + (colR * 2)] = first + lasts; + ptrR[rowR * (colsR * 2) + (colR * 2) + 1] = outer + inner; + } +} + +__kernel void kernel_knk_2x2 +( + __global float* ptrR, + __global float* ptrA, + const int rowsA, + const int colsA, + const float gate0, + const float gate1, + const float gate2, + const float gate3, + const float gate4, + const float gate5, + const float gate6, + const float gate7 +) +{ + const int rowsR = rowsA * 2; + const int colsR = colsA * 2; + const int rowR = get_global_id(0) * 2; //{gpu_only} + + for (int colR = 0; colR < colsR; colR += 2) + { + const int rowA = rowR / 2; + const int colA = colR / 2; + const float rA = ptrA[(size_t)rowA * ((size_t)colsA * (size_t)2) + ((size_t)colA * (size_t)2)]; + const float iA = ptrA[(size_t)rowA * ((size_t)colsA * (size_t)2) + ((size_t)colA * (size_t)2) + (size_t)1]; + + for (int i = 0; i < 4; i++) + { + float rB, iB; + switch (i) + { + case 0: rB = gate0; iB = gate1; break; + case 1: rB = gate2; iB = gate3; break; + case 2: rB = gate4; iB = gate5; break; + case 3: rB = gate6; iB = gate7; break; + } + + //(rA + iA)(rB + iB) + const float first = rA * rB; + const float outer = rA * iB; + const float inner = iA * rB; + const float lasts = iA * iB; + switch (i) + { + case 0: + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2) + (size_t)1] = outer + inner; + break; + case 1: + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2) + (size_t)1] = outer + inner; + break; + case 2: + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2) + (size_t)1] = outer + inner; + break; + case 3: + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2) + (size_t)1] = outer + inner; + break; + } + + } + } +} diff --git a/src/.kernel.tmp.2 b/src/.kernel.tmp.2 new file mode 100644 index 0000000000000000000000000000000000000000..fd607072464755b25e62b8061b835bfd592badce GIT binary patch literal 5187 zcmds4OK+P%5bl{@v6n~?N3y|rNO5z3pWtg1A;%%k$_OGLP20%-y)&~97T6_;Ory43 zZ05D|{B}sweO47&&c2uYo{9hIec5=v$KXlRU0&X8a`upyo92`~HP!me#fhDqL~yoc zQ8$bi4XetRT8g*CZJ7^=C^=9^$;1o1S8}DbfWm8bBh0UQOjJT9DfgM6iM(Cb$cR&Z z?=ONCo6lc&PtR#tO%0Yv2rX%kp;u=&Ot>>+B-c6vZ3|4{ z2E>9V38okmL<(IqTPJoaGhQ}~b1ke-X}41;%mAEm@VwN9iTh&zA7CQ30RpPXWec1* zM+id-B51DqLhr}O2ZdrZfrxi#c`dPQE#6#kChrGC8ai=qy4=nRih)rSBinOwelQ5q z8csM_I~lcxVr1<^S<}PNChMuJrE@q|KFGuSDHCu?F5!#FUe{mHl#V1y6aQ#U@nTG% z9pKRc7nEs$CNF2~ZD2*GT-G!&lIOyj&d5IlXjlY%2s@|?WZ4jdbn?Z^Ep&hb@!q2j zkP@N^D=v;;OB(%%j=-0;IU&5^5=AX)?qFhN*ln6@VJC-na%3kj?c{Si`NB@Vw3Dyi z+Vil6eW=2KO*|V2P!|mMJ+jr^`KaCB1!#C5M)nnLh-uOzY|FNI1RfgC1|lPi9wCvr z6%oO@=t+c9!cpKFehno`6q0t#Ii2g)06CppW9L0L_Fc@;t41AslZi;qV25gP7CH3` zZ?=!HLbt0GlDq0i*>38LEv{j|f@!5efD_gKaK-MbY_sp$)@q@l78z>Gaka=$!}!!` z7vpM6L+#Q~yRxbQ#-N|-8O3N6GH)2?;@KB;E}wlt=K|Un94w(Ipq`HwwUYs5L@bU* zE5rV(KR*@$On&D>$+Dg*T^OLDt{%0K3q-kszn|rf5v1#4GTj<)`_D~mNJaT;65DfU z!o)_`A5X0C#%M{n?*^at2Kx_p?1b)2nAqhfC$`rjQ$WEniS4;_d}58uMSSHSyu+8@ D#Kf67 literal 0 HcmV?d00001 diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..29c84d5 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,13 @@ +all: + sh build.sh all + +simple: + sh build.sh simple + +commit: + git add src/ examples/ Makefile build.sh + git commit -m "`date`" + git push + +requirements: + sudo apt install libsdl2-dev diff --git a/src/build.sh b/src/build.sh new file mode 100644 index 0000000..55a98fd --- /dev/null +++ b/src/build.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +if [ "1" = "2" ] +then +echo "$1" + +echo "Verifying build commands exist..." +for i in cat grep sed xxd gcc rm printf uname +do + if ! which $i + then + echo "Could not locate $i." + exit + fi +done +echo "Verified." +echo "Building..." +cat src/kernel.cl | grep -vi '{gpu_only}' | sed -e 's/__global //' -e 's/__kernel //' > src/kernel_cpu.cl +cat src/kernel.cl | grep -vi '{cpu_only}' > src/.kernel.tmp.1 +tmp="$(cat src/.kernel.tmp.1)" +printf "%s\0" "$tmp" > src/.kernel.tmp.2 +xxd -i src/.kernel.tmp.2 | sed -e 's/src__kernel_tmp_2/kernel_gpu/' > src/kernel_gpu.cl +fi + +x86="" +if [ "$(uname -m)" = "x86_64" ] +then + x86=" -D__x86_64__" +fi +if [ "$1" = "simple" ] +then + bcmd="gcc src/main.c -g -o bin/QAnsel -lm$x86" +else + bcmd="gcc src/main.c -g -o bin/QAnsel -lm$x86 -D__PTHREAD__ -D__SDL2__ -D__OPENCL__ -I/usr/include/SDL2 -D_REENTRANT -lSDL2 -lOpenCL -pthread" +fi +echo "$bcmd" +if $($bcmd) +then + echo "Built." +else + echo "Failed." +fi +#rm -f src/.kernel* src/kernel_* diff --git a/src/bytecode.c b/src/bytecode.c index 9c95884..e6e3bb8 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -64,13 +64,17 @@ float qansel_rand_t(QAnselContext* ctx) { case QANSEL_HARDWARE_TRUERNG: r = fgetc(ctx->random_file); break; case QANSEL_HARDWARE_QUANTIS: - if (ctx->pointer >= QANSEL_QUANTIS_CHUNK_SIZE) + if (QANSEL_QUANTIS_BROKEN) { - qansel_quantis_chunk(&(ctx->chunk)); - ctx->pointer = 0; + if (ctx->pointer >= QANSEL_QUANTIS_CHUNK_SIZE) + { + qansel_quantis_chunk(&(ctx->chunk)); + ctx->pointer = 0; + } + r = ctx->chunk[ctx->pointer]; + ctx->pointer += 1; } - r = ctx->chunk[ctx->pointer]; - ctx->pointer += 1; + r = fgetc(ctx->random_file); break; case QANSEL_HARDWARE_RDSEED: r = qansel_hardware_rand(); break; } diff --git a/src/context.c b/src/context.c index a4c05ac..85ae065 100644 --- a/src/context.c +++ b/src/context.c @@ -98,11 +98,17 @@ int qanselContextBegin(QAnselContext* ctx) } else { - fclose(ctx->random_file); - ctx->random_file = NULL; + if (QANSEL_QUANTIS_BROKEN) + { + fclose(ctx->random_file); + ctx->random_file = NULL; + } if (ctx->verbose) printf("QAnsel: Hardware `Quantis` selected.\n"); ctx->hardware_rng = QANSEL_HARDWARE_QUANTIS; - ctx->pointer = QANSEL_QUANTIS_CHUNK_SIZE; + if (QANSEL_QUANTIS_BROKEN) + { + ctx->pointer = QANSEL_QUANTIS_CHUNK_SIZE; + } } } if (ctx->optimization_level & QANSEL_MODE_METAL) diff --git a/src/examples/bb84.txt b/src/examples/bb84.txt new file mode 100644 index 0000000..60a44b3 --- /dev/null +++ b/src/examples/bb84.txt @@ -0,0 +1,26 @@ +qreg q[2]; +creg c[1]; + +//Alice sends two bits 00 +h q[0]; +h q[1]; + +//Eve tries to measure the first +measure q[0] -> c[0]; + +//Bob applies the gate before measuring +h q[0]; +h q[1]; + +//The first should now be random noise +// while the second unmeasured one +// should be 0 +born; + +//In a full BB84 Alice would randomly +// apply the gate or not apply the +// gate so Eve would have to guess +// and would inevitably end up +// turning the transferred bits +// into random noise whenever there +// is a wrong guess. \ No newline at end of file diff --git a/src/examples/bellstate.txt b/src/examples/bellstate.txt new file mode 100644 index 0000000..8ad1845 --- /dev/null +++ b/src/examples/bellstate.txt @@ -0,0 +1,5 @@ +//entanglement +qreg q[2]; +h q[0]; +cx q[0], q[1]; +born q; diff --git a/src/examples/belltest_c.txt b/src/examples/belltest_c.txt new file mode 100644 index 0000000..8218c24 --- /dev/null +++ b/src/examples/belltest_c.txt @@ -0,0 +1,56 @@ +qreg q[3]; +creg c[4]; + +//Classic Strategy + +//Host generates random bits +// for the two players. +h q[0]; +h q[1]; +measure q[0] -> c[0]; +measure q[1] -> c[1]; +barrier q; + +//Player X strategy +x q[0]; + +//Player Y strategy + +//Transfer to host +measure q[0] -> c[2]; +measure q[1] -> c[3]; +barrier q; + +//a xor b +cx q[0], q[1]; +measure q[1] -> c[3]; +barrier q; + +//Load x and y +reset q[0]; + +if(c[0]==1) x q[0]; +reset q[1]; +if(c[1]==1) x q[1]; +barrier q; + +//x and y +ccx q[0], q[1], q[2]; +measure q[2] -> c[2]; +barrier q; + +//Load (a xor b) and (x and y) +reset q[0]; +if(c[2]==1) x q[0]; +reset q[1]; +if(c[3]==1) x q[1]; +barrier q; + +//(a xor b) = (x and y) +cx q[0], q[1]; +x q[1]; +barrier q; + +//Sample results +measure q[1] -> c[0]; +sample c[0]; \ No newline at end of file diff --git a/src/examples/belltest_q.txt b/src/examples/belltest_q.txt new file mode 100644 index 0000000..8dab919 --- /dev/null +++ b/src/examples/belltest_q.txt @@ -0,0 +1,67 @@ +qreg q[3]; +creg c[4]; + +//Host generates random bits +// for the two players. +h q[0]; +h q[1]; +measure q[0] -> c[0]; +measure q[1] -> c[1]; +reset q[0]; +reset q[1]; +barrier q; + +//Two players are also provided +// an entangled qubit. +h q[0]; +cx q[0], q[1]; +barrier q; + +//Player X strategy +//if(c[0]==0) do nothing +if(c[0]==1) ry(pi/2) q[0]; +barrier q; + +//Player Y strategy +if(c[1]==0) ry(pi/4) q[1]; +if(c[1]==1) ry(-pi/4) q[1]; +barrier q; + +//Transfer to host +measure q[0] -> c[2]; +measure q[1] -> c[3]; +barrier q; + +//a xor b +cx q[0], q[1]; +measure q[1] -> c[3]; +barrier q; + +//Load x and y +reset q[0]; +if(c[0]==1) x q[0]; +reset q[1]; +if(c[1]==1) x q[1]; +barrier q; + +//x and y +ccx q[0], q[1], q[2]; +measure q[2] -> c[2]; +barrier q; + +//Load (a xor b) and (x and y) +reset q[0]; +if(c[2]==1) x q[0]; +reset q[1]; +if(c[3]==1) x q[1]; +barrier q; + +//(a xor b) = (x and y) +cx q[0], q[1]; +x q[1]; +barrier q; + +//Store final results +measure q[1] -> c[0]; + +sample c[0]; \ No newline at end of file diff --git a/src/examples/bombtester.txt b/src/examples/bombtester.txt new file mode 100644 index 0000000..e38178b --- /dev/null +++ b/src/examples/bombtester.txt @@ -0,0 +1,59 @@ +qreg q[2]; +creg c[4]; + +//The paths through the circuit are designated +// as upper or lower and there are three parts +// of the circuit, the before, midway, and +// after section. The photon enters on the +// before-upper path and the bomb is placed on +// the midway-upper path, and then final +// measurements are made on the after-upper +// and after-lower path. + +//Get random bomb +h q[0]; +measure q[0] -> c[3]; +reset q[0]; + +//10: photon entering on the before-upper path +x q[1]; + +//beam splitter +cx q[0], q[1]; +ry(pi/4) q[0]; +cx q[1], q[0]; +ry(-pi/4) q[0]; +cx q[0], q[1]; + +//Measuring bomb on the upper path +if(c[3]==1) measure q[1] -> c[2]; + +//beam splitter +cx q[0], q[1]; +ry(pi/4) q[0]; +cx q[1], q[0]; +ry(-pi/4) q[0]; +cx q[0], q[1]; + +//Final measurement +measure q[0] -> c[0]; +measure q[1] -> c[1]; + +//ABCD +//A = the chosen bomb is a dud or live (placed on the midway-upper path) +//B = the bomb measures the photon (on the midway-upper path) +//C = the photon took the after-upper path +//D = the photon took the after-lower path +// +//In the case of the bomb being a dud, only CD=10 can occur. +//In the case of the bomb being live, CD=01 or CD=10 can occur. +// Notice: CD=01 can only occur if the bomb is live. +//Recall that the bomb is measured on the midway-upper path. +// This means there is a 12.5% chance that the randomly +// chosen bomb is live, the bomb measures nothing, and the +// outcome is something unique to a bomb being live (1001). +// The photon could not have taken the midway-upper path +// where the bomb is or else it would have been measured, +// yet the observer can know for certainty the bomb is +// live without interacting with it (allegedly). +sample c; diff --git a/src/examples/decoherence.sh b/src/examples/decoherence.sh new file mode 100644 index 0000000..66f3d74 --- /dev/null +++ b/src/examples/decoherence.sh @@ -0,0 +1,46 @@ +function rand +{ + RAND_NUM_HEX=$(openssl rand 4 | od -A n -t x1) + RAND_NUM_DEC=$(( 16#${RAND_NUM_HEX// /} )) + MAX_4BYTE_VAL=4294967295 + echo "scale=10; 8*a(1)*$RAND_NUM_DEC/$MAX_4BYTE_VAL" | bc -l +} + +function kick +{ + ../bin/QAnsel << HERE + qreg q[1]; + h q[0]; + u($(rand),$(rand),$(rand)) q[0]; + density q[0]; +HERE +} + + +tota="0" +totb="0" +totc="0" +totd="0" + +for i in {1..1000} +do + sample=$(kick | xargs) + a=$(echo $sample | sed 's/,.*//' | sed 's/.* //' | sed 's/i/j/') + b=$(echo $sample | sed 's/\] \[.*//' | sed 's/.*, //' | sed 's/i/j/') + c=$(echo $sample | sed 's/.*\] \[ //' | sed 's/,.*//' | sed 's/i/j/') + d=$(echo $sample | sed 's/.*, //' | sed 's/ .*//' | sed 's/i/j/') + + tota=$(python -c "print(($tota) + ($a))" | sed 's/[()]//g') + totb=$(python -c "print(($totb) + ($b))" | sed 's/[()]//g') + totc=$(python -c "print(($totc) + ($c))" | sed 's/[()]//g') + totd=$(python -c "print(($totd) + ($d))" | sed 's/[()]//g') + + outa=$(python -c "print(($tota) / ($i))" | sed 's/[()]//g' | sed 's/j/i/') + outb=$(python -c "print(($totb) / ($i))" | sed 's/[()]//g' | sed 's/j/i/') + outc=$(python -c "print(($totc) / ($i))" | sed 's/[()]//g' | sed 's/j/i/') + outd=$(python -c "print(($totd) / ($i))" | sed 's/[()]//g' | sed 's/j/i/') + + echo "[ $outa, $outb ]" + echo "[ $outc, $outd ]" + echo '---------' +done \ No newline at end of file diff --git a/src/examples/decoherence.txt b/src/examples/decoherence.txt new file mode 100644 index 0000000..2d59d95 --- /dev/null +++ b/src/examples/decoherence.txt @@ -0,0 +1,12 @@ +//Even if we don't bother reading the contents of +// q[1], the very fact the state of q[0] was +// recorded into something at all leads it +// to lose its ability to interfere with +// itself. +qreg q[2]; +creg c[1]; +h q[0]; +cx q[0], q[1]; +h q[0]; +measure q[0] -> c[0]; +sample c; diff --git a/src/examples/encryption.txt b/src/examples/encryption.txt new file mode 100644 index 0000000..51f2460 --- /dev/null +++ b/src/examples/encryption.txt @@ -0,0 +1,33 @@ +qreg q[8]; +creg c[8]; + +//bits to encrypt +h q[0]; +measure q[0] -> c[0]; +h q[1]; +measure q[1] -> c[1]; + +//encryption key +h q[2]; +measure q[2] -> c[2]; +h q[3]; +measure q[3] -> c[3]; + +//encrypt +if(c[0]==1) x q[4]; +if(c[1]==1) x q[5]; +cx q[2], q[4]; +cx q[3], q[5]; +measure q[4] -> c[4]; +measure q[5] -> c[5]; + +//decrypt +if(c[4]==1) x q[6]; +if(c[5]==1) x q[7]; +cx q[2], q[6]; +cx q[3], q[7]; +measure q[6] -> c[6]; +measure q[7] -> c[7]; + +sample c; + diff --git a/src/examples/halfadder.txt b/src/examples/halfadder.txt new file mode 100644 index 0000000..2ba484f --- /dev/null +++ b/src/examples/halfadder.txt @@ -0,0 +1,40 @@ +qreg q[3]; +creg c[2]; + +//0+0 +ccx q[0], q[1], q[2]; +cx q[0], q[1]; +measure q[1] -> c[0]; +measure q[2] -> c[1]; +print c; + +reset; + +//0+1 +x q[0]; +ccx q[0], q[1], q[2]; +cx q[0], q[1]; +measure q[1] -> c[0]; +measure q[2] -> c[1]; +print c; + +reset; + +//1+0 +x q[1]; +ccx q[0], q[1], q[2]; +cx q[0], q[1]; +measure q[1] -> c[0]; +measure q[2] -> c[1]; +print c; + +reset; + +//1+1 +x q[0]; +x q[1]; +ccx q[0], q[1], q[2]; +cx q[0], q[1]; +measure q[1] -> c[0]; +measure q[2] -> c[1]; +print c; diff --git a/src/examples/randombyte.txt b/src/examples/randombyte.txt new file mode 100644 index 0000000..eb16612 --- /dev/null +++ b/src/examples/randombyte.txt @@ -0,0 +1,11 @@ +qreg q[1]; +creg c[8]; +h q[0]; measure q[0] -> c[0]; +h q[0]; measure q[0] -> c[1]; +h q[0]; measure q[0] -> c[2]; +h q[0]; measure q[0] -> c[3]; +h q[0]; measure q[0] -> c[4]; +h q[0]; measure q[0] -> c[5]; +h q[0]; measure q[0] -> c[6]; +h q[0]; measure q[0] -> c[7]; +print c; diff --git a/src/examples/reordering.txt b/src/examples/reordering.txt new file mode 100644 index 0000000..2c23251 --- /dev/null +++ b/src/examples/reordering.txt @@ -0,0 +1,13 @@ +qreg q[13]; + +h q[12]; cx q[1], q[2]; +h q[12]; cx q[1], q[2]; +h q[12]; cx q[1], q[2]; +h q[12]; cx q[1], q[2]; +h q[12]; cx q[1], q[2]; +h q[12]; cx q[1], q[2]; +h q[12]; cx q[1], q[2]; +h q[12]; cx q[1], q[2]; +h q[12]; cx q[1], q[2]; +h q[12]; cx q[1], q[2]; +h q[12]; cx q[1], q[2]; diff --git a/src/examples/send.sh b/src/examples/send.sh new file mode 100644 index 0000000..9549658 --- /dev/null +++ b/src/examples/send.sh @@ -0,0 +1,28 @@ +#Setup +username=amihart +authkey=d080a67eb0001182051047c1dee089f08cfb3881ef9d25e9aa6b643ef1918880 +#a5b07afd5bda06e9b188a13e450b1998875ae8f4c40b04b0206152d132f12250 +service=http://foleosoft.com/QAnsel +#file="qreg q[2]; creg c[2]; h q[0]; cx q[0], q[1]; measure q[0] -> c[0]; print c[0];" +file="qreg q[2]; creg c[2]; h q[0]; cx q[0], q[1]; measure q[0] -> c[0]; print c[0];" +#Send Request +sess=ba1f34dff1b1d1cefb72282b +#$(openssl rand -hex 12) +data=$(echo -n "$file" | openssl enc -chacha20 -K $authkey -iv 00000000$sess | base64 | tr -d '\n') +dgst=$(echo -n "$data" | base64 -d | openssl sha256 -hex -mac HMAC -macopt hexkey:$authkey | cut -d '=' -f 2 | xargs) + +resp=$(curl -s -X POST -d "user=$username&sess=$sess&dgst=$dgst&data=$data" "$service") + +#Parse response +for param in user sess dgst data +do + eval $param=$(echo "$resp" | sed -e "s/.*$param=//" -e "s/&.*//") 2>/dev/null +done +if [ "$user" = "$username" ] && [ "$(echo -n "$data" | base64 -d | openssl sha256 -hex -mac HMAC -macopt hexkey:$authkey | cut -d '=' -f 2 | xargs)" = "$dgst" ] +then + echo $resp + echo -n "$data" | base64 -d | openssl enc -d -chacha20 -K $authkey -iv 00000000$sess +else + #echo "An error was encountered!" + echo "$resp" +fi diff --git a/src/examples/slow.txt b/src/examples/slow.txt new file mode 100644 index 0000000..65eb3a9 --- /dev/null +++ b/src/examples/slow.txt @@ -0,0 +1,31 @@ +//This normally runs really slow and thus is a good +// illustration of how to use various optimization +// settings. +// -o 0 No optimization +// -o 1 Threads +// -o 2 GPU +// -o 3 Threads+GPU +// -o 4 Queue +// -o 5 Queue+Threads +// -o 6 Queue+GPU +// -o 7 Queue+Threads+GPU +// +//The command queue will group together all +// consecutive single-qubit instructions. This +// program will run almost as fast as if there is +// just a single instruction. + +qreg q[12]; +h q[0]; +x q[1]; +x q[2]; +x q[3]; +x q[4]; +x q[5]; +x q[6]; +x q[7]; +x q[8]; +x q[9]; +x q[10]; +x q[11]; +born q; \ No newline at end of file diff --git a/src/examples/slower.txt b/src/examples/slower.txt new file mode 100644 index 0000000..bab3c85 --- /dev/null +++ b/src/examples/slower.txt @@ -0,0 +1,34 @@ +//This normally runs really slow and thus is a good +// illustration of how to use various optimization +// settings. +// -o 0 No optimization +// -o 1 Threads +// -o 2 GPU +// -o 3 Threads+GPU +// -o 4 Queue +// -o 5 Queue+Threads +// -o 6 Queue+GPU +// -o 7 Queue+Threads+GPU +// +//The command queue will group together all +// consecutive single-qubit instructions. If +// queueing is enabled, this program will run +// almost as fast as if there is just a single +// instruction. + +qreg q[14]; +h q[0]; +x q[1]; +x q[2]; +x q[3]; +x q[4]; +x q[5]; +x q[6]; +x q[7]; +x q[8]; +x q[9]; +x q[10]; +x q[11]; +x q[12]; +x q[13]; +born q; \ No newline at end of file diff --git a/src/examples/slowest.txt b/src/examples/slowest.txt new file mode 100644 index 0000000..25f03b0 --- /dev/null +++ b/src/examples/slowest.txt @@ -0,0 +1,24 @@ +//This will basically never finish unless you run it +// with queueing and threading enabled. It also will +// likely crash if GPU is enabled due to running +// out of GPU memory. It uses so much RAM you will +// likely need at least 32 gigabytes of swap space +// for it not to crash. +qreg q[16]; +h q[0]; +x q[1]; +x q[2]; +x q[3]; +x q[4]; +x q[5]; +x q[6]; +x q[7]; +x q[8]; +x q[9]; +x q[10]; +x q[11]; +x q[12]; +x q[13]; +x q[14]; +x q[15]; +born q; \ No newline at end of file diff --git a/src/examples/swaptest.txt b/src/examples/swaptest.txt new file mode 100644 index 0000000..7a25038 --- /dev/null +++ b/src/examples/swaptest.txt @@ -0,0 +1,9 @@ +qreg q[3]; +u(1,2,3) q[1]; +u(1,2,3) q[2]; + +h q[0]; +cswap q[0], q[1], q[2]; +h q[0]; + +born q[0]; diff --git a/src/examples/teleportation.txt b/src/examples/teleportation.txt new file mode 100644 index 0000000..68ea158 --- /dev/null +++ b/src/examples/teleportation.txt @@ -0,0 +1,31 @@ +qreg q[3]; +creg c[2]; + +//qubit to teleport +u(1.6,1.6,1.6) q[0]; +print q[0]; //show qubit to teleport + +//shared entangled qubit +h q[1]; +cx q[1], q[2]; + +//correlate qubit to teleport +cx q[0], q[1]; + +//weaken correlation +h q[0]; + +//measure qubits +measure q[0] -> c[0]; +measure q[1] -> c[1]; + +//rotate based on measurement results +if(c==1) z q[2]; +if(c==2) x q[2]; +if(c==3) x q[2]; +if(c==3) z q[2]; + +//show teleported qubit +reset q[0]; +reset q[1]; +print q[2]; diff --git a/src/hardware.c b/src/hardware.c index 20de04b..d4cf88c 100644 --- a/src/hardware.c +++ b/src/hardware.c @@ -125,8 +125,7 @@ float qansel_hardware_getseed() //return seed; } -//This card seems to have some bias so rand() is -// simply used to debias the card +//This is only used if broken mode is enabled void qansel_quantis_chunk(unsigned char** chunk) { int chunk_size = 4096; @@ -141,4 +140,4 @@ void qansel_quantis_chunk(unsigned char** chunk) (*chunk)[i + 1] = fgetc(f) ^ rand(); } fclose(f); -} \ No newline at end of file +} diff --git a/src/hardware.h b/src/hardware.h index 3ed9cfc..934ee47 100644 --- a/src/hardware.h +++ b/src/hardware.h @@ -12,6 +12,9 @@ #else #error "Unknown platform" #endif +//The Quantis card seems to not work properly with some hardware setups +//Enable BROKEN mode which can work around these issues +#define QANSEL_QUANTIS_BROKEN 0 #define QANSEL_QUANTIS_CHUNK_SIZE 4096 int qansel___get_core_count(); diff --git a/src/kernel.cl.c b/src/kernel.cl.c new file mode 100644 index 0000000..d2c71fe --- /dev/null +++ b/src/kernel.cl.c @@ -0,0 +1,405 @@ +unsigned char src_kernel_cl[] = { + 0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x64, 0x6f, 0x74, + 0x0a, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, + 0x74, 0x72, 0x52, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, + 0x20, 0x70, 0x74, 0x72, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x42, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, + 0x6f, 0x77, 0x73, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, + 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x42, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x2c, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, + 0x74, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x5f, 0x69, 0x64, 0x5f, 0x30, 0x2c, 0x20, 0x2f, 0x2f, 0x7b, 0x63, 0x70, + 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, + 0x74, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x5f, 0x69, 0x64, 0x5f, 0x31, 0x20, 0x2f, 0x2f, 0x7b, 0x63, 0x70, 0x75, + 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x29, 0x0a, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, + 0x20, 0x72, 0x6f, 0x77, 0x73, 0x52, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, + 0x73, 0x41, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, + 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, + 0x6f, 0x77, 0x52, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x20, + 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x3d, 0x20, 0x67, 0x65, + 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, + 0x31, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, 0x5f, 0x6f, + 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x52, 0x20, + 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x5f, 0x69, 0x64, 0x5f, 0x30, 0x3b, 0x20, 0x2f, 0x2f, 0x7b, 0x63, 0x70, + 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x6c, 0x52, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x5f, 0x31, 0x3b, 0x20, 0x2f, 0x2f, + 0x7b, 0x63, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x20, 0x72, 0x52, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x52, 0x20, 0x3d, + 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x52, 0x20, 0x3d, + 0x20, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x63, 0x6f, 0x6c, + 0x73, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x63, + 0x6f, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x3b, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x63, + 0x6f, 0x6c, 0x73, 0x41, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, + 0x6f, 0x73, 0x41, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2a, + 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x32, 0x29, + 0x20, 0x2b, 0x20, 0x28, 0x69, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x42, 0x20, 0x3d, + 0x20, 0x69, 0x20, 0x2a, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x20, + 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x52, + 0x20, 0x2a, 0x20, 0x32, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x20, 0x72, 0x41, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, + 0x41, 0x5b, 0x70, 0x6f, 0x73, 0x41, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x41, 0x20, 0x3d, 0x20, 0x70, 0x74, + 0x72, 0x41, 0x5b, 0x70, 0x6f, 0x73, 0x41, 0x20, 0x2b, 0x20, 0x31, 0x5d, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x42, + 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x42, 0x5b, 0x70, 0x6f, 0x73, 0x42, + 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, + 0x42, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x42, 0x5b, 0x70, 0x6f, 0x73, + 0x42, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x28, 0x72, 0x41, 0x20, 0x2b, + 0x20, 0x69, 0x41, 0x29, 0x28, 0x72, 0x42, 0x20, 0x2b, 0x20, 0x69, 0x42, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x41, 0x20, 0x2a, 0x20, 0x72, + 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, + 0x75, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x41, 0x20, 0x2a, 0x20, + 0x69, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, + 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x69, 0x41, 0x20, 0x2a, + 0x20, 0x72, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x69, 0x41, 0x20, + 0x2a, 0x20, 0x69, 0x42, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x52, 0x20, 0x2b, 0x3d, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x20, 0x2b, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x52, 0x20, 0x2b, + 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x72, 0x6f, 0x77, 0x52, + 0x20, 0x2a, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, + 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2a, + 0x20, 0x32, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x52, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x72, 0x6f, 0x77, 0x52, + 0x20, 0x2a, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, + 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2a, + 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x69, + 0x52, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e, + 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6b, 0x65, 0x72, 0x6e, + 0x65, 0x6c, 0x5f, 0x6b, 0x6e, 0x6b, 0x0a, 0x28, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x52, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x41, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, + 0x42, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, + 0x6f, 0x77, 0x73, 0x42, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, + 0x42, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x65, 0x74, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x5f, 0x30, 0x20, + 0x2f, 0x2f, 0x7b, 0x63, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, + 0x0a, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x52, + 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x72, + 0x6f, 0x77, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, + 0x52, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, + 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, + 0x52, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x20, 0x2f, 0x2f, + 0x7b, 0x67, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, + 0x20, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x5f, 0x30, 0x3b, + 0x20, 0x2f, 0x2f, 0x7b, 0x63, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x3d, 0x20, 0x30, 0x3b, + 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x3c, 0x20, 0x63, 0x6f, 0x6c, 0x73, + 0x52, 0x3b, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x2b, 0x2b, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, + 0x6f, 0x77, 0x41, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2f, + 0x20, 0x72, 0x6f, 0x77, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x41, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, + 0x52, 0x20, 0x2f, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x42, 0x20, 0x3d, 0x20, + 0x72, 0x6f, 0x77, 0x52, 0x20, 0x25, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x42, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x42, + 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x25, 0x20, 0x63, 0x6f, + 0x6c, 0x73, 0x42, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, + 0x70, 0x6f, 0x73, 0x41, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x41, 0x20, + 0x2a, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x32, + 0x29, 0x20, 0x2b, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x41, 0x20, 0x2a, 0x20, + 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x6f, + 0x73, 0x42, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x42, 0x20, 0x2a, 0x20, + 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, + 0x2b, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x42, 0x20, 0x2a, 0x20, 0x32, 0x29, + 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, + 0x41, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x41, 0x5b, 0x70, 0x6f, 0x73, + 0x41, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, + 0x69, 0x41, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x41, 0x5b, 0x70, 0x6f, + 0x73, 0x41, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x42, 0x20, 0x3d, 0x20, 0x70, 0x74, + 0x72, 0x42, 0x5b, 0x70, 0x6f, 0x73, 0x42, 0x5d, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x70, + 0x74, 0x72, 0x42, 0x5b, 0x70, 0x6f, 0x73, 0x42, 0x20, 0x2b, 0x20, 0x31, + 0x5d, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x2f, 0x2f, 0x28, 0x72, 0x41, 0x20, 0x2b, 0x20, 0x69, 0x41, 0x29, 0x28, + 0x72, 0x42, 0x20, 0x2b, 0x20, 0x69, 0x42, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x3d, + 0x20, 0x72, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, + 0x3d, 0x20, 0x72, 0x41, 0x20, 0x2a, 0x20, 0x69, 0x42, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, + 0x20, 0x3d, 0x20, 0x69, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, + 0x73, 0x20, 0x3d, 0x20, 0x69, 0x41, 0x20, 0x2a, 0x20, 0x69, 0x42, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, + 0x52, 0x5b, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x63, 0x6f, + 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, + 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x5d, 0x20, 0x3d, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x6c, 0x61, 0x73, + 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x74, 0x72, 0x52, 0x5b, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2a, 0x20, + 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, + 0x2b, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, + 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x20, 0x2b, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x5f, 0x6b, 0x65, + 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6b, 0x65, + 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x6b, 0x6e, 0x6b, 0x5f, 0x32, 0x78, 0x32, + 0x0a, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, + 0x74, 0x72, 0x52, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, + 0x20, 0x70, 0x74, 0x72, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, + 0x73, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, 0x30, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, 0x31, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, 0x32, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, 0x33, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x20, 0x67, 0x61, 0x74, 0x65, 0x34, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, + 0x67, 0x61, 0x74, 0x65, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, + 0x61, 0x74, 0x65, 0x36, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, + 0x74, 0x65, 0x37, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x65, 0x74, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x5f, 0x30, 0x20, + 0x2f, 0x2f, 0x7b, 0x63, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, + 0x0a, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x52, + 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x32, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x32, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, + 0x20, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, + 0x20, 0x2a, 0x20, 0x32, 0x3b, 0x20, 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, + 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, + 0x52, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x5f, 0x30, 0x20, 0x2a, 0x20, 0x32, 0x3b, + 0x20, 0x2f, 0x2f, 0x7b, 0x63, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, + 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, + 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x3d, 0x20, 0x30, + 0x3b, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x3c, 0x20, 0x63, 0x6f, 0x6c, + 0x73, 0x52, 0x3b, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x3d, 0x20, + 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, + 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x41, 0x20, 0x3d, 0x20, 0x72, 0x6f, + 0x77, 0x52, 0x20, 0x2f, 0x20, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x41, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, + 0x52, 0x20, 0x2f, 0x20, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, + 0x20, 0x70, 0x6f, 0x73, 0x41, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x41, + 0x20, 0x2a, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, + 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x41, 0x20, 0x2a, + 0x20, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x20, 0x72, 0x41, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x41, 0x5b, 0x70, + 0x6f, 0x73, 0x41, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x20, 0x69, 0x41, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x41, 0x5b, + 0x70, 0x6f, 0x73, 0x41, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x3b, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x28, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, + 0x69, 0x20, 0x3c, 0x20, 0x34, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x20, 0x72, 0x42, 0x2c, 0x20, 0x69, 0x42, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x28, 0x69, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x30, 0x3a, + 0x20, 0x72, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x30, 0x3b, + 0x20, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x31, 0x3b, + 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x61, 0x73, 0x65, 0x20, 0x31, 0x3a, 0x20, 0x72, 0x42, 0x20, 0x3d, + 0x20, 0x67, 0x61, 0x74, 0x65, 0x32, 0x3b, 0x20, 0x69, 0x42, 0x20, 0x3d, + 0x20, 0x67, 0x61, 0x74, 0x65, 0x33, 0x3b, 0x20, 0x62, 0x72, 0x65, 0x61, + 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, + 0x32, 0x3a, 0x20, 0x72, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, + 0x34, 0x3b, 0x20, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, + 0x35, 0x3b, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x33, 0x3a, 0x20, 0x72, 0x42, + 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x36, 0x3b, 0x20, 0x69, 0x42, + 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x37, 0x3b, 0x20, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x28, 0x72, + 0x41, 0x20, 0x2b, 0x20, 0x69, 0x41, 0x29, 0x28, 0x72, 0x42, 0x20, 0x2b, + 0x20, 0x69, 0x42, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x3d, + 0x20, 0x72, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x75, + 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x41, 0x20, 0x2a, 0x20, 0x69, + 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x69, + 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, + 0x73, 0x20, 0x3d, 0x20, 0x69, 0x41, 0x20, 0x2a, 0x20, 0x69, 0x42, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x28, 0x69, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x30, + 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, + 0x72, 0x52, 0x5b, 0x28, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2b, 0x20, 0x30, + 0x29, 0x20, 0x2a, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, + 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x63, 0x6f, 0x6c, 0x52, + 0x20, 0x2b, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x5d, 0x20, + 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x6c, 0x61, + 0x73, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x72, 0x6f, 0x77, 0x52, 0x20, + 0x2b, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x73, + 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x63, + 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x32, + 0x29, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x20, 0x2b, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x31, 0x3a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, + 0x28, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2b, 0x20, 0x30, 0x29, 0x20, 0x2a, + 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, + 0x20, 0x2b, 0x20, 0x28, 0x28, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, + 0x31, 0x29, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, + 0x72, 0x52, 0x5b, 0x28, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2b, 0x20, 0x30, + 0x29, 0x20, 0x2a, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, + 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x63, 0x6f, 0x6c, 0x52, + 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, + 0x20, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, + 0x2b, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x61, 0x73, 0x65, 0x20, 0x32, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x72, 0x6f, + 0x77, 0x52, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x63, + 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, + 0x28, 0x28, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, 0x30, 0x29, 0x20, + 0x2a, 0x20, 0x32, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x2b, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, + 0x28, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x2a, + 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, + 0x20, 0x2b, 0x20, 0x28, 0x28, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, + 0x30, 0x29, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x5d, + 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, + 0x65, 0x20, 0x33, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x72, 0x6f, 0x77, 0x52, 0x20, + 0x2b, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x73, + 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x63, + 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x32, + 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x2b, + 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x72, 0x6f, + 0x77, 0x52, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x63, + 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, + 0x28, 0x28, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, + 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x20, 0x3d, 0x20, + 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, 0x69, 0x6e, 0x6e, 0x65, + 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x00 +}; +unsigned int src_kernel_cl_len = 4823; diff --git a/src/kernel_cpu.c b/src/kernel_cpu.c index c2461a0..e2b3ba2 100644 --- a/src/kernel_cpu.c +++ b/src/kernel_cpu.c @@ -2,9 +2,9 @@ void kernel_dot ( - float* ptrR, - float* ptrA, - float* ptrB, + float* ptrR, + float* ptrA, + float* ptrB, const int rowsA, const int colsA, const int rowsB, @@ -17,7 +17,7 @@ void kernel_dot const int colsR = colsB; const int rowR = get_global_id_0; //{cpu_only} const int colR = get_global_id_1; //{cpu_only} - + float rR = 0; float iR = 0; @@ -43,9 +43,9 @@ void kernel_dot void kernel_knk ( - float* ptrR, - float* ptrA, - float* ptrB, + float* ptrR, + float* ptrA, + float* ptrB, const int rowsA, const int colsA, const int rowsB, @@ -83,8 +83,8 @@ void kernel_knk void kernel_knk_2x2 ( - float* ptrR, - float* ptrA, + float* ptrR, + float* ptrA, const int rowsA, const int colsA, const float gate0, diff --git a/src/kernel_cpu.cl b/src/kernel_cpu.cl new file mode 100644 index 0000000..b0087ae --- /dev/null +++ b/src/kernel_cpu.cl @@ -0,0 +1,148 @@ +void kernel_dot +( + float* ptrR, + float* ptrA, + float* ptrB, + const int rowsA, + const int colsA, + const int rowsB, + const int colsB + , const int get_global_id_0, //{cpu_only} + const int get_global_id_1 //{cpu_only} +) +{ + const int rowsR = rowsA; + const int colsR = colsB; + const int rowR = get_global_id_0; //{cpu_only} + const int colR = get_global_id_1; //{cpu_only} + + float rR = 0; + float iR = 0; + + for (int i = 0; i < colsA; i++) + { + const float rA = ptrA[(size_t)rowR * ((size_t)colsA * (size_t)2) + ((size_t)i * (size_t)2)]; + const float iA = ptrA[(size_t)rowR * ((size_t)colsA * (size_t)2) + ((size_t)i * (size_t)2) + (size_t)1]; + const float rB = ptrB[(size_t)i * ((size_t)colsB * (size_t)2) + ((size_t)colR * (size_t)2)]; + const float iB = ptrB[(size_t)i * ((size_t)colsB * (size_t)2) + ((size_t)colR * (size_t)2) + (size_t)1]; + + //(rA + iA)(rB + iB) + const float first = rA * rB; + const float outer = rA * iB; + const float inner = iA * rB; + const float lasts = iA * iB; + + rR += first + lasts; + iR += outer + inner; + } + ptrR[(size_t)rowR * ((size_t)colsR * (size_t)2) + ((size_t)colR * (size_t)2)] = rR; + ptrR[(size_t)rowR * ((size_t)colsR * (size_t)2) + ((size_t)colR * (size_t)2) + (size_t)1] = iR; +} + +void kernel_knk +( + float* ptrR, + float* ptrA, + float* ptrB, + const int rowsA, + const int colsA, + const int rowsB, + const int colsB + , const int get_global_id_0 //{cpu_only} +) +{ + const int rowsR = rowsA * rowsB; + const int colsR = colsA * colsB; + const int rowR = get_global_id_0; //{cpu_only} + for (int colR = 0; colR < colsR; colR++) + { + const int rowA = rowR / rowsB; + const int colA = colR / colsB; + const int rowB = rowR % rowsB; + const int colB = colR % colsB; + + const int posA = rowA * (colsA * 2) + (colA * 2); + const int posB = rowB * (colsB * 2) + (colB * 2); + + const float rA = ptrA[posA]; + const float iA = ptrA[posA + 1]; + const float rB = ptrB[posB]; + const float iB = ptrB[posB + 1]; + + //(rA + iA)(rB + iB) + const float first = rA * rB; + const float outer = rA * iB; + const float inner = iA * rB; + const float lasts = iA * iB; + ptrR[rowR * (colsR * 2) + (colR * 2)] = first + lasts; + ptrR[rowR * (colsR * 2) + (colR * 2) + 1] = outer + inner; + } +} + +void kernel_knk_2x2 +( + float* ptrR, + float* ptrA, + const int rowsA, + const int colsA, + const float gate0, + const float gate1, + const float gate2, + const float gate3, + const float gate4, + const float gate5, + const float gate6, + const float gate7 + , const int get_global_id_0 //{cpu_only} +) +{ + const int rowsR = rowsA * 2; + const int colsR = colsA * 2; + const int rowR = get_global_id_0 * 2; //{cpu_only} + + for (int colR = 0; colR < colsR; colR += 2) + { + const int rowA = rowR / 2; + const int colA = colR / 2; + const float rA = ptrA[(size_t)rowA * ((size_t)colsA * (size_t)2) + ((size_t)colA * (size_t)2)]; + const float iA = ptrA[(size_t)rowA * ((size_t)colsA * (size_t)2) + ((size_t)colA * (size_t)2) + (size_t)1]; + + for (int i = 0; i < 4; i++) + { + float rB, iB; + switch (i) + { + case 0: rB = gate0; iB = gate1; break; + case 1: rB = gate2; iB = gate3; break; + case 2: rB = gate4; iB = gate5; break; + case 3: rB = gate6; iB = gate7; break; + } + + //(rA + iA)(rB + iB) + const float first = rA * rB; + const float outer = rA * iB; + const float inner = iA * rB; + const float lasts = iA * iB; + switch (i) + { + case 0: + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2) + (size_t)1] = outer + inner; + break; + case 1: + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2) + (size_t)1] = outer + inner; + break; + case 2: + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2) + (size_t)1] = outer + inner; + break; + case 3: + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2) + (size_t)1] = outer + inner; + break; + } + + } + } +} diff --git a/src/kernel_gpu.c b/src/kernel_gpu.c index 9a61703..edacfc7 100644 --- a/src/kernel_gpu.c +++ b/src/kernel_gpu.c @@ -1,121 +1,17 @@ static unsigned char kernel_gpu[] = { - 0x0a, 0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, - 0x69, 0x64, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x64, 0x6f, - 0x74, 0x0a, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, - 0x70, 0x74, 0x72, 0x52, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x2a, 0x20, 0x70, 0x74, 0x72, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, - 0x61, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x42, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, - 0x72, 0x6f, 0x77, 0x73, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, - 0x73, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x42, 0x2c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, - 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x0a, 0x29, 0x0a, 0x7b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, - 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x52, 0x20, 0x3d, 0x20, 0x72, - 0x6f, 0x77, 0x73, 0x41, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, - 0x52, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x3b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, - 0x20, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, - 0x3b, 0x20, 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, - 0x79, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x3d, 0x20, - 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, - 0x64, 0x28, 0x31, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, - 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x52, - 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, - 0x6f, 0x61, 0x74, 0x20, 0x69, 0x52, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, - 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, - 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, - 0x61, 0x74, 0x20, 0x72, 0x41, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x41, - 0x5b, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, - 0x52, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, - 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, - 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x69, 0x20, 0x2a, 0x20, 0x28, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x5d, 0x3b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x41, 0x20, 0x3d, - 0x20, 0x70, 0x74, 0x72, 0x41, 0x5b, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, - 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, - 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, - 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, - 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, - 0x69, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, - 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, - 0x29, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x20, 0x72, 0x42, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x42, 0x5b, 0x28, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x69, 0x20, 0x2a, 0x20, 0x28, - 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, - 0x42, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, - 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, - 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, - 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x5d, 0x3b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x70, - 0x74, 0x72, 0x42, 0x5b, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, - 0x69, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, - 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, - 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, - 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, - 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, - 0x5d, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x2f, 0x2f, 0x28, 0x72, 0x41, 0x20, 0x2b, 0x20, 0x69, 0x41, 0x29, 0x28, - 0x72, 0x42, 0x20, 0x2b, 0x20, 0x69, 0x42, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x3d, - 0x20, 0x72, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, - 0x3d, 0x20, 0x72, 0x41, 0x20, 0x2a, 0x20, 0x69, 0x42, 0x3b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, - 0x20, 0x3d, 0x20, 0x69, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, - 0x73, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x69, 0x41, 0x20, 0x2a, 0x20, 0x69, - 0x42, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x52, 0x20, 0x2b, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x20, 0x2b, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x52, 0x20, 0x2b, 0x3d, 0x20, - 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, 0x69, 0x6e, 0x6e, 0x65, - 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, - 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, - 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, - 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, - 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, - 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, - 0x5f, 0x74, 0x29, 0x32, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x52, 0x3b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x73, - 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2a, - 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, - 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, - 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, - 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x28, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, - 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x5d, 0x20, 0x3d, - 0x20, 0x69, 0x52, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x5f, 0x6b, 0x65, - 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6b, 0x65, - 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x6b, 0x6e, 0x6b, 0x0a, 0x28, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x52, 0x2c, + 0x0a, 0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x2f, 0x2f, + 0x7b, 0x67, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x64, + 0x6f, 0x74, 0x0a, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, + 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x09, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x52, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x2f, 0x2f, + 0x7b, 0x67, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x09, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, - 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, + 0x6c, 0x20, 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, + 0x79, 0x7d, 0x0a, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x42, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, @@ -125,198 +21,343 @@ static unsigned char kernel_gpu[] = { 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x0a, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, - 0x77, 0x73, 0x52, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x20, - 0x2a, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, - 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x41, - 0x20, 0x2a, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, + 0x77, 0x73, 0x52, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6c, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x52, + 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x7b, + 0x67, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, - 0x72, 0x6f, 0x77, 0x52, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, + 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x31, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, - 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, - 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x3d, 0x20, 0x30, 0x3b, - 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x3c, 0x20, 0x63, 0x6f, 0x6c, 0x73, - 0x52, 0x3b, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x2b, 0x2b, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, - 0x6f, 0x77, 0x41, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2f, - 0x20, 0x72, 0x6f, 0x77, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, - 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x41, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, - 0x52, 0x20, 0x2f, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x3b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x42, 0x20, 0x3d, 0x20, - 0x72, 0x6f, 0x77, 0x52, 0x20, 0x25, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x42, + 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x20, 0x72, 0x52, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x52, 0x20, 0x3d, 0x20, + 0x30, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x28, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, + 0x69, 0x20, 0x3c, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x3b, 0x20, 0x69, + 0x2b, 0x2b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x41, 0x20, 0x3d, 0x20, 0x70, + 0x74, 0x72, 0x41, 0x5b, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, + 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, + 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, + 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x69, 0x20, + 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, + 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, + 0x41, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x41, 0x5b, 0x28, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2a, 0x20, + 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, + 0x73, 0x41, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x74, 0x29, 0x69, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x29, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x20, 0x72, 0x42, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, + 0x42, 0x5b, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x69, 0x20, + 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, + 0x6f, 0x6c, 0x73, 0x42, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2a, 0x20, + 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x5d, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x42, 0x20, + 0x3d, 0x20, 0x70, 0x74, 0x72, 0x42, 0x5b, 0x28, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x74, 0x29, 0x69, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x20, 0x2a, 0x20, + 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, + 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, + 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x74, 0x29, 0x31, 0x5d, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x28, 0x72, 0x41, 0x20, 0x2b, 0x20, 0x69, + 0x41, 0x29, 0x28, 0x72, 0x42, 0x20, 0x2b, 0x20, 0x69, 0x42, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x3d, 0x20, 0x72, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x41, 0x20, 0x2a, 0x20, 0x69, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x42, - 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x25, 0x20, 0x63, 0x6f, - 0x6c, 0x73, 0x42, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x69, 0x41, 0x20, 0x2a, 0x20, 0x72, + 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, + 0x61, 0x73, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x69, 0x41, 0x20, + 0x2a, 0x20, 0x69, 0x42, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x52, 0x20, 0x2b, 0x3d, 0x20, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x52, 0x20, + 0x2b, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2a, 0x20, + 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, + 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x5d, 0x20, 0x3d, 0x20, + 0x72, 0x52, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, + 0x5b, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, + 0x52, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, + 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, + 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, + 0x5d, 0x20, 0x3d, 0x20, 0x69, 0x52, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, + 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x2f, 0x2f, 0x7b, 0x67, + 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x6b, 0x6e, 0x6b, + 0x0a, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, 0x5f, 0x6f, + 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, + 0x20, 0x70, 0x74, 0x72, 0x52, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x2f, 0x2f, 0x7b, 0x67, + 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x09, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x41, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, + 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, + 0x0a, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, + 0x42, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, + 0x6f, 0x77, 0x73, 0x42, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, + 0x42, 0x0a, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, + 0x52, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x20, 0x2a, 0x20, + 0x72, 0x6f, 0x77, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, + 0x73, 0x52, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, + 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, + 0x77, 0x52, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x20, 0x2f, + 0x2f, 0x7b, 0x67, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x63, + 0x6f, 0x6c, 0x52, 0x20, 0x3c, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x3b, + 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x2b, 0x2b, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, + 0x41, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2f, 0x20, 0x72, + 0x6f, 0x77, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, - 0x70, 0x6f, 0x73, 0x41, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x41, 0x20, - 0x2a, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x32, - 0x29, 0x20, 0x2b, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x41, 0x20, 0x2a, 0x20, - 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6c, 0x41, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, + 0x2f, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, + 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x42, 0x20, 0x3d, 0x20, 0x72, 0x6f, + 0x77, 0x52, 0x20, 0x25, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x42, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x42, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x25, 0x20, 0x63, 0x6f, 0x6c, 0x73, + 0x42, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x6f, - 0x73, 0x42, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x42, 0x20, 0x2a, 0x20, - 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, - 0x2b, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x42, 0x20, 0x2a, 0x20, 0x32, 0x29, - 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, - 0x41, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x41, 0x5b, 0x70, 0x6f, 0x73, - 0x41, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, - 0x69, 0x41, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x41, 0x5b, 0x70, 0x6f, - 0x73, 0x41, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x42, 0x20, 0x3d, 0x20, 0x70, 0x74, - 0x72, 0x42, 0x5b, 0x70, 0x6f, 0x73, 0x42, 0x5d, 0x3b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x70, - 0x74, 0x72, 0x42, 0x5b, 0x70, 0x6f, 0x73, 0x42, 0x20, 0x2b, 0x20, 0x31, - 0x5d, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x2f, 0x2f, 0x28, 0x72, 0x41, 0x20, 0x2b, 0x20, 0x69, 0x41, 0x29, 0x28, - 0x72, 0x42, 0x20, 0x2b, 0x20, 0x69, 0x42, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x73, 0x41, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x41, 0x20, 0x2a, 0x20, + 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, + 0x2b, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x41, 0x20, 0x2a, 0x20, 0x32, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x42, + 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x42, 0x20, 0x2a, 0x20, 0x28, 0x63, + 0x6f, 0x6c, 0x73, 0x42, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, + 0x28, 0x63, 0x6f, 0x6c, 0x42, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x3b, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x41, 0x20, + 0x3d, 0x20, 0x70, 0x74, 0x72, 0x41, 0x5b, 0x70, 0x6f, 0x73, 0x41, 0x5d, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x41, + 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x41, 0x5b, 0x70, 0x6f, 0x73, 0x41, + 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x20, 0x72, 0x42, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x42, + 0x5b, 0x70, 0x6f, 0x73, 0x42, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x20, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, + 0x42, 0x5b, 0x70, 0x6f, 0x73, 0x42, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x3b, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, + 0x28, 0x72, 0x41, 0x20, 0x2b, 0x20, 0x69, 0x41, 0x29, 0x28, 0x72, 0x42, + 0x20, 0x2b, 0x20, 0x69, 0x42, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x72, + 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, + 0x72, 0x41, 0x20, 0x2a, 0x20, 0x69, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x3d, - 0x20, 0x72, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x3d, + 0x20, 0x69, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, - 0x3d, 0x20, 0x72, 0x41, 0x20, 0x2a, 0x20, 0x69, 0x42, 0x3b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, - 0x20, 0x3d, 0x20, 0x69, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, - 0x73, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x69, 0x41, 0x20, 0x2a, 0x20, 0x69, - 0x42, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x70, 0x74, 0x72, 0x52, 0x5b, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2a, 0x20, - 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, - 0x2b, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, - 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x2b, 0x20, - 0x6c, 0x61, 0x73, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x72, 0x6f, 0x77, 0x52, - 0x20, 0x2a, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, - 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2a, - 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x6f, - 0x75, 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, - 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, - 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x6b, 0x6e, 0x6b, 0x5f, - 0x32, 0x78, 0x32, 0x0a, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x2a, 0x20, 0x70, 0x74, 0x72, 0x52, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, - 0x61, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x41, 0x2c, 0x0a, 0x20, 0x20, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, 0x20, + 0x3d, 0x20, 0x2d, 0x28, 0x69, 0x41, 0x20, 0x2a, 0x20, 0x69, 0x42, 0x29, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, + 0x72, 0x52, 0x5b, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x63, + 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, + 0x28, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x5d, 0x20, + 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x6c, 0x61, + 0x73, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2a, + 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, + 0x20, 0x2b, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x32, + 0x29, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x20, 0x2b, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x5f, 0x6b, + 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, + 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x6b, 0x6e, 0x6b, 0x5f, 0x32, + 0x78, 0x32, 0x0a, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, + 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x09, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x52, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x2f, 0x2f, + 0x7b, 0x67, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x09, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x41, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, + 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, - 0x72, 0x6f, 0x77, 0x73, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, - 0x73, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, + 0x61, 0x74, 0x65, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, + 0x74, 0x65, 0x31, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, + 0x65, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, - 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, 0x31, + 0x33, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, 0x34, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, 0x32, 0x2c, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, - 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, 0x33, 0x2c, 0x0a, + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, 0x36, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, - 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, 0x34, 0x2c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, - 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, 0x35, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, - 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, 0x36, 0x2c, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x20, 0x67, 0x61, 0x74, 0x65, 0x37, 0x0a, 0x29, 0x0a, 0x7b, 0x0a, 0x20, + 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, 0x37, 0x0a, 0x29, 0x0a, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x52, 0x20, 0x3d, 0x20, + 0x72, 0x6f, 0x77, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, - 0x20, 0x72, 0x6f, 0x77, 0x73, 0x52, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, + 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, - 0x6c, 0x73, 0x52, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, - 0x2a, 0x20, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x52, 0x20, - 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x32, 0x3b, 0x20, - 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, - 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, - 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x3d, 0x20, 0x30, 0x3b, - 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x3c, 0x20, 0x63, 0x6f, 0x6c, 0x73, - 0x52, 0x3b, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x3d, 0x20, 0x32, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, - 0x74, 0x20, 0x72, 0x6f, 0x77, 0x41, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, - 0x52, 0x20, 0x2f, 0x20, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, - 0x20, 0x63, 0x6f, 0x6c, 0x41, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x52, - 0x20, 0x2f, 0x20, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, - 0x74, 0x20, 0x72, 0x41, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x41, 0x5b, - 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x41, - 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, - 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, - 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, - 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x41, 0x20, 0x2a, - 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x5d, - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x41, - 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x41, 0x5b, 0x28, 0x73, 0x69, 0x7a, - 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x41, 0x20, 0x2a, 0x20, 0x28, - 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, + 0x77, 0x52, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x20, 0x2a, 0x20, + 0x32, 0x3b, 0x20, 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, 0x5f, 0x6f, 0x6e, + 0x6c, 0x79, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x3d, + 0x20, 0x30, 0x3b, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x3c, 0x20, 0x63, + 0x6f, 0x6c, 0x73, 0x52, 0x3b, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, + 0x3d, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x41, 0x20, 0x3d, 0x20, + 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2f, 0x20, 0x32, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x41, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6c, 0x52, 0x20, 0x2f, 0x20, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x41, 0x20, 0x3d, 0x20, 0x70, 0x74, + 0x72, 0x41, 0x5b, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, + 0x6f, 0x77, 0x41, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x28, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, + 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x41, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, - 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, - 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x41, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, - 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x73, - 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x5d, 0x3b, 0x0a, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, - 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, - 0x20, 0x3c, 0x20, 0x34, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, - 0x61, 0x74, 0x20, 0x72, 0x42, 0x2c, 0x20, 0x69, 0x42, 0x3b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x28, 0x69, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, + 0x32, 0x29, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x20, 0x69, 0x41, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x41, 0x5b, 0x28, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x41, 0x20, + 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, + 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x41, 0x20, 0x2a, 0x20, + 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, + 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x5d, 0x3b, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, + 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x34, 0x3b, 0x20, 0x69, 0x2b, 0x2b, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x42, 0x2c, 0x20, 0x69, 0x42, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x28, 0x69, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, + 0x30, 0x3a, 0x20, 0x72, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, + 0x30, 0x3b, 0x20, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, + 0x31, 0x3b, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x31, 0x3a, 0x20, 0x72, 0x42, + 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x32, 0x3b, 0x20, 0x69, 0x42, + 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x33, 0x3b, 0x20, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, + 0x65, 0x20, 0x32, 0x3a, 0x20, 0x72, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, + 0x74, 0x65, 0x34, 0x3b, 0x20, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, + 0x74, 0x65, 0x35, 0x3b, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x30, 0x3a, 0x20, - 0x72, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x30, 0x3b, 0x20, - 0x69, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x31, 0x3b, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x33, 0x3a, 0x20, + 0x72, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x36, 0x3b, 0x20, + 0x69, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x37, 0x3b, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, + 0x28, 0x72, 0x41, 0x20, 0x2b, 0x20, 0x69, 0x41, 0x29, 0x28, 0x72, 0x42, + 0x20, 0x2b, 0x20, 0x69, 0x42, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x20, 0x3d, 0x20, 0x72, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, + 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x41, 0x20, 0x2a, + 0x20, 0x69, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x3d, + 0x20, 0x69, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x61, + 0x73, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x69, 0x41, 0x20, 0x2a, + 0x20, 0x69, 0x42, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x20, 0x28, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x61, 0x73, 0x65, 0x20, 0x31, 0x3a, 0x20, 0x72, 0x42, 0x20, 0x3d, 0x20, - 0x67, 0x61, 0x74, 0x65, 0x32, 0x3b, 0x20, 0x69, 0x42, 0x20, 0x3d, 0x20, - 0x67, 0x61, 0x74, 0x65, 0x33, 0x3b, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x32, - 0x3a, 0x20, 0x72, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x34, - 0x3b, 0x20, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x35, - 0x3b, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x61, 0x73, 0x65, 0x20, 0x30, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x33, 0x3a, 0x20, 0x72, 0x42, 0x20, - 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x36, 0x3b, 0x20, 0x69, 0x42, 0x20, - 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x37, 0x3b, 0x20, 0x62, 0x72, 0x65, + 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x28, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2b, 0x20, + 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x30, 0x29, 0x20, 0x2a, + 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, + 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, + 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x30, 0x29, 0x20, 0x2a, + 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x5d, + 0x20, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x6c, + 0x61, 0x73, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x28, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2b, 0x20, 0x28, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x30, 0x29, 0x20, 0x2a, 0x20, + 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, + 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, 0x28, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x30, 0x29, 0x20, 0x2a, 0x20, + 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, + 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x5d, 0x20, + 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x28, 0x72, 0x41, - 0x20, 0x2b, 0x20, 0x69, 0x41, 0x29, 0x28, 0x72, 0x42, 0x20, 0x2b, 0x20, - 0x69, 0x42, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, - 0x6f, 0x61, 0x74, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x3d, 0x20, - 0x72, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, - 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x41, 0x20, 0x2a, 0x20, 0x69, 0x42, - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, - 0x74, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x69, 0x41, - 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, - 0x20, 0x3d, 0x20, 0x2d, 0x28, 0x69, 0x41, 0x20, 0x2a, 0x20, 0x69, 0x42, - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x28, 0x69, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, - 0x20, 0x30, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x31, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, @@ -325,7 +366,7 @@ static unsigned char kernel_gpu[] = { 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, - 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, + 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, @@ -337,43 +378,43 @@ static unsigned char kernel_gpu[] = { 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, - 0x65, 0x5f, 0x74, 0x29, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, + 0x65, 0x5f, 0x74, 0x29, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x31, 0x3a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x32, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, - 0x74, 0x29, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, + 0x74, 0x29, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, - 0x74, 0x29, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, + 0x74, 0x29, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, - 0x29, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, + 0x29, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, - 0x29, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x29, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x32, 0x3a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x33, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, @@ -382,7 +423,7 @@ static unsigned char kernel_gpu[] = { 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, - 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x30, + 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, @@ -394,44 +435,14 @@ static unsigned char kernel_gpu[] = { 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, - 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x30, 0x29, + 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, - 0x61, 0x73, 0x65, 0x20, 0x33, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x28, 0x73, 0x69, - 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2b, 0x20, - 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x29, 0x20, 0x2a, - 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, - 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, - 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x73, 0x69, - 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, - 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x29, 0x20, 0x2a, - 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x5d, - 0x20, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x6c, - 0x61, 0x73, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x28, 0x73, 0x69, 0x7a, - 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2b, 0x20, 0x28, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x29, 0x20, 0x2a, 0x20, - 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, - 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, - 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x73, 0x69, 0x7a, - 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, 0x28, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x29, 0x20, 0x2a, 0x20, - 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, - 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x5d, 0x20, - 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, 0x69, 0x6e, - 0x6e, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, - 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x7d, - 0x00 -}; -static unsigned int kernel_gpu_len = 5197; + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x7d, 0x0a +, 0x00 }; diff --git a/src/kernel_gpu.cl b/src/kernel_gpu.cl new file mode 100644 index 0000000..47bf476 --- /dev/null +++ b/src/kernel_gpu.cl @@ -0,0 +1,436 @@ +unsigned char kernel_gpu[] = { + 0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x64, 0x6f, 0x74, + 0x0a, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, + 0x74, 0x72, 0x52, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, + 0x20, 0x70, 0x74, 0x72, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x42, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, + 0x6f, 0x77, 0x73, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, + 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x42, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x0a, 0x29, 0x0a, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, + 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x52, 0x20, 0x3d, 0x20, 0x72, 0x6f, + 0x77, 0x73, 0x41, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x52, + 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, + 0x72, 0x6f, 0x77, 0x52, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, + 0x20, 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x3d, 0x20, 0x67, + 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, + 0x28, 0x31, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, 0x5f, + 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x52, 0x20, + 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x20, 0x69, 0x52, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, + 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, + 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x20, 0x72, 0x41, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x41, 0x5b, + 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, + 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, + 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x69, 0x20, 0x2a, 0x20, 0x28, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x5d, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x41, 0x20, 0x3d, 0x20, + 0x70, 0x74, 0x72, 0x41, 0x5b, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, + 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, + 0x2b, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x69, + 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, + 0x29, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, + 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, + 0x72, 0x42, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x42, 0x5b, 0x28, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x69, 0x20, 0x2a, 0x20, 0x28, 0x28, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x42, + 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, + 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x70, 0x74, + 0x72, 0x42, 0x5b, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x69, + 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, + 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2a, + 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, + 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x5d, + 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, + 0x2f, 0x28, 0x72, 0x41, 0x20, 0x2b, 0x20, 0x69, 0x41, 0x29, 0x28, 0x72, + 0x42, 0x20, 0x2b, 0x20, 0x69, 0x42, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x3d, 0x20, + 0x72, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x3d, + 0x20, 0x72, 0x41, 0x20, 0x2a, 0x20, 0x69, 0x42, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x20, + 0x3d, 0x20, 0x69, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, + 0x20, 0x3d, 0x20, 0x69, 0x41, 0x20, 0x2a, 0x20, 0x69, 0x42, 0x3b, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x52, 0x20, + 0x2b, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x6c, + 0x61, 0x73, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x52, 0x20, 0x2b, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x20, 0x2b, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, + 0x52, 0x5b, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, + 0x77, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, + 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, + 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, + 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x52, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, + 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, + 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, + 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x29, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x69, 0x52, 0x3b, + 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, + 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, + 0x5f, 0x6b, 0x6e, 0x6b, 0x0a, 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x52, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x41, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x42, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, + 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, + 0x73, 0x42, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x0a, + 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x52, 0x20, + 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x6f, + 0x77, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x52, + 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x63, + 0x6f, 0x6c, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x52, + 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x7b, + 0x67, 0x70, 0x75, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x6c, 0x52, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x63, 0x6f, 0x6c, + 0x52, 0x20, 0x3c, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x3b, 0x20, 0x63, + 0x6f, 0x6c, 0x52, 0x2b, 0x2b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x41, 0x20, + 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2f, 0x20, 0x72, 0x6f, 0x77, + 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x6c, 0x41, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2f, 0x20, + 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, + 0x20, 0x72, 0x6f, 0x77, 0x42, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x52, + 0x20, 0x25, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x42, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x42, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6c, 0x52, 0x20, 0x25, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x3b, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x41, + 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x41, 0x20, 0x2a, 0x20, 0x28, 0x63, + 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, + 0x28, 0x63, 0x6f, 0x6c, 0x41, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x42, 0x20, 0x3d, + 0x20, 0x72, 0x6f, 0x77, 0x42, 0x20, 0x2a, 0x20, 0x28, 0x63, 0x6f, 0x6c, + 0x73, 0x42, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x63, + 0x6f, 0x6c, 0x42, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x3b, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x41, 0x20, 0x3d, 0x20, + 0x70, 0x74, 0x72, 0x41, 0x5b, 0x70, 0x6f, 0x73, 0x41, 0x5d, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x41, 0x20, 0x3d, + 0x20, 0x70, 0x74, 0x72, 0x41, 0x5b, 0x70, 0x6f, 0x73, 0x41, 0x20, 0x2b, + 0x20, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x20, 0x72, 0x42, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x42, 0x5b, 0x70, + 0x6f, 0x73, 0x42, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x20, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x42, 0x5b, + 0x70, 0x6f, 0x73, 0x42, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x3b, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x28, 0x72, + 0x41, 0x20, 0x2b, 0x20, 0x69, 0x41, 0x29, 0x28, 0x72, 0x42, 0x20, 0x2b, + 0x20, 0x69, 0x42, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x41, 0x20, + 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x41, + 0x20, 0x2a, 0x20, 0x69, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x69, + 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, 0x20, 0x3d, 0x20, + 0x69, 0x41, 0x20, 0x2a, 0x20, 0x69, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x72, 0x6f, + 0x77, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, + 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x63, 0x6f, 0x6c, 0x52, + 0x20, 0x2a, 0x20, 0x32, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x20, 0x2b, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, + 0x5b, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x63, 0x6f, 0x6c, + 0x73, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x63, + 0x6f, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x31, + 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, + 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, + 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, + 0x5f, 0x6b, 0x6e, 0x6b, 0x5f, 0x32, 0x78, 0x32, 0x0a, 0x28, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x52, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, + 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x20, 0x67, 0x61, 0x74, 0x65, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, + 0x67, 0x61, 0x74, 0x65, 0x31, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, + 0x61, 0x74, 0x65, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, + 0x74, 0x65, 0x33, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, + 0x65, 0x34, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, + 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, 0x36, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x61, 0x74, 0x65, 0x37, 0x0a, + 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x52, 0x20, + 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x32, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x32, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, + 0x72, 0x6f, 0x77, 0x52, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x20, + 0x2a, 0x20, 0x32, 0x3b, 0x20, 0x2f, 0x2f, 0x7b, 0x67, 0x70, 0x75, 0x5f, + 0x6f, 0x6e, 0x6c, 0x79, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x52, + 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x3c, + 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x3b, 0x20, 0x63, 0x6f, 0x6c, 0x52, + 0x20, 0x2b, 0x3d, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x41, 0x20, + 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2f, 0x20, 0x32, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x41, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2f, 0x20, 0x32, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x41, 0x20, 0x3d, 0x20, + 0x70, 0x74, 0x72, 0x41, 0x5b, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x29, 0x72, 0x6f, 0x77, 0x41, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, + 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, + 0x2b, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, + 0x6f, 0x6c, 0x41, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x74, 0x29, 0x32, 0x29, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x20, 0x69, 0x41, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x41, + 0x5b, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, + 0x41, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x41, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x41, 0x20, + 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, + 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, + 0x5d, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x34, 0x3b, 0x20, 0x69, + 0x2b, 0x2b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x42, 0x2c, 0x20, + 0x69, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x28, + 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, + 0x65, 0x20, 0x30, 0x3a, 0x20, 0x72, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, + 0x74, 0x65, 0x30, 0x3b, 0x20, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, + 0x74, 0x65, 0x31, 0x3b, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x31, 0x3a, 0x20, + 0x72, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x32, 0x3b, 0x20, + 0x69, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x33, 0x3b, 0x20, + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x61, 0x73, 0x65, 0x20, 0x32, 0x3a, 0x20, 0x72, 0x42, 0x20, 0x3d, 0x20, + 0x67, 0x61, 0x74, 0x65, 0x34, 0x3b, 0x20, 0x69, 0x42, 0x20, 0x3d, 0x20, + 0x67, 0x61, 0x74, 0x65, 0x35, 0x3b, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x33, + 0x3a, 0x20, 0x72, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x36, + 0x3b, 0x20, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x67, 0x61, 0x74, 0x65, 0x37, + 0x3b, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x2f, 0x2f, 0x28, 0x72, 0x41, 0x20, 0x2b, 0x20, 0x69, 0x41, 0x29, 0x28, + 0x72, 0x42, 0x20, 0x2b, 0x20, 0x69, 0x42, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x41, + 0x20, 0x2a, 0x20, 0x69, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, + 0x20, 0x3d, 0x20, 0x69, 0x41, 0x20, 0x2a, 0x20, 0x72, 0x42, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, + 0x6c, 0x61, 0x73, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x69, 0x41, 0x20, 0x2a, + 0x20, 0x69, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, + 0x28, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, + 0x73, 0x65, 0x20, 0x30, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x28, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2b, 0x20, 0x28, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x30, 0x29, 0x20, 0x2a, 0x20, + 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, + 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, 0x28, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x30, 0x29, 0x20, 0x2a, 0x20, + 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x5d, 0x20, + 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x6c, 0x61, + 0x73, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, + 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, + 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, + 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, + 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x5d, 0x20, 0x3d, + 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, 0x69, 0x6e, 0x6e, + 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, + 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, + 0x31, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, + 0x74, 0x72, 0x52, 0x5b, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x29, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, + 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, + 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x29, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, + 0x72, 0x52, 0x5b, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, + 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x74, 0x29, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, + 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, + 0x2b, 0x20, 0x28, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, + 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x74, 0x29, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x75, + 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x32, 0x3a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, + 0x5b, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, + 0x77, 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x29, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, + 0x28, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, + 0x6c, 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x29, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x74, 0x29, 0x32, 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x2b, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, + 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, + 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, + 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, + 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, + 0x52, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, + 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x74, 0x29, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, + 0x20, 0x2b, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x33, 0x3a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x28, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, + 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x29, + 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, + 0x63, 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, + 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x29, + 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, + 0x29, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x2b, + 0x20, 0x6c, 0x61, 0x73, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x52, 0x5b, 0x28, 0x28, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x72, 0x6f, 0x77, 0x52, 0x20, 0x2b, + 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x29, 0x20, + 0x2a, 0x20, 0x28, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, + 0x6f, 0x6c, 0x73, 0x52, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x74, 0x29, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x28, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x63, 0x6f, 0x6c, 0x52, 0x20, 0x2b, + 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, 0x29, 0x20, + 0x2a, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x32, 0x29, + 0x20, 0x2b, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x29, 0x31, + 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, + 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x7d, 0x00 +}; +unsigned int kernel_gpu_len = 5187; -- 2.39.5