module Website
import Data.List
import Data.List1
import Data.String
import System
import System.File
-- This is Molly's website.
--
-- This webpage is the source code for an Idris 2 program (tested with version
-- v0.6.0). It prints a summary of the information presented below, and it's also
-- a quine, as it can print its own source code. (It's also a quine generator,
-- which is how I wrote it in the first place.)
{- Information about me -}
||| My name.
name : String
name = "Molly Miller"
||| Types of link I have on my website.
data Link : Type where
GitHub : (username : String) -> Link
Irc : (net : String) -> (nick : String) -> Link
Email : (user_part : String) -> (domain_part : String) -> Link
Other : (desc : String) -> (url : String) -> Link
||| Relative links on my website.
slash : String -> String
slash = ("https://www.mollymiller.net/" ++)
||| Links to other places.
links : List Link
links = [
Other "blog" (slash "blog"),
GitHub "@sysvinit",
Irc "Libera Chat" "molly",
Irc "OFTC" "molly",
Irc "Hackint" "molly",
Email "interwebs" "m-squa.red",
Other "music feed" (slash "nowplaying")
]
||| I have things in which I'm interested.
Interest : Type
Interest = String
||| I have the following general interests.
interests : List Interest
interests = [ "Unix systems", "network engineering",
"functional programming" ]
||| I spend time doing things in places.
data Occupation : Type where
OccupiedWith : (what : String) -> (where_ : String) -> Occupation
||| I spend most of my time doing this thing.
mainOccupation : Occupation
mainOccupation = OccupiedWith "Systems Engineering" "Flying Circus"
||| But I do other things as well.
otherOccupations : List Occupation
otherOccupations = [
OccupiedWith "internet routing" "AS207480",
OccupiedWith "hackerspace operations" "AfRA"
]
{- Some meta things -}
||| The type of a copyright declaration.
data Copyright : Type where
C : (year : Int) -> (holder : String) -> Copyright
||| This program carries the following copyright.
copyright : Copyright
copyright = C 2023 name
||| This program source code is released under the following licence.
spdxLicenseIdentifier : String
spdxLicenseIdentifier = "ISC"
||| This site was made using the following tools.
madeWith : List String
madeWith = ["Idris 2", "Pygments", "Dracula"]
{- The main program, which does the heavy lifting -}
-- Some useful interface implementations.
implementation Show Link where
show (GitHub username) = username ++ " on GitHub"
show (Irc net nick) = nick ++ " on " ++ net ++ " IRC"
show (Email user domain) = "email: " ++ user ++ " AT " ++ domain
show (Other desc url) = desc ++ " at " ++ url
implementation Show Copyright where
show (C year holder) = "Copyright (C) " ++ show year ++ " " ++ holder
implementation Show Occupation where
show (OccupiedWith thing place) =
thing ++ " at " ++ place
-- Some utility functions.
||| Exit with an error message.
errmsg : String -> IO a
errmsg msg = fPutStrLn stderr msg *> exitFailure
||| Split a list of strings onto separate lines so that no line is
||| longer than `len` characters long.
wrapLines : Nat -> List String -> List (List String)
wrapLines len ss = wrap (map makePair ss) []
where
makePair : String -> (String, Nat)
makePair s = (s, length s)
wrap : List (String, Nat) -> List (List String, Nat) ->
List (List String)
wrap [] acc = reverse $ map (reverse . fst) acc
wrap (x :: xs) [] = wrap xs $ pure (pure $ fst x, snd x)
wrap (x :: xs) acc@(y :: ys) =
if snd x >= len
then wrap xs $ (pure $ fst x, snd x) :: acc
else if snd x + snd y >= len
then wrap xs $ (pure $ fst x, snd x) :: acc
else wrap xs $ (fst x :: fst y, snd x + snd y) :: ys
||| Format and concatenate items in a line.
formatLines : Nat -> List (List String) -> List String
formatLines spcs =
map (indent spcs . pack . intercalate [' ', '|', ' '] . map unpack)
||| Display the information presented at the top of this file.
displayInfo : IO ()
displayInfo =
do putStrLn ""
putStrLn (indent 30 name)
putStrLn ""
traverse_ putStrLn
((formatLines 8 . wrapLines 56) interests)
putStrLn ""
traverse_ putStrLn
((formatLines 9 . wrapLines 54 . map show) links)
putStrLn ""
traverse_ (putStrLn . indent 20 . show)
(Prelude.(::) mainOccupation otherOccupations)
putStrLn ""
putStr (indent 6 (show copyright))
putStr "; SPDX-License-Identifier: "
putStrLn spdxLicenseIdentifier
putStrLn ""
-- Forward declarations, for functions which are used before they are
-- defined.
||| This program's own source code in encoded form.
ownSource : (List Int, List Int)
||| Encoded magic numbers.
magic : List Int
-- Functions which perform quine encoding and decoding.
||| Convert a list of integers into a stringified form which can be passed
||| back into the Idris compiler.
encode : List Int -> String
encode = foldr (++) "\n" . intersperse ",\n" .
map concatLine . splitIntoLines
where
splitIntoLines : List a -> List (List a)
splitIntoLines [] = []
splitIntoLines xs = let (start, rest) = splitAt 15 xs
in start :: splitIntoLines rest
concatLine : List Int -> String
concatLine = (" " ++) . pack . intercalate [',', ' '] .
map (unpack . cast)
||| Turn a list of integers into a string whose characters have
||| the ASCII/Unicode values of the corresponding integer in the
||| input list.
render : List Int -> String
render = pack . map cast
||| Render the magic numbers.
renderedMagic : String
renderedMagic = render magic
||| Attempt to split an arbitrary program's input around a fixed point.
splitOnFixedPoint : String -> Either String (String, String)
splitOnFixedPoint str =
let lines = (newlines . toList . split (== '\n')) str
in case (toList . split (== renderedMagic)) lines of
start :: end :: Nil => Right (concat start, concat end)
_ => Left "Secret magic not found"
where
newlines : List String -> List String
newlines [] = []
newlines (x :: Nil) = pure x
newlines (x :: xs) = (x ++ "\n") :: newlines xs
||| Load a file and attempt to split its contents around the
||| quine's fixed point.
loadFile : String -> IO (String, String)
loadFile file =
do res <- readFile file
content <- case res of
Right v => pure v
Left err => errmsg ("Could not read " ++ file)
case splitOnFixedPoint content of
Right v => pure v
Left err => errmsg err
-- Putting everything together...
||| Load this program's source from the named file and insert the
||| encoded sections necessary to turn it into a printable quine.
renderExternal : String -> IO String
renderExternal file =
do (top, bottom) <- loadFile file
let enctop = (encode . map ord . unpack) top
let encbot = (encode . map ord . unpack) bottom
pure (top ++ enctop ++ renderedMagic ++ encbot ++ bottom)
||| Render this program's embedded encoded source into a printable
||| quine.
renderInternal : String
renderInternal =
let top = (render . fst) ownSource
bottom = (render . snd) ownSource
enctop = (encode . fst) ownSource
encbot = (encode . snd) ownSource
in top ++ enctop ++ renderedMagic ++ encbot ++ bottom
-- And the main program.
||| The main entry point into the program.
main : IO ()
main =
do args <- getArgs
case args of
argv0 :: "source" :: Nil => putStr renderInternal
argv0 :: "make-quine" :: filename :: Nil =>
renderExternal filename >>= putStr
_ => displayInfo
ownSource = ([
109, 111, 100, 117, 108, 101, 32, 87, 101, 98, 115, 105, 116, 101, 10,
10, 105, 109, 112, 111, 114, 116, 32, 68, 97, 116, 97, 46, 76, 105,
115, 116, 10, 105, 109, 112, 111, 114, 116, 32, 68, 97, 116, 97, 46,
76, 105, 115, 116, 49, 10, 105, 109, 112, 111, 114, 116, 32, 68, 97,
116, 97, 46, 83, 116, 114, 105, 110, 103, 10, 105, 109, 112, 111, 114,
116, 32, 83, 121, 115, 116, 101, 109, 10, 105, 109, 112, 111, 114, 116,
32, 83, 121, 115, 116, 101, 109, 46, 70, 105, 108, 101, 10, 10, 45,
45, 32, 84, 104, 105, 115, 32, 105, 115, 32, 77, 111, 108, 108, 121,
39, 115, 32, 119, 101, 98, 115, 105, 116, 101, 46, 10, 45, 45, 10,
45, 45, 32, 84, 104, 105, 115, 32, 119, 101, 98, 112, 97, 103, 101,
32, 105, 115, 32, 116, 104, 101, 32, 115, 111, 117, 114, 99, 101, 32,
99, 111, 100, 101, 32, 102, 111, 114, 32, 97, 110, 32, 73, 100, 114,
105, 115, 32, 50, 32, 112, 114, 111, 103, 114, 97, 109, 32, 40, 116,
101, 115, 116, 101, 100, 32, 119, 105, 116, 104, 32, 118, 101, 114, 115,
105, 111, 110, 10, 45, 45, 32, 118, 48, 46, 54, 46, 48, 41, 46,
32, 73, 116, 32, 112, 114, 105, 110, 116, 115, 32, 97, 32, 115, 117,
109, 109, 97, 114, 121, 32, 111, 102, 32, 116, 104, 101, 32, 105, 110,
102, 111, 114, 109, 97, 116, 105, 111, 110, 32, 112, 114, 101, 115, 101,
110, 116, 101, 100, 32, 98, 101, 108, 111, 119, 44, 32, 97, 110, 100,
32, 105, 116, 39, 115, 32, 97, 108, 115, 111, 10, 45, 45, 32, 97,
32, 113, 117, 105, 110, 101, 44, 32, 97, 115, 32, 105, 116, 32, 99,
97, 110, 32, 112, 114, 105, 110, 116, 32, 105, 116, 115, 32, 111, 119,
110, 32, 115, 111, 117, 114, 99, 101, 32, 99, 111, 100, 101, 46, 32,
40, 73, 116, 39, 115, 32, 97, 108, 115, 111, 32, 97, 32, 113, 117,
105, 110, 101, 32, 103, 101, 110, 101, 114, 97, 116, 111, 114, 44, 10,
45, 45, 32, 119, 104, 105, 99, 104, 32, 105, 115, 32, 104, 111, 119,
32, 73, 32, 119, 114, 111, 116, 101, 32, 105, 116, 32, 105, 110, 32,
116, 104, 101, 32, 102, 105, 114, 115, 116, 32, 112, 108, 97, 99, 101,
46, 41, 10, 10, 123, 45, 32, 73, 110, 102, 111, 114, 109, 97, 116,
105, 111, 110, 32, 97, 98, 111, 117, 116, 32, 109, 101, 32, 45, 125,
10, 10, 124, 124, 124, 32, 77, 121, 32, 110, 97, 109, 101, 46, 10,
110, 97, 109, 101, 32, 58, 32, 83, 116, 114, 105, 110, 103, 10, 110,
97, 109, 101, 32, 61, 32, 34, 77, 111, 108, 108, 121, 32, 77, 105,
108, 108, 101, 114, 34, 10, 10, 124, 124, 124, 32, 84, 121, 112, 101,
115, 32, 111, 102, 32, 108, 105, 110, 107, 32, 73, 32, 104, 97, 118,
101, 32, 111, 110, 32, 109, 121, 32, 119, 101, 98, 115, 105, 116, 101,
46, 10, 100, 97, 116, 97, 32, 76, 105, 110, 107, 32, 58, 32, 84,
121, 112, 101, 32, 119, 104, 101, 114, 101, 10, 32, 32, 71, 105, 116,
72, 117, 98, 32, 58, 32, 40, 117, 115, 101, 114, 110, 97, 109, 101,
32, 58, 32, 83, 116, 114, 105, 110, 103, 41, 32, 45, 62, 32, 76,
105, 110, 107, 10, 32, 32, 73, 114, 99, 32, 58, 32, 40, 110, 101,
116, 32, 58, 32, 83, 116, 114, 105, 110, 103, 41, 32, 45, 62, 32,
40, 110, 105, 99, 107, 32, 58, 32, 83, 116, 114, 105, 110, 103, 41,
32, 45, 62, 32, 76, 105, 110, 107, 10, 32, 32, 69, 109, 97, 105,
108, 32, 58, 32, 40, 117, 115, 101, 114, 95, 112, 97, 114, 116, 32,
58, 32, 83, 116, 114, 105, 110, 103, 41, 32, 45, 62, 32, 40, 100,
111, 109, 97, 105, 110, 95, 112, 97, 114, 116, 32, 58, 32, 83, 116,
114, 105, 110, 103, 41, 32, 45, 62, 32, 76, 105, 110, 107, 10, 32,
32, 79, 116, 104, 101, 114, 32, 58, 32, 40, 100, 101, 115, 99, 32,
58, 32, 83, 116, 114, 105, 110, 103, 41, 32, 45, 62, 32, 40, 117,
114, 108, 32, 58, 32, 83, 116, 114, 105, 110, 103, 41, 32, 45, 62,
32, 76, 105, 110, 107, 10, 10, 124, 124, 124, 32, 82, 101, 108, 97,
116, 105, 118, 101, 32, 108, 105, 110, 107, 115, 32, 111, 110, 32, 109,
121, 32, 119, 101, 98, 115, 105, 116, 101, 46, 10, 115, 108, 97, 115,
104, 32, 58, 32, 83, 116, 114, 105, 110, 103, 32, 45, 62, 32, 83,
116, 114, 105, 110, 103, 10, 115, 108, 97, 115, 104, 32, 61, 32, 40,
34, 104, 116, 116, 112, 115, 58, 47, 47, 119, 119, 119, 46, 109, 111,
108, 108, 121, 109, 105, 108, 108, 101, 114, 46, 110, 101, 116, 47, 34,
32, 43, 43, 41, 10, 10, 124, 124, 124, 32, 76, 105, 110, 107, 115,
32, 116, 111, 32, 111, 116, 104, 101, 114, 32, 112, 108, 97, 99, 101,
115, 46, 10, 108, 105, 110, 107, 115, 32, 58, 32, 76, 105, 115, 116,
32, 76, 105, 110, 107, 10, 108, 105, 110, 107, 115, 32, 61, 32, 91,
10, 32, 32, 32, 32, 79, 116, 104, 101, 114, 32, 34, 98, 108, 111,
103, 34, 32, 40, 115, 108, 97, 115, 104, 32, 34, 98, 108, 111, 103,
34, 41, 44, 10, 32, 32, 32, 32, 71, 105, 116, 72, 117, 98, 32,
34, 64, 115, 121, 115, 118, 105, 110, 105, 116, 34, 44, 10, 32, 32,
32, 32, 73, 114, 99, 32, 34, 76, 105, 98, 101, 114, 97, 32, 67,
104, 97, 116, 34, 32, 34, 109, 111, 108, 108, 121, 34, 44, 10, 32,
32, 32, 32, 73, 114, 99, 32, 34, 79, 70, 84, 67, 34, 32, 34,
109, 111, 108, 108, 121, 34, 44, 10, 32, 32, 32, 32, 73, 114, 99,
32, 34, 72, 97, 99, 107, 105, 110, 116, 34, 32, 34, 109, 111, 108,
108, 121, 34, 44, 10, 32, 32, 32, 32, 69, 109, 97, 105, 108, 32,
34, 105, 110, 116, 101, 114, 119, 101, 98, 115, 34, 32, 34, 109, 45,
115, 113, 117, 97, 46, 114, 101, 100, 34, 44, 10, 32, 32, 32, 32,
79, 116, 104, 101, 114, 32, 34, 109, 117, 115, 105, 99, 32, 102, 101,
101, 100, 34, 32, 40, 115, 108, 97, 115, 104, 32, 34, 110, 111, 119,
112, 108, 97, 121, 105, 110, 103, 34, 41, 10, 93, 10, 10, 124, 124,
124, 32, 73, 32, 104, 97, 118, 101, 32, 116, 104, 105, 110, 103, 115,
32, 105, 110, 32, 119, 104, 105, 99, 104, 32, 73, 39, 109, 32, 105,
110, 116, 101, 114, 101, 115, 116, 101, 100, 46, 10, 73, 110, 116, 101,
114, 101, 115, 116, 32, 58, 32, 84, 121, 112, 101, 10, 73, 110, 116,
101, 114, 101, 115, 116, 32, 61, 32, 83, 116, 114, 105, 110, 103, 10,
10, 124, 124, 124, 32, 73, 32, 104, 97, 118, 101, 32, 116, 104, 101,
32, 102, 111, 108, 108, 111, 119, 105, 110, 103, 32, 103, 101, 110, 101,
114, 97, 108, 32, 105, 110, 116, 101, 114, 101, 115, 116, 115, 46, 10,
105, 110, 116, 101, 114, 101, 115, 116, 115, 32, 58, 32, 76, 105, 115,
116, 32, 73, 110, 116, 101, 114, 101, 115, 116, 10, 105, 110, 116, 101,
114, 101, 115, 116, 115, 32, 61, 32, 91, 32, 34, 85, 110, 105, 120,
32, 115, 121, 115, 116, 101, 109, 115, 34, 44, 32, 34, 110, 101, 116,
119, 111, 114, 107, 32, 101, 110, 103, 105, 110, 101, 101, 114, 105, 110,
103, 34, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 34, 102, 117, 110, 99, 116, 105, 111, 110, 97, 108, 32,
112, 114, 111, 103, 114, 97, 109, 109, 105, 110, 103, 34, 32, 93, 10,
10, 124, 124, 124, 32, 73, 32, 115, 112, 101, 110, 100, 32, 116, 105,
109, 101, 32, 100, 111, 105, 110, 103, 32, 116, 104, 105, 110, 103, 115,
32, 105, 110, 32, 112, 108, 97, 99, 101, 115, 46, 10, 100, 97, 116,
97, 32, 79, 99, 99, 117, 112, 97, 116, 105, 111, 110, 32, 58, 32,
84, 121, 112, 101, 32, 119, 104, 101, 114, 101, 10, 32, 32, 79, 99,
99, 117, 112, 105, 101, 100, 87, 105, 116, 104, 32, 58, 32, 40, 119,
104, 97, 116, 32, 58, 32, 83, 116, 114, 105, 110, 103, 41, 32, 45,
62, 32, 40, 119, 104, 101, 114, 101, 95, 32, 58, 32, 83, 116, 114,
105, 110, 103, 41, 32, 45, 62, 32, 79, 99, 99, 117, 112, 97, 116,
105, 111, 110, 10, 10, 124, 124, 124, 32, 73, 32, 115, 112, 101, 110,
100, 32, 109, 111, 115, 116, 32, 111, 102, 32, 109, 121, 32, 116, 105,
109, 101, 32, 100, 111, 105, 110, 103, 32, 116, 104, 105, 115, 32, 116,
104, 105, 110, 103, 46, 10, 109, 97, 105, 110, 79, 99, 99, 117, 112,
97, 116, 105, 111, 110, 32, 58, 32, 79, 99, 99, 117, 112, 97, 116,
105, 111, 110, 10, 109, 97, 105, 110, 79, 99, 99, 117, 112, 97, 116,
105, 111, 110, 32, 61, 32, 79, 99, 99, 117, 112, 105, 101, 100, 87,
105, 116, 104, 32, 34, 83, 121, 115, 116, 101, 109, 115, 32, 69, 110,
103, 105, 110, 101, 101, 114, 105, 110, 103, 34, 32, 34, 70, 108, 121,
105, 110, 103, 32, 67, 105, 114, 99, 117, 115, 34, 10, 10, 124, 124,
124, 32, 66, 117, 116, 32, 73, 32, 100, 111, 32, 111, 116, 104, 101,
114, 32, 116, 104, 105, 110, 103, 115, 32, 97, 115, 32, 119, 101, 108,
108, 46, 10, 111, 116, 104, 101, 114, 79, 99, 99, 117, 112, 97, 116,
105, 111, 110, 115, 32, 58, 32, 76, 105, 115, 116, 32, 79, 99, 99,
117, 112, 97, 116, 105, 111, 110, 10, 111, 116, 104, 101, 114, 79, 99,
99, 117, 112, 97, 116, 105, 111, 110, 115, 32, 61, 32, 91, 10, 32,
32, 79, 99, 99, 117, 112, 105, 101, 100, 87, 105, 116, 104, 32, 34,
105, 110, 116, 101, 114, 110, 101, 116, 32, 114, 111, 117, 116, 105, 110,
103, 34, 32, 34, 65, 83, 50, 48, 55, 52, 56, 48, 34, 44, 10,
32, 32, 79, 99, 99, 117, 112, 105, 101, 100, 87, 105, 116, 104, 32,
34, 104, 97, 99, 107, 101, 114, 115, 112, 97, 99, 101, 32, 111, 112,
101, 114, 97, 116, 105, 111, 110, 115, 34, 32, 34, 65, 102, 82, 65,
34, 10, 93, 10, 10, 10, 123, 45, 32, 83, 111, 109, 101, 32, 109,
101, 116, 97, 32, 116, 104, 105, 110, 103, 115, 32, 45, 125, 10, 10,
124, 124, 124, 32, 84, 104, 101, 32, 116, 121, 112, 101, 32, 111, 102,
32, 97, 32, 99, 111, 112, 121, 114, 105, 103, 104, 116, 32, 100, 101,
99, 108, 97, 114, 97, 116, 105, 111, 110, 46, 10, 100, 97, 116, 97,
32, 67, 111, 112, 121, 114, 105, 103, 104, 116, 32, 58, 32, 84, 121,
112, 101, 32, 119, 104, 101, 114, 101, 10, 32, 32, 67, 32, 58, 32,
40, 121, 101, 97, 114, 32, 58, 32, 73, 110, 116, 41, 32, 45, 62,
32, 40, 104, 111, 108, 100, 101, 114, 32, 58, 32, 83, 116, 114, 105,
110, 103, 41, 32, 45, 62, 32, 67, 111, 112, 121, 114, 105, 103, 104,
116, 10, 10, 124, 124, 124, 32, 84, 104, 105, 115, 32, 112, 114, 111,
103, 114, 97, 109, 32, 99, 97, 114, 114, 105, 101, 115, 32, 116, 104,
101, 32, 102, 111, 108, 108, 111, 119, 105, 110, 103, 32, 99, 111, 112,
121, 114, 105, 103, 104, 116, 46, 10, 99, 111, 112, 121, 114, 105, 103,
104, 116, 32, 58, 32, 67, 111, 112, 121, 114, 105, 103, 104, 116, 10,
99, 111, 112, 121, 114, 105, 103, 104, 116, 32, 61, 32, 67, 32, 50,
48, 50, 51, 32, 110, 97, 109, 101, 10, 10, 124, 124, 124, 32, 84,
104, 105, 115, 32, 112, 114, 111, 103, 114, 97, 109, 32, 115, 111, 117,
114, 99, 101, 32, 99, 111, 100, 101, 32, 105, 115, 32, 114, 101, 108,
101, 97, 115, 101, 100, 32, 117, 110, 100, 101, 114, 32, 116, 104, 101,
32, 102, 111, 108, 108, 111, 119, 105, 110, 103, 32, 108, 105, 99, 101,
110, 99, 101, 46, 10, 115, 112, 100, 120, 76, 105, 99, 101, 110, 115,
101, 73, 100, 101, 110, 116, 105, 102, 105, 101, 114, 32, 58, 32, 83,
116, 114, 105, 110, 103, 10, 115, 112, 100, 120, 76, 105, 99, 101, 110,
115, 101, 73, 100, 101, 110, 116, 105, 102, 105, 101, 114, 32, 61, 32,
34, 73, 83, 67, 34, 10, 10, 124, 124, 124, 32, 84, 104, 105, 115,
32, 115, 105, 116, 101, 32, 119, 97, 115, 32, 109, 97, 100, 101, 32,
117, 115, 105, 110, 103, 32, 116, 104, 101, 32, 102, 111, 108, 108, 111,
119, 105, 110, 103, 32, 116, 111, 111, 108, 115, 46, 10, 109, 97, 100,
101, 87, 105, 116, 104, 32, 58, 32, 76, 105, 115, 116, 32, 83, 116,
114, 105, 110, 103, 10, 109, 97, 100, 101, 87, 105, 116, 104, 32, 61,
32, 91, 34, 73, 100, 114, 105, 115, 32, 50, 34, 44, 32, 34, 80,
121, 103, 109, 101, 110, 116, 115, 34, 44, 32, 34, 68, 114, 97, 99,
117, 108, 97, 34, 93, 10, 10, 10, 123, 45, 32, 84, 104, 101, 32,
109, 97, 105, 110, 32, 112, 114, 111, 103, 114, 97, 109, 44, 32, 119,
104, 105, 99, 104, 32, 100, 111, 101, 115, 32, 116, 104, 101, 32, 104,
101, 97, 118, 121, 32, 108, 105, 102, 116, 105, 110, 103, 32, 45, 125,
10, 10, 45, 45, 32, 83, 111, 109, 101, 32, 117, 115, 101, 102, 117,
108, 32, 105, 110, 116, 101, 114, 102, 97, 99, 101, 32, 105, 109, 112,
108, 101, 109, 101, 110, 116, 97, 116, 105, 111, 110, 115, 46, 10, 10,
105, 109, 112, 108, 101, 109, 101, 110, 116, 97, 116, 105, 111, 110, 32,
83, 104, 111, 119, 32, 76, 105, 110, 107, 32, 119, 104, 101, 114, 101,
10, 32, 32, 115, 104, 111, 119, 32, 40, 71, 105, 116, 72, 117, 98,
32, 117, 115, 101, 114, 110, 97, 109, 101, 41, 32, 61, 32, 117, 115,
101, 114, 110, 97, 109, 101, 32, 43, 43, 32, 34, 32, 111, 110, 32,
71, 105, 116, 72, 117, 98, 34, 10, 32, 32, 115, 104, 111, 119, 32,
40, 73, 114, 99, 32, 110, 101, 116, 32, 110, 105, 99, 107, 41, 32,
61, 32, 110, 105, 99, 107, 32, 43, 43, 32, 34, 32, 111, 110, 32,
34, 32, 43, 43, 32, 110, 101, 116, 32, 43, 43, 32, 34, 32, 73,
82, 67, 34, 10, 32, 32, 115, 104, 111, 119, 32, 40, 69, 109, 97,
105, 108, 32, 117, 115, 101, 114, 32, 100, 111, 109, 97, 105, 110, 41,
32, 61, 32, 34, 101, 109, 97, 105, 108, 58, 32, 34, 32, 43, 43,
32, 117, 115, 101, 114, 32, 43, 43, 32, 34, 32, 65, 84, 32, 34,
32, 43, 43, 32, 100, 111, 109, 97, 105, 110, 10, 32, 32, 115, 104,
111, 119, 32, 40, 79, 116, 104, 101, 114, 32, 100, 101, 115, 99, 32,
117, 114, 108, 41, 32, 61, 32, 100, 101, 115, 99, 32, 43, 43, 32,
34, 32, 97, 116, 32, 34, 32, 43, 43, 32, 117, 114, 108, 10, 10,
105, 109, 112, 108, 101, 109, 101, 110, 116, 97, 116, 105, 111, 110, 32,
83, 104, 111, 119, 32, 67, 111, 112, 121, 114, 105, 103, 104, 116, 32,
119, 104, 101, 114, 101, 10, 32, 32, 115, 104, 111, 119, 32, 40, 67,
32, 121, 101, 97, 114, 32, 104, 111, 108, 100, 101, 114, 41, 32, 61,
32, 34, 67, 111, 112, 121, 114, 105, 103, 104, 116, 32, 40, 67, 41,
32, 34, 32, 43, 43, 32, 115, 104, 111, 119, 32, 121, 101, 97, 114,
32, 43, 43, 32, 34, 32, 34, 32, 43, 43, 32, 104, 111, 108, 100,
101, 114, 10, 10, 105, 109, 112, 108, 101, 109, 101, 110, 116, 97, 116,
105, 111, 110, 32, 83, 104, 111, 119, 32, 79, 99, 99, 117, 112, 97,
116, 105, 111, 110, 32, 119, 104, 101, 114, 101, 10, 32, 32, 115, 104,
111, 119, 32, 40, 79, 99, 99, 117, 112, 105, 101, 100, 87, 105, 116,
104, 32, 116, 104, 105, 110, 103, 32, 112, 108, 97, 99, 101, 41, 32,
61, 10, 32, 32, 32, 32, 116, 104, 105, 110, 103, 32, 43, 43, 32,
34, 32, 97, 116, 32, 34, 32, 43, 43, 32, 112, 108, 97, 99, 101,
10, 10, 45, 45, 32, 83, 111, 109, 101, 32, 117, 116, 105, 108, 105,
116, 121, 32, 102, 117, 110, 99, 116, 105, 111, 110, 115, 46, 10, 10,
124, 124, 124, 32, 69, 120, 105, 116, 32, 119, 105, 116, 104, 32, 97,
110, 32, 101, 114, 114, 111, 114, 32, 109, 101, 115, 115, 97, 103, 101,
46, 10, 101, 114, 114, 109, 115, 103, 32, 58, 32, 83, 116, 114, 105,
110, 103, 32, 45, 62, 32, 73, 79, 32, 97, 10, 101, 114, 114, 109,
115, 103, 32, 109, 115, 103, 32, 61, 32, 102, 80, 117, 116, 83, 116,
114, 76, 110, 32, 115, 116, 100, 101, 114, 114, 32, 109, 115, 103, 32,
42, 62, 32, 101, 120, 105, 116, 70, 97, 105, 108, 117, 114, 101, 10,
10, 124, 124, 124, 32, 83, 112, 108, 105, 116, 32, 97, 32, 108, 105,
115, 116, 32, 111, 102, 32, 115, 116, 114, 105, 110, 103, 115, 32, 111,
110, 116, 111, 32, 115, 101, 112, 97, 114, 97, 116, 101, 32, 108, 105,
110, 101, 115, 32, 115, 111, 32, 116, 104, 97, 116, 32, 110, 111, 32,
108, 105, 110, 101, 32, 105, 115, 10, 124, 124, 124, 32, 108, 111, 110,
103, 101, 114, 32, 116, 104, 97, 110, 32, 96, 108, 101, 110, 96, 32,
99, 104, 97, 114, 97, 99, 116, 101, 114, 115, 32, 108, 111, 110, 103,
46, 10, 119, 114, 97, 112, 76, 105, 110, 101, 115, 32, 58, 32, 78,
97, 116, 32, 45, 62, 32, 76, 105, 115, 116, 32, 83, 116, 114, 105,
110, 103, 32, 45, 62, 32, 76, 105, 115, 116, 32, 40, 76, 105, 115,
116, 32, 83, 116, 114, 105, 110, 103, 41, 10, 119, 114, 97, 112, 76,
105, 110, 101, 115, 32, 108, 101, 110, 32, 115, 115, 32, 61, 32, 119,
114, 97, 112, 32, 40, 109, 97, 112, 32, 109, 97, 107, 101, 80, 97,
105, 114, 32, 115, 115, 41, 32, 91, 93, 10, 32, 32, 119, 104, 101,
114, 101, 10, 32, 32, 32, 32, 109, 97, 107, 101, 80, 97, 105, 114,
32, 58, 32, 83, 116, 114, 105, 110, 103, 32, 45, 62, 32, 40, 83,
116, 114, 105, 110, 103, 44, 32, 78, 97, 116, 41, 10, 32, 32, 32,
32, 109, 97, 107, 101, 80, 97, 105, 114, 32, 115, 32, 61, 32, 40,
115, 44, 32, 108, 101, 110, 103, 116, 104, 32, 115, 41, 10, 10, 32,
32, 32, 32, 119, 114, 97, 112, 32, 58, 32, 76, 105, 115, 116, 32,
40, 83, 116, 114, 105, 110, 103, 44, 32, 78, 97, 116, 41, 32, 45,
62, 32, 76, 105, 115, 116, 32, 40, 76, 105, 115, 116, 32, 83, 116,
114, 105, 110, 103, 44, 32, 78, 97, 116, 41, 32, 45, 62, 10, 32,
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 105, 115, 116, 32,
40, 76, 105, 115, 116, 32, 83, 116, 114, 105, 110, 103, 41, 10, 32,
32, 32, 32, 119, 114, 97, 112, 32, 91, 93, 32, 32, 32, 32, 32,
32, 32, 32, 97, 99, 99, 32, 61, 32, 114, 101, 118, 101, 114, 115,
101, 32, 36, 32, 109, 97, 112, 32, 40, 114, 101, 118, 101, 114, 115,
101, 32, 46, 32, 102, 115, 116, 41, 32, 97, 99, 99, 10, 32, 32,
32, 32, 119, 114, 97, 112, 32, 40, 120, 32, 58, 58, 32, 120, 115,
41, 32, 91, 93, 32, 32, 61, 32, 119, 114, 97, 112, 32, 120, 115,
32, 36, 32, 112, 117, 114, 101, 32, 40, 112, 117, 114, 101, 32, 36,
32, 102, 115, 116, 32, 120, 44, 32, 115, 110, 100, 32, 120, 41, 10,
32, 32, 32, 32, 119, 114, 97, 112, 32, 40, 120, 32, 58, 58, 32,
120, 115, 41, 32, 97, 99, 99, 64, 40, 121, 32, 58, 58, 32, 121,
115, 41, 32, 61, 10, 32, 32, 32, 32, 32, 32, 105, 102, 32, 115,
110, 100, 32, 120, 32, 62, 61, 32, 108, 101, 110, 10, 32, 32, 32,
32, 32, 32, 32, 32, 116, 104, 101, 110, 32, 119, 114, 97, 112, 32,
120, 115, 32, 36, 32, 40, 112, 117, 114, 101, 32, 36, 32, 102, 115,
116, 32, 120, 44, 32, 115, 110, 100, 32, 120, 41, 32, 58, 58, 32,
97, 99, 99, 10, 32, 32, 32, 32, 32, 32, 32, 32, 101, 108, 115,
101, 32, 105, 102, 32, 115, 110, 100, 32, 120, 32, 43, 32, 115, 110,
100, 32, 121, 32, 62, 61, 32, 108, 101, 110, 10, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 116, 104, 101, 110, 32, 119, 114, 97, 112,
32, 120, 115, 32, 36, 32, 40, 112, 117, 114, 101, 32, 36, 32, 102,
115, 116, 32, 120, 44, 32, 115, 110, 100, 32, 120, 41, 32, 58, 58,
32, 97, 99, 99, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
101, 108, 115, 101, 32, 119, 114, 97, 112, 32, 120, 115, 32, 36, 32,
40, 102, 115, 116, 32, 120, 32, 58, 58, 32, 102, 115, 116, 32, 121,
44, 32, 115, 110, 100, 32, 120, 32, 43, 32, 115, 110, 100, 32, 121,
41, 32, 58, 58, 32, 121, 115, 10, 10, 10, 124, 124, 124, 32, 70,
111, 114, 109, 97, 116, 32, 97, 110, 100, 32, 99, 111, 110, 99, 97,
116, 101, 110, 97, 116, 101, 32, 105, 116, 101, 109, 115, 32, 105, 110,
32, 97, 32, 108, 105, 110, 101, 46, 10, 102, 111, 114, 109, 97, 116,
76, 105, 110, 101, 115, 32, 58, 32, 78, 97, 116, 32, 45, 62, 32,
76, 105, 115, 116, 32, 40, 76, 105, 115, 116, 32, 83, 116, 114, 105,
110, 103, 41, 32, 45, 62, 32, 76, 105, 115, 116, 32, 83, 116, 114,
105, 110, 103, 10, 102, 111, 114, 109, 97, 116, 76, 105, 110, 101, 115,
32, 115, 112, 99, 115, 32, 61, 10, 32, 32, 109, 97, 112, 32, 40,
105, 110, 100, 101, 110, 116, 32, 115, 112, 99, 115, 32, 46, 32, 112,
97, 99, 107, 32, 46, 32, 105, 110, 116, 101, 114, 99, 97, 108, 97,
116, 101, 32, 91, 39, 32, 39, 44, 32, 39, 124, 39, 44, 32, 39,
32, 39, 93, 32, 46, 32, 109, 97, 112, 32, 117, 110, 112, 97, 99,
107, 41, 10, 10, 124, 124, 124, 32, 68, 105, 115, 112, 108, 97, 121,
32, 116, 104, 101, 32, 105, 110, 102, 111, 114, 109, 97, 116, 105, 111,
110, 32, 112, 114, 101, 115, 101, 110, 116, 101, 100, 32, 97, 116, 32,
116, 104, 101, 32, 116, 111, 112, 32, 111, 102, 32, 116, 104, 105, 115,
32, 102, 105, 108, 101, 46, 10, 100, 105, 115, 112, 108, 97, 121, 73,
110, 102, 111, 32, 58, 32, 73, 79, 32, 40, 41, 10, 100, 105, 115,
112, 108, 97, 121, 73, 110, 102, 111, 32, 61, 10, 32, 32, 100, 111,
32, 112, 117, 116, 83, 116, 114, 76, 110, 32, 34, 34, 10, 32, 32,
32, 32, 32, 112, 117, 116, 83, 116, 114, 76, 110, 32, 40, 105, 110,
100, 101, 110, 116, 32, 51, 48, 32, 110, 97, 109, 101, 41, 10, 32,
32, 32, 32, 32, 112, 117, 116, 83, 116, 114, 76, 110, 32, 34, 34,
10, 32, 32, 32, 32, 32, 116, 114, 97, 118, 101, 114, 115, 101, 95,
32, 112, 117, 116, 83, 116, 114, 76, 110, 10, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 102, 111, 114,
109, 97, 116, 76, 105, 110, 101, 115, 32, 56, 32, 46, 32, 119, 114,
97, 112, 76, 105, 110, 101, 115, 32, 53, 54, 41, 32, 105, 110, 116,
101, 114, 101, 115, 116, 115, 41, 10, 32, 32, 32, 32, 32, 112, 117,
116, 83, 116, 114, 76, 110, 32, 34, 34, 10, 32, 32, 32, 32, 32,
116, 114, 97, 118, 101, 114, 115, 101, 95, 32, 112, 117, 116, 83, 116,
114, 76, 110, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 40, 40, 102, 111, 114, 109, 97, 116, 76, 105, 110,
101, 115, 32, 57, 32, 46, 32, 119, 114, 97, 112, 76, 105, 110, 101,
115, 32, 53, 52, 32, 46, 32, 109, 97, 112, 32, 115, 104, 111, 119,
41, 32, 108, 105, 110, 107, 115, 41, 10, 32, 32, 32, 32, 32, 112,
117, 116, 83, 116, 114, 76, 110, 32, 34, 34, 10, 32, 32, 32, 32,
32, 116, 114, 97, 118, 101, 114, 115, 101, 95, 32, 40, 112, 117, 116,
83, 116, 114, 76, 110, 32, 46, 32, 105, 110, 100, 101, 110, 116, 32,
50, 48, 32, 46, 32, 115, 104, 111, 119, 41, 10, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 80, 114, 101,
108, 117, 100, 101, 46, 40, 58, 58, 41, 32, 109, 97, 105, 110, 79,
99, 99, 117, 112, 97, 116, 105, 111, 110, 32, 111, 116, 104, 101, 114,
79, 99, 99, 117, 112, 97, 116, 105, 111, 110, 115, 41, 10, 32, 32,
32, 32, 32, 112, 117, 116, 83, 116, 114, 76, 110, 32, 34, 34, 10,
32, 32, 32, 32, 32, 112, 117, 116, 83, 116, 114, 32, 40, 105, 110,
100, 101, 110, 116, 32, 54, 32, 40, 115, 104, 111, 119, 32, 99, 111,
112, 121, 114, 105, 103, 104, 116, 41, 41, 10, 32, 32, 32, 32, 32,
112, 117, 116, 83, 116, 114, 32, 34, 59, 32, 83, 80, 68, 88, 45,
76, 105, 99, 101, 110, 115, 101, 45, 73, 100, 101, 110, 116, 105, 102,
105, 101, 114, 58, 32, 34, 10, 32, 32, 32, 32, 32, 112, 117, 116,
83, 116, 114, 76, 110, 32, 115, 112, 100, 120, 76, 105, 99, 101, 110,
115, 101, 73, 100, 101, 110, 116, 105, 102, 105, 101, 114, 10, 32, 32,
32, 32, 32, 112, 117, 116, 83, 116, 114, 76, 110, 32, 34, 34, 10,
10, 45, 45, 32, 70, 111, 114, 119, 97, 114, 100, 32, 100, 101, 99,
108, 97, 114, 97, 116, 105, 111, 110, 115, 44, 32, 102, 111, 114, 32,
102, 117, 110, 99, 116, 105, 111, 110, 115, 32, 119, 104, 105, 99, 104,
32, 97, 114, 101, 32, 117, 115, 101, 100, 32, 98, 101, 102, 111, 114,
101, 32, 116, 104, 101, 121, 32, 97, 114, 101, 10, 45, 45, 32, 100,
101, 102, 105, 110, 101, 100, 46, 10, 10, 124, 124, 124, 32, 84, 104,
105, 115, 32, 112, 114, 111, 103, 114, 97, 109, 39, 115, 32, 111, 119,
110, 32, 115, 111, 117, 114, 99, 101, 32, 99, 111, 100, 101, 32, 105,
110, 32, 101, 110, 99, 111, 100, 101, 100, 32, 102, 111, 114, 109, 46,
10, 111, 119, 110, 83, 111, 117, 114, 99, 101, 32, 58, 32, 40, 76,
105, 115, 116, 32, 73, 110, 116, 44, 32, 76, 105, 115, 116, 32, 73,
110, 116, 41, 10, 10, 124, 124, 124, 32, 69, 110, 99, 111, 100, 101,
100, 32, 109, 97, 103, 105, 99, 32, 110, 117, 109, 98, 101, 114, 115,
46, 10, 109, 97, 103, 105, 99, 32, 58, 32, 76, 105, 115, 116, 32,
73, 110, 116, 10, 10, 45, 45, 32, 70, 117, 110, 99, 116, 105, 111,
110, 115, 32, 119, 104, 105, 99, 104, 32, 112, 101, 114, 102, 111, 114,
109, 32, 113, 117, 105, 110, 101, 32, 101, 110, 99, 111, 100, 105, 110,
103, 32, 97, 110, 100, 32, 100, 101, 99, 111, 100, 105, 110, 103, 46,
10, 10, 124, 124, 124, 32, 67, 111, 110, 118, 101, 114, 116, 32, 97,
32, 108, 105, 115, 116, 32, 111, 102, 32, 105, 110, 116, 101, 103, 101,
114, 115, 32, 105, 110, 116, 111, 32, 97, 32, 115, 116, 114, 105, 110,
103, 105, 102, 105, 101, 100, 32, 102, 111, 114, 109, 32, 119, 104, 105,
99, 104, 32, 99, 97, 110, 32, 98, 101, 32, 112, 97, 115, 115, 101,
100, 10, 124, 124, 124, 32, 98, 97, 99, 107, 32, 105, 110, 116, 111,
32, 116, 104, 101, 32, 73, 100, 114, 105, 115, 32, 99, 111, 109, 112,
105, 108, 101, 114, 46, 10, 101, 110, 99, 111, 100, 101, 32, 58, 32,
76, 105, 115, 116, 32, 73, 110, 116, 32, 45, 62, 32, 83, 116, 114,
105, 110, 103, 10, 101, 110, 99, 111, 100, 101, 32, 61, 32, 102, 111,
108, 100, 114, 32, 40, 43, 43, 41, 32, 34, 92, 110, 34, 32, 46,
32, 105, 110, 116, 101, 114, 115, 112, 101, 114, 115, 101, 32, 34, 44,
92, 110, 34, 32, 46, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32,
109, 97, 112, 32, 99, 111, 110, 99, 97, 116, 76, 105, 110, 101, 32,
46, 32, 115, 112, 108, 105, 116, 73, 110, 116, 111, 76, 105, 110, 101,
115, 10, 32, 32, 119, 104, 101, 114, 101, 10, 32, 32, 32, 32, 115,
112, 108, 105, 116, 73, 110, 116, 111, 76, 105, 110, 101, 115, 32, 58,
32, 76, 105, 115, 116, 32, 97, 32, 45, 62, 32, 76, 105, 115, 116,
32, 40, 76, 105, 115, 116, 32, 97, 41, 10, 32, 32, 32, 32, 115,
112, 108, 105, 116, 73, 110, 116, 111, 76, 105, 110, 101, 115, 32, 91,
93, 32, 61, 32, 91, 93, 10, 32, 32, 32, 32, 115, 112, 108, 105,
116, 73, 110, 116, 111, 76, 105, 110, 101, 115, 32, 120, 115, 32, 61,
32, 108, 101, 116, 32, 40, 115, 116, 97, 114, 116, 44, 32, 114, 101,
115, 116, 41, 32, 61, 32, 115, 112, 108, 105, 116, 65, 116, 32, 49,
53, 32, 120, 115, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 105,
110, 32, 115, 116, 97, 114, 116, 32, 58, 58, 32, 115, 112, 108, 105,
116, 73, 110, 116, 111, 76, 105, 110, 101, 115, 32, 114, 101, 115, 116,
10, 10, 32, 32, 32, 32, 99, 111, 110, 99, 97, 116, 76, 105, 110,
101, 32, 58, 32, 76, 105, 115, 116, 32, 73, 110, 116, 32, 45, 62,
32, 83, 116, 114, 105, 110, 103, 10, 32, 32, 32, 32, 99, 111, 110,
99, 97, 116, 76, 105, 110, 101, 32, 61, 32, 40, 34, 32, 32, 34,
32, 43, 43, 41, 32, 46, 32, 112, 97, 99, 107, 32, 46, 32, 105,
110, 116, 101, 114, 99, 97, 108, 97, 116, 101, 32, 91, 39, 44, 39,
44, 32, 39, 32, 39, 93, 32, 46, 10, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 109, 97, 112, 32,
40, 117, 110, 112, 97, 99, 107, 32, 46, 32, 99, 97, 115, 116, 41,
10, 32, 10, 124, 124, 124, 32, 84, 117, 114, 110, 32, 97, 32, 108,
105, 115, 116, 32, 111, 102, 32, 105, 110, 116, 101, 103, 101, 114, 115,
32, 105, 110, 116, 111, 32, 97, 32, 115, 116, 114, 105, 110, 103, 32,
119, 104, 111, 115, 101, 32, 99, 104, 97, 114, 97, 99, 116, 101, 114,
115, 32, 104, 97, 118, 101, 10, 124, 124, 124, 32, 116, 104, 101, 32,
65, 83, 67, 73, 73, 47, 85, 110, 105, 99, 111, 100, 101, 32, 118,
97, 108, 117, 101, 115, 32, 111, 102, 32, 116, 104, 101, 32, 99, 111,
114, 114, 101, 115, 112, 111, 110, 100, 105, 110, 103, 32, 105, 110, 116,
101, 103, 101, 114, 32, 105, 110, 32, 116, 104, 101, 10, 124, 124, 124,
32, 105, 110, 112, 117, 116, 32, 108, 105, 115, 116, 46, 10, 114, 101,
110, 100, 101, 114, 32, 58, 32, 76, 105, 115, 116, 32, 73, 110, 116,
32, 45, 62, 32, 83, 116, 114, 105, 110, 103, 10, 114, 101, 110, 100,
101, 114, 32, 61, 32, 112, 97, 99, 107, 32, 46, 32, 109, 97, 112,
32, 99, 97, 115, 116, 10, 10, 124, 124, 124, 32, 82, 101, 110, 100,
101, 114, 32, 116, 104, 101, 32, 109, 97, 103, 105, 99, 32, 110, 117,
109, 98, 101, 114, 115, 46, 10, 114, 101, 110, 100, 101, 114, 101, 100,
77, 97, 103, 105, 99, 32, 58, 32, 83, 116, 114, 105, 110, 103, 10,
114, 101, 110, 100, 101, 114, 101, 100, 77, 97, 103, 105, 99, 32, 61,
32, 114, 101, 110, 100, 101, 114, 32, 109, 97, 103, 105, 99, 10, 10,
124, 124, 124, 32, 65, 116, 116, 101, 109, 112, 116, 32, 116, 111, 32,
115, 112, 108, 105, 116, 32, 97, 110, 32, 97, 114, 98, 105, 116, 114,
97, 114, 121, 32, 112, 114, 111, 103, 114, 97, 109, 39, 115, 32, 105,
110, 112, 117, 116, 32, 97, 114, 111, 117, 110, 100, 32, 97, 32, 102,
105, 120, 101, 100, 32, 112, 111, 105, 110, 116, 46, 10, 115, 112, 108,
105, 116, 79, 110, 70, 105, 120, 101, 100, 80, 111, 105, 110, 116, 32,
58, 32, 83, 116, 114, 105, 110, 103, 32, 45, 62, 32, 69, 105, 116,
104, 101, 114, 32, 83, 116, 114, 105, 110, 103, 32, 40, 83, 116, 114,
105, 110, 103, 44, 32, 83, 116, 114, 105, 110, 103, 41, 10, 115, 112,
108, 105, 116, 79, 110, 70, 105, 120, 101, 100, 80, 111, 105, 110, 116,
32, 115, 116, 114, 32, 61, 10, 32, 32, 108, 101, 116, 32, 108, 105,
110, 101, 115, 32, 61, 32, 40, 110, 101, 119, 108, 105, 110, 101, 115,
32, 46, 32, 116, 111, 76, 105, 115, 116, 32, 46, 32, 115, 112, 108,
105, 116, 32, 40, 61, 61, 32, 39, 92, 110, 39, 41, 41, 32, 115,
116, 114, 10, 32, 32, 105, 110, 32, 99, 97, 115, 101, 32, 40, 116,
111, 76, 105, 115, 116, 32, 46, 32, 115, 112, 108, 105, 116, 32, 40,
61, 61, 32, 114, 101, 110, 100, 101, 114, 101, 100, 77, 97, 103, 105,
99, 41, 41, 32, 108, 105, 110, 101, 115, 32, 111, 102, 10, 32, 32,
32, 32, 115, 116, 97, 114, 116, 32, 58, 58, 32, 101, 110, 100, 32,
58, 58, 32, 78, 105, 108, 32, 61, 62, 32, 82, 105, 103, 104, 116,
32, 40, 99, 111, 110, 99, 97, 116, 32, 115, 116, 97, 114, 116, 44,
32, 99, 111, 110, 99, 97, 116, 32, 101, 110, 100, 41, 10, 32, 32,
32, 32, 95, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 61, 62, 32, 76, 101, 102, 116, 32,
34, 83, 101, 99, 114, 101, 116, 32, 109, 97, 103, 105, 99, 32, 110,
111, 116, 32, 102, 111, 117, 110, 100, 34, 10, 32, 32, 119, 104, 101,
114, 101, 10, 32, 32, 32, 32, 110, 101, 119, 108, 105, 110, 101, 115,
32, 58, 32, 76, 105, 115, 116, 32, 83, 116, 114, 105, 110, 103, 32,
45, 62, 32, 76, 105, 115, 116, 32, 83, 116, 114, 105, 110, 103, 10,
32, 32, 32, 32, 110, 101, 119, 108, 105, 110, 101, 115, 32, 91, 93,
32, 61, 32, 91, 93, 10, 32, 32, 32, 32, 110, 101, 119, 108, 105,
110, 101, 115, 32, 40, 120, 32, 58, 58, 32, 78, 105, 108, 41, 32,
61, 32, 112, 117, 114, 101, 32, 120, 10, 32, 32, 32, 32, 110, 101,
119, 108, 105, 110, 101, 115, 32, 40, 120, 32, 58, 58, 32, 120, 115,
41, 32, 61, 32, 40, 120, 32, 43, 43, 32, 34, 92, 110, 34, 41,
32, 58, 58, 32, 110, 101, 119, 108, 105, 110, 101, 115, 32, 120, 115,
10, 10, 124, 124, 124, 32, 76, 111, 97, 100, 32, 97, 32, 102, 105,
108, 101, 32, 97, 110, 100, 32, 97, 116, 116, 101, 109, 112, 116, 32,
116, 111, 32, 115, 112, 108, 105, 116, 32, 105, 116, 115, 32, 99, 111,
110, 116, 101, 110, 116, 115, 32, 97, 114, 111, 117, 110, 100, 32, 116,
104, 101, 10, 124, 124, 124, 32, 113, 117, 105, 110, 101, 39, 115, 32,
102, 105, 120, 101, 100, 32, 112, 111, 105, 110, 116, 46, 10, 108, 111,
97, 100, 70, 105, 108, 101, 32, 58, 32, 83, 116, 114, 105, 110, 103,
32, 45, 62, 32, 73, 79, 32, 40, 83, 116, 114, 105, 110, 103, 44,
32, 83, 116, 114, 105, 110, 103, 41, 10, 108, 111, 97, 100, 70, 105,
108, 101, 32, 102, 105, 108, 101, 32, 61, 10, 32, 32, 100, 111, 32,
114, 101, 115, 32, 60, 45, 32, 114, 101, 97, 100, 70, 105, 108, 101,
32, 102, 105, 108, 101, 10, 10, 32, 32, 32, 32, 32, 99, 111, 110,
116, 101, 110, 116, 32, 60, 45, 32, 99, 97, 115, 101, 32, 114, 101,
115, 32, 111, 102, 10, 32, 32, 32, 32, 32, 32, 32, 82, 105, 103,
104, 116, 32, 118, 32, 61, 62, 32, 112, 117, 114, 101, 32, 118, 10,
32, 32, 32, 32, 32, 32, 32, 76, 101, 102, 116, 32, 101, 114, 114,
32, 61, 62, 32, 101, 114, 114, 109, 115, 103, 32, 40, 34, 67, 111,
117, 108, 100, 32, 110, 111, 116, 32, 114, 101, 97, 100, 32, 34, 32,
43, 43, 32, 102, 105, 108, 101, 41, 10, 10, 32, 32, 32, 32, 32,
99, 97, 115, 101, 32, 115, 112, 108, 105, 116, 79, 110, 70, 105, 120,
101, 100, 80, 111, 105, 110, 116, 32, 99, 111, 110, 116, 101, 110, 116,
32, 111, 102, 10, 32, 32, 32, 32, 32, 32, 32, 82, 105, 103, 104,
116, 32, 118, 32, 61, 62, 32, 112, 117, 114, 101, 32, 118, 10, 32,
32, 32, 32, 32, 32, 32, 76, 101, 102, 116, 32, 101, 114, 114, 32,
61, 62, 32, 101, 114, 114, 109, 115, 103, 32, 101, 114, 114, 10, 10,
45, 45, 32, 80, 117, 116, 116, 105, 110, 103, 32, 101, 118, 101, 114,
121, 116, 104, 105, 110, 103, 32, 116, 111, 103, 101, 116, 104, 101, 114,
46, 46, 46, 10, 10, 124, 124, 124, 32, 76, 111, 97, 100, 32, 116,
104, 105, 115, 32, 112, 114, 111, 103, 114, 97, 109, 39, 115, 32, 115,
111, 117, 114, 99, 101, 32, 102, 114, 111, 109, 32, 116, 104, 101, 32,
110, 97, 109, 101, 100, 32, 102, 105, 108, 101, 32, 97, 110, 100, 32,
105, 110, 115, 101, 114, 116, 32, 116, 104, 101, 10, 124, 124, 124, 32,
101, 110, 99, 111, 100, 101, 100, 32, 115, 101, 99, 116, 105, 111, 110,
115, 32, 110, 101, 99, 101, 115, 115, 97, 114, 121, 32, 116, 111, 32,
116, 117, 114, 110, 32, 105, 116, 32, 105, 110, 116, 111, 32, 97, 32,
112, 114, 105, 110, 116, 97, 98, 108, 101, 32, 113, 117, 105, 110, 101,
46, 10, 114, 101, 110, 100, 101, 114, 69, 120, 116, 101, 114, 110, 97,
108, 32, 58, 32, 83, 116, 114, 105, 110, 103, 32, 45, 62, 32, 73,
79, 32, 83, 116, 114, 105, 110, 103, 10, 114, 101, 110, 100, 101, 114,
69, 120, 116, 101, 114, 110, 97, 108, 32, 102, 105, 108, 101, 32, 61,
10, 32, 32, 100, 111, 32, 40, 116, 111, 112, 44, 32, 98, 111, 116,
116, 111, 109, 41, 32, 60, 45, 32, 108, 111, 97, 100, 70, 105, 108,
101, 32, 102, 105, 108, 101, 10, 32, 32, 32, 32, 32, 108, 101, 116,
32, 101, 110, 99, 116, 111, 112, 32, 61, 32, 40, 101, 110, 99, 111,
100, 101, 32, 46, 32, 109, 97, 112, 32, 111, 114, 100, 32, 46, 32,
117, 110, 112, 97, 99, 107, 41, 32, 116, 111, 112, 10, 32, 32, 32,
32, 32, 108, 101, 116, 32, 101, 110, 99, 98, 111, 116, 32, 61, 32,
40, 101, 110, 99, 111, 100, 101, 32, 46, 32, 109, 97, 112, 32, 111,
114, 100, 32, 46, 32, 117, 110, 112, 97, 99, 107, 41, 32, 98, 111,
116, 116, 111, 109, 10, 32, 32, 32, 32, 32, 112, 117, 114, 101, 32,
40, 116, 111, 112, 32, 43, 43, 32, 101, 110, 99, 116, 111, 112, 32,
43, 43, 32, 114, 101, 110, 100, 101, 114, 101, 100, 77, 97, 103, 105,
99, 32, 43, 43, 32, 101, 110, 99, 98, 111, 116, 32, 43, 43, 32,
98, 111, 116, 116, 111, 109, 41, 10, 10, 124, 124, 124, 32, 82, 101,
110, 100, 101, 114, 32, 116, 104, 105, 115, 32, 112, 114, 111, 103, 114,
97, 109, 39, 115, 32, 101, 109, 98, 101, 100, 100, 101, 100, 32, 101,
110, 99, 111, 100, 101, 100, 32, 115, 111, 117, 114, 99, 101, 32, 105,
110, 116, 111, 32, 97, 32, 112, 114, 105, 110, 116, 97, 98, 108, 101,
10, 124, 124, 124, 32, 113, 117, 105, 110, 101, 46, 10, 114, 101, 110,
100, 101, 114, 73, 110, 116, 101, 114, 110, 97, 108, 32, 58, 32, 83,
116, 114, 105, 110, 103, 10, 114, 101, 110, 100, 101, 114, 73, 110, 116,
101, 114, 110, 97, 108, 32, 61, 10, 32, 32, 108, 101, 116, 32, 116,
111, 112, 32, 32, 32, 32, 61, 32, 40, 114, 101, 110, 100, 101, 114,
32, 46, 32, 102, 115, 116, 41, 32, 111, 119, 110, 83, 111, 117, 114,
99, 101, 10, 32, 32, 32, 32, 32, 32, 98, 111, 116, 116, 111, 109,
32, 61, 32, 40, 114, 101, 110, 100, 101, 114, 32, 46, 32, 115, 110,
100, 41, 32, 111, 119, 110, 83, 111, 117, 114, 99, 101, 10, 32, 32,
32, 32, 32, 32, 101, 110, 99, 116, 111, 112, 32, 61, 32, 40, 101,
110, 99, 111, 100, 101, 32, 46, 32, 102, 115, 116, 41, 32, 111, 119,
110, 83, 111, 117, 114, 99, 101, 10, 32, 32, 32, 32, 32, 32, 101,
110, 99, 98, 111, 116, 32, 61, 32, 40, 101, 110, 99, 111, 100, 101,
32, 46, 32, 115, 110, 100, 41, 32, 111, 119, 110, 83, 111, 117, 114,
99, 101, 10, 32, 32, 105, 110, 32, 116, 111, 112, 32, 43, 43, 32,
101, 110, 99, 116, 111, 112, 32, 43, 43, 32, 114, 101, 110, 100, 101,
114, 101, 100, 77, 97, 103, 105, 99, 32, 43, 43, 32, 101, 110, 99,
98, 111, 116, 32, 43, 43, 32, 98, 111, 116, 116, 111, 109, 10, 10,
45, 45, 32, 65, 110, 100, 32, 116, 104, 101, 32, 109, 97, 105, 110,
32, 112, 114, 111, 103, 114, 97, 109, 46, 10, 10, 124, 124, 124, 32,
84, 104, 101, 32, 109, 97, 105, 110, 32, 101, 110, 116, 114, 121, 32,
112, 111, 105, 110, 116, 32, 105, 110, 116, 111, 32, 116, 104, 101, 32,
112, 114, 111, 103, 114, 97, 109, 46, 10, 109, 97, 105, 110, 32, 58,
32, 73, 79, 32, 40, 41, 10, 109, 97, 105, 110, 32, 61, 10, 32,
32, 100, 111, 32, 97, 114, 103, 115, 32, 60, 45, 32, 103, 101, 116,
65, 114, 103, 115, 10, 32, 32, 32, 32, 32, 99, 97, 115, 101, 32,
97, 114, 103, 115, 32, 111, 102, 10, 32, 32, 32, 32, 32, 32, 32,
97, 114, 103, 118, 48, 32, 58, 58, 32, 34, 115, 111, 117, 114, 99,
101, 34, 32, 58, 58, 32, 78, 105, 108, 32, 61, 62, 32, 112, 117,
116, 83, 116, 114, 32, 114, 101, 110, 100, 101, 114, 73, 110, 116, 101,
114, 110, 97, 108, 10, 32, 32, 32, 32, 32, 32, 32, 97, 114, 103,
118, 48, 32, 58, 58, 32, 34, 109, 97, 107, 101, 45, 113, 117, 105,
110, 101, 34, 32, 58, 58, 32, 102, 105, 108, 101, 110, 97, 109, 101,
32, 58, 58, 32, 78, 105, 108, 32, 61, 62, 10, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 110, 100, 101, 114,
69, 120, 116, 101, 114, 110, 97, 108, 32, 102, 105, 108, 101, 110, 97,
109, 101, 32, 62, 62, 61, 32, 112, 117, 116, 83, 116, 114, 10, 32,
32, 32, 32, 32, 32, 32, 95, 32, 61, 62, 32, 100, 105, 115, 112,
108, 97, 121, 73, 110, 102, 111, 10, 10, 10, 10, 111, 119, 110, 83,
111, 117, 114, 99, 101, 32, 61, 32, 40, 91, 10
],[ -- this is a MAGIC COMMENT
93, 41, 10, 10, 109, 97, 103, 105, 99, 32, 61, 32, 91, 10, 32,
32, 57, 51, 44, 32, 52, 52, 44, 32, 57, 49, 44, 32, 51, 50,
44, 32, 52, 53, 44, 32, 52, 53, 44, 32, 51, 50, 44, 32, 49,
49, 54, 44, 32, 49, 48, 52, 44, 32, 49, 48, 53, 44, 32, 49,
49, 53, 44, 32, 51, 50, 44, 32, 49, 48, 53, 44, 32, 49, 49,
53, 44, 32, 51, 50, 44, 32, 57, 55, 44, 10, 32, 32, 51, 50,
44, 32, 55, 55, 44, 32, 54, 53, 44, 32, 55, 49, 44, 32, 55,
51, 44, 32, 54, 55, 44, 32, 51, 50, 44, 32, 54, 55, 44, 32,
55, 57, 44, 32, 55, 55, 44, 32, 55, 55, 44, 32, 54, 57, 44,
32, 55, 56, 44, 32, 56, 52, 44, 32, 49, 48, 10, 93, 10, 10,
10
])
magic = [
93, 44, 91, 32, 45, 45, 32, 116, 104, 105, 115, 32, 105, 115, 32, 97,
32, 77, 65, 71, 73, 67, 32, 67, 79, 77, 77, 69, 78, 84, 10
]