days 23 and 24
[?]
Dec 24, 2020, 6:10 PM
IGIPWAHKCTPV4VU3YZPKFFD75YI5NWYS7DLTA4ZF4R7Q7GMBRAQQCDependencies
Change contents
- file addition: 23[1.0]
- file addition: part2.rs[0.5]
// The Haskell solution is basically correct, but OOMed my box and I don't feel// up to hunting down all the places I need to add strictness annotations.fn main() {let mut next: [usize; 1000001] = [0; 1000001];next[5] = 6;next[6] = 2;next[2] = 8;next[8] = 9;next[9] = 3;next[3] = 1;next[1] = 4;next[4] = 7;next[7] = 10;next[1_000_000] = 5;/*next[3] = 8;next[8] = 9;next[9] = 1;next[1] = 2;next[2] = 5;next[5] = 4;next[4] = 6;next[6] = 7;next[7] = 10;next[1_000_000] = 3;*/for i in 10..1_000_000 {next[i] = i + 1;}let mut sel = 5;for _ in 0..10_000_000 {let x1 = next[sel];let x2 = next[x1];let x3 = next[x2];next[sel] = next[x3];let mut dst = sel - 1;loop {if dst < 1 {dst = 1_000_000;}if dst != x1 && dst != x2 && dst != x3 {break;}dst = dst - 1;}next[x3] = next[dst];next[dst] = x1;sel = next[sel];}println!("1 -> {} -> {}; answer is {}",next[1],next[next[1]],next[1] * next[next[1]]);} - file addition: cups.hs[0.5]
import Control.Arrowimport Data.Listimport qualified Data.Map as Mstep :: Int -> [Int] -> [Int]step _ [] = undefinedstep biggest (x : xs) =let numbersDecreasing = cycle $ reverse [1 .. biggest](picked, inPlay) = splitAt 3 xsx' = if x == 1 then biggest + 1 else xchosen =head $dropWhile (`elem` picked) $dropWhile (>= x') $numbersDecreasing(prefix, _ : rest) = span (/= chosen) inPlayin drop 1 $ cycle $ take 9 $ x : prefix ++ chosen : picked ++ restrunN :: Int -> Int -> [Int] -> [Int]runN = flip (.) (flip (!!)) . flip (.) . iterate . stepsolveOne :: String -> StringsolveOne =concat. map show. take 8. drop 1. dropWhile (/= 1). runN 9 100. cycle. map (read . (: []))data Circle = C{ getCursor :: Int,getLargest :: Int,getNextMap :: M.Map Int Int}deriving (Show)(!) = (M.!)stepC :: Circle -> CirclestepC (C cursor largest nexts) =let picked = take 3 $ drop 1 $ iterate (nexts !) cursordst = selectTarget cursor pickednexts' = M.insert cursor (nexts ! last picked) nextsnexts'' = M.insert dst (head picked) nexts'nexts''' = M.insert (last picked) (nexts ! dst) nexts''in C (nexts''' ! cursor) largest nexts'''whereselectTarget c ineligible =let c' = if c == 1 then largest else c - 1in if c' `elem` ineligiblethen selectTarget c' ineligibleelse c'buildAdjCyclic :: [Int] -> M.Map Int IntbuildAdjCyclic xs = M.insert (last xs) (head xs) $ M.fromList (zip xs (tail xs))buildCircle :: Int -> [Int] -> CirclebuildCircle max xs =let adj = buildAdjCyclic xsmaxIn = maximum xsadj' = foldl' (flip (uncurry M.insert . (id &&& (+ 1)))) adj [maxIn + 1 .. max -1]adj'' = if max > maxIn then M.insert max (head xs) adj' else adj'adj''' = if max > maxIn then M.insert (last xs) (maxIn + 1) adj'' else adj''in C (head xs) max adj'''findStars :: [Int] -> IntfindStars xs =let circ = buildCircle 1000000 xsC _ _ endState = iterate stepC circ !! 10000000in (endState ! 1) * (endState ! (endState ! 1)) - file addition: 24[1.0]
- file addition: tiles.hs[0.3512]
import Data.List hiding (iterate')import qualified Data.Map as Mimport Data.Maybeimport qualified Data.Set as Stype HexCoord = (Int, Int, Int)data HexGrid = H {unH :: M.Map HexCoord Bool}ne (x, y, z) = (x + 1, y, z -1)nw (x, y, z) = (x, y + 1, z -1)se (x, y, z) = (x, y -1, z + 1)sw (x, y, z) = (x -1, y, z + 1)e (x, y, z) = (x + 1, y -1, z)w (x, y, z) = (x -1, y + 1, z)flipTile :: Maybe Bool -> BoolflipTile = not . fromMaybe FalsefollowPath :: HexCoord -> String -> HexCoordfollowPath pt [] = ptfollowPath pt ('n' : 'e' : rest) = followPath (ne pt) restfollowPath pt ('n' : 'w' : rest) = followPath (nw pt) restfollowPath pt ('s' : 'e' : rest) = followPath (se pt) restfollowPath pt ('s' : 'w' : rest) = followPath (sw pt) restfollowPath pt ('e' : rest) = followPath (e pt) restfollowPath pt ('w' : rest) = followPath (w pt) restfollowPath _ _ = undefinedrunInstructions :: HexGrid -> [String] -> HexGridrunInstructions = foldl' runSinglewhererunSingle (H grid) s = H (M.alter (Just . flipTile) (followPath (0, 0, 0) s) grid)solveOne :: String -> IntsolveOne =M.foldl' (\acc x -> if x then acc + 1 else acc) 0. unH. runInstructions (H M.empty). linestype Tiles = S.Set HexCoordneighbors :: HexCoord -> S.Set HexCoordneighbors = S.fromList . flip map [ne, nw, se, sw, e, w] . flip ($)member = S.memberstep :: Tiles -> Tilesstep s =let liveAdjacent :: HexCoord -> Tiles -> IntliveAdjacent pt s = S.size $ S.intersection s $ neighbors ptstillLive :: HexCoord -> Tiles -> BoolstillLive pt grid =not (liveAdjacent pt grid == 0 || liveAdjacent pt grid > 2)becomeLive :: HexCoord -> Tiles -> BoolbecomeLive pt grid = liveAdjacent pt grid == 2pointsToConsider :: S.Set HexCoordpointsToConsider = (S.unions $ map neighbors $ S.toList s)maybeFlip :: Tiles -> HexCoord -> TilesmaybeFlip s' pt = if checkLive pt s then S.insert pt s' else s'wherecheckLive = if pt `member` s then stillLive else becomeLivein S.foldl maybeFlip S.empty pointsToConsideriterate' 0 _ x = xiterate' n f x = x `seq` iterate' (n -1) f (f x)solveTwo :: String -> IntsolveTwo =S.size. iterate' 100 step. S.fromList. M.keys. M.filter id. unH. runInstructions (H M.empty). lines - file addition: small.txt[0.3512]
sesenwnenenewseeswwswswwnenewsewswneeenesenwnwwswnenewnwwsewnenwsesweswseswneswswsenwwnwsenwnwneseeswswnenewneswwnewseswneseeneswweswneswnenwsewnwneneseenweesenwseswswnenwswnwnwsewwnwsenesewnenenenesenwsewnenwwwsewenwwweseeeweswwwnwwewsweesenenewnwwnwsenewsenwwsesesenwneneeswseenwwswnwswswnwnenwswwsewswnenenewsenwsenwnesesenewenewnwewneswsewnwswenweswnenwsenwswsweneswneswneneenwnewenewwneswswneseswwesenesewenwneswnwwneseswwneenesenwswwswneneswsenwnewswseenwsesewnwnesenesenenwwnenwsewesewsesesewnenewswnwewswnenesenwnesewesweneswnwswnwsenenwnwnwwseeswneewseneseneswnwewnwnwseenwseesewsenwsweewewseweeenwnesenwwwswnew - file addition: input.txt[0.3512]
swsenwsewneeseseswnwswsesesewswnewseseseewwewsenenwwswnwwenewwwwwwnwswswswseseswswswseswswswswseswswneewesewseseweswnwneesewesenweneeeseewneneswenenenenwneswnwnweeswsweneneneneneneewwsenenenenenwnenenenwnwnesenweseeeeseeeeeeseweeeeneeneeneneeweneeeeeneswseswsewseswseswswenwswseseseswswswwnenenwnwseswswsweswnwseswsesesweswnenweeseseswenwswneenweseseeeeswseseeswseeneeswseneseneseeeeseenwswseneseseseeswnwseseseseseswswseseseeesweeneeeenwnwnewesweeseeeewwswwwwwsewwwwwwwneswswswswswnweswswswswsweswswswwswswsesweeneenwseewswsweewseewenweweseseseneseseswsewseseseseseseswsesesenwnwenwswnwnwnwnenwnwnenenwneenesenwnewneenewneneeseneneenwswnenwnwswsenwnwnwsenenwnwswnwnwnenwnwnwnwnwnenwnwswswwwnenwenwnwwsenwwnwnwnwesenwewwswnenenesenenwnenwnesesenwseneewwnenwwnenenwnwnwnwnwnwnwsenwnewsewnwswwswswwwsenwnwswwsweswsweswnesweseswnenenenenenewenenenenwneneseneswnenwneesweeseeeenwnwseeseeeeseeeeewsesenesewswswsewneswswneswswseewswnenweeeswneeeneenwenwseenwneswswneswnwnwnwnwnwneneseneneneswnwnesesenweenwnwseswswswnwnwewnwnwnwneswswnenwnwswnwwewwewnwnwnwnwsenwnwnwwnwnwnwsenwsenesenewsewwwnwsenenewsewweeesenewweneeneweeseswswsesesesewneeeenewnenweeseeneneneseseneeenwswwswswswswswswswswwwsweseswnwswwsenwenwnwnwnwnwnwnesewnwnwnwnwwseneswwnewwwenesewwswswsewwwwwswnwwswwwewnewwnwnewnwwswwnwnwwwwneeneneneneneseswnwneneenenenenenwneseseswsewseswnwsesenesesesesweseeseswswnwsenwenwwnwnwnwnwnwnwnwswwswwwenwnenwenwnwsenwwwnwwwswewnwwnwnwwnwswesewwnwnwnwwwsewsewnwsewnwnwwwswswwswseswwswwswswwwswwwneewwswwswswwwsesweswwwwwnewwewneeseseswswenwwnwsenenenwwneneswwswnenwsenwnwnwsesenenwswneneenweseseesewsenenenenenenwnenwswneneneneenenwnesenewswwnwswswswseswesewswswswnwswwwwewwnwwswswwwnewswswswnewnwseseseswseswsenwneseseenwseswseseseseseseswseswnwwnwneswseswswnwswseswswseeneswnenwswwnwsesewseswseseswseseneeswseswneswswseswseseswwnwswseswnwseseneswesweswsenenwneswnwwsewewwnesewswsewswsewsewswswswswswswwswnenwwwnwswsenwwneswnwnwneswseeswswsenwsweneewnenenenenenesenenwswseenwseseswsenwneenwwswswsesenweswseseseseseseseseswsesesenesesesenwswnwnenwsenwsenwnwnwnwnwnwnenwnwnwnwenwseneneneseswnwnwneswnwneneseswnwnwnwnwwnwnwnweenwnwswnwnwnewenwwswwneseesenwnenwnesenweneneneneswwnenenwnwseneneenenenwnwnwnwnwnwnwsenwnwnwnwnwnwswsenwnwnwnenesenenewnenenenenewnenesenenenenenwnenesweenenwnenewnwnesenewneneneeenewwswswwsewwwswnwnewenwswwswswwswsenenwswnenwneenenewswnewnenenenwnwsesewnwwsenwsenwnenwsenwsewewneswnwnewnwnenwnenwnwneweswnwnenwewnenenenwneswenewwwnwnewwwsewnwewwwnwnwwnwnwwswnenenwnwswneneswnweenwnwwnwnwnwnwnwweeswneneeneeenwneseeeeswswsweseeswseseswnewsewwnwseewneesesesesesewnwnwnwnewnwwsweeswwnwwnwswnwnwewwswnweenwwswsewnwnenwnwwswwwwweneswnewswesesenwneneenenenwwenwneswwswwwwnewsewwwwswewswwwwswsesenwnwsenewseseseseseseseseseewsesewnweweenenewnesweseeseeeenenwwnwnwnwnwnwsenwswewswnenwsesewnwseseswneenewswneeseseeneeeeweneeeeeesweeewewsewseeeseeseeeseenwnwnwsenwnwnwnwnenwnwwnwnwswwewwwnwsenwnenwsenwewswnenwnwnwnwnwnwnwnenenwneneseswswswwswwneswseewswswswswswswneneswswswswswswswswswewswwswswswswwwneseeseeeeeweeseneeseseesewswswswseseseswseseseseseneswneswewseseneswswswswseswswswswwseswswsenenenwsweswneeeswnenenenenewneneneeswswswswswesewswnwnenwesenewswswswnesweswswnenewewwswwswneeswswseswwswswnwwnwswsesesenewwneeseswseenenwneweweswwsenwswenwnwnwenwwnwnwwnwweseseseseseeseewsesesenwseseneeswsesesenwseseesewneesesesesenwsenwseswseseseseeneeeneeeeeswsweeeeeeeewseseesesenwsesweewswseseneneneswnesewewswnwwseswwnweswwnwnweneeswnwswnenenwnesewswwwnesewnewwwseneswseswsweseseswneswswsewseswswswweseseeeseswswnwweeneeeeseseseneseswneeeneewneswesesenwnwwnenewnwswnewsenwewnwneeswseswsesesesesewsenwsewwwwwwwnewswwwwwnwnwswwewswnenwnwnwnwswswnwenenwnenwenenenwnenwwwwwewswwweewwsewwwnewnwnwnwewwnwnwswwswnwewwwwnwnwwwneswenewneswneneneswnwneneesesewneneeswwnwnwnwneseswnenwnwnwswneeneswnenwnwnwneeswnwwswsenwneweenwwenenwwwsenwnenwneswswweneswseseeseneneeeneneeweseseeseeeeseenenweeseswenweenwneswneseesweeswesenwswenweeseeeenwwenwseeseneneeeneneneeeweswseneneenenenwneneneneneneseneneswnenenenenwnwswnewewseswswneswneeswwswseswswsenwswseswseneweseswseseswseeeeeewenweeeeseeseewwnwswnwnwenwwswnwnwenwnwnwwnwwnwwswneseenwnwesenwwnwnesenwnwneenenwwnwnewwswswsweswsenwneneswswwswwswswsweswnwsweswswnwswswnwwwswswswesewswswnesewswswswswswneswnwesesewneswswswswsesenewswneswwnwwswwwswwwswwewsewswnwswswneseneswswswwswswwswwswneeswswnwnwsenenenwwswnweesenwwwnenesesenwnwneswnwswnwwnenenwnenwnwnenenwenwnenwwsenwwnwsenwnwenenwwsewsesesewnewweeneeesewseeeenwnwnwseswnwnewwwneeseseswswswneeeeneswswswswswswswswswseswnwwswwneswsewwswwneewsweswswwwwnwnwsewnwsenwnwwnwnwnwsesenwwwnewnenwwsenwseseneenwnenwwenwnwwsenwswneswswwwwswswswswswneswneswswswseswwseswwneswswsesesweseenwwsesesweswswwsenwswswswseeneeesweeseseswnwseswsenwnwenenwseneswsesesesesesesesenwwwnwsewwnenwwenwnwwseseesenwseswseseenwnewwnwwwnwwwwswwwnenweseswwswswnwswsewwsewnwwseneswswnwswsewswnwnwnwneneswneseswenwnenenenwnwneswnewesesenenwwnenwwsenwnwnwwnwnwnwnwnwnwnwnewnwnwnwneswnwwnenesenwnwnwneenenwneenwnwnenwnenenewnenwnenesenwneewwesesewwwnewsewwwwwsesenwseseseseseesweswenwseseeseeseseseseswnweswseseseseseneswswseswseswnwseswwsenwseeenesewwwenwsweeseseewsewneneeenenenwneneneweeswneneseseeenwweewseeneswenwewwenwsweseeseswneseneswwswseeswswswswneseswswswnenwnenenwsenwnwnwnenwnenenwnwseswnenwnwnewswwwwwewewswewseewswswswnwwseeseseeseweenwseeswseseenweneswnwseeswnwnwnwneenenwsenenenenenwwnwnwneneswnenweeenwneeesweeeneeeenenesweneseswswsenesenewseswneswwswswswseswswnweeeswneeneenesenweesenenewneneeeneseeeswwneweneenwewsweweeenwnwneneswnwneenwwnwnwnwnenwneseswwsewwwnenenwsenesewwswnewwswnwnenenenenewnenesenenwnwsenwnenwsenwnenenwnwnwnwnwnwnwnwnenwseeesenwswwswwweseenenenwnwnenenenwnwneneswneneneneneenenwswswwseswnwnewsesewwswwswwswswnwswnwnenwswneneswneneeeseeeneneenenweneenwnenenwseswewswsenenenwnenwnwenwnenwwswswseseswwnenenweseseswnewswswwswwswswswswwneswswswsweswswswswswseswwnwnwwnenenwswnwnwswnwwnenwesewsewnwseneswwenwnwswnesewswwwneenwswseenenweneenenenenewnenenesewseneneeneneneneeswneneeneeneeswneenwenesweeneeswnenweenwswesweseeeeewewneeenwswseswnenwnwnewwnwnwwnwnenwnwnwnwnwnwnewnenenenenenenenwneneseneneneewseswswswswseswswnwseneseswnwsenenewwnenenenesenenenenenenwnwswseswswneswswnwswswseswseswsewswseesenenenwnwnwnwnenenewnenwnwnenenewsenewnwsenwenwnewnwwnwnwwwnwsewnewwnwnwnwnwsenwnwwnwnwnwenwnwewswnwnwnwswnenwwwwnwnewwwsewwnewwwsewwwwnwneneneneswnewnenenenenenenenesenenwwwswswnwwseewenewewwwwseswnenweeenewweneeneneeswnweseneesweneswnwsewweneneeenweseneweeeneneseeswswnwneeeeenwwneenwneeseswswswswswseswswswneswswweswswwwweswswnewenesewneneeneseeneswnweneenenesewneeneneswwwnwneswseseseeseseswseswseswneswswseseeswwnwnwswenwswnwnwnesesweenweseeenweeweeseeneswswwneswseswswswseswswswseneswwseswseseseneseseeswesweenesesewsenweseseseeneeeseneswnenenenweenenenenenewswnwnenwnwsenwsenwnwnwsenenenwnwsenesenwseswwneseswswnwseswswseseseseeseseseseneswneswnenenwnenenenenenwneneneewnenwenewwswwwnwnwwwwneewwwwnwwwswsesesenesesewseneseewseseseseswseseswseswsweswswwneswswswswseswswswnwweswswseneswsenwenwwwnwswswwneweseswswswswnwseswswswswswswswenwswseswswseswswseseseseesesenewsenwsesewneseswneeneneeneneneenesenenenenenenwnwnwnwnwsenwnenwnwnwnwnwnwnwnwnwnwwseseeseneseseseseseseswnwsewnwswwsewnwenwnwsenesenwnwnwnwnesenwwneswenenenenenenwnenenenwnwnenesenewwwwwseewwwwsewswwswwwswnenwswewswswswswwnenwnwswweewswswwswsenewenwneswseswnwswnewnewnweenwnwwwwwwenesenwwwnenwenwwwswswnenenwnenenesesewnwseneneswwswewsweswwwswnwnwwnwwewswwswswswswswwnewswwwwwswwwseseseseswesenwseewnwswseseseseswsewseswswwsewseeenwsweswneswnwwenenwwwwnwwsenwwnwwwwneewnwswnwnenwwnweseswseneseswswwsewseseeseeswswsesewswwswswnwseswnwneneeseswsenwneswswseswsesesweswneswswnwwwswswswswswseswswswseseeeeseewseseeeseseseenenenwswseseseneswseseswsenwswnwswswswswswswseswwswswwnwwwwnwwwwnwnwnenwnesewnwsewsewwwwwwswnwnwswweenwwwnwwwwwswesewwswwwnenewwswsewewwwwwnesenewneneswnenewewneneneeneseswwswseswseseswswneseseseswseseseneseneswswswswswswseswswneswswswsenwsweswswswwsesewnewneseseseswswswnwseswsweneswnwnenwwnwwwwnwwewnwwwswnwneenwwnwwwwwewwswwwswewwwwewswswneswswswwswseswseswseswswswseswnwsewswsesenwsenwseswseswswseswswswswsweseseswnenesenenewseswnwswenwnwwnenenenwnesenenwswneeswneeswwseswwnwwswswswswesesenwseeseseseneweseseeseewnewsewwnwwenwwwnwnwnwnwswnwenwnweewnweswewwewwwnwseswswneneswnwnewwnwnwsweeeneeneswnenwenenenwneseseeenwnwnwweseswewnewneseesweeseeeseeeeeseseeeweweneneeseswwwswwneswswswswswswswswwenewwwnwsenenwnwsenwnwwnesenwnwwnwnesenwnenwswnenwneenwnwwenenwnwnewswsenwneeneswseseseeswswswsesesewswswwewwnwnwewnwwwwwwwnwwwewweenwsweseewseseseneseewneeeeesesesenwseseseseswsenwneesesesesenwseseseeneseseweeeewseneswseeseeeenewewswswwwswwswswwwswswwseswswnweswnenewenenwswsweeeswneewnweseeswwswswewwswwwwnwwswswswnwwnwnwnwnweeswwnwnwnweneseswwwwwwnwnwswnwsewnwwswnwnesewnwnwnwnwwnenwnwnewnenwsewenwwneswnwnenenwneesenesewnwwswwnesewwsewnewnewsenenwseswnenwnwnwnenwnweneswnwnwnwnesenwnwnenwnweeseenwsesewswneenwsweeeswseeseseeesenwseseseenweseeneeweeeeeeweseeneseeeeeewwwswwwwwwwswswwwswweswwewnwsewseseseewswnenwweneeenwsesewswwseswswswswnwwwweswswwwnewwswwswewwwswwneswswswswswnewwswwswwswseswswsweswnwswwwswewwswswswswswswswnwsweseseseseseseeseseeseseneswsesenwseswswswswnesenwswswseseseswnwnwewseswswwwwwwnwnwewneswwwsenwwwnewwswnwneseneswwseswswseseseswseneseswswnesesesweeneenwswneenewseeneneenenewsweseeenweseeneneneeenenwswwnwsweeeneeesesweeenewnwneneenenenweneswseseseseswewnewsesenwswneseswwseeneswwsewwneswswnwwwwwwwswswswswnwswswsewswwneswweeswswswwswswsesesesesesenenwsesenesewseseseseeseswseneneenweeneeeneneenweneneswsweeenwswnwnwnwnwnwenwnenwnwswnwwnwweeneweswwseneseneesenwneseeeeseseeswswnwweseseseseseseseeeweeesesewesesesesesenwnwsesesenwswseseseseseseseneneswnenenewnenenwneneneseneneneneneenewneenenwnenwnenenwneneeswnenwewseswwnwsenewenwwnwnesenwseneseseseseseswswseseseeseswsesesenwswnenewseeneswswewneeeenweeeeeeenenweseeseseeweneseesewseewseesenwwwswswneswswswswnweenwswsenwwenwwwsenwwewewnenwnwenwswnweesenwwswwwnenenwnwsenenwnwnwnewnwnwnwswnwnwnesenwwswseneeswwwnenenenwwsesenenwneeseneesenwsesesenweeseeseeewnwnenenwnwnwnwnwsenwnwnenwnenwneneseneeswswnenwneeeeeeeeeeeeneneneneneswneneneneneneneneseneeenwwneenenwnwswswnwewwnwswewnwewswesenwnewsewwwwwwwwwwnwnwsewenwwnwenwwnwwwswswsesenesesesesenwswseenewnenwnwnewnewwwnwnwsewwwnwswnwnwsenwwnwseseswswseseseswseneswswswsenwswswsweeweeeeeneeeseeesweeeneewswwwwewnwwwwswweswswnesenwswsesweswsesesenwsesesewneneneeseneseweswnenenwswswnweeeeeeeeneeeeenweeweeneesweseseswswseseseseswswswswnewwwnwwwswnwsenewneswswswewewwwneneeeeeneeswswsweneeeneenwnewwnewwswwswenwnenwneewwsewneewenwewseeesenwesweeneswswnwseswnwnewnwnwnwnwsenwenwnwwwnwnwnwenwnwnwenenwwneseenewneeeswnewnwwnesweeswneewneswneeswnenwseneneneenesewneenesenesewneneewwneneneneneewseeneewnwenenenwswsewsweeseneswsweewwnwwwewnwwwwnenwnwsewnwnwsewnwwwwnwseswnwwenwnwnwnwnwnwnwwnwwnwnwneseswseswswewwseseneneseseneseswnwswswnwswnwwneenwweswnwnwwnwnwnwwenwnwwneswsenewweswwswswsweswswswneseeseenesenwswseeeseseeseweewseswwwwwnewnwwnwwwnwwwneeeneneeeneeeweeeenenwneeeeneswenwswsweenwsesenesweweswweeeeneeeeeneeenwseeseswneseesesesesesesesenwesenesesewsenenwswsenesenwswswewseneenwnwnwnwwnwwwenewnwnwnwsenwewwsesesesesewswneseswneneseseseseswswswwswswsweswswsweswswwwsweswnwseswweseneeeeseswsewwnwsweswsewnwwwwnenwwwsewwsewwnwwewwwwweenweeseewwseeseseeswneneweseseeeneswsenenenenewneenewneneneneneeneneseswseseswwnesesenwseseesenwnesesenenewneswswswswseswwswswswswnwenwswswneswesewseseswseswseseneenewswswwseseswnwseewwwwnwwswswsewswsewsenwwneswneewneweeneswwseenwswsenwsweenwneneeeseseseneseneswswnwsewswnwwnesweeesweeeswenwenenenweeseseeeweeneesenewneneeneeneneseenenwneswswnwnenwnwwswsenwnwseseenesenenwneswneseswnwwseseneeswwneswswswwsweeswnwnwsenenwnesenwnwnwnwnwwneswnwnwwwewwwwwewwswwwwwwneswewnwswwwwswwnweswseseseseseesesesenwseseseswnwnenenwnwnenenwnwsenenwnwnwswnenenwseseseneneneeswnwnwsenwnwnwswswneswewwnwnenwnenwseeneswnwnwswnwwsenenwseswswswswseswswwswswswenwneeseswsenwesesewsenwswwneseseeswseeeeeeenweeeeeesweenwsewswnwwseewnwwnwsenwnwnwnwnwwwnwwwwnwnwseneeswnwnenwswnwneneeneseneeswewwsewnwswnwswneesenesewwwwwswwneswwseswseesesesewswnweswsewseseneswneswwswwswwneswswnewswwseenwwswswwswswnwswswswwswnwwswswseeeswwneswswswnwnewewwsesewwwwwwwwswnwwwnenwewswwwwwwsenwwnwsesesewsewseeeseseneeenenwsweenweeeenwseseenwseseeswnwwnwwswswnwewsenwnwnwneeneswwwnwnwswnewwswswwnewswwswswseswswsenewwwnwsenwsenwswsenweneenwsesenweewnwswsweseseenwseesewneeeseseseewseeseeewenwnwswsewsenewnwnwsenwnwenenwnwswwwnwnwnwsewnwnwnwnwnwnwnwnwnwnwsenwnenwnenwnwnwnwnwwnwsenwswseswswswswseswsesweneseneswwsenwswwsewnewnewseewwwwswswswwnwswswwneseswnwwnwseseswneseswwnwwenewswswswnewswwwewwswnwenwsewwwswswnwwseseseseseseseseswsesesenwseseneswseswseswswwsesenesesesenwswswwewnwnwsenenwnwwsewwseswnwwsenenwnwneenenenwnwnenwwnenenweneswnwnwnwwnwnwnwnwnewwwsewwsenwnwwnwnwnwwnwneeswweeeeseenweeenweswswswsewwwswnwwwwnesewwewnewwwsewwwnwnwnwswwwwwwnenwnwnwnwnwnwnwnwewnwswwwswswswswswsweswnwswsweneweswswswswnwnenwseneswsenwneenwnenenwnenwnwswnenwnwesewnwsesenwseeseeseseeseesesenenwneeneneeneeenwnenenenweswneneswesesweenweeeenesewwseeseseseneseseseswswsesesesesenwseneswseseesesesesesweeseeeneeneenenwnwenesweenwnwnwnwwnenwnwnwnwnwesenwswsesenenwwwwwwwwswnwwnewsewnenwnenenenenewsenwwenenesesenwnewseswswsewseseenenwsweswwswnwwnwsenwwwsenesewswnenwwwseneenwswwneswnwnwsenwnwwsesweewnesenwseseenewnwnewsewwwwnwnwwwnwsenwwnwnwnwnwnwnwnenwsenwnwnwnwnwwnweneeneeneeneneneswswnwneenenwnenwneswnewswnenenweswnwnenenwesweenenwnwwswnwswneswwseseswswwswwwswswnwsesenesewseneeseenwnweeeswseswnewenesewnewswwswneswswseswwnenenwnwnwwswnenenwnwnenenwnwnesenwnwenwnwswwwswswwneswnewwwsewewwswwwswenewsweneseneenewnenewenewesenewenenwneneswneneneswswneeneneneneneneneneneseswnesesesesenwsesesewsesesesenwnwseswsesewseesesesesesenesesesenwswnwneseeweeeeeeeseswnwenenwsewsweeeewnwswsewewwwnwwswwwnwwwenwnewnwsweeeeeeeeeesenweseeeeeswnwnwwnwenwwnwnwnwnwnenwnwnwenwnwnwswnwnwswswswwewswswneseswswswswwswswneswweswseseeweeeseeeneneseeseseseeneneneeneswneenweneneeenenenenewsenewseeweneneweseeneeneneeeseeneneneneesenwwsenenenewwweeneneweeswnesesenwneeneeesenwwswneswnwnwnewweesweweneeneeeeneesweeseenwenenwnwnwswneneenenenwnenwnwnwswnesenenenewneswnesenwswseswesenwswseswewswseswweseenweeseeeeeeesesesenwsweewseseeseseeeseseeswsewnewwwnesesewwwwnwsewnenewnwnenenenenesenenenenewnwnesenenenwnwnwswswnewewnenwsewseswwsenenwesenwewenwnwnwwnwswwwnwweeeseeeesesenewseweeeeesenenwnwnewwwnwenwwswwnwwnwseesewseweenenenenenenenewnenesweneenesenwswenwsesenenwsewswnewswsenenwneseswwswnesenwnewnenenenenenenenwwwswwwswwnewwsewswenewswwnewwwwwwnewnwseswswwwsw