OpenCores
URL https://opencores.org/ocsvn/udp_ipv4_for_10g_ethernet/udp_ipv4_for_10g_ethernet/trunk

Subversion Repositories udp_ipv4_for_10g_ethernet

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 2 to Rev 3
    Reverse comparison

Rev 2 → Rev 3

/udp_ipv4_for_10g_ethernet/trunk/doc/COPYING.LESSER
0,0 → 1,166
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
 
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
 
 
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
 
0. Additional Definitions.
 
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
 
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
 
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
 
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
 
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
 
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
 
1. Exception to Section 3 of the GNU GPL.
 
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
 
2. Conveying Modified Versions.
 
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
 
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
 
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
 
3. Object Code Incorporating Material from Library Header Files.
 
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
 
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
 
b) Accompany the object code with a copy of the GNU GPL and this license
document.
 
4. Combined Works.
 
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
 
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
 
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
 
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
 
d) Do one of the following:
 
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
 
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
 
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
 
5. Combined Libraries.
 
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
 
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
 
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
 
6. Revised Versions of the GNU Lesser General Public License.
 
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
 
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
 
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
 
/udp_ipv4_for_10g_ethernet/trunk/doc/udp_ip_10g.pdf Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
udp_ipv4_for_10g_ethernet/trunk/doc/udp_ip_10g.pdf Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast1024_tab.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast1024_tab.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast1024_tab.vhd (revision 3) @@ -0,0 +1,92 @@ +-- +-- crc32_fast1024_tab.vhd: A 32-bit CRC (IEEE) table for processing fixed 1024 bits in parallel +-- Copyright (C) 2011 CESNET +-- Author(s): Lukas Kekely +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in +-- the documentation and/or other materials provided with the +-- distribution. +-- 3. Neither the name of the Company nor the names of its contributors +-- may be used to endorse or promote products derived from this +-- software without specific prior written permission. +-- +-- This software is provided ``as is'', and any express or implied +-- warranties, including, but not limited to, the implied warranties of +-- merchantability and fitness for a particular purpose are disclaimed. +-- In no event shall the company or contributors be liable for any +-- direct, indirect, incidental, special, exemplary, or consequential +-- damages (including, but not limited to, procurement of substitute +-- goods or services; loss of use, data, or profits; or business +-- interruption) however caused and on any theory of liability, whether +-- in contract, strict liability, or tort (including negligence or +-- otherwise) arising in any way out of the use of this software, even +-- if advised of the possibility of such damage. +-- +-- $Id$ +-- +-- TODO: +-- +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; +use IEEE.std_logic_unsigned.all; +use IEEE.numeric_std.all; +use WORK.math_pack.all; +-- ---------------------------------------------------------------------------- +-- Entity declaration +-- ---------------------------------------------------------------------------- +entity crc32_fast1024_tab is + port( + DI : in std_logic_vector(1024-1 downto 0); + DO : out std_logic_vector(31 downto 0) + ); +end entity crc32_fast1024_tab; + +-- ---------------------------------------------------------------------------- +-- Architecture declaration +-- ---------------------------------------------------------------------------- +architecture arch of crc32_fast1024_tab is +begin +-- 32-bit CRC equations processing 1024 bits in parallel (VHDL code) +-- Generator polynomial: 0x104C11DB7 + DO(0) <= DI(576) XOR DI(269) XOR DI(1000) XOR DI(42) XOR DI(748) XOR DI(354) XOR DI(587) XOR DI(769) XOR DI(776) XOR DI(906) XOR DI(86) XOR DI(46) XOR DI(280) XOR DI(868) XOR DI(707) XOR DI(588) XOR DI(446) XOR DI(302) XOR DI(89) XOR DI(380) XOR DI(337) XOR DI(834) XOR DI(995) XOR DI(330) XOR DI(45) XOR DI(797) XOR DI(309) XOR DI(185) XOR DI(855) XOR DI(572) XOR DI(979) XOR DI(559) XOR DI(53) XOR DI(90) XOR DI(940) XOR DI(50) XOR DI(171) XOR DI(91) XOR DI(925) XOR DI(355) XOR DI(689) XOR DI(873) XOR DI(93) XOR DI(575) XOR DI(796) XOR DI(926) XOR DI(838) XOR DI(69) XOR DI(333) XOR DI(417) XOR DI(976) XOR DI(765) XOR DI(734) XOR DI(612) XOR DI(49) XOR DI(106) XOR DI(192) XOR DI(301) XOR DI(841) XOR DI(468) XOR DI(996) XOR DI(858) XOR DI(562) XOR DI(969) XOR DI(966) XOR DI(755) XOR DI(182) XOR DI(831) XOR DI(552) XOR DI(959) XOR DI(956) XOR DI(439) XOR DI(153) XOR DI(638) XOR DI(358) XOR DI(580) XOR DI(704) XOR DI(123) XOR DI(449) XOR DI(163) XOR DI(221) XOR DI(737) XOR DI(605) XOR DI(648) XOR DI(240) XOR DI(495) XOR DI(66) XOR DI(702) XOR DI(633) XOR DI(5) XOR DI(187) XOR DI(910) XOR DI(980) XOR DI(842) XOR DI(107) XOR DI(686) XOR DI(368) XOR DI(482) XOR DI(913) XOR DI(998) XOR DI(421) XOR DI(798) XOR DI(531) XOR DI(384) XOR DI(174) XOR DI(927) XOR DI(498) XOR DI(590) XOR DI(800) XOR DI(261) XOR DI(226) XOR DI(636) XOR DI(304) XOR DI(8) XOR DI(977) XOR DI(714) XOR DI(266) XOR DI(104) XOR DI(544) XOR DI(941) XOR DI(356) XOR DI(189) XOR DI(929) XOR DI(133) XOR DI(675) XOR DI(1014) XOR DI(760) XOR DI(767) XOR DI(897) XOR DI(437) XOR DI(371) XOR DI(300) XOR DI(563) XOR DI(787) XOR DI(756) XOR DI(725) XOR DI(292) XOR DI(459) XOR DI(173) XOR DI(822) XOR DI(543) XOR DI(231) XOR DI(57) XOR DI(624) XOR DI(833) XOR DI(359) XOR DI(522) XOR DI(375) XOR DI(918) XOR DI(217) XOR DI(705) XOR DI(257) XOR DI(124) XOR DI(666) XOR DI(751) XOR DI(888) XOR DI(428) XOR DI(747) XOR DI(283) XOR DI(450) XOR DI(534) XOR DI(222) XOR DI(615) XOR DI(513) XOR DI(248) XOR DI(738) XOR DI(441) XOR DI(213) XOR DI(239) XOR DI(729) XOR DI(880) XOR DI(485) XOR DI(814) XOR DI(889) XOR DI(727) XOR DI(404) XOR DI(634) XOR DI(887) XOR DI(658) XOR DI(16) XOR DI(250) XOR DI(608) XOR DI(326) XOR DI(420) XOR DI(505) XOR DI(466) XOR DI(494) XOR DI(71) XOR DI(853) XOR DI(322) XOR DI(30) XOR DI(156) XOR DI(76) XOR DI(911) XOR DI(823) XOR DI(961) XOR DI(547) XOR DI(424) XOR DI(138) XOR DI(148) XOR DI(687) XOR DI(898) XOR DI(999) XOR DI(772) XOR DI(109) XOR DI(736) XOR DI(413) XOR DI(224) XOR DI(470) XOR DI(712) XOR DI(643) XOR DI(15) XOR DI(896) XOR DI(175) XOR DI(928) XOR DI(667) XOR DI(25) XOR DI(259) XOR DI(288) XOR DI(32) XOR DI(591) XOR DI(617) XOR DI(400) XOR DI(335) XOR DI(812) XOR DI(429) XOR DI(866) XOR DI(305) XOR DI(284) XOR DI(545) XOR DI(662) XOR DI(942) XOR DI(126) XOR DI(357) XOR DI(146) XOR DI(190) XOR DI(197) XOR DI(616) XOR DI(943) XOR DI(854) XOR DI(514) XOR DI(533) XOR DI(930) XOR DI(134) XOR DI(475) XOR DI(682) XOR DI(503) XOR DI(1015) XOR DI(994) XOR DI(763) XOR DI(80) XOR DI(40) XOR DI(274) XOR DI(862) XOR DI(83) XOR DI(331) XOR DI(324) XOR DI(39) XOR DI(303) XOR DI(566) XOR DI(47) XOR DI(44) XOR DI(165) XOR DI(85) XOR DI(349) XOR DI(683) XOR DI(790) XOR DI(920) XOR DI(832) XOR DI(411) XOR DI(970) XOR DI(759) XOR DI(728) XOR DI(606) XOR DI(43) XOR DI(295) XOR DI(990) XOR DI(852) XOR DI(556) XOR DI(963) XOR DI(176) XOR DI(825) XOR DI(433) XOR DI(147) XOR DI(632) XOR DI(352) XOR DI(574) XOR DI(117) XOR DI(157) XOR DI(215) XOR DI(489) XOR DI(696) XOR DI(974) XOR DI(836) XOR DI(680) XOR DI(907) XOR DI(992) XOR DI(415) XOR DI(378) XOR DI(921) XOR DI(492) XOR DI(794) XOR DI(255) XOR DI(220) XOR DI(971) XOR DI(538) XOR DI(350) XOR DI(923) XOR DI(127) XOR DI(1008) XOR DI(431) XOR DI(781) XOR DI(750) XOR DI(719) XOR DI(453) XOR DI(167) XOR DI(816) XOR DI(827) XOR DI(516) XOR DI(369) XOR DI(211) XOR DI(118) XOR DI(745) XOR DI(422) XOR DI(741) XOR DI(277) XOR DI(444) XOR DI(216) XOR DI(242) XOR DI(732) XOR DI(233) XOR DI(479) XOR DI(808) XOR DI(721) XOR DI(398) XOR DI(628) XOR DI(881) XOR DI(652) XOR DI(244) XOR DI(602) XOR DI(320) XOR DI(414) XOR DI(499) XOR DI(65) XOR DI(316) XOR DI(24) XOR DI(150) XOR DI(70) XOR DI(905) XOR DI(817) XOR DI(541) XOR DI(418) XOR DI(892) XOR DI(993) XOR DI(730) XOR DI(407) XOR DI(218) XOR DI(464) XOR DI(706) XOR DI(637) XOR DI(9) XOR DI(890) XOR DI(661) XOR DI(19) XOR DI(282) XOR DI(26) XOR DI(394) XOR DI(329) XOR DI(299) XOR DI(656) XOR DI(120) XOR DI(351) XOR DI(184) XOR DI(610) XOR DI(937) XOR DI(508) XOR DI(128) XOR DI(469) XOR DI(676) XOR DI(74) XOR DI(34) XOR DI(268) XOR DI(297) XOR DI(560) XOR DI(41) XOR DI(677) XOR DI(914) XOR DI(826) XOR DI(405) XOR DI(964) XOR DI(722) XOR DI(600) XOR DI(957) XOR DI(170) XOR DI(141) XOR DI(626) XOR DI(151) XOR DI(209) XOR DI(690) XOR DI(830) XOR DI(901) XOR DI(409) XOR DI(372) XOR DI(214) XOR DI(532) XOR DI(344) XOR DI(121) XOR DI(425) XOR DI(161) XOR DI(810) XOR DI(821) XOR DI(510) XOR DI(205) XOR DI(271) XOR DI(438) XOR DI(210) XOR DI(236) XOR DI(726) XOR DI(473) XOR DI(715) XOR DI(392) XOR DI(875) XOR DI(646) XOR DI(238) XOR DI(314) XOR DI(493) XOR DI(18) XOR DI(64) XOR DI(899) XOR DI(535) XOR DI(412) XOR DI(987) XOR DI(724) XOR DI(401) XOR DI(212) XOR DI(631) XOR DI(3) XOR DI(655) XOR DI(13) XOR DI(276) XOR DI(20) XOR DI(388) XOR DI(323) XOR DI(293) XOR DI(650) XOR DI(114) XOR DI(178) XOR DI(502) XOR DI(122) XOR DI(463) XOR DI(28) XOR DI(262) XOR DI(554) XOR DI(671) XOR DI(908) XOR DI(958) XOR DI(951) XOR DI(164) XOR DI(135) XOR DI(620) XOR DI(145) XOR DI(366) XOR DI(208) XOR DI(338) XOR DI(155) XOR DI(815) XOR DI(199) XOR DI(432) XOR DI(467) XOR DI(709) XOR DI(869) XOR DI(12) XOR DI(529) XOR DI(395) XOR DI(206) XOR DI(625) XOR DI(382) XOR DI(317) XOR DI(496) XOR DI(457) XOR DI(548) XOR DI(665) XOR DI(952) XOR DI(945) XOR DI(149) XOR DI(461) XOR DI(703) XOR DI(863) XOR DI(6) XOR DI(523) XOR DI(200) XOR DI(619) XOR DI(376) XOR DI(490) XOR DI(451) XOR DI(542) XOR DI(939) XOR DI(143) XOR DI(697) XOR DI(857) XOR DI(0) XOR DI(517) XOR DI(484) XOR DI(536) XOR DI(137) XOR DI(691) XOR DI(530) XOR DI(131) XOR DI(685) XOR DI(524) XOR DI(125) XOR DI(679) XOR DI(518) XOR DI(512) XOR DI(506) XOR DI(1012) XOR DI(1018); + DO(1) <= DI(577) XOR DI(270) XOR DI(1001) XOR DI(43) XOR DI(749) XOR DI(355) XOR DI(588) XOR DI(770) XOR DI(777) XOR DI(907) XOR DI(87) XOR DI(47) XOR DI(281) XOR DI(869) XOR DI(708) XOR DI(589) XOR DI(447) XOR DI(303) XOR DI(90) XOR DI(381) XOR DI(338) XOR DI(835) XOR DI(996) XOR DI(331) XOR DI(46) XOR DI(798) XOR DI(310) XOR DI(186) XOR DI(856) XOR DI(573) XOR DI(980) XOR DI(560) XOR DI(54) XOR DI(91) XOR DI(941) XOR DI(51) XOR DI(172) XOR DI(92) XOR DI(926) XOR DI(356) XOR DI(690) XOR DI(874) XOR DI(94) XOR DI(576) XOR DI(797) XOR DI(927) XOR DI(839) XOR DI(70) XOR DI(334) XOR DI(418) XOR DI(977) XOR DI(766) XOR DI(735) XOR DI(613) XOR DI(50) XOR DI(107) XOR DI(193) XOR DI(302) XOR DI(842) XOR DI(469) XOR DI(997) XOR DI(859) XOR DI(563) XOR DI(970) XOR DI(967) XOR DI(756) XOR DI(183) XOR DI(832) XOR DI(553) XOR DI(960) XOR DI(957) XOR DI(440) XOR DI(154) XOR DI(639) XOR DI(359) XOR DI(581) XOR DI(705) XOR DI(124) XOR DI(450) XOR DI(164) XOR DI(222) XOR DI(738) XOR DI(606) XOR DI(649) XOR DI(241) XOR DI(496) XOR DI(67) XOR DI(703) XOR DI(634) XOR DI(6) XOR DI(188) XOR DI(911) XOR DI(981) XOR DI(843) XOR DI(108) XOR DI(687) XOR DI(369) XOR DI(483) XOR DI(914) XOR DI(999) XOR DI(422) XOR DI(799) XOR DI(532) XOR DI(385) XOR DI(175) XOR DI(928) XOR DI(499) XOR DI(591) XOR DI(801) XOR DI(262) XOR DI(227) XOR DI(637) XOR DI(305) XOR DI(9) XOR DI(978) XOR DI(715) XOR DI(267) XOR DI(105) XOR DI(545) XOR DI(942) XOR DI(357) XOR DI(190) XOR DI(930) XOR DI(134) XOR DI(676) XOR DI(1015) XOR DI(761) XOR DI(768) XOR DI(898) XOR DI(438) XOR DI(372) XOR DI(301) XOR DI(564) XOR DI(788) XOR DI(757) XOR DI(726) XOR DI(293) XOR DI(460) XOR DI(174) XOR DI(823) XOR DI(544) XOR DI(232) XOR DI(58) XOR DI(625) XOR DI(834) XOR DI(360) XOR DI(523) XOR DI(376) XOR DI(919) XOR DI(218) XOR DI(706) XOR DI(258) XOR DI(125) XOR DI(667) XOR DI(752) XOR DI(889) XOR DI(429) XOR DI(748) XOR DI(284) XOR DI(451) XOR DI(535) XOR DI(223) XOR DI(616) XOR DI(514) XOR DI(249) XOR DI(739) XOR DI(442) XOR DI(214) XOR DI(240) XOR DI(730) XOR DI(881) XOR DI(486) XOR DI(815) XOR DI(890) XOR DI(728) XOR DI(405) XOR DI(635) XOR DI(888) XOR DI(659) XOR DI(17) XOR DI(251) XOR DI(609) XOR DI(327) XOR DI(421) XOR DI(506) XOR DI(467) XOR DI(495) XOR DI(72) XOR DI(854) XOR DI(323) XOR DI(31) XOR DI(157) XOR DI(77) XOR DI(912) XOR DI(824) XOR DI(962) XOR DI(548) XOR DI(425) XOR DI(139) XOR DI(149) XOR DI(688) XOR DI(899) XOR DI(1000) XOR DI(773) XOR DI(110) XOR DI(737) XOR DI(414) XOR DI(225) XOR DI(471) XOR DI(713) XOR DI(644) XOR DI(16) XOR DI(897) XOR DI(176) XOR DI(929) XOR DI(668) XOR DI(26) XOR DI(260) XOR DI(289) XOR DI(33) XOR DI(592) XOR DI(618) XOR DI(401) XOR DI(336) XOR DI(813) XOR DI(430) XOR DI(867) XOR DI(306) XOR DI(285) XOR DI(546) XOR DI(663) XOR DI(943) XOR DI(127) XOR DI(358) XOR DI(147) XOR DI(191) XOR DI(198) XOR DI(617) XOR DI(944) XOR DI(855) XOR DI(515) XOR DI(534) XOR DI(931) XOR DI(135) XOR DI(476) XOR DI(683) XOR DI(504) XOR DI(1016) XOR DI(995) XOR DI(764) XOR DI(81) XOR DI(41) XOR DI(275) XOR DI(863) XOR DI(84) XOR DI(332) XOR DI(325) XOR DI(40) XOR DI(304) XOR DI(567) XOR DI(48) XOR DI(45) XOR DI(166) XOR DI(86) XOR DI(350) XOR DI(684) XOR DI(791) XOR DI(921) XOR DI(833) XOR DI(412) XOR DI(971) XOR DI(760) XOR DI(729) XOR DI(607) XOR DI(44) XOR DI(296) XOR DI(991) XOR DI(853) XOR DI(557) XOR DI(964) XOR DI(177) XOR DI(826) XOR DI(434) XOR DI(148) XOR DI(633) XOR DI(353) XOR DI(575) XOR DI(118) XOR DI(158) XOR DI(216) XOR DI(490) XOR DI(697) XOR DI(0) XOR DI(975) XOR DI(837) XOR DI(681) XOR DI(908) XOR DI(993) XOR DI(416) XOR DI(379) XOR DI(922) XOR DI(493) XOR DI(795) XOR DI(256) XOR DI(221) XOR DI(972) XOR DI(539) XOR DI(351) XOR DI(924) XOR DI(128) XOR DI(1009) XOR DI(432) XOR DI(782) XOR DI(751) XOR DI(720) XOR DI(454) XOR DI(168) XOR DI(817) XOR DI(828) XOR DI(517) XOR DI(370) XOR DI(212) XOR DI(119) XOR DI(746) XOR DI(423) XOR DI(742) XOR DI(278) XOR DI(445) XOR DI(217) XOR DI(243) XOR DI(733) XOR DI(234) XOR DI(480) XOR DI(809) XOR DI(722) XOR DI(399) XOR DI(629) XOR DI(882) XOR DI(653) XOR DI(245) XOR DI(603) XOR DI(321) XOR DI(415) XOR DI(500) XOR DI(66) XOR DI(317) XOR DI(25) XOR DI(151) XOR DI(71) XOR DI(906) XOR DI(818) XOR DI(542) XOR DI(419) XOR DI(893) XOR DI(994) XOR DI(731) XOR DI(408) XOR DI(219) XOR DI(465) XOR DI(707) XOR DI(638) XOR DI(10) XOR DI(891) XOR DI(662) XOR DI(20) XOR DI(283) XOR DI(27) XOR DI(395) XOR DI(330) XOR DI(300) XOR DI(657) XOR DI(121) XOR DI(352) XOR DI(185) XOR DI(611) XOR DI(938) XOR DI(509) XOR DI(129) XOR DI(470) XOR DI(677) XOR DI(75) XOR DI(35) XOR DI(269) XOR DI(298) XOR DI(561) XOR DI(42) XOR DI(678) XOR DI(915) XOR DI(827) XOR DI(406) XOR DI(965) XOR DI(723) XOR DI(601) XOR DI(958) XOR DI(171) XOR DI(142) XOR DI(627) XOR DI(152) XOR DI(210) XOR DI(691) XOR DI(831) XOR DI(902) XOR DI(410) XOR DI(373) XOR DI(215) XOR DI(533) XOR DI(345) XOR DI(122) XOR DI(426) XOR DI(162) XOR DI(811) XOR DI(822) XOR DI(511) XOR DI(206) XOR DI(272) XOR DI(439) XOR DI(211) XOR DI(237) XOR DI(727) XOR DI(474) XOR DI(716) XOR DI(393) XOR DI(876) XOR DI(647) XOR DI(239) XOR DI(315) XOR DI(494) XOR DI(19) XOR DI(65) XOR DI(900) XOR DI(536) XOR DI(413) XOR DI(988) XOR DI(725) XOR DI(402) XOR DI(213) XOR DI(632) XOR DI(4) XOR DI(656) XOR DI(14) XOR DI(277) XOR DI(21) XOR DI(389) XOR DI(324) XOR DI(294) XOR DI(651) XOR DI(115) XOR DI(179) XOR DI(503) XOR DI(123) XOR DI(464) XOR DI(29) XOR DI(263) XOR DI(555) XOR DI(672) XOR DI(909) XOR DI(959) XOR DI(952) XOR DI(165) XOR DI(136) XOR DI(621) XOR DI(146) XOR DI(367) XOR DI(209) XOR DI(339) XOR DI(156) XOR DI(816) XOR DI(200) XOR DI(433) XOR DI(468) XOR DI(710) XOR DI(870) XOR DI(13) XOR DI(530) XOR DI(396) XOR DI(207) XOR DI(626) XOR DI(383) XOR DI(318) XOR DI(497) XOR DI(458) XOR DI(549) XOR DI(666) XOR DI(953) XOR DI(946) XOR DI(150) XOR DI(462) XOR DI(704) XOR DI(864) XOR DI(7) XOR DI(524) XOR DI(201) XOR DI(620) XOR DI(377) XOR DI(491) XOR DI(452) XOR DI(543) XOR DI(940) XOR DI(144) XOR DI(698) XOR DI(858) XOR DI(1) XOR DI(518) XOR DI(485) XOR DI(537) XOR DI(138) XOR DI(692) XOR DI(531) XOR DI(132) XOR DI(686) XOR DI(525) XOR DI(126) XOR DI(680) XOR DI(519) XOR DI(513) XOR DI(507) XOR DI(1013) XOR DI(1019); + DO(2) <= DI(578) XOR DI(271) XOR DI(1002) XOR DI(44) XOR DI(750) XOR DI(356) XOR DI(589) XOR DI(771) XOR DI(778) XOR DI(908) XOR DI(88) XOR DI(48) XOR DI(282) XOR DI(870) XOR DI(709) XOR DI(590) XOR DI(448) XOR DI(304) XOR DI(91) XOR DI(382) XOR DI(339) XOR DI(836) XOR DI(997) XOR DI(332) XOR DI(47) XOR DI(799) XOR DI(311) XOR DI(187) XOR DI(857) XOR DI(574) XOR DI(981) XOR DI(561) XOR DI(55) XOR DI(92) XOR DI(942) XOR DI(52) XOR DI(173) XOR DI(93) XOR DI(927) XOR DI(357) XOR DI(691) XOR DI(875) XOR DI(95) XOR DI(577) XOR DI(798) XOR DI(928) XOR DI(840) XOR DI(71) XOR DI(335) XOR DI(419) XOR DI(978) XOR DI(767) XOR DI(736) XOR DI(614) XOR DI(51) XOR DI(108) XOR DI(194) XOR DI(303) XOR DI(843) XOR DI(470) XOR DI(998) XOR DI(860) XOR DI(564) XOR DI(971) XOR DI(968) XOR DI(757) XOR DI(184) XOR DI(833) XOR DI(554) XOR DI(961) XOR DI(958) XOR DI(441) XOR DI(155) XOR DI(640) XOR DI(360) XOR DI(582) XOR DI(706) XOR DI(125) XOR DI(451) XOR DI(165) XOR DI(223) XOR DI(739) XOR DI(607) XOR DI(650) XOR DI(242) XOR DI(497) XOR DI(68) XOR DI(704) XOR DI(635) XOR DI(7) XOR DI(189) XOR DI(912) XOR DI(982) XOR DI(844) XOR DI(109) XOR DI(688) XOR DI(370) XOR DI(484) XOR DI(915) XOR DI(1000) XOR DI(423) XOR DI(800) XOR DI(533) XOR DI(386) XOR DI(176) XOR DI(929) XOR DI(500) XOR DI(592) XOR DI(802) XOR DI(263) XOR DI(228) XOR DI(638) XOR DI(306) XOR DI(10) XOR DI(979) XOR DI(716) XOR DI(268) XOR DI(106) XOR DI(546) XOR DI(943) XOR DI(358) XOR DI(191) XOR DI(931) XOR DI(135) XOR DI(677) XOR DI(1016) XOR DI(762) XOR DI(769) XOR DI(899) XOR DI(439) XOR DI(373) XOR DI(302) XOR DI(565) XOR DI(789) XOR DI(758) XOR DI(727) XOR DI(294) XOR DI(461) XOR DI(175) XOR DI(824) XOR DI(545) XOR DI(233) XOR DI(59) XOR DI(626) XOR DI(835) XOR DI(361) XOR DI(524) XOR DI(377) XOR DI(920) XOR DI(219) XOR DI(707) XOR DI(259) XOR DI(126) XOR DI(668) XOR DI(753) XOR DI(890) XOR DI(430) XOR DI(749) XOR DI(285) XOR DI(452) XOR DI(536) XOR DI(224) XOR DI(617) XOR DI(515) XOR DI(250) XOR DI(740) XOR DI(443) XOR DI(215) XOR DI(241) XOR DI(731) XOR DI(882) XOR DI(487) XOR DI(816) XOR DI(891) XOR DI(729) XOR DI(406) XOR DI(636) XOR DI(889) XOR DI(660) XOR DI(18) XOR DI(252) XOR DI(610) XOR DI(328) XOR DI(422) XOR DI(507) XOR DI(468) XOR DI(496) XOR DI(73) XOR DI(855) XOR DI(324) XOR DI(32) XOR DI(158) XOR DI(78) XOR DI(913) XOR DI(825) XOR DI(963) XOR DI(549) XOR DI(426) XOR DI(140) XOR DI(150) XOR DI(689) XOR DI(900) XOR DI(1001) XOR DI(774) XOR DI(111) XOR DI(738) XOR DI(415) XOR DI(226) XOR DI(472) XOR DI(714) XOR DI(645) XOR DI(17) XOR DI(898) XOR DI(177) XOR DI(930) XOR DI(669) XOR DI(27) XOR DI(261) XOR DI(290) XOR DI(34) XOR DI(593) XOR DI(619) XOR DI(402) XOR DI(337) XOR DI(814) XOR DI(431) XOR DI(868) XOR DI(307) XOR DI(286) XOR DI(547) XOR DI(664) XOR DI(944) XOR DI(128) XOR DI(359) XOR DI(148) XOR DI(192) XOR DI(199) XOR DI(618) XOR DI(945) XOR DI(856) XOR DI(516) XOR DI(535) XOR DI(932) XOR DI(136) XOR DI(477) XOR DI(684) XOR DI(505) XOR DI(1017) XOR DI(996) XOR DI(765) XOR DI(82) XOR DI(42) XOR DI(276) XOR DI(864) XOR DI(85) XOR DI(333) XOR DI(326) XOR DI(41) XOR DI(305) XOR DI(568) XOR DI(49) XOR DI(46) XOR DI(167) XOR DI(87) XOR DI(351) XOR DI(685) XOR DI(792) XOR DI(922) XOR DI(834) XOR DI(413) XOR DI(972) XOR DI(761) XOR DI(730) XOR DI(608) XOR DI(45) XOR DI(297) XOR DI(992) XOR DI(854) XOR DI(558) XOR DI(965) XOR DI(178) XOR DI(827) XOR DI(435) XOR DI(149) XOR DI(634) XOR DI(354) XOR DI(576) XOR DI(119) XOR DI(159) XOR DI(217) XOR DI(491) XOR DI(698) XOR DI(1) XOR DI(976) XOR DI(838) XOR DI(682) XOR DI(909) XOR DI(994) XOR DI(417) XOR DI(380) XOR DI(923) XOR DI(494) XOR DI(796) XOR DI(257) XOR DI(222) XOR DI(973) XOR DI(540) XOR DI(352) XOR DI(925) XOR DI(129) XOR DI(1010) XOR DI(433) XOR DI(783) XOR DI(752) XOR DI(721) XOR DI(455) XOR DI(169) XOR DI(818) XOR DI(829) XOR DI(518) XOR DI(371) XOR DI(213) XOR DI(120) XOR DI(747) XOR DI(424) XOR DI(743) XOR DI(279) XOR DI(446) XOR DI(218) XOR DI(244) XOR DI(734) XOR DI(235) XOR DI(481) XOR DI(810) XOR DI(723) XOR DI(400) XOR DI(630) XOR DI(883) XOR DI(654) XOR DI(246) XOR DI(604) XOR DI(322) XOR DI(416) XOR DI(501) XOR DI(67) XOR DI(318) XOR DI(26) XOR DI(152) XOR DI(72) XOR DI(907) XOR DI(819) XOR DI(543) XOR DI(420) XOR DI(894) XOR DI(995) XOR DI(732) XOR DI(409) XOR DI(220) XOR DI(466) XOR DI(708) XOR DI(639) XOR DI(11) XOR DI(892) XOR DI(663) XOR DI(21) XOR DI(284) XOR DI(28) XOR DI(396) XOR DI(331) XOR DI(301) XOR DI(658) XOR DI(122) XOR DI(353) XOR DI(186) XOR DI(612) XOR DI(939) XOR DI(510) XOR DI(130) XOR DI(471) XOR DI(678) XOR DI(76) XOR DI(36) XOR DI(270) XOR DI(299) XOR DI(562) XOR DI(43) XOR DI(679) XOR DI(916) XOR DI(828) XOR DI(407) XOR DI(966) XOR DI(724) XOR DI(602) XOR DI(959) XOR DI(172) XOR DI(143) XOR DI(628) XOR DI(153) XOR DI(211) XOR DI(692) XOR DI(832) XOR DI(903) XOR DI(411) XOR DI(374) XOR DI(216) XOR DI(534) XOR DI(346) XOR DI(123) XOR DI(427) XOR DI(163) XOR DI(812) XOR DI(823) XOR DI(512) XOR DI(207) XOR DI(273) XOR DI(440) XOR DI(212) XOR DI(238) XOR DI(728) XOR DI(475) XOR DI(717) XOR DI(394) XOR DI(877) XOR DI(648) XOR DI(240) XOR DI(316) XOR DI(495) XOR DI(20) XOR DI(66) XOR DI(901) XOR DI(537) XOR DI(414) XOR DI(989) XOR DI(726) XOR DI(403) XOR DI(214) XOR DI(633) XOR DI(5) XOR DI(657) XOR DI(15) XOR DI(278) XOR DI(22) XOR DI(390) XOR DI(325) XOR DI(295) XOR DI(652) XOR DI(116) XOR DI(180) XOR DI(504) XOR DI(124) XOR DI(465) XOR DI(30) XOR DI(264) XOR DI(556) XOR DI(673) XOR DI(910) XOR DI(960) XOR DI(953) XOR DI(166) XOR DI(137) XOR DI(622) XOR DI(147) XOR DI(368) XOR DI(210) XOR DI(340) XOR DI(157) XOR DI(817) XOR DI(201) XOR DI(434) XOR DI(469) XOR DI(711) XOR DI(871) XOR DI(14) XOR DI(531) XOR DI(397) XOR DI(208) XOR DI(627) XOR DI(384) XOR DI(319) XOR DI(498) XOR DI(459) XOR DI(550) XOR DI(667) XOR DI(954) XOR DI(947) XOR DI(151) XOR DI(463) XOR DI(705) XOR DI(865) XOR DI(8) XOR DI(525) XOR DI(202) XOR DI(621) XOR DI(378) XOR DI(492) XOR DI(453) XOR DI(544) XOR DI(941) XOR DI(145) XOR DI(699) XOR DI(859) XOR DI(2) XOR DI(519) XOR DI(486) XOR DI(538) XOR DI(139) XOR DI(693) XOR DI(532) XOR DI(133) XOR DI(687) XOR DI(526) XOR DI(127) XOR DI(681) XOR DI(520) XOR DI(514) XOR DI(508) XOR DI(1014) XOR DI(1020); + DO(3) <= DI(579) XOR DI(272) XOR DI(1003) XOR DI(45) XOR DI(751) XOR DI(357) XOR DI(590) XOR DI(772) XOR DI(779) XOR DI(909) XOR DI(89) XOR DI(49) XOR DI(283) XOR DI(871) XOR DI(710) XOR DI(591) XOR DI(449) XOR DI(305) XOR DI(92) XOR DI(383) XOR DI(340) XOR DI(837) XOR DI(998) XOR DI(333) XOR DI(48) XOR DI(800) XOR DI(312) XOR DI(188) XOR DI(858) XOR DI(575) XOR DI(982) XOR DI(562) XOR DI(56) XOR DI(93) XOR DI(943) XOR DI(53) XOR DI(174) XOR DI(94) XOR DI(928) XOR DI(358) XOR DI(692) XOR DI(876) XOR DI(96) XOR DI(578) XOR DI(799) XOR DI(929) XOR DI(841) XOR DI(72) XOR DI(336) XOR DI(420) XOR DI(979) XOR DI(768) XOR DI(737) XOR DI(615) XOR DI(52) XOR DI(109) XOR DI(195) XOR DI(304) XOR DI(844) XOR DI(471) XOR DI(999) XOR DI(861) XOR DI(565) XOR DI(972) XOR DI(969) XOR DI(758) XOR DI(185) XOR DI(834) XOR DI(555) XOR DI(962) XOR DI(959) XOR DI(442) XOR DI(156) XOR DI(641) XOR DI(361) XOR DI(583) XOR DI(707) XOR DI(126) XOR DI(452) XOR DI(166) XOR DI(224) XOR DI(740) XOR DI(608) XOR DI(651) XOR DI(243) XOR DI(498) XOR DI(69) XOR DI(705) XOR DI(636) XOR DI(8) XOR DI(190) XOR DI(913) XOR DI(983) XOR DI(845) XOR DI(110) XOR DI(689) XOR DI(371) XOR DI(485) XOR DI(916) XOR DI(1001) XOR DI(424) XOR DI(801) XOR DI(534) XOR DI(387) XOR DI(177) XOR DI(930) XOR DI(501) XOR DI(593) XOR DI(803) XOR DI(264) XOR DI(229) XOR DI(639) XOR DI(307) XOR DI(11) XOR DI(980) XOR DI(717) XOR DI(269) XOR DI(107) XOR DI(547) XOR DI(944) XOR DI(359) XOR DI(192) XOR DI(932) XOR DI(136) XOR DI(678) XOR DI(1017) XOR DI(763) XOR DI(770) XOR DI(900) XOR DI(440) XOR DI(374) XOR DI(303) XOR DI(566) XOR DI(790) XOR DI(759) XOR DI(728) XOR DI(295) XOR DI(462) XOR DI(176) XOR DI(825) XOR DI(546) XOR DI(234) XOR DI(60) XOR DI(627) XOR DI(836) XOR DI(362) XOR DI(525) XOR DI(378) XOR DI(921) XOR DI(220) XOR DI(708) XOR DI(260) XOR DI(127) XOR DI(669) XOR DI(754) XOR DI(891) XOR DI(431) XOR DI(750) XOR DI(286) XOR DI(453) XOR DI(537) XOR DI(225) XOR DI(618) XOR DI(516) XOR DI(251) XOR DI(741) XOR DI(444) XOR DI(216) XOR DI(242) XOR DI(732) XOR DI(883) XOR DI(488) XOR DI(817) XOR DI(892) XOR DI(730) XOR DI(407) XOR DI(637) XOR DI(890) XOR DI(661) XOR DI(19) XOR DI(253) XOR DI(611) XOR DI(329) XOR DI(423) XOR DI(508) XOR DI(469) XOR DI(497) XOR DI(74) XOR DI(856) XOR DI(325) XOR DI(33) XOR DI(159) XOR DI(79) XOR DI(914) XOR DI(826) XOR DI(964) XOR DI(550) XOR DI(427) XOR DI(141) XOR DI(151) XOR DI(690) XOR DI(901) XOR DI(1002) XOR DI(775) XOR DI(112) XOR DI(739) XOR DI(416) XOR DI(227) XOR DI(473) XOR DI(715) XOR DI(646) XOR DI(18) XOR DI(899) XOR DI(178) XOR DI(931) XOR DI(670) XOR DI(28) XOR DI(262) XOR DI(291) XOR DI(35) XOR DI(594) XOR DI(620) XOR DI(403) XOR DI(338) XOR DI(815) XOR DI(432) XOR DI(869) XOR DI(308) XOR DI(287) XOR DI(548) XOR DI(665) XOR DI(945) XOR DI(129) XOR DI(360) XOR DI(149) XOR DI(193) XOR DI(200) XOR DI(619) XOR DI(946) XOR DI(857) XOR DI(517) XOR DI(536) XOR DI(933) XOR DI(137) XOR DI(478) XOR DI(685) XOR DI(506) XOR DI(1018) XOR DI(997) XOR DI(766) XOR DI(83) XOR DI(43) XOR DI(277) XOR DI(865) XOR DI(86) XOR DI(334) XOR DI(327) XOR DI(42) XOR DI(306) XOR DI(569) XOR DI(50) XOR DI(47) XOR DI(168) XOR DI(88) XOR DI(352) XOR DI(686) XOR DI(793) XOR DI(923) XOR DI(835) XOR DI(414) XOR DI(973) XOR DI(762) XOR DI(731) XOR DI(609) XOR DI(46) XOR DI(298) XOR DI(993) XOR DI(855) XOR DI(559) XOR DI(966) XOR DI(179) XOR DI(828) XOR DI(436) XOR DI(150) XOR DI(635) XOR DI(355) XOR DI(577) XOR DI(120) XOR DI(160) XOR DI(218) XOR DI(492) XOR DI(699) XOR DI(2) XOR DI(977) XOR DI(839) XOR DI(683) XOR DI(910) XOR DI(995) XOR DI(418) XOR DI(381) XOR DI(924) XOR DI(495) XOR DI(797) XOR DI(258) XOR DI(223) XOR DI(974) XOR DI(541) XOR DI(353) XOR DI(926) XOR DI(130) XOR DI(1011) XOR DI(434) XOR DI(784) XOR DI(753) XOR DI(722) XOR DI(456) XOR DI(170) XOR DI(819) XOR DI(830) XOR DI(519) XOR DI(372) XOR DI(214) XOR DI(121) XOR DI(748) XOR DI(425) XOR DI(744) XOR DI(280) XOR DI(447) XOR DI(219) XOR DI(245) XOR DI(735) XOR DI(236) XOR DI(482) XOR DI(811) XOR DI(724) XOR DI(401) XOR DI(631) XOR DI(884) XOR DI(655) XOR DI(247) XOR DI(605) XOR DI(323) XOR DI(417) XOR DI(502) XOR DI(68) XOR DI(319) XOR DI(27) XOR DI(153) XOR DI(73) XOR DI(908) XOR DI(820) XOR DI(544) XOR DI(421) XOR DI(895) XOR DI(996) XOR DI(733) XOR DI(410) XOR DI(221) XOR DI(467) XOR DI(709) XOR DI(640) XOR DI(12) XOR DI(893) XOR DI(664) XOR DI(22) XOR DI(285) XOR DI(29) XOR DI(397) XOR DI(332) XOR DI(302) XOR DI(659) XOR DI(123) XOR DI(354) XOR DI(187) XOR DI(613) XOR DI(940) XOR DI(511) XOR DI(131) XOR DI(472) XOR DI(679) XOR DI(77) XOR DI(37) XOR DI(271) XOR DI(300) XOR DI(563) XOR DI(44) XOR DI(680) XOR DI(917) XOR DI(829) XOR DI(408) XOR DI(967) XOR DI(725) XOR DI(603) XOR DI(960) XOR DI(173) XOR DI(144) XOR DI(629) XOR DI(154) XOR DI(212) XOR DI(693) XOR DI(833) XOR DI(904) XOR DI(412) XOR DI(375) XOR DI(217) XOR DI(535) XOR DI(347) XOR DI(124) XOR DI(428) XOR DI(164) XOR DI(813) XOR DI(824) XOR DI(513) XOR DI(208) XOR DI(274) XOR DI(441) XOR DI(213) XOR DI(239) XOR DI(729) XOR DI(476) XOR DI(718) XOR DI(395) XOR DI(878) XOR DI(649) XOR DI(241) XOR DI(317) XOR DI(496) XOR DI(21) XOR DI(67) XOR DI(902) XOR DI(538) XOR DI(415) XOR DI(990) XOR DI(727) XOR DI(404) XOR DI(215) XOR DI(634) XOR DI(6) XOR DI(658) XOR DI(16) XOR DI(279) XOR DI(23) XOR DI(391) XOR DI(326) XOR DI(296) XOR DI(653) XOR DI(117) XOR DI(181) XOR DI(505) XOR DI(125) XOR DI(466) XOR DI(31) XOR DI(265) XOR DI(557) XOR DI(674) XOR DI(911) XOR DI(961) XOR DI(954) XOR DI(167) XOR DI(138) XOR DI(623) XOR DI(148) XOR DI(369) XOR DI(211) XOR DI(341) XOR DI(158) XOR DI(818) XOR DI(202) XOR DI(435) XOR DI(470) XOR DI(712) XOR DI(872) XOR DI(15) XOR DI(532) XOR DI(398) XOR DI(209) XOR DI(628) XOR DI(385) XOR DI(320) XOR DI(499) XOR DI(460) XOR DI(551) XOR DI(668) XOR DI(955) XOR DI(948) XOR DI(152) XOR DI(464) XOR DI(706) XOR DI(866) XOR DI(9) XOR DI(526) XOR DI(203) XOR DI(622) XOR DI(379) XOR DI(493) XOR DI(454) XOR DI(545) XOR DI(942) XOR DI(146) XOR DI(700) XOR DI(860) XOR DI(3) XOR DI(520) XOR DI(487) XOR DI(539) XOR DI(140) XOR DI(694) XOR DI(533) XOR DI(134) XOR DI(688) XOR DI(527) XOR DI(128) XOR DI(682) XOR DI(521) XOR DI(515) XOR DI(509) XOR DI(1015) XOR DI(1021); + DO(4) <= DI(580) XOR DI(273) XOR DI(1004) XOR DI(46) XOR DI(752) XOR DI(358) XOR DI(591) XOR DI(773) XOR DI(780) XOR DI(910) XOR DI(90) XOR DI(50) XOR DI(284) XOR DI(872) XOR DI(711) XOR DI(592) XOR DI(450) XOR DI(306) XOR DI(93) XOR DI(384) XOR DI(341) XOR DI(838) XOR DI(999) XOR DI(334) XOR DI(49) XOR DI(801) XOR DI(313) XOR DI(189) XOR DI(859) XOR DI(576) XOR DI(983) XOR DI(563) XOR DI(57) XOR DI(94) XOR DI(944) XOR DI(54) XOR DI(175) XOR DI(95) XOR DI(929) XOR DI(359) XOR DI(693) XOR DI(877) XOR DI(97) XOR DI(579) XOR DI(800) XOR DI(930) XOR DI(842) XOR DI(73) XOR DI(337) XOR DI(421) XOR DI(980) XOR DI(769) XOR DI(738) XOR DI(616) XOR DI(53) XOR DI(110) XOR DI(196) XOR DI(305) XOR DI(845) XOR DI(472) XOR DI(1000) XOR DI(862) XOR DI(566) XOR DI(973) XOR DI(970) XOR DI(759) XOR DI(186) XOR DI(835) XOR DI(556) XOR DI(963) XOR DI(960) XOR DI(443) XOR DI(157) XOR DI(642) XOR DI(362) XOR DI(584) XOR DI(708) XOR DI(127) XOR DI(453) XOR DI(167) XOR DI(225) XOR DI(741) XOR DI(609) XOR DI(652) XOR DI(244) XOR DI(499) XOR DI(70) XOR DI(706) XOR DI(637) XOR DI(9) XOR DI(191) XOR DI(914) XOR DI(984) XOR DI(846) XOR DI(111) XOR DI(690) XOR DI(372) XOR DI(486) XOR DI(917) XOR DI(1002) XOR DI(425) XOR DI(802) XOR DI(535) XOR DI(388) XOR DI(178) XOR DI(931) XOR DI(502) XOR DI(594) XOR DI(804) XOR DI(265) XOR DI(230) XOR DI(640) XOR DI(308) XOR DI(12) XOR DI(981) XOR DI(718) XOR DI(270) XOR DI(108) XOR DI(548) XOR DI(945) XOR DI(360) XOR DI(193) XOR DI(933) XOR DI(137) XOR DI(679) XOR DI(1018) XOR DI(764) XOR DI(771) XOR DI(901) XOR DI(441) XOR DI(375) XOR DI(304) XOR DI(567) XOR DI(791) XOR DI(760) XOR DI(729) XOR DI(296) XOR DI(463) XOR DI(177) XOR DI(826) XOR DI(547) XOR DI(235) XOR DI(61) XOR DI(628) XOR DI(0) XOR DI(837) XOR DI(363) XOR DI(526) XOR DI(379) XOR DI(922) XOR DI(221) XOR DI(709) XOR DI(261) XOR DI(128) XOR DI(670) XOR DI(755) XOR DI(892) XOR DI(432) XOR DI(751) XOR DI(287) XOR DI(454) XOR DI(538) XOR DI(226) XOR DI(619) XOR DI(517) XOR DI(252) XOR DI(742) XOR DI(445) XOR DI(217) XOR DI(243) XOR DI(733) XOR DI(884) XOR DI(489) XOR DI(818) XOR DI(893) XOR DI(731) XOR DI(408) XOR DI(638) XOR DI(891) XOR DI(662) XOR DI(20) XOR DI(254) XOR DI(612) XOR DI(330) XOR DI(424) XOR DI(509) XOR DI(470) XOR DI(498) XOR DI(75) XOR DI(857) XOR DI(326) XOR DI(34) XOR DI(160) XOR DI(80) XOR DI(915) XOR DI(827) XOR DI(965) XOR DI(551) XOR DI(428) XOR DI(142) XOR DI(152) XOR DI(691) XOR DI(902) XOR DI(1003) XOR DI(776) XOR DI(113) XOR DI(740) XOR DI(417) XOR DI(228) XOR DI(474) XOR DI(716) XOR DI(647) XOR DI(19) XOR DI(900) XOR DI(179) XOR DI(932) XOR DI(671) XOR DI(29) XOR DI(263) XOR DI(292) XOR DI(36) XOR DI(595) XOR DI(621) XOR DI(404) XOR DI(339) XOR DI(816) XOR DI(433) XOR DI(870) XOR DI(309) XOR DI(288) XOR DI(549) XOR DI(666) XOR DI(946) XOR DI(130) XOR DI(361) XOR DI(150) XOR DI(194) XOR DI(201) XOR DI(620) XOR DI(947) XOR DI(858) XOR DI(518) XOR DI(537) XOR DI(934) XOR DI(138) XOR DI(479) XOR DI(686) XOR DI(507) XOR DI(1019) XOR DI(998) XOR DI(767) XOR DI(84) XOR DI(44) XOR DI(278) XOR DI(866) XOR DI(87) XOR DI(335) XOR DI(328) XOR DI(43) XOR DI(307) XOR DI(570) XOR DI(51) XOR DI(48) XOR DI(169) XOR DI(89) XOR DI(353) XOR DI(687) XOR DI(794) XOR DI(924) XOR DI(836) XOR DI(415) XOR DI(974) XOR DI(763) XOR DI(732) XOR DI(610) XOR DI(47) XOR DI(299) XOR DI(994) XOR DI(856) XOR DI(560) XOR DI(967) XOR DI(180) XOR DI(829) XOR DI(437) XOR DI(151) XOR DI(636) XOR DI(356) XOR DI(578) XOR DI(121) XOR DI(161) XOR DI(219) XOR DI(493) XOR DI(700) XOR DI(3) XOR DI(978) XOR DI(840) XOR DI(684) XOR DI(911) XOR DI(996) XOR DI(419) XOR DI(382) XOR DI(925) XOR DI(496) XOR DI(798) XOR DI(259) XOR DI(224) XOR DI(975) XOR DI(542) XOR DI(354) XOR DI(927) XOR DI(131) XOR DI(1012) XOR DI(435) XOR DI(785) XOR DI(754) XOR DI(723) XOR DI(457) XOR DI(171) XOR DI(820) XOR DI(831) XOR DI(520) XOR DI(373) XOR DI(215) XOR DI(122) XOR DI(749) XOR DI(426) XOR DI(745) XOR DI(281) XOR DI(448) XOR DI(220) XOR DI(246) XOR DI(736) XOR DI(237) XOR DI(483) XOR DI(812) XOR DI(725) XOR DI(402) XOR DI(632) XOR DI(885) XOR DI(656) XOR DI(248) XOR DI(606) XOR DI(324) XOR DI(418) XOR DI(503) XOR DI(69) XOR DI(320) XOR DI(28) XOR DI(154) XOR DI(74) XOR DI(909) XOR DI(821) XOR DI(545) XOR DI(422) XOR DI(896) XOR DI(997) XOR DI(734) XOR DI(411) XOR DI(222) XOR DI(468) XOR DI(710) XOR DI(641) XOR DI(13) XOR DI(894) XOR DI(665) XOR DI(23) XOR DI(286) XOR DI(30) XOR DI(398) XOR DI(333) XOR DI(303) XOR DI(660) XOR DI(124) XOR DI(355) XOR DI(188) XOR DI(614) XOR DI(941) XOR DI(512) XOR DI(132) XOR DI(473) XOR DI(680) XOR DI(78) XOR DI(38) XOR DI(272) XOR DI(301) XOR DI(564) XOR DI(45) XOR DI(681) XOR DI(918) XOR DI(830) XOR DI(409) XOR DI(968) XOR DI(726) XOR DI(604) XOR DI(961) XOR DI(174) XOR DI(145) XOR DI(630) XOR DI(155) XOR DI(213) XOR DI(694) XOR DI(834) XOR DI(905) XOR DI(413) XOR DI(376) XOR DI(218) XOR DI(536) XOR DI(348) XOR DI(125) XOR DI(429) XOR DI(165) XOR DI(814) XOR DI(825) XOR DI(514) XOR DI(209) XOR DI(275) XOR DI(442) XOR DI(214) XOR DI(240) XOR DI(730) XOR DI(477) XOR DI(719) XOR DI(396) XOR DI(879) XOR DI(650) XOR DI(242) XOR DI(318) XOR DI(497) XOR DI(22) XOR DI(68) XOR DI(903) XOR DI(539) XOR DI(416) XOR DI(991) XOR DI(728) XOR DI(405) XOR DI(216) XOR DI(635) XOR DI(7) XOR DI(659) XOR DI(17) XOR DI(280) XOR DI(24) XOR DI(392) XOR DI(327) XOR DI(297) XOR DI(654) XOR DI(118) XOR DI(182) XOR DI(506) XOR DI(126) XOR DI(467) XOR DI(32) XOR DI(266) XOR DI(558) XOR DI(675) XOR DI(912) XOR DI(962) XOR DI(955) XOR DI(168) XOR DI(139) XOR DI(624) XOR DI(149) XOR DI(370) XOR DI(212) XOR DI(342) XOR DI(159) XOR DI(819) XOR DI(203) XOR DI(436) XOR DI(471) XOR DI(713) XOR DI(873) XOR DI(16) XOR DI(533) XOR DI(399) XOR DI(210) XOR DI(629) XOR DI(386) XOR DI(321) XOR DI(500) XOR DI(461) XOR DI(552) XOR DI(669) XOR DI(956) XOR DI(949) XOR DI(153) XOR DI(465) XOR DI(707) XOR DI(867) XOR DI(10) XOR DI(527) XOR DI(204) XOR DI(623) XOR DI(380) XOR DI(494) XOR DI(455) XOR DI(546) XOR DI(943) XOR DI(147) XOR DI(701) XOR DI(861) XOR DI(4) XOR DI(521) XOR DI(488) XOR DI(540) XOR DI(141) XOR DI(695) XOR DI(534) XOR DI(135) XOR DI(689) XOR DI(528) XOR DI(129) XOR DI(683) XOR DI(522) XOR DI(516) XOR DI(510) XOR DI(1016) XOR DI(1022); + DO(5) <= DI(581) XOR DI(274) XOR DI(1005) XOR DI(47) XOR DI(753) XOR DI(359) XOR DI(592) XOR DI(774) XOR DI(781) XOR DI(911) XOR DI(91) XOR DI(51) XOR DI(285) XOR DI(873) XOR DI(712) XOR DI(593) XOR DI(451) XOR DI(307) XOR DI(94) XOR DI(385) XOR DI(342) XOR DI(839) XOR DI(1000) XOR DI(335) XOR DI(50) XOR DI(802) XOR DI(314) XOR DI(190) XOR DI(860) XOR DI(577) XOR DI(984) XOR DI(564) XOR DI(58) XOR DI(95) XOR DI(945) XOR DI(55) XOR DI(176) XOR DI(96) XOR DI(930) XOR DI(360) XOR DI(694) XOR DI(878) XOR DI(98) XOR DI(580) XOR DI(801) XOR DI(931) XOR DI(843) XOR DI(74) XOR DI(338) XOR DI(422) XOR DI(981) XOR DI(770) XOR DI(739) XOR DI(617) XOR DI(54) XOR DI(111) XOR DI(197) XOR DI(306) XOR DI(846) XOR DI(473) XOR DI(1001) XOR DI(863) XOR DI(567) XOR DI(974) XOR DI(971) XOR DI(760) XOR DI(187) XOR DI(836) XOR DI(557) XOR DI(964) XOR DI(961) XOR DI(444) XOR DI(158) XOR DI(643) XOR DI(0) XOR DI(363) XOR DI(585) XOR DI(709) XOR DI(128) XOR DI(454) XOR DI(168) XOR DI(226) XOR DI(742) XOR DI(610) XOR DI(653) XOR DI(245) XOR DI(500) XOR DI(71) XOR DI(707) XOR DI(638) XOR DI(10) XOR DI(192) XOR DI(915) XOR DI(985) XOR DI(847) XOR DI(112) XOR DI(691) XOR DI(373) XOR DI(487) XOR DI(918) XOR DI(1003) XOR DI(426) XOR DI(803) XOR DI(536) XOR DI(389) XOR DI(179) XOR DI(932) XOR DI(503) XOR DI(595) XOR DI(805) XOR DI(266) XOR DI(231) XOR DI(641) XOR DI(309) XOR DI(13) XOR DI(982) XOR DI(719) XOR DI(271) XOR DI(109) XOR DI(549) XOR DI(946) XOR DI(361) XOR DI(194) XOR DI(934) XOR DI(138) XOR DI(680) XOR DI(1019) XOR DI(765) XOR DI(772) XOR DI(902) XOR DI(442) XOR DI(376) XOR DI(305) XOR DI(568) XOR DI(792) XOR DI(761) XOR DI(730) XOR DI(297) XOR DI(464) XOR DI(178) XOR DI(827) XOR DI(548) XOR DI(236) XOR DI(62) XOR DI(629) XOR DI(1) XOR DI(838) XOR DI(364) XOR DI(527) XOR DI(380) XOR DI(923) XOR DI(222) XOR DI(710) XOR DI(262) XOR DI(129) XOR DI(671) XOR DI(756) XOR DI(893) XOR DI(433) XOR DI(752) XOR DI(288) XOR DI(455) XOR DI(539) XOR DI(227) XOR DI(620) XOR DI(518) XOR DI(253) XOR DI(743) XOR DI(446) XOR DI(218) XOR DI(244) XOR DI(734) XOR DI(885) XOR DI(490) XOR DI(819) XOR DI(894) XOR DI(732) XOR DI(409) XOR DI(639) XOR DI(892) XOR DI(663) XOR DI(21) XOR DI(255) XOR DI(613) XOR DI(331) XOR DI(425) XOR DI(510) XOR DI(471) XOR DI(499) XOR DI(76) XOR DI(858) XOR DI(327) XOR DI(35) XOR DI(161) XOR DI(81) XOR DI(916) XOR DI(828) XOR DI(966) XOR DI(552) XOR DI(429) XOR DI(143) XOR DI(153) XOR DI(692) XOR DI(903) XOR DI(1004) XOR DI(777) XOR DI(114) XOR DI(741) XOR DI(418) XOR DI(229) XOR DI(475) XOR DI(717) XOR DI(648) XOR DI(20) XOR DI(901) XOR DI(180) XOR DI(933) XOR DI(672) XOR DI(30) XOR DI(264) XOR DI(293) XOR DI(37) XOR DI(596) XOR DI(622) XOR DI(405) XOR DI(340) XOR DI(817) XOR DI(434) XOR DI(871) XOR DI(310) XOR DI(289) XOR DI(550) XOR DI(667) XOR DI(947) XOR DI(131) XOR DI(362) XOR DI(151) XOR DI(195) XOR DI(202) XOR DI(621) XOR DI(948) XOR DI(859) XOR DI(519) XOR DI(538) XOR DI(935) XOR DI(139) XOR DI(480) XOR DI(687) XOR DI(508) XOR DI(1020) XOR DI(999) XOR DI(768) XOR DI(85) XOR DI(45) XOR DI(279) XOR DI(867) XOR DI(88) XOR DI(336) XOR DI(329) XOR DI(44) XOR DI(308) XOR DI(571) XOR DI(52) XOR DI(49) XOR DI(170) XOR DI(90) XOR DI(354) XOR DI(688) XOR DI(795) XOR DI(925) XOR DI(837) XOR DI(416) XOR DI(975) XOR DI(764) XOR DI(733) XOR DI(611) XOR DI(48) XOR DI(300) XOR DI(995) XOR DI(857) XOR DI(561) XOR DI(968) XOR DI(181) XOR DI(830) XOR DI(438) XOR DI(152) XOR DI(637) XOR DI(357) XOR DI(579) XOR DI(122) XOR DI(162) XOR DI(220) XOR DI(494) XOR DI(701) XOR DI(4) XOR DI(979) XOR DI(841) XOR DI(685) XOR DI(912) XOR DI(997) XOR DI(420) XOR DI(383) XOR DI(926) XOR DI(497) XOR DI(799) XOR DI(260) XOR DI(225) XOR DI(976) XOR DI(543) XOR DI(355) XOR DI(928) XOR DI(132) XOR DI(1013) XOR DI(436) XOR DI(786) XOR DI(755) XOR DI(724) XOR DI(458) XOR DI(172) XOR DI(821) XOR DI(832) XOR DI(521) XOR DI(374) XOR DI(216) XOR DI(123) XOR DI(750) XOR DI(427) XOR DI(746) XOR DI(282) XOR DI(449) XOR DI(221) XOR DI(247) XOR DI(737) XOR DI(238) XOR DI(484) XOR DI(813) XOR DI(726) XOR DI(403) XOR DI(633) XOR DI(886) XOR DI(657) XOR DI(249) XOR DI(607) XOR DI(325) XOR DI(419) XOR DI(504) XOR DI(70) XOR DI(321) XOR DI(29) XOR DI(155) XOR DI(75) XOR DI(910) XOR DI(822) XOR DI(546) XOR DI(423) XOR DI(897) XOR DI(998) XOR DI(735) XOR DI(412) XOR DI(223) XOR DI(469) XOR DI(711) XOR DI(642) XOR DI(14) XOR DI(895) XOR DI(666) XOR DI(24) XOR DI(287) XOR DI(31) XOR DI(399) XOR DI(334) XOR DI(304) XOR DI(661) XOR DI(125) XOR DI(356) XOR DI(189) XOR DI(615) XOR DI(942) XOR DI(513) XOR DI(133) XOR DI(474) XOR DI(681) XOR DI(79) XOR DI(39) XOR DI(273) XOR DI(302) XOR DI(565) XOR DI(46) XOR DI(682) XOR DI(919) XOR DI(831) XOR DI(410) XOR DI(969) XOR DI(727) XOR DI(605) XOR DI(962) XOR DI(175) XOR DI(146) XOR DI(631) XOR DI(156) XOR DI(214) XOR DI(695) XOR DI(835) XOR DI(906) XOR DI(414) XOR DI(377) XOR DI(219) XOR DI(537) XOR DI(349) XOR DI(126) XOR DI(430) XOR DI(166) XOR DI(815) XOR DI(826) XOR DI(515) XOR DI(210) XOR DI(276) XOR DI(443) XOR DI(215) XOR DI(241) XOR DI(731) XOR DI(478) XOR DI(720) XOR DI(397) XOR DI(880) XOR DI(651) XOR DI(243) XOR DI(319) XOR DI(498) XOR DI(23) XOR DI(69) XOR DI(904) XOR DI(540) XOR DI(417) XOR DI(992) XOR DI(729) XOR DI(406) XOR DI(217) XOR DI(636) XOR DI(8) XOR DI(660) XOR DI(18) XOR DI(281) XOR DI(25) XOR DI(393) XOR DI(328) XOR DI(298) XOR DI(655) XOR DI(119) XOR DI(183) XOR DI(507) XOR DI(127) XOR DI(468) XOR DI(33) XOR DI(267) XOR DI(559) XOR DI(676) XOR DI(913) XOR DI(963) XOR DI(956) XOR DI(169) XOR DI(140) XOR DI(625) XOR DI(150) XOR DI(371) XOR DI(213) XOR DI(343) XOR DI(160) XOR DI(820) XOR DI(204) XOR DI(437) XOR DI(472) XOR DI(714) XOR DI(874) XOR DI(17) XOR DI(534) XOR DI(400) XOR DI(211) XOR DI(630) XOR DI(387) XOR DI(322) XOR DI(501) XOR DI(462) XOR DI(553) XOR DI(670) XOR DI(957) XOR DI(950) XOR DI(154) XOR DI(466) XOR DI(708) XOR DI(868) XOR DI(11) XOR DI(528) XOR DI(205) XOR DI(624) XOR DI(381) XOR DI(495) XOR DI(456) XOR DI(547) XOR DI(944) XOR DI(148) XOR DI(702) XOR DI(862) XOR DI(5) XOR DI(522) XOR DI(489) XOR DI(541) XOR DI(142) XOR DI(696) XOR DI(535) XOR DI(136) XOR DI(690) XOR DI(529) XOR DI(130) XOR DI(684) XOR DI(523) XOR DI(517) XOR DI(511) XOR DI(1017) XOR DI(1023); + DO(6) <= DI(231) XOR DI(582) XOR DI(275) XOR DI(1006) XOR DI(857) XOR DI(825) XOR DI(48) XOR DI(754) XOR DI(74) XOR DI(781) XOR DI(575) XOR DI(360) XOR DI(593) XOR DI(775) XOR DI(890) XOR DI(650) XOR DI(574) XOR DI(432) XOR DI(841) XOR DI(782) XOR DI(912) XOR DI(92) XOR DI(690) XOR DI(109) XOR DI(591) XOR DI(52) XOR DI(619) XOR DI(93) XOR DI(468) XOR DI(899) XOR DI(517) XOR DI(286) XOR DI(874) XOR DI(269) XOR DI(713) XOR DI(873) XOR DI(594) XOR DI(452) XOR DI(57) XOR DI(308) XOR DI(95) XOR DI(386) XOR DI(928) XOR DI(343) XOR DI(840) XOR DI(1001) XOR DI(69) XOR DI(776) XOR DI(338) XOR DI(336) XOR DI(767) XOR DI(707) XOR DI(51) XOR DI(803) XOR DI(979) XOR DI(315) XOR DI(191) XOR DI(861) XOR DI(324) XOR DI(192) XOR DI(578) XOR DI(985) XOR DI(930) XOR DI(565) XOR DI(59) XOR DI(96) XOR DI(946) XOR DI(56) XOR DI(177) XOR DI(97) XOR DI(931) XOR DI(665) XOR DI(750) XOR DI(361) XOR DI(695) XOR DI(879) XOR DI(484) XOR DI(99) XOR DI(165) XOR DI(581) XOR DI(802) XOR DI(932) XOR DI(844) XOR DI(75) XOR DI(339) XOR DI(815) XOR DI(423) XOR DI(107) XOR DI(982) XOR DI(771) XOR DI(740) XOR DI(359) XOR DI(798) XOR DI(618) XOR DI(55) XOR DI(880) XOR DI(600) XOR DI(666) XOR DI(64) XOR DI(590) XOR DI(199) XOR DI(200) XOR DI(636) XOR DI(304) XOR DI(714) XOR DI(112) XOR DI(610) XOR DI(198) XOR DI(307) XOR DI(451) XOR DI(847) XOR DI(474) XOR DI(1002) XOR DI(772) XOR DI(276) XOR DI(864) XOR DI(85) XOR DI(376) XOR DI(333) XOR DI(568) XOR DI(975) XOR DI(921) XOR DI(834) XOR DI(65) XOR DI(972) XOR DI(761) XOR DI(188) XOR DI(837) XOR DI(558) XOR DI(965) XOR DI(962) XOR DI(178) XOR DI(952) XOR DI(576) XOR DI(445) XOR DI(159) XOR DI(644) XOR DI(1) XOR DI(906) XOR DI(364) XOR DI(994) XOR DI(380) XOR DI(494) XOR DI(586) XOR DI(257) XOR DI(710) XOR DI(262) XOR DI(185) XOR DI(129) XOR DI(763) XOR DI(433) XOR DI(455) XOR DI(169) XOR DI(227) XOR DI(620) XOR DI(371) XOR DI(743) XOR DI(611) XOR DI(810) XOR DI(654) XOR DI(246) XOR DI(501) XOR DI(72) XOR DI(543) XOR DI(708) XOR DI(639) XOR DI(11) XOR DI(892) XOR DI(255) XOR DI(284) XOR DI(28) XOR DI(331) XOR DI(808) XOR DI(862) XOR DI(193) XOR DI(759) XOR DI(916) XOR DI(755) XOR DI(986) XOR DI(848) XOR DI(552) XOR DI(959) XOR DI(113) XOR DI(692) XOR DI(374) XOR DI(488) XOR DI(790) XOR DI(534) XOR DI(919) XOR DI(1004) XOR DI(427) XOR DI(449) XOR DI(741) XOR DI(737) XOR DI(238) XOR DI(804) XOR DI(624) XOR DI(648) XOR DI(240) XOR DI(316) XOR DI(20) XOR DI(901) XOR DI(537) XOR DI(888) XOR DI(390) XOR DI(295) XOR DI(180) XOR DI(933) XOR DI(504) XOR DI(293) XOR DI(596) XOR DI(826) XOR DI(897) XOR DI(405) XOR DI(806) XOR DI(817) XOR DI(506) XOR DI(267) XOR DI(232) XOR DI(642) XOR DI(310) XOR DI(14) XOR DI(983) XOR DI(720) XOR DI(272) XOR DI(646) XOR DI(110) XOR DI(174) XOR DI(550) XOR DI(947) XOR DI(362) XOR DI(195) XOR DI(705) XOR DI(8) XOR DI(453) XOR DI(941) XOR DI(615) XOR DI(935) XOR DI(139) XOR DI(853) XOR DI(681) XOR DI(675) XOR DI(1008) XOR DI(1020) XOR DI(266) XOR DI(39) XOR DI(745) XOR DI(351) XOR DI(766) XOR DI(773) XOR DI(903) XOR DI(83) XOR DI(43) XOR DI(704) XOR DI(443) XOR DI(377) XOR DI(992) XOR DI(42) XOR DI(794) XOR DI(306) XOR DI(852) XOR DI(569) XOR DI(556) XOR DI(937) XOR DI(352) XOR DI(90) XOR DI(793) XOR DI(923) XOR DI(66) XOR DI(414) XOR DI(762) XOR DI(731) XOR DI(189) XOR DI(298) XOR DI(465) XOR DI(855) XOR DI(559) XOR DI(966) XOR DI(179) XOR DI(828) XOR DI(549) XOR DI(956) XOR DI(150) XOR DI(446) XOR DI(602) XOR DI(237) XOR DI(492) XOR DI(63) XOR DI(630) XOR DI(2) XOR DI(839) XOR DI(104) XOR DI(365) XOR DI(910) XOR DI(995) XOR DI(528) XOR DI(381) XOR DI(924) XOR DI(587) XOR DI(797) XOR DI(223) XOR DI(633) XOR DI(974) XOR DI(711) XOR DI(263) XOR DI(130) XOR DI(672) XOR DI(757) XOR DI(894) XOR DI(434) XOR DI(368) XOR DI(297) XOR DI(753) XOR DI(722) XOR DI(289) XOR DI(456) XOR DI(540) XOR DI(228) XOR DI(621) XOR DI(830) XOR DI(519) XOR DI(254) XOR DI(121) XOR DI(748) XOR DI(425) XOR DI(744) XOR DI(447) XOR DI(531) XOR DI(219) XOR DI(510) XOR DI(245) XOR DI(735) XOR DI(210) XOR DI(236) XOR DI(726) XOR DI(482) XOR DI(886) XOR DI(724) XOR DI(655) XOR DI(13) XOR DI(605) XOR DI(491) XOR DI(908) XOR DI(820) XOR DI(135) XOR DI(145) XOR DI(895) XOR DI(106) XOR DI(733) XOR DI(410) XOR DI(640) XOR DI(893) XOR DI(925) XOR DI(664) XOR DI(22) XOR DI(256) XOR DI(588) XOR DI(614) XOR DI(332) XOR DI(426) XOR DI(302) XOR DI(939) XOR DI(354) XOR DI(187) XOR DI(940) XOR DI(511) XOR DI(472) XOR DI(679) XOR DI(500) XOR DI(1012) XOR DI(760) XOR DI(77) XOR DI(271) XOR DI(859) XOR DI(328) XOR DI(36) XOR DI(300) XOR DI(563) XOR DI(44) XOR DI(41) XOR DI(162) XOR DI(82) XOR DI(680) XOR DI(917) XOR DI(829) XOR DI(967) XOR DI(292) XOR DI(987) XOR DI(553) XOR DI(430) XOR DI(144) XOR DI(349) XOR DI(114) XOR DI(154) XOR DI(693) XOR DI(971) XOR DI(904) XOR DI(412) XOR DI(918) XOR DI(489) XOR DI(1005) XOR DI(778) XOR DI(164) XOR DI(513) XOR DI(366) XOR DI(208) XOR DI(115) XOR DI(742) XOR DI(419) XOR DI(441) XOR DI(213) XOR DI(729) XOR DI(230) XOR DI(476) XOR DI(718) XOR DI(395) XOR DI(649) XOR DI(317) XOR DI(21) XOR DI(902) XOR DI(889) XOR DI(990) XOR DI(461) XOR DI(16) XOR DI(117) XOR DI(181) XOR DI(934) XOR DI(125) XOR DI(466) XOR DI(673) XOR DI(31) XOR DI(265) XOR DI(294) XOR DI(38) XOR DI(961) XOR DI(719) XOR DI(597) XOR DI(138) XOR DI(623) XOR DI(148) XOR DI(687) XOR DI(406) XOR DI(369) XOR DI(341) XOR DI(118) XOR DI(422) XOR DI(818) XOR DI(435) XOR DI(233) XOR DI(872) XOR DI(311) XOR DI(532) XOR DI(409) XOR DI(209) XOR DI(628) XOR DI(290) XOR DI(175) XOR DI(259) XOR DI(551) XOR DI(668) XOR DI(948) XOR DI(132) XOR DI(617) XOR DI(363) XOR DI(152) XOR DI(812) XOR DI(196) XOR DI(429) XOR DI(464) XOR DI(706) XOR DI(866) XOR DI(392) XOR DI(203) XOR DI(622) XOR DI(314) XOR DI(493) XOR DI(545) XOR DI(949) XOR DI(942) XOR DI(146) XOR DI(860) XOR DI(3) XOR DI(520) XOR DI(197) XOR DI(539) XOR DI(936) XOR DI(140) XOR DI(854) XOR DI(481) XOR DI(533) XOR DI(688) XOR DI(122) XOR DI(676) XOR DI(509) XOR DI(503) XOR DI(1015) XOR DI(1021); + DO(7) <= DI(232) XOR DI(583) XOR DI(276) XOR DI(1007) XOR DI(858) XOR DI(826) XOR DI(49) XOR DI(755) XOR DI(75) XOR DI(782) XOR DI(576) XOR DI(361) XOR DI(594) XOR DI(776) XOR DI(891) XOR DI(651) XOR DI(575) XOR DI(433) XOR DI(842) XOR DI(783) XOR DI(913) XOR DI(93) XOR DI(691) XOR DI(110) XOR DI(592) XOR DI(53) XOR DI(620) XOR DI(94) XOR DI(469) XOR DI(900) XOR DI(518) XOR DI(287) XOR DI(875) XOR DI(270) XOR DI(714) XOR DI(874) XOR DI(595) XOR DI(453) XOR DI(58) XOR DI(309) XOR DI(96) XOR DI(387) XOR DI(929) XOR DI(344) XOR DI(841) XOR DI(1002) XOR DI(70) XOR DI(777) XOR DI(339) XOR DI(337) XOR DI(768) XOR DI(708) XOR DI(52) XOR DI(804) XOR DI(980) XOR DI(316) XOR DI(192) XOR DI(862) XOR DI(325) XOR DI(193) XOR DI(579) XOR DI(986) XOR DI(931) XOR DI(566) XOR DI(60) XOR DI(97) XOR DI(947) XOR DI(57) XOR DI(178) XOR DI(98) XOR DI(932) XOR DI(666) XOR DI(751) XOR DI(362) XOR DI(696) XOR DI(880) XOR DI(485) XOR DI(100) XOR DI(166) XOR DI(582) XOR DI(803) XOR DI(933) XOR DI(845) XOR DI(76) XOR DI(340) XOR DI(816) XOR DI(424) XOR DI(108) XOR DI(983) XOR DI(772) XOR DI(741) XOR DI(360) XOR DI(799) XOR DI(619) XOR DI(56) XOR DI(881) XOR DI(601) XOR DI(667) XOR DI(65) XOR DI(591) XOR DI(200) XOR DI(201) XOR DI(637) XOR DI(305) XOR DI(715) XOR DI(113) XOR DI(611) XOR DI(199) XOR DI(308) XOR DI(452) XOR DI(848) XOR DI(475) XOR DI(1003) XOR DI(773) XOR DI(277) XOR DI(865) XOR DI(86) XOR DI(377) XOR DI(334) XOR DI(569) XOR DI(976) XOR DI(922) XOR DI(835) XOR DI(66) XOR DI(973) XOR DI(762) XOR DI(189) XOR DI(838) XOR DI(559) XOR DI(966) XOR DI(963) XOR DI(179) XOR DI(953) XOR DI(577) XOR DI(446) XOR DI(160) XOR DI(645) XOR DI(2) XOR DI(907) XOR DI(365) XOR DI(995) XOR DI(381) XOR DI(495) XOR DI(587) XOR DI(258) XOR DI(711) XOR DI(263) XOR DI(186) XOR DI(130) XOR DI(764) XOR DI(434) XOR DI(456) XOR DI(170) XOR DI(228) XOR DI(621) XOR DI(372) XOR DI(744) XOR DI(612) XOR DI(811) XOR DI(655) XOR DI(247) XOR DI(502) XOR DI(73) XOR DI(544) XOR DI(709) XOR DI(640) XOR DI(12) XOR DI(893) XOR DI(256) XOR DI(285) XOR DI(29) XOR DI(332) XOR DI(809) XOR DI(863) XOR DI(194) XOR DI(760) XOR DI(917) XOR DI(756) XOR DI(987) XOR DI(849) XOR DI(553) XOR DI(960) XOR DI(114) XOR DI(693) XOR DI(375) XOR DI(489) XOR DI(791) XOR DI(535) XOR DI(920) XOR DI(1005) XOR DI(428) XOR DI(450) XOR DI(742) XOR DI(738) XOR DI(239) XOR DI(805) XOR DI(625) XOR DI(649) XOR DI(241) XOR DI(317) XOR DI(21) XOR DI(902) XOR DI(538) XOR DI(889) XOR DI(391) XOR DI(296) XOR DI(181) XOR DI(934) XOR DI(505) XOR DI(294) XOR DI(597) XOR DI(827) XOR DI(898) XOR DI(406) XOR DI(807) XOR DI(818) XOR DI(507) XOR DI(268) XOR DI(233) XOR DI(643) XOR DI(311) XOR DI(15) XOR DI(984) XOR DI(721) XOR DI(273) XOR DI(647) XOR DI(111) XOR DI(175) XOR DI(551) XOR DI(948) XOR DI(363) XOR DI(196) XOR DI(706) XOR DI(9) XOR DI(454) XOR DI(942) XOR DI(616) XOR DI(936) XOR DI(140) XOR DI(854) XOR DI(682) XOR DI(676) XOR DI(1009) XOR DI(1021) XOR DI(267) XOR DI(40) XOR DI(746) XOR DI(352) XOR DI(767) XOR DI(774) XOR DI(904) XOR DI(84) XOR DI(44) XOR DI(705) XOR DI(444) XOR DI(378) XOR DI(993) XOR DI(43) XOR DI(795) XOR DI(307) XOR DI(853) XOR DI(570) XOR DI(557) XOR DI(938) XOR DI(353) XOR DI(91) XOR DI(794) XOR DI(924) XOR DI(67) XOR DI(415) XOR DI(763) XOR DI(732) XOR DI(190) XOR DI(299) XOR DI(466) XOR DI(856) XOR DI(560) XOR DI(967) XOR DI(180) XOR DI(829) XOR DI(550) XOR DI(957) XOR DI(151) XOR DI(447) XOR DI(603) XOR DI(238) XOR DI(493) XOR DI(64) XOR DI(631) XOR DI(3) XOR DI(840) XOR DI(105) XOR DI(366) XOR DI(911) XOR DI(996) XOR DI(529) XOR DI(382) XOR DI(925) XOR DI(588) XOR DI(798) XOR DI(224) XOR DI(634) XOR DI(975) XOR DI(712) XOR DI(264) XOR DI(131) XOR DI(673) XOR DI(758) XOR DI(895) XOR DI(435) XOR DI(369) XOR DI(298) XOR DI(754) XOR DI(723) XOR DI(290) XOR DI(457) XOR DI(541) XOR DI(229) XOR DI(622) XOR DI(831) XOR DI(520) XOR DI(255) XOR DI(122) XOR DI(749) XOR DI(426) XOR DI(745) XOR DI(448) XOR DI(532) XOR DI(220) XOR DI(511) XOR DI(246) XOR DI(736) XOR DI(211) XOR DI(237) XOR DI(727) XOR DI(483) XOR DI(887) XOR DI(725) XOR DI(656) XOR DI(14) XOR DI(606) XOR DI(492) XOR DI(909) XOR DI(821) XOR DI(136) XOR DI(146) XOR DI(896) XOR DI(107) XOR DI(734) XOR DI(411) XOR DI(641) XOR DI(894) XOR DI(926) XOR DI(665) XOR DI(23) XOR DI(257) XOR DI(589) XOR DI(615) XOR DI(333) XOR DI(427) XOR DI(303) XOR DI(940) XOR DI(355) XOR DI(188) XOR DI(941) XOR DI(512) XOR DI(473) XOR DI(680) XOR DI(501) XOR DI(1013) XOR DI(761) XOR DI(78) XOR DI(272) XOR DI(860) XOR DI(329) XOR DI(37) XOR DI(301) XOR DI(564) XOR DI(45) XOR DI(42) XOR DI(163) XOR DI(83) XOR DI(681) XOR DI(918) XOR DI(830) XOR DI(968) XOR DI(293) XOR DI(988) XOR DI(554) XOR DI(431) XOR DI(145) XOR DI(350) XOR DI(115) XOR DI(155) XOR DI(694) XOR DI(972) XOR DI(905) XOR DI(413) XOR DI(919) XOR DI(490) XOR DI(1006) XOR DI(779) XOR DI(165) XOR DI(514) XOR DI(367) XOR DI(209) XOR DI(116) XOR DI(743) XOR DI(420) XOR DI(442) XOR DI(214) XOR DI(730) XOR DI(231) XOR DI(477) XOR DI(719) XOR DI(396) XOR DI(650) XOR DI(318) XOR DI(22) XOR DI(903) XOR DI(890) XOR DI(991) XOR DI(462) XOR DI(17) XOR DI(118) XOR DI(182) XOR DI(935) XOR DI(126) XOR DI(467) XOR DI(674) XOR DI(32) XOR DI(266) XOR DI(295) XOR DI(39) XOR DI(962) XOR DI(720) XOR DI(598) XOR DI(139) XOR DI(624) XOR DI(149) XOR DI(688) XOR DI(407) XOR DI(370) XOR DI(342) XOR DI(119) XOR DI(423) XOR DI(819) XOR DI(436) XOR DI(234) XOR DI(873) XOR DI(312) XOR DI(533) XOR DI(410) XOR DI(210) XOR DI(629) XOR DI(291) XOR DI(176) XOR DI(260) XOR DI(552) XOR DI(669) XOR DI(949) XOR DI(133) XOR DI(618) XOR DI(364) XOR DI(153) XOR DI(813) XOR DI(197) XOR DI(430) XOR DI(465) XOR DI(707) XOR DI(867) XOR DI(393) XOR DI(204) XOR DI(623) XOR DI(315) XOR DI(494) XOR DI(546) XOR DI(950) XOR DI(943) XOR DI(147) XOR DI(861) XOR DI(4) XOR DI(521) XOR DI(198) XOR DI(540) XOR DI(937) XOR DI(141) XOR DI(855) XOR DI(482) XOR DI(534) XOR DI(689) XOR DI(123) XOR DI(677) XOR DI(510) XOR DI(504) XOR DI(1016) XOR DI(1022); + DO(8) <= DI(233) XOR DI(584) XOR DI(277) XOR DI(1008) XOR DI(859) XOR DI(827) XOR DI(50) XOR DI(756) XOR DI(76) XOR DI(783) XOR DI(577) XOR DI(362) XOR DI(595) XOR DI(777) XOR DI(892) XOR DI(652) XOR DI(576) XOR DI(434) XOR DI(843) XOR DI(784) XOR DI(914) XOR DI(94) XOR DI(692) XOR DI(111) XOR DI(593) XOR DI(54) XOR DI(621) XOR DI(95) XOR DI(470) XOR DI(901) XOR DI(519) XOR DI(288) XOR DI(876) XOR DI(271) XOR DI(715) XOR DI(875) XOR DI(596) XOR DI(454) XOR DI(59) XOR DI(310) XOR DI(97) XOR DI(388) XOR DI(930) XOR DI(345) XOR DI(842) XOR DI(1003) XOR DI(71) XOR DI(778) XOR DI(340) XOR DI(338) XOR DI(769) XOR DI(709) XOR DI(53) XOR DI(805) XOR DI(981) XOR DI(317) XOR DI(193) XOR DI(863) XOR DI(326) XOR DI(194) XOR DI(580) XOR DI(987) XOR DI(932) XOR DI(567) XOR DI(61) XOR DI(98) XOR DI(948) XOR DI(58) XOR DI(179) XOR DI(99) XOR DI(0) XOR DI(933) XOR DI(667) XOR DI(752) XOR DI(363) XOR DI(697) XOR DI(881) XOR DI(486) XOR DI(101) XOR DI(167) XOR DI(583) XOR DI(804) XOR DI(934) XOR DI(846) XOR DI(77) XOR DI(341) XOR DI(817) XOR DI(425) XOR DI(109) XOR DI(984) XOR DI(773) XOR DI(742) XOR DI(361) XOR DI(800) XOR DI(620) XOR DI(57) XOR DI(882) XOR DI(602) XOR DI(668) XOR DI(66) XOR DI(592) XOR DI(201) XOR DI(202) XOR DI(638) XOR DI(306) XOR DI(716) XOR DI(114) XOR DI(612) XOR DI(200) XOR DI(309) XOR DI(453) XOR DI(849) XOR DI(476) XOR DI(1004) XOR DI(774) XOR DI(278) XOR DI(866) XOR DI(87) XOR DI(378) XOR DI(335) XOR DI(570) XOR DI(977) XOR DI(923) XOR DI(836) XOR DI(67) XOR DI(974) XOR DI(763) XOR DI(190) XOR DI(839) XOR DI(560) XOR DI(967) XOR DI(964) XOR DI(180) XOR DI(954) XOR DI(578) XOR DI(447) XOR DI(161) XOR DI(646) XOR DI(3) XOR DI(908) XOR DI(366) XOR DI(996) XOR DI(382) XOR DI(496) XOR DI(588) XOR DI(259) XOR DI(712) XOR DI(264) XOR DI(187) XOR DI(131) XOR DI(765) XOR DI(435) XOR DI(457) XOR DI(171) XOR DI(229) XOR DI(622) XOR DI(373) XOR DI(745) XOR DI(613) XOR DI(812) XOR DI(656) XOR DI(248) XOR DI(503) XOR DI(74) XOR DI(545) XOR DI(710) XOR DI(641) XOR DI(13) XOR DI(894) XOR DI(257) XOR DI(286) XOR DI(30) XOR DI(333) XOR DI(810) XOR DI(864) XOR DI(195) XOR DI(761) XOR DI(918) XOR DI(757) XOR DI(988) XOR DI(850) XOR DI(554) XOR DI(961) XOR DI(115) XOR DI(694) XOR DI(376) XOR DI(490) XOR DI(792) XOR DI(536) XOR DI(921) XOR DI(1006) XOR DI(429) XOR DI(451) XOR DI(743) XOR DI(739) XOR DI(240) XOR DI(806) XOR DI(626) XOR DI(650) XOR DI(242) XOR DI(318) XOR DI(22) XOR DI(903) XOR DI(539) XOR DI(890) XOR DI(392) XOR DI(297) XOR DI(182) XOR DI(935) XOR DI(506) XOR DI(295) XOR DI(598) XOR DI(828) XOR DI(899) XOR DI(407) XOR DI(808) XOR DI(819) XOR DI(508) XOR DI(269) XOR DI(234) XOR DI(644) XOR DI(312) XOR DI(16) XOR DI(985) XOR DI(722) XOR DI(274) XOR DI(648) XOR DI(112) XOR DI(176) XOR DI(552) XOR DI(949) XOR DI(364) XOR DI(197) XOR DI(707) XOR DI(10) XOR DI(455) XOR DI(943) XOR DI(617) XOR DI(937) XOR DI(141) XOR DI(855) XOR DI(683) XOR DI(677) XOR DI(1010) XOR DI(1022) XOR DI(268) XOR DI(41) XOR DI(747) XOR DI(353) XOR DI(768) XOR DI(775) XOR DI(905) XOR DI(85) XOR DI(45) XOR DI(706) XOR DI(445) XOR DI(379) XOR DI(994) XOR DI(44) XOR DI(796) XOR DI(308) XOR DI(854) XOR DI(571) XOR DI(558) XOR DI(939) XOR DI(354) XOR DI(92) XOR DI(795) XOR DI(925) XOR DI(68) XOR DI(416) XOR DI(764) XOR DI(733) XOR DI(191) XOR DI(300) XOR DI(467) XOR DI(857) XOR DI(561) XOR DI(968) XOR DI(181) XOR DI(830) XOR DI(551) XOR DI(958) XOR DI(152) XOR DI(448) XOR DI(604) XOR DI(239) XOR DI(494) XOR DI(65) XOR DI(632) XOR DI(4) XOR DI(841) XOR DI(106) XOR DI(367) XOR DI(912) XOR DI(997) XOR DI(530) XOR DI(383) XOR DI(926) XOR DI(589) XOR DI(799) XOR DI(225) XOR DI(635) XOR DI(976) XOR DI(713) XOR DI(265) XOR DI(132) XOR DI(674) XOR DI(759) XOR DI(896) XOR DI(436) XOR DI(370) XOR DI(299) XOR DI(755) XOR DI(724) XOR DI(291) XOR DI(458) XOR DI(542) XOR DI(230) XOR DI(623) XOR DI(832) XOR DI(521) XOR DI(256) XOR DI(123) XOR DI(750) XOR DI(427) XOR DI(746) XOR DI(449) XOR DI(533) XOR DI(221) XOR DI(512) XOR DI(247) XOR DI(737) XOR DI(212) XOR DI(238) XOR DI(728) XOR DI(484) XOR DI(888) XOR DI(726) XOR DI(657) XOR DI(15) XOR DI(607) XOR DI(493) XOR DI(910) XOR DI(822) XOR DI(137) XOR DI(147) XOR DI(897) XOR DI(108) XOR DI(735) XOR DI(412) XOR DI(642) XOR DI(895) XOR DI(927) XOR DI(666) XOR DI(24) XOR DI(258) XOR DI(590) XOR DI(616) XOR DI(334) XOR DI(428) XOR DI(304) XOR DI(941) XOR DI(356) XOR DI(189) XOR DI(942) XOR DI(513) XOR DI(474) XOR DI(681) XOR DI(502) XOR DI(1014) XOR DI(762) XOR DI(79) XOR DI(273) XOR DI(861) XOR DI(330) XOR DI(38) XOR DI(302) XOR DI(565) XOR DI(46) XOR DI(43) XOR DI(164) XOR DI(84) XOR DI(682) XOR DI(919) XOR DI(831) XOR DI(969) XOR DI(294) XOR DI(989) XOR DI(555) XOR DI(432) XOR DI(146) XOR DI(351) XOR DI(116) XOR DI(156) XOR DI(695) XOR DI(973) XOR DI(906) XOR DI(414) XOR DI(920) XOR DI(491) XOR DI(1007) XOR DI(780) XOR DI(166) XOR DI(515) XOR DI(368) XOR DI(210) XOR DI(117) XOR DI(744) XOR DI(421) XOR DI(443) XOR DI(215) XOR DI(731) XOR DI(232) XOR DI(478) XOR DI(720) XOR DI(397) XOR DI(651) XOR DI(319) XOR DI(23) XOR DI(904) XOR DI(891) XOR DI(992) XOR DI(463) XOR DI(18) XOR DI(119) XOR DI(183) XOR DI(936) XOR DI(127) XOR DI(468) XOR DI(675) XOR DI(33) XOR DI(267) XOR DI(296) XOR DI(40) XOR DI(963) XOR DI(721) XOR DI(599) XOR DI(140) XOR DI(625) XOR DI(150) XOR DI(689) XOR DI(408) XOR DI(371) XOR DI(343) XOR DI(120) XOR DI(424) XOR DI(820) XOR DI(437) XOR DI(235) XOR DI(874) XOR DI(313) XOR DI(534) XOR DI(411) XOR DI(211) XOR DI(630) XOR DI(292) XOR DI(177) XOR DI(261) XOR DI(553) XOR DI(670) XOR DI(950) XOR DI(134) XOR DI(619) XOR DI(365) XOR DI(154) XOR DI(814) XOR DI(198) XOR DI(431) XOR DI(466) XOR DI(708) XOR DI(868) XOR DI(394) XOR DI(205) XOR DI(624) XOR DI(316) XOR DI(495) XOR DI(547) XOR DI(951) XOR DI(944) XOR DI(148) XOR DI(862) XOR DI(5) XOR DI(522) XOR DI(199) XOR DI(541) XOR DI(938) XOR DI(142) XOR DI(856) XOR DI(483) XOR DI(535) XOR DI(690) XOR DI(124) XOR DI(678) XOR DI(511) XOR DI(505) XOR DI(1017) XOR DI(1023); + DO(9) <= DI(767) XOR DI(234) XOR DI(836) XOR DI(378) XOR DI(794) XOR DI(971) XOR DI(687) XOR DI(772) XOR DI(838) XOR DI(628) XOR DI(585) XOR DI(278) XOR DI(508) XOR DI(1009) XOR DI(860) XOR DI(828) XOR DI(91) XOR DI(662) XOR DI(218) XOR DI(602) XOR DI(26) XOR DI(104) XOR DI(961) XOR DI(242) XOR DI(817) XOR DI(51) XOR DI(757) XOR DI(77) XOR DI(560) XOR DI(677) XOR DI(784) XOR DI(470) XOR DI(578) XOR DI(280) XOR DI(161) XOR DI(363) XOR DI(392) XOR DI(646) XOR DI(596) XOR DI(3) XOR DI(20) XOR DI(71) XOR DI(778) XOR DI(908) XOR DI(996) XOR DI(441) XOR DI(893) XOR DI(382) XOR DI(588) XOR DI(798) XOR DI(634) XOR DI(376) XOR DI(638) XOR DI(490) XOR DI(451) XOR DI(187) XOR DI(653) XOR DI(1000) XOR DI(1012) XOR DI(576) XOR DI(577) XOR DI(435) XOR DI(844) XOR DI(785) XOR DI(915) XOR DI(95) XOR DI(693) XOR DI(112) XOR DI(594) XOR DI(55) XOR DI(622) XOR DI(176) XOR DI(96) XOR DI(471) XOR DI(902) XOR DI(520) XOR DI(966) XOR DI(289) XOR DI(877) XOR DI(272) XOR DI(716) XOR DI(876) XOR DI(597) XOR DI(455) XOR DI(60) XOR DI(311) XOR DI(812) XOR DI(98) XOR DI(656) XOR DI(606) XOR DI(389) XOR DI(931) XOR DI(346) XOR DI(843) XOR DI(1004) XOR DI(72) XOR DI(28) XOR DI(74) XOR DI(338) XOR DI(779) XOR DI(284) XOR DI(341) XOR DI(563) XOR DI(244) XOR DI(339) XOR DI(770) XOR DI(710) XOR DI(54) XOR DI(806) XOR DI(982) XOR DI(453) XOR DI(650) XOR DI(271) XOR DI(318) XOR DI(30) XOR DI(333) XOR DI(194) XOR DI(864) XOR DI(53) XOR DI(401) XOR DI(197) XOR DI(327) XOR DI(518) XOR DI(195) XOR DI(473) XOR DI(741) XOR DI(580) XOR DI(899) XOR DI(581) XOR DI(439) XOR DI(827) XOR DI(988) XOR DI(790) XOR DI(83) XOR DI(933) XOR DI(918) XOR DI(866) XOR DI(568) XOR DI(62) XOR DI(326) XOR DI(99) XOR DI(185) XOR DI(834) XOR DI(461) XOR DI(545) XOR DI(949) XOR DI(697) XOR DI(730) XOR DI(59) XOR DI(180) XOR DI(100) XOR DI(524) XOR DI(1) XOR DI(934) XOR DI(668) XOR DI(753) XOR DI(890) XOR DI(364) XOR DI(224) XOR DI(50) XOR DI(698) XOR DI(250) XOR DI(881) XOR DI(873) XOR DI(882) XOR DI(9) XOR DI(487) XOR DI(131) XOR DI(680) XOR DI(102) XOR DI(168) XOR DI(584) XOR DI(610) XOR DI(805) XOR DI(277) XOR DI(538) XOR DI(935) XOR DI(847) XOR DI(923) XOR DI(987) XOR DI(76) XOR DI(324) XOR DI(32) XOR DI(78) XOR DI(342) XOR DI(288) XOR DI(818) XOR DI(426) XOR DI(110) XOR DI(482) XOR DI(985) XOR DI(914) XOR DI(787) XOR DI(774) XOR DI(743) XOR DI(712) XOR DI(362) XOR DI(801) XOR DI(621) XOR DI(407) XOR DI(58) XOR DI(810) XOR DI(457) XOR DI(883) XOR DI(603) XOR DI(930) XOR DI(669) XOR DI(67) XOR DI(715) XOR DI(593) XOR DI(202) XOR DI(114) XOR DI(418) XOR DI(203) XOR DI(719) XOR DI(639) XOR DI(307) XOR DI(57) XOR DI(405) XOR DI(980) XOR DI(717) XOR DI(648) XOR DI(13) XOR DI(171) XOR DI(115) XOR DI(255) XOR DI(901) XOR DI(613) XOR DI(359) XOR DI(201) XOR DI(808) XOR DI(388) XOR DI(310) XOR DI(454) XOR DI(612) XOR DI(850) XOR DI(510) XOR DI(477) XOR DI(499) XOR DI(1005) XOR DI(575) XOR DI(999) XOR DI(775) XOR DI(279) XOR DI(867) XOR DI(706) XOR DI(587) XOR DI(88) XOR DI(379) XOR DI(336) XOR DI(994) XOR DI(329) XOR DI(854) XOR DI(571) XOR DI(978) XOR DI(89) XOR DI(49) XOR DI(170) XOR DI(90) XOR DI(924) XOR DI(574) XOR DI(925) XOR DI(837) XOR DI(68) XOR DI(975) XOR DI(764) XOR DI(191) XOR DI(840) XOR DI(561) XOR DI(968) XOR DI(965) XOR DI(181) XOR DI(830) XOR DI(958) XOR DI(955) XOR DI(637) XOR DI(579) XOR DI(703) XOR DI(122) XOR DI(448) XOR DI(162) XOR DI(220) XOR DI(647) XOR DI(65) XOR DI(632) XOR DI(4) XOR DI(909) XOR DI(979) XOR DI(841) XOR DI(106) XOR DI(685) XOR DI(367) XOR DI(997) XOR DI(420) XOR DI(530) XOR DI(383) XOR DI(173) XOR DI(497) XOR DI(589) XOR DI(260) XOR DI(976) XOR DI(713) XOR DI(265) XOR DI(188) XOR DI(132) XOR DI(759) XOR DI(766) XOR DI(436) XOR DI(299) XOR DI(755) XOR DI(724) XOR DI(458) XOR DI(172) XOR DI(230) XOR DI(623) XOR DI(358) XOR DI(374) XOR DI(704) XOR DI(123) XOR DI(665) XOR DI(750) XOR DI(887) XOR DI(746) XOR DI(282) XOR DI(533) XOR DI(221) XOR DI(614) XOR DI(737) XOR DI(238) XOR DI(728) XOR DI(813) XOR DI(888) XOR DI(726) XOR DI(657) XOR DI(15) XOR DI(249) XOR DI(504) XOR DI(493) XOR DI(70) XOR DI(852) XOR DI(75) XOR DI(910) XOR DI(822) XOR DI(546) XOR DI(137) XOR DI(686) XOR DI(711) XOR DI(642) XOR DI(14) XOR DI(895) XOR DI(174) XOR DI(666) XOR DI(258) XOR DI(287) XOR DI(31) XOR DI(616) XOR DI(334) XOR DI(811) XOR DI(865) XOR DI(304) XOR DI(283) XOR DI(544) XOR DI(661) XOR DI(941) XOR DI(356) XOR DI(145) XOR DI(189) XOR DI(196) XOR DI(615) XOR DI(853) XOR DI(532) XOR DI(929) XOR DI(502) XOR DI(1014) XOR DI(762) XOR DI(330) XOR DI(323) XOR DI(302) XOR DI(43) XOR DI(164) XOR DI(919) XOR DI(758) XOR DI(989) XOR DI(851) XOR DI(555) XOR DI(962) XOR DI(175) XOR DI(146) XOR DI(351) XOR DI(116) XOR DI(156) XOR DI(214) XOR DI(695) XOR DI(414) XOR DI(377) XOR DI(491) XOR DI(793) XOR DI(537) XOR DI(349) XOR DI(922) XOR DI(126) XOR DI(1007) XOR DI(430) XOR DI(452) XOR DI(826) XOR DI(210) XOR DI(744) XOR DI(421) XOR DI(740) XOR DI(276) XOR DI(215) XOR DI(241) XOR DI(807) XOR DI(627) XOR DI(880) XOR DI(651) XOR DI(243) XOR DI(319) XOR DI(498) XOR DI(64) XOR DI(23) XOR DI(904) XOR DI(816) XOR DI(540) XOR DI(891) XOR DI(992) XOR DI(217) XOR DI(463) XOR DI(705) XOR DI(8) XOR DI(18) XOR DI(393) XOR DI(298) XOR DI(655) XOR DI(350) XOR DI(183) XOR DI(936) XOR DI(507) XOR DI(127) XOR DI(296) XOR DI(40) XOR DI(825) XOR DI(404) XOR DI(963) XOR DI(599) XOR DI(956) XOR DI(150) XOR DI(208) XOR DI(689) XOR DI(829) XOR DI(900) XOR DI(408) XOR DI(424) XOR DI(809) XOR DI(820) XOR DI(509) XOR DI(270) XOR DI(209) XOR DI(235) XOR DI(645) XOR DI(313) XOR DI(17) XOR DI(411) XOR DI(986) XOR DI(723) XOR DI(400) XOR DI(12) XOR DI(275) XOR DI(322) XOR DI(649) XOR DI(113) XOR DI(177) XOR DI(261) XOR DI(553) XOR DI(957) XOR DI(950) XOR DI(163) XOR DI(134) XOR DI(619) XOR DI(365) XOR DI(337) XOR DI(814) XOR DI(198) XOR DI(431) XOR DI(466) XOR DI(708) XOR DI(868) XOR DI(11) XOR DI(394) XOR DI(205) XOR DI(316) XOR DI(456) XOR DI(547) XOR DI(944) XOR DI(702) XOR DI(618) XOR DI(375) XOR DI(489) XOR DI(541) XOR DI(938) XOR DI(142) XOR DI(856) XOR DI(529) XOR DI(684) XOR DI(678) XOR DI(517) XOR DI(505) XOR DI(1011) XOR DI(1023); + DO(10) <= DI(768) XOR DI(833) XOR DI(86) XOR DI(834) XOR DI(466) XOR DI(148) XOR DI(999) XOR DI(772) XOR DI(235) XOR DI(837) XOR DI(559) XOR DI(587) XOR DI(301) XOR DI(379) XOR DI(795) XOR DI(49) XOR DI(972) XOR DI(688) XOR DI(773) XOR DI(217) XOR DI(873) XOR DI(839) XOR DI(629) XOR DI(25) XOR DI(682) XOR DI(586) XOR DI(943) XOR DI(424) XOR DI(279) XOR DI(689) XOR DI(509) XOR DI(1010) XOR DI(861) XOR DI(57) XOR DI(829) XOR DI(470) XOR DI(92) XOR DI(663) XOR DI(219) XOR DI(45) XOR DI(612) XOR DI(906) XOR DI(603) XOR DI(185) XOR DI(27) XOR DI(105) XOR DI(962) XOR DI(243) XOR DI(996) XOR DI(769) XOR DI(796) XOR DI(818) XOR DI(224) XOR DI(634) XOR DI(302) XOR DI(52) XOR DI(354) XOR DI(758) XOR DI(269) XOR DI(78) XOR DI(326) XOR DI(561) XOR DI(42) XOR DI(678) XOR DI(785) XOR DI(322) XOR DI(471) XOR DI(579) XOR DI(93) XOR DI(281) XOR DI(162) XOR DI(46) XOR DI(364) XOR DI(417) XOR DI(736) XOR DI(393) XOR DI(647) XOR DI(597) XOR DI(413) XOR DI(213) XOR DI(4) XOR DI(248) XOR DI(21) XOR DI(72) XOR DI(779) XOR DI(909) XOR DI(400) XOR DI(748) XOR DI(563) XOR DI(106) XOR DI(997) XOR DI(420) XOR DI(442) XOR DI(156) XOR DI(734) XOR DI(468) XOR DI(797) XOR DI(591) XOR DI(309) XOR DI(894) XOR DI(383) XOR DI(109) XOR DI(257) XOR DI(589) XOR DI(333) XOR DI(799) XOR DI(635) XOR DI(53) XOR DI(377) XOR DI(639) XOR DI(491) XOR DI(452) XOR DI(543) XOR DI(940) XOR DI(134) XOR DI(355) XOR DI(188) XOR DI(371) XOR DI(446) XOR DI(654) XOR DI(450) XOR DI(608) XOR DI(928) XOR DI(126) XOR DI(1001) XOR DI(1013) XOR DI(577) XOR DI(858) XOR DI(578) XOR DI(436) XOR DI(292) XOR DI(787) XOR DI(845) XOR DI(786) XOR DI(916) XOR DI(755) XOR DI(96) XOR DI(552) XOR DI(429) XOR DI(694) XOR DI(113) XOR DI(439) XOR DI(153) XOR DI(595) XOR DI(485) XOR DI(56) XOR DI(623) XOR DI(177) XOR DI(97) XOR DI(358) XOR DI(472) XOR DI(903) XOR DI(521) XOR DI(967) XOR DI(887) XOR DI(290) XOR DI(878) XOR DI(737) XOR DI(273) XOR DI(605) XOR DI(475) XOR DI(717) XOR DI(877) XOR DI(240) XOR DI(598) XOR DI(495) XOR DI(456) XOR DI(61) XOR DI(312) XOR DI(813) XOR DI(99) XOR DI(702) XOR DI(918) XOR DI(657) XOR DI(607) XOR DI(390) XOR DI(932) XOR DI(347) XOR DI(187) XOR DI(844) XOR DI(1005) XOR DI(30) XOR DI(73) XOR DI(29) XOR DI(75) XOR DI(339) XOR DI(780) XOR DI(822) XOR DI(285) XOR DI(342) XOR DI(564) XOR DI(897) XOR DI(482) XOR DI(245) XOR DI(961) XOR DI(340) XOR DI(913) XOR DI(771) XOR DI(798) XOR DI(711) XOR DI(404) XOR DI(55) XOR DI(807) XOR DI(983) XOR DI(454) XOR DI(880) XOR DI(651) XOR DI(272) XOR DI(319) XOR DI(927) XOR DI(31) XOR DI(522) XOR DI(334) XOR DI(800) XOR DI(195) XOR DI(428) XOR DI(226) XOR DI(865) XOR DI(636) XOR DI(304) XOR DI(8) XOR DI(54) XOR DI(402) XOR DI(104) XOR DI(544) XOR DI(898) XOR DI(941) XOR DI(356) XOR DI(198) XOR DI(328) XOR DI(519) XOR DI(196) XOR DI(513) XOR DI(441) XOR DI(929) XOR DI(474) XOR DI(675) XOR DI(514) XOR DI(1014) XOR DI(994) XOR DI(742) XOR DI(581) XOR DI(900) XOR DI(80) XOR DI(40) XOR DI(274) XOR DI(862) XOR DI(582) XOR DI(440) XOR DI(83) XOR DI(828) XOR DI(989) XOR DI(39) XOR DI(791) XOR DI(566) XOR DI(47) XOR DI(84) XOR DI(934) XOR DI(85) XOR DI(919) XOR DI(349) XOR DI(683) XOR DI(867) XOR DI(569) XOR DI(790) XOR DI(832) XOR DI(63) XOR DI(327) XOR DI(411) XOR DI(970) XOR DI(728) XOR DI(606) XOR DI(43) XOR DI(100) XOR DI(186) XOR DI(295) XOR DI(835) XOR DI(462) XOR DI(825) XOR DI(546) XOR DI(950) XOR DI(433) XOR DI(632) XOR DI(574) XOR DI(698) XOR DI(731) XOR DI(489) XOR DI(60) XOR DI(181) XOR DI(974) XOR DI(836) XOR DI(101) XOR DI(680) XOR DI(907) XOR DI(992) XOR DI(525) XOR DI(921) XOR DI(255) XOR DI(220) XOR DI(2) XOR DI(971) XOR DI(935) XOR DI(669) XOR DI(754) XOR DI(891) XOR DI(365) XOR DI(781) XOR DI(750) XOR DI(719) XOR DI(167) XOR DI(816) XOR DI(225) XOR DI(51) XOR DI(516) XOR DI(369) XOR DI(699) XOR DI(251) XOR DI(118) XOR DI(882) XOR DI(444) XOR DI(732) XOR DI(233) XOR DI(874) XOR DI(479) XOR DI(883) XOR DI(721) XOR DI(398) XOR DI(10) XOR DI(602) XOR DI(414) XOR DI(488) XOR DI(316) XOR DI(150) XOR DI(70) XOR DI(418) XOR DI(132) XOR DI(681) XOR DI(103) XOR DI(730) XOR DI(407) XOR DI(637) XOR DI(890) XOR DI(169) XOR DI(661) XOR DI(282) XOR DI(26) XOR DI(585) XOR DI(611) XOR DI(329) XOR DI(806) XOR DI(278) XOR DI(539) XOR DI(936) XOR DI(120) XOR DI(610) XOR DI(848) XOR DI(924) XOR DI(469) XOR DI(676) XOR DI(988) XOR DI(74) XOR DI(34) XOR DI(268) XOR DI(77) XOR DI(325) XOR DI(33) XOR DI(560) XOR DI(79) XOR DI(343) XOR DI(677) XOR DI(914) XOR DI(722) XOR DI(289) XOR DI(170) XOR DI(819) XOR DI(427) XOR DI(141) XOR DI(626) XOR DI(111) XOR DI(483) XOR DI(986) XOR DI(372) XOR DI(915) XOR DI(788) XOR DI(214) XOR DI(532) XOR DI(344) XOR DI(121) XOR DI(775) XOR DI(744) XOR DI(713) XOR DI(161) XOR DI(363) XOR DI(205) XOR DI(438) XOR DI(726) XOR DI(473) XOR DI(802) XOR DI(715) XOR DI(392) XOR DI(622) XOR DI(875) XOR DI(238) XOR DI(408) XOR DI(493) XOR DI(59) XOR DI(64) XOR DI(899) XOR DI(811) XOR DI(535) XOR DI(212) XOR DI(458) XOR DI(631) XOR DI(3) XOR DI(884) XOR DI(655) XOR DI(20) XOR DI(388) XOR DI(293) XOR DI(604) XOR DI(931) XOR DI(502) XOR DI(122) XOR DI(463) XOR DI(670) XOR DI(68) XOR DI(28) XOR DI(671) XOR DI(908) XOR DI(716) XOR DI(594) XOR DI(145) XOR DI(203) XOR DI(208) XOR DI(115) XOR DI(419) XOR DI(155) XOR DI(204) XOR DI(720) XOR DI(640) XOR DI(308) XOR DI(58) XOR DI(529) XOR DI(406) XOR DI(981) XOR DI(718) XOR DI(625) XOR DI(649) XOR DI(14) XOR DI(382) XOR DI(172) XOR DI(496) XOR DI(116) XOR DI(256) XOR DI(665) XOR DI(902) XOR DI(952) XOR DI(614) XOR DI(360) XOR DI(202) XOR DI(149) XOR DI(809) XOR DI(461) XOR DI(863) XOR DI(6) XOR DI(523) XOR DI(389) XOR DI(200) XOR DI(311) XOR DI(451) XOR DI(455) XOR DI(697) XOR DI(0) XOR DI(517) XOR DI(613) XOR DI(484) XOR DI(536) XOR DI(137) XOR DI(691) XOR DI(851) XOR DI(511) XOR DI(478) XOR DI(131) XOR DI(524) XOR DI(125) XOR DI(512) XOR DI(500) XOR DI(1006) XOR DI(1018); + DO(11) <= DI(769) XOR DI(834) XOR DI(87) XOR DI(835) XOR DI(467) XOR DI(149) XOR DI(1000) XOR DI(773) XOR DI(236) XOR DI(838) XOR DI(560) XOR DI(588) XOR DI(302) XOR DI(380) XOR DI(796) XOR DI(50) XOR DI(973) XOR DI(689) XOR DI(774) XOR DI(218) XOR DI(874) XOR DI(840) XOR DI(630) XOR DI(26) XOR DI(683) XOR DI(587) XOR DI(944) XOR DI(425) XOR DI(280) XOR DI(690) XOR DI(510) XOR DI(1011) XOR DI(862) XOR DI(58) XOR DI(830) XOR DI(471) XOR DI(93) XOR DI(664) XOR DI(220) XOR DI(46) XOR DI(613) XOR DI(907) XOR DI(604) XOR DI(186) XOR DI(28) XOR DI(106) XOR DI(963) XOR DI(244) XOR DI(997) XOR DI(770) XOR DI(797) XOR DI(819) XOR DI(225) XOR DI(635) XOR DI(303) XOR DI(53) XOR DI(355) XOR DI(759) XOR DI(270) XOR DI(79) XOR DI(327) XOR DI(562) XOR DI(43) XOR DI(679) XOR DI(786) XOR DI(323) XOR DI(472) XOR DI(580) XOR DI(94) XOR DI(282) XOR DI(163) XOR DI(47) XOR DI(365) XOR DI(418) XOR DI(737) XOR DI(394) XOR DI(648) XOR DI(598) XOR DI(414) XOR DI(214) XOR DI(5) XOR DI(249) XOR DI(22) XOR DI(73) XOR DI(780) XOR DI(910) XOR DI(401) XOR DI(749) XOR DI(564) XOR DI(107) XOR DI(998) XOR DI(421) XOR DI(443) XOR DI(157) XOR DI(735) XOR DI(469) XOR DI(798) XOR DI(592) XOR DI(310) XOR DI(895) XOR DI(384) XOR DI(110) XOR DI(258) XOR DI(590) XOR DI(334) XOR DI(800) XOR DI(636) XOR DI(54) XOR DI(378) XOR DI(640) XOR DI(492) XOR DI(453) XOR DI(544) XOR DI(941) XOR DI(135) XOR DI(356) XOR DI(189) XOR DI(372) XOR DI(447) XOR DI(655) XOR DI(451) XOR DI(609) XOR DI(929) XOR DI(127) XOR DI(1002) XOR DI(1014) XOR DI(578) XOR DI(859) XOR DI(579) XOR DI(437) XOR DI(293) XOR DI(788) XOR DI(846) XOR DI(787) XOR DI(917) XOR DI(756) XOR DI(97) XOR DI(553) XOR DI(430) XOR DI(695) XOR DI(114) XOR DI(440) XOR DI(154) XOR DI(596) XOR DI(486) XOR DI(57) XOR DI(624) XOR DI(178) XOR DI(98) XOR DI(359) XOR DI(473) XOR DI(904) XOR DI(522) XOR DI(968) XOR DI(888) XOR DI(291) XOR DI(879) XOR DI(738) XOR DI(274) XOR DI(606) XOR DI(476) XOR DI(718) XOR DI(878) XOR DI(241) XOR DI(599) XOR DI(496) XOR DI(457) XOR DI(62) XOR DI(313) XOR DI(814) XOR DI(100) XOR DI(703) XOR DI(919) XOR DI(658) XOR DI(608) XOR DI(391) XOR DI(933) XOR DI(348) XOR DI(188) XOR DI(845) XOR DI(1006) XOR DI(31) XOR DI(74) XOR DI(30) XOR DI(76) XOR DI(340) XOR DI(781) XOR DI(823) XOR DI(286) XOR DI(343) XOR DI(565) XOR DI(898) XOR DI(483) XOR DI(246) XOR DI(962) XOR DI(341) XOR DI(914) XOR DI(772) XOR DI(799) XOR DI(712) XOR DI(405) XOR DI(56) XOR DI(808) XOR DI(984) XOR DI(455) XOR DI(881) XOR DI(652) XOR DI(273) XOR DI(320) XOR DI(928) XOR DI(32) XOR DI(523) XOR DI(335) XOR DI(801) XOR DI(196) XOR DI(429) XOR DI(227) XOR DI(866) XOR DI(637) XOR DI(305) XOR DI(9) XOR DI(55) XOR DI(403) XOR DI(105) XOR DI(545) XOR DI(899) XOR DI(942) XOR DI(357) XOR DI(199) XOR DI(329) XOR DI(520) XOR DI(197) XOR DI(514) XOR DI(442) XOR DI(930) XOR DI(475) XOR DI(676) XOR DI(515) XOR DI(1015) XOR DI(995) XOR DI(743) XOR DI(582) XOR DI(901) XOR DI(81) XOR DI(41) XOR DI(275) XOR DI(863) XOR DI(583) XOR DI(441) XOR DI(84) XOR DI(829) XOR DI(990) XOR DI(40) XOR DI(792) XOR DI(567) XOR DI(48) XOR DI(85) XOR DI(935) XOR DI(86) XOR DI(920) XOR DI(350) XOR DI(684) XOR DI(868) XOR DI(570) XOR DI(791) XOR DI(833) XOR DI(64) XOR DI(328) XOR DI(412) XOR DI(971) XOR DI(729) XOR DI(607) XOR DI(44) XOR DI(101) XOR DI(187) XOR DI(296) XOR DI(836) XOR DI(463) XOR DI(826) XOR DI(547) XOR DI(951) XOR DI(434) XOR DI(633) XOR DI(575) XOR DI(699) XOR DI(732) XOR DI(490) XOR DI(61) XOR DI(182) XOR DI(975) XOR DI(837) XOR DI(102) XOR DI(681) XOR DI(908) XOR DI(993) XOR DI(526) XOR DI(922) XOR DI(256) XOR DI(221) XOR DI(3) XOR DI(972) XOR DI(936) XOR DI(670) XOR DI(755) XOR DI(892) XOR DI(366) XOR DI(782) XOR DI(751) XOR DI(720) XOR DI(168) XOR DI(817) XOR DI(226) XOR DI(52) XOR DI(517) XOR DI(370) XOR DI(700) XOR DI(252) XOR DI(119) XOR DI(883) XOR DI(445) XOR DI(733) XOR DI(234) XOR DI(875) XOR DI(480) XOR DI(884) XOR DI(722) XOR DI(399) XOR DI(11) XOR DI(603) XOR DI(415) XOR DI(489) XOR DI(317) XOR DI(151) XOR DI(71) XOR DI(419) XOR DI(133) XOR DI(682) XOR DI(104) XOR DI(731) XOR DI(408) XOR DI(638) XOR DI(891) XOR DI(170) XOR DI(662) XOR DI(283) XOR DI(27) XOR DI(586) XOR DI(612) XOR DI(330) XOR DI(807) XOR DI(279) XOR DI(540) XOR DI(937) XOR DI(121) XOR DI(611) XOR DI(849) XOR DI(925) XOR DI(470) XOR DI(677) XOR DI(989) XOR DI(75) XOR DI(35) XOR DI(269) XOR DI(78) XOR DI(326) XOR DI(34) XOR DI(561) XOR DI(80) XOR DI(344) XOR DI(678) XOR DI(915) XOR DI(723) XOR DI(290) XOR DI(171) XOR DI(820) XOR DI(428) XOR DI(142) XOR DI(627) XOR DI(112) XOR DI(484) XOR DI(987) XOR DI(373) XOR DI(916) XOR DI(789) XOR DI(215) XOR DI(533) XOR DI(345) XOR DI(122) XOR DI(776) XOR DI(745) XOR DI(714) XOR DI(162) XOR DI(364) XOR DI(206) XOR DI(439) XOR DI(727) XOR DI(474) XOR DI(803) XOR DI(716) XOR DI(393) XOR DI(623) XOR DI(876) XOR DI(239) XOR DI(409) XOR DI(494) XOR DI(60) XOR DI(65) XOR DI(900) XOR DI(812) XOR DI(536) XOR DI(213) XOR DI(459) XOR DI(632) XOR DI(4) XOR DI(885) XOR DI(656) XOR DI(21) XOR DI(389) XOR DI(294) XOR DI(605) XOR DI(932) XOR DI(503) XOR DI(123) XOR DI(464) XOR DI(671) XOR DI(69) XOR DI(29) XOR DI(672) XOR DI(909) XOR DI(717) XOR DI(595) XOR DI(146) XOR DI(204) XOR DI(209) XOR DI(116) XOR DI(420) XOR DI(156) XOR DI(205) XOR DI(721) XOR DI(641) XOR DI(309) XOR DI(59) XOR DI(530) XOR DI(407) XOR DI(982) XOR DI(719) XOR DI(626) XOR DI(650) XOR DI(15) XOR DI(383) XOR DI(173) XOR DI(497) XOR DI(117) XOR DI(257) XOR DI(666) XOR DI(903) XOR DI(953) XOR DI(615) XOR DI(361) XOR DI(203) XOR DI(150) XOR DI(810) XOR DI(462) XOR DI(864) XOR DI(7) XOR DI(524) XOR DI(390) XOR DI(201) XOR DI(312) XOR DI(452) XOR DI(456) XOR DI(698) XOR DI(1) XOR DI(518) XOR DI(614) XOR DI(485) XOR DI(537) XOR DI(138) XOR DI(692) XOR DI(852) XOR DI(512) XOR DI(479) XOR DI(132) XOR DI(525) XOR DI(126) XOR DI(513) XOR DI(501) XOR DI(1007) XOR DI(1019); + DO(12) <= DI(770) XOR DI(835) XOR DI(88) XOR DI(836) XOR DI(468) XOR DI(150) XOR DI(1001) XOR DI(774) XOR DI(237) XOR DI(839) XOR DI(561) XOR DI(589) XOR DI(303) XOR DI(381) XOR DI(797) XOR DI(51) XOR DI(974) XOR DI(690) XOR DI(775) XOR DI(219) XOR DI(875) XOR DI(841) XOR DI(631) XOR DI(27) XOR DI(684) XOR DI(588) XOR DI(945) XOR DI(426) XOR DI(281) XOR DI(691) XOR DI(511) XOR DI(1012) XOR DI(863) XOR DI(59) XOR DI(831) XOR DI(472) XOR DI(94) XOR DI(665) XOR DI(221) XOR DI(47) XOR DI(614) XOR DI(908) XOR DI(605) XOR DI(187) XOR DI(29) XOR DI(107) XOR DI(964) XOR DI(245) XOR DI(998) XOR DI(771) XOR DI(798) XOR DI(820) XOR DI(226) XOR DI(636) XOR DI(304) XOR DI(54) XOR DI(356) XOR DI(760) XOR DI(271) XOR DI(80) XOR DI(328) XOR DI(563) XOR DI(44) XOR DI(680) XOR DI(787) XOR DI(324) XOR DI(473) XOR DI(581) XOR DI(95) XOR DI(283) XOR DI(164) XOR DI(48) XOR DI(366) XOR DI(419) XOR DI(738) XOR DI(395) XOR DI(649) XOR DI(599) XOR DI(415) XOR DI(215) XOR DI(6) XOR DI(250) XOR DI(23) XOR DI(74) XOR DI(781) XOR DI(911) XOR DI(402) XOR DI(750) XOR DI(565) XOR DI(108) XOR DI(999) XOR DI(422) XOR DI(444) XOR DI(158) XOR DI(736) XOR DI(470) XOR DI(799) XOR DI(593) XOR DI(311) XOR DI(896) XOR DI(385) XOR DI(111) XOR DI(259) XOR DI(591) XOR DI(335) XOR DI(801) XOR DI(637) XOR DI(55) XOR DI(379) XOR DI(641) XOR DI(493) XOR DI(454) XOR DI(545) XOR DI(942) XOR DI(136) XOR DI(357) XOR DI(190) XOR DI(373) XOR DI(448) XOR DI(656) XOR DI(452) XOR DI(610) XOR DI(930) XOR DI(128) XOR DI(1003) XOR DI(1015) XOR DI(579) XOR DI(860) XOR DI(580) XOR DI(438) XOR DI(294) XOR DI(789) XOR DI(847) XOR DI(788) XOR DI(918) XOR DI(757) XOR DI(98) XOR DI(554) XOR DI(431) XOR DI(696) XOR DI(115) XOR DI(441) XOR DI(155) XOR DI(597) XOR DI(487) XOR DI(58) XOR DI(625) XOR DI(179) XOR DI(99) XOR DI(360) XOR DI(474) XOR DI(905) XOR DI(523) XOR DI(0) XOR DI(969) XOR DI(889) XOR DI(292) XOR DI(880) XOR DI(739) XOR DI(275) XOR DI(607) XOR DI(477) XOR DI(719) XOR DI(879) XOR DI(242) XOR DI(600) XOR DI(497) XOR DI(458) XOR DI(63) XOR DI(314) XOR DI(815) XOR DI(101) XOR DI(704) XOR DI(920) XOR DI(659) XOR DI(609) XOR DI(392) XOR DI(934) XOR DI(349) XOR DI(189) XOR DI(846) XOR DI(1007) XOR DI(32) XOR DI(75) XOR DI(31) XOR DI(77) XOR DI(341) XOR DI(782) XOR DI(824) XOR DI(287) XOR DI(344) XOR DI(566) XOR DI(899) XOR DI(484) XOR DI(247) XOR DI(963) XOR DI(342) XOR DI(915) XOR DI(773) XOR DI(800) XOR DI(713) XOR DI(406) XOR DI(57) XOR DI(809) XOR DI(985) XOR DI(456) XOR DI(882) XOR DI(653) XOR DI(274) XOR DI(321) XOR DI(929) XOR DI(33) XOR DI(524) XOR DI(336) XOR DI(802) XOR DI(197) XOR DI(430) XOR DI(228) XOR DI(867) XOR DI(638) XOR DI(306) XOR DI(10) XOR DI(56) XOR DI(404) XOR DI(106) XOR DI(546) XOR DI(900) XOR DI(943) XOR DI(358) XOR DI(200) XOR DI(330) XOR DI(521) XOR DI(198) XOR DI(515) XOR DI(443) XOR DI(931) XOR DI(476) XOR DI(677) XOR DI(516) XOR DI(1016) XOR DI(996) XOR DI(744) XOR DI(583) XOR DI(902) XOR DI(82) XOR DI(42) XOR DI(276) XOR DI(864) XOR DI(584) XOR DI(442) XOR DI(85) XOR DI(830) XOR DI(991) XOR DI(41) XOR DI(793) XOR DI(568) XOR DI(49) XOR DI(86) XOR DI(936) XOR DI(87) XOR DI(921) XOR DI(351) XOR DI(685) XOR DI(869) XOR DI(571) XOR DI(792) XOR DI(834) XOR DI(65) XOR DI(329) XOR DI(413) XOR DI(972) XOR DI(730) XOR DI(608) XOR DI(45) XOR DI(102) XOR DI(188) XOR DI(297) XOR DI(837) XOR DI(464) XOR DI(827) XOR DI(548) XOR DI(952) XOR DI(435) XOR DI(634) XOR DI(576) XOR DI(700) XOR DI(733) XOR DI(491) XOR DI(62) XOR DI(183) XOR DI(976) XOR DI(838) XOR DI(103) XOR DI(682) XOR DI(909) XOR DI(994) XOR DI(527) XOR DI(923) XOR DI(257) XOR DI(222) XOR DI(4) XOR DI(973) XOR DI(937) XOR DI(671) XOR DI(756) XOR DI(893) XOR DI(367) XOR DI(783) XOR DI(752) XOR DI(721) XOR DI(169) XOR DI(818) XOR DI(227) XOR DI(53) XOR DI(518) XOR DI(371) XOR DI(701) XOR DI(253) XOR DI(120) XOR DI(884) XOR DI(446) XOR DI(734) XOR DI(235) XOR DI(876) XOR DI(481) XOR DI(885) XOR DI(723) XOR DI(400) XOR DI(12) XOR DI(604) XOR DI(416) XOR DI(490) XOR DI(318) XOR DI(152) XOR DI(72) XOR DI(420) XOR DI(134) XOR DI(683) XOR DI(105) XOR DI(732) XOR DI(409) XOR DI(639) XOR DI(892) XOR DI(171) XOR DI(663) XOR DI(284) XOR DI(28) XOR DI(587) XOR DI(613) XOR DI(331) XOR DI(808) XOR DI(280) XOR DI(541) XOR DI(938) XOR DI(122) XOR DI(612) XOR DI(850) XOR DI(926) XOR DI(471) XOR DI(678) XOR DI(990) XOR DI(76) XOR DI(36) XOR DI(270) XOR DI(79) XOR DI(327) XOR DI(35) XOR DI(562) XOR DI(81) XOR DI(345) XOR DI(679) XOR DI(916) XOR DI(724) XOR DI(291) XOR DI(172) XOR DI(821) XOR DI(429) XOR DI(143) XOR DI(628) XOR DI(113) XOR DI(485) XOR DI(988) XOR DI(374) XOR DI(917) XOR DI(790) XOR DI(216) XOR DI(534) XOR DI(346) XOR DI(123) XOR DI(777) XOR DI(746) XOR DI(715) XOR DI(163) XOR DI(365) XOR DI(207) XOR DI(440) XOR DI(728) XOR DI(475) XOR DI(804) XOR DI(717) XOR DI(394) XOR DI(624) XOR DI(877) XOR DI(240) XOR DI(410) XOR DI(495) XOR DI(61) XOR DI(66) XOR DI(901) XOR DI(813) XOR DI(537) XOR DI(214) XOR DI(460) XOR DI(633) XOR DI(5) XOR DI(886) XOR DI(657) XOR DI(22) XOR DI(390) XOR DI(295) XOR DI(606) XOR DI(933) XOR DI(504) XOR DI(124) XOR DI(465) XOR DI(672) XOR DI(70) XOR DI(30) XOR DI(673) XOR DI(910) XOR DI(718) XOR DI(596) XOR DI(147) XOR DI(205) XOR DI(210) XOR DI(117) XOR DI(421) XOR DI(157) XOR DI(206) XOR DI(722) XOR DI(642) XOR DI(310) XOR DI(60) XOR DI(531) XOR DI(408) XOR DI(983) XOR DI(720) XOR DI(627) XOR DI(651) XOR DI(16) XOR DI(384) XOR DI(174) XOR DI(498) XOR DI(118) XOR DI(258) XOR DI(667) XOR DI(904) XOR DI(954) XOR DI(616) XOR DI(362) XOR DI(204) XOR DI(151) XOR DI(811) XOR DI(463) XOR DI(865) XOR DI(8) XOR DI(525) XOR DI(391) XOR DI(202) XOR DI(313) XOR DI(453) XOR DI(457) XOR DI(699) XOR DI(2) XOR DI(519) XOR DI(615) XOR DI(486) XOR DI(538) XOR DI(139) XOR DI(693) XOR DI(853) XOR DI(513) XOR DI(480) XOR DI(133) XOR DI(526) XOR DI(127) XOR DI(514) XOR DI(502) XOR DI(1008) XOR DI(1020); + DO(13) <= DI(771) XOR DI(836) XOR DI(89) XOR DI(837) XOR DI(469) XOR DI(151) XOR DI(1002) XOR DI(775) XOR DI(238) XOR DI(840) XOR DI(562) XOR DI(590) XOR DI(304) XOR DI(382) XOR DI(798) XOR DI(52) XOR DI(975) XOR DI(691) XOR DI(776) XOR DI(220) XOR DI(876) XOR DI(842) XOR DI(632) XOR DI(28) XOR DI(685) XOR DI(589) XOR DI(946) XOR DI(427) XOR DI(282) XOR DI(692) XOR DI(512) XOR DI(1013) XOR DI(864) XOR DI(60) XOR DI(832) XOR DI(473) XOR DI(95) XOR DI(666) XOR DI(222) XOR DI(48) XOR DI(615) XOR DI(909) XOR DI(606) XOR DI(188) XOR DI(30) XOR DI(108) XOR DI(965) XOR DI(246) XOR DI(999) XOR DI(772) XOR DI(799) XOR DI(821) XOR DI(227) XOR DI(637) XOR DI(305) XOR DI(55) XOR DI(357) XOR DI(761) XOR DI(272) XOR DI(81) XOR DI(329) XOR DI(564) XOR DI(45) XOR DI(681) XOR DI(788) XOR DI(325) XOR DI(474) XOR DI(582) XOR DI(96) XOR DI(284) XOR DI(165) XOR DI(49) XOR DI(367) XOR DI(420) XOR DI(739) XOR DI(396) XOR DI(650) XOR DI(600) XOR DI(416) XOR DI(216) XOR DI(7) XOR DI(251) XOR DI(24) XOR DI(75) XOR DI(782) XOR DI(912) XOR DI(403) XOR DI(751) XOR DI(566) XOR DI(109) XOR DI(1000) XOR DI(423) XOR DI(445) XOR DI(159) XOR DI(737) XOR DI(471) XOR DI(800) XOR DI(594) XOR DI(312) XOR DI(897) XOR DI(386) XOR DI(112) XOR DI(260) XOR DI(592) XOR DI(336) XOR DI(802) XOR DI(638) XOR DI(56) XOR DI(380) XOR DI(642) XOR DI(494) XOR DI(455) XOR DI(546) XOR DI(943) XOR DI(137) XOR DI(358) XOR DI(191) XOR DI(374) XOR DI(449) XOR DI(657) XOR DI(453) XOR DI(611) XOR DI(931) XOR DI(129) XOR DI(1004) XOR DI(1016) XOR DI(580) XOR DI(861) XOR DI(581) XOR DI(439) XOR DI(295) XOR DI(790) XOR DI(848) XOR DI(789) XOR DI(919) XOR DI(758) XOR DI(99) XOR DI(555) XOR DI(432) XOR DI(697) XOR DI(116) XOR DI(442) XOR DI(156) XOR DI(598) XOR DI(488) XOR DI(59) XOR DI(626) XOR DI(180) XOR DI(100) XOR DI(361) XOR DI(475) XOR DI(906) XOR DI(524) XOR DI(1) XOR DI(970) XOR DI(890) XOR DI(293) XOR DI(881) XOR DI(740) XOR DI(276) XOR DI(608) XOR DI(478) XOR DI(720) XOR DI(880) XOR DI(243) XOR DI(601) XOR DI(498) XOR DI(459) XOR DI(64) XOR DI(315) XOR DI(816) XOR DI(102) XOR DI(705) XOR DI(921) XOR DI(660) XOR DI(610) XOR DI(393) XOR DI(935) XOR DI(350) XOR DI(190) XOR DI(847) XOR DI(1008) XOR DI(33) XOR DI(76) XOR DI(32) XOR DI(78) XOR DI(342) XOR DI(783) XOR DI(825) XOR DI(288) XOR DI(345) XOR DI(567) XOR DI(900) XOR DI(485) XOR DI(248) XOR DI(964) XOR DI(343) XOR DI(916) XOR DI(774) XOR DI(801) XOR DI(714) XOR DI(407) XOR DI(58) XOR DI(810) XOR DI(986) XOR DI(457) XOR DI(883) XOR DI(654) XOR DI(275) XOR DI(322) XOR DI(930) XOR DI(34) XOR DI(525) XOR DI(337) XOR DI(803) XOR DI(198) XOR DI(431) XOR DI(229) XOR DI(868) XOR DI(639) XOR DI(307) XOR DI(11) XOR DI(57) XOR DI(405) XOR DI(107) XOR DI(547) XOR DI(901) XOR DI(944) XOR DI(359) XOR DI(201) XOR DI(331) XOR DI(522) XOR DI(199) XOR DI(516) XOR DI(444) XOR DI(932) XOR DI(477) XOR DI(678) XOR DI(517) XOR DI(1017) XOR DI(997) XOR DI(745) XOR DI(584) XOR DI(903) XOR DI(83) XOR DI(43) XOR DI(277) XOR DI(865) XOR DI(585) XOR DI(443) XOR DI(86) XOR DI(831) XOR DI(992) XOR DI(42) XOR DI(794) XOR DI(569) XOR DI(50) XOR DI(87) XOR DI(937) XOR DI(88) XOR DI(922) XOR DI(352) XOR DI(686) XOR DI(870) XOR DI(572) XOR DI(793) XOR DI(835) XOR DI(66) XOR DI(330) XOR DI(414) XOR DI(973) XOR DI(731) XOR DI(609) XOR DI(46) XOR DI(103) XOR DI(189) XOR DI(298) XOR DI(838) XOR DI(465) XOR DI(828) XOR DI(549) XOR DI(953) XOR DI(436) XOR DI(635) XOR DI(577) XOR DI(701) XOR DI(734) XOR DI(492) XOR DI(63) XOR DI(184) XOR DI(977) XOR DI(839) XOR DI(104) XOR DI(683) XOR DI(910) XOR DI(995) XOR DI(528) XOR DI(924) XOR DI(258) XOR DI(223) XOR DI(5) XOR DI(974) XOR DI(938) XOR DI(672) XOR DI(757) XOR DI(894) XOR DI(368) XOR DI(784) XOR DI(753) XOR DI(722) XOR DI(170) XOR DI(819) XOR DI(228) XOR DI(54) XOR DI(519) XOR DI(372) XOR DI(702) XOR DI(254) XOR DI(121) XOR DI(885) XOR DI(447) XOR DI(735) XOR DI(236) XOR DI(877) XOR DI(482) XOR DI(886) XOR DI(724) XOR DI(401) XOR DI(13) XOR DI(605) XOR DI(417) XOR DI(491) XOR DI(319) XOR DI(153) XOR DI(73) XOR DI(421) XOR DI(135) XOR DI(684) XOR DI(106) XOR DI(733) XOR DI(410) XOR DI(640) XOR DI(893) XOR DI(172) XOR DI(664) XOR DI(285) XOR DI(29) XOR DI(588) XOR DI(614) XOR DI(332) XOR DI(809) XOR DI(281) XOR DI(542) XOR DI(939) XOR DI(123) XOR DI(613) XOR DI(851) XOR DI(927) XOR DI(472) XOR DI(679) XOR DI(991) XOR DI(77) XOR DI(37) XOR DI(271) XOR DI(80) XOR DI(328) XOR DI(36) XOR DI(563) XOR DI(82) XOR DI(346) XOR DI(680) XOR DI(917) XOR DI(725) XOR DI(292) XOR DI(173) XOR DI(822) XOR DI(430) XOR DI(144) XOR DI(629) XOR DI(114) XOR DI(486) XOR DI(989) XOR DI(375) XOR DI(918) XOR DI(791) XOR DI(217) XOR DI(535) XOR DI(347) XOR DI(124) XOR DI(778) XOR DI(747) XOR DI(716) XOR DI(164) XOR DI(366) XOR DI(208) XOR DI(441) XOR DI(729) XOR DI(476) XOR DI(805) XOR DI(718) XOR DI(395) XOR DI(625) XOR DI(878) XOR DI(241) XOR DI(411) XOR DI(496) XOR DI(62) XOR DI(67) XOR DI(902) XOR DI(814) XOR DI(538) XOR DI(215) XOR DI(461) XOR DI(634) XOR DI(6) XOR DI(887) XOR DI(658) XOR DI(23) XOR DI(391) XOR DI(296) XOR DI(607) XOR DI(934) XOR DI(505) XOR DI(125) XOR DI(466) XOR DI(673) XOR DI(71) XOR DI(31) XOR DI(674) XOR DI(911) XOR DI(719) XOR DI(597) XOR DI(148) XOR DI(206) XOR DI(211) XOR DI(118) XOR DI(422) XOR DI(158) XOR DI(207) XOR DI(723) XOR DI(643) XOR DI(311) XOR DI(61) XOR DI(532) XOR DI(409) XOR DI(984) XOR DI(721) XOR DI(628) XOR DI(0) XOR DI(652) XOR DI(17) XOR DI(385) XOR DI(175) XOR DI(499) XOR DI(119) XOR DI(259) XOR DI(668) XOR DI(905) XOR DI(955) XOR DI(617) XOR DI(363) XOR DI(205) XOR DI(152) XOR DI(812) XOR DI(464) XOR DI(866) XOR DI(9) XOR DI(526) XOR DI(392) XOR DI(203) XOR DI(314) XOR DI(454) XOR DI(458) XOR DI(700) XOR DI(3) XOR DI(520) XOR DI(616) XOR DI(487) XOR DI(539) XOR DI(140) XOR DI(694) XOR DI(854) XOR DI(514) XOR DI(481) XOR DI(134) XOR DI(527) XOR DI(128) XOR DI(515) XOR DI(503) XOR DI(1009) XOR DI(1021); + DO(14) <= DI(772) XOR DI(837) XOR DI(90) XOR DI(838) XOR DI(470) XOR DI(152) XOR DI(1003) XOR DI(776) XOR DI(239) XOR DI(841) XOR DI(563) XOR DI(591) XOR DI(305) XOR DI(383) XOR DI(799) XOR DI(53) XOR DI(976) XOR DI(692) XOR DI(777) XOR DI(221) XOR DI(877) XOR DI(843) XOR DI(633) XOR DI(29) XOR DI(686) XOR DI(590) XOR DI(947) XOR DI(428) XOR DI(283) XOR DI(693) XOR DI(513) XOR DI(1014) XOR DI(865) XOR DI(61) XOR DI(833) XOR DI(474) XOR DI(96) XOR DI(667) XOR DI(223) XOR DI(49) XOR DI(616) XOR DI(910) XOR DI(607) XOR DI(189) XOR DI(31) XOR DI(109) XOR DI(966) XOR DI(247) XOR DI(1000) XOR DI(773) XOR DI(800) XOR DI(822) XOR DI(228) XOR DI(638) XOR DI(306) XOR DI(56) XOR DI(358) XOR DI(762) XOR DI(273) XOR DI(82) XOR DI(330) XOR DI(565) XOR DI(46) XOR DI(682) XOR DI(789) XOR DI(326) XOR DI(475) XOR DI(583) XOR DI(97) XOR DI(285) XOR DI(166) XOR DI(50) XOR DI(368) XOR DI(421) XOR DI(740) XOR DI(397) XOR DI(651) XOR DI(601) XOR DI(417) XOR DI(217) XOR DI(8) XOR DI(252) XOR DI(25) XOR DI(76) XOR DI(783) XOR DI(913) XOR DI(404) XOR DI(752) XOR DI(567) XOR DI(110) XOR DI(1001) XOR DI(424) XOR DI(446) XOR DI(160) XOR DI(738) XOR DI(472) XOR DI(801) XOR DI(595) XOR DI(313) XOR DI(898) XOR DI(387) XOR DI(113) XOR DI(261) XOR DI(593) XOR DI(337) XOR DI(803) XOR DI(639) XOR DI(57) XOR DI(381) XOR DI(643) XOR DI(495) XOR DI(456) XOR DI(547) XOR DI(944) XOR DI(138) XOR DI(359) XOR DI(192) XOR DI(375) XOR DI(450) XOR DI(658) XOR DI(454) XOR DI(612) XOR DI(932) XOR DI(130) XOR DI(1005) XOR DI(1017) XOR DI(581) XOR DI(862) XOR DI(582) XOR DI(440) XOR DI(296) XOR DI(791) XOR DI(849) XOR DI(790) XOR DI(920) XOR DI(759) XOR DI(100) XOR DI(556) XOR DI(433) XOR DI(698) XOR DI(117) XOR DI(443) XOR DI(157) XOR DI(599) XOR DI(489) XOR DI(60) XOR DI(627) XOR DI(181) XOR DI(101) XOR DI(362) XOR DI(476) XOR DI(907) XOR DI(525) XOR DI(2) XOR DI(971) XOR DI(891) XOR DI(294) XOR DI(882) XOR DI(741) XOR DI(277) XOR DI(609) XOR DI(479) XOR DI(721) XOR DI(881) XOR DI(244) XOR DI(602) XOR DI(499) XOR DI(460) XOR DI(65) XOR DI(316) XOR DI(817) XOR DI(103) XOR DI(706) XOR DI(922) XOR DI(661) XOR DI(611) XOR DI(394) XOR DI(936) XOR DI(351) XOR DI(191) XOR DI(848) XOR DI(1009) XOR DI(34) XOR DI(77) XOR DI(33) XOR DI(79) XOR DI(343) XOR DI(784) XOR DI(826) XOR DI(289) XOR DI(346) XOR DI(568) XOR DI(901) XOR DI(486) XOR DI(249) XOR DI(965) XOR DI(344) XOR DI(917) XOR DI(775) XOR DI(802) XOR DI(715) XOR DI(408) XOR DI(59) XOR DI(811) XOR DI(987) XOR DI(458) XOR DI(884) XOR DI(655) XOR DI(276) XOR DI(323) XOR DI(931) XOR DI(35) XOR DI(526) XOR DI(338) XOR DI(804) XOR DI(199) XOR DI(432) XOR DI(230) XOR DI(869) XOR DI(640) XOR DI(308) XOR DI(12) XOR DI(58) XOR DI(406) XOR DI(108) XOR DI(548) XOR DI(902) XOR DI(945) XOR DI(360) XOR DI(202) XOR DI(332) XOR DI(523) XOR DI(200) XOR DI(0) XOR DI(517) XOR DI(445) XOR DI(933) XOR DI(478) XOR DI(679) XOR DI(518) XOR DI(1018) XOR DI(998) XOR DI(746) XOR DI(585) XOR DI(904) XOR DI(84) XOR DI(44) XOR DI(278) XOR DI(866) XOR DI(586) XOR DI(444) XOR DI(87) XOR DI(832) XOR DI(993) XOR DI(43) XOR DI(795) XOR DI(570) XOR DI(51) XOR DI(88) XOR DI(938) XOR DI(89) XOR DI(923) XOR DI(353) XOR DI(687) XOR DI(871) XOR DI(573) XOR DI(794) XOR DI(836) XOR DI(67) XOR DI(331) XOR DI(415) XOR DI(974) XOR DI(732) XOR DI(610) XOR DI(47) XOR DI(104) XOR DI(190) XOR DI(299) XOR DI(839) XOR DI(466) XOR DI(829) XOR DI(550) XOR DI(954) XOR DI(437) XOR DI(636) XOR DI(578) XOR DI(702) XOR DI(735) XOR DI(493) XOR DI(64) XOR DI(185) XOR DI(978) XOR DI(840) XOR DI(105) XOR DI(684) XOR DI(911) XOR DI(996) XOR DI(529) XOR DI(925) XOR DI(259) XOR DI(224) XOR DI(6) XOR DI(975) XOR DI(939) XOR DI(673) XOR DI(758) XOR DI(895) XOR DI(369) XOR DI(785) XOR DI(754) XOR DI(723) XOR DI(171) XOR DI(820) XOR DI(229) XOR DI(55) XOR DI(520) XOR DI(373) XOR DI(703) XOR DI(255) XOR DI(122) XOR DI(886) XOR DI(448) XOR DI(736) XOR DI(237) XOR DI(878) XOR DI(483) XOR DI(887) XOR DI(725) XOR DI(402) XOR DI(14) XOR DI(606) XOR DI(418) XOR DI(492) XOR DI(320) XOR DI(154) XOR DI(74) XOR DI(422) XOR DI(136) XOR DI(685) XOR DI(107) XOR DI(734) XOR DI(411) XOR DI(641) XOR DI(894) XOR DI(173) XOR DI(665) XOR DI(286) XOR DI(30) XOR DI(589) XOR DI(615) XOR DI(333) XOR DI(810) XOR DI(282) XOR DI(543) XOR DI(940) XOR DI(124) XOR DI(614) XOR DI(852) XOR DI(928) XOR DI(473) XOR DI(680) XOR DI(992) XOR DI(78) XOR DI(38) XOR DI(272) XOR DI(81) XOR DI(329) XOR DI(37) XOR DI(564) XOR DI(83) XOR DI(347) XOR DI(681) XOR DI(918) XOR DI(726) XOR DI(293) XOR DI(174) XOR DI(823) XOR DI(431) XOR DI(145) XOR DI(630) XOR DI(115) XOR DI(487) XOR DI(990) XOR DI(376) XOR DI(919) XOR DI(792) XOR DI(218) XOR DI(536) XOR DI(348) XOR DI(125) XOR DI(779) XOR DI(748) XOR DI(717) XOR DI(165) XOR DI(367) XOR DI(209) XOR DI(442) XOR DI(730) XOR DI(477) XOR DI(806) XOR DI(719) XOR DI(396) XOR DI(626) XOR DI(879) XOR DI(242) XOR DI(412) XOR DI(497) XOR DI(63) XOR DI(68) XOR DI(903) XOR DI(815) XOR DI(539) XOR DI(216) XOR DI(462) XOR DI(635) XOR DI(7) XOR DI(888) XOR DI(659) XOR DI(24) XOR DI(392) XOR DI(297) XOR DI(608) XOR DI(935) XOR DI(506) XOR DI(126) XOR DI(467) XOR DI(674) XOR DI(72) XOR DI(32) XOR DI(675) XOR DI(912) XOR DI(720) XOR DI(598) XOR DI(149) XOR DI(207) XOR DI(212) XOR DI(119) XOR DI(423) XOR DI(159) XOR DI(208) XOR DI(724) XOR DI(644) XOR DI(312) XOR DI(62) XOR DI(533) XOR DI(410) XOR DI(985) XOR DI(722) XOR DI(629) XOR DI(1) XOR DI(653) XOR DI(18) XOR DI(386) XOR DI(176) XOR DI(500) XOR DI(120) XOR DI(260) XOR DI(669) XOR DI(906) XOR DI(956) XOR DI(618) XOR DI(364) XOR DI(206) XOR DI(153) XOR DI(813) XOR DI(465) XOR DI(867) XOR DI(10) XOR DI(527) XOR DI(393) XOR DI(204) XOR DI(315) XOR DI(455) XOR DI(459) XOR DI(701) XOR DI(4) XOR DI(521) XOR DI(617) XOR DI(488) XOR DI(540) XOR DI(141) XOR DI(695) XOR DI(855) XOR DI(515) XOR DI(482) XOR DI(135) XOR DI(528) XOR DI(129) XOR DI(516) XOR DI(504) XOR DI(1010) XOR DI(1022); + DO(15) <= DI(773) XOR DI(838) XOR DI(91) XOR DI(839) XOR DI(471) XOR DI(153) XOR DI(1004) XOR DI(777) XOR DI(240) XOR DI(842) XOR DI(564) XOR DI(592) XOR DI(306) XOR DI(384) XOR DI(800) XOR DI(54) XOR DI(977) XOR DI(693) XOR DI(778) XOR DI(222) XOR DI(878) XOR DI(844) XOR DI(634) XOR DI(30) XOR DI(687) XOR DI(591) XOR DI(948) XOR DI(429) XOR DI(284) XOR DI(694) XOR DI(514) XOR DI(1015) XOR DI(866) XOR DI(62) XOR DI(834) XOR DI(475) XOR DI(97) XOR DI(668) XOR DI(224) XOR DI(50) XOR DI(617) XOR DI(911) XOR DI(608) XOR DI(190) XOR DI(32) XOR DI(110) XOR DI(967) XOR DI(248) XOR DI(1001) XOR DI(774) XOR DI(801) XOR DI(823) XOR DI(229) XOR DI(639) XOR DI(307) XOR DI(57) XOR DI(359) XOR DI(763) XOR DI(274) XOR DI(83) XOR DI(331) XOR DI(566) XOR DI(47) XOR DI(683) XOR DI(790) XOR DI(327) XOR DI(476) XOR DI(584) XOR DI(98) XOR DI(286) XOR DI(167) XOR DI(51) XOR DI(369) XOR DI(422) XOR DI(741) XOR DI(398) XOR DI(652) XOR DI(602) XOR DI(418) XOR DI(218) XOR DI(9) XOR DI(253) XOR DI(26) XOR DI(77) XOR DI(784) XOR DI(914) XOR DI(405) XOR DI(753) XOR DI(568) XOR DI(111) XOR DI(1002) XOR DI(425) XOR DI(447) XOR DI(161) XOR DI(739) XOR DI(473) XOR DI(802) XOR DI(596) XOR DI(314) XOR DI(899) XOR DI(388) XOR DI(114) XOR DI(262) XOR DI(594) XOR DI(338) XOR DI(804) XOR DI(640) XOR DI(58) XOR DI(382) XOR DI(644) XOR DI(496) XOR DI(457) XOR DI(548) XOR DI(945) XOR DI(139) XOR DI(360) XOR DI(193) XOR DI(376) XOR DI(451) XOR DI(659) XOR DI(455) XOR DI(613) XOR DI(933) XOR DI(131) XOR DI(1006) XOR DI(1018) XOR DI(582) XOR DI(863) XOR DI(583) XOR DI(441) XOR DI(297) XOR DI(792) XOR DI(850) XOR DI(791) XOR DI(921) XOR DI(760) XOR DI(101) XOR DI(557) XOR DI(434) XOR DI(699) XOR DI(118) XOR DI(444) XOR DI(158) XOR DI(600) XOR DI(490) XOR DI(61) XOR DI(628) XOR DI(0) XOR DI(182) XOR DI(102) XOR DI(363) XOR DI(477) XOR DI(908) XOR DI(526) XOR DI(3) XOR DI(972) XOR DI(892) XOR DI(295) XOR DI(883) XOR DI(742) XOR DI(278) XOR DI(610) XOR DI(480) XOR DI(722) XOR DI(882) XOR DI(245) XOR DI(603) XOR DI(500) XOR DI(461) XOR DI(66) XOR DI(317) XOR DI(818) XOR DI(104) XOR DI(707) XOR DI(923) XOR DI(662) XOR DI(612) XOR DI(395) XOR DI(937) XOR DI(352) XOR DI(192) XOR DI(849) XOR DI(1010) XOR DI(35) XOR DI(78) XOR DI(34) XOR DI(80) XOR DI(344) XOR DI(785) XOR DI(827) XOR DI(290) XOR DI(347) XOR DI(569) XOR DI(902) XOR DI(487) XOR DI(250) XOR DI(966) XOR DI(345) XOR DI(918) XOR DI(776) XOR DI(803) XOR DI(716) XOR DI(409) XOR DI(60) XOR DI(812) XOR DI(988) XOR DI(459) XOR DI(885) XOR DI(656) XOR DI(277) XOR DI(324) XOR DI(932) XOR DI(36) XOR DI(527) XOR DI(339) XOR DI(805) XOR DI(200) XOR DI(433) XOR DI(231) XOR DI(870) XOR DI(641) XOR DI(309) XOR DI(13) XOR DI(59) XOR DI(407) XOR DI(109) XOR DI(549) XOR DI(903) XOR DI(946) XOR DI(361) XOR DI(203) XOR DI(333) XOR DI(524) XOR DI(201) XOR DI(1) XOR DI(518) XOR DI(446) XOR DI(934) XOR DI(479) XOR DI(680) XOR DI(519) XOR DI(1019) XOR DI(999) XOR DI(747) XOR DI(586) XOR DI(905) XOR DI(85) XOR DI(45) XOR DI(279) XOR DI(867) XOR DI(587) XOR DI(445) XOR DI(88) XOR DI(833) XOR DI(994) XOR DI(44) XOR DI(796) XOR DI(571) XOR DI(52) XOR DI(89) XOR DI(939) XOR DI(90) XOR DI(924) XOR DI(354) XOR DI(688) XOR DI(872) XOR DI(574) XOR DI(795) XOR DI(837) XOR DI(68) XOR DI(332) XOR DI(416) XOR DI(975) XOR DI(733) XOR DI(611) XOR DI(48) XOR DI(105) XOR DI(191) XOR DI(300) XOR DI(840) XOR DI(467) XOR DI(830) XOR DI(551) XOR DI(955) XOR DI(438) XOR DI(637) XOR DI(579) XOR DI(703) XOR DI(736) XOR DI(494) XOR DI(65) XOR DI(186) XOR DI(979) XOR DI(841) XOR DI(106) XOR DI(685) XOR DI(912) XOR DI(997) XOR DI(530) XOR DI(926) XOR DI(260) XOR DI(225) XOR DI(7) XOR DI(976) XOR DI(940) XOR DI(674) XOR DI(759) XOR DI(896) XOR DI(370) XOR DI(786) XOR DI(755) XOR DI(724) XOR DI(172) XOR DI(821) XOR DI(230) XOR DI(56) XOR DI(521) XOR DI(374) XOR DI(704) XOR DI(256) XOR DI(123) XOR DI(887) XOR DI(449) XOR DI(737) XOR DI(238) XOR DI(879) XOR DI(484) XOR DI(888) XOR DI(726) XOR DI(403) XOR DI(15) XOR DI(607) XOR DI(419) XOR DI(493) XOR DI(321) XOR DI(155) XOR DI(75) XOR DI(423) XOR DI(137) XOR DI(686) XOR DI(108) XOR DI(735) XOR DI(412) XOR DI(642) XOR DI(895) XOR DI(174) XOR DI(666) XOR DI(287) XOR DI(31) XOR DI(590) XOR DI(616) XOR DI(334) XOR DI(811) XOR DI(283) XOR DI(544) XOR DI(941) XOR DI(125) XOR DI(615) XOR DI(853) XOR DI(929) XOR DI(474) XOR DI(681) XOR DI(993) XOR DI(79) XOR DI(39) XOR DI(273) XOR DI(82) XOR DI(330) XOR DI(38) XOR DI(565) XOR DI(84) XOR DI(348) XOR DI(682) XOR DI(919) XOR DI(727) XOR DI(294) XOR DI(175) XOR DI(824) XOR DI(432) XOR DI(146) XOR DI(631) XOR DI(116) XOR DI(488) XOR DI(991) XOR DI(377) XOR DI(920) XOR DI(793) XOR DI(219) XOR DI(537) XOR DI(349) XOR DI(126) XOR DI(780) XOR DI(749) XOR DI(718) XOR DI(166) XOR DI(368) XOR DI(210) XOR DI(443) XOR DI(731) XOR DI(478) XOR DI(807) XOR DI(720) XOR DI(397) XOR DI(627) XOR DI(880) XOR DI(243) XOR DI(413) XOR DI(498) XOR DI(64) XOR DI(69) XOR DI(904) XOR DI(816) XOR DI(540) XOR DI(217) XOR DI(463) XOR DI(636) XOR DI(8) XOR DI(889) XOR DI(660) XOR DI(25) XOR DI(393) XOR DI(298) XOR DI(609) XOR DI(936) XOR DI(507) XOR DI(127) XOR DI(468) XOR DI(675) XOR DI(73) XOR DI(33) XOR DI(676) XOR DI(913) XOR DI(721) XOR DI(599) XOR DI(150) XOR DI(208) XOR DI(213) XOR DI(120) XOR DI(424) XOR DI(160) XOR DI(209) XOR DI(725) XOR DI(645) XOR DI(313) XOR DI(63) XOR DI(534) XOR DI(411) XOR DI(986) XOR DI(723) XOR DI(630) XOR DI(2) XOR DI(654) XOR DI(19) XOR DI(387) XOR DI(177) XOR DI(501) XOR DI(121) XOR DI(261) XOR DI(670) XOR DI(907) XOR DI(957) XOR DI(619) XOR DI(365) XOR DI(207) XOR DI(154) XOR DI(814) XOR DI(466) XOR DI(868) XOR DI(11) XOR DI(528) XOR DI(394) XOR DI(205) XOR DI(316) XOR DI(456) XOR DI(460) XOR DI(702) XOR DI(5) XOR DI(522) XOR DI(618) XOR DI(489) XOR DI(541) XOR DI(142) XOR DI(696) XOR DI(856) XOR DI(516) XOR DI(483) XOR DI(136) XOR DI(529) XOR DI(130) XOR DI(517) XOR DI(505) XOR DI(1011) XOR DI(1023); + DO(16) <= DI(774) XOR DI(839) XOR DI(50) XOR DI(636) XOR DI(356) XOR DI(92) XOR DI(337) XOR DI(840) XOR DI(769) XOR DI(590) XOR DI(798) XOR DI(302) XOR DI(472) XOR DI(93) XOR DI(563) XOR DI(154) XOR DI(359) XOR DI(1005) XOR DI(778) XOR DI(248) XOR DI(241) XOR DI(911) XOR DI(843) XOR DI(565) XOR DI(999) XOR DI(224) XOR DI(712) XOR DI(593) XOR DI(307) XOR DI(385) XOR DI(928) XOR DI(259) XOR DI(801) XOR DI(866) XOR DI(55) XOR DI(978) XOR DI(357) XOR DI(190) XOR DI(1015) XOR DI(898) XOR DI(694) XOR DI(779) XOR DI(814) XOR DI(223) XOR DI(879) XOR DI(845) XOR DI(635) XOR DI(189) XOR DI(31) XOR DI(688) XOR DI(800) XOR DI(929) XOR DI(592) XOR DI(949) XOR DI(197) XOR DI(430) XOR DI(979) XOR DI(285) XOR DI(943) XOR DI(358) XOR DI(695) XOR DI(855) XOR DI(515) XOR DI(482) XOR DI(1016) XOR DI(303) XOR DI(47) XOR DI(867) XOR DI(63) XOR DI(835) XOR DI(963) XOR DI(574) XOR DI(696) XOR DI(476) XOR DI(98) XOR DI(669) XOR DI(431) XOR DI(225) XOR DI(51) XOR DI(618) XOR DI(516) XOR DI(912) XOR DI(422) XOR DI(609) XOR DI(242) XOR DI(706) XOR DI(282) XOR DI(191) XOR DI(268) XOR DI(33) XOR DI(560) XOR DI(111) XOR DI(690) XOR DI(968) XOR DI(249) XOR DI(1002) XOR DI(775) XOR DI(438) XOR DI(473) XOR DI(802) XOR DI(392) XOR DI(18) XOR DI(899) XOR DI(323) XOR DI(164) XOR DI(135) XOR DI(824) XOR DI(338) XOR DI(199) XOR DI(230) XOR DI(640) XOR DI(308) XOR DI(58) XOR DI(625) XOR DI(382) XOR DI(496) XOR DI(665) XOR DI(945) XOR DI(360) XOR DI(451) XOR DI(125) XOR DI(1018) XOR DI(764) XOR DI(275) XOR DI(863) XOR DI(441) XOR DI(84) XOR DI(332) XOR DI(304) XOR DI(567) XOR DI(974) XOR DI(554) XOR DI(48) XOR DI(684) XOR DI(791) XOR DI(833) XOR DI(328) XOR DI(971) XOR DI(729) XOR DI(44) XOR DI(836) XOR DI(964) XOR DI(961) XOR DI(547) XOR DI(951) XOR DI(148) XOR DI(0) XOR DI(182) XOR DI(477) XOR DI(993) XOR DI(493) XOR DI(585) XOR DI(221) XOR DI(709) XOR DI(99) XOR DI(184) XOR DI(432) XOR DI(287) XOR DI(168) XOR DI(52) XOR DI(370) XOR DI(423) XOR DI(742) XOR DI(875) XOR DI(399) XOR DI(653) XOR DI(603) XOR DI(415) XOR DI(25) XOR DI(71) XOR DI(419) XOR DI(767) XOR DI(104) XOR DI(219) XOR DI(707) XOR DI(10) XOR DI(254) XOR DI(283) XOR DI(27) XOR DI(330) XOR DI(470) XOR DI(269) XOR DI(78) XOR DI(344) XOR DI(785) XOR DI(915) XOR DI(406) XOR DI(754) XOR DI(569) XOR DI(112) XOR DI(691) XOR DI(969) XOR DI(250) XOR DI(215) XOR DI(533) XOR DI(918) XOR DI(1003) XOR DI(426) XOR DI(776) XOR DI(745) XOR DI(714) XOR DI(448) XOR DI(162) XOR DI(740) XOR DI(474) XOR DI(803) XOR DI(597) XOR DI(315) XOR DI(19) XOR DI(900) XOR DI(536) XOR DI(887) XOR DI(656) XOR DI(277) XOR DI(389) XOR DI(324) XOR DI(115) XOR DI(605) XOR DI(503) XOR DI(263) XOR DI(292) XOR DI(595) XOR DI(165) XOR DI(339) XOR DI(805) XOR DI(816) XOR DI(505) XOR DI(200) XOR DI(266) XOR DI(641) XOR DI(233) XOR DI(309) XOR DI(13) XOR DI(59) XOR DI(626) XOR DI(650) XOR DI(271) XOR DI(383) XOR DI(645) XOR DI(497) XOR DI(458) XOR DI(549) XOR DI(666) XOR DI(946) XOR DI(140) XOR DI(361) XOR DI(150) XOR DI(194) XOR DI(524) XOR DI(377) XOR DI(452) XOR DI(660) XOR DI(456) XOR DI(614) XOR DI(934) XOR DI(852) XOR DI(132) XOR DI(680) XOR DI(1007) XOR DI(1019) XOR DI(996) XOR DI(583) XOR DI(765) XOR DI(772) XOR DI(42) XOR DI(276) XOR DI(864) XOR DI(584) XOR DI(442) XOR DI(298) XOR DI(376) XOR DI(830) XOR DI(326) XOR DI(41) XOR DI(793) XOR DI(305) XOR DI(851) XOR DI(351) XOR DI(685) XOR DI(792) XOR DI(922) XOR DI(329) XOR DI(761) XOR DI(730) XOR DI(102) XOR DI(297) XOR DI(558) XOR DI(751) XOR DI(827) XOR DI(548) XOR DI(952) XOR DI(435) XOR DI(149) XOR DI(634) XOR DI(354) XOR DI(576) XOR DI(700) XOR DI(119) XOR DI(445) XOR DI(159) XOR DI(217) XOR DI(601) XOR DI(236) XOR DI(491) XOR DI(62) XOR DI(629) XOR DI(1) XOR DI(183) XOR DI(103) XOR DI(364) XOR DI(478) XOR DI(909) XOR DI(527) XOR DI(380) XOR DI(170) XOR DI(923) XOR DI(222) XOR DI(300) XOR DI(4) XOR DI(973) XOR DI(352) XOR DI(185) XOR DI(763) XOR DI(893) XOR DI(296) XOR DI(559) XOR DI(213) XOR DI(120) XOR DI(662) XOR DI(747) XOR DI(884) XOR DI(743) XOR DI(279) XOR DI(611) XOR DI(437) XOR DI(481) XOR DI(810) XOR DI(723) XOR DI(400) XOR DI(883) XOR DI(246) XOR DI(604) XOR DI(501) XOR DI(462) XOR DI(67) XOR DI(318) XOR DI(907) XOR DI(819) XOR DI(957) XOR DI(543) XOR DI(134) XOR DI(105) XOR DI(409) XOR DI(466) XOR DI(708) XOR DI(892) XOR DI(171) XOR DI(924) XOR DI(663) XOR DI(255) XOR DI(28) XOR DI(613) XOR DI(396) XOR DI(862) XOR DI(658) XOR DI(938) XOR DI(353) XOR DI(193) XOR DI(939) XOR DI(850) XOR DI(510) XOR DI(926) XOR DI(1011) XOR DI(990) XOR DI(759) XOR DI(36) XOR DI(858) XOR DI(79) XOR DI(320) XOR DI(35) XOR DI(562) XOR DI(43) XOR DI(81) XOR DI(345) XOR DI(679) XOR DI(786) XOR DI(828) XOR DI(407) XOR DI(966) XOR DI(755) XOR DI(602) XOR DI(291) XOR DI(959) XOR DI(821) XOR DI(429) XOR DI(348) XOR DI(570) XOR DI(153) XOR DI(970) XOR DI(832) XOR DI(903) XOR DI(411) XOR DI(488) XOR DI(790) XOR DI(251) XOR DI(216) XOR DI(967) XOR DI(534) XOR DI(346) XOR DI(919) XOR DI(123) XOR DI(777) XOR DI(715) XOR DI(449) XOR DI(163) XOR DI(823) XOR DI(512) XOR DI(114) XOR DI(741) XOR DI(418) XOR DI(212) XOR DI(238) XOR DI(804) XOR DI(717) XOR DI(624) XOR DI(648) XOR DI(240) XOR DI(316) XOR DI(410) XOR DI(61) XOR DI(146) XOR DI(901) XOR DI(813) XOR DI(989) XOR DI(460) XOR DI(702) XOR DI(633) XOR DI(5) XOR DI(886) XOR DI(657) XOR DI(15) XOR DI(278) XOR DI(325) XOR DI(652) XOR DI(606) XOR DI(933) XOR DI(30) XOR DI(293) XOR DI(556) XOR DI(37) XOR DI(910) XOR DI(401) XOR DI(205) XOR DI(826) XOR DI(405) XOR DI(368) XOR DI(528) XOR DI(340) XOR DI(421) XOR DI(157) XOR DI(806) XOR DI(201) XOR DI(434) XOR DI(232) XOR DI(871) XOR DI(642) XOR DI(310) XOR DI(14) XOR DI(60) XOR DI(408) XOR DI(384) XOR DI(110) XOR DI(174) XOR DI(498) XOR DI(118) XOR DI(459) XOR DI(24) XOR DI(550) XOR DI(904) XOR DI(947) XOR DI(141) XOR DI(362) XOR DI(204) XOR DI(334) XOR DI(428) XOR DI(463) XOR DI(525) XOR DI(202) XOR DI(492) XOR DI(453) XOR DI(544) XOR DI(145) XOR DI(2) XOR DI(519) XOR DI(615) XOR DI(372) XOR DI(447) XOR DI(935) XOR DI(853) XOR DI(513) XOR DI(480) XOR DI(532) XOR DI(133) XOR DI(681) XOR DI(520) XOR DI(514) XOR DI(1008) XOR DI(1014) XOR DI(1020); + DO(17) <= DI(775) XOR DI(840) XOR DI(51) XOR DI(637) XOR DI(357) XOR DI(93) XOR DI(338) XOR DI(841) XOR DI(770) XOR DI(591) XOR DI(799) XOR DI(303) XOR DI(473) XOR DI(94) XOR DI(564) XOR DI(155) XOR DI(360) XOR DI(1006) XOR DI(779) XOR DI(249) XOR DI(242) XOR DI(912) XOR DI(844) XOR DI(566) XOR DI(1000) XOR DI(225) XOR DI(713) XOR DI(594) XOR DI(308) XOR DI(386) XOR DI(929) XOR DI(260) XOR DI(802) XOR DI(867) XOR DI(56) XOR DI(979) XOR DI(358) XOR DI(191) XOR DI(1016) XOR DI(899) XOR DI(695) XOR DI(780) XOR DI(815) XOR DI(224) XOR DI(880) XOR DI(846) XOR DI(636) XOR DI(190) XOR DI(32) XOR DI(689) XOR DI(801) XOR DI(930) XOR DI(593) XOR DI(950) XOR DI(198) XOR DI(431) XOR DI(980) XOR DI(286) XOR DI(944) XOR DI(359) XOR DI(696) XOR DI(856) XOR DI(516) XOR DI(483) XOR DI(1017) XOR DI(304) XOR DI(48) XOR DI(868) XOR DI(64) XOR DI(836) XOR DI(964) XOR DI(575) XOR DI(697) XOR DI(477) XOR DI(99) XOR DI(670) XOR DI(432) XOR DI(226) XOR DI(52) XOR DI(619) XOR DI(517) XOR DI(913) XOR DI(423) XOR DI(610) XOR DI(243) XOR DI(707) XOR DI(283) XOR DI(192) XOR DI(269) XOR DI(34) XOR DI(561) XOR DI(112) XOR DI(691) XOR DI(969) XOR DI(250) XOR DI(1003) XOR DI(776) XOR DI(439) XOR DI(474) XOR DI(803) XOR DI(393) XOR DI(19) XOR DI(900) XOR DI(324) XOR DI(165) XOR DI(136) XOR DI(825) XOR DI(339) XOR DI(200) XOR DI(231) XOR DI(641) XOR DI(309) XOR DI(59) XOR DI(626) XOR DI(383) XOR DI(497) XOR DI(666) XOR DI(946) XOR DI(361) XOR DI(452) XOR DI(126) XOR DI(1019) XOR DI(765) XOR DI(276) XOR DI(864) XOR DI(442) XOR DI(85) XOR DI(333) XOR DI(305) XOR DI(568) XOR DI(975) XOR DI(555) XOR DI(49) XOR DI(685) XOR DI(792) XOR DI(834) XOR DI(329) XOR DI(972) XOR DI(730) XOR DI(45) XOR DI(837) XOR DI(965) XOR DI(962) XOR DI(548) XOR DI(952) XOR DI(149) XOR DI(1) XOR DI(183) XOR DI(478) XOR DI(994) XOR DI(494) XOR DI(586) XOR DI(222) XOR DI(710) XOR DI(100) XOR DI(185) XOR DI(433) XOR DI(288) XOR DI(169) XOR DI(53) XOR DI(371) XOR DI(424) XOR DI(743) XOR DI(876) XOR DI(400) XOR DI(654) XOR DI(604) XOR DI(416) XOR DI(26) XOR DI(72) XOR DI(420) XOR DI(768) XOR DI(105) XOR DI(220) XOR DI(708) XOR DI(11) XOR DI(255) XOR DI(284) XOR DI(28) XOR DI(331) XOR DI(471) XOR DI(270) XOR DI(79) XOR DI(345) XOR DI(786) XOR DI(916) XOR DI(407) XOR DI(755) XOR DI(570) XOR DI(113) XOR DI(692) XOR DI(970) XOR DI(251) XOR DI(216) XOR DI(534) XOR DI(919) XOR DI(1004) XOR DI(427) XOR DI(777) XOR DI(746) XOR DI(715) XOR DI(449) XOR DI(163) XOR DI(741) XOR DI(475) XOR DI(804) XOR DI(598) XOR DI(316) XOR DI(20) XOR DI(901) XOR DI(537) XOR DI(888) XOR DI(657) XOR DI(278) XOR DI(390) XOR DI(325) XOR DI(116) XOR DI(606) XOR DI(504) XOR DI(264) XOR DI(293) XOR DI(596) XOR DI(166) XOR DI(340) XOR DI(806) XOR DI(817) XOR DI(506) XOR DI(201) XOR DI(267) XOR DI(642) XOR DI(234) XOR DI(310) XOR DI(14) XOR DI(60) XOR DI(627) XOR DI(651) XOR DI(272) XOR DI(384) XOR DI(646) XOR DI(498) XOR DI(459) XOR DI(550) XOR DI(667) XOR DI(947) XOR DI(141) XOR DI(362) XOR DI(151) XOR DI(195) XOR DI(525) XOR DI(378) XOR DI(453) XOR DI(661) XOR DI(457) XOR DI(615) XOR DI(935) XOR DI(853) XOR DI(133) XOR DI(681) XOR DI(1008) XOR DI(1020) XOR DI(997) XOR DI(584) XOR DI(766) XOR DI(773) XOR DI(43) XOR DI(277) XOR DI(865) XOR DI(585) XOR DI(443) XOR DI(299) XOR DI(377) XOR DI(831) XOR DI(327) XOR DI(42) XOR DI(794) XOR DI(306) XOR DI(852) XOR DI(352) XOR DI(686) XOR DI(793) XOR DI(923) XOR DI(330) XOR DI(762) XOR DI(731) XOR DI(103) XOR DI(298) XOR DI(559) XOR DI(752) XOR DI(828) XOR DI(549) XOR DI(953) XOR DI(436) XOR DI(150) XOR DI(635) XOR DI(355) XOR DI(577) XOR DI(701) XOR DI(120) XOR DI(446) XOR DI(160) XOR DI(218) XOR DI(602) XOR DI(237) XOR DI(492) XOR DI(63) XOR DI(630) XOR DI(2) XOR DI(184) XOR DI(104) XOR DI(365) XOR DI(479) XOR DI(910) XOR DI(528) XOR DI(381) XOR DI(171) XOR DI(924) XOR DI(223) XOR DI(301) XOR DI(5) XOR DI(974) XOR DI(353) XOR DI(186) XOR DI(764) XOR DI(894) XOR DI(297) XOR DI(560) XOR DI(214) XOR DI(121) XOR DI(663) XOR DI(748) XOR DI(885) XOR DI(744) XOR DI(280) XOR DI(612) XOR DI(438) XOR DI(482) XOR DI(811) XOR DI(724) XOR DI(401) XOR DI(884) XOR DI(247) XOR DI(605) XOR DI(502) XOR DI(463) XOR DI(68) XOR DI(319) XOR DI(908) XOR DI(820) XOR DI(958) XOR DI(544) XOR DI(135) XOR DI(106) XOR DI(410) XOR DI(467) XOR DI(709) XOR DI(893) XOR DI(172) XOR DI(925) XOR DI(664) XOR DI(256) XOR DI(29) XOR DI(614) XOR DI(397) XOR DI(863) XOR DI(659) XOR DI(939) XOR DI(354) XOR DI(194) XOR DI(940) XOR DI(851) XOR DI(511) XOR DI(927) XOR DI(1012) XOR DI(991) XOR DI(760) XOR DI(37) XOR DI(859) XOR DI(80) XOR DI(321) XOR DI(36) XOR DI(563) XOR DI(44) XOR DI(82) XOR DI(346) XOR DI(680) XOR DI(787) XOR DI(829) XOR DI(408) XOR DI(967) XOR DI(756) XOR DI(603) XOR DI(292) XOR DI(960) XOR DI(822) XOR DI(430) XOR DI(349) XOR DI(571) XOR DI(154) XOR DI(971) XOR DI(833) XOR DI(904) XOR DI(412) XOR DI(489) XOR DI(791) XOR DI(252) XOR DI(217) XOR DI(968) XOR DI(535) XOR DI(347) XOR DI(920) XOR DI(124) XOR DI(778) XOR DI(716) XOR DI(450) XOR DI(164) XOR DI(824) XOR DI(513) XOR DI(115) XOR DI(742) XOR DI(419) XOR DI(213) XOR DI(239) XOR DI(805) XOR DI(718) XOR DI(625) XOR DI(649) XOR DI(241) XOR DI(317) XOR DI(411) XOR DI(62) XOR DI(147) XOR DI(902) XOR DI(814) XOR DI(990) XOR DI(461) XOR DI(703) XOR DI(634) XOR DI(6) XOR DI(887) XOR DI(658) XOR DI(16) XOR DI(279) XOR DI(326) XOR DI(653) XOR DI(607) XOR DI(934) XOR DI(31) XOR DI(294) XOR DI(557) XOR DI(38) XOR DI(911) XOR DI(402) XOR DI(206) XOR DI(827) XOR DI(406) XOR DI(369) XOR DI(529) XOR DI(341) XOR DI(422) XOR DI(158) XOR DI(807) XOR DI(202) XOR DI(435) XOR DI(233) XOR DI(872) XOR DI(643) XOR DI(311) XOR DI(15) XOR DI(61) XOR DI(409) XOR DI(0) XOR DI(385) XOR DI(111) XOR DI(175) XOR DI(499) XOR DI(119) XOR DI(460) XOR DI(25) XOR DI(551) XOR DI(905) XOR DI(948) XOR DI(142) XOR DI(363) XOR DI(205) XOR DI(335) XOR DI(429) XOR DI(464) XOR DI(526) XOR DI(203) XOR DI(493) XOR DI(454) XOR DI(545) XOR DI(146) XOR DI(3) XOR DI(520) XOR DI(616) XOR DI(373) XOR DI(448) XOR DI(936) XOR DI(854) XOR DI(514) XOR DI(481) XOR DI(533) XOR DI(134) XOR DI(682) XOR DI(521) XOR DI(515) XOR DI(1009) XOR DI(1015) XOR DI(1021); + DO(18) <= DI(776) XOR DI(841) XOR DI(52) XOR DI(638) XOR DI(358) XOR DI(94) XOR DI(339) XOR DI(842) XOR DI(771) XOR DI(592) XOR DI(800) XOR DI(304) XOR DI(474) XOR DI(95) XOR DI(565) XOR DI(156) XOR DI(361) XOR DI(1007) XOR DI(780) XOR DI(250) XOR DI(243) XOR DI(913) XOR DI(845) XOR DI(567) XOR DI(1001) XOR DI(226) XOR DI(714) XOR DI(595) XOR DI(309) XOR DI(387) XOR DI(930) XOR DI(261) XOR DI(803) XOR DI(868) XOR DI(57) XOR DI(980) XOR DI(359) XOR DI(192) XOR DI(1017) XOR DI(900) XOR DI(696) XOR DI(781) XOR DI(816) XOR DI(225) XOR DI(881) XOR DI(847) XOR DI(637) XOR DI(191) XOR DI(33) XOR DI(690) XOR DI(802) XOR DI(931) XOR DI(594) XOR DI(951) XOR DI(199) XOR DI(432) XOR DI(981) XOR DI(287) XOR DI(945) XOR DI(360) XOR DI(697) XOR DI(857) XOR DI(517) XOR DI(484) XOR DI(1018) XOR DI(305) XOR DI(49) XOR DI(869) XOR DI(65) XOR DI(837) XOR DI(965) XOR DI(576) XOR DI(698) XOR DI(478) XOR DI(100) XOR DI(671) XOR DI(433) XOR DI(227) XOR DI(53) XOR DI(620) XOR DI(518) XOR DI(914) XOR DI(424) XOR DI(611) XOR DI(244) XOR DI(708) XOR DI(284) XOR DI(193) XOR DI(270) XOR DI(35) XOR DI(562) XOR DI(113) XOR DI(692) XOR DI(970) XOR DI(251) XOR DI(1004) XOR DI(777) XOR DI(440) XOR DI(475) XOR DI(804) XOR DI(394) XOR DI(20) XOR DI(901) XOR DI(325) XOR DI(166) XOR DI(137) XOR DI(826) XOR DI(340) XOR DI(201) XOR DI(232) XOR DI(642) XOR DI(310) XOR DI(60) XOR DI(627) XOR DI(384) XOR DI(498) XOR DI(667) XOR DI(947) XOR DI(362) XOR DI(453) XOR DI(127) XOR DI(1020) XOR DI(766) XOR DI(277) XOR DI(865) XOR DI(443) XOR DI(86) XOR DI(334) XOR DI(306) XOR DI(569) XOR DI(976) XOR DI(556) XOR DI(50) XOR DI(686) XOR DI(793) XOR DI(835) XOR DI(330) XOR DI(973) XOR DI(731) XOR DI(46) XOR DI(838) XOR DI(966) XOR DI(963) XOR DI(549) XOR DI(953) XOR DI(150) XOR DI(2) XOR DI(184) XOR DI(479) XOR DI(995) XOR DI(495) XOR DI(587) XOR DI(223) XOR DI(711) XOR DI(101) XOR DI(186) XOR DI(434) XOR DI(289) XOR DI(170) XOR DI(54) XOR DI(372) XOR DI(425) XOR DI(744) XOR DI(877) XOR DI(401) XOR DI(655) XOR DI(605) XOR DI(417) XOR DI(27) XOR DI(73) XOR DI(421) XOR DI(769) XOR DI(106) XOR DI(221) XOR DI(709) XOR DI(12) XOR DI(256) XOR DI(285) XOR DI(29) XOR DI(332) XOR DI(472) XOR DI(271) XOR DI(80) XOR DI(346) XOR DI(787) XOR DI(917) XOR DI(408) XOR DI(756) XOR DI(571) XOR DI(114) XOR DI(693) XOR DI(971) XOR DI(252) XOR DI(217) XOR DI(535) XOR DI(920) XOR DI(1005) XOR DI(428) XOR DI(778) XOR DI(747) XOR DI(716) XOR DI(450) XOR DI(164) XOR DI(742) XOR DI(476) XOR DI(805) XOR DI(599) XOR DI(317) XOR DI(21) XOR DI(902) XOR DI(538) XOR DI(889) XOR DI(658) XOR DI(279) XOR DI(391) XOR DI(326) XOR DI(117) XOR DI(607) XOR DI(505) XOR DI(265) XOR DI(294) XOR DI(597) XOR DI(167) XOR DI(341) XOR DI(807) XOR DI(818) XOR DI(507) XOR DI(202) XOR DI(268) XOR DI(643) XOR DI(235) XOR DI(311) XOR DI(15) XOR DI(61) XOR DI(628) XOR DI(0) XOR DI(652) XOR DI(273) XOR DI(385) XOR DI(647) XOR DI(499) XOR DI(460) XOR DI(551) XOR DI(668) XOR DI(948) XOR DI(142) XOR DI(363) XOR DI(152) XOR DI(196) XOR DI(526) XOR DI(379) XOR DI(454) XOR DI(662) XOR DI(458) XOR DI(616) XOR DI(936) XOR DI(854) XOR DI(134) XOR DI(682) XOR DI(1009) XOR DI(1021) XOR DI(998) XOR DI(585) XOR DI(767) XOR DI(774) XOR DI(44) XOR DI(278) XOR DI(866) XOR DI(586) XOR DI(444) XOR DI(300) XOR DI(378) XOR DI(832) XOR DI(328) XOR DI(43) XOR DI(795) XOR DI(307) XOR DI(853) XOR DI(353) XOR DI(687) XOR DI(794) XOR DI(924) XOR DI(331) XOR DI(763) XOR DI(732) XOR DI(104) XOR DI(299) XOR DI(560) XOR DI(753) XOR DI(829) XOR DI(550) XOR DI(954) XOR DI(437) XOR DI(151) XOR DI(636) XOR DI(356) XOR DI(578) XOR DI(702) XOR DI(121) XOR DI(447) XOR DI(161) XOR DI(219) XOR DI(603) XOR DI(238) XOR DI(493) XOR DI(64) XOR DI(631) XOR DI(3) XOR DI(185) XOR DI(105) XOR DI(366) XOR DI(480) XOR DI(911) XOR DI(529) XOR DI(382) XOR DI(172) XOR DI(925) XOR DI(224) XOR DI(302) XOR DI(6) XOR DI(975) XOR DI(354) XOR DI(187) XOR DI(765) XOR DI(895) XOR DI(298) XOR DI(561) XOR DI(215) XOR DI(122) XOR DI(664) XOR DI(749) XOR DI(886) XOR DI(745) XOR DI(281) XOR DI(613) XOR DI(439) XOR DI(483) XOR DI(812) XOR DI(725) XOR DI(402) XOR DI(885) XOR DI(248) XOR DI(606) XOR DI(503) XOR DI(464) XOR DI(69) XOR DI(320) XOR DI(909) XOR DI(821) XOR DI(959) XOR DI(545) XOR DI(136) XOR DI(107) XOR DI(411) XOR DI(468) XOR DI(710) XOR DI(894) XOR DI(173) XOR DI(926) XOR DI(665) XOR DI(257) XOR DI(30) XOR DI(615) XOR DI(398) XOR DI(864) XOR DI(660) XOR DI(940) XOR DI(355) XOR DI(195) XOR DI(941) XOR DI(852) XOR DI(512) XOR DI(928) XOR DI(1013) XOR DI(992) XOR DI(761) XOR DI(38) XOR DI(860) XOR DI(81) XOR DI(322) XOR DI(37) XOR DI(564) XOR DI(45) XOR DI(83) XOR DI(347) XOR DI(681) XOR DI(788) XOR DI(830) XOR DI(409) XOR DI(968) XOR DI(757) XOR DI(604) XOR DI(293) XOR DI(961) XOR DI(823) XOR DI(431) XOR DI(350) XOR DI(572) XOR DI(155) XOR DI(972) XOR DI(834) XOR DI(905) XOR DI(413) XOR DI(490) XOR DI(792) XOR DI(253) XOR DI(218) XOR DI(969) XOR DI(536) XOR DI(348) XOR DI(921) XOR DI(125) XOR DI(779) XOR DI(717) XOR DI(451) XOR DI(165) XOR DI(825) XOR DI(514) XOR DI(116) XOR DI(743) XOR DI(420) XOR DI(214) XOR DI(240) XOR DI(806) XOR DI(719) XOR DI(626) XOR DI(650) XOR DI(242) XOR DI(318) XOR DI(412) XOR DI(63) XOR DI(148) XOR DI(903) XOR DI(815) XOR DI(991) XOR DI(462) XOR DI(704) XOR DI(635) XOR DI(7) XOR DI(888) XOR DI(659) XOR DI(17) XOR DI(280) XOR DI(327) XOR DI(654) XOR DI(608) XOR DI(935) XOR DI(32) XOR DI(295) XOR DI(558) XOR DI(39) XOR DI(912) XOR DI(403) XOR DI(207) XOR DI(828) XOR DI(407) XOR DI(370) XOR DI(530) XOR DI(342) XOR DI(423) XOR DI(159) XOR DI(808) XOR DI(203) XOR DI(436) XOR DI(234) XOR DI(873) XOR DI(644) XOR DI(312) XOR DI(16) XOR DI(62) XOR DI(410) XOR DI(1) XOR DI(386) XOR DI(112) XOR DI(176) XOR DI(500) XOR DI(120) XOR DI(461) XOR DI(26) XOR DI(552) XOR DI(906) XOR DI(949) XOR DI(143) XOR DI(364) XOR DI(206) XOR DI(336) XOR DI(430) XOR DI(465) XOR DI(527) XOR DI(204) XOR DI(494) XOR DI(455) XOR DI(546) XOR DI(147) XOR DI(4) XOR DI(521) XOR DI(617) XOR DI(374) XOR DI(449) XOR DI(937) XOR DI(855) XOR DI(515) XOR DI(482) XOR DI(534) XOR DI(135) XOR DI(683) XOR DI(522) XOR DI(516) XOR DI(1010) XOR DI(1016) XOR DI(1022); + DO(19) <= DI(777) XOR DI(842) XOR DI(53) XOR DI(639) XOR DI(359) XOR DI(95) XOR DI(340) XOR DI(843) XOR DI(772) XOR DI(593) XOR DI(801) XOR DI(305) XOR DI(475) XOR DI(96) XOR DI(566) XOR DI(157) XOR DI(362) XOR DI(1008) XOR DI(781) XOR DI(251) XOR DI(244) XOR DI(914) XOR DI(846) XOR DI(568) XOR DI(1002) XOR DI(227) XOR DI(715) XOR DI(596) XOR DI(310) XOR DI(388) XOR DI(931) XOR DI(262) XOR DI(804) XOR DI(869) XOR DI(58) XOR DI(981) XOR DI(360) XOR DI(193) XOR DI(1018) XOR DI(901) XOR DI(697) XOR DI(782) XOR DI(817) XOR DI(226) XOR DI(882) XOR DI(848) XOR DI(638) XOR DI(192) XOR DI(34) XOR DI(691) XOR DI(803) XOR DI(932) XOR DI(595) XOR DI(952) XOR DI(200) XOR DI(433) XOR DI(982) XOR DI(288) XOR DI(946) XOR DI(361) XOR DI(698) XOR DI(858) XOR DI(518) XOR DI(485) XOR DI(1019) XOR DI(306) XOR DI(50) XOR DI(870) XOR DI(66) XOR DI(838) XOR DI(966) XOR DI(577) XOR DI(699) XOR DI(479) XOR DI(101) XOR DI(672) XOR DI(434) XOR DI(228) XOR DI(54) XOR DI(621) XOR DI(519) XOR DI(915) XOR DI(425) XOR DI(612) XOR DI(245) XOR DI(709) XOR DI(285) XOR DI(194) XOR DI(271) XOR DI(36) XOR DI(563) XOR DI(114) XOR DI(693) XOR DI(971) XOR DI(252) XOR DI(1005) XOR DI(778) XOR DI(441) XOR DI(476) XOR DI(805) XOR DI(395) XOR DI(21) XOR DI(902) XOR DI(326) XOR DI(167) XOR DI(138) XOR DI(827) XOR DI(341) XOR DI(202) XOR DI(233) XOR DI(643) XOR DI(311) XOR DI(61) XOR DI(628) XOR DI(0) XOR DI(385) XOR DI(499) XOR DI(668) XOR DI(948) XOR DI(363) XOR DI(454) XOR DI(128) XOR DI(1021) XOR DI(767) XOR DI(278) XOR DI(866) XOR DI(444) XOR DI(87) XOR DI(335) XOR DI(307) XOR DI(570) XOR DI(977) XOR DI(557) XOR DI(51) XOR DI(687) XOR DI(794) XOR DI(836) XOR DI(331) XOR DI(974) XOR DI(732) XOR DI(47) XOR DI(839) XOR DI(967) XOR DI(964) XOR DI(550) XOR DI(954) XOR DI(151) XOR DI(3) XOR DI(185) XOR DI(480) XOR DI(996) XOR DI(496) XOR DI(588) XOR DI(224) XOR DI(712) XOR DI(102) XOR DI(187) XOR DI(435) XOR DI(290) XOR DI(171) XOR DI(55) XOR DI(373) XOR DI(426) XOR DI(745) XOR DI(878) XOR DI(402) XOR DI(656) XOR DI(606) XOR DI(418) XOR DI(28) XOR DI(74) XOR DI(422) XOR DI(770) XOR DI(107) XOR DI(222) XOR DI(710) XOR DI(13) XOR DI(257) XOR DI(286) XOR DI(30) XOR DI(333) XOR DI(473) XOR DI(272) XOR DI(81) XOR DI(347) XOR DI(788) XOR DI(918) XOR DI(409) XOR DI(757) XOR DI(572) XOR DI(115) XOR DI(694) XOR DI(972) XOR DI(253) XOR DI(218) XOR DI(536) XOR DI(921) XOR DI(1006) XOR DI(429) XOR DI(779) XOR DI(748) XOR DI(717) XOR DI(451) XOR DI(165) XOR DI(743) XOR DI(477) XOR DI(806) XOR DI(600) XOR DI(318) XOR DI(22) XOR DI(903) XOR DI(539) XOR DI(890) XOR DI(659) XOR DI(280) XOR DI(392) XOR DI(327) XOR DI(118) XOR DI(608) XOR DI(506) XOR DI(266) XOR DI(295) XOR DI(598) XOR DI(168) XOR DI(342) XOR DI(808) XOR DI(819) XOR DI(508) XOR DI(203) XOR DI(269) XOR DI(644) XOR DI(236) XOR DI(312) XOR DI(16) XOR DI(62) XOR DI(629) XOR DI(1) XOR DI(653) XOR DI(274) XOR DI(386) XOR DI(648) XOR DI(500) XOR DI(461) XOR DI(552) XOR DI(669) XOR DI(949) XOR DI(143) XOR DI(364) XOR DI(153) XOR DI(197) XOR DI(527) XOR DI(380) XOR DI(455) XOR DI(663) XOR DI(459) XOR DI(617) XOR DI(937) XOR DI(855) XOR DI(135) XOR DI(683) XOR DI(1010) XOR DI(1022) XOR DI(999) XOR DI(586) XOR DI(768) XOR DI(775) XOR DI(45) XOR DI(279) XOR DI(867) XOR DI(587) XOR DI(445) XOR DI(301) XOR DI(379) XOR DI(833) XOR DI(329) XOR DI(44) XOR DI(796) XOR DI(308) XOR DI(854) XOR DI(354) XOR DI(688) XOR DI(795) XOR DI(925) XOR DI(332) XOR DI(764) XOR DI(733) XOR DI(105) XOR DI(300) XOR DI(561) XOR DI(754) XOR DI(830) XOR DI(551) XOR DI(955) XOR DI(438) XOR DI(152) XOR DI(637) XOR DI(357) XOR DI(579) XOR DI(703) XOR DI(122) XOR DI(448) XOR DI(162) XOR DI(220) XOR DI(604) XOR DI(239) XOR DI(494) XOR DI(65) XOR DI(632) XOR DI(4) XOR DI(186) XOR DI(106) XOR DI(367) XOR DI(481) XOR DI(912) XOR DI(530) XOR DI(383) XOR DI(173) XOR DI(926) XOR DI(225) XOR DI(303) XOR DI(7) XOR DI(976) XOR DI(355) XOR DI(188) XOR DI(766) XOR DI(896) XOR DI(299) XOR DI(562) XOR DI(216) XOR DI(123) XOR DI(665) XOR DI(750) XOR DI(887) XOR DI(746) XOR DI(282) XOR DI(614) XOR DI(440) XOR DI(484) XOR DI(813) XOR DI(726) XOR DI(403) XOR DI(886) XOR DI(249) XOR DI(607) XOR DI(504) XOR DI(465) XOR DI(70) XOR DI(321) XOR DI(910) XOR DI(822) XOR DI(960) XOR DI(546) XOR DI(137) XOR DI(108) XOR DI(412) XOR DI(469) XOR DI(711) XOR DI(895) XOR DI(174) XOR DI(927) XOR DI(666) XOR DI(258) XOR DI(31) XOR DI(616) XOR DI(399) XOR DI(865) XOR DI(661) XOR DI(941) XOR DI(356) XOR DI(196) XOR DI(942) XOR DI(853) XOR DI(513) XOR DI(929) XOR DI(1014) XOR DI(993) XOR DI(762) XOR DI(39) XOR DI(861) XOR DI(82) XOR DI(323) XOR DI(38) XOR DI(565) XOR DI(46) XOR DI(84) XOR DI(348) XOR DI(682) XOR DI(789) XOR DI(831) XOR DI(410) XOR DI(969) XOR DI(758) XOR DI(605) XOR DI(294) XOR DI(962) XOR DI(824) XOR DI(432) XOR DI(351) XOR DI(573) XOR DI(156) XOR DI(973) XOR DI(835) XOR DI(906) XOR DI(414) XOR DI(491) XOR DI(793) XOR DI(254) XOR DI(219) XOR DI(970) XOR DI(537) XOR DI(349) XOR DI(922) XOR DI(126) XOR DI(780) XOR DI(718) XOR DI(452) XOR DI(166) XOR DI(826) XOR DI(515) XOR DI(117) XOR DI(744) XOR DI(421) XOR DI(215) XOR DI(241) XOR DI(807) XOR DI(720) XOR DI(627) XOR DI(651) XOR DI(243) XOR DI(319) XOR DI(413) XOR DI(64) XOR DI(149) XOR DI(904) XOR DI(816) XOR DI(992) XOR DI(463) XOR DI(705) XOR DI(636) XOR DI(8) XOR DI(889) XOR DI(660) XOR DI(18) XOR DI(281) XOR DI(328) XOR DI(655) XOR DI(609) XOR DI(936) XOR DI(33) XOR DI(296) XOR DI(559) XOR DI(40) XOR DI(913) XOR DI(404) XOR DI(208) XOR DI(829) XOR DI(408) XOR DI(371) XOR DI(531) XOR DI(343) XOR DI(424) XOR DI(160) XOR DI(809) XOR DI(204) XOR DI(437) XOR DI(235) XOR DI(874) XOR DI(645) XOR DI(313) XOR DI(17) XOR DI(63) XOR DI(411) XOR DI(2) XOR DI(387) XOR DI(113) XOR DI(177) XOR DI(501) XOR DI(121) XOR DI(462) XOR DI(27) XOR DI(553) XOR DI(907) XOR DI(950) XOR DI(144) XOR DI(365) XOR DI(207) XOR DI(337) XOR DI(431) XOR DI(466) XOR DI(528) XOR DI(205) XOR DI(495) XOR DI(456) XOR DI(547) XOR DI(148) XOR DI(5) XOR DI(522) XOR DI(618) XOR DI(375) XOR DI(450) XOR DI(938) XOR DI(856) XOR DI(516) XOR DI(483) XOR DI(535) XOR DI(136) XOR DI(684) XOR DI(523) XOR DI(517) XOR DI(1011) XOR DI(1017) XOR DI(1023); + DO(20) <= DI(778) XOR DI(93) XOR DI(591) XOR DI(843) XOR DI(842) XOR DI(54) XOR DI(640) XOR DI(360) XOR DI(96) XOR DI(341) XOR DI(844) XOR DI(773) XOR DI(800) XOR DI(594) XOR DI(802) XOR DI(306) XOR DI(476) XOR DI(97) XOR DI(50) XOR DI(881) XOR DI(787) XOR DI(738) XOR DI(57) XOR DI(980) XOR DI(359) XOR DI(945) XOR DI(863) XOR DI(567) XOR DI(760) XOR DI(158) XOR DI(643) XOR DI(697) XOR DI(0) XOR DI(363) XOR DI(709) XOR DI(128) XOR DI(1009) XOR DI(782) XOR DI(252) XOR DI(245) XOR DI(317) XOR DI(395) XOR DI(192) XOR DI(80) XOR DI(915) XOR DI(847) XOR DI(569) XOR DI(691) XOR DI(987) XOR DI(1003) XOR DI(228) XOR DI(716) XOR DI(597) XOR DI(311) XOR DI(277) XOR DI(389) XOR DI(932) XOR DI(263) XOR DI(805) XOR DI(200) XOR DI(870) XOR DI(233) XOR DI(59) XOR DI(982) XOR DI(271) XOR DI(361) XOR DI(194) XOR DI(479) XOR DI(1019) XOR DI(772) XOR DI(902) XOR DI(326) XOR DI(305) XOR DI(86) XOR DI(869) XOR DI(952) XOR DI(576) XOR DI(698) XOR DI(838) XOR DI(262) XOR DI(671) XOR DI(756) XOR DI(783) XOR DI(288) XOR DI(818) XOR DI(227) XOR DI(53) XOR DI(620) XOR DI(883) XOR DI(849) XOR DI(639) XOR DI(892) XOR DI(284) XOR DI(658) XOR DI(193) XOR DI(612) XOR DI(499) XOR DI(76) XOR DI(858) XOR DI(35) XOR DI(966) XOR DI(602) XOR DI(692) XOR DI(715) XOR DI(741) XOR DI(475) XOR DI(804) XOR DI(20) XOR DI(901) XOR DI(933) XOR DI(556) XOR DI(401) XOR DI(596) XOR DI(953) XOR DI(201) XOR DI(434) XOR DI(983) XOR DI(289) XOR DI(947) XOR DI(362) XOR DI(699) XOR DI(859) XOR DI(519) XOR DI(486) XOR DI(1008) XOR DI(1020) XOR DI(444) XOR DI(378) XOR DI(335) XOR DI(307) XOR DI(51) XOR DI(687) XOR DI(871) XOR DI(91) XOR DI(67) XOR DI(331) XOR DI(732) XOR DI(104) XOR DI(190) XOR DI(839) XOR DI(967) XOR DI(964) XOR DI(151) XOR DI(578) XOR DI(700) XOR DI(185) XOR DI(480) XOR DI(996) XOR DI(382) XOR DI(798) XOR DI(224) XOR DI(634) XOR DI(102) XOR DI(131) XOR DI(673) XOR DI(435) XOR DI(369) XOR DI(171) XOR DI(229) XOR DI(55) XOR DI(622) XOR DI(520) XOR DI(916) XOR DI(426) XOR DI(613) XOR DI(246) XOR DI(812) XOR DI(248) XOR DI(418) XOR DI(503) XOR DI(74) XOR DI(959) XOR DI(545) XOR DI(222) XOR DI(710) XOR DI(13) XOR DI(257) XOR DI(286) XOR DI(30) XOR DI(398) XOR DI(195) XOR DI(473) XOR DI(680) XOR DI(272) XOR DI(37) XOR DI(564) XOR DI(918) XOR DI(293) XOR DI(572) XOR DI(115) XOR DI(694) XOR DI(972) XOR DI(990) XOR DI(490) XOR DI(253) XOR DI(218) XOR DI(921) XOR DI(1006) XOR DI(429) XOR DI(779) XOR DI(748) XOR DI(165) XOR DI(442) XOR DI(730) XOR DI(231) XOR DI(477) XOR DI(806) XOR DI(396) XOR DI(626) XOR DI(650) XOR DI(600) XOR DI(22) XOR DI(903) XOR DI(392) XOR DI(327) XOR DI(182) XOR DI(506) XOR DI(266) XOR DI(168) XOR DI(139) XOR DI(828) XOR DI(899) XOR DI(407) XOR DI(342) XOR DI(508) XOR DI(203) XOR DI(269) XOR DI(234) XOR DI(873) XOR DI(644) XOR DI(312) XOR DI(16) XOR DI(62) XOR DI(722) XOR DI(629) XOR DI(1) XOR DI(274) XOR DI(386) XOR DI(648) XOR DI(176) XOR DI(500) XOR DI(461) XOR DI(26) XOR DI(669) XOR DI(949) XOR DI(143) XOR DI(364) XOR DI(707) XOR DI(455) XOR DI(459) XOR DI(141) XOR DI(135) XOR DI(129) XOR DI(677) XOR DI(510) XOR DI(1022) XOR DI(575) XOR DI(268) XOR DI(999) XOR DI(768) XOR DI(279) XOR DI(867) XOR DI(445) XOR DI(88) XOR DI(336) XOR DI(833) XOR DI(44) XOR DI(308) XOR DI(184) XOR DI(571) XOR DI(978) XOR DI(558) XOR DI(52) XOR DI(89) XOR DI(49) XOR DI(170) XOR DI(90) XOR DI(354) XOR DI(688) XOR DI(795) XOR DI(925) XOR DI(837) XOR DI(332) XOR DI(975) XOR DI(733) XOR DI(48) XOR DI(840) XOR DI(995) XOR DI(968) XOR DI(965) XOR DI(551) XOR DI(958) XOR DI(955) XOR DI(152) XOR DI(703) XOR DI(736) XOR DI(239) XOR DI(494) XOR DI(632) XOR DI(4) XOR DI(186) XOR DI(979) XOR DI(841) XOR DI(481) XOR DI(997) XOR DI(420) XOR DI(530) XOR DI(173) XOR DI(497) XOR DI(589) XOR DI(225) XOR DI(303) XOR DI(976) XOR DI(713) XOR DI(103) XOR DI(543) XOR DI(940) XOR DI(188) XOR DI(436) XOR DI(299) XOR DI(724) XOR DI(291) XOR DI(172) XOR DI(821) XOR DI(542) XOR DI(56) XOR DI(374) XOR DI(665) XOR DI(750) XOR DI(427) XOR DI(746) XOR DI(533) XOR DI(512) XOR DI(737) XOR DI(212) XOR DI(238) XOR DI(728) XOR DI(879) XOR DI(726) XOR DI(403) XOR DI(657) XOR DI(15) XOR DI(607) XOR DI(419) XOR DI(493) XOR DI(70) XOR DI(852) XOR DI(29) XOR DI(155) XOR DI(75) XOR DI(910) XOR DI(822) XOR DI(423) XOR DI(147) XOR DI(686) XOR DI(998) XOR DI(771) XOR DI(108) XOR DI(223) XOR DI(469) XOR DI(711) XOR DI(14) XOR DI(24) XOR DI(258) XOR DI(287) XOR DI(31) XOR DI(590) XOR DI(616) XOR DI(334) XOR DI(428) XOR DI(544) XOR DI(941) XOR DI(125) XOR DI(853) XOR DI(513) XOR DI(929) XOR DI(133) XOR DI(474) XOR DI(1014) XOR DI(273) XOR DI(82) XOR DI(323) XOR DI(43) XOR DI(164) XOR DI(348) XOR DI(682) XOR DI(789) XOR DI(919) XOR DI(410) XOR DI(969) XOR DI(758) XOR DI(42) XOR DI(146) XOR DI(631) XOR DI(351) XOR DI(573) XOR DI(116) XOR DI(156) XOR DI(214) XOR DI(695) XOR DI(973) XOR DI(679) XOR DI(906) XOR DI(920) XOR DI(254) XOR DI(219) XOR DI(537) XOR DI(922) XOR DI(126) XOR DI(1007) XOR DI(430) XOR DI(780) XOR DI(749) XOR DI(718) XOR DI(452) XOR DI(166) XOR DI(815) XOR DI(826) XOR DI(210) XOR DI(117) XOR DI(744) XOR DI(421) XOR DI(276) XOR DI(215) XOR DI(478) XOR DI(807) XOR DI(880) XOR DI(601) XOR DI(319) XOR DI(498) XOR DI(23) XOR DI(69) XOR DI(904) XOR DI(816) XOR DI(540) XOR DI(417) XOR DI(891) XOR DI(992) XOR DI(729) XOR DI(705) XOR DI(636) XOR DI(889) XOR DI(660) XOR DI(281) XOR DI(25) XOR DI(393) XOR DI(328) XOR DI(655) XOR DI(119) XOR DI(609) XOR DI(507) XOR DI(468) XOR DI(675) XOR DI(267) XOR DI(296) XOR DI(559) XOR DI(676) XOR DI(599) XOR DI(169) XOR DI(625) XOR DI(371) XOR DI(213) XOR DI(343) XOR DI(120) XOR DI(424) XOR DI(809) XOR DI(820) XOR DI(509) XOR DI(204) XOR DI(270) XOR DI(437) XOR DI(725) XOR DI(714) XOR DI(645) XOR DI(237) XOR DI(313) XOR DI(17) XOR DI(63) XOR DI(898) XOR DI(534) XOR DI(211) XOR DI(630) XOR DI(2) XOR DI(654) XOR DI(12) XOR DI(275) XOR DI(387) XOR DI(292) XOR DI(649) XOR DI(501) XOR DI(121) XOR DI(462) XOR DI(261) XOR DI(553) XOR DI(670) XOR DI(957) XOR DI(950) XOR DI(134) XOR DI(144) XOR DI(365) XOR DI(337) XOR DI(154) XOR DI(198) XOR DI(431) XOR DI(528) XOR DI(394) XOR DI(624) XOR DI(381) XOR DI(316) XOR DI(456) XOR DI(664) XOR DI(148) XOR DI(460) XOR DI(702) XOR DI(522) XOR DI(199) XOR DI(618) XOR DI(375) XOR DI(489) XOR DI(450) XOR DI(541) XOR DI(938) XOR DI(696) XOR DI(856) XOR DI(535) XOR DI(136) XOR DI(690) XOR DI(684) XOR DI(1011) XOR DI(1023); + DO(21) <= DI(93) XOR DI(776) XOR DI(779) XOR DI(638) XOR DI(94) XOR DI(798) XOR DI(592) XOR DI(800) XOR DI(767) XOR DI(844) XOR DI(843) XOR DI(55) XOR DI(943) XOR DI(580) XOR DI(439) XOR DI(641) XOR DI(361) XOR DI(707) XOR DI(97) XOR DI(250) XOR DI(873) XOR DI(190) XOR DI(342) XOR DI(845) XOR DI(248) XOR DI(774) XOR DI(801) XOR DI(595) XOR DI(803) XOR DI(231) XOR DI(307) XOR DI(107) XOR DI(359) XOR DI(192) XOR DI(477) XOR DI(566) XOR DI(176) XOR DI(836) XOR DI(98) XOR DI(51) XOR DI(882) XOR DI(444) XOR DI(242) XOR DI(74) XOR DI(34) XOR DI(964) XOR DI(788) XOR DI(739) XOR DI(473) XOR DI(875) XOR DI(58) XOR DI(981) XOR DI(945) XOR DI(360) XOR DI(946) XOR DI(524) XOR DI(1018) XOR DI(765) XOR DI(864) XOR DI(305) XOR DI(568) XOR DI(869) XOR DI(761) XOR DI(178) XOR DI(548) XOR DI(952) XOR DI(159) XOR DI(644) XOR DI(698) XOR DI(1) XOR DI(364) XOR DI(380) XOR DI(257) XOR DI(222) XOR DI(710) XOR DI(129) XOR DI(1010) XOR DI(763) XOR DI(433) XOR DI(783) XOR DI(620) XOR DI(518) XOR DI(914) XOR DI(253) XOR DI(244) XOR DI(246) XOR DI(318) XOR DI(732) XOR DI(284) XOR DI(28) XOR DI(396) XOR DI(331) XOR DI(193) XOR DI(858) XOR DI(81) XOR DI(916) XOR DI(407) XOR DI(848) XOR DI(570) XOR DI(485) XOR DI(692) XOR DI(988) XOR DI(1004) XOR DI(741) XOR DI(229) XOR DI(717) XOR DI(648) XOR DI(598) XOR DI(312) XOR DI(20) XOR DI(901) XOR DI(278) XOR DI(390) XOR DI(295) XOR DI(606) XOR DI(933) XOR DI(264) XOR DI(405) XOR DI(806) XOR DI(506) XOR DI(201) XOR DI(871) XOR DI(234) XOR DI(60) XOR DI(983) XOR DI(272) XOR DI(384) XOR DI(459) XOR DI(667) XOR DI(141) XOR DI(362) XOR DI(151) XOR DI(195) XOR DI(378) XOR DI(480) XOR DI(1020) XOR DI(266) XOR DI(773) XOR DI(903) XOR DI(86) XOR DI(327) XOR DI(794) XOR DI(306) XOR DI(182) XOR DI(556) XOR DI(87) XOR DI(937) XOR DI(47) XOR DI(870) XOR DI(66) XOR DI(855) XOR DI(953) XOR DI(577) XOR DI(218) XOR DI(699) XOR DI(839) XOR DI(263) XOR DI(672) XOR DI(757) XOR DI(784) XOR DI(722) XOR DI(289) XOR DI(819) XOR DI(228) XOR DI(54) XOR DI(621) XOR DI(748) XOR DI(612) XOR DI(236) XOR DI(401) XOR DI(884) XOR DI(850) XOR DI(908) XOR DI(709) XOR DI(640) XOR DI(893) XOR DI(285) XOR DI(588) XOR DI(863) XOR DI(659) XOR DI(143) XOR DI(194) XOR DI(613) XOR DI(131) XOR DI(500) XOR DI(760) XOR DI(77) XOR DI(859) XOR DI(80) XOR DI(36) XOR DI(563) XOR DI(787) XOR DI(967) XOR DI(756) XOR DI(603) XOR DI(987) XOR DI(114) XOR DI(693) XOR DI(971) XOR DI(918) XOR DI(716) XOR DI(742) XOR DI(441) XOR DI(476) XOR DI(805) XOR DI(496) XOR DI(21) XOR DI(902) XOR DI(415) XOR DI(990) XOR DI(634) XOR DI(6) XOR DI(326) XOR DI(934) XOR DI(557) XOR DI(402) XOR DI(961) XOR DI(597) XOR DI(954) XOR DI(138) XOR DI(206) XOR DI(369) XOR DI(202) XOR DI(435) XOR DI(233) XOR DI(643) XOR DI(409) XOR DI(984) XOR DI(398) XOR DI(628) XOR DI(0) XOR DI(652) XOR DI(290) XOR DI(948) XOR DI(161) XOR DI(363) XOR DI(812) XOR DI(464) XOR DI(866) XOR DI(9) XOR DI(392) XOR DI(662) XOR DI(700) XOR DI(860) XOR DI(520) XOR DI(197) XOR DI(487) XOR DI(128) XOR DI(503) XOR DI(1009) XOR DI(1021) XOR DI(575) XOR DI(41) XOR DI(85) XOR DI(587) XOR DI(445) XOR DI(301) XOR DI(379) XOR DI(336) XOR DI(833) XOR DI(994) XOR DI(308) XOR DI(184) XOR DI(52) XOR DI(354) XOR DI(688) XOR DI(872) XOR DI(92) XOR DI(925) XOR DI(68) XOR DI(332) XOR DI(733) XOR DI(105) XOR DI(191) XOR DI(840) XOR DI(467) XOR DI(995) XOR DI(968) XOR DI(965) XOR DI(830) XOR DI(152) XOR DI(357) XOR DI(579) XOR DI(736) XOR DI(65) XOR DI(701) XOR DI(186) XOR DI(106) XOR DI(481) XOR DI(997) XOR DI(797) XOR DI(530) XOR DI(383) XOR DI(799) XOR DI(225) XOR DI(635) XOR DI(303) XOR DI(103) XOR DI(940) XOR DI(928) XOR DI(132) XOR DI(674) XOR DI(896) XOR DI(436) XOR DI(370) XOR DI(299) XOR DI(562) XOR DI(755) XOR DI(724) XOR DI(172) XOR DI(230) XOR DI(56) XOR DI(623) XOR DI(832) XOR DI(358) XOR DI(521) XOR DI(917) XOR DI(123) XOR DI(887) XOR DI(427) XOR DI(449) XOR DI(533) XOR DI(221) XOR DI(614) XOR DI(512) XOR DI(247) XOR DI(728) XOR DI(484) XOR DI(813) XOR DI(888) XOR DI(249) XOR DI(419) XOR DI(504) XOR DI(493) XOR DI(852) XOR DI(75) XOR DI(910) XOR DI(960) XOR DI(546) XOR DI(686) XOR DI(897) XOR DI(412) XOR DI(223) XOR DI(711) XOR DI(14) XOR DI(927) XOR DI(258) XOR DI(287) XOR DI(31) XOR DI(616) XOR DI(399) XOR DI(283) XOR DI(125) XOR DI(356) XOR DI(196) XOR DI(615) XOR DI(532) XOR DI(929) XOR DI(133) XOR DI(474) XOR DI(681) XOR DI(1014) XOR DI(39) XOR DI(273) XOR DI(330) XOR DI(323) XOR DI(38) XOR DI(302) XOR DI(565) XOR DI(46) XOR DI(164) XOR DI(682) XOR DI(919) XOR DI(831) XOR DI(605) XOR DI(42) XOR DI(294) XOR DI(175) XOR DI(146) XOR DI(351) XOR DI(573) XOR DI(116) XOR DI(695) XOR DI(973) XOR DI(679) XOR DI(906) XOR DI(991) XOR DI(414) XOR DI(491) XOR DI(254) XOR DI(219) XOR DI(922) XOR DI(1007) XOR DI(430) XOR DI(780) XOR DI(749) XOR DI(166) XOR DI(815) XOR DI(826) XOR DI(368) XOR DI(210) XOR DI(443) XOR DI(731) XOR DI(232) XOR DI(478) XOR DI(807) XOR DI(397) XOR DI(627) XOR DI(651) XOR DI(601) XOR DI(413) XOR DI(23) XOR DI(69) XOR DI(904) XOR DI(417) XOR DI(992) XOR DI(217) XOR DI(705) XOR DI(636) XOR DI(8) XOR DI(889) XOR DI(393) XOR DI(328) XOR DI(350) XOR DI(183) XOR DI(507) XOR DI(468) XOR DI(675) XOR DI(267) XOR DI(40) XOR DI(913) XOR DI(825) XOR DI(963) XOR DI(721) XOR DI(169) XOR DI(140) XOR DI(150) XOR DI(208) XOR DI(829) XOR DI(900) XOR DI(408) XOR DI(371) XOR DI(343) XOR DI(509) XOR DI(204) XOR DI(270) XOR DI(209) XOR DI(235) XOR DI(874) XOR DI(645) XOR DI(313) XOR DI(492) XOR DI(17) XOR DI(63) XOR DI(898) XOR DI(723) XOR DI(400) XOR DI(630) XOR DI(2) XOR DI(12) XOR DI(275) XOR DI(19) XOR DI(387) XOR DI(322) XOR DI(649) XOR DI(177) XOR DI(501) XOR DI(462) XOR DI(27) XOR DI(261) XOR DI(670) XOR DI(957) XOR DI(950) XOR DI(163) XOR DI(144) XOR DI(365) XOR DI(814) XOR DI(466) XOR DI(708) XOR DI(624) XOR DI(316) XOR DI(456) XOR DI(547) XOR DI(460) XOR DI(702) XOR DI(862) XOR DI(522) XOR DI(489) XOR DI(450) XOR DI(142) XOR DI(516) XOR DI(136) XOR DI(690) XOR DI(130) XOR DI(124) XOR DI(678) XOR DI(517) XOR DI(511) XOR DI(505) XOR DI(1023); + DO(22) <= DI(562) XOR DI(94) XOR DI(777) XOR DI(780) XOR DI(980) XOR DI(842) XOR DI(590) XOR DI(1014) XOR DI(639) XOR DI(95) XOR DI(999) XOR DI(772) XOR DI(799) XOR DI(593) XOR DI(591) XOR DI(801) XOR DI(305) XOR DI(768) XOR DI(667) XOR DI(49) XOR DI(880) XOR DI(845) XOR DI(844) XOR DI(1000) XOR DI(56) XOR DI(979) XOR DI(944) XOR DI(581) XOR DI(862) XOR DI(440) XOR DI(790) XOR DI(970) XOR DI(759) XOR DI(157) XOR DI(642) XOR DI(362) XOR DI(708) XOR DI(98) XOR DI(127) XOR DI(453) XOR DI(251) XOR DI(741) XOR DI(874) XOR DI(881) XOR DI(244) XOR DI(316) XOR DI(191) XOR DI(343) XOR DI(846) XOR DI(690) XOR DI(249) XOR DI(775) XOR DI(802) XOR DI(715) XOR DI(596) XOR DI(338) XOR DI(804) XOR DI(199) XOR DI(869) XOR DI(232) XOR DI(308) XOR DI(108) XOR DI(945) XOR DI(360) XOR DI(193) XOR DI(478) XOR DI(1018) XOR DI(567) XOR DI(85) XOR DI(868) XOR DI(177) XOR DI(575) XOR DI(697) XOR DI(837) XOR DI(261) XOR DI(99) XOR DI(755) XOR DI(892) XOR DI(432) XOR DI(751) XOR DI(817) XOR DI(52) XOR DI(619) XOR DI(913) XOR DI(661) XOR DI(883) XOR DI(445) XOR DI(243) XOR DI(638) XOR DI(283) XOR DI(424) XOR DI(498) XOR DI(75) XOR DI(35) XOR DI(857) XOR DI(34) XOR DI(965) XOR DI(484) XOR DI(789) XOR DI(776) XOR DI(714) XOR DI(740) XOR DI(474) XOR DI(876) XOR DI(19) XOR DI(65) XOR DI(952) XOR DI(156) XOR DI(200) XOR DI(433) XOR DI(59) XOR DI(982) XOR DI(8) XOR DI(109) XOR DI(666) XOR DI(946) XOR DI(361) XOR DI(524) XOR DI(620) XOR DI(947) XOR DI(858) XOR DI(525) XOR DI(1019) XOR DI(766) XOR DI(277) XOR DI(865) XOR DI(306) XOR DI(569) XOR DI(976) XOR DI(556) XOR DI(50) XOR DI(686) XOR DI(870) XOR DI(90) XOR DI(330) XOR DI(762) XOR DI(46) XOR DI(189) XOR DI(838) XOR DI(559) XOR DI(963) XOR DI(179) XOR DI(549) XOR DI(953) XOR DI(150) XOR DI(160) XOR DI(645) XOR DI(699) XOR DI(2) XOR DI(365) XOR DI(910) XOR DI(381) XOR DI(495) XOR DI(587) XOR DI(797) XOR DI(258) XOR DI(223) XOR DI(633) XOR DI(5) XOR DI(711) XOR DI(130) XOR DI(1011) XOR DI(764) XOR DI(434) XOR DI(368) XOR DI(784) XOR DI(621) XOR DI(519) XOR DI(915) XOR DI(254) XOR DI(425) XOR DI(612) XOR DI(245) XOR DI(438) XOR DI(655) XOR DI(247) XOR DI(605) XOR DI(417) XOR DI(319) XOR DI(544) XOR DI(421) XOR DI(769) XOR DI(733) XOR DI(221) XOR DI(12) XOR DI(285) XOR DI(29) XOR DI(397) XOR DI(332) XOR DI(194) XOR DI(760) XOR DI(859) XOR DI(80) XOR DI(82) XOR DI(787) XOR DI(917) XOR DI(408) XOR DI(292) XOR DI(987) XOR DI(849) XOR DI(822) XOR DI(571) XOR DI(114) XOR DI(486) XOR DI(693) XOR DI(971) XOR DI(989) XOR DI(375) XOR DI(489) XOR DI(217) XOR DI(535) XOR DI(1005) XOR DI(747) XOR DI(742) XOR DI(738) XOR DI(441) XOR DI(239) XOR DI(230) XOR DI(718) XOR DI(395) XOR DI(649) XOR DI(599) XOR DI(313) XOR DI(21) XOR DI(902) XOR DI(538) XOR DI(404) XOR DI(658) XOR DI(279) XOR DI(391) XOR DI(326) XOR DI(296) XOR DI(607) XOR DI(934) XOR DI(71) XOR DI(265) XOR DI(138) XOR DI(406) XOR DI(807) XOR DI(507) XOR DI(202) XOR DI(470) XOR DI(872) XOR DI(643) XOR DI(235) XOR DI(61) XOR DI(984) XOR DI(721) XOR DI(0) XOR DI(273) XOR DI(385) XOR DI(175) XOR DI(499) XOR DI(460) XOR DI(25) XOR DI(668) XOR DI(142) XOR DI(363) XOR DI(152) XOR DI(196) XOR DI(379) XOR DI(662) XOR DI(942) XOR DI(854) XOR DI(481) XOR DI(128) XOR DI(1021) XOR DI(267) XOR DI(767) XOR DI(774) XOR DI(904) XOR DI(44) XOR DI(866) XOR DI(705) XOR DI(87) XOR DI(378) XOR DI(335) XOR DI(328) XOR DI(795) XOR DI(307) XOR DI(183) XOR DI(977) XOR DI(557) XOR DI(88) XOR DI(938) XOR DI(48) XOR DI(89) XOR DI(871) XOR DI(91) XOR DI(794) XOR DI(836) XOR DI(67) XOR DI(763) XOR DI(610) XOR DI(190) XOR DI(299) XOR DI(466) XOR DI(994) XOR DI(856) XOR DI(560) XOR DI(957) XOR DI(954) XOR DI(356) XOR DI(578) XOR DI(121) XOR DI(161) XOR DI(219) XOR DI(238) XOR DI(700) XOR DI(908) XOR DI(840) XOR DI(796) XOR DI(529) XOR DI(382) XOR DI(925) XOR DI(496) XOR DI(634) XOR DI(6) XOR DI(264) XOR DI(542) XOR DI(939) XOR DI(354) XOR DI(927) XOR DI(673) XOR DI(1012) XOR DI(758) XOR DI(765) XOR DI(785) XOR DI(723) XOR DI(290) XOR DI(171) XOR DI(820) XOR DI(541) XOR DI(229) XOR DI(55) XOR DI(622) XOR DI(215) XOR DI(122) XOR DI(749) XOR DI(745) XOR DI(532) XOR DI(613) XOR DI(736) XOR DI(439) XOR DI(237) XOR DI(727) XOR DI(812) XOR DI(887) XOR DI(402) XOR DI(632) XOR DI(885) XOR DI(656) XOR DI(503) XOR DI(464) XOR DI(851) XOR DI(320) XOR DI(74) XOR DI(909) XOR DI(821) XOR DI(959) XOR DI(545) XOR DI(422) XOR DI(146) XOR DI(685) XOR DI(896) XOR DI(411) XOR DI(710) XOR DI(641) XOR DI(894) XOR DI(665) XOR DI(257) XOR DI(286) XOR DI(30) XOR DI(589) XOR DI(810) XOR DI(864) XOR DI(282) XOR DI(543) XOR DI(660) XOR DI(940) XOR DI(144) XOR DI(195) XOR DI(614) XOR DI(852) XOR DI(132) XOR DI(473) XOR DI(501) XOR DI(761) XOR DI(78) XOR DI(860) XOR DI(81) XOR DI(322) XOR DI(37) XOR DI(301) XOR DI(564) XOR DI(45) XOR DI(163) XOR DI(83) XOR DI(788) XOR DI(968) XOR DI(757) XOR DI(726) XOR DI(604) XOR DI(293) XOR DI(988) XOR DI(554) XOR DI(174) XOR DI(823) XOR DI(350) XOR DI(572) XOR DI(115) XOR DI(155) XOR DI(213) XOR DI(694) XOR DI(972) XOR DI(990) XOR DI(376) XOR DI(919) XOR DI(536) XOR DI(921) XOR DI(429) XOR DI(748) XOR DI(717) XOR DI(825) XOR DI(514) XOR DI(743) XOR DI(442) XOR DI(214) XOR DI(240) XOR DI(730) XOR DI(477) XOR DI(806) XOR DI(719) XOR DI(626) XOR DI(242) XOR DI(600) XOR DI(412) XOR DI(497) XOR DI(22) XOR DI(148) XOR DI(903) XOR DI(416) XOR DI(991) XOR DI(728) XOR DI(405) XOR DI(216) XOR DI(704) XOR DI(635) XOR DI(7) XOR DI(280) XOR DI(392) XOR DI(327) XOR DI(297) XOR DI(118) XOR DI(349) XOR DI(182) XOR DI(608) XOR DI(935) XOR DI(266) XOR DI(558) XOR DI(403) XOR DI(962) XOR DI(598) XOR DI(955) XOR DI(139) XOR DI(149) XOR DI(207) XOR DI(407) XOR DI(370) XOR DI(212) XOR DI(530) XOR DI(203) XOR DI(269) XOR DI(436) XOR DI(208) XOR DI(234) XOR DI(644) XOR DI(16) XOR DI(410) XOR DI(985) XOR DI(399) XOR DI(629) XOR DI(1) XOR DI(653) XOR DI(291) XOR DI(648) XOR DI(120) XOR DI(26) XOR DI(552) XOR DI(906) XOR DI(956) XOR DI(949) XOR DI(162) XOR DI(364) XOR DI(206) XOR DI(813) XOR DI(465) XOR DI(707) XOR DI(867) XOR DI(10) XOR DI(393) XOR DI(663) XOR DI(943) XOR DI(459) XOR DI(701) XOR DI(861) XOR DI(521) XOR DI(198) XOR DI(488) XOR DI(449) XOR DI(937) XOR DI(855) XOR DI(135) XOR DI(129) XOR DI(123) XOR DI(677) XOR DI(516) XOR DI(504) XOR DI(1010) XOR DI(1022); + DO(23) <= DI(563) XOR DI(95) XOR DI(778) XOR DI(781) XOR DI(981) XOR DI(843) XOR DI(591) XOR DI(1015) XOR DI(640) XOR DI(96) XOR DI(1000) XOR DI(773) XOR DI(800) XOR DI(594) XOR DI(592) XOR DI(802) XOR DI(306) XOR DI(769) XOR DI(668) XOR DI(50) XOR DI(881) XOR DI(846) XOR DI(845) XOR DI(1001) XOR DI(57) XOR DI(980) XOR DI(945) XOR DI(582) XOR DI(863) XOR DI(441) XOR DI(791) XOR DI(971) XOR DI(760) XOR DI(158) XOR DI(643) XOR DI(0) XOR DI(363) XOR DI(709) XOR DI(99) XOR DI(128) XOR DI(454) XOR DI(252) XOR DI(742) XOR DI(875) XOR DI(882) XOR DI(245) XOR DI(317) XOR DI(192) XOR DI(344) XOR DI(847) XOR DI(691) XOR DI(250) XOR DI(776) XOR DI(803) XOR DI(716) XOR DI(597) XOR DI(339) XOR DI(805) XOR DI(200) XOR DI(870) XOR DI(233) XOR DI(309) XOR DI(109) XOR DI(946) XOR DI(361) XOR DI(194) XOR DI(479) XOR DI(1019) XOR DI(568) XOR DI(86) XOR DI(869) XOR DI(178) XOR DI(576) XOR DI(698) XOR DI(838) XOR DI(262) XOR DI(100) XOR DI(756) XOR DI(893) XOR DI(433) XOR DI(752) XOR DI(818) XOR DI(53) XOR DI(620) XOR DI(914) XOR DI(662) XOR DI(884) XOR DI(446) XOR DI(244) XOR DI(639) XOR DI(284) XOR DI(425) XOR DI(499) XOR DI(76) XOR DI(36) XOR DI(858) XOR DI(35) XOR DI(966) XOR DI(485) XOR DI(790) XOR DI(777) XOR DI(715) XOR DI(741) XOR DI(475) XOR DI(877) XOR DI(20) XOR DI(66) XOR DI(953) XOR DI(157) XOR DI(201) XOR DI(434) XOR DI(60) XOR DI(983) XOR DI(9) XOR DI(110) XOR DI(667) XOR DI(947) XOR DI(362) XOR DI(525) XOR DI(621) XOR DI(948) XOR DI(859) XOR DI(526) XOR DI(1020) XOR DI(767) XOR DI(278) XOR DI(866) XOR DI(307) XOR DI(570) XOR DI(977) XOR DI(557) XOR DI(51) XOR DI(687) XOR DI(871) XOR DI(91) XOR DI(331) XOR DI(763) XOR DI(47) XOR DI(190) XOR DI(839) XOR DI(560) XOR DI(964) XOR DI(180) XOR DI(550) XOR DI(954) XOR DI(151) XOR DI(161) XOR DI(646) XOR DI(700) XOR DI(3) XOR DI(366) XOR DI(911) XOR DI(382) XOR DI(496) XOR DI(588) XOR DI(798) XOR DI(259) XOR DI(224) XOR DI(634) XOR DI(6) XOR DI(712) XOR DI(131) XOR DI(1012) XOR DI(765) XOR DI(435) XOR DI(369) XOR DI(785) XOR DI(622) XOR DI(520) XOR DI(916) XOR DI(255) XOR DI(426) XOR DI(613) XOR DI(246) XOR DI(439) XOR DI(656) XOR DI(248) XOR DI(606) XOR DI(418) XOR DI(320) XOR DI(545) XOR DI(422) XOR DI(770) XOR DI(734) XOR DI(222) XOR DI(13) XOR DI(286) XOR DI(30) XOR DI(398) XOR DI(333) XOR DI(195) XOR DI(761) XOR DI(860) XOR DI(81) XOR DI(83) XOR DI(788) XOR DI(918) XOR DI(409) XOR DI(293) XOR DI(988) XOR DI(850) XOR DI(823) XOR DI(572) XOR DI(115) XOR DI(487) XOR DI(694) XOR DI(972) XOR DI(990) XOR DI(376) XOR DI(490) XOR DI(218) XOR DI(536) XOR DI(1006) XOR DI(748) XOR DI(743) XOR DI(739) XOR DI(442) XOR DI(240) XOR DI(231) XOR DI(719) XOR DI(396) XOR DI(650) XOR DI(600) XOR DI(314) XOR DI(22) XOR DI(903) XOR DI(539) XOR DI(405) XOR DI(659) XOR DI(280) XOR DI(392) XOR DI(327) XOR DI(297) XOR DI(608) XOR DI(935) XOR DI(72) XOR DI(266) XOR DI(139) XOR DI(407) XOR DI(808) XOR DI(508) XOR DI(203) XOR DI(471) XOR DI(873) XOR DI(644) XOR DI(236) XOR DI(62) XOR DI(985) XOR DI(722) XOR DI(1) XOR DI(274) XOR DI(386) XOR DI(176) XOR DI(500) XOR DI(461) XOR DI(26) XOR DI(669) XOR DI(143) XOR DI(364) XOR DI(153) XOR DI(197) XOR DI(380) XOR DI(663) XOR DI(943) XOR DI(855) XOR DI(482) XOR DI(129) XOR DI(1022) XOR DI(268) XOR DI(768) XOR DI(775) XOR DI(905) XOR DI(45) XOR DI(867) XOR DI(706) XOR DI(88) XOR DI(379) XOR DI(336) XOR DI(329) XOR DI(796) XOR DI(308) XOR DI(184) XOR DI(978) XOR DI(558) XOR DI(89) XOR DI(939) XOR DI(49) XOR DI(90) XOR DI(872) XOR DI(92) XOR DI(795) XOR DI(837) XOR DI(68) XOR DI(764) XOR DI(611) XOR DI(191) XOR DI(300) XOR DI(467) XOR DI(995) XOR DI(857) XOR DI(561) XOR DI(958) XOR DI(955) XOR DI(357) XOR DI(579) XOR DI(122) XOR DI(162) XOR DI(220) XOR DI(239) XOR DI(701) XOR DI(909) XOR DI(841) XOR DI(797) XOR DI(530) XOR DI(383) XOR DI(926) XOR DI(497) XOR DI(635) XOR DI(7) XOR DI(265) XOR DI(543) XOR DI(940) XOR DI(355) XOR DI(928) XOR DI(674) XOR DI(1013) XOR DI(759) XOR DI(766) XOR DI(786) XOR DI(724) XOR DI(291) XOR DI(172) XOR DI(821) XOR DI(542) XOR DI(230) XOR DI(56) XOR DI(623) XOR DI(216) XOR DI(123) XOR DI(750) XOR DI(746) XOR DI(533) XOR DI(614) XOR DI(737) XOR DI(440) XOR DI(238) XOR DI(728) XOR DI(813) XOR DI(888) XOR DI(403) XOR DI(633) XOR DI(886) XOR DI(657) XOR DI(504) XOR DI(465) XOR DI(852) XOR DI(321) XOR DI(75) XOR DI(910) XOR DI(822) XOR DI(960) XOR DI(546) XOR DI(423) XOR DI(147) XOR DI(686) XOR DI(897) XOR DI(412) XOR DI(711) XOR DI(642) XOR DI(895) XOR DI(666) XOR DI(258) XOR DI(287) XOR DI(31) XOR DI(590) XOR DI(811) XOR DI(865) XOR DI(283) XOR DI(544) XOR DI(661) XOR DI(941) XOR DI(145) XOR DI(196) XOR DI(615) XOR DI(853) XOR DI(133) XOR DI(474) XOR DI(502) XOR DI(762) XOR DI(79) XOR DI(861) XOR DI(82) XOR DI(323) XOR DI(38) XOR DI(302) XOR DI(565) XOR DI(46) XOR DI(164) XOR DI(84) XOR DI(789) XOR DI(969) XOR DI(758) XOR DI(727) XOR DI(605) XOR DI(294) XOR DI(989) XOR DI(555) XOR DI(175) XOR DI(824) XOR DI(351) XOR DI(573) XOR DI(116) XOR DI(156) XOR DI(214) XOR DI(695) XOR DI(973) XOR DI(991) XOR DI(377) XOR DI(920) XOR DI(537) XOR DI(922) XOR DI(430) XOR DI(749) XOR DI(718) XOR DI(826) XOR DI(515) XOR DI(744) XOR DI(443) XOR DI(215) XOR DI(241) XOR DI(731) XOR DI(478) XOR DI(807) XOR DI(720) XOR DI(627) XOR DI(243) XOR DI(601) XOR DI(413) XOR DI(498) XOR DI(23) XOR DI(149) XOR DI(904) XOR DI(417) XOR DI(992) XOR DI(729) XOR DI(406) XOR DI(217) XOR DI(705) XOR DI(636) XOR DI(8) XOR DI(281) XOR DI(393) XOR DI(328) XOR DI(298) XOR DI(119) XOR DI(350) XOR DI(183) XOR DI(609) XOR DI(936) XOR DI(267) XOR DI(559) XOR DI(404) XOR DI(963) XOR DI(599) XOR DI(956) XOR DI(140) XOR DI(150) XOR DI(208) XOR DI(408) XOR DI(371) XOR DI(213) XOR DI(531) XOR DI(204) XOR DI(270) XOR DI(437) XOR DI(209) XOR DI(235) XOR DI(645) XOR DI(17) XOR DI(411) XOR DI(986) XOR DI(400) XOR DI(630) XOR DI(2) XOR DI(654) XOR DI(292) XOR DI(649) XOR DI(121) XOR DI(27) XOR DI(553) XOR DI(907) XOR DI(957) XOR DI(950) XOR DI(163) XOR DI(365) XOR DI(207) XOR DI(814) XOR DI(466) XOR DI(708) XOR DI(868) XOR DI(11) XOR DI(394) XOR DI(664) XOR DI(944) XOR DI(460) XOR DI(702) XOR DI(862) XOR DI(522) XOR DI(199) XOR DI(489) XOR DI(450) XOR DI(938) XOR DI(856) XOR DI(136) XOR DI(130) XOR DI(124) XOR DI(678) XOR DI(517) XOR DI(505) XOR DI(1011) XOR DI(1023); + DO(24) <= DI(564) XOR DI(96) XOR DI(779) XOR DI(782) XOR DI(982) XOR DI(844) XOR DI(109) XOR DI(1000) XOR DI(800) XOR DI(592) XOR DI(638) XOR DI(943) XOR DI(1016) XOR DI(439) XOR DI(641) XOR DI(97) XOR DI(224) XOR DI(250) XOR DI(190) XOR DI(248) XOR DI(1001) XOR DI(774) XOR DI(226) XOR DI(801) XOR DI(595) XOR DI(930) XOR DI(593) XOR DI(803) XOR DI(307) XOR DI(980) XOR DI(107) XOR DI(359) XOR DI(770) XOR DI(836) XOR DI(669) XOR DI(781) XOR DI(51) XOR DI(882) XOR DI(881) XOR DI(847) XOR DI(890) XOR DI(656) XOR DI(74) XOR DI(34) XOR DI(846) XOR DI(626) XOR DI(344) XOR DI(1002) XOR DI(473) XOR DI(875) XOR DI(899) XOR DI(338) XOR DI(58) XOR DI(981) XOR DI(382) XOR DI(946) XOR DI(697) XOR DI(536) XOR DI(691) XOR DI(524) XOR DI(1018) XOR DI(583) XOR DI(772) XOR DI(864) XOR DI(442) XOR DI(376) XOR DI(333) XOR DI(305) XOR DI(792) XOR DI(834) XOR DI(972) XOR DI(761) XOR DI(608) XOR DI(178) XOR DI(548) XOR DI(952) XOR DI(576) XOR DI(159) XOR DI(644) XOR DI(1) XOR DI(364) XOR DI(257) XOR DI(222) XOR DI(710) XOR DI(262) XOR DI(100) XOR DI(129) XOR DI(671) XOR DI(433) XOR DI(455) XOR DI(53) XOR DI(620) XOR DI(914) XOR DI(253) XOR DI(743) XOR DI(876) XOR DI(810) XOR DI(883) XOR DI(246) XOR DI(318) XOR DI(26) XOR DI(892) XOR DI(255) XOR DI(331) XOR DI(193) XOR DI(345) XOR DI(848) XOR DI(552) XOR DI(485) XOR DI(692) XOR DI(251) XOR DI(777) XOR DI(715) XOR DI(741) XOR DI(804) XOR DI(717) XOR DI(648) XOR DI(598) XOR DI(20) XOR DI(901) XOR DI(30) XOR DI(340) XOR DI(806) XOR DI(817) XOR DI(201) XOR DI(388) XOR DI(871) XOR DI(234) XOR DI(310) XOR DI(110) XOR DI(459) XOR DI(947) XOR DI(362) XOR DI(195) XOR DI(453) XOR DI(457) XOR DI(480) XOR DI(508) XOR DI(1008) XOR DI(1020) XOR DI(277) XOR DI(86) XOR DI(794) XOR DI(182) XOR DI(569) XOR DI(87) XOR DI(870) XOR DI(572) XOR DI(66) XOR DI(855) XOR DI(966) XOR DI(179) XOR DI(577) XOR DI(446) XOR DI(734) XOR DI(699) XOR DI(977) XOR DI(839) XOR DI(104) XOR DI(683) XOR DI(171) XOR DI(263) XOR DI(101) XOR DI(757) XOR DI(894) XOR DI(434) XOR DI(297) XOR DI(753) XOR DI(722) XOR DI(819) XOR DI(54) XOR DI(621) XOR DI(915) XOR DI(663) XOR DI(748) XOR DI(885) XOR DI(425) XOR DI(280) XOR DI(447) XOR DI(510) XOR DI(245) XOR DI(482) XOR DI(13) XOR DI(153) XOR DI(135) XOR DI(640) XOR DI(285) XOR DI(588) XOR DI(426) XOR DI(143) XOR DI(187) XOR DI(500) XOR DI(77) XOR DI(37) XOR DI(859) XOR DI(36) XOR DI(563) XOR DI(680) XOR DI(967) XOR DI(756) XOR DI(114) XOR DI(486) XOR DI(971) XOR DI(677) XOR DI(918) XOR DI(791) XOR DI(778) XOR DI(716) XOR DI(742) XOR DI(274) XOR DI(476) XOR DI(878) XOR DI(317) XOR DI(496) XOR DI(21) XOR DI(67) XOR DI(415) XOR DI(6) XOR DI(16) XOR DI(326) XOR DI(71) XOR DI(954) XOR DI(167) XOR DI(138) XOR DI(206) XOR DI(369) XOR DI(118) XOR DI(422) XOR DI(158) XOR DI(202) XOR DI(435) XOR DI(233) XOR DI(470) XOR DI(61) XOR DI(984) XOR DI(398) XOR DI(0) XOR DI(652) XOR DI(10) XOR DI(320) XOR DI(111) XOR DI(668) XOR DI(948) XOR DI(161) XOR DI(617) XOR DI(363) XOR DI(335) XOR DI(429) XOR DI(464) XOR DI(526) XOR DI(392) XOR DI(622) XOR DI(314) XOR DI(949) XOR DI(860) XOR DI(514) XOR DI(527) XOR DI(128) XOR DI(1015) XOR DI(1021) XOR DI(575) XOR DI(999) XOR DI(41) XOR DI(768) XOR DI(45) XOR DI(279) XOR DI(867) XOR DI(587) XOR DI(833) XOR DI(994) XOR DI(44) XOR DI(308) XOR DI(571) XOR DI(978) XOR DI(558) XOR DI(52) XOR DI(49) XOR DI(170) XOR DI(354) XOR DI(688) XOR DI(872) XOR DI(92) XOR DI(925) XOR DI(332) XOR DI(764) XOR DI(48) XOR DI(191) XOR DI(300) XOR DI(840) XOR DI(995) XOR DI(561) XOR DI(965) XOR DI(181) XOR DI(830) XOR DI(551) XOR DI(955) XOR DI(152) XOR DI(357) XOR DI(162) XOR DI(220) XOR DI(736) XOR DI(647) XOR DI(494) XOR DI(65) XOR DI(701) XOR DI(632) XOR DI(4) XOR DI(841) XOR DI(106) XOR DI(685) XOR DI(367) XOR DI(912) XOR DI(420) XOR DI(530) XOR DI(383) XOR DI(926) XOR DI(497) XOR DI(589) XOR DI(799) XOR DI(260) XOR DI(225) XOR DI(635) XOR DI(7) XOR DI(976) XOR DI(713) XOR DI(355) XOR DI(928) XOR DI(132) XOR DI(1013) XOR DI(766) XOR DI(436) XOR DI(370) XOR DI(786) XOR DI(755) XOR DI(724) XOR DI(821) XOR DI(542) XOR DI(623) XOR DI(832) XOR DI(521) XOR DI(917) XOR DI(704) XOR DI(256) XOR DI(427) XOR DI(449) XOR DI(533) XOR DI(614) XOR DI(512) XOR DI(247) XOR DI(737) XOR DI(440) XOR DI(212) XOR DI(238) XOR DI(484) XOR DI(888) XOR DI(726) XOR DI(633) XOR DI(657) XOR DI(15) XOR DI(249) XOR DI(607) XOR DI(419) XOR DI(493) XOR DI(70) XOR DI(852) XOR DI(321) XOR DI(155) XOR DI(546) XOR DI(423) XOR DI(147) XOR DI(686) XOR DI(897) XOR DI(998) XOR DI(771) XOR DI(735) XOR DI(223) XOR DI(469) XOR DI(14) XOR DI(174) XOR DI(666) XOR DI(287) XOR DI(31) XOR DI(590) XOR DI(399) XOR DI(334) XOR DI(428) XOR DI(304) XOR DI(283) XOR DI(661) XOR DI(145) XOR DI(189) XOR DI(196) XOR DI(513) XOR DI(133) XOR DI(502) XOR DI(762) XOR DI(861) XOR DI(82) XOR DI(323) XOR DI(302) XOR DI(43) XOR DI(84) XOR DI(682) XOR DI(789) XOR DI(919) XOR DI(831) XOR DI(410) XOR DI(969) XOR DI(727) XOR DI(605) XOR DI(42) XOR DI(294) XOR DI(989) XOR DI(851) XOR DI(175) XOR DI(824) XOR DI(432) XOR DI(573) XOR DI(116) XOR DI(156) XOR DI(488) XOR DI(695) XOR DI(973) XOR DI(991) XOR DI(377) XOR DI(920) XOR DI(491) XOR DI(219) XOR DI(537) XOR DI(349) XOR DI(126) XOR DI(1007) XOR DI(749) XOR DI(826) XOR DI(368) XOR DI(744) XOR DI(421) XOR DI(740) XOR DI(276) XOR DI(443) XOR DI(241) XOR DI(232) XOR DI(720) XOR DI(397) XOR DI(880) XOR DI(651) XOR DI(601) XOR DI(64) XOR DI(315) XOR DI(23) XOR DI(149) XOR DI(904) XOR DI(816) XOR DI(540) XOR DI(417) XOR DI(406) XOR DI(463) XOR DI(705) XOR DI(660) XOR DI(281) XOR DI(25) XOR DI(393) XOR DI(328) XOR DI(298) XOR DI(350) XOR DI(609) XOR DI(936) XOR DI(127) XOR DI(73) XOR DI(267) XOR DI(40) XOR DI(676) XOR DI(913) XOR DI(963) XOR DI(140) XOR DI(625) XOR DI(689) XOR DI(408) XOR DI(371) XOR DI(213) XOR DI(809) XOR DI(509) XOR DI(204) XOR DI(437) XOR DI(472) XOR DI(714) XOR DI(874) XOR DI(645) XOR DI(237) XOR DI(492) XOR DI(63) XOR DI(411) XOR DI(986) XOR DI(723) XOR DI(400) XOR DI(211) XOR DI(2) XOR DI(275) XOR DI(19) XOR DI(387) XOR DI(177) XOR DI(501) XOR DI(121) XOR DI(462) XOR DI(27) XOR DI(261) XOR DI(670) XOR DI(907) XOR DI(619) XOR DI(144) XOR DI(365) XOR DI(154) XOR DI(198) XOR DI(381) XOR DI(316) XOR DI(495) XOR DI(664) XOR DI(944) XOR DI(5) XOR DI(522) XOR DI(199) XOR DI(375) XOR DI(489) XOR DI(450) XOR DI(541) XOR DI(856) XOR DI(483) XOR DI(535) XOR DI(690) XOR DI(529) XOR DI(130) XOR DI(517) XOR DI(1023); + DO(25) <= DI(580) XOR DI(565) XOR DI(475) XOR DI(97) XOR DI(780) XOR DI(880) XOR DI(76) XOR DI(783) XOR DI(983) XOR DI(845) XOR DI(110) XOR DI(1001) XOR DI(801) XOR DI(930) XOR DI(593) XOR DI(337) XOR DI(639) XOR DI(57) XOR DI(980) XOR DI(944) XOR DI(359) XOR DI(1017) XOR DI(440) XOR DI(566) XOR DI(759) XOR DI(642) XOR DI(98) XOR DI(781) XOR DI(453) XOR DI(225) XOR DI(251) XOR DI(244) XOR DI(70) XOR DI(637) XOR DI(191) XOR DI(469) XOR DI(249) XOR DI(1002) XOR DI(775) XOR DI(227) XOR DI(802) XOR DI(596) XOR DI(931) XOR DI(594) XOR DI(338) XOR DI(804) XOR DI(869) XOR DI(308) XOR DI(981) XOR DI(108) XOR DI(548) XOR DI(360) XOR DI(137) XOR DI(1018) XOR DI(771) XOR DI(901) XOR DI(304) XOR DI(826) XOR DI(951) XOR DI(575) XOR DI(697) XOR DI(837) XOR DI(670) XOR DI(755) XOR DI(892) XOR DI(432) XOR DI(782) XOR DI(751) XOR DI(52) XOR DI(619) XOR DI(517) XOR DI(883) XOR DI(882) XOR DI(848) XOR DI(638) XOR DI(891) XOR DI(283) XOR DI(657) XOR DI(75) XOR DI(35) XOR DI(34) XOR DI(344) XOR DI(847) XOR DI(627) XOR DI(345) XOR DI(1003) XOR DI(776) XOR DI(474) XOR DI(876) XOR DI(19) XOR DI(900) XOR DI(952) XOR DI(339) XOR DI(816) XOR DI(59) XOR DI(982) XOR DI(383) XOR DI(109) XOR DI(666) XOR DI(524) XOR DI(947) XOR DI(698) XOR DI(858) XOR DI(537) XOR DI(692) XOR DI(525) XOR DI(1019) XOR DI(584) XOR DI(773) XOR DI(865) XOR DI(443) XOR DI(86) XOR DI(377) XOR DI(334) XOR DI(306) XOR DI(976) XOR DI(556) XOR DI(90) XOR DI(793) XOR DI(835) XOR DI(330) XOR DI(414) XOR DI(973) XOR DI(762) XOR DI(609) XOR DI(189) XOR DI(838) XOR DI(963) XOR DI(179) XOR DI(549) XOR DI(953) XOR DI(577) XOR DI(446) XOR DI(160) XOR DI(645) XOR DI(2) XOR DI(184) XOR DI(907) XOR DI(365) XOR DI(479) XOR DI(910) XOR DI(587) XOR DI(797) XOR DI(258) XOR DI(223) XOR DI(711) XOR DI(263) XOR DI(101) XOR DI(130) XOR DI(672) XOR DI(434) XOR DI(456) XOR DI(170) XOR DI(54) XOR DI(621) XOR DI(915) XOR DI(254) XOR DI(425) XOR DI(744) XOR DI(612) XOR DI(877) XOR DI(811) XOR DI(884) XOR DI(655) XOR DI(247) XOR DI(605) XOR DI(323) XOR DI(417) XOR DI(319) XOR DI(27) XOR DI(958) XOR DI(544) XOR DI(106) XOR DI(709) XOR DI(12) XOR DI(893) XOR DI(256) XOR DI(332) XOR DI(863) XOR DI(194) XOR DI(679) XOR DI(760) XOR DI(271) XOR DI(80) XOR DI(563) XOR DI(346) XOR DI(292) XOR DI(849) XOR DI(553) XOR DI(114) XOR DI(486) XOR DI(693) XOR DI(971) XOR DI(375) XOR DI(252) XOR DI(217) XOR DI(535) XOR DI(778) XOR DI(747) XOR DI(716) XOR DI(164) XOR DI(742) XOR DI(729) XOR DI(805) XOR DI(718) XOR DI(395) XOR DI(625) XOR DI(649) XOR DI(599) XOR DI(21) XOR DI(902) XOR DI(404) XOR DI(326) XOR DI(505) XOR DI(31) XOR DI(167) XOR DI(138) XOR DI(341) XOR DI(807) XOR DI(818) XOR DI(202) XOR DI(389) XOR DI(872) XOR DI(643) XOR DI(235) XOR DI(311) XOR DI(628) XOR DI(0) XOR DI(111) XOR DI(499) XOR DI(460) XOR DI(25) XOR DI(948) XOR DI(363) XOR DI(196) XOR DI(9) XOR DI(454) XOR DI(942) XOR DI(458) XOR DI(616) XOR DI(854) XOR DI(481) XOR DI(682) XOR DI(676) XOR DI(509) XOR DI(1009) XOR DI(1015) XOR DI(1021) XOR DI(998) XOR DI(40) XOR DI(352) XOR DI(278) XOR DI(866) XOR DI(300) XOR DI(87) XOR DI(993) XOR DI(795) XOR DI(183) XOR DI(570) XOR DI(88) XOR DI(89) XOR DI(923) XOR DI(871) XOR DI(91) XOR DI(573) XOR DI(794) XOR DI(836) XOR DI(67) XOR DI(331) XOR DI(415) XOR DI(732) XOR DI(47) XOR DI(104) XOR DI(466) XOR DI(994) XOR DI(856) XOR DI(560) XOR DI(967) XOR DI(180) XOR DI(957) XOR DI(151) XOR DI(578) XOR DI(121) XOR DI(447) XOR DI(161) XOR DI(735) XOR DI(700) XOR DI(631) XOR DI(185) XOR DI(978) XOR DI(840) XOR DI(105) XOR DI(684) XOR DI(911) XOR DI(796) XOR DI(529) XOR DI(172) XOR DI(925) XOR DI(798) XOR DI(259) XOR DI(302) XOR DI(712) XOR DI(264) XOR DI(102) XOR DI(939) XOR DI(354) XOR DI(187) XOR DI(1012) XOR DI(758) XOR DI(895) XOR DI(435) XOR DI(298) XOR DI(754) XOR DI(723) XOR DI(457) XOR DI(820) XOR DI(55) XOR DI(622) XOR DI(357) XOR DI(916) XOR DI(215) XOR DI(703) XOR DI(255) XOR DI(664) XOR DI(749) XOR DI(886) XOR DI(426) XOR DI(281) XOR DI(448) XOR DI(532) XOR DI(511) XOR DI(246) XOR DI(439) XOR DI(211) XOR DI(483) XOR DI(812) XOR DI(887) XOR DI(632) XOR DI(656) XOR DI(14) XOR DI(69) XOR DI(320) XOR DI(154) XOR DI(821) XOR DI(959) XOR DI(545) XOR DI(136) XOR DI(685) XOR DI(896) XOR DI(734) XOR DI(222) XOR DI(468) XOR DI(641) XOR DI(13) XOR DI(173) XOR DI(286) XOR DI(30) XOR DI(589) XOR DI(427) XOR DI(940) XOR DI(124) XOR DI(144) XOR DI(188) XOR DI(941) XOR DI(512) XOR DI(928) XOR DI(680) XOR DI(501) XOR DI(78) XOR DI(38) XOR DI(860) XOR DI(37) XOR DI(564) XOR DI(681) XOR DI(830) XOR DI(968) XOR DI(757) XOR DI(726) XOR DI(293) XOR DI(554) XOR DI(961) XOR DI(174) XOR DI(823) XOR DI(431) XOR DI(115) XOR DI(487) XOR DI(972) XOR DI(678) XOR DI(413) XOR DI(919) XOR DI(792) XOR DI(218) XOR DI(969) XOR DI(125) XOR DI(779) XOR DI(748) XOR DI(717) XOR DI(165) XOR DI(814) XOR DI(209) XOR DI(743) XOR DI(275) XOR DI(240) XOR DI(730) XOR DI(231) XOR DI(477) XOR DI(719) XOR DI(879) XOR DI(650) XOR DI(600) XOR DI(318) XOR DI(497) XOR DI(314) XOR DI(22) XOR DI(68) XOR DI(815) XOR DI(416) XOR DI(890) XOR DI(405) XOR DI(216) XOR DI(704) XOR DI(7) XOR DI(888) XOR DI(17) XOR DI(392) XOR DI(327) XOR DI(297) XOR DI(118) XOR DI(349) XOR DI(506) XOR DI(126) XOR DI(467) XOR DI(72) XOR DI(266) XOR DI(39) XOR DI(675) XOR DI(955) XOR DI(168) XOR DI(139) XOR DI(149) XOR DI(207) XOR DI(899) XOR DI(370) XOR DI(119) XOR DI(423) XOR DI(159) XOR DI(808) XOR DI(508) XOR DI(203) XOR DI(269) XOR DI(436) XOR DI(208) XOR DI(234) XOR DI(471) XOR DI(236) XOR DI(62) XOR DI(897) XOR DI(533) XOR DI(985) XOR DI(722) XOR DI(399) XOR DI(210) XOR DI(1) XOR DI(653) XOR DI(11) XOR DI(274) XOR DI(18) XOR DI(321) XOR DI(112) XOR DI(120) XOR DI(461) XOR DI(669) XOR DI(906) XOR DI(949) XOR DI(162) XOR DI(618) XOR DI(143) XOR DI(364) XOR DI(206) XOR DI(336) XOR DI(430) XOR DI(465) XOR DI(707) XOR DI(527) XOR DI(393) XOR DI(623) XOR DI(380) XOR DI(315) XOR DI(950) XOR DI(943) XOR DI(147) XOR DI(459) XOR DI(861) XOR DI(617) XOR DI(449) XOR DI(855) XOR DI(515) XOR DI(482) XOR DI(135) XOR DI(528) XOR DI(129) XOR DI(123) XOR DI(516) XOR DI(1016) XOR DI(1022); + DO(26) <= DI(581) XOR DI(566) XOR DI(476) XOR DI(98) XOR DI(781) XOR DI(881) XOR DI(77) XOR DI(784) XOR DI(984) XOR DI(846) XOR DI(111) XOR DI(1002) XOR DI(802) XOR DI(931) XOR DI(594) XOR DI(338) XOR DI(640) XOR DI(58) XOR DI(981) XOR DI(945) XOR DI(360) XOR DI(1018) XOR DI(441) XOR DI(567) XOR DI(760) XOR DI(643) XOR DI(99) XOR DI(782) XOR DI(454) XOR DI(226) XOR DI(252) XOR DI(245) XOR DI(71) XOR DI(638) XOR DI(192) XOR DI(470) XOR DI(250) XOR DI(1003) XOR DI(776) XOR DI(228) XOR DI(803) XOR DI(597) XOR DI(932) XOR DI(595) XOR DI(339) XOR DI(805) XOR DI(870) XOR DI(309) XOR DI(982) XOR DI(109) XOR DI(549) XOR DI(361) XOR DI(138) XOR DI(1019) XOR DI(772) XOR DI(902) XOR DI(305) XOR DI(827) XOR DI(952) XOR DI(576) XOR DI(698) XOR DI(838) XOR DI(671) XOR DI(756) XOR DI(893) XOR DI(433) XOR DI(783) XOR DI(752) XOR DI(53) XOR DI(620) XOR DI(518) XOR DI(884) XOR DI(883) XOR DI(849) XOR DI(639) XOR DI(892) XOR DI(284) XOR DI(658) XOR DI(76) XOR DI(36) XOR DI(35) XOR DI(345) XOR DI(848) XOR DI(628) XOR DI(346) XOR DI(1004) XOR DI(777) XOR DI(475) XOR DI(877) XOR DI(20) XOR DI(901) XOR DI(953) XOR DI(340) XOR DI(817) XOR DI(60) XOR DI(983) XOR DI(384) XOR DI(110) XOR DI(667) XOR DI(525) XOR DI(948) XOR DI(699) XOR DI(859) XOR DI(538) XOR DI(693) XOR DI(526) XOR DI(1020) XOR DI(585) XOR DI(774) XOR DI(866) XOR DI(444) XOR DI(87) XOR DI(378) XOR DI(335) XOR DI(307) XOR DI(977) XOR DI(557) XOR DI(91) XOR DI(794) XOR DI(836) XOR DI(331) XOR DI(415) XOR DI(974) XOR DI(763) XOR DI(610) XOR DI(190) XOR DI(839) XOR DI(964) XOR DI(180) XOR DI(550) XOR DI(954) XOR DI(578) XOR DI(447) XOR DI(161) XOR DI(646) XOR DI(3) XOR DI(185) XOR DI(908) XOR DI(366) XOR DI(480) XOR DI(911) XOR DI(588) XOR DI(798) XOR DI(259) XOR DI(224) XOR DI(712) XOR DI(264) XOR DI(102) XOR DI(131) XOR DI(673) XOR DI(435) XOR DI(457) XOR DI(171) XOR DI(55) XOR DI(622) XOR DI(916) XOR DI(255) XOR DI(426) XOR DI(745) XOR DI(613) XOR DI(878) XOR DI(812) XOR DI(885) XOR DI(656) XOR DI(248) XOR DI(606) XOR DI(324) XOR DI(418) XOR DI(320) XOR DI(28) XOR DI(959) XOR DI(545) XOR DI(107) XOR DI(710) XOR DI(13) XOR DI(894) XOR DI(257) XOR DI(333) XOR DI(864) XOR DI(195) XOR DI(680) XOR DI(761) XOR DI(272) XOR DI(81) XOR DI(564) XOR DI(347) XOR DI(293) XOR DI(850) XOR DI(554) XOR DI(115) XOR DI(487) XOR DI(694) XOR DI(972) XOR DI(376) XOR DI(253) XOR DI(218) XOR DI(536) XOR DI(779) XOR DI(748) XOR DI(717) XOR DI(165) XOR DI(743) XOR DI(730) XOR DI(806) XOR DI(719) XOR DI(396) XOR DI(626) XOR DI(650) XOR DI(600) XOR DI(22) XOR DI(903) XOR DI(405) XOR DI(327) XOR DI(506) XOR DI(32) XOR DI(168) XOR DI(139) XOR DI(342) XOR DI(808) XOR DI(819) XOR DI(203) XOR DI(390) XOR DI(873) XOR DI(644) XOR DI(236) XOR DI(312) XOR DI(629) XOR DI(1) XOR DI(112) XOR DI(500) XOR DI(461) XOR DI(26) XOR DI(949) XOR DI(364) XOR DI(197) XOR DI(10) XOR DI(455) XOR DI(943) XOR DI(459) XOR DI(617) XOR DI(855) XOR DI(482) XOR DI(683) XOR DI(677) XOR DI(510) XOR DI(1010) XOR DI(1016) XOR DI(1022) XOR DI(999) XOR DI(41) XOR DI(353) XOR DI(279) XOR DI(867) XOR DI(301) XOR DI(88) XOR DI(994) XOR DI(796) XOR DI(184) XOR DI(571) XOR DI(89) XOR DI(90) XOR DI(924) XOR DI(872) XOR DI(92) XOR DI(574) XOR DI(795) XOR DI(837) XOR DI(68) XOR DI(332) XOR DI(416) XOR DI(733) XOR DI(48) XOR DI(105) XOR DI(467) XOR DI(995) XOR DI(857) XOR DI(561) XOR DI(968) XOR DI(181) XOR DI(958) XOR DI(152) XOR DI(579) XOR DI(122) XOR DI(448) XOR DI(162) XOR DI(736) XOR DI(701) XOR DI(632) XOR DI(186) XOR DI(979) XOR DI(841) XOR DI(106) XOR DI(685) XOR DI(912) XOR DI(797) XOR DI(530) XOR DI(173) XOR DI(926) XOR DI(799) XOR DI(260) XOR DI(303) XOR DI(713) XOR DI(265) XOR DI(103) XOR DI(940) XOR DI(355) XOR DI(188) XOR DI(1013) XOR DI(759) XOR DI(896) XOR DI(436) XOR DI(299) XOR DI(755) XOR DI(724) XOR DI(458) XOR DI(821) XOR DI(56) XOR DI(623) XOR DI(358) XOR DI(917) XOR DI(216) XOR DI(704) XOR DI(256) XOR DI(665) XOR DI(750) XOR DI(887) XOR DI(427) XOR DI(282) XOR DI(449) XOR DI(533) XOR DI(512) XOR DI(247) XOR DI(440) XOR DI(212) XOR DI(484) XOR DI(813) XOR DI(888) XOR DI(633) XOR DI(657) XOR DI(15) XOR DI(70) XOR DI(321) XOR DI(155) XOR DI(822) XOR DI(960) XOR DI(546) XOR DI(137) XOR DI(686) XOR DI(897) XOR DI(735) XOR DI(223) XOR DI(469) XOR DI(642) XOR DI(14) XOR DI(174) XOR DI(287) XOR DI(31) XOR DI(590) XOR DI(428) XOR DI(941) XOR DI(125) XOR DI(145) XOR DI(189) XOR DI(942) XOR DI(513) XOR DI(929) XOR DI(681) XOR DI(502) XOR DI(79) XOR DI(39) XOR DI(861) XOR DI(38) XOR DI(565) XOR DI(682) XOR DI(831) XOR DI(969) XOR DI(758) XOR DI(727) XOR DI(294) XOR DI(555) XOR DI(962) XOR DI(175) XOR DI(824) XOR DI(432) XOR DI(116) XOR DI(488) XOR DI(973) XOR DI(679) XOR DI(414) XOR DI(920) XOR DI(793) XOR DI(219) XOR DI(970) XOR DI(126) XOR DI(780) XOR DI(749) XOR DI(718) XOR DI(166) XOR DI(815) XOR DI(210) XOR DI(744) XOR DI(276) XOR DI(241) XOR DI(731) XOR DI(232) XOR DI(478) XOR DI(720) XOR DI(880) XOR DI(651) XOR DI(601) XOR DI(319) XOR DI(498) XOR DI(315) XOR DI(23) XOR DI(69) XOR DI(816) XOR DI(417) XOR DI(891) XOR DI(406) XOR DI(217) XOR DI(705) XOR DI(8) XOR DI(889) XOR DI(18) XOR DI(393) XOR DI(328) XOR DI(298) XOR DI(119) XOR DI(350) XOR DI(507) XOR DI(127) XOR DI(468) XOR DI(73) XOR DI(267) XOR DI(40) XOR DI(676) XOR DI(956) XOR DI(169) XOR DI(140) XOR DI(150) XOR DI(208) XOR DI(900) XOR DI(371) XOR DI(120) XOR DI(424) XOR DI(160) XOR DI(809) XOR DI(509) XOR DI(204) XOR DI(270) XOR DI(437) XOR DI(209) XOR DI(235) XOR DI(472) XOR DI(237) XOR DI(63) XOR DI(898) XOR DI(534) XOR DI(986) XOR DI(723) XOR DI(400) XOR DI(211) XOR DI(2) XOR DI(654) XOR DI(12) XOR DI(275) XOR DI(19) XOR DI(322) XOR DI(113) XOR DI(121) XOR DI(462) XOR DI(670) XOR DI(907) XOR DI(950) XOR DI(163) XOR DI(619) XOR DI(144) XOR DI(365) XOR DI(207) XOR DI(337) XOR DI(431) XOR DI(466) XOR DI(708) XOR DI(528) XOR DI(394) XOR DI(624) XOR DI(381) XOR DI(316) XOR DI(951) XOR DI(944) XOR DI(148) XOR DI(460) XOR DI(862) XOR DI(618) XOR DI(450) XOR DI(856) XOR DI(516) XOR DI(483) XOR DI(136) XOR DI(529) XOR DI(130) XOR DI(124) XOR DI(517) XOR DI(1017) XOR DI(1023); + DO(27) <= DI(582) XOR DI(567) XOR DI(554) XOR DI(836) XOR DI(964) XOR DI(444) XOR DI(600) XOR DI(697) XOR DI(477) XOR DI(99) XOR DI(782) XOR DI(226) XOR DI(610) XOR DI(875) XOR DI(882) XOR DI(767) XOR DI(707) XOR DI(638) XOR DI(192) XOR DI(269) XOR DI(78) XOR DI(34) XOR DI(344) XOR DI(785) XOR DI(985) XOR DI(847) XOR DI(112) XOR DI(691) XOR DI(250) XOR DI(1003) XOR DI(776) XOR DI(439) XOR DI(803) XOR DI(536) XOR DI(656) XOR DI(324) XOR DI(932) XOR DI(595) XOR DI(165) XOR DI(339) XOR DI(200) XOR DI(231) XOR DI(641) XOR DI(309) XOR DI(59) XOR DI(982) XOR DI(626) XOR DI(650) XOR DI(109) XOR DI(946) XOR DI(361) XOR DI(524) XOR DI(1019) XOR DI(765) XOR DI(772) XOR DI(442) XOR DI(376) XOR DI(305) XOR DI(568) XOR DI(869) XOR DI(834) XOR DI(761) XOR DI(730) XOR DI(608) XOR DI(178) XOR DI(548) XOR DI(576) XOR DI(644) XOR DI(380) XOR DI(222) XOR DI(262) XOR DI(100) XOR DI(763) XOR DI(783) XOR DI(455) XOR DI(227) XOR DI(53) XOR DI(914) XOR DI(253) XOR DI(244) XOR DI(246) XOR DI(26) XOR DI(72) XOR DI(639) XOR DI(255) XOR DI(284) XOR DI(28) XOR DI(331) XOR DI(808) XOR DI(193) XOR DI(471) XOR DI(76) XOR DI(552) XOR DI(790) XOR DI(251) XOR DI(1004) XOR DI(777) XOR DI(715) XOR DI(741) XOR DI(229) XOR DI(475) XOR DI(804) XOR DI(648) XOR DI(240) XOR DI(598) XOR DI(606) XOR DI(933) XOR DI(30) XOR DI(293) XOR DI(596) XOR DI(405) XOR DI(340) XOR DI(157) XOR DI(806) XOR DI(506) XOR DI(388) XOR DI(871) XOR DI(310) XOR DI(983) XOR DI(384) XOR DI(646) XOR DI(110) XOR DI(550) XOR DI(667) XOR DI(362) XOR DI(378) XOR DI(453) XOR DI(457) XOR DI(139) XOR DI(1008) XOR DI(1020) XOR DI(773) XOR DI(903) XOR DI(83) XOR DI(86) XOR DI(306) XOR DI(50) XOR DI(937) XOR DI(47) XOR DI(352) XOR DI(923) XOR DI(66) XOR DI(855) XOR DI(966) XOR DI(828) XOR DI(953) XOR DI(577) XOR DI(446) XOR DI(699) XOR DI(977) XOR DI(839) XOR DI(171) XOR DI(672) XOR DI(757) XOR DI(894) XOR DI(434) XOR DI(297) XOR DI(560) XOR DI(784) XOR DI(753) XOR DI(722) XOR DI(54) XOR DI(621) XOR DI(519) XOR DI(748) XOR DI(885) XOR DI(612) XOR DI(482) XOR DI(884) XOR DI(850) XOR DI(135) XOR DI(769) XOR DI(640) XOR DI(893) XOR DI(285) XOR DI(588) XOR DI(659) XOR DI(143) XOR DI(1012) XOR DI(77) XOR DI(37) XOR DI(36) XOR DI(563) XOR DI(346) XOR DI(787) XOR DI(849) XOR DI(629) XOR DI(347) XOR DI(1005) XOR DI(778) XOR DI(738) XOR DI(274) XOR DI(476) XOR DI(878) XOR DI(496) XOR DI(21) XOR DI(902) XOR DI(538) XOR DI(990) XOR DI(6) XOR DI(326) XOR DI(911) XOR DI(954) XOR DI(206) XOR DI(827) XOR DI(369) XOR DI(341) XOR DI(118) XOR DI(422) XOR DI(818) XOR DI(712) XOR DI(490) XOR DI(61) XOR DI(409) XOR DI(984) XOR DI(398) XOR DI(628) XOR DI(385) XOR DI(111) XOR DI(259) XOR DI(668) XOR DI(617) XOR DI(335) XOR DI(812) XOR DI(464) XOR DI(866) XOR DI(526) XOR DI(392) XOR DI(314) XOR DI(545) XOR DI(662) XOR DI(949) XOR DI(700) XOR DI(860) XOR DI(197) XOR DI(539) XOR DI(694) XOR DI(527) XOR DI(1015) XOR DI(1021) XOR DI(999) XOR DI(747) XOR DI(586) XOR DI(775) XOR DI(905) XOR DI(85) XOR DI(45) XOR DI(867) XOR DI(587) XOR DI(445) XOR DI(301) XOR DI(88) XOR DI(379) XOR DI(336) XOR DI(833) XOR DI(994) XOR DI(44) XOR DI(308) XOR DI(184) XOR DI(854) XOR DI(978) XOR DI(558) XOR DI(939) XOR DI(92) XOR DI(574) XOR DI(795) XOR DI(837) XOR DI(332) XOR DI(416) XOR DI(975) XOR DI(764) XOR DI(611) XOR DI(191) XOR DI(840) XOR DI(965) XOR DI(181) XOR DI(830) XOR DI(551) XOR DI(958) XOR DI(955) XOR DI(637) XOR DI(357) XOR DI(579) XOR DI(703) XOR DI(448) XOR DI(162) XOR DI(647) XOR DI(239) XOR DI(494) XOR DI(65) XOR DI(632) XOR DI(4) XOR DI(186) XOR DI(909) XOR DI(979) XOR DI(841) XOR DI(685) XOR DI(367) XOR DI(481) XOR DI(912) XOR DI(420) XOR DI(173) XOR DI(926) XOR DI(589) XOR DI(799) XOR DI(260) XOR DI(225) XOR DI(303) XOR DI(976) XOR DI(713) XOR DI(265) XOR DI(103) XOR DI(543) XOR DI(940) XOR DI(355) XOR DI(928) XOR DI(132) XOR DI(674) XOR DI(896) XOR DI(436) XOR DI(755) XOR DI(458) XOR DI(172) XOR DI(821) XOR DI(542) XOR DI(56) XOR DI(623) XOR DI(358) XOR DI(917) XOR DI(216) XOR DI(704) XOR DI(256) XOR DI(665) XOR DI(887) XOR DI(427) XOR DI(746) XOR DI(282) XOR DI(533) XOR DI(221) XOR DI(614) XOR DI(512) XOR DI(879) XOR DI(813) XOR DI(726) XOR DI(886) XOR DI(657) XOR DI(249) XOR DI(607) XOR DI(325) XOR DI(419) XOR DI(493) XOR DI(852) XOR DI(321) XOR DI(29) XOR DI(155) XOR DI(910) XOR DI(960) XOR DI(546) XOR DI(147) XOR DI(998) XOR DI(108) XOR DI(412) XOR DI(711) XOR DI(14) XOR DI(895) XOR DI(258) XOR DI(590) XOR DI(616) XOR DI(334) XOR DI(865) XOR DI(544) XOR DI(661) XOR DI(196) XOR DI(615) XOR DI(853) XOR DI(532) XOR DI(929) XOR DI(133) XOR DI(681) XOR DI(502) XOR DI(993) XOR DI(762) XOR DI(273) XOR DI(82) XOR DI(330) XOR DI(565) XOR DI(46) XOR DI(43) XOR DI(348) XOR DI(831) XOR DI(727) XOR DI(605) XOR DI(294) XOR DI(851) XOR DI(555) XOR DI(631) XOR DI(116) XOR DI(214) XOR DI(488) XOR DI(695) XOR DI(973) XOR DI(679) XOR DI(906) XOR DI(414) XOR DI(377) XOR DI(920) XOR DI(254) XOR DI(219) XOR DI(537) XOR DI(349) XOR DI(780) XOR DI(749) XOR DI(718) XOR DI(166) XOR DI(815) XOR DI(826) XOR DI(368) XOR DI(744) XOR DI(421) XOR DI(215) XOR DI(731) XOR DI(807) XOR DI(720) XOR DI(397) XOR DI(627) XOR DI(880) XOR DI(651) XOR DI(601) XOR DI(413) XOR DI(498) XOR DI(23) XOR DI(904) XOR DI(992) XOR DI(729) XOR DI(406) XOR DI(636) XOR DI(8) XOR DI(18) XOR DI(25) XOR DI(328) XOR DI(350) XOR DI(507) XOR DI(675) XOR DI(33) XOR DI(559) XOR DI(676) XOR DI(404) XOR DI(956) XOR DI(169) XOR DI(140) XOR DI(150) XOR DI(689) XOR DI(371) XOR DI(343) XOR DI(424) XOR DI(809) XOR DI(820) XOR DI(204) XOR DI(391) XOR DI(874) XOR DI(645) XOR DI(237) XOR DI(313) XOR DI(492) XOR DI(411) XOR DI(400) XOR DI(630) XOR DI(2) XOR DI(12) XOR DI(292) XOR DI(113) XOR DI(501) XOR DI(462) XOR DI(27) XOR DI(907) XOR DI(950) XOR DI(134) XOR DI(365) XOR DI(337) XOR DI(198) XOR DI(431) XOR DI(466) XOR DI(11) XOR DI(495) XOR DI(456) XOR DI(944) XOR DI(148) XOR DI(460) XOR DI(5) XOR DI(522) XOR DI(199) XOR DI(618) XOR DI(375) XOR DI(541) XOR DI(696) XOR DI(856) XOR DI(516) XOR DI(483) XOR DI(690) XOR DI(684) XOR DI(523) XOR DI(124) XOR DI(678) XOR DI(511) XOR DI(505) XOR DI(1011) XOR DI(1017) XOR DI(1023); + DO(28) <= DI(583) XOR DI(772) XOR DI(276) XOR DI(85) XOR DI(305) XOR DI(568) XOR DI(555) XOR DI(49) XOR DI(869) XOR DI(65) XOR DI(837) XOR DI(965) XOR DI(751) XOR DI(178) XOR DI(548) XOR DI(952) XOR DI(576) XOR DI(445) XOR DI(601) XOR DI(698) XOR DI(478) XOR DI(262) XOR DI(100) XOR DI(671) XOR DI(433) XOR DI(783) XOR DI(288) XOR DI(227) XOR DI(53) XOR DI(620) XOR DI(518) XOR DI(371) XOR DI(914) XOR DI(424) XOR DI(611) XOR DI(244) XOR DI(876) XOR DI(400) XOR DI(883) XOR DI(768) XOR DI(708) XOR DI(639) XOR DI(892) XOR DI(284) XOR DI(862) XOR DI(193) XOR DI(759) XOR DI(76) XOR DI(270) XOR DI(858) XOR DI(79) XOR DI(35) XOR DI(562) XOR DI(345) XOR DI(786) XOR DI(755) XOR DI(986) XOR DI(848) XOR DI(113) XOR DI(485) XOR DI(692) XOR DI(970) XOR DI(790) XOR DI(251) XOR DI(1004) XOR DI(777) XOR DI(715) XOR DI(741) XOR DI(737) XOR DI(440) XOR DI(475) XOR DI(804) XOR DI(394) XOR DI(316) XOR DI(20) XOR DI(901) XOR DI(537) XOR DI(657) XOR DI(325) XOR DI(933) XOR DI(70) XOR DI(596) XOR DI(166) XOR DI(137) XOR DI(826) XOR DI(340) XOR DI(157) XOR DI(817) XOR DI(201) XOR DI(232) XOR DI(469) XOR DI(388) XOR DI(642) XOR DI(310) XOR DI(60) XOR DI(983) XOR DI(627) XOR DI(651) XOR DI(384) XOR DI(110) XOR DI(498) XOR DI(667) XOR DI(947) XOR DI(362) XOR DI(8) XOR DI(525) XOR DI(453) XOR DI(661) XOR DI(127) XOR DI(1008) XOR DI(1014) XOR DI(1020) XOR DI(766) XOR DI(773) XOR DI(277) XOR DI(443) XOR DI(377) XOR DI(306) XOR DI(569) XOR DI(50) XOR DI(870) XOR DI(90) XOR DI(835) XOR DI(330) XOR DI(762) XOR DI(731) XOR DI(609) XOR DI(189) XOR DI(963) XOR DI(179) XOR DI(549) XOR DI(150) XOR DI(577) XOR DI(645) XOR DI(184) XOR DI(479) XOR DI(381) XOR DI(797) XOR DI(223) XOR DI(263) XOR DI(101) XOR DI(764) XOR DI(784) XOR DI(456) XOR DI(228) XOR DI(54) XOR DI(915) XOR DI(254) XOR DI(245) XOR DI(438) XOR DI(655) XOR DI(247) XOR DI(605) XOR DI(323) XOR DI(27) XOR DI(73) XOR DI(958) XOR DI(769) XOR DI(106) XOR DI(221) XOR DI(709) XOR DI(640) XOR DI(256) XOR DI(285) XOR DI(29) XOR DI(332) XOR DI(809) XOR DI(863) XOR DI(194) XOR DI(472) XOR DI(760) XOR DI(77) XOR DI(271) XOR DI(80) XOR DI(563) XOR DI(787) XOR DI(292) XOR DI(987) XOR DI(553) XOR DI(971) XOR DI(833) XOR DI(375) XOR DI(791) XOR DI(252) XOR DI(535) XOR DI(920) XOR DI(1005) XOR DI(778) XOR DI(716) XOR DI(450) XOR DI(164) XOR DI(742) XOR DI(738) XOR DI(441) XOR DI(239) XOR DI(729) XOR DI(230) XOR DI(476) XOR DI(805) XOR DI(395) XOR DI(625) XOR DI(649) XOR DI(241) XOR DI(599) XOR DI(317) XOR DI(889) XOR DI(404) XOR DI(607) XOR DI(934) XOR DI(505) XOR DI(71) XOR DI(31) XOR DI(294) XOR DI(597) XOR DI(138) XOR DI(898) XOR DI(406) XOR DI(341) XOR DI(158) XOR DI(807) XOR DI(507) XOR DI(268) XOR DI(233) XOR DI(470) XOR DI(389) XOR DI(872) XOR DI(643) XOR DI(311) XOR DI(984) XOR DI(0) XOR DI(385) XOR DI(647) XOR DI(111) XOR DI(175) XOR DI(25) XOR DI(551) XOR DI(668) XOR DI(363) XOR DI(706) XOR DI(379) XOR DI(454) XOR DI(942) XOR DI(458) XOR DI(140) XOR DI(128) XOR DI(1009) XOR DI(1015) XOR DI(1021) XOR DI(574) XOR DI(998) XOR DI(40) XOR DI(352) XOR DI(767) XOR DI(774) XOR DI(904) XOR DI(84) XOR DI(444) XOR DI(300) XOR DI(87) XOR DI(43) XOR DI(307) XOR DI(51) XOR DI(938) XOR DI(48) XOR DI(923) XOR DI(353) XOR DI(687) XOR DI(91) XOR DI(794) XOR DI(924) XOR DI(836) XOR DI(67) XOR DI(610) XOR DI(190) XOR DI(299) XOR DI(466) XOR DI(856) XOR DI(967) XOR DI(964) XOR DI(829) XOR DI(954) XOR DI(636) XOR DI(578) XOR DI(702) XOR DI(121) XOR DI(447) XOR DI(161) XOR DI(64) XOR DI(700) XOR DI(978) XOR DI(840) XOR DI(996) XOR DI(529) XOR DI(382) XOR DI(172) XOR DI(925) XOR DI(798) XOR DI(224) XOR DI(634) XOR DI(939) XOR DI(354) XOR DI(131) XOR DI(673) XOR DI(758) XOR DI(895) XOR DI(435) XOR DI(298) XOR DI(561) XOR DI(785) XOR DI(754) XOR DI(723) XOR DI(171) XOR DI(541) XOR DI(55) XOR DI(622) XOR DI(357) XOR DI(520) XOR DI(703) XOR DI(122) XOR DI(749) XOR DI(886) XOR DI(532) XOR DI(613) XOR DI(736) XOR DI(439) XOR DI(211) XOR DI(483) XOR DI(812) XOR DI(725) XOR DI(885) XOR DI(656) XOR DI(248) XOR DI(324) XOR DI(418) XOR DI(464) XOR DI(492) XOR DI(69) XOR DI(851) XOR DI(320) XOR DI(74) XOR DI(136) XOR DI(146) XOR DI(770) XOR DI(107) XOR DI(734) XOR DI(411) XOR DI(468) XOR DI(641) XOR DI(894) XOR DI(926) XOR DI(665) XOR DI(286) XOR DI(589) XOR DI(303) XOR DI(282) XOR DI(660) XOR DI(124) XOR DI(355) XOR DI(144) XOR DI(531) XOR DI(928) XOR DI(473) XOR DI(1013) XOR DI(992) XOR DI(78) XOR DI(38) XOR DI(37) XOR DI(301) XOR DI(564) XOR DI(42) XOR DI(347) XOR DI(788) XOR DI(830) XOR DI(409) XOR DI(726) XOR DI(41) XOR DI(850) XOR DI(554) XOR DI(823) XOR DI(431) XOR DI(145) XOR DI(630) XOR DI(572) XOR DI(155) XOR DI(213) XOR DI(990) XOR DI(490) XOR DI(218) XOR DI(969) XOR DI(536) XOR DI(348) XOR DI(1006) XOR DI(429) XOR DI(779) XOR DI(451) XOR DI(165) XOR DI(825) XOR DI(514) XOR DI(209) XOR DI(739) XOR DI(275) XOR DI(214) XOR DI(231) XOR DI(477) XOR DI(626) XOR DI(879) XOR DI(650) XOR DI(242) XOR DI(600) XOR DI(497) XOR DI(22) XOR DI(903) XOR DI(815) XOR DI(539) XOR DI(890) XOR DI(991) XOR DI(7) XOR DI(280) XOR DI(327) XOR DI(297) XOR DI(118) XOR DI(126) XOR DI(32) XOR DI(39) XOR DI(912) XOR DI(955) XOR DI(207) XOR DI(828) XOR DI(899) XOR DI(370) XOR DI(212) XOR DI(530) XOR DI(342) XOR DI(119) XOR DI(423) XOR DI(819) XOR DI(269) XOR DI(208) XOR DI(724) XOR DI(713) XOR DI(873) XOR DI(236) XOR DI(491) XOR DI(16) XOR DI(62) XOR DI(410) XOR DI(985) XOR DI(722) XOR DI(399) XOR DI(210) XOR DI(629) XOR DI(18) XOR DI(386) XOR DI(112) XOR DI(176) XOR DI(120) XOR DI(260) XOR DI(669) XOR DI(618) XOR DI(143) XOR DI(206) XOR DI(336) XOR DI(153) XOR DI(813) XOR DI(465) XOR DI(707) XOR DI(867) XOR DI(527) XOR DI(393) XOR DI(315) XOR DI(546) XOR DI(663) XOR DI(950) XOR DI(943) XOR DI(147) XOR DI(701) XOR DI(861) XOR DI(198) XOR DI(540) XOR DI(937) XOR DI(695) XOR DI(689) XOR DI(528) XOR DI(683) XOR DI(522) XOR DI(123) XOR DI(516) XOR DI(510) XOR DI(1016) XOR DI(1022); + DO(29) <= DI(584) XOR DI(773) XOR DI(277) XOR DI(86) XOR DI(306) XOR DI(569) XOR DI(556) XOR DI(50) XOR DI(870) XOR DI(66) XOR DI(838) XOR DI(966) XOR DI(752) XOR DI(179) XOR DI(549) XOR DI(953) XOR DI(577) XOR DI(446) XOR DI(602) XOR DI(699) XOR DI(479) XOR DI(263) XOR DI(101) XOR DI(672) XOR DI(434) XOR DI(784) XOR DI(289) XOR DI(228) XOR DI(54) XOR DI(621) XOR DI(519) XOR DI(372) XOR DI(915) XOR DI(425) XOR DI(612) XOR DI(245) XOR DI(877) XOR DI(401) XOR DI(884) XOR DI(769) XOR DI(709) XOR DI(640) XOR DI(893) XOR DI(285) XOR DI(863) XOR DI(194) XOR DI(760) XOR DI(77) XOR DI(271) XOR DI(859) XOR DI(80) XOR DI(36) XOR DI(563) XOR DI(346) XOR DI(787) XOR DI(756) XOR DI(987) XOR DI(849) XOR DI(114) XOR DI(486) XOR DI(693) XOR DI(971) XOR DI(791) XOR DI(252) XOR DI(1005) XOR DI(778) XOR DI(716) XOR DI(742) XOR DI(738) XOR DI(441) XOR DI(476) XOR DI(805) XOR DI(395) XOR DI(317) XOR DI(21) XOR DI(902) XOR DI(538) XOR DI(658) XOR DI(326) XOR DI(934) XOR DI(71) XOR DI(597) XOR DI(167) XOR DI(138) XOR DI(827) XOR DI(341) XOR DI(158) XOR DI(818) XOR DI(202) XOR DI(233) XOR DI(470) XOR DI(389) XOR DI(643) XOR DI(311) XOR DI(61) XOR DI(984) XOR DI(628) XOR DI(0) XOR DI(652) XOR DI(385) XOR DI(111) XOR DI(499) XOR DI(668) XOR DI(948) XOR DI(363) XOR DI(9) XOR DI(526) XOR DI(454) XOR DI(662) XOR DI(128) XOR DI(1009) XOR DI(1015) XOR DI(1021) XOR DI(767) XOR DI(774) XOR DI(278) XOR DI(444) XOR DI(378) XOR DI(307) XOR DI(570) XOR DI(51) XOR DI(871) XOR DI(91) XOR DI(836) XOR DI(331) XOR DI(763) XOR DI(732) XOR DI(610) XOR DI(190) XOR DI(964) XOR DI(180) XOR DI(550) XOR DI(151) XOR DI(578) XOR DI(646) XOR DI(185) XOR DI(480) XOR DI(382) XOR DI(798) XOR DI(224) XOR DI(264) XOR DI(102) XOR DI(765) XOR DI(785) XOR DI(457) XOR DI(229) XOR DI(55) XOR DI(916) XOR DI(255) XOR DI(246) XOR DI(439) XOR DI(656) XOR DI(248) XOR DI(606) XOR DI(324) XOR DI(28) XOR DI(74) XOR DI(959) XOR DI(770) XOR DI(107) XOR DI(222) XOR DI(710) XOR DI(641) XOR DI(257) XOR DI(286) XOR DI(30) XOR DI(333) XOR DI(810) XOR DI(864) XOR DI(195) XOR DI(473) XOR DI(761) XOR DI(78) XOR DI(272) XOR DI(81) XOR DI(564) XOR DI(788) XOR DI(293) XOR DI(988) XOR DI(554) XOR DI(972) XOR DI(834) XOR DI(376) XOR DI(792) XOR DI(253) XOR DI(536) XOR DI(921) XOR DI(1006) XOR DI(779) XOR DI(717) XOR DI(451) XOR DI(165) XOR DI(743) XOR DI(739) XOR DI(442) XOR DI(240) XOR DI(730) XOR DI(231) XOR DI(477) XOR DI(806) XOR DI(396) XOR DI(626) XOR DI(650) XOR DI(242) XOR DI(600) XOR DI(318) XOR DI(890) XOR DI(405) XOR DI(608) XOR DI(935) XOR DI(506) XOR DI(72) XOR DI(32) XOR DI(295) XOR DI(598) XOR DI(139) XOR DI(899) XOR DI(407) XOR DI(342) XOR DI(159) XOR DI(808) XOR DI(508) XOR DI(269) XOR DI(234) XOR DI(471) XOR DI(390) XOR DI(873) XOR DI(644) XOR DI(312) XOR DI(985) XOR DI(1) XOR DI(386) XOR DI(648) XOR DI(112) XOR DI(176) XOR DI(26) XOR DI(552) XOR DI(669) XOR DI(364) XOR DI(707) XOR DI(380) XOR DI(455) XOR DI(943) XOR DI(459) XOR DI(141) XOR DI(129) XOR DI(1010) XOR DI(1016) XOR DI(1022) XOR DI(575) XOR DI(999) XOR DI(41) XOR DI(353) XOR DI(768) XOR DI(775) XOR DI(905) XOR DI(85) XOR DI(445) XOR DI(301) XOR DI(88) XOR DI(44) XOR DI(308) XOR DI(52) XOR DI(939) XOR DI(49) XOR DI(924) XOR DI(354) XOR DI(688) XOR DI(92) XOR DI(795) XOR DI(925) XOR DI(837) XOR DI(68) XOR DI(611) XOR DI(191) XOR DI(300) XOR DI(467) XOR DI(857) XOR DI(968) XOR DI(965) XOR DI(830) XOR DI(955) XOR DI(637) XOR DI(579) XOR DI(703) XOR DI(122) XOR DI(448) XOR DI(162) XOR DI(65) XOR DI(701) XOR DI(979) XOR DI(841) XOR DI(997) XOR DI(530) XOR DI(383) XOR DI(173) XOR DI(926) XOR DI(799) XOR DI(225) XOR DI(635) XOR DI(940) XOR DI(355) XOR DI(132) XOR DI(674) XOR DI(759) XOR DI(896) XOR DI(436) XOR DI(299) XOR DI(562) XOR DI(786) XOR DI(755) XOR DI(724) XOR DI(172) XOR DI(542) XOR DI(56) XOR DI(623) XOR DI(358) XOR DI(521) XOR DI(704) XOR DI(123) XOR DI(750) XOR DI(887) XOR DI(533) XOR DI(614) XOR DI(737) XOR DI(440) XOR DI(212) XOR DI(484) XOR DI(813) XOR DI(726) XOR DI(886) XOR DI(657) XOR DI(249) XOR DI(325) XOR DI(419) XOR DI(465) XOR DI(493) XOR DI(70) XOR DI(852) XOR DI(321) XOR DI(75) XOR DI(137) XOR DI(147) XOR DI(771) XOR DI(108) XOR DI(735) XOR DI(412) XOR DI(469) XOR DI(642) XOR DI(895) XOR DI(927) XOR DI(666) XOR DI(287) XOR DI(590) XOR DI(304) XOR DI(283) XOR DI(661) XOR DI(125) XOR DI(356) XOR DI(145) XOR DI(532) XOR DI(929) XOR DI(474) XOR DI(1014) XOR DI(993) XOR DI(79) XOR DI(39) XOR DI(38) XOR DI(302) XOR DI(565) XOR DI(43) XOR DI(348) XOR DI(789) XOR DI(831) XOR DI(410) XOR DI(727) XOR DI(42) XOR DI(851) XOR DI(555) XOR DI(824) XOR DI(432) XOR DI(146) XOR DI(631) XOR DI(573) XOR DI(156) XOR DI(214) XOR DI(991) XOR DI(491) XOR DI(219) XOR DI(970) XOR DI(537) XOR DI(349) XOR DI(1007) XOR DI(430) XOR DI(780) XOR DI(452) XOR DI(166) XOR DI(826) XOR DI(515) XOR DI(210) XOR DI(740) XOR DI(276) XOR DI(215) XOR DI(232) XOR DI(478) XOR DI(627) XOR DI(880) XOR DI(651) XOR DI(243) XOR DI(601) XOR DI(498) XOR DI(23) XOR DI(904) XOR DI(816) XOR DI(540) XOR DI(891) XOR DI(992) XOR DI(8) XOR DI(281) XOR DI(328) XOR DI(298) XOR DI(119) XOR DI(127) XOR DI(33) XOR DI(40) XOR DI(913) XOR DI(956) XOR DI(208) XOR DI(829) XOR DI(900) XOR DI(371) XOR DI(213) XOR DI(531) XOR DI(343) XOR DI(120) XOR DI(424) XOR DI(820) XOR DI(270) XOR DI(209) XOR DI(725) XOR DI(714) XOR DI(874) XOR DI(237) XOR DI(492) XOR DI(17) XOR DI(63) XOR DI(411) XOR DI(986) XOR DI(723) XOR DI(400) XOR DI(211) XOR DI(630) XOR DI(19) XOR DI(387) XOR DI(113) XOR DI(177) XOR DI(121) XOR DI(261) XOR DI(670) XOR DI(619) XOR DI(144) XOR DI(207) XOR DI(337) XOR DI(154) XOR DI(814) XOR DI(466) XOR DI(708) XOR DI(868) XOR DI(528) XOR DI(394) XOR DI(316) XOR DI(547) XOR DI(664) XOR DI(951) XOR DI(944) XOR DI(148) XOR DI(702) XOR DI(862) XOR DI(199) XOR DI(541) XOR DI(938) XOR DI(696) XOR DI(690) XOR DI(529) XOR DI(684) XOR DI(523) XOR DI(124) XOR DI(517) XOR DI(511) XOR DI(1017) XOR DI(1023); + DO(30) <= DI(352) XOR DI(585) XOR DI(767) XOR DI(774) XOR DI(278) XOR DI(866) XOR DI(444) XOR DI(87) XOR DI(378) XOR DI(335) XOR DI(307) XOR DI(570) XOR DI(977) XOR DI(557) XOR DI(51) XOR DI(923) XOR DI(687) XOR DI(871) XOR DI(91) XOR DI(794) XOR DI(836) XOR DI(67) XOR DI(331) XOR DI(415) XOR DI(974) XOR DI(763) XOR DI(732) XOR DI(610) XOR DI(47) XOR DI(104) XOR DI(190) XOR DI(839) XOR DI(560) XOR DI(967) XOR DI(964) XOR DI(753) XOR DI(180) XOR DI(550) XOR DI(954) XOR DI(151) XOR DI(578) XOR DI(447) XOR DI(161) XOR DI(603) XOR DI(646) XOR DI(700) XOR DI(3) XOR DI(185) XOR DI(908) XOR DI(366) XOR DI(480) XOR DI(911) XOR DI(996) XOR DI(382) XOR DI(496) XOR DI(588) XOR DI(798) XOR DI(259) XOR DI(224) XOR DI(634) XOR DI(6) XOR DI(712) XOR DI(264) XOR DI(102) XOR DI(187) XOR DI(131) XOR DI(673) XOR DI(1012) XOR DI(765) XOR DI(435) XOR DI(369) XOR DI(785) XOR DI(290) XOR DI(457) XOR DI(171) XOR DI(229) XOR DI(55) XOR DI(622) XOR DI(520) XOR DI(373) XOR DI(916) XOR DI(255) XOR DI(426) XOR DI(745) XOR DI(613) XOR DI(246) XOR DI(439) XOR DI(878) XOR DI(812) XOR DI(402) XOR DI(885) XOR DI(656) XOR DI(248) XOR DI(606) XOR DI(324) XOR DI(418) XOR DI(503) XOR DI(464) XOR DI(320) XOR DI(28) XOR DI(74) XOR DI(959) XOR DI(545) XOR DI(422) XOR DI(770) XOR DI(107) XOR DI(734) XOR DI(222) XOR DI(710) XOR DI(641) XOR DI(13) XOR DI(894) XOR DI(257) XOR DI(286) XOR DI(30) XOR DI(398) XOR DI(333) XOR DI(810) XOR DI(864) XOR DI(195) XOR DI(473) XOR DI(680) XOR DI(761) XOR DI(78) XOR DI(272) XOR DI(860) XOR DI(81) XOR DI(37) XOR DI(564) XOR DI(83) XOR DI(347) XOR DI(788) XOR DI(918) XOR DI(409) XOR DI(757) XOR DI(293) XOR DI(988) XOR DI(850) XOR DI(554) XOR DI(961) XOR DI(823) XOR DI(572) XOR DI(115) XOR DI(487) XOR DI(694) XOR DI(972) XOR DI(834) XOR DI(990) XOR DI(376) XOR DI(490) XOR DI(792) XOR DI(253) XOR DI(218) XOR DI(536) XOR DI(921) XOR DI(1006) XOR DI(429) XOR DI(779) XOR DI(748) XOR DI(717) XOR DI(451) XOR DI(165) XOR DI(514) XOR DI(743) XOR DI(739) XOR DI(442) XOR DI(240) XOR DI(730) XOR DI(231) XOR DI(477) XOR DI(806) XOR DI(719) XOR DI(396) XOR DI(626) XOR DI(650) XOR DI(242) XOR DI(600) XOR DI(318) XOR DI(314) XOR DI(22) XOR DI(903) XOR DI(539) XOR DI(890) XOR DI(405) XOR DI(659) XOR DI(280) XOR DI(392) XOR DI(327) XOR DI(297) XOR DI(118) XOR DI(182) XOR DI(608) XOR DI(935) XOR DI(506) XOR DI(72) XOR DI(32) XOR DI(266) XOR DI(295) XOR DI(598) XOR DI(168) XOR DI(139) XOR DI(828) XOR DI(899) XOR DI(407) XOR DI(342) XOR DI(159) XOR DI(808) XOR DI(819) XOR DI(508) XOR DI(203) XOR DI(269) XOR DI(234) XOR DI(471) XOR DI(390) XOR DI(873) XOR DI(644) XOR DI(236) XOR DI(312) XOR DI(16) XOR DI(62) XOR DI(985) XOR DI(722) XOR DI(629) XOR DI(1) XOR DI(653) XOR DI(274) XOR DI(386) XOR DI(648) XOR DI(112) XOR DI(176) XOR DI(500) XOR DI(461) XOR DI(26) XOR DI(552) XOR DI(669) XOR DI(949) XOR DI(143) XOR DI(364) XOR DI(206) XOR DI(153) XOR DI(197) XOR DI(707) XOR DI(10) XOR DI(527) XOR DI(380) XOR DI(455) XOR DI(663) XOR DI(943) XOR DI(459) XOR DI(617) XOR DI(937) XOR DI(141) XOR DI(855) XOR DI(482) XOR DI(135) XOR DI(129) XOR DI(683) XOR DI(677) XOR DI(510) XOR DI(1010) XOR DI(1016) XOR DI(1022) XOR DI(575) XOR DI(268) XOR DI(999) XOR DI(747) XOR DI(768) XOR DI(775) XOR DI(85) XOR DI(279) XOR DI(706) XOR DI(587) XOR DI(445) XOR DI(379) XOR DI(833) XOR DI(308) XOR DI(184) XOR DI(854) XOR DI(571) XOR DI(52) XOR DI(49) XOR DI(170) XOR DI(90) XOR DI(872) XOR DI(92) XOR DI(837) XOR DI(332) XOR DI(764) XOR DI(733) XOR DI(611) XOR DI(191) XOR DI(995) XOR DI(857) XOR DI(965) XOR DI(181) XOR DI(551) XOR DI(958) XOR DI(438) XOR DI(152) XOR DI(637) XOR DI(579) XOR DI(647) XOR DI(239) XOR DI(65) XOR DI(186) XOR DI(979) XOR DI(841) XOR DI(106) XOR DI(481) XOR DI(797) XOR DI(383) XOR DI(799) XOR DI(225) XOR DI(976) XOR DI(265) XOR DI(103) XOR DI(759) XOR DI(766) XOR DI(562) XOR DI(786) XOR DI(755) XOR DI(458) XOR DI(230) XOR DI(56) XOR DI(358) XOR DI(917) XOR DI(256) XOR DI(750) XOR DI(221) XOR DI(247) XOR DI(737) XOR DI(440) XOR DI(484) XOR DI(633) XOR DI(657) XOR DI(15) XOR DI(249) XOR DI(607) XOR DI(325) XOR DI(70) XOR DI(29) XOR DI(75) XOR DI(910) XOR DI(822) XOR DI(960) XOR DI(137) XOR DI(686) XOR DI(771) XOR DI(108) XOR DI(223) XOR DI(469) XOR DI(711) XOR DI(642) XOR DI(666) XOR DI(258) XOR DI(287) XOR DI(31) XOR DI(590) XOR DI(616) XOR DI(334) XOR DI(811) XOR DI(428) XOR DI(865) XOR DI(304) XOR DI(283) XOR DI(544) XOR DI(661) XOR DI(189) XOR DI(196) XOR DI(942) XOR DI(513) XOR DI(929) XOR DI(474) XOR DI(502) XOR DI(1014) XOR DI(762) XOR DI(79) XOR DI(273) XOR DI(82) XOR DI(330) XOR DI(323) XOR DI(565) XOR DI(46) XOR DI(164) XOR DI(682) XOR DI(789) XOR DI(605) XOR DI(294) XOR DI(989) XOR DI(555) XOR DI(175) XOR DI(432) XOR DI(351) XOR DI(156) XOR DI(973) XOR DI(835) XOR DI(679) XOR DI(414) XOR DI(377) XOR DI(920) XOR DI(793) XOR DI(254) XOR DI(970) XOR DI(537) XOR DI(922) XOR DI(1007) XOR DI(780) XOR DI(718) XOR DI(452) XOR DI(166) XOR DI(826) XOR DI(368) XOR DI(117) XOR DI(744) XOR DI(421) XOR DI(740) XOR DI(276) XOR DI(443) XOR DI(241) XOR DI(731) XOR DI(232) XOR DI(478) XOR DI(807) XOR DI(397) XOR DI(627) XOR DI(880) XOR DI(651) XOR DI(243) XOR DI(601) XOR DI(319) XOR DI(498) XOR DI(816) XOR DI(417) XOR DI(891) XOR DI(729) XOR DI(406) XOR DI(217) XOR DI(463) XOR DI(8) XOR DI(889) XOR DI(25) XOR DI(655) XOR DI(609) XOR DI(936) XOR DI(507) XOR DI(127) XOR DI(73) XOR DI(33) XOR DI(296) XOR DI(559) XOR DI(676) XOR DI(913) XOR DI(404) XOR DI(963) XOR DI(721) XOR DI(599) XOR DI(140) XOR DI(625) XOR DI(150) XOR DI(900) XOR DI(408) XOR DI(371) XOR DI(343) XOR DI(424) XOR DI(160) XOR DI(809) XOR DI(509) XOR DI(270) XOR DI(235) XOR DI(472) XOR DI(714) XOR DI(391) XOR DI(874) XOR DI(645) XOR DI(313) XOR DI(898) XOR DI(986) XOR DI(400) XOR DI(2) XOR DI(12) XOR DI(19) XOR DI(387) XOR DI(292) XOR DI(649) XOR DI(113) XOR DI(177) XOR DI(27) XOR DI(261) XOR DI(553) XOR DI(670) XOR DI(907) XOR DI(134) XOR DI(619) XOR DI(365) XOR DI(337) XOR DI(708) XOR DI(868) XOR DI(394) XOR DI(205) XOR DI(381) XOR DI(316) XOR DI(495) XOR DI(456) XOR DI(547) XOR DI(951) XOR DI(944) XOR DI(460) XOR DI(862) XOR DI(5) XOR DI(199) XOR DI(375) XOR DI(489) XOR DI(450) XOR DI(142) XOR DI(696) XOR DI(535) XOR DI(690) XOR DI(130) XOR DI(523) XOR DI(517) XOR DI(505) XOR DI(1011) XOR DI(1017) XOR DI(1023); + DO(31) <= DI(575) XOR DI(268) XOR DI(999) XOR DI(41) XOR DI(747) XOR DI(353) XOR DI(586) XOR DI(768) XOR DI(775) XOR DI(905) XOR DI(85) XOR DI(45) XOR DI(279) XOR DI(867) XOR DI(706) XOR DI(587) XOR DI(445) XOR DI(301) XOR DI(88) XOR DI(379) XOR DI(336) XOR DI(833) XOR DI(994) XOR DI(329) XOR DI(44) XOR DI(796) XOR DI(308) XOR DI(184) XOR DI(854) XOR DI(571) XOR DI(978) XOR DI(558) XOR DI(52) XOR DI(89) XOR DI(939) XOR DI(49) XOR DI(170) XOR DI(90) XOR DI(924) XOR DI(354) XOR DI(688) XOR DI(872) XOR DI(92) XOR DI(574) XOR DI(795) XOR DI(925) XOR DI(837) XOR DI(68) XOR DI(332) XOR DI(416) XOR DI(975) XOR DI(764) XOR DI(733) XOR DI(611) XOR DI(48) XOR DI(105) XOR DI(191) XOR DI(300) XOR DI(840) XOR DI(467) XOR DI(995) XOR DI(857) XOR DI(561) XOR DI(968) XOR DI(965) XOR DI(754) XOR DI(181) XOR DI(830) XOR DI(551) XOR DI(958) XOR DI(955) XOR DI(438) XOR DI(152) XOR DI(637) XOR DI(357) XOR DI(579) XOR DI(703) XOR DI(122) XOR DI(448) XOR DI(162) XOR DI(220) XOR DI(736) XOR DI(604) XOR DI(647) XOR DI(239) XOR DI(494) XOR DI(65) XOR DI(701) XOR DI(632) XOR DI(4) XOR DI(186) XOR DI(909) XOR DI(979) XOR DI(841) XOR DI(106) XOR DI(685) XOR DI(367) XOR DI(481) XOR DI(912) XOR DI(997) XOR DI(420) XOR DI(797) XOR DI(530) XOR DI(383) XOR DI(173) XOR DI(926) XOR DI(497) XOR DI(589) XOR DI(799) XOR DI(260) XOR DI(225) XOR DI(635) XOR DI(303) XOR DI(7) XOR DI(976) XOR DI(713) XOR DI(265) XOR DI(103) XOR DI(543) XOR DI(940) XOR DI(355) XOR DI(188) XOR DI(928) XOR DI(132) XOR DI(674) XOR DI(1013) XOR DI(759) XOR DI(766) XOR DI(896) XOR DI(436) XOR DI(370) XOR DI(299) XOR DI(562) XOR DI(786) XOR DI(755) XOR DI(724) XOR DI(291) XOR DI(458) XOR DI(172) XOR DI(821) XOR DI(542) XOR DI(230) XOR DI(56) XOR DI(623) XOR DI(832) XOR DI(358) XOR DI(521) XOR DI(374) XOR DI(917) XOR DI(216) XOR DI(704) XOR DI(256) XOR DI(123) XOR DI(665) XOR DI(750) XOR DI(887) XOR DI(427) XOR DI(746) XOR DI(282) XOR DI(449) XOR DI(533) XOR DI(221) XOR DI(614) XOR DI(512) XOR DI(247) XOR DI(737) XOR DI(440) XOR DI(212) XOR DI(238) XOR DI(728) XOR DI(879) XOR DI(484) XOR DI(813) XOR DI(888) XOR DI(726) XOR DI(403) XOR DI(633) XOR DI(886) XOR DI(657) XOR DI(15) XOR DI(249) XOR DI(607) XOR DI(325) XOR DI(419) XOR DI(504) XOR DI(465) XOR DI(493) XOR DI(70) XOR DI(852) XOR DI(321) XOR DI(29) XOR DI(155) XOR DI(75) XOR DI(910) XOR DI(822) XOR DI(960) XOR DI(546) XOR DI(423) XOR DI(137) XOR DI(147) XOR DI(686) XOR DI(897) XOR DI(998) XOR DI(771) XOR DI(108) XOR DI(735) XOR DI(412) XOR DI(223) XOR DI(469) XOR DI(711) XOR DI(642) XOR DI(14) XOR DI(895) XOR DI(174) XOR DI(927) XOR DI(666) XOR DI(24) XOR DI(258) XOR DI(287) XOR DI(31) XOR DI(590) XOR DI(616) XOR DI(399) XOR DI(334) XOR DI(811) XOR DI(428) XOR DI(865) XOR DI(304) XOR DI(283) XOR DI(544) XOR DI(661) XOR DI(941) XOR DI(125) XOR DI(356) XOR DI(145) XOR DI(189) XOR DI(196) XOR DI(615) XOR DI(942) XOR DI(853) XOR DI(513) XOR DI(532) XOR DI(929) XOR DI(133) XOR DI(474) XOR DI(681) XOR DI(502) XOR DI(1014) XOR DI(993) XOR DI(762) XOR DI(79) XOR DI(39) XOR DI(273) XOR DI(861) XOR DI(82) XOR DI(330) XOR DI(323) XOR DI(38) XOR DI(302) XOR DI(565) XOR DI(46) XOR DI(43) XOR DI(164) XOR DI(84) XOR DI(348) XOR DI(682) XOR DI(789) XOR DI(919) XOR DI(831) XOR DI(410) XOR DI(969) XOR DI(758) XOR DI(727) XOR DI(605) XOR DI(42) XOR DI(294) XOR DI(989) XOR DI(851) XOR DI(555) XOR DI(962) XOR DI(175) XOR DI(824) XOR DI(432) XOR DI(146) XOR DI(631) XOR DI(351) XOR DI(573) XOR DI(116) XOR DI(156) XOR DI(214) XOR DI(488) XOR DI(695) XOR DI(973) XOR DI(835) XOR DI(679) XOR DI(906) XOR DI(991) XOR DI(414) XOR DI(377) XOR DI(920) XOR DI(491) XOR DI(793) XOR DI(254) XOR DI(219) XOR DI(970) XOR DI(537) XOR DI(349) XOR DI(922) XOR DI(126) XOR DI(1007) XOR DI(430) XOR DI(780) XOR DI(749) XOR DI(718) XOR DI(452) XOR DI(166) XOR DI(815) XOR DI(826) XOR DI(515) XOR DI(368) XOR DI(210) XOR DI(117) XOR DI(744) XOR DI(421) XOR DI(740) XOR DI(276) XOR DI(443) XOR DI(215) XOR DI(241) XOR DI(731) XOR DI(232) XOR DI(478) XOR DI(807) XOR DI(720) XOR DI(397) XOR DI(627) XOR DI(880) XOR DI(651) XOR DI(243) XOR DI(601) XOR DI(319) XOR DI(413) XOR DI(498) XOR DI(64) XOR DI(315) XOR DI(23) XOR DI(149) XOR DI(69) XOR DI(904) XOR DI(816) XOR DI(540) XOR DI(417) XOR DI(891) XOR DI(992) XOR DI(729) XOR DI(406) XOR DI(217) XOR DI(463) XOR DI(705) XOR DI(636) XOR DI(8) XOR DI(889) XOR DI(660) XOR DI(18) XOR DI(281) XOR DI(25) XOR DI(393) XOR DI(328) XOR DI(298) XOR DI(655) XOR DI(119) XOR DI(350) XOR DI(183) XOR DI(609) XOR DI(936) XOR DI(507) XOR DI(127) XOR DI(468) XOR DI(675) XOR DI(73) XOR DI(33) XOR DI(267) XOR DI(296) XOR DI(559) XOR DI(40) XOR DI(676) XOR DI(913) XOR DI(825) XOR DI(404) XOR DI(963) XOR DI(721) XOR DI(599) XOR DI(956) XOR DI(169) XOR DI(140) XOR DI(625) XOR DI(150) XOR DI(208) XOR DI(689) XOR DI(829) XOR DI(900) XOR DI(408) XOR DI(371) XOR DI(213) XOR DI(531) XOR DI(343) XOR DI(120) XOR DI(424) XOR DI(160) XOR DI(809) XOR DI(820) XOR DI(509) XOR DI(204) XOR DI(270) XOR DI(437) XOR DI(209) XOR DI(235) XOR DI(725) XOR DI(472) XOR DI(714) XOR DI(391) XOR DI(874) XOR DI(645) XOR DI(237) XOR DI(313) XOR DI(492) XOR DI(17) XOR DI(63) XOR DI(898) XOR DI(534) XOR DI(411) XOR DI(986) XOR DI(723) XOR DI(400) XOR DI(211) XOR DI(630) XOR DI(2) XOR DI(654) XOR DI(12) XOR DI(275) XOR DI(19) XOR DI(387) XOR DI(322) XOR DI(292) XOR DI(649) XOR DI(113) XOR DI(177) XOR DI(501) XOR DI(121) XOR DI(462) XOR DI(27) XOR DI(261) XOR DI(553) XOR DI(670) XOR DI(907) XOR DI(957) XOR DI(950) XOR DI(163) XOR DI(134) XOR DI(619) XOR DI(144) XOR DI(365) XOR DI(207) XOR DI(337) XOR DI(154) XOR DI(814) XOR DI(198) XOR DI(431) XOR DI(466) XOR DI(708) XOR DI(868) XOR DI(11) XOR DI(528) XOR DI(394) XOR DI(205) XOR DI(624) XOR DI(381) XOR DI(316) XOR DI(495) XOR DI(456) XOR DI(547) XOR DI(664) XOR DI(951) XOR DI(944) XOR DI(148) XOR DI(460) XOR DI(702) XOR DI(862) XOR DI(5) XOR DI(522) XOR DI(199) XOR DI(618) XOR DI(375) XOR DI(489) XOR DI(450) XOR DI(541) XOR DI(938) XOR DI(142) XOR DI(696) XOR DI(856) XOR DI(516) XOR DI(483) XOR DI(535) XOR DI(136) XOR DI(690) XOR DI(529) XOR DI(130) XOR DI(684) XOR DI(523) XOR DI(124) XOR DI(678) XOR DI(517) XOR DI(511) XOR DI(505) XOR DI(1011) XOR DI(1017) XOR DI(1023); +end architecture; \ No newline at end of file Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast128_tab.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast128_tab.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast128_tab.vhd (revision 3) @@ -0,0 +1,92 @@ +-- +-- crc32_fast128_tab.vhd: A 32-bit CRC (IEEE) table for processing fixed 128 bits in parallel +-- Copyright (C) 2011 CESNET +-- Author(s): Lukas Kekely +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in +-- the documentation and/or other materials provided with the +-- distribution. +-- 3. Neither the name of the Company nor the names of its contributors +-- may be used to endorse or promote products derived from this +-- software without specific prior written permission. +-- +-- This software is provided ``as is'', and any express or implied +-- warranties, including, but not limited to, the implied warranties of +-- merchantability and fitness for a particular purpose are disclaimed. +-- In no event shall the company or contributors be liable for any +-- direct, indirect, incidental, special, exemplary, or consequential +-- damages (including, but not limited to, procurement of substitute +-- goods or services; loss of use, data, or profits; or business +-- interruption) however caused and on any theory of liability, whether +-- in contract, strict liability, or tort (including negligence or +-- otherwise) arising in any way out of the use of this software, even +-- if advised of the possibility of such damage. +-- +-- $Id$ +-- +-- TODO: +-- +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; +use IEEE.std_logic_unsigned.all; +use IEEE.numeric_std.all; +use WORK.math_pack.all; +-- ---------------------------------------------------------------------------- +-- Entity declaration +-- ---------------------------------------------------------------------------- +entity crc32_fast128_tab is + port( + DI : in std_logic_vector(128-1 downto 0); + DO : out std_logic_vector(31 downto 0) + ); +end entity crc32_fast128_tab; + +-- ---------------------------------------------------------------------------- +-- Architecture declaration +-- ---------------------------------------------------------------------------- +architecture arch of crc32_fast128_tab is +begin +-- 32-bit CRC equations processing 128 bits in parallel (VHDL code) +-- Generator polynomial: 0x104C11DB7 + DO(0) <= DI(104) XOR DI(10) XOR DI(99) XOR DI(83) XOR DI(44) XOR DI(29) XOR DI(30) XOR DI(80) XOR DI(100) XOR DI(73) XOR DI(70) XOR DI(63) XOR DI(60) XOR DI(14) XOR DI(84) XOR DI(17) XOR DI(102) XOR DI(31) XOR DI(81) XOR DI(45) XOR DI(33) XOR DI(118) XOR DI(1) XOR DI(22) XOR DI(15) XOR DI(65) XOR DI(2) XOR DI(103) XOR DI(0) XOR DI(32) XOR DI(46) XOR DI(47) XOR DI(34) XOR DI(119) XOR DI(98) XOR DI(24) XOR DI(74) XOR DI(94) XOR DI(67) XOR DI(78) XOR DI(11) XOR DI(96) XOR DI(25) XOR DI(75) XOR DI(27) XOR DI(112) XOR DI(9) XOR DI(97) XOR DI(41) XOR DI(18) XOR DI(68) XOR DI(61) XOR DI(5) XOR DI(3) XOR DI(91) XOR DI(12) XOR DI(62) XOR DI(55) XOR DI(56) XOR DI(49) XOR DI(43) XOR DI(116) XOR DI(122); + DO(1) <= DI(105) XOR DI(11) XOR DI(100) XOR DI(84) XOR DI(45) XOR DI(30) XOR DI(31) XOR DI(81) XOR DI(101) XOR DI(74) XOR DI(71) XOR DI(64) XOR DI(61) XOR DI(15) XOR DI(85) XOR DI(18) XOR DI(103) XOR DI(32) XOR DI(82) XOR DI(46) XOR DI(34) XOR DI(119) XOR DI(2) XOR DI(23) XOR DI(16) XOR DI(66) XOR DI(3) XOR DI(104) XOR DI(1) XOR DI(33) XOR DI(47) XOR DI(48) XOR DI(35) XOR DI(120) XOR DI(99) XOR DI(25) XOR DI(75) XOR DI(95) XOR DI(68) XOR DI(79) XOR DI(12) XOR DI(97) XOR DI(26) XOR DI(76) XOR DI(28) XOR DI(113) XOR DI(10) XOR DI(98) XOR DI(42) XOR DI(19) XOR DI(69) XOR DI(62) XOR DI(6) XOR DI(4) XOR DI(92) XOR DI(13) XOR DI(63) XOR DI(56) XOR DI(57) XOR DI(50) XOR DI(44) XOR DI(117) XOR DI(123); + DO(2) <= DI(106) XOR DI(12) XOR DI(101) XOR DI(85) XOR DI(46) XOR DI(31) XOR DI(32) XOR DI(82) XOR DI(102) XOR DI(75) XOR DI(72) XOR DI(65) XOR DI(62) XOR DI(16) XOR DI(86) XOR DI(19) XOR DI(104) XOR DI(33) XOR DI(83) XOR DI(47) XOR DI(35) XOR DI(120) XOR DI(3) XOR DI(24) XOR DI(17) XOR DI(67) XOR DI(4) XOR DI(105) XOR DI(2) XOR DI(34) XOR DI(48) XOR DI(49) XOR DI(36) XOR DI(121) XOR DI(100) XOR DI(26) XOR DI(76) XOR DI(96) XOR DI(69) XOR DI(80) XOR DI(13) XOR DI(98) XOR DI(27) XOR DI(77) XOR DI(29) XOR DI(114) XOR DI(11) XOR DI(99) XOR DI(43) XOR DI(20) XOR DI(70) XOR DI(63) XOR DI(7) XOR DI(5) XOR DI(93) XOR DI(14) XOR DI(64) XOR DI(57) XOR DI(58) XOR DI(51) XOR DI(45) XOR DI(118) XOR DI(124); + DO(3) <= DI(107) XOR DI(13) XOR DI(102) XOR DI(86) XOR DI(47) XOR DI(32) XOR DI(33) XOR DI(83) XOR DI(103) XOR DI(76) XOR DI(73) XOR DI(66) XOR DI(63) XOR DI(17) XOR DI(87) XOR DI(20) XOR DI(105) XOR DI(34) XOR DI(84) XOR DI(48) XOR DI(36) XOR DI(121) XOR DI(4) XOR DI(25) XOR DI(18) XOR DI(68) XOR DI(5) XOR DI(106) XOR DI(3) XOR DI(35) XOR DI(49) XOR DI(50) XOR DI(37) XOR DI(122) XOR DI(101) XOR DI(27) XOR DI(77) XOR DI(97) XOR DI(70) XOR DI(81) XOR DI(14) XOR DI(99) XOR DI(28) XOR DI(78) XOR DI(30) XOR DI(115) XOR DI(12) XOR DI(100) XOR DI(44) XOR DI(21) XOR DI(71) XOR DI(64) XOR DI(8) XOR DI(6) XOR DI(94) XOR DI(15) XOR DI(65) XOR DI(58) XOR DI(59) XOR DI(52) XOR DI(46) XOR DI(119) XOR DI(125); + DO(4) <= DI(108) XOR DI(14) XOR DI(103) XOR DI(87) XOR DI(48) XOR DI(33) XOR DI(34) XOR DI(84) XOR DI(104) XOR DI(77) XOR DI(74) XOR DI(67) XOR DI(64) XOR DI(18) XOR DI(88) XOR DI(21) XOR DI(106) XOR DI(35) XOR DI(85) XOR DI(49) XOR DI(37) XOR DI(122) XOR DI(5) XOR DI(26) XOR DI(19) XOR DI(69) XOR DI(6) XOR DI(107) XOR DI(4) XOR DI(36) XOR DI(50) XOR DI(51) XOR DI(38) XOR DI(123) XOR DI(102) XOR DI(28) XOR DI(78) XOR DI(98) XOR DI(71) XOR DI(82) XOR DI(15) XOR DI(100) XOR DI(29) XOR DI(79) XOR DI(31) XOR DI(116) XOR DI(13) XOR DI(0) XOR DI(101) XOR DI(45) XOR DI(22) XOR DI(72) XOR DI(65) XOR DI(9) XOR DI(7) XOR DI(95) XOR DI(16) XOR DI(66) XOR DI(59) XOR DI(60) XOR DI(53) XOR DI(47) XOR DI(120) XOR DI(126); + DO(5) <= DI(109) XOR DI(15) XOR DI(104) XOR DI(88) XOR DI(49) XOR DI(34) XOR DI(35) XOR DI(85) XOR DI(105) XOR DI(78) XOR DI(75) XOR DI(68) XOR DI(65) XOR DI(19) XOR DI(89) XOR DI(22) XOR DI(107) XOR DI(36) XOR DI(86) XOR DI(50) XOR DI(38) XOR DI(123) XOR DI(6) XOR DI(27) XOR DI(20) XOR DI(70) XOR DI(7) XOR DI(108) XOR DI(5) XOR DI(37) XOR DI(51) XOR DI(52) XOR DI(39) XOR DI(124) XOR DI(103) XOR DI(29) XOR DI(79) XOR DI(99) XOR DI(72) XOR DI(83) XOR DI(16) XOR DI(101) XOR DI(30) XOR DI(80) XOR DI(32) XOR DI(117) XOR DI(14) XOR DI(1) XOR DI(102) XOR DI(46) XOR DI(23) XOR DI(73) XOR DI(66) XOR DI(10) XOR DI(8) XOR DI(96) XOR DI(17) XOR DI(67) XOR DI(60) XOR DI(61) XOR DI(54) XOR DI(48) XOR DI(121) XOR DI(127); + DO(6) <= DI(110) XOR DI(16) XOR DI(3) XOR DI(32) XOR DI(105) XOR DI(83) XOR DI(89) XOR DI(34) XOR DI(50) XOR DI(35) XOR DI(36) XOR DI(86) XOR DI(106) XOR DI(79) XOR DI(25) XOR DI(76) XOR DI(69) XOR DI(66) XOR DI(56) XOR DI(10) XOR DI(98) XOR DI(20) XOR DI(90) XOR DI(63) XOR DI(23) XOR DI(108) XOR DI(5) XOR DI(37) XOR DI(1) XOR DI(87) XOR DI(51) XOR DI(45) XOR DI(39) XOR DI(112) XOR DI(124) XOR DI(7) XOR DI(96) XOR DI(41) XOR DI(27) XOR DI(70) XOR DI(60) XOR DI(14) XOR DI(99) XOR DI(28) XOR DI(78) XOR DI(12) XOR DI(29) XOR DI(43) XOR DI(44) XOR DI(116) XOR DI(21) XOR DI(71) XOR DI(91) XOR DI(75) XOR DI(8) XOR DI(22) XOR DI(109) XOR DI(6) XOR DI(94) XOR DI(38) XOR DI(65) XOR DI(52) XOR DI(53) XOR DI(46) XOR DI(40) XOR DI(119) XOR DI(125); + DO(7) <= DI(111) XOR DI(17) XOR DI(4) XOR DI(33) XOR DI(106) XOR DI(84) XOR DI(90) XOR DI(35) XOR DI(51) XOR DI(36) XOR DI(37) XOR DI(87) XOR DI(107) XOR DI(80) XOR DI(26) XOR DI(77) XOR DI(70) XOR DI(67) XOR DI(57) XOR DI(11) XOR DI(99) XOR DI(21) XOR DI(91) XOR DI(64) XOR DI(24) XOR DI(109) XOR DI(6) XOR DI(38) XOR DI(2) XOR DI(88) XOR DI(52) XOR DI(46) XOR DI(40) XOR DI(113) XOR DI(125) XOR DI(8) XOR DI(97) XOR DI(42) XOR DI(28) XOR DI(71) XOR DI(61) XOR DI(15) XOR DI(100) XOR DI(29) XOR DI(79) XOR DI(13) XOR DI(0) XOR DI(30) XOR DI(44) XOR DI(45) XOR DI(117) XOR DI(22) XOR DI(72) XOR DI(92) XOR DI(76) XOR DI(9) XOR DI(23) XOR DI(110) XOR DI(7) XOR DI(95) XOR DI(39) XOR DI(66) XOR DI(53) XOR DI(54) XOR DI(47) XOR DI(41) XOR DI(120) XOR DI(126); + DO(8) <= DI(112) XOR DI(18) XOR DI(5) XOR DI(34) XOR DI(107) XOR DI(85) XOR DI(91) XOR DI(36) XOR DI(52) XOR DI(37) XOR DI(38) XOR DI(88) XOR DI(108) XOR DI(81) XOR DI(27) XOR DI(78) XOR DI(71) XOR DI(68) XOR DI(58) XOR DI(12) XOR DI(100) XOR DI(22) XOR DI(92) XOR DI(65) XOR DI(25) XOR DI(110) XOR DI(7) XOR DI(39) XOR DI(3) XOR DI(89) XOR DI(53) XOR DI(47) XOR DI(41) XOR DI(114) XOR DI(126) XOR DI(9) XOR DI(98) XOR DI(43) XOR DI(29) XOR DI(72) XOR DI(62) XOR DI(16) XOR DI(101) XOR DI(30) XOR DI(80) XOR DI(0) XOR DI(14) XOR DI(1) XOR DI(31) XOR DI(45) XOR DI(46) XOR DI(118) XOR DI(23) XOR DI(73) XOR DI(93) XOR DI(77) XOR DI(10) XOR DI(24) XOR DI(111) XOR DI(8) XOR DI(96) XOR DI(40) XOR DI(67) XOR DI(54) XOR DI(55) XOR DI(48) XOR DI(42) XOR DI(121) XOR DI(127); + DO(9) <= DI(75) XOR DI(113) XOR DI(65) XOR DI(12) XOR DI(100) XOR DI(104) XOR DI(116) XOR DI(19) XOR DI(6) XOR DI(70) XOR DI(35) XOR DI(108) XOR DI(86) XOR DI(3) XOR DI(92) XOR DI(37) XOR DI(22) XOR DI(53) XOR DI(38) XOR DI(39) XOR DI(27) XOR DI(91) XOR DI(89) XOR DI(18) XOR DI(34) XOR DI(84) XOR DI(5) XOR DI(109) XOR DI(103) XOR DI(98) XOR DI(82) XOR DI(28) XOR DI(29) XOR DI(79) XOR DI(72) XOR DI(69) XOR DI(62) XOR DI(59) XOR DI(13) XOR DI(83) XOR DI(101) XOR DI(80) XOR DI(14) XOR DI(45) XOR DI(33) XOR DI(118) XOR DI(23) XOR DI(93) XOR DI(66) XOR DI(26) XOR DI(111) XOR DI(8) XOR DI(96) XOR DI(40) XOR DI(67) XOR DI(60) XOR DI(4) XOR DI(90) XOR DI(61) XOR DI(54) XOR DI(48) XOR DI(42) XOR DI(115) XOR DI(127); + DO(10) <= DI(103) XOR DI(76) XOR DI(47) XOR DI(114) XOR DI(10) XOR DI(66) XOR DI(100) XOR DI(13) XOR DI(101) XOR DI(44) XOR DI(32) XOR DI(105) XOR DI(117) XOR DI(20) XOR DI(7) XOR DI(71) XOR DI(22) XOR DI(36) XOR DI(109) XOR DI(1) XOR DI(65) XOR DI(17) XOR DI(87) XOR DI(31) XOR DI(2) XOR DI(45) XOR DI(33) XOR DI(118) XOR DI(98) XOR DI(4) XOR DI(93) XOR DI(38) XOR DI(23) XOR DI(74) XOR DI(54) XOR DI(78) XOR DI(11) XOR DI(96) XOR DI(25) XOR DI(75) XOR DI(39) XOR DI(40) XOR DI(28) XOR DI(92) XOR DI(18) XOR DI(90) XOR DI(19) XOR DI(3) XOR DI(35) XOR DI(12) XOR DI(85) XOR DI(6) XOR DI(56) XOR DI(110) XOR DI(122); + DO(11) <= DI(104) XOR DI(77) XOR DI(48) XOR DI(115) XOR DI(11) XOR DI(67) XOR DI(101) XOR DI(14) XOR DI(102) XOR DI(45) XOR DI(33) XOR DI(106) XOR DI(118) XOR DI(21) XOR DI(8) XOR DI(72) XOR DI(23) XOR DI(37) XOR DI(110) XOR DI(2) XOR DI(66) XOR DI(18) XOR DI(88) XOR DI(32) XOR DI(3) XOR DI(46) XOR DI(34) XOR DI(119) XOR DI(99) XOR DI(5) XOR DI(94) XOR DI(39) XOR DI(24) XOR DI(75) XOR DI(55) XOR DI(79) XOR DI(12) XOR DI(97) XOR DI(26) XOR DI(76) XOR DI(40) XOR DI(41) XOR DI(29) XOR DI(93) XOR DI(19) XOR DI(91) XOR DI(20) XOR DI(4) XOR DI(36) XOR DI(13) XOR DI(86) XOR DI(7) XOR DI(57) XOR DI(111) XOR DI(123); + DO(12) <= DI(105) XOR DI(78) XOR DI(49) XOR DI(116) XOR DI(12) XOR DI(68) XOR DI(102) XOR DI(15) XOR DI(103) XOR DI(0) XOR DI(46) XOR DI(34) XOR DI(107) XOR DI(119) XOR DI(22) XOR DI(9) XOR DI(73) XOR DI(24) XOR DI(38) XOR DI(111) XOR DI(3) XOR DI(67) XOR DI(19) XOR DI(89) XOR DI(33) XOR DI(4) XOR DI(47) XOR DI(35) XOR DI(120) XOR DI(100) XOR DI(6) XOR DI(95) XOR DI(40) XOR DI(25) XOR DI(76) XOR DI(56) XOR DI(80) XOR DI(13) XOR DI(98) XOR DI(27) XOR DI(77) XOR DI(41) XOR DI(42) XOR DI(30) XOR DI(94) XOR DI(20) XOR DI(92) XOR DI(21) XOR DI(5) XOR DI(37) XOR DI(14) XOR DI(87) XOR DI(8) XOR DI(58) XOR DI(112) XOR DI(124); + DO(13) <= DI(106) XOR DI(79) XOR DI(50) XOR DI(117) XOR DI(13) XOR DI(69) XOR DI(103) XOR DI(16) XOR DI(104) XOR DI(1) XOR DI(47) XOR DI(35) XOR DI(108) XOR DI(120) XOR DI(23) XOR DI(10) XOR DI(74) XOR DI(25) XOR DI(39) XOR DI(112) XOR DI(4) XOR DI(68) XOR DI(20) XOR DI(90) XOR DI(34) XOR DI(5) XOR DI(48) XOR DI(36) XOR DI(121) XOR DI(101) XOR DI(7) XOR DI(96) XOR DI(41) XOR DI(26) XOR DI(77) XOR DI(57) XOR DI(81) XOR DI(14) XOR DI(99) XOR DI(28) XOR DI(78) XOR DI(42) XOR DI(43) XOR DI(31) XOR DI(95) XOR DI(21) XOR DI(93) XOR DI(22) XOR DI(6) XOR DI(38) XOR DI(15) XOR DI(88) XOR DI(9) XOR DI(59) XOR DI(113) XOR DI(125); + DO(14) <= DI(107) XOR DI(80) XOR DI(51) XOR DI(118) XOR DI(14) XOR DI(70) XOR DI(104) XOR DI(17) XOR DI(105) XOR DI(2) XOR DI(48) XOR DI(36) XOR DI(109) XOR DI(121) XOR DI(24) XOR DI(11) XOR DI(75) XOR DI(26) XOR DI(40) XOR DI(113) XOR DI(5) XOR DI(69) XOR DI(21) XOR DI(91) XOR DI(35) XOR DI(6) XOR DI(49) XOR DI(37) XOR DI(122) XOR DI(102) XOR DI(8) XOR DI(97) XOR DI(42) XOR DI(27) XOR DI(78) XOR DI(58) XOR DI(82) XOR DI(15) XOR DI(100) XOR DI(29) XOR DI(79) XOR DI(43) XOR DI(44) XOR DI(32) XOR DI(96) XOR DI(22) XOR DI(94) XOR DI(23) XOR DI(7) XOR DI(39) XOR DI(16) XOR DI(89) XOR DI(10) XOR DI(60) XOR DI(114) XOR DI(126); + DO(15) <= DI(108) XOR DI(81) XOR DI(52) XOR DI(119) XOR DI(15) XOR DI(71) XOR DI(105) XOR DI(18) XOR DI(106) XOR DI(3) XOR DI(49) XOR DI(37) XOR DI(110) XOR DI(122) XOR DI(25) XOR DI(12) XOR DI(76) XOR DI(27) XOR DI(41) XOR DI(114) XOR DI(6) XOR DI(70) XOR DI(22) XOR DI(92) XOR DI(36) XOR DI(7) XOR DI(50) XOR DI(38) XOR DI(123) XOR DI(103) XOR DI(9) XOR DI(98) XOR DI(43) XOR DI(28) XOR DI(79) XOR DI(59) XOR DI(83) XOR DI(16) XOR DI(101) XOR DI(30) XOR DI(80) XOR DI(44) XOR DI(0) XOR DI(45) XOR DI(33) XOR DI(97) XOR DI(23) XOR DI(95) XOR DI(24) XOR DI(8) XOR DI(40) XOR DI(17) XOR DI(90) XOR DI(11) XOR DI(61) XOR DI(115) XOR DI(127); + DO(16) <= DI(109) XOR DI(15) XOR DI(103) XOR DI(32) XOR DI(82) XOR DI(119) XOR DI(2) XOR DI(33) XOR DI(53) XOR DI(83) XOR DI(47) XOR DI(120) XOR DI(67) XOR DI(16) XOR DI(72) XOR DI(106) XOR DI(3) XOR DI(49) XOR DI(122) XOR DI(78) XOR DI(75) XOR DI(68) XOR DI(65) XOR DI(55) XOR DI(97) XOR DI(19) XOR DI(73) XOR DI(22) XOR DI(107) XOR DI(4) XOR DI(50) XOR DI(38) XOR DI(111) XOR DI(123) XOR DI(100) XOR DI(26) XOR DI(56) XOR DI(13) XOR DI(27) XOR DI(77) XOR DI(11) XOR DI(61) XOR DI(28) XOR DI(42) XOR DI(43) XOR DI(30) XOR DI(115) XOR DI(94) XOR DI(70) XOR DI(63) XOR DI(74) XOR DI(7) XOR DI(71) XOR DI(23) XOR DI(5) XOR DI(93) XOR DI(37) XOR DI(14) XOR DI(8) XOR DI(51) XOR DI(39) XOR DI(112) XOR DI(118) XOR DI(124); + DO(17) <= DI(110) XOR DI(16) XOR DI(104) XOR DI(33) XOR DI(83) XOR DI(120) XOR DI(3) XOR DI(34) XOR DI(54) XOR DI(84) XOR DI(48) XOR DI(121) XOR DI(68) XOR DI(17) XOR DI(73) XOR DI(107) XOR DI(4) XOR DI(50) XOR DI(123) XOR DI(79) XOR DI(76) XOR DI(69) XOR DI(66) XOR DI(56) XOR DI(98) XOR DI(20) XOR DI(74) XOR DI(23) XOR DI(108) XOR DI(5) XOR DI(51) XOR DI(39) XOR DI(112) XOR DI(124) XOR DI(101) XOR DI(27) XOR DI(57) XOR DI(14) XOR DI(28) XOR DI(78) XOR DI(12) XOR DI(62) XOR DI(29) XOR DI(43) XOR DI(44) XOR DI(31) XOR DI(116) XOR DI(95) XOR DI(71) XOR DI(64) XOR DI(75) XOR DI(8) XOR DI(72) XOR DI(24) XOR DI(6) XOR DI(94) XOR DI(38) XOR DI(15) XOR DI(9) XOR DI(52) XOR DI(40) XOR DI(113) XOR DI(119) XOR DI(125); + DO(18) <= DI(111) XOR DI(17) XOR DI(105) XOR DI(34) XOR DI(84) XOR DI(121) XOR DI(4) XOR DI(35) XOR DI(55) XOR DI(85) XOR DI(49) XOR DI(122) XOR DI(69) XOR DI(18) XOR DI(74) XOR DI(108) XOR DI(5) XOR DI(51) XOR DI(124) XOR DI(80) XOR DI(77) XOR DI(70) XOR DI(67) XOR DI(57) XOR DI(99) XOR DI(21) XOR DI(75) XOR DI(24) XOR DI(109) XOR DI(6) XOR DI(52) XOR DI(40) XOR DI(113) XOR DI(125) XOR DI(102) XOR DI(28) XOR DI(58) XOR DI(15) XOR DI(29) XOR DI(79) XOR DI(13) XOR DI(63) XOR DI(30) XOR DI(44) XOR DI(45) XOR DI(32) XOR DI(117) XOR DI(96) XOR DI(72) XOR DI(65) XOR DI(76) XOR DI(9) XOR DI(73) XOR DI(25) XOR DI(7) XOR DI(95) XOR DI(39) XOR DI(16) XOR DI(10) XOR DI(53) XOR DI(41) XOR DI(114) XOR DI(120) XOR DI(126); + DO(19) <= DI(112) XOR DI(18) XOR DI(106) XOR DI(35) XOR DI(85) XOR DI(122) XOR DI(5) XOR DI(36) XOR DI(56) XOR DI(86) XOR DI(50) XOR DI(123) XOR DI(70) XOR DI(19) XOR DI(75) XOR DI(109) XOR DI(6) XOR DI(52) XOR DI(125) XOR DI(81) XOR DI(78) XOR DI(71) XOR DI(68) XOR DI(58) XOR DI(100) XOR DI(22) XOR DI(76) XOR DI(25) XOR DI(110) XOR DI(7) XOR DI(53) XOR DI(41) XOR DI(114) XOR DI(126) XOR DI(103) XOR DI(29) XOR DI(59) XOR DI(16) XOR DI(30) XOR DI(80) XOR DI(0) XOR DI(14) XOR DI(64) XOR DI(31) XOR DI(45) XOR DI(46) XOR DI(33) XOR DI(118) XOR DI(97) XOR DI(73) XOR DI(66) XOR DI(77) XOR DI(10) XOR DI(74) XOR DI(26) XOR DI(8) XOR DI(96) XOR DI(40) XOR DI(17) XOR DI(11) XOR DI(54) XOR DI(42) XOR DI(115) XOR DI(121) XOR DI(127); + DO(20) <= DI(84) XOR DI(49) XOR DI(113) XOR DI(19) XOR DI(91) XOR DI(107) XOR DI(36) XOR DI(86) XOR DI(123) XOR DI(6) XOR DI(56) XOR DI(70) XOR DI(5) XOR DI(37) XOR DI(57) XOR DI(87) XOR DI(51) XOR DI(112) XOR DI(124) XOR DI(71) XOR DI(68) XOR DI(100) XOR DI(20) XOR DI(63) XOR DI(22) XOR DI(76) XOR DI(94) XOR DI(25) XOR DI(110) XOR DI(7) XOR DI(3) XOR DI(53) XOR DI(126) XOR DI(103) XOR DI(82) XOR DI(29) XOR DI(79) XOR DI(99) XOR DI(72) XOR DI(69) XOR DI(62) XOR DI(59) XOR DI(83) XOR DI(101) XOR DI(80) XOR DI(44) XOR DI(14) XOR DI(102) XOR DI(45) XOR DI(33) XOR DI(118) XOR DI(23) XOR DI(73) XOR DI(77) XOR DI(10) XOR DI(24) XOR DI(26) XOR DI(111) XOR DI(8) XOR DI(96) XOR DI(2) XOR DI(61) XOR DI(54) XOR DI(42) XOR DI(115) XOR DI(127); + DO(21) <= DI(47) XOR DI(68) XOR DI(85) XOR DI(49) XOR DI(50) XOR DI(122) XOR DI(56) XOR DI(114) XOR DI(18) XOR DI(20) XOR DI(92) XOR DI(108) XOR DI(5) XOR DI(37) XOR DI(87) XOR DI(124) XOR DI(7) XOR DI(41) XOR DI(57) XOR DI(12) XOR DI(71) XOR DI(91) XOR DI(75) XOR DI(22) XOR DI(6) XOR DI(94) XOR DI(38) XOR DI(65) XOR DI(58) XOR DI(88) XOR DI(52) XOR DI(113) XOR DI(125) XOR DI(98) XOR DI(29) XOR DI(99) XOR DI(72) XOR DI(69) XOR DI(101) XOR DI(44) XOR DI(32) XOR DI(0) XOR DI(21) XOR DI(14) XOR DI(64) XOR DI(1) XOR DI(31) XOR DI(33) XOR DI(118) XOR DI(23) XOR DI(77) XOR DI(10) XOR DI(95) XOR DI(26) XOR DI(111) XOR DI(8) XOR DI(96) XOR DI(17) XOR DI(67) XOR DI(4) XOR DI(2) XOR DI(61) XOR DI(54) XOR DI(127); + DO(22) <= DI(84) XOR DI(118) XOR DI(103) XOR DI(104) XOR DI(83) XOR DI(48) XOR DI(74) XOR DI(49) XOR DI(122) XOR DI(17) XOR DI(69) XOR DI(56) XOR DI(86) XOR DI(50) XOR DI(51) XOR DI(123) XOR DI(80) XOR DI(67) XOR DI(57) XOR DI(14) XOR DI(115) XOR DI(19) XOR DI(21) XOR DI(91) XOR DI(75) XOR DI(93) XOR DI(109) XOR DI(6) XOR DI(38) XOR DI(88) XOR DI(46) XOR DI(125) XOR DI(8) XOR DI(81) XOR DI(42) XOR DI(98) XOR DI(61) XOR DI(58) XOR DI(12) XOR DI(29) XOR DI(43) XOR DI(31) XOR DI(116) XOR DI(13) XOR DI(63) XOR DI(0) XOR DI(44) XOR DI(72) XOR DI(92) XOR DI(76) XOR DI(94) XOR DI(23) XOR DI(25) XOR DI(7) XOR DI(95) XOR DI(39) XOR DI(66) XOR DI(59) XOR DI(89) XOR DI(10) XOR DI(60) XOR DI(53) XOR DI(47) XOR DI(41) XOR DI(114) XOR DI(126); + DO(23) <= DI(85) XOR DI(119) XOR DI(104) XOR DI(105) XOR DI(84) XOR DI(49) XOR DI(75) XOR DI(50) XOR DI(123) XOR DI(18) XOR DI(70) XOR DI(57) XOR DI(87) XOR DI(51) XOR DI(52) XOR DI(124) XOR DI(81) XOR DI(68) XOR DI(58) XOR DI(15) XOR DI(116) XOR DI(20) XOR DI(22) XOR DI(92) XOR DI(76) XOR DI(94) XOR DI(110) XOR DI(7) XOR DI(39) XOR DI(89) XOR DI(47) XOR DI(126) XOR DI(9) XOR DI(82) XOR DI(43) XOR DI(99) XOR DI(62) XOR DI(59) XOR DI(13) XOR DI(30) XOR DI(44) XOR DI(32) XOR DI(117) XOR DI(14) XOR DI(64) XOR DI(1) XOR DI(45) XOR DI(73) XOR DI(93) XOR DI(77) XOR DI(95) XOR DI(24) XOR DI(26) XOR DI(8) XOR DI(96) XOR DI(40) XOR DI(67) XOR DI(60) XOR DI(90) XOR DI(11) XOR DI(61) XOR DI(54) XOR DI(48) XOR DI(42) XOR DI(115) XOR DI(127); + DO(24) <= DI(86) XOR DI(104) XOR DI(47) XOR DI(120) XOR DI(105) XOR DI(34) XOR DI(84) XOR DI(106) XOR DI(3) XOR DI(85) XOR DI(50) XOR DI(122) XOR DI(76) XOR DI(56) XOR DI(18) XOR DI(5) XOR DI(51) XOR DI(112) XOR DI(124) XOR DI(70) XOR DI(81) XOR DI(19) XOR DI(71) XOR DI(75) XOR DI(22) XOR DI(58) XOR DI(88) XOR DI(52) XOR DI(53) XOR DI(119) XOR DI(125) XOR DI(103) XOR DI(98) XOR DI(82) XOR DI(29) XOR DI(99) XOR DI(69) XOR DI(59) XOR DI(16) XOR DI(30) XOR DI(80) XOR DI(32) XOR DI(117) XOR DI(21) XOR DI(1) XOR DI(102) XOR DI(23) XOR DI(73) XOR DI(93) XOR DI(77) XOR DI(95) XOR DI(24) XOR DI(111) XOR DI(8) XOR DI(40) XOR DI(17) XOR DI(67) XOR DI(90) XOR DI(11) XOR DI(48) XOR DI(127); + DO(25) <= DI(87) XOR DI(105) XOR DI(34) XOR DI(84) XOR DI(48) XOR DI(121) XOR DI(106) XOR DI(35) XOR DI(85) XOR DI(122) XOR DI(5) XOR DI(55) XOR DI(107) XOR DI(4) XOR DI(56) XOR DI(86) XOR DI(51) XOR DI(123) XOR DI(80) XOR DI(77) XOR DI(67) XOR DI(57) XOR DI(11) XOR DI(14) XOR DI(19) XOR DI(62) XOR DI(75) XOR DI(6) XOR DI(52) XOR DI(46) XOR DI(113) XOR DI(119) XOR DI(125) XOR DI(102) XOR DI(97) XOR DI(27) XOR DI(98) XOR DI(71) XOR DI(61) XOR DI(82) XOR DI(15) XOR DI(29) XOR DI(43) XOR DI(116) XOR DI(20) XOR DI(63) XOR DI(0) XOR DI(44) XOR DI(45) XOR DI(32) XOR DI(72) XOR DI(65) XOR DI(76) XOR DI(23) XOR DI(73) XOR DI(59) XOR DI(3) XOR DI(1) XOR DI(89) XOR DI(10) XOR DI(53) XOR DI(54) XOR DI(47) XOR DI(120) XOR DI(126); + DO(26) <= DI(88) XOR DI(106) XOR DI(35) XOR DI(85) XOR DI(49) XOR DI(122) XOR DI(107) XOR DI(36) XOR DI(86) XOR DI(123) XOR DI(6) XOR DI(56) XOR DI(108) XOR DI(5) XOR DI(57) XOR DI(87) XOR DI(52) XOR DI(124) XOR DI(81) XOR DI(78) XOR DI(68) XOR DI(58) XOR DI(12) XOR DI(15) XOR DI(20) XOR DI(63) XOR DI(76) XOR DI(7) XOR DI(53) XOR DI(47) XOR DI(114) XOR DI(120) XOR DI(126) XOR DI(103) XOR DI(98) XOR DI(28) XOR DI(99) XOR DI(72) XOR DI(62) XOR DI(83) XOR DI(16) XOR DI(30) XOR DI(44) XOR DI(117) XOR DI(0) XOR DI(21) XOR DI(64) XOR DI(1) XOR DI(45) XOR DI(46) XOR DI(33) XOR DI(73) XOR DI(66) XOR DI(77) XOR DI(24) XOR DI(74) XOR DI(60) XOR DI(4) XOR DI(2) XOR DI(90) XOR DI(11) XOR DI(54) XOR DI(55) XOR DI(48) XOR DI(121) XOR DI(127); + DO(27) <= DI(68) XOR DI(89) XOR DI(107) XOR DI(36) XOR DI(86) XOR DI(50) XOR DI(123) XOR DI(18) XOR DI(108) XOR DI(37) XOR DI(87) XOR DI(112) XOR DI(124) XOR DI(7) XOR DI(41) XOR DI(27) XOR DI(70) XOR DI(57) XOR DI(81) XOR DI(116) XOR DI(109) XOR DI(6) XOR DI(94) XOR DI(15) XOR DI(58) XOR DI(88) XOR DI(53) XOR DI(119) XOR DI(125) XOR DI(103) XOR DI(9) XOR DI(98) XOR DI(82) XOR DI(43) XOR DI(79) XOR DI(69) XOR DI(62) XOR DI(59) XOR DI(13) XOR DI(83) XOR DI(16) XOR DI(30) XOR DI(80) XOR DI(44) XOR DI(32) XOR DI(0) XOR DI(21) XOR DI(14) XOR DI(64) XOR DI(102) XOR DI(33) XOR DI(97) XOR DI(77) XOR DI(10) XOR DI(24) XOR DI(8) XOR DI(96) XOR DI(60) XOR DI(11) XOR DI(54) XOR DI(48) XOR DI(115) XOR DI(121) XOR DI(127); + DO(28) <= DI(69) XOR DI(56) XOR DI(18) XOR DI(90) XOR DI(74) XOR DI(108) XOR DI(5) XOR DI(37) XOR DI(87) XOR DI(51) XOR DI(112) XOR DI(118) XOR DI(124) XOR DI(67) XOR DI(19) XOR DI(62) XOR DI(91) XOR DI(75) XOR DI(24) XOR DI(109) XOR DI(38) XOR DI(2) XOR DI(88) XOR DI(46) XOR DI(113) XOR DI(119) XOR DI(125) XOR DI(102) XOR DI(8) XOR DI(42) XOR DI(27) XOR DI(28) XOR DI(71) XOR DI(68) XOR DI(58) XOR DI(82) XOR DI(100) XOR DI(29) XOR DI(43) XOR DI(30) XOR DI(32) XOR DI(117) XOR DI(96) XOR DI(94) XOR DI(73) XOR DI(110) XOR DI(7) XOR DI(95) XOR DI(16) XOR DI(59) XOR DI(3) XOR DI(89) XOR DI(54) XOR DI(47) XOR DI(41) XOR DI(120) XOR DI(126); + DO(29) <= DI(70) XOR DI(57) XOR DI(19) XOR DI(91) XOR DI(75) XOR DI(109) XOR DI(6) XOR DI(38) XOR DI(88) XOR DI(52) XOR DI(113) XOR DI(119) XOR DI(125) XOR DI(68) XOR DI(20) XOR DI(63) XOR DI(92) XOR DI(76) XOR DI(25) XOR DI(110) XOR DI(39) XOR DI(3) XOR DI(89) XOR DI(47) XOR DI(114) XOR DI(120) XOR DI(126) XOR DI(103) XOR DI(9) XOR DI(43) XOR DI(28) XOR DI(29) XOR DI(72) XOR DI(69) XOR DI(59) XOR DI(83) XOR DI(101) XOR DI(30) XOR DI(44) XOR DI(0) XOR DI(31) XOR DI(33) XOR DI(118) XOR DI(97) XOR DI(95) XOR DI(74) XOR DI(111) XOR DI(8) XOR DI(96) XOR DI(17) XOR DI(60) XOR DI(4) XOR DI(90) XOR DI(55) XOR DI(48) XOR DI(42) XOR DI(121) XOR DI(127); + DO(30) <= DI(81) XOR DI(27) XOR DI(78) XOR DI(71) XOR DI(68) XOR DI(58) XOR DI(12) XOR DI(15) XOR DI(100) XOR DI(116) XOR DI(20) XOR DI(63) XOR DI(22) XOR DI(92) XOR DI(65) XOR DI(76) XOR DI(94) XOR DI(25) XOR DI(110) XOR DI(7) XOR DI(39) XOR DI(3) XOR DI(89) XOR DI(53) XOR DI(47) XOR DI(41) XOR DI(114) XOR DI(120) XOR DI(126) XOR DI(103) XOR DI(99) XOR DI(69) XOR DI(62) XOR DI(83) XOR DI(80) XOR DI(21) XOR DI(14) XOR DI(64) XOR DI(46) XOR DI(33) XOR DI(118) XOR DI(93) XOR DI(77) XOR DI(24) XOR DI(74) XOR DI(26) XOR DI(111) XOR DI(40) XOR DI(17) XOR DI(67) XOR DI(4) XOR DI(2) XOR DI(90) XOR DI(11) XOR DI(55) XOR DI(48) XOR DI(115) XOR DI(121) XOR DI(127); + DO(31) <= DI(103) XOR DI(9) XOR DI(98) XOR DI(82) XOR DI(43) XOR DI(28) XOR DI(29) XOR DI(79) XOR DI(99) XOR DI(72) XOR DI(69) XOR DI(62) XOR DI(59) XOR DI(13) XOR DI(83) XOR DI(16) XOR DI(101) XOR DI(30) XOR DI(80) XOR DI(44) XOR DI(32) XOR DI(117) XOR DI(0) XOR DI(21) XOR DI(14) XOR DI(64) XOR DI(1) XOR DI(102) XOR DI(31) XOR DI(45) XOR DI(46) XOR DI(33) XOR DI(118) XOR DI(97) XOR DI(23) XOR DI(73) XOR DI(93) XOR DI(66) XOR DI(77) XOR DI(10) XOR DI(95) XOR DI(24) XOR DI(74) XOR DI(26) XOR DI(111) XOR DI(8) XOR DI(96) XOR DI(40) XOR DI(17) XOR DI(67) XOR DI(60) XOR DI(4) XOR DI(2) XOR DI(90) XOR DI(11) XOR DI(61) XOR DI(54) XOR DI(55) XOR DI(48) XOR DI(42) XOR DI(115) XOR DI(121) XOR DI(127); +end architecture; \ No newline at end of file Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast16_tab.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast16_tab.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast16_tab.vhd (revision 3) @@ -0,0 +1,93 @@ +-- +-- crc_fast16_tab.vhd: A 32-bit CRC (IEEE) table for processing fixed 16 bits in parallel +-- Copyright (C) 2011 CESNET +-- Author(s): Lukas Kekely +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in +-- the documentation and/or other materials provided with the +-- distribution. +-- 3. Neither the name of the Company nor the names of its contributors +-- may be used to endorse or promote products derived from this +-- software without specific prior written permission. +-- +-- This software is provided ``as is'', and any express or implied +-- warranties, including, but not limited to, the implied warranties of +-- merchantability and fitness for a particular purpose are disclaimed. +-- In no event shall the company or contributors be liable for any +-- direct, indirect, incidental, special, exemplary, or consequential +-- damages (including, but not limited to, procurement of substitute +-- goods or services; loss of use, data, or profits; or business +-- interruption) however caused and on any theory of liability, whether +-- in contract, strict liability, or tort (including negligence or +-- otherwise) arising in any way out of the use of this software, even +-- if advised of the possibility of such damage. +-- +-- $Id$ +-- +-- TODO: +-- +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; +use IEEE.std_logic_unsigned.all; +use IEEE.numeric_std.all; +use WORK.math_pack.all; +-- ---------------------------------------------------------------------------- +-- Entity declaration +-- ---------------------------------------------------------------------------- +entity crc32_fast16_tab is + port( + DI : in std_logic_vector(16-1 downto 0); + DO : out std_logic_vector(31 downto 0) + ); +end entity crc32_fast16_tab; + +-- ---------------------------------------------------------------------------- +-- Architecture declaration +-- ---------------------------------------------------------------------------- +architecture arch of crc32_fast16_tab is +begin +-- 32-bit CRC equations processing 16 bits in parallel (VHDL code) +-- Generator polynomial: 0x104C11DB7 + DO(0) <= DI(6) XOR DI(7) XOR DI(0) XOR DI(4) XOR DI(10); + DO(1) <= DI(7) XOR DI(8) XOR DI(1) XOR DI(5) XOR DI(11); + DO(2) <= DI(8) XOR DI(9) XOR DI(2) XOR DI(6) XOR DI(12); + DO(3) <= DI(9) XOR DI(10) XOR DI(3) XOR DI(7) XOR DI(13); + DO(4) <= DI(10) XOR DI(11) XOR DI(4) XOR DI(8) XOR DI(14); + DO(5) <= DI(11) XOR DI(12) XOR DI(5) XOR DI(9) XOR DI(15); + DO(6) <= DI(0) XOR DI(12) XOR DI(4) XOR DI(7) XOR DI(13); + DO(7) <= DI(1) XOR DI(13) XOR DI(5) XOR DI(8) XOR DI(14); + DO(8) <= DI(0) XOR DI(2) XOR DI(14) XOR DI(6) XOR DI(9) XOR DI(15); + DO(9) <= DI(1) XOR DI(4) XOR DI(6) XOR DI(3) XOR DI(15); + DO(10) <= DI(2) XOR DI(5) XOR DI(6) XOR DI(10); + DO(11) <= DI(3) XOR DI(6) XOR DI(7) XOR DI(11); + DO(12) <= DI(4) XOR DI(7) XOR DI(8) XOR DI(0) XOR DI(12); + DO(13) <= DI(5) XOR DI(8) XOR DI(0) XOR DI(9) XOR DI(1) XOR DI(13); + DO(14) <= DI(6) XOR DI(9) XOR DI(1) XOR DI(10) XOR DI(2) XOR DI(14); + DO(15) <= DI(7) XOR DI(10) XOR DI(2) XOR DI(11) XOR DI(3) XOR DI(15); + DO(16) <= DI(7) XOR DI(8) XOR DI(10) XOR DI(11) XOR DI(3) XOR DI(0) XOR DI(6) XOR DI(12); + DO(17) <= DI(8) XOR DI(9) XOR DI(11) XOR DI(0) XOR DI(12) XOR DI(4) XOR DI(1) XOR DI(7) XOR DI(13); + DO(18) <= DI(9) XOR DI(10) XOR DI(12) XOR DI(1) XOR DI(13) XOR DI(5) XOR DI(2) XOR DI(8) XOR DI(14); + DO(19) <= DI(0) XOR DI(10) XOR DI(11) XOR DI(13) XOR DI(2) XOR DI(14) XOR DI(6) XOR DI(3) XOR DI(9) XOR DI(15); + DO(20) <= DI(1) XOR DI(11) XOR DI(0) XOR DI(12) XOR DI(14) XOR DI(6) XOR DI(3) XOR DI(15); + DO(21) <= DI(10) XOR DI(2) XOR DI(12) XOR DI(1) XOR DI(13) XOR DI(6) XOR DI(15); + DO(22) <= DI(6) XOR DI(10) XOR DI(11) XOR DI(3) XOR DI(13) XOR DI(4) XOR DI(2) XOR DI(14); + DO(23) <= DI(7) XOR DI(11) XOR DI(12) XOR DI(4) XOR DI(14) XOR DI(5) XOR DI(3) XOR DI(15); + DO(24) <= DI(8) XOR DI(10) XOR DI(0) XOR DI(12) XOR DI(7) XOR DI(13) XOR DI(5) XOR DI(15); + DO(25) <= DI(9) XOR DI(10) XOR DI(11) XOR DI(1) XOR DI(7) XOR DI(13) XOR DI(4) XOR DI(8) XOR DI(14); + DO(26) <= DI(10) XOR DI(11) XOR DI(12) XOR DI(2) XOR DI(8) XOR DI(14) XOR DI(5) XOR DI(9) XOR DI(15); + DO(27) <= DI(11) XOR DI(0) XOR DI(12) XOR DI(4) XOR DI(7) XOR DI(13) XOR DI(3) XOR DI(9) XOR DI(15); + DO(28) <= DI(0) XOR DI(6) XOR DI(12) XOR DI(1) XOR DI(7) XOR DI(13) XOR DI(5) XOR DI(8) XOR DI(14); + DO(29) <= DI(1) XOR DI(7) XOR DI(13) XOR DI(2) XOR DI(8) XOR DI(14) XOR DI(6) XOR DI(9) XOR DI(15); + DO(30) <= DI(4) XOR DI(2) XOR DI(8) XOR DI(14) XOR DI(6) XOR DI(3) XOR DI(9) XOR DI(15); + DO(31) <= DI(5) XOR DI(6) XOR DI(3) XOR DI(9) XOR DI(15); + +end architecture; \ No newline at end of file Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast24_tab.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast24_tab.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast24_tab.vhd (revision 3) @@ -0,0 +1,92 @@ +-- +-- crc32_fast24_tab.vhd: A 32-bit crc (IEEE) table for processing fixed 24 bits in parallel +-- Copyright (C) 2011 CESNET +-- Author(s): Lukas Kekely +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in +-- the documentation and/or other materials provided with the +-- distribution. +-- 3. Neither the name of the Company nor the names of its contributors +-- may be used to endorse or promote products derived from this +-- software without specific prior written permission. +-- +-- This software is provided ``as is'', and any express or implied +-- warranties, including, but not limited to, the implied warranties of +-- merchantability and fitness for a particular purpose are disclaimed. +-- In no event shall the company or contributors be liable for any +-- direct, indirect, incidental, special, exemplary, or consequential +-- damages (including, but not limited to, procurement of substitute +-- goods or services; loss of use, data, or profits; or business +-- interruption) however caused and on any theory of liability, whether +-- in contract, strict liability, or tort (including negligence or +-- otherwise) arising in any way out of the use of this software, even +-- if advised of the possibility of such damage. +-- +-- $Id$ +-- +-- TODO: +-- +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; +use IEEE.std_logic_unsigned.all; +use IEEE.numeric_std.all; +use WORK.math_pack.all; +-- ---------------------------------------------------------------------------- +-- Entity declaration +-- ---------------------------------------------------------------------------- +entity crc32_fast24_tab is + port( + DI : in std_logic_vector(24-1 downto 0); + DO : out std_logic_vector(31 downto 0) + ); +end entity crc32_fast24_tab; + +-- ---------------------------------------------------------------------------- +-- Architecture declaration +-- ---------------------------------------------------------------------------- +architecture arch of crc32_fast24_tab is +begin +-- 32-bit crc equations processing 24 bits in parallel (VHDL code) +-- Generator polynomial: 0x104C11DB7 + DO(0) <= DI(0) XOR DI(14) XOR DI(15) XOR DI(8) XOR DI(12) XOR DI(18); + DO(1) <= DI(1) XOR DI(15) XOR DI(0) XOR DI(16) XOR DI(9) XOR DI(13) XOR DI(19); + DO(2) <= DI(2) XOR DI(0) XOR DI(16) XOR DI(1) XOR DI(17) XOR DI(10) XOR DI(14) XOR DI(20); + DO(3) <= DI(3) XOR DI(1) XOR DI(17) XOR DI(2) XOR DI(18) XOR DI(11) XOR DI(15) XOR DI(21); + DO(4) <= DI(4) XOR DI(0) XOR DI(2) XOR DI(18) XOR DI(3) XOR DI(19) XOR DI(12) XOR DI(16) XOR DI(22); + DO(5) <= DI(5) XOR DI(0) XOR DI(1) XOR DI(3) XOR DI(19) XOR DI(4) XOR DI(20) XOR DI(13) XOR DI(17) XOR DI(23); + DO(6) <= DI(6) XOR DI(1) XOR DI(2) XOR DI(4) XOR DI(8) XOR DI(20) XOR DI(12) XOR DI(5) XOR DI(15) XOR DI(21); + DO(7) <= DI(7) XOR DI(2) XOR DI(3) XOR DI(5) XOR DI(9) XOR DI(21) XOR DI(13) XOR DI(6) XOR DI(16) XOR DI(22); + DO(8) <= DI(8) XOR DI(3) XOR DI(4) XOR DI(6) XOR DI(10) XOR DI(22) XOR DI(14) XOR DI(7) XOR DI(17) XOR DI(23); + DO(9) <= DI(9) XOR DI(0) XOR DI(12) XOR DI(4) XOR DI(5) XOR DI(14) XOR DI(7) XOR DI(11) XOR DI(23); + DO(10) <= DI(10) XOR DI(1) XOR DI(13) XOR DI(5) XOR DI(14) XOR DI(6) XOR DI(18); + DO(11) <= DI(0) XOR DI(11) XOR DI(2) XOR DI(14) XOR DI(6) XOR DI(15) XOR DI(7) XOR DI(19); + DO(12) <= DI(1) XOR DI(12) XOR DI(3) XOR DI(15) XOR DI(7) XOR DI(16) XOR DI(8) XOR DI(20); + DO(13) <= DI(2) XOR DI(13) XOR DI(0) XOR DI(4) XOR DI(16) XOR DI(8) XOR DI(17) XOR DI(9) XOR DI(21); + DO(14) <= DI(3) XOR DI(14) XOR DI(0) XOR DI(1) XOR DI(5) XOR DI(17) XOR DI(9) XOR DI(18) XOR DI(10) XOR DI(22); + DO(15) <= DI(4) XOR DI(15) XOR DI(1) XOR DI(2) XOR DI(6) XOR DI(18) XOR DI(10) XOR DI(19) XOR DI(11) XOR DI(23); + DO(16) <= DI(5) XOR DI(15) XOR DI(16) XOR DI(2) XOR DI(18) XOR DI(3) XOR DI(7) XOR DI(19) XOR DI(11) XOR DI(8) XOR DI(14) XOR DI(20); + DO(17) <= DI(6) XOR DI(0) XOR DI(16) XOR DI(17) XOR DI(3) XOR DI(19) XOR DI(4) XOR DI(8) XOR DI(20) XOR DI(12) XOR DI(9) XOR DI(15) XOR DI(21); + DO(18) <= DI(7) XOR DI(1) XOR DI(17) XOR DI(18) XOR DI(4) XOR DI(20) XOR DI(5) XOR DI(9) XOR DI(21) XOR DI(13) XOR DI(10) XOR DI(16) XOR DI(22); + DO(19) <= DI(8) XOR DI(2) XOR DI(18) XOR DI(19) XOR DI(5) XOR DI(21) XOR DI(6) XOR DI(10) XOR DI(22) XOR DI(14) XOR DI(11) XOR DI(17) XOR DI(23); + DO(20) <= DI(9) XOR DI(3) XOR DI(19) XOR DI(8) XOR DI(20) XOR DI(6) XOR DI(22) XOR DI(14) XOR DI(7) XOR DI(11) XOR DI(23); + DO(21) <= DI(18) XOR DI(10) XOR DI(4) XOR DI(20) XOR DI(9) XOR DI(21) XOR DI(14) XOR DI(7) XOR DI(23); + DO(22) <= DI(14) XOR DI(0) XOR DI(18) XOR DI(19) XOR DI(11) XOR DI(5) XOR DI(21) XOR DI(12) XOR DI(10) XOR DI(22); + DO(23) <= DI(15) XOR DI(0) XOR DI(1) XOR DI(19) XOR DI(20) XOR DI(12) XOR DI(6) XOR DI(22) XOR DI(13) XOR DI(11) XOR DI(23); + DO(24) <= DI(0) XOR DI(16) XOR DI(1) XOR DI(2) XOR DI(18) XOR DI(8) XOR DI(20) XOR DI(15) XOR DI(21) XOR DI(13) XOR DI(7) XOR DI(23); + DO(25) <= DI(1) XOR DI(17) XOR DI(2) XOR DI(18) XOR DI(3) XOR DI(19) XOR DI(9) XOR DI(15) XOR DI(21) XOR DI(12) XOR DI(16) XOR DI(22); + DO(26) <= DI(2) XOR DI(18) XOR DI(3) XOR DI(19) XOR DI(4) XOR DI(20) XOR DI(10) XOR DI(16) XOR DI(22) XOR DI(13) XOR DI(17) XOR DI(23); + DO(27) <= DI(3) XOR DI(19) XOR DI(4) XOR DI(8) XOR DI(20) XOR DI(12) XOR DI(5) XOR DI(15) XOR DI(21) XOR DI(11) XOR DI(17) XOR DI(23); + DO(28) <= DI(4) XOR DI(8) XOR DI(14) XOR DI(20) XOR DI(5) XOR DI(9) XOR DI(15) XOR DI(21) XOR DI(13) XOR DI(6) XOR DI(16) XOR DI(22); + DO(29) <= DI(5) XOR DI(9) XOR DI(15) XOR DI(21) XOR DI(6) XOR DI(10) XOR DI(16) XOR DI(22) XOR DI(14) XOR DI(7) XOR DI(17) XOR DI(23); + DO(30) <= DI(12) XOR DI(6) XOR DI(10) XOR DI(16) XOR DI(22) XOR DI(14) XOR DI(7) XOR DI(11) XOR DI(17) XOR DI(23); + DO(31) <= DI(13) XOR DI(14) XOR DI(7) XOR DI(11) XOR DI(17) XOR DI(23); +end architecture; \ No newline at end of file Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast256_tab.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast256_tab.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast256_tab.vhd (revision 3) @@ -0,0 +1,92 @@ +-- +-- crc32_fast256_tab.vhd: A 32-bit CRC (IEEE) table for processing fixed 256 bits in parallel +-- Copyright (C) 2011 CESNET +-- Author(s): Lukas Kekely +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in +-- the documentation and/or other materials provided with the +-- distribution. +-- 3. Neither the name of the Company nor the names of its contributors +-- may be used to endorse or promote products derived from this +-- software without specific prior written permission. +-- +-- This software is provided ``as is'', and any express or implied +-- warranties, including, but not limited to, the implied warranties of +-- merchantability and fitness for a particular purpose are disclaimed. +-- In no event shall the company or contributors be liable for any +-- direct, indirect, incidental, special, exemplary, or consequential +-- damages (including, but not limited to, procurement of substitute +-- goods or services; loss of use, data, or profits; or business +-- interruption) however caused and on any theory of liability, whether +-- in contract, strict liability, or tort (including negligence or +-- otherwise) arising in any way out of the use of this software, even +-- if advised of the possibility of such damage. +-- +-- $Id$ +-- +-- TODO: +-- +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; +use IEEE.std_logic_unsigned.all; +use IEEE.numeric_std.all; +use WORK.math_pack.all; +-- ---------------------------------------------------------------------------- +-- Entity declaration +-- ---------------------------------------------------------------------------- +entity crc32_fast256_tab is + port( + DI : in std_logic_vector(256-1 downto 0); + DO : out std_logic_vector(31 downto 0) + ); +end entity crc32_fast256_tab; + +-- ---------------------------------------------------------------------------- +-- Architecture declaration +-- ---------------------------------------------------------------------------- +architecture arch of crc32_fast256_tab is +begin +-- 32-bit CRC equations processing 256 bits in parallel (VHDL code) +-- Generator polynomial: 0x104C11DB7 + DO(0) <= DI(232) XOR DI(1) XOR DI(8) XOR DI(138) XOR DI(100) XOR DI(66) XOR DI(227) XOR DI(29) XOR DI(87) XOR DI(211) XOR DI(172) XOR DI(157) XOR DI(105) XOR DI(28) XOR DI(158) XOR DI(70) XOR DI(208) XOR DI(73) XOR DI(228) XOR DI(90) XOR DI(201) XOR DI(198) XOR DI(63) XOR DI(191) XOR DI(188) XOR DI(142) XOR DI(212) XOR DI(74) XOR DI(145) XOR DI(230) XOR DI(30) XOR DI(159) XOR DI(32) XOR DI(209) XOR DI(173) XOR DI(161) XOR DI(246) XOR DI(129) XOR DI(19) XOR DI(54) XOR DI(65) XOR DI(150) XOR DI(120) XOR DI(112) XOR DI(46) XOR DI(121) XOR DI(119) XOR DI(85) XOR DI(143) XOR DI(55) XOR DI(193) XOR DI(130) XOR DI(231) XOR DI(4) XOR DI(128) XOR DI(160) XOR DI(44) XOR DI(98) XOR DI(174) XOR DI(175) XOR DI(86) XOR DI(162) XOR DI(247) XOR DI(226) XOR DI(94) XOR DI(22) XOR DI(152) XOR DI(64) XOR DI(202) XOR DI(222) XOR DI(84) XOR DI(195) XOR DI(57) XOR DI(206) XOR DI(68) XOR DI(139) XOR DI(224) XOR DI(153) XOR DI(26) XOR DI(203) XOR DI(155) XOR DI(240) XOR DI(13) XOR DI(48) XOR DI(59) XOR DI(40) XOR DI(113) XOR DI(137) XOR DI(49) XOR DI(124) XOR DI(225) XOR DI(122) XOR DI(169) XOR DI(146) XOR DI(58) XOR DI(196) XOR DI(189) XOR DI(62) XOR DI(133) XOR DI(42) XOR DI(53) XOR DI(107) XOR DI(131) XOR DI(219) XOR DI(140) XOR DI(190) XOR DI(183) XOR DI(47) XOR DI(101) XOR DI(184) XOR DI(177) XOR DI(95) XOR DI(171) XOR DI(89) XOR DI(244) XOR DI(250); + DO(1) <= DI(233) XOR DI(2) XOR DI(9) XOR DI(139) XOR DI(101) XOR DI(67) XOR DI(228) XOR DI(30) XOR DI(88) XOR DI(212) XOR DI(173) XOR DI(158) XOR DI(106) XOR DI(29) XOR DI(159) XOR DI(71) XOR DI(209) XOR DI(74) XOR DI(229) XOR DI(91) XOR DI(202) XOR DI(199) XOR DI(64) XOR DI(192) XOR DI(189) XOR DI(143) XOR DI(213) XOR DI(75) XOR DI(146) XOR DI(231) XOR DI(31) XOR DI(160) XOR DI(33) XOR DI(210) XOR DI(174) XOR DI(162) XOR DI(247) XOR DI(0) XOR DI(130) XOR DI(20) XOR DI(55) XOR DI(66) XOR DI(151) XOR DI(121) XOR DI(113) XOR DI(47) XOR DI(122) XOR DI(120) XOR DI(86) XOR DI(144) XOR DI(56) XOR DI(194) XOR DI(131) XOR DI(232) XOR DI(5) XOR DI(129) XOR DI(161) XOR DI(45) XOR DI(99) XOR DI(175) XOR DI(176) XOR DI(87) XOR DI(163) XOR DI(248) XOR DI(227) XOR DI(95) XOR DI(23) XOR DI(153) XOR DI(65) XOR DI(203) XOR DI(223) XOR DI(85) XOR DI(196) XOR DI(58) XOR DI(207) XOR DI(69) XOR DI(140) XOR DI(225) XOR DI(154) XOR DI(27) XOR DI(204) XOR DI(156) XOR DI(241) XOR DI(14) XOR DI(49) XOR DI(60) XOR DI(41) XOR DI(114) XOR DI(138) XOR DI(50) XOR DI(125) XOR DI(226) XOR DI(123) XOR DI(170) XOR DI(147) XOR DI(59) XOR DI(197) XOR DI(190) XOR DI(63) XOR DI(134) XOR DI(43) XOR DI(54) XOR DI(108) XOR DI(132) XOR DI(220) XOR DI(141) XOR DI(191) XOR DI(184) XOR DI(48) XOR DI(102) XOR DI(185) XOR DI(178) XOR DI(96) XOR DI(172) XOR DI(90) XOR DI(245) XOR DI(251); + DO(2) <= DI(234) XOR DI(3) XOR DI(10) XOR DI(140) XOR DI(102) XOR DI(68) XOR DI(229) XOR DI(31) XOR DI(89) XOR DI(213) XOR DI(174) XOR DI(159) XOR DI(107) XOR DI(30) XOR DI(160) XOR DI(72) XOR DI(210) XOR DI(75) XOR DI(230) XOR DI(92) XOR DI(203) XOR DI(200) XOR DI(65) XOR DI(193) XOR DI(190) XOR DI(144) XOR DI(214) XOR DI(76) XOR DI(147) XOR DI(232) XOR DI(32) XOR DI(161) XOR DI(34) XOR DI(211) XOR DI(175) XOR DI(163) XOR DI(248) XOR DI(1) XOR DI(131) XOR DI(21) XOR DI(56) XOR DI(67) XOR DI(152) XOR DI(122) XOR DI(114) XOR DI(48) XOR DI(123) XOR DI(121) XOR DI(87) XOR DI(145) XOR DI(57) XOR DI(195) XOR DI(132) XOR DI(233) XOR DI(6) XOR DI(130) XOR DI(162) XOR DI(46) XOR DI(100) XOR DI(176) XOR DI(177) XOR DI(88) XOR DI(164) XOR DI(249) XOR DI(228) XOR DI(96) XOR DI(24) XOR DI(154) XOR DI(66) XOR DI(204) XOR DI(224) XOR DI(86) XOR DI(197) XOR DI(59) XOR DI(208) XOR DI(70) XOR DI(141) XOR DI(226) XOR DI(155) XOR DI(28) XOR DI(205) XOR DI(157) XOR DI(242) XOR DI(15) XOR DI(50) XOR DI(61) XOR DI(42) XOR DI(115) XOR DI(139) XOR DI(51) XOR DI(126) XOR DI(227) XOR DI(124) XOR DI(171) XOR DI(148) XOR DI(60) XOR DI(198) XOR DI(191) XOR DI(64) XOR DI(135) XOR DI(44) XOR DI(55) XOR DI(109) XOR DI(133) XOR DI(221) XOR DI(142) XOR DI(192) XOR DI(185) XOR DI(49) XOR DI(103) XOR DI(186) XOR DI(179) XOR DI(97) XOR DI(173) XOR DI(91) XOR DI(246) XOR DI(252); + DO(3) <= DI(235) XOR DI(4) XOR DI(11) XOR DI(141) XOR DI(103) XOR DI(69) XOR DI(230) XOR DI(32) XOR DI(90) XOR DI(214) XOR DI(175) XOR DI(160) XOR DI(108) XOR DI(31) XOR DI(161) XOR DI(73) XOR DI(211) XOR DI(0) XOR DI(76) XOR DI(231) XOR DI(93) XOR DI(204) XOR DI(201) XOR DI(66) XOR DI(194) XOR DI(191) XOR DI(145) XOR DI(215) XOR DI(77) XOR DI(148) XOR DI(233) XOR DI(33) XOR DI(162) XOR DI(35) XOR DI(212) XOR DI(176) XOR DI(164) XOR DI(249) XOR DI(2) XOR DI(132) XOR DI(22) XOR DI(57) XOR DI(68) XOR DI(153) XOR DI(123) XOR DI(115) XOR DI(49) XOR DI(124) XOR DI(122) XOR DI(88) XOR DI(146) XOR DI(58) XOR DI(196) XOR DI(133) XOR DI(234) XOR DI(7) XOR DI(131) XOR DI(163) XOR DI(47) XOR DI(101) XOR DI(177) XOR DI(178) XOR DI(89) XOR DI(165) XOR DI(250) XOR DI(229) XOR DI(97) XOR DI(25) XOR DI(155) XOR DI(67) XOR DI(205) XOR DI(225) XOR DI(87) XOR DI(198) XOR DI(60) XOR DI(209) XOR DI(71) XOR DI(142) XOR DI(227) XOR DI(156) XOR DI(29) XOR DI(206) XOR DI(158) XOR DI(243) XOR DI(16) XOR DI(51) XOR DI(62) XOR DI(43) XOR DI(116) XOR DI(140) XOR DI(52) XOR DI(127) XOR DI(228) XOR DI(125) XOR DI(172) XOR DI(149) XOR DI(61) XOR DI(199) XOR DI(192) XOR DI(65) XOR DI(136) XOR DI(45) XOR DI(56) XOR DI(110) XOR DI(134) XOR DI(222) XOR DI(143) XOR DI(193) XOR DI(186) XOR DI(50) XOR DI(104) XOR DI(187) XOR DI(180) XOR DI(98) XOR DI(174) XOR DI(92) XOR DI(247) XOR DI(253); + DO(4) <= DI(236) XOR DI(5) XOR DI(12) XOR DI(142) XOR DI(104) XOR DI(70) XOR DI(231) XOR DI(33) XOR DI(91) XOR DI(215) XOR DI(176) XOR DI(161) XOR DI(109) XOR DI(32) XOR DI(162) XOR DI(74) XOR DI(212) XOR DI(1) XOR DI(77) XOR DI(232) XOR DI(94) XOR DI(205) XOR DI(202) XOR DI(67) XOR DI(195) XOR DI(192) XOR DI(146) XOR DI(216) XOR DI(78) XOR DI(149) XOR DI(234) XOR DI(34) XOR DI(163) XOR DI(36) XOR DI(213) XOR DI(177) XOR DI(165) XOR DI(250) XOR DI(3) XOR DI(133) XOR DI(23) XOR DI(58) XOR DI(69) XOR DI(154) XOR DI(124) XOR DI(116) XOR DI(50) XOR DI(125) XOR DI(123) XOR DI(89) XOR DI(147) XOR DI(59) XOR DI(197) XOR DI(134) XOR DI(235) XOR DI(8) XOR DI(132) XOR DI(164) XOR DI(48) XOR DI(102) XOR DI(178) XOR DI(179) XOR DI(90) XOR DI(166) XOR DI(251) XOR DI(230) XOR DI(98) XOR DI(26) XOR DI(156) XOR DI(68) XOR DI(206) XOR DI(226) XOR DI(88) XOR DI(199) XOR DI(61) XOR DI(210) XOR DI(72) XOR DI(143) XOR DI(228) XOR DI(157) XOR DI(30) XOR DI(207) XOR DI(159) XOR DI(244) XOR DI(17) XOR DI(52) XOR DI(63) XOR DI(44) XOR DI(117) XOR DI(141) XOR DI(53) XOR DI(128) XOR DI(229) XOR DI(126) XOR DI(173) XOR DI(150) XOR DI(62) XOR DI(200) XOR DI(193) XOR DI(66) XOR DI(137) XOR DI(46) XOR DI(57) XOR DI(111) XOR DI(135) XOR DI(223) XOR DI(144) XOR DI(194) XOR DI(187) XOR DI(51) XOR DI(105) XOR DI(188) XOR DI(181) XOR DI(99) XOR DI(175) XOR DI(93) XOR DI(248) XOR DI(254); + DO(5) <= DI(237) XOR DI(6) XOR DI(13) XOR DI(143) XOR DI(105) XOR DI(71) XOR DI(232) XOR DI(34) XOR DI(92) XOR DI(216) XOR DI(177) XOR DI(162) XOR DI(110) XOR DI(33) XOR DI(163) XOR DI(75) XOR DI(213) XOR DI(2) XOR DI(78) XOR DI(233) XOR DI(95) XOR DI(206) XOR DI(203) XOR DI(68) XOR DI(196) XOR DI(193) XOR DI(147) XOR DI(217) XOR DI(79) XOR DI(150) XOR DI(235) XOR DI(35) XOR DI(164) XOR DI(37) XOR DI(214) XOR DI(178) XOR DI(166) XOR DI(251) XOR DI(4) XOR DI(134) XOR DI(24) XOR DI(59) XOR DI(70) XOR DI(155) XOR DI(125) XOR DI(117) XOR DI(51) XOR DI(126) XOR DI(124) XOR DI(90) XOR DI(148) XOR DI(60) XOR DI(198) XOR DI(135) XOR DI(236) XOR DI(9) XOR DI(133) XOR DI(165) XOR DI(49) XOR DI(103) XOR DI(179) XOR DI(180) XOR DI(91) XOR DI(167) XOR DI(252) XOR DI(231) XOR DI(0) XOR DI(99) XOR DI(27) XOR DI(157) XOR DI(69) XOR DI(207) XOR DI(227) XOR DI(89) XOR DI(200) XOR DI(62) XOR DI(211) XOR DI(73) XOR DI(144) XOR DI(229) XOR DI(158) XOR DI(31) XOR DI(208) XOR DI(160) XOR DI(245) XOR DI(18) XOR DI(53) XOR DI(64) XOR DI(45) XOR DI(118) XOR DI(142) XOR DI(54) XOR DI(129) XOR DI(230) XOR DI(127) XOR DI(174) XOR DI(151) XOR DI(63) XOR DI(201) XOR DI(194) XOR DI(67) XOR DI(138) XOR DI(47) XOR DI(58) XOR DI(112) XOR DI(136) XOR DI(224) XOR DI(145) XOR DI(195) XOR DI(188) XOR DI(52) XOR DI(106) XOR DI(189) XOR DI(182) XOR DI(100) XOR DI(176) XOR DI(94) XOR DI(249) XOR DI(255); + DO(6) <= DI(238) XOR DI(89) XOR DI(57) XOR DI(13) XOR DI(7) XOR DI(122) XOR DI(73) XOR DI(14) XOR DI(144) XOR DI(131) XOR DI(106) XOR DI(105) XOR DI(160) XOR DI(72) XOR DI(233) XOR DI(8) XOR DI(35) XOR DI(211) XOR DI(93) XOR DI(217) XOR DI(162) XOR DI(178) XOR DI(163) XOR DI(111) XOR DI(34) XOR DI(164) XOR DI(76) XOR DI(47) XOR DI(214) XOR DI(3) XOR DI(30) XOR DI(112) XOR DI(79) XOR DI(234) XOR DI(4) XOR DI(96) XOR DI(207) XOR DI(153) XOR DI(66) XOR DI(204) XOR DI(69) XOR DI(197) XOR DI(194) XOR DI(184) XOR DI(138) XOR DI(226) XOR DI(42) XOR DI(124) XOR DI(40) XOR DI(94) XOR DI(148) XOR DI(218) XOR DI(80) XOR DI(191) XOR DI(22) XOR DI(151) XOR DI(236) XOR DI(36) XOR DI(133) XOR DI(120) XOR DI(165) XOR DI(58) XOR DI(129) XOR DI(38) XOR DI(49) XOR DI(215) XOR DI(179) XOR DI(173) XOR DI(167) XOR DI(85) XOR DI(240) XOR DI(252) XOR DI(5) XOR DI(135) XOR DI(224) XOR DI(26) XOR DI(84) XOR DI(169) XOR DI(25) XOR DI(155) XOR DI(87) XOR DI(198) XOR DI(60) XOR DI(188) XOR DI(71) XOR DI(142) XOR DI(227) XOR DI(156) XOR DI(29) XOR DI(206) XOR DI(126) XOR DI(62) XOR DI(118) XOR DI(140) XOR DI(52) XOR DI(127) XOR DI(125) XOR DI(157) XOR DI(171) XOR DI(172) XOR DI(244) XOR DI(91) XOR DI(149) XOR DI(61) XOR DI(199) XOR DI(219) XOR DI(203) XOR DI(136) XOR DI(150) XOR DI(237) XOR DI(10) XOR DI(134) XOR DI(121) XOR DI(222) XOR DI(166) XOR DI(193) XOR DI(50) XOR DI(104) XOR DI(180) XOR DI(44) XOR DI(98) XOR DI(181) XOR DI(174) XOR DI(92) XOR DI(168) XOR DI(86) XOR DI(247) XOR DI(253); + DO(7) <= DI(239) XOR DI(90) XOR DI(58) XOR DI(14) XOR DI(8) XOR DI(123) XOR DI(74) XOR DI(15) XOR DI(145) XOR DI(132) XOR DI(107) XOR DI(106) XOR DI(161) XOR DI(73) XOR DI(234) XOR DI(9) XOR DI(0) XOR DI(36) XOR DI(212) XOR DI(94) XOR DI(218) XOR DI(163) XOR DI(179) XOR DI(164) XOR DI(112) XOR DI(35) XOR DI(165) XOR DI(77) XOR DI(48) XOR DI(215) XOR DI(4) XOR DI(31) XOR DI(113) XOR DI(80) XOR DI(235) XOR DI(5) XOR DI(97) XOR DI(208) XOR DI(154) XOR DI(67) XOR DI(205) XOR DI(70) XOR DI(198) XOR DI(195) XOR DI(185) XOR DI(139) XOR DI(227) XOR DI(43) XOR DI(125) XOR DI(41) XOR DI(95) XOR DI(149) XOR DI(219) XOR DI(81) XOR DI(192) XOR DI(23) XOR DI(152) XOR DI(237) XOR DI(37) XOR DI(134) XOR DI(121) XOR DI(166) XOR DI(59) XOR DI(130) XOR DI(39) XOR DI(50) XOR DI(216) XOR DI(180) XOR DI(174) XOR DI(168) XOR DI(86) XOR DI(241) XOR DI(253) XOR DI(6) XOR DI(136) XOR DI(225) XOR DI(27) XOR DI(85) XOR DI(170) XOR DI(26) XOR DI(156) XOR DI(88) XOR DI(199) XOR DI(61) XOR DI(189) XOR DI(72) XOR DI(143) XOR DI(228) XOR DI(157) XOR DI(30) XOR DI(207) XOR DI(127) XOR DI(63) XOR DI(119) XOR DI(141) XOR DI(53) XOR DI(128) XOR DI(126) XOR DI(158) XOR DI(172) XOR DI(173) XOR DI(245) XOR DI(92) XOR DI(150) XOR DI(62) XOR DI(200) XOR DI(220) XOR DI(204) XOR DI(137) XOR DI(151) XOR DI(238) XOR DI(11) XOR DI(135) XOR DI(122) XOR DI(223) XOR DI(167) XOR DI(194) XOR DI(51) XOR DI(105) XOR DI(181) XOR DI(45) XOR DI(99) XOR DI(182) XOR DI(175) XOR DI(93) XOR DI(169) XOR DI(87) XOR DI(248) XOR DI(254); + DO(8) <= DI(240) XOR DI(91) XOR DI(59) XOR DI(15) XOR DI(9) XOR DI(124) XOR DI(75) XOR DI(16) XOR DI(146) XOR DI(133) XOR DI(108) XOR DI(107) XOR DI(162) XOR DI(74) XOR DI(235) XOR DI(10) XOR DI(1) XOR DI(37) XOR DI(213) XOR DI(95) XOR DI(219) XOR DI(164) XOR DI(180) XOR DI(165) XOR DI(113) XOR DI(36) XOR DI(166) XOR DI(78) XOR DI(49) XOR DI(216) XOR DI(5) XOR DI(32) XOR DI(114) XOR DI(81) XOR DI(236) XOR DI(6) XOR DI(98) XOR DI(209) XOR DI(155) XOR DI(68) XOR DI(206) XOR DI(71) XOR DI(199) XOR DI(196) XOR DI(186) XOR DI(140) XOR DI(228) XOR DI(44) XOR DI(126) XOR DI(42) XOR DI(96) XOR DI(150) XOR DI(220) XOR DI(82) XOR DI(193) XOR DI(24) XOR DI(153) XOR DI(238) XOR DI(38) XOR DI(135) XOR DI(122) XOR DI(167) XOR DI(60) XOR DI(131) XOR DI(40) XOR DI(51) XOR DI(217) XOR DI(181) XOR DI(175) XOR DI(169) XOR DI(87) XOR DI(242) XOR DI(254) XOR DI(0) XOR DI(7) XOR DI(137) XOR DI(226) XOR DI(28) XOR DI(86) XOR DI(171) XOR DI(27) XOR DI(157) XOR DI(89) XOR DI(200) XOR DI(62) XOR DI(190) XOR DI(73) XOR DI(144) XOR DI(229) XOR DI(158) XOR DI(31) XOR DI(208) XOR DI(128) XOR DI(64) XOR DI(120) XOR DI(142) XOR DI(54) XOR DI(129) XOR DI(127) XOR DI(159) XOR DI(173) XOR DI(174) XOR DI(246) XOR DI(93) XOR DI(151) XOR DI(63) XOR DI(201) XOR DI(221) XOR DI(205) XOR DI(138) XOR DI(152) XOR DI(239) XOR DI(12) XOR DI(136) XOR DI(123) XOR DI(224) XOR DI(168) XOR DI(195) XOR DI(52) XOR DI(106) XOR DI(182) XOR DI(46) XOR DI(100) XOR DI(183) XOR DI(176) XOR DI(94) XOR DI(170) XOR DI(88) XOR DI(249) XOR DI(255); + DO(9) <= DI(68) XOR DI(26) XOR DI(203) XOR DI(4) XOR DI(70) XOR DI(241) XOR DI(92) XOR DI(60) XOR DI(193) XOR DI(49) XOR DI(16) XOR DI(10) XOR DI(140) XOR DI(228) XOR DI(125) XOR DI(30) XOR DI(232) XOR DI(244) XOR DI(76) XOR DI(17) XOR DI(147) XOR DI(134) XOR DI(198) XOR DI(109) XOR DI(108) XOR DI(44) XOR DI(163) XOR DI(75) XOR DI(236) XOR DI(11) XOR DI(2) XOR DI(38) XOR DI(214) XOR DI(96) XOR DI(131) XOR DI(59) XOR DI(220) XOR DI(22) XOR DI(165) XOR DI(150) XOR DI(98) XOR DI(66) XOR DI(181) XOR DI(166) XOR DI(122) XOR DI(113) XOR DI(105) XOR DI(114) XOR DI(37) XOR DI(167) XOR DI(79) XOR DI(155) XOR DI(219) XOR DI(50) XOR DI(217) XOR DI(146) XOR DI(19) XOR DI(6) XOR DI(33) XOR DI(42) XOR DI(115) XOR DI(162) XOR DI(212) XOR DI(133) XOR DI(40) XOR DI(82) XOR DI(237) XOR DI(231) XOR DI(7) XOR DI(99) XOR DI(226) XOR DI(86) XOR DI(210) XOR DI(156) XOR DI(157) XOR DI(69) XOR DI(207) XOR DI(72) XOR DI(200) XOR DI(197) XOR DI(62) XOR DI(190) XOR DI(187) XOR DI(141) XOR DI(211) XOR DI(73) XOR DI(229) XOR DI(208) XOR DI(119) XOR DI(45) XOR DI(120) XOR DI(84) XOR DI(142) XOR DI(54) XOR DI(127) XOR DI(43) XOR DI(97) XOR DI(173) XOR DI(85) XOR DI(161) XOR DI(246) XOR DI(151) XOR DI(221) XOR DI(83) XOR DI(194) XOR DI(25) XOR DI(154) XOR DI(239) XOR DI(58) XOR DI(39) XOR DI(112) XOR DI(136) XOR DI(48) XOR DI(123) XOR DI(224) XOR DI(168) XOR DI(57) XOR DI(195) XOR DI(188) XOR DI(61) XOR DI(132) XOR DI(41) XOR DI(52) XOR DI(218) XOR DI(189) XOR DI(182) XOR DI(46) XOR DI(100) XOR DI(176) XOR DI(170) XOR DI(88) XOR DI(243) XOR DI(255); + DO(10) <= DI(0) XOR DI(65) XOR DI(66) XOR DI(231) XOR DI(4) XOR DI(69) XOR DI(27) XOR DI(204) XOR DI(5) XOR DI(105) XOR DI(71) XOR DI(175) XOR DI(242) XOR DI(93) XOR DI(61) XOR DI(138) XOR DI(194) XOR DI(228) XOR DI(1) XOR DI(28) XOR DI(50) XOR DI(17) XOR DI(11) XOR DI(141) XOR DI(229) XOR DI(29) XOR DI(126) XOR DI(31) XOR DI(172) XOR DI(160) XOR DI(233) XOR DI(245) XOR DI(90) XOR DI(19) XOR DI(77) XOR DI(18) XOR DI(148) XOR DI(135) XOR DI(199) XOR DI(119) XOR DI(110) XOR DI(109) XOR DI(45) XOR DI(150) XOR DI(164) XOR DI(76) XOR DI(237) XOR DI(12) XOR DI(54) XOR DI(129) XOR DI(193) XOR DI(145) XOR DI(3) XOR DI(30) XOR DI(39) XOR DI(215) XOR DI(112) XOR DI(159) XOR DI(32) XOR DI(97) XOR DI(130) XOR DI(173) XOR DI(161) XOR DI(246) XOR DI(226) XOR DI(132) XOR DI(94) XOR DI(60) XOR DI(221) XOR DI(23) XOR DI(166) XOR DI(151) XOR DI(99) XOR DI(22) XOR DI(64) XOR DI(202) XOR DI(67) XOR DI(57) XOR DI(182) XOR DI(206) XOR DI(68) XOR DI(139) XOR DI(224) XOR DI(153) XOR DI(203) XOR DI(167) XOR DI(123) XOR DI(13) XOR DI(48) XOR DI(114) XOR DI(106) XOR DI(115) XOR DI(122) XOR DI(38) XOR DI(168) XOR DI(80) XOR DI(156) XOR DI(220) XOR DI(146) XOR DI(51) XOR DI(218) XOR DI(147) XOR DI(20) XOR DI(7) XOR DI(34) XOR DI(107) XOR DI(131) XOR DI(43) XOR DI(116) XOR DI(163) XOR DI(140) XOR DI(213) XOR DI(134) XOR DI(184) XOR DI(41) XOR DI(95) XOR DI(83) XOR DI(238) XOR DI(250); + DO(11) <= DI(1) XOR DI(66) XOR DI(67) XOR DI(232) XOR DI(5) XOR DI(70) XOR DI(28) XOR DI(205) XOR DI(6) XOR DI(106) XOR DI(72) XOR DI(176) XOR DI(243) XOR DI(94) XOR DI(62) XOR DI(139) XOR DI(195) XOR DI(229) XOR DI(2) XOR DI(29) XOR DI(51) XOR DI(18) XOR DI(12) XOR DI(142) XOR DI(230) XOR DI(30) XOR DI(127) XOR DI(32) XOR DI(173) XOR DI(161) XOR DI(234) XOR DI(246) XOR DI(91) XOR DI(20) XOR DI(78) XOR DI(19) XOR DI(149) XOR DI(136) XOR DI(200) XOR DI(120) XOR DI(111) XOR DI(110) XOR DI(46) XOR DI(151) XOR DI(165) XOR DI(77) XOR DI(238) XOR DI(13) XOR DI(55) XOR DI(130) XOR DI(194) XOR DI(146) XOR DI(4) XOR DI(31) XOR DI(40) XOR DI(216) XOR DI(113) XOR DI(160) XOR DI(33) XOR DI(98) XOR DI(131) XOR DI(174) XOR DI(162) XOR DI(247) XOR DI(227) XOR DI(133) XOR DI(95) XOR DI(61) XOR DI(222) XOR DI(24) XOR DI(167) XOR DI(152) XOR DI(100) XOR DI(23) XOR DI(65) XOR DI(203) XOR DI(68) XOR DI(58) XOR DI(183) XOR DI(207) XOR DI(69) XOR DI(140) XOR DI(225) XOR DI(154) XOR DI(204) XOR DI(168) XOR DI(124) XOR DI(14) XOR DI(49) XOR DI(115) XOR DI(107) XOR DI(116) XOR DI(123) XOR DI(39) XOR DI(169) XOR DI(81) XOR DI(157) XOR DI(221) XOR DI(147) XOR DI(52) XOR DI(219) XOR DI(148) XOR DI(21) XOR DI(8) XOR DI(35) XOR DI(108) XOR DI(132) XOR DI(44) XOR DI(117) XOR DI(164) XOR DI(141) XOR DI(214) XOR DI(135) XOR DI(185) XOR DI(42) XOR DI(96) XOR DI(84) XOR DI(239) XOR DI(251); + DO(12) <= DI(2) XOR DI(67) XOR DI(68) XOR DI(233) XOR DI(6) XOR DI(71) XOR DI(29) XOR DI(206) XOR DI(7) XOR DI(107) XOR DI(73) XOR DI(177) XOR DI(244) XOR DI(95) XOR DI(63) XOR DI(140) XOR DI(196) XOR DI(230) XOR DI(3) XOR DI(30) XOR DI(52) XOR DI(19) XOR DI(13) XOR DI(143) XOR DI(231) XOR DI(31) XOR DI(128) XOR DI(33) XOR DI(174) XOR DI(162) XOR DI(235) XOR DI(247) XOR DI(92) XOR DI(21) XOR DI(79) XOR DI(20) XOR DI(150) XOR DI(137) XOR DI(201) XOR DI(121) XOR DI(112) XOR DI(111) XOR DI(47) XOR DI(152) XOR DI(166) XOR DI(78) XOR DI(239) XOR DI(14) XOR DI(56) XOR DI(131) XOR DI(195) XOR DI(147) XOR DI(5) XOR DI(32) XOR DI(41) XOR DI(217) XOR DI(114) XOR DI(161) XOR DI(34) XOR DI(99) XOR DI(132) XOR DI(175) XOR DI(163) XOR DI(248) XOR DI(228) XOR DI(134) XOR DI(96) XOR DI(62) XOR DI(223) XOR DI(25) XOR DI(168) XOR DI(153) XOR DI(101) XOR DI(24) XOR DI(66) XOR DI(204) XOR DI(69) XOR DI(59) XOR DI(184) XOR DI(208) XOR DI(70) XOR DI(141) XOR DI(226) XOR DI(155) XOR DI(205) XOR DI(169) XOR DI(125) XOR DI(15) XOR DI(50) XOR DI(116) XOR DI(108) XOR DI(117) XOR DI(124) XOR DI(40) XOR DI(170) XOR DI(82) XOR DI(158) XOR DI(222) XOR DI(148) XOR DI(53) XOR DI(220) XOR DI(149) XOR DI(22) XOR DI(9) XOR DI(36) XOR DI(109) XOR DI(133) XOR DI(45) XOR DI(118) XOR DI(165) XOR DI(142) XOR DI(215) XOR DI(136) XOR DI(186) XOR DI(43) XOR DI(97) XOR DI(85) XOR DI(240) XOR DI(252); + DO(13) <= DI(3) XOR DI(68) XOR DI(69) XOR DI(234) XOR DI(7) XOR DI(72) XOR DI(30) XOR DI(207) XOR DI(8) XOR DI(108) XOR DI(74) XOR DI(178) XOR DI(245) XOR DI(96) XOR DI(64) XOR DI(141) XOR DI(197) XOR DI(231) XOR DI(4) XOR DI(31) XOR DI(53) XOR DI(20) XOR DI(14) XOR DI(144) XOR DI(232) XOR DI(32) XOR DI(129) XOR DI(34) XOR DI(175) XOR DI(163) XOR DI(236) XOR DI(248) XOR DI(93) XOR DI(22) XOR DI(80) XOR DI(21) XOR DI(151) XOR DI(138) XOR DI(202) XOR DI(122) XOR DI(113) XOR DI(112) XOR DI(48) XOR DI(153) XOR DI(167) XOR DI(79) XOR DI(240) XOR DI(15) XOR DI(57) XOR DI(132) XOR DI(196) XOR DI(148) XOR DI(6) XOR DI(33) XOR DI(42) XOR DI(218) XOR DI(115) XOR DI(162) XOR DI(35) XOR DI(100) XOR DI(133) XOR DI(176) XOR DI(164) XOR DI(249) XOR DI(229) XOR DI(135) XOR DI(97) XOR DI(63) XOR DI(224) XOR DI(26) XOR DI(169) XOR DI(154) XOR DI(102) XOR DI(25) XOR DI(67) XOR DI(205) XOR DI(70) XOR DI(60) XOR DI(185) XOR DI(209) XOR DI(71) XOR DI(142) XOR DI(227) XOR DI(156) XOR DI(206) XOR DI(170) XOR DI(126) XOR DI(16) XOR DI(51) XOR DI(117) XOR DI(109) XOR DI(118) XOR DI(125) XOR DI(41) XOR DI(171) XOR DI(83) XOR DI(159) XOR DI(223) XOR DI(149) XOR DI(54) XOR DI(221) XOR DI(150) XOR DI(23) XOR DI(10) XOR DI(37) XOR DI(110) XOR DI(134) XOR DI(46) XOR DI(119) XOR DI(166) XOR DI(143) XOR DI(216) XOR DI(137) XOR DI(187) XOR DI(44) XOR DI(98) XOR DI(86) XOR DI(241) XOR DI(253); + DO(14) <= DI(4) XOR DI(69) XOR DI(70) XOR DI(235) XOR DI(8) XOR DI(73) XOR DI(31) XOR DI(208) XOR DI(9) XOR DI(109) XOR DI(75) XOR DI(179) XOR DI(246) XOR DI(97) XOR DI(65) XOR DI(142) XOR DI(198) XOR DI(232) XOR DI(5) XOR DI(32) XOR DI(54) XOR DI(21) XOR DI(15) XOR DI(145) XOR DI(233) XOR DI(33) XOR DI(130) XOR DI(35) XOR DI(176) XOR DI(164) XOR DI(237) XOR DI(249) XOR DI(94) XOR DI(23) XOR DI(81) XOR DI(22) XOR DI(152) XOR DI(139) XOR DI(203) XOR DI(123) XOR DI(114) XOR DI(113) XOR DI(49) XOR DI(154) XOR DI(168) XOR DI(80) XOR DI(241) XOR DI(16) XOR DI(58) XOR DI(133) XOR DI(197) XOR DI(149) XOR DI(7) XOR DI(34) XOR DI(43) XOR DI(219) XOR DI(116) XOR DI(163) XOR DI(36) XOR DI(101) XOR DI(134) XOR DI(177) XOR DI(165) XOR DI(250) XOR DI(230) XOR DI(136) XOR DI(98) XOR DI(64) XOR DI(225) XOR DI(27) XOR DI(170) XOR DI(155) XOR DI(103) XOR DI(26) XOR DI(68) XOR DI(206) XOR DI(71) XOR DI(61) XOR DI(186) XOR DI(210) XOR DI(72) XOR DI(143) XOR DI(228) XOR DI(157) XOR DI(207) XOR DI(171) XOR DI(127) XOR DI(17) XOR DI(52) XOR DI(118) XOR DI(110) XOR DI(119) XOR DI(126) XOR DI(42) XOR DI(172) XOR DI(84) XOR DI(160) XOR DI(224) XOR DI(150) XOR DI(55) XOR DI(222) XOR DI(151) XOR DI(24) XOR DI(11) XOR DI(38) XOR DI(111) XOR DI(135) XOR DI(47) XOR DI(120) XOR DI(167) XOR DI(144) XOR DI(217) XOR DI(138) XOR DI(188) XOR DI(45) XOR DI(99) XOR DI(87) XOR DI(242) XOR DI(254); + DO(15) <= DI(5) XOR DI(70) XOR DI(71) XOR DI(236) XOR DI(9) XOR DI(74) XOR DI(32) XOR DI(209) XOR DI(10) XOR DI(110) XOR DI(76) XOR DI(180) XOR DI(247) XOR DI(98) XOR DI(66) XOR DI(143) XOR DI(199) XOR DI(233) XOR DI(6) XOR DI(33) XOR DI(55) XOR DI(22) XOR DI(16) XOR DI(146) XOR DI(234) XOR DI(34) XOR DI(131) XOR DI(36) XOR DI(177) XOR DI(165) XOR DI(238) XOR DI(250) XOR DI(95) XOR DI(24) XOR DI(82) XOR DI(23) XOR DI(153) XOR DI(140) XOR DI(204) XOR DI(124) XOR DI(115) XOR DI(114) XOR DI(50) XOR DI(155) XOR DI(169) XOR DI(81) XOR DI(242) XOR DI(17) XOR DI(59) XOR DI(134) XOR DI(198) XOR DI(150) XOR DI(8) XOR DI(35) XOR DI(44) XOR DI(220) XOR DI(117) XOR DI(164) XOR DI(37) XOR DI(102) XOR DI(135) XOR DI(178) XOR DI(166) XOR DI(251) XOR DI(231) XOR DI(137) XOR DI(99) XOR DI(65) XOR DI(226) XOR DI(28) XOR DI(171) XOR DI(156) XOR DI(104) XOR DI(27) XOR DI(69) XOR DI(207) XOR DI(72) XOR DI(62) XOR DI(187) XOR DI(211) XOR DI(73) XOR DI(144) XOR DI(229) XOR DI(158) XOR DI(208) XOR DI(172) XOR DI(128) XOR DI(18) XOR DI(53) XOR DI(119) XOR DI(111) XOR DI(120) XOR DI(127) XOR DI(43) XOR DI(173) XOR DI(85) XOR DI(161) XOR DI(225) XOR DI(151) XOR DI(56) XOR DI(223) XOR DI(152) XOR DI(25) XOR DI(12) XOR DI(39) XOR DI(112) XOR DI(136) XOR DI(48) XOR DI(121) XOR DI(168) XOR DI(145) XOR DI(218) XOR DI(139) XOR DI(189) XOR DI(46) XOR DI(100) XOR DI(88) XOR DI(243) XOR DI(255); + DO(16) <= DI(6) XOR DI(71) XOR DI(72) XOR DI(1) XOR DI(30) XOR DI(237) XOR DI(10) XOR DI(143) XOR DI(75) XOR DI(231) XOR DI(160) XOR DI(33) XOR DI(98) XOR DI(210) XOR DI(247) XOR DI(130) XOR DI(11) XOR DI(46) XOR DI(111) XOR DI(77) XOR DI(32) XOR DI(161) XOR DI(181) XOR DI(211) XOR DI(175) XOR DI(87) XOR DI(248) XOR DI(99) XOR DI(67) XOR DI(195) XOR DI(144) XOR DI(200) XOR DI(234) XOR DI(7) XOR DI(34) XOR DI(131) XOR DI(56) XOR DI(177) XOR DI(250) XOR DI(95) XOR DI(206) XOR DI(23) XOR DI(65) XOR DI(203) XOR DI(68) XOR DI(196) XOR DI(193) XOR DI(183) XOR DI(225) XOR DI(107) XOR DI(17) XOR DI(147) XOR DI(201) XOR DI(150) XOR DI(235) XOR DI(8) XOR DI(35) XOR DI(132) XOR DI(119) XOR DI(37) XOR DI(48) XOR DI(178) XOR DI(166) XOR DI(84) XOR DI(239) XOR DI(251) XOR DI(228) XOR DI(4) XOR DI(96) XOR DI(62) XOR DI(25) XOR DI(83) XOR DI(24) XOR DI(154) XOR DI(59) XOR DI(184) XOR DI(141) XOR DI(155) XOR DI(205) XOR DI(125) XOR DI(116) XOR DI(42) XOR DI(115) XOR DI(139) XOR DI(51) XOR DI(189) XOR DI(124) XOR DI(156) XOR DI(94) XOR DI(170) XOR DI(171) XOR DI(82) XOR DI(158) XOR DI(243) XOR DI(222) XOR DI(90) XOR DI(18) XOR DI(60) XOR DI(198) XOR DI(191) XOR DI(53) XOR DI(202) XOR DI(64) XOR DI(135) XOR DI(22) XOR DI(199) XOR DI(151) XOR DI(9) XOR DI(55) XOR DI(36) XOR DI(133) XOR DI(45) XOR DI(221) XOR DI(118) XOR DI(165) XOR DI(142) XOR DI(58) XOR DI(38) XOR DI(103) XOR DI(136) XOR DI(179) XOR DI(167) XOR DI(85) XOR DI(240) XOR DI(246) XOR DI(252); + DO(17) <= DI(7) XOR DI(72) XOR DI(73) XOR DI(2) XOR DI(31) XOR DI(238) XOR DI(11) XOR DI(144) XOR DI(76) XOR DI(232) XOR DI(161) XOR DI(34) XOR DI(99) XOR DI(211) XOR DI(248) XOR DI(131) XOR DI(12) XOR DI(47) XOR DI(112) XOR DI(78) XOR DI(33) XOR DI(162) XOR DI(182) XOR DI(212) XOR DI(176) XOR DI(88) XOR DI(249) XOR DI(100) XOR DI(68) XOR DI(196) XOR DI(145) XOR DI(201) XOR DI(235) XOR DI(8) XOR DI(35) XOR DI(132) XOR DI(57) XOR DI(178) XOR DI(251) XOR DI(96) XOR DI(207) XOR DI(24) XOR DI(66) XOR DI(204) XOR DI(69) XOR DI(197) XOR DI(194) XOR DI(184) XOR DI(226) XOR DI(108) XOR DI(0) XOR DI(18) XOR DI(148) XOR DI(202) XOR DI(151) XOR DI(236) XOR DI(9) XOR DI(36) XOR DI(133) XOR DI(120) XOR DI(38) XOR DI(49) XOR DI(179) XOR DI(167) XOR DI(85) XOR DI(240) XOR DI(252) XOR DI(229) XOR DI(5) XOR DI(97) XOR DI(63) XOR DI(26) XOR DI(84) XOR DI(25) XOR DI(155) XOR DI(60) XOR DI(185) XOR DI(142) XOR DI(156) XOR DI(206) XOR DI(126) XOR DI(117) XOR DI(43) XOR DI(116) XOR DI(140) XOR DI(52) XOR DI(190) XOR DI(125) XOR DI(157) XOR DI(95) XOR DI(171) XOR DI(172) XOR DI(83) XOR DI(159) XOR DI(244) XOR DI(223) XOR DI(91) XOR DI(19) XOR DI(61) XOR DI(199) XOR DI(192) XOR DI(54) XOR DI(203) XOR DI(65) XOR DI(136) XOR DI(23) XOR DI(200) XOR DI(152) XOR DI(10) XOR DI(56) XOR DI(37) XOR DI(134) XOR DI(46) XOR DI(222) XOR DI(119) XOR DI(166) XOR DI(143) XOR DI(59) XOR DI(39) XOR DI(104) XOR DI(137) XOR DI(180) XOR DI(168) XOR DI(86) XOR DI(241) XOR DI(247) XOR DI(253); + DO(18) <= DI(8) XOR DI(73) XOR DI(74) XOR DI(3) XOR DI(32) XOR DI(239) XOR DI(12) XOR DI(145) XOR DI(77) XOR DI(233) XOR DI(162) XOR DI(35) XOR DI(100) XOR DI(212) XOR DI(249) XOR DI(132) XOR DI(13) XOR DI(48) XOR DI(113) XOR DI(79) XOR DI(34) XOR DI(163) XOR DI(183) XOR DI(213) XOR DI(177) XOR DI(89) XOR DI(250) XOR DI(101) XOR DI(69) XOR DI(197) XOR DI(146) XOR DI(202) XOR DI(236) XOR DI(9) XOR DI(36) XOR DI(133) XOR DI(58) XOR DI(179) XOR DI(252) XOR DI(97) XOR DI(208) XOR DI(25) XOR DI(67) XOR DI(205) XOR DI(70) XOR DI(198) XOR DI(195) XOR DI(185) XOR DI(227) XOR DI(109) XOR DI(1) XOR DI(19) XOR DI(149) XOR DI(203) XOR DI(152) XOR DI(237) XOR DI(10) XOR DI(37) XOR DI(134) XOR DI(121) XOR DI(39) XOR DI(50) XOR DI(180) XOR DI(168) XOR DI(86) XOR DI(241) XOR DI(253) XOR DI(230) XOR DI(6) XOR DI(98) XOR DI(64) XOR DI(27) XOR DI(85) XOR DI(26) XOR DI(156) XOR DI(61) XOR DI(186) XOR DI(143) XOR DI(157) XOR DI(207) XOR DI(127) XOR DI(118) XOR DI(44) XOR DI(117) XOR DI(141) XOR DI(53) XOR DI(191) XOR DI(126) XOR DI(158) XOR DI(96) XOR DI(172) XOR DI(173) XOR DI(84) XOR DI(160) XOR DI(245) XOR DI(224) XOR DI(92) XOR DI(20) XOR DI(62) XOR DI(200) XOR DI(193) XOR DI(55) XOR DI(204) XOR DI(66) XOR DI(137) XOR DI(24) XOR DI(201) XOR DI(153) XOR DI(11) XOR DI(57) XOR DI(38) XOR DI(135) XOR DI(47) XOR DI(223) XOR DI(120) XOR DI(167) XOR DI(144) XOR DI(60) XOR DI(40) XOR DI(105) XOR DI(138) XOR DI(181) XOR DI(169) XOR DI(87) XOR DI(242) XOR DI(248) XOR DI(254); + DO(19) <= DI(9) XOR DI(74) XOR DI(75) XOR DI(4) XOR DI(33) XOR DI(240) XOR DI(13) XOR DI(146) XOR DI(78) XOR DI(234) XOR DI(163) XOR DI(36) XOR DI(101) XOR DI(213) XOR DI(250) XOR DI(133) XOR DI(14) XOR DI(49) XOR DI(114) XOR DI(80) XOR DI(35) XOR DI(164) XOR DI(184) XOR DI(214) XOR DI(178) XOR DI(90) XOR DI(251) XOR DI(102) XOR DI(70) XOR DI(198) XOR DI(147) XOR DI(203) XOR DI(237) XOR DI(10) XOR DI(37) XOR DI(134) XOR DI(59) XOR DI(180) XOR DI(253) XOR DI(98) XOR DI(209) XOR DI(26) XOR DI(68) XOR DI(206) XOR DI(71) XOR DI(199) XOR DI(196) XOR DI(186) XOR DI(228) XOR DI(110) XOR DI(2) XOR DI(20) XOR DI(150) XOR DI(204) XOR DI(153) XOR DI(238) XOR DI(11) XOR DI(38) XOR DI(135) XOR DI(122) XOR DI(40) XOR DI(51) XOR DI(181) XOR DI(169) XOR DI(87) XOR DI(242) XOR DI(254) XOR DI(231) XOR DI(0) XOR DI(7) XOR DI(99) XOR DI(65) XOR DI(28) XOR DI(86) XOR DI(27) XOR DI(157) XOR DI(62) XOR DI(187) XOR DI(144) XOR DI(158) XOR DI(208) XOR DI(128) XOR DI(119) XOR DI(45) XOR DI(118) XOR DI(142) XOR DI(54) XOR DI(192) XOR DI(127) XOR DI(159) XOR DI(97) XOR DI(173) XOR DI(174) XOR DI(85) XOR DI(161) XOR DI(246) XOR DI(225) XOR DI(93) XOR DI(21) XOR DI(63) XOR DI(201) XOR DI(194) XOR DI(56) XOR DI(205) XOR DI(67) XOR DI(138) XOR DI(25) XOR DI(202) XOR DI(154) XOR DI(12) XOR DI(58) XOR DI(39) XOR DI(136) XOR DI(48) XOR DI(224) XOR DI(121) XOR DI(168) XOR DI(145) XOR DI(61) XOR DI(41) XOR DI(106) XOR DI(139) XOR DI(182) XOR DI(170) XOR DI(88) XOR DI(243) XOR DI(249) XOR DI(255); + DO(20) <= DI(10) XOR DI(75) XOR DI(74) XOR DI(76) XOR DI(5) XOR DI(32) XOR DI(34) XOR DI(113) XOR DI(19) XOR DI(212) XOR DI(177) XOR DI(95) XOR DI(241) XOR DI(14) XOR DI(147) XOR DI(79) XOR DI(219) XOR DI(235) XOR DI(164) XOR DI(37) XOR DI(102) XOR DI(214) XOR DI(251) XOR DI(4) XOR DI(134) XOR DI(101) XOR DI(184) XOR DI(70) XOR DI(15) XOR DI(50) XOR DI(115) XOR DI(81) XOR DI(124) XOR DI(90) XOR DI(198) XOR DI(36) XOR DI(133) XOR DI(165) XOR DI(185) XOR DI(215) XOR DI(179) XOR DI(91) XOR DI(240) XOR DI(252) XOR DI(103) XOR DI(71) XOR DI(199) XOR DI(196) XOR DI(228) XOR DI(30) XOR DI(148) XOR DI(44) XOR DI(191) XOR DI(150) XOR DI(204) XOR DI(222) XOR DI(153) XOR DI(238) XOR DI(11) XOR DI(38) XOR DI(135) XOR DI(60) XOR DI(131) XOR DI(105) XOR DI(181) XOR DI(254) XOR DI(231) XOR DI(0) XOR DI(99) XOR DI(65) XOR DI(210) XOR DI(27) XOR DI(157) XOR DI(69) XOR DI(207) XOR DI(72) XOR DI(227) XOR DI(200) XOR DI(197) XOR DI(190) XOR DI(187) XOR DI(211) XOR DI(73) XOR DI(229) XOR DI(208) XOR DI(172) XOR DI(53) XOR DI(111) XOR DI(84) XOR DI(142) XOR DI(54) XOR DI(230) XOR DI(3) XOR DI(173) XOR DI(85) XOR DI(161) XOR DI(246) XOR DI(21) XOR DI(151) XOR DI(201) XOR DI(205) XOR DI(138) XOR DI(152) XOR DI(154) XOR DI(239) XOR DI(12) XOR DI(47) XOR DI(58) XOR DI(39) XOR DI(112) XOR DI(136) XOR DI(48) XOR DI(123) XOR DI(224) XOR DI(121) XOR DI(41) XOR DI(52) XOR DI(130) XOR DI(189) XOR DI(182) XOR DI(170) XOR DI(88) XOR DI(243) XOR DI(255); + DO(21) <= DI(8) XOR DI(11) XOR DI(30) XOR DI(32) XOR DI(76) XOR DI(75) XOR DI(175) XOR DI(105) XOR DI(77) XOR DI(6) XOR DI(33) XOR DI(35) XOR DI(68) XOR DI(114) XOR DI(196) XOR DI(20) XOR DI(107) XOR DI(213) XOR DI(177) XOR DI(178) XOR DI(250) XOR DI(96) XOR DI(101) XOR DI(184) XOR DI(242) XOR DI(15) XOR DI(146) XOR DI(90) XOR DI(148) XOR DI(80) XOR DI(220) XOR DI(236) XOR DI(133) XOR DI(165) XOR DI(38) XOR DI(103) XOR DI(215) XOR DI(252) XOR DI(5) XOR DI(135) XOR DI(26) XOR DI(169) XOR DI(102) XOR DI(87) XOR DI(185) XOR DI(71) XOR DI(16) XOR DI(51) XOR DI(116) XOR DI(82) XOR DI(140) XOR DI(125) XOR DI(95) XOR DI(91) XOR DI(19) XOR DI(199) XOR DI(219) XOR DI(203) XOR DI(150) XOR DI(37) XOR DI(134) XOR DI(222) XOR DI(166) XOR DI(193) XOR DI(186) XOR DI(216) XOR DI(180) XOR DI(44) XOR DI(98) XOR DI(92) XOR DI(241) XOR DI(253) XOR DI(65) XOR DI(226) XOR DI(104) XOR DI(157) XOR DI(72) XOR DI(227) XOR DI(200) XOR DI(197) XOR DI(62) XOR DI(229) XOR DI(29) XOR DI(31) XOR DI(172) XOR DI(160) XOR DI(128) XOR DI(64) XOR DI(149) XOR DI(119) XOR DI(45) XOR DI(120) XOR DI(84) XOR DI(142) XOR DI(192) XOR DI(129) XOR DI(159) XOR DI(161) XOR DI(246) XOR DI(151) XOR DI(63) XOR DI(205) XOR DI(138) XOR DI(223) XOR DI(154) XOR DI(239) XOR DI(12) XOR DI(47) XOR DI(58) XOR DI(39) XOR DI(136) XOR DI(224) XOR DI(121) XOR DI(145) XOR DI(57) XOR DI(195) XOR DI(61) XOR DI(132) XOR DI(106) XOR DI(130) XOR DI(189) XOR DI(182) XOR DI(46) XOR DI(94) XOR DI(255); + DO(22) <= DI(9) XOR DI(12) XOR DI(212) XOR DI(74) XOR DI(246) XOR DI(231) XOR DI(4) XOR DI(31) XOR DI(33) XOR DI(0) XOR DI(112) XOR DI(77) XOR DI(76) XOR DI(232) XOR DI(211) XOR DI(176) XOR DI(94) XOR DI(22) XOR DI(202) XOR DI(106) XOR DI(113) XOR DI(78) XOR DI(7) XOR DI(34) XOR DI(36) XOR DI(101) XOR DI(177) XOR DI(250) XOR DI(100) XOR DI(69) XOR DI(124) XOR DI(49) XOR DI(145) XOR DI(115) XOR DI(89) XOR DI(197) XOR DI(21) XOR DI(8) XOR DI(108) XOR DI(184) XOR DI(214) XOR DI(178) XOR DI(179) XOR DI(90) XOR DI(251) XOR DI(97) XOR DI(208) XOR DI(102) XOR DI(70) XOR DI(195) XOR DI(185) XOR DI(142) XOR DI(29) XOR DI(243) XOR DI(16) XOR DI(147) XOR DI(1) XOR DI(91) XOR DI(19) XOR DI(149) XOR DI(219) XOR DI(81) XOR DI(54) XOR DI(203) XOR DI(221) XOR DI(237) XOR DI(134) XOR DI(166) XOR DI(39) XOR DI(104) XOR DI(216) XOR DI(174) XOR DI(86) XOR DI(253) XOR DI(6) XOR DI(136) XOR DI(98) XOR DI(27) XOR DI(209) XOR DI(170) XOR DI(103) XOR DI(26) XOR DI(68) XOR DI(226) XOR DI(88) XOR DI(189) XOR DI(186) XOR DI(140) XOR DI(72) XOR DI(28) XOR DI(157) XOR DI(171) XOR DI(159) XOR DI(244) XOR DI(17) XOR DI(52) XOR DI(44) XOR DI(119) XOR DI(117) XOR DI(83) XOR DI(141) XOR DI(53) XOR DI(191) XOR DI(128) XOR DI(126) XOR DI(42) XOR DI(96) XOR DI(172) XOR DI(84) XOR DI(92) XOR DI(20) XOR DI(200) XOR DI(220) XOR DI(55) XOR DI(204) XOR DI(222) XOR DI(151) XOR DI(153) XOR DI(57) XOR DI(38) XOR DI(135) XOR DI(223) XOR DI(167) XOR DI(194) XOR DI(187) XOR DI(217) XOR DI(138) XOR DI(188) XOR DI(181) XOR DI(45) XOR DI(99) XOR DI(175) XOR DI(93) XOR DI(169) XOR DI(87) XOR DI(242) XOR DI(254); + DO(23) <= DI(10) XOR DI(13) XOR DI(213) XOR DI(75) XOR DI(247) XOR DI(232) XOR DI(5) XOR DI(32) XOR DI(34) XOR DI(1) XOR DI(113) XOR DI(78) XOR DI(77) XOR DI(233) XOR DI(212) XOR DI(177) XOR DI(95) XOR DI(23) XOR DI(203) XOR DI(107) XOR DI(114) XOR DI(79) XOR DI(8) XOR DI(35) XOR DI(37) XOR DI(102) XOR DI(178) XOR DI(251) XOR DI(101) XOR DI(70) XOR DI(125) XOR DI(50) XOR DI(146) XOR DI(116) XOR DI(90) XOR DI(198) XOR DI(22) XOR DI(9) XOR DI(109) XOR DI(185) XOR DI(215) XOR DI(179) XOR DI(180) XOR DI(91) XOR DI(252) XOR DI(98) XOR DI(209) XOR DI(103) XOR DI(71) XOR DI(196) XOR DI(186) XOR DI(143) XOR DI(30) XOR DI(244) XOR DI(17) XOR DI(148) XOR DI(2) XOR DI(92) XOR DI(20) XOR DI(150) XOR DI(220) XOR DI(82) XOR DI(55) XOR DI(204) XOR DI(222) XOR DI(238) XOR DI(135) XOR DI(167) XOR DI(40) XOR DI(105) XOR DI(217) XOR DI(175) XOR DI(87) XOR DI(254) XOR DI(0) XOR DI(7) XOR DI(137) XOR DI(99) XOR DI(28) XOR DI(210) XOR DI(171) XOR DI(104) XOR DI(27) XOR DI(69) XOR DI(227) XOR DI(89) XOR DI(190) XOR DI(187) XOR DI(141) XOR DI(73) XOR DI(29) XOR DI(158) XOR DI(172) XOR DI(160) XOR DI(245) XOR DI(18) XOR DI(53) XOR DI(45) XOR DI(120) XOR DI(118) XOR DI(84) XOR DI(142) XOR DI(54) XOR DI(192) XOR DI(129) XOR DI(127) XOR DI(43) XOR DI(97) XOR DI(173) XOR DI(85) XOR DI(93) XOR DI(21) XOR DI(201) XOR DI(221) XOR DI(56) XOR DI(205) XOR DI(223) XOR DI(152) XOR DI(154) XOR DI(58) XOR DI(39) XOR DI(136) XOR DI(224) XOR DI(168) XOR DI(195) XOR DI(188) XOR DI(218) XOR DI(139) XOR DI(189) XOR DI(182) XOR DI(46) XOR DI(100) XOR DI(176) XOR DI(94) XOR DI(170) XOR DI(88) XOR DI(243) XOR DI(255); + DO(24) <= DI(11) XOR DI(14) XOR DI(214) XOR DI(76) XOR DI(232) XOR DI(32) XOR DI(175) XOR DI(248) XOR DI(233) XOR DI(6) XOR DI(33) XOR DI(162) XOR DI(35) XOR DI(212) XOR DI(2) XOR DI(68) XOR DI(13) XOR DI(114) XOR DI(113) XOR DI(79) XOR DI(122) XOR DI(78) XOR DI(234) XOR DI(107) XOR DI(131) XOR DI(213) XOR DI(178) XOR DI(250) XOR DI(4) XOR DI(96) XOR DI(24) XOR DI(66) XOR DI(204) XOR DI(184) XOR DI(146) XOR DI(108) XOR DI(42) XOR DI(115) XOR DI(124) XOR DI(80) XOR DI(9) XOR DI(36) XOR DI(133) XOR DI(38) XOR DI(49) XOR DI(103) XOR DI(179) XOR DI(240) XOR DI(252) XOR DI(26) XOR DI(102) XOR DI(87) XOR DI(198) XOR DI(209) XOR DI(71) XOR DI(126) XOR DI(51) XOR DI(147) XOR DI(117) XOR DI(91) XOR DI(199) XOR DI(203) XOR DI(150) XOR DI(23) XOR DI(10) XOR DI(110) XOR DI(186) XOR DI(216) XOR DI(180) XOR DI(181) XOR DI(92) XOR DI(247) XOR DI(253) XOR DI(231) XOR DI(0) XOR DI(99) XOR DI(65) XOR DI(226) XOR DI(210) XOR DI(104) XOR DI(157) XOR DI(72) XOR DI(227) XOR DI(197) XOR DI(62) XOR DI(187) XOR DI(73) XOR DI(144) XOR DI(158) XOR DI(31) XOR DI(208) XOR DI(160) XOR DI(245) XOR DI(18) XOR DI(53) XOR DI(64) XOR DI(149) XOR DI(120) XOR DI(84) XOR DI(129) XOR DI(230) XOR DI(3) XOR DI(93) XOR DI(21) XOR DI(151) XOR DI(63) XOR DI(201) XOR DI(221) XOR DI(83) XOR DI(56) XOR DI(205) XOR DI(223) XOR DI(152) XOR DI(239) XOR DI(58) XOR DI(112) XOR DI(136) XOR DI(48) XOR DI(168) XOR DI(145) XOR DI(195) XOR DI(41) XOR DI(106) XOR DI(218) XOR DI(139) XOR DI(176) XOR DI(88) XOR DI(255); + DO(25) <= DI(12) XOR DI(112) XOR DI(15) XOR DI(215) XOR DI(77) XOR DI(233) XOR DI(33) XOR DI(162) XOR DI(212) XOR DI(176) XOR DI(249) XOR DI(13) XOR DI(234) XOR DI(7) XOR DI(34) XOR DI(163) XOR DI(36) XOR DI(101) XOR DI(213) XOR DI(250) XOR DI(3) XOR DI(133) XOR DI(58) XOR DI(183) XOR DI(69) XOR DI(124) XOR DI(14) XOR DI(115) XOR DI(114) XOR DI(80) XOR DI(123) XOR DI(79) XOR DI(235) XOR DI(8) XOR DI(108) XOR DI(132) XOR DI(184) XOR DI(48) XOR DI(214) XOR DI(179) XOR DI(90) XOR DI(251) XOR DI(5) XOR DI(97) XOR DI(208) XOR DI(25) XOR DI(67) XOR DI(205) XOR DI(70) XOR DI(195) XOR DI(185) XOR DI(139) XOR DI(142) XOR DI(29) XOR DI(147) XOR DI(109) XOR DI(43) XOR DI(116) XOR DI(190) XOR DI(125) XOR DI(95) XOR DI(81) XOR DI(203) XOR DI(10) XOR DI(37) XOR DI(134) XOR DI(39) XOR DI(50) XOR DI(104) XOR DI(180) XOR DI(174) XOR DI(86) XOR DI(241) XOR DI(247) XOR DI(253) XOR DI(230) XOR DI(98) XOR DI(225) XOR DI(27) XOR DI(155) XOR DI(103) XOR DI(26) XOR DI(68) XOR DI(226) XOR DI(88) XOR DI(199) XOR DI(189) XOR DI(210) XOR DI(72) XOR DI(143) XOR DI(28) XOR DI(157) XOR DI(30) XOR DI(171) XOR DI(244) XOR DI(127) XOR DI(52) XOR DI(148) XOR DI(118) XOR DI(44) XOR DI(119) XOR DI(53) XOR DI(191) XOR DI(128) XOR DI(172) XOR DI(173) XOR DI(160) XOR DI(92) XOR DI(62) XOR DI(200) XOR DI(193) XOR DI(55) XOR DI(204) XOR DI(151) XOR DI(24) XOR DI(201) XOR DI(11) XOR DI(46) XOR DI(111) XOR DI(47) XOR DI(122) XOR DI(120) XOR DI(187) XOR DI(131) XOR DI(40) XOR DI(129) XOR DI(217) XOR DI(138) XOR DI(181) XOR DI(182) XOR DI(175) XOR DI(93) XOR DI(87) XOR DI(248) XOR DI(254); + DO(26) <= DI(13) XOR DI(113) XOR DI(16) XOR DI(216) XOR DI(78) XOR DI(234) XOR DI(34) XOR DI(163) XOR DI(213) XOR DI(177) XOR DI(250) XOR DI(14) XOR DI(235) XOR DI(8) XOR DI(35) XOR DI(164) XOR DI(37) XOR DI(102) XOR DI(214) XOR DI(251) XOR DI(4) XOR DI(134) XOR DI(59) XOR DI(184) XOR DI(70) XOR DI(125) XOR DI(15) XOR DI(116) XOR DI(115) XOR DI(81) XOR DI(124) XOR DI(80) XOR DI(236) XOR DI(9) XOR DI(109) XOR DI(133) XOR DI(185) XOR DI(49) XOR DI(215) XOR DI(180) XOR DI(91) XOR DI(252) XOR DI(6) XOR DI(98) XOR DI(209) XOR DI(26) XOR DI(68) XOR DI(206) XOR DI(71) XOR DI(196) XOR DI(186) XOR DI(140) XOR DI(143) XOR DI(30) XOR DI(148) XOR DI(110) XOR DI(44) XOR DI(117) XOR DI(191) XOR DI(126) XOR DI(96) XOR DI(82) XOR DI(204) XOR DI(11) XOR DI(38) XOR DI(135) XOR DI(40) XOR DI(51) XOR DI(105) XOR DI(181) XOR DI(175) XOR DI(87) XOR DI(242) XOR DI(248) XOR DI(254) XOR DI(231) XOR DI(99) XOR DI(226) XOR DI(28) XOR DI(156) XOR DI(104) XOR DI(27) XOR DI(69) XOR DI(227) XOR DI(89) XOR DI(200) XOR DI(190) XOR DI(211) XOR DI(73) XOR DI(144) XOR DI(29) XOR DI(158) XOR DI(31) XOR DI(172) XOR DI(245) XOR DI(128) XOR DI(53) XOR DI(149) XOR DI(119) XOR DI(45) XOR DI(120) XOR DI(54) XOR DI(192) XOR DI(129) XOR DI(173) XOR DI(174) XOR DI(161) XOR DI(93) XOR DI(63) XOR DI(201) XOR DI(194) XOR DI(56) XOR DI(205) XOR DI(152) XOR DI(25) XOR DI(202) XOR DI(12) XOR DI(47) XOR DI(112) XOR DI(48) XOR DI(123) XOR DI(121) XOR DI(188) XOR DI(132) XOR DI(41) XOR DI(130) XOR DI(218) XOR DI(139) XOR DI(182) XOR DI(183) XOR DI(176) XOR DI(94) XOR DI(88) XOR DI(249) XOR DI(255); + DO(27) <= DI(68) XOR DI(196) XOR DI(14) XOR DI(107) XOR DI(114) XOR DI(17) XOR DI(217) XOR DI(79) XOR DI(235) XOR DI(8) XOR DI(35) XOR DI(164) XOR DI(214) XOR DI(178) XOR DI(251) XOR DI(4) XOR DI(101) XOR DI(66) XOR DI(15) XOR DI(146) XOR DI(40) XOR DI(22) XOR DI(236) XOR DI(9) XOR DI(36) XOR DI(165) XOR DI(38) XOR DI(103) XOR DI(215) XOR DI(240) XOR DI(252) XOR DI(5) XOR DI(135) XOR DI(169) XOR DI(155) XOR DI(87) XOR DI(198) XOR DI(60) XOR DI(185) XOR DI(209) XOR DI(71) XOR DI(126) XOR DI(16) XOR DI(117) XOR DI(116) XOR DI(82) XOR DI(1) XOR DI(125) XOR DI(244) XOR DI(19) XOR DI(81) XOR DI(237) XOR DI(10) XOR DI(110) XOR DI(134) XOR DI(222) XOR DI(143) XOR DI(186) XOR DI(59) XOR DI(50) XOR DI(216) XOR DI(44) XOR DI(98) XOR DI(181) XOR DI(92) XOR DI(247) XOR DI(253) XOR DI(231) XOR DI(7) XOR DI(137) XOR DI(99) XOR DI(65) XOR DI(226) XOR DI(86) XOR DI(210) XOR DI(171) XOR DI(27) XOR DI(69) XOR DI(207) XOR DI(72) XOR DI(197) XOR DI(62) XOR DI(190) XOR DI(187) XOR DI(141) XOR DI(211) XOR DI(73) XOR DI(144) XOR DI(158) XOR DI(31) XOR DI(208) XOR DI(172) XOR DI(160) XOR DI(128) XOR DI(53) XOR DI(149) XOR DI(119) XOR DI(111) XOR DI(45) XOR DI(118) XOR DI(84) XOR DI(142) XOR DI(192) XOR DI(230) XOR DI(127) XOR DI(97) XOR DI(85) XOR DI(161) XOR DI(225) XOR DI(63) XOR DI(83) XOR DI(205) XOR DI(138) XOR DI(152) XOR DI(12) XOR DI(47) XOR DI(58) XOR DI(39) XOR DI(112) XOR DI(136) XOR DI(224) XOR DI(188) XOR DI(41) XOR DI(52) XOR DI(106) XOR DI(139) XOR DI(182) XOR DI(176) XOR DI(88) XOR DI(243) XOR DI(249) XOR DI(255); + DO(28) <= DI(4) XOR DI(101) XOR DI(69) XOR DI(197) XOR DI(184) XOR DI(15) XOR DI(146) XOR DI(108) XOR DI(115) XOR DI(0) XOR DI(124) XOR DI(94) XOR DI(90) XOR DI(18) XOR DI(218) XOR DI(80) XOR DI(202) XOR DI(22) XOR DI(236) XOR DI(9) XOR DI(36) XOR DI(133) XOR DI(165) XOR DI(58) XOR DI(49) XOR DI(215) XOR DI(179) XOR DI(240) XOR DI(246) XOR DI(252) XOR DI(5) XOR DI(102) XOR DI(67) XOR DI(195) XOR DI(29) XOR DI(16) XOR DI(147) XOR DI(190) XOR DI(1) XOR DI(41) XOR DI(95) XOR DI(19) XOR DI(219) XOR DI(203) XOR DI(65) XOR DI(23) XOR DI(152) XOR DI(237) XOR DI(10) XOR DI(37) XOR DI(121) XOR DI(166) XOR DI(130) XOR DI(39) XOR DI(104) XOR DI(216) XOR DI(174) XOR DI(241) XOR DI(247) XOR DI(253) XOR DI(230) XOR DI(6) XOR DI(136) XOR DI(170) XOR DI(155) XOR DI(26) XOR DI(156) XOR DI(68) XOR DI(88) XOR DI(199) XOR DI(196) XOR DI(61) XOR DI(186) XOR DI(210) XOR DI(72) XOR DI(228) XOR DI(157) XOR DI(30) XOR DI(171) XOR DI(127) XOR DI(17) XOR DI(118) XOR DI(44) XOR DI(117) XOR DI(83) XOR DI(2) XOR DI(126) XOR DI(158) XOR DI(160) XOR DI(245) XOR DI(224) XOR DI(20) XOR DI(62) XOR DI(82) XOR DI(55) XOR DI(222) XOR DI(201) XOR DI(238) XOR DI(11) XOR DI(57) XOR DI(111) XOR DI(135) XOR DI(47) XOR DI(122) XOR DI(223) XOR DI(144) XOR DI(187) XOR DI(60) XOR DI(131) XOR DI(51) XOR DI(105) XOR DI(217) XOR DI(45) XOR DI(99) XOR DI(182) XOR DI(175) XOR DI(93) XOR DI(169) XOR DI(248) XOR DI(254); + DO(29) <= DI(5) XOR DI(102) XOR DI(70) XOR DI(198) XOR DI(185) XOR DI(16) XOR DI(147) XOR DI(109) XOR DI(116) XOR DI(1) XOR DI(125) XOR DI(95) XOR DI(91) XOR DI(19) XOR DI(219) XOR DI(81) XOR DI(203) XOR DI(23) XOR DI(237) XOR DI(10) XOR DI(37) XOR DI(134) XOR DI(166) XOR DI(59) XOR DI(50) XOR DI(216) XOR DI(180) XOR DI(241) XOR DI(247) XOR DI(253) XOR DI(6) XOR DI(103) XOR DI(68) XOR DI(196) XOR DI(30) XOR DI(17) XOR DI(148) XOR DI(191) XOR DI(2) XOR DI(42) XOR DI(96) XOR DI(20) XOR DI(220) XOR DI(204) XOR DI(66) XOR DI(24) XOR DI(153) XOR DI(238) XOR DI(11) XOR DI(38) XOR DI(122) XOR DI(167) XOR DI(131) XOR DI(40) XOR DI(105) XOR DI(217) XOR DI(175) XOR DI(242) XOR DI(248) XOR DI(254) XOR DI(231) XOR DI(0) XOR DI(7) XOR DI(137) XOR DI(171) XOR DI(156) XOR DI(27) XOR DI(157) XOR DI(69) XOR DI(89) XOR DI(200) XOR DI(197) XOR DI(62) XOR DI(187) XOR DI(211) XOR DI(73) XOR DI(229) XOR DI(158) XOR DI(31) XOR DI(172) XOR DI(128) XOR DI(18) XOR DI(119) XOR DI(45) XOR DI(118) XOR DI(84) XOR DI(3) XOR DI(127) XOR DI(159) XOR DI(161) XOR DI(246) XOR DI(225) XOR DI(21) XOR DI(63) XOR DI(83) XOR DI(56) XOR DI(223) XOR DI(202) XOR DI(239) XOR DI(12) XOR DI(58) XOR DI(112) XOR DI(136) XOR DI(48) XOR DI(123) XOR DI(224) XOR DI(145) XOR DI(188) XOR DI(61) XOR DI(132) XOR DI(52) XOR DI(106) XOR DI(218) XOR DI(46) XOR DI(100) XOR DI(183) XOR DI(176) XOR DI(94) XOR DI(170) XOR DI(249) XOR DI(255); + DO(30) <= DI(6) XOR DI(98) XOR DI(209) XOR DI(155) XOR DI(103) XOR DI(26) XOR DI(68) XOR DI(206) XOR DI(71) XOR DI(199) XOR DI(196) XOR DI(186) XOR DI(140) XOR DI(143) XOR DI(228) XOR DI(30) XOR DI(244) XOR DI(17) XOR DI(148) XOR DI(110) XOR DI(44) XOR DI(117) XOR DI(191) XOR DI(2) XOR DI(126) XOR DI(42) XOR DI(96) XOR DI(92) XOR DI(20) XOR DI(150) XOR DI(220) XOR DI(82) XOR DI(193) XOR DI(55) XOR DI(204) XOR DI(66) XOR DI(222) XOR DI(24) XOR DI(153) XOR DI(238) XOR DI(11) XOR DI(38) XOR DI(135) XOR DI(122) XOR DI(167) XOR DI(60) XOR DI(131) XOR DI(40) XOR DI(51) XOR DI(105) XOR DI(217) XOR DI(181) XOR DI(175) XOR DI(169) XOR DI(87) XOR DI(242) XOR DI(248) XOR DI(254) XOR DI(231) XOR DI(0) XOR DI(7) XOR DI(65) XOR DI(86) XOR DI(104) XOR DI(69) XOR DI(227) XOR DI(89) XOR DI(197) XOR DI(190) XOR DI(211) XOR DI(73) XOR DI(29) XOR DI(31) XOR DI(208) XOR DI(18) XOR DI(149) XOR DI(142) XOR DI(54) XOR DI(192) XOR DI(3) XOR DI(43) XOR DI(97) XOR DI(174) XOR DI(161) XOR DI(246) XOR DI(21) XOR DI(221) XOR DI(205) XOR DI(67) XOR DI(152) XOR DI(25) XOR DI(202) XOR DI(154) XOR DI(239) XOR DI(12) XOR DI(58) XOR DI(39) XOR DI(112) XOR DI(48) XOR DI(123) XOR DI(121) XOR DI(168) XOR DI(145) XOR DI(195) XOR DI(132) XOR DI(41) XOR DI(106) XOR DI(130) XOR DI(218) XOR DI(139) XOR DI(100) XOR DI(183) XOR DI(176) XOR DI(94) XOR DI(243) XOR DI(249) XOR DI(255); + DO(31) <= DI(231) XOR DI(0) XOR DI(7) XOR DI(137) XOR DI(99) XOR DI(65) XOR DI(226) XOR DI(28) XOR DI(86) XOR DI(210) XOR DI(171) XOR DI(156) XOR DI(104) XOR DI(27) XOR DI(157) XOR DI(69) XOR DI(207) XOR DI(72) XOR DI(227) XOR DI(89) XOR DI(200) XOR DI(197) XOR DI(62) XOR DI(190) XOR DI(187) XOR DI(141) XOR DI(211) XOR DI(73) XOR DI(144) XOR DI(229) XOR DI(29) XOR DI(158) XOR DI(31) XOR DI(208) XOR DI(172) XOR DI(160) XOR DI(245) XOR DI(128) XOR DI(18) XOR DI(53) XOR DI(64) XOR DI(149) XOR DI(119) XOR DI(111) XOR DI(45) XOR DI(120) XOR DI(118) XOR DI(84) XOR DI(142) XOR DI(54) XOR DI(192) XOR DI(129) XOR DI(230) XOR DI(3) XOR DI(127) XOR DI(159) XOR DI(43) XOR DI(97) XOR DI(173) XOR DI(174) XOR DI(85) XOR DI(161) XOR DI(246) XOR DI(225) XOR DI(93) XOR DI(21) XOR DI(151) XOR DI(63) XOR DI(201) XOR DI(221) XOR DI(83) XOR DI(194) XOR DI(56) XOR DI(205) XOR DI(67) XOR DI(138) XOR DI(223) XOR DI(152) XOR DI(25) XOR DI(202) XOR DI(154) XOR DI(239) XOR DI(12) XOR DI(47) XOR DI(58) XOR DI(39) XOR DI(112) XOR DI(136) XOR DI(48) XOR DI(123) XOR DI(224) XOR DI(121) XOR DI(168) XOR DI(145) XOR DI(57) XOR DI(195) XOR DI(188) XOR DI(61) XOR DI(132) XOR DI(41) XOR DI(52) XOR DI(106) XOR DI(130) XOR DI(218) XOR DI(139) XOR DI(189) XOR DI(182) XOR DI(46) XOR DI(100) XOR DI(183) XOR DI(176) XOR DI(94) XOR DI(170) XOR DI(88) XOR DI(243) XOR DI(249) XOR DI(255); +end architecture; \ No newline at end of file Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast32_tab.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast32_tab.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast32_tab.vhd (revision 3) @@ -0,0 +1,93 @@ +-- +-- crc32_fast32_tab.vhd: A 32-bit CRC (IEEE) table for processing fixed 32 bits in parallel +-- Copyright (C) 2011 CESNET +-- Author(s): Lukas Kekely +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in +-- the documentation and/or other materials provided with the +-- distribution. +-- 3. Neither the name of the Company nor the names of its contributors +-- may be used to endorse or promote products derived from this +-- software without specific prior written permission. +-- +-- This software is provided ``as is'', and any express or implied +-- warranties, including, but not limited to, the implied warranties of +-- merchantability and fitness for a particular purpose are disclaimed. +-- In no event shall the company or contributors be liable for any +-- direct, indirect, incidental, special, exemplary, or consequential +-- damages (including, but not limited to, procurement of substitute +-- goods or services; loss of use, data, or profits; or business +-- interruption) however caused and on any theory of liability, whether +-- in contract, strict liability, or tort (including negligence or +-- otherwise) arising in any way out of the use of this software, even +-- if advised of the possibility of such damage. +-- +-- $Id$ +-- +-- TODO: +-- +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; +use IEEE.std_logic_unsigned.all; +use IEEE.numeric_std.all; +use WORK.math_pack.all; +-- ---------------------------------------------------------------------------- +-- Entity declaration +-- ---------------------------------------------------------------------------- +entity crc32_fast32_tab is + port( + DI : in std_logic_vector(32-1 downto 0); + DO : out std_logic_vector(31 downto 0) + ); +end entity crc32_fast32_tab; + +-- ---------------------------------------------------------------------------- +-- Architecture declaration +-- ---------------------------------------------------------------------------- +architecture arch of crc32_fast32_tab is +begin +-- 32-bit CRC equations processing 32 bits in parallel (VHDL code) +-- Generator polynomial: 0x104C11DB7 + DO(0) <= DI(8) XOR DI(3) XOR DI(4) XOR DI(6) XOR DI(22) XOR DI(7) XOR DI(23) XOR DI(2) XOR DI(0) XOR DI(16) XOR DI(1) XOR DI(20) XOR DI(26); + DO(1) <= DI(9) XOR DI(4) XOR DI(5) XOR DI(7) XOR DI(23) XOR DI(8) XOR DI(24) XOR DI(3) XOR DI(1) XOR DI(17) XOR DI(2) XOR DI(21) XOR DI(27); + DO(2) <= DI(10) XOR DI(5) XOR DI(6) XOR DI(8) XOR DI(24) XOR DI(9) XOR DI(25) XOR DI(4) XOR DI(0) XOR DI(2) XOR DI(18) XOR DI(3) XOR DI(22) XOR DI(28); + DO(3) <= DI(11) XOR DI(6) XOR DI(7) XOR DI(9) XOR DI(25) XOR DI(10) XOR DI(26) XOR DI(5) XOR DI(1) XOR DI(3) XOR DI(19) XOR DI(4) XOR DI(23) XOR DI(29); + DO(4) <= DI(12) XOR DI(7) XOR DI(8) XOR DI(10) XOR DI(26) XOR DI(11) XOR DI(27) XOR DI(6) XOR DI(2) XOR DI(4) XOR DI(20) XOR DI(5) XOR DI(24) XOR DI(30); + DO(5) <= DI(13) XOR DI(8) XOR DI(9) XOR DI(11) XOR DI(27) XOR DI(12) XOR DI(28) XOR DI(7) XOR DI(3) XOR DI(5) XOR DI(21) XOR DI(6) XOR DI(0) XOR DI(25) XOR DI(31); + DO(6) <= DI(14) XOR DI(9) XOR DI(10) XOR DI(2) XOR DI(12) XOR DI(16) XOR DI(28) XOR DI(0) XOR DI(3) XOR DI(20) XOR DI(13) XOR DI(23) XOR DI(29); + DO(7) <= DI(15) XOR DI(10) XOR DI(11) XOR DI(3) XOR DI(13) XOR DI(17) XOR DI(29) XOR DI(1) XOR DI(4) XOR DI(21) XOR DI(14) XOR DI(24) XOR DI(30); + DO(8) <= DI(16) XOR DI(11) XOR DI(12) XOR DI(4) XOR DI(14) XOR DI(18) XOR DI(30) XOR DI(2) XOR DI(5) XOR DI(22) XOR DI(15) XOR DI(0) XOR DI(25) XOR DI(31); + DO(9) <= DI(17) XOR DI(4) XOR DI(8) XOR DI(20) XOR DI(12) XOR DI(13) XOR DI(7) XOR DI(2) XOR DI(5) XOR DI(22) XOR DI(15) XOR DI(0) XOR DI(19) XOR DI(31); + DO(10) <= DI(7) XOR DI(18) XOR DI(4) XOR DI(5) XOR DI(9) XOR DI(21) XOR DI(13) XOR DI(22) XOR DI(2) XOR DI(0) XOR DI(14) XOR DI(26); + DO(11) <= DI(8) XOR DI(19) XOR DI(5) XOR DI(6) XOR DI(10) XOR DI(22) XOR DI(14) XOR DI(23) XOR DI(3) XOR DI(1) XOR DI(15) XOR DI(27); + DO(12) <= DI(9) XOR DI(20) XOR DI(6) XOR DI(7) XOR DI(11) XOR DI(23) XOR DI(15) XOR DI(24) XOR DI(4) XOR DI(2) XOR DI(16) XOR DI(28); + DO(13) <= DI(10) XOR DI(21) XOR DI(7) XOR DI(8) XOR DI(12) XOR DI(24) XOR DI(16) XOR DI(25) XOR DI(5) XOR DI(0) XOR DI(3) XOR DI(17) XOR DI(29); + DO(14) <= DI(11) XOR DI(22) XOR DI(8) XOR DI(9) XOR DI(13) XOR DI(25) XOR DI(17) XOR DI(26) XOR DI(6) XOR DI(1) XOR DI(4) XOR DI(0) XOR DI(18) XOR DI(30); + DO(15) <= DI(12) XOR DI(23) XOR DI(9) XOR DI(10) XOR DI(14) XOR DI(26) XOR DI(18) XOR DI(27) XOR DI(7) XOR DI(2) XOR DI(5) XOR DI(1) XOR DI(19) XOR DI(31); + DO(16) <= DI(13) XOR DI(7) XOR DI(23) XOR DI(24) XOR DI(10) XOR DI(26) XOR DI(1) XOR DI(11) XOR DI(15) XOR DI(27) XOR DI(4) XOR DI(19) XOR DI(16) XOR DI(22) XOR DI(28); + DO(17) <= DI(14) XOR DI(8) XOR DI(24) XOR DI(25) XOR DI(11) XOR DI(27) XOR DI(2) XOR DI(12) XOR DI(16) XOR DI(28) XOR DI(5) XOR DI(20) XOR DI(17) XOR DI(23) XOR DI(29); + DO(18) <= DI(15) XOR DI(9) XOR DI(25) XOR DI(26) XOR DI(12) XOR DI(28) XOR DI(3) XOR DI(13) XOR DI(17) XOR DI(29) XOR DI(6) XOR DI(21) XOR DI(0) XOR DI(18) XOR DI(24) XOR DI(30); + DO(19) <= DI(16) XOR DI(10) XOR DI(26) XOR DI(27) XOR DI(13) XOR DI(29) XOR DI(4) XOR DI(14) XOR DI(18) XOR DI(30) XOR DI(7) XOR DI(22) XOR DI(1) XOR DI(0) XOR DI(19) XOR DI(25) XOR DI(31); + DO(20) <= DI(17) XOR DI(11) XOR DI(27) XOR DI(16) XOR DI(28) XOR DI(4) XOR DI(14) XOR DI(30) XOR DI(7) XOR DI(3) XOR DI(5) XOR DI(6) XOR DI(22) XOR DI(15) XOR DI(0) XOR DI(19) XOR DI(31); + DO(21) <= DI(26) XOR DI(18) XOR DI(12) XOR DI(28) XOR DI(17) XOR DI(29) XOR DI(2) XOR DI(3) XOR DI(5) XOR DI(22) XOR DI(15) XOR DI(0) XOR DI(31); + DO(22) <= DI(22) XOR DI(7) XOR DI(8) XOR DI(26) XOR DI(27) XOR DI(19) XOR DI(13) XOR DI(29) XOR DI(2) XOR DI(20) XOR DI(18) XOR DI(30); + DO(23) <= DI(23) XOR DI(8) XOR DI(9) XOR DI(27) XOR DI(28) XOR DI(20) XOR DI(14) XOR DI(30) XOR DI(3) XOR DI(21) XOR DI(0) XOR DI(19) XOR DI(31); + DO(24) <= DI(8) XOR DI(24) XOR DI(9) XOR DI(10) XOR DI(26) XOR DI(16) XOR DI(28) XOR DI(23) XOR DI(29) XOR DI(7) XOR DI(2) XOR DI(3) XOR DI(21) XOR DI(6) XOR DI(15) XOR DI(31); + DO(25) <= DI(9) XOR DI(25) XOR DI(10) XOR DI(26) XOR DI(11) XOR DI(27) XOR DI(17) XOR DI(23) XOR DI(29) XOR DI(6) XOR DI(1) XOR DI(2) XOR DI(20) XOR DI(24) XOR DI(30); + DO(26) <= DI(10) XOR DI(26) XOR DI(11) XOR DI(27) XOR DI(12) XOR DI(28) XOR DI(18) XOR DI(24) XOR DI(30) XOR DI(7) XOR DI(2) XOR DI(3) XOR DI(21) XOR DI(25) XOR DI(31); + DO(27) <= DI(11) XOR DI(27) XOR DI(12) XOR DI(16) XOR DI(28) XOR DI(20) XOR DI(13) XOR DI(23) XOR DI(29) XOR DI(7) XOR DI(2) XOR DI(6) XOR DI(1) XOR DI(0) XOR DI(19) XOR DI(25) XOR DI(31); + DO(28) <= DI(12) XOR DI(16) XOR DI(22) XOR DI(28) XOR DI(13) XOR DI(17) XOR DI(23) XOR DI(29) XOR DI(6) XOR DI(4) XOR DI(21) XOR DI(0) XOR DI(14) XOR DI(24) XOR DI(30); + DO(29) <= DI(13) XOR DI(17) XOR DI(23) XOR DI(29) XOR DI(14) XOR DI(18) XOR DI(24) XOR DI(30) XOR DI(7) XOR DI(5) XOR DI(22) XOR DI(1) XOR DI(15) XOR DI(0) XOR DI(25) XOR DI(31); + DO(30) <= DI(4) XOR DI(20) XOR DI(14) XOR DI(18) XOR DI(24) XOR DI(30) XOR DI(7) XOR DI(3) XOR DI(22) XOR DI(15) XOR DI(19) XOR DI(25) XOR DI(31); + DO(31) <= DI(7) XOR DI(2) XOR DI(3) XOR DI(5) XOR DI(21) XOR DI(6) XOR DI(22) XOR DI(1) XOR DI(15) XOR DI(0) XOR DI(19) XOR DI(25) XOR DI(31); + +end architecture; \ No newline at end of file Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast512_tab.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast512_tab.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast512_tab.vhd (revision 3) @@ -0,0 +1,92 @@ +-- +-- crc32_fast512_tab.vhd: A 32-bit CRC (IEEE) table for processing fixed 512 bits in parallel +-- Copyright (C) 2011 CESNET +-- Author(s): Lukas Kekely +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in +-- the documentation and/or other materials provided with the +-- distribution. +-- 3. Neither the name of the Company nor the names of its contributors +-- may be used to endorse or promote products derived from this +-- software without specific prior written permission. +-- +-- This software is provided ``as is'', and any express or implied +-- warranties, including, but not limited to, the implied warranties of +-- merchantability and fitness for a particular purpose are disclaimed. +-- In no event shall the company or contributors be liable for any +-- direct, indirect, incidental, special, exemplary, or consequential +-- damages (including, but not limited to, procurement of substitute +-- goods or services; loss of use, data, or profits; or business +-- interruption) however caused and on any theory of liability, whether +-- in contract, strict liability, or tort (including negligence or +-- otherwise) arising in any way out of the use of this software, even +-- if advised of the possibility of such damage. +-- +-- $Id$ +-- +-- TODO: +-- +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; +use IEEE.std_logic_unsigned.all; +use IEEE.numeric_std.all; +use WORK.math_pack.all; +-- ---------------------------------------------------------------------------- +-- Entity declaration +-- ---------------------------------------------------------------------------- +entity crc32_fast512_tab is + port( + DI : in std_logic_vector(512-1 downto 0); + DO : out std_logic_vector(31 downto 0) + ); +end entity crc32_fast512_tab; + +-- ---------------------------------------------------------------------------- +-- Architecture declaration +-- ---------------------------------------------------------------------------- +architecture arch of crc32_fast512_tab is +begin +-- 32-bit CRC equations processing 512 bits in parallel (VHDL code) +-- Generator polynomial: 0x104C11DB7 + DO(0) <= DI(64) XOR DI(488) XOR DI(236) XOR DI(75) XOR DI(257) XOR DI(264) XOR DI(394) XOR DI(356) XOR DI(195) XOR DI(76) XOR DI(322) XOR DI(483) XOR DI(285) XOR DI(343) XOR DI(60) XOR DI(467) XOR DI(47) XOR DI(428) XOR DI(413) XOR DI(177) XOR DI(361) XOR DI(63) XOR DI(284) XOR DI(414) XOR DI(326) XOR DI(464) XOR DI(253) XOR DI(222) XOR DI(100) XOR DI(329) XOR DI(484) XOR DI(346) XOR DI(50) XOR DI(457) XOR DI(454) XOR DI(243) XOR DI(319) XOR DI(40) XOR DI(447) XOR DI(444) XOR DI(126) XOR DI(68) XOR DI(192) XOR DI(225) XOR DI(93) XOR DI(136) XOR DI(190) XOR DI(121) XOR DI(398) XOR DI(468) XOR DI(330) XOR DI(174) XOR DI(401) XOR DI(486) XOR DI(286) XOR DI(19) XOR DI(415) XOR DI(78) XOR DI(288) XOR DI(124) XOR DI(465) XOR DI(202) XOR DI(32) XOR DI(429) XOR DI(417) XOR DI(163) XOR DI(502) XOR DI(248) XOR DI(255) XOR DI(385) XOR DI(51) XOR DI(275) XOR DI(244) XOR DI(213) XOR DI(310) XOR DI(31) XOR DI(112) XOR DI(321) XOR DI(10) XOR DI(406) XOR DI(193) XOR DI(154) XOR DI(239) XOR DI(376) XOR DI(235) XOR DI(22) XOR DI(103) XOR DI(1) XOR DI(226) XOR DI(217) XOR DI(368) XOR DI(302) XOR DI(377) XOR DI(215) XOR DI(122) XOR DI(375) XOR DI(146) XOR DI(96) XOR DI(341) XOR DI(399) XOR DI(311) XOR DI(449) XOR DI(35) XOR DI(175) XOR DI(386) XOR DI(487) XOR DI(260) XOR DI(224) XOR DI(200) XOR DI(131) XOR DI(384) XOR DI(416) XOR DI(155) XOR DI(79) XOR DI(105) XOR DI(300) XOR DI(354) XOR DI(33) XOR DI(150) XOR DI(430) XOR DI(104) XOR DI(431) XOR DI(342) XOR DI(2) XOR DI(21) XOR DI(418) XOR DI(170) XOR DI(503) XOR DI(482) XOR DI(251) XOR DI(350) XOR DI(54) XOR DI(171) XOR DI(278) XOR DI(408) XOR DI(320) XOR DI(458) XOR DI(247) XOR DI(216) XOR DI(94) XOR DI(478) XOR DI(340) XOR DI(44) XOR DI(451) XOR DI(313) XOR DI(120) XOR DI(62) XOR DI(184) XOR DI(462) XOR DI(324) XOR DI(168) XOR DI(395) XOR DI(480) XOR DI(409) XOR DI(282) XOR DI(459) XOR DI(26) XOR DI(411) XOR DI(496) XOR DI(269) XOR DI(238) XOR DI(207) XOR DI(304) XOR DI(315) XOR DI(4) XOR DI(233) XOR DI(229) XOR DI(220) XOR DI(296) XOR DI(209) XOR DI(116) XOR DI(369) XOR DI(140) XOR DI(90) XOR DI(393) XOR DI(305) XOR DI(29) XOR DI(380) XOR DI(481) XOR DI(218) XOR DI(194) XOR DI(125) XOR DI(378) XOR DI(149) XOR DI(144) XOR DI(98) XOR DI(425) XOR DI(164) XOR DI(48) XOR DI(165) XOR DI(402) XOR DI(314) XOR DI(452) XOR DI(210) XOR DI(88) XOR DI(445) XOR DI(114) XOR DI(178) XOR DI(318) XOR DI(389) XOR DI(20) XOR DI(298) XOR DI(309) XOR DI(214) XOR DI(203) XOR DI(363) XOR DI(134) XOR DI(387) XOR DI(23) XOR DI(475) XOR DI(212) XOR DI(119) XOR DI(143) XOR DI(138) XOR DI(42) XOR DI(159) XOR DI(396) XOR DI(446) XOR DI(439) XOR DI(108) XOR DI(303) XOR DI(197) XOR DI(357) XOR DI(17) XOR DI(113) XOR DI(36) XOR DI(153) XOR DI(440) XOR DI(433) XOR DI(191) XOR DI(351) XOR DI(11) XOR DI(107) XOR DI(30) XOR DI(427) XOR DI(185) XOR DI(345) XOR DI(5) XOR DI(24) XOR DI(179) XOR DI(18) XOR DI(173) XOR DI(12) XOR DI(167) XOR DI(6) XOR DI(0) XOR DI(500) XOR DI(506); + DO(1) <= DI(65) XOR DI(489) XOR DI(237) XOR DI(76) XOR DI(258) XOR DI(265) XOR DI(395) XOR DI(357) XOR DI(196) XOR DI(77) XOR DI(323) XOR DI(484) XOR DI(286) XOR DI(344) XOR DI(61) XOR DI(468) XOR DI(48) XOR DI(429) XOR DI(414) XOR DI(178) XOR DI(362) XOR DI(64) XOR DI(285) XOR DI(415) XOR DI(327) XOR DI(465) XOR DI(254) XOR DI(223) XOR DI(101) XOR DI(330) XOR DI(485) XOR DI(347) XOR DI(51) XOR DI(458) XOR DI(455) XOR DI(244) XOR DI(320) XOR DI(41) XOR DI(448) XOR DI(445) XOR DI(127) XOR DI(69) XOR DI(193) XOR DI(226) XOR DI(94) XOR DI(137) XOR DI(191) XOR DI(122) XOR DI(399) XOR DI(469) XOR DI(331) XOR DI(175) XOR DI(402) XOR DI(487) XOR DI(287) XOR DI(20) XOR DI(416) XOR DI(79) XOR DI(289) XOR DI(125) XOR DI(466) XOR DI(203) XOR DI(33) XOR DI(430) XOR DI(418) XOR DI(164) XOR DI(503) XOR DI(249) XOR DI(256) XOR DI(386) XOR DI(52) XOR DI(276) XOR DI(245) XOR DI(214) XOR DI(311) XOR DI(32) XOR DI(113) XOR DI(322) XOR DI(11) XOR DI(407) XOR DI(194) XOR DI(155) XOR DI(240) XOR DI(377) XOR DI(236) XOR DI(23) XOR DI(104) XOR DI(2) XOR DI(227) XOR DI(218) XOR DI(369) XOR DI(303) XOR DI(378) XOR DI(216) XOR DI(123) XOR DI(376) XOR DI(147) XOR DI(97) XOR DI(342) XOR DI(400) XOR DI(312) XOR DI(450) XOR DI(36) XOR DI(176) XOR DI(387) XOR DI(488) XOR DI(261) XOR DI(225) XOR DI(201) XOR DI(132) XOR DI(385) XOR DI(417) XOR DI(156) XOR DI(80) XOR DI(106) XOR DI(301) XOR DI(355) XOR DI(34) XOR DI(151) XOR DI(431) XOR DI(105) XOR DI(432) XOR DI(343) XOR DI(3) XOR DI(22) XOR DI(419) XOR DI(171) XOR DI(504) XOR DI(483) XOR DI(252) XOR DI(351) XOR DI(55) XOR DI(172) XOR DI(279) XOR DI(409) XOR DI(321) XOR DI(459) XOR DI(248) XOR DI(217) XOR DI(95) XOR DI(479) XOR DI(341) XOR DI(45) XOR DI(452) XOR DI(314) XOR DI(121) XOR DI(63) XOR DI(185) XOR DI(463) XOR DI(325) XOR DI(169) XOR DI(396) XOR DI(481) XOR DI(410) XOR DI(283) XOR DI(460) XOR DI(27) XOR DI(412) XOR DI(497) XOR DI(270) XOR DI(239) XOR DI(208) XOR DI(305) XOR DI(316) XOR DI(5) XOR DI(234) XOR DI(230) XOR DI(221) XOR DI(297) XOR DI(210) XOR DI(117) XOR DI(370) XOR DI(141) XOR DI(91) XOR DI(394) XOR DI(306) XOR DI(30) XOR DI(381) XOR DI(482) XOR DI(219) XOR DI(195) XOR DI(126) XOR DI(379) XOR DI(150) XOR DI(145) XOR DI(99) XOR DI(426) XOR DI(165) XOR DI(49) XOR DI(166) XOR DI(403) XOR DI(315) XOR DI(453) XOR DI(211) XOR DI(89) XOR DI(446) XOR DI(115) XOR DI(179) XOR DI(319) XOR DI(390) XOR DI(21) XOR DI(299) XOR DI(310) XOR DI(215) XOR DI(204) XOR DI(364) XOR DI(135) XOR DI(388) XOR DI(24) XOR DI(476) XOR DI(213) XOR DI(120) XOR DI(144) XOR DI(139) XOR DI(43) XOR DI(160) XOR DI(397) XOR DI(447) XOR DI(440) XOR DI(109) XOR DI(304) XOR DI(198) XOR DI(358) XOR DI(18) XOR DI(114) XOR DI(37) XOR DI(154) XOR DI(441) XOR DI(434) XOR DI(192) XOR DI(352) XOR DI(12) XOR DI(108) XOR DI(31) XOR DI(428) XOR DI(186) XOR DI(346) XOR DI(6) XOR DI(25) XOR DI(180) XOR DI(19) XOR DI(174) XOR DI(13) XOR DI(168) XOR DI(7) XOR DI(1) XOR DI(501) XOR DI(507); + DO(2) <= DI(66) XOR DI(490) XOR DI(238) XOR DI(77) XOR DI(259) XOR DI(266) XOR DI(396) XOR DI(358) XOR DI(197) XOR DI(78) XOR DI(324) XOR DI(485) XOR DI(287) XOR DI(345) XOR DI(62) XOR DI(469) XOR DI(49) XOR DI(430) XOR DI(415) XOR DI(179) XOR DI(363) XOR DI(65) XOR DI(286) XOR DI(416) XOR DI(328) XOR DI(466) XOR DI(255) XOR DI(224) XOR DI(102) XOR DI(331) XOR DI(486) XOR DI(348) XOR DI(52) XOR DI(459) XOR DI(456) XOR DI(245) XOR DI(321) XOR DI(42) XOR DI(449) XOR DI(446) XOR DI(128) XOR DI(70) XOR DI(194) XOR DI(227) XOR DI(95) XOR DI(138) XOR DI(192) XOR DI(123) XOR DI(400) XOR DI(470) XOR DI(332) XOR DI(176) XOR DI(403) XOR DI(488) XOR DI(288) XOR DI(21) XOR DI(417) XOR DI(80) XOR DI(290) XOR DI(126) XOR DI(467) XOR DI(204) XOR DI(34) XOR DI(431) XOR DI(419) XOR DI(165) XOR DI(504) XOR DI(250) XOR DI(257) XOR DI(387) XOR DI(53) XOR DI(277) XOR DI(246) XOR DI(215) XOR DI(312) XOR DI(33) XOR DI(114) XOR DI(323) XOR DI(12) XOR DI(408) XOR DI(195) XOR DI(156) XOR DI(241) XOR DI(378) XOR DI(237) XOR DI(24) XOR DI(105) XOR DI(3) XOR DI(228) XOR DI(219) XOR DI(370) XOR DI(304) XOR DI(379) XOR DI(217) XOR DI(124) XOR DI(377) XOR DI(148) XOR DI(98) XOR DI(343) XOR DI(401) XOR DI(313) XOR DI(451) XOR DI(37) XOR DI(177) XOR DI(388) XOR DI(489) XOR DI(262) XOR DI(226) XOR DI(202) XOR DI(133) XOR DI(386) XOR DI(418) XOR DI(157) XOR DI(81) XOR DI(107) XOR DI(302) XOR DI(356) XOR DI(35) XOR DI(152) XOR DI(432) XOR DI(106) XOR DI(433) XOR DI(344) XOR DI(4) XOR DI(23) XOR DI(420) XOR DI(172) XOR DI(505) XOR DI(484) XOR DI(253) XOR DI(352) XOR DI(56) XOR DI(173) XOR DI(280) XOR DI(410) XOR DI(322) XOR DI(460) XOR DI(249) XOR DI(218) XOR DI(96) XOR DI(480) XOR DI(342) XOR DI(46) XOR DI(453) XOR DI(315) XOR DI(122) XOR DI(64) XOR DI(186) XOR DI(464) XOR DI(326) XOR DI(170) XOR DI(397) XOR DI(482) XOR DI(411) XOR DI(284) XOR DI(461) XOR DI(28) XOR DI(413) XOR DI(498) XOR DI(271) XOR DI(240) XOR DI(209) XOR DI(306) XOR DI(317) XOR DI(6) XOR DI(235) XOR DI(231) XOR DI(222) XOR DI(298) XOR DI(211) XOR DI(118) XOR DI(371) XOR DI(142) XOR DI(92) XOR DI(395) XOR DI(307) XOR DI(31) XOR DI(382) XOR DI(483) XOR DI(220) XOR DI(196) XOR DI(127) XOR DI(380) XOR DI(151) XOR DI(146) XOR DI(100) XOR DI(427) XOR DI(166) XOR DI(50) XOR DI(167) XOR DI(404) XOR DI(316) XOR DI(454) XOR DI(212) XOR DI(90) XOR DI(447) XOR DI(116) XOR DI(180) XOR DI(320) XOR DI(391) XOR DI(22) XOR DI(300) XOR DI(311) XOR DI(0) XOR DI(216) XOR DI(205) XOR DI(365) XOR DI(136) XOR DI(389) XOR DI(25) XOR DI(477) XOR DI(214) XOR DI(121) XOR DI(145) XOR DI(140) XOR DI(44) XOR DI(161) XOR DI(398) XOR DI(448) XOR DI(441) XOR DI(110) XOR DI(305) XOR DI(199) XOR DI(359) XOR DI(19) XOR DI(115) XOR DI(38) XOR DI(155) XOR DI(442) XOR DI(435) XOR DI(193) XOR DI(353) XOR DI(13) XOR DI(109) XOR DI(32) XOR DI(429) XOR DI(187) XOR DI(347) XOR DI(7) XOR DI(26) XOR DI(181) XOR DI(20) XOR DI(175) XOR DI(14) XOR DI(169) XOR DI(8) XOR DI(2) XOR DI(502) XOR DI(508); + DO(3) <= DI(67) XOR DI(491) XOR DI(239) XOR DI(78) XOR DI(260) XOR DI(267) XOR DI(397) XOR DI(359) XOR DI(198) XOR DI(79) XOR DI(325) XOR DI(486) XOR DI(288) XOR DI(346) XOR DI(63) XOR DI(470) XOR DI(50) XOR DI(431) XOR DI(416) XOR DI(180) XOR DI(364) XOR DI(66) XOR DI(287) XOR DI(417) XOR DI(329) XOR DI(467) XOR DI(256) XOR DI(225) XOR DI(103) XOR DI(332) XOR DI(487) XOR DI(349) XOR DI(53) XOR DI(460) XOR DI(457) XOR DI(246) XOR DI(322) XOR DI(43) XOR DI(450) XOR DI(447) XOR DI(129) XOR DI(71) XOR DI(195) XOR DI(228) XOR DI(96) XOR DI(139) XOR DI(193) XOR DI(124) XOR DI(401) XOR DI(471) XOR DI(333) XOR DI(177) XOR DI(404) XOR DI(489) XOR DI(289) XOR DI(22) XOR DI(418) XOR DI(81) XOR DI(291) XOR DI(127) XOR DI(468) XOR DI(205) XOR DI(35) XOR DI(432) XOR DI(420) XOR DI(166) XOR DI(505) XOR DI(251) XOR DI(258) XOR DI(388) XOR DI(54) XOR DI(278) XOR DI(247) XOR DI(216) XOR DI(313) XOR DI(34) XOR DI(115) XOR DI(324) XOR DI(13) XOR DI(409) XOR DI(196) XOR DI(157) XOR DI(242) XOR DI(379) XOR DI(238) XOR DI(25) XOR DI(106) XOR DI(4) XOR DI(229) XOR DI(220) XOR DI(371) XOR DI(305) XOR DI(380) XOR DI(218) XOR DI(125) XOR DI(378) XOR DI(149) XOR DI(99) XOR DI(344) XOR DI(402) XOR DI(314) XOR DI(452) XOR DI(38) XOR DI(178) XOR DI(389) XOR DI(490) XOR DI(263) XOR DI(227) XOR DI(203) XOR DI(134) XOR DI(387) XOR DI(419) XOR DI(158) XOR DI(82) XOR DI(108) XOR DI(303) XOR DI(357) XOR DI(36) XOR DI(153) XOR DI(433) XOR DI(107) XOR DI(434) XOR DI(345) XOR DI(5) XOR DI(24) XOR DI(421) XOR DI(173) XOR DI(506) XOR DI(485) XOR DI(254) XOR DI(353) XOR DI(57) XOR DI(174) XOR DI(281) XOR DI(411) XOR DI(323) XOR DI(461) XOR DI(250) XOR DI(219) XOR DI(97) XOR DI(481) XOR DI(343) XOR DI(47) XOR DI(454) XOR DI(316) XOR DI(123) XOR DI(65) XOR DI(187) XOR DI(465) XOR DI(327) XOR DI(171) XOR DI(398) XOR DI(483) XOR DI(412) XOR DI(285) XOR DI(462) XOR DI(29) XOR DI(414) XOR DI(499) XOR DI(272) XOR DI(241) XOR DI(210) XOR DI(307) XOR DI(318) XOR DI(7) XOR DI(236) XOR DI(232) XOR DI(223) XOR DI(299) XOR DI(212) XOR DI(119) XOR DI(372) XOR DI(143) XOR DI(93) XOR DI(396) XOR DI(308) XOR DI(32) XOR DI(383) XOR DI(484) XOR DI(221) XOR DI(197) XOR DI(128) XOR DI(381) XOR DI(152) XOR DI(147) XOR DI(101) XOR DI(428) XOR DI(167) XOR DI(51) XOR DI(168) XOR DI(405) XOR DI(317) XOR DI(455) XOR DI(213) XOR DI(91) XOR DI(448) XOR DI(117) XOR DI(181) XOR DI(321) XOR DI(392) XOR DI(23) XOR DI(301) XOR DI(312) XOR DI(1) XOR DI(217) XOR DI(206) XOR DI(366) XOR DI(137) XOR DI(390) XOR DI(26) XOR DI(478) XOR DI(215) XOR DI(122) XOR DI(146) XOR DI(141) XOR DI(45) XOR DI(162) XOR DI(399) XOR DI(449) XOR DI(442) XOR DI(111) XOR DI(306) XOR DI(200) XOR DI(360) XOR DI(20) XOR DI(116) XOR DI(39) XOR DI(156) XOR DI(443) XOR DI(436) XOR DI(194) XOR DI(354) XOR DI(14) XOR DI(110) XOR DI(33) XOR DI(430) XOR DI(188) XOR DI(348) XOR DI(8) XOR DI(27) XOR DI(182) XOR DI(21) XOR DI(176) XOR DI(15) XOR DI(170) XOR DI(9) XOR DI(3) XOR DI(503) XOR DI(509); + DO(4) <= DI(68) XOR DI(492) XOR DI(240) XOR DI(79) XOR DI(261) XOR DI(268) XOR DI(398) XOR DI(360) XOR DI(199) XOR DI(80) XOR DI(326) XOR DI(487) XOR DI(289) XOR DI(347) XOR DI(64) XOR DI(471) XOR DI(51) XOR DI(432) XOR DI(417) XOR DI(181) XOR DI(365) XOR DI(67) XOR DI(288) XOR DI(418) XOR DI(330) XOR DI(468) XOR DI(257) XOR DI(226) XOR DI(104) XOR DI(333) XOR DI(488) XOR DI(350) XOR DI(54) XOR DI(461) XOR DI(458) XOR DI(247) XOR DI(323) XOR DI(44) XOR DI(451) XOR DI(448) XOR DI(130) XOR DI(72) XOR DI(196) XOR DI(229) XOR DI(97) XOR DI(140) XOR DI(194) XOR DI(125) XOR DI(402) XOR DI(472) XOR DI(334) XOR DI(178) XOR DI(405) XOR DI(490) XOR DI(290) XOR DI(23) XOR DI(419) XOR DI(82) XOR DI(292) XOR DI(128) XOR DI(469) XOR DI(206) XOR DI(36) XOR DI(433) XOR DI(421) XOR DI(167) XOR DI(506) XOR DI(252) XOR DI(259) XOR DI(389) XOR DI(55) XOR DI(279) XOR DI(248) XOR DI(217) XOR DI(314) XOR DI(35) XOR DI(116) XOR DI(325) XOR DI(14) XOR DI(410) XOR DI(197) XOR DI(158) XOR DI(243) XOR DI(380) XOR DI(239) XOR DI(26) XOR DI(107) XOR DI(5) XOR DI(230) XOR DI(221) XOR DI(372) XOR DI(306) XOR DI(381) XOR DI(219) XOR DI(126) XOR DI(379) XOR DI(150) XOR DI(100) XOR DI(345) XOR DI(403) XOR DI(315) XOR DI(453) XOR DI(39) XOR DI(179) XOR DI(390) XOR DI(491) XOR DI(264) XOR DI(228) XOR DI(204) XOR DI(135) XOR DI(388) XOR DI(420) XOR DI(159) XOR DI(83) XOR DI(109) XOR DI(304) XOR DI(358) XOR DI(37) XOR DI(154) XOR DI(434) XOR DI(108) XOR DI(435) XOR DI(346) XOR DI(6) XOR DI(25) XOR DI(422) XOR DI(174) XOR DI(507) XOR DI(486) XOR DI(255) XOR DI(354) XOR DI(58) XOR DI(175) XOR DI(282) XOR DI(412) XOR DI(324) XOR DI(462) XOR DI(251) XOR DI(220) XOR DI(98) XOR DI(482) XOR DI(344) XOR DI(48) XOR DI(455) XOR DI(317) XOR DI(124) XOR DI(66) XOR DI(188) XOR DI(466) XOR DI(328) XOR DI(172) XOR DI(399) XOR DI(484) XOR DI(413) XOR DI(286) XOR DI(463) XOR DI(30) XOR DI(415) XOR DI(500) XOR DI(273) XOR DI(242) XOR DI(211) XOR DI(308) XOR DI(319) XOR DI(8) XOR DI(237) XOR DI(233) XOR DI(224) XOR DI(300) XOR DI(213) XOR DI(120) XOR DI(373) XOR DI(144) XOR DI(94) XOR DI(397) XOR DI(309) XOR DI(33) XOR DI(384) XOR DI(485) XOR DI(222) XOR DI(198) XOR DI(129) XOR DI(382) XOR DI(153) XOR DI(148) XOR DI(102) XOR DI(429) XOR DI(0) XOR DI(168) XOR DI(52) XOR DI(169) XOR DI(406) XOR DI(318) XOR DI(456) XOR DI(214) XOR DI(92) XOR DI(449) XOR DI(118) XOR DI(182) XOR DI(322) XOR DI(393) XOR DI(24) XOR DI(302) XOR DI(313) XOR DI(2) XOR DI(218) XOR DI(207) XOR DI(367) XOR DI(138) XOR DI(391) XOR DI(27) XOR DI(479) XOR DI(216) XOR DI(123) XOR DI(147) XOR DI(142) XOR DI(46) XOR DI(163) XOR DI(400) XOR DI(450) XOR DI(443) XOR DI(112) XOR DI(307) XOR DI(201) XOR DI(361) XOR DI(21) XOR DI(117) XOR DI(40) XOR DI(157) XOR DI(444) XOR DI(437) XOR DI(195) XOR DI(355) XOR DI(15) XOR DI(111) XOR DI(34) XOR DI(431) XOR DI(189) XOR DI(349) XOR DI(9) XOR DI(28) XOR DI(183) XOR DI(22) XOR DI(177) XOR DI(16) XOR DI(171) XOR DI(10) XOR DI(4) XOR DI(504) XOR DI(510); + DO(5) <= DI(69) XOR DI(493) XOR DI(241) XOR DI(80) XOR DI(262) XOR DI(269) XOR DI(399) XOR DI(361) XOR DI(200) XOR DI(81) XOR DI(327) XOR DI(488) XOR DI(290) XOR DI(348) XOR DI(65) XOR DI(472) XOR DI(52) XOR DI(433) XOR DI(418) XOR DI(182) XOR DI(366) XOR DI(68) XOR DI(289) XOR DI(419) XOR DI(331) XOR DI(469) XOR DI(258) XOR DI(227) XOR DI(105) XOR DI(334) XOR DI(489) XOR DI(351) XOR DI(55) XOR DI(462) XOR DI(459) XOR DI(248) XOR DI(324) XOR DI(45) XOR DI(452) XOR DI(449) XOR DI(131) XOR DI(73) XOR DI(197) XOR DI(230) XOR DI(98) XOR DI(141) XOR DI(195) XOR DI(126) XOR DI(403) XOR DI(473) XOR DI(335) XOR DI(179) XOR DI(406) XOR DI(491) XOR DI(291) XOR DI(24) XOR DI(420) XOR DI(83) XOR DI(293) XOR DI(129) XOR DI(470) XOR DI(207) XOR DI(37) XOR DI(434) XOR DI(422) XOR DI(168) XOR DI(507) XOR DI(253) XOR DI(260) XOR DI(390) XOR DI(56) XOR DI(280) XOR DI(249) XOR DI(218) XOR DI(315) XOR DI(36) XOR DI(117) XOR DI(326) XOR DI(15) XOR DI(411) XOR DI(198) XOR DI(159) XOR DI(244) XOR DI(381) XOR DI(240) XOR DI(27) XOR DI(108) XOR DI(6) XOR DI(231) XOR DI(222) XOR DI(373) XOR DI(307) XOR DI(382) XOR DI(220) XOR DI(127) XOR DI(380) XOR DI(151) XOR DI(101) XOR DI(346) XOR DI(404) XOR DI(316) XOR DI(454) XOR DI(40) XOR DI(180) XOR DI(391) XOR DI(492) XOR DI(265) XOR DI(229) XOR DI(205) XOR DI(136) XOR DI(389) XOR DI(421) XOR DI(160) XOR DI(84) XOR DI(110) XOR DI(305) XOR DI(359) XOR DI(38) XOR DI(155) XOR DI(435) XOR DI(109) XOR DI(436) XOR DI(347) XOR DI(7) XOR DI(26) XOR DI(423) XOR DI(175) XOR DI(508) XOR DI(487) XOR DI(256) XOR DI(355) XOR DI(59) XOR DI(176) XOR DI(283) XOR DI(413) XOR DI(325) XOR DI(463) XOR DI(252) XOR DI(221) XOR DI(99) XOR DI(483) XOR DI(345) XOR DI(49) XOR DI(456) XOR DI(318) XOR DI(125) XOR DI(67) XOR DI(189) XOR DI(467) XOR DI(329) XOR DI(173) XOR DI(400) XOR DI(485) XOR DI(414) XOR DI(287) XOR DI(464) XOR DI(31) XOR DI(416) XOR DI(501) XOR DI(274) XOR DI(243) XOR DI(212) XOR DI(309) XOR DI(320) XOR DI(9) XOR DI(238) XOR DI(234) XOR DI(225) XOR DI(301) XOR DI(214) XOR DI(121) XOR DI(374) XOR DI(145) XOR DI(95) XOR DI(398) XOR DI(310) XOR DI(34) XOR DI(385) XOR DI(486) XOR DI(223) XOR DI(199) XOR DI(130) XOR DI(383) XOR DI(154) XOR DI(149) XOR DI(103) XOR DI(430) XOR DI(1) XOR DI(169) XOR DI(53) XOR DI(170) XOR DI(407) XOR DI(319) XOR DI(457) XOR DI(215) XOR DI(93) XOR DI(450) XOR DI(119) XOR DI(183) XOR DI(323) XOR DI(394) XOR DI(25) XOR DI(303) XOR DI(314) XOR DI(3) XOR DI(219) XOR DI(208) XOR DI(368) XOR DI(139) XOR DI(392) XOR DI(28) XOR DI(480) XOR DI(217) XOR DI(124) XOR DI(148) XOR DI(143) XOR DI(47) XOR DI(164) XOR DI(401) XOR DI(451) XOR DI(444) XOR DI(113) XOR DI(308) XOR DI(202) XOR DI(362) XOR DI(22) XOR DI(118) XOR DI(41) XOR DI(158) XOR DI(445) XOR DI(438) XOR DI(196) XOR DI(356) XOR DI(16) XOR DI(112) XOR DI(35) XOR DI(432) XOR DI(190) XOR DI(350) XOR DI(10) XOR DI(29) XOR DI(184) XOR DI(23) XOR DI(178) XOR DI(17) XOR DI(172) XOR DI(11) XOR DI(5) XOR DI(505) XOR DI(511); + DO(6) <= DI(70) XOR DI(494) XOR DI(345) XOR DI(313) XOR DI(242) XOR DI(269) XOR DI(63) XOR DI(81) XOR DI(263) XOR DI(378) XOR DI(138) XOR DI(62) XOR DI(329) XOR DI(270) XOR DI(400) XOR DI(178) XOR DI(79) XOR DI(107) XOR DI(387) XOR DI(5) XOR DI(362) XOR DI(201) XOR DI(361) XOR DI(82) XOR DI(416) XOR DI(328) XOR DI(489) XOR DI(264) XOR DI(255) XOR DI(195) XOR DI(291) XOR DI(467) XOR DI(349) XOR DI(66) XOR DI(473) XOR DI(418) XOR DI(53) XOR DI(434) XOR DI(419) XOR DI(153) XOR DI(238) XOR DI(183) XOR DI(367) XOR DI(69) XOR DI(290) XOR DI(420) XOR DI(332) XOR DI(303) XOR DI(470) XOR DI(259) XOR DI(228) XOR DI(286) XOR DI(106) XOR DI(368) XOR DI(88) XOR DI(154) XOR DI(78) XOR DI(124) XOR DI(202) XOR DI(98) XOR DI(335) XOR DI(490) XOR DI(260) XOR DI(352) XOR DI(56) XOR DI(463) XOR DI(409) XOR DI(322) XOR DI(460) XOR DI(249) XOR DI(325) XOR DI(46) XOR DI(453) XOR DI(450) XOR DI(440) XOR DI(64) XOR DI(132) XOR DI(394) XOR DI(482) XOR DI(74) XOR DI(198) XOR DI(251) XOR DI(108) XOR DI(231) XOR DI(99) XOR DI(298) XOR DI(142) XOR DI(31) XOR DI(196) XOR DI(127) XOR DI(380) XOR DI(296) XOR DI(350) XOR DI(247) XOR DI(404) XOR DI(243) XOR DI(474) XOR DI(336) XOR DI(40) XOR DI(447) XOR DI(180) XOR DI(278) XOR DI(22) XOR DI(407) XOR DI(492) XOR DI(229) XOR DI(225) XOR DI(292) XOR DI(112) XOR DI(136) XOR DI(389) XOR DI(25) XOR DI(376) XOR DI(421) XOR DI(84) XOR DI(314) XOR DI(385) XOR DI(294) XOR DI(305) XOR DI(130) XOR DI(471) XOR DI(208) XOR DI(134) XOR DI(38) XOR DI(435) XOR DI(193) XOR DI(429) XOR DI(103) XOR DI(423) XOR DI(341) XOR DI(169) XOR DI(163) XOR DI(496) XOR DI(508) XOR DI(233) XOR DI(254) XOR DI(261) XOR DI(391) XOR DI(192) XOR DI(480) XOR DI(282) XOR DI(340) XOR DI(57) XOR DI(44) XOR DI(425) XOR DI(281) XOR DI(411) XOR DI(250) XOR DI(219) XOR DI(343) XOR DI(47) XOR DI(454) XOR DI(316) XOR DI(37) XOR DI(444) XOR DI(90) XOR DI(118) XOR DI(327) XOR DI(398) XOR DI(483) XOR DI(16) XOR DI(412) XOR DI(75) XOR DI(285) XOR DI(121) XOR DI(462) XOR DI(199) XOR DI(160) XOR DI(245) XOR DI(382) XOR DI(241) XOR DI(210) XOR DI(28) XOR DI(109) XOR DI(318) XOR DI(7) XOR DI(236) XOR DI(232) XOR DI(19) XOR DI(223) XOR DI(214) XOR DI(374) XOR DI(212) XOR DI(143) XOR DI(93) XOR DI(396) XOR DI(308) XOR DI(383) XOR DI(221) XOR DI(128) XOR DI(381) XOR DI(413) XOR DI(152) XOR DI(76) XOR DI(102) XOR DI(427) XOR DI(428) XOR DI(167) XOR DI(500) XOR DI(248) XOR DI(347) XOR DI(51) XOR DI(168) XOR DI(405) XOR DI(317) XOR DI(455) XOR DI(475) XOR DI(41) XOR DI(181) XOR DI(459) XOR DI(392) XOR DI(406) XOR DI(493) XOR DI(266) XOR DI(1) XOR DI(230) XOR DI(217) XOR DI(206) XOR DI(137) XOR DI(390) XOR DI(377) XOR DI(478) XOR DI(422) XOR DI(161) XOR DI(449) XOR DI(207) XOR DI(85) XOR DI(111) XOR DI(175) XOR DI(306) XOR DI(360) XOR DI(20) XOR DI(116) XOR DI(39) XOR DI(156) XOR DI(436) XOR DI(105) XOR DI(300) XOR DI(194) XOR DI(354) XOR DI(110) XOR DI(33) XOR DI(437) XOR DI(430) XOR DI(348) XOR DI(8) XOR DI(27) XOR DI(424) XOR DI(342) XOR DI(21) XOR DI(176) XOR DI(164) XOR DI(503) XOR DI(509); + DO(7) <= DI(71) XOR DI(495) XOR DI(346) XOR DI(314) XOR DI(243) XOR DI(270) XOR DI(64) XOR DI(82) XOR DI(264) XOR DI(379) XOR DI(139) XOR DI(63) XOR DI(330) XOR DI(271) XOR DI(401) XOR DI(179) XOR DI(80) XOR DI(108) XOR DI(388) XOR DI(6) XOR DI(363) XOR DI(202) XOR DI(362) XOR DI(83) XOR DI(417) XOR DI(329) XOR DI(490) XOR DI(265) XOR DI(256) XOR DI(196) XOR DI(292) XOR DI(468) XOR DI(350) XOR DI(67) XOR DI(474) XOR DI(419) XOR DI(54) XOR DI(435) XOR DI(420) XOR DI(154) XOR DI(239) XOR DI(184) XOR DI(368) XOR DI(70) XOR DI(291) XOR DI(421) XOR DI(333) XOR DI(304) XOR DI(471) XOR DI(260) XOR DI(229) XOR DI(287) XOR DI(107) XOR DI(369) XOR DI(89) XOR DI(155) XOR DI(79) XOR DI(125) XOR DI(203) XOR DI(99) XOR DI(336) XOR DI(491) XOR DI(261) XOR DI(353) XOR DI(57) XOR DI(464) XOR DI(410) XOR DI(323) XOR DI(461) XOR DI(250) XOR DI(326) XOR DI(47) XOR DI(454) XOR DI(451) XOR DI(441) XOR DI(65) XOR DI(133) XOR DI(395) XOR DI(483) XOR DI(75) XOR DI(199) XOR DI(252) XOR DI(109) XOR DI(232) XOR DI(100) XOR DI(299) XOR DI(143) XOR DI(32) XOR DI(197) XOR DI(128) XOR DI(381) XOR DI(297) XOR DI(351) XOR DI(248) XOR DI(405) XOR DI(244) XOR DI(475) XOR DI(337) XOR DI(41) XOR DI(448) XOR DI(181) XOR DI(279) XOR DI(23) XOR DI(408) XOR DI(493) XOR DI(230) XOR DI(226) XOR DI(293) XOR DI(113) XOR DI(137) XOR DI(390) XOR DI(26) XOR DI(377) XOR DI(422) XOR DI(85) XOR DI(315) XOR DI(386) XOR DI(295) XOR DI(306) XOR DI(131) XOR DI(472) XOR DI(209) XOR DI(135) XOR DI(39) XOR DI(436) XOR DI(194) XOR DI(430) XOR DI(104) XOR DI(424) XOR DI(342) XOR DI(170) XOR DI(164) XOR DI(497) XOR DI(509) XOR DI(234) XOR DI(255) XOR DI(262) XOR DI(392) XOR DI(193) XOR DI(481) XOR DI(283) XOR DI(341) XOR DI(58) XOR DI(45) XOR DI(426) XOR DI(282) XOR DI(412) XOR DI(251) XOR DI(220) XOR DI(344) XOR DI(48) XOR DI(455) XOR DI(317) XOR DI(38) XOR DI(445) XOR DI(91) XOR DI(119) XOR DI(328) XOR DI(399) XOR DI(484) XOR DI(17) XOR DI(413) XOR DI(76) XOR DI(286) XOR DI(122) XOR DI(463) XOR DI(200) XOR DI(161) XOR DI(246) XOR DI(383) XOR DI(242) XOR DI(211) XOR DI(29) XOR DI(110) XOR DI(319) XOR DI(8) XOR DI(237) XOR DI(233) XOR DI(20) XOR DI(224) XOR DI(215) XOR DI(375) XOR DI(213) XOR DI(144) XOR DI(94) XOR DI(397) XOR DI(309) XOR DI(384) XOR DI(222) XOR DI(129) XOR DI(382) XOR DI(414) XOR DI(153) XOR DI(77) XOR DI(103) XOR DI(428) XOR DI(429) XOR DI(0) XOR DI(168) XOR DI(501) XOR DI(249) XOR DI(348) XOR DI(52) XOR DI(169) XOR DI(406) XOR DI(318) XOR DI(456) XOR DI(476) XOR DI(42) XOR DI(182) XOR DI(460) XOR DI(393) XOR DI(407) XOR DI(494) XOR DI(267) XOR DI(2) XOR DI(231) XOR DI(218) XOR DI(207) XOR DI(138) XOR DI(391) XOR DI(378) XOR DI(479) XOR DI(423) XOR DI(162) XOR DI(450) XOR DI(208) XOR DI(86) XOR DI(112) XOR DI(176) XOR DI(307) XOR DI(361) XOR DI(21) XOR DI(117) XOR DI(40) XOR DI(157) XOR DI(437) XOR DI(106) XOR DI(301) XOR DI(195) XOR DI(355) XOR DI(111) XOR DI(34) XOR DI(438) XOR DI(431) XOR DI(349) XOR DI(9) XOR DI(28) XOR DI(425) XOR DI(343) XOR DI(22) XOR DI(177) XOR DI(165) XOR DI(504) XOR DI(510); + DO(8) <= DI(72) XOR DI(496) XOR DI(347) XOR DI(315) XOR DI(244) XOR DI(271) XOR DI(65) XOR DI(83) XOR DI(265) XOR DI(380) XOR DI(140) XOR DI(64) XOR DI(331) XOR DI(272) XOR DI(402) XOR DI(180) XOR DI(81) XOR DI(109) XOR DI(389) XOR DI(7) XOR DI(364) XOR DI(203) XOR DI(363) XOR DI(84) XOR DI(418) XOR DI(330) XOR DI(491) XOR DI(266) XOR DI(257) XOR DI(197) XOR DI(293) XOR DI(469) XOR DI(351) XOR DI(68) XOR DI(475) XOR DI(420) XOR DI(55) XOR DI(436) XOR DI(421) XOR DI(155) XOR DI(240) XOR DI(185) XOR DI(369) XOR DI(71) XOR DI(292) XOR DI(422) XOR DI(334) XOR DI(305) XOR DI(472) XOR DI(261) XOR DI(230) XOR DI(288) XOR DI(108) XOR DI(370) XOR DI(90) XOR DI(156) XOR DI(80) XOR DI(126) XOR DI(204) XOR DI(100) XOR DI(337) XOR DI(492) XOR DI(262) XOR DI(354) XOR DI(58) XOR DI(465) XOR DI(411) XOR DI(324) XOR DI(462) XOR DI(251) XOR DI(327) XOR DI(48) XOR DI(455) XOR DI(452) XOR DI(442) XOR DI(66) XOR DI(134) XOR DI(396) XOR DI(484) XOR DI(76) XOR DI(200) XOR DI(253) XOR DI(110) XOR DI(233) XOR DI(101) XOR DI(300) XOR DI(144) XOR DI(33) XOR DI(198) XOR DI(129) XOR DI(382) XOR DI(298) XOR DI(352) XOR DI(249) XOR DI(406) XOR DI(245) XOR DI(476) XOR DI(338) XOR DI(42) XOR DI(449) XOR DI(182) XOR DI(280) XOR DI(24) XOR DI(409) XOR DI(494) XOR DI(231) XOR DI(227) XOR DI(294) XOR DI(114) XOR DI(138) XOR DI(391) XOR DI(27) XOR DI(378) XOR DI(423) XOR DI(86) XOR DI(316) XOR DI(387) XOR DI(296) XOR DI(307) XOR DI(132) XOR DI(473) XOR DI(210) XOR DI(136) XOR DI(40) XOR DI(437) XOR DI(195) XOR DI(431) XOR DI(105) XOR DI(425) XOR DI(343) XOR DI(171) XOR DI(165) XOR DI(498) XOR DI(510) XOR DI(235) XOR DI(256) XOR DI(263) XOR DI(393) XOR DI(194) XOR DI(482) XOR DI(284) XOR DI(342) XOR DI(59) XOR DI(46) XOR DI(427) XOR DI(283) XOR DI(413) XOR DI(252) XOR DI(221) XOR DI(345) XOR DI(49) XOR DI(456) XOR DI(318) XOR DI(39) XOR DI(446) XOR DI(92) XOR DI(120) XOR DI(329) XOR DI(400) XOR DI(485) XOR DI(18) XOR DI(414) XOR DI(77) XOR DI(287) XOR DI(123) XOR DI(464) XOR DI(201) XOR DI(162) XOR DI(247) XOR DI(384) XOR DI(243) XOR DI(212) XOR DI(30) XOR DI(111) XOR DI(320) XOR DI(9) XOR DI(238) XOR DI(234) XOR DI(21) XOR DI(0) XOR DI(225) XOR DI(216) XOR DI(376) XOR DI(214) XOR DI(145) XOR DI(95) XOR DI(398) XOR DI(310) XOR DI(385) XOR DI(223) XOR DI(130) XOR DI(383) XOR DI(415) XOR DI(154) XOR DI(78) XOR DI(104) XOR DI(429) XOR DI(430) XOR DI(1) XOR DI(169) XOR DI(502) XOR DI(250) XOR DI(349) XOR DI(53) XOR DI(170) XOR DI(407) XOR DI(319) XOR DI(457) XOR DI(477) XOR DI(43) XOR DI(183) XOR DI(461) XOR DI(394) XOR DI(408) XOR DI(495) XOR DI(268) XOR DI(3) XOR DI(232) XOR DI(219) XOR DI(208) XOR DI(139) XOR DI(392) XOR DI(379) XOR DI(480) XOR DI(424) XOR DI(163) XOR DI(451) XOR DI(209) XOR DI(87) XOR DI(113) XOR DI(177) XOR DI(308) XOR DI(362) XOR DI(22) XOR DI(118) XOR DI(41) XOR DI(158) XOR DI(438) XOR DI(107) XOR DI(302) XOR DI(196) XOR DI(356) XOR DI(112) XOR DI(35) XOR DI(439) XOR DI(432) XOR DI(350) XOR DI(10) XOR DI(29) XOR DI(426) XOR DI(344) XOR DI(23) XOR DI(178) XOR DI(166) XOR DI(505) XOR DI(511); + DO(9) <= DI(255) XOR DI(324) XOR DI(282) XOR DI(459) XOR DI(175) XOR DI(260) XOR DI(326) XOR DI(116) XOR DI(73) XOR DI(497) XOR DI(348) XOR DI(316) XOR DI(150) XOR DI(90) XOR DI(449) XOR DI(305) XOR DI(245) XOR DI(48) XOR DI(165) XOR DI(272) XOR DI(66) XOR DI(134) XOR DI(84) XOR DI(266) XOR DI(396) XOR DI(484) XOR DI(381) XOR DI(76) XOR DI(286) XOR DI(122) XOR DI(126) XOR DI(141) XOR DI(488) XOR DI(500) XOR DI(64) XOR DI(65) XOR DI(332) XOR DI(273) XOR DI(403) XOR DI(181) XOR DI(82) XOR DI(110) XOR DI(390) XOR DI(8) XOR DI(454) XOR DI(365) XOR DI(204) XOR DI(364) XOR DI(85) XOR DI(300) XOR DI(144) XOR DI(94) XOR DI(419) XOR DI(331) XOR DI(492) XOR DI(267) XOR DI(51) XOR DI(258) XOR DI(198) XOR DI(294) XOR DI(470) XOR DI(138) XOR DI(352) XOR DI(6) XOR DI(229) XOR DI(68) XOR DI(387) XOR DI(69) XOR DI(315) XOR DI(476) XOR DI(278) XOR DI(421) XOR DI(406) XOR DI(354) XOR DI(56) XOR DI(322) XOR DI(33) XOR DI(437) XOR DI(185) XOR DI(218) XOR DI(12) XOR DI(422) XOR DI(156) XOR DI(241) XOR DI(378) XOR DI(186) XOR DI(369) XOR DI(361) XOR DI(370) XOR DI(168) XOR DI(72) XOR DI(98) XOR DI(293) XOR DI(26) XOR DI(423) XOR DI(335) XOR DI(411) XOR DI(475) XOR DI(306) XOR DI(473) XOR DI(402) XOR DI(275) XOR DI(262) XOR DI(231) XOR DI(200) XOR DI(289) XOR DI(109) XOR DI(298) XOR DI(371) XOR DI(91) XOR DI(418) XOR DI(157) XOR DI(203) XOR DI(81) XOR DI(207) XOR DI(127) XOR DI(468) XOR DI(205) XOR DI(136) XOR DI(389) XOR DI(101) XOR DI(296) XOR DI(100) XOR DI(338) XOR DI(493) XOR DI(63) XOR DI(487) XOR DI(263) XOR DI(355) XOR DI(194) XOR DI(75) XOR DI(482) XOR DI(342) XOR DI(59) XOR DI(466) XOR DI(412) XOR DI(62) XOR DI(413) XOR DI(325) XOR DI(463) XOR DI(252) XOR DI(328) XOR DI(49) XOR DI(456) XOR DI(453) XOR DI(318) XOR DI(446) XOR DI(443) XOR DI(125) XOR DI(67) XOR DI(191) XOR DI(135) XOR DI(120) XOR DI(397) XOR DI(467) XOR DI(329) XOR DI(173) XOR DI(485) XOR DI(18) XOR DI(77) XOR DI(464) XOR DI(201) XOR DI(247) XOR DI(254) XOR DI(243) XOR DI(212) XOR DI(111) XOR DI(192) XOR DI(153) XOR DI(238) XOR DI(375) XOR DI(234) XOR DI(21) XOR DI(102) XOR DI(225) XOR DI(216) XOR DI(301) XOR DI(376) XOR DI(214) XOR DI(145) XOR DI(340) XOR DI(398) XOR DI(310) XOR DI(34) XOR DI(174) XOR DI(199) XOR DI(130) XOR DI(383) XOR DI(154) XOR DI(104) XOR DI(299) XOR DI(353) XOR DI(32) XOR DI(149) XOR DI(429) XOR DI(103) XOR DI(341) XOR DI(20) XOR DI(417) XOR DI(502) XOR DI(250) XOR DI(407) XOR DI(246) XOR DI(477) XOR DI(339) XOR DI(43) XOR DI(450) XOR DI(183) XOR DI(281) XOR DI(25) XOR DI(410) XOR DI(495) XOR DI(314) XOR DI(232) XOR DI(228) XOR DI(295) XOR DI(115) XOR DI(368) XOR DI(139) XOR DI(392) XOR DI(304) XOR DI(28) XOR DI(379) XOR DI(480) XOR DI(193) XOR DI(143) XOR DI(424) XOR DI(313) XOR DI(451) XOR DI(87) XOR DI(444) XOR DI(177) XOR DI(317) XOR DI(388) XOR DI(297) XOR DI(308) XOR DI(133) XOR DI(474) XOR DI(211) XOR DI(137) XOR DI(41) XOR DI(445) XOR DI(438) XOR DI(107) XOR DI(302) XOR DI(196) XOR DI(356) XOR DI(35) XOR DI(432) XOR DI(190) XOR DI(106) XOR DI(29) XOR DI(426) XOR DI(344) XOR DI(17) XOR DI(172) XOR DI(166) XOR DI(5) XOR DI(499) XOR DI(511); + DO(10) <= DI(256) XOR DI(321) XOR DI(322) XOR DI(487) XOR DI(260) XOR DI(325) XOR DI(47) XOR DI(75) XOR DI(283) XOR DI(460) XOR DI(176) XOR DI(261) XOR DI(361) XOR DI(327) XOR DI(117) XOR DI(170) XOR DI(74) XOR DI(431) XOR DI(177) XOR DI(498) XOR DI(349) XOR DI(317) XOR DI(151) XOR DI(100) XOR DI(394) XOR DI(91) XOR DI(450) XOR DI(484) XOR DI(257) XOR DI(284) XOR DI(306) XOR DI(122) XOR DI(246) XOR DI(49) XOR DI(166) XOR DI(273) XOR DI(67) XOR DI(224) XOR DI(135) XOR DI(85) XOR DI(267) XOR DI(397) XOR DI(236) XOR DI(51) XOR DI(485) XOR DI(222) XOR DI(285) XOR DI(79) XOR DI(382) XOR DI(77) XOR DI(287) XOR DI(123) XOR DI(127) XOR DI(31) XOR DI(428) XOR DI(142) XOR DI(96) XOR DI(416) XOR DI(489) XOR DI(501) XOR DI(65) XOR DI(346) XOR DI(66) XOR DI(275) XOR DI(333) XOR DI(274) XOR DI(404) XOR DI(243) XOR DI(40) XOR DI(182) XOR DI(83) XOR DI(111) XOR DI(391) XOR DI(9) XOR DI(455) XOR DI(375) XOR DI(366) XOR DI(225) XOR DI(93) XOR DI(205) XOR DI(365) XOR DI(86) XOR DI(301) XOR DI(190) XOR DI(406) XOR DI(145) XOR DI(95) XOR DI(420) XOR DI(332) XOR DI(493) XOR DI(268) XOR DI(310) XOR DI(52) XOR DI(385) XOR DI(449) XOR DI(401) XOR DI(259) XOR DI(286) XOR DI(199) XOR DI(295) XOR DI(471) XOR DI(368) XOR DI(139) XOR DI(415) XOR DI(10) XOR DI(288) XOR DI(353) XOR DI(124) XOR DI(32) XOR DI(386) XOR DI(429) XOR DI(7) XOR DI(1) XOR DI(417) XOR DI(163) XOR DI(2) XOR DI(502) XOR DI(482) XOR DI(230) XOR DI(69) XOR DI(388) XOR DI(350) XOR DI(70) XOR DI(316) XOR DI(477) XOR DI(279) XOR DI(54) XOR DI(422) XOR DI(407) XOR DI(171) XOR DI(355) XOR DI(57) XOR DI(278) XOR DI(320) XOR DI(458) XOR DI(216) XOR DI(94) XOR DI(323) XOR DI(313) XOR DI(34) XOR DI(438) XOR DI(120) XOR DI(62) XOR DI(186) XOR DI(219) XOR DI(462) XOR DI(324) XOR DI(168) XOR DI(395) XOR DI(480) XOR DI(13) XOR DI(409) XOR DI(459) XOR DI(423) XOR DI(157) XOR DI(242) XOR DI(379) XOR DI(269) XOR DI(238) XOR DI(207) XOR DI(304) XOR DI(4) XOR DI(187) XOR DI(370) XOR DI(220) XOR DI(362) XOR DI(371) XOR DI(209) XOR DI(90) XOR DI(169) XOR DI(218) XOR DI(125) XOR DI(378) XOR DI(149) XOR DI(73) XOR DI(99) XOR DI(294) XOR DI(27) XOR DI(424) XOR DI(98) XOR DI(336) XOR DI(412) XOR DI(164) XOR DI(476) XOR DI(48) XOR DI(165) XOR DI(402) XOR DI(210) XOR DI(307) XOR DI(114) XOR DI(474) XOR DI(403) XOR DI(276) XOR DI(20) XOR DI(263) XOR DI(232) XOR DI(201) XOR DI(214) XOR DI(290) XOR DI(203) XOR DI(110) XOR DI(363) XOR DI(387) XOR DI(299) XOR DI(23) XOR DI(119) XOR DI(372) XOR DI(143) XOR DI(92) XOR DI(419) XOR DI(158) XOR DI(159) XOR DI(396) XOR DI(204) XOR DI(82) XOR DI(208) XOR DI(128) XOR DI(17) XOR DI(469) XOR DI(206) XOR DI(113) XOR DI(137) XOR DI(153) XOR DI(390) XOR DI(440) XOR DI(102) XOR DI(297) XOR DI(351) XOR DI(11) XOR DI(185) XOR DI(5) XOR DI(101) XOR DI(24) XOR DI(179) XOR DI(339) XOR DI(12) XOR DI(0) XOR DI(494) XOR DI(506); + DO(11) <= DI(257) XOR DI(322) XOR DI(323) XOR DI(488) XOR DI(261) XOR DI(326) XOR DI(48) XOR DI(76) XOR DI(284) XOR DI(461) XOR DI(177) XOR DI(262) XOR DI(362) XOR DI(328) XOR DI(118) XOR DI(171) XOR DI(75) XOR DI(432) XOR DI(178) XOR DI(499) XOR DI(350) XOR DI(318) XOR DI(152) XOR DI(101) XOR DI(395) XOR DI(92) XOR DI(451) XOR DI(485) XOR DI(258) XOR DI(285) XOR DI(307) XOR DI(123) XOR DI(247) XOR DI(50) XOR DI(167) XOR DI(274) XOR DI(68) XOR DI(225) XOR DI(136) XOR DI(86) XOR DI(268) XOR DI(398) XOR DI(237) XOR DI(52) XOR DI(486) XOR DI(223) XOR DI(286) XOR DI(80) XOR DI(383) XOR DI(78) XOR DI(288) XOR DI(124) XOR DI(128) XOR DI(32) XOR DI(429) XOR DI(143) XOR DI(97) XOR DI(417) XOR DI(490) XOR DI(502) XOR DI(66) XOR DI(347) XOR DI(67) XOR DI(276) XOR DI(334) XOR DI(275) XOR DI(405) XOR DI(244) XOR DI(41) XOR DI(183) XOR DI(84) XOR DI(112) XOR DI(392) XOR DI(10) XOR DI(456) XOR DI(376) XOR DI(367) XOR DI(226) XOR DI(94) XOR DI(206) XOR DI(366) XOR DI(87) XOR DI(302) XOR DI(191) XOR DI(407) XOR DI(146) XOR DI(96) XOR DI(421) XOR DI(333) XOR DI(494) XOR DI(269) XOR DI(311) XOR DI(53) XOR DI(386) XOR DI(450) XOR DI(402) XOR DI(260) XOR DI(287) XOR DI(200) XOR DI(296) XOR DI(472) XOR DI(369) XOR DI(140) XOR DI(416) XOR DI(11) XOR DI(289) XOR DI(354) XOR DI(125) XOR DI(33) XOR DI(387) XOR DI(430) XOR DI(8) XOR DI(2) XOR DI(418) XOR DI(164) XOR DI(3) XOR DI(503) XOR DI(483) XOR DI(231) XOR DI(70) XOR DI(389) XOR DI(351) XOR DI(71) XOR DI(317) XOR DI(478) XOR DI(280) XOR DI(55) XOR DI(423) XOR DI(408) XOR DI(172) XOR DI(356) XOR DI(58) XOR DI(279) XOR DI(321) XOR DI(459) XOR DI(217) XOR DI(95) XOR DI(324) XOR DI(314) XOR DI(35) XOR DI(439) XOR DI(121) XOR DI(63) XOR DI(187) XOR DI(220) XOR DI(463) XOR DI(325) XOR DI(169) XOR DI(396) XOR DI(481) XOR DI(14) XOR DI(410) XOR DI(460) XOR DI(424) XOR DI(158) XOR DI(243) XOR DI(380) XOR DI(270) XOR DI(239) XOR DI(208) XOR DI(305) XOR DI(5) XOR DI(188) XOR DI(371) XOR DI(221) XOR DI(363) XOR DI(372) XOR DI(210) XOR DI(91) XOR DI(170) XOR DI(219) XOR DI(126) XOR DI(379) XOR DI(150) XOR DI(74) XOR DI(100) XOR DI(295) XOR DI(28) XOR DI(425) XOR DI(99) XOR DI(337) XOR DI(413) XOR DI(165) XOR DI(477) XOR DI(49) XOR DI(166) XOR DI(403) XOR DI(211) XOR DI(308) XOR DI(115) XOR DI(475) XOR DI(404) XOR DI(277) XOR DI(21) XOR DI(264) XOR DI(233) XOR DI(202) XOR DI(215) XOR DI(291) XOR DI(204) XOR DI(111) XOR DI(364) XOR DI(388) XOR DI(300) XOR DI(24) XOR DI(120) XOR DI(373) XOR DI(144) XOR DI(93) XOR DI(420) XOR DI(159) XOR DI(160) XOR DI(397) XOR DI(205) XOR DI(83) XOR DI(209) XOR DI(129) XOR DI(18) XOR DI(470) XOR DI(207) XOR DI(114) XOR DI(138) XOR DI(154) XOR DI(391) XOR DI(441) XOR DI(103) XOR DI(298) XOR DI(352) XOR DI(12) XOR DI(186) XOR DI(6) XOR DI(102) XOR DI(25) XOR DI(180) XOR DI(340) XOR DI(0) XOR DI(13) XOR DI(1) XOR DI(495) XOR DI(507); + DO(12) <= DI(258) XOR DI(323) XOR DI(324) XOR DI(489) XOR DI(262) XOR DI(327) XOR DI(49) XOR DI(77) XOR DI(285) XOR DI(462) XOR DI(178) XOR DI(263) XOR DI(363) XOR DI(329) XOR DI(119) XOR DI(172) XOR DI(76) XOR DI(433) XOR DI(179) XOR DI(500) XOR DI(351) XOR DI(319) XOR DI(153) XOR DI(102) XOR DI(396) XOR DI(93) XOR DI(452) XOR DI(486) XOR DI(259) XOR DI(286) XOR DI(308) XOR DI(124) XOR DI(248) XOR DI(51) XOR DI(168) XOR DI(275) XOR DI(69) XOR DI(226) XOR DI(137) XOR DI(87) XOR DI(269) XOR DI(399) XOR DI(238) XOR DI(53) XOR DI(487) XOR DI(224) XOR DI(287) XOR DI(81) XOR DI(384) XOR DI(79) XOR DI(289) XOR DI(125) XOR DI(129) XOR DI(33) XOR DI(430) XOR DI(144) XOR DI(98) XOR DI(418) XOR DI(491) XOR DI(503) XOR DI(67) XOR DI(348) XOR DI(68) XOR DI(277) XOR DI(335) XOR DI(276) XOR DI(406) XOR DI(245) XOR DI(42) XOR DI(184) XOR DI(85) XOR DI(113) XOR DI(393) XOR DI(11) XOR DI(457) XOR DI(377) XOR DI(368) XOR DI(227) XOR DI(95) XOR DI(207) XOR DI(367) XOR DI(88) XOR DI(303) XOR DI(192) XOR DI(408) XOR DI(147) XOR DI(97) XOR DI(422) XOR DI(334) XOR DI(495) XOR DI(270) XOR DI(312) XOR DI(54) XOR DI(387) XOR DI(451) XOR DI(403) XOR DI(261) XOR DI(288) XOR DI(201) XOR DI(297) XOR DI(473) XOR DI(370) XOR DI(141) XOR DI(417) XOR DI(12) XOR DI(290) XOR DI(355) XOR DI(126) XOR DI(34) XOR DI(388) XOR DI(431) XOR DI(9) XOR DI(3) XOR DI(419) XOR DI(165) XOR DI(4) XOR DI(504) XOR DI(484) XOR DI(232) XOR DI(71) XOR DI(390) XOR DI(352) XOR DI(72) XOR DI(318) XOR DI(479) XOR DI(281) XOR DI(56) XOR DI(424) XOR DI(409) XOR DI(173) XOR DI(357) XOR DI(59) XOR DI(280) XOR DI(322) XOR DI(460) XOR DI(218) XOR DI(96) XOR DI(325) XOR DI(315) XOR DI(36) XOR DI(440) XOR DI(122) XOR DI(64) XOR DI(188) XOR DI(221) XOR DI(464) XOR DI(326) XOR DI(170) XOR DI(397) XOR DI(482) XOR DI(15) XOR DI(411) XOR DI(461) XOR DI(425) XOR DI(159) XOR DI(244) XOR DI(381) XOR DI(271) XOR DI(240) XOR DI(209) XOR DI(306) XOR DI(6) XOR DI(189) XOR DI(372) XOR DI(222) XOR DI(364) XOR DI(373) XOR DI(211) XOR DI(92) XOR DI(171) XOR DI(220) XOR DI(127) XOR DI(380) XOR DI(151) XOR DI(75) XOR DI(101) XOR DI(296) XOR DI(29) XOR DI(426) XOR DI(100) XOR DI(338) XOR DI(414) XOR DI(166) XOR DI(478) XOR DI(50) XOR DI(167) XOR DI(404) XOR DI(212) XOR DI(309) XOR DI(116) XOR DI(476) XOR DI(405) XOR DI(278) XOR DI(22) XOR DI(265) XOR DI(234) XOR DI(203) XOR DI(216) XOR DI(292) XOR DI(205) XOR DI(112) XOR DI(365) XOR DI(389) XOR DI(301) XOR DI(25) XOR DI(121) XOR DI(374) XOR DI(145) XOR DI(94) XOR DI(421) XOR DI(160) XOR DI(161) XOR DI(398) XOR DI(206) XOR DI(84) XOR DI(210) XOR DI(130) XOR DI(19) XOR DI(471) XOR DI(208) XOR DI(115) XOR DI(139) XOR DI(155) XOR DI(392) XOR DI(442) XOR DI(104) XOR DI(299) XOR DI(353) XOR DI(13) XOR DI(187) XOR DI(7) XOR DI(103) XOR DI(26) XOR DI(181) XOR DI(341) XOR DI(1) XOR DI(14) XOR DI(2) XOR DI(496) XOR DI(508); + DO(13) <= DI(259) XOR DI(324) XOR DI(325) XOR DI(490) XOR DI(263) XOR DI(328) XOR DI(50) XOR DI(78) XOR DI(286) XOR DI(463) XOR DI(179) XOR DI(264) XOR DI(364) XOR DI(330) XOR DI(120) XOR DI(173) XOR DI(77) XOR DI(434) XOR DI(180) XOR DI(0) XOR DI(501) XOR DI(352) XOR DI(320) XOR DI(154) XOR DI(103) XOR DI(397) XOR DI(94) XOR DI(453) XOR DI(487) XOR DI(260) XOR DI(287) XOR DI(309) XOR DI(125) XOR DI(249) XOR DI(52) XOR DI(169) XOR DI(276) XOR DI(70) XOR DI(227) XOR DI(138) XOR DI(88) XOR DI(270) XOR DI(400) XOR DI(239) XOR DI(54) XOR DI(488) XOR DI(225) XOR DI(288) XOR DI(82) XOR DI(385) XOR DI(80) XOR DI(290) XOR DI(126) XOR DI(130) XOR DI(34) XOR DI(431) XOR DI(145) XOR DI(99) XOR DI(419) XOR DI(492) XOR DI(504) XOR DI(68) XOR DI(349) XOR DI(69) XOR DI(278) XOR DI(336) XOR DI(277) XOR DI(407) XOR DI(246) XOR DI(43) XOR DI(185) XOR DI(86) XOR DI(114) XOR DI(394) XOR DI(12) XOR DI(458) XOR DI(378) XOR DI(369) XOR DI(228) XOR DI(96) XOR DI(208) XOR DI(368) XOR DI(89) XOR DI(304) XOR DI(193) XOR DI(409) XOR DI(148) XOR DI(98) XOR DI(423) XOR DI(335) XOR DI(496) XOR DI(271) XOR DI(313) XOR DI(55) XOR DI(388) XOR DI(452) XOR DI(404) XOR DI(262) XOR DI(289) XOR DI(202) XOR DI(298) XOR DI(474) XOR DI(371) XOR DI(142) XOR DI(418) XOR DI(13) XOR DI(291) XOR DI(356) XOR DI(127) XOR DI(35) XOR DI(389) XOR DI(432) XOR DI(10) XOR DI(4) XOR DI(420) XOR DI(166) XOR DI(5) XOR DI(505) XOR DI(485) XOR DI(233) XOR DI(72) XOR DI(391) XOR DI(353) XOR DI(73) XOR DI(319) XOR DI(480) XOR DI(282) XOR DI(57) XOR DI(425) XOR DI(410) XOR DI(174) XOR DI(358) XOR DI(60) XOR DI(281) XOR DI(323) XOR DI(461) XOR DI(219) XOR DI(97) XOR DI(326) XOR DI(316) XOR DI(37) XOR DI(441) XOR DI(123) XOR DI(65) XOR DI(189) XOR DI(222) XOR DI(465) XOR DI(327) XOR DI(171) XOR DI(398) XOR DI(483) XOR DI(16) XOR DI(412) XOR DI(462) XOR DI(426) XOR DI(160) XOR DI(245) XOR DI(382) XOR DI(272) XOR DI(241) XOR DI(210) XOR DI(307) XOR DI(7) XOR DI(190) XOR DI(373) XOR DI(223) XOR DI(365) XOR DI(374) XOR DI(212) XOR DI(93) XOR DI(172) XOR DI(221) XOR DI(128) XOR DI(381) XOR DI(152) XOR DI(76) XOR DI(102) XOR DI(297) XOR DI(30) XOR DI(427) XOR DI(101) XOR DI(339) XOR DI(415) XOR DI(167) XOR DI(479) XOR DI(51) XOR DI(168) XOR DI(405) XOR DI(213) XOR DI(310) XOR DI(117) XOR DI(477) XOR DI(406) XOR DI(279) XOR DI(23) XOR DI(266) XOR DI(235) XOR DI(204) XOR DI(217) XOR DI(293) XOR DI(206) XOR DI(113) XOR DI(366) XOR DI(390) XOR DI(302) XOR DI(26) XOR DI(122) XOR DI(375) XOR DI(146) XOR DI(95) XOR DI(422) XOR DI(161) XOR DI(162) XOR DI(399) XOR DI(207) XOR DI(85) XOR DI(211) XOR DI(131) XOR DI(20) XOR DI(472) XOR DI(209) XOR DI(116) XOR DI(140) XOR DI(156) XOR DI(393) XOR DI(443) XOR DI(105) XOR DI(300) XOR DI(354) XOR DI(14) XOR DI(188) XOR DI(8) XOR DI(104) XOR DI(27) XOR DI(182) XOR DI(342) XOR DI(2) XOR DI(15) XOR DI(3) XOR DI(497) XOR DI(509); + DO(14) <= DI(260) XOR DI(325) XOR DI(326) XOR DI(491) XOR DI(264) XOR DI(329) XOR DI(51) XOR DI(79) XOR DI(287) XOR DI(464) XOR DI(180) XOR DI(265) XOR DI(365) XOR DI(331) XOR DI(121) XOR DI(174) XOR DI(78) XOR DI(435) XOR DI(181) XOR DI(1) XOR DI(502) XOR DI(353) XOR DI(321) XOR DI(155) XOR DI(104) XOR DI(398) XOR DI(95) XOR DI(454) XOR DI(488) XOR DI(261) XOR DI(288) XOR DI(310) XOR DI(126) XOR DI(250) XOR DI(53) XOR DI(170) XOR DI(277) XOR DI(71) XOR DI(228) XOR DI(139) XOR DI(89) XOR DI(271) XOR DI(401) XOR DI(240) XOR DI(55) XOR DI(489) XOR DI(226) XOR DI(289) XOR DI(83) XOR DI(386) XOR DI(81) XOR DI(291) XOR DI(127) XOR DI(131) XOR DI(35) XOR DI(432) XOR DI(146) XOR DI(100) XOR DI(420) XOR DI(493) XOR DI(505) XOR DI(69) XOR DI(350) XOR DI(70) XOR DI(279) XOR DI(337) XOR DI(278) XOR DI(408) XOR DI(247) XOR DI(44) XOR DI(186) XOR DI(87) XOR DI(115) XOR DI(395) XOR DI(13) XOR DI(459) XOR DI(379) XOR DI(370) XOR DI(229) XOR DI(97) XOR DI(209) XOR DI(369) XOR DI(90) XOR DI(305) XOR DI(194) XOR DI(410) XOR DI(149) XOR DI(99) XOR DI(424) XOR DI(336) XOR DI(497) XOR DI(272) XOR DI(314) XOR DI(56) XOR DI(389) XOR DI(453) XOR DI(405) XOR DI(263) XOR DI(290) XOR DI(203) XOR DI(299) XOR DI(475) XOR DI(372) XOR DI(143) XOR DI(419) XOR DI(14) XOR DI(292) XOR DI(357) XOR DI(128) XOR DI(36) XOR DI(390) XOR DI(433) XOR DI(11) XOR DI(5) XOR DI(421) XOR DI(167) XOR DI(6) XOR DI(506) XOR DI(486) XOR DI(234) XOR DI(73) XOR DI(392) XOR DI(354) XOR DI(74) XOR DI(320) XOR DI(481) XOR DI(283) XOR DI(58) XOR DI(426) XOR DI(411) XOR DI(175) XOR DI(359) XOR DI(61) XOR DI(282) XOR DI(324) XOR DI(462) XOR DI(220) XOR DI(98) XOR DI(327) XOR DI(317) XOR DI(38) XOR DI(442) XOR DI(124) XOR DI(66) XOR DI(190) XOR DI(223) XOR DI(466) XOR DI(328) XOR DI(172) XOR DI(399) XOR DI(484) XOR DI(17) XOR DI(413) XOR DI(463) XOR DI(427) XOR DI(161) XOR DI(246) XOR DI(383) XOR DI(273) XOR DI(242) XOR DI(211) XOR DI(308) XOR DI(8) XOR DI(191) XOR DI(374) XOR DI(224) XOR DI(366) XOR DI(375) XOR DI(213) XOR DI(94) XOR DI(173) XOR DI(222) XOR DI(129) XOR DI(382) XOR DI(153) XOR DI(77) XOR DI(103) XOR DI(298) XOR DI(31) XOR DI(428) XOR DI(102) XOR DI(340) XOR DI(416) XOR DI(168) XOR DI(480) XOR DI(52) XOR DI(169) XOR DI(406) XOR DI(214) XOR DI(311) XOR DI(118) XOR DI(478) XOR DI(407) XOR DI(280) XOR DI(24) XOR DI(267) XOR DI(236) XOR DI(205) XOR DI(218) XOR DI(294) XOR DI(207) XOR DI(114) XOR DI(367) XOR DI(391) XOR DI(303) XOR DI(27) XOR DI(123) XOR DI(376) XOR DI(147) XOR DI(96) XOR DI(423) XOR DI(162) XOR DI(163) XOR DI(400) XOR DI(208) XOR DI(86) XOR DI(212) XOR DI(132) XOR DI(21) XOR DI(473) XOR DI(210) XOR DI(117) XOR DI(141) XOR DI(157) XOR DI(394) XOR DI(444) XOR DI(106) XOR DI(301) XOR DI(355) XOR DI(15) XOR DI(189) XOR DI(9) XOR DI(105) XOR DI(28) XOR DI(183) XOR DI(343) XOR DI(3) XOR DI(16) XOR DI(4) XOR DI(498) XOR DI(510); + DO(15) <= DI(261) XOR DI(326) XOR DI(327) XOR DI(492) XOR DI(265) XOR DI(330) XOR DI(52) XOR DI(80) XOR DI(288) XOR DI(465) XOR DI(181) XOR DI(266) XOR DI(366) XOR DI(332) XOR DI(122) XOR DI(175) XOR DI(79) XOR DI(436) XOR DI(182) XOR DI(2) XOR DI(503) XOR DI(354) XOR DI(322) XOR DI(156) XOR DI(105) XOR DI(399) XOR DI(96) XOR DI(455) XOR DI(489) XOR DI(262) XOR DI(289) XOR DI(311) XOR DI(127) XOR DI(251) XOR DI(54) XOR DI(171) XOR DI(278) XOR DI(72) XOR DI(229) XOR DI(140) XOR DI(90) XOR DI(272) XOR DI(402) XOR DI(241) XOR DI(56) XOR DI(490) XOR DI(227) XOR DI(290) XOR DI(84) XOR DI(387) XOR DI(82) XOR DI(292) XOR DI(128) XOR DI(132) XOR DI(36) XOR DI(433) XOR DI(147) XOR DI(101) XOR DI(421) XOR DI(494) XOR DI(506) XOR DI(70) XOR DI(351) XOR DI(71) XOR DI(280) XOR DI(338) XOR DI(279) XOR DI(409) XOR DI(248) XOR DI(45) XOR DI(187) XOR DI(88) XOR DI(116) XOR DI(396) XOR DI(14) XOR DI(460) XOR DI(380) XOR DI(371) XOR DI(230) XOR DI(98) XOR DI(210) XOR DI(370) XOR DI(91) XOR DI(306) XOR DI(195) XOR DI(411) XOR DI(150) XOR DI(100) XOR DI(425) XOR DI(337) XOR DI(498) XOR DI(273) XOR DI(315) XOR DI(57) XOR DI(390) XOR DI(454) XOR DI(406) XOR DI(264) XOR DI(291) XOR DI(204) XOR DI(300) XOR DI(476) XOR DI(373) XOR DI(144) XOR DI(420) XOR DI(15) XOR DI(293) XOR DI(358) XOR DI(129) XOR DI(37) XOR DI(391) XOR DI(434) XOR DI(12) XOR DI(6) XOR DI(422) XOR DI(168) XOR DI(7) XOR DI(507) XOR DI(487) XOR DI(235) XOR DI(74) XOR DI(393) XOR DI(355) XOR DI(75) XOR DI(321) XOR DI(482) XOR DI(284) XOR DI(59) XOR DI(427) XOR DI(412) XOR DI(176) XOR DI(360) XOR DI(62) XOR DI(283) XOR DI(325) XOR DI(463) XOR DI(221) XOR DI(99) XOR DI(328) XOR DI(318) XOR DI(39) XOR DI(443) XOR DI(125) XOR DI(67) XOR DI(191) XOR DI(224) XOR DI(467) XOR DI(329) XOR DI(173) XOR DI(400) XOR DI(485) XOR DI(18) XOR DI(414) XOR DI(464) XOR DI(428) XOR DI(162) XOR DI(247) XOR DI(384) XOR DI(274) XOR DI(243) XOR DI(212) XOR DI(309) XOR DI(9) XOR DI(192) XOR DI(375) XOR DI(225) XOR DI(367) XOR DI(376) XOR DI(214) XOR DI(95) XOR DI(174) XOR DI(223) XOR DI(130) XOR DI(383) XOR DI(154) XOR DI(78) XOR DI(104) XOR DI(299) XOR DI(32) XOR DI(429) XOR DI(103) XOR DI(341) XOR DI(417) XOR DI(169) XOR DI(481) XOR DI(53) XOR DI(170) XOR DI(407) XOR DI(215) XOR DI(312) XOR DI(119) XOR DI(479) XOR DI(408) XOR DI(281) XOR DI(25) XOR DI(268) XOR DI(237) XOR DI(206) XOR DI(219) XOR DI(295) XOR DI(208) XOR DI(115) XOR DI(368) XOR DI(392) XOR DI(304) XOR DI(28) XOR DI(124) XOR DI(377) XOR DI(148) XOR DI(97) XOR DI(424) XOR DI(163) XOR DI(164) XOR DI(401) XOR DI(209) XOR DI(87) XOR DI(213) XOR DI(133) XOR DI(22) XOR DI(474) XOR DI(211) XOR DI(118) XOR DI(142) XOR DI(158) XOR DI(395) XOR DI(445) XOR DI(107) XOR DI(302) XOR DI(356) XOR DI(16) XOR DI(190) XOR DI(10) XOR DI(106) XOR DI(29) XOR DI(184) XOR DI(344) XOR DI(4) XOR DI(17) XOR DI(5) XOR DI(499) XOR DI(511); + DO(16) <= DI(262) XOR DI(327) XOR DI(124) XOR DI(328) XOR DI(257) XOR DI(78) XOR DI(286) XOR DI(51) XOR DI(493) XOR DI(266) XOR DI(399) XOR DI(331) XOR DI(53) XOR DI(487) XOR DI(200) XOR DI(81) XOR DI(416) XOR DI(289) XOR DI(354) XOR DI(466) XOR DI(503) XOR DI(386) XOR DI(182) XOR DI(267) XOR DI(302) XOR DI(367) XOR DI(333) XOR DI(123) XOR DI(176) XOR DI(288) XOR DI(417) XOR DI(80) XOR DI(437) XOR DI(467) XOR DI(431) XOR DI(183) XOR DI(343) XOR DI(3) XOR DI(504) XOR DI(355) XOR DI(323) XOR DI(451) XOR DI(62) XOR DI(184) XOR DI(157) XOR DI(106) XOR DI(4) XOR DI(400) XOR DI(97) XOR DI(194) XOR DI(48) XOR DI(178) XOR DI(456) XOR DI(490) XOR DI(263) XOR DI(290) XOR DI(387) XOR DI(312) XOR DI(128) XOR DI(113) XOR DI(153) XOR DI(433) XOR DI(506) XOR DI(252) XOR DI(351) XOR DI(55) XOR DI(462) XOR DI(42) XOR DI(172) XOR DI(279) XOR DI(321) XOR DI(459) XOR DI(217) XOR DI(324) XOR DI(452) XOR DI(449) XOR DI(35) XOR DI(439) XOR DI(481) XOR DI(73) XOR DI(197) XOR DI(230) XOR DI(363) XOR DI(141) XOR DI(91) XOR DI(255) XOR DI(195) XOR DI(273) XOR DI(403) XOR DI(242) XOR DI(57) XOR DI(179) XOR DI(457) XOR DI(21) XOR DI(406) XOR DI(491) XOR DI(264) XOR DI(233) XOR DI(202) XOR DI(228) XOR DI(291) XOR DI(85) XOR DI(388) XOR DI(24) XOR DI(375) XOR DI(144) XOR DI(93) XOR DI(83) XOR DI(293) XOR DI(304) XOR DI(129) XOR DI(114) XOR DI(138) XOR DI(133) XOR DI(37) XOR DI(154) XOR DI(434) XOR DI(12) XOR DI(148) XOR DI(102) XOR DI(422) XOR DI(340) XOR DI(168) XOR DI(495) XOR DI(507) XOR DI(484) XOR DI(71) XOR DI(253) XOR DI(260) XOR DI(352) XOR DI(72) XOR DI(318) XOR DI(281) XOR DI(339) XOR DI(173) XOR DI(280) XOR DI(410) XOR DI(249) XOR DI(218) XOR DI(46) XOR DI(239) XOR DI(315) XOR DI(36) XOR DI(440) XOR DI(122) XOR DI(64) XOR DI(188) XOR DI(89) XOR DI(117) XOR DI(397) XOR DI(15) XOR DI(411) XOR DI(461) XOR DI(251) XOR DI(381) XOR DI(47) XOR DI(150) XOR DI(235) XOR DI(372) XOR DI(231) XOR DI(99) XOR DI(298) XOR DI(211) XOR DI(371) XOR DI(92) XOR DI(395) XOR DI(307) XOR DI(445) XOR DI(31) XOR DI(196) XOR DI(380) XOR DI(412) XOR DI(151) XOR DI(101) XOR DI(350) XOR DI(146) XOR DI(426) XOR DI(427) XOR DI(338) XOR DI(414) XOR DI(499) XOR DI(478) XOR DI(247) XOR DI(346) XOR DI(50) XOR DI(167) XOR DI(274) XOR DI(316) XOR DI(454) XOR DI(243) XOR DI(90) XOR DI(447) XOR DI(309) XOR DI(58) XOR DI(458) XOR DI(320) XOR DI(391) XOR DI(278) XOR DI(455) XOR DI(22) XOR DI(407) XOR DI(265) XOR DI(203) XOR DI(311) XOR DI(0) XOR DI(229) XOR DI(292) XOR DI(205) XOR DI(112) XOR DI(136) XOR DI(389) XOR DI(301) XOR DI(477) XOR DI(190) XOR DI(121) XOR DI(374) XOR DI(145) XOR DI(140) XOR DI(94) XOR DI(421) XOR DI(44) XOR DI(398) XOR DI(314) XOR DI(16) XOR DI(294) XOR DI(359) XOR DI(130) XOR DI(38) XOR DI(392) XOR DI(435) XOR DI(13) XOR DI(32) XOR DI(7) XOR DI(103) XOR DI(423) XOR DI(341) XOR DI(1) XOR DI(20) XOR DI(169) XOR DI(8) XOR DI(2) XOR DI(496) XOR DI(502) XOR DI(508); + DO(17) <= DI(263) XOR DI(328) XOR DI(125) XOR DI(329) XOR DI(258) XOR DI(79) XOR DI(287) XOR DI(52) XOR DI(494) XOR DI(267) XOR DI(400) XOR DI(332) XOR DI(54) XOR DI(488) XOR DI(201) XOR DI(82) XOR DI(417) XOR DI(290) XOR DI(355) XOR DI(467) XOR DI(504) XOR DI(387) XOR DI(183) XOR DI(268) XOR DI(303) XOR DI(368) XOR DI(334) XOR DI(124) XOR DI(177) XOR DI(289) XOR DI(418) XOR DI(81) XOR DI(438) XOR DI(468) XOR DI(432) XOR DI(184) XOR DI(344) XOR DI(4) XOR DI(505) XOR DI(356) XOR DI(324) XOR DI(452) XOR DI(63) XOR DI(185) XOR DI(158) XOR DI(107) XOR DI(5) XOR DI(401) XOR DI(98) XOR DI(195) XOR DI(49) XOR DI(179) XOR DI(457) XOR DI(491) XOR DI(264) XOR DI(291) XOR DI(388) XOR DI(313) XOR DI(129) XOR DI(114) XOR DI(154) XOR DI(434) XOR DI(507) XOR DI(253) XOR DI(352) XOR DI(56) XOR DI(463) XOR DI(43) XOR DI(173) XOR DI(280) XOR DI(322) XOR DI(460) XOR DI(218) XOR DI(325) XOR DI(453) XOR DI(450) XOR DI(36) XOR DI(440) XOR DI(482) XOR DI(74) XOR DI(198) XOR DI(231) XOR DI(364) XOR DI(142) XOR DI(92) XOR DI(256) XOR DI(196) XOR DI(274) XOR DI(404) XOR DI(243) XOR DI(58) XOR DI(180) XOR DI(458) XOR DI(22) XOR DI(407) XOR DI(492) XOR DI(265) XOR DI(234) XOR DI(203) XOR DI(229) XOR DI(292) XOR DI(86) XOR DI(389) XOR DI(25) XOR DI(376) XOR DI(145) XOR DI(94) XOR DI(84) XOR DI(294) XOR DI(305) XOR DI(130) XOR DI(115) XOR DI(139) XOR DI(134) XOR DI(38) XOR DI(155) XOR DI(435) XOR DI(13) XOR DI(149) XOR DI(103) XOR DI(423) XOR DI(341) XOR DI(169) XOR DI(496) XOR DI(508) XOR DI(485) XOR DI(72) XOR DI(254) XOR DI(261) XOR DI(353) XOR DI(73) XOR DI(319) XOR DI(282) XOR DI(340) XOR DI(174) XOR DI(281) XOR DI(411) XOR DI(250) XOR DI(219) XOR DI(47) XOR DI(240) XOR DI(316) XOR DI(37) XOR DI(441) XOR DI(123) XOR DI(65) XOR DI(189) XOR DI(90) XOR DI(118) XOR DI(398) XOR DI(16) XOR DI(412) XOR DI(462) XOR DI(252) XOR DI(382) XOR DI(48) XOR DI(151) XOR DI(236) XOR DI(373) XOR DI(232) XOR DI(100) XOR DI(299) XOR DI(212) XOR DI(372) XOR DI(93) XOR DI(396) XOR DI(308) XOR DI(446) XOR DI(32) XOR DI(197) XOR DI(381) XOR DI(413) XOR DI(152) XOR DI(102) XOR DI(351) XOR DI(147) XOR DI(427) XOR DI(428) XOR DI(339) XOR DI(415) XOR DI(500) XOR DI(479) XOR DI(248) XOR DI(347) XOR DI(51) XOR DI(168) XOR DI(275) XOR DI(317) XOR DI(455) XOR DI(244) XOR DI(91) XOR DI(448) XOR DI(310) XOR DI(59) XOR DI(459) XOR DI(321) XOR DI(392) XOR DI(279) XOR DI(456) XOR DI(23) XOR DI(408) XOR DI(266) XOR DI(204) XOR DI(312) XOR DI(1) XOR DI(230) XOR DI(293) XOR DI(206) XOR DI(113) XOR DI(137) XOR DI(390) XOR DI(302) XOR DI(478) XOR DI(191) XOR DI(122) XOR DI(375) XOR DI(146) XOR DI(141) XOR DI(95) XOR DI(422) XOR DI(45) XOR DI(399) XOR DI(315) XOR DI(17) XOR DI(295) XOR DI(360) XOR DI(131) XOR DI(39) XOR DI(393) XOR DI(436) XOR DI(14) XOR DI(33) XOR DI(8) XOR DI(104) XOR DI(424) XOR DI(342) XOR DI(2) XOR DI(21) XOR DI(170) XOR DI(9) XOR DI(3) XOR DI(497) XOR DI(503) XOR DI(509); + DO(18) <= DI(264) XOR DI(329) XOR DI(126) XOR DI(330) XOR DI(259) XOR DI(80) XOR DI(288) XOR DI(53) XOR DI(495) XOR DI(268) XOR DI(401) XOR DI(333) XOR DI(55) XOR DI(489) XOR DI(202) XOR DI(83) XOR DI(418) XOR DI(291) XOR DI(356) XOR DI(468) XOR DI(505) XOR DI(388) XOR DI(184) XOR DI(269) XOR DI(304) XOR DI(369) XOR DI(335) XOR DI(125) XOR DI(178) XOR DI(290) XOR DI(419) XOR DI(82) XOR DI(439) XOR DI(469) XOR DI(433) XOR DI(185) XOR DI(345) XOR DI(5) XOR DI(506) XOR DI(357) XOR DI(325) XOR DI(453) XOR DI(64) XOR DI(186) XOR DI(159) XOR DI(108) XOR DI(6) XOR DI(402) XOR DI(99) XOR DI(196) XOR DI(50) XOR DI(180) XOR DI(458) XOR DI(492) XOR DI(265) XOR DI(292) XOR DI(389) XOR DI(314) XOR DI(130) XOR DI(115) XOR DI(155) XOR DI(435) XOR DI(508) XOR DI(254) XOR DI(353) XOR DI(57) XOR DI(464) XOR DI(44) XOR DI(174) XOR DI(281) XOR DI(323) XOR DI(461) XOR DI(219) XOR DI(326) XOR DI(454) XOR DI(451) XOR DI(37) XOR DI(441) XOR DI(483) XOR DI(75) XOR DI(199) XOR DI(232) XOR DI(365) XOR DI(143) XOR DI(93) XOR DI(257) XOR DI(197) XOR DI(275) XOR DI(405) XOR DI(244) XOR DI(59) XOR DI(181) XOR DI(459) XOR DI(23) XOR DI(408) XOR DI(493) XOR DI(266) XOR DI(235) XOR DI(204) XOR DI(230) XOR DI(293) XOR DI(87) XOR DI(390) XOR DI(26) XOR DI(377) XOR DI(146) XOR DI(95) XOR DI(85) XOR DI(295) XOR DI(306) XOR DI(131) XOR DI(116) XOR DI(140) XOR DI(135) XOR DI(39) XOR DI(156) XOR DI(436) XOR DI(14) XOR DI(150) XOR DI(104) XOR DI(424) XOR DI(342) XOR DI(170) XOR DI(497) XOR DI(509) XOR DI(486) XOR DI(73) XOR DI(255) XOR DI(262) XOR DI(354) XOR DI(74) XOR DI(320) XOR DI(283) XOR DI(341) XOR DI(175) XOR DI(282) XOR DI(412) XOR DI(251) XOR DI(220) XOR DI(48) XOR DI(241) XOR DI(317) XOR DI(38) XOR DI(442) XOR DI(124) XOR DI(66) XOR DI(190) XOR DI(91) XOR DI(119) XOR DI(399) XOR DI(17) XOR DI(413) XOR DI(463) XOR DI(253) XOR DI(383) XOR DI(49) XOR DI(152) XOR DI(237) XOR DI(374) XOR DI(233) XOR DI(101) XOR DI(300) XOR DI(213) XOR DI(373) XOR DI(94) XOR DI(397) XOR DI(309) XOR DI(447) XOR DI(33) XOR DI(198) XOR DI(382) XOR DI(414) XOR DI(153) XOR DI(103) XOR DI(352) XOR DI(148) XOR DI(428) XOR DI(429) XOR DI(340) XOR DI(0) XOR DI(416) XOR DI(501) XOR DI(480) XOR DI(249) XOR DI(348) XOR DI(52) XOR DI(169) XOR DI(276) XOR DI(318) XOR DI(456) XOR DI(245) XOR DI(92) XOR DI(449) XOR DI(311) XOR DI(60) XOR DI(460) XOR DI(322) XOR DI(393) XOR DI(280) XOR DI(457) XOR DI(24) XOR DI(409) XOR DI(267) XOR DI(205) XOR DI(313) XOR DI(2) XOR DI(231) XOR DI(294) XOR DI(207) XOR DI(114) XOR DI(138) XOR DI(391) XOR DI(303) XOR DI(479) XOR DI(192) XOR DI(123) XOR DI(376) XOR DI(147) XOR DI(142) XOR DI(96) XOR DI(423) XOR DI(46) XOR DI(400) XOR DI(316) XOR DI(18) XOR DI(296) XOR DI(361) XOR DI(132) XOR DI(40) XOR DI(394) XOR DI(437) XOR DI(15) XOR DI(34) XOR DI(9) XOR DI(105) XOR DI(425) XOR DI(343) XOR DI(3) XOR DI(22) XOR DI(171) XOR DI(10) XOR DI(4) XOR DI(498) XOR DI(504) XOR DI(510); + DO(19) <= DI(265) XOR DI(330) XOR DI(127) XOR DI(331) XOR DI(260) XOR DI(81) XOR DI(289) XOR DI(54) XOR DI(496) XOR DI(269) XOR DI(402) XOR DI(334) XOR DI(56) XOR DI(490) XOR DI(203) XOR DI(84) XOR DI(419) XOR DI(292) XOR DI(357) XOR DI(469) XOR DI(506) XOR DI(389) XOR DI(185) XOR DI(270) XOR DI(305) XOR DI(370) XOR DI(336) XOR DI(126) XOR DI(179) XOR DI(291) XOR DI(420) XOR DI(83) XOR DI(440) XOR DI(470) XOR DI(434) XOR DI(186) XOR DI(346) XOR DI(6) XOR DI(507) XOR DI(358) XOR DI(326) XOR DI(454) XOR DI(65) XOR DI(187) XOR DI(160) XOR DI(109) XOR DI(7) XOR DI(403) XOR DI(100) XOR DI(197) XOR DI(51) XOR DI(181) XOR DI(459) XOR DI(493) XOR DI(266) XOR DI(293) XOR DI(390) XOR DI(315) XOR DI(131) XOR DI(116) XOR DI(156) XOR DI(436) XOR DI(509) XOR DI(255) XOR DI(354) XOR DI(58) XOR DI(465) XOR DI(45) XOR DI(175) XOR DI(282) XOR DI(324) XOR DI(462) XOR DI(220) XOR DI(327) XOR DI(455) XOR DI(452) XOR DI(38) XOR DI(442) XOR DI(484) XOR DI(76) XOR DI(200) XOR DI(233) XOR DI(366) XOR DI(144) XOR DI(94) XOR DI(258) XOR DI(198) XOR DI(276) XOR DI(406) XOR DI(245) XOR DI(60) XOR DI(182) XOR DI(460) XOR DI(24) XOR DI(409) XOR DI(494) XOR DI(267) XOR DI(236) XOR DI(205) XOR DI(231) XOR DI(294) XOR DI(88) XOR DI(391) XOR DI(27) XOR DI(378) XOR DI(147) XOR DI(96) XOR DI(86) XOR DI(296) XOR DI(307) XOR DI(132) XOR DI(117) XOR DI(141) XOR DI(136) XOR DI(40) XOR DI(157) XOR DI(437) XOR DI(15) XOR DI(151) XOR DI(105) XOR DI(425) XOR DI(343) XOR DI(171) XOR DI(498) XOR DI(510) XOR DI(487) XOR DI(74) XOR DI(256) XOR DI(263) XOR DI(355) XOR DI(75) XOR DI(321) XOR DI(284) XOR DI(342) XOR DI(176) XOR DI(283) XOR DI(413) XOR DI(252) XOR DI(221) XOR DI(49) XOR DI(242) XOR DI(318) XOR DI(39) XOR DI(443) XOR DI(125) XOR DI(67) XOR DI(191) XOR DI(92) XOR DI(120) XOR DI(400) XOR DI(18) XOR DI(414) XOR DI(464) XOR DI(254) XOR DI(384) XOR DI(50) XOR DI(153) XOR DI(238) XOR DI(375) XOR DI(234) XOR DI(102) XOR DI(301) XOR DI(214) XOR DI(374) XOR DI(95) XOR DI(398) XOR DI(310) XOR DI(448) XOR DI(34) XOR DI(199) XOR DI(383) XOR DI(415) XOR DI(154) XOR DI(104) XOR DI(353) XOR DI(149) XOR DI(429) XOR DI(430) XOR DI(341) XOR DI(1) XOR DI(417) XOR DI(502) XOR DI(481) XOR DI(250) XOR DI(349) XOR DI(53) XOR DI(170) XOR DI(277) XOR DI(319) XOR DI(457) XOR DI(246) XOR DI(93) XOR DI(450) XOR DI(312) XOR DI(61) XOR DI(461) XOR DI(323) XOR DI(394) XOR DI(281) XOR DI(458) XOR DI(25) XOR DI(410) XOR DI(268) XOR DI(206) XOR DI(314) XOR DI(3) XOR DI(232) XOR DI(295) XOR DI(208) XOR DI(115) XOR DI(139) XOR DI(392) XOR DI(304) XOR DI(480) XOR DI(193) XOR DI(124) XOR DI(377) XOR DI(148) XOR DI(143) XOR DI(97) XOR DI(424) XOR DI(47) XOR DI(401) XOR DI(317) XOR DI(19) XOR DI(297) XOR DI(362) XOR DI(133) XOR DI(41) XOR DI(395) XOR DI(438) XOR DI(16) XOR DI(35) XOR DI(10) XOR DI(106) XOR DI(426) XOR DI(344) XOR DI(4) XOR DI(23) XOR DI(172) XOR DI(11) XOR DI(5) XOR DI(499) XOR DI(505) XOR DI(511); + DO(20) <= DI(266) XOR DI(79) XOR DI(331) XOR DI(330) XOR DI(128) XOR DI(332) XOR DI(261) XOR DI(288) XOR DI(82) XOR DI(290) XOR DI(369) XOR DI(275) XOR DI(226) XOR DI(468) XOR DI(433) XOR DI(351) XOR DI(55) XOR DI(248) XOR DI(131) XOR DI(185) XOR DI(197) XOR DI(497) XOR DI(270) XOR DI(403) XOR DI(335) XOR DI(57) XOR DI(179) XOR DI(475) XOR DI(491) XOR DI(204) XOR DI(85) XOR DI(420) XOR DI(293) XOR DI(358) XOR DI(470) XOR DI(507) XOR DI(260) XOR DI(390) XOR DI(357) XOR DI(440) XOR DI(64) XOR DI(186) XOR DI(326) XOR DI(159) XOR DI(244) XOR DI(271) XOR DI(306) XOR DI(108) XOR DI(371) XOR DI(337) XOR DI(127) XOR DI(380) XOR DI(146) XOR DI(100) XOR DI(346) XOR DI(454) XOR DI(90) XOR DI(180) XOR DI(203) XOR DI(229) XOR DI(292) XOR DI(389) XOR DI(421) XOR DI(44) XOR DI(84) XOR DI(441) XOR DI(471) XOR DI(435) XOR DI(187) XOR DI(347) XOR DI(7) XOR DI(496) XOR DI(508) XOR DI(175) XOR DI(359) XOR DI(220) XOR DI(327) XOR DI(455) XOR DI(452) XOR DI(66) XOR DI(188) XOR DI(484) XOR DI(286) XOR DI(122) XOR DI(161) XOR DI(110) XOR DI(8) XOR DI(404) XOR DI(101) XOR DI(300) XOR DI(447) XOR DI(33) XOR DI(198) XOR DI(168) XOR DI(52) XOR DI(406) XOR DI(60) XOR DI(182) XOR DI(460) XOR DI(478) XOR DI(409) XOR DI(494) XOR DI(267) XOR DI(236) XOR DI(218) XOR DI(294) XOR DI(114) XOR DI(138) XOR DI(88) XOR DI(391) XOR DI(316) XOR DI(387) XOR DI(361) XOR DI(132) XOR DI(210) XOR DI(117) XOR DI(136) XOR DI(157) XOR DI(437) XOR DI(195) XOR DI(165) XOR DI(510) XOR DI(63) XOR DI(487) XOR DI(256) XOR DI(355) XOR DI(321) XOR DI(59) XOR DI(466) XOR DI(46) XOR DI(176) XOR DI(283) XOR DI(413) XOR DI(325) XOR DI(463) XOR DI(221) XOR DI(328) XOR DI(483) XOR DI(456) XOR DI(453) XOR DI(39) XOR DI(446) XOR DI(443) XOR DI(191) XOR DI(224) XOR DI(120) XOR DI(467) XOR DI(329) XOR DI(485) XOR DI(18) XOR DI(77) XOR DI(464) XOR DI(201) XOR DI(31) XOR DI(428) XOR DI(212) XOR DI(309) XOR DI(30) XOR DI(153) XOR DI(238) XOR DI(234) XOR DI(21) XOR DI(0) XOR DI(225) XOR DI(216) XOR DI(367) XOR DI(214) XOR DI(145) XOR DI(95) XOR DI(340) XOR DI(398) XOR DI(310) XOR DI(174) XOR DI(486) XOR DI(259) XOR DI(199) XOR DI(78) XOR DI(104) XOR DI(32) XOR DI(429) XOR DI(341) XOR DI(1) XOR DI(417) XOR DI(502) XOR DI(170) XOR DI(277) XOR DI(407) XOR DI(457) XOR DI(246) XOR DI(119) XOR DI(61) XOR DI(183) XOR DI(461) XOR DI(167) XOR DI(394) XOR DI(408) XOR DI(25) XOR DI(410) XOR DI(495) XOR DI(268) XOR DI(237) XOR DI(206) XOR DI(303) XOR DI(314) XOR DI(232) XOR DI(295) XOR DI(368) XOR DI(89) XOR DI(392) XOR DI(304) XOR DI(28) XOR DI(379) XOR DI(480) XOR DI(217) XOR DI(193) XOR DI(124) XOR DI(377) XOR DI(148) XOR DI(143) XOR DI(97) XOR DI(163) XOR DI(47) XOR DI(164) XOR DI(87) XOR DI(113) XOR DI(297) XOR DI(308) XOR DI(213) XOR DI(202) XOR DI(133) XOR DI(386) XOR DI(22) XOR DI(118) XOR DI(142) XOR DI(137) XOR DI(41) XOR DI(158) XOR DI(445) XOR DI(438) XOR DI(16) XOR DI(112) XOR DI(152) XOR DI(190) XOR DI(10) XOR DI(106) XOR DI(29) XOR DI(426) XOR DI(184) XOR DI(344) XOR DI(23) XOR DI(178) XOR DI(172) XOR DI(499) XOR DI(511); + DO(21) <= DI(264) XOR DI(267) XOR DI(126) XOR DI(286) XOR DI(80) XOR DI(288) XOR DI(255) XOR DI(332) XOR DI(331) XOR DI(431) XOR DI(68) XOR DI(129) XOR DI(195) XOR DI(361) XOR DI(333) XOR DI(262) XOR DI(289) XOR DI(83) XOR DI(291) XOR DI(54) XOR DI(324) XOR DI(370) XOR DI(452) XOR DI(276) XOR DI(227) XOR DI(363) XOR DI(469) XOR DI(433) XOR DI(434) XOR DI(12) XOR DI(506) XOR DI(253) XOR DI(352) XOR DI(56) XOR DI(357) XOR DI(249) XOR DI(36) XOR DI(440) XOR DI(132) XOR DI(186) XOR DI(198) XOR DI(498) XOR DI(251) XOR DI(271) XOR DI(108) XOR DI(6) XOR DI(402) XOR DI(220) XOR DI(346) XOR DI(404) XOR DI(336) XOR DI(58) XOR DI(180) XOR DI(476) XOR DI(492) XOR DI(229) XOR DI(205) XOR DI(136) XOR DI(86) XOR DI(389) XOR DI(94) XOR DI(421) XOR DI(294) XOR DI(359) XOR DI(471) XOR DI(155) XOR DI(508) XOR DI(261) XOR DI(391) XOR DI(282) XOR DI(44) XOR DI(425) XOR DI(358) XOR DI(343) XOR DI(441) XOR DI(65) XOR DI(187) XOR DI(327) XOR DI(160) XOR DI(245) XOR DI(272) XOR DI(210) XOR DI(307) XOR DI(109) XOR DI(236) XOR DI(100) XOR DI(372) XOR DI(338) XOR DI(396) XOR DI(197) XOR DI(128) XOR DI(381) XOR DI(76) XOR DI(351) XOR DI(147) XOR DI(101) XOR DI(248) XOR DI(347) XOR DI(51) XOR DI(275) XOR DI(455) XOR DI(244) XOR DI(91) XOR DI(475) XOR DI(181) XOR DI(459) XOR DI(406) XOR DI(204) XOR DI(230) XOR DI(293) XOR DI(390) XOR DI(478) XOR DI(122) XOR DI(422) XOR DI(45) XOR DI(449) XOR DI(85) XOR DI(442) XOR DI(131) XOR DI(472) XOR DI(116) XOR DI(140) XOR DI(436) XOR DI(300) XOR DI(354) XOR DI(150) XOR DI(188) XOR DI(348) XOR DI(8) XOR DI(497) XOR DI(509) XOR DI(63) XOR DI(75) XOR DI(321) XOR DI(482) XOR DI(176) XOR DI(360) XOR DI(413) XOR DI(221) XOR DI(328) XOR DI(483) XOR DI(456) XOR DI(453) XOR DI(318) XOR DI(67) XOR DI(224) XOR DI(189) XOR DI(485) XOR DI(285) XOR DI(18) XOR DI(287) XOR DI(123) XOR DI(428) XOR DI(416) XOR DI(162) XOR DI(384) XOR DI(50) XOR DI(243) XOR DI(212) XOR DI(111) XOR DI(320) XOR DI(9) XOR DI(405) XOR DI(375) XOR DI(21) XOR DI(102) XOR DI(0) XOR DI(216) XOR DI(301) XOR DI(376) XOR DI(340) XOR DI(398) XOR DI(448) XOR DI(34) XOR DI(174) XOR DI(385) XOR DI(199) XOR DI(415) XOR DI(104) XOR DI(103) XOR DI(20) XOR DI(417) XOR DI(169) XOR DI(502) XOR DI(53) XOR DI(170) XOR DI(407) XOR DI(319) XOR DI(93) XOR DI(61) XOR DI(183) XOR DI(461) XOR DI(167) XOR DI(394) XOR DI(479) XOR DI(410) XOR DI(495) XOR DI(268) XOR DI(237) XOR DI(303) XOR DI(314) XOR DI(219) XOR DI(295) XOR DI(115) XOR DI(139) XOR DI(89) XOR DI(392) XOR DI(480) XOR DI(193) XOR DI(124) XOR DI(377) XOR DI(163) XOR DI(401) XOR DI(313) XOR DI(451) XOR DI(209) XOR DI(317) XOR DI(388) XOR DI(362) XOR DI(133) XOR DI(386) XOR DI(211) XOR DI(118) XOR DI(137) XOR DI(158) XOR DI(445) XOR DI(438) XOR DI(302) XOR DI(196) XOR DI(112) XOR DI(35) XOR DI(190) XOR DI(350) XOR DI(10) XOR DI(4) XOR DI(178) XOR DI(166) XOR DI(5) XOR DI(511); + DO(22) <= DI(50) XOR DI(265) XOR DI(268) XOR DI(468) XOR DI(330) XOR DI(78) XOR DI(502) XOR DI(127) XOR DI(487) XOR DI(260) XOR DI(287) XOR DI(81) XOR DI(79) XOR DI(289) XOR DI(256) XOR DI(155) XOR DI(368) XOR DI(333) XOR DI(332) XOR DI(488) XOR DI(467) XOR DI(432) XOR DI(69) XOR DI(350) XOR DI(278) XOR DI(458) XOR DI(247) XOR DI(130) XOR DI(196) XOR DI(229) XOR DI(362) XOR DI(369) XOR DI(334) XOR DI(178) XOR DI(263) XOR DI(290) XOR DI(203) XOR DI(84) XOR DI(292) XOR DI(357) XOR DI(433) XOR DI(506) XOR DI(55) XOR DI(356) XOR DI(63) XOR DI(185) XOR DI(325) XOR DI(243) XOR DI(380) XOR DI(239) XOR DI(305) XOR DI(107) XOR DI(401) XOR DI(149) XOR DI(371) XOR DI(126) XOR DI(345) XOR DI(453) XOR DI(277) XOR DI(264) XOR DI(202) XOR DI(228) XOR DI(364) XOR DI(440) XOR DI(470) XOR DI(154) XOR DI(434) XOR DI(12) XOR DI(108) XOR DI(435) XOR DI(346) XOR DI(13) XOR DI(507) XOR DI(254) XOR DI(353) XOR DI(57) XOR DI(464) XOR DI(44) XOR DI(174) XOR DI(358) XOR DI(250) XOR DI(326) XOR DI(47) XOR DI(451) XOR DI(37) XOR DI(441) XOR DI(133) XOR DI(187) XOR DI(398) XOR DI(75) XOR DI(285) XOR DI(121) XOR DI(199) XOR DI(499) XOR DI(252) XOR DI(272) XOR DI(109) XOR DI(7) XOR DI(403) XOR DI(100) XOR DI(143) XOR DI(93) XOR DI(32) XOR DI(257) XOR DI(221) XOR DI(248) XOR DI(347) XOR DI(275) XOR DI(405) XOR DI(475) XOR DI(337) XOR DI(310) XOR DI(59) XOR DI(181) XOR DI(459) XOR DI(477) XOR DI(23) XOR DI(493) XOR DI(235) XOR DI(230) XOR DI(226) XOR DI(206) XOR DI(137) XOR DI(87) XOR DI(390) XOR DI(26) XOR DI(146) XOR DI(95) XOR DI(422) XOR DI(295) XOR DI(360) XOR DI(131) XOR DI(472) XOR DI(209) XOR DI(156) XOR DI(150) XOR DI(430) XOR DI(342) XOR DI(509) XOR DI(255) XOR DI(262) XOR DI(392) XOR DI(354) XOR DI(193) XOR DI(283) XOR DI(465) XOR DI(45) XOR DI(426) XOR DI(359) XOR DI(282) XOR DI(324) XOR DI(251) XOR DI(98) XOR DI(482) XOR DI(344) XOR DI(48) XOR DI(445) XOR DI(442) XOR DI(66) XOR DI(188) XOR DI(396) XOR DI(328) XOR DI(284) XOR DI(17) XOR DI(413) XOR DI(122) XOR DI(30) XOR DI(427) XOR DI(415) XOR DI(161) XOR DI(500) XOR DI(246) XOR DI(253) XOR DI(273) XOR DI(211) XOR DI(308) XOR DI(29) XOR DI(110) XOR DI(237) XOR DI(233) XOR DI(20) XOR DI(101) XOR DI(224) XOR DI(215) XOR DI(300) XOR DI(375) XOR DI(120) XOR DI(373) XOR DI(144) XOR DI(339) XOR DI(397) XOR DI(309) XOR DI(447) XOR DI(33) XOR DI(173) XOR DI(384) XOR DI(198) XOR DI(129) XOR DI(382) XOR DI(153) XOR DI(77) XOR DI(298) XOR DI(352) XOR DI(31) XOR DI(148) XOR DI(428) XOR DI(102) XOR DI(340) XOR DI(249) XOR DI(348) XOR DI(52) XOR DI(276) XOR DI(456) XOR DI(245) XOR DI(214) XOR DI(92) XOR DI(476) XOR DI(42) XOR DI(311) XOR DI(60) XOR DI(182) XOR DI(460) XOR DI(478) XOR DI(407) XOR DI(24) XOR DI(409) XOR DI(236) XOR DI(205) XOR DI(313) XOR DI(2) XOR DI(231) XOR DI(218) XOR DI(294) XOR DI(207) XOR DI(114) XOR DI(88) XOR DI(391) XOR DI(479) XOR DI(216) XOR DI(192) XOR DI(123) XOR DI(96) XOR DI(423) XOR DI(46) XOR DI(450) XOR DI(86) XOR DI(443) XOR DI(18) XOR DI(132) XOR DI(473) XOR DI(117) XOR DI(141) XOR DI(136) XOR DI(40) XOR DI(394) XOR DI(444) XOR DI(437) XOR DI(301) XOR DI(195) XOR DI(355) XOR DI(151) XOR DI(431) XOR DI(189) XOR DI(349) XOR DI(9) XOR DI(425) XOR DI(343) XOR DI(165) XOR DI(4) XOR DI(498) XOR DI(510); + DO(23) <= DI(51) XOR DI(266) XOR DI(269) XOR DI(469) XOR DI(331) XOR DI(79) XOR DI(503) XOR DI(128) XOR DI(488) XOR DI(261) XOR DI(288) XOR DI(82) XOR DI(80) XOR DI(290) XOR DI(257) XOR DI(156) XOR DI(369) XOR DI(334) XOR DI(333) XOR DI(489) XOR DI(468) XOR DI(433) XOR DI(70) XOR DI(351) XOR DI(279) XOR DI(459) XOR DI(248) XOR DI(131) XOR DI(197) XOR DI(230) XOR DI(363) XOR DI(370) XOR DI(335) XOR DI(179) XOR DI(264) XOR DI(291) XOR DI(204) XOR DI(85) XOR DI(293) XOR DI(358) XOR DI(434) XOR DI(507) XOR DI(56) XOR DI(357) XOR DI(64) XOR DI(186) XOR DI(326) XOR DI(244) XOR DI(381) XOR DI(240) XOR DI(306) XOR DI(108) XOR DI(402) XOR DI(150) XOR DI(372) XOR DI(127) XOR DI(346) XOR DI(454) XOR DI(278) XOR DI(265) XOR DI(203) XOR DI(229) XOR DI(365) XOR DI(441) XOR DI(471) XOR DI(155) XOR DI(435) XOR DI(13) XOR DI(109) XOR DI(436) XOR DI(347) XOR DI(14) XOR DI(508) XOR DI(255) XOR DI(354) XOR DI(58) XOR DI(465) XOR DI(45) XOR DI(175) XOR DI(359) XOR DI(251) XOR DI(327) XOR DI(48) XOR DI(452) XOR DI(38) XOR DI(442) XOR DI(134) XOR DI(188) XOR DI(399) XOR DI(76) XOR DI(286) XOR DI(122) XOR DI(200) XOR DI(500) XOR DI(253) XOR DI(273) XOR DI(110) XOR DI(8) XOR DI(404) XOR DI(101) XOR DI(144) XOR DI(94) XOR DI(33) XOR DI(258) XOR DI(222) XOR DI(249) XOR DI(348) XOR DI(276) XOR DI(406) XOR DI(476) XOR DI(338) XOR DI(311) XOR DI(60) XOR DI(182) XOR DI(460) XOR DI(478) XOR DI(24) XOR DI(494) XOR DI(236) XOR DI(231) XOR DI(227) XOR DI(207) XOR DI(138) XOR DI(88) XOR DI(391) XOR DI(27) XOR DI(147) XOR DI(96) XOR DI(423) XOR DI(296) XOR DI(361) XOR DI(132) XOR DI(473) XOR DI(210) XOR DI(157) XOR DI(151) XOR DI(431) XOR DI(343) XOR DI(510) XOR DI(256) XOR DI(263) XOR DI(393) XOR DI(355) XOR DI(194) XOR DI(284) XOR DI(466) XOR DI(46) XOR DI(427) XOR DI(360) XOR DI(283) XOR DI(325) XOR DI(252) XOR DI(99) XOR DI(483) XOR DI(345) XOR DI(49) XOR DI(446) XOR DI(443) XOR DI(67) XOR DI(189) XOR DI(397) XOR DI(329) XOR DI(285) XOR DI(18) XOR DI(414) XOR DI(123) XOR DI(31) XOR DI(428) XOR DI(416) XOR DI(162) XOR DI(501) XOR DI(247) XOR DI(254) XOR DI(274) XOR DI(212) XOR DI(309) XOR DI(30) XOR DI(111) XOR DI(238) XOR DI(234) XOR DI(21) XOR DI(102) XOR DI(225) XOR DI(216) XOR DI(301) XOR DI(376) XOR DI(121) XOR DI(374) XOR DI(145) XOR DI(340) XOR DI(398) XOR DI(310) XOR DI(448) XOR DI(34) XOR DI(174) XOR DI(385) XOR DI(199) XOR DI(130) XOR DI(383) XOR DI(154) XOR DI(78) XOR DI(299) XOR DI(353) XOR DI(32) XOR DI(149) XOR DI(429) XOR DI(103) XOR DI(341) XOR DI(250) XOR DI(349) XOR DI(53) XOR DI(277) XOR DI(457) XOR DI(246) XOR DI(215) XOR DI(93) XOR DI(477) XOR DI(43) XOR DI(312) XOR DI(61) XOR DI(183) XOR DI(461) XOR DI(479) XOR DI(408) XOR DI(25) XOR DI(410) XOR DI(237) XOR DI(206) XOR DI(314) XOR DI(3) XOR DI(232) XOR DI(219) XOR DI(295) XOR DI(208) XOR DI(115) XOR DI(89) XOR DI(392) XOR DI(480) XOR DI(217) XOR DI(193) XOR DI(124) XOR DI(97) XOR DI(424) XOR DI(47) XOR DI(451) XOR DI(87) XOR DI(444) XOR DI(19) XOR DI(133) XOR DI(474) XOR DI(118) XOR DI(142) XOR DI(137) XOR DI(41) XOR DI(395) XOR DI(445) XOR DI(438) XOR DI(302) XOR DI(196) XOR DI(356) XOR DI(152) XOR DI(432) XOR DI(190) XOR DI(350) XOR DI(10) XOR DI(426) XOR DI(344) XOR DI(166) XOR DI(5) XOR DI(499) XOR DI(511); + DO(24) <= DI(52) XOR DI(267) XOR DI(270) XOR DI(470) XOR DI(332) XOR DI(488) XOR DI(288) XOR DI(80) XOR DI(126) XOR DI(431) XOR DI(504) XOR DI(129) XOR DI(489) XOR DI(262) XOR DI(289) XOR DI(83) XOR DI(418) XOR DI(81) XOR DI(291) XOR DI(468) XOR DI(258) XOR DI(324) XOR DI(157) XOR DI(269) XOR DI(370) XOR DI(369) XOR DI(335) XOR DI(378) XOR DI(144) XOR DI(334) XOR DI(114) XOR DI(490) XOR DI(363) XOR DI(387) XOR DI(469) XOR DI(434) XOR DI(185) XOR DI(24) XOR DI(179) XOR DI(12) XOR DI(506) XOR DI(71) XOR DI(260) XOR DI(352) XOR DI(280) XOR DI(322) XOR DI(460) XOR DI(249) XOR DI(96) XOR DI(36) XOR DI(440) XOR DI(64) XOR DI(132) XOR DI(198) XOR DI(159) XOR DI(108) XOR DI(402) XOR DI(231) XOR DI(364) XOR DI(298) XOR DI(371) XOR DI(380) XOR DI(336) XOR DI(40) XOR DI(180) XOR DI(265) XOR DI(203) XOR DI(229) XOR DI(292) XOR DI(205) XOR DI(136) XOR DI(86) XOR DI(389) XOR DI(294) XOR DI(305) XOR DI(359) XOR DI(435) XOR DI(496) XOR DI(508) XOR DI(282) XOR DI(57) XOR DI(358) XOR DI(60) XOR DI(343) XOR DI(454) XOR DI(65) XOR DI(222) XOR DI(187) XOR DI(465) XOR DI(327) XOR DI(171) XOR DI(245) XOR DI(382) XOR DI(241) XOR DI(210) XOR DI(307) XOR DI(109) XOR DI(403) XOR DI(151) XOR DI(236) XOR DI(373) XOR DI(128) XOR DI(76) XOR DI(347) XOR DI(51) XOR DI(168) XOR DI(455) XOR DI(244) XOR DI(459) XOR DI(165) XOR DI(406) XOR DI(279) XOR DI(266) XOR DI(204) XOR DI(230) XOR DI(366) XOR DI(442) XOR DI(472) XOR DI(140) XOR DI(156) XOR DI(436) XOR DI(105) XOR DI(14) XOR DI(110) XOR DI(437) XOR DI(348) XOR DI(2) XOR DI(15) XOR DI(503) XOR DI(509) XOR DI(63) XOR DI(487) XOR DI(256) XOR DI(355) XOR DI(75) XOR DI(321) XOR DI(482) XOR DI(59) XOR DI(466) XOR DI(46) XOR DI(176) XOR DI(360) XOR DI(413) XOR DI(252) XOR DI(328) XOR DI(483) XOR DI(49) XOR DI(453) XOR DI(318) XOR DI(39) XOR DI(443) XOR DI(224) XOR DI(135) XOR DI(189) XOR DI(120) XOR DI(329) XOR DI(173) XOR DI(400) XOR DI(18) XOR DI(414) XOR DI(77) XOR DI(287) XOR DI(123) XOR DI(464) XOR DI(201) XOR DI(416) XOR DI(501) XOR DI(254) XOR DI(274) XOR DI(243) XOR DI(212) XOR DI(309) XOR DI(30) XOR DI(111) XOR DI(320) XOR DI(9) XOR DI(405) XOR DI(192) XOR DI(21) XOR DI(102) XOR DI(0) XOR DI(225) XOR DI(376) XOR DI(214) XOR DI(121) XOR DI(145) XOR DI(95) XOR DI(340) XOR DI(34) XOR DI(174) XOR DI(385) XOR DI(486) XOR DI(259) XOR DI(223) XOR DI(154) XOR DI(78) XOR DI(149) XOR DI(1) XOR DI(250) XOR DI(349) XOR DI(170) XOR DI(277) XOR DI(407) XOR DI(319) XOR DI(457) XOR DI(215) XOR DI(93) XOR DI(477) XOR DI(339) XOR DI(312) XOR DI(61) XOR DI(183) XOR DI(461) XOR DI(479) XOR DI(408) XOR DI(25) XOR DI(495) XOR DI(237) XOR DI(314) XOR DI(232) XOR DI(228) XOR DI(208) XOR DI(368) XOR DI(139) XOR DI(89) XOR DI(392) XOR DI(304) XOR DI(28) XOR DI(193) XOR DI(148) XOR DI(97) XOR DI(424) XOR DI(164) XOR DI(401) XOR DI(451) XOR DI(113) XOR DI(177) XOR DI(297) XOR DI(202) XOR DI(362) XOR DI(133) XOR DI(474) XOR DI(211) XOR DI(158) XOR DI(395) XOR DI(107) XOR DI(152) XOR DI(432) XOR DI(10) XOR DI(29) XOR DI(344) XOR DI(23) XOR DI(178) XOR DI(17) XOR DI(5) XOR DI(511); + DO(25) <= DI(68) XOR DI(53) XOR DI(268) XOR DI(368) XOR DI(271) XOR DI(471) XOR DI(333) XOR DI(489) XOR DI(289) XOR DI(418) XOR DI(81) XOR DI(127) XOR DI(468) XOR DI(432) XOR DI(505) XOR DI(54) XOR DI(247) XOR DI(130) XOR DI(269) XOR DI(125) XOR DI(490) XOR DI(263) XOR DI(290) XOR DI(84) XOR DI(419) XOR DI(82) XOR DI(292) XOR DI(357) XOR DI(469) XOR DI(36) XOR DI(506) XOR DI(259) XOR DI(389) XOR DI(314) XOR DI(439) XOR DI(63) XOR DI(185) XOR DI(325) XOR DI(158) XOR DI(243) XOR DI(380) XOR DI(270) XOR DI(239) XOR DI(107) XOR DI(5) XOR DI(371) XOR DI(370) XOR DI(336) XOR DI(126) XOR DI(379) XOR DI(145) XOR DI(335) XOR DI(115) XOR DI(491) XOR DI(264) XOR DI(364) XOR DI(388) XOR DI(440) XOR DI(304) XOR DI(470) XOR DI(154) XOR DI(12) XOR DI(435) XOR DI(186) XOR DI(346) XOR DI(25) XOR DI(180) XOR DI(13) XOR DI(507) XOR DI(72) XOR DI(261) XOR DI(353) XOR DI(464) XOR DI(44) XOR DI(281) XOR DI(323) XOR DI(461) XOR DI(250) XOR DI(97) XOR DI(326) XOR DI(451) XOR DI(37) XOR DI(441) XOR DI(65) XOR DI(133) XOR DI(395) XOR DI(398) XOR DI(75) XOR DI(285) XOR DI(199) XOR DI(160) XOR DI(109) XOR DI(403) XOR DI(232) XOR DI(100) XOR DI(365) XOR DI(299) XOR DI(372) XOR DI(143) XOR DI(93) XOR DI(446) XOR DI(32) XOR DI(197) XOR DI(381) XOR DI(351) XOR DI(167) XOR DI(248) XOR DI(51) XOR DI(337) XOR DI(41) XOR DI(181) XOR DI(459) XOR DI(23) XOR DI(266) XOR DI(235) XOR DI(204) XOR DI(230) XOR DI(217) XOR DI(293) XOR DI(206) XOR DI(113) XOR DI(137) XOR DI(87) XOR DI(390) XOR DI(295) XOR DI(306) XOR DI(360) XOR DI(131) XOR DI(116) XOR DI(436) XOR DI(430) XOR DI(104) XOR DI(342) XOR DI(170) XOR DI(164) XOR DI(497) XOR DI(503) XOR DI(509) XOR DI(486) XOR DI(354) XOR DI(481) XOR DI(283) XOR DI(58) XOR DI(411) XOR DI(359) XOR DI(61) XOR DI(282) XOR DI(324) XOR DI(220) XOR DI(482) XOR DI(344) XOR DI(48) XOR DI(455) XOR DI(445) XOR DI(66) XOR DI(223) XOR DI(188) XOR DI(119) XOR DI(466) XOR DI(328) XOR DI(172) XOR DI(399) XOR DI(284) XOR DI(17) XOR DI(413) XOR DI(286) XOR DI(200) XOR DI(427) XOR DI(500) XOR DI(246) XOR DI(383) XOR DI(242) XOR DI(211) XOR DI(308) XOR DI(110) XOR DI(404) XOR DI(191) XOR DI(152) XOR DI(237) XOR DI(374) XOR DI(20) XOR DI(300) XOR DI(375) XOR DI(120) XOR DI(144) XOR DI(309) XOR DI(447) XOR DI(33) XOR DI(173) XOR DI(384) XOR DI(222) XOR DI(129) XOR DI(77) XOR DI(428) XOR DI(429) XOR DI(0) XOR DI(416) XOR DI(168) XOR DI(348) XOR DI(52) XOR DI(169) XOR DI(318) XOR DI(456) XOR DI(245) XOR DI(214) XOR DI(42) XOR DI(449) XOR DI(311) XOR DI(460) XOR DI(166) XOR DI(407) XOR DI(280) XOR DI(457) XOR DI(267) XOR DI(236) XOR DI(205) XOR DI(302) XOR DI(231) XOR DI(218) XOR DI(207) XOR DI(367) XOR DI(138) XOR DI(88) XOR DI(303) XOR DI(378) XOR DI(192) XOR DI(376) XOR DI(163) XOR DI(443) XOR DI(387) XOR DI(296) XOR DI(385) XOR DI(21) XOR DI(473) XOR DI(210) XOR DI(141) XOR DI(157) XOR DI(394) XOR DI(437) XOR DI(106) XOR DI(195) XOR DI(15) XOR DI(111) XOR DI(438) XOR DI(431) XOR DI(349) XOR DI(105) XOR DI(343) XOR DI(3) XOR DI(16) XOR DI(4) XOR DI(504) XOR DI(510); + DO(26) <= DI(69) XOR DI(54) XOR DI(269) XOR DI(369) XOR DI(272) XOR DI(472) XOR DI(334) XOR DI(490) XOR DI(290) XOR DI(419) XOR DI(82) XOR DI(128) XOR DI(469) XOR DI(433) XOR DI(506) XOR DI(55) XOR DI(248) XOR DI(131) XOR DI(270) XOR DI(126) XOR DI(491) XOR DI(264) XOR DI(291) XOR DI(85) XOR DI(420) XOR DI(83) XOR DI(293) XOR DI(358) XOR DI(470) XOR DI(37) XOR DI(507) XOR DI(260) XOR DI(390) XOR DI(315) XOR DI(440) XOR DI(64) XOR DI(186) XOR DI(326) XOR DI(159) XOR DI(244) XOR DI(381) XOR DI(271) XOR DI(240) XOR DI(108) XOR DI(6) XOR DI(372) XOR DI(371) XOR DI(337) XOR DI(127) XOR DI(380) XOR DI(146) XOR DI(336) XOR DI(116) XOR DI(492) XOR DI(265) XOR DI(365) XOR DI(389) XOR DI(441) XOR DI(305) XOR DI(471) XOR DI(155) XOR DI(13) XOR DI(436) XOR DI(187) XOR DI(347) XOR DI(26) XOR DI(181) XOR DI(14) XOR DI(508) XOR DI(73) XOR DI(262) XOR DI(354) XOR DI(465) XOR DI(45) XOR DI(282) XOR DI(324) XOR DI(462) XOR DI(251) XOR DI(98) XOR DI(327) XOR DI(452) XOR DI(38) XOR DI(442) XOR DI(66) XOR DI(134) XOR DI(396) XOR DI(399) XOR DI(76) XOR DI(286) XOR DI(200) XOR DI(161) XOR DI(110) XOR DI(404) XOR DI(233) XOR DI(101) XOR DI(366) XOR DI(300) XOR DI(373) XOR DI(144) XOR DI(94) XOR DI(447) XOR DI(33) XOR DI(198) XOR DI(382) XOR DI(352) XOR DI(168) XOR DI(249) XOR DI(52) XOR DI(338) XOR DI(42) XOR DI(182) XOR DI(460) XOR DI(24) XOR DI(267) XOR DI(236) XOR DI(205) XOR DI(231) XOR DI(218) XOR DI(294) XOR DI(207) XOR DI(114) XOR DI(138) XOR DI(88) XOR DI(391) XOR DI(296) XOR DI(307) XOR DI(361) XOR DI(132) XOR DI(117) XOR DI(437) XOR DI(431) XOR DI(105) XOR DI(343) XOR DI(171) XOR DI(165) XOR DI(498) XOR DI(504) XOR DI(510) XOR DI(487) XOR DI(355) XOR DI(482) XOR DI(284) XOR DI(59) XOR DI(412) XOR DI(360) XOR DI(62) XOR DI(283) XOR DI(325) XOR DI(221) XOR DI(483) XOR DI(345) XOR DI(49) XOR DI(456) XOR DI(446) XOR DI(67) XOR DI(224) XOR DI(189) XOR DI(120) XOR DI(467) XOR DI(329) XOR DI(173) XOR DI(400) XOR DI(285) XOR DI(18) XOR DI(414) XOR DI(287) XOR DI(201) XOR DI(428) XOR DI(501) XOR DI(247) XOR DI(384) XOR DI(243) XOR DI(212) XOR DI(309) XOR DI(111) XOR DI(405) XOR DI(192) XOR DI(153) XOR DI(238) XOR DI(375) XOR DI(21) XOR DI(0) XOR DI(301) XOR DI(376) XOR DI(121) XOR DI(145) XOR DI(310) XOR DI(448) XOR DI(34) XOR DI(174) XOR DI(385) XOR DI(223) XOR DI(130) XOR DI(78) XOR DI(429) XOR DI(430) XOR DI(1) XOR DI(417) XOR DI(169) XOR DI(349) XOR DI(53) XOR DI(170) XOR DI(319) XOR DI(457) XOR DI(246) XOR DI(215) XOR DI(43) XOR DI(450) XOR DI(312) XOR DI(461) XOR DI(167) XOR DI(408) XOR DI(281) XOR DI(458) XOR DI(268) XOR DI(237) XOR DI(206) XOR DI(303) XOR DI(232) XOR DI(219) XOR DI(208) XOR DI(368) XOR DI(139) XOR DI(89) XOR DI(304) XOR DI(379) XOR DI(193) XOR DI(377) XOR DI(164) XOR DI(444) XOR DI(388) XOR DI(297) XOR DI(386) XOR DI(22) XOR DI(474) XOR DI(211) XOR DI(142) XOR DI(158) XOR DI(395) XOR DI(438) XOR DI(107) XOR DI(196) XOR DI(16) XOR DI(112) XOR DI(439) XOR DI(432) XOR DI(350) XOR DI(106) XOR DI(344) XOR DI(4) XOR DI(17) XOR DI(5) XOR DI(505) XOR DI(511); + DO(27) <= DI(70) XOR DI(55) XOR DI(42) XOR DI(324) XOR DI(452) XOR DI(88) XOR DI(185) XOR DI(270) XOR DI(98) XOR DI(363) XOR DI(370) XOR DI(255) XOR DI(195) XOR DI(126) XOR DI(273) XOR DI(473) XOR DI(335) XOR DI(179) XOR DI(491) XOR DI(264) XOR DI(291) XOR DI(24) XOR DI(144) XOR DI(420) XOR DI(83) XOR DI(129) XOR DI(470) XOR DI(114) XOR DI(138) XOR DI(434) XOR DI(12) XOR DI(507) XOR DI(253) XOR DI(260) XOR DI(56) XOR DI(357) XOR DI(322) XOR DI(249) XOR DI(218) XOR DI(96) XOR DI(36) XOR DI(64) XOR DI(132) XOR DI(251) XOR DI(271) XOR DI(402) XOR DI(127) XOR DI(296) XOR DI(40) XOR DI(278) XOR DI(492) XOR DI(265) XOR DI(203) XOR DI(229) XOR DI(292) XOR DI(136) XOR DI(86) XOR DI(94) XOR DI(421) XOR DI(84) XOR DI(294) XOR DI(359) XOR DI(471) XOR DI(134) XOR DI(38) XOR DI(155) XOR DI(496) XOR DI(508) XOR DI(261) XOR DI(391) XOR DI(425) XOR DI(411) XOR DI(343) XOR DI(454) XOR DI(316) XOR DI(441) XOR DI(65) XOR DI(187) XOR DI(465) XOR DI(327) XOR DI(160) XOR DI(245) XOR DI(382) XOR DI(48) XOR DI(272) XOR DI(241) XOR DI(210) XOR DI(109) XOR DI(7) XOR DI(236) XOR DI(373) XOR DI(100) XOR DI(372) XOR DI(338) XOR DI(257) XOR DI(128) XOR DI(381) XOR DI(76) XOR DI(147) XOR DI(500) XOR DI(51) XOR DI(275) XOR DI(337) XOR DI(117) XOR DI(493) XOR DI(266) XOR DI(226) XOR DI(366) XOR DI(390) XOR DI(26) XOR DI(478) XOR DI(399) XOR DI(442) XOR DI(315) XOR DI(306) XOR DI(200) XOR DI(472) XOR DI(116) XOR DI(156) XOR DI(105) XOR DI(300) XOR DI(354) XOR DI(14) XOR DI(33) XOR DI(150) XOR DI(437) XOR DI(188) XOR DI(348) XOR DI(27) XOR DI(182) XOR DI(15) XOR DI(503) XOR DI(509) XOR DI(487) XOR DI(235) XOR DI(74) XOR DI(263) XOR DI(393) XOR DI(355) XOR DI(75) XOR DI(321) XOR DI(482) XOR DI(342) XOR DI(466) XOR DI(46) XOR DI(427) XOR DI(62) XOR DI(283) XOR DI(325) XOR DI(463) XOR DI(252) XOR DI(99) XOR DI(328) XOR DI(453) XOR DI(318) XOR DI(39) XOR DI(446) XOR DI(443) XOR DI(125) XOR DI(67) XOR DI(191) XOR DI(135) XOR DI(120) XOR DI(397) XOR DI(467) XOR DI(329) XOR DI(173) XOR DI(400) XOR DI(414) XOR DI(77) XOR DI(287) XOR DI(464) XOR DI(201) XOR DI(31) XOR DI(428) XOR DI(416) XOR DI(162) XOR DI(384) XOR DI(243) XOR DI(309) XOR DI(30) XOR DI(111) XOR DI(405) XOR DI(192) XOR DI(153) XOR DI(375) XOR DI(234) XOR DI(21) XOR DI(102) XOR DI(0) XOR DI(367) XOR DI(301) XOR DI(214) XOR DI(374) XOR DI(145) XOR DI(95) XOR DI(340) XOR DI(398) XOR DI(448) XOR DI(34) XOR DI(486) XOR DI(199) XOR DI(383) XOR DI(78) XOR DI(104) XOR DI(353) XOR DI(32) XOR DI(149) XOR DI(103) XOR DI(341) XOR DI(20) XOR DI(417) XOR DI(169) XOR DI(481) XOR DI(250) XOR DI(53) XOR DI(319) XOR DI(215) XOR DI(93) XOR DI(339) XOR DI(43) XOR DI(119) XOR DI(183) XOR DI(461) XOR DI(167) XOR DI(394) XOR DI(408) XOR DI(25) XOR DI(268) XOR DI(237) XOR DI(206) XOR DI(303) XOR DI(314) XOR DI(232) XOR DI(219) XOR DI(295) XOR DI(208) XOR DI(115) XOR DI(368) XOR DI(139) XOR DI(89) XOR DI(392) XOR DI(480) XOR DI(217) XOR DI(124) XOR DI(163) XOR DI(47) XOR DI(164) XOR DI(444) XOR DI(177) XOR DI(297) XOR DI(308) XOR DI(362) XOR DI(133) XOR DI(118) XOR DI(395) XOR DI(438) XOR DI(432) XOR DI(10) XOR DI(106) XOR DI(29) XOR DI(184) XOR DI(344) XOR DI(4) XOR DI(178) XOR DI(172) XOR DI(11) XOR DI(166) XOR DI(499) XOR DI(505) XOR DI(511); + DO(28) <= DI(71) XOR DI(260) XOR DI(56) XOR DI(43) XOR DI(357) XOR DI(325) XOR DI(453) XOR DI(239) XOR DI(36) XOR DI(440) XOR DI(64) XOR DI(89) XOR DI(186) XOR DI(159) XOR DI(271) XOR DI(108) XOR DI(6) XOR DI(402) XOR DI(99) XOR DI(364) XOR DI(371) XOR DI(256) XOR DI(196) XOR DI(127) XOR DI(380) XOR DI(350) XOR DI(247) XOR DI(346) XOR DI(50) XOR DI(274) XOR DI(243) XOR DI(474) XOR DI(336) XOR DI(180) XOR DI(458) XOR DI(278) XOR DI(492) XOR DI(265) XOR DI(203) XOR DI(229) XOR DI(225) XOR DI(292) XOR DI(389) XOR DI(25) XOR DI(145) XOR DI(421) XOR DI(84) XOR DI(314) XOR DI(305) XOR DI(130) XOR DI(471) XOR DI(115) XOR DI(139) XOR DI(155) XOR DI(435) XOR DI(13) XOR DI(149) XOR DI(496) XOR DI(502) XOR DI(508) XOR DI(254) XOR DI(261) XOR DI(57) XOR DI(358) XOR DI(323) XOR DI(250) XOR DI(219) XOR DI(97) XOR DI(451) XOR DI(37) XOR DI(65) XOR DI(133) XOR DI(285) XOR DI(252) XOR DI(272) XOR DI(403) XOR DI(143) XOR DI(93) XOR DI(446) XOR DI(257) XOR DI(197) XOR DI(128) XOR DI(297) XOR DI(351) XOR DI(248) XOR DI(51) XOR DI(275) XOR DI(475) XOR DI(41) XOR DI(459) XOR DI(321) XOR DI(279) XOR DI(23) XOR DI(408) XOR DI(493) XOR DI(266) XOR DI(204) XOR DI(230) XOR DI(226) XOR DI(217) XOR DI(293) XOR DI(113) XOR DI(137) XOR DI(87) XOR DI(377) XOR DI(95) XOR DI(422) XOR DI(85) XOR DI(386) XOR DI(295) XOR DI(360) XOR DI(131) XOR DI(472) XOR DI(135) XOR DI(39) XOR DI(156) XOR DI(194) XOR DI(430) XOR DI(497) XOR DI(503) XOR DI(509) XOR DI(62) XOR DI(486) XOR DI(255) XOR DI(262) XOR DI(392) XOR DI(426) XOR DI(411) XOR DI(175) XOR DI(282) XOR DI(412) XOR DI(324) XOR DI(98) XOR DI(344) XOR DI(455) XOR DI(452) XOR DI(317) XOR DI(442) XOR DI(124) XOR DI(66) XOR DI(190) XOR DI(188) XOR DI(466) XOR DI(328) XOR DI(484) XOR DI(17) XOR DI(413) XOR DI(286) XOR DI(122) XOR DI(427) XOR DI(161) XOR DI(246) XOR DI(383) XOR DI(49) XOR DI(273) XOR DI(242) XOR DI(211) XOR DI(29) XOR DI(110) XOR DI(8) XOR DI(191) XOR DI(237) XOR DI(374) XOR DI(20) XOR DI(101) XOR DI(224) XOR DI(300) XOR DI(213) XOR DI(373) XOR DI(144) XOR DI(339) XOR DI(258) XOR DI(222) XOR DI(129) XOR DI(382) XOR DI(414) XOR DI(153) XOR DI(77) XOR DI(148) XOR DI(19) XOR DI(416) XOR DI(501) XOR DI(480) XOR DI(52) XOR DI(276) XOR DI(318) XOR DI(214) XOR DI(338) XOR DI(42) XOR DI(311) XOR DI(118) XOR DI(60) XOR DI(478) XOR DI(457) XOR DI(24) XOR DI(494) XOR DI(267) XOR DI(313) XOR DI(2) XOR DI(227) XOR DI(114) XOR DI(367) XOR DI(138) XOR DI(88) XOR DI(391) XOR DI(303) XOR DI(27) XOR DI(378) XOR DI(479) XOR DI(400) XOR DI(443) XOR DI(316) XOR DI(387) XOR DI(18) XOR DI(307) XOR DI(212) XOR DI(201) XOR DI(361) XOR DI(473) XOR DI(210) XOR DI(117) XOR DI(157) XOR DI(106) XOR DI(301) XOR DI(195) XOR DI(355) XOR DI(15) XOR DI(34) XOR DI(151) XOR DI(438) XOR DI(431) XOR DI(189) XOR DI(349) XOR DI(28) XOR DI(425) XOR DI(183) XOR DI(177) XOR DI(16) XOR DI(171) XOR DI(10) XOR DI(4) XOR DI(504) XOR DI(510); + DO(29) <= DI(72) XOR DI(261) XOR DI(57) XOR DI(44) XOR DI(358) XOR DI(326) XOR DI(454) XOR DI(240) XOR DI(37) XOR DI(441) XOR DI(65) XOR DI(90) XOR DI(187) XOR DI(160) XOR DI(272) XOR DI(109) XOR DI(7) XOR DI(403) XOR DI(100) XOR DI(365) XOR DI(372) XOR DI(257) XOR DI(197) XOR DI(128) XOR DI(381) XOR DI(351) XOR DI(248) XOR DI(347) XOR DI(51) XOR DI(275) XOR DI(244) XOR DI(475) XOR DI(337) XOR DI(181) XOR DI(459) XOR DI(279) XOR DI(493) XOR DI(266) XOR DI(204) XOR DI(230) XOR DI(226) XOR DI(293) XOR DI(390) XOR DI(26) XOR DI(146) XOR DI(422) XOR DI(85) XOR DI(315) XOR DI(306) XOR DI(131) XOR DI(472) XOR DI(116) XOR DI(140) XOR DI(156) XOR DI(436) XOR DI(14) XOR DI(150) XOR DI(497) XOR DI(503) XOR DI(509) XOR DI(255) XOR DI(262) XOR DI(58) XOR DI(359) XOR DI(324) XOR DI(251) XOR DI(220) XOR DI(98) XOR DI(452) XOR DI(38) XOR DI(66) XOR DI(134) XOR DI(286) XOR DI(253) XOR DI(273) XOR DI(404) XOR DI(144) XOR DI(94) XOR DI(447) XOR DI(258) XOR DI(198) XOR DI(129) XOR DI(298) XOR DI(352) XOR DI(249) XOR DI(52) XOR DI(276) XOR DI(476) XOR DI(42) XOR DI(460) XOR DI(322) XOR DI(280) XOR DI(24) XOR DI(409) XOR DI(494) XOR DI(267) XOR DI(205) XOR DI(231) XOR DI(227) XOR DI(218) XOR DI(294) XOR DI(114) XOR DI(138) XOR DI(88) XOR DI(378) XOR DI(96) XOR DI(423) XOR DI(86) XOR DI(387) XOR DI(296) XOR DI(361) XOR DI(132) XOR DI(473) XOR DI(136) XOR DI(40) XOR DI(157) XOR DI(195) XOR DI(431) XOR DI(498) XOR DI(504) XOR DI(510) XOR DI(63) XOR DI(487) XOR DI(256) XOR DI(263) XOR DI(393) XOR DI(427) XOR DI(412) XOR DI(176) XOR DI(283) XOR DI(413) XOR DI(325) XOR DI(99) XOR DI(345) XOR DI(456) XOR DI(453) XOR DI(318) XOR DI(443) XOR DI(125) XOR DI(67) XOR DI(191) XOR DI(189) XOR DI(467) XOR DI(329) XOR DI(485) XOR DI(18) XOR DI(414) XOR DI(287) XOR DI(123) XOR DI(428) XOR DI(162) XOR DI(247) XOR DI(384) XOR DI(50) XOR DI(274) XOR DI(243) XOR DI(212) XOR DI(30) XOR DI(111) XOR DI(9) XOR DI(192) XOR DI(238) XOR DI(375) XOR DI(21) XOR DI(102) XOR DI(225) XOR DI(301) XOR DI(214) XOR DI(374) XOR DI(145) XOR DI(340) XOR DI(259) XOR DI(223) XOR DI(130) XOR DI(383) XOR DI(415) XOR DI(154) XOR DI(78) XOR DI(149) XOR DI(20) XOR DI(417) XOR DI(502) XOR DI(481) XOR DI(53) XOR DI(277) XOR DI(319) XOR DI(215) XOR DI(339) XOR DI(43) XOR DI(312) XOR DI(119) XOR DI(61) XOR DI(479) XOR DI(458) XOR DI(25) XOR DI(495) XOR DI(268) XOR DI(314) XOR DI(3) XOR DI(228) XOR DI(115) XOR DI(368) XOR DI(139) XOR DI(89) XOR DI(392) XOR DI(304) XOR DI(28) XOR DI(379) XOR DI(480) XOR DI(401) XOR DI(444) XOR DI(317) XOR DI(388) XOR DI(19) XOR DI(308) XOR DI(213) XOR DI(202) XOR DI(362) XOR DI(474) XOR DI(211) XOR DI(118) XOR DI(158) XOR DI(107) XOR DI(302) XOR DI(196) XOR DI(356) XOR DI(16) XOR DI(35) XOR DI(152) XOR DI(439) XOR DI(432) XOR DI(190) XOR DI(350) XOR DI(29) XOR DI(426) XOR DI(184) XOR DI(178) XOR DI(17) XOR DI(172) XOR DI(11) XOR DI(5) XOR DI(505) XOR DI(511); + DO(30) <= DI(73) XOR DI(255) XOR DI(262) XOR DI(354) XOR DI(58) XOR DI(465) XOR DI(45) XOR DI(411) XOR DI(175) XOR DI(359) XOR DI(282) XOR DI(324) XOR DI(462) XOR DI(251) XOR DI(220) XOR DI(98) XOR DI(327) XOR DI(48) XOR DI(455) XOR DI(452) XOR DI(241) XOR DI(38) XOR DI(442) XOR DI(66) XOR DI(91) XOR DI(134) XOR DI(188) XOR DI(396) XOR DI(399) XOR DI(484) XOR DI(76) XOR DI(286) XOR DI(122) XOR DI(200) XOR DI(161) XOR DI(500) XOR DI(253) XOR DI(273) XOR DI(110) XOR DI(8) XOR DI(404) XOR DI(233) XOR DI(101) XOR DI(366) XOR DI(300) XOR DI(373) XOR DI(144) XOR DI(94) XOR DI(447) XOR DI(33) XOR DI(258) XOR DI(222) XOR DI(198) XOR DI(129) XOR DI(382) XOR DI(298) XOR DI(352) XOR DI(168) XOR DI(249) XOR DI(348) XOR DI(52) XOR DI(276) XOR DI(406) XOR DI(245) XOR DI(476) XOR DI(338) XOR DI(42) XOR DI(449) XOR DI(311) XOR DI(60) XOR DI(182) XOR DI(460) XOR DI(322) XOR DI(478) XOR DI(280) XOR DI(24) XOR DI(409) XOR DI(494) XOR DI(267) XOR DI(236) XOR DI(205) XOR DI(2) XOR DI(231) XOR DI(227) XOR DI(218) XOR DI(294) XOR DI(207) XOR DI(114) XOR DI(138) XOR DI(88) XOR DI(391) XOR DI(27) XOR DI(378) XOR DI(147) XOR DI(96) XOR DI(423) XOR DI(86) XOR DI(316) XOR DI(387) XOR DI(296) XOR DI(307) XOR DI(361) XOR DI(132) XOR DI(473) XOR DI(210) XOR DI(117) XOR DI(141) XOR DI(136) XOR DI(40) XOR DI(157) XOR DI(437) XOR DI(195) XOR DI(15) XOR DI(151) XOR DI(431) XOR DI(105) XOR DI(425) XOR DI(343) XOR DI(171) XOR DI(165) XOR DI(498) XOR DI(504) XOR DI(510) XOR DI(63) XOR DI(487) XOR DI(235) XOR DI(256) XOR DI(263) XOR DI(194) XOR DI(75) XOR DI(321) XOR DI(342) XOR DI(59) XOR DI(360) XOR DI(325) XOR DI(252) XOR DI(221) XOR DI(99) XOR DI(483) XOR DI(345) XOR DI(453) XOR DI(39) XOR DI(446) XOR DI(125) XOR DI(67) XOR DI(135) XOR DI(467) XOR DI(329) XOR DI(285) XOR DI(287) XOR DI(464) XOR DI(247) XOR DI(254) XOR DI(50) XOR DI(274) XOR DI(243) XOR DI(405) XOR DI(238) XOR DI(225) XOR DI(121) XOR DI(145) XOR DI(95) XOR DI(398) XOR DI(310) XOR DI(448) XOR DI(174) XOR DI(259) XOR DI(199) XOR DI(130) XOR DI(154) XOR DI(78) XOR DI(104) XOR DI(299) XOR DI(353) XOR DI(32) XOR DI(149) XOR DI(430) XOR DI(1) XOR DI(417) XOR DI(502) XOR DI(250) XOR DI(53) XOR DI(170) XOR DI(277) XOR DI(93) XOR DI(477) XOR DI(43) XOR DI(461) XOR DI(323) XOR DI(167) XOR DI(408) XOR DI(281) XOR DI(458) XOR DI(25) XOR DI(410) XOR DI(495) XOR DI(268) XOR DI(206) XOR DI(314) XOR DI(232) XOR DI(228) XOR DI(219) XOR DI(295) XOR DI(115) XOR DI(368) XOR DI(139) XOR DI(89) XOR DI(304) XOR DI(379) XOR DI(217) XOR DI(377) XOR DI(143) XOR DI(97) XOR DI(424) XOR DI(47) XOR DI(164) XOR DI(401) XOR DI(451) XOR DI(209) XOR DI(87) XOR DI(113) XOR DI(388) XOR DI(297) XOR DI(202) XOR DI(362) XOR DI(133) XOR DI(386) XOR DI(474) XOR DI(137) XOR DI(41) XOR DI(158) XOR DI(395) XOR DI(107) XOR DI(196) XOR DI(356) XOR DI(35) XOR DI(439) XOR DI(432) XOR DI(350) XOR DI(184) XOR DI(23) XOR DI(178) XOR DI(11) XOR DI(5) XOR DI(499) XOR DI(505) XOR DI(511); + DO(31) <= DI(63) XOR DI(487) XOR DI(235) XOR DI(74) XOR DI(256) XOR DI(263) XOR DI(393) XOR DI(355) XOR DI(194) XOR DI(75) XOR DI(321) XOR DI(482) XOR DI(284) XOR DI(342) XOR DI(59) XOR DI(466) XOR DI(46) XOR DI(427) XOR DI(412) XOR DI(176) XOR DI(360) XOR DI(62) XOR DI(283) XOR DI(413) XOR DI(325) XOR DI(463) XOR DI(252) XOR DI(221) XOR DI(99) XOR DI(328) XOR DI(483) XOR DI(345) XOR DI(49) XOR DI(456) XOR DI(453) XOR DI(242) XOR DI(318) XOR DI(39) XOR DI(446) XOR DI(443) XOR DI(125) XOR DI(67) XOR DI(191) XOR DI(224) XOR DI(92) XOR DI(135) XOR DI(189) XOR DI(120) XOR DI(397) XOR DI(467) XOR DI(329) XOR DI(173) XOR DI(400) XOR DI(485) XOR DI(285) XOR DI(18) XOR DI(414) XOR DI(77) XOR DI(287) XOR DI(123) XOR DI(464) XOR DI(201) XOR DI(31) XOR DI(428) XOR DI(416) XOR DI(162) XOR DI(501) XOR DI(247) XOR DI(254) XOR DI(384) XOR DI(50) XOR DI(274) XOR DI(243) XOR DI(212) XOR DI(309) XOR DI(30) XOR DI(111) XOR DI(320) XOR DI(9) XOR DI(405) XOR DI(192) XOR DI(153) XOR DI(238) XOR DI(375) XOR DI(234) XOR DI(21) XOR DI(102) XOR DI(0) XOR DI(225) XOR DI(216) XOR DI(367) XOR DI(301) XOR DI(376) XOR DI(214) XOR DI(121) XOR DI(374) XOR DI(145) XOR DI(95) XOR DI(340) XOR DI(398) XOR DI(310) XOR DI(448) XOR DI(34) XOR DI(174) XOR DI(385) XOR DI(486) XOR DI(259) XOR DI(223) XOR DI(199) XOR DI(130) XOR DI(383) XOR DI(415) XOR DI(154) XOR DI(78) XOR DI(104) XOR DI(299) XOR DI(353) XOR DI(32) XOR DI(149) XOR DI(429) XOR DI(103) XOR DI(430) XOR DI(341) XOR DI(1) XOR DI(20) XOR DI(417) XOR DI(169) XOR DI(502) XOR DI(481) XOR DI(250) XOR DI(349) XOR DI(53) XOR DI(170) XOR DI(277) XOR DI(407) XOR DI(319) XOR DI(457) XOR DI(246) XOR DI(215) XOR DI(93) XOR DI(477) XOR DI(339) XOR DI(43) XOR DI(450) XOR DI(312) XOR DI(119) XOR DI(61) XOR DI(183) XOR DI(461) XOR DI(323) XOR DI(167) XOR DI(394) XOR DI(479) XOR DI(408) XOR DI(281) XOR DI(458) XOR DI(25) XOR DI(410) XOR DI(495) XOR DI(268) XOR DI(237) XOR DI(206) XOR DI(303) XOR DI(314) XOR DI(3) XOR DI(232) XOR DI(228) XOR DI(219) XOR DI(295) XOR DI(208) XOR DI(115) XOR DI(368) XOR DI(139) XOR DI(89) XOR DI(392) XOR DI(304) XOR DI(28) XOR DI(379) XOR DI(480) XOR DI(217) XOR DI(193) XOR DI(124) XOR DI(377) XOR DI(148) XOR DI(143) XOR DI(97) XOR DI(424) XOR DI(163) XOR DI(47) XOR DI(164) XOR DI(401) XOR DI(313) XOR DI(451) XOR DI(209) XOR DI(87) XOR DI(444) XOR DI(113) XOR DI(177) XOR DI(317) XOR DI(388) XOR DI(19) XOR DI(297) XOR DI(308) XOR DI(213) XOR DI(202) XOR DI(362) XOR DI(133) XOR DI(386) XOR DI(22) XOR DI(474) XOR DI(211) XOR DI(118) XOR DI(142) XOR DI(137) XOR DI(41) XOR DI(158) XOR DI(395) XOR DI(445) XOR DI(438) XOR DI(107) XOR DI(302) XOR DI(196) XOR DI(356) XOR DI(16) XOR DI(112) XOR DI(35) XOR DI(152) XOR DI(439) XOR DI(432) XOR DI(190) XOR DI(350) XOR DI(10) XOR DI(106) XOR DI(29) XOR DI(426) XOR DI(184) XOR DI(344) XOR DI(4) XOR DI(23) XOR DI(178) XOR DI(17) XOR DI(172) XOR DI(11) XOR DI(166) XOR DI(5) XOR DI(499) XOR DI(505) XOR DI(511); +end architecture; \ No newline at end of file Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast64_tab.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast64_tab.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast64_tab.vhd (revision 3) @@ -0,0 +1,92 @@ +-- +-- crc32_fast64_tab.vhd: A 32-bit CRC (IEEE) table for processing fixed 64 bits in parallel +-- Copyright (C) 2011 CESNET +-- Author(s): Lukas Kekely +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in +-- the documentation and/or other materials provided with the +-- distribution. +-- 3. Neither the name of the Company nor the names of its contributors +-- may be used to endorse or promote products derived from this +-- software without specific prior written permission. +-- +-- This software is provided ``as is'', and any express or implied +-- warranties, including, but not limited to, the implied warranties of +-- merchantability and fitness for a particular purpose are disclaimed. +-- In no event shall the company or contributors be liable for any +-- direct, indirect, incidental, special, exemplary, or consequential +-- damages (including, but not limited to, procurement of substitute +-- goods or services; loss of use, data, or profits; or business +-- interruption) however caused and on any theory of liability, whether +-- in contract, strict liability, or tort (including negligence or +-- otherwise) arising in any way out of the use of this software, even +-- if advised of the possibility of such damage. +-- +-- $Id$ +-- +-- TODO: +-- +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; +use IEEE.std_logic_unsigned.all; +use IEEE.numeric_std.all; +use WORK.math_pack.all; +-- ---------------------------------------------------------------------------- +-- Entity declaration +-- ---------------------------------------------------------------------------- +entity crc32_fast64_tab is + port( + DI : in std_logic_vector(64-1 downto 0); + DO : out std_logic_vector(31 downto 0) + ); +end entity crc32_fast64_tab; + +-- ---------------------------------------------------------------------------- +-- Architecture declaration +-- ---------------------------------------------------------------------------- +architecture arch of crc32_fast64_tab is +begin +-- 32-bit CRC equations processing 64 bits in parallel (VHDL code) +-- Generator polynomial: 0x104C11DB7 + DO(0) <= DI(40) XOR DI(35) XOR DI(19) XOR DI(16) XOR DI(36) XOR DI(9) XOR DI(6) XOR DI(20) XOR DI(38) XOR DI(17) XOR DI(54) XOR DI(1) XOR DI(39) XOR DI(55) XOR DI(34) XOR DI(10) XOR DI(30) XOR DI(3) XOR DI(14) XOR DI(32) XOR DI(11) XOR DI(48) XOR DI(33) XOR DI(4) XOR DI(27) XOR DI(52) XOR DI(58); + DO(1) <= DI(41) XOR DI(36) XOR DI(20) XOR DI(17) XOR DI(37) XOR DI(10) XOR DI(7) XOR DI(0) XOR DI(21) XOR DI(39) XOR DI(18) XOR DI(55) XOR DI(2) XOR DI(40) XOR DI(56) XOR DI(35) XOR DI(11) XOR DI(31) XOR DI(4) XOR DI(15) XOR DI(33) XOR DI(12) XOR DI(49) XOR DI(34) XOR DI(5) XOR DI(28) XOR DI(53) XOR DI(59); + DO(2) <= DI(42) XOR DI(37) XOR DI(21) XOR DI(18) XOR DI(38) XOR DI(11) XOR DI(8) XOR DI(1) XOR DI(22) XOR DI(40) XOR DI(19) XOR DI(56) XOR DI(3) XOR DI(41) XOR DI(57) XOR DI(36) XOR DI(12) XOR DI(32) XOR DI(5) XOR DI(16) XOR DI(34) XOR DI(13) XOR DI(50) XOR DI(35) XOR DI(6) XOR DI(29) XOR DI(0) XOR DI(54) XOR DI(60); + DO(3) <= DI(43) XOR DI(38) XOR DI(22) XOR DI(19) XOR DI(39) XOR DI(12) XOR DI(9) XOR DI(2) XOR DI(23) XOR DI(41) XOR DI(20) XOR DI(57) XOR DI(4) XOR DI(42) XOR DI(58) XOR DI(37) XOR DI(13) XOR DI(33) XOR DI(6) XOR DI(17) XOR DI(35) XOR DI(14) XOR DI(51) XOR DI(36) XOR DI(7) XOR DI(0) XOR DI(30) XOR DI(1) XOR DI(55) XOR DI(61); + DO(4) <= DI(44) XOR DI(39) XOR DI(23) XOR DI(20) XOR DI(40) XOR DI(13) XOR DI(10) XOR DI(3) XOR DI(0) XOR DI(24) XOR DI(42) XOR DI(21) XOR DI(58) XOR DI(5) XOR DI(43) XOR DI(59) XOR DI(38) XOR DI(14) XOR DI(34) XOR DI(7) XOR DI(18) XOR DI(36) XOR DI(15) XOR DI(52) XOR DI(37) XOR DI(8) XOR DI(1) XOR DI(31) XOR DI(2) XOR DI(56) XOR DI(62); + DO(5) <= DI(45) XOR DI(40) XOR DI(24) XOR DI(21) XOR DI(41) XOR DI(14) XOR DI(11) XOR DI(4) XOR DI(1) XOR DI(25) XOR DI(43) XOR DI(22) XOR DI(59) XOR DI(6) XOR DI(44) XOR DI(60) XOR DI(39) XOR DI(15) XOR DI(35) XOR DI(8) XOR DI(19) XOR DI(37) XOR DI(16) XOR DI(53) XOR DI(38) XOR DI(9) XOR DI(2) XOR DI(32) XOR DI(3) XOR DI(57) XOR DI(63); + DO(6) <= DI(46) XOR DI(41) XOR DI(19) XOR DI(25) XOR DI(22) XOR DI(42) XOR DI(15) XOR DI(12) XOR DI(5) XOR DI(2) XOR DI(34) XOR DI(26) XOR DI(44) XOR DI(23) XOR DI(48) XOR DI(60) XOR DI(32) XOR DI(6) XOR DI(35) XOR DI(14) XOR DI(52) XOR DI(7) XOR DI(27) XOR DI(11) XOR DI(45) XOR DI(30) XOR DI(1) XOR DI(55) XOR DI(61); + DO(7) <= DI(47) XOR DI(42) XOR DI(20) XOR DI(26) XOR DI(23) XOR DI(43) XOR DI(16) XOR DI(13) XOR DI(6) XOR DI(3) XOR DI(35) XOR DI(27) XOR DI(0) XOR DI(45) XOR DI(24) XOR DI(49) XOR DI(61) XOR DI(33) XOR DI(7) XOR DI(36) XOR DI(15) XOR DI(53) XOR DI(8) XOR DI(28) XOR DI(12) XOR DI(46) XOR DI(31) XOR DI(2) XOR DI(56) XOR DI(62); + DO(8) <= DI(48) XOR DI(43) XOR DI(21) XOR DI(27) XOR DI(24) XOR DI(44) XOR DI(17) XOR DI(14) XOR DI(7) XOR DI(4) XOR DI(36) XOR DI(28) XOR DI(1) XOR DI(46) XOR DI(25) XOR DI(50) XOR DI(62) XOR DI(34) XOR DI(8) XOR DI(37) XOR DI(16) XOR DI(54) XOR DI(9) XOR DI(29) XOR DI(13) XOR DI(47) XOR DI(32) XOR DI(3) XOR DI(57) XOR DI(63); + DO(9) <= DI(11) XOR DI(49) XOR DI(1) XOR DI(36) XOR DI(40) XOR DI(52) XOR DI(6) XOR DI(44) XOR DI(22) XOR DI(28) XOR DI(27) XOR DI(25) XOR DI(20) XOR DI(45) XOR DI(39) XOR DI(34) XOR DI(18) XOR DI(15) XOR DI(8) XOR DI(5) XOR DI(19) XOR DI(37) XOR DI(16) XOR DI(54) XOR DI(29) XOR DI(2) XOR DI(47) XOR DI(32) XOR DI(3) XOR DI(26) XOR DI(51) XOR DI(63); + DO(10) <= DI(39) XOR DI(12) XOR DI(50) XOR DI(2) XOR DI(36) XOR DI(37) XOR DI(41) XOR DI(53) XOR DI(7) XOR DI(45) XOR DI(1) XOR DI(23) XOR DI(54) XOR DI(34) XOR DI(29) XOR DI(10) XOR DI(14) XOR DI(32) XOR DI(11) XOR DI(28) XOR DI(26) XOR DI(21) XOR DI(46) XOR DI(58); + DO(11) <= DI(40) XOR DI(13) XOR DI(51) XOR DI(3) XOR DI(37) XOR DI(38) XOR DI(42) XOR DI(54) XOR DI(8) XOR DI(46) XOR DI(2) XOR DI(24) XOR DI(55) XOR DI(35) XOR DI(30) XOR DI(11) XOR DI(15) XOR DI(33) XOR DI(12) XOR DI(29) XOR DI(27) XOR DI(22) XOR DI(47) XOR DI(59); + DO(12) <= DI(41) XOR DI(14) XOR DI(52) XOR DI(4) XOR DI(38) XOR DI(39) XOR DI(43) XOR DI(55) XOR DI(9) XOR DI(47) XOR DI(3) XOR DI(25) XOR DI(56) XOR DI(36) XOR DI(31) XOR DI(12) XOR DI(16) XOR DI(34) XOR DI(13) XOR DI(30) XOR DI(28) XOR DI(23) XOR DI(48) XOR DI(60); + DO(13) <= DI(42) XOR DI(15) XOR DI(53) XOR DI(5) XOR DI(39) XOR DI(40) XOR DI(44) XOR DI(56) XOR DI(10) XOR DI(48) XOR DI(4) XOR DI(26) XOR DI(57) XOR DI(37) XOR DI(32) XOR DI(13) XOR DI(17) XOR DI(35) XOR DI(14) XOR DI(31) XOR DI(29) XOR DI(24) XOR DI(49) XOR DI(61); + DO(14) <= DI(43) XOR DI(16) XOR DI(54) XOR DI(6) XOR DI(40) XOR DI(41) XOR DI(45) XOR DI(57) XOR DI(11) XOR DI(49) XOR DI(5) XOR DI(27) XOR DI(58) XOR DI(38) XOR DI(33) XOR DI(14) XOR DI(18) XOR DI(36) XOR DI(15) XOR DI(32) XOR DI(30) XOR DI(25) XOR DI(50) XOR DI(62); + DO(15) <= DI(44) XOR DI(17) XOR DI(55) XOR DI(7) XOR DI(41) XOR DI(42) XOR DI(46) XOR DI(58) XOR DI(12) XOR DI(50) XOR DI(6) XOR DI(28) XOR DI(59) XOR DI(39) XOR DI(34) XOR DI(15) XOR DI(19) XOR DI(37) XOR DI(16) XOR DI(33) XOR DI(31) XOR DI(26) XOR DI(51) XOR DI(63); + DO(16) <= DI(45) XOR DI(39) XOR DI(18) XOR DI(55) XOR DI(19) XOR DI(56) XOR DI(3) XOR DI(8) XOR DI(42) XOR DI(58) XOR DI(14) XOR DI(11) XOR DI(4) XOR DI(1) XOR DI(33) XOR DI(9) XOR DI(43) XOR DI(47) XOR DI(59) XOR DI(36) XOR DI(13) XOR DI(51) XOR DI(30) XOR DI(6) XOR DI(10) XOR DI(7) XOR DI(29) XOR DI(48) XOR DI(54) XOR DI(60); + DO(17) <= DI(46) XOR DI(40) XOR DI(19) XOR DI(56) XOR DI(20) XOR DI(57) XOR DI(4) XOR DI(9) XOR DI(43) XOR DI(59) XOR DI(15) XOR DI(12) XOR DI(5) XOR DI(2) XOR DI(34) XOR DI(10) XOR DI(44) XOR DI(48) XOR DI(60) XOR DI(37) XOR DI(14) XOR DI(52) XOR DI(31) XOR DI(7) XOR DI(0) XOR DI(11) XOR DI(8) XOR DI(30) XOR DI(49) XOR DI(55) XOR DI(61); + DO(18) <= DI(47) XOR DI(41) XOR DI(20) XOR DI(57) XOR DI(21) XOR DI(58) XOR DI(5) XOR DI(10) XOR DI(44) XOR DI(60) XOR DI(16) XOR DI(13) XOR DI(6) XOR DI(3) XOR DI(35) XOR DI(11) XOR DI(45) XOR DI(49) XOR DI(61) XOR DI(38) XOR DI(15) XOR DI(53) XOR DI(32) XOR DI(8) XOR DI(1) XOR DI(12) XOR DI(9) XOR DI(31) XOR DI(50) XOR DI(56) XOR DI(62); + DO(19) <= DI(48) XOR DI(42) XOR DI(21) XOR DI(58) XOR DI(22) XOR DI(59) XOR DI(6) XOR DI(11) XOR DI(45) XOR DI(61) XOR DI(17) XOR DI(14) XOR DI(7) XOR DI(4) XOR DI(36) XOR DI(12) XOR DI(46) XOR DI(50) XOR DI(62) XOR DI(39) XOR DI(16) XOR DI(0) XOR DI(54) XOR DI(33) XOR DI(9) XOR DI(2) XOR DI(13) XOR DI(10) XOR DI(32) XOR DI(51) XOR DI(57) XOR DI(63); + DO(20) <= DI(20) XOR DI(49) XOR DI(27) XOR DI(43) XOR DI(22) XOR DI(59) XOR DI(6) XOR DI(23) XOR DI(48) XOR DI(60) XOR DI(7) XOR DI(4) XOR DI(36) XOR DI(12) XOR DI(30) XOR DI(46) XOR DI(62) XOR DI(39) XOR DI(18) XOR DI(15) XOR DI(35) XOR DI(8) XOR DI(5) XOR DI(19) XOR DI(37) XOR DI(16) XOR DI(38) XOR DI(54) XOR DI(9) XOR DI(13) XOR DI(47) XOR DI(32) XOR DI(51) XOR DI(63); + DO(21) <= DI(4) XOR DI(21) XOR DI(58) XOR DI(50) XOR DI(28) XOR DI(44) XOR DI(23) XOR DI(60) XOR DI(7) XOR DI(27) XOR DI(11) XOR DI(30) XOR DI(1) XOR DI(24) XOR DI(49) XOR DI(61) XOR DI(34) XOR DI(35) XOR DI(8) XOR DI(5) XOR DI(37) XOR DI(0) XOR DI(54) XOR DI(13) XOR DI(31) XOR DI(47) XOR DI(32) XOR DI(3) XOR DI(63); + DO(22) <= DI(20) XOR DI(54) XOR DI(39) XOR DI(40) XOR DI(19) XOR DI(10) XOR DI(58) XOR DI(5) XOR DI(22) XOR DI(59) XOR DI(16) XOR DI(3) XOR DI(51) XOR DI(27) XOR DI(11) XOR DI(29) XOR DI(45) XOR DI(24) XOR DI(61) XOR DI(17) XOR DI(34) XOR DI(52) XOR DI(8) XOR DI(28) XOR DI(12) XOR DI(30) XOR DI(31) XOR DI(2) XOR DI(25) XOR DI(50) XOR DI(62); + DO(23) <= DI(21) XOR DI(55) XOR DI(40) XOR DI(41) XOR DI(20) XOR DI(11) XOR DI(59) XOR DI(6) XOR DI(23) XOR DI(60) XOR DI(17) XOR DI(4) XOR DI(52) XOR DI(28) XOR DI(12) XOR DI(30) XOR DI(46) XOR DI(25) XOR DI(62) XOR DI(18) XOR DI(35) XOR DI(53) XOR DI(0) XOR DI(9) XOR DI(29) XOR DI(13) XOR DI(31) XOR DI(32) XOR DI(3) XOR DI(26) XOR DI(51) XOR DI(63); + DO(24) <= DI(22) XOR DI(40) XOR DI(56) XOR DI(41) XOR DI(20) XOR DI(42) XOR DI(21) XOR DI(58) XOR DI(12) XOR DI(48) XOR DI(60) XOR DI(6) XOR DI(17) XOR DI(7) XOR DI(11) XOR DI(24) XOR DI(55) XOR DI(61) XOR DI(39) XOR DI(34) XOR DI(18) XOR DI(35) XOR DI(5) XOR DI(16) XOR DI(53) XOR DI(38) XOR DI(9) XOR DI(29) XOR DI(13) XOR DI(31) XOR DI(47) XOR DI(3) XOR DI(26) XOR DI(63); + DO(25) <= DI(23) XOR DI(41) XOR DI(20) XOR DI(57) XOR DI(42) XOR DI(21) XOR DI(58) XOR DI(43) XOR DI(22) XOR DI(59) XOR DI(16) XOR DI(13) XOR DI(3) XOR DI(11) XOR DI(49) XOR DI(55) XOR DI(61) XOR DI(38) XOR DI(33) XOR DI(34) XOR DI(7) XOR DI(18) XOR DI(52) XOR DI(8) XOR DI(1) XOR DI(12) XOR DI(9) XOR DI(25) XOR DI(56) XOR DI(62); + DO(26) <= DI(24) XOR DI(42) XOR DI(21) XOR DI(58) XOR DI(43) XOR DI(22) XOR DI(59) XOR DI(44) XOR DI(23) XOR DI(60) XOR DI(17) XOR DI(14) XOR DI(4) XOR DI(12) XOR DI(50) XOR DI(56) XOR DI(62) XOR DI(39) XOR DI(34) XOR DI(35) XOR DI(8) XOR DI(19) XOR DI(53) XOR DI(0) XOR DI(9) XOR DI(2) XOR DI(13) XOR DI(10) XOR DI(26) XOR DI(57) XOR DI(63); + DO(27) <= DI(4) XOR DI(25) XOR DI(43) XOR DI(22) XOR DI(59) XOR DI(44) XOR DI(23) XOR DI(48) XOR DI(60) XOR DI(6) XOR DI(17) XOR DI(52) XOR DI(45) XOR DI(30) XOR DI(24) XOR DI(55) XOR DI(61) XOR DI(39) XOR DI(34) XOR DI(18) XOR DI(15) XOR DI(5) XOR DI(19) XOR DI(16) XOR DI(0) XOR DI(38) XOR DI(33) XOR DI(13) XOR DI(32) XOR DI(51) XOR DI(57) XOR DI(63); + DO(28) <= DI(5) XOR DI(26) XOR DI(10) XOR DI(44) XOR DI(23) XOR DI(48) XOR DI(54) XOR DI(60) XOR DI(3) XOR DI(27) XOR DI(11) XOR DI(45) XOR DI(24) XOR DI(49) XOR DI(55) XOR DI(61) XOR DI(38) XOR DI(7) XOR DI(4) XOR DI(18) XOR DI(36) XOR DI(53) XOR DI(32) XOR DI(30) XOR DI(9) XOR DI(46) XOR DI(31) XOR DI(25) XOR DI(56) XOR DI(62); + DO(29) <= DI(6) XOR DI(27) XOR DI(11) XOR DI(45) XOR DI(24) XOR DI(49) XOR DI(55) XOR DI(61) XOR DI(4) XOR DI(28) XOR DI(12) XOR DI(46) XOR DI(25) XOR DI(50) XOR DI(56) XOR DI(62) XOR DI(39) XOR DI(8) XOR DI(5) XOR DI(19) XOR DI(37) XOR DI(54) XOR DI(33) XOR DI(31) XOR DI(10) XOR DI(47) XOR DI(32) XOR DI(26) XOR DI(57) XOR DI(63); + DO(30) <= DI(17) XOR DI(14) XOR DI(7) XOR DI(4) XOR DI(36) XOR DI(52) XOR DI(28) XOR DI(1) XOR DI(12) XOR DI(30) XOR DI(46) XOR DI(25) XOR DI(50) XOR DI(56) XOR DI(62) XOR DI(39) XOR DI(35) XOR DI(5) XOR DI(19) XOR DI(16) XOR DI(0) XOR DI(54) XOR DI(29) XOR DI(13) XOR DI(10) XOR DI(47) XOR DI(3) XOR DI(26) XOR DI(51) XOR DI(57) XOR DI(63); + DO(31) <= DI(39) XOR DI(34) XOR DI(18) XOR DI(15) XOR DI(35) XOR DI(8) XOR DI(5) XOR DI(19) XOR DI(37) XOR DI(16) XOR DI(53) XOR DI(0) XOR DI(38) XOR DI(54) XOR DI(33) XOR DI(9) XOR DI(29) XOR DI(2) XOR DI(13) XOR DI(31) XOR DI(10) XOR DI(47) XOR DI(32) XOR DI(3) XOR DI(26) XOR DI(51) XOR DI(57) XOR DI(63); +end architecture; \ No newline at end of file Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast8_tab.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast8_tab.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast8_tab.vhd (revision 3) @@ -0,0 +1,92 @@ +-- +-- crc32_fast8_tab.vhd: A 32-bit CRC (IEEE) table for processing fixed 8 bits in parallel +-- Copyright (C) 2011 CESNET +-- Author(s): Lukas Kekely +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in +-- the documentation and/or other materials provided with the +-- distribution. +-- 3. Neither the name of the Company nor the names of its contributors +-- may be used to endorse or promote products derived from this +-- software without specific prior written permission. +-- +-- This software is provided ``as is'', and any express or implied +-- warranties, including, but not limited to, the implied warranties of +-- merchantability and fitness for a particular purpose are disclaimed. +-- In no event shall the company or contributors be liable for any +-- direct, indirect, incidental, special, exemplary, or consequential +-- damages (including, but not limited to, procurement of substitute +-- goods or services; loss of use, data, or profits; or business +-- interruption) however caused and on any theory of liability, whether +-- in contract, strict liability, or tort (including negligence or +-- otherwise) arising in any way out of the use of this software, even +-- if advised of the possibility of such damage. +-- +-- $Id$ +-- +-- TODO: +-- +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; +use IEEE.std_logic_unsigned.all; +use IEEE.numeric_std.all; +use WORK.math_pack.all; +-- ---------------------------------------------------------------------------- +-- Entity declaration +-- ---------------------------------------------------------------------------- +entity crc32_fast8_tab is + port( + DI : in std_logic_vector(8-1 downto 0); + DO : out std_logic_vector(31 downto 0) + ); +end entity crc32_fast8_tab; + +-- ---------------------------------------------------------------------------- +-- Architecture declaration +-- ---------------------------------------------------------------------------- +architecture arch of crc32_fast8_tab is +begin +-- 32-bit CRC equations processing 8 bits in parallel (VHDL code) +-- Generator polynomial: 0x104C11DB7 + DO(0) <= DI(2); + DO(1) <= DI(0) XOR DI(3); + DO(2) <= DI(0) XOR DI(1) XOR DI(4); + DO(3) <= DI(1) XOR DI(2) XOR DI(5); + DO(4) <= DI(2) XOR DI(3) XOR DI(0) XOR DI(6); + DO(5) <= DI(3) XOR DI(4) XOR DI(1) XOR DI(7); + DO(6) <= DI(4) XOR DI(5); + DO(7) <= DI(5) XOR DI(0) XOR DI(6); + DO(8) <= DI(6) XOR DI(1) XOR DI(7); + DO(9) <= DI(7); + DO(10) <= DI(2); + DO(11) <= DI(3); + DO(12) <= DI(0) XOR DI(4); + DO(13) <= DI(0) XOR DI(1) XOR DI(5); + DO(14) <= DI(1) XOR DI(2) XOR DI(6); + DO(15) <= DI(2) XOR DI(3) XOR DI(7); + DO(16) <= DI(0) XOR DI(2) XOR DI(3) XOR DI(4); + DO(17) <= DI(0) XOR DI(1) XOR DI(3) XOR DI(4) XOR DI(5); + DO(18) <= DI(1) XOR DI(2) XOR DI(4) XOR DI(5) XOR DI(0) XOR DI(6); + DO(19) <= DI(2) XOR DI(3) XOR DI(5) XOR DI(6) XOR DI(1) XOR DI(7); + DO(20) <= DI(3) XOR DI(4) XOR DI(6) XOR DI(7); + DO(21) <= DI(2) XOR DI(4) XOR DI(5) XOR DI(7); + DO(22) <= DI(2) XOR DI(3) XOR DI(5) XOR DI(6); + DO(23) <= DI(3) XOR DI(4) XOR DI(6) XOR DI(7); + DO(24) <= DI(0) XOR DI(2) XOR DI(4) XOR DI(5) XOR DI(7); + DO(25) <= DI(1) XOR DI(2) XOR DI(3) XOR DI(5) XOR DI(0) XOR DI(6); + DO(26) <= DI(2) XOR DI(3) XOR DI(4) XOR DI(0) XOR DI(6) XOR DI(1) XOR DI(7); + DO(27) <= DI(3) XOR DI(4) XOR DI(5) XOR DI(1) XOR DI(7); + DO(28) <= DI(4) XOR DI(5) XOR DI(0) XOR DI(6); + DO(29) <= DI(5) XOR DI(0) XOR DI(6) XOR DI(1) XOR DI(7); + DO(30) <= DI(0) XOR DI(6) XOR DI(1) XOR DI(7); + DO(31) <= DI(1) XOR DI(7); +end architecture; \ No newline at end of file Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast_tab.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast_tab.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_fast_tab.vhd (revision 3) @@ -0,0 +1,124 @@ +-- +-- crc32_fast_tab.vhd: A 32-bit CRC (IEEE) table for processing generic number of unmasked bits in parallel +-- Copyright (C) 2011 CESNET +-- Author(s): Lukas Kekely +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in +-- the documentation and/or other materials provided with the +-- distribution. +-- 3. Neither the name of the Company nor the names of its contributors +-- may be used to endorse or promote products derived from this +-- software without specific prior written permission. +-- +-- This software is provided ``as is'', and any express or implied +-- warranties, including, but not limited to, the implied warranties of +-- merchantability and fitness for a particular purpose are disclaimed. +-- In no event shall the company or contributors be liable for any +-- direct, indirect, incidental, special, exemplary, or consequential +-- damages (including, but not limited to, procurement of substitute +-- goods or services; loss of use, data, or profits; or business +-- interruption) however caused and on any theory of liability, whether +-- in contract, strict liability, or tort (including negligence or +-- otherwise) arising in any way out of the use of this software, even +-- if advised of the possibility of such damage. +-- +-- $Id$ +-- +-- TODO: +-- +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; +use IEEE.std_logic_unsigned.all; +use IEEE.numeric_std.all; +use WORK.math_pack.all; +-- ---------------------------------------------------------------------------- +-- Entity declaration +-- ---------------------------------------------------------------------------- +entity crc32_fast_tab is + generic( + DATA_WIDTH : integer := 64 + ); + port( + DI : in std_logic_vector(DATA_WIDTH-1 downto 0); + DO : out std_logic_vector(31 downto 0) + ); +end entity crc32_fast_tab; + +-- ---------------------------------------------------------------------------- +-- Architecture declaration +-- ---------------------------------------------------------------------------- +architecture arch of crc32_fast_tab is +begin + DW8_gen : if DATA_WIDTH = 8 generate + crc_tab_i : entity work.crc32_fast8_tab + port map ( + DI => DI, + DO => DO); + end generate; + + DW16_gen : if DATA_WIDTH = 16 generate + crc_tab_i : entity work.crc32_fast16_tab + port map ( + DI => DI, + DO => DO); + end generate; + + DW24_gen : if DATA_WIDTH = 24 generate + crc_tab_i : entity work.crc32_fast24_tab + port map ( + DI => DI, + DO => DO); + end generate; + + DW32_gen : if DATA_WIDTH = 32 generate + crc_tab_i : entity work.crc32_fast32_tab + port map ( + DI => DI, + DO => DO); + end generate; + + DW64_gen : if DATA_WIDTH = 64 generate + crc_tab_i : entity work.crc32_fast64_tab + port map ( + DI => DI, + DO => DO); + end generate; + + DW128_gen : if DATA_WIDTH = 128 generate + crc_tab_i : entity work.crc32_fast128_tab + port map ( + DI => DI, + DO => DO); + end generate; + + DW256_gen : if DATA_WIDTH = 256 generate + crc_tab_i : entity work.crc32_fast256_tab + port map ( + DI => DI, + DO => DO); + end generate; + + DW512_gen : if DATA_WIDTH = 512 generate + crc_tab_i : entity work.crc32_fast512_tab + port map ( + DI => DI, + DO => DO); + end generate; + + DW1024_gen : if DATA_WIDTH = 1024 generate + crc_tab_i : entity work.crc32_fast1024_tab + port map ( + DI => DI, + DO => DO); + end generate; + +end architecture; \ No newline at end of file Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_gen.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_gen.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_gen.vhd (revision 3) @@ -0,0 +1,188 @@ +-- +-- crc32_gen.vhd: 32-bit CRC module processing generic number of bits in parallel +-- Copyright (C) 2011 CESNET +-- Author(s): Lukas Kekely +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in +-- the documentation and/or other materials provided with the +-- distribution. +-- 3. Neither the name of the Company nor the names of its contributors +-- may be used to endorse or promote products derived from this +-- software without specific prior written permission. +-- +-- This software is provided ``as is'', and any express or implied +-- warranties, including, but not limited to, the implied warranties of +-- merchantability and fitness for a particular purpose are disclaimed. +-- In no event shall the company or contributors be liable for any +-- direct, indirect, incidental, special, exemplary, or consequential +-- damages (including, but not limited to, procurement of substitute +-- goods or services; loss of use, data, or profits; or business +-- interruption) however caused and on any theory of liability, whether +-- in contract, strict liability, or tort (including negligence or +-- otherwise) arising in any way out of the use of this software, even +-- if advised of the possibility of such damage. +-- +-- $Id$ +-- +-- TODO: +-- +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; +use IEEE.std_logic_unsigned.all; +use IEEE.numeric_std.all; +use WORK.math_pack.all; + +entity crc32_gen is + generic( + DATA_WIDTH : integer := 64; + REG_BITMAP : integer := 0 + ); + port( + DI : in std_logic_vector(DATA_WIDTH-1 downto 0); + DI_DV : in std_logic; + EOP : in std_logic; + MASK : in std_logic_vector(log2(DATA_WIDTH/8)-1 downto 0); + CLK : in std_logic; + RESET : in std_logic; + CRC : out std_logic_vector(31 downto 0); + DO_DV : out std_logic + ); +end entity crc32_gen; + +architecture crc32_gen_arch of crc32_gen is + constant MW : integer := log2(DATA_WIDTH/8); + + signal crc_reg: std_logic_vector(DATA_WIDTH-1 downto 0); + signal crc_reg_input: std_logic_vector(DATA_WIDTH-1 downto 0); + signal tctl, deop : std_logic; + signal reg_low, reg_low_data, crctab_do, crctab_tree_do : std_logic_vector(31 downto 0); + signal mx_di, do_reg : std_logic_vector(31 downto 0); + + signal reg_mask : std_logic_vector(log2(DATA_WIDTH/8)-1 downto 0); + signal reg_di : std_logic_vector(DATA_WIDTH-1 downto 0); + + signal tree_vld : std_logic; + +begin + assert DATA_WIDTH >= 32 and DATA_WIDTH mod 8 = 0 report "CRC32: Wrong DATA_WIDTH set! DATA_WIDTH must be multiple of 8 and greater or equal to 32." severity error; + + crc32_gen_tab_instance: entity work.crc32_fast_tab + generic map( + DATA_WIDTH => DATA_WIDTH + ) + port map( + DI => crc_reg, + DO => crctab_do + ); + + crc32_gen_tab_tree_instance: entity work.crc32_gen_tab_tree + generic map( + DATA_WIDTH => DATA_WIDTH, + REG_BITMAP => REG_BITMAP + ) + port map( + CLK => CLK, + DI => crc_reg, + DI_DV => deop, + MASK => reg_mask, + DO => crctab_tree_do, + DO_DV => tree_vld + ); + + crc32_gen_fsm_instance: entity work.crc32_gen_fsm + port map( + CLK => CLK, + RESET => RESET, + DI_DV => DI_DV, + EOP => EOP, + TCTL => tctl + ); + + reg_di_input_long_gen : if (DATA_WIDTH > 32) generate + reg_di <= DI(DATA_WIDTH-1 downto 32) & mx_di; + end generate; + reg_di_input_short_gen : if (DATA_WIDTH <= 32) generate + reg_di <= mx_di(DATA_WIDTH-1 downto 0); + end generate; + + crc_reg_proc: process(CLK, RESET) + begin + if RESET = '1' then + crc_reg <= (others => '0'); + elsif CLK'event AND clk = '1' then + if DI_DV = '1' then + crc_reg <= crc_reg_input; + end if; + end if; + end process; + crc_di_input_long_gen : if (DATA_WIDTH > 32) generate + crc_reg_input <= reg_di(DATA_WIDTH-1 downto 32) & reg_low; + end generate; + crc_di_input_short_gen : if (DATA_WIDTH <= 32) generate + crc_reg_input <= reg_low(DATA_WIDTH-1 downto 0); + end generate; + + + process(CLK, RESET) + begin + if RESET = '1' then + deop <= '0'; + elsif CLK = '1' AND CLK'event then + deop <= EOP and DI_DV; + end if; + end process; + + process(CLK, RESET) + begin + if RESET = '1' then + DO_DV <= '0'; + elsif CLK = '1' AND CLK'event then + DO_DV <= tree_vld; + end if; + end process; + + process(CLK, RESET) + begin + if RESET = '1' then + do_reg <= (others => '0'); + elsif CLK = '1' AND CLK'event then + do_reg <= crctab_tree_do; + end if; + end process; + + + -- register reg_mask ------------------------------------------------- + reg_maskp: process(RESET, CLK) + begin + if (RESET = '1') then + reg_mask <= (others => '0'); + elsif (CLK'event AND CLK = '1') then + reg_mask <= MASK; + end if; + end process; + + + -- mx_di multiplexor - handles special situation when MASK > DATA_WIDTH/8 - 4 + mx_di <= X"00" & DI(23 downto 0) when MASK = conv_std_logic_vector(DATA_WIDTH/8-3,MW) else + X"0000" & DI(15 downto 0) when MASK = conv_std_logic_vector(DATA_WIDTH/8-2,MW) else + X"000000" & DI( 7 downto 0) when MASK = conv_std_logic_vector(DATA_WIDTH/8-1,MW) else + DI(31 downto 0); + + reg_low_data <= crctab_do XOR reg_di(31 downto 0) when (tctl = '0') else + NOT reg_di(31 downto 0); + + reg_low <= reg_low_data; + + CRC <= NOT (do_reg(7 downto 0) & do_reg(15 downto 8) & do_reg(23 downto 16) + & do_reg(31 downto 24)); + +end architecture; Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_gen_fsm.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_gen_fsm.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_gen_fsm.vhd (revision 3) @@ -0,0 +1,105 @@ +-- +-- crc32_gen_fsm.vhd: FSM for crc32_gen module +-- Copyright (C) 2011 CESNET +-- Author(s): Lukas Kekely +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in +-- the documentation and/or other materials provided with the +-- distribution. +-- 3. Neither the name of the Company nor the names of its contributors +-- may be used to endorse or promote products derived from this +-- software without specific prior written permission. +-- +-- This software is provided ``as is'', and any express or implied +-- warranties, including, but not limited to, the implied warranties of +-- merchantability and fitness for a particular purpose are disclaimed. +-- In no event shall the company or contributors be liable for any +-- direct, indirect, incidental, special, exemplary, or consequential +-- damages (including, but not limited to, procurement of substitute +-- goods or services; loss of use, data, or profits; or business +-- interruption) however caused and on any theory of liability, whether +-- in contract, strict liability, or tort (including negligence or +-- otherwise) arising in any way out of the use of this software, even +-- if advised of the possibility of such damage. +-- +-- $Id$ +-- +-- TODO: +-- +-- + +library IEEE; +use IEEE.std_logic_1164.all; +-- ---------------------------------------------------------------------------- +-- Entity declaration +-- ---------------------------------------------------------------------------- +entity crc32_gen_fsm is + port( + CLK: in std_logic; + RESET: in std_logic; + DI_DV: in std_logic; + EOP: in std_logic; + TCTL: out std_logic + ); +end entity crc32_gen_fsm; + +-- ---------------------------------------------------------------------------- +-- Architecture declaration +-- ---------------------------------------------------------------------------- +architecture crc32_gen_fsm_arch of crc32_gen_fsm is + + type fsm_states is (SL, SC); + signal curr_state, next_state : fsm_states; + +begin +-- ------------------------------------------------------- +sync_logic : process(RESET, CLK) +begin + if (RESET = '1') then + curr_state <= SL; + elsif (CLK'event AND CLK = '1') then + curr_state <= next_state; + end if; +end process sync_logic; + +-- ------------------------------------------------------- +next_state_logic : process(curr_state, DI_DV, EOP) +begin + case (curr_state) is + when SL => + if EOP = '0' AND DI_DV = '1' then + next_state <= SC; + else + next_state <= SL; + end if; + when SC => + if EOP = '1' AND DI_DV = '1' then + next_state <= SL; + else + next_state <= SC; + end if; + when others => next_state <= SL; + end case; +end process next_state_logic; + +-- ------------------------------------------------------- +output_logic : process(curr_state, DI_DV, EOP) +begin + case (curr_state) is + when SL => + TCTL <= '1'; + when SC => + TCTL <= '0'; + when others => + TCTL <= '1'; + end case; +end process output_logic; + +end architecture crc32_gen_fsm_arch; + Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_gen_tab_tree.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_gen_tab_tree.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/crc/crc32_gen_tab_tree.vhd (revision 3) @@ -0,0 +1,232 @@ +-- +-- crc32_gen_tab.vhd: A 32-bit CRC (IEEE) table for processing generic number of bits in parallel +-- Copyright (C) 2011 CESNET +-- Author(s): Lukas Kekely +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions +-- are met: +-- 1. Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- 2. Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in +-- the documentation and/or other materials provided with the +-- distribution. +-- 3. Neither the name of the Company nor the names of its contributors +-- may be used to endorse or promote products derived from this +-- software without specific prior written permission. +-- +-- This software is provided ``as is'', and any express or implied +-- warranties, including, but not limited to, the implied warranties of +-- merchantability and fitness for a particular purpose are disclaimed. +-- In no event shall the company or contributors be liable for any +-- direct, indirect, incidental, special, exemplary, or consequential +-- damages (including, but not limited to, procurement of substitute +-- goods or services; loss of use, data, or profits; or business +-- interruption) however caused and on any theory of liability, whether +-- in contract, strict liability, or tort (including negligence or +-- otherwise) arising in any way out of the use of this software, even +-- if advised of the possibility of such damage. +-- +-- $Id$ +-- +-- TODO: +-- +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; +use IEEE.std_logic_unsigned.all; +use IEEE.numeric_std.all; +use WORK.math_pack.all; +-- ---------------------------------------------------------------------------- +-- Entity declaration +-- ---------------------------------------------------------------------------- +entity crc32_gen_tab_tree is + generic( + -- must be power of 2 and higher or equal to 32 + DATA_WIDTH : integer := 64; + REG_BITMAP : integer := 0 + ); + port( + CLK : in std_logic; + DI : in std_logic_vector(DATA_WIDTH-1 downto 0); + DI_DV : in std_logic; + MASK : in std_logic_vector(log2(DATA_WIDTH/8)-1 downto 0); + DO : out std_logic_vector(31 downto 0); + DO_DV : out std_logic + ); +end entity crc32_gen_tab_tree; + +-- ---------------------------------------------------------------------------- +-- Architecture declaration +-- ---------------------------------------------------------------------------- +architecture crc32_gen_tab_arch of crc32_gen_tab_tree is + constant MW : integer := log2(DATA_WIDTH/8); + signal crc_fin : std_logic_vector(31 downto 0); + type pipe_t is array (0 to MW-2) of std_logic_vector(DATA_WIDTH-1 downto 0); + type pipe_mask_t is array (0 to MW-2) of std_logic_vector(MW-1 downto 0); + type pipe_crc_t is array (0 to MW-2) of std_logic_vector(31 downto 0); + signal indata_pipe : pipe_t; + signal indata_pipe_MW_2_d : std_logic_vector(DATA_WIDTH-1 downto 0); + signal outdata_pipe : pipe_t; + signal xordata_pipe : pipe_t; + signal mask_pipe : pipe_mask_t; + signal crc_pipe : pipe_crc_t; + signal dv_pipe : std_logic_vector(MW-2 downto 0); + signal crc32 : std_logic_vector(31 downto 0); + signal crc24 : std_logic_vector(31 downto 0); + signal crc16 : std_logic_vector(31 downto 0); + signal crc8 : std_logic_vector(31 downto 0); + + signal crc32_d : std_logic_vector(31 downto 0); + signal crc24_d : std_logic_vector(31 downto 0); + signal crc16_d : std_logic_vector(31 downto 0); + signal crc8_d : std_logic_vector(31 downto 0); + + signal do_32 : std_logic_vector(31 downto 0); + signal do_24 : std_logic_vector(31 downto 0); + signal do_16 : std_logic_vector(31 downto 0); + signal do_8 : std_logic_vector(31 downto 0); + + signal do_dv_d : std_logic; + signal do_dv_dd : std_logic; + + signal mask_pipe_d : std_logic_vector(1 downto 0); + signal mask_pipe_dd : std_logic_vector(1 downto 0); + + signal xxx : std_logic_vector(MW-1 downto 0); + +begin + xxx <= conv_std_logic_vector(REG_BITMAP,MW); + + process(MASK,DI) + begin + indata_pipe(0) <=(DATA_WIDTH-1 downto 32 => '0') & DI(31 downto 0); + for i in 4 to (DATA_WIDTH/8-1) loop + if (conv_std_logic_vector(DATA_WIDTH/8-i-1,MW) >= MASK ) then + indata_pipe(0)((i*8)+7 downto i*8) <= DI((i*8)+7 downto i*8); + end if; + end loop; + end process; + mask_pipe(0) <= MASK; + dv_pipe(0) <= DI_DV; + + + -- pipelined CRC tree -------------------------------- + tree_gen : if DATA_WIDTH > 32 generate + tree_floor_gen : for i in 0 to MW-3 generate + -- CRC TABLE + crc32_fast_tab_i: entity work.crc32_fast_tab + generic map( + DATA_WIDTH => DATA_WIDTH/(2**(i+1))) + port map( + DI => indata_pipe(i)(DATA_WIDTH/(2**(i+1))-1 downto 0), + DO => crc_pipe(i)); + + -- DATA MUX + outdata_pipe(i)(max(32,(DATA_WIDTH/(2**(i+1))))-1 downto 0) <= indata_pipe(i)(max(32,(DATA_WIDTH/(2**(i+1))))-1 downto 0) when mask_pipe(i)(MW-i-1) = '1' else + xordata_pipe(i)(max(32,(DATA_WIDTH/(2**(i+1))))-1 downto 0); + + -- DATA-CRC XOR + xor32h_gen : if (DATA_WIDTH/(2**(i+1))) > 32 generate + xordata_pipe(i)((DATA_WIDTH/(2**(i+1)))-1 downto 0) <= indata_pipe(i)((DATA_WIDTH/(2**(i)))-1 downto 32+(DATA_WIDTH/(2**(i+1)))) & (indata_pipe(i)((32+(DATA_WIDTH/(2**(i+1))))-1 downto (DATA_WIDTH/(2**(i+1)))) XOR crc_pipe(i)); + end generate; + xor32_gen : if (DATA_WIDTH/(2**(i+1))) = 32 generate + xordata_pipe(i)(31 downto 0) <= indata_pipe(i)(63 downto 32) XOR crc_pipe(i); + end generate; + + -- MASK PIPELINED + reg_mask_gen : if conv_std_logic_vector(REG_BITMAP,MW)(i)='1' generate + process(CLK) + begin + if CLK'event and CLK='1' then + mask_pipe(i+1)(MW-i-2 downto 0) <= mask_pipe(i)(MW-i-2 downto 0); + end if; + end process; + end generate; + noreg_mask_gen : if conv_std_logic_vector(REG_BITMAP,MW)(i)='0' generate + mask_pipe(i+1)(MW-i-2 downto 0) <= mask_pipe(i)(MW-i-2 downto 0); + end generate; + -- DATA PIPELINED + reg_data_gen : if conv_std_logic_vector(REG_BITMAP,MW)(i)='1' generate + process(CLK) + begin + if CLK'event and CLK='1' then + indata_pipe(i+1) <= outdata_pipe(i); + dv_pipe(i+1) <= dv_pipe(i); + end if; + end process; + end generate; + noreg_data_gen : if conv_std_logic_vector(REG_BITMAP,MW)(i)='0' generate + indata_pipe(i+1) <= outdata_pipe(i); + dv_pipe(i+1) <= dv_pipe(i); + end generate; + end generate; + end generate; + + crc32_fast_tab_32: entity work.crc32_fast_tab + generic map( + DATA_WIDTH => 32) + port map( + DI => indata_pipe(MW-2)(31 downto 0), + DO => crc32); + crc32_fast_tab_24: entity work.crc32_fast_tab + generic map( + DATA_WIDTH => 24) + port map( + DI => indata_pipe(MW-2)(23 downto 0), + DO => crc24); + crc32_fast_tab_16: entity work.crc32_fast_tab + generic map( + DATA_WIDTH => 16) + port map( + DI => indata_pipe(MW-2)(15 downto 0), + DO => crc16); + crc32_fast_tab_8: entity work.crc32_fast_tab + generic map( + DATA_WIDTH => 8) + port map( + DI => indata_pipe(MW-2)(7 downto 0), + DO => crc8); + + + do_pipeline_proc : process (CLK) + begin + if rising_edge(CLK) then + crc8_d <= crc8; + crc16_d <= crc16; + crc24_d <= crc24; + crc32_d <= crc32; + do_dv_d <= dv_pipe(MW-2); + + indata_pipe_MW_2_d <= indata_pipe(MW-2); + + + do_8 <= ((X"00" & indata_pipe_MW_2_d(31 downto 8)) XOR crc8_d); + do_16 <= ((X"0000" & indata_pipe_MW_2_d(31 downto 16)) XOR crc16_d); + do_24 <= ((X"000000" & indata_pipe_MW_2_d(31 downto 24)) XOR crc24_d); + do_32 <= (crc32_d); + do_dv_dd <= do_dv_d; + + mask_pipe_d <= mask_pipe(MW-2)(1 downto 0); + mask_pipe_dd <= mask_pipe_d; + + end if; + end process; + + + + + DO <= do_8 when mask_pipe_dd ="11" else + do_16 when mask_pipe_dd ="10" else + do_24 when mask_pipe_dd ="01" else + do_32; + + DO_DV <= do_dv_dd; + +end architecture crc32_gen_tab_arch; + + + Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_gen.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_gen.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_gen.vhd (revision 3) @@ -0,0 +1,433 @@ +------------------------------------------------------------------------------- +-- +-- (C) Copyright 2013 DFC Design, s.r.o., Brno, Czech Republic +-- +------------------------------------------------------------------------------- +-- This file is part of UDP/IPv4 for 10 G Ethernet core. +-- +-- UDP/IPv4 for 10 G Ethernet core is free software: you can +-- redistribute it and/or modify it under the terms of +-- the GNU Lesser General Public License as published by the Free +-- Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- UDP/IPv4 for 10 G Ethernet core is distributed in the hope that +-- it will be useful, but WITHOUT ANY WARRANTY; without even +-- the implied warranty of MERCHANTABILITY or FITNESS FOR A +-- PARTICULAR PURPOSE. See the GNU Lesser General Public License +-- for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with UDP/IPv4 for 10 G Ethernet core. If not, +-- see . +------------------------------------------------------------------------------- +-- +-- This core generates UDP/IPv4 Ethernet frames. +-- It is supposed to be connected to XGMII like interface. +-- UDP checksum is not used (set 0). +-- IP fragmentation is not supported. User is responsible for keeping packet +-- size under MTU. +-- Core ensures minimal standard IPG 96 bits is transmitted between every +-- two frames. +-- No checks are performed on validity of IP and MAC addresses. +-- ARP is not implemented - user must provide valid MAC & IP address pair. +-- Broadcasts are supported setting destination MAC to ff:ff:ff:ff:ff:ff and +-- IP to correct broadcast IP based on netmask or 255.255.255.255. +-- +-- If BUSY signal is low, transmission starts when user asserts +-- TX_EN signal. All inputs - MAC and IP addresses, UDP ports, data length - +-- must be valid when TX_EN is asserted until BUSY goes high (so if BUSY is +-- low for one cycle together with TX_EN only). +-- +-- After preamble and all headers are transmitted DATA_REN is asserted high +-- by the core to indicate that data transfer will begin. One cycle latency +-- is assumed, so data must be valid (and are consumed) in cycle +-- following the one DATA_REN is asserted. +-- +-- User has to provide new word in each cycle. There is no flow control. +-- +-- Exactly DATA_LEN bytes is captured on DATA_IN and sent as UDP payload. +-- +-- All ports must be synchronized to TX_CLK which should be XGMII TX clock. +-- It is normally 156.25 MHz. +-- +-- +------------------------------------------------------------------------------- + + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +entity frame_gen is + port ( + RESET : in std_logic; -- Async reset + TX_EN : in std_logic := '1'; -- Transmitt enable + BUSY : out std_logic; + IDLE_IFG : out std_logic; + -- + DATA_REN : out std_logic; -- Data read enable (1 cycle latency is assumed) + DATA_IN : in std_logic_vector(63 downto 0); -- Data input + DATA_LEN : in std_logic_vector(15 downto 0); -- Number of data bytes to be transferred (should be multiple of 8) + -- ETH/IP/UDP Configuration + SRC_MAC : in std_logic_vector(47 downto 0); -- + DST_MAC : in std_logic_vector(47 downto 0); -- + SRC_IP : in std_logic_vector(31 downto 0); -- + DST_IP : in std_logic_vector(31 downto 0); -- + SRC_PORT : in std_logic_vector(15 downto 0); -- + DST_PORT : in std_logic_vector(15 downto 0); -- + + -- XGMII TX interface + TX_CLK : in std_logic; -- XGMII TX clock input + TXD : out std_logic_vector(63 downto 0); -- XGMII TX data, TX_CLK sync + TXC : out std_logic_vector( 7 downto 0) -- XGMII TX command, TX_CLK sync + ); +end frame_gen; + +architecture behavioral of frame_gen is + +constant C_SOP : std_logic_vector(7 downto 0) := X"FB"; +constant C_EOP : std_logic_vector(7 downto 0) := X"FD"; + +type t_state is (IDLE, + PREAMBLE, -- + MAC0, -- SRC_MAC(1:0) & DST_MAC + MAC_IP0, -- SERVICES & IP_VER & TYPE & SRC_MAC(5:2) 2 + IP1, -- PROTO(0x11) & TTL(0x80) & FLGS_OFFSET & ID(zeros) & Length(hdr+data [bytes]) 64 + IP2, -- DST_IP & SRC_IP & CHKSUM 64 + IP3_UDP, -- UDP_LEN & UDP_DST_P & UDP_SRC_P & DST_IP + UDP_DATA, -- Data & UDP_CHSUM + DATA, -- Data + DATA_LAST, + EOP, + IFG); + +signal fsm_state : t_state; + +signal sum : std_logic_vector(19 downto 0); +signal data_cntr : std_logic_vector(15 downto 0); +signal data_dly : std_logic_vector(15 downto 0); +signal tx_d_i : std_logic_vector(63 downto 0) := (others => '0'); +signal tx_c_i : std_logic_vector( 7 downto 0) := (others => '0'); +signal txd_i_dly0 : std_logic_vector(63 downto 0) := (others => '0'); +signal txc_i_dly0 : std_logic_vector( 7 downto 0) := (others => '0'); +signal txd_i_dly1 : std_logic_vector(63 downto 0) := (others => '0'); +signal txc_i_dly1 : std_logic_vector( 7 downto 0) := (others => '0'); +signal txd_i_dly2 : std_logic_vector(63 downto 0) := (others => '0'); +signal txc_i_dly2 : std_logic_vector( 7 downto 0) := (others => '0'); +signal txd_i_dly3 : std_logic_vector(63 downto 0) := (others => '0'); +signal txc_i_dly3 : std_logic_vector( 7 downto 0) := (others => '0'); + +signal crc_mask_dly0 : std_logic_vector( 2 downto 0); +signal crc_mask_dly1 : std_logic_vector( 2 downto 0); +signal crc_mask_dly2 : std_logic_vector( 2 downto 0); +signal crc_mask_dly3 : std_logic_vector( 2 downto 0); +signal crc_mask_dly4 : std_logic_vector( 2 downto 0); + +signal tx_d_i_vld : std_logic; +signal crc32_i : std_logic_vector(31 downto 0); +signal crc32 : std_logic_vector(31 downto 0); +signal crc_dly : std_logic_vector(31 downto 0); +signal crc_mask : std_logic_vector( 2 downto 0) := "000"; +signal crc_eop : std_logic; +signal crc_vld : std_logic; +signal crc_vld_dly : std_logic; + +signal src_mac_reg : std_logic_vector(47 downto 0); +signal dst_mac_reg : std_logic_vector(47 downto 0); +signal src_ip_reg : std_logic_vector(31 downto 0); +signal dst_ip_reg : std_logic_vector(31 downto 0); +signal src_port_reg : std_logic_vector(15 downto 0); +signal dst_port_reg : std_logic_vector(15 downto 0); +signal data_len_reg : std_logic_vector(DATA_LEN'range); + +begin + +FRAME_GEN_FSM: process(RESET, TX_CLK) +variable chksum : std_logic_vector(15 downto 0); +variable tmpsum : std_logic_vector(19 downto 0); +begin + if RESET = '1' then + fsm_state <= IDLE; + tx_d_i_vld <= '0'; + DATA_REN <= '0'; + elsif TX_CLK'event and TX_CLK = '1' then + crc_eop <= '0'; + IDLE_IFG <= '0'; + case fsm_state is + + when IDLE => + tx_d_i <= X"0707070707070707"; + tx_c_i <= "11111111"; + crc_eop <= '0'; + crc_mask <= "000"; + BUSY <= '0'; + if TX_EN = '1' then + BUSY <= '1'; + fsm_state <= PREAMBLE; + + src_mac_reg <= SRC_MAC; + dst_mac_reg <= DST_MAC; + src_ip_reg <= SRC_IP; + dst_ip_reg <= DST_IP; + src_port_reg <= SRC_PORT; + dst_port_reg <= DST_PORT; + data_len_reg <= DATA_LEN; + + end if; + when PREAMBLE => + tx_d_i <= X"D5555555555555FB"; + tx_c_i <= "00000001"; + fsm_state <= MAC0; + when MAC0 => + tx_d_i_vld <= '1'; + tx_d_i(47 downto 0) <= dst_mac_reg(7 downto 0) & dst_mac_reg(15 downto 8) & dst_mac_reg(23 downto 16) & dst_mac_reg(31 downto 24) & dst_mac_reg(39 downto 32) & dst_mac_reg(47 downto 40); -- DST MAC + tx_d_i(63 downto 48) <= src_mac_reg(39 downto 32) & src_mac_reg(47 downto 40); -- src_mac_reg(5:4) + tx_c_i <= "00000000"; + fsm_state <= MAC_IP0; + when MAC_IP0 => + tx_d_i(31 downto 0) <= src_mac_reg(7 downto 0) & src_mac_reg(15 downto 8) & src_mac_reg(23 downto 16) & src_mac_reg(31 downto 24); -- src_mac_reg(3:0) + tx_d_i(63 downto 32) <= X"0045" & X"0008"; -- SERVICES & IP_VER & ETH_TYPE + tx_c_i <= "00000000"; + sum <= "0000" & X"4500"; + fsm_state <= IP1; + when IP1 => + tmpsum := ("0000" & data_len_reg) + X"1C"; + tx_d_i(15 downto 0) <= tmpsum(7 downto 0) & tmpsum(15 downto 8); -- IP data length (ip_hdr+udp_hdr+data [bytes]) + tx_d_i(63 downto 16) <= X"118000000000"; -- PROTO(0x11) & TTL(0x80) & FLGS_OFFSET & ID(zeros) + tx_c_i <= "00000000"; + sum <= sum + X"8011" + tmpsum(15 downto 0); + fsm_state <= IP2; + when IP2 => + tmpsum := sum + src_ip_reg(15 downto 0) + src_ip_reg(31 downto 16) + dst_ip_reg(15 downto 0) + dst_ip_reg(31 downto 16); + chksum := tmpsum(19 downto 16) + tmpsum(15 downto 0); + tx_d_i(15 downto 0) <= not chksum(7 downto 0) & not chksum(15 downto 8); -- IP header CHKSUM + tx_d_i(47 downto 16) <= src_ip_reg(7 downto 0) & src_ip_reg(15 downto 8) & src_ip_reg(23 downto 16) & src_ip_reg(31 downto 24); -- src_ip_reg + tx_d_i(63 downto 48) <= dst_ip_reg(23 downto 16) & dst_ip_reg(31 downto 24); -- Destination IP + tx_c_i <= "00000000"; + DATA_REN <= '1'; -- Enable reading data + fsm_state <= IP3_UDP; + when IP3_UDP => + tmpsum := ("0000" & data_len_reg) + 8; + tx_d_i(15 downto 0) <= dst_ip_reg(7 downto 0) & dst_ip_reg(15 downto 8); -- Destionation IP + tx_d_i(31 downto 16) <= src_port_reg(7 downto 0) & src_port_reg(15 downto 8); -- UDP SRC port + tx_d_i(47 downto 32) <= dst_port_reg(7 downto 0) & dst_port_reg(15 downto 8); -- UDP DST port + tx_d_i(63 downto 48) <= tmpsum(7 downto 0) & tmpsum(15 downto 8); -- UDP Data length + tx_c_i <= "00000000"; + if data_len_reg > 8 then + DATA_REN <= '1'; -- Enable reading data + else + DATA_REN <= '0'; -- Enable reading data + end if; + fsm_state <= UDP_DATA; + + when UDP_DATA => -- The reset of UDP header & first data + tx_d_i(15 downto 0) <= X"0000"; -- UDP checksum + tx_d_i(63 downto 16) <= DATA_IN(47 downto 0); + if data_len_reg > 18 then -- Min packet length is 60 so MAC hdr 14, IP hdr 20, UDP hdr 8, the rest is 18 + data_cntr <= data_len_reg - 6; -- 6 bytes are transmitted in this cycle + else + data_cntr <= x"000c"; + end if; + data_dly <= DATA_IN(63 downto 48); + fsm_state <= DATA; + if data_len_reg > 16 then + DATA_REN <= '1'; -- Enable reading data + else + DATA_REN <= '0'; -- Enable reading data + end if; + + when DATA => + tx_d_i <= DATA_IN(47 downto 0) & data_dly; + tx_c_i <= "00000000"; + data_dly <= DATA_IN(63 downto 48); + data_cntr <= data_cntr - 8; + DATA_REN <= '1'; + if data_cntr < 16 then + fsm_state <= DATA_LAST; + end if; + if data_cntr < 19 then + DATA_REN <= '0'; + end if; + if data_cntr = 8 then + crc_eop <= '1'; + crc_mask <= "000"; + end if; + + when DATA_LAST => + crc_eop <= '1'; + DATA_REN <= '0'; + case data_cntr(2 downto 0) is + when "000" => + crc_eop <= '0'; + tx_d_i <= X"070707FD00000000"; + tx_c_i <= "11110000"; + tx_d_i_vld <= '0'; + fsm_state <= IDLE; + BUSY <= '0'; + IDLE_IFG <= '1'; + when "001" => + crc_mask <= "111"; + tx_d_i <= X"0707FD00000000" & data_dly(7 downto 0); + tx_c_i <= "11100000"; + fsm_state <= IFG; + when "010" => + crc_mask <= "110"; + tx_d_i <= X"07FD00000000" & data_dly(15 downto 0); + tx_c_i <= "11000000"; + fsm_state <= IFG; + when "011" => + crc_mask <= "101"; + tx_d_i <= X"FD00000000" & DATA_IN(7 downto 0) & data_dly(15 downto 0); + tx_c_i <= "10000000"; + fsm_state <= IFG; + when "100" => + crc_mask <= "100"; + tx_d_i <= X"00000000" & DATA_IN(15 downto 0) & data_dly(15 downto 0); + tx_c_i <= "00000000"; + fsm_state <= EOP; + when "101" => + crc_mask <= "011"; + tx_d_i <= X"000000" & DATA_IN(23 downto 0) & data_dly(15 downto 0); + tx_c_i <= "00000000"; + fsm_state <= EOP; + when "110" => + crc_mask <= "010"; + tx_d_i <= X"0000" & DATA_IN(31 downto 0) & data_dly(15 downto 0); + tx_c_i <= "00000000"; + fsm_state <= EOP; + when "111" => + crc_mask <= "001"; + tx_d_i <= X"00" & DATA_IN(39 downto 0) & data_dly(15 downto 0); + tx_c_i <= "00000000"; + fsm_state <= EOP; + when others => null; + end case; + + when EOP => + tx_d_i_vld <= '0'; + case crc_mask is + when "100" => + tx_d_i <= X"07070707070707FD"; + tx_c_i <= "11111111"; + BUSY <= '0'; + fsm_state <= IDLE; + IDLE_IFG <= '1'; + when "011" => + tx_d_i <= X"070707070707FD00"; -- Last byte of CRC + tx_c_i <= "11111110"; + BUSY <= '0'; + fsm_state <= IDLE; + IDLE_IFG <= '1'; + when "010" => + tx_d_i <= X"0707070707FD0000"; -- Last two bytes of CRC + tx_c_i <= "11111100"; + BUSY <= '0'; + fsm_state <= IDLE; + IDLE_IFG <= '1'; + when "001" => + tx_d_i <= X"07070707FD000000"; -- Last three bytes of CRC + tx_c_i <= "11111000"; + BUSY <= '0'; + fsm_state <= IDLE; + IDLE_IFG <= '1'; + + when others => null; + end case; + + when IFG => + tx_d_i_vld <= '0'; + tx_d_i <= X"0707070707070707"; + tx_c_i <= "11111111"; + BUSY <= '0'; + fsm_state <= IDLE; + IDLE_IFG <= '1'; + + when others => null; + + end case; + end if; +end process; + +CRC_GEN: entity work.crc32_gen +generic map ( + DATA_WIDTH => 64 +) +port map( + DI => tx_d_i, + DI_DV => tx_d_i_vld, + EOP => crc_eop, + MASK => crc_mask, + CLK => TX_CLK, + RESET => RESET, + CRC => crc32_i, + DO_DV => crc_vld +); + + +-- Swap bytes in the CRC word +crc32 <= crc32_i(7 downto 0) & crc32_i(15 downto 8) & crc32_i(23 downto 16) & crc32_i(31 downto 24); + +-- Delay the frame data till the end of CRC computation +XGMII_DELAY: process(TX_CLK) +begin + if (TX_CLK'event and TX_CLK = '1') then + txd_i_dly0 <= tx_d_i; + txc_i_dly0 <= tx_c_i; + crc_mask_dly0 <= crc_mask; + + txd_i_dly1 <= txd_i_dly0; + txc_i_dly1 <= txc_i_dly0; + crc_mask_dly1 <= crc_mask_dly0; + + txd_i_dly2 <= txd_i_dly1; + txc_i_dly2 <= txc_i_dly1; + crc_mask_dly2 <= crc_mask_dly1; + + txd_i_dly3 <= txd_i_dly2; + txc_i_dly3 <= txc_i_dly2; + crc_mask_dly3 <= crc_mask_dly2; + + + + crc_mask_dly4 <= crc_mask_dly3; + + end if; +end process; + +-- process will insert result of crc computation to output +CRC_INSERT: process(TX_CLK) +begin + if (TX_CLK'event and TX_CLK = '1') then + crc_dly <= crc32; + crc_vld_dly <= crc_vld; + TXD <= txd_i_dly3; + TXC <= txc_i_dly3; + + if crc_vld = '1' then + case crc_mask_dly3 is + when "001" => TXD <= crc32( 7 downto 0) & txd_i_dly3(55 downto 0); + when "010" => TXD <= crc32(15 downto 0) & txd_i_dly3(47 downto 0); + when "011" => TXD <= crc32(23 downto 0) & txd_i_dly3(39 downto 0); + when "100" => TXD <= crc32(31 downto 0) & txd_i_dly3(31 downto 0); + when "101" => TXD <= txd_i_dly3(63 downto 56) & crc32(31 downto 0) & txd_i_dly3(23 downto 0); + when "110" => TXD <= txd_i_dly3(63 downto 48) & crc32(31 downto 0) & txd_i_dly3(15 downto 0); + when "111" => TXD <= txd_i_dly3(63 downto 40) & crc32(31 downto 0) & txd_i_dly3(7 downto 0); + when others => null; + end case; + elsif crc_vld_dly = '1' then + case crc_mask_dly4 is + when "000" => TXD <= txd_i_dly3(63 downto 32) & crc_dly(31 downto 0); + when "001" => TXD <= txd_i_dly3(63 downto 24) & crc_dly(31 downto 8); + when "010" => TXD <= txd_i_dly3(63 downto 16) & crc_dly(31 downto 16); + when "011" => TXD <= txd_i_dly3(63 downto 8) & crc_dly(31 downto 24); + when others => null; + end case; + end if; + + end if; +end process; + +end behavioral; + Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_gen_fifo_if.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_gen_fifo_if.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_gen_fifo_if.vhd (revision 3) @@ -0,0 +1,143 @@ +------------------------------------------------------------------------------- +-- +-- (C) Copyright 2017 DFC Design, s.r.o., Brno, Czech Republic +-- Author: Marek Kvas (m.kvas@dfcdesign.cz) +-- +------------------------------------------------------------------------------- +-- This file is part of UDP/IPv4 for 10 G Ethernet core. +-- +-- UDP/IPv4 for 10 G Ethernet core is free software: you can +-- redistribute it and/or modify it under the terms of +-- the GNU Lesser General Public License as published by the Free +-- Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- UDP/IPv4 for 10 G Ethernet core is distributed in the hope that +-- it will be useful, but WITHOUT ANY WARRANTY; without even +-- the implied warranty of MERCHANTABILITY or FITNESS FOR A +-- PARTICULAR PURPOSE. See the GNU Lesser General Public License +-- for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with UDP/IPv4 for 10 G Ethernet core. If not, +-- see . +------------------------------------------------------------------------------- +-- +-- This module is aimed to be used together with frame_tx_if module. +-- Together they provide FIFO buffering for frame_gen module that makes +-- it a bit more convenient in cases where data are not available +-- in every cycle and/or length of data is not known in advance. +-- +-- It transform frame_gen interface to FIFO interface sink. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.frame_pkg.all; + +Library UNISIM; +use UNISIM.vcomponents.all; + + +entity frame_gen_fifo_if is + port ( + CLK : in std_logic; + + DST_MAC : out mac_addr_type; + DST_IP : out ip_addr_type; + SRC_UDP : out udp_port_type; + DST_UDP : out udp_port_type; + + -- Frame generator if + FG_TX_EN : out std_logic; + FG_BUSY : in std_logic; + FG_DATA_REN : in std_logic; + FG_DATA_IN : out std_logic_vector(63 downto 0); + FG_DATA_LEN : out std_logic_vector(15 downto 0); + + -- Tag and data fifos + DFIFO_DATA : in txi_dfifo_data_type; + DFIFO_RD_EN : out std_logic; + DFIFO_EMPTY : in std_logic; + + TFIFO_DATA : in txi_tfifo_data_type; + TFIFO_RD_EN : out std_logic; + TFIFO_EMPTY : in std_logic + + ); +end entity; + +architecture synthesis of frame_gen_fifo_if is + + signal dfifo_data_be : std_logic_vector(7 downto 0); + signal dfifo_data_data : std_logic_vector(63 downto 0); + signal dfifo_data_data_d: std_logic_vector(63 downto 0); + signal dfifo_rd_en_i : std_logic; + signal tfifo_rd_en_i : std_logic; + + signal dst_mac_i : mac_addr_type; + signal dst_udp_i : udp_port_type; + + signal fg_data_ren_d : std_logic; + +begin + + dfifo_data_data <= DFIFO_DATA(63 downto 0); + dfifo_data_be <= DFIFO_DATA(71 downto 64); + + destination_info_proc : process(CLK) + begin + if rising_edge(CLK) then + fg_data_ren_d <= FG_DATA_REN; + dfifo_data_data_d <= dfifo_data_data; + if dfifo_rd_en_i = '1' then + dst_mac_i <= dfifo_data_data(63 downto 16); + dst_udp_i <= dfifo_data_data(15 downto 0); + DST_IP <= dst_mac_i(DST_IP'range); + SRC_UDP <= dst_udp_i; + end if; + end if; + end process; + + + rd_proc : process(TFIFO_EMPTY, FG_BUSY, DFIFO_EMPTY, dfifo_data_be, + fg_data_ren_d, FG_DATA_REN) + begin + dfifo_rd_en_i <= '0'; + tfifo_rd_en_i <= '0'; + FG_TX_EN <= '0'; + + if TFIFO_EMPTY = '0' and FG_BUSY = '0' then + -- Whole frame is ready for us, start transfer + FG_TX_EN <= '1'; + tfifo_rd_en_i <= '1'; + end if; + + + if DFIFO_EMPTY = '0' then + if unsigned(dfifo_data_be) = 0 or + FG_DATA_REN = '1' then + -- This is either destination info or empty word + dfifo_rd_en_i <= '1'; + end if; + end if; + + end process; + + FG_DATA_IN <= dfifo_data_data_d; + FG_DATA_LEN <= TFIFO_DATA; + DFIFO_RD_EN <= dfifo_rd_en_i; + TFIFO_RD_EN <= tfifo_rd_en_i; + + DST_MAC <= dst_mac_i; + DST_UDP <= dst_udp_i; + +end architecture; + + + + Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_pkg.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_pkg.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_pkg.vhd (revision 3) @@ -0,0 +1,137 @@ +------------------------------------------------------------------------------- +-- +-- (C) Copyright 2013 DFC Design, s.r.o., Brno, Czech Republic +-- Author: Marek Kvas (m.kvas@dfcdesign.cz) +-- +------------------------------------------------------------------------------- +-- This file is part of UDP/IPv4 for 10 G Ethernet core. +-- +-- UDP/IPv4 for 10 G Ethernet core is free software: you can +-- redistribute it and/or modify it under the terms of +-- the GNU Lesser General Public License as published by the Free +-- Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- UDP/IPv4 for 10 G Ethernet core is distributed in the hope that +-- it will be useful, but WITHOUT ANY WARRANTY; without even +-- the implied warranty of MERCHANTABILITY or FITNESS FOR A +-- PARTICULAR PURPOSE. See the GNU Lesser General Public License +-- for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with UDP/IPv4 for 10 G Ethernet core. If not, +-- see . +------------------------------------------------------------------------------- +-- +-- This package is collection of types and constants that are shared between +-- several modules in the UDP/IPv4 frame processing components. +-- +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +package frame_pkg is + + -- Type to hold MAC and IP addresses and UDP ports + subtype mac_addr_type is std_logic_vector(47 downto 0); + type mac_addr_array_type is array (natural range <>) of mac_addr_type; + + subtype ip_addr_type is std_logic_vector(31 downto 0); + type ip_addr_array_type is array (natural range <>) of ip_addr_type; + + subtype udp_port_type is std_logic_vector(15 downto 0); + type udp_port_array_type is array (natural range <>) of udp_port_type; + + + -- Types for 64 bit data ports + subtype data64_port_type is std_logic_vector(63 downto 0); + type data64_port_array_type is array (natural range <>) of data64_port_type; + + + -- Frame process constants and types + constant C_FP_TAG_LENGTH_BITLEN : integer := 16; + constant C_FP_TAG_RET_INFO_LENGTH_BITLEN : integer := + C_FP_TAG_LENGTH_BITLEN +16; + constant C_FP_TAG_FLAGS_BITLEN : integer := 2; + + constant C_FP_TAG_UDP : std_logic_vector + (C_FP_TAG_FLAGS_BITLEN - 1 downto 0) := "01"; + constant C_FP_TAG_DISCARD : std_logic_vector + (C_FP_TAG_FLAGS_BITLEN - 1 downto 0) := "10"; + constant C_FP_TAG_RETINF : std_logic_vector + (C_FP_TAG_FLAGS_BITLEN - 1 downto 0) := "00"; + + + + -- Type for tag fifo 2b flags + 32bit return info or length + subtype fp_tfifo_data_type is std_logic_vector(C_FP_TAG_FLAGS_BITLEN + C_FP_TAG_RET_INFO_LENGTH_BITLEN - 1 downto 0); + subtype fp_dfifo_data_type is std_logic_vector(71 downto 0); + + + subtype txi_tfifo_data_type is std_logic_vector(C_FP_TAG_LENGTH_BITLEN - 1 downto 0); + subtype txi_dfifo_data_type is std_logic_vector(71 downto 0); + + + -- Mainly for CMP registers + subtype data32_port_type is std_logic_vector(31 downto 0); + type data32_port_array_type is array (natural range <>) of data32_port_type; + + + -- Function that sets one bit only according to addr + function one_of_n(vec_len: integer; addr : integer) return std_logic_vector; + function one_of_n(vec: std_logic_vector; addr : integer) return std_logic_vector; + -- Returns position of the first bit + function first_bit_set(vec : std_logic_vector) return integer; + + -- Returns number of bits in 1 + function num_of_ones(vec : std_logic_vector) return integer; + +end package; + +package body frame_pkg is + + -- Returns vector of length of vec with one bit set only at + -- position addr + function one_of_n(vec: std_logic_vector; addr : integer) return std_logic_vector is + variable res : std_logic_vector(vec'range) := (others => '0'); + begin + res(addr) := '1'; + return res; + end function; + -- Returns vector of length of vec_len with one bit set only at + -- position addr + function one_of_n(vec_len: integer; addr : integer) return std_logic_vector is + variable res : std_logic_vector(vec_len - 1 downto 0) := (others => '0'); + begin + res(addr) := '1'; + return res; + end function; + + function first_bit_set(vec : std_logic_vector) return integer is + begin + -- find first bit set + for i in vec'range loop + if vec(i) = '1' then + return i; + end if; + end loop; + return 0; + end function; + + -- Returns number of bits in 1 + function num_of_ones(vec : std_logic_vector) return integer is + variable res : integer := 0; + begin + for i in 0 to vec'left loop + if vec(i) = '1' then + res := res + 1; + end if; + end loop; + + return res; + end function; + +end package body; + Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_process.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_process.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_process.vhd (revision 3) @@ -0,0 +1,708 @@ +------------------------------------------------------------------------------- +-- +-- (C) Copyright 2013 DFC Design, s.r.o., Brno, Czech Republic +-- Author: Marek Kvas (m.kvas@dfcdesign.cz) +-- +------------------------------------------------------------------------------- +-- This file is part of UDP/IPv4 for 10 G Ethernet core. +-- +-- UDP/IPv4 for 10 G Ethernet core is free software: you can +-- redistribute it and/or modify it under the terms of +-- the GNU Lesser General Public License as published by the Free +-- Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- UDP/IPv4 for 10 G Ethernet core is distributed in the hope that +-- it will be useful, but WITHOUT ANY WARRANTY; without even +-- the implied warranty of MERCHANTABILITY or FITNESS FOR A +-- PARTICULAR PURPOSE. See the GNU Lesser General Public License +-- for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with UDP/IPv4 for 10 G Ethernet core. If not, +-- see . +------------------------------------------------------------------------------- +-- +-- This core processes UDP/IPv4 frames. It is supposed to be connected to +-- frame_received core on input as it assumes aligned raw data with +-- convenient data valid and byte enable signals + checksum validation flags. +-- +-- The purpose of this block is to filter out packets that are not intended +-- for us. All packets thats destination MAC and IP addresses don't match +-- set host addresses are rejected. Broadcast packets can be accepted too. +-- +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.frame_pkg.all; + +Library UNISIM; +use UNISIM.vcomponents.all; + + +entity frame_process is + port ( + RST : in std_logic; + CLK : in std_logic; + + -- Interface towards frame receiver + RX_DATA : in std_logic_vector(63 downto 0); + RX_DV : in std_logic; + RX_BE : in std_logic_vector(7 downto 0); + RX_ERR : in std_logic; + RX_ERR_VALID : in std_logic; + + -- Interfaces of tag and data fifos + DFIFO_DATA : out fp_dfifo_data_type; + DFIFO_WR_EN : out std_logic; + DFIFO_FULL : in std_logic; + + TFIFO_DATA : out fp_tfifo_data_type; + TFIFO_WR_EN : out std_logic; + TFIFO_FULL : in std_logic; + + -- Host MAC and IP addresses + MAC_ADDR : in mac_addr_type; + IP_ADDR : in ip_addr_type; + IP_NET_MASK : in ip_addr_type + ); +end entity; + + +architecture synthesis of frame_process is + + -- Constants + constant LC_MAC_ADDR_BITLEN : integer := 48; + constant LC_DST_MAC_POS_RIGHT : integer := 0; + constant LC_DST_MAC_POS_LEFT : integer := LC_DST_MAC_POS_RIGHT + + LC_MAC_ADDR_BITLEN - 1; + constant LC_MAC_BROADCAST_ADDR : std_logic_vector(LC_MAC_ADDR_BITLEN - 1 + downto 0) := (others => '1'); + + constant LC_MAC_ETHERTYPE_BITLEN : integer := 16; + constant LC_MAC_ETHERTYPE_POS_RIGHT : integer := 12 * 8; + constant LC_MAC_ETHERTYPE_POS_LEFT : integer := LC_MAC_ETHERTYPE_POS_RIGHT + + LC_MAC_ETHERTYPE_BITLEN - 1; + + constant LC_MAC_ETHERTYPE_IPV4 : std_logic_vector(LC_MAC_ETHERTYPE_BITLEN -1 + downto 0) := x"0800"; + constant LC_MAC_ETHERTYPE_ARP : std_logic_vector(LC_MAC_ETHERTYPE_BITLEN -1 + downto 0) := x"0806"; + constant LC_IP_ADDR_BITLEN : integer := 32; + constant LC_DST_IP_POS_RIGHT : integer := 6*8; + constant LC_DST_IP_POS_LEFT : integer := LC_DST_IP_POS_RIGHT + + LC_IP_ADDR_BITLEN - 1; + constant LC_IP_PROTO_BITLEN : integer := 8; + constant LC_IP_PROTO_POS_RIGHT : integer := 7*8; + constant LC_IP_PROTO_POS_LEFT : integer := LC_IP_PROTO_POS_RIGHT + + LC_IP_PROTO_BITLEN - 1; + constant LC_IP_PROTO_UDP : std_logic_vector(LC_IP_PROTO_BITLEN - 1 + downto 0) := x"11"; + constant LC_THIS_NET_BROADCAST_IP: std_logic_vector(LC_IP_ADDR_BITLEN - 1 + downto 0) := x"ffffffff"; + constant LC_UDP_ADDR_BITLEN : integer := 16; + constant LC_DST_UDP_POS_RIGHT : integer := 4*8; + constant LC_DST_UDP_POS_LEFT : integer := LC_DST_UDP_POS_RIGHT + + LC_UDP_ADDR_BITLEN - 1; + constant LC_UDP_LENGTH_BITLEN : integer := 16; + constant LC_UDP_LENGTH_POS_RIGHT : integer := 6*8; + constant LC_UDP_LENGTH_POS_LEFT : integer := LC_UDP_LENGTH_POS_RIGHT + + LC_UDP_LENGTH_BITLEN - 1; + constant LC_UDP_DATA_POS : integer := 2*8; + constant LC_UDP_HDR_LEN : integer := 8; + + + constant LC_SRC_MAC_BITLEN : integer := 32; + constant LC_SRC_MAC_POS_RIGHT0 : integer := 6*8; + constant LC_SRC_MAC_POS_LEFT0 : integer := LC_SRC_MAC_POS_RIGHT0 + + LC_SRC_MAC_BITLEN - 1; + + constant LC_SRC_MAC_BITLEN1 : integer := 16; + constant LC_SRC_MAC_POS_RIGHT1 : integer := 2*8; + constant LC_SRC_MAC_POS_LEFT1 : integer := LC_SRC_MAC_POS_RIGHT1 + + LC_SRC_MAC_BITLEN1 - 1; + + constant LC_SRC_IP_BITLEN : integer := 16; + constant LC_SRC_IP_POS_RIGHT0 : integer := 18*8; + constant LC_SRC_IP_POS_LEFT0 : integer := LC_SRC_IP_POS_RIGHT0 + + LC_SRC_IP_BITLEN - 1; + + constant LC_SRC_IP_BITLEN1 : integer := 16; + constant LC_SRC_IP_POS_RIGHT1 : integer := 4*8; + constant LC_SRC_IP_POS_LEFT1 : integer := LC_SRC_IP_POS_RIGHT1 + + LC_SRC_IP_BITLEN1 - 1; + + + constant LC_SRC_UDP_BITLEN : integer := 16; + constant LC_SRC_UDP_POS_RIGHT : integer := 10*8; + constant LC_SRC_UDP_POS_LEFT : integer := LC_SRC_UDP_POS_RIGHT + + LC_SRC_UDP_BITLEN - 1; + + + -- Main FSM sorting frames and stripping headers + type sort_fsm_type is (S_MAC0, S_MAC1_IP0, S_IP1, S_IP2, S_IP3_UDP0, + S_UDP1_DATA, + --S_CHECK_ERR, + S_TAG, + S_TAG_DISCARD, + S_MAC1_ARP + -- ,S_FILTERED + ); + signal sort_fsm_cur : sort_fsm_type; + signal sort_fsm_next : sort_fsm_type; + + -- FSM control signals + signal all_data_written : std_logic; + signal load_udp_data_length: std_logic; + signal write_udp_data : std_logic; + + signal cur_broadcast : std_logic; + signal cur_broadcast_s : std_logic; + signal cur_broadcast_r : std_logic; + + signal mac_ethertype_ipv4 : std_logic; + signal mac_ethertype_arp : std_logic; + signal mac_filter_unicast : std_logic; + signal mac_filter_broadcast: std_logic; + + signal ip_filter_unicast : std_logic; + signal ip_filter_broadcast : std_logic; + signal ip_next_proto_udp : std_logic; + + signal udp_data_length : unsigned(C_FP_TAG_LENGTH_BITLEN - 1 downto 0); + signal udp_data_length_reg : unsigned(udp_data_length'range); + + signal rx_udp_be : std_logic_vector(RX_BE'range); + signal rx_udp_data : std_logic_vector(RX_DATA'range); + + -- internal form of output ports + signal tfifo_wr_en_i : std_logic; + signal tfifo_data_i : fp_tfifo_data_type; + + -- Counter of data to send + signal data_cnt : unsigned(15 downto 0); + -- Counter of data to be discarded if needed + signal data_to_discard : unsigned(data_cnt'range); + + signal dst_udp_reg : udp_port_type; + signal dst_udp_port : udp_port_type; + + -- Register versions of inputs + signal rx_data_d : std_logic_vector(63 downto 0); + signal rx_dv_d : std_logic; + signal rx_be_d : std_logic_vector(7 downto 0); + signal rx_err_d : std_logic; + signal rx_err_valid_d : std_logic; + signal rx_err_dd : std_logic; + signal rx_be_dd : std_logic_vector(7 downto 0); + signal rx_dv_dd : std_logic; + signal rx_data_dd : std_logic_vector(63 downto 0); + signal rx_err_valid_dd : std_logic; + signal rx_err_ddd : std_logic; + signal rx_be_ddd : std_logic_vector(7 downto 0); + signal rx_dv_ddd : std_logic; + signal rx_dv_dddd : std_logic; + signal rx_data_ddd : std_logic_vector(63 downto 0); + signal rx_err_valid_ddd : std_logic; + + + + -- Function definitions + -- Cut out byte enables from two delayed words - compensate for shift in UDP + function derive_udp_be_func(be_ddd : std_logic_vector; + be_dd : std_logic_vector) return std_logic_vector is + variable res : std_logic_vector(be_dd'range); + variable tmp : std_logic_vector(be_dd'length * 2 - 1 downto 0); + begin + + -- We know the offset for standard UDP packet (without options) + + tmp := be_dd & be_ddd; + res := tmp(LC_UDP_DATA_POS/8 + be_dd'left downto LC_UDP_DATA_POS/8); + + return res; + end function; + + + -- Cut out data from two delayed words - compensate for shift in UDP + function derive_udp_data_func(data_ddd : std_logic_vector; + data_dd : std_logic_vector) return std_logic_vector is + variable res : std_logic_vector(data_dd'range); + variable tmp : std_logic_vector(data_dd'length * 2 - 1 downto 0); + begin + + -- We know the offset for standard UDP packet (without options) + tmp := data_dd & data_ddd; + res := tmp(LC_UDP_DATA_POS + data_dd'left downto LC_UDP_DATA_POS); + return res; + end function; + + -- Basically finds first 1 bit from left (MSB) to find out + -- how many byte enables is 1 (gaps are not alowed) + function be_to_cnt_udp_func(be_ddd : std_logic_vector; + be_dd : std_logic_vector) return integer is + variable tmp : std_logic_vector(be_ddd'range); + variable res : integer range 0 to be_ddd'length; + begin + tmp := derive_udp_be_func(be_ddd, be_dd); + for i in tmp'left downto 0 loop + if tmp(i) = '1' then + return i + 1; + end if; + end loop; + return 0; + end function; + + + -- Change endians + function swap_bytes(fi : std_logic_vector) return std_logic_vector is + variable f : std_logic_vector(fi'length - 1 downto 0); + variable res : std_logic_vector(f'length - 1 downto 0); + variable blen : integer; + begin + f := fi; + blen := f'length/8 - 1; + for i in 0 to blen loop + res(i*8 + 7 downto i * 8) := f((blen - i)*8 + 7 downto (blen - i) * 8); + end loop; + return res; + end Function; + + function swap_bytes(f : unsigned) return unsigned is + begin + return unsigned(swap_bytes(std_logic_vector(f))); + end function; + +begin + + -- Create delayed signal, first to isolate from previous + -- block, second to align filter results with data + delay_input_proc : process (RST, CLK) + begin + if RST = '1' then + rx_data_d <= (others => '0'); + rx_data_dd <= (others => '0'); + rx_data_ddd <= (others => '0'); + rx_dv_d <= '0'; + rx_dv_dd <= '0'; + rx_dv_ddd <= '0'; + rx_dv_dddd <= '0'; + rx_be_d <= (others => '0'); + rx_be_dd <= (others => '0'); + rx_be_ddd <= (others => '0'); + rx_err_d <= '0'; + rx_err_dd <= '0'; + rx_err_ddd <= '0'; + rx_err_valid_d <= '0'; + rx_err_valid_dd <= '0'; + rx_err_valid_ddd <= '0'; + elsif rising_edge(CLK) then + rx_data_d <= RX_DATA; + rx_data_dd <= rx_data_d; + rx_data_ddd <= rx_data_dd; + rx_dv_d <= RX_DV; + rx_dv_dd <= rx_dv_d; + rx_dv_ddd <= rx_dv_dd; + rx_dv_dddd <= rx_dv_ddd; + rx_be_d <= RX_BE; + rx_be_dd <= rx_be_d; + rx_be_ddd <= rx_be_dd; + rx_err_d <= RX_ERR; + rx_err_dd <= rx_err_d; + rx_err_ddd <= rx_err_dd; + rx_err_valid_d <= RX_ERR_VALID; + rx_err_valid_dd <= rx_err_valid_d; + rx_err_valid_ddd <= rx_err_valid_dd; + end if; + end process; + + + -- Main FSM sorting frames and stripping headers + sort_fsm_adv_proc : process (CLK, RST) + begin + if RST ='1' then + sort_fsm_cur <= S_MAC0; + cur_broadcast <= '0'; + elsif rising_edge(CLK) then + sort_fsm_cur <= sort_fsm_next; + + if cur_broadcast_s = '1' then + cur_broadcast <= '1'; + elsif cur_broadcast_r = '1' then + cur_broadcast <= '0'; + end if; + end if; + end process; + + sort_fsm_trans_out_proc : process (sort_fsm_cur, dst_udp_port, + udp_data_length, rx_dv_ddd, rx_dv_dddd, + mac_filter_unicast, mac_filter_broadcast, + mac_ethertype_ipv4, mac_ethertype_arp, + ip_filter_unicast, ip_filter_broadcast, + all_data_written, ip_next_proto_udp, + DFIFO_FULL, rx_err_valid_ddd, + rx_err_ddd, TFIFO_FULL, cur_broadcast, + data_to_discard, rx_data_d, rx_data_dd, rx_data_ddd) + variable header : std_logic_vector(3*64-1 downto 0); + begin + + header := rx_data_d & rx_data_dd & rx_data_ddd; + + load_udp_data_length <= '0'; + write_udp_data <= '0'; + + tfifo_wr_en_i <= '0'; + cur_broadcast_s <= '0'; + cur_broadcast_r <= '0'; + + -- Dafault state of tfifo data + tfifo_data_i <= C_FP_TAG_UDP & dst_udp_port & + std_logic_vector(udp_data_length); + + sort_fsm_next <= sort_fsm_cur; + + case sort_fsm_cur is + when S_MAC0 => + cur_broadcast_r <= '1'; + if rx_dv_ddd = '1' and rx_dv_dddd = '0' then + -- Process only our packets and broadcast + if mac_filter_unicast = '1' or + mac_filter_broadcast = '1' then + if mac_filter_broadcast = '1' then + -- Remember we process broadcast + -- because we will need to know later + cur_broadcast_s <= '1'; + end if; + -- Differentiate between IPv4 and ARP + if mac_ethertype_ipv4 = '1' then + sort_fsm_next <= S_MAC1_IP0; + elsif mac_ethertype_arp = '1' then + sort_fsm_next <= S_MAC1_ARP; + else + -- We process IPv4 and ARP packets only + NULL; + end if; + -- Save the first part of return info - part of src MAC addr + if TFIFO_FULL = '0' then + tfifo_wr_en_i <= '1'; + else + -- tag FIFO full; As nothing has been written yet + -- we can stay in this state and wait for next frame + sort_fsm_next <= S_MAC0; + end if; + tfifo_data_i <= C_FP_TAG_RETINF & + swap_bytes(header(LC_SRC_MAC_POS_LEFT0 downto + LC_SRC_MAC_POS_RIGHT0)); + end if; + end if; + when S_MAC1_ARP => + -- ARP not supported in this version + sort_fsm_next <= S_MAC0; + when S_MAC1_IP0 => + -- Only first ten bytes of IP header available + if rx_dv_ddd = '1' then + sort_fsm_next <= S_IP1; + -- Save the second part of return info - rest of src MAC addr + -- and part of src IP + if TFIFO_FULL = '0' then + tfifo_wr_en_i <= '1'; + else + -- tag FIFO full; no date have been written so just ignere pkt + sort_fsm_next <= S_MAC0; + end if; + tfifo_data_i <= C_FP_TAG_RETINF & + swap_bytes(header(LC_SRC_MAC_POS_LEFT1 downto + LC_SRC_MAC_POS_RIGHT1)) & + swap_bytes(header(LC_SRC_IP_POS_LEFT0 downto + LC_SRC_IP_POS_RIGHT0)); + else + sort_fsm_next <= S_TAG_DISCARD; + end if; + when S_IP1 => + -- Check if next protocol is UDP + -- Destination IP is not yet completely loaded + if rx_dv_ddd = '1' and + ip_next_proto_udp = '1' then + sort_fsm_next <= S_IP2; + else + sort_fsm_next <= S_MAC0; + end if; + when S_IP2 => + -- Continue if destination address is ours or + -- broadcast and MAC was broadcast too + if rx_dv_ddd = '1' and + ((ip_filter_unicast = '1' and cur_broadcast = '0')or + (ip_filter_broadcast = '1' and cur_broadcast = '1') + ) then + sort_fsm_next <= S_IP3_UDP0; + -- Save the third part of return info - rest of src IP addr + -- and src UDP port + if TFIFO_FULL = '0' then + tfifo_wr_en_i <= '1'; + else + -- data FIFO full; discard if anything has been written + sort_fsm_next <= S_MAC0; + end if; + tfifo_data_i <= C_FP_TAG_RETINF & + swap_bytes(header(LC_SRC_IP_POS_LEFT1 downto + LC_SRC_IP_POS_RIGHT1)) & + swap_bytes(header(LC_SRC_UDP_POS_LEFT downto + LC_SRC_UDP_POS_RIGHT)); + + else + sort_fsm_next <= S_MAC0; + end if; + when S_IP3_UDP0 => + -- Now we can determine destination socket + -- based on destination UDP port + if rx_dv_ddd = '1' then + load_udp_data_length <= '1'; + sort_fsm_next <= S_UDP1_DATA; + else + sort_fsm_next <= S_MAC0; + end if; + when S_UDP1_DATA => + -- For UDP data are not aligned and first two bytes + -- are mixed with header; because we want data aligned + -- in fifo it may happen that there are no data + -- to write in last cycle of dv + if rx_dv_ddd = '1' then + if all_data_written = '0' then + if DFIFO_FULL = '0' then + write_udp_data <= '1'; + else + -- We dont have space in data fifo; data will be + -- corrupted; discard packet + -- Data are still valid so we have enough time + -- to go to discard state + sort_fsm_next <= S_TAG_DISCARD; + end if; + end if; + else + if all_data_written = '0' or + rx_err_ddd = '1'then + -- DV deasserted before all data received + -- or error occurred in packet + -- We don't have time to go to discard state + -- write discard tag now (minimal IFG is only one cycle) + if TFIFO_FULL = '0' then + tfifo_wr_en_i <= '1'; + sort_fsm_next <= S_MAC0; + else + -- Tag fifo is full go waiting for space for discard tag + sort_fsm_next <= S_TAG_DISCARD; + end if; + tfifo_data_i <= C_FP_TAG_DISCARD & dst_udp_port & + std_logic_vector(data_to_discard); + else + -- All is fine, write ok tag + if TFIFO_FULL = '0' then + -- Write default - i.e. length and destination port + tfifo_wr_en_i <= '1'; + sort_fsm_next <= S_MAC0; + else + -- There is no space for tag, go waiting + sort_fsm_next <= S_TAG; + end if; + end if; + end if; + when S_TAG => + -- Wait until there is space in tag fifo and write ok tag + if TFIFO_FULL = '0' then + -- Write default - i.e. length and destination port + tfifo_wr_en_i <= '1'; + sort_fsm_next <= S_MAC0; + end if; + when S_TAG_DISCARD => + -- Wait until there is space in tag fifo and write discard tag + if TFIFO_FULL = '0' then + tfifo_wr_en_i <= '1'; + sort_fsm_next <= S_MAC0; + end if; + tfifo_data_i <= C_FP_TAG_DISCARD & dst_udp_port & + std_logic_vector(data_to_discard); +-- when S_FILTERED => +-- -- Wait until packet that we don't care of ends +-- if rx_dv_ddd = '0' then +-- sort_fsm_next <= S_MAC0; +-- end if; + end case; + + end process; + + -- Count data written; check against + -- header info - valid for UDP only + data_cnt_proc : process (RST, CLK) + variable be_cnt : integer; + begin + if RST = '1' then + data_cnt <= (others => '0'); + data_to_discard <= (others => '0'); + all_data_written <= '0'; + elsif rising_edge(CLK) then + if load_udp_data_length = '1' then + -- Subtract 8 as a length of UDP_HEADER + udp_data_length <= swap_bytes(udp_data_length_reg) - LC_UDP_HDR_LEN; + data_cnt <= swap_bytes(udp_data_length_reg) - LC_UDP_HDR_LEN; + dst_udp_port <= swap_bytes(dst_udp_reg); + all_data_written <= '0'; + data_to_discard <= (others => '0'); + elsif write_udp_data = '1' then + -- Count data for case of discarding + -- hede we don't have to play on byte enables + data_to_discard <= data_to_discard + 8; + + -- Now, we have to derive how many bytes to write + if data_cnt > 8 then + -- Most often case + data_cnt <= data_cnt - 8; + elsif data_cnt = 8 then + -- Data were 8 by aligned + data_cnt <= data_cnt - 8; + all_data_written <= '1'; + elsif data_cnt < 8 then + be_cnt := be_to_cnt_udp_func(rx_be_ddd, rx_be_dd); + if be_cnt >= data_cnt then + -- If equal it is ok; if more there are + -- trailing data in packet and it is fine too + data_cnt <= (others => '0'); + all_data_written <= '1'; + else + -- Packet was shorter and will be discarded + -- because DV will go down + null; + end if; + end if; + end if; + end if; + end process; + + rx_udp_be <= derive_udp_be_func(rx_be_ddd, rx_be_dd); + rx_udp_data <= derive_udp_data_func(rx_data_ddd, rx_data_dd); + + + + -- Register udp length and dst port + udp_length_reg_proc : process (RST, CLK) + variable header : std_logic_vector(127 downto 0); + begin + if RST = '1' then + udp_data_length_reg <= (others => '0'); + elsif rising_edge(CLK) then + header := rx_data_d & rx_data_dd; + udp_data_length_reg <= unsigned( + header(LC_UDP_LENGTH_POS_LEFT downto LC_UDP_LENGTH_POS_RIGHT)); + dst_udp_reg <= header(LC_DST_UDP_POS_LEFT downto LC_DST_UDP_POS_RIGHT); + end if; + end process; + + + -- Filters for various info from header + -- Output is aligned with data in ddd version + + -- MAC filter; Check ethertype field of MAC + mac_filter_proc : process (RST, CLK) + variable header : std_logic_vector(127 downto 0); + variable dst_mac : std_logic_vector(LC_MAC_ADDR_BITLEN - 1 downto 0); + variable ethertype : std_logic_vector(LC_MAC_ETHERTYPE_BITLEN -1 + downto 0); + begin + if RST = '1' then + mac_filter_unicast <= '0'; + mac_filter_broadcast <= '0'; + mac_ethertype_ipv4 <= '0'; + mac_ethertype_arp <= '0'; + elsif rising_edge(CLK) then + + mac_filter_unicast <= '0'; + mac_filter_broadcast <= '0'; + mac_ethertype_ipv4 <= '0'; + mac_ethertype_arp <= '0'; + + -- Extract destination MAC and ethertype from received headers + header := rx_data_d & rx_data_dd; + dst_mac := header(LC_DST_MAC_POS_LEFT downto LC_DST_MAC_POS_RIGHT); + ethertype := header(LC_MAC_ETHERTYPE_POS_LEFT downto + LC_MAC_ETHERTYPE_POS_RIGHT); + -- Check for broadcast MAC + if dst_mac = LC_MAC_BROADCAST_ADDR then + mac_filter_broadcast <= '1'; + end if; + -- Check for unicast with our MAC + if dst_mac = swap_bytes(MAC_ADDR) then + mac_filter_unicast <= '1'; + end if; + + -- Check for ipv4 ethertype + if ethertype = swap_bytes(LC_MAC_ETHERTYPE_IPV4) then + mac_ethertype_ipv4 <= '1'; + end if; + -- Check for arp ethertype + if ethertype = swap_bytes(LC_MAC_ETHERTYPE_ARP) then + mac_ethertype_arp <= '1'; + end if; + + end if; + end process; + + + -- IP filter; Check for UDP as next protocol + ip_filter_proc : process (RST, CLK) + variable header : std_logic_vector(127 downto 0); + variable dst_ip : std_logic_vector(LC_IP_ADDR_BITLEN - 1 downto 0); + variable next_proto : std_logic_vector(LC_IP_PROTO_BITLEN - 1 downto 0); + variable tmpip : ip_addr_type; + begin + if RST = '1' then + ip_filter_unicast <= '0'; + ip_filter_broadcast <= '0'; + ip_next_proto_udp <= '0'; + elsif rising_edge(CLK) then + + ip_filter_unicast <= '0'; + ip_filter_broadcast <= '0'; + ip_next_proto_udp <= '0'; + + -- Extract destination IP from received headers + header := rx_data_d & rx_data_dd; + dst_ip := header(LC_DST_IP_POS_LEFT downto LC_DST_IP_POS_RIGHT); + next_proto := header(LC_IP_PROTO_POS_LEFT downto LC_IP_PROTO_POS_RIGHT); + -- Check for broadcast IP + tmpip := IP_ADDR and IP_NET_MASK; + if (swap_bytes(dst_ip) and IP_NET_MASK) = tmpip or + dst_ip = LC_THIS_NET_BROADCAST_IP then + ip_filter_broadcast <= '1'; + end if; + -- Check for unicast with our IP + if dst_ip = swap_bytes(IP_ADDR) then + ip_filter_unicast <= '1'; + end if; + -- Check for UDP as next protocol + if next_proto = LC_IP_PROTO_UDP then + ip_next_proto_udp <= '1'; + end if; + end if; + end process; + + -- Outputs assignment + TFIFO_DATA <= tfifo_data_i; + TFIFO_WR_EN <= tfifo_wr_en_i; + + DFIFO_DATA <= rx_udp_be & rx_udp_data; + DFIFO_WR_EN <= write_udp_data; + + +end architecture; + + + + + + + + Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_receiver.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_receiver.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_receiver.vhd (revision 3) @@ -0,0 +1,412 @@ +------------------------------------------------------------------------------- +-- +-- (C) Copyright 2013 DFC Design, s.r.o., Brno, Czech Republic +-- Author: Marek Kvas (m.kvas@dfcdesign.cz) +-- +------------------------------------------------------------------------------- +-- This file is part of UDP/IPv4 for 10 G Ethernet core. +-- +-- UDP/IPv4 for 10 G Ethernet core is free software: you can +-- redistribute it and/or modify it under the terms of +-- the GNU Lesser General Public License as published by the Free +-- Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- UDP/IPv4 for 10 G Ethernet core is distributed in the hope that +-- it will be useful, but WITHOUT ANY WARRANTY; without even +-- the implied warranty of MERCHANTABILITY or FITNESS FOR A +-- PARTICULAR PURPOSE. See the GNU Lesser General Public License +-- for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with UDP/IPv4 for 10 G Ethernet core. If not, +-- see . +------------------------------------------------------------------------------- +-- +-- First block of the receiver chain. It has XGMII as an input. +-- Output is raw 64 bit data guaranteed to be aligned on the frame start and +-- stripped of preamble and CRC, valid signal covering frame data, +-- and byte enable signal that shall be used in case data amount is not +-- 8 byte aligned. Another signal indicates either CRC error or line +-- signalized error, in which case frame should be discarded. +-- +-- Byte enable signal is guaranteed to be all ones for whole frame except +-- for the last word, in case packet length is not 8 byte integer divisible. +-- +-- This can work under assumption that minimum IPG in incoming stream is +-- 4 bytes. This means when T is on L0-L4, S cannot be on L5-L7 of the same +-- cycle and when T is on L5-L7 S cannot be on L0-L3 of the next cycle. Under +-- this condition DV is always at leased one cycle deasserted between +-- frames. +-- +-- RST must be asserted for 16 cycles to fully empty pipeline +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +Library UNISIM; +use UNISIM.vcomponents.all; + +library work; +use work.srl_pkg.all; + + +entity frame_receiver is + port ( + RST : in std_logic; -- Sync to XGMII_RX_CLK + + -- XGMII RX input interface + XGMII_RXCLK : in std_logic; + XGMII_RXD : in std_logic_vector(63 downto 0); + XGMII_RXC : in std_logic_vector( 7 downto 0); + + -- Output interface + RX_DATA : out std_logic_vector(63 downto 0); + RX_DV : out std_logic; + RX_BE : out std_logic_vector(7 downto 0); + RX_ERR : out std_logic; + RX_ERR_VALID : out std_logic + + ); +end entity; + +architecture synthesis of frame_receiver is + + -- Local constants + constant LC_START_CHAR : std_logic_vector(7 downto 0) := x"FB"; + constant LC_TERM_CHAR : std_logic_vector(7 downto 0) := x"FD"; + constant LC_ERR_CHAR : std_logic_vector(7 downto 0) := x"FE"; + + -- Aligning block + signal align_buf_data : std_logic_vector(XGMII_RXD'length-1 downto 0); + signal align_res_data : std_logic_vector(XGMII_RXD'length-1 downto 0); + signal align_res_data_d: std_logic_vector(XGMII_RXD'length-1 downto 0); + signal align_buf_ctrl : std_logic_vector(XGMII_RXC'length-1 downto 0); + signal align_res_ctrl : std_logic_vector(XGMII_RXC'length-1 downto 0); + type align_mode_type is (S_L0, S_L4); + signal align_mode : align_mode_type; + + signal crc_data_d : std_logic_vector(XGMII_RXD'length-1 downto 0); + signal crc_data_dd : std_logic_vector(XGMII_RXD'length-1 downto 0); + signal data_mask_d : std_logic_vector(7 downto 0); + signal data_mask_dd : std_logic_vector(7 downto 0); + signal crc_mask_dd : std_logic_vector(2 downto 0); + signal crc_dv_d : std_logic; + signal crc_dv_dd : std_logic; + signal crc_eop : std_logic; + signal crc_eop_d : std_logic; + signal crc_eop_dd : std_logic; + signal data_valid : std_logic; + signal data_valid_d : std_logic; + signal sop_found : std_logic; + signal sop_found_d : std_logic; + + signal extracted_crc : std_logic_vector(31 downto 0); + signal extracted_crc_eq : std_logic_vector(31 downto 0); + signal extracted_crc_n : std_logic_vector(31 downto 0); + + signal data_err_valid : std_logic; + signal data_err_valid_d : std_logic; + signal data_err_valid_dd : std_logic; + signal data_err_valid_reg : std_logic; + signal data_err_valid_d_reg : std_logic; + signal data_err_valid_dd_reg : std_logic; + + signal data_err : std_logic; + signal data_err_d : std_logic; + signal data_err_dd : std_logic; + + -- Internal versions of output signals + signal rx_data_i : std_logic_vector(63 downto 0); + signal rx_dv_i : std_logic; + signal rx_err_i : std_logic; + signal rx_err_valid_i : std_logic; + signal rx_be_i : std_logic_vector(7 downto 0); + + signal data_err_eq_m1 : std_logic; + + -- crc connection + signal crc32_result : std_logic_vector(31 downto 0); + signal crc32_result_n : std_logic_vector(31 downto 0); + signal crc_vld : std_logic; + + +-- Returns true if there is a terminate command character in data + function check_terminate_func(rxc : std_logic_vector; rxd : std_logic_vector) + return boolean is + variable res : boolean := false; + begin + if (rxd(7 downto 0) = LC_TERM_CHAR and rxc(0) = '1') or + (rxd(15 downto 8) = LC_TERM_CHAR and rxc(1) = '1') or + (rxd(23 downto 16) = LC_TERM_CHAR and rxc(2) = '1') or + (rxd(31 downto 24) = LC_TERM_CHAR and rxc(3) = '1') or + (rxd(39 downto 32) = LC_TERM_CHAR and rxc(4) = '1') or + (rxd(47 downto 40) = LC_TERM_CHAR and rxc(5) = '1') or + (rxd(55 downto 48) = LC_TERM_CHAR and rxc(6) = '1') or + (rxd(63 downto 56) = LC_TERM_CHAR and rxc(7) = '1') then + res := true; + end if; + + return res; + end function; + +-- Returns true if there is a error command character in data + function check_err_func(rxc : std_logic_vector; rxd : std_logic_vector) + return boolean is + variable res : boolean := false; + begin + if (rxd(7 downto 0) = LC_ERR_CHAR and rxc(0) = '1') or + (rxd(15 downto 8) = LC_ERR_CHAR and rxc(1) = '1') or + (rxd(23 downto 16) = LC_ERR_CHAR and rxc(2) = '1') or + (rxd(31 downto 24) = LC_ERR_CHAR and rxc(3) = '1') or + (rxd(39 downto 32) = LC_ERR_CHAR and rxc(4) = '1') or + (rxd(47 downto 40) = LC_ERR_CHAR and rxc(5) = '1') or + (rxd(55 downto 48) = LC_ERR_CHAR and rxc(6) = '1') or + (rxd(63 downto 56) = LC_ERR_CHAR and rxc(7) = '1') then + res := true; + end if; + + return res; + end function; + + -- transform byte enables to crc mask + function be_to_crc_mask_func(be : std_logic_vector) return std_logic_vector is + variable res : std_logic_vector(2 downto 0); + begin + case be(7 downto 0) is + when "00000000" => res := "000"; + when "00000001" => res := "111"; + when "00000011" => res := "110"; + when "00000111" => res := "101"; + when "00001111" => res := "100"; + when "00011111" => res := "011"; + when "00111111" => res := "010"; + when "01111111" => res := "001"; + when others => res := "000"; + end case; + return res; + end function; + + function swap_bytes32_cut(i : std_logic_vector; idx : integer) + return std_logic_vector is + variable res : std_logic_vector(31 downto 0); + begin + res(7 downto 0 ) := i(31 + idx*8 downto 24+ idx*8 ); + res(15 downto 8 ) := i(23 + idx*8 downto 16+ idx*8 ); + res(23 downto 16) := i(15 + idx*8 downto 8 + idx*8 ); + res(31 downto 24) := i(7 + idx*8 downto 0 + idx*8 ); + return res; + end function; + + +begin + +-------------------------------------------------------------------------------- +-- Allign data if start is on Lane 4 +-------------------------------------------------------------------------------- + + align_proc : process (XGMII_RXCLK) + variable tmp : std_logic_vector(2*align_res_data'length - 1 downto 0); + begin + if rising_edge(XGMII_RXCLK) then + tmp := align_res_data & align_res_data_d; + rx_err_valid_i <= '0'; + rx_err_i <= '0'; + crc_eop <= '0'; + sop_found <= '0'; + + -- First stage - directly connected to input + if XGMII_RXC(0) = '1' and + XGMII_RXD((0+1)*8-1 downto 0*8) = LC_START_CHAR then + align_mode <= S_L0; + sop_found <= '1'; + data_err <= '0'; + elsif XGMII_RXC(0) = '1' and + XGMII_RXD((4+1)*8-1 downto 4*8) = LC_START_CHAR then + align_mode <= S_L4; + sop_found <= '1'; + data_err <= '0'; + end if; + align_buf_data <= XGMII_RXD; + align_buf_ctrl <= XGMII_RXC; + + -- Second stage - registers after multiplexer that takes data + -- either from buffer or from input + case align_mode is + when S_L0 => + align_res_data <= align_buf_data; + align_res_ctrl <= align_buf_ctrl; + when S_L4 => + align_res_data <= XGMII_RXD(31 downto 0) & + align_buf_data(63 downto 32); + align_res_ctrl <= XGMII_RXC(3 downto 0) & + align_buf_ctrl(7 downto 4); + end case; + sop_found_d <= sop_found; + + -- Derive correct BE and crc mask, align data for crc to this info + -- derive error signal (remote error or invalid control combination + -- 3 cycles + align_res_data_d <= align_res_data; + crc_data_d <= align_res_data_d; + crc_data_dd <= crc_data_d; + crc_eop_d <= crc_eop; + crc_eop_dd <= crc_eop_d; + data_mask_dd <= data_mask_d; + crc_mask_dd <= be_to_crc_mask_func(data_mask_dd); + + data_valid <= data_valid or sop_found_d; + data_valid_d <= data_valid; + crc_dv_d <= data_valid_d; + crc_dv_dd <= crc_dv_d; + + if data_valid = '1' then + data_mask_d <= (others => '1'); + end if; + + + if data_valid = '1' and + check_terminate_func (align_res_ctrl, align_res_data) then + case align_res_ctrl is + when "10000000" => + data_mask_d <= "00000111"; + data_valid_d <= '1'; + data_valid <= '0'; + crc_eop <= '1'; + extracted_crc <= swap_bytes32_cut(tmp,11); + when "11000000" => + data_mask_d <= "00000011"; + data_valid_d <= '1'; + data_valid <= '0'; + crc_eop <= '1'; + extracted_crc <= swap_bytes32_cut(tmp,10); + when "11100000" => + data_mask_d <= "00000001"; + data_valid_d <= '1'; + data_valid <= '0'; + crc_eop <= '1'; + extracted_crc <= swap_bytes32_cut(tmp,9); + when "11110000" => + data_mask_d <= "00000000"; + data_valid_d <= '0'; + data_valid <= '0'; + crc_eop_d <= '1'; + extracted_crc <= swap_bytes32_cut(tmp,8); + when "11111000" => + data_mask_d <= "00000000"; + data_valid_d <= '0'; + data_valid <= '0'; + data_mask_dd <= "01111111"; + crc_eop_d <= '1'; + extracted_crc <= swap_bytes32_cut(tmp,7); + when "11111100" => + data_mask_d <= "00000000"; + data_valid_d <= '0'; + data_valid <= '0'; + data_mask_dd <= "00111111"; + crc_eop_d <= '1'; + extracted_crc <= swap_bytes32_cut(tmp,6); + when "11111110" => + data_mask_d <= "00000000"; + data_valid_d <= '0'; + data_valid <= '0'; + data_mask_dd <= "00011111"; + crc_eop_d <= '1'; + extracted_crc <= swap_bytes32_cut(tmp,5); + when "11111111" => + data_mask_d <= "00000000"; + data_valid_d <= '0'; + data_valid <= '0'; + data_mask_dd <= "00001111"; + crc_eop_d <= '1'; + extracted_crc <= swap_bytes32_cut(tmp,4); + when others => + data_err <= '1'; + data_valid_d <= '0'; + data_valid <= '0'; + end case; + end if; + + if check_err_func(align_res_ctrl, align_res_data) then + data_err <= '1'; + end if; + + -- Check CRC validity + -- takes 1 cycle, but crc itself has 4 cycles + -- 5 cycles + if crc_vld = '1' then + if extracted_crc /= crc32_result then + -- CRC error + rx_err_i <= '1'; + else + rx_err_i <= data_err_eq_m1; + end if; + rx_err_valid_i <= '1'; + end if; + + -- Reset only input to pipeline reset should be held asserted long + -- enough to reset pipeline + if RST = '1' then + align_mode <= S_L0; + align_buf_data <= (others => '0'); + align_buf_ctrl <= (others => '0'); + align_res_data <= (others => '0'); + align_res_ctrl <= (others => '0'); + data_valid <= '0'; + sop_found <= '0'; + + end if; + end if; + end process; + + -- Equalized signals + rx_data_eq_inst : ssrl_bus + generic map (rx_data'length, 4) port map (XGMII_RXCLK, crc_data_dd,rx_data_i); + rx_be_eq_inst : ssrl_bus + generic map (rx_be'length, 5) port map (XGMII_RXCLK, data_mask_dd, rx_be_i); + rx_dv_eq_inst : ssrl + generic map (4) port map (XGMII_RXCLK, crc_dv_dd, rx_dv_i); + data_err_eq_inst : ssrl + generic map (4) port map (XGMII_RXCLK, data_err, data_err_eq_m1); + + + + + +-------------------------------------------------------------------------------- +-- Process data +-------------------------------------------------------------------------------- + + + + + crc32_gen_inst: entity work.crc32_gen + generic map ( + DATA_WIDTH => 64 + ) + port map( + DI => crc_data_dd, + DI_DV => crc_dv_dd, + EOP => crc_eop_dd, + MASK => crc_mask_dd, + CLK => XGMII_RXCLK, + RESET => RST, + CRC => crc32_result, + DO_DV => crc_vld + ); + + + crc32_result_n <= not crc32_result; + + -- Outputs assignment + + RX_DATA <= rx_data_i; + RX_DV <= rx_dv_i; + RX_BE <= rx_be_i; + RX_ERR <= rx_err_i; + RX_ERR_VALID <= rx_err_valid_i; + +end architecture; Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_rx_if.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_rx_if.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_rx_if.vhd (revision 3) @@ -0,0 +1,273 @@ +------------------------------------------------------------------------------- +-- +-- (C) Copyright 2017 DFC Design, s.r.o., Brno, Czech Republic +-- Author: Marek Kvas (m.kvas@dfcdesign.cz) +-- +------------------------------------------------------------------------------- +-- This file is part of UDP/IPv4 for 10 G Ethernet core. +-- +-- UDP/IPv4 for 10 G Ethernet core is free software: you can +-- redistribute it and/or modify it under the terms of +-- the GNU Lesser General Public License as published by the Free +-- Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- UDP/IPv4 for 10 G Ethernet core is distributed in the hope that +-- it will be useful, but WITHOUT ANY WARRANTY; without even +-- the implied warranty of MERCHANTABILITY or FITNESS FOR A +-- PARTICULAR PURPOSE. See the GNU Lesser General Public License +-- for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with UDP/IPv4 for 10 G Ethernet core. If not, +-- see . +------------------------------------------------------------------------------- +-- +-- This module sits on outputs of tag and data fifos and translates them +-- to easily understandable interface. +-- +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.frame_pkg.all; + +Library UNISIM; +use UNISIM.vcomponents.all; + + +entity frame_rx_if is + port ( + RST : in std_logic; + CLK : in std_logic; + + FRAME_VALID : out std_logic; + FRAME_RD_EN : in std_logic; + FRAME_LENGTH : out std_logic_vector(C_FP_TAG_LENGTH_BITLEN - 1 downto 0); + FRAME_LAST : out std_logic; + FRAME_BE : out std_logic_vector(7 downto 0); + FRAME_DATA : out data64_port_type; + SRC_MAC : out mac_addr_type; + SRC_IP : out ip_addr_type; + SRC_UDP : out udp_port_type; + DST_UDP : out udp_port_type; + + + -- Tag and data fifos + DFIFO_DATA : in fp_dfifo_data_type; + DFIFO_RD_EN : out std_logic; + DFIFO_EMPTY : in std_logic; + + TFIFO_DATA : in fp_tfifo_data_type; + TFIFO_RD_EN : out std_logic; + TFIFO_EMPTY : in std_logic + ); +end entity; + + + + +architecture synthesis of frame_rx_if is + + constant LC_RI_LENGTH_POS : integer := 0; + constant LC_RI_DST_UDP_POS : integer := + LC_RI_LENGTH_POS + C_FP_TAG_LENGTH_BITLEN; + constant LC_RI_SRC_UDP_POS : integer := + LC_RI_DST_UDP_POS + udp_port_type'length; + constant LC_RI_SRC_IP_POS : integer := + LC_RI_SRC_UDP_POS + udp_port_type'length; + constant LC_RI_SRC_MAC_POS : integer := + LC_RI_SRC_IP_POS + ip_addr_type'length; + + + + -- Main FSM + type main_fsm_type is (M_WTAG, M_DATA, M_DISCARD); + signal main_fsm_cur : main_fsm_type; + signal main_fsm_next : main_fsm_type; + + -- FSM control signals + signal load_tag_info : std_logic; + signal load_ret_info : std_logic; + signal load_discard_info : std_logic; + signal dfifo_rd_en_discard : std_logic; + signal last_word : std_logic; + + + signal frame_length_i : std_logic_vector(FRAME_LENGTH'range); + signal data_cnt : unsigned(FRAME_LENGTH'range); + + signal frame_valid_i : std_logic; + + -- Internal variant of output signal + signal tfifo_rd_en_i : std_logic; + signal dfifo_rd_en_i : std_logic; + + -- Decomposed tag fifo + signal tfifo_length : std_logic_vector(C_FP_TAG_LENGTH_BITLEN - 1 + downto 0); + signal tfifo_flags : std_logic_vector(C_FP_TAG_FLAGS_BITLEN - 1 + downto 0); + signal tfifo_return_info: std_logic_vector(C_FP_TAG_RET_INFO_LENGTH_BITLEN -1 + downto 0); + signal return_info : std_logic_vector( + 4*C_FP_TAG_RET_INFO_LENGTH_BITLEN-1 downto 0); + + -- Decompose data fifo + signal dfifo_rdata : data64_port_type; + signal dfifo_be : std_logic_vector(7 downto 0); + +begin + + -- Decompose fifos + tfifo_length <= TFIFO_DATA(C_FP_TAG_LENGTH_BITLEN - 1 downto 0); + tfifo_return_info <= TFIFO_DATA(C_FP_TAG_RET_INFO_LENGTH_BITLEN - 1 + downto 0); + tfifo_flags <= TFIFO_DATA(TFIFO_DATA'left + downto C_FP_TAG_RET_INFO_LENGTH_BITLEN); + + + dfifo_rdata <= DFIFO_DATA(dfifo_rdata'range); + dfifo_be <= DFIFO_DATA(DFIFO_DATA'left downto dfifo_rdata'length); + + -- Main FSM + main_fsm_adv_proc : process (RST, CLK) + begin + if RST = '1' then + main_fsm_cur <= M_WTAG; + elsif rising_edge(CLK) then + main_fsm_cur <= main_fsm_next; + end if; + end process; + + main_fsm_trans_out_proc : process (main_fsm_cur, TFIFO_EMPTY, tfifo_flags, + last_word, dfifo_rd_en_i) + begin + + load_tag_info <= '0'; + load_discard_info <= '0'; + dfifo_rd_en_discard <= '0'; + tfifo_rd_en_i <= '0'; + load_ret_info <= '0'; + frame_valid_i <= '0'; + + main_fsm_next <= main_fsm_cur; + case main_fsm_cur is + when M_WTAG => + if TFIFO_EMPTY = '0' then + tfifo_rd_en_i <= '1'; + case tfifo_flags is + when C_FP_TAG_UDP => + main_fsm_next <= M_DATA; + load_tag_info <= '1'; + when C_FP_TAG_RETINF => + load_ret_info <= '1'; + when C_FP_TAG_DISCARD => + load_discard_info <= '1'; + main_fsm_next <= M_DISCARD; + when others => + load_discard_info <= '1'; + main_fsm_next <= M_DISCARD; + end case; + end if; + when M_DATA => + frame_valid_i <= '1'; + if last_word = '1' and dfifo_rd_en_i = '1' then + main_fsm_next <= M_WTAG; + end if; + when M_DISCARD => + dfifo_rd_en_discard <= '1'; + if last_word = '1' then + main_fsm_next <= M_WTAG; + end if; + when others => + main_fsm_next <= M_WTAG; + end case; + + end process; + + + -- Count down packet len + data_cnt_proc : process (RST, CLK) + variable len : unsigned(tfifo_length'range); + begin + if RST = '1' then + data_cnt <= (others => '0'); + last_word <= '0'; + elsif rising_edge(CLK) then + if load_tag_info = '1' or + load_discard_info = '1' then + len := unsigned(tfifo_length); + data_cnt <= len; + if len <= 8 then + last_word <= '1'; + else + last_word <= '0'; + end if; + elsif dfifo_rd_en_i = '1' then + last_word <= '0'; + if data_cnt > 8 then + data_cnt <= data_cnt - 8; + if data_cnt <= 16 then + last_word <= '1'; + end if; + else + data_cnt <= (others => '0'); + end if; + end if; + end if; + end process; + + -- Register return info + ret_info_reg_proc : process(CLK) + begin + if rising_edge(CLK) then + if load_ret_info = '1' or load_tag_info = '1' then + for i in return_info'length/C_FP_TAG_RET_INFO_LENGTH_BITLEN + downto 2 loop + return_info(i * C_FP_TAG_RET_INFO_LENGTH_BITLEN - 1 downto + (i-1) * C_FP_TAG_RET_INFO_LENGTH_BITLEN ) <= + return_info((i-1) * C_FP_TAG_RET_INFO_LENGTH_BITLEN - 1 downto + (i-2) * C_FP_TAG_RET_INFO_LENGTH_BITLEN ); + end loop; + return_info(C_FP_TAG_RET_INFO_LENGTH_BITLEN - 1 downto 0) <= + tfifo_return_info; + end if; + end if; + end process; + + dfifo_rd_en_i <= '1' when dfifo_rd_en_discard = '1' or + (frame_valid_i = '1' and FRAME_RD_EN = '1') else '0'; + + + -- Outputs assignment + -- DFIFO_EMPTY should never happen if tags are consistent. + -- If it happens there is no way back. Reset is needed to recover. + DFIFO_RD_EN <= dfifo_rd_en_i; + TFIFO_RD_EN <= tfifo_rd_en_i; + + FRAME_VALID <= frame_valid_i; + FRAME_LAST <= last_word; + FRAME_DATA <= dfifo_rdata; + FRAME_BE <= dfifo_be; + FRAME_LENGTH <= return_info(C_FP_TAG_LENGTH_BITLEN - 1 downto 0); + DST_UDP <= return_info(LC_RI_DST_UDP_POS + udp_port_type'left + downto LC_RI_DST_UDP_POS ); + SRC_UDP <= return_info(LC_RI_SRC_UDP_POS + udp_port_type'left + downto LC_RI_SRC_UDP_POS); + SRC_IP <= return_info(LC_RI_SRC_IP_POS + ip_addr_type'left + downto LC_RI_SRC_IP_POS ); + SRC_MAC <= return_info(LC_RI_SRC_MAC_POS + mac_addr_type'left + downto LC_RI_SRC_MAC_POS); + + + + +end architecture; + + + Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_throttle.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_throttle.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_throttle.vhd (revision 3) @@ -0,0 +1,115 @@ +------------------------------------------------------------------------------- +-- +-- (C) Copyright 2017 DFC Design, s.r.o., Brno, Czech Republic +-- Author: Marek Kvas (m.kvas@dfcdesign.cz) +-- +------------------------------------------------------------------------------- +-- This file is part of UDP/IPv4 for 10 G Ethernet core. +-- +-- UDP/IPv4 for 10 G Ethernet core is free software: you can +-- redistribute it and/or modify it under the terms of +-- the GNU Lesser General Public License as published by the Free +-- Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- UDP/IPv4 for 10 G Ethernet core is distributed in the hope that +-- it will be useful, but WITHOUT ANY WARRANTY; without even +-- the implied warranty of MERCHANTABILITY or FITNESS FOR A +-- PARTICULAR PURPOSE. See the GNU Lesser General Public License +-- for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with UDP/IPv4 for 10 G Ethernet core. If not, +-- see . +------------------------------------------------------------------------------- +-- +-- This simple core is used to slow transmission of frames down when +-- link speed is lower than maximum 10 Gbps. AS RXAUI runs on the same +-- frequency regardless of link speed and data are stored in the PHY FIFO +-- it is necessary to insert such IFG that average speed is equal to +-- link speed. Otherwise PHY FIFO overflows and frames get corrupted. +-- +-- Output is combinatorial. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + + +entity frame_throttle is + port ( + CLK : in std_logic; + + LINK_SPEED : in std_logic_vector(2 downto 0); + + FG_BUSY : in std_logic; + FG_IDLE_IFG : in std_logic; + BUSY_THROTTLED : out std_logic + ); +end entity; + + + +architecture synthesis of frame_throttle is + + function spd_to_ratio_cnt(spd : std_logic_vector) return natural is + variable ratio : natural; + begin + case to_integer(unsigned(spd)) is + -- 10 Gbps must be handled differently + when 1 => ratio := 2; -- 5 Gbps + when 2 => ratio := 4; -- 2.5 Gbps + when 3 => ratio := 10; -- 1 Gbps + when 4 => ratio := 100; -- 100 Mbps + when others => ratio := 1000; -- 10 Mbps and unsupported link speds + end case; + return ratio; + end function; + + signal busy_throttle_i : std_logic; + signal throttle_cnt : integer range 0 to 2**16-1; + signal ratio_cnt : integer range 0 to 1000 -1; + + +begin + + throttle_proc : process(CLK) + begin + if rising_edge(CLK) then + if LINK_SPEED = "000" then + -- 10 Gbps - maximal speed + busy_throttle_i <= '0'; + elsif FG_BUSY = '1' or FG_IDLE_IFG = '1' then + busy_throttle_i <= '1'; + throttle_cnt <= throttle_cnt + 1; + ratio_cnt <= 0; + else + -- -1 for one cycle spent in cycle counting and + -- -1 for counter limit as usual forms -2 altogether. + if ratio_cnt < spd_to_ratio_cnt(LINK_SPEED) - 2 then + ratio_cnt <= ratio_cnt + 1; + else + ratio_cnt <= 0; + if throttle_cnt > 1 then + throttle_cnt <= throttle_cnt - 1; + else + busy_throttle_i <= '0'; + end if; + end if; + end if; + end if; + end process; + + + BUSY_THROTTLED <= FG_BUSY or busy_throttle_i; + +end architecture; + + + + + + + Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_tx_if.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_tx_if.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/frame_tx_if.vhd (revision 3) @@ -0,0 +1,189 @@ +------------------------------------------------------------------------------- +-- +-- (C) Copyright 2017 DFC Design, s.r.o., Brno, Czech Republic +-- Author: Marek Kvas (m.kvas@dfcdesign.cz) +-- +------------------------------------------------------------------------------- +-- This file is part of UDP/IPv4 for 10 G Ethernet core. +-- +-- UDP/IPv4 for 10 G Ethernet core is free software: you can +-- redistribute it and/or modify it under the terms of +-- the GNU Lesser General Public License as published by the Free +-- Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- UDP/IPv4 for 10 G Ethernet core is distributed in the hope that +-- it will be useful, but WITHOUT ANY WARRANTY; without even +-- the implied warranty of MERCHANTABILITY or FITNESS FOR A +-- PARTICULAR PURPOSE. See the GNU Lesser General Public License +-- for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with UDP/IPv4 for 10 G Ethernet core. If not, +-- see . +------------------------------------------------------------------------------- +-- +-- This module adapts TX interface of frame_gen module to be closer to +-- the one used by RX path. It adds FIFO to TX data path so users don't +-- have to provide data in each cycle and length doesn't have to be known +-- in advance. +-- +-- +-- Two FIFOs are used. One to store data from user, the other one to store +-- tags currently consisting of length of frame to be sent only. +-- FIFOs are placed outside this module. They must be FWFT. +-- +-- It is aimed to be used together with frame_gen_fifo_if that sits on the +-- other side of FIFOs and interfaces them to the frame_gen module. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.frame_pkg.all; + +Library UNISIM; +use UNISIM.vcomponents.all; + + +entity frame_tx_if is + port ( + CLK : in std_logic; + RST : in std_logic; + + DST_MAC : in mac_addr_type; + DST_IP : in ip_addr_type; + SRC_UDP : in udp_port_type; + DST_UDP : in udp_port_type; + + FRAME_VALID : in std_logic; + FRAME_RDY : out std_logic; + FRAME_LAST : in std_logic; + FRAME_BE : in std_logic_vector(7 downto 0); + FRAME_DATA : in data64_port_type; + + -- Tag and data fifos + DFIFO_DATA : out txi_dfifo_data_type; + DFIFO_WR_EN : out std_logic; + DFIFO_FULL : in std_logic; + + TFIFO_DATA : out txi_tfifo_data_type; + TFIFO_WR_EN : out std_logic; + TFIFO_FULL : in std_logic + ); +end entity; + + + +architecture synthesis of frame_tx_if is + + + type in_fsm_type is (I_IDLE_DI0, I_DI1, I_DATA, I_TAG); + signal in_fsm_cur : in_fsm_type; + signal in_fsm_next : in_fsm_type; + + signal frame_rdy_i : std_logic; + signal dfifo_wr_en_i : std_logic; + signal tfifo_wr_en_i : std_logic; + signal length_cnt_en : std_logic; + signal length_cnt : unsigned(txi_tfifo_data_type'length - 1 downto 0); + + +begin + + -- FSM controlling insertion of data into FIFOs + in_fsm_adv_proc : process(CLK) + begin + if rising_edge(CLK) then + if RST = '1' then + in_fsm_cur <= I_IDLE_DI0; + else + in_fsm_cur <= in_fsm_next; + end if; + end if; + end process; + + + in_fsm_trans_out_proc : process(in_fsm_cur, DFIFO_FULL, TFIFO_FULL, + DST_MAC, DST_UDP, DST_IP, SRC_UDP, + FRAME_VALID, FRAME_LAST, FRAME_BE, FRAME_DATA) + begin + in_fsm_next <= in_fsm_cur; + frame_rdy_i <= not DFIFO_FULL; + dfifo_wr_en_i <= '0'; + tfifo_wr_en_i <= '0'; + DFIFO_DATA <= FRAME_BE & FRAME_DATA; + length_cnt_en <= '0'; + + case in_fsm_cur is + when I_IDLE_DI0 => + frame_rdy_i <= '0'; + DFIFO_DATA <= x"000000" & DST_IP & SRC_UDP; + if FRAME_VALID = '1' and DFIFO_FULL = '0' then + in_fsm_next <= I_DI1; + dfifo_wr_en_i <= '1'; + end if; + when I_DI1 => + frame_rdy_i <= '0'; + DFIFO_DATA <= x"00" & DST_MAC & DST_UDP; + if DFIFO_FULL = '0' then + in_fsm_next <= I_DATA; + dfifo_wr_en_i <= '1'; + end if; + when I_DATA => + length_cnt_en <= '1'; + -- In case of empty packet this inserts empty word into the fifo + -- frame_gen_fifo_if is responsible for discarding it + dfifo_wr_en_i <= not DFIFO_FULL and FRAME_VALID; + if FRAME_LAST = '1' and FRAME_VALID = '1' and DFIFO_FULL = '0' then + in_fsm_next <= I_TAG; + end if; + when I_TAG => + frame_rdy_i <= '0'; + if TFIFO_FULL = '0' then + tfifo_wr_en_i <= '1'; + in_fsm_next <= I_IDLE_DI0; + end if; + when others => + in_fsm_next <= I_TAG; + end case; + end process; + + -- Count written bytes to determine length; + length_proc : process(CLK) + begin + if rising_edge(CLK) then + if length_cnt_en = '1' then + if dfifo_wr_en_i = '1' then + if FRAME_LAST = '0' then + length_cnt <= length_cnt + 8; + else + case (FRAME_BE) is + when "11111111" => length_cnt <= length_cnt + 8; + when "01111111" => length_cnt <= length_cnt + 7; + when "00111111" => length_cnt <= length_cnt + 6; + when "00011111" => length_cnt <= length_cnt + 5; + when "00001111" => length_cnt <= length_cnt + 4; + when "00000111" => length_cnt <= length_cnt + 3; + when "00000011" => length_cnt <= length_cnt + 2; + when "00000001" => length_cnt <= length_cnt + 1; + when "00000000" => length_cnt <= length_cnt + 0; + when others => length_cnt <= length_cnt + 8; + end case; + end if; + end if; + else + length_cnt <= (others => '0'); + end if; + end if; + end process; + + + FRAME_RDY <= frame_rdy_i; + DFIFO_WR_EN <= dfifo_wr_en_i; + TFIFO_WR_EN <= tfifo_wr_en_i; + TFIFO_DATA <= std_logic_vector(length_cnt); +end architecture; Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/math_pack.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/math_pack.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/math_pack.vhd (revision 3) @@ -0,0 +1,79 @@ +------------------------------------------------------------------------------- +-- +-- (C) Copyright 2017 DFC Design, s.r.o., Brno, Czech Republic +-- Author: Marek Kvas (m.kvas@dfcdesign.cz) +-- +------------------------------------------------------------------------------- +-- This file is part of UDP/IPv4 for 10 G Ethernet core. +-- +-- UDP/IPv4 for 10 G Ethernet core is free software: you can +-- redistribute it and/or modify it under the terms of +-- the GNU Lesser General Public License as published by the Free +-- Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- UDP/IPv4 for 10 G Ethernet core is distributed in the hope that +-- it will be useful, but WITHOUT ANY WARRANTY; without even +-- the implied warranty of MERCHANTABILITY or FITNESS FOR A +-- PARTICULAR PURPOSE. See the GNU Lesser General Public License +-- for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with UDP/IPv4 for 10 G Ethernet core. If not, +-- see . +------------------------------------------------------------------------------- +-- +-- This is minimal package of commonly used math functions. It is not +-- meant for synthesis to hw operators. It is meant for use in signal and +-- port definitions as a convenient way to calculate vector widths. +-- +------------------------------------------------------------------------------- + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +package math_pack is + -- Return integer equal to or higher than 2 base logarithm of i + function log2(i : natural) return integer; + + -- Return smaller of two integers + function min(a : integer; b: integer) return integer; + -- Return higher of two integers + function max(a : integer; b: integer) return integer; + +end package; + +package body math_pack is + + function log2(i : natural) return integer is + variable ret : integer := 0; + begin + + while 2**ret < i loop + ret := ret + 1; + end loop; + + return ret; + end function; + + function min(a : integer; b: integer) return integer is + begin + if a > b then + return b; + else + return a; + end if; + end function; + + function max(a : integer; b: integer) return integer is + begin + if a < b then + return b; + else + return a; + end if; + end function; + +end package body; Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/srl_pkg.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/srl_pkg.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/srl_pkg.vhd (revision 3) @@ -0,0 +1,161 @@ +------------------------------------------------------------------------------- +-- +-- (C) Copyright 2013 DFC Design, s.r.o., Brno, Czech Republic +-- Author: Marek Kvas (m.kvas@dfcdesign.cz) +-- +------------------------------------------------------------------------------- +-- This file is part of UDP/IPv4 for 10 G Ethernet core. +-- +-- UDP/IPv4 for 10 G Ethernet core is free software: you can +-- redistribute it and/or modify it under the terms of +-- the GNU Lesser General Public License as published by the Free +-- Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- UDP/IPv4 for 10 G Ethernet core is distributed in the hope that +-- it will be useful, but WITHOUT ANY WARRANTY; without even +-- the implied warranty of MERCHANTABILITY or FITNESS FOR A +-- PARTICULAR PURPOSE. See the GNU Lesser General Public License +-- for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with UDP/IPv4 for 10 G Ethernet core. If not, +-- see . +------------------------------------------------------------------------------- +-- +-- First block of the receiver chain. It has XGMII as an input. +-- Output is raw 64 bit data guaranteed to be aligned on the frame start and +-- stripped of preamble and CRC, valid signal covering frame data, +-- and byte enable signal that shall be used in case data amount is not +-- 8 byte aligned. Another signal indicates either CRC error or line +-- signalized error, in which case frame should be discarded. +-- +-- Byte enable signal is guaranteed to be all ones for whole frame except +-- for the last word, in case packet length is not 8 byte integer divisible. +-- +-- This can work under assumption that minimum IPG in incoming stream is +-- 4 bytes. This means when T is on L0-L4, S cannot be on L5-L7 of the same +-- cycle and when T is on L5-L7 S cannot be on L0-L3 of the next cycle. Under +-- this condition DV is always at leased one cycle deasserted between +-- frames. +-- +-- +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +package srl_pkg is + component ssrl_bus is + generic ( + g_width : positive; + g_delay : positive + ); + port ( + CLK : in std_logic; + DATA_IN : in std_logic_vector(g_width - 1 downto 0); + DATA_OUT : out std_logic_vector(g_width - 1 downto 0) + ); + end component; + + component ssrl is + generic ( + g_delay : positive + ); + port ( + CLK : in std_logic; + DATA_IN : in std_logic; + DATA_OUT : out std_logic + ); + end component; + +end package; + + + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity ssrl_bus is + generic ( + g_width : positive; + g_delay : positive + ); + port ( + CLK : in std_logic; + DATA_IN : in std_logic_vector(g_width - 1 downto 0); + DATA_OUT : out std_logic_vector(g_width - 1 downto 0) + ); +end entity; + + +architecture synthesis of ssrl_bus is + + type array_slv is array (g_width-1 downto 0) of + std_logic_vector(g_delay-1 downto 0); + signal shift_reg : array_slv; + + +begin + + + shift_proc: process (CLK) + begin + if rising_edge(CLK) then + for i in 0 to g_width-1 loop + shift_reg(i) <= shift_reg(i)(g_delay-2 downto 0) & DATA_IN(i); + end loop; + end if; + end process; + + output_proc : process (shift_reg) + begin + for i in 0 to g_width-1 loop + DATA_OUT(i) <= shift_reg(i)(g_delay-1); + end loop; + end process; + +end architecture; + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +use work.srl_pkg.all; + +entity ssrl is + generic ( + g_delay : positive + ); + port ( + CLK : in std_logic; + DATA_IN : in std_logic; + DATA_OUT : out std_logic + ); +end entity; + + +architecture synthesis of ssrl is + + +begin + + ssrl_bus_inst : ssrl_bus + generic map ( + g_width => 1, + g_delay => g_delay + ) + port map ( + CLK => CLK, + DATA_IN(0) => DATA_IN, + DATA_OUT(0) => DATA_OUT + ); + + +end architecture; + + Index: udp_ipv4_for_10g_ethernet/trunk/src/hdl/udp_ip_10g.vhd =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/src/hdl/udp_ip_10g.vhd (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/src/hdl/udp_ip_10g.vhd (revision 3) @@ -0,0 +1,574 @@ +------------------------------------------------------------------------------- +-- +-- (C) Copyright 2017 DFC Design, s.r.o., Brno, Czech Republic +-- Author: Marek Kvas (m.kvas@dfcdesign.cz) +-- +------------------------------------------------------------------------------- +-- This file is part of UDP/IPv4 for 10 G Ethernet core. +-- +-- UDP/IPv4 for 10 G Ethernet core is free software: you can +-- redistribute it and/or modify it under the terms of +-- the GNU Lesser General Public License as published by the Free +-- Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- UDP/IPv4 for 10 G Ethernet core is distributed in the hope that +-- it will be useful, but WITHOUT ANY WARRANTY; without even +-- the implied warranty of MERCHANTABILITY or FITNESS FOR A +-- PARTICULAR PURPOSE. See the GNU Lesser General Public License +-- for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with UDP/IPv4 for 10 G Ethernet core. If not, +-- see . +------------------------------------------------------------------------------- +-- +-- This wrapper forms complete UDP/IP stack with both RX and TX capability. +-- Both RX and TX interfaces are buffered using FIFOs. +-- +-- The core is aimed to be connected to 64 bit XGMII interface of Xilinx RXAUI +-- core or equivalent. +-- +-- All ports (both RX and TX) are synchronous to single clock - CLK. It is +-- supposed to run at 156.25 MHz regardless of link speed. +-- Because XGMII doesn't adjust frequency to link speed and there is no flow +-- control mechanism embedded in XGMII protocol, UDP/IP core must be informed +-- what link speed is currently used through LINK_SPEED port. Available values +-- are as follows: +-- "000" - 10 Gbps +-- "001" - 5 Gbps +-- "010" - 2.5 Gbps +-- "011" - 1 Gbps +-- "100" - 100 Mbps +-- "101" - 10 Mbps +-- +-- Speed is adjusted by insertion of inter-frame gaps. If real link speed is +-- higher than core is set to, no data are lost or corrupted, but speed of TX +-- is suboptimal. If real link speed is smaller than core is set to, some +-- packets may not be sent at all, or can be sent incomplete. Reception is +-- not dependent on this setting and will work regardless link speed. +-- +-- Each path (rx and tx) contains two FIFOs. One for data and one for tags +-- that describe what is stored in data FIFO. Data FIFOs have both +-- width 72 bits - 64 bit data + 8 bit byte enables. Tag FIFOs differ. +-- TX tag fifo is 16 bits wide, RX tag fifo 34 bits wide. +-- In both paths whole datagram must be stored in FIFO before it is transmitted +-- to network(tx) or provided to user(rx). +-- Depth of each FIFO can be set by user. Data FIFO must be at least deep +-- enough to contain one the largest packet that can appear on network. +-- In most cases MTU is either 1500 or 9000 bytes. So 1500/8 = 187 and +-- 9000/8 = 1125 are minimal depths for data FIFOs. +-- Depth of tag fifos depends on maximum number of datagrams that are expected +-- to be buffered in data FIFO at once. For tx tag fifo one word is used for +-- each buffered packet. For rx three words of tag FIFO are used per each +-- buffered packets. +-- User can also select technology used to implelent FIFOs. Type can be +-- either selected automatically by Vivado tools ("auto") or it can be +-- implemented in block RAMs ("block") or as distributed memory in LUTs +-- ("distributed"). FIFOs are instances of Xilinx Parametrized Macros. +-- Each project that uses this macros must have XPM libraries enabled. +-- This can be done with tcl command: +-- set_property XPM_LIBRARIES {XPM_CDC XPM_MEMORY} [current_project] +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +----- +-- These are Xilinx parametrized macro libraries. It is used to +-- Instantiate FIFOs without the need to create sub-IP +-- They also support setting depth and type in generics +-- +-- If new project is created and these macros should be used TCL command +-- set_property XPM_LIBRARIES {XPM_CDC XPM_MEMORY} [current_project] +-- must be used to enable their usage. +---------------------- +Library xpm; +use xpm.vcomponents.all; + +library work; +use work.frame_pkg.all; + + +entity udp_ip_10g is + generic ( + g_tx_dfifo_depth : integer := 2048; -- 72 bit data width (8 data bytes) + g_tx_tfifo_depth : integer := 128; -- 16 bit data width + g_rx_dfifo_depth : integer := 2048; -- 72 bit data width (8 data bytes) + g_rx_tfifo_depth : integer := 128; -- 34 bit data width + g_tx_dfifo_type : string := "block"; -- auto, block, distributed + g_tx_tfifo_type : string := "block"; + g_rx_dfifo_type : string := "block"; + g_rx_tfifo_type : string := "block" + ); + port ( + RST : in std_logic; + CLK : in std_logic; + + -- General control signals + LINK_SPEED : in std_logic_vector(2 downto 0); + + + -- Host information user interface + HOST_MAC : in std_logic_vector(47 downto 0); + HOST_IP : in std_logic_vector(31 downto 0); + HOST_IP_NETMASK : in std_logic_vector(31 downto 0); + + -- TX user interface + TX_DST_MAC : in std_logic_vector(47 downto 0); + TX_DST_IP : in std_logic_vector(31 downto 0); + TX_SRC_UDP : in std_logic_vector(15 downto 0); + TX_DST_UDP : in std_logic_vector(15 downto 0); + + TX_FRAME_VALID : in std_logic; + TX_FRAME_RDY : out std_logic; + TX_FRAME_LAST : in std_logic; + TX_FRAME_BE : in std_logic_vector(7 downto 0); + TX_FRAME_DATA : in std_logic_vector(63 downto 0); + + -- RX user interface + RX_SRC_MAC : out std_logic_vector(47 downto 0); + RX_SRC_IP : out std_logic_vector(31 downto 0); + RX_SRC_UDP : out std_logic_vector(15 downto 0); + RX_DST_UDP : out std_logic_vector(15 downto 0); + + RX_FRAME_VALID : out std_logic; + RX_FRAME_RDY : in std_logic; + RX_FRAME_LAST : out std_logic; + RX_FRAME_BE : out std_logic_vector(7 downto 0); + RX_FRAME_DATA : out std_logic_vector(63 downto 0); + RX_FRAME_LENGTH : out std_logic_vector(15 downto 0); + + -- XGMII interface + XGMII_TXC : out std_logic_vector(7 downto 0); + XGMII_TXD : out std_logic_vector(63 downto 0); + XGMII_RXC : in std_logic_vector(7 downto 0); + XGMII_RXD : in std_logic_vector(63 downto 0) + + + ); +end entity; + + +architecture synthesis of udp_ip_10g is + + signal rst_cnt : integer range 0 to 15 := 0; + signal rst_internal : std_logic := '1'; + +----------------------------------------------------------------------------- +-- TX Path internal connection signals +----------------------------------------------------------------------------- + + signal txi_wr_dfifo_data : txi_dfifo_data_type; + signal txi_wr_dfifo_wr_en : std_logic; + signal txi_wr_dfifo_full : std_logic; + + signal txi_wr_tfifo_data : txi_tfifo_data_type; + signal txi_wr_tfifo_wr_en : std_logic; + signal txi_wr_tfifo_full : std_logic; + + signal txi_rd_dfifo_data : txi_dfifo_data_type; + signal txi_rd_dfifo_rd_en : std_logic; + signal txi_rd_dfifo_empty : std_logic; + + signal txi_rd_tfifo_data : txi_tfifo_data_type; + signal txi_rd_tfifo_rd_en : std_logic; + signal txi_rd_tfifo_empty : std_logic; + + + signal fg_tx_en : std_logic; + signal fg_busy : std_logic; + signal fg_idle_ifg : std_logic; + signal fg_busy_throttled : std_logic; + signal fg_data_ren : std_logic; + signal fg_data_in : std_logic_vector(63 downto 0); + signal fg_data_len : std_logic_vector(15 downto 0); + signal fg_dst_mac : std_logic_vector(47 downto 0); + signal fg_dst_ip : std_logic_vector(31 downto 0); + signal fg_src_port : std_logic_vector(15 downto 0); + signal fg_dst_port : std_logic_vector(15 downto 0); + +----------------------------------------------------------------------------- +-- RX Path internal connection signals +----------------------------------------------------------------------------- + + + signal frx_wr_dfifo_data : fp_dfifo_data_type; + signal frx_wr_dfifo_wr_en : std_logic; + signal frx_wr_dfifo_full : std_logic := '0'; + + signal frx_wr_tfifo_data : fp_tfifo_data_type; + signal frx_wr_tfifo_wr_en : std_logic; + signal frx_wr_tfifo_full : std_logic := '0'; + + signal frx_rd_dfifo_data : fp_dfifo_data_type; + signal frx_rd_dfifo_rd_en : std_logic; + signal frx_rd_dfifo_empty : std_logic; + signal frx_rd_tfifo_data : fp_tfifo_data_type; + signal frx_rd_tfifo_rd_en : std_logic; + signal frx_rd_tfifo_empty : std_logic; + + signal fr_rx_data : std_logic_vector(63 downto 0); + signal fr_rx_dv : std_logic; + signal fr_rx_be : std_logic_vector(7 downto 0); + signal fr_rx_err : std_logic; + signal fr_rx_err_valid : std_logic; + + +begin + + -- Reset should take at least 16 cycles to flush pipeline + rst_proc : process (CLK) + begin + if rising_edge(CLK) then + if RST = '1' then + rst_cnt <= 0; + rst_internal <= '1'; + elsif rst_cnt < 15 then + rst_cnt <= rst_cnt + 1; + rst_internal <= '1'; + else + rst_internal <= '0'; + end if; + end if; + end process; + +----------------------------------------------------------------------------- +-- TX Path +----------------------------------------------------------------------------- + + frame_tx_if_inst : entity work.frame_tx_if + port map( + CLK => CLK, + RST => rst_internal, + + DST_MAC => TX_DST_MAC, + DST_IP => TX_DST_IP, + SRC_UDP => TX_SRC_UDP, + DST_UDP => TX_DST_UDP, + + FRAME_VALID => TX_FRAME_VALID, + FRAME_RDY => TX_FRAME_RDY, + FRAME_LAST => TX_FRAME_LAST, + FRAME_BE => TX_FRAME_BE, + FRAME_DATA => TX_FRAME_DATA, + + -- Tag and data fifos + DFIFO_DATA => txi_wr_dfifo_data, + DFIFO_WR_EN => txi_wr_dfifo_wr_en, + DFIFO_FULL => txi_wr_dfifo_full, + + TFIFO_DATA => txi_wr_tfifo_data, + TFIFO_WR_EN => txi_wr_tfifo_wr_en, + TFIFO_FULL => txi_wr_tfifo_full + ); + + txi_dfifo_inst : xpm_fifo_sync + generic map ( + FIFO_MEMORY_TYPE => g_tx_dfifo_type, + ECC_MODE => "no_ecc", + FIFO_WRITE_DEPTH => g_tx_dfifo_depth, + WRITE_DATA_WIDTH => txi_dfifo_data_type'length, + WR_DATA_COUNT_WIDTH => 1, + PROG_FULL_THRESH => 10, + FULL_RESET_VALUE => 0, + READ_MODE => "fwft", + FIFO_READ_LATENCY => 0, + READ_DATA_WIDTH => txi_dfifo_data_type'length, + RD_DATA_COUNT_WIDTH => 1, + PROG_EMPTY_THRESH => 10, + DOUT_RESET_VALUE => "0", + WAKEUP_TIME => 0 + ) + port map ( + rst => rst_internal, + wr_clk => CLK, + wr_en => txi_wr_dfifo_wr_en, + din => txi_wr_dfifo_data, + full => txi_wr_dfifo_full, + overflow => open, + wr_rst_busy => open, + rd_en => txi_rd_dfifo_rd_en, + dout => txi_rd_dfifo_data, + empty => txi_rd_dfifo_empty, + underflow => open, + rd_rst_busy => open, + prog_full => open, + wr_data_count => open, + prog_empty => open, + rd_data_count => open, + sleep => '0', + injectsbiterr => '0', + injectdbiterr => '0', + sbiterr => open, + dbiterr => open + ); + + txi_tfifo_inst : xpm_fifo_sync + generic map ( + FIFO_MEMORY_TYPE => g_tx_tfifo_type, + ECC_MODE => "no_ecc", + FIFO_WRITE_DEPTH => g_tx_tfifo_depth, + WRITE_DATA_WIDTH => txi_wr_tfifo_data'length, + WR_DATA_COUNT_WIDTH => 1, + PROG_FULL_THRESH => 10, + FULL_RESET_VALUE => 0, + READ_MODE => "fwft", + FIFO_READ_LATENCY => 0, + READ_DATA_WIDTH => txi_wr_tfifo_data'length, + RD_DATA_COUNT_WIDTH => 1, + PROG_EMPTY_THRESH => 10, + DOUT_RESET_VALUE => "0", + WAKEUP_TIME => 0 + ) + port map ( + rst => rst_internal, + wr_clk => CLK, + wr_en => txi_wr_tfifo_wr_en, + din => txi_wr_tfifo_data, + full => txi_wr_tfifo_full, + overflow => open, + wr_rst_busy => open, + rd_en => txi_rd_tfifo_rd_en, + dout => txi_rd_tfifo_data, + empty => txi_rd_tfifo_empty, + underflow => open, + rd_rst_busy => open, + prog_full => open, + wr_data_count => open, + prog_empty => open, + rd_data_count => open, + sleep => '0', + injectsbiterr => '0', + injectdbiterr => '0', + sbiterr => open, + dbiterr => open + ); + + + frame_gen_fifo_if_inst : entity work.frame_gen_fifo_if + port map ( + CLK => clk, + + DST_MAC => fg_dst_mac, + DST_IP => fg_dst_ip, + SRC_UDP => fg_src_port, + DST_UDP => fg_dst_port, + + -- Frame generator if + FG_TX_EN => fg_tx_en, + FG_BUSY => fg_busy_throttled, + FG_DATA_REN => fg_data_ren, + FG_DATA_IN => fg_data_in, + FG_DATA_LEN => fg_data_len, + + -- Tag and data fifos + DFIFO_DATA => txi_rd_dfifo_data, + DFIFO_RD_EN => txi_rd_dfifo_rd_en, + DFIFO_EMPTY => txi_rd_dfifo_empty, + + TFIFO_DATA => txi_rd_tfifo_data, + TFIFO_RD_EN => txi_rd_tfifo_rd_en, + TFIFO_EMPTY => txi_rd_tfifo_empty + + ); + + frame_throttle_inst : entity work.frame_throttle + port map ( + CLK => clk, + LINK_SPEED => LINK_SPEED, + + FG_BUSY => fg_busy, + FG_IDLE_IFG => fg_idle_ifg, + BUSY_THROTTLED => fg_busy_throttled + ); + + + -- Frame generator + frame_gen_inst : entity work.frame_gen + port map ( + RESET => rst_internal, + TX_EN => fg_tx_en, + BUSY => fg_busy, + IDLE_IFG => fg_idle_ifg, + DATA_REN => fg_data_ren, + DATA_IN => fg_data_in, + DATA_LEN => fg_data_len, + SRC_MAC => HOST_MAC, + DST_MAC => fg_dst_mac, + SRC_IP => HOST_IP, + DST_IP => fg_dst_ip, + SRC_PORT => fg_src_port, + DST_PORT => fg_dst_port, + TX_CLK => clk, + TXD => XGMII_TXD, + TXC => XGMII_TXC + ); +----------------------------------------------------------------------------- +-- RX Path +----------------------------------------------------------------------------- + + -- Frame receiver + frame_receiver_inst : entity work.frame_receiver + port map ( + RST => rst_internal, + + -- XGMII RX input interface + XGMII_RXCLK => CLK, + XGMII_RXD => XGMII_RXD, + XGMII_RXC => XGMII_RXC, + + -- Output interface + RX_DATA => fr_rx_data, + RX_DV => fr_rx_dv, + RX_BE => fr_rx_be, + RX_ERR => fr_rx_err, + RX_ERR_VALID => fr_rx_err_valid + ); + + -- Frame process + frame_process_inst : entity work.frame_process + port map ( + RST => rst_internal, + CLK => CLK, + + -- Interface towards frame receiver + RX_DATA => fr_rx_data, + RX_DV => fr_rx_dv, + RX_BE => fr_rx_be, + RX_ERR => fr_rx_err, + RX_ERR_VALID => fr_rx_err_valid, + + DFIFO_DATA => frx_wr_dfifo_data, + DFIFO_WR_EN => frx_wr_dfifo_wr_en, + DFIFO_FULL => frx_wr_dfifo_full, + + TFIFO_DATA => frx_wr_tfifo_data, + TFIFO_WR_EN => frx_wr_tfifo_wr_en, + TFIFO_FULL => frx_wr_tfifo_full, + + MAC_ADDR => HOST_MAC, + IP_ADDR => HOST_IP, + IP_NET_MASK => HOST_IP_NETMASK + ); + + rx_dfifo_inst : xpm_fifo_sync + generic map ( + FIFO_MEMORY_TYPE => g_rx_dfifo_type, + ECC_MODE => "no_ecc", + FIFO_WRITE_DEPTH => g_rx_dfifo_depth, + WRITE_DATA_WIDTH => fp_dfifo_data_type'length, + WR_DATA_COUNT_WIDTH => 1, + PROG_FULL_THRESH => 10, + FULL_RESET_VALUE => 0, + READ_MODE => "fwft", + FIFO_READ_LATENCY => 0, + READ_DATA_WIDTH => fp_dfifo_data_type'length, + RD_DATA_COUNT_WIDTH => 1, + PROG_EMPTY_THRESH => 10, + DOUT_RESET_VALUE => "0", + WAKEUP_TIME => 0 + ) + port map ( + rst => rst_internal, + wr_clk => CLK, + wr_en => frx_wr_dfifo_wr_en, + din => frx_wr_dfifo_data, + full => frx_wr_dfifo_full, + overflow => open, + wr_rst_busy => open, + rd_en => frx_rd_dfifo_rd_en, + dout => frx_rd_dfifo_data, + empty => frx_rd_dfifo_empty, + underflow => open, + rd_rst_busy => open, + prog_full => open, + wr_data_count => open, + prog_empty => open, + rd_data_count => open, + sleep => '0', + injectsbiterr => '0', + injectdbiterr => '0', + sbiterr => open, + dbiterr => open + ); + + rx_tfifo_inst : xpm_fifo_sync + generic map ( + FIFO_MEMORY_TYPE => g_rx_tfifo_type, + ECC_MODE => "no_ecc", + FIFO_WRITE_DEPTH => g_rx_tfifo_depth, + WRITE_DATA_WIDTH => frx_wr_tfifo_data'length, + WR_DATA_COUNT_WIDTH => 1, + PROG_FULL_THRESH => 10, + FULL_RESET_VALUE => 0, + READ_MODE => "fwft", + FIFO_READ_LATENCY => 0, + READ_DATA_WIDTH => frx_wr_tfifo_data'length, + RD_DATA_COUNT_WIDTH => 1, + PROG_EMPTY_THRESH => 10, + DOUT_RESET_VALUE => "0", + WAKEUP_TIME => 0 + ) + port map ( + rst => rst_internal, + wr_clk => CLK, + wr_en => frx_wr_tfifo_wr_en, + din => frx_wr_tfifo_data, + full => frx_wr_tfifo_full, + overflow => open, + wr_rst_busy => open, + rd_en => frx_rd_tfifo_rd_en, + dout => frx_rd_tfifo_data, + empty => frx_rd_tfifo_empty, + underflow => open, + rd_rst_busy => open, + prog_full => open, + wr_data_count => open, + prog_empty => open, + rd_data_count => open, + sleep => '0', + injectsbiterr => '0', + injectdbiterr => '0', + sbiterr => open, + dbiterr => open + ); + + frame_rx_if_inst : entity work.frame_rx_if + port map ( + RST => rst_internal, + CLK => clk, + + FRAME_VALID => RX_FRAME_VALID, + FRAME_RD_EN => RX_FRAME_RDY, + FRAME_LENGTH => RX_FRAME_LENGTH, + FRAME_LAST => RX_FRAME_LAST, + FRAME_BE => RX_FRAME_BE, + FRAME_DATA => RX_FRAME_DATA, + SRC_MAC => RX_SRC_MAC, + SRC_IP => RX_SRC_IP, + SRC_UDP => RX_SRC_UDP, + DST_UDP => RX_DST_UDP, + + + -- Tag and data fifos + DFIFO_DATA => frx_rd_dfifo_data, + DFIFO_RD_EN => frx_rd_dfifo_rd_en, + DFIFO_EMPTY => frx_rd_dfifo_empty, + + TFIFO_DATA => frx_rd_tfifo_data, + TFIFO_RD_EN => frx_rd_tfifo_rd_en, + TFIFO_EMPTY => frx_rd_tfifo_empty + ); + + +end architecture; + + + + + + + Index: udp_ipv4_for_10g_ethernet/trunk/xgui/udp_ip_10g_v1_0.tcl =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/xgui/udp_ip_10g_v1_0.tcl (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/xgui/udp_ip_10g_v1_0.tcl (revision 3) @@ -0,0 +1,134 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + set g_tx_dfifo_depth [ipgui::add_param $IPINST -name "g_tx_dfifo_depth" -parent ${Page_0}] + set_property tooltip {FIFO must be larger than MTU (width is 8 bytes)} ${g_tx_dfifo_depth} + set g_tx_tfifo_depth [ipgui::add_param $IPINST -name "g_tx_tfifo_depth" -parent ${Page_0}] + set_property tooltip {One record (depth level) for one outstanding datagram} ${g_tx_tfifo_depth} + set g_rx_dfifo_depth [ipgui::add_param $IPINST -name "g_rx_dfifo_depth" -parent ${Page_0}] + set_property tooltip {FIFO must be larger than MTU (width is 8 bytes)} ${g_rx_dfifo_depth} + set g_rx_tfifo_depth [ipgui::add_param $IPINST -name "g_rx_tfifo_depth" -parent ${Page_0}] + set_property tooltip {Three records (depth levels) are needed for each received packet in RX FIFO} ${g_rx_tfifo_depth} + ipgui::add_param $IPINST -name "g_rx_tfifo_type" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "g_rx_dfifo_type" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "g_tx_tfifo_type" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "g_tx_dfifo_type" -parent ${Page_0} -widget comboBox + + +} + +proc update_PARAM_VALUE.g_rx_dfifo_depth { PARAM_VALUE.g_rx_dfifo_depth } { + # Procedure called to update g_rx_dfifo_depth when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.g_rx_dfifo_depth { PARAM_VALUE.g_rx_dfifo_depth } { + # Procedure called to validate g_rx_dfifo_depth + return true +} + +proc update_PARAM_VALUE.g_rx_dfifo_type { PARAM_VALUE.g_rx_dfifo_type } { + # Procedure called to update g_rx_dfifo_type when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.g_rx_dfifo_type { PARAM_VALUE.g_rx_dfifo_type } { + # Procedure called to validate g_rx_dfifo_type + return true +} + +proc update_PARAM_VALUE.g_rx_tfifo_depth { PARAM_VALUE.g_rx_tfifo_depth } { + # Procedure called to update g_rx_tfifo_depth when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.g_rx_tfifo_depth { PARAM_VALUE.g_rx_tfifo_depth } { + # Procedure called to validate g_rx_tfifo_depth + return true +} + +proc update_PARAM_VALUE.g_rx_tfifo_type { PARAM_VALUE.g_rx_tfifo_type } { + # Procedure called to update g_rx_tfifo_type when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.g_rx_tfifo_type { PARAM_VALUE.g_rx_tfifo_type } { + # Procedure called to validate g_rx_tfifo_type + return true +} + +proc update_PARAM_VALUE.g_tx_dfifo_depth { PARAM_VALUE.g_tx_dfifo_depth } { + # Procedure called to update g_tx_dfifo_depth when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.g_tx_dfifo_depth { PARAM_VALUE.g_tx_dfifo_depth } { + # Procedure called to validate g_tx_dfifo_depth + return true +} + +proc update_PARAM_VALUE.g_tx_dfifo_type { PARAM_VALUE.g_tx_dfifo_type } { + # Procedure called to update g_tx_dfifo_type when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.g_tx_dfifo_type { PARAM_VALUE.g_tx_dfifo_type } { + # Procedure called to validate g_tx_dfifo_type + return true +} + +proc update_PARAM_VALUE.g_tx_tfifo_depth { PARAM_VALUE.g_tx_tfifo_depth } { + # Procedure called to update g_tx_tfifo_depth when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.g_tx_tfifo_depth { PARAM_VALUE.g_tx_tfifo_depth } { + # Procedure called to validate g_tx_tfifo_depth + return true +} + +proc update_PARAM_VALUE.g_tx_tfifo_type { PARAM_VALUE.g_tx_tfifo_type } { + # Procedure called to update g_tx_tfifo_type when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.g_tx_tfifo_type { PARAM_VALUE.g_tx_tfifo_type } { + # Procedure called to validate g_tx_tfifo_type + return true +} + + +proc update_MODELPARAM_VALUE.g_tx_dfifo_depth { MODELPARAM_VALUE.g_tx_dfifo_depth PARAM_VALUE.g_tx_dfifo_depth } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.g_tx_dfifo_depth}] ${MODELPARAM_VALUE.g_tx_dfifo_depth} +} + +proc update_MODELPARAM_VALUE.g_tx_tfifo_depth { MODELPARAM_VALUE.g_tx_tfifo_depth PARAM_VALUE.g_tx_tfifo_depth } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.g_tx_tfifo_depth}] ${MODELPARAM_VALUE.g_tx_tfifo_depth} +} + +proc update_MODELPARAM_VALUE.g_rx_dfifo_depth { MODELPARAM_VALUE.g_rx_dfifo_depth PARAM_VALUE.g_rx_dfifo_depth } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.g_rx_dfifo_depth}] ${MODELPARAM_VALUE.g_rx_dfifo_depth} +} + +proc update_MODELPARAM_VALUE.g_rx_tfifo_depth { MODELPARAM_VALUE.g_rx_tfifo_depth PARAM_VALUE.g_rx_tfifo_depth } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.g_rx_tfifo_depth}] ${MODELPARAM_VALUE.g_rx_tfifo_depth} +} + +proc update_MODELPARAM_VALUE.g_tx_dfifo_type { MODELPARAM_VALUE.g_tx_dfifo_type PARAM_VALUE.g_tx_dfifo_type } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.g_tx_dfifo_type}] ${MODELPARAM_VALUE.g_tx_dfifo_type} +} + +proc update_MODELPARAM_VALUE.g_tx_tfifo_type { MODELPARAM_VALUE.g_tx_tfifo_type PARAM_VALUE.g_tx_tfifo_type } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.g_tx_tfifo_type}] ${MODELPARAM_VALUE.g_tx_tfifo_type} +} + +proc update_MODELPARAM_VALUE.g_rx_dfifo_type { MODELPARAM_VALUE.g_rx_dfifo_type PARAM_VALUE.g_rx_dfifo_type } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.g_rx_dfifo_type}] ${MODELPARAM_VALUE.g_rx_dfifo_type} +} + +proc update_MODELPARAM_VALUE.g_rx_tfifo_type { MODELPARAM_VALUE.g_rx_tfifo_type PARAM_VALUE.g_rx_tfifo_type } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.g_rx_tfifo_type}] ${MODELPARAM_VALUE.g_rx_tfifo_type} +} + Index: udp_ipv4_for_10g_ethernet/trunk/component.xml =================================================================== --- udp_ipv4_for_10g_ethernet/trunk/component.xml (nonexistent) +++ udp_ipv4_for_10g_ethernet/trunk/component.xml (revision 3) @@ -0,0 +1,1134 @@ + + + dfcdesign.cz + dfc + udp_ip_10g + 1.0 + + + RST + + + + + + + RST + + + RST + + + + + + CLK + + + + + + + CLK + + + CLK + + + + + + ASSOCIATED_RESET + RST + + + ASSOCIATED_BUSIF + xgmii + + + + + xgmii + + + + + + + TXD + + + XGMII_TXD + + + + + RXC + + + XGMII_RXC + + + + + TXC + + + XGMII_TXC + + + + + RXD + + + XGMII_RXD + + + + + + + + + xilinx_anylanguagesynthesis + Synthesis + :vivado.xilinx.com:synthesis + VHDL + udp_ip_10g + + xilinx_anylanguagesynthesis_xilinx_com_ip_lib_fifo_1_0__ref_view_fileset + + + xilinx_anylanguagesynthesis_xilinx_com_ip_lib_cdc_1_0__ref_view_fileset + + + xilinx_anylanguagesynthesis_xilinx_com_ip_lib_pkg_1_0__ref_view_fileset + + + xilinx_anylanguagesynthesis_xilinx_com_ip_lib_srl_fifo_1_0__ref_view_fileset + + + xilinx_anylanguagesynthesis_view_fileset + + + + viewChecksum + 1a377e3e + + + + + xilinx_anylanguagebehavioralsimulation + Simulation + :vivado.xilinx.com:simulation + VHDL + udp_ip_10g + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_lib_fifo_1_0__ref_view_fileset + + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_lib_cdc_1_0__ref_view_fileset + + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_lib_pkg_1_0__ref_view_fileset + + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_lib_srl_fifo_1_0__ref_view_fileset + + + xilinx_anylanguagebehavioralsimulation_view_fileset + + + + viewChecksum + 1a377e3e + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + 8516bdaa + + + + + + + RST + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + CLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + LINK_SPEED + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + HOST_MAC + + in + + 47 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + HOST_IP + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + HOST_IP_NETMASK + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + TX_DST_MAC + + in + + 47 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + TX_DST_IP + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + TX_SRC_UDP + + in + + 15 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + TX_DST_UDP + + in + + 15 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + TX_FRAME_VALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + TX_FRAME_RDY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + TX_FRAME_LAST + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + TX_FRAME_BE + + in + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + TX_FRAME_DATA + + in + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + RX_SRC_MAC + + out + + 47 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + RX_SRC_IP + + out + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + RX_SRC_UDP + + out + + 15 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + RX_DST_UDP + + out + + 15 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + RX_FRAME_VALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + RX_FRAME_RDY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + RX_FRAME_LAST + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + RX_FRAME_BE + + out + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + RX_FRAME_DATA + + out + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + RX_FRAME_LENGTH + + out + + 15 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + XGMII_TXC + + out + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + XGMII_TXD + + out + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + XGMII_RXC + + in + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + XGMII_RXD + + in + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + + g_tx_dfifo_depth + G Tx Dfifo Depth + 2048 + + + g_tx_tfifo_depth + G Tx Tfifo Depth + 128 + + + g_rx_dfifo_depth + G Rx Dfifo Depth + 2048 + + + g_rx_tfifo_depth + G Rx Tfifo Depth + 128 + + + g_tx_dfifo_type + G Tx Dfifo Type + block + + + g_tx_tfifo_type + G Tx Tfifo Type + block + + + g_rx_dfifo_type + G Rx Dfifo Type + block + + + g_rx_tfifo_type + G Rx Tfifo Type + block + + + + + + choice_list_91f1634a + block + auto + distributed + + + + + xilinx_anylanguagesynthesis_view_fileset + + src/hdl/math_pack.vhd + vhdlSource + + + src/hdl/crc/crc32_fast64_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast128_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast16_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast8_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast1024_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast24_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast32_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast256_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast512_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_gen_tab_tree.vhd + vhdlSource + + + src/hdl/crc/crc32_gen_fsm.vhd + vhdlSource + + + src/hdl/frame_pkg.vhd + vhdlSource + + + src/hdl/srl_pkg.vhd + vhdlSource + + + src/hdl/crc/crc32_gen.vhd + vhdlSource + + + src/hdl/frame_tx_if.vhd + vhdlSource + + + src/hdl/frame_throttle.vhd + vhdlSource + + + src/hdl/frame_gen_fifo_if.vhd + vhdlSource + + + src/hdl/frame_rx_if.vhd + vhdlSource + + + src/hdl/frame_process.vhd + vhdlSource + + + src/hdl/frame_gen.vhd + vhdlSource + + + src/hdl/frame_receiver.vhd + vhdlSource + + + src/hdl/udp_ip_10g.vhd + vhdlSource + CHECKSUM_08f45ea1 + + + + xilinx_anylanguagesynthesis_xilinx_com_ip_lib_fifo_1_0__ref_view_fileset + + + + + + + + + + xilinx_anylanguagesynthesis_xilinx_com_ip_lib_cdc_1_0__ref_view_fileset + + + + + + + + + + xilinx_anylanguagesynthesis_xilinx_com_ip_lib_pkg_1_0__ref_view_fileset + + + + + + + + + + xilinx_anylanguagesynthesis_xilinx_com_ip_lib_srl_fifo_1_0__ref_view_fileset + + + + + + + + + + xilinx_anylanguagebehavioralsimulation_view_fileset + + src/hdl/math_pack.vhd + vhdlSource + + + src/hdl/crc/crc32_fast64_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast128_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast16_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast8_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast1024_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast24_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast32_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast256_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast512_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_fast_tab.vhd + vhdlSource + + + src/hdl/crc/crc32_gen_tab_tree.vhd + vhdlSource + + + src/hdl/crc/crc32_gen_fsm.vhd + vhdlSource + + + src/hdl/frame_pkg.vhd + vhdlSource + + + src/hdl/srl_pkg.vhd + vhdlSource + + + src/hdl/crc/crc32_gen.vhd + vhdlSource + + + src/hdl/frame_tx_if.vhd + vhdlSource + + + src/hdl/frame_throttle.vhd + vhdlSource + + + src/hdl/frame_gen_fifo_if.vhd + vhdlSource + + + src/hdl/frame_rx_if.vhd + vhdlSource + + + src/hdl/frame_process.vhd + vhdlSource + + + src/hdl/frame_gen.vhd + vhdlSource + + + src/hdl/frame_receiver.vhd + vhdlSource + + + src/hdl/udp_ip_10g.vhd + vhdlSource + + + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_lib_fifo_1_0__ref_view_fileset + + + + + + + + + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_lib_cdc_1_0__ref_view_fileset + + + + + + + + + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_lib_pkg_1_0__ref_view_fileset + + + + + + + + + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_lib_srl_fifo_1_0__ref_view_fileset + + + + + + + + + + xilinx_xpgui_view_fileset + + xgui/udp_ip_10g_v1_0.tcl + tclSource + CHECKSUM_a48910cf + XGUI_VERSION_2 + + + + UDP/IPv4 core for 10 Gbps Ethernet. Six link speeds are supported - 10 Gbps, 5 Gbps, 2.5 Gbps, 1 Gbps, 100 Mbps, 10 Mbps - (full-duplex only). + + + Component_Name + udp_ip_10g_v1_0 + + + g_tx_dfifo_depth + Tx data FIFO depth + 2048 + + + g_tx_tfifo_depth + Tx tag FIFO depth + 128 + + + g_rx_dfifo_depth + Rx data FIFO depth + 2048 + + + g_rx_tfifo_depth + Rx tag FIFO depth + 128 + + + g_tx_dfifo_type + Memory type for TX data FIFO + block + + + g_tx_tfifo_type + Memory type for TX tag FIFO + block + + + g_rx_dfifo_type + Memory type for RX data FIFO + block + + + g_rx_tfifo_type + Memory type for RX tag FIFO + block + + + + + + kintex7 + + + /UserIP + + UDP/IP + package_project + + XPM_CDC + XPM_MEMORY + + DFC Design, s.r.o. + http://www.dfcdesign.cz + 3 + 2017-04-18T09:56:50Z + + c:/projects/dfc/xenie/ip_repo_dev/udp_ip_10g/trunk + c:/projects/dfc/xenie/ip_repo_dev/udp_ip_10g/trunk + c:/projects/dfc/xenie/ip_repo_dev/udp_ip_10g/trunk + + + + 2016.4 + + + + + + + +

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.