{-# LANGUAGE PatternSynonyms #-} module Game.Chess.Polyglot.Hash (hashPosition) where import Data.Bits (Bits (xor)) import Data.Coerce (coerce) import Data.Ix (Ix (index)) import Data.Maybe (mapMaybe) import Data.Vector.Unboxed (Vector, fromList, unsafeIndex) import Data.Word (Word64) import Game.Chess.Internal (Castle (..), Color (..), PieceType, Position (color), attackedByPawn, castlingRights, enPassantSquare, opponent, pattern King, pattern Pawn, pieceAt) import Game.Chess.Internal.Square (File (..), Square, file, pattern A1, pattern H8) hashPosition :: Position -> Word64 hashPosition :: Position -> Word64 hashPosition Position pos = Word64 piece forall a. Bits a => a -> a -> a `xor` Word64 castling forall a. Bits a => a -> a -> a `xor` Word64 ep forall a. Bits a => a -> a -> a `xor` Word64 turn where piece :: Word64 piece = forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr forall a. Bits a => a -> a -> a xor Word64 0 forall a b. (a -> b) -> a -> b $ forall a b. (a -> Maybe b) -> [a] -> [b] mapMaybe Square -> Maybe Word64 f [Square A1 .. Square H8] where f :: Square -> Maybe Word64 f Square sq = (\(Color c, PieceType p) -> (PieceType, Color, Square) -> Word64 pieceKey (PieceType p, Color c, Square sq)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Position -> Square -> Maybe (Color, PieceType) pieceAt Position pos Square sq castling :: Word64 castling = forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr (forall a. Bits a => a -> a -> a xor forall b c a. (b -> c) -> (a -> b) -> a -> c . (Color, Castle) -> Word64 castleKey) Word64 0 forall a b. (a -> b) -> a -> b $ Position -> [(Color, Castle)] castlingRights Position pos ep :: Word64 ep = case Position -> Maybe Square enPassantSquare Position pos of Just Square sq | Square -> Position -> Bool attackedByPawn Square sq Position pos -> File -> Word64 epKey (Square -> File file Square sq) Maybe Square _ -> Word64 0 turn :: Word64 turn = case Position -> Color color Position pos of Color White -> Word64 turnKey Color Black -> Word64 0 pieceKey :: (PieceType, Color, Square) -> Word64 pieceKey :: (PieceType, Color, Square) -> Word64 pieceKey = forall a. Unbox a => Vector a -> Int -> a unsafeIndex Vector Word64 pieceKeys forall b c a. (b -> c) -> (a -> b) -> a -> c . forall a. Ix a => (a, a) -> a -> Int index ((PieceType Pawn,Color Black,Square A1),(PieceType King,Color White,Square H8)) castleKey :: (Color, Castle) -> Word64 castleKey :: (Color, Castle) -> Word64 castleKey (Color c, Castle s) = forall a. Unbox a => Vector a -> Int -> a unsafeIndex Vector Word64 castleKeys forall a b. (a -> b) -> a -> b $ forall a. Ix a => (a, a) -> a -> Int index ((Color Black, Castle Kingside), (Color White, Castle Queenside)) (Color -> Color opponent Color c, Castle s) epKey :: File -> Word64 epKey :: File -> Word64 epKey = forall a. Unbox a => Vector a -> Int -> a unsafeIndex Vector Word64 epKeys forall b c a. (b -> c) -> (a -> b) -> a -> c . coerce :: forall a b. Coercible a b => a -> b coerce pieceKeys, castleKeys, epKeys :: Vector Word64 pieceKeys :: Vector Word64 pieceKeys = forall a. Unbox a => [a] -> Vector a fromList [Word64 0x9D39247E33776D41,Word64 0x2AF7398005AAA5C7,Word64 0x44DB015024623547,Word64 0x9C15F73E62A76AE2 ,Word64 0x75834465489C0C89,Word64 0x3290AC3A203001BF,Word64 0x0FBBAD1F61042279,Word64 0xE83A908FF2FB60CA ,Word64 0x0D7E765D58755C10,Word64 0x1A083822CEAFE02D,Word64 0x9605D5F0E25EC3B0,Word64 0xD021FF5CD13A2ED5 ,Word64 0x40BDF15D4A672E32,Word64 0x011355146FD56395,Word64 0x5DB4832046F3D9E5,Word64 0x239F8B2D7FF719CC ,Word64 0x05D1A1AE85B49AA1,Word64 0x679F848F6E8FC971,Word64 0x7449BBFF801FED0B,Word64 0x7D11CDB1C3B7ADF0 ,Word64 0x82C7709E781EB7CC,Word64 0xF3218F1C9510786C,Word64 0x331478F3AF51BBE6,Word64 0x4BB38DE5E7219443 ,Word64 0xAA649C6EBCFD50FC,Word64 0x8DBD98A352AFD40B,Word64 0x87D2074B81D79217,Word64 0x19F3C751D3E92AE1 ,Word64 0xB4AB30F062B19ABF,Word64 0x7B0500AC42047AC4,Word64 0xC9452CA81A09D85D,Word64 0x24AA6C514DA27500 ,Word64 0x4C9F34427501B447,Word64 0x14A68FD73C910841,Word64 0xA71B9B83461CBD93,Word64 0x03488B95B0F1850F ,Word64 0x637B2B34FF93C040,Word64 0x09D1BC9A3DD90A94,Word64 0x3575668334A1DD3B,Word64 0x735E2B97A4C45A23 ,Word64 0x18727070F1BD400B,Word64 0x1FCBACD259BF02E7,Word64 0xD310A7C2CE9B6555,Word64 0xBF983FE0FE5D8244 ,Word64 0x9F74D14F7454A824,Word64 0x51EBDC4AB9BA3035,Word64 0x5C82C505DB9AB0FA,Word64 0xFCF7FE8A3430B241 ,Word64 0x3253A729B9BA3DDE,Word64 0x8C74C368081B3075,Word64 0xB9BC6C87167C33E7,Word64 0x7EF48F2B83024E20 ,Word64 0x11D505D4C351BD7F,Word64 0x6568FCA92C76A243,Word64 0x4DE0B0F40F32A7B8,Word64 0x96D693460CC37E5D ,Word64 0x42E240CB63689F2F,Word64 0x6D2BDCDAE2919661,Word64 0x42880B0236E4D951,Word64 0x5F0F4A5898171BB6 ,Word64 0x39F890F579F92F88,Word64 0x93C5B5F47356388B,Word64 0x63DC359D8D231B78,Word64 0xEC16CA8AEA98AD76 ,Word64 0x5355F900C2A82DC7,Word64 0x07FB9F855A997142,Word64 0x5093417AA8A7ED5E,Word64 0x7BCBC38DA25A7F3C ,Word64 0x19FC8A768CF4B6D4,Word64 0x637A7780DECFC0D9,Word64 0x8249A47AEE0E41F7,Word64 0x79AD695501E7D1E8 ,Word64 0x14ACBAF4777D5776,Word64 0xF145B6BECCDEA195,Word64 0xDABF2AC8201752FC,Word64 0x24C3C94DF9C8D3F6 ,Word64 0xBB6E2924F03912EA,Word64 0x0CE26C0B95C980D9,Word64 0xA49CD132BFBF7CC4,Word64 0xE99D662AF4243939 ,Word64 0x27E6AD7891165C3F,Word64 0x8535F040B9744FF1,Word64 0x54B3F4FA5F40D873,Word64 0x72B12C32127FED2B ,Word64 0xEE954D3C7B411F47,Word64 0x9A85AC909A24EAA1,Word64 0x70AC4CD9F04F21F5,Word64 0xF9B89D3E99A075C2 ,Word64 0x87B3E2B2B5C907B1,Word64 0xA366E5B8C54F48B8,Word64 0xAE4A9346CC3F7CF2,Word64 0x1920C04D47267BBD ,Word64 0x87BF02C6B49E2AE9,Word64 0x092237AC237F3859,Word64 0xFF07F64EF8ED14D0,Word64 0x8DE8DCA9F03CC54E ,Word64 0x9C1633264DB49C89,Word64 0xB3F22C3D0B0B38ED,Word64 0x390E5FB44D01144B,Word64 0x5BFEA5B4712768E9 ,Word64 0x1E1032911FA78984,Word64 0x9A74ACB964E78CB3,Word64 0x4F80F7A035DAFB04,Word64 0x6304D09A0B3738C4 ,Word64 0x2171E64683023A08,Word64 0x5B9B63EB9CEFF80C,Word64 0x506AACF489889342,Word64 0x1881AFC9A3A701D6 ,Word64 0x6503080440750644,Word64 0xDFD395339CDBF4A7,Word64 0xEF927DBCF00C20F2,Word64 0x7B32F7D1E03680EC ,Word64 0xB9FD7620E7316243,Word64 0x05A7E8A57DB91B77,Word64 0xB5889C6E15630A75,Word64 0x4A750A09CE9573F7 ,Word64 0xCF464CEC899A2F8A,Word64 0xF538639CE705B824,Word64 0x3C79A0FF5580EF7F,Word64 0xEDE6C87F8477609D ,Word64 0x799E81F05BC93F31,Word64 0x86536B8CF3428A8C,Word64 0x97D7374C60087B73,Word64 0xA246637CFF328532 ,Word64 0x043FCAE60CC0EBA0,Word64 0x920E449535DD359E,Word64 0x70EB093B15B290CC,Word64 0x73A1921916591CBD ,Word64 0x56436C9FE1A1AA8D,Word64 0xEFAC4B70633B8F81,Word64 0xBB215798D45DF7AF,Word64 0x45F20042F24F1768 ,Word64 0x930F80F4E8EB7462,Word64 0xFF6712FFCFD75EA1,Word64 0xAE623FD67468AA70,Word64 0xDD2C5BC84BC8D8FC ,Word64 0x7EED120D54CF2DD9,Word64 0x22FE545401165F1C,Word64 0xC91800E98FB99929,Word64 0x808BD68E6AC10365 ,Word64 0xDEC468145B7605F6,Word64 0x1BEDE3A3AEF53302,Word64 0x43539603D6C55602,Word64 0xAA969B5C691CCB7A ,Word64 0xA87832D392EFEE56,Word64 0x65942C7B3C7E11AE,Word64 0xDED2D633CAD004F6,Word64 0x21F08570F420E565 ,Word64 0xB415938D7DA94E3C,Word64 0x91B859E59ECB6350,Word64 0x10CFF333E0ED804A,Word64 0x28AED140BE0BB7DD ,Word64 0xC5CC1D89724FA456,Word64 0x5648F680F11A2741,Word64 0x2D255069F0B7DAB3,Word64 0x9BC5A38EF729ABD4 ,Word64 0xEF2F054308F6A2BC,Word64 0xAF2042F5CC5C2858,Word64 0x480412BAB7F5BE2A,Word64 0xAEF3AF4A563DFE43 ,Word64 0x19AFE59AE451497F,Word64 0x52593803DFF1E840,Word64 0xF4F076E65F2CE6F0,Word64 0x11379625747D5AF3 ,Word64 0xBCE5D2248682C115,Word64 0x9DA4243DE836994F,Word64 0x066F70B33FE09017,Word64 0x4DC4DE189B671A1C ,Word64 0x51039AB7712457C3,Word64 0xC07A3F80C31FB4B4,Word64 0xB46EE9C5E64A6E7C,Word64 0xB3819A42ABE61C87 ,Word64 0x21A007933A522A20,Word64 0x2DF16F761598AA4F,Word64 0x763C4A1371B368FD,Word64 0xF793C46702E086A0 ,Word64 0xD7288E012AEB8D31,Word64 0xDE336A2A4BC1C44B,Word64 0x0BF692B38D079F23,Word64 0x2C604A7A177326B3 ,Word64 0x4850E73E03EB6064,Word64 0xCFC447F1E53C8E1B,Word64 0xB05CA3F564268D99,Word64 0x9AE182C8BC9474E8 ,Word64 0xA4FC4BD4FC5558CA,Word64 0xE755178D58FC4E76,Word64 0x69B97DB1A4C03DFE,Word64 0xF9B5B7C4ACC67C96 ,Word64 0xFC6A82D64B8655FB,Word64 0x9C684CB6C4D24417,Word64 0x8EC97D2917456ED0,Word64 0x6703DF9D2924E97E ,Word64 0xC547F57E42A7444E,Word64 0x78E37644E7CAD29E,Word64 0xFE9A44E9362F05FA,Word64 0x08BD35CC38336615 ,Word64 0x9315E5EB3A129ACE,Word64 0x94061B871E04DF75,Word64 0xDF1D9F9D784BA010,Word64 0x3BBA57B68871B59D ,Word64 0xD2B7ADEEDED1F73F,Word64 0xF7A255D83BC373F8,Word64 0xD7F4F2448C0CEB81,Word64 0xD95BE88CD210FFA7 ,Word64 0x336F52F8FF4728E7,Word64 0xA74049DAC312AC71,Word64 0xA2F61BB6E437FDB5,Word64 0x4F2A5CB07F6A35B3 ,Word64 0x87D380BDA5BF7859,Word64 0x16B9F7E06C453A21,Word64 0x7BA2484C8A0FD54E,Word64 0xF3A678CAD9A2E38C ,Word64 0x39B0BF7DDE437BA2,Word64 0xFCAF55C1BF8A4424,Word64 0x18FCF680573FA594,Word64 0x4C0563B89F495AC3 ,Word64 0x40E087931A00930D,Word64 0x8CFFA9412EB642C1,Word64 0x68CA39053261169F,Word64 0x7A1EE967D27579E2 ,Word64 0x9D1D60E5076F5B6F,Word64 0x3810E399B6F65BA2,Word64 0x32095B6D4AB5F9B1,Word64 0x35CAB62109DD038A ,Word64 0xA90B24499FCFAFB1,Word64 0x77A225A07CC2C6BD,Word64 0x513E5E634C70E331,Word64 0x4361C0CA3F692F12 ,Word64 0xD941ACA44B20A45B,Word64 0x528F7C8602C5807B,Word64 0x52AB92BEB9613989,Word64 0x9D1DFA2EFC557F73 ,Word64 0x722FF175F572C348,Word64 0x1D1260A51107FE97,Word64 0x7A249A57EC0C9BA2,Word64 0x04208FE9E8F7F2D6 ,Word64 0x5A110C6058B920A0,Word64 0x0CD9A497658A5698,Word64 0x56FD23C8F9715A4C,Word64 0x284C847B9D887AAE ,Word64 0x04FEABFBBDB619CB,Word64 0x742E1E651C60BA83,Word64 0x9A9632E65904AD3C,Word64 0x881B82A13B51B9E2 ,Word64 0x506E6744CD974924,Word64 0xB0183DB56FFC6A79,Word64 0x0ED9B915C66ED37E,Word64 0x5E11E86D5873D484 ,Word64 0xF678647E3519AC6E,Word64 0x1B85D488D0F20CC5,Word64 0xDAB9FE6525D89021,Word64 0x0D151D86ADB73615 ,Word64 0xA865A54EDCC0F019,Word64 0x93C42566AEF98FFB,Word64 0x99E7AFEABE000731,Word64 0x48CBFF086DDF285A ,Word64 0x7F9B6AF1EBF78BAF,Word64 0x58627E1A149BBA21,Word64 0x2CD16E2ABD791E33,Word64 0xD363EFF5F0977996 ,Word64 0x0CE2A38C344A6EED,Word64 0x1A804AADB9CFA741,Word64 0x907F30421D78C5DE,Word64 0x501F65EDB3034D07 ,Word64 0x37624AE5A48FA6E9,Word64 0x957BAF61700CFF4E,Word64 0x3A6C27934E31188A,Word64 0xD49503536ABCA345 ,Word64 0x088E049589C432E0,Word64 0xF943AEE7FEBF21B8,Word64 0x6C3B8E3E336139D3,Word64 0x364F6FFA464EE52E ,Word64 0xD60F6DCEDC314222,Word64 0x56963B0DCA418FC0,Word64 0x16F50EDF91E513AF,Word64 0xEF1955914B609F93 ,Word64 0x565601C0364E3228,Word64 0xECB53939887E8175,Word64 0xBAC7A9A18531294B,Word64 0xB344C470397BBA52 ,Word64 0x65D34954DAF3CEBD,Word64 0xB4B81B3FA97511E2,Word64 0xB422061193D6F6A7,Word64 0x071582401C38434D ,Word64 0x7A13F18BBEDC4FF5,Word64 0xBC4097B116C524D2,Word64 0x59B97885E2F2EA28,Word64 0x99170A5DC3115544 ,Word64 0x6F423357E7C6A9F9,Word64 0x325928EE6E6F8794,Word64 0xD0E4366228B03343,Word64 0x565C31F7DE89EA27 ,Word64 0x30F5611484119414,Word64 0xD873DB391292ED4F,Word64 0x7BD94E1D8E17DEBC,Word64 0xC7D9F16864A76E94 ,Word64 0x947AE053EE56E63C,Word64 0xC8C93882F9475F5F,Word64 0x3A9BF55BA91F81CA,Word64 0xD9A11FBB3D9808E4 ,Word64 0x0FD22063EDC29FCA,Word64 0xB3F256D8ACA0B0B9,Word64 0xB03031A8B4516E84,Word64 0x35DD37D5871448AF ,Word64 0xE9F6082B05542E4E,Word64 0xEBFAFA33D7254B59,Word64 0x9255ABB50D532280,Word64 0xB9AB4CE57F2D34F3 ,Word64 0x693501D628297551,Word64 0xC62C58F97DD949BF,Word64 0xCD454F8F19C5126A,Word64 0xBBE83F4ECC2BDECB ,Word64 0xDC842B7E2819E230,Word64 0xBA89142E007503B8,Word64 0xA3BC941D0A5061CB,Word64 0xE9F6760E32CD8021 ,Word64 0x09C7E552BC76492F,Word64 0x852F54934DA55CC9,Word64 0x8107FCCF064FCF56,Word64 0x098954D51FFF6580 ,Word64 0x23B70EDB1955C4BF,Word64 0xC330DE426430F69D,Word64 0x4715ED43E8A45C0A,Word64 0xA8D7E4DAB780A08D ,Word64 0x0572B974F03CE0BB,Word64 0xB57D2E985E1419C7,Word64 0xE8D9ECBE2CF3D73F,Word64 0x2FE4B17170E59750 ,Word64 0x11317BA87905E790,Word64 0x7FBF21EC8A1F45EC,Word64 0x1725CABFCB045B00,Word64 0x964E915CD5E2B207 ,Word64 0x3E2B8BCBF016D66D,Word64 0xBE7444E39328A0AC,Word64 0xF85B2B4FBCDE44B7,Word64 0x49353FEA39BA63B1 ,Word64 0x1DD01AAFCD53486A,Word64 0x1FCA8A92FD719F85,Word64 0xFC7C95D827357AFA,Word64 0x18A6A990C8B35EBD ,Word64 0xCCCB7005C6B9C28D,Word64 0x3BDBB92C43B17F26,Word64 0xAA70B5B4F89695A2,Word64 0xE94C39A54A98307F ,Word64 0xB7A0B174CFF6F36E,Word64 0xD4DBA84729AF48AD,Word64 0x2E18BC1AD9704A68,Word64 0x2DE0966DAF2F8B1C ,Word64 0xB9C11D5B1E43A07E,Word64 0x64972D68DEE33360,Word64 0x94628D38D0C20584,Word64 0xDBC0D2B6AB90A559 ,Word64 0xD2733C4335C6A72F,Word64 0x7E75D99D94A70F4D,Word64 0x6CED1983376FA72B,Word64 0x97FCAACBF030BC24 ,Word64 0x7B77497B32503B12,Word64 0x8547EDDFB81CCB94,Word64 0x79999CDFF70902CB,Word64 0xCFFE1939438E9B24 ,Word64 0x829626E3892D95D7,Word64 0x92FAE24291F2B3F1,Word64 0x63E22C147B9C3403,Word64 0xC678B6D860284A1C ,Word64 0x5873888850659AE7,Word64 0x0981DCD296A8736D,Word64 0x9F65789A6509A440,Word64 0x9FF38FED72E9052F ,Word64 0xE479EE5B9930578C,Word64 0xE7F28ECD2D49EECD,Word64 0x56C074A581EA17FE,Word64 0x5544F7D774B14AEF ,Word64 0x7B3F0195FC6F290F,Word64 0x12153635B2C0CF57,Word64 0x7F5126DBBA5E0CA7,Word64 0x7A76956C3EAFB413 ,Word64 0x3D5774A11D31AB39,Word64 0x8A1B083821F40CB4,Word64 0x7B4A38E32537DF62,Word64 0x950113646D1D6E03 ,Word64 0x4DA8979A0041E8A9,Word64 0x3BC36E078F7515D7,Word64 0x5D0A12F27AD310D1,Word64 0x7F9D1A2E1EBE1327 ,Word64 0xDA3A361B1C5157B1,Word64 0xDCDD7D20903D0C25,Word64 0x36833336D068F707,Word64 0xCE68341F79893389 ,Word64 0xAB9090168DD05F34,Word64 0x43954B3252DC25E5,Word64 0xB438C2B67F98E5E9,Word64 0x10DCD78E3851A492 ,Word64 0xDBC27AB5447822BF,Word64 0x9B3CDB65F82CA382,Word64 0xB67B7896167B4C84,Word64 0xBFCED1B0048EAC50 ,Word64 0xA9119B60369FFEBD,Word64 0x1FFF7AC80904BF45,Word64 0xAC12FB171817EEE7,Word64 0xAF08DA9177DDA93D ,Word64 0x1B0CAB936E65C744,Word64 0xB559EB1D04E5E932,Word64 0xC37B45B3F8D6F2BA,Word64 0xC3A9DC228CAAC9E9 ,Word64 0xF3B8B6675A6507FF,Word64 0x9FC477DE4ED681DA,Word64 0x67378D8ECCEF96CB,Word64 0x6DD856D94D259236 ,Word64 0xA319CE15B0B4DB31,Word64 0x073973751F12DD5E,Word64 0x8A8E849EB32781A5,Word64 0xE1925C71285279F5 ,Word64 0x74C04BF1790C0EFE,Word64 0x4DDA48153C94938A,Word64 0x9D266D6A1CC0542C,Word64 0x7440FB816508C4FE ,Word64 0x13328503DF48229F,Word64 0xD6BF7BAEE43CAC40,Word64 0x4838D65F6EF6748F,Word64 0x1E152328F3318DEA ,Word64 0x8F8419A348F296BF,Word64 0x72C8834A5957B511,Word64 0xD7A023A73260B45C,Word64 0x94EBC8ABCFB56DAE ,Word64 0x9FC10D0F989993E0,Word64 0xDE68A2355B93CAE6,Word64 0xA44CFE79AE538BBE,Word64 0x9D1D84FCCE371425 ,Word64 0x51D2B1AB2DDFB636,Word64 0x2FD7E4B9E72CD38C,Word64 0x65CA5B96B7552210,Word64 0xDD69A0D8AB3B546D ,Word64 0x604D51B25FBF70E2,Word64 0x73AA8A564FB7AC9E,Word64 0x1A8C1E992B941148,Word64 0xAAC40A2703D9BEA0 ,Word64 0x764DBEAE7FA4F3A6,Word64 0x1E99B96E70A9BE8B,Word64 0x2C5E9DEB57EF4743,Word64 0x3A938FEE32D29981 ,Word64 0x26E6DB8FFDF5ADFE,Word64 0x469356C504EC9F9D,Word64 0xC8763C5B08D1908C,Word64 0x3F6C6AF859D80055 ,Word64 0x7F7CC39420A3A545,Word64 0x9BFB227EBDF4C5CE,Word64 0x89039D79D6FC5C5C,Word64 0x8FE88B57305E2AB6 ,Word64 0xA09E8C8C35AB96DE,Word64 0xFA7E393983325753,Word64 0xD6B6D0ECC617C699,Word64 0xDFEA21EA9E7557E3 ,Word64 0xB67C1FA481680AF8,Word64 0xCA1E3785A9E724E5,Word64 0x1CFC8BED0D681639,Word64 0xD18D8549D140CAEA ,Word64 0x4ED0FE7E9DC91335,Word64 0xE4DBF0634473F5D2,Word64 0x1761F93A44D5AEFE,Word64 0x53898E4C3910DA55 ,Word64 0x734DE8181F6EC39A,Word64 0x2680B122BAA28D97,Word64 0x298AF231C85BAFAB,Word64 0x7983EED3740847D5 ,Word64 0x66C1A2A1A60CD889,Word64 0x9E17E49642A3E4C1,Word64 0xEDB454E7BADC0805,Word64 0x50B704CAB602C329 ,Word64 0x4CC317FB9CDDD023,Word64 0x66B4835D9EAFEA22,Word64 0x219B97E26FFC81BD,Word64 0x261E4E4C0A333A9D ,Word64 0x1FE2CCA76517DB90,Word64 0xD7504DFA8816EDBB,Word64 0xB9571FA04DC089C8,Word64 0x1DDC0325259B27DE ,Word64 0xCF3F4688801EB9AA,Word64 0xF4F5D05C10CAB243,Word64 0x38B6525C21A42B0E,Word64 0x36F60E2BA4FA6800 ,Word64 0xEB3593803173E0CE,Word64 0x9C4CD6257C5A3603,Word64 0xAF0C317D32ADAA8A,Word64 0x258E5A80C7204C4B ,Word64 0x8B889D624D44885D,Word64 0xF4D14597E660F855,Word64 0xD4347F66EC8941C3,Word64 0xE699ED85B0DFB40D ,Word64 0x2472F6207C2D0484,Word64 0xC2A1E7B5B459AEB5,Word64 0xAB4F6451CC1D45EC,Word64 0x63767572AE3D6174 ,Word64 0xA59E0BD101731A28,Word64 0x116D0016CB948F09,Word64 0x2CF9C8CA052F6E9F,Word64 0x0B090A7560A968E3 ,Word64 0xABEEDDB2DDE06FF1,Word64 0x58EFC10B06A2068D,Word64 0xC6E57A78FBD986E0,Word64 0x2EAB8CA63CE802D7 ,Word64 0x14A195640116F336,Word64 0x7C0828DD624EC390,Word64 0xD74BBE77E6116AC7,Word64 0x804456AF10F5FB53 ,Word64 0xEBE9EA2ADF4321C7,Word64 0x03219A39EE587A30,Word64 0x49787FEF17AF9924,Word64 0xA1E9300CD8520548 ,Word64 0x5B45E522E4B1B4EF,Word64 0xB49C3B3995091A36,Word64 0xD4490AD526F14431,Word64 0x12A8F216AF9418C2 ,Word64 0x001F837CC7350524,Word64 0x1877B51E57A764D5,Word64 0xA2853B80F17F58EE,Word64 0x993E1DE72D36D310 ,Word64 0xB3598080CE64A656,Word64 0x252F59CF0D9F04BB,Word64 0xD23C8E176D113600,Word64 0x1BDA0492E7E4586E ,Word64 0x21E0BD5026C619BF,Word64 0x3B097ADAF088F94E,Word64 0x8D14DEDB30BE846E,Word64 0xF95CFFA23AF5F6F4 ,Word64 0x3871700761B3F743,Word64 0xCA672B91E9E4FA16,Word64 0x64C8E531BFF53B55,Word64 0x241260ED4AD1E87D ,Word64 0x106C09B972D2E822,Word64 0x7FBA195410E5CA30,Word64 0x7884D9BC6CB569D8,Word64 0x0647DFEDCD894A29 ,Word64 0x63573FF03E224774,Word64 0x4FC8E9560F91B123,Word64 0x1DB956E450275779,Word64 0xB8D91274B9E9D4FB ,Word64 0xA2EBEE47E2FBFCE1,Word64 0xD9F1F30CCD97FB09,Word64 0xEFED53D75FD64E6B,Word64 0x2E6D02C36017F67F ,Word64 0xA9AA4D20DB084E9B,Word64 0xB64BE8D8B25396C1,Word64 0x70CB6AF7C2D5BCF0,Word64 0x98F076A4F7A2322E ,Word64 0xBF84470805E69B5F,Word64 0x94C3251F06F90CF3,Word64 0x3E003E616A6591E9,Word64 0xB925A6CD0421AFF3 ,Word64 0x61BDD1307C66E300,Word64 0xBF8D5108E27E0D48,Word64 0x240AB57A8B888B20,Word64 0xFC87614BAF287E07 ,Word64 0xEF02CDD06FFDB432,Word64 0xA1082C0466DF6C0A,Word64 0x8215E577001332C8,Word64 0xD39BB9C3A48DB6CF ,Word64 0x2738259634305C14,Word64 0x61CF4F94C97DF93D,Word64 0x1B6BACA2AE4E125B,Word64 0x758F450C88572E0B ,Word64 0x959F587D507A8359,Word64 0xB063E962E045F54D,Word64 0x60E8ED72C0DFF5D1,Word64 0x7B64978555326F9F ,Word64 0xFD080D236DA814BA,Word64 0x8C90FD9B083F4558,Word64 0x106F72FE81E2C590,Word64 0x7976033A39F7D952 ,Word64 0xA4EC0132764CA04B,Word64 0x733EA705FAE4FA77,Word64 0xB4D8F77BC3E56167,Word64 0x9E21F4F903B33FD9 ,Word64 0x9D765E419FB69F6D,Word64 0xD30C088BA61EA5EF,Word64 0x5D94337FBFAF7F5B,Word64 0x1A4E4822EB4D7A59 ,Word64 0x6FFE73E81B637FB3,Word64 0xDDF957BC36D8B9CA,Word64 0x64D0E29EEA8838B3,Word64 0x08DD9BDFD96B9F63 ,Word64 0x087E79E5A57D1D13,Word64 0xE328E230E3E2B3FB,Word64 0x1C2559E30F0946BE,Word64 0x720BF5F26F4D2EAA ,Word64 0xB0774D261CC609DB,Word64 0x443F64EC5A371195,Word64 0x4112CF68649A260E,Word64 0xD813F2FAB7F5C5CA ,Word64 0x660D3257380841EE,Word64 0x59AC2C7873F910A3,Word64 0xE846963877671A17,Word64 0x93B633ABFA3469F8 ,Word64 0xC0C0F5A60EF4CDCF,Word64 0xCAF21ECD4377B28C,Word64 0x57277707199B8175,Word64 0x506C11B9D90E8B1D ,Word64 0xD83CC2687A19255F,Word64 0x4A29C6465A314CD1,Word64 0xED2DF21216235097,Word64 0xB5635C95FF7296E2 ,Word64 0x22AF003AB672E811,Word64 0x52E762596BF68235,Word64 0x9AEBA33AC6ECC6B0,Word64 0x944F6DE09134DFB6 ,Word64 0x6C47BEC883A7DE39,Word64 0x6AD047C430A12104,Word64 0xA5B1CFDBA0AB4067,Word64 0x7C45D833AFF07862 ,Word64 0x5092EF950A16DA0B,Word64 0x9338E69C052B8E7B,Word64 0x455A4B4CFE30E3F5,Word64 0x6B02E63195AD0CF8 ,Word64 0x6B17B224BAD6BF27,Word64 0xD1E0CCD25BB9C169,Word64 0xDE0C89A556B9AE70,Word64 0x50065E535A213CF6 ,Word64 0x9C1169FA2777B874,Word64 0x78EDEFD694AF1EED,Word64 0x6DC93D9526A50E68,Word64 0xEE97F453F06791ED ,Word64 0x32AB0EDB696703D3,Word64 0x3A6853C7E70757A7,Word64 0x31865CED6120F37D,Word64 0x67FEF95D92607890 ,Word64 0x1F2B1D1F15F6DC9C,Word64 0xB69E38A8965C6B65,Word64 0xAA9119FF184CCCF4,Word64 0xF43C732873F24C13 ,Word64 0xFB4A3D794A9A80D2,Word64 0x3550C2321FD6109C,Word64 0x371F77E76BB8417E,Word64 0x6BFA9AAE5EC05779 ,Word64 0xCD04F3FF001A4778,Word64 0xE3273522064480CA,Word64 0x9F91508BFFCFC14A,Word64 0x049A7F41061A9E60 ,Word64 0xFCB6BE43A9F2FE9B,Word64 0x08DE8A1C7797DA9B,Word64 0x8F9887E6078735A1,Word64 0xB5B4071DBFC73A66 ,Word64 0x230E343DFBA08D33,Word64 0x43ED7F5A0FAE657D,Word64 0x3A88A0FBBCB05C63,Word64 0x21874B8B4D2DBC4F ,Word64 0x1BDEA12E35F6A8C9,Word64 0x53C065C6C8E63528,Word64 0xE34A1D250E7A8D6B,Word64 0xD6B04D3B7651DD7E ,Word64 0x5E90277E7CB39E2D,Word64 0x2C046F22062DC67D,Word64 0xB10BB459132D0A26,Word64 0x3FA9DDFB67E2F199 ,Word64 0x0E09B88E1914F7AF,Word64 0x10E8B35AF3EEAB37,Word64 0x9EEDECA8E272B933,Word64 0xD4C718BC4AE8AE5F ,Word64 0x81536D601170FC20,Word64 0x91B534F885818A06,Word64 0xEC8177F83F900978,Word64 0x190E714FADA5156E ,Word64 0xB592BF39B0364963,Word64 0x89C350C893AE7DC1,Word64 0xAC042E70F8B383F2,Word64 0xB49B52E587A1EE60 ,Word64 0xFB152FE3FF26DA89,Word64 0x3E666E6F69AE2C15,Word64 0x3B544EBE544C19F9,Word64 0xE805A1E290CF2456 ,Word64 0x24B33C9D7ED25117,Word64 0xE74733427B72F0C1,Word64 0x0A804D18B7097475,Word64 0x57E3306D881EDB4F ,Word64 0x4AE7D6A36EB5DBCB,Word64 0x2D8D5432157064C8,Word64 0xD1E649DE1E7F268B,Word64 0x8A328A1CEDFE552C ,Word64 0x07A3AEC79624C7DA,Word64 0x84547DDC3E203C94,Word64 0x990A98FD5071D263,Word64 0x1A4FF12616EEFC89 ,Word64 0xF6F7FD1431714200,Word64 0x30C05B1BA332F41C,Word64 0x8D2636B81555A786,Word64 0x46C9FEB55D120902 ,Word64 0xCCEC0A73B49C9921,Word64 0x4E9D2827355FC492,Word64 0x19EBB029435DCB0F,Word64 0x4659D2B743848A2C ,Word64 0x963EF2C96B33BE31,Word64 0x74F85198B05A2E7D,Word64 0x5A0F544DD2B1FB18,Word64 0x03727073C2E134B1 ,Word64 0xC7F6AA2DE59AEA61,Word64 0x352787BAA0D7C22F,Word64 0x9853EAB63B5E0B35,Word64 0xABBDCDD7ED5C0860 ,Word64 0xCF05DAF5AC8D77B0,Word64 0x49CAD48CEBF4A71E,Word64 0x7A4C10EC2158C4A6,Word64 0xD9E92AA246BF719E ,Word64 0x13AE978D09FE5557,Word64 0x730499AF921549FF,Word64 0x4E4B705B92903BA4,Word64 0xFF577222C14F0A3A ,Word64 0x55B6344CF97AAFAE,Word64 0xB862225B055B6960,Word64 0xCAC09AFBDDD2CDB4,Word64 0xDAF8E9829FE96B5F ,Word64 0xB5FDFC5D3132C498,Word64 0x310CB380DB6F7503,Word64 0xE87FBB46217A360E,Word64 0x2102AE466EBB1148 ,Word64 0xF8549E1A3AA5E00D,Word64 0x07A69AFDCC42261A,Word64 0xC4C118BFE78FEAAE,Word64 0xF9F4892ED96BD438 ,Word64 0x1AF3DBE25D8F45DA,Word64 0xF5B4B0B0D2DEEEB4,Word64 0x962ACEEFA82E1C84,Word64 0x046E3ECAAF453CE9 ,Word64 0xF05D129681949A4C,Word64 0x964781CE734B3C84,Word64 0x9C2ED44081CE5FBD,Word64 0x522E23F3925E319E ,Word64 0x177E00F9FC32F791,Word64 0x2BC60A63A6F3B3F2,Word64 0x222BBFAE61725606,Word64 0x486289DDCC3D6780 ,Word64 0x7DC7785B8EFDFC80,Word64 0x8AF38731C02BA980,Word64 0x1FAB64EA29A2DDF7,Word64 0xE4D9429322CD065A ,Word64 0x9DA058C67844F20C,Word64 0x24C0E332B70019B0,Word64 0x233003B5A6CFE6AD,Word64 0xD586BD01C5C217F6 ,Word64 0x5E5637885F29BC2B,Word64 0x7EBA726D8C94094B,Word64 0x0A56A5F0BFE39272,Word64 0xD79476A84EE20D06 ,Word64 0x9E4C1269BAA4BF37,Word64 0x17EFEE45B0DEE640,Word64 0x1D95B0A5FCF90BC6,Word64 0x93CBE0B699C2585D ,Word64 0x65FA4F227A2B6D79,Word64 0xD5F9E858292504D5,Word64 0xC2B5A03F71471A6F,Word64 0x59300222B4561E00 ,Word64 0xCE2F8642CA0712DC,Word64 0x7CA9723FBB2E8988,Word64 0x2785338347F2BA08,Word64 0xC61BB3A141E50E8C ,Word64 0x150F361DAB9DEC26,Word64 0x9F6A419D382595F4,Word64 0x64A53DC924FE7AC9,Word64 0x142DE49FFF7A7C3D ,Word64 0x0C335248857FA9E7,Word64 0x0A9C32D5EAE45305,Word64 0xE6C42178C4BBB92E,Word64 0x71F1CE2490D20B07 ,Word64 0xF1BCC3D275AFE51A,Word64 0xE728E8C83C334074,Word64 0x96FBF83A12884624,Word64 0x81A1549FD6573DA5 ,Word64 0x5FA7867CAF35E149,Word64 0x56986E2EF3ED091B,Word64 0x917F1DD5F8886C61,Word64 0xD20D8C88C8FFE65F ] castleKeys :: Vector Word64 castleKeys = forall a. Unbox a => [a] -> Vector a fromList [Word64 0x31D71DCE64B2C310,Word64 0xF165B587DF898190 ,Word64 0xA57E6339DD2CF3A0,Word64 0x1EF6E6DBB1961EC9 ] epKeys :: Vector Word64 epKeys = forall a. Unbox a => [a] -> Vector a fromList [Word64 0x70CC73D90BC26E24,Word64 0xE21A6B35DF0C3AD7,Word64 0x003A93D8B2806962,Word64 0x1C99DED33CB890A1 ,Word64 0xCF3145DE0ADD4289,Word64 0xD0E4427A5514FB72,Word64 0x77C621CC9FB3A483,Word64 0x67A34DAC4356550B ] turnKey :: Word64 turnKey :: Word64 turnKey = Word64 0xF8D626AAAF278509