packages feed

Elm 0.10.1 → 0.11

raw patch · 60 files changed

+8593/−7986 lines, 60 filesdep +Elmdep +HUnitdep +QuickCheckdep −HTFdep ~basedep ~blaze-markup

Dependencies added: Elm, HUnit, QuickCheck, filemanip, test-framework, test-framework-hunit, test-framework-quickcheck2

Dependencies removed: HTF

Dependency ranges changed: base, blaze-markup

Files

Elm.cabal view
@@ -1,5 +1,5 @@ Name:                Elm-Version:             0.10.1+Version:             0.11 Synopsis:            The Elm language module. Description:         Elm aims to make client-side web-development more pleasant.                      It is a statically/strongly typed, functional reactive@@ -47,18 +47,21 @@                        SourceSyntax.PrettyPrint,                        SourceSyntax.Type,                        Generate.JavaScript,+                       Generate.JavaScript.Helpers,+                       Generate.JavaScript.Ports,                        Generate.Noscript,                        Generate.Markdown,                        Generate.Html,                        Generate.Cases,                        Transform.Canonicalize,                        Transform.Check,+                       Transform.Expression,+                       Transform.Declaration,+                       Transform.Definition,                        Transform.SafeNames,                        Transform.SortDefinitions,                        Transform.Substitute,-                       Transform.Optimize,                        Metadata.Prelude,-                       InterfaceSerialization,                        Parse.Binop,                        Parse.Declaration,                        Parse.Expression,@@ -85,6 +88,7 @@                        Build.Dependencies,                        Build.File,                        Build.Flags,+                       Build.Interface,                        Build.Print,                        Build.Source,                        Build.Utils,@@ -125,18 +129,21 @@                        SourceSyntax.PrettyPrint,                        SourceSyntax.Type,                        Generate.JavaScript,+                       Generate.JavaScript.Helpers,+                       Generate.JavaScript.Ports,                        Generate.Noscript,                        Generate.Markdown,                        Generate.Html,                        Generate.Cases,                        Transform.Canonicalize,                        Transform.Check,+                       Transform.Expression,+                       Transform.Declaration,+                       Transform.Definition,                        Transform.SafeNames,                        Transform.SortDefinitions,                        Transform.Substitute,-                       Transform.Optimize,                        Metadata.Prelude,-                       InterfaceSerialization,                        Parse.Binop,                        Parse.Declaration,                        Parse.Expression,@@ -163,6 +170,7 @@                        Build.Dependencies,                        Build.File,                        Build.Flags,+                       Build.Interface,                        Build.Print,                        Build.Source,                        Build.Utils,@@ -224,10 +232,46 @@                        pandoc >= 1.10,                        parsec >= 3.1.1,                        pretty,-                       text+                       text,+                       union-find  Test-Suite test-elm   Type:            exitcode-stdio-1.0-  Hs-Source-Dirs:  tests+  Hs-Source-Dirs:  tests, compiler   Main-is:         Main.hs-  build-depends:   base, directory, HTF+  other-modules:   Tests.Compiler+                   Tests.Property+                   Tests.Property.Arbitrary+                   SourceSyntax.Helpers+                   SourceSyntax.Literal+                   SourceSyntax.PrettyPrint+  build-depends:   base,+                   directory,+                   Elm,+                   test-framework,+                   test-framework-hunit,+                   test-framework-quickcheck2,+                   HUnit,+                   pretty,+                   QuickCheck >= 2 && < 3,+                   filemanip,+                   aeson,+                   base >=4.2 && <5,+                   binary >= 0.6.4.0,+                   blaze-html == 0.5.* || == 0.6.*,+                   blaze-markup == 0.5.1.*,+                   bytestring,+                   cmdargs,+                   containers >= 0.3,+                   directory,+                   filepath,+                   indents,+                   language-ecmascript >=0.15 && < 1.0,+                   mtl >= 2,+                   pandoc >= 1.10,+                   parsec >= 3.1.1,+                   pretty,+                   text,+                   transformers >= 0.2,+                   union-find,+                   unordered-containers
compiler/Build/Dependencies.hs view
@@ -1,42 +1,32 @@-module Build.Dependencies (getSortedDependencies) where+{-# OPTIONS_GHC -W #-}+module Build.Dependencies (getSortedDependencies, readDeps) where -import Data.Data import Control.Applicative import Control.Monad.Error import qualified Control.Monad.State as State import qualified Data.Aeson as Json import qualified Data.ByteString.Lazy.Char8 as BSC-import qualified Data.Char as Char import qualified Data.Graph as Graph import qualified Data.List as List import qualified Data.Map as Map import qualified Data.Maybe as Maybe import qualified Data.Set as Set import System.Directory-import System.Exit import System.FilePath as FP-import System.IO-import Text.PrettyPrint (Doc) +import Build.Print (failure)+ import qualified SourceSyntax.Module as Module-import qualified SourceSyntax.Type as Type import qualified Parse.Parse as Parse-import qualified Metadata.Prelude as Prelude-import qualified Transform.Check as Check-import qualified Transform.SortDefinitions as SD-import qualified Type.Inference as TI-import qualified Type.Constrain.Declaration as TcDecl-import qualified Transform.Canonicalize as Canonical import qualified Elm.Internal.Paths as Path import qualified Elm.Internal.Name as N-import qualified Elm.Internal.Version as V import qualified Elm.Internal.Dependencies as Deps  getSortedDependencies :: [FilePath] -> Module.Interfaces -> FilePath -> IO [String] getSortedDependencies srcDirs builtIns root =     do extras <- extraDependencies        let allSrcDirs = srcDirs ++ Maybe.fromMaybe [] extras-       result <- runErrorT $ readDeps allSrcDirs builtIns root+       result <- runErrorT $ readAllDeps allSrcDirs builtIns root        case result of          Right deps -> sortDeps deps          Left err -> failure $ err ++ if Maybe.isJust extras then "" else msg@@ -44,8 +34,6 @@                          Path.dependencyFile ++                          " file if you\nare trying to use a 3rd party library." -failure msg = hPutStrLn stderr msg >> exitFailure- extraDependencies :: IO (Maybe [FilePath]) extraDependencies =     do exists <- doesFileExist Path.dependencyFile@@ -86,46 +74,52 @@     mistakes = filter (\scc -> length scc > 1) sccs     msg = "A cyclical module dependency or was detected in:\n" -readDeps :: [FilePath] -> Module.Interfaces -> FilePath -> ErrorT String IO [Deps]-readDeps srcDirs builtIns root = do-  let ifaces = (Set.fromList . Map.keys) builtIns-  State.evalStateT (go ifaces root) Set.empty+readAllDeps :: [FilePath] -> Module.Interfaces -> FilePath -> ErrorT String IO [Deps]+readAllDeps srcDirs builtIns root =+  do let ifaces = (Set.fromList . Map.keys) builtIns+     State.evalStateT (go ifaces root) Set.empty   where     go :: Set.Set String -> FilePath -> State.StateT (Set.Set String) (ErrorT String IO) [Deps]     go builtIns root = do-      (root', txt) <- lift $ getFile srcDirs root-      case Parse.dependencies txt of-        Left err -> throwError $ msg ++ show err-            where msg = "Error resolving dependencies in " ++ root' ++ ":\n"--        Right (name,deps) ->-            do seen <- State.get-               let realDeps = Set.difference (Set.fromList deps) builtIns-                   newDeps = Set.difference (Set.filter (not . isNative) realDeps) seen-               State.put (Set.insert name (Set.union newDeps seen))-               rest <- mapM (go builtIns . toFilePath) (Set.toList newDeps)-               return ((makeRelative "." root', name, Set.toList realDeps) : concat rest)+      root'        <- lift $ findSrcFile srcDirs root+      (name, deps) <- lift $ readDeps root'+      seen <- State.get+      let realDeps = Set.difference (Set.fromList deps) builtIns+          newDeps = Set.difference (Set.filter (not . isNative) realDeps) seen+      State.put (Set.insert name (Set.union newDeps seen))+      rest <- mapM (go builtIns . toFilePath) (Set.toList newDeps)+      return ((makeRelative "." root', name, Set.toList realDeps) : concat rest) -getFile :: [FilePath] -> FilePath -> ErrorT String IO (FilePath,String)-getFile [] path =-    throwError $ unlines-    [ "Could not find file: " ++ path-    , "    If it is not in the root directory of your project, use"-    , "    --src-dir to declare additional locations for source files."-    , "    If it is part of a 3rd party library, it needs to be declared"-    , "    as a dependency in the " ++ Path.dependencyFile ++ " file." ]+readDeps :: FilePath -> ErrorT String IO (String, [String])+readDeps path = do+  txt <- lift $ readFile path+  case Parse.dependencies txt of+    Left err -> throwError $ msg ++ show err+      where msg = "Error resolving dependencies in " ++ path ++ ":\n"+    Right o  -> return o -getFile (dir:dirs) path = do-  let path' = dir </> path-  exists <- liftIO $ doesFileExist path'-  case exists of-    True  -> (,) path' `fmap` liftIO (readFile path')-    False -> getFile dirs path+findSrcFile :: [FilePath] -> FilePath -> ErrorT String IO FilePath+findSrcFile dirs path = foldr tryDir notFound dirs+  where+    notFound = throwError $ unlines+        [ "Could not find file: " ++ path+        , "    If it is not in the root directory of your project, use"+        , "    --src-dir to declare additional locations for source files."+        , "    If it is part of a 3rd party library, it needs to be declared"+        , "    as a dependency in the " ++ Path.dependencyFile ++ " file." ]+    tryDir dir next = do+      let path' = dir </> path+      exists <- liftIO $ doesFileExist path'+      if exists+        then return path'+        else next +isNative :: String -> Bool isNative name = List.isPrefixOf "Native." name  toFilePath :: String -> FilePath toFilePath name = map swapDots name ++ ext-    where swapDots '.' = '/'-          swapDots  c  =  c-          ext = if isNative name then ".js" else ".elm"+  where+    swapDots '.' = '/'+    swapDots  c  =  c+    ext = if isNative name then ".js" else ".elm"
compiler/Build/File.hs view
@@ -1,93 +1,158 @@+{-# OPTIONS_GHC -W #-} module Build.File (build) where -import Control.Monad (when)-import qualified Data.Binary as Binary-import qualified Data.List as List-import qualified Data.Map as Map+import Control.Applicative      ((<$>))+import Control.Monad.Error      (runErrorT)+import Control.Monad.RWS.Strict import System.Directory import System.Exit import System.FilePath import System.IO +import qualified Data.Binary            as Binary+import qualified Data.List              as List+import qualified Data.Maybe             as Maybe+import qualified Data.Map               as Map+import qualified Data.ByteString.Lazy   as L++import qualified Build.Dependencies     as Deps+import qualified Build.Flags            as Flag+import qualified Build.Interface        as Interface+import qualified Build.Print            as Print+import qualified Build.Source           as Source+import qualified Build.Utils            as Utils+import qualified Generate.JavaScript    as JS+import qualified Parse.Module           as Parser+import qualified SourceSyntax.Module    as M import qualified Transform.Canonicalize as Canonical -import qualified Data.ByteString.Lazy as L+-- Reader: Runtime flags, always accessible+-- Writer: Remember the last module to be accessed+-- State:  Build up a map of the module interfaces+type BuildT m a = RWST Flag.Flags (Last String) BInterfaces m a+type Build a = BuildT IO a -import qualified Build.Utils as Utils-import qualified Build.Flags as Flag-import qualified Build.Source as Source-import qualified Build.Print as Print-import qualified Generate.JavaScript as JS-import qualified InterfaceSerialization as IS-import qualified Parse.Module as Parser-import qualified SourceSyntax.Module as M+-- Interfaces, remembering if something was recompiled+type BInterfaces = Map.Map String (Bool, M.ModuleInterface) -build :: Flag.Flags -> Int -> M.Interfaces -> String -> [FilePath]-      -> IO (String, M.Interfaces)-build _ _ interfaces moduleName [] =-    return (moduleName, interfaces)-build flags numModules interfaces _ (filePath:rest) =-    do (name,interface) <--           build1 flags (numModules - length rest) numModules interfaces filePath-       let interfaces' = Map.insert name interface interfaces-       build flags numModules interfaces' name rest+evalBuild :: Flag.Flags -> M.Interfaces -> Build ()+          -> IO (Map.Map String M.ModuleInterface, Maybe String)+evalBuild flags interfaces build =+  do (ifaces, moduleNames) <- execRWST build flags (fmap notUpdated interfaces)+     return (fmap snd ifaces, getLast moduleNames)+  where+    notUpdated iface = (False, iface) +-- | Builds a list of files, returning the moduleName of the last one.+--   Returns \"\" if the list is empty+build :: Flag.Flags -> M.Interfaces -> [FilePath] -> IO String+build flags interfaces files =+  do (ifaces, topName) <- evalBuild flags interfaces (buildAll files)+     let removeTopName = Maybe.maybe id Map.delete topName+     mapM_ (checkPorts topName) (Map.toList $ removeTopName ifaces)+     return $ Maybe.fromMaybe "" topName+  where+    checkPorts topName (name,iface)+        | null ports = return ()+        | otherwise  = Print.failure msg+        where+          ports = M.iPorts iface+          msg = concat+            [ "Port Error: ports may only appear in the main module, but\n"+            , "    sub-module ", name, " declares the following port"+            , if length ports == 1 then "" else "s", ": "+            , List.intercalate ", " ports+            , case topName of+                Nothing -> ""+                Just tname -> "\n    All ports must appear in module " ++ tname+            ] -build1 :: Flag.Flags -> Int -> Int -> M.Interfaces -> FilePath-       -> IO (String, M.ModuleInterface)-build1 flags moduleNum numModules interfaces filePath =-    do compiled <- alreadyCompiled flags filePath-       case compiled of-         False -> compile flags number interfaces filePath-         True  -> retrieve flags interfaces filePath-    where-      number = "[" ++ show moduleNum ++ " of " ++ show numModules ++ "]"+buildAll :: [FilePath] -> Build ()+buildAll fs = mapM_ (uncurry build1) (zip [1..] fs)+  where build1 :: Integer -> FilePath -> Build ()+        build1 num fname = do+          shouldCompile <- shouldBeCompiled fname+          if shouldCompile+            then compile number fname+            else retrieve fname +          where number = join ["[", show num, " of ", show total, "]"] -alreadyCompiled :: Flag.Flags -> FilePath -> IO Bool-alreadyCompiled flags filePath = do-  existsi <- doesFileExist (Utils.elmi flags filePath)-  existso <- doesFileExist (Utils.elmo flags filePath)-  if not existsi || not existso-    then return False-    else do tsrc <- getModificationTime filePath-            tint <- getModificationTime (Utils.elmo flags filePath)-            return (tsrc <= tint)+        total = length fs -retrieve :: Flag.Flags -> Map.Map String M.ModuleInterface -> FilePath-         -> IO (String, M.ModuleInterface)-retrieve flags interfaces filePath = do-  bytes <- IS.loadInterface (Utils.elmi flags filePath)-  let binary = IS.interfaceDecode (Utils.elmi flags filePath) =<< bytes-  case IS.validVersion filePath =<< binary of+shouldBeCompiled :: FilePath -> Build Bool+shouldBeCompiled filePath = do+  flags <- ask+  let alreadyCompiled = liftIO $ do+        existsi <- doesFileExist (Utils.elmi flags filePath)+        existso <- doesFileExist (Utils.elmo flags filePath)+        return $ existsi && existso++      outDated = liftIO $ do+        tsrc <- getModificationTime filePath+        tint <- getModificationTime (Utils.elmo flags filePath)+        return (tsrc > tint)++      dependenciesUpdated = do+        eDeps <- liftIO . runErrorT $ Deps.readDeps filePath+        case eDeps of+          -- Should never actually reach here+          Left  err       -> liftIO $ Print.failure err+          Right (_, deps) -> anyM wasCompiled deps+        +  +    in (not <$> alreadyCompiled) `orM` outDated `orM` dependenciesUpdated++wasCompiled :: String -> Build Bool+wasCompiled modul = maybe False fst . Map.lookup modul <$> get+  +-- Short-circuiting monadic (||)+infixr 2 `orM`+orM :: (Monad m) => m Bool -> m Bool -> m Bool+orM m1 m2 = do b1 <- m1+               if b1+                 then return b1+                 else m2++anyM :: (Monad m) => (a -> m Bool) -> [a] -> m Bool+anyM f = foldr (orM . f) (return False)++retrieve :: FilePath -> Build ()+retrieve filePath = do+  flags <- ask+  iface <- liftIO $ Interface.load (Utils.elmi flags filePath)+  case Interface.isValid filePath iface of     Right (name, interface) ->-        do when (Flag.print_types flags) (Print.interfaceTypes interfaces interface)-           return (name, interface)-    Left err ->-        do hPutStrLn stderr err-           exitFailure+      do binterfaces <- get+         let interfaces = snd <$> binterfaces+         liftIO $ when (Flag.print_types flags) (Print.interfaceTypes interfaces interface)+         update name interface False -compile :: Flag.Flags -> String -> M.Interfaces -> FilePath-        -> IO (String, M.ModuleInterface)-compile flags number interfaces filePath =-  do source <- readFile filePath-     let name = getName source-     printStatus name+    Left err -> liftIO $ Print.failure err -     createDirectoryIfMissing True (Flag.cache_dir flags)-     createDirectoryIfMissing True (Flag.build_dir flags)+compile :: String -> FilePath -> Build ()+compile number filePath =+  do flags      <- ask+     binterfaces <- get+     source <- liftIO $ readFile filePath+     let interfaces = snd <$> binterfaces+         name = getName source+     liftIO $ do+       printStatus name+       createDirectoryIfMissing True (Flag.cache_dir flags)+       createDirectoryIfMissing True (Flag.build_dir flags) -     metaModule <--         case Source.build (Flag.no_prelude flags) interfaces source of+     metaModule <- +       liftIO $ case Source.build (Flag.no_prelude flags) interfaces source of            Right modul -> return modul            Left errors -> do Print.errors errors                              exitFailure -     when (Flag.print_types flags) $ Print.metaTypes interfaces metaModule--     let intermediate = (name, Canonical.interface name $ M.metaToInterface metaModule)-     generateCache intermediate metaModule-     return intermediate+     liftIO $ when (Flag.print_types flags) $ Print.metaTypes interfaces metaModule+  +     let newInters = Canonical.interface name $ M.metaToInterface metaModule+     generateCache name newInters metaModule+     update name newInters True    where     getName source = case Parser.getModuleName source of@@ -99,8 +164,15 @@                                   , replicate (max 1 (20 - length name)) ' '                                   , "( " ++ filePath ++ " )" ] -    generateCache intermediate metaModule = do-      createDirectoryIfMissing True . dropFileName $ Utils.elmi flags filePath-      writeFile (Utils.elmo flags filePath) (JS.generate metaModule)-      withBinaryFile (Utils.elmi flags filePath) WriteMode $ \handle ->-          L.hPut handle (Binary.encode intermediate)+    generateCache name interfs metaModule = do+      flags <- ask+      liftIO $ do+        createDirectoryIfMissing True . dropFileName $ Utils.elmi flags filePath+        writeFile (Utils.elmo flags filePath) (JS.generate metaModule)+        withBinaryFile (Utils.elmi flags filePath) WriteMode $ \handle ->+          L.hPut handle (Binary.encode (name, interfs))++update :: String -> M.ModuleInterface -> Bool -> Build ()+update name inter wasUpdated =+  do modify (Map.insert name (wasUpdated, inter))+     tell (Last . Just $ name)
+ compiler/Build/Interface.hs view
@@ -0,0 +1,41 @@+{-# OPTIONS_GHC -W #-}+module Build.Interface (load,isValid) where++import qualified Data.ByteString.Lazy as L+import qualified Data.Binary as Binary++import qualified Build.Print as Print+import qualified Elm.Internal.Version as Version+import System.Directory (doesFileExist)+import SourceSyntax.Module++load :: Binary.Binary a => FilePath -> IO a+load filePath =+  do exists <- doesFileExist filePath+     case exists of+       False -> Print.failure $ "Unable to find file " ++ filePath ++ " for deserialization!"+       True -> do+         bytes <- L.readFile filePath+         case Binary.decodeOrFail bytes of+           Right (_, _, binaryInfo) -> return binaryInfo+           Left (_, offset, err) -> Print.failure $ msg offset err++  where+    msg offset err = concat+        [ "Error reading build artifact: ", filePath, "\n"+        , "    '", err, "' at offset ", show offset, "\n"+        , "    The file was generated by a previous build and may be outdated or corrupt.\n"+        , "    Please remove the file and try again."+        ]++isValid :: FilePath -> (String, ModuleInterface) -> Either String (String, ModuleInterface)+isValid filePath (name, interface) =+    let version = iVersion interface in+    if version == Version.elmVersion+    then Right (name, interface)+    else Left $ concat+             [ "Error reading build artifact: ", filePath, "\n"+             , "    It was generated by version ", show version, " of the compiler,\n"+             , "    but you are using version ", show Version.elmVersion, "\n"+             , "    Please remove the file and try again.\n"+             ]
compiler/Build/Print.hs view
@@ -1,5 +1,8 @@ module Build.Print where +import System.IO   (hPutStrLn, stderr)+import System.Exit (exitFailure)+ import qualified Data.Map as Map import qualified Data.List as List import qualified SourceSyntax.Module as M@@ -7,7 +10,7 @@ import qualified Type.Alias as Alias import qualified Text.PrettyPrint as P -metaTypes :: Map.Map String M.ModuleInterface -> M.MetadataModule () () -> IO ()+metaTypes :: Map.Map String M.ModuleInterface -> M.MetadataModule -> IO () metaTypes interfaces meta =     types interfaces (M.types meta) (M.aliases meta) (M.imports meta) @@ -29,4 +32,7 @@  errors :: [P.Doc] -> IO () errors errs =-    mapM_ print (List.intersperse (P.text " ") errs)+  mapM_ print (List.intersperse (P.text " ") errs)++failure :: String -> IO a+failure msg = hPutStrLn stderr msg >> exitFailure
compiler/Build/Source.hs view
@@ -1,19 +1,15 @@+{-# OPTIONS_GHC -W #-} module Build.Source (build) where -import Data.Data-import Control.Monad.State-import qualified Data.Graph as Graph-import qualified Data.List as List import qualified Data.Map as Map import qualified Data.Set as Set-import System.Directory-import System.Exit import System.FilePath as FP import Text.PrettyPrint (Doc)  import SourceSyntax.Declaration import SourceSyntax.Module import qualified SourceSyntax.Expression as Expr+import qualified SourceSyntax.Pattern as Pattern import qualified SourceSyntax.Type as Type import qualified Parse.Parse as Parse import qualified Metadata.Prelude as Prelude@@ -23,42 +19,40 @@ import qualified Type.Constrain.Declaration as TcDecl import qualified Transform.Canonicalize as Canonical -build :: Bool -> Interfaces -> String -> Either [Doc] (MetadataModule () ())+build :: Bool -> Interfaces -> String -> Either [Doc] MetadataModule build noPrelude interfaces source =-  do let add = if noPrelude then id else Prelude.add+  do let add = Prelude.add noPrelude          infixes = Map.fromList . map (\(assoc,lvl,op) -> (op,(lvl,assoc)))                  . concatMap iFixities $ Map.elems interfaces -     modul@(Module _ _ _ decls') <- add `fmap` Parse.program infixes source--     -- check for structural errors-     Module names exs ims decls <--         case Check.mistakes decls' of-           [] -> return modul-           ms -> Left ms+     Module names exs ims decls <- do+           modul@(Module _ _ _ decls) <- add `fmap` Parse.program infixes source+           case Check.mistakes decls of+             [] -> return modul+             ms -> Left ms       let exports'              | null exs =-                 let get = Set.toList . SD.boundVars in-                 concat [ get pattern | Definition (Expr.Def pattern _) <- decls ] +++                 let get = Set.toList . Pattern.boundVars in+                 concat [ get pattern | Definition (Expr.Definition pattern _ _) <- decls ] ++                  concat [ map fst ctors | Datatype _ _ ctors <- decls ] ++                  [ name | TypeAlias name _ (Type.Record _ _) <- decls ]              | otherwise = exs -     metaModule <- Canonical.metadataModule interfaces $ MetadataModule {-           names = names,-           path = FP.joinPath names,-           exports = exports',-           imports = ims,+     metaModule <- Canonical.metadataModule interfaces $+         MetadataModule+         { names = names+         , path = FP.joinPath names+         , exports = exports'+         , imports = ims            -- reorder AST into strongly connected components-           program = SD.sortDefs . Expr.dummyLet $ TcDecl.toExpr decls,-           types = Map.empty,-           datatypes = [ (name,vars,ctors) | Datatype name vars ctors <- decls ],-           fixities = [ (assoc,level,op) | Fixity assoc level op <- decls ],-           aliases = [ (name,tvs,tipe) | TypeAlias name tvs tipe <- decls ],-           foreignImports = [ (evt,v,name,typ) | ImportEvent evt v name typ <- decls ],-           foreignExports = [ (evt,name,typ) | ExportEvent evt name typ <- decls ]-          }+         , program = SD.sortDefs . Expr.dummyLet $ TcDecl.toExpr decls+         , types = Map.empty+         , datatypes = [ (name,vars,ctors) | Datatype name vars ctors <- decls ]+         , fixities = [ (assoc,level,op) | Fixity assoc level op <- decls ]+         , aliases = [ (name,tvs,tipe) | TypeAlias name tvs tipe <- decls ]+         , ports = [ portName port | Port port <- decls ]+         }       types <- TI.infer interfaces metaModule 
compiler/Build/Utils.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_GHC -W #-} module Build.Utils where  import System.FilePath ((</>), replaceExtension)
compiler/Compiler.hs view
@@ -1,7 +1,7 @@+{-# OPTIONS_GHC -W #-} module Main where  import Control.Monad (foldM)-import qualified Data.Map as Map import qualified Data.Maybe as Maybe import Text.Blaze.Html.Renderer.String (renderHtml) import qualified Data.ByteString.Lazy.Char8 as BS@@ -31,14 +31,13 @@ build :: Flag.Flags -> FilePath -> IO () build flags rootFile =     do let noPrelude = Flag.no_prelude flags-       builtIns <- if noPrelude then return Map.empty else Prelude.interfaces+       builtIns <- Prelude.interfaces noPrelude         files <- if Flag.make flags                 then getSortedDependencies (Flag.src_dir flags) builtIns rootFile                 else return [rootFile] -       (moduleName, interfaces) <--           File.build flags (length files) builtIns "" files+       moduleName <- File.build flags builtIns files         js <- foldM appendToOutput BS.empty files 
compiler/Docs.hs view
@@ -7,7 +7,7 @@ import System.Exit import System.IO -import Control.Applicative ((<$>), (<*>))+import Control.Applicative ((<$>)) import Data.Aeson import Data.Aeson.Encode.Pretty import qualified Data.List as List@@ -17,8 +17,8 @@  import SourceSyntax.Helpers (isSymbol) import SourceSyntax.Type (Type(..))-import SourceSyntax.Declaration (Declaration(..), Assoc(..))-import SourceSyntax.Expression (Def(..))+import qualified SourceSyntax.Expression as E+import qualified SourceSyntax.Declaration as D  import Text.Parsec hiding (newline,spaces) import Parse.Declaration (alias,datatype,infixDecl)@@ -77,10 +77,10 @@   structure <- docComment   return (List.intercalate "." names, exports, structure) -document :: IParser [(String, Declaration t v, String)]+document :: IParser [(String, D.ParseDeclaration, String)] document = onFreshLines (\t ts -> ts ++ [t]) [] docThing -docThing :: IParser (String, Declaration t v, String)+docThing :: IParser (String, D.ParseDeclaration, String) docThing = uncommentable <|> commented <|> uncommented ""     where       uncommentable = do@@ -93,7 +93,7 @@         uncommented comment        uncommented comment = do-        (src,def) <- withSource $ choice [ alias, datatype, Definition <$> typeAnnotation ]+        (src,def) <- withSource $ choice [ alias, datatype, D.Definition <$> typeAnnotation ]         return (comment, def, src)  @@ -121,7 +121,7 @@           where             nonCustomOps = Map.mapWithKey addDefaultInfix $ Map.difference types infixes             addDefaultInfix name pairs-                | all isSymbol name = addInfix (L, 9 :: Int) pairs+                | all isSymbol name = addInfix (D.L, 9 :: Int) pairs                 | otherwise = pairs              customOps = Map.intersectionWith addInfix infixes types@@ -130,16 +130,17 @@        (comment, decl, source) : rest ->           case decl of-            Fixity assoc prec name ->+            D.Fixity assoc prec name ->                 collect (Map.insert name (assoc,prec) infixes) types aliases adts rest-            Definition (TypeAnnotation name tipe) ->+            D.Definition (E.TypeAnnotation name tipe) ->                 collect infixes (insert name [ "type" .= tipe ] types) aliases adts rest-            TypeAlias name vars tipe ->+            D.TypeAlias name vars tipe ->                 let fields = ["typeVariables" .= vars, "type" .= tipe ]                 in  collect infixes types (insert name fields aliases) adts rest-            Datatype name vars ctors ->+            D.Datatype name vars ctors ->                 let tipe = Data name (map Var vars)-                    fields = ["typeVariables" .= vars, "constructors" .= map (ctorToJson tipe) ctors ]+                    fields = ["typeVariables" .= vars+                             , "constructors" .= map (ctorToJson tipe) ctors ]                 in  collect infixes types aliases (insert name fields adts) rest           where             insert name fields dict = Map.insert name (obj name fields) dict@@ -152,11 +153,10 @@           Lambda t1 t2 -> toJSON [ "->", toJSON t1, toJSON t2 ]           Var x -> toJSON x           Data name ts -> toJSON (toJSON name : map toJSON ts)-          EmptyRecord -> object []           Record fields ext -> object $ map (\(n,t) -> Text.pack n .= toJSON t) fields'               where fields' = case ext of-                                EmptyRecord -> fields-                                _ -> ("_",ext) : fields+                                Nothing -> fields+                                Just x -> ("_", Var x) : fields  ctorToJson tipe (ctor, tipes) =     object [ "name" .= ctor
compiler/Elm/Internal/Utils.hs view
@@ -21,7 +21,7 @@ 
 {-# NOINLINE interfaces #-}
 interfaces :: M.Interfaces
-interfaces = unsafePerformIO $ Prelude.interfaces
+interfaces = unsafePerformIO $ Prelude.interfaces False
 
 -- |This function extracts the module name of a given source program.
 moduleName :: String -> Maybe String
compiler/Generate/Cases.hs view
@@ -1,9 +1,9 @@ module Generate.Cases (toMatch, Match (..), Clause (..), matchSubst, newVar) where -import Control.Applicative ((<$>),(<*>))-import Control.Arrow (first,second)+import Control.Applicative ((<$>))+import Control.Arrow (first) import Control.Monad.State-import Data.List (groupBy,sortBy,lookup)+import Data.List (groupBy,sortBy) import Data.Maybe (fromMaybe)  import SourceSyntax.Location@@ -13,7 +13,7 @@ import Transform.Substitute  -toMatch :: [(Pattern, LExpr t v)] -> State Int (String, Match t v)+toMatch :: [(Pattern, LExpr)] -> State Int (String, Match) toMatch patterns = do   v <- newVar   (,) v <$> match [v] (map (first (:[])) patterns) Fail@@ -23,19 +23,19 @@             modify (+1)             return $ "_v" ++ show n -data Match t v-    = Match String [Clause t v] (Match t v)+data Match+    = Match String [Clause] Match     | Break     | Fail-    | Other (LExpr t v)-    | Seq [Match t v]+    | Other LExpr+    | Seq [Match]       deriving Show -data Clause t v =-    Clause (Either String Literal) [String] (Match t v)+data Clause =+    Clause (Either String Literal) [String] Match     deriving Show -matchSubst :: [(String,String)] -> Match t v -> Match t v+matchSubst :: [(String,String)] -> Match -> Match matchSubst _ Break = Break matchSubst _ Fail = Fail matchSubst pairs (Seq ms) = Seq (map (matchSubst pairs) ms)@@ -47,7 +47,7 @@               clauseSubst (Clause c vs m) =                   Clause c (map varSubst vs) (matchSubst pairs m) -isCon (p:ps, e) =+isCon (p:_, _) =   case p of     PData _ _  -> True     PLiteral _ -> True@@ -55,7 +55,7 @@  isVar p = not (isCon p) -match :: [String] -> [([Pattern],LExpr t v)] -> Match t v -> State Int (Match t v)+match :: [String] -> [([Pattern],LExpr)] -> Match -> State Int Match match [] [] def = return def match [] [([],e)] Fail  = return $ Other e match [] [([],e)] Break = return $ Other e@@ -72,10 +72,10 @@       PAlias x pattern -> (pattern:ps, L s $ subst x (Var v) e)       _ -> c -matchVar :: [String] -> [([Pattern],LExpr t v)] -> Match t v -> State Int (Match t v)+matchVar :: [String] -> [([Pattern],LExpr)] -> Match -> State Int Match matchVar (v:vs) cs def = match vs (map subVar cs) def   where-    subVar (p:ps, ce@(L s e)) = (ps, L s $ subOnePattern p e)+    subVar (p:ps, (L s e)) = (ps, L s $ subOnePattern p e)         where           subOnePattern pattern e =             case pattern of@@ -84,7 +84,7 @@               PRecord fs ->                  foldr (\x -> subst x (Access (L s (Var v)) x)) e fs -matchCon :: [String] -> [([Pattern],LExpr t v)] -> Match t v -> State Int (Match t v)+matchCon :: [String] -> [([Pattern],LExpr)] -> Match -> State Int Match matchCon (v:vs) cs def = (flip (Match v) def) <$> mapM toClause css     where       css = groupBy eq (sortBy cmp cs)@@ -106,10 +106,10 @@  matchClause :: Either String Literal             -> [String]-            -> [([Pattern],LExpr t v)]-            -> Match t v-            -> State Int (Clause t v)-matchClause c (v:vs) cs def =+            -> [([Pattern],LExpr)]+            -> Match+            -> State Int Clause+matchClause c (_:vs) cs def =     do vs' <- getVars        Clause c vs' <$> match (vs' ++ vs) (map flatten cs) def     where@@ -124,6 +124,6 @@             (PData _ ps : _, _) -> forM ps (const newVar)             (PLiteral _ : _, _) -> return [] -matchMix :: [String] -> [([Pattern],LExpr t v)] -> Match t v -> State Int (Match t v)+matchMix :: [String] -> [([Pattern],LExpr)] -> Match -> State Int Match matchMix vs cs def = foldM (flip $ match vs) def (reverse css)     where css = groupBy (\p1 p2 -> isCon p1 == isCon p2) cs
compiler/Generate/JavaScript.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_GHC -W #-} module Generate.JavaScript (generate) where  import Control.Arrow (first,(***))@@ -7,67 +8,49 @@ import qualified Data.Map as Map import qualified Data.Set as Set +import Generate.JavaScript.Helpers import qualified Generate.Cases as Case+import qualified Generate.JavaScript.Ports as Port import qualified Generate.Markdown as MD import qualified SourceSyntax.Helpers as Help import SourceSyntax.Literal-import SourceSyntax.Pattern+import SourceSyntax.Pattern as Pattern import SourceSyntax.Location import SourceSyntax.Expression import SourceSyntax.Module-import qualified Transform.SortDefinitions as SD import Language.ECMAScript3.Syntax import Language.ECMAScript3.PrettyPrint import qualified Transform.SafeNames as MakeSafe -split :: String -> [String]-split = go []-  where-    go vars str =-        case break (=='.') str of-          (x,'.':rest) | Help.isOp x -> vars ++ [x ++ '.' : rest]-                       | otherwise -> go (vars ++ [x]) rest-          (x,[]) -> vars ++ [x]--var name = Id () name-ref name = VarRef () (var name)-prop name = PropId () (var name)-f <| x = CallExpr () f [x]-args ==> e = FuncExpr () Nothing (map var args) [ ReturnStmt () (Just e) ]-function args stmts = FuncExpr () Nothing (map var args) stmts-call = CallExpr ()-string = StringLit ()--dotSep (x:xs) = foldl (DotRef ()) (ref x) (map var xs)-obj = dotSep . split- varDecl :: String -> Expression () -> VarDecl () varDecl x expr =     VarDecl () (var x) (Just expr) +include :: String -> String -> VarDecl () include alias moduleName =     varDecl alias (obj (moduleName ++ ".make") <| ref "_elm") +internalImports :: String -> Statement () internalImports name =     VarDeclStmt () -    [ varDecl "N" (obj "Elm.Native")-    , include "_N" "N.Utils"-    , include "_L" "N.List"-    , include "_E" "N.Error"-    , include "_J" "N.JavaScript"+    [ varDecl "_N" (obj "Elm.Native")+    , include "_U" "_N.Utils"+    , include "_L" "_N.List"+    , include "_E" "_N.Error"+    , include "_J" "_N.JavaScript"     , varDecl "$moduleName" (string name)     ]  literal :: Literal -> Expression () literal lit =   case lit of-    Chr c -> obj "_N.chr" <| string [c]+    Chr c -> obj "_U.chr" <| string [c]     Str s -> string s     IntNum   n -> IntLit () n     FloatNum n -> NumLit () n     Boolean  b -> BoolLit () b -expression :: LExpr () () -> State Int (Expression ())+expression :: LExpr -> State Int (Expression ()) expression (L span expr) =     case expr of       Var x -> return $ ref x@@ -84,19 +67,19 @@        Remove e x ->           do e' <- expression e-             return $ obj "_N.remove" `call` [string x, e']+             return $ obj "_U.remove" `call` [string x, e']        Insert e x v ->           do v' <- expression v              e' <- expression e-             return $ obj "_N.insert" `call` [string x, v', e']+             return $ obj "_U.insert" `call` [string x, v', e']        Modify e fs ->           do e' <- expression e              fs' <- forM fs $ \(f,v) -> do                       v' <- expression v                       return $ ArrayLit () [string f, v']-             return $ obj "_N.replace" `call` [ArrayLit () fs', e']+             return $ obj "_U.replace" `call` [ArrayLit () fs', e']        Record fields ->           do fields' <- forM fields $ \(f,e) -> do@@ -148,10 +131,10 @@                   _ -> (func, args)        Let defs e ->-          do let (defs',e') = SD.flattenLets defs e +          do let (defs',e') = flattenLets defs e               stmts <- concat <$> mapM definition defs'              exp <- expression e'-             return $ function [] (stmts ++ [ ReturnStmt () (Just exp) ]) `call` []+             return $ function [] (stmts ++ [ ret exp ]) `call` []        MultiIf branches ->         do branches' <- forM branches $ \(b,e) -> (,) <$> expression b <*> expression e@@ -192,56 +175,59 @@             pad = "<div style=\"height:0;width:0;\">&nbsp;</div>"             md = pad ++ MD.toHtml doc ++ pad -definition :: Def () () -> State Int [Statement ()]-definition def =-  case def of-    TypeAnnotation _ _ -> return []+      PortIn name tipe ->+          return $ obj "Native.Ports.portIn" `call` [ string name, Port.incoming tipe ] -    Def pattern expr@(L span _) -> do-      expr' <- expression expr-      let assign x = varDecl x expr'-      case pattern of-        PVar x-          | Help.isOp x ->-              let op = LBracket () (ref "_op") (string x) in-              return [ ExprStmt () $ AssignExpr () OpAssign op expr' ]-          | otherwise ->-              return [ VarDeclStmt () [ assign x ] ]+      PortOut name tipe value ->+          do value' <- expression value+             return $ obj "Native.Ports.portOut" `call`+                        [ string name, Port.outgoing tipe, value' ] -        PRecord fields ->-            let setField f = varDecl f (dotSep ["$",f]) in-            return [ VarDeclStmt () (assign "$" : map setField fields) ]+definition :: Def -> State Int [Statement ()]+definition (Definition pattern expr@(L span _) _) = do+  expr' <- expression expr+  let assign x = varDecl x expr'+  case pattern of+    PVar x+        | Help.isOp x ->+            let op = LBracket () (ref "_op") (string x) in+            return [ ExprStmt () $ AssignExpr () OpAssign op expr' ]+        | otherwise ->+            return [ VarDeclStmt () [ assign x ] ] -        PData name patterns | vars /= Nothing ->-            case vars of-              Just vs -> return [ VarDeclStmt () (setup (zipWith decl vs [0..])) ]-            where-              vars = getVars patterns-              getVars patterns =-                  case patterns of-                    PVar x : rest -> (x:) `fmap` getVars rest-                    [] -> Just []-                    _ -> Nothing+    PRecord fields ->+        let setField f = varDecl f (dotSep ["$",f]) in+        return [ VarDeclStmt () (assign "$" : map setField fields) ] -              decl x n = varDecl x (dotSep ["$","_" ++ show n])-              setup vars-                  | Help.isTuple name = assign "$" : vars-                  | otherwise = assign "$raw" : safeAssign : vars+    PData name patterns | vars /= Nothing ->+        return [ VarDeclStmt () (setup (zipWith decl (maybe [] id vars) [0..])) ]+        where+          vars = getVars patterns+          getVars patterns =+              case patterns of+                PVar x : rest -> (x:) `fmap` getVars rest+                [] -> Just []+                _ -> Nothing -              safeAssign = varDecl "$" (CondExpr () if' (obj "$raw") exception)-              if' = InfixExpr () OpStrictEq (obj "$raw.ctor") (string name)-              exception = obj "_E.Case" `call` [ref "$moduleName", string (show span)]+          decl x n = varDecl x (dotSep ["$","_" ++ show n])+          setup vars+              | Help.isTuple name = assign "$" : vars+              | otherwise = assign "$raw" : safeAssign : vars -        _ ->-            do defs' <- concat <$> mapM toDef vars-               return (VarDeclStmt () [assign "$"] : defs')-            where-              vars = Set.toList $ SD.boundVars pattern-              mkVar = L span . Var-              toDef y = definition $-                        Def (PVar y) (L span $ Case (mkVar "$") [(pattern, mkVar y)])+          safeAssign = varDecl "$" (CondExpr () if' (obj "$raw") exception)+          if' = InfixExpr () OpStrictEq (obj "$raw.ctor") (string name)+          exception = obj "_E.Case" `call` [ref "$moduleName", string (show span)] -match :: (Show a) => a -> Case.Match () () -> State Int [Statement ()]+    _ ->+        do defs' <- concat <$> mapM toDef vars+           return (VarDeclStmt () [assign "$"] : defs')+        where+          vars = Set.toList $ Pattern.boundVars pattern+          mkVar = L span . Var+          toDef y = let expr =  L span $ Case (mkVar "$") [(pattern, mkVar y)]+                    in  definition $ Definition (PVar y) expr Nothing++match :: SrcSpan -> Case.Match -> State Int [Statement ()] match span mtch =   case mtch of     Case.Match name clauses mtch' ->@@ -263,7 +249,7 @@     Case.Break -> return [BreakStmt () Nothing]     Case.Other e ->         do e' <- expression e-           return [ ReturnStmt () (Just e') ]+           return [ ret e' ]     Case.Seq ms -> concat <$> mapM (match span) (dropEnd [] ms)         where           dropEnd acc [] = acc@@ -272,6 +258,7 @@                 Case.Other _ -> acc ++ [m]                 _ -> dropEnd (acc ++ [m]) ms +clause :: SrcSpan -> String -> Case.Clause -> State Int (Bool, CaseClause ()) clause span variable (Case.Clause value vars mtch) =     (,) isChar . CaseClause () pattern <$> match span (Case.matchSubst (zip vars vars') mtch)   where@@ -286,8 +273,13 @@                                                      [] -> name                                                      is -> drop (last is + 1) name +flattenLets :: [Def] -> LExpr -> ([Def], LExpr)+flattenLets defs lexpr@(L _ expr) =+    case expr of+      Let ds body -> flattenLets (defs ++ ds) body+      _ -> (defs, lexpr) -generate :: MetadataModule () () -> String +generate :: MetadataModule -> String  generate unsafeModule =     show . prettyPrint $ setup (Just "Elm") (names modul ++ ["make"]) ++              [ assign ("Elm" : names modul ++ ["make"]) (function ["_elm"] programStmts) ]@@ -295,17 +287,16 @@     modul = MakeSafe.metadataModule unsafeModule     thisModule = dotSep ("_elm" : names modul ++ ["values"])     programStmts =-        concat [ setup (Just "_elm") (names modul ++ ["values"])-               , [ IfSingleStmt () thisModule (ReturnStmt () (Just thisModule)) ]-               , [ internalImports (List.intercalate "." (names modul)) ]-               , concatMap jsImport (imports modul)-               , concatMap importEvent (foreignImports modul)-               , [ assign ["_op"] (ObjectLit () []) ]-               , concat $ evalState (mapM definition . fst . SD.flattenLets [] $ program modul) 0-               , map exportEvent $ foreignExports modul-               , [ jsExports ]-               , [ ReturnStmt () (Just thisModule) ]-               ]+        concat+        [ setup (Just "_elm") (names modul ++ ["values"])+        , [ IfSingleStmt () thisModule (ret thisModule) ]+        , [ internalImports (List.intercalate "." (names modul)) ]+        , concatMap jsImport . Set.toList . Set.fromList . map fst $ imports modul+        , [ assign ["_op"] (ObjectLit () []) ]+        , concat $ evalState (mapM definition . fst . flattenLets [] $ program modul) 0+        , [ jsExports ]+        , [ ret thisModule ]+        ]      jsExports = assign ("_elm" : names modul ++ ["values"]) (ObjectLit () exs)         where@@ -318,7 +309,7 @@                _   -> ExprStmt () $                       AssignExpr () OpAssign (LDot () (dotSep (init path)) (last path)) expr -    jsImport (modul,_) = setup Nothing path ++ [ include ]+    jsImport modul = setup Nothing path ++ [ include ]         where           path = split modul           include = assign path $ dotSep ("Elm" : path ++ ["make"]) <| ref "_elm"@@ -330,32 +321,7 @@                     Nothing -> tail . init $ List.inits path                     Just nmspc -> drop 2 . init . List.inits $ nmspc : path -    addId js = InfixExpr () OpAdd (string (js++"_")) (obj "_elm.id")--    importEvent (js,base,elm,_) =-        [ VarDeclStmt () [ varDecl elm $ obj "Signal.constant" <| evalState (expression base) 0 ]-        , ExprStmt () $-            obj "document.addEventListener" `call`-                  [ addId js-                  , function ["_e"]-                        [ ExprStmt () $ obj "_elm.notify" `call` [dotSep [elm,"id"], obj "_e.value"] ]-                  ]-        ]--    exportEvent (js,elm,_) =-        ExprStmt () $-        ref "A2" `call`-                [ obj "Signal.lift"-                , function ["_v"]-                      [ VarDeclStmt () [varDecl "_e" $ obj "document.createEvent" <| string "Event"]-                      , ExprStmt () $-                            obj "_e.initEvent" `call` [ addId js, BoolLit () True, BoolLit () True ]-                      , ExprStmt () $ AssignExpr () OpAssign (LDot () (ref "_e") "value") (ref "_v")-                      , ExprStmt () $ obj "document.dispatchEvent" <| ref "_e"-                      , ReturnStmt () (Just $ ref "_v")-                      ]-                , ref elm ]-+binop :: SrcSpan -> String -> LExpr -> LExpr -> State Int (Expression ()) binop span op e1 e2 =     case op of       "Basics.." ->@@ -382,9 +348,6 @@           L _ (Binop op e1 e2) | op == "Basics.." -> collect (es ++ [e1]) e2           _ -> es ++ [e] -    js1 = expression e1-    js2 = expression e2-     func | Help.isOp operator = BracketRef () (dotSep (init parts ++ ["_op"])) (string operator)          | otherwise     = dotSep parts         where@@ -408,8 +371,8 @@     specialOps = concat         [ specialOp "^"   $ \a b -> obj "Math.pow" `call` [a,b]         , specialOp "|>"  $ flip (<|)-        , specialOp "=="  $ \a b -> obj "_N.eq" `call` [a,b]-        , specialOp "/="  $ \a b -> PrefixExpr () PrefixLNot (obj "_N.eq" `call` [a,b])+        , specialOp "=="  $ \a b -> obj "_U.eq" `call` [a,b]+        , specialOp "/="  $ \a b -> PrefixExpr () PrefixLNot (obj "_U.eq" `call` [a,b])         , specialOp "<"   $ cmp OpLT 0         , specialOp ">"   $ cmp OpGT 0         , specialOp "<="  $ cmp OpLT 1@@ -417,4 +380,4 @@         , specialOp "div" $ \a b -> InfixExpr () OpBOr (InfixExpr () OpDiv a b) (IntLit () 0)         ] -    cmp op n a b = InfixExpr () op (obj "_N.cmp" `call` [a,b]) (IntLit () n)+    cmp op n a b = InfixExpr () op (obj "_U.cmp" `call` [a,b]) (IntLit () n)
+ compiler/Generate/JavaScript/Helpers.hs view
@@ -0,0 +1,37 @@+{-# OPTIONS_GHC -W #-}+module Generate.JavaScript.Helpers where++import qualified SourceSyntax.Helpers as Help+import Language.ECMAScript3.Syntax++split :: String -> [String]+split = go []+  where+    go vars str =+        case break (=='.') str of+          (x,_:rest) | Help.isOp x -> vars ++ [x ++ '.' : rest]+                     | otherwise -> go (vars ++ [x]) rest+          (x,[]) -> vars ++ [x]++var name = Id () name+ref name = VarRef () (var name)+prop name = PropId () (var name)+f <| x = CallExpr () f [x]+ret e = ReturnStmt () (Just e)+args ==> e = FuncExpr () Nothing (map var args) [ ret e ]+function args stmts = FuncExpr () Nothing (map var args) stmts+call = CallExpr ()+string = StringLit ()++dotSep vars =+    case vars of+      x:xs -> foldl (DotRef ()) (ref x) (map var xs)+      [] -> error "dotSep must be called on a non-empty list of variables"++obj = dotSep . split++equal a b = InfixExpr () OpStrictEq a b+instanceof tipe x =+    InfixExpr () OpLAnd (typeof "object" x) (InfixExpr () OpInstanceof x (ref tipe))+typeof tipe x = equal (PrefixExpr () PrefixTypeof x) (string tipe)+member field x = InfixExpr () OpIn (string field) x
+ compiler/Generate/JavaScript/Ports.hs view
@@ -0,0 +1,130 @@+{-# OPTIONS_GHC -W #-}+module Generate.JavaScript.Ports (incoming, outgoing) where++import Generate.JavaScript.Helpers+import qualified SourceSyntax.Helpers as Help+import SourceSyntax.Type as T+import Language.ECMAScript3.Syntax++data JSType = JSNumber | JSBoolean | JSString | JSArray | JSObject [String]+    deriving Show++check :: Expression () -> JSType -> Expression () -> Expression ()+check x jsType continue =+    CondExpr () (jsFold OpLOr checks x) continue throw+  where+    jsFold op checks value = foldl1 (InfixExpr () op) (map ($value) checks)+    throw = obj "_E.raise" <| InfixExpr () OpAdd msg x+    msg = string ("invalid input, expecting " ++ show jsType ++ " but got ")+    checks = case jsType of+               JSNumber  -> [typeof "number"]+               JSBoolean -> [typeof "boolean"]+               JSString  -> [typeof "string", instanceof "String"]+               JSArray   -> [instanceof "Array"]+               JSObject fields -> [jsFold OpLAnd (typeof "object" : map member fields)]++incoming :: Type -> Expression ()+incoming tipe =+  case tipe of+    Data "Signal.Signal" [t] ->+        obj "Native.Ports.incomingSignal" <| incoming t+    _ -> ["v"] ==> inc tipe (ref "v")++inc :: Type -> Expression () -> Expression ()+inc tipe x =+     case tipe of+      Lambda _ _ -> error "functions should not be allowed through input ports"+      Var _ -> error "type variables should not be allowed through input ports"+      Data ctor []+          | ctor == "Int"    -> elm JSNumber+          | ctor == "Float"  -> elm JSNumber+          | ctor == "Bool"   -> elm JSBoolean+          | ctor == "String" -> elm JSString+          | ctor == "JavaScript.JSNumber" -> js JSNumber+          | ctor == "JavaScript.JSBool"   -> js JSBoolean+          | ctor == "JavaScript.JSString" -> js JSString+          where+            elm checks = check x checks (obj ("_J.to" ++ ctor) <| x)+            js checks = check x checks x++      Data ctor [t]+          | ctor == "Maybe.Maybe" ->+              CondExpr () (equal x (NullLit ()))+                          (obj "Maybe.Nothing")+                          (obj "Maybe.Just" <| inc t x)++          | ctor == "_List" ->+              check x JSArray (obj "_J.toList" <| array)+              where+                array = DotRef () x (var "map") <| incoming t++      Data ctor ts | Help.isTuple ctor -> check x JSArray tuple+          where+            tuple = ObjectLit () $ (PropId () (var "ctor"), string ctor) : values+            values = zipWith convert [0..] ts+            convert n t = ( PropId () $ var ('_':show n)+                          , inc t (BracketRef () x (IntLit () n)))++      Data _ _ -> error "bad ADT got to port generation code"++      Record _ (Just _) -> error "bad record got to port generation code"++      Record fields Nothing -> check x (JSObject (map fst fields)) object+          where+            object = ObjectLit () $ (PropId () (var "_"), ObjectLit () []) : keys+            keys = map convert fields+            convert (f,t) = (PropId () (var f), inc t (DotRef () x (var f)))++outgoing tipe =+  case tipe of+    Data "Signal.Signal" [t] ->+        obj "Native.Ports.outgoingSignal" <| outgoing t+    _ -> ["v"] ==> out tipe (ref "v")++out :: Type -> Expression () -> Expression ()+out tipe x =+    case tipe of+      Lambda _ _+          | numArgs > 1 && numArgs < 10 ->+              func (ref ('A':show numArgs) `call` (x:values))+          | otherwise -> func (foldl (<|) x values)+          where+            ts = T.collectLambdas tipe+            numArgs = length ts - 1+            args = map (\n -> '_' : show n) [0..]+            values = zipWith inc (init ts) (map ref args)+            func body = function (take numArgs args)+                        [ VarDeclStmt () [VarDecl () (var "_r") (Just body)]+                        , ret (out (last ts) (ref "_r"))+                        ]++      Var _ -> error "type variables should not be allowed through input ports"+      Data ctor []+          | ctor `elem` ["Int","Float","Bool","String"] -> obj ("_J.from" ++ ctor) <| x+          | ctor `elem` jsPrims -> x+          where+            jsPrims = map ("JavaScript.JS"++) ["Number","Bool","String"]++      Data ctor [t]+          | ctor == "Maybe.Maybe" ->+              CondExpr () (equal (DotRef () x (var "ctor")) (string "Nothing"))+                          (NullLit ())+                          (DotRef () x (var "_0"))++          | ctor == "_List" ->+              DotRef () (obj "_J.fromList" <| x) (var "map") <| outgoing t++      Data ctor ts | Help.isTuple ctor ->+          ArrayLit () $ zipWith convert [0..] ts+          where+            convert n t = out t $ DotRef () x $ var ('_':show n)++      Data _ _ -> error "bad ADT got to port generation code"++      Record _ (Just _) -> error "bad record got to port generation code"++      Record fields Nothing ->+          ObjectLit () keys+          where+            keys = map convert fields+            convert (f,t) = (PropId () (var f), out t (DotRef () x (var f)))
compiler/Generate/Noscript.hs view
@@ -1,35 +1,34 @@ module Generate.Noscript (noscript) where  import Data.List (isInfixOf)-import SourceSyntax.Declaration (Declaration(..))+import qualified SourceSyntax.Declaration as D import SourceSyntax.Expression import SourceSyntax.Literal import SourceSyntax.Location import SourceSyntax.Module import qualified Generate.Markdown as MD -noscript :: Module t v -> String+noscript :: Extract def => Module def -> String noscript modul = concat (extract modul)  class Extract a where   extract :: a -> [String] -instance Extract (Module t v) where+instance Extract def => Extract (Module def) where   extract (Module _ _ _ stmts) =       map (\s -> "<p>" ++ s ++ "</p>") (concatMap extract stmts) -instance Extract (Declaration t v) where-  extract (Definition d) = extract d+instance Extract def => Extract (D.Declaration' port def) where+  extract (D.Definition d) = extract d   extract _ = [] -instance Extract (Def t v) where-  extract (Def _ e)   = extract e-  extract _ = []+instance Extract Def where+  extract (Definition _ e _)   = extract e  instance Extract e => Extract (Located e) where   extract (L _ e) = extract e -instance Extract (Expr t v) where+instance Extract def => Extract (Expr' def) where   extract expr =     let f = extract in     case expr of
− compiler/InterfaceSerialization.hs
@@ -1,52 +0,0 @@-module InterfaceSerialization ( loadInterface-                              , interfaceDecode-                              , validVersion-                              ) where--import qualified Data.ByteString.Lazy as L-import qualified Data.Binary as Binary--import qualified Elm.Internal.Version as Version-import System.Directory (doesFileExist)-import System.IO (hPutStrLn, stderr)-import System.Exit (exitFailure)--import SourceSyntax.Module--loadInterface :: FilePath -> IO (Either String L.ByteString)-loadInterface filePath = do-  exists <- doesFileExist filePath-  if exists-    then do-      byteString <- L.readFile filePath-      return $ Right byteString--    else-      return $ Left $ "Unable to find file " ++ filePath ++-                      " for deserialization!"--interfaceDecode :: Binary.Binary a =>-                   FilePath -> L.ByteString -> Either String a-interfaceDecode filePath bytes = do-  case Binary.decodeOrFail bytes of-    Right (_, _, binaryInfo) -> Right binaryInfo--    Left (_, offset, err) ->-        Left $ concat [ "Error reading build artifact: ", filePath, "\n"-                      , "    The exact error was '", err, "' at offset ", show offset, ".\n"-                      , "    The file was generated by a previous build and may be outdated or corrupt.\n"-                      , "    Please remove the file and try again."-                      ]--validVersion :: FilePath -> (String, ModuleInterface) ->-                Either String (String, ModuleInterface)-validVersion filePath (name, interface) =-    if iVersion interface == Version.elmVersion then-        Right (name, interface)-    else-        Left $ concat-               [ "Error reading build artifact: ", filePath, "\n"-               , "    It was generated by a different version of the compiler: "-               , show (iVersion interface), "\n"-               , "    Please remove the file and try again.\n"-               ]
compiler/Metadata/Prelude.hs view
@@ -1,70 +1,59 @@+{-# OPTIONS_GHC -W #-} module Metadata.Prelude (interfaces, add) where  import qualified Data.Map as Map import qualified Control.Exception as E import qualified Paths_Elm as Path-import System.Directory import System.Exit-import System.FilePath import System.IO import SourceSyntax.Module-import qualified Data.Binary as Binary-import qualified Data.ByteString.Lazy as BS--import qualified InterfaceSerialization as IS+import qualified Build.Interface as Interface -add :: Module t v -> Module t v-add (Module name exs ims stmts) = Module name exs (customIms ++ ims) stmts+add :: Bool -> Module def -> Module def+add noPrelude (Module name exs ims decls) = Module name exs (customIms ++ ims) decls     where-      customIms = concatMap addModule prelude+      customIms = if noPrelude then [] else concatMap addModule prelude        addModule (n, method) = case lookup n ims of                                 Nothing     -> [(n, method)]-                                Just (As m) -> [(n, method)]+                                Just (As _) -> [(n, method)]                                 Just _      -> []  prelude :: [(String, ImportMethod)]-prelude = text ++ map (\n -> (n, Hiding [])) modules+prelude = string : text ++ map (\n -> (n, Hiding [])) modules   where     text = map ((,) "Text") [ As "Text", Hiding ["link", "color", "height"] ]+    string = ("String", As "String")     modules = [ "Basics", "Signal", "List", "Maybe", "Time", "Prelude"-              , "Graphics.Element", "Color", "Graphics.Collage" ]+              , "Graphics.Element", "Color", "Graphics.Collage", "Native.Ports" ] -interfaces :: IO Interfaces-interfaces = safeReadDocs =<< Path.getDataFileName "interfaces.data"+interfaces :: Bool -> IO Interfaces+interfaces noPrelude =+    if noPrelude+    then return $ Map.empty+    else safeReadDocs =<< Path.getDataFileName "interfaces.data"  safeReadDocs :: FilePath -> IO Interfaces safeReadDocs name =     E.catch (readDocs name) $ \err -> do       let _ = err :: IOError-      putStrLn $ unlines [ "Error reading types for standard library!"-                         , "    The file should be at " ++ name-                         , "    If you are using a stable version of Elm,"-                         , "    please report an issue at github.com/evancz/Elm"-                         , "    and specify your versions of Elm and your OS" ]+      hPutStrLn stderr $ unlines $+         [ "Error reading types for standard library from file " ++ name+         , "    If you are using a stable version of Elm, please report an issue at"+         , "    <http://github.com/evancz/Elm/issues> specifying version numbers for"+         , "    Elm and your OS." ]       exitFailure -firstModuleInterface :: [(String, ModuleInterface)] ->-                        Either String (String, ModuleInterface)-firstModuleInterface interfaces =-    case interfaces of-      []      -> Left "No interfaces found in serialized Prelude!"-      iface:_ -> Right iface- readDocs :: FilePath -> IO Interfaces readDocs filePath = do-  bytes <- IS.loadInterface filePath-  let interfaces = IS.interfaceDecode filePath =<< bytes--      -- Although every ModuleInterface that is deserialized in this collection-      -- contains the compiler version, we only check the first ModuleInterface-      -- since it doesn't make sense that different modules in Prelude would-      -- have been compiled by different compiler versions.-      isValid = IS.validVersion filePath =<< firstModuleInterface =<< interfaces--  case (interfaces, isValid) of-    (_, Left err) -> do+  interfaces <- Interface.load filePath+  case mapM (Interface.isValid filePath) (interfaces :: [(String, ModuleInterface)]) of+    Left err -> do       hPutStrLn stderr err       exitFailure -    (Right ifaces, _) -> return $ Map.fromList ifaces+    Right [] -> do+      hPutStrLn stderr "No interfaces found in serialized Prelude!"+      exitFailure++    Right ifaces -> return $ Map.fromList ifaces
compiler/Parse/Binop.hs view
@@ -1,12 +1,11 @@ module Parse.Binop (binops, OpTable) where  import Control.Applicative ((<$>))-import Control.Monad.Error import Data.List (intercalate) import qualified Data.Map as Map  import SourceSyntax.Location (merge)-import SourceSyntax.Expression (LExpr, Expr(Binop))+import qualified SourceSyntax.Expression as E import SourceSyntax.Declaration (Assoc(..)) import Text.Parsec import Parse.Helpers@@ -17,13 +16,13 @@ opAssoc :: OpTable -> String -> Assoc opAssoc table op = snd $ Map.findWithDefault (9,L) op table -hasLevel :: OpTable -> Int -> (String, LExpr t v) -> Bool+hasLevel :: OpTable -> Int -> (String, E.LParseExpr) -> Bool hasLevel table n (op,_) = opLevel table op == n -binops :: IParser (LExpr t v)-       -> IParser (LExpr t v)+binops :: IParser E.LParseExpr+       -> IParser E.LParseExpr        -> IParser String-       -> IParser (LExpr t v)+       -> IParser E.LParseExpr binops term last anyOp =     do e <- term        table <- getState@@ -39,9 +38,9 @@  split :: OpTable       -> Int-      -> LExpr t v-      -> [(String, LExpr t v)]-      -> IParser (LExpr t v)+      -> E.LParseExpr+      -> [(String, E.LParseExpr)]+      -> IParser E.LParseExpr split _ _ e []  = return e split table n e eops = do   assoc <- getAssoc table n eops@@ -50,26 +49,26 @@   case assoc of R -> joinR es ops                 _ -> joinL es ops -splitLevel :: OpTable -> Int -> LExpr t v -> [(String, LExpr t v)]-           -> [IParser (LExpr t v)]+splitLevel :: OpTable -> Int -> E.LParseExpr -> [(String, E.LParseExpr)]+           -> [IParser E.LParseExpr] splitLevel table n e eops =     case break (hasLevel table n) eops of       (lops, (op,e'):rops) ->           split table (n+1) e lops : splitLevel table n e' rops       (lops, []) -> [ split table (n+1) e lops ] -joinL :: [LExpr t v] -> [String] -> IParser (LExpr t v)+joinL :: [E.LParseExpr] -> [String] -> IParser E.LParseExpr joinL [e] [] = return e-joinL (a:b:es) (op:ops) = joinL (merge a b (Binop op a b) : es) ops+joinL (a:b:es) (op:ops) = joinL (merge a b (E.Binop op a b) : es) ops joinL _ _ = failure "Ill-formed binary expression. Report a compiler bug." -joinR :: [LExpr t v] -> [String] -> IParser (LExpr t v)+joinR :: [E.LParseExpr] -> [String] -> IParser E.LParseExpr joinR [e] [] = return e joinR (a:b:es) (op:ops) = do e <- joinR (b:es) ops-                             return (merge a e (Binop op a e))+                             return (merge a e (E.Binop op a e)) joinR _ _ = failure "Ill-formed binary expression. Report a compiler bug." -getAssoc :: OpTable -> Int -> [(String,LExpr t v)] -> IParser Assoc+getAssoc :: OpTable -> Int -> [(String,E.LParseExpr)] -> IParser Assoc getAssoc table n eops     | all (==L) assocs = return L     | all (==R) assocs = return R 
compiler/Parse/Declaration.hs view
@@ -1,36 +1,32 @@-+{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-} module Parse.Declaration where -import Control.Applicative ((<$>), (<*>))-import qualified Data.List as List-import qualified Data.Set as Set+import Control.Applicative ((<$>)) import Text.Parsec hiding (newline,spaces)-import Text.Parsec.Indent  import Parse.Helpers import qualified Parse.Expression as Expr-import qualified SourceSyntax.Type as T import qualified Parse.Type as Type-import SourceSyntax.Declaration (Declaration(..), Assoc(..))+import qualified SourceSyntax.Declaration as D  -declaration :: IParser (Declaration t v)-declaration = alias <|> datatype <|> infixDecl <|> foreignDef <|> definition+declaration :: IParser D.ParseDeclaration+declaration = alias <|> datatype <|> infixDecl <|> port <|> definition -definition :: IParser (Declaration t v)-definition = Definition <$> Expr.def+definition :: IParser D.ParseDeclaration+definition = D.Definition <$> Expr.def -alias :: IParser (Declaration t v)+alias :: IParser D.ParseDeclaration alias = do   reserved "type" <?> "type alias (type Point = {x:Int, y:Int})"   forcedWS-  alias <- capVar-  args  <- spacePrefix lowVar+  name <- capVar+  args <- spacePrefix lowVar   padded equals   tipe <- Type.expr-  return (TypeAlias alias args tipe)+  return (D.TypeAlias name args tipe) -datatype :: IParser (Declaration t v)+datatype :: IParser D.ParseDeclaration datatype = do   reserved "data" <?> "datatype definition (data T = A | B | ...)"   forcedWS@@ -38,81 +34,26 @@   args <- spacePrefix lowVar   padded equals   tcs <- pipeSep1 Type.constructor-  return $ Datatype name args tcs+  return $ D.Datatype name args tcs  -infixDecl :: IParser (Declaration t v)+infixDecl :: IParser D.ParseDeclaration infixDecl = do-  assoc <- choice [ reserved "infixl" >> return L-                  , reserved "infix"  >> return N-                  , reserved "infixr" >> return R ]+  assoc <- choice [ reserved "infixl" >> return D.L+                  , reserved "infix"  >> return D.N+                  , reserved "infixr" >> return D.R ]   forcedWS   n <- digit   forcedWS-  Fixity assoc (read [n]) <$> anyOp+  D.Fixity assoc (read [n]) <$> anyOp  -foreignDef :: IParser (Declaration t v)-foreignDef = do-  try (reserved "foreign")-  whitespace-  importEvent <|> exportEvent--exportEvent :: IParser (Declaration t v)-exportEvent = do-  try (reserved "export") >> padded (reserved "jsevent")-  eventName <- jsVar-  whitespace-  elmVar <- lowVar-  padded hasType-  tipe <- Type.expr-  case tipe of-    T.Data "Signal" [t] ->-        case isExportable t of-          Nothing -> return (ExportEvent eventName elmVar tipe)-          Just err -> fail err-    _ -> fail "When importing foreign events, the imported value must have type Signal."--importEvent :: IParser (Declaration t v)-importEvent = do-  try (reserved "import") >> padded (reserved "jsevent")-  eventName <- jsVar-  baseValue <- padded Expr.term-               <?> "Base case for imported signal (signals cannot be undefined)"-  elmVar  <- lowVar <?> "Name of imported signal"-  padded hasType-  tipe <- Type.expr-  case tipe of-    T.Data "Signal" [t] ->-        case isExportable t of-          Nothing -> return (ImportEvent eventName baseValue elmVar tipe)-          Just err -> fail err-    _ -> fail "When importing foreign events, the imported value must have type Signal."--jsVar :: IParser String-jsVar = betwixt '"' '"' $ do-  v <- (:) <$> (letter <|> char '_') <*> many (alphaNum <|> char '_')-  if Set.notMember v jsReserveds then return v else-      fail $ "'" ++ v ++-          "' is not a good name for a importing or exporting JS values."--isExportable tipe =-  case tipe of-    T.Lambda _ _ ->-        Just $ "Elm's JavaScript event interface does not yet handle functions. " ++-               "Only simple values can be imported and exported in this release."--    T.Data "JSArray" [t] -> isExportable t--    T.Data name []-        | any (`List.isSuffixOf` name) jsTypes -> Nothing-        | otherwise -> Just $ "'" ++ name ++ "' is not an exportable type." ++ msg--    T.Data name _ ->-        Just $ "'" ++ name ++ "' is not an exportable type " ++-               "constructor. Only 'JSArray' is an exportable container."--    T.Var _ -> Just $ "Cannot export type variables." ++ msg-  where-    msg = " The following types are exportable: " ++ List.intercalate ", " jsTypes-    jsTypes = ["JSString","JSNumber","JSDomNode","JSBool","JSObject"]+port :: IParser D.ParseDeclaration+port =+  do try (reserved "port")+     whitespace+     name <- lowVar+     whitespace+     let port' op ctor expr = do { try op ; whitespace ; ctor name <$> expr }+     D.Port <$> choice [ port' hasType D.PPAnnotation Type.expr+                       , port' equals  D.PPDef Expr.expr ]
compiler/Parse/Expression.hs view
@@ -1,6 +1,5 @@-module Parse.Expression (def,term,typeAnnotation) where+module Parse.Expression (def,term,typeAnnotation,expr) where -import Control.Arrow ((***)) import Control.Applicative ((<$>), (<*>)) import Data.List (foldl') import Text.Parsec hiding (newline,spaces)@@ -16,26 +15,25 @@ import SourceSyntax.Pattern hiding (tuple,list) import qualified SourceSyntax.Literal as Literal import SourceSyntax.Expression-import SourceSyntax.Declaration (Declaration(Definition))   --------  Basic Terms  -------- -varTerm :: IParser (Expr t v)+varTerm :: IParser ParseExpr varTerm = toVar <$> var <?> "variable" -toVar :: String -> Expr t v+toVar :: String -> ParseExpr toVar v = case v of "True"  -> Literal (Literal.Boolean True)                     "False" -> Literal (Literal.Boolean False)                     _       -> Var v -accessor :: IParser (Expr t v)+accessor :: IParser ParseExpr accessor = do   (start, lbl, end) <- located (try (string "." >> rLabel))   let loc e = Location.at start end e   return (Lambda (PVar "_") (loc $ Access (loc $ Var "_") lbl)) -negative :: IParser (Expr t v)+negative :: IParser ParseExpr negative = do   (start, nTerm, end) <-       located (try (char '-' >> notFollowedBy (char '.' <|> char '-')) >> term)@@ -45,7 +43,7 @@  --------  Complex Terms  -------- -listTerm :: IParser (Expr t v)+listTerm :: IParser ParseExpr listTerm = markdown' <|> braces (try range <|> ExplicitList <$> commaSep expr)   where     range = do@@ -68,7 +66,7 @@       string "}}"       return (md ++ span uid (length exprs), exprs ++ [e]) -parensTerm :: IParser (LExpr t v)+parensTerm :: IParser LParseExpr parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)   where     opFn = do@@ -91,7 +89,7 @@                  [e] -> e                  _   -> Location.at start end (tuple es) -recordTerm :: IParser (LExpr t v)+recordTerm :: IParser LParseExpr recordTerm = brackets $ choice [ misc, addLocation record ]     where field = do               label <- rLabel@@ -124,14 +122,14 @@               Nothing -> try (insert record) <|> try (modify record)                          -term :: IParser (LExpr t v)+term :: IParser LParseExpr term =  addLocation (choice [ Literal <$> literal, listTerm, accessor, negative ])     <|> accessible (addLocation varTerm <|> parensTerm <|> recordTerm)     <?> "basic term (4, x, 'c', etc.)"  --------  Applications  -------- -appExpr :: IParser (LExpr t v)+appExpr :: IParser LParseExpr appExpr = do   t <- term   ts <- constrainedSpacePrefix term $ \str ->@@ -142,12 +140,12 @@  --------  Normal Expressions  -------- -binaryExpr :: IParser (LExpr t v)+binaryExpr :: IParser LParseExpr binaryExpr = binops appExpr lastExpr anyOp   where lastExpr = addLocation (choice [ ifExpr, letExpr, caseExpr ])                 <|> lambdaExpr -ifExpr :: IParser (Expr t v)+ifExpr :: IParser ParseExpr ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)     where       normal = do@@ -163,7 +161,7 @@                          b <- expr ; padded arrow                          (,) b <$> expr -lambdaExpr :: IParser (LExpr t v)+lambdaExpr :: IParser LParseExpr lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"                 whitespace                 args <- spaceSep1 Pattern.term@@ -171,17 +169,17 @@                 body <- expr                 return (makeFunction args body) -defSet :: IParser [Def t v]+defSet :: IParser [ParseDef] defSet = block (do d <- def ; whitespace ; return d) -letExpr :: IParser (Expr t v)+letExpr :: IParser ParseExpr letExpr = do   reserved "let" ; whitespace   defs <- defSet   padded (reserved "in")   Let defs <$> expr -caseExpr :: IParser (Expr t v)+caseExpr :: IParser ParseExpr caseExpr = do   reserved "case"; e <- padded expr; reserved "of"; whitespace   Case e <$> (with <|> without)@@ -191,6 +189,7 @@           with    = brackets (semiSep1 (case_ <?> "cases { x -> ... }"))           without = block (do c <- case_ ; whitespace ; return c) +expr :: IParser LParseExpr expr = addLocation (choice [ ifExpr, letExpr, caseExpr ])     <|> lambdaExpr     <|> binaryExpr @@ -206,7 +205,7 @@     where       func pattern =           case pattern of-            PVar v -> (pattern:) <$> spacePrefix Pattern.term+            PVar _ -> (pattern:) <$> spacePrefix Pattern.term             _ -> do try (lookAhead (whitespace >> string "="))                     return [pattern] @@ -216,18 +215,18 @@         return $ if o == '`' then [ PVar $ takeWhile (/='`') p, p1, p2 ]                              else [ PVar (o:p), p1, p2 ] -makeFunction :: [Pattern] -> LExpr t v -> LExpr t v+makeFunction :: [Pattern] -> LParseExpr -> LParseExpr makeFunction args body@(L s _) =     foldr (\arg body' -> L s $ Lambda arg body') body args -definition :: IParser (Def t v)+definition :: IParser ParseDef definition = withPos $ do   (name:args) <- defStart   padded equals   body <- expr   return . Def name $ makeFunction args body -typeAnnotation :: IParser (Def t v)+typeAnnotation :: IParser ParseDef typeAnnotation = TypeAnnotation <$> try start <*> Type.expr   where     start = do@@ -235,5 +234,5 @@       padded hasType       return v -def :: IParser (Def t v)+def :: IParser ParseDef def = typeAnnotation <|> definition
compiler/Parse/Helpers.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_GHC -W #-} module Parse.Helpers where  import Prelude hiding (until)@@ -7,13 +8,15 @@ import Data.Char (isUpper) import qualified Data.Set as Set import qualified Data.Map as Map+import Text.Parsec hiding (newline,spaces,State)+import Text.Parsec.Indent+import qualified Text.Parsec.Token as T+ import SourceSyntax.Helpers as Help import SourceSyntax.Location as Location import SourceSyntax.Expression import SourceSyntax.PrettyPrint import SourceSyntax.Declaration (Assoc)-import Text.Parsec hiding (newline,spaces,State)-import Text.Parsec.Indent  reserveds = [ "if", "then", "else"             , "case", "of"@@ -22,7 +25,7 @@             , "module", "where"             , "import", "as", "hiding", "open"             , "export", "foreign"-            , "deriving" ]+            , "deriving", "port" ]  jsReserveds :: Set.Set String jsReserveds = Set.fromList@@ -45,7 +48,8 @@ expecting = flip (<?>)  type OpTable = Map.Map String (Int, Assoc)-type IParser a = ParsecT String OpTable (State SourcePos) a+type SourceM = State SourcePos+type IParser a = ParsecT String OpTable SourceM a  iParse :: IParser a -> String -> Either ParseError a iParse = iParseWithTable "" Map.empty@@ -54,23 +58,6 @@ iParseWithTable sourceName table aParser input =   runIndent sourceName $ runParserT aParser table sourceName input -readMaybe :: Read a => String -> Maybe a-readMaybe s =-    case [ x | (x,t) <- reads s, ("","") <- lex t ] of-      [x] -> Just x-      _ -> Nothing--backslashed :: IParser Char-backslashed = do-  char '\\'-  c <- anyChar-  case readMaybe ['\'','\\',c,'\''] of-    Just chr -> return chr-    Nothing ->-        fail $ "Did not recognize character '\\" ++ [c] ++-               "'. If the backslash is meant to be a character of its own, " ++-               "it should be escaped like this: \"\\\\" ++ [c] ++ "\""- var :: IParser String var = makeVar (letter <|> char '_' <?> "variable") @@ -206,7 +193,7 @@   end <- getPosition   return (start, e, end) -accessible :: IParser (LExpr t v) -> IParser (LExpr t v)+accessible :: IParser LParseExpr -> IParser LParseExpr accessible expr = do   start <- getPosition   ce@(L _ e) <- expr@@ -325,24 +312,73 @@                       closeMarkdown (md ++ [c]) stuff                  ] -str :: IParser String-str = choice [ quote >> dewindows <$> manyTill (backslashed <|> anyChar) quote-             , liftM dewindows . expecting "string" . betwixt '"' '"' . many $-               backslashed <|> satisfy (/='"')-             ]-    where-      quote = try (string "\"\"\"")+--str :: IParser String+str = expecting "String" $ do+        s <- choice [ multiStr, singleStr ]+        processAs T.stringLiteral . sandwich '\"' $ concat s+  where+    rawString quote insides =+        quote >> manyTill insides quote -      -- Remove \r from strings to fix generated JavaScript-      dewindows [] = []-      dewindows cs =-          let (pre, suf) = break (`elem` ['\r','\n']) cs-          in  pre ++ case suf of -                       ('\r':'\n':rest) -> '\n' : dewindows rest-                       ('\n':rest)      -> '\n' : dewindows rest-                       ('\r':rest)      -> '\n' : dewindows rest-                       _                -> []+    multiStr  = rawString (try (string "\"\"\"")) multilineStringChar+    singleStr = rawString (char '"') stringChar +    stringChar :: IParser String+    stringChar = choice [ newlineChar, escaped '\"', (:[]) <$> satisfy (/= '\"') ]++    multilineStringChar :: IParser String+    multilineStringChar =+        do noEnd+           choice [ newlineChar, escaped '\"', expandQuote <$> anyChar ]+        where+          noEnd = notFollowedBy (string "\"\"\"")+          expandQuote c = if c == '\"' then "\\\"" else [c]++    newlineChar :: IParser String+    newlineChar =+        choice [ char '\n' >> return "\\n"+               , char '\r' >> return "\\r" ]++sandwich :: Char -> String -> String+sandwich delim s = delim : s ++ [delim]++escaped :: Char -> IParser String+escaped delim = try $ do+  char '\\'+  c <- char '\\' <|> char delim+  return ['\\', c]+ chr :: IParser Char-chr = betwixt '\'' '\'' (backslashed <|> satisfy (/='\''))-      <?> "character"+chr = betwixt '\'' '\'' character <?> "character"+    where+      nonQuote = satisfy (/='\'')+      character = do+        c <- choice [ escaped '\''+                    , (:) <$> char '\\' <*> many1 nonQuote+                    , (:[]) <$> nonQuote ]+        processAs T.charLiteral $ sandwich '\'' c++processAs :: (T.GenTokenParser String u SourceM -> IParser a) -> String -> IParser a+processAs processor s = calloutParser s (processor lexer)+    where+      calloutParser :: String -> IParser a -> IParser a+      calloutParser inp p = either (fail . show) return (iParse p inp)++      lexer :: T.GenTokenParser String u SourceM+      lexer = T.makeTokenParser elmDef++      -- I don't know how many of these are necessary for charLiteral/stringLiteral+      elmDef :: T.GenLanguageDef String u SourceM+      elmDef = T.LanguageDef+               { T.commentStart    = "{-"+               , T.commentEnd      = "-}"+               , T.commentLine     = "--"+               , T.nestedComments  = True+               , T.identStart      = undefined+               , T.identLetter     = undefined+               , T.opStart         = undefined+               , T.opLetter        = undefined+               , T.reservedNames   = reserveds+               , T.reservedOpNames = [":", "->", "<-", "|"]+               , T.caseSensitive   = True+               }
compiler/Parse/Literal.hs view
@@ -1,13 +1,12 @@+{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-} module Parse.Literal (literal) where -import Control.Applicative ((<$>), (<*>))-import Control.Monad+import Control.Applicative ((<$>)) import Text.Parsec hiding (newline,spaces)-import Text.Parsec.Indent- import Parse.Helpers import SourceSyntax.Literal +literal :: IParser Literal literal = num <|> (Str <$> str) <|> (Chr <$> chr)  num :: IParser Literal
compiler/Parse/Module.hs view
@@ -1,4 +1,3 @@- module Parse.Module (moduleDef, getModuleName, imports) where  import Control.Applicative ((<$>), (<*>))@@ -6,7 +5,7 @@ import Text.Parsec hiding (newline,spaces)  import Parse.Helpers-import SourceSyntax.Module (Module(..), ImportMethod(..), Imports)+import SourceSyntax.Module (ImportMethod(..), Imports)  varList ::  IParser [String] varList = parens $ commaSep1 (var <|> parens symOp)
compiler/Parse/Parse.hs view
@@ -1,22 +1,19 @@+{-# OPTIONS_GHC -W #-} module Parse.Parse (program, dependencies) where  import Control.Applicative ((<$>), (<*>))-import Control.Monad-import Data.Char (isSymbol, isDigit)-import Data.List (foldl',intercalate)+import qualified Data.List as List import qualified Data.Map as Map import Text.Parsec hiding (newline,spaces) import qualified Text.PrettyPrint as P -import qualified SourceSyntax.Module as S-import SourceSyntax.Declaration (Declaration(Fixity))+import qualified SourceSyntax.Declaration as D+import qualified SourceSyntax.Module as M import Parse.Helpers-import Parse.Binop (OpTable)-import Parse.Expression import Parse.Declaration (infixDecl)-import Parse.Type import Parse.Module import qualified Parse.Declaration as Decl+import Transform.Declaration (combineAnnotations)  freshDef = commitIf (freshLine >> (letter <|> char '_')) $ do              freshLine@@ -25,19 +22,25 @@ decls = do d <- Decl.declaration <?> "at least one datatype or variable definition"            (d:) <$> many freshDef -program :: OpTable -> String -> Either [P.Doc] (S.Module t v)-program table = setupParserWithTable table $ do-  optional freshLine-  (names,exports) <- option (["Main"],[]) (moduleDef `followedBy` freshLine)-  is <- (do try (lookAhead $ reserved "import")-            imports `followedBy` freshLine) <|> return []-  declarations <- decls-  optional freshLine ; optional spaces ; eof-  return $ S.Module names exports is declarations+program :: OpTable -> String -> Either [P.Doc] (M.Module D.Declaration)+program table src =+    do (M.Module names exs ims parseDecls) <- setupParserWithTable table programParser src+       decls <- either (\err -> Left [P.text err]) Right (combineAnnotations parseDecls)+       return $ M.Module names exs ims decls +programParser :: IParser (M.Module D.ParseDeclaration)+programParser =+    do optional freshLine+       (names,exports) <- option (["Main"],[]) (moduleDef `followedBy` freshLine)+       is <- (do try (lookAhead $ reserved "import")+                 imports `followedBy` freshLine) <|> return []+       declarations <- decls+       optional freshLine ; optional spaces ; eof+       return $ M.Module names exports is declarations+ dependencies :: String -> Either [P.Doc] (String, [String]) dependencies =-    let getName = intercalate "." . fst in+    let getName = List.intercalate "." . fst in     setupParser $ do       optional freshLine       (,) <$> option "Main" (getName <$> moduleDef `followedBy` freshLine)@@ -56,12 +59,12 @@       msg overlap =           P.vcat [ P.text "Parse error:"                  , P.text $ "Overlapping definitions for infix operators: " ++-                          intercalate " " (Map.keys overlap)+                          List.intercalate " " (Map.keys overlap)                  ]  parseFixities = do   decls <- onFreshLines (:) [] infixDecl-  return $ Map.fromList [ (op,(lvl,assoc)) | Fixity assoc lvl op <- decls ]+  return $ Map.fromList [ (op,(lvl,assoc)) | D.Fixity assoc lvl op <- decls ]                setupParser :: IParser a -> String -> Either [P.Doc] a setupParser p source =
compiler/Parse/Pattern.hs view
@@ -1,13 +1,10 @@-+{-# OPTIONS_GHC -W #-} module Parse.Pattern (term, expr) where -import Control.Applicative ((<$>),(<*>),pure)-import Control.Monad-import Control.Monad.State+import Control.Applicative ((<$>)) import Data.Char (isUpper) import Data.List (intercalate) import Text.Parsec hiding (newline,spaces,State)-import Text.Parsec.Indent  import Parse.Helpers import Parse.Literal@@ -20,9 +17,10 @@     [ char '_' >> return PAnything     , do v <- var          return $ case v of-                    "True"  -> PLiteral (Boolean True)-                    "False" -> PLiteral (Boolean False)-                    c : _   -> if isUpper c then PData v [] else PVar v+                    "True"          -> PLiteral (Boolean True)+                    "False"         -> PLiteral (Boolean False)+                    c:_ | isUpper c -> PData v []+                    _               -> PVar v     , PLiteral <$> literal     ] 
compiler/Parse/Type.hs view
@@ -1,11 +1,9 @@+{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-} module Parse.Type where -import Control.Applicative ((<$>),(<*>))-import Control.Monad (liftM,mapM)-import Data.Char (isLower)-import Data.List (lookup,intercalate)+import Control.Applicative ((<$>),(<*>),(<*))+import Data.List (intercalate) import Text.Parsec-import Text.Parsec.Indent  import SourceSyntax.Type as T import Parse.Helpers@@ -25,23 +23,24 @@ record :: IParser T.Type record =   do char '{' ; whitespace-     (ext,fs) <- extended <|> normal+     rcrd <- extended <|> normal      dumbWhitespace ; char '}'-     return (T.Record fs ext)+     return rcrd   where-    normal = (,) T.EmptyRecord <$> commaSep fields+    normal = flip T.Record Nothing <$> commaSep field      -- extended record types require at least one field     extended = do-      ext <- try (const <$> tvar <*> (whitespace >> string "|"))+      ext <- try (lowVar <* (whitespace >> string "|"))       whitespace-      (,) ext <$> commaSep1 fields+      flip T.Record (Just ext) <$> commaSep1 field -    fields = do+    field = do       lbl <- rLabel       whitespace >> hasType >> whitespace       (,) lbl <$> expr +capTypeVar :: IParser String capTypeVar = intercalate "." <$> dotSep1 capVar  constructor0 :: IParser T.Type
compiler/SourceSyntax/Declaration.hs view
@@ -1,22 +1,42 @@+{-# OPTIONS_GHC -Wall #-} module SourceSyntax.Declaration where +import Data.Binary import qualified SourceSyntax.Expression as Expr-import SourceSyntax.Type+import qualified SourceSyntax.Type as T import SourceSyntax.PrettyPrint import Text.PrettyPrint as P -data Declaration tipe var-    = Definition (Expr.Def tipe var)-    | Datatype String [String] [(String,[Type])]-    | TypeAlias String [String] Type-    | ImportEvent String (Expr.LExpr tipe var) String Type-    | ExportEvent String String Type+data Declaration' port def+    = Definition def+    | Datatype String [String] [(String,[T.Type])]+    | TypeAlias String [String] T.Type+    | Port port     | Fixity Assoc Int String-      deriving (Eq, Show)+      deriving (Show)  data Assoc = L | N | R-             deriving (Eq)+    deriving (Eq) +data ParsePort+    = PPAnnotation String T.Type+    | PPDef String Expr.LParseExpr+      deriving (Show)++data Port+    = Out String Expr.LExpr T.Type+    | In String T.Type+      deriving (Show)++portName :: Port -> String+portName port =+    case port of+      Out name _ _ -> name+      In name _ -> name++type ParseDeclaration = Declaration' ParsePort Expr.ParseDef+type Declaration = Declaration' Port Expr.Def+ instance Show Assoc where     show assoc =         case assoc of@@ -24,7 +44,17 @@           N -> "non"           R -> "right" -instance Pretty (Declaration t v) where+instance Binary Assoc where+    get = do n <- getWord8+             return $ case n of+                0 -> L+                1 -> N+                2 -> R+                _ -> error "Error reading valid associativity from serialized string"++    put assoc = putWord8 $ case assoc of { L -> 0 ; N -> 1 ; R -> 2 }++instance (Pretty port, Pretty def) => Pretty (Declaration' port def) where   pretty decl =     case decl of       Definition def -> pretty def@@ -35,13 +65,35 @@           where             join c ctor = P.text c <+> prettyCtor ctor             prettyCtor (name, tipes) =-                P.hang (P.text name) 2 (P.sep (map prettyParens tipes))+                P.hang (P.text name) 2 (P.sep (map T.prettyParens tipes))        TypeAlias name tvars tipe ->-          let alias = P.text name <+> P.hsep (map P.text tvars) in-          P.hang (P.text "type" <+> alias <+> P.equals) 4 (pretty tipe)+          P.hang (P.text "type" <+> name' <+> P.equals) 4 (pretty tipe)+          where+            name' = P.text name <+> P.hsep (map P.text tvars) -      -- TODO: Actually write out the contained data in these cases.-      ImportEvent _ _ _ _ -> P.text (show decl)-      ExportEvent _ _ _   -> P.text (show decl)-      Fixity _ _ _        -> P.text (show decl)+      Port port -> pretty port++      Fixity assoc prec op -> P.text "infix" <> assoc' <+> P.int prec <+> P.text op+          where+            assoc' = case assoc of+                       L -> P.text "l"+                       N -> P.empty+                       R -> P.text "r"++instance Pretty ParsePort where+  pretty port =+    case port of+      PPAnnotation name tipe -> prettyPort name ":"  tipe+      PPDef        name expr -> prettyPort name "=" expr++instance Pretty Port where+  pretty port =+    case port of+      In name tipe -> prettyPort name ":" tipe+      Out name expr tipe -> P.vcat [ prettyPort name ":" tipe+                                   , prettyPort name "=" expr ]+          ++prettyPort :: (Pretty a) => String -> String -> a -> Doc+prettyPort name op e = P.text "port" <+> P.text name <+> P.text op <+> pretty e
compiler/SourceSyntax/Expression.hs view
@@ -1,54 +1,106 @@+{-# OPTIONS_GHC -Wall #-}++{-| The Abstract Syntax Tree (AST) for expressions comes in a couple formats.+The first is the fully general version and is labeled with a prime (Expr').+The others are specialized versions of the AST that represent specific phases+of the compilation process. I expect there to be more phases as we begin to+enrich the AST with more information.+-} module SourceSyntax.Expression where -import Data.List (intercalate) import SourceSyntax.PrettyPrint import Text.PrettyPrint as P import qualified SourceSyntax.Helpers as Help import qualified SourceSyntax.Location as Location import qualified SourceSyntax.Pattern as Pattern-import qualified SourceSyntax.Type as Type+import qualified SourceSyntax.Type as SrcType import qualified SourceSyntax.Literal as Literal -type LExpr tipe var = Location.Located (Expr tipe var)-data Expr t v+---- GENERAL AST ----++{-| This is a located expression, meaning it is tagged with info about where it+came from in the source code. Expr' is defined in terms of LExpr' so that the+location information does not need to be an extra field on every constructor.+-}+type LExpr' def = Location.Located (Expr' def)++{-| This is a fully general Abstract Syntax Tree (AST) for expressions. It has+"type holes" that allow us to enrich the AST with additional information as we+move through the compilation process. The type holes let us show these+structural changes in the types. The only type hole right now is:++  def: Parsing allows two kinds of definitions (type annotations or definitions),+       but later checks will see that they are well formed and combine them.++-}+data Expr' def     = Literal Literal.Literal     | Var String-    | Range (LExpr t v) (LExpr t v)-    | ExplicitList [LExpr t v]-    | Binop String (LExpr t v) (LExpr t v)-    | Lambda Pattern.Pattern (LExpr t v)-    | App (LExpr t v) (LExpr t v)-    | MultiIf [(LExpr t v,LExpr t v)]-    | Let [Def t v] (LExpr t v)-    | Case (LExpr t v) [(Pattern.Pattern, LExpr t v)]-    | Data String [LExpr t v]-    | Access (LExpr t v) String-    | Remove (LExpr t v) String-    | Insert (LExpr t v) String (LExpr t v)-    | Modify (LExpr t v) [(String, LExpr t v)]-    | Record [(String, LExpr t v)]-    | Markdown String String [LExpr t v]-      deriving (Eq)+    | Range (LExpr' def) (LExpr' def)+    | ExplicitList [LExpr' def]+    | Binop String (LExpr' def) (LExpr' def)+    | Lambda Pattern.Pattern (LExpr' def)+    | App (LExpr' def) (LExpr' def)+    | MultiIf [(LExpr' def,LExpr' def)]+    | Let [def] (LExpr' def)+    | Case (LExpr' def) [(Pattern.Pattern, LExpr' def)]+    | Data String [LExpr' def]+    | Access (LExpr' def) String+    | Remove (LExpr' def) String+    | Insert (LExpr' def) String (LExpr' def)+    | Modify (LExpr' def) [(String, LExpr' def)]+    | Record [(String, LExpr' def)]+    | Markdown String String [LExpr' def]+    -- for type checking and code gen only+    | PortIn String SrcType.Type+    | PortOut String SrcType.Type (LExpr' def) -data Def tipe var-    = Def Pattern.Pattern (LExpr tipe var)-    | TypeAnnotation String Type.Type-      deriving (Eq, Show) +---- SPECIALIZED ASTs ----++{-| Expressions created by the parser. These use a split representation of type+annotations and definitions, which is how they appear in source code and how+they are parsed.+-}+type ParseExpr = Expr' ParseDef+type LParseExpr = LExpr' ParseDef++data ParseDef+    = Def Pattern.Pattern LParseExpr+    | TypeAnnotation String SrcType.Type+      deriving (Show)++{-| "Normal" expressions. When the compiler checks that type annotations and+ports are all paired with definitions in the appropriate order, it collapses+them into a Def that is easier to work with in later phases of compilation.+-}+type LExpr = LExpr' Def+type Expr = Expr' Def++data Def = Definition Pattern.Pattern LExpr (Maybe SrcType.Type)+    deriving (Show)+++---- UTILITIES ----++tuple :: [LExpr' def] -> Expr' def tuple es = Data ("_Tuple" ++ show (length es)) es +delist :: LExpr' def -> [LExpr' def] delist (Location.L _ (Data "::" [h,t])) = h : delist t delist _ = [] +saveEnvName :: String saveEnvName = "_save_the_environment!!!" +dummyLet :: Pretty def => [def] -> LExpr' def dummyLet defs =       Location.none $ Let defs (Location.none $ Var saveEnvName) -instance Show (Expr t v) where+instance Pretty def => Show (Expr' def) where   show = render . pretty -instance Pretty (Expr t v) where+instance Pretty def => Pretty (Expr' def) where   pretty expr =    case expr of      Literal lit -> pretty lit@@ -59,8 +111,10 @@          P.text "-" <> prettyParens e      Binop op e1 e2 -> P.sep [ prettyParens e1 <+> P.text op', prettyParens e2 ]          where op' = if Help.isOp op then op else "`" ++ op ++ "`"-     Lambda p e -> let (ps,body) = collectLambdas (Location.none $ Lambda p e)-                   in  P.text "\\" <> P.sep ps <+> P.text "->" <+> pretty body+     Lambda p e -> P.text "\\" <> args <+> P.text "->" <+> pretty body+         where+           (ps,body) = collectLambdas (Location.none $ Lambda p e)+           args = P.sep (map Pattern.prettyParens ps)      App _ _ -> P.hang func 2 (P.sep args)          where func:args = map prettyParens (collectApps (Location.none expr))      MultiIf branches ->  P.text "if" $$ nest 3 (vcat $ map iff branches)@@ -73,51 +127,68 @@          P.hang pexpr 2 (P.vcat (map pretty' pats))          where            pexpr = P.sep [ P.text "case" <+> pretty e, P.text "of" ]-           pretty' (p,e) = pretty p <+> P.text "->" <+> pretty e+           pretty' (p,b) = pretty p <+> P.text "->" <+> pretty b      Data "::" [hd,tl] -> pretty hd <+> P.text "::" <+> pretty tl      Data "[]" [] -> P.text "[]"-     Data name es -> P.hang (P.text name) 2 (P.sep (map prettyParens es))+     Data name es+         | Help.isTuple name -> P.parens (commaCat (map pretty es))+         | otherwise -> P.hang (P.text name) 2 (P.sep (map prettyParens es))      Access e x -> prettyParens e <> P.text "." <> variable x      Remove e x -> P.braces (pretty e <+> P.text "-" <+> variable x)      Insert (Location.L _ (Remove e y)) x v ->-         P.braces (pretty e <+> P.text "-" <+> variable y <+> P.text "|" <+> variable x <+> P.text "=" <+> pretty v)+         P.braces (pretty e <+> P.text "-" <+> variable y <+> P.text "|" <+> variable x <+> P.equals <+> pretty v)      Insert e x v ->-         P.braces (pretty e <+> P.text "|" <+> variable x <+> P.text "=" <+> pretty v)+         P.braces (pretty e <+> P.text "|" <+> variable x <+> P.equals <+> pretty v)       Modify e fs ->          P.braces $ P.hang (pretty e <+> P.text "|")                            4                            (commaSep $ map field fs)        where-         field (x,e) = variable x <+> P.text "<-" <+> pretty e+         field (k,v) = variable k <+> P.text "<-" <+> pretty v       Record fs ->          P.braces $ P.nest 2 (commaSep $ map field fs)        where-         field (x,e) = variable x <+> P.text "=" <+> pretty e+         field (x,e) = variable x <+> P.equals <+> pretty e       Markdown _ _ _ -> P.text "[markdown| ... |]" -instance Pretty (Def t v) where+     PortIn name _ -> P.text $ "<port:" ++ name ++ ">"++     PortOut _ _ signal -> pretty signal++instance Pretty ParseDef where   pretty def =    case def of      TypeAnnotation name tipe ->-         variable name <+> P.text ":" <+> pretty tipe+         variable name <+> P.colon <+> pretty tipe      Def pattern expr ->-         pretty pattern <+> P.text "=" <+> pretty expr+         pretty pattern <+> P.equals <+> pretty expr +instance Pretty Def where+  pretty (Definition pattern expr maybeTipe) =+      P.vcat [ annotation, definition ]+      where+        definition = pretty pattern <+> P.equals <+> pretty expr+        annotation = case maybeTipe of+                       Nothing -> P.empty+                       Just tipe -> pretty pattern <+> P.colon <+> pretty tipe++collectApps :: LExpr' def -> [LExpr' def] collectApps lexpr@(Location.L _ expr) =   case expr of     App a b -> collectApps a ++ [b]     _ -> [lexpr] +collectLambdas :: LExpr' def -> ([Pattern.Pattern], LExpr' def) collectLambdas lexpr@(Location.L _ expr) =   case expr of-    Lambda pattern body ->-        let (ps, body') = collectLambdas body-        in  (pretty pattern : ps, body')+    Lambda pattern body -> (pattern : ps, body')+        where (ps, body') = collectLambdas body     _ -> ([], lexpr) +prettyParens :: (Pretty def) => LExpr' def -> Doc prettyParens (Location.L _ expr) = parensIf needed (pretty expr)   where     needed =@@ -128,5 +199,5 @@         MultiIf _   -> True         Let _ _     -> True         Case _ _    -> True-        Data name (x:xs) -> name /= "::"+        Data name (_:_) -> name /= "::"         _ -> False
compiler/SourceSyntax/Helpers.hs view
@@ -1,4 +1,4 @@-+{-# OPTIONS_GHC -Wall #-} module SourceSyntax.Helpers where  import qualified Data.Char as Char
compiler/SourceSyntax/Literal.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_GHC -Wall #-} module SourceSyntax.Literal where  import SourceSyntax.PrettyPrint@@ -8,13 +9,13 @@              | Chr Char              | Str String              | Boolean Bool-               deriving (Eq, Ord, Show)+             deriving (Eq, Ord, Show)  instance Pretty Literal where   pretty literal =     case literal of       IntNum n -> PP.int n       FloatNum n -> PP.double n-      Chr c -> PP.quotes (PP.char c)-      Str s -> PP.text (show s)+      Chr c -> PP.text . show $ c+      Str s -> PP.text . show $ s       Boolean bool -> PP.text (show bool)
compiler/SourceSyntax/Module.hs view
@@ -1,21 +1,18 @@+{-# OPTIONS_GHC -Wall #-} module SourceSyntax.Module where  import Data.Binary-import Data.List (intercalate) import qualified Data.Map as Map import Control.Applicative ((<$>), (<*>))-import Control.Arrow (second)  import SourceSyntax.Expression (LExpr) import SourceSyntax.Declaration import SourceSyntax.Type-import System.FilePath (joinPath)-import Control.Monad (liftM)  import qualified Elm.Internal.Version as Version -data Module tipe var =-    Module [String] Exports Imports [Declaration tipe var]+data Module def =+    Module [String] Exports Imports [def]     deriving (Show)  type Exports = [String]@@ -25,48 +22,50 @@                     deriving (Eq, Ord, Show)  instance Binary ImportMethod where-    put (As s)          = do put (0 :: Word8)-                             put s--    put (Importing ss) = do put (1 :: Word8)-                            put ss--    put (Hiding ss)    = do put (2 :: Word8)-                            put ss+    put method =+        let put' n info = putWord8 n >> put info in+        case method of+          As s         -> put' 0 s+          Importing ss -> put' 1 ss+          Hiding ss    -> put' 2 ss      get = do tag <- getWord8              case tag of-               0 -> liftM As        get-               1 -> liftM Importing get-               2 -> liftM Hiding    get+               0 -> As        <$> get+               1 -> Importing <$> get+               2 -> Hiding    <$> get                _ -> error "Error reading valid ImportMethod type from serialized string" -data MetadataModule t v = MetadataModule {-    names     :: [String],-    path      :: FilePath,-    exports   :: [String],-    imports   :: [(String, ImportMethod)],-    program   :: LExpr t v,-    types     :: Map.Map String Type,-    fixities  :: [(Assoc, Int, String)],-    aliases   :: [(String, [String], Type)],-    datatypes :: [ (String, [String], [(String,[Type])]) ],-    foreignImports :: [(String, LExpr t v, String, Type)],-    foreignExports :: [(String, String, Type)]-} deriving Show+data MetadataModule =+    MetadataModule+    { names     :: [String]+    , path      :: FilePath+    , exports   :: [String]+    , imports   :: [(String, ImportMethod)]+    , program   :: LExpr+    , types     :: Map.Map String Type+    , fixities  :: [(Assoc, Int, String)]+    , aliases   :: [Alias]+    , datatypes :: [ADT]+    , ports     :: [String]+    } deriving Show  type Interfaces = Map.Map String ModuleInterface type ADT = (String, [String], [(String,[Type])])+type Alias = (String, [String], Type) -data ModuleInterface = ModuleInterface {-    iVersion  :: Version.Version,-    iTypes    :: Map.Map String Type,-    iImports  :: [(String, ImportMethod)],-    iAdts     :: [ADT],-    iAliases  :: [(String, [String], Type)],-    iFixities :: [(Assoc, Int, String)]-} deriving Show+data ModuleInterface =+    ModuleInterface+    { iVersion  :: Version.Version+    , iTypes    :: Map.Map String Type+    , iImports  :: [(String, ImportMethod)]+    , iAdts     :: [ADT]+    , iAliases  :: [Alias]+    , iFixities :: [(Assoc, Int, String)]+    , iPorts    :: [String]+    } deriving Show +metaToInterface :: MetadataModule -> ModuleInterface metaToInterface metaModule =     ModuleInterface     { iVersion  = Version.elmVersion@@ -75,10 +74,11 @@     , iAdts     = datatypes metaModule     , iAliases  = aliases metaModule     , iFixities = fixities metaModule+    , iPorts = ports metaModule     }  instance Binary ModuleInterface where-  get = ModuleInterface <$> get <*> get <*> get <*> get <*> get <*> get+  get = ModuleInterface <$> get <*> get <*> get <*> get <*> get <*> get <*> get   put modul = do       put (iVersion modul)       put (iTypes modul)@@ -86,14 +86,4 @@       put (iAdts modul)       put (iAliases modul)       put (iFixities modul)---instance Binary Assoc where-    get = do n <- getWord8-             return $ case n of-                0 -> L-                1 -> N-                2 -> R-                _ -> error "Error reading valid associativity from serialized string"--    put assoc = putWord8 $ case assoc of { L -> 0 ; N -> 1 ; R -> 2 }+      put (iPorts modul)
compiler/SourceSyntax/Pattern.hs view
@@ -1,9 +1,10 @@+{-# OPTIONS_GHC -Wall #-} module SourceSyntax.Pattern where -import Data.List (intercalate)-import SourceSyntax.Helpers as Help+import qualified SourceSyntax.Helpers as Help import SourceSyntax.PrettyPrint import Text.PrettyPrint as PP+import qualified Data.Set as Set import SourceSyntax.Literal as Literal  data Pattern = PData String [Pattern]@@ -14,12 +15,29 @@              | PLiteral Literal.Literal                deriving (Eq, Ord, Show) +cons :: Pattern -> Pattern -> Pattern cons h t = PData "::" [h,t]-nil      = PData "[]" []++nil :: Pattern+nil = PData "[]" []++list :: [Pattern] -> Pattern list     = foldr cons nil++tuple :: [Pattern] -> Pattern tuple es = PData ("_Tuple" ++ show (length es)) es +boundVars :: Pattern -> Set.Set String+boundVars pattern =+    case pattern of+      PVar x -> Set.singleton x+      PAlias x p -> Set.insert x (boundVars p)+      PData _ ps -> Set.unions (map boundVars ps)+      PRecord fields -> Set.fromList fields+      PAnything -> Set.empty+      PLiteral _ -> Set.empty + instance Pretty Pattern where   pretty pattern =    case pattern of@@ -33,14 +51,15 @@                         PData "::" _ -> True                         _ -> False      PData name ps ->-        if isTuple name then+        if Help.isTuple name then             PP.parens . commaCat $ map pretty ps-        else sep (PP.text name : map prettyParens ps)+        else hsep (PP.text name : map prettyParens ps) +prettyParens :: Pattern -> Doc prettyParens pattern = parensIf needsThem (pretty pattern)   where     needsThem =       case pattern of-        PData name (_:_) | not (isTuple name) -> True+        PData name (_:_) | not (Help.isTuple name) -> True         PAlias _ _ -> True         _ -> False
compiler/SourceSyntax/Type.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_GHC -W #-} module SourceSyntax.Type where  import Data.Binary@@ -10,16 +11,15 @@ data Type = Lambda Type Type           | Var String           | Data String [Type]-          | EmptyRecord-          | Record [(String,Type)] Type-            deriving (Eq, Show)+          | Record [(String,Type)] (Maybe String)+            deriving (Eq)  fieldMap :: [(String,a)] -> Map.Map String [a] fieldMap fields =     foldl (\r (x,t) -> Map.insertWith (++) x [t] r) Map.empty fields  recordOf :: [(String,Type)] -> Type-recordOf fields = Record fields EmptyRecord+recordOf fields = Record fields Nothing  listOf :: Type -> Type listOf t = Data "_List" [t]@@ -27,39 +27,39 @@ tupleOf :: [Type] -> Type tupleOf ts = Data ("_Tuple" ++ show (length ts)) ts +instance Show Type where+  show = render . pretty  instance Pretty Type where   pretty tipe =     case tipe of-      Lambda t1 t2 -> P.sep [ t, P.sep (map (P.text "->" <+>) ts) ]-        where t:ts = collectLambdas tipe+      Lambda _ _ -> P.sep [ t, P.sep (map (P.text "->" <+>) ts) ]+        where+          t:ts = map prettyLambda (collectLambdas tipe)+          prettyLambda t = case t of+                             Lambda _ _ -> P.parens (pretty t)+                             _ -> pretty t+       Var x -> P.text x       Data "_List" [t] -> P.brackets (pretty t)       Data name tipes           | Help.isTuple name -> P.parens . P.sep . P.punctuate P.comma $ map pretty tipes           | otherwise -> P.hang (P.text name) 2 (P.sep $ map prettyParens tipes)-      EmptyRecord -> P.braces P.empty-      Record _ _ -> P.braces $ case ext of-                                 EmptyRecord -> prettyFields-                                 _ -> P.hang (pretty ext <+> P.text "|") 4 prettyFields+      Record fields ext ->+          P.braces $ case ext of+                       Nothing -> prettyFields+                       Just x -> P.hang (P.text x <+> P.text "|") 4 prettyFields           where-            (fields, ext) = collectRecords tipe             prettyField (f,t) = P.text f <+> P.text ":" <+> pretty t             prettyFields = commaSep . map prettyField $ fields +collectLambdas :: Type -> [Type] collectLambdas tipe =   case tipe of-    Lambda arg@(Lambda _ _) body -> P.parens (pretty arg) : collectLambdas body-    Lambda arg body -> pretty arg : collectLambdas body-    _ -> [pretty tipe]--collectRecords = go []-  where-    go fields tipe =-        case tipe of-          Record fs ext -> go (fs ++ fields) ext-          _ -> (fields, tipe)+    Lambda arg body -> arg : collectLambdas body+    _ -> [tipe] +prettyParens :: Type -> Doc prettyParens tipe = parensIf needed (pretty tipe)   where     needed =@@ -79,10 +79,8 @@             putWord8 1 >> put x         Data ctor tipes ->             putWord8 2 >> put ctor >> put tipes-        EmptyRecord ->-            putWord8 3         Record fs ext ->-            putWord8 4 >> put fs >> put ext+            putWord8 3 >> put fs >> put ext    get = do       n <- getWord8@@ -90,6 +88,5 @@         0 -> Lambda <$> get <*> get         1 -> Var <$> get         2 -> Data <$> get <*> get-        3 -> return EmptyRecord-        4 -> Record <$> get <*> get+        3 -> Record <$> get <*> get         _ -> error "Error reading a valid type from serialized string"
compiler/Transform/Canonicalize.hs view
@@ -1,7 +1,10 @@+{-# OPTIONS_GHC -W #-} module Transform.Canonicalize (interface, metadataModule) where  import Control.Arrow ((***))+import Control.Applicative (Applicative,(<$>),(<*>)) import Control.Monad.Identity+import qualified Data.Traversable as T import qualified Data.Map as Map import qualified Data.Set as Set import qualified Data.List as List@@ -9,10 +12,8 @@ import SourceSyntax.Module import SourceSyntax.Expression import SourceSyntax.Location as Loc-import SourceSyntax.Pattern-import SourceSyntax.Helpers (isOp)+import qualified SourceSyntax.Pattern as P import qualified SourceSyntax.Type as Type-import qualified Transform.SortDefinitions as SD import Text.PrettyPrint as P  interface :: String -> ModuleInterface -> ModuleInterface@@ -24,6 +25,7 @@     , iAdts = map (both prefix renameCtors) (iAdts iface)     , iAliases = map (both prefix renameType') (iAliases iface)     , iFixities = iFixities iface -- cannot have canonicalized operators while parsing+    , iPorts = iPorts iface     }   where     both f g (a,b,c) = (f a, b, g c)@@ -39,38 +41,30 @@     renameType' =         runIdentity . renameType (\name -> return $ Map.findWithDefault name name canons) -renameType :: (Monad m) => (String -> m String) -> Type.Type -> m Type.Type-renameType rename tipe =-    let rnm = renameType rename in+renameType :: (Applicative m, Monad m) => (String -> m String) -> Type.Type -> m Type.Type+renameType renamer tipe =+    let rnm = renameType renamer in     case tipe of-      Type.Lambda a b -> Type.Lambda `liftM` rnm a `ap` rnm b-      Type.Var x -> return tipe-      Type.Data name ts -> Type.Data `liftM` rename name `ap` mapM rnm ts-      Type.EmptyRecord -> return tipe-      Type.Record fields ext -> Type.Record `liftM` mapM rnm' fields `ap` rnm ext-          where rnm' (f,t) = (,) f `liftM` rnm t+      Type.Lambda a b -> Type.Lambda <$> rnm a <*> rnm b+      Type.Var _ -> return tipe+      Type.Data name ts -> Type.Data <$> renamer name <*> mapM rnm ts+      Type.Record fields ext -> Type.Record <$> mapM rnm' fields <*> return ext+          where rnm' (f,t) = (,) f <$> rnm t -metadataModule :: Interfaces -> MetadataModule t v -> Either [Doc] (MetadataModule t v)+metadataModule :: Interfaces -> MetadataModule -> Either [Doc] MetadataModule metadataModule ifaces modul =-  do _ <- case filter (\m -> Map.notMember m ifaces) (map fst realImports) of-            [] -> Right ()-            missings -> Left [ P.text $ "The following imports were not found: " ++ List.intercalate ", " missings ]+  do case filter (\m -> Map.notMember m ifaces) (map fst realImports) of+       [] -> Right ()+       missings -> Left [ P.text $ "The following imports were not found: " ++ List.intercalate ", " missings ]      program' <- rename initialEnv (program modul)-     aliases' <- mapM (third renameType') (aliases modul)-     datatypes' <- mapM (third (mapM (second (mapM renameType')))) (datatypes modul)-     exports' <- mapM (third renameType') (foreignExports modul)-     imports' <- mapM (twoAndFour (rename initialEnv) renameType') (foreignImports modul)+     aliases' <- mapM (three3 renameType') (aliases modul)+     datatypes' <- mapM (three3 (mapM (two2 (mapM renameType')))) (datatypes modul)      return $ modul { program = program'                     , aliases = aliases'-                    , datatypes = datatypes'-                    , foreignExports = exports'-                    , foreignImports = imports' }+                    , datatypes = datatypes' }   where-    second f (a,b) = (,) a `fmap` f b-    third f (a,b,c) = (,,) a b `fmap` f c-    twoAndFour f g (a,b,c,d) = do b' <- f b-                                  d' <- g d-                                  return (a,b',c,d')+    two2 f (a,b) = (,) a <$> f b+    three3 f (a,b,c) = (,,) a b <$> f c     renameType' =         Either.either (\err -> Left [P.text err]) return . renameType (replace "type" initialEnv) @@ -88,18 +82,19 @@               Importing vars -> map (pair "") $ filter (flip Set.member vs) allNames                   where vs = Set.fromList $ map (\v -> name ++ "." ++ v) vars -    pair n = (n,n)-    localEnv = map pair (map get1 (aliases modul) ++ map get1 (datatypes modul))-    globalEnv = map pair $ ["_List",saveEnvName,"::","[]","Int","Float","Char","Bool","String"] ++-                           map (\n -> "_Tuple" ++ show n) [0..9]+    two n = (n,n)+    localEnv = map two (map get1 (aliases modul) ++ map get1 (datatypes modul))+    globalEnv =+        map two $ ["_List",saveEnvName,"::","[]","Int","Float","Char","Bool","String"] +++                  map (\n -> "_Tuple" ++ show (n :: Int)) [0..9]     realImports = filter (not . List.isPrefixOf "Native." . fst) (imports modul)     initialEnv = Map.fromList (concatMap canon realImports ++ localEnv ++ globalEnv)  type Env = Map.Map String String -extend :: Env -> Pattern -> Env+extend :: Env -> P.Pattern -> Env extend env pattern = Map.union (Map.fromList (zip xs xs)) env-    where xs = Set.toList (SD.boundVars pattern)+    where xs = Set.toList (P.boundVars pattern)   replace :: String -> Env -> String -> Either String String@@ -113,76 +108,76 @@             msg = if null matches then "" else                       "\nClose matches include: " ++ List.intercalate ", " matches -rename :: Env -> LExpr t v -> Either [Doc] (LExpr t v)-rename env lexpr@(L s expr) =+rename :: Env -> LExpr -> Either [Doc] LExpr+rename env (L s expr) =     let rnm = rename env         throw err = Left [ P.text $ "Error " ++ show s ++ "\n" ++ err ]         format = Either.either throw return+        renameType' env = renameType (format . replace "variable" env)     in-    L s `liftM`+    L s <$>     case expr of-      Literal lit -> return expr+      Literal _ -> return expr -      Range e1 e2 -> Range `liftM` rnm e1 `ap` rnm e2+      Range e1 e2 -> Range <$> rnm e1 <*> rnm e2 -      Access e x -> Access `liftM` rnm e `ap` return x+      Access e x -> Access <$> rnm e <*> return x -      Remove e x -> flip Remove x `liftM` rnm e+      Remove e x -> flip Remove x <$> rnm e -      Insert e x v -> flip Insert x `liftM` rnm e `ap` rnm v+      Insert e x v -> flip Insert x <$> rnm e <*> rnm v        Modify e fs ->-          Modify `liftM` rnm e `ap` mapM (\(x,e) -> (,) x `liftM` rnm e) fs+          Modify <$> rnm e <*> mapM (\(k,v) -> (,) k <$> rnm v) fs -      Record fs -> Record `liftM` mapM frnm fs-          where-            frnm (f,e) = (,) f `liftM` rename env e+      Record fs -> Record <$> mapM (\(k,v) -> (,) k <$> rnm v) fs        Binop op e1 e2 ->           do op' <- format (replace "variable" env op)-             Binop op' `liftM` rnm e1 `ap` rnm e2+             Binop op' <$> rnm e1 <*> rnm e2        Lambda pattern e ->           let env' = extend env pattern in-          Lambda `liftM` format (renamePattern env' pattern) `ap` rename env' e+          Lambda <$> format (renamePattern env' pattern) <*> rename env' e -      App e1 e2 -> App `liftM` rnm e1 `ap` rnm e2+      App e1 e2 -> App <$> rnm e1 <*> rnm e2 -      MultiIf ps -> MultiIf `liftM` mapM grnm ps-              where grnm (b,e) = (,) `liftM` rnm b `ap` rnm e+      MultiIf ps -> MultiIf <$> mapM grnm ps+              where grnm (b,e) = (,) <$> rnm b <*> rnm e -      Let defs e -> Let `liftM` mapM rename' defs `ap` rename env' e+      Let defs e -> Let <$> mapM rename' defs <*> rename env' e           where-            env' = foldl extend env [ pattern | Def pattern _ <- defs ]-            rename' def =-                case def of-                  Def p exp ->-                      Def `liftM` format (renamePattern env' p) `ap` rename env' exp-                  TypeAnnotation name tipe ->-                      TypeAnnotation name `liftM`-                          renameType (format . replace "variable" env') tipe+            env' = foldl extend env $ map (\(Definition p _ _) -> p) defs+            rename' (Definition p body mtipe) =+                Definition <$> format (renamePattern env' p)+                           <*> rename env' body+                           <*> T.traverse (renameType' env') mtipe -      Var x -> Var `liftM` format (replace "variable" env x)+      Var x -> Var <$> format (replace "variable" env x) -      Data name es -> Data name `liftM` mapM rnm es+      Data name es -> Data name <$> mapM rnm es -      ExplicitList es -> ExplicitList `liftM` mapM rnm es+      ExplicitList es -> ExplicitList <$> mapM rnm es -      Case e cases -> Case `liftM` rnm e `ap` mapM branch cases+      Case e cases -> Case <$> rnm e <*> mapM branch cases           where-            branch (pattern,e) = (,) `liftM` format (renamePattern env pattern)-                                        `ap` rename (extend env pattern) e+            branch (pattern,b) = (,) <$> format (renamePattern env pattern)+                                     <*> rename (extend env pattern) b -      Markdown uid md es -> Markdown uid md `liftM` mapM rnm es+      Markdown uid md es -> Markdown uid md <$> mapM rnm es +      PortIn name st -> PortIn name <$> renameType' env st -renamePattern :: Env -> Pattern -> Either String Pattern+      PortOut name st signal -> PortOut name <$> renameType' env st <*> rnm signal+++renamePattern :: Env -> P.Pattern -> Either String P.Pattern renamePattern env pattern =     case pattern of-      PVar _ -> return pattern-      PLiteral _ -> return pattern-      PRecord _ -> return pattern-      PAnything -> return pattern-      PAlias x p -> PAlias x `liftM` renamePattern env p-      PData name ps -> PData `liftM` replace "pattern" env name-                                `ap` mapM (renamePattern env) ps+      P.PVar _ -> return pattern+      P.PLiteral _ -> return pattern+      P.PRecord _ -> return pattern+      P.PAnything -> return pattern+      P.PAlias x p -> P.PAlias x <$> renamePattern env p+      P.PData name ps -> P.PData <$> replace "pattern" env name+                                 <*> mapM (renamePattern env) ps
compiler/Transform/Check.hs view
@@ -1,114 +1,87 @@+{-# OPTIONS_GHC -Wall #-} module Transform.Check (mistakes) where -import Transform.SortDefinitions (boundVars)-import SourceSyntax.Declaration (Declaration(..))-import SourceSyntax.Expression-import SourceSyntax.Pattern-import SourceSyntax.Location-import SourceSyntax.PrettyPrint-import qualified SourceSyntax.Type as T-import Data.List as List-import qualified Data.Map as Map+import qualified Control.Arrow as Arrow+import qualified Data.List as List import qualified Data.Maybe as Maybe import qualified Data.Set as Set++import qualified SourceSyntax.Expression as E+import qualified SourceSyntax.Declaration as D+import qualified SourceSyntax.Pattern as Pattern+import qualified SourceSyntax.Type as T+import qualified Transform.Expression as Expr++import SourceSyntax.PrettyPrint import Text.PrettyPrint as P  -mistakes :: [Declaration t v] -> [Doc]+mistakes :: [D.Declaration] -> [Doc] mistakes decls =     concat [ infiniteTypeAliases decls            , illFormedTypes decls            , map P.text (duplicateConstructors decls)-           , map P.text (concatMap findErrors (getLets decls)) ]-  where-    findErrors defs = duplicates defs ++ badOrder defs--getLets :: [Declaration t v] -> [[Def t v]]-getLets decls = defs : concatMap defLets defs-    where-      defs = [ d | Definition d <- decls ]--      defLets def =-          case def of-            TypeAnnotation _ _ -> []-            Def _ expr -> exprLets expr--      exprLets (L _ expr) =-          case expr of-            Var _ -> []-            Lambda p e -> exprLets e-            Binop op e1 e2 -> exprLets e1 ++ exprLets e2-            Case e cases -> exprLets e ++ concatMap (exprLets . snd) cases-            Data name es -> concatMap exprLets es-            Literal _ -> []-            Range e1 e2 -> exprLets e1 ++ exprLets e2-            ExplicitList es -> concatMap exprLets es-            App e1 e2 -> exprLets e1 ++ exprLets e2-            MultiIf branches -> concatMap (\(b,e) -> exprLets b ++ exprLets e) branches-            Access e lbl -> exprLets e-            Remove e lbl -> exprLets e-            Insert e lbl v -> exprLets e ++ exprLets v-            Modify e fields -> exprLets e ++ concatMap (exprLets . snd) fields-            Record fields -> concatMap (exprLets . snd) fields-            Markdown uid md es -> []-            Let defs body -> [defs] ++ exprLets body+           , map P.text (duplicates decls) ] -dups :: Eq a => [a] -> [a]-dups  = map head . filter ((>1) . length) . List.group+dups :: Ord a => [a] -> [a]+dups  = map head . filter ((>1) . length) . List.group . List.sort  dupErr :: String -> String -> String dupErr err x =    "Syntax Error: There can only be one " ++ err ++ " '" ++ x ++ "'." -duplicates :: [Def t v] -> [String]-duplicates defs =-    map defMsg (dups definitions) ++ map annMsg (dups annotations)-  where-    annotations = List.sort [ name | TypeAnnotation name _ <- defs ]-    definitions = List.sort $ concatMap Set.toList [ boundVars pattern | Def pattern _ <- defs ]-    defMsg = dupErr "definition of"-    annMsg = dupErr "type annotation for"+duplicates :: [D.Declaration] -> [String]+duplicates decls =+    map msg (dups (portNames ++ concatMap getNames defPatterns)) +++    case mapM exprDups (portExprs ++ defExprs) of+      Left name -> [msg name]+      Right _   -> [] -duplicateConstructors :: [Declaration t v] -> [String]-duplicateConstructors decls = -    map typeMsg (dups typeCtors) ++ map dataMsg (dups dataCtors)   where-    typeCtors = List.sort [ name | Datatype name _ _ <- decls ]-    dataCtors = List.sort . concat $-      [ map fst patterns | Datatype _ _ patterns <- decls ]-    dataMsg = dupErr "definition of data constructor"-    typeMsg = dupErr "definition of type constructor"+    msg = dupErr "definition of" -badOrder :: [Def t v] -> [String]-badOrder defs = go defs-    where-      msg x = "Syntax Error: The type annotation for '" ++ x ++-              "' must be directly above its definition."+    (defPatterns, defExprs) =+        unzip [ (pat,expr) | D.Definition (E.Definition pat expr _) <- decls ] -      go defs =-          case defs of-            TypeAnnotation name _ : Def (PVar name') _ : rest-                | name == name' -> go rest+    (portNames, portExprs) =+        Arrow.second concat $ unzip $ +        flip map [ port | D.Port port <- decls ] $ \port ->+            case port of+              D.Out name expr _ -> (name, [expr])+              D.In name _ -> (name, []) -            TypeAnnotation name _  : rest -> [msg name] ++ go rest+    getNames = Set.toList . Pattern.boundVars -            _ : rest -> go rest+    exprDups :: E.LExpr -> Either String E.LExpr+    exprDups expr = Expr.crawlLet defsDups expr -            _ -> []+    defsDups :: [E.Def] -> Either String [E.Def]+    defsDups defs =+        case dups $ concatMap (\(E.Definition name _ _) -> getNames name) defs of+          []     -> Right defs+          name:_ -> Left name -illFormedTypes :: [Declaration t v] -> [Doc]+duplicateConstructors :: [D.Declaration] -> [String]+duplicateConstructors decls = +    map (dupErr "definition of type constructor") (dups typeCtors) +++    map (dupErr "definition of data constructor") (dups dataCtors)+  where+    typeCtors = [ name | D.Datatype name _ _ <- decls ]+    dataCtors = concat [ map fst patterns | D.Datatype _ _ patterns <- decls ]++illFormedTypes :: [D.Declaration] -> [Doc] illFormedTypes decls = map report (Maybe.mapMaybe isIllFormed (aliases ++ adts))     where-      aliases = [ (decl, tvars, [tipe]) | decl@(TypeAlias _ tvars tipe) <- decls ]-      adts = [ (decl, tvars, concatMap snd ctors) | decl@(Datatype _ tvars ctors) <- decls ]+      aliases = [ (decl, tvars, [tipe]) | decl@(D.TypeAlias _ tvars tipe) <- decls ]+      adts = [ (decl, tvars, concatMap snd ctors) | decl@(D.Datatype _ tvars ctors) <- decls ]        freeVars tipe =           case tipe of             T.Lambda t1 t2 -> Set.union (freeVars t1) (freeVars t2)             T.Var x -> Set.singleton x             T.Data _ ts -> Set.unions (map freeVars ts)-            T.EmptyRecord -> Set.empty-            T.Record fields ext -> Set.unions (freeVars ext : map (freeVars . snd) fields)+            T.Record fields ext -> Set.unions (ext' : map (freeVars . snd) fields)+                where ext' = maybe Set.empty Set.singleton ext        undeclared tvars tipes = Set.difference used declared           where@@ -132,7 +105,7 @@              addCommas xs                 | length xs < 3 = concat xs-                | otherwise = intercalate "," xs+                | otherwise = List.intercalate "," xs              addAnd xs                 | length xs < 2 = xs@@ -141,29 +114,30 @@             quote tvar = "'" ++ tvar ++ "'"  -infiniteTypeAliases :: [Declaration t v] -> [Doc]+infiniteTypeAliases :: [D.Declaration] -> [Doc] infiniteTypeAliases decls =-    [ report decl | decl@(TypeAlias name _ tipe) <- decls, isInfinite name tipe ]+    [ report name tvars tipe | D.TypeAlias name tvars tipe <- decls+                             , infiniteType name tipe ]     where-      isInfinite name tipe =-          let infinite = isInfinite name in+      infiniteType name tipe =+          let infinite = infiniteType name in           case tipe of             T.Lambda a b -> infinite a || infinite b             T.Var _ -> False             T.Data name' ts -> name == name' || any infinite ts-            T.EmptyRecord -> False-            T.Record fields ext -> infinite ext || any (infinite . snd) fields+            T.Record fields _ -> any (infinite . snd) fields -      report decl@(TypeAlias name args tipe) =+      indented :: D.Declaration -> Doc+      indented decl = P.text "\n    " <> pretty decl <> P.text "\n"++      report name args tipe =           P.vcat [ P.text $ eightyCharLines 0 msg1-                 , indented decl+                 , indented $ D.TypeAlias name args tipe                  , P.text $ eightyCharLines 0 msg2-                 , indented (Datatype name args [(name,[tipe])])+                 , indented $ D.Datatype name args [(name,[tipe])]                  , P.text $ eightyCharLines 0 msg3 ++ "\n"                  ]           where-            indented decl = P.text "\n    " <> pretty decl <> P.text "\n"-             msg1 = "Type alias '" ++ name ++ "' is an infinite type. " ++                    "Notice that it appears in its own definition, so when \                    \you expand it, it just keeps getting bigger:"
+ compiler/Transform/Declaration.hs view
@@ -0,0 +1,63 @@+{-# OPTIONS_GHC -Wall #-}+module Transform.Declaration where++import Control.Applicative ((<$>))+import qualified SourceSyntax.Pattern as P+import SourceSyntax.Expression as E+import SourceSyntax.Declaration as D++import qualified Transform.Expression as Expr+import qualified Transform.Definition as Def+++combineAnnotations :: [ParseDeclaration] -> Either String [Declaration]+combineAnnotations = go+    where+      msg x = "Syntax Error: The type annotation for '" ++ x +++              "' must be directly above its definition."++      exprCombineAnnotations = Expr.crawlLet Def.combineAnnotations++      go decls =+          case decls of+            -- simple cases, pass them through with no changes+            [] -> return []++            Datatype name tvars ctors : rest ->+                (:) (Datatype name tvars ctors) <$> go rest++            TypeAlias name tvars alias : rest ->+                (:) (TypeAlias name tvars alias) <$> go rest++            Fixity assoc prec op : rest ->+                (:) (Fixity assoc prec op) <$> go rest++            -- combine definitions+            D.Definition def : defRest ->+                case def of+                  Def pat expr ->+                      do expr' <- exprCombineAnnotations expr+                         let def' = E.Definition pat expr' Nothing+                         (:) (D.Definition def') <$> go defRest++                  TypeAnnotation name tipe ->+                      case defRest of+                        D.Definition (Def pat@(P.PVar name') expr) : rest | name == name' ->+                            do expr' <- exprCombineAnnotations expr+                               let def' = E.Definition pat expr' (Just tipe)+                               (:) (D.Definition def') <$> go rest++                        _ -> Left (msg name)++            -- combine ports+            Port port : portRest ->+                case port of+                  PPDef name _ -> Left (msg name)+                  PPAnnotation name tipe ->+                      case portRest of+                        Port (PPDef name' expr) : rest | name == name' ->+                            do expr' <- exprCombineAnnotations expr+                               (:) (Port (Out name expr' tipe)) <$> go rest++                        _ -> (:) (Port (In name tipe)) <$> go portRest+
+ compiler/Transform/Definition.hs view
@@ -0,0 +1,31 @@+{-# OPTIONS_GHC -Wall #-}+module Transform.Definition where++import Control.Applicative ((<$>))+import qualified SourceSyntax.Pattern as P+import SourceSyntax.Expression+import qualified Transform.Expression as Expr++combineAnnotations :: [ParseDef] -> Either String [Def]+combineAnnotations = go+    where+      msg x = "Syntax Error: The type annotation for '" ++ x +++              "' must be directly above its definition."++      exprCombineAnnotations = Expr.crawlLet combineAnnotations++      go defs =+          case defs of+            TypeAnnotation name tipe : Def pat@(P.PVar name') expr : rest | name == name' ->+                do expr' <- exprCombineAnnotations expr+                   let def = Definition pat expr' (Just tipe)+                   (:) def <$> go rest++            TypeAnnotation name _  : _ -> Left (msg name)++            Def pat expr : rest ->+                do expr' <- exprCombineAnnotations expr+                   let def = Definition pat expr' Nothing+                   (:) def <$> go rest++            [] -> return []
+ compiler/Transform/Expression.hs view
@@ -0,0 +1,55 @@+{-# OPTIONS_GHC -Wall #-}+module Transform.Expression (crawlLet, checkPorts) where++import Control.Applicative ((<$>),(<*>))+import SourceSyntax.Expression+import SourceSyntax.Location+import qualified SourceSyntax.Type as ST++crawlLet :: ([def] -> Either a [def']) -> LExpr' def -> Either a (LExpr' def')+crawlLet = crawl (\_ _ -> return ()) (\_ _ -> return ())++checkPorts :: (String -> ST.Type -> Either a ())+           -> (String -> ST.Type -> Either a ())+           -> LExpr+           -> Either a LExpr+checkPorts inCheck outCheck expr =+    crawl inCheck outCheck (mapM checkDef) expr+    where+      checkDef def@(Definition _ body _) =+          do _ <- checkPorts inCheck outCheck body+             return def++crawl :: (String -> ST.Type -> Either a ())+      -> (String -> ST.Type -> Either a ())+      -> ([def] -> Either a [def'])+      -> LExpr' def+      -> Either a (LExpr' def')+crawl portInCheck portOutCheck defsTransform = go+    where+      go (L srcSpan expr) =+          L srcSpan <$>+          case expr of+            Var x -> return (Var x)+            Lambda p e -> Lambda p <$> go e+            Binop op e1 e2 -> Binop op <$> go e1 <*> go e2+            Case e cases -> Case <$> go e <*> mapM (\(p,b) -> (,) p <$> go b) cases+            Data name es -> Data name <$> mapM go es+            Literal lit -> return (Literal lit)+            Range e1 e2 -> Range <$> go e1 <*> go e2+            ExplicitList es -> ExplicitList <$> mapM go es+            App e1 e2 -> App <$> go e1 <*> go e2+            MultiIf branches -> MultiIf <$> mapM (\(b,e) -> (,) <$> go b <*> go e) branches+            Access e lbl -> Access <$> go e <*> return lbl+            Remove e lbl -> Remove <$> go e <*> return lbl+            Insert e lbl v -> Insert <$> go e <*> return lbl <*> go v+            Modify e fields -> Modify <$> go e <*> mapM (\(k,v) -> (,) k <$> go v) fields+            Record fields -> Record <$> mapM (\(k,v) -> (,) k <$> go v) fields+            Markdown uid md es -> Markdown uid md <$> mapM go es+            Let defs body -> Let <$> defsTransform defs <*> go body+            PortIn name st ->+                do portInCheck name st+                   return $ PortIn name st+            PortOut name st signal ->+                do portOutCheck name st+                   PortOut name st <$> go signal
− compiler/Transform/Optimize.hs
@@ -1,136 +0,0 @@-module Transform.Optimize (optimize) where--import SourceSyntax.Declaration (Declaration(..))-import SourceSyntax.Expression-import SourceSyntax.Literal-import SourceSyntax.Location-import SourceSyntax.Module-import Control.Arrow (second, (***))-import Data.Char (isAlpha)--optimize (Module name ims exs stmts) =-    Module name ims exs (map optimizeStmt stmts)--optimizeStmt stmt = if stmt == stmt' then stmt' else optimizeStmt stmt'-    where stmt' = simp stmt--class Simplify a where-  simp :: a -> a--instance Simplify (Declaration t v) where-  simp (Definition def) = Definition (simp def)-  simp (ImportEvent js b elm t) = ImportEvent js (simp b) elm t-  simp stmt = stmt--instance Simplify (Def t v) where-  simp (Def name e) = Def name (simp e)-  simp x = x--instance Simplify e => Simplify (Located e) where-  simp (L s e) = L s (simp e)--instance Simplify (Expr t v) where-  simp expr =-    let f = simp in-    case expr of-      Range e1 e2 -> Range (f e1) (f e2)-      Binop op e1 e2 -> binop op (f e1) (f e2)-      Lambda x e -> Lambda x (f e)-      Record fs -> Record (map (second simp) fs)-      App e1 e2 -> App (f e1) (f e2)-      Let defs e -> Let (map simp defs) (f e)-      Data name es -> Data name (map f es)-      MultiIf es -> MultiIf . clipBranches $ map (f *** f) es-      Case e cases -> Case (f e) (map (second f) cases)-      _ -> expr---clipBranches [] = []-clipBranches (e:es) =-    case e of-      (L _ (Literal (Boolean True)), _) -> [e]-      _ -> e : clipBranches es---isValue e =-    case e of-      Literal _  -> True-      Var _      -> True-      Data _ _   -> True-      _          -> False---binop op ce1@(L s1 e1) ce2@(L s2 e2) =-  let c1 = L s1-      c2 = L s2-      int = Literal . IntNum-      str = Literal . Str-      bool = Literal . Boolean-  in  -  case (op, e1, e2) of-    (_, Literal (IntNum n), Literal (IntNum m)) ->-        case op of-          { "+" -> int $ (+) n m-          ; "-" -> int $ (-) n m-          ; "*" -> int $ (*) n m-          ; "^" -> int $ n ^ m-          ; "div" -> int $ div n m-          ; "mod" -> int $ mod n m-          ; "rem" -> int $ rem n m-          ; "<" -> bool $ n < m-          ; ">" -> bool $ n > m-          ; "<=" -> bool $ n <= m-          ; ">=" -> bool $ n >= m-          ; "==" -> bool $ n == m-          ; "/=" -> bool $ n /= m-          ;  _  -> Binop op ce1 ce2 }-  {---    -- flip order to move lone integers to the left-    ("+", _, IntNum n) -> binop "+" ce2 ce1-    ("*", _, IntNum n) -> binop "*" ce2 ce1--    ("+", IntNum 0, _) -> e2-    ("+", IntNum n, Binop "+" (L _ (IntNum m)) ce) ->-        binop "+" (c1 $ IntNum (n+m)) ce-    ("+", Binop "+" (L _ (IntNum n)) ce1'-        , Binop "+" (L _ (IntNum m)) ce2') ->-        binop "+" (none $ IntNum (n+m)) (none $ Binop "+" ce1' ce2')--    ("*", IntNum 0, _) -> e1-    ("*", IntNum 1, _) -> e2-    ("*", IntNum n, Binop "*" (L _ (IntNum m)) ce) ->-        binop "*" (none $ IntNum (n*m)) ce-    ("*", Binop "*" (L _ (IntNum n)) ce1'-        , Binop "*" (L _ (IntNum m)) ce2') ->-        binop "*" (none $ IntNum (n*m)) (none $ Binop "*" ce1' ce2')--    ("-", _, IntNum 0) -> e1-    ("/", _, IntNum 1) -> e1-    ("div", _, IntNum 1) -> e1---}-    (_, Literal (Boolean n), Literal (Boolean m)) ->-        case op of-          "&&" -> bool $ n && m-          "||" -> bool $ n || m-          _    -> Binop op ce1 ce2--    ("&&", Literal (Boolean  True), _) -> e2-    ("&&", Literal (Boolean False), _) -> bool False-    ("||", Literal (Boolean  True), _) -> bool True-    ("||", Literal (Boolean False), _) -> e2--    ("::", _, _) -> Data "::" [ce1, ce2]--    ("++", Literal (Str s1), Literal (Str s2)) -> str $ s1 ++ s2-    ("++", Literal (Str s1), Binop "++" (L _ (Literal (Str s2))) ce) ->-        Binop "++" (c1 . str $ s1 ++ s2) ce-    ("++", Binop "++" e (L _ (Literal (Str s1))), Literal (Str s2)) ->-        Binop "++" e (c1 . str $ s1 ++ s2)--    ("++", Data "[]" [], _) -> e2-    ("++", _, Data "[]" []) -> e1-    ("++", Data "::" [h,t], _) -> Data "::" [h, none $ binop "++" t ce2]--    _ | isAlpha (head op) || '_' == head op ->-          App (none $ App (none $ Var op) ce1) ce2-      | otherwise -> Binop op ce1 ce2
compiler/Transform/SafeNames.hs view
@@ -27,7 +27,7 @@       PAlias x p -> PAlias (var x) (pattern p)       PData name ps -> PData name (map pattern ps) -expression :: LExpr t v -> LExpr t v+expression :: LExpr -> LExpr expression (L loc expr) =     let f = expression in     L loc $@@ -49,14 +49,14 @@       Modify r fs -> Modify (f r) (map (var *** f) fs)       Record fs -> Record (map (var *** f) fs)       Markdown uid md es -> Markdown uid md (map f es)+      PortIn name st -> PortIn name st+      PortOut name st signal -> PortOut name st (f signal) -definition :: Def t v -> Def t v-definition def =-    case def of-      Def p e -> Def (pattern p) (expression e)-      TypeAnnotation name t -> TypeAnnotation (var name) t+definition :: Def -> Def+definition (Definition p e t) =+    Definition (pattern p) (expression e) t -metadataModule :: MetadataModule t v -> MetadataModule t v+metadataModule :: MetadataModule -> MetadataModule metadataModule modul =     modul     { names = map var (names modul)@@ -64,15 +64,9 @@     , imports = map (first var) (imports modul)     , program = expression (program modul)     , aliases =-        let makeSafe (name, tvars, tipe) = (var name, tvars, tipe)+        let makeSafe (name,tvars,tipe) = (var name, tvars, tipe)         in  map makeSafe (aliases modul)     , datatypes =         let makeSafe (name,tvars,ctors) = (var name, tvars, map (first var) ctors)         in  map makeSafe (datatypes modul)-    , foreignImports =-        let makeSafe (js,expr,elm,tipe) = (js, expression expr, var elm, tipe)-        in  map makeSafe (foreignImports modul)-    , foreignExports =-        let makeSafe (js,elm,tipe) = (js, var elm, tipe)-        in  map makeSafe (foreignExports modul)     }
compiler/Transform/SortDefinitions.hs view
@@ -1,37 +1,25 @@--module Transform.SortDefinitions (sortDefs, boundVars, flattenLets) where+{-# OPTIONS_GHC -Wall #-}+module Transform.SortDefinitions (sortDefs) where  import Control.Monad.State-import Control.Applicative ((<$>))-import qualified Data.Set as Set+import Control.Applicative ((<$>),(<*>)) import qualified Data.Map as Map-import qualified SourceSyntax.Type as ST import SourceSyntax.Expression import SourceSyntax.Location-import SourceSyntax.Pattern+import qualified SourceSyntax.Pattern as P import qualified Data.Graph as Graph-import qualified Data.Map as Map+import qualified Data.Set as Set import qualified Data.Maybe as Maybe -boundVars :: Pattern -> Set.Set String-boundVars pattern =-    case pattern of-      PVar x -> Set.singleton x-      PAlias x p -> Set.insert x (boundVars p)-      PData _ ps -> Set.unions (map boundVars ps)-      PRecord fields -> Set.fromList fields-      PAnything -> Set.empty-      PLiteral _ -> Set.empty--ctors :: Pattern -> [String]+ctors :: P.Pattern -> [String] ctors pattern =     case pattern of-      PVar x -> []-      PAlias x p -> ctors p-      PData ctor ps -> ctor : concatMap ctors ps-      PRecord fields -> []-      PAnything -> []-      PLiteral _ -> []+      P.PVar _ -> []+      P.PAlias _ p -> ctors p+      P.PData ctor ps -> ctor : concatMap ctors ps+      P.PRecord _ -> []+      P.PAnything -> []+      P.PLiteral _ -> []  free :: String -> State (Set.Set String) () free x = modify (Set.insert x)@@ -39,68 +27,66 @@ bound :: Set.Set String -> State (Set.Set String) () bound boundVars = modify (\freeVars -> Set.difference freeVars boundVars) -sortDefs :: LExpr t v -> LExpr t v+sortDefs :: LExpr -> LExpr sortDefs expr = evalState (reorder expr) Set.empty -flattenLets defs lexpr@(L _ expr) =-    case expr of-      Let ds body -> flattenLets (defs ++ ds) body-      _ -> (defs, lexpr)---reorder :: LExpr t v -> State (Set.Set String) (LExpr t v)-reorder lexpr@(L s expr) =-    L s `liftM`+reorder :: LExpr -> State (Set.Set String) LExpr+reorder (L s expr) =+    L s <$>     case expr of       -- Be careful adding and restricting freeVars       Var x -> free x >> return expr        Lambda p e ->-          uncurry Lambda `liftM` bindingReorder (p,e)+          uncurry Lambda <$> bindingReorder (p,e)        Binop op e1 e2 ->           do free op-             Binop op `liftM` reorder e1 `ap` reorder e2+             Binop op <$> reorder e1 <*> reorder e2        Case e cases ->-          Case `liftM` reorder e `ap` mapM bindingReorder cases+          Case <$> reorder e <*> mapM bindingReorder cases        Data name es ->           do free name-             Data name `liftM` mapM reorder es+             Data name <$> mapM reorder es        -- Just pipe the reorder though       Literal _ -> return expr        Range e1 e2 ->-          Range `liftM` reorder e1 `ap` reorder e2+          Range <$> reorder e1 <*> reorder e2        ExplicitList es ->-          ExplicitList `liftM` mapM reorder es+          ExplicitList <$> mapM reorder es        App e1 e2 ->-          App `liftM` reorder e1 `ap` reorder e2+          App <$> reorder e1 <*> reorder e2        MultiIf branches ->-          MultiIf `liftM` mapM reorderPair branches+          MultiIf <$> mapM (\(e1,e2) -> (,) <$> reorder e1 <*> reorder e2) branches        Access e lbl ->-          Access `liftM` reorder e `ap` return lbl+          Access <$> reorder e <*> return lbl        Remove e lbl ->-          Remove `liftM` reorder e `ap` return lbl+          Remove <$> reorder e <*> return lbl        Insert e lbl v ->-          Insert `liftM` reorder e `ap` return lbl `ap` reorder v+          Insert <$> reorder e <*> return lbl <*> reorder v        Modify e fields ->-          Modify `liftM` reorder e `ap` mapM reorderField fields+          Modify <$> reorder e <*> mapM (\(k,v) -> (,) k <$> reorder v) fields        Record fields ->-          Record `liftM` mapM reorderField fields+          Record <$> mapM (\(k,v) -> (,) k <$> reorder v) fields        Markdown uid md es -> Markdown uid md <$> mapM reorder es +      PortOut name st signal -> PortOut name st <$> reorder signal++      PortIn name st -> return $ PortIn name st+       -- Actually do some reordering       Let defs body ->           do body' <- reorder body@@ -113,48 +99,24 @@              let defss = map Graph.flattenSCC sccs                            -- remove let-bound variables from the context-             let getPatterns def =-                     case def of-                       Def pattern _ -> pattern-                       TypeAnnotation name _ -> PVar name-             forM (map getPatterns defs) $ \pattern -> do-                bound (boundVars pattern)+             forM_ defs $ \(Definition pattern _ _) -> do+                bound (P.boundVars pattern)                 mapM free (ctors pattern) -             let addDefs ds bod = L s (Let (concatMap toDefs ds) bod)-                 L _ let' = foldr addDefs body' defss+             let L _ let' = foldr (\ds bod -> L s (Let ds bod)) body' defss               return let' -          where-            toDefs def =-                case def of-                  (pattern, expr, Nothing) -> [ Def pattern expr ]-                  (PVar name, expr, Just tipe) ->-                      [ TypeAnnotation name tipe, Def (PVar name) expr ]-                  _ -> error $ unlines -                       [ "The impossible occurred."-                       , "Please report an issue at <https://github.com/evancz/Elm/issues>."-                       , "Be very descriptive because something quite weird probably happened." ]--reorderField (label, expr) =-    (,) label `liftM` reorder expr--reorderPair (e1,e2) =-    (,) `liftM` reorder e1 `ap` reorder e2--bindingReorder :: (Pattern, LExpr t v) -> State (Set.Set String) (Pattern, LExpr t v)+bindingReorder :: (P.Pattern, LExpr) -> State (Set.Set String) (P.Pattern, LExpr) bindingReorder (pattern,expr) =     do expr' <- reorder expr-       bound (boundVars pattern)-       mapM free (ctors pattern)+       bound (P.boundVars pattern)+       mapM_ free (ctors pattern)        return (pattern, expr')  -type PDef t v = (Pattern, LExpr t v, Maybe ST.Type)--reorderAndGetDependencies :: PDef t v -> State (Set.Set String) (PDef t v, [String])-reorderAndGetDependencies (pattern, expr, mType) =+reorderAndGetDependencies :: Def -> State (Set.Set String) (Def, [String])+reorderAndGetDependencies (Definition pattern expr mType) =     do globalFrees <- get        -- work in a fresh environment        put Set.empty@@ -162,44 +124,30 @@        localFrees <- get        -- merge with global frees        modify (Set.union globalFrees)-       return ((pattern, expr', mType), Set.toList localFrees)+       return (Definition pattern expr' mType, Set.toList localFrees)   -- This also reorders the all of the sub-expressions in the Def list.-buildDefDict :: [Def t v] -> State (Set.Set String) [(PDef t v, Int, [Int])]+buildDefDict :: [Def] -> State (Set.Set String) [(Def, Int, [Int])] buildDefDict defs =-  do pdefsDeps <- mapM reorderAndGetDependencies (getPDefs defs)+  do pdefsDeps <- mapM reorderAndGetDependencies defs      return $ realDeps (addKey pdefsDeps)    where-    getPDefs :: [Def t v] -> [PDef t v]-    getPDefs defs = map (\(p,(e,t)) -> (p,e,t)) $-                    Map.toList $ go defs Map.empty Map.empty-      where-        go [] ds ts =-            Map.unions [ Map.difference ds ts-                       , Map.intersectionWith (\(e,_) t -> (e,Just t)) ds ts ]-        -        go (def:defs) ds ts =-            case def of-              Def p e -> go defs (Map.insert p (e, Nothing) ds) ts-              TypeAnnotation name tipe -> go defs ds (Map.insert (PVar name) tipe ts)--    addKey :: [(PDef t v, [String])] -> [(PDef t v, Int, [String])]+    addKey :: [(Def, [String])] -> [(Def, Int, [String])]     addKey = zipWith (\n (pdef,deps) -> (pdef,n,deps)) [0..] -    variableToKey :: (PDef t v, Int, [String]) -> [(String, Int)]-    variableToKey ((pattern, _, _), key, _) =-        [ (var, key) | var <- Set.toList (boundVars pattern) ]+    variableToKey :: (Def, Int, [String]) -> [(String, Int)]+    variableToKey (Definition pattern _ _, key, _) =+        [ (var, key) | var <- Set.toList (P.boundVars pattern) ] -    variableToKeyMap :: [(PDef t v, Int, [String])] -> Map.Map String Int+    variableToKeyMap :: [(Def, Int, [String])] -> Map.Map String Int     variableToKeyMap pdefsDeps =         Map.fromList (concatMap variableToKey pdefsDeps) -    realDeps :: [(PDef t v, Int, [String])] -> [(PDef t v, Int, [Int])]+    realDeps :: [(Def, Int, [String])] -> [(Def, Int, [Int])]     realDeps pdefsDeps = map convert pdefsDeps         where           varDict = variableToKeyMap pdefsDeps           convert (pdef, key, deps) =               (pdef, key, Maybe.mapMaybe (flip Map.lookup varDict) deps)-
compiler/Transform/Substitute.hs view
@@ -4,10 +4,10 @@ import Control.Arrow (second, (***)) import SourceSyntax.Expression import SourceSyntax.Location+import qualified SourceSyntax.Pattern as Pattern import qualified Data.Set as Set-import qualified Transform.SortDefinitions as SD -subst :: String -> Expr t v -> Expr t v -> Expr t v+subst :: String -> Expr -> Expr -> Expr subst old new expr =     let f (L s e) = L s (subst old new e) in     case expr of@@ -15,7 +15,7 @@       ExplicitList es -> ExplicitList (map f es)       Binop op e1 e2 -> Binop op (f e1) (f e2)       Lambda p e-          | Set.member old (SD.boundVars p) -> expr+          | Set.member old (Pattern.boundVars p) -> expr           | otherwise -> Lambda p (f e)       App e1 e2 -> App (f e1) (f e2)       MultiIf ps -> MultiIf (map (f *** f) ps)@@ -24,12 +24,9 @@           | anyShadow -> expr           | otherwise -> Let (map substDef defs) (f body)         where+          substDef (Definition p e t) = Definition p (f e) t           anyShadow =-              any (Set.member old . SD.boundVars) [ p | Def p _ <- defs ]-          substDef def =-              case def of-                TypeAnnotation _ _ -> def-                Def p e -> Def p (f e)+              any (Set.member old . Pattern.boundVars) [ p | Definition p _ _ <- defs ]        Var x -> if x == old then new else expr       Case e cases -> Case (f e) $ map (second f) cases@@ -41,3 +38,5 @@       Record fs -> Record (map (second f) fs)       Literal _ -> expr       Markdown uid md es -> Markdown uid md (map f es)+      PortIn name st -> PortIn name st+      PortOut name st signal -> PortOut name st (f signal)
compiler/Type/Alias.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_GHC -W #-} module Type.Alias (realias, rules, canonicalRealias, Rules) where  import Control.Applicative ((<$>),(<*>))@@ -9,7 +10,7 @@ import SourceSyntax.Type import SourceSyntax.Module -type Rules = ([(String,[String],Type)], Type -> Type)+type Rules = ([Alias], Type -> Type)  rules interfaces moduleAliases moduleImports =     (collect interfaces moduleAliases, localizer moduleImports)@@ -30,10 +31,9 @@     go tipe =         case tipe of           Var _ -> tipe-          EmptyRecord -> tipe           Lambda t1 t2 -> Lambda (go t1) (go t2)           Data name ts -> Data (localize name) (map go ts)-          Record fs ext -> Record (map (second go) fs) (go ext)+          Record fs ext -> Record (map (second go) fs) ext      byMethod = foldr (\(n,m) d -> Map.insertWith (++) n [m] d)                Map.empty moduleImports@@ -62,7 +62,7 @@  -- Realias using canonical aliases, so results will have aliases -- that are fully qualified and possible to compare.-canonicalRealias :: [(String,[String],Type)] -> Type -> Type+canonicalRealias :: [Alias] -> Type -> Type canonicalRealias aliases tipe =     case concatMap tryRealias aliases of       [] -> if tipe == tipe' then tipe else f tipe'@@ -83,10 +83,9 @@     tipe' =         case tipe of           Var _ -> tipe-          EmptyRecord -> tipe           Lambda t1 t2 -> Lambda (f t1) (f t2)           Data name ts -> Data name (map f ts)-          Record fs ext -> Record (map (second f) fs) (f ext)+          Record fs ext -> Record (map (second f) fs) ext  allEqual [] = True allEqual (x:xs) = all (==x) xs@@ -102,8 +101,7 @@             Lambda t1 t2 -> numFields t1 + numFields t2             Var _ -> 0             Data _ ts -> sum (map numFields ts)-            EmptyRecord -> 0-            Record fields ext -> length fields + sum (map (numFields . snd) fields) + numFields ext+            Record fields _ -> length fields + sum (map (numFields . snd) fields)  diff :: Type -> Type -> Maybe [(String,Type)] diff general specific =@@ -113,11 +111,11 @@       (Data gname gts, Data sname sts)           | gname == sname && length gts == length sts ->               concat <$> zipWithM diff gts sts-      (EmptyRecord, EmptyRecord) -> Just []-      (Record _ _, Record _ _) ->-          let (gfs,gext) = collectRecords general-              (sfs,sext) = collectRecords specific-              gfields = collectFields gfs+      (Record [] Nothing, Record [] Nothing) -> Just []+      (Record _ _, Record [] Nothing) -> Nothing+      (Record [] Nothing, Record _ _) -> Nothing+      (Record gfs gext, Record sfs sext) ->+          let gfields = collectFields gfs               sfields = collectFields sfs                overlap = Map.intersectionWith (\gs ss -> length gs == length ss) sfields gfields@@ -126,10 +124,12 @@               case isAligned of                 False -> Nothing                 True -> let remaining = Map.difference sfields gfields-                            sext' = if Map.null remaining then sext else-                                        Record (flattenFields remaining) sext+                            sext' = case sext of+                                      Just x | Map.null remaining -> Var x+                                      _ -> Record (flattenFields remaining) sext+                            gext' = maybe (Record [] Nothing) Var gext                             matchMap = Map.intersectionWith (zipWith diff) gfields sfields-                        in  concat <$> sequence (diff gext sext' : concat (Map.elems matchMap))+                        in  concat <$> sequence (diff gext' sext' : concat (Map.elems matchMap))       (_,_) -> Nothing  collectFields fields =
compiler/Type/Constrain/Declaration.hs view
@@ -1,70 +1,62 @@+{-# OPTIONS_GHC -Wall #-} module Type.Constrain.Declaration where -import Control.Monad-import Control.Applicative ((<$>))--import qualified Data.Map as Map--import qualified Type.Constrain.Expression as TcExpr-import qualified Type.Environment as Env- import SourceSyntax.Declaration-import qualified SourceSyntax.Expression as Src+import qualified SourceSyntax.Expression as E import qualified SourceSyntax.Location as L import qualified SourceSyntax.Pattern as P-import qualified SourceSyntax.Type as Type+import qualified SourceSyntax.Type as T -toExpr :: [Declaration t v] -> [Src.Def t v]+toExpr :: [Declaration] -> [E.Def] toExpr = concatMap toDefs -toDefs :: Declaration t v -> [Src.Def t v]+toDefs :: Declaration -> [E.Def] toDefs decl =   case decl of     Definition def -> [def] -    Datatype name tvars constructors -> concatMap toDefs constructors+    Datatype name tvars constructors -> concatMap toDefs' constructors       where-        toDefs (ctor, tipes) =+        toDefs' (ctor, tipes) =             let vars = take (length tipes) arguments-                tbody = Type.Data name $ map Type.Var tvars-                body = L.none . Src.Data ctor $ map (L.none . Src.Var) vars-            in  [ Src.TypeAnnotation ctor $ foldr Type.Lambda tbody tipes-                , Src.Def (P.PVar ctor) $ buildFunction body vars-                ]+                tbody = T.Data name $ map T.Var tvars+                body = L.none . E.Data ctor $ map (L.none . E.Var) vars+            in  [ definition ctor (buildFunction body vars) (foldr T.Lambda tbody tipes) ] -    TypeAlias name tvars tipe@(Type.Record fields ext) ->-        [ Src.TypeAnnotation name $ foldr Type.Lambda tipe args-        , Src.Def (P.PVar name) $ buildFunction record vars ]+    TypeAlias name _ tipe@(T.Record fields ext) ->+        [ definition name (buildFunction record vars) (foldr T.Lambda tipe args) ]       where-        args = case ext of-                 Type.EmptyRecord -> map snd fields-                 _ -> map snd fields ++ [ext]+        args = map snd fields ++ maybe [] (\x -> [T.Var x]) ext -        var = L.none . Src.Var+        var = L.none . E.Var         vars = take (length args) arguments          efields = zip (map fst fields) (map var vars)         record = case ext of-                   Type.EmptyRecord -> L.none $ Src.Record efields-                   _ -> foldl (\r (f,v) -> L.none $ Src.Insert r f v) (var $ last vars) efields+                   Nothing -> L.none $ E.Record efields+                   Just _ -> foldl (\r (f,v) -> L.none $ E.Insert r f v) (var $ last vars) efields      -- Type aliases must be added to an extended equality dictionary,     -- but they do not require any basic constraints.     TypeAlias _ _ _ -> [] -    ImportEvent _ expr@(L.L s _) name tipe ->-        [ Src.TypeAnnotation name tipe-        , Src.Def (P.PVar name) (L.L s $ Src.App (L.L s $ Src.Var "constant") expr) ]--    ExportEvent _ name tipe ->-        [ Src.TypeAnnotation name tipe ]+    Port port ->+        case port of+          Out name expr@(L.L s _) tipe ->+              [ definition name (L.L s $ E.PortOut name tipe expr) tipe ]+          In name tipe ->+              [ definition name (L.none $ E.PortIn name tipe) tipe ]      -- no constraints are needed for fixity declarations     Fixity _ _ _ -> []   arguments :: [String]-arguments = map (:[]) ['a'..'z'] ++ map (\n -> "_" ++ show n) [1..]+arguments = map (:[]) ['a'..'z'] ++ map (\n -> "_" ++ show (n :: Int)) [1..] +buildFunction :: E.LExpr -> [String] -> E.LExpr buildFunction body@(L.L s _) vars =-    foldr (\p e -> L.L s (Src.Lambda p e)) body (map P.PVar vars)+    foldr (\p e -> L.L s (E.Lambda p e)) body (map P.PVar vars)++definition :: String -> E.LExpr -> T.Type -> E.Def+definition name expr tipe = E.Definition (P.PVar name) expr (Just tipe)
compiler/Type/Constrain/Expression.hs view
@@ -1,18 +1,16 @@+{-# OPTIONS_GHC -W #-} module Type.Constrain.Expression where  import qualified Data.List as List import qualified Data.Map as Map import qualified Data.Set as Set-import Control.Arrow (second)-import Control.Applicative ((<$>),(<*>))+import Control.Applicative ((<$>)) import qualified Control.Monad as Monad import Control.Monad.Error-import Control.Monad.State-import Data.Traversable (traverse) import qualified Text.PrettyPrint as PP  import SourceSyntax.Location as Loc-import SourceSyntax.Pattern (Pattern(PVar))+import SourceSyntax.Pattern (Pattern(PVar), boundVars) import SourceSyntax.Expression import qualified SourceSyntax.Type as SrcT import Type.Type hiding (Descriptor(..))@@ -20,10 +18,8 @@ import qualified Type.Environment as Env import qualified Type.Constrain.Literal as Literal import qualified Type.Constrain.Pattern as Pattern-import qualified Transform.SortDefinitions as SD --constrain :: Env.Environment -> LExpr a b -> Type -> ErrorT [PP.Doc] IO TypeConstraint+constrain :: Env.Environment -> LExpr -> Type -> ErrorT [PP.Doc] IO TypeConstraint constrain env (L span expr) tipe =     let list t = Env.get env Env.types "_List" <| t         and = L span . CAnd@@ -145,13 +141,17 @@              (schemes, rqs, fqs, header, c2, c1) <-                  Monad.foldM (constrainDef env)                              ([], [], [], Map.empty, true, true)-                             (collapseDefs defs)+                             (concatMap expandPattern defs)              return $ clet schemes                            (clet [Scheme rqs fqs (clet [monoscheme header] c2) header ]                                  (c1 /\ c)) +      PortIn _ _ -> return true -constrainDef env info (pattern, expr, maybeTipe) =+      PortOut _ _ signal ->+          constrain env signal tipe++constrainDef env info (Definition pattern expr maybeTipe) =     let qs = [] -- should come from the def, but I'm not sure what would live there...         (schemes, rigidQuantifiers, flexibleQuantifiers, headers, c2, c1) = info     in@@ -188,33 +188,18 @@                     , c /\ c2                     , c1 ) -expandPattern :: (Pattern, LExpr t v, Maybe SrcT.Type)-              -> [(Pattern, LExpr t v, Maybe SrcT.Type)]-expandPattern triple@(pattern, lexpr@(L s _), maybeType) =+         _ -> error (show pattern)++expandPattern :: Def -> [Def]+expandPattern def@(Definition pattern lexpr@(L s _) maybeType) =     case pattern of-      PVar _ -> [triple]-      _ -> (PVar x, lexpr, maybeType) : map toDef vars+      PVar _ -> [def]+      _ -> Definition (PVar x) lexpr maybeType : map toDef vars           where-            vars = Set.toList $ SD.boundVars pattern+            vars = Set.toList $ boundVars pattern             x = "$" ++ concat vars-            var = L s . Var-            toDef y = (PVar y, L s $ Case (var x) [(pattern, var y)], Nothing)--collapseDefs :: [Def t v] -> [(Pattern, LExpr t v, Maybe SrcT.Type)]-collapseDefs = concatMap expandPattern . go [] Map.empty Map.empty-  where-    go output defs typs [] =-        output ++ concatMap Map.elems [-          Map.intersectionWithKey (\k v t -> (PVar k, v, Just t)) defs typs,-          Map.mapWithKey (\k v -> (PVar k, v, Nothing)) (Map.difference defs typs) ]-    go output defs typs (d:ds) =-        case d of-          Def (PVar name) body ->-              go output (Map.insert name body defs) typs ds-          Def pattern body ->-              go ((pattern, body, Nothing) : output) defs typs ds-          TypeAnnotation name typ ->-              go output defs (Map.insert name typ typs) ds+            mkVar = L s . Var+            toDef y = Definition (PVar y) (L s $ Case (mkVar x) [(pattern, mkVar y)]) Nothing  try :: SrcSpan -> ErrorT (SrcSpan -> PP.Doc) IO a -> ErrorT [PP.Doc] IO a try span computation = do
compiler/Type/Constrain/Pattern.hs view
@@ -5,8 +5,6 @@ import Control.Applicative ((<$>)) import qualified Control.Monad as Monad import Control.Monad.Error-import qualified Data.List as List-import qualified Data.Maybe as Maybe import qualified Data.Map as Map import qualified Text.PrettyPrint as PP 
compiler/Type/Environment.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_GHC -W #-} module Type.Environment where  import Control.Applicative ((<$>), (<*>))@@ -9,11 +10,10 @@ import qualified Data.Traversable as Traverse import qualified Data.Map as Map import Data.List (isPrefixOf)-import qualified Data.UnionFind.IO as UF import qualified Text.PrettyPrint as PP  import qualified SourceSyntax.Type as Src-import SourceSyntax.Module (ADT)+import SourceSyntax.Module (ADT, Alias) import Type.Type  type TypeDict = Map.Map String Type@@ -26,7 +26,7 @@   value :: TypeDict } -initialEnvironment :: [ADT] -> [(String, [String], Src.Type)] -> IO Environment+initialEnvironment :: [ADT] -> [Alias] -> IO Environment initialEnvironment datatypes aliases = do     types <- makeTypes datatypes     let aliases' = Map.fromList $ map (\(a,b,c) -> (a,(b,c))) aliases@@ -44,7 +44,7 @@   where     nameAndKind (name, tvars, _) = (name, length tvars) -    makeCtor (name, kind) = do+    makeCtor (name, _) = do       ctor <- VarN <$> namedVar Constant name       return (name, ctor) @@ -94,7 +94,7 @@             go :: (String, [Src.Type]) -> State.StateT (VarDict, TypeDict) IO ([Type], Type)-    go (ctor, args) = do+    go (_, args) = do       types <- mapM (instantiator env) args       returnType <- instantiator env (Src.Data name (map Src.Var tvars))       return (types, returnType)@@ -162,7 +162,9 @@             _ -> error $ "\nCould not find type constructor '" ++                          name ++ "' while checking types." -        Src.EmptyRecord -> return (TermN EmptyRecord1)--        Src.Record fields ext ->-          TermN <$> (Record1 <$> Traverse.traverse (mapM go) (Src.fieldMap fields) <*> go ext)+        Src.Record fields ext -> do+          fields' <- Traverse.traverse (mapM go) (Src.fieldMap fields)+          ext' <- case ext of+                    Nothing -> return $ TermN EmptyRecord1+                    Just x -> go (Src.Var x)+          return $ TermN (Record1 fields' ext')
compiler/Type/ExtraChecks.hs view
@@ -1,10 +1,12 @@+{-# OPTIONS_GHC -W #-}+module Type.ExtraChecks (mainType, occurs, portTypes) where -- This module contains checks to be run *after* type inference has -- completed successfully. At that point we still need to do occurs -- checks and ensure that `main` has an acceptable type.-module Type.ExtraChecks (extraChecks, occursCheck) where  import Control.Applicative ((<$>),(<*>)) import Control.Monad.State+import qualified Data.List as List import qualified Data.Map as Map import qualified Data.UnionFind.IO as UF import Type.Type ( Variable, structure, Term1(..), toSrcType )@@ -12,33 +14,106 @@ import qualified Type.Alias as Alias import Text.PrettyPrint as P import SourceSyntax.PrettyPrint (pretty)-import SourceSyntax.Type (Type)-import qualified SourceSyntax.Location as Location-import qualified SourceSyntax.Expression as Expr+import qualified SourceSyntax.Helpers as Help+import qualified SourceSyntax.Type as T+import qualified SourceSyntax.Expression as E+import qualified SourceSyntax.Location as L+import qualified Transform.Expression as Expr import qualified Data.Traversable as Traverse -extraChecks :: Alias.Rules -> TS.Env -> IO (Either [P.Doc] (Map.Map String Type))-extraChecks rules env =-    mainCheck rules <$> Traverse.traverse toSrcType env+throw err = Left [ P.vcat err ] -mainCheck :: Alias.Rules -> (Map.Map String Type) -> Either [P.Doc] (Map.Map String Type)-mainCheck rules env =-    let acceptable = ["Graphics.Element.Element","Signal.Signal Graphics.Element.Element"] in-    case Map.lookup "main" env of-      Nothing -> Right env-      Just tipe-        | P.render (pretty (Alias.canonicalRealias (fst rules) tipe)) `elem` acceptable ->-            Right env-        | otherwise ->-            Left [ P.vcat [ P.text "Type Error:"-                          , P.text "Bad type for 'main'. It must have type Element or a (Signal Element)"-                          , P.text "Instead 'main' has type:\n"-                          , P.nest 4 . pretty $ Alias.realias rules tipe-                          , P.text " " ]-                 ]+mainType :: Alias.Rules -> TS.Env -> IO (Either [P.Doc] (Map.Map String T.Type))+mainType rules env = mainCheck rules <$> Traverse.traverse toSrcType env+  where+    mainCheck :: Alias.Rules -> Map.Map String T.Type -> Either [P.Doc] (Map.Map String T.Type)+    mainCheck rules env =+      case Map.lookup "main" env of+        Nothing -> Right env+        Just mainType+            | tipe `elem` acceptable -> Right env+            | otherwise              -> throw err+            where+              acceptable = [ "Graphics.Element.Element"+                           , "Signal.Signal Graphics.Element.Element" ] -occursCheck :: (String, Variable) -> StateT TS.SolverState IO ()-occursCheck (name, variable) =+              tipe = P.render . pretty $ Alias.canonicalRealias (fst rules) mainType+              err = [ P.text "Type Error: 'main' must have type Element or (Signal Element)."+                    , P.text "Instead 'main' has type:\n"+                    , P.nest 4 . pretty $ Alias.realias rules mainType+                    , P.text " " ]++data Direction = In | Out++portTypes :: Alias.Rules -> E.LExpr -> Either [P.Doc] ()+portTypes rules expr =+  const () <$> Expr.checkPorts (check In) (check Out) expr+  where+    check = isValid True False False+    isValid isTopLevel seenFunc seenSignal direction name tipe =+        case tipe of+          T.Data ctor ts+              | isJs ctor || isElm ctor -> mapM_ valid ts+              | ctor == "Signal.Signal" -> handleSignal ts+              | otherwise               -> err' True "an unsupported type"++          T.Var _ -> err "free type variables"++          T.Lambda _ _ ->+              case direction of+                In -> err "functions"+                Out | seenFunc   -> err "higher-order functions"+                    | seenSignal -> err "signals that contain functions"+                    | otherwise  ->+                        forM_ (T.collectLambdas tipe)+                              (isValid' True seenSignal direction name)++          T.Record _ (Just _) -> err "extended records with free type variables"++          T.Record fields Nothing ->+              mapM_ (\(k,v) -> (,) k <$> valid v) fields++        where+          isValid' = isValid False+          valid = isValid' seenFunc seenSignal direction name++          isJs ctor =+              List.isPrefixOf "JavaScript." ctor+              && length (filter (=='.') ctor) == 1++          isElm ctor =+              ctor `elem` ["Int","Float","String","Bool","Maybe.Maybe","_List"]+              || Help.isTuple ctor++          handleSignal ts+              | seenFunc   = err "functions that involve signals"+              | seenSignal = err "signals-of-signals"+              | isTopLevel = mapM_ (isValid' seenFunc True direction name) ts+              | otherwise  = err "a signal within a data stucture"++          dir inMsg outMsg = case direction of { In -> inMsg ; Out -> outMsg }+          txt = P.text . concat++          err = err' False+          err' couldBeAlias kind =+              throw $+              [ txt [ "Type Error: the value ", dir "coming in" "sent out"+                    , " through port '", name, "' is invalid." ]+              , txt [ "It contains ", kind, ":\n" ]+              , (P.nest 4 . pretty $ Alias.realias rules tipe) <> P.text "\n"+              , txt [ "Acceptable values for ", dir "incoming" "outgoing"+                    , " ports include JavaScript values and" ]+              , txt [ "the following Elm values: Ints, Floats, Bools, Strings, Maybes," ]+              , txt [ "Lists, Tuples, ", dir "" "first-order functions, ", "and concrete records." ]+              ] ++ if couldBeAlias then aliasWarning else []++          aliasWarning =+              [ txt [ "\nType aliases are not expanded for this check (yet) so you need to do that" ]+              , txt [ "manually for now (e.g. {x:Int,y:Int} instead of a type alias of that type)." ]+              ]++occurs :: (String, Variable) -> StateT TS.SolverState IO ()+occurs (name, variable) =   do vars <- liftIO $ infiniteVars [] variable      case vars of        [] -> return ()@@ -47,10 +122,10 @@          case structure desc of            Nothing ->                modify $ \state -> state { TS.sErrors = fallback : TS.sErrors state }-           Just struct ->+           Just _ ->                do liftIO $ UF.setDescriptor var (desc { structure = Nothing })                   var' <- liftIO $ UF.fresh desc-                  TS.addError (Location.NoSpan name) (Just msg) var var'+                  TS.addError (L.NoSpan name) (Just msg) var var'   where     msg = "Infinite types are not allowed"     fallback _ = return $ P.text msg
compiler/Type/Inference.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_GHC -W #-} module Type.Inference where  import qualified Data.Map as Map@@ -5,27 +6,23 @@ import qualified Type.Type as T import qualified Type.Environment as Env import qualified Type.Constrain.Expression as TcExpr-import qualified Type.Constrain.Declaration as TcDecl import qualified Type.Solve as Solve  import SourceSyntax.Module as Module-import qualified SourceSyntax.Expression as Expr-import SourceSyntax.Location (Located, noneNoDocs)-import SourceSyntax.PrettyPrint+import SourceSyntax.Location (noneNoDocs) import SourceSyntax.Type (Type) import Text.PrettyPrint import qualified Type.State as TS-import Type.ExtraChecks (extraChecks)+import qualified Type.ExtraChecks as Check import Control.Monad.State (execStateT, forM) import Control.Monad.Error (runErrorT, liftIO)-import Control.Arrow (second) import qualified Type.Alias as Alias  import System.IO.Unsafe  -- Possible to switch over to the ST monad instead of                          -- the IO monad. I don't think that'd be worthwhile.  -infer :: Interfaces -> MetadataModule t v -> Either [Doc] (Map.Map String Type)+infer :: Interfaces -> MetadataModule -> Either [Doc] (Map.Map String Type) infer interfaces modul = unsafePerformIO $ do   env <- Env.initialEnvironment              (datatypes modul ++ concatMap iAdts (Map.elems interfaces))@@ -55,4 +52,6 @@       let rules = Alias.rules interfaces (aliases modul) (imports modul)       case TS.sErrors state of         errors@(_:_) -> Left `fmap` sequence (map ($ rules) (reverse errors))-        [] -> extraChecks rules (Map.difference (TS.sSavedEnv state) header)+        [] -> case Check.portTypes rules (program modul) of+                Right () -> Check.mainType rules (Map.difference (TS.sSavedEnv state) header)+                Left err -> return (Left err)
compiler/Type/Solve.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_GHC -W #-} module Type.Solve (solve) where  import Control.Monad@@ -5,14 +6,11 @@ import qualified Data.UnionFind.IO as UF import qualified Data.Map as Map import qualified Data.Traversable as Traversable-import qualified Data.Maybe as Maybe import qualified Data.List as List import Type.Type import Type.Unify-import qualified Type.ExtraChecks as EC-import qualified Type.Environment as Env+import qualified Type.ExtraChecks as Check import qualified Type.State as TS-import qualified Text.PrettyPrint as P import SourceSyntax.Location (Located(L), SrcSpan)  @@ -122,7 +120,7 @@         headers <- Map.unions `fmap` mapM (solveScheme span) schemes         TS.modifyEnv $ \env -> Map.union headers env         solve constraint'-        mapM EC.occursCheck $ Map.toList headers+        mapM Check.occurs $ Map.toList headers         TS.modifyEnv (\_ -> oldEnv)      CInstance name term -> do
compiler/Type/State.hs view
@@ -1,9 +1,8 @@+{-# OPTIONS_GHC -W #-} module Type.State where  import Type.Type import qualified Data.Map as Map-import qualified Data.List as List-import qualified Type.Environment as Env import qualified Data.UnionFind.IO as UF import Control.Monad.State import Control.Applicative ((<$>),(<*>), Applicative)@@ -11,7 +10,6 @@ import Text.PrettyPrint as P import SourceSyntax.PrettyPrint import SourceSyntax.Location-import qualified SourceSyntax.Type as Src import qualified Type.Alias as Alias  -- Pool@@ -64,8 +62,8 @@          ]      location = case span of-                 NoSpan msg -> ""-                 Span p1 p2 msg ->+                 NoSpan _ -> ""+                 Span p1 p2 _ ->                      if line p1 == line p2 then " on line " ++ show (line p1)                      else " between lines " ++ show (line p1) ++ " and " ++ show (line p2) 
compiler/Type/Type.hs view
@@ -62,7 +62,7 @@ infixl 8 /\  (/\) :: Constraint a b -> Constraint a b -> Constraint a b-a@(L s1 c1) /\ b@(L s2 c2) =+a@(L _ c1) /\ b@(L _ c2) =     case (c1, c2) of       (CTrue, _) -> b       (_, CTrue) -> a@@ -95,6 +95,7 @@ data SuperType = Number | Comparable | Appendable      deriving (Show, Eq) +namedVar :: Flex -> String -> IO Variable namedVar flex name = UF.fresh $ Descriptor {     structure = Nothing,     rank = noRank,@@ -104,6 +105,7 @@     mark = noMark   } +var :: Flex -> IO Variable var flex = UF.fresh $ Descriptor {     structure = Nothing,     rank = noRank,@@ -113,6 +115,7 @@     mark = noMark   } +structuredVar :: Term1 Variable -> IO Variable structuredVar structure = UF.fresh $ Descriptor {     structure = Just structure,     rank = noRank,@@ -361,15 +364,19 @@             return (Src.Data name (ts ++ [b']))           Fun1 a b -> Src.Lambda <$> toSrcType a <*> toSrcType b           Var1 a -> toSrcType a-          EmptyRecord1 -> return Src.EmptyRecord-          Record1 fs ext -> do-            fs' <- traverse (mapM toSrcType) fs-            let fs'' = concat [ map ((,) name) ts | (name,ts) <- Map.toList fs' ]-            Src.Record fs'' <$> toSrcType ext+          EmptyRecord1 -> return $ Src.Record [] Nothing+          Record1 tfields extension -> do+            fields' <- traverse (mapM toSrcType) tfields+            let fields = concat [ map ((,) name) ts | (name,ts) <- Map.toList fields' ]+            ext' <- toSrcType extension+            return $ case ext' of+                       Src.Record fs ext -> Src.Record (fs ++ fields) ext+                       Src.Var x -> Src.Record fields (Just x)+                       _ -> error "Used toSrcType on a type that is not well-formed"     Nothing ->         case name desc of-          Just x@(c:cs) | Char.isLower c -> return (Src.Var x)-                        | otherwise      -> return (Src.Data x [])+          Just x@(c:_) | Char.isLower c -> return (Src.Var x)+                       | otherwise      -> return (Src.Data x [])           _ -> error $ concat                         [ "Problem converting the following type "                         , "from a type-checker type to a source-syntax type:"@@ -383,12 +390,12 @@     go vars variable = do       desc <- UF.descriptor variable       case (structure desc, vars) of-        (Nothing, [v] ) -> case name desc of+        (Nothing, [v]) -> case name desc of                              Just "_List" -> return (List v)                              _ -> return Other-        (Nothing,  vs ) -> case name desc of+        (Nothing,  vs) -> case name desc of                              Just ctor | isTuple ctor -> return (Tuple vs)                              _ -> return Other-        (Just term, vs) -> case term of-                             App1 a b -> go (vars ++ [b]) a-                             _ -> return Other+        (Just term, _) -> case term of+                            App1 a b -> go (vars ++ [b]) a+                            _ -> return Other
compiler/Type/Unify.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_GHC -W #-} module Type.Unify (unify) where  import Type.Type@@ -5,7 +6,6 @@ import qualified Data.Map as Map import qualified Data.Maybe as Maybe import qualified Type.State as TS-import Control.Arrow (first,second) import Control.Monad.State import SourceSyntax.Location import Type.PrettyPrint@@ -193,8 +193,8 @@                  unmerged a b = Map.filter (not . null) $ Map.union (Map.intersectionWith eat a b) a -                eat (x:xs) (y:ys) = eat xs ys-                eat xs ys = xs+                eat (_:xs) (_:ys) = eat xs ys+                eat xs _ = xs            _ -> TS.addError span Nothing variable1 variable2 
data/docs.json view
@@ -1,7 +1,7 @@ [ {   "name": "Basics",-  "document": "Tons of useful functions that get imported by default.\n\nThe following libraries also get imported by default: List, Signal,\nText, Maybe, Time, Graphics.Element, Color, Graphics.Collage.\n\n# Equality\n@docs (==), (/=)\n\n# Comparison\n\nThese functions only work on `comparable` types. This includes numbers,\ncharacters, strings, lists of comparable things, and tuples of comparable\nthings. Note that tuples with 7 or more elements are not comparable; why\nare your tuples so big?\n\n@docs (\u003c), (\u003e), (\u003c=), (\u003e=), max, min, Order, compare\n\n# Booleans\n@docs not, (&&), (||), xor, otherwise\n\n# Mathematics\n@docs (+), (-), (*), (/), (^), div, rem, mod, abs, sqrt, clamp, logBase, e\n\n# Trigonometry\n@docs pi, cos, sin, tan, acos, asin, atan, atan2\n\n# Number Conversions\n@docs round, floor, ceiling, truncate, toFloat\n\n# Angle Conversions\nAll angle conversions result in &ldquo;standard Elm angles&rdquo;\nwhich happen to be radians.\n\n@docs degrees, radians, turns\n\n# Polar Coordinates\n@docs toPolar, fromPolar\n\n# Tuples\n@docs fst, snd\n\n# Higher-Order Helpers\n@docs id, (\u003c|), (|\u003e), (.), flip, curry, uncurry",+  "document": "Tons of useful functions that get imported by default.\n\nThe following libraries also get imported by default: List, Signal,\nText, Maybe, Time, Graphics.Element, Color, Graphics.Collage.\n\n# Equality\n@docs (==), (/=)\n\n# Comparison\n\nThese functions only work on `comparable` types. This includes numbers,\ncharacters, strings, lists of comparable things, and tuples of comparable\nthings. Note that tuples with 7 or more elements are not comparable; why\nare your tuples so big?\n\n@docs (\u003c), (\u003e), (\u003c=), (\u003e=), max, min, Order, compare\n\n# Booleans\n@docs not, (&&), (||), xor, otherwise\n\n# Mathematics\n@docs (+), (-), (*), (/), (^), div, rem, mod, abs, sqrt, clamp, logBase, e\n\n# Trigonometry\n@docs pi, cos, sin, tan, acos, asin, atan, atan2\n\n# Number Conversions\n@docs round, floor, ceiling, truncate, toFloat\n\n# Angle Conversions\nAll angle conversions result in &ldquo;standard Elm angles&rdquo;\nwhich happen to be radians.\n\n@docs degrees, radians, turns\n\n# Polar Coordinates\n@docs toPolar, fromPolar\n\n# Tuples\n@docs fst, snd\n\n# Higher-Order Helpers\n@docs id, (\u003c|), (|\u003e), (.), always, flip, curry, uncurry",   "aliases": [],   "datatypes": [     {@@ -321,6 +321,20 @@       ]     },     {+      "name": "always",+      "comment": "Creates a [constant function](http://en.wikipedia.org/wiki/Constant_function),\na function that *always* returns the same value regardless of what input you give.\nIt is defined as:\n\n        always a b = a\n\nIt totally ignores the second argument, so `always 42` is a function that always\nreturns in 42. When you are dealing with higher-order functions, this comes in\nhandy more often than you might expect. For example, creating a zeroed out list\nof length ten would be:\n\n        map (always 0) [0..9]",+      "raw": "always : a -\u003e b -\u003e a",+      "type": [+        "-\u003e",+        "a",+        [+          "-\u003e",+          "b",+          "a"+        ]+      ]+    },+    {       "name": "asin",       "comment": "",       "raw": "asin : Float -\u003e Float",@@ -5427,7 +5441,7 @@     },     {       "name": "dropIf",-      "comment": "Drop events that satisfy the given predicate. Elm does not allow undefined\nsignals, so a base case must be provided in case the predicate is never\nsatisfied.",+      "comment": "Drop events that satisfy the given predicate. Elm does not allow undefined\nsignals, so a base case must be provided in case the predicate is satisfied\ninitially.",       "raw": "dropIf : (a -\u003e Bool) -\u003e a -\u003e Signal a -\u003e Signal a",       "type": [         "-\u003e",@@ -5457,7 +5471,7 @@     },     {       "name": "dropRepeats",-      "comment": "Drop sequential repeated values. For example, if a signal produces the\nsequence `[1,1,2,2,1]`, it becomes `[1,2,1]` by dropping the values that are the\nsame as the previous value.",+      "comment": "Drop updates that repeat the current value of the signal.\n\nImagine a signal `numbers` has initial value\n0 and then updates with values 0, 0, 1, 1, and 2. `dropRepeats numbers`\nis a signal that has initial value 0 and updates as follows: ignore 0,\nignore 0, update to 1, ignore 1, update to 2.",       "raw": "dropRepeats : Signal a -\u003e Signal a",       "type": [         "-\u003e",@@ -5473,7 +5487,7 @@     },     {       "name": "dropWhen",-      "comment": "Drop events when the first signal is true. When the first signal becomes\nfalse, the most recent value of the second signal will be propagated. Until the\nfirst signal becomes true again, all events will be propagated. Elm does not\nallow undefined signals, so a base case must be provided in case the first\nsignal is always true.",+      "comment": "Drop events when the first signal is true. When the first signal becomes\nfalse, the most recent value of the second signal will be propagated. Until the\nfirst signal becomes true again, all events will be propagated. Elm does not\nallow undefined signals, s oa base case must be provided in case the first\nsignal is true initially.",       "raw": "dropWhen : Signal Bool -\u003e a -\u003e Signal a -\u003e Signal a",       "type": [         "-\u003e",@@ -5534,7 +5548,7 @@     },     {       "name": "keepIf",-      "comment": "Keep only events that satisfy the given predicate. Elm does not allow\nundefined signals, so a base case must be provided in case the predicate is\nnever satisfied.",+      "comment": "Keep only events that satisfy the given predicate. Elm does not allow\nundefined signals, so a base case must be provided in case the predicate is\nnot satisfied initially.",       "raw": "keepIf : (a -\u003e Bool) -\u003e a -\u003e Signal a -\u003e Signal a",       "type": [         "-\u003e",@@ -5564,7 +5578,7 @@     },     {       "name": "keepWhen",-      "comment": "Keep events only when the first signal is true. When the first signal\nbecomes true, the most recent value of the second signal will be propagated.\nUntil the first signal becomes false again, all events will be propagated. Elm\ndoes not allow undefined signals, so a base case must be provided in case the\nfirst signal is never true.",+      "comment": "Keep events only when the first signal is true. When the first signal\nbecomes true, the most recent value of the second signal will be propagated.\nUntil the first signal becomes false again, all events will be propagated. Elm\ndoes not allow undefined signals, so a base case must be provided in case the\nfirst signal is not true initially.",       "raw": "keepWhen : Signal Bool -\u003e a -\u003e Signal a -\u003e Signal a",       "type": [         "-\u003e",@@ -7508,7 +7522,7 @@     },     {       "name": "timestamp",-      "comment": "Add a timestamp to any signal. Timestamps increase monotonically. Each\ntimestamp is related to a specfic event, so `Mouse.x` and `Mouse.y` will always\nhave the same timestamp because they both rely on the same underlying event.",+      "comment": "Add a timestamp to any signal. Timestamps increase monotonically. When you\ncreate `(timestamp Mouse.x)`, an initial timestamp is produced. The timestamp\nupdates whenever `Mouse.x` updates.\n\nTimestamp updates are tied to individual events, so\n`(timestamp Mouse.x)` and `(timestamp Mouse.y)` will always have the same\ntimestamp because they rely on the same underlying event (`Mouse.position`).",       "raw": "timestamp : Signal a -\u003e Signal (Time, a)",       "type": [         "-\u003e",
data/elm-runtime.js view
@@ -382,6606 +382,6701 @@    function toJS(v) {       var type = typeof v;-      if (type === 'number' || type === 'boolean') return v;-      if (type === 'object' && '_' in v) {-          var obj = {};-          for (var k in v) {-              var x = toJS(v[k]);-              if (x !== null) obj[k] = x;-          }-          return obj;-      }-      if (type === 'object' && (v.ctor === '::' || v.ctor === '[]')) {-          var array = List.toArray(v);-          for (var i = array.length; i--; ) {-              array[i] = toJS(array[i]);-          }-          return array;-      }-      return null;-  }--  function fromRecord(r) {-      if (typeof r === 'object' && '_' in r) {-          return toJS(r);-      }-      throw new Error("'fromRecord' must be called on a record.");-  }--  function id(n) { return n; }--  function toElement(w,h,domNode) {-      return A3( newElement, w, h, {-              ctor: 'Custom',-              type: 'DomNode',-              render: function(node) { return node; },-              update: function(node,oldNode,newNode) {-                  if (node === newNode) return;-                  node.parentNode.replaceChild(newNode, node);-              },-              model: domNode-          });-  }--  function fromElement(element) {-      return Render.render(element);-  }--  return elm.Native.JavaScript.values = {-      toInt      : function(n) { return n|0; },-      toFloat    : function(n) { return +n; },-      toBool     : id,-      toString   : id,-      toList     : List.fromArray,-      fromString : id,-      fromList   : List.toArray,-      fromInt    : id,-      fromFloat  : id,-      fromBool   : id,--      toElement   : toElement,-      fromElement : fromElement,-      toRecord    : fromJS,-      fromRecord  : fromRecord-  };--};-Elm.Native.Json = {};-Elm.Native.Json.make = function(elm) {--  elm.Native = elm.Native || {};-  elm.Native.Json = elm.Native.Json || {};-  if (elm.Native.Json.values) return elm.Native.Json.values;--  var Maybe = Elm.Maybe.make(elm);-  var Dict = Elm.Dict.make(elm);-  var List = Elm.List.make(elm);-  var JS = Elm.JavaScript.make(elm);-  var Utils = Elm.Native.Utils.make(elm);--  function fromValue(v) {-    switch (v.ctor) {-    case 'Null'   : return null;-    case 'String' : return JS.fromString(v._0);-    case 'Object' :-      var obj = {};-      var array = JS.fromList(Dict.toList(v._0));-      for (var i = array.length; i--; ) {-	obj[JS.fromString(array[i]._0)] = fromValue(array[i]._1);-      }-      return obj;-    case 'Array'  :-      var array = JS.fromList(v._0);-      for (var i = array.length; i--; ) {-	array[i] = fromValue(array[i]);-      }-      return array;-    default :-      return v._0;-    }-  }--  function toPrettyJSString(sep, obj) {-    return JSON.stringify(fromValue(obj), null, JS.fromString(sep));-  }--  function toValue(v) {-    switch (typeof v) {-    case 'string' : return { ctor:"String", _0: JS.toString(v) };-    case 'number' : return { ctor:"Number", _0: JS.toFloat(v)  };-    case 'boolean': return { ctor:"Boolean"  , _0: JS.toBool(v)   };-    case 'object' :-      if (v === null) return { ctor:"Null" };-      if (v instanceof Array) {-          for (var i = v.length; i--; ) { v[i] = toValue(v[i]); }-	  return { ctor:"Array", _0: JS.toList(v) };-      }-      var array = [];-      for (var k in v) array.push(Utils.Tuple2(JS.toString(k), toValue(v[k])));-      return { ctor:"Object", _0: Dict.fromList(JS.toList(array)) };-    }-  }--  function fromJSString(str) {-    try {-	return Maybe.Just(toValue(JSON.parse(str)));-    } catch (e) {-	return Maybe.Nothing;-    }-  }--  return elm.Native.Json.values = {-      toJSString : F2(toPrettyJSString),-      fromJSString : fromJSString,-      toJSObject : fromValue,-      fromJSObject : toValue-  };--};-Elm.Native.List = {};-Elm.Native.List.make = function(elm) {-    elm.Native = elm.Native || {};-    elm.Native.List = elm.Native.List || {};-    if (elm.Native.List.values) return elm.Native.List.values;-    if ('values' in Elm.Native.List)-        return elm.Native.List.values = Elm.Native.List.values;--    var Utils = Elm.Native.Utils.make(elm);--    // TODO: Improve Nil handling-    // We can change places like:  if (xs.ctor === '[]') ... to if (xs === Nil) ...-    // but only if we're confident Nil can only be defined once.-    // Currently (27Mar2013) each module can have different instantiations, so multiple Nil objects can exist-    // (and if they're used interchangeably then direct object comparison fails where ctor doesn't).-    // So, this can only be fixed when modules initialisation is also fixed.-    // The performance overhead of the .ctor calls is 5-10% according to jsperf (depending on fn + list size)-    // (on firefox 19)--    var Nil = { ctor:'[]' };--    // using freeze for every cons would be nice but is a huge (9x on firefox 19)-    // performance penalty-    function Cons(hd,tl) { return { ctor:"::", _0:hd, _1:tl }; }--    function throwError(f) {-        throw new Error("Function '" + f + "' expects a non-empty list!");-    }--    function toArray(xs) {-        var out = [];-        while (xs.ctor !== '[]') {-            out.push(xs._0);-            xs = xs._1;-        }-        return out;-    }--    function fromArray(arr) {-        var out = Nil;-        for (var i = arr.length; i--; ) {-            out = Cons(arr[i], out);-        }-        return out;-    }--    function range(lo,hi) {-        var lst = Nil;-        if (lo <= hi) {-            do { lst = Cons(hi,lst) } while (hi-->lo);-        }-        return lst-    }--    function append(xs,ys) {-        // append Text-        if (xs.text || ys.text) {-            return Utils.txt(Utils.makeText('',xs) + Utils.makeText('',ys));-        }--        // append Strings-        if (typeof xs === "string") return xs + ys;--        // append Lists-        if (xs.ctor === '[]') { return ys; }-        var root = Cons(xs._0, Nil);-        var curr = root;-        xs = xs._1;-        while (xs.ctor !== '[]') {-	    curr._1 = Cons(xs._0, Nil);-	    xs = xs._1;-	    curr = curr._1;-        }-        curr._1 = ys;-        return root;-    }--    function head(v) { return v.ctor === '[]' ? throwError('head') : v._0; }-    function tail(v) { return v.ctor === '[]' ? throwError('tail') : v._1; }--    function last(xs) {-        if (xs.ctor === '[]') { throwError('last'); }-        var out = xs._0;-        while (xs.ctor !== '[]') {-            out = xs._0;-            xs = xs._1;-        }-        return out;-    }--    function map(f, xs) {-        var arr = [];-        while (xs.ctor !== '[]') {-            arr.push(f(xs._0));-            xs = xs._1;-        }-        return fromArray(arr);-    }--    // f defined similarly for both foldl and foldr (NB: different from Haskell)-    // ie, foldl : (a -> b -> b) -> b -> [a] -> b-    function foldl(f, b, xs) {-        var acc = b;-        while (xs.ctor !== '[]') {-            acc = A2(f, xs._0, acc);-            xs = xs._1;-        }-        return acc;-    }--    function foldr(f, b, xs) {-        var arr = toArray(xs);-        var acc = b;-        for (var i = arr.length; i--; ) {-            acc = A2(f, arr[i], acc);-        }-        return acc;-    }--    function foldl1(f, xs) {-        return xs.ctor === '[]' ? throwError('foldl1') : foldl(f, xs._0, xs._1);-    }--    function foldr1(f, xs) {-        if (xs.ctor === '[]') { throwError('foldr1'); }-        var arr = toArray(xs);-        var acc = arr.pop();-        for (var i = arr.length; i--; ) {-            acc = A2(f, arr[i], acc);-        }-        return acc;-    }--    function scanl(f, b, xs) {-        var arr = toArray(xs);-        arr.unshift(b);-        var len = arr.length;-        for (var i = 1; i < len; ++i) {-            arr[i] = A2(f, arr[i], arr[i-1]);-        }-        return fromArray(arr);-    }--    function scanl1(f, xs) {-        return xs.ctor === '[]' ? throwError('scanl1') : scanl(f, xs._0, xs._1);-    }--    function filter(pred, xs) {-        var arr = [];-        while (xs.ctor !== '[]') {-            if (pred(xs._0)) { arr.push(xs._0); }-            xs = xs._1;-        }-        return fromArray(arr);-    }--    function length(xs) {-        var out = 0;-        while (xs.ctor !== '[]') {-            out += 1;-            xs = xs._1;-        }-        return out;-    }--    function member(x, xs) {-        while (xs.ctor !== '[]') {-            if (Utils.eq(x,xs._0)) return true;-            xs = xs._1;-        }-        return false;-    }--    function reverse(xs) { return fromArray(toArray(xs).reverse()); }--    function concat(xss) {-        if (xss.ctor === '[]') return xss;-        var arr = toArray(xss);-        var xs = arr[arr.length-1];-        for (var i = arr.length-1; i--; ) {-	    xs = append(arr[i], xs);-        }-        return xs;-    }--    function all(pred, xs) {-        while (xs.ctor !== '[]') {-            if (!pred(xs._0)) return false;-            xs = xs._1;-        }-        return true;-    }--    function any(pred, xs) {-        while (xs.ctor !== '[]') {-            if (pred(xs._0)) return true;-            xs = xs._1;-        }-        return false;-    }--    function zipWith(f, xs, ys) {-        var arr = [];-        while (xs.ctor !== '[]' && ys.ctor !== '[]') {-            arr.push(A2(f, xs._0, ys._0));-            xs = xs._1;-            ys = ys._1;-        }-        return fromArray(arr);-    }--    function zip(xs, ys) {-        var arr = [];-        while (xs.ctor !== '[]' && ys.ctor !== '[]') {-            arr.push(Utils.Tuple2(xs._0, ys._0));-            xs = xs._1;-            ys = ys._1;-        }-        return fromArray(arr);-    }--    function sort(xs) {-        return fromArray(toArray(xs).sort(Utils.cmp));-    }--    function sortBy(f, xs) {-        return fromArray(toArray(xs).sort(function(a,b){-            return Utils.cmp(f(a), f(b));-        }));-    }--    function sortWith(f, xs) {-        return fromArray(toArray(xs).sort(function(a,b){-            var ord = f(a)(b).ctor;-            return ord === 'EQ' ? 0 : ord === 'LT' ? -1 : 1;-        }));-    }--    function nth(xs, n) {-        return toArray(xs)[n];-    }--    function take(n, xs) {-        var arr = [];-        while (xs.ctor !== '[]' && n > 0) {-            arr.push(xs._0);-            xs = xs._1;-            --n;-        }-        return fromArray(arr);-    }--    function drop(n, xs) {-        while (xs.ctor !== '[]' && n > 0) {-            xs = xs._1;-            --n;-        }-        return xs;-    }--    function repeat(n, x) {-        var arr = [];-        var pattern = [x];-        while (n > 0) {-            if (n & 1) arr = arr.concat(pattern);-            n >>= 1, pattern = pattern.concat(pattern);-        }-        return fromArray(arr);-    }--    function join(sep, xss) {-        if (sep.text) {-            sep = Utils.makeText('',sep);-            xss = toArray(xss);-            for (var i = xss.length; i--; ) {-                xss[i] = Utils.makeText('',xss[i]);-            }-            return Utils.txt(xss.join(sep));-        }-        if (typeof sep === 'string') return toArray(xss).join(sep);-        if (xss.ctor === '[]') return Nil;-        var s = toArray(sep);-        var out = toArray(xss._0);-        xss = xss._1;-        while (xss.ctor !== '[]') {-            out = out.concat(s, toArray(xss._0));-            xss = xss._1;-        }-        return fromArray(out);-    }--    Elm.Native.List.values = {-        Nil:Nil,-        Cons:Cons,-        cons:F2(Cons),-        toArray:toArray,-        fromArray:fromArray,-        range:range,-        append:append,--        head:head,-        tail:tail,-        last:last,--        map:F2(map),-        foldl:F3(foldl),-        foldr:F3(foldr),--        foldl1:F2(foldl1),-        foldr1:F2(foldr1),-        scanl:F3(scanl),-        scanl1:F2(scanl1),-        filter:F2(filter),-        length:length,-        member:F2(member),-        reverse:reverse,-        concat:concat,--        all:F2(all),-        any:F2(any),-        zipWith:F3(zipWith),-        zip:F2(zip),-        sort:sort,-        sortBy:F2(sortBy),-        sortWith:F2(sortWith),-        nth:F2(nth),-        take:F2(take),-        drop:F2(drop),-        repeat:F2(repeat),--        join:F2(join)-    };-    return elm.Native.List.values = Elm.Native.List.values;--};-Elm.Native.Regex = {};-Elm.Native.Regex.make = function(elm) {-    elm.Native = elm.Native || {};-    elm.Native.Regex = elm.Native.Regex || {};-    if (elm.Native.Regex.values) return elm.Native.Regex.values;-    if ('values' in Elm.Native.Regex)-        return elm.Native.Regex.values = Elm.Native.Regex.values;--    var Maybe = Elm.Maybe.make(elm);-    var JS = Elm.JavaScript.make(elm);--    function escape(str) {-        return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');-    }-    function caseInsensitive(re) {-        return new RegExp(re.source, 'gi');-    }-    function pattern(raw) {-        return new RegExp(raw, 'g');-    }--    function contains(re, string) {-        return re.test(JS.fromString(string));-    }--    function findAll(re, string) {-        return find(Infinity, re, string);-    }-    function find(n, re, str) {-        var out = [];-        var number = 0;-        var string = JS.fromString(str);-        var result;-        while (number++ < n && (result = re.exec(string))) {-            var i = result.length - 1;-            var subs = new Array(i);-            while (i > 0) {-                var submatch = result[i];-                subs[--i] = submatch === undefined-                    ? Maybe.Nothing-                    : Maybe.Just(JS.toString(submatch));-            }-            out.push({-                _:{},-                match: JS.toString(result[0]),-                submatches: JS.toList(subs),-                index: result.index,-                number: number,-            });-        }-        return JS.toList(out);-    }--    function replaceAll(re, replacer, string) {-        return replace(Infinity, re, replacer, string);-    }-    function replace(n, re, replacer, string) {-        var count = 0;-        function jsReplacer(match) {-            if (count++ > n) return match;-            var i = arguments.length-3;-            var submatches = new Array(i);-            while (i > 0) {-                var submatch = arguments[i];-                submatches[--i] = submatch === undefined-                    ? Maybe.Nothing-                    : Maybe.Just(JS.toString(submatch));-            }-            return JS.fromString(replacer({-                _:{},-                match:match,-                submatches:JS.toList(submatches),-                index:arguments[i-1],-                number:count-            }));-        }-        return string.replace(re, jsReplacer);-    }--    function split(re, string) {-        return JS.toList(JS.fromString(string).split(re));-    }-    function splitN(n, re, str) {-        var string = JS.fromString(str);-        var result;-        var out = [];-        var start = re.lastIndex;-        while (n--) {-            if (!(result = re.exec(string))) break;-            out.push(string.slice(start, result.index));-            start = re.lastIndex;-        }-        out.push(string.slice(start));-        return JS.toList(out);-    }--    return Elm.Native.Regex.values = {-        pattern: pattern,-        caseInsensitive: caseInsensitive,-        escape: escape,--        contains: F2(contains),-        findAll: F2(findAll),-        find: F3(find),--        replaceAll: F3(replaceAll),-        replace: F4(replace),--        split: F2(split),-        splitN: F3(splitN),-    };-};Elm.Native.Show = {};-Elm.Native.Show.make = function(elm) {-    elm.Native = elm.Native || {};-    elm.Native.Show = elm.Native.Show || {};-    if (elm.Native.Show.values) return elm.Native.Show.values;--    var NList = Elm.Native.List.make(elm);-    var List = Elm.List.make(elm);-    var Maybe = Elm.Maybe.make(elm);-    var JS = Elm.JavaScript.make(elm);-    var Dict = Elm.Dict.make(elm);-    var Json = Elm.Json.make(elm);-    var Tuple2 = Elm.Native.Utils.make(elm).Tuple2;--    var toString = function(v) {-        var type = typeof v;-        if (type === "function") {-            var name = v.func ? v.func.name : v.name;-            return '<function' + (name === '' ? '' : ': ') + name + '>';-        } else if (type === "boolean") {-            return v ? "True" : "False";-        } else if (type === "number") {-            return v+"";-        } else if ((v instanceof String) && v.isChar) {-            return "'" + addSlashes(v) + "'";-        } else if (type === "string") {-            return '"' + addSlashes(v) + '"';-        } else if (type === "object" && '_' in v && probablyPublic(v)) {-            var output = [];-            for (var k in v._) {-                for (var i = v._[k].length; i--; ) {-                    output.push(k + " = " + toString(v._[k][i]));-                }-            }-            for (var k in v) {-                if (k === '_') continue;-                output.push(k + " = " + toString(v[k]));-            }-            if (output.length === 0) return "{}";-            return "{ " + output.join(", ") + " }";-        } else if (type === "object" && 'ctor' in v) {-            if (v.ctor.substring(0,6) === "_Tuple") {-                var output = [];-                for (var k in v) {-                    if (k === 'ctor') continue;-                    output.push(toString(v[k]));-                }-                return "(" + output.join(",") + ")";-            } else if (v.ctor === "::") {-                var output = '[' + toString(v._0);-                v = v._1;-                while (v.ctor === "::") {-                    output += "," + toString(v._0);-                    v = v._1;-                }-                return output + ']';-            } else if (v.ctor === "[]") {-                return "[]";-            } else if (v.ctor === "RBNode" || v.ctor === "RBEmpty") {-                var cons = F3(function(k,v,acc){return NList.Cons(Tuple2(k,v),acc)});-                var list = A3(Dict.foldr, cons, NList.Nil, v);-                var name = "Dict";-                if (list.ctor === "::" && list._0._1.ctor === "_Tuple0") {-                    name = "Set";-                    list = A2(List.map, function(x){return x._0}, list);-                }-                return name + ".fromList " + toString(list);-            } else {-                var output = "";-                for (var i in v) {-                    if (i === 'ctor') continue;-                    var str = toString(v[i]);-                    var parenless = str[0] === '{' || str[0] === '<' || str.indexOf(' ') < 0;-                    output += ' ' + (parenless ? str : '(' + str + ')');-                }-                return v.ctor + output;-            }-        }-        if (type === 'object' && 'recv' in v) return '<signal>';-        return "<internal structure>";-    };--    function addSlashes(str) {-        return str.replace(/\\/g, '\\\\')-                  .replace(/\n/g, '\\n')-                  .replace(/\t/g, '\\t')-                  .replace(/\r/g, '\\r')-                  .replace(/\v/g, '\\v')-                  .replace(/\0/g, '\\0')-                  .replace(/\'/g, "\\'")-                  .replace(/\"/g, '\\"');-    }--    function probablyPublic(v) {-        var keys = Object.keys(v);-        var len = keys.length;-        if (len === 3-            && 'props' in v-            && 'element' in v) return false;-        if (len === 5-            && 'horizontal' in v-            && 'vertical' in v-            && 'x' in v-            && 'y' in v) return false;-        if (len === 7-            && 'theta' in v-            && 'scale' in v-            && 'x' in v-            && 'y' in v-            && 'alpha' in v-            && 'form' in v) return false;-        return true;-    }--    return elm.Native.Show.values = { show:toString };-};-Elm.Native.String = {};-Elm.Native.String.make = function(elm) {-    elm.Native = elm.Native || {};-    elm.Native.String = elm.Native.String || {};-    if (elm.Native.String.values) return elm.Native.String.values;-    if ('values' in Elm.Native.String)-        return elm.Native.String.values = Elm.Native.String.values;--    var Char = Elm.Char.make(elm);-    var Maybe = Elm.Maybe.make(elm);-    var JS = Elm.JavaScript.make(elm);-    var Utils = Elm.Native.Utils.make(elm);--    function isEmpty(str) {-        return str.length === 0;-    }-    function cons(chr,str) {-        return chr + str;-    }-    function uncons(str) {-        var hd;-        return (hd = str[0]) ? Maybe.Just(Utils.Tuple2(Utils.chr(hd), str.slice(1)))-                              : Maybe.Nothing;-    }-    function append(a,b) {-        return a + b;-    }-    function concat(strs) {-        return JS.fromList(strs).join('');-    }-    function length(str) {-        return str.length;-    }-    function map(f,str) {-        var out = str.split('');-        for (var i = out.length; i--; ) {-            out[i] = f(Utils.chr(out[i]));-        }-        return out.join('');-    }-    function filter(pred,str) {-        return str.split('').map(Utils.chr).filter(pred).join('');-    }-    function reverse(str) {-        return str.split('').reverse().join('');-    }-    function foldl(f,b,str) {-        var len = str.length;-        for (var i = 0; i < len; ++i) {-            b = A2(f, Utils.chr(str[i]), b);-        }-        return b;-    }-    function foldr(f,b,str) {-        for (var i = str.length; i--; ) {-            b = A2(f, Utils.chr(str[i]), b);-        }-        return b;-    }--    function split(sep, str) {-        return JS.toList(str.split(sep));-    }-    function join(sep, strs) {-        return JS.fromList(strs).join(sep);-    }-    function repeat(n, str) {-        var result = '';-        while (n > 0) {-            if (n & 1) result += str;-            n >>= 1, str += str;-        }-        return result;-    }--    function sub(start, end, str) {-        return str.slice(start,end);-    }-    function left(n, str) {-        return n < 1 ? "" : str.slice(0,n);-    }-    function right(n, str) {-        return n < 1 ? "" : str.slice(-n);-    }-    function dropLeft(n, str) {-        return n < 1 ? str : str.slice(n);-    }-    function dropRight(n, str) {-        return n < 1 ? str : str.slice(0,-n);-    }--    function pad(n,chr,str) {-        var half = (n - str.length) / 2;-        return repeat(Math.ceil(half),chr) + str + repeat(half|0,chr);-    }-    function padRight(n,chr,str) {-        return str + repeat(n - str.length, chr);-    }-    function padLeft(n,chr,str) {-        return repeat(n - str.length, chr) + str;-    }--    function trim(str) {-        return str.trim();-    }-    function trimLeft(str) {-        return str.trimLeft();-    }-    function trimRight(str) {-        return str.trimRight();-    }--    function words(str) {-        return JS.toList(str.split(/\s+/g));-    }-    function lines(str) {-        return JS.toList(str.split(/\r\n|\r|\n/g));-    }--    function toUpper(str) {-        return str.toUpperCase();-    }-    function toLower(str) {-        return str.toLowerCase();-    }--    function any(pred, str) {-        for (var i = str.length; i--; ) {-            if (pred(Utils.chr(str[i]))) return true;-        }-        return false;-    }-    function all(pred, str) {-        for (var i = str.length; i--; ) {-            if (!pred(Utils.chr(str[i]))) return false;-        }-        return true;-    }--    function contains(sub, str) {-        return str.indexOf(sub) > -1;-    }-    function startsWith(sub, str) {-        return str.indexOf(sub) === 0;-    }-    function endsWith(sub, str) {-        return str.lastIndexOf(sub) === str.length - sub.length;-    }-    function indexes(sub, str) {-        var subLen = sub.length;-        var i = 0;-        var is = [];-        while ((i = str.indexOf(sub, i)) > -1) {-            is.push(i);-            i = i + subLen;-        }-        return JS.toList(is);-    }--    function toInt(s) {-        var len = s.length;-        if (len === 0) { return Maybe.Nothing; }-        var start = 0;-        if (s[0] == '-') {-            if (len === 1) { return Maybe.Nothing; }-            start = 1;-        }-        for (var i = start; i < len; ++i) {-            if (!Char.isDigit(s[i])) { return Maybe.Nothing; }-        }-        return Maybe.Just(parseInt(s, 10));-    }--    function toFloat(s) {-        var len = s.length;-        if (len === 0) { return Maybe.Nothing; }-        var start = 0;-        if (s[0] == '-') {-            if (len === 1) { return Maybe.Nothing; }-            start = 1;-        }-        var dotCount = 0;-        for (var i = start; i < len; ++i) {-            if (Char.isDigit(s[i])) { continue; }-            if (s[i] === '.') {-                dotCount += 1;-                if (dotCount <= 1) { continue; }-            }-            return Maybe.Nothing;-        }-        return Maybe.Just(parseFloat(s));-    }--    function toList(str) {-        return JS.toList(str.split('').map(Utils.chr));-    }-    function fromList(chars) {-        return JS.fromList(chars).join('');-    }--    return Elm.Native.String.values = {-        isEmpty: isEmpty,-        cons: F2(cons),-        uncons: uncons,-        append: F2(append),-        concat: concat,-        length: length,-        map: F2(map),-        filter: F2(filter),-        reverse: reverse,-        foldl: F3(foldl),-        foldr: F3(foldr),--        split: F2(split),-        join: F2(join),-        repeat: F2(repeat),--        sub: F3(sub),-        left: F2(left),-        right: F2(right),-        dropLeft: F2(dropLeft),-        dropRight: F2(dropRight),--        pad: F3(pad),-        padLeft: F3(padLeft),-        padRight: F3(padRight),--        trim: trim,-        trimLeft: trimLeft,-        trimRight: trimRight,--        words: words,-        lines: lines,--        toUpper: toUpper,-        toLower: toLower,--        any: F2(any),-        all: F2(all),--        contains: F2(contains),-        startsWith: F2(startsWith),-        endsWith: F2(endsWith),-        indexes: F2(indexes),--        toInt: toInt,-        toFloat: toFloat,-        toList: toList,-        fromList: fromList,-    };-};Elm.Native.Text = {};-Elm.Native.Text.make = function(elm) {-    elm.Native = elm.Native || {};-    elm.Native.Text = elm.Native.Text || {};-    if (elm.Native.Text.values) return elm.Native.Text.values;--    var JS = Elm.JavaScript.make(elm);-    var Utils = Elm.Native.Utils.make(elm);-    var Color = Elm.Native.Color.make(elm);-    var Element = Elm.Graphics.Element.make(elm);-    var show = Elm.Native.Show.make(elm).show;--    function makeSpaces(s) {-        if (s.length == 0) { return s; }-        var arr = s.split('');-        if (arr[0] == ' ') { arr[0] = "&nbsp;" }      -        for (var i = arr.length; --i; ) {-            if (arr[i][0] == ' ' && arr[i-1] == ' ') {-                arr[i-1] = arr[i-1] + arr[i];-                arr[i] = '';-            }-        }-        for (var i = arr.length; i--; ) {-            if (arr[i].length > 1 && arr[i][0] == ' ') {-                var spaces = arr[i].split('');-                for (var j = spaces.length - 2; j >= 0; j -= 2) {-                    spaces[j] = '&nbsp;';-                }-                arr[i] = spaces.join('');-            }-        }-        arr = arr.join('');-        if (arr[arr.length-1] === " ") {-	    return arr.slice(0,-1) + '&nbsp;';-        }-        return arr;-    }--    function properEscape(str) {-        if (str.length == 0) return str;-        str = str //.replace(/&/g,  "&#38;")-	    .replace(/"/g,  '&#34;')-	    .replace(/'/g,  "&#39;")-	    .replace(/</g,  "&#60;")-	    .replace(/>/g,  "&#62;")-	    .replace(/\n/g, "<br/>");-        var arr = str.split('<br/>');-        for (var i = arr.length; i--; ) {-	    arr[i] = makeSpaces(arr[i]);-        }-        return arr.join('<br/>');-    }--    function toText(str) { return Utils.txt(properEscape(JS.fromString(str))); }--    function height(px, text) {-        return { style: 'font-size:' + px + 'px;', text:text }-    }-    function typeface(name, text) {-        return { style: 'font-family:' + name + ';', text:text }-    }-    function monospace(text) {-        return { style: 'font-family:monospace;', text:text }-    }-    function italic(text) {-        return { style: 'font-style:italic;', text:text }-    }-    function bold(text) {-        return { style: 'font-weight:bold;', text:text }-    }-    function link(href, text) {-        return { href: toText(href), text:text };-    }-    function underline(text) {-        return { line: ' underline', text:text };-    }-    function overline(text) {-        return { line: ' overline', text:text };-    }-    function strikeThrough(text) {-        return { line: ' line-through', text:text };-    }--    function color(c, text) {-        var color = (c._3 === 1)-            ? ('rgb(' + c._0 + ', ' + c._1 + ', ' + c._2 + ')')-            : ('rgba(' + c._0 + ', ' + c._1 + ', ' + c._2 + ', ' + c._3 + ')');-        return { style: 'color:' + color + ';', text:text };-    }--    function position(align) {-        function create(text) {-            var raw = {-                ctor:'RawHtml',-                html: Utils.makeText('text-align:' + align + ';', text),-                guid: null,-                args: [],-            };-            var pos = A2(Utils.htmlHeight, 0, raw);-            return A3(Element.newElement, pos._0, pos._1, raw);-        }-        return create;-    }--    function markdown(text, guid) {-        var raw = {-            ctor:'RawHtml',-            html: text,-            guid: guid,-            args: [],-        };-        var pos = A2(Utils.htmlHeight, 0, raw);-        return A3(Element.newElement, pos._0, pos._1, raw);-    }--    var text = position('left');-    function asText(v) {-        return text(monospace(toText(show(v))));-    }--    function plainText(v) {-        return text(toText(v));-    }--    return elm.Native.Text.values = {-        toText: toText,--        height : F2(height),-        italic : italic,-        bold : bold,-        underline : underline,-        overline : overline,-        strikeThrough : strikeThrough,-        monospace : monospace,-        typeface : F2(typeface),-        color : F2(color),-        link : F2(link),--        justified : position('justify'),-        centered : position('center'),-        righted : position('right'),-        text : text,-        plainText : plainText,-        markdown : markdown,--        asText : asText,-    };-};Elm.Native.Transform2D = {};-Elm.Native.Transform2D.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.Transform2D = elm.Native.Transform2D || {};- if (elm.Native.Transform2D.values) return elm.Native.Transform2D.values;-- var A;- if (typeof Float32Array === 'undefined') {-     A = function(arr) {-         this.length = arr.length;-         this[0] = arr[0];-         this[1] = arr[1];-         this[2] = arr[2];-         this[3] = arr[3];-         this[4] = arr[4];-         this[5] = arr[5];-     };- } else {-     A = Float32Array;- }-- // layout of matrix in an array is- //- //   | m11 m12 dx |- //   | m21 m22 dy |- //   |  0   0   1 |- //- //  new A([ m11, m12, dx, m21, m22, dy ])-- var identity = new A([1,0,0,0,1,0]);- function matrix(m11, m12, m21, m22, dx, dy) {-     return new A([m11, m12, dx, m21, m22, dy]);- }- function rotation(t) {-     var c = Math.cos(t);-     var s = Math.sin(t);-     return new A([c, -s, 0, s, c, 0]);- }- function rotate(t,m) {-     var c = Math.cos(t);-     var s = Math.sin(t);-     var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4];-     return new A([m11*c + m12*s, -m11*s + m12*c, m[2],-                   m21*c + m22*s, -m21*s + m22*c, m[5]]);- }- /*- function move(xy,m) {-     var x = xy._0;-     var y = xy._1;-     var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4];-     return new A([m11, m12, m11*x + m12*y + m[2],-                   m21, m22, m21*x + m22*y + m[5]]);- }- function scale(s,m) { return new A([m[0]*s, m[1]*s, m[2], m[3]*s, m[4]*s, m[5]]); }- function scaleX(x,m) { return new A([m[0]*x, m[1], m[2], m[3]*x, m[4], m[5]]); }- function scaleY(y,m) { return new A([m[0], m[1]*y, m[2], m[3], m[4]*y, m[5]]); }- function reflectX(m) { return new A([-m[0], m[1], m[2], -m[3], m[4], m[5]]); }- function reflectY(m) { return new A([m[0], -m[1], m[2], m[3], -m[4], m[5]]); }-- function transform(m11, m21, m12, m22, mdx, mdy, n) {-     var n11 = n[0], n12 = n[1], n21 = n[3], n22 = n[4], ndx = n[2], ndy = n[5];-     return new A([m11*n11 + m12*n21,-                   m11*n12 + m12*n22,-                   m11*ndx + m12*ndy + mdx,-                   m21*n11 + m22*n21,-                   m21*n12 + m22*n22,-                   m21*ndx + m22*ndy + mdy]);- }- */- function multiply(m, n) {-     var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4], mdx = m[2], mdy = m[5];-     var n11 = n[0], n12 = n[1], n21 = n[3], n22 = n[4], ndx = n[2], ndy = n[5];-     return new A([m11*n11 + m12*n21,-                   m11*n12 + m12*n22,-                   m11*ndx + m12*ndy + mdx,-                   m21*n11 + m22*n21,-                   m21*n12 + m22*n22,-                   m21*ndx + m22*ndy + mdy]);- }-- return elm.Native.Transform2D.values = {-     identity:identity,-     matrix:F6(matrix),-     rotation:rotation,-     multiply:F2(multiply)-     /*-     transform:F7(transform),-     rotate:F2(rotate),-     move:F2(move),-     scale:F2(scale),-     scaleX:F2(scaleX),-     scaleY:F2(scaleY),-     reflectX:reflectX,-     reflectY:reflectY-     */- };--};-Elm.Native.Utils = {};-Elm.Native.Utils.make = function(elm) {--    elm.Native = elm.Native || {};-    elm.Native.Utils = elm.Native.Utils || {};-    if (elm.Native.Utils.values) return elm.Native.Utils.values;--    function eq(x,y) {-        if (x === y) return true;-        if (typeof x === "object") {-            var c = 0;-            for (var i in x) { ++c; if (!eq(x[i],y[i])) return false; }-            return c === Object.keys(y).length;-        }-        if (typeof x === 'function') {-            throw new Error('Equality error: general function equality is ' +-                            'undecidable, and therefore, unsupported');-        }-        return x === y;-    }--    // code in Generate/JavaScript.hs depends on the particular-    // integer values assigned to LT, EQ, and GT-    var LT = -1, EQ = 0, GT = 1, ord = ['LT','EQ','GT'];-    function compare(x,y) { return { ctor: ord[cmp(x,y)+1] } }-    function cmp(x,y) {-        var ord;-        if (typeof x !== 'object' || x instanceof String){-            return x === y ? EQ : x < y ? LT : GT;-        }--        if (x.ctor === "::" || x.ctor === "[]") {-            while (true) {-                if (x.ctor === "[]" && y.ctor === "[]") return EQ;-                if (x.ctor !== y.ctor) return x.ctor === '[]' ? LT : GT;-                ord = cmp(x._0, y._0);-                if (ord !== EQ) return ord;-                x = x._1;-                y = y._1;-            }-        }--        if (x.ctor.slice(0,6) === '_Tuple') {-            var n = x.ctor.slice(6) - 0;-            var err = 'cannot compare tuples with more than 6 elements.';-            if (n === 0) return EQ;-            if (n >= 1) { ord = cmp(x._0, y._0); if (ord !== EQ) return ord;-            if (n >= 2) { ord = cmp(x._1, y._1); if (ord !== EQ) return ord;-            if (n >= 3) { ord = cmp(x._2, y._2); if (ord !== EQ) return ord;-            if (n >= 4) { ord = cmp(x._3, y._3); if (ord !== EQ) return ord;-            if (n >= 5) { ord = cmp(x._4, y._4); if (ord !== EQ) return ord;-            if (n >= 6) { ord = cmp(x._5, y._5); if (ord !== EQ) return ord;-            if (n >= 7) throw new Error('Comparison error: ' + err); } } } } } }-            return EQ;-        }-        throw new Error('Comparison error: comparison is only defined on ints, ' +-                        'floats, times, chars, strings, lists of comparable values, ' +-                        'and tuples of comparable values.')-    }---    var Tuple0 = { ctor: "_Tuple0" };-    function Tuple2(x,y) { return { ctor:"_Tuple2", _0:x, _1:y } }--    function chr(c) {-        var x = new String(c);-        x.isChar = true;-        return x;-    }--    function txt(str) {-        var t = new String(str);-        t.text = true;-        return t;-    }--    function makeText(style, text) {-        var style = style;-        var line = '';-        var href = '';-        while (true) {-            if (text.line) {-                line += text.line;-                text = text.text;-                continue;-            }-            if (text.style) {-                style += text.style;-                text = text.text;-                continue;-            }-            if (text.href) {-                href = text.href;-                text = text.text;-                continue;-            }-            if (href) text = '<a href="' + href + '">' + text + '</a>';-            if (line) style += 'text-decoration:' + line + ';';-            if (style) text = '<span style="' + style + '">' + text + '</span>';-            return text;-        }-    }--    var count = 0;-    function guid(_) { return count++ }--    function copy(r) {-        var o = {};-        for (var i in r) { o[i] = r[i]; }-        return o;-    }--    function remove(x,r) {-        var o = copy(r);-        if (x in o._) {-            o[x] = o._[x][0];-            o._[x] = o._[x].slice(1);-            if (o._[x].length === 0) { delete o._[x]; }-        } else {-            delete o[x];-        }-        return o;-    }--    function replace(kvs,r) {-        var o = copy(r);-        for (var i = kvs.length; i--; ) {-            var kvsi = kvs[i];-            o[kvsi[0]] = kvsi[1];-        }-        return o;-    }--    function insert(x,v,r) {-        var o = copy(r);-        if (x in o) o._[x] = [o[x]].concat(x in o._ ? o._[x].slice(0) : []);-        o[x] = v;-        return o;-    }--    function max(a,b) { return a > b ? a : b }-    function min(a,b) { return a < b ? a : b }--    function mod(a,b) {-        if (b === 0) {-            throw new Error("Cannot perform mod 0. Division by zero error.");-        }-        var r = a % b;-        var m = a === 0 ? 0 : (b > 0 ? (a >= 0 ? r : r+b) : -mod(-a,-b));--        return m === b ? 0 : m;-    }--    function htmlHeight(width, rawHtml) {-        // create dummy node-        var html = rawHtml.html;-        var t = document.createElement('div');-        t.innerHTML = html;-        if (width > 0) { t.style.width = width + "px"; }-        t.style.visibility = "hidden";-        t.style.styleFloat = "left";-        t.style.cssFloat   = "left";--        document.body.appendChild(t);--        // insert interpolated values-        var args = rawHtml.args;-        var guid = rawHtml.guid;-        for (var i = args.length; i--; ) {-            var arg = args[i];-            var span = document.getElementById('md-' + guid + '-' + i);-            if (arg.isElement) {-                span.style.width = arg.props.width + 'px';-                span.style.height = arg.props.height + 'px';-            } else {-                span.innerHTML = arg;-            }-        }--        // get dimensions-        var style = window.getComputedStyle(t, null);-        var w = Math.ceil(style.getPropertyValue("width").slice(0,-2) - 0);-        var h = Math.ceil(style.getPropertyValue("height").slice(0,-2) - 0);-        document.body.removeChild(t);-        return Tuple2(w,h);-    }--    function getXY(e) {-        var posx = 0;-        var posy = 0;-        if (e.pageX || e.pageY) {-            posx = e.pageX;-            posy = e.pageY;-        } else if (e.clientX || e.clientY) {-            posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;-            posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;-        }--        if (elm.display === ElmRuntime.Display.COMPONENT) {-            var rect = elm.node.getBoundingClientRect();-            var relx = rect.left + document.body.scrollLeft + document.documentElement.scrollLeft;-            var rely = rect.top + document.body.scrollTop + document.documentElement.scrollTop;-            // TODO: figure out if there is a way to avoid rounding here-            posx = posx - Math.round(relx) - elm.node.clientLeft;-            posy = posy - Math.round(rely) - elm.node.clientTop;-        }-        return Tuple2(posx, posy);-    }--    return elm.Native.Utils.values = {-        eq:eq,-        cmp:cmp,-        compare:F2(compare),-        Tuple0:Tuple0,-        Tuple2:Tuple2,-        chr:chr,-        txt:txt,-        makeText:makeText,-        copy: copy,-        remove: remove,-        replace: replace,-        insert: insert,-        guid: guid,-        max : F2(max),-        min : F2(min),-        mod : F2(mod),-        htmlHeight: F2(htmlHeight),-        getXY: getXY,-        toFloat: function(x) { return +x; }-    };-};-Elm.Native.Graphics.Collage = {};-Elm.Native.Graphics.Collage.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.Graphics = elm.Native.Graphics || {};- elm.Native.Graphics.Collage = elm.Native.Graphics.Collage || {};- if (elm.Native.Graphics.Collage.values) return elm.Native.Graphics.Collage.values;-- var newElement = Elm.Graphics.Element.make(elm).newElement;- var C = ElmRuntime.use(ElmRuntime.Render.Collage);-- function collage(w,h,forms) {-     return A3(newElement, w, h, {-                 ctor: 'Custom',-		 type: 'Collage',-		 render: C.render,-		 update: C.update,-		 model: {w:w, h:h, forms:forms}-	 });- }- return elm.Native.Graphics.Collage.values = { collage:F3(collage) };--};Elm.Native.Graphics.Input = {};-Elm.Native.Graphics.Input.make = function(elm) {-- elm.Native = elm.Native || {};- elm.Native.Graphics = elm.Native.Graphics || {};- elm.Native.Graphics.Input = elm.Native.Graphics.Input || {};- if (elm.Native.Graphics.Input.values) return elm.Native.Graphics.Input.values;-- var Render = ElmRuntime.use(ElmRuntime.Render.Element);- var newNode = ElmRuntime.use(ElmRuntime.Render.Utils).newElement;-- var Signal = Elm.Signal.make(elm);- var newElement = Elm.Graphics.Element.make(elm).newElement;- var JS = Elm.Native.JavaScript.make(elm);- var Utils = Elm.Native.Utils.make(elm);- var Tuple2 = Utils.Tuple2;-- function dropDown(values) {-     var entries = JS.fromList(values);-     var events = Signal.constant(entries[0]._1);--     var drop = newNode('select');-     drop.style.border = '0 solid';-     for (var i = 0; i < entries.length; ++i) {-         var option = newNode('option');-         var name = JS.fromString(entries[i]._0);-         option.value = name;-         option.innerHTML = name;-         drop.appendChild(option);-     }-     drop.addEventListener('change', function() {-             elm.notify(events.id, entries[drop.selectedIndex]._1);-         });--     var t = drop.cloneNode(true);-     t.style.visibility = "hidden";--     elm.node.appendChild(t);-     var style = window.getComputedStyle(t, null);-     var w = Math.ceil(style.getPropertyValue("width").slice(0,-2) - 0);-     var h = Math.ceil(style.getPropertyValue("height").slice(0,-2) - 0);-     elm.node.removeChild(t);-     -     var element = A3(newElement, w, h, {-             ctor: 'Custom',-             type: 'DropDown',-             render: function render(model) { return drop; },-             update: function update(node, oldModel, newModel) {},-             model: {}-         });--     return Tuple2(Signal.constant(element), events);- }-- function buttons(defaultValue) {-     var events = Signal.constant(defaultValue);--     function render(model) {-         var b = newNode('button');-         b.style.display = 'block';-         b.elmEvent = model.event;-         function click() { elm.notify(events.id, b.elmEvent); }-         b.addEventListener('click', click);-         b.innerHTML = model.text;-         return b;-     }--     function update(node, oldModel, newModel) {-         node.elmEvent = newModel.event;-         var txt = newModel.text;-         if (oldModel.text !== txt) node.innerHTML = txt;-     }--     function button(evnt, txt) {-         return A3(newElement, 100, 40, {-                     ctor: 'Custom',-                     type: 'Button',-                     render: render,-                     update: update,-                     model: { event:evnt, text:JS.fromString(txt) }-             });-     }--     return { _:{}, button:F2(button), events:events };- }-- function customButtons(defaultValue) {-     var events = Signal.constant(defaultValue);--     function render(model) {-         var btn = newNode('div');-         btn.elmEvent = model.event;--         btn.elmUp    = Render.render(model.up);-         btn.elmHover = Render.render(model.hover);-         btn.elmDown  = Render.render(model.down);--         function replace(node) {-           if (node !== btn.firstChild) btn.replaceChild(node, btn.firstChild);-         }-         var overCount = 0;-         function over(e) {-             if (overCount++ > 0) return;-             replace(btn.elmHover);-         }-         function out(e) {-             if (btn.contains(e.toElement || e.relatedTarget)) return;-             overCount = 0;-             replace(btn.elmUp);-         }-         function up() {-             replace(btn.elmHover);-             elm.notify(events.id, btn.elmEvent);-         }-         function down() { replace(btn.elmDown); }-         btn.addEventListener('mouseover', over);-         btn.addEventListener('mouseout' , out);-         btn.addEventListener('mousedown', down);-         btn.addEventListener('mouseup'  , up);--         btn.appendChild(btn.elmUp);--         var clicker = newNode('div');-         clicker.style.width = btn.elmUp.style.width;-         clicker.style.height = btn.elmUp.style.height;-         clicker.style.position = 'absolute';-         clicker.style.top = 0;-         btn.appendChild(clicker);--         return btn;-     }--     function update(node, oldModel, newModel) {-         node.elmEvent = newModel.event;-         Render.update(node.elmUp, oldModel.up, newModel.up)-         Render.update(node.elmHover, oldModel.hover, newModel.hover)-         Render.update(node.elmDown, oldModel.down, newModel.down)-     }--     function button(evnt, up, hover, down) {-         return A3(newElement,-                   Math.max(up.props.width, hover.props.width, down.props.width),-                   Math.max(up.props.height, hover.props.height, down.props.height),-                   { ctor: 'Custom',-                     type: 'CustomButton',-                     render: render,-                     update: update,-                     model: { event:evnt, up:up, hover:hover, down:down }-                   });-     }--     return { _:{}, customButton:F4(button), events:events };- }--- function hoverables(defaultValue) {-     var events = Signal.constant(defaultValue);-     function hoverable(handler, elem) {-         function onHover(bool) {-             elm.notify(events.id, handler(bool));-         }-         var props = Utils.replace([['hover',onHover]], elem.props);-         return { props:props, element:elem.element };-     }-     return { _:{}, hoverable:F2(hoverable), events:events };- }--- function checkboxes(defaultValue) {-     var events = Signal.constant(defaultValue);--     function render(model) {-         var b = newNode('input');-         b.type = 'checkbox';-         b.checked = model.checked;-         b.style.display = 'block';-         b.elmHandler = model.handler;-         function change() { elm.notify(events.id, b.elmHandler(b.checked)); }-         b.addEventListener('change', change);-         return b;-     }--     function update(node, oldModel, newModel) {-         node.elmHandler = newModel.handler;-         node.checked = newModel.checked;-         return true;-     }--     function box(handler, checked) {-         return A3(newElement, 13, 13, {-                     ctor: 'Custom',-                     type: 'CheckBox',-                     render: render,-                     update: update,-                     model: { checked:checked, handler:handler  }-             });-     }--     return { _:{}, checkbox:F2(box), events:events };- }-- function setRange(node, start, end, dir) {-     if (node.parentNode) {-         node.setSelectionRange(start, end, dir);-     } else {-         setTimeout(function(){node.setSelectionRange(start, end, dir);}, 0);-     }- }-- function mkTextPool(type) { return function fields(defaultValue) {-     var events = Signal.constant(defaultValue);--     var state = null;--     function render(model) {-         var field = newNode('input');-         field.elmHandler = model.handler;--         field.id = 'test';-         field.type = type;-         field.placeholder = JS.fromString(model.placeHolder);-         field.value = JS.fromString(model.state.string);-         setRange(field, model.state.selectionStart, model.state.selectionEnd, 'forward');-         field.style.border = 'none';-         state = model.state;--         function update() {-             var start = field.selectionStart,-                 end = field.selectionEnd;-             if (field.selectionDirection === 'backward') {-                 start = end;-                 end = field.selectionStart;-             }-             state = { _:{},-                       string:JS.toString(field.value),-                       selectionStart:start,-                       selectionEnd:end };-             elm.notify(events.id, field.elmHandler(state));-         }-         function mousedown() {-             update();-             elm.node.addEventListener('mouseup', mouseup);-         }-         function mouseup() {-             update();-             elm.node.removeEventListener('mouseup', mouseup)-         }-         field.addEventListener('keyup', update);-         field.addEventListener('mousedown', mousedown);--         return field;-     }--     function update(node, oldModel, newModel) {-         node.elmHandler = newModel.handler;-         if (state === newModel.state) return;-         var newStr = JS.fromString(newModel.state.string);-         if (node.value !== newStr) node.value = newStr;--         var start = newModel.state.selectionStart;-         var end = newModel.state.selectionEnd;-         var direction = 'forward';-         if (end < start) {-             start = end;-             end = newModel.state.selectionStart;-             direction = 'backward';-         }- -         if (node.selectionStart !== start-             || node.selectionEnd !== end-             || node.selectionDirection !== direction) {-             setRange(node, start, end, direction);-         }-     }--     function field(handler, placeHolder, state) {-         return A3(newElement, 200, 30,-                   { ctor: 'Custom',-                     type: type + 'Input',-                     render: render,-                     update: update,-                     model: { handler:handler,-                              placeHolder:placeHolder,-                              state:state }-                   });-     }--     return { _:{}, field:F3(field), events:events };-   }- }-- return elm.Native.Graphics.Input.values = {-     buttons:buttons,-     customButtons:customButtons,-     hoverables:hoverables,-     checkboxes:checkboxes,-     fields:mkTextPool('text'),-     emails:mkTextPool('email'),-     passwords:mkTextPool('password'),-     dropDown:dropDown- };--};-Elm.Native.Http = {};-Elm.Native.Http.make = function(elm) {--  elm.Native = elm.Native || {};-  elm.Native.Http = elm.Native.Http || {};-  if (elm.Native.Http.values) return elm.Native.Http.values;---  var JS = Elm.JavaScript.make(elm);-  var List = Elm.List.make(elm);-  var Signal = Elm.Signal.make(elm);---  function registerReq(queue,responses) { return function(req) {-    if (req.url.ctor !== '[]') { sendReq(queue,responses,req); }-   };-  }--  function updateQueue(queue,responses) {-    if (queue.length > 0) {-      elm.notify(responses.id, queue[0].value);-      if (queue[0].value.ctor !== 'Waiting') {-        queue.shift();-        setTimeout(function() { updateQueue(queue,responses); }, 0);-      }-    }-  }--  function sendReq(queue,responses,req) {-    var response = { value: { ctor:'Waiting' } };-    queue.push(response);--    var request = null;-    if (window.ActiveXObject)  { request = new ActiveXObject("Microsoft.XMLHTTP"); }-    if (window.XMLHttpRequest) { request = new XMLHttpRequest(); }-    request.onreadystatechange = function(e) {-      if (request.readyState === 4) {-        response.value = (request.status >= 200 && request.status < 300 ?-        { ctor:'Success', _0:JS.toString(request.responseText) } :-        { ctor:'Failure', _0:request.status, _1:JS.toString(request.statusText) });-        setTimeout(function() { updateQueue(queue,responses); }, 0);-      }-    };-    request.open(JS.fromString(req.verb), JS.fromString(req.url), true);-    function setHeader(pair) {-      request.setRequestHeader( JS.fromString(pair._0), JS.fromString(pair._1) );-    }-    List.map(setHeader)(req.headers);-    request.send(JS.fromString(req.body));-  }--  function send(requests) {-    var responses = Signal.constant(elm.Http.values.Waiting);-    var sender = A2( Signal.lift, registerReq([],responses), requests );-    function f(x) { return function(y) { return x; } }-    return A3( Signal.lift2, f, responses, sender );-  }--  return elm.Native.Http.values = {send:send};--};-Elm.Native.Keyboard = {};-Elm.Native.Keyboard.make = function(elm) {--  elm.Native = elm.Native || {};-  elm.Native.Keyboard = elm.Native.Keyboard || {};-  if (elm.Native.Keyboard.values) return elm.Native.Keyboard.values;--  // Duplicated from Native.Signal-  function send(node, timestep, changed) {-    var kids = node.kids;-    for (var i = kids.length; i--; ) {-      kids[i].recv(timestep, changed, node.id);-    }-  }--  var Signal = Elm.Signal.make(elm);-  var NList = Elm.Native.List.make(elm);-  var Utils = Elm.Native.Utils.make(elm);--  var downEvents = Signal.constant(0);-  var upEvents = Signal.constant(0);-  var blurEvents = Signal.constant(0);--  elm.addListener([downEvents.id], document, 'keydown', function down(e) {-    elm.notify(downEvents.id, e.keyCode);-  });--  elm.addListener([upEvents.id], document, 'keyup', function up(e) {-    elm.notify(upEvents.id, e.keyCode);-  });--  elm.addListener([blurEvents.id], document, 'blur', function blur(e) {-    elm.notify(blurEvents.id, NList.Nil);-  });--  function KeyMerge(down, up, blur) {-    var args = [down,up,blur];-    this.id = Utils.guid();-    // Ignore starting values here-    this.value = NList.Nil-    this.kids = [];-    -    var n = args.length;-    var count = 0;-    var isChanged = false;--    this.recv = function(timestep, changed, parentID) {-      ++count;-      if (changed) { -        // We know this a change must only be one of the following cases-        if (parentID === down.id && !(NList.member(down.value)(this.value))) {-          isChanged = true;-          this.value = NList.Cons(down.value, this.value); -        } -        if (parentID === up.id) {-          isChanged = true;-          var notEq = function(kc) { return kc !== up.value };-          this.value = NList.filter(notEq)(this.value);-        } -        if (parentID === blur.id) {-          isChanged = true;-          this.value = NList.Nil;-        }-      }-      if (count == n) {-        send(this, timestep, isChanged);-        isChanged = false;-        count = 0;-      }-    };--    for (var i = n; i--; ) { args[i].kids.push(this); }--  }--  var keysDown = Signal.dropRepeats(new KeyMerge(downEvents,upEvents,blurEvents));--  function keySignal(f) {-    var signal = A2(Signal.lift, f, keysDown);-    // must set the default number of kids to make it possible to filter-    // these signals if they are not actually used.-    keysDown.defaultNumberOfKids += 1;-    signal.defaultNumberOfKids = 1;-    var filtered = Signal.dropRepeats(signal)-    filtered.defaultNumberOfKids = 0;-    return filtered;-  }--  function dir(up, down, left, right) {-    function f(ks) {-      var x = 0, y = 0;-      while (ks.ctor === "::") {-        switch (ks._0) {-          case left : --x; break;-          case right: ++x; break;-          case up   : ++y; break;-          case down : --y; break;-        }-        ks = ks._1;-      }-      return { _:{}, x:x, y:y };-    }-    return keySignal(f);-  }--  function is(key) { return keySignal(NList.member(key)); }--  var lastPressed = downEvents;--  return elm.Native.Keyboard.values = {-    isDown:is,-    directions:F4(dir),-    keysDown:keysDown,-    lastPressed:lastPressed-  };--};-Elm.Native.Mouse = {};-Elm.Native.Mouse.make = function(elm) {--    elm.Native = elm.Native || {};-    elm.Native.Mouse = elm.Native.Mouse || {};-    if (elm.Native.Mouse.values) return elm.Native.Mouse.values;--    var Signal = Elm.Signal.make(elm);-    var Utils = Elm.Native.Utils.make(elm);--    var position  = Signal.constant(Utils.Tuple2(0,0));-    position.defaultNumberOfKids = 2;--    // do not move x and y into Elm. By setting their default number-    // of kids, it is possible to detatch the mouse listeners if-    // they are not needed.-    var x = A2( Signal.lift, function(p){return p._0}, position);-    x.defaultNumberOfKids = 0;-    var y = A2( Signal.lift, function(p){return p._1}, position);-    y.defaultNumberOfKids = 0;--    var isDown    = Signal.constant(false);-    var isClicked = Signal.constant(false);-    var clicks = Signal.constant(Utils.Tuple0);--    var node = elm.display === ElmRuntime.Display.FULLSCREEN ? document : elm.node;--    elm.addListener([isClicked.id, clicks.id], node, 'click', function click() {-        elm.notify(isClicked.id, true);-        elm.notify(clicks.id, Utils.Tuple0);-        elm.notify(isClicked.id, false);-    });-    elm.addListener([isDown.id], node, 'mousedown', function down() {-        elm.notify(isDown.id, true);-    });-    elm.addListener([isDown.id], node, 'mouseup', function up() {-        elm.notify(isDown.id, false);-    });-    elm.addListener([position.id], node, 'mousemove', function move(e) {-        elm.notify(position.id, Utils.getXY(e));-    });--    return elm.Native.Mouse.values = {-        position: position,-        x:x,-        y:y,-        isClicked: isClicked,-        isDown: isDown,-        clicks: clicks-    };-};Elm.Native.Random = {};-Elm.Native.Random.make = function(elm) {--    elm.Native = elm.Native || {};-    elm.Native.Random = elm.Native.Random || {};-    if (elm.Native.Random.values) return elm.Native.Random.values;--    var Signal = Elm.Signal.make(elm);-    var List = Elm.Native.List.make(elm);--    function range(min, max, signal) {-        function f(x) { return Math.floor(Math.random() * (max-min+1)) + min; }-        return A2( Signal.lift, f, signal );-    }--    function float_(signal) {-        function f(x) { return Math.random(); }-        return A2( Signal.lift, f, signal );-    }--    function floatList(signal) {-        function f(n) {-            if (n < 0) return List.Nil;-            var arr = new Array(n);-            for (var i = n; i--; ) {-                arr[i] = Math.random();-            }-            return List.fromArray(arr);-        }-        return A2( Signal.lift, f, signal );-    }--    return elm.Native.Random.values = {-        range: F3(range),-        float_: float_,-        floatList: floatList-    };--};--Elm.Native.Signal = {};-Elm.Native.Signal.make = function(elm) {--  elm.Native = elm.Native || {};-  elm.Native.Signal = elm.Native.Signal || {};-  if (elm.Native.Signal.values) return elm.Native.Signal.values;--  var Utils = Elm.Native.Utils.make(elm);-  var foldr1 = Elm.List.make(elm).foldr1;--  function send(node, timestep, changed) {-    var kids = node.kids;-    for (var i = kids.length; i--; ) {-      kids[i].recv(timestep, changed, node.id);-    }-  }--  function Input(base) {-    this.id = Utils.guid();-    this.value = base;-    this.kids = [];-    this.defaultNumberOfKids = 0;-    this.recv = function(timestep, eid, v) {-      var changed = eid === this.id;-      if (changed) { this.value = v; }-      send(this, timestep, changed);-      return changed;-    };-    elm.inputs.push(this);-  }--  function LiftN(update, args) {-    this.id = Utils.guid();-    this.value = update();-    this.kids = [];--    var n = args.length;-    var count = 0;-    var isChanged = false;--    this.recv = function(timestep, changed, parentID) {-      ++count;-      if (changed) { isChanged = true; }-      if (count == n) {-        if (isChanged) { this.value = update(); }-        send(this, timestep, isChanged);-        isChanged = false;-        count = 0;-      }-    };-    for (var i = n; i--; ) { args[i].kids.push(this); }-  }--  function lift(func, a) {-    function update() { return func(a.value); }-    return new LiftN(update, [a]);-  }-  function lift2(func, a, b) {-    function update() { return A2( func, a.value, b.value ); }-    return new LiftN(update, [a,b]);-  }-  function lift3(func, a, b, c) {-    function update() { return A3( func, a.value, b.value, c.value ); }-    return new LiftN(update, [a,b,c]);-  }-  function lift4(func, a, b, c, d) {-    function update() { return A4( func, a.value, b.value, c.value, d.value ); }-    return new LiftN(update, [a,b,c,d]);-  }-  function lift5(func, a, b, c, d, e) {-    function update() { return A5( func, a.value, b.value, c.value, d.value, e.value ); }-    return new LiftN(update, [a,b,c,d,e]);-  }-  function lift6(func, a, b, c, d, e, f) {-    function update() { return A6( func, a.value, b.value, c.value, d.value, e.value, f.value ); }-    return new LiftN(update, [a,b,c,d,e,f]);-  }-  function lift7(func, a, b, c, d, e, f, g) {-    function update() { return A7( func, a.value, b.value, c.value, d.value, e.value, f.value, g.value ); }-    return new LiftN(update, [a,b,c,d,e,f,g]);-  }-  function lift8(func, a, b, c, d, e, f, g, h) {-    function update() { return A8( func, a.value, b.value, c.value, d.value, e.value, f.value, g.value, h.value ); }-    return new LiftN(update, [a,b,c,d,e,f,g,h]);-  }--  function Foldp(step, state, input) {-    this.id = Utils.guid();-    this.value = state;-    this.kids = [];--    this.recv = function(timestep, changed, parentID) {-      if (changed) {-          this.value = A2( step, input.value, this.value );-      }-      send(this, timestep, changed);-    };-    input.kids.push(this);-  }--  function foldp(step, state, input) {-      return new Foldp(step, state, input);-  }--  function DropIf(pred,base,input) {-    this.id = Utils.guid();-    this.value = pred(input.value) ? base : input.value;-    this.kids = [];-    this.recv = function(timestep, changed, parentID) {-      var chng = changed && !pred(input.value);-      if (chng) { this.value = input.value; }-      send(this, timestep, chng);-    };-    input.kids.push(this);-  }--  function DropRepeats(input) {-    this.id = Utils.guid();-    this.value = input.value;-    this.kids = [];-    this.recv = function(timestep, changed, parentID) {-      var chng = changed && !Utils.eq(this.value,input.value);-      if (chng) { this.value = input.value; }-      send(this, timestep, chng);-    };-    input.kids.push(this);-  }--  function dropWhen(s1,b,s2) {-    var pairs = lift2( F2(function(x,y){return {x:x,y:y};}), s1, s2 );-    var dropped = new DropIf(function(p){return p.x;},{x:true,y:b},pairs);-    return lift(function(p){return p.y;}, dropped);-  }--  function timestamp(a) {-    function update() { return Utils.Tuple2(Date.now(), a.value); }-    return new LiftN(update, [a]);-  }--  function SampleOn(s1,s2) {-    this.id = Utils.guid();-    this.value = s2.value;-    this.kids = [];--    var count = 0;-    var isChanged = false;--    this.recv = function(timestep, changed, parentID) {-      if (parentID === s1.id) isChanged = changed;-      ++count;-      if (count == 2) {-        if (isChanged) { this.value = s2.value; }-        send(this, timestep, isChanged);-        count = 0;-        isChanged = false;-      }-    };-    s1.kids.push(this);-    s2.kids.push(this);-  }--  function sampleOn(s1,s2) { return new SampleOn(s1,s2); }--  function delay(t,s) {-      var delayed = new Input(s.value);-      var firstEvent = true;-      function update(v) {-        if (firstEvent) { firstEvent = false; return; }-        setTimeout(function() { elm.notify(delayed.id, v); }, t);-      }-      function first(a,b) { return a; }-      return new SampleOn(delayed, lift2(F2(first), delayed, lift(update,s)));-  }--  function Merge(s1,s2) {-      this.id = Utils.guid();-      this.value = s1.value;-      this.kids = [];--      var next = null;-      var count = 0;-      var isChanged = false;--      this.recv = function(timestep, changed, parentID) {-        ++count;-        if (changed) {-            isChanged = true;-            if (parentID == s2.id && next === null) { next = s2.value; }-            if (parentID == s1.id) { next = s1.value; }-        }--        if (count == 2) {-            if (isChanged) { this.value = next; next = null; }-            send(this, timestep, isChanged);-            isChanged = false;-            count = 0;-        }-      };-      s1.kids.push(this);-      s2.kids.push(this);-  }--  function merge(s1,s2) { return new Merge(s1,s2); }-  function merges(ss) { return A2(foldr1, F2(merge), ss); }--  return elm.Native.Signal.values = {-    constant : function(v) { return new Input(v); },-    lift  : F2(lift ),-    lift2 : F3(lift2),-    lift3 : F4(lift3),-    lift4 : F5(lift4),-    lift5 : F6(lift5),-    lift6 : F7(lift6),-    lift7 : F8(lift7),-    lift8 : F9(lift8),-    foldp : F3(foldp),-    delay : F2(delay),-    merge : F2(merge),-    merges : merges,-    count : function(s) { return foldp(F2(function(_,c) { return c+1; }), 0, s); },-    countIf : F2(function(pred,s) {-      return foldp(F2(function(x,c){-        return pred(x) ? c+1 : c; }), 0, s)}),-    keepIf : F3(function(pred,base,sig) {-      return new DropIf(function(x) {return !pred(x);},base,sig); }),-    dropIf : F3(function(pred,base,sig) { return new DropIf(pred,base,sig); }),-    keepWhen : F3(function(s1,b,s2) {-      return dropWhen(lift(function(b){return !b;},s1), b, s2); }),-    dropWhen : F3(dropWhen),-    dropRepeats : function(s) { return new DropRepeats(s);},-    sampleOn : F2(sampleOn),-    timestamp : timestamp-  };-};-Elm.Native.Time = {};-Elm.Native.Time.make = function(elm) {--  elm.Native = elm.Native || {};-  elm.Native.Time = elm.Native.Time || {};-  if (elm.Native.Time.values) return elm.Native.Time.values;--  var Signal = Elm.Signal.make(elm);-  var NS = Elm.Native.Signal.make(elm);-  var Maybe = Elm.Maybe.make(elm);-  var Utils = Elm.Native.Utils.make(elm);--  function fpsWhen(desiredFPS, isOn) {-    var msPerFrame = 1000 / desiredFPS;-    var prev = Date.now(), curr = prev, diff = 0, wasOn = true;-    var ticker = Signal.constant(diff);-    function tick(zero) { return function() {-        curr = Date.now();-        diff = zero ? 0 : curr - prev;-        prev = curr;-        elm.notify(ticker.id, diff);-      };-    }-    var timeoutID = 0;-    function f(isOn, t) {-      if (isOn) {-        timeoutID = setTimeout(tick(!wasOn && isOn), msPerFrame);-      } else if (wasOn) {-        clearTimeout(timeoutID);-      }-      wasOn = isOn;-      return t;-    }-    return A3( Signal.lift2, F2(f), isOn, ticker );-  }--  function every(t) {-    var clock = Signal.constant(Date.now());-    setInterval(function() {-        elm.notify(clock.id, Date.now());-    }, t);-    return clock;-  }--  function since(t, s) {-    function cmp(a,b) { return !Utils.eq(a,b); }-    var dcount = Signal.count(A2(NS.delay, t, s));-    return A3( Signal.lift2, F2(cmp), Signal.count(s), dcount );-  }-  function read(s) {-      var t = Date.parse(s);-      return isNaN(t) ? Maybe.Nothing : Maybe.Just(t);-  }-  return elm.Native.Time.values = {-      fpsWhen : F2(fpsWhen),-      fps : function(t) { return fpsWhen(t, Signal.constant(true)); },-      every : every,-      delay : NS.delay,-      timestamp : NS.timestamp,-      since : F2(since),-      toDate : function(t) { return new window.Date(t); },-      read   : read-  };--};-Elm.Native.Touch = {};-Elm.Native.Touch.make = function(elm) {--    elm.Native = elm.Native || {};-    elm.Native.Touch = elm.Native.Touch || {};-    if (elm.Native.Touch.values) return elm.Native.Touch.values;--    var Signal = Elm.Signal.make(elm);-    var JS = Elm.JavaScript.make(elm);-    var Utils = Elm.Native.Utils.make(elm);--    function Dict() {-        this.keys = [];-        this.values = [];--        this.insert = function(key,value) {-            this.keys.push(key);-            this.values.push(value);-        };-        this.lookup = function(key) {-            var i = this.keys.indexOf(key)-            return i >= 0 ? this.values[i] : {x:0,y:0,t:0};-        };-        this.remove = function(key) {-            var i = this.keys.indexOf(key);-            if (i < 0) return;-            var t = this.values[i];-            this.keys.splice(i,1);-            this.values.splice(i,1);-            return t;-        };-        this.clear = function() {-            this.keys = [];-            this.values = [];-        };-    }-    -    var root = Signal.constant([]),-    tapTime = 500,-    hasTap = false,-    tap = {_:{},x:0,y:0},-    dict = new Dict();--    function touch(t) {-        var r = dict.lookup(t.identifier);-        var point = Utils.getXY(t);-        return {_ : {},-	        id: t.identifier,-	        x : point._0,-	        y : point._1,-	        x0: r.x,-	        y0: r.y,-	        t0: r.t-	       };-    }--    var node = elm.display === ElmRuntime.Display.FULLSCREEN ? document : elm.node;--    function start(e) {-        var point = Utils.getXY(e);-        dict.insert(e.identifier,-                    {x: point._0,-                     y: point._1,-                     t: Date.now()});-    }-    function end(e) {-        var t = dict.remove(e.identifier);-        if (Date.now() - t.t < tapTime) {-            hasTap = true;-            tap = {_:{}, x:t.x, y:t.y};-        }-    }--    function listen(name, f) {-        function update(e) {-            for (var i = e.changedTouches.length; i--; ) { f(e.changedTouches[i]); }-            var ts = new Array(e.touches.length);-            for (var i = e.touches.length; i--; ) { ts[i] = touch(e.touches[i]); }-            elm.notify(root.id, ts);-            e.preventDefault();-        }-        elm.addListener([root.id], node, name, update);-    }--    listen("touchstart", start);-    listen("touchmove", function(_){});-    listen("touchend", end);-    listen("touchcancel", end);-    listen("touchleave", end);--    var mouseID = -1;-    function move(e) {-        var point = Utils.getXY(e);-        for (var i = root.value.length; i--; ) {-            if (root.value[i].id === mouseID) {-                root.value[i].x = point._0;-                root.value[i].y = point._1;-                elm.notify(root.id, root.value);-                break;-            }-        }-    }-    elm.addListener([root.id], node, "mousedown", function down(e) {-        node.addEventListener("mousemove", move);-        e.identifier = mouseID;-        start(e);-        root.value.push(touch(e));-        elm.notify(root.id, root.value);-    });-    elm.addListener([root.id], node, "mouseup", function up(e) {-        node.removeEventListener("mousemove", move);-        e.identifier = mouseID;-        end(e);-        for (var i = root.value.length; i--; ) {-            if (root.value[i].id === mouseID) {-                root.value.splice(i, 1);-                --mouseID;-                break;-            }-        }-        elm.notify(root.id, root.value);-    });-    elm.addListener([root.id], node, "blur", function blur(e) {-        node.removeEventListener("mousemove", move);-        if (root.value.length > 0) {-            elm.notify(root.id, []);-            --mouseID;-        }-        dict.clear();-    });--    function dependency(f) {-        var sig = A2( Signal.lift, f, root );-        root.defaultNumberOfKids += 1;-        sig.defaultNumberOfKids = 0;-        return sig;-    }--    var touches = dependency(JS.toList);--    var taps = function() {-        var sig = dependency(function(_) { return tap; });-        sig.defaultNumberOfKids = 1;-        function pred(_) { var b = hasTap; hasTap = false; return b; }-        var sig2 = A3( Signal.keepIf, pred, {_:{},x:0,y:0}, sig);-        sig2.defaultNumberOfKids = 0;-        return sig2;-    }();--    return elm.Native.Touch.values = { touches: touches, taps: taps };--};Elm.Native.WebSocket = {};-Elm.Native.WebSocket.make = function(elm) {--  elm.Native = elm.Native || {};-  elm.Native.WebSocket = elm.Native.WebSocket || {};-  if (elm.Native.WebSocket.values) return elm.Native.WebSocket.values;--  var Signal = Elm.Signal.make(elm);-  var JS = Elm.JavaScript.make(elm);-  var List = Elm.Native.List.make(elm);--  function open(url, outgoing) {-    var incoming = Signal.constant(List.Nil);-    var ws = new WebSocket(JS.fromString(url));--    var pending = [];-    var ready = false;-    -    ws.onopen = function(e) {-      var len = pending.length;-      for (var i = 0; i < len; ++i) { ws.send(pending[i]); }-      ready = true;-    };-    ws.onmessage = function(event) {-      elm.notify(incoming.id, JS.toString(event.data));-    };-    -    function send(msg) {-      var s = JS.fromString(msg);-      ready ? ws.send(s) : pending.push(s);-    }-    -    function take1(x,y) { return x }-    return A3(Signal.lift2, F2(take1), incoming, A2(Signal.lift, send, outgoing));-  }--  return elm.Native.WebSocket.values = { connect: F2(open) };-};-Elm.Native.Window = {};-Elm.Native.Window.make = function(elm) {--  elm.Native = elm.Native || {};-  elm.Native.Window = elm.Native.Window || {};-  if (elm.Native.Window.values) return elm.Native.Window.values;--  var Signal = Elm.Signal.make(elm);-  var Tuple2 = Elm.Native.Utils.make(elm).Tuple2;--  function getWidth() { return elm.node.clientWidth; }-  function getHeight() {-      if (elm.display === ElmRuntime.Display.FULLSCREEN) {-          return window.innerHeight;-      }-      return elm.node.clientHeight;-  }--  var dimensions = Signal.constant(Tuple2(getWidth(), getHeight()));-  dimensions.defaultNumberOfKids = 2;--  // Do not move width and height into Elm. By setting the default number of kids,-  // the resize listener can be detached.-  var width  = A2(Signal.lift, function(p){return p._0;}, dimensions);-  width.defaultNumberOfKids = 0;--  var height = A2(Signal.lift, function(p){return p._1;}, dimensions);-  height.defaultNumberOfKids = 0;--  function resizeIfNeeded() {-      // Do not trigger event if the dimensions have not changed.-      // This should be most of the time.-      var w = getWidth();-      var h = getHeight();-      if (dimensions.value._0 === w && dimensions.value._1 === h) return;--      setTimeout(function () {-          // Check again to see if the dimensions have changed.-          // It is conceivable that the dimensions have changed-          // again while some other event was being processed.-          var w = getWidth();-          var h = getHeight();-          if (dimensions.value._0 === w && dimensions.value._1 === h) return;-          elm.notify(dimensions.id, Tuple2(w,h));-      }, 0);-  }-  elm.addListener([dimensions.id], window, 'resize', resizeIfNeeded);--  return elm.Native.Window.values = {-      dimensions:dimensions,-      width:width,-      height:height,-      resizeIfNeeded:resizeIfNeeded-  };--};-Elm.Basics = Elm.Basics || {};-Elm.Basics.make = function (_elm)-                  {-                    _elm.Basics = _elm.Basics || {};-                    if (_elm.Basics.values)-                    return _elm.Basics.values-                    var N = Elm.Native,-                        _N = N.Utils.make(_elm),-                        _L = N.List.make(_elm),-                        _E = N.Error.make(_elm),-                        _J = N.JavaScript.make(_elm),-                        $moduleName = "Basics";-                    var Native = Native || {};-                    Native.Basics = Elm.Native.Basics.make(_elm);-                    var _op = {};-                    _op["||"] = Native.Basics.or;-                    _op["|>"] = F2(function (x,f)-                                   {-                                     return f(x)-                                   });-                    var xor = Native.Basics.xor;-                    var uncurry = F2(function (f,_v0)-                                     {-                                       return function ()-                                              {-                                                switch (_v0.ctor)-                                                {case-                                                 "_Tuple2" :-                                                   return A2(f,_v0._0,_v0._1)}-                                                _E.Case($moduleName,"on line 338, column 19 to 24");-                                              }()-                                     });-                    var truncate = Native.Basics.truncate;-                    var toFloat = Native.Basics.toFloat;-                    var tan = Native.Basics.tan;-                    var sqrt = Native.Basics.sqrt;-                    var snd = function (_v4)-                              {-                                return function ()-                                       {-                                         switch (_v4.ctor)-                                         {case-                                          "_Tuple2" :-                                            return _v4._1}-                                         _E.Case($moduleName,"on line 322, column 13 to 14");-                                       }()-                              };-                    var sin = Native.Basics.sin;-                    var round = Native.Basics.round;-                    var rem = Native.Basics.rem;-                    var radians = function (t)-                                  {-                                    return t-                                  };-                    var pi = Native.Basics.pi;-                    var otherwise = true;-                    var not = Native.Basics.not;-                    var mod = Native.Basics.mod;-                    var min = Native.Basics.min;-                    var max = Native.Basics.max;-                    var logBase = Native.Basics.logBase;-                    var id = function (x)-                             {-                               return x-                             };-                    var fst = function (_v8)-                              {-                                return function ()-                                       {-                                         switch (_v8.ctor)-                                         {case-                                          "_Tuple2" :-                                            return _v8._0}-                                         _E.Case($moduleName,"on line 318, column 13 to 14");-                                       }()-                              };-                    var floor = Native.Basics.floor;-                    var flip = F3(function (f,b,a)-                                  {-                                    return A2(f,a,b)-                                  });-                    var e = Native.Basics.e;-                    var div = Native.Basics.div;-                    var curry = F3(function (f,a,b)-                                   {-                                     return f({ctor: "_Tuple2", _0: a, _1: b})-                                   });-                    var cos = Native.Basics.cos;-                    var compare = Native.Basics.compare;-                    var clamp = Native.Basics.clamp;-                    var ceiling = Native.Basics.ceiling;-                    var atan2 = Native.Basics.atan2;-                    var atan = Native.Basics.atan;-                    var asin = Native.Basics.asin;-                    var acos = Native.Basics.acos;-                    var abs = Native.Basics.abs;-                    _op["^"] = Native.Basics.exp;-                    var LT = {ctor: "LT"};-                    var GT = {ctor: "GT"};-                    var EQ = {ctor: "EQ"};-                    _op[">="] = Native.Basics.ge;-                    _op[">"] = Native.Basics.gt;-                    _op["=="] = Native.Basics.eq;-                    _op["<|"] = F2(function (f,x)-                                   {-                                     return f(x)-                                   });-                    _op["<="] = Native.Basics.le;-                    _op["<"] = Native.Basics.lt;-                    _op["/="] = Native.Basics.neq;-                    _op["/"] = Native.Basics.floatDiv;-                    _op["."] = F3(function (f,g,x)-                                  {-                                    return f(g(x))-                                  });-                    _op["-"] = Native.Basics.sub;-                    _op["+"] = Native.Basics.add;-                    var toPolar = function (_v12)-                                  {-                                    return function ()-                                           {-                                             switch (_v12.ctor)-                                             {case-                                              "_Tuple2" :-                                                return {ctor: "_Tuple2", _0: Native.Basics.sqrt(Math.pow(_v12._0,-                                                                                                         2) + Math.pow(_v12._1,-                                                                                                                       2)), _1: A2(Native.Basics.atan2,-                                                                                                                                   _v12._1,-                                                                                                                                   _v12._0)}}-                                             _E.Case($moduleName,"on line 76, column 18 to 73");-                                           }()-                                  };-                    _op["*"] = Native.Basics.mul;-                    var degrees = function (d)-                                  {-                                    return d * Native.Basics.pi / 180-                                  };-                    var fromPolar = function (_v16)-                                    {-                                      return function ()-                                             {-                                               switch (_v16.ctor)-                                               {case-                                                "_Tuple2" :-                                                  return {ctor: "_Tuple2", _0: _v16._0 * Native.Basics.cos(_v16._1), _1: _v16._0 * Native.Basics.sin(_v16._1)}}-                                               _E.Case($moduleName,"on line 70, column 20 to 68");-                                             }()-                                    };-                    var turns = function (r)-                                {-                                  return 2 * Native.Basics.pi * r-                                };-                    _op["&&"] = Native.Basics.and;-                    _elm.Basics.values = {_op: _op, radians: radians, degrees: degrees, turns: turns, fromPolar: fromPolar, toPolar: toPolar, div: div, rem: rem, mod: mod, cos: cos, sin: sin, tan: tan, acos: acos, asin: asin, atan: atan, atan2: atan2, sqrt: sqrt, abs: abs, logBase: logBase, clamp: clamp, pi: pi, e: e, compare: compare, min: min, max: max, xor: xor, not: not, otherwise: otherwise, round: round, truncate: truncate, floor: floor, ceiling: ceiling, toFloat: toFloat, id: id, fst: fst, snd: snd, flip: flip, curry: curry, uncurry: uncurry, LT: LT, EQ: EQ, GT: GT};-                    return _elm.Basics.values-                  };Elm.Bitwise = Elm.Bitwise || {};-Elm.Bitwise.make = function (_elm)-                   {-                     _elm.Bitwise = _elm.Bitwise || {};-                     if (_elm.Bitwise.values)-                     return _elm.Bitwise.values-                     var N = Elm.Native,-                         _N = N.Utils.make(_elm),-                         _L = N.List.make(_elm),-                         _E = N.Error.make(_elm),-                         _J = N.JavaScript.make(_elm),-                         $moduleName = "Bitwise";-                     var Native = Native || {};-                     Native.Bitwise = Elm.Native.Bitwise.make(_elm);-                     var _op = {};-                     var xor = Native.Bitwise.xor;-                     var shiftRightLogical = Native.Bitwise.shiftRightLogical;-                     var shiftRight = Native.Bitwise.shiftRightArithmatic;-                     var shiftLeft = Native.Bitwise.shiftLeft;-                     var or = Native.Bitwise.or;-                     var complement = Native.Bitwise.complement;-                     var and = Native.Bitwise.and;-                     _elm.Bitwise.values = {_op: _op, and: and, or: or, xor: xor, complement: complement, shiftLeft: shiftLeft, shiftRight: shiftRight, shiftRightLogical: shiftRightLogical};-                     return _elm.Bitwise.values-                   };Elm.Char = Elm.Char || {};-Elm.Char.make = function (_elm)-                {-                  _elm.Char = _elm.Char || {};-                  if (_elm.Char.values)-                  return _elm.Char.values-                  var N = Elm.Native,-                      _N = N.Utils.make(_elm),-                      _L = N.List.make(_elm),-                      _E = N.Error.make(_elm),-                      _J = N.JavaScript.make(_elm),-                      $moduleName = "Char";-                  var Native = Native || {};-                  Native.Char = Elm.Native.Char.make(_elm);-                  var _op = {};-                  var toUpper = Native.Char.toUpper;-                  var toLower = Native.Char.toLower;-                  var toLocaleUpper = Native.Char.toLocaleUpper;-                  var toLocaleLower = Native.Char.toLocaleLower;-                  var toCode = Native.Char.toCode;-                  var isUpper = Native.Char.isUpper;-                  var isOctDigit = Native.Char.isOctDigit;-                  var isLower = Native.Char.isLower;-                  var isHexDigit = Native.Char.isHexDigit;-                  var isDigit = Native.Char.isDigit;-                  var fromCode = Native.Char.fromCode;-                  _elm.Char.values = {_op: _op, isUpper: isUpper, isLower: isLower, isDigit: isDigit, isOctDigit: isOctDigit, isHexDigit: isHexDigit, toUpper: toUpper, toLower: toLower, toLocaleUpper: toLocaleUpper, toLocaleLower: toLocaleLower, toCode: toCode, fromCode: fromCode};-                  return _elm.Char.values-                };Elm.Color = Elm.Color || {};-Elm.Color.make = function (_elm)-                 {-                   _elm.Color = _elm.Color || {};-                   if (_elm.Color.values)-                   return _elm.Color.values-                   var N = Elm.Native,-                       _N = N.Utils.make(_elm),-                       _L = N.List.make(_elm),-                       _E = N.Error.make(_elm),-                       _J = N.JavaScript.make(_elm),-                       $moduleName = "Color";-                   var Native = Native || {};-                   Native.Color = Elm.Native.Color.make(_elm);-                   var Basics = Elm.Basics.make(_elm);-                   var _op = {};-                   var hsva = Native.Color.hsva;-                   var hsv = Native.Color.hsv;-                   var greyscale = function (p)-                                   {-                                     return A3(hsv,0,0,1 - p)-                                   };-                   var grayscale = function (p)-                                   {-                                     return A3(hsv,0,0,1 - p)-                                   };-                   var complement = Native.Color.complement;-                   var Radial = F5(function (a,b,c,d,e)-                                   {-                                     return {ctor: "Radial", _0: a, _1: b, _2: c, _3: d, _4: e}-                                   });-                   var radial = Radial;-                   var Linear = F3(function (a,b,c)-                                   {-                                     return {ctor: "Linear", _0: a, _1: b, _2: c}-                                   });-                   var linear = Linear;-                   var Color = F4(function (a,b,c,d)-                                  {-                                    return {ctor: "Color", _0: a, _1: b, _2: c, _3: d}-                                  });-                   var black = A4(Color,0,0,0,1);-                   var blue = A4(Color,52,101,164,1);-                   var brown = A4(Color,193,125,17,1);-                   var charcoal = A4(Color,85,87,83,1);-                   var darkBlue = A4(Color,32,74,135,1);-                   var darkBrown = A4(Color,143,89,2,1);-                   var darkCharcoal = A4(Color,46,52,54,1);-                   var darkGray = A4(Color,186,189,182,1);-                   var darkGreen = A4(Color,78,154,6,1);-                   var darkGrey = A4(Color,186,189,182,1);-                   var darkOrange = A4(Color,206,92,0,1);-                   var darkPurple = A4(Color,92,53,102,1);-                   var darkRed = A4(Color,164,0,0,1);-                   var darkYellow = A4(Color,196,160,0,1);-                   var gray = A4(Color,211,215,207,1);-                   var green = A4(Color,115,210,22,1);-                   var grey = A4(Color,211,215,207,1);-                   var lightBlue = A4(Color,114,159,207,1);-                   var lightBrown = A4(Color,233,185,110,1);-                   var lightCharcoal = A4(Color,136,138,133,1);-                   var lightGray = A4(Color,238,238,236,1);-                   var lightGreen = A4(Color,138,226,52,1);-                   var lightGrey = A4(Color,238,238,236,1);-                   var lightOrange = A4(Color,252,175,62,1);-                   var lightPurple = A4(Color,173,127,168,1);-                   var lightRed = A4(Color,239,41,41,1);-                   var lightYellow = A4(Color,255,233,79,1);-                   var orange = A4(Color,245,121,0,1);-                   var purple = A4(Color,117,80,123,1);-                   var red = A4(Color,204,0,0,1);-                   var rgb = F3(function (r,g,b)-                                {-                                  return A4(Color,r,g,b,1)-                                });-                   var rgba = Color;-                   var white = A4(Color,255,255,255,1);-                   var yellow = A4(Color,237,212,0,1);-                   _elm.Color.values = {_op: _op, rgba: rgba, rgb: rgb, lightRed: lightRed, red: red, darkRed: darkRed, lightOrange: lightOrange, orange: orange, darkOrange: darkOrange, lightYellow: lightYellow, yellow: yellow, darkYellow: darkYellow, lightGreen: lightGreen, green: green, darkGreen: darkGreen, lightBlue: lightBlue, blue: blue, darkBlue: darkBlue, lightPurple: lightPurple, purple: purple, darkPurple: darkPurple, lightBrown: lightBrown, brown: brown, darkBrown: darkBrown, black: black, white: white, lightGrey: lightGrey, grey: grey, darkGrey: darkGrey, lightGray: lightGray, gray: gray, darkGray: darkGray, lightCharcoal: lightCharcoal, charcoal: charcoal, darkCharcoal: darkCharcoal, grayscale: grayscale, greyscale: greyscale, complement: complement, hsva: hsva, hsv: hsv, linear: linear, radial: radial, Color: Color, Linear: Linear, Radial: Radial};-                   return _elm.Color.values-                 };Elm.Date = Elm.Date || {};-Elm.Date.make = function (_elm)-                {-                  _elm.Date = _elm.Date || {};-                  if (_elm.Date.values)-                  return _elm.Date.values-                  var N = Elm.Native,-                      _N = N.Utils.make(_elm),-                      _L = N.List.make(_elm),-                      _E = N.Error.make(_elm),-                      _J = N.JavaScript.make(_elm),-                      $moduleName = "Date";-                  var Native = Native || {};-                  Native.Date = Elm.Native.Date.make(_elm);-                  var Time = Elm.Time.make(_elm);-                  var Maybe = Elm.Maybe.make(_elm);-                  var _op = {};-                  var year = Native.Date.year;-                  var toTime = Native.Date.toTime;-                  var second = Native.Date.second;-                  var read = Native.Date.read;-                  var month = Native.Date.month;-                  var minute = Native.Date.minute;-                  var hour = Native.Date.hour;-                  var dayOfWeek = Native.Date.dayOfWeek;-                  var day = Native.Date.day;-                  var Wed = {ctor: "Wed"};-                  var Tue = {ctor: "Tue"};-                  var Thu = {ctor: "Thu"};-                  var Sun = {ctor: "Sun"};-                  var Sep = {ctor: "Sep"};-                  var Sat = {ctor: "Sat"};-                  var Oct = {ctor: "Oct"};-                  var Nov = {ctor: "Nov"};-                  var Mon = {ctor: "Mon"};-                  var May = {ctor: "May"};-                  var Mar = {ctor: "Mar"};-                  var Jun = {ctor: "Jun"};-                  var Jul = {ctor: "Jul"};-                  var Jan = {ctor: "Jan"};-                  var Fri = {ctor: "Fri"};-                  var Feb = {ctor: "Feb"};-                  var Dec = {ctor: "Dec"};-                  var Date = {ctor: "Date"};-                  var Aug = {ctor: "Aug"};-                  var Apr = {ctor: "Apr"};-                  _elm.Date.values = {_op: _op, read: read, toTime: toTime, year: year, month: month, day: day, dayOfWeek: dayOfWeek, hour: hour, minute: minute, second: second, Date: Date, Mon: Mon, Tue: Tue, Wed: Wed, Thu: Thu, Fri: Fri, Sat: Sat, Sun: Sun, Jan: Jan, Feb: Feb, Mar: Mar, Apr: Apr, May: May, Jun: Jun, Jul: Jul, Aug: Aug, Sep: Sep, Oct: Oct, Nov: Nov, Dec: Dec};-                  return _elm.Date.values-                };Elm.Dict = Elm.Dict || {};-Elm.Dict.make = function (_elm)-                {-                  _elm.Dict = _elm.Dict || {};-                  if (_elm.Dict.values)-                  return _elm.Dict.values-                  var N = Elm.Native,-                      _N = N.Utils.make(_elm),-                      _L = N.List.make(_elm),-                      _E = N.Error.make(_elm),-                      _J = N.JavaScript.make(_elm),-                      $moduleName = "Dict";-                  var Basics = Elm.Basics.make(_elm);-                  var Maybe = Elm.Maybe.make(_elm);-                  var Native = Native || {};-                  Native.Error = Elm.Native.Error.make(_elm);-                  var List = Elm.List.make(_elm);-                  var Native = Native || {};-                  Native.Utils = Elm.Native.Utils.make(_elm);-                  var _op = {};-                  var Same = {ctor: "Same"};-                  var Remove = {ctor: "Remove"};-                  var Red = {ctor: "Red"};-                  var RBNode = F5(function (a,b,c,d,e)-                                  {-                                    return {ctor: "RBNode", _0: a, _1: b, _2: c, _3: d, _4: e}-                                  });-                  var rotateLeft = function (t)-                                   {-                                     return function ()-                                            {-                                              switch (t.ctor)-                                              {case-                                               "RBNode" :-                                                 switch (t._4.ctor)-                                                 {case-                                                  "RBNode" :-                                                    return A5(RBNode,-                                                              t._0,-                                                              t._4._1,-                                                              t._4._2,-                                                              A5(RBNode,Red,t._1,t._2,t._3,t._4._3),-                                                              t._4._4)}-                                                 break;}-                                              return Native.Error.raise("rotateLeft of a node without enough children")-                                            }()-                                   };-                  var rotateLeftIfNeeded = function (t)-                                           {-                                             return function ()-                                                    {-                                                      switch (t.ctor)-                                                      {case-                                                       "RBNode" :-                                                         switch (t._4.ctor)-                                                         {case-                                                          "RBNode" :-                                                            switch (t._4._0.ctor)-                                                            {case-                                                             "Red" :-                                                               return rotateLeft(t)}-                                                            break;}-                                                         break;}-                                                      return t-                                                    }()-                                           };-                  var rotateRight = function (t)-                                    {-                                      return function ()-                                             {-                                               switch (t.ctor)-                                               {case-                                                "RBNode" :-                                                  switch (t._3.ctor)-                                                  {case-                                                   "RBNode" :-                                                     return A5(RBNode,-                                                               t._0,-                                                               t._3._1,-                                                               t._3._2,-                                                               t._3._3,-                                                               A5(RBNode,-                                                                  Red,-                                                                  t._1,-                                                                  t._2,-                                                                  t._3._4,-                                                                  t._4))}-                                                  break;}-                                               return Native.Error.raise("rotateRight of a node without enough children")-                                             }()-                                    };-                  var rotateRightIfNeeded = function (t)-                                            {-                                              return function ()-                                                     {-                                                       switch (t.ctor)-                                                       {case-                                                        "RBNode" :-                                                          switch (t._3.ctor)-                                                          {case-                                                           "RBNode" :-                                                             switch (t._3._0.ctor)-                                                             {case-                                                              "Red" :-                                                                switch (t._3._3.ctor)-                                                                {case-                                                                 "RBNode" :-                                                                   switch (t._3._3._0.ctor)-                                                                   {case-                                                                    "Red" :-                                                                      return rotateRight(t)}-                                                                   break;}-                                                                break;}-                                                             break;}-                                                          break;}-                                                       return t-                                                     }()-                                            };-                  var RBEmpty = function (a)-                                {-                                  return {ctor: "RBEmpty", _0: a}-                                };-                  var max = function (t)-                            {-                              return function ()-                                     {-                                       switch (t.ctor)-                                       {case-                                        "RBEmpty" :-                                          return Native.Error.raise("(max Empty) is not defined")-                                        case-                                        "RBNode" :-                                          switch (t._4.ctor)-                                          {case-                                           "RBEmpty" :-                                             return {ctor: "_Tuple2", _0: t._1, _1: t._2}}-                                          return max(t._4)}-                                       _E.Case($moduleName,"between lines 63 and 68");-                                     }()-                            };-                  var redden = function (t)-                               {-                                 return function ()-                                        {-                                          switch (t.ctor)-                                          {case-                                           "RBEmpty" :-                                             return Native.Error.raise("can\'t make a Leaf red")-                                           case-                                           "RBNode" :-                                             return A5(RBNode,Red,t._1,t._2,t._3,t._4)}-                                          _E.Case($moduleName,"between lines 302 and 306");-                                        }()-                               };-                  var NBlack = {ctor: "NBlack"};-                  var LBlack = {ctor: "LBlack"};-                  var empty = RBEmpty(LBlack);-                  var findWithDefault = F3(function (base,k,t)-                                           {-                                             return function ()-                                                    {-                                                      switch (t.ctor)-                                                      {case-                                                       "RBEmpty" :-                                                         switch (t._0.ctor)-                                                         {case-                                                          "LBlack" :-                                                            return base}-                                                         break;-                                                       case-                                                       "RBNode" :-                                                         return function ()-                                                                {-                                                                  var _v71 = A2(Native.Utils.compare,-                                                                                k,-                                                                                t._1);-                                                                  switch (_v71.ctor)-                                                                  {case-                                                                   "EQ" :-                                                                     return t._2-                                                                   case-                                                                   "GT" :-                                                                     return A3(findWithDefault,-                                                                               base,-                                                                               k,-                                                                               t._4)-                                                                   case-                                                                   "LT" :-                                                                     return A3(findWithDefault,-                                                                               base,-                                                                               k,-                                                                               t._3)}-                                                                  _E.Case($moduleName,-                                                                          "between lines 86 and 91");-                                                                }()}-                                                      _E.Case($moduleName,-                                                              "between lines 83 and 91");-                                                    }()-                                           });-                  var foldl = F3(function (f,acc,t)-                                 {-                                   return function ()-                                          {-                                            switch (t.ctor)-                                            {case-                                             "RBEmpty" :-                                               switch (t._0.ctor)-                                               {case-                                                "LBlack" :-                                                  return acc}-                                               break;-                                             case-                                             "RBNode" :-                                               return A3(foldl,-                                                         f,-                                                         A3(f,t._1,t._2,A3(foldl,f,acc,t._3)),-                                                         t._4)}-                                            _E.Case($moduleName,"between lines 317 and 322");-                                          }()-                                 });-                  var foldr = F3(function (f,acc,t)-                                 {-                                   return function ()-                                          {-                                            switch (t.ctor)-                                            {case-                                             "RBEmpty" :-                                               switch (t._0.ctor)-                                               {case-                                                "LBlack" :-                                                  return acc}-                                               break;-                                             case-                                             "RBNode" :-                                               return A3(foldr,-                                                         f,-                                                         A3(f,t._1,t._2,A3(foldr,f,acc,t._4)),-                                                         t._3)}-                                            _E.Case($moduleName,"between lines 325 and 330");-                                          }()-                                 });-                  var keys = function (t)-                             {-                               return A3(foldr,-                                         F3(function (k,v,acc)-                                            {-                                              return {ctor: "::", _0: k, _1: acc}-                                            }),-                                         _J.toList([]),-                                         t)-                             };-                  var toList = function (t)-                               {-                                 return A3(foldr,-                                           F3(function (k,v,acc)-                                              {-                                                return {ctor: "::", _0: {ctor: "_Tuple2", _0: k, _1: v}, _1: acc}-                                              }),-                                           _J.toList([]),-                                           t)-                               };-                  var values = function (t)-                               {-                                 return A3(foldr,-                                           F3(function (k,v,acc)-                                              {-                                                return {ctor: "::", _0: v, _1: acc}-                                              }),-                                           _J.toList([]),-                                           t)-                               };-                  var lookup = F2(function (k,t)-                                  {-                                    return function ()-                                           {-                                             switch (t.ctor)-                                             {case-                                              "RBEmpty" :-                                                switch (t._0.ctor)-                                                {case-                                                 "LBlack" :-                                                   return Maybe.Nothing}-                                                break;-                                              case-                                              "RBNode" :-                                                return function ()-                                                       {-                                                         var _v93 = A2(Native.Utils.compare,k,t._1);-                                                         switch (_v93.ctor)-                                                         {case-                                                          "EQ" :-                                                            return Maybe.Just(t._2)-                                                          case-                                                          "GT" :-                                                            return A2(lookup,k,t._4)-                                                          case-                                                          "LT" :-                                                            return A2(lookup,k,t._3)}-                                                         _E.Case($moduleName,-                                                                 "between lines 74 and 80");-                                                       }()}-                                             _E.Case($moduleName,"between lines 71 and 80");-                                           }()-                                  });-                  var member = F2(function (k,t)-                                  {-                                    return Maybe.isJust(A2(lookup,k,t))-                                  });-                  var map = F2(function (f,t)-                               {-                                 return function ()-                                        {-                                          switch (t.ctor)-                                          {case-                                           "RBEmpty" :-                                             switch (t._0.ctor)-                                             {case-                                              "LBlack" :-                                                return RBEmpty(LBlack)}-                                             break;-                                           case-                                           "RBNode" :-                                             return A5(RBNode,-                                                       t._0,-                                                       t._1,-                                                       f(t._2),-                                                       A2(map,f,t._3),-                                                       A2(map,f,t._4))}-                                          _E.Case($moduleName,"between lines 309 and 314");-                                        }()-                               });-                  var min = function (t)-                            {-                              return function ()-                                     {-                                       switch (t.ctor)-                                       {case-                                        "RBEmpty" :-                                          switch (t._0.ctor)-                                          {case-                                           "LBlack" :-                                             return Native.Error.raise("(min Empty) is not defined")}-                                          break;-                                        case-                                        "RBNode" :-                                          switch (t._3.ctor)-                                          {case-                                           "RBEmpty" :-                                             switch (t._3._0.ctor)-                                             {case-                                              "LBlack" :-                                                return {ctor: "_Tuple2", _0: t._1, _1: t._2}}-                                             break;}-                                          return min(t._3)}-                                       _E.Case($moduleName,"between lines 56 and 59");-                                     }()-                            };-                  var LBBlack = {ctor: "LBBlack"};-                  var Insert = {ctor: "Insert"};-                  var Black = {ctor: "Black"};-                  var blacken = function (t)-                                {-                                  return function ()-                                         {-                                           switch (t.ctor)-                                           {case-                                            "RBEmpty" :-                                              return RBEmpty(LBlack)-                                            case-                                            "RBNode" :-                                              return A5(RBNode,Black,t._1,t._2,t._3,t._4)}-                                           _E.Case($moduleName,"between lines 296 and 298");-                                         }()-                                };-                  var ensureBlackRoot = function (t)-                                        {-                                          return function ()-                                                 {-                                                   switch (t.ctor)-                                                   {case-                                                    "RBEmpty" :-                                                      switch (t._0.ctor)-                                                      {case-                                                       "LBlack" :-                                                         return t}-                                                      break;-                                                    case-                                                    "RBNode" :-                                                      switch (t._0.ctor)-                                                      {case-                                                       "Black" :-                                                         return t-                                                       case-                                                       "Red" :-                                                         return A5(RBNode,-                                                                   Black,-                                                                   t._1,-                                                                   t._2,-                                                                   t._3,-                                                                   t._4)}-                                                      break;}-                                                   _E.Case($moduleName,"between lines 143 and 149");-                                                 }()-                                        };-                  var otherColor = function (c)-                                   {-                                     return function ()-                                            {-                                              switch (c.ctor)-                                              {case-                                               "Black" :-                                                 return Red-                                               case-                                               "Red" :-                                                 return Black}-                                              _E.Case($moduleName,"on line 122, column 16 to 57");-                                            }()-                                   };-                  var color_flip = function (t)-                                   {-                                     return function ()-                                            {-                                              switch (t.ctor)-                                              {case-                                               "RBNode" :-                                                 switch (t._3.ctor)-                                                 {case-                                                  "RBNode" :-                                                    switch (t._4.ctor)-                                                    {case-                                                     "RBNode" :-                                                       return A5(RBNode,-                                                                 otherColor(t._0),-                                                                 t._1,-                                                                 t._2,-                                                                 A5(RBNode,-                                                                    otherColor(t._3._0),-                                                                    t._3._1,-                                                                    t._3._2,-                                                                    t._3._3,-                                                                    t._3._4),-                                                                 A5(RBNode,-                                                                    otherColor(t._4._0),-                                                                    t._4._1,-                                                                    t._4._2,-                                                                    t._4._3,-                                                                    t._4._4))}-                                                    break;}-                                                 break;}-                                              return Native.Error.raise("color_flip called on a Empty or Node with a Empty child")-                                            }()-                                   };-                  var color_flipIfNeeded = function (t)-                                           {-                                             return function ()-                                                    {-                                                      switch (t.ctor)-                                                      {case-                                                       "RBNode" :-                                                         switch (t._3.ctor)-                                                         {case-                                                          "RBNode" :-                                                            switch (t._3._0.ctor)-                                                            {case-                                                             "Red" :-                                                               switch (t._4.ctor)-                                                               {case-                                                                "RBNode" :-                                                                  switch (t._4._0.ctor)-                                                                  {case-                                                                   "Red" :-                                                                     return color_flip(t)}-                                                                  break;}-                                                               break;}-                                                            break;}-                                                         break;}-                                                      return t-                                                    }()-                                           };-                  var fixUp = function (t)-                              {-                                return color_flipIfNeeded(rotateRightIfNeeded(rotateLeftIfNeeded(t)))-                              };-                  var BBlack = {ctor: "BBlack"};-                  var blackish = function (_v156)-                                 {-                                   return function ()-                                          {-                                            switch (_v156.ctor)-                                            {case-                                             "RBNode" :-                                               return _N.eq(_v156._0,Black) || _N.eq(_v156._0,-                                                                                     BBlack)}-                                            _E.Case($moduleName,"on line 260, column 31 to 56");-                                          }()-                                 };-                  var isBBlack = function (t)-                                 {-                                   return function ()-                                          {-                                            switch (t.ctor)-                                            {case-                                             "RBEmpty" :-                                               switch (t._0.ctor)-                                               {case-                                                "LBBlack" :-                                                  return true}-                                               break;-                                             case-                                             "RBNode" :-                                               return function ()-                                                      {-                                                        switch (t._0.ctor)-                                                        {case-                                                         "BBlack" :-                                                           return true}-                                                        return false-                                                      }()}-                                            return false-                                          }()-                                 };-                  var lessBlack = function (c)-                                  {-                                    return function ()-                                           {-                                             switch (c.ctor)-                                             {case-                                              "BBlack" :-                                                return Black-                                              case-                                              "Black" :-                                                return Red-                                              case-                                              "NBlack" :-                                                return NBlack-                                              case-                                              "Red" :-                                                return NBlack}-                                             _E.Case($moduleName,"between lines 211 and 215");-                                           }()-                                  };-                  var balance_node = function (t)-                                     {-                                       return function ()-                                              {-                                                var assemble = function (col)-                                                               {-                                                                 return function (xk)-                                                                        {-                                                                          return function (xv)-                                                                                 {-                                                                                   return function (yk)-                                                                                          {-                                                                                            return function (yv)-                                                                                                   {-                                                                                                     return function (zk)-                                                                                                            {-                                                                                                              return function (zv)-                                                                                                                     {-                                                                                                                       return function (a)-                                                                                                                              {-                                                                                                                                return function (b)-                                                                                                                                       {-                                                                                                                                         return function (c)-                                                                                                                                                {-                                                                                                                                                  return function (d)-                                                                                                                                                         {-                                                                                                                                                           return A5(RBNode,-                                                                                                                                                                     lessBlack(col),-                                                                                                                                                                     yk,-                                                                                                                                                                     yv,-                                                                                                                                                                     A5(RBNode,-                                                                                                                                                                        Black,-                                                                                                                                                                        xk,-                                                                                                                                                                        xv,-                                                                                                                                                                        a,-                                                                                                                                                                        b),-                                                                                                                                                                     A5(RBNode,-                                                                                                                                                                        Black,-                                                                                                                                                                        zk,-                                                                                                                                                                        zv,-                                                                                                                                                                        c,-                                                                                                                                                                        d))-                                                                                                                                                         }-                                                                                                                                                }-                                                                                                                                       }-                                                                                                                              }-                                                                                                                     }-                                                                                                            }-                                                                                                   }-                                                                                          }-                                                                                 }-                                                                        }-                                                               };-                                                return blackish(t) ? function ()-                                                                     {-                                                                       switch (t.ctor)-                                                                       {case-                                                                        "RBNode" :-                                                                          switch (t._3.ctor)-                                                                          {case-                                                                           "RBNode" :-                                                                             switch (t._3._0.ctor)-                                                                             {case-                                                                              "Red" :-                                                                                switch (t._3._3.ctor)-                                                                                {case-                                                                                 "RBNode" :-                                                                                   switch (t._3._3._0.ctor)-                                                                                   {case-                                                                                    "Red" :-                                                                                      return assemble(t._0)(t._3._3._1)(t._3._3._2)(t._3._1)(t._3._2)(t._1)(t._2)(t._3._3._3)(t._3._3._4)(t._3._4)(t._4)}-                                                                                   break;}-                                                                                switch (t._3._4.ctor)-                                                                                {case-                                                                                 "RBNode" :-                                                                                   switch (t._3._4._0.ctor)-                                                                                   {case-                                                                                    "Red" :-                                                                                      return assemble(t._0)(t._3._1)(t._3._2)(t._3._4._1)(t._3._4._2)(t._1)(t._2)(t._3._3)(t._3._4._3)(t._3._4._4)(t._4)}-                                                                                   break;}-                                                                                break;}-                                                                             break;}-                                                                          switch (t._4.ctor)-                                                                          {case-                                                                           "RBNode" :-                                                                             switch (t._4._0.ctor)-                                                                             {case-                                                                              "Red" :-                                                                                switch (t._4._3.ctor)-                                                                                {case-                                                                                 "RBNode" :-                                                                                   switch (t._4._3._0.ctor)-                                                                                   {case-                                                                                    "Red" :-                                                                                      return assemble(t._0)(t._1)(t._2)(t._4._3._1)(t._4._3._2)(t._4._1)(t._4._2)(t._3)(t._4._3._3)(t._4._3._4)(t._4._4)}-                                                                                   break;}-                                                                                switch (t._4._4.ctor)-                                                                                {case-                                                                                 "RBNode" :-                                                                                   switch (t._4._4._0.ctor)-                                                                                   {case-                                                                                    "Red" :-                                                                                      return assemble(t._0)(t._1)(t._2)(t._4._1)(t._4._2)(t._4._4._1)(t._4._4._2)(t._3)(t._4._3)(t._4._4._3)(t._4._4._4)}-                                                                                   break;}-                                                                                break;}-                                                                             break;}-                                                                          switch (t._0.ctor)-                                                                          {case-                                                                           "BBlack" :-                                                                             switch (t._4.ctor)-                                                                             {case-                                                                              "RBNode" :-                                                                                switch (t._4._0.ctor)-                                                                                {case-                                                                                 "NBlack" :-                                                                                   switch (t._4._3.ctor)-                                                                                   {case-                                                                                    "RBNode" :-                                                                                      switch (t._4._3._0.ctor)-                                                                                      {case-                                                                                       "Black" :-                                                                                         return function ()-                                                                                                {-                                                                                                  switch (t._4._4.ctor)-                                                                                                  {case-                                                                                                   "RBNode" :-                                                                                                     switch (t._4._4._0.ctor)-                                                                                                     {case-                                                                                                      "Black" :-                                                                                                        return A5(RBNode,-                                                                                                                  Black,-                                                                                                                  t._4._3._1,-                                                                                                                  t._4._3._2,-                                                                                                                  A5(RBNode,-                                                                                                                     Black,-                                                                                                                     t._1,-                                                                                                                     t._2,-                                                                                                                     t._3,-                                                                                                                     t._4._3._3),-                                                                                                                  A5(balance,-                                                                                                                     Black,-                                                                                                                     t._4._1,-                                                                                                                     t._4._2,-                                                                                                                     t._4._3._4,-                                                                                                                     redden(t._4._4)))}-                                                                                                     break;}-                                                                                                  return t-                                                                                                }()}-                                                                                      break;}-                                                                                   break;}-                                                                                break;}-                                                                             switch (t._3.ctor)-                                                                             {case-                                                                              "RBNode" :-                                                                                switch (t._3._0.ctor)-                                                                                {case-                                                                                 "NBlack" :-                                                                                   switch (t._3._4.ctor)-                                                                                   {case-                                                                                    "RBNode" :-                                                                                      switch (t._3._4._0.ctor)-                                                                                      {case-                                                                                       "Black" :-                                                                                         return function ()-                                                                                                {-                                                                                                  switch (t._3._3.ctor)-                                                                                                  {case-                                                                                                   "RBNode" :-                                                                                                     switch (t._3._3._0.ctor)-                                                                                                     {case-                                                                                                      "Black" :-                                                                                                        return A5(RBNode,-                                                                                                                  Black,-                                                                                                                  t._3._4._1,-                                                                                                                  t._3._4._2,-                                                                                                                  A5(balance,-                                                                                                                     Black,-                                                                                                                     t._3._1,-                                                                                                                     t._3._2,-                                                                                                                     redden(t._3._3),-                                                                                                                     t._3._4._3),-                                                                                                                  A5(RBNode,-                                                                                                                     Black,-                                                                                                                     t._1,-                                                                                                                     t._2,-                                                                                                                     t._3._4._4,-                                                                                                                     t._4))}-                                                                                                     break;}-                                                                                                  return t-                                                                                                }()}-                                                                                      break;}-                                                                                   break;}-                                                                                break;}-                                                                             break;}-                                                                          break;}-                                                                       return t-                                                                     }() : t-                                              }()-                                     };-                  var balance = F5(function (c,k,v,l,r)-                                   {-                                     return balance_node(A5(RBNode,c,k,v,l,r))-                                   });-                  var lessBlackTree = function (t)-                                      {-                                        return function ()-                                               {-                                                 switch (t.ctor)-                                                 {case-                                                  "RBEmpty" :-                                                    return RBEmpty(LBlack)-                                                  case-                                                  "RBNode" :-                                                    return A5(RBNode,-                                                              lessBlack(t._0),-                                                              t._1,-                                                              t._2,-                                                              t._3,-                                                              t._4)}-                                                 _E.Case($moduleName,"between lines 223 and 225");-                                               }()-                                      };-                  var moreBlack = function (c)-                                  {-                                    return function ()-                                           {-                                             switch (c.ctor)-                                             {case-                                              "BBlack" :-                                                return BBlack-                                              case-                                              "Black" :-                                                return BBlack-                                              case-                                              "NBlack" :-                                                return Red-                                              case-                                              "Red" :-                                                return Black}-                                             _E.Case($moduleName,"between lines 205 and 209");-                                           }()-                                  };-                  var bubble = F5(function (c,k,v,l,r)-                                  {-                                    return isBBlack(l) || isBBlack(r) ? A5(balance,-                                                                           moreBlack(c),-                                                                           k,-                                                                           v,-                                                                           lessBlackTree(l),-                                                                           lessBlackTree(r)) : A5(RBNode,-                                                                                                  c,-                                                                                                  k,-                                                                                                  v,-                                                                                                  l,-                                                                                                  r)-                                  });-                  var remove_max = function (t)-                                   {-                                     return function ()-                                            {-                                              switch (t.ctor)-                                              {case-                                               "RBNode" :-                                                 switch (t._4.ctor)-                                                 {case-                                                  "RBEmpty" :-                                                    return rem(t)}-                                                 return A5(bubble,-                                                           t._0,-                                                           t._1,-                                                           t._2,-                                                           t._3,-                                                           remove_max(t._4))}-                                              _E.Case($moduleName,"between lines 251 and 253");-                                            }()-                                   };-                  var rem = function (t)-                            {-                              return function ()-                                     {-                                       switch (t.ctor)-                                       {case-                                        "RBNode" :-                                          switch (t._3.ctor)-                                          {case-                                           "RBEmpty" :-                                             switch (t._4.ctor)-                                             {case-                                              "RBEmpty" :-                                                return function ()-                                                       {-                                                         switch (t._0.ctor)-                                                         {case-                                                          "Black" :-                                                            return RBEmpty(LBBlack)-                                                          case-                                                          "Red" :-                                                            return RBEmpty(LBlack)}-                                                         _E.Case($moduleName,-                                                                 "between lines 230 and 233");-                                                       }()}-                                             break;}-                                          switch (t._0.ctor)-                                          {case-                                           "Black" :-                                             switch (t._3.ctor)-                                             {case-                                              "RBEmpty" :-                                                switch (t._4.ctor)-                                                {case-                                                 "RBNode" :-                                                   return A5(RBNode,-                                                             Black,-                                                             t._4._1,-                                                             t._4._2,-                                                             t._4._3,-                                                             t._4._4)}-                                                break;-                                              case-                                              "RBNode" :-                                                switch (t._4.ctor)-                                                {case-                                                 "RBEmpty" :-                                                   return A5(RBNode,-                                                             Black,-                                                             t._3._1,-                                                             t._3._2,-                                                             t._3._3,-                                                             t._3._4)}-                                                break;}-                                             break;}-                                          return function ()-                                                 {-                                                   var l$ = remove_max(t._3);-                                                   var $ = max(t._3),k = $._0,v = $._1;-                                                   return A5(bubble,t._0,k,v,l$,t._4)-                                                 }()}-                                       _E.Case($moduleName,"between lines 229 and 241");-                                     }()-                            };-                  var update = F3(function (k,u,t)-                                  {-                                    return function ()-                                           {-                                             var up = function (t)-                                                      {-                                                        return function ()-                                                               {-                                                                 switch (t.ctor)-                                                                 {case-                                                                  "RBEmpty" :-                                                                    switch (t._0.ctor)-                                                                    {case-                                                                     "LBlack" :-                                                                       return function ()-                                                                              {-                                                                                var _v283 = u(Maybe.Nothing);-                                                                                switch (_v283.ctor)-                                                                                {case-                                                                                 "Just" :-                                                                                   return {ctor: "_Tuple2", _0: Insert, _1: A5(RBNode,-                                                                                                                               Red,-                                                                                                                               k,-                                                                                                                               _v283._0,-                                                                                                                               empty,-                                                                                                                               empty)}-                                                                                 case-                                                                                 "Nothing" :-                                                                                   return {ctor: "_Tuple2", _0: Same, _1: empty}}-                                                                                _E.Case($moduleName,-                                                                                        "between lines 166 and 169");-                                                                              }()}-                                                                    break;-                                                                  case-                                                                  "RBNode" :-                                                                    return function ()-                                                                           {-                                                                             var _v285 = A2(Native.Utils.compare,-                                                                                            k,-                                                                                            t._1);-                                                                             switch (_v285.ctor)-                                                                             {case-                                                                              "EQ" :-                                                                                return function ()-                                                                                       {-                                                                                         var _v286 = u(Maybe.Just(t._2));-                                                                                         switch (_v286.ctor)-                                                                                         {case-                                                                                          "Just" :-                                                                                            return {ctor: "_Tuple2", _0: Same, _1: A5(RBNode,-                                                                                                                                      t._0,-                                                                                                                                      t._1,-                                                                                                                                      _v286._0,-                                                                                                                                      t._3,-                                                                                                                                      t._4)}-                                                                                          case-                                                                                          "Nothing" :-                                                                                            return {ctor: "_Tuple2", _0: Remove, _1: rem(t)}}-                                                                                         _E.Case($moduleName,-                                                                                                 "between lines 170 and 173");-                                                                                       }()-                                                                              case-                                                                              "GT" :-                                                                                return function ()-                                                                                       {-                                                                                         var $ = up(t._4),-                                                                                             fl = $._0,-                                                                                             r$ = $._1;-                                                                                         return function ()-                                                                                                {-                                                                                                  switch (fl.ctor)-                                                                                                  {case-                                                                                                   "Insert" :-                                                                                                     return {ctor: "_Tuple2", _0: Insert, _1: fixUp(A5(RBNode,-                                                                                                                                                       t._0,-                                                                                                                                                       t._1,-                                                                                                                                                       t._2,-                                                                                                                                                       t._3,-                                                                                                                                                       r$))}-                                                                                                   case-                                                                                                   "Remove" :-                                                                                                     return {ctor: "_Tuple2", _0: Remove, _1: A5(bubble,-                                                                                                                                                 t._0,-                                                                                                                                                 t._1,-                                                                                                                                                 t._2,-                                                                                                                                                 t._3,-                                                                                                                                                 r$)}-                                                                                                   case-                                                                                                   "Same" :-                                                                                                     return {ctor: "_Tuple2", _0: Same, _1: A5(RBNode,-                                                                                                                                               t._0,-                                                                                                                                               t._1,-                                                                                                                                               t._2,-                                                                                                                                               t._3,-                                                                                                                                               r$)}}-                                                                                                  _E.Case($moduleName,-                                                                                                          "between lines 179 and 183");-                                                                                                }()-                                                                                       }()-                                                                              case-                                                                              "LT" :-                                                                                return function ()-                                                                                       {-                                                                                         var $ = up(t._3),-                                                                                             fl = $._0,-                                                                                             l$ = $._1;-                                                                                         return function ()-                                                                                                {-                                                                                                  switch (fl.ctor)-                                                                                                  {case-                                                                                                   "Insert" :-                                                                                                     return {ctor: "_Tuple2", _0: Insert, _1: fixUp(A5(RBNode,-                                                                                                                                                       t._0,-                                                                                                                                                       t._1,-                                                                                                                                                       t._2,-                                                                                                                                                       l$,-                                                                                                                                                       t._4))}-                                                                                                   case-                                                                                                   "Remove" :-                                                                                                     return {ctor: "_Tuple2", _0: Remove, _1: A5(bubble,-                                                                                                                                                 t._0,-                                                                                                                                                 t._1,-                                                                                                                                                 t._2,-                                                                                                                                                 l$,-                                                                                                                                                 t._4)}-                                                                                                   case-                                                                                                   "Same" :-                                                                                                     return {ctor: "_Tuple2", _0: Same, _1: A5(RBNode,-                                                                                                                                               t._0,-                                                                                                                                               t._1,-                                                                                                                                               t._2,-                                                                                                                                               l$,-                                                                                                                                               t._4)}}-                                                                                                  _E.Case($moduleName,-                                                                                                          "between lines 174 and 178");-                                                                                                }()-                                                                                       }()}-                                                                             _E.Case($moduleName,-                                                                                     "between lines 169 and 183");-                                                                           }()}-                                                                 _E.Case($moduleName,-                                                                         "between lines 165 and 183");-                                                               }()-                                                      };-                                             var $ = up(t),fl = $._0,t$ = $._1;-                                             return function ()-                                                    {-                                                      switch (fl.ctor)-                                                      {case-                                                       "Insert" :-                                                         return ensureBlackRoot(t$)-                                                       case-                                                       "Remove" :-                                                         return blacken(t$)-                                                       case-                                                       "Same" :-                                                         return t$}-                                                      _E.Case($moduleName,-                                                              "between lines 184 and 189");-                                                    }()-                                           }()-                                  });-                  var insert = F3(function (k,v,t)-                                  {-                                    return function ()-                                           {-                                             var u = function (_v291)-                                                     {-                                                       return function ()-                                                              {-                                                                return Maybe.Just(v)-                                                              }()-                                                     };-                                             return A3(update,k,u,t)-                                           }()-                                  });-                  var fromList = function (assocs)-                                 {-                                   return A3(List.foldl,-                                             F2(function (_v293,d)-                                                {-                                                  return function ()-                                                         {-                                                           switch (_v293.ctor)-                                                           {case-                                                            "_Tuple2" :-                                                              return A3(insert,_v293._0,_v293._1,d)}-                                                           _E.Case($moduleName,-                                                                   "on line 360, column 43 to 55");-                                                         }()-                                                }),-                                             empty,-                                             assocs)-                                 };-                  var intersect = F2(function (t1,t2)-                                     {-                                       return function ()-                                              {-                                                var combine = F3(function (k,v,t)-                                                                 {-                                                                   return A2(member,-                                                                             k,-                                                                             t2) ? A3(insert,-                                                                                      k,-                                                                                      v,-                                                                                      t) : t-                                                                 });-                                                return A3(foldl,combine,empty,t1)-                                              }()-                                     });-                  var singleton = F2(function (k,v)-                                     {-                                       return A3(insert,k,v,RBEmpty(LBlack))-                                     });-                  var union = F2(function (t1,t2)-                                 {-                                   return A3(foldl,insert,t2,t1)-                                 });-                  var remove = F2(function (k,t)-                                  {-                                    return function ()-                                           {-                                             var u = function (_v297)-                                                     {-                                                       return function ()-                                                              {-                                                                return Maybe.Nothing-                                                              }()-                                                     };-                                             return A3(update,k,u,t)-                                           }()-                                  });-                  var diff = F2(function (t1,t2)-                                {-                                  return A3(foldl,-                                            F3(function (k,v,t)-                                               {-                                                 return A2(remove,k,t)-                                               }),-                                            t1,-                                            t2)-                                });-                  var moreBlackTree = function (t)-                                      {-                                        return function ()-                                               {-                                                 switch (t.ctor)-                                                 {case-                                                  "RBEmpty" :-                                                    return RBEmpty(LBBlack)-                                                  case-                                                  "RBNode" :-                                                    return A5(RBNode,-                                                              moreBlack(t._0),-                                                              t._1,-                                                              t._2,-                                                              t._3,-                                                              t._4)}-                                                 _E.Case($moduleName,"between lines 218 and 220");-                                               }()-                                      };-                  _elm.Dict.values = {_op: _op, empty: empty, singleton: singleton, insert: insert, update: update, lookup: lookup, findWithDefault: findWithDefault, remove: remove, member: member, foldl: foldl, foldr: foldr, map: map, union: union, intersect: intersect, diff: diff, keys: keys, values: values, toList: toList, fromList: fromList};-                  return _elm.Dict.values-                };Elm.Either = Elm.Either || {};-Elm.Either.make = function (_elm)-                  {-                    _elm.Either = _elm.Either || {};-                    if (_elm.Either.values)-                    return _elm.Either.values-                    var N = Elm.Native,-                        _N = N.Utils.make(_elm),-                        _L = N.List.make(_elm),-                        _E = N.Error.make(_elm),-                        _J = N.JavaScript.make(_elm),-                        $moduleName = "Either";-                    var List = Elm.List.make(_elm);-                    var _op = {};-                    var Right = function (a)-                                {-                                  return {ctor: "Right", _0: a}-                                };-                    var isRight = function (e)-                                  {-                                    return function ()-                                           {-                                             switch (e.ctor)-                                             {case-                                              "Right" :-                                                return true}-                                             return false-                                           }()-                                  };-                    var Left = function (a)-                               {-                                 return {ctor: "Left", _0: a}-                               };-                    var consEither = F2(function (e,_v2)-                                        {-                                          return function ()-                                                 {-                                                   switch (_v2.ctor)-                                                   {case-                                                    "_Tuple2" :-                                                      return function ()-                                                             {-                                                               switch (e.ctor)-                                                               {case-                                                                "Left" :-                                                                  return {ctor: "_Tuple2", _0: {ctor: "::", _0: e._0, _1: _v2._0}, _1: _v2._1}-                                                                case-                                                                "Right" :-                                                                  return {ctor: "_Tuple2", _0: _v2._0, _1: {ctor: "::", _0: e._0, _1: _v2._1}}}-                                                               _E.Case($moduleName,-                                                                       "between lines 66 and 68");-                                                             }()}-                                                   _E.Case($moduleName,"between lines 66 and 68");-                                                 }()-                                        });-                    var partition = function (es)-                                    {-                                      return A3(List.foldr,-                                                consEither,-                                                {ctor: "_Tuple2", _0: _J.toList([]), _1: _J.toList([])},-                                                es)-                                    };-                    var consLeft = F2(function (e,vs)-                                      {-                                        return function ()-                                               {-                                                 switch (e.ctor)-                                                 {case-                                                  "Left" :-                                                    return {ctor: "::", _0: e._0, _1: vs}-                                                  case-                                                  "Right" :-                                                    return vs}-                                                 _E.Case($moduleName,"between lines 56 and 58");-                                               }()-                                      });-                    var lefts = function (es)-                                {-                                  return A3(List.foldr,consLeft,_J.toList([]),es)-                                };-                    var consRight = F2(function (e,vs)-                                       {-                                         return function ()-                                                {-                                                  switch (e.ctor)-                                                  {case-                                                   "Left" :-                                                     return vs-                                                   case-                                                   "Right" :-                                                     return {ctor: "::", _0: e._0, _1: vs}}-                                                  _E.Case($moduleName,"between lines 61 and 63");-                                                }()-                                       });-                    var rights = function (es)-                                 {-                                   return A3(List.foldr,consRight,_J.toList([]),es)-                                 };-                    var either = F3(function (f,g,e)-                                    {-                                      return function ()-                                             {-                                               switch (e.ctor)-                                               {case-                                                "Left" :-                                                  return f(e._0)-                                                case-                                                "Right" :-                                                  return g(e._0)}-                                               _E.Case($moduleName,"on line 31, column 16 to 60");-                                             }()-                                    });-                    var isLeft = function (e)-                                 {-                                   return function ()-                                          {-                                            switch (e.ctor)-                                            {case-                                             "Left" :-                                               return true}-                                            return false-                                          }()-                                 };-                    _elm.Either.values = {_op: _op, either: either, isLeft: isLeft, isRight: isRight, lefts: lefts, rights: rights, partition: partition, consLeft: consLeft, consRight: consRight, consEither: consEither, Left: Left, Right: Right};-                    return _elm.Either.values-                  };Elm.Http = Elm.Http || {};-Elm.Http.make = function (_elm)-                {-                  _elm.Http = _elm.Http || {};-                  if (_elm.Http.values)-                  return _elm.Http.values-                  var N = Elm.Native,-                      _N = N.Utils.make(_elm),-                      _L = N.List.make(_elm),-                      _E = N.Error.make(_elm),-                      _J = N.JavaScript.make(_elm),-                      $moduleName = "Http";-                  var Signal = Elm.Signal.make(_elm);-                  var Native = Native || {};-                  Native.Http = Elm.Native.Http.make(_elm);-                  var _op = {};-                  var send = Native.Http.send;-                  var Waiting = {ctor: "Waiting"};-                  var Success = function (a)-                                {-                                  return {ctor: "Success", _0: a}-                                };-                  var Request = F4(function (a,b,c,d)-                                   {-                                     return {_: {}, body: c, headers: d, url: b, verb: a}-                                   });-                  var get = function (url)-                            {-                              return A4(Request,"GET",url,"",_J.toList([]))-                            };-                  var sendGet = function (reqs)-                                {-                                  return send(A2(Signal.lift,get,reqs))-                                };-                  var post = F2(function (url,body)-                                {-                                  return A4(Request,"POST",url,body,_J.toList([]))-                                });-                  var request = Request;-                  var Failure = F2(function (a,b)-                                   {-                                     return {ctor: "Failure", _0: a, _1: b}-                                   });-                  _elm.Http.values = {_op: _op, request: request, get: get, post: post, send: send, sendGet: sendGet, Success: Success, Waiting: Waiting, Failure: Failure, Request: Request};-                  return _elm.Http.values-                };Elm.JavaScript = Elm.JavaScript || {};-Elm.JavaScript.make = function (_elm)-                      {-                        _elm.JavaScript = _elm.JavaScript || {};-                        if (_elm.JavaScript.values)-                        return _elm.JavaScript.values-                        var N = Elm.Native,-                            _N = N.Utils.make(_elm),-                            _L = N.List.make(_elm),-                            _E = N.Error.make(_elm),-                            _J = N.JavaScript.make(_elm),-                            $moduleName = "JavaScript";-                        var Native = Native || {};-                        Native.JavaScript = Elm.Native.JavaScript.make(_elm);-                        var _op = {};-                        var toString = Native.JavaScript.toString;-                        var toList = Native.JavaScript.toList;-                        var toInt = Native.JavaScript.toInt;-                        var toFloat = Native.JavaScript.toFloat;-                        var toBool = Native.JavaScript.toBool;-                        var fromString = Native.JavaScript.fromString;-                        var fromList = Native.JavaScript.fromList;-                        var fromInt = Native.JavaScript.fromInt;-                        var fromFloat = Native.JavaScript.fromFloat;-                        var fromBool = Native.JavaScript.fromBool;-                        var JSString = {ctor: "JSString"};-                        var JSObject = {ctor: "JSObject"};-                        var JSNumber = {ctor: "JSNumber"};-                        var JSDomNode = {ctor: "JSDomNode"};-                        var JSBool = {ctor: "JSBool"};-                        var JSArray = function (a)-                                      {-                                        return {ctor: "JSArray", _0: a}-                                      };-                        _elm.JavaScript.values = {_op: _op, toList: toList, toInt: toInt, toFloat: toFloat, toBool: toBool, toString: toString, fromList: fromList, fromInt: fromInt, fromFloat: fromFloat, fromBool: fromBool, fromString: fromString, JSNumber: JSNumber, JSBool: JSBool, JSString: JSString, JSArray: JSArray, JSDomNode: JSDomNode, JSObject: JSObject};-                        return _elm.JavaScript.values-                      };Elm.Json = Elm.Json || {};-Elm.Json.make = function (_elm)-                {-                  _elm.Json = _elm.Json || {};-                  if (_elm.Json.values)-                  return _elm.Json.values-                  var N = Elm.Native,-                      _N = N.Utils.make(_elm),-                      _L = N.List.make(_elm),-                      _E = N.Error.make(_elm),-                      _J = N.JavaScript.make(_elm),-                      $moduleName = "Json";-                  var Basics = Elm.Basics.make(_elm);-                  var Dict = Elm.Dict.make(_elm);-                  var Maybe = Elm.Maybe.make(_elm);-                  var JavaScript = Elm.JavaScript.make(_elm);-                  var Native = Native || {};-                  Native.Json = Elm.Native.Json.make(_elm);-                  var JavaScript = Elm.JavaScript.make(_elm);-                  var _op = {};-                  var toString = F2(function (sep,v)-                                    {-                                      return JavaScript.toString(A2(Native.Json.toJSString,sep,v))-                                    });-                  var toJSString = Native.Json.toJSString;-                  var toJSObject = Native.Json.toJSObject;-                  var fromString = function (s)-                                   {-                                     return Native.Json.fromJSString(JavaScript.fromString(s))-                                   };-                  var fromJSString = Native.Json.fromJSString;-                  var fromJSObject = Native.Json.fromJSObject;-                  var String = function (a)-                               {-                                 return {ctor: "String", _0: a}-                               };-                  var Object = function (a)-                               {-                                 return {ctor: "Object", _0: a}-                               };-                  var Number = function (a)-                               {-                                 return {ctor: "Number", _0: a}-                               };-                  var Null = {ctor: "Null"};-                  var Boolean = function (a)-                                {-                                  return {ctor: "Boolean", _0: a}-                                };-                  var Array = function (a)-                              {-                                return {ctor: "Array", _0: a}-                              };-                  _elm.Json.values = {_op: _op, toString: toString, toJSString: toJSString, fromString: fromString, fromJSString: fromJSString, fromJSObject: fromJSObject, toJSObject: toJSObject, String: String, Number: Number, Boolean: Boolean, Null: Null, Array: Array, Object: Object};-                  return _elm.Json.values-                };Elm.Keyboard = Elm.Keyboard || {};-Elm.Keyboard.make = function (_elm)-                    {-                      _elm.Keyboard = _elm.Keyboard || {};-                      if (_elm.Keyboard.values)-                      return _elm.Keyboard.values-                      var N = Elm.Native,-                          _N = N.Utils.make(_elm),-                          _L = N.List.make(_elm),-                          _E = N.Error.make(_elm),-                          _J = N.JavaScript.make(_elm),-                          $moduleName = "Keyboard";-                      var Signal = Elm.Signal.make(_elm);-                      var Native = Native || {};-                      Native.Keyboard = Elm.Native.Keyboard.make(_elm);-                      var _op = {};-                      var lastPressed = Native.Keyboard.lastPressed;-                      var keysDown = Native.Keyboard.keysDown;-                      var isDown = Native.Keyboard.isDown;-                      var shift = isDown(16);-                      var space = isDown(32);-                      var enter = isDown(13);-                      var directions = Native.Keyboard.directions;-                      var wasd = A4(directions,87,83,65,68);-                      var ctrl = isDown(17);-                      var arrows = A4(directions,38,40,37,39);-                      _elm.Keyboard.values = {_op: _op, directions: directions, arrows: arrows, wasd: wasd, isDown: isDown, shift: shift, ctrl: ctrl, space: space, enter: enter, keysDown: keysDown, lastPressed: lastPressed};-                      return _elm.Keyboard.values-                    };Elm.List = Elm.List || {};-Elm.List.make = function (_elm)-                {-                  _elm.List = _elm.List || {};-                  if (_elm.List.values)-                  return _elm.List.values-                  var N = Elm.Native,-                      _N = N.Utils.make(_elm),-                      _L = N.List.make(_elm),-                      _E = N.Error.make(_elm),-                      _J = N.JavaScript.make(_elm),-                      $moduleName = "List";-                  var Basics = Elm.Basics.make(_elm);-                  var Native = Native || {};-                  Native.List = Elm.Native.List.make(_elm);-                  var _op = {};-                  var zipWith = Native.List.zipWith;-                  var zip = Native.List.zip;-                  var take = Native.List.take;-                  var tail = Native.List.tail;-                  var sortWith = Native.List.sortWith;-                  var sortBy = Native.List.sortBy;-                  var sort = Native.List.sort;-                  var scanl1 = Native.List.scanl1;-                  var scanl = Native.List.scanl;-                  var reverse = Native.List.reverse;-                  var repeat = Native.List.repeat;-                  var map = Native.List.map;-                  var length = Native.List.length;-                  var last = Native.List.last;-                  var join = Native.List.join;-                  var isEmpty = function (xs)-                                {-                                  return function ()-                                         {-                                           switch (xs.ctor)-                                           {case-                                            "[]" :-                                              return true}-                                           return false-                                         }()-                                };-                  var head = Native.List.head;-                  var foldr1 = Native.List.foldr1;-                  var foldr = Native.List.foldr;-                  var foldl1 = Native.List.foldl1;-                  var maximum = foldl1(Basics.max);-                  var minimum = foldl1(Basics.min);-                  var foldl = Native.List.foldl;-                  var or = A2(foldl,-                              F2(function (x,y)-                                 {-                                   return x || y-                                 }),-                              false);-                  var product = A2(foldl,-                                   F2(function (x,y)-                                      {-                                        return x * y-                                      }),-                                   1);-                  var sum = A2(foldl,-                               F2(function (x,y)-                                  {-                                    return x + y-                                  }),-                               0);-                  var filter = Native.List.filter;-                  var drop = Native.List.drop;-                  var concat = Native.List.concat;-                  var concatMap = F2(function (f,list)-                                     {-                                       return concat(A2(map,f,list))-                                     });-                  var any = Native.List.any;-                  var and = A2(foldl,-                               F2(function (x,y)-                                  {-                                    return x && y-                                  }),-                               true);-                  var all = Native.List.all;-                  _op["::"] = Native.List.cons;-                  var intersperse = F2(function (sep,xs)-                                       {-                                         return function ()-                                                {-                                                  switch (xs.ctor)-                                                  {case-                                                   "::" :-                                                     switch (xs._1.ctor)-                                                     {case-                                                      "::" :-                                                        return {ctor: "::", _0: xs._0, _1: {ctor: "::", _0: sep, _1: A2(intersperse,-                                                                                                                        sep,-                                                                                                                        {ctor: "::", _0: xs._1._0, _1: xs._1._1})}}-                                                      case-                                                      "[]" :-                                                        return _J.toList([xs._0])}-                                                     break;-                                                   case-                                                   "[]" :-                                                     return _J.toList([])}-                                                  _E.Case($moduleName,"between lines 212 and 217");-                                                }()-                                       });-                  var partition = F2(function (pred,lst)-                                     {-                                       return function ()-                                              {-                                                switch (lst.ctor)-                                                {case-                                                 "::" :-                                                   return function ()-                                                          {-                                                            var $ = A2(partition,pred,lst._1),-                                                                bs = $._0,-                                                                cs = $._1;-                                                            return pred(lst._0) ? {ctor: "_Tuple2", _0: {ctor: "::", _0: lst._0, _1: bs}, _1: cs} : {ctor: "_Tuple2", _0: bs, _1: {ctor: "::", _0: lst._0, _1: cs}}-                                                          }()-                                                 case-                                                 "[]" :-                                                   return {ctor: "_Tuple2", _0: _J.toList([]), _1: _J.toList([])}}-                                                _E.Case($moduleName,"between lines 169 and 179");-                                              }()-                                     });-                  var unzip = function (pairs)-                              {-                                return function ()-                                       {-                                         switch (pairs.ctor)-                                         {case-                                          "::" :-                                            switch (pairs._0.ctor)-                                            {case-                                             "_Tuple2" :-                                               return function ()-                                                      {-                                                        var $ = unzip(pairs._1),xs = $._0,ys = $._1;-                                                        return {ctor: "_Tuple2", _0: {ctor: "::", _0: pairs._0._0, _1: xs}, _1: {ctor: "::", _0: pairs._0._1, _1: ys}}-                                                      }()}-                                            break;-                                          case-                                          "[]" :-                                            return {ctor: "_Tuple2", _0: _J.toList([]), _1: _J.toList([])}}-                                         _E.Case($moduleName,"between lines 194 and 202");-                                       }()-                              };-                  _op["++"] = Native.List.append;-                  _elm.List.values = {_op: _op, head: head, tail: tail, last: last, isEmpty: isEmpty, map: map, foldl: foldl, foldr: foldr, foldl1: foldl1, foldr1: foldr1, scanl: scanl, scanl1: scanl1, filter: filter, length: length, reverse: reverse, all: all, any: any, and: and, or: or, concat: concat, concatMap: concatMap, sum: sum, product: product, maximum: maximum, minimum: minimum, partition: partition, zip: zip, zipWith: zipWith, unzip: unzip, join: join, intersperse: intersperse, take: take, drop: drop, repeat: repeat, sort: sort, sortBy: sortBy, sortWith: sortWith};-                  return _elm.List.values-                };Elm.Maybe = Elm.Maybe || {};-Elm.Maybe.make = function (_elm)-                 {-                   _elm.Maybe = _elm.Maybe || {};-                   if (_elm.Maybe.values)-                   return _elm.Maybe.values-                   var N = Elm.Native,-                       _N = N.Utils.make(_elm),-                       _L = N.List.make(_elm),-                       _E = N.Error.make(_elm),-                       _J = N.JavaScript.make(_elm),-                       $moduleName = "Maybe";-                   var Basics = Elm.Basics.make(_elm);-                   var List = Elm.List.make(_elm);-                   var _op = {};-                   var Nothing = {ctor: "Nothing"};-                   var Just = function (a)-                              {-                                return {ctor: "Just", _0: a}-                              };-                   var maybe = F3(function (b,f,m)-                                  {-                                    return function ()-                                           {-                                             switch (m.ctor)-                                             {case-                                              "Just" :-                                                return f(m._0)-                                              case-                                              "Nothing" :-                                                return b}-                                             _E.Case($moduleName,"between lines 28 and 33");-                                           }()-                                  });-                   var cons = F2(function (mx,xs)-                                 {-                                   return A3(maybe,-                                             xs,-                                             function (x)-                                             {-                                               return {ctor: "::", _0: x, _1: xs}-                                             },-                                             mx)-                                 });-                   var justs = A2(List.foldr,cons,_J.toList([]));-                   var isJust = A2(maybe,-                                   false,-                                   function (_v2)-                                   {-                                     return function ()-                                            {-                                              return true-                                            }()-                                   });-                   var isNothing = function ($)-                                   {-                                     return Basics.not(isJust($))-                                   };-                   _elm.Maybe.values = {_op: _op, maybe: maybe, isJust: isJust, isNothing: isNothing, cons: cons, justs: justs, Just: Just, Nothing: Nothing};-                   return _elm.Maybe.values-                 };Elm.Mouse = Elm.Mouse || {};-Elm.Mouse.make = function (_elm)-                 {-                   _elm.Mouse = _elm.Mouse || {};-                   if (_elm.Mouse.values)-                   return _elm.Mouse.values-                   var N = Elm.Native,-                       _N = N.Utils.make(_elm),-                       _L = N.List.make(_elm),-                       _E = N.Error.make(_elm),-                       _J = N.JavaScript.make(_elm),-                       $moduleName = "Mouse";-                   var Signal = Elm.Signal.make(_elm);-                   var Native = Native || {};-                   Native.Mouse = Elm.Native.Mouse.make(_elm);-                   var _op = {};-                   var y = Native.Mouse.y;-                   var x = Native.Mouse.x;-                   var position = Native.Mouse.position;-                   var isDown = Native.Mouse.isDown;-                   var isClicked = Native.Mouse.isClicked;-                   var clicks = Native.Mouse.clicks;-                   _elm.Mouse.values = {_op: _op, position: position, x: x, y: y, isDown: isDown, isClicked: isClicked, clicks: clicks};-                   return _elm.Mouse.values-                 };Elm.Prelude = Elm.Prelude || {};-Elm.Prelude.make = function (_elm)-                   {-                     _elm.Prelude = _elm.Prelude || {};-                     if (_elm.Prelude.values)-                     return _elm.Prelude.values-                     var N = Elm.Native,-                         _N = N.Utils.make(_elm),-                         _L = N.List.make(_elm),-                         _E = N.Error.make(_elm),-                         _J = N.JavaScript.make(_elm),-                         $moduleName = "Prelude";-                     var Native = Native || {};-                     Native.Show = Elm.Native.Show.make(_elm);-                     var _op = {};-                     var show = Native.Show.show;-                     _elm.Prelude.values = {_op: _op, show: show};-                     return _elm.Prelude.values-                   };Elm.Random = Elm.Random || {};-Elm.Random.make = function (_elm)-                  {-                    _elm.Random = _elm.Random || {};-                    if (_elm.Random.values)-                    return _elm.Random.values-                    var N = Elm.Native,-                        _N = N.Utils.make(_elm),-                        _L = N.List.make(_elm),-                        _E = N.Error.make(_elm),-                        _J = N.JavaScript.make(_elm),-                        $moduleName = "Random";-                    var Signal = Elm.Signal.make(_elm);-                    var Native = Native || {};-                    Native.Random = Elm.Native.Random.make(_elm);-                    var _op = {};-                    var range = Native.Random.range;-                    var floatList = Native.Random.floatList;-                    var $float = Native.Random.float_;-                    _elm.Random.values = {_op: _op, range: range, $float: $float, floatList: floatList};-                    return _elm.Random.values-                  };Elm.Regex = Elm.Regex || {};-Elm.Regex.make = function (_elm)-                 {-                   _elm.Regex = _elm.Regex || {};-                   if (_elm.Regex.values)-                   return _elm.Regex.values-                   var N = Elm.Native,-                       _N = N.Utils.make(_elm),-                       _L = N.List.make(_elm),-                       _E = N.Error.make(_elm),-                       _J = N.JavaScript.make(_elm),-                       $moduleName = "Regex";-                   var Maybe = Elm.Maybe.make(_elm);-                   var Native = Native || {};-                   Native.Regex = Elm.Native.Regex.make(_elm);-                   var _op = {};-                   var splitN = Native.Regex.splitN;-                   var split = Native.Regex.split;-                   var replaceAll = Native.Regex.replaceAll;-                   var replace = Native.Regex.replace;-                   var pattern = Native.Regex.pattern;-                   var findAll = Native.Regex.findAll;-                   var find = Native.Regex.find;-                   var escape = Native.Regex.escape;-                   var contains = Native.Regex.contains;-                   var caseInsensitive = Native.Regex.caseInsensitive;-                   var Regex = {ctor: "Regex"};-                   var Match = F4(function (a,b,c,d)-                                  {-                                    return {_: {}, index: c, match: a, number: d, submatches: b}-                                  });-                   _elm.Regex.values = {_op: _op, escape: escape, pattern: pattern, caseInsensitive: caseInsensitive, contains: contains, findAll: findAll, find: find, replaceAll: replaceAll, replace: replace, split: split, splitN: splitN, Regex: Regex, Match: Match};-                   return _elm.Regex.values-                 };Elm.Set = Elm.Set || {};-Elm.Set.make = function (_elm)-               {-                 _elm.Set = _elm.Set || {};-                 if (_elm.Set.values)-                 return _elm.Set.values-                 var N = Elm.Native,-                     _N = N.Utils.make(_elm),-                     _L = N.List.make(_elm),-                     _E = N.Error.make(_elm),-                     _J = N.JavaScript.make(_elm),-                     $moduleName = "Set";-                 var Maybe = Elm.Maybe.make(_elm);-                 var Dict = Elm.Dict.make(_elm);-                 var List = Elm.List.make(_elm);-                 var _op = {};-                 var union = Dict.union;-                 var toList = Dict.keys;-                 var singleton = function (k)-                                 {-                                   return A2(Dict.singleton,k,{ctor: "_Tuple0"})-                                 };-                 var remove = Dict.remove;-                 var member = Dict.member;-                 var intersect = Dict.intersect;-                 var insert = function (k)-                              {-                                return A2(Dict.insert,k,{ctor: "_Tuple0"})-                              };-                 var foldr = F3(function (f,b,s)-                                {-                                  return A3(Dict.foldr,-                                            F3(function (k,_v0,b)-                                               {-                                                 return function ()-                                                        {-                                                          return A2(f,k,b)-                                                        }()-                                               }),-                                            b,-                                            s)-                                });-                 var foldl = F3(function (f,b,s)-                                {-                                  return A3(Dict.foldl,-                                            F3(function (k,_v2,b)-                                               {-                                                 return function ()-                                                        {-                                                          return A2(f,k,b)-                                                        }()-                                               }),-                                            b,-                                            s)-                                });-                 var empty = Dict.empty;-                 var fromList = function (xs)-                                {-                                  return A3(List.foldl,insert,empty,xs)-                                };-                 var map = F2(function (f,s)-                              {-                                return fromList(A2(List.map,f,toList(s)))-                              });-                 var diff = Dict.diff;-                 _elm.Set.values = {_op: _op, empty: empty, singleton: singleton, insert: insert, remove: remove, member: member, foldl: foldl, foldr: foldr, map: map, union: union, intersect: intersect, diff: diff, toList: toList, fromList: fromList};-                 return _elm.Set.values-               };Elm.Signal = Elm.Signal || {};-Elm.Signal.make = function (_elm)-                  {-                    _elm.Signal = _elm.Signal || {};-                    if (_elm.Signal.values)-                    return _elm.Signal.values-                    var N = Elm.Native,-                        _N = N.Utils.make(_elm),-                        _L = N.List.make(_elm),-                        _E = N.Error.make(_elm),-                        _J = N.JavaScript.make(_elm),-                        $moduleName = "Signal";-                    var Native = Native || {};-                    Native.Signal = Elm.Native.Signal.make(_elm);-                    var List = Elm.List.make(_elm);-                    var _op = {};-                    _op["~"] = F2(function (sf,s)-                                  {-                                    return A3(Native.Signal.lift2,-                                              F2(function (f,x)-                                                 {-                                                   return f(x)-                                                 }),-                                              sf,-                                              s)-                                  });-                    var sampleOn = Native.Signal.sampleOn;-                    var merges = Native.Signal.merges;-                    var merge = Native.Signal.merge;-                    var lift8 = Native.Signal.lift8;-                    var lift7 = Native.Signal.lift7;-                    var lift6 = Native.Signal.lift6;-                    var lift5 = Native.Signal.lift5;-                    var lift4 = Native.Signal.lift4;-                    var lift3 = Native.Signal.lift3;-                    var lift2 = Native.Signal.lift2;-                    var lift = Native.Signal.lift;-                    var keepWhen = Native.Signal.keepWhen;-                    var keepIf = Native.Signal.keepIf;-                    var foldp = Native.Signal.foldp;-                    var dropWhen = Native.Signal.dropWhen;-                    var dropRepeats = Native.Signal.dropRepeats;-                    var dropIf = Native.Signal.dropIf;-                    var countIf = Native.Signal.countIf;-                    var count = Native.Signal.count;-                    var constant = Native.Signal.constant;-                    var combine = A2(List.foldr,-                                     Native.Signal.lift2(F2(function (x,y)-                                                            {-                                                              return {ctor: "::", _0: x, _1: y}-                                                            })),-                                     Native.Signal.constant(_J.toList([])));-                    var Signal = {ctor: "Signal"};-                    _op["<~"] = F2(function (f,s)-                                   {-                                     return A2(Native.Signal.lift,f,s)-                                   });-                    _elm.Signal.values = {_op: _op, constant: constant, lift: lift, lift2: lift2, lift3: lift3, lift4: lift4, lift5: lift5, lift6: lift6, lift7: lift7, lift8: lift8, foldp: foldp, merge: merge, merges: merges, combine: combine, count: count, countIf: countIf, keepIf: keepIf, dropIf: dropIf, keepWhen: keepWhen, dropWhen: dropWhen, dropRepeats: dropRepeats, sampleOn: sampleOn, Signal: Signal};-                    return _elm.Signal.values-                  };Elm.String = Elm.String || {};-Elm.String.make = function (_elm)-                  {-                    _elm.String = _elm.String || {};-                    if (_elm.String.values)-                    return _elm.String.values-                    var N = Elm.Native,-                        _N = N.Utils.make(_elm),-                        _L = N.List.make(_elm),-                        _E = N.Error.make(_elm),-                        _J = N.JavaScript.make(_elm),-                        $moduleName = "String";-                    var Native = Native || {};-                    Native.String = Elm.Native.String.make(_elm);-                    var Maybe = Elm.Maybe.make(_elm);-                    var _op = {};-                    var words = Native.String.words;-                    var uncons = Native.String.uncons;-                    var trimRight = Native.String.trimRight;-                    var trimLeft = Native.String.trimLeft;-                    var trim = Native.String.trim;-                    var toUpper = Native.String.toUpper;-                    var toLower = Native.String.toLower;-                    var toList = Native.String.toList;-                    var toInt = Native.String.toInt;-                    var toFloat = Native.String.toFloat;-                    var sub = Native.String.sub;-                    var startsWith = Native.String.startsWith;-                    var split = Native.String.split;-                    var right = Native.String.right;-                    var reverse = Native.String.reverse;-                    var repeat = Native.String.repeat;-                    var padRight = Native.String.padRight;-                    var padLeft = Native.String.padLeft;-                    var pad = Native.String.pad;-                    var map = Native.String.map;-                    var lines = Native.String.lines;-                    var length = Native.String.length;-                    var left = Native.String.left;-                    var join = Native.String.join;-                    var isEmpty = Native.String.isEmpty;-                    var indices = Native.String.indexes;-                    var indexes = Native.String.indexes;-                    var fromList = Native.String.fromList;-                    var foldr = Native.String.foldr;-                    var foldl = Native.String.foldl;-                    var filter = Native.String.filter;-                    var endsWith = Native.String.endsWith;-                    var dropRight = Native.String.dropRight;-                    var dropLeft = Native.String.dropLeft;-                    var contains = Native.String.contains;-                    var cons = Native.String.cons;-                    var concat = Native.String.concat;-                    var append = Native.String.append;-                    var any = Native.String.any;-                    var all = Native.String.all;-                    _elm.String.values = {_op: _op, isEmpty: isEmpty, cons: cons, uncons: uncons, append: append, concat: concat, length: length, map: map, filter: filter, reverse: reverse, foldl: foldl, foldr: foldr, split: split, join: join, repeat: repeat, sub: sub, left: left, right: right, dropLeft: dropLeft, dropRight: dropRight, pad: pad, padLeft: padLeft, padRight: padRight, trim: trim, trimLeft: trimLeft, trimRight: trimRight, words: words, lines: lines, toUpper: toUpper, toLower: toLower, any: any, all: all, contains: contains, startsWith: startsWith, endsWith: endsWith, indexes: indexes, indices: indices, toInt: toInt, toFloat: toFloat, toList: toList, fromList: fromList};-                    return _elm.String.values-                  };Elm.Text = Elm.Text || {};-Elm.Text.make = function (_elm)-                {-                  _elm.Text = _elm.Text || {};-                  if (_elm.Text.values)-                  return _elm.Text.values-                  var N = Elm.Native,-                      _N = N.Utils.make(_elm),-                      _L = N.List.make(_elm),-                      _E = N.Error.make(_elm),-                      _J = N.JavaScript.make(_elm),-                      $moduleName = "Text";-                  var Basics = Elm.Basics.make(_elm);-                  var Color = Elm.Color.make(_elm);-                  var Graphics = Graphics || {};-                  Graphics.Element = Elm.Graphics.Element.make(_elm);-                  var Maybe = Elm.Maybe.make(_elm);-                  var JavaScript = Elm.JavaScript.make(_elm);-                  var Native = Native || {};-                  Native.Text = Elm.Native.Text.make(_elm);-                  var _op = {};-                  var underline = Native.Text.underline;-                  var typeface = Native.Text.typeface;-                  var toText = Native.Text.toText;-                  var text = Native.Text.text;-                  var strikeThrough = Native.Text.strikeThrough;-                  var righted = Native.Text.righted;-                  var plainText = Native.Text.plainText;-                  var overline = Native.Text.overline;-                  var monospace = Native.Text.monospace;-                  var markdown = Native.Text.markdown;-                  var link = Native.Text.link;-                  var justified = Native.Text.justified;-                  var italic = Native.Text.italic;-                  var height = Native.Text.height;-                  var color = Native.Text.color;-                  var centered = Native.Text.centered;-                  var bold = Native.Text.bold;-                  var asText = Native.Text.asText;-                  var Text = {ctor: "Text"};-                  _elm.Text.values = {_op: _op, toText: toText, typeface: typeface, monospace: monospace, link: link, height: height, color: color, bold: bold, italic: italic, overline: overline, underline: underline, strikeThrough: strikeThrough, justified: justified, centered: centered, righted: righted, text: text, plainText: plainText, markdown: markdown, asText: asText, Text: Text};-                  return _elm.Text.values-                };Elm.Time = Elm.Time || {};-Elm.Time.make = function (_elm)-                {-                  _elm.Time = _elm.Time || {};-                  if (_elm.Time.values)-                  return _elm.Time.values-                  var N = Elm.Native,-                      _N = N.Utils.make(_elm),-                      _L = N.List.make(_elm),-                      _E = N.Error.make(_elm),-                      _J = N.JavaScript.make(_elm),-                      $moduleName = "Time";-                  var Basics = Elm.Basics.make(_elm);-                  var Native = Native || {};-                  Native.Time = Elm.Native.Time.make(_elm);-                  var Signal = Elm.Signal.make(_elm);-                  var _op = {};-                  var timestamp = Native.Time.timestamp;-                  var since = Native.Time.since;-                  var millisecond = 1;-                  var second = 1000 * millisecond;-                  var minute = 60 * second;-                  var inSeconds = function (t)-                                  {-                                    return t / second-                                  };-                  var inMinutes = function (t)-                                  {-                                    return t / minute-                                  };-                  var inMilliseconds = function (t)-                                       {-                                         return t-                                       };-                  var hour = 60 * minute;-                  var inHours = function (t)-                                {-                                  return t / hour-                                };-                  var fpsWhen = Native.Time.fpsWhen;-                  var fps = Native.Time.fps;-                  var every = Native.Time.every;-                  var delay = Native.Time.delay;-                  _elm.Time.values = {_op: _op, millisecond: millisecond, second: second, minute: minute, hour: hour, inMilliseconds: inMilliseconds, inSeconds: inSeconds, inMinutes: inMinutes, inHours: inHours, fps: fps, fpsWhen: fpsWhen, every: every, since: since, timestamp: timestamp, delay: delay};-                  return _elm.Time.values-                };Elm.Touch = Elm.Touch || {};-Elm.Touch.make = function (_elm)-                 {-                   _elm.Touch = _elm.Touch || {};-                   if (_elm.Touch.values)-                   return _elm.Touch.values-                   var N = Elm.Native,-                       _N = N.Utils.make(_elm),-                       _L = N.List.make(_elm),-                       _E = N.Error.make(_elm),-                       _J = N.JavaScript.make(_elm),-                       $moduleName = "Touch";-                   var Signal = Elm.Signal.make(_elm);-                   var Native = Native || {};-                   Native.Touch = Elm.Native.Touch.make(_elm);-                   var Time = Elm.Time.make(_elm);-                   var _op = {};-                   var touches = Native.Touch.touches;-                   var taps = Native.Touch.taps;-                   var Touch = F6(function (a,b,c,d,e,f)-                                  {-                                    return {_: {}, id: c, t0: f, x: a, x0: d, y: b, y0: e}-                                  });-                   _elm.Touch.values = {_op: _op, touches: touches, taps: taps, Touch: Touch};-                   return _elm.Touch.values-                 };Elm.Transform2D = Elm.Transform2D || {};-Elm.Transform2D.make = function (_elm)-                       {-                         _elm.Transform2D = _elm.Transform2D || {};-                         if (_elm.Transform2D.values)-                         return _elm.Transform2D.values-                         var N = Elm.Native,-                             _N = N.Utils.make(_elm),-                             _L = N.List.make(_elm),-                             _E = N.Error.make(_elm),-                             _J = N.JavaScript.make(_elm),-                             $moduleName = "Transform2D";-                         var Native = Native || {};-                         Native.Transform2D = Elm.Native.Transform2D.make(_elm);-                         var _op = {};-                         var rotation = Native.Transform2D.rotation;-                         var multiply = Native.Transform2D.multiply;-                         var matrix = Native.Transform2D.matrix;-                         var scale = function (s)-                                     {-                                       return A6(matrix,s,0,0,s,0,0)-                                     };-                         var scaleX = function (x)-                                      {-                                        return A6(matrix,x,0,0,1,0,0)-                                      };-                         var scaleY = function (y)-                                      {-                                        return A6(matrix,1,0,0,y,0,0)-                                      };-                         var translation = F2(function (x,y)-                                              {-                                                return A6(matrix,1,0,0,1,x,y)-                                              });-                         var identity = Native.Transform2D.identity;-                         var Transform2D = {ctor: "Transform2D"};-                         _elm.Transform2D.values = {_op: _op, identity: identity, matrix: matrix, rotation: rotation, translation: translation, scale: scale, scaleX: scaleX, scaleY: scaleY, multiply: multiply, Transform2D: Transform2D};-                         return _elm.Transform2D.values-                       };Elm.WebSocket = Elm.WebSocket || {};-Elm.WebSocket.make = function (_elm)-                     {-                       _elm.WebSocket = _elm.WebSocket || {};-                       if (_elm.WebSocket.values)-                       return _elm.WebSocket.values-                       var N = Elm.Native,-                           _N = N.Utils.make(_elm),-                           _L = N.List.make(_elm),-                           _E = N.Error.make(_elm),-                           _J = N.JavaScript.make(_elm),-                           $moduleName = "WebSocket";-                       var Signal = Elm.Signal.make(_elm);-                       var Basics = Elm.Basics.make(_elm);-                       var Native = Native || {};-                       Native.WebSocket = Elm.Native.WebSocket.make(_elm);-                       var _op = {};-                       var connect = Native.WebSocket.connect;-                       _elm.WebSocket.values = {_op: _op, connect: connect};-                       return _elm.WebSocket.values-                     };Elm.Window = Elm.Window || {};-Elm.Window.make = function (_elm)-                  {-                    _elm.Window = _elm.Window || {};-                    if (_elm.Window.values)-                    return _elm.Window.values-                    var N = Elm.Native,-                        _N = N.Utils.make(_elm),-                        _L = N.List.make(_elm),-                        _E = N.Error.make(_elm),-                        _J = N.JavaScript.make(_elm),-                        $moduleName = "Window";-                    var Signal = Elm.Signal.make(_elm);-                    var Native = Native || {};-                    Native.Window = Elm.Native.Window.make(_elm);-                    var _op = {};-                    var width = Native.Window.width;-                    var height = Native.Window.height;-                    var dimensions = Native.Window.dimensions;-                    _elm.Window.values = {_op: _op, dimensions: dimensions, width: width, height: height};-                    return _elm.Window.values-                  };Elm.Graphics = Elm.Graphics || {};-Elm.Graphics.Collage = Elm.Graphics.Collage || {};-Elm.Graphics.Collage.make = function (_elm)-                            {-                              _elm.Graphics = _elm.Graphics || {};-                              _elm.Graphics.Collage = _elm.Graphics.Collage || {};-                              if (_elm.Graphics.Collage.values)-                              return _elm.Graphics.Collage.values-                              var N = Elm.Native,-                                  _N = N.Utils.make(_elm),-                                  _L = N.List.make(_elm),-                                  _E = N.Error.make(_elm),-                                  _J = N.JavaScript.make(_elm),-                                  $moduleName = "Graphics.Collage";-                              var Basics = Elm.Basics.make(_elm);-                              var List = Elm.List.make(_elm);-                              var Either = Elm.Either.make(_elm);-                              var Transform2D = Elm.Transform2D.make(_elm);-                              var Native = Native || {};-                              Native.Graphics = Native.Graphics || {};-                              Native.Graphics.Collage = Elm.Native.Graphics.Collage.make(_elm);-                              var Graphics = Graphics || {};-                              Graphics.Element = Elm.Graphics.Element.make(_elm);-                              var Color = Elm.Color.make(_elm);-                              var Maybe = Elm.Maybe.make(_elm);-                              var JavaScript = Elm.JavaScript.make(_elm);-                              var _op = {};-                              var segment = F2(function (p1,p2)-                                               {-                                                 return _J.toList([p1,p2])-                                               });-                              var scale = F2(function (s,f)-                                             {-                                               return _N.replace([["scale",f.scale * s]],f)-                                             });-                              var rotate = F2(function (t,f)-                                              {-                                                return _N.replace([["theta",f.theta + t]],f)-                                              });-                              var rect = F2(function (w,h)-                                            {-                                              return function ()-                                                     {-                                                       var hw = w / 2;-                                                       var hh = h / 2;-                                                       return _J.toList([{ctor: "_Tuple2", _0: 0 - hw, _1: 0 - hh},-                                                                         {ctor: "_Tuple2", _0: 0 - hw, _1: hh},-                                                                         {ctor: "_Tuple2", _0: hw, _1: hh},-                                                                         {ctor: "_Tuple2", _0: hw, _1: 0 - hh}])-                                                     }()-                                            });-                              var square = function (n)-                                           {-                                             return A2(rect,n,n)-                                           };-                              var polygon = function (points)-                                            {-                                              return points-                                            };-                              var path = function (ps)-                                         {-                                           return ps-                                         };-                              var oval = F2(function (w,h)-                                            {-                                              return function ()-                                                     {-                                                       var n = 50;-                                                       var t = 2 * Basics.pi / n;-                                                       var hw = w / 2;-                                                       var hh = h / 2;-                                                       var f = function (i)-                                                               {-                                                                 return {ctor: "_Tuple2", _0: hw * Basics.cos(t * i), _1: hh * Basics.sin(t * i)}-                                                               };-                                                       return A2(List.map,f,_L.range(0,n - 1))-                                                     }()-                                            });-                              var ngon = F2(function (n,r)-                                            {-                                              return function ()-                                                     {-                                                       var m = Basics.toFloat(n);-                                                       var t = 2 * Basics.pi / m;-                                                       var f = function (i)-                                                               {-                                                                 return {ctor: "_Tuple2", _0: r * Basics.cos(t * i), _1: r * Basics.sin(t * i)}-                                                               };-                                                       return A2(List.map,f,_L.range(0,m - 1))-                                                     }()-                                            });-                              var moveY = F2(function (y,f)-                                             {-                                               return _N.replace([["y",f.y + y]],f)-                                             });-                              var moveX = F2(function (x,f)-                                             {-                                               return _N.replace([["x",f.x + x]],f)-                                             });-                              var move = F2(function (_v0,f)-                                            {-                                              return function ()-                                                     {-                                                       switch (_v0.ctor)-                                                       {case-                                                        "_Tuple2" :-                                                          return _N.replace([["x",f.x + _v0._0],-                                                                             ["y",f.y + _v0._1]],-                                                                            f)}-                                                       _E.Case($moduleName,-                                                               "on line 170, column 20 to 48");-                                                     }()-                                            });-                              var form = function (f)-                                         {-                                           return {_: {}, alpha: 1, form: f, scale: 1, theta: 0, x: 0, y: 0}-                                         };-                              var collage = Native.Graphics.Collage.collage;-                              var circle = function (r)-                                           {-                                             return A2(oval,2 * r,2 * r)-                                           };-                              var alpha = F2(function (a,f)-                                             {-                                               return _N.replace([["alpha",a]],f)-                                             });-                              var Texture = function (a)-                                            {-                                              return {ctor: "Texture", _0: a}-                                            };-                              var Solid = function (a)-                                          {-                                            return {ctor: "Solid", _0: a}-                                          };-                              var Smooth = {ctor: "Smooth"};-                              var Sharp = function (a)-                                          {-                                            return {ctor: "Sharp", _0: a}-                                          };-                              var Round = {ctor: "Round"};-                              var Padded = {ctor: "Padded"};-                              var LineStyle = F6(function (a,b,c,d,e,f)-                                                 {-                                                   return {_: {}, cap: c, color: a, dashOffset: f, dashing: e, join: d, width: b}-                                                 });-                              var Grad = function (a)-                                         {-                                           return {ctor: "Grad", _0: a}-                                         };-                              var Form = F6(function (a,b,c,d,e,f)-                                            {-                                              return {_: {}, alpha: e, form: f, scale: b, theta: a, x: c, y: d}-                                            });-                              var Flat = {ctor: "Flat"};-                              var defaultLine = {_: {}, cap: Flat, color: Color.black, dashOffset: 0, dashing: _J.toList([]), join: Sharp(10), width: 1};-                              var dashed = function (clr)-                                           {-                                             return _N.replace([["color",clr],-                                                                ["dashing",_J.toList([8,4])]],-                                                               defaultLine)-                                           };-                              var dotted = function (clr)-                                           {-                                             return _N.replace([["color",clr],-                                                                ["dashing",_J.toList([3,3])]],-                                                               defaultLine)-                                           };-                              var solid = function (clr)-                                          {-                                            return _N.replace([["color",clr]],defaultLine)-                                          };-                              var FShape = F2(function (a,b)-                                              {-                                                return {ctor: "FShape", _0: a, _1: b}-                                              });-                              var fill = F2(function (style,shape)-                                            {-                                              return form(A2(FShape,Either.Right(style),shape))-                                            });-                              var filled = F2(function (color,shape)-                                              {-                                                return A2(fill,Solid(color),shape)-                                              });-                              var gradient = F2(function (grad,shape)-                                                {-                                                  return A2(fill,Grad(grad),shape)-                                                });-                              var textured = F2(function (src,shape)-                                                {-                                                  return A2(fill,Texture(src),shape)-                                                });-                              var outlined = F2(function (style,shape)-                                                {-                                                  return form(A2(FShape,Either.Left(style),shape))-                                                });-                              var FPath = F2(function (a,b)-                                             {-                                               return {ctor: "FPath", _0: a, _1: b}-                                             });-                              var traced = F2(function (style,path)-                                              {-                                                return form(A2(FPath,style,path))-                                              });-                              var FImage = F4(function (a,b,c,d)-                                              {-                                                return {ctor: "FImage", _0: a, _1: b, _2: c, _3: d}-                                              });-                              var sprite = F4(function (w,h,pos,src)-                                              {-                                                return form(A4(FImage,w,h,pos,src))-                                              });-                              var FGroup = F2(function (a,b)-                                              {-                                                return {ctor: "FGroup", _0: a, _1: b}-                                              });-                              var group = function (fs)-                                          {-                                            return form(A2(FGroup,Transform2D.identity,fs))-                                          };-                              var groupTransform = F2(function (matrix,fs)-                                                      {-                                                        return form(A2(FGroup,matrix,fs))-                                                      });-                              var FElement = function (a)-                                             {-                                               return {ctor: "FElement", _0: a}-                                             };-                              var toForm = function (e)-                                           {-                                             return form(FElement(e))-                                           };-                              var Clipped = {ctor: "Clipped"};-                              _elm.Graphics.Collage.values = {_op: _op, defaultLine: defaultLine, solid: solid, dashed: dashed, dotted: dotted, form: form, fill: fill, filled: filled, textured: textured, gradient: gradient, outlined: outlined, traced: traced, sprite: sprite, toForm: toForm, group: group, groupTransform: groupTransform, move: move, moveX: moveX, moveY: moveY, scale: scale, rotate: rotate, alpha: alpha, collage: collage, path: path, segment: segment, polygon: polygon, rect: rect, square: square, oval: oval, circle: circle, ngon: ngon, Solid: Solid, Texture: Texture, Grad: Grad, Flat: Flat, Round: Round, Padded: Padded, Smooth: Smooth, Sharp: Sharp, Clipped: Clipped, FPath: FPath, FShape: FShape, FImage: FImage, FElement: FElement, FGroup: FGroup, Form: Form, LineStyle: LineStyle};-                              return _elm.Graphics.Collage.values-                            };Elm.Graphics = Elm.Graphics || {};-Elm.Graphics.Element = Elm.Graphics.Element || {};-Elm.Graphics.Element.make = function (_elm)-                            {-                              _elm.Graphics = _elm.Graphics || {};-                              _elm.Graphics.Element = _elm.Graphics.Element || {};-                              if (_elm.Graphics.Element.values)-                              return _elm.Graphics.Element.values-                              var N = Elm.Native,-                                  _N = N.Utils.make(_elm),-                                  _L = N.List.make(_elm),-                                  _E = N.Error.make(_elm),-                                  _J = N.JavaScript.make(_elm),-                                  $moduleName = "Graphics.Element";-                              var Basics = Elm.Basics.make(_elm);-                              var Native = Native || {};-                              Native.Utils = Elm.Native.Utils.make(_elm);-                              var JavaScript = Elm.JavaScript.make(_elm);-                              var JavaScript = Elm.JavaScript.make(_elm);-                              var List = Elm.List.make(_elm);-                              var Color = Elm.Color.make(_elm);-                              var Maybe = Elm.Maybe.make(_elm);-                              var _op = {};-                              var widthOf = function (e)-                                            {-                                              return e.props.width-                                            };-                              var tag = F2(function (name,e)-                                           {-                                             return function ()-                                                    {-                                                      var p = e.props;-                                                      return {_: {}, element: e.element, props: _N.replace([["tag",-                                                                                                             JavaScript.fromString(name)]],-                                                                                                           p)}-                                                    }()-                                           });-                              var sizeOf = function (e)-                                           {-                                             return {ctor: "_Tuple2", _0: e.props.width, _1: e.props.height}-                                           };-                              var opacity = F2(function (o,e)-                                               {-                                                 return function ()-                                                        {-                                                          var p = e.props;-                                                          return {_: {}, element: e.element, props: _N.replace([["opacity",-                                                                                                                 o]],-                                                                                                               p)}-                                                        }()-                                               });-                              var link = F2(function (href,e)-                                            {-                                              return function ()-                                                     {-                                                       var p = e.props;-                                                       return {_: {}, element: e.element, props: _N.replace([["href",-                                                                                                              JavaScript.fromString(href)]],-                                                                                                            p)}-                                                     }()-                                            });-                              var heightOf = function (e)-                                             {-                                               return e.props.height-                                             };-                              var emptyStr = JavaScript.fromString("");-                              var color = F2(function (c,e)-                                             {-                                               return function ()-                                                      {-                                                        var p = e.props;-                                                        return {_: {}, element: e.element, props: _N.replace([["color",-                                                                                                               Maybe.Just(c)]],-                                                                                                             p)}-                                                      }()-                                             });-                              var Z = {ctor: "Z"};-                              var middleAt = F2(function (x,y)-                                                {-                                                  return {_: {}, horizontal: Z, vertical: Z, x: x, y: y}-                                                });-                              var Tiled = {ctor: "Tiled"};-                              var Spacer = {ctor: "Spacer"};-                              var Relative = function (a)-                                             {-                                               return {ctor: "Relative", _0: a}-                                             };-                              var middle = {_: {}, horizontal: Z, vertical: Z, x: Relative(0.5), y: Relative(0.5)};-                              var relative = Relative;-                              var RawHtml = {ctor: "RawHtml"};-                              var Properties = F8(function (a,b,c,d,e,f,g,h)-                                                  {-                                                    return {_: {}, color: e, height: c, hover: h, href: f, id: a, opacity: d, tag: g, width: b}-                                                  });-                              var newElement = F3(function (w,h,e)-                                                  {-                                                    return {_: {}, element: e, props: A8(Properties,-                                                                                         Native.Utils.guid({ctor: "_Tuple0"}),-                                                                                         w,-                                                                                         h,-                                                                                         1,-                                                                                         Maybe.Nothing,-                                                                                         emptyStr,-                                                                                         emptyStr,-                                                                                         {ctor: "_Tuple0"})}-                                                  });-                              var spacer = F2(function (w,h)-                                              {-                                                return A3(newElement,w,h,Spacer)-                                              });-                              var empty = A2(spacer,0,0);-                              var Position = F4(function (a,b,c,d)-                                                {-                                                  return {_: {}, horizontal: a, vertical: b, x: c, y: d}-                                                });-                              var Plain = {ctor: "Plain"};-                              var P = {ctor: "P"};-                              var midRightAt = F2(function (x,y)-                                                  {-                                                    return {_: {}, horizontal: P, vertical: Z, x: x, y: y}-                                                  });-                              var midTopAt = F2(function (x,y)-                                                {-                                                  return {_: {}, horizontal: Z, vertical: P, x: x, y: y}-                                                });-                              var topRightAt = F2(function (x,y)-                                                  {-                                                    return {_: {}, horizontal: P, vertical: P, x: x, y: y}-                                                  });-                              var N = {ctor: "N"};-                              var bottomLeftAt = F2(function (x,y)-                                                    {-                                                      return {_: {}, horizontal: N, vertical: N, x: x, y: y}-                                                    });-                              var bottomRightAt = F2(function (x,y)-                                                     {-                                                       return {_: {}, horizontal: P, vertical: N, x: x, y: y}-                                                     });-                              var midBottomAt = F2(function (x,y)-                                                   {-                                                     return {_: {}, horizontal: Z, vertical: N, x: x, y: y}-                                                   });-                              var midLeftAt = F2(function (x,y)-                                                 {-                                                   return {_: {}, horizontal: N, vertical: Z, x: x, y: y}-                                                 });-                              var topLeftAt = F2(function (x,y)-                                                 {-                                                   return {_: {}, horizontal: N, vertical: P, x: x, y: y}-                                                 });-                              var Image = F4(function (a,b,c,d)-                                             {-                                               return {ctor: "Image", _0: a, _1: b, _2: c, _3: d}-                                             });-                              var height = F2(function (nh,e)-                                              {-                                                return function ()-                                                       {-                                                         var p = e.props;-                                                         var props = function ()-                                                                     {-                                                                       var _v0 = e.element;-                                                                       switch (_v0.ctor)-                                                                       {case-                                                                        "Image" :-                                                                          return _N.replace([["width",-                                                                                              Basics.round(Basics.toFloat(_v0._1) / Basics.toFloat(_v0._2) * Basics.toFloat(nh))]],-                                                                                            p)}-                                                                       return p-                                                                     }();-                                                         return {_: {}, element: e.element, props: _N.replace([["height",-                                                                                                                nh]],-                                                                                                              p)}-                                                       }()-                                              });-                              var image = F3(function (w,h,src)-                                             {-                                               return A3(newElement,-                                                         w,-                                                         h,-                                                         A4(Image,-                                                            Plain,-                                                            w,-                                                            h,-                                                            JavaScript.fromString(src)))-                                             });-                              var tiledImage = F3(function (w,h,src)-                                                  {-                                                    return A3(newElement,-                                                              w,-                                                              h,-                                                              A4(Image,-                                                                 Tiled,-                                                                 w,-                                                                 h,-                                                                 JavaScript.fromString(src)))-                                                  });-                              var width = F2(function (nw,e)-                                             {-                                               return function ()-                                                      {-                                                        var p = e.props;-                                                        var props = function ()-                                                                    {-                                                                      var _v5 = e.element;-                                                                      switch (_v5.ctor)-                                                                      {case-                                                                       "Image" :-                                                                         return _N.replace([["height",-                                                                                             Basics.round(Basics.toFloat(_v5._2) / Basics.toFloat(_v5._1) * Basics.toFloat(nw))]],-                                                                                           p)-                                                                       case-                                                                       "RawHtml" :-                                                                         return _N.replace([["height",-                                                                                             Basics.snd(A2(Native.Utils.htmlHeight,-                                                                                                           nw,-                                                                                                           e.element))]],-                                                                                           p)}-                                                                      return p-                                                                    }();-                                                        return {_: {}, element: e.element, props: _N.replace([["width",-                                                                                                               nw]],-                                                                                                             props)}-                                                      }()-                                             });-                              var size = F3(function (w,h,e)-                                            {-                                              return A2(height,h,A2(width,w,e))-                                            });-                              var Flow = F2(function (a,b)-                                            {-                                              return {ctor: "Flow", _0: a, _1: b}-                                            });-                              var Fitted = {ctor: "Fitted"};-                              var fittedImage = F3(function (w,h,src)-                                                   {-                                                     return A3(newElement,-                                                               w,-                                                               h,-                                                               A4(Image,-                                                                  Fitted,-                                                                  w,-                                                                  h,-                                                                  JavaScript.fromString(src)))-                                                   });-                              var Element = F2(function (a,b)-                                               {-                                                 return {_: {}, element: b, props: a}-                                               });-                              var DUp = {ctor: "DUp"};-                              var up = DUp;-                              var DRight = {ctor: "DRight"};-                              var right = DRight;-                              var beside = F2(function (lft,rht)-                                              {-                                                return A3(newElement,-                                                          widthOf(lft) + widthOf(rht),-                                                          A2(Basics.max,-                                                             heightOf(lft),-                                                             heightOf(rht)),-                                                          A2(Flow,right,_J.toList([lft,rht])))-                                              });-                              var DOut = {ctor: "DOut"};-                              var layers = function (es)-                                           {-                                             return function ()-                                                    {-                                                      var ws = A2(List.map,widthOf,es);-                                                      var hs = A2(List.map,heightOf,es);-                                                      return A3(newElement,-                                                                List.maximum(ws),-                                                                List.maximum(hs),-                                                                A2(Flow,DOut,es))-                                                    }()-                                           };-                              var outward = DOut;-                              var DLeft = {ctor: "DLeft"};-                              var left = DLeft;-                              var DIn = {ctor: "DIn"};-                              var inward = DIn;-                              var DDown = {ctor: "DDown"};-                              var above = F2(function (hi,lo)-                                             {-                                               return A3(newElement,-                                                         A2(Basics.max,widthOf(hi),widthOf(lo)),-                                                         heightOf(hi) + heightOf(lo),-                                                         A2(Flow,DDown,_J.toList([hi,lo])))-                                             });-                              var below = F2(function (lo,hi)-                                             {-                                               return A3(newElement,-                                                         A2(Basics.max,widthOf(hi),widthOf(lo)),-                                                         heightOf(hi) + heightOf(lo),-                                                         A2(Flow,DDown,_J.toList([hi,lo])))-                                             });-                              var down = DDown;-                              var flow = F2(function (dir,es)-                                            {-                                              return function ()-                                                     {-                                                       var ws = A2(List.map,widthOf,es);-                                                       var newFlow = F2(function (w,h)-                                                                        {-                                                                          return A3(newElement,-                                                                                    w,-                                                                                    h,-                                                                                    A2(Flow,dir,es))-                                                                        });-                                                       var hs = A2(List.map,heightOf,es);-                                                       return _N.eq(es,-                                                                    _J.toList([])) ? empty : function ()-                                                                                             {-                                                                                               switch (dir.ctor)-                                                                                               {case-                                                                                                "DDown" :-                                                                                                  return A2(newFlow,-                                                                                                            List.maximum(ws),-                                                                                                            List.sum(hs))-                                                                                                case-                                                                                                "DIn" :-                                                                                                  return A2(newFlow,-                                                                                                            List.maximum(ws),-                                                                                                            List.maximum(hs))-                                                                                                case-                                                                                                "DLeft" :-                                                                                                  return A2(newFlow,-                                                                                                            List.sum(ws),-                                                                                                            List.maximum(hs))-                                                                                                case-                                                                                                "DOut" :-                                                                                                  return A2(newFlow,-                                                                                                            List.maximum(ws),-                                                                                                            List.maximum(hs))-                                                                                                case-                                                                                                "DRight" :-                                                                                                  return A2(newFlow,-                                                                                                            List.sum(ws),-                                                                                                            List.maximum(hs))-                                                                                                case-                                                                                                "DUp" :-                                                                                                  return A2(newFlow,-                                                                                                            List.maximum(ws),-                                                                                                            List.sum(hs))}-                                                                                               _E.Case($moduleName,-                                                                                                       "between lines 206 and 216");-                                                                                             }()-                                                     }()-                                            });-                              var Custom = {ctor: "Custom"};-                              var Cropped = function (a)-                                            {-                                              return {ctor: "Cropped", _0: a}-                                            };-                              var croppedImage = F4(function (pos,w,h,src)-                                                    {-                                                      return A3(newElement,-                                                                w,-                                                                h,-                                                                A4(Image,-                                                                   Cropped(pos),-                                                                   w,-                                                                   h,-                                                                   JavaScript.fromString(src)))-                                                    });-                              var Container = F2(function (a,b)-                                                 {-                                                   return {ctor: "Container", _0: a, _1: b}-                                                 });-                              var container = F4(function (w,h,pos,e)-                                                 {-                                                   return A3(newElement,w,h,A2(Container,pos,e))-                                                 });-                              var Absolute = function (a)-                                             {-                                               return {ctor: "Absolute", _0: a}-                                             };-                              var absolute = Absolute;-                              var midLeft = _N.replace([["horizontal",N],["x",Absolute(0)]],-                                                       middle);-                              var midRight = _N.replace([["horizontal",P]],midLeft);-                              var midTop = _N.replace([["vertical",P],["y",Absolute(0)]],middle);-                              var midBottom = _N.replace([["vertical",N]],midTop);-                              var topLeft = {_: {}, horizontal: N, vertical: P, x: Absolute(0), y: Absolute(0)};-                              var bottomLeft = _N.replace([["vertical",N]],topLeft);-                              var bottomRight = _N.replace([["horizontal",P]],bottomLeft);-                              var topRight = _N.replace([["horizontal",P]],topLeft);-                              _elm.Graphics.Element.values = {_op: _op, empty: empty, widthOf: widthOf, heightOf: heightOf, sizeOf: sizeOf, width: width, height: height, size: size, opacity: opacity, color: color, tag: tag, link: link, emptyStr: emptyStr, newElement: newElement, image: image, fittedImage: fittedImage, croppedImage: croppedImage, tiledImage: tiledImage, container: container, spacer: spacer, flow: flow, above: above, below: below, beside: beside, layers: layers, absolute: absolute, relative: relative, middle: middle, topLeft: topLeft, topRight: topRight, bottomLeft: bottomLeft, bottomRight: bottomRight, midLeft: midLeft, midRight: midRight, midTop: midTop, midBottom: midBottom, middleAt: middleAt, topLeftAt: topLeftAt, topRightAt: topRightAt, bottomLeftAt: bottomLeftAt, bottomRightAt: bottomRightAt, midLeftAt: midLeftAt, midRightAt: midRightAt, midTopAt: midTopAt, midBottomAt: midBottomAt, up: up, down: down, left: left, right: right, inward: inward, outward: outward, Image: Image, Container: Container, Flow: Flow, Spacer: Spacer, RawHtml: RawHtml, Custom: Custom, Plain: Plain, Fitted: Fitted, Cropped: Cropped, Tiled: Tiled, P: P, Z: Z, N: N, Absolute: Absolute, Relative: Relative, DUp: DUp, DDown: DDown, DLeft: DLeft, DRight: DRight, DIn: DIn, DOut: DOut, Properties: Properties, Element: Element, Position: Position};-                              return _elm.Graphics.Element.values-                            };Elm.Graphics = Elm.Graphics || {};-Elm.Graphics.Input = Elm.Graphics.Input || {};-Elm.Graphics.Input.make = function (_elm)-                          {-                            _elm.Graphics = _elm.Graphics || {};-                            _elm.Graphics.Input = _elm.Graphics.Input || {};-                            if (_elm.Graphics.Input.values)-                            return _elm.Graphics.Input.values-                            var N = Elm.Native,-                                _N = N.Utils.make(_elm),-                                _L = N.List.make(_elm),-                                _E = N.Error.make(_elm),-                                _J = N.JavaScript.make(_elm),-                                $moduleName = "Graphics.Input";-                            var Basics = Elm.Basics.make(_elm);-                            var Signal = Elm.Signal.make(_elm);-                            var Native = Native || {};-                            Native.Graphics = Native.Graphics || {};-                            Native.Graphics.Input = Elm.Native.Graphics.Input.make(_elm);-                            var List = Elm.List.make(_elm);-                            var Graphics = Graphics || {};-                            Graphics.Element = Elm.Graphics.Element.make(_elm);-                            var Maybe = Elm.Maybe.make(_elm);-                            var JavaScript = Elm.JavaScript.make(_elm);-                            var _op = {};-                            var id = function (x)-                                     {-                                       return x-                                     };-                            var hoverables = Native.Graphics.Input.hoverables;-                            var hoverable = function (elem)-                                            {-                                              return function ()-                                                     {-                                                       var pool = hoverables(false);-                                                       return {ctor: "_Tuple2", _0: A2(pool.hoverable,-                                                                                       id,-                                                                                       elem), _1: pool.events}-                                                     }()-                                            };-                            var fields = Native.Graphics.Input.fields;-                            var emptyFieldState = {_: {}, selectionEnd: 0, selectionStart: 0, string: ""};-                            var field = function (placeHolder)-                                        {-                                          return function ()-                                                 {-                                                   var tfs = fields(emptyFieldState);-                                                   var changes = Signal.dropRepeats(tfs.events);-                                                   return {ctor: "_Tuple2", _0: A2(Signal.lift,-                                                                                   A2(tfs.field,-                                                                                      id,-                                                                                      placeHolder),-                                                                                   changes), _1: Signal.dropRepeats(A2(Signal.lift,-                                                                                                                       function (_)-                                                                                                                       {-                                                                                                                         return _.string-                                                                                                                       },-                                                                                                                       changes))}-                                                 }()-                                        };-                            var password = function (placeHolder)-                                           {-                                             return function ()-                                                    {-                                                      var tfs = Native.Graphics.Input.passwords(emptyFieldState);-                                                      var changes = Signal.dropRepeats(tfs.events);-                                                      return {ctor: "_Tuple2", _0: A2(Signal.lift,-                                                                                      A2(tfs.field,-                                                                                         id,-                                                                                         placeHolder),-                                                                                      changes), _1: Signal.dropRepeats(A2(Signal.lift,-                                                                                                                          function (_)-                                                                                                                          {-                                                                                                                            return _.string-                                                                                                                          },-                                                                                                                          changes))}-                                                    }()-                                           };-                            var email = function (placeHolder)-                                        {-                                          return function ()-                                                 {-                                                   var tfs = Native.Graphics.Input.emails(emptyFieldState);-                                                   var changes = Signal.dropRepeats(tfs.events);-                                                   return {ctor: "_Tuple2", _0: A2(Signal.lift,-                                                                                   A2(tfs.field,-                                                                                      id,-                                                                                      placeHolder),-                                                                                   changes), _1: Signal.dropRepeats(A2(Signal.lift,-                                                                                                                       function (_)-                                                                                                                       {-                                                                                                                         return _.string-                                                                                                                       },-                                                                                                                       changes))}-                                                 }()-                                        };-                            var dropDown = Native.Graphics.Input.dropDown;-                            var stringDropDown = function (strs)-                                                 {-                                                   return dropDown(A2(List.map,-                                                                      function (s)-                                                                      {-                                                                        return {ctor: "_Tuple2", _0: s, _1: s}-                                                                      },-                                                                      strs))-                                                 };-                            var customButtons = Native.Graphics.Input.customButtons;-                            var customButton = F3(function (up,hover,down)-                                                  {-                                                    return function ()-                                                           {-                                                             var pool = customButtons({ctor: "_Tuple0"});-                                                             return {ctor: "_Tuple2", _0: A4(pool.customButton,-                                                                                             {ctor: "_Tuple0"},-                                                                                             up,-                                                                                             hover,-                                                                                             down), _1: pool.events}-                                                           }()-                                                  });-                            var checkboxes = Native.Graphics.Input.checkboxes;-                            var checkbox = function (b)-                                           {-                                             return function ()-                                                    {-                                                      var cbs = checkboxes(b);-                                                      return {ctor: "_Tuple2", _0: A2(Signal.lift,-                                                                                      cbs.checkbox(id),-                                                                                      cbs.events), _1: cbs.events}-                                                    }()-                                           };-                            var buttons = Native.Graphics.Input.buttons;-                            var button = function (txt)-                                         {-                                           return function ()-                                                  {-                                                    var pool = buttons({ctor: "_Tuple0"});-                                                    return {ctor: "_Tuple2", _0: A2(pool.button,-                                                                                    {ctor: "_Tuple0"},-                                                                                    txt), _1: pool.events}-                                                  }()-                                         };-                            var FieldState = F3(function (a,b,c)-                                                {-                                                  return {_: {}, selectionEnd: c, selectionStart: b, string: a}-                                                });-                            _elm.Graphics.Input.values = {_op: _op, id: id, buttons: buttons, button: button, customButtons: customButtons, customButton: customButton, checkboxes: checkboxes, checkbox: checkbox, hoverables: hoverables, hoverable: hoverable, fields: fields, emptyFieldState: emptyFieldState, field: field, password: password, email: email, dropDown: dropDown, stringDropDown: stringDropDown, FieldState: FieldState};-                            return _elm.Graphics.Input.values-                          };Elm.JavaScript = Elm.JavaScript || {};-Elm.JavaScript.Experimental = Elm.JavaScript.Experimental || {};-Elm.JavaScript.Experimental.make = function (_elm)-                                   {-                                     _elm.JavaScript = _elm.JavaScript || {};-                                     _elm.JavaScript.Experimental = _elm.JavaScript.Experimental || {};-                                     if (_elm.JavaScript.Experimental.values)-                                     return _elm.JavaScript.Experimental.values-                                     var N = Elm.Native,-                                         _N = N.Utils.make(_elm),-                                         _L = N.List.make(_elm),-                                         _E = N.Error.make(_elm),-                                         _J = N.JavaScript.make(_elm),-                                         $moduleName = "JavaScript.Experimental";-                                     var JavaScript = Elm.JavaScript.make(_elm);-                                     var Native = Native || {};-                                     Native.JavaScript = Elm.Native.JavaScript.make(_elm);-                                     var _op = {};-                                     var toRecord = Native.JavaScript.toRecord;-                                     var fromRecord = Native.JavaScript.fromRecord;-                                     _elm.JavaScript.Experimental.values = {_op: _op, toRecord: toRecord, fromRecord: fromRecord};-                                     return _elm.JavaScript.Experimental.values-                                   };(function() {--// Returns boolean indicating if the swap was successful.-// Requires that the two signal graphs have exactly the same-// structure.-ElmRuntime.swap = function(from, to) {-    function similar(nodeOld,nodeNew) {-        idOkay = nodeOld.id === nodeNew.id;-        lengthOkay = nodeOld.kids.length === nodeNew.kids.length;-        return idOkay && lengthOkay;-    }-    function swap(nodeOld,nodeNew) {-        nodeNew.value = nodeOld.value;-        return true;-    }-    var canSwap = depthFirstTraversals(similar, from.inputs, to.inputs);-    if (canSwap) { depthFirstTraversals(swap, from.inputs, to.inputs); }-    from.node.parentNode.replaceChild(to.node, from.node);-    return canSwap;-}--// Returns false if the node operation f ever fails.-function depthFirstTraversals(f, queueOld, queueNew) {-    if (queueOld.length !== queueNew.length) return false;-    queueOld = queueOld.slice(0);-    queueNew = queueNew.slice(0);--    var seen = [];-    while (queueOld.length > 0 && queueNew.length > 0) {-        var nodeOld = queueOld.pop();-        var nodeNew = queueNew.pop();-        if (seen.indexOf(nodeOld.id) < 0) {-            if (!f(nodeOld, nodeNew)) return false;-            queueOld = queueOld.concat(nodeOld.kids);-            queueNew = queueNew.concat(nodeNew.kids);-            seen.push(nodeOld.id);-        }-    }-    return true;-}--}());--(function() {-'use strict';--Elm.fullscreen = function(module) {-    var style = document.createElement('style');-    style.type = 'text/css';-    style.innerHTML = "html,head,body { padding:0; margin:0; }" +-        "body { font-family: calibri, helvetica, arial, sans-serif; }";-    document.head.appendChild(style);-    var container = document.createElement('div');-    document.body.appendChild(container);-    return init(ElmRuntime.Display.FULLSCREEN, container, module);-};--Elm.embed = function(module, container) {-    var tag = container.tagName;-    if (tag !== 'DIV') {-        throw new Error('Elm.node must be given a DIV, not a ' + tag + '.');-    } else if (container.hasChildNodes()) {-        throw new Error('Elm.node must be given an empty DIV. No children allowed!');-    }-    return init(ElmRuntime.Display.COMPONENT, container, module);-};--Elm.worker = function(module) {-    return init(ElmRuntime.Display.NONE, {}, module);-};--function init(display, container, module, moduleToReplace) {-  // defining state needed for an instance of the Elm RTS-  var inputs = [];--  var updateInProgress = false;-  function notify(id, v) {-      if (updateInProgress) {-          throw new Error(-              'The notify function has been called synchronously!\n' +-              'This can lead to frames being dropped.\n' +-              'Definitely report this to <https://github.com/evancz/Elm/issues>\n');-      }-      updateInProgress = true;-      var timestep = Date.now();-      for (var i = inputs.length; i--; ) {-          inputs[i].recv(timestep, id, v);-      }-      updateInProgress = false;-  }--  var listeners = [];-  function addListener(relevantInputs, domNode, eventName, func) {-      domNode.addEventListener(eventName, func);-      var listener = {-          relevantInputs: relevantInputs,-          domNode: domNode,-          eventName: eventName,-          func: func-      };-      listeners.push(listener);-  }--  // create the actual RTS. Any impure modules will attach themselves to this-  // object. This permits many Elm programs to be embedded per document.-  var elm = {-      notify:notify,-      node:container,-      display:display,-      id:ElmRuntime.guid(),-      addListener:addListener,-      inputs:inputs-  };--  // Set up methods to communicate with Elm program from JS.-  function send(name, value) {-      if (typeof value === 'undefined') return function(v) { return send(name,v); };-      var e = document.createEvent('Event');-      e.initEvent(name + '_' + elm.id, true, true);-      e.value = value;-      document.dispatchEvent(e);-  }-  function recv(name, handler) {-      document.addEventListener(name + '_' + elm.id, handler);-  }--  recv('log', function(e) {console.log(e.value)});-  recv('title', function(e) {document.title = e.value});-  recv('redirect', function(e) {-    if (e.value.length > 0) { window.location = e.value; }-  });--  function swap(newModule) {-      removeListeners(listeners);-      var div = document.createElement('div');-      var newElm = init(display, div, newModule, elm);-      inputs = [];-      // elm.send = newElm.send;-      // elm.recv = newElm.recv;-      // elm.swap = newElm.swap;-      return newElm;-  }--  var Module = {};-  var reportAnyErrors = function() {};-  try {-      Module = module.make(elm);-  } catch(e) {-      var directions = "<br/>&nbsp; &nbsp; Open the developer console for more details."-      Module.main = Elm.Text.make(elm).text('<code>' + e.message + directions + '</code>');-      reportAnyErrors = function() { throw e; }-  }-  inputs = ElmRuntime.filterDeadInputs(inputs);-  filterListeners(inputs, listeners);-  if (display !== ElmRuntime.Display.NONE) {-      var graphicsNode = initGraphics(elm, Module);-  }-  if (typeof moduleToReplace !== 'undefined') {-      ElmRuntime.swap(moduleToReplace, elm);--      // rerender scene if graphics are enabled.-      if (typeof graphicsNode !== 'undefined') {-          graphicsNode.recv(0, true, 0);-      }-  }--  reportAnyErrors();-  return { send:send, recv:recv, swap:swap };-};--function filterListeners(inputs, listeners) {-    loop:-    for (var i = listeners.length; i--; ) {-        var listener = listeners[i];-        for (var j = inputs.length; j--; ) {-            if (listener.relevantInputs.indexOf(inputs[j].id) >= 0) {-                continue loop;-            }-        }-        listener.domNode.removeEventListener(listener.eventName, listener.func);-    }-}--function removeListeners(listeners) {-    for (var i = listeners.length; i--; ) {-        var listener = listeners[i];-        listener.domNode.removeEventListener(listener.eventName, listener.func);-    }-}--function initGraphics(elm, Module) {-  if (!('main' in Module))-      throw new Error("'main' is missing! What do I display?!");--  var signalGraph = Module.main;--  // make sure the signal graph is actually a signal & extract the visual model-  var Signal = Elm.Signal.make(elm);-  if (!('recv' in signalGraph)) {-      signalGraph = Signal.constant(signalGraph);-  }-  var currentScene = signalGraph.value;-- // Add the currentScene to the DOM-  var Render = ElmRuntime.use(ElmRuntime.Render.Element);-  elm.node.appendChild(Render.render(currentScene));--  // set up updates so that the DOM is adjusted as necessary.-  function domUpdate(newScene, currentScene) {-      ElmRuntime.draw(function(_) {-          Render.update(elm.node.firstChild, currentScene, newScene);-          if (elm.Native.Window) elm.Native.Window.values.resizeIfNeeded();-      });-      return newScene;-  }-  var renderer = A3(Signal.foldp, F2(domUpdate), currentScene, signalGraph);--  // must check for resize after 'renderer' is created so-  // that changes show up.-  if (elm.Native.Window) elm.Native.Window.values.resizeIfNeeded();--  return renderer;-}--}());--(function() {-'use strict';--ElmRuntime.Display = { FULLSCREEN: 0, COMPONENT: 1, NONE: 2 };--ElmRuntime.counter = 0;-ElmRuntime.guid = function() { return ElmRuntime.counter++; }--ElmRuntime.use = function(M) {-    if (typeof M === 'function') M = M();-    return M;-};--function isAlive(input) {-    if (!('defaultNumberOfKids' in input)) return true;-    var len = input.kids.length;-    if (len === 0) return false;-    if (len > input.defaultNumberOfKids) return true;-    var alive = false;-    for (var i = len; i--; ) {-        alive = alive || isAlive(input.kids[i]);-    }-    return alive;-}--ElmRuntime.filterDeadInputs = function(inputs) {-    var temp = [];-    for (var i = inputs.length; i--; ) {-        if (isAlive(inputs[i])) temp.push(inputs[i]);-    }-    return temp;-};--// define the draw function-var vendors = ['ms', 'moz', 'webkit', 'o'];-var window = window || {};-for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {-    window.requestAnimationFrame = window[vendors[i]+'RequestAnimationFrame'];-    window.cancelAnimationFrame  = window[vendors[i]+'CancelAnimationFrame'] ||-                                   window[vendors[i]+'CancelRequestAnimationFrame'];-}--if (window.requestAnimationFrame && window.cancelAnimationFrame) {-    var previous = 0;-    ElmRuntime.draw = function(callback) {-        window.cancelAnimationFrame(previous);-        previous = window.requestAnimationFrame(callback);-    };-} else {-    ElmRuntime.draw = function(callback) { callback(); };-}--}());--ElmRuntime.Render.Collage = function() {--var Render = ElmRuntime.use(ElmRuntime.Render.Element);-var Transform = Elm.Transform2D.make({});-var Utils = ElmRuntime.use(ElmRuntime.Render.Utils);-var newElement = Utils.newElement,-    extract = Utils.extract, fromList = Utils.fromList,-    fromString = Utils.fromString, addTransform = Utils.addTransform;--function trace(ctx, path) {-    var points = fromList(path);-    var i = points.length - 1;-    if (i <= 0) return;-    ctx.moveTo(points[i]._0, points[i]._1);-    while (i--) { ctx.lineTo(points[i]._0, points[i]._1); }-    if (path.closed) {-        i = points.length - 1;-        ctx.lineTo(points[i]._0, points[i]._1);-    }-}--function line(ctx,style,path) {-    style.dashing.ctor === 'Nil' ? trace(ctx, path) : customLineHelp(ctx, style, path);-    ctx.scale(1,-1);-    ctx.stroke();-}--function customLineHelp(ctx, style, path) {-    var points = fromList(path);-    if (path.closed) points.push(points[0]);-    var pattern = fromList(style.dashing);-    var i = points.length - 1;-    if (i <= 0) return;-    var x0 = points[i]._0, y0 = points[i]._1;-    var x1=0, y1=0, dx=0, dy=0, remaining=0, nx=0, ny=0;-    var pindex = 0, plen = pattern.length;-    var draw = true, segmentLength = pattern[0];-    ctx.moveTo(x0,y0);-    while (i--) {-        x1 = points[i]._0; y1 = points[i]._1;-        dx = x1 - x0; dy = y1 - y0;-        remaining = Math.sqrt(dx * dx + dy * dy);-        while (segmentLength <= remaining) {-            x0 += dx * segmentLength / remaining;-            y0 += dy * segmentLength / remaining;-            ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);-            // update starting position-            dx = x1 - x0; dy = y1 - y0;-            remaining = Math.sqrt(dx * dx + dy * dy);-            // update pattern-            draw = !draw;-            pindex = (pindex + 1) % plen;-            segmentLength = pattern[pindex];-        }-        if (remaining > 0) {-            ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);-            segmentLength -= remaining;-        }-        x0 = x1; y0 = y1;-    }-}--function drawLine(ctx, style, path) {-    ctx.lineWidth = style.width;-    var cap = style.cap.ctor;-    ctx.lineCap = cap === 'Flat' ? 'butt' :-                  cap === 'Round' ? 'round' : 'square';-    var join = style.join.ctor;-    ctx.lineJoin = join === 'Smooth' ? 'round' :-                   join === 'Sharp' ? 'miter' : 'bevel';-    ctx.miterLimit = style.join._0 || 10;-    ctx.strokeStyle = extract(style.color);-    return line(ctx, style, path);-}--function texture(redo, ctx, src) {-    var img = new Image();-    img.src = fromString(src);-    img.onload = redo;-    return ctx.createPattern(img, 'repeat');-}--function gradient(ctx, grad) {-  var g;-  var stops = [];-  if (grad.ctor === 'Linear') {-    var p0 = grad._0, p1 = grad._1;-    g = ctx.createLinearGradient(p0._0, -p0._1, p1._0, -p1._1);-    stops = fromList(grad._2);-  } else {-    var p0 = grad._0, p2 = grad._2;-    g = ctx.createRadialGradient(p0._0, -p0._1, grad._1, p2._0, -p2._1, grad._3);-    stops = fromList(grad._4);-  }-  var len = stops.length;-  for (var i = 0; i < len; ++i) {-    var stop = stops[i];-    g.addColorStop(stop._0, extract(stop._1));-  }-  return g;-}--function drawShape(redo, ctx, style, path) {-    trace(ctx, path);-    var sty = style.ctor;-    ctx.fillStyle =-        sty === 'Solid' ? extract(style._0) :-        sty === 'Texture' ? texture(redo, ctx, style._0) : gradient(ctx, style._0);-    ctx.scale(1,-1);-    ctx.fill();-}--function drawImage(redo, ctx, form) {-    var img = new Image();-    img.onload = redo;-    img.src = fromString(form._3);-    var w = form._0,-        h = form._1,-        pos = form._2,-        srcX = pos._0,-        srcY = pos._1,-        srcW = w,-        srcH = h,-        destX = -w/2,-        destY = -h/2,-        destW = w,-        destH = h;--    ctx.scale(1,-1);-    ctx.drawImage(img, srcX, srcY, srcW, srcH, destX, destY, destW, destH);-}--function renderForm(redo, ctx, form) {-    ctx.save();-    var x = form.x, y = form.y, theta = form.theta, scale = form.scale;-    if (x !== 0 || y !== 0) ctx.translate(x, y);-    if (theta !== 0) ctx.rotate(theta);-    if (scale !== 1) ctx.scale(scale,scale);-    if (form.alpha !== 1) ctx.globalAlpha = ctx.globalAlpha * form.alpha;-    ctx.beginPath();-    var f = form.form;-    switch(f.ctor) {-    case 'FPath' : drawLine(ctx, f._0, f._1); break;-    case 'FImage': drawImage(redo, ctx, f); break;-    case 'FShape':-      if (f._0.ctor === 'Left') {-        f._1.closed = true;-        drawLine(ctx, f._0._0, f._1);-      } else {-        drawShape(redo, ctx, f._0._0, f._1);-      }-    break;-    }-    ctx.restore();-}--function formToMatrix(form) {-   var scale = form.scale;-   var matrix = A6( Transform.matrix, scale, 0, 0, scale, form.x, form.y );--   var theta = form.theta-   if (theta !== 0)-       matrix = A2( Transform.multiply, matrix, Transform.rotation(theta) );--   return matrix;-}--function str(n) {-    if (n < 0.00001 && n > -0.00001) return 0;-    return n;-}--function makeTransform(w, h, form, matrices) {-    var props = form.form._0.props;-    var m = A6( Transform.matrix, 1, 0, 0, -1,-                (w - props.width ) / 2,-                (h - props.height) / 2 );-    var len = matrices.length;-    for (var i = 0; i < len; ++i) { m = A2( Transform.multiply, m, matrices[i] ); }-    m = A2( Transform.multiply, m, formToMatrix(form) );--    return 'matrix(' + str( m[0]) + ', ' + str( m[3]) + ', ' +-                       str(-m[1]) + ', ' + str(-m[4]) + ', ' +-                       str( m[2]) + ', ' + str( m[5]) + ')';-}--function stepperHelp(list) {-    var arr = fromList(list);-    var i = 0;-    function peekNext() {-        return i < arr.length ? arr[i].form.ctor : '';-    }-    // assumes that there is a next element-    function next() {-        var out = arr[i];-        ++i;-        return out;-    }-    return { peekNext:peekNext, next:next };-}--function formStepper(forms) {-    var ps = [stepperHelp(forms)];-    var matrices = [];-    var alphas = [];-    function peekNext() {-        var len = ps.length;-        var formType = '';-        for (var i = 0; i < len; ++i ) {-            if (formType = ps[i].peekNext()) return formType;-        }-        return '';-    }-    // assumes that there is a next element-    function next(ctx) {-        while (!ps[0].peekNext()) {-            ps.shift();-            matrices.pop();-            alphas.shift();-            if (ctx) { ctx.restore(); }-        }-        var out = ps[0].next();-        var f = out.form;-        if (f.ctor === 'FGroup') {-            ps.unshift(stepperHelp(f._1));-            var m = A2(Transform.multiply, f._0, formToMatrix(out));-            ctx.save();-            ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);-            matrices.push(m);--            var alpha = (alphas[0] || 1) * out.alpha;-            alphas.unshift(alpha);-            ctx.globalAlpha = alpha;-        }-        return out;-    }-    function transforms() { return matrices; }-    function alpha() { return alphas[0] || 1; }-    return { peekNext:peekNext, next:next, transforms:transforms, alpha:alpha };-}--function makeCanvas(w,h) {-    var canvas = newElement('canvas');-    canvas.style.width  = w + 'px';-    canvas.style.height = h + 'px';-    canvas.style.display = "block";-    canvas.style.position = "absolute";-    canvas.width  = w;-    canvas.height = h;-    return canvas;-}--function render(model) {-    var div = newElement('div');-    div.style.overflow = 'hidden';-    update(div, model, model);-    return div;-}--function nodeStepper(w,h,div) {-    var kids = div.childNodes;-    var i = 0;-    function transform(transforms, ctx) {-        ctx.translate(w/2, h/2);-        ctx.scale(1,-1);-        var len = transforms.length;-        for (var i = 0; i < len; ++i) {-            var m = transforms[i];-            ctx.save();-            ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);-        }-        return ctx;-    }-    function nextContext(transforms) {-        while (i < kids.length) {-            var node = kids[i];-            if (node.getContext) {-                node.width = w;-                node.height = h;-                node.style.width = w + 'px';-                node.style.height = h + 'px';-                ++i;-                return transform(transforms, node.getContext('2d'));-            }-            div.removeChild(node);-        }-        var canvas = makeCanvas(w,h);-        div.appendChild(canvas);-        // we have added a new node, so we must step our position-        ++i;-        return transform(transforms, canvas.getContext('2d'));-    }-    function addElement(matrices, alpha, form) {-        var kid = kids[i];-        var elem = form.form._0;--        var node = (!kid || kid.getContext)-            ? Render.render(elem)-            : (Render.update(kid, kid.oldElement, elem), kids[i]);--        node.style.position = 'absolute';-        node.style.opacity = alpha * form.alpha;-        addTransform(node.style, makeTransform(w, h, form, matrices));-        node.oldElement = elem;-        ++i;-        if (!kid) {-            div.appendChild(node);-        } else if (kid.getContext) {-            div.insertBefore(node, kid);-        }-    }-    function clearRest() {-        while (i < kids.length) {-            div.removeChild(kids[i]);-        }-    }-    return { nextContext:nextContext, addElement:addElement, clearRest:clearRest };-}---function update(div, _, model) {-    var w = model.w;-    var h = model.h;--    var forms = formStepper(model.forms);-    var nodes = nodeStepper(w,h,div);-    var ctx = null;-    var formType = '';--    while (formType = forms.peekNext()) {-        // make sure we have context if we need it-        if (ctx === null && formType !== 'FElement') {-            ctx = nodes.nextContext(forms.transforms());-            ctx.globalAlpha = forms.alpha();-        }--        var form = forms.next(ctx);-        // if it is FGroup, all updates are made within formStepper when next is called.-        if (formType === 'FElement') {-            // update or insert an element, get a new context-            nodes.addElement(forms.transforms(), forms.alpha(), form);-            ctx = null;-        } else if (formType !== 'FGroup') {-            renderForm(function() { update(div, model, model); }, ctx, form);-        }-    }-    nodes.clearRest();-    return false;-}--return { render:render, update:update };--};--ElmRuntime.Render.Element = function() {-'use strict';--var Utils = ElmRuntime.use(ElmRuntime.Render.Utils);-var newElement = Utils.newElement, extract = Utils.extract,-    addTransform = Utils.addTransform, removeTransform = Utils.removeTransform,-    fromList = Utils.fromList, eq = Utils.eq;--function setProps(props, e) {-    e.style.width  = (props.width |0) + 'px';-    e.style.height = (props.height|0) + 'px';-    if (props.opacity !== 1) { e.style.opacity = props.opacity; }-    if (props.color.ctor === 'Just') {-        e.style.backgroundColor = extract(props.color._0);-    }-    if (props.tag !== '') { e.id = props.tag; }-    if (props.href !== '') {-        var a = newElement('a');-        a.href = props.href;-        a.style.width = '100%';-        a.style.height = '100%';-        a.style.top = 0;-        a.style.left = 0;-        a.style.display = 'block';-        a.style.position = 'absolute';-        e.style.position = 'relative';-        e.appendChild(a);-    }-    if (props.hover.ctor !== '_Tuple0') {-        var overCount = 0;-        e.addEventListener('mouseover', function() {-            if (overCount++ > 0) return;-            props.hover(true);-        });-        e.addEventListener('mouseout', function(evt) {-            if (e.contains(evt.toElement || evt.relatedTarget)) return;-            overCount = 0;-            props.hover(false);-        });-    }-    return e;-}--function image(props, img) {-    switch (img._0.ctor) {-    case 'Plain':   return plainImage(img._3);-    case 'Fitted':  return fittedImage(props.width, props.height, img._3);-    case 'Cropped': return croppedImage(img,props.width,props.height,img._3);-    case 'Tiled':   return tiledImage(img._3);-    }-}--function plainImage(src) {-    var img = newElement('img');-    img.src = src;-    img.name = src;-    img.style.display = "block";-    return img;-}--function tiledImage(src) {-    var div = newElement('div');-    div.style.backgroundImage = 'url(' + src + ')';-    return div;-}--function fittedImage(w, h, src) {-    var div = newElement('div');-    div.style.background = 'url(' + src + ') no-repeat center';-    div.style.webkitBackgroundSize = 'cover';-    div.style.MozBackgroundSize = 'cover';-    div.style.OBackgroundSize = 'cover';-    div.style.backgroundSize = 'cover';-    return div;-}--function croppedImage(elem, w, h, src) {-    var pos = elem._0._0;-    var e = newElement('div');-    e.style.overflow = "hidden";--    var img = newElement('img');-    img.onload = function() {-        var sw = w / elem._1, sh = h / elem._2;-        img.style.width = ((this.width * sw)|0) + 'px';-        img.style.height = ((this.height * sh)|0) + 'px';-        img.style.marginLeft = ((- pos._0 * sw)|0) + 'px';-        img.style.marginTop = ((- pos._1 * sh)|0) + 'px';-    };-    img.src = src;-    img.name = src;-    e.appendChild(img);-    return e;-}--function goIn(e) { e.style.position = 'absolute'; return e; }-function goDown(e) { return e }-function goRight(e) { e.style.styleFloat = e.style.cssFloat = "left"; return e; }-function flowWith(f, array) {-    var container = newElement('div');-    for (var i = array.length; i--; ) {-        container.appendChild(f(render(array[i])));-    }-    return container;-}--function flow(dir,elist) {-    var array = fromList(elist);-    switch(dir.ctor) {-    case "DDown":  array.reverse();-    case "DUp":    return flowWith(goDown,array);-    case "DRight": array.reverse();-    case "DLeft":  return flowWith(goRight,array);-    case "DOut":   array.reverse();-    case "DIn":    return flowWith(goIn,array);-    }-}--function toPos(pos) {-    switch(pos.ctor) {-    case "Absolute": return  pos._0 + "px";-    case "Relative": return (pos._0 * 100) + "%";-    }-}--// must clear right, left, top, bottom, and transform-// before calling this function-function setPos(pos,w,h,e) {-    e.style.position = 'absolute';-    e.style.margin = 'auto';-    var transform = '';-    switch(pos.horizontal.ctor) {-    case 'P': e.style.right = toPos(pos.x); e.style.removeProperty('left'); break;-    case 'Z': transform = 'translateX(' + ((-w/2)|0) + 'px) ';-    case 'N': e.style.left = toPos(pos.x); e.style.removeProperty('right'); break;-    }-    switch(pos.vertical.ctor) {-    case 'N': e.style.bottom = toPos(pos.y); e.style.removeProperty('top'); break;-    case 'Z': transform += 'translateY(' + ((-h/2)|0) + 'px)';-    case 'P': e.style.top = toPos(pos.y); e.style.removeProperty('bottom'); break;-    }-    if (transform !== '') addTransform(e.style, transform);-    return e;-}--function container(pos,elem) {-    var e = render(elem);-    setPos(pos, elem.props.width, elem.props.height, e);-    var div = newElement('div');-    div.style.position = 'relative';-    div.style.overflow = 'hidden';-    div.appendChild(e);-    return div;-}--function rawHtml(elem) {-    var html = elem.html;-    var args = elem.args;-    var guid = elem.guid;--    var div = newElement('div');-    div.innerHTML = html;-    div.style.visibility = "hidden";+      if (type === 'number' || type === 'boolean' || type === 'string') return v;+      if (type === 'object' && '_' in v) {+          var obj = {};+          for (var k in v) {+              var x = toJS(v[k]);+              if (x !== null) obj[k] = x;+          }+          return obj;+      }+      if (type === 'object' && (v.ctor === '::' || v.ctor === '[]')) {+          var array = List.toArray(v);+          for (var i = array.length; i--; ) {+              array[i] = toJS(array[i]);+          }+          return array;+      }+      return null;+  }++  function fromRecord(r) {+      if (typeof r === 'object' && '_' in r) {+          return toJS(r);+      }+      throw new Error("'fromRecord' must be called on a record.");+  }++  function id(n) { return n; }++  function toElement(w,h,domNode) {+      return A3( newElement, w, h, {+              ctor: 'Custom',+              type: 'DomNode',+              render: function(node) { return node; },+              update: function(node,oldNode,newNode) {+                  if (node === newNode) return;+                  node.parentNode.replaceChild(newNode, node);+              },+              model: domNode+          });+  }++  function fromElement(element) {+      return Render.render(element);+  }++  return elm.Native.JavaScript.values = {+      toInt      : function(n) { return n|0; },+      toFloat    : function(n) { return +n; },+      toBool     : id,+      toString   : id,+      toList     : List.fromArray,+      fromString : id,+      fromList   : List.toArray,+      fromInt    : id,+      fromFloat  : id,+      fromBool   : id,++      toElement   : toElement,+      fromElement : fromElement,+      toRecord    : fromJS,+      fromRecord  : fromRecord+  };++};+Elm.Native.Json = {};+Elm.Native.Json.make = function(elm) {++  elm.Native = elm.Native || {};+  elm.Native.Json = elm.Native.Json || {};+  if (elm.Native.Json.values) return elm.Native.Json.values;++  var Maybe = Elm.Maybe.make(elm);+  var Dict = Elm.Dict.make(elm);+  var List = Elm.List.make(elm);+  var JS = Elm.JavaScript.make(elm);+  var Utils = Elm.Native.Utils.make(elm);++  function fromValue(v) {+    switch (v.ctor) {+    case 'Null'   : return null;+    case 'String' : return JS.fromString(v._0);+    case 'Object' :+      var obj = {};+      var array = JS.fromList(Dict.toList(v._0));+      for (var i = array.length; i--; ) {+	obj[JS.fromString(array[i]._0)] = fromValue(array[i]._1);+      }+      return obj;+    case 'Array'  :+      var array = JS.fromList(v._0);+      for (var i = array.length; i--; ) {+	array[i] = fromValue(array[i]);+      }+      return array;+    default :+      return v._0;+    }+  }++  function toPrettyJSString(sep, obj) {+    return JSON.stringify(fromValue(obj), null, JS.fromString(sep));+  }++  function toValue(v) {+    switch (typeof v) {+    case 'string' : return { ctor:"String", _0: JS.toString(v) };+    case 'number' : return { ctor:"Number", _0: JS.toFloat(v)  };+    case 'boolean': return { ctor:"Boolean"  , _0: JS.toBool(v)   };+    case 'object' :+      if (v === null) return { ctor:"Null" };+      if (v instanceof Array) {+          for (var i = v.length; i--; ) { v[i] = toValue(v[i]); }+	  return { ctor:"Array", _0: JS.toList(v) };+      }+      var array = [];+      for (var k in v) array.push(Utils.Tuple2(JS.toString(k), toValue(v[k])));+      return { ctor:"Object", _0: Dict.fromList(JS.toList(array)) };+    }+  }++  function fromJSString(str) {+    try {+	return Maybe.Just(toValue(JSON.parse(str)));+    } catch (e) {+	return Maybe.Nothing;+    }+  }++  return elm.Native.Json.values = {+      toJSString : F2(toPrettyJSString),+      fromJSString : fromJSString,+      toJSObject : fromValue,+      fromJSObject : toValue+  };++};+Elm.Native.List = {};+Elm.Native.List.make = function(elm) {+    elm.Native = elm.Native || {};+    elm.Native.List = elm.Native.List || {};+    if (elm.Native.List.values) return elm.Native.List.values;+    if ('values' in Elm.Native.List)+        return elm.Native.List.values = Elm.Native.List.values;++    var Utils = Elm.Native.Utils.make(elm);++    // TODO: Improve Nil handling+    // We can change places like:  if (xs.ctor === '[]') ... to if (xs === Nil) ...+    // but only if we're confident Nil can only be defined once.+    // Currently (27Mar2013) each module can have different instantiations, so multiple Nil objects can exist+    // (and if they're used interchangeably then direct object comparison fails where ctor doesn't).+    // So, this can only be fixed when modules initialisation is also fixed.+    // The performance overhead of the .ctor calls is 5-10% according to jsperf (depending on fn + list size)+    // (on firefox 19)++    var Nil = { ctor:'[]' };++    // using freeze for every cons would be nice but is a huge (9x on firefox 19)+    // performance penalty+    function Cons(hd,tl) { return { ctor:"::", _0:hd, _1:tl }; }++    function throwError(f) {+        throw new Error("Function '" + f + "' expects a non-empty list!");+    }++    function toArray(xs) {+        var out = [];+        while (xs.ctor !== '[]') {+            out.push(xs._0);+            xs = xs._1;+        }+        return out;+    }++    function fromArray(arr) {+        var out = Nil;+        for (var i = arr.length; i--; ) {+            out = Cons(arr[i], out);+        }+        return out;+    }++    function range(lo,hi) {+        var lst = Nil;+        if (lo <= hi) {+            do { lst = Cons(hi,lst) } while (hi-->lo);+        }+        return lst+    }++    function append(xs,ys) {+        // append Text+        if (xs.text || ys.text) {+            return Utils.txt(Utils.makeText(xs) + Utils.makeText(ys));+        }++        // append Strings+        if (typeof xs === "string") return xs + ys;++        // append Lists+        if (xs.ctor === '[]') { return ys; }+        var root = Cons(xs._0, Nil);+        var curr = root;+        xs = xs._1;+        while (xs.ctor !== '[]') {+	    curr._1 = Cons(xs._0, Nil);+	    xs = xs._1;+	    curr = curr._1;+        }+        curr._1 = ys;+        return root;+    }++    function head(v) { return v.ctor === '[]' ? throwError('head') : v._0; }+    function tail(v) { return v.ctor === '[]' ? throwError('tail') : v._1; }++    function last(xs) {+        if (xs.ctor === '[]') { throwError('last'); }+        var out = xs._0;+        while (xs.ctor !== '[]') {+            out = xs._0;+            xs = xs._1;+        }+        return out;+    }++    function map(f, xs) {+        var arr = [];+        while (xs.ctor !== '[]') {+            arr.push(f(xs._0));+            xs = xs._1;+        }+        return fromArray(arr);+    }++    // f defined similarly for both foldl and foldr (NB: different from Haskell)+    // ie, foldl : (a -> b -> b) -> b -> [a] -> b+    function foldl(f, b, xs) {+        var acc = b;+        while (xs.ctor !== '[]') {+            acc = A2(f, xs._0, acc);+            xs = xs._1;+        }+        return acc;+    }++    function foldr(f, b, xs) {+        var arr = toArray(xs);+        var acc = b;+        for (var i = arr.length; i--; ) {+            acc = A2(f, arr[i], acc);+        }+        return acc;+    }++    function foldl1(f, xs) {+        return xs.ctor === '[]' ? throwError('foldl1') : foldl(f, xs._0, xs._1);+    }++    function foldr1(f, xs) {+        if (xs.ctor === '[]') { throwError('foldr1'); }+        var arr = toArray(xs);+        var acc = arr.pop();+        for (var i = arr.length; i--; ) {+            acc = A2(f, arr[i], acc);+        }+        return acc;+    }++    function scanl(f, b, xs) {+        var arr = toArray(xs);+        arr.unshift(b);+        var len = arr.length;+        for (var i = 1; i < len; ++i) {+            arr[i] = A2(f, arr[i], arr[i-1]);+        }+        return fromArray(arr);+    }++    function scanl1(f, xs) {+        return xs.ctor === '[]' ? throwError('scanl1') : scanl(f, xs._0, xs._1);+    }++    function filter(pred, xs) {+        var arr = [];+        while (xs.ctor !== '[]') {+            if (pred(xs._0)) { arr.push(xs._0); }+            xs = xs._1;+        }+        return fromArray(arr);+    }++    function length(xs) {+        var out = 0;+        while (xs.ctor !== '[]') {+            out += 1;+            xs = xs._1;+        }+        return out;+    }++    function member(x, xs) {+        while (xs.ctor !== '[]') {+            if (Utils.eq(x,xs._0)) return true;+            xs = xs._1;+        }+        return false;+    }++    function reverse(xs) { return fromArray(toArray(xs).reverse()); }++    function concat(xss) {+        if (xss.ctor === '[]') return xss;+        var arr = toArray(xss);+        var xs = arr[arr.length-1];+        for (var i = arr.length-1; i--; ) {+	    xs = append(arr[i], xs);+        }+        return xs;+    }++    function all(pred, xs) {+        while (xs.ctor !== '[]') {+            if (!pred(xs._0)) return false;+            xs = xs._1;+        }+        return true;+    }++    function any(pred, xs) {+        while (xs.ctor !== '[]') {+            if (pred(xs._0)) return true;+            xs = xs._1;+        }+        return false;+    }++    function zipWith(f, xs, ys) {+        var arr = [];+        while (xs.ctor !== '[]' && ys.ctor !== '[]') {+            arr.push(A2(f, xs._0, ys._0));+            xs = xs._1;+            ys = ys._1;+        }+        return fromArray(arr);+    }++    function zip(xs, ys) {+        var arr = [];+        while (xs.ctor !== '[]' && ys.ctor !== '[]') {+            arr.push(Utils.Tuple2(xs._0, ys._0));+            xs = xs._1;+            ys = ys._1;+        }+        return fromArray(arr);+    }++    function sort(xs) {+        return fromArray(toArray(xs).sort(Utils.cmp));+    }++    function sortBy(f, xs) {+        return fromArray(toArray(xs).sort(function(a,b){+            return Utils.cmp(f(a), f(b));+        }));+    }++    function sortWith(f, xs) {+        return fromArray(toArray(xs).sort(function(a,b){+            var ord = f(a)(b).ctor;+            return ord === 'EQ' ? 0 : ord === 'LT' ? -1 : 1;+        }));+    }++    function nth(xs, n) {+        return toArray(xs)[n];+    }++    function take(n, xs) {+        var arr = [];+        while (xs.ctor !== '[]' && n > 0) {+            arr.push(xs._0);+            xs = xs._1;+            --n;+        }+        return fromArray(arr);+    }++    function drop(n, xs) {+        while (xs.ctor !== '[]' && n > 0) {+            xs = xs._1;+            --n;+        }+        return xs;+    }++    function repeat(n, x) {+        var arr = [];+        var pattern = [x];+        while (n > 0) {+            if (n & 1) arr = arr.concat(pattern);+            n >>= 1, pattern = pattern.concat(pattern);+        }+        return fromArray(arr);+    }++    function join(sep, xss) {+        if (sep.text) {+            sep = Utils.makeText(sep);+            xss = toArray(xss);+            for (var i = xss.length; i--; ) {+                xss[i] = Utils.makeText(xss[i]);+            }+            return Utils.txt(xss.join(sep));+        }+        if (typeof sep === 'string') return toArray(xss).join(sep);+        if (xss.ctor === '[]') return Nil;+        var s = toArray(sep);+        var out = toArray(xss._0);+        xss = xss._1;+        while (xss.ctor !== '[]') {+            out = out.concat(s, toArray(xss._0));+            xss = xss._1;+        }+        return fromArray(out);+    }++    Elm.Native.List.values = {+        Nil:Nil,+        Cons:Cons,+        cons:F2(Cons),+        toArray:toArray,+        fromArray:fromArray,+        range:range,+        append:append,++        head:head,+        tail:tail,+        last:last,++        map:F2(map),+        foldl:F3(foldl),+        foldr:F3(foldr),++        foldl1:F2(foldl1),+        foldr1:F2(foldr1),+        scanl:F3(scanl),+        scanl1:F2(scanl1),+        filter:F2(filter),+        length:length,+        member:F2(member),+        reverse:reverse,+        concat:concat,++        all:F2(all),+        any:F2(any),+        zipWith:F3(zipWith),+        zip:F2(zip),+        sort:sort,+        sortBy:F2(sortBy),+        sortWith:F2(sortWith),+        nth:F2(nth),+        take:F2(take),+        drop:F2(drop),+        repeat:F2(repeat),++        join:F2(join)+    };+    return elm.Native.List.values = Elm.Native.List.values;++};+Elm.Native.Ports = {};+Elm.Native.Ports.make = function(elm) {+    elm.Native = elm.Native || {};+    elm.Native.Ports = elm.Native.Ports || {};+    if (elm.Native.Ports.values) return elm.Native.Ports.values;++    var Signal = Elm.Signal.make(elm);++    function incomingSignal(converter) {+        converter.isSignal = true;+        return converter;+    }++    function outgoingSignal(converter) {+        return function(signal) {+            var subscribers = []+            function subscribe(handler) {+                subscribers.push(handler);+            }+            function unsubscribe(handler) {+                subscribers.pop(subscribers.indexOf(handler));+            }+            A2( Signal.lift, function(value) {+                var val = converter(value);+                var len = subscribers.length;+                for (var i = 0; i < len; ++i) {+                    subscribers[i](val);+                }+            }, signal);+            return { subscribe:subscribe, unsubscribe:unsubscribe };+        }+    }++    function portIn(name, converter) {+        var jsValue = elm.ports.incoming[name];+        if (jsValue === undefined) {+            throw new Error("Initialization Error: port '" + name ++                            "' was not given an input!");+        }+        elm.ports.uses[name] += 1;+        try {+            var elmValue = converter(jsValue);+        } catch(e) {+            throw new Error("Initialization Error on port '" + name + "': \n" + e.message);+        }++        // just return a static value if it is not a signal+        if (!converter.isSignal) {+            return elmValue;+        }++        // create a signal if necessary+        var signal = Signal.constant(elmValue);+        function send(jsValue) {+            try {+                var elmValue = converter(jsValue);+            } catch(e) {+                throw new Error("Error sending to port '" + name + "': \n" + e.message);+            }+            setTimeout(function() {+                elm.notify(signal.id, elmValue);+            }, 0);+        }+        elm.ports.outgoing[name] = { send:send };+        return signal;+    }++    function portOut(name, converter, value) {+        try {+            elm.ports.outgoing[name] = converter(value);+        } catch(e) {+            throw new Error("Initialization Error on port '" + name + "': \n" + e.message);+        }+        return value;+    }++    return elm.Native.Ports.values = {+        incomingSignal: incomingSignal,+        outgoingSignal: outgoingSignal,+        portOut: portOut,+        portIn: portIn+    };+};+Elm.Native.Regex = {};+Elm.Native.Regex.make = function(elm) {+    elm.Native = elm.Native || {};+    elm.Native.Regex = elm.Native.Regex || {};+    if (elm.Native.Regex.values) return elm.Native.Regex.values;+    if ('values' in Elm.Native.Regex)+        return elm.Native.Regex.values = Elm.Native.Regex.values;++    var Maybe = Elm.Maybe.make(elm);+    var JS = Elm.JavaScript.make(elm);++    function escape(str) {+        return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');+    }+    function caseInsensitive(re) {+        return new RegExp(re.source, 'gi');+    }+    function pattern(raw) {+        return new RegExp(raw, 'g');+    }++    function contains(re, string) {+        return re.test(JS.fromString(string));+    }++    function findAll(re, string) {+        return find(Infinity, re, string);+    }+    function find(n, re, str) {+        var out = [];+        var number = 0;+        var string = JS.fromString(str);+        var result;+        while (number++ < n && (result = re.exec(string))) {+            var i = result.length - 1;+            var subs = new Array(i);+            while (i > 0) {+                var submatch = result[i];+                subs[--i] = submatch === undefined+                    ? Maybe.Nothing+                    : Maybe.Just(JS.toString(submatch));+            }+            out.push({+                _:{},+                match: JS.toString(result[0]),+                submatches: JS.toList(subs),+                index: result.index,+                number: number,+            });+        }+        return JS.toList(out);+    }++    function replaceAll(re, replacer, string) {+        return replace(Infinity, re, replacer, string);+    }+    function replace(n, re, replacer, string) {+        var count = 0;+        function jsReplacer(match) {+            if (count++ > n) return match;+            var i = arguments.length-3;+            var submatches = new Array(i);+            while (i > 0) {+                var submatch = arguments[i];+                submatches[--i] = submatch === undefined+                    ? Maybe.Nothing+                    : Maybe.Just(JS.toString(submatch));+            }+            return JS.fromString(replacer({+                _:{},+                match:match,+                submatches:JS.toList(submatches),+                index:arguments[i-1],+                number:count+            }));+        }+        return string.replace(re, jsReplacer);+    }++    function split(re, string) {+        return JS.toList(JS.fromString(string).split(re));+    }+    function splitN(n, re, str) {+        var string = JS.fromString(str);+        var result;+        var out = [];+        var start = re.lastIndex;+        while (n--) {+            if (!(result = re.exec(string))) break;+            out.push(string.slice(start, result.index));+            start = re.lastIndex;+        }+        out.push(string.slice(start));+        return JS.toList(out);+    }++    return Elm.Native.Regex.values = {+        pattern: pattern,+        caseInsensitive: caseInsensitive,+        escape: escape,++        contains: F2(contains),+        findAll: F2(findAll),+        find: F3(find),++        replaceAll: F3(replaceAll),+        replace: F4(replace),++        split: F2(split),+        splitN: F3(splitN),+    };+};Elm.Native.Show = {};+Elm.Native.Show.make = function(elm) {+    elm.Native = elm.Native || {};+    elm.Native.Show = elm.Native.Show || {};+    if (elm.Native.Show.values) return elm.Native.Show.values;++    var NList = Elm.Native.List.make(elm);+    var List = Elm.List.make(elm);+    var Maybe = Elm.Maybe.make(elm);+    var JS = Elm.JavaScript.make(elm);+    var Dict = Elm.Dict.make(elm);+    var Json = Elm.Json.make(elm);+    var Tuple2 = Elm.Native.Utils.make(elm).Tuple2;++    var toString = function(v) {+        var type = typeof v;+        if (type === "function") {+            var name = v.func ? v.func.name : v.name;+            return '<function' + (name === '' ? '' : ': ') + name + '>';+        } else if (type === "boolean") {+            return v ? "True" : "False";+        } else if (type === "number") {+            return v+"";+        } else if ((v instanceof String) && v.isChar) {+            return "'" + addSlashes(v) + "'";+        } else if (type === "string") {+            return '"' + addSlashes(v) + '"';+        } else if (type === "object" && '_' in v && probablyPublic(v)) {+            var output = [];+            for (var k in v._) {+                for (var i = v._[k].length; i--; ) {+                    output.push(k + " = " + toString(v._[k][i]));+                }+            }+            for (var k in v) {+                if (k === '_') continue;+                output.push(k + " = " + toString(v[k]));+            }+            if (output.length === 0) return "{}";+            return "{ " + output.join(", ") + " }";+        } else if (type === "object" && 'ctor' in v) {+            if (v.ctor.substring(0,6) === "_Tuple") {+                var output = [];+                for (var k in v) {+                    if (k === 'ctor') continue;+                    output.push(toString(v[k]));+                }+                return "(" + output.join(",") + ")";+            } else if (v.ctor === "::") {+                var output = '[' + toString(v._0);+                v = v._1;+                while (v.ctor === "::") {+                    output += "," + toString(v._0);+                    v = v._1;+                }+                return output + ']';+            } else if (v.ctor === "[]") {+                return "[]";+            } else if (v.ctor === "RBNode" || v.ctor === "RBEmpty") {+                var cons = F3(function(k,v,acc){return NList.Cons(Tuple2(k,v),acc)});+                var list = A3(Dict.foldr, cons, NList.Nil, v);+                var name = "Dict";+                if (list.ctor === "::" && list._0._1.ctor === "_Tuple0") {+                    name = "Set";+                    list = A2(List.map, function(x){return x._0}, list);+                }+                return name + ".fromList " + toString(list);+            } else {+                var output = "";+                for (var i in v) {+                    if (i === 'ctor') continue;+                    var str = toString(v[i]);+                    var parenless = str[0] === '{' || str[0] === '<' || str.indexOf(' ') < 0;+                    output += ' ' + (parenless ? str : '(' + str + ')');+                }+                return v.ctor + output;+            }+        }+        if (type === 'object' && 'recv' in v) return '<signal>';+        return "<internal structure>";+    };++    function addSlashes(str) {+        return str.replace(/\\/g, '\\\\')+                  .replace(/\n/g, '\\n')+                  .replace(/\t/g, '\\t')+                  .replace(/\r/g, '\\r')+                  .replace(/\v/g, '\\v')+                  .replace(/\0/g, '\\0')+                  .replace(/\'/g, "\\'")+                  .replace(/\"/g, '\\"');+    }++    function probablyPublic(v) {+        var keys = Object.keys(v);+        var len = keys.length;+        if (len === 3+            && 'props' in v+            && 'element' in v) return false;+        if (len === 5+            && 'horizontal' in v+            && 'vertical' in v+            && 'x' in v+            && 'y' in v) return false;+        if (len === 7+            && 'theta' in v+            && 'scale' in v+            && 'x' in v+            && 'y' in v+            && 'alpha' in v+            && 'form' in v) return false;+        return true;+    }++    return elm.Native.Show.values = { show:toString };+};+Elm.Native.String = {};+Elm.Native.String.make = function(elm) {+    elm.Native = elm.Native || {};+    elm.Native.String = elm.Native.String || {};+    if (elm.Native.String.values) return elm.Native.String.values;+    if ('values' in Elm.Native.String)+        return elm.Native.String.values = Elm.Native.String.values;++    var Char = Elm.Char.make(elm);+    var Maybe = Elm.Maybe.make(elm);+    var JS = Elm.JavaScript.make(elm);+    var Utils = Elm.Native.Utils.make(elm);++    function isEmpty(str) {+        return str.length === 0;+    }+    function cons(chr,str) {+        return chr + str;+    }+    function uncons(str) {+        var hd;+        return (hd = str[0]) ? Maybe.Just(Utils.Tuple2(Utils.chr(hd), str.slice(1)))+                              : Maybe.Nothing;+    }+    function append(a,b) {+        return a + b;+    }+    function concat(strs) {+        return JS.fromList(strs).join('');+    }+    function length(str) {+        return str.length;+    }+    function map(f,str) {+        var out = str.split('');+        for (var i = out.length; i--; ) {+            out[i] = f(Utils.chr(out[i]));+        }+        return out.join('');+    }+    function filter(pred,str) {+        return str.split('').map(Utils.chr).filter(pred).join('');+    }+    function reverse(str) {+        return str.split('').reverse().join('');+    }+    function foldl(f,b,str) {+        var len = str.length;+        for (var i = 0; i < len; ++i) {+            b = A2(f, Utils.chr(str[i]), b);+        }+        return b;+    }+    function foldr(f,b,str) {+        for (var i = str.length; i--; ) {+            b = A2(f, Utils.chr(str[i]), b);+        }+        return b;+    }++    function split(sep, str) {+        return JS.toList(str.split(sep));+    }+    function join(sep, strs) {+        return JS.fromList(strs).join(sep);+    }+    function repeat(n, str) {+        var result = '';+        while (n > 0) {+            if (n & 1) result += str;+            n >>= 1, str += str;+        }+        return result;+    }++    function sub(start, end, str) {+        return str.slice(start,end);+    }+    function left(n, str) {+        return n < 1 ? "" : str.slice(0,n);+    }+    function right(n, str) {+        return n < 1 ? "" : str.slice(-n);+    }+    function dropLeft(n, str) {+        return n < 1 ? str : str.slice(n);+    }+    function dropRight(n, str) {+        return n < 1 ? str : str.slice(0,-n);+    }++    function pad(n,chr,str) {+        var half = (n - str.length) / 2;+        return repeat(Math.ceil(half),chr) + str + repeat(half|0,chr);+    }+    function padRight(n,chr,str) {+        return str + repeat(n - str.length, chr);+    }+    function padLeft(n,chr,str) {+        return repeat(n - str.length, chr) + str;+    }++    function trim(str) {+        return str.trim();+    }+    function trimLeft(str) {+        return str.trimLeft();+    }+    function trimRight(str) {+        return str.trimRight();+    }++    function words(str) {+        return JS.toList(str.split(/\s+/g));+    }+    function lines(str) {+        return JS.toList(str.split(/\r\n|\r|\n/g));+    }++    function toUpper(str) {+        return str.toUpperCase();+    }+    function toLower(str) {+        return str.toLowerCase();+    }++    function any(pred, str) {+        for (var i = str.length; i--; ) {+            if (pred(Utils.chr(str[i]))) return true;+        }+        return false;+    }+    function all(pred, str) {+        for (var i = str.length; i--; ) {+            if (!pred(Utils.chr(str[i]))) return false;+        }+        return true;+    }++    function contains(sub, str) {+        return str.indexOf(sub) > -1;+    }+    function startsWith(sub, str) {+        return str.indexOf(sub) === 0;+    }+    function endsWith(sub, str) {+        return str.lastIndexOf(sub) === str.length - sub.length;+    }+    function indexes(sub, str) {+        var subLen = sub.length;+        var i = 0;+        var is = [];+        while ((i = str.indexOf(sub, i)) > -1) {+            is.push(i);+            i = i + subLen;+        }+        return JS.toList(is);+    }++    function toInt(s) {+        var len = s.length;+        if (len === 0) { return Maybe.Nothing; }+        var start = 0;+        if (s[0] == '-') {+            if (len === 1) { return Maybe.Nothing; }+            start = 1;+        }+        for (var i = start; i < len; ++i) {+            if (!Char.isDigit(s[i])) { return Maybe.Nothing; }+        }+        return Maybe.Just(parseInt(s, 10));+    }++    function toFloat(s) {+        var len = s.length;+        if (len === 0) { return Maybe.Nothing; }+        var start = 0;+        if (s[0] == '-') {+            if (len === 1) { return Maybe.Nothing; }+            start = 1;+        }+        var dotCount = 0;+        for (var i = start; i < len; ++i) {+            if (Char.isDigit(s[i])) { continue; }+            if (s[i] === '.') {+                dotCount += 1;+                if (dotCount <= 1) { continue; }+            }+            return Maybe.Nothing;+        }+        return Maybe.Just(parseFloat(s));+    }++    function toList(str) {+        return JS.toList(str.split('').map(Utils.chr));+    }+    function fromList(chars) {+        return JS.fromList(chars).join('');+    }++    return Elm.Native.String.values = {+        isEmpty: isEmpty,+        cons: F2(cons),+        uncons: uncons,+        append: F2(append),+        concat: concat,+        length: length,+        map: F2(map),+        filter: F2(filter),+        reverse: reverse,+        foldl: F3(foldl),+        foldr: F3(foldr),++        split: F2(split),+        join: F2(join),+        repeat: F2(repeat),++        sub: F3(sub),+        left: F2(left),+        right: F2(right),+        dropLeft: F2(dropLeft),+        dropRight: F2(dropRight),++        pad: F3(pad),+        padLeft: F3(padLeft),+        padRight: F3(padRight),++        trim: trim,+        trimLeft: trimLeft,+        trimRight: trimRight,++        words: words,+        lines: lines,++        toUpper: toUpper,+        toLower: toLower,++        any: F2(any),+        all: F2(all),++        contains: F2(contains),+        startsWith: F2(startsWith),+        endsWith: F2(endsWith),+        indexes: F2(indexes),++        toInt: toInt,+        toFloat: toFloat,+        toList: toList,+        fromList: fromList,+    };+};Elm.Native.Text = {};+Elm.Native.Text.make = function(elm) {+    elm.Native = elm.Native || {};+    elm.Native.Text = elm.Native.Text || {};+    if (elm.Native.Text.values) return elm.Native.Text.values;++    var JS = Elm.JavaScript.make(elm);+    var Utils = Elm.Native.Utils.make(elm);+    var Color = Elm.Native.Color.make(elm);+    var Element = Elm.Graphics.Element.make(elm);+    var show = Elm.Native.Show.make(elm).show;++    function makeSpaces(s) {+        if (s.length == 0) { return s; }+        var arr = s.split('');+        if (arr[0] == ' ') { arr[0] = "&nbsp;" }      +        for (var i = arr.length; --i; ) {+            if (arr[i][0] == ' ' && arr[i-1] == ' ') {+                arr[i-1] = arr[i-1] + arr[i];+                arr[i] = '';+            }+        }+        for (var i = arr.length; i--; ) {+            if (arr[i].length > 1 && arr[i][0] == ' ') {+                var spaces = arr[i].split('');+                for (var j = spaces.length - 2; j >= 0; j -= 2) {+                    spaces[j] = '&nbsp;';+                }+                arr[i] = spaces.join('');+            }+        }+        arr = arr.join('');+        if (arr[arr.length-1] === " ") {+	    return arr.slice(0,-1) + '&nbsp;';+        }+        return arr;+    }++    function properEscape(str) {+        if (str.length == 0) return str;+        str = str //.replace(/&/g,  "&#38;")+	    .replace(/"/g,  '&#34;')+	    .replace(/'/g,  "&#39;")+	    .replace(/</g,  "&#60;")+	    .replace(/>/g,  "&#62;")+	    .replace(/\n/g, "<br/>");+        var arr = str.split('<br/>');+        for (var i = arr.length; i--; ) {+	    arr[i] = makeSpaces(arr[i]);+        }+        return arr.join('<br/>');+    }++    function toText(str) { return Utils.txt(properEscape(JS.fromString(str))); }++    function height(px, text) {+        return { style: 'font-size:' + px + 'px;', text:text }+    }+    function typeface(name, text) {+        return { style: 'font-family:' + name + ';', text:text }+    }+    function monospace(text) {+        return { style: 'font-family:monospace;', text:text }+    }+    function italic(text) {+        return { style: 'font-style:italic;', text:text }+    }+    function bold(text) {+        return { style: 'font-weight:bold;', text:text }+    }+    function link(href, text) {+        return { href: toText(href), text:text };+    }+    function underline(text) {+        return { line: ' underline', text:text };+    }+    function overline(text) {+        return { line: ' overline', text:text };+    }+    function strikeThrough(text) {+        return { line: ' line-through', text:text };+    }++    function color(c, text) {+        var color = (c._3 === 1)+            ? ('rgb(' + c._0 + ', ' + c._1 + ', ' + c._2 + ')')+            : ('rgba(' + c._0 + ', ' + c._1 + ', ' + c._2 + ', ' + c._3 + ')');+        return { style: 'color:' + color + ';', text:text };+    }++    function position(align) {+        function create(text) {+            var raw = {+                ctor :'RawHtml',+                html : Utils.makeText(text),+                align: align,+                guid : null,+                args : [],+            };+            var pos = A2(Utils.htmlHeight, 0, raw);+            return A3(Element.newElement, pos._0, pos._1, raw);+        }+        return create;+    }++    function markdown(text, guid) {+        var raw = {+            ctor:'RawHtml',+            html: text,+            align: null,+            guid: guid,+            args: [],+        };+        var pos = A2(Utils.htmlHeight, 0, raw);+        return A3(Element.newElement, pos._0, pos._1, raw);+    }++    var text = position('left');+    function asText(v) {+        return text(monospace(toText(show(v))));+    }++    function plainText(v) {+        return text(toText(v));+    }++    return elm.Native.Text.values = {+        toText: toText,++        height : F2(height),+        italic : italic,+        bold : bold,+        underline : underline,+        overline : overline,+        strikeThrough : strikeThrough,+        monospace : monospace,+        typeface : F2(typeface),+        color : F2(color),+        link : F2(link),++        justified : position('justify'),+        centered : position('center'),+        righted : position('right'),+        text : text,+        plainText : plainText,+        markdown : markdown,++        asText : asText,+    };+};+Elm.Native.Transform2D = {};+Elm.Native.Transform2D.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.Transform2D = elm.Native.Transform2D || {};+ if (elm.Native.Transform2D.values) return elm.Native.Transform2D.values;++ var A;+ if (typeof Float32Array === 'undefined') {+     A = function(arr) {+         this.length = arr.length;+         this[0] = arr[0];+         this[1] = arr[1];+         this[2] = arr[2];+         this[3] = arr[3];+         this[4] = arr[4];+         this[5] = arr[5];+     };+ } else {+     A = Float32Array;+ }++ // layout of matrix in an array is+ //+ //   | m11 m12 dx |+ //   | m21 m22 dy |+ //   |  0   0   1 |+ //+ //  new A([ m11, m12, dx, m21, m22, dy ])++ var identity = new A([1,0,0,0,1,0]);+ function matrix(m11, m12, m21, m22, dx, dy) {+     return new A([m11, m12, dx, m21, m22, dy]);+ }+ function rotation(t) {+     var c = Math.cos(t);+     var s = Math.sin(t);+     return new A([c, -s, 0, s, c, 0]);+ }+ function rotate(t,m) {+     var c = Math.cos(t);+     var s = Math.sin(t);+     var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4];+     return new A([m11*c + m12*s, -m11*s + m12*c, m[2],+                   m21*c + m22*s, -m21*s + m22*c, m[5]]);+ }+ /*+ function move(xy,m) {+     var x = xy._0;+     var y = xy._1;+     var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4];+     return new A([m11, m12, m11*x + m12*y + m[2],+                   m21, m22, m21*x + m22*y + m[5]]);+ }+ function scale(s,m) { return new A([m[0]*s, m[1]*s, m[2], m[3]*s, m[4]*s, m[5]]); }+ function scaleX(x,m) { return new A([m[0]*x, m[1], m[2], m[3]*x, m[4], m[5]]); }+ function scaleY(y,m) { return new A([m[0], m[1]*y, m[2], m[3], m[4]*y, m[5]]); }+ function reflectX(m) { return new A([-m[0], m[1], m[2], -m[3], m[4], m[5]]); }+ function reflectY(m) { return new A([m[0], -m[1], m[2], m[3], -m[4], m[5]]); }++ function transform(m11, m21, m12, m22, mdx, mdy, n) {+     var n11 = n[0], n12 = n[1], n21 = n[3], n22 = n[4], ndx = n[2], ndy = n[5];+     return new A([m11*n11 + m12*n21,+                   m11*n12 + m12*n22,+                   m11*ndx + m12*ndy + mdx,+                   m21*n11 + m22*n21,+                   m21*n12 + m22*n22,+                   m21*ndx + m22*ndy + mdy]);+ }+ */+ function multiply(m, n) {+     var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4], mdx = m[2], mdy = m[5];+     var n11 = n[0], n12 = n[1], n21 = n[3], n22 = n[4], ndx = n[2], ndy = n[5];+     return new A([m11*n11 + m12*n21,+                   m11*n12 + m12*n22,+                   m11*ndx + m12*ndy + mdx,+                   m21*n11 + m22*n21,+                   m21*n12 + m22*n22,+                   m21*ndx + m22*ndy + mdy]);+ }++ return elm.Native.Transform2D.values = {+     identity:identity,+     matrix:F6(matrix),+     rotation:rotation,+     multiply:F2(multiply)+     /*+     transform:F7(transform),+     rotate:F2(rotate),+     move:F2(move),+     scale:F2(scale),+     scaleX:F2(scaleX),+     scaleY:F2(scaleY),+     reflectX:reflectX,+     reflectY:reflectY+     */+ };++};+Elm.Native.Utils = {};+Elm.Native.Utils.make = function(elm) {++    elm.Native = elm.Native || {};+    elm.Native.Utils = elm.Native.Utils || {};+    if (elm.Native.Utils.values) return elm.Native.Utils.values;++    function eq(x,y) {+        if (x === y) return true;+        if (typeof x === "object") {+            var c = 0;+            for (var i in x) { ++c; if (!eq(x[i],y[i])) return false; }+            return c === Object.keys(y).length;+        }+        if (typeof x === 'function') {+            throw new Error('Equality error: general function equality is ' ++                            'undecidable, and therefore, unsupported');+        }+        return x === y;+    }++    // code in Generate/JavaScript.hs depends on the particular+    // integer values assigned to LT, EQ, and GT+    var LT = -1, EQ = 0, GT = 1, ord = ['LT','EQ','GT'];+    function compare(x,y) { return { ctor: ord[cmp(x,y)+1] } }+    function cmp(x,y) {+        var ord;+        if (typeof x !== 'object' || x instanceof String){+            return x === y ? EQ : x < y ? LT : GT;+        }++        if (x.ctor === "::" || x.ctor === "[]") {+            while (true) {+                if (x.ctor === "[]" && y.ctor === "[]") return EQ;+                if (x.ctor !== y.ctor) return x.ctor === '[]' ? LT : GT;+                ord = cmp(x._0, y._0);+                if (ord !== EQ) return ord;+                x = x._1;+                y = y._1;+            }+        }++        if (x.ctor.slice(0,6) === '_Tuple') {+            var n = x.ctor.slice(6) - 0;+            var err = 'cannot compare tuples with more than 6 elements.';+            if (n === 0) return EQ;+            if (n >= 1) { ord = cmp(x._0, y._0); if (ord !== EQ) return ord;+            if (n >= 2) { ord = cmp(x._1, y._1); if (ord !== EQ) return ord;+            if (n >= 3) { ord = cmp(x._2, y._2); if (ord !== EQ) return ord;+            if (n >= 4) { ord = cmp(x._3, y._3); if (ord !== EQ) return ord;+            if (n >= 5) { ord = cmp(x._4, y._4); if (ord !== EQ) return ord;+            if (n >= 6) { ord = cmp(x._5, y._5); if (ord !== EQ) return ord;+            if (n >= 7) throw new Error('Comparison error: ' + err); } } } } } }+            return EQ;+        }+        throw new Error('Comparison error: comparison is only defined on ints, ' ++                        'floats, times, chars, strings, lists of comparable values, ' ++                        'and tuples of comparable values.')+    }+++    var Tuple0 = { ctor: "_Tuple0" };+    function Tuple2(x,y) { return { ctor:"_Tuple2", _0:x, _1:y } }++    function chr(c) {+        var x = new String(c);+        x.isChar = true;+        return x;+    }++    function txt(str) {+        var t = new String(str);+        t.text = true;+        return t;+    }++    function makeText(text) {+        var style = '';+        var line = '';+        var href = '';+        while (true) {+            if (text.line) {+                line += text.line;+                text = text.text;+                continue;+            }+            if (text.style) {+                style += text.style;+                text = text.text;+                continue;+            }+            if (text.href) {+                href = text.href;+                text = text.text;+                continue;+            }+            if (href) text = '<a href="' + href + '">' + text + '</a>';+            if (line) style += 'text-decoration:' + line + ';';+            if (style) text = '<span style="' + style + '">' + text + '</span>';+            return text;+        }+    }++    var count = 0;+    function guid(_) { return count++ }++    function copy(r) {+        var o = {};+        for (var i in r) { o[i] = r[i]; }+        return o;+    }++    function remove(x,r) {+        var o = copy(r);+        if (x in o._) {+            o[x] = o._[x][0];+            o._[x] = o._[x].slice(1);+            if (o._[x].length === 0) { delete o._[x]; }+        } else {+            delete o[x];+        }+        return o;+    }++    function replace(kvs,r) {+        var o = copy(r);+        for (var i = kvs.length; i--; ) {+            var kvsi = kvs[i];+            o[kvsi[0]] = kvsi[1];+        }+        return o;+    }++    function insert(x,v,r) {+        var o = copy(r);+        if (x in o) o._[x] = [o[x]].concat(x in o._ ? o._[x].slice(0) : []);+        o[x] = v;+        return o;+    }++    function max(a,b) { return a > b ? a : b }+    function min(a,b) { return a < b ? a : b }++    function mod(a,b) {+        if (b === 0) {+            throw new Error("Cannot perform mod 0. Division by zero error.");+        }+        var r = a % b;+        var m = a === 0 ? 0 : (b > 0 ? (a >= 0 ? r : r+b) : -mod(-a,-b));++        return m === b ? 0 : m;+    }++    function htmlHeight(width, rawHtml) {+        // create dummy node+        var html = rawHtml.html;+        var t = document.createElement('div');+        t.innerHTML = html;+        if (width > 0) { t.style.width = width + "px"; }+        t.style.visibility = "hidden";+        t.style.styleFloat = "left";+        t.style.cssFloat   = "left";++        document.body.appendChild(t);++        // insert interpolated values+        var args = rawHtml.args;+        var guid = rawHtml.guid;+        for (var i = args.length; i--; ) {+            var arg = args[i];+            var span = document.getElementById('md-' + guid + '-' + i);+            if (arg.isElement) {+                span.style.width = arg.props.width + 'px';+                span.style.height = arg.props.height + 'px';+            } else {+                span.innerHTML = arg;+            }+        }++        // get dimensions+        var style = window.getComputedStyle(t, null);+        var w = Math.ceil(style.getPropertyValue("width").slice(0,-2) - 0);+        var h = Math.ceil(style.getPropertyValue("height").slice(0,-2) - 0);+        document.body.removeChild(t);+        return Tuple2(w,h);+    }++    function getXY(e) {+        var posx = 0;+        var posy = 0;+        if (e.pageX || e.pageY) {+            posx = e.pageX;+            posy = e.pageY;+        } else if (e.clientX || e.clientY) {+            posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;+            posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;+        }++        if (elm.display === ElmRuntime.Display.COMPONENT) {+            var rect = elm.node.getBoundingClientRect();+            var relx = rect.left + document.body.scrollLeft + document.documentElement.scrollLeft;+            var rely = rect.top + document.body.scrollTop + document.documentElement.scrollTop;+            // TODO: figure out if there is a way to avoid rounding here+            posx = posx - Math.round(relx) - elm.node.clientLeft;+            posy = posy - Math.round(rely) - elm.node.clientTop;+        }+        return Tuple2(posx, posy);+    }++    return elm.Native.Utils.values = {+        eq:eq,+        cmp:cmp,+        compare:F2(compare),+        Tuple0:Tuple0,+        Tuple2:Tuple2,+        chr:chr,+        txt:txt,+        makeText:makeText,+        copy: copy,+        remove: remove,+        replace: replace,+        insert: insert,+        guid: guid,+        max : F2(max),+        min : F2(min),+        mod : F2(mod),+        htmlHeight: F2(htmlHeight),+        getXY: getXY,+        toFloat: function(x) { return +x; }+    };+};+Elm.Native.Graphics.Collage = {};+Elm.Native.Graphics.Collage.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.Graphics = elm.Native.Graphics || {};+ elm.Native.Graphics.Collage = elm.Native.Graphics.Collage || {};+ if (elm.Native.Graphics.Collage.values) return elm.Native.Graphics.Collage.values;++ var newElement = Elm.Graphics.Element.make(elm).newElement;+ var C = ElmRuntime.use(ElmRuntime.Render.Collage);++ function collage(w,h,forms) {+     return A3(newElement, w, h, {+                 ctor: 'Custom',+		 type: 'Collage',+		 render: C.render,+		 update: C.update,+		 model: {w:w, h:h, forms:forms}+	 });+ }+ return elm.Native.Graphics.Collage.values = { collage:F3(collage) };++};Elm.Native.Graphics.Input = {};+Elm.Native.Graphics.Input.make = function(elm) {++ elm.Native = elm.Native || {};+ elm.Native.Graphics = elm.Native.Graphics || {};+ elm.Native.Graphics.Input = elm.Native.Graphics.Input || {};+ if (elm.Native.Graphics.Input.values) return elm.Native.Graphics.Input.values;++ var Render = ElmRuntime.use(ElmRuntime.Render.Element);+ var newNode = ElmRuntime.use(ElmRuntime.Render.Utils).newElement;++ var Signal = Elm.Signal.make(elm);+ var newElement = Elm.Graphics.Element.make(elm).newElement;+ var JS = Elm.Native.JavaScript.make(elm);+ var Utils = Elm.Native.Utils.make(elm);+ var Tuple2 = Utils.Tuple2;++ function dropDown(values) {+     var entries = JS.fromList(values);+     var events = Signal.constant(entries[0]._1);++     var drop = newNode('select');+     drop.style.border = '0 solid';+     for (var i = 0; i < entries.length; ++i) {+         var option = newNode('option');+         var name = JS.fromString(entries[i]._0);+         option.value = name;+         option.innerHTML = name;+         drop.appendChild(option);+     }+     drop.addEventListener('change', function() {+             elm.notify(events.id, entries[drop.selectedIndex]._1);+         });++     var t = drop.cloneNode(true);+     t.style.visibility = "hidden";++     elm.node.appendChild(t);+     var style = window.getComputedStyle(t, null);+     var w = Math.ceil(style.getPropertyValue("width").slice(0,-2) - 0);+     var h = Math.ceil(style.getPropertyValue("height").slice(0,-2) - 0);+     elm.node.removeChild(t);+     +     var element = A3(newElement, w, h, {+             ctor: 'Custom',+             type: 'DropDown',+             render: function render(model) { return drop; },+             update: function update(node, oldModel, newModel) {},+             model: {}+         });++     return Tuple2(Signal.constant(element), events);+ }++ function buttons(defaultValue) {+     var events = Signal.constant(defaultValue);++     function render(model) {+         var b = newNode('button');+         b.style.display = 'block';+         b.elmEvent = model.event;+         function click() { elm.notify(events.id, b.elmEvent); }+         b.addEventListener('click', click);+         b.innerHTML = model.text;+         return b;+     }++     function update(node, oldModel, newModel) {+         node.elmEvent = newModel.event;+         var txt = newModel.text;+         if (oldModel.text !== txt) node.innerHTML = txt;+     }++     function button(evnt, txt) {+         return A3(newElement, 100, 40, {+                     ctor: 'Custom',+                     type: 'Button',+                     render: render,+                     update: update,+                     model: { event:evnt, text:JS.fromString(txt) }+             });+     }++     return { _:{}, button:F2(button), events:events };+ }++ function customButtons(defaultValue) {+     var events = Signal.constant(defaultValue);++     function render(model) {+         var btn = newNode('div');+         btn.elmEvent = model.event;++         btn.elmUp    = Render.render(model.up);+         btn.elmHover = Render.render(model.hover);+         btn.elmDown  = Render.render(model.down);++         function replace(node) {+           if (node !== btn.firstChild) btn.replaceChild(node, btn.firstChild);+         }+         var overCount = 0;+         function over(e) {+             if (overCount++ > 0) return;+             replace(btn.elmHover);+         }+         function out(e) {+             if (btn.contains(e.toElement || e.relatedTarget)) return;+             overCount = 0;+             replace(btn.elmUp);+         }+         function up() {+             replace(btn.elmHover);+             elm.notify(events.id, btn.elmEvent);+         }+         function down() { replace(btn.elmDown); }+         btn.addEventListener('mouseover', over);+         btn.addEventListener('mouseout' , out);+         btn.addEventListener('mousedown', down);+         btn.addEventListener('mouseup'  , up);++         btn.appendChild(btn.elmUp);++         var clicker = newNode('div');+         clicker.style.width = btn.elmUp.style.width;+         clicker.style.height = btn.elmUp.style.height;+         clicker.style.position = 'absolute';+         clicker.style.top = 0;+         btn.appendChild(clicker);++         return btn;+     }++     function update(node, oldModel, newModel) {+         node.elmEvent = newModel.event;+         Render.update(node.elmUp, oldModel.up, newModel.up)+         Render.update(node.elmHover, oldModel.hover, newModel.hover)+         Render.update(node.elmDown, oldModel.down, newModel.down)+     }++     function button(evnt, up, hover, down) {+         return A3(newElement,+                   Math.max(up.props.width, hover.props.width, down.props.width),+                   Math.max(up.props.height, hover.props.height, down.props.height),+                   { ctor: 'Custom',+                     type: 'CustomButton',+                     render: render,+                     update: update,+                     model: { event:evnt, up:up, hover:hover, down:down }+                   });+     }++     return { _:{}, customButton:F4(button), events:events };+ }+++ function hoverables(defaultValue) {+     var events = Signal.constant(defaultValue);+     function hoverable(handler, elem) {+         function onHover(bool) {+             elm.notify(events.id, handler(bool));+         }+         var props = Utils.replace([['hover',onHover]], elem.props);+         return { props:props, element:elem.element };+     }+     return { _:{}, hoverable:F2(hoverable), events:events };+ }+++ function checkboxes(defaultValue) {+     var events = Signal.constant(defaultValue);++     function render(model) {+         var b = newNode('input');+         b.type = 'checkbox';+         b.checked = model.checked;+         b.style.display = 'block';+         b.elmHandler = model.handler;+         function change() { elm.notify(events.id, b.elmHandler(b.checked)); }+         b.addEventListener('change', change);+         return b;+     }++     function update(node, oldModel, newModel) {+         node.elmHandler = newModel.handler;+         node.checked = newModel.checked;+         return true;+     }++     function box(handler, checked) {+         return A3(newElement, 13, 13, {+                     ctor: 'Custom',+                     type: 'CheckBox',+                     render: render,+                     update: update,+                     model: { checked:checked, handler:handler  }+             });+     }++     return { _:{}, checkbox:F2(box), events:events };+ }++ function setRange(node, start, end, dir) {+     if (node.parentNode) {+         node.setSelectionRange(start, end, dir);+     } else {+         setTimeout(function(){node.setSelectionRange(start, end, dir);}, 0);+     }+ }++ function mkTextPool(type) { return function fields(defaultValue) {+     var events = Signal.constant(defaultValue);++     var state = null;++     function render(model) {+         var field = newNode('input');+         field.elmHandler = model.handler;++         field.id = 'test';+         field.type = type;+         field.placeholder = JS.fromString(model.placeHolder);+         field.value = JS.fromString(model.state.string);+         setRange(field, model.state.selectionStart, model.state.selectionEnd, 'forward');+         field.style.border = 'none';+         state = model.state;++         function update() {+             var start = field.selectionStart,+                 end = field.selectionEnd;+             if (field.selectionDirection === 'backward') {+                 start = end;+                 end = field.selectionStart;+             }+             state = { _:{},+                       string:JS.toString(field.value),+                       selectionStart:start,+                       selectionEnd:end };+             elm.notify(events.id, field.elmHandler(state));+         }+         function mousedown() {+             update();+             elm.node.addEventListener('mouseup', mouseup);+         }+         function mouseup() {+             update();+             elm.node.removeEventListener('mouseup', mouseup)+         }+         field.addEventListener('keyup', update);+         field.addEventListener('mousedown', mousedown);++         return field;+     }++     function update(node, oldModel, newModel) {+         node.elmHandler = newModel.handler;+         if (state === newModel.state) return;+         var newStr = JS.fromString(newModel.state.string);+         if (node.value !== newStr) node.value = newStr;++         var start = newModel.state.selectionStart;+         var end = newModel.state.selectionEnd;+         var direction = 'forward';+         if (end < start) {+             start = end;+             end = newModel.state.selectionStart;+             direction = 'backward';+         }+ +         if (node.selectionStart !== start+             || node.selectionEnd !== end+             || node.selectionDirection !== direction) {+             setRange(node, start, end, direction);+         }+     }++     function field(handler, placeHolder, state) {+         return A3(newElement, 200, 30,+                   { ctor: 'Custom',+                     type: type + 'Input',+                     render: render,+                     update: update,+                     model: { handler:handler,+                              placeHolder:placeHolder,+                              state:state }+                   });+     }++     return { _:{}, field:F3(field), events:events };+   }+ }++ return elm.Native.Graphics.Input.values = {+     buttons:buttons,+     customButtons:customButtons,+     hoverables:hoverables,+     checkboxes:checkboxes,+     fields:mkTextPool('text'),+     emails:mkTextPool('email'),+     passwords:mkTextPool('password'),+     dropDown:dropDown+ };++};+Elm.Native.Http = {};+Elm.Native.Http.make = function(elm) {++  elm.Native = elm.Native || {};+  elm.Native.Http = elm.Native.Http || {};+  if (elm.Native.Http.values) return elm.Native.Http.values;+++  var JS = Elm.JavaScript.make(elm);+  var List = Elm.List.make(elm);+  var Signal = Elm.Signal.make(elm);+++  function registerReq(queue,responses) { return function(req) {+    if (req.url.ctor !== '[]') { sendReq(queue,responses,req); }+   };+  }++  function updateQueue(queue,responses) {+    if (queue.length > 0) {+      elm.notify(responses.id, queue[0].value);+      if (queue[0].value.ctor !== 'Waiting') {+        queue.shift();+        setTimeout(function() { updateQueue(queue,responses); }, 0);+      }+    }+  }++  function sendReq(queue,responses,req) {+    var response = { value: { ctor:'Waiting' } };+    queue.push(response);++    var request = null;+    if (window.ActiveXObject)  { request = new ActiveXObject("Microsoft.XMLHTTP"); }+    if (window.XMLHttpRequest) { request = new XMLHttpRequest(); }+    request.onreadystatechange = function(e) {+      if (request.readyState === 4) {+        response.value = (request.status >= 200 && request.status < 300 ?+        { ctor:'Success', _0:JS.toString(request.responseText) } :+        { ctor:'Failure', _0:request.status, _1:JS.toString(request.statusText) });+        setTimeout(function() { updateQueue(queue,responses); }, 0);+      }+    };+    request.open(JS.fromString(req.verb), JS.fromString(req.url), true);+    function setHeader(pair) {+      request.setRequestHeader( JS.fromString(pair._0), JS.fromString(pair._1) );+    }+    List.map(setHeader)(req.headers);+    request.send(JS.fromString(req.body));+  }++  function send(requests) {+    var responses = Signal.constant(elm.Http.values.Waiting);+    var sender = A2( Signal.lift, registerReq([],responses), requests );+    function f(x) { return function(y) { return x; } }+    return A3( Signal.lift2, f, responses, sender );+  }++  return elm.Native.Http.values = {send:send};++};+Elm.Native.Keyboard = {};+Elm.Native.Keyboard.make = function(elm) {++  elm.Native = elm.Native || {};+  elm.Native.Keyboard = elm.Native.Keyboard || {};+  if (elm.Native.Keyboard.values) return elm.Native.Keyboard.values;++  // Duplicated from Native.Signal+  function send(node, timestep, changed) {+    var kids = node.kids;+    for (var i = kids.length; i--; ) {+      kids[i].recv(timestep, changed, node.id);+    }+  }++  var Signal = Elm.Signal.make(elm);+  var NList = Elm.Native.List.make(elm);+  var Utils = Elm.Native.Utils.make(elm);++  var downEvents = Signal.constant(0);+  var upEvents = Signal.constant(0);+  var blurEvents = Signal.constant(0);++  elm.addListener([downEvents.id], document, 'keydown', function down(e) {+    elm.notify(downEvents.id, e.keyCode);+  });++  elm.addListener([upEvents.id], document, 'keyup', function up(e) {+    elm.notify(upEvents.id, e.keyCode);+  });++  elm.addListener([blurEvents.id], document, 'blur', function blur(e) {+    elm.notify(blurEvents.id, NList.Nil);+  });++  function KeyMerge(down, up, blur) {+    var args = [down,up,blur];+    this.id = Utils.guid();+    // Ignore starting values here+    this.value = NList.Nil+    this.kids = [];+    +    var n = args.length;+    var count = 0;+    var isChanged = false;++    this.recv = function(timestep, changed, parentID) {+      ++count;+      if (changed) { +        // We know this a change must only be one of the following cases+        if (parentID === down.id && !(NList.member(down.value)(this.value))) {+          isChanged = true;+          this.value = NList.Cons(down.value, this.value); +        } +        if (parentID === up.id) {+          isChanged = true;+          var notEq = function(kc) { return kc !== up.value };+          this.value = NList.filter(notEq)(this.value);+        } +        if (parentID === blur.id) {+          isChanged = true;+          this.value = NList.Nil;+        }+      }+      if (count == n) {+        send(this, timestep, isChanged);+        isChanged = false;+        count = 0;+      }+    };++    for (var i = n; i--; ) { args[i].kids.push(this); }++  }++  var keysDown = Signal.dropRepeats(new KeyMerge(downEvents,upEvents,blurEvents));++  function keySignal(f) {+    var signal = A2(Signal.lift, f, keysDown);+    // must set the default number of kids to make it possible to filter+    // these signals if they are not actually used.+    keysDown.defaultNumberOfKids += 1;+    signal.defaultNumberOfKids = 1;+    var filtered = Signal.dropRepeats(signal)+    filtered.defaultNumberOfKids = 0;+    return filtered;+  }++  function dir(up, down, left, right) {+    function f(ks) {+      var x = 0, y = 0;+      while (ks.ctor === "::") {+        switch (ks._0) {+          case left : --x; break;+          case right: ++x; break;+          case up   : ++y; break;+          case down : --y; break;+        }+        ks = ks._1;+      }+      return { _:{}, x:x, y:y };+    }+    return keySignal(f);+  }++  function is(key) { return keySignal(NList.member(key)); }++  var lastPressed = downEvents;++  return elm.Native.Keyboard.values = {+    isDown:is,+    directions:F4(dir),+    keysDown:keysDown,+    lastPressed:lastPressed+  };++};+Elm.Native.Mouse = {};+Elm.Native.Mouse.make = function(elm) {++    elm.Native = elm.Native || {};+    elm.Native.Mouse = elm.Native.Mouse || {};+    if (elm.Native.Mouse.values) return elm.Native.Mouse.values;++    var Signal = Elm.Signal.make(elm);+    var Utils = Elm.Native.Utils.make(elm);++    var position  = Signal.constant(Utils.Tuple2(0,0));+    position.defaultNumberOfKids = 2;++    // do not move x and y into Elm. By setting their default number+    // of kids, it is possible to detatch the mouse listeners if+    // they are not needed.+    var x = A2( Signal.lift, function(p){return p._0}, position);+    x.defaultNumberOfKids = 0;+    var y = A2( Signal.lift, function(p){return p._1}, position);+    y.defaultNumberOfKids = 0;++    var isDown    = Signal.constant(false);+    var isClicked = Signal.constant(false);+    var clicks = Signal.constant(Utils.Tuple0);++    var node = elm.display === ElmRuntime.Display.FULLSCREEN ? document : elm.node;++    elm.addListener([isClicked.id, clicks.id], node, 'click', function click() {+        elm.notify(isClicked.id, true);+        elm.notify(clicks.id, Utils.Tuple0);+        elm.notify(isClicked.id, false);+    });+    elm.addListener([isDown.id], node, 'mousedown', function down() {+        elm.notify(isDown.id, true);+    });+    elm.addListener([isDown.id], node, 'mouseup', function up() {+        elm.notify(isDown.id, false);+    });+    elm.addListener([position.id], node, 'mousemove', function move(e) {+        elm.notify(position.id, Utils.getXY(e));+    });++    return elm.Native.Mouse.values = {+        position: position,+        x:x,+        y:y,+        isClicked: isClicked,+        isDown: isDown,+        clicks: clicks+    };+};Elm.Native.Random = {};+Elm.Native.Random.make = function(elm) {++    elm.Native = elm.Native || {};+    elm.Native.Random = elm.Native.Random || {};+    if (elm.Native.Random.values) return elm.Native.Random.values;++    var Signal = Elm.Signal.make(elm);+    var List = Elm.Native.List.make(elm);++    function range(min, max, signal) {+        function f(x) { return Math.floor(Math.random() * (max-min+1)) + min; }+        return A2( Signal.lift, f, signal );+    }++    function float_(signal) {+        function f(x) { return Math.random(); }+        return A2( Signal.lift, f, signal );+    }++    function floatList(signal) {+        function f(n) {+            if (n < 0) return List.Nil;+            var arr = new Array(n);+            for (var i = n; i--; ) {+                arr[i] = Math.random();+            }+            return List.fromArray(arr);+        }+        return A2( Signal.lift, f, signal );+    }++    return elm.Native.Random.values = {+        range: F3(range),+        float_: float_,+        floatList: floatList+    };++};++Elm.Native.Signal = {};+Elm.Native.Signal.make = function(elm) {++  elm.Native = elm.Native || {};+  elm.Native.Signal = elm.Native.Signal || {};+  if (elm.Native.Signal.values) return elm.Native.Signal.values;++  var Utils = Elm.Native.Utils.make(elm);+  var foldr1 = Elm.List.make(elm).foldr1;++  function send(node, timestep, changed) {+    var kids = node.kids;+    for (var i = kids.length; i--; ) {+      kids[i].recv(timestep, changed, node.id);+    }+  }++  function Input(base) {+    this.id = Utils.guid();+    this.value = base;+    this.kids = [];+    this.defaultNumberOfKids = 0;+    this.recv = function(timestep, eid, v) {+      var changed = eid === this.id;+      if (changed) { this.value = v; }+      send(this, timestep, changed);+      return changed;+    };+    elm.inputs.push(this);+  }++  function LiftN(update, args) {+    this.id = Utils.guid();+    this.value = update();+    this.kids = [];++    var n = args.length;+    var count = 0;+    var isChanged = false;++    this.recv = function(timestep, changed, parentID) {+      ++count;+      if (changed) { isChanged = true; }+      if (count == n) {+        if (isChanged) { this.value = update(); }+        send(this, timestep, isChanged);+        isChanged = false;+        count = 0;+      }+    };+    for (var i = n; i--; ) { args[i].kids.push(this); }+  }++  function lift(func, a) {+    function update() { return func(a.value); }+    return new LiftN(update, [a]);+  }+  function lift2(func, a, b) {+    function update() { return A2( func, a.value, b.value ); }+    return new LiftN(update, [a,b]);+  }+  function lift3(func, a, b, c) {+    function update() { return A3( func, a.value, b.value, c.value ); }+    return new LiftN(update, [a,b,c]);+  }+  function lift4(func, a, b, c, d) {+    function update() { return A4( func, a.value, b.value, c.value, d.value ); }+    return new LiftN(update, [a,b,c,d]);+  }+  function lift5(func, a, b, c, d, e) {+    function update() { return A5( func, a.value, b.value, c.value, d.value, e.value ); }+    return new LiftN(update, [a,b,c,d,e]);+  }+  function lift6(func, a, b, c, d, e, f) {+    function update() { return A6( func, a.value, b.value, c.value, d.value, e.value, f.value ); }+    return new LiftN(update, [a,b,c,d,e,f]);+  }+  function lift7(func, a, b, c, d, e, f, g) {+    function update() { return A7( func, a.value, b.value, c.value, d.value, e.value, f.value, g.value ); }+    return new LiftN(update, [a,b,c,d,e,f,g]);+  }+  function lift8(func, a, b, c, d, e, f, g, h) {+    function update() { return A8( func, a.value, b.value, c.value, d.value, e.value, f.value, g.value, h.value ); }+    return new LiftN(update, [a,b,c,d,e,f,g,h]);+  }++  function Foldp(step, state, input) {+    this.id = Utils.guid();+    this.value = state;+    this.kids = [];++    this.recv = function(timestep, changed, parentID) {+      if (changed) {+          this.value = A2( step, input.value, this.value );+      }+      send(this, timestep, changed);+    };+    input.kids.push(this);+  }++  function foldp(step, state, input) {+      return new Foldp(step, state, input);+  }++  function DropIf(pred,base,input) {+    this.id = Utils.guid();+    this.value = pred(input.value) ? base : input.value;+    this.kids = [];+    this.recv = function(timestep, changed, parentID) {+      var chng = changed && !pred(input.value);+      if (chng) { this.value = input.value; }+      send(this, timestep, chng);+    };+    input.kids.push(this);+  }++  function DropRepeats(input) {+    this.id = Utils.guid();+    this.value = input.value;+    this.kids = [];+    this.recv = function(timestep, changed, parentID) {+      var chng = changed && !Utils.eq(this.value,input.value);+      if (chng) { this.value = input.value; }+      send(this, timestep, chng);+    };+    input.kids.push(this);+  }++  function dropWhen(s1,b,s2) {+    var pairs = lift2( F2(function(x,y){return {x:x,y:y};}), s1, s2 );+    var dropped = new DropIf(function(p){return p.x;},{x:true,y:b},pairs);+    return lift(function(p){return p.y;}, dropped);+  }++  function timestamp(a) {+    function update() { return Utils.Tuple2(Date.now(), a.value); }+    return new LiftN(update, [a]);+  }++  function SampleOn(s1,s2) {+    this.id = Utils.guid();+    this.value = s2.value;+    this.kids = [];++    var count = 0;+    var isChanged = false;++    this.recv = function(timestep, changed, parentID) {+      if (parentID === s1.id) isChanged = changed;+      ++count;+      if (count == 2) {+        if (isChanged) { this.value = s2.value; }+        send(this, timestep, isChanged);+        count = 0;+        isChanged = false;+      }+    };+    s1.kids.push(this);+    s2.kids.push(this);+  }++  function sampleOn(s1,s2) { return new SampleOn(s1,s2); }++  function delay(t,s) {+      var delayed = new Input(s.value);+      var firstEvent = true;+      function update(v) {+        if (firstEvent) { firstEvent = false; return; }+        setTimeout(function() { elm.notify(delayed.id, v); }, t);+      }+      function first(a,b) { return a; }+      return new SampleOn(delayed, lift2(F2(first), delayed, lift(update,s)));+  }++  function Merge(s1,s2) {+      this.id = Utils.guid();+      this.value = s1.value;+      this.kids = [];++      var next = null;+      var count = 0;+      var isChanged = false;++      this.recv = function(timestep, changed, parentID) {+        ++count;+        if (changed) {+            isChanged = true;+            if (parentID == s2.id && next === null) { next = s2.value; }+            if (parentID == s1.id) { next = s1.value; }+        }++        if (count == 2) {+            if (isChanged) { this.value = next; next = null; }+            send(this, timestep, isChanged);+            isChanged = false;+            count = 0;+        }+      };+      s1.kids.push(this);+      s2.kids.push(this);+  }++  function merge(s1,s2) { return new Merge(s1,s2); }+  function merges(ss) { return A2(foldr1, F2(merge), ss); }++  return elm.Native.Signal.values = {+    constant : function(v) { return new Input(v); },+    lift  : F2(lift ),+    lift2 : F3(lift2),+    lift3 : F4(lift3),+    lift4 : F5(lift4),+    lift5 : F6(lift5),+    lift6 : F7(lift6),+    lift7 : F8(lift7),+    lift8 : F9(lift8),+    foldp : F3(foldp),+    delay : F2(delay),+    merge : F2(merge),+    merges : merges,+    count : function(s) { return foldp(F2(function(_,c) { return c+1; }), 0, s); },+    countIf : F2(function(pred,s) {+      return foldp(F2(function(x,c){+        return pred(x) ? c+1 : c; }), 0, s)}),+    keepIf : F3(function(pred,base,sig) {+      return new DropIf(function(x) {return !pred(x);},base,sig); }),+    dropIf : F3(function(pred,base,sig) { return new DropIf(pred,base,sig); }),+    keepWhen : F3(function(s1,b,s2) {+      return dropWhen(lift(function(b){return !b;},s1), b, s2); }),+    dropWhen : F3(dropWhen),+    dropRepeats : function(s) { return new DropRepeats(s);},+    sampleOn : F2(sampleOn),+    timestamp : timestamp+  };+};+Elm.Native.Time = {};+Elm.Native.Time.make = function(elm) {++  elm.Native = elm.Native || {};+  elm.Native.Time = elm.Native.Time || {};+  if (elm.Native.Time.values) return elm.Native.Time.values;++  var Signal = Elm.Signal.make(elm);+  var NS = Elm.Native.Signal.make(elm);+  var Maybe = Elm.Maybe.make(elm);+  var Utils = Elm.Native.Utils.make(elm);++  function fpsWhen(desiredFPS, isOn) {+    var msPerFrame = 1000 / desiredFPS;+    var prev = Date.now(), curr = prev, diff = 0, wasOn = true;+    var ticker = Signal.constant(diff);+    function tick(zero) { return function() {+        curr = Date.now();+        diff = zero ? 0 : curr - prev;+        prev = curr;+        elm.notify(ticker.id, diff);+      };+    }+    var timeoutID = 0;+    function f(isOn, t) {+      if (isOn) {+        timeoutID = setTimeout(tick(!wasOn && isOn), msPerFrame);+      } else if (wasOn) {+        clearTimeout(timeoutID);+      }+      wasOn = isOn;+      return t;+    }+    return A3( Signal.lift2, F2(f), isOn, ticker );+  }++  function every(t) {+    var clock = Signal.constant(Date.now());+    setInterval(function() {+        elm.notify(clock.id, Date.now());+    }, t);+    return clock;+  }++  function since(t, s) {+    function cmp(a,b) { return !Utils.eq(a,b); }+    var dcount = Signal.count(A2(NS.delay, t, s));+    return A3( Signal.lift2, F2(cmp), Signal.count(s), dcount );+  }+  function read(s) {+      var t = Date.parse(s);+      return isNaN(t) ? Maybe.Nothing : Maybe.Just(t);+  }+  return elm.Native.Time.values = {+      fpsWhen : F2(fpsWhen),+      fps : function(t) { return fpsWhen(t, Signal.constant(true)); },+      every : every,+      delay : NS.delay,+      timestamp : NS.timestamp,+      since : F2(since),+      toDate : function(t) { return new window.Date(t); },+      read   : read+  };++};+Elm.Native.Touch = {};+Elm.Native.Touch.make = function(elm) {++    elm.Native = elm.Native || {};+    elm.Native.Touch = elm.Native.Touch || {};+    if (elm.Native.Touch.values) return elm.Native.Touch.values;++    var Signal = Elm.Signal.make(elm);+    var JS = Elm.JavaScript.make(elm);+    var Utils = Elm.Native.Utils.make(elm);++    function Dict() {+        this.keys = [];+        this.values = [];++        this.insert = function(key,value) {+            this.keys.push(key);+            this.values.push(value);+        };+        this.lookup = function(key) {+            var i = this.keys.indexOf(key)+            return i >= 0 ? this.values[i] : {x:0,y:0,t:0};+        };+        this.remove = function(key) {+            var i = this.keys.indexOf(key);+            if (i < 0) return;+            var t = this.values[i];+            this.keys.splice(i,1);+            this.values.splice(i,1);+            return t;+        };+        this.clear = function() {+            this.keys = [];+            this.values = [];+        };+    }+    +    var root = Signal.constant([]),+    tapTime = 500,+    hasTap = false,+    tap = {_:{},x:0,y:0},+    dict = new Dict();++    function touch(t) {+        var r = dict.lookup(t.identifier);+        var point = Utils.getXY(t);+        return {_ : {},+	        id: t.identifier,+	        x : point._0,+	        y : point._1,+	        x0: r.x,+	        y0: r.y,+	        t0: r.t+	       };+    }++    var node = elm.display === ElmRuntime.Display.FULLSCREEN ? document : elm.node;++    function start(e) {+        var point = Utils.getXY(e);+        dict.insert(e.identifier,+                    {x: point._0,+                     y: point._1,+                     t: Date.now()});+    }+    function end(e) {+        var t = dict.remove(e.identifier);+        if (Date.now() - t.t < tapTime) {+            hasTap = true;+            tap = {_:{}, x:t.x, y:t.y};+        }+    }++    function listen(name, f) {+        function update(e) {+            for (var i = e.changedTouches.length; i--; ) { f(e.changedTouches[i]); }+            var ts = new Array(e.touches.length);+            for (var i = e.touches.length; i--; ) { ts[i] = touch(e.touches[i]); }+            elm.notify(root.id, ts);+            e.preventDefault();+        }+        elm.addListener([root.id], node, name, update);+    }++    listen("touchstart", start);+    listen("touchmove", function(_){});+    listen("touchend", end);+    listen("touchcancel", end);+    listen("touchleave", end);++    var mouseID = -1;+    function move(e) {+        var point = Utils.getXY(e);+        for (var i = root.value.length; i--; ) {+            if (root.value[i].id === mouseID) {+                root.value[i].x = point._0;+                root.value[i].y = point._1;+                elm.notify(root.id, root.value);+                break;+            }+        }+    }+    elm.addListener([root.id], node, "mousedown", function down(e) {+        node.addEventListener("mousemove", move);+        e.identifier = mouseID;+        start(e);+        root.value.push(touch(e));+        elm.notify(root.id, root.value);+    });+    elm.addListener([root.id], node, "mouseup", function up(e) {+        node.removeEventListener("mousemove", move);+        e.identifier = mouseID;+        end(e);+        for (var i = root.value.length; i--; ) {+            if (root.value[i].id === mouseID) {+                root.value.splice(i, 1);+                --mouseID;+                break;+            }+        }+        elm.notify(root.id, root.value);+    });+    elm.addListener([root.id], node, "blur", function blur(e) {+        node.removeEventListener("mousemove", move);+        if (root.value.length > 0) {+            elm.notify(root.id, []);+            --mouseID;+        }+        dict.clear();+    });++    function dependency(f) {+        var sig = A2( Signal.lift, f, root );+        root.defaultNumberOfKids += 1;+        sig.defaultNumberOfKids = 0;+        return sig;+    }++    var touches = dependency(JS.toList);++    var taps = function() {+        var sig = dependency(function(_) { return tap; });+        sig.defaultNumberOfKids = 1;+        function pred(_) { var b = hasTap; hasTap = false; return b; }+        var sig2 = A3( Signal.keepIf, pred, {_:{},x:0,y:0}, sig);+        sig2.defaultNumberOfKids = 0;+        return sig2;+    }();++    return elm.Native.Touch.values = { touches: touches, taps: taps };++};Elm.Native.WebSocket = {};+Elm.Native.WebSocket.make = function(elm) {++  elm.Native = elm.Native || {};+  elm.Native.WebSocket = elm.Native.WebSocket || {};+  if (elm.Native.WebSocket.values) return elm.Native.WebSocket.values;++  var Signal = Elm.Signal.make(elm);+  var JS = Elm.JavaScript.make(elm);+  var List = Elm.Native.List.make(elm);++  function open(url, outgoing) {+    var incoming = Signal.constant(List.Nil);+    var ws = new WebSocket(JS.fromString(url));++    var pending = [];+    var ready = false;+    +    ws.onopen = function(e) {+      var len = pending.length;+      for (var i = 0; i < len; ++i) { ws.send(pending[i]); }+      ready = true;+    };+    ws.onmessage = function(event) {+      elm.notify(incoming.id, JS.toString(event.data));+    };+    +    function send(msg) {+      var s = JS.fromString(msg);+      ready ? ws.send(s) : pending.push(s);+    }+    +    function take1(x,y) { return x }+    return A3(Signal.lift2, F2(take1), incoming, A2(Signal.lift, send, outgoing));+  }++  return elm.Native.WebSocket.values = { connect: F2(open) };+};+Elm.Native.Window = {};+Elm.Native.Window.make = function(elm) {++  elm.Native = elm.Native || {};+  elm.Native.Window = elm.Native.Window || {};+  if (elm.Native.Window.values) return elm.Native.Window.values;++  var Signal = Elm.Signal.make(elm);+  var Tuple2 = Elm.Native.Utils.make(elm).Tuple2;++  function getWidth() { return elm.node.clientWidth; }+  function getHeight() {+      if (elm.display === ElmRuntime.Display.FULLSCREEN) {+          return window.innerHeight;+      }+      return elm.node.clientHeight;+  }++  var dimensions = Signal.constant(Tuple2(getWidth(), getHeight()));+  dimensions.defaultNumberOfKids = 2;++  // Do not move width and height into Elm. By setting the default number of kids,+  // the resize listener can be detached.+  var width  = A2(Signal.lift, function(p){return p._0;}, dimensions);+  width.defaultNumberOfKids = 0;++  var height = A2(Signal.lift, function(p){return p._1;}, dimensions);+  height.defaultNumberOfKids = 0;++  function resizeIfNeeded() {+      // Do not trigger event if the dimensions have not changed.+      // This should be most of the time.+      var w = getWidth();+      var h = getHeight();+      if (dimensions.value._0 === w && dimensions.value._1 === h) return;++      setTimeout(function () {+          // Check again to see if the dimensions have changed.+          // It is conceivable that the dimensions have changed+          // again while some other event was being processed.+          var w = getWidth();+          var h = getHeight();+          if (dimensions.value._0 === w && dimensions.value._1 === h) return;+          elm.notify(dimensions.id, Tuple2(w,h));+      }, 0);+  }+  elm.addListener([dimensions.id], window, 'resize', resizeIfNeeded);++  return elm.Native.Window.values = {+      dimensions:dimensions,+      width:width,+      height:height,+      resizeIfNeeded:resizeIfNeeded+  };++};+Elm.Basics = Elm.Basics || {};+Elm.Basics.make = function (_elm)+                  {+                    _elm.Basics = _elm.Basics || {};+                    if (_elm.Basics.values)+                    return _elm.Basics.values+                    var _N = Elm.Native,+                        _U = _N.Utils.make(_elm),+                        _L = _N.List.make(_elm),+                        _E = _N.Error.make(_elm),+                        _J = _N.JavaScript.make(_elm),+                        $moduleName = "Basics";+                    var Native = Native || {};+                    Native.Basics = Elm.Native.Basics.make(_elm);+                    var _op = {};+                    var uncurry = F2(function (f,_v0)+                                     {+                                       return function ()+                                              {+                                                switch (_v0.ctor)+                                                {case+                                                 "_Tuple2" :+                                                   return A2(f,_v0._0,_v0._1)}+                                                _E.Case($moduleName,"on line 354, column 19 to 24");+                                              }()+                                     });+                    var curry = F3(function (f,a,b)+                                   {+                                     return f({ctor: "_Tuple2", _0: a, _1: b})+                                   });+                    var flip = F3(function (f,b,a)+                                  {+                                    return A2(f,a,b)+                                  });+                    var snd = function (_v4)+                              {+                                return function ()+                                       {+                                         switch (_v4.ctor)+                                         {case+                                          "_Tuple2" :+                                            return _v4._1}+                                         _E.Case($moduleName,"on line 338, column 13 to 14");+                                       }()+                              };+                    var fst = function (_v8)+                              {+                                return function ()+                                       {+                                         switch (_v8.ctor)+                                         {case+                                          "_Tuple2" :+                                            return _v8._0}+                                         _E.Case($moduleName,"on line 334, column 13 to 14");+                                       }()+                              };+                    var always = F2(function (a,_v12)+                                    {+                                      return function ()+                                             {+                                               return a+                                             }()+                                    });+                    var id = function (x)+                             {+                               return x+                             };+                    _op["<|"] = F2(function (f,x)+                                   {+                                     return f(x)+                                   });+                    _op["|>"] = F2(function (x,f)+                                   {+                                     return f(x)+                                   });+                    _op["."] = F3(function (f,g,x)+                                  {+                                    return f(g(x))+                                  });+                    var toFloat = Native.Basics.toFloat;+                    var ceiling = Native.Basics.ceiling;+                    var floor = Native.Basics.floor;+                    var truncate = Native.Basics.truncate;+                    var round = Native.Basics.round;+                    var otherwise = true;+                    var not = Native.Basics.not;+                    var xor = Native.Basics.xor;+                    _op["||"] = Native.Basics.or;+                    _op["&&"] = Native.Basics.and;+                    var max = Native.Basics.max;+                    var min = Native.Basics.min;+                    var GT = {ctor: "GT"};+                    var EQ = {ctor: "EQ"};+                    var LT = {ctor: "LT"};+                    var compare = Native.Basics.compare;+                    _op[">="] = Native.Basics.ge;+                    _op["<="] = Native.Basics.le;+                    _op[">"] = Native.Basics.gt;+                    _op["<"] = Native.Basics.lt;+                    _op["/="] = Native.Basics.neq;+                    _op["=="] = Native.Basics.eq;+                    var e = Native.Basics.e;+                    var pi = Native.Basics.pi;+                    var clamp = Native.Basics.clamp;+                    var logBase = Native.Basics.logBase;+                    var abs = Native.Basics.abs;+                    var sqrt = Native.Basics.sqrt;+                    var atan2 = Native.Basics.atan2;+                    var atan = Native.Basics.atan;+                    var asin = Native.Basics.asin;+                    var acos = Native.Basics.acos;+                    var tan = Native.Basics.tan;+                    var sin = Native.Basics.sin;+                    var cos = Native.Basics.cos;+                    _op["^"] = Native.Basics.exp;+                    var mod = Native.Basics.mod;+                    var rem = Native.Basics.rem;+                    var div = Native.Basics.div;+                    _op["/"] = Native.Basics.floatDiv;+                    _op["*"] = Native.Basics.mul;+                    _op["-"] = Native.Basics.sub;+                    _op["+"] = Native.Basics.add;+                    var toPolar = function (_v14)+                                  {+                                    return function ()+                                           {+                                             switch (_v14.ctor)+                                             {case+                                              "_Tuple2" :+                                                return {ctor: "_Tuple2", _0: Native.Basics.sqrt(Math.pow(_v14._0,+                                                                                                         2) + Math.pow(_v14._1,+                                                                                                                       2)), _1: A2(Native.Basics.atan2,+                                                                                                                                   _v14._1,+                                                                                                                                   _v14._0)}}+                                             _E.Case($moduleName,"on line 76, column 18 to 73");+                                           }()+                                  };+                    var fromPolar = function (_v18)+                                    {+                                      return function ()+                                             {+                                               switch (_v18.ctor)+                                               {case+                                                "_Tuple2" :+                                                  return {ctor: "_Tuple2", _0: _v18._0 * Native.Basics.cos(_v18._1), _1: _v18._0 * Native.Basics.sin(_v18._1)}}+                                               _E.Case($moduleName,"on line 70, column 20 to 68");+                                             }()+                                    };+                    var turns = function (r)+                                {+                                  return 2 * Native.Basics.pi * r+                                };+                    var degrees = function (d)+                                  {+                                    return d * Native.Basics.pi / 180+                                  };+                    var radians = function (t)+                                  {+                                    return t+                                  };+                    _elm.Basics.values = {_op: _op, radians: radians, degrees: degrees, turns: turns, fromPolar: fromPolar, toPolar: toPolar, div: div, rem: rem, mod: mod, cos: cos, sin: sin, tan: tan, acos: acos, asin: asin, atan: atan, atan2: atan2, sqrt: sqrt, abs: abs, logBase: logBase, clamp: clamp, pi: pi, e: e, compare: compare, min: min, max: max, xor: xor, not: not, otherwise: otherwise, round: round, truncate: truncate, floor: floor, ceiling: ceiling, toFloat: toFloat, id: id, always: always, fst: fst, snd: snd, flip: flip, curry: curry, uncurry: uncurry, LT: LT, EQ: EQ, GT: GT};+                    return _elm.Basics.values+                  };Elm.Bitwise = Elm.Bitwise || {};+Elm.Bitwise.make = function (_elm)+                   {+                     _elm.Bitwise = _elm.Bitwise || {};+                     if (_elm.Bitwise.values)+                     return _elm.Bitwise.values+                     var _N = Elm.Native,+                         _U = _N.Utils.make(_elm),+                         _L = _N.List.make(_elm),+                         _E = _N.Error.make(_elm),+                         _J = _N.JavaScript.make(_elm),+                         $moduleName = "Bitwise";+                     var Native = Native || {};+                     Native.Bitwise = Elm.Native.Bitwise.make(_elm);+                     var _op = {};+                     var shiftRightLogical = Native.Bitwise.shiftRightLogical;+                     var shiftRight = Native.Bitwise.shiftRightArithmatic;+                     var shiftLeft = Native.Bitwise.shiftLeft;+                     var complement = Native.Bitwise.complement;+                     var xor = Native.Bitwise.xor;+                     var or = Native.Bitwise.or;+                     var and = Native.Bitwise.and;+                     _elm.Bitwise.values = {_op: _op, and: and, or: or, xor: xor, complement: complement, shiftLeft: shiftLeft, shiftRight: shiftRight, shiftRightLogical: shiftRightLogical};+                     return _elm.Bitwise.values+                   };Elm.Char = Elm.Char || {};+Elm.Char.make = function (_elm)+                {+                  _elm.Char = _elm.Char || {};+                  if (_elm.Char.values)+                  return _elm.Char.values+                  var _N = Elm.Native,+                      _U = _N.Utils.make(_elm),+                      _L = _N.List.make(_elm),+                      _E = _N.Error.make(_elm),+                      _J = _N.JavaScript.make(_elm),+                      $moduleName = "Char";+                  var Native = Native || {};+                  Native.Char = Elm.Native.Char.make(_elm);+                  var _op = {};+                  var fromCode = Native.Char.fromCode;+                  var toCode = Native.Char.toCode;+                  var toLocaleLower = Native.Char.toLocaleLower;+                  var toLocaleUpper = Native.Char.toLocaleUpper;+                  var toLower = Native.Char.toLower;+                  var toUpper = Native.Char.toUpper;+                  var isHexDigit = Native.Char.isHexDigit;+                  var isOctDigit = Native.Char.isOctDigit;+                  var isDigit = Native.Char.isDigit;+                  var isLower = Native.Char.isLower;+                  var isUpper = Native.Char.isUpper;+                  _elm.Char.values = {_op: _op, isUpper: isUpper, isLower: isLower, isDigit: isDigit, isOctDigit: isOctDigit, isHexDigit: isHexDigit, toUpper: toUpper, toLower: toLower, toLocaleUpper: toLocaleUpper, toLocaleLower: toLocaleLower, toCode: toCode, fromCode: fromCode};+                  return _elm.Char.values+                };Elm.Color = Elm.Color || {};+Elm.Color.make = function (_elm)+                 {+                   _elm.Color = _elm.Color || {};+                   if (_elm.Color.values)+                   return _elm.Color.values+                   var _N = Elm.Native,+                       _U = _N.Utils.make(_elm),+                       _L = _N.List.make(_elm),+                       _E = _N.Error.make(_elm),+                       _J = _N.JavaScript.make(_elm),+                       $moduleName = "Color";+                   var Basics = Elm.Basics.make(_elm);+                   var Native = Native || {};+                   Native.Color = Elm.Native.Color.make(_elm);+                   var _op = {};+                   var Radial = F5(function (a,b,c,d,e)+                                   {+                                     return {ctor: "Radial", _0: a, _1: b, _2: c, _3: d, _4: e}+                                   });+                   var radial = Radial;+                   var Linear = F3(function (a,b,c)+                                   {+                                     return {ctor: "Linear", _0: a, _1: b, _2: c}+                                   });+                   var linear = Linear;+                   var hsv = Native.Color.hsv;+                   var hsva = Native.Color.hsva;+                   var complement = Native.Color.complement;+                   var greyscale = function (p)+                                   {+                                     return A3(hsv,0,0,1 - p)+                                   };+                   var grayscale = function (p)+                                   {+                                     return A3(hsv,0,0,1 - p)+                                   };+                   var Color = F4(function (a,b,c,d)+                                  {+                                    return {ctor: "Color", _0: a, _1: b, _2: c, _3: d}+                                  });+                   var rgba = Color;+                   var rgb = F3(function (r,g,b)+                                {+                                  return A4(Color,r,g,b,1)+                                });+                   var lightRed = A4(Color,239,41,41,1);+                   var red = A4(Color,204,0,0,1);+                   var darkRed = A4(Color,164,0,0,1);+                   var lightOrange = A4(Color,252,175,62,1);+                   var orange = A4(Color,245,121,0,1);+                   var darkOrange = A4(Color,206,92,0,1);+                   var lightYellow = A4(Color,255,233,79,1);+                   var yellow = A4(Color,237,212,0,1);+                   var darkYellow = A4(Color,196,160,0,1);+                   var lightGreen = A4(Color,138,226,52,1);+                   var green = A4(Color,115,210,22,1);+                   var darkGreen = A4(Color,78,154,6,1);+                   var lightBlue = A4(Color,114,159,207,1);+                   var blue = A4(Color,52,101,164,1);+                   var darkBlue = A4(Color,32,74,135,1);+                   var lightPurple = A4(Color,173,127,168,1);+                   var purple = A4(Color,117,80,123,1);+                   var darkPurple = A4(Color,92,53,102,1);+                   var lightBrown = A4(Color,233,185,110,1);+                   var brown = A4(Color,193,125,17,1);+                   var darkBrown = A4(Color,143,89,2,1);+                   var black = A4(Color,0,0,0,1);+                   var white = A4(Color,255,255,255,1);+                   var lightGrey = A4(Color,238,238,236,1);+                   var grey = A4(Color,211,215,207,1);+                   var darkGrey = A4(Color,186,189,182,1);+                   var lightGray = A4(Color,238,238,236,1);+                   var gray = A4(Color,211,215,207,1);+                   var darkGray = A4(Color,186,189,182,1);+                   var lightCharcoal = A4(Color,136,138,133,1);+                   var charcoal = A4(Color,85,87,83,1);+                   var darkCharcoal = A4(Color,46,52,54,1);+                   _elm.Color.values = {_op: _op, rgba: rgba, rgb: rgb, lightRed: lightRed, red: red, darkRed: darkRed, lightOrange: lightOrange, orange: orange, darkOrange: darkOrange, lightYellow: lightYellow, yellow: yellow, darkYellow: darkYellow, lightGreen: lightGreen, green: green, darkGreen: darkGreen, lightBlue: lightBlue, blue: blue, darkBlue: darkBlue, lightPurple: lightPurple, purple: purple, darkPurple: darkPurple, lightBrown: lightBrown, brown: brown, darkBrown: darkBrown, black: black, white: white, lightGrey: lightGrey, grey: grey, darkGrey: darkGrey, lightGray: lightGray, gray: gray, darkGray: darkGray, lightCharcoal: lightCharcoal, charcoal: charcoal, darkCharcoal: darkCharcoal, grayscale: grayscale, greyscale: greyscale, complement: complement, hsva: hsva, hsv: hsv, linear: linear, radial: radial, Color: Color, Linear: Linear, Radial: Radial};+                   return _elm.Color.values+                 };Elm.Date = Elm.Date || {};+Elm.Date.make = function (_elm)+                {+                  _elm.Date = _elm.Date || {};+                  if (_elm.Date.values)+                  return _elm.Date.values+                  var _N = Elm.Native,+                      _U = _N.Utils.make(_elm),+                      _L = _N.List.make(_elm),+                      _E = _N.Error.make(_elm),+                      _J = _N.JavaScript.make(_elm),+                      $moduleName = "Date";+                  var Maybe = Elm.Maybe.make(_elm);+                  var Native = Native || {};+                  Native.Date = Elm.Native.Date.make(_elm);+                  var Time = Elm.Time.make(_elm);+                  var _op = {};+                  var second = Native.Date.second;+                  var minute = Native.Date.minute;+                  var hour = Native.Date.hour;+                  var dayOfWeek = Native.Date.dayOfWeek;+                  var day = Native.Date.day;+                  var month = Native.Date.month;+                  var year = Native.Date.year;+                  var toTime = Native.Date.toTime;+                  var read = Native.Date.read;+                  var Dec = {ctor: "Dec"};+                  var Nov = {ctor: "Nov"};+                  var Oct = {ctor: "Oct"};+                  var Sep = {ctor: "Sep"};+                  var Aug = {ctor: "Aug"};+                  var Jul = {ctor: "Jul"};+                  var Jun = {ctor: "Jun"};+                  var May = {ctor: "May"};+                  var Apr = {ctor: "Apr"};+                  var Mar = {ctor: "Mar"};+                  var Feb = {ctor: "Feb"};+                  var Jan = {ctor: "Jan"};+                  var Sun = {ctor: "Sun"};+                  var Sat = {ctor: "Sat"};+                  var Fri = {ctor: "Fri"};+                  var Thu = {ctor: "Thu"};+                  var Wed = {ctor: "Wed"};+                  var Tue = {ctor: "Tue"};+                  var Mon = {ctor: "Mon"};+                  var Date = {ctor: "Date"};+                  _elm.Date.values = {_op: _op, read: read, toTime: toTime, year: year, month: month, day: day, dayOfWeek: dayOfWeek, hour: hour, minute: minute, second: second, Date: Date, Mon: Mon, Tue: Tue, Wed: Wed, Thu: Thu, Fri: Fri, Sat: Sat, Sun: Sun, Jan: Jan, Feb: Feb, Mar: Mar, Apr: Apr, May: May, Jun: Jun, Jul: Jul, Aug: Aug, Sep: Sep, Oct: Oct, Nov: Nov, Dec: Dec};+                  return _elm.Date.values+                };Elm.Dict = Elm.Dict || {};+Elm.Dict.make = function (_elm)+                {+                  _elm.Dict = _elm.Dict || {};+                  if (_elm.Dict.values)+                  return _elm.Dict.values+                  var _N = Elm.Native,+                      _U = _N.Utils.make(_elm),+                      _L = _N.List.make(_elm),+                      _E = _N.Error.make(_elm),+                      _J = _N.JavaScript.make(_elm),+                      $moduleName = "Dict";+                  var Basics = Elm.Basics.make(_elm);+                  var List = Elm.List.make(_elm);+                  var Maybe = Elm.Maybe.make(_elm);+                  var Native = Native || {};+                  Native.Error = Elm.Native.Error.make(_elm);+                  var Native = Native || {};+                  Native.Utils = Elm.Native.Utils.make(_elm);+                  var String = Elm.String.make(_elm);+                  var _op = {};+                  var Same = {ctor: "Same"};+                  var Remove = {ctor: "Remove"};+                  var Insert = {ctor: "Insert"};+                  var showFlag = function (f)+                                 {+                                   return function ()+                                          {+                                            switch (f.ctor)+                                            {case+                                             "Insert" :+                                               return "Insert"+                                             case+                                             "Remove" :+                                               return "Remove"+                                             case+                                             "Same" :+                                               return "Same"}+                                            _E.Case($moduleName,"between lines 137 and 142");+                                          }()+                                 };+                  var RBEmpty = function (a)+                                {+                                  return {ctor: "RBEmpty", _0: a}+                                };+                  var RBNode = F5(function (a,b,c,d,e)+                                  {+                                    return {ctor: "RBNode", _0: a, _1: b, _2: c, _3: d, _4: e}+                                  });+                  var max = function (t)+                            {+                              return function ()+                                     {+                                       switch (t.ctor)+                                       {case+                                        "RBEmpty" :+                                          return Native.Error.raise("(max Empty) is not defined")+                                        case+                                        "RBNode" :+                                          switch (t._4.ctor)+                                          {case+                                           "RBEmpty" :+                                             return {ctor: "_Tuple2", _0: t._1, _1: t._2}}+                                          return max(t._4)}+                                       _E.Case($moduleName,"between lines 83 and 88");+                                     }()+                            };+                  var LBBlack = {ctor: "LBBlack"};+                  var LBlack = {ctor: "LBlack"};+                  var showLColor = function (c)+                                   {+                                     return function ()+                                            {+                                              switch (c.ctor)+                                              {case+                                               "LBBlack" :+                                                 return "LBBlack"+                                               case+                                               "LBlack" :+                                                 return "LBlack"}+                                              _E.Case($moduleName,"between lines 63 and 65");+                                            }()+                                   };+                  var empty = RBEmpty(LBlack);+                  var min = function (t)+                            {+                              return function ()+                                     {+                                       switch (t.ctor)+                                       {case+                                        "RBEmpty" :+                                          switch (t._0.ctor)+                                          {case+                                           "LBlack" :+                                             return Native.Error.raise("(min Empty) is not defined")}+                                          break;+                                        case+                                        "RBNode" :+                                          switch (t._3.ctor)+                                          {case+                                           "RBEmpty" :+                                             switch (t._3._0.ctor)+                                             {case+                                              "LBlack" :+                                                return {ctor: "_Tuple2", _0: t._1, _1: t._2}}+                                             break;}+                                          return min(t._3)}+                                       _E.Case($moduleName,"between lines 76 and 79");+                                     }()+                            };+                  var lookup = F2(function (k,t)+                                  {+                                    return function ()+                                           {+                                             switch (t.ctor)+                                             {case+                                              "RBEmpty" :+                                                switch (t._0.ctor)+                                                {case+                                                 "LBlack" :+                                                   return Maybe.Nothing}+                                                break;+                                              case+                                              "RBNode" :+                                                return function ()+                                                       {+                                                         var _v25 = A2(Native.Utils.compare,k,t._1);+                                                         switch (_v25.ctor)+                                                         {case+                                                          "EQ" :+                                                            return Maybe.Just(t._2)+                                                          case+                                                          "GT" :+                                                            return A2(lookup,k,t._4)+                                                          case+                                                          "LT" :+                                                            return A2(lookup,k,t._3)}+                                                         _E.Case($moduleName,+                                                                 "between lines 94 and 100");+                                                       }()}+                                             _E.Case($moduleName,"between lines 91 and 100");+                                           }()+                                  });+                  var member = F2(function (k,t)+                                  {+                                    return Maybe.isJust(A2(lookup,k,t))+                                  });+                  var findWithDefault = F3(function (base,k,t)+                                           {+                                             return function ()+                                                    {+                                                      switch (t.ctor)+                                                      {case+                                                       "RBEmpty" :+                                                         switch (t._0.ctor)+                                                         {case+                                                          "LBlack" :+                                                            return base}+                                                         break;+                                                       case+                                                       "RBNode" :+                                                         return function ()+                                                                {+                                                                  var _v33 = A2(Native.Utils.compare,+                                                                                k,+                                                                                t._1);+                                                                  switch (_v33.ctor)+                                                                  {case+                                                                   "EQ" :+                                                                     return t._2+                                                                   case+                                                                   "GT" :+                                                                     return A3(findWithDefault,+                                                                               base,+                                                                               k,+                                                                               t._4)+                                                                   case+                                                                   "LT" :+                                                                     return A3(findWithDefault,+                                                                               base,+                                                                               k,+                                                                               t._3)}+                                                                  _E.Case($moduleName,+                                                                          "between lines 106 and 111");+                                                                }()}+                                                      _E.Case($moduleName,+                                                              "between lines 103 and 111");+                                                    }()+                                           });+                  var map = F2(function (f,t)+                               {+                                 return function ()+                                        {+                                          switch (t.ctor)+                                          {case+                                           "RBEmpty" :+                                             switch (t._0.ctor)+                                             {case+                                              "LBlack" :+                                                return RBEmpty(LBlack)}+                                             break;+                                           case+                                           "RBNode" :+                                             return A5(RBNode,+                                                       t._0,+                                                       t._1,+                                                       f(t._2),+                                                       A2(map,f,t._3),+                                                       A2(map,f,t._4))}+                                          _E.Case($moduleName,"between lines 303 and 308");+                                        }()+                               });+                  var foldl = F3(function (f,acc,t)+                                 {+                                   return function ()+                                          {+                                            switch (t.ctor)+                                            {case+                                             "RBEmpty" :+                                               switch (t._0.ctor)+                                               {case+                                                "LBlack" :+                                                  return acc}+                                               break;+                                             case+                                             "RBNode" :+                                               return A3(foldl,+                                                         f,+                                                         A3(f,t._1,t._2,A3(foldl,f,acc,t._3)),+                                                         t._4)}+                                            _E.Case($moduleName,"between lines 311 and 316");+                                          }()+                                 });+                  var foldr = F3(function (f,acc,t)+                                 {+                                   return function ()+                                          {+                                            switch (t.ctor)+                                            {case+                                             "RBEmpty" :+                                               switch (t._0.ctor)+                                               {case+                                                "LBlack" :+                                                  return acc}+                                               break;+                                             case+                                             "RBNode" :+                                               return A3(foldr,+                                                         f,+                                                         A3(f,t._1,t._2,A3(foldr,f,acc,t._4)),+                                                         t._3)}+                                            _E.Case($moduleName,"between lines 319 and 324");+                                          }()+                                 });+                  var keys = function (t)+                             {+                               return A3(foldr,+                                         F3(function (k,v,acc)+                                            {+                                              return {ctor: "::", _0: k, _1: acc}+                                            }),+                                         _J.toList([]),+                                         t)+                             };+                  var values = function (t)+                               {+                                 return A3(foldr,+                                           F3(function (k,v,acc)+                                              {+                                                return {ctor: "::", _0: v, _1: acc}+                                              }),+                                           _J.toList([]),+                                           t)+                               };+                  var toList = function (t)+                               {+                                 return A3(foldr,+                                           F3(function (k,v,acc)+                                              {+                                                return {ctor: "::", _0: {ctor: "_Tuple2", _0: k, _1: v}, _1: acc}+                                              }),+                                           _J.toList([]),+                                           t)+                               };+                  var NBlack = {ctor: "NBlack"};+                  var BBlack = {ctor: "BBlack"};+                  var isBBlack = function (t)+                                 {+                                   return function ()+                                          {+                                            switch (t.ctor)+                                            {case+                                             "RBEmpty" :+                                               switch (t._0.ctor)+                                               {case+                                                "LBBlack" :+                                                  return true}+                                               break;+                                             case+                                             "RBNode" :+                                               switch (t._0.ctor)+                                               {case+                                                "BBlack" :+                                                  return true}+                                               break;}+                                            return false+                                          }()+                                 };+                  var Black = {ctor: "Black"};+                  var blackish = function (t)+                                 {+                                   return function ()+                                          {+                                            switch (t.ctor)+                                            {case+                                             "RBEmpty" :+                                               return true+                                             case+                                             "RBNode" :+                                               return _U.eq(t._0,Black) || _U.eq(t._0,BBlack)}+                                            _E.Case($moduleName,"between lines 254 and 256");+                                          }()+                                 };+                  var blacken = function (t)+                                {+                                  return function ()+                                         {+                                           switch (t.ctor)+                                           {case+                                            "RBEmpty" :+                                              return RBEmpty(LBlack)+                                            case+                                            "RBNode" :+                                              return A5(RBNode,Black,t._1,t._2,t._3,t._4)}+                                           _E.Case($moduleName,"between lines 290 and 292");+                                         }()+                                };+                  var Red = {ctor: "Red"};+                  var showNColor = function (c)+                                   {+                                     return function ()+                                            {+                                              switch (c.ctor)+                                              {case+                                               "BBlack" :+                                                 return "BBlack"+                                               case+                                               "Black" :+                                                 return "Black"+                                               case+                                               "NBlack" :+                                                 return "NBlack"+                                               case+                                               "Red" :+                                                 return "Red"}+                                              _E.Case($moduleName,"between lines 52 and 56");+                                            }()+                                   };+                  var reportRemBug = F4(function (msg,c,lgot,rgot)+                                        {+                                          return Native.Error.raise(String.concat(_J.toList(["Internal red-black tree invariant violated, expected ",+                                                                                             msg,+                                                                                             "and got",+                                                                                             showNColor(c),+                                                                                             " ",+                                                                                             lgot,+                                                                                             " ",+                                                                                             rgot,+                                                                                             "\nPlease report this bug to https://github.com/evancz/Elm/issues"])))+                                        });+                  var ensureBlackRoot = function (t)+                                        {+                                          return function ()+                                                 {+                                                   switch (t.ctor)+                                                   {case+                                                    "RBEmpty" :+                                                      switch (t._0.ctor)+                                                      {case+                                                       "LBlack" :+                                                         return t}+                                                      break;+                                                    case+                                                    "RBNode" :+                                                      switch (t._0.ctor)+                                                      {case+                                                       "Black" :+                                                         return t+                                                       case+                                                       "Red" :+                                                         return A5(RBNode,+                                                                   Black,+                                                                   t._1,+                                                                   t._2,+                                                                   t._3,+                                                                   t._4)}+                                                      break;}+                                                   _E.Case($moduleName,"between lines 118 and 124");+                                                 }()+                                        };+                  var moreBlack = function (c)+                                  {+                                    return function ()+                                           {+                                             switch (c.ctor)+                                             {case+                                              "BBlack" :+                                                return Native.Error.raise("Can\'t make a double black node more black!")+                                              case+                                              "Black" :+                                                return BBlack+                                              case+                                              "NBlack" :+                                                return Red+                                              case+                                              "Red" :+                                                return Black}+                                             _E.Case($moduleName,"between lines 180 and 184");+                                           }()+                                  };+                  var lessBlack = function (c)+                                  {+                                    return function ()+                                           {+                                             switch (c.ctor)+                                             {case+                                              "BBlack" :+                                                return Black+                                              case+                                              "Black" :+                                                return Red+                                              case+                                              "NBlack" :+                                                return Native.Error.raise("Can\'t make a negative black node less black!")+                                              case+                                              "Red" :+                                                return NBlack}+                                             _E.Case($moduleName,"between lines 187 and 191");+                                           }()+                                  };+                  var lessBlackTree = function (t)+                                      {+                                        return function ()+                                               {+                                                 switch (t.ctor)+                                                 {case+                                                  "RBEmpty" :+                                                    switch (t._0.ctor)+                                                    {case+                                                     "LBBlack" :+                                                       return RBEmpty(LBlack)}+                                                    break;+                                                  case+                                                  "RBNode" :+                                                    return A5(RBNode,+                                                              lessBlack(t._0),+                                                              t._1,+                                                              t._2,+                                                              t._3,+                                                              t._4)}+                                                 _E.Case($moduleName,"between lines 194 and 196");+                                               }()+                                      };+                  var redden = function (t)+                               {+                                 return function ()+                                        {+                                          switch (t.ctor)+                                          {case+                                           "RBEmpty" :+                                             return Native.Error.raise("can\'t make a Leaf red")+                                           case+                                           "RBNode" :+                                             return A5(RBNode,Red,t._1,t._2,t._3,t._4)}+                                          _E.Case($moduleName,"between lines 296 and 300");+                                        }()+                               };+                  var balance_node = function (t)+                                     {+                                       return function ()+                                              {+                                                var assemble = function (col)+                                                               {+                                                                 return function (xk)+                                                                        {+                                                                          return function (xv)+                                                                                 {+                                                                                   return function (yk)+                                                                                          {+                                                                                            return function (yv)+                                                                                                   {+                                                                                                     return function (zk)+                                                                                                            {+                                                                                                              return function (zv)+                                                                                                                     {+                                                                                                                       return function (a)+                                                                                                                              {+                                                                                                                                return function (b)+                                                                                                                                       {+                                                                                                                                         return function (c)+                                                                                                                                                {+                                                                                                                                                  return function (d)+                                                                                                                                                         {+                                                                                                                                                           return A5(RBNode,+                                                                                                                                                                     lessBlack(col),+                                                                                                                                                                     yk,+                                                                                                                                                                     yv,+                                                                                                                                                                     A5(RBNode,+                                                                                                                                                                        Black,+                                                                                                                                                                        xk,+                                                                                                                                                                        xv,+                                                                                                                                                                        a,+                                                                                                                                                                        b),+                                                                                                                                                                     A5(RBNode,+                                                                                                                                                                        Black,+                                                                                                                                                                        zk,+                                                                                                                                                                        zv,+                                                                                                                                                                        c,+                                                                                                                                                                        d))+                                                                                                                                                         }+                                                                                                                                                }+                                                                                                                                       }+                                                                                                                              }+                                                                                                                     }+                                                                                                            }+                                                                                                   }+                                                                                          }+                                                                                 }+                                                                        }+                                                               };+                                                return blackish(t) ? function ()+                                                                     {+                                                                       switch (t.ctor)+                                                                       {case+                                                                        "RBNode" :+                                                                          switch (t._3.ctor)+                                                                          {case+                                                                           "RBNode" :+                                                                             switch (t._3._0.ctor)+                                                                             {case+                                                                              "Red" :+                                                                                switch (t._3._3.ctor)+                                                                                {case+                                                                                 "RBNode" :+                                                                                   switch (t._3._3._0.ctor)+                                                                                   {case+                                                                                    "Red" :+                                                                                      return assemble(t._0)(t._3._3._1)(t._3._3._2)(t._3._1)(t._3._2)(t._1)(t._2)(t._3._3._3)(t._3._3._4)(t._3._4)(t._4)}+                                                                                   break;}+                                                                                switch (t._3._4.ctor)+                                                                                {case+                                                                                 "RBNode" :+                                                                                   switch (t._3._4._0.ctor)+                                                                                   {case+                                                                                    "Red" :+                                                                                      return assemble(t._0)(t._3._1)(t._3._2)(t._3._4._1)(t._3._4._2)(t._1)(t._2)(t._3._3)(t._3._4._3)(t._3._4._4)(t._4)}+                                                                                   break;}+                                                                                break;}+                                                                             break;}+                                                                          switch (t._4.ctor)+                                                                          {case+                                                                           "RBNode" :+                                                                             switch (t._4._0.ctor)+                                                                             {case+                                                                              "Red" :+                                                                                switch (t._4._3.ctor)+                                                                                {case+                                                                                 "RBNode" :+                                                                                   switch (t._4._3._0.ctor)+                                                                                   {case+                                                                                    "Red" :+                                                                                      return assemble(t._0)(t._1)(t._2)(t._4._3._1)(t._4._3._2)(t._4._1)(t._4._2)(t._3)(t._4._3._3)(t._4._3._4)(t._4._4)}+                                                                                   break;}+                                                                                switch (t._4._4.ctor)+                                                                                {case+                                                                                 "RBNode" :+                                                                                   switch (t._4._4._0.ctor)+                                                                                   {case+                                                                                    "Red" :+                                                                                      return assemble(t._0)(t._1)(t._2)(t._4._1)(t._4._2)(t._4._4._1)(t._4._4._2)(t._3)(t._4._3)(t._4._4._3)(t._4._4._4)}+                                                                                   break;}+                                                                                break;}+                                                                             break;}+                                                                          switch (t._0.ctor)+                                                                          {case+                                                                           "BBlack" :+                                                                             switch (t._4.ctor)+                                                                             {case+                                                                              "RBNode" :+                                                                                switch (t._4._0.ctor)+                                                                                {case+                                                                                 "NBlack" :+                                                                                   switch (t._4._3.ctor)+                                                                                   {case+                                                                                    "RBNode" :+                                                                                      switch (t._4._3._0.ctor)+                                                                                      {case+                                                                                       "Black" :+                                                                                         return function ()+                                                                                                {+                                                                                                  switch (t._4._4.ctor)+                                                                                                  {case+                                                                                                   "RBNode" :+                                                                                                     switch (t._4._4._0.ctor)+                                                                                                     {case+                                                                                                      "Black" :+                                                                                                        return A5(RBNode,+                                                                                                                  Black,+                                                                                                                  t._4._3._1,+                                                                                                                  t._4._3._2,+                                                                                                                  A5(RBNode,+                                                                                                                     Black,+                                                                                                                     t._1,+                                                                                                                     t._2,+                                                                                                                     t._3,+                                                                                                                     t._4._3._3),+                                                                                                                  A5(balance,+                                                                                                                     Black,+                                                                                                                     t._4._1,+                                                                                                                     t._4._2,+                                                                                                                     t._4._3._4,+                                                                                                                     redden(t._4._4)))}+                                                                                                     break;}+                                                                                                  return t+                                                                                                }()}+                                                                                      break;}+                                                                                   break;}+                                                                                break;}+                                                                             switch (t._3.ctor)+                                                                             {case+                                                                              "RBNode" :+                                                                                switch (t._3._0.ctor)+                                                                                {case+                                                                                 "NBlack" :+                                                                                   switch (t._3._4.ctor)+                                                                                   {case+                                                                                    "RBNode" :+                                                                                      switch (t._3._4._0.ctor)+                                                                                      {case+                                                                                       "Black" :+                                                                                         return function ()+                                                                                                {+                                                                                                  switch (t._3._3.ctor)+                                                                                                  {case+                                                                                                   "RBNode" :+                                                                                                     switch (t._3._3._0.ctor)+                                                                                                     {case+                                                                                                      "Black" :+                                                                                                        return A5(RBNode,+                                                                                                                  Black,+                                                                                                                  t._3._4._1,+                                                                                                                  t._3._4._2,+                                                                                                                  A5(balance,+                                                                                                                     Black,+                                                                                                                     t._3._1,+                                                                                                                     t._3._2,+                                                                                                                     redden(t._3._3),+                                                                                                                     t._3._4._3),+                                                                                                                  A5(RBNode,+                                                                                                                     Black,+                                                                                                                     t._1,+                                                                                                                     t._2,+                                                                                                                     t._3._4._4,+                                                                                                                     t._4))}+                                                                                                     break;}+                                                                                                  return t+                                                                                                }()}+                                                                                      break;}+                                                                                   break;}+                                                                                break;}+                                                                             break;}+                                                                          break;}+                                                                       return t+                                                                     }() : t+                                              }()+                                     };+                  var balance = F5(function (c,k,v,l,r)+                                   {+                                     return balance_node(A5(RBNode,c,k,v,l,r))+                                   });+                  var bubble = F5(function (c,k,v,l,r)+                                  {+                                    return isBBlack(l) || isBBlack(r) ? A5(balance,+                                                                           moreBlack(c),+                                                                           k,+                                                                           v,+                                                                           lessBlackTree(l),+                                                                           lessBlackTree(r)) : A5(RBNode,+                                                                                                  c,+                                                                                                  k,+                                                                                                  v,+                                                                                                  l,+                                                                                                  r)+                                  });+                  var remove_max = F5(function (c,k,v,l,r)+                                      {+                                        return function ()+                                               {+                                                 switch (r.ctor)+                                                 {case+                                                  "RBEmpty" :+                                                    return A3(rem,c,l,r)+                                                  case+                                                  "RBNode" :+                                                    return A5(bubble,+                                                              c,+                                                              k,+                                                              v,+                                                              l,+                                                              A5(remove_max,+                                                                 r._0,+                                                                 r._1,+                                                                 r._2,+                                                                 r._3,+                                                                 r._4))}+                                                 _E.Case($moduleName,"between lines 242 and 245");+                                               }()+                                      });+                  var rem = F3(function (c,l,r)+                               {+                                 return function ()+                                        {+                                          var _v175 = {ctor: "_Tuple2", _0: l, _1: r};+                                          switch (_v175.ctor)+                                          {case+                                           "_Tuple2" :+                                             switch (_v175._0.ctor)+                                             {case+                                              "RBEmpty" :+                                                switch (_v175._1.ctor)+                                                {case+                                                 "RBEmpty" :+                                                   return function ()+                                                          {+                                                            switch (c.ctor)+                                                            {case+                                                             "Black" :+                                                               return RBEmpty(LBBlack)+                                                             case+                                                             "Red" :+                                                               return RBEmpty(LBlack)}+                                                            _E.Case($moduleName,+                                                                    "between lines 215 and 218");+                                                          }()+                                                 case+                                                 "RBNode" :+                                                   return function ()+                                                          {+                                                            var _v197 = {ctor: "_Tuple3", _0: c, _1: _v175._0._0, _2: _v175._1._0};+                                                            switch (_v197.ctor)+                                                            {case+                                                             "_Tuple3" :+                                                               switch (_v197._0.ctor)+                                                               {case+                                                                "Black" :+                                                                  switch (_v197._1.ctor)+                                                                  {case+                                                                   "LBlack" :+                                                                     switch (_v197._2.ctor)+                                                                     {case+                                                                      "Red" :+                                                                        return A5(RBNode,+                                                                                  Black,+                                                                                  _v175._1._1,+                                                                                  _v175._1._2,+                                                                                  _v175._1._3,+                                                                                  _v175._1._4)}+                                                                     break;}+                                                                  break;}+                                                               break;}+                                                            return A4(reportRemBug,+                                                                      "Black, LBlack, Red",+                                                                      c,+                                                                      showLColor(_v175._0._0),+                                                                      showNColor(_v175._1._0))+                                                          }()}+                                                break;+                                              case+                                              "RBNode" :+                                                switch (_v175._1.ctor)+                                                {case+                                                 "RBEmpty" :+                                                   return function ()+                                                          {+                                                            var _v201 = {ctor: "_Tuple3", _0: c, _1: _v175._0._0, _2: _v175._1._0};+                                                            switch (_v201.ctor)+                                                            {case+                                                             "_Tuple3" :+                                                               switch (_v201._0.ctor)+                                                               {case+                                                                "Black" :+                                                                  switch (_v201._1.ctor)+                                                                  {case+                                                                   "Red" :+                                                                     switch (_v201._2.ctor)+                                                                     {case+                                                                      "LBlack" :+                                                                        return A5(RBNode,+                                                                                  Black,+                                                                                  _v175._0._1,+                                                                                  _v175._0._2,+                                                                                  _v175._0._3,+                                                                                  _v175._0._4)}+                                                                     break;}+                                                                  break;}+                                                               break;}+                                                            return A4(reportRemBug,+                                                                      "Black, Red, LBlack",+                                                                      c,+                                                                      showNColor(_v175._0._0),+                                                                      showLColor(_v175._1._0))+                                                          }()+                                                 case+                                                 "RBNode" :+                                                   return function ()+                                                          {+                                                            var l$ = A5(remove_max,+                                                                        _v175._0._0,+                                                                        _v175._0._1,+                                                                        _v175._0._2,+                                                                        _v175._0._3,+                                                                        _v175._0._4);+                                                            var r = A5(RBNode,+                                                                       _v175._1._0,+                                                                       _v175._1._1,+                                                                       _v175._1._2,+                                                                       _v175._1._3,+                                                                       _v175._1._4);+                                                            var l = A5(RBNode,+                                                                       _v175._0._0,+                                                                       _v175._0._1,+                                                                       _v175._0._2,+                                                                       _v175._0._3,+                                                                       _v175._0._4);+                                                            var $ = max(l),k = $._0,v = $._1;+                                                            return A5(bubble,c,k,v,l$,r)+                                                          }()}+                                                break;}+                                             break;}+                                          _E.Case($moduleName,"between lines 214 and 232");+                                        }()+                               });+                  var update = F3(function (k,u,t)+                                  {+                                    return function ()+                                           {+                                             var up = function (t)+                                                      {+                                                        return function ()+                                                               {+                                                                 switch (t.ctor)+                                                                 {case+                                                                  "RBEmpty" :+                                                                    switch (t._0.ctor)+                                                                    {case+                                                                     "LBlack" :+                                                                       return function ()+                                                                              {+                                                                                var _v212 = u(Maybe.Nothing);+                                                                                switch (_v212.ctor)+                                                                                {case+                                                                                 "Just" :+                                                                                   return {ctor: "_Tuple2", _0: Insert, _1: A5(RBNode,+                                                                                                                               Red,+                                                                                                                               k,+                                                                                                                               _v212._0,+                                                                                                                               empty,+                                                                                                                               empty)}+                                                                                 case+                                                                                 "Nothing" :+                                                                                   return {ctor: "_Tuple2", _0: Same, _1: empty}}+                                                                                _E.Case($moduleName,+                                                                                        "between lines 146 and 149");+                                                                              }()}+                                                                    break;+                                                                  case+                                                                  "RBNode" :+                                                                    return function ()+                                                                           {+                                                                             var _v214 = A2(Native.Utils.compare,+                                                                                            k,+                                                                                            t._1);+                                                                             switch (_v214.ctor)+                                                                             {case+                                                                              "EQ" :+                                                                                return function ()+                                                                                       {+                                                                                         var _v215 = u(Maybe.Just(t._2));+                                                                                         switch (_v215.ctor)+                                                                                         {case+                                                                                          "Just" :+                                                                                            return {ctor: "_Tuple2", _0: Same, _1: A5(RBNode,+                                                                                                                                      t._0,+                                                                                                                                      t._1,+                                                                                                                                      _v215._0,+                                                                                                                                      t._3,+                                                                                                                                      t._4)}+                                                                                          case+                                                                                          "Nothing" :+                                                                                            return {ctor: "_Tuple2", _0: Remove, _1: A3(rem,+                                                                                                                                        t._0,+                                                                                                                                        t._3,+                                                                                                                                        t._4)}}+                                                                                         _E.Case($moduleName,+                                                                                                 "between lines 150 and 153");+                                                                                       }()+                                                                              case+                                                                              "GT" :+                                                                                return function ()+                                                                                       {+                                                                                         var $ = up(t._4),+                                                                                             fl = $._0,+                                                                                             r$ = $._1;+                                                                                         return function ()+                                                                                                {+                                                                                                  switch (fl.ctor)+                                                                                                  {case+                                                                                                   "Insert" :+                                                                                                     return {ctor: "_Tuple2", _0: Insert, _1: A5(balance,+                                                                                                                                                 t._0,+                                                                                                                                                 t._1,+                                                                                                                                                 t._2,+                                                                                                                                                 t._3,+                                                                                                                                                 r$)}+                                                                                                   case+                                                                                                   "Remove" :+                                                                                                     return {ctor: "_Tuple2", _0: Remove, _1: A5(bubble,+                                                                                                                                                 t._0,+                                                                                                                                                 t._1,+                                                                                                                                                 t._2,+                                                                                                                                                 t._3,+                                                                                                                                                 r$)}+                                                                                                   case+                                                                                                   "Same" :+                                                                                                     return {ctor: "_Tuple2", _0: Same, _1: A5(RBNode,+                                                                                                                                               t._0,+                                                                                                                                               t._1,+                                                                                                                                               t._2,+                                                                                                                                               t._3,+                                                                                                                                               r$)}}+                                                                                                  _E.Case($moduleName,+                                                                                                          "between lines 159 and 163");+                                                                                                }()+                                                                                       }()+                                                                              case+                                                                              "LT" :+                                                                                return function ()+                                                                                       {+                                                                                         var $ = up(t._3),+                                                                                             fl = $._0,+                                                                                             l$ = $._1;+                                                                                         return function ()+                                                                                                {+                                                                                                  switch (fl.ctor)+                                                                                                  {case+                                                                                                   "Insert" :+                                                                                                     return {ctor: "_Tuple2", _0: Insert, _1: A5(balance,+                                                                                                                                                 t._0,+                                                                                                                                                 t._1,+                                                                                                                                                 t._2,+                                                                                                                                                 l$,+                                                                                                                                                 t._4)}+                                                                                                   case+                                                                                                   "Remove" :+                                                                                                     return {ctor: "_Tuple2", _0: Remove, _1: A5(bubble,+                                                                                                                                                 t._0,+                                                                                                                                                 t._1,+                                                                                                                                                 t._2,+                                                                                                                                                 l$,+                                                                                                                                                 t._4)}+                                                                                                   case+                                                                                                   "Same" :+                                                                                                     return {ctor: "_Tuple2", _0: Same, _1: A5(RBNode,+                                                                                                                                               t._0,+                                                                                                                                               t._1,+                                                                                                                                               t._2,+                                                                                                                                               l$,+                                                                                                                                               t._4)}}+                                                                                                  _E.Case($moduleName,+                                                                                                          "between lines 154 and 158");+                                                                                                }()+                                                                                       }()}+                                                                             _E.Case($moduleName,+                                                                                     "between lines 149 and 163");+                                                                           }()}+                                                                 _E.Case($moduleName,+                                                                         "between lines 145 and 163");+                                                               }()+                                                      };+                                             var $ = up(t),fl = $._0,t$ = $._1;+                                             return function ()+                                                    {+                                                      switch (fl.ctor)+                                                      {case+                                                       "Insert" :+                                                         return ensureBlackRoot(t$)+                                                       case+                                                       "Remove" :+                                                         return blacken(t$)+                                                       case+                                                       "Same" :+                                                         return t$}+                                                      _E.Case($moduleName,+                                                              "between lines 164 and 169");+                                                    }()+                                           }()+                                  });+                  var insert = F3(function (k,v,t)+                                  {+                                    return function ()+                                           {+                                             var u = function (_v220)+                                                     {+                                                       return function ()+                                                              {+                                                                return Maybe.Just(v)+                                                              }()+                                                     };+                                             return A3(update,k,u,t)+                                           }()+                                  });+                  var singleton = F2(function (k,v)+                                     {+                                       return A3(insert,k,v,RBEmpty(LBlack))+                                     });+                  var union = F2(function (t1,t2)+                                 {+                                   return A3(foldl,insert,t2,t1)+                                 });+                  var intersect = F2(function (t1,t2)+                                     {+                                       return function ()+                                              {+                                                var combine = F3(function (k,v,t)+                                                                 {+                                                                   return A2(member,+                                                                             k,+                                                                             t2) ? A3(insert,+                                                                                      k,+                                                                                      v,+                                                                                      t) : t+                                                                 });+                                                return A3(foldl,combine,empty,t1)+                                              }()+                                     });+                  var fromList = function (assocs)+                                 {+                                   return A3(List.foldl,+                                             F2(function (_v222,d)+                                                {+                                                  return function ()+                                                         {+                                                           switch (_v222.ctor)+                                                           {case+                                                            "_Tuple2" :+                                                              return A3(insert,_v222._0,_v222._1,d)}+                                                           _E.Case($moduleName,+                                                                   "on line 354, column 43 to 55");+                                                         }()+                                                }),+                                             empty,+                                             assocs)+                                 };+                  var remove = F2(function (k,t)+                                  {+                                    return function ()+                                           {+                                             var u = function (_v226)+                                                     {+                                                       return function ()+                                                              {+                                                                return Maybe.Nothing+                                                              }()+                                                     };+                                             return A3(update,k,u,t)+                                           }()+                                  });+                  var diff = F2(function (t1,t2)+                                {+                                  return A3(foldl,+                                            F3(function (k,v,t)+                                               {+                                                 return A2(remove,k,t)+                                               }),+                                            t1,+                                            t2)+                                });+                  _elm.Dict.values = {_op: _op, empty: empty, singleton: singleton, insert: insert, update: update, lookup: lookup, findWithDefault: findWithDefault, remove: remove, member: member, foldl: foldl, foldr: foldr, map: map, union: union, intersect: intersect, diff: diff, keys: keys, values: values, toList: toList, fromList: fromList};+                  return _elm.Dict.values+                };Elm.Either = Elm.Either || {};+Elm.Either.make = function (_elm)+                  {+                    _elm.Either = _elm.Either || {};+                    if (_elm.Either.values)+                    return _elm.Either.values+                    var _N = Elm.Native,+                        _U = _N.Utils.make(_elm),+                        _L = _N.List.make(_elm),+                        _E = _N.Error.make(_elm),+                        _J = _N.JavaScript.make(_elm),+                        $moduleName = "Either";+                    var List = Elm.List.make(_elm);+                    var _op = {};+                    var Right = function (a)+                                {+                                  return {ctor: "Right", _0: a}+                                };+                    var isRight = function (e)+                                  {+                                    return function ()+                                           {+                                             switch (e.ctor)+                                             {case+                                              "Right" :+                                                return true}+                                             return false+                                           }()+                                  };+                    var Left = function (a)+                               {+                                 return {ctor: "Left", _0: a}+                               };+                    var either = F3(function (f,g,e)+                                    {+                                      return function ()+                                             {+                                               switch (e.ctor)+                                               {case+                                                "Left" :+                                                  return f(e._0)+                                                case+                                                "Right" :+                                                  return g(e._0)}+                                               _E.Case($moduleName,"on line 31, column 16 to 60");+                                             }()+                                    });+                    var isLeft = function (e)+                                 {+                                   return function ()+                                          {+                                            switch (e.ctor)+                                            {case+                                             "Left" :+                                               return true}+                                            return false+                                          }()+                                 };+                    var consLeft = F2(function (e,vs)+                                      {+                                        return function ()+                                               {+                                                 switch (e.ctor)+                                                 {case+                                                  "Left" :+                                                    return {ctor: "::", _0: e._0, _1: vs}+                                                  case+                                                  "Right" :+                                                    return vs}+                                                 _E.Case($moduleName,"between lines 56 and 58");+                                               }()+                                      });+                    var lefts = function (es)+                                {+                                  return A3(List.foldr,consLeft,_J.toList([]),es)+                                };+                    var consRight = F2(function (e,vs)+                                       {+                                         return function ()+                                                {+                                                  switch (e.ctor)+                                                  {case+                                                   "Left" :+                                                     return vs+                                                   case+                                                   "Right" :+                                                     return {ctor: "::", _0: e._0, _1: vs}}+                                                  _E.Case($moduleName,"between lines 61 and 63");+                                                }()+                                       });+                    var rights = function (es)+                                 {+                                   return A3(List.foldr,consRight,_J.toList([]),es)+                                 };+                    var consEither = F2(function (e,_v13)+                                        {+                                          return function ()+                                                 {+                                                   switch (_v13.ctor)+                                                   {case+                                                    "_Tuple2" :+                                                      return function ()+                                                             {+                                                               switch (e.ctor)+                                                               {case+                                                                "Left" :+                                                                  return {ctor: "_Tuple2", _0: {ctor: "::", _0: e._0, _1: _v13._0}, _1: _v13._1}+                                                                case+                                                                "Right" :+                                                                  return {ctor: "_Tuple2", _0: _v13._0, _1: {ctor: "::", _0: e._0, _1: _v13._1}}}+                                                               _E.Case($moduleName,+                                                                       "between lines 66 and 68");+                                                             }()}+                                                   _E.Case($moduleName,"between lines 66 and 68");+                                                 }()+                                        });+                    var partition = function (es)+                                    {+                                      return A3(List.foldr,+                                                consEither,+                                                {ctor: "_Tuple2", _0: _J.toList([]), _1: _J.toList([])},+                                                es)+                                    };+                    _elm.Either.values = {_op: _op, either: either, isLeft: isLeft, isRight: isRight, lefts: lefts, rights: rights, partition: partition, consLeft: consLeft, consRight: consRight, consEither: consEither, Left: Left, Right: Right};+                    return _elm.Either.values+                  };Elm.Http = Elm.Http || {};+Elm.Http.make = function (_elm)+                {+                  _elm.Http = _elm.Http || {};+                  if (_elm.Http.values)+                  return _elm.Http.values+                  var _N = Elm.Native,+                      _U = _N.Utils.make(_elm),+                      _L = _N.List.make(_elm),+                      _E = _N.Error.make(_elm),+                      _J = _N.JavaScript.make(_elm),+                      $moduleName = "Http";+                  var Native = Native || {};+                  Native.Http = Elm.Native.Http.make(_elm);+                  var Signal = Elm.Signal.make(_elm);+                  var _op = {};+                  var send = Native.Http.send;+                  var Request = F4(function (a,b,c,d)+                                   {+                                     return {_: {}, body: c, headers: d, url: b, verb: a}+                                   });+                  var request = Request;+                  var get = function (url)+                            {+                              return A4(Request,"GET",url,"",_J.toList([]))+                            };+                  var sendGet = function (reqs)+                                {+                                  return send(A2(Signal.lift,get,reqs))+                                };+                  var post = F2(function (url,body)+                                {+                                  return A4(Request,"POST",url,body,_J.toList([]))+                                });+                  var Failure = F2(function (a,b)+                                   {+                                     return {ctor: "Failure", _0: a, _1: b}+                                   });+                  var Waiting = {ctor: "Waiting"};+                  var Success = function (a)+                                {+                                  return {ctor: "Success", _0: a}+                                };+                  _elm.Http.values = {_op: _op, request: request, get: get, post: post, send: send, sendGet: sendGet, Success: Success, Waiting: Waiting, Failure: Failure, Request: Request};+                  return _elm.Http.values+                };Elm.JavaScript = Elm.JavaScript || {};+Elm.JavaScript.make = function (_elm)+                      {+                        _elm.JavaScript = _elm.JavaScript || {};+                        if (_elm.JavaScript.values)+                        return _elm.JavaScript.values+                        var _N = Elm.Native,+                            _U = _N.Utils.make(_elm),+                            _L = _N.List.make(_elm),+                            _E = _N.Error.make(_elm),+                            _J = _N.JavaScript.make(_elm),+                            $moduleName = "JavaScript";+                        var Native = Native || {};+                        Native.JavaScript = Elm.Native.JavaScript.make(_elm);+                        var _op = {};+                        var fromString = Native.JavaScript.fromString;+                        var fromBool = Native.JavaScript.fromBool;+                        var fromFloat = Native.JavaScript.fromFloat;+                        var fromInt = Native.JavaScript.fromInt;+                        var fromList = Native.JavaScript.fromList;+                        var toString = Native.JavaScript.toString;+                        var toBool = Native.JavaScript.toBool;+                        var toFloat = Native.JavaScript.toFloat;+                        var toInt = Native.JavaScript.toInt;+                        var toList = Native.JavaScript.toList;+                        var JSObject = {ctor: "JSObject"};+                        var JSDomNode = {ctor: "JSDomNode"};+                        var JSArray = function (a)+                                      {+                                        return {ctor: "JSArray", _0: a}+                                      };+                        var JSString = {ctor: "JSString"};+                        var JSBool = {ctor: "JSBool"};+                        var JSNumber = {ctor: "JSNumber"};+                        _elm.JavaScript.values = {_op: _op, toList: toList, toInt: toInt, toFloat: toFloat, toBool: toBool, toString: toString, fromList: fromList, fromInt: fromInt, fromFloat: fromFloat, fromBool: fromBool, fromString: fromString, JSNumber: JSNumber, JSBool: JSBool, JSString: JSString, JSArray: JSArray, JSDomNode: JSDomNode, JSObject: JSObject};+                        return _elm.JavaScript.values+                      };Elm.Json = Elm.Json || {};+Elm.Json.make = function (_elm)+                {+                  _elm.Json = _elm.Json || {};+                  if (_elm.Json.values)+                  return _elm.Json.values+                  var _N = Elm.Native,+                      _U = _N.Utils.make(_elm),+                      _L = _N.List.make(_elm),+                      _E = _N.Error.make(_elm),+                      _J = _N.JavaScript.make(_elm),+                      $moduleName = "Json";+                  var Basics = Elm.Basics.make(_elm);+                  var Dict = Elm.Dict.make(_elm);+                  var JavaScript = Elm.JavaScript.make(_elm);+                  var Maybe = Elm.Maybe.make(_elm);+                  var Native = Native || {};+                  Native.Json = Elm.Native.Json.make(_elm);+                  var _op = {};+                  var toJSObject = Native.Json.toJSObject;+                  var fromJSObject = Native.Json.fromJSObject;+                  var fromJSString = Native.Json.fromJSString;+                  var fromString = function (s)+                                   {+                                     return Native.Json.fromJSString(JavaScript.fromString(s))+                                   };+                  var toJSString = Native.Json.toJSString;+                  var toString = F2(function (sep,v)+                                    {+                                      return JavaScript.toString(A2(Native.Json.toJSString,sep,v))+                                    });+                  var Object = function (a)+                               {+                                 return {ctor: "Object", _0: a}+                               };+                  var Array = function (a)+                              {+                                return {ctor: "Array", _0: a}+                              };+                  var Null = {ctor: "Null"};+                  var Boolean = function (a)+                                {+                                  return {ctor: "Boolean", _0: a}+                                };+                  var Number = function (a)+                               {+                                 return {ctor: "Number", _0: a}+                               };+                  var String = function (a)+                               {+                                 return {ctor: "String", _0: a}+                               };+                  _elm.Json.values = {_op: _op, toString: toString, toJSString: toJSString, fromString: fromString, fromJSString: fromJSString, fromJSObject: fromJSObject, toJSObject: toJSObject, String: String, Number: Number, Boolean: Boolean, Null: Null, Array: Array, Object: Object};+                  return _elm.Json.values+                };Elm.Keyboard = Elm.Keyboard || {};+Elm.Keyboard.make = function (_elm)+                    {+                      _elm.Keyboard = _elm.Keyboard || {};+                      if (_elm.Keyboard.values)+                      return _elm.Keyboard.values+                      var _N = Elm.Native,+                          _U = _N.Utils.make(_elm),+                          _L = _N.List.make(_elm),+                          _E = _N.Error.make(_elm),+                          _J = _N.JavaScript.make(_elm),+                          $moduleName = "Keyboard";+                      var Native = Native || {};+                      Native.Keyboard = Elm.Native.Keyboard.make(_elm);+                      var Signal = Elm.Signal.make(_elm);+                      var _op = {};+                      var lastPressed = Native.Keyboard.lastPressed;+                      var keysDown = Native.Keyboard.keysDown;+                      var isDown = Native.Keyboard.isDown;+                      var shift = isDown(16);+                      var ctrl = isDown(17);+                      var space = isDown(32);+                      var enter = isDown(13);+                      var directions = Native.Keyboard.directions;+                      var arrows = A4(directions,38,40,37,39);+                      var wasd = A4(directions,87,83,65,68);+                      _elm.Keyboard.values = {_op: _op, directions: directions, arrows: arrows, wasd: wasd, isDown: isDown, shift: shift, ctrl: ctrl, space: space, enter: enter, keysDown: keysDown, lastPressed: lastPressed};+                      return _elm.Keyboard.values+                    };Elm.List = Elm.List || {};+Elm.List.make = function (_elm)+                {+                  _elm.List = _elm.List || {};+                  if (_elm.List.values)+                  return _elm.List.values+                  var _N = Elm.Native,+                      _U = _N.Utils.make(_elm),+                      _L = _N.List.make(_elm),+                      _E = _N.Error.make(_elm),+                      _J = _N.JavaScript.make(_elm),+                      $moduleName = "List";+                  var Basics = Elm.Basics.make(_elm);+                  var Native = Native || {};+                  Native.List = Elm.Native.List.make(_elm);+                  var _op = {};+                  var sortWith = Native.List.sortWith;+                  var sortBy = Native.List.sortBy;+                  var sort = Native.List.sort;+                  var repeat = Native.List.repeat;+                  var drop = Native.List.drop;+                  var take = Native.List.take;+                  var join = Native.List.join;+                  var zipWith = Native.List.zipWith;+                  var zip = Native.List.zip;+                  var concat = Native.List.concat;+                  var any = Native.List.any;+                  var all = Native.List.all;+                  var reverse = Native.List.reverse;+                  var length = Native.List.length;+                  var filter = Native.List.filter;+                  var scanl1 = Native.List.scanl1;+                  var scanl = Native.List.scanl;+                  var foldr1 = Native.List.foldr1;+                  var foldl1 = Native.List.foldl1;+                  var maximum = foldl1(Basics.max);+                  var minimum = foldl1(Basics.min);+                  var foldr = Native.List.foldr;+                  var foldl = Native.List.foldl;+                  var and = A2(foldl,+                               F2(function (x,y)+                                  {+                                    return x && y+                                  }),+                               true);+                  var or = A2(foldl,+                              F2(function (x,y)+                                 {+                                   return x || y+                                 }),+                              false);+                  var sum = A2(foldl,+                               F2(function (x,y)+                                  {+                                    return x + y+                                  }),+                               0);+                  var product = A2(foldl,+                                   F2(function (x,y)+                                      {+                                        return x * y+                                      }),+                                   1);+                  var map = Native.List.map;+                  var concatMap = F2(function (f,list)+                                     {+                                       return concat(A2(map,f,list))+                                     });+                  var isEmpty = function (xs)+                                {+                                  return function ()+                                         {+                                           switch (xs.ctor)+                                           {case+                                            "[]" :+                                              return true}+                                           return false+                                         }()+                                };+                  var last = Native.List.last;+                  var tail = Native.List.tail;+                  var head = Native.List.head;+                  _op["++"] = Native.List.append;+                  _op["::"] = Native.List.cons;+                  var partition = F2(function (pred,lst)+                                     {+                                       return function ()+                                              {+                                                switch (lst.ctor)+                                                {case+                                                 "::" :+                                                   return function ()+                                                          {+                                                            var $ = A2(partition,pred,lst._1),+                                                                bs = $._0,+                                                                cs = $._1;+                                                            return pred(lst._0) ? {ctor: "_Tuple2", _0: {ctor: "::", _0: lst._0, _1: bs}, _1: cs} : {ctor: "_Tuple2", _0: bs, _1: {ctor: "::", _0: lst._0, _1: cs}}+                                                          }()+                                                 case+                                                 "[]" :+                                                   return {ctor: "_Tuple2", _0: _J.toList([]), _1: _J.toList([])}}+                                                _E.Case($moduleName,"between lines 169 and 179");+                                              }()+                                     });+                  var unzip = function (pairs)+                              {+                                return function ()+                                       {+                                         switch (pairs.ctor)+                                         {case+                                          "::" :+                                            switch (pairs._0.ctor)+                                            {case+                                             "_Tuple2" :+                                               return function ()+                                                      {+                                                        var $ = unzip(pairs._1),xs = $._0,ys = $._1;+                                                        return {ctor: "_Tuple2", _0: {ctor: "::", _0: pairs._0._0, _1: xs}, _1: {ctor: "::", _0: pairs._0._1, _1: ys}}+                                                      }()}+                                            break;+                                          case+                                          "[]" :+                                            return {ctor: "_Tuple2", _0: _J.toList([]), _1: _J.toList([])}}+                                         _E.Case($moduleName,"between lines 194 and 202");+                                       }()+                              };+                  var intersperse = F2(function (sep,xs)+                                       {+                                         return function ()+                                                {+                                                  switch (xs.ctor)+                                                  {case+                                                   "::" :+                                                     switch (xs._1.ctor)+                                                     {case+                                                      "::" :+                                                        return {ctor: "::", _0: xs._0, _1: {ctor: "::", _0: sep, _1: A2(intersperse,+                                                                                                                        sep,+                                                                                                                        {ctor: "::", _0: xs._1._0, _1: xs._1._1})}}+                                                      case+                                                      "[]" :+                                                        return _J.toList([xs._0])}+                                                     break;+                                                   case+                                                   "[]" :+                                                     return _J.toList([])}+                                                  _E.Case($moduleName,"between lines 212 and 217");+                                                }()+                                       });+                  _elm.List.values = {_op: _op, head: head, tail: tail, last: last, isEmpty: isEmpty, map: map, foldl: foldl, foldr: foldr, foldl1: foldl1, foldr1: foldr1, scanl: scanl, scanl1: scanl1, filter: filter, length: length, reverse: reverse, all: all, any: any, and: and, or: or, concat: concat, concatMap: concatMap, sum: sum, product: product, maximum: maximum, minimum: minimum, partition: partition, zip: zip, zipWith: zipWith, unzip: unzip, join: join, intersperse: intersperse, take: take, drop: drop, repeat: repeat, sort: sort, sortBy: sortBy, sortWith: sortWith};+                  return _elm.List.values+                };Elm.Maybe = Elm.Maybe || {};+Elm.Maybe.make = function (_elm)+                 {+                   _elm.Maybe = _elm.Maybe || {};+                   if (_elm.Maybe.values)+                   return _elm.Maybe.values+                   var _N = Elm.Native,+                       _U = _N.Utils.make(_elm),+                       _L = _N.List.make(_elm),+                       _E = _N.Error.make(_elm),+                       _J = _N.JavaScript.make(_elm),+                       $moduleName = "Maybe";+                   var Basics = Elm.Basics.make(_elm);+                   var List = Elm.List.make(_elm);+                   var _op = {};+                   var Nothing = {ctor: "Nothing"};+                   var Just = function (a)+                              {+                                return {ctor: "Just", _0: a}+                              };+                   var maybe = F3(function (b,f,m)+                                  {+                                    return function ()+                                           {+                                             switch (m.ctor)+                                             {case+                                              "Just" :+                                                return f(m._0)+                                              case+                                              "Nothing" :+                                                return b}+                                             _E.Case($moduleName,"between lines 28 and 33");+                                           }()+                                  });+                   var isJust = A2(maybe,+                                   false,+                                   function (_v2)+                                   {+                                     return function ()+                                            {+                                              return true+                                            }()+                                   });+                   var isNothing = function ($)+                                   {+                                     return Basics.not(isJust($))+                                   };+                   var cons = F2(function (mx,xs)+                                 {+                                   return A3(maybe,+                                             xs,+                                             function (x)+                                             {+                                               return {ctor: "::", _0: x, _1: xs}+                                             },+                                             mx)+                                 });+                   var justs = A2(List.foldr,cons,_J.toList([]));+                   _elm.Maybe.values = {_op: _op, maybe: maybe, isJust: isJust, isNothing: isNothing, cons: cons, justs: justs, Just: Just, Nothing: Nothing};+                   return _elm.Maybe.values+                 };Elm.Mouse = Elm.Mouse || {};+Elm.Mouse.make = function (_elm)+                 {+                   _elm.Mouse = _elm.Mouse || {};+                   if (_elm.Mouse.values)+                   return _elm.Mouse.values+                   var _N = Elm.Native,+                       _U = _N.Utils.make(_elm),+                       _L = _N.List.make(_elm),+                       _E = _N.Error.make(_elm),+                       _J = _N.JavaScript.make(_elm),+                       $moduleName = "Mouse";+                   var Native = Native || {};+                   Native.Mouse = Elm.Native.Mouse.make(_elm);+                   var Signal = Elm.Signal.make(_elm);+                   var _op = {};+                   var clicks = Native.Mouse.clicks;+                   var isClicked = Native.Mouse.isClicked;+                   var isDown = Native.Mouse.isDown;+                   var y = Native.Mouse.y;+                   var x = Native.Mouse.x;+                   var position = Native.Mouse.position;+                   _elm.Mouse.values = {_op: _op, position: position, x: x, y: y, isDown: isDown, isClicked: isClicked, clicks: clicks};+                   return _elm.Mouse.values+                 };Elm.Prelude = Elm.Prelude || {};+Elm.Prelude.make = function (_elm)+                   {+                     _elm.Prelude = _elm.Prelude || {};+                     if (_elm.Prelude.values)+                     return _elm.Prelude.values+                     var _N = Elm.Native,+                         _U = _N.Utils.make(_elm),+                         _L = _N.List.make(_elm),+                         _E = _N.Error.make(_elm),+                         _J = _N.JavaScript.make(_elm),+                         $moduleName = "Prelude";+                     var Native = Native || {};+                     Native.Show = Elm.Native.Show.make(_elm);+                     var _op = {};+                     var show = Native.Show.show;+                     _elm.Prelude.values = {_op: _op, show: show};+                     return _elm.Prelude.values+                   };Elm.Random = Elm.Random || {};+Elm.Random.make = function (_elm)+                  {+                    _elm.Random = _elm.Random || {};+                    if (_elm.Random.values)+                    return _elm.Random.values+                    var _N = Elm.Native,+                        _U = _N.Utils.make(_elm),+                        _L = _N.List.make(_elm),+                        _E = _N.Error.make(_elm),+                        _J = _N.JavaScript.make(_elm),+                        $moduleName = "Random";+                    var Native = Native || {};+                    Native.Random = Elm.Native.Random.make(_elm);+                    var Signal = Elm.Signal.make(_elm);+                    var _op = {};+                    var floatList = Native.Random.floatList;+                    var $float = Native.Random.float_;+                    var range = Native.Random.range;+                    _elm.Random.values = {_op: _op, range: range, $float: $float, floatList: floatList};+                    return _elm.Random.values+                  };Elm.Regex = Elm.Regex || {};+Elm.Regex.make = function (_elm)+                 {+                   _elm.Regex = _elm.Regex || {};+                   if (_elm.Regex.values)+                   return _elm.Regex.values+                   var _N = Elm.Native,+                       _U = _N.Utils.make(_elm),+                       _L = _N.List.make(_elm),+                       _E = _N.Error.make(_elm),+                       _J = _N.JavaScript.make(_elm),+                       $moduleName = "Regex";+                   var Maybe = Elm.Maybe.make(_elm);+                   var Native = Native || {};+                   Native.Regex = Elm.Native.Regex.make(_elm);+                   var _op = {};+                   var splitN = Native.Regex.splitN;+                   var split = Native.Regex.split;+                   var replace = Native.Regex.replace;+                   var replaceAll = Native.Regex.replaceAll;+                   var find = Native.Regex.find;+                   var findAll = Native.Regex.findAll;+                   var Match = F4(function (a,b,c,d)+                                  {+                                    return {_: {}, index: c, match: a, number: d, submatches: b}+                                  });+                   var contains = Native.Regex.contains;+                   var caseInsensitive = Native.Regex.caseInsensitive;+                   var pattern = Native.Regex.pattern;+                   var escape = Native.Regex.escape;+                   var Regex = {ctor: "Regex"};+                   _elm.Regex.values = {_op: _op, escape: escape, pattern: pattern, caseInsensitive: caseInsensitive, contains: contains, findAll: findAll, find: find, replaceAll: replaceAll, replace: replace, split: split, splitN: splitN, Regex: Regex, Match: Match};+                   return _elm.Regex.values+                 };Elm.Set = Elm.Set || {};+Elm.Set.make = function (_elm)+               {+                 _elm.Set = _elm.Set || {};+                 if (_elm.Set.values)+                 return _elm.Set.values+                 var _N = Elm.Native,+                     _U = _N.Utils.make(_elm),+                     _L = _N.List.make(_elm),+                     _E = _N.Error.make(_elm),+                     _J = _N.JavaScript.make(_elm),+                     $moduleName = "Set";+                 var Dict = Elm.Dict.make(_elm);+                 var List = Elm.List.make(_elm);+                 var Maybe = Elm.Maybe.make(_elm);+                 var _op = {};+                 var foldr = F3(function (f,b,s)+                                {+                                  return A3(Dict.foldr,+                                            F3(function (k,_v0,b)+                                               {+                                                 return function ()+                                                        {+                                                          return A2(f,k,b)+                                                        }()+                                               }),+                                            b,+                                            s)+                                });+                 var foldl = F3(function (f,b,s)+                                {+                                  return A3(Dict.foldl,+                                            F3(function (k,_v2,b)+                                               {+                                                 return function ()+                                                        {+                                                          return A2(f,k,b)+                                                        }()+                                               }),+                                            b,+                                            s)+                                });+                 var toList = Dict.keys;+                 var diff = Dict.diff;+                 var intersect = Dict.intersect;+                 var union = Dict.union;+                 var member = Dict.member;+                 var remove = Dict.remove;+                 var insert = function (k)+                              {+                                return A2(Dict.insert,k,{ctor: "_Tuple0"})+                              };+                 var singleton = function (k)+                                 {+                                   return A2(Dict.singleton,k,{ctor: "_Tuple0"})+                                 };+                 var empty = Dict.empty;+                 var fromList = function (xs)+                                {+                                  return A3(List.foldl,insert,empty,xs)+                                };+                 var map = F2(function (f,s)+                              {+                                return fromList(A2(List.map,f,toList(s)))+                              });+                 _elm.Set.values = {_op: _op, empty: empty, singleton: singleton, insert: insert, remove: remove, member: member, foldl: foldl, foldr: foldr, map: map, union: union, intersect: intersect, diff: diff, toList: toList, fromList: fromList};+                 return _elm.Set.values+               };Elm.Signal = Elm.Signal || {};+Elm.Signal.make = function (_elm)+                  {+                    _elm.Signal = _elm.Signal || {};+                    if (_elm.Signal.values)+                    return _elm.Signal.values+                    var _N = Elm.Native,+                        _U = _N.Utils.make(_elm),+                        _L = _N.List.make(_elm),+                        _E = _N.Error.make(_elm),+                        _J = _N.JavaScript.make(_elm),+                        $moduleName = "Signal";+                    var List = Elm.List.make(_elm);+                    var Native = Native || {};+                    Native.Signal = Elm.Native.Signal.make(_elm);+                    var _op = {};+                    _op["~"] = F2(function (sf,s)+                                  {+                                    return A3(Native.Signal.lift2,+                                              F2(function (f,x)+                                                 {+                                                   return f(x)+                                                 }),+                                              sf,+                                              s)+                                  });+                    _op["<~"] = F2(function (f,s)+                                   {+                                     return A2(Native.Signal.lift,f,s)+                                   });+                    var sampleOn = Native.Signal.sampleOn;+                    var dropRepeats = Native.Signal.dropRepeats;+                    var dropWhen = Native.Signal.dropWhen;+                    var keepWhen = Native.Signal.keepWhen;+                    var dropIf = Native.Signal.dropIf;+                    var keepIf = Native.Signal.keepIf;+                    var countIf = Native.Signal.countIf;+                    var count = Native.Signal.count;+                    var combine = A2(List.foldr,+                                     Native.Signal.lift2(F2(function (x,y)+                                                            {+                                                              return {ctor: "::", _0: x, _1: y}+                                                            })),+                                     Native.Signal.constant(_J.toList([])));+                    var merges = Native.Signal.merges;+                    var merge = Native.Signal.merge;+                    var foldp = Native.Signal.foldp;+                    var lift8 = Native.Signal.lift8;+                    var lift7 = Native.Signal.lift7;+                    var lift6 = Native.Signal.lift6;+                    var lift5 = Native.Signal.lift5;+                    var lift4 = Native.Signal.lift4;+                    var lift3 = Native.Signal.lift3;+                    var lift2 = Native.Signal.lift2;+                    var lift = Native.Signal.lift;+                    var constant = Native.Signal.constant;+                    var Signal = {ctor: "Signal"};+                    _elm.Signal.values = {_op: _op, constant: constant, lift: lift, lift2: lift2, lift3: lift3, lift4: lift4, lift5: lift5, lift6: lift6, lift7: lift7, lift8: lift8, foldp: foldp, merge: merge, merges: merges, combine: combine, count: count, countIf: countIf, keepIf: keepIf, dropIf: dropIf, keepWhen: keepWhen, dropWhen: dropWhen, dropRepeats: dropRepeats, sampleOn: sampleOn, Signal: Signal};+                    return _elm.Signal.values+                  };Elm.String = Elm.String || {};+Elm.String.make = function (_elm)+                  {+                    _elm.String = _elm.String || {};+                    if (_elm.String.values)+                    return _elm.String.values+                    var _N = Elm.Native,+                        _U = _N.Utils.make(_elm),+                        _L = _N.List.make(_elm),+                        _E = _N.Error.make(_elm),+                        _J = _N.JavaScript.make(_elm),+                        $moduleName = "String";+                    var Maybe = Elm.Maybe.make(_elm);+                    var Native = Native || {};+                    Native.String = Elm.Native.String.make(_elm);+                    var _op = {};+                    var fromList = Native.String.fromList;+                    var toList = Native.String.toList;+                    var toFloat = Native.String.toFloat;+                    var toInt = Native.String.toInt;+                    var indices = Native.String.indexes;+                    var indexes = Native.String.indexes;+                    var endsWith = Native.String.endsWith;+                    var startsWith = Native.String.startsWith;+                    var contains = Native.String.contains;+                    var all = Native.String.all;+                    var any = Native.String.any;+                    var toLower = Native.String.toLower;+                    var toUpper = Native.String.toUpper;+                    var lines = Native.String.lines;+                    var words = Native.String.words;+                    var trimRight = Native.String.trimRight;+                    var trimLeft = Native.String.trimLeft;+                    var trim = Native.String.trim;+                    var padRight = Native.String.padRight;+                    var padLeft = Native.String.padLeft;+                    var pad = Native.String.pad;+                    var dropRight = Native.String.dropRight;+                    var dropLeft = Native.String.dropLeft;+                    var right = Native.String.right;+                    var left = Native.String.left;+                    var sub = Native.String.sub;+                    var repeat = Native.String.repeat;+                    var join = Native.String.join;+                    var split = Native.String.split;+                    var foldr = Native.String.foldr;+                    var foldl = Native.String.foldl;+                    var reverse = Native.String.reverse;+                    var filter = Native.String.filter;+                    var map = Native.String.map;+                    var length = Native.String.length;+                    var concat = Native.String.concat;+                    var append = Native.String.append;+                    var uncons = Native.String.uncons;+                    var cons = Native.String.cons;+                    var isEmpty = Native.String.isEmpty;+                    _elm.String.values = {_op: _op, isEmpty: isEmpty, cons: cons, uncons: uncons, append: append, concat: concat, length: length, map: map, filter: filter, reverse: reverse, foldl: foldl, foldr: foldr, split: split, join: join, repeat: repeat, sub: sub, left: left, right: right, dropLeft: dropLeft, dropRight: dropRight, pad: pad, padLeft: padLeft, padRight: padRight, trim: trim, trimLeft: trimLeft, trimRight: trimRight, words: words, lines: lines, toUpper: toUpper, toLower: toLower, any: any, all: all, contains: contains, startsWith: startsWith, endsWith: endsWith, indexes: indexes, indices: indices, toInt: toInt, toFloat: toFloat, toList: toList, fromList: fromList};+                    return _elm.String.values+                  };Elm.Text = Elm.Text || {};+Elm.Text.make = function (_elm)+                {+                  _elm.Text = _elm.Text || {};+                  if (_elm.Text.values)+                  return _elm.Text.values+                  var _N = Elm.Native,+                      _U = _N.Utils.make(_elm),+                      _L = _N.List.make(_elm),+                      _E = _N.Error.make(_elm),+                      _J = _N.JavaScript.make(_elm),+                      $moduleName = "Text";+                  var Basics = Elm.Basics.make(_elm);+                  var Color = Elm.Color.make(_elm);+                  var Graphics = Graphics || {};+                  Graphics.Element = Elm.Graphics.Element.make(_elm);+                  var JavaScript = Elm.JavaScript.make(_elm);+                  var Maybe = Elm.Maybe.make(_elm);+                  var Native = Native || {};+                  Native.Text = Elm.Native.Text.make(_elm);+                  var _op = {};+                  var asText = Native.Text.asText;+                  var markdown = Native.Text.markdown;+                  var plainText = Native.Text.plainText;+                  var text = Native.Text.text;+                  var righted = Native.Text.righted;+                  var centered = Native.Text.centered;+                  var justified = Native.Text.justified;+                  var strikeThrough = Native.Text.strikeThrough;+                  var underline = Native.Text.underline;+                  var overline = Native.Text.overline;+                  var italic = Native.Text.italic;+                  var bold = Native.Text.bold;+                  var color = Native.Text.color;+                  var height = Native.Text.height;+                  var link = Native.Text.link;+                  var monospace = Native.Text.monospace;+                  var typeface = Native.Text.typeface;+                  var toText = Native.Text.toText;+                  var Text = {ctor: "Text"};+                  _elm.Text.values = {_op: _op, toText: toText, typeface: typeface, monospace: monospace, link: link, height: height, color: color, bold: bold, italic: italic, overline: overline, underline: underline, strikeThrough: strikeThrough, justified: justified, centered: centered, righted: righted, text: text, plainText: plainText, markdown: markdown, asText: asText, Text: Text};+                  return _elm.Text.values+                };Elm.Time = Elm.Time || {};+Elm.Time.make = function (_elm)+                {+                  _elm.Time = _elm.Time || {};+                  if (_elm.Time.values)+                  return _elm.Time.values+                  var _N = Elm.Native,+                      _U = _N.Utils.make(_elm),+                      _L = _N.List.make(_elm),+                      _E = _N.Error.make(_elm),+                      _J = _N.JavaScript.make(_elm),+                      $moduleName = "Time";+                  var Basics = Elm.Basics.make(_elm);+                  var Native = Native || {};+                  Native.Time = Elm.Native.Time.make(_elm);+                  var Signal = Elm.Signal.make(_elm);+                  var _op = {};+                  var delay = Native.Time.delay;+                  var timestamp = Native.Time.timestamp;+                  var since = Native.Time.since;+                  var every = Native.Time.every;+                  var fpsWhen = Native.Time.fpsWhen;+                  var fps = Native.Time.fps;+                  var inMilliseconds = function (t)+                                       {+                                         return t+                                       };+                  var millisecond = 1;+                  var second = 1000 * millisecond;+                  var minute = 60 * second;+                  var hour = 60 * minute;+                  var inHours = function (t)+                                {+                                  return t / hour+                                };+                  var inMinutes = function (t)+                                  {+                                    return t / minute+                                  };+                  var inSeconds = function (t)+                                  {+                                    return t / second+                                  };+                  _elm.Time.values = {_op: _op, millisecond: millisecond, second: second, minute: minute, hour: hour, inMilliseconds: inMilliseconds, inSeconds: inSeconds, inMinutes: inMinutes, inHours: inHours, fps: fps, fpsWhen: fpsWhen, every: every, since: since, timestamp: timestamp, delay: delay};+                  return _elm.Time.values+                };Elm.Touch = Elm.Touch || {};+Elm.Touch.make = function (_elm)+                 {+                   _elm.Touch = _elm.Touch || {};+                   if (_elm.Touch.values)+                   return _elm.Touch.values+                   var _N = Elm.Native,+                       _U = _N.Utils.make(_elm),+                       _L = _N.List.make(_elm),+                       _E = _N.Error.make(_elm),+                       _J = _N.JavaScript.make(_elm),+                       $moduleName = "Touch";+                   var Native = Native || {};+                   Native.Touch = Elm.Native.Touch.make(_elm);+                   var Signal = Elm.Signal.make(_elm);+                   var Time = Elm.Time.make(_elm);+                   var _op = {};+                   var taps = Native.Touch.taps;+                   var touches = Native.Touch.touches;+                   var Touch = F6(function (a,b,c,d,e,f)+                                  {+                                    return {_: {}, id: c, t0: f, x: a, x0: d, y: b, y0: e}+                                  });+                   _elm.Touch.values = {_op: _op, touches: touches, taps: taps, Touch: Touch};+                   return _elm.Touch.values+                 };Elm.Transform2D = Elm.Transform2D || {};+Elm.Transform2D.make = function (_elm)+                       {+                         _elm.Transform2D = _elm.Transform2D || {};+                         if (_elm.Transform2D.values)+                         return _elm.Transform2D.values+                         var _N = Elm.Native,+                             _U = _N.Utils.make(_elm),+                             _L = _N.List.make(_elm),+                             _E = _N.Error.make(_elm),+                             _J = _N.JavaScript.make(_elm),+                             $moduleName = "Transform2D";+                         var Native = Native || {};+                         Native.Transform2D = Elm.Native.Transform2D.make(_elm);+                         var _op = {};+                         var multiply = Native.Transform2D.multiply;+                         var rotation = Native.Transform2D.rotation;+                         var matrix = Native.Transform2D.matrix;+                         var translation = F2(function (x,y)+                                              {+                                                return A6(matrix,1,0,0,1,x,y)+                                              });+                         var scale = function (s)+                                     {+                                       return A6(matrix,s,0,0,s,0,0)+                                     };+                         var scaleX = function (x)+                                      {+                                        return A6(matrix,x,0,0,1,0,0)+                                      };+                         var scaleY = function (y)+                                      {+                                        return A6(matrix,1,0,0,y,0,0)+                                      };+                         var identity = Native.Transform2D.identity;+                         var Transform2D = {ctor: "Transform2D"};+                         _elm.Transform2D.values = {_op: _op, identity: identity, matrix: matrix, rotation: rotation, translation: translation, scale: scale, scaleX: scaleX, scaleY: scaleY, multiply: multiply, Transform2D: Transform2D};+                         return _elm.Transform2D.values+                       };Elm.WebSocket = Elm.WebSocket || {};+Elm.WebSocket.make = function (_elm)+                     {+                       _elm.WebSocket = _elm.WebSocket || {};+                       if (_elm.WebSocket.values)+                       return _elm.WebSocket.values+                       var _N = Elm.Native,+                           _U = _N.Utils.make(_elm),+                           _L = _N.List.make(_elm),+                           _E = _N.Error.make(_elm),+                           _J = _N.JavaScript.make(_elm),+                           $moduleName = "WebSocket";+                       var Basics = Elm.Basics.make(_elm);+                       var Native = Native || {};+                       Native.WebSocket = Elm.Native.WebSocket.make(_elm);+                       var Signal = Elm.Signal.make(_elm);+                       var _op = {};+                       var connect = Native.WebSocket.connect;+                       _elm.WebSocket.values = {_op: _op, connect: connect};+                       return _elm.WebSocket.values+                     };Elm.Window = Elm.Window || {};+Elm.Window.make = function (_elm)+                  {+                    _elm.Window = _elm.Window || {};+                    if (_elm.Window.values)+                    return _elm.Window.values+                    var _N = Elm.Native,+                        _U = _N.Utils.make(_elm),+                        _L = _N.List.make(_elm),+                        _E = _N.Error.make(_elm),+                        _J = _N.JavaScript.make(_elm),+                        $moduleName = "Window";+                    var Native = Native || {};+                    Native.Window = Elm.Native.Window.make(_elm);+                    var Signal = Elm.Signal.make(_elm);+                    var _op = {};+                    var height = Native.Window.height;+                    var width = Native.Window.width;+                    var dimensions = Native.Window.dimensions;+                    _elm.Window.values = {_op: _op, dimensions: dimensions, width: width, height: height};+                    return _elm.Window.values+                  };Elm.Graphics = Elm.Graphics || {};+Elm.Graphics.Collage = Elm.Graphics.Collage || {};+Elm.Graphics.Collage.make = function (_elm)+                            {+                              _elm.Graphics = _elm.Graphics || {};+                              _elm.Graphics.Collage = _elm.Graphics.Collage || {};+                              if (_elm.Graphics.Collage.values)+                              return _elm.Graphics.Collage.values+                              var _N = Elm.Native,+                                  _U = _N.Utils.make(_elm),+                                  _L = _N.List.make(_elm),+                                  _E = _N.Error.make(_elm),+                                  _J = _N.JavaScript.make(_elm),+                                  $moduleName = "Graphics.Collage";+                              var Basics = Elm.Basics.make(_elm);+                              var Color = Elm.Color.make(_elm);+                              var Either = Elm.Either.make(_elm);+                              var Graphics = Graphics || {};+                              Graphics.Element = Elm.Graphics.Element.make(_elm);+                              var JavaScript = Elm.JavaScript.make(_elm);+                              var List = Elm.List.make(_elm);+                              var Maybe = Elm.Maybe.make(_elm);+                              var Native = Native || {};+                              Native.Graphics = Native.Graphics || {};+                              Native.Graphics.Collage = Elm.Native.Graphics.Collage.make(_elm);+                              var Transform2D = Elm.Transform2D.make(_elm);+                              var _op = {};+                              var ngon = F2(function (n,r)+                                            {+                                              return function ()+                                                     {+                                                       var m = Basics.toFloat(n);+                                                       var t = 2 * Basics.pi / m;+                                                       var f = function (i)+                                                               {+                                                                 return {ctor: "_Tuple2", _0: r * Basics.cos(t * i), _1: r * Basics.sin(t * i)}+                                                               };+                                                       return A2(List.map,f,_L.range(0,m - 1))+                                                     }()+                                            });+                              var oval = F2(function (w,h)+                                            {+                                              return function ()+                                                     {+                                                       var hh = h / 2;+                                                       var hw = w / 2;+                                                       var n = 50;+                                                       var t = 2 * Basics.pi / n;+                                                       var f = function (i)+                                                               {+                                                                 return {ctor: "_Tuple2", _0: hw * Basics.cos(t * i), _1: hh * Basics.sin(t * i)}+                                                               };+                                                       return A2(List.map,f,_L.range(0,n - 1))+                                                     }()+                                            });+                              var circle = function (r)+                                           {+                                             return A2(oval,2 * r,2 * r)+                                           };+                              var rect = F2(function (w,h)+                                            {+                                              return function ()+                                                     {+                                                       var hh = h / 2;+                                                       var hw = w / 2;+                                                       return _J.toList([{ctor: "_Tuple2", _0: 0 - hw, _1: 0 - hh},+                                                                         {ctor: "_Tuple2", _0: 0 - hw, _1: hh},+                                                                         {ctor: "_Tuple2", _0: hw, _1: hh},+                                                                         {ctor: "_Tuple2", _0: hw, _1: 0 - hh}])+                                                     }()+                                            });+                              var square = function (n)+                                           {+                                             return A2(rect,n,n)+                                           };+                              var polygon = function (points)+                                            {+                                              return points+                                            };+                              var segment = F2(function (p1,p2)+                                               {+                                                 return _J.toList([p1,p2])+                                               });+                              var path = function (ps)+                                         {+                                           return ps+                                         };+                              var collage = Native.Graphics.Collage.collage;+                              var alpha = F2(function (a,f)+                                             {+                                               return _U.replace([["alpha",a]],f)+                                             });+                              var rotate = F2(function (t,f)+                                              {+                                                return _U.replace([["theta",f.theta + t]],f)+                                              });+                              var scale = F2(function (s,f)+                                             {+                                               return _U.replace([["scale",f.scale * s]],f)+                                             });+                              var moveY = F2(function (y,f)+                                             {+                                               return _U.replace([["y",f.y + y]],f)+                                             });+                              var moveX = F2(function (x,f)+                                             {+                                               return _U.replace([["x",f.x + x]],f)+                                             });+                              var move = F2(function (_v0,f)+                                            {+                                              return function ()+                                                     {+                                                       switch (_v0.ctor)+                                                       {case+                                                        "_Tuple2" :+                                                          return _U.replace([["x",f.x + _v0._0],+                                                                             ["y",f.y + _v0._1]],+                                                                            f)}+                                                       _E.Case($moduleName,+                                                               "on line 170, column 20 to 48");+                                                     }()+                                            });+                              var form = function (f)+                                         {+                                           return {_: {}, alpha: 1, form: f, scale: 1, theta: 0, x: 0, y: 0}+                                         };+                              var FGroup = F2(function (a,b)+                                              {+                                                return {ctor: "FGroup", _0: a, _1: b}+                                              });+                              var group = function (fs)+                                          {+                                            return form(A2(FGroup,Transform2D.identity,fs))+                                          };+                              var groupTransform = F2(function (matrix,fs)+                                                      {+                                                        return form(A2(FGroup,matrix,fs))+                                                      });+                              var FElement = function (a)+                                             {+                                               return {ctor: "FElement", _0: a}+                                             };+                              var toForm = function (e)+                                           {+                                             return form(FElement(e))+                                           };+                              var FImage = F4(function (a,b,c,d)+                                              {+                                                return {ctor: "FImage", _0: a, _1: b, _2: c, _3: d}+                                              });+                              var sprite = F4(function (w,h,pos,src)+                                              {+                                                return form(A4(FImage,w,h,pos,src))+                                              });+                              var FShape = F2(function (a,b)+                                              {+                                                return {ctor: "FShape", _0: a, _1: b}+                                              });+                              var fill = F2(function (style,shape)+                                            {+                                              return form(A2(FShape,Either.Right(style),shape))+                                            });+                              var outlined = F2(function (style,shape)+                                                {+                                                  return form(A2(FShape,Either.Left(style),shape))+                                                });+                              var FPath = F2(function (a,b)+                                             {+                                               return {ctor: "FPath", _0: a, _1: b}+                                             });+                              var traced = F2(function (style,path)+                                              {+                                                return form(A2(FPath,style,path))+                                              });+                              var LineStyle = F6(function (a,b,c,d,e,f)+                                                 {+                                                   return {_: {}, cap: c, color: a, dashOffset: f, dashing: e, join: d, width: b}+                                                 });+                              var Clipped = {ctor: "Clipped"};+                              var Sharp = function (a)+                                          {+                                            return {ctor: "Sharp", _0: a}+                                          };+                              var Smooth = {ctor: "Smooth"};+                              var Padded = {ctor: "Padded"};+                              var Round = {ctor: "Round"};+                              var Flat = {ctor: "Flat"};+                              var defaultLine = {_: {}, cap: Flat, color: Color.black, dashOffset: 0, dashing: _J.toList([]), join: Sharp(10), width: 1};+                              var solid = function (clr)+                                          {+                                            return _U.replace([["color",clr]],defaultLine)+                                          };+                              var dashed = function (clr)+                                           {+                                             return _U.replace([["color",clr],+                                                                ["dashing",_J.toList([8,4])]],+                                                               defaultLine)+                                           };+                              var dotted = function (clr)+                                           {+                                             return _U.replace([["color",clr],+                                                                ["dashing",_J.toList([3,3])]],+                                                               defaultLine)+                                           };+                              var Grad = function (a)+                                         {+                                           return {ctor: "Grad", _0: a}+                                         };+                              var gradient = F2(function (grad,shape)+                                                {+                                                  return A2(fill,Grad(grad),shape)+                                                });+                              var Texture = function (a)+                                            {+                                              return {ctor: "Texture", _0: a}+                                            };+                              var textured = F2(function (src,shape)+                                                {+                                                  return A2(fill,Texture(src),shape)+                                                });+                              var Solid = function (a)+                                          {+                                            return {ctor: "Solid", _0: a}+                                          };+                              var filled = F2(function (color,shape)+                                              {+                                                return A2(fill,Solid(color),shape)+                                              });+                              var Form = F6(function (a,b,c,d,e,f)+                                            {+                                              return {_: {}, alpha: e, form: f, scale: b, theta: a, x: c, y: d}+                                            });+                              _elm.Graphics.Collage.values = {_op: _op, defaultLine: defaultLine, solid: solid, dashed: dashed, dotted: dotted, form: form, fill: fill, filled: filled, textured: textured, gradient: gradient, outlined: outlined, traced: traced, sprite: sprite, toForm: toForm, group: group, groupTransform: groupTransform, move: move, moveX: moveX, moveY: moveY, scale: scale, rotate: rotate, alpha: alpha, collage: collage, path: path, segment: segment, polygon: polygon, rect: rect, square: square, oval: oval, circle: circle, ngon: ngon, Solid: Solid, Texture: Texture, Grad: Grad, Flat: Flat, Round: Round, Padded: Padded, Smooth: Smooth, Sharp: Sharp, Clipped: Clipped, FPath: FPath, FShape: FShape, FImage: FImage, FElement: FElement, FGroup: FGroup, Form: Form, LineStyle: LineStyle};+                              return _elm.Graphics.Collage.values+                            };Elm.Graphics = Elm.Graphics || {};+Elm.Graphics.Element = Elm.Graphics.Element || {};+Elm.Graphics.Element.make = function (_elm)+                            {+                              _elm.Graphics = _elm.Graphics || {};+                              _elm.Graphics.Element = _elm.Graphics.Element || {};+                              if (_elm.Graphics.Element.values)+                              return _elm.Graphics.Element.values+                              var _N = Elm.Native,+                                  _U = _N.Utils.make(_elm),+                                  _L = _N.List.make(_elm),+                                  _E = _N.Error.make(_elm),+                                  _J = _N.JavaScript.make(_elm),+                                  $moduleName = "Graphics.Element";+                              var Basics = Elm.Basics.make(_elm);+                              var Color = Elm.Color.make(_elm);+                              var JavaScript = Elm.JavaScript.make(_elm);+                              var List = Elm.List.make(_elm);+                              var Maybe = Elm.Maybe.make(_elm);+                              var Native = Native || {};+                              Native.Utils = Elm.Native.Utils.make(_elm);+                              var _op = {};+                              var DOut = {ctor: "DOut"};+                              var outward = DOut;+                              var DIn = {ctor: "DIn"};+                              var inward = DIn;+                              var DRight = {ctor: "DRight"};+                              var right = DRight;+                              var DLeft = {ctor: "DLeft"};+                              var left = DLeft;+                              var DDown = {ctor: "DDown"};+                              var down = DDown;+                              var DUp = {ctor: "DUp"};+                              var up = DUp;+                              var Position = F4(function (a,b,c,d)+                                                {+                                                  return {_: {}, horizontal: a, vertical: b, x: c, y: d}+                                                });+                              var Relative = function (a)+                                             {+                                               return {ctor: "Relative", _0: a}+                                             };+                              var relative = Relative;+                              var Absolute = function (a)+                                             {+                                               return {ctor: "Absolute", _0: a}+                                             };+                              var absolute = Absolute;+                              var N = {ctor: "N"};+                              var bottomLeftAt = F2(function (x,y)+                                                    {+                                                      return {_: {}, horizontal: N, vertical: N, x: x, y: y}+                                                    });+                              var Z = {ctor: "Z"};+                              var middle = {_: {}, horizontal: Z, vertical: Z, x: Relative(0.5), y: Relative(0.5)};+                              var midLeft = _U.replace([["horizontal",N],["x",Absolute(0)]],+                                                       middle);+                              var middleAt = F2(function (x,y)+                                                {+                                                  return {_: {}, horizontal: Z, vertical: Z, x: x, y: y}+                                                });+                              var midLeftAt = F2(function (x,y)+                                                 {+                                                   return {_: {}, horizontal: N, vertical: Z, x: x, y: y}+                                                 });+                              var midBottomAt = F2(function (x,y)+                                                   {+                                                     return {_: {}, horizontal: Z, vertical: N, x: x, y: y}+                                                   });+                              var P = {ctor: "P"};+                              var topLeft = {_: {}, horizontal: N, vertical: P, x: Absolute(0), y: Absolute(0)};+                              var bottomLeft = _U.replace([["vertical",N]],topLeft);+                              var topRight = _U.replace([["horizontal",P]],topLeft);+                              var bottomRight = _U.replace([["horizontal",P]],bottomLeft);+                              var midRight = _U.replace([["horizontal",P]],midLeft);+                              var midTop = _U.replace([["vertical",P],["y",Absolute(0)]],middle);+                              var midBottom = _U.replace([["vertical",N]],midTop);+                              var topLeftAt = F2(function (x,y)+                                                 {+                                                   return {_: {}, horizontal: N, vertical: P, x: x, y: y}+                                                 });+                              var topRightAt = F2(function (x,y)+                                                  {+                                                    return {_: {}, horizontal: P, vertical: P, x: x, y: y}+                                                  });+                              var bottomRightAt = F2(function (x,y)+                                                     {+                                                       return {_: {}, horizontal: P, vertical: N, x: x, y: y}+                                                     });+                              var midRightAt = F2(function (x,y)+                                                  {+                                                    return {_: {}, horizontal: P, vertical: Z, x: x, y: y}+                                                  });+                              var midTopAt = F2(function (x,y)+                                                {+                                                  return {_: {}, horizontal: Z, vertical: P, x: x, y: y}+                                                });+                              var Tiled = {ctor: "Tiled"};+                              var Cropped = function (a)+                                            {+                                              return {ctor: "Cropped", _0: a}+                                            };+                              var Fitted = {ctor: "Fitted"};+                              var Plain = {ctor: "Plain"};+                              var Custom = {ctor: "Custom"};+                              var RawHtml = {ctor: "RawHtml"};+                              var Spacer = {ctor: "Spacer"};+                              var Flow = F2(function (a,b)+                                            {+                                              return {ctor: "Flow", _0: a, _1: b}+                                            });+                              var Container = F2(function (a,b)+                                                 {+                                                   return {ctor: "Container", _0: a, _1: b}+                                                 });+                              var Image = F4(function (a,b,c,d)+                                             {+                                               return {ctor: "Image", _0: a, _1: b, _2: c, _3: d}+                                             });+                              var emptyStr = JavaScript.fromString("");+                              var link = F2(function (href,e)+                                            {+                                              return function ()+                                                     {+                                                       var p = e.props;+                                                       return {_: {}, element: e.element, props: _U.replace([["href",+                                                                                                              JavaScript.fromString(href)]],+                                                                                                            p)}+                                                     }()+                                            });+                              var tag = F2(function (name,e)+                                           {+                                             return function ()+                                                    {+                                                      var p = e.props;+                                                      return {_: {}, element: e.element, props: _U.replace([["tag",+                                                                                                             JavaScript.fromString(name)]],+                                                                                                           p)}+                                                    }()+                                           });+                              var color = F2(function (c,e)+                                             {+                                               return function ()+                                                      {+                                                        var p = e.props;+                                                        return {_: {}, element: e.element, props: _U.replace([["color",+                                                                                                               Maybe.Just(c)]],+                                                                                                             p)}+                                                      }()+                                             });+                              var opacity = F2(function (o,e)+                                               {+                                                 return function ()+                                                        {+                                                          var p = e.props;+                                                          return {_: {}, element: e.element, props: _U.replace([["opacity",+                                                                                                                 o]],+                                                                                                               p)}+                                                        }()+                                               });+                              var height = F2(function (nh,e)+                                              {+                                                return function ()+                                                       {+                                                         var p = e.props;+                                                         var props = function ()+                                                                     {+                                                                       var _v0 = e.element;+                                                                       switch (_v0.ctor)+                                                                       {case+                                                                        "Image" :+                                                                          return _U.replace([["width",+                                                                                              Basics.round(Basics.toFloat(_v0._1) / Basics.toFloat(_v0._2) * Basics.toFloat(nh))]],+                                                                                            p)}+                                                                       return p+                                                                     }();+                                                         return {_: {}, element: e.element, props: _U.replace([["height",+                                                                                                                nh]],+                                                                                                              p)}+                                                       }()+                                              });+                              var width = F2(function (nw,e)+                                             {+                                               return function ()+                                                      {+                                                        var p = e.props;+                                                        var props = function ()+                                                                    {+                                                                      var _v5 = e.element;+                                                                      switch (_v5.ctor)+                                                                      {case+                                                                       "Image" :+                                                                         return _U.replace([["height",+                                                                                             Basics.round(Basics.toFloat(_v5._2) / Basics.toFloat(_v5._1) * Basics.toFloat(nw))]],+                                                                                           p)+                                                                       case+                                                                       "RawHtml" :+                                                                         return _U.replace([["height",+                                                                                             Basics.snd(A2(Native.Utils.htmlHeight,+                                                                                                           nw,+                                                                                                           e.element))]],+                                                                                           p)}+                                                                      return p+                                                                    }();+                                                        return {_: {}, element: e.element, props: _U.replace([["width",+                                                                                                               nw]],+                                                                                                             props)}+                                                      }()+                                             });+                              var size = F3(function (w,h,e)+                                            {+                                              return A2(height,h,A2(width,w,e))+                                            });+                              var sizeOf = function (e)+                                           {+                                             return {ctor: "_Tuple2", _0: e.props.width, _1: e.props.height}+                                           };+                              var heightOf = function (e)+                                             {+                                               return e.props.height+                                             };+                              var widthOf = function (e)+                                            {+                                              return e.props.width+                                            };+                              var Element = F2(function (a,b)+                                               {+                                                 return {_: {}, element: b, props: a}+                                               });+                              var Properties = F8(function (a,b,c,d,e,f,g,h)+                                                  {+                                                    return {_: {}, color: e, height: c, hover: h, href: f, id: a, opacity: d, tag: g, width: b}+                                                  });+                              var newElement = F3(function (w,h,e)+                                                  {+                                                    return {_: {}, element: e, props: A8(Properties,+                                                                                         Native.Utils.guid({ctor: "_Tuple0"}),+                                                                                         w,+                                                                                         h,+                                                                                         1,+                                                                                         Maybe.Nothing,+                                                                                         emptyStr,+                                                                                         emptyStr,+                                                                                         {ctor: "_Tuple0"})}+                                                  });+                              var image = F3(function (w,h,src)+                                             {+                                               return A3(newElement,+                                                         w,+                                                         h,+                                                         A4(Image,+                                                            Plain,+                                                            w,+                                                            h,+                                                            JavaScript.fromString(src)))+                                             });+                              var fittedImage = F3(function (w,h,src)+                                                   {+                                                     return A3(newElement,+                                                               w,+                                                               h,+                                                               A4(Image,+                                                                  Fitted,+                                                                  w,+                                                                  h,+                                                                  JavaScript.fromString(src)))+                                                   });+                              var croppedImage = F4(function (pos,w,h,src)+                                                    {+                                                      return A3(newElement,+                                                                w,+                                                                h,+                                                                A4(Image,+                                                                   Cropped(pos),+                                                                   w,+                                                                   h,+                                                                   JavaScript.fromString(src)))+                                                    });+                              var tiledImage = F3(function (w,h,src)+                                                  {+                                                    return A3(newElement,+                                                              w,+                                                              h,+                                                              A4(Image,+                                                                 Tiled,+                                                                 w,+                                                                 h,+                                                                 JavaScript.fromString(src)))+                                                  });+                              var container = F4(function (w,h,pos,e)+                                                 {+                                                   return A3(newElement,w,h,A2(Container,pos,e))+                                                 });+                              var spacer = F2(function (w,h)+                                              {+                                                return A3(newElement,w,h,Spacer)+                                              });+                              var empty = A2(spacer,0,0);+                              var flow = F2(function (dir,es)+                                            {+                                              return function ()+                                                     {+                                                       var newFlow = F2(function (w,h)+                                                                        {+                                                                          return A3(newElement,+                                                                                    w,+                                                                                    h,+                                                                                    A2(Flow,dir,es))+                                                                        });+                                                       var hs = A2(List.map,heightOf,es);+                                                       var ws = A2(List.map,widthOf,es);+                                                       return _U.eq(es,+                                                                    _J.toList([])) ? empty : function ()+                                                                                             {+                                                                                               switch (dir.ctor)+                                                                                               {case+                                                                                                "DDown" :+                                                                                                  return A2(newFlow,+                                                                                                            List.maximum(ws),+                                                                                                            List.sum(hs))+                                                                                                case+                                                                                                "DIn" :+                                                                                                  return A2(newFlow,+                                                                                                            List.maximum(ws),+                                                                                                            List.maximum(hs))+                                                                                                case+                                                                                                "DLeft" :+                                                                                                  return A2(newFlow,+                                                                                                            List.sum(ws),+                                                                                                            List.maximum(hs))+                                                                                                case+                                                                                                "DOut" :+                                                                                                  return A2(newFlow,+                                                                                                            List.maximum(ws),+                                                                                                            List.maximum(hs))+                                                                                                case+                                                                                                "DRight" :+                                                                                                  return A2(newFlow,+                                                                                                            List.sum(ws),+                                                                                                            List.maximum(hs))+                                                                                                case+                                                                                                "DUp" :+                                                                                                  return A2(newFlow,+                                                                                                            List.maximum(ws),+                                                                                                            List.sum(hs))}+                                                                                               _E.Case($moduleName,+                                                                                                       "between lines 206 and 216");+                                                                                             }()+                                                     }()+                                            });+                              var above = F2(function (hi,lo)+                                             {+                                               return A3(newElement,+                                                         A2(Basics.max,widthOf(hi),widthOf(lo)),+                                                         heightOf(hi) + heightOf(lo),+                                                         A2(Flow,DDown,_J.toList([hi,lo])))+                                             });+                              var below = F2(function (lo,hi)+                                             {+                                               return A3(newElement,+                                                         A2(Basics.max,widthOf(hi),widthOf(lo)),+                                                         heightOf(hi) + heightOf(lo),+                                                         A2(Flow,DDown,_J.toList([hi,lo])))+                                             });+                              var beside = F2(function (lft,rht)+                                              {+                                                return A3(newElement,+                                                          widthOf(lft) + widthOf(rht),+                                                          A2(Basics.max,+                                                             heightOf(lft),+                                                             heightOf(rht)),+                                                          A2(Flow,right,_J.toList([lft,rht])))+                                              });+                              var layers = function (es)+                                           {+                                             return function ()+                                                    {+                                                      var hs = A2(List.map,heightOf,es);+                                                      var ws = A2(List.map,widthOf,es);+                                                      return A3(newElement,+                                                                List.maximum(ws),+                                                                List.maximum(hs),+                                                                A2(Flow,DOut,es))+                                                    }()+                                           };+                              _elm.Graphics.Element.values = {_op: _op, empty: empty, widthOf: widthOf, heightOf: heightOf, sizeOf: sizeOf, width: width, height: height, size: size, opacity: opacity, color: color, tag: tag, link: link, emptyStr: emptyStr, newElement: newElement, image: image, fittedImage: fittedImage, croppedImage: croppedImage, tiledImage: tiledImage, container: container, spacer: spacer, flow: flow, above: above, below: below, beside: beside, layers: layers, absolute: absolute, relative: relative, middle: middle, topLeft: topLeft, topRight: topRight, bottomLeft: bottomLeft, bottomRight: bottomRight, midLeft: midLeft, midRight: midRight, midTop: midTop, midBottom: midBottom, middleAt: middleAt, topLeftAt: topLeftAt, topRightAt: topRightAt, bottomLeftAt: bottomLeftAt, bottomRightAt: bottomRightAt, midLeftAt: midLeftAt, midRightAt: midRightAt, midTopAt: midTopAt, midBottomAt: midBottomAt, up: up, down: down, left: left, right: right, inward: inward, outward: outward, Image: Image, Container: Container, Flow: Flow, Spacer: Spacer, RawHtml: RawHtml, Custom: Custom, Plain: Plain, Fitted: Fitted, Cropped: Cropped, Tiled: Tiled, P: P, Z: Z, N: N, Absolute: Absolute, Relative: Relative, DUp: DUp, DDown: DDown, DLeft: DLeft, DRight: DRight, DIn: DIn, DOut: DOut, Properties: Properties, Element: Element, Position: Position};+                              return _elm.Graphics.Element.values+                            };Elm.Graphics = Elm.Graphics || {};+Elm.Graphics.Input = Elm.Graphics.Input || {};+Elm.Graphics.Input.make = function (_elm)+                          {+                            _elm.Graphics = _elm.Graphics || {};+                            _elm.Graphics.Input = _elm.Graphics.Input || {};+                            if (_elm.Graphics.Input.values)+                            return _elm.Graphics.Input.values+                            var _N = Elm.Native,+                                _U = _N.Utils.make(_elm),+                                _L = _N.List.make(_elm),+                                _E = _N.Error.make(_elm),+                                _J = _N.JavaScript.make(_elm),+                                $moduleName = "Graphics.Input";+                            var Basics = Elm.Basics.make(_elm);+                            var Graphics = Graphics || {};+                            Graphics.Element = Elm.Graphics.Element.make(_elm);+                            var JavaScript = Elm.JavaScript.make(_elm);+                            var List = Elm.List.make(_elm);+                            var Maybe = Elm.Maybe.make(_elm);+                            var Native = Native || {};+                            Native.Graphics = Native.Graphics || {};+                            Native.Graphics.Input = Elm.Native.Graphics.Input.make(_elm);+                            var Signal = Elm.Signal.make(_elm);+                            var _op = {};+                            var dropDown = Native.Graphics.Input.dropDown;+                            var stringDropDown = function (strs)+                                                 {+                                                   return dropDown(A2(List.map,+                                                                      function (s)+                                                                      {+                                                                        return {ctor: "_Tuple2", _0: s, _1: s}+                                                                      },+                                                                      strs))+                                                 };+                            var emptyFieldState = {_: {}, selectionEnd: 0, selectionStart: 0, string: ""};+                            var fields = Native.Graphics.Input.fields;+                            var FieldState = F3(function (a,b,c)+                                                {+                                                  return {_: {}, selectionEnd: c, selectionStart: b, string: a}+                                                });+                            var hoverables = Native.Graphics.Input.hoverables;+                            var checkboxes = Native.Graphics.Input.checkboxes;+                            var customButtons = Native.Graphics.Input.customButtons;+                            var customButton = F3(function (up,hover,down)+                                                  {+                                                    return function ()+                                                           {+                                                             var pool = customButtons({ctor: "_Tuple0"});+                                                             return {ctor: "_Tuple2", _0: A4(pool.customButton,+                                                                                             {ctor: "_Tuple0"},+                                                                                             up,+                                                                                             hover,+                                                                                             down), _1: pool.events}+                                                           }()+                                                  });+                            var buttons = Native.Graphics.Input.buttons;+                            var button = function (txt)+                                         {+                                           return function ()+                                                  {+                                                    var pool = buttons({ctor: "_Tuple0"});+                                                    return {ctor: "_Tuple2", _0: A2(pool.button,+                                                                                    {ctor: "_Tuple0"},+                                                                                    txt), _1: pool.events}+                                                  }()+                                         };+                            var id = function (x)+                                     {+                                       return x+                                     };+                            var checkbox = function (b)+                                           {+                                             return function ()+                                                    {+                                                      var cbs = checkboxes(b);+                                                      return {ctor: "_Tuple2", _0: A2(Signal.lift,+                                                                                      cbs.checkbox(id),+                                                                                      cbs.events), _1: cbs.events}+                                                    }()+                                           };+                            var hoverable = function (elem)+                                            {+                                              return function ()+                                                     {+                                                       var pool = hoverables(false);+                                                       return {ctor: "_Tuple2", _0: A2(pool.hoverable,+                                                                                       id,+                                                                                       elem), _1: pool.events}+                                                     }()+                                            };+                            var field = function (placeHolder)+                                        {+                                          return function ()+                                                 {+                                                   var tfs = fields(emptyFieldState);+                                                   var changes = Signal.dropRepeats(tfs.events);+                                                   return {ctor: "_Tuple2", _0: A2(Signal.lift,+                                                                                   A2(tfs.field,+                                                                                      id,+                                                                                      placeHolder),+                                                                                   changes), _1: Signal.dropRepeats(A2(Signal.lift,+                                                                                                                       function (_)+                                                                                                                       {+                                                                                                                         return _.string+                                                                                                                       },+                                                                                                                       changes))}+                                                 }()+                                        };+                            var password = function (placeHolder)+                                           {+                                             return function ()+                                                    {+                                                      var tfs = Native.Graphics.Input.passwords(emptyFieldState);+                                                      var changes = Signal.dropRepeats(tfs.events);+                                                      return {ctor: "_Tuple2", _0: A2(Signal.lift,+                                                                                      A2(tfs.field,+                                                                                         id,+                                                                                         placeHolder),+                                                                                      changes), _1: Signal.dropRepeats(A2(Signal.lift,+                                                                                                                          function (_)+                                                                                                                          {+                                                                                                                            return _.string+                                                                                                                          },+                                                                                                                          changes))}+                                                    }()+                                           };+                            var email = function (placeHolder)+                                        {+                                          return function ()+                                                 {+                                                   var tfs = Native.Graphics.Input.emails(emptyFieldState);+                                                   var changes = Signal.dropRepeats(tfs.events);+                                                   return {ctor: "_Tuple2", _0: A2(Signal.lift,+                                                                                   A2(tfs.field,+                                                                                      id,+                                                                                      placeHolder),+                                                                                   changes), _1: Signal.dropRepeats(A2(Signal.lift,+                                                                                                                       function (_)+                                                                                                                       {+                                                                                                                         return _.string+                                                                                                                       },+                                                                                                                       changes))}+                                                 }()+                                        };+                            _elm.Graphics.Input.values = {_op: _op, id: id, buttons: buttons, button: button, customButtons: customButtons, customButton: customButton, checkboxes: checkboxes, checkbox: checkbox, hoverables: hoverables, hoverable: hoverable, fields: fields, emptyFieldState: emptyFieldState, field: field, password: password, email: email, dropDown: dropDown, stringDropDown: stringDropDown, FieldState: FieldState};+                            return _elm.Graphics.Input.values+                          };Elm.JavaScript = Elm.JavaScript || {};+Elm.JavaScript.Experimental = Elm.JavaScript.Experimental || {};+Elm.JavaScript.Experimental.make = function (_elm)+                                   {+                                     _elm.JavaScript = _elm.JavaScript || {};+                                     _elm.JavaScript.Experimental = _elm.JavaScript.Experimental || {};+                                     if (_elm.JavaScript.Experimental.values)+                                     return _elm.JavaScript.Experimental.values+                                     var _N = Elm.Native,+                                         _U = _N.Utils.make(_elm),+                                         _L = _N.List.make(_elm),+                                         _E = _N.Error.make(_elm),+                                         _J = _N.JavaScript.make(_elm),+                                         $moduleName = "JavaScript.Experimental";+                                     var JavaScript = Elm.JavaScript.make(_elm);+                                     var Native = Native || {};+                                     Native.JavaScript = Elm.Native.JavaScript.make(_elm);+                                     var _op = {};+                                     var fromRecord = Native.JavaScript.fromRecord;+                                     var toRecord = Native.JavaScript.toRecord;+                                     _elm.JavaScript.Experimental.values = {_op: _op, toRecord: toRecord, fromRecord: fromRecord};+                                     return _elm.JavaScript.Experimental.values+                                   };(function() {++// Returns boolean indicating if the swap was successful.+// Requires that the two signal graphs have exactly the same+// structure.+ElmRuntime.swap = function(from, to) {+    function similar(nodeOld,nodeNew) {+        idOkay = nodeOld.id === nodeNew.id;+        lengthOkay = nodeOld.kids.length === nodeNew.kids.length;+        return idOkay && lengthOkay;+    }+    function swap(nodeOld,nodeNew) {+        nodeNew.value = nodeOld.value;+        return true;+    }+    var canSwap = depthFirstTraversals(similar, from.inputs, to.inputs);+    if (canSwap) { depthFirstTraversals(swap, from.inputs, to.inputs); }+    from.node.parentNode.replaceChild(to.node, from.node);+    return canSwap;+}++// Returns false if the node operation f ever fails.+function depthFirstTraversals(f, queueOld, queueNew) {+    if (queueOld.length !== queueNew.length) return false;+    queueOld = queueOld.slice(0);+    queueNew = queueNew.slice(0);++    var seen = [];+    while (queueOld.length > 0 && queueNew.length > 0) {+        var nodeOld = queueOld.pop();+        var nodeNew = queueNew.pop();+        if (seen.indexOf(nodeOld.id) < 0) {+            if (!f(nodeOld, nodeNew)) return false;+            queueOld = queueOld.concat(nodeOld.kids);+            queueNew = queueNew.concat(nodeNew.kids);+            seen.push(nodeOld.id);+        }+    }+    return true;+}++}());++(function() {+'use strict';++Elm.fullscreen = function(module, ports) {+    var style = document.createElement('style');+    style.type = 'text/css';+    style.innerHTML = "html,head,body { padding:0; margin:0; }" ++        "body { font-family: calibri, helvetica, arial, sans-serif; }";+    document.head.appendChild(style);+    var container = document.createElement('div');+    document.body.appendChild(container);+    return init(ElmRuntime.Display.FULLSCREEN, container, module, ports || {});+};++Elm.embed = function(module, container, ports) {+    var tag = container.tagName;+    if (tag !== 'DIV') {+        throw new Error('Elm.node must be given a DIV, not a ' + tag + '.');+    } else if (container.hasChildNodes()) {+        throw new Error('Elm.node must be given an empty DIV. No children allowed!');+    }+    return init(ElmRuntime.Display.COMPONENT, container, module, ports || {});+};++Elm.worker = function(module, ports) {+    return init(ElmRuntime.Display.NONE, {}, module, ports || {});+};++function init(display, container, module, ports, moduleToReplace) {+  // defining state needed for an instance of the Elm RTS+  var inputs = [];++  var updateInProgress = false;+  function notify(id, v) {+      if (updateInProgress) {+          throw new Error(+              'The notify function has been called synchronously!\n' ++              'This can lead to frames being dropped.\n' ++              'Definitely report this to <https://github.com/evancz/Elm/issues>\n');+      }+      updateInProgress = true;+      var timestep = Date.now();+      for (var i = inputs.length; i--; ) {+          inputs[i].recv(timestep, id, v);+      }+      updateInProgress = false;+  }++  var listeners = [];+  function addListener(relevantInputs, domNode, eventName, func) {+      domNode.addEventListener(eventName, func);+      var listener = {+          relevantInputs: relevantInputs,+          domNode: domNode,+          eventName: eventName,+          func: func+      };+      listeners.push(listener);+  }++  var portUses = {}+  for (var key in ports) {+      portUses[key] = 0;+  }+  // create the actual RTS. Any impure modules will attach themselves to this+  // object. This permits many Elm programs to be embedded per document.+  var elm = {+      notify:notify,+      node:container,+      display:display,+      id:ElmRuntime.guid(),+      addListener:addListener,+      inputs:inputs,+      ports: { incoming:ports, outgoing:{}, uses:portUses }+  };++  function swap(newModule) {+      removeListeners(listeners);+      var div = document.createElement('div');+      var newElm = init(display, div, newModule, ports, elm);+      inputs = [];+      // elm.swap = newElm.swap;+      return newElm;+  }++  var Module = {};+  var reportAnyErrors = function() {};+  try {+      Module = module.make(elm);+      checkPorts(elm);+  } catch(e) {+      var directions = "<br/>&nbsp; &nbsp; Open the developer console for more details."+      Module.main = Elm.Text.make(elm).text('<code>' + e.message + directions + '</code>');+      reportAnyErrors = function() { throw e; }+  }+  inputs = ElmRuntime.filterDeadInputs(inputs);+  filterListeners(inputs, listeners);+  addReceivers(elm.ports.outgoing);+  if (display !== ElmRuntime.Display.NONE) {+      var graphicsNode = initGraphics(elm, Module);+  }+  if (typeof moduleToReplace !== 'undefined') {+      ElmRuntime.swap(moduleToReplace, elm);++      // rerender scene if graphics are enabled.+      if (typeof graphicsNode !== 'undefined') {+          graphicsNode.recv(0, true, 0);+      }+  }++  reportAnyErrors();+  return { swap:swap, ports:elm.ports.outgoing };+};++function checkPorts(elm) {+    var portUses = elm.ports.uses;+    for (var key in portUses) {+        var uses = portUses[key]+        if (uses === 0) {+            throw new Error(+                "Initialization Error: provided port '" + key ++                "' to a module that does not take it as in input.\n" ++                "Remove '" + key + "' from the module initialization code.");+        } else if (uses > 1) {+            throw new Error(+                "Initialization Error: port '" + key ++                "' has been declared multiple times in the Elm code.\n" ++                "Remove declarations until there is exactly one.");+        }+    }+}+    +function filterListeners(inputs, listeners) {+    loop:+    for (var i = listeners.length; i--; ) {+        var listener = listeners[i];+        for (var j = inputs.length; j--; ) {+            if (listener.relevantInputs.indexOf(inputs[j].id) >= 0) {+                continue loop;+            }+        }+        listener.domNode.removeEventListener(listener.eventName, listener.func);+    }+}++function removeListeners(listeners) {+    for (var i = listeners.length; i--; ) {+        var listener = listeners[i];+        listener.domNode.removeEventListener(listener.eventName, listener.func);+    }+}++// add receivers for built-in ports if they are defined+function addReceivers(ports) {+    if ('log' in ports) {+        ports.log.subscribe(function(v) { console.log(v) });+    }+    if ('stdout' in ports) {+        var process = process || {};+        var handler = process.stdout+            ? function(v) { process.stdout.write(v); }+            : function(v) { console.log(v); };+        ports.stdout.subscribe(handler);+    }+    if ('stderr' in ports) {+        var process = process || {};+        var handler = process.stderr+            ? function(v) { process.stderr.write(v); }+            : function(v) { console.log('Error:' + v); };+        ports.stderr.subscribe(handler);+    }+    if ('title' in ports) {+        if (typeof ports.title === 'string') {+            document.title = ports.title;+        } else {+            ports.title.subscribe(function(v) { document.title = v; });+        }+    }+    if ('redirect' in ports) {+        ports.redirect.subscribe(function(v) {+            if (v.length > 0) window.location = v;+        });+    }+    if ('favicon' in ports) {+        if (typeof ports.favicon === 'string') {+            changeFavicon(ports.favicon);+        } else {+            ports.favicon.subscribe(changeFavicon);+        }+    }+    function changeFavicon(src) {+        var link = document.createElement('link');+        var oldLink = document.getElementById('elm-favicon');+        link.id = 'elm-favicon';+        link.rel = 'shortcut icon';+        link.href = src;+        if (oldLink) {+            document.head.removeChild(oldLink);+        }+        document.head.appendChild(link);+    }+}++function initGraphics(elm, Module) {+  if (!('main' in Module))+      throw new Error("'main' is missing! What do I display?!");++  var signalGraph = Module.main;++  // make sure the signal graph is actually a signal & extract the visual model+  var Signal = Elm.Signal.make(elm);+  if (!('recv' in signalGraph)) {+      signalGraph = Signal.constant(signalGraph);+  }+  var currentScene = signalGraph.value;++ // Add the currentScene to the DOM+  var Render = ElmRuntime.use(ElmRuntime.Render.Element);+  elm.node.appendChild(Render.render(currentScene));++  // set up updates so that the DOM is adjusted as necessary.+  var savedScene = currentScene;+  function domUpdate(newScene) {+      ElmRuntime.draw(function(_) {+          Render.update(elm.node.firstChild, savedScene, newScene);+          if (elm.Native.Window) elm.Native.Window.values.resizeIfNeeded();+          savedScene = newScene;+      });+  }+  var renderer = A2(Signal.lift, domUpdate, signalGraph);++  // must check for resize after 'renderer' is created so+  // that changes show up.+  if (elm.Native.Window) elm.Native.Window.values.resizeIfNeeded();++  return renderer;+}++}());++(function() {+'use strict';++ElmRuntime.Display = { FULLSCREEN: 0, COMPONENT: 1, NONE: 2 };++ElmRuntime.counter = 0;+ElmRuntime.guid = function() { return ElmRuntime.counter++; }++ElmRuntime.use = function(M) {+    if (typeof M === 'function') M = M();+    return M;+};++function isAlive(input) {+    if (!('defaultNumberOfKids' in input)) return true;+    var len = input.kids.length;+    if (len === 0) return false;+    if (len > input.defaultNumberOfKids) return true;+    var alive = false;+    for (var i = len; i--; ) {+        alive = alive || isAlive(input.kids[i]);+    }+    return alive;+}++ElmRuntime.filterDeadInputs = function(inputs) {+    var temp = [];+    for (var i = inputs.length; i--; ) {+        if (isAlive(inputs[i])) temp.push(inputs[i]);+    }+    return temp;+};++// define the draw function+var vendors = ['ms', 'moz', 'webkit', 'o'];+var win = window || {};+for (var i = 0; i < vendors.length && !win.requestAnimationFrame; ++i) {+    win.requestAnimationFrame = win[vendors[i]+'RequestAnimationFrame'];+    win.cancelAnimationFrame  = win[vendors[i]+'CancelAnimationFrame'] ||+                                win[vendors[i]+'CancelRequestAnimationFrame'];+}++if (win.requestAnimationFrame && win.cancelAnimationFrame) {+    var previous = 0;+    ElmRuntime.draw = function(callback) {+        win.cancelAnimationFrame(previous);+        previous = win.requestAnimationFrame(callback);+    };+} else {+    ElmRuntime.draw = function(callback) { callback(); };+}++}());++ElmRuntime.Render.Collage = function() {++var Render = ElmRuntime.use(ElmRuntime.Render.Element);+var Transform = Elm.Transform2D.make({});+var Utils = ElmRuntime.use(ElmRuntime.Render.Utils);+var newElement = Utils.newElement,+    extract = Utils.extract, fromList = Utils.fromList,+    fromString = Utils.fromString, addTransform = Utils.addTransform;++function trace(ctx, path) {+    var points = fromList(path);+    var i = points.length - 1;+    if (i <= 0) return;+    ctx.moveTo(points[i]._0, points[i]._1);+    while (i--) { ctx.lineTo(points[i]._0, points[i]._1); }+    if (path.closed) {+        i = points.length - 1;+        ctx.lineTo(points[i]._0, points[i]._1);+    }+}++function line(ctx,style,path) {+    style.dashing.ctor === 'Nil' ? trace(ctx, path) : customLineHelp(ctx, style, path);+    ctx.scale(1,-1);+    ctx.stroke();+}++function customLineHelp(ctx, style, path) {+    var points = fromList(path);+    if (path.closed) points.push(points[0]);+    var pattern = fromList(style.dashing);+    var i = points.length - 1;+    if (i <= 0) return;+    var x0 = points[i]._0, y0 = points[i]._1;+    var x1=0, y1=0, dx=0, dy=0, remaining=0, nx=0, ny=0;+    var pindex = 0, plen = pattern.length;+    var draw = true, segmentLength = pattern[0];+    ctx.moveTo(x0,y0);+    while (i--) {+        x1 = points[i]._0; y1 = points[i]._1;+        dx = x1 - x0; dy = y1 - y0;+        remaining = Math.sqrt(dx * dx + dy * dy);+        while (segmentLength <= remaining) {+            x0 += dx * segmentLength / remaining;+            y0 += dy * segmentLength / remaining;+            ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);+            // update starting position+            dx = x1 - x0; dy = y1 - y0;+            remaining = Math.sqrt(dx * dx + dy * dy);+            // update pattern+            draw = !draw;+            pindex = (pindex + 1) % plen;+            segmentLength = pattern[pindex];+        }+        if (remaining > 0) {+            ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);+            segmentLength -= remaining;+        }+        x0 = x1; y0 = y1;+    }+}++function drawLine(ctx, style, path) {+    ctx.lineWidth = style.width;+    var cap = style.cap.ctor;+    ctx.lineCap = cap === 'Flat' ? 'butt' :+                  cap === 'Round' ? 'round' : 'square';+    var join = style.join.ctor;+    ctx.lineJoin = join === 'Smooth' ? 'round' :+                   join === 'Sharp' ? 'miter' : 'bevel';+    ctx.miterLimit = style.join._0 || 10;+    ctx.strokeStyle = extract(style.color);+    return line(ctx, style, path);+}++function texture(redo, ctx, src) {+    var img = new Image();+    img.src = fromString(src);+    img.onload = redo;+    return ctx.createPattern(img, 'repeat');+}++function gradient(ctx, grad) {+  var g;+  var stops = [];+  if (grad.ctor === 'Linear') {+    var p0 = grad._0, p1 = grad._1;+    g = ctx.createLinearGradient(p0._0, -p0._1, p1._0, -p1._1);+    stops = fromList(grad._2);+  } else {+    var p0 = grad._0, p2 = grad._2;+    g = ctx.createRadialGradient(p0._0, -p0._1, grad._1, p2._0, -p2._1, grad._3);+    stops = fromList(grad._4);+  }+  var len = stops.length;+  for (var i = 0; i < len; ++i) {+    var stop = stops[i];+    g.addColorStop(stop._0, extract(stop._1));+  }+  return g;+}++function drawShape(redo, ctx, style, path) {+    trace(ctx, path);+    var sty = style.ctor;+    ctx.fillStyle =+        sty === 'Solid' ? extract(style._0) :+        sty === 'Texture' ? texture(redo, ctx, style._0) : gradient(ctx, style._0);+    ctx.scale(1,-1);+    ctx.fill();+}++function drawImage(redo, ctx, form) {+    var img = new Image();+    img.onload = redo;+    img.src = fromString(form._3);+    var w = form._0,+        h = form._1,+        pos = form._2,+        srcX = pos._0,+        srcY = pos._1,+        srcW = w,+        srcH = h,+        destX = -w/2,+        destY = -h/2,+        destW = w,+        destH = h;++    ctx.scale(1,-1);+    ctx.drawImage(img, srcX, srcY, srcW, srcH, destX, destY, destW, destH);+}++function renderForm(redo, ctx, form) {+    ctx.save();+    var x = form.x, y = form.y, theta = form.theta, scale = form.scale;+    if (x !== 0 || y !== 0) ctx.translate(x, y);+    if (theta !== 0) ctx.rotate(theta);+    if (scale !== 1) ctx.scale(scale,scale);+    if (form.alpha !== 1) ctx.globalAlpha = ctx.globalAlpha * form.alpha;+    ctx.beginPath();+    var f = form.form;+    switch(f.ctor) {+    case 'FPath' : drawLine(ctx, f._0, f._1); break;+    case 'FImage': drawImage(redo, ctx, f); break;+    case 'FShape':+      if (f._0.ctor === 'Left') {+        f._1.closed = true;+        drawLine(ctx, f._0._0, f._1);+      } else {+        drawShape(redo, ctx, f._0._0, f._1);+      }+    break;+    }+    ctx.restore();+}++function formToMatrix(form) {+   var scale = form.scale;+   var matrix = A6( Transform.matrix, scale, 0, 0, scale, form.x, form.y );++   var theta = form.theta+   if (theta !== 0)+       matrix = A2( Transform.multiply, matrix, Transform.rotation(theta) );++   return matrix;+}++function str(n) {+    if (n < 0.00001 && n > -0.00001) return 0;+    return n;+}++function makeTransform(w, h, form, matrices) {+    var props = form.form._0.props;+    var m = A6( Transform.matrix, 1, 0, 0, -1,+                (w - props.width ) / 2,+                (h - props.height) / 2 );+    var len = matrices.length;+    for (var i = 0; i < len; ++i) { m = A2( Transform.multiply, m, matrices[i] ); }+    m = A2( Transform.multiply, m, formToMatrix(form) );++    return 'matrix(' + str( m[0]) + ', ' + str( m[3]) + ', ' ++                       str(-m[1]) + ', ' + str(-m[4]) + ', ' ++                       str( m[2]) + ', ' + str( m[5]) + ')';+}++function stepperHelp(list) {+    var arr = fromList(list);+    var i = 0;+    function peekNext() {+        return i < arr.length ? arr[i].form.ctor : '';+    }+    // assumes that there is a next element+    function next() {+        var out = arr[i];+        ++i;+        return out;+    }+    return { peekNext:peekNext, next:next };+}++function formStepper(forms) {+    var ps = [stepperHelp(forms)];+    var matrices = [];+    var alphas = [];+    function peekNext() {+        var len = ps.length;+        var formType = '';+        for (var i = 0; i < len; ++i ) {+            if (formType = ps[i].peekNext()) return formType;+        }+        return '';+    }+    // assumes that there is a next element+    function next(ctx) {+        while (!ps[0].peekNext()) {+            ps.shift();+            matrices.pop();+            alphas.shift();+            if (ctx) { ctx.restore(); }+        }+        var out = ps[0].next();+        var f = out.form;+        if (f.ctor === 'FGroup') {+            ps.unshift(stepperHelp(f._1));+            var m = A2(Transform.multiply, f._0, formToMatrix(out));+            ctx.save();+            ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);+            matrices.push(m);++            var alpha = (alphas[0] || 1) * out.alpha;+            alphas.unshift(alpha);+            ctx.globalAlpha = alpha;+        }+        return out;+    }+    function transforms() { return matrices; }+    function alpha() { return alphas[0] || 1; }+    return { peekNext:peekNext, next:next, transforms:transforms, alpha:alpha };+}++function makeCanvas(w,h) {+    var canvas = newElement('canvas');+    canvas.style.width  = w + 'px';+    canvas.style.height = h + 'px';+    canvas.style.display = "block";+    canvas.style.position = "absolute";+    canvas.width  = w;+    canvas.height = h;+    return canvas;+}++function render(model) {+    var div = newElement('div');+    div.style.overflow = 'hidden';+    update(div, model, model);+    return div;+}++function nodeStepper(w,h,div) {+    var kids = div.childNodes;+    var i = 0;+    function transform(transforms, ctx) {+        ctx.translate(w/2, h/2);+        ctx.scale(1,-1);+        var len = transforms.length;+        for (var i = 0; i < len; ++i) {+            var m = transforms[i];+            ctx.save();+            ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);+        }+        return ctx;+    }+    function nextContext(transforms) {+        while (i < kids.length) {+            var node = kids[i];+            if (node.getContext) {+                node.width = w;+                node.height = h;+                node.style.width = w + 'px';+                node.style.height = h + 'px';+                ++i;+                return transform(transforms, node.getContext('2d'));+            }+            div.removeChild(node);+        }+        var canvas = makeCanvas(w,h);+        div.appendChild(canvas);+        // we have added a new node, so we must step our position+        ++i;+        return transform(transforms, canvas.getContext('2d'));+    }+    function addElement(matrices, alpha, form) {+        var kid = kids[i];+        var elem = form.form._0;++        var node = (!kid || kid.getContext)+            ? Render.render(elem)+            : (Render.update(kid, kid.oldElement, elem), kids[i]);++        node.style.position = 'absolute';+        node.style.opacity = alpha * form.alpha;+        addTransform(node.style, makeTransform(w, h, form, matrices));+        node.oldElement = elem;+        ++i;+        if (!kid) {+            div.appendChild(node);+        } else if (kid.getContext) {+            div.insertBefore(node, kid);+        }+    }+    function clearRest() {+        while (i < kids.length) {+            div.removeChild(kids[i]);+        }+    }+    return { nextContext:nextContext, addElement:addElement, clearRest:clearRest };+}+++function update(div, _, model) {+    var w = model.w;+    var h = model.h;++    var forms = formStepper(model.forms);+    var nodes = nodeStepper(w,h,div);+    var ctx = null;+    var formType = '';++    while (formType = forms.peekNext()) {+        // make sure we have context if we need it+        if (ctx === null && formType !== 'FElement') {+            ctx = nodes.nextContext(forms.transforms());+            ctx.globalAlpha = forms.alpha();+        }++        var form = forms.next(ctx);+        // if it is FGroup, all updates are made within formStepper when next is called.+        if (formType === 'FElement') {+            // update or insert an element, get a new context+            nodes.addElement(forms.transforms(), forms.alpha(), form);+            ctx = null;+        } else if (formType !== 'FGroup') {+            renderForm(function() { update(div, model, model); }, ctx, form);+        }+    }+    nodes.clearRest();+    return false;+}++return { render:render, update:update };++};++ElmRuntime.Render.Element = function() {+'use strict';++var Utils = ElmRuntime.use(ElmRuntime.Render.Utils);+var newElement = Utils.newElement, extract = Utils.extract,+    addTransform = Utils.addTransform, removeTransform = Utils.removeTransform,+    fromList = Utils.fromList, eq = Utils.eq;++function setProps(props, e) {+    e.style.width  = (props.width |0) + 'px';+    e.style.height = (props.height|0) + 'px';+    if (props.opacity !== 1) { e.style.opacity = props.opacity; }+    if (props.color.ctor === 'Just') {+        e.style.backgroundColor = extract(props.color._0);+    }+    if (props.tag !== '') { e.id = props.tag; }+    if (props.href !== '') {+        var a = newElement('a');+        a.href = props.href;+        a.style.width = '100%';+        a.style.height = '100%';+        a.style.top = 0;+        a.style.left = 0;+        a.style.display = 'block';+        a.style.position = 'absolute';+        e.style.position = 'relative';+        e.appendChild(a);+    }+    if (props.hover.ctor !== '_Tuple0') {+        var overCount = 0;+        e.addEventListener('mouseover', function() {+            if (overCount++ > 0) return;+            props.hover(true);+        });+        e.addEventListener('mouseout', function(evt) {+            if (e.contains(evt.toElement || evt.relatedTarget)) return;+            overCount = 0;+            props.hover(false);+        });+    }+    return e;+}++function image(props, img) {+    switch (img._0.ctor) {+    case 'Plain':   return plainImage(img._3);+    case 'Fitted':  return fittedImage(props.width, props.height, img._3);+    case 'Cropped': return croppedImage(img,props.width,props.height,img._3);+    case 'Tiled':   return tiledImage(img._3);+    }+}++function plainImage(src) {+    var img = newElement('img');+    img.src = src;+    img.name = src;+    img.style.display = "block";+    return img;+}++function tiledImage(src) {+    var div = newElement('div');+    div.style.backgroundImage = 'url(' + src + ')';+    return div;+}++function fittedImage(w, h, src) {+    var div = newElement('div');+    div.style.background = 'url(' + src + ') no-repeat center';+    div.style.webkitBackgroundSize = 'cover';+    div.style.MozBackgroundSize = 'cover';+    div.style.OBackgroundSize = 'cover';+    div.style.backgroundSize = 'cover';+    return div;+}++function croppedImage(elem, w, h, src) {+    var pos = elem._0._0;+    var e = newElement('div');+    e.style.overflow = "hidden";++    var img = newElement('img');+    img.onload = function() {+        var sw = w / elem._1, sh = h / elem._2;+        img.style.width = ((this.width * sw)|0) + 'px';+        img.style.height = ((this.height * sh)|0) + 'px';+        img.style.marginLeft = ((- pos._0 * sw)|0) + 'px';+        img.style.marginTop = ((- pos._1 * sh)|0) + 'px';+    };+    img.src = src;+    img.name = src;+    e.appendChild(img);+    return e;+}++function goIn(e) { e.style.position = 'absolute'; return e; }+function goDown(e) { return e }+function goRight(e) { e.style.styleFloat = e.style.cssFloat = "left"; return e; }+function flowWith(f, array) {+    var container = newElement('div');+    for (var i = array.length; i--; ) {+        container.appendChild(f(render(array[i])));+    }+    return container;+}++function flow(dir,elist) {+    var array = fromList(elist);+    switch(dir.ctor) {+    case "DDown":  array.reverse();+    case "DUp":    return flowWith(goDown,array);+    case "DRight": array.reverse();+    case "DLeft":  return flowWith(goRight,array);+    case "DOut":   array.reverse();+    case "DIn":    return flowWith(goIn,array);+    }+}++function toPos(pos) {+    switch(pos.ctor) {+    case "Absolute": return  pos._0 + "px";+    case "Relative": return (pos._0 * 100) + "%";+    }+}++// must clear right, left, top, bottom, and transform+// before calling this function+function setPos(pos,w,h,e) {+    e.style.position = 'absolute';+    e.style.margin = 'auto';+    var transform = '';+    switch(pos.horizontal.ctor) {+    case 'P': e.style.right = toPos(pos.x); e.style.removeProperty('left'); break;+    case 'Z': transform = 'translateX(' + ((-w/2)|0) + 'px) ';+    case 'N': e.style.left = toPos(pos.x); e.style.removeProperty('right'); break;+    }+    switch(pos.vertical.ctor) {+    case 'N': e.style.bottom = toPos(pos.y); e.style.removeProperty('top'); break;+    case 'Z': transform += 'translateY(' + ((-h/2)|0) + 'px)';+    case 'P': e.style.top = toPos(pos.y); e.style.removeProperty('bottom'); break;+    }+    if (transform !== '') addTransform(e.style, transform);+    return e;+}++function container(pos,elem) {+    var e = render(elem);+    setPos(pos, elem.props.width, elem.props.height, e);+    var div = newElement('div');+    div.style.position = 'relative';+    div.style.overflow = 'hidden';+    div.appendChild(e);+    return div;+}++function rawHtml(elem) {+    var html = elem.html;+    var args = elem.args;+    var guid = elem.guid;+    var align = elem.align;++    var div = newElement('div');+    div.innerHTML = html;+    div.style.visibility = "hidden";+    if (align) div.style.textAlign = align;     document.body.appendChild(div);      for (var i = args.length; i--; ) {
data/interfaces.data view

binary file changed (112467 → 112051 bytes)

tests/Main.hs view
@@ -1,22 +1,11 @@ module Main where -import System.Directory-import System.Exit (exitWith)-import System.Environment (getArgs)-import Test.Framework.TestManager-import Test.Framework.BlackBoxTest--main :: IO () -main = do-  args  <- getArgs-  tests <- blackBoxTests "tests" "dist/build/elm/elm" ".elm" bbtArgs-  code  <- runTestWithArgs args tests-  removeDirectoryRecursive "cache"-  removeDirectoryRecursive "build"-  exitWith code+import Test.Framework -bbtArgs = defaultBBTArgs { bbtArgs_stdoutDiff = ignoreDiff-                         , bbtArgs_stderrDiff = ignoreDiff }+import Tests.Compiler+import Tests.Property -ignoreDiff :: Diff-ignoreDiff _ _ = return Nothing+main :: IO () +main = defaultMain [ compilerTests+                   , propertyTests+                   ]
+ tests/Tests/Compiler.hs view
@@ -0,0 +1,45 @@+module Tests.Compiler (compilerTests)+       where++import Data.Functor                   ((<$>))+import Data.Traversable               (traverse)+import System.FilePath                ((</>))+import System.FilePath.Find           (find, (==?), extension)+import Test.Framework+import Test.Framework.Providers.HUnit (testCase)+import Test.HUnit                     (Assertion, assertFailure, assertBool)+import Text.Parsec                    (ParseError)++import Elm.Internal.Utils as Elm++compilerTests :: Test+compilerTests = buildTest $ do+  goods <- mkTests goodCompile  =<< getElms "good"+  bads  <- mkTests badCompile   =<< getElms "bad"+  return $ testGroup "Compile Tests"+    [+      testGroup "Good Tests" goods+    , testGroup "Bad Tests"  bads+    ]++  where getElms :: FilePath -> IO [FilePath]+        getElms fname = find (return True) (extension ==? ".elm") (testsDir </> fname)++        mkTests :: (Either String String -> Assertion) -> [FilePath] -> IO [Test]+        mkTests h = traverse setupTest+          where setupTest f = testCase f . mkCompileTest h <$> readFile f++        testsDir = "tests" </> "test-files"++goodCompile :: Either String String -> Assertion+goodCompile (Left err) = assertFailure err+goodCompile (Right _)  = assertBool "" True++badCompile :: Either String String -> Assertion+badCompile (Left _)  = assertBool "" True+badCompile (Right _) = assertFailure "Compilation succeeded but should have failed"+  +mkCompileTest :: ((Either String String) -> Assertion) -- ^ Handler+                 -> String -- ^ File Contents+                 -> Assertion+mkCompileTest handle = handle . Elm.compile
+ tests/Tests/Property.hs view
@@ -0,0 +1,54 @@+module Tests.Property where++import Control.Applicative ((<*))+import Test.Framework+import Test.Framework.Providers.HUnit+import Test.Framework.Providers.QuickCheck2+import Test.HUnit (assert)+import Test.QuickCheck+import Text.Parsec.Combinator (eof)+import Text.PrettyPrint as P++import SourceSyntax.Literal as Lit+import SourceSyntax.Pattern as Pat+import SourceSyntax.PrettyPrint  (Pretty, pretty)+import Parse.Helpers             (IParser, iParse)+import Parse.Literal             (literal)+import qualified Parse.Pattern as Pat (expr)+import qualified Parse.Type as Type (expr)+import Tests.Property.Arbitrary++propertyTests :: Test+propertyTests =+  testGroup "Parse/Print Agreement Tests"+  [+    testCase "Long Pattern test" $ assert (prop_parse_print Pat.expr longPat)+  , testProperty "Literal test" $ prop_parse_print literal+  , testProperty "Pattern test" $ prop_parse_print Pat.expr+  , testProperty "Type test" $ prop_parse_print Type.expr+  ]++  where+    -- This test was autogenerated from the Pattern test and should be+    -- left in all its ugly glory.+    longPat = Pat.PData "I" [ Pat.PLiteral (Lit.Chr '+')+                            , Pat.PRecord [+                                 "q7yclkcm7k_ikstrczv_"+                                 , "wQRv6gKsvvkjw4b5F"+                                 ,"c9'eFfhk9FTvsMnwF_D"+                                 ,"yqxhEkHvRFwZ"+                                 ,"o"+                                 ,"nbUlCn3y3NnkVoxhW"+                                 ,"iJ0MNy3KZ_lrs"+                                 ,"ug"+                                 ,"sHHsX"+                                 ,"mRKs9d"+                                 ,"o2KiCX5'ZRzHJfRi8" ]+                            , Pat.PVar "su'BrrbPUK6I33Eq" ]++prop_parse_print :: (Pretty a, Arbitrary a, Eq a) => IParser a -> a -> Bool+prop_parse_print p x =+  either (const False) (== x) . parse_print p $ x++parse_print :: (Pretty a) => IParser a -> a -> Either String a+parse_print p = either (Left . show) (Right) . iParse (p <* eof) . P.renderStyle P.style {mode=P.LeftMode} . pretty
+ tests/Tests/Property/Arbitrary.hs view
@@ -0,0 +1,113 @@+{-# OPTIONS_GHC -W -fno-warn-orphans #-}+module Tests.Property.Arbitrary where++import Control.Applicative       ((<$>), (<*>), pure)+import Test.QuickCheck.Arbitrary+import Test.QuickCheck.Gen++import qualified Data.Set as Set+import qualified Parse.Helpers (reserveds)++import SourceSyntax.Literal+import SourceSyntax.Pattern+import SourceSyntax.Type hiding (listOf)++instance Arbitrary Literal where+  arbitrary = oneof [ IntNum   <$> arbitrary+                    , FloatNum <$> (arbitrary `suchThat` noE)+                    , Chr      <$> arbitrary+                      -- This is too permissive+                    , Str      <$> arbitrary+                      -- Booleans aren't actually source syntax +                      -- , Boolean  <$> arbitrary+                    ]+  shrink l = case l of+    IntNum n   -> IntNum   <$> shrink n+    FloatNum f -> FloatNum <$> (filter noE . shrink $ f)+    Chr c      -> Chr      <$> shrink c+    Str s      -> Str      <$> shrink s+    Boolean b  -> Boolean  <$> shrink b++noE :: Double -> Bool+noE = notElem 'e' . show+++instance Arbitrary Pattern where+  arbitrary = sized pat+    where pat :: Int -> Gen Pattern+          pat n = oneof [ pure PAnything+                        , PVar     <$> lowVar+                        , PRecord  <$> (listOf1 lowVar)+                        , PLiteral <$> arbitrary+                        , PAlias   <$> lowVar    <*> pat (n-1)+                        , PData    <$> capVar    <*> sizedPats+                        ]+            where sizedPats = do+                    len <- choose (0,n)+                    let m = n `div` (len + 1)+                    vectorOf len $ pat m++  shrink pat = case pat of+    PAnything  -> []+    PVar v     -> PVar     <$> shrinkWHead v+    PRecord fs -> PRecord  <$> (filter (all $ not . null) . filter (not . null) $ shrink fs)+    PLiteral l -> PLiteral <$> shrink l+    PAlias s p -> p : (PAlias <$> shrinkWHead s <*> shrink p)+    PData s ps -> ps ++ (PData <$> shrinkWHead s <*> shrink ps)++shrinkWHead :: Arbitrary a => [a] -> [[a]]+shrinkWHead [] = error "Should be nonempty"+shrinkWHead (x:xs) = (x:) <$> shrink xs++instance Arbitrary Type where+  arbitrary = sized tipe+    where tipe :: Int -> Gen Type+          tipe n = oneof [ Lambda <$> depthTipe <*> depthTipe+                         , Var    <$> lowVar+                         , Data   <$> capVar <*> depthTipes+                         , Record <$> fields <*> pure Nothing+                         , Record <$> fields1 <*> (Just <$> lowVar)+                         ]+            where depthTipe = choose (0,n) >>= tipe+                  depthTipes = do+                    len <- choose (0,n) +                    let m = n `div` (len + 1)+                    vectorOf len $ tipe m++                  field = (,) <$> lowVar <*> depthTipe+                  fields = do+                    len <- choose (0,n)+                    let m = n `div` (len + 1)+                    vectorOf len $ (,) <$> lowVar <*> tipe m+                  fields1 = (:) <$> field <*> fields++  shrink tipe = case tipe of+    Lambda s t    -> s : t : (Lambda <$> shrink s <*> shrink t)+    Var _         -> []+    Data n ts     -> ts ++ (Data <$> shrinkWHead n <*> shrink ts)+    Record fs t   -> map snd fs ++ case t of+      Nothing -> Record <$> shrinkList shrinkField fs <*> pure Nothing+      Just _ ->+        do+          fields <- filter (not . null) $ shrinkList shrinkField fs+          return $ Record fields t+      where shrinkField (n,t) = (,) <$> shrinkWHead n <*> shrink t++lowVar :: Gen String+lowVar = notReserved $ (:) <$> lower <*> listOf varLetter+  where lower = elements ['a'..'z']++capVar :: Gen String+capVar = notReserved $ (:) <$> upper <*> listOf varLetter+  where upper = elements ['A'..'Z']++varLetter :: Gen Char+varLetter = elements $ ['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9'] ++ ['\'', '_']++notReserved :: Gen String -> Gen String+notReserved = flip exceptFor Parse.Helpers.reserveds++exceptFor :: (Ord a) => Gen a -> [a] -> Gen a+exceptFor g xs = g `suchThat` notAnX+  where notAnX = flip Set.notMember xset+        xset = Set.fromList xs