packages feed

git-annex 10.20261026 → 10.20261113

raw patch · 41 files changed

+4686/−265 lines, 41 filesdep +http-semanticsdep +libmagicdep +nsisdep −magicdep ~network

Dependencies added: http-semantics, libmagic, nsis

Dependencies removed: magic

Dependency ranges changed: network

Files

Annex.hs view
@@ -13,6 +13,7 @@ 	AnnexRead(..), 	new, 	new',+	newMaker, 	run, 	eval, 	makeRunner,@@ -296,19 +297,29 @@ 		, reposizehandle = Nothing 		} -{- Makes an Annex state object for the specified git repo.+{- Makes an Annex state and read objects for the specified git repo.  - Ensures the config is read, if it was not already, and performs  - any necessary git repo fixups. -} new :: Git.Repo -> IO (AnnexState, AnnexRead) new = new' fixupRepo  new' :: (Git.Repo -> GitConfig -> IO Git.Repo) -> Git.Repo -> IO (AnnexState, AnnexRead)-new' f r = do+new' f r = join $ newMaker' f r++{- Returns an IO action which can be called repeatedly, making+ - new Annex state and read objects each time. -}+newMaker :: Git.Repo -> IO (IO (AnnexState, AnnexRead))+newMaker = newMaker' fixupRepo++newMaker' :: (Git.Repo -> GitConfig -> IO Git.Repo) -> Git.Repo -> IO (IO (AnnexState, AnnexRead))+newMaker' f r = do 	r' <- Git.Config.read r 	let c = extractGitConfig FromGitConfig r'-	st <- newAnnexState c =<< f r' c-	rd <- newAnnexRead c-	return (st, rd)+	r'' <- f r' c+	return $ do+		st <- newAnnexState c r''+		rd <- newAnnexRead c+		return (st, rd)  {- Performs an action in the Annex monad from a starting state,  - returning a new state. -}
Annex/Action.hs view
@@ -1,6 +1,6 @@ {- git-annex actions  -- - Copyright 2010-2022 Joey Hess <id@joeyh.name>+ - Copyright 2010-2026 Joey Hess <id@joeyh.name>  -  - Licensed under the GNU AGPL version 3 or higher.  -}@@ -23,6 +23,7 @@ import Annex.CheckIgnore import Annex.TransferrerPool import qualified Database.Keys+import qualified Database.RepoSize  {- Runs an action that may throw exceptions, catching and displaying them. -} action :: Annex () -> Annex Bool@@ -39,8 +40,8 @@ 		warning (UnquotedString (show e)) 		return (False, UnVerified) -{- Rn all cleanup actions, save all state, stop all long-running child- - processes.+{- Rn all cleanup actions, save all state, stop long-running child+ - processes, close file handles.  -  - This can be run repeatedly with other Annex actions run in between,  - but usually it is run only once at the end.@@ -58,8 +59,12 @@ 	saveState nocommit 	stopCoProcesses 	Database.Keys.closeDb+	Database.RepoSize.closeDb -{- Stops all long-running child processes, including git query processes. -}+{- Stops long-running child processes, including git query processes. + -+ - Does not stop processes belonging to Remotes or Backends.+ -} stopCoProcesses :: Annex () stopCoProcesses = do 	catFileStop
Annex/Magic.hs view
@@ -1,6 +1,6 @@ {- Interface to libmagic  -- - Copyright 2019-2020 Joey Hess <id@joeyh.name>+ - Copyright 2019-2026 Joey Hess <id@joeyh.name>  -  - Licensed under the GNU AGPL version 3 or higher.  -}@@ -13,32 +13,63 @@ 	MimeType, 	MimeEncoding, 	initMagicMime,+	getMagicMime, 	getMagicMimeType, 	getMagicMimeEncoding,+	parseMagicMime,+	magicFileLocation, ) where  import Common import Types.Mime import Control.Monad.IO.Class+import qualified Data.ByteString as B+import Data.Char+import Utility.Env+import Annex.Path+ #ifdef WITH_MAGICMIME import Magic-import Utility.Env-import Control.Concurrent-import System.IO.Unsafe (unsafePerformIO)+import qualified Data.List.NonEmpty as NE+import qualified System.OsString.Internal as OS #else type Magic = () #endif +magicFileLocation :: IO (Maybe OsPath)+magicFileLocation = +	gitAnnexInstallDir >>= \case+		Nothing -> do+#ifndef mingw32_HOST_OS+			pure Nothing+#else+			-- On windows, the magic file is+			-- in ../share/misc/ relative+			-- to the program.+			pd <- takeDirectory <$> programPath+			use $+				pd+					</> literalOsPath ".."+					</> literalOsPath "share"+					</> literalOsPath "misc"+					</> literalOsPath "magic.mgc"+#endif+		Just d -> use $+			d+				</> literalOsPath "magic"+				</> literalOsPath "magic.mgc"+  where+	use p = Just . maybe p toOsPath <$> getEnv "MAGIC"+ initMagicMime :: IO (Maybe Magic) #ifdef WITH_MAGICMIME initMagicMime = catchMaybeIO $ do 	m <- magicOpen [MagicMime]-	liftIO $ getEnv "GIT_ANNEX_DIR" >>= \case+	magicFileLocation >>= \case 		Nothing -> magicLoadDefault m-		Just d -> magicLoad m $ fromOsPath $-			toOsPath d-				</> literalOsPath "magic"-				</> literalOsPath "magic.mgc"+		Just d -> do+			p <- OS.encodeFS $ fromOsPath d+			magicLoad m $ NE.singleton p 	return m #else initMagicMime = return Nothing@@ -46,32 +77,21 @@  getMagicMime :: Magic -> OsPath -> IO (Maybe (MimeType, MimeEncoding)) #ifdef WITH_MAGICMIME-getMagicMime m f = Just . parse <$> magicConcurrentSafe (magicFile m (fromOsPath f))-  where-	parse s = -		let (mimetype, rest) = separate (== ';') s-		in case rest of-			(' ':'c':'h':'a':'r':'s':'e':'t':'=':mimeencoding) -> -				(mimetype, mimeencoding)-			_ -> (mimetype, "")+getMagicMime m f = Just . parseMagicMime+	<$> (magicFile m =<< OS.encodeFS (fromOsPath f)) #else getMagicMime _ _ = return Nothing #endif +parseMagicMime :: B.ByteString -> (MimeType, MimeEncoding)+parseMagicMime b = (decodeBS mimetype, decodeBS mimeencoding)+  where+	(mimetype, rest) = B.break (== semicolon) b+	mimeencoding = fromMaybe mempty (B.stripPrefix "; charset=" rest)+	semicolon = fromIntegral (ord ';')+ getMagicMimeType :: MonadIO m => Magic -> OsPath -> m (Maybe MimeType) getMagicMimeType m f = liftIO $ fmap fst <$> getMagicMime m f  getMagicMimeEncoding :: MonadIO m => Magic -> OsPath -> m(Maybe MimeEncoding) getMagicMimeEncoding m f = liftIO $ fmap snd <$> getMagicMime m f--#ifdef WITH_MAGICMIME-{-# NOINLINE mutex #-}-mutex :: MVar ()-mutex = unsafePerformIO $ newMVar ()---- Work around a bug, the library is not concurrency safe and will--- sometimes access the wrong memory if multiple ones are called at the--- same time.-magicConcurrentSafe :: IO a -> IO a-magicConcurrentSafe = bracket_ (takeMVar mutex) (putMVar mutex ())-#endif
Annex/Path.hs view
@@ -1,6 +1,6 @@ {- git-annex program path  -- - Copyright 2013-2024 Joey Hess <id@joeyh.name>+ - Copyright 2013-2026 Joey Hess <id@joeyh.name>  -  - Licensed under the GNU AGPL version 3 or higher.  -}@@ -8,6 +8,7 @@ module Annex.Path ( 	programPath, 	readProgramFile,+	gitAnnexInstallDir, 	gitAnnexChildProcess, 	gitAnnexChildProcessParams, 	gitAnnexDaemonizeParams,@@ -24,6 +25,11 @@ import System.Environment (getExecutablePath, getArgs, getProgName) import qualified Data.Map as M +{- The standalone build sets GIT_ANNEX_DIR to the location of the+ - standalone build directory. -}+gitAnnexInstallDir :: IO (Maybe OsPath)+gitAnnexInstallDir = fmap toOsPath <$> getEnv "GIT_ANNEX_DIR"+ {- A fully qualified path to the currently running git-annex program.  -   - getExecutablePath is used when possible. On OSs it supports@@ -32,20 +38,19 @@  - or searching for the command name in PATH.  -  - The standalone build runs git-annex via ld.so, and defeats- - getExecutablePath. It sets GIT_ANNEX_DIR to the location of the- - standalone build directory, and there are wrapper scripts for git-annex- - and git-annex-shell in that directory.+ - getExecutablePath. There are wrapper scripts for git-annex+ - and git-annex-shell in the gitAnnexInstallDir.  -  - When the currently running program is not git-annex, but is instead eg  - git-annex-shell or git-remote-annex, this finds a git-annex program  - instead.  -} programPath :: IO OsPath-programPath = go =<< getEnv "GIT_ANNEX_DIR"+programPath = go =<< gitAnnexInstallDir   where 	go (Just dir) = do 		name <- reqgitannex <$> getProgName-		return (toOsPath dir </> toOsPath name)+		return (dir </> toOsPath name) 	go Nothing = do 		name <- getProgName 		exe <- if isgitannex name
Build/BundledPrograms.hs view
@@ -79,17 +79,3 @@ 	-- we rely on the system's own version, which may better match 	-- its kernel, and avoid using them if not available. 	]--magicDLLs :: [FilePath]-#ifdef mingw32_HOST_OS-magicDLLs = ["libmagic-1.dll", "libgnurx-0.dll"]-#else-magicDLLs = []-#endif--magicShare :: [FilePath]-#ifdef mingw32_HOST_OS-magicShare = ["magic.mgc"]-#else-magicShare = []-#endif
+ Build/NullSoftInstaller.hs view
@@ -0,0 +1,236 @@+{- Generates a NullSoft installer program for git-annex on Windows.
+ -
+ - This uses the Haskell nsis package to generate a .nsi file,
+ - which is then used to produce git-annex-installer.exe
+ - 
+ - The installer includes git-annex, and utilities it uses, with the
+ - exception of git and some utilities that are bundled with git.
+ - The user needs to install git separately, and the installer checks
+ - for that.
+ - 
+ - To build the installer, git-annex should already be built to
+ - ./git-annex.exe, then run this program by eg:
+ - cp git-annex.exe nullsoft-installer.exe
+ - ./nullsoft-installer
+ -
+ - Copyright 2013-2026 Joey Hess <id@joeyh.name>
+ -
+ - Licensed under the GNU AGPL version 3 or higher.
+ -}
+
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE OverloadedStrings, FlexibleContexts #-}
+
+module Build.NullSoftInstaller (main) where
+
+#ifndef mingw32_HOST_OS
+
+main :: IO ()
+main = error "only supported on Windows"
+
+#else
+
+import Development.NSIS
+import Control.Monad
+import Data.String
+import Data.Maybe
+import Data.List (isSuffixOf)
+
+import Utility.Tmp.Dir
+import Utility.SafeCommand
+import Utility.SystemDirectory
+import Utility.OsPath
+import Utility.Directory
+import qualified Utility.FileIO as F
+import Build.BundledPrograms
+
+{- Magic file database will be included if this file is found in the
+ - current directory. -}
+magicShare :: [FilePath]
+magicShare = ["magic.mgc"]
+
+{- *.dll in the current directory will be included. -}
+findDLLs :: IO [FilePath]
+findDLLs = do
+	l <- dirContents (literalOsPath ".")
+	return $ filter (".dll" `isSuffixOf`) $ map fromOsPath l
+
+main :: IO ()
+main = do
+	withTmpDir (literalOsPath "nsis-build") $ \tmpdir -> do
+		let gitannex = fromOsPath $ tmpdir </> toOsPath gitannexprogram
+		mustSucceed "ln" [File "git-annex.exe", File gitannex]
+		dlls <- findDLLs
+		dlls' <- installwhenpresent dlls tmpdir
+		magicShare' <- installwhenpresent magicShare tmpdir
+		let license = fromOsPath $ tmpdir </> toOsPath licensefile
+		mustSucceed "sh" [Param "-c", Param $ "zcat standalone/licences.gz > '" ++ license ++ "'"]
+		webappscript <- vbsLauncher tmpdir "git-annex-webapp" "git annex webapp"
+		autostartscript <- vbsLauncher tmpdir "git-annex-autostart" "git annex assistant --autostart"
+		let htmlhelp = tmpdir </> literalOsPath "git-annex.html"
+		F.writeFileString htmlhelp htmlHelpText
+		let gitannexcmd = tmpdir </> literalOsPath "git-annex.cmd"
+		F.writeFileString gitannexcmd "git annex %*"
+		F.writeFileString (toOsPath nsifile) $ makeInstaller
+			gitannex (fromOsPath gitannexcmd) license
+			(fromOsPath htmlhelp)
+			(winPrograms ++ dlls')
+			magicShare'
+			[ webappscript, autostartscript ]
+		mustSucceed "makensis" [File nsifile]
+	removeFile (toOsPath nsifile) -- left behind if makensis fails
+  where
+	nsifile = "git-annex.nsi"
+	mustSucceed cmd params = do
+		r <- boolSystem cmd params
+		case r of
+			True -> return ()
+			False -> error $ cmd ++ " failed"
+	installwhenpresent fs tmpdir = do
+		fs' <- forM fs $ \f -> do
+			present <- doesFileExist (toOsPath f)
+			if present
+				then do
+					mustSucceed "ln" [File f, File (fromOsPath (tmpdir </> toOsPath f))]
+					return (Just f)
+				else return Nothing
+		return (catMaybes fs')
+
+{- Generates a .vbs launcher which runs a command without any visible DOS
+ - box. It expects to be passed the directory where git-annex is installed. -}
+vbsLauncher :: OsPath -> String -> String -> IO String
+vbsLauncher tmpdir basename cmd = do
+	let f = tmpdir </> toOsPath (basename ++ ".vbs")
+	F.writeFileString f $ unlines
+		[ "Set objshell=CreateObject(\"Wscript.Shell\")"
+		, "objShell.CurrentDirectory = Wscript.Arguments.item(0)"
+		, "objShell.Run(\"" ++ cmd ++ "\"), 0, False"
+		]
+	return (fromOsPath f)
+
+gitannexprogram :: FilePath
+gitannexprogram = "git-annex.exe"
+
+licensefile :: FilePath
+licensefile = "git-annex-licenses.txt"
+
+installer :: FilePath
+installer = "git-annex-installer.exe"
+
+uninstaller :: FilePath
+uninstaller = "git-annex-uninstall.exe"
+
+gitInstallDir64 :: Exp FilePath
+gitInstallDir64 = fromString "$PROGRAMFILES64\\Git"
+
+gitInstallDir :: Exp FilePath
+gitInstallDir = gitInstallDir64
+
+-- This intentionally has a different name than git-annex or
+-- git-annex-webapp, since it is itself treated as an executable file.
+-- Also, on XP, the filename is displayed, not the description.
+startMenuItem :: Exp FilePath
+startMenuItem = "$SMPROGRAMS/Git Annex (Webapp).lnk"
+
+oldStartMenuItem :: Exp FilePath
+oldStartMenuItem = "$SMPROGRAMS/git-annex.lnk"
+
+autoStartItem :: Exp FilePath
+autoStartItem = "$SMSTARTUP/git-annex-autostart.lnk"
+
+needGit :: Exp String
+needGit = strConcat
+	[ fromString "You need git installed to use git-annex. Looking at "
+	, gitInstallDir
+	, fromString " , it seems to not be installed, "
+	, fromString "or may be installed in another location. "
+	, fromString "You can install git from http:////git-scm.com//"
+	]
+
+makeInstaller :: FilePath -> FilePath -> FilePath -> FilePath -> [FilePath] -> [FilePath] -> [FilePath] -> String
+makeInstaller gitannex gitannexcmd license htmlhelp extrabins sharefiles launchers = nsis $ do
+	name "git-annex"
+	outFile $ str installer
+	{- Installing into the same directory as git avoids needing to modify
+	 - path myself, since the git installer already does it. -}
+	installDir gitInstallDir
+	requestExecutionLevel Admin
+
+	iff (fileExists gitInstallDir)
+		(return ())
+		(alert needGit)
+	
+	-- Pages to display
+	page Directory                   -- Pick where to install
+	page (License license)
+	page InstFiles                   -- Give a progress bar while installing
+	-- Start menu shortcut
+	Development.NSIS.createDirectory "$SMPROGRAMS"
+	createShortcut startMenuItem
+		[ Target "wscript.exe"
+		, Parameters "\"$INSTDIR/cmd/git-annex-webapp.vbs\" \"$INSTDIR/cmd\""
+		, StartOptions "SW_SHOWNORMAL"
+		, IconFile "$INSTDIR/usr/bin/git-annex.exe"
+		, IconIndex 2
+		, Description "Git Annex (Webapp)"
+		]
+	delete [RebootOK] $ oldStartMenuItem
+	createShortcut autoStartItem
+		[ Target "wscript.exe"
+		, Parameters "\"$INSTDIR/cmd/git-annex-autostart.vbs\" \"$INSTDIR/cmd\""
+		, StartOptions "SW_SHOWNORMAL"
+		, IconFile "$INSTDIR/usr/bin/git-annex.exe"
+		, IconIndex 2
+		, Description "git-annex autostart"
+		]
+	_ <- section "cmd" [] $ do
+		-- Install everything to the same location git puts its
+		-- bins. This makes "git annex" work in the git bash
+		-- shell, since git expects to find the git-annex binary
+		-- there.
+		setOutPath "$INSTDIR\\usr\\bin"
+		mapM_ addfile (gitannex:extrabins)
+		setOutPath "$INSTDIR\\usr\\share\\misc"
+		mapM_ addfile sharefiles
+		-- This little wrapper is installed in the cmd directory,
+		-- so that "git-annex" works (as well as "git annex"),
+		-- when only that directory is in PATH (ie, in a ms-dos
+		-- prompt window).
+		setOutPath "$INSTDIR\\cmd"
+		addfile gitannexcmd
+	_ <- section "meta" [] $ do
+		-- git opens this file when git annex --help is run.
+		-- (Program Files/Git/mingw64/share/doc/git-doc/git-annex.html)
+		setOutPath "$INSTDIR\\mingw64\\share\\doc\\git-doc"
+		addfile htmlhelp
+		setOutPath "$INSTDIR"
+		addfile license
+		setOutPath "$INSTDIR\\cmd"
+		mapM_ addfile launchers
+		writeUninstaller $ str uninstaller
+	uninstall $ do
+		delete [RebootOK] $ startMenuItem
+		delete [RebootOK] $ autoStartItem
+		removefilesFrom "$INSTDIR/usr/bin" (gitannex:extrabins)
+		removefilesFrom "$INSTDIR/cmd" (gitannexcmd:launchers)
+		removefilesFrom "$INSTDIR\\mingw64\\share\\doc\\git-doc" [htmlhelp]
+		removefilesFrom "$INSTDIR" [license, uninstaller]
+  where
+	addfile f = file [] (str f)
+	removefilesFrom d = mapM_ (\f -> delete [RebootOK] $ fromString $ d ++ "/" ++ fromOsPath (takeFileName (toOsPath f)))
+
+winPrograms :: [FilePath]
+winPrograms = map (\p -> p ++ ".exe") bundledPrograms
+
+htmlHelpText :: String
+htmlHelpText = unlines
+	[ "<html>"
+	, "<title>git-annex help</title>"
+	, "<body>"
+	, "For help on git-annex, run \"git annex help\", or"
+	, "<a href=\"https://git-annex.branchable.com/git-annex/\">read the man page</a>."
+	, "</body>"
+	, "</html"
+	]
+
+#endif
BuildFlags.hs view
@@ -60,15 +60,11 @@ 	, "S3" 	, "WebDAV" 	, "Servant"+	, "Botan" #ifdef WITH_OSPATH 	, "OsPath" #else  #warning Building without the OsPath build flag set results in slower filename manipulation and is not recommended.-#endif-#ifdef WITH_BOTAN-	, "Botan"-#else -#warning Consider building with the Botan build flag set, it speeds up checksumming by up 4x to 8x. #endif #ifdef WITH_BLAKE3 	, "Blake3"
CHANGELOG view
@@ -1,3 +1,31 @@+git-annex (10.20261113) upstream; urgency=medium++  * Added transfers command, displays a live view of transfers.+  * Don't prompt for verification of proxied remotes, which is not+    necessary and didn't work. (Fixes reversion in 10.20261026.)+  * p2phttp: When --directory is used to serve a large number of+    repositories, limit the amount of git helper processes and open files.+  * Fix buggy handling of a submodule in a linked git worktree.+  * Fix bug in parsing the P2P protocol that caused breakage when filenames+    contained unicode multibyte space characters.+  * Fix mimetype and mimencoding detection of non-ascii filenames +    in non-unicode locales.+  * Avoid display issues with multiple progress meters when not in a+    unicode locale.+  * Botan is enabled by default; removed build flag.+  * git-annex.cabal: Switch from magic to libmagic.+  * Allow the MAGIC environment variable to override the bundled magic file+    location.+  * The Linux arm64-ancient build has reached end of security support +    and will be removed after this release. Android users are recommended+    to switch to running `pkg install git-annex` inside termux.+  * NoLLMDependencies: Update for network and http-semantics. +  * Fix build when the Memory build flag is disabled.+  * Fix testremote failure with p2phttp remote.+    (Reversion from 10.20261005)++ -- Joey Hess <id@joeyh.name>  Fri, 13 Nov 2026 14:08:26 -0400+ git-annex (10.20261026) upstream; urgency=high    * This releases fixes a security hole that allowed private data 
CmdLine/Action.hs view
@@ -17,7 +17,6 @@ import Types.Concurrency import Annex.Content import Messages.Concurrent-import Types.Messages import Types.WorkerPool import Types.ActionItem import Remote.List@@ -27,7 +26,6 @@ import Control.Concurrent.STM import GHC.Conc import qualified Data.Map.Strict as M-import qualified System.Console.Regions as Regions  {- Runs a command, starting with the check stage, and then  - the seek stage. Finishes by running the continuation.@@ -226,17 +224,21 @@  - started here, that has the same effect.  -} startConcurrency :: UsedStages -> Annex a -> Annex a-startConcurrency usedstages a = do+startConcurrency usedstages a = startConcurrency' usedstages (const a)++{- Passes the number of worker threads to the Annex action. -}+startConcurrency' :: UsedStages -> (Int -> Annex a) -> Annex a+startConcurrency' usedstages a = do 	fromcmdline <- getConcurrency 	fromgitcfg <- annexJobs <$> Annex.getGitConfig 	let usegitcfg = setConcurrency (ConcurrencyGitConfig fromgitcfg) 	case (fromcmdline, fromgitcfg) of-		(NonConcurrent, NonConcurrent) -> a+		(NonConcurrent, NonConcurrent) -> a 1 		(Concurrent n, _)  			| n > 1 -> goconcurrent n 			| otherwise -> do 				setConcurrency' NonConcurrent ConcurrencyCmdLine-				a+				a 1 		(ConcurrentPerCpu, _) -> 			goconcurrentpercpu 		(NonConcurrent, Concurrent n) -> do@@ -246,29 +248,14 @@ 			usegitcfg 			goconcurrentpercpu   where-	goconcurrent n = do-		raiseCapabilitiesForJobs n-		withMessageState $ \s -> case outputType s of-			NormalOutput -> ifM (liftIO concurrentOutputSupported)-				( Regions.displayConsoleRegions $-					goconcurrent' n True-				, goconcurrent' n False-				)-			_ -> goconcurrent' n False-	goconcurrent' n b = bracket_ (setup n b) cleanup a+	goconcurrent n = prepareConcurrency n $+		bracket_ (setup n) cleanup (a n)  	goconcurrentpercpu = goconcurrent =<< liftIO getNumProcessors -	setup n b = do-		setconcurrentoutputenabled b-		initworkerpool n--	cleanup = do-		finishCommandActions-		setconcurrentoutputenabled False+	setup n = initworkerpool n -	setconcurrentoutputenabled b = Annex.changeState $ \s ->-		s { Annex.output = (Annex.output s) { concurrentOutputEnabled = b } }+	cleanup = finishCommandActions 	 	initworkerpool n = do 		tv <- liftIO newEmptyTMVarIO@@ -278,6 +265,11 @@ 		rd <- Annex.getRead id 		liftIO $ atomically $ putTMVar tv $ 			allocateWorkerPool (st, rd) (max n 1) usedstages++prepareConcurrency :: Int -> Annex a -> Annex a+prepareConcurrency n a = do+	raiseCapabilitiesForJobs n+	withConcurrentOutput a  -- Make sure that some expensive actions have been done before -- starting threads. This way the state has them already run,
CmdLine/GitAnnex.hs view
@@ -39,6 +39,7 @@ import qualified Command.DropKey import qualified Command.Transferrer import qualified Command.TransferKey+import qualified Command.Transfers import qualified Command.SetPresentKey import qualified Command.ReadPresentKey import qualified Command.CheckPresentKey@@ -216,6 +217,7 @@ 	, Command.DropKey.cmd 	, Command.Transferrer.cmd 	, Command.TransferKey.cmd+	, Command.Transfers.cmd 	, Command.SetPresentKey.cmd 	, Command.ReadPresentKey.cmd 	, Command.CheckPresentKey.cmd
CmdLine/Multicall.hs view
@@ -1,13 +1,22 @@ {- git-annex multicall binary  -- - Copyright 2024-2025 Joey Hess <id@joeyh.name>+ - Copyright 2024-2026 Joey Hess <id@joeyh.name>  -  - Licensed under the GNU AGPL version 3 or higher.  -} +{-# LANGUAGE CPP #-}+ module CmdLine.Multicall where ++import Common++import System.Environment (getProgName) import qualified Data.Map as M+#ifdef mingw32_HOST_OS+import Data.Char+#endif  -- Commands besides git-annex that can be run by the multicall binary. --@@ -19,6 +28,7 @@ 	| GitRemoteAnnex 	| GitRemoteP2PAnnex 	| GitRemoteTorAnnex+	| NullSoftInstaller  otherMulticallCommands :: M.Map String OtherMultiCallCommand otherMulticallCommands = M.fromList@@ -26,5 +36,16 @@ 	, ("git-remote-annex", GitRemoteAnnex) 	, ("git-remote-p2p-annex", GitRemoteP2PAnnex) 	, ("git-remote-tor-annex", GitRemoteTorAnnex)+	, ("nullsoft-installer", NullSoftInstaller) 	] +getCommandName :: IO String+getCommandName = do+#ifdef mingw32_HOST_OS+	n <- progname+	return $ map toLower $ takeWhile (/= '.') n+#else+	progname+#endif+  where+	progname = fromOsPath . takeFileName . toOsPath <$> getProgName
Command/P2PHttp.hs view
@@ -139,7 +139,7 @@ 			lockedfilesqsem <- liftIO $  				mkLockedFilesQSem (lockedFilesOption o) 			authenv <- liftIO getAuthEnv-			st <- mkServerState o authenv lockedfilesqsem+			st <- mkServerState o authenv lockedfilesqsem NoWorkerLimit 			liftIO $ runServer o st 		-- Run in a git repository that is not a git-annex repository. 		, liftIO $ startIO o @@ -158,20 +158,27 @@ 	mkst authenv oldst = do 		lockedfilesqsem <- mkLockedFilesQSem (lockedFilesOption o) 		repos <- findRepos o+		workerlimit <- mkAnnexWorkerLimit 		sts <- forM repos $ \r -> do-			strd <- Annex.new r-			Annex.eval strd (mkstannex authenv oldst lockedfilesqsem)+			maker <- Annex.newMaker r+			strd <- maker+			let workerlimit' = +				setAnnexWorkerLimitName (Git.repoDescribe r) $+				setAnnexWorkerLimitMaker maker workerlimit+			Annex.eval strd $+				mkstannex authenv oldst lockedfilesqsem+					workerlimit' 		return (mconcat sts) 			{ updateRepos = updaterepos authenv 			} 	-	mkstannex authenv oldst lockedfilesqsem = do+	mkstannex authenv oldst lockedfilesqsem workerlimit = do 		Annex.setOutput QuietOutput 		u <- getUUID 		if u == NoUUID 			then return mempty 			else case M.lookup u (servedRepos oldst) of-				Nothing -> mkServerState o authenv lockedfilesqsem+				Nothing -> mkServerState o authenv lockedfilesqsem workerlimit 				Just old -> return $ P2PHttpServerState 					{ servedRepos = M.singleton u old 					, serverShutdownCleanup = mempty@@ -239,15 +246,16 @@ 		Socket.listen sock Socket.maxListenQueue 		return sock -mkServerState :: Options -> M.Map Auth P2P.ServerMode -> LockedFilesQSem -> Annex P2PHttpServerState-mkServerState o authenv lockedfilesqsem = -	withAnnexWorkerPool (jobsOption o) (cpusOption o) $+mkServerState :: Options -> M.Map Auth P2P.ServerMode -> LockedFilesQSem -> AnnexWorkerLimit -> Annex P2PHttpServerState+mkServerState o authenv lockedfilesqsem workerlimit = +	withAnnexWorkerPool (jobsOption o) (cpusOption o) workerlimit $ 		mkP2PHttpServerState 			(mkGetServerMode authenv o) 			return 			(fromMaybe 1 $ proxyConnectionsOption o) 			(fromMaybe 1 $ clusterJobsOption o) 			lockedfilesqsem+			workerlimit  mkGetServerMode :: M.Map Auth P2P.ServerMode -> Options -> GetServerMode mkGetServerMode _ o _ Nothing
+ Command/Transfers.hs view
@@ -0,0 +1,123 @@+{- git-annex command+ -+ - Copyright 2026 Joey Hess <id@joeyh.name>+ -+ - Licensed under the GNU AGPL version 3 or higher.+ -}++{-# LANGUAGE OverloadedStrings #-}++module Command.Transfers where++import Command+import Types.Transfer+import Logs.Transfer+import Remote+import Messages.Progress+import Messages.Concurrent+import Utility.ThreadScheduler+import Utility.Metered+import Annex.Concurrent+import Database.Keys+import Git.FilePath++import qualified Data.Map as M+import Control.Concurrent.STM+import Control.Concurrent.Async++cmd :: Command+cmd = noCommit $ withAnnexOptions [jsonOptions, jsonProgressOption] $+	command "transfers" SectionQuery+		"display transfers"+		paramNothing (seek <$$> optParser)++data TransfersOptions = TransfersOptions+	{ localFilenames :: Bool +	}++optParser :: CmdParamsDesc -> Parser TransfersOptions+optParser _ = TransfersOptions+	<$> switch+		( long "localfilenames"+		<> short 'l'+		<> help "display local filenames, not remote filenames"+		)++seek :: TransfersOptions -> CommandSeek+seek o = withConcurrentOutput $ do+	when (localFilenames o)+		updateDatabase+	rs <- remoteList+	let remotemap = M.fromList $ zip (map uuid rs) rs+	go remotemap M.empty+  where+	go remotemap transfermap = do+		l <- getTransfers+		new <- forM l $ \(t, ti) -> do+			case M.lookup t transfermap of+				Nothing -> startone remotemap t ti+				Just v -> return (t, v)+		let newmap = M.fromList new+		forM_ (M.toList transfermap) $ \(t, (endvar, tid)) -> +			unless (M.member t newmap) $ do+				liftIO $ atomically $ putTMVar endvar ()+				void $ join $ liftIO $ wait tid+		liftIO $ threadDelaySeconds (SecondsDelay 1)+		go remotemap newmap+	+	startone remotemap t ti = do+		endvar <- liftIO newEmptyTMVarIO+		a <- forkState $ +			withMessageState $ \s ->+				inOwnConsoleRegion s $+					includeCommandAction $+						start o t ti endvar remotemap+		tid <- liftIO $ async a+		return (t, (endvar, tid))++start :: TransfersOptions -> Transfer -> TransferInfo -> TMVar () -> M.Map UUID Remote -> CommandStart+start o t ti endvar remotemap = do+	af <- if localFilenames o+		then headMaybe <$> getAssociatedFiles k >>= \case+			Just topf -> relaf =<< fromRepo (fromTopFilePath topf)+			Nothing -> pure $ AssociatedFile Nothing+		else pure $ associatedFile ti+	let ai = ActionItemAssociatedFile af k+	startingNoMessage ai $ do+		showStartMessage (StartMessage verb ai si)+		showNote $ UnquotedString $ fromto ++ " " ++ remotename+		maybeAddJSONField "remote-uuid" (transferUUID t)+		(tfile, _, _) <- fromRepo $ transferFileAndLockFile t+		metered Nothing k Nothing $ \_ p ->+			watchSizeWith (getprogress tfile) p $+				const waitend++		showEnd "done"+		next $ return True+  where+  	k = transferKey t+	+	si = SeekInput []+  	+	verb = case transferDirection t of+		Upload -> "send"+		Download -> "receive"+	+	fromto = case transferDirection t of+		Upload -> "to"+		Download -> "from"+	+	remotename =+		maybe (fromUUID (transferUUID t)) name $+			M.lookup (transferUUID t) remotemap+	+	waitend = +		liftIO $ atomically $ takeTMVar endvar+	+	relaf f = AssociatedFile . Just <$> liftIO (relPathCwdToFile f)++	getprogress tfile = readTransferInfoFile Nothing tfile+		>>= return . \case+			Just ti' -> maybe zeroBytesProcessed toBytesProcessed+				(bytesComplete ti')+			Nothing -> zeroBytesProcessed
Database/RepoSize.hs view
@@ -130,10 +130,13 @@ isOpenDb (RepoSizeHandle (Just _) _) = True isOpenDb (RepoSizeHandle Nothing _) = False -closeDb :: RepoSizeHandle -> Annex ()-closeDb (RepoSizeHandle (Just h) _) = liftIO $ H.closeDb h-closeDb (RepoSizeHandle Nothing _) = noop+closeDb :: Annex ()+closeDb = Annex.getState Annex.reposizehandle >>= maybe noop closeDb' +closeDb' :: RepoSizeHandle -> Annex ()+closeDb' (RepoSizeHandle (Just h) _) = liftIO $ H.closeDb h+closeDb' (RepoSizeHandle Nothing _) = noop+ -- This does not prevent another process that has already  -- opened the db from changing it at the same time. lockDbWhile :: (IOException -> Annex a) -> Annex a -> Annex a@@ -443,4 +446,4 @@ 				[ RecentChangesRepo ==. u 				] 		_ -> noop-	closeDb db+	closeDb' db
Git/Config.hs view
@@ -1,6 +1,6 @@ {- git repository configuration handling  -- - Copyright 2010-2022 Joey Hess <id@joeyh.name>+ - Copyright 2010-2026 Joey Hess <id@joeyh.name>  -  - Licensed under the GNU AGPL version 3 or higher.  -}@@ -24,6 +24,7 @@ import Utility.UserInfo import Utility.Process.Transcript import Utility.Debug+import qualified Utility.RawFilePath as R  {- Returns a single git config setting, or a fallback value if not set. -} get :: ConfigKey -> ConfigValue -> Repo -> ConfigValue@@ -181,12 +182,20 @@ 	l' <- case getMaybe "core.worktree" r of 		Nothing -> return l 		Just (ConfigValue d) -> do-			{- core.worktree is relative to the gitdir -}-			top <- absPath (gitdir l)+			top <- gitdirtop 			let p = absPathFrom top (toOsPath d) 			return $ l { worktree = Just p } 		Just NoConfigValue -> return l 	return $ r { location = l' }+  where+	{- core.worktree is relative to the gitdir. +	 - When the gitdir is a symlink, it's relative to the destination+	 - of the symlink.+	 -}+	gitdirtop = catchMaybeIO (R.readSymbolicLink (fromOsPath (gitdir l))) >>= \case+		Nothing -> absPath (gitdir l)+		Just linktarget -> absPath $+			takeDirectory (gitdir l) </> toOsPath linktarget updateLocation' r l = return r { location = l }  data ConfigStyle = ConfigList | ConfigNullList
Logs/Transfer.hs view
@@ -68,8 +68,8 @@ 	return (liftIO . updater tvar loggedtvar, createtfile, tvar)   where 	updater tvar loggedtvar new = do-		old <- atomically $ swapTVar tvar (Just new)-		let oldbytes = maybe 0 fromBytesProcessed old+		atomically $ writeTVar tvar (Just new)+		oldbytes <- atomically $ readTVar loggedtvar 		let newbytes = fromBytesProcessed new 		when (newbytes - oldbytes >= mindelta) $ do 			let info' = info { bytesComplete = Just newbytes }@@ -269,7 +269,7 @@  - On unix, the transferPid is not included; instead it is obtained  - by looking at the process that locks the file.  -- - On windows, the transferPid is included, as a second line.+ - On windows, the transferPid is included, as another line.  -} writeTransferInfo :: TransferInfo -> String writeTransferInfo info = unlines
Messages.hs view
@@ -23,6 +23,7 @@ 	showOutput, 	showLongNote, 	showInfo,+	showEnd, 	showEndOk, 	showEndFail, 	showEndResult,@@ -174,6 +175,9 @@ -- to console, but json object containing the info is emitted immediately. showInfo :: StringContainingQuotedPath -> Annex () showInfo s = outputMessage' outputJSON (JSON.info (decodeBS (noquote s))) formatLongNote s++showEnd :: StringContainingQuotedPath -> Annex ()+showEnd s = outputMessage JSON.end' id (s <> "\n")  showEndOk :: Annex () showEndOk = showEndResult True
Messages/Concurrent.hs view
@@ -1,6 +1,6 @@ {- git-annex output messages, including concurrent output to display regions  -- - Copyright 2010-2017 Joey Hess <id@joeyh.name>+ - Copyright 2010-2026 Joey Hess <id@joeyh.name>  -  - Licensed under the GNU AGPL version 3 or higher.  -}@@ -122,6 +122,28 @@ #else concurrentOutputSupported = return True -- Windows is always unicode #endif++withConcurrentOutput :: Annex a -> Annex a+withConcurrentOutput a =+	Annex.getState Annex.output >>= \s -> case outputType s of+		NormalOutput -> ifM (liftIO concurrentOutputSupported)+			( Regions.displayConsoleRegions $ go True+			, go False+			)+		_ -> go False+  where+	go b = bracket_ (setup b) cleanup a++	setup b = setconcurrentoutputenabled b++	cleanup = setconcurrentoutputenabled False++	setconcurrentoutputenabled b = Annex.changeState $ \s -> s+		{ Annex.output = (Annex.output s)+			{ concurrentOutputEnabled = b+			, disableProgressMeters = not b+			}+		}  {- Hide any currently displayed console regions while running the action,  - so that the action can use the console itself. -}
Messages/JSON.hs view
@@ -16,6 +16,7 @@ 	start, 	startActionItem, 	end,+	end', 	finalize, 	addErrorMessage, 	note,@@ -105,6 +106,10 @@ end :: Bool -> JSONBuilder end b (Just (o, _)) = Just (HM.insert "success" (toJSON' b) o, True) end _ Nothing = Nothing++end' :: JSONBuilder+end' (Just (o, _)) = Just (o, True)+end' Nothing = Nothing  -- Always include error-messages field, even if empty, -- to make the json be self-documenting.
Messages/Progress.hs view
@@ -106,6 +106,11 @@ metered' st setclear othermeterupdate msize bwlimit showoutput a = go st   where 	go (MessageState { outputType = QuietOutput }) = nometer+	go (MessageState { outputType = NormalOutput, disableProgressMeters = True }) = do+		meter <- liftIO $ mkMeter msize dontDisplayMeter+		m <- liftIO $ rateLimitMeterUpdate consoleratelimit meter $+			updateMeter meter+		a meter =<< mkmeterupdate m 	go (MessageState { outputType = NormalOutput, concurrentOutputEnabled = False }) = do 		showoutput 		meter <- liftIO $ mkMeter msize $ @@ -175,7 +180,7 @@  	minratelimit = min consoleratelimit jsonratelimit 		-{- Poll file size to display meter. -}+{- Poll file size to display meter while running an action. -} meteredFile 	:: MeterSize sizer 	=> OsPath
P2P/Http/Client.hs view
@@ -91,15 +91,17 @@ 	-- When unable to speak to the server, re-probe for its url, and 	-- try again if it changed. This avoids the user needing to manually 	-- update the remote.name.annexUrl config.-	fallbackreprobe s = do-		r <- reprobeurl-		gc <- Annex.getRemoteGitConfig r-		case remoteAnnexP2PHttpUrl gc of-			Just p2purl' | Just p2purl' /= p2purl ->-				p2pHttpClientVersions' allowedversion p2purl' rmt r fallback clientaction >>= \case-					Just res -> return res-					Nothing -> fallback s-			_ -> fallback s+	fallbackreprobe s+		| maybe False isUnavailableP2PHttpUrl p2purl = fallback s+		| otherwise = do+			r <- reprobeurl+			gc <- Annex.getRemoteGitConfig r+			case remoteAnnexP2PHttpUrl gc of+				Just p2purl' | Just p2purl' /= p2purl ->+					p2pHttpClientVersions' allowedversion p2purl' rmt r fallback clientaction >>= \case+						Just res -> return res+						Nothing -> fallback s+				_ -> fallback s  p2pHttpClientVersions' 	:: (ProtocolVersion -> Bool)
P2P/Http/State.hs view
@@ -27,10 +27,11 @@ import Types.WorkerPool import Annex.WorkerPool import Annex.BranchState+import Annex.Action import Annex.Concurrent import Types.Concurrency import Types.Cluster-import CmdLine.Action (startConcurrency)+import CmdLine.Action (startConcurrency', startConcurrency) import Utility.ThreadScheduler import Utility.HumanTime import Logs.Proxy@@ -40,13 +41,15 @@ import qualified P2P.Proxy as Proxy import qualified Types.Remote as Remote import Remote.List+import Utility.LRU -import Servant+import Servant hiding (Unique) import qualified Data.Map.Strict as M import qualified Data.Set as S import Control.Concurrent.Async import Control.Concurrent.STM import Data.Time.Clock.POSIX+import Data.Unique  data P2PHttpServerState = P2PHttpServerState 	{ servedRepos :: M.Map UUID PerRepoServerState@@ -86,13 +89,15 @@ 	, branchChangesInProgress :: TMVar Bool 	} -type AnnexWorkerPool = TMVar (WorkerPool (Annex.AnnexState, Annex.AnnexRead))+type AnnexWorker = (Annex.AnnexState, Annex.AnnexRead) +type AnnexWorkerPool = TMVar (WorkerPool (AnnexWorker, Unique))+ type GetServerMode = IsSecure -> Maybe Auth -> ServerMode  data ServerMode 	= ServerMode-	{ serverMode :: P2P.ServerMode+		{ serverMode :: P2P.ServerMode 		, unauthenticatedLockingAllowed :: Bool 		, authenticationAllowed :: Bool 		}@@ -309,9 +314,10 @@ 	-> ProxyConnectionPoolSize 	-> ClusterConcurrency 	-> LockedFilesQSem+	-> AnnexWorkerLimit	 	-> AnnexWorkerPool 	-> Annex P2PHttpServerState-mkP2PHttpServerState getservermode updaterepos proxyconnectionpoolsize clusterconcurrency lockedfilesqsem workerpool = do+mkP2PHttpServerState getservermode updaterepos proxyconnectionpoolsize clusterconcurrency lockedfilesqsem workerlimit workerpool = do 	enableInteractiveBranchAccess 	myuuid <- getUUID 	myproxies <- M.lookup myuuid <$> getProxies@@ -328,7 +334,7 @@ 		(acquireconn reqv annexstate annexread) 		workerpool annexstate annexread getservermode lockedfilesqsem 	asynccommitter <- liftIO $ async $-		branchCommitter st endv+		branchCommitter st endv workerlimit workerpool 	let endit = do 		liftIO $ atomically $ putTMVar endv () 		liftIO $ wait asyncservicer@@ -373,7 +379,7 @@ 					proxyConnection proxyconnectionpoolsize relv connparams runner proxypool conn ready 				Nothing -> checkcanproxy runnertype annexstate annexread myproxies proxypool relv connparams ready 	  where-		runner = annexActionRunner runnertype workerpool annexstate annexread+		runner = annexActionRunner runnertype workerlimit workerpool annexstate annexread  	checkcanproxy runnertype annexstate annexread myproxies proxypool relv connparams ready = 		runner@@ -393,7 +399,7 @@ 			Left ex -> return $ Left $ 				ConnectionFailed $ show ex 	  where-		runner = annexActionRunner runnertype workerpool annexstate annexread+		runner = annexActionRunner runnertype workerlimit workerpool annexstate annexread 		bypass = P2P.Bypass $ S.fromList $ connectionBypass connparams 		proxyconnection openconn = openconn >>= \case 			Right conn -> proxyConnection proxyconnectionpoolsize@@ -645,38 +651,237 @@ 		Nothing -> return () 		Just locker -> wait (lockerThread locker) -withAnnexWorkerPool :: Maybe Concurrency -> Maybe Cpus -> (AnnexWorkerPool -> Annex a) -> Annex a-withAnnexWorkerPool mconc mcpus a = do+withAnnexWorkerPool+	:: Maybe Concurrency+	-> Maybe Cpus+	-> AnnexWorkerLimit+	-> (AnnexWorkerPool -> Annex a)+	-> Annex a+withAnnexWorkerPool mconc mcpus workerlimit a = do 	maybe noop setCpus mcpus 	maybe noop (setConcurrency . ConcurrencyCmdLine) mconc-	startConcurrency transferStages $+	startConcurrency' stages $ \nworkers -> 		Annex.getState Annex.workers >>= \case-			Nothing -> giveup "Use -Jn or set annex.jobs to configure the number of worker threads."-			Just wp -> a wp+			Nothing -> giveup "Use --jobs or set annex.jobs to configure the number of worker threads."+			Just wpv -> go wpv nworkers+  where+	stages = transferStages+	go wpv nworkers = case workerlimit of+		NoWorkerLimit -> use $ atomically $ readTMVar wpv+		WorkerLimit { makeNewWorker = Just maker } -> do+			liftIO $ setAnnexWorkerLimit workerlimit nworkers+			let maker' = do+				strd <- maker+				((), strd') <- Annex.run strd $ do+					setConcurrency $ ConcurrencyCmdLine $ Concurrent 1+					startConcurrency stages noop+				return strd'+			use (allocateWorkerPoolM maker' nworkers stages)+				`finally` quiesce True+		WorkerLimit { makeNewWorker = Nothing } ->+			error "internal"+	use mkp = do+		tp <- liftIO $ taggedWorkerPool =<< mkp+		awp <- liftIO $ newTMVarIO tp+		a awp -inAnnexWorker :: AnnexWorkerPool -> Annex a -> IO (Either SomeException a)-inAnnexWorker poolv annexaction = do-	(workerstrd, workerstage) <- atomically $ waitStartWorkerSlot poolv+inAnnexWorker :: AnnexWorkerLimit -> AnnexWorkerPool -> Annex a -> IO (Either SomeException a)+inAnnexWorker workerlimit poolv annexaction =+	allocateAnnexWorker workerlimit (waitStartWorkerSlot poolv)+		>>= inAnnexWorker' workerlimit poolv annexaction++inAnnexWorkerNonBlocking :: AnnexWorkerLimit -> AnnexWorkerPool -> Annex a -> IO (Maybe (Either SomeException a))+inAnnexWorkerNonBlocking workerlimit poolv annexaction =+	allocateAnnexWorkerNonBlocking workerlimit (waitStartWorkerSlot poolv) >>= \case+		Nothing -> return Nothing+		Just v -> Just <$> inAnnexWorker' workerlimit poolv annexaction v++inAnnexWorker'+	:: AnnexWorkerLimit+	-> AnnexWorkerPool+	-> Annex a+	-> ((AnnexWorker, Unique), WorkerStage)+	-> IO (Either SomeException a)+inAnnexWorker' workerlimit poolv annexaction ((workerstrd, workerid), workerstage) = do 	resv <- newEmptyTMVarIO 	aid <- async $ do 		(res, strd) <- Annex.run workerstrd annexaction 		atomically $ putTMVar resv res-		return strd+		return (strd, workerid) 	atomically $ do 		pool <- takeTMVar poolv 		let !pool' = addWorkerPool (ActiveWorker aid workerstage) pool 		putTMVar poolv pool'-	(res, workerstrd') <- waitCatch aid >>= \case-		Right strd -> do+	+	(res, workerstrdid) <- waitCatch aid >>= \case+		Right strdid -> do 			r <- atomically $ takeTMVar resv-			return (Right r, strd)-		Left err -> return (Left err, workerstrd)+			return (Right r, strdid)+		Left err -> return (Left err, (workerstrd, workerid))+	 	atomically $ do+		deallocateAnnexWorker workerlimit workerstrd workerid 		pool <- takeTMVar poolv-		let !pool' = deactivateWorker pool aid workerstrd'+		let !pool' = deactivateWorker pool aid workerstrdid 		putTMVar poolv pool'+ 	return res +data AnnexWorkerLimit+	= NoWorkerLimit+	| WorkerLimit +		{ workerLimit :: TMVar (Int, WarmWorkers)+		, makeNewWorker :: Maybe (IO AnnexWorker)+		-- ^ quiesceAnnexWorker calls stopCoProcesses, which+		-- stops helper processes that are in resource pools+		-- set up by dupState and shared with other AnnexWorkers.+		-- So this must not use dupState.+		, workerLimitName :: Maybe String+		}++-- Workers that are not in use, but that have been warmed up: They have+-- opened file handles, started helper processes, etc.+type WarmWorkers = LRU Unique AnnexWorker++mkAnnexWorkerLimit :: IO AnnexWorkerLimit+mkAnnexWorkerLimit = WorkerLimit +	<$> newTMVarIO (1, emptyLRU)+	<*> pure Nothing+	<*> pure Nothing++setAnnexWorkerLimitMaker :: IO AnnexWorker -> AnnexWorkerLimit -> AnnexWorkerLimit+setAnnexWorkerLimitMaker maker workerlimit@(WorkerLimit {}) =+	workerlimit { makeNewWorker = Just maker }+setAnnexWorkerLimitMaker _ workerlimit = workerlimit++setAnnexWorkerLimitName :: String -> AnnexWorkerLimit -> AnnexWorkerLimit+setAnnexWorkerLimitName name workerlimit@(WorkerLimit {}) =+	workerlimit { workerLimitName = Just name }+setAnnexWorkerLimitName _ workerlimit = workerlimit++setAnnexWorkerLimit :: AnnexWorkerLimit -> Int -> IO ()+setAnnexWorkerLimit WorkerLimit { workerLimit = v } nworkers =+	atomically $ do+		(_, lru) <- takeTMVar v+		putTMVar v (nworkers, lru)+setAnnexWorkerLimit NoWorkerLimit _ = noop++describeAnnexWorker :: AnnexWorkerLimit -> Unique -> String+describeAnnexWorker (WorkerLimit { workerLimitName = Just name }) workerid =+	name ++ " " ++ descibeAnnexWorker' workerid+describeAnnexWorker _ workerid =+	descibeAnnexWorker' workerid++descibeAnnexWorker' :: Unique -> String+descibeAnnexWorker' workerid = "#" ++ show (hashUnique workerid)++{- Allocate a new annex worker.+ - If necessary, first quiesces the least recently used one.+ -+ - Blocks when the server is too busy.+ -}+allocateAnnexWorker+	:: AnnexWorkerLimit+	-> STM ((AnnexWorker, Unique), WorkerStage)+	-> IO ((AnnexWorker, Unique), WorkerStage)+allocateAnnexWorker workerlimit a = +	atomically (allocateAnnexWorker' workerlimit a)+		>>= allocatedAnnexWorker workerlimit a++allocateAnnexWorkerNonBlocking+	:: AnnexWorkerLimit+	-> STM ((AnnexWorker, Unique), WorkerStage)+	-> IO (Maybe ((AnnexWorker, Unique), WorkerStage))+allocateAnnexWorkerNonBlocking workerlimit a = do+	r <- atomically $+		(Just <$> allocateAnnexWorker' workerlimit a)+			`orElse`+		return Nothing+	case r of+		Nothing -> return Nothing+		Just r' -> Just <$> allocatedAnnexWorker workerlimit a r'++allocateAnnexWorker'+	:: AnnexWorkerLimit+	-> STM ((AnnexWorker, Unique), WorkerStage)+	-> STM (Either (Unique, AnnexWorker) ((AnnexWorker, Unique), WorkerStage))+allocateAnnexWorker' NoWorkerLimit a = Right <$> a+allocateAnnexWorker' (WorkerLimit { workerLimit = v }) a = do+	(n, warm) <- takeTMVar v+	if n < 1+		then case popLRU warm of+			(warm', Just toquiesce) -> do+				putTMVar v (n-1, warm')+				return $ Left toquiesce+			_ -> retry+		else do+			res@((_, workerid), _) <- a+			putTMVar v (n-1, removeLRU warm workerid)+			return $ Right res++allocatedAnnexWorker+	:: AnnexWorkerLimit+	-> STM ((AnnexWorker, Unique), WorkerStage)+	-> Either (Unique, AnnexWorker) ((AnnexWorker, Unique), WorkerStage)+	-> IO ((AnnexWorker, Unique), WorkerStage)+allocatedAnnexWorker workerlimit a r =+	observe reportworkerid $ case r of+		Right res -> return res+		Left toquiesce -> do+			quiesceAnnexWorker workerlimit toquiesce+			atomically $ postQueusceAnnexWorker workerlimit a+  where+	reportworkerid ((_, workerid), _) =+		debug "P2P.Http" $ "Using worker "+			++ describeAnnexWorker workerlimit workerid++postQueusceAnnexWorker+	:: AnnexWorkerLimit+	-> STM ((AnnexWorker, Unique), WorkerStage)+	-> STM ((AnnexWorker, Unique), WorkerStage)+postQueusceAnnexWorker (WorkerLimit { workerLimit = v }) a = do+	(n, warm) <- takeTMVar v+	res@((_, workerid), _) <- a+	putTMVar v (n, removeLRU warm workerid)+	return res+postQueusceAnnexWorker NoWorkerLimit a = a++-- Called after allocateAnnexWorker has allocated a worker,+-- and it is done being used.+deallocateAnnexWorker :: AnnexWorkerLimit -> AnnexWorker -> Unique -> STM ()+deallocateAnnexWorker NoWorkerLimit _ _ = noop+deallocateAnnexWorker (WorkerLimit { workerLimit = v }) worker workerid = do+	(n, warm) <- takeTMVar v+	let warm' = addLRU warm workerid worker+	putTMVar v (n+1, warm')++-- Make an Annex worker no longer be warmed up, by stopping all+-- helper processes, closing file handles, etc.+quiesceAnnexWorker :: AnnexWorkerLimit -> (Unique, AnnexWorker) -> IO ()+quiesceAnnexWorker workerlimit (workerid, workerstrd) = do+	debug "P2P.Http" $ "Quiesceing worker "+		++ describeAnnexWorker workerlimit workerid+	-- This discards the changed state, so the only things it can+	-- safely do are those that do not alter state.+	res <- tryNonAsync $ Annex.eval workerstrd $+		quiesce True +	case res of+		Left ex -> debug "P2P.Http" $ "Quiesceing worker "+			++ describeAnnexWorker workerlimit workerid+			++ " failed: " ++ show ex+		Right () -> return ()++-- When there is a WorkerLimit, handleRequestAnnex may warm up+-- an Annex state, starting helper processes, opening file handles etc.+-- Quiesce it here to avoid one such Annex state per served repository+-- remaining warmed up.+--+-- With NoWorkerLimit, there is no need to quiesce here, because there+-- is only one such Annex state.+quiesceRequestAnnex :: AnnexWorkerLimit -> Annex ()+quiesceRequestAnnex NoWorkerLimit = noop+quiesceRequestAnnex (WorkerLimit {}) = quiesce True+ handleRequestAnnex :: PerRepoServerState -> Annex a -> IO (Either SomeException a) handleRequestAnnex st = handleRequestAnnex' (annexState st) (annexRead st) @@ -701,9 +906,11 @@ 	-- When using this, must enforce bounds first 	| RequestRunner -annexActionRunner :: AnnexActionRunner -> AnnexWorkerPool -> TMVar Annex.AnnexState -> Annex.AnnexRead -> Annex a -> IO (Either SomeException a)-annexActionRunner WorkerPoolRunner workerpool _ _ = inAnnexWorker workerpool-annexActionRunner RequestRunner _ st rd = handleRequestAnnex' st rd+annexActionRunner :: AnnexActionRunner -> AnnexWorkerLimit -> AnnexWorkerPool -> TMVar Annex.AnnexState -> Annex.AnnexRead -> Annex a -> IO (Either SomeException a)+annexActionRunner WorkerPoolRunner workerlimit workerpool _ _ =+	inAnnexWorker workerlimit workerpool+annexActionRunner RequestRunner _ _ st rd =+	handleRequestAnnex' st rd  data ProxyConnection = ProxyConnection 	{ proxyConnectionRemoteUUID :: UUID@@ -842,8 +1049,8 @@ 	send st b = liftIO $ atomically $  		putTMVar (branchChangesInProgress st) b -branchCommitter :: PerRepoServerState -> TMVar () -> IO ()-branchCommitter st endv = do+branchCommitter :: PerRepoServerState -> TMVar () -> AnnexWorkerLimit -> AnnexWorkerPool -> IO ()+branchCommitter st endv workerlimit workerpool = do 	idlev <- newEmptyTMVarIO 	void $ async $ committer idlev 	go idlev (0 :: Integer)@@ -874,10 +1081,22 @@ 				-- Once it's been idle for a second, 				-- commit the journalled changes. 				atomically (tryTakeTMVar idlev) >>= \case-					Just () ->-						void $ handleRequestAnnex st $-							Annex.Branch.commit =<< Annex.Branch.commitMessage+					Just () -> runcommit 					Nothing -> noop 				committer idlev 			Left () -> return () +	runcommit =+		-- Use a warmed up AnnexWorker to do the commit when possible.+		-- But, if the server is too busy, the commit still needs+		-- to happen promptly. So avoid blocking and fall back+		-- to running the commit using the RequestRunner Annex+		-- state. Which then needs to be quiesced, which makes+		-- it less efficient.+		inAnnexWorkerNonBlocking workerlimit workerpool commit >>= \case+			Just _ -> return ()+			Nothing -> void $ handleRequestAnnex st $ do+				commit+				quiesceRequestAnnex workerlimit+	+	commit = Annex.Branch.commit =<< Annex.Branch.commitMessage
P2P/Http/Url.hs view
@@ -70,6 +70,9 @@ unavailableP2PHttpUrl p = p 	{ p2pHttpBaseUrl = (p2pHttpBaseUrl p) { baseUrlHost = "!dne!" } } +isUnavailableP2PHttpUrl :: P2PHttpUrl -> Bool+isUnavailableP2PHttpUrl p = unavailableP2PHttpUrl p == p+ -- When a p2phttp url is on the same host as a git repo, which also uses -- http, the same username+password is assumed to be used for both. isP2PHttpSameHost :: P2PHttpUrl -> Git.Repo -> Bool
P2P/Protocol.hs view
@@ -229,27 +229,39 @@  -- | Since ProtoAssociatedFile is not the last thing in a protocol line, -- its serialization cannot contain any whitespace. This is handled--- by replacing whitespace with '%' (and '%' with '%%')+-- by replacing ' ' with '%' (and '%' with '%%') -- -- When deserializing an AssociatedFile from a peer, that escaping is--- reversed. Unfortunately, an input tab will be deescaped to a space--- though. And it's sanitized, to avoid any control characters that might--- cause problems when it's displayed to the user.+-- reversed. ----- These mungings are ok, because a ProtoAssociatedFile is normally+-- This does not currently round trip cleanly. That is done to avoid+-- breaking backwards compatability with old versions of git-annex,+-- where the P2P protocol split words on isSpace. Which is why this+-- escapes '\t' and other spaces (including unicode spaces) to '%' as well.+--+-- Control characters are also sanitized. This sanitization is probably+-- unncessary, since git-annex uses Utility.SafeOutput to avoid displaying+-- control characters to the user.+--+-- Not roundtripping is ok because a ProtoAssociatedFile is normally -- only displayed to the user and so does not need to match a file on disk.--- It may also be used in checking preferred content, which is very--- unlikely to care about spaces vs tabs or control characters.+-- (It may also be used in checking preferred content, which is very+-- unlikely to care about spaces vs tabs or control characters.)+--+-- In the future, this could be made to round trip cleanly+-- by only escaping ' ' and not sanitizing control characters.+-- That should only be done once it's very unlikely that a peer+-- will be running a version of git-annex older than 10.20261029. instance Proto.Serializable ProtoAssociatedFile where 	serialize (ProtoAssociatedFile (AssociatedFile Nothing)) = "" 	serialize (ProtoAssociatedFile (AssociatedFile (Just af))) =  		fromOsPath $ toInternalGitPath $-			OS.concat $ map esc $ OS.unpack af+			toOsPath $ concat $ map esc $ fromOsPath af 	  where-	  	esc c = case OS.toChar c of-			'%' -> literalOsPath "%%"-			c' | isSpace c' -> literalOsPath "%"-			_ -> OS.singleton c+	  	esc c+			| c == '%' = "%%"+			| isSpace c = "%"+			| otherwise = [c] 	 	deserialize s = case fromInternalGitPath $ toOsPath $ deesc [] s of 		f@@ -261,7 +273,7 @@ 	  where 	  	deesc b [] = reverse b 		deesc b ('%':'%':cs) = deesc ('%':b) cs-		deesc b ('%':cs) = deesc ('_':b) cs+		deesc b ('%':cs) = deesc (' ':b) cs 		deesc b (c:cs) 			| isControl c = deesc ('_':b) cs 			| otherwise = deesc (c:b) cs
Remote/Git.hs view
@@ -1004,6 +1004,7 @@ 			let c = adduuid (configRepoUUID renamedr) $ 				addurl $ 				addproxiedby $+				addverified $ 				adjustclusternode clusters $ 				inheritconfigs $ Git.fullconfig r' 			in r'@@ -1024,6 +1025,11 @@ 				(Git.ConfigValue $ fromUUID u) 			Nothing -> id 		+		addverified = case formatRemoteConfigVerification RemoteConfigVerified of+			Just s -> addremoteannexfield VerifiedField+				(Git.ConfigValue $ encodeBS s)+			Nothing -> id+ 		-- A node of a cluster that is being proxied along with 		-- that cluster does not need to be synced with 		-- by default, because syncing with the cluster will
Test.hs view
@@ -1,11 +1,12 @@ {- git-annex test suite  -- - Copyright 2010-2024 Joey Hess <id@joeyh.name>+ - Copyright 2010-2026 Joey Hess <id@joeyh.name>  -  - Licensed under the GNU AGPL version 3 or higher.  -}  {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE CPP #-}  module Test where@@ -27,6 +28,11 @@ import qualified Utility.RawFilePath as R import qualified Data.List.NonEmpty as NE import Data.String+#ifdef WITH_MAGICMIME+#ifdef WITH_OSPATH+import System.OsString (osstr)+#endif+#endif  import Common import CmdLine.GitAnnex.Options@@ -89,6 +95,7 @@ import qualified Utility.CopyFile import qualified Utility.MoveFile import qualified Utility.StatelessOpenPGP+import qualified Utility.LRU import qualified Types.Remote #ifndef mingw32_HOST_OS import qualified Remote.Helper.Encryptable@@ -203,6 +210,7 @@ 	, testProperty "prop_standardGroups_parse" Logs.PreferredContent.prop_standardGroups_parse 	, testProperty "prop_balanced_stable" Annex.Balanced.prop_balanced_stable 	, testProperty "prop_httpConfigKeys_sane" Git.Config.Url.prop_httpConfigKeys_sane+	, testProperty "prop_LRU_sane" Utility.LRU.prop_LRU_sane 	] ++ map (uncurry testProperty) combos   where 	combos = concat@@ -564,16 +572,34 @@ #ifdef WITH_MAGICMIME 	git "config" ["annex.largefiles", "mimeencoding=binary"] 		"git config annex.largefiles"-	writeFileString (literalOsPath "binary") "\127"+	writeFileString (literalOsPath "binary") binarycontent 	writeFileString (literalOsPath "text") "test\n" -	git_annex "add" ["binary", "text"]+#ifdef WITH_OSPATH+	writeFileString unicodefn binarycontent+#endif+	git_annex "add" [] 		"git-annex add with mimeencoding in largefiles" 	git_annex "sync" ["--no-content"] 		"git-annex sync"-	(isJust <$> annexeval (Annex.CatFile.catKeyFile (literalOsPath "binary")))+	addedannex (literalOsPath "binary") 		@? "binary file not added to annex despite mimeencoding config"-	(isNothing <$> annexeval (Annex.CatFile.catKeyFile (literalOsPath "text")))+	(not <$> addedannex (literalOsPath "text")) 		@? "non-binary file got added to annex despite mimeencoding config"+#ifndef mingw32_HOST_OS+#ifdef WITH_OSPATH+	-- This is a known failure on windows, see +	-- doc/bugs/mimeencoding_detection_is_not_working.mdwn+	addedannex unicodefn+		@? "binary file with unicode name not added to annex despite mimeencoding config"+#endif+#endif+  where+	binarycontent = "\127"+#ifdef WITH_OSPATH+	-- quasiquoted because fromString for OsString mangles unicode+	unicodefn = [osstr|fo¡oüঊ|]+#endif+	addedannex f = isJust <$> annexeval (Annex.CatFile.catKeyFile f) #else 	return () #endif
Types/Messages.hs view
@@ -42,6 +42,7 @@ data MessageState = MessageState 	{ outputType :: OutputType 	, concurrentOutputEnabled :: Bool+	, disableProgressMeters :: Bool 	, sideActionBlock :: SideActionBlock 	, consoleRegion :: Maybe ConsoleRegion 	, consoleRegionErrFlag :: Bool@@ -56,6 +57,7 @@ 	return $ MessageState 		{ outputType = NormalOutput 		, concurrentOutputEnabled = False+		, disableProgressMeters = False 		, sideActionBlock = NoBlock 		, consoleRegion = Nothing 		, consoleRegionErrFlag = False
Types/WorkerPool.hs view
@@ -1,10 +1,12 @@ {- Worker thread pool.  -- - Copyright 2019-2023 Joey Hess <id@joeyh.name>+ - Copyright 2019-2026 Joey Hess <id@joeyh.name>  -  - Licensed under the GNU AGPL version 3 or higher.  -} +{-# LANGUAGE DeriveFunctor #-}+ module Types.WorkerPool where  import Types.Direction@@ -12,6 +14,8 @@ import Control.Concurrent import Control.Concurrent.Async import qualified Data.Set as S+import Data.Unique+import Control.Monad  -- | Pool of worker threads.  data WorkerPool t = WorkerPool@@ -36,6 +40,7 @@ data Worker t 	= IdleWorker WorkerStage 	| ActiveWorker (Async t) WorkerStage+	deriving (Functor)  instance Show (Worker t) where 	show (IdleWorker s) = "IdleWorker " ++ show s@@ -115,16 +120,32 @@ -- | Allocates a WorkerPool that has the specified number of workers -- in it, of each stage. allocateWorkerPool :: t -> Int -> UsedStages -> WorkerPool t-allocateWorkerPool t n u = WorkerPool+allocateWorkerPool t n u =+	let stages = workerPoolStages u+	in allocateWorkerPool' u+		(replicate (workerPoolSize n stages) t)+		stages++allocateWorkerPoolM :: IO t -> Int -> UsedStages -> IO (WorkerPool t)+allocateWorkerPoolM mkt n u = do+	let stages = workerPoolStages u+	ts <- replicateM (workerPoolSize n stages) mkt+	return $ allocateWorkerPool' u ts stages++allocateWorkerPool' :: UsedStages -> [t] -> [WorkerStage] -> WorkerPool t+allocateWorkerPool' u ts stages = WorkerPool 	{ usedStages = u 	, workerList = map IdleWorker $-		take totalthreads $ concat $ repeat stages-	, spareVals = replicate totalthreads t+		take (length ts) $ concat $ repeat stages+	, spareVals = ts 	}-  where-	stages = StartStage : S.toList (stageSet u)-	totalthreads = n * length stages +workerPoolSize :: Int -> [WorkerStage] -> Int+workerPoolSize n stages = n * length stages++workerPoolStages :: UsedStages -> [WorkerStage]+workerPoolStages u = StartStage : S.toList (stageSet u)+ addWorkerPool :: Worker t -> WorkerPool t -> WorkerPool t addWorkerPool w pool = pool { workerList = w : workerList pool } @@ -162,3 +183,17 @@   where 	idle (IdleWorker _) = True 	idle (ActiveWorker _ _) = False++{- Tags each value in a WorkerPool with a Unique identifier. -}+taggedWorkerPool :: WorkerPool t -> IO (WorkerPool (t, Unique))+taggedWorkerPool wp = do+	wl <- forM (workerList wp) $ \w -> do+		u <- newUnique+		return (fmap (\v -> (v, u)) w)+	sl <- zip (spareVals wp)+		<$> replicateM (length (spareVals wp)) newUnique+	return $ WorkerPool+		{ usedStages = usedStages wp+		, workerList = wl+		, spareVals = sl+		} 
Utility/Hash.hs view
@@ -11,7 +11,6 @@  import Utility.Hash.Types as X import Utility.Hash.Incremental as X-#ifdef WITH_BOTAN import Utility.Hash.Botan as X -- Fall back to crypton for hashes not in botan. import Utility.Hash.Crypton as X@@ -30,9 +29,6 @@ 	, blake2bp_512 	, blake2bp_512_hasher 	)-#else-import Utility.Hash.Crypton as X-#endif #ifdef WITH_BLAKE3 import Utility.Hash.Blake3 as X #endif
Utility/Hash/HMAC.hs view
@@ -5,9 +5,8 @@  - License: BSD-2-clause  -} -{-# LANGUAGE PackageImports #-} {-# LANGUAGE RankNTypes #-}-{-# LANGUAGE OverloadedStrings, CPP #-}+{-# LANGUAGE OverloadedStrings #-}  module Utility.Hash.HMAC ( 	Mac(..),@@ -19,15 +18,9 @@ import qualified Data.ByteString as S import qualified Data.Text as T import qualified Data.Text.Encoding as T-#ifdef WITH_BOTAN import Botan.Low.MAC import Botan.Low.Hash hiding (HashDigest) import System.IO.Unsafe (unsafePerformIO)-#else-import Utility.Hash.Crypton (hashDigest)-import "crypton" Crypto.MAC.HMAC hiding (Context)-import "crypton" Crypto.Hash-#endif  data Mac = HmacSha1 | HmacSha224 | HmacSha256 | HmacSha384 | HmacSha512 	deriving (Eq)@@ -45,19 +38,12 @@ 	HmacSha384 -> use SHA384 	HmacSha512 -> use SHA512   where-#ifdef WITH_BOTAN 	use alg k m = unsafePerformIO $ do 		maccer <- macInit (hmac alg) 		macSetKey maccer k 		macUpdate maccer m 		auth <- macFinal maccer 		return (f (HashDigest auth))-#else-	use alg k m = f (hashDigest (hmacGetDigest (hmacWitnessAlg alg k m)))--	hmacWitnessAlg :: HashAlgorithm a => a -> S.ByteString -> S.ByteString -> HMAC a-	hmacWitnessAlg _ = hmac-#endif  -- Check that all the MACs continue to produce the same. props_macs_stable :: [(String, Bool)]
+ Utility/LRU.hs view
@@ -0,0 +1,202 @@+{- LRU+ -+ - Copyright 2026 Joey Hess <id@joeyh.name>+ -+ - License: BSD-2-clause+ -}++{-# LANGUAGE StrictData, BangPatterns #-}++module Utility.LRU (+	LRU,+	emptyLRU,+	listLRU,+	addLRU,+	removeLRU,+	popLRU,+	mapLRU,+	testLRU,+	prop_LRU_sane,+) where++import qualified Data.Map.Strict as M++data LRU k v = LRU+	{ lruFirst :: Maybe k+	, lruLast :: Maybe k+	, lruMap :: M.Map k (LinkedVal k v)+	}+	deriving (Show, Eq)++data LinkedVal k v = LinkedVal+	{ value :: v+	, prev :: Maybe k+	, next :: Maybe k+	}+	deriving (Show, Eq)++setvalue :: Ord k => v -> k -> M.Map k (LinkedVal k v) -> M.Map k (LinkedVal k v)+setvalue v = M.adjust (\linkedval -> linkedval { value = v })++setprev :: Ord k => Maybe k -> k -> M.Map k (LinkedVal k v) -> M.Map k (LinkedVal k v)+setprev v = M.adjust (\linkedval -> linkedval { prev = v })++setnext :: Ord k => Maybe k -> k -> M.Map k (LinkedVal k v) -> M.Map k (LinkedVal k v)+setnext v = M.adjust (\linkedval -> linkedval { next = v })++emptyLRU :: LRU k v+emptyLRU = LRU Nothing Nothing M.empty++listLRU :: Ord k => LRU k v -> [(k, v)]+listLRU lru = case lruFirst lru of+	Nothing -> []+	Just k -> walk k+  where+	walk k = case M.lookup k (lruMap lru) of+		Nothing -> []+		Just linkedval -> (k, value linkedval) :+			case prev linkedval of+				Just k' -> walk k'+				Nothing -> []++removeLRU :: Ord k => LRU k v -> k -> LRU k v+removeLRU lru k = case M.lookup k (lruMap lru) of+	Nothing -> lru+	Just linkedval -> +		let !lru' = addLRU lru k (value linkedval)+		in lru'+			{ lruLast = case lruLast lru' of+				Nothing -> Nothing+				Just k' -> case M.lookup k' (lruMap lru') of+					Nothing -> Nothing+					Just linkedval' -> next linkedval'+			, lruFirst = case lruFirst lru' of+				Just k' | k' /= k -> Just k'+				_ -> Nothing+			, lruMap = M.delete k $ unsetprev $ lruMap lru'+			}+  where+	unsetprev m = case M.lookup k m of+		Nothing -> m+		Just linkedval -> case next linkedval of+			Nothing -> m+			Just k' -> setprev Nothing k' m++{- When the key already exists in the LRU, its value is updated, and it is+ - moved to last. -}+addLRU :: Ord k => LRU k v -> k -> v -> LRU k v+addLRU lru k v+	| lruLast lru == Just k = lru+		{ lruMap = setvalue v k (lruMap lru)+		}+	| otherwise = LRU+		{ lruFirst = newfirst+		, lruLast = Just k+		, lruMap = +			let !linkedval = LinkedVal+				{ value = v+				, prev = Nothing+				, next = lruLast lru+				}+			in updatefirst $ M.insert k linkedval $+				skipover $ updateprev $ lruMap lru+		}+  where+	newfirst = case lruFirst lru of+		Nothing -> Just k+		Just k'+			| k' /= k -> Just k'+			| otherwise -> case M.lookup k' (lruMap lru) of+				Nothing -> Nothing+				Just linkedval -> prev linkedval+	updateprev m = case lruLast lru of+		Nothing -> m+		Just k' -> setprev (Just k) k' m+	updatefirst m = case newfirst of+		Nothing -> m+		Just k' -> setnext Nothing k' m+	skipover m = case M.lookup k m of+		Nothing -> m+		Just linkedval -> case (prev linkedval, next linkedval) of+			(Just prevk, Just nextk) -> +				setprev (Just prevk) nextk $+					setnext (Just nextk) prevk m+			_  -> m++popLRU :: Ord k => LRU k v -> (LRU k v, Maybe (k, v))+popLRU lru = case lruFirst lru of+	Nothing -> (lru, Nothing)+	Just first ->+		case M.lookup first (lruMap lru) of+			Nothing -> (lru, Nothing)+			Just linkedval ->+				let !lru' = LRU+					{ lruFirst = prev linkedval+					, lruLast = case lruLast lru of+						Just k | k == first -> Nothing+						_ -> lruLast lru+					, lruMap = skipover linkedval $+						M.delete first (lruMap lru)+					}+				in (lru', Just (first, value linkedval))+  where+	skipover linkedval m = case prev linkedval of+		Just k -> setnext Nothing k m+		Nothing -> m++mapLRU :: (Ord k, Ord k') => (k -> k') -> (v -> v') -> LRU k v -> LRU k' v'+mapLRU kf vf lru = LRU+	{ lruFirst = kf <$> lruFirst lru+	, lruLast = kf <$> lruLast lru+	, lruMap = M.fromList $ map go $ M.toList $ lruMap lru+	}+  where+	go (k, linkedval) = +		(kf k, linkedval+			{ value = vf (value linkedval)+			, prev = kf <$> prev linkedval+			, next = kf <$> next linkedval+			})++prop_LRU_sane :: Bool+prop_LRU_sane = and testLRU++testLRU :: [Bool]+testLRU =+	[ listLRU (fst (popLRU l1)) == []+	, listLRU l1 == [(1, foo)]+	, listLRU l2 == [(1, foo), (2, bar)]+	, listLRU l3 == [(1, foo),(2, bar),(3, baz)]+	, listLRU l4 == [(1, foo),(2, bar),(3, baz), (4, new)]+	, popLRU l1 == (emptyLRU, Just (1, foo))+	, popLRU l2 == (l2no1, Just (1, foo))+	, popLRU l3 == (l3no1, Just (1, foo))+	, popLRU (fst (popLRU l1)) == (emptyLRU, Nothing)+	, popLRU (fst (popLRU (fst (popLRU l2)))) == (emptyLRU, Nothing)+	, addLRU l3 1 new == addLRU l3no1 1 new+	, addLRU l3 2 new == addLRU (addLRU l1 3 baz) 2 new+	, addLRU l3 3 new == addLRU l2 3 new+	, removeLRU emptyLRU 1 == (emptyLRU :: LRU Int String)+	, removeLRU l1 1 == emptyLRU+	, removeLRU l2 3 == l2+	, removeLRU l3 3 == l2+	, removeLRU l3 1 == l3no1+	, removeLRU l3 2 == addLRU l1 3 baz+	, removeLRU l2 2 == l1+	, removeLRU l2 1 == l2no1+	, removeLRU l4 4 == l3+	, removeLRU l4 2 == addLRU (addLRU l1 3 baz) 4 new+	, removeLRU l4 3 == addLRU l2 4 new+	, removeLRU l4 1 == addLRU l3no1 4 new+	]+  where+	l1 = addLRU emptyLRU (1 :: Int) foo+	l2 = addLRU l1 2 bar+	l3 = addLRU l2 3 baz+	l4 = addLRU l3 4 new+	l2no1 = addLRU emptyLRU 2 bar+	l3no1 = addLRU l2no1 3 baz+	foo = "foo"+	bar = "bar"+	baz = "baz"+	new = "new"
Utility/Metered.hs view
@@ -1,6 +1,6 @@ {- Metered IO and actions  -- - Copyright 2012-2024 Joey Hess <id@joeyh.name>+ - Copyright 2012-2026 Joey Hess <id@joeyh.name>  -  - License: BSD-2-clause  -}@@ -26,6 +26,7 @@ 	hGetContentsMetered, 	hGetMetered, 	defaultChunkSize,+	watchSizeWith, 	watchFileSize, 	OutputHandler(..), 	ProgressParser,@@ -42,6 +43,7 @@ 	mkMeter, 	setMeterTotalSize, 	updateMeter,+	dontDisplayMeter, 	displayMeterHandle, 	clearMeterHandle, 	bandwidthMeter,@@ -213,26 +215,13 @@ 	k = 1024 	chunkOverhead = 2 * sizeOf (1 :: Int) -- GHC specific -{- Runs an action, watching a file as it grows and updating the meter.- -- - The file may already exist, and the action could throw the original file- - away and start over. To avoid reporting the original file size followed- - by a smaller size in that case, wait until the file starts growing- - before updating the meter for the first time.- -- - An updated version of the MeterUpdate is passed to the action, and the- - action should use that for any updates that it makes. This allows for- - eg, the action updating the meter before a write is flushed to the file.- - In that situation, this avoids the meter being set back to the size of- - the file when it's gotten ahead of that point.- -}-watchFileSize+watchSizeWith 	:: (MonadIO m, MonadMask m)-	=> OsPath+	=> IO BytesProcessed 	-> MeterUpdate 	-> (MeterUpdate -> m a) 	-> m a-watchFileSize f p a = do+watchSizeWith getsize p a = do 	sizevar <- liftIO $ newMVar zeroBytesProcessed 	bracket  		(liftIO $ forkIO $ watcher (meterupdate sizevar True) =<< getsz)@@ -245,8 +234,8 @@ 		when (sz > oldsz) $ 			p' sz 		watcher p' sz-	getsz = catchDefaultIO zeroBytesProcessed $-		toBytesProcessed <$> getFileSize f+	+	getsz = catchDefaultIO zeroBytesProcessed getsize  	meterupdate sizevar preventbacktracking n 		| preventbacktracking = do@@ -261,6 +250,27 @@ 			putMVar sizevar n 			p n +{- Runs an action, watching a file as it grows and updating the meter.+ -+ - The file may already exist, and the action could throw the original file+ - away and start over. To avoid reporting the original file size followed+ - by a smaller size in that case, wait until the file starts growing+ - before updating the meter for the first time.+ -+ - An updated version of the MeterUpdate is passed to the action, and the+ - action should use that for any updates that it makes. This allows for+ - eg, the action updating the meter before a write is flushed to the file.+ - In that situation, this avoids the meter being set back to the size of+ - the file when it's gotten ahead of that point.+ -}+watchFileSize+	:: (MonadIO m, MonadMask m)+	=> OsPath+	-> MeterUpdate+	-> (MeterUpdate -> m a)+	-> m a+watchFileSize f = watchSizeWith (toBytesProcessed <$> getFileSize f)+ data OutputHandler = OutputHandler 	{ quietMode :: Bool 	, stderrHandler :: String -> IO ()@@ -486,6 +496,10 @@ 	when (meterBytesProcessed oldms /= new) $ do 		totalsize <- readMVar totalsizev 		displaymeter bv totalsize oldms curms++-- | Don't display a meter.+dontDisplayMeter :: DisplayMeter+dontDisplayMeter _ _ _ _ = return ()  -- | Display meter to a Handle. displayMeterHandle :: Handle -> RenderMeter -> DisplayMeter
Utility/SimpleProtocol.hs view
@@ -29,7 +29,6 @@ 	getProtocolLine, ) where -import Data.Char import GHC.IO.Handle import Text.Read @@ -132,7 +131,7 @@ 	(p4, p5) = splitWord rest''  splitWord :: String -> (String, String)-splitWord = separate isSpace+splitWord = separate (== ' ')  {- Only safe to use when the serialization does not include whitespace. -} parseList :: Serializable p => ([p] -> a) -> Parser a
+ cabal-stackage.config view
@@ -0,0 +1,3453 @@+-- NOTE: Due to revisions, this file may not work. See:+-- https://github.com/commercialhaskell/stackage-server/issues/232++-- Stackage snapshot from: http://www.stackage.org/snapshot/lts-24.52+-- Please place this file next to your .cabal file as cabal.config+-- To only use tested packages, uncomment the following line:+-- remote-repo: stackage-lts-24.52:http://www.stackage.org/lts-24.52++-- Modified to have newer file-io and aws.+with-compiler: ghc-9.10.3+constraints: abstract-deque ==0.3,+             abstract-deque-tests ==0.3,+             abstract-par ==0.3.3,+             AC-Angle ==1.0,+             acc ==0.2.0.4,+             ace ==0.6,+             acid-state ==0.16.1.4,+             action-permutations ==0.0.0.1,+             active ==0.2.1.1,+             ad ==4.5.6,+             ad-delcont ==0.5.0.0,+             adjunctions ==4.4.4,+             adler32 ==0.1.2.0,+             advent-of-code-api ==0.2.11.0,+             aern2-mp ==0.2.16.1,+             aern2-real ==0.2.16.1,+             aeson ==2.2.5.0,+             aeson-attoparsec ==0.0.0,+             aeson-better-errors ==0.9.1.4,+             AesonBson ==0.4.1,+             aeson-casing ==0.2.0.0,+             aeson-combinators ==0.1.2.2,+             aeson-diff ==1.1.0.15,+             aeson-gadt-th ==0.2.5.4,+             aeson-generic-compat ==0.0.2.0,+             aeson-jsonpath ==0.3.0.2,+             aeson-pretty ==0.8.11,+             aeson-qq ==0.8.4,+             aeson-schemas ==1.4.3.1,+             aeson-typescript ==0.6.4.0,+             aeson-unqualified-ast ==1.0.0.3,+             aeson-value-parser ==0.19.7.2,+             aeson-warning-parser ==0.1.1,+             aeson-yak ==0.1.1.3,+             aeson-yaml ==1.1.0.1,+             aftovolio ==0.8.0.0,+             Agda ==2.8.0,+             agda2lagda ==0.2023.6.9,+             agreeing ==0.2.2.0,+             alarmclock ==0.7.0.7,+             alex ==3.5.4.2,+             alex-meta ==0.3.0.13,+             alex-tools ==0.6.1,+             alfred-margaret ==2.1.0.2,+             algebra ==4.3.1,+             algebraic-graphs ==0.7,+             align-audio ==0.0.0.2,+             Allure ==0.11.0.0,+             almost-fix ==0.0.2,+             alsa-core ==0.5.0.1,+             alsa-mixer ==0.3.0.1,+             alsa-pcm ==0.6.1.2,+             alsa-seq ==0.6.0.10,+             alternative-vector ==0.0.0,+             alternators ==1.0.0.0,+             ALUT ==2.4.0.3,+             amqp ==0.24.0,+             amqp-utils ==0.6.8.0,+             annotated-exception ==0.3.0.4,+             annotated-wl-pprint ==0.7.0,+             ansigraph ==0.3.0.5,+             ansi-terminal ==1.1.5,+             ansi-terminal-game ==1.9.4.0,+             ansi-terminal-types ==1.1.3,+             ansi-wl-pprint ==1.0.2,+             ANum ==0.2.0.4,+             aos-signature ==0.1.1,+             apecs ==0.9.6,+             apecs-gloss ==0.2.4,+             apecs-physics ==0.4.6,+             api-field-json-th ==0.1.0.2,+             ap-normalize ==0.1.0.1,+             appar ==0.1.8,+             appendful ==0.1.0.0,+             appendful-persistent ==0.1.0.1,+             appendmap ==0.1.5,+             apply-merge ==0.1.1.0,+             apportionment ==0.0.0.4,+             approximate ==0.3.5,+             approximate-equality ==1.1.0.2,+             arithmoi ==0.13.4.0,+             array installed,+             array-chunks ==0.1.4.2,+             array-memoize ==0.6.0,+             arrow-extras ==0.1.0.1,+             arrows ==0.4.4.2,+             ascii-char ==1.0.1.0,+             ascii-progress ==0.3.3.0,+             asn1-encoding ==0.9.6,+             asn1-parse ==0.9.5,+             asn1-types ==0.3.4,+             assert-failure ==0.1.3.0,+             assignment ==0.0.1.0,+             assoc ==1.1.1,+             astro ==0.4.3.0,+             async ==2.2.6,+             async-extra ==0.2.0.0,+             async-pool ==0.9.2,+             async-refresh ==0.3.0.0,+             async-refresh-tokens ==0.4.0.0,+             atom-basic ==0.2.5,+             atom-conduit ==0.9.0.2,+             atomic-counter ==0.1.2.4,+             atomic-primops ==0.8.8,+             atomic-write ==0.2.1.1,+             attoparsec ==0.14.4,+             attoparsec-aeson ==2.2.2.0,+             attoparsec-base64 ==0.0.0,+             attoparsec-binary ==0.2,+             attoparsec-data ==1.0.5.4,+             attoparsec-expr ==0.1.1.2,+             attoparsec-framer ==0.1.0.11,+             attoparsec-iso8601 ==1.1.1.0,+             attoparsec-path ==0.0.0.1,+             attoparsec-time ==1.0.3.1,+             attoparsec-uri ==0.0.9,+             audacity ==0.0.2.4,+             authenticate ==1.3.5.2,+             authenticate-oauth ==1.7,+             autodocodec ==0.5.0.0,+             autodocodec-nix ==0.1.0.0,+             autodocodec-openapi3 ==0.3.0.1,+             autodocodec-schema ==0.2.0.1,+             autodocodec-servant-multipart ==0.0.0.2,+             autodocodec-swagger2 ==0.1.0.0,+             autodocodec-yaml ==0.4.0.2,+             autoexporter ==2.0.0.17,+             automaton ==1.5,+             auto-update ==0.2.6,+             avro ==0.6.2.1,+             aws ==0.25.2,+             aws-lambda-haskell-runtime ==4.3.2,+             aws-lambda-haskell-runtime-wai ==2.0.2,+             aws-sns-verify ==0.0.0.3,+             aws-xray-client ==0.1.0.2,+             aws-xray-client-persistent ==0.1.0.5,+             aws-xray-client-wai ==0.1.0.2,+             backprop ==0.2.7.2,+             backtracking ==0.1.0,+             bank-holiday-germany ==2.1.0.2,+             bank-holidays-england ==0.2.0.11,+             barbies ==2.1.1.0,+             base installed,+             base16 ==1.0,+             base16-bytestring ==1.0.2.0,+             base32 ==0.4,+             base32string ==0.9.1,+             base58-bytestring ==0.1.0,+             base58string ==0.10.0,+             base64 ==1.0,+             base64-bytestring ==1.2.1.0,+             base64-bytestring-type ==1.0.1,+             base64-string ==0.2,+             base-compat ==0.14.1,+             base-compat-batteries ==0.14.1,+             basement ==0.0.16,+             base-orphans ==0.9.4,+             base-prelude ==1.6.1.1,+             base-unicode-symbols ==0.2.4.2,+             basic-prelude ==0.7.0,+             battleship-combinatorics ==0.0.1.2,+             bazel-runfiles ==0.12,+             bbdb ==0.8,+             bcp47 ==0.3.0.0,+             bcp47-orphans ==0.1.3.0,+             bcrypt ==0.0.11,+             beam-core ==0.10.5.0,+             beam-migrate ==0.5.5.0,+             beam-postgres ==0.5.6.1,+             bech32 ==1.1.11,+             bech32-th ==1.1.11,+             bench ==1.0.13,+             benchpress ==0.2.3.0,+             bench-show ==0.3.2,+             bencode ==0.6.1.1,+             bencoding ==0.4.5.6,+             benri-hspec ==0.1.0.3,+             between ==0.11.0.0,+             bhoogle ==0.1.4.4,+             bibtex ==0.1.0.7,+             bifunctor-classes-compat ==0.1.1,+             bifunctors ==5.6.3,+             bimap ==0.5.0,+             bimaps ==0.1.0.2,+             bin ==0.1.4.1,+             binance-exports ==0.1.2.0,+             binary installed,+             binary-conduit ==1.3.1,+             binaryen ==0.0.6.0,+             binary-generic-combinators ==0.4.4.1,+             binary-ieee754 ==0.1.0.0,+             binary-instances ==1.0.6,+             binary-list ==1.1.1.2,+             binary-orphans ==1.0.6,+             binary-parser ==0.5.7.7,+             binary-parsers ==0.2.4.0,+             binary-search ==2.0.0,+             binary-shared ==0.8.3,+             bindings-DSL ==1.0.25,+             bindings-GLFW ==3.3.9.3,+             bindings-libzip ==1.0.1,+             bindings-uname ==0.1,+             BiobaseNewick ==0.0.0.2,+             bitarray ==0.0.1.1,+             bits ==0.6,+             bitset-word8 ==0.1.1.2,+             bits-extra ==0.0.2.3,+             bitvec ==1.1.6.0,+             bitwise ==1.0.0.1,+             bitwise-enum ==1.0.2.0,+             Blammo ==2.1.4.0,+             blank-canvas ==0.7.5,+             blas-carray ==0.1.0.2,+             blas-comfort-array ==0.0.0.4,+             blas-ffi ==0.1,+             blas-hs ==0.1.1.0,+             blaze-bootstrap ==0.1.0.1,+             blaze-builder ==0.4.4.1,+             blaze-colonnade ==1.2.3.0,+             blaze-html ==0.9.2.0,+             blaze-markup ==0.8.3.0,+             blaze-svg ==0.3.7,+             blaze-textual ==0.2.3.1,+             bloodhound ==0.23.0.1,+             bloomfilter ==2.0.1.3,+             bluefin ==0.0.17.1,+             bluefin-internal ==0.1.2.0,+             bm ==0.2.0.0,+             bmp ==1.2.6.4,+             bnb-staking-csvs ==0.2.2.0,+             BNFC ==2.9.6.3,+             BNFC-meta ==0.6.1,+             board-games ==0.4.0.3,+             bodhi ==0.1.0,+             boltzmann-samplers ==0.1.1.0,+             Boolean ==0.2.4,+             boolsimplifier ==0.1.8,+             boomwhacker ==0.0.2.1,+             bordacount ==0.1.0.0,+             boring ==0.2.2.1,+             bound ==2.0.7,+             BoundedChan ==1.0.3.0,+             bounded-qsem ==0.1.0.5,+             bounded-queue ==1.0.0,+             boundingboxes ==0.2.3,+             bower-json ==1.1.0.0,+             bowtie ==0.7.0,+             box ==0.9.4.0,+             boxes ==0.1.5,+             box-socket ==0.5.3.0,+             breakpoint ==0.1.5.1,+             brick ==2.9,+             brotli ==0.0.0.3,+             brotli-streams ==0.0.0.0,+             bsb-http-chunked ==0.0.0.4,+             bson ==0.4.0.1,+             bson-lens ==0.1.1,+             btrfs ==0.2.1.0,+             buffer-pipe ==0.0,+             bugsnag ==1.2.0.2,+             bugsnag-hs ==0.2.0.13,+             bugsnag-wai ==1.0.1.2,+             bugsnag-yesod ==1.0.1.0,+             bugzilla-redhat ==1.0.1.1,+             burrito ==2.0.1.17,+             butcher ==1.3.3.2,+             bv ==0.5,+             bv-sized ==1.0.7,+             byteable ==0.1.1,+             bytebuild ==0.3.17.0,+             byte-count-reader ==0.10.1.12,+             bytedump ==1.0,+             bytehash ==0.1.1.2,+             byte-order ==0.1.3.1,+             byteorder ==1.0.4,+             bytes ==0.17.5,+             byteset ==0.1.1.2,+             byteslice ==0.2.15.0,+             bytesmith ==0.3.14.0,+             bytestring installed,+             bytestring-aeson-orphans ==0.1.0.2,+             bytestring-builder ==0.10.8.2.0,+             bytestring-conversion ==0.3.2,+             bytestring-encodings ==0.2.0.2,+             bytestring-lexing ==0.5.0.15,+             bytestring-strict-builder ==0.4.5.8,+             bytestring-to-vector ==0.3.0.1,+             bytestring-tree-builder ==0.2.7.13,+             bytestring-trie ==0.2.7.6,+             bytezap ==1.6.0,+             bz2 ==1.0.1.2,+             bzip2-clib ==1.0.8,+             bzlib ==0.5.3.0,+             bzlib-conduit ==0.3.0.4,+             c14n ==0.1.0.3,+             c2hs ==0.28.8,+             Cabal installed,+             cabal2nix ==2.20.1,+             cabal2spec ==2.7.1,+             cabal-add ==0.2,+             cabal-appimage ==0.4.3.0,+             cabal-clean ==0.2.20230609,+             cabal-debian ==5.2.6,+             cabal-doctest ==1.0.12,+             cabal-file ==0.1.1,+             cabal-flatpak ==0.1.3,+             cabal-gild ==1.6.0.4,+             cabal-install ==3.12.1.0,+             cabal-install-parsers ==0.6.2,+             cabal-install-solver ==3.12.1.0,+             cabal-plan ==0.7.6.1,+             cabal-rpm ==2.3.0,+             cabal-sort ==0.1.2.1,+             Cabal-syntax installed,+             cache ==0.1.3.0,+             cached-json-file ==0.1.1,+             cacophony ==0.11.0,+             cairo ==0.13.12.0,+             cairo-image ==0.1.0.6,+             calendar-recycling ==0.0.0.1,+             call-alloy ==0.6.0.3,+             calligraphy ==0.1.8,+             call-plantuml ==0.0.1.3,+             call-stack ==0.4.0,+             can-i-haz ==0.3.1.1,+             capability ==0.5.0.1,+             ca-province-codes ==1.0.0.0,+             cardano-coin-selection ==1.0.1,+             carray ==0.1.6.8,+             casa-client ==0.0.4,+             casa-types ==0.0.3,+             cased ==0.1.0.0,+             case-insensitive ==1.2.1.0,+             cases ==0.1.4.5,+             casing ==0.1.4.1,+             cassava ==0.5.4.1,+             cassava-conduit ==0.6.6,+             cassava-megaparsec ==2.1.1,+             cast ==0.1.0.2,+             caster ==0.0.3.0,+             cauldron ==0.9.0.1,+             cayley-client ==0.4.19.5,+             cborg ==0.2.10.0,+             cborg-json ==0.2.6.0,+             cdar-mBound ==0.1.0.4,+             c-enum ==0.1.1.3,+             cereal ==0.5.8.3,+             cereal-conduit ==0.8.0,+             cereal-text ==0.1.0.2,+             cereal-unordered-containers ==0.1.0.1,+             cereal-vector ==0.2.0.1,+             cfenv ==0.1.0.0,+             cgi ==3001.5.1.0,+             chan ==0.0.4.1,+             ChannelT ==0.0.0.7,+             character-cases ==0.1.0.6,+             character-ps ==0.1,+             charset ==0.3.12,+             charsetdetect-ae ==1.1.0.4,+             Chart ==1.9.5,+             Chart-cairo ==1.9.4.1,+             Chart-diagrams ==1.9.5.1,+             chart-svg ==0.8.3.2,+             ChasingBottoms ==1.3.1.17,+             check-email ==1.0.2,+             checkers ==0.6.0,+             checksum ==0.0.0.1,+             chell ==0.5.0.2,+             chell-hunit ==0.3.0.2,+             chimera ==0.4.1.0,+             choice ==0.2.4.2,+             chronologique ==0.3.1.3,+             chronos ==1.1.7.0,+             chunked-data ==0.3.1,+             cipher-aes ==0.2.11,+             cipher-camellia ==0.0.2,+             cipher-rc4 ==0.1.4,+             circle-packing ==0.1.0.6,+             circular ==0.4.0.3,+             citeproc ==0.9.0.1,+             clash-ghc ==1.8.5,+             clash-lib ==1.8.5,+             clash-prelude ==1.8.5,+             clash-prelude-hedgehog ==1.8.5,+             classy-prelude ==1.5.0.3,+             classy-prelude-conduit ==1.5.0,+             classy-prelude-yesod ==1.5.0,+             clay ==0.16.1,+             cli-arguments ==0.7.0.0,+             clientsession ==0.9.3.0,+             Clipboard ==2.3.2.2,+             clock ==0.8.4,+             closed ==0.2.1.0,+             clumpiness ==0.17.0.2,+             ClustalParser ==1.3.0,+             cmark ==0.6.1,+             cmark-gfm ==0.2.6,+             cmark-lucid ==0.1.0.0,+             cmdargs ==0.10.22,+             codec-beam ==0.2.0,+             code-conjure ==0.7.8,+             code-page ==0.2.1,+             coinor-clp ==0.0.0.2,+             cointracking-imports ==0.1.0.2,+             collect-errors ==0.1.6.0,+             co-log ==0.7.0.0,+             co-log-concurrent ==0.5.1.1,+             co-log-core ==0.3.2.7,+             co-log-polysemy ==0.0.1.6,+             colonnade ==1.2.0.2,+             Color ==0.4.1,+             colorful-monoids ==0.2.1.3,+             colorize-haskell ==1.0.1,+             colour ==2.3.7,+             colourista ==0.1.0.2,+             columnar ==1.0.0.0,+             combinatorial ==0.1.1,+             comfort-array ==0.5.5,+             comfort-array-shape ==0.0,+             comfort-blas ==0.0.3.1,+             comfort-fftw ==0.0.0.1,+             comfort-glpk ==0.1,+             comfort-graph ==0.0.5.1,+             commonmark ==0.2.6.1,+             commonmark-extensions ==0.2.7.1,+             commonmark-pandoc ==0.2.3,+             commutative ==0.0.2,+             commutative-semigroups ==0.2.0.2,+             comonad ==5.0.10,+             compact ==0.2.0.0,+             compactmap ==0.1.4.6,+             companion ==0.1.0,+             compensated ==0.8.3,+             compiler-warnings ==0.1.0,+             componentm ==0.0.0.2,+             componentm-devel ==0.0.0.2,+             composable-associations ==0.1.0.0,+             composition ==1.0.2.2,+             composition-extra ==2.1.0,+             composition-prelude ==3.0.1.0,+             concise ==0.1.0.1,+             concurrency ==1.11.0.3,+             concurrent-extra ==0.7.0.12,+             concurrent-output ==1.10.21,+             concurrent-split ==0.0.1.1,+             concurrent-supply ==0.1.8,+             cond ==0.5.1,+             conduino ==0.2.4.0,+             conduit ==1.3.6.1,+             conduit-aeson ==0.1.1.0,+             conduit-algorithms ==0.0.14.0,+             conduit-combinators ==1.3.0,+             conduit-concurrent-map ==0.1.4,+             conduit-extra ==1.3.8,+             conduit-parse ==0.2.1.1,+             conduit-zstd ==0.0.2.0,+             config-ini ==0.2.7.0,+             configuration-tools ==0.7.1,+             configurator ==0.3.0.0,+             configurator-export ==0.1.0.1,+             config-value ==0.8.3,+             constrained-categories ==0.4.2.0,+             constraints ==0.14.4,+             constraints-extras ==0.4.0.2,+             constraint-tuples ==0.2,+             construct ==0.3.2,+             consumers ==2.3.3.1,+             containers installed,+             context ==0.2.1.1,+             context-http-client ==0.2.0.2,+             context-resource ==0.2.0.2,+             context-wai-middleware ==0.2.0.2,+             contiguous ==0.6.5.0,+             contra-tracer ==0.2.1.1,+             contravariant ==1.5.6,+             contravariant-extras ==0.3.5.4,+             control-bool ==0.2.1,+             control-dsl ==0.2.1.3,+             control-monad-free ==0.6.2,+             control-monad-omega ==0.3.4,+             convertible ==1.1.1.1,+             cookie ==0.5.1,+             copilot ==4.5.1,+             copilot-c99 ==4.5.1,+             copilot-core ==4.5.1,+             copilot-interpreter ==4.5.1,+             copilot-language ==4.5.1,+             copilot-libraries ==4.5.1,+             copilot-prettyprinter ==4.5.1,+             copilot-theorem ==4.5.1,+             copr-api ==0.2.0,+             core-data ==0.3.9.1,+             core-program ==0.7.0.0,+             core-telemetry ==0.2.9.4,+             core-text ==0.3.8.1,+             countable ==1.2,+             countdown-numbers-game ==0.0.0.1,+             country ==0.2.5.0,+             covariance ==0.2.0.1,+             cpphs ==1.20.10,+             cpu ==0.1.2,+             cpuinfo ==0.1.0.3,+             cql ==4.0.4,+             cql-io ==1.1.1,+             crackNum ==3.15,+             crc32c ==0.2.2,+             crdt-event-fold ==1.8.1.4,+             criterion ==1.6.4.0,+             criterion-measurement ==0.2.5.0,+             cron ==0.7.2,+             crypto-api ==0.13.3,+             crypto-api-tests ==0.3,+             crypto-cipher-tests ==0.0.11,+             crypto-cipher-types ==0.0.9,+             cryptocompare ==0.1.2,+             cryptohash ==0.11.9,+             cryptohash-cryptoapi ==0.1.4,+             cryptohash-md5 ==0.11.101.0,+             cryptohash-sha1 ==0.11.101.0,+             cryptohash-sha256 ==0.11.102.1,+             cryptohash-sha512 ==0.11.103.0,+             crypton ==1.0.6,+             crypton-conduit ==0.2.3,+             crypton-connection ==0.4.5,+             cryptonite ==0.30,+             cryptonite-conduit ==0.2.2,+             cryptonite-openssl ==0.7,+             crypton-pem ==0.3.0,+             crypton-socks ==0.6.2,+             crypton-x509 ==1.7.7,+             crypton-x509-store ==1.6.14,+             crypton-x509-system ==1.6.8,+             crypton-x509-validation ==1.6.14,+             crypto-pubkey-types ==0.4.3,+             crypto-random-api ==0.2.0,+             crypto-token ==0.1.2,+             csp ==1.4.0,+             css-syntax ==0.1.0.2,+             css-text ==0.1.3.0,+             c-struct ==0.1.3.0,+             csv ==0.1.2,+             csv-conduit ==1.0.1.1,+             ctrie ==0.2,+             cubicbezier ==0.6.0.7,+             cubicspline ==0.1.2,+             cue-sheet ==2.0.2,+             curl ==1.3.8,+             currency ==0.2.0.0,+             currycarbon ==0.4.0.1,+             cursor ==0.3.2.0,+             cursor-brick ==0.1.0.1,+             cursor-fuzzy-time ==0.1.0.0,+             cursor-gen ==0.4.0.0,+             cutter ==0.0,+             cyclotomic ==1.1.2,+             czipwith ==1.0.1.4,+             daemons ==0.4.0,+             data-accessor ==0.2.3.1,+             data-accessor-mtl ==0.2.0.5,+             data-accessor-transformers ==0.2.1.8,+             data-array-byte ==0.1.0.2,+             data-binary-ieee754 ==0.4.4,+             data-bword ==0.1.0.2,+             data-checked ==0.3,+             data-clist ==0.2,+             data-compat ==0.1.0.5,+             data-default ==0.8.0.2,+             data-default-class ==0.2.0.0,+             data-diverse ==4.7.1.0,+             data-dword ==0.3.2.1,+             data-effects ==0.4.2.0,+             data-effects-core ==0.4.3.0,+             data-effects-th ==0.4.2.1,+             data-endian ==0.1.1,+             data-findcycle ==0.1.2.0,+             data-fix ==0.3.4,+             data-functor-logistic ==0.0,+             data-has ==0.4.0.0,+             data-hash ==0.2.0.1,+             data-interval ==2.1.2,+             data-inttrie ==0.1.4,+             data-lens-light ==0.1.2.4,+             data-memocombinators ==0.5.1,+             data-msgpack ==0.0.13,+             data-msgpack-types ==0.0.3,+             data-or ==1.0.0.12,+             data-ordlist ==0.4.7.0,+             data-prometheus ==0.1.0.0,+             data-ref ==0.1,+             data-reify ==0.6.4,+             data-serializer ==0.3.5,+             data-sketches ==0.3.1.0,+             data-sketches-core ==0.1.0.0,+             data-textual ==0.3.0.3,+             dataurl ==0.1.0.0,+             DAV ==1.3.4,+             dbcleaner ==0.1.3,+             dbus ==1.4.3,+             dbus-hslogger ==0.1.1.1,+             debian ==4.0.5,+             debian-build ==0.10.2.1,+             debug-trace-var ==0.2.0,+             dec ==0.0.6,+             decidable ==0.3.1.1,+             Decimal ==0.5.2,+             declarative ==0.5.4,+             deepseq installed,+             deepseq-generics ==0.2.0.1,+             deferred-folds ==0.9.18.10,+             defun-core ==0.1.0.1,+             dejafu ==2.4.0.8,+             delta-types ==1.0.0.0,+             dense-linear-algebra ==0.1.0.0,+             dependent-map ==0.4.0.1,+             dependent-monoidal-map ==0.1.1.5,+             dependent-sum ==0.7.2.0,+             dependent-sum-aeson-orphans ==0.3.1.2,+             dependent-sum-template ==0.2.0.2,+             depq ==0.4.2,+             deque ==0.4.4.2,+             deriveJsonNoPrefix ==0.1.0.1,+             derive-storable ==0.3.1.0,+             derive-topdown ==0.1.1.1,+             deriving-aeson ==0.2.10,+             deriving-compat ==0.6.8,+             deriving-trans ==0.9.1.0,+             detour-via-sci ==1.0.0,+             df1 ==0.4.3,+             dhall ==1.42.3,+             di ==1.3,+             diagrams ==1.4.2,+             diagrams-braille ==0.1.2,+             diagrams-builder ==0.8.0.6,+             diagrams-cairo ==1.5,+             diagrams-canvas ==1.4.2,+             diagrams-contrib ==1.4.6,+             diagrams-core ==1.5.1.2,+             diagrams-gtk ==1.4,+             diagrams-lib ==1.5.1,+             diagrams-postscript ==1.5.3,+             diagrams-rasterific ==1.5,+             diagrams-solve ==0.1.3.1,+             diagrams-svg ==1.5,+             dice ==0.1.1,+             di-core ==1.0.4,+             dictionary-sharing ==0.1.0.0,+             di-df1 ==1.2.1,+             Diff ==1.0.2,+             diff-loc ==0.1.0.0,+             digest ==0.0.2.1,+             digits ==0.3.2,+             digraph ==0.3.2,+             di-handle ==1.0.1,+             dimensional ==1.6.2,+             di-monad ==1.3.5,+             directory installed,+             directory-ospath-streaming ==0.2.2,+             directory-tree ==0.12.1,+             direct-sqlite ==2.3.29,+             dirichlet ==0.1.0.7,+             discount ==0.1.1,+             discover-instances ==0.1.0.0,+             discrimination ==0.5,+             disk-free-space ==0.1.0.1,+             distributed-closure ==0.5.0.0,+             distributed-process ==0.7.8,+             distributed-process-async ==0.2.11,+             distributed-process-client-server ==0.2.8.0,+             distributed-process-execution ==0.1.5.0,+             distributed-process-extras ==0.3.9,+             distributed-process-monad-control ==0.5.1.3,+             distributed-process-simplelocalnet ==0.3.3,+             distributed-process-supervisor ==0.2.4,+             distributed-process-systest ==0.4.2,+             distributed-process-tests ==0.5.2,+             distributed-static ==0.3.11,+             distribution-nixpkgs ==1.7.1.1,+             distribution-opensuse ==1.1.4,+             distributive ==0.6.3,+             djinn-lib ==0.0.1.4,+             djot ==0.1.4.1,+             dl-fedora ==2.0.1,+             dlist ==1.0,+             dlist-instances ==0.1.1.1,+             dns ==4.2.0,+             dobutokO2 ==0.45.3.0,+             dockerfile ==0.2.0,+             doclayout ==0.5.0.3,+             docopt ==0.7.0.8,+             doctemplates ==0.11.0.1,+             doctest ==0.24.3,+             doctest-discover ==0.2.0.0,+             doctest-driver-gen ==0.3.0.8,+             doctest-exitcode-stdio ==0.0.0.1,+             doctest-extract ==0.1.2,+             doctest-lib ==0.1.1.1,+             doctest-parallel ==0.4.1,+             doldol ==0.4.1.2,+             do-list ==1.0.1,+             domain ==0.1.1.5,+             domain-aeson ==0.1.1.3,+             domain-cereal ==0.1.0.1,+             domain-core ==0.1.0.4,+             domain-optics ==0.1.0.4,+             do-notation ==0.1.0.2,+             dot ==0.3,+             dotgen ==0.4.3,+             dotnet-timespan ==0.0.1.0,+             dotparse ==0.1.4.0,+             double-conversion ==2.0.5.0,+             download ==0.3.2.7,+             download-curl ==0.1.4,+             DPutils ==0.1.1.0,+             drifter ==0.3.0,+             drifter-postgresql ==0.2.1,+             drifter-sqlite ==0.1.0.0,+             dsp ==0.2.5.2,+             dual-tree ==0.2.3.4,+             dublincore-xml-conduit ==0.1.0.3,+             dunai ==0.14.1,+             duration ==0.2.0.0,+             dynamic-state ==0.3.2,+             dyre ==0.9.2,+             eap ==0.9.0.2,+             Earley ==0.13.0.1,+             easy-file ==0.2.5,+             easy-logger ==0.1.0.7,+             easyplot ==1.0,+             Ebnf2ps ==1.0.15,+             ech-config ==0.0.1,+             echo ==0.1.4,+             ecstasy ==0.2.1.0,+             ed25519 ==0.0.5.0,+             ede ==0.3.4.0,+             edit-distance ==0.2.2.1,+             edit-distance-vector ==1.0.0.4,+             editor-open ==0.6.0.0,+             effectful ==2.6.1.0,+             effectful-core ==2.6.1.0,+             effectful-plugin ==2.0.0.1,+             effectful-th ==1.0.0.3,+             egison-pattern-src ==0.2.1.2,+             either ==5.0.3,+             either-unwrap ==1.1,+             ekg ==0.4.1.2,+             ekg-core ==0.1.2.0,+             ekg-json ==0.1.1.1,+             ekg-statsd ==0.2.6.2,+             ekg-wai ==0.1.2.0,+             elerea ==2.9.0,+             elf ==0.31,+             eliminators ==0.9.5,+             elm2nix ==0.4.0,+             elm-bridge ==0.8.5,+             elm-core-sources ==1.0.0,+             elm-export ==0.6.0.1,+             elm-syntax ==0.3.3.0,+             elynx ==0.8.0.0,+             elynx-markov ==0.8.0.0,+             elynx-nexus ==0.8.0.0,+             elynx-seq ==0.8.0.0,+             elynx-tools ==0.8.0.0,+             elynx-tree ==0.7.2.2,+             emacs-module ==0.2.1.1,+             email-validate ==2.3.2.21,+             emd ==0.2.0.0,+             emojis ==0.1.5,+             enclosed-exceptions ==1.0.3,+             encoding ==0.10.3,+             end-of-exe ==0.1.2.0,+             ENIG ==0.0.1.0,+             entropy ==0.4.1.11,+             enummapset ==0.7.3.0,+             enumset ==0.1.0.2,+             enum-subset-generate ==0.1.0.3,+             enum-text ==0.5.3.0,+             envelope ==0.2.2.0,+             envparse ==0.6.0,+             envy ==2.1.5.0,+             epub-metadata ==5.4,+             eq ==4.3,+             equal-files ==0.0.5.4,+             equational-reasoning ==0.7.1.0,+             equivalence ==0.4.1.1,+             erf ==2.0.0.0,+             errata ==0.4.0.3,+             error ==1.0.0.0,+             errorcall-eq-instance ==0.3.0,+             error-or ==0.3.0,+             error-or-utils ==0.2.0,+             errors ==2.3.0,+             errors-ext ==0.4.2,+             ersatz ==0.6,+             esqueleto ==3.6.0.0,+             essence-of-live-coding ==0.2.9,+             essence-of-live-coding-gloss ==0.2.9,+             essence-of-live-coding-pulse ==0.2.9,+             essence-of-live-coding-quickcheck ==0.2.9,+             essence-of-live-coding-warp ==0.2.9,+             event-list ==0.1.3,+             every ==0.0.1,+             evm-opcodes ==0.2.0,+             exact-combinatorics ==0.2.0.11,+             exact-pi ==0.5.1.0,+             exception-hierarchy ==0.1.0.14,+             exception-mtl ==0.4.0.2,+             exceptions installed,+             exception-transformers ==0.4.0.12,+             executable-hash ==0.2.0.4,+             executable-path ==0.0.3.1,+             exinst ==0.9,+             exit-codes ==1.0.0,+             exomizer ==1.0.0,+             exon ==1.7.3.0,+             expiring-cache-map ==0.0.6.1,+             explicit-exception ==0.2.0.2,+             exp-pairs ==0.2.1.1,+             express ==1.0.18,+             extended-reals ==0.2.7.0,+             extensible-exceptions ==0.1.1.4,+             extra ==1.8.1,+             extractable-singleton ==0.0.1,+             extra-data-yj ==0.1.0.0,+             extrapolate ==0.4.6,+             fail ==4.9.0.0,+             FailT ==0.1.2.0,+             fakedata ==1.0.5,+             fakedata-parser ==0.1.0.0,+             fakefs ==0.3.0.2,+             fakepull ==0.3.0.2,+             faktory ==1.1.3.2,+             falsify ==0.2.0,+             fast-builder ==0.1.5.0,+             fast-digits ==0.3.2.0,+             fast-logger ==3.2.6,+             fast-math ==1.0.2,+             fast-myers-diff ==0.0.2,+             fcf-family ==0.2.0.3,+             fdo-notify ==0.3.1,+             feature-flags ==0.1.0.1,+             fedora-krb ==0.1.0,+             fedora-releases ==0.3.0,+             fedora-repoquery ==0.7.4,+             feed ==1.3.2.1,+             FenwickTree ==0.1.2.1,+             fft ==0.1.8.7,+             fftw-ffi ==0.1,+             fgl ==5.8.3.1,+             fgl-visualize ==0.1.0.1,+             fields-json ==0.4.0.0,+             filecache ==0.5.3,+             file-embed ==0.0.16.0,+             file-embed-lzma ==0.1,+             file-io ==0.2.0,+             filelock ==0.1.1.9,+             filemanip ==0.3.6.3,+             file-modules ==0.1.2.4,+             filepath installed,+             filepath-bytestring ==1.5.2.0.5,+             file-path-th ==0.1.0.0,+             filepattern ==0.1.3,+             fileplow ==0.1.0.0,+             filter-logger ==0.6.0.0,+             filtrable ==0.1.6.0,+             fin ==0.3.2,+             FindBin ==0.0.5,+             fingertree ==0.1.6.3,+             finite-typelits ==0.2.1.0,+             first-class-families ==0.8.2.0,+             fits-parse ==0.4.2,+             fitspec ==0.4.10,+             fixed ==0.3,+             fixed-generic ==0.1.0.2,+             fixed-length ==0.2.3.1,+             fixed-vector ==2.0.0.0,+             fixed-vector-hetero ==0.7.0.0,+             fix-whitespace ==0.1,+             flac ==0.2.1,+             flac-picture ==0.1.3,+             flags-applicative ==0.1.0.3,+             flat ==0.6,+             flatparse ==0.5.3.1,+             flay ==0.5,+             flexible-defaults ==0.0.3,+             FloatingHex ==0.5,+             floatshow ==0.2.4,+             flow ==2.0.0.11,+             flush-queue ==1.0.0,+             fmlist ==0.9.5,+             fmt ==0.6.3.0,+             fn ==0.3.0.2,+             focus ==1.0.3.2,+             focuslist ==0.1.1.0,+             foldable1-classes-compat ==0.1.3,+             fold-debounce ==0.2.0.17,+             fold-debounce-conduit ==0.2.0.9,+             foldl ==1.4.18,+             folds ==0.7.8,+             FontyFruity ==0.5.3.5,+             force-layout ==0.4.1,+             foreign-store ==0.2.1,+             ForestStructures ==0.0.1.1,+             forkable-monad ==0.2.0.3,+             forma ==1.2.0,+             formatn ==0.3.4.0,+             format-numbers ==0.1.0.1,+             formatting ==7.2.0,+             foundation ==0.0.30,+             free ==5.2,+             free-alacarte ==1.0.0.9,+             free-categories ==0.2.0.2,+             free-foil ==0.2.0,+             freenect ==1.2.1,+             freer-par-monad ==0.1.0.0,+             freetype2 ==0.2.0,+             free-vl ==0.1.4,+             friendly-time ==0.4.1,+             frisby ==0.2.5,+             from-sum ==0.2.3.0,+             frontmatter ==0.1.0.2,+             fsnotify ==0.4.4.0,+             ftp-client ==0.5.1.6,+             funcmp ==1.9,+             function-builder ==0.3.0.1,+             functor-combinators ==0.4.1.4,+             functor-products ==0.1.2.2,+             fused-effects ==1.1.2.7,+             fusion-plugin ==0.2.8,+             fusion-plugin-types ==0.1.0,+             fuzzcheck ==0.1.1,+             fuzzy ==0.1.1.0,+             fuzzy-dates ==0.1.1.2,+             fuzzyset ==0.3.2,+             fuzzystrmatch-pg ==0.1.0.0,+             fuzzy-time ==0.3.0.1,+             gd ==3000.7.3,+             gdp ==0.0.3.0,+             gemini-exports ==0.1.0.2,+             general-games ==1.1.1,+             generic-aeson ==0.2.0.14,+             generically ==0.1.1,+             generic-arbitrary ==1.0.1.2,+             generic-case ==0.1.1.1,+             generic-constraints ==1.1.1.1,+             generic-data ==1.1.0.2,+             generic-data-functions ==0.6.0,+             generic-data-surgery ==0.3.0.0,+             generic-deriving ==1.14.7,+             generic-enumeration ==0.1.0.5,+             generic-functor ==1.1.0.0,+             generic-lens ==2.2.2.0,+             generic-lens-core ==2.2.1.0,+             generic-lexicographic-order ==0.1.0.1,+             generic-monoid ==0.1.0.1,+             generic-optics ==2.2.1.0,+             GenericPretty ==1.2.2,+             generic-random ==1.5.0.1,+             generics-eot ==0.4.1.0,+             generics-sop ==0.5.1.4,+             generics-sop-lens ==0.2.1,+             generic-type-asserts ==0.3.0,+             generic-type-functions ==0.1.0,+             genvalidity ==1.1.1.0,+             genvalidity-aeson ==1.0.0.1,+             genvalidity-appendful ==0.1.0.0,+             genvalidity-bytestring ==1.0.0.1,+             genvalidity-case-insensitive ==0.0.0.1,+             genvalidity-containers ==1.0.0.2,+             genvalidity-criterion ==1.1.0.0,+             genvalidity-hspec ==1.0.0.4,+             genvalidity-hspec-aeson ==1.0.0.0,+             genvalidity-hspec-binary ==1.0.0.0,+             genvalidity-hspec-cereal ==1.0.0.0,+             genvalidity-hspec-hashable ==1.0.0.1,+             genvalidity-hspec-optics ==1.0.0.0,+             genvalidity-hspec-persistent ==1.0.0.0,+             genvalidity-mergeful ==0.3.0.1,+             genvalidity-mergeless ==0.3.0.0,+             genvalidity-network-uri ==0.0.0.0,+             genvalidity-path ==1.0.0.1,+             genvalidity-persistent ==1.0.0.2,+             genvalidity-property ==1.0.0.0,+             genvalidity-scientific ==1.0.0.0,+             genvalidity-sydtest ==1.0.1.0,+             genvalidity-sydtest-aeson ==1.0.0.1,+             genvalidity-sydtest-hashable ==1.0.0.1,+             genvalidity-sydtest-lens ==1.0.0.0,+             genvalidity-sydtest-persistent ==1.0.0.1,+             genvalidity-text ==1.0.0.1,+             genvalidity-time ==1.0.0.1,+             genvalidity-typed-uuid ==0.1.0.1,+             genvalidity-unordered-containers ==1.0.0.1,+             genvalidity-uuid ==1.0.0.1,+             genvalidity-vector ==1.0.0.0,+             geodetics ==1.1.0,+             geoip2 ==0.4.1.3,+             getopt-generics ==0.13.1.0,+             ghc installed,+             ghc-bignum installed,+             ghc-bignum-orphans ==0.1.1,+             ghc-boot installed,+             ghc-boot-th installed,+             ghc-byteorder ==4.11.0.0.10,+             ghc-check ==0.5.0.8,+             ghc-compact ==0.1.0.0,+             ghc-core ==0.5.6,+             ghc-events ==0.20.0.0,+             ghc-exactprint ==1.10.0.0,+             ghc-experimental installed,+             ghc-heap installed,+             ghc-hs-meta ==0.1.5.0,+             ghci4luatex ==0.1.4,+             ghcid ==0.8.9,+             ghci-hexcalc ==0.1.1.0,+             ghc-internal installed,+             ghcjs-codemirror ==0.0.0.2,+             ghcjs-dom ==0.9.9.2,+             ghcjs-dom-jsaddle ==0.9.9.1,+             ghcjs-perch ==0.3.3.3,+             ghc-lib ==9.12.3.20251228,+             ghc-lib-parser ==9.12.3.20251228,+             ghc-lib-parser-ex ==9.12.0.0,+             ghc-parser ==0.2.8.0,+             ghc-paths ==0.1.0.12,+             ghc-prim installed,+             ghc-source-gen ==0.4.7.0,+             ghc-syntax-highlighter ==0.0.13.0,+             ghc-tcplugins-extra ==0.4.6,+             ghc-trace-events ==0.1.2.10,+             ghc-typelits-extra ==0.4.8,+             ghc-typelits-knownnat ==0.7.13,+             ghc-typelits-natnormalise ==0.7.10,+             ghc-typelits-presburger ==0.7.4.2,+             ghost-buster ==0.1.1.0,+             ghostscript-parallel ==0.0.1,+             gi-atk ==2.0.28,+             gi-cairo ==1.0.30,+             gi-cairo-connector ==0.1.1,+             gi-cairo-render ==0.1.2,+             gi-dbusmenu ==0.4.14,+             gi-dbusmenugtk3 ==0.4.16,+             gi-freetype2 ==2.0.5,+             gi-gdk ==4.0.10,+             gi-gdk3 ==3.0.30,+             gi-gdk4 ==4.0.10,+             gi-gdkpixbuf ==2.0.32,+             gi-gdkx11 ==4.0.9,+             gi-gdkx113 ==3.0.17,+             gi-gdkx114 ==4.0.9,+             gi-gio ==2.0.38,+             gi-glib ==2.0.30,+             gi-gmodule ==2.0.6,+             gi-gobject ==2.0.31,+             gi-graphene ==1.0.8,+             gi-gsk ==4.0.9,+             gi-gtk ==4.0.12,+             gi-gtk3 ==3.0.44,+             gi-gtk4 ==4.0.12,+             gi-gtksource ==5.0.2,+             gi-gtksource5 ==5.0.2,+             gi-harfbuzz ==0.0.10,+             gi-javascriptcore ==6.0.5,+             gi-javascriptcore6 ==6.0.5,+             ginger ==0.10.6.0,+             gio ==0.13.12.0,+             gi-pango ==1.0.30,+             gi-soup ==3.0.4,+             gi-soup3 ==3.0.5,+             githash ==0.1.7.0,+             github ==0.30.0.2,+             github-release ==2.0.0.19,+             github-rest ==1.2.1,+             github-types ==0.2.1,+             github-webhooks ==0.18.0,+             gitlab-haskell ==1.1.0.0,+             git-lfs ==1.2.5,+             git-mediate ==1.1.0,+             gitrev ==1.3.1,+             gi-vte ==2.91.35,+             gi-xlib ==2.0.14,+             gl ==0.9.1,+             glabrous ==2.0.6.4,+             glasso ==0.1.0,+             GLFW-b ==3.3.9.1,+             glfw-group ==0.1.0.6,+             glib ==0.13.12.0,+             glib-stopgap ==0.1.0.1,+             Glob ==0.10.2,+             glob-posix ==0.2.0.1,+             gloss ==1.13.2.2,+             gloss-algorithms ==1.13.0.3,+             gloss-rendering ==1.13.2.1,+             glpk-headers ==0.5.1,+             GLURaw ==2.0.0.5,+             GLUT ==2.7.0.16,+             gnuplot ==0.5.7,+             gogol ==1.0.0.0,+             gogol-adexchange-buyer ==1.0.0,+             gogol-adexchange-seller ==1.0.0,+             gogol-admin-datatransfer ==1.0.0,+             gogol-admin-directory ==1.0.0,+             gogol-admin-reports ==1.0.0,+             gogol-adsense ==1.0.0,+             gogol-adsense-host ==1.0.0,+             gogol-analytics ==1.0.0,+             gogol-android-enterprise ==1.0.0,+             gogol-android-publisher ==1.0.0,+             gogol-appengine ==1.0.0,+             gogol-apps-activity ==1.0.0,+             gogol-apps-calendar ==1.0.0,+             gogol-apps-licensing ==1.0.0,+             gogol-apps-reseller ==1.0.0,+             gogol-apps-tasks ==1.0.0,+             gogol-appstate ==1.0.0,+             gogol-bigquery ==1.0.0,+             gogol-billing ==1.0.0,+             gogol-blogger ==1.0.0,+             gogol-books ==1.0.0,+             gogol-civicinfo ==1.0.0,+             gogol-classroom ==1.0.0,+             gogol-cloudtrace ==1.0.0,+             gogol-compute ==1.0.0,+             gogol-container ==1.0.0,+             gogol-core ==1.0.0.0,+             gogol-customsearch ==1.0.0,+             gogol-dataflow ==1.0.0,+             gogol-dataproc ==1.0.0,+             gogol-datastore ==1.0.0,+             gogol-debugger ==1.0.0,+             gogol-deploymentmanager ==1.0.0,+             gogol-dfareporting ==1.0.0,+             gogol-discovery ==1.0.0,+             gogol-dns ==1.0.0,+             gogol-doubleclick-bids ==1.0.0,+             gogol-doubleclick-search ==1.0.0,+             gogol-drive ==1.0.0,+             gogol-firebase-rules ==1.0.0,+             gogol-fitness ==1.0.0,+             gogol-fonts ==1.0.0,+             gogol-fusiontables ==1.0.0,+             gogol-games ==1.0.0,+             gogol-games-configuration ==1.0.0,+             gogol-games-management ==1.0.0,+             gogol-genomics ==1.0.0,+             gogol-gmail ==1.0.0,+             gogol-groups-migration ==1.0.0,+             gogol-groups-settings ==1.0.0,+             gogol-identity-toolkit ==1.0.0,+             gogol-kgsearch ==1.0.0,+             gogol-logging ==1.0.0,+             gogol-mirror ==1.0.0,+             gogol-monitoring ==1.0.0,+             gogol-oauth2 ==1.0.0,+             gogol-pagespeed ==1.0.0,+             gogol-partners ==1.0.0,+             gogol-people ==1.0.0,+             gogol-play-moviespartner ==1.0.0,+             gogol-plus ==1.0.0,+             gogol-plus-domains ==1.0.0,+             gogol-proximitybeacon ==1.0.0,+             gogol-pubsub ==1.0.0,+             gogol-qpxexpress ==1.0.0,+             gogol-replicapool ==1.0.0,+             gogol-replicapool-updater ==1.0.0,+             gogol-resourcemanager ==1.0.0,+             gogol-script ==1.0.0,+             gogol-sheets ==1.0.0,+             gogol-shopping-content ==1.0.0,+             gogol-siteverification ==1.0.0,+             gogol-spectrum ==1.0.0,+             gogol-sqladmin ==1.0.0,+             gogol-storage ==1.0.0,+             gogol-storage-transfer ==1.0.0,+             gogol-tagmanager ==1.0.0,+             gogol-translate ==1.0.0,+             gogol-urlshortener ==1.0.0,+             gogol-vision ==1.0.0,+             gogol-webmaster-tools ==1.0.0,+             gogol-youtube ==1.0.0,+             gogol-youtube-analytics ==1.0.0,+             gogol-youtube-reporting ==1.0.0,+             goldplate ==0.2.2.1,+             google-isbn ==1.0.3,+             google-oauth2-jwt ==0.3.3.3,+             gopher-proxy ==0.1.1.3,+             gpolyline ==0.1.0.1,+             graph-core ==0.3.0.0,+             graphite ==0.10.0.1,+             graphql ==1.5.0.2,+             graphql-client ==1.2.4,+             graphql-spice ==1.0.7.0,+             graphs ==0.7.3,+             graphula ==2.1.2.0,+             graphviz ==2999.20.2.1,+             gravatar ==0.8.1,+             greskell ==2.0.3.5,+             greskell-core ==1.0.0.8,+             greskell-websocket ==1.0.0.6,+             gridtables ==0.1.1.0,+             grisette ==0.13.0.1,+             groom ==0.1.2.1,+             group-by-date ==0.1.0.5,+             groups ==0.5.3,+             gtk ==0.15.10,+             gtk2hs-buildtools ==0.13.12.0,+             gtk3 ==0.15.10,+             guarded-allocation ==0.0.1,+             hackage-cli ==0.1.0.4,+             hackage-db ==2.1.3,+             hackage-revdeps ==0.1,+             hackage-security ==0.6.3.3,+             hackage-security-HTTP ==0.1.1.3,+             haddock-library ==1.11.0,+             haha ==0.3.1.1,+             hakyll ==4.16.8.0,+             hakyll-convert ==0.3.0.5,+             hal ==1.1,+             half ==0.3.3,+             hall-symbols ==0.1.0.6,+             hamlet ==1.2.0,+             hamtsolo ==1.0.4,+             HandsomeSoup ==0.4.2,+             happstack-jmacro ==7.0.12.6,+             happstack-server ==7.9.3,+             happstack-server-tls ==7.2.1.7,+             happy ==2.1.7,+             happy-lib ==2.1.7,+             happy-meta ==0.2.1.0,+             harpie ==0.1.4.0,+             harpie-numhask ==0.1.1.0,+             HasBigDecimal ==0.2.0.0,+             hashable ==1.5.1.0,+             hashmap ==1.3.3,+             hashtables ==1.4.2,+             haskeline installed,+             haskell-gi ==0.26.17,+             haskell-gi-base ==0.26.9,+             haskell-gi-overloading ==1.0,+             haskell-lexer ==1.2.1,+             HaskellNet ==0.6.2,+             HaskellNet-SSL ==0.4.0.2,+             haskell-src ==1.0.4.2,+             haskell-src-exts ==1.23.1,+             haskell-src-exts-simple ==1.23.1.0,+             haskell-src-exts-util ==0.2.5,+             haskell-src-meta ==0.8.16,+             haskey-btree ==0.3.0.1,+             haskintex ==0.8.0.3,+             haskoin-core ==1.2.2,+             haskoin-store-data ==1.5.16,+             hasktags ==0.73.0,+             hasql ==1.9.3.1,+             hasql-dynamic-statements ==0.3.1.8,+             hasql-implicits ==0.2.0.2,+             hasql-interpolate ==1.0.1.0,+             hasql-listen-notify ==0.1.0.1,+             hasql-migration ==0.3.1,+             hasql-optparse-applicative ==0.9,+             hasql-pool ==1.3.0.4,+             hasql-th ==0.4.0.23,+             hasql-transaction ==1.2.1,+             has-transformers ==0.1.0.4,+             Hastructure ==0.50.4,+             hasty-hamiltonian ==1.3.4,+             HaTeX ==3.23.0.2,+             haveibeenpwned ==0.2.0.3,+             HaXml ==1.25.14,+             haxr ==3000.11.6.1,+             Hclip ==3.0.0.4,+             HCodecs ==0.5.2,+             hdaemonize ==0.5.7,+             HDBC ==2.4.0.5,+             HDBC-session ==0.1.2.1,+             headed-megaparsec ==0.2.1.3,+             heap ==1.0.4,+             heaps ==0.4.1,+             heatshrink ==0.1.0.0,+             hebrew-time ==0.1.2,+             hedgehog ==1.5,+             hedgehog-classes ==0.2.5.4,+             hedgehog-corpus ==0.2.0,+             hedgehog-fakedata ==0.0.1.5,+             hedgehog-fn ==1.0,+             hedgehog-quickcheck ==0.1.1,+             hedis ==0.15.2,+             hedn ==0.3.0.4,+             heftia ==0.7.0.0,+             heftia-effects ==0.7.0.0,+             heist ==1.1.1.2,+             here ==1.2.14,+             heredoc ==0.2.0.0,+             heterocephalus ==1.0.5.7,+             hetero-parameter-list ==0.1.0.21,+             hetero-parameter-list-with-typelevel-tools ==0.1.0.1,+             hetzner ==0.7.3.0,+             hex ==0.2.0,+             hexml ==0.3.5,+             hexml-lens ==0.2.2,+             hexpat ==0.20.13,+             hex-text ==0.1.0.9,+             hformat ==0.3.3.1,+             hfsevents ==0.1.8,+             hgal ==2.0.0.3,+             hidapi ==0.1.8,+             hie-bios ==0.16.0,+             hi-file-parser ==0.1.9.1,+             hinfo ==0.0.3.0,+             hinotify ==0.4.2,+             hint ==0.9.0.9,+             histogram-fill ==0.9.1.0,+             hjsmin ==0.2.1,+             hkd-default ==1.1.0.0,+             hkgr ==0.4.8,+             hledger ==1.43.2,+             hledger-iadd ==1.3.21,+             hledger-interest ==1.6.7,+             hledger-lib ==1.43.2,+             hledger-stockquotes ==0.1.3.2,+             hledger-ui ==1.43.2,+             hledger-web ==1.43.2,+             hlibcpuid ==0.2.0,+             hlibgit2 ==0.18.0.16,+             hlibsass ==0.1.10.3,+             hlint ==3.10,+             hmatrix ==0.20.2,+             hmatrix-backprop ==0.1.3.0,+             hmatrix-gsl ==0.19.0.1,+             hmatrix-gsl-stats ==0.4.1.8,+             hmatrix-morpheus ==0.1.1.2,+             hmatrix-repa ==0.1.2.2,+             hmatrix-special ==0.19.0.0,+             hmatrix-vector-sized ==0.1.3.0,+             hmpfr ==0.4.5,+             hoare ==0.1.1.0,+             hoauth2 ==2.14.3,+             honeycomb ==0.1.0.1,+             hoogle ==5.0.18.4,+             hopenssl ==2.2.5,+             horizontal-rule ==0.7.1.0,+             hosc ==0.21.1,+             hostname ==1.0,+             hostname-validate ==1.0.0,+             hourglass ==0.2.12,+             hourglass-orphans ==0.1.0.0,+             hp2pretty ==0.10.1,+             hpack ==0.38.3,+             hpc installed,+             hpc-codecov ==0.6.4.1,+             hpc-lcov ==1.2.0,+             HPDF ==1.7,+             hpke ==0.0.0,+             hpp ==0.6.5,+             hpqtypes ==1.12.0.0,+             hpqtypes-extras ==1.18.0.0,+             hquantlib-time ==0.1.2,+             hreader ==1.1.1,+             hreader-lens ==0.1.3.0,+             hruby ==0.5.1.0,+             hsass ==0.8.0,+             hs-bibutils ==6.10.0.0,+             hsc2hs ==0.68.10,+             hs-captcha ==1.0,+             hscolour ==1.25,+             hsdns ==1.8,+             hse-cpp ==0.2,+             hsemail ==2.2.2,+             hset ==2.2.0,+             HSet ==0.0.2,+             hs-GeoIP ==0.3,+             hsignal ==0.2.7.5,+             hsini ==0.5.2.2,+             hsinstall ==2.8,+             HSlippyMap ==3.0.1,+             hslogger ==1.3.2.0,+             hslua ==2.3.1,+             hslua-aeson ==2.3.2,+             hslua-classes ==2.3.2,+             hslua-cli ==1.4.4,+             hslua-core ==2.3.2.1,+             hslua-list ==1.1.4,+             hslua-marshalling ==2.3.2,+             hslua-module-doclayout ==1.2.0.1,+             hslua-module-path ==1.1.1,+             hslua-module-system ==1.1.3,+             hslua-module-text ==1.1.1,+             hslua-module-version ==1.1.1,+             hslua-module-zip ==1.1.4,+             hslua-objectorientation ==2.3.1,+             hslua-packaging ==2.3.1,+             hslua-repl ==0.1.2,+             hslua-typing ==0.1.1,+             hsndfile ==0.8.0,+             hsndfile-vector ==0.5.2,+             HsOpenSSL ==0.11.7.11,+             HsOpenSSL-x509-system ==0.1.0.4,+             hs-opentelemetry-api ==0.3.1.0,+             hs-opentelemetry-exporter-handle ==0.0.1.3,+             hs-opentelemetry-exporter-in-memory ==0.0.1.5,+             hs-opentelemetry-exporter-otlp ==0.1.1.0,+             hs-opentelemetry-otlp ==0.2.0.0,+             hs-opentelemetry-propagator-b3 ==0.0.1.3,+             hs-opentelemetry-propagator-datadog ==0.0.1.1,+             hs-opentelemetry-propagator-w3c ==0.1.0.0,+             hs-opentelemetry-sdk ==0.1.0.1,+             hs-opentelemetry-semantic-conventions ==0.1.0.0,+             hs-opentelemetry-vendor-honeycomb ==0.0.1.2,+             hspec ==2.11.17,+             hspec-api ==2.11.17,+             hspec-attoparsec ==0.1.0.2,+             hspec-checkers ==0.1.0.2,+             hspec-contrib ==0.5.2,+             hspec-core ==2.11.17,+             hspec-discover ==2.11.17,+             hspec-expectations ==0.8.4,+             hspec-expectations-json ==1.0.2.1,+             hspec-expectations-lifted ==0.10.0,+             hspec-expectations-pretty-diff ==0.7.2.6,+             hspec-golden ==0.2.2.0,+             hspec-golden-aeson ==0.9.0.0,+             hspec-hedgehog ==0.3.0.0,+             hspec-junit-formatter ==1.1.2.1,+             hspec-leancheck ==0.0.6,+             hspec-megaparsec ==2.2.1,+             hspec-meta ==2.11.17,+             hspec-need-env ==0.1.0.13,+             hspec-parsec ==0,+             hspec-smallcheck ==0.5.3,+             hspec-tmp-proc ==0.7.0.0,+             hspec-wai ==0.11.1,+             hspec-wai-json ==0.11.0,+             hspec-webdriver ==1.2.2,+             hs-php-session ==0.0.9.3,+             hstatistics ==0.3.1,+             HStringTemplate ==0.8.8,+             HSvm ==1.0.3.35,+             HsYAML ==0.2.1.5,+             HsYAML-aeson ==0.2.0.2,+             hsyslog ==5.0.2,+             htaglib ==1.2.1,+             HTF ==0.15.0.2,+             html ==1.0.1.2,+             html-conduit ==1.3.2.2,+             html-email-validate ==0.2.0.0,+             html-entities ==1.1.4.7,+             html-entity-map ==0.1.0.0,+             html-parse ==0.2.2.0,+             HTTP ==4000.4.1,+             http2 ==5.3.10,+             http-api-data ==0.6.3,+             http-api-data-qq ==0.1.0.1,+             http-client ==0.7.19,+             http-client-openssl ==0.3.3,+             http-client-overrides ==0.1.1.0,+             http-client-restricted ==0.1.1,+             http-client-tls ==0.3.6.4,+             http-common ==0.8.3.4,+             http-conduit ==2.3.9.1,+             http-date ==0.0.11,+             http-directory ==0.1.12,+             http-download ==0.2.1.0,+             httpd-shed ==0.4.1.2,+             http-io-streams ==0.1.7.2,+             http-link-header ==1.2.3,+             http-media ==0.8.1.1,+             http-query ==0.1.3.1,+             http-reverse-proxy ==0.6.2.0,+             http-semantics ==0.3.0,+             http-streams ==0.8.9.9,+             http-types ==0.12.5,+             human-readable-duration ==0.2.1.5,+             HUnit ==1.6.2.0,+             HUnit-approx ==1.1.1.1,+             hunit-dejafu ==2.0.0.6,+             hvect ==0.4.0.1,+             hvega ==0.12.0.7,+             hw-bits ==0.7.2.2,+             hw-conduit-merges ==0.2.1.0,+             hw-diagnostics ==0.0.1.0,+             hweblib ==0.6.3,+             hw-excess ==0.2.3.0,+             hw-hedgehog ==0.1.1.1,+             hw-int ==0.0.2.0,+             hwk ==0.6,+             hw-kafka-client ==5.3.0,+             hw-mquery ==0.2.1.2,+             hw-parser ==0.1.1.0,+             hw-prim ==0.6.3.2,+             hw-rankselect-base ==0.3.4.1,+             hw-string-parse ==0.0.0.5,+             hxt ==9.3.1.22,+             hxt-charproperties ==9.5.0.0,+             hxt-css ==0.1.0.3,+             hxt-curl ==9.1.1.1,+             hxt-expat ==9.1.1,+             hxt-http ==9.1.5.2,+             hxt-regex-xmlschema ==9.2.0.7,+             hxt-tagsoup ==9.1.4,+             hxt-unicode ==9.0.2.4,+             hxt-xpath ==9.1.2.2,+             hybrid-vectors ==0.2.5,+             hyperbole ==0.4.3,+             hyperloglog ==0.5,+             hyphenation ==0.8.3,+             iconv ==0.4.1.3,+             identicon ==0.2.3,+             ieee754 ==0.8.0,+             if ==0.1.0.0,+             IfElse ==0.85,+             iff ==0.0.6.1,+             ihaskell ==0.12.0.0,+             ihaskell-hvega ==0.5.0.7,+             ihs ==0.1.0.3,+             imagesize-conduit ==1.1,+             Imlib ==0.1.2,+             immortal ==0.3,+             immortal-queue ==0.1.0.1,+             imp ==1.0.3.5,+             ImpSpec ==0.1.0.0,+             inbox ==0.2.0,+             incipit-base ==0.6.1.1,+             incipit-core ==0.6.1.1,+             include-file ==0.1.0.4,+             incremental ==0.3.1,+             incremental-parser ==0.5.1,+             indents ==0.5.0.1,+             indexed ==0.1.3,+             indexed-containers ==0.1.0.2,+             indexed-list-literals ==0.2.1.3,+             indexed-profunctors ==0.1.1.1,+             indexed-transformers ==0.1.0.4,+             indexed-traversable ==0.1.5,+             indexed-traversable-instances ==0.1.2.1,+             inf-backprop ==0.1.1.0,+             infer-license ==0.2.0,+             infinite-list ==0.1.3,+             influxdb ==1.9.3.2,+             ini ==0.4.2,+             inj ==1.0,+             inline-c ==0.9.1.10,+             inline-c-cpp ==0.5.0.2,+             input-parsers ==0.3.0.2,+             insert-ordered-containers ==0.2.7,+             inspection-testing ==0.6.3,+             int-cast ==0.2.0.0,+             integer-conversion ==0.1.1,+             integer-gmp installed,+             integer-logarithms ==1.0.5,+             integer-roots ==1.0.4.0,+             integration ==0.2.1,+             intermediate-structures ==0.1.2.0,+             intern ==0.9.6,+             interpolate ==0.2.1,+             interpolatedstring-perl6 ==1.0.2,+             interpolation ==0.1.1.2,+             Interpolation ==0.3.0,+             IntervalMap ==0.6.2.4,+             intervals ==0.9.3,+             intset-imperative ==0.1.0.0,+             int-supply ==1.0.0,+             invariant ==0.6.5,+             invertible ==0.2.0.8,+             invertible-grammar ==0.1.3.5,+             io-embed ==0.1.0.1,+             io-machine ==0.2.0.0,+             io-manager ==0.1.0.4,+             io-memoize ==1.1.1.0,+             io-region ==0.1.1,+             io-storage ==0.3,+             io-streams ==1.5.2.2,+             io-streams-haproxy ==1.0.1.0,+             ip ==1.7.8,+             ip6addr ==2.0.0.1,+             iproute ==1.7.15,+             IPv6Addr ==2.0.6.2,+             IPv6DB ==0.3.3.4,+             ipynb ==0.2,+             ipython-kernel ==0.11.0.0,+             irc ==0.6.1.1,+             irc-ctcp ==0.1.3.1,+             iri ==0.5.1.2,+             isbn ==1.1.0.5,+             islink ==0.1.0.0,+             iso3166-country-codes ==0.20140203.8,+             iso639 ==0.1.0.3,+             iso8601-time ==0.1.5,+             isocline ==1.0.9,+             isomorphism-class ==0.3.1.4,+             ix-shapable ==0.1.0,+             jack ==0.7.2.2,+             jailbreak-cabal ==1.4.1,+             jalaali ==1.0.0.0,+             java-adt ==1.0.20251105,+             jira-wiki-markup ==1.5.1,+             jmacro ==0.6.18,+             jose ==0.11,+             jose-jwt ==0.10.0,+             journalctl-stream ==0.6.0.8,+             jsaddle ==0.9.9.4,+             jsaddle-dom ==0.9.9.3,+             jsaddle-warp ==0.9.9.6,+             js-chart ==2.9.4.1,+             js-dgtable ==0.5.2,+             js-flot ==0.8.3,+             js-jquery ==3.7.1,+             json ==0.11,+             json-feed ==2.0.0.19,+             jsonifier ==0.2.1.3,+             jsonpath ==0.3.0.0,+             json-rpc ==1.1.2,+             jsonrpc-tinyclient ==1.1.0.0,+             json-spec ==1.1.1.2,+             json-spec-elm ==0.4.0.7,+             json-spec-elm-servant ==0.4.4.3,+             json-spec-openapi ==1.0.1.3,+             json-stream ==0.4.6.1,+             JuicyCairo ==0.1.0.1,+             JuicyPixels ==3.3.9,+             JuicyPixels-extra ==0.6.0,+             junit-xml ==0.1.0.4,+             justified-containers ==0.3.0.0,+             kan-extensions ==5.2.8,+             kansas-comet ==0.4.4,+             katip ==0.8.8.4,+             katip-logstash ==0.1.0.2,+             katip-wai ==0.2.0.2,+             kazura-queue ==0.1.0.4,+             kdt ==0.2.6,+             keep-alive ==0.2.1.0,+             keter ==2.1.10,+             keycode ==0.2.4,+             keyed-vals ==0.2.3.5,+             keyed-vals-hspec-tests ==0.2.3.5,+             keyed-vals-mem ==0.2.3.4,+             keyed-vals-redis ==0.2.3.5,+             keys ==3.12.5,+             ki ==1.0.1.2,+             kind-apply ==0.4.0.1,+             kind-generics ==0.5.0.0,+             ki-unlifted ==1.0.0.2,+             kmeans ==0.1.3,+             knob ==0.2.2,+             koji ==0.0.2,+             koji-tool ==1.3.1,+             kvitable ==1.1.2.0,+             labels ==0.3.3,+             lackey ==2.0.0.12,+             lambdabot-core ==5.3.1.2,+             lambdabot-irc-plugins ==5.3.1.2,+             LambdaHack ==0.11.0.1,+             lame ==0.2.2,+             language-avro ==0.1.4.0,+             language-bash ==0.11.1,+             language-c ==0.10.2,+             language-c99 ==0.2.0,+             language-c99-simple ==0.3.0,+             language-c99-util ==0.2.0,+             language-c-quote ==0.13.0.2,+             language-docker ==14.0.1,+             language-dot ==0.1.2,+             language-glsl ==0.3.0,+             language-java ==0.2.9,+             language-javascript ==0.7.1.0,+             language-lua ==0.11.0.2,+             language-nix ==2.2.0,+             language-protobuf ==1.0.1,+             lapack-carray ==0.0.3,+             lapack-comfort-array ==0.0.1.1,+             lapack-ffi ==0.0.3,+             lapack-ffi-tools ==0.1.3.2,+             large-hashable ==0.1.3.0,+             largeword ==1.2.5,+             latex ==0.1.0.4,+             lattices ==2.2.1.1,+             lawful ==0.1.0.0,+             lawful-conversions ==0.1.7,+             lazy-csv ==0.5.1,+             lazyio ==0.1.0.6,+             lazysmallcheck ==0.6,+             lca ==0.4,+             leancheck ==1.0.4,+             leancheck-instances ==0.0.8,+             leapseconds-announced ==2017.1.0.1,+             learn-physics ==0.6.7,+             leb128-cereal ==1.2,+             lens ==5.3.6,+             lens-action ==0.2.6,+             lens-aeson ==1.2.3,+             lens-csv ==0.1.1.0,+             lens-family ==2.1.3,+             lens-family-core ==2.1.3,+             lens-family-th ==0.5.3.2,+             lens-misc ==0.0.2.0,+             lens-properties ==4.11.1,+             lens-regex ==0.1.3,+             lens-regex-pcre ==1.1.2.0,+             lentil ==1.5.10.0,+             LetsBeRational ==1.0.0.0,+             leveldb-haskell ==0.6.5.1,+             lexer-applicative ==2.1.0.2,+             libBF ==0.6.8,+             libffi ==0.2.1,+             libmpd ==0.10.0.1,+             liboath-hs ==0.0.1.2,+             libsodium-bindings ==0.0.3.0,+             libyaml ==0.1.4,+             libyaml-clib ==0.2.5,+             lifted-async ==0.10.2.7,+             lifted-base ==0.2.3.12,+             lifted-threads ==1.0,+             lift-generics ==0.3.1,+             lift-type ==0.1.2.0,+             linear ==1.23.3,+             linear-base ==0.5.0,+             linear-generics ==0.2.3,+             linear-geo ==0.1.0.0,+             linear-programming ==0.0.1,+             linebreak ==1.1.0.4,+             linux-capabilities ==0.1.1.0,+             linux-file-extents ==0.2.0.1,+             linux-namespaces ==0.2.0.1,+             liquid-fixpoint ==0.9.6.3.2,+             liquidhaskell ==0.9.10.1.2,+             liquidhaskell-boot ==0.9.10.1.2,+             List ==0.6.2,+             ListLike ==4.7.8.4,+             list-predicate ==0.1.0.1,+             listsafe ==0.1.0.1,+             lists-flines ==0.1.3.0,+             list-shuffle ==1.0.0.1,+             list-t ==1.0.5.7,+             list-transformer ==1.1.1,+             ListTree ==0.2.3,+             list-witnesses ==0.1.4.1,+             ListZipper ==1.2.0.2,+             literatex ==0.4.0.0,+             lmdb ==0.2.5,+             load-env ==0.2.1.0,+             locators ==0.3.0.5,+             loch-th ==0.2.2,+             lockfree-queue ==0.2.4,+             log-base ==0.12.1.0,+             log-domain ==0.13.2,+             logfloat ==0.14.0.2,+             logger-thread ==0.1.0.2,+             logging ==3.0.6,+             logging-effect ==1.4.2,+             logging-facade ==0.3.1,+             logging-facade-syslog ==1,+             logict ==0.8.2.0,+             logstash ==0.1.0.4,+             loop ==0.3.0,+             lpeg ==1.1.0.1,+             LPFP ==1.1.5,+             LPFP-core ==1.1.5,+             lr-acts ==0.0.1,+             lrucache ==1.2.0.1,+             lsfrom ==2.0,+             lsp ==2.7.0.1,+             lsp-test ==0.17.1.1,+             lsp-types ==2.3.0.1,+             lua ==2.3.4,+             lua-arbitrary ==1.0.1.2,+             lucid ==2.11.20260427,+             lucid2 ==0.0.20260427,+             lucid-cdn ==0.2.2.0,+             lucid-extras ==0.2.2,+             lukko ==0.1.2,+             lumberjack ==1.0.3.0,+             lz4 ==0.2.3.1,+             lz4-frame-conduit ==0.1.0.2,+             lzma ==0.0.1.1,+             lzma-clib ==5.2.2,+             machines ==0.7.4,+             magic ==1.1.2,+             mail-pool ==2.3.1,+             mailtrap ==0.1.2.2,+             mainland-pretty ==0.7.1.1,+             main-tester ==0.2.0.1,+             managed ==1.0.11,+             mandrill ==0.5.8.0,+             manifolds-core ==0.6.1.1,+             Mantissa ==0.1.0.0,+             mappings ==0.3.3.0,+             map-syntax ==0.3,+             markdown ==0.1.17.5,+             markdown-unlit ==0.6.0,+             markov-chain ==0.0.3.4,+             markov-chain-usage-model ==0.0.0,+             markup-parse ==0.2.2.0,+             massiv ==1.0.5.0,+             massiv-io ==1.0.0.1,+             massiv-serialise ==1.0.0.2,+             massiv-test ==1.1.0.1,+             matchable ==0.2,+             mathexpr ==0.3.1.0,+             math-extras ==0.1.1.0,+             math-functions ==0.3.4.4,+             mathlist ==0.2.0.0,+             matplotlib ==0.7.7,+             matrices ==0.5.0,+             matrix ==0.3.6.4,+             matrix-as-xyz ==0.1.2.2,+             matrix-market-attoparsec ==0.1.1.3,+             matrix-static ==0.3,+             maximal-cliques ==0.1.1,+             mbox-utility ==0.0.3.1,+             mcmc ==0.8.3.1,+             mcmc-types ==1.0.3,+             mcp-server ==0.1.0.20,+             mealy ==0.5.1.1,+             median-stream ==0.7.0.0,+             med-module ==0.1.3,+             megaparsec ==9.7.0,+             megaparsec-tests ==9.7.0,+             melf ==1.3.1,+             membership ==0.0.1,+             memcache ==0.3.0.2,+             mem-info ==0.4.2.0,+             memory ==0.18.0,+             memory-hexstring ==1.1.0.0,+             MemoTrie ==0.6.11,+             mempack ==0.1.2.0,+             mergeful ==0.3.0.0,+             mergeful-persistent ==0.3.0.1,+             mergeless ==0.4.0.0,+             mergeless-persistent ==0.1.0.1,+             merkle-tree ==0.1.1,+             mersenne-random ==1.0.0.1,+             mersenne-random-pure64 ==0.2.2.0,+             messagepack ==0.5.5,+             metrics ==0.4.1.1,+             mfsolve ==0.3.2.2,+             microaeson ==0.1.0.3,+             microlens ==0.4.14.0,+             microlens-aeson ==2.5.2,+             microlens-contra ==0.1.0.3,+             microlens-ghc ==0.4.15.1,+             microlens-mtl ==0.2.1.0,+             microlens-platform ==0.4.4.1,+             microlens-th ==0.4.3.17,+             microspec ==0.2.1.3,+             microstache ==1.0.3.1,+             midair ==0.2.0.1,+             midi ==0.2.2.6,+             midi-alsa ==0.2.1,+             midi-music-box ==0.0.1.2,+             mighty-metropolis ==2.0.0,+             mime-mail ==0.5.1,+             mime-mail-ses ==0.4.4,+             mime-types ==0.1.2.2,+             minimal-configuration ==0.1.4,+             minimorph ==0.3.0.1,+             minisat ==0.1.4,+             minisat-solver ==0.1,+             miniterion ==0.1.2.1,+             miniutter ==0.5.1.2,+             minmax ==0.1.1.0,+             mintty ==0.1.4,+             misfortune ==0.1.2.1,+             miso ==1.8.7.0,+             missing-foreign ==0.1.1,+             MissingH ==1.6.0.3,+             mixed-types-num ==0.6.2,+             mmap ==0.5.9,+             mmark ==0.0.8.0,+             mmark-cli ==0.0.5.2,+             mmark-ext ==0.2.1.5,+             mmorph ==1.2.2,+             mmsyn2-array ==0.3.1.1,+             mmsyn7l ==0.9.2.0,+             mmsyn7ukr-array ==0.3.0.0,+             mmsyn7ukr-common ==0.3.1.0,+             mnist-idx ==0.1.3.2,+             mnist-idx-conduit ==0.4.0.0,+             mockcat ==0.5.5.0,+             mockery ==0.3.5,+             mod ==0.2.2.0,+             modern-uri ==0.3.6.1,+             modular ==0.1.0.8,+             moffy ==0.1.1.0,+             moffy-samples ==0.1.0.3,+             moffy-samples-events ==0.2.2.5,+             moffy-samples-gtk3 ==0.1.0.0,+             moffy-samples-gtk3-run ==0.1.0.7,+             monad-chronicle ==1.1.0.1,+             monad-control ==1.0.3.1,+             monad-control-aligned ==0.0.2.1,+             monad-control-identity ==0.2.0.0,+             monad-coroutine ==0.9.3,+             monad-extras ==0.6.0,+             monad-interleave ==0.2.0.1,+             monadlist ==0.0.2,+             monad-logger ==0.3.42,+             monad-logger-aeson ==0.4.1.6,+             monad-logger-extras ==0.1.1.2,+             monad-logger-json ==0.1.0.0,+             monad-logger-logstash ==0.2.0.2,+             monad-logger-syslog ==0.1.6.1,+             monad-loops ==0.4.3,+             monad-memo ==0.5.4,+             monad-metrics ==0.2.2.2,+             monadoid ==0.0.3,+             monadology ==0.4,+             monad-par ==0.3.6,+             monad-parallel ==0.8.0.1,+             monad-par-extras ==0.3.3,+             monad-peel ==0.3,+             MonadPrompt ==1.0.0.5,+             MonadRandom ==0.6.2.1,+             monad-resumption ==0.1.4.0,+             monad-schedule ==0.2.0.2,+             monad-st ==0.2.4.1,+             monads-tf ==0.3.0.1,+             monad-time ==0.4.0.0,+             mongoDB ==2.7.1.4,+             monoidal-containers ==0.6.8.0,+             monoidal-functors ==0.2.3.0,+             monoid-extras ==0.7.0.2,+             monoid-insertleft ==0.1.0.1,+             monoid-map ==0.2.0.1,+             monoidmap ==0.0.4.4,+             monoidmap-aeson ==0.0.0.6,+             monoidmap-examples ==0.0.0.2,+             monoidmap-internal ==0.0.0.1,+             monoidmap-quickcheck ==0.0.0.4,+             monoid-subclasses ==1.2.6.1,+             monoid-transformer ==0.0.4.1,+             mono-traversable ==1.0.21.0,+             mono-traversable-instances ==0.1.1.0,+             more-containers ==0.2.2.2,+             morpheus-graphql-app ==0.28.5,+             morpheus-graphql-client ==0.28.5,+             morpheus-graphql-code-gen-utils ==0.28.5,+             morpheus-graphql-core ==0.28.5,+             morpheus-graphql-server ==0.28.5,+             morpheus-graphql-subscriptions ==0.28.5,+             moss ==0.2.0.1,+             mountpoints ==1.0.2,+             mpi-hs ==0.7.3.1,+             mpi-hs-binary ==0.1.1.0,+             mpi-hs-cereal ==0.1.0.0,+             msgpack ==1.0.1.0,+             mstate ==0.2.11,+             mt19937 ==0.1.1,+             mtl installed,+             mtl-compat ==0.2.2,+             mtl-misc-yj ==0.1.0.4,+             mtl-prelude ==2.0.3.2,+             multiarg ==0.30.0.10,+             multimap ==1.2.1,+             multipart ==0.2.1,+             MultipletCombiner ==0.0.7,+             multiset ==0.3.4.3,+             multistate ==0.8.0.4,+             murmur3 ==1.0.6,+             murmur-hash ==0.1.0.11,+             MusicBrainz ==0.4.1,+             mustache ==2.4.3.1,+             mutable-containers ==0.3.4.1,+             mwc-probability ==2.3.1,+             mwc-random ==0.15.3.0,+             mx-state-codes ==1.0.0.0,+             myers-diff ==0.3.0.2,+             mysql ==0.2.1,+             mysql-json-table ==0.1.4.1,+             mysql-simple ==0.4.9,+             n2o ==0.11.1,+             n2o-nitro ==0.11.2,+             nagios-check ==0.3.2,+             named ==0.3.0.2,+             named-text ==1.2.4.0,+             names-th ==0.3.0.1,+             nano-erl ==0.1.0.1,+             NanoID ==3.4.1.2,+             nanospec ==0.2.2,+             nats ==1.1.2,+             natural-arithmetic ==0.2.4.0,+             natural-induction ==0.2.0.0,+             natural-sort ==0.1.2,+             natural-transformation ==0.4.1,+             neat-interpolation ==0.5.1.4,+             nerd-font-icons ==0.1.0.1,+             netcode-io ==0.0.3,+             netlib-carray ==0.1,+             netlib-comfort-array ==0.0.0.2,+             netlib-ffi ==0.1.2,+             netpbm ==1.0.4,+             netrc ==0.2.0.2,+             nettle ==0.3.1.1,+             netwire ==5.0.3,+             netwire-input ==0.0.7,+             netwire-input-glfw ==0.0.12,+             network ==3.2.8.0,+             network-bsd ==2.8.1.0,+             network-byte-order ==0.1.8,+             network-conduit-tls ==1.4.0.1,+             network-control ==0.1.7,+             network-house ==0.1.0.3,+             network-info ==0.2.1,+             network-ip ==0.3.0.3,+             network-messagepack-rpc ==0.1.2.0,+             network-multicast ==0.3.2,+             network-run ==0.4.4,+             network-simple ==0.4.5,+             network-simple-tls ==0.4.2,+             network-transport ==0.5.9,+             network-transport-inmemory ==0.5.42,+             network-transport-tcp ==0.8.6,+             network-transport-tests ==0.3.4,+             network-uri ==2.6.4.2,+             network-uri-template ==0.1.2.0,+             network-wait ==0.2.0.0,+             newtype ==0.2.2.1,+             newtype-generics ==0.6.3,+             nfc ==0.1.1,+             nicify-lib ==1.0.1,+             NineP ==0.0.2.1,+             nix-narinfo ==0.1.1.3,+             nix-paths ==1.0.1,+             NoHoed ==0.1.1,+             nonce ==1.0.7,+             nondeterminism ==1.5,+             non-empty ==0.3.6.1,+             nonempty-containers ==0.3.5.0,+             non-empty-sequence ==0.2.0.4,+             non-empty-text ==0.2.1,+             nonempty-vector ==0.2.4,+             nonempty-zipper ==1.0.1.1,+             non-negative ==0.1.2.1,+             no-recursion ==0.1.2.3,+             normaldistribution ==1.1.0.3,+             nothunks ==0.3.2,+             no-value ==1.0.0.0,+             nowdoc ==0.1.1.0,+             nsis ==0.3.4,+             n-tuple ==0.0.3,+             numbers ==3000.2.0.2,+             numeric-extras ==0.1,+             numeric-limits ==0.1.0.0,+             numeric-prelude ==0.4.4,+             numeric-quest ==0.2.1,+             numhask ==0.13.3.0,+             numhask-space ==0.13.3.0,+             NumInstances ==1.4,+             numtype-dk ==0.5.0.3,+             nvim-hs ==2.3.2.6,+             nvim-hs-contrib ==2.0.0.2,+             nvim-hs-ghcid ==2.0.1.0,+             ObjectName ==1.1.0.2,+             oblivious-transfer ==0.1.0,+             o-clock ==1.4.0.1,+             odbc ==0.3.0,+             ods2csv ==0.1.0.2,+             oeis ==0.3.10.2,+             oeis2 ==1.0.9,+             ofx ==0.4.4.0,+             ogma-cli ==1.7.0,+             ogma-core ==1.7.0,+             ogma-extra ==1.7.0,+             ogma-language-c ==1.7.0,+             ogma-language-copilot ==1.7.0,+             ogma-language-csv ==1.7.0,+             ogma-language-jsonspec ==1.7.0,+             ogma-language-lustre ==1.7.0,+             ogma-language-smv ==1.7.0,+             ogma-language-xlsx ==1.7.0,+             ogma-language-xmlspec ==1.7.0,+             ogma-spec ==1.7.0,+             old-locale ==1.0.0.7,+             old-time ==1.1.1.0,+             ollama-haskell ==0.2.1.0,+             om-doh ==0.1.0.6,+             om-elm ==2.0.1.2,+             om-fail ==0.1.0.7,+             om-fork ==0.7.1.13,+             om-http ==0.5.0.1,+             om-logging ==1.1.0.12,+             om-show ==0.1.2.13,+             om-time ==0.3.1.3,+             once ==0.4,+             one-liner ==2.1.1,+             one-liner-instances ==0.1.3.0,+             OneTuple ==0.4.3,+             Only ==0.1,+             oo-prototypes ==0.1.0.0,+             oops ==0.2.0.1,+             opaleye ==0.10.8.0,+             OpenAL ==1.7.0.5,+             openapi3 ==3.2.4,+             open-browser ==0.4.0.0,+             openexr-write ==0.1.0.2,+             OpenGL ==3.0.3.0,+             OpenGLRaw ==3.3.4.1,+             openpgp-asciiarmor ==0.1.2,+             opensource ==0.1.1.0,+             openssl-streams ==1.2.3.0,+             opentelemetry ==0.8.0,+             opentelemetry-extra ==0.8.0,+             opentelemetry-lightstep ==0.8.0,+             opentelemetry-wai ==0.8.0,+             open-witness ==0.7,+             operational ==0.2.4.2,+             opml-conduit ==0.9.0.0,+             opt-env-conf ==0.9.0.0,+             optics ==0.4.2.1,+             optics-core ==0.4.2,+             optics-extra ==0.4.2.1,+             optics-operators ==0.1.0.1,+             optics-th ==0.4.1,+             optics-vl ==0.2.1,+             optima ==0.4.0.7,+             optional-args ==1.0.2,+             options ==1.2.1.2,+             optparse-applicative ==0.18.1.0,+             optparse-enum ==1.0.0.0,+             optparse-generic ==1.5.3,+             optparse-simple ==0.1.1.4,+             optparse-text ==0.1.1.0,+             OrderedBits ==0.0.2.0,+             ordered-containers ==0.2.4,+             os-string installed,+             overhang ==1.0.0,+             packcheck ==0.7.1,+             pager ==0.1.1.0,+             pagination ==0.2.2,+             pagure ==0.2.1,+             pagure-cli ==0.2.3,+             palette ==0.3.0.4,+             pandoc ==3.7.0.2,+             pandoc-cli ==3.7.0.2,+             pandoc-lua-engine ==0.4.3,+             pandoc-lua-marshal ==0.3.2.1,+             pandoc-plot ==1.9.2,+             pandoc-server ==0.1.0.11,+             pandoc-throw ==0.1.0.0,+             pandoc-types ==1.23.1.2,+             pango ==0.13.12.0,+             panic ==0.4.0.1,+             pantry ==0.10.1,+             parallel ==3.2.2.0,+             parallel-io ==0.3.5,+             parameterized ==0.5.0.0,+             parameterized-utils ==2.1.11.0,+             paramtree ==0.1.2,+             park-bench ==0.1.1.0,+             parseargs ==0.2.0.9,+             parsec installed,+             parsec-class ==1.0.1.0,+             parsec-numbers ==0.1.0,+             parsec-numeric ==0.1.0.0,+             ParsecTools ==0.0.2.0,+             parser-combinators ==1.3.1,+             parser-combinators-tests ==1.3.1,+             parser-regex ==0.3.0.0,+             parsers ==0.12.12,+             partial-handler ==1.0.3,+             partial-isomorphisms ==0.2.4.0,+             partialord ==0.1.1,+             password ==3.1.0.2,+             password-instances ==3.0.0.0,+             password-types ==1.0.1.0,+             patch ==0.0.8.4,+             path ==0.9.6,+             path-binary-instance ==0.1.0.1,+             path-dhall-instance ==0.2.1.0,+             path-extensions ==0.1.1.0,+             path-extra ==0.3.1,+             path-io ==1.8.2,+             path-like ==0.2.0.2,+             path-pieces ==0.2.1,+             pathtype ==0.8.1.4,+             path-utils ==0.1.1.0,+             pathwalk ==0.3.1.2,+             patience ==0.3,+             patrol ==1.1.0.0,+             pava ==0.1.1.4,+             pcg-random ==0.1.4.0,+             pcre2 ==2.2.3,+             pcre-heavy ==1.0.0.4,+             pcre-light ==0.4.1.3,+             pcre-utils ==0.1.9,+             pdc ==0.1.1,+             pdf-toolbox-content ==0.1.2,+             pdf-toolbox-core ==0.1.3,+             pdf-toolbox-document ==0.1.4,+             peano ==0.1.1.0,+             pedersen-commitment ==0.2.0,+             pem ==0.2.4,+             percent-format ==0.0.4,+             perf ==0.14.0.3,+             perfect-hash-generator ==1.0.0,+             persistable-record ==0.6.0.6,+             persistable-types-HDBC-pg ==0.0.3.5,+             persistent ==2.17.1.0,+             persistent-discover ==0.1.0.7,+             persistent-documentation ==0.1.0.6,+             persistent-lens ==1.0.0,+             persistent-mongoDB ==2.13.1.0,+             persistent-mtl ==0.5.2,+             persistent-mysql ==2.13.1.5,+             persistent-pagination ==0.1.1.2,+             persistent-postgresql ==2.13.7.0,+             persistent-qq ==2.12.0.7,+             persistent-redis ==2.13.0.2,+             persistent-sqlite ==2.13.3.1,+             persistent-template ==2.12.0.0,+             persistent-test ==2.13.2.1,+             persistent-typed-db ==0.1.0.7,+             pg-harness-client ==0.6.0,+             pg-transact ==0.3.2.0,+             phantom-state ==0.2.1.5,+             pid1 ==0.1.3.1,+             pinch ==0.5.2.0,+             pinecone ==1.0.0,+             pipes ==4.3.16,+             pipes-aeson ==0.4.2,+             pipes-attoparsec ==0.6.0,+             pipes-binary ==0.4.4,+             pipes-bytestring ==2.1.7,+             pipes-concurrency ==2.0.14,+             pipes-csv ==1.4.3,+             pipes-extras ==1.0.15,+             pipes-fastx ==0.3.0.0,+             pipes-fluid ==0.6.0.1,+             pipes-group ==1.0.12,+             pipes-http ==1.0.6,+             pipes-mongodb ==0.1.0.0,+             pipes-ordered-zip ==1.2.1,+             pipes-parse ==3.0.9,+             pipes-random ==1.0.0.5,+             pipes-safe ==2.3.5,+             pipes-wai ==3.2.0,+             pipes-zlib ==0.4.4.2,+             pkgtreediff ==0.6.0,+             place-cursor-at ==1.0.1,+             placeholders ==0.1,+             plaid ==0.1.0.4,+             plot ==0.2.3.12,+             plotlyhs ==0.2.3,+             Plural ==0.0.2,+             pointed ==5.0.5,+             pointedlist ==0.6.1,+             pointless-fun ==1.1.0.13,+             poll ==0.0.0.2,+             poly ==0.5.1.0,+             poly-arity ==0.1.0,+             polynomials-bernstein ==1.1.2,+             polyparse ==1.13.1,+             polysemy ==1.9.2.0,+             polysemy-fs ==0.1.0.0,+             polysemy-plugin ==0.4.5.3,+             polysemy-webserver ==0.2.1.2,+             pontarius-xmpp ==0.5.7.2,+             pontarius-xmpp-extras ==0.1.0.12,+             pooled-io ==0.0.2.5,+             portable-lines ==0.1,+             port-utils ==0.2.1.0,+             posix-paths ==0.3.0.1,+             posix-pty ==0.2.2,+             possibly ==1.0.0.0,+             postgres-options ==0.2.2.0,+             postgresql-binary ==0.14.2,+             postgresql-libpq ==0.11.0.0,+             postgresql-libpq-configure ==0.11,+             postgresql-libpq-notify ==0.2.0.0,+             postgresql-migration ==0.2.1.8,+             postgresql-schema ==0.1.14,+             postgresql-simple ==0.7.0.1,+             postgresql-syntax ==0.4.5.0,+             postgresql-typed ==0.6.2.5,+             post-mess-age ==0.2.1.0,+             pptable ==0.3.0.0,+             pqueue ==1.5.0.0,+             prairie ==0.1.2.0,+             pred-set ==0.0.1,+             prefix-units ==0.3.0.1,+             prelude-compat ==0.0.0.2,+             prelude-safeenum ==0.1.1.8,+             pretty installed,+             prettychart ==0.3.0.3,+             pretty-class ==1.0.1.1,+             prettyclass ==1.0.0.0,+             pretty-hex ==1.1,+             prettyprinter ==1.7.2,+             prettyprinter-ansi-terminal ==1.1.4,+             prettyprinter-combinators ==0.1.4,+             prettyprinter-compat-annotated-wl-pprint ==1.1.1,+             prettyprinter-compat-ansi-wl-pprint ==1.0.2,+             prettyprinter-compat-wl-pprint ==1.0.2,+             prettyprinter-interp ==0.2.0.0,+             pretty-relative-time ==0.3.0.0,+             pretty-show ==1.10,+             pretty-simple ==4.1.4.0,+             pretty-sop ==0.2.0.3,+             pretty-terminal ==0.1.0.0,+             primecount ==0.1.0.2,+             primes ==0.2.1.0,+             primitive ==0.9.1.0,+             primitive-addr ==0.1.0.3,+             primitive-extras ==0.10.2.2,+             primitive-offset ==0.2.0.1,+             primitive-serial ==0.1,+             primitive-unaligned ==0.1.1.2,+             primitive-unlifted ==2.2.0.0,+             prim-uniq ==0.2,+             print-console-colors ==0.1.0.0,+             probability ==0.2.9.1,+             probability-polynomial ==1.0.1.0,+             process installed,+             process-extras ==0.7.4,+             product-isomorphic ==0.0.3.4,+             product-profunctors ==0.11.1.1,+             profunctors ==5.6.3,+             projectroot ==0.2.0.1,+             project-template ==0.2.1.0,+             prometheus ==2.3.1,+             prometheus-client ==1.1.1,+             prometheus-metrics-ghc ==1.0.1.2,+             promises ==0.3,+             prompt-hs ==1.0.3.1,+             prospect ==0.1.0.0,+             protobuf ==0.2.1.3,+             protobuf-simple ==0.1.1.1,+             protocol-radius ==0.0.1.2,+             protocol-radius-test ==0.1.0.1,+             proto-lens ==0.7.1.7,+             proto-lens-optparse ==0.1.1.14,+             proto-lens-protobuf-types ==0.7.2.3,+             proto-lens-protoc ==0.9.0.1,+             proto-lens-runtime ==0.7.0.8,+             proto-lens-setup ==0.4.0.10,+             protolude ==0.3.5,+             proxied ==0.3.2,+             pseudo-boolean ==0.1.12.0,+             psql-helpers ==0.1.0.0,+             PSQueue ==1.2.2,+             psqueues ==0.2.8.3,+             pthread ==0.2.1,+             ptr ==0.16.8.7,+             ptr-poker ==0.1.3,+             pulse-simple ==0.1.14,+             pureMD5 ==2.1.4,+             puresat ==0.1.0.1,+             purescript-bridge ==0.15.0.0,+             pusher-http-haskell ==2.1.0.21,+             pvar ==1.0.0.0,+             pwstore-fast ==2.4.4,+             PyF ==0.11.5.0,+             qchas ==1.1.0.1,+             quaalude ==0.0.0.1,+             quadratic-irrational ==0.1.2,+             quantizer ==0.4.0.0,+             QuasiText ==0.1.2.6,+             queues ==1.0.0,+             queue-sheet ==0.8.0.1,+             quickbench ==1.0.1,+             QuickCheck ==2.15.0.1,+             quickcheck-arbitrary-adt ==0.3.1.0,+             quickcheck-assertions ==0.3.0,+             quickcheck-classes ==0.6.5.0,+             quickcheck-classes-base ==0.6.2.0,+             quickcheck-dynamic ==4.0.1,+             quickcheck-groups ==0.0.1.5,+             quickcheck-higherorder ==0.1.0.1,+             quickcheck-instances ==0.3.33,+             quickcheck-io ==0.2.0,+             quickcheck-monoid-subclasses ==0.3.0.6,+             quickcheck-quid ==0.0.1.8,+             quickcheck-simple ==0.1.1.1,+             quickcheck-special ==0.1.0.6,+             quickcheck-state-machine ==0.10.4,+             quickcheck-text ==0.1.2.1,+             quickcheck-transformer ==0.3.1.3,+             quickcheck-unicode ==1.0.1.0,+             quicklz ==1.5.0.11,+             quiet ==0.2,+             quote-quot ==0.2.1.0,+             radius ==0.7.1.0,+             radix-tree ==1.1.0.0,+             rainbow ==0.34.2.2,+             rainbox ==0.26.0.0,+             ral ==0.2.2,+             rampart ==2.0.0.13,+             ramus ==0.1.2,+             rando ==0.0.0.4,+             random ==1.2.1.3,+             random-bytestring ==0.1.4,+             random-fu ==0.3.0.1,+             random-shuffle ==0.0.4,+             random-tree ==0.6.0.5,+             range ==0.3.2.2,+             ranged-list ==0.1.2.3,+             Ranged-sets ==0.5.0,+             ranges ==0.2.4,+             range-set-list ==0.1.4.1,+             rank1dynamic ==0.4.3,+             rank2classes ==1.5.5.1,+             Rasterific ==0.7.5.4,+             rasterific-svg ==0.3.3.2,+             ratel ==2.0.0.19,+             rate-limit ==1.4.3,+             ratel-wai ==2.0.0.12,+             ratio-int ==0.1.2,+             rattle ==0.2,+             rattletrap ==14.1.4,+             rawfilepath ==1.1.1,+             rawstring-qm ==0.2.3.1,+             raw-strings-qq ==1.1,+             rcu ==0.2.7,+             rdf ==0.1.0.8,+             rdtsc ==1.3.0.1,+             re2 ==0.3,+             reactive-balsa ==0.4.0.1,+             reactive-banana ==1.3.2.0,+             reactive-banana-bunch ==1.0.0.1,+             reactive-jack ==0.4.1.2,+             reactive-midyim ==0.4.1.3,+             readable ==0.3.1,+             read-editor ==0.1.0.2,+             read-env-var ==1.0.0.0,+             real-dice ==0.1.0.5,+             rebase ==1.21.2,+             rec-def ==0.2.2,+             record-hasfield ==1.0.1,+             recover-rtti ==0.5.3,+             recursion-schemes ==5.2.3,+             recv ==0.1.1,+             redact ==0.6.0.0,+             reddit-scrape ==0.0.1,+             redis-glob ==0.1.0.11,+             redis-resp ==1.0.0,+             reducers ==3.12.5,+             refact ==0.3.0.2,+             ref-fd ==0.5.0.1,+             refined ==0.8.2,+             refined-containers ==0.1.2.0,+             reflection ==2.1.9,+             reflex ==0.9.4.1,+             reflex-dom-core ==0.8.1.4,+             reflex-fsnotify ==0.3.0.2,+             reflex-gadt-api ==0.2.2.3,+             reflex-vty ==1.0.0.1,+             RefSerialize ==0.4.0,+             ref-tf ==0.5.0.1,+             regex ==1.1.0.2,+             regex-applicative ==0.3.4,+             regex-base ==0.94.0.3,+             regex-compat ==0.95.2.2,+             regex-pcre ==0.95.0.1,+             regex-pcre-builtin ==0.95.2.3.8.44,+             regex-posix ==0.96.0.2,+             regex-posix-clib ==2.7,+             regex-tdfa ==1.3.2.5,+             regex-with-pcre ==1.1.0.2,+             registry ==0.6.3.3,+             registry-aeson ==0.3.1.2,+             reinterpret-cast ==0.1.0,+             relapse ==1.0.0.1,+             relational-query ==0.12.3.1,+             relational-query-HDBC ==0.7.2.1,+             relational-record ==0.2.2.0,+             relational-schemas ==0.1.8.1,+             reliable-io ==0.0.2,+             relude ==1.2.2.2,+             renderable ==0.2.0.1,+             reorder-expression ==0.1.0.3,+             repa ==3.4.2.0,+             repa-algorithms ==3.4.2.0,+             repa-io ==3.4.2.0,+             replace-attoparsec ==1.5.0.0,+             replace-megaparsec ==1.5.0.1,+             repline ==0.4.3.0,+             req ==3.13.4,+             req-conduit ==1.0.2,+             rerebase ==1.21.2,+             rerefined ==0.8.0,+             reroute ==0.7.0.0,+             resolv ==0.2.0.3,+             resource-pool ==0.4.0.0,+             resourcet ==1.3.0,+             rest-rewrite ==0.4.5,+             result ==0.2.6.0,+             retry ==0.9.3.1,+             rev-scientific ==0.2.1.0,+             rev-state ==0.2.0.1,+             rex ==0.6.2,+             rfc1751 ==0.1.4,+             rfc5051 ==0.2,+             rg ==1.4.0.0,+             rhbzquery ==0.4.5,+             rhine ==1.5,+             rhine-gloss ==1.5,+             rhine-terminal ==1.5,+             rhythmic-sequences ==0.8.0.0,+             riak-protobuf ==0.25.0.0,+             richenv ==0.1.0.4,+             rio ==0.1.25.0,+             rio-orphans ==0.1.2.0,+             rio-prettyprint ==0.1.9.0,+             rng-utils ==0.3.1,+             roc-id ==0.2.0.6,+             rocksdb-haskell ==1.0.1,+             rocksdb-haskell-jprupp ==2.1.7,+             rocksdb-query ==0.4.3,+             roles ==0.2.1.0,+             rollbar ==1.1.3,+             rope-utf16-splay ==0.4.0.0,+             rosezipper ==0.2,+             rot13 ==0.2.0.1,+             RoundingFiasco ==0.1.0.0,+             row-types ==1.0.1.2,+             rpmbuild-order ==0.4.13,+             rpm-nvr ==0.1.2,+             rp-tree ==0.7.1,+             rrb-vector ==0.2.2.1,+             RSA ==2.4.1,+             rss ==3000.2.0.8,+             runmemo ==1.0.0.1,+             run-st ==0.1.3.3,+             rvar ==0.3.0.2,+             rzk ==0.7.7,+             s3-signer ==0.5.0.0,+             safe ==0.3.21,+             safe-coloured-text ==0.3.0.2,+             safe-coloured-text-gen ==0.0.0.3,+             safe-coloured-text-layout ==0.2.0.1,+             safe-coloured-text-layout-gen ==0.0.0.2,+             safe-coloured-text-terminfo ==0.3.0.0,+             safecopy ==0.10.4.3,+             safe-decimal ==0.2.1.0,+             safe-exceptions ==0.1.7.4,+             safe-foldable ==0.1.0.0,+             safe-gen ==1.0.1,+             safeio ==0.0.6.0,+             safe-json ==1.2.1.2,+             safe-money ==0.9.1,+             SafeSemaphore ==0.10.1,+             saltine ==0.2.2.0,+             salve ==2.0.0.10,+             sample-frame ==0.0.4,+             sample-frame-np ==0.0.5,+             sampling ==0.3.5,+             samsort ==0.1.0.0,+             sandi ==0.5,+             sandwich ==0.3.0.5,+             sandwich-contexts ==0.3.0.3,+             sandwich-hedgehog ==0.1.3.1,+             sandwich-quickcheck ==0.2.0.0,+             sandwich-slack ==0.1.2.0,+             sandwich-webdriver ==0.3.0.1,+             saturn ==1.0.0.9,+             say ==0.1.0.1,+             sayable ==1.2.7.0,+             sbp ==6.2.2,+             sbv ==11.7,+             scale ==1.1.0.0,+             scalpel ==0.6.2.2,+             scalpel-core ==0.6.2.2,+             scanf ==0.1.0.0,+             scanner ==0.3.1,+             s-cargot ==0.1.6.0,+             scheduler ==2.0.1.0,+             SciBaseTypes ==0.1.1.0,+             scientific ==0.3.8.1,+             scientist ==0.0.0.0,+             scotty ==0.22,+             scrypt ==0.5.0,+             sdl2 ==2.5.6.0,+             sdl2-gfx ==0.3.0.0,+             sdl2-image ==2.1.0.0,+             sdl2-mixer ==1.2.0.0,+             sdl2-ttf ==2.1.3,+             search-algorithms ==0.3.4,+             secp256k1-haskell ==1.4.6,+             securemem ==0.1.10,+             sel ==0.1.0.0,+             selections ==0.3.0.0,+             selective ==0.7.0.1,+             select-rpms ==0.3.1,+             semaphore-compat installed,+             semialign ==1.3.1.1,+             semigroupoids ==6.0.2,+             semigroups ==0.20.1,+             semirings ==0.7,+             semiring-simple ==1.0.0.1,+             semver ==0.4.0.1,+             sendfile ==0.7.11.6,+             sendgrid-v3 ==1.0.0.1,+             seqalign ==0.2.0.4,+             seqid ==0.6.3,+             seqid-streams ==0.7.2,+             sequence-formats ==1.11.0.2,+             sequenceTools ==1.6.0.0,+             serialise ==0.2.6.1,+             servant ==0.20.3.0,+             servant-auth ==0.4.9.2,+             servant-auth-client ==0.4.9.2,+             servant-auth-docs ==0.2.11.0,+             servant-auth-server ==0.4.9.2,+             servant-auth-swagger ==0.2.11.0,+             servant-blaze ==0.9.1,+             servant-checked-exceptions ==2.2.0.1,+             servant-checked-exceptions-core ==2.2.0.1,+             servant-cli ==0.1.1.0,+             servant-client ==0.20.3.0,+             servant-client-core ==0.20.3.0,+             servant-conduit ==0.16.1,+             servant-docs ==0.13.1,+             servant-elm ==0.7.3,+             servant-exceptions ==0.2.1,+             servant-exceptions-server ==0.2.1,+             servant-foreign ==0.16.1,+             servant-http-streams ==0.20.2,+             servant-JuicyPixels ==0.3.1.1,+             servant-lucid ==0.9.0.6,+             servant-machines ==0.16.1,+             servant-multipart ==0.12.1,+             servant-multipart-api ==0.12.1,+             servant-multipart-client ==0.12.2,+             servant-openapi3 ==2.0.2.0,+             servant-pipes ==0.16.1,+             servant-rate-limit ==0.2.0.0,+             servant-rawm ==1.0.0.0,+             servant-server ==0.20.3.0,+             servant-static-th ==1.0.0.1,+             servant-swagger ==1.2.1,+             servant-swagger-ui ==0.3.5.5.0.1,+             servant-swagger-ui-core ==0.3.5,+             servant-swagger-ui-redoc ==0.3.5,+             servant-websockets ==2.0.0,+             servant-xml ==1.0.3,+             serversession ==1.0.3,+             serversession-backend-acid-state ==1.0.5,+             serversession-backend-redis ==1.0.5,+             serversession-frontend-wai ==1.0.1,+             serversession-frontend-yesod ==1.0.1,+             servius ==1.2.3.0,+             ses-html ==0.4.0.0,+             set-cover ==0.1.2.1,+             setenv ==0.1.1.3,+             setlocale ==1.0.0.10,+             sexp-grammar ==2.3.4.2,+             SHA ==1.6.4.4,+             shake ==0.19.9,+             shake-plus ==0.3.4.0,+             shakespeare ==2.1.7.1,+             shakespeare-text ==1.1.0,+             shared-memory ==0.2.0.1,+             ShellCheck ==0.10.0,+             shell-conduit ==5.0.0,+             shell-escape ==0.2.0,+             shellify ==0.14.0.2,+             shellmet ==0.0.6.0,+             shell-monad ==0.6.10,+             shelltestrunner ==1.10,+             shell-utility ==0.1,+             shellwords ==0.1.4.6,+             shelly ==1.12.1.1,+             should-not-typecheck ==2.1.0,+             show-combinators ==0.2.0.0,+             shower ==0.2.0.5,+             siggy-chardust ==1.0.0,+             signal ==0.1.0.4,+             silently ==1.2.5.4,+             simple ==2.0.0,+             simple-affine-space ==0.2.1,+             simple-cabal ==0.1.3.1,+             simple-cairo ==0.1.0.6,+             simple-cmd ==0.2.8,+             simple-cmd-args ==0.1.8,+             simple-expr ==0.1.1.0,+             simple-media-timestamp ==0.2.1.0,+             simple-media-timestamp-attoparsec ==0.1.0.0,+             simple-pango ==0.1.0.2,+             simple-prompt ==0.2.4,+             simple-reflect ==0.3.3,+             simple-sendfile ==0.2.32,+             simple-session ==2.0.0,+             simple-templates ==2.0.0,+             simple-vec3 ==0.6.0.1,+             since ==0.0.0,+             singleraeh ==0.4.0,+             singleton-bool ==0.1.8,+             singleton-nats ==0.4.7,+             singletons ==3.0.4,+             singletons-base ==3.4,+             singletons-presburger ==0.7.4.1,+             singletons-th ==3.4,+             Sit ==0.2023.8.3,+             sitemap-gen ==0.1.0.0,+             size-based ==0.1.3.3,+             sized ==1.1.0.2,+             skein ==1.0.9.4,+             skeletest ==0.2.1,+             skews ==0.1.0.3,+             skip-var ==0.1.1.0,+             skylighting ==0.14.7,+             skylighting-core ==0.14.7,+             skylighting-format-ansi ==0.1,+             skylighting-format-blaze-html ==0.1.2.1,+             skylighting-format-context ==0.1.0.2,+             skylighting-format-latex ==0.1,+             skylighting-format-typst ==0.1,+             slack-web ==2.2.0.0,+             slave-thread ==1.1.0.3,+             slick ==1.3.1.0,+             slist ==0.2.1.0,+             slynx ==0.8.0.0,+             smallcheck ==1.2.1.1,+             smith ==0.2.0.0,+             smtlib-backends ==0.4,+             smtlib-backends-process ==0.3,+             smtlib-backends-tests ==0.3,+             smtp-mail ==0.5.0.0,+             snap ==1.1.3.3,+             snap-blaze ==0.2.1.5,+             snap-core ==1.0.5.1,+             snappy ==0.2.0.4,+             snap-server ==1.1.2.1,+             snowflake ==0.1.1.1,+             socket ==0.8.3.0,+             socks ==0.6.1,+             solana-staking-csvs ==0.1.3.0,+             some ==1.0.6,+             some-dict-of ==0.1.0.2,+             sop-core ==0.5.0.2,+             sort ==1.0.0.0,+             sorted-list ==0.2.3.1,+             sound-collage ==0.2.1.1,+             sourcemap ==0.1.7,+             sox ==0.2.3.2,+             soxlib ==0.0.3.2,+             spacecookie ==1.0.0.3,+             spdx ==1.1.0.1,+             special-values ==0.1.0.0,+             speculate ==0.4.20,+             specup ==0.2.0.6,+             speedy-slice ==0.3.2,+             sphinx ==0.6.1,+             Spintax ==0.3.7.0,+             splice ==0.6.1.1,+             split ==0.2.5,+             splitmix ==0.1.3.2,+             splitmix-distributions ==1.1.0,+             split-record ==0.1.1.5,+             Spock-api ==0.14.0.0,+             spoon ==0.3.1,+             spreadsheet ==0.1.3.10,+             sqids ==0.2.2.0,+             sqlite-simple ==0.4.19.0,+             sql-words ==0.1.6.5,+             squeather ==0.8.0.0,+             srcloc ==0.6.0.1,+             srtree ==2.0.1.8,+             stache ==2.3.4,+             stack-all ==0.7.1,+             stack-clean-old ==0.5.2,+             stack-templatizer ==0.1.1.0,+             stamina ==0.1.0.3,+             state-codes ==0.1.3,+             stateref ==0.3,+             statestack ==0.3.1.1,+             StateVar ==1.2.2,+             stateWriter ==0.4.0,+             static-bytes ==0.1.1,+             static-text ==0.2.0.7,+             statistics ==0.16.5.0,+             statistics-linreg ==0.3,+             statsd-rupp ==0.5.0.1,+             status-notifier-item ==0.3.2.16,+             step-function ==0.2.1,+             stitch ==0.6.0.0,+             stm installed,+             stm-chans ==3.0.0.11,+             stm-conduit ==4.0.1,+             stm-containers ==1.2.2,+             stm-delay ==0.1.1.2,+             stm-extras ==0.1.0.3,+             stm-hamt ==1.2.2.1,+             STMonadTrans ==0.4.8.1,+             stm-split ==0.0.2.1,+             stm-supply ==0.2.0.0,+             storable-complex ==0.2.3.0,+             storable-endian ==0.2.6.1,+             storable-generic ==0.1.0.5,+             storable-hetero-list ==0.1.0.4,+             storable-peek-poke ==0.1.0.2,+             storable-record ==0.0.7,+             storable-tuple ==0.1,+             storablevector ==0.2.13.4,+             store ==0.7.22,+             store-core ==0.4.4.7,+             store-streaming ==0.2.0.5,+             stratosphere ==0.60.0,+             Stream ==0.4.7.2,+             streaming ==0.2.4.0,+             streaming-attoparsec ==1.0.0.1,+             streaming-binary ==0.3.0.1,+             streaming-bytestring ==0.3.4,+             streaming-commons ==0.2.3.1,+             streaming-wai ==0.1.1,+             streamly ==0.10.1,+             streamly-bytestring ==0.2.3,+             streamly-core ==0.2.3,+             streamly-process ==0.3.1,+             streams ==3.3.3,+             strict ==0.5.1,+             strict-base-types ==0.8.1,+             strict-concurrency ==0.2.4.3,+             strict-lens ==0.4.1,+             strict-list ==0.1.7.6,+             strict-mutable-base ==1.1.0.0,+             strict-tuple ==0.1.5.4,+             strict-wrapper ==0.0.2.0,+             stringable ==0.1.3,+             stringbuilder ==0.5.1,+             string-class ==0.1.7.2,+             string-combinators ==0.6.0.5,+             string-conv ==0.2.0,+             string-conversions ==0.4.0.1,+             string-interpolate ==0.3.4.0,+             stringprep ==1.0.0,+             string-qq ==0.0.6,+             string-random ==0.1.4.5,+             stringsearch ==0.3.6.6,+             string-transform ==1.1.1,+             string-variants ==0.3.1.3,+             strive ==6.0.0.17,+             strongweak ==0.12.0,+             structs ==0.1.10,+             stylish-haskell ==0.15.1.0,+             subcategories ==0.2.1.2,+             sundown ==0.6,+             svg-builder ==0.1.1,+             SVGFonts ==1.8.1,+             svg-tree ==0.6.2.4,+             swagger2 ==2.8.10,+             swish ==0.10.11.0,+             swizzle ==0.1.0.4,+             swizzle-lens ==0.1.0.0,+             swizzle-modify ==0.1.0.0,+             swizzle-set ==0.2.0.0,+             syb ==0.7.2.4,+             sydtest ==0.20.0.1,+             sydtest-aeson ==0.2.0.1,+             sydtest-amqp ==0.1.0.0,+             sydtest-autodocodec ==0.0.0.0,+             sydtest-discover ==0.0.0.4,+             sydtest-hedgehog ==0.4.0.0,+             sydtest-hedis ==0.0.0.0,+             sydtest-hspec ==0.4.0.4,+             sydtest-mongo ==0.2.0.0,+             sydtest-persistent ==0.1.0.0,+             sydtest-persistent-sqlite ==0.2.0.3,+             sydtest-process ==0.0.0.0,+             sydtest-rabbitmq ==0.1.0.0,+             sydtest-servant ==0.2.0.2,+             sydtest-typed-process ==0.0.0.0,+             sydtest-wai ==0.2.0.2,+             sydtest-webdriver ==0.0.0.1,+             sydtest-webdriver-screenshot ==0.1.0.0,+             sydtest-webdriver-yesod ==0.0.1.0,+             sydtest-yesod ==0.3.1.0,+             symbol ==0.2.4.1,+             symbolize ==1.0.3.1,+             symengine ==0.1.2.0,+             symmetry-operations-symbols ==0.0.2.1,+             symparsec ==1.1.1,+             synthesizer-alsa ==0.5.0.6,+             synthesizer-core ==0.8.4,+             synthesizer-dimensional ==0.8.1.1,+             synthesizer-midi ==0.6.1.2,+             sysinfo ==0.1.1,+             system-argv0 ==0.1.1,+             systemd ==2.4.0,+             system-fileio ==0.3.16.7,+             system-filepath ==0.4.14.1,+             system-info ==0.5.2,+             system-linux-proc ==0.1.1.1,+             table-layout ==1.0.0.2,+             tabular ==0.2.2.8,+             tagchup ==0.4.1.2,+             tagged ==0.8.9,+             tagged-binary ==0.2.0.1,+             tagged-identity ==0.1.5,+             tagged-transformer ==0.8.3,+             tagsoup ==0.14.8,+             tagstream-conduit ==0.5.6,+             tao ==1.0.0,+             tao-example ==1.0.0,+             tar ==0.6.4.0,+             tar-conduit ==0.4.1,+             tardis ==0.5.0.1,+             tasty ==1.5.4,+             tasty-ant-xml ==1.1.9,+             tasty-autocollect ==0.4.4,+             tasty-bench ==0.4.1,+             tasty-checklist ==1.0.10.0,+             tasty-dejafu ==2.1.0.2,+             tasty-discover ==5.0.2,+             tasty-expected-failure ==0.12.3,+             tasty-fail-fast ==0.0.3,+             tasty-focus ==1.0.1,+             tasty-golden ==2.3.6,+             tasty-hedgehog ==1.4.0.2,+             tasty-hslua ==1.1.1.1,+             tasty-hspec ==1.2.0.4,+             tasty-html ==0.4.2.2,+             tasty-hunit ==0.10.2,+             tasty-inspection-testing ==0.2.1,+             tasty-kat ==0.0.3,+             tasty-leancheck ==0.0.2,+             tasty-lua ==1.1.2,+             tasty-papi ==0.1.2.0,+             tasty-program ==1.1.0,+             tasty-quickcheck ==0.11.1,+             tasty-rerun ==1.1.20,+             tasty-silver ==3.3.2.1,+             tasty-smallcheck ==0.8.2,+             tasty-sugar ==2.2.3.3,+             tasty-tap ==0.1.0,+             tasty-th ==0.1.7,+             tasty-wai ==0.1.2.0,+             TCache ==0.13.3,+             tce-conf ==1.3,+             tdigest ==0.3.1,+             teardown ==0.5.0.1,+             telegram-bot-api ==7.4.5,+             telegram-bot-simple ==0.14.4,+             tempgres-client ==1.0.0,+             template ==0.2.0.10,+             template-haskell installed,+             template-haskell-compat-v0208 ==0.1.9.6,+             temporary ==1.3,+             temporary-rc ==1.2.0.3,+             temporary-resourcet ==0.1.0.1,+             tensorflow-test ==0.1.0.0,+             tensort ==1.1.0.0,+             termbox ==2.0.0.2,+             termbox-banana ==2.0.0.1,+             termbox-bindings-c ==0.1.0.3,+             termbox-bindings-hs ==1.0.0.1,+             termbox-tea ==1.0.0.1,+             terminal ==0.2.0.0,+             terminal-progress-bar ==0.4.2,+             terminal-size ==0.3.4,+             terminfo installed,+             test-certs ==0.1.1.2,+             test-framework ==0.8.2.3,+             test-framework-hunit ==0.3.0.3,+             test-framework-leancheck ==0.0.4,+             test-framework-quickcheck2 ==0.3.0.7,+             test-framework-smallcheck ==0.2,+             test-fun ==0.1.0.0,+             testing-feat ==1.1.1.1,+             testing-type-modifiers ==0.1.0.1,+             texmath ==0.12.10.3,+             text installed,+             text-ansi ==0.3.0.1,+             text-binary ==0.2.1.1,+             text-builder ==1.0.0.4,+             text-builder-core ==0.1.1.1,+             text-builder-dev ==0.4.0.1,+             text-builder-linear ==0.1.3,+             text-conversions ==0.3.1.1,+             text-convert ==0.1.0.1,+             text-display ==1.0.0.0,+             text-encode ==0.2.0.0,+             text-icu ==0.8.0.5,+             text-iso8601 ==0.1.1.1,+             text-latin1 ==0.3.1,+             text-ldap ==0.1.1.14,+             textlocal ==0.1.0.5,+             text-manipulate ==0.3.1.0,+             text-metrics ==0.3.3,+             text-misc-yj ==0.1.0.2,+             text-postgresql ==0.0.3.1,+             text-printer ==0.5.0.2,+             text-regex-replace ==0.1.1.5,+             text-rope ==0.3,+             text-short ==0.1.6.1,+             text-show ==3.11.4,+             text-show-instances ==3.9.11,+             text-zipper ==0.13,+             tfp ==1.0.2,+             tf-random ==0.5,+             th-abstraction ==0.7.2.0,+             th-bang-compat ==0.0.1.0,+             th-compat ==0.1.7,+             th-constraint-compat ==0.0.1.0,+             th-data-compat ==0.1.3.1,+             th-deepstrict ==0.1.1.0,+             th-desugar ==1.17,+             th-env ==0.1.1,+             these ==1.2.1,+             these-lens ==1.0.2,+             these-optics ==1.0.2,+             these-skinny ==0.7.6,+             th-expand-syns ==0.4.12.0,+             th-extras ==0.0.0.9,+             th-lego ==0.3.0.3,+             th-lift ==0.8.7,+             th-lift-instances ==0.1.20,+             th-nowq ==0.1.0.5,+             th-orphans ==0.13.17,+             th-printf ==0.8,+             thread-hierarchy ==0.3.0.2,+             thread-local-storage ==0.2,+             threads ==0.5.1.8,+             threads-extras ==0.1.0.3,+             thread-supervisor ==0.2.0.0,+             thread-utils-context ==0.3.0.4,+             thread-utils-finalizers ==0.1.1.0,+             threepenny-gui ==0.9.4.2,+             th-reify-compat ==0.0.1.5,+             th-reify-many ==0.1.10,+             th-strict-compat ==0.1.0.1,+             th-test-utils ==1.2.3,+             th-utilities ==0.2.5.2,+             thyme ==0.4.1,+             tidal ==1.10.3,+             tidal-core ==1.10.2,+             tidal-link ==1.2.2,+             tile ==0.3.0.0,+             time installed,+             time-compat ==1.9.9,+             time-domain ==0.1.0.5,+             timeit ==2.0,+             time-lens ==0.4.0.2,+             timelens ==0.2.0.2,+             time-locale-compat ==0.1.1.5,+             time-locale-vietnamese ==1.0.0.0,+             time-manager ==0.2.4,+             timerep ==2.1.0.0,+             timers-tick ==0.5.0.4,+             timer-wheel ==1.0.0.1,+             timespan ==0.4.0.0,+             time-units ==1.0.0,+             time-units-types ==0.2.0.1,+             timezone-olson ==0.2.1,+             timezone-olson-th ==0.1.0.11,+             timezone-series ==0.1.13,+             titlecase ==1.0.1,+             tldr ==0.9.3,+             tls ==2.1.8,+             tls-session-manager ==0.0.9,+             tlynx ==0.8.0.0,+             tmapchan ==0.0.3,+             tmapmvar ==0.0.4,+             tmp-proc ==0.7.2.7,+             tmp-proc-postgres ==0.7.2.4,+             tmp-proc-rabbitmq ==0.7.2.4,+             tmp-proc-redis ==0.7.2.5,+             token-bucket ==0.1.0.1,+             tokenize ==0.3.0.1,+             tomland ==1.3.3.3,+             toml-parser ==2.0.2.0,+             toml-reader ==0.3.0.0,+             toml-reader-parse ==0.1.1.1,+             tools-yj ==0.1.0.45,+             tophat ==1.0.8.0,+             topograph ==1.0.1,+             torrent ==10000.1.3,+             torsor ==0.1.0.1,+             tracing ==0.0.7.4,+             transaction ==0.1.1.4,+             transformers installed,+             transformers-base ==0.4.6.1,+             transformers-compat ==0.7.2,+             transformers-either ==0.1.4,+             traverse-with-class ==1.0.1.1,+             tree-diff ==0.3.4.1,+             tree-fun ==0.8.1.0,+             tree-view ==0.5.1,+             trie-simple ==0.4.4,+             trifecta ==2.1.4,+             trimdent ==0.1.0.0,+             trivial-constraint ==0.7.0.0,+             tsv2csv ==0.1.0.2,+             ttc ==1.5.0.1,+             ttrie ==0.1.2.2,+             tuple ==0.3.0.2,+             tuples ==0.1.0.0,+             tuples-homogenous-h98 ==0.1.1.0,+             tuple-sop ==0.3.1.0,+             tuple-th ==0.2.5,+             turtle ==1.6.2,+             twitter-types ==0.11.0,+             twitter-types-lens ==0.11.0,+             typecheck-plugin-nat-simple ==0.1.0.11,+             typed-process ==0.2.13.0,+             typed-uuid ==0.2.0.0,+             type-equality ==1.0.1,+             type-errors ==0.2.0.2,+             type-flip ==0.1.0.0,+             type-fun ==0.1.3,+             type-hint ==0.1,+             type-level-bytestrings ==0.2.0,+             type-level-integers ==0.0.1,+             type-level-kv-list ==2.0.2.0,+             type-level-natural-number ==2.0,+             type-level-numbers ==0.1.1.2,+             type-level-show ==0.3.0,+             typelevel-tools-yj ==0.1.0.9,+             typelits-witnesses ==0.4.1.0,+             type-map ==0.1.7.0,+             type-natural ==1.3.0.2,+             typenums ==0.1.4,+             type-of-html ==1.6.2.0,+             type-of-html-static ==0.1.0.2,+             type-rig ==0.1,+             type-set ==0.1.0.0,+             type-spec ==0.4.0.0,+             typography-geometry ==1.0.1.0,+             typst ==0.8.0.2,+             typst-symbols ==0.1.8.1,+             tz ==0.1.3.6,+             tzdata ==0.2.20260708.0,+             tztime ==0.1.1.0,+             ua-parser ==0.7.7.0,+             uglymemo ==0.1.0.1,+             ulid ==0.3.3.0,+             unagi-chan ==0.4.1.4,+             unbounded-delays ==0.1.1.1,+             unbound-generics ==0.4.5,+             unboxed-ref ==0.4.0.0,+             unboxing-vector ==0.2.0.0,+             uncaught-exception ==0.1.0,+             uncertain ==0.4.0.1,+             unconditional-jump ==1.0.0,+             unconstrained ==0.1.0.2,+             unexceptionalio ==0.5.1,+             unexceptionalio-trans ==0.5.2,+             unicode ==0.0.1.3,+             unicode-collation ==0.1.3.7,+             unicode-data ==0.6.0,+             unicode-show ==0.1.1.1,+             unicode-transforms ==0.4.0.1,+             unidecode ==0.1.0.4,+             unification-fd ==0.12.0.3,+             union ==0.1.3.2,+             union-angle ==0.1.0.1,+             union-color ==0.1.4.0,+             union-find-array ==0.1.0.5,+             unipatterns ==0.0.0.0,+             uniplate ==1.6.13,+             uniq-deep ==1.2.1,+             unique-logic ==0.4.1.1,+             unique-logic-tf ==0.5.1.3,+             uniqueness-periods-vector-stats ==0.4.0.0,+             unit-constraint ==0.0.0,+             units ==2.4.1.5,+             units-defs ==2.2.1,+             units-parser ==0.1.1.5,+             universe ==1.2.3,+             universe-base ==1.1.4,+             universe-dependent-sum ==1.3.1,+             universe-instances-extended ==1.1.4,+             universe-reverse-instances ==1.1.2,+             universe-some ==1.2.2.1,+             unix installed,+             unix-bytestring ==0.4.0.4,+             unix-compat ==0.7.4.1,+             unix-time ==0.4.17,+             unjson ==0.15.4,+             unlifted ==0.2.4.0,+             unliftio ==0.2.25.1,+             unliftio-core ==0.2.1.0,+             unliftio-path ==0.0.2.0,+             unliftio-pool ==0.4.3.1,+             unliftio-streams ==0.2.0.0,+             unlit ==0.4.0.0,+             unordered-containers ==0.2.20.1,+             unsafe ==0.0,+             uri-bytestring ==0.4.0.1,+             uri-bytestring-aeson ==0.1.0.9,+             uri-encode ==1.5.0.7,+             url ==2.1.3,+             urlpath ==11.0.2,+             users ==0.5.0.0,+             users-test ==0.5.0.1,+             utf8-light ==0.4.4.0,+             utf8-string ==1.0.2,+             utility-ht ==0.0.17.2,+             uuid ==1.3.16.1,+             uuid-types ==1.0.6.1,+             valida ==1.1.0,+             valida-base ==0.2.0,+             validate-input ==0.5.0.0,+             validation ==1.1.5,+             validation-selective ==0.2.0.0,+             validity ==0.12.1.0,+             validity-aeson ==0.2.0.5,+             validity-bytestring ==0.4.1.1,+             validity-case-insensitive ==0.0.0.0,+             validity-containers ==0.5.0.5,+             validity-network-uri ==0.0.0.1,+             validity-path ==0.4.0.1,+             validity-persistent ==0.0.0.0,+             validity-primitive ==0.0.0.1,+             validity-scientific ==0.2.0.3,+             validity-text ==0.3.1.3,+             validity-time ==0.5.0.0,+             validity-unordered-containers ==0.2.0.3,+             validity-uuid ==0.1.0.3,+             validity-vector ==0.2.0.3,+             valor ==1.0.0.1,+             vary ==0.1.1.3,+             varying ==0.8.1.0,+             vault ==0.3.2.0,+             vcr ==0.1.0,+             vcs-ignore ==0.0.2.0,+             vec ==0.5.1.1,+             vector ==0.13.2.0,+             vector-algorithms ==0.9.1.0,+             vector-binary-instances ==0.2.5.2,+             vector-buffer ==0.4.1,+             vector-builder ==0.3.8.7,+             vector-bytes-instances ==0.1.1,+             vector-extras ==0.3,+             vector-fftw ==0.1.4.1,+             vector-hashtables ==0.1.2.1,+             vector-instances ==3.4.3,+             vector-mmap ==0.0.3,+             vector-quicksort ==0.2,+             vector-rotcev ==0.1.0.2,+             vector-sized ==1.6.1,+             vector-space ==0.19,+             vector-split ==1.0.0.4,+             vector-stream ==0.1.0.1,+             vector-th-unbox ==0.2.2,+             verbosity ==0.4.0.0,+             verset ==0.0.1.11,+             versions ==6.0.8,+             vessel ==0.3.0.2,+             vformat ==0.14.1.0,+             vformat-time ==0.1.0.0,+             ViennaRNAParser ==1.3.3,+             vinyl ==0.14.3,+             vinyl-loeb ==0.0.1.0,+             Vis ==1.0.0,+             vivid-osc ==0.5.0.0,+             vivid-supercollider ==0.4.1.2,+             void ==0.7.4,+             vty ==6.4,+             vty-crossplatform ==0.4.0.0,+             vty-unix ==0.2.0.0,+             vty-windows ==0.2.0.3,+             wai ==3.2.4,+             wai-app-static ==3.1.9.1,+             wai-cli ==0.2.3,+             wai-conduit ==3.0.0.4,+             wai-cors ==0.2.7,+             wai-enforce-https ==1.0.0.0,+             wai-eventsource ==3.0.0,+             wai-extra ==3.1.18,+             wai-feature-flags ==0.1.0.9,+             wai-handler-launch ==3.0.3.1,+             wai-logger ==2.5.0,+             wai-middleware-bearer ==1.0.3,+             wai-middleware-caching ==0.1.0.2,+             wai-middleware-caching-lru ==0.1.0.0,+             wai-middleware-caching-redis ==0.2.0.0,+             wai-middleware-clacks ==0.1.0.1,+             wai-middleware-delegate ==0.2.0.2,+             wai-middleware-metrics ==0.2.4,+             wai-middleware-prometheus ==1.0.1.0,+             wai-middleware-static ==0.9.4,+             wai-middleware-throttle ==0.3.0.1,+             wai-rate-limit ==0.3.0.0,+             wai-rate-limit-redis ==0.2.0.1,+             wai-saml2 ==0.6,+             wai-session ==0.3.3,+             wai-session-postgresql ==0.2.1.3,+             wai-slack-middleware ==0.2.0,+             wai-transformers ==0.1.0,+             wai-websockets ==3.0.1.2,+             wakame ==0.1.0.0,+             warp ==3.4.9,+             warp-tls ==3.4.14,+             wave ==0.2.1,+             wcwidth ==0.0.2,+             web3 ==1.1.0.0,+             web3-bignum ==1.1.0.0,+             web3-crypto ==1.1.0.0,+             web3-ethereum ==1.1.0.1,+             web3-polkadot ==1.1.0.1,+             web3-provider ==1.1.0.0,+             web3-solidity ==1.1.0.0,+             web-cookiejar ==0.1.3.2,+             webdriver ==0.12.0.1,+             webdriver-precore ==0.1.0.2,+             webdriver-wrapper ==0.2.0.1,+             webex-teams-api ==0.2.0.1,+             webex-teams-conduit ==0.2.0.1,+             webgear-core ==1.4.0,+             webgear-openapi ==1.4.0,+             webgear-server ==1.4.0,+             webgear-swagger ==1.4.0,+             webgear-swagger-ui ==1.4.0,+             webpage ==0.0.5.1,+             web-rep ==0.14.1.0,+             web-routes ==0.27.16,+             web-routes-th ==0.22.8.3,+             webrtc-vad ==0.1.0.3,+             websockets ==0.13.0.0,+             websockets-simple ==0.2.0,+             websockets-snap ==0.10.3.1,+             web-view ==0.7.0,+             weigh ==0.0.18,+             welford-online-mean-variance ==0.2.0.0,+             what4 ==1.6.3,+             wherefrom-compat ==0.1.1.1,+             which ==0.2.0.3,+             wide-word ==0.1.9.0,+             wild-bind ==0.1.2.15,+             wild-bind-x11 ==0.2.0.18,+             Win32 installed,+             Win32-notify ==0.3.0.3,+             windns ==0.1.0.1,+             witch ==1.3.1.0,+             withdependencies ==0.3.1,+             witherable ==0.5,+             within ==0.2.0.1,+             with-utf8 ==1.1.0.0,+             witness ==0.7,+             wizards ==1.0.3,+             wkt-types ==0.1.0.0,+             wled-json ==0.1.0.5,+             wl-pprint ==1.2.1,+             wl-pprint-annotated ==0.1.0.2,+             wl-pprint-text ==1.2.0.2,+             word8 ==0.1.3,+             word-compat ==0.0.6,+             word-trie ==0.3.0,+             word-wrap ==0.5,+             world-peace ==1.0.2.0,+             wrap ==0.0.0,+             wraxml ==0.5,+             wreq ==0.5.4.4,+             wreq-stringless ==0.5.9.1,+             writer-cps-transformers ==0.5.6.1,+             ws ==0.0.6,+             wuss ==2.0.2.7,+             X11 ==1.10.3,+             X11-xft ==0.3.4,+             x11-xim ==0.0.9.0,+             Xauth ==0.1,+             xdg-basedir ==0.2.2,+             xdg-desktop-entry ==0.1.1.5,+             xdg-userdirs ==0.1.0.2,+             xeno ==0.6,+             xhtml installed,+             xls ==0.1.3,+             xlsx ==1.1.4,+             xml ==1.3.14,+             xml-basic ==0.1.3.3,+             xmlbf ==0.7,+             xmlbf-xeno ==0.2.2,+             xmlbf-xmlhtml ==0.2.2,+             xml-conduit ==1.10.1.0,+             xmlgen ==0.6.2.2,+             xml-hamlet ==0.5.0.3,+             xml-helpers ==1.0.0,+             xmlhtml ==0.2.5.4,+             xml-html-qq ==0.1.0.1,+             xml-indexed-cursor ==0.1.1.0,+             xml-parser ==0.1.1.2,+             xml-picklers ==0.3.6,+             xml-to-json-fast ==2.0.0,+             xml-types ==0.3.8,+             xmonad ==0.18.1,+             xmonad-contrib ==0.18.2,+             xor ==0.0.1.4,+             xss-sanitize ==0.3.7.2,+             xxhash-ffi ==0.3.1,+             yaml ==0.11.11.2,+             yaml-unscrambler ==0.1.0.21,+             Yampa ==0.15,+             yarn-lock ==0.6.5,+             yaya ==0.6.2.3,+             yaya-containers ==0.1.2.2,+             yaya-hedgehog ==0.3.0.5,+             yaya-quickcheck ==0.2.0.3,+             yaya-unsafe ==0.4.1.4,+             yeshql-core ==4.2.0.0,+             yesod ==1.6.2.3,+             yesod-auth ==1.6.12.1,+             yesod-auth-basic ==0.1.0.3,+             yesod-auth-hashdb ==1.7.1.7,+             yesod-auth-oauth2 ==0.7.4.0,+             yesod-bin ==1.6.2.4,+             yesod-core ==1.6.29.1,+             yesod-eventsource ==1.6.0.2,+             yesod-form ==1.7.10,+             yesod-form-bootstrap4 ==3.0.1.1,+             yesod-gitrepo ==0.3.0,+             yesod-gitrev ==0.2.2,+             yesod-markdown ==0.12.6.14,+             yesod-newsfeed ==1.7.0.1,+             yesod-page-cursor ==2.0.1.0,+             yesod-paginator ==1.1.2.2,+             yesod-persistent ==1.6.0.9,+             yesod-recaptcha2 ==1.0.2.1,+             yesod-routes-flow ==3.0.0.2,+             yesod-sitemap ==1.6.0.1,+             yesod-static ==1.6.1.3,+             yesod-test ==1.6.19,+             yesod-websockets ==0.3.0.4,+             yes-precure5-command ==5.5.3,+             yggdrasil-schema ==1.0.0.6,+             yi ==0.19.3,+             yi-core ==0.19.4,+             yi-frontend-pango ==0.19.2,+             yi-frontend-vty ==0.19.1,+             yi-keymap-cua ==0.19.0,+             yi-keymap-emacs ==0.19.0,+             yi-keymap-vim ==0.19.0,+             yi-language ==0.19.2,+             yi-misc-modes ==0.19.1,+             yi-mode-haskell ==0.19.1,+             yi-mode-javascript ==0.19.1,+             yi-rope ==0.11,+             yjsvg ==0.2.0.1,+             yjtools ==0.9.18,+             yoga ==0.0.0.8,+             youtube ==0.2.1.1,+             zenacy-html ==2.1.2,+             zenacy-unicode ==1.0.3,+             zenc ==0.1.2,+             zeromq4-haskell ==0.8.0,+             zeromq4-patterns ==0.3.1.0,+             zigzag ==0.1.0.0,+             zim-parser ==0.2.1.0,+             zip ==2.2.2,+             zip-archive ==0.4.3.2,+             zippers ==0.3.2,+             zip-stream ==0.2.2.0,+             zlib ==0.7.1.1,+             zlib-bindings ==0.1.1.5,+             zlib-clib ==1.3.2,+             zot ==0.0.3,+             zstd ==0.1.3.0
+ cabal-stackage.project view
@@ -0,0 +1,9 @@+-- cabal.project file that is equivilant to building with stack.yaml,+-- with package versions from stackage.+packages:+  .+jobs: $ncpus+semaphore: True+import: cabal-stackage.config+constraints: blake3 ==0.3, libmagic ==1.3.2, ram ==0.22.0, botan-low ==0.2.0.1, botan-bindings ==0.3.0.0+flags: +Botan +MagicMime +Blake3 +XXH3 +OsPath +Dbus
cabal.project view
@@ -1,3 +1,5 @@+-- cabal.project file that is equivilant to building with stack.yaml,+-- with package versions from stackage. packages:   . jobs: $ncpus
git-annex.cabal view
@@ -1,5 +1,5 @@ Name: git-annex-Version: 10.20261026+Version: 10.20261113 Cabal-Version: 1.12 License: AGPL-3 Maintainer: Joey Hess <id@joeyh.name>@@ -35,9 +35,10 @@ -- Include only files that are needed make cabal install git-annex work. Extra-Source-Files:   stack.yaml-  stack-botan.yaml   stack-NoLLMDependencies.yaml   cabal.project+  cabal-stackage.project+  cabal-stackage.config   README   CHANGELOG   NEWS@@ -161,10 +162,6 @@ Flag Production   Description: Enable production build (slower build; faster binary) -Flag Botan-  Description: Build with the Botan C++ library for faster hashing-  Default: False- Flag TorrentParser   Description: Use haskell torrent library to parse torrent files @@ -297,7 +294,8 @@    warp-tls (>= 3.2.2),    crypton-connection (>= 0.4.3),    crypton-x509-store,-   aws (>= 0.24.1)+   aws (>= 0.24.1),+   botan-low (< 0.3)   CC-Options: -Wall   GHC-Options: -Wall -fno-warn-tabs  -Wincomplete-uni-patterns   Default-Language: Haskell2010@@ -311,9 +309,10 @@     Build-Depends:      base (>= 4.18.2.1 && < 4.23),      ram (< 0.21.0),+     network (< 3.2.9.0),      persistent (>= 2.13.3) && (< 2.15.0.0),      warp (< 3.4.11),-     magic (<= 1.1),+     http-semantics (< 0.4.2),      crypton (< 1.1.0),      tls (< 2.4.4)   else@@ -326,7 +325,7 @@   if flag(Memory)     Build-Depends: memory, crypton (< 1.1.0)   else-    Build-Depends: ram, crypton (>= 1.1.0)+    Build-Depends: memory, ram, crypton (>= 1.1.0)    -- Fully optimize for production.   if flag(Production)@@ -354,13 +353,6 @@     Build-Depends:       filepath-bytestring (>= 1.4.2.1.1) -  if flag(Botan)-    Build-Depends:-      botan-low (< 0.3)-    CPP-Options: -DWITH_BOTAN-    Other-Modules:-      Utility.Hash.Botan-   -- Disabled on arm until this issue is resolved:   -- https://github.com/k0001/hs-blake3/issues/8   if flag(Blake3) && (! arch(aarch64) && ! arch(arm))@@ -386,7 +378,8 @@       Win32 (>= 2.13.4.0),       setenv,       process (>= 1.6.2.0),-      silently (>= 1.2.5.1)+      silently (>= 1.2.5.1),+      nsis   else     Build-Depends: unix (>= 2.8.4) @@ -551,7 +544,9 @@     CPP-Options: -DWITH_TORRENTPARSER    if flag(MagicMime)-    Build-Depends: magic (<= 1.1)+    Build-Depends:+      libmagic (>= 1.3),+      os-string (>= 2.0.0)     CPP-Options: -DWITH_MAGICMIME    if flag(Benchmark)@@ -673,6 +668,7 @@     Build.Configure     Build.DesktopFile     Build.Mans+    Build.NullSoftInstaller     Build.TestConfig     Build.Version     BuildInfo@@ -800,6 +796,7 @@     Command.TestRemote     Command.Transferrer     Command.TransferKey+    Command.Transfers     Command.Trust     Command.Unannex     Command.Undo@@ -1136,6 +1133,7 @@     Utility.Glob     Utility.Gpg     Utility.Hash+    Utility.Hash.Botan     Utility.Hash.Crypton     Utility.Hash.Incremental     Utility.Hash.Types@@ -1150,6 +1148,7 @@     Utility.LockPool.LockHandle     Utility.LockPool.STM     Utility.LogFile+    Utility.LRU     Utility.Lsof     Utility.MagicWormhole     Utility.Matcher
git-annex.hs view
@@ -7,7 +7,7 @@  {-# LANGUAGE CPP #-} -import System.Environment (getArgs, getProgName)+import System.Environment (getArgs) import System.FilePath import Network.Socket (withSocketsDo) import qualified Data.Map as M@@ -27,6 +27,7 @@ import Utility.UserInfo import Utility.Env.Set #endif+import qualified Build.NullSoftInstaller  main :: IO () main = sanitizeTopLevelExceptionMessages $ withSocketsDo $ do@@ -35,13 +36,14 @@ #ifdef mingw32_HOST_OS 	winEnv #endif-	run ps =<< getProgName+	run ps =<< getCommandName   where 	run ps n = case M.lookup (takeFileName n) otherMulticallCommands of 		Just GitAnnexShell -> CmdLine.GitAnnexShell.run ps 		Just GitRemoteAnnex -> CmdLine.GitRemoteAnnex.run ps 		Just GitRemoteP2PAnnex -> CmdLine.GitRemoteP2PAnnex.run ps 		Just GitRemoteTorAnnex -> CmdLine.GitRemoteTorAnnex.run ps+		Just NullSoftInstaller -> Build.NullSoftInstaller.main 		Nothing -> CmdLine.GitAnnex.run 			Test.optParser 			Test.runner
stack-NoLLMDependencies.yaml view
@@ -9,7 +9,6 @@     debuglocks: false     benchmark: true     ospath: true-    botan: false     blake3: true     xxh3: true   file-io:@@ -28,6 +27,8 @@ - persistent-sqlite-2.13.3.0 - yesod-form-1.7.9.2 - yesod-static-1.6.1.2-- magic-1.1+- libmagic-1.3.2 - crypton-1.0.6 - tls-2.1.8+- botan-low-0.2.0.1+- botan-bindings-0.3.0.0
− stack-botan.yaml
@@ -1,29 +0,0 @@-flags:-  git-annex:-    NoLLMDependencies: false-    production: true-    assistant: true-    torrentparser: true-    magicmime: false-    dbus: false-    debuglocks: false-    benchmark: true-    ospath: true-    botan: true-    blake3: true-    xxh3: true-  file-io:-    os-string: true-  xxhash-ffi:-    pkg-config: false-packages:-- '.'-resolver: lts-24.52-extra-deps:-- aws-0.25.2-- file-io-0.2.0-- botan-low-0.2.0.1-- botan-bindings-0.3.0.0-- blake3-0.3-- magic-1.1-- ram-0.22.0
stack.yaml view
@@ -9,7 +9,6 @@     debuglocks: false     benchmark: true     ospath: true-    botan: false     blake3: true     xxh3: true   file-io:@@ -23,5 +22,7 @@ - aws-0.25.2 - file-io-0.2.0 - blake3-0.3-- magic-1.1+- libmagic-1.3.2 - ram-0.22.0+- botan-low-0.2.0.1+- botan-bindings-0.3.0.0