mlang pushed a commit to branch externals/chess in repository elpa. commit 3ba4ea465affe6de3b15ff02b341e470152ab975 Author: Mario Lang <ml...@delysid.org> Date: Mon May 26 20:21:10 2014 +0200
Fix chess-polyglot to work on 32-bit Emacsen. Splitting 64-bit values up into 32-bit fixnums does not always work on 32-bit Emacsen due to the tagging bits. A key is now a list of 4 16-bit values, instead of a cons of 32-bit values. --- NEWS | 17 ++- chess-polyglot.el | 563 +++++++++++++++++++++++++++-------------------------- 2 files changed, 297 insertions(+), 283 deletions(-) diff --git a/NEWS b/NEWS index 2f82b12..6a359e7 100644 --- a/NEWS +++ b/NEWS @@ -1,11 +1,20 @@ --*- mode: text; outline-layout: (1 :) -*- - This is the NEWS file for Emacs Chess, a chess client and analysis library written in Emacs Lisp. -Please note that proper documentation is still on its way. -* Release 2.0: +* Release 2.0.1: + +** chess-polyglot now works on 32-bit platforms. + + +* Release 2.0.0: Began keeping this file. See doc/chess.info for information about Emacs Chess. + + +Local variables: +coding: utf-8 +mode: outline +paragraph-separate: "[ ]*$" +end: diff --git a/chess-polyglot.el b/chess-polyglot.el index f1e5d44..a6be4ae 100644 --- a/chess-polyglot.el +++ b/chess-polyglot.el @@ -23,7 +23,7 @@ ;; The polyglot book format uses a 64 bit zorbist hash to encode positions. ;; Since 2 bits are used for tagging in Emacs Lisp, 64 bit values can not be ;; represented as fixnums. So we split the 64 bit value up into equally sized -;; chunks (32 bit fixnums for now). 781 predefined zorbist hash keys are +;; chunks (16 bit fixnums). 781 predefined zorbist hash keys are ;; stored as constants (see `chess-polyglot-zorbist-keys') and used to calculate ;; zorbist hashes from positions. @@ -74,9 +74,9 @@ polyglot book file.") (defsubst chess-polyglot-read-key () "Read a polyglot position hash (a 64 bit value) from the current buffer. -A `cons' with the most significant 32 bits in `car' and the least significant -32 bits in `cdr' is returned." - (cons (chess-polyglot-read-octets 4) (chess-polyglot-read-octets 4))) +A list with 16-bit values (most significant first) is returned." + (list (chess-polyglot-read-octets 2) (chess-polyglot-read-octets 2) + (chess-polyglot-read-octets 2) (chess-polyglot-read-octets 2))) (defun chess-polyglot-read-move () "Read a polyglot move (a 32 bit value) from the current buffer. @@ -133,8 +133,11 @@ On reaching end or beginning of buffer, stop and signal error." (defsubst chess-polyglot-key-<= (lhs rhs) "Non-nil if the polyglot key LHS is less than or equal to RHS." - (or (< (car lhs) (car rhs)) - (and (= (car lhs) (car rhs)) (<= (cdr lhs) (cdr rhs))))) + (while (and lhs rhs (= (car lhs) (car rhs))) + (setq lhs (cdr lhs) rhs (cdr rhs))) + (if (and (null lhs) (null rhs)) + t + (<= (car lhs) (car rhs)))) (defun chess-polyglot-read-moves (key) "Read all moves associated with KEY from the current buffer." @@ -157,271 +160,267 @@ On reaching end or beginning of buffer, stop and signal error." moves)) (defconst chess-polyglot-zorbist-keys - [(2637767806 . 863464769) (720845184 . 95069639) (1155203408 . 610415943) - (2618685246 . 1655139042) (1971536997 . 1218186377) (848342074 . 540017087) - (263957791 . 1627660921) (3896152207 . 4076560586) (226391645 . 1484086288) - (436746274 . 3467632685) (2516964848 . 3797861296) (3491888988 . 3510251221) - (1086189917 . 1248276018) (18044180 . 1876255637) (1572111136 . 1190386149) - (597658413 . 2146900428) (97624494 . 2243205793) (1738507407 . 1854916977) - (1950989311 . 2149575947) (2098318769 . 3283594736) (2194108574 . 2015279052) - (4079062812 . 2500884588) (856979699 . 2941369318) (1270058469 . 3877737539) - (2858720366 . 3170717948) (2378012835 . 1387254795) (2278688587 . 2178388503) - (435406673 . 3555273441) (3031118064 . 1655806655) (2063925420 . 1107589828) - (3376753832 . 436852829) (615148625 . 1302492416) (1285502018 . 1963045959) - (346460119 . 1016137793) (2803604355 . 1176288659) (55085973 . 2968618255) - (1669016372 . 4287873088) (164740250 . 1037634196) (896886403 . 883023163) - (1935551383 . 2764331555) (410153072 . 4055711755) (533441746 . 1505690343) - (3541084098 . 3466290517) (3214426080 . 4267541060) (2675233103 . 1951705124) - (1374411850 . 3115986997) (1552073989 . 3684348154) (4244110986 . 875606593) - (844343081 . 3115990494) (2356462440 . 135999605) (3116133511 . 377238503) - (2129956651 . 2197966368) (299173332 . 3276914047) (1701379241 . 745972291) - (1306570996 . 254977976) (2530644806 . 214138461) (1122123979 . 1667800879) - (1831591130 . 3801192033) (1116211970 . 920967505) (1594837592 . 2551651254) - (972591349 . 2046373768) (2479207924 . 1935030411) (1675376029 . 2367888248) - (3960916618 . 3935874422) (1398143232 . 3265801671) (133930885 . 1520005442) - (1351827834 . 2829577566) (2076951437 . 2723839804) (435980918 . 2364847828) - (1668970368 . 3738157273) (2185864314 . 3993911799) (2041407829 . 31969768) - (346864372 . 2004703094) (4047877822 . 3437142421) (3669961416 . 538399484) - (616810829 . 4190688246) (3144558884 . 4030272234) (216165387 . 2513010905) - (2761740594 . 3216997572) (3919406634 . 4096014649) (669429112 . 2434161727) - (2234904640 . 3111407601) (1421079802 . 1598085235) (1924213810 . 310373675) - (4002762044 . 2067865415) (2592451728 . 2586110625) (1890340057 . 4031717877) - (4189625662 . 2577429954) (2276713138 . 3049850801) (2741429688 . 3310307512) - (2924122950 . 3426712818) (421576781 . 1193704381) (2277442246 . 3030264553) - (153237420 . 595540057) (4278711886 . 4176286928) (2380848297 . 4030514510) - (2618700582 . 1303682185) (3018992701 . 185284845) (957243316 . 1291916363) - (1543415220 . 1898408169) (504378001 . 531073412) (2591337657 . 1692896435) - (1333852064 . 903543556) (1661259930 . 188168388) (561112646 . 2197961224) - (1536910315 . 2632972300) (1349168372 . 2307429186) (411152329 . 2745631190) - (1694697476 . 1081411140) (3755185459 . 2631660711) (4019355068 . 4027326706) - (2066937809 . 3761668332) (3120395808 . 3878773315) (94890149 . 2109283191) - (3045629038 . 358812277) (1249184265 . 3465901047) (3477490924 . 2308583306) - (4114113436 . 3875911716) (1014604031 . 1434513279) (3991324799 . 2222416029) - (2040431088 . 1539915569) (2253613964 . 4081224332) (2547464012 . 1611168627) - (2722521980 . 4281500978) (71289574 . 213969824) (2450408597 . 903689630) - (1894451515 . 364024012) (1939968537 . 374938813) (1447259295 . 3785468557) - (4021046128 . 1664847745) (3139524504 . 3562928047) (1173487682 . 4065269608) - (2467266804 . 3907744866) (4284945151 . 3486998177) (2925674454 . 1953016432) - (3710671816 . 1271453948) (2129465869 . 1422863833) (587093076 . 18243356) - (3373793513 . 2411305257) (2156648078 . 1791034213) (3737413652 . 1534461430) - (468575139 . 2935304962) (1129551363 . 3603256834) (2861996892 . 1763494778) - (2826449619 . 2465197654) (1704209531 . 1014895022) (3738359347 . 3402630390) - (569410928 . 4095796581) (3021312909 . 2108247612) (2444777957 . 2664129360) - (282063667 . 3773661258) (682545472 . 3188439005) (3318488457 . 1917822038) - (1447622272 . 4045023041) (757420137 . 4038580915) (2613420942 . 4146703316) - (4012836163 . 150381244) (2938127093 . 3428591704) (1208226490 . 3086335530) - (2935205706 . 1446903363) (430957978 . 3830532479) (1381578755 . 3757172800) - (4109399782 . 1596778224) (288855589 . 1954372339) (3169178148 . 2256716053) - (2644780093 . 3895892303) (107966643 . 1071681559) (1304747544 . 2607225372) - (1359190711 . 1898207171) (3229237120 . 3273634996) (3027167685 . 3863637628) - (3011615298 . 2883984519) (564135827 . 978463264) (770797430 . 362326607) - (1983662611 . 1907583229) (4153656423 . 48268960) (3609759233 . 720080177) - (3727911466 . 1270989899) (200708787 . 2366086947) (744508026 . 393422515) - (1213261630 . 65757284) (3485747185 . 3845951003) (2958861301 . 1680248217) - (2598470344 . 3163845864) (2767997908 . 4233451722) (3881113485 . 1492930166) - (1773764017 . 2764062206) (4189435844 . 2898689174) (4234838742 . 1267095035) - (2624081078 . 3302114327) (2395569449 . 390426320) (1728307101 . 690284926) - (3309827454 . 1118258254) (2028172868 . 3888829086) (4271523049 . 909051386) - (146617804 . 942892565) (2467685867 . 974297806) (2483428231 . 503635829) - (3743260573 . 2018222096) (1002067894 . 2289153437) (3535252974 . 3738302271) - (4154611160 . 1002664952) (3623154244 . 2349656961) (3646679180 . 3524329383) - (862933752 . 4282853607) (2806008282 . 3272780913) (2734037942 . 3828874677) - (1328176304 . 2137666995) (2278785213 . 2780788825) (381286368 . 1816476193) - (2074232908 . 2316293454) (4087773386 . 3651330956) (967884669 . 3728964514) - (4239349185 . 3213509668) (419231360 . 1463788948) (1275421624 . 2672384707) - (1088456595 . 436245261) (2365565249 . 783696577) (1758083333 . 845223583) - (2048846183 . 3530914274) (2635948261 . 124738415) (940630937 . 3069598626) - (839474029 . 1253439921) (902477345 . 165479306) (2836079689 . 2681188273) - (2007115168 . 2093139645) (1363041891 . 1282466609) (1130479818 . 1063857938) - (3644959908 . 1260430427) (1385135238 . 46497915) (1386975934 . 3110156681) - (2635987502 . 4233461619) (1915744629 . 4117939016) (487743653 . 285736599) - (2049219159 . 3960249250) (69242857 . 3908563670) (1511066720 . 1488527520) - (215590039 . 1703564952) (1459430344 . 4184955468) (676103291 . 2642967214) - (83799035 . 3182827979) (1949179493 . 476101251) (2593534694 . 1493478716) - (2283504289 . 995211746) (1349412676 . 3449243940) (2954378677 . 1878813305) - (249149717 . 3329151870) (1578231917 . 1483986052) (4135085182 . 890874990) - (461755528 . 3505523909) (3669622373 . 634949665) (219487622 . 2914465301) - (2825233742 . 3703631897) (2479105382 . 2935590907) (2582097898 . 3187672881) - (1221328648 . 1843341402) (2140891889 . 3958868911) (1482849818 . 345750049) - (751922730 . 3178831411) (3546542069 . 4036458902) (216179596 . 877293293) - (444615341 . 3117393729) (2424254530 . 494454238) (1344234989 . 3003337991) - (929188581 . 2760877801) (2507911009 . 1879899982) (980166547 . 1311840394) - (3566535507 . 1790747461) (143525013 . 2311336672) (4181962471 . 4273938872) - (1815842366 . 862009811) (911175674 . 1179575598) (3591335374 . 3694215714) - (1452686093 . 3393294272) (385158879 . 2447709103) (4011414929 . 1264623507) - (1448477120 . 911094312) (3971299641 . 2289992053) (3133647265 . 2234591563) - (3007628400 . 964409938) (1708345684 . 3673411261) (3031964479 . 2843021794) - (3022128657 . 2480338599) (118850112 . 473449293) (2048127371 . 3202109429) - (3158349745 . 382018770) (1505327237 . 3807570472) (2568424029 . 3272693060) - (1866609495 . 3888556537) (844703982 . 1852802964) (3504617058 . 682636099) - (1448882679 . 3733580327) (821387540 . 2215744532) (3631471417 . 311618895) - (2077838877 . 2383929020) (3352949096 . 1688694420) (2491080787 . 3998672444) - (3368630402 . 4182204255) (983299419 . 2837414346) (3651215291 . 1033373924) - (265429091 . 3988955082) (3019003608 . 2896212153) (2955948456 . 3025235588) - (903690197 . 2266253487) (3925215275 . 89402958) (3959093811 . 3609545561) - (2455088053 . 223552128) (3115011301 . 2133669107) (1765081558 . 673805649) - (3324795129 . 2111392191) (3443871631 . 432345706) (3152559950 . 3425427147) - (3699649406 . 672784944) (3129545774 . 7668664) (2747044893 . 173040075) - (3925243406 . 852328481) (164095314 . 3161868591) (2234471571 . 1302682825) - (2164784335 . 105893718) (159995093 . 536831360) (599199451 . 425051327) - (3274759746 . 1680930461) (1192619331 . 3903085578) (2832721114 . 3078660237) - (91404660 . 4030521531) (3044880024 . 1578375623) (3906596030 . 754177855) - (803516785 . 1894094672) (288455592 . 2030430096) (2143232492 . 2317305324) - (388352703 . 3406060288) (2521731420 . 3588403719) (1043041227 . 4028028525) - (3195290851 . 2468913324) (4166724431 . 3168683191) (1228226538 . 968516529) - (500177583 . 3444787306) (533367442 . 4252082053) (4236023256 . 657816314) - (413575568 . 3367198397) (3435884549 . 3334062733) (1004255532 . 1135705894) - (2859513268 . 4170618274) (3914086821 . 1251487871) (3080761716 . 3489067886) - (3571165255 . 699353261) (773372954 . 3648014952) (769693293 . 2939128604) - (3116440923 . 507748478) (1687629160 . 3739431776) (2489486648 . 3502376324) - (3686847158 . 2878383449) (3530767427 . 902211375) (2121652637 . 2493976397) - (1827477891 . 930064171) (2549918411 . 4029725732) (2071415163 . 844118802) - (2236083679 . 3088894868) (2040110303 . 4144562891) (3489536313 . 1133419300) - (2190878435 . 2301466071) (2465915458 . 2448602097) (1675766804 . 2073834499) - (3329799896 . 1613253148) (1483966600 . 1348836071) (159505618 . 2527621997) - (2674227354 . 1695130688) (2683539437 . 1927873839) (3833196123 . 2570082188) - (3891433165 . 759819981) (1455453349 . 2179602430) (1430583255 . 1957776111) - (2067726741 . 4235143439) (303380021 . 2998980439) (2136024795 . 3126725799) - (2054591852 . 1051702291) (1029141665 . 489794361) (2317027384 . 569642164) - (2068461795 . 624418658) (2499875684 . 1830645251) (1302894490 . 4319401) - (1002663431 . 2406815191) (1560941298 . 2060652753) (2141002286 . 515773223) - (3661248027 . 475092913) (3705503008 . 2419919909) (914567990 . 3496539911) - (3462935583 . 2039034761) (2878378006 . 2379243316) (1133857586 . 1390159333) - (3023618742 . 2140726761) (282908558 . 944874642) (3686955701 . 1148723903) - (2604456805 . 4163675010) (3061545110 . 377179268) (3218002352 . 76459088) - (2836503392 . 916455101) (536836808 . 151306053) (2886925079 . 404221671) - (2936593041 . 2011015485) (453815187 . 1852163908) (3042568989 . 82176306) - (3279635891 . 4174836410) (3282689058 . 2360003049) (4088968807 . 1516570623) - (2680453086 . 1322680794) (1731693966 . 3438253771) (1842894553 . 1294307894) - (2736377365 . 2964642609) (121205621 . 521330014) (2324595870 . 3005710757) - (3784465521 . 676493813) (1958759409 . 2030833406) (1306150933 . 1016370058) - (2636541290 . 482366508) (1950415745 . 1695073534) (322077955 . 3746046623) - (3602873262 . 3829181504) (1211684447 . 1861645455) (504701736 . 4080111082) - (2407799203 . 1223857855) (1925743434 . 1498920209) (3617596327 . 845198428) - (2498480299 . 3484773806) (2680229135 . 2560201696) (3731399221 . 1536412390) - (2756509305 . 2924710846) (2635957500 . 3459716133) (1372762539 . 769635894) - (802677945 . 3878474636) (1707760534 . 3075809808) (3714687192 . 2872792173) - (1615679922 . 1606381794) (1940556374 . 1337437342) (445390489 . 731124040) - (2864974375 . 64601760) (1984806574 . 2141516710) (513390958 . 1890172555) - (744398315 . 1475299139) (982749166 . 852662657) (652663695 . 4260736510) - (1184061125 . 82616221) (3363191899 . 147951756) (1064069880 . 1507328085) - (2138882964 . 547595589) (2616926846 . 3186935246) (2298715513 . 3606862940) - (2414381911 . 811477686) (2694745228 . 900437726) (4202576185 . 2201114451) - (3602305260 . 3323446937) (3756663274 . 2658490339) (3061587876 . 2171079416) - (3390977925 . 2850497765) (486312941 . 224925241) (3515712841 . 3510684394) - (1322319486 . 2647200565) (3839619171 . 1148450258) (392296762 . 1154854654) - (1401523788 . 957405781) (1934485528 . 527352730) (645968162 . 3131215255) - (696971825 . 3361451947) (2038689491 . 1946699733) (1723966113 . 2785859721) - (2652365974 . 1118037185) (3988018407 . 3134982149) (1354171594 . 3053634345) - (1287854075 . 2631782435) (1723106141 . 2662328866) (563845090 . 1878819261) - (639520332 . 171129501) (534957223 . 1696062352) (3612364282 . 2283204027) - (3109494688 . 1304463816) (500957989 . 630925278) (3477030536 . 2149497258) - (4109750364 . 281719363) (951472732 . 564407054) (922095147 . 2767874048) - (3946156928 . 829677774) (2622281253 . 2086286851) (2936811901 . 850242186) - (630086272 . 3340782667) (2340986210 . 1296336989) (4107355543 . 3865114709) - (3560210278 . 3968418243) (3868847493 . 2967450637) (611513888 . 2083325060) - (3265390517 . 3025776309) (2874106961 . 3424470508) (1668707698 . 2923258228) - (2778598353 . 24320552) (292356118 . 3415510793) (754567370 . 86994591) - (185141877 . 1621715171) (2884558258 . 3722473457) (1492107531 . 111281805) - (3336927864 . 4225337056) (782994598 . 1021838039) (346133860 . 18281270) - (2080909533 . 1649329040) (3612065399 . 3859901127) (2151962287 . 284556115) - (3957975594 . 3745718727) (52533817 . 3998775856) (1232633839 . 397383972) - (2716413964 . 3629253960) (1531307298 . 3836851439) (3030137657 . 2500401718) - (3561556693 . 653345841) (313061910 . 2945718466) (2065276 . 3342140708) - (410498334 . 1470588117) (2726640512 . 4051654894) (2570984935 . 758567696) - (3008987264 . 3462702678) (623860175 . 228525243) (3527183895 . 1829844480) - (467272850 . 3890501742) (568376656 . 650516927) (990477018 . 4035508558) - (2366955227 . 817792110) (4183621538 . 989198068) (946958343 . 1639184195) - (3395758993 . 3924097558) (1690887473 . 3220519765) (605184237 . 1255270525) - (275515833 . 1926424610) (2142902612 . 283494960) (2021972412 . 1823828440) - (105373677 . 3448326697) (1666662384 . 1042433908) (1338566998 . 261206307) - (498685668 . 1344755577) (3101233780 . 3119109371) (2733370951 . 3808165089) - (3656512268 . 3449289481) (4025308119 . 1607880299) (778896067 . 1612183167) - (2846510368 . 3674754715) (3058428120 . 2991822529) (1892379383 . 3268787440) - (2565895844 . 4154602030) (3213117192 . 98999135) (2495816991 . 116985075) - (1040203361 . 1785041385) (3106252493 . 69316595) (1639829808 . 2087117568) - (3213709576 . 3799911752) (604681594 . 2340981536) (4236730699 . 2938666503) - (4009938384 . 1878897714) (2701667332 . 1725918218) (2182473079 . 1258184) - (3550198211 . 2760750799) (657991062 . 875584532) (1640976276 . 3380476221) - (460041378 . 2924352091) (1972323596 . 2287414795) (2510248061 . 1350206297) - (2959337826 . 3762681165) (1625877874 . 3235902929) (2070189957 . 1429368735) - (4245163299 . 1839731898) (2358312347 . 138364248) (275739390 . 2179122576) - (2037777210 . 972544338) (2766930226 . 1984733259) (1933485829 . 4209310327) - (3034118011 . 3286589799) (2653025529 . 62078937) (2641780289 . 2679545709) - (3540781195 . 2787026415) (1569993599 . 3215949659) (441337890 . 3947723353) - (1878946792 . 459505587) (3724105660 . 920173002) (1691411102 . 3934795955) - (148741087 . 3647709027) (142506469 . 2776440083) (3811107376 . 3823285243) - (472209891 . 252266174) (1913386482 . 1867329194) (2960608550 . 482740699) - (1145005292 . 1513558421) (1091751784 . 1687823886) (3625186042 . 3086337482) - (1712140887 . 940065262) (1504455800 . 1945702563) (3896940088 . 2003245591) - (2478191531 . 4197739000) (3233871270 . 250924495) (3404865229 . 1131917964) - (1462204167 . 429621621) (1349259705 . 3641608989) (3627860584 . 2048468319) - (1244251718 . 1513180369) (3979211282 . 371413143) (3043187861 . 4285699810) - (581894202 . 3060983825) (1390895705 . 1811317301) (2599134010 . 3337406128) - (2488233440 . 2436161462) (1816641224 . 2208816697) (1792034756 . 815866116) - (2779893723 . 2695577703) (2084952115 . 2951772258) (1351806869 . 169269771) - (2469979804 . 86740603) (1163545420 . 4264616949) (1795352113 . 2511146232) - (1796715044 . 3134635815) (3521170642 . 1538900329) (3725363621 . 1455009392) - (1342594643 . 1512127734) (2618386938 . 662157428) (2028859350 . 2494504685) - (1841905045 . 648351336) (4002935891 . 4033319405) (850071259 . 1768358867) - (979915719 . 3876018087) (830889197 . 1629549437) (1744763229 . 2455795856) - (522919199 . 368499868) (3063822504 . 2522639205) (2861636095 . 407686388) - (4097602344 . 1945259027) (4215946617 . 1251639506) (894485042 . 534122652) - (924809191 . 1807237502) (1811585710 . 1589663609) (3439653887 . 1722232) - (3810997538 . 105152714) (2677100683 . 4291805514) (77233985 . 102407776) - (4239834691 . 2851274395) (148802076 . 2006440603) (2409138150 . 126301601) - (3048474397 . 3217504870) (588133437 . 4221603123) (1139638106 . 263087485) - (982032635 . 3165674595) (562514827 . 1294842959) (467575086 . 905357513) - (1405117894 . 3370530088) (3813285157 . 242912619) (3601878331 . 1985076606) - (1586505598 . 2092146221) (738488098 . 103663229) (2970334297 . 321718822) - (1068097019 . 1742926233) (235518094 . 420804527) (283685722 . 4092504887) - (2666392744 . 3799169331) (3569817788 . 1256762975) (2169728352 . 292617248) - (2444571896 . 2239859206) (3967907832 . 1066404216) (420376911 . 2913277294) - (3046293305 . 2956347747) (2311278792 . 2477686209) (2885955184 . 4172514290) - (3030078181 . 2275536480) (4212469731 . 4280736393) (1046900335 . 1773022229) - (995380926 . 1414273529) (3892683234 . 2429494358) (615726237 . 2127712535) - (3880203074 . 2071130305) (176180504 . 3070850165) (1474506861 . 2283723599) - (1256707747 . 1857412043) (764236850 . 359687368) (3521530334 . 511649419) - (2318567964 . 3992868140) (128167623 . 2518992858) (2220129756 . 1042300052) - (2567608573 . 1349636707) (441446694 . 384760969) (4143447316 . 829506048) - (817912603 . 2738025500) (2368091832 . 357934982) (1187643061 . 1561463042) - (3438021235 . 3030161697) (1318922279 . 895468690) (434876457 . 1130220303) - (1180291767 . 1132759596) (2520707785 . 1798553137) (1962430872 . 2958700157) - (1510954061 . 3534879512) (57831539 . 3269538993) (3354831405 . 3852135009) - (891783098 . 2698494511) (2555636406 . 996018997) (2881342935 . 3982231648) - (3473267445 . 2894952368) (1238029452 . 3958679326) (2051805420 . 559465638) - (3655936674 . 1186951582) (330209165 . 167662935) (1929681327 . 2450868735) - (1313566811 . 2458925988) (4283920930 . 3243182650) (1438004300 . 4185567150) - (3093439067 . 89876832) (3401620219 . 3721579956) (3673745794 . 2682874719) - (3053321309 . 825410712) (822915968 . 3681514755) (3900685126 . 561657358) - (553823814 . 1857753416) (4166295066 . 983949325) (128359165 . 3426887194) - (3300989119 . 3884968622) (4193552686 . 3647722552) (452189154 . 1569670618) - (4122259632 . 3537825460) (2519387887 . 2821594244) (74333898 . 2940550377) - (4032631446 . 2173999692) (2521268686 . 1934310532) (2620314688 . 2177785789) - (1378755571 . 2455646622) (394133753 . 4231198609) (734399075 . 2800989170) - (573292462 . 1634883078) (1214417373 . 3426576256) (2110224475 . 2399009920) - (2331215665 . 3224086912) (531326186 . 698539511) (3839443603 . 583861850) - (2644531398 . 2017784332) (616620850 . 3070237104) (590349237 . 2798642861) - (3582377217 . 3317831670) (1582708616 . 1596570667) (2126148205 . 2358511947) - (173450736 . 3219362418) (3616831144 . 1323437318) (2655785577 . 3131359031) - (401600069 . 2967397952) (496349349 . 4244179910) (2479612086 . 2579650653) - (1710903074 . 2049666425) (3589924952 . 690291925) (3266682943 . 1900485231) - (1496318498 . 3025542656) (3459221058 . 3389461212) (2091479615 . 3140389256) - (663040899 . 1207089672) (3323704225 . 1105530508) (353318429 . 2879253542) - (2674540957 . 941987316) (1688550857 . 620657353) (338551967 . 4286217277) - (204689992 . 2239736295) (178008789 . 3940832005) (3871613304 . 3300636974) - (1911672356 . 2429684487) (4055679954 . 1974461722) (3878217928 . 1009991796) - (2533095482 . 310920740) (2174833823 . 3596041637) (1604814460 . 2939543881) - (1452830254 . 4092397851) (2441027029 . 4169690209) (3524103304 . 3372213855) - - (836181454 . 1689436944) (4049974663 . 3750330768) (2776523577 . 3710710688) - (519497435 . 2979405513) - - (1892447193 . 197291556) (3793382197 . 3742120663) - (3838936 . 2994760034) (479846099 . 1018728609) (3476112862 . 182272649) - (3504620154 . 1427438450) (2009473484 . 2679350403) (1738755500 . 1129731339) - - (4174784170 . 2938602761)] + [(40249 9342 13175 27969) (10999 14720 1450 42439) (17627 336 9314 13639) + (39957 63294 25255 27362) (30083 17509 18588 3209) (12944 44090 8240 447) + (4027 44319 24836 8825) (59450 37007 62203 24778) (3454 30301 22645 23568) + (6664 14370 52911 57389) (38405 54768 57950 50096) (53281 65372 53562 11989) + (16573 61789 19047 11826) (275 21780 28629 25493) (23988 33568 18163 55781) + (9119 35629 32759 6604) (1489 41390 34228 39585) (26527 33935 28303 51569) + (29769 48127 32799 60683) (32017 52657 50103 44528) (33479 28830 30750 47052) + (62241 36636 38160 30828) (13076 30963 44881 48102) (19379 36325 59169 37955) + (43620 40046 48381 20732) (36285 39075 21167 54283) (34770 1867 33239 37399) + (6643 51025 54249 10977) (46251 12528 25265 39615) (31493 172 16900 31428) + (51525 11432 6665 55389) (9386 27729 19874 29952) (19615 13378 29953 46151) + (5286 36823 15505 2113) (42779 39811 17948 48531) (840 35733 45297 34063) + (25467 11060 65427 49216) (2513 48282 15833 2708) (13685 26243 13473 56635) + (29534 11159 42180 23075) (6258 28784 61885 16395) (8139 44242 22975 743) + (54032 42946 52891 25941) (49048 16352 65117 33348) (40820 53583 29780 43044) + (20971 56394 47546 12341) (23682 50437 56218 45306) (64759 65162 13360 45633) + (12883 42793 47546 15838) (35956 50024 2075 12405) (47548 27783 5756 13287) + (32500 36651 33538 20000) (4565 1492 50001 48511) (25960 64681 11382 41539) + (19936 45300 3890 42936) (38614 37702 3267 32349) (17122 16587 25448 40751) + (27947 56538 58001 38497) (17032 2818 14052 55633) (24335 19032 38935 7094) + (14840 37109 31225 12168) (37829 46580 29526 14475) (25564 13725 36131 7032) + (60438 51850 60056 44406) (21333 63744 49832 11719) (2043 40837 23193 28994) + (20627 16762 43175 60766) (31691 50061 41562 32572) (6652 35446 36084 46804) + (25466 30592 57039 49369) (33353 42106 60942 16887) (31149 26965 487 53736) + (5292 47860 30589 22390) (61765 46782 52446 41365) (55999 10952 8215 21244) + (9411 51533 63944 54262) (47982 10532 61497 4842) (3298 27659 38345 32985) + (42140 53554 49087 31940) (59805 26154 62500 14649) (10214 44408 37142 23615) + (34101 61504 47476 20465) (21683 62714 24384 55411) (29361 11314 4735 60715) + (61077 19772 31553 8007) (39557 44176 39460 60065) (28844 19673 61519 8693) + (63928 40254 39328 30146) (34739 58034 46537 1969) (41830 58808 50511 18616) + (44618 37702 52287 31986) (6432 49229 18214 31677) (34751 710 46238 10985) + (2338 14252 9087 14425) (65287 63054 63725 5328) (36328 56489 61500 50510) + (39958 13094 19892 40073) (46066 11325 2827 14573) (14606 24500 19713 5195) + (23550 42420 28967 26857) (7696 12945 8103 35204) (39540 44217 25831 36019) + (20352 63392 13786 64260) (25348 53402 2871 14532) (8561 58950 33538 14856) + (23451 25579 40175 63500) (20586 44276 35208 37698) (6273 45001 41895 470) + (25859 2052 16501 1604) (57299 38195 40155 62631) (61330 32188 61452 8434) + (31538 63441 57398 33004) (47613 30240 59185 25155) (1447 59557 32185 7031) + (46472 40046 5475 2677) (19061 2569 52885 29687) (53062 19692 35226 12170) + (62776 25500 59141 47140) (15481 41215 21888 61311) (60902 51327 33911 24733) + (31134 33264 23497 16177) (34387 27532 62274 35468) (38871 14156 24584 31603) + (41542 25468 65330 34098) (1087 51942 3264 60320) (37390 17557 13789 13726) + (28907 2363 5554 37068) (29601 37401 5721 7357) (22083 27807 57761 43661) + (61356 19312 25403 36737) (47905 22424 54365 63407) (17906 66 62031 5992) + (37647 33012 59627 29794) (65383 4863 53207 24225) (44642 16342 29800 43632) + (56620 23496 19400 55548) (32493 4621 21711 11737) (8958 21588 278 24348) + (51480 233 36793 39209) (32907 54926 27329 869) (57028 26644 23414 1526) + (7149 58275 44789 13058) (17235 38403 54981 22018) (43670 39772 26908 52090) + (43128 13011 37615 61014) (26004 11387 15486 4526) (57042 54835 51920 1270) + (8688 34160 62496 58725) (46101 37773 32169 20028) (37304 23013 40651 25424) + (4303 62259 57581 32842) (10414 53568 48651 47069) (50636 7561 29263 42070) + (22088 63104 61722 10049) (11557 20585 61623 55987) (39877 41870 63273 43988) + (61231 1347 2294 41660) (44832 17141 52316 10328) (18436 4794 47093 48682) + (44787 44874 22077 65091) (6575 58778 58449 18815) (21081 14339 57329 59456) + (62704 30438 24364 59120) (4407 38437 29821 23283) (48357 53796 34434 49429) + (40356 9277 59446 39247) (1647 28851 16352 36887) (19908 56856 39783 6684) + (20739 39607 28964 22467) (49274 16256 49951 46260) (46190 59845 58954 28284) + (45953 39490 44006 7303) (8608 1939 14930 10784) (11761 28534 5528 43599) + (30268 18963 29107 26877) (63379 50279 736 34464) (55080 36353 10987 36145) + (56883 27178 19393 50251) (3062 37555 36103 40739) (11360 19066 6003 9907) + (18512 59198 1003 24676) (53188 18417 58684 36379) (45148 41973 25638 36249) + (39649 33480 48276 29928) (42236 19412 64597 22730) (59221 6029 22780 20086) + (27065 32177 42176 15870) (63925 47044 44230 31894) (64618 33494 19334 22011) + (40040 19638 50386 17431) (36553 32041 5957 28368) (26371 57245 10532 59774) + (50503 62846 17063 17486) (30947 30276 59338 53918) (65178 17641 13871 1530) + (2237 13772 14387 26133) (37653 58859 14866 39630) (37894 7047 7684 57205) + (57117 40861 30795 40976) (15290 22454 34929 46493) (53943 44526 57041 63295) + (63394 21976 15299 29688) (55284 62020 35852 60289) (55643 59532 53776 65447) + (13167 21240 65351 10471) (42816 18906 49938 44145) (41718 7094 58423 64949) + (20266 23728 32618 13747) (34771 32957 42431 30809) (5817 63456 27717 14881) + (31650 18508 35343 54606) (62374 30922 55714 58252) (14768 49021 56899 31650) + (64687 21953 49034 17444) (6396 63104 22335 42388) (19461 25528 40777 23235) + (16608 34707 6656 37645) (36095 43329 11958 17089) (26826 14597 12897 5791) + (31262 59751 53877 31202) (40221 24805 1903 23407) (14352 58265 46838 23458) + (12809 23405 19125 63921) (13770 46625 2525 906) (43275 9289 40911 44977) + (30626 9632 31938 50877) (20798 24163 19568 58161) (17249 49354 16233 12050) + (55617 44196 19232 42075) (21135 31878 709 32891) (21163 37566 47457 14729) + (40221 64046 64597 32627) (29231 61813 62834 49992) (7442 24741 4359 65175) + (31268 39511 60428 39842) (1056 36841 59639 62166) (23057 3168 22713 8352) + (3289 42135 25994 22168) (22269 9160 63857 23116) (10316 33915 40328 31406) + (1278 44027 48566 6603) (29742 7781 7264 47747) (39574 13030 22788 44348) + (34843 33441 15185 47586) (20590 26436 52631 18724) (45080 15797 28668 27257) + (3801 47381 50798 54142) (24081 59501 22643 54404) (63096 25726 13593 44142) + (7045 54408 53490 3269) (55993 65125 9688 36897) (3349 7558 44471 13845) + (43109 42318 56512 61465) (37828 9574 44793 36859) (39399 45034 48640 1841) + (18635 65288 28127 10330) (32667 27377 60407 35759) (22626 32282 5275 47649) + (11473 28202 48505 7731) (54115 61429 61591 31126) (3298 41868 13386 28397) + (6784 19117 47567 42817) (36991 12354 7544 50654) (20511 26093 45827 19719) + (14178 19173 42127 42729) (38267 44897 28684 65358) (14956 10131 20017 6282) + (54421 851 27324 41797) (2190 1173 35268 13024) (63811 44775 65215 8632) + (27707 36414 13153 14803) (13903 28666 17998 58670) (54799 28110 56369 16930) + (22166 15117 51777 36800) (5877 3807 37349 5039) (61209 21905 19296 40851) + (22102 448 13902 12840) (60597 14649 34942 33141) (47815 43425 34097 10571) + (45892 50288 14715 47698) (26067 18772 56051 52925) (46264 6975 43381 4578) + (46114 1553 37846 63143) (1813 33344 7224 17229) (31251 61835 48860 20469) + (48192 38833 5829 9426) (22969 30853 58098 59944) (39191 2653 49937 21828) + (28482 13143 59334 43513) (12889 10478 28271 34708) (53476 13922 10416 13123) + (22108 12791 56969 59943) (12533 24852 33809 37908) (55411 56121 4754 60751) + (31705 19997 36375 57020) (51161 61800 25767 28308) (38010 57427 61014 58940) + (51401 14466 63815 24415) (15003 62811 43295 33226) (55713 8123 15768 2276) + (4050 8291 60866 40906) (46066 22232 44192 45241) (45104 12712 46161 28292) + (13789 14293 34580 18607) (59894 2091 1364 11854) (60410 64051 55077 19289) + (37461 43957 3411 8832) (47531 19685 32557 13555) (26933 470 10281 30033) + (50732 22777 32217 18879) (52549 20367 6597 4714) (48104 16206 52267 57035) + (56452 11134 10265 57904) (47753 5166 117 952) (41916 37917 2640 25035) + (59894 30222 13005 32801) (2503 58706 48246 18735) (34095 21651 19877 23753) + (33031 64719 1615 53078) (2441 21717 8191 25984) (9143 3803 6485 50367) + (49968 56898 25648 63133) (18197 60739 59556 23562) (43223 58586 46976 41101) + (1394 47476 61500 57531) (46461 11928 24084 6599) (59609 60606 11507 55103) + (12260 45425 28901 38736) (4401 31656 30981 59280) (32703 8684 35359 17900) + (5925 51903 51972 23296) (38478 37212 54754 45575) (15915 35787 61462 54893) + (48756 17635 37672 41132) (63579 11087 48350 17591) (18741 16362 14778 25521) + (7632 6831 52563 18538) (8138 35474 64881 40837) (64636 38360 10037 31482) + (6310 43408 51379 24253) (52427 28677 50873 49805) (15323 47404 17329 32550) + (43632 46516 63638 38306) (59724 14757 19096 12415) (47008 45428 53238 62318) + (54491 43079 10671 18605) (11800 48154 55664 19048) (11744 38509 44847 35612) + (47553 7515 7747 41086) (25751 11624 57059 13152) (37986 36152 53442 1412) + (56256 53942 43920 42329) (53875 15427 13766 42799) (32373 55709 38055 3917) + (27885 6531 14191 42795) (38908 43723 61488 48164) (31607 18811 12880 15122) + (34119 60895 47132 52116) (31129 40159 63241 715) (53246 6457 17294 39716) + (33430 9955 35117 38359) (37626 57922 37362 46065) (25570 11284 31644 13315) + (50808 46808 24616 18972) (22643 34952 20581 39655) (2433 56530 38568 29549) + (40805 30874 25865 42048) (40947 36845 29417 1327) (58489 61019 39216 22412) + (59378 36557 11593 61133) (22208 29861 33258 6142) (21828 63447 29873 19183) + (31551 405 64623 10511) (4629 13877 45760 53079) (32593 9947 47710 3239) + (31350 38252 16047 46099) (15703 29857 7473 43833) (35355 2104 8692 3252) + (31562 14563 9527 57186) (38145 4964 27933 28163) (19880 38810 65 59561) + (15299 28167 36725 5591) (23818 4850 31443 4305) (32669 6702 7870 4903) + (55866 13851 7249 22449) (56541 32032 36925 3109) (13955 13110 53352 63239) + (52840 13343 31113 13193) (43920 36886 36304 24372) (17301 19250 21212 9701) + (46136 49846 32664 58857) (4316 55182 14417 42130) (56258 31413 17528 8895) + (39740 56165 63532 41858) (46715 30870 5755 19588) (49102 53680 1166 44112) + (43281 39776 13983 65213) (8191 31432 2308 48965) (44050 64279 6167 61159) + (44808 55953 30685 43325) (6924 43923 28261 51012) (46425 60189 1253 59698) + (50043 17843 63702 62138) (50089 56354 36010 51689) (62392 46695 23141 2047) + (40900 30686 20182 33242) (26423 36238 52463 38603) (28120 22233 19749 37430) + (41753 52757 45236 56113) (1849 29557 7954 56670) (35470 33950 45863 33189) + (57746 23665 10322 31221) (29888 19441 30988 3838) (19930 18453 15508 37770) + (40230 28010 7360 21548) (29760 64385 25864 50430) (4914 34051 57160 8863) + (54975 31662 58428 44096) (18488 54879 28406 29839) (7701 9000 62257 36330) + (36740 6563 18674 38591) (29384 33610 22871 46353) (55200 9127 12896 46172) + (38123 51371 53173 28078) (40897 3343 39065 37856) (56936 41525 23443 51942) + (42060 65145 44627 35774) (40221 34044 52791 5157) (20946 45483 11743 46646) + (12247 58553 59180 54156) (26058 23446 46933 8720) (56681 41176 43835 21613) + (24653 20914 24511 28898) (29610 35414 20407 44190) (6796 7833 11156 4424) + (43716 2599 985 48800) (30285 48814 32676 62374) (7833 47470 28841 48779) + (11358 40427 22511 18243) (14995 36846 13010 39297) (9958 56207 65013 44542) + (18067 22213 1260 40861) (51318 15451 2257 37004) (16236 27384 23000 85) + (32636 50068 8355 42309) (39931 8830 48628 50638) (35075 40313 55036 23644) + (36840 35671 12382 10934) (41118 35980 13739 38622) (64126 14649 33586 22355) + (54966 53484 50711 50841) (57322 8682 40565 22499) (46716 8100 33128 2808) + (51742 14213 43495 9445) (7420 35821 3432 5689) (53645 34121 53568 51946) + (20176 65150 40393 4917) (58587 61539 17523 62930) (5985 63802 17621 44798) + (21385 36428 14608 55893) (29517 59416 8046 50074) (9856 45346 47778 36247) + (10634 62001 51291 44971) (31107 61139 29704 18389) (26305 41633 42508 55433) + (40471 58518 17059 58561) (60852 21735 47836 2053) (20663 1226 46594 49961) + (19651 6139 40157 53283) (26292 33629 40623 59938) (8603 38882 28668 33213) + (9758 20044 2611 15005) (8162 52391 25879 56208) (55120 19962 34838 60859) + (47447 8096 19904 35272) (7644 805 9627 10206) (53055 18056 32798 47530) + (62709 53340 4298 45635) (14518 21084 8612 11022) (14070 3627 42234 26624) + (60213 37760 12659 57550) (40012 54821 31834 13827) (44812 12669 12973 43658) + (9614 23168 50976 19531) (35720 40290 19780 34909) (62673 17815 58976 63573) + (54324 32614 60553 16835) (59033 60805 45279 46093) (9330 63008 31789 1156) + (49825 59317 46169 44725) (43855 25681 52253 17900) (25462 30066 44605 24948) + (42398 3025 371 6696) (4461 22 52116 36617) (11513 51402 1327 28319) + (2825 2677 24745 26851) (44014 56754 56800 28657) (22767 49419 1698 1677) + (50917 31352 64473 34528) (11947 36006 15592 727) (5281 38244 278 62262) + (31752 10461 25166 50064) (55115 48759 58897 27335) (32836 22191 4341 64339) + (60393 59946 57155 8647) (801 39481 61016 31280) (18808 32751 6063 39204) + (41449 12300 55378 1352) (23365 58658 58545 46319) (46236 15161 38153 6710) + (54345 2773 9969 17457) (4776 61974 44948 6338) (31 33660 50997 1316) + (6263 46366 22439 25813) (41605 15232 61823 22766) (39230 7655 11574 54032) + (45913 32896 52836 42582) (9519 22991 3487 1211) (53820 36375 27921 13824) + (7130 1170 59364 22638) (8672 48464 9926 6591) (15113 31450 61576 63822) + (36116 57051 12478 33902) (63836 65442 15093 63220) (14449 28679 25011 63299) + (51815 11153 59876 64022) (25800 58673 49141 15189) (9234 24813 19153 59517) + (4204 2489 29394 59426) (32698 6484 4325 51760) (30852 55740 27829 27096) + (1607 57325 52617 18985) (25431 16368 15906 18292) (20424 59734 3985 45347) + (7609 22244 20519 22393) (47321 4724 47593 54523) (41707 60999 58107 64737) + (55793 62220 52631 64265) (61421 21463 24534 20075) (11885 707 24599 63103) + (43434 19744 56072 20123) (46667 59608 45651 38593) (28875 27383 49877 48368) + (39152 30372 63394 12846) (49028 18184 1510 39775) (38083 9503 1785 3315) + (15872 15969 27237 37353) (47397 42701 1057 45043) (25021 53552 31846 58112) + (49037 20744 57982 3400) (9226 46458 35720 35616) (64647 24907 44840 32263) + (61186 52688 28669 46130) (41224 11268 26335 27658) (33301 58743 19 13000) + (54171 47555 42125 46799) (10040 9622 13360 23572) (25039 20372 51581 63805) + (7019 44194 44622 4699) (30095 17676 34903 11787) (38303 22653 20602 33625) + (45155 59746 57413 62797) (24808 60786 49375 62929) (31588 38789 21810 28575) + (64776 3363 28072 5306) (35984 64923 2111 17752) (4207 29438 33250 50576) + (31094 826 14839 55634) (42220 306 30284 41035) (29502 42757 64228 64119) + (46296 63355 50149 24935) (40481 62713 947 16345) (40310 24129 40886 40813) + (54028 2187 42526 42479) (23956 13183 49071 32603) (6734 18466 60237 31321) + (28670 29672 7011 32691) (56825 22460 14040 47562) (25808 58014 60040 14515) + (2269 39903 55659 40803) (2174 31205 42365 7443) (58152 57904 58338 46075) + (7205 23011 3849 18110) (29195 62962 28493 11946) (45175 19750 7366 2523) + (17471 25836 23095 4501) (16658 53096 25754 9742) (55315 62202 47093 50634) + (26125 12887 14344 16878) (22956 11384 29689 4259) (59462 38456 30567 6679) + (37814 13227 64052 27128) (49344 62886 3828 52687) (51954 7885 17271 45708) + (22311 30471 6555 33141) (20588 4537 55566 35613) (55356 49768 31257 9567) + (18985 50758 23089 19665) (60717 61970 5667 20631) (46435 23701 65394 38626) + (8879 58 46706 59409) (21223 25177 27638 33333) (39659 41786 50924 50864) + (37967 28128 37172 57270) (27719 48840 33703 56889) (27344 18372 12449 8452) + (42417 53211 41131 16487) (31813 55347 45040 30818) (20626 61333 2582 55819) + (37688 59036 1323 36475) (17754 19276 65072 58357) (27394 58929 38317 3320) + (27415 45604 47830 48935) (53728 52434 23481 49513) (56844 35237 22201 44656) + (20486 24147 23073 15606) (39953 27130 10103 47220) (30957 61398 38063 7917) + (28105 15765 9893 3688) (61079 62547 61543 37357) (12971 3803 26983 979) + (14952 21447 59143 22439) (12678 23789 24864 62333) (26622 63837 37472 30864) + (7979 7455 5622 56476) (46750 14504 38492 27493) (43665 6655 6220 52468) + (62524 29480 29682 19475) (64330 15737 19098 32978) (13648 49714 8150 4252) + (14111 30695 27576 16766) (27642 39598 24256 22393) (52484 62463 26 18296) + (58151 13602 1604 32970) (40849 20619 65487 49482) (1178 32577 1562 40544) + (64694 48707 43506 65179) (2270 35356 30615 55963) (36760 34790 1927 13729) + (46516 1821 49095 14950) (8974 13373 64416 36147) (17389 32602 4014 25981) + (14984 41211 48304 23651) (8583 19339 19757 48207) (7134 41262 13814 43209) + (21440 26054 51430 13608) (58186 7461 3706 36203) (54960 19771 30289 56702) + (24208 10110 31923 40493) (11268 28450 1581 50813) (45323 46169 4909 2598) + (16297 56827 26594 61849) (3593 47246 6420 63407) (4328 45914 62446 43831) + (40685 60584 57970 47411) (54471 6332 19176 44639) (33107 28000 4464 64544) + (37301 13560 34177 35334) (60545 30712 16272 2424) (6414 29007 44453 5486) + (46482 48953 45110 18787) (35267 20680 37806 32193) (44036 11888 63667 33778) + (46235 21221 34721 61024) (64277 12259 65318 55945) (15974 28271 27054 11285) + (15188 20158 21580 6649) (59397 41442 37071 9302) (9395 15517 32466 20759) + (59207 13122 31602 61633) (2688 19736 46857 29813) (22499 12397 34846 56143) + (19175 54947 28341 56267) (11661 21554 5488 25800) (53734 18910 7807 9867) + (35378 35356 60926 21804) (1955 44743 38436 51162) (33876 32220 15904 15508) + (39178 39165 20593 53859) (6735 61734 5870 64649) (63223 64788 12657 16896) + (12480 23323 41778 62492) (36134 14008 5461 42886) (18121 65205 23826 2306) + (52460 2675 46236 39201) (20125 10279 13663 50322) (6635 45097 17245 51983) + (18009 53943 17284 35372) (38462 62153 27443 48689) (29944 20888 45146 11901) + (23055 21581 53937 64280) (882 28787 49889 13489) (51190 43565 58778 60001) + (13607 34746 41175 49711) (38995 60086 15198 2869) (43965 52695 60764 2144) + (52997 56053 44173 30640) (18890 54412 60404 42782) (31308 4332 8536 50342) + (55785 10914 18111 29086) (5038 38797 2558 21847) (29444 39343 37397 18943) + (20043 28763 37520 15268) (65367 29218 49487 2618) (21942 13388 63866 44974) + (47202 8795 1371 26976) (51904 39675 56786 52660) (56056 59778 40937 27487) + (46589 64605 12594 50328) (12556 45952 56175 29955) (59519 47942 8570 13838) + (8450 44614 28347 4424) (63572 40474 15013 57357) (1958 39677 52290 9754) + (50369 6335 59279 60078) (63988 35118 55659 54328) (6899 56290 23951 17882) + (62900 45232 53982 61108) (38442 52975 43054 7300) (1134 16074 44869 15593) + (61533 4758 33172 39500) (38471 33230 29515 15492) (39982 54336 33230 24509) + (21038 9203 37470 12702) (6014 249 64562 63377) (11206 2659 42739 46066) + (8747 49070 24946 22022) (18530 35293 52285 26496) (32199 30811 36605 64640) + (35571 34609 49195 43392) (8107 25834 10658 56823) (58585 17043 8909 1626) + (40352 22726 30788 61964) (9408 58162 46848 6576) (9008 949 42703 59053) + (54662 48385 50626 6134) (24150 14216 24361 48171) (32442 29293 35988 2379) + (2646 42480 49123 37490) (55188 30376 20194 3334) (40524 4713 47780 48951) + (6127 60997 45278 58944) (7573 45221 64761 3014) (37835 57526 39362 22621) + (26106 20258 31275 28025) (54777 59480 10533 1237) (49845 41023 28999 6767) + (22832 546 46166 7680) (52783 34370 51719 4828) (31913 29247 47918 35208) + (10117 13187 18418 47624) (50715 45985 16869 3724) (5391 13853 43933 60454) + (40810 16797 14373 38388) (25765 15817 9470 31433) (5165 58527 65402 31805) + (3123 21064 34175 43495) (2716 13013 60132 21253) (59076 8568 50363 47406) + (29169 52772 37074 2823) (61884 50130 30127 58650) (59176 59592 15411 16500) + (38651 63546 4744 17956) (33185 21663 54871 15781) (24487 34428 44853 57673) + (22168 28206 62445 2331) (37247 7637 63624 27745) (53773 35976 51455 58975) + (12759 7630 25778 49936) (61797 46471 57225 33168) (42366 25401 56620 62368) + (7926 59099 45462 7881) (28876 29657 3010 28196) (57882 27445 57100 15063) + (58 37848 45696 26978) (7321 57043 15544 37025) (53041 17886 2781 17033) + (53476 17018 21780 64370) (30662 8652 40883 42115) (26531 19884 17238 21771) + (63702 9898 44839 34057)] "Zorbist hashes for polyglot.") (defconst chess-polyglot-zorbist-piece-type '(?p ?P ?n ?N ?b ?B ?r ?R ?q ?Q ?k ?K) @@ -431,7 +430,7 @@ On reaching end or beginning of buffer, stop and signal error." "Calculate the polyglot zorbist hash for POSITION. Uses 781 predefined hash values from `chess-polyglot-zorbist-keys'." (cl-assert (vectorp position)) - (let ((h32 0) (l32 0)) + (let ((a16 0) (b16 0) (c16 0) (d16 0)) (dotimes (rank 8) (dotimes (file 8) (let ((piece (cl-position (chess-pos-piece position (chess-rf-to-index @@ -440,21 +439,27 @@ Uses 781 predefined hash values from `chess-polyglot-zorbist-keys'." (when piece (let ((piece-key (aref chess-polyglot-zorbist-keys (+ (* 64 piece) (* (- 7 rank) 8) file)))) - (setq h32 (logxor h32 (car piece-key)) - l32 (logxor l32 (cdr piece-key)))))))) + (setq a16 (logxor a16 (nth 0 piece-key)) + b16 (logxor b16 (nth 1 piece-key)) + c16 (logxor c16 (nth 2 piece-key)) + d16 (logxor d16 (nth 3 piece-key)))))))) (let ((sides '(?K ?Q ?k ?q))) (dolist (side sides) (when (chess-pos-can-castle position side) (let ((castle-key (aref chess-polyglot-zorbist-keys (+ 768 (cl-position side sides))))) - (setq h32 (logxor h32 (car castle-key)) - l32 (logxor l32 (cdr castle-key))))))) + (setq a16 (logxor a16 (nth 0 castle-key)) + b16 (logxor b16 (nth 1 castle-key)) + c16 (logxor c16 (nth 2 castle-key)) + d16 (logxor d16 (nth 3 castle-key))))))) ;; TODO: en passant (when (chess-pos-side-to-move position) (let ((turn-key (aref chess-polyglot-zorbist-keys 780))) - (setq h32 (logxor h32 (car turn-key)) - l32 (logxor l32 (cdr turn-key))))) - (cons h32 l32))) + (setq a16 (logxor a16 (nth 0 turn-key)) + b16 (logxor b16 (nth 1 turn-key)) + c16 (logxor c16 (nth 2 turn-key)) + d16 (logxor d16 (nth 3 turn-key))))) + (list a16 b16 c16 d16))) ;;; Public interface: