From a596377bd333385dc81d59c1e030ef1c78a2f3d7 Mon Sep 17 00:00:00 2001 From: Daniel McIlvaney Date: Tue, 22 Aug 2023 17:56:11 -0700 Subject: [PATCH 01/64] Add better backoff, semaphore to packer (#5931) -------- Co-authored-by: Pawel Winogrodzki Co-authored-by: Trung --- toolkit/tools/internal/retry/retry.go | 74 ++++++- toolkit/tools/internal/retry/retry_test.go | 214 +++++++++++++++++++++ toolkit/tools/srpmpacker/srpmpacker.go | 88 ++++++--- 3 files changed, 343 insertions(+), 33 deletions(-) create mode 100644 toolkit/tools/internal/retry/retry_test.go diff --git a/toolkit/tools/internal/retry/retry.go b/toolkit/tools/internal/retry/retry.go index 0a4d2595f8a..149b50317b9 100644 --- a/toolkit/tools/internal/retry/retry.go +++ b/toolkit/tools/internal/retry/retry.go @@ -4,16 +4,80 @@ package retry import ( + "math" "time" ) -// Run runs function up to attempts times, waiting i * sleep duration before each i-th attempt. -func Run(function func() error, attempts int, sleep time.Duration) (err error) { - for i := 0; i < attempts; i++ { - time.Sleep(time.Duration(i) * sleep) +// calculateDelay calculates the delay for the given failure count, sleep duration, and backoff exponent base. +// If the base is positive, it will calculate an exponential backoff. +func calculateExpDelay(failCount int, sleep time.Duration, backoffExponentBase float64) time.Duration { + if failCount <= 0 { + return 0 + } + // Calculate an exponential backoff. We calculate and sleep BEFORE we try to run the function, so we need to + // subtract 1 from the failCount to get the correct exponent. + + // The formula is: sleep * (backoffExpBase ^ (failCount-1)) + // For example, if sleep = 1 second, backoffExp = 2.0, failCount = 3 + // then the delay will be 1 * (2 ^ 2) = 4 seconds. + // (0 sec on the first call, 1 sec on the second call, 2 sec on the third call, etc.) + expRetry := math.Pow(backoffExponentBase, float64(failCount-1)) + return time.Duration(expRetry * float64(sleep)) +} + +func calculateLinearDelay(failCount int, sleep time.Duration) time.Duration { + if failCount <= 0 { + return 0 + } + return sleep * time.Duration(failCount) +} + +// backoffSleep sleeps for the given duration, unless the cancel channel is triggered or closed first. The cancel channel +// may be nil in which case the sleep will always complete. +func backoffSleep(delay time.Duration, cancel <-chan struct{}) (cancelled bool) { + select { + case <-time.After(delay): + case <-cancel: + cancelled = true + } + return +} + +// runWithBackoffInternal runs function up to 'attempts' times, waiting delayCalc(failCount) before each i-th attempt. +// delayCalc(0) is expected to return 0. +// The function will return early if the cancel channel is closed. +func runWithBackoffInternal(function func() error, delayCalc func(failCount int) time.Duration, attempts int, cancel <-chan struct{}) (wasCancelled bool, err error) { + for failures := 0; failures < attempts; failures++ { + delayTime := delayCalc(failures) + wasCancelled = backoffSleep(delayTime, cancel) + if wasCancelled { + break + } if err = function(); err == nil { break } } - return err + return wasCancelled, err +} + +// Run runs function up to 'attempts' times, waiting i * sleep duration before each i-th attempt. +func Run(function func() error, attempts int, sleep time.Duration) (err error) { + _, err = RunWithLinearBackoff(function, attempts, sleep, nil) + return +} + +// RunWithLinearBackoff runs function up to 'attempts' times, waiting i * sleep duration before each i-th attempt. An +// optional cancel channel can be provided to cancel the retry loop immediately by closing the channel. +func RunWithLinearBackoff(function func() error, attempts int, sleep time.Duration, cancel <-chan struct{}) (wasCancelled bool, err error) { + return runWithBackoffInternal(function, func(failCount int) time.Duration { + return calculateLinearDelay(failCount, sleep) + }, attempts, cancel) +} + +// RunWithExpBackoff runs function up to 'attempts' times, waiting 'backoffExponentBase^(i-1) * sleep' duration before +// each i-th attempt. An optional cancel channel can be provided to cancel the retry loop immediately by closing the channel. +func RunWithExpBackoff(function func() error, attempts int, sleep time.Duration, backoffExponentBase float64, cancel <-chan struct{}) (wasCancelled bool, err error) { + return runWithBackoffInternal(function, func(failCount int) time.Duration { + return calculateExpDelay(failCount, sleep, backoffExponentBase) + }, attempts, cancel) } diff --git a/toolkit/tools/internal/retry/retry_test.go b/toolkit/tools/internal/retry/retry_test.go new file mode 100644 index 00000000000..0ee10673c28 --- /dev/null +++ b/toolkit/tools/internal/retry/retry_test.go @@ -0,0 +1,214 @@ +package retry + +import ( + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +const ( + defaultTestTime = time.Millisecond * 100 + + // Tests won't run with perfect timing, so we need to allow for some fudge factor when we check maximum duration. + timingFudgeFactor = time.Millisecond * 100 +) + +func TestZeroBase(t *testing.T) { + // Two failures, 0.0 multiplier, should be 0 second delay + base := 0.0 + fails := 2 + val := calculateExpDelay(fails, defaultTestTime, base) + assert.Equal(t, time.Duration(0), val) +} + +func TestZeroFailuresTime(t *testing.T) { + // Zero failures, 1.0 base, should be 0 second delay + fails := 0 + base := 1.0 + val := calculateExpDelay(fails, defaultTestTime, base) + assert.Equal(t, time.Second*0, val) +} + +func TestZeroBaseTime(t *testing.T) { + // Three failures, 0.0 base, should be 0 second delay + fails := 3 + base := 0.0 + val := calculateExpDelay(fails, defaultTestTime, base) + assert.Equal(t, time.Second*0, val) +} + +func TestNegativeFailuresCountExp(t *testing.T) { + // Negative failures, 1.0 base, should be 0 second delay + fails := -1 + base := 1.0 + val := calculateExpDelay(fails, defaultTestTime, base) + assert.Equal(t, time.Second*0, val) +} + +func TestNegativeFailuresCountLinear(t *testing.T) { + // Negative failures, should be 0 second delay + fails := -1 + val := calculateLinearDelay(fails, defaultTestTime) + assert.Equal(t, time.Second*0, val) +} + +func TestCalcDelayBaseLinear(t *testing.T) { + // Delay vs. retry count for base = -1.0, delay = .1 seconds (ie legacy "linear" backoff) + var expectedValuesMillis1 = []int{0, 100, 200, 300, 400, 500} + + for failures, expected := range expectedValuesMillis1 { + expected := time.Duration(expected) * time.Millisecond + actual := calculateLinearDelay(failures, defaultTestTime) + assert.Equal(t, expected, actual) + } +} + +func TestCalcDelayExpBase2(t *testing.T) { + // Delay vs. retry count for base = 2.0, delay = 0.1 seconds + var expectedValuesMillis2 = []int{0, 100, 200, 400, 800, 1600} + + base := 2.0 + for failures, expected := range expectedValuesMillis2 { + expected := time.Duration(expected) * time.Millisecond + actual := calculateExpDelay(failures, defaultTestTime, base) + assert.Equal(t, expected, actual) + } +} + +func TestTotalRunTimeWithFailuresLinear(t *testing.T) { + attempts := 3 + startTime := time.Now() + cancelled, err := RunWithLinearBackoff(func() error { + return fmt.Errorf("test error") + }, attempts, defaultTestTime, nil) + endTime := time.Now() + assert.NotNil(t, err) + assert.False(t, cancelled) + // Delays should be 0 seconds, , .1 second, , .2 seconds, + // for a total of .3 seconds. + idealTime := time.Millisecond * 300 + minDelay := idealTime + maxDelay := idealTime + timingFudgeFactor + assert.GreaterOrEqual(t, endTime.Sub(startTime), minDelay) + assert.LessOrEqual(t, endTime.Sub(startTime), maxDelay) +} + +func TestTotalRunTimeWithFailuresDefaultRun(t *testing.T) { + attempts := 3 + // Ensure the default Run() method works the same way + startTime := time.Now() + err := Run(func() error { + return fmt.Errorf("test error") + }, attempts, defaultTestTime) + endTime := time.Now() + assert.NotNil(t, err) + // Delays should be 0 seconds, , .1 second, , .2 seconds, + // for a total of .3 seconds. + idealTime := time.Millisecond * 300 + minDelay := idealTime + maxDelay := idealTime + timingFudgeFactor + assert.GreaterOrEqual(t, endTime.Sub(startTime), minDelay) + assert.LessOrEqual(t, endTime.Sub(startTime), maxDelay) +} + +func TestTotalRunTimeWithFailuresBase2(t *testing.T) { + tries := 3 + base := 2.0 + startTime := time.Now() + cancelled, err := RunWithExpBackoff(func() error { + return fmt.Errorf("test error") + }, tries, defaultTestTime, base, nil) + endTime := time.Now() + assert.NotNil(t, err) + assert.False(t, cancelled) + // Delays should be 0 seconds, , .1 second, , .2 seconds, + // for a total of .3 seconds. + idealTime := time.Millisecond * 300 + minDelay := idealTime + maxDelay := idealTime + timingFudgeFactor + assert.GreaterOrEqual(t, endTime.Sub(startTime), minDelay) + assert.LessOrEqual(t, endTime.Sub(startTime), maxDelay) +} + +func TestTotalRunTimeWithSuccess(t *testing.T) { + tries := 3 + base := 2.0 + startTime := time.Now() + cancelled, err := RunWithExpBackoff(func() error { + return nil + }, tries, time.Second, base, nil) + endTime := time.Now() + assert.Nil(t, err) + assert.False(t, cancelled) + // Delays should be 0 seconds, + // for a total of 0 seconds. + maxDelay := timingFudgeFactor + assert.LessOrEqual(t, endTime.Sub(startTime), maxDelay) +} + +func TestCancelsEarlyWithSignalImmediately(t *testing.T) { + tries := 3 + base := 2.0 + cancelSignal := make(chan struct{}) + startTime := time.Now() + + // Send a signal immediately + close(cancelSignal) + + cancelled, err := RunWithExpBackoff(func() error { + return fmt.Errorf("test error") + }, tries, defaultTestTime, base, cancelSignal) + + endTime := time.Now() + // Error should be nil since we never ran the function before cancelling. + assert.Nil(t, err) + assert.True(t, cancelled) + // Delays should be 0 seconds, + // for a total of 0 seconds. + maxDelay := timingFudgeFactor + assert.LessOrEqual(t, endTime.Sub(startTime), maxDelay) +} + +func TestCancelsEarlyWithSignalAfterDelay(t *testing.T) { + tries := 3 + base := 2.0 + cancelTime := defaultTestTime * 2 + cancelSignal := make(chan struct{}) + startTime := time.Now() + + // Send a signal after the first delay (wait for the first failure before cancelling) + go func() { + time.Sleep(cancelTime) + close(cancelSignal) + }() + + cancelled, err := RunWithExpBackoff(func() error { + return fmt.Errorf("test error") + }, tries, defaultTestTime, base, cancelSignal) + + endTime := time.Now() + // Error should still be set since we ran the function at least once. + assert.NotNil(t, err) + assert.True(t, cancelled) + + // Delay should be 0.2 seconds before the signal is received + idealTime := cancelTime + minDelay := idealTime + maxDelay := idealTime + timingFudgeFactor + assert.GreaterOrEqual(t, endTime.Sub(startTime), minDelay) + assert.LessOrEqual(t, endTime.Sub(startTime), maxDelay) +} + +func TestNonCancelGivesCorrectError(t *testing.T) { + tries := 1 + base := 2.0 + cancelled, err := RunWithExpBackoff(func() error { + return fmt.Errorf("test error") + }, tries, defaultTestTime, base, nil) + + assert.NotNil(t, err) + assert.Equal(t, "test error", err.Error()) + assert.False(t, cancelled) +} diff --git a/toolkit/tools/srpmpacker/srpmpacker.go b/toolkit/tools/srpmpacker/srpmpacker.go index b0525545d1f..4d923b785d6 100644 --- a/toolkit/tools/srpmpacker/srpmpacker.go +++ b/toolkit/tools/srpmpacker/srpmpacker.go @@ -67,7 +67,8 @@ const ( const ( defaultBuildDir = "./build/SRPMS" - defaultWorkerCount = "10" + defaultWorkerCount = "80" + defaultNetOpsCount = "10" ) // sourceRetrievalConfiguration holds information on where to hydrate files from. @@ -111,7 +112,8 @@ var ( packListFile = app.Flag("pack-list", "Path to a list of SPECs to pack. If empty will pack all SPECs.").ExistingFile() runCheck = app.Flag("run-check", "Whether or not to run the spec file's check section during package build.").Bool() - workers = app.Flag("workers", "Number of concurrent goroutines to parse with.").Default(defaultWorkerCount).Int() + workers = app.Flag("workers", "Number of concurrent goroutines to parse with.").Default(defaultWorkerCount).Uint() + concurrentNetOps = app.Flag("concurrent-net-ops", "Number of concurrent network operations to perform.").Default(defaultNetOpsCount).Uint() repackAll = app.Flag("repack", "Rebuild all SRPMs, even if already built.").Bool() nestedSourcesDir = app.Flag("nested-sources", "Set if for a given SPEC, its sources are contained in a SOURCES directory next to the SPEC file.").Bool() @@ -143,10 +145,6 @@ func main() { timestamp.StartEvent("configuring packer", nil) - if *workers <= 0 { - logger.Log.Fatalf("Value in --workers must be greater than zero. Found %d", *workers) - } - // Create a template configuration that all packed SRPM will be based on. var templateSrcConfig sourceRetrievalConfiguration @@ -192,7 +190,7 @@ func main() { packList, err := parsePackListFile(*packListFile) logger.PanicOnError(err) - err = createAllSRPMsWrapper(*specsDir, *distTag, *buildDir, *outDir, *workerTar, *workers, *nestedSourcesDir, *repackAll, *runCheck, packList, templateSrcConfig) + err = createAllSRPMsWrapper(*specsDir, *distTag, *buildDir, *outDir, *workerTar, *workers, *concurrentNetOps, *nestedSourcesDir, *repackAll, *runCheck, packList, templateSrcConfig) logger.PanicOnError(err) } @@ -231,7 +229,7 @@ func parsePackListFile(packListFile string) (packList map[string]bool, err error // createAllSRPMsWrapper wraps createAllSRPMs to conditionally run it inside a chroot. // If workerTar is non-empty, packing will occur inside a chroot, otherwise it will run on the host system. -func createAllSRPMsWrapper(specsDir, distTag, buildDir, outDir, workerTar string, workers int, nestedSourcesDir, repackAll, runCheck bool, packList map[string]bool, templateSrcConfig sourceRetrievalConfiguration) (err error) { +func createAllSRPMsWrapper(specsDir, distTag, buildDir, outDir, workerTar string, workers, concurrentNetOps uint, nestedSourcesDir, repackAll, runCheck bool, packList map[string]bool, templateSrcConfig sourceRetrievalConfiguration) (err error) { var chroot *safechroot.Chroot originalOutDir := outDir if workerTar != "" { @@ -244,7 +242,7 @@ func createAllSRPMsWrapper(specsDir, distTag, buildDir, outDir, workerTar string } doCreateAll := func() error { - return createAllSRPMs(specsDir, distTag, buildDir, outDir, workers, nestedSourcesDir, repackAll, runCheck, packList, templateSrcConfig) + return createAllSRPMs(specsDir, distTag, buildDir, outDir, workers, concurrentNetOps, nestedSourcesDir, repackAll, runCheck, packList, templateSrcConfig) } if chroot != nil { @@ -270,7 +268,7 @@ func createAllSRPMsWrapper(specsDir, distTag, buildDir, outDir, workerTar string } // createAllSRPMs will find all SPEC files in specsDir and pack SRPMs for them if needed. -func createAllSRPMs(specsDir, distTag, buildDir, outDir string, workers int, nestedSourcesDir, repackAll, runCheck bool, packList map[string]bool, templateSrcConfig sourceRetrievalConfiguration) (err error) { +func createAllSRPMs(specsDir, distTag, buildDir, outDir string, workers, concurrentNetOps uint, nestedSourcesDir, repackAll, runCheck bool, packList map[string]bool, templateSrcConfig sourceRetrievalConfiguration) (err error) { logger.Log.Infof("Finding all SPEC files") timestamp.StartEvent("packing SRPMS", nil) defer timestamp.StopEvent(nil) @@ -287,7 +285,7 @@ func createAllSRPMs(specsDir, distTag, buildDir, outDir string, workers int, nes } timestamp.StopEvent(nil) - err = packSRPMs(specStates, distTag, buildDir, templateSrcConfig, workers) + err = packSRPMs(specStates, distTag, buildDir, templateSrcConfig, workers, concurrentNetOps) return } @@ -398,7 +396,7 @@ func createChroot(workerTar, buildDir, outDir, specsDir string) (chroot *safechr // calculateSPECsToRepack will check which SPECs should be packed. // If the resulting SRPM does not exist, or is older than a modification to // one of the files used by the SPEC then it is repacked. -func calculateSPECsToRepack(specFiles []string, distTag, outDir string, nestedSourcesDir, repackAll, runCheck bool, workers int) (states []*specState, err error) { +func calculateSPECsToRepack(specFiles []string, distTag, outDir string, nestedSourcesDir, repackAll, runCheck bool, workers uint) (states []*specState, err error) { var wg sync.WaitGroup requests := make(chan string, len(specFiles)) @@ -413,7 +411,7 @@ func calculateSPECsToRepack(specFiles []string, distTag, outDir string, nestedSo } // Start the workers now so they begin working as soon as a new job is buffered. - for i := 0; i < workers; i++ { + for i := uint(0); i < workers; i++ { wg.Add(1) go specsToPackWorker(requests, results, cancel, &wg, distTag, outDir, arch, nestedSourcesDir, repackAll, runCheck) } @@ -572,7 +570,7 @@ func specsToPackWorker(requests <-chan string, results chan<- *specState, cancel } // packSRPMs will pack any SPEC files that have been marked as `toPack`. -func packSRPMs(specStates []*specState, distTag, buildDir string, templateSrcConfig sourceRetrievalConfiguration, workers int) (err error) { +func packSRPMs(specStates []*specState, distTag, buildDir string, templateSrcConfig sourceRetrievalConfiguration, workers, concurrentNetOps uint) (err error) { tsRoot, _ := timestamp.StartEvent("packing SRPMs", nil) defer timestamp.StopEvent(nil) var wg sync.WaitGroup @@ -580,11 +578,12 @@ func packSRPMs(specStates []*specState, distTag, buildDir string, templateSrcCon allSpecStates := make(chan *specState, len(specStates)) results := make(chan *packResult, len(specStates)) cancel := make(chan struct{}) + netOpsSemaphore := make(chan struct{}, concurrentNetOps) // Start the workers now so they begin working as soon as a new job is buffered. - for i := 0; i < workers; i++ { + for i := 0; uint(i) < workers; i++ { wg.Add(1) - go packSRPMWorker(allSpecStates, results, cancel, &wg, distTag, buildDir, templateSrcConfig, tsRoot) + go packSRPMWorker(allSpecStates, results, cancel, netOpsSemaphore, &wg, distTag, buildDir, templateSrcConfig, tsRoot) } for _, state := range specStates { @@ -598,7 +597,7 @@ func packSRPMs(specStates []*specState, distTag, buildDir string, templateSrcCon result := <-results if result.err != nil { - logger.Log.Errorf("Failed to pack (%s). Error: %s", result.specFile, result.err) + logger.Log.Errorf("Failed to pack (%s). Cancelling outstanding workers. Error: %s", result.specFile, result.err) err = result.err close(cancel) break @@ -619,7 +618,7 @@ func packSRPMs(specStates []*specState, distTag, buildDir string, templateSrcCon } // packSRPMWorker will process a channel of SPECs and pack any that are marked as toPack. -func packSRPMWorker(allSpecStates <-chan *specState, results chan<- *packResult, cancel <-chan struct{}, wg *sync.WaitGroup, distTag, buildDir string, templateSrcConfig sourceRetrievalConfiguration, tsRoot *timestamp.TimeStamp) { +func packSRPMWorker(allSpecStates <-chan *specState, results chan<- *packResult, cancel <-chan struct{}, netOpsSemaphore chan struct{}, wg *sync.WaitGroup, distTag, buildDir string, templateSrcConfig sourceRetrievalConfiguration, tsRoot *timestamp.TimeStamp) { defer wg.Done() for specState := range allSpecStates { @@ -660,7 +659,7 @@ func packSRPMWorker(allSpecStates <-chan *specState, results chan<- *packResult, continue } - outputPath, err := packSingleSPEC(specState.specFile, specState.srpmFile, signaturesFilePath, buildDir, fullOutDirPath, distTag, srcConfig) + outputPath, err := packSingleSPEC(specState.specFile, specState.srpmFile, signaturesFilePath, buildDir, fullOutDirPath, distTag, srcConfig, cancel, netOpsSemaphore) if err != nil { result.err = err results <- result @@ -718,7 +717,7 @@ func readSignatures(signaturesFilePath string) (readSignatures map[string]string } // packSingleSPEC will pack a given SPEC file into an SRPM. -func packSingleSPEC(specFile, srpmFile, signaturesFile, buildDir, outDir, distTag string, srcConfig sourceRetrievalConfiguration) (outputPath string, err error) { +func packSingleSPEC(specFile, srpmFile, signaturesFile, buildDir, outDir, distTag string, srcConfig sourceRetrievalConfiguration, cancel <-chan struct{}, netOpsSemaphore chan struct{}) (outputPath string, err error) { srpmName := filepath.Base(srpmFile) workingDir := filepath.Join(buildDir, srpmName) @@ -753,13 +752,13 @@ func packSingleSPEC(specFile, srpmFile, signaturesFile, buildDir, outDir, distTa } // Hydrate all patches. Exclusively using `sourceDir` - err = hydrateFiles(fileTypePatch, specFile, workingDir, srcConfig, currentSignatures, defines) + err = hydrateFiles(fileTypePatch, specFile, workingDir, srcConfig, currentSignatures, defines, nil, nil) if err != nil { return } // Hydrate all sources. Download any missing ones not in `sourceDir` - err = hydrateFiles(fileTypeSource, specFile, workingDir, srcConfig, currentSignatures, defines) + err = hydrateFiles(fileTypeSource, specFile, workingDir, srcConfig, currentSignatures, defines, cancel, netOpsSemaphore) if err != nil { return } @@ -821,7 +820,7 @@ func readSPECTagArray(specFile, sourceDir, tag string, arch string, defines map[ // hydrateFiles will attempt to retrieve all sources needed to build an SRPM from a SPEC. // Will alter `currentSignatures`, -func hydrateFiles(fileTypeToHydrate fileType, specFile, workingDir string, srcConfig sourceRetrievalConfiguration, currentSignatures, defines map[string]string) (err error) { +func hydrateFiles(fileTypeToHydrate fileType, specFile, workingDir string, srcConfig sourceRetrievalConfiguration, currentSignatures, defines map[string]string, cancel <-chan struct{}, netOpsSemaphore chan struct{}) (err error) { const ( downloadMissingPatchFiles = false skipPatchSignatures = true @@ -882,7 +881,10 @@ func hydrateFiles(fileTypeToHydrate fileType, specFile, workingDir string, srcCo } if hydrateRemotely && srcConfig.sourceURL != "" { - hydrateFromRemoteSource(fileHydrationState, newSourceDir, srcConfig, skipSignatureHandling, currentSignatures) + err = hydrateFromRemoteSource(fileHydrationState, newSourceDir, srcConfig, skipSignatureHandling, currentSignatures, cancel, netOpsSemaphore) + if err != nil { + return + } } for fileNeeded, alreadyHydrated := range fileHydrationState { @@ -941,11 +943,15 @@ func hydrateFromLocalSource(fileHydrationState map[string]bool, newSourceDir str // hydrateFromRemoteSource will update fileHydrationState. // Will alter `currentSignatures`. -func hydrateFromRemoteSource(fileHydrationState map[string]bool, newSourceDir string, srcConfig sourceRetrievalConfiguration, skipSignatureHandling bool, currentSignatures map[string]string) { +func hydrateFromRemoteSource(fileHydrationState map[string]bool, newSourceDir string, srcConfig sourceRetrievalConfiguration, skipSignatureHandling bool, currentSignatures map[string]string, cancel <-chan struct{}, netOpsSemaphore chan struct{}) (err error) { const ( - downloadRetryAttempts = 3 + // With 5 attempts, initial delay of 1 second, and a backoff factor of 2.0 the total time spent retrying will be + // ~30 seconds. + downloadRetryAttempts = 5 + failureBackoffBase = 2.0 downloadRetryDuration = time.Second ) + var errPackerCancelReceived = fmt.Errorf("packer cancel signal received") for fileName, alreadyHydrated := range fileHydrationState { if alreadyHydrated { @@ -956,16 +962,40 @@ func hydrateFromRemoteSource(fileHydrationState map[string]bool, newSourceDir st url := network.JoinURL(srcConfig.sourceURL, fileName) - err := retry.Run(func() error { + // Limit the number of concurrent network operations by pushing a struct{} into the channel. This will block until + // another operation completes and removes the struct{} from the channel. + if netOpsSemaphore != nil { + select { + case netOpsSemaphore <- struct{}{}: + case <-cancel: + logger.Log.Debug("Cancellation signal received at network operation semaphore") + err = errPackerCancelReceived + return + } + } + + cancelled := false + cancelled, err = retry.RunWithExpBackoff(func() error { err := network.DownloadFile(url, destinationFile, srcConfig.caCerts, srcConfig.tlsCerts) if err != nil { logger.Log.Warnf("Failed to download (%s). Error: %s", url, err) } return err - }, downloadRetryAttempts, downloadRetryDuration) + }, downloadRetryAttempts, downloadRetryDuration, failureBackoffBase, cancel) + + if netOpsSemaphore != nil { + // Clear the channel to allow another operation to start + <-netOpsSemaphore + } + + if cancelled { + err = errPackerCancelReceived + return + } if err != nil { + // We may intentionally fail early due to a cancellation signal, stop immediately if that is the case. continue } @@ -988,6 +1018,8 @@ func hydrateFromRemoteSource(fileHydrationState map[string]bool, newSourceDir st fileHydrationState[fileName] = true logger.Log.Debugf("Hydrated (%s) from (%s)", fileName, url) } + + return nil } // validateSignature will compare the SHA256 of the file at path against the signature for it in srcConfig.signatureLookup From dbf2b643fa1b38ac7d6825110679aa78576b4bd7 Mon Sep 17 00:00:00 2001 From: Daniel McIlvaney Date: Tue, 22 Aug 2023 17:57:20 -0700 Subject: [PATCH 02/64] Make specreader tool run in parallel with graphpkgfetcher tool. (#5924) --------- Co-authored-by: Pawel Winogrodzki --- toolkit/scripts/pkggen.mk | 15 +++-- .../tools/internal/packlist/packagelist.go | 48 ++++++++++++++ toolkit/tools/specreader/specreader.go | 62 +++++++++++++++---- toolkit/tools/srpmpacker/srpmpacker.go | 37 +---------- 4 files changed, 111 insertions(+), 51 deletions(-) create mode 100644 toolkit/tools/internal/packlist/packagelist.go diff --git a/toolkit/scripts/pkggen.mk b/toolkit/scripts/pkggen.mk index b4780ffe78a..8e952cb8c67 100644 --- a/toolkit/scripts/pkggen.mk +++ b/toolkit/scripts/pkggen.mk @@ -18,7 +18,7 @@ pkggen_local_repo = $(MANIFESTS_DIR)/package/local.repo graphpkgfetcher_cloned_repo = $(MANIFESTS_DIR)/package/fetcher.repo # SPECs and Built RPMs -build_specs = $(call shell_real_build_only, find $(BUILD_SPECS_DIR)/ -type f -name '*.spec') +build_specs = $(call shell_real_build_only, find $(SPECS_DIR)/ -type f -name '*.spec') build_spec_dirs = $(foreach spec,$(build_specs),$(dir $(spec))) pkggen_rpms = $(call shell_real_build_only, find $(RPMS_DIR)/* 2>/dev/null ) @@ -59,6 +59,7 @@ clean-spec-parse: @echo Verifying no mountpoints present in $(parse_working_dir) $(SCRIPTS_DIR)/safeunmount.sh "$(parse_working_dir)" && \ rm -rf $(parse_working_dir) + rm -rf $(specs_file) clean-ccache: rm -rf $(CCACHE_DIR) @@ -74,10 +75,14 @@ analyze-built-graph: $(go-graphanalytics) exit 1; \ fi -# Parse all specs in $(BUILD_SPECS_DIR) and generate a specs.json file encoding all dependency information -$(specs_file): $(chroot_worker) $(BUILD_SPECS_DIR) $(build_specs) $(build_spec_dirs) $(go-specreader) $(depend_RUN_CHECK) +# Parse specs in $(SPECS_DIR) and generate a specs.json file encoding all dependency information +# We look at the same pack list as the srpmpacker tool via the target $(srpm_pack_list_file), which +# is build from the contents of $(SRPM_PACK_LIST) if it is set. We only parse the spec files we will +# actually pack. +$(specs_file): $(chroot_worker) $(SPECS_DIR) $(build_specs) $(build_spec_dirs) $(go-specreader) $(depend_SPECS_DIR) $(srpm_pack_list_file) $(depend_RUN_CHECK) $(go-specreader) \ - --dir $(BUILD_SPECS_DIR) \ + --dir $(SPECS_DIR) \ + $(if $(SRPM_PACK_LIST),--spec-list=$(srpm_pack_list_file)) \ --build-dir $(parse_working_dir) \ --srpm-dir $(BUILD_SRPMS_DIR) \ --rpm-dir $(RPMS_DIR) \ @@ -224,7 +229,7 @@ $(RPMS_DIR): @touch $@ endif -$(STATUS_FLAGS_DIR)/build-rpms.flag: $(preprocessed_file) $(chroot_worker) $(go-scheduler) $(go-pkgworker) $(depend_STOP_ON_PKG_FAIL) $(CONFIG_FILE) $(depend_CONFIG_FILE) $(depend_PACKAGE_BUILD_LIST) $(depend_PACKAGE_REBUILD_LIST) $(depend_PACKAGE_IGNORE_LIST) $(depend_TEST_RUN_LIST) $(depend_TEST_RERUN_LIST) $(depend_TEST_IGNORE_LIST) $(pkggen_rpms) +$(STATUS_FLAGS_DIR)/build-rpms.flag: $(preprocessed_file) $(chroot_worker) $(go-scheduler) $(go-pkgworker) $(depend_STOP_ON_PKG_FAIL) $(CONFIG_FILE) $(depend_CONFIG_FILE) $(depend_PACKAGE_BUILD_LIST) $(depend_PACKAGE_REBUILD_LIST) $(depend_PACKAGE_IGNORE_LIST) $(depend_TEST_RUN_LIST) $(depend_TEST_RERUN_LIST) $(depend_TEST_IGNORE_LIST) $(pkggen_rpms) $(srpms) $(BUILD_SRPMS_DIR) $(go-scheduler) \ --input="$(preprocessed_file)" \ --output="$(built_file)" \ diff --git a/toolkit/tools/internal/packlist/packagelist.go b/toolkit/tools/internal/packlist/packagelist.go new file mode 100644 index 00000000000..cd5e6142ee0 --- /dev/null +++ b/toolkit/tools/internal/packlist/packagelist.go @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +package packagelist + +import ( + "bufio" + "fmt" + "os" + "strings" + + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/timestamp" +) + +// ParsePackageListFile will parse a list of packages to pack or parse, if one is specified. +// Duplicate list entries in the file will be removed. +// If no path is specified, nil will be returned. +// A set of [package name] -> [true] will be returned. +func ParsePackageListFile(packageListFile string) (packageList map[string]bool, err error) { + timestamp.StartEvent("parse list", nil) + defer timestamp.StopEvent(nil) + + if packageListFile == "" { + return + } + + packageList = make(map[string]bool) + + file, err := os.Open(packageListFile) + if err != nil { + return + } + defer file.Close() + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line != "" { + packageList[line] = true + } + } + + if len(packageList) == 0 { + err = fmt.Errorf("cannot have empty pack list (%s)", packageListFile) + } + + return +} diff --git a/toolkit/tools/specreader/specreader.go b/toolkit/tools/specreader/specreader.go index 03f2163c53b..28789db0273 100644 --- a/toolkit/tools/specreader/specreader.go +++ b/toolkit/tools/specreader/specreader.go @@ -20,6 +20,7 @@ import ( "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/exe" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/file" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/logger" + packagelist "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/packlist" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/pkgjson" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/rpm" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/safechroot" @@ -62,12 +63,13 @@ type parseResult struct { } const ( - defaultWorkerCount = "10" + defaultWorkerCount = "100" ) var ( app = kingpin.New("specreader", "A tool to parse spec dependencies into JSON") specsDir = exe.InputDirFlag(app, "Directory to scan for SPECS") + specListFile = app.Flag("spec-list", "Path to a list of SPECs to parse. If empty will parse all SPECs.").ExistingFile() output = exe.OutputFlag(app, "Output file to export the JSON") workers = app.Flag("workers", "Number of concurrent goroutines to parse with").Default(defaultWorkerCount).Int() buildDir = app.Flag("build-dir", "Directory to store temporary files while parsing.").String() @@ -106,13 +108,22 @@ func main() { toolchainRPMs, err := schedulerutils.ReadReservedFilesList(*toolchainManifest) logger.PanicOnError(err, "Unable to read toolchain manifest file '%s': %s", *toolchainManifest, err) - err = parseSPECsWrapper(*buildDir, *specsDir, *rpmsDir, *srpmsDir, *existingToolchainRpmDir, *distTag, *output, *workerTar, toolchainRPMs, *workers, *runCheck) + // A parse list may be provided, if so only parse this subset. + // If none is provided, parse all specs. + specListSet, err := packagelist.ParsePackageListFile(*specListFile) + logger.PanicOnError(err) + + // Convert specsDir to an absolute path + specsAbsDir, err := filepath.Abs(*specsDir) + logger.PanicOnError(err, "Unable to get absolute path for specs directory '%s': %s", *specsDir, err) + + err = parseSPECsWrapper(*buildDir, specsAbsDir, *rpmsDir, *srpmsDir, *existingToolchainRpmDir, *distTag, *output, *workerTar, specListSet, toolchainRPMs, *workers, *runCheck) logger.PanicOnError(err) } // parseSPECsWrapper wraps parseSPECs to conditionally run it inside a chroot. // If workerTar is non-empty, parsing will occur inside a chroot, otherwise it will run on the host system. -func parseSPECsWrapper(buildDir, specsDir, rpmsDir, srpmsDir, toolchainDir, distTag, outputFile, workerTar string, toolchainRPMs []string, workers int, runCheck bool) (err error) { +func parseSPECsWrapper(buildDir, specsDir, rpmsDir, srpmsDir, toolchainDir, distTag, outputFile, workerTar string, specListSet map[string]bool, toolchainRPMs []string, workers int, runCheck bool) (err error) { var ( chroot *safechroot.Chroot packageRepo *pkgjson.PackageRepo @@ -136,13 +147,13 @@ func parseSPECsWrapper(buildDir, specsDir, rpmsDir, srpmsDir, toolchainDir, dist var parseError error if *targetArch == "" { - packageRepo, parseError = parseSPECs(specsDir, rpmsDir, srpmsDir, toolchainDir, distTag, buildArch, toolchainRPMs, workers, runCheck) + packageRepo, parseError = parseSPECs(specsDir, rpmsDir, srpmsDir, toolchainDir, distTag, buildArch, specListSet, toolchainRPMs, workers, runCheck) if parseError != nil { err := fmt.Errorf("failed to parse native specs (%w)", parseError) return err } } else { - packageRepo, parseError = parseSPECs(specsDir, rpmsDir, srpmsDir, toolchainDir, distTag, *targetArch, toolchainRPMs, workers, runCheck) + packageRepo, parseError = parseSPECs(specsDir, rpmsDir, srpmsDir, toolchainDir, distTag, *targetArch, specListSet, toolchainRPMs, workers, runCheck) if parseError != nil { err := fmt.Errorf("failed to parse cross specs (%w)", parseError) return err @@ -224,8 +235,41 @@ func createChroot(workerTar, buildDir, specsDir, srpmsDir string) (chroot *safec return } +func findSpecFiles(specsDir string, specListSet map[string]bool) (specFiles []string, err error) { + // Find the filepath for each spec in the SPECS directory. + if len(specListSet) == 0 { + specSearch, err := filepath.Abs(filepath.Join(specsDir, "**/*.spec")) + if err != nil { + err = fmt.Errorf("invalid spec dir: '%s'. Error:\n%w", specsDir, err) + return nil, err + } + specFiles, err = filepath.Glob(specSearch) + if err != nil { + err = fmt.Errorf("failed to find *.spec files. Check that '%s' is the correct directory. Error:\n%w", specsDir, err) + return nil, err + } + } else { + for specName := range specListSet { + specSearch := filepath.Join(specsDir, fmt.Sprintf("**/%s.spec", specName)) + matchingSpecFiles, err := filepath.Glob(specSearch) + + // If a SPEC is in the parse list, it should be parsed. + if err != nil { + err = fmt.Errorf("spec search failed on '%s'. Error:\n%w", specSearch, err) + return nil, err + } + if len(matchingSpecFiles) != 1 { + err = fmt.Errorf("unexpected number of matches '%d' for spec file '%s'", len(matchingSpecFiles), specName) + return nil, err + } + specFiles = append(specFiles, matchingSpecFiles[0]) + } + } + return +} + // parseSPECs will parse all specs in specsDir and return a summary of the SPECs. -func parseSPECs(specsDir, rpmsDir, srpmsDir, toolchainDir, distTag, arch string, toolchainRPMs []string, workers int, runCheck bool) (packageRepo *pkgjson.PackageRepo, err error) { +func parseSPECs(specsDir, rpmsDir, srpmsDir, toolchainDir, distTag, arch string, specListSet map[string]bool, toolchainRPMs []string, workers int, runCheck bool) (packageRepo *pkgjson.PackageRepo, err error) { var ( packageList []*pkgjson.Package wg sync.WaitGroup @@ -234,11 +278,7 @@ func parseSPECs(specsDir, rpmsDir, srpmsDir, toolchainDir, distTag, arch string, packageRepo = &pkgjson.PackageRepo{} - // Find the filepath for each spec in the SPECS directory. - specSearch, err := filepath.Abs(filepath.Join(specsDir, "**/*.spec")) - if err == nil { - specFiles, err = filepath.Glob(specSearch) - } + specFiles, err = findSpecFiles(specsDir, specListSet) if err != nil { logger.Log.Errorf("Failed to find *.spec files. Check that %s is the correct directory. Error: %v", specsDir, err) return diff --git a/toolkit/tools/srpmpacker/srpmpacker.go b/toolkit/tools/srpmpacker/srpmpacker.go index 4d923b785d6..b06c1117358 100644 --- a/toolkit/tools/srpmpacker/srpmpacker.go +++ b/toolkit/tools/srpmpacker/srpmpacker.go @@ -4,7 +4,6 @@ package main import ( - "bufio" "crypto/tls" "crypto/x509" "fmt" @@ -25,6 +24,7 @@ import ( "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/jsonutils" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/logger" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/network" + packagelist "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/packlist" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/retry" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/rpm" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/safechroot" @@ -187,46 +187,13 @@ func main() { // A pack list may be provided, if so only pack this subset. // If non is provided, pack all srpms. - packList, err := parsePackListFile(*packListFile) + packList, err := packagelist.ParsePackageListFile(*packListFile) logger.PanicOnError(err) err = createAllSRPMsWrapper(*specsDir, *distTag, *buildDir, *outDir, *workerTar, *workers, *concurrentNetOps, *nestedSourcesDir, *repackAll, *runCheck, packList, templateSrcConfig) logger.PanicOnError(err) } -// parsePackListFile will parse a list of packages to pack if one is specified. -// Duplicate list entries in the file will be removed. -func parsePackListFile(packListFile string) (packList map[string]bool, err error) { - timestamp.StartEvent("parse list", nil) - defer timestamp.StopEvent(nil) - - if packListFile == "" { - return - } - - packList = make(map[string]bool) - - file, err := os.Open(packListFile) - if err != nil { - return - } - defer file.Close() - - scanner := bufio.NewScanner(file) - for scanner.Scan() { - line := strings.TrimSpace(scanner.Text()) - if line != "" { - packList[line] = true - } - } - - if len(packList) == 0 { - err = fmt.Errorf("cannot have empty pack list (%s)", packListFile) - } - - return -} - // createAllSRPMsWrapper wraps createAllSRPMs to conditionally run it inside a chroot. // If workerTar is non-empty, packing will occur inside a chroot, otherwise it will run on the host system. func createAllSRPMsWrapper(specsDir, distTag, buildDir, outDir, workerTar string, workers, concurrentNetOps uint, nestedSourcesDir, repackAll, runCheck bool, packList map[string]bool, templateSrcConfig sourceRetrievalConfiguration) (err error) { From 55e9faacd9d8187401d9c189100634d410b8ad62 Mon Sep 17 00:00:00 2001 From: Muhammad Falak R Wani Date: Wed, 23 Aug 2023 07:05:05 +0530 Subject: [PATCH 03/64] nginx: add otel_ngx_module subpackage (#6012) Add OpenTelemetry distributed tracing support to nginx. Signed-off-by: Muhammad Falak R Wani --- SPECS/nginx/nginx.signatures.json | 11 ++++++----- SPECS/nginx/nginx.spec | 32 +++++++++++++++++++++++++++++-- cgmanifest.json | 10 ++++++++++ 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/SPECS/nginx/nginx.signatures.json b/SPECS/nginx/nginx.signatures.json index 490dbb8c0cf..48e23359080 100644 --- a/SPECS/nginx/nginx.signatures.json +++ b/SPECS/nginx/nginx.signatures.json @@ -1,7 +1,8 @@ { - "Signatures": { - "nginx-njs-0.7.12.tar.gz": "7a75a39022dfb58dbf461053903a07cc48dd4942f7d82a46601819c1b0077687", - "nginx.service": "73a1321ae35eafc4e02614cde224fc0bf20ceba97f969b3373dd73c15c22a0e1", - "nginx-1.22.1.tar.gz": "9ebb333a9e82b952acd3e2b4aeb1d4ff6406f72491bab6cd9fe69f0dea737f31" - } + "Signatures": { + "nginx-1.22.1.tar.gz": "9ebb333a9e82b952acd3e2b4aeb1d4ff6406f72491bab6cd9fe69f0dea737f31", + "nginx-njs-0.7.12.tar.gz": "7a75a39022dfb58dbf461053903a07cc48dd4942f7d82a46601819c1b0077687", + "nginx.service": "73a1321ae35eafc4e02614cde224fc0bf20ceba97f969b3373dd73c15c22a0e1", + "opentelemetry-cpp-contrib-37e4466d882cbddff6f607a20fe327060de76166.tar.gz": "daf07cc694ee12e5e37a1aa5f70619b65ff02c24c3effe628b2e59e84a2e6444" + } } \ No newline at end of file diff --git a/SPECS/nginx/nginx.spec b/SPECS/nginx/nginx.spec index 2268b4c9578..aa0c00dc1bd 100644 --- a/SPECS/nginx/nginx.spec +++ b/SPECS/nginx/nginx.spec @@ -1,12 +1,13 @@ %global nginx_user nginx %global njs_version 0.7.12 +%global opentelemetry_cpp_contrib_git_commit 37e4466d882cbddff6f607a20fe327060de76166 Summary: High-performance HTTP server and reverse proxy Name: nginx # Currently on "stable" version of nginx from https://nginx.org/en/download.html. # Note: Stable versions are even (1.20), mainline versions are odd (1.21) Version: 1.22.1 -Release: 8%{?dist} +Release: 9%{?dist} License: BSD-2-Clause Vendor: Microsoft Corporation Distribution: Mariner @@ -15,6 +16,7 @@ URL: https://nginx.org/ Source0: https://nginx.org/download/%{name}-%{version}.tar.gz Source1: nginx.service Source2: https://github.com/nginx/njs/archive/refs/tags/%{njs_version}.tar.gz#/%{name}-njs-%{njs_version}.tar.gz +Source3: https://github.com/open-telemetry/opentelemetry-cpp-contrib/archive/%{opentelemetry_cpp_contrib_git_commit}.tar.gz#/opentelemetry-cpp-contrib-%{opentelemetry_cpp_contrib_git_commit}.tar.gz BuildRequires: libxml2-devel BuildRequires: libxslt-devel BuildRequires: openssl-devel @@ -39,16 +41,35 @@ The nginx-filesystem package contains the basic directory layout for the Nginx server including the correct permissions for the directories. +%package otel_ngx_module +License: Apache-2.0 +Summary: OpenTelemetry Nginx Module +BuildRequires: grpc-devel +BuildRequires: opentelemetry-cpp-devel +BuildRequires: protobuf-devel +Requires: opentelemetry-cpp + +%description otel_ngx_module +The OpenTelemetry module for Nginx + %prep %autosetup -p1 pushd ../ mkdir nginx-njs tar -C nginx-njs -xf %{SOURCE2} +mkdir otel-cpp-contrib +tar -C otel-cpp-contrib -xf %{SOURCE3} +# The following change is a build break in upstream and a PR has been raised to fix it. +# PR: https://github.com/open-telemetry/opentelemetry-cpp-contrib/pull/314 +sed -i \ + '/\#include $/a \#include ' \ + otel-cpp-contrib/opentelemetry-cpp-contrib-%{opentelemetry_cpp_contrib_git_commit}/instrumentation/nginx/src/otel_ngx_module.cpp popd %build sh configure \ --add-module=../nginx-njs/njs-%{njs_version}/nginx \ + --add-dynamic-module=../otel-cpp-contrib/opentelemetry-cpp-contrib-%{opentelemetry_cpp_contrib_git_commit}/instrumentation/nginx \ --conf-path=%{_sysconfdir}/nginx/nginx.conf \ --error-log-path=%{_var}/log/nginx/error.log \ --group=%{nginx_user} \ @@ -108,8 +129,8 @@ exit 0 %config(noreplace) %{_sysconfdir}/%{name}/scgi_params.default %config(noreplace) %{_sysconfdir}/%{name}/uwsgi_params %config(noreplace) %{_sysconfdir}/%{name}/uwsgi_params.default -%{_sysconfdir}/%{name}/win-utf %{_sysconfdir}/%{name}/html/* +%{_sysconfdir}/%{name}/win-utf %{_sbindir}/* %{_libdir}/systemd/system/nginx.service %dir %{_var}/opt/nginx/log @@ -118,7 +139,14 @@ exit 0 %files filesystem %dir %{_sysconfdir}/%{name} +%files otel_ngx_module +%license ../otel-cpp-contrib/opentelemetry-cpp-contrib-%{opentelemetry_cpp_contrib_git_commit}/LICENSE +%{_sysconfdir}/%{name}/modules/otel_ngx_module.so + %changelog +* Thu Aug 17 2023 Muhammad Falak R Wani - 1.22.1-9 +- Add otel_ngx_module subpackage + * Thu Aug 10 2023 Muhammad Falak R Wani - 1.22.1-8 - Configure with `--with-stream_ssl_module` to enable support for stream proxy server with SSL/TLS diff --git a/cgmanifest.json b/cgmanifest.json index 345951e8c9b..3a307d8dcee 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -15389,6 +15389,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "opentelemetry-cpp-contrib", + "version": "37e4466d882cbddff6f607a20fe327060de76166", + "downloadUrl": "https://github.com/open-telemetry/opentelemetry-cpp-contrib/archive/37e4466d882cbddff6f607a20fe327060de76166.tar.gz" + } + } + }, { "component": { "type": "other", From 5d77fdbfb41ed63dd0b7939f34956c1e34cbdf73 Mon Sep 17 00:00:00 2001 From: AZaugg Date: Tue, 22 Aug 2023 23:09:10 -0400 Subject: [PATCH 04/64] Xfsprogs update1 (#5963) * Update xfsprogs to version 5.15 Updating xfsprogs to version 5.15 to match kernel version. In addition adding a new package called inih, which is a new C library that xfsprogs requires * Updating Fedora license import * Updating source0 * Updating license-map * Update SPECS/xfsprogs/xfsprogs.spec Co-authored-by: Daniel McIlvaney --------- Co-authored-by: Daniel McIlvaney --- SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md | 2 +- SPECS/LICENSES-AND-NOTICES/data/licenses.json | 1 + SPECS/inih/inih.signatures.json | 5 + SPECS/inih/inih.spec | 134 ++++++++++++++++++ SPECS/xfsprogs/xfsprogs.signatures.json | 4 +- SPECS/xfsprogs/xfsprogs.spec | 11 +- cgmanifest.json | 14 +- 7 files changed, 164 insertions(+), 7 deletions(-) create mode 100644 SPECS/inih/inih.signatures.json create mode 100644 SPECS/inih/inih.spec diff --git a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md index e4604dc7754..dbfa298e42b 100644 --- a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md +++ b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md @@ -5,7 +5,7 @@ The CBL-Mariner SPEC files originated from a variety of sources with varying lic | CentOS | [MIT](https://www.centos.org/legal/#licensing-policy) | crash-ptdump-command
delve
fstrm
nodejs-nodemon
rhnlib
rt-setup
rt-tests
rtctl
tuned | | Ceph source | [LGPL2.1](https://github.com/ceph/ceph/blob/master/COPYING-LGPL2.1) | ceph | | Debian | [MIT](https://opensource.org/licenses/MIT) | prometheus-process-exporter | -| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cgdcbxd
chan
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | +| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cgdcbxd
chan
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | | Fedora (Copyright Remi Collet) | [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/legalcode) | libmemcached-awesome
librabbitmq | | Fedora (ISC) | [ISC License](https://github.com/sarugaku/resolvelib/blob/main/LICENSE) | python-resolvelib | | Magnus Edenhill Open Source | [Magnus Edenhill Open Source BSD License](https://github.com/jemalloc/jemalloc/blob/dev/COPYING) | librdkafka | diff --git a/SPECS/LICENSES-AND-NOTICES/data/licenses.json b/SPECS/LICENSES-AND-NOTICES/data/licenses.json index 99767d606bd..44f26c3479e 100644 --- a/SPECS/LICENSES-AND-NOTICES/data/licenses.json +++ b/SPECS/LICENSES-AND-NOTICES/data/licenses.json @@ -498,6 +498,7 @@ "imsettings", "indent", "infinipath-psm", + "inih", "iniparser", "intel-cmt-cat", "intel-ipsec-mb", diff --git a/SPECS/inih/inih.signatures.json b/SPECS/inih/inih.signatures.json new file mode 100644 index 00000000000..63d8998fe1c --- /dev/null +++ b/SPECS/inih/inih.signatures.json @@ -0,0 +1,5 @@ +{ + "Signatures": { + "inih-r57.tar.gz": "f03f98ca35c3adb56b2358573c8d3eda319ccd5287243d691e724b7eafa970b3" + } +} diff --git a/SPECS/inih/inih.spec b/SPECS/inih/inih.spec new file mode 100644 index 00000000000..3864d75f8e0 --- /dev/null +++ b/SPECS/inih/inih.spec @@ -0,0 +1,134 @@ +Summary: A Simple INI file parser library +Name: inih +Version: 57 +Release: 1%{?dist} +License: BSD +URL: https://github.com/benhoyt/inih +Source0: https://github.com/benhoyt/%{name}/archive/refs/tags/r%{version}.tar.gz#/%{name}-r%{version}.tar.gz +Vendor: Microsoft Corporation +Distribution: Mariner +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: meson + + +%description +The inih package provides simple INI file parser which is only a couple of +pages of code, and it was designed to be small and simple, so it's good for +embedded systems. + + +%package devel +Summary: Development package for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + + +%description devel +This package contains development files for %{name}. + +The inih package provides simple INI file parser which is only a couple of +pages of code, and it was designed to be small and simple, so it's good for +embedded systems. + + +%prep +%autosetup -n %{name}-r%{version} + + +%build +%meson +%meson_build + + +%install +%meson_install + + +%ldconfig_scriptlets + + +%files +%license LICENSE.txt +%doc README.md +%{_libdir}/lib%{name}.so.0 +%{_libdir}/libINIReader.so.0 + + +%files devel +%{_includedir}/ini.h +%{_includedir}/INIReader.h +%{_libdir}/pkgconfig/inih.pc +%{_libdir}/pkgconfig/INIReader.pc +%{_libdir}/lib%{name}.so +%{_libdir}/libINIReader.so + + +%changelog +* Fri Jul 28 2023 Andy Zaugg - 57-1 +- Updated version to 57 +- Initial CBL-Mariner import from Fedora 37 (license: MIT) +- License verified + +* Wed Jul 13 2022 Robert Scheck - 56-1 +- New upstream release 56 (#2106574) + +* Sat Apr 23 2022 Robert Scheck - 55-1 +- New upstream release 55 (#1920254) +- Re-add ldconfig scriptlets for EPEL 7 (#2066538) + +* Thu Jan 20 2022 Fedora Release Engineering - 49-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Thu Jul 22 2021 Fedora Release Engineering - 49-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Tue Jan 26 2021 Fedora Release Engineering - 49-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Tue Jul 28 2020 Fedora Release Engineering - 49-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Wed Jun 3 2020 Christian Kellner - 49-1 +- New upstream release 49 +- Switch to meson build system. +- Ship the pkg-config file. +- Remove ldconfig scriptlets. + +* Wed Jan 29 2020 Fedora Release Engineering - 36-13 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Thu Jul 25 2019 Fedora Release Engineering - 36-12 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Fri Feb 01 2019 Fedora Release Engineering - 36-11 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Fri Jul 13 2018 Fedora Release Engineering - 36-10 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Wed Feb 07 2018 Fedora Release Engineering - 36-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Wed Aug 02 2017 Fedora Release Engineering - 36-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 36-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Fri Feb 10 2017 Fedora Release Engineering - 36-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Wed Aug 31 2016 Jan F. Chadima - 36-5 +- implement license tag + +* Wed Aug 31 2016 Jan F. Chadima - 36-4 +- implement next review hints + +* Tue Aug 30 2016 Jan F. Chadima - 36-3 +- implement another review results + +* Tue Aug 30 2016 Jan F. Chadima - 36-2 +- implement review results + +* Mon Aug 29 2016 Jan F. Chadima - 36-1 +- initial version diff --git a/SPECS/xfsprogs/xfsprogs.signatures.json b/SPECS/xfsprogs/xfsprogs.signatures.json index 992004e5a94..8184a0718fe 100644 --- a/SPECS/xfsprogs/xfsprogs.signatures.json +++ b/SPECS/xfsprogs/xfsprogs.signatures.json @@ -1,5 +1,5 @@ { "Signatures": { - "xfsprogs-5.0.0.tar.xz": "fcc2e6478aed55408a341567c0459f514e575296d8827d9004cae8aa0367dc4a" + "xfsprogs-5.15.0.tar.xz": "13d2bf3830eba0027ab558825439dd521f61c7266783d7917213432872e74d56" } -} \ No newline at end of file +} diff --git a/SPECS/xfsprogs/xfsprogs.spec b/SPECS/xfsprogs/xfsprogs.spec index e556d54bf1e..8164f3abec0 100644 --- a/SPECS/xfsprogs/xfsprogs.spec +++ b/SPECS/xfsprogs/xfsprogs.spec @@ -1,7 +1,7 @@ Summary: Utilities for managing the XFS filesystem Name: xfsprogs -Version: 5.0.0 -Release: 3%{?dist} +Version: 5.15.0 +Release: 1%{?dist} License: GPL+ and LGPLv2+ URL: http://oss.sgi.com/projects/xfs/ Group: System Environment/Base @@ -10,6 +10,8 @@ Distribution: Mariner Source0: https://kernel.org/pub/linux/utils/fs/xfs/xfsprogs/%{name}-%{version}.tar.xz BuildRequires: gettext BuildRequires: readline-devel +BuildRequires: inih-devel +BuildRequires: userspace-rcu-devel %description The xfsprogs package contains administration and debugging tools for the @@ -70,7 +72,9 @@ make -k check |& tee %{_specdir}/%{name}-check-log || %{nocheck} %{_mandir}/man8/* %{_mandir}/man5/* %{_sbindir}/* +%{_datadir}/%{name}/mkfs/lts_5.15.conf %exclude %{_docdir}/%{name}-%{version}/CHANGES.gz +%exclude %{_datadir}/%{name}/mkfs/*.conf %files devel %defattr(-,root,root) @@ -84,6 +88,9 @@ make -k check |& tee %{_specdir}/%{name}-check-log || %{nocheck} %defattr(-,root,root) %changelog +* Fri Jul 28 2023 Andy Zaugg - 5.15-1 +- Updated to version 5.15 + * Thu Dec 16 2021 Pawel Winogrodzki - 5.0.0-3 - Removing the explicit %%clean stage. diff --git a/cgmanifest.json b/cgmanifest.json index 3a307d8dcee..4019cd015b7 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -7236,6 +7236,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "inih", + "version": "57", + "downloadUrl": "https://github.com/benhoyt/inih/archive/refs/tags/r57.tar.gz" + } + } + }, { "component": { "type": "other", @@ -29875,8 +29885,8 @@ "type": "other", "other": { "name": "xfsprogs", - "version": "5.0.0", - "downloadUrl": "https://kernel.org/pub/linux/utils/fs/xfs/xfsprogs/xfsprogs-5.0.0.tar.xz" + "version": "5.15.0", + "downloadUrl": "https://kernel.org/pub/linux/utils/fs/xfs/xfsprogs/xfsprogs-5.15.0.tar.xz" } } }, From 06eb74e8ad236fff5290e706326a7052c957a8df Mon Sep 17 00:00:00 2001 From: rlmenge Date: Wed, 23 Aug 2023 10:25:30 -0700 Subject: [PATCH 05/64] Patch rust for CVE-2023-3817 (#6031) * Patch rust for CVE-2023-3817 * Only bump release as CBL-Mariner's rust does not use vendored version --- SPECS/rust/rust.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/SPECS/rust/rust.spec b/SPECS/rust/rust.spec index 211e1df9fe7..c98b536fee8 100644 --- a/SPECS/rust/rust.spec +++ b/SPECS/rust/rust.spec @@ -9,7 +9,7 @@ Summary: Rust Programming Language Name: rust Version: 1.68.2 -Release: 4%{?dist} +Release: 5%{?dist} License: (ASL 2.0 OR MIT) AND BSD AND CC-BY-3.0 Vendor: Microsoft Corporation Distribution: Mariner @@ -165,6 +165,9 @@ rm %{buildroot}%{_docdir}/%{name}/*.old %{_mandir}/man1/* %changelog +* Tue Aug 22 2023 Rachel Menge - 1.68.2-5 +- Bump release to rebuild against openssl 1.1.1k-26 + * Wed Jul 05 2023 Andrew Phelps - 1.68.2-4 - Bump release to rebuild against glibc 2.35-4 From 97d4a92b189cefa13a352668980383eaa7d2a6b5 Mon Sep 17 00:00:00 2001 From: CBL-Mariner-Bot <75509084+CBL-Mariner-Bot@users.noreply.github.com> Date: Wed, 23 Aug 2023 10:28:16 -0700 Subject: [PATCH 06/64] Upgrade php to 8.1.22 to fix CVE-2023-3824 (#6032) --- SPECS/php/php.signatures.json | 2 +- SPECS/php/php.spec | 5 ++++- cgmanifest.json | 6 +++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/SPECS/php/php.signatures.json b/SPECS/php/php.signatures.json index 2d44afb3066..4ef8c63826d 100644 --- a/SPECS/php/php.signatures.json +++ b/SPECS/php/php.signatures.json @@ -14,6 +14,6 @@ "php.conf": "e2388be032eccf7c0197d597ba72259a095bf8434438a184e6a640edb4b59de2", "php.ini": "8fd5a4d891c19320c07010fbbbac982c886b422bc8d062acaeae49d70c136fc8", "php.modconf": "dc7303ea584452d2f742d002a648abe74905025aabf240259c7e8bd01746d278", - "php-8.1.16.tar.xz": "d61f13d96a58b93c39672b58f25e1ee4ce88500f4acb1430cb01a514875c1258" + "php-8.1.22.tar.xz": "9ea4f4cfe775cb5866c057323d6b320f3a6e0adb1be41a068ff7bfec6f83e71d" } } \ No newline at end of file diff --git a/SPECS/php/php.spec b/SPECS/php/php.spec index 6d39cd55c4d..d2444652f70 100644 --- a/SPECS/php/php.spec +++ b/SPECS/php/php.spec @@ -32,7 +32,7 @@ %global with_qdbm 0 Summary: PHP scripting language for creating dynamic web sites Name: php -Version: 8.1.16 +Version: 8.1.22 Release: 1%{?dist} # All files licensed under PHP version 3.01, except # Zend is licensed under Zend @@ -1515,6 +1515,9 @@ systemctl try-restart php-fpm.service >/dev/null 2>&1 || : %dir %{_datadir}/php/preload %changelog +* Tue Aug 22 2023 CBL-Mariner Servicing Account - 8.1.22-1 +- Auto-upgrade to 8.1.22 - CVE-2023-3824 + * Wed Mar 01 2023 CBL-Mariner Servicing Account - 8.1.16-1 - Auto-upgrade to 8.1.16 - to fix CVE-2023-0568, CVE-2023-0662 diff --git a/cgmanifest.json b/cgmanifest.json index 4019cd015b7..2c6426f4791 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -20924,8 +20924,8 @@ "type": "other", "other": { "name": "php", - "version": "8.1.16", - "downloadUrl": "https://www.php.net/distributions/php-8.1.16.tar.xz" + "version": "8.1.22", + "downloadUrl": "https://www.php.net/distributions/php-8.1.22.tar.xz" } } }, @@ -30717,4 +30717,4 @@ } ], "Version": 1 -} +} \ No newline at end of file From 5e7b073b02dc12c34ac27c81a91ff3a4d8b1e51a Mon Sep 17 00:00:00 2001 From: Daniel McIlvaney Date: Wed, 23 Aug 2023 13:58:03 -0700 Subject: [PATCH 07/64] Limit cascading rebuilds in the scheduler (#5993) --------- Co-authored-by: Pawel Winogrodzki --- toolkit/docs/building/building.md | 1 + toolkit/scripts/incremental_building.mk | 9 +- toolkit/scripts/pkggen.mk | 3 +- toolkit/scripts/utils.mk | 6 +- toolkit/tools/scheduler/scheduler.go | 27 ++++-- .../scheduler/schedulerutils/buildworker.go | 17 ++-- .../schedulerutils/graphbuildstate.go | 42 ++++++++- .../schedulerutils/preparerequest.go | 91 +++++++++++++------ 8 files changed, 141 insertions(+), 55 deletions(-) diff --git a/toolkit/docs/building/building.md b/toolkit/docs/building/building.md index 07d436b8587..18a73e15a00 100644 --- a/toolkit/docs/building/building.md +++ b/toolkit/docs/building/building.md @@ -807,6 +807,7 @@ To reproduce an ISO build, run the same make invocation as before, but set: | ALLOW_TOOLCHAIN_REBUILDS | n | Do not treat rebuilds of toolchain packages during regular package build phase as errors. | PACKAGE_BUILD_RETRIES | 1 | Number of build retries for each package | CHECK_BUILD_RETRIES | 1 | Minimum number of check section retries for each package if RUN_CHECK=y and tests fail. +| MAX_CASCADING_REBUILDS | | When a package rebuilds, how many additional layers of dependent packages will be forced to rebuild (leave unset for unbounded, i.e., all downstream packages will rebuild) | IMAGE_TAG | (empty) | Text appended to a resulting image name - empty by default. Does not apply to the initrd. The text will be prepended with a hyphen. | CONCURRENT_PACKAGE_BUILDS | 0 | The maximum number of concurrent package builds that are allowed at once. If set to 0 this defaults to the number of logical CPUs. | CLEANUP_PACKAGE_BUILDS | y | Cleanup a package build's working directory when it finishes. Note that `build` directory will still be removed on a successful package build even when this is turned off. diff --git a/toolkit/scripts/incremental_building.mk b/toolkit/scripts/incremental_building.mk index 69f6468c5d9..f7ee633eb86 100644 --- a/toolkit/scripts/incremental_building.mk +++ b/toolkit/scripts/incremental_building.mk @@ -59,9 +59,11 @@ DELTA_BUILD = y # Don't care if USE_CCACHE or REBUILD_TOOLS are set or not, doesn't matter to the quickbuild. Just turn them # on to be friendly to the user unless they have explicitly set it to off. -USE_CCACHE ?= y -REBUILD_TOOLS ?= y -DELTA_FETCH ?= y +USE_CCACHE ?= y +REBUILD_TOOLS ?= y +DELTA_FETCH ?= y +# We also want to try and limit pointless rebuilds, so set EXTRA_BUILD_LAYERS to 1 if it's not already set. +MAX_CASCADING_REBUILDS ?= 1 endif ######## SET REMAINING FLAG DEFAULTS ######## @@ -74,6 +76,7 @@ DELTA_BUILD ?= n CLEAN_TOOLCHAIN_CONTAINERS ?= y MAX_CPU ?= DELTA_FETCH ?= n +MAX_CASCADING_REBUILDS ?= ######## HANDLE INCREMENTAL_TOOLCHAIN DEPRECATION ######## diff --git a/toolkit/scripts/pkggen.mk b/toolkit/scripts/pkggen.mk index 8e952cb8c67..5fa982666f3 100644 --- a/toolkit/scripts/pkggen.mk +++ b/toolkit/scripts/pkggen.mk @@ -229,7 +229,7 @@ $(RPMS_DIR): @touch $@ endif -$(STATUS_FLAGS_DIR)/build-rpms.flag: $(preprocessed_file) $(chroot_worker) $(go-scheduler) $(go-pkgworker) $(depend_STOP_ON_PKG_FAIL) $(CONFIG_FILE) $(depend_CONFIG_FILE) $(depend_PACKAGE_BUILD_LIST) $(depend_PACKAGE_REBUILD_LIST) $(depend_PACKAGE_IGNORE_LIST) $(depend_TEST_RUN_LIST) $(depend_TEST_RERUN_LIST) $(depend_TEST_IGNORE_LIST) $(pkggen_rpms) $(srpms) $(BUILD_SRPMS_DIR) +$(STATUS_FLAGS_DIR)/build-rpms.flag: $(preprocessed_file) $(chroot_worker) $(go-scheduler) $(go-pkgworker) $(depend_STOP_ON_PKG_FAIL) $(CONFIG_FILE) $(depend_CONFIG_FILE) $(depend_PACKAGE_BUILD_LIST) $(depend_PACKAGE_REBUILD_LIST) $(depend_PACKAGE_IGNORE_LIST) $(depend_MAX_CASCADING_REBUILDS) $(depend_TEST_RUN_LIST) $(depend_TEST_RERUN_LIST) $(depend_TEST_IGNORE_LIST) $(pkggen_rpms) $(srpms) $(BUILD_SRPMS_DIR) $(go-scheduler) \ --input="$(preprocessed_file)" \ --output="$(built_file)" \ @@ -250,6 +250,7 @@ $(STATUS_FLAGS_DIR)/build-rpms.flag: $(preprocessed_file) $(chroot_worker) $(go- --rpmmacros-file="$(TOOLCHAIN_MANIFESTS_DIR)/macros.override" \ --build-attempts="$(PACKAGE_BUILD_RETRIES)" \ --check-attempts="$(CHECK_BUILD_RETRIES)" \ + $(if $(MAX_CASCADING_REBUILDS),--max-cascading-rebuilds="$(MAX_CASCADING_REBUILDS)") \ --build-agent="chroot-agent" \ --build-agent-program="$(go-pkgworker)" \ --ignored-packages="$(PACKAGE_IGNORE_LIST)" \ diff --git a/toolkit/scripts/utils.mk b/toolkit/scripts/utils.mk index 89dea497d9d..54ad44fb1d6 100644 --- a/toolkit/scripts/utils.mk +++ b/toolkit/scripts/utils.mk @@ -53,10 +53,10 @@ endef ######## VARIABLE DEPENDENCY TRACKING ######## # List of variables to watch for changes. -watch_vars=PACKAGE_BUILD_LIST PACKAGE_REBUILD_LIST PACKAGE_IGNORE_LIST REPO_LIST CONFIG_FILE STOP_ON_PKG_FAIL TOOLCHAIN_ARCHIVE REBUILD_TOOLCHAIN SRPM_PACK_LIST SPECS_DIR RUN_CHECK TEST_RUN_LIST TEST_RERUN_LIST TEST_IGNORE_LIST +watch_vars=PACKAGE_BUILD_LIST PACKAGE_REBUILD_LIST PACKAGE_IGNORE_LIST REPO_LIST CONFIG_FILE STOP_ON_PKG_FAIL TOOLCHAIN_ARCHIVE REBUILD_TOOLCHAIN SRPM_PACK_LIST SPECS_DIR MAX_CASCADING_REBUILDS RUN_CHECK TEST_RUN_LIST TEST_RERUN_LIST TEST_IGNORE_LIST # Current list: $(depend_PACKAGE_BUILD_LIST) $(depend_PACKAGE_REBUILD_LIST) $(depend_PACKAGE_IGNORE_LIST) $(depend_REPO_LIST) $(depend_CONFIG_FILE) $(depend_STOP_ON_PKG_FAIL) -# $(depend_TOOLCHAIN_ARCHIVE) $(depend_REBUILD_TOOLCHAIN) $(depend_SRPM_PACK_LIST) $(depend_SPECS_DIR) $(depend_RUN_CHECK) $(depend_TEST_RUN_LIST) $(depend_TEST_RERUN_LIST) -# $(depend_TEST_IGNORE_LIST) +# $(depend_TOOLCHAIN_ARCHIVE) $(depend_REBUILD_TOOLCHAIN) $(depend_SRPM_PACK_LIST) $(depend_SPECS_DIR) $(depend_MAX_CASCADING_REBUILDS) $(depend_RUN_CHECK) $(depend_TEST_RUN_LIST) +# $(depend_TEST_RERUN_LIST) $(depend_TEST_IGNORE_LIST) .PHONY: variable_depends_on_phony clean-variable_depends_on_phony clean: clean-variable_depends_on_phony diff --git a/toolkit/tools/scheduler/scheduler.go b/toolkit/tools/scheduler/scheduler.go index e70aee1c970..3a46c9cd05a 100644 --- a/toolkit/tools/scheduler/scheduler.go +++ b/toolkit/tools/scheduler/scheduler.go @@ -27,11 +27,14 @@ import ( const ( // default worker count to 0 to automatically scale with the number of logical CPUs. - defaultWorkerCount = "0" - defaultBuildAttempts = "1" - defaultCheckAttempts = "1" + defaultWorkerCount = "0" + defaultBuildAttempts = "1" + defaultCheckAttempts = "1" + defaultMaxCascadingRebuilds = "-1" ) +var defaultFreshness = fmt.Sprintf("%d", schedulerutils.NodeFreshnessAbsoluteMax) + // schedulerChannels represents the communication channels used by a build agent. // Unlike BuildChannels, schedulerChannels holds bidirectional channels that // only the top-level scheduler should have. BuildChannels contains directional channels. @@ -69,6 +72,7 @@ var ( rpmmacrosFile = app.Flag("rpmmacros-file", "Optional file path to an rpmmacros file for rpmbuild to use.").ExistingFile() buildAttempts = app.Flag("build-attempts", "Sets the number of times to try building a package.").Default(defaultBuildAttempts).Int() checkAttempts = app.Flag("check-attempts", "Sets the minimum number of times to test a package if the tests fail.").Default(defaultCheckAttempts).Int() + maxCascadingRebuilds = app.Flag("max-cascading-rebuilds", "Sets the maximum number of cascading dependency rebuilds caused by package being rebuilt (leave unset for unbounded).").Default(defaultFreshness).Uint() noCleanup = app.Flag("no-cleanup", "Whether or not to delete the chroot folder after the build is done").Bool() noCache = app.Flag("no-cache", "Disables using prebuilt cached packages.").Bool() stopOnFailure = app.Flag("stop-on-failure", "Stop on failed build").Bool() @@ -181,7 +185,7 @@ func main() { signal.Notify(signals, unix.SIGINT, unix.SIGTERM) go cancelBuildsOnSignal(signals, agent) - err = buildGraph(*inputGraphFile, *outputGraphFile, agent, *workers, *buildAttempts, *checkAttempts, *stopOnFailure, !*noCache, finalPackagesToBuild, packagesToRebuild, packagesToIgnore, finalTestsToRun, testsToRerun, ignoredTests, toolchainPackages, *optimizeWithCachedImplicit, *allowToolchainRebuilds) + err = buildGraph(*inputGraphFile, *outputGraphFile, agent, *workers, *buildAttempts, *checkAttempts, *maxCascadingRebuilds, *stopOnFailure, !*noCache, finalPackagesToBuild, packagesToRebuild, packagesToIgnore, finalTestsToRun, testsToRerun, ignoredTests, toolchainPackages, *optimizeWithCachedImplicit, *allowToolchainRebuilds) if err != nil { logger.Log.Fatalf("Unable to build package graph.\nFor details see the build summary section above.\nError: %s.", err) } @@ -209,7 +213,7 @@ func cancelBuildsOnSignal(signals chan os.Signal, agent buildagents.BuildAgent) // buildGraph builds all packages in the dependency graph requested. // It will save the resulting graph to outputFile. -func buildGraph(inputFile, outputFile string, agent buildagents.BuildAgent, workers, buildAttempts int, checkAttempts int, stopOnFailure, canUseCache bool, packagesToBuild, packagesToRebuild, ignoredPackages, testsToRun, testsToRerun, ignoredTests []*pkgjson.PackageVer, toolchainPackages []string, optimizeWithCachedImplicit bool, allowToolchainRebuilds bool) (err error) { +func buildGraph(inputFile, outputFile string, agent buildagents.BuildAgent, workers, buildAttempts, checkAttempts int, maxCascadingRebuilds uint, stopOnFailure, canUseCache bool, packagesToBuild, packagesToRebuild, ignoredPackages, testsToRun, testsToRerun, ignoredTests []*pkgjson.PackageVer, toolchainPackages []string, optimizeWithCachedImplicit bool, allowToolchainRebuilds bool) (err error) { // graphMutex guards pkgGraph from concurrent reads and writes during build. var graphMutex sync.RWMutex @@ -229,7 +233,7 @@ func buildGraph(inputFile, outputFile string, agent buildagents.BuildAgent, work logger.Log.Infof("Building %d nodes with %d workers", numberOfNodes, workers) // After this call pkgGraph will be given to multiple routines and accessing it requires acquiring the mutex. - builtGraph, err := buildAllNodes(stopOnFailure, canUseCache, packagesToRebuild, testsToRerun, pkgGraph, &graphMutex, goalNode, channels, toolchainPackages, allowToolchainRebuilds) + builtGraph, err := buildAllNodes(stopOnFailure, canUseCache, packagesToRebuild, testsToRerun, pkgGraph, &graphMutex, goalNode, channels, maxCascadingRebuilds, toolchainPackages, allowToolchainRebuilds) if builtGraph != nil { graphMutex.RLock() @@ -282,7 +286,7 @@ func startWorkerPool(agent buildagents.BuildAgent, workers, buildAttempts, check // - Attempts to satisfy any unresolved dynamic dependencies with new implicit provides from the build result. // - Attempts to subgraph the graph to only contain the requested packages if possible. // - Repeat. -func buildAllNodes(stopOnFailure, canUseCache bool, packagesToRebuild, testsToRerun []*pkgjson.PackageVer, pkgGraph *pkggraph.PkgGraph, graphMutex *sync.RWMutex, goalNode *pkggraph.PkgNode, channels *schedulerChannels, reservedFiles []string, allowToolchainRebuilds bool) (builtGraph *pkggraph.PkgGraph, err error) { +func buildAllNodes(stopOnFailure, canUseCache bool, packagesToRebuild, testsToRerun []*pkgjson.PackageVer, pkgGraph *pkggraph.PkgGraph, graphMutex *sync.RWMutex, goalNode *pkggraph.PkgNode, channels *schedulerChannels, maxCascadingRebuilds uint, reservedFiles []string, allowToolchainRebuilds bool) (builtGraph *pkggraph.PkgGraph, err error) { var ( // stopBuilding tracks if the build has entered a failed state and this routine should stop as soon as possible. stopBuilding bool @@ -301,7 +305,7 @@ func buildAllNodes(stopOnFailure, canUseCache bool, packagesToRebuild, testsToRe // Start the build at the leaf nodes. // The build will bubble up through the graph as it processes nodes. - buildState := schedulerutils.NewGraphBuildState(reservedFiles) + buildState := schedulerutils.NewGraphBuildState(reservedFiles, maxCascadingRebuilds) buildRunsTests := len(pkgGraph.AllTestNodes()) > 0 nodesToBuild := schedulerutils.LeafNodes(pkgGraph, graphMutex, goalNode, buildState, useCachedImplicit) @@ -355,7 +359,12 @@ func buildAllNodes(stopOnFailure, canUseCache bool, packagesToRebuild, testsToRe res := <-channels.Results schedulerutils.PrintBuildResult(res) - buildState.RecordBuildResult(res, allowToolchainRebuilds) + err = buildState.RecordBuildResult(res, allowToolchainRebuilds) + if err != nil { + // Failures to manipulate the graph or build state are fatal. + err = fmt.Errorf("error recording build result:\n%w", err) + stopBuilding = true + } if !stopBuilding { if res.Err == nil { diff --git a/toolkit/tools/scheduler/schedulerutils/buildworker.go b/toolkit/tools/scheduler/schedulerutils/buildworker.go index 48564e916f4..6bbdb249307 100644 --- a/toolkit/tools/scheduler/schedulerutils/buildworker.go +++ b/toolkit/tools/scheduler/schedulerutils/buildworker.go @@ -32,14 +32,15 @@ type BuildChannels struct { Done <-chan struct{} } -// BuildRequest represents the results of a build agent trying to build a given node. +// BuildRequest represents a work-order to a build agent asking it to build a given node. type BuildRequest struct { - Node *pkggraph.PkgNode - PkgGraph *pkggraph.PkgGraph - AncillaryNodes []*pkggraph.PkgNode - ExpectedFiles []string - UseCache bool - IsDelta bool + Node *pkggraph.PkgNode // The main node being analyzed for the build. + PkgGraph *pkggraph.PkgGraph // The graph of all packages. + AncillaryNodes []*pkggraph.PkgNode // For SRPM builds: other nodes stemming from the same SRPM. Empty otherwise. + ExpectedFiles []string // List of RPMs built by this node. + UseCache bool // Can we use a cached copy of this package instead of building it. + IsDelta bool // Is this a pre-downloaded RPM (not traditional cache) that we may be able to skip rebuilding. + Freshness uint // The freshness of the node (used to determine if we can skip building future nodes). } // BuildResult represents the results of a build agent trying to build a given node. @@ -52,6 +53,7 @@ type BuildResult struct { Ignored bool // Indicator if the build was ignored by user request. UsedCache bool // Indicator if we used the cached artifacts (external or earlier local build) instead of building the node. WasDelta bool // Indicator if we used a pre-built component from an external repository instead of building the node. + Freshness uint // The freshness of the node (used to determine if we can skip building future nodes). } // selectNextBuildRequest selects a job based on priority: @@ -104,6 +106,7 @@ func BuildNodeWorker(channels *BuildChannels, agent buildagents.BuildAgent, grap AncillaryNodes: req.AncillaryNodes, UsedCache: req.UseCache, WasDelta: req.IsDelta, + Freshness: req.Freshness, } switch req.Node.Type { diff --git a/toolkit/tools/scheduler/schedulerutils/graphbuildstate.go b/toolkit/tools/scheduler/schedulerutils/graphbuildstate.go index ae2a027e506..59a1484fe17 100644 --- a/toolkit/tools/scheduler/schedulerutils/graphbuildstate.go +++ b/toolkit/tools/scheduler/schedulerutils/graphbuildstate.go @@ -4,6 +4,8 @@ package schedulerutils import ( + "fmt" + "math" "path/filepath" "sort" @@ -17,12 +19,19 @@ type nodeState struct { available bool cached bool usedDelta bool + freshness uint } +const ( + // The highest possible freshness value, used to force unbounded cascading rebuilds. + NodeFreshnessAbsoluteMax uint64 = math.MaxUint64 +) + // GraphBuildState represents the build state of a graph. type GraphBuildState struct { activeBuilds map[int64]*BuildRequest nodeToState map[*pkggraph.PkgNode]*nodeState + maxFreshness uint failures []*BuildResult reservedFiles map[string]bool conflictingRPMs map[string]bool @@ -30,18 +39,23 @@ type GraphBuildState struct { } // NewGraphBuildState returns a new GraphBuildState. -// - reservedFiles is a list of reserved files which should NOT be rebuilt. Any files that ARE rebuilt will be recorded. -func NewGraphBuildState(reservedFiles []string) (g *GraphBuildState) { +// - reservedFiles is a list of reserved files which should NOT be rebuilt. Any files that ARE rebuilt will be recorded. +// - maxFreshness is how fresh a newly rebuilt node is. Each dependant node will have a freshness of 'n-1', etc. until +// '0' where the subsequent nodes will no longer be rebuilt. 'maxFreshness < 0' will cause unbounded cascading rebuilds, +// while 'maxFreshness = 0' will cause no cascading rebuilds. +func NewGraphBuildState(reservedFiles []string, maxFreshness uint) (g *GraphBuildState) { filesMap := make(map[string]bool) for _, file := range reservedFiles { filesMap[file] = true } + return &GraphBuildState{ activeBuilds: make(map[int64]*BuildRequest), nodeToState: make(map[*pkggraph.PkgNode]*nodeState), reservedFiles: filesMap, conflictingRPMs: make(map[string]bool), conflictingSRPMs: make(map[string]bool), + maxFreshness: maxFreshness, } } @@ -68,6 +82,17 @@ func (g *GraphBuildState) IsNodeCached(node *pkggraph.PkgNode) bool { return state != nil && state.cached } +// GetMaxFreshness returns the maximum freshness a node can have. (ie if a package is directly rebuilt due to user +// request, or missing files, it will have this freshness. Each dependant node will have a freshness of 'n-1', etc. +func (g *GraphBuildState) GetMaxFreshness() uint { + return g.maxFreshness +} + +// GetFreshnessOfNode returns the freshness of a node. +func (g *GraphBuildState) GetFreshnessOfNode(node *pkggraph.PkgNode) uint { + return g.nodeToState[node].freshness +} + // IsNodeDelta returns true if the requested node was pre-downloaded as a delta package. func (g *GraphBuildState) IsNodeDelta(node *pkggraph.PkgNode) bool { state := g.nodeToState[node] @@ -167,7 +192,7 @@ func (g *GraphBuildState) isConflictWithToolchain(fileToCheck string) (hadConfli // RecordBuildResult records a build result in the graph build state. // - It will record the result as a failure if applicable. // - It will record all ancillary nodes of the result. -func (g *GraphBuildState) RecordBuildResult(res *BuildResult, allowToolchainRebuilds bool) { +func (g *GraphBuildState) RecordBuildResult(res *BuildResult, allowToolchainRebuilds bool) (err error) { logger.Log.Debugf("Recording build result: %s", res.Node.FriendlyName()) delete(g.activeBuilds, res.Node.ID()) @@ -176,10 +201,20 @@ func (g *GraphBuildState) RecordBuildResult(res *BuildResult, allowToolchainRebu g.failures = append(g.failures, res) } + // 'NodeFreshnessRebuildRequired' is a special value that indicates that the node was rebuilt due to missing files + // (user requested rebuilds are already at the max freshness). In this case, we want to reset the freshness to the + // max, so that subsequent dependant nodes will be rebuilt. Also ensure that the freshness is not greater than the max. + freshness := res.Freshness + if freshness > g.GetMaxFreshness() { + err = fmt.Errorf("unexpected freshness value of %d for node '%s'. Should be: ( <= %d)", freshness, res.Node.FriendlyName(), g.GetMaxFreshness()) + return + } + state := &nodeState{ available: res.Err == nil, cached: res.UsedCache, usedDelta: res.WasDelta, + freshness: freshness, } for _, node := range res.AncillaryNodes { @@ -196,4 +231,5 @@ func (g *GraphBuildState) RecordBuildResult(res *BuildResult, allowToolchainRebu } else { logger.Log.Tracef("Skipping checking toolchain conflicts since this is either not a built node (%v) or the ALLOW_TOOLCHAIN_REBUILDS flag was set to 'y'.", res.Node) } + return } diff --git a/toolkit/tools/scheduler/schedulerutils/preparerequest.go b/toolkit/tools/scheduler/schedulerutils/preparerequest.go index d475a4702cc..fae26db0975 100644 --- a/toolkit/tools/scheduler/schedulerutils/preparerequest.go +++ b/toolkit/tools/scheduler/schedulerutils/preparerequest.go @@ -85,7 +85,11 @@ func buildNodesToRequests(pkgGraph *pkggraph.PkgGraph, buildState *GraphBuildSta } req.ExpectedFiles = expectedFiles - req.UseCache = len(missingFiles) == 0 + if len(missingFiles) != 0 { + req.UseCache = false + req.Freshness = buildState.GetMaxFreshness() + logger.Log.Debugf("Resetting freshness to %d due to missing files.", req.Freshness) + } } requests = append(requests, req) @@ -119,9 +123,14 @@ func buildRequest(pkgGraph *pkggraph.PkgGraph, buildState *GraphBuildState, pack PkgGraph: pkgGraph, AncillaryNodes: ancillaryNodes, IsDelta: isDelta, + Freshness: buildState.GetMaxFreshness(), } - request.UseCache = isCacheAllowed && canUseCacheForNode(pkgGraph, request.Node, packagesToRebuild, buildState) + requiredRebuild := isRequiredRebuild(request.Node, packagesToRebuild) + if !requiredRebuild && isCacheAllowed { + // We might be able to use the cache, set the freshness based on node's dependencies. + request.UseCache, request.Freshness = canUseCacheForNode(pkgGraph, request.Node, buildState) + } return } @@ -149,13 +158,8 @@ func partnerTestNodesToRequest(pkgGraph *pkggraph.PkgGraph, buildState *GraphBui return } - return &BuildRequest{ - Node: testNode, - PkgGraph: pkgGraph, - AncillaryNodes: ancillaryTestNodes, - IsDelta: isDelta, - UseCache: buildUsesCache && canUseCacheForNode(pkgGraph, testNode, testsToRerun, buildState), - } + request = buildRequest(pkgGraph, buildState, testsToRerun, testNode, ancillaryTestNodes, buildUsesCache, isDelta) + return } // testNodesToRequests converts lists of test nodes into test build requests. @@ -182,36 +186,65 @@ func testNodesToRequests(pkgGraph *pkggraph.PkgGraph, buildState *GraphBuildStat return } -// canUseCacheForNode checks if the cache can be used for a given node. -// - It will check if the node corresponds to an entry in packagesToRebuild. -// - It will check if all dependencies of the node were also cached. Exceptions: -// - "TypePreBuilt" nodes must use the cache and have no dependencies to check. -func canUseCacheForNode(pkgGraph *pkggraph.PkgGraph, node *pkggraph.PkgNode, packagesToRebuild []*pkgjson.PackageVer, buildState *GraphBuildState) (canUseCache bool) { - // The "TypePreBuilt" nodes always use the cache. - if node.Type == pkggraph.TypePreBuilt { - canUseCache = true - return - } - - // Check if the node corresponds to an entry in packagesToRebuild +// isRequiredRebuild checks if a node is required to be rebuilt based on the packagesToRebuild list. +func isRequiredRebuild(node *pkggraph.PkgNode, packagesToRebuild []*pkgjson.PackageVer) (requiredRebuild bool) { packageVer := node.VersionedPkg - canUseCache = !sliceutils.Contains(packagesToRebuild, packageVer, sliceutils.PackageVerMatch) - if !canUseCache { - logger.Log.Debugf("Marking node (type: %s, version: %s) for rebuild per user request", node.Type, packageVer) - return + requiredRebuild = sliceutils.Contains(packagesToRebuild, packageVer, sliceutils.PackageVerMatch) + if requiredRebuild { + logger.Log.Debugf("Marking (%s) for rebuild per user request", packageVer) } + return +} - // If any of the node's dependencies were built instead of being cached then a build is required. +// canUseCacheForNode checks if the cache can be used for a given node by: +// - Assume the node is stale to begin (freshness == 0). +// - Check if all dependencies of the node were cached, and calculate the expected freshness of the node based on the freshest dependency. +// - If all dependencies are cached (freshness == 0, aka stale) then the node will keep freshness 0 and may use the cache. +// - If any dependency is fresh (aka freshness > 0) then the node can't use the cache and will inherit the freshness of +// the freshest dependency (possibly adjusted by -1 for certain edges). +func canUseCacheForNode(pkgGraph *pkggraph.PkgGraph, node *pkggraph.PkgNode, buildState *GraphBuildState) (canUseCache bool, freshness uint) { + freshness = 0 + canUseCache = true + + // If any of the node's dependencies were built instead of being cached then a build is required. We treat any node + // with a freshness > 0 as being built. Each layer of the build completed will decrement the freshness of the node by 1. dependencies := pkgGraph.From(node.ID()) for dependencies.Next() { dependency := dependencies.Node().(*pkggraph.PkgNode) - if !buildState.IsNodeCached(dependency) { - logger.Log.Debugf("Can't use cached version of %v because %v is rebuilding", node.FriendlyName(), dependency.FriendlyName()) + inheritedFreshness, shouldRebuild := calculateExpectedFreshness(dependency, buildState) + if inheritedFreshness > freshness { + freshness = inheritedFreshness + } + + if shouldRebuild { + logger.Log.Debugf("Can't use cached version of %v because %v has been rebuilt with a freshness of %d", node.FriendlyName(), dependency.FriendlyName(), inheritedFreshness) canUseCache = false - break } } return } + +// calculateExpectedFreshness calculates how "fresh" a node will be based on one of its dependencies, and if that +// dependency should cause a rebuild. This function will determine if the freshness should be attenuated based on +// the dependency type. +func calculateExpectedFreshness(dependencyNode *pkggraph.PkgNode, buildState *GraphBuildState) (expectedFreshness uint, shouldRebuild bool) { + // Remote nodes are always 'stale' and should never generate a rebuild. + if dependencyNode.Type == pkggraph.TypeRemoteRun { + return 0, false + } + + expectedFreshness = buildState.GetFreshnessOfNode(dependencyNode) + shouldRebuild = expectedFreshness > 0 + // The transition from (* -> run) nodes is sufficient to attenuate the freshness throughout the graph. For BuildRequires, + // each build node will always be accompanied by a run node (i.e., no other nodes depend directly on the build + // node, and we would like the associated run node to inherit its build node's freshness). We also want to + // attenuate for runtime requires which again will generally be a (run -> run) transition. Meta nodes may be interposed + // between any nodes so we pass the freshness through unchanged everywhere else. + if dependencyNode.Type == pkggraph.TypeLocalRun && expectedFreshness != 0 { + expectedFreshness -= 1 + } + + return expectedFreshness, shouldRebuild +} From 0933be81d5bba3d3a3beca0e6e4063302cab6fd3 Mon Sep 17 00:00:00 2001 From: Cameron E Baird Date: Wed, 23 Aug 2023 13:58:32 -0700 Subject: [PATCH 08/64] Conditionally load kernel-mshv variables in grub if they are installed. (#5653) --- toolkit/resources/assets/grub2/grub.cfg | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/toolkit/resources/assets/grub2/grub.cfg b/toolkit/resources/assets/grub2/grub.cfg index cfe0c043d29..1c55e45004e 100644 --- a/toolkit/resources/assets/grub2/grub.cfg +++ b/toolkit/resources/assets/grub2/grub.cfg @@ -3,6 +3,10 @@ set bootprefix={{.BootPrefix}} search -n -u {{.BootUUID}} -s load_env -f $bootprefix/mariner.cfg +if [ -f $bootprefix/mariner-mshv.cfg ]; then + load_env -f $bootprefix/mariner-mshv.cfg +fi + if [ -f $bootprefix/systemd.cfg ]; then load_env -f $bootprefix/systemd.cfg else From 72f1d3085acf31c8b8e70cb24e4d42002d8b5c17 Mon Sep 17 00:00:00 2001 From: Dallas Delaney <106280731+dallasd1@users.noreply.github.com> Date: Wed, 23 Aug 2023 14:51:05 -0700 Subject: [PATCH 09/64] Patch guava for CVE-2020-8908 (#6036) --- SPECS/guava/CVE-2020-8908.patch | 80 +++++++++++++++++++++++++++++++++ SPECS/guava/guava.spec | 7 ++- 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 SPECS/guava/CVE-2020-8908.patch diff --git a/SPECS/guava/CVE-2020-8908.patch b/SPECS/guava/CVE-2020-8908.patch new file mode 100644 index 00000000000..99398159296 --- /dev/null +++ b/SPECS/guava/CVE-2020-8908.patch @@ -0,0 +1,80 @@ +From fec0dbc4634006a6162cfd4d0d09c962073ddf40 Mon Sep 17 00:00:00 2001 +From: glorioso +Date: Wed, 26 Aug 2020 10:02:56 -0700 +Subject: [PATCH] Deprecate Files.createTempDir(), noting that better + alternatives exist for Android as well as for users running Java 7 or later. + +RELNOTES=`io`: Deprecated `Files.createTempDir()`. + +------------- +Created by MOE: https://github.com/google/moe +MOE_MIGRATED_REVID=328552787 +--- + android/guava/src/com/google/common/io/Files.java | 12 ++++++++++++ + guava/src/com/google/common/io/Files.java | 12 ++++++++++++ + 2 files changed, 24 insertions(+) + +diff --git a/android/guava/src/com/google/common/io/Files.java b/android/guava/src/com/google/common/io/Files.java +index 6a763f9..4dee6dc 100644 +--- a/android/guava/src/com/google/common/io/Files.java ++++ b/android/guava/src/com/google/common/io/Files.java +@@ -386,6 +386,11 @@ public final class Files { + * be exploited to create security vulnerabilities, especially when executable files are to be + * written into the directory. + * ++ *

Depending on the environmment that this code is run in, the system temporary directory (and ++ * thus the directory this method creates) may be more visible that a program would like - files ++ * written to this directory may be read or overwritten by hostile programs running on the same ++ * machine. ++ * + *

This method assumes that the temporary volume is writable, has free inodes and free blocks, + * and that it will not be called thousands of times per second. + * +@@ -394,7 +399,14 @@ public final class Files { + * + * @return the newly-created directory + * @throws IllegalStateException if the directory could not be created ++ * @deprecated For Android users, see the Data and File ++ * Storage overview to select an appropriate temporary directory (perhaps {@code ++ * context.getCacheDir()}). For developers on Java 7 or later, use {@link ++ * java.nio.file.Files#createTempDirectory}, transforming it to a {@link File} using {@link ++ * java.nio.file.Path#toFile() toFile()} if needed. + */ ++ @Deprecated + public static File createTempDir() { + File baseDir = new File(System.getProperty("java.io.tmpdir")); + String baseName = System.currentTimeMillis() + "-"; +diff --git a/guava/src/com/google/common/io/Files.java b/guava/src/com/google/common/io/Files.java +index 6a763f9..4dee6dc 100644 +--- a/guava/src/com/google/common/io/Files.java ++++ b/guava/src/com/google/common/io/Files.java +@@ -386,6 +386,11 @@ public final class Files { + * be exploited to create security vulnerabilities, especially when executable files are to be + * written into the directory. + * ++ *

Depending on the environmment that this code is run in, the system temporary directory (and ++ * thus the directory this method creates) may be more visible that a program would like - files ++ * written to this directory may be read or overwritten by hostile programs running on the same ++ * machine. ++ * + *

This method assumes that the temporary volume is writable, has free inodes and free blocks, + * and that it will not be called thousands of times per second. + * +@@ -394,7 +399,14 @@ public final class Files { + * + * @return the newly-created directory + * @throws IllegalStateException if the directory could not be created ++ * @deprecated For Android users, see the Data and File ++ * Storage overview to select an appropriate temporary directory (perhaps {@code ++ * context.getCacheDir()}). For developers on Java 7 or later, use {@link ++ * java.nio.file.Files#createTempDirectory}, transforming it to a {@link File} using {@link ++ * java.nio.file.Path#toFile() toFile()} if needed. + */ ++ @Deprecated + public static File createTempDir() { + File baseDir = new File(System.getProperty("java.io.tmpdir")); + String baseName = System.currentTimeMillis() + "-"; +-- +2.17.1 diff --git a/SPECS/guava/guava.spec b/SPECS/guava/guava.spec index 8c3215d822c..4e9be01e461 100644 --- a/SPECS/guava/guava.spec +++ b/SPECS/guava/guava.spec @@ -17,7 +17,7 @@ Summary: Google Core Libraries for Java Name: guava Version: 25.0 -Release: 6%{?dist} +Release: 7%{?dist} License: Apache-2.0 AND CC0-1.0 Vendor: Microsoft Corporation Distribution: Mariner @@ -26,6 +26,7 @@ URL: https://github.com/google/guava Source0: https://github.com/google/guava/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz Source1: %{name}-build.tar.xz Patch0: %{name}-%{version}-java8compat.patch +Patch1: CVE-2020-8908.patch BuildRequires: ant BuildRequires: fdupes BuildRequires: javapackages-local-bootstrap @@ -63,6 +64,7 @@ guava-testlib provides additional functionality for conveninent unit testing %prep %setup -q -a1 %patch0 -p1 +%patch1 -p1 find . -name '*.jar' -delete @@ -140,6 +142,9 @@ cp -r %{name}-testlib/target/site/apidocs %{buildroot}%{_javadocdir}/%{name}/%{n %files testlib -f .mfiles-guava-testlib %changelog +* Wed Aug 23 2023 Dallas Delaney 25.0-7 +- Add patch for CVE-2020-8908 + * Fri Mar 17 2023 Mykhailo Bykhovtsev - 25.0-6 - Moved from extended to core - License verified From 730643951da240c6bf6bf3683faf94c21e87c6a2 Mon Sep 17 00:00:00 2001 From: Daniel McIlvaney Date: Wed, 23 Aug 2023 15:46:55 -0700 Subject: [PATCH 10/64] Add simple pre-cache downloader (#5926) --------- Co-authored-by: Pawel Winogrodzki --- toolkit/Makefile | 12 +- toolkit/docs/building/building.md | 10 + toolkit/scripts/incremental_building.mk | 2 + toolkit/scripts/pkggen.mk | 16 +- toolkit/scripts/precache.mk | 51 +++ toolkit/scripts/tools.mk | 1 + toolkit/tools/internal/file/file.go | 19 ++ toolkit/tools/precacher/precacher.go | 417 ++++++++++++++++++++++++ 8 files changed, 519 insertions(+), 9 deletions(-) create mode 100644 toolkit/scripts/precache.mk create mode 100644 toolkit/tools/precacher/precacher.go diff --git a/toolkit/Makefile b/toolkit/Makefile index b555fb24d89..f54b329f8c0 100644 --- a/toolkit/Makefile +++ b/toolkit/Makefile @@ -189,6 +189,14 @@ include $(SCRIPTS_DIR)/containerized-build.mk # expand-specs clean-expand-specs include $(SCRIPTS_DIR)/srpm_expand.mk +# Create self contained toolkit archive contianing all the required tools with: +# package-toolkit, clean-package-toolkit +include $(SCRIPTS_DIR)/toolkit.mk + +# Fill the cache with rpms from the package server without using package manager or chroot with: +# pre-cache +include $(SCRIPTS_DIR)/precache.mk + # Create a package build workplan with: # workplan, clean-workplan clean-cache # Build a package with: @@ -201,10 +209,6 @@ include $(SCRIPTS_DIR)/pkggen.mk # image, iso, clean-imggen include $(SCRIPTS_DIR)/imggen.mk -# Create self contained toolkit archive contianing all the required tools with: -# package-toolkit, clean-package-toolkit -include $(SCRIPTS_DIR)/toolkit.mk - # Each component provides specific clean implementations which clean depends on. # They are guaranteed to run first and will verify there are no existing mount points # left after a chroot. diff --git a/toolkit/docs/building/building.md b/toolkit/docs/building/building.md index 18a73e15a00..869888208b6 100644 --- a/toolkit/docs/building/building.md +++ b/toolkit/docs/building/building.md @@ -522,6 +522,16 @@ If that is not desired all remote sources can be disabled by clearing the follow > Try to download pre-built packages if the versions match the local spec files. +#### `PRECACHE=...` + +##### `PRECACHE=`**`n`** *(default)* + +> Don't pre-load the cache from upstream sources + +##### `PRECACHE=y` + +> Load the cache with RPMs from the upstream repos before starting to build. + #### `ALLOW_TOOLCHAIN_DOWNLOAD_FAIL=...` ##### `ALLOW_TOOLCHAIN_DOWNLOAD_FAIL=`**`n`** *(default)* diff --git a/toolkit/scripts/incremental_building.mk b/toolkit/scripts/incremental_building.mk index f7ee633eb86..437ded813f0 100644 --- a/toolkit/scripts/incremental_building.mk +++ b/toolkit/scripts/incremental_building.mk @@ -62,6 +62,7 @@ DELTA_BUILD = y USE_CCACHE ?= y REBUILD_TOOLS ?= y DELTA_FETCH ?= y +PRECACHE ?= y # We also want to try and limit pointless rebuilds, so set EXTRA_BUILD_LAYERS to 1 if it's not already set. MAX_CASCADING_REBUILDS ?= 1 endif @@ -76,6 +77,7 @@ DELTA_BUILD ?= n CLEAN_TOOLCHAIN_CONTAINERS ?= y MAX_CPU ?= DELTA_FETCH ?= n +PRECACHE ?= n MAX_CASCADING_REBUILDS ?= ######## HANDLE INCREMENTAL_TOOLCHAIN DEPRECATION ######## diff --git a/toolkit/scripts/pkggen.mk b/toolkit/scripts/pkggen.mk index 5fa982666f3..3e8a2189e52 100644 --- a/toolkit/scripts/pkggen.mk +++ b/toolkit/scripts/pkggen.mk @@ -26,7 +26,8 @@ pkggen_rpms = $(call shell_real_build_only, find $(RPMS_DIR)/* 2>/dev/null cache_working_dir = $(PKGBUILD_DIR)/tdnf_cache_worker parse_working_dir = $(BUILD_DIR)/spec_parsing rpmbuilding_logs_dir = $(LOGS_DIR)/pkggen/rpmbuilding -rpm_cache_files = $(call shell_real_build_only, find $(CACHED_RPMS_DIR)) +remote_rpms_cache_dir = $(CACHED_RPMS_DIR)/cache +cached_remote_rpms = $(call shell_real_build_only, find $(remote_rpms_cache_dir)) validate-pkggen-config = $(STATUS_FLAGS_DIR)/validate-image-config-pkggen.flag # Outputs @@ -161,11 +162,16 @@ graphpkgfetcher_extra_flags += $(if $(CONFIG_FILE),--base-dir="$(CONFIG_BASE_DIR $(cached_file): $(depend_CONFIG_FILE) $(depend_PACKAGE_BUILD_LIST) $(depend_PACKAGE_REBUILD_LIST) $(depend_PACKAGE_IGNORE_LIST) $(depend_TEST_RUN_LIST) $(depend_TEST_RERUN_LIST) $(depend_TEST_IGNORE_LIST) endif -$(cached_file): $(graph_file) $(go-graphpkgfetcher) $(chroot_worker) $(pkggen_local_repo) $(depend_REPO_LIST) $(REPO_LIST) $(rpm_cache_files) $(TOOLCHAIN_MANIFEST) $(toolchain_rpms) - mkdir -p $(CACHED_RPMS_DIR)/cache && \ +ifeq ($(PRECACHE),y) +# Use highly parallel downlader to fully hydrate the cache before trying to use the package manager to download packages +$(cached_file): $(STATUS_FLAGS_DIR)/precache.flag +endif + +$(cached_file): $(graph_file) $(go-graphpkgfetcher) $(chroot_worker) $(pkggen_local_repo) $(depend_REPO_LIST) $(REPO_LIST) $(cached_remote_rpms) $(TOOLCHAIN_MANIFEST) $(toolchain_rpms) + mkdir -p $(remote_rpms_cache_dir) && \ $(go-graphpkgfetcher) \ --input=$(graph_file) \ - --output-dir=$(CACHED_RPMS_DIR)/cache \ + --output-dir=$(remote_rpms_cache_dir) \ --rpm-dir=$(RPMS_DIR) \ --toolchain-rpms-dir="$(TOOLCHAIN_RPMS_DIR)" \ --tmp-dir=$(cache_working_dir) \ @@ -241,7 +247,7 @@ $(STATUS_FLAGS_DIR)/build-rpms.flag: $(preprocessed_file) $(chroot_worker) $(go- --rpm-dir="$(RPMS_DIR)" \ --toolchain-rpms-dir="$(TOOLCHAIN_RPMS_DIR)" \ --srpm-dir="$(SRPMS_DIR)" \ - --cache-dir="$(CACHED_RPMS_DIR)/cache" \ + --cache-dir="$(remote_rpms_cache_dir)" \ --ccache-dir="$(CCACHE_DIR)" \ --build-logs-dir="$(rpmbuilding_logs_dir)" \ --dist-tag="$(DIST_TAG)" \ diff --git a/toolkit/scripts/precache.mk b/toolkit/scripts/precache.mk new file mode 100644 index 00000000000..bc8bbf07988 --- /dev/null +++ b/toolkit/scripts/precache.mk @@ -0,0 +1,51 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# Contains: +# - Tools to fully hydrate the rpm cache from upstream repos with the any versions that match local .spec files + +.PHONY: pre-cache clean-precache + +precache_state_dir = $(CACHED_RPMS_DIR)/precache +precache_downloaded_files = $(precache_state_dir)/downloaded_files.txt +precache_chroot_dir = $(precache_state_dir)/chroot + +$(call create_folder,$(precache_state_dir)) +$(call create_folder,$(precache_chroot_dir)) +$(call create_folder,$(remote_rpms_cache_dir)) + +clean-cache: clean-precache +clean: clean-precache +clean-precache: + @echo Verifying no mountpoints present in $(precache_chroot_dir) + $(SCRIPTS_DIR)/safeunmount.sh "$(precache_chroot_dir)" && \ + rm -rf $(precache_state_dir) + +# We always want to run the precache script, it will decide if it needs to download anything and update the flag file if +# it does, so add the phony target as a dependency to the flag file +.PHONY: precache_always_run_phony +pre-cache: $(STATUS_FLAGS_DIR)/precache.flag +$(STATUS_FLAGS_DIR)/precache.flag: $(go-precacher) $(chroot_worker) $(rpms_snapshot) precache_always_run_phony + @if [ "$(DISABLE_UPSTREAM_REPOS)" = "y" ]; then \ + echo "ERROR: Upstream repos are disabled (DISABLE_UPSTREAM_REPOS=y), cannot precache RPMs"; \ + exit 1; \ + fi + $(go-precacher) \ + --snapshot "$(rpms_snapshot)" \ + --output-dir "$(remote_rpms_cache_dir)" \ + --output-summary-file "$(precache_downloaded_files)" \ + $(foreach url,$(PACKAGE_URL_LIST), --repo-url "$(url)") \ + --worker-tar $(chroot_worker) \ + --worker-dir $(precache_chroot_dir) \ + --log-file=$(SRPM_BUILD_LOGS_DIR)/precacher.log \ + --log-level=$(LOG_LEVEL) \ + --cpu-prof-file=$(PROFILE_DIR)/precacher.cpu.pprof \ + --mem-prof-file=$(PROFILE_DIR)/precacher.mem.pprof \ + --trace-file=$(PROFILE_DIR)/precacher.trace \ + $(if $(filter y,$(ENABLE_CPU_PROFILE)),--enable-cpu-prof) \ + $(if $(filter y,$(ENABLE_MEM_PROFILE)),--enable-mem-prof) \ + $(if $(filter y,$(ENABLE_TRACE)),--enable-trace) \ + --timestamp-file=$(TIMESTAMP_DIR)/precacher.jsonl && \ + if [ ! -f $@ ] || [ -s "$(precache_downloaded_files)" ]; then \ + touch $@; \ + fi diff --git a/toolkit/scripts/tools.mk b/toolkit/scripts/tools.mk index 352767f5910..658caab19d6 100644 --- a/toolkit/scripts/tools.mk +++ b/toolkit/scripts/tools.mk @@ -42,6 +42,7 @@ go_tool_list = \ isomaker \ liveinstaller \ pkgworker \ + precacher \ roast \ rpmssnapshot \ scheduler \ diff --git a/toolkit/tools/internal/file/file.go b/toolkit/tools/internal/file/file.go index a793ce45baf..30c235da52a 100644 --- a/toolkit/tools/internal/file/file.go +++ b/toolkit/tools/internal/file/file.go @@ -127,6 +127,25 @@ func Write(data string, dst string) (err error) { return } +// WriteLines writes each string to the same file, separated by lineSeparator (e.g. "\n"). +func WriteLines(dataLines []string, destinationPath string) (err error) { + logger.Log.Debugf("Writing to (%s)", destinationPath) + + dstFile, err := os.Create(destinationPath) + if err != nil { + return + } + defer dstFile.Close() + + for _, line := range dataLines { + _, err = fmt.Fprintln(dstFile, line) + if err != nil { + return + } + } + return +} + // Append appends a string to the end of file dst. func Append(data string, dst string) (err error) { logger.Log.Debugf("Appending to file (%s): (%s)", dst, data) diff --git a/toolkit/tools/precacher/precacher.go b/toolkit/tools/precacher/precacher.go new file mode 100644 index 00000000000..1ea46e79886 --- /dev/null +++ b/toolkit/tools/precacher/precacher.go @@ -0,0 +1,417 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +package main + +import ( + "fmt" + "math/rand" + "os" + "path" + "strings" + "sync" + "time" + + "github.com/microsoft/CBL-Mariner/toolkit/tools/imagegen/installutils" + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/exe" + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/file" + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/jsonutils" + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/logger" + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/network" + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/packagerepo/repocloner" + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/randomization" + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/retry" + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/safechroot" + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/shell" + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/timestamp" + "github.com/microsoft/CBL-Mariner/toolkit/tools/pkg/profile" + "github.com/sirupsen/logrus" + + "gopkg.in/alecthomas/kingpin.v2" +) + +const ( + defaultNetOpsCount = "20" +) + +type downloadResultType int + +const ( + downloadResultTypeSuccess downloadResultType = iota + downloadResultTypeFailure + downloadResultTypeSkipped + donwloadResultTypeUnavailable +) + +type downloadResult struct { + pkgName string + resultType downloadResultType +} + +var ( + app = kingpin.New("precacher", "Pre-hydrate RPM cache for a given set of repo URLs and a RPM snapshot file.") + + logFile = exe.LogFileFlag(app) + logLevel = exe.LogLevelFlag(app) + profFlags = exe.SetupProfileFlags(app) + timestampFile = app.Flag("timestamp-file", "File that stores timestamps for this program.").String() + + outDir = app.Flag("output-dir", "Directory to download packages into.").Required().ExistingDir() + snapshot = app.Flag("snapshot", "Path to the rpm snapshot .json file.").ExistingFile() + outputSummaryFile = app.Flag("output-summary-file", "Path to save the summary of packages downloaded").String() + repoUrls = app.Flag("repo-url", "URLs of the repos to download from.").Strings() + workerTar = app.Flag("worker-tar", "Full path to worker_chroot.tar.gz").Required().ExistingFile() + buildDir = app.Flag("worker-dir", "Directory to store chroot while running repo query.").Required().ExistingDir() + + concurrentNetOps = app.Flag("concurrent-net-ops", "Number of concurrent network operations to perform.").Default(defaultNetOpsCount).Uint() +) + +func main() { + app.Version(exe.ToolkitVersion) + kingpin.MustParse(app.Parse(os.Args[1:])) + logger.InitBestEffort(*logFile, *logLevel) + + prof, err := profile.StartProfiling(profFlags) + if err != nil { + logger.Log.Warnf("Could not start profiling: %s", err) + } + defer prof.StopProfiler() + + timestamp.BeginTiming("precacher", *timestampFile) + defer timestamp.CompleteTiming() + + rpmSnapshot, err := rpmSnapshotFromFile(*snapshot) + if err != nil { + logger.PanicOnError(err) + } + + packagesAvailableFromRepos, err := getAllRepoData(*repoUrls, *workerTar, *buildDir) + if err != nil { + logger.PanicOnError(err) + } + + logger.Log.Infof("Found %d available packages", len(packagesAvailableFromRepos)) + if logger.Log.IsLevelEnabled(logrus.DebugLevel) { + for _, pkg := range packagesAvailableFromRepos { + logger.Log.Debugf("Found package: %s", pkg) + } + } + + downloadedPackages, err := downloadMissingPackages(rpmSnapshot, packagesAvailableFromRepos, *outDir, *concurrentNetOps) + if err != nil { + logger.PanicOnError(err) + } + + logger.Log.Infof("Downloaded %d packages into the cache", len(downloadedPackages)) + err = writeSummaryFile(*outputSummaryFile, downloadedPackages) + if err != nil { + logger.PanicOnError(err) + } +} + +func rpmSnapshotFromFile(snapshotFile string) (rpmSnapshot *repocloner.RepoContents, err error) { + err = jsonutils.ReadJSONFile(snapshotFile, &rpmSnapshot) + + // Randomize the order of the packages to average out the package sizes to optimize the download speed. Lots of small + // packages will be slow to download because of the overhead of the network operations, so mix in some large packages + // to average out the download time. We have a better chance of maximizing the network bandwidth this way. + rand.Seed(time.Now().UnixNano()) + rand.Shuffle(len(rpmSnapshot.Repo), func(i, j int) { + rpmSnapshot.Repo[i], rpmSnapshot.Repo[j] = rpmSnapshot.Repo[j], rpmSnapshot.Repo[i] + }) + + return +} + +// getAllRepoData returns a map of package names to URLs for all packages available in the given repos. It uses +// a chroot to run repoquery. +func getAllRepoData(repoURLs []string, workerTar, buildDir string) (namesToURLs map[string]string, err error) { + const ( + leaveChrootOnDisk = false + ) + timestamp.StartEvent("pull available package data from repos", nil) + defer timestamp.StopEvent(nil) + + queryChroot, err := createChroot(workerTar, buildDir, leaveChrootOnDisk) + if err != nil { + err = fmt.Errorf("failed to create chroot:\n%w", err) + return nil, err + } + defer queryChroot.Close(leaveChrootOnDisk) + + namesToURLs = make(map[string]string) + for _, repoURL := range repoURLs { + // Use the chroot to query each repo for the packages it contains + var packageRepoPaths []string + err = queryChroot.Run(func() (chrootErr error) { + packageRepoPaths, chrootErr = getPackageRepoPaths(repoURL) + return chrootErr + }) + if err != nil { + return nil, err + } + + // We will be searching by the name: "-..", the results from the repoquery will be + // in the form of "/-...rpm" + for _, packageRepoPath := range packageRepoPaths { + packageName := path.Base(packageRepoPath) + packageName = strings.TrimSuffix(packageName, ".rpm") + + // We need to prepend the repoURL to the partial URL to get the full URL + packageRepoPath = fmt.Sprintf("%s/%s", repoURL, packageRepoPath) + namesToURLs[packageName] = packageRepoPath + } + } + return +} + +// createChroot creates a network-enabled chroot to run repoquery in. The caller is expected to call Close() on the +// returned chroot unless an error is returned, in which case the chroot will be closed by this function. +func createChroot(workerTar, chrootDir string, leaveChrootOnDisk bool) (queryChroot *safechroot.Chroot, err error) { + const ( + dnfUtilsPackageName = "dnf-utils" + rootDir = "/" + ) + timestamp.StartEvent("creating repoquery chroot", nil) + defer timestamp.StopEvent(nil) + logger.Log.Info("Creating chroot for repoquery") + + queryChroot = safechroot.NewChroot(chrootDir, true) + err = queryChroot.Initialize(workerTar, nil, nil) + if err != nil { + err = fmt.Errorf("failed to initialize chroot:\n%w", err) + return + } + + defer func() { + if err != nil { + closeErr := queryChroot.Close(leaveChrootOnDisk) + if closeErr != nil { + logger.Log.Errorf("Failed to close chroot, err: %s", closeErr) + } + } + }() + + // We will need network to install the repoquery package + files := []safechroot.FileToCopy{ + {Src: "/etc/resolv.conf", Dest: "/etc/resolv.conf"}, + } + err = queryChroot.AddFiles(files...) + if err != nil { + err = fmt.Errorf("failed to add files to chroot:\n%w", err) + return + } + + // Install the repoquery package from upstream + logger.Log.Infof("Installing '%s' package to get 'repoquery' command", dnfUtilsPackageName) + queryChroot.Run(func() error { + _, err = installutils.TdnfInstall(dnfUtilsPackageName, rootDir) + if err != nil { + err = fmt.Errorf("failed to install '%s':\n%w", dnfUtilsPackageName, err) + } + return err + }) + if err != nil { + err = fmt.Errorf("failed to install '%s' in chroot:\n%w", dnfUtilsPackageName, err) + return + } + return +} + +// getPackageRepoPaths returns a list of packages available in the given repoUrl by running repoquery +func getPackageRepoPaths(repoUrl string) (packages []string, err error) { + const ( + reqoqueryTool = "repoquery" + randomNameLength = 10 + printErrorOutput = true + ) + var queryCommonArgList = []string{"-y", "-q", "--disablerepo=*", "-a", "--qf", "%{location}"} + + logger.Log.Infof("Getting package data from %s", repoUrl) + + // We want to avoid using the same repo name for each repoUrl, so we generate a random name + randomName, err := randomization.RandomString(randomNameLength, randomization.LegalCharactersAlphaNum) + if err != nil { + err = fmt.Errorf("failed to generate random string:\n%w", err) + return + } + repoPathArg := fmt.Sprintf("--repofrompath=mariner-precache-%s,%s", randomName, repoUrl) + finalArgList := append(queryCommonArgList, repoPathArg) + + onStdout := func(args ...interface{}) { + line := args[0].(string) + packages = append(packages, line) + } + + // Run the repoquery command + err = shell.ExecuteLiveWithCallback(onStdout, logger.Log.Warn, printErrorOutput, reqoqueryTool, finalArgList...) + if err != nil { + err = fmt.Errorf("failed to run repoquery command:\n%w", err) + return + } + + return +} + +// downloadMissingPackages will attemp to download each package listed in rpmSnapshot that is not already present in the +// outDir. It will return a list of the packages that were downloaded. It will use concurrentNetOps to limit the number of +// concurrent network operations used to download the missing packages. It will also monitor the results and print periodic +// progress updates to the console. +func downloadMissingPackages(rpmSnapshot *repocloner.RepoContents, packagesAvailableFromRepos map[string]string, outDir string, concurrentNetOps uint) (downloadedPackages []string, err error) { + timestamp.StartEvent("download missing packages", nil) + defer timestamp.StopEvent(nil) + + // We will be downloading packages concurrently, so we need to keep track of when they are all done via a wait group. To + // simplify the code just use goroutines with a semaphore channel to limit the number of concurrent network operations. Each + // goroutine will handle a single package and will send the result of the download to a results channel. The main thread will + // monitor the results channel and update the progress counter accordingly. + wg := new(sync.WaitGroup) + netOpsSemaphore := make(chan struct{}, concurrentNetOps) + results := make(chan downloadResult) + doneChannel := make(chan struct{}) + + // Spawn a worker for each package, they will all do preliminary checks in parallel before synchronizing on the semaphore. + // Each worker is responsible for removing itself from the wait group once done. + for _, pkg := range rpmSnapshot.Repo { + wg.Add(1) + go precachePackage(pkg, packagesAvailableFromRepos, outDir, wg, results, netOpsSemaphore) + } + + // Wait for all the workers to finish and signal the main thread when we are done + go func() { + wg.Wait() + close(doneChannel) + }() + + // Monitor the results channel and update the progress counter accordingly. Return once the done channel is closed. + downloadedPackages = monitorProgress(len(rpmSnapshot.Repo), results, doneChannel) + + return +} + +// monitorProgress will wait for results from the downloadResult channel and update the progress counter accordingly. If +// no more results are available we expect the done channel to be closed, at which point we will return. +func monitorProgress(total int, results chan downloadResult, doneChannel chan struct{}) (downloadedPackages []string) { + const progressIncrement = 10.0 + + downloaded := 0 + skipped := 0 + failed := 0 + unavailable := 0 + lastProgressUpdate := progressIncrement * -1 + + for done := false; !done; { + // Wait for a result from a worker, or the done channel to be closed (which means all workers are done) + select { + case result := <-results: + switch result.resultType { + case downloadResultTypeSkipped: + logger.Log.Debugf("Skipping pre-caching '%s'. File already exists", result.pkgName) + skipped++ + case downloadResultTypeSuccess: + logger.Log.Debugf("Pre-caching '%s' succeeded", result.pkgName) + downloadedPackages = append(downloadedPackages, result.pkgName) + downloaded++ + case downloadResultTypeFailure: + logger.Log.Warnf("Failed to download: %s", result.pkgName) + failed++ + case donwloadResultTypeUnavailable: + logger.Log.Warnf("Could not find '%s' in any repos", result.pkgName) + unavailable++ + } + case <-doneChannel: + // All workers are done, finish this iteration of the loop and then return + done = true + } + + // Calculate the progress percentage and update the progress counter if needed (update every 'progressIncrement' percent) + completed := downloaded + skipped + failed + unavailable + progressPercent := (float64(completed) / float64(total)) * 100 + if progressPercent > lastProgressUpdate+progressIncrement || done { + logger.Log.Infof("Pre-caching: %3d%% ( downloaded: %4d, skipped: %4d, unavailable: %4d, failed: %4d )", int(progressPercent), downloaded, skipped, unavailable, failed) + lastProgressUpdate = progressPercent + } + } + return +} + +// precachePackage will attempt to download the specified package. It will return a downloadResult struct via the results. +// This function runs with best effort, so it will return all errors via the results channel. rather than returning an error. +// The results may be one of: +// - downloadResultTypeSuccess: The package was downloaded successfully +// - downloadResultTypeFailure: The package failed to download (ie error occured) +// - downloadResultTypeSkipped: The package was not downloaded because it already exists +// - donwloadResultTypeUnavailable: The package was not downloaded because it was not found in any of the repos +// +// The caller is expected to have added to the provided wait group, while this function is +// responsible for removing itself from the wait group. As much processing as possible is done before acquiring the +// network operations semaphore to minimize the time spent holding it. +func precachePackage(pkg *repocloner.RepoPackage, packagesAvailableFromRepos map[string]string, outDir string, wg *sync.WaitGroup, results chan<- downloadResult, netOpsSemaphore chan struct{}) { + const ( + downloadRetryAttempts = 2 + downloadRetryDuration = time.Second + ) + + // File names are of the form "-...rpm" + pkgName := fmt.Sprintf("%s-%s.%s.%s", pkg.Name, pkg.Version, pkg.Distribution, pkg.Architecture) + fileName := fmt.Sprintf("%s.rpm", pkgName) + fullFilePath := path.Join(outDir, fileName) + result := downloadResult{ + pkgName: fileName, + resultType: downloadResultTypeFailure, + } + + defer func() { + results <- result + wg.Done() + }() + + // Bail out early if the file already exists + exists, err := file.PathExists(fullFilePath) + if err != nil { + logger.Log.Warnf("Failed to check if file exists: %s", err) + return + } + if exists { + result.resultType = downloadResultTypeSkipped + return + } + + // Get the url for the package, or bail out if it is not available + url, ok := packagesAvailableFromRepos[pkgName] + if !ok { + result.resultType = donwloadResultTypeUnavailable + return + } + + // Limit the number of concurrent network operations to avoid overloading the network. All work past this point + // is either network related, or trivial, so we can safely hold the semaphore until we are done. + netOpsSemaphore <- struct{}{} + defer func() { + <-netOpsSemaphore + }() + + logger.Log.Debugf("Pre-caching '%s' from '%s'", fileName, url) + err = retry.Run(func() error { + err := network.DownloadFile(url, fullFilePath, nil, nil) + if err != nil { + logger.Log.Warnf("Attempt to download (%s) failed. Error: %s", url, err) + } + return err + }, downloadRetryAttempts, downloadRetryDuration) + if err != nil { + return + } + + result.resultType = downloadResultTypeSuccess +} + +func writeSummaryFile(summaryFile string, downloadedPackages []string) (err error) { + logger.Log.Infof("Writing summary file to '%s'", summaryFile) + err = file.WriteLines(downloadedPackages, summaryFile) + if err != nil { + err = fmt.Errorf("failed to write pre-caching summary file:\n%w", err) + return + } + return +} From d367e4560e0271c53df735a25c729d58bca1fa89 Mon Sep 17 00:00:00 2001 From: Daniel McIlvaney Date: Wed, 23 Aug 2023 16:49:50 -0700 Subject: [PATCH 11/64] Fix retry backoff sleep non-determinism (#6040) * Fix retry backoff sleep non-determinism * Split into two selects --- toolkit/tools/internal/retry/retry.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/toolkit/tools/internal/retry/retry.go b/toolkit/tools/internal/retry/retry.go index 149b50317b9..dd218ec2ab0 100644 --- a/toolkit/tools/internal/retry/retry.go +++ b/toolkit/tools/internal/retry/retry.go @@ -35,6 +35,15 @@ func calculateLinearDelay(failCount int, sleep time.Duration) time.Duration { // backoffSleep sleeps for the given duration, unless the cancel channel is triggered or closed first. The cancel channel // may be nil in which case the sleep will always complete. func backoffSleep(delay time.Duration, cancel <-chan struct{}) (cancelled bool) { + // Check if we were cancelled before we sleep to avoid a race condition with + // delay=0 and an immediate cancel. + select { + case <-cancel: + cancelled = true + return + default: + } + select { case <-time.After(delay): case <-cancel: From cfd772b27f784d38af7a1610d6cdceadd322c812 Mon Sep 17 00:00:00 2001 From: Muhammad Falak R Wani Date: Thu, 24 Aug 2023 09:20:18 +0530 Subject: [PATCH 12/64] toolkit: containerized-build: add vim & git in the build env (#6035) Signed-off-by: Muhammad Falak R Wani --- .../scripts/containerized-build/resources/mariner.Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/toolkit/scripts/containerized-build/resources/mariner.Dockerfile b/toolkit/scripts/containerized-build/resources/mariner.Dockerfile index ef10db25c97..da51d3780d4 100644 --- a/toolkit/scripts/containerized-build/resources/mariner.Dockerfile +++ b/toolkit/scripts/containerized-build/resources/mariner.Dockerfile @@ -17,3 +17,6 @@ RUN if [[ "${enable_local_repo}" == "true" ]]; then echo "enable_local_repo" >> RUN echo "cat /mariner_setup_dir/splash.txt" >> /root/.bashrc && \ echo "show_help" >> /root/.bashrc && \ echo "cd /usr/src/mariner/ || { echo \"ERROR: Could not change directory to /usr/src/mariner/ \"; exit 1; }" >> /root/.bashrc + +# Install vim & git in the build env +RUN tdnf --releasever=$version install -y vim git From 539005f1058cf7273fe4cd5e9e02a00cf3a89c61 Mon Sep 17 00:00:00 2001 From: CBL-Mariner-Bot <75509084+CBL-Mariner-Bot@users.noreply.github.com> Date: Thu, 24 Aug 2023 11:09:56 -0700 Subject: [PATCH 13/64] [AUTOPATCHER-kernel] Kernel CVE - branch main - CVE-2023-4385 CVE-2023-4387 CVE-2023-40283 (#6033) * CVE-2023-40283 * CVE-2023-4385 CVE-2023-4387 --- SPECS/kernel/CVE-2023-40283.nopatch | 3 +++ SPECS/kernel/CVE-2023-4385.nopatch | 3 +++ SPECS/kernel/CVE-2023-4387.nopatch | 3 +++ 3 files changed, 9 insertions(+) create mode 100644 SPECS/kernel/CVE-2023-40283.nopatch create mode 100644 SPECS/kernel/CVE-2023-4385.nopatch create mode 100644 SPECS/kernel/CVE-2023-4387.nopatch diff --git a/SPECS/kernel/CVE-2023-40283.nopatch b/SPECS/kernel/CVE-2023-40283.nopatch new file mode 100644 index 00000000000..52acff09c48 --- /dev/null +++ b/SPECS/kernel/CVE-2023-40283.nopatch @@ -0,0 +1,3 @@ +CVE-2023-40283 - patched in 5.15.126.1 - (generated by autopatch tool) +upstream 1728137b33c00d5a2b5110ed7aafb42e7c32e4a1 - stable fbe5a2fed8156cc19eb3b956602b0a1dd46a302d + diff --git a/SPECS/kernel/CVE-2023-4385.nopatch b/SPECS/kernel/CVE-2023-4385.nopatch new file mode 100644 index 00000000000..04c769fd397 --- /dev/null +++ b/SPECS/kernel/CVE-2023-4385.nopatch @@ -0,0 +1,3 @@ +CVE-2023-4385 - patched in 5.15.46.1 - (generated by autopatch tool) +upstream 0d4837fdb796f99369cf7691d33de1b856bcaf1f - stable 4b9380d92c66cdc66987f65130789abad5c1af6f + diff --git a/SPECS/kernel/CVE-2023-4387.nopatch b/SPECS/kernel/CVE-2023-4387.nopatch new file mode 100644 index 00000000000..834dbeee722 --- /dev/null +++ b/SPECS/kernel/CVE-2023-4387.nopatch @@ -0,0 +1,3 @@ +CVE-2023-4387 - patched in 5.15.42.1 - (generated by autopatch tool) +upstream 9e7fef9521e73ca8afd7da9e58c14654b02dfad8 - stable 4ad09fdef55b70f16f8d385981b864ac75cf1354 + From f571b3fabde3a07cde8bdd2e9d584c6633e5af78 Mon Sep 17 00:00:00 2001 From: rlmenge Date: Thu, 24 Aug 2023 11:13:30 -0700 Subject: [PATCH 14/64] Patch etcd and bump fuzzing for CVE-2023-32082 (#6041) * Address CVE-2023-32082 with patches * Update fuzzing to default to 2 --- SPECS/etcd/CVE-2023-32082-v3.5.0.patch | 272 ++++++++++++++++++++++++ SPECS/etcd/CVE-2023-32082-v3.5.3.patch | 272 ++++++++++++++++++++++++ SPECS/etcd/CVE-2023-32082.patch | 282 +++++++++++++++++++++++++ SPECS/etcd/etcd-3.5.0.spec | 9 +- SPECS/etcd/etcd-3.5.1.spec | 9 +- SPECS/etcd/etcd-3.5.3.spec | 9 +- SPECS/etcd/etcd-3.5.4.spec | 9 +- SPECS/etcd/etcd-3.5.5.spec | 9 +- SPECS/etcd/etcd-3.5.6.spec | 9 +- 9 files changed, 868 insertions(+), 12 deletions(-) create mode 100644 SPECS/etcd/CVE-2023-32082-v3.5.0.patch create mode 100644 SPECS/etcd/CVE-2023-32082-v3.5.3.patch create mode 100644 SPECS/etcd/CVE-2023-32082.patch diff --git a/SPECS/etcd/CVE-2023-32082-v3.5.0.patch b/SPECS/etcd/CVE-2023-32082-v3.5.0.patch new file mode 100644 index 00000000000..26dbfc3ce5a --- /dev/null +++ b/SPECS/etcd/CVE-2023-32082-v3.5.0.patch @@ -0,0 +1,272 @@ +From 3e6c1e3207e421584525994a08ae16f01f200ac6 Mon Sep 17 00:00:00 2001 +From: Rachel Menge +Date: Wed, 23 Aug 2023 13:22:19 -0700 +Subject: [PATCH] Patch CVE-2023-32082 + +--- + server/etcdserver/v3_server.go | 52 +++++++++++++++++- + tests/e2e/ctl_v3_auth_test.go | 49 +++++++++++++++++ + tests/e2e/ctl_v3_lease_test.go | 8 +++ + tests/integration/v3_auth_test.go | 91 +++++++++++++++++++++++++++++-- + 4 files changed, 194 insertions(+), 6 deletions(-) + +diff --git a/server/etcdserver/v3_server.go b/server/etcdserver/v3_server.go +index c4e9397..e94853a 100644 +--- a/server/etcdserver/v3_server.go ++++ b/server/etcdserver/v3_server.go +@@ -314,7 +314,32 @@ func (s *EtcdServer) LeaseRenew(ctx context.Context, id lease.LeaseID) (int64, e + return -1, ErrCanceled + } + +-func (s *EtcdServer) LeaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveRequest) (*pb.LeaseTimeToLiveResponse, error) { ++func (s *EtcdServer) checkLeaseTimeToLive(ctx context.Context, leaseID lease.LeaseID) (uint64, error) { ++ rev := s.AuthStore().Revision() ++ if !s.AuthStore().IsAuthEnabled() { ++ return rev, nil ++ } ++ authInfo, err := s.AuthInfoFromCtx(ctx) ++ if err != nil { ++ return rev, err ++ } ++ if authInfo == nil { ++ return rev, auth.ErrUserEmpty ++ } ++ ++ l := s.lessor.Lookup(leaseID) ++ if l != nil { ++ for _, key := range l.Keys() { ++ if err := s.AuthStore().IsRangePermitted(authInfo, []byte(key), []byte{}); err != nil { ++ return 0, err ++ } ++ } ++ } ++ ++ return rev, nil ++} ++ ++func (s *EtcdServer) leaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveRequest) (*pb.LeaseTimeToLiveResponse, error) { + if s.Leader() == s.ID() { + // primary; timetolive directly from leader + le := s.lessor.Lookup(lease.LeaseID(r.ID)) +@@ -361,6 +386,31 @@ func (s *EtcdServer) LeaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveR + return nil, ErrCanceled + } + ++func (s *EtcdServer) LeaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveRequest) (*pb.LeaseTimeToLiveResponse, error) { ++ var rev uint64 ++ var err error ++ if r.Keys { ++ // check RBAC permission only if Keys is true ++ rev, err = s.checkLeaseTimeToLive(ctx, lease.LeaseID(r.ID)) ++ if err != nil { ++ return nil, err ++ } ++ } ++ ++ resp, err := s.leaseTimeToLive(ctx, r) ++ if err != nil { ++ return nil, err ++ } ++ ++ if r.Keys { ++ if s.AuthStore().IsAuthEnabled() && rev != s.AuthStore().Revision() { ++ return nil, auth.ErrAuthOldRevision ++ } ++ } ++ return resp, nil ++} ++ ++// LeaseLeases is really ListLeases !??? + func (s *EtcdServer) LeaseLeases(ctx context.Context, r *pb.LeaseLeasesRequest) (*pb.LeaseLeasesResponse, error) { + ls := s.lessor.Leases() + lss := make([]*pb.LeaseStatus, len(ls)) +diff --git a/tests/e2e/ctl_v3_auth_test.go b/tests/e2e/ctl_v3_auth_test.go +index 58a3b61..090c4ab 100644 +--- a/tests/e2e/ctl_v3_auth_test.go ++++ b/tests/e2e/ctl_v3_auth_test.go +@@ -70,6 +70,7 @@ func TestCtlV3AuthSnapshot(t *testing.T) { testCtl(t, authTestSnapsho + func TestCtlV3AuthSnapshotJWT(t *testing.T) { testCtl(t, authTestSnapshot, withCfg(*newConfigJWT())) } + func TestCtlV3AuthJWTExpire(t *testing.T) { testCtl(t, authTestJWTExpire, withCfg(*newConfigJWT())) } + func TestCtlV3AuthRevisionConsistency(t *testing.T) { testCtl(t, authTestRevisionConsistency) } ++func TestCtlV3AuthLeaseTimeToLive(t *testing.T) { testCtl(t, authTestLeaseTimeToLive) } + + func authEnableTest(cx ctlCtx) { + if err := authEnable(cx); err != nil { +@@ -1206,3 +1207,51 @@ func authTestRevisionConsistency(cx ctlCtx) { + cx.t.Fatalf("auth revison shouldn't change when restarting etcd, expected: %d, got: %d", oldAuthRevision, newAuthRevision) + } + } ++ ++func authTestLeaseTimeToLive(cx ctlCtx) { ++ if err := authEnable(cx); err != nil { ++ cx.t.Fatal(err) ++ } ++ cx.user, cx.pass = "root", "root" ++ ++ authSetupTestUser(cx) ++ ++ cx.user = "test-user" ++ cx.pass = "pass" ++ ++ leaseID, err := ctlV3LeaseGrant(cx, 10) ++ if err != nil { ++ cx.t.Fatal(err) ++ } ++ ++ err = ctlV3Put(cx, "foo", "val", leaseID) ++ if err != nil { ++ cx.t.Fatal(err) ++ } ++ ++ err = ctlV3LeaseTimeToLive(cx, leaseID, true) ++ if err != nil { ++ cx.t.Fatal(err) ++ } ++ ++ cx.user = "root" ++ cx.pass = "root" ++ err = ctlV3Put(cx, "bar", "val", leaseID) ++ if err != nil { ++ cx.t.Fatal(err) ++ } ++ ++ cx.user = "test-user" ++ cx.pass = "pass" ++ // the lease is attached to bar, which test-user cannot access ++ err = ctlV3LeaseTimeToLive(cx, leaseID, true) ++ if err == nil { ++ cx.t.Fatal("test-user must not be able to access to the lease, because it's attached to the key bar") ++ } ++ ++ // without --keys, access should be allowed ++ err = ctlV3LeaseTimeToLive(cx, leaseID, false) ++ if err != nil { ++ cx.t.Fatal(err) ++ } ++} +diff --git a/tests/e2e/ctl_v3_lease_test.go b/tests/e2e/ctl_v3_lease_test.go +index 59e47bc..fffcdf6 100644 +--- a/tests/e2e/ctl_v3_lease_test.go ++++ b/tests/e2e/ctl_v3_lease_test.go +@@ -300,3 +300,11 @@ func ctlV3LeaseRevoke(cx ctlCtx, leaseID string) error { + cmdArgs := append(cx.PrefixArgs(), "lease", "revoke", leaseID) + return spawnWithExpect(cmdArgs, fmt.Sprintf("lease %s revoked", leaseID)) + } ++ ++func ctlV3LeaseTimeToLive(cx ctlCtx, leaseID string, withKeys bool) error { ++ cmdArgs := append(cx.PrefixArgs(), "lease", "timetolive", leaseID) ++ if withKeys { ++ cmdArgs = append(cmdArgs, "--keys") ++ } ++ return spawnWithExpectWithEnv(cmdArgs, cx.envMap, fmt.Sprintf("lease %s granted with", leaseID)) ++} +diff --git a/tests/integration/v3_auth_test.go b/tests/integration/v3_auth_test.go +index 286f2db..95272ad 100644 +--- a/tests/integration/v3_auth_test.go ++++ b/tests/integration/v3_auth_test.go +@@ -150,12 +150,10 @@ func testV3AuthWithLeaseRevokeWithRoot(t *testing.T, ccfg ClusterConfig) { + // wait for lease expire + time.Sleep(3 * time.Second) + +- tresp, terr := api.Lease.LeaseTimeToLive( ++ tresp, terr := rootc.TimeToLive( + context.TODO(), +- &pb.LeaseTimeToLiveRequest{ +- ID: int64(leaseID), +- Keys: true, +- }, ++ leaseID, ++ clientv3.WithAttachedKeys(), + ) + if terr != nil { + t.Error(terr) +@@ -394,3 +392,86 @@ func TestV3AuthOldRevConcurrent(t *testing.T) { + } + wg.Wait() + } ++ ++func TestV3AuthWithLeaseTimeToLive(t *testing.T) { ++ BeforeTest(t) ++ clus := NewClusterV3(t, &ClusterConfig{Size: 1}) ++ defer clus.Terminate(t) ++ ++ users := []user{ ++ { ++ name: "user1", ++ password: "user1-123", ++ role: "role1", ++ key: "k1", ++ end: "k3", ++ }, ++ { ++ name: "user2", ++ password: "user2-123", ++ role: "role2", ++ key: "k2", ++ end: "k4", ++ }, ++ } ++ authSetupUsers(t, toGRPC(clus.Client(0)).Auth, users) ++ ++ authSetupRoot(t, toGRPC(clus.Client(0)).Auth) ++ ++ user1c, cerr := NewClient(t, clientv3.Config{Endpoints: clus.Client(0).Endpoints(), Username: "user1", Password: "user1-123"}) ++ if cerr != nil { ++ t.Fatal(cerr) ++ } ++ defer user1c.Close() ++ ++ user2c, cerr := NewClient(t, clientv3.Config{Endpoints: clus.Client(0).Endpoints(), Username: "user2", Password: "user2-123"}) ++ if cerr != nil { ++ t.Fatal(cerr) ++ } ++ defer user2c.Close() ++ ++ leaseResp, err := user1c.Grant(context.TODO(), 90) ++ if err != nil { ++ t.Fatal(err) ++ } ++ leaseID := leaseResp.ID ++ _, err = user1c.Put(context.TODO(), "k1", "val", clientv3.WithLease(leaseID)) ++ if err != nil { ++ t.Fatal(err) ++ } ++ // k2 can be accessed from both user1 and user2 ++ _, err = user1c.Put(context.TODO(), "k2", "val", clientv3.WithLease(leaseID)) ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ _, err = user1c.TimeToLive(context.TODO(), leaseID) ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ _, err = user2c.TimeToLive(context.TODO(), leaseID) ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ _, err = user2c.TimeToLive(context.TODO(), leaseID, clientv3.WithAttachedKeys()) ++ if err == nil { ++ t.Fatal("timetolive from user2 should be failed with permission denied") ++ } ++ ++ rootc, cerr := NewClient(t, clientv3.Config{Endpoints: clus.Client(0).Endpoints(), Username: "root", Password: "123"}) ++ if cerr != nil { ++ t.Fatal(cerr) ++ } ++ defer rootc.Close() ++ ++ if _, err := rootc.RoleRevokePermission(context.TODO(), "role1", "k1", "k3"); err != nil { ++ t.Fatal(err) ++ } ++ ++ _, err = user1c.TimeToLive(context.TODO(), leaseID, clientv3.WithAttachedKeys()) ++ if err == nil { ++ t.Fatal("timetolive from user2 should be failed with permission denied") ++ } ++} +-- +2.17.1 + diff --git a/SPECS/etcd/CVE-2023-32082-v3.5.3.patch b/SPECS/etcd/CVE-2023-32082-v3.5.3.patch new file mode 100644 index 00000000000..5d334b1c8a9 --- /dev/null +++ b/SPECS/etcd/CVE-2023-32082-v3.5.3.patch @@ -0,0 +1,272 @@ +From 3dee04d0c96383dc95b453ed1c6b3e12eeea2103 Mon Sep 17 00:00:00 2001 +From: Rachel Menge +Date: Wed, 23 Aug 2023 13:31:30 -0700 +Subject: [PATCH] Patch CVE-2023-32082 + +--- + server/etcdserver/v3_server.go | 52 +++++++++++++++++- + tests/e2e/ctl_v3_auth_test.go | 49 +++++++++++++++++ + tests/e2e/ctl_v3_lease_test.go | 8 +++ + tests/integration/v3_auth_test.go | 91 +++++++++++++++++++++++++++++-- + 4 files changed, 194 insertions(+), 6 deletions(-) + +diff --git a/server/etcdserver/v3_server.go b/server/etcdserver/v3_server.go +index 960a7b1..9f69b86 100644 +--- a/server/etcdserver/v3_server.go ++++ b/server/etcdserver/v3_server.go +@@ -336,7 +336,32 @@ func (s *EtcdServer) LeaseRenew(ctx context.Context, id lease.LeaseID) (int64, e + return -1, ErrCanceled + } + +-func (s *EtcdServer) LeaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveRequest) (*pb.LeaseTimeToLiveResponse, error) { ++func (s *EtcdServer) checkLeaseTimeToLive(ctx context.Context, leaseID lease.LeaseID) (uint64, error) { ++ rev := s.AuthStore().Revision() ++ if !s.AuthStore().IsAuthEnabled() { ++ return rev, nil ++ } ++ authInfo, err := s.AuthInfoFromCtx(ctx) ++ if err != nil { ++ return rev, err ++ } ++ if authInfo == nil { ++ return rev, auth.ErrUserEmpty ++ } ++ ++ l := s.lessor.Lookup(leaseID) ++ if l != nil { ++ for _, key := range l.Keys() { ++ if err := s.AuthStore().IsRangePermitted(authInfo, []byte(key), []byte{}); err != nil { ++ return 0, err ++ } ++ } ++ } ++ ++ return rev, nil ++} ++ ++func (s *EtcdServer) leaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveRequest) (*pb.LeaseTimeToLiveResponse, error) { + if s.isLeader() { + if err := s.waitAppliedIndex(); err != nil { + return nil, err +@@ -386,6 +411,31 @@ func (s *EtcdServer) LeaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveR + return nil, ErrCanceled + } + ++func (s *EtcdServer) LeaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveRequest) (*pb.LeaseTimeToLiveResponse, error) { ++ var rev uint64 ++ var err error ++ if r.Keys { ++ // check RBAC permission only if Keys is true ++ rev, err = s.checkLeaseTimeToLive(ctx, lease.LeaseID(r.ID)) ++ if err != nil { ++ return nil, err ++ } ++ } ++ ++ resp, err := s.leaseTimeToLive(ctx, r) ++ if err != nil { ++ return nil, err ++ } ++ ++ if r.Keys { ++ if s.AuthStore().IsAuthEnabled() && rev != s.AuthStore().Revision() { ++ return nil, auth.ErrAuthOldRevision ++ } ++ } ++ return resp, nil ++} ++ ++// LeaseLeases is really ListLeases !??? + func (s *EtcdServer) LeaseLeases(ctx context.Context, r *pb.LeaseLeasesRequest) (*pb.LeaseLeasesResponse, error) { + ls := s.lessor.Leases() + lss := make([]*pb.LeaseStatus, len(ls)) +diff --git a/tests/e2e/ctl_v3_auth_test.go b/tests/e2e/ctl_v3_auth_test.go +index 11db1b3..79af238 100644 +--- a/tests/e2e/ctl_v3_auth_test.go ++++ b/tests/e2e/ctl_v3_auth_test.go +@@ -70,6 +70,7 @@ func TestCtlV3AuthSnapshot(t *testing.T) { testCtl(t, authTestSnapsho + func TestCtlV3AuthSnapshotJWT(t *testing.T) { testCtl(t, authTestSnapshot, withCfg(*newConfigJWT())) } + func TestCtlV3AuthJWTExpire(t *testing.T) { testCtl(t, authTestJWTExpire, withCfg(*newConfigJWT())) } + func TestCtlV3AuthRevisionConsistency(t *testing.T) { testCtl(t, authTestRevisionConsistency) } ++func TestCtlV3AuthLeaseTimeToLive(t *testing.T) { testCtl(t, authTestLeaseTimeToLive) } + + func authEnableTest(cx ctlCtx) { + if err := authEnable(cx); err != nil { +@@ -1206,3 +1207,51 @@ func authTestRevisionConsistency(cx ctlCtx) { + cx.t.Fatalf("auth revison shouldn't change when restarting etcd, expected: %d, got: %d", oldAuthRevision, newAuthRevision) + } + } ++ ++func authTestLeaseTimeToLive(cx ctlCtx) { ++ if err := authEnable(cx); err != nil { ++ cx.t.Fatal(err) ++ } ++ cx.user, cx.pass = "root", "root" ++ ++ authSetupTestUser(cx) ++ ++ cx.user = "test-user" ++ cx.pass = "pass" ++ ++ leaseID, err := ctlV3LeaseGrant(cx, 10) ++ if err != nil { ++ cx.t.Fatal(err) ++ } ++ ++ err = ctlV3Put(cx, "foo", "val", leaseID) ++ if err != nil { ++ cx.t.Fatal(err) ++ } ++ ++ err = ctlV3LeaseTimeToLive(cx, leaseID, true) ++ if err != nil { ++ cx.t.Fatal(err) ++ } ++ ++ cx.user = "root" ++ cx.pass = "root" ++ err = ctlV3Put(cx, "bar", "val", leaseID) ++ if err != nil { ++ cx.t.Fatal(err) ++ } ++ ++ cx.user = "test-user" ++ cx.pass = "pass" ++ // the lease is attached to bar, which test-user cannot access ++ err = ctlV3LeaseTimeToLive(cx, leaseID, true) ++ if err == nil { ++ cx.t.Fatal("test-user must not be able to access to the lease, because it's attached to the key bar") ++ } ++ ++ // without --keys, access should be allowed ++ err = ctlV3LeaseTimeToLive(cx, leaseID, false) ++ if err != nil { ++ cx.t.Fatal(err) ++ } ++} +diff --git a/tests/e2e/ctl_v3_lease_test.go b/tests/e2e/ctl_v3_lease_test.go +index 0dc4452..e4e15d9 100644 +--- a/tests/e2e/ctl_v3_lease_test.go ++++ b/tests/e2e/ctl_v3_lease_test.go +@@ -300,3 +300,11 @@ func ctlV3LeaseRevoke(cx ctlCtx, leaseID string) error { + cmdArgs := append(cx.PrefixArgs(), "lease", "revoke", leaseID) + return spawnWithExpectWithEnv(cmdArgs, cx.envMap, fmt.Sprintf("lease %s revoked", leaseID)) + } ++ ++func ctlV3LeaseTimeToLive(cx ctlCtx, leaseID string, withKeys bool) error { ++ cmdArgs := append(cx.PrefixArgs(), "lease", "timetolive", leaseID) ++ if withKeys { ++ cmdArgs = append(cmdArgs, "--keys") ++ } ++ return spawnWithExpectWithEnv(cmdArgs, cx.envMap, fmt.Sprintf("lease %s granted with", leaseID)) ++} +diff --git a/tests/integration/v3_auth_test.go b/tests/integration/v3_auth_test.go +index 286f2db..95272ad 100644 +--- a/tests/integration/v3_auth_test.go ++++ b/tests/integration/v3_auth_test.go +@@ -150,12 +150,10 @@ func testV3AuthWithLeaseRevokeWithRoot(t *testing.T, ccfg ClusterConfig) { + // wait for lease expire + time.Sleep(3 * time.Second) + +- tresp, terr := api.Lease.LeaseTimeToLive( ++ tresp, terr := rootc.TimeToLive( + context.TODO(), +- &pb.LeaseTimeToLiveRequest{ +- ID: int64(leaseID), +- Keys: true, +- }, ++ leaseID, ++ clientv3.WithAttachedKeys(), + ) + if terr != nil { + t.Error(terr) +@@ -394,3 +392,86 @@ func TestV3AuthOldRevConcurrent(t *testing.T) { + } + wg.Wait() + } ++ ++func TestV3AuthWithLeaseTimeToLive(t *testing.T) { ++ BeforeTest(t) ++ clus := NewClusterV3(t, &ClusterConfig{Size: 1}) ++ defer clus.Terminate(t) ++ ++ users := []user{ ++ { ++ name: "user1", ++ password: "user1-123", ++ role: "role1", ++ key: "k1", ++ end: "k3", ++ }, ++ { ++ name: "user2", ++ password: "user2-123", ++ role: "role2", ++ key: "k2", ++ end: "k4", ++ }, ++ } ++ authSetupUsers(t, toGRPC(clus.Client(0)).Auth, users) ++ ++ authSetupRoot(t, toGRPC(clus.Client(0)).Auth) ++ ++ user1c, cerr := NewClient(t, clientv3.Config{Endpoints: clus.Client(0).Endpoints(), Username: "user1", Password: "user1-123"}) ++ if cerr != nil { ++ t.Fatal(cerr) ++ } ++ defer user1c.Close() ++ ++ user2c, cerr := NewClient(t, clientv3.Config{Endpoints: clus.Client(0).Endpoints(), Username: "user2", Password: "user2-123"}) ++ if cerr != nil { ++ t.Fatal(cerr) ++ } ++ defer user2c.Close() ++ ++ leaseResp, err := user1c.Grant(context.TODO(), 90) ++ if err != nil { ++ t.Fatal(err) ++ } ++ leaseID := leaseResp.ID ++ _, err = user1c.Put(context.TODO(), "k1", "val", clientv3.WithLease(leaseID)) ++ if err != nil { ++ t.Fatal(err) ++ } ++ // k2 can be accessed from both user1 and user2 ++ _, err = user1c.Put(context.TODO(), "k2", "val", clientv3.WithLease(leaseID)) ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ _, err = user1c.TimeToLive(context.TODO(), leaseID) ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ _, err = user2c.TimeToLive(context.TODO(), leaseID) ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ _, err = user2c.TimeToLive(context.TODO(), leaseID, clientv3.WithAttachedKeys()) ++ if err == nil { ++ t.Fatal("timetolive from user2 should be failed with permission denied") ++ } ++ ++ rootc, cerr := NewClient(t, clientv3.Config{Endpoints: clus.Client(0).Endpoints(), Username: "root", Password: "123"}) ++ if cerr != nil { ++ t.Fatal(cerr) ++ } ++ defer rootc.Close() ++ ++ if _, err := rootc.RoleRevokePermission(context.TODO(), "role1", "k1", "k3"); err != nil { ++ t.Fatal(err) ++ } ++ ++ _, err = user1c.TimeToLive(context.TODO(), leaseID, clientv3.WithAttachedKeys()) ++ if err == nil { ++ t.Fatal("timetolive from user2 should be failed with permission denied") ++ } ++} +-- +2.17.1 + diff --git a/SPECS/etcd/CVE-2023-32082.patch b/SPECS/etcd/CVE-2023-32082.patch new file mode 100644 index 00000000000..5f066b1b60d --- /dev/null +++ b/SPECS/etcd/CVE-2023-32082.patch @@ -0,0 +1,282 @@ +From d1b1aa9dbe8065fb2cb36fe035daf701ccabc4e0 Mon Sep 17 00:00:00 2001 +From: Hitoshi Mitake +Date: Wed, 29 Mar 2023 20:46:32 +0900 +Subject: [PATCH 1/2] etcdserver: protect lease timetilive with auth + +Signed-off-by: Hitoshi Mitake +Co-authored-by: Benjamin Wang +--- + server/etcdserver/v3_server.go | 52 +++++++++++++++++++++++++++++++++- + 1 file changed, 51 insertions(+), 1 deletion(-) + +diff --git a/server/etcdserver/v3_server.go b/server/etcdserver/v3_server.go +index 960a7b11f4b..9f69b86b9b1 100644 +--- a/server/etcdserver/v3_server.go ++++ b/server/etcdserver/v3_server.go +@@ -336,7 +336,32 @@ func (s *EtcdServer) LeaseRenew(ctx context.Context, id lease.LeaseID) (int64, e + return -1, ErrCanceled + } + +-func (s *EtcdServer) LeaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveRequest) (*pb.LeaseTimeToLiveResponse, error) { ++func (s *EtcdServer) checkLeaseTimeToLive(ctx context.Context, leaseID lease.LeaseID) (uint64, error) { ++ rev := s.AuthStore().Revision() ++ if !s.AuthStore().IsAuthEnabled() { ++ return rev, nil ++ } ++ authInfo, err := s.AuthInfoFromCtx(ctx) ++ if err != nil { ++ return rev, err ++ } ++ if authInfo == nil { ++ return rev, auth.ErrUserEmpty ++ } ++ ++ l := s.lessor.Lookup(leaseID) ++ if l != nil { ++ for _, key := range l.Keys() { ++ if err := s.AuthStore().IsRangePermitted(authInfo, []byte(key), []byte{}); err != nil { ++ return 0, err ++ } ++ } ++ } ++ ++ return rev, nil ++} ++ ++func (s *EtcdServer) leaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveRequest) (*pb.LeaseTimeToLiveResponse, error) { + if s.isLeader() { + if err := s.waitAppliedIndex(); err != nil { + return nil, err +@@ -386,6 +411,31 @@ func (s *EtcdServer) LeaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveR + return nil, ErrCanceled + } + ++func (s *EtcdServer) LeaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveRequest) (*pb.LeaseTimeToLiveResponse, error) { ++ var rev uint64 ++ var err error ++ if r.Keys { ++ // check RBAC permission only if Keys is true ++ rev, err = s.checkLeaseTimeToLive(ctx, lease.LeaseID(r.ID)) ++ if err != nil { ++ return nil, err ++ } ++ } ++ ++ resp, err := s.leaseTimeToLive(ctx, r) ++ if err != nil { ++ return nil, err ++ } ++ ++ if r.Keys { ++ if s.AuthStore().IsAuthEnabled() && rev != s.AuthStore().Revision() { ++ return nil, auth.ErrAuthOldRevision ++ } ++ } ++ return resp, nil ++} ++ ++// LeaseLeases is really ListLeases !??? + func (s *EtcdServer) LeaseLeases(ctx context.Context, r *pb.LeaseLeasesRequest) (*pb.LeaseLeasesResponse, error) { + ls := s.lessor.Leases() + lss := make([]*pb.LeaseStatus, len(ls)) + +From e38eb678bbecdbe35391fa518b44c1ac14a9e322 Mon Sep 17 00:00:00 2001 +From: Hitoshi Mitake +Date: Fri, 31 Mar 2023 23:07:23 +0900 +Subject: [PATCH 2/2] tests: e2e and integration test for timetolive + +Signed-off-by: Hitoshi Mitake +Co-authored-by: Benjamin Wang +--- + tests/e2e/ctl_v3_auth_test.go | 49 +++++++++++++++++ + tests/e2e/ctl_v3_lease_test.go | 8 +++ + tests/integration/v3_auth_test.go | 91 +++++++++++++++++++++++++++++-- + 3 files changed, 143 insertions(+), 5 deletions(-) + +diff --git a/tests/e2e/ctl_v3_auth_test.go b/tests/e2e/ctl_v3_auth_test.go +index 0792087e062..ac7e90e0437 100644 +--- a/tests/e2e/ctl_v3_auth_test.go ++++ b/tests/e2e/ctl_v3_auth_test.go +@@ -76,6 +76,7 @@ func TestCtlV3AuthSnapshotJWT(t *testing.T) { testCtl(t, authTestSnapsho + func TestCtlV3AuthJWTExpire(t *testing.T) { testCtl(t, authTestJWTExpire, withCfg(*newConfigJWT())) } + func TestCtlV3AuthRevisionConsistency(t *testing.T) { testCtl(t, authTestRevisionConsistency) } + func TestCtlV3AuthTestCacheReload(t *testing.T) { testCtl(t, authTestCacheReload) } ++func TestCtlV3AuthLeaseTimeToLive(t *testing.T) { testCtl(t, authTestLeaseTimeToLive) } + + func TestCtlV3AuthRecoverFromSnapshot(t *testing.T) { + testCtl(t, authTestRecoverSnapshot, withCfg(*newConfigNoTLS()), withQuorum(), withSnapshotCount(5)) +@@ -1509,3 +1510,51 @@ func hashKVs(endpoints []string, cli *clientv3.Client) ([]*clientv3.HashKVRespon + } + return retHashKVs, nil + } ++ ++func authTestLeaseTimeToLive(cx ctlCtx) { ++ if err := authEnable(cx); err != nil { ++ cx.t.Fatal(err) ++ } ++ cx.user, cx.pass = "root", "root" ++ ++ authSetupTestUser(cx) ++ ++ cx.user = "test-user" ++ cx.pass = "pass" ++ ++ leaseID, err := ctlV3LeaseGrant(cx, 10) ++ if err != nil { ++ cx.t.Fatal(err) ++ } ++ ++ err = ctlV3Put(cx, "foo", "val", leaseID) ++ if err != nil { ++ cx.t.Fatal(err) ++ } ++ ++ err = ctlV3LeaseTimeToLive(cx, leaseID, true) ++ if err != nil { ++ cx.t.Fatal(err) ++ } ++ ++ cx.user = "root" ++ cx.pass = "root" ++ err = ctlV3Put(cx, "bar", "val", leaseID) ++ if err != nil { ++ cx.t.Fatal(err) ++ } ++ ++ cx.user = "test-user" ++ cx.pass = "pass" ++ // the lease is attached to bar, which test-user cannot access ++ err = ctlV3LeaseTimeToLive(cx, leaseID, true) ++ if err == nil { ++ cx.t.Fatal("test-user must not be able to access to the lease, because it's attached to the key bar") ++ } ++ ++ // without --keys, access should be allowed ++ err = ctlV3LeaseTimeToLive(cx, leaseID, false) ++ if err != nil { ++ cx.t.Fatal(err) ++ } ++} +diff --git a/tests/e2e/ctl_v3_lease_test.go b/tests/e2e/ctl_v3_lease_test.go +index 0dc4452026f..e4e15d90547 100644 +--- a/tests/e2e/ctl_v3_lease_test.go ++++ b/tests/e2e/ctl_v3_lease_test.go +@@ -300,3 +300,11 @@ func ctlV3LeaseRevoke(cx ctlCtx, leaseID string) error { + cmdArgs := append(cx.PrefixArgs(), "lease", "revoke", leaseID) + return spawnWithExpectWithEnv(cmdArgs, cx.envMap, fmt.Sprintf("lease %s revoked", leaseID)) + } ++ ++func ctlV3LeaseTimeToLive(cx ctlCtx, leaseID string, withKeys bool) error { ++ cmdArgs := append(cx.PrefixArgs(), "lease", "timetolive", leaseID) ++ if withKeys { ++ cmdArgs = append(cmdArgs, "--keys") ++ } ++ return spawnWithExpectWithEnv(cmdArgs, cx.envMap, fmt.Sprintf("lease %s granted with", leaseID)) ++} +diff --git a/tests/integration/v3_auth_test.go b/tests/integration/v3_auth_test.go +index 9a60ab02953..f030c4e164d 100644 +--- a/tests/integration/v3_auth_test.go ++++ b/tests/integration/v3_auth_test.go +@@ -177,12 +177,10 @@ func testV3AuthWithLeaseRevokeWithRoot(t *testing.T, ccfg ClusterConfig) { + // wait for lease expire + time.Sleep(3 * time.Second) + +- tresp, terr := api.Lease.LeaseTimeToLive( ++ tresp, terr := rootc.TimeToLive( + context.TODO(), +- &pb.LeaseTimeToLiveRequest{ +- ID: int64(leaseID), +- Keys: true, +- }, ++ leaseID, ++ clientv3.WithAttachedKeys(), + ) + if terr != nil { + t.Error(terr) +@@ -553,3 +551,86 @@ func TestV3AuthWatchErrorAndWatchId0(t *testing.T) { + + <-watchEndCh + } ++ ++func TestV3AuthWithLeaseTimeToLive(t *testing.T) { ++ BeforeTest(t) ++ clus := NewClusterV3(t, &ClusterConfig{Size: 1}) ++ defer clus.Terminate(t) ++ ++ users := []user{ ++ { ++ name: "user1", ++ password: "user1-123", ++ role: "role1", ++ key: "k1", ++ end: "k3", ++ }, ++ { ++ name: "user2", ++ password: "user2-123", ++ role: "role2", ++ key: "k2", ++ end: "k4", ++ }, ++ } ++ authSetupUsers(t, toGRPC(clus.Client(0)).Auth, users) ++ ++ authSetupRoot(t, toGRPC(clus.Client(0)).Auth) ++ ++ user1c, cerr := NewClient(t, clientv3.Config{Endpoints: clus.Client(0).Endpoints(), Username: "user1", Password: "user1-123"}) ++ if cerr != nil { ++ t.Fatal(cerr) ++ } ++ defer user1c.Close() ++ ++ user2c, cerr := NewClient(t, clientv3.Config{Endpoints: clus.Client(0).Endpoints(), Username: "user2", Password: "user2-123"}) ++ if cerr != nil { ++ t.Fatal(cerr) ++ } ++ defer user2c.Close() ++ ++ leaseResp, err := user1c.Grant(context.TODO(), 90) ++ if err != nil { ++ t.Fatal(err) ++ } ++ leaseID := leaseResp.ID ++ _, err = user1c.Put(context.TODO(), "k1", "val", clientv3.WithLease(leaseID)) ++ if err != nil { ++ t.Fatal(err) ++ } ++ // k2 can be accessed from both user1 and user2 ++ _, err = user1c.Put(context.TODO(), "k2", "val", clientv3.WithLease(leaseID)) ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ _, err = user1c.TimeToLive(context.TODO(), leaseID) ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ _, err = user2c.TimeToLive(context.TODO(), leaseID) ++ if err != nil { ++ t.Fatal(err) ++ } ++ ++ _, err = user2c.TimeToLive(context.TODO(), leaseID, clientv3.WithAttachedKeys()) ++ if err == nil { ++ t.Fatal("timetolive from user2 should be failed with permission denied") ++ } ++ ++ rootc, cerr := NewClient(t, clientv3.Config{Endpoints: clus.Client(0).Endpoints(), Username: "root", Password: "123"}) ++ if cerr != nil { ++ t.Fatal(cerr) ++ } ++ defer rootc.Close() ++ ++ if _, err := rootc.RoleRevokePermission(context.TODO(), "role1", "k1", "k3"); err != nil { ++ t.Fatal(err) ++ } ++ ++ _, err = user1c.TimeToLive(context.TODO(), leaseID, clientv3.WithAttachedKeys()) ++ if err == nil { ++ t.Fatal("timetolive from user2 should be failed with permission denied") ++ } ++} diff --git a/SPECS/etcd/etcd-3.5.0.spec b/SPECS/etcd/etcd-3.5.0.spec index 54ccddcbeb8..21a33b8422b 100644 --- a/SPECS/etcd/etcd-3.5.0.spec +++ b/SPECS/etcd/etcd-3.5.0.spec @@ -1,9 +1,9 @@ -%global _default_patch_fuzz 1 +%global _default_patch_fuzz 2 Summary: A highly-available key value store for shared configuration Name: etcd Version: 3.5.0 -Release: 16%{?dist} +Release: 17%{?dist} License: ASL 2.0 Vendor: Microsoft Corporation Distribution: Mariner @@ -40,6 +40,7 @@ Source1: etcd.service # - For the value of "--mtime" use the date "2021-04-26 00:00Z" to simplify future updates. Source2: %{name}-%{version}-vendor.tar.gz Patch0: CVE-2021-28235.patch +Patch1: CVE-2023-32082-v3.5.0.patch BuildRequires: golang >= 1.16 %description @@ -141,6 +142,10 @@ install -vdm755 %{buildroot}%{_sharedstatedir}/etcd /%{_docdir}/%{name}-%{version}-tools/* %changelog +* Wed Aug 23 2023 Rachel Menge - 3.5.0-17 +- Backport patch for CVE-2023-32082 +- Update patch fuzz to 2 for backporting patch + * Mon Aug 07 2023 CBL-Mariner Servicing Account - 3.5.0-16 - Bump release to rebuild with go 1.19.12 diff --git a/SPECS/etcd/etcd-3.5.1.spec b/SPECS/etcd/etcd-3.5.1.spec index 23592292329..43cccd3038a 100644 --- a/SPECS/etcd/etcd-3.5.1.spec +++ b/SPECS/etcd/etcd-3.5.1.spec @@ -1,9 +1,9 @@ -%global _default_patch_fuzz 1 +%global _default_patch_fuzz 2 Summary: A highly-available key value store for shared configuration Name: etcd Version: 3.5.1 -Release: 14%{?dist} +Release: 15%{?dist} License: ASL 2.0 Vendor: Microsoft Corporation Distribution: Mariner @@ -45,6 +45,7 @@ Source1: etcd.service # -cJf [tarball name] [folder to tar] Source2: %{name}-%{version}-vendor.tar.gz Patch0: CVE-2021-28235.patch +Patch1: CVE-2023-32082-v3.5.0.patch BuildRequires: golang >= 1.16 %description @@ -146,6 +147,10 @@ install -vdm755 %{buildroot}%{_sharedstatedir}/etcd /%{_docdir}/%{name}-%{version}-tools/* %changelog +* Wed Aug 23 2023 Rachel Menge - 3.5.1-15 +- Backport patch for CVE-2023-32082 +- Update patch fuzz to 2 for backporting patch + * Mon Aug 07 2023 CBL-Mariner Servicing Account - 3.5.1-14 - Bump release to rebuild with go 1.19.12 diff --git a/SPECS/etcd/etcd-3.5.3.spec b/SPECS/etcd/etcd-3.5.3.spec index 81bf466e089..6860ca1cac0 100644 --- a/SPECS/etcd/etcd-3.5.3.spec +++ b/SPECS/etcd/etcd-3.5.3.spec @@ -1,9 +1,9 @@ -%global _default_patch_fuzz 1 +%global _default_patch_fuzz 2 Summary: A highly-available key value store for shared configuration Name: etcd Version: 3.5.3 -Release: 9%{?dist} +Release: 10%{?dist} License: ASL 2.0 Vendor: Microsoft Corporation Distribution: Mariner @@ -45,6 +45,7 @@ Source1: etcd.service # -cJf [tarball name] [folder to tar] Source2: %{name}-%{version}-vendor.tar.gz Patch0: CVE-2021-28235.patch +Patch1: CVE-2023-32082-v3.5.3.patch BuildRequires: golang >= 1.16 %description @@ -146,6 +147,10 @@ install -vdm755 %{buildroot}%{_sharedstatedir}/etcd /%{_docdir}/%{name}-%{version}-tools/* %changelog +* Wed Aug 23 2023 Rachel Menge - 3.5.3-10 +- Backport patch for CVE-2023-32082 +- Update patch fuzz to 2 for backporting patch + * Mon Aug 07 2023 CBL-Mariner Servicing Account - 3.5.3-9 - Bump release to rebuild with go 1.19.12 diff --git a/SPECS/etcd/etcd-3.5.4.spec b/SPECS/etcd/etcd-3.5.4.spec index 2e4f10b0199..572d2f1d599 100644 --- a/SPECS/etcd/etcd-3.5.4.spec +++ b/SPECS/etcd/etcd-3.5.4.spec @@ -1,9 +1,9 @@ -%global _default_patch_fuzz 1 +%global _default_patch_fuzz 2 Summary: A highly-available key value store for shared configuration Name: etcd Version: 3.5.4 -Release: 9%{?dist} +Release: 10%{?dist} License: ASL 2.0 Vendor: Microsoft Corporation Distribution: Mariner @@ -45,6 +45,7 @@ Source1: etcd.service # -cJf [tarball name] [folder to tar] Source2: %{name}-%{version}-vendor.tar.gz Patch0: CVE-2021-28235.patch +Patch1: CVE-2023-32082-v3.5.3.patch BuildRequires: golang >= 1.16 %description @@ -146,6 +147,10 @@ install -vdm755 %{buildroot}%{_sharedstatedir}/etcd /%{_docdir}/%{name}-%{version}-tools/* %changelog +* Wed Aug 23 2023 Rachel Menge - 3.5.4-10 +- Backport patch for CVE-2023-32082 +- Update patch fuzz to 2 for backporting patch + * Mon Aug 07 2023 CBL-Mariner Servicing Account - 3.5.4-9 - Bump release to rebuild with go 1.19.12 diff --git a/SPECS/etcd/etcd-3.5.5.spec b/SPECS/etcd/etcd-3.5.5.spec index f4476d2b27f..460b653605a 100644 --- a/SPECS/etcd/etcd-3.5.5.spec +++ b/SPECS/etcd/etcd-3.5.5.spec @@ -1,9 +1,9 @@ -%global _default_patch_fuzz 1 +%global _default_patch_fuzz 2 Summary: A highly-available key value store for shared configuration Name: etcd Version: 3.5.5 -Release: 9%{?dist} +Release: 10%{?dist} License: ASL 2.0 Vendor: Microsoft Corporation Distribution: Mariner @@ -45,6 +45,7 @@ Source1: etcd.service # -cJf [tarball name] [folder to tar] Source2: %{name}-%{version}-vendor.tar.gz Patch0: CVE-2021-28235.patch +Patch1: CVE-2023-32082.patch BuildRequires: golang >= 1.16 %description @@ -146,6 +147,10 @@ install -vdm755 %{buildroot}%{_sharedstatedir}/etcd /%{_docdir}/%{name}-%{version}-tools/* %changelog +* Wed Aug 23 2023 Rachel Menge - 3.5.5-10 +- Patch CVE-2023-32082 +- Update patch fuzz to 2 for backporting patch + * Mon Aug 07 2023 CBL-Mariner Servicing Account - 3.5.5-9 - Bump release to rebuild with go 1.19.12 diff --git a/SPECS/etcd/etcd-3.5.6.spec b/SPECS/etcd/etcd-3.5.6.spec index 7812b4f0487..d99d05b289a 100644 --- a/SPECS/etcd/etcd-3.5.6.spec +++ b/SPECS/etcd/etcd-3.5.6.spec @@ -1,9 +1,9 @@ -%global _default_patch_fuzz 1 +%global _default_patch_fuzz 2 Summary: A highly-available key value store for shared configuration Name: etcd Version: 3.5.6 -Release: 9%{?dist} +Release: 10%{?dist} License: ASL 2.0 Vendor: Microsoft Corporation Distribution: Mariner @@ -45,6 +45,7 @@ Source1: etcd.service # -cJf [tarball name] [folder to tar] Source2: %{name}-%{version}-vendor.tar.gz Patch0: CVE-2021-28235.patch +Patch1: CVE-2023-32082.patch BuildRequires: golang >= 1.16 %description @@ -146,6 +147,10 @@ install -vdm755 %{buildroot}%{_sharedstatedir}/etcd /%{_docdir}/%{name}-%{version}-tools/* %changelog +* Wed Aug 23 2023 Rachel Menge - 3.5.6-10 +- Patch CVE-2023-32082 +- Update patch fuzz to 2 for backporting patch + * Mon Aug 07 2023 CBL-Mariner Servicing Account - 3.5.6-9 - Bump release to rebuild with go 1.19.12 From 761535f806683e9e2f43c2ae96d528535ae8a9cf Mon Sep 17 00:00:00 2001 From: Archana Choudhary <36061892+arc9693@users.noreply.github.com> Date: Fri, 25 Aug 2023 15:50:54 +0530 Subject: [PATCH 15/64] Adds package CharLS to SPECS-EXTENDED (#6022) * Adds package CharLS * Adds license info * Update cgmanifest * Update source URL --- SPECS-EXTENDED/CharLS/CharLS.signatures.json | 5 + SPECS-EXTENDED/CharLS/CharLS.spec | 164 ++++++++++++++++++ SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md | 2 +- SPECS/LICENSES-AND-NOTICES/data/licenses.json | 1 + cgmanifest.json | 12 +- 5 files changed, 182 insertions(+), 2 deletions(-) create mode 100644 SPECS-EXTENDED/CharLS/CharLS.signatures.json create mode 100644 SPECS-EXTENDED/CharLS/CharLS.spec diff --git a/SPECS-EXTENDED/CharLS/CharLS.signatures.json b/SPECS-EXTENDED/CharLS/CharLS.signatures.json new file mode 100644 index 00000000000..5183e2158d2 --- /dev/null +++ b/SPECS-EXTENDED/CharLS/CharLS.signatures.json @@ -0,0 +1,5 @@ +{ + "Signatures": { + "CharLS-2.0.0.tar.gz": "528c6a3cc168a44e73f2890d8f4a35104a54d752eba3d6a643f050b72dd67cfa" + } +} \ No newline at end of file diff --git a/SPECS-EXTENDED/CharLS/CharLS.spec b/SPECS-EXTENDED/CharLS/CharLS.spec new file mode 100644 index 00000000000..07ee21606cf --- /dev/null +++ b/SPECS-EXTENDED/CharLS/CharLS.spec @@ -0,0 +1,164 @@ +Summary: An optimized implementation of the JPEG-LS standard +Name: CharLS +Version: 2.0.0 +Release: 10%{?dist} +License: BSD +Vendor: Microsoft Corporation +Distribution: Mariner +URL: https://github.com/team-charls/charls +Source0: https://github.com/team-charls/charls/archive/%{version}/%{name}-%{version}.tar.gz +BuildRequires: cmake >= 2.6.0 +BuildRequires: gcc +BuildRequires: gcc-c++ + +%description +An optimized implementation of the JPEG-LS standard for loss less and +near loss less image compression. JPEG-LS is a low-complexity standard that +matches JPEG 2000 compression ratios. In terms of speed, CharLS outperforms +open source and commercial JPEG LS implementations. + +JPEG-LS (ISO-14495-1/ITU-T.87) is a standard derived from the Hewlett Packard +LOCO algorithm. JPEG LS has low complexity (meaning fast compression) and high +compression ratios, similar to JPEG 2000. JPEG-LS is more similar to the old +loss less JPEG than to JPEG 2000, but interestingly the two different techniques +result in vastly different performance characteristics. + +%package devel +Summary: Libraries and headers for CharLS +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +CharLS Library Header Files and Link Libraries. + +%prep +%autosetup -n charls-%{version} +rm CharLS*.sln* -v + +%build +%cmake -DBUILD_SHARED_LIBS:BOOL=ON\ + -DCMAKE_BUILD_TYPE:STRING="Release"\ + -DCMAKE_VERBOSE_MAKEFILE=ON\ + -DBUILD_TESTING=ON + +%cmake_build + + +%install +%cmake_install + + +%check +pushd %{__cmake_builddir} +# Enter a key + enter to finish +echo "a" | ./charlstest +popd + + +%files +%license License.txt +%{_libdir}/lib%{name}.so.2 +%{_libdir}/lib%{name}.so.2.0 + +%files devel +%dir %{_includedir}/%{name}/ +%{_includedir}/%{name}/* +%{_libdir}/lib%{name}.so + +%changelog +* Wed Aug 09 2023 Archana Choudhary - 2.0.0-10 +- Initial CBL-Mariner import from Fedora 37 (license: MIT). +- License verified + +* Wed Jul 20 2022 Fedora Release Engineering - 2.0.0-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Wed Jan 19 2022 Fedora Release Engineering - 2.0.0-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Wed Jul 21 2021 Fedora Release Engineering - 2.0.0-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Mon Feb 22 2021 Alessio - 2.0.0-6> +- cmake_builddir change + +* Mon Jan 25 2021 Fedora Release Engineering - 2.0.0-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Sat Aug 01 2020 Fedora Release Engineering - 2.0.0-4 +- Second attempt - Rebuilt for + https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Mon Jul 27 2020 Fedora Release Engineering - 2.0.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Tue Jan 28 2020 Fedora Release Engineering - 2.0.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Sun Jul 28 2019 Ankur Sinha - 2.0.0-1 +- Update to version 2.0.0 +- Remove unneded patches +- Note: soname changes here + +* Wed Jul 24 2019 Fedora Release Engineering - 1.0-19 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Thu Jan 31 2019 Fedora Release Engineering - 1.0-18 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Thu Jul 12 2018 Fedora Release Engineering - 1.0-17 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Wed Feb 07 2018 Fedora Release Engineering - 1.0-16 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Wed Aug 02 2017 Fedora Release Engineering - 1.0-15 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 1.0-14 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Fri Feb 10 2017 Fedora Release Engineering - 1.0-13 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Wed Feb 03 2016 Fedora Release Engineering - 1.0-12 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Tue Jan 26 2016 Peter Lemenkov - 1.0-11 +- Spec-file cleanups + +* Tue Jun 16 2015 Fedora Release Engineering - 1.0-10 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Sat May 02 2015 Kalev Lember - 1.0-9 +- Rebuilt for GCC 5 C++11 ABI change + +* Fri Aug 15 2014 Fedora Release Engineering - 1.0-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Fri Jun 06 2014 Fedora Release Engineering - 1.0-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Fri Aug 02 2013 Fedora Release Engineering - 1.0-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Wed Feb 13 2013 Fedora Release Engineering - 1.0-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Wed Jul 18 2012 Fedora Release Engineering - 1.0-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Thu Jan 12 2012 Fedora Release Engineering - 1.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Mon Feb 07 2011 Fedora Release Engineering - 1.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Thu Feb 3 2011 Mario Ceresa mrceresa@gmail.com CharLS 1.0-1 +- Update to new version +- Applied patch to fix bug http://charls.codeplex.com/workitem/7823 + +* Wed Feb 17 2010 Mario Ceresa mrceresa@gmail.com CharLS 1.0-0.1.b +- Changed name schema to comply with pre-release packages + +* Wed Feb 17 2010 Mario Ceresa mrceresa@gmail.com CharLS 1.0b-1 +- Initial RPM Release diff --git a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md index dbfa298e42b..e69c29a19f6 100644 --- a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md +++ b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md @@ -5,7 +5,7 @@ The CBL-Mariner SPEC files originated from a variety of sources with varying lic | CentOS | [MIT](https://www.centos.org/legal/#licensing-policy) | crash-ptdump-command
delve
fstrm
nodejs-nodemon
rhnlib
rt-setup
rt-tests
rtctl
tuned | | Ceph source | [LGPL2.1](https://github.com/ceph/ceph/blob/master/COPYING-LGPL2.1) | ceph | | Debian | [MIT](https://opensource.org/licenses/MIT) | prometheus-process-exporter | -| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cgdcbxd
chan
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | +| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cgdcbxd
chan
CharLS
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | | Fedora (Copyright Remi Collet) | [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/legalcode) | libmemcached-awesome
librabbitmq | | Fedora (ISC) | [ISC License](https://github.com/sarugaku/resolvelib/blob/main/LICENSE) | python-resolvelib | | Magnus Edenhill Open Source | [Magnus Edenhill Open Source BSD License](https://github.com/jemalloc/jemalloc/blob/dev/COPYING) | librdkafka | diff --git a/SPECS/LICENSES-AND-NOTICES/data/licenses.json b/SPECS/LICENSES-AND-NOTICES/data/licenses.json index 44f26c3479e..72c1a56e80e 100644 --- a/SPECS/LICENSES-AND-NOTICES/data/licenses.json +++ b/SPECS/LICENSES-AND-NOTICES/data/licenses.json @@ -108,6 +108,7 @@ "certmonger", "cgdcbxd", "chan", + "CharLS", "checkpolicy", "checksec", "chrony", diff --git a/cgmanifest.json b/cgmanifest.json index 2c6426f4791..8dd9c1cfb70 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -1622,6 +1622,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "CharLS", + "version": "2.0.0", + "downloadUrl": "https://github.com/team-charls/charls/archive/2.0.0/CharLS-2.0.0.tar.gz" + } + } + }, { "component": { "type": "other", @@ -30717,4 +30727,4 @@ } ], "Version": 1 -} \ No newline at end of file +} From 74414bf37882cdcc3a137d8290c6cc813a23febb Mon Sep 17 00:00:00 2001 From: Pawel Winogrodzki Date: Fri, 25 Aug 2023 14:29:19 -0700 Subject: [PATCH 16/64] Skipping test node creation for duplicate nodes. (#6058) --- toolkit/tools/grapher/grapher.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/toolkit/tools/grapher/grapher.go b/toolkit/tools/grapher/grapher.go index 58ba28c56db..045e70e6fbe 100644 --- a/toolkit/tools/grapher/grapher.go +++ b/toolkit/tools/grapher/grapher.go @@ -125,11 +125,15 @@ func addNodesForPackage(g *pkggraph.PkgGraph, pkg *pkgjson.Package) (err error) return } + skipNewTestNode := false if nodes != nil { logger.Log.Warnf(`Duplicate package name for package %+v read from SRPM "%s" (Previous: %+v)`, pkg.Provides, pkg.SrpmPath, nodes.RunNode) newRunNode = nodes.RunNode newBuildNode = nodes.BuildNode newTestNode = nodes.TestNode + + // Test nodes must be assigned to the build nodes of their true origin and not a duplicate from a potentially different SRPM. + skipNewTestNode = true } if newRunNode == nil { @@ -157,7 +161,7 @@ func addNodesForPackage(g *pkggraph.PkgGraph, pkg *pkgjson.Package) (err error) return } - if !pkg.RunTests { + if skipNewTestNode || !pkg.RunTests { logger.Log.Debugf("Skipping adding a test node for package %+v", pkg) return } From 5b83f257b36d817fe00293668a205ea9d41a3222 Mon Sep 17 00:00:00 2001 From: Pawel Winogrodzki Date: Fri, 25 Aug 2023 17:46:37 -0700 Subject: [PATCH 17/64] Updated the PR check pipeline (#6017) --- .pipelines/livepatching/DeployLivepatch.yml | 3 + .pipelines/prchecks/PackageBuildPRCheck.yml | 62 ++++---- .pipelines/templates/PackageBuild.yml | 141 +++++++++++++----- .pipelines/templates/RawToolchainDownload.yml | 3 + .pipelines/templates/ToolchainBuild.yml | 3 + .pipelines/templates/ToolkitCheck.yml | 5 +- toolkit/scripts/pkggen.mk | 11 +- .../tools/graphpkgfetcher/graphpkgfetcher.go | 26 ++-- 8 files changed, 164 insertions(+), 90 deletions(-) diff --git a/.pipelines/livepatching/DeployLivepatch.yml b/.pipelines/livepatching/DeployLivepatch.yml index 7692ae38787..14ba3a29db7 100644 --- a/.pipelines/livepatching/DeployLivepatch.yml +++ b/.pipelines/livepatching/DeployLivepatch.yml @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + trigger: none variables: diff --git a/.pipelines/prchecks/PackageBuildPRCheck.yml b/.pipelines/prchecks/PackageBuildPRCheck.yml index 31fba2ba233..c6c8a516d47 100644 --- a/.pipelines/prchecks/PackageBuildPRCheck.yml +++ b/.pipelines/prchecks/PackageBuildPRCheck.yml @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + # Since we're boosting our builds by using a private, pre-compiled raw toolchain # the pipeline requires defining the following variables outside of the YAML: # - rawToolchainCacheURL_AMD64 @@ -15,22 +18,10 @@ parameters: agentPool: "$(agentPool_AMD64)" rawToolchainCacheURL: "$(rawToolchainCacheURL_AMD64)" rawToolchainExpectedHash: "f56df34b90915c93f772d3961bf5e9eeb8c1233db43dd92070214e4ce6b72894" - packageBuildJobs: - - scenario1: - name: Build - runCheck: false - - scenario2: - name: Test - runCheck: true - name: "ARM64" agentPool: "$(agentPool_ARM64)" rawToolchainCacheURL: "$(rawToolchainCacheURL_ARM64)" rawToolchainExpectedHash: "65de43b3bdcfdaac71df1f11fd1f830a8109b1eb9d7cb6cbc2e2d0e929d0ef76" - packageBuildJobs: - - name: Build - runCheck: false - - name: Test - runCheck: true resources: repositories: @@ -88,29 +79,26 @@ extends: - stage: RPMs_${{ configuration.name }} dependsOn: Toolchain_${{ configuration.name }} jobs: - # Using configuration object instead of the matrix strategy because the 'isCheckBuild' parameter must be set - # during YAML parsing and the matrix strategy arguments are available later during run-time. - - ${{ each packageBuildJob in configuration.packageBuildJobs }}: - - job: ${{ packageBuildJob.name }} - pool: - type: linux - isCustom: true - name: ${{ configuration.agentPool }} - variables: - ob_artifactBaseName: ${{ variables.rpmsArtifactNameBase }}_${{ configuration.name }}_${{ packageBuildJob.name }} - ob_outputDirectory: $(Build.ArtifactStagingDirectory) - steps: - - template: .pipelines/templates/PackageBuild.yml@self - parameters: - customToolchainArtifactName: $(toolchainArtifactNameBase)_${{ configuration.name }} - isCheckBuild: ${{ packageBuildJob.runCheck }} - isDeltaBuild: true - outputArtifactsFolder: $(ob_outputDirectory) - selfRepoName: self + - job: BuildAndTest + pool: + type: linux + isCustom: true + name: ${{ configuration.agentPool }} + variables: + ob_artifactBaseName: ${{ variables.rpmsArtifactNameBase }}_${{ configuration.name }} + ob_outputDirectory: $(Build.ArtifactStagingDirectory) + steps: + - template: .pipelines/templates/PackageBuild.yml@self + parameters: + customToolchainArtifactName: $(toolchainArtifactNameBase)_${{ configuration.name }} + isCheckBuild: true + isQuickRebuildPackages: true + outputArtifactsFolder: $(ob_outputDirectory) + selfRepoName: self - - task: PublishPipelineArtifact@1 - inputs: - artifact: ${{ variables.rpmsArtifactNameBase }}_${{ configuration.name }}_${{ packageBuildJob.name }} - targetPath: $(ob_outputDirectory) - condition: always() - displayName: "Publish packages build artifacts" + - task: PublishPipelineArtifact@1 + inputs: + artifact: ${{ variables.rpmsArtifactNameBase }}_${{ configuration.name }} + targetPath: $(ob_outputDirectory) + condition: always() + displayName: "Publish packages build artifacts" diff --git a/.pipelines/templates/PackageBuild.yml b/.pipelines/templates/PackageBuild.yml index 48d710f5c3c..a4a173560a3 100644 --- a/.pipelines/templates/PackageBuild.yml +++ b/.pipelines/templates/PackageBuild.yml @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + parameters: - name: buildRepoRoot type: string @@ -11,26 +14,62 @@ parameters: type: string default: "" + - name: customToolchainTarballName + type: string + default: "toolchain_built_rpms_all.tar.gz" + - name: extraPackageRepos type: string default: "" - name: isCheckBuild - type: boolean - default: false + type: string + default: "default" + values: + - "default" + - "false" + - "true" - name: isDeltaBuild - type: boolean - default: false + type: string + default: "default" + values: + - "default" + - "false" + - "true" + + - name: isQuickRebuildPackages + type: string + default: "default" + values: + - "default" + - "false" + - "true" + + - name: isUseCCache + type: string + default: "default" + values: + - "default" + - "false" + - "true" - name: outputArtifactsFolder type: string default: "$(Build.ArtifactStagingDirectory)" + - name: publishLogs + type: boolean + default: true + - name: rpmsCacheArtifactName type: string default: "" + - name: rpmsCacheTarballName + type: string + default: "rpms.tar.gz" + - name: rpmsTarballName type: string default: "rpms.tar.gz" @@ -43,6 +82,10 @@ parameters: type: string default: "SPECS" + - name: srpmPackList + type: string + default: "" + - name: srpmsTarballName type: string default: "srpms.tar.gz" @@ -57,10 +100,10 @@ steps: displayName: "Download toolchain" inputs: artifact: "${{ parameters.customToolchainArtifactName }}" - patterns: "**/toolchain_built_rpms_all.tar.gz" + patterns: "**/${{ parameters.customToolchainTarballName }}" - script: | - toolchain_archive="$(find "$(Pipeline.Workspace)" -name toolchain_built_rpms_all.tar.gz)" + toolchain_archive="$(find "$(Pipeline.Workspace)" -name "${{ parameters.customToolchainTarballName }}" -print -quit)" if [[ ! -f "$toolchain_archive" ]]; then echo "ERROR: toolchain archive not found!" >&2 exit 1 @@ -74,10 +117,10 @@ steps: displayName: "Download RPM cache" inputs: artifact: "${{ parameters.rpmsCacheArtifactName }}" - patterns: "**/rpms*.tar.gz" + patterns: "**/${{ parameters.rpmsCacheTarballName }}" - script: | - rpms_archive="$(find "$(Pipeline.Workspace)" -name rpms*.tar.gz)" + rpms_archive="$(find "$(Pipeline.Workspace)" -name "${{ parameters.rpmsCacheTarballName }}" -print -quit)" if [[ ! -f "$rpms_archive" ]]; then echo "ERROR: RPMs cache archive not found!" >&2 exit 1 @@ -87,14 +130,28 @@ steps: displayName: "Populate RPMs cache" - script: | - delta_fetch_arg="DELTA_FETCH=n" - if [[ ${{ parameters.isDeltaBuild }} =~ [Tt]rue ]]; then + if [[ ${{ parameters.isDeltaBuild }} == "true" ]]; then delta_fetch_arg="DELTA_FETCH=y" + elif [[ ${{ parameters.isDeltaBuild }} == "false" ]]; then + delta_fetch_arg="DELTA_FETCH=n" fi - run_check_arg="RUN_CHECK=n" - if [[ ${{ parameters.isCheckBuild }} =~ [Tt]rue ]]; then + if [[ ${{ parameters.isQuickRebuildPackages }} == "true" ]]; then + quick_rebuild_packages_arg="QUICK_REBUILD_PACKAGES=y" + elif [[ ${{ parameters.isQuickRebuildPackages }} == "false" ]]; then + quick_rebuild_packages_arg="QUICK_REBUILD_PACKAGES=n" + fi + + if [[ ${{ parameters.isCheckBuild }} == "true" ]]; then run_check_arg="RUN_CHECK=y" + elif [[ ${{ parameters.isCheckBuild }} == "false" ]]; then + run_check_arg="RUN_CHECK=n" + fi + + if [[ ${{ parameters.isUseCCache }} == "true" ]]; then + use_ccache_arg="USE_CCACHE=y" + elif [[ ${{ parameters.isUseCCache }} == "false" ]]; then + use_ccache_arg="USE_CCACHE=n" fi sudo make -C "${{ parameters.buildRepoRoot }}/toolkit" build-packages -j$(nproc) \ @@ -103,30 +160,42 @@ steps: REBUILD_TOOLS=y \ REPO_LIST="${{ parameters.extraPackageRepos }}" \ SPECS_DIR="${{ parameters.buildRepoRoot }}/${{ parameters.specsFolderPath }}" \ + SRPM_PACK_LIST="${{ parameters.srpmPackList }}" \ $delta_fetch_arg \ - $run_check_arg + $quick_rebuild_packages_arg \ + $run_check_arg \ + $use_ccache_arg displayName: "Build packages" - - script: | - sudo make -C "${{ parameters.buildRepoRoot }}/toolkit" compress-rpms - displayName: "Compress RPMs" - - - script: | - sudo make -C "${{ parameters.buildRepoRoot }}/toolkit" compress-srpms - displayName: "Compress SRPMs" - - - bash: | - published_artifacts_dir="${{ parameters.outputArtifactsFolder }}/ARTIFACTS" - mkdir -p "$published_artifacts_dir" - cp "${{ parameters.buildRepoRoot }}"/out/rpms.tar.gz "$published_artifacts_dir/${{ parameters.rpmsTarballName }}" - cp "${{ parameters.buildRepoRoot }}"/out/srpms.tar.gz "$published_artifacts_dir/${{ parameters.srpmsTarballName }}" - displayName: "Copy artifacts for publishing" - - - bash: | - published_logs_dir="${{ parameters.outputArtifactsFolder }}/LOGS" - mkdir -p "$published_logs_dir" - tar -C "${{ parameters.buildRepoRoot }}/build/logs/pkggen" -czf "$published_logs_dir/pkggen.logs.tar.gz" . - tar -C "${{ parameters.buildRepoRoot }}/build/pkg_artifacts" -czf "$published_logs_dir/pkg_artifacts.tar.gz" . - tar -C "${{ parameters.buildRepoRoot }}/build/timestamp" -czf "$published_logs_dir/timestamp.tar.gz" . - condition: always() - displayName: "Copy logs for publishing" + - ${{ if parameters.outputArtifactsFolder }}: + - ${{ if parameters.rpmsTarballName }}: + - script: | + sudo make -C "${{ parameters.buildRepoRoot }}/toolkit" compress-rpms + displayName: "Compress RPMs" + + - bash: | + published_artifacts_dir="${{ parameters.outputArtifactsFolder }}/ARTIFACTS" + mkdir -p "$published_artifacts_dir" + cp "${{ parameters.buildRepoRoot }}"/out/rpms.tar.gz "$published_artifacts_dir/${{ parameters.rpmsTarballName }}" + displayName: "Copy RPMs for publishing" + + - ${{ if parameters.srpmsTarballName }}: + - script: | + sudo make -C "${{ parameters.buildRepoRoot }}/toolkit" compress-srpms + displayName: "Compress SRPMs" + + - bash: | + published_artifacts_dir="${{ parameters.outputArtifactsFolder }}/ARTIFACTS" + mkdir -p "$published_artifacts_dir" + cp "${{ parameters.buildRepoRoot }}"/out/srpms.tar.gz "$published_artifacts_dir/${{ parameters.srpmsTarballName }}" + displayName: "Copy SRPMs for publishing" + + - ${{ if parameters.publishLogs }}: + - bash: | + published_logs_dir="${{ parameters.outputArtifactsFolder }}/LOGS" + mkdir -p "$published_logs_dir" + tar -C "${{ parameters.buildRepoRoot }}/build/logs/pkggen" -czf "$published_logs_dir/pkggen.logs.tar.gz" . + tar -C "${{ parameters.buildRepoRoot }}/build/pkg_artifacts" -czf "$published_logs_dir/pkg_artifacts.tar.gz" . + tar -C "${{ parameters.buildRepoRoot }}/build/timestamp" -czf "$published_logs_dir/timestamp.tar.gz" . + condition: always() + displayName: "Copy logs for publishing" diff --git a/.pipelines/templates/RawToolchainDownload.yml b/.pipelines/templates/RawToolchainDownload.yml index 621f9285dbb..7b15cad183e 100644 --- a/.pipelines/templates/RawToolchainDownload.yml +++ b/.pipelines/templates/RawToolchainDownload.yml @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + parameters: - name: buildRepoRoot type: string diff --git a/.pipelines/templates/ToolchainBuild.yml b/.pipelines/templates/ToolchainBuild.yml index e6240cca9c0..cac4851a7dd 100644 --- a/.pipelines/templates/ToolchainBuild.yml +++ b/.pipelines/templates/ToolchainBuild.yml @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + parameters: - name: buildRepoRoot type: string diff --git a/.pipelines/templates/ToolkitCheck.yml b/.pipelines/templates/ToolkitCheck.yml index 2bc72037c3a..4a16021a739 100644 --- a/.pipelines/templates/ToolkitCheck.yml +++ b/.pipelines/templates/ToolkitCheck.yml @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + parameters: - name: buildRepoRoot type: string @@ -13,7 +16,7 @@ steps: echo "Using following version of Mariner:" - if ! make -sC "$toolkit_dir" CONFIG_FILE="" get-release-major; then + if ! sudo make -sC "$toolkit_dir" CONFIG_FILE="" get-release-major; then echo "ERROR: version check failed!" >&2 exit 1 fi diff --git a/toolkit/scripts/pkggen.mk b/toolkit/scripts/pkggen.mk index 3e8a2189e52..194a3fe8a1d 100644 --- a/toolkit/scripts/pkggen.mk +++ b/toolkit/scripts/pkggen.mk @@ -27,7 +27,7 @@ cache_working_dir = $(PKGBUILD_DIR)/tdnf_cache_worker parse_working_dir = $(BUILD_DIR)/spec_parsing rpmbuilding_logs_dir = $(LOGS_DIR)/pkggen/rpmbuilding remote_rpms_cache_dir = $(CACHED_RPMS_DIR)/cache -cached_remote_rpms = $(call shell_real_build_only, find $(remote_rpms_cache_dir)) +cached_remote_rpms = $(call shell_real_build_only, find $(remote_rpms_cache_dir)) validate-pkggen-config = $(STATUS_FLAGS_DIR)/validate-image-config-pkggen.flag # Outputs @@ -300,11 +300,12 @@ compress-srpms: # Seed the cached RPMs folder files from the archive. hydrate-cached-rpms: $(if $(CACHED_PACKAGES_ARCHIVE),,$(error Must set CACHED_PACKAGES_ARCHIVE=)) - @echo Unpacking cache RPMs from $(CACHED_PACKAGES_ARCHIVE) into $(CACHED_RPMS_DIR) - @tar -xf $(CACHED_PACKAGES_ARCHIVE) -C $(CACHED_RPMS_DIR) --strip-components 1 --skip-old-files --touch --checkpoint=100000 --checkpoint-action=echo="%T" + @mkdir -p $(remote_rpms_cache_dir) + @echo Unpacking cache RPMs from $(CACHED_PACKAGES_ARCHIVE) into $(remote_rpms_cache_dir) + @tar -xf $(CACHED_PACKAGES_ARCHIVE) -C $(remote_rpms_cache_dir) --strip-components 1 --skip-old-files --touch --checkpoint=100000 --checkpoint-action=echo="%T" # The cached RPMs directory has a flat structure, so we need to move the RPMs into the cache's root directory. - @find $(CACHED_RPMS_DIR) -mindepth 2 -name "*.rpm" -exec mv {} $(CACHED_RPMS_DIR) \; - @find $(CACHED_RPMS_DIR) -mindepth 1 -type d -and ! -name repodata -exec rm -fr {} + + @find $(remote_rpms_cache_dir) -mindepth 2 -name "*.rpm" -exec mv {} $(remote_rpms_cache_dir) \; + @find $(remote_rpms_cache_dir) -mindepth 1 -type d -and ! -name repodata -exec rm -fr {} + # Seed the RPMs folder with the any missing files from the archive. hydrate-rpms: diff --git a/toolkit/tools/graphpkgfetcher/graphpkgfetcher.go b/toolkit/tools/graphpkgfetcher/graphpkgfetcher.go index 7a5ef31e52c..06181a3e393 100644 --- a/toolkit/tools/graphpkgfetcher/graphpkgfetcher.go +++ b/toolkit/tools/graphpkgfetcher/graphpkgfetcher.go @@ -286,24 +286,28 @@ func resolveGraphNodes(dependencyGraph *pkggraph.PkgGraph, inputSummaryFile stri fetchedPackages := make(map[string]bool) prebuiltPackages := make(map[string]bool) unresolvedNodes := findUnresolvedNodes(dependencyGraph.AllRunNodes()) + unresolvedNodesCount := len(unresolvedNodes) timestamp.StartEvent("clone graph", nil) for i, n := range unresolvedNodes { + progressHeader := fmt.Sprintf("Cache progress %d%%", (i*100)/unresolvedNodesCount) resolveErr := resolveSingleNode(cloner, n, downloadDependencies, toolchainPackages, fetchedPackages, prebuiltPackages, *outDir) - logger.Log.Infof("Cache progress %d%%: choosing '%s' to provide '%s'.", ((i * 100) / len(unresolvedNodes)), filepath.Base(n.RpmPath), n.VersionedPkg.Name) + if resolveErr == nil { + logger.Log.Infof("%s: choosing '%s' to provide '%s'.", progressHeader, filepath.Base(n.RpmPath), n.VersionedPkg.Name) + continue + } + // Failing to clone a dependency should not halt a build. // The build should continue and attempt best effort to build as many packages as possible. - if resolveErr != nil { - logger.Log.Warnf("Failed to resolve graph node '%s':\n%s", n, resolveErr) - cachingSucceeded = false - errorMessage := strings.Builder{} - errorMessage.WriteString(fmt.Sprintf("Failed to resolve all nodes in the graph while resolving '%s'\n", n)) - errorMessage.WriteString("Nodes which have this as a dependency:\n") - for _, dependant := range graph.NodesOf(dependencyGraph.To(n.ID())) { - errorMessage.WriteString(fmt.Sprintf("\t'%s' depends on '%s'\n", dependant.(*pkggraph.PkgNode), n)) - } - logger.Log.Debugf(errorMessage.String()) + logger.Log.Warnf("%s: failed to resolve graph node '%s':\n%s", progressHeader, n, resolveErr) + cachingSucceeded = false + errorMessage := strings.Builder{} + errorMessage.WriteString(fmt.Sprintf("Failed to resolve all nodes in the graph while resolving '%s'\n", n)) + errorMessage.WriteString("Nodes which have this as a dependency:\n") + for _, dependant := range graph.NodesOf(dependencyGraph.To(n.ID())) { + errorMessage.WriteString(fmt.Sprintf("\t'%s' depends on '%s'\n", dependant.(*pkggraph.PkgNode), n)) } + logger.Log.Debugf(errorMessage.String()) } timestamp.StopEvent(nil) // clone graph if stopOnFailure && !cachingSucceeded { From ad867f0a339ef650c24f84814c405f02fe7340e3 Mon Sep 17 00:00:00 2001 From: CBL-Mariner-Bot <75509084+CBL-Mariner-Bot@users.noreply.github.com> Date: Fri, 25 Aug 2023 18:46:07 -0700 Subject: [PATCH 18/64] Nopatch kernel for CVE-2023-4459 (#6071) --- SPECS/kernel/CVE-2023-4459.nopatch | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 SPECS/kernel/CVE-2023-4459.nopatch diff --git a/SPECS/kernel/CVE-2023-4459.nopatch b/SPECS/kernel/CVE-2023-4459.nopatch new file mode 100644 index 00000000000..b9a8b980bda --- /dev/null +++ b/SPECS/kernel/CVE-2023-4459.nopatch @@ -0,0 +1,3 @@ +CVE-2023-4459 - patched in 5.15.42.1 - (generated by autopatch tool) +upstream edf410cb74dc612fd47ef5be319c5a0bcd6e6ccd - stable e35387a91318ccdec4a30b58d967391e011e34fa + From d7472c57739728a285fbbdb8cecb8f17a1c51322 Mon Sep 17 00:00:00 2001 From: Daniel McIlvaney Date: Mon, 28 Aug 2023 09:17:44 -0700 Subject: [PATCH 19/64] Strip epoch on packages that use it in pre-cache (#6070) * Strip epoch on packages that use it * Address feedback * Restore old ordering * Drop stale comment * Update toolkit/tools/precacher/precacher.go Co-authored-by: Pawel Winogrodzki --------- Co-authored-by: Pawel Winogrodzki --- toolkit/scripts/precache.mk | 2 ++ toolkit/tools/precacher/precacher.go | 26 +++++++++++++++++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/toolkit/scripts/precache.mk b/toolkit/scripts/precache.mk index bc8bbf07988..86a8ae16aab 100644 --- a/toolkit/scripts/precache.mk +++ b/toolkit/scripts/precache.mk @@ -8,6 +8,7 @@ precache_state_dir = $(CACHED_RPMS_DIR)/precache precache_downloaded_files = $(precache_state_dir)/downloaded_files.txt +repo_urls_file = $(precache_state_dir)/repo_urls.txt precache_chroot_dir = $(precache_state_dir)/chroot $(call create_folder,$(precache_state_dir)) @@ -34,6 +35,7 @@ $(STATUS_FLAGS_DIR)/precache.flag: $(go-precacher) $(chroot_worker) $(rpms_snaps --snapshot "$(rpms_snapshot)" \ --output-dir "$(remote_rpms_cache_dir)" \ --output-summary-file "$(precache_downloaded_files)" \ + --repo-urls-file "$(repo_urls_file)" \ $(foreach url,$(PACKAGE_URL_LIST), --repo-url "$(url)") \ --worker-tar $(chroot_worker) \ --worker-dir $(precache_chroot_dir) \ diff --git a/toolkit/tools/precacher/precacher.go b/toolkit/tools/precacher/precacher.go index 1ea46e79886..691b5a29322 100644 --- a/toolkit/tools/precacher/precacher.go +++ b/toolkit/tools/precacher/precacher.go @@ -59,6 +59,7 @@ var ( outDir = app.Flag("output-dir", "Directory to download packages into.").Required().ExistingDir() snapshot = app.Flag("snapshot", "Path to the rpm snapshot .json file.").ExistingFile() outputSummaryFile = app.Flag("output-summary-file", "Path to save the summary of packages downloaded").String() + repoUrlsFile = app.Flag("repo-urls-file", "Path to save the list of package URLs available in the repos").String() repoUrls = app.Flag("repo-url", "URLs of the repos to download from.").Strings() workerTar = app.Flag("worker-tar", "Full path to worker_chroot.tar.gz").Required().ExistingFile() buildDir = app.Flag("worker-dir", "Directory to store chroot while running repo query.").Required().ExistingDir() @@ -85,7 +86,7 @@ func main() { logger.PanicOnError(err) } - packagesAvailableFromRepos, err := getAllRepoData(*repoUrls, *workerTar, *buildDir) + packagesAvailableFromRepos, err := getAllRepoData(*repoUrls, *workerTar, *buildDir, *repoUrlsFile) if err != nil { logger.PanicOnError(err) } @@ -125,7 +126,7 @@ func rpmSnapshotFromFile(snapshotFile string) (rpmSnapshot *repocloner.RepoConte // getAllRepoData returns a map of package names to URLs for all packages available in the given repos. It uses // a chroot to run repoquery. -func getAllRepoData(repoURLs []string, workerTar, buildDir string) (namesToURLs map[string]string, err error) { +func getAllRepoData(repoURLs []string, workerTar, buildDir, repoUrlsFile string) (namesToURLs map[string]string, err error) { const ( leaveChrootOnDisk = false ) @@ -140,6 +141,7 @@ func getAllRepoData(repoURLs []string, workerTar, buildDir string) (namesToURLs defer queryChroot.Close(leaveChrootOnDisk) namesToURLs = make(map[string]string) + URLList := []string{} for _, repoURL := range repoURLs { // Use the chroot to query each repo for the packages it contains var packageRepoPaths []string @@ -160,8 +162,11 @@ func getAllRepoData(repoURLs []string, workerTar, buildDir string) (namesToURLs // We need to prepend the repoURL to the partial URL to get the full URL packageRepoPath = fmt.Sprintf("%s/%s", repoURL, packageRepoPath) namesToURLs[packageName] = packageRepoPath + URLList = append(URLList, packageRepoPath) } } + err = file.WriteLines(URLList, repoUrlsFile) + return } @@ -353,8 +358,7 @@ func precachePackage(pkg *repocloner.RepoPackage, packagesAvailableFromRepos map ) // File names are of the form "-...rpm" - pkgName := fmt.Sprintf("%s-%s.%s.%s", pkg.Name, pkg.Version, pkg.Distribution, pkg.Architecture) - fileName := fmt.Sprintf("%s.rpm", pkgName) + pkgName, fileName := formatName(pkg) fullFilePath := path.Join(outDir, fileName) result := downloadResult{ pkgName: fileName, @@ -377,7 +381,7 @@ func precachePackage(pkg *repocloner.RepoPackage, packagesAvailableFromRepos map return } - // Get the url for the package, or bail out if it is not available + // Get the URL for the package, or bail out if it is not available. url, ok := packagesAvailableFromRepos[pkgName] if !ok { result.resultType = donwloadResultTypeUnavailable @@ -406,6 +410,18 @@ func precachePackage(pkg *repocloner.RepoPackage, packagesAvailableFromRepos map result.resultType = downloadResultTypeSuccess } +func formatName(pkg *repocloner.RepoPackage) (pkgName, fileName string) { + // Names should not contain the epoch, strip everything before the ":"" in the string. "Version": "0:1.2-3", becomes "1.2-3" + version := pkg.Version + if strings.Contains(version, ":") { + version = strings.Split(version, ":")[1] + } + + pkgName = fmt.Sprintf("%s-%s.%s.%s", pkg.Name, version, pkg.Distribution, pkg.Architecture) + fileName = fmt.Sprintf("%s.rpm", pkgName) + return +} + func writeSummaryFile(summaryFile string, downloadedPackages []string) (err error) { logger.Log.Infof("Writing summary file to '%s'", summaryFile) err = file.WriteLines(downloadedPackages, summaryFile) From 8d2115f204097a2fd341b2c997270c849cb1c1fd Mon Sep 17 00:00:00 2001 From: sindhu-karri <33163197+sindhu-karri@users.noreply.github.com> Date: Tue, 29 Aug 2023 00:13:49 +0530 Subject: [PATCH 20/64] Fixed image build issues with packages lacking tests. (#6074) Co-authored-by: Sindhu Karri Co-authored-by: Pawel Winogrodzki --- toolkit/tools/scheduler/schedulerutils/buildlist.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/toolkit/tools/scheduler/schedulerutils/buildlist.go b/toolkit/tools/scheduler/schedulerutils/buildlist.go index 94e7b525120..4459a4d458d 100644 --- a/toolkit/tools/scheduler/schedulerutils/buildlist.go +++ b/toolkit/tools/scheduler/schedulerutils/buildlist.go @@ -107,7 +107,7 @@ func IsReservedFile(rpmPath string, reservedRPMs []string) bool { // - packagesNamesToRebuild, // - local packages listed in the image config, and // - kernels in the image config (if built locally). -func calculatePackagesToBuild(packagesNamesToBuild, packagesNamesToRebuild []*pkgjson.PackageVer, imageConfig, baseDirPath string, dependencyGraph *pkggraph.PkgGraph) (packageVersToBuild []*pkgjson.PackageVer, err error) { +func calculatePackagesToBuild(packagesNamesToBuild, packagesNamesToRebuild []*pkgjson.PackageVer, imageConfig, baseDirPath string, dependencyGraph *pkggraph.PkgGraph, nodeGetter func(*pkggraph.LookupNode) *pkggraph.PkgNode) (packageVersToBuild []*pkgjson.PackageVer, err error) { packageVersToBuild = append(packagesNamesToBuild, packagesNamesToRebuild...) packageVersFromConfig, err := extractPackagesFromConfig(imageConfig, baseDirPath) @@ -116,7 +116,7 @@ func calculatePackagesToBuild(packagesNamesToBuild, packagesNamesToRebuild []*pk return } - packageVersFromConfig, err = filterLocalPackagesOnly(packageVersFromConfig, dependencyGraph) + packageVersFromConfig, err = filterLocalPackagesOnly(packageVersFromConfig, dependencyGraph, nodeGetter) if err != nil { err = fmt.Errorf("failed to filter local packages from the image config, error:\n%w", err) return @@ -153,7 +153,7 @@ func extractPackagesFromConfig(configFile, baseDirPath string) (packageList []*p } // filterLocalPackagesOnly returns the subset of packageVersionsInConfig that only contains local packages. -func filterLocalPackagesOnly(packageVersionsInConfig []*pkgjson.PackageVer, dependencyGraph *pkggraph.PkgGraph) (filteredPackages []*pkgjson.PackageVer, err error) { +func filterLocalPackagesOnly(packageVersionsInConfig []*pkgjson.PackageVer, dependencyGraph *pkggraph.PkgGraph, nodeGetter func(*pkggraph.LookupNode) *pkggraph.PkgNode) (filteredPackages []*pkgjson.PackageVer, err error) { logger.Log.Debug("Filtering out external packages from list of packages extracted from the image config file.") for _, pkgVer := range packageVersionsInConfig { @@ -162,7 +162,8 @@ func filterLocalPackagesOnly(packageVersionsInConfig []*pkgjson.PackageVer, depe // A pkgNode for a local package has the following characteristics: // 1) The pkgNode exists in the graph (is not nil). // 2) The pkgNode has a build node. External packages will only have a run node. - if pkgNode != nil && pkgNode.BuildNode != nil { + filteredNode := nodeGetter(pkgNode) + if filteredNode != nil { filteredPackages = append(filteredPackages, pkgVer) } else { logger.Log.Debugf("Found external package to filter out: %v.", pkgVer) @@ -275,7 +276,7 @@ func parseAndGeneratePackageList(dependencyGraph *pkggraph.PkgGraph, buildList, return } - finalPackagesToBuild, err = calculatePackagesToBuild(packagesToBuild, packagesToRebuild, imageConfig, baseDirPath, dependencyGraph) + finalPackagesToBuild, err = calculatePackagesToBuild(packagesToBuild, packagesToRebuild, imageConfig, baseDirPath, dependencyGraph, nodeGetter) if err != nil { err = fmt.Errorf("unable to generate the final package build list, error:\n%s", err) return From 7fc5ec8dbc32859bf83e867adbaf77d62fe037f8 Mon Sep 17 00:00:00 2001 From: Andrew Phelps Date: Mon, 28 Aug 2023 12:16:01 -0700 Subject: [PATCH 21/64] toolkit: generate image_pkg_manifest.json with image builds (#6044) * generate image_pkg_manifest.json with image builds * updates per feedback * rename variables * move variables to tdnf.go * fix comment * move regexp code in rpmrepocloner to tdnf.go --- toolkit/scripts/imggen.mk | 2 + .../imagegen/installutils/installutils.go | 64 +++++++++++------- toolkit/tools/imager/imager.go | 15 +++-- .../repocloner/rpmrepocloner/rpmrepocloner.go | 67 +++---------------- .../tools/internal/safechroot/safechroot.go | 22 ++++++ toolkit/tools/internal/tdnf/tdnf.go | 64 ++++++++++++++++++ 6 files changed, 147 insertions(+), 87 deletions(-) diff --git a/toolkit/scripts/imggen.mk b/toolkit/scripts/imggen.mk index 992039eec64..2a0019a52e6 100644 --- a/toolkit/scripts/imggen.mk +++ b/toolkit/scripts/imggen.mk @@ -43,6 +43,7 @@ validate-config = $(STATUS_FLAGS_DIR)/validate-image-config meta_user_data_tmp_dir = $(IMAGEGEN_DIR)/meta-user-data_tmp image_package_cache_summary = $(imggen_config_dir)/image_deps.json image_external_package_cache_summary = $(imggen_config_dir)/image_external_deps.json +image_package_manifest = $(imggen_config_dir)/image_pkg_manifest.json # Outputs artifact_dir = $(IMAGES_DIR)/$(config_name) @@ -151,6 +152,7 @@ $(STATUS_FLAGS_DIR)/imager_disk_output.flag: $(go-imager) $(image_package_cache_ --local-repo $(local_and_external_rpm_cache) \ --tdnf-worker $(chroot_worker) \ --repo-file=$(imggen_local_repo) \ + --output-image-contents=$(image_package_manifest) \ --assets $(assets_dir) \ --output-dir $(imager_disk_output_dir) \ --cpu-prof-file=$(PROFILE_DIR)/imager.cpu.pprof \ diff --git a/toolkit/tools/imagegen/installutils/installutils.go b/toolkit/tools/imagegen/installutils/installutils.go index 01ac3841b49..5f00ba1a7fb 100644 --- a/toolkit/tools/imagegen/installutils/installutils.go +++ b/toolkit/tools/imagegen/installutils/installutils.go @@ -20,6 +20,7 @@ import ( "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/file" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/jsonutils" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/logger" + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/packagerepo/repocloner" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/pkgjson" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/randomization" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/retry" @@ -30,6 +31,8 @@ import ( ) const ( + PackageManifestRelativePath = "image_pkg_manifest_installroot.json" + // NullDevice represents the /dev/null device used as a mount device for overlay images. NullDevice = "/dev/null" overlay = "overlay" @@ -415,7 +418,15 @@ func PopulateInstallRoot(installChroot *safechroot.Chroot, packagesToInstall []s } // Calculate how many packages need to be installed so an accurate percent complete can be reported - totalPackages, err := calculateTotalPackages(packagesToInstall, installRoot) + installedPackages, err := calculateTotalPackages(packagesToInstall, installRoot) + if err != nil { + return + } + totalPackages := len(installedPackages.Repo) + + // Write out JSON file with list of packages included in the image + packageManifestPath := filepath.Join("/", PackageManifestRelativePath) + err = jsonutils.WriteJSONFile(packageManifestPath, installedPackages) if err != nil { return } @@ -631,11 +642,14 @@ func configureSystemFiles(installChroot *safechroot.Chroot, hostname string, con return } -func calculateTotalPackages(packages []string, installRoot string) (totalPackages int, err error) { +// calculateTotalPackages will simulate installing the provided list of packages in the installRoot. +// all packages that will be installed are returned in installedPackages, and a manifest with these packages +// is generated under build/imagegen/$config_name/image_pkg_manifest.json +func calculateTotalPackages(packages []string, installRoot string) (installedPackages *repocloner.RepoContents, err error) { var ( releaseverCliArg string ) - allPackageNames := make(map[string]bool) + installedPackages = &repocloner.RepoContents{} const tdnfAssumeNoStdErr = "Error(1032) : Operation aborted.\n" releaseverCliArg, err = tdnf.GetReleaseverCliArg() @@ -644,6 +658,8 @@ func calculateTotalPackages(packages []string, installRoot string) (totalPackage } // For every package calculate what dependencies would also be installed from it. + // checkedPackageSet contains a mapping of all package IDs (name, version, etc) to avoid calculating duplicates + checkedPackageSet := make(map[string]bool) for _, pkg := range packages { var ( stdout string @@ -667,39 +683,35 @@ func calculateTotalPackages(packages []string, installRoot string) (totalPackage // Search for the list of packages to be installed, // it will be prefixed with a line "Installing:" and will // end with an empty line. - inPackageList := false for _, line := range splitStdout { - const ( - packageListPrefix = "Installing:" - packageNameDelimiter = " " - ) + matches := tdnf.InstallPackageRegex.FindStringSubmatch(line) + if len(matches) != tdnf.InstallMaxMatchLen { + // This line contains output other than a package information; skip it + continue + } - const ( - packageNameIndex = iota - extraInformationIndex = iota - totalPackageNameParts = iota - ) + pkg := &repocloner.RepoPackage{ + Name: matches[tdnf.InstallPackageName], + Version: matches[tdnf.InstallPackageVersion], + Architecture: matches[tdnf.InstallPackageArch], + Distribution: matches[tdnf.InstallPackageDist], + } - if !inPackageList { - inPackageList = strings.HasPrefix(line, packageListPrefix) + pkgID := pkg.ID() + if checkedPackageSet[pkgID] { + logger.Log.Tracef("Skipping duplicate package: %s", line) continue - } else if strings.TrimSpace(line) == "" { - break } + checkedPackageSet[pkgID] = true - // Each package to be installed will list its name, followed by a space and then various extra information - pkgSplit := strings.SplitN(line, packageNameDelimiter, totalPackageNameParts) - if len(pkgSplit) != totalPackageNameParts { - err = fmt.Errorf("unexpected TDNF package name output: %s", line) - return - } + logger.Log.Debugf("Added installedPackages entry for: %v", pkgID) - allPackageNames[pkgSplit[packageNameIndex]] = true + installedPackages.Repo = append(installedPackages.Repo, pkg) } } - totalPackages = len(allPackageNames) - logger.Log.Debugf("All packages to be installed (%d): %v", totalPackages, allPackageNames) + logger.Log.Debugf("Total number of packages to be installed: %d", len(installedPackages.Repo)) + return } diff --git a/toolkit/tools/imager/imager.go b/toolkit/tools/imager/imager.go index 89fddf1ba36..c3c0dde4964 100644 --- a/toolkit/tools/imager/imager.go +++ b/toolkit/tools/imager/imager.go @@ -33,6 +33,7 @@ var ( assets = app.Flag("assets", "Path to assets directory.").ExistingDir() baseDirPath = app.Flag("base-dir", "Base directory for relative file paths from the config. Defaults to config's directory.").ExistingDir() outputDir = app.Flag("output-dir", "Path to directory to place final image.").ExistingDir() + imgContentFile = app.Flag("output-image-contents", "File that stores list of packages used to compose the image.").String() liveInstallFlag = app.Flag("live-install", "Enable to perform a live install to the disk specified in config file.").Bool() emitProgress = app.Flag("emit-progress", "Write progress updates to stdout, such as percent complete and current action.").Bool() timestampFile = app.Flag("timestamp-file", "File that stores timestamps for this program.").String() @@ -108,11 +109,11 @@ func main() { timestamp.StopEvent(nil) // applying kickstart } - err = buildSystemConfig(systemConfig, config.Disks, *outputDir, *buildDir) + err = buildSystemConfig(systemConfig, config.Disks, *outputDir, *buildDir, *imgContentFile) logger.PanicOnError(err, "Failed to build system configuration") } -func buildSystemConfig(systemConfig configuration.SystemConfig, disks []configuration.Disk, outputDir, buildDir string) (err error) { +func buildSystemConfig(systemConfig configuration.SystemConfig, disks []configuration.Disk, outputDir, buildDir string, imgContentFile string) (err error) { logger.Log.Infof("Building system configuration (%s)", systemConfig.Name) timestamp.StartEvent("building system config", nil) defer timestamp.StopEvent(nil) @@ -263,13 +264,16 @@ func buildSystemConfig(systemConfig configuration.SystemConfig, disks []configur timestamp.StopEvent(nil) // create offline install env err = setupChroot.Run(func() error { - return buildImage(mountPointMap, mountPointToFsTypeMap, mountPointToMountArgsMap, partIDToDevPathMap, partIDToFsTypeMap, mountPointToOverlayMap, packagesToInstall, systemConfig, diskDevPath, isRootFS, encryptedRoot, readOnlyRoot, diffDiskBuild) + return buildImage(mountPointMap, mountPointToFsTypeMap, mountPointToMountArgsMap, partIDToDevPathMap, partIDToFsTypeMap, mountPointToOverlayMap, packagesToInstall, systemConfig, diskDevPath, isRootFS, encryptedRoot, readOnlyRoot, diffDiskBuild, imgContentFile) }) if err != nil { logger.Log.Error("Failed to build image") return } + // Extract image package manifest from the 'setuproot' chroot + setupChroot.MoveOutFile(installutils.PackageManifestRelativePath, imgContentFile) + err = cleanupExtraFilesInChroot(setupChroot) if err != nil { logger.Log.Error("Failed to cleanup extra files in setup chroot") @@ -295,7 +299,7 @@ func buildSystemConfig(systemConfig configuration.SystemConfig, disks []configur } } } else { - err = buildImage(mountPointMap, mountPointToFsTypeMap, mountPointToMountArgsMap, partIDToDevPathMap, partIDToFsTypeMap, mountPointToOverlayMap, packagesToInstall, systemConfig, diskDevPath, isRootFS, encryptedRoot, readOnlyRoot, diffDiskBuild) + err = buildImage(mountPointMap, mountPointToFsTypeMap, mountPointToMountArgsMap, partIDToDevPathMap, partIDToFsTypeMap, mountPointToOverlayMap, packagesToInstall, systemConfig, diskDevPath, isRootFS, encryptedRoot, readOnlyRoot, diffDiskBuild, imgContentFile) if err != nil { logger.Log.Error("Failed to build image") return @@ -518,7 +522,8 @@ func cleanupExtraFilesInChroot(chroot *safechroot.Chroot) (err error) { }) return } -func buildImage(mountPointMap, mountPointToFsTypeMap, mountPointToMountArgsMap, partIDToDevPathMap, partIDToFsTypeMap map[string]string, mountPointToOverlayMap map[string]*installutils.Overlay, packagesToInstall []string, systemConfig configuration.SystemConfig, diskDevPath string, isRootFS bool, encryptedRoot diskutils.EncryptedRootDevice, readOnlyRoot diskutils.VerityDevice, diffDiskBuild bool) (err error) { + +func buildImage(mountPointMap, mountPointToFsTypeMap, mountPointToMountArgsMap, partIDToDevPathMap, partIDToFsTypeMap map[string]string, mountPointToOverlayMap map[string]*installutils.Overlay, packagesToInstall []string, systemConfig configuration.SystemConfig, diskDevPath string, isRootFS bool, encryptedRoot diskutils.EncryptedRootDevice, readOnlyRoot diskutils.VerityDevice, diffDiskBuild bool, imgContentFile string) (err error) { timestamp.StartEvent("building image", nil) defer timestamp.StopEvent(nil) const ( diff --git a/toolkit/tools/internal/packagerepo/repocloner/rpmrepocloner/rpmrepocloner.go b/toolkit/tools/internal/packagerepo/repocloner/rpmrepocloner/rpmrepocloner.go index 352b7641081..1076ba10197 100644 --- a/toolkit/tools/internal/packagerepo/repocloner/rpmrepocloner/rpmrepocloner.go +++ b/toolkit/tools/internal/packagerepo/repocloner/rpmrepocloner/rpmrepocloner.go @@ -9,7 +9,6 @@ import ( "io" "os" "path/filepath" - "regexp" "strings" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/buildpipeline" @@ -48,50 +47,6 @@ const ( repoIDToolchain = "toolchain-repo" ) -var ( - // Every valid line pair will be of the form: - // -. : - // Repo : [repo_name] - // - // NOTE: we ignore packages installed in the build environment denoted by "Repo : @System". - packageLookupNameMatchRegex = regexp.MustCompile(`([^:\s]+(x86_64|aarch64|noarch))\s*:[^\n]*\nRepo\s+:\s+[^@]`) - packageNameIndex = 1 - - // Every line containing a repo ID will be of the form: - // [] - // For: - // - // [fetcher-cloned-repo] - // - // We'd get: - // - repo_name: fetcher-cloned-repo - // - // The non-capturing groups are used to ignore the brackets. - repoIDRegex = regexp.MustCompile(`(?:\[)([^]]+)(?:\])`) - repoIDIndex = 1 - - // Every valid line will be of the form: . . - // For: - // - // COOL_package2-extended++.aarch64 1.1b.8_X-22~rc1.cm1 fetcher-cloned-repo - // - // We'd get: - // - package_name: COOL_package2-extended++ - // - architecture: aarch64 - // - version: 1.1b.8_X-22~rc1 - // - dist: cm1 - listedPackageRegex = regexp.MustCompile(`^\s*([[:alnum:]_.+-]+)\.([[:alnum:]_+-]+)\s+([[:alnum:]._+~-]+)\.([[:alpha:]]+[[:digit:]]+)`) -) - -const ( - listMatchSubString = iota - listPackageName = iota - listPackageArch = iota - listPackageVersion = iota - listPackageDist = iota - listMaxMatchLen = iota -) - // RpmRepoCloner represents an RPM repository cloner. type RpmRepoCloner struct { chroot *safechroot.Chroot @@ -466,8 +421,8 @@ func (r *RpmRepoCloner) WhatProvides(pkgVer *pkgjson.PackageVer) (packageNames [ // MUST keep order of packages printed by TDNF. // TDNF will print the packages starting from the highest version, which allows us to work around an RPM bug: // https://github.com/rpm-software-management/rpm/issues/2359 - for _, matches := range packageLookupNameMatchRegex.FindAllStringSubmatch(stdout, -1) { - packageName := matches[packageNameIndex] + for _, matches := range tdnf.PackageLookupNameMatchRegex.FindAllStringSubmatch(stdout, -1) { + packageName := matches[tdnf.PackageNameIndex] packageNames = append(packageNames, packageName) logger.Log.Debugf("'%s' is available from package '%s'", pkgVer.Name, packageName) } @@ -542,16 +497,16 @@ func (r *RpmRepoCloner) ClonedRepoContents() (repoContents *repocloner.RepoConte } line := args[0].(string) - matches := listedPackageRegex.FindStringSubmatch(line) - if len(matches) != listMaxMatchLen { + matches := tdnf.ListedPackageRegex.FindStringSubmatch(line) + if len(matches) != tdnf.ListMaxMatchLen { return } pkg := &repocloner.RepoPackage{ - Name: matches[listPackageName], - Version: matches[listPackageVersion], - Architecture: matches[listPackageArch], - Distribution: matches[listPackageDist], + Name: matches[tdnf.ListPackageName], + Version: matches[tdnf.ListPackageVersion], + Architecture: matches[tdnf.ListPackageArch], + Distribution: matches[tdnf.ListPackageDist], } pkgID := pkg.ID() @@ -778,12 +733,12 @@ func readRepoIDs(repoFilePath string) (repoIDs []string, err error) { scanner := bufio.NewScanner(repoFile) for scanner.Scan() { - matches := repoIDRegex.FindStringSubmatch(scanner.Text()) - if len(matches) <= repoIDIndex { + matches := tdnf.RepoIDRegex.FindStringSubmatch(scanner.Text()) + if len(matches) <= tdnf.RepoIDIndex { continue } - repoID := matches[repoIDIndex] + repoID := matches[tdnf.RepoIDIndex] repoIDs = append(repoIDs, repoID) logger.Log.Debugf("Found repo ID: %s", repoID) diff --git a/toolkit/tools/internal/safechroot/safechroot.go b/toolkit/tools/internal/safechroot/safechroot.go index d5a1f1bde21..e61b740a87c 100644 --- a/toolkit/tools/internal/safechroot/safechroot.go +++ b/toolkit/tools/internal/safechroot/safechroot.go @@ -277,6 +277,28 @@ func (c *Chroot) AddFiles(filesToCopy ...FileToCopy) (err error) { return } +// CopyOutFile copies file 'srcPath' in the chroot to the host at 'destPath' +func (c *Chroot) CopyOutFile(srcPath string, destPath string) (err error) { + srcPathFull := filepath.Join(c.rootDir, srcPath) + err = file.Copy(srcPathFull, destPath) + if err != nil { + logger.Log.Errorf("Error copying file '%s'", err) + return + } + return +} + +// MoveOutFile moves file 'srcPath' in the chroot to the host at 'destPath', deleting the 'srcPath' file. +func (c *Chroot) MoveOutFile(srcPath string, destPath string) (err error) { + srcPathFull := filepath.Join(c.rootDir, srcPath) + err = file.Move(srcPathFull, destPath) + if err != nil { + logger.Log.Errorf("Error moving file '%s'", err) + return + } + return +} + // Run runs a given function inside the Chroot. This function will synchronize // with all other Chroots to ensure only one Chroot command is executed at a given time. func (c *Chroot) Run(toRun func() error) (err error) { diff --git a/toolkit/tools/internal/tdnf/tdnf.go b/toolkit/tools/internal/tdnf/tdnf.go index 925269d67cd..332f5326e24 100644 --- a/toolkit/tools/internal/tdnf/tdnf.go +++ b/toolkit/tools/internal/tdnf/tdnf.go @@ -11,6 +11,70 @@ import ( "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/exe" ) +var ( + // Every valid line will be of the form: . + // For: + // X aarch64 1.1b.8_X-22~rc1.cm2 fetcher-cloned-repo + // + // We'd get: + // - package_name: X + // - architecture: aarch64 + // - version: 1.1b.8_X-22~rc1 + // - dist: cm2 + InstallPackageRegex = regexp.MustCompile(`^\s*([[:alnum:]_.+-]+)\s+([[:alnum:]_+-]+)\s+([[:alnum:]._+~-]+)\.([[:alpha:]]+[[:digit:]]+)`) + + // Every valid line pair will be of the form: + // -. : + // Repo : [repo_name] + // + // NOTE: we ignore packages installed in the build environment denoted by "Repo : @System". + PackageLookupNameMatchRegex = regexp.MustCompile(`([^:\s]+(x86_64|aarch64|noarch))\s*:[^\n]*\nRepo\s+:\s+[^@]`) + PackageNameIndex = 1 + + // Every line containing a repo ID will be of the form: + // [] + // For: + // + // [fetcher-cloned-repo] + // + // We'd get: + // - repo_name: fetcher-cloned-repo + // + // The non-capturing groups are used to ignore the brackets. + RepoIDRegex = regexp.MustCompile(`(?:\[)([^]]+)(?:\])`) + RepoIDIndex = 1 + + // Every valid line will be of the form: . . + // For: + // + // COOL_package2-extended++.aarch64 1.1b.8_X-22~rc1.cm1 fetcher-cloned-repo + // + // We'd get: + // - package_name: COOL_package2-extended++ + // - architecture: aarch64 + // - version: 1.1b.8_X-22~rc1 + // - dist: cm1 + ListedPackageRegex = regexp.MustCompile(`^\s*([[:alnum:]_.+-]+)\.([[:alnum:]_+-]+)\s+([[:alnum:]._+~-]+)\.([[:alpha:]]+[[:digit:]]+)`) +) + +const ( + InstallMatchSubString = iota + InstallPackageName = iota + InstallPackageArch = iota + InstallPackageVersion = iota + InstallPackageDist = iota + InstallMaxMatchLen = iota +) + +const ( + ListMatchSubString = iota + ListPackageName = iota + ListPackageArch = iota + ListPackageVersion = iota + ListPackageDist = iota + ListMaxMatchLen = iota +) + const ( // ReleaseverArgument specifies the release version argument to be used with tdnf releaseverArgument = "--releasever" From f754814e7e5c56329aa5c4cfb727259946a6e087 Mon Sep 17 00:00:00 2001 From: bfjelds Date: Mon, 28 Aug 2023 14:10:12 -0700 Subject: [PATCH 22/64] CVE-2022-36648: QEMU fix (#6081) * add qemu CVE patch: CVE-2022-36648 * fix day of week that doesn't match date in changelog * fix patch file --- SPECS/qemu/CVE-2022-36648.patch | 29 +++++++++++++++++++++++++++++ SPECS/qemu/qemu.spec | 8 ++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 SPECS/qemu/CVE-2022-36648.patch diff --git a/SPECS/qemu/CVE-2022-36648.patch b/SPECS/qemu/CVE-2022-36648.patch new file mode 100644 index 00000000000..125071c8131 --- /dev/null +++ b/SPECS/qemu/CVE-2022-36648.patch @@ -0,0 +1,29 @@ +rocker_tlv_parse_nested could return early because of no group ids in +the group_tlvs. In such case tlvs is NULL; tlvs[i + 1] in the next +for-loop will deref the NULL pointer. + +Signed-off-by: Mauro Matteo Cascella +Reported-by: +--- + hw/net/rocker/rocker_of_dpa.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/hw/net/rocker/rocker_of_dpa.c b/hw/net/rocker/rocker_of_dpa.c +index b3b8c5bb6d..1611b79227 100644 +--- a/hw/net/rocker/rocker_of_dpa.c ++++ b/hw/net/rocker/rocker_of_dpa.c +@@ -2039,6 +2039,11 @@ static int of_dpa_cmd_add_l2_flood(OfDpa *of_dpa, OfDpaGroup *group, + rocker_tlv_parse_nested(tlvs, group->l2_flood.group_count, + group_tlvs[ROCKER_TLV_OF_DPA_GROUP_IDS]); + ++ if (!tlvs) { ++ err = -ROCKER_EINVAL; ++ goto err_out; ++ } ++ + for (i = 0; i < group->l2_flood.group_count; i++) { + group->l2_flood.group_ids[i] = rocker_tlv_get_le32(tlvs[i + 1]); + } + +-- +2.35.3 \ No newline at end of file diff --git a/SPECS/qemu/qemu.spec b/SPECS/qemu/qemu.spec index 705046eaa4a..c45a0d1cbd9 100644 --- a/SPECS/qemu/qemu.spec +++ b/SPECS/qemu/qemu.spec @@ -217,7 +217,7 @@ Obsoletes: %{name}-system-unicore32-core <= %{version}-%{release} Summary: QEMU is a FAST! processor emulator Name: qemu Version: 6.2.0 -Release: 16%{?dist} +Release: 17%{?dist} License: BSD AND CC-BY AND GPLv2+ AND LGPLv2+ AND MIT Vendor: Microsoft Corporation Distribution: Mariner @@ -273,6 +273,7 @@ Patch1013: CVE-2022-3165.patch # CVE-2021-3750 fix is not in a release yet # https://gitlab.com/qemu-project/qemu/-/issues/541 Patch1014: CVE-2021-3750.patch +Patch1015: CVE-2022-36648.patch # alsa audio output BuildRequires: alsa-lib-devel @@ -2307,6 +2308,9 @@ useradd -r -u 107 -g qemu -G kvm -d / -s %{_sbindir}/nologin \ %changelog +* Mon Aug 28 2023 Brian Fjeldstad - 6.2.0-17 +- Address CVE-2022-36648 + * Thu Jun 15 2023 Dylan Garrett - 6.2.0-16 - Address CVE-2021-3750 @@ -2329,7 +2333,7 @@ useradd -r -u 107 -g qemu -G kvm -d / -s %{_sbindir}/nologin \ * Wed Oct 26 2022 Olivia Crain - 6.2.0-10 - Have virtiofsd subpackage obsolete qemu-common from 6.1.0 releases -* Tue Sep 28 2022 Saul Paredes - 6.2.0-9 +* Wed Sep 28 2022 Saul Paredes - 6.2.0-9 - Address CVE-2022-2962 * Fri Sep 09 2022 Muhammad Falak - 6.2.0-8 From 0cceaaf45cba86a3c15975616d2393d8ededf613 Mon Sep 17 00:00:00 2001 From: Muhammad Falak R Wani Date: Tue, 29 Aug 2023 08:56:57 +0530 Subject: [PATCH 23/64] heimdal: address CVE-2022-42898 (#6046) Signed-off-by: Muhammad Falak R Wani --- ...c_parse-mem-leak-if-pac_header_size-.patch | 34 ++++ ...2-kdc-Check-generate_pac-return-code.patch | 191 ++++++++++++++++++ ...3-kdc-avoid-re-encoding-KDC-REQ-BODY.patch | 132 ++++++++++++ SPECS/heimdal/CVE-2022-42898.patch | 40 ++++ SPECS/heimdal/heimdal.spec | 10 +- 5 files changed, 406 insertions(+), 1 deletion(-) create mode 100644 SPECS/heimdal/0001-lib-krb5-krb5_pac_parse-mem-leak-if-pac_header_size-.patch create mode 100644 SPECS/heimdal/0002-kdc-Check-generate_pac-return-code.patch create mode 100644 SPECS/heimdal/0003-kdc-avoid-re-encoding-KDC-REQ-BODY.patch create mode 100644 SPECS/heimdal/CVE-2022-42898.patch diff --git a/SPECS/heimdal/0001-lib-krb5-krb5_pac_parse-mem-leak-if-pac_header_size-.patch b/SPECS/heimdal/0001-lib-krb5-krb5_pac_parse-mem-leak-if-pac_header_size-.patch new file mode 100644 index 00000000000..21cbbf0bf9b --- /dev/null +++ b/SPECS/heimdal/0001-lib-krb5-krb5_pac_parse-mem-leak-if-pac_header_size-.patch @@ -0,0 +1,34 @@ +From 7f4a2848e01ddaa3250d9d17e2e87a090b29a1c8 Mon Sep 17 00:00:00 2001 +From: Jeffrey Altman +Date: Wed, 16 Nov 2022 17:28:21 -0500 +Subject: [PATCH 1/3] lib/krb5: krb5_pac_parse mem leak if pac_header_size + failure + +48 byte memory leak from krb5_pac_parse() each time pac_header_size() +fails. + +(cherry picked from commit 02f12fc746341f54a514e9e17bc7d315b91129e8) +Signed-off-by: Muhammad Falak R Wani +--- + lib/krb5/pac.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/lib/krb5/pac.c b/lib/krb5/pac.c +index cf051cd1f..81eba84e2 100644 +--- a/lib/krb5/pac.c ++++ b/lib/krb5/pac.c +@@ -204,9 +204,8 @@ krb5_pac_parse(krb5_context context, const void *ptr, size_t len, + } + + ret = pac_header_size(context, tmp, &header_end); +- if (ret) { +- return ret; +- } ++ if (ret) ++ goto out; + + p->pac = calloc(1, header_end); + if (p->pac == NULL) { +-- +2.42.0 + diff --git a/SPECS/heimdal/0002-kdc-Check-generate_pac-return-code.patch b/SPECS/heimdal/0002-kdc-Check-generate_pac-return-code.patch new file mode 100644 index 00000000000..932760d02f3 --- /dev/null +++ b/SPECS/heimdal/0002-kdc-Check-generate_pac-return-code.patch @@ -0,0 +1,191 @@ +From f452eea6f2aa4df7f4f60c56902a4c2c510c103a Mon Sep 17 00:00:00 2001 +From: Joseph Sutton +Date: Thu, 16 Jun 2022 15:26:07 +1200 +Subject: [PATCH 2/3] kdc: Check generate_pac() return code + +If the function fails, we should not issue a ticket missing the PAC. + +(cherry picked from commit 05e589d2473a1bd225b0fc4670c75ba24091644d) +(cherry picked from commit d1e077c50b6b6e6108d70a0301b97f6904c45ca7) +Signed-off-by: Muhammad Falak R Wani +--- + kdc/kerberos5.c | 44 +++++++++++++++++++++++--------------------- + 1 file changed, 23 insertions(+), 21 deletions(-) + +diff --git a/kdc/kerberos5.c b/kdc/kerberos5.c +index a06dc7d2a..f04472ef7 100644 +--- a/kdc/kerberos5.c ++++ b/kdc/kerberos5.c +@@ -359,10 +359,10 @@ pa_pkinit_validate(kdc_request_t r, const PA_DATA *pa) + r->client_name); + goto out; + } +- ++ + ret = _kdc_pk_check_client(r->context, + r->config, +- r->clientdb, ++ r->clientdb, + r->client, + pkp, + &client_cert); +@@ -460,7 +460,7 @@ pa_enc_chal_validate(kdc_request_t r, const PA_DATA *pa) + int i; + + heim_assert(r->armor_crypto != NULL, "ENC-CHAL called for non FAST"); +- ++ + if (_kdc_is_anon_request(&r->req)) { + ret = KRB5KRB_AP_ERR_BAD_INTEGRITY; + kdc_log(r->context, r->config, 0, "ENC-CHALL doesn't support anon"); +@@ -491,23 +491,23 @@ pa_enc_chal_validate(kdc_request_t r, const PA_DATA *pa) + PA_ENC_TS_ENC p; + + k = &r->client->entry.keys.val[i]; +- ++ + ret = krb5_crypto_init(r->context, &k->key, 0, &longtermcrypto); + if (ret) +- continue; +- ++ continue; ++ + ret = krb5_crypto_fx_cf2(r->context, r->armor_crypto, longtermcrypto, + &pepper1, &pepper2, aenctype, + &challangekey); + krb5_crypto_destroy(r->context, longtermcrypto); + if (ret) + continue; +- ++ + ret = krb5_crypto_init(r->context, &challangekey, 0, + &challangecrypto); + if (ret) + continue; +- ++ + ret = krb5_decrypt_EncryptedData(r->context, challangecrypto, + KRB5_KU_ENC_CHALLENGE_CLIENT, + &enc_data, +@@ -530,7 +530,7 @@ pa_enc_chal_validate(kdc_request_t r, const PA_DATA *pa) + + continue; + } +- ++ + ret = decode_PA_ENC_TS_ENC(ts_data.data, + ts_data.length, + &p, +@@ -571,7 +571,7 @@ pa_enc_chal_validate(kdc_request_t r, const PA_DATA *pa) + krb5_crypto_destroy(r->context, challangecrypto); + if (ret) + goto out; +- ++ + set_salt_padata(&r->outpadata, k->salt); + krb5_free_keyblock_contents(r->context, &r->reply_key); + ret = krb5_copy_keyblock_contents(r->context, &k->key, &r->reply_key); +@@ -609,7 +609,7 @@ pa_enc_ts_validate(kdc_request_t r, const PA_DATA *pa) + size_t len; + Key *pa_key; + char *str; +- ++ + ret = decode_EncryptedData(pa->padata_value.data, + pa->padata_value.length, + &enc_data, +@@ -620,7 +620,7 @@ pa_enc_ts_validate(kdc_request_t r, const PA_DATA *pa) + r->client_name); + goto out; + } +- ++ + ret = hdb_enctype2key(r->context, &r->client->entry, NULL, + enc_data.etype, &pa_key); + if(ret){ +@@ -704,7 +704,7 @@ pa_enc_ts_validate(kdc_request_t r, const PA_DATA *pa) + } + if (labs(kdc_time - p.patimestamp) > r->context->max_skew) { + char client_time[100]; +- ++ + krb5_format_time(r->context, p.patimestamp, + client_time, sizeof(client_time), TRUE); + +@@ -776,7 +776,7 @@ static const struct kdc_patypes pat[] = { + { KRB5_PADATA_PKINIT_KX, "Anonymous PK-INIT", 0, NULL }, + #endif + { KRB5_PADATA_PA_PK_OCSP_RESPONSE , "OCSP", 0, NULL }, +- { ++ { + KRB5_PADATA_ENC_TIMESTAMP , "ENC-TS", + PA_ANNOUNCE, + pa_enc_ts_validate +@@ -800,7 +800,7 @@ log_patypes(krb5_context context, + struct rk_strpool *p = NULL; + char *str; + size_t n, m; +- ++ + for (n = 0; n < padata->len; n++) { + for (m = 0; m < sizeof(pat) / sizeof(pat[0]); m++) { + if (padata->val[n].padata_type == pat[m].type) { +@@ -1569,7 +1569,7 @@ generate_pac(kdc_request_t r, Key *skey) + r->client_name); + return ret; + } +- ++ + ret = _kdc_tkt_add_if_relevant_ad(r->context, &r->et, + KRB5_AUTHDATA_WIN2K_PAC, + &data); +@@ -1638,7 +1638,7 @@ add_enc_pa_rep(kdc_request_t r) + KRB5_PADATA_REQ_ENC_PA_REP, cdata.data, cdata.length); + if (ret) + return ret; +- ++ + return krb5_padata_add(r->context, r->ek.encrypted_pa_data, + KRB5_PADATA_FX_FAST, NULL, 0); + } +@@ -1899,7 +1899,7 @@ _kdc_as_rep(kdc_request_t r, + goto out; + } + +- /* ++ /* + * send requre preauth is its required or anon is requested, + * anon is today only allowed via preauth mechanisms. + */ +@@ -1921,7 +1921,7 @@ _kdc_as_rep(kdc_request_t r, + } + + if (r->clientdb->hdb_auth_status) { +- r->clientdb->hdb_auth_status(context, r->clientdb, r->client, ++ r->clientdb->hdb_auth_status(context, r->clientdb, r->client, + HDB_AUTH_SUCCESS); + } + +@@ -2038,7 +2038,7 @@ _kdc_as_rep(kdc_request_t r, + { + time_t start; + time_t t; +- ++ + start = r->et.authtime = kdc_time; + + if(f.postdated && req->req_body.from){ +@@ -2199,7 +2199,9 @@ _kdc_as_rep(kdc_request_t r, + + /* Add the PAC */ + if (send_pac_p(context, req) && !r->et.flags.anonymous) { +- generate_pac(r, skey); ++ ret = generate_pac(r, skey); ++ if (ret) ++ goto out; + } + + _kdc_log_timestamp(context, config, "AS-REQ", r->et.authtime, r->et.starttime, +-- +2.42.0 + diff --git a/SPECS/heimdal/0003-kdc-avoid-re-encoding-KDC-REQ-BODY.patch b/SPECS/heimdal/0003-kdc-avoid-re-encoding-KDC-REQ-BODY.patch new file mode 100644 index 00000000000..b835a5c0437 --- /dev/null +++ b/SPECS/heimdal/0003-kdc-avoid-re-encoding-KDC-REQ-BODY.patch @@ -0,0 +1,132 @@ +From 06151a48e0dbd24475b8d3aea55548d79cd072b0 Mon Sep 17 00:00:00 2001 +From: Luke Howard +Date: Thu, 20 Oct 2022 13:27:31 +1300 +Subject: [PATCH 3/3] kdc: avoid re-encoding KDC-REQ-BODY + +Use --preserve-binary=KDC-REQ-BODY option to ASN.1 compiler to avoid +re-encoding KDC-REQ-BODYs for verification in GSS preauth, TGS and PKINIT. + +[abartlet@samba.org adapted from Heimdal commit + ebfd48e40a1b61bf5a6b8d00fe5c581e24652b6e + by removing references to FAST and GSS-pre-auth. + + This fixes the Windows 11 22H2 issue with TGS-REQ + as seen at https:github.com/heimdal/heimdal/issues/1011 and so + removes the knownfail file for this test] + +FIXES: 1011 + +Signed-off-by: Andrew Bartlett +(cherry picked from commit 4cd3926e14eca91ca10a9ec87200c8bd717b66e4) +Signed-off-by: Muhammad Falak R Wani +--- + kdc/krb5tgs.c | 24 ++---------------------- + kdc/pkinit.c | 16 ++-------------- + lib/asn1/krb5.opt | 1 + + 3 files changed, 5 insertions(+), 36 deletions(-) + +diff --git a/kdc/krb5tgs.c b/kdc/krb5tgs.c +index 5dd8baf82..1c5195822 100644 +--- a/kdc/krb5tgs.c ++++ b/kdc/krb5tgs.c +@@ -1078,9 +1078,6 @@ tgs_check_authenticator(krb5_context context, + krb5_keyblock *key) + { + krb5_authenticator auth; +- size_t len = 0; +- unsigned char *buf; +- size_t buf_size; + krb5_error_code ret; + krb5_crypto crypto; + +@@ -1106,25 +1103,9 @@ tgs_check_authenticator(krb5_context context, + goto out; + } + +- /* XXX should not re-encode this */ +- ASN1_MALLOC_ENCODE(KDC_REQ_BODY, buf, buf_size, b, &len, ret); +- if(ret){ +- const char *msg = krb5_get_error_message(context, ret); +- kdc_log(context, config, 0, "Failed to encode KDC-REQ-BODY: %s", msg); +- krb5_free_error_message(context, msg); +- goto out; +- } +- if(buf_size != len) { +- free(buf); +- kdc_log(context, config, 0, "Internal error in ASN.1 encoder"); +- *e_text = "KDC internal error"; +- ret = KRB5KRB_ERR_GENERIC; +- goto out; +- } + ret = krb5_crypto_init(context, key, 0, &crypto); + if (ret) { + const char *msg = krb5_get_error_message(context, ret); +- free(buf); + kdc_log(context, config, 0, "krb5_crypto_init failed: %s", msg); + krb5_free_error_message(context, msg); + goto out; +@@ -1132,10 +1113,9 @@ tgs_check_authenticator(krb5_context context, + ret = krb5_verify_checksum(context, + crypto, + KRB5_KU_TGS_REQ_AUTH_CKSUM, +- buf, +- len, ++ b->_save.data, ++ b->_save.length, + auth->cksum); +- free(buf); + krb5_crypto_destroy(context, crypto); + if(ret){ + const char *msg = krb5_get_error_message(context, ret); +diff --git a/kdc/pkinit.c b/kdc/pkinit.c +index 39b08f960..c79c960aa 100644 +--- a/kdc/pkinit.c ++++ b/kdc/pkinit.c +@@ -111,10 +111,7 @@ pk_check_pkauthenticator(krb5_context context, + PKAuthenticator *a, + const KDC_REQ *req) + { +- u_char *buf = NULL; +- size_t buf_size; + krb5_error_code ret; +- size_t len = 0; + krb5_timestamp now; + Checksum checksum; + +@@ -126,22 +123,13 @@ pk_check_pkauthenticator(krb5_context context, + return KRB5KRB_AP_ERR_SKEW; + } + +- ASN1_MALLOC_ENCODE(KDC_REQ_BODY, buf, buf_size, &req->req_body, &len, ret); +- if (ret) { +- krb5_clear_error_message(context); +- return ret; +- } +- if (buf_size != len) +- krb5_abortx(context, "Internal error in ASN.1 encoder"); +- + ret = krb5_create_checksum(context, + NULL, + 0, + CKSUMTYPE_SHA1, +- buf, +- len, ++ req->req_body._save.data, ++ req->req_body._save.length, + &checksum); +- free(buf); + if (ret) { + krb5_clear_error_message(context); + return ret; +diff --git a/lib/asn1/krb5.opt b/lib/asn1/krb5.opt +index 1d6d5e898..5acc596d3 100644 +--- a/lib/asn1/krb5.opt ++++ b/lib/asn1/krb5.opt +@@ -4,3 +4,4 @@ + --sequence=METHOD-DATA + --sequence=ETYPE-INFO + --sequence=ETYPE-INFO2 ++--preserve-binary=KDC-REQ-BODY +-- +2.42.0 + diff --git a/SPECS/heimdal/CVE-2022-42898.patch b/SPECS/heimdal/CVE-2022-42898.patch new file mode 100644 index 00000000000..2466248e55a --- /dev/null +++ b/SPECS/heimdal/CVE-2022-42898.patch @@ -0,0 +1,40 @@ +From 3bc1a99f71fc09ec65e870e4cf487694f9eb70e6 Mon Sep 17 00:00:00 2001 +From: Stefan Metzmacher +Date: Wed, 16 Nov 2022 10:05:56 -0500 +Subject: [PATCH] lib/krb5: fix _krb5_get_int64 on 32-bit systems + +On systems where 'unsigned long' is 32-bits and the 'size' +parameter is set to 8 and the bytes are: + + 0x78 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + +When 'i' becomes 4 'v' will be 0 again. As 'unsigned long' is only +able to hold 4 bytes. + +Change the type of 'v' from 'unsigned long' to 'uint64_t' which +matches the type of the output parameter 'value'. + +(cherry picked from commit 9d1bfab9882d0aa14ae0981e6667c93db93ffc5d) + +Signed-off-by: Stefan Metzmacher +Reviewed-by: Ralph Boehme +Signed-off-by: Muhammad Falak R Wani +CVE: CVE-2022-42898 +Samba-BUG: https://bugzilla.samba.org/show_bug.cgi?id=15203 +--- + lib/krb5/store-int.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/krb5/store-int.c b/lib/krb5/store-int.c +index 542b99abc0..6fe7eb37fc 100644 +--- a/lib/krb5/store-int.c ++++ b/lib/krb5/store-int.c +@@ -49,7 +49,7 @@ KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL + _krb5_get_int64(void *buffer, uint64_t *value, size_t size) + { + unsigned char *p = buffer; +- unsigned long v = 0; ++ uint64_t v = 0; + size_t i; + for (i = 0; i < size; i++) + v = (v << 8) + p[i]; diff --git a/SPECS/heimdal/heimdal.spec b/SPECS/heimdal/heimdal.spec index 5919e3f2d2f..3c6605d7687 100644 --- a/SPECS/heimdal/heimdal.spec +++ b/SPECS/heimdal/heimdal.spec @@ -12,7 +12,7 @@ Summary: A Kerberos 5 implementation without export restrictions Name: heimdal Version: 7.7.1 -Release: 2%{?dist} +Release: 3%{?dist} License: BSD AND MIT Vendor: Microsoft Corporation Distribution: Mariner @@ -41,6 +41,10 @@ Source31: %{name}-ipropd-slave-wrapper Patch1: heimdal-1.6.0-c25f45a-rename-commands.patch Patch2: heimdal-configure.patch Patch3: CVE-2022-45142.patch +Patch4: CVE-2022-42898.patch +Patch5: 0001-lib-krb5-krb5_pac_parse-mem-leak-if-pac_header_size-.patch +Patch6: 0002-kdc-Check-generate_pac-return-code.patch +Patch7: 0003-kdc-avoid-re-encoding-KDC-REQ-BODY.patch BuildRequires: bison #libcom_err-devel is in #BuildRequires: libcom_err-devel @@ -483,6 +487,10 @@ fi %{_sysconfdir}/profile.d/%{name}.csh %changelog +* Thu Aug 24 2023 Muhammad Falak R Wani - 7.7.1-3 +- Address CVE-2022-42898 +- Introduce 3 more patches that fix bugs: https://github.com/heimdal/heimdal/issues/1011 + * Tue Mar 14 2023 Thien Trung Vuong - 7.7.1-2 - Add patch for CVE-2022-45142 From 75ffe3c43f0e69bb3640bc58617544a3ac4e44cf Mon Sep 17 00:00:00 2001 From: Muhammad Falak R Wani Date: Tue, 29 Aug 2023 09:23:41 +0530 Subject: [PATCH 24/64] workflow: use wget with TLSv1_2 to fix cgmanifest check (#6086) Reference: https://github.com/orgs/community/discussions/65227 Signed-off-by: Muhammad Falak R Wani --- .github/workflows/validate-cg-manifest.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validate-cg-manifest.sh b/.github/workflows/validate-cg-manifest.sh index 5c63044db10..edca9e22d29 100755 --- a/.github/workflows/validate-cg-manifest.sh +++ b/.github/workflows/validate-cg-manifest.sh @@ -226,7 +226,7 @@ do # Parsing output instead of using error codes because 'wget' returns code 8 for FTP, even if the file exists. # Sample HTTP(S) output: Remote file exists. # Sample FTP output: File ‘time-1.9.tar.gz’ exists. - if ! wget --spider --timeout=2 --tries=10 "${manifesturl}" 2>&1 | grep -qP "^(Remote file|File ‘.*’) exists.*" + if ! wget --secure-protocol=TLSv1_2 --spider --timeout=2 --tries=10 "${manifesturl}" 2>&1 | grep -qP "^(Remote file|File ‘.*’) exists.*" then echo "Registration for $name:$version has invalid URL '$manifesturl' (could not download)" >> bad_registrations.txt fi From 0558adfb10f38c93733208093505893806ca225b Mon Sep 17 00:00:00 2001 From: Archana Choudhary <36061892+arc9693@users.noreply.github.com> Date: Tue, 29 Aug 2023 13:14:19 +0530 Subject: [PATCH 25/64] Add cfitsio package to SPECS-EXTENDED (#6060) * Adds package cfitsio * Add license info * Update cgmanifest * Update spec --- SPECS-EXTENDED/cfitsio/cfitsio-ldflags.patch | 14 + .../cfitsio/cfitsio-noversioncheck.patch | 13 + .../cfitsio/cfitsio-pkgconfig.patch | 12 + .../cfitsio/cfitsio-remove-rpath.patch | 12 + .../cfitsio/cfitsio.signatures.json | 5 + SPECS-EXTENDED/cfitsio/cfitsio.spec | 478 ++++++++++++++++++ SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md | 2 +- SPECS/LICENSES-AND-NOTICES/data/licenses.json | 1 + cgmanifest.json | 10 + 9 files changed, 546 insertions(+), 1 deletion(-) create mode 100644 SPECS-EXTENDED/cfitsio/cfitsio-ldflags.patch create mode 100644 SPECS-EXTENDED/cfitsio/cfitsio-noversioncheck.patch create mode 100644 SPECS-EXTENDED/cfitsio/cfitsio-pkgconfig.patch create mode 100644 SPECS-EXTENDED/cfitsio/cfitsio-remove-rpath.patch create mode 100644 SPECS-EXTENDED/cfitsio/cfitsio.signatures.json create mode 100644 SPECS-EXTENDED/cfitsio/cfitsio.spec diff --git a/SPECS-EXTENDED/cfitsio/cfitsio-ldflags.patch b/SPECS-EXTENDED/cfitsio/cfitsio-ldflags.patch new file mode 100644 index 00000000000..4495d4626d0 --- /dev/null +++ b/SPECS-EXTENDED/cfitsio/cfitsio-ldflags.patch @@ -0,0 +1,14 @@ +diff -Naur cfitsio/configure cfitsio.ldflags/configure +--- cfitsio/configure 2018-05-09 21:16:00.000000000 +0200 ++++ cfitsio.ldflags/configure 2018-05-23 17:17:18.452431657 +0200 +@@ -4215,8 +4215,8 @@ + ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' + ac_compiler_gnu=$ac_cv_c_compiler_gnu + +-LDFLAGS="$CFLAGS" +-LDFLAGS_BIN="$LDFLAGS" ++# LDFLAGS="$CFLAGS" ++LDFLAGS_BIN="$CFLAGS" + + if test "x$FC" = "xnone" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: cfitsio: == Fortran compiler search has been overridden" >&5 diff --git a/SPECS-EXTENDED/cfitsio/cfitsio-noversioncheck.patch b/SPECS-EXTENDED/cfitsio/cfitsio-noversioncheck.patch new file mode 100644 index 00000000000..e0bba3f083b --- /dev/null +++ b/SPECS-EXTENDED/cfitsio/cfitsio-noversioncheck.patch @@ -0,0 +1,13 @@ +diff -Naur cfitsio/longnam.h cfitsio.noversioncheck/longnam.h +--- cfitsio/longnam.h 2017-09-20 21:40:41.000000000 +0200 ++++ cfitsio.noversioncheck/longnam.h 2018-02-23 14:42:36.246522445 +0100 +@@ -19,7 +19,8 @@ + that was used to build the CFITSIO library is compatible with the version + as included when compiling the application program + */ +-#define fits_open_file(A, B, C, D) ffopentest( CFITSIO_SONAME, A, B, C, D) ++/*#define fits_open_file(A, B, C, D) ffopentest( CFITSIO_SONAME, A, B, C, D)*/ ++#define fits_open_file ffopen + + #define fits_open_data ffdopn + #define fits_open_extlist ffeopn diff --git a/SPECS-EXTENDED/cfitsio/cfitsio-pkgconfig.patch b/SPECS-EXTENDED/cfitsio/cfitsio-pkgconfig.patch new file mode 100644 index 00000000000..5d51b969575 --- /dev/null +++ b/SPECS-EXTENDED/cfitsio/cfitsio-pkgconfig.patch @@ -0,0 +1,12 @@ +diff -ur cfitsio-4.0.0/cfitsio.pc.in cfitsio-4.0.0.pc/cfitsio.pc.in +--- cfitsio-4.0.0/cfitsio.pc.in 2021-05-20 03:18:54.000000000 +0200 ++++ cfitsio-4.0.0.pc/cfitsio.pc.in 2021-12-03 17:38:32.302407819 +0100 +@@ -1,7 +1,7 @@ + prefix=@prefix@ + exec_prefix=@exec_prefix@ + libdir=@libdir@ +-includedir=@includedir@ ++includedir=@includedir@/cfitsio + + Name: cfitsio + Description: FITS File Subroutine Library diff --git a/SPECS-EXTENDED/cfitsio/cfitsio-remove-rpath.patch b/SPECS-EXTENDED/cfitsio/cfitsio-remove-rpath.patch new file mode 100644 index 00000000000..a8cee6b35d4 --- /dev/null +++ b/SPECS-EXTENDED/cfitsio/cfitsio-remove-rpath.patch @@ -0,0 +1,12 @@ +diff -ur cfitsio-3.49/configure cfitsio-3.49.rpath/configure +--- cfitsio-3.49/configure 2021-08-01 10:11:12.159237384 +0200 ++++ cfitsio-3.49.rpath/configure 2021-08-01 10:24:32.504218725 +0200 +@@ -4673,7 +4673,7 @@ + $as_echo "#define _FILE_OFFSET_BITS 64" >>confdefs.h + + # LDFLAGS used by utilities: +- LDFLAGS_BIN="$LDFLAGS_BIN -Wl,-rpath,\${CFITSIO_LIB}" ++ LDFLAGS_BIN="$LDFLAGS_BIN" + ;; + *mingw32*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for large file support" >&5 diff --git a/SPECS-EXTENDED/cfitsio/cfitsio.signatures.json b/SPECS-EXTENDED/cfitsio/cfitsio.signatures.json new file mode 100644 index 00000000000..5145bd9a092 --- /dev/null +++ b/SPECS-EXTENDED/cfitsio/cfitsio.signatures.json @@ -0,0 +1,5 @@ +{ + "Signatures": { + "cfitsio-4.0.0.tar.gz": "b2a8efba0b9f86d3e1bd619f662a476ec18112b4f27cc441cc680a4e3777425e" + } +} \ No newline at end of file diff --git a/SPECS-EXTENDED/cfitsio/cfitsio.spec b/SPECS-EXTENDED/cfitsio/cfitsio.spec new file mode 100644 index 00000000000..1470fd2252e --- /dev/null +++ b/SPECS-EXTENDED/cfitsio/cfitsio.spec @@ -0,0 +1,478 @@ +Summary: Library for manipulating FITS data files +Name: cfitsio +Version: 4.0.0 +Release: 5%{?dist} +License: MIT +Vendor: Microsoft Corporation +Distribution: Mariner +URL: https://heasarc.gsfc.nasa.gov/fitsio/ +Source0: http://heasarc.gsfc.nasa.gov/FTP/software/fitsio/c/%{name}-%{version}.tar.gz +# Remove soname version check +Patch1: cfitsio-noversioncheck.patch +# Some rearrangements in pkg-config file +Patch2: cfitsio-pkgconfig.patch +# Use builder linker flags +Patch3: cfitsio-ldflags.patch +# Remove rpath +Patch4: cfitsio-remove-rpath.patch +BuildRequires: bzip2-devel +BuildRequires: curl-devel +BuildRequires: gcc-gfortran +BuildRequires: make +BuildRequires: zlib-devel +##BuildRequires: pkgconfig(curl) + +%description +CFITSIO is a library of C and FORTRAN subroutines for reading and writing +data files in FITS (Flexible Image Transport System) data format. CFITSIO +simplifies the task of writing software that deals with FITS files by +providing an easy to use set of high-level routines that insulate the +programmer from the internal complexities of the FITS file format. At the +same time, CFITSIO provides many advanced features that have made it the +most widely used FITS file programming interface in the astronomical +community. + +%package devel +Summary: Headers required when building programs against cfitsio +Requires: %{name} = %{version}-%{release} +Requires: pkgconfig + +%description devel +Headers required when building a program against the cfitsio library. + +%package static +Summary: Static cfitsio library + +%description static +Static cfitsio library; avoid use if possible. + +%package docs +Summary: Documentation for cfitsio +BuildArch: noarch + +%description docs +Stand-alone documentation for cfitsio. + +%package -n fpack +Summary: FITS image compression and decompression utilities +Requires: %{name} = %{version}-%{release} + +%description -n fpack +fpack optimally compresses FITS format images and funpack restores them +to the original state. + +* Integer format images are losslessly compressed using the Rice +compression algorithm. + * typically 30% better compression than GZIP + * about 3 times faster compression speed than GZIP + * about the same uncompression speed as GUNZIP + +* Floating-point format images are compressed with a lossy algorithm + * truncates the image pixel noise by a user-specified amount to + produce much higher compression than by lossless techniques + * the precision of scientific measurements in the compressed image + (relative to those in the original image) depends on the selected + amount of compression + +%prep +%autosetup + +%build +%configure --enable-reentrant -with-bzip2 +make shared +make fpack funpack + +%check +make testprog +LD_LIBRARY_PATH=. ./testprog > testprog.lis +cmp -s testprog.lis testprog.out +cmp -s testprog.fit testprog.std + +%install +%make_install LIBDIR=%{_libdir} INCLUDEDIR=%{_includedir}/%{name} \ + CFITSIO_LIB=%{buildroot}%{_libdir} \ + CFITSIO_INCLUDE=%{buildroot}%{_includedir}/%{name} +cp -p f{,un}pack %{buildroot}%{_bindir} + +chmod 755 %{buildroot}%{_libdir}/libcfitsio.so.* +chmod 755 %{buildroot}%{_bindir}/f{,un}pack + + +%ldconfig_scriptlets + +%files +%license License.txt +%doc README docs/changes.txt +%{_libdir}/libcfitsio.so.9* + +%files devel +%doc cookbook.* +%{_includedir}/%{name} +%{_libdir}/libcfitsio.so +%{_libdir}/pkgconfig/cfitsio.pc + +%files static +%license License.txt +%{_libdir}/libcfitsio.a + +%files docs +%license License.txt +%doc docs/fitsio.doc docs/fitsio.pdf docs/cfitsio.pdf + +%files -n fpack +%license License.txt +%doc docs/fpackguide.pdf +%{_bindir}/fpack +%{_bindir}/funpack + +%changelog +* Wed Aug 09 2023 Archana Choudhary - 4.0.0-5 +- Initial CBL-Mariner import from Fedora 37 (license: MIT). +- License verified + +* Thu Jan 05 2023 Kalev Lember - 4.0.0-4 +- Use make_install macro + +* Wed Jul 20 2022 Fedora Release Engineering - 4.0.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Wed Jan 19 2022 Fedora Release Engineering - 4.0.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Fri Dec 03 2021 Sergio Pascual - 4.0.0-1 +- New upstream version 4.0.0 + +* Sun Aug 01 2021 Sergio Pascual - 3.490-4 +- Remove rpath in utilities + +* Wed Jul 21 2021 Fedora Release Engineering - 3.490-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Tue Jan 26 2021 Fedora Release Engineering - 3.490-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Fri Sep 11 2020 Sergio Pascual - 3.490-1 +- Update to 3.490 + +* Mon Jul 27 2020 Fedora Release Engineering - 3.470-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Tue Jan 28 2020 Fedora Release Engineering - 3.470-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Thu Aug 01 2019 Sergio Pascual - 3.470-1 +- Update to 3.470 +- Patch to revert bogus soname increase +- Patch to fix fprintf format errors + +* Wed Jul 24 2019 Fedora Release Engineering - 3.450-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Thu Jan 31 2019 Fedora Release Engineering - 3.450-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Thu Jul 12 2018 Fedora Release Engineering - 3.450-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Wed May 23 2018 Sergio Pascual - 3.450-1 +- Update to 3.450 (fixes bz #1570484) +- Patch to use LDFLAGS (fixes bz #1547590) + +* Mon Mar 12 2018 Christian Dersch - 3.430-1 +- new version + +* Fri Feb 23 2018 Christian Dersch - 3.420-1 +- new version + +* Wed Feb 07 2018 Fedora Release Engineering - 3.370-11 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Mon Oct 02 2017 Christian Dersch - 3.370-10 +- Fix hcompress + +* Wed Aug 02 2017 Fedora Release Engineering - 3.370-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 3.370-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Fri Feb 10 2017 Fedora Release Engineering - 3.370-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Wed Feb 03 2016 Fedora Release Engineering - 3.370-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Wed Jun 17 2015 Fedora Release Engineering - 3.370-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Thu Jun 11 2015 Sergio Pascual - 3.370-4 +- Remove glibc-headers from devel requires (fixes bz #1230471) + +* Thu Sep 18 2014 Orion Poplawski - 3.370-3 +- Ship cookbook example in -devel docs + +* Fri Aug 15 2014 Fedora Release Engineering - 3.370-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Thu Jun 12 2014 Sergio Pascual - 3.370-1 +- New upstream (3.370) +- Patches for ppc64le and aarch64 added upstream + +* Sat Jun 07 2014 Fedora Release Engineering - 3.360-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Thu May 15 2014 Sergio Pascual - 3.360-3 +- Add ppc64le support (bz #1097248). + +* Tue Apr 15 2014 Marcin Juszkiewicz - 3.360-2 +- Add AArch64 support. + +* Mon Dec 09 2013 Sergio Pascual - 3.360-1 +- New upstream (3.360) + +* Sat Aug 03 2013 Fedora Release Engineering - 3.350-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Wed Jul 03 2013 Sergio Pascual - 3.350-1 +- New upstream source (3.350) +- Upstream provides soname +- pkgconfig file rearrangement now a patch instead of using sed + +* Thu Mar 21 2013 Sergio Pascual - 3.340-1 +- New upstream source + +* Tue Mar 19 2013 Sergio Pascual - 3.330-4 +- Using libcfitsio-version.so.0 as soname + +* Tue Mar 19 2013 Sergio Pascual - 3.330-3 +- Fixed permissions of libcfitsio and fpack, funpack + +* Sun Mar 17 2013 Sergio Pascual - 3.330-2 +- Soname contains full package version (upstream doesn't track API changes) + +* Sun Mar 10 2013 Sergio Pascual - 3.330-1 +- New upstream version +- Reverted the patch removing run time check + +* Wed Feb 13 2013 Fedora Release Engineering - 3.310-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Wed Aug 29 2012 Sergio Pascual - 3.310-2 +- Removed check at runtime of the version of the library + +* Wed Aug 29 2012 Sergio Pascual - 3.310-1 +- New upstream version +- Modified cfitsio.patch for new version + +* Wed Jul 18 2012 Fedora Release Engineering - 3.300-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Tue Apr 24 2012 Sergio Pascual - 3.300-1 +- Updated to 3.300 +- Reorganized patches (zlib patch was lost somehow) + +* Fri Apr 13 2012 Orion Poplawski - 3.300-0.1.beta +- Update to 3.300 beta +- Drop s390 patch applied upstream +- Rebase makefile and zlib patches + +* Mon Jan 16 2012 Orion Poplawski - 3.290-4 +- Drop incluedir mod in package config file (bug #782213) + +* Fri Jan 06 2012 Sergio Pascual - 3.290-3 +- Adding the libz patch + +* Fri Jan 06 2012 Sergio Pascual - 3.290-2 +- Using system libz + +* Mon Dec 05 2011 Sergio Pascual - 3.290-1 +- New upstream version +- Reorganizing patches + +* Sat Oct 29 2011 Sergio Pascual - 3.280-2 +- Enable multithreading support + +* Thu Jun 09 2011 Sergio Pascual - 3.280-1 +- New upstream version, with improved image compression floating-point FITS + +* Mon Apr 11 2011 Matthew Truch - 3.270-1 +- Upstream 3.270 release. +- Several bugfixes. +- A few new library functions. +- License change (no longer uses GPL code). + +* Tue Feb 08 2011 Fedora Release Engineering - 3.250-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Tue Aug 31 2010 Matthew Truch - 3.250-5 +- Require fully versioned cfitsio for fpack as cfitsio doesn't properly soname itself. + +* Mon Jul 26 2010 Matthew Truch - 3.250-4 +- Re-fix cfitsio.pc file (BZ 618291) +- Fix typo in date of previous changelog entry. + +* Thu Jul 22 2010 Orion Poplawski - 3.250-3 +- Build and ship fpack/funpack in fpack package + +* Wed Jul 7 2010 Matthew Truch - 3.250-2 +- Include license as %%doc in -static and -docs subpackages. + +* Sun Jul 4 2010 Matthew Truch - 3.250-1 +- Upstream 2.250 release. + +* Wed Jun 30 2010 Karsten Hopp 3.240-4 +- add s390(x) as bigendian machines + +* Sun Feb 21 2010 Matthew Truch - 3.240-3 +- Fix pkgconfig file which contains the wrong version number. + +* Sat Feb 20 2010 Matthew Truch - 3.240-2 +- Bump for rebuild. + +* Wed Jan 27 2010 Matthew Truch - 3.240-1 +- Update to upstream 3.240 release. + +* Mon Nov 2 2009 Matthew Truch - 3.210-2 +- Re-introduce library soname patch (accidentally removed it). + +* Tue Oct 20 2009 Matthew Truch - 3.210-1 +- Update to upstream 3.210 release. + +* Fri Jul 24 2009 Matthew Truch - 3.140-2 +- Bump to include proper tarball. + +* Tue Jul 21 2009 Matthew Truch - 3.140-1 +- Update to upstream 3.140 release. +- Bump for mass rebuild. + +* Wed Jun 17 2009 Matthew Truch - 3.130-5 +- Separate -docs noarch subpackage as per BZ 492438. +- Explicitly set file attributes correctly. + +* Tue Mar 10 2009 Matthew Truch - 3.130-4 +- Set correct version in pkgconfig .pc file. + +* Sun Feb 22 2009 Matthew Truch - 3.130-3 +- Re-check testprogram output. +- Build for koji, rpm, gcc upgrade. + +* Thu Feb 5 2009 Matthew Truch - 3.130-2 +- Fix source file naming typo. + +* Wed Feb 4 2009 Matthew Truch - 3.130-1 +- Update to 3.130 upstream. + +* Sat Sep 20 2008 Matthew Truch - 3.100-2 +- Test library with included test-suite. + +* Fri Sep 19 2008 Matthew Truch - 3.100-1 +- Update to 3.100 upstream. + Includes bugfixes and new compression scheme. + +* Fri Mar 7 2008 Matthew Truch - 3.060-3 +- Properly indicated include and lib directories in .pc file + (BZ 436539) +- Fix typo in -static descrition. + +* Mon Feb 11 2008 Matthew Truch - 3.060-2 +- Bump release for rebuild. + +* Fri Nov 9 2007 Matthew Truch - 3.060-1 +- Update to 3.060 bugfix release. +- Add static package (BZ 372801) + +* Tue Aug 21 2007 Matthew Truch - 3.040-3 +- Bump release for rebuild (build-id etc.) + +* Thu Aug 2 2007 Matthew Truch - 3.040-2 +- Update License tag + +* Mon Jul 9 2007 Matthew Truch - 3.040-1 +- Upgrade to version 3.040 of cfitsio. + +* Fri Feb 16 2007 Matthew Truch - 3.030-2 +- Require pkgconfig for -devel. +- export CC=gcc so we don't clobber $RPM_OPT_FLAGS, thereby + ruining any -debuginfo packages. + See RedHat Bugzilla 229041. + +* Fri Jan 5 2007 Matthew Truch - 3.030-1 +- Upgrade to version 3.020 of cfitsio. + +* Fri Dec 8 2006 Matthew Truch - 3.020-3 +- Commit correct patch to configure and Makefiles. + +* Fri Dec 8 2006 Matthew Truch - 3.020-2 +- Modify spec file to install to correct directories. +- Package cfitsio.pc file in -devel package. + +* Wed Dec 6 2006 Matthew Truch - 3.020-1 +- Upgrade to revision 3.020 of cfitsio. + +* Mon Aug 28 2006 Matthew Truch - 3.006-6 +- Bump release for rebuild in prep. for FC6. + +* Thu Mar 30 2006 Matthew Truch - 3.006-5 +- Include defattr() for devel package as well - bug 187366 + +* Sun Mar 19 2006 Matthew Truch - 3.006-4 +- Don't use macro {buildroot} in build, only in install as per + appended comments to Bugzilla bug 172042 + +* Fri Mar 10 2006 Matthew Truch - 3.006-3 +- Point to f95 instead of g95 as per bugzilla bug 185107 + +* Tue Feb 28 2006 Matthew Truch - 3.006-2 +- Fix spelling typo in name of License.txt file. + +* Tue Feb 28 2006 Matthew Truch - 3.006-1 +- Use new 3.006 fully official stable (non-beta) upstream package. + +* Tue Feb 28 2006 Matthew Truch - 3.005-0.2.beta +- Bump release for FC5 extras rebuild. + +* Fri Dec 23 2005 Matthew Truch - 3.005-0.1.beta +- Update to 3.005beta release. + +* Mon Nov 14 2005 Matthew Truch - 3.004-0.12.b +- Put in proper URL and Source addresses. +- Sync up spec files. + +* Sun Nov 13 2005 Matthew Truch - 3.004-0.11.b +- Clean up unused code in spec file. + +* Sun Nov 13 2005 Matthew Truch - 3.004-0.10.b +- Set environment variables correctly. +- Include patch so Makefile will put things where they belong. + +* Sun Nov 13 2005 Matthew Truch - 3.004-0.9.b +- Set libdir and includedir correctly for build process. + +* Sat Nov 12 2005 Matthew Truch - 3.004-0.8.b +- unset FC once we are done with the build + +* Sat Nov 12 2005 Ed Hill - 3.004-0.7.b +- shared libs and small cleanups + +* Sun Nov 06 2005 Matthew Truch - 3.004-0.6.b +- Own include directory created by the devel package. + +* Sun Nov 06 2005 Matthew Truch - 3.004-0.5.b +- Shorten summary. +- Improve specfile post and postun syntax. +- Install headers in cfitsio include subdir. +- Include more documentation provided in tarball. + +* Sun Nov 06 2005 Matthew Truch - 3.004-0.4.b +- Require cfitsio for cfitsio-devel + +* Sat Nov 05 2005 Matthew Truch - 3.004-0.3.b +- Use proper virgin tarball from upstream. + +* Sun Oct 30 2005 Matthew Truch - 3.004-0.2.b +- Include gcc-gfortran build requirment and make sure it gets used. +- Use macros instead of hard coded paths. +- Include home page in description + +* Sat Oct 29 2005 Matthew Truch - 3.004-0.1.b +- Initial spec file for Fedora Extras. diff --git a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md index e69c29a19f6..766f53d29b9 100644 --- a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md +++ b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md @@ -5,7 +5,7 @@ The CBL-Mariner SPEC files originated from a variety of sources with varying lic | CentOS | [MIT](https://www.centos.org/legal/#licensing-policy) | crash-ptdump-command
delve
fstrm
nodejs-nodemon
rhnlib
rt-setup
rt-tests
rtctl
tuned | | Ceph source | [LGPL2.1](https://github.com/ceph/ceph/blob/master/COPYING-LGPL2.1) | ceph | | Debian | [MIT](https://opensource.org/licenses/MIT) | prometheus-process-exporter | -| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cgdcbxd
chan
CharLS
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | +| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cfitsio
cgdcbxd
chan
CharLS
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | | Fedora (Copyright Remi Collet) | [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/legalcode) | libmemcached-awesome
librabbitmq | | Fedora (ISC) | [ISC License](https://github.com/sarugaku/resolvelib/blob/main/LICENSE) | python-resolvelib | | Magnus Edenhill Open Source | [Magnus Edenhill Open Source BSD License](https://github.com/jemalloc/jemalloc/blob/dev/COPYING) | librdkafka | diff --git a/SPECS/LICENSES-AND-NOTICES/data/licenses.json b/SPECS/LICENSES-AND-NOTICES/data/licenses.json index 72c1a56e80e..157dbaa92f5 100644 --- a/SPECS/LICENSES-AND-NOTICES/data/licenses.json +++ b/SPECS/LICENSES-AND-NOTICES/data/licenses.json @@ -106,6 +106,7 @@ "celt051", "cereal", "certmonger", + "cfitsio", "cgdcbxd", "chan", "CharLS", diff --git a/cgmanifest.json b/cgmanifest.json index 8dd9c1cfb70..c0768fdd158 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -1592,6 +1592,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "cfitsio", + "version": "4.0.0", + "downloadUrl": "http://heasarc.gsfc.nasa.gov/FTP/software/fitsio/c/cfitsio-4.0.0.tar.gz" + } + } + }, { "component": { "type": "other", From 0f63c5732533277ccbbc220c5d0619461c09cca1 Mon Sep 17 00:00:00 2001 From: Christopher Co <35273088+christopherco@users.noreply.github.com> Date: Tue, 29 Aug 2023 01:21:22 -0700 Subject: [PATCH 26/64] Add new EnableFIPS image configuration option (#6075) * feat: add new EnableFIPS image configuration option This commit introduces a new EnableFIPS configuration option to the KernelCommandline image schema. EnableFIPS is a boolean option that controls whether the image tools should configure the system with FIPS enabled or not. To enable FIPS on a system, 3 parts must be present: 1. The argument fips=1 must be passed to the kernel via the kernel commandline during boot. To do this, updates are needed to the grub.cfg to make sure the command line parameter is passed when the kernel is loaded into memory. 2. The dracut-fips package must be installed on the system. The dracut-fips package contains FIPS self-tests which will halt the system if any FIPS-approved kernel crypto algorithm is not functioning as expected. 3. A boot= argument must be passed to the kernel via the kernel command line during boot ONLY if the partition where /boot is mounted is separate from the rootfs. This argument is needed for dracut-fips to locate the kernel's .hmac file, which our kernel package places this in /boot next to the kernel binary. * docs: Add EnableFIPS documentation * docs: add comments for bootPrefix and readOnlyRoot Signed-off-by: Chris Co --- toolkit/docs/formats/imageconfig.md | 3 ++ toolkit/resources/assets/grub2/grub.cfg | 2 +- .../imageconfigvalidator.go | 2 +- .../configuration/kernelcommandline.go | 1 + .../configuration/kernelcommandline_test.go | 3 +- .../imagegen/installutils/installutils.go | 39 ++++++++++++++++++- toolkit/tools/imager/imager.go | 6 +-- 7 files changed, 49 insertions(+), 7 deletions(-) diff --git a/toolkit/docs/formats/imageconfig.md b/toolkit/docs/formats/imageconfig.md index bca375b466c..ee64a0c303f 100644 --- a/toolkit/docs/formats/imageconfig.md +++ b/toolkit/docs/formats/imageconfig.md @@ -396,6 +396,9 @@ KernelCommandLine is an optional key which allows additional parameters to be pa #### ImaPolicy ImaPolicy is a list of Integrity Measurement Architecture (IMA) policies to enable, they may be any combination of `tcb`, `appraise_tcb`, `secure_boot`. +#### EnableFIPS +EnableFIPS is a optional boolean option that controls whether the image tools create the image with FIPS mode enabled or not. If EnableFIPS is specificed, only valid values are `true` and `false`. + #### ExtraCommandLine ExtraCommandLine is a string which will be appended to the end of the kernel command line and may contain any additional parameters desired. The `` ` `` character is reserved and may not be used. **Note: Some kernel command line parameters are already configured by default in [grub.cfg](../../resources/assets/grub2/grub.cfg). Many command line options may be overwritten by passing a new value. If a specific argument must be removed from the existing grub template a `FinalizeImageScript` is currently required. diff --git a/toolkit/resources/assets/grub2/grub.cfg b/toolkit/resources/assets/grub2/grub.cfg index 1c55e45004e..7156a96039e 100644 --- a/toolkit/resources/assets/grub2/grub.cfg +++ b/toolkit/resources/assets/grub2/grub.cfg @@ -19,7 +19,7 @@ fi set rootdevice={{.RootPartition}} menuentry "CBL-Mariner" { - linux $bootprefix/$mariner_linux {{.LuksUUID}} {{.LVM}} {{.IMAPolicy}} {{.ReadOnlyVerityRoot}} {{.SELinux}} rd.auto=1 root=$rootdevice $mariner_cmdline lockdown=integrity sysctl.kernel.unprivileged_bpf_disabled=1 $systemd_cmdline {{.CGroup}} {{.ExtraCommandLine}} $kernelopts + linux $bootprefix/$mariner_linux {{.LuksUUID}} {{.LVM}} {{.IMAPolicy}} {{.ReadOnlyVerityRoot}} {{.SELinux}} {{.FIPS}} rd.auto=1 root=$rootdevice $mariner_cmdline lockdown=integrity sysctl.kernel.unprivileged_bpf_disabled=1 $systemd_cmdline {{.CGroup}} {{.ExtraCommandLine}} $kernelopts if [ -f $bootprefix/$mariner_initrd ]; then initrd $bootprefix/$mariner_initrd fi diff --git a/toolkit/tools/imageconfigvalidator/imageconfigvalidator.go b/toolkit/tools/imageconfigvalidator/imageconfigvalidator.go index 4fc494463a0..bb6a5f08d76 100644 --- a/toolkit/tools/imageconfigvalidator/imageconfigvalidator.go +++ b/toolkit/tools/imageconfigvalidator/imageconfigvalidator.go @@ -157,7 +157,7 @@ func validatePackages(config configuration.Config) (err error) { return fmt.Errorf("%s: [ReadOnlyVerityRoot] and [TmpfsOverlayDebugEnabled] selected, but '%s' package is not included in the package lists", validateError, verityDebugPkgName) } } - if strings.Contains(kernelCmdLineString, fipsKernelCmdLine) { + if strings.Contains(kernelCmdLineString, fipsKernelCmdLine) || systemConfig.KernelCommandLine.EnableFIPS { if !foundDracutFipsPackage { return fmt.Errorf("%s: 'fips=1' provided on kernel cmdline, but '%s' package is not included in the package lists", validateError, dracutFipsPkgName) } diff --git a/toolkit/tools/imagegen/configuration/kernelcommandline.go b/toolkit/tools/imagegen/configuration/kernelcommandline.go index a93644651ed..aa2adfe61e5 100644 --- a/toolkit/tools/imagegen/configuration/kernelcommandline.go +++ b/toolkit/tools/imagegen/configuration/kernelcommandline.go @@ -20,6 +20,7 @@ type KernelCommandLine struct { CGroup CGroup `json:"CGroup"` ImaPolicy []ImaPolicy `json:"ImaPolicy"` SELinux SELinux `json:"SELinux"` + EnableFIPS bool `json:"EnableFIPS"` ExtraCommandLine string `json:"ExtraCommandLine"` } diff --git a/toolkit/tools/imagegen/configuration/kernelcommandline_test.go b/toolkit/tools/imagegen/configuration/kernelcommandline_test.go index 6f3603de254..44f1e880e2c 100644 --- a/toolkit/tools/imagegen/configuration/kernelcommandline_test.go +++ b/toolkit/tools/imagegen/configuration/kernelcommandline_test.go @@ -19,9 +19,10 @@ var ( ExtraCommandLine: "param1=value param2=\"value2 value3\"", SELinux: "permissive", CGroup: "version_two", + EnableFIPS: true, } invalidExtraCommandLine = "invalid=`delim`" - validExtraComandLineJSON = `{"ImaPolicy": ["tcb"], "ExtraCommandLine": "param1=value param2=\"value2 value3\"", "SELinux": "permissive", "CGroup": "version_two"}` + validExtraComandLineJSON = `{"ImaPolicy": ["tcb"], "ExtraCommandLine": "param1=value param2=\"value2 value3\"", "SELinux": "permissive", "CGroup": "version_two", "EnableFIPS": true}` invalidExtraComandLineJSON1 = `{"ImaPolicy": [ "not-an-ima-policy" ]}` invalidExtraComandLineJSON2 = `{"ExtraCommandLine": "` + invalidExtraCommandLine + `"}` ) diff --git a/toolkit/tools/imagegen/installutils/installutils.go b/toolkit/tools/imagegen/installutils/installutils.go index 5f00ba1a7fb..1e681ace552 100644 --- a/toolkit/tools/imagegen/installutils/installutils.go +++ b/toolkit/tools/imagegen/installutils/installutils.go @@ -955,11 +955,14 @@ func InstallGrubEnv(installRoot string) (err error) { // - installRoot is the base install directory // - rootDevice holds the root partition // - bootUUID is the UUID for the boot partition +// - bootPrefix is the path to the /boot grub configs based on the mountpoints (i.e., if /boot is a separate partition from the rootfs partition, bootPrefix=""). // - encryptedRoot holds the encrypted root information if encrypted root is enabled // - kernelCommandLine contains additional kernel parameters which may be optionally set +// - readOnlyRoot holds the dm-verity read-only root partition information if dm-verity is enabled. +// - isBootPartitionSeparate is a boolean value which is true if the /boot partition is separate from the root partition // Note: this boot partition could be different than the boot partition specified in the bootloader. // This boot partition specifically indicates where to find the kernel, config files, and initrd -func InstallGrubCfg(installRoot, rootDevice, bootUUID, bootPrefix string, encryptedRoot diskutils.EncryptedRootDevice, kernelCommandLine configuration.KernelCommandLine, readOnlyRoot diskutils.VerityDevice) (err error) { +func InstallGrubCfg(installRoot, rootDevice, bootUUID, bootPrefix string, encryptedRoot diskutils.EncryptedRootDevice, kernelCommandLine configuration.KernelCommandLine, readOnlyRoot diskutils.VerityDevice, isBootPartitionSeparate bool) (err error) { const ( assetGrubcfgFile = "/installer/grub2/grub.cfg" grubCfgFile = "boot/grub2/grub.cfg" @@ -1026,6 +1029,13 @@ func InstallGrubCfg(installRoot, rootDevice, bootUUID, bootPrefix string, encryp return } + // Configure FIPS + err = setGrubCfgFIPS(isBootPartitionSeparate, bootUUID, installGrubCfgFile, kernelCommandLine) + if err != nil { + logger.Log.Warnf("Failed to set FIPS in grub.cfg: %v", err) + return + } + err = setGrubCfgCGroup(installGrubCfgFile, kernelCommandLine) if err != nil { logger.Log.Warnf("Failed to set CGroup configuration in grub.cfg: %v", err) @@ -2050,6 +2060,33 @@ func setGrubCfgSELinux(grubPath string, kernelCommandline configuration.KernelCo return } +func setGrubCfgFIPS(isBootPartitionSeparate bool, bootUUID, grubPath string, kernelCommandline configuration.KernelCommandLine) (err error) { + const ( + enableFIPSPattern = "{{.FIPS}}" + enableFIPS = "fips=1" + bootPrefix = "boot=" + uuidPrefix = "UUID=" + ) + + // If EnableFIPS is set, always add "fips=1" to the kernel cmdline. + // If /boot is a dedicated partition from the root partition, add "boot=UUID=" as well to the kernel cmdline in grub.cfg. + // This second step is required for fips boot-time self tests to find the kernel's .hmac file in the /boot partition. + fipsKernelArgument := "" + if kernelCommandline.EnableFIPS { + fipsKernelArgument = fmt.Sprintf("%s", enableFIPS) + if isBootPartitionSeparate { + fipsKernelArgument = fmt.Sprintf("%s %s%s%s", fipsKernelArgument, bootPrefix, uuidPrefix, bootUUID) + } + } + + logger.Log.Debugf("Adding EnableFIPS('%s') to '%s'", fipsKernelArgument, grubPath) + err = sed(enableFIPSPattern, fipsKernelArgument, kernelCommandline.GetSedDelimeter(), grubPath) + if err != nil { + logger.Log.Warnf("Failed to set grub.cfg's EnableFIPS setting: %v", err) + } + return +} + func setGrubCfgCGroup(grubPath string, kernelCommandline configuration.KernelCommandLine) (err error) { const ( cgroupPattern = "{{.CGroup}}" diff --git a/toolkit/tools/imager/imager.go b/toolkit/tools/imager/imager.go index c3c0dde4964..9d6f94206bf 100644 --- a/toolkit/tools/imager/imager.go +++ b/toolkit/tools/imager/imager.go @@ -665,9 +665,9 @@ func configureDiskBootloader(systemConfig configuration.SystemConfig, installChr var rootDevice string // Add bootloader. Prefer a separate boot partition if one exists. - bootDevice, ok := installMap[bootMountPoint] + bootDevice, isBootPartitionSeparate := installMap[bootMountPoint] bootPrefix := "" - if !ok { + if !isBootPartitionSeparate { bootDevice = installMap[rootMountPoint] // If we do not have a separate boot partition we will need to add a prefix to all paths used in the configs. bootPrefix = "/boot" @@ -722,7 +722,7 @@ func configureDiskBootloader(systemConfig configuration.SystemConfig, installChr } // Grub will always use filesystem UUID, never PARTUUID or PARTLABEL - err = installutils.InstallGrubCfg(installChroot.RootDir(), rootDevice, bootUUID, bootPrefix, encryptedRoot, systemConfig.KernelCommandLine, readOnlyRoot) + err = installutils.InstallGrubCfg(installChroot.RootDir(), rootDevice, bootUUID, bootPrefix, encryptedRoot, systemConfig.KernelCommandLine, readOnlyRoot, isBootPartitionSeparate) if err != nil { err = fmt.Errorf("failed to install main grub config file: %s", err) return From bb0a3a807a9a5bbc8d3157d6acf5c249b2e4d3c7 Mon Sep 17 00:00:00 2001 From: Tobias Brick <39196763+tobiasb-ms@users.noreply.github.com> Date: Tue, 29 Aug 2023 08:38:36 -0700 Subject: [PATCH 27/64] fix: CVE-2022-48579 in clamav (#6002) * fix: CVE-2022-48579 in clamav * convert std::wstring to wchar* * update changelog --- SPECS/clamav/CVE-2022-48579.patch | 445 ++++++++++++++++++++++++++++++ SPECS/clamav/clamav.spec | 8 +- 2 files changed, 451 insertions(+), 2 deletions(-) create mode 100644 SPECS/clamav/CVE-2022-48579.patch diff --git a/SPECS/clamav/CVE-2022-48579.patch b/SPECS/clamav/CVE-2022-48579.patch new file mode 100644 index 00000000000..d1a072302cd --- /dev/null +++ b/SPECS/clamav/CVE-2022-48579.patch @@ -0,0 +1,445 @@ +From 0c606d48b8e5b1e0c178b47cbbaee60c57cc5d82 Mon Sep 17 00:00:00 2001 +From: Tobias Brick +Date: Mon, 21 Aug 2023 19:26:18 +0000 +Subject: [PATCH] Port CVE-2022-48579 from unrar to clamav/libclamunrar. CVE + Details: https://nvd.nist.gov/vuln/detail/CVE-2022-48579 Original Patch: + https://github.com/pmachapman/unrar/commit/2ecab6bb5ac4f3b88f270218445496662020205f + +Change from original patch: +The original patch added a member field to LastCheckedSymlink CmdExtract, defined as a std::wstring. However, the fork we're patching doesn't use std::wstring and uses wchar* everywhere. So I had to manually change that field and everywhere that uses it. This touched: +* extinfo.cpp +* extinfo.hpp +* extract.cpp +* extract.hpp + +Rejected some files in the initial patch: +* crypt.hpp: Patch changed CRYPT5_KDF_LG2_COUNT from 16 to 15 but clamav already had it at 15. +* dll.rc: Patch changed a bunch of dll information for the windows build but we don't build for windows. +* version.hpp: Patch bumps some version constants but in the clamav version, they don't always seem to take those version bumps. +* win32stm.cpp: Patch changes windows code, which we don't use. + +Original Commit Header: +From 2ecab6bb5ac4f3b88f270218445496662020205f Mon Sep 17 00:00:00 2001 +From: Peter Chapman +Date: Tue, 20 Dec 2022 20:03:01 +1300 +Subject: [PATCH] Updated to 6.2.3 + + arcread.cpp | 4 ++- + crypt.hpp | 5 +-- + dll.rc | 8 ++--- + extinfo.cpp | 89 +++++++++++++++++++++++++++++++++++++++++++++++---- + extinfo.hpp | 3 +- + extract.cpp | 47 ++++++++++++++++++++++++--- + extract.hpp | 6 ++++ + hardlinks.cpp | 2 -- + model.cpp | 6 ++-- + pathfn.cpp | 14 +++++--- + timefn.hpp | 11 +++++++ + ulinks.cpp | 6 ++-- + version.hpp | 6 ++-- + win32stm.cpp | 8 +++-- + 14 files changed, 180 insertions(+), 35 deletions(-) +--- + libclamunrar/arcread.cpp | 4 +- + libclamunrar/extinfo.cpp | 90 +++++++++++++++++++++++++++++++++++--- + libclamunrar/extinfo.hpp | 3 +- + libclamunrar/extract.cpp | 47 ++++++++++++++++++-- + libclamunrar/extract.hpp | 6 +++ + libclamunrar/hardlinks.cpp | 2 - + libclamunrar/model.cpp | 6 ++- + libclamunrar/pathfn.cpp | 14 ++++-- + libclamunrar/timefn.hpp | 11 +++++ + libclamunrar/ulinks.cpp | 6 ++- + 10 files changed, 167 insertions(+), 22 deletions(-) + +diff --git a/libclamunrar/arcread.cpp b/libclamunrar/arcread.cpp +index 1a401f4..73954c7 100644 +--- a/libclamunrar/arcread.cpp ++++ b/libclamunrar/arcread.cpp +@@ -1453,7 +1453,9 @@ bool Archive::ReadSubData(Array *UnpData,File *DestFile,bool TestMode) + { + if (SubHead.UnpSize>0x1000000) + { +- // So huge allocation must never happen in valid archives. ++ // Prevent the excessive allocation. When reading to memory, normally ++ // this function operates with reasonably small blocks, such as ++ // the archive comment, NTFS ACL or "Zone.Identifier" NTFS stream. + uiMsg(UIERROR_SUBHEADERUNKNOWN,FileName); + return false; + } +diff --git a/libclamunrar/extinfo.cpp b/libclamunrar/extinfo.cpp +index 5cb90a4..1cfe1c4 100644 +--- a/libclamunrar/extinfo.cpp ++++ b/libclamunrar/extinfo.cpp +@@ -112,6 +112,69 @@ static bool LinkInPath(const wchar *Name) + } + + ++// Delete symbolic links in file path, if any, and replace them by directories. ++// Prevents extracting files outside of destination folder with symlink chains. ++bool LinksToDirs(const wchar *SrcName,const wchar *SkipPart,wchar *LastChecked,const size_t LastCheckedSize) ++{ ++ // Unlike Unix, Windows doesn't expand lnk1 in symlink targets like ++ // "lnk1/../dir", but converts the path to "dir". In Unix we need to call ++ // this function to prevent placing unpacked files outside of destination ++ // folder if previously we unpacked "dir/lnk1" -> "..", ++ // "dir/lnk2" -> "lnk1/.." and "dir/lnk2/anypath/poc.txt". ++ // We may still need this function to prevent abusing symlink chains ++ // in link source path if we remove detection of such chains ++ // in IsRelativeSymlinkSafe. This function seems to make other symlink ++ // related safety checks redundant, but for now we prefer to keep them too. ++ // ++ // 2022.12.01: the performance impact is minimized after adding the check ++ // against the previous path and enabling this verification only after ++ // extracting a symlink with ".." in target. So we enabled it for Windows ++ // as well for extra safety. ++//#ifdef _UNIX ++ wchar Path[NM]; ++ if (wcslen(SrcName)>=ASIZE(Path)) ++ return false; // It should not be that long, skip. ++ wcsncpyz(Path,SrcName,ASIZE(Path)); ++ ++ size_t SkipLength=wcslen(SkipPart); ++ ++ if (SkipLength>0 && wcsncmp(Path,SkipPart,SkipLength)!=0) ++ SkipLength=0; // Parameter validation, not really needed now. ++ ++ // Do not check parts already checked in previous path to improve performance. ++ size_t LastCheckedLength=wcsnlen(LastChecked, LastCheckedSize); ++ for (uint I=0;Path[I]!=0 && ISkipLength) ++ SkipLength=I; ++ ++ wchar *Name=Path; ++ if (SkipLength>0) ++ { ++ // Avoid converting symlinks in destination path part specified by user. ++ Name+=SkipLength; ++ while (IsPathDiv(*Name)) ++ Name++; ++ } ++ ++ for (wchar *s=Path+wcslen(Path)-1;s>Name;s--) ++ if (IsPathDiv(*s)) ++ { ++ *s=0; ++ FindData FD; ++ if (FindFile::FastFind(Path,&FD,true) && FD.IsLink) ++#ifdef _WIN_ALL ++ if (!DelDir(Path)) ++#else ++ if (!DelFile(Path)) ++#endif ++ return false; // Couldn't delete the symlink to replace it with directory. ++ } ++ wcsncpyz(LastChecked,SrcName,LastCheckedSize); ++//#endif ++ return true; ++} ++ ++ + bool IsRelativeSymlinkSafe(CommandData *Cmd,const wchar *SrcName,const wchar *PrepSrcName,const wchar *TargetName) + { + // Catch root dir based /path/file paths also as stuff like \\?\. +@@ -131,10 +194,14 @@ bool IsRelativeSymlinkSafe(CommandData *Cmd,const wchar *SrcName,const wchar *Pr + UpLevels++; + TargetName++; + } +- // If link target includes "..", it must not have another links +- // in the path, because they can bypass our safety check. For example, ++ // If link target includes "..", it must not have another links in its ++ // source path, because they can bypass our safety check. For example, + // suppose we extracted "lnk1" -> "." first and "lnk1/lnk2" -> ".." next +- // or "dir/lnk1" -> ".." first and "dir/lnk1/lnk2" -> ".." next. ++ // or "dir/lnk1" -> ".." first, "dir/lnk1/lnk2" -> ".." next and ++ // file "dir/lnk1/lnk2/poc.txt" last. ++ // Do not confuse with link chains in target, this is in link source path. ++ // It is important for Windows too, though this check can be omitted ++ // if LinksToDirs is invoked in Windows as well. + if (UpLevels>0 && LinkInPath(PrepSrcName)) + return false; + +@@ -160,15 +227,26 @@ bool IsRelativeSymlinkSafe(CommandData *Cmd,const wchar *SrcName,const wchar *Pr + } + + +-bool ExtractSymlink(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName) ++bool ExtractSymlink(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName,bool &UpLink) + { ++ // Returning true in Uplink indicates that link target might include ".." ++ // and enables additional checks. It is ok to falsely return true here, ++ // as it implies only the minor performance penalty. But we shall always ++ // return true for links with ".." in target for security reason. ++ ++ UpLink=true; // Assume the target might include potentially unsafe "..". ++#if defined(SAVE_LINKS) && defined(_UNIX) || defined(_WIN_ALL) ++ if (Arc.Format==RARFMT50) // For RAR5 archives we can check RedirName for both Unix and Windows. ++ UpLink=wcsstr(Arc.FileHead.RedirName,L"..")!=NULL; ++#endif ++ + #if defined(SAVE_LINKS) && defined(_UNIX) + // For RAR 3.x archives we process links even in test mode to skip link data. + if (Arc.Format==RARFMT15) +- return ExtractUnixLink30(Cmd,DataIO,Arc,LinkName); ++ return ExtractUnixLink30(Cmd,DataIO,Arc,LinkName,UpLink); + if (Arc.Format==RARFMT50) + return ExtractUnixLink50(Cmd,LinkName,&Arc.FileHead); +-#elif defined _WIN_ALL ++#elif defined(_WIN_ALL) + // RAR 5.0 archives store link information in file header, so there is + // no need to additionally test it if we do not create a file. + if (Arc.Format==RARFMT50) +diff --git a/libclamunrar/extinfo.hpp b/libclamunrar/extinfo.hpp +index f3c7511..a77fac8 100644 +--- a/libclamunrar/extinfo.hpp ++++ b/libclamunrar/extinfo.hpp +@@ -1,8 +1,9 @@ + #ifndef _RAR_EXTINFO_ + #define _RAR_EXTINFO_ + ++bool LinksToDirs(const wchar *SrcName,const wchar *SkipPart,wchar *LastChecked,const size_t LastCheckedSize); + bool IsRelativeSymlinkSafe(CommandData *Cmd,const wchar *SrcName,const wchar *PrepSrcName,const wchar *TargetName); +-bool ExtractSymlink(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName); ++bool ExtractSymlink(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName,bool &UpLink); + #ifdef _UNIX + void SetUnixOwner(Archive &Arc,const wchar *FileName); + #endif +diff --git a/libclamunrar/extract.cpp b/libclamunrar/extract.cpp +index dc109b9..e133770 100644 +--- a/libclamunrar/extract.cpp ++++ b/libclamunrar/extract.cpp +@@ -9,6 +9,12 @@ CmdExtract::CmdExtract(CommandData *Cmd) + *DestFileName=0; + + TotalFileCount=0; ++ ++ // Common for all archives involved. Set here instead of DoExtract() ++ // to use in unrar.dll too. Allows to avoid LinksToDirs() calls ++ // and save CPU time in no symlinks including ".." in target were extracted. ++ UpLinkExtracted=false; ++ + Unp=new Unpack(&DataIO); + #ifdef RAR_SMP + Unp->SetThreads(Cmd->Threads); +@@ -98,6 +104,8 @@ void CmdExtract::ExtractArchiveInit(Archive &Arc) + AnySolidDataUnpackedWell=false; + + StartTime.SetCurrentTime(); ++ ++ *LastCheckedSymlink=0; + } + + +@@ -539,6 +547,10 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat) + wcsncpyz(DestFileName,Cmd->DllDestName,ASIZE(DestFileName)); + #endif + ++ if (ExtrFile && Command!='P' && !Cmd->Test && !Cmd->AbsoluteLinks && ++ UpLinkExtracted) ++ ExtrFile=LinksToDirs(DestFileName,Cmd->ExtrPath,LastCheckedSymlink, ASIZE(LastCheckedSymlink)); ++ + File CurFile; + + bool LinkEntry=Arc.FileHead.RedirType!=FSREDIR_NONE; +@@ -667,7 +679,17 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat) + if (Type==FSREDIR_HARDLINK || Type==FSREDIR_FILECOPY) + { + wchar RedirName[NM]; +- ConvertPath(Arc.FileHead.RedirName,RedirName,ASIZE(RedirName)); ++ ++ // 2022.11.15: Might be needed when unpacking WinRAR 5.0 links with ++ // Unix RAR. WinRAR 5.0 used \ path separators here, when beginning ++ // from 5.10 even Windows version uses / internally and converts ++ // them to \ when reading FHEXTRA_REDIR. ++ // We must perform this conversion before ConvertPath call, ++ // so paths mixing different slashes like \dir1/dir2\file are ++ // processed correctly. ++ SlashToNative(Arc.FileHead.RedirName,RedirName,ASIZE(RedirName)); ++ ++ ConvertPath(RedirName,RedirName,ASIZE(RedirName)); + + wchar NameExisting[NM]; + ExtrPrepareName(Arc,RedirName,NameExisting,ASIZE(NameExisting)); +@@ -681,7 +703,22 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat) + if (Type==FSREDIR_UNIXSYMLINK || Type==FSREDIR_WINSYMLINK || Type==FSREDIR_JUNCTION) + { + if (FileCreateMode) +- LinkSuccess=ExtractSymlink(Cmd,DataIO,Arc,DestFileName); ++ { ++ bool UpLink; ++ LinkSuccess=ExtractSymlink(Cmd,DataIO,Arc,DestFileName,UpLink); ++ UpLinkExtracted|=LinkSuccess && UpLink; ++ ++ // We do not actually need to reset the cache here if we cache ++ // only the single last checked path, because at this point ++ // it will always contain the link own path and link can't ++ // overwrite its parent folder. But if we ever decide to cache ++ // several already checked paths, we'll need to reset them here. ++ // Otherwise if no files were created in one of such paths, ++ // let's say because of file create error, it might be possible ++ // to overwrite the path with link and avoid checks. We keep this ++ // code here as a reminder in case of possible modifications. ++ *LastCheckedSymlink=0; // Reset cache for safety reason. ++ } + } + else + { +@@ -868,8 +905,6 @@ void CmdExtract::UnstoreFile(ComprDataIO &DataIO,int64 DestUnpSize) + + bool CmdExtract::ExtractFileCopy(File &New,wchar *ArcName,wchar *NameNew,wchar *NameExisting,size_t NameExistingSize) + { +- SlashToNative(NameExisting,NameExisting,NameExistingSize); // Not needed for RAR 5.1+ archives. +- + File Existing; + if (!Existing.WOpen(NameExisting)) + { +@@ -1131,6 +1166,8 @@ void CmdExtract::ExtrCreateDir(Archive &Arc,const wchar *ArcFileName) + DirExist=FileExist(DestFileName) && IsDir(GetFileAttr(DestFileName)); + if (!DirExist) + { ++ if (!Cmd->AbsoluteLinks && UpLinkExtracted) ++ LinksToDirs(DestFileName,Cmd->ExtrPath,LastCheckedSymlink, ASIZE(LastCheckedSymlink)); + CreatePath(DestFileName,true,Cmd->DisableNames); + MDCode=MakeDir(DestFileName,!Cmd->IgnoreGeneralAttr,Arc.FileHead.FileAttr); + } +@@ -1212,6 +1249,8 @@ bool CmdExtract::ExtrCreateFile(Archive &Arc,File &CurFile) + + MakeNameUsable(DestFileName,true); + ++ if (!Cmd->AbsoluteLinks && UpLinkExtracted) ++ LinksToDirs(DestFileName,Cmd->ExtrPath,LastCheckedSymlink, ASIZE(LastCheckedSymlink)); + CreatePath(DestFileName,true,Cmd->DisableNames); + if (FileCreate(Cmd,&CurFile,DestFileName,ASIZE(DestFileName),&UserReject,Arc.FileHead.UnpSize,&Arc.FileHead.mtime,true)) + { +diff --git a/libclamunrar/extract.hpp b/libclamunrar/extract.hpp +index 159759b..6de575f 100644 +--- a/libclamunrar/extract.hpp ++++ b/libclamunrar/extract.hpp +@@ -52,6 +52,12 @@ class CmdExtract + bool PrevProcessed; // If previous file was successfully extracted or tested. + wchar DestFileName[NM]; + bool PasswordCancelled; ++ bool UpLinkExtracted; // At least one symlink with ".." in target was extracted. ++ ++ // Last path checked for symlinks. We use it to improve the performance, ++ // so we do not check recently checked folders again. ++ wchar LastCheckedSymlink[NM]; ++ + #if defined(_WIN_ALL) && !defined(SFX_MODULE) && !defined(SILENT) + bool Fat32,NotFat32; + #endif +diff --git a/libclamunrar/hardlinks.cpp b/libclamunrar/hardlinks.cpp +index 40cc0aa..171b5fa 100644 +--- a/libclamunrar/hardlinks.cpp ++++ b/libclamunrar/hardlinks.cpp +@@ -1,7 +1,5 @@ + bool ExtractHardlink(CommandData *Cmd,wchar *NameNew,wchar *NameExisting,size_t NameExistingSize) + { +- SlashToNative(NameExisting,NameExisting,NameExistingSize); // Not needed for RAR 5.1+ archives. +- + if (!FileExist(NameExisting)) + { + uiMsg(UIERROR_HLINKCREATE,NameNew); +diff --git a/libclamunrar/model.cpp b/libclamunrar/model.cpp +index 83391c5..e4f9e3c 100644 +--- a/libclamunrar/model.cpp ++++ b/libclamunrar/model.cpp +@@ -532,13 +532,15 @@ inline bool RARPPM_CONTEXT::decodeSymbol2(ModelPPM *Model) + Model->Coder.SubRange.LowCount=HiCnt; + Model->Coder.SubRange.HighCount=Model->Coder.SubRange.scale; + i=NumStats-Model->NumMasked; +- pps--; ++ ++ // 2022.12.02: we removed pps-- here and changed the code below to avoid ++ // "array subscript -1 is outside array bounds" warning in some compilers. + do + { +- pps++; + if (pps>=ps+ASIZE(ps)) // Extra safety check. + return false; + Model->CharMask[(*pps)->Symbol]=Model->EscCount; ++ pps++; + } while ( --i ); + psee2c->Summ += Model->Coder.SubRange.scale; + Model->NumMasked = NumStats; +diff --git a/libclamunrar/pathfn.cpp b/libclamunrar/pathfn.cpp +index 983bd74..162eda2 100644 +--- a/libclamunrar/pathfn.cpp ++++ b/libclamunrar/pathfn.cpp +@@ -31,11 +31,17 @@ wchar* ConvertPath(const wchar *SrcPath,wchar *DestPath,size_t DestSize) + const wchar *s=DestPtr; + if (s[0]!=0 && IsDriveDiv(s[1])) + s+=2; +- if (s[0]=='\\' && s[1]=='\\') ++ ++ // Skip UNC Windows \\server\share\ or Unix //server/share/ ++ if (IsPathDiv(s[0]) && IsPathDiv(s[1])) + { +- const wchar *Slash=wcschr(s+2,'\\'); +- if (Slash!=NULL && (Slash=wcschr(Slash+1,'\\'))!=NULL) +- s=Slash+1; ++ uint SlashCount=0; ++ for (const wchar *t=s+2;*t!=0;t++) ++ if (IsPathDiv(*t) && ++SlashCount==2) ++ { ++ s=t+1; // Found two more path separators after leading two. ++ break; ++ } + } + for (const wchar *t=s;*t!=0;t++) + if (IsPathDiv(*t)) +diff --git a/libclamunrar/timefn.hpp b/libclamunrar/timefn.hpp +index 5271361..49b61e8 100644 +--- a/libclamunrar/timefn.hpp ++++ b/libclamunrar/timefn.hpp +@@ -22,6 +22,17 @@ class RarTime + + // Internal time representation in 1/TICKS_PER_SECOND since 01.01.1601. + // We use nanoseconds here to handle the high precision Unix time. ++ // It allows dates up to July 2185. ++ // ++ // If we'll ever need to extend the date range, we can define a lower ++ // precision Windows version of TICKS_PER_SECOND. But then Unix and Windows ++ // versions can differ in least significant digits of "lt" time output ++ // for Unix archives. ++ // Alternatively we can introduce 'bool HighPrecision' set to true ++ // in SetUnixNS() and TicksPerSecond() instead of constant above. ++ // It might be more reliable than defining TicksPerSecond variable, ++ // which wouldn't survive memset of any structure hosting RarTime. ++ // We would need to eliminate all such memsets in the entire code first. + uint64 itime; + public: + // RarLocalTime::Reminder precision. Must be equal to TICKS_PER_SECOND. +diff --git a/libclamunrar/ulinks.cpp b/libclamunrar/ulinks.cpp +index af6ef36..cd93628 100644 +--- a/libclamunrar/ulinks.cpp ++++ b/libclamunrar/ulinks.cpp +@@ -70,7 +70,8 @@ static bool SafeCharToWide(const char *Src,wchar *Dest,size_t DestSize) + } + + +-bool ExtractUnixLink30(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName) ++static bool ExtractUnixLink30(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc, ++ const wchar *LinkName,bool &UpLink) + { + char Target[NM]; + if (IsLink(Arc.FileHead.FileAttr)) +@@ -100,13 +101,14 @@ bool ExtractUnixLink30(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const w + if (!Cmd->AbsoluteLinks && (IsFullPath(TargetW) || + !IsRelativeSymlinkSafe(Cmd,Arc.FileHead.FileName,LinkName,TargetW))) + return false; ++ UpLink=strstr(Target,"..")!=NULL; + return UnixSymlink(Cmd,Target,LinkName,&Arc.FileHead.mtime,&Arc.FileHead.atime); + } + return false; + } + + +-bool ExtractUnixLink50(CommandData *Cmd,const wchar *Name,FileHeader *hd) ++static bool ExtractUnixLink50(CommandData *Cmd,const wchar *Name,FileHeader *hd) + { + char Target[NM]; + WideToChar(hd->RedirName,Target,ASIZE(Target)); +-- +2.34.1 + diff --git a/SPECS/clamav/clamav.spec b/SPECS/clamav/clamav.spec index 28e8a491349..2ad79af5c1f 100644 --- a/SPECS/clamav/clamav.spec +++ b/SPECS/clamav/clamav.spec @@ -1,7 +1,7 @@ Summary: Open source antivirus engine Name: clamav Version: 0.105.2 -Release: 1%{?dist} +Release: 2%{?dist} License: ASL 2.0 AND BSD AND bzip2-1.0.4 AND GPLv2 AND LGPLv2+ AND MIT AND Public Domain AND UnRar Vendor: Microsoft Corporation Distribution: Mariner @@ -12,6 +12,7 @@ Source0: https://github.com/Cisco-Talos/clamav/archive/refs/tags/%{name}- # To update the cache run: # [repo_root]/toolkit/scripts/build_cargo_cache.sh %%{name}-%%{version}.tar.gz %%{name}-%%{name}-%%{version} Source1: %{name}-%{name}-%{version}-cargo.tar.gz +Patch0: CVE-2022-48579.patch BuildRequires: bzip2-devel BuildRequires: check-devel BuildRequires: cmake @@ -51,7 +52,7 @@ mkdir -p $HOME pushd $HOME tar xf %{SOURCE1} --no-same-owner popd -%autosetup -n clamav-clamav-%{version} +%autosetup -p1 -n clamav-clamav-%{version} %build export CARGO_NET_OFFLINE=true @@ -128,6 +129,9 @@ fi %dir %attr(-,clamav,clamav) %{_sharedstatedir}/clamav %changelog +* Tue Aug 29 2023 Tobias Brick - 0.105.2-2 +- Patch CVE-2022-48579 + * Fri Feb 17 2023 corvus-callidus <108946721+corvus-callidus@users.noreply.github.com> - 0.105.2-1 - Upgrade to 0.105.2 to fix CVE-2023-20032 and CVE-2023-20052 From ea37acfa628d6d51378088891400435879209ea7 Mon Sep 17 00:00:00 2001 From: Cameron E Baird Date: Tue, 29 Aug 2023 09:23:25 -0700 Subject: [PATCH 28/64] Bump telegraf release to rebuild with go 1.20.7 (#6079) * Bump telegraf release to rebuild with go 1.20.7 * telegraf: actually bump release Signed-off-by: Muhammad Falak R Wani --------- Signed-off-by: Muhammad Falak R Wani Co-authored-by: Muhammad Falak R Wani --- SPECS/telegraf/telegraf.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/SPECS/telegraf/telegraf.spec b/SPECS/telegraf/telegraf.spec index 9ed82eea3d8..d82fdc95e1f 100644 --- a/SPECS/telegraf/telegraf.spec +++ b/SPECS/telegraf/telegraf.spec @@ -1,7 +1,7 @@ Summary: agent for collecting, processing, aggregating, and writing metrics. Name: telegraf Version: 1.27.3 -Release: 1%{?dist} +Release: 2%{?dist} License: MIT Vendor: Microsoft Corporation Distribution: Mariner @@ -75,6 +75,9 @@ fi %dir %{_sysconfdir}/%{name}/telegraf.d %changelog +* Mon Aug 28 2023 Cameron Baird - 1.27.3-2 +- Bump release to rebuild with go 1.20.7 + * Mon Aug 07 2023 CBL-Mariner Servicing Account - 1.27.3-1 - Auto-upgrade to 1.27.3 - resolve vulnerability with jaeger v1.38.0 From 4670aafbf82e72b327a8052987bfcb60a5d5fa2e Mon Sep 17 00:00:00 2001 From: Henry Beberman Date: Tue, 29 Aug 2023 09:40:45 -0700 Subject: [PATCH 29/64] Fix CVE-2023-38710, CVE-2023-38711, CVE-2023-38712 in libreswan (#6085) --- SPECS/libreswan/CVE-2023-38710.patch | 212 +++++++++++++++++++++++++++ SPECS/libreswan/CVE-2023-38711.patch | 44 ++++++ SPECS/libreswan/CVE-2023-38712.patch | 212 +++++++++++++++++++++++++++ SPECS/libreswan/libreswan.spec | 8 +- 4 files changed, 475 insertions(+), 1 deletion(-) create mode 100644 SPECS/libreswan/CVE-2023-38710.patch create mode 100644 SPECS/libreswan/CVE-2023-38711.patch create mode 100644 SPECS/libreswan/CVE-2023-38712.patch diff --git a/SPECS/libreswan/CVE-2023-38710.patch b/SPECS/libreswan/CVE-2023-38710.patch new file mode 100644 index 00000000000..c8e92d7a331 --- /dev/null +++ b/SPECS/libreswan/CVE-2023-38710.patch @@ -0,0 +1,212 @@ +diff --show-c-function -Naur a/programs/pluto/ikev2_create_child_sa.c b/programs/pluto/ikev2_create_child_sa.c +--- a/programs/pluto/ikev2_create_child_sa.c 2022-05-24 10:23:22.000000000 -0700 ++++ b/programs/pluto/ikev2_create_child_sa.c 2023-08-28 16:16:12.368307980 -0700 +@@ -175,80 +175,102 @@ static void emancipate_larval_ike_sa(str + release_whack(new_ike->sa.st_logger, HERE); + } + +-static struct child_sa *find_v2N_REKEY_SA_child(struct ike_sa *ike, +- struct msg_digest *md) ++/* ++ * Find the Child SA identified by the v2N_REKEY_SA payload. ++ * ++ * FALSE: payload corrupt; caller should respond with the fatal ++ * v2N_INVALID_SYNTAX. ++ * ++ * TRUE, CHILD==NULL: payload ok but no matching Child SA was ++ * found. The v2N_CHILD_SA_NOT_FOUND response already recorded using ++ * information extracted from the rekey notify payload. ++ * ++ * TRUE, CHILD!=NULL: payload ok, matching Child SA found. ++ */ ++ ++static bool find_v2N_REKEY_SA_child(struct ike_sa *ike, ++ struct msg_digest *md, ++ struct child_sa **child) + { ++ *child = NULL; ++ + /* +- * Previously found by the state machine. ++ * Previously decoded and minimially validated by the state ++ * machine using ikev2_notify_desc (i.e., more validation ++ * required). + */ ++ + const struct payload_digest *rekey_sa_payload = md->pd[PD_v2N_REKEY_SA]; + if (rekey_sa_payload == NULL) { + llog_pexpect(ike->sa.st_logger, HERE, + "rekey child can't find its rekey_sa payload"); +- return NULL; +- } +-#if 0 +- /* XXX: this would require a separate .pd_next link? */ +- if (rekey_sa_payload->next != NULL) { +- /* will tolerate multiple */ +- log_state(RC_LOG_SERIOUS, &ike->sa, +- "ignoring duplicate v2N_REKEY_SA in exchange"); ++ return false; + } +-#endif ++ ++ const struct ikev2_notify *rekey_notify = &rekey_sa_payload->payload.v2n; + + /* +- * find old state to rekey ++ * Check the protocol. ++ * ++ * "ikev2_notify_desc" allows 0, IKE, ESP and AH; reject the ++ * first two. Will also need to check that the protocl ++ * matches that extablished by the Child SA. + */ + +- const struct ikev2_notify *rekey_notify = &rekey_sa_payload->payload.v2n; ++ if (rekey_notify->isan_protoid != PROTO_IPSEC_ESP && ++ rekey_notify->isan_protoid != PROTO_IPSEC_AH) { ++ esb_buf b; ++ llog_sa(RC_LOG, ike, ++ "CREATE_CHILD_SA IPsec SA rekey invalid Protocol ID %s", ++ enum_show(&ikev2_notify_protocol_id_names, rekey_notify->isan_protoid, &b)); ++ return false; ++ } ++ ++#ifndef ldbg_sa ++#define ldbg_sa(SA, ...) ldbg((SA)->sa.st_logger, __VA_ARGS__) ++#endif ++ + esb_buf b; +- dbg("CREATE_CHILD_SA IPsec SA rekey Protocol %s", +- enum_show(&ikev2_notify_protocol_id_names, rekey_notify->isan_protoid, &b)); ++ ldbg_sa(ike, "CREATE_CHILD_SA IPsec SA rekey Protocol %s", ++ enum_show(&ikev2_notify_protocol_id_names, rekey_notify->isan_protoid, &b)); ++ ++ /* ++ * Get the SPI. ++ * ++ * The SPI (and the protoid?) can be used to find the Child SA ++ * to rekey. ++ */ + + if (rekey_notify->isan_spisize != sizeof(ipsec_spi_t)) { +- log_state(RC_LOG, &ike->sa, +- "CREATE_CHILD_SA IPsec SA rekey invalid spi size %u", +- rekey_notify->isan_spisize); +- record_v2N_response(ike->sa.st_logger, ike, md, v2N_INVALID_SYNTAX, +- NULL/*empty data*/, ENCRYPTED_PAYLOAD); +- return NULL; ++ llog_sa(RC_LOG, ike, ++ "CREATE_CHILD_SA IPsec SA rekey invalid spi size %u", ++ rekey_notify->isan_spisize); ++ return false; + } + +- ipsec_spi_t spi = 0; ++#ifndef pbs_in_thing ++#define pbs_in_thing(PBS, THING, NAME) pbs_in_raw(PBS, &(THING), sizeof(THING), NAME) ++#endif ++ ++ ipsec_spi_t spi = 0; /* network ordered */ + struct pbs_in rekey_pbs = rekey_sa_payload->pbs; +- diag_t d = pbs_in_raw(&rekey_pbs, &spi, sizeof(spi), "SPI"); ++ diag_t d = pbs_in_thing(&rekey_pbs, spi, "SPI"); + if (d != NULL) { ++ /* for instance, truncated SPI */ + llog_diag(RC_LOG, ike->sa.st_logger, &d, "%s", ""); +- record_v2N_response(ike->sa.st_logger, ike, md, v2N_INVALID_SYNTAX, +- NULL/*empty data*/, ENCRYPTED_PAYLOAD); +- return NULL; /* cannot happen; XXX: why? */ ++ return false; + } + + if (spi == 0) { +- log_state(RC_LOG, &ike->sa, +- "CREATE_CHILD_SA IPsec SA rekey contains zero SPI"); +- record_v2N_response(ike->sa.st_logger, ike, md, v2N_INVALID_SYNTAX, +- NULL/*empty data*/, ENCRYPTED_PAYLOAD); +- return NULL; +- } +- +- if (rekey_notify->isan_protoid != PROTO_IPSEC_ESP && +- rekey_notify->isan_protoid != PROTO_IPSEC_AH) { +- esb_buf b; +- log_state(RC_LOG, &ike->sa, +- "CREATE_CHILD_SA IPsec SA rekey invalid Protocol ID %s", +- enum_show(&ikev2_notify_protocol_id_names, rekey_notify->isan_protoid, &b)); +- record_v2N_spi_response(ike->sa.st_logger, ike, md, +- rekey_notify->isan_protoid, &spi, +- v2N_CHILD_SA_NOT_FOUND, +- NULL/*empty data*/, ENCRYPTED_PAYLOAD); +- return NULL; ++ llog_sa(RC_LOG, ike, ++ "CREATE_CHILD_SA IPsec SA rekey contains zero SPI"); ++ return false; + } + + esb_buf protoesb; +- dbg("CREATE_CHILD_S to rekey IPsec SA(0x%08" PRIx32 ") Protocol %s", +- ntohl((uint32_t) spi), +- enum_show(&ikev2_notify_protocol_id_names, rekey_notify->isan_protoid, &protoesb)); ++ ldbg_sa(ike, "CREATE_CHILD_SA to rekey IPsec SA(0x%08" PRIx32 ") Protocol %s", ++ ntohl((uint32_t) spi), ++ enum_show(&ikev2_notify_protocol_id_names, rekey_notify->isan_protoid, &protoesb)); + + /* + * From 1.3.3. Rekeying Child SAs with the CREATE_CHILD_SA +@@ -257,29 +279,31 @@ static struct child_sa *find_v2N_REKEY_S + * exchange initiator would expect in inbound ESP or AH + * packets. + * +- * From our POV, that's the outbound SPI. ++ * From our, the responder's POV, that's the outbound SPI. + */ ++ + struct child_sa *replaced_child = find_v2_child_sa_by_outbound_spi(ike, rekey_notify->isan_protoid, spi); + if (replaced_child == NULL) { + esb_buf b; +- log_state(RC_LOG, &ike->sa, +- "CREATE_CHILD_SA no such IPsec SA to rekey SA(0x%08" PRIx32 ") Protocol %s", +- ntohl((uint32_t) spi), +- enum_show(&ikev2_notify_protocol_id_names, rekey_notify->isan_protoid, &b)); ++ llog_sa(RC_LOG, ike, ++ "CREATE_CHILD_SA no such IPsec SA to rekey SA(0x%08" PRIx32 ") Protocol %s", ++ ntohl((uint32_t) spi), ++ enum_show(&ikev2_notify_protocol_id_names, rekey_notify->isan_protoid, &b)); + record_v2N_spi_response(ike->sa.st_logger, ike, md, + rekey_notify->isan_protoid, &spi, + v2N_CHILD_SA_NOT_FOUND, + NULL/*empty data*/, ENCRYPTED_PAYLOAD); +- return NULL; ++ return true; + } + + connection_buf cb; +- dbg("#%lu hasa a rekey request for "PRI_CONNECTION" #%lu TSi TSr", +- ike->sa.st_serialno, +- pri_connection(replaced_child->sa.st_connection, &cb), +- replaced_child->sa.st_serialno); ++ ldbg_sa(ike, "#%lu hasa a rekey request for "PRI_CONNECTION" #%lu TSi TSr", ++ ike->sa.st_serialno, ++ pri_connection(replaced_child->sa.st_connection, &cb), ++ replaced_child->sa.st_serialno); + +- return replaced_child; ++ *child = replaced_child; ++ return true; + } + + static bool record_v2_rekey_ike_message(struct ike_sa *ike, +@@ -631,8 +655,13 @@ stf_status process_v2_CREATE_CHILD_SA_re + struct child_sa *larval_child, + struct msg_digest *md) + { ++ struct child_sa *predecessor = NULL; ++ if (!find_v2N_REKEY_SA_child(ike, md, &predecessor)) { ++ record_v2N_response(ike->sa.st_logger, ike, md, v2N_INVALID_SYNTAX, ++ NULL/*empty data*/, ENCRYPTED_PAYLOAD); ++ return STF_FATAL; ++ } + +- struct child_sa *predecessor = find_v2N_REKEY_SA_child(ike, md); + if (predecessor == NULL) { + /* already logged; already recorded */ + return STF_OK; /*IKE*/ diff --git a/SPECS/libreswan/CVE-2023-38711.patch b/SPECS/libreswan/CVE-2023-38711.patch new file mode 100644 index 00000000000..4354a2128af --- /dev/null +++ b/SPECS/libreswan/CVE-2023-38711.patch @@ -0,0 +1,44 @@ +diff --show-c-function -Naur a/programs/pluto/ikev1_quick.c b/programs/pluto/ikev1_quick.c +--- a/programs/pluto/ikev1_quick.c 2022-05-24 10:23:22.000000000 -0700 ++++ b/programs/pluto/ikev1_quick.c 2023-08-28 16:14:43.012112514 -0700 +@@ -1918,6 +1918,11 @@ static struct connection *fc_try(const s + const ip_selector *local_client, + const ip_selector *remote_client) + { ++ if (selector_is_unset(local_client) || ++ selector_is_unset(remote_client)) { ++ return NULL; ++ } ++ + struct connection *best = NULL; + policy_prio_t best_prio = BOTTOM_PRIO; + const bool remote_is_host = selector_eq_address(*remote_client, +@@ -2101,6 +2106,11 @@ static struct connection *fc_try_oppo(co + const ip_selector *local_client, + const ip_selector *remote_client) + { ++ if (selector_is_unset(local_client) || ++ selector_is_unset(remote_client)) { ++ return NULL; ++ } ++ + struct connection *best = NULL; + policy_prio_t best_prio = BOTTOM_PRIO; + +@@ -2222,6 +2232,16 @@ struct connection *find_v1_client_connec + str_selectors(local_client, remote_client, &sb)); + } + ++ if (selector_is_unset(local_client)) { ++ dbg("peer's local client is not set"); ++ return NULL; ++ } ++ ++ if (selector_is_unset(remote_client)) { ++ dbg("peer's remote client is not set"); ++ return NULL; ++ } ++ + /* + * Give priority to current connection + * but even greater priority to a routed concrete connection. diff --git a/SPECS/libreswan/CVE-2023-38712.patch b/SPECS/libreswan/CVE-2023-38712.patch new file mode 100644 index 00000000000..b225d933b7b --- /dev/null +++ b/SPECS/libreswan/CVE-2023-38712.patch @@ -0,0 +1,212 @@ +diff --show-c-function -Naur a/programs/pluto/ikev1.c b/programs/pluto/ikev1.c +--- a/programs/pluto/ikev1.c 2022-05-24 10:23:22.000000000 -0700 ++++ b/programs/pluto/ikev1.c 2023-08-28 16:03:33.198560283 -0700 +@@ -1748,7 +1748,6 @@ void process_packet_tail(struct msg_dige + const struct state_v1_microcode *smc = md->smc; + enum state_kind from_state = smc->state; + bool new_iv_set = md->new_iv_set; +- bool self_delete = false; + + if (md->hdr.isa_flags & ISAKMP_FLAGS_v1_ENCRYPTION) { + +@@ -2223,38 +2222,40 @@ void process_packet_tail(struct msg_dige + } + } + ++ pexpect(st == md->v1_st); /* could be NULL */ ++ + for (struct payload_digest *p = md->chain[ISAKMP_NEXT_D]; + p != NULL; p = p->next) { +- self_delete |= accept_delete(md, p); +- if (DBGP(DBG_BASE)) { +- DBG_dump("del:", p->pbs.cur, +- pbs_left(&p->pbs)); ++ if (!accept_delete(&st, md, p)) { ++ ldbg(md->md_logger, "bailing with bad delete message"); ++ return; + } +- if (md->v1_st != st) { +- pexpect(md->v1_st == NULL); +- dbg("zapping ST as accept_delete() zapped MD.ST"); +- st = md->v1_st; ++ if (st == NULL) { ++ ldbg(md->md_logger, "bailing due to self-inflicted delete"); ++ return; + } + } + ++ pexpect(st == md->v1_st); /* could be NULL */ ++ + for (struct payload_digest *p = md->chain[ISAKMP_NEXT_VID]; + p != NULL; p = p->next) { + handle_v1_vendorid(md, pbs_in_left_as_shunk(&p->pbs), + (st != NULL ? st->st_logger : md->md_logger)); + } + +- if (self_delete) { +- accept_self_delete(md); +- st = md->v1_st; +- /* note: st ought to be NULL from here on */ +- } ++ pexpect(st == md->v1_st); /* could be NULL */ + +- pexpect(st == md->v1_st); +- statetime_t start = statetime_start(md->v1_st); + /* +- * XXX: danger - the .informational() processor deletes ST; +- * and then tunnels this loss through MD.ST. ++ * XXX: Danger. ++ * ++ * ++ the .informational() processor deletes ST; and then ++ * tries to tunnel this loss back through MD.ST. ++ * ++ * ++ the .aggressive() processor replaces .V1_ST with the IKE ++ * SA? + */ ++ statetime_t start = statetime_start(st); + stf_status e = smc->processor(st, md); + complete_v1_state_transition(md->v1_st, md, e); + statetime_stop(&start, "%s()", __func__); +diff --show-c-function -Naur a/programs/pluto/ikev1_main.c b/programs/pluto/ikev1_main.c +--- a/programs/pluto/ikev1_main.c 2022-05-24 10:23:22.000000000 -0700 ++++ b/programs/pluto/ikev1_main.c 2023-08-28 16:03:33.198560283 -0700 +@@ -1984,19 +1984,25 @@ void send_v1_delete(struct state *st) + * @param md Message Digest + * @param p Payload digest + * +- * returns TRUE to indicate st needs to be deleted. +- * We dare not do that ourselves because st is still in use. +- * accept_self_delete must be called to do this +- * at a more appropriate time. ++ * DANGER: this may stomp on *SDP and md->v1_st. ++ * ++ * Returns FALSE when the payload is crud. + */ +-bool accept_delete(struct msg_digest *md, +- struct payload_digest *p) ++bool accept_delete(struct state **stp, ++ struct msg_digest *md, ++ struct payload_digest *p) + { +- struct state *st = md->v1_st; ++ struct state *st = *stp; + struct isakmp_delete *d = &(p->payload.delete); + size_t sizespi; + int i; +- bool self_delete = false; ++ ++ /* Need state for things to be encrypted */ ++ if (st == NULL) { ++ llog(RC_LOG_SERIOUS, md->md_logger, ++ "ignoring Delete SA with no matching state"); ++ return false; ++ } + + /* We only listen to encrypted notifications */ + if (!md->encrypted) { +@@ -2031,7 +2037,7 @@ bool accept_delete(struct msg_digest *md + + case PROTO_IPCOMP: + /* nothing interesting to delete */ +- return false; ++ return true; + + default: + { +@@ -2090,21 +2096,20 @@ bool accept_delete(struct msg_digest *md + * identities + */ + log_state(RC_LOG_SERIOUS, st, "ignoring Delete SA payload: ISAKMP SA used to convey Delete has different IDs from ISAKMP SA it deletes"); +- } else if (dst == st) { +- /* +- * remember this for later: +- * we need st to do any remaining deletes +- */ +- self_delete = true; + } else { + /* note: this code is cloned for handling self_delete */ +- log_state(RC_LOG_SERIOUS, st, "received Delete SA payload: deleting ISAKMP State #%lu", ++ log_state(RC_LOG_SERIOUS, st, "received Delete SA payload: %sdeleting ISAKMP State #%lu", ++ (dst == st ? "self-" : ""), + dst->st_serialno); + if (nat_traversal_enabled && dst->st_connection->ikev1_natt != NATT_NONE) { + nat_traversal_change_port_lookup(md, dst); + v1_maybe_natify_initiator_endpoints(st, HERE); +- } ++ } + delete_state(dst); ++ if (dst == st) { ++ *stp = dst = st = md->v1_st = NULL; ++ return true; ++ } + } + } else { + /* +@@ -2163,12 +2168,15 @@ bool accept_delete(struct msg_digest *md + event_force(EVENT_SA_REPLACE, dst); + } else { + log_state(RC_LOG_SERIOUS, st, +- "received Delete SA(0x%08" PRIx32 ") payload: deleting IPsec State #%lu", ++ "received Delete SA(0x%08" PRIx32 ") payload: %sdeleting IPsec State #%lu", + ntohl(spi), ++ (st == dst ? "self-" : ""), + dst->st_serialno); + delete_state(dst); +- if (md->v1_st == dst) +- md->v1_st = NULL; ++ if (md->v1_st == dst) { ++ *stp = dst = md->v1_st = NULL; ++ return true; ++ } + } + + if (rc->newest_ipsec_sa == SOS_NOBODY) { +@@ -2188,29 +2196,15 @@ bool accept_delete(struct msg_digest *md + * states tied to the + * connection? + */ ++ dbg("%s() self-inflicted delete of ISAKMP", __func__); + delete_states_by_connection(&rc); +- md->v1_st = NULL; ++ *stp = st = dst = md->v1_st = NULL; ++ return true; + } + } + } + } + } + +- return self_delete; +-} +- +-/* now it is safe to delete our sponsor */ +-void accept_self_delete(struct msg_digest *md) +-{ +- struct state *st = md->v1_st; +- +- /* note: this code is cloned from handling ISAKMP non-self_delete */ +- log_state(RC_LOG_SERIOUS, st, "received Delete SA payload: self-deleting ISAKMP State #%lu", +- st->st_serialno); +- if (nat_traversal_enabled && st->st_connection->ikev1_natt != NATT_NONE) { +- nat_traversal_change_port_lookup(md, st); +- v1_maybe_natify_initiator_endpoints(st, HERE); +- } +- delete_state(st); +- md->v1_st = st = NULL; ++ return true; + } +diff --show-c-function -Naur a/programs/pluto/ipsec_doi.h b/programs/pluto/ipsec_doi.h +--- a/programs/pluto/ipsec_doi.h 2022-05-24 10:23:22.000000000 -0700 ++++ b/programs/pluto/ipsec_doi.h 2023-08-28 16:03:33.198560283 -0700 +@@ -31,9 +31,9 @@ extern void ipsecdoi_replace(struct stat + + extern void init_phase2_iv(struct state *st, const msgid_t *msgid); + +-extern bool accept_delete(struct msg_digest *md, ++extern bool accept_delete(struct state **st, ++ struct msg_digest *md, + struct payload_digest *p); +-extern void accept_self_delete(struct msg_digest *md); + + extern stf_status send_isakmp_notification(struct state *st, + uint16_t type, const void *data, diff --git a/SPECS/libreswan/libreswan.spec b/SPECS/libreswan/libreswan.spec index 2f242e0072c..8c2143658de 100644 --- a/SPECS/libreswan/libreswan.spec +++ b/SPECS/libreswan/libreswan.spec @@ -26,7 +26,7 @@ Summary: Internet Key Exchange (IKEv1 and IKEv2) implementation for IPsec Name: libreswan Version: 4.7 -Release: 4%{?dist} +Release: 5%{?dist} License: GPLv2+ Vendor: Microsoft Corporation Distribution: Mariner @@ -36,6 +36,9 @@ Source0: https://github.com/libreswan/libreswan/archive/refs/tags/v%{vers Source3: https://download.libreswan.org/cavs/ikev1_dsa.fax.bz2 Source4: https://download.libreswan.org/cavs/ikev1_psk.fax.bz2 Source5: https://download.libreswan.org/cavs/ikev2.fax.bz2 +Patch0: CVE-2023-38710.patch +Patch1: CVE-2023-38711.patch +Patch2: CVE-2023-38712.patch BuildRequires: audit-libs-devel BuildRequires: bison @@ -193,6 +196,9 @@ certutil -N -d sql:$tmpdir --empty-password %doc %{_mandir}/*/* %changelog +* Mon Aug 28 2023 Henry Beberman - 4.7-5 +- Backport patches for CVE-2023-38710, CVE-2023-38711, CVE-2023-38712 + * Tue Oct 11 2022 Osama Esmail - 4.7-4 - Removed with_check macro From e476484dc61b59a46b66026dd0f7a365c6d8301c Mon Sep 17 00:00:00 2001 From: Henry Beberman Date: Tue, 29 Aug 2023 09:42:16 -0700 Subject: [PATCH 30/64] Fix CVE-2021-32292 in json-c (#6083) --- SPECS/json-c/CVE-2021-32292.patch | 24 ++++++++++++++++++++++++ SPECS/json-c/json-c.spec | 8 ++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 SPECS/json-c/CVE-2021-32292.patch diff --git a/SPECS/json-c/CVE-2021-32292.patch b/SPECS/json-c/CVE-2021-32292.patch new file mode 100644 index 00000000000..bfbdce69095 --- /dev/null +++ b/SPECS/json-c/CVE-2021-32292.patch @@ -0,0 +1,24 @@ +From 4e9e44e5258dee7654f74948b0dd5da39c28beec Mon Sep 17 00:00:00 2001 +From: Marc <34656315+MarcT512@users.noreply.github.com> +Date: Fri, 7 Aug 2020 10:49:45 +0100 +Subject: [PATCH] Fix read past end of buffer + +Resolves https://github.com/json-c/json-c/issues/654 +--- + apps/json_parse.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/apps/json_parse.c b/apps/json_parse.c +index bba4622183..72b31a860a 100644 +--- a/apps/json_parse.c ++++ b/apps/json_parse.c +@@ -82,7 +82,8 @@ static int parseit(int fd, int (*callback)(struct json_object *)) + int parse_end = json_tokener_get_parse_end(tok); + if (obj == NULL && jerr != json_tokener_continue) + { +- char *aterr = &buf[start_pos + parse_end]; ++ char *aterr = (start_pos + parse_end < sizeof(buf)) ? ++ &buf[start_pos + parse_end] : ""; + fflush(stdout); + int fail_offset = total_read - ret + start_pos + parse_end; + fprintf(stderr, "Failed at offset %d: %s %c\n", fail_offset, diff --git a/SPECS/json-c/json-c.spec b/SPECS/json-c/json-c.spec index 1b4870c9010..f584e417a2f 100644 --- a/SPECS/json-c/json-c.spec +++ b/SPECS/json-c/json-c.spec @@ -3,13 +3,14 @@ Summary: A JSON implementation in C Name: json-c Version: 0.15 -Release: 1%{?dist} +Release: 2%{?dist} License: MIT Group: System Environment/Base Vendor: Microsoft Corporation Distribution: Mariner URL: https://github.com/json-c/json-c Source0: %{url}/archive/%{name}-%{version}-%{publishdate}.tar.gz#/%{name}-%{version}.tar.gz +Patch0: CVE-2021-32292.patch BuildRequires: cmake @@ -25,7 +26,7 @@ The package contains libraries and header files for developing applications that use json-c. %prep -%setup -q -n %{name}-%{name}-%{version}-%{publishdate} +%autosetup -p1 -n %{name}-%{name}-%{version}-%{publishdate} %build mkdir build @@ -58,6 +59,9 @@ make %{?_smp_mflags} test %{_libdir}/pkgconfig/%{name}.pc %changelog +* Mon Aug 28 2023 Henry Beberman - 0.15-2 +- Patch CVE-2021-32292 + * Thu Feb 24 2022 Cameron Baird - 0.15-1 - Update source to v0.15 - Remove CVE-2020-12762.patch, Fix-CVE-2020-12762.patch (found in release source) From f0ef83110018771c2aea988087079efd54606e88 Mon Sep 17 00:00:00 2001 From: AZaugg Date: Tue, 29 Aug 2023 13:36:26 -0400 Subject: [PATCH 31/64] BugFix: httpd.conf log location incorrect (#6004) * BugFix: httpd.conf log location incorrect The default config.layout being used with Mariner is Apache, which points to non existent log directory. As a result the default httpd config provided with Mariner has an error in it, preventing httpd serivce from starting * Adding RuntimeDirectory to ensure httpd dir exists for pid file --- .../httpd/httpd-fix-apache-layout-log-path.patch | 15 +++++++++++++++ SPECS/httpd/httpd.spec | 11 +++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 SPECS/httpd/httpd-fix-apache-layout-log-path.patch diff --git a/SPECS/httpd/httpd-fix-apache-layout-log-path.patch b/SPECS/httpd/httpd-fix-apache-layout-log-path.patch new file mode 100644 index 00000000000..f2eb10fcff9 --- /dev/null +++ b/SPECS/httpd/httpd-fix-apache-layout-log-path.patch @@ -0,0 +1,15 @@ +diff --git a/config.layout b/config.layout +index a29351ef14..2a1a4c81ef 100644 +--- a/config.layout ++++ b/config.layout +@@ -28,8 +28,8 @@ + cgidir: ${datadir}/cgi-bin + includedir: ${prefix}/include + localstatedir: ${prefix} +- runtimedir: ${localstatedir}/logs +- logfiledir: ${localstatedir}/logs ++ runtimedir: ${localstatedir}/log ++ logfiledir: ${localstatedir}/log + proxycachedir: ${localstatedir}/proxy + + diff --git a/SPECS/httpd/httpd.spec b/SPECS/httpd/httpd.spec index 38bded38935..278fed0f52c 100644 --- a/SPECS/httpd/httpd.spec +++ b/SPECS/httpd/httpd.spec @@ -3,7 +3,7 @@ Summary: The Apache HTTP Server Name: httpd Version: 2.4.56 -Release: 1%{?dist} +Release: 2%{?dist} License: Apache-2.0 Vendor: Microsoft Corporation Distribution: Mariner @@ -24,6 +24,7 @@ Source10: httpd-ssl-gencerts # https://www.linuxfromscratch.org/patches/blfs/svn/httpd-2.4.56-blfs_layout-1.patch Patch0: httpd-2.4.53-blfs_layout-3.patch Patch1: httpd-uncomment-ServerName.patch +Patch2: httpd-fix-apache-layout-log-path.patch # CVE-1999-0236 must be mitigated by the user. See "Server Side Includes" at https://httpd.apache.org/docs/2.4/misc/security_tips.html Patch100: CVE-1999-0236.nopatch @@ -142,6 +143,7 @@ Security (TLS) protocols. %setup -q %patch0 -p1 %patch1 -p1 +%patch2 -p1 %build %configure \ @@ -205,7 +207,8 @@ After=network.target remote-fs.target nss-lookup.target [Service] Type=forking -PIDFile=%{_var}/run/httpd/httpd.pid +PIDFile=/run/httpd/httpd.pid +RuntimeDirectory=httpd ExecStart=%{_sbindir}/httpd -k start ExecStop=%{_sbindir}/httpd -k stop ExecReload=%{_sbindir}/httpd -k graceful @@ -342,6 +345,10 @@ fi %{_libexecdir}/httpd-ssl-pass-dialog %changelog +* Wed Aug 16 2023 Andy Zaugg - 2.4.56-1 +- Patch config.layout and provide and provide a real log path +- Fix PIDfile reference to /run/httpd/httpd.pid + * Tue Mar 14 2023 Thien Trung Vuong - 2.4.56-1 - Upgrade to version 2.4.56 - Fixes CVE-2023-27522, CVE-2023-25690 From b06683f273fc0e0a64343128ebc42cb533a534ef Mon Sep 17 00:00:00 2001 From: rlmenge Date: Tue, 29 Aug 2023 11:02:42 -0700 Subject: [PATCH 32/64] Nopatch CVE-2023-3439 as mctp is not enabled in CBL-Mariner (#6072) --- SPECS/hyperv-daemons/CVE-2023-3439.nopatch | 2 ++ SPECS/kernel/CVE-2023-3439.nopatch | 2 ++ toolkit/scripts/mariner-required-configs.json | 13 +++++++++++++ 3 files changed, 17 insertions(+) create mode 100644 SPECS/hyperv-daemons/CVE-2023-3439.nopatch create mode 100644 SPECS/kernel/CVE-2023-3439.nopatch diff --git a/SPECS/hyperv-daemons/CVE-2023-3439.nopatch b/SPECS/hyperv-daemons/CVE-2023-3439.nopatch new file mode 100644 index 00000000000..e037fcfb6d4 --- /dev/null +++ b/SPECS/hyperv-daemons/CVE-2023-3439.nopatch @@ -0,0 +1,2 @@ +CVE-2023-3439 - not applicable to CBL_Mariner because CONFIG_MCTP is not enabled +Upstream fix: b561275d633bcd8e0e8055ab86f1a13df75a0269 \ No newline at end of file diff --git a/SPECS/kernel/CVE-2023-3439.nopatch b/SPECS/kernel/CVE-2023-3439.nopatch new file mode 100644 index 00000000000..e037fcfb6d4 --- /dev/null +++ b/SPECS/kernel/CVE-2023-3439.nopatch @@ -0,0 +1,2 @@ +CVE-2023-3439 - not applicable to CBL_Mariner because CONFIG_MCTP is not enabled +Upstream fix: b561275d633bcd8e0e8055ab86f1a13df75a0269 \ No newline at end of file diff --git a/toolkit/scripts/mariner-required-configs.json b/toolkit/scripts/mariner-required-configs.json index 81a06425435..20c7c35e089 100644 --- a/toolkit/scripts/mariner-required-configs.json +++ b/toolkit/scripts/mariner-required-configs.json @@ -1101,6 +1101,19 @@ "PR": [ "https://github.com/microsoft/CBL-Mariner/pull/5972" ] + }, + "CONFIG_MCTP": { + "value": [ + "is not set" + ], + "arch": [ + "AMD64", + "ARM64" + ], + "comment": "Do not enable mctp unless fix for CVE-2023-3439 is present", + "PR": [ + "https://github.com/torvalds/linux/commit/b561275d633bcd8e0e8055ab86f1a13df75a0269" + ] } } } From 0ab6131aa6d464ce45e2a3d399ed0139e821a951 Mon Sep 17 00:00:00 2001 From: rlmenge Date: Tue, 29 Aug 2023 12:49:20 -0700 Subject: [PATCH 33/64] Nopatch CVE-2023-2007 for kernel (#6095) --- SPECS/kernel/CVE-2023-2007.nopatch | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 SPECS/kernel/CVE-2023-2007.nopatch diff --git a/SPECS/kernel/CVE-2023-2007.nopatch b/SPECS/kernel/CVE-2023-2007.nopatch new file mode 100644 index 00000000000..12fd9be6581 --- /dev/null +++ b/SPECS/kernel/CVE-2023-2007.nopatch @@ -0,0 +1,7 @@ +CVE-2023-2007 - patched in 5.15.116.1 +Note that upstream removes the SCSI_DPT_I2O driver. +The stable branches received new fixes as discussed here: +https://lore.kernel.org/stable/2023060702-anemic-grinch-0d3e@gregkh/T/ + +Upstream: b04e75a4a8a81887386a0d2dbf605a48e779d2a0 - removes SCSI_DPT_I2O driver +Stable: 7a20262fa9ee4f690eea359c7ec1227f9b9477bc - removes broken pass-through ioctl \ No newline at end of file From 90291788266d5fbb794a311635cad442d349171e Mon Sep 17 00:00:00 2001 From: Daniel McIlvaney Date: Tue, 29 Aug 2023 13:28:23 -0700 Subject: [PATCH 34/64] Remove dst file on failed network download (#6080) * Remove dst file on failed network download * Add file.RemoveFileIfExists() --- .../tools/graphpkgfetcher/graphpkgfetcher.go | 2 + toolkit/tools/internal/file/file.go | 11 +++++ toolkit/tools/internal/file/file_test.go | 45 +++++++++++++++++++ toolkit/tools/internal/network/network.go | 14 +++++- 4 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 toolkit/tools/internal/file/file_test.go diff --git a/toolkit/tools/graphpkgfetcher/graphpkgfetcher.go b/toolkit/tools/graphpkgfetcher/graphpkgfetcher.go index 06181a3e393..af3502c3f93 100644 --- a/toolkit/tools/graphpkgfetcher/graphpkgfetcher.go +++ b/toolkit/tools/graphpkgfetcher/graphpkgfetcher.go @@ -423,6 +423,8 @@ func downloadSingleDeltaRPM(realDependencyGraph *pkggraph.PkgGraph, buildNode *p logger.Log.Warnf("Can't find delta RPM to download for %s: %s (local copy may be newer than published version)", fullyQualifiedRpmName, err) return nil } + } else { + logger.Log.Debugf("Found pre-cached delta RPM for %s, skipping download", fullyQualifiedRpmName) } foundCacheRPM, err = file.PathExists(cachedRPMPath) diff --git a/toolkit/tools/internal/file/file.go b/toolkit/tools/internal/file/file.go index 30c235da52a..98d448e06b0 100644 --- a/toolkit/tools/internal/file/file.go +++ b/toolkit/tools/internal/file/file.go @@ -8,8 +8,10 @@ import ( "crypto/sha1" "crypto/sha256" "encoding/hex" + "errors" "fmt" "io" + "io/fs" "os" "path/filepath" @@ -160,6 +162,15 @@ func Append(data string, dst string) (err error) { return } +// RemoveFileIfExists will delete a file if it exists on disk. +func RemoveFileIfExists(path string) (err error) { + removeErr := os.Remove(path) + if removeErr != nil && !errors.Is(removeErr, fs.ErrNotExist) { + err = fmt.Errorf("failed to remove file (%s):\n%w", path, err) + } + return +} + // GenerateSHA1 calculates a sha1 of a file func GenerateSHA1(path string) (hash string, err error) { file, err := os.Open(path) diff --git a/toolkit/tools/internal/file/file_test.go b/toolkit/tools/internal/file/file_test.go new file mode 100644 index 00000000000..9f2ae9612cf --- /dev/null +++ b/toolkit/tools/internal/file/file_test.go @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +package file + +import ( + "os" + "path/filepath" + "testing" + + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/logger" + "github.com/stretchr/testify/assert" +) + +func TestMain(m *testing.M) { + logger.InitStderrLog() + retVal := m.Run() + os.Exit(retVal) +} + +// testFileName returns a file name in a temporary directory. This path will +// be different for EVERY call to this function. +func testFileName(t *testing.T) string { + return filepath.Join(t.TempDir(), t.Name()) +} + +func TestRemoveFileIfExistsValid(t *testing.T) { + fileName := testFileName(t) + // Create a file to remove + err := Write("test", fileName) + assert.NoError(t, err) + + err = RemoveFileIfExists(fileName) + assert.NoError(t, err) + + exists, err := PathExists(fileName) + assert.NoError(t, err) + assert.False(t, exists) +} + +func TestRemoveFileDoesNotExist(t *testing.T) { + fileName := testFileName(t) + err := RemoveFileIfExists(fileName) + assert.NoError(t, err) +} diff --git a/toolkit/tools/internal/network/network.go b/toolkit/tools/internal/network/network.go index d74aa04d855..1376e1c3bdd 100644 --- a/toolkit/tools/internal/network/network.go +++ b/toolkit/tools/internal/network/network.go @@ -13,6 +13,7 @@ import ( "strings" "time" + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/file" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/logger" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/retry" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/shell" @@ -30,7 +31,7 @@ func JoinURL(baseURL string, extraPaths ...string) string { return fmt.Sprintf("%s%s%s", baseURL, urlPathSeparator, appendToBase) } -// DownloadFile downloads `url` into `dst`. `caCerts` may be nil. +// DownloadFile downloads `url` into `dst`. `caCerts` may be nil. If there is an error `dst` will be removed. func DownloadFile(url, dst string, caCerts *x509.CertPool, tlsCerts []tls.Certificate) (err error) { logger.Log.Debugf("Downloading (%s) -> (%s)", url, dst) @@ -38,7 +39,16 @@ func DownloadFile(url, dst string, caCerts *x509.CertPool, tlsCerts []tls.Certif if err != nil { return } - defer dstFile.Close() + defer func() { + // If there was an error, ensure that the file is removed + if err != nil { + cleanupErr := file.RemoveFileIfExists(dst) + if cleanupErr != nil { + logger.Log.Errorf("Failed to remove failed network download file '%s': %s", dst, err) + } + } + dstFile.Close() + }() tlsConfig := &tls.Config{ RootCAs: caCerts, From 2f80bc3f0563b3270e64ff810e29e116e1e64a7c Mon Sep 17 00:00:00 2001 From: Daniel McIlvaney Date: Tue, 29 Aug 2023 13:30:01 -0700 Subject: [PATCH 35/64] Make precache also use new backoff (#6042) * Make precache also use new backoff --- toolkit/tools/precacher/precacher.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/toolkit/tools/precacher/precacher.go b/toolkit/tools/precacher/precacher.go index 691b5a29322..f81cbe3e04f 100644 --- a/toolkit/tools/precacher/precacher.go +++ b/toolkit/tools/precacher/precacher.go @@ -353,9 +353,13 @@ func monitorProgress(total int, results chan downloadResult, doneChannel chan st // network operations semaphore to minimize the time spent holding it. func precachePackage(pkg *repocloner.RepoPackage, packagesAvailableFromRepos map[string]string, outDir string, wg *sync.WaitGroup, results chan<- downloadResult, netOpsSemaphore chan struct{}) { const ( - downloadRetryAttempts = 2 + // With 5 attempts, initial delay of 1 second, and a backoff factor of 2.0 the total time spent retrying will be + // ~30 seconds. + downloadRetryAttempts = 5 + failureBackoffBase = 2.0 downloadRetryDuration = time.Second ) + var noCancel chan struct{} = nil // File names are of the form "-...rpm" pkgName, fileName := formatName(pkg) @@ -396,13 +400,13 @@ func precachePackage(pkg *repocloner.RepoPackage, packagesAvailableFromRepos map }() logger.Log.Debugf("Pre-caching '%s' from '%s'", fileName, url) - err = retry.Run(func() error { + _, err = retry.RunWithExpBackoff(func() error { err := network.DownloadFile(url, fullFilePath, nil, nil) if err != nil { logger.Log.Warnf("Attempt to download (%s) failed. Error: %s", url, err) } return err - }, downloadRetryAttempts, downloadRetryDuration) + }, downloadRetryAttempts, downloadRetryDuration, failureBackoffBase, noCancel) if err != nil { return } From 41accd143600fb7509c58dc02e1a0a4ab1a8ab64 Mon Sep 17 00:00:00 2001 From: Minghe Ren Date: Tue, 29 Aug 2023 13:54:56 -0700 Subject: [PATCH 36/64] make cloud-init-output.log available to serial console (#6051) Co-authored-by: minghe --- SPECS/cloud-init/cloud-init.spec | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/SPECS/cloud-init/cloud-init.spec b/SPECS/cloud-init/cloud-init.spec index 2223fa00ccb..0727d30b43d 100644 --- a/SPECS/cloud-init/cloud-init.spec +++ b/SPECS/cloud-init/cloud-init.spec @@ -1,7 +1,7 @@ Summary: Cloud instance init scripts Name: cloud-init Version: 23.2 -Release: 2%{?dist} +Release: 3%{?dist} License: GPLv3 Vendor: Microsoft Corporation Distribution: Mariner @@ -74,8 +74,6 @@ Cloud-init configuration for Hyper-V telemetry %prep %autosetup -p1 -n %{name}-%{version} -find systemd -name "cloud*.service*" | xargs sed -i s/StandardOutput=journal+console/StandardOutput=journal/g - %build python3 setup.py build @@ -145,6 +143,9 @@ make check %{?_smp_mflags} %config(noreplace) %{_sysconfdir}/cloud/cloud.cfg.d/10-azure-kvp.cfg %changelog +* Thu Aug 24 2023 Minghe Ren - 23.2-3 +- Remove the line prohibits cloud-init log dumping to serial console + * Fri Aug 11 2023 Minghe Ren - 23.2-2 - Add patch for unit test failure From 5d31d3aba0525d0c922785aa3793c2b83eb55c80 Mon Sep 17 00:00:00 2001 From: Andrew Phelps Date: Tue, 29 Aug 2023 15:40:55 -0700 Subject: [PATCH 37/64] qt5-qtsvg: rebuild with qt5-qtbase fix for CVE-2023-37369 (#6089) * bump qt5-qtsvg release * lint spec * modify linting --- SPECS/qt5-qtsvg/qt5-qtsvg.spec | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/SPECS/qt5-qtsvg/qt5-qtsvg.spec b/SPECS/qt5-qtsvg/qt5-qtsvg.spec index 479b98e89fd..917754b6a8e 100644 --- a/SPECS/qt5-qtsvg/qt5-qtsvg.spec +++ b/SPECS/qt5-qtsvg/qt5-qtsvg.spec @@ -3,9 +3,9 @@ Summary: Qt5 - Support for rendering and displaying SVG Name: qt5-qtsvg Version: 5.12.11 -Release: 5%{?dist} +Release: 6%{?dist} # See LICENSE.GPL3-EXCEPT.txt, for exception details -License: GFDL AND GPLv2+ with exceptions AND LGPLv2.1+ +License: GFDL AND GPLv2+ WITH exceptions AND LGPLv2.1+ Vendor: Microsoft Corporation Distribution: Mariner URL: https://www.qt.io @@ -16,13 +16,11 @@ Patch101: CVE-2018-21035.nopatch # Vulnerability is limited to the Windows OS. Patch102: CVE-2022-25634.nopatch Patch103: CVE-2023-32573.patch - +%{?_qt5:Requires: %{_qt5}%{?_isa} = %{_qt5_version}} BuildRequires: qt5-qtbase-devel >= %{version} BuildRequires: qt5-qtbase-private-devel BuildRequires: zlib-devel -%{?_qt5:Requires: %{_qt5}%{?_isa} = %{_qt5_version}} - %description Scalable Vector Graphics (SVG) is an XML-based language for describing two-dimensional vector graphics. Qt provides classes for rendering and @@ -86,6 +84,10 @@ popd %{_qt5_examplesdir}/ %changelog +* Mon Aug 28 2023 Andrew Phelps - 5.12.11-6 +- Bump release to rebuild with qt5-qtbase >= 5.12.11-9, which contains fix for CVE-2023-37369 +- Lint spec. + * Fri May 26 2023 Thien Trung Vuong - 5.12.11-5 - Add patch for CVE-2023-32573 From 271a0a4f43bc8481925b9d222c37b2e989fd720c Mon Sep 17 00:00:00 2001 From: Archana Choudhary <36061892+arc9693@users.noreply.github.com> Date: Wed, 30 Aug 2023 18:00:52 +0530 Subject: [PATCH 38/64] Add ogdi package to SPECS-EXTENDED (#6061) * Adds package ogdi * Adds license info * Update cgmanifest * Update Source1 URL --- SPECS-EXTENDED/ogdi/ogdi-4.1.0-sailer.patch | 33 +++ SPECS-EXTENDED/ogdi/ogdi.pdf | Bin 0 -> 1344962 bytes SPECS-EXTENDED/ogdi/ogdi.signatures.json | 6 + SPECS-EXTENDED/ogdi/ogdi.spec | 199 ++++++++++++++++++ SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md | 2 +- SPECS/LICENSES-AND-NOTICES/data/licenses.json | 1 + cgmanifest.json | 10 + 7 files changed, 250 insertions(+), 1 deletion(-) create mode 100644 SPECS-EXTENDED/ogdi/ogdi-4.1.0-sailer.patch create mode 100644 SPECS-EXTENDED/ogdi/ogdi.pdf create mode 100644 SPECS-EXTENDED/ogdi/ogdi.signatures.json create mode 100644 SPECS-EXTENDED/ogdi/ogdi.spec diff --git a/SPECS-EXTENDED/ogdi/ogdi-4.1.0-sailer.patch b/SPECS-EXTENDED/ogdi/ogdi-4.1.0-sailer.patch new file mode 100644 index 00000000000..0bdd75b1f05 --- /dev/null +++ b/SPECS-EXTENDED/ogdi/ogdi-4.1.0-sailer.patch @@ -0,0 +1,33 @@ +--- a/contrib/gdal/gdalbridge.c.orig 2017-07-13 20:51:22.011367003 +0200 ++++ b/contrib/gdal/gdalbridge.c 2017-07-13 20:52:07.545483445 +0200 +@@ -124,7 +124,7 @@ + + if( pfnTest == NULL ) + { +- sprintf( szPath, papszSOFilenames[iSOFile] ); ++ strcpy( szPath, papszSOFilenames[iSOFile] ); + pfnTest = GBGetSymbol( szPath, "GDALOpen" ); + } + } +--- a/ogdi/driver/vrf/feature.c.sailer 2007-05-09 22:46:28.000000000 +0200 ++++ b/ogdi/driver/vrf/feature.c 2017-07-13 21:01:57.790235052 +0200 +@@ -1385,7 +1385,8 @@ + return NULL; + } + strcat(returnString,"{ "); +- strcat(returnString,ptr1); ++ if (ptr1) ++ strcat(returnString,ptr1); + strcat(returnString," } "); + free(ptr1); + } +@@ -1414,7 +1415,8 @@ + return NULL; + } + strcat(returnString,"{ "); +- strcat(returnString,ptr1); ++ if (ptr1) ++ strcat(returnString,ptr1); + strcat(returnString," } "); + free(ptr1); + } diff --git a/SPECS-EXTENDED/ogdi/ogdi.pdf b/SPECS-EXTENDED/ogdi/ogdi.pdf new file mode 100644 index 0000000000000000000000000000000000000000..59e8919b824a7f9126d92bc755113b08f446354a GIT binary patch literal 1344962 zcmagFWl$W=_x`;&EE?S1-60U%T^Dy)+&x%uCkYTdxVtYF2=4Cg?h@So`TpKLRjKE$ znioB%`ZL{g^);tP&d{hzO0#gVa-srhws$6GP=TD}?Bq^nwy3~QpHP8plH~dve*@~| zY&yDn7XR0s>%TY-KF)t}-2cV#a{qHYp8w?jJx|{M z1I(S`Tn^a|7jdfey)Fl z|LGh~-jDwRIsel+oIE`L1pm`HoZKA$1pm`HoSgp@hx7mI9L>+p;J+D4#mp9L?*2Dx zX?U2q|6fSX!PE-;H=u0l@VA4U1IORCwvC0mH8~eI|KGMO*v87*ot%@8_wSCljk}vF z*j2*G!P&_X?C4JZzaA1!_D-%E&Zg#Ia?by`PW^985$tI7_Yj<%{2Y9LccpFY-NCNp zY|{3o?qEre-P~QlrVgk;*{IW$H5H;If_^8)+q$kbYcDs6Zp}BD1SQwT z6O-pJor~TxH5qH?sizM4SIx=I)`jPUyeNyJIYIO;F1w*=;(_CxtNRjeJY0rhA z`%LjqS@%D=xbS(Gji~)X@hq6_mv*wVZ+=bO?2la$PyBED1?J_wdj@{pws)#}^|RAV zU%oiu*Q;;5@;kN!OLh}%T$F!gtZ#$}@Mw{$Q42?FE-hcg2%Oe8w%pmfG6w>^fK;y` zG;)MC_C2TfwpB_f_#_1TvNUqZF@;^nJv1}7$re%pZ0ZX%Mx;#l3*-CC$GtjmIz|Tud*bh%svb-32E;267EWok zc=$1Cm>KDCn^^KKkx(NG*Nq|p~|YJ9*JPX-~xR|JtzK7Ig^m>Tc`mjnW-@MIAO{J zV!HxQ2p~YiIXn(`d^J>$My6jihinCz-J)Oyx@Km7kxGc^)zVfRa6tk&mg9=^@N4D( zC8+H;m}IAaK028JpI=?jhD8lCOKKYAon)e4L*`m&X0{;mpOWN3H!=%dW*?X?X-T(O zaew$F9p8oEvDVH-xeEU%zYYTy%(dXmNRUad>lFFA$K#@el9% z5Eu;9wdwj_48v@a7LQl!2$-2N+R7YZ8@NjfXPcy67x)Z?+;`S=B>7pR%obv$&s zx3$Z;f^@qK!_>z{tjmk!yl`^m^U9>K03(27jX1GANOWA#cRzPX(>-Gv9U`P90g7+B$|FFr|d8WEJe%k9u%LP@v&yVc(?jd$yx5^LQ3E-laiv zrzLz`3FSro!#!dMsupRxWi$;ST9D^k7nDv7rFx<2E9_=yDy8=Ij!{lsyU$r+96Fzp z$#Zso)yf&_ASk~_UR7JJmJ!sYRSL!btBP{oM4zM7ES^S(1R-WoxyJq%6CT5gli~=u zdq!LyC5UKW4Yj!!;0W3^0Ws)kcWIr4kDvl>7?l96%JGCjP?Jhw49t=^g{^KKVEf-% zJZs`dZ}f6B-FGEOc&>BQ_@Y@KXy8TdJxEalX#h;lfvQ#0Jed+6_RxNwo_AS}C9*$U z);OvUv+YKmf0r$Q#%QI?F&5Kh7&e2UKDF^kAD2~wT675UTah(MvH&l@90bKQt*sBU zb*3ftONvFv`}c;Wn%ZT8f_6MGRqwY;RXbxR13w*YhgtvL?%E2^B|#yGQi0xj5JS@{FfoxOl1!bFsc*X!sLV47V=fL z$9D7BM_ocwiqlJYIJ0uT5l&+eu(Z4{$XO3{k1?dBEd0(k)P4@4iBsZ91tPQcRxgc( ztk@j!AKMJEBPC$1U%`XMJuLTN(loH zL@SoeP>TgE+X|Ne9{qBEztgb;W>AYktySU>Lfi5HxWy?zy3rlpqGxg2%#otk(@2e4 zL7ihWZ_Vf4#XF!{Z55H2s`W4aL3_Szkqlxsra{eIoE(6MN5Bx}>&%`Wjbfv!-rUk# z@rTZ9{m$`@=$o8!P-Y-k;?Uh~)KCHapFb9yYl54tEY8L}*_S!a@)&lE{4-AmMvSav zi}MP{$CdIQFAf+J08d{^gbiv4NtMdKR%`a~0c^|vY{Zn6>HiUY2y2y>MqY%Tb*EjK zp^9!PNIk?3Qx?MxMcYywEm0w?_`*p!!NTEkzKZtA9K^CBawI^Ou zRcFvRox^+d1l8GXxyQy7@WR7G;N;|FXBX4Zl=*c-cUHfVkTj%z%pxo_bu`M%iV{jQ zh#?bp6;Bvxb9}kdxgA-tX~UD+QWF^^CA8)drg0Q;uC}fsGzMpO?igBEt5O{m#B|1h zu0>rMEz5(MQG^vEwY(j(zJ7(Im$Wj5(nv=Kt;tIw4lNTZhcVybKEr_H>p;)yt*xWl zyc$0kZ#nhK) z>#DTb{Q9tiCH{*0z<@PWCusC`&ej7zNvYka9L&Eu3)9|*TlFX=HaIsFGDd`tZExRx zL3TXf&$wGQ`4|D76A_&`u4+A&0T}uY?=Th~FQUbi&u2npnI)6r3v-axR_@LpU}t1h zd|RJqG|qwp%?ed{B#JM@zXCUJ9de003y6G57e3Md3HYGY$w@__7%!~|8C^fHuc}o3 zsvSNBz)shS!6_+6E|O@JkH+x=j8y|f8w;yi#cFJQhOiuwITwXJU5KD%)+7 zk7}P|MJJ)P75gtq;YkrPaD^l)za;F7q2OxaSNVTssh`M?N(b66q*&0Xgmgboo$*Qr zX46Ucc;MJKay#!(%z|voA!JaIT3&OY5Td}d^H`8l`K#pUL8LH74;dNvTmSi4{L3o_ zyggP+YqZXh%cU_{6$+=^+Bagu_j9jwy}&0aGGf?rDlsJjxH-E z40&Jl3Zvi`=UopfdaXY%MDSj7$v{z&%~vdkQNX1Na{wJ_goFE$`m@cdy}?*Kfm4e6 z87t!ew@$E*_Ey~L{3pdLJ?Z40GquJV=hvLeG*NeCv98y8GVFDhrLnpM^ae&eMw*iH zqNubi0l}ppL74o4bPMr4)gA$gFD}1qi{_uTy zZ{*Z`u&I|Nq>18l>Zg>cMvs2pBq)#Yt?QgiR9#E>cz3x3_^7Q8yEVsQd?@U+Sy0aK zaoL!C($9AcjgWIjcaVV=D~??!k0z9n+MF_1aXU#yR?sb)Tq75SN5d@aaN8QX* zVv_-TSBY64XBg&DHe^EB6))nO7E-?y_$)ScW?iM$w)+4VG23*0m&^9yw2rQ`tX`d{ zH%1jlUobL7g1lek^uh+*LD__M~E#0y*7-rH;-e^pG=Q&ODFi(WDw z-E-Bc4823t_MEm28VM0kPo<%lF!D}u-GaINzVa%vK62g^#e}+}6x&e$U4yKJ<>}{fx2*g7K$mvS6;aVeq_u(^3=sp`g{-^&oU?_{ z7p%~vhUMf2Mgaf>zq(6Esv>Pp-Vy`%Kx!bN8nLaxPy1&kh`7gZpi>EgCNU$zLJTeNGW|ETv`lzz z@x(7KYbD!&)q|zcA1byVje11&G`0AK2j4~CFFCkd4Dq6qz(@yLwyYTv+aHB;7e2W{ z-=39wFLaj&-F`*<*2C*2lQ)KBzqCuRIO>0&FUZ6pL9XMpg=y&dj6`OK^YJX%1kD4-Ej-3goTV#hoR`%D zE6wHeN5Mu5J@<4M2R2uSiT5g7&QKjYbyfTpNOjPMjty6vczZ5b0Q{zh2N}4uRSZ*# zZAM#D*+#j!)=_PSun4U0NaPOoreH^(UK_4=(b99~+y=IfvmRA|P=|63-^2ncrvhzg z#Z8~Fs?J(I_tYHyuI|x2i_1@|Oh}3#O-jC0Wgh?%nMgIQ)|#2?G%9Jd6TRmyiH41@<(vt`kViB(fQS~d8WI?}FQp0cCE#nsg`-^p-{x@W%n z`bB&{0RY?M(d#opSBs)V^}oq$)e5%!Zm0oH1rj9w>J6H5{5F}n%D_Nj<& zZHvb;^kv9vl`Z{)mgR4W;-VsS;?%74pNG$V_Rach1#XcGt8J(umMj9Ci1{4~RKu=@ zk%nzSrNQDM^UnQ1mzK?H@GX@9CaG4ft zzeRjkaf$u>(hgTeyYwlQKQKrxXqJ9-+=4_%!i(m4zVXuqisCZ7>`4R+FNLK$p*I@J zr#~!>Kbr>+mb3a`&fwZ$w1>iEG0ri2(Pa!CZb!_CyT95L+f?;tDkvcVspjsi#91l6 zlv+G8u79-zT@|^YsKs`N^~qqHb@UX@elXdSqDzk_<2at_=K%gQl7=y)GHT) z8ae3|R+4g+%C|k+bY&oJEbvH0P+kQ>w8{Rbd-q@l{r+=Pz(G=JwsChq{=><7~OsrI`L zh;G5tuYA5biKIA%*9`#ljNVUssR%^dum~J@u#**-=9`N7|2+jLe-p;`ao{X>Y;-Ip zBeJHx{*R@g_|9HbiPH$-46jnWKK34t1JqlGX<_>Nu7*!7Qu+of$QM@?09A71Ph=rZ zULDlC$67>JvH@33r4&5HUypyN>FQ}ig_2a1ErM8XLCa31}RRvk>WzS(E+#L1kLd+H!xh6dg}3k-E!-R z(PK-raSLTjivZIr&W=wL9^|AmlXL!igAjBM`I4XWS5nWlB1}xi1ORNKKQy7BlOM|W z?!tf!dUUukRrZfhuVL8TIjdnV7i0yG*2Fz1qFY=TWh}-bHpNuY3dmWFhRv`sL}w0$ zhh;g{C-#FnsWmeUKm0Pxo%IXC0*h8_7(xlTrsH<#sl4e$a{)us_o)H1I2}TzGp4kS z?So=l{DHwCABmwu{o|J31h%g)MWzdKHb+cp+xZ;`1R6l7KRmuq2R9gm{y_}!oeAgI z@wp~;ZLOS?HHot&b083tG^O*+WQIjF9alwE@Y~Yow<1v8T+Uj^37o8UEtC`92^3U! z*r@nEchOYhRN5@3g4w+$FaZPmE?VmF@)B;yUJbj2G?PRat)>-Rg3IGMG4qq!<(e1x z>YLH1{-#P-el|UXjU6tLI*VJ^Qen#^mfQJF)z2fXA`Ye-fIa9iVG}c7PnB81XH5>! zsk4kv=A8mT{e)Io_6v9Ug6)LtpbuUp%$SF76bDr{)qXmY{-4=vZg0n z7Gf03m3QM0XkE1z26vE@HVAIKWL7+@lBP08Q6Z!a8Q9h4SCvsI_EiXG5H6VZ$KhJ< z;4DA2nO#d=hL)v|XqS{3Xs>?P!e{7XzM`hb-v*o(R+>cjeY~tpxZ1jM1JaX+dT3?r zau8VxQi1M&hgP)kj~)gogsNk;s+W2jMb9U7V3aX=nb&PKV<+~gAM0=4u8kV|@}bwc zs_DN(yv|*>i7h6*p$PBx*c%;~wj2O|{Bq#8;fVQqV|o|g|3Vz`#V+9sM<+>PouJ@v z4A;`QP^sU|v7rPSZ0d;j5zyGt`m!#ISD$)!DeuWyz})nloj>e%Q#CY9^;aQHdiN%d zMdNX}cr^4V0#L&eVSOq4w`E^2i*)0&6M%SJqw>=<*wvRbIx>HqrlCQqvinady z8uS6(EioFQOinP1glPzewdSq>RM*_n!{GWKYA*%bG#8fHxYnJr?3P|XU)L|H59c+` z&5o-ei8n0L=7SG9u$q`uP4h-|A)2NF zIJ$0!#VfrNg=U;_pHIcV&N4fHAs4xgwQq+>)YpBH?}c5f!zof03(C&hMWa~w5~$jF z&93gjmbkalVckyYNY~=9V94(LZHXEKGIq##QcTh zB4`(QV3HD{MbVm5IZU3$k>+CevB*JyviEIHQd)q0Hu+#XM+4IpQIMy&JmB0|E@I_Q6NDEbW%N1T z?zy;boUC1XPyl9i>gkS0bdhW0)>#53N~5Im3}vs{J&gfdV`8nmhQE^hY6kUqgY1ER z6895wUNWkIC6CPK+&oi-@08LCbQ*|m_oS8zKQWbw(v8l_381mZkMaU5_=d(@9y||_ z>#jT97zXdu9iZS58s~yWlE7#kpH_GA2(-jD)4A)PojQeO{E?5lzo3rPowoG>i2^}x z5+AN&C$+ekM=qYl&H8Dfn$C1J7A#64AvgJx5OUW&-k)=5cJ28%_p}t*_47o6(}4+? z0WpxESWHjikWVmSTBu{ZgD>P&7t4^a5s1Tpi^0MBuaq@6tObJpvrU(CXw2r#)xr6q zCz}Y8skD5ff`5wS=xdJ%xj~d<5GTdbjp2{_b4G8OR!N5nOeW)}DY{ zq;$ewf9EKEskm{IgMbYe$RYjTyX!Y6ljWDRDZ087d`8){o5VPkr@}~}^7YCv~V(oYP z)&S%<c`xOQu41aB0+EE^iF>kmLP`y8q z#1NXc+5|)V`L3XHV}Jr>AMrE0;Alf!AcQ3(zJlyF?7_R!*wM$X1z9tlREh>QGQNR?89sbXQs#V0SFE&_Tpk_g9ilkpV;?=V zYb#SnTtQGB6w%=ue5rZp98k0lF=6qU3LJ!u${MuACuHF;ZC3kUg!AAQXW9)7#pg{1 zjjbigm8jeCP!poGpl6sSOPi?p851JF{Xuui(`VcG;{9rONW}lL&8yGG@B4&RcD?C5 z$i=Dr?_Kj*q>(2qePYMfnjS$Fm4^fPct#BcPJQgK9@1M2W;Zm4C zRB8LCyMa}Yo{|bRI+^g#Pg(LvU=14*EV110Q#B4={_T1UI5C(|d%R<0x=Kqo;EN1LdI4JImecW+>c+}HabUuJva{OQr()#hSo zq2LDo9;Tf}dBP}}>4A5c385O@xmOSbddqsLmEiuc`Sr5q=aizD8t8ll+nXm%kwira zq63trli5R2jKcjbJ!&-1#R2z-B3x}aSnkDl$bM4REK+8RCfZfUyJ{*t8vX?-WKQy+ z(Btc>WhicHb9C(q-lHYG(dKq|o>;=|T9gG72a#d94G>9RcZQ?X%Nm*6K^!%dot28N z8Smye={2xsVdnUcIT1xH9vA-_ciLUINtWRPZ*+Z34bGWmP57b3wE%UK+jnQFAi+!& zE*HzysQsJY5=-3ixJFE-p_x&e^@P@h0u7?n;tOp>Wp2;V!207^n3x8mh5epW02D>} zS)h~7ic}W0+E4HYmrqKFt z`DDEj2jb&4&?jL!=t0#uXiobUWN&*=|9tpGaneN=B8 zo^cY%P9J`E6M@DP-QxVnULfS`;EQE0O~meiJAiQk!!DTfY5<*FC_z!;Zy2$5nACP3K+47PcXtrMU@L1dYc> z%3H=lN<^r2gaO?rZt6ZZiDk;{hF$d-@A8!-LQ^SDg_!C>IRQ&i^-no=2zOus+)O%2 zf&b1gH&ahuL9WEH@m)*jHO*>G9eQ`S_HcNey5Z)JamaH6gyZMS*9%h-Fj7|5KqPG< zR4xpC`cRpX-DG2XgrljH|vet^T30Q1)=UjDH^~1P1n5LO)h2Ry7 zUVY&vQ3JbBhKP9*4m;K_S`QPI%rfGuOEIFd>3NdkyF%m!8mc*S-KB)&zo=2AOUf`1 z$(a^;V8Z9(>Kt`v8_qaiACFpETAN3kx$OFdx$Bv1-?{_>p_ew)ObwJS7E96{ko`lH zy$g_`lP0-k7NcaGQ6psVlrZq&A%=Ryz_4!YHei@qiBdYI0)4zUlphn{?gzhbhVw{W zn7UCVQUt$%j&LSCvdK$x%ER4H576-*Swtyig10#hcNHf+r)Yt};Dq^;<~+ndD6FQa zi+vDEhvyHRFc%@wOq?mQ#NQ&iw^Zp#p$&K7P>|ILBkj1@bFr0x12U8n(RGrdT|3JH z$zV~&!QF&fnz$I-Aj7CCSuFF z#9mX}CVc}ejK1k^Zuim-{-w}5xH?gmxaMS&A4q6(jfz5FA)n^U02agG{8+8Va-MBa zm8}982J0*lnVj*FPlQZy^`%&I<=nDcMZ*@ifn}u;b#cE2qp8|30(%+_F>%1chF`1! zb#>EBv+AoP@bm=%Wz@n5cIMdiRA{$^a|$(2dw~c)tf7qYsKOegn&dNQQ*O6IN|u=^ zWq4FpEG|rkqcG7XG#W5owj{&r4J{LVsB6;CnV`hPwMlr0w5*lD`O`6s5$)r6bm$SI zS>UmtI=$b`W#8>@|Lds;D^{?HUr-iLGifi+Fe)2PQs|Dc+h^#>sYX2UKfJ=@V`CF@ zNm4E!uvvS5Oz${8d-|e@LLso8w`2i@UjeTw08%;Ak+RAu-Z~K-f zCk91UwM>RlHDP@nec^lOycwJYr9}B1u%6#X(X7gJ2&`2|>3Fz4U#m7<`~Br$T)XKv z=JvReJUtg2ft6KQvm5G9_WS@`rYhYv zv{f>wZc_bA?@@uTk6Nm20ezl+v$Ho%P3_0(#+NhiH%5+1N)@{Jcbe;?tksITThI!5 zk7A{#*;{Of2IM)ke<)ZOVc}4g2dM3@;A=HnWSwcl{?OiQB$XFPF~gNX4~=Hk+0H+q zWsXBlrU98!xf2S02Ryy5-&QF!5p!|{-5tkKxb|F>vsvEX-{m6endlE{K)fq$2K$s- zx<&l7?nU6JE6M-ldvHUK$Y;!Y*_)v}nCS_xe4ITS3<+i)mO=q4^+R+!mP0P4=Q6Mg z&EPC2E*qIreBWF@sz+3@Y_a%x9?QMHnmTuB{#>Mgql>t? zo?GTsZgejp^A0omCh(KOK36l(ATbA=smN<#=qD_eu|z-h_D~dcOosxj$o{^L1_S!! zPPjHg(dDu|i|#Db*4F^GK&Tfgx%>8-V;|+H+rcv+1~HY?_sqCSRPjm^wR1yH9_o5G zZ_U(F=WKSBQ-En;ywNk{qn1-Jl2miRXDfH3VF!H6lGD91o)2QV$-4-GuuK<*V zFnPKyp=7*}HQD`iCA8k5iDcu&_j8|4$GFcXL{U;spB`r~c`b2xGAe_-+llIvub=R& zYVJ12ys5h0wCVLM5fvLvAbGSlw!4(U!8EoR)bx{=UxMA+rAZDLC?s*S>rEl0C4AE~)P@i;d(i9Kn6;F=f!N>G?(^i7}?!@gt4t!8RX&*Az7 zl@`nu51m4fs}ni~Yl&3d%n|ZejNuD)^L(a*X##P}{k>j8%^Y^en9;?$&Uov2L5?s* zpn(r&SM=xp7&h3NjEJ+qNFqe>Qq3ZyF5kjHUhL0XfqaGIVwN_U4**o-$m9Z80sg?` z*nyq+$a;P|g8D{Jw46z0MPMyUlmi&gyWrfFCf)p8My*iez zb7L))KE57GVcu27zttmkqgv89^xTYx`IeR0r5!QoS~=SQZF$5JvR_?4fy1@~mrNAj|8Rj0@^^q%O$|=-Tu1 z^KI^>w#Wt$L=5v^!BvO|$2;6Zd4Xb5uthH&Q-_&!0b&g|i5d)Hxjc&RUu%uv>*hq8 z^k@U1#!mI+xxG5E*y$UZDOKafq}#u`XO4xEV~BJ@&!frWt_CiO#T0Jart|ATpk-~p zksbg6n3Gi+Rn!y@aiiP*aEEnq$4zcPvC0~js}XC89wEi94nFs+Zoj4JTt(haEC4Gy zFkkX{hwX1Q7JnMgug$`SNDl5}lfKR-&8JO(`gN#@Se<0OVMG8!xh(VJ)6PhQEi3xR zWJWxw>fbxoYLH#=(rCpv9^#yeOCftgJ^1mh*5Xm0gE?{e8Sr2E9xe7&z??X&b!#M_ zRoSI%%8gvsvRZCKJEg1uzXqGsX+fo(hJYF+wnfKHYdWR$y4;fbWYl9x2pkzJ4=kaB z>5c}{QF;Mud2}eY5jLNZC`*Y+=dsZCe$_!{_g%%yq>V`Ww8aMIXwDj^_V=L50>Fyx zj&-l|P2R(Gc9MMiR5h0T0?aM%F=`VUdJ`I4^sQeV-AiU1TpBz{Gycl>o}1wwt}Idh z*BbHBWOtm8m6n)f#3rquenSy;%LU%|p0oan%)95`%j|$7$&N^3-5VJ=>!iCMVdlo!$?p}{S|JxbOBdWlR?;SQuX{j&oUV2K6or(!e0$a34_{~d zo@WIT#r~*>JBTQ3nAw@cMjx7%*I{@tRsO&AC=7e!y@L42F-P)VkftD*|D`jX% z53r<}N-+pOj?-FHuGUpb8tZf1C}l&iy=$VHqwNu`^D5#lu#4}v(~n{+L6arAiK$JF zZj0o;%A?60%I-18>8^H|e_3th#qoVs4&O8+>dV(-3wdntoQcSu`DQt5c#i#T_u@%1>C zP_~&jkwt^GQJ;92`35Pko#zAAq$Uw+HIax9@;#CeL26}WyWvcMPzSKNbS50mIL(Q( z*;lLDkwLFM1It>T+yYfM{kO4X4~fHHQ`s^sx|EhK%{hFl`o$~KB%qidGPfkZ9ni$W zqeLTKCr}$|5Ts~jr`Ys4xeMj{+2W$)stY4)_C+{olUfE{J+y+^ZnNc+fQ6+ZmXPQD z1;Xwa0$iI+6JUnZ1Xv&!i@0$52GWl-7Ugj9PX7i+0{d z*r&1o8b>ckZisW~=|jpbrx{RTae#LFcgpZ>tH=f_Y+GQH*YZtbj*e1F7j0aVjQz%J z5y&E={+&Bk+ZP}I>)-capP;tVnfL2r6<(nhY4f`em)>M(TjBU-IzJZ|71QOqSZ|+- z`Ifxj%@6F|@}S`j>GJZxIwIKxAX3#!jMrtYqXjJi(NJr8CY-x-rc(%GYcYFiCCg7} z$66|_Y#qBP675%5;`8U_Fr^DE9s#O)n+yk6tLf? ze)B}ky3i_EF0&f0$Yfk(j<{;J6cM(DeN`pJhi%dHy&t}s+PYz|KI3d4BQ!*Yedz!5 z>eTE|B`sl8Y3fvd_Tj3)Z>1O{r2VPpC9&1ssYsBEO8mMh#dGkIT~afyM03vqCF4a_--HcJt)_k;7yCe1U?u z86P}r&M-W$NT+#HU}hetxmYestB+pt9yAr?k`l5;wBpWi6f(z`4(t?>@$}Osey^#M zmCgnHi1t+jnoog9p_jx;ovnYuh2?g?uEDOEiGIfkRZv6VJzE$uspU3_SwB9_=E)di z$~B-hjF?~*!wu*XJVe&bn5dtLk;)IwzG&?~xLTfGBHu$~CnW|hx#dyaEVO^LoKPCG03xmBb-zHqL>s7g(W=QYkc$ z;~QB=v-jlJ)dXqp+l=-}=Eb{vGlq51eopz^R8eOnWl@^%yqEq9fAia#_)rydC}mlk z@k66p^<4R0yGN+PYZ#e%XbP=oOi~5~(YcBoatOhoKr!PyCb!0@{DgtW-tqZ4+S1dO zqp!*1x1KcLRzsy?%9BDXecg+vTcIYMJIp$8z{phDugQd(1*W)F#o_MG?Vqzm&Bu+) zSMr=O473g(3{je6*s!`~AqG`hEer~)_}LgN_H+9}AuH|<6m4re^;Nbl#*2u2K}Z|w z`7J>Bx$`r(p=AGweiRMr85Z#d>x9Sfv`Ll?wX|=NCB)0d`Xm5-b7%A&yO()ATo97O zmQ-*srP`;N88&E9>1%7IrEEB>09iBs)oTMN1Szxr@5DiT>|3Q*v;avrE|xqktlN)M0WPc z+qur6xM_%J*=PBfyt@H)1u#-^DJLOCs_Vb4dD+fM&p%Y10HN(g7K|D!nsKMX;`7SX zM)V9{?_%xs1GPR~Rc&35lWS&h_B|IZ!o5vA>Dg$O?_J;9HflMUl9nf%sS&+I>O$9m z2G~Q_Q26LR711Q4KOL17mA&0y#MRPKiHbIV3H10j!WDL-uwcg{K zD2;cGkaZ$+MYRUi=)+COd#td^Fs*y481d}2Q&vI0{1|Q&2;l90y*K;u5t<~A1Q$hLz$9Mx8Tx=JIbYysn;S|o zWmR`X5}qRiSxbz}uDHmen*Nct-7>F#4(g>1={h>{%hiN!J9CF!y$+UBFZMU0rC*Jp zk+|p?iKvP~nYO(ym~q?7luvA7$$dR~a!8JV6){%E+onlm0h4PIQ|?1d=+sPJo%JcQ z06yn!HrL#p>$}b#68X7ZRof0Gwv4H4*a`-X-ot>V+KM86U5ONNwyry`zt!gz?}XUH zg1a$MW5Bg%{ebj6WLNz<*!V8Lu~9epVr>XBbW47gFj03%J4Bm#&i1^g%iZ@z?P#X* zS(L*`)lg)zYtGv85Ge2J$IbpBRO=|Wu)c~VnhwfyZZ>M|#k5?=qPaZ5{?iBNmPU#| zl&N-`p5ulq=5OiTgXgI$*J}H@7J($%{oI4o;*HFSlm>~4cm{k%^Z{gt3``%$^y1#j z)4M&C$n;2jXjV4GyUl|-sj;(d*LVnj*^qm@wQFIz?VxM|smwHt(CY0?Y@ zTflPJyQ^Ft=DfmpCY|r<=kDoV^UjkJ)5q4bX6bKY_)BV{M5Ao!9udu+`~J%*>2lOLGc3e817}fZJmadpkQfrZo2iUTGEs)-{%a z^0p&bvY9eL7DIDc#a(2uN^>e+Yg26vgQhf0*UrdKu@97z4YIr_3MpV4dul+k>fX^5 zSNa|zK`@F*kGeM)dJ(exO(M(}PE0I5t_!~F0DjEfxi7Ze^2WMVgMkbW*fj*Gh>x$; zu9gnGUd+&;OvLf77q54Gk=HNn7*g4mGM4oR?kmh0X&n0fw6Y8|Vq^+vW>nS(#d64g zzl?;@McNAX9*~B4aPfF^G4wGt3z)coTZgx~q6uHhRO~L)?c|&AQzNH5UV%iujH?wI zF#0W_!vEqC5a7JFWe5U|j6dN;uUATjvwchOm`*fhQR$XgwF5SK#WH6Sr6*r>9Y-0} zu@2EoBH`6!BEvz84MO73#2m66E9`%6(vkkkUpqpR)w5>g_k*B2I}$R6#3Hkb^8U(_ zwh4k}pp=af-}~vevNXDQ(l#Szkcb8FLP4sQ1CalCIp6 zSTXz((WE1-6dY&EUBsRLWr`GYI;r5Jw01^}pI?2OwnGD9+|0wZi16r0ohvLEfv=Ty zbcLNM>U~V0Bf36c4-5LYBJ3gx@)P&62L!Qs12+XEC+cqeM=t(UW;?7C71DX*sLNf= zO$Y3@<9@>|+PZ75Dp6`O@po4rihqY@d>`^sVpokkfA?iR2UzbYeD{8){Gyq*&Ru}?9QK? zlCR$Mfq>e9&_>>q)4+X_6vtGT&&|Y3JxRY>^HsM$j6h~MR4C|)=PFlJqV+3^0#moY zZqhZwVU@%v1tH8Qs5{-0B`#e>pp%)TzXS$a%^dx?v?jac%@{$(Aj8czHFmQH({@*( z8K;`T#K8exY};Gf_&n;D9!0d5P;&B%r{Ch{p|n%{wlEw z&`cYvj0GZbS=MtT4`r6o_N44kFg(?Km0Q}^SExuCT`0Exenlk!z_;el1OGtmzUZ9R zQNbo-5D`gjZPO~VR28U2HLGY%@iy!-J^)1aO~Px60LNOCeWK0YSC6J#{m6Pto|^jN zI+fk8bCUM9;y*5*lx)gb3exGgRdE(4(FVzb`b&-Jw~pS<4{^a8{rRrzn5uE-8I*0l z4|5vC8Z0YIUO8%+MRyF6m$T*~nR~)?8YGe*kiBq>263GPyY~+=L;OhnSPL7%t!PGi zA(mUXKT&#UT;kyXV5_E3nckSs_I`&R`+$(Y!u7PbtCcs_Oo+b zV;xdcu}d=K0QsJ_7x3BP5*Zq-p58%(TKbzndtm&bmT=g6AZwm%lXq2gM&(u8a`8IU zdYrme%k^!jR_zP{2`-+Z)MoQu`PC}DM}Odye`$G~w4h!4n;)CP9&)b~jrQIdygOHb z&Ozb@m8SPF=*RLk$9(4Dqd;@5OXn}TPCB!%ClEMwlxWGFGAyZujGZPdQGF-X%@sA! z5TjQHMj$m*pKCGoD&BKM;`cMW2)qKp!p%v0b1vk?U?ECon&HA-I>$xp_VxS-j{w&c z@nE%5E?Vw@g?oBugnko6!X?r^tWfUXsu&e3+>2zeVLi)q^(vkPSI$%~YylD~3(?SQ zJlIv-wpLET`x-cGORSRhah#(~NTsn&5!Kji4tw~u*ojKx(*$Nr&3Ml_Q;n)x0kIVEsIbsYqG(J~hdm_&(XFzz|d{T&e z{_3Q^6S6F!L$F-Q6ZZ9&iHSsws>g%2Jo|ORV#jiZpH#E#{ob;(9Y1xeeTx=Y&k|d; zfH%O$XVsdAZ2jw6FL)3?)=ddke_ydt<|5j?mXtCI7e3L=T$XeQs;_ zVUrA^VB`;a$=NNISGa7=Dc9h8v^b=?aU&=ric34D1^KvG9r&L?-OHS)Ly9U6w&kg8 zYfJPmf2TTX7p=SAoS}q1XDbY5shp!gygxU0hQlMSe$)y^GQ)hM9XB{Bo-xzPuGhN` zF{*(!7EO3ypDg(J-FT7(6+_ylKf8=h8xva~Z$&dYNr`X!kBN@3OYCcxv&%K^^IrYc zDO0!qwV$2c$`ss;6n01L-{R%UpOawTx_zh^=D$Vh-VK`^+zEfg_skr+{B6?+_NOed zakyLB#RS#0v9Q&T0Q1!qCv`&BO3tWBX*pp^jtQ;u3K_(vYl-hf}GcyeX+|g+WVuE=_g| zvA3_vnsIeN?NuG(B;ABhy!k$x64ywG&clthhQ2Csx5V=4aT=s1$uWD)A}w0284nQ& zy{W$9ox*bgP+6|!OVYQmOi+cvBJGN9DBNbV-T}R1H{U+aci|w6)FYnIwn;TNyiPi% zj|)=D8ZuuZlAAsp1RBDtZSbKtnhv6SAa#}~b7iVnRE!b|KAW>M5$C=_>KSByEs;fR zE76oU@5Tj%t7Q%TVAz^vWD{^RX?lsxzE)pQMZZ^8mh%FvgUD)oH4;wH6rAJo+R6G8 zK|{zbyk7f8w5b)^z3g6Q)Fqa-1l&`{k>vQVoZ+f`eTC0_W4xW&+}cb`2f6}3knKHC z5ETrbrI_H4e7#G{R=Q9w)(Up(n5cdlSX8%=Dhg9W<(i}Bd=-)D;$E+^f zjkUmx6`3>A2@4i zq0&1>RxS%Miz9tu z>d%dfHR4<()Xs}-G|#6%q>dX)7G$nv(E4}0-fmUpm~o2{5q(3znrkSyd6E)!p`2yT z`2cNdgpO>(=;nj-a9Bxe(Rq3P4x>qmYf#6@1-OsSZ`P~87uRX1P`7pqJ!|Qr< zx0dTP^abk^?x#-1N>r#-y~>${{^=bJymO)wi|tO`A0B^3pI>rkHxLy*heRDs=Yz7- zTnSR#+}G>F@8#}A*7WMQGaGM@lU2(ExA;`HRW~)&y;B4MB{$Wq!=XLFIuQoF zN2GPpZ7cC?Pqc5FgU&j0^YbI}Bdo<*7o3d6QLjuX^eeut!=^U56j*bdh}Ovj+E%LE zV>|_sW+@hc`8E(1-#7RKzMQpq(eCT|^kK$P$?p;_vg6$R+~t@s?z>t_8p98X7Q_RM zR+gEjUEB2~$^iA%3sln*$N{FJ^BF@;FIVt{mwBgnXf`HZZ*tM#X*0ZXWixWD^Tx3) zv@N{}6UZXXHuz));QsX*XYDgokTN-m|EBn;kaf#|jSzO(vLB z_LtifHH;e^(Xzm-XRC+DAF#Oq~M!>tE>m9d0_NBhtf2JsqYCt5@Er|Llo_Cs;4 zQj5y<^>$=W>yq7iO*??m>443T{oWFG3|_4QV9_*(LFHcfbV9VJNmAwtiqLVe_ z191uTSqDn{Wy*uAj5GfD#i>Bal@8F<&ADIZ)&;P>Ww|A|nn`*V;}HMVQvtJV!1y*H zJCbg1tlDh78qa0A;F*cjTO-O>xP>}MX_V~RoLv3T(fh#KJmXkUea;7d(}PFGJ(r!cWa!%=Y$1&`ZoaEJ~4u2G-}oYNvHq#U{QdEd&SqE8D@jAT zv2Tg-Kz230b?Ek9E0?8KDuE`jb+v#UEcpz8U{uJk)0Jm?W`QNH%Z?QnT8^G^PL$Q~ zLMLC#c8la-j3ZkwC1m@uuhup|ocN=Pf!iUw6SDL!vJ|iD#_=KLID1Fwdi0^*`!NKk z;25XI6yV@md0?lhRAK!`cd4~0r%MSzo&E!8bJoW)%@?b|vg;G(+>bmLfIs zv2lsb>5Y@}6fBHeP_$+Ur)|9e7*>WjXO`cX<5^eP6ZDS#XcRL;dE3=OcFx~H%LRxf z8g}M6M2FS0;yt()?e{Mhk^@gL25W}3dMRs)!$0$NZme+XcU_3Lo8VXl0C9BRYvb84 zbzxJb_Sqowm!fXJNhryQQq!+4XWVJw!=q@&eeEQYIs6m@Y?4^9%vzenm*cwJe*A6Y z^s?xa3q}j2`}kIclocZ*k&wE=?p&tw{-Z~|h(qp{^-1-ED0c-V}~TJxAs6`H(dXzPw7Qm>hDV%c$kjM(-h+nrP2 z9_e{q^yq#an2gjQdXNRqKH<90%Py3O6Qj-4*)k`y!_rT*uFV$d<<$``5S)_7QlyZN zj&aE9<%ctSGo!BORnut%F6xwSnGTD28M%U0BQs5NUOSaM2ocHX2&>0%Js3NyULn=mw6e{&`g)eBs!{I=u2SOX5Fe<6#l*Z~ zwlUG+89Ao10Z!T|amqAH`{e1sMz*^Wt5GSoENA&#ZboU17KvA}LJ^jXfzN%xmhBJB zlfLafPK(T$7NIuDpKR#OH!#-2i&)1KjwC;!oryK7R&IT6rzK&YO-bEF+#y&rU}HER z$VraXXq48|ecXqggJAYu(-`ZxWv8_c_S^ZmR6{r?lsk=_&*~hSCtpL`N6OdSIV^e~)2cV9@YB=hI^}~kJcvCgZS_CM@=YQv_RjJITAQjq66&y&ZYOLMe81duaia`%5xnwm!P{eQ z0!RCnu%28cS6{1CVWCr+<%Noc0K@drd67uI;G2yd8O46Yu-C-1scX=)>Gkt*$|@e1 z7}KtL7Oq?Iyfo6TxXT|&sakIo_rvVHg3GA#4{gVlo2zKt*H0>RMtb^UD?LlkQf#^g zQorN^=Ol+d`}*wbalMWbbs?I+1ZiRHb?QeIsB_;Pq}#lTy^@^dxtaY& zMtPd?#lZdky-B$a<8FX+`n_C)jcXHKhVfaJh7%g3)C4Djd7Gv>ZoH*Uu92ZW?~RW+ zpwCz#56>p@H8u=K26Ig zbP<`&t28VB3Yih6P^J5%?qS;ELOGDExu^X8XiVT1?W4+z(T8Gq41-;7gRW9tl2`og z+8zM=-J}T^bOGTc2l0j_C3ypGTUx$37)nBwn&Gh?kFc->ZBWQkjl_6rn^`A+WrC<4~$?!D70siJblcFQRJr`r)7K8V;R zsm9nRcTq<=>H_~S`|ch6ATNCQ9mO~C@s!prc?3LW4;3;lzv~UFKX-;Ail>Zo87Ve} zg_JUr2se6ebYz2jo;t+DoB5%rY1xv5Y|}(0*_3+eml?g(jY(?9cHaY3?WEq#-K@xHlTA4}=C5-LwY zetv!_EGkdZ#*ivIogSV@EVIb5+to0K(&f+dCGU$1KCt`Ne;r-SaJFpTLPUH&cy^e+ z=5ALOIqqIJsM%cY?}aHHM9eW3UbJ<%+ISdC-V0;y5U(YV!~_zzfj_RJYBcH*hEdFi zy=Nb4;L(8aQ1qSSj1%L=Mp!;>1{9%Z-48)$tt{Wqdlx-1Us?<88p(Sx=*bX-iRMKS z+CTPmnX5>LdBE*Z8roT5!*yVd%PamcLnS{!cI+&JD?h}LtMN#D7C-HC!ZPxkz0QOo z_9S2&-W0AZQO2#D;Kyw-rLxk-ah+_v>*1Nw?TpIRU5j!?aif+*@D=cz$jY#GnUajG z&~q+)&w;B%uxht^p^ucrX#z%YjHNR#!rQmi==EpEQZ&;@jC9sj1dTTB^)+yH^PjN2 z?;o<;i23;D{pk2@WU(|YdM);<;O!a&f_>D1I*v8)OeJshJNu85_8A35vyWNq$kIz) zavvLf2I0>zXPp43M(JZrh5IOd=d`?b>o6-Km4Jt6)j_-=&Rot6pY8=lTw`o*mCp^i zwKw{@qJpjUsj5_$N01*s?!$ACOV;+*CM@L&i4e2{ob@!ctjz25$`R;AmVa3oQ$tvA2+nhRu^A-{5 zL#zvOeVVXBIm7tX+A)sEwD%ReX47G~<4lFo#o=SomQae2;6^3GY3#$^4D)(!o>I*8 zt2qZAxzj5X33Ch2BXvt->UyMQlyP~}Fj*yz9j4G?2anI8kyiY>9S(i;-=4L2t_jWS zl~XM4&V`GL>bj)k?nhvdaF|?I&)(V?QRh;U75DWjG;fP0>JXHzaxX6etX}P&;YaU3 z>3+)q$!0-fyKflOOGWz$72f+|#<#bCMVsh-c&FyQdzrR}3;l^L(U80kwk9ji<7;wX zQ-34uXw7e~F0qUr&+ElamileT=y zfF}eUDWKw8mjlmv@7ps=-3Kohq^S3xKo(A#$&^7zkfN)yxlt{;c!_{^H4|+(b(or2P7f{o}B5G zwk{t{FJz(+ljilV9QTsKsvVX|KbDC5bk2w?3w97nCcpeTwXMhC z!9`q!jt!5 z^XtUCxeiYTkG?wa7|Z`uB*r^4eTY`YM(@F31l2+`4l_TMdtD;V4Zzq>4qBe=qd#t! zFROg80T2r;_lt%z)B2{?=*T*!6FObbaeJA>th4h0kf?JdZ~FjAopDC=1>4=EUc zOdO)5avu9Wz;|M3(yZ&z!;Smfm^`d?pFRWgKmvxy*T?)?&YQI+Uz^}}I^kkGw=x|a zSvel#huG_+=?E9dsKAj`Lfebpb?^5+5JAH9HyqzImLX)1M_vdsh&*CrI4}fk#%s=_ zxRo(u>@Rp5R{@$reHjJvWRTn%=9lzMDYXEO0QWMDs0V23wGDMvVL_8Av4vA5vGo%I zF5=4h=(u@?2Vxn>!wgJP?vnR=R$RnwIV;^sm%sDBm)xK!9JKIKOQH$$Biar6N@^M* zMuw2fM#M=oz7n&{6GX+V8ZhXF-Y)Jb@ESRPdp@_kZ}Z9#E?`^|`Z&)&o{UrMfu0vA z5WPf$$gKwpa%_esNxgIm$3C>)8d0sVr6jp?mMLJe!UOUrMP)tKe1TEI6kt@muGQA@+b|z4fE2IIBX|G&~%(Q};o7+CTSF@`3)w z6tzuwtvC((_Om42Y)GHFbYBh7gIx73c>WDAB9~ro&|G7nr%pLF6i09KRZEOlZhU8&$ z%ESiOm?2`O;Q4@58#}cl?2`o3i`3MBMO__uBY$bfWbqMp(xy@ul24z_8sl&QT9m4_oHIv!{7rFb z{7(F>A1cJTZ?wT77ncYZ9_@T^=p42|-N4k;d*(57fvhsqf$$zvfN+AtmX4sIAH&o& zV_nxjm?~)IWGysv91U}kz(=&#e8YDTy9E8-_e`XO*&wUsarM%*l`59krRFC79 z#Q4O}AEt6Yf7)T|k;rLrhyuLBnrQYbkCK5!;x6j>pd`{jd?pOHqL3DV@k$^{Y4|5B zXldazBPN4z@0aCUdL@?2I+MX!hw2hdJ(2nl1i;m9iAW&)x&{e?mhWSYX(Fb<9)Z0E z!7o(;qy^c_#3NrN`^1|+XD@;@i8V0JDfE;YmQbSc{RMlvWjc?K@;!BeD5sovqGjXb&MckJ|betioE zc=V(w>Sqr5-*YAZo=%?Ymzlb`VClnuB&7dK9(t}{X6gn(?oNOG%S_!M{=3s(|1wiI zi0|(7*T2lv4dT5s{WbS5Gj)S_?z}nNzs%GP;=1$Zz>=H)BI7y;bmz_C{&S}8JJu5b zao%}zxc{8vT@sc`+tc3FMGBT@8kqK#0})6vT=n{>Dt3qEAa97QC!R3(+PGaZ5PiUJ62Ruu9mR; z5iXuT{`*-OtT>Yl6qYz#+1wF!3SJ;DkXs4FYYr>$r*#j0si;3!O}Il-xqqpte~bL3 zs{SqVm%0k(xifP<_b+wzZ-B7V{X%oVoOh<&hoy}FKLq|#S9$sFT&e-qW`0rQ-vR%u zt9L0mgO6LzgY_L-x@xL3>EJWMS-mZ@JBlUTN>ey%JYwxB!I2F^4pRG zAYKS;|FbYDEGLDQj0{ z#TsB00ssKuZs!4y0I0}6HrOXBCMpUlCN?@MDmpeU78W)Z7A_tp>=PRk4+o!skN_Wt zl$4B&l$4f+hK82$-y0knDk>T}8U`8~1~vv31~wixY{Mh?c>)4bJRI1DM@mdWNJvOR z`~yx#MompcP5o~?<82234;8=&$V7mn0l?$IA>hH?_Q2)91Vn-RvB7qJZiq+-@W^lg z6j*H-Z~%CCgg^cZJAiA0s=fDJTeLb>;v8d4jusy5r9OE4-!{LCNQUQ z4<+P!o{d6OEkWCK95rh8~bOr z&iLi@?0lc37Bvlg{Cv&~k=M8Pd-}4td2sg21&e@!frEckT1m^$-1a3N?0R5QA|b)9 z0TC4e!5MZvcnF9;Bt}w)NsR0s`kX7f`jD`5e1%qmNW%j9m79)7GK@GulRn3?rVGVm zf_GIaoJ8vd?Cy}>V*pE&FJjImXm7-}FWOC48+MwypB`kZVT!8M`>6iLO#zI@ZYEtv&hSFZJ4H)?T8?>#w4$qL+1 zbZP~QuOBzGvP)MyCKSQ)@z1&ibj&`Tsc6f0sJii6> z40PECUT>fd>Yd2#8(ug~@5fyWvZczquE&5sl0=S8Kmc@H;*>POGc1NQahn+RIV^cz z9~pa8$7R&dt!=@nPP7TZcsMl$(+QUMo+K?)JQ9D-JDM@Lbwzvg^^3vlci}-shQ*hz z6qsm?uj^;Q_3u|B+sO7$#4k1GAh&>3eGFwqU7HP3n^Qby%ERG=2Lz+Im!vedkkyptsb8|iHLiyNZ9T5uR*Uz$I;ad#Iu{p+hWu-CdUih*9`}q7Q zgmQN?ndlY}(KRZme{AydQcy2lH*NpjPQ0``YUC0V8FTuC=pv(NUH9pcafKxLC2wam zJdsqC>;`_8+6Ro8xwB7$#(_?jh=o($6p(<-WHVgYQ_X7@MI02=-2wzP_Uh2T7vLsyZBe> z#e6WV$yV-TT+3IUw;t2n#90^4>l?ma3p1#l{GL5Rd9EJD_LkeL9C?%J`%V^h-SejO zRuhHc0~uSH3vCte7>?n~hp*vjddj|?zYd{$H8+!77vrOvsq(f_H`0@-2SBQu%e*VA zo+@Nn(}x3q`3v`Q1ak^?>(^*W|bvSaE&hNgZUg(cN0B5{kE=aISz4BWX! zm(azo4?SIad4AngEgPEtY-(b73Nl%EAFV9M=B$uAy-?q?#kZ7J%@y4OaK0&KwqGCfoEV-x$ME+ z0-ji%LHZL+w;!6#@a%_jWLQzI8`BtZtd72>6u{CwJC5Jr?h~FBmOOBKoep-&HoYB( zwUrJ?weHMA2Mm%7&o9~3O95!KO)-2{cq5eh|L}9Oep18$0n(W|b+5Ql9^%kHEq&(#r5*9va=@)|@clp)Awe663Rt8+u zmM_-a_qiM?sT$yySJl>5Mb5rrH7#UJTfiv1h!R|6k!tZX8aO@V^ut#R_Kz;sVDY)w zN;|eO5v{xw5-GiL@LbpkR;J+a*nc3fyEG>&C`pIe6+=ES-b7oj9n!TIprs5%279{( z1W}13y30(kWNs$KlfkV_Z9O}-#ykA3d=Pfi)BpI1@!@h`rr77rRjh~bj&uvRfPj9F z!A6J4CSj=Y*1(!QTmCvi>T4?rF|(|&f=4s0wu#(UC#Gucfiz!o>zV=~z9~Z_-D3w1 zL4uCO7j*`*M6Y}#08A0=rRq1019Bf+WZDS6 zaz%x|{mpLs&1eSPXsW|4;CA-T$r#vzasNlYE%*Oz-xkdM!(IM;!L9%GZU5J|{eRK7 z)#KabF-goYnd;Z$h^fs)Y>k+_VR-uL;239ME_Z4E;&@2=nx0hVO`}N-A)M3`!3^4G z9Kji0q9eYT?J84@;`(fDtm}p9C-xd1s;4Y&kB66nk0Lgc^-uJuzjbmDb^EKJT-K;H zUXg8FfNTcCiH&?WKnQHm6=W@rXk(wR#A>u|%3c-*s#|?8U0oWMY$gua4%W!6zCAZa zd+>!;X85RZGUVi7Oj*;k;f2bPNRm5-5~g#B(N|4ULHtlfn#ORFOYZ!}lsAo)ofO$F z_;$AHbehuRiQi~}^Mn5Et;pYoC$lWoQyCxOW6IH{3S(F+wr#vk5z%Rw;9$>fe~mOc zZZ9lb^3*^;o0eT6V&fR{(W^~RxqUK2STU+2Jf)=X73w~=%$oy_Bd+%{7YM`3M{RYJk5S-l>J?R;$S*<#GLmDtB6k~$=| z4i3(>7^OYFm*@E8JNU|^)HdJGTT$H4-3wC}+`~Ik$$}hxl9wckV{*ZfJTZ4UBDSuG zQIw6G73Cy;Z$xxM$4DVdk+wDhy+)qe20bS#x1JEIVenm&=d)4#PA3;DEKJ&HiM;oL zV;%xe>>r7DC;QQRN@aJk4$N-P5^${E4;aVwGnEeCoo5!gT6qKpC*J}Vx{88A1`1Lx zQZ}x2NBAgApVT?US~Rpm+oN||IVFu7XM@u*IRbZbzFe-1123p%wlO$jDwS9}W=nhAi?jI}a(N*I{8UrRW!^=-6F(hO!Cm@qH=s!dpt{62op(kOzX(#(xx<#rA#D?(>4w zqrRzqk(nK%6XDj&cv-6Je3Zj?6mukvQ{^rlEHp{-!o|kNAJUNeKX^XVcQnXC0SV{! zcNh1@2U7@~_hfz`?bwxdSE{ucO(S;w&F@!BD^J@Nu-*&bZ&Xu6y9H!C(LCRZ`S4Lj zf&V=5t62bE^*j5mc%d&&m#XRYrAUNw6&s+qBRW@g(G@*g#oa#1-lFcn9vcy2oF%d& zPY&_#b;tP?&&lisa%&9HpU`iYY8XT#f6_V`>+(V+Lu_iWZi+d>j^_Wmtyfjyhs}Cn z5wGb4X`I=&{6s8|z+9Azm*RN+sz05lb~O|3CD$vt)u)V5f9;w`C{kd?@+OwRgge~? zr(YiZ!iR#wbL^KWU~u(_y-G9fk<9BtzqASadJ;bl$v|x?b^CfI&Mmd?&GmM}dP-l1 z1mGQT#+u6?+x5#Q8yIzoSqcfMFE}q?Ib~uFxMP>0p9*?CnRxk7?>O$k2ShVcLiCyn3{A$wRGE5U~bu7J-dP;Y`K-|^3Db~{9Wb~As0m}uBJU12}UNUMm zFwWPpmY|XI(s9_tqxu-v6Ytt!1@(HE-@o{?cG25XlH=H>z_(dO+pMUsPoLtQiA_*Y z=RKJ6_4xuD&_8Sgzb-RS*^?V~^M73w+{j>>*6vq7wQKg?^QqMEfN~I*OOpDbRGG*$ z+WN9=yT?TqFOj!QS$MZ#G%OQo_DaMh`QVRAjMJya{JA zfO{K>m2t9>RI!;jDA-tZ)Vw~@b5sf~_vyOt`EuDmZ6!L{!{2LR%aYBl+H0u&!5DAB z2MSxcXY)%R=S;*|BJkvKqfs#Lk^57;B&2m?y5H{UEI2sllUhEtz(E3VPZ(qR6eIS9 zY+8R-wz4fik#p+|rglCijeiazhw%CO{YS>|1cyB*VA%FMKpA&vrG~hlgnZR%N zf=m7=m%?jn@D&3@&cJ$el<~W85b!lGLIl>m2k7;_jVrI`k5eoC%^@M8MdX7tr0-@l#u<=IWwF~tD>?-xFF(7sV2PI<0Ucnz_P zOcKEEf*LQ51-5(HZ0o7dv*Z59DG@*puegbB#>uZ%PS2r)=8-xWE>_4ItaF9b`nA=A zfx-si^KVMsi|4lAkLJtrArUsK6~?_!huw{`K59kbS>2Zo0eo%IJx^ukGWugWB@!hV5ME#(T)q zxeX`xpRqr*ge*BN*`1di+uMSNaSWncpFaT8G$W0^oc~H&Dl$0|cy@n1rn*JF-OkJ)F^(c$X3gZ1MMSkl+hjadQtWkiBjJgVbKIDIQK70uXhM zIZaH2II|k}*vneQJ(NvR_QuDb7F-T`*N(m@Wg8hDUr`3zyaQ~GiP!&~BmC#t^M5?a z%kwvm@IP60_RdLOZpaVc`v238Fx~%7^8Wv2lK0j98z}Z{`N215b>vA&_S(kp7Undt zrZ@R|3sSjdo8npzvjOw3xfUy2cK4IT$t}vi)CfQ>JV$PZ-hFZet<%A6BVV}U_gSo( zf`o?&G~ATyuloEy4SavG33*jH%}+MDYJLkKJL(>$9J&R7R89b({^743WL0_ zEgrl`#{Je4o!v*a-Q8779|bNVmdK!ck8~R+RKBU{WpsPI-W)#iPz=G*PMrLncEgBM z9?V{c;l`3*Ja3*vY3J7Q;+Zn-wLR)}M`8DI;HGkpesTXD!ce{KYNrZ~Am+1e0eeA`K(INKH#WU3- zoR{ln3(Pkq)z^VgZTk!7P39@qNQCAr(;1_KXXK8jYB=%zHWVhaGwWN4vX|9Qt{kRh zXmfi$eNWA>!SX(-G^oA>#MnPh4t|kl#B-vrEIL@Z>QQ7fqQB#%Ip=pI=W~zjg5j~7 zdBfY}Ijp8^jpdN;QNiIfmE=`LIe7l-igV|5&|upTY_i`;8|IIZq^NzIGcsAgr)r4V zObpe)=LOCOM&gccz8in5`@*E|GN$cwd1)_o^Fu>C!s>ofmh}fs9{0Tl37_}#xDu97 zK;U#`h>+y65q-%cx0jUaGq@3zA!>N+bMpBq<5JJ*m~r^dS!mY=$fC9RT=_qvF3>mG zts|C=ztLcolpwB!e+wu@Czx`b3?wkG_~PFxM7+EC#OiuimF$gqw9|l<_BsMPcp%D8 z9*UPLQQ@P|u0($|NA84pyt!x~SG>b>;km z$6G$Sm|vb0^Bv2_k=BU1=^LW6z%YF+O?=sthux3|{RX6!>2F$SZDSTvFJ4+G`WeVg z@XAxjN=Znt3>2oc34FqM$EY_*sP;x<*csIwsZ^OdQd9#Rkwm*8#xFO7vKyP&fiQRr zK*__`*1;|t=7}0fD9L+X%Zd~6$WeXIq^Xov#CaS+p_nbfU!#n&B~liPRWuI|ow<0c zacwft{n#X$4C#cvyqk3GdgSdAif<6Zxp%Mz*hE--XP%a?T_xZp@djqKN&@XuV%hbQ z8ny*m>c_bHC@QZThQf!Q(CH^I>&Puyvu_XTJg2koZZljJ$*mQ6?)} z)ngy(r`9Bo{#+xL;+3S$R42PDC;SE!5XV*KuiTf9)RdIdN(_>kaKj#jCP!_Y^Wo`k zoT|vA4C0a|BS)$#G3JW1gA~bPo~#%-BniWmORHTqV`ukcyvyo zsY@Q15$I*0g}SVg%n-WVigR6$^(*<8(>Y1&Y$G#RJdrZ%?dizzjWqmG0p1-Rek{yA z&xgqiAhR; zG1+dH5oncKmVviT~>}k<`Mq8N?+&ab8-svnQMS&HfQqUh8B$5s$lM zwPIk*%^;36PrFAIM{f)7yPZ7JAYBssf)>lS)|>t+)DFk=dDgJA&d{-{v&QU5@&Fy1 zL?e|sTLK3>1gay!3=7`p9D1*iP>1P|S3pCPD zCsqqk&3-i|9Y?FFp|@K3AHO)~b#V%8qBH7W^PRA-A;LY?Tp^@%qM++^A%uVQ75sOe z;h*UdzrBp-1A+eFrpY+L$V+#4t>MkGb(8UbMf;ZFPYb z;z9TG@^5yz3A0yJ7^Jy1a3xyB16rv0<2N092NqJd(0jXcp8>)>Jz}^qoTlm|1+0(c z4WrwMb8&dvGO4Mi%J8}4DI(qQI%#Xl)6~))*yR`J_?tvm^lmgOS#TwZZmW)%BV!Zu z4MAvl%~&dp03>HZQlT$%M4eymD$W2~W)*UXOAEqFWsuz&6*{`FG4Nc#=Y69@{TX3b39OpE2Y^HHZ3U9`mekfIsHdI-S5Tkyp@p_%xjOXI}-?77}Ojpu%ry*XQA zL?vedg7#ZV*KCS}r9vodb=d@g$=3MgVZ+CRiI_6((xYid*?Aap&*i)|l4@?mzSs!> zZ8$=hdxh>X+D>yCC%=6wWOmV$>x8SJwOf|C9{;o_Cfohs>+MUG$_v^B+GVD1i6f11 z91pHcHT<4kDTDhq+_N=5CZ(`m>YW*Oe(u?!^6fu8XICqJ^2H29syIKap|THX8Q6IY z#U>$S$H6{d*95EJJ`moErEr8rA)zi-;&PY8`?!e+NPp$|w42Va+N4WZZusD|$U*Fy zzzh&%54ybj&B33^KQNA-rKYtfl_7_klnfPzmbI@Z6^FdDxvjP2Z{PATIwyyWtBdEq zxHmE&D)0{)5R7cYA;U!l{=w||xz9}n{z2CHxz9rd{sSS0Lr>Mh!P@e-6UaM*s9?OL zf0dMX=A!z^)A<3Dcjl)0`C{W=KX|BMT+5%uez1Btq=ls8Absb2Qf!G4j>jf z7f{L5MTQ1S3*>iHmevq9=C|<>p%*X{;diAM78P^jcDECu(P4EIlw~sU0E>zWbITg5 zTe!>V(ztp`@Hh$3VWCT^GJ5ezDw&$_NU93(E6Fm`(R-@fYw(IPN!d%OGeULP!A5MB zx@=6$GLoLmT&`{o>Kdxzid<&$UQkXi2R>IUbQ>uzT31F(S^*(uJs>}$JFTR&A(NR9 zmldOzl#H^CJOhIh$dZRyiCchyUL0!3$!y5Y;N}43=4F)PGZgf4(S}JOZEVX1l$23Y zwRRJewC3ZJc9DYU3t1TJ$blU=g`{~QAg}}-pPRA_vw^IT6{nJtq?(hCqN1~gGmD&| zloKl!y0{@bvz?&_HwPcT8c>Ci&&)`N%gJ4mRhgg1)Js;#-PMZPLQIWcSX`5l0VoRs z=^HpvTeEpc@VLoq$U1r%aKdh%eruDY6&`8it7qns?Z9!%2I za*}$SB7D@;^ageef*?UVO`xoY1Cyzgs}WFyQyQc~PwU3VY3&MPqUM%oQo=&lp_6Cg zV*t`Ztr)~1yiCTH)@tsY){IIX+zJpA12sK9Ng;j*BLzON1dWZTqB4ypod~Uxrke

?3%f}FL7mw}?T1(aG*nck94 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

Vr%hSFxd4 z>_XGH84ssz8@Bw-Rf!M&hO4a{U;MYT{GRcsP2<|+JWt|-WJ`S%%xTJ>YE9o!>;206 zL#gmu6_cnX*dJdb<)Mn*k-$_cBXk%yi?!U+xfLx%HiD{&zt~8lw6rNTmZL)}Y{g_9 zfmhV?GoUc>*G6K%i*ZZg2HT@Ip%dd0xoJ_dwvV;?-hN8sB0Ex5+@89Hvl&b$NyC5p zBeUc9>q+zICWn|}4b2MwS8s!N=^J0^FM7)xOVTSTDY1U$gulL-mGcrpOJ|k+so~vc zc!?3`rnm8l%qClcq2%TE&TOf}wAh_)5Aj1CYi0vA(1nP0oSa| z`P7;71-Gw2-?e+*E}-2|af)~@ugbL9QLT4@cbSMtlXYnkqTYO21i>T{cN62-s_vQ=v7ZoCK$C~llB<&LqiQr1{Is92(KIwg*$X3q3 zBF&15IrPI~hR$Me9kaAQjsFmwK^P?9QnkEHrXKx`jf@lIIUBl7&fOa z#B|0t1`lne4vRzE@4nhUG@a4O9(<<*r$Y0FedTk;LsH)r3Tfe^;w`Dg-;>X8X zvQ>=rciZad+tg*O2iy%x&3iurirVUA%ndGqSP|CwN&IpNy!HiRM$OIGhB{DCF_3%s z;YlHOsBJ>o#+;BF7))LHcxR?<;Q)CZJNSU+c?2%SyNCQ@X}>{bYC|M$lNYoY%BUUSJxZ>Cxj=y22Wu&DYeyx6iTL z%)HD@=NRB)=G*Y$jU)OVPgX~eaLpCcqbNNJvLt`iAaq|AT=eragF-;!i5v2oKBtt#W?hd$)+>x^AjKkfK9?(kYDP0sxLD2m=IxI}o2+4Fd$U-*L zaA9paJX2I=&*l*;rBvLPb%zDjDRVPJ-ddT~ru`rPdxz9ubN$S?FWdZt*sp@6*Z4KtjVnyP-0A)SS(`{v;3Y(QY8@6T#~uRn8#?H} zBv@g>MVlf6yI9xS_=*y%rNt=kLgy zGEBIF7)gXpwDd|~wkSs~p5}Xt%kS9@W$#t~oTI)WiC8%eAuEMV8mhc0`${82tv`j56{SRlH=@!`Gb) zpZc_uc@}93B^9DwvFWH~$D_p#ZvCA1;gu23@qZKr{hFf><6$aK3YO5GF1tDr7`iM* zFuYY3?4yK6e_x@11V3z*zXx@s`_@`Wq+^KY&h(v>udKhzr*`*PR2eO|Nsu*l_uw}|_MK}UPiS8Ii5mppQZ|qA4z;?Bp+UI1FY+cU53L&tm7A>B6HohId8cS@jB>bKOf#0mC<{%CA(WvN^^vn zW3&@x(xs(3H>UF8vTy1{_WWntd~(tFhrx2fN?Qj@U+6(=WCe_okWVt}kaRLe2E_>J zz@cS|q$M`T`{;L+w5rH_M0ESJXEX*M8>_k>WY!|JD$~O;);HdD=AQrcF~tG<_JO3n z!0yL};u~LH-eN%gKJ|H+SND5`j&A<$V)RQm3^fz_=qzIQJtbPW(INCSi*}=7QA=G} zvq3w=#fnt1p;ww%W&6&thIhP+gd=OIU3r&9-x2S)Mkx9S5Y&H>Ymo|4GAeJ^dL-Ob zT{`nn%=-0AcOvzY+;rL;29bLs{#w5GBlz!fd=17L$MSJ>!**6(6VI#{`mXZzWdBg` zs9)4&NlQ1=s5IKDl?qcy-{|6&brqY2KlT8jBsW=TnGrX*+tSAEGaes}qYsiiJRDVe z&R%NyC=m&F!JBr1NPj_!yjkc`P3-cLS5ae4!uKMQQSnfr7HwLhoISR&3RP?MS&^G6 z%JMsMs06uTRNU`K$}&_!?>srUUMb-a{Du1!7$43~Gj=gW@Wnj?}@SO$Lo$FN)Gc3K89FP$-IrxpN0@0tKC)9?)HxnQHfNJ zpt+UUpA@8ozP&^8YdzymL%3z3@UQM>4wUG*@(;MSxQRDO88w6VJS{tJaJq5n1`X8_ z%!&K{4K;R7aCcbX7oka*nbr0ce{My$_H*1#2eGy3H9O`{ z{@i)*P`~6ZOb(%H+F)&^EL2%Zj3b%^!Q3g`XxQ&dF4qBpxo6oH$zx1N|;KEv@-iKJuJgCTv9uKJm!0o~~!vMqrmn}hHjRG$bdx3$)3xzrW zJNg0x>)cq_#1%|G^8%L;L7;i1KTf3cVqwb>VEgLaSQuXF60sK;SLe2Sfdz{fxOfQy zTN(hM`MlT*ELi8Zdy#Qy9}5Z>rT;6pBg@$gCX#_2 z_}1ll891W&gu2wphtZqT=+sRPKV0v(K*J&Bm2fWU^+8~1KO+7N%z1B@GvTY->PJZk(Lxkys zfTua#U0j|uW9(;XAo;55czmnUK<}Fd>03R^N0ba6G()^0*#w)NZOm5v$nSfejtoGW zQDky6&~g%->Gndt2B9`XCJ@Q$xEpxgA4X%lAB|1EUfrgy;fm}LuiBAuzZT}P)8j(r z;VZ*q|&)~xGw zmzqS@g&v61ZXIU3Bs?c!cc?W}rx4hid8ONyGT!kVQ6cwneQ8@3WJ)oh%3~x^&VFmrXrE*aoD&6O>R(@43||$g z^JvSoP0xa@D?eQS70WkB$zTh9gr(`dHBq*Z_|hk#TKCo@a;TQ}yrZ3CZY{AtH?gVR z>!Mk%Yw1>Rs_uWZTO3h>L7%uvZ^|c~Z)R4Z=ALqEak@Oo0A8*WZ&((D{+w5KGE0ta zzbHaW%agUNKIw+H>gVL8>FBG?-_>$7!}zmfdK9LEKC$z>$JiF!UT9>PLwVwVQxGni z!=E1?P6GVM_Bi-^9GgQyL$;Ww?8kAJGUw<|-uM+JjMn6(MjM#eXd1|+4_8~&a)O1n z>eJ^nI?A?|KEE^3>&2pQq_;Zmpk*;`)7 z1JEkwq*xN3>3SrrGzjf3JhjzXqZZ^ z(D$)PMW!zbm?g>c{v=j`r+CHNe~i64gEQ_iM^(P;6n<2(*+nZIa3k>A=P7r~rlODm z9!3Nkz74y4#w8QK&{^;6hLVBSjyOU$m8=>mUMwobs&JG&sl^etNVf`DG_cV*!W_iO zAGiM`QmgCzrWO*w!eVP2iNm!cZqfQp_?C^TNSEU%@)2!e7B#jdB9oPO43ZS~v^&L4 zG!6B0_e>{r!(&$aJ*LC&kcyonI2nmq<_bP0T^KlgyCqI?}$}z`>Ii2a~;~ zqM;R?BVvt;8<|**sO-9*G#I8eyx3WgiXvmb*wAxJg?Fug5}}%(M@(`0dOh4|K%-=a z`NJak`I&MZG>pg9=h66^kwAbaBsv zep(0HHIOy#e6>=YG5e-T@>3rUg@(#SG`JY^ycEk!eW?)B2^r16%%y7-6A(9Wl@cM?ne@d_(ZlQ5CJZ<3 zAQs`=mVPxzlIk?|xnWTsmGTZn&f1Tok<4j|j%HbRW|}4K>&Rb&ewbZ9Al!;54sDwi z6e$j!a}=$Tb)&gT;2CNxLjA(HH*+ldm99)qf1|w9buT9JmWSM>5qH>MBIrb6p>Gt2 z)C5D#>f<`O0Z@l=2NMarlw@#QUU z`AyvfzeY*J0sfH+?h2r$G7B$z{@MOuRgRBp3 zO7ue`IAVuTa4b41Ryp+PhgZM1Sd|Hm#T_oW z9$bQcRX#pDzE4&49P|2F3l^Wk42R7j8YWtOogo-GK@P)uRQSU%(=GvtXSB? ztlH$}7upy$tj37Mx8L?n9xduYCcn23KayP92wYq_L|)wWWaRxNd|v`nAX$fviL~Rp ztiAdx?GUyNd`6d$A4QS9Aqt8{NJHU6dvTn1noRE8Yz&-bO^C?ldD?Hq{c%Jd#2$T5RqvLv_?m zcSKa`Ot(mTAIE{E-MwA%x`sk5ez^k0b}zI_maEn6{dAS9fR$7?ze5j~;_*RUKV~Bn6VPSVPc&soG~c>on8axAhwL}GYuAw(EliNb7_Z?~*rSG;l8Ctx z3V3T{}N-wRPX@Xaf@;ga)iN2Uxy`tl{UXIdk~qZc>UCf&5D zbv(#Lb(Y>{jI{V(1F*x zv$ZnNTn22r!1Y@Y*oqg}Sbku0ddS&|7oc|ep;;-QJvwaN3P8KSKB|zjbt^#ao|`m+ zEkA*6m=F3i07MI%Ek6NjnD3m--kG8^=ts$4Ih5agl>CP#fqs+-oYtV6`6v-MQ(W?2 zHc~*~q8}x4LBpSk#!#b=Z$0gjMb2UiO`-ns;pbcI?z_Hrt{kBpe8o%a+1Du|-;5mW zCy+?WMurh0`lr=y9<=)%wQTmpB_0`tt9A@$fK`lGQ*CxXH-yN_$;lz? z1C>?few1n%d_}&H{lbgGEyk{AzYf?~ZBnmkA>C{@N>BJ9%CdX>eZH+xBAu-#n&)0+ z+GiQv`#KEEWXBH#4_ss>Z%i`l=dzG4!t~?K1ADBDV5^0!EdKhQclc8l;q7sE)Ck)!+?YvU zD>OhP)n_n%7^1UVGHuO?aJV?{uo=hgu{cbl)D-Jyh6<6~wSIZJ?9(#|e)@&{$gVBUw zXPSf_5~uMUL8o_52JpuNw(M&Yow(9*8(I;&+EMWlk7;%rjILL072f< z1%kCypB}59?S)G>O7oJRE6xmM@;1l6w$plmNWzw?hA=y$19|%ae_}U0a1N_lO6Nvo zC0wkd!(!*xIr-(ihry(I9>NHe+Q#Y}2OwA9H=Z*6nFh8$yx|4iFbE*O)(=>bw>Iq; z8&w*>lehy4^d2wu<>n(*@!)j)(z*LRHcFS%oPuXJG4F+7z0?(~9~3o_7v%WLyAweC zt^fH?<}&Rd5+ysjJ+o+1?S_rKvX8zy z2!}O$NdChFmst}Y@rBI&BcWn0Jw-$$N__4WT~h)lL-J=E@W{@o>1$#XDJ{L5Yy)6p z*6er9+yREyjGFsfat@F;!yLcYVWKg)D-H>xD5%-jY9(URSa-Fv!LfGG2HoA?Zy)05yT_T-2x5PHg~g_^ ze=~q(tlp~A+q!sNFR#1fouAXbc;=hPW9PseK_%<9+oOr|(@w#BMZ#Bw4NQ?pOIUuqE*iP=Q_$fTH#KO|BbkxzNskUBT4;~;NwY2Dhb(Ll!!}+wsT#c4?S@XT z`{h5+0y;XXOoILFnYhm7M3WBK8WEzyaKWI`d&HV5VP$T4KdCMtXj`_HXa(O<)tPAj#-OKTU{*SYt!C{+m}AfsYW|XD z1-mFQE`FfAw;N$sZ{2!!%J81mH60R~7R3&wsCOkH_rxmXXF}yO`-MUsy;>};i(q&s z4?9)H;ws&D^66J>QFO_W6Jj9$$ezi>t~6#QA?SpS>==feXX8w@GT~bkxs4h?aot{H zSK66Uvlw++Hxu7t`+1Q>EN72PMno9Or`!(|NgAXSaV7x-B&9#`Ek`Sbr#s52j)vKG zACQ-CeM52fRsQ;!@q<|rkNosz_suVEY(XsS>%9ycCOSL{WOMf)g*Hc|ng+YXg*Yqb7%hm-&u_IpbE^;KH$utIg)a<- zkBVV12w-u~F*Le1bIW?VW3?`Ix~oTBhyx*Y)Lw|F_|f3~*Gc_rElJKZEZ^1JNrb3^ zt~#>5?^D?nXK-~IXNO;I1Xo7!*OHrL=?P;#^tz$Hg;pHN zBKe8<2g6;v?MfLwQeAol!$KV60b~IkzLoeE^Jc3iqtzTjvQ>ikTQx&{JeqH%-P)X5 z@O4FRqOa$RAy!XnYWpLjF-U7I%Iro!ir?(p#ixFv_o6Hf)E?xyuYwm=MD3^(vYsC! zsm#ZF{Rs zA=1_|80gUnT@lxNa#LL26Y?`Kko!}BG4ILJx>jLJ3V7BHeI@Y^C+u6%L5{eGd#@|v zzCGIY*i!_+UHjExE%0GTA@Z3Yv@bQ)?7m8Q^Y(>>gQ955S*9Jc{ zghYP*bQ?WQ0u?l3q}RPE;UkfG^vG_9j~j|n5z;Wxlf7BD3b&}}3{h2OznDwjKtWR> zqI41IWM>REvYRkFygnQ)p*!`6XQp@b+)tQ%vWZevGcatTljfIpFF29$GGD2ZZU zGm|BIryR{QVjB=dhpXcHl`nu~6Dgk_=@$33352@1b_lh#SCAV0B-{fPB-1uc=6f5GSgar4GV?;S(9E{|J~)$kS?Q!Pl&H9$v9M| zr^f=58&|9h5vu+7zgj6%$A_figxOce`D6>ee{ZPj!QE5*-cTy0q5FG0Ix6GC;o3ev z5;6X=s2KrH_zpLuto+-k%eySqxkMBcG(SQVKa*A4S`|xCVJ6tr-LfLMBUNL!GOV9ADKy|; zXp)_NPx{uux7W(vdVWW*@ZSzQP>=uo9zB{g-Piqsz9PTvOJW0*5JIC>IQfUOI0_Qt zD`oL45BEfTEUlO=e-`7L9-cBCb(G53d4Ylo==bRFI51u*wjHXylM*A-fkumB(9i2e zw?H=f!xZ{o6Yt`jhIltpxg|(#6^q?*tSw|szI{zIewv-}_wNbMPSUTwfAj?d`dg7s zl!~XVJ9YCOPnXHsQGnfljJh7XN!!4+<&uEn8tdfYP(>dim6O?W3E50Y6k=C5A2>f= zT#)RpViM`w$o#DC2j|sivS7(5M>y`UJe+PRWukpxB)hGHhO97074VHK{XMFmV--TK z>5cWrL9Rsd7Dv&2s$=npAiRq?81&Z=^Jim6RMNm*8QQBrzfAm3g_)6 z6ENjK@TfZVXN?*PLjLSqb#2z3Fm*VZ5{~SzN%+_d%pJSF!~I6<@sYA=#5AQPnCQ(L z&2!{8qK2L(6g{Ot?yzGem)3OUI(F_ij8-+lOttNb3;Fu6SLfv{2>cdQV#V`iCC=%! z`UC1~O~f)$jaZp8iw!(9L0@-*w(nbK24c;Kd%jz|<}~G{K!g87Nh6G}LLXnxut&lKjGbxJDv~-G98)EeSoq`H-x~A2^y?MN- z5A}~_d?a++UhGTU*emy?l+b-Cd5yDCmkv^>GwIoeoIPaQ&b_^ee$}K0gS+$B3}!(0 zW~wlw4i0h^vK#Ar97Oy6Qs&lXJQ`zhtdXf~RaWa-j#6evrM&l160!wuc;Smy@yH5`Z)k*6*g+%gL z?1uZ&RV=P}(m8WvZ^}eAuGL|b+@W&iGZ<2btDMT)86(fJPkivVSs)8(CJm~H?!GZbSx=E293Bu}Q!(OTx&B!@Ca?ytJ+6I# z2TfkSH#uZl_bYW@uBp=-lfHyO|B`Y8b&q@sgvhry5m8aB)Df-_Rn?E&Fx50c+*!j= z*G{jQ&fr=wu~62{okXl6QhH97(IAIn^+<)4>5g^NU~diI5Ry;{Df>k7n5ZAtdd3IU z0Oe%av|=?0@M3Xd8dgBzb*B0>vZ!v9Ds_hbw7jrTC3w3`<=s7u)Yjq+cT--|4HDg{ z?&r;L!t&`hHH37ayk;MSj_VOEG2Y`ZI^XxDzYqy)(AVpZjW?BZBqteYE>3io=No!* z?EkCXDIt8eV{yAL>H*X-iRg&;leo8qrwG?4^>0b+HcxZ4#oATT5VL|(7yC07KfF51 z*x9LV>B)`z)fg02GBCOLYk0fw+j0_T+_&tKHQd|#7Kee|;L*{=#-rVX+vJWRN9C^H zskYeBsQ7;kPq(=2Pv;(CJ58)uC+vM|ry$46Ph#R}Ac%4PviIgGoS!$fenJxsI{IXp z-rW8`^>(YcK(Kc*<$GC-jhx!txcwkKl3zR3gGUr>%SjvVi(;y|X|8yvKD!-pmdDgPqixgh+0@@?me9C9aM?e`$Hsd_)H;GC=OR*f)H3>oaVWm~ zP+vj061T!dFlE5SlT*3IL}yN`2KR6o^D*U)!qtGuSGr9&4L_w@-x!!5Dl=RiBNq2z zA!Ii7sGTtv=ES3X&(o1Bh<`H+J#-&g_UAD?9M1+$Enosn;Eb=s|IZR&0%xy1qR|pK zb(8pa0t}Fv5`ewD2p|^N97h1wi2)!M*sEFKtP=yEX6W%SU_J;2LV#`eyhPMr8J+(T zNYI4PUrD>)B!vERGJTQ|I<;dsn-DtVmhg8%2n4=hslR9VUCUuEEbmqLjjPYYQPlfh zF=#Em*BVGE%lhUtY_~?)xIQ~1I#u|i@~R|*^?d^>gm2-uWpVeq@6kwd^c|I&Ld_9} zEiq!3o!%yS?X|vDx{Vvt?$uF69x@jU$*Fa`-(lPm7ToH3*GqoA{ON{cYyLxXtFYQh z92Ba928AQud1)|0yv(s8%~k+1GV(_rJuWJjm^E^xICRr$K|Nk(>RDcN^+)dIq&gw# zoezZCjK|5GO22>2Gg}#?QV2I#BWjCnebUCOYSRc3lF=xtA*xHFZd<->MDajy#7Ffu z!coC4CE9j~qOpTmVFS9ME)Bj;T`f<*jZPL9$h=c_|BK09KaaJADf`z7JL{!Zr71|b z{f|VjndiM?S0Y$OTbxav=ocf6*yD(QRQTyDfcG z?-5ux?tL*}$#`!-X+>t7k6uWGu(^Zv(gn%|M4J!{N8g;r07KAMOXb8;7b?mnZ2G zi57`e;|{ZygT5_9niW$ISGdt}c0CxiZCT++#&WxeSu#D^))Hr*xF zuWg9V|5g~Zos64HvzfQzy)8Z(bWL?1{dngHg9}bIjiV%OV9% zOC0~y?s>5=3>U!P3v3xI0Bf#r@mN@M1=v`AD69pvY{Qx>Tp|{R;R1*S_SqAF^;Wn< zEDXa15DN@`3!Je~02~|q=f%P>T(Ir(L4i8JeuiPVE)jcyam5EcAOUO__O%Q%2l;?6 zFcpBU!iUv-?kgR(3?DX_@0^Z?EyKS=EDUrC8+(pzod9eZ{v~41z=0Hi+5o$RDe4FS&Xq|Oxj|Gksq<^%Jdyg5wGpBmcGa7vj&EhQuj z^(_qy|1y!VeQIN<_XHc`woka4oaM08l?sYAmuRg|k}|e?Mvk)C5{kHYLs*$gP<=IJ zvRIU8SOkxD-ZX}WQfAoExN5KH+s*FJrjJJssDZB{cIJ*~KSEx-2@q1c%9E2W_gNfNl~V$>T-MO zlO5EE8&CAFgc&I&OA%%zPcmyd>XG~Xc!*EMs7sw7zt7$3z~4U{O+xneO$64J=DyY@Odk4;}k~eERs$Pu5Ua#Hiqf^zPYI{OX*S@ zPdpBEA53S$5>yS5DV5~b+~>6sdBQm@}m}IYQJnf_bIjY*L1$FbNL?VLCvD5XRIpmY_PfemSMEv@ zK&lxf&y~Hv8&zS8HZqbof2S(FDr6w2$}a)04wTXQd7=6#tIPF$lxTsewGDIlMW(=h z_vtSwSsGTwS!TLcPu$rdCKwq05qD%DU!&Wz8`x=0W4Ry6m}z?^Gg$4$U2%v`dj=Av zVvsY>*frbtFyT=KRr`PPrtY_I;Mddcz+eneT0}OJx6+Ic*t{uukYGybuu%d|q59q| z370@Ak1(=Vixu?59yb#G{m1dm$tuiRONk1?p2Of^X;C!ogHly(?&o@EACI zpI^=}H>MR?GAv13QVy{UHTqX|lizsYM-qfX(J+Uz|E8v#UmNWcgwmXd7MJEGlkO|` zh<0_;v_kQ5V*H|2v^?b}1D0tt=naw8MU=L}gZ&20uFE=B_}f%7hrP9L7fb26JHEK; z#`-vm5EsAC^nGt=eQ)U2R{|xyfjCF4b@M?n+1qj`*rpmmZr2iyZ!N!8&T%VwI97~} z(}+6m)~PGefId4{jrSa{7*&LnvW{>TVxvn7BL2YqklrFtYp>4KLx(dRt3C$TkTg`( zA++6Nr+jc*hGIsqn=zVZAXVXNOyO4E1lBajf6-G(%p@; zNOvQMbT`rp2uQa`cYaIX-+T7fwb+~YI_G@X`GbGBxEXUk&sb}YG3L1M!5lKMfinGW zWm=TcL+-}vJhWwl-HmDfq%!r;)gXa{7PnC(2)i24!%Rx-I=^@Udr3%rDJia(Db<+; zs~US$CR+|p$dtf;y41dp=$uCOrP}UlgfH>D)aBdgaP9h`@K~sE9oow*Nlbc6DtFEB zO(LBw1aOtU9|UZaI+cR^C8X?H(_m_lSL!unCra~%&7%C622WYD3vfF7_yRTY z+%4ga5~E)&stsu_o4jU49qFen|9*tE9sLU5whsdSYIw zX68iwM8xpLao+AZxvcdj)NbqNh!cFiSbzi@NV~uR zF|b`g>;e+|yZ3>#%K>`Q2`?~f6nMY)2erRv0D$P~uVDITxCUr|0x`nlf7PabMpwUB zr+-FQf6z()j;;XV)dQm|^=Hv5T!<|&ecp>>On4P$I$ll+IN;6$|Au9}dlrp?bQ=Ta` zP)H|KprqA7R)OZ`?EF;6AOwSUlR<{9i5Y){{_}W@72mo)fs10HphC&Pb=aj{1hTHu z-K$XfyK>=nw1qGl@mJTFN(n;w;WU$qYq3m*^>0Uv+fcDLnPsM$lwY?9jF_WWc>w1F7uGZ`lx^3G)R5Dybqwywu^!Sjz-(0^X;!wFt1X`Osowl$p z?6U>;@U+c-GKF@HN!yKpWNc&j&6>iL!GZ_AucBoxyRe9n6lFEd6fd>8BvfwBFm=SZ zDmrQgaxi0diC;d~k{>_{#x(~?MK&0Q_D5ME4P%X_^dov$J_+yk5FRtgnt>uG7BYFh$x;0^3a-!4+0mX466l?RX_3&QdGs-*mE zxn`nnU6A2m$ZjIsuqLf-=;doR4hDu63q$Z5=5AKJwwC(bdE%xNX}*cF%8jEeb`Erk z$vP4F$rIc;zi&aDgJRL2gg}Ed{hsss+wPJqek9nVAaPz~iTqbE+Kwdp-PT5CR0qB* z;R=ZAF9ln0OUlDsdilnT5(|APQ_MrFuP`4gElZd?M36`bS)dEs+gV$FEhy+R%}@T6 zU^GdD)YJZ6uaGqYHgRN9tIk>J<>|huR-~;-Bhoxo$H~|sGT!k^m_ZG3`~ELika3Ov zWzY*B1gxetA0=*{Iiqc#nn`J!_dxNn1U$p^K;>eGPtT3hsTs7kjcGHD$DOdzoT=<` zRJjr=49%=4pyu1@V5r1bf4SwoXVdpY9&16^rlOG$U5rV}=klOap{i>QJXCO;~>o_h4M+Sililph@e5D%Q_ zyAo_`JUj41X}K3;*Y|o&KD)vqTQ`)IIZo=iBxAk!^u_K{kf_r{2nNQ@>@f(Q zqW>Jp9pZ{@?ZVblhd3UGMd=&7x1%k_GlEdeNYxjnwN2+!1Q%aVQ#=sIdht=itIu4b zl{Pqy(afloj5~s)JD--#J5kdgxiqqmZJE=Z`Q#8(>%t$C0FhrLo95bICWgd2!m?y8Yt(q<>dG}QK zh6=94q{peOrKdf=yP1rRsP@o4_Z`GT95N>WLmM$O-z{x=^?E*Hfq?lre*@!HREyQs z_VLohbi3P|$b^vz+w-cM1u%=81`N<~!5{qg2gC*cUU+;!Ebzb8mCOrFW#|3HjDJXA z0Jv}YgS`s^drx5S=eR?_Aq#95aAO4Oumh&D17kUPKvL*=If1J`Kz2Dn%iZw;Q`te- z1wDnC7nsTp0((y&1Ux_x1QyWk3+h<`GueT$9QOo5z+(V`vG)cBz*Kf%@O@P$;AwvU z0Q*NI^jFo1>t}5Bn@|5sqw`@^CqQR72OwHu2TWN5%o6)=TIzoVHosM!{)*-PLtONC zrRir}^otn(XIumzEdTrG?eDmV?VnVgR=7}q#zi>C%I`Hx^7U&Q3SN#s+NBhp`d9-a zk!|+UtUqCu;c$;1W#Ih;lr*XkQ5<`xs|S19bwf+j`NbJ3VkvhLb~uS{084MHcuXKF zweWi%24rJ_c|HA4Sz^0yD;^CHX|#K!xAC<$DH;_{El4RjsA6=#NvD8UcFYgX-M_jy zT-NtZ57bJgs~e|M(RqnAu)D?2bLos1ji}U@oLA+i^KyM#BBzg2y7XALJwuGuTcH5? zY=`FE1oHR51g;{h{h0bk+G=jKsM~ExR&lrPH!$_+?kT?!lJuiBHh~)qBt96|h~7fy z52Uhk4atJ9o^OxJUUfInPr+2iy$A^$ag!%ubVPOu&)+#MeH*Q7zy5W3Go_bN31N@C zo8VP2DT{rZn~=NstK6XCHF0uF(E;R2>OHpZYsSMPt6*A)nhBf;#7PWmvG?V!6*t2r z@J3Rt)&hBSUS1>2vE^DoP13MkE^p7GkN4;nz<1TdhX_pV;j@I~5_mP;y2jT1iFJ(|5O z_}Y7uVXEKWo?bouR3;U^w?38wj;M_@ZXS8;l*7z^#8d}vstu=rU4;7XGhQ6bF{NxI?kU z@;W&UA@&xs;}6Z;6}RDbuI{SFka=H9x?R=ac42#K8-LH>Go@quJ!;$lf2T^vtA3mF zta#@e!}?j?@}Q=Kr{QT#Nj+a2X0MdqQXDT#+_r4UhdvSYJJGZ^M1E3|^&FWwputC< zj|T4Y`@&;{Hy#35Z$1To7l-daYv8xE=jSDy3)txmElNbADUHX5*=-W%+N`@uaw+mi zt00DnKCNdVx{{YMiQ8)@99Co}%0_H1kSe3;s6QF1FW5Ld+Iq`sAa5(t)k1y>mt%UX z10J2!&-1p4f03Ha$(+yG?8!4)*sRN5I5HZx$egn`hEgbkowlW|d31&7M$z4=RkE0y zG#QA;PtD`vrG9)&2#6)#%d={gw(Y-Q98h({ijG*ZA2ADkHGPbqxRskGNiI3|6jjU3 zGbaLrLjRWjfDhNJ{Q8BZ1z3KZODVF5YT%kfcY<0t`kHWQe&}|TQ)$QvxqD@O~>nLh+2O z@RoCgD~oMY`Y|@3xnj<2g~5ZSHb)_o-4(2ua7SEyJ?dY!;*ol+bc=LXbYTl7M?7-{ zIw}L4c>n%Y`u|!~2GAY)_vQUe=YP#I{p|z;El$J>tP=tPdrwsM=Lk_yc7F~*0TpQg z4*~_Y%L!Tpiuczf&wrhkAoqK3r18hZPmtiBLq$L>`cJWszoLa-gX4aC*8ebCU;{Mk z{G^F-0O~=2DOmqCTKGc;2T(=%D=7UB(Zb)Alb_MTFWHelqlG`_#r;pTz{bV)VEUKz zn^`Wb78kWUn7JTXaSkvv3VWyJt~FJ;oz%_eBffG)<2kgIgQ|P1HLxB>6j=0JIn93F53FovjS- zwJE5=b02d>%2G`RU-8p|EyG_!@5Z%Yq*b)eFL)w%^`2$P_`75wJq@6zgghWVFWsyz z>tLYi;IQaWLyM2zf5tNL_~~ra)3fUh2#i}1(#N+hH!yC6?kKPFVX)=WBA=Ggo4hEE3N<$<}S zLJT&-dEQJMj@aJfL1ZoWQ4qjE$2b&cf6k3hgTx{sGLmy>p+Wr4!Y+(kKA!1S?S*D5 z=((>H+N_P)onrK%K?6bQQQaG~nAEoABxc_e6UwJSB?7PSkl!Qpi{6}b2UsUUQ>ej6 zDt-O|mlAU6W1valOEd7^YSxOJN$LgZ#g&~|mWWg3_X~cCClEzwKH{WUn4hIQAiGXf zMy3;yQs*I0BD!q6y9D`__ywI!^QYBfOIZ67!c=97M10&3Ul8Jj_i#W(g`sDE+<@OL ze#H4wT2CwVJx{jaGPqHjf zqP}P-*HXVz8-wTi_}Iw{UTxG4RU)(QmPM_o^RrsZ_bC2xmzJ366atG9t`6Cm#V1{R zgkB!7-~&^BBp_h@wQxa4Fgqerb6f0b8(<@N$ z;Fu$Yq{}JKb*1->m~Qvizq0J5%=O!iwUV%Q%hV&)CFBTb+1XTp>@U~Ga)^CvuKd|E zc@{Y==DpWkrL4+@)^2g^8zJ*A^Y!*+vX*s)UUd{q$bp4tn)zqanE<-}tH72*5j zS@Y-;Bs5M!WCB6afni&mz-%`gUHM3ugV637Oq4Jz+SGL{9z6Cdbh;gceqt%yKEDew zY=@O4tKQT+UL;xup97)UTY6|D6ay&;g&2R8;X{9I0Z(Mg{=I|Jo(h=DRBf$b%VDoK z+NuW%dzWKZ;GMzc6uTQA2T6wXbZ@iKio1vlB#CZ`i=uUH?TZA{Lnd$NRUb7j;a49l zd}f?G5J=g+2oc;DDY~Ze^QVPDi5x~!Q&QC9;SR`nM36D{{l|$e9y986h4qQRH*yw* ztrg{+OEQA|`hDNagu%19gE(t3hzJQ70u1aJC5}0sp7~2$Uhp2Jv|dPlmGkc#^Pd^i zyM>yLXQ9r*Gz)J>+Vis!#N-*DIcJ{FMZgSVj53yY*<-l>P=&-89u8OJ-6wIQ`l#1A ztkYsZv57|?thL+&zwM%SF^gC6+74T#sE1w~;!L=1skdhwU$nsCxF_@3TXkBt9@mCz zr9fL#qpFw=?!g_#-a*+2KlRp9NROtA zvmb9gViOk?qoVn~P#u=>x^CXdkNXk2s(IENj|+UrB5N*#3qk$!;p zmSjTE$2#8)9Jii!AfIlr3i=90--cxrzabd||A3N*bDzRGy(M6u@3Fgt&X?Iek)WYV z$i8J_Aug3>AH-OehA0CMy4M}yI^7Co=6xhh+Q>;OEetf4&;p27bt|>TqUUFA9WA-B z;BPj;oaEq#ENN`DxSWO0Hl6msNha8QuCluedZP&iST)=Oyf= z>Lu9vUMb?DpFEJ%F-e@T5o@MBY|4&!KcOU>r&?uUouOoJvHgV)KEsSYuB=Vv=FW`q zTKm#)1u~XEE1%|bS6PZRr43J_DzD=@FOo#83L{pmBK2eE{WdvM3|-?)ft9Y~lt#u? zQ^dKYV^lA}_Cz*`s&F$?HUqn0-gi-yUL9Y8*eC&+2x^M3QVQpeG4!-3g3W{X1wt&JVvAX`Ts--seY$qaoZ^wcfU}Lu zl63_L)4$H&04IHn;&L@%*9;MWsu_AxovQkE5k_t6+BsI5_!W=*mW8w~WwltbN1_yo zEP6kg2{Pw13e@~iRkvTifJ@4wBq8pjyV+X+T z(-d) z$U>};4+Tj(B^!5X&Yl#B5ZPGR;MyySM2Dr8x8@p?J&Wtg={K+5MpqF&ca>)dR8iq3frnfnI<{;ZXlHBs zxY(YH6S&lfVy78Z(Vv6Clj%pf(TA(n0||p10oCNGdqBZkEcv*AqhHHZ)`x_Y^gCR# zy6%r=E%az{eJyYZDk9kOCd9QzdS?U`l{9P!P#U&OM0Qn%Q9tHBb_#?&Q|`;c&A|OE zWW^{gJcpd4_(HY_(#H+l=h-98Vay_FIYIc$B=9J%fbF(waELwFll?*tFTaLUV%TBA z2E!V=SJI6W*`tJ1*GFP2ib!@? zGl>?JSSIfk{Tu|A{FE-B&z2SMCD&TKSu_9VRH^+*q@XYMJP_)|vfqYr8b!?<4gJ?v%Tfjq#L16Dmwg46CKa)HlyZ5Nq^8TS0@iXTE!rq%O{h?L|63hvBDxeakKSWkQ zWACXa|4LK-mE{4loWGLV|B&VUT?hS{<@`;6`1g5Cynm>w{7;s{%gghytKtClXSP2} zqJTy`oSi(=$0gb6llF~UOyh%0+6&`E7NO3Xeadt)jr*;80u;QDATYq=mzsEvhPY+D zo>+6YddRo6E!BLBS5l@zT~WYQgEMuFPf|2f3R)j@M(@OJZoRf#B-qF3wnq+jYgCfX zN4ZnX_K=Hz{!zdc4|AOfMSSV3*ZHVaXfKYA7Q`GGVJwum7k!L@tu%*FkhqCRPIvKey&^=AIJMCDe4NBJSlX8V%p2S&b`m_ zTpz2W!NClhvo#kJWP*=$wFmN^l=QZHySOEhQ#B%jC%elgl~TzJ>b|FXF4QU%5{`2!l8P~W} zTsVT{P}%k)H+4udGqjVv)efmF--(P6`eu1p5z{w;na>&=D|CN+-5k?&q=Dhk^7LrT0#Y z*SOij1P)T^x~EBw9EgJPCr#nV=}YGl;w1UpCLSLB zy)WZqO@!{RdRA(dCHO^xZFx?q2l%I=+dXzd0>-OR_DWF?D&|J~je|6oHMqxyYTrp$ zF;zigiMPuV1gMvu3uW8ArmB1bA1%-mgzZYf7e68ko<;h(LuLI9x=2Q>aGVKX0>)Tnc&xh-Td8v7jem(&jUqezO&o9NsI~!-ED_$`M3_nkMiq4J@ zSkl$XtSU2-?XJ0AE7`=teI4_WM$Ot*(Fet;LU_Ag{FG-<`LAPhH~uLs04efl~-rYKixka??XjAz-N`5ZHT8Az-N`U@RwS z`B%WVEYJxCv}O*_5>LFqN=v|YIY4Wfv$6n7Edhhs0Y?Lf6AS?Uz4rU_2m@L*JLn?} z00w4w0D}RwInb7Y%ep{dHoy%vXfQCx0|@*Rcn|uIW_(bazDLmh1avWgd{=)kEkU{%C!oI(H25Jd z2Ku@muPJTIYR;Y9N=janRU^==6<-h5$;x%;tl@}*Is6=u7t zu?1c=ue>7e^%k>ZLLj~1h$`AeNrHB+Ye;KZeT!SNbw61`mluwI(`(II+49uD;M-JOxlOUFqS5pN`Xen$kW=OfnP*#j z4))@a`eI19;@$ymO?dR4;fF<1&%9TObsHJ)Ri0Q>3u`?R-w87((6Bo+v{epAG;GIm^zFr}G_mpE_Y&?N!=FRzhVca8kwwA~uDSVhzJ)Ps1*T);Hni zGc-mt)SxO$m@X7M#$?>y(n+G04N+hCd|^eZi*QthqH@99 zf_B(QBvpimW9G?MCs75m%a5EV3oOpD35)H^UBDS{v~@Axj(&QbA*Xzts$woy!`{1M z*DfDW#deIy*(RPUkOl6l=VUGrCHYlTMo7)6DW#9@HJ5_}TT=4#)v}r&xaDZkgdGWE zmG%MPAMnHV7tnV0EF8}8d#~sP^WBVIOmjz)^(*0_nh&B{OuhecWlKbR@CXep==(Do zUi+^R;*WS-a*{lz92SO5HxDLDvRQM<>M05cuP^mKHho*eN``jZmL~LO;8U|#&!K%y zRxn-7-rkKZXjLZ#MDOhT6KkhZ7^PZ7RAgYTPQF6TPGdE}VVsF2_^iP7B7 zHeDICk)lbgp%gVTX-A~KK+-KZy=XKN2;Ru0Wz%dz;O3Oslcx8)3HB)}4@6p?!i{#* z&fc5HiRQKJw=8it5WP{uRW_<4sRAjxk&CZhC&Ikfu+0)eKuc47!~Ucv1>w@DRd5V9 zAX)^unD?2IBohs*#GH)Eahm0e)@n-&GQzdM1FJ976eT6PX^FnG+7ZRMVeWkXOvw?4Jo zAH6LLjB1H})jw=yA|v7$J^4JFUBu_?IGDAD5{6RTYod{*jjvsJ5C2YbE&iR6^rXiy zGQlDa+mLq?Nqa;`O}Qn`;CpO@Ssx6(msc_NB8^kTDKlbVPtqpgVhf#n~>=z+ZoZb3w&bTVda=nZ=z3@MMa4m0TgB|d-=@USEkuMU*5q(p2^3sIY-$k z)%vGLT54>N9C__ZcI@%Eb_IsnJuOB zo%_*|%W4U)$J9!pT`M?;Q41-+fj)k^#_rYp?j)(=v(&fZfCiUOsH?uBrEydD^UJ}9V7#7=n`xx#MS1fMWt zlJ$B>y;%NT!`%@Q2IT4oHF9Ta`h+>r2!aIV)}b?z^uYIh^W3zFVyWyH&BlWT;?lLN zZE1HdSLFJ~MxLH0dtjTpj%py2RY2VHd;I-?Z1p}Ng9r2z|I_*@V0l16I^cIe4VR!R zsDQr&iqb)$L1(Y5EWk{EP-xJN!~irpwIx$IB4`Akvf3c z4E)qM0nZjR8YmkCf#v``^Bb`5-ventegX;&=>G+6`*(M|2Yp`>{A=3EzfyyH&;U9e zXxk6*HI94V_d|S*9gw_$v<=Mu2l3R{0nJ08(GT%8c0j`rX!JvTjU6Bp02=)eUtR0Y8HL!6Bh^z=Lc`XSEtv#$>1 z%Ks490bDWtRr>f3b%(#Nm44M7{uWjLz3u?8_U|tIKXnII9*zepXU+Xf?qOP|KRf$8 z-vSC;c@|EW!e)_XsD0R%iZ--J44#6K@~(w_VMjS`VMD~{l#{=j{b^t<#y;fj#AaMp<;lNf{(x1Rr1>@V?ket1=WUcg`eP%!;Ka+> zQ{C_WavHD35L}OSl(al7gkn!?QXWZVNA9jBkex|=D zmQ~kJ?ys<)$rDDX@rj=K<;JBYQF>5Oh1~6j^5=4m${J>prXBMX;Xi?9p%c?N46BM_6J=nBwF*Gf) zbw-Qr)k81^bkZOMEbNes?lE!D&bwc|{UMIQ0V5&pEaAGjSyAc4Y4V+`@*s>5idMsT zwYYhkaXbqC}v zd2V%{8VN5 z$~25;TosTwgq4IaI)B>{1Gkm!3j^pCd7M}#!<)R6nINuHUb%B( zF|3OW<7L5w)%vpP6ZWLZ*{U=eecsJnr)cAr#9i^#sPssyNMZ_5q1;f?g_z9Af~^4} z;bUF6$z;Q^*X_viA>XpMgw$t!yN5|Urbu?b==CzmLIvogGlmq#uZpl!5*1oKO*Mg} zqsZ-0enL4Jh+XjjBSh*clZX{=92`9kC(lS$ z9V40r<8!85+ik>^;;ziqfe3aJU&|NIoFhw-ia&gHFQE)Ios6QylNLEURa;|l(4+oF zzjv!B8Z7mWiQ{;x&EjjqE2d2iJQTj!co_RHqPz=iN`V+uhR_Tf9IixRkGi3>LfI1h zO;r5B)l_rmCH%kLNlPcSuxIdNu~;hkc~=~6BEjvuDi5ZCYG@co zLs4AEqsBgbYG&gnh%25H7Nvqh7n+%G5!9#f-h9a9aA9G9o_v=h4SlszKf2v%;~|8< zGogA}iJp}=TEiYY&KPjY9&|*Hm@%(6pd7SSGD>_|Zn=Is>izQF59(DNpUCF1Slg%j z+XE7K<@_Z>wvyM;cz&o=^URQEC zdF$phL4WD@whP!SCoA$Sl={0Dq#S&FnDFCVenr`ddelj2)QDWxPb7kNusYh>Dq_Bs zjZO{;*IF9{Ci#3hBpOWgwT#Q~9mcI-g2iYX<>h}ooibBo8+i*}IsbwMoZQpdhoZ`~#>8(e0n*Gm`*gO9P_&B!i~pPBJsu4-d(6_kFCg+)$Dw43TNdJ|}Kh^n`|5p8E&! zCU-Y7laB@^Z2j=nGS1k`Ya<&tG3J&{@oQ_}2SSLuqF-O(VmoS2>cK0xa6;R7)nrO> z=M=m3EsImSE1v}}CIJTi4Prm`eXjR>`dbMt&$adU_ggYwKjSo}?Oq(sSZ!xr^kY1= z+Ioh;D8Wda%40>DdE!EQCfnei3iz%=-F>Qskh&=9Fo>dL$zhjdt70>=_ib@LL{(`u zsEgB(H-m`yh8xUTAPDN79QgnGv~6YyUckk}-(y$)c^3SuA^(rO=9jd>18#6xS^m&G z_!X%FqwkAz{~#HIMsosK79fKrfR@F-hd1}2@4M>)tm%IT4I(=L+BXN_avb!^e-F$+ zul#;A(9I;^{r?Qw|NV_|0NA&nZG%V-{s9_9asZ45gtH)R12d69t^8gzh)fj7Haj42 z25lQeCi)N15Aij2&=QHPEWnIp5c|F#{SaSc12iUp-uFX%?SAw_e2oo2ng(tAA-;A$ z`XRo?23lE$mE{lCG3d|O{pg4I+Rr_M-uSNu!T6z{T<4#)4U!6^UQ-n>RlyR&|HC z9JZt2nxdIjwL$5VGS3ILXKAA$rK(B|MBRCPpB&1k=9c#@9?U;l|{2OU}GIX$L9#hErC$$0(L6MK@9s(j*aWIiFx z2>Xm4FZZ#*D2{`|5~pC0JtPfkg3gd&@h_Q{_?I&v-liwj@N@2t8S)nQ@2gXtkW{CB zwBlQWF3;&VYz514u>SHHLXc%N%1HA$W`|{*vt(y7qNcA7Pb@p?P4R~Aw)~sO}E!?IU%PRUKb=bxPR}?Kv-}`SV z9|y#GmKc<3aC!74nus;JcAfW~pzwEhk)AxiH8gB&-%tl{bt*SoQK-fEo zQCJFej*FgqN4=E2&~lmbji_gSn8%?3I)%WXcTMk|~Df>34fJIcz5aAJ>b; zmmE#(ITTjiE8tD<^HJK;Bv=MmGMjqHkvIJbke++&Bh(`%9oyDalom(ja~md|*6f>@ zR~vU_AqT;Jsn5J@Q#XnJ6o5m{y|RB`bl2L$SjbD*_M} zgA|t5amV=GlQ_YZM~(9DtH(RRqQ1T-HjA0a8RH1+#fL>W*y+P0FUa#%sYrUW@~L_2 z6L-z%OWscrKXzHjq0~^~Z1^GXhIiH}4i&UMW+fGvMq|`i{gFWLK-1N zJ~e`_^Y1jSV9YoX)bM5TLrYFeiR@y~b#GWPkZf`pf?QU<3e&oUpi+oy5od!Ju#a2H zMR`5Bk1P*=mOL%rS3@1M0L?Mjg(8F{=M+>ChM18OlKR5uEdv>=GFoRGz2;PlT=HY* zS{?2yk>Q59^GQrbKEX zAagv>6!Bo0*Mm;TPz08znD1_jA>R6DDrM&<7MD`JUzg%UB0f-dsC&VC_-+c}5mPhL zaOhW$@OqA_Q)CM}-25u+pe0&%h6^P0-u4|`1-;=c9`a8*mDHvCHoJSf3ad-f<)u>c z={6{lHu~a0sWIrGdEZ|$c7+CpYPz8iAiD+W8YSz;orO-uwbo(Sb>p6jo%99`L|xj1 zM;G%kb<<9T<}gA!oeOEd)kS7#{y6KV@{KM6-*DxHwCGB@2L4%)momkkl;4zgS0G&q zX`RgeroAF&2~-?UXZt>3phsuO9PV(p-%L8TlR6KJDy@G7dF&wmOMbd<>FN%WdT0?m z(xh3G)J{iQsgWzwg~p5O-#CKBVF{dIra#m@kuF3p^|2T+cP8j&dI>EGUBuQ~h+>5k z>ncQQD4<+eAM5gL8Z1fC879WFaJOnd{53{>yL#%S54ou1GrQL8uZ*dMOOC-4z0hGM zhwOcV8S2+FOR}~i86w?C3ZJXM^w=cqb~D2i5n{9*NYReD_E&};ZN#OKjw&y~Fgo*F zlFDMlkgTE8)2rReQ41}gewAv>ki>Ev3}G`&?x*SCE@B{xVy9q}8E61D6P#IM^ForNX359Mqi)FX7Wm9bial*z%{~H9bOqB9w1cY7$(vHQ_Sk|6No^4+>m5slqI^@ zBuyzLDg<53l1f8+PbNbCn_r%bNuW0F_IVu?AX@6Rb}?ANha zrF*;@G%4R1FONNzd|H!sIdoJwBQUpf{$w^G1aX@Bd zKQ+Cd-N-MFi+ND} z3(b_=vg50A9Vfk;h-Rk57zqNZ?L>W%H?nx8$wCUU)j35NGVsq{S)b=Bjns4sWt)xY zXt|tG4#G}9DMD5$bfo!A@+db%4mP6WtR}#jj~*6FyumA$XizcCZA%Q=(ZPdlt&@k_ z4DQ>VQvdL^fZf@rnN)MHQVwPuWDSS0MS9lKEsD)ZhT^_Z6VDlkWQcO)IC5}v?~Zh$ zmuF)AC<4uieV?+Ix!9vV=QJ9Y+bhx>QW3B=S(V#Ph@@NkjcAl!9BDb~s27>*$xzQ$ z$yIyB70)?+Kvd(`LnqU<&xX;5XAG;0d)$*Sq``fLanMWX7>JX*?TRvUV}BQ=oVT%h zm^PrB1j%)P5p4tK-fSHIqo{j%QHz8N9R{CeH<^{MXL*z3#SZRn@98Jenh-T{q}v=u zGPi(7Dd!v`kN2KbVQ4{(&!lAcN9*13B;hR1zRAArKZZU0Y8ok{05m zf-x3M%1%!A&o@8)`Z)rpoE-gG%4>U%yh&bh9kKkZrRvuR;5uzeq3^_0!lmL;A@j~l zy(SClc$t-C#1i~M!r-$Ctd9dd?6W@8ev*Jot4rYW&@(W&@dhK`Uz5J41olgo;$O+o z1KL3Tp_JS|FM9n!>H3u%{?gR=_Yw*hAhiIQ*8U+;@lVkpN(sQW0e6|8ZG$LV{R8yx zi3sSGbKY0B0%i@evH;n>9}S|E0F1t`gaXVQ1ZDePG>B3Hu?qfpeyFLZU5a$!Nv8!O3RLh*3ZcqUfhd!EYX8>#`S~G#Fm0}k&M)#RsB}zVr9SWyg2AZ2`Ckb0*K7&DYn&qF}>zl_s#IQ3z%7pb6P8aLE3yO}Cm`pZA+d!4;F_xMqS{ckh+|se&6n$QNP##9^jQq)nYvA21K5QOVsAJB9BK*>9vcWSb8=#F_4<{19=m88mee$a ziWFwDqIUEbQOHa;T)N;F&63DcsxDN0%TB^srXDe0IcqaI=qRUr(qs@lH_7 zF!avuG+_N0c;4nwI6VQwBcB-%gW-MfiS31L%9xSeww{8Ih#@1)C?CoRK0>qrAJ*4H zvpbkoj2Kmjrs5*vFQlQjcuL5hYKT4-vP0Ht zUA&e6O!w4}=G_^N!pt%CUnJRhzntT{#2a~DjPM}{rW}JTw%)u+j)CEdD)U0^2C>*n zz}HnLcgcUZ$u(kQD!La{wz`{wT(@Lg{tYV|P? zv)pNnbnvI?c+!Yhih7(E?~b;jmxuxv;+}Ho`g8q&{H7Lmvl63sM*SgWGPC*vPVr{6 zU1!%2Y``rPEFzyZ!6~FeX=%v20#C37Q+9Z|zU{Z2N`Cg%r=6Cm&FaiY?>Krf3KEX6 zMG(-7Yus^)Ok}yrTPzr$-yw801nFpC*31Ps9*A(x5zpueo;v0!*u!{}#iFZdFyNm? zLUEq*dJtA2QN!|KPn3{gcJkP_+@ zo98@>jax%Ijl-u6N5y?F#uL_~xLzmz>f?o*6gp|EQ???mK5N}O*y$0m>h^L0r!g*_ z*~yDTv7w3Q?dM~U_b50=3hFO>BkD*ss;RTEKjCyw7B~|V7~8wd9u?>6*#7l0rJ67N5rhl>SOwnxsV6*+_hUx+3K~Nr-E>w;v8#K^lQ0CcPpSBoXz2%D+#P+bktjM`HkzqsM9`!lAMn9=IJE~g6dA7 zKZl%?_HO4FcBNl^@)>#lyCu|4{fBVmBBW-?^AV#Y?()pBs*fU*f_+Jy*}@sD{bVsm zlHOF(&UiITna<+8uA zPUYTk<7Jg(ywi+okz)8-vL0%f`1HH#u;S~ew>BD2Uxx|lNqd8PkD5z|?~&RLjM40U zHMd!LHXFg^*D0D+8|a=}J8`;va(KAB01kFgha&e3G~@$rLmq;@rxgJZ;5`I=Pv0sl;KJ(9W&#i^zYh(}*#)(4 zK;#7~Qf37v?Seqxql*Fn17C{+ulycmaRB=Fun6=UyJzSK0R6iQ-h&1$feAnZ=dvJH z4&b1GergZ#HO_m{5Aih)fOT_I`AvI{WTc#&prayKe#S`_YtsiJ&-66p`l|tSBv&n zcB?$5CjL!LaBaFMmP|a%*`oj&P&-rqkO$#$v9&UQJ5`kgFd(`RoXHzR;=u)_>7=LaHq_SLK3Dj z5>2Ym#1nXOdpQ8ZVIO$8ycK5-e>OETrIA5+?zC6jRqyDy;oqp-0_nY|dQ>xIvyEZ1 z?6gbgFu>^LOJHR;gCbC7hGQ@OoC0e1Zn8Bls6E#x=23N+ee!EM-NL?^P&bR`g{98I zHnt7cFVa@^v$3$3CcfWIT=b=lG*PH9#E25)2#P9t?G|0=2`;<5V-`jYuR*Cxr+B@( zYvFm*xi+%rH58?og)O-Z7f59mkxe1b!{ZJ?^70jxp_d`~`qd=0OCWwu3FO)+l-CRT z$d%zs+8PvEW?2(gnq(r8)*Q$vA)`+PT2|?rwwxZzhVu(XZH_R-etyps%0*yK8Ew_w zdczl&B||5qPVs4aqq@#B*7Jm;TH0zC{pBbT@Pf?ik%E%^!3u*Q{!FszK?I?}l&RErg?soN#6HXwuQ8a?T zv7SwwK@lh=hezk{cA+&ko)izUb+c-+RU07l^5U(w(Pbo~iWoF(OR7 zIUO7GyEuz*NS|>i44`YJ%X|b4Hqi%Ma;s4p zJm~Fr=<>s-HBP*2A#(s-=_*UEaxj5{kkw%q>u5;keubAP3zeQ&hO>hFttLG+xi}C< zak1QO&yb4Ln#&OLul_&g-a4wvZEYV0rKMYx?uNDK?ha{GLb@9%=@b#9OF&AxySt@J z8bMOJqy)Z&d+&FjEo+_Q8Sndz@%zuAUeBD*T=SXpj_bN_ZmM+7=mc0}B97x1+*9&T zf^A-ZnevBP;vu<~<~NpBbgYxJR!W(D!i?05>DY`Ts^Nttk|A{&eddL&I*H*%$dlg9 z)$ml!m+dtDY`gHtx6N^(u1OUp=h4$I#r#IZpF@SG8mt(epAYI8=MSo;KC9X?Ht3Uh zV4ug%D~i?$<*+mTwxNOE#q3nyEQF`}EV`Nr~Q~BT>@yB zVw*pOsQ9X6VKTOid?{5%83}_EyM$W3b0u6&KA$(|6$yKU7H7kozP<-nX&h>#9VYU2 zs$yrgN4{|_B}ULXjTxKpe6EU7r^nYHj%O~)sFqPb@JIBggwuG&o>c@MIWH`;-P7aY z|N6-(b}z*Kf!wz`e2GJ}F(lu97%e-W-YlUp=;aH3;U+4UmBA=nr>-jKj5lIqh(ka@ z()uUDFGeO&UK;_}7;QBxrdt^I@BhFhm_cLUUk;8`5;&|jhSh9O+4t4+aKY%rO-W!) zF9?`iuO<;T3F3HMTRJ7D7vS6+btW$2ER&=o?*?COm^3Thw@>R2)L^VPim(WzANR+_>{Zsb>HuO?4KSK zoNOiO#LMX+$)$g)ztd(SGxl`K-iMo~y@6TY!)v%?#1d7xc`V@x?4ZxpvpACFiVBQi z^+@5j%z=7+hz_JWK%`I=Vp~*8!}M66DrPtbtTGEu=(2S=h0dBrqPMPnPZ7h1`$V3= zG1^$K@_p^fsGoeEYr#})GPnCeA9zrsifnh3aJ>4Q1K&wlf1X2yPPNNiJZ1TzkiaQE?MMuqbv9$f*-NH1DGi_8!&6jjK60lsGeZO-UHTK#eJ#VT&# zx15)}wCY&Y9?@>BkJ=K7LZbXLliMm@Of?RC*}!XE8h58qewgBl<&U{G!%n?%{0QAE ztCv<(Gt~8&@}eI(EOBk|({y9zAM6d7MwxG|cv%T@S-K0CLQ8{G3?It#Sef=d$?=|X z6XaYN;xpT~pPhqst=hKk8C%mxI^kZI?|1bR<@RQBo%CAuVeC?B*A00a8W3Sw58q_WouY^zlH`M25)F>CiX|CXX-YCYHlYo7-@@Ijar_whf{CL zVqA03lPjgJNT}RBmeZ!@`+fL5Hf+MnIq|j~ubY;fE_lr_&sqbjoGZ6wC!bIDnY*vAe`bczq>+75u3tEkNT*e6k1w}zN6WO}lzCgFtml_lt^1kp za#x-?U;(e)-xsufG>2LXB1`UwJ!n8>P%$_wyI`|pJ94qBo=zMuz zf1bZQrF;bN(*2|@J&^&^WCgpf-RUR2uJ6L1uNa|SX)h@J#>nN&*!$WORBT`f3f33a z6hb`XXB(owlU2VF&-h;y8~9&}E?9r*y86@e{VDqWhg}P@+`wApU=+HnchTVcU4Wc! zFjo0pG$?BVc5E;TT`*&V3`+25Fwus)V}m?B@aSLc@LTWm4w@a5tp$$;;{o19gV@vH z(O{wtchR6C0pQVKJixnX2pMEh1JQr_A7J16mW&L3Y%m_+ow3=#*Ubg(7BC**T{MKU zgREf0MR$L(+v03sXAVYO1O^SE9vv$faS<3a0K%$)5f_0$LyD7t5f_0$LyD8!ZEgr= zp93KjE?~Xe-VhubQk(?zTl~Y<1-sXP5Q;tCMgo2V4Jl3ndg^bWA;n3+h>Py7IS`ay z2fNqqHaY~eY5-6*K=A0_IoBWwU0ClnI|Mg2_zsP%tYE}Nci$TT`ewn;{CCbZ0EB9j ztam#ef|)rhq!amPcf-H0Z1A@rE2Ptb<9GJj?K?ww@!#2O>>#Qa*kuEwE&{XY5Gs7K z{*1!>{o~A7aAKI1cE*{V5LlCrjZM+0kDt1pqe-=)n?ZmX1dDB+L?) zdX7e7Mg}&9Mkq+P_`j+QO9dBzI#AF4QC9p*gw_ijB^y1(O)At;S-(P?S^c!0ib9cC zE$IbArERZ0KAK*g+0sjI=%{7nAYl8u#eT)3&6W9ntY`gkW769$rPNwyoeJNANgUfW zGkvhUU4Y3o`mi$}JSX%g+Ty;}rNyt01s`j(-`qzD@FNw(-|=t4+Pu$O^WeH!p8B0~ z&U5AyGTPl3h1F-9n#Rw6>>*!sB8d^0q{d75U^mn3^eG}$xwjC0h@tPiKPc5Kp6gRt zu$cT6X&UE4Oqe08$mqBI{3q3{Lr#u4ZS&1TUR}2L9w{t~1!uV^V+haX4qJcQh)=KW z6oW~6y~xLm9sNL~#SPo1FUarYd|-1ZM0d}4^Gm3S$4ErbpqSpb%nV?n4J_cn!!bQU zhHr$Sy0Qew#Z7Z|C0~l2+Fs9lG;SGqS9%+`M9)9inIhmYiM4F}2z@j;Y#Haw@S-uP zEVP_DetxW==;=$P;U`9xZFPqB1T)kGyA}(h45kcp1OS2dxf6}m*%i~BGdrpC5vVPH zYkK?kE0|h=`{>3IuuJY%VyNfRM)!*-M^#;*pdQ$jDOE=lDAlm6)+A-jHWi3zrxmzk z>{y2Yg_!d>`{G_X@o8mD-!p;Di7=CjrtXEKpbLkc{Umc>x#8cC-%C3ZZ)FopnTgg^ zMy)NJt&U27<6+#u3M}%7F)(hM+5)yi*{I`+rNE9{b{Xm$lPv9v5ICqcwX?uIAUAn3 zD(QE&+_Hgbu>Xb5xncB8!4jo{O(?5P6k}@XxYy!sZl3FGdg&Ign`dRm!EO zpr6vy(C1HLpdow^D-t49BquBzjU1G~Aa2nvlXI-3+03IO|Gp5sM(v{q8!SF-$F|0s z67$|l@^qmPIJ)sd0v*d}vW%t}{xcpIZQfg$Z7=AeNW8@|yur>wwBoHHLeEtBr@k35 z;R}b6>84W+8DCgE`|Wu=LN`BM(0_>!H~miB9@*NNmRie~54Yi28Rojd(dz8Yn_(wh zeSffGZJKRT63yL`s{$vNhd+Fm$0k6Z)SFqzoU{v1V*7mvjk+|S4 zTva9Nvq#+79}Ok*>kkfx5_!`1eL}rj7CE=i$AG|>uJYr>95#YE65AU$O8&;~;#Gm$ zE6S?_;EE)=;UE?dMGIDZs?5J5wXqVNgYNp%6yp)kAE~Sd5*mbXI-Rxhb`vNPy zD6_5MJ!Im84w7$W)IHD?DI^kA(B zFhp`NXpqYd9u3AFzO&}+kX+KAg{}YNdqZ+b?>3(Sv)3THq+p2Tci)>0WZ;2+Z!j*( zo%aS+`-Xr9V>aGJLrSOK?LhC4hE&Io^_Sx0;P?4$J`wDyfgzIL zU2`C$@B5d=6A;FR^nHUNl7kr=QqTwtksJ&fL`?wy-e5v6ch?+59s-a4oxKKtAedkU zLnOaD^V@MD3=YOcxifVDXiI{dI^b6#IoJao5}Ng=gYozAaOgEzl%oWNHWCJs zki*m-p>E-nb}~k?$ijpnYsD%<)(wi+n8$ICKR>7#MYnji7JzMHtI|w_*L{L`r1uaj zp5?|WSo(v-ladZ4+z!()ucuGM!Z#QY*s;x0fttH(<>)0Huxlap^pn^{%*1Qu%tSvt zmh#6hSMU~yuSEigw9?HrE4zjoMim<;bt!ZzTQPdF`17g^Dsk=J0n;Ne&Tg1)GLbV# z+i60=XuolxsPf4~lt&$x^lP3>cjle4Y3D11kf@PM;=7#_?P!$*PpG#gdU=&8=lV7ghye4cSF-d-|B6k>6(Mepgm zqJnGp7$gyACZu(HDoKLCaceqxh18c^$Us`m%InOVLkyme??z@XyzdQq#E`~T$X)oe z+)Hoc4tjlt&pUV=HN~TNQH8qieC904q$dkw73Nu~5vBa_L3D4-Iy3$$ZI>jKW8lkI ztD?P$(9$kx(Hdzn?DVGJukV%W9*)M&O?Yk}WC~M13=r*I{OouuQq5|SA!hBf^zG{BceMd;*(6q$T-eh-OU>1i0}IM^1f6B-8m zt}6HTLc%AW$qTEqg>^gMzqh6HV%7(PW!eIF?&UMQIl?cq4jT%<7AM9}uMR%&4_V_`PilnMx zQ6*m1)9Tgacjyb_FnLH!1BvYZhp#kaJFpmDp*F8}wJ^38KYSq(PfmfiK%oAy;W4FN zq~6{FZkwXdzTOB~9RA5^Y#7aV_18ul1ez!=3zNLdQUhItjBzC#Z}-^4;-Md}ShpY0 zyDNMySfaC;jZ$i_RVdjCkxi(LmzA4sl#i$QA>F2>oJeC)TXMQb-JgdM$9YeHy!=wa zblgg(WA^g#Q%>Gh(?qs0PdQpNl~W|%EJot~+*LH}QfF=JfQ#?l`7ZH}9gFwwd+1WC zMz8)zsCpG6`>M;Fo?`k(+upsDj$VA;nczUeNSv%m!UO=~Or%)_@XGnoK<{&Z^^ZbH zQ(Z6y2Gi5%(mJbZv}}t4sIdl-hcknvj*-TMm#kM<8#z>}R`I^jacf7_G^mXH$)C&A zboL|HHC~+MaceKvtqMHsYY*vI=%vmsF|K0ul zm-oIK^Sz5^1$Ed0YghbI)&15Kyo-it)Bt`KzWLj*01t;$mk9u-X8Ya2A)|jWsQw`G z{o4op7NhXiiDUyA_dw82V`pLik3_ydY@@#y;nuqP!?62z*41Az-=EgiPaf|b>*^PN z?w{5b8-Vk71Hc-x4zpaCO`uLg(318R9q4Gj9dnbeG1=xO<-yT_!j%d(QN%=~5&pmgeg65YMsO#ksD}De{M1oA07R&x~3br425EzaEJI z-2_5gI<8PPuBMLB@#^BB;PtA?+sJV>11>pCsJ$MN*{M8Zm+8^3UGI$_TGfmZ9pq2s zYB_Gy!r6XNfco;_`S4;1<)}FW9@NNp?+Shq-K6;O#W*DBWBkn*F$IpZC2HnnGP8Y~ z@q7<#x)N!;F!^k zVuuIWNvV$H9LqCAG*~HL0xE}2$@((&&WFnnm^utvUiqH$#@;_Jeh1sVK@a06oiBe= z+VP$`-n?%8J%JI4%{9~sCpi`)R^iZ zhFupV{isLPbJ*uQsF(prhiHpTEzrWWo>1iLDA7h;exH#&BHyHCpOPc|ph#7QBQ9)V zw^i$i?0)b}<#AKw@>g?FjiSpBeO-R`bhEzC9k$6=*qAWQWC}a7vRx~o-CYLtJ?B;E zgeh`cxAe;?v-sbQ8w?38N6&ZZT~y))Ju3;Ar8`SU!HLSotj&d*8GjD~=`AgxIkKxUbpm0c%^ zX3Oxb-1%I12YuwnLg;?KO1(xACGU3IZ+dPce5WqWI?I?+di zwmL*w$q+vqc)3Co(OO{=sm%iU*rPWCnQcb8b)me6(u-2xyZZ&G{t*4~{S~7%Gc(&8 z>9m<5Uw(&fnBg#(uN_b@EccX&5p5r1)a8ky21TX}o2EgH55oH13kyqp_VYTVU((=@^vo!}~sCm6pUz(ed$Th)4 z@NmP%NbvnA#bCA3>|hfmL~u^vB@}OK5t*yO%ZEY7T?#zr+kw5bUrPG6p`0DxKbxr{%J}jC-7<=l1%qUv zNM0=bi_*Bt!o!5e`R{S9!U9Qs_QO?nt4LiYjUKmNNlOB0S5>GG{0OmnT1RP-U01wq z@3XPI(HEyS(5?+ru>pKM%Hr$OGbBj72^HnVk~v@{tduzOY&r0m-^73F5+H|8{n>ce z1vS)%XpKyu8-pw%&qt_+o2~<6B9pA3YdnnJFTO?NnHZlQ|s@6c$%$U8H8el);R0RB!mRn^Z;6nc06=~grwQC zVO`{F%~*A6S}ZlY0p|!RrJ7Cdr^^?~XO+awgkfI8b#F3c+XvBJ8oWK|&0q`ogw;Y} zggsfziix9gPE)}_YRKb$ZYWm|l=FdFr2{sGCJ^*&r@l8Ol9i?*zW+R>2>Gi+=UKm! zQlWA7V`DbP9k1r>C4uE9AAEf7lihE}BEz2obzs31$s)hs4%``JffeBm6=C)btS^Tb zXK7G{$tV?s^Rw4@o@fozC2QA6eEBtdqV9uV8cDFxd+#Mg3}m%Wx!h5qh@@i?K1&Hs zCh_-#oyM$N$;x_1f^VNN9tHFZQGu>M{NPX=Hd|cs4*v1mST1upt2SR)dQ(me_lypt z+$}Rr<)v(YRruNWKj+{ZIW}jEF&!8P5Zs_j>{dppL1dZg%O!42U3!2MqLf&oj`!(g zU%xl>ow!a_OFZ+!vqIAvi6lPK<;gq;E>Ha1W#w&u)a)$}dduhM9*Edl z1|D2Hi3qo8q+}NJnd}4i4wn^4)JNNV1I%%2-m$;g{X7*etTJX+YD&V8Nc~AHLpcAV z?#(r%>IpbygHL`|P7pk}L%(6Q2kF|CB9FQF_7VJ|t9y*m) z*(I1@6BrS>1ZJ=vF+7}IxVHxS@0O9~49xEs6A@pjp4uL`u?P@+dQaw|cW^dEba_HU zMEisIvXB&a@Z}eBOaH2`gDfL0nYftu2ZBxpUw+3RFr*wN7x3hJ0Vg{ULVMDXiDcgA zG{o93{v)wqQ2CE>TS0GD0}-J8^PtPZWS4mI)Dh0N|FcN56yL_GSAi!BpBein3?+ zLCFAO#;Lc)pz&$#f$=^zAfKVrIMQ@;EqTt^Jb49IBCW zl0FVxy0IWL)o$9oJB|f_9)B<~z|z^Y>mw&1jbA<0v$~41^=u~*{vhrI>WH&E6^;O#LqxV4933t}WR+P~lhF%zhKlGIGf|>f zm@8EY_U|cJCkSHd-_4JYRx9W`&#ATa2XgCYydfL$F!VLfP{ziA;V>>U4y%(sDMP5g z(VfgU=8PnRTa0iC60n!9s=wYsc#60K3)}O+f132o#v*N|yWjsb3lL}z3_>L*@ z+$?Hx)=pqSx_i7hSd$M(QT zgf?Yr=mepUGQfvS7opi{XHr?8?p3nPLs^}s2_3g5#IWMZY`T-OqNMNX>V96I|GIg; z`st~=C4!czJLdxefu0{Y0?9(jY5RIVpEg=>P|9lRJ|li#z;b5aZWkaBIH=1e;5?Si zoPBk0+C6{GAYjZiU$NBg8~83k+iJaYMJw6i=A|6Vva@u zFZ*2cC;nxYXYPCgH;sZ#0bL2p2pmMBijS?NXKOJpHSv)TMG|V@w0B^>AtMRX6LLh0 zK|R7eQseNUR6A?4jSwOih@^e1cE87e){=?Tz(G&LI+!3KX#Qf!Cvgy^h)}314aOm! zNT974uk6kJlB#HPzc5%79t-=AYLw}>6B{o5IWZ=Z)1ASW>ITzH1gQopfxC^FWx2%+w-qEDuI#Hg?}J*I%tShh1*&+G!7c<-CLz#B@As%^W>r_u&!!Dk&3$ zLW#lP+JY7-^;LtJ;DCJ0;vi(4GERJmpU7p5x6@23uOeq|&^IvLhofChJk0st%RrIW zF{qDZ$h_5*p!IDRH943G(DldO46jy&y@lmQ*?&D{GBxJrb~Ohb1qxw$wHZ~*dMgB( z%#rZJUHdHZTJE6-u{zZq?8|W{ITc%87hKD7T}j?g{fOJElDjt61ARDgYX7f&L3 zt3Kre-uwKx#AC+f&r5&)O&tJW0#$>qW(Zd$8vo9QtbID4Y|91ul@P&}sR+{u*Wt$p zM|Ag8@N*VkxeuL*9G~@D4E+^g3>>RAu?t+eo~|}&$J+;SFIN%lPMuJ zs=n`qHFKaew`4u-{au{6T{FC_0_FQoOVP!TCvBCa`Yf=XexTvgw;+Ui2`Af-SsF&A z0qyPJWcr*e(Jpf9Nwp!<{fNr6ki{91baUr&4ie~ZPLJOkIxnBa1ix7n7J*;vT-#i; zQqzR6OSC@Qu~X<_%|Z8|0@*$2Pkm!GtBx2la5*3 z#Zgkl5yY<};o}2^awJtiPrs#|{~4(HXBh6Tpqcw8Bl2Hkw(O9iaCi00cfpW@aCi00 zchMY>!iRU|%>NDepDA!qz`@;|A~A7K+pXh=A){- z%`6LY_>>WC2pa8)7O4tSfhYR$eSz?c+$b z!w7h6)zLlOJ(gT?0%PCjgc`9`W3X;TRd_EPNY~* z@eT6w=W}dJpSNy3Ohtj6`uqhxJ@WKLT%i?_3f1E&WLcvf3kk(^!J3C^Q8%nu$mU;K zjPI?hG&d)h9A0D|7SS#Vpz=ZCKrH5j;Qy7C#YXazdkxx6%o6ONZ~4z}m099{^1sQ(?^{Tbr^sfGX7 zFB?)F6Tq*s_uKgTT{Hwr5#U#?I#@J21Y$Da7h*E_nL|ESe$kPGhjT#Sc>sRtunB5{ z_s4N~_heuJ-iFxKL1)KbVep?P!%qp=os;1wZQ<`< zM26)H?>wb`!*e_>>m*K8^q^Y#(TG8~&48o1QMl_?M`~o5SFEmClHo&Y4XV$4iqLTD zOhQ2cqYo9a&@qCkmnE@3wrKf#dm8Nbt%WwbpYDD2Qq+iXEEw(hl&L~fLmWkb!sxzZ^dU7hmlvf+xu^96Cd{{ZF+aqkz=Vz zj@-xO@9OHUi$hHD)e@R*mkKN=`~qj^x+q~}VuP%l@dH1>FdPBa=qvsQj257GpV_37 zXp|~SOrPCD$!FN6)H$;zhZXF86R$tv!CANM;h^{u>S#yhPtBI)e~3mNg{`!#K_zzb zA6X7Z4wUcGhwHPVb!`#4QI4D?uyf-aLB~&|F5w4;%n%_gO`Q(|2&~34@SU_W9uCSK z^R@J<=y%X_G(0<-d12xFysqSc&3OkaS)zFEOmdm`TnCP(V#h+a)NY(@tEQ&taq7qg z!nk#wW+|>x4GlBA!pKXF9o=AkT&3-DBN3iUu}#9m05dN3v-v1x{lmTFbg@B(@#os#izz7S$pdlrp!L5nt>_EP)TRbz+1UIqNp;uAcY4OBcA z{LJsN+wRUBR2CEh`ky8jgt0-gEbwFh^WuhphEQA<07h5{X66w33Io6h3&Efv@Qndr zgoR+x5c(1Uzz7TPqJa=3Q@0(1|MN}-LMU7f03$2}Gd6_IVE{0~LNI6ug{J^ugoR+x zAOi&KZUG}K1cQdq3Hr9I({HRA1d$s6jIi+T*Z>GhF#s50As93St}_7iTm0vlL+T?9 z_-Wk!r?chu+y=YmV1$KWW)7ht@~znMH)al@{4)TIu<-8KxBOc0Gyk1)4b%r20{VB( zHCB)U5d7G`v)67#x?s^@bcJ`{`xXfv{%a8gkcIq*>u}eG=KM)h`DsJ{=}`Z)q5mS8 z{4-PmL0HHM_{{=Q1sb!~pz_BaoL{`~YlMX0a0lu;V1(b#6ul?o~+T0|3MH(J4x`gC{jDv59u`fQ;Ct>31ckB_U?1+PV!mFC?3o#t20Zvl3_4_{q$>M(+&5_wTS$ zvAnq6!j8IT^nuDcWBX3V*4RyA(@XNp(Y*-OEkl zXgyOPa`zHbCxuKS$+wR^)6#C5#@LS2;?nD8HIozr4Qw0SZNp=VnZ%E-g5wnKarBT# zmwdp0@mzzgukq}+OWtCU>zIL`Q&dsqo}K+5K;-#jZLA1Gc!jdmk*p<>sz04g`eD)| zG7>@zYFgj}eCl4t^LhEC8I+_#Ub`2uUv0$k70}!KN#q`%CXyPfE0@^p$@hJu zbM00c)a0ibS*Z(b`kT0q5S=)fr?Jtq;7J-FSawC%i^TS{c&es{b^LkpUaQQ|C zGyZSVH5eItxK$?ya0T8U)$*J0FuZ=O{7_q5-)Jg^jatSKE+7`#a&AhA$l0iGM|pVc z99ena*9|@W8tFeJv zkAUO6R(geZ9hxx1T3N%iDCOwD`3N)LlMc)v@6Fei#TCXv<_F!`{a8LpqqU5}WqdtB{MRN}=@J&wm(QX}s;bA3%g=*gR)ZDO4 zeMXOch2Vp_18Q}yD3`}5Yz}+u9e#>gr@KXcJ+ZBlA28vJ##zq@j9NeIUy4=Kb1E7y z&ZW89z?(_gBvT-4I`nulQ~YRSr62r8ZJ)q3@m9Pxp z`^^qgL0mrfILJQH!%0=e{S9nE}4@;WCHH56@Ml4Z*eDqG-EM@~dxxoYKmCIuK4 zY3N^kPwHHy#~srB^mU6iBqN*OHgZ?Zk$F#9e^EL*OZFxqN#-K-6AU$d9Jl<#ABVB4 z=aeBDLzIW-7O^U8zUE-09HRs*A0JBJf27_-b**=Y5;GKZrrNEPz675NFP zf!L}VepQOj%z4Zijo9A1h8n{j*?mpQv#xlymE#%&qt#TgNlkO>oh*@5L0D!FlVnsW zvkK$;LQt<{=>oRZF;S`_mFodS6d4|rezYsNsOA1$PPTe|>Q^C!6o+4I;Z$FA?TvwH%3Y`yL{QLJz9daUPbDA#z_ zyS3ryh`ouLia7&2`T=^*uKI+4@ks$(BxBuXWA%h}UTGh)xalgo4&2GpwQlNH`NpR` zQ(o`zJuz(877L(9pMFQRyF6SNh;Y^ERT(QCK(37!$5qh0XhL8;AgiEiMc3;vZ4c9l6xfLPvXb3&Wfo);zFs;KkTX_3dF zm$UmNvo8wg`DNEQFJiUeHgo;#qT=z)!z3N!4kE!((UiJ8I9-`V&QF6BN$2jl{rPG0 z?`=;7#D$decM59XwOl(2ejp6{dH=tz0|kK5fr46Lf~>KB^(Z+Y=)?eE zbf93+kUVKHI#4iZ2s$wU7#%1WG^F?;7#%1WGz6U(0E`Y43>tz?3;;$4dKb+OQqh66 z`oQQw!Jt9!2ObS3dU5CXW`{&$2crW8Gd6_cBLFZuP%vl+#YX^Obf93+5XwQ_77D)O zVcdOhkiY=^s)4cc@1P;|;J%g3{pYdSK)V9$*kE*^ci)?h1H#O~=s>}sA^G88bf9<9 zKnO*Z0AO^WchR@r8~FDI6TP^z=C^7a@Mtg|G4MqW|sdbnE?Kx!TLX&$R9Opm|w!{T>;b4?8Do^%x5 zgc_%}o%@K8p|KEkO{Z-ACUog0CaW;qgrepxx#CrUU+}5$Sj2MyyKL%|iymOl=LQQ? zM!Rek9Uq;S*?v>>rdY}-H+{z^TE>h_6Ydv_`CcX55$q;Q-62rl8Pw#QnAKRGUbH@* z)G8+@v+FRxAH;TNRjMHBrm%li*5n4fKJvPDyY!rHq^ht%Tn;D3Qb~;++hz3;3*eI_ zdSI+$#j--xIc137cdy;!(04=?{|Eee%%^Y;{0TGwpBw&|m2WBLl?_p)<)^e2@!k9; zJkCh!dtSJ~)Ymf^3m+PmbqpVj*xJjwyGc`$y`*QhFg$^OII6{T>1bT`dLblu5ZB^d zp2_(U_spDLO=H`>wn@|m-l9>md^Xa_^j5Yf3-{5;ET{gyIelCo9VI;4tIKG%hjytm zA?q@wUE`DM06N!c+$Y^4MxD=CTO=Ag_WRE%-Ru*eWsmeUMW?%gDyJ zZr>I4!wEgFUuWSA1QaNAeff5!_o;0>Hh^S5`{*Iv{Z)+;q2xDN(BgT;AevDlTZq-U zw$-_Z7Dn#iWUqp5H&Kl43fmbeHpf$!)j*^Yjo{aP=4vJeql@_kt<0V5P6H+~kt~&T zGS?$Hj-QMba#^Cz_P#y*6a%RF7^z#SPxl;C1enb!^RgwdAK<}exVkb8Cc@J-^ zCPKkUlg}EZt?=#Skq=cp_8h5-A)&uSjiIirN0V_%EW<6Po3!Uzs-C3wdB=;otmW-rcSDO~9Xo)f@+`!Y`E=qy~v7O`c%+LN`g{J0W zrize7a8f7uai%vBP{SBBl({0z2Ai(6$cxwB=QXO)TO=@wV)=3rI#30&D2ci6=H(tL zN#uO!Gq~CCYh8^ABinlu00rArBOqxvl^|HY_MW-dddPZ6x>RW^a$Ss}U(unM&k(^^ zDR_ouo@sc&WlApmbspb~+P3i0Sn_?-(lQbo@r`%*mG0f7t#-Jbp7{?$dr4chT@S|v z*DYRuSO2kw(Sx{9pQ$;fc`0h9zr(bqLf7!)8?j3USB%oWzpt!BAZ zFk+`etlS4`b=X;OV(k|h$K5~HQG9dt@OO^#(BOxT#O9xkd|st0mCx*dN#wDk1N9UT zB-gIM#J^7Kj#*Kw`rupngVv|hlbWwa4*Fje9uBN!OSgUlmVPuf^idh0GE@F+M2DKT zFWon5N*;m$MG{~|#b0#kzxieSBriP!9Y@-lwWjJd+*?(nD2f$DKMVIqQq%UNwOKRY zzMK!pVK7h(6D8-XmZcCZuJ}3 zt;hT3k%h9?$gr`Gj(vBFWK;_VOc%H=z7fGtBWs&vENQ)Hwi(gK!uv4Ejo6_Bpxb|~ z^FkAq6FI5b36tLsz4q(L`!J;;x3yxyheAIxcd#nIp>6oopx9W4Cq(LDq;2BmYPo+k zc`AE}=C4XsPlyz@@qBjqyY)-g15nE>CYdx;@R1+jFG~0Sd(OrGvH}Z>hX;d(kg)@Tk;C6bL-fvoVD#{J;T(UP)c?p&-S#W`S5x>e=im=M-@leX z`1=9B<)z#@2OOX`1A-zn901P$Xp{e8QU9HBy|u~z@G<|LP5xKT?WaxtQ(k|^CjUh> z|EEn3s>$=aEH-s3Q2$ZnYwMO9A7VvO$BE733%lo^NiIw71qY&-z7dHqdY;cv8_7q0 zN#`5ix>`5K*vrY{=bWC+1?XX<4gVe99Y zBmba4+vFYJn)n_dV@?|8h@aNHVV{zrhRl&=ARuK6AG7B0UUzVjMK=ti<yJEWq;FIRJHn}X6w6!l#Mk z_4h)p{BPJp40b-|9b>Y)cxLAD7YRl4V0Q<1N(fNTVFbTzxzzfhfY1)B7axfCx>UZR zR0I8Ca!Wf)VZz9?}s^}S|_X_67T(^&ZJR_pQJpROzx<- zk6}I)Ekf?Zr@+6cY=H#V((Wh1An`UzG@47ges&l!+Uk>YQg`QOMB_29k2~vEHe?dc z@A#nhhss_>ubkSPN0VjrWE~cjZq*xWJnlw+_WkqN!hVb=I}QrbgsAq=!3IlJvB8_zcxAk? z;;ZJO0FV4Yd*`Q6i$j&2A6{XLa!;{8HePJ?OYLfml?lCXkp2wIz=mZ2k*cP?hHFq< z0*_r&XBGc2LlS4~-mI>z!6$~A9llOqQ@HDL^x}X>X(zruf`^-d(c#wqSRRrDCi2w= zRqmOK&zUSMACbn?ET|N}?oy|jpCr*Lj&E~g#tESrdW;A6S+J_Bespo`!Rzv9ON5UUZn_*W=;$^`x(E* zy+;9rMq+Lyr8+p!k|J!69cO~Eew4QK*_BvE$!Ih_fsLl${o{DLvsqA@p*?ZO#oX&% zqFh;35mBX zUbkrOZTL1TrBV(09|pW{G4-%-oC3)j<4nS-*QaI4ULI*r1Z;d}UYc%X|FNV*cDyrJ zKH`Y?=0Fq2{&P|AnQqL}w1u)cWo$tgd5Hv&5uMOAXI>=CvVL{Y8E-d~`bfWdsoDGn z1?s-2rXGa5^OwRM|Mz$2?S=4P=`Vm_8tDOlcE$W>o&4w#sPr_ z2K=RR4d`WF6Uo*?EQH;a{;)2FJ9)aHf#M}2;HN4#Vfvg zSAyNBHnE$Hv-Zt69i^fbPT@h<6O5#LX5X6kv|702Gy5>N2U8M~xlQ1_`ayN<;-K++ z_SVbCAB;k||M;kbD}?>Z4(aKNxXTZg59cM~#}gX&XHlI~_PWFIjuMdKcy6S9mPJ!p z5|=?u)#CB&dLDcjI-2H$b;B?ePX8kJUM^-Pvrk~O-1*p&od~u<29|+1elRatl(7rBrCK$|6%(Tnb4T;VkAFZsoI-)X?WH%QxUg{T%$aK_!W<>$}LokpR+ zr@Ij&H@g%5j3hUCBF5rk!WaQJto1EkRw>K_)Yi6+Pi@i;NKwf4+EeNN>5~sA(8<%O zI#PV|{Iaw3kBX_w>f98WNwPYdgy+5}&2M#LUX2jtp%hT(1e9yEYQRw0C^BRE2+8WsVJ2qH8oF%uBwuvl$tb5RtAl7i9}YqYKtyx9-Z;gnsvKxC1%0WSeg)gz`pwD zmh7IyhHit}+FIWBYNbLfuG}>VQtD}8nW;3R7cj(f*6j%{n0(C13?*jbjDg3a@b;<* zQKGeM^s2@ck3SXE6K<6_L5Z3-_TVXfV5ye4qJl$zIrK$6JjeI4{c8FInNkK_bv(*o z?158b+$s6N47z3heZzM+?J+FT(wxi@aYBt_RH!+!qOjG54XrkV>{F;Yq_mn!GqD1) zHWlj!G%4PWD=p^pb0fQb(t;5r<}1Y*vq-Pvf}1FopPLOlcU#aR9+=$JOBb7P!yos% zH{~<8S|Gb)$;meAzzvm)!HB`Z6ZvUtumjQIB-55zZy`gB1sO?>v5fdtnXnQ!LpB#> zSt^caCr;LV3*SSbDPvAgslJRfI-T#h#r)C-_ik`*kXWF;v%Lp#&y1`M9USeA^sIjV z@u%I*3Ir9+`qx9^|AnjOCkgLwx8Ub_eb+gG(31lQMo$F1i-vU7fYB4(MYBUl$pgXY ziSD8yUsPZOMR(y4uNp9VqW=aB=CZiEY>+OCUt~iNelkcG)i3f4@Mv}jSymvJ22Xe2 zn;k;)86X%P#$7ZUq|F9KhXDo+q4^B(j)v>6+x_2Nv46R|Kd;!IN{%~M>@Nz9zx-by z_iyH;qBX2+k|fZtJx8yC)S9sAi1l384HDVZ^D1(;FJskl0#68;;F%bz_7@KTYvdV`#(gq>y?6A6>xLZ*ut$Ki+KuzsY@4WOP z24{(C#pCGrJOS^y8tX%n4iR*HW1eZECdRTiOH3`{5FnloT`|9AiARSsV-bDZ-VwEQ zk1Wl=1>Km2v5uvhy0Dvox;Cz-Q}~P9jrT>w2&gw{lwo)XSD<^K$VDx+NwcSzXR@F# ziLr%li)W;FUr@-^)w`_^H|OlsB7r)O?WidHqcK7vxzd)C!o6uk6fUYXn}`z~8}?F2 zYM&%Q$wUg9y|7Dl$76KYScVfseHo6nPcW0-n%oNx=8!wqx1N#|Bt!14y&r&+P+ahq>&au zTDsSw6;MJtl#(v#5Tpg9LFrVwO9?4S=}x7)yCp^91NOe3cW>65`*wft_Z`RcpL!gp z*IIMVHLo$o^*hHHFZb+1+U!!mG}FRjHJIj1+Ue}rwF*VwywUkKo>1C1%0OtiD4Xo= z5qgOJZ3;mwo(N2`WlB*zLYaW9k;CWS_(K&uvMp#i$psQ!5Aa40KfHPr&p(%(Kz15T zLPFIq`N~OH6`tMJn^_ub*hi%X!nNGtQ+0;;ZYbi0)%^05(XYqLHD$>*huT(Fh3%WK z>0e+d_kMaJ=4rGM!+3+fZjiFhL^?waV>>%(TC_9{Td~0S3G%a)G(uU{*F0qD(#h$1 zI3?YRlD!tf@DKa(Nd0o(ZcSnl&`-QFe_Po2@%~LE*-n$k+(|UG5L%{92V>dfy@ilR zE3C1h22tOSUv`O!cl03-pcdw#g$hhO6Ett3oWomV&0}SIwZA@JOGx*%b;O-u)%&sW zYFM$!#J0NbN^R-!yAu^+Zt zKV+*|Sy{l*FR z;5jz5h0OOK^E`a`)2!mLceb;%*h!-M&v%Q2$hJsdZ)XIIA@tQAqN)3F2tb%jp~^;N zNv1_-A3IWmGo*0t#Ln^)46ox8<@e6We|%73C?LohkuZT6Z1^%J^myXq_OJTyhm>czcr$=>hONNNBlTf%8;W%Guh)VgK1aSx5?bX)gRxvo;U3=PB7D-Uf>p>^v^%>ST$JRp{X{BJ6D_Ty0rgZ98E`;BV)g8O-!NM?}w1z_#+~9G7 zIFTVDO;j7~-=2b%oAO>=-EL6lg_df9j$G)IUJj209P2ajop<-pj(lb~a|k0u##uJ` zriIrDr)OIOd8RGLCQtOkFOH=9N2Q7rX9SYnkl>0k*x*4zvujql{|%uTfP;?X%9Hm; zRRDm|d;n^&(CmWI`qxPHDoTJ|8)TXQ$3@8Y_i8A}z%vd22OaDu2M_E3EOfAP(7+DB zLigXOVSz_jH56nXBFDwe_=C%KQIo&?@)s5Ve?Mseu+RaleQ{C*sJ>=Xy{tg|BO?7z z;n813hpX`D%7h0K9$hon{S_WvOo#u&5`@y2#T@6AKj(v3p-Og2-k@HrIRPC$ZOFdb z3xoh+Efm$C?|x=%4sEGZjaaDT-Y^QYnTzA#Xzy8Dm~GM0V=b6uBoHAaU=u!4_A)>- z#(#+zVf-QGs6bt~Kx9K!3(f3dLOpG}wgwXcec;|Pi*-a-P}trqjb#1!_z^jS`c%|= zLquM`4sPY`B6bR|uX_Y~%rAiOEi}0oiv%QEv0728yxQ5z_)GXbT zxCm3B#PaJi-M0C5FY!?SPY!mG^Ew~Z36~J`W~8_cFIuo8wS;3RuRdGXmp zhT5LS-+73Pv;X-`U-e3T*7gg`@&^xJ_ICzkCmDQ&e20BAOFtN)Gp}v#a>T(&xXGf-%>I~vrQAKKvAyvl4q@b zrj@x`&j79MWI}R0(fs!6@yEBJA73)372Qsk#5h39$JzILjBdGC8GZj-jw9VmMl`y| z*2N2)%cI#k@4jS1;T`o_q_-2w4Hcni2dJ}$A76dhM?;$|=j#no3M{l@&P$|X%xG>T zFAvP*U#?4Ki6gC74UVLG&Q3Q)+)v34VJN$yETJ3ZrO-`jLzoh)8@SS&mT^-`S#QK# zpWji2czo)BjJCp&xm&w${%1Gxd_ZUtw2*6MO6s;rmne6EI=taFyHY;QEX4D1(izTQVnQt4R3FWJIt`DYVO|*Ji{y?z321g1e1cQ zQ@D10<^gl&i^5!ZVkCRhRpHc^X~oD}!L?PyMW<$#$8|v*2MP=0+}%!Q==Uw0jjK<& zG)?nd7`Z>*+?%0DHxANrgIB3_XeHRBN({AQ2rK6uR{Z^wY8ZlhEQIwzdMo(cf%sg} z_sObN(%sOWskd6&HPu`2aLw;!7eKc7Yfjz&4O={b{TBdW1xttl?7skNuq__I{tK&y zf|xNl0PMd2>WfPbxZ42Oe*x4NF&VHLV4sA+e!-d|TtcicyDY5wBJ&4c8=!Ops|IO` zzyUB<6!v?AHAUdKuwwuHCkJbaz;OZX|A88$DFO$8{TJYqgEU3pxCR7Yg_AH>4Fb{> zf#aIT7eo!x6oKQKD+)vn(iDN?ijlZhABFkkU`-J?01QvCR}HKw!sWmJ{T;jfB?3OF z0EQ=kwL#1n8~}zV05#ZI8i3&mKn+&l1TZ`SsKE-H0EQ=6H9JV3sY{&Z@2~l#9SrcA zUqC#6puT8d0IdF#_u6HH5n%P7yw}(-D0^V_pFC^q7pJ?xYFG~nz%>WUJuaHS{QXs9 zyD%UCul*OXndIKh740F&^zusk>}qZ!@tr+2nY9{rHjQE>EdNO2ZAKG4=o1T zU(^+-ng|`A#&Sz*-OTEIrcMYE5l5p{m`<0$nxEo}rWWBX)JtVTbFkznGVG2ck?_>Z zCpJGDs{FMcZSQ6>4Bh?cL%hi0wlXY(kX%`qiuI;PGgteLFms?SXQDaHgJh($A9m4% zmX5r^y&XtBnR<_ITOkD=+pzG)C%z)RV9M?uYUv@kEO`15DkpCw^PPFy&Da0HG;i^x zEjY!RZFsW?mr*8IWfcEYYR>TuSE7r;_Dp;_{C@MherMBU5=7Ium;C1J4A1@XvPNGp zDps`M`N{kDWh@voKk?;br=%%3dv{LewfVLeeF8^#3e{{Qkc^$z-PhQuLhNh5OWJPv zv5-EJ6YlN&Ac64HAH(_U+UXboNJ?xdyU+b&x4%<>3%3FK?6~2rV!RY79Led)U znv<1PVXp%-H##XJDdQ%3l#{pbZOCr?xMTcd<^2M8Lb9GY)5pmSh8GL4^8T%#*}oJ(&iq%DW0X6lYDvFj1C5G6@O-iew!idGmCWXhROPRF%wFW3|cr!jyf zYC4mxFGh2BJv{8eJv6F2l8?%g#<_pqm!&efPKNBshX>;F$b&|ov*En= zDARJh#?XRX-W*64-RiIs+DXoI7GW$;Q|0&+sxFf@5lpu2Xkq*V?~tz;fk)POa=bXq zK+a0k z+^XWI6CIV7^Dho=-<)S^wG;V-jQ(XoEX>MXLEBv-IoJikpFVa7|8&VC_-8FMrDMpn z*BT}6$kY=V#5fdY-6wYkPb%b2Haz%RtcK(v`j4dg?@5I%swoz!joMY?7KneSKrq27 z%BsRD%&B}P#68*ZO--}`sTrC`KvLFEx030;5^{S7eS&LbpnIP4` z8;+;ku58}fFhq$t9Bg#NIoqS<<0BaIgyT)wDI+s>b>xI{l4BL2*zN9H4$+Ewf|YT; zIqUE{)0zQOlMq1ztSSpcp{^&cV{Hocnr+l2R-wh=%actw*cvol+}fuJzSa!xGm&T= znHi_NQQTUi{xxpx&s=KO-6#U&OSDFQ(r(6@ndUH9F*+$h_@+C}GVs5`$4yL|F)a`s zq&fbgPiS;`%EXU**l*2~wl;Efmy1dBkaSg)Ijf1s+|6$S{*J4F!~;)^?(Bl-qljl_ zkHa$BcD^I1g?livxM_Z|cuQ3|bw7$~Zw?dj$f{$`&_?@R4cp^yZ#*zagIvxL{YPY4 z#foU=k8Gy%)1PLfSr3@gbgWBQL=iYVm9qQ!82i0|2u)t1*f{TSddP8fHk^8I5)+dY(S`XWf@{LXE@9|~ zlyl+H6G^9yf&Djv3pF+;mcQ#bhy*od6!MUmbB>W`We-!nyoh4Kc%bMWzW$(VGtP;0 zOW?5GoXRwy+t}{K+4OmytK~1j4$_7<_j(M^(cqpfRIh*}?7ba?K`smGQw`HYi9W47ui|09Hf5FoSC&fv-ru zD@XEw3XJ|LonHn;^6=xJ8oan999bg7FSW3l{xKc9N%$egOEr0b)*iRatLO9T0& zQ%y4W^gOs_RY{&CFsLLmQfJMjJ`UApe54!aHj3?f><%~L=$c%qsi<~ep*H2<4bGjH z-@cETXF6%79+xb<(zMRxRGHjkA7pk{S5zAqy^n(we2ZL4yuWtG#KuTU-}IAh*j9y6@HI%jXE>on zm8kFHa&H?p$06H!CofvKHbOY8_I}~S9G+$1o%9MqeC_nQxRgL zW=sb1@-R8^M4Tk=%oiV0riAvh=7nK|uxa1T$&YDhB-*Rp32Iv{Efl+2?VAk4G!YD}z}6GbgEdbtHpt0o+$ z9|#N%NO&Z4J2SmvM3s+SjM??~^NZ&Q4^kB>z}I_;8$l4U@cQg)@Mo_#SSS%Q4sTc9 z^fVr$qYI$zlBkLFF*s9m{$Tf;+ubc*vEQ}(1H{Htxir%-1Gb0 zafgw4_tpAkD&pW9EMG95e)Xc#TMPd^seOx-)V)UkN%rp^^fOLuj_ANZbj9M6rnVMg zGFdc#GS#JDxSa7Dcy1JTx3#v8r0O3l7Z%7rJkP%qze*U?jrP@z?#oH-cfN_Y#KCmY zfr~t@RyR3OlS#ydo;VpUP$AY}-9_eLGd`6q%e>pyrS78dFy zmKCNmj3H?SpNPKrOfADH^QI~PNTk-C;W^p8bGobfSr?;vy^B0();dN+Z`F*O8UNn* zq*Y{N$n6DWxFanO`iyMr=ifK7j>Gw@zA}#}g`1xWao_)Nqs5y$9h+&~wX};wK6_;7v5*Q%u6qM zD8X@HC(1ODrdKx0uO=3I?LwF1KeWyHZM1CCBL5tZvyX41ec2j>v{{b)Q#ajw?W-4U71efB0{6$G!pAB#mt_t-yo{)Ab7lhq$KEXuZ;ca; z+_0>YTe!+$$nXo2dygqcpc-n?WZAp$q1d)UrN@1_ul zA^TKvndD{DSyTMhMqeqj-_m%!F0G_VPz(4-JI3>?tcFjPw1uqdfDGEZ+@x|lD(Kz= zY*U#a?|7>pP>1hdqWfzMDPOR>vlVLM{pO@bpPIx<kg^7q zPw5rgptXDL_oSXU^l7TDFh!>a+u^)v58O$Y+`RCSi$7%AtYJ?7qt6OSB*N!)Eh=iA-o8~6d{wH}doq@9HlODBdWZ4k z4lD0l`gGMx&y-Tz+UP_#;1%2@DJ^T>)N!vg4x2wGs9dVw{I2K}Y@?fHP4719)cw@i zf{16B)c4>^>FRgeAdLmTbCRzgnY=aj3tAY|^$hh0#FGq{_DBQyBV}Szb*VmtE&J!a zlL!^M^<2iDw*WpA`5Eu%iwM*ozTrtBYs&$L0yD9PMN+?M`EI%4&SDbcuDl#~?jjYZ zow-XhRULPlZ4xVKmEbRcEJF~jsvWi*VA=UL)!a*(`lpk#{+*%oKo_Z@uQc-IH#g4E zO&?*g*61v6C5Q()KlU`XS&4bInBrX#Ez>2!OHq=gMW%Rq8JU{gNm zuzVvoh5@38TgFD65%=I#DCUhwbh;eBFDfICZ!=Vis?hm+Aq9o)%b9j0`SscOxQ)~o z{|HPvO0t$fsv~ckK(S}lP|kgD+S$wPF>>V#|fp1&M)RonK@1=A%8Eo5qj;RR(%M1{^X6!0|rhnw9ep;{E@t zF(_PQY*#h-e-@hlD;o|3!1)QeGL!y$=nrhefn4De{~p5vs6kHWAlH4P7r{G#8l+_y z=(8Y zVD+CoYnMt8IqZ=rz!wJr2Ot0wECAFXNBMmS>8~TTt1{9R!F&CD4RVdl{p)<~qP^Uom685xmwtJ^CdQtn!kn*r+E3v>lalNC zT#$6UJ}Ik2xGqCoQyW$2tlDNIomRDU0m9m;y4l&Cz`;>TM892~o!?oc86+lW?0GnV2cB(A6T=ks1$ny8+&*2-jN50cfCU} z>}_3bFv}DutWu_YOWEP}k$gFrjrPNg+NyUM@woyED%rbdJ;CIXRovbq6Att63UOqb z#mo+AastkT!Fj}G{Pv2oRrVZ9_3^Y*?mgW7{AR_myydanC4ByIy55##qIejwQNHPZ z7>4@7?`uyD4;aYNoV1&=)F-|B zJ3CqmkEN9?h%JGfR$#Z^LQ7!QCBDX!ENbA<^qa7xw%^siMk?p>^S^D}OulfIQemUe zNteG13$<72n5TpuqLzZjDcZDSwCZ7MyNQnG`*ajPA*PlfaLF*@ty z(>M8qXd4Vm`H}Ovt3^>5Z$z^9@wA5vhQfybTrD(Rkbx{ST# z7E=`(^yxN~xWX_ZIagI{BqrCN=Z9EgJYQQ}MT#LjkK}N#%_hAeQ`NfzBoxA@7gOPr zZ}_&4bhcRs-ctCL{`?^xAMScOwzQ_wYl_E)s4AIcnd+$E=mpE5;cg0!XEBBclZ!o+QNcQzam zIoTf*pm(eVGydemU)WFzu+SgeCrPz(!638nNG+P-#QyZ;Ttl&N{5iX6$oKDj5JU!V zsTu18QKBaR=aBbGc0T-!Yp5RZ{~HS}(zIzECp z(M3|sP zNvUGZjzlw)tKm)<z3PZf7GytCn&r5NIV@1wV%SU^kaH% z!m|C$vcKckixa%XELX>v$~i9MFYJe5Ro^N@SgS(9&o)awtB#WtOh$%&PgMEh>(D8! zGyD3nI5Q`9>aUIMPJzjfVb1QuJCS3akt`{07B&}yrMtGjBHb@T8fRF#-+P#~Be+0ZC+)4EH1vEdSW&h;`836AHF&-%Qr>wwNV`2Ycs7g$sUVVOYpUwN#mR!Ppu z-2b*>n25P^k?^g@?*VIOCjFuzUuG!RyV*|$4NUY&e|yyj|NTU+!|KKu##=QXRNE%^+LG*zBOy&+Y-Ug zQH3VSOa=(;cNkZ=5R`{qd7^D|kayes(9t|FdW2mefbSHctk$7*{4acWra?k3Q z39E&*(Cdz5;)7FE(P3Q$#hiuEDrSMG-tJz zd~F*WDt5ePd`BGirr^TAr-B@nL9Y2C{vdV!*MWk6Fj$L4^k35D|J!pj03!wD%9`;< z$uqz#A^=Gbqka=H_YlJh1 z8U$^H0Kmuq-x~yNg#f_Fuxc>06#@Vw1E@h72}1y2WB@e?+6n=Hkpa{oXe$I@77>6N zEJ6i6NEWQPRkzv(fXe$H&Mg~xW%=^0RAP$qj!u(3W&{hZlj0~_g z2>Av9fRO>zAZRND07eE-gK%?~-u6HE-XLh}CEES>YB01F0ste!esVCh6#@Vw1E@jJ zRtNx$44}T)GXRrF02moSeNj>YR{zPf1~#z^0ste!t_?P^>#}I}_je3zViyDeMg~~> zV#fje-T*K%tQtJ^1{l8pD+j|%ApqkS0MuYV6M*px|BV`;&I9vux$H;|eAxi%Jb$jf zO1u9pasOx5{~r?f|3N;k68EbC4ls%PHBR}j#QlPG`Lo2mN?G-y%_5d7LDG3aaHUVv z&kR+8Y#DA zx1J+@3BTnc8iJo#+-atORUjGZP$*nZA@&dvj(1mZ;Qk?f-*iSVqI@kf!lO@Hd9RFX zA-s9dZ!3`tb*;fO7y8`dhje}{V*T;#lPVdaKlEd^sRntY*n%1p`k4Nsxg>j@XDDG- zn9s?=>fx}Qf(URtmQ})Dv=oM^5Tz}sGCf@+LM!CmRHaQMwevCS4O9)a_~DH&Ps_@v zE$cI^F8C5@TA-Wk*5Dp@SWt|JHTojOT2yJb`L+@bFY3KekBEZVhc426*a;OMUNevK zHydNwPAUZ;NHp{gI`5Irf3C&v32*XIdR$kP96xto10|iZF(s|xT|GKZHKlW@loj(& z=ndaey_=tZ#UWY-Q{;=FzvN;R=^R0E2@+1*eu_jrKKjJ6sRq*I-2EoFeeL;j^KsCS zX-Gvwr}_7}OavRwCw^o+j*1Bs98c9e&?kvK_8^{HaGUT;y!CyC^vuvUCRQ=|(KyT7 zTfFpPSS{_x>+KqCEe9`d^bz$)hzxO)!$atL{0j-im(^79VNJKiRB7x}(Dgt?gnEW)LzI4$j_|^JPP^!MMukL~^0RzZ6WtGeL%UsB z_q>-X2Ggb%cM737E<}bL155TbnF!MDpSX8=AjstPvYeqVdx40x9X*)ZH*l&_q9XPg zWK6Tj&E6F_WFARnt9I5CxeB>iB=#16BKej}thqk7d)M3I_Z!_~$M51$s%Q$QCGFPb zX3;&nhPRjqXvzj{!VE;c^n?%_q8$UQaat*}*NBpZ4LSOViKS8gK0VP-29MC=S~|`Y z+A=#z5irmNRo;dr+`{rS_Es<@Dp+S^%b1lC{&H`b(-~> z80WsMo}v@eS{Y?|>k|h&8$s2B?m9N%PpN$3Oci{s(IYNLo;utzDD-|y8G{{lOdG|N zxNmWNiUIC(EN3rcqT(tIYAHwh4jdeY& z)wa-@*$+n_3vTN}e4^jCUQ4{#oH4!V60jvXS}y(U)MxJvr$NH|1dJ&T?zN4ZY%kwzQ3H>pdL`My-O8DpYAXpxsK|2C6@% z!5qTyJ=(})f_nIw;6zBo?CVN=JMXSoX0HdKkr}I#;XlqlB6Uf-d!mtc*8B1Lkzfpvkyn-`AQ1pgY7#_pYVlG?BlQ`5z zzK=d&7Ko>Ay1jQ9>M(~-;rPK>bvAo$VLIjDxt+>#=FsIZ=IthyePqiMf5HW)i`{k6 z{Sl}c804CDm0{JF{{j>)LIF@^ z05u4z3mEU6~JnM92`c?e(~N0R0Cl>uxb#CClmoSAC>^yNX*y5Ul1A2}4`749}<3S0<7a9DV zD4HwR^m%QIyqqaCOcd$o;KU|H6TU{VlO*bs5Ii;S;My=8B$2b<)~y%3?6|`hH3Zh| z88%Yic{Iv88ywk~sZ(oS$HNs_#B_ zjjYd^J1UA16`|`q^|?iE#jZwsI9w7`chiz^6Aa;gNNS91ta%sbA9Wn!sX4!0llP)0 zy|p&db+i<#we={2iFoR5XlOnItwMJ9E9cwqY6&qgg{mIEGL;us7C~DrsljJg=!tu= z>)|gq`-Q5ImelXDblNNac-eUjk%pUt405&fHuH~gl+8O(=@S`JL|r>nA4A+3TyEO* zAf_~))s~`TF`-iI$F)Ys@8~6+jPb74*RyLsE4Yv5b0}=bH~CVBe}OpThGyI}AD>Ws z7O9QC7NJauL29^FZZYX*F4Jc1bKeLHECzZke$kJ;B&o3?U-OuTYL)y5K6<5Y`EkjJ zJbUs*uRD|?zf8+LdXOdLN!PoM5)6u3A0cnu%xF780}A}+2VYP5cbjClKjSG4#0+V7 z$+U-0_<6rU)*Eu}Ju<2_$eaHWEwqiWtYqNLIZ~Q|pF$+JM&4&G_YmNtZSA+KJUGuG~Hc~b- z_4_yXW3*$U#Wp(;amH3@{7Lp4V>J$H{j-DgxL$nHqt~W7dzA8?F85yS*^I63W-K4Y zy-71wO*dyv4Z~=x^AAqHC+W|6*w-c-Ec1$7`;~{rR9L6vU)tZJ_!Y(^MtU#YZQcwS zZBpBk|Cc4MVsm24H>;DI46R=q5-O*HnvCUr3oN58@sGcL7Uz!2oix_!>>ClUT554? z(TNX&GgGYk?s2a7fa8q+#msaDAxeHMqJG#aa%nu`i5-3co(v1tqZk=l`Yzlf;k6~@ zMC3=os7V9pGW!+Zuunar9lzXsc!P@jLxH9@3-`C37bO;g0!3^!v#7c0w!+~>pK|9= zjg+WILNScDtQ_<2GQJ#;fkQ@lLX2f}zpl&hRJAsv8I9~-f^4a+h+ger)hsc3Fu|<= z7R~98fia4FRsqt8V$w^m3DUVSr-y}eLU_K&KOEJ$bHVCf`y*k7B_tFZ$RRiI*p#V4wtQw5hh63O$0BR6k8w!B40H{HDZ72ZF z0-y%rwV?nw3xFDg*M5_tr@M2hC4Pk(K-vtL>JO4usey!S$<$`FS=G82OOxK9&2r~=3&wFM#YHDpNgtcA zvTFGVwWd_IKKPD(M@xlbe&^Pxf>5lQQ>(YYL$M_nEQBQp`bKhlZ$=z}` zCgHx#G6{%VRhh3{%HnkC!Nij3Q3ri=wF!=nvyNbF+5UrsVoJ+IRKG2G$bKT^PPKkH zl*p7wj5%@bA!J}JfC=>g&N;Q>sWs6Dy65bEEof&6jCCW0jdeE%ek;=Ds)o`=-wo&- z=}|d+m|%g|?qM#NXn~4v2rYYudXq%;{?rCKT~``XRIbqC!p%m%+uwC?OG5~o_%uI% zWmRIvAZ8q-qhkZCo?U(=x-r=j%Slz9;>1cM;b!-6^6*Ywx!geT{2p(AC%y43TVjIm$Y? zl{8B`Pe7kV6jmtsahV#uH7WR9i>~(QkmgmD10ZI z;qo}2OSM^tb0{4-IK;=>rY45zq?4w=Ps|L8`hk!^?3!knNR zkuG6O#?kqhcj=V~`?xe^Z0+{YksL=zf_@?|_!Ky)JMV9H4DRUD>FDoadn#udO)WkQ z(wap#K=G`mfVnLE7j-0jN3vHOMLHCBY06PQ$JZa!PvH zKIaeAAg834r-*-`21|GWs5*e}4VLf%P<60s(1aI&ssm7iCAJkbQ zq+F}k|4)#@{)h7gB9tUAf)uQ8_qN?WP^x}bmB*$=<+1&qF!NT3 zrRU#-dWSF=&8#A0ZhxKAGAYE;jgF}miXx1zUwl=58%|A~Tr+@KrD%ETj(uOv5y3i|=aNd53Yqjn{wDkMN=-ME$%N2zG8Pq zS$Qm{G!7fxy7aP{aTHQkaFcLoYz|O=6klh&6E(>%_hx-==z*%*WQe;>t04ksYe4+! zEw&-WuR6>6_HahB*l3RDo!=a79Dj8TjIFJs(d=oPVgEpuP#5KR6h2KT#flBrnoU`E zQ6e!_uPJ{arh&!NO)vJt!1)F^N5u%Bge7|6BK+#ubs< ztPxq*G0m2C&A@7Vo*i&#g>>q)uo_b|vWru`T(kVnH& z=mzpzwSV)Ej;yIn)>g2Lw$}}lSOHSC{#i&Gd2ksB9 zc0}tAw!H3aWQFwtjUKaH60{4bkNdyFhs>NV!ISDlD`~oC+PQvxe;v;th@*>+UI&PViwa-5<7umHey;QdIP7*ny zd3hgC{Iyv{=+fES5!!V>&7h^UKB_~N`_1Cx%W|)FF$Jt=Gk;Ukuo`L-?swWRs-tqU zH(~s=lWBe}zmn!N_ltj?q<5SR`Qfdo1nghTN?i{>HX(~8w$C=S+zGsK6heTMOdw?P zNR->c%zQdND?$*_`t6y&R3^3sk7HJV-8<9}k2{D%ZDVS=%Gvd)jj|C7G09oZKc7cL zlCLK*-y3}${Gi#YH@U(}f9a6T(vC$2{S%Ebxx!hNk_L4P#!h?IVTes{c9dg$E&T?SZzBB>> zs{!I9ST%@!kP`su0{G-0_CZbnqzga|VjtuLK)L|bAof8{0Hg~*4PqbU1VFlA)f^Ww zAmB9zK)L|bAof8{0Hg~*4Kine69DM~P=i#+IRTI^ST&d_ixU9pf>mE$F_6plCoeXz z4i}sNt(ssL2UPcKQ!qSD_>MhIk7G)rZe}mlLm#wqnPH+&6OQk;Mr>oJnLEu(}kkc z{PRq4Pp9k!XjSdvn(wj_l4Z~B%uTr1Q=P7z94tmpJ?>@InwXS2vBG}*w#Glv2P^n= z2jRzX@GB=9XPjE15`oifor&3KQUtvZhF`hp6P$M4ZX1omi|pJnB>v_9s4iJ?c+=AI zKAuA=D>@G1*2DOm`aT?kN6$=cOzvT3J|;@mjcG(V+kTz&$gyl5KKFy8y9W}{7gxz5 zo_49Pyp+gu^__kGIj_P>7+oSKjVMw{ELXp;)-2V8^L?=~T%~!|b(R*AG)1>ew!iOH zeOI1L7r9YOhx=BL2pp{}_VZs>6p2$BXK(h`TEl`)UNJ(9(T*a}C7S(7pE@-Cc)1}Z zIb19jX*g+=Gm2P(nUUV@L>V|ao0Ux4X<`|XHBf3JurYxdzsrm4SVX(ixBLO8I5B{xsJN?U9!rS}?a(8?-Ua6R8=MGhu zy{w~1#kX%fa4i$6KZ3`+k8DKc@S|LFTt(X>fD%OwbqhPPPciwt?20$B z8nb;8k_TV5_~v(_fqwr)>uB%;z4Fk8P0^tGR#_xj zudGVa717C#K*llS@$Nz)l~h`3`wJF|R@CNqItASJ-QBnFwCen{O_F0bamu1|1YIRE=<=D0 z3VE&gy&R@3e8~vS-(bsAurl|f6}D3C`nB7q-N^8E>E==XK6peo(s;KFH@+n8&F7!$ zj1KqH$bZF&1vS$M4H|`~K{s~>p8p)E2)Xlq_i>m=jf8iJHoRocZ8w zB-vjhQAoP2f(8jr3n;t|XlpLXY>LI9kMXITx3|wDS?;?wy7`=A!1*ELlmTZ{oYxrE z|8*G^CjjWmd4BPnf(7z5=4ZZ_kql+(hqJPAS|7j=ss}lB)o#=88huw+( zJ?Z%8P6Xlj!>ZWl=hCustXS1z?QS3RJR<7m9GVY8EtzKFD6o<2Fh8Z^hO~?6l(@OI z*pWXM$$6La)c@h`WbD!xlAE4&y|WJ!2M0FWsO$Dh@@{V?=RFoC$10?~!>@C@H?rrA zg7VkI8$oqy#WGFfVliF?hqc{lZ@O`NpOW@{+GERIP#*d1N%W{xkaf8;bssA*!73@iCYiL9YCy5m%>Sn&aX|<#%)xQ}-hB#3m1+|rkkCG7Dy>52~d_iKr zlU@6aZcZXQanM@lUT>M-V~pt8hVG%hk|Ij;dPxnD+zjS4vDLc$QQV3C@vKiI4sW(1 z8RKwL10Sgk>GWG|;e>j#H5QJhqY$j&#UZQ&-JFA<%>lkzw6XNr%`SZd+KN${mWes$N+gsm<0o*BF*Q)7`67A0eOZs72m z>|%f{i>Rf=YchWR%Rl{VuNVl~6-03HRI!Lc$=I&qD4RZicN%hMOF)%vf8okg3gS{YS1oni6k~t&1G? zK$lgVHs8d-)Rv4j(M?Ystjyn=E%sAwq_HA)yXA0*T^$rfDFuj6Pd-~AK7V0^num>7 z|6Alia?|qfEtJtamX9USyIzK}F*)vrqpTc0Hn7c3mDK51Bx$eT9inj7t=+B1^QjAC zXwfV$>?B=@yBQBJmPLgMAD>P5W=^8eIf%|a;>&DU9i=LpD-|TEC$WfY-rrWIDN^U5 z2b)RCSkMxuYUXgnvjdx5@8;~qS0*|pcuTLett^lvc$3ZI9?+2IP&Edp^kS8Symi%M zo!@MqdUJHRU-Pvi>N(x($iXy7S!;_CrM?2!9g@+a?ochB_tjqc32K91X*4;eZWYfQ zxHEXOFBW??xRSz`&Z#0$_qdc~wOem8#NANLoJ_}0udWIi?rolw{X9cdGDKCRM`_l2 z&_ah+))nJD)e;0(v-Vx!2felv`Wx#pd>iV^Ncqrb5W63TVLoq-VM89_6BneE;F>Cz%w2zFpM>M2^xiYniHgR6jr#h&?ZN)SIf2M@&BV&%SG{l zjq{2{{eSgx0U${^uh`T-dbt3QqyTD=x+o_ANeZ9_X(+>aZSwr(i|xNr!xC2jY7j<_ z6M!UzRYO6HbesSrDS#TpNO##ef*Iw4~xuG1HvV3akz*VyPz zsvqJbDIi%Vd}fXOo(k32d}F2U*pDi(w$YU^waTHQC!|AAe>sK)n_nnp=23gbZ^Pjh zQ^@q)1A7L@F(y2b(oxj$ox(Ym{UR*g@MCv(#vN&tPnCV)aJ@~4qwo6>w;+@G_hn@B z@ZOv)uL#FGe&jvG=asYaSL+z-cFJzA7A~2jP`c=uA?Rl^ZuiiVK^4P+f=~D6*4V0S zAuBP{#mPDQcVYkh)Q|pV@gICGM4bw{mxX@pev6^n#d(P1m7{!)<+8pU?ONF18RE`H z*mL`J$SV?Efmc?F15! zO63SIhl(M%*0k&(`@;;0$H9oM>A|zl@N+ZXC>F%F&vrjD9b+8(lm;0zv^-5Enk?n% z+xm*q?Ik&@b#aoRKS&*n7sjKO zsuHR{+R$Lvl7Clw(AGrgV4HT<#WFMI^_~BN`zuFB$xYE!O8x$$UY7f^G#YA2m2%)@f_WSA= z(SN&?X}^g>G*_Kpe#nqTj({Sp`JN=QSaD3c5~ zw`7GhaAZH3ry2Eq96Als72`O^hlSF*t~v0`>UiPTDeC%^<~gNl&pi6^`{o( zdipJKG@Bjj!~uPMx9L8jmk%W{(esRk*(n;oP&|E|ir9xHaF0=zrb9av@j((`j^OA8lDDw=vw|! zxqB5UbvJn!x1PP3L}(?(M1Mi1r|7UVA02@yZR<2Ix#Ll!-E;5NzM?t@E@+oE+B&b{ z6Z-@^1ue>)tdTL_nYa;r!eSbx^azT1S^L#|>&~A|R>7Y0exH^4yaXGUIz1ag=Y)G` zACg*V3 zNC*fb-Q6W1-5?azvpb2YajRZem~AnxUR9Dx#oOej&VO@+_%v|P_oP6oSb_B zbA`HPrDtH!cdM<5WX$H&WjTcFZT1Pf;>W5*X3FXLyZ{djsEX-h$~f{*oTqmA@SMsR zHQ_EN79vMa`vyT?&-EW0t5v1CyoDxnvdfLq6ehFpwL;aek{y9~+r$3!jUBz*hO%-9 zAK-wpM8f2LdGI-(qVC*M!#fkGV0<31&Lm>wfESbJj1kZCTjS=zd< zAWJcZL)-Me5R+g^QRV}(iJ)+O`wTT!u(fUAe6bZ3v3f4m&j(n^Ng03`#6Lg-#31gXe|aDQN!l%g;SEWr*d4$hmS$G_I50KPXEV+<#N{}=!bruPjefdBZPpaDqvoqPVP z6(sNz0}z0B(O`Pta02*`?_N1On4l6TfdBX|nhl(k0q`FKputHQ0RQn_GL2zSXz9R^3S(E=11lM!je^(IbSS^WTc%v*oPVPvgP%bWHz`|1I zeZV+v98!luK_ebV^(vH2o83|Pe9ME8Y|6B*&oE&tk!|fD#co;e&6-)mC6)+OPsjHU z4mhuka2D(cuvoIR5+c$iTQEMp8yFBT724PmgTjCL!JfTaUn}KZKK*!)kE9YOwe)aZ zDn0!7bxD+z=HsKwZCyX)MbdsuSr^qjD#8f0vxqPKiqn=e(&mBwVyU#%V?&Zpt@v0o z(Vh5}?Ipo%PFpc9Q(h%FC1)sXE>m=69mo z3ir9sp9-?mHkE^i3W~12ivPp$VRVO5GV`MnLo>k!5Br;8d0zcU`hFS zU{Ef}+P;1{9m7W-%`b^;=vZRQsI(#Z!(ps&laQvFo{_xBAPVIZspx=^c}$act?-B1 zsz*ITqhBVU7lk>A+B@bA1;qP(-Z`I$WANhM@{a;WEkCW6PuYUwO!U1*0{fDg>bapS?_44mcxutZTj)bcf^iJl z$}vAWmD9y5Ws*rvzikhNvj}l%KFD9y=j|qe>x5*4lV*R1c|QzKx?v3&s!V<`v%o;f zwv=8G?`gh+VjNQB`&DvHS45Mi%e7|x&-&bk_k#QlgDTiqTq%pJy()sl6Ngf9aP zjfBzgl-QZeFd{^(8LmcOe5z?%?J<;}U~(755ZP(3cg*CY^fa+RqwMl6kp%U=#=*%E zrej@EpP5z4*Ke41oM?I}Ev|lSCZ5In?aOM!MSkaKxkW9ki(_K#*|rdIb>fP^M&%Kg zJp3CFtG59ow$Ek$m)^*NNZTOyZqIebT~OSFURhWk56c9Xj3xGCjl7L4xbKD~pySXQ zR+k)5`u8bb3Oq77)0dx)lgB>5QDr}C9a42NFCIdN#^lsV8e^|yCp|XB7~j$j_x)Oi z!SR|W{=Q8mPfskYrf*i#8Z0$$=-9UOqJLiUCW+ER9;oDVVIGjB6U-HZw*3d#V9TI07H0KRHQY7V za&%rM!Mx&U63LzQAASV0K^LRpKmVZy#p9_+kCWORGv-*Z54YNk>`5b_ku_KxY4waC zjxo*Y-KACFD8p;^kHibc-l>{rg>F;C!%{hnkz!2;M0`Ca{c-qM5YAg!JEnaH96XBL zSNbHaOEL>B!(JxLXBvXTpGCu^-$-AG*9^Z0OBHG}G-8A{ELv3EKf!LMO@5F7ZX{?+k+Ma#G`1JWf_}Z0< zuWaMVZ0wVymAMPM2T;%x`k80bh%#^Gcj#u(S`>rUr!%TVyv{=@qc9l|G$|qC%gzt2 z$;;4dR$-aU91r*Fsy_{@I=*>_oiw$@zuH{F{K?=&mBN(kQiD^@)wERS2E^Ii_qeBW z6kRz4I9;+Yy3IS!KaDZCOt4w58Ma|wah=)S(>|W%2E$cv1wQ`!xGF#>g!3k5@>^W> zmJjQOH{C^p2lq6aho_flTgcX zGIBGrFmtgnGfJ8m7_%~(7&$2zTACO+3pqPGS{S-Gn~2*v+88*~T+>!nH+vHjCLvo} zJLl`4R9p<5Z+;2he<=01&=v<2fmTO<`uYPaW;_T0g{GUbmUj&@%rf2AF z0?u`vcKr9x{gZ%mv4XBY_%}}E!>=2}ElQ$#ODsMC-ih7Z3d&Bgg*umKqfB_`Rt#A4iMd!)zR6 zXM$59%3=F$v;4uR$3$UD(Jw&XdhJVjNTtZqjUI>l>CL2=*~^4UF0l}jmqLnuR9IMOAC$f%OkJQ@ z_`&rPp8^TxVUWdSNM2^EhLVD4^s6>V4ziW3k*FnSZH*LT?+o|w`HeHPtk(=bCKcL4 z8I6UlO3lbsBhLyvxPmvHp3xw2%ppT^ z=^b)`pP{o>{K0a$RoOe%5{r&67+M#?iSR`v$9TZ!l*o@iYh1TBdnXLqVNO0QH_G@e zxpPkNw;2v@AwWack&YsY!KNe&q_uxVG_gvO(N4qa8mNSOL`%Z?wVq(82P9)1%b}wZ z>DGgpIK-ae#aThdH^{QqXgk%3Sg~5q;UCPUZ^2319sAKxWV%xj!-ITws4PEG3i`05 z+C~NHn55W(VC-S;q!X80t9^#VKk0*7N4%riQ`t(QamRKzB1RN+6?9TctB`S_h9=XC&Tt*%MWBTScJV#z`Lh=W z^g=xdAz(~)ja(cRSR9U`GEhm0`Mh~McDE;@1!2*|m;D^fao=fV=kqgkt&wcLZsCEl z9`@2DRIEm#K#zMs$}5^70lFuo)tK9?7Si*D><|vr*^^CH2+tRZ@R+Xi^DvC@9AJh2cqHsPrS|#FsM`L!pJ)i|0L|mZ~qYWJZ{gw?SPYuro_mYP&&b z+-OxD35`c38_d4dmk*H@!wZ)qhvaw2=&3n77ZC-U;1It{c2PO4Mv#2Nb~B1UT+hK0 zy+ZP4^Cgn&DN*Dv304}42if{&Qye3C;x3*^PeIBbZd z?`?Ye3eP;6TKpbZK>60Eqp4!uQ=M~Ar$)EkkjKgy?aDkjpS%V zce4Zch@cFC#R`SFCx5`45_+Db3SJR$k$puJC9e)XmU!#qn=*Tr8GK}wFzoIHv2Azq zPNL#yF8Z&PlDnyu_LwG10v&WeldlHx*=Kfag2NWn%&shL&^4SZ|;qQYVf zCCi^zHQEx-L8Jx21DmFQ2^U-;uwn1XCNn3{SM$g#&tiE)#f3_GB=caeUgb;@O)riK zi5^*Bkz~4={k6tSjlBmBNp$TuMX8BeeX=-TWH_1m6l7tY<^&|in5y-f72JMkE{Q{R z6gb>bW)DY}lVL%u&YXuYMC9CAnRMmnX98x1kK~%9sy_BUTZMlUK9c;7_iYee{FEhf ziTCFQG(7^BS3gbl1?t4b8{80t%bO^pvr;{HoEGDd=>X%sSRwT^u?Is>eUE&inQj zG23<=o+dFo)?(V3JlGH2XI&&AiO;YjA?>yid+JytSh^HoWTij#ZK8W{dHyMQGxz zYLMZIJ=9=&A3z|vw0kt9gc5gOmx+<@aD3TxRVnj8eL7=nX($`V(oI#no5+zcxp_nogT!-<`_53%qO`LMq)%>TUZ{t#L*2CRR$Zl$4q zL;w7rrp5oC`sH&0#HYA!0$IPKg}4CXQvhf%T8IlEJ_UdVqlLHt;#2fDTUyn2S zLkeAsu)l1>KP3wr>u;Kf!!>N|mN=2FbklzN%~2AX4n#B5whOq(VHvMiip4;3R*21W z%Wpn%K$zZ1|LN^nM!5D&1O=Ktgp?-K^OX9Bjhpvz&n^}cJ=dC9h#flO{VNJ@%SVp& zG9(d~a34?B%b#w zi}Go2`8uK9>t4c9qog`m$=zjo{DiR3Sa?oMnKA&rVcype`@%0vgS7bLQ*-#2$7u&C z$Fg|^m^n&)2*qN`&L^02Ro4`F4O?^hXqvc$|MV>_D$Cy(t+s%K?8LjWv$}6^-O)6 zUYhe`-@KMbpQ=gL)GPTI!nhmXN%NMy`Pe`hDT>a?x0{3 z=A8{^($PPUQ0WVOd6BWO@6sWH_|7p=tz2Q9>MRgeG&&r1sLM5Pju=zneQO2ATWROD z7zzGQIbkbF{Mq;EjzqLv43f{cvYd!08?F>{x$(~@*&$t@z8UTD2>P;(h#chp0Dr|) zYOd{dWeQ?K7HmhAlV@e7V9GsHfwQz0ddF1!3!aCAQYCQ@&=@O%eOf=Y$9L_2$W)W+ z2{jdMLmGFSElf|Y{-TJFS1I%){)c)oA*bvFc4wpmU-O*QdrFlq#Kj|NkM!u#M;K#- zXY)mUHGQ@${`d}3#(dJf)kEWO3OJE7)oIejh&D z7tKE6-ieS+pvPto6;8K@2&UmxI>m@;)Gn)Ooh(L=2nRA*8?&&BA` ziq5nt4nyFrVuUd*CRzDTMGmXN@up1(=Ee1Nspb0xG_5r{o46a2_SHPZZU4x~No8u% zqb9HiL4*k@+E2%0XF|8C&+M5?u=D8Tu#yrPn<(ff#bvzE_=K0BcBcn2>-WvZvU_o1K1MY)yO!oqA9ZQ+rw zWTNHUGGdX25yPC7W;!C z$hR^zzd?}yJ?HaVGok-)q!=K0!*vto`7Kg>O<3>HoV#dnq!=J~1F$wYQhdvJd-KM< zyEa(#UyFHQ&|rM|TmT)t?_N1LUp^N=M{fW$I7)qECioXu0KRf?Mj9@F90tJJ;GP&j z4g&xU?w$kWF#ZYpclO$^;Xy!0I$Qu9z3;C5t1l}s`fkUOyXe0mhkretxTbgiLoNS? z-u-V8`i9=!L^n5Fp@hkU)41$tnnShYpe^!XfMWT4cT4ko_s> zNg4o29IR(Df4HlT6V=2p{wTPGY21Q@6yIttbkqVrY}=$}4?1w&uc7hjVAnnV3%eTE z*hTN+@EE$dZk-iey--+Cyz{m+X3rDuDO#rJw)?jJiI$*e{DgF0<@cJYFdlBc+eSHL zPT)gY)PFV#4=SM1=`Yyh(eo4eUg-o}zoe4repmTNm~Lc(v>nObYth$Re4O3)a z2-%O;GZJ|h{ja!4UGw@$(s>>Xh=VxYmM?MCOsLL9q?m+-%ypde)dX`T=VGHw!jc=P zjUu)OwaO$CRF2U-prB7g=;v7pr;}sri8Ph&7fbJAnv-wfAtz-X=vyX8x{8a4Y8tO4 z*j)u7f3AJGGQEn$U?WaFoSzero)LkF`W#;*Alr#*3Jr$snA=a^)x_gux6*D!Eakw9n9ru~L#xV7ho&)AFnM>4N;wzf4?2#qTG?#J zNV+Gis?_BWEOdSxtBBc%`QpA^;j$Mjha9l8l}@*`pB6lu0Lh zn4ud7hxvEqv6W_%Oo)j@Gj)d`qMtMOZ}lp`X}rj zM+qys^B_^)Q~EdT+F|t>x$eq?!VruPc7ikO;5w8*uM^l{(fcIvV%YE3Tn073Xxa-V zfPx?ICeDm9qs=QVk%c@eXQtq#hF>&(HmdEECr&Dm`#wuaj`dOjlA$q{@TV`*>frrt z9ND4TrXS(&-e5E^nt%BEq5V0xN9;~8=9-BQJ+x3cWS%Hv6*mXZE6-E1QCSk?2p347 zfh*#B$rXY%U>MP@VAy{jBLYZ|aoyz6ev1)Zmly6ZqPu8t?^l311ORJ;d%s?P>Tj$K z7JWB8c6V*CWkP`T7yud^rvaEl0DuNpCIm>20ieMZegNhW0HDE@2?5e$0BCS!!dqU^ z8!mTew{U<(|IS_mTPD2avj<)qY?%;X4#C~;4c0Poa~^+-!`}JcV9SKp``|zCbFgJX z00aKrD+kZzZaeUQnI3dl{%45%zc)&_F3FxbE_FyMX0 z4+Z(lXFQ5Bf(mh&?TsaD?e$g|>w={~uYUkyGVSQ7xiP0Hju;9nzU?frJVaMOg@hL> zbkT?a|15+%L`3&j$?#dOpoak#B?4n**Juo9ez)GnG|%}r_5#wRbc6U-1ltPu(Ms_* zG;Y1lY4h=>)^m~L>GZpGh|%^>5-ei!@Zzk;h6_e@X+QAW6?9#^TOn4JpNV7Jj|o|D zXO%4dh9nz#M!90i2SJKO@~veM!sxnU7y~7jb6qifxy$tPxeFf!`Wa`u5i8tjAiA{m zA}mCS@uz9${Osf}DYUdZiIQU|aG9T;9onq%eYR+BW)q*Cw-)o|vtm*&qSu_d|L}+g z=dpBg7Ai80XvjM;iJWlX8kO&eGbD;Wx<~2fmaKC@iTYb+U8p@IFT_uS{Oy#+P$rN^ zyshli2i}|Wn%BS6NHF%ss|z#XUF0Zv-nAoFH11+~76 ze;hJAQI^h7s7O~(Bd0>13n}9<`PUul>Ow7@^kYF~g^mITHSG3c?t5^Yx|<4-wy6d| zat-&(C%qTe6Ew1(arYZlI@DLgEWfxHIWcLm|FM7c66WzcY_^Q6jK@LNX|9uKGvtp_ zeC0A&EXCiua~WOY@E0b*64^d&S*l-5e}VF%*K!DbNm5{~2`vNkwaC>K%Vg*)UFwri zE1E@ZYqJp#e%cXAWz#uv--vU+{=gAX#DtU?pRCUh8r^B;gQyInE9N}xkDlr8e=ZgV z^d3Lt&>Mcf??nFbK3BV)r1#4y*5@|`UqVUw1u}+ zE9QD+=q6j6{-|lMm8FmqywropOi}(5|13JwGu3hzkrI(IiZos7cEslRiHavJ?`!MR zElWWQ}JTKOUlFOlkO^ ze5pe&k?hkosl!b^6MAHJdf(BjBpbbvdXR{m;2jc{+-S1%XfOHd9?}YFi(}eLd^)`g z``3FT_?TZLQ}kQPsxhj51XJ!q#URCfwl6s|rG{BFrw(wMI=*MnXY(8qm8dQEMHy8qYE6DWUM_>WcPFy$nsox^70BI)xG&lka zkahw{oddTL;%wk?ye2Cqz9080ziYKzt_LNLul??IoOgOK-vjl zZE*A#AngQz21kEyc`a{9Re|aa3FYzWTdpaIH4D0DScT=xbpDSO~poe)pg58n{*)TmZiMyK94|-nWhQ z|KF(hH4(n1+$6um4m<0OCHQY0#$2~@w7;nLAL`}rsP~^G+#BkBGeq|D@jR z%)i+dFkIsg>dh7DGf#%wdfoOf`h}NtOwocNK9k`|x+FqNl!Z<{18nq+;m>*}GzRXs zJ23ZU9Y6%B+)j@&#c;xfXRp-XhBYxQC1SljH%t?I#0bNQ9Kej8j|;6uYmE^uZkS*U z)6xADY21v~g4~)Q0cX2y)*Ys{D43pcL>S_s;=z{EcyYsr9~DUVzD`|j5eWKJ35Rj_ z4wLxr?7e|WL@SdE7!0L{x29da2os`iYVONJ6qZ~JE*MpBQtuDYO~qwpjlH38u{gmw}IzYSNNptRDqNngrfKqey`k7 z;R#zHxyW{grbcz#=QQ3L3uSl&&99#!Zgv!3QA>&^aT+&k&$B(`>4lh0!Ebkd@5$PJ z@J-Q|PfBp*SXQ9H)8~9dOCsv&bV~J3l+n&5&`PhOxR$@^Z?mJ2^CB zvR?@c9#HCc1fh1YV~P;^swD7vS(^C>o6IUKtZi9m%(o_*k@2n+Sg@&4!E990V91ZF z1yiUP^uWSA)zM-yceUq;=pcL$k+#6PX3-^`z*7y%UO0P^>n73?^Eur?qqN$1e>omT zX|Pl|-BUT7PgKFC*9Bs%TjD&O`a;kaM`A&HBQR)M!Aqv=A}Hk!kUzb3X*LOIRel?_LR=7u;9<0`cdZ;iX5(NN>mY`jEXUq94LkU;GT`8Z@__ zQ`b1EXQUYyi?GpV*MT-q@!#%UFnjp{BA3FO0~OydQLX4RUZ+sF_UVV9ScXgG?4r1) zj^qf5s9jvBFrCWeqA$nC0jS2UKc@R;$oJ^D-C$F>5#Sac+wWTzF@07(5cieQv^4S9 zqIQM}MSV=*8ttk;^4fX0u<=9M+*b!*1F|f4a&Fi(oD~i7faU?N8H~KoW?_@v14+}K zI`$pDg-XkTF0Xk{P>)PPM&k0md^Iq3%IX(#+|(>}3d@6bp-WJsjkZR6D&R;pF|9_)s{qAL`K@XcmvoBR!VfiOTv5ZCXJdU|N}c%o%oxXpGCur@+O#Ho z{k)TtbD^&64=to(tM~SbeMJ?IR?Flo^q-kkL**P{hA(nK`G%^ z!j0x7#GfS?I+EkE{-!R$WS>Asqt}7|DQK&`%p5vyw4r~F*LH$3 zH2!C`ymW3+le-V^=U^ds-bWhsB?%pz3>$}N*6J}>==s#~Uv5EC(%5-J{z=(Y3H`&0VLOHhgpZatZ(<=%8{y^F z!Q8#b{=FVBD&ba?>c3AVTo2Q@!#QsfT)(9f0ET98-9>{@2_S&H6#yEHN&o@mt^Nrb zplEvM%E6VnK>&HHyK8fR;e8;0ycGZ%Oqm;WJ8t#MQ+oHx!SH<0O{VD4$Oi&) zecxRhOcx6fz|f4lca813nhnJBK|rqWJ8QFDn}>kW00sKHXfVToKtQhVJ7};f0d(8; z{fA0myZNv2m;Y`5ut0y4L%jaR?ALdejUDu#3-q^=yuVb!9|H65RKlM%`ClplbmKw4 ztr9@jYWm;*bN{IlIJjAVvp|2HL!1`B?hHKtllgT|qp@3X)+Ap|^bW1$4v8``LM=0n zW$|E|R6rKN*4*<~Pot&%+ff_qOikA=pB;9r9xi|EL4}y)OHR$wO$eI5?&VjGYFdV! z8`<|6m*{ay>S?LSW}(ZyT4asX-HuWkc?DIz=bW#}sfnP(J}Ai(xJlWQzpUQ7*g0HQ z_gf0mN}$#R3FXxD2o)TdogXLF7Y9h7^+htvm?GFFH)?1gm(zzBt(+nVjD&CS@{Co# z(fQ{8Op~!FnM8?$h*eFYaM(d5apz3=W%bWlPZB57_T-v3y^vK@0Z=>rBztU3l2dqZ z2w2c1W?mQ|Z6gxfKbDF#cB^P`JNdrCq+t~6-x+51Fy|hjfZ2;^(7vZbiTRgr;g;}) z&k94k9Rd``PG0e9Xe8DDc;MB*ci_k9YE|hnBl>hW*F|`2aJkEYta9FBB)Xw$TqJ6Y zW-o&sE2UW|mwLb4Ts9>n*LLiP`|D<517i`jmF{Yr0cHPjxp5?>zI;eaN2^F?vZ@+# z8wNvl2Q*&$0un}!lx!76Xcad%!>cjX%LDlC{OXN^o^RiE)In}(GrPJaDouEotRbO!(WMo$c09UDAMNstb&N9iC|@;`NoXTKW`M24A~mQwh+i` zw)hUjf(A7-f*ebgdED~U^m$v$K^+_^-~hm{A4Su#=Lu4z?C4QPu8TAT$dW zlK)plnkwIc$4)#?enf}}n)~87)ur#A+cYx2HPemu()0hgj_4>-RIRVx^HYNr39V=; zpZ;N7IdzzJvWSU9nvfc*V$uMOzf+OKlemf^3voNR3748m<7%comEpDfTOTVViqSi| zJu=Jk?Ub%?rr&ZcIN~s4c`{KD>{OJ-AJ;Lkv9KviT`yrz%+o1cjl`>-nT-7PTW z3(l$Mdl2Cn5wr(CknVRtXuRu0BRI#@^9Zp0Or-KATNJX9QhcOu0^Si5iBsXg)L@Y{ z+9us3k797^BwYOSoZLM{$Q-zDTCy?6`h2tSSse7*C&gl)Ad;9`PdZ&Nl)`Cvk=li( z?uQwwHsS3$o25B_PD8`;8A{)p;rYT`%ww8a+E-5w!keD_>b zFFlKALA%fm_uv?#(j<;E%i2<3yw)vTso){m)<6fJ^5I^=1`) zT#>K4+&0MGNrqoAQNDz*ofj|I2wnKWAupmSWP@$+q4&j_a>3*)^5sy?2VR}(w2AC! z+$&|1Qg55E?e<|%QO#W**>p9HzEaAlOyZLwi^1*yfw1Lm0A`DnoWc@IRdL7?m@KrCbV%#eg~B*IveWzpDi$i4p*8mbPi?Q z{MY?Y_%BSQfmIIZ)|jXNI+X(gNHc-{m<{#sNA+M5MIeAQ695{V$^l3-0ieOD9Dp>_ zKSAHEPv1p@RXG4*CIB=zm2=}U_^Z+YK!Z~`w<1fwv;qJcoXWZ7w+Dj;bD9CV@lX86 zD+hC$0Rphn16(;+^j-7TT{Ji|4+y|Y4}b=f`2zu1=>gDSGJl|3gDQaUIXE*92*65z zcWv-&|F)O@54L}I*4)1h|M)FC4(qiI=6W2@wIzp>gq{6Ap9%cI)&I43ezE;OM9bf? z{XdTZZrJ{fvHuR+zh&6}lkKyBe%p?t^ee*mYi3=e#F_mu{ZzEkcD_|PX-hFb`BY0f zAw-LsGRiBb(iFn;T?u8!#TobYN4{cG;;|K;Uk?tfAEkK)RO_#xBo`0#$VM;spt_`RKLDcg1liPT@VhFxn+L!w1i zX}>E4Ee#ThX^~Zhm{$oUgz?JEd8-W$LbE_Jp`9kMa%76;BxEq7*OI6%f&>$gSURb@ zD#Cjh3$S%lF(j3o~7n8(|h=V9RkEXmofEK3+eNgO|A8_ z?ZcG4SeDp@D47G$;B&o0sAie8K%0$rLMTybZEJf62`dQ<*YCbh#0Rq;dbyBi;ej~W zg?}2R^F>XT=h#fzMZ}j>;K9(ui^y43ZSSz*4@os{E~^e^n=f_|n?{8^2#l`b{E0kt za9UCl&y2<}m1}56W`-AoDJ-aNlzD_*)OP`U>8Z=Kad_nW)Z4W7;K>_tCE5z9_I$zq zC^{yVz^c}k%JnL~BI}N&{MGcADA_T19~EXYk1$c7x$gH(E|prlP7=O@Lj2fY;m8>= z^0fb*{}4x|!vp~>k){PsLHkRGoq-ZYw}hYPDo_&$yfWU8vX9fg7FAb#yILd_4t*&; zW4B&=#a*=pdK8pONVj`hl_OZGPsy;hJNU$)W5`JF%>i+6%e`xhjup9eBgJcW`hAs= zq6`ZW<=4fHn9bkQg0`w!{35{mXz`U7=W#)UDJG|cvT#od+@CMA zm4+pmK_5+Mgfmdw+qa)U7e9<&_0Qm&^O0P2>=1Y5r+kO_Uccsj`eqt$T(;G>ryqHh zp69bnzW$bw;jk0b?5Is>>Le3J7i1m;$FLCy6LFeHhA?=<&_xw1GtRR=GwfIFLRUS3 z96$Q4d`l;S=gZFzn~sJ(wzZD;9>!8lC}jV9gK8iG?MlkH(3KFcxY0VbCxyl*r_(VnyO=juIi@}{y)1rzY}9u*fp>| zeKJ#5+eO4E>P^sQUaPVr`_7-(*%sv$tZAJl)H;@}Kr!U|sI7CwH)hcgbA}P`ZEVh( zXfG6?8${XL!pc@4enMYy-8&G}6a_;qZ$*v%`=}+rTo}+z!s#zXCUDdeAdduq21hLc z=E4A=!BNXw&e59}_T4K7i@tks0I)U~n+@oe{U3O3a5fvz%_;l8Ub0}&;D{-Jv;Xdu zgR|Lyt|{lgm)*du4ep5nIQs$C26xY|KlL}(28+IHlmS>9+!F(E_TNQ=OU{7+oc#dk zYsmmuNCt5B1E8;u7l6@!jokr1G4Ry#wzdBcYRP=Fga7h3{tpYu?AJ|E*suS4{POi* zn|%IbAsKW-4F9$3uc_t#Fyz0Xmj7EjzM+Zovx(6R!e%J_1+UNN7I|1KVlxV+===^_gP`PGJturP#s?bJ}@k^`na2@x~}Svp=qgJlMH1 zyW)KjgS;Rs%vDD4S_9d^!-S0ZOL8WBaIk7{_3I^B7VN0z&rZxWprm&`Za$|Q=IP?;XgD%maltdE{_F)!HH_LF3*=o-EWNEQd-0aM2 zHNozhE+hqW^a)o>O8l{P!gAs%+U}*~ll7RoC&-gEBNJwn_cq_XAsfYsM)@#_*p&X9 zmmZOjF!D2^$r#@gHLv?G`7bHV^a{#LCMXlu6=uS{us&_0x|b~NqsE))2=V-g?=;`r zP_>gx5!H$m3JcC8i#d*18@wO)824=xmT|#wWJW1|k@izGm`8aJ`kI`7ux^uyX!~90 za-~*aY`R$!_TxM)FW)3%HXzIkrOK20Bs`DHDD`tALgw(5F_~xZwUY{eZ9($_wq>4x8 z%siRF5247I{GiG>_+Fiw6Ys72WC4sI_bP9rp10&jEeIiUk75(ZF|&_?Qio%D=JYgN z_UG>MbBi6K$wC&WGe1Sc_ZFyUMAb${!W2~TC7>LA#T3tUD>nocXO$>aez1l0%SygP zpYaH{#N!;z#Or`~Pb|UKtAZAY>6I!=PpEAv7r&ttPtD&?n0F9d7$&m-{c&#wDgD7}DE)oiYHIx~;@JpB#40w0~1@ZC$y@sC( z@9T{V+FFsQ>1h-^DOGFGEpPLm{em=~{bjEpm}5v;!XAC>JY+RQ2B~nN{lgA^Q#nVc z0|~7B{&}pr$+TanP5n~$*`q33op`kg{-G_A=e=7c!J#N3*MqDzv31BZC}LnzHkEwy zB~@N84i*+$=kZp~XR~=y&VN}Tym%wznuJmSZ$i=PRhS?5eG}$wVYx@OiFAQ&?PAI! zyA%`wrFSXmgJ}04k9_$;$94?cd|oQW5@+SRt0Ep;$SIfm6LrnKe%M@yG#poKY)9s% z`w^03PsTLp$dsE|pCc{>z9NvSloXZPQ9Q&-F5}D>yW5gxdZT738OmYv$o?uQ2|A^r zNL4m~Ku4g{xuURi$asFiqE9RW-SgF%BUPu`s1{_9-~ z1`Vz}31H2?d)GL?nJ@sX`2gtaqBS5J0$NrjzVf^Fk-K+|^}1*cjQ*Xy_6rFNzZJ>-MYjLY#(zh) z|190!knKOmzyFnN-*WB$S;ysKXa7yIts!GK4MMHQ-}9MQqBSh0Np#m&m?D2r-bpF8 zO@y`4tVq$WPS;aR&b8Ap=N1`F!0VzoD&i2-;^xWLBFS>Jn9tsDWXX5FhMNQe}RtfE`{dEfka)iJnw=1N>K6h`3+*mk_@({FUWH>GF z$iqvr4qi?i`{h$TMCS9lhsyNxbO#V1zHnzb}A`asg zlkZ^edHJEmupG@56{>Z zn4$P0Hu(Vrs#c}cBs=K{QA$zZB#eBeGgXLFtqWBGj^^rnXGU}A4L>=X7Ran&b!hM z*k#B@Se{Odcd|`!FD&4tjRvQJ`D})s?rHHXhE!P%y^pfYdxgn}F!4NCrAe6m6XrXg zgf$`-l+dA$>!U1o zOd}#r$e=&9GO>wV`zahZJKHkw^6Y^&$45VDo|$u)O4dV`L0Y6BA&5i8NLgP5W=+~$ zOi>aP(KjDOt7xJw{b_ihMSUEDbz?;lY*c4ZYxu}WyMxwo>Bc#t+nr|S+C z=d&D?+7|qL=if|7f~~J>xQMNaXCX<+6y1pa^)RtQ-Di+$S4R>g4+|Y1@;pbpOlc?< zG>bYAJ}R#!dbEgR-F9T}}T(j_LUJa7B^d;@yhh{ZI zzg%s4M>?2`(g@|#?@%jRn(8~WCR-a>A3`Zj*XUnkzzX)-oW@}^nxmkg5Lcx`7(qwE zBWp_~D!*(BU#bq*OdFyIT`$Ux(LpUf#z(V-pPtR5G|Zh1^;_-bO#c{kFNxRMNo3q* zhjIqdp)9b`&RqVUxCYhR53f}W)9enU=~2JUw{v|qmC1)xAG1VLtk~2p*mh(2Q?}y!Hk2V*#wikhQ zL<5e+LL$!uNY?XuPurYOqH4ElTj@?Ui{w-r>%;lJroGsfU}P%p1~#zE#Fvy%~iI#S0y5r_C{b_8|OHU?(NypdX|ZW!|9CBci#8U zIAikK&n(Nete$Pd`uuF}wRsm@X=k7n86EXG&CW)^}tO)3*u+_)|j=kJGdG+WDY#DXLVhujE0KEkqwr@*q32 zvh!mvCu<|zBy=?c;vXkVA?Eppf9=J`{@FszhBE;dS|rzS@B!C7+WbkC9BXyDtwAk@ zTwz1H;?g70wu_AR$6n!TG+j=hGw4*Woi9EHB*qA=YcN=#xVjM@tdXj;y|&i$i=i3+ zeH3a>=%btm3lHDDT;4CUk4dj;JV$bLh_5Ps_Gsd9KEzwB%~Kd|1;zZLEM_lrtFP^G zI~Nr`Fm?#>GKnH5kH3$nO<+b$6}SaN&uw}Ro;f9B!*cki7F5$k6W6`o?vV~#u%@kv zGR<#d$2j4}E+J`OWAgMF=QO=~W@BD566HmQ&%CWuN@?X}TZR^Wf8(!>36%a;! zkH+#PT;hlRDG_T@_7>zMR_6Yz`GSyS$Cq?FUzFT@K4bIlG0Yuo@y0{}D_xyB99U;Zu{oLu7uNE!g3!5k2A10)UZqFJw> z0+3we21ptJps$NI!06xEYv9G+tpR7h#NHnw_wU5spNA>G#2)ueSmCy5hx=9r;ZL#0 z!Tj46{b}24i@q1vyw7CEY@>18ikxWb6Dbx|&@&PmLBw2UoRDao^~LClkxQ?&-o2dm zR}b#bOmA=ZP9?Gx&S78A>hvn@RtY;g)7t(rS#bY{Ay*kK+$^)Y)I3bZ=f{un^Bzd) z_3>BISS%yMq-)a;3^*J2E#hOmC?x-&$X7h3 z@eRm&wIDkK^Dc?kP%+elo8zvKUMA)}IJ`NgX=6zI@l0h&Lr=bJ>ly|f73A-edZmfQ z7ch56pv&w=p>Rz8I9WugMj!o#G;6+I_BbT8b63_0D_X@~TH$ozBBfqtC2WqUzafru`=naUmM2yeRSBF7a2TNH>W1yJo zbU7$(t`O~~L}H34x(>oj&tG0>RrL(B;%E2Rs6&4Lti_4980ucI8N8CGV`3ahF;G~f zIyMdxNy(?6i6gpXLd8WLsf~S6Xq`=qAne7iUZ~3OT7mvS6zOb*mzui7)MsTqmJ7&( zzDNGP=(P^0)E!IAcoW|4(YO!<(^8BgBX#>nM`(4wDb^u@#Wm{lj9<|96C z0aFgF1P%*B^zw#tBf4Q>Orm}J*G4C6&bnw%$L@Q=&=r)v_*V@zqju1E~M z|Jp^0{?NUF2PPfOqRc5wG+!#sP zxvDiJ8rSRY&^HG#VGmH}<90u5T&i0Y!&RW~62{vDp^t$xavi8lt?h<7nZm~mQ%n5x7?0HpG)}eO zsxkR~!K+rjux4@z-@#$F} zJ-;`@2cOa%79+OwBzl85-hu%MQmwtM$gf_ihm$ipjKy>16t6+i_{5Jq+vHWbY&b8c zsl82?wBN`5i18TcL6^xq{_0=do~Yz2ZvUcXm!g9esZ`Wn66)n6`%-_AlyZD29(Q_G z`i>6e&3v++HT)qrNwIfdjOnXblE*8XVZX*OjnNh_Yxc%xl+CXRQ9U76q(-AKH2xeN z54BDQQ@J(8_VH+#_eBe(crW@+!3Lf|;eqrDa~jnBH?L7O8EJMWW@e*aU@yDoq>`(z zUsneXuC#mgXV*e9YN_qlFo-HLeODoqb%c)nP0lP-_uu;8JMRyXBUiWKb@`0qgCsqJ z#)zyjWU6u^yJ+_6|1tNLaaDDD7bqaz9n#(1jWkGubT>$Yq?D+1OCt>eA}J-^DUE=r zgn)DkBIVukoaeo-?6uF~x%d5WzNx=G{I9*%+;ffbpJU89!-ZP*V@vCo>9U#$cDT_f zy(v60-(;MW;*vkq*mvo81mrxsSZHL<6f+V2MbyF1)E{zT^6~gu_q`t?udb*nP7lRq zm(!2BNnC1^V0Y+?KCI5n9{lu;<+JrK_c?K&k@xgCA&4!_S;TaiGyO$gD|A;enEPLV?Jk;5$_&%`o5xjBQ$bX&m5xn8_|1BT{ zLH>o?tyBpD97zIzh9G?e0ZjY=Xb53MK>!m!02&gJ1~Bo1qj^EX5Rje#nD_zEpcM*W zG`Q>nK!es0fzjYp7yu3OL;<70SLguHAon#O8o=>`4POwz#1DXmuxcU*VB!ZyL$cuu0+{##(2!&ofQcUf4M}F-^zZ}D zEs%~t6};h&0-l+Ek2B!Gb|Y>4TLSzg82_CF_=DBjv1Gilj$?c483 z3AKEIc)_E#Yf#abpIuI%Se9`hAFdH4Cxm`MfuoRmrbp$m@~R{?m8HA3?(6su>SP*h zp_4Ac?>(XCs0DAsc#J2X1>=}*?&fd11j;tI!QUAP`_&AaA2==gQ4&!=C8-O37 zOCOLUWBvGL*s8S%GHinYv|n%&g<{9$Va36^dc^rdRU*M-E}yT;S`JCqD4GLrifQbaR3o=J9|Tl{1Ob*J&4D|mCL%k}Dvw@X*Yya#RNGp%Qn zr!whdQakWCA3kDnW0m=^FGl=Wxm2D4M_)>WI`_%2PN-K%>X#%{vtm6VOcy8AN~PG5 z6oPN{;-5%ia;Z%ENRZ&z3ZGKtqtV)gKy@>B)9B;JTg6uIQ&cALhf^FX4mf8exFgmS zTAZz+1?;dIf7_FuFA>Mf;U8$>`O#9!Wm z#)IuGEGw@2LIaIMEhtCG$id;f%}NN@SBGEVx~v?9%Ny`UPK<(npO?x8eV-3*AMTKp zBphd>28nPc_gUlubh+1$eIMOVIrEVtTV)6m>k}19VPsoROG`sv(mjZwB6onMvz>dK zZ{@wDwOTl$pdCu0*s5xN}r_NSo$~jVIp;9G2VuOd}PiW;?~6=spR&GD)4x zy=zS|#+H`iu7*9ZRq+&Fg0%gsQ}{wp-}8i@Lc;S!a4s7W%jKd!5cKl{C0hK?TiR|^cXk|B6*~CQ^0i*EI zqwr@+I8@z@P%0@-G&#(b3()rnh?NY#Bnz)BRC`QLOp|#d^9!uEzdM9aEv2}ewHA7; zWD^C4+0bd-?-E>{f4TEnS@GVrgs2=( zgA#Dg6q*QMRB(j`Nw+W?&A(yodBS33)~{I*Vqk1cRDYFgXh}} zHov4JG#i{te;B)4FlU{}Y<-#MpN;2gEE2FHe1$A*`5cM+Lek3U!#B_O5%p!Ri`Iv( z&8Xbk+kC_+WR)ZIn#o4`&l5v?Ly1M|Fp33|379i*EMyp&4n5;m(a>~XNJkLbD^?3E zZmO?6=*fvy%Oo=jw^@5=GR7d%B|w9TfIx4~{BfSrmO>g1({ceh_Hr^!*uk!5p}lm7 z9izUchU3=(g;>@rbal4j$hqM=JmEw0&*Y{(F1i^n)~lkfQVoCXB?tMtIWXLuV z9(zp1l0}e#%|oI=BJK8MqshknC(^t{$G%07zdtqN8qND>9IPn%O(*U&s#Y!-w0c`yMXh<{} zz}63dhD4JAZ2bUeNHiJL3%+R&0zgBe$)G2B3p6B}%nNSo2dE7Z4c<8gM?<8^0Ji>r zf(DQ#U}Fu^*7Je@8}x zNFx>G;w&G;9&r=Y$@|xSH=SP|bp4E|{qtv9gjCC!%9Ff%YM3!@dF|mX)Pmj57G53I z7{K|iy$UE>3^~!Loixs?MmY0)-WuJTA7m|`+MD}i^rQQ9l58@{vaYR82ip78)F%*Zd2$gC&l;)IyUqNpo)wNqIm+Lug+|UO)}4h5Uh)uj za31u$c^5EREp8OS@ICBX4y+sEiSnt>@1?<7Q&>NrZ-N>v+|UkOwzJg%n>jrA1|QYq3Nxt4C(T41?2>LdMb$8yM15kz?BA&Yr-F z#&_egm)c4n!c_@yIo^y&UuRx&5*F)B|1#4c>P(n16{a%!Qk-2uRE&)c4y8ZH1>;3K zT%wUbWgDjkKFcw;@1<`U4$je;^f$zE&z3iwEf$1No2_eQysE3Hb~rtdKZJZHe#nK- zXPvj1?DiiW26dE!RZ ziU#(I^h$N|5BRDghxz*zRL(e%CgMMAEar5e@4qhs|Es`JnnrOtHd%BY-RX%lLceqe zw*3~(cs!AbkhST{13l`Z?=uGjcNeXq$_8;P&XH4WtOSn{C}R%#1?3TBkn;4$v*JXg zvsL``w6QpOnVG!J1F-H8Eoh+CiF8m;jyHdrcfk&yExrRM8k9x(fjDc~VeNDliBWp(o&A}Z4d&Uq*0Xu-vSpsrcgXPt_s8q^ zqJ-Uaa`gM}y2Ct3MDN1CuU$_`DmCp&QPOEPAvXBsE*~0^GMQ@k9o#7GGicZ9XPRx^ z!ruu=Bj?pMy$Rz}s}`RNq1%?7a~gT;r-n~WdQm6F&m+I@SYpWAM!-5@kexcOTNwyu zK1UgD!4@1@h^axKyx8HWwTdZ%ePLnYky7-6ue8SX3qDEoW)h->lEUm0^M;NTbYnc> z@HMo#`=a_e(gJ1&meV5TcPr=yG(Sl8RPJWk3>i?72gjTz`U+_U`P(t0gi;lTs!tSD z3pO|xip96kpU=2BO&dDUG)T8tD81lA6J<<7N>OAB42C7*&RaDP(KB@MQydu9)BZ;E zqlH#ca?;Is8&x0gV2FdD!-y}5k;*6g6{_U?AQgNePOoaTWME}Mt}2;RP!&CyGS*I@ zAR23X%_iQbnFJ~WXzwJX)^iF4Ycnc^fZEUd-i6fIA(&e-q1Hrb(JUreZuFVA@ znFmRppXBljE)UgE6Y>vTQWFEhZtAmH?Vfsa7aqq$XFQI@Zrgr}7d=l8HO~&Hn5EPT z^3e(S(Bi2!@vybz8U5Ck|{0iZTS z^lio(q$36d0ghGxuMO#l0YQNL1~?kh5d(q%M=JoJLE{s5 z#b5I7->HkgTlm-N;_v4EANdVI2>A^zKJHtp3vGknVd;R_7of9Nji{G>9V^&{R9~n` zKSGwH`IalB#UMaOmJB_y zw{vx|?Y7)6&iQwoi+|NgzY65fF$*^-AOE6EPU%$UMJT?u#A&=pgnhc*r4{!UPc zvc|K^p8YD39GOi;^ks2l%4=?Ckkvn>KY6&WFr_pprMNevr?jDq9W$4;+Of}pb_Gf2 zDK+i>mGRX*vga+KW_Quq(isjO@wmme;QZhimKWZ`{>suq`dYzFe4JX!`}<+miUo7_ zPlX~qN(2jzY^-&PAIC0Em`9D9OsLVe2tiv4PpFPsj#oS8v&jR{!pGvB%?F7W>Kw}zy2rc<^P%P%7* z1vTD`l#8T{_4^cDGVm^|&-y)u>r~pw?OWRj6%sek2+V3OciYY2NHIM3nV6r@txs4p6P+R*SJ59uP!-8Uz699_)1%>-Sp~|vhC?eNpL$Itpe4#N}iearX>^8 zz3{_s(deUkFtDrb@RBo)ytBw`(a4ydMhv%jDaQ3pbyOsMwv4NLxbfj zcvc04?yT~mc5WEQlRRIr5_;&@r*mveY<@>z^zjbOdk1e)`T}?8=EZ)RH{b00^{oO6 zc#g~8h^Zm8Y9a@%8vVp?g?4XDPG8W^U%i{9r!y9eVA{QmJZg+|L7+>gMV*G ztoC}ByZ?08AhKG3Z~*v~Lkb570)ztq(7>#givu7W0DuN&wIDPAHw3$Dyuhp$ga&Y_ zfTMv~EeH+34gUceVA%m24a`eHwf`ho*V^wNpl>tQAZ&>bstv#m!D@rHYXoAJAT+?T z12`IF;|JiSAT)p@3JlE+qKSZLfN%i#ScAlBxj1g71OCtUA_Cpf-x`7!w6Mn`_@B4A z6a;t7|BKrHJ9_=JtwF$^G{EmT{IY=(2&t6P}oc&pzUW?ZGKXZI-I<$<48Zuhgpd*yXj~rvT6mF2D za1cgaz2{Q@q;}fnT{qq#vs2PZb+B^vrmObrg2i#Kv*OOlUu;+H9*3zTpl+-3PuL~O zJqize4I?!^B$#+^Op|EWCzbuMWqufRItW{lHKVWOY@F*095>xs>Cl2k87TH1r*k%w z*fquE`XD|F_`E#&&U#=a7f_#JaC6CI`9pIg6_ zz;Z@m&QUVF{MhNLW{o;{#xq<0F-@ZOg%`p1mu=+;I#L0YkLWl)+U@7Fqsj2z`xIlx zt9n%0_H>7)F<#3qcGL9}D$7^O`0dS}6c(VB}x%_x^%l?qzqbq!;Y zCj`vSSI4Pl1P#nIA%VDI%_s7I2dki=W|oC@8)3nd0v*{-i4419y_KOwRC4~wwsg<`FgEoSaK&Y4yM0fF~Pgx7yFpk~&*!DLvUL0se5D+Jfs&u#;?~d*8Ckfa#8^&je z-T8$31%-$&XG(ZtAzaNl=Wy2d(zw6g+cxiOUpMiJSyjm?)lWOqHg8-eD_Xjo^<}ip z$HQe|X-N$Hx_2Kw$v3)}G97Ikg}`rL z&LP16O=S`LRVMShn6B5A@nr<*!e#>Cn#lK96|j&Vk~6%`S8^5;uln6tLp?H z=>^Sef4*z~+giDx3j}*1gZ}OJEB+Rw7xYQ67cvkUnDl}^3HCw;LIaat&?muO$o~X= zZC?L_wgR9bWLmj6!0qrrXy9fn2n|O5fY6X=E4UpV2n~t0g4^MN(7>5i(3OLcKOi)4 zrWJ&~%~<1zb*=hkCvD)0)<^Y&l0 z`mCuC%fDPie^*y+8$0O4lwvA_3w+*rTEf@ocNw;ugmKR_ZJwZ#yidYSaDE}PrR8E{ za~%=Kp16u0HT5k8ZVz8k-yAj6LGcFpu&R8mUs}rIyqb3G;QiH)xv!!P8QEVry=s=m z=M7-KFkEy>re3P)au#mjAo1W3QexS{j1p>3405*i-Vk+XcOKoa`=uN3tGuM{-r$#M zJCQ-IeMKCE(0sgUYKAt+mzraZ@A{!0a6A$p=hT%JN*|D^a*a(m>52DhUz5OB9W?0g ztj)6+mkeI>$n82xFH$~{MAwkTx4e5G>4BEML}8yG14B43zt_!|zxA%HjcTi#`99+i z*-tVm)P(1hIYxQOCNEDzj~{PHkB7#`Q-pYJq-V-}8!ew^8IYq~M8f6rPdLuTd{ytY z|FgMO_QUaFr-yXF*w-)J&|;C%T^lt}S86X7{HmZbqLW_cKxakt_VJ=U6=2?2HI;7Y zP%|0}G7W+DC_1=z=&8r?u%~$@h3B#9Po38RtF{g=V)fvyj|Kcb9qA33bGLpJEe^ME z_~fTkIct_m?5?Baun(Q0!jB7lv9P)L1MVzZaPmh^jg!3}zA+zE#bi7ric9)nc$;TlnFU ze1F2O_`Rs7LH@ulkfb#@R+6qdrqQvVJE{Xe66-mh?G|pgF?u$(4jdbE=A$4?<%cQJ+bk2PB#kBhvzN z!5`6zQc-J0QAqIxEh&9@Bn_Be|6syEBB@gk_S;B@=aP!9c0EL7o40Uv31Wl#5Nk37 zuZu)?2rpknWT=_bj|j_T`JSM;i0)N>D`_6FAC!_S=>`RtaV;q+o`k{D6*}GHL&fHG z@`7@KJq_V;Oq7W1u+LID%j+lj23Sl!!j^6=_076+P_Hd^GoSUWCP+aM78|;~khq(a zjm3sb@oD2z@HeN}1JUr{5>>v@79EMUOqMVC&mH=-ziV44n|nEYo*c%o9n`g{WPyXl z=BoUH3%(q-k}aj7q~Wcxbz{O&y#nrs(VzSrzSX`BbT{Gkk)NI9PNs`ohg5Xoge6Zp~j zTbWY(R-t*4OD`OvJMR}g^FC4NLGg*%$~e}@FI|Rif66}X8um-kgBbk+KSDHisHRyMHS8eGiJ!93cpTXt)t+`tK7BH^NQVFZRFIQ2+C>N?aT_T>KEw zkVM1vYVHl<4qh9QXaG0pgRbW{!TLk)Ktux&STHn1(Ex7H2dE99*A4n40D%Rs4M{YB z8}xx{LlO<(27MqjB+&qF&<8>TA0Era0lKCeCV3z<@bRx8Gys7GziSZD00b5c4dL)u zP;CGL`w!5!8EZTcpBR8x0y`p!`V0ER@8=9+ zyw~*i+T#yKe{XpA|E9m3g17fzIA_Qc`v3M|#Bx6{CE7=o_22BZTX~SE)!|>9z$BS! zs?8@IG!NQBbC1ikd0;S}b}eA7DRVFCmm$dEeISUdUzRmGYAzlnh1Je}lBhNu>FF$2UHcR0UF zh&<25!i|(@Z?3Jha^-0|+dtV~S&yS7{b}86H-Wh?NMsp(dPt}WLFsNBISBdoA4rUBx!?CITh@8L_Bb**%yN4aYs`(zgcJ1368M2UCtEEm+^J2OW4)|nRA?GiJ=aA z4x^!WpETP<%p6js2^$9B!kkG3n+RYT4>yUvYTOfuQ29=rjyqr0tAbSH=jF^WB&o&2 z8fV^CiSS7(y@R8VGy^N=PEE-Sa)e*-kf>Sh({UueFCn^5tM+-~oer{fm;IrxKB-Oa zGU#M3lrHgRyTUw$TEH@ohzrmOZ*B=0o$(0wd?huOPz5Wg1NHHFDwajQo$OmdrcD@; zX<1Mo`4a(Y?KvxNOU|0qNLM<4AslUOok#%=~1OBbYvd2 zTBL<$bvo8+Yt zZs{lf^p;+E-EN0}cwAuum2k}AHE8?yi86Ro+h6Ic#kl_5U#1cna@g=fI)^Vz$&_*7 z-&V}x3+}OeFq9eB(so^E_Kp*$e!nkPeQ*Cx)azf1!qr{VDXd=&7Z;O|kXBz4idlG>H8=;!;PrNj#+UkPH z-5{^}P`9iVoTh_Mv>vrY+tm|RwsIqfHI?|EQA9{s-hXPJ?`Rfl2slI=-$g5NtM=-m zaZ}}!M7=jtoo`b}nYnYeu8a7fskSGrOXt)OdwHN$ZGld zkHsrNi5RYtPh>SFhxZZeN{LSlwB({@IUj6h&GUM*6+sI%$1`yqN?L~YC8<(;Ycxbh z&1~SYJ#*q|+Nw@qu_rPOi{Wl3XJm3B`4-rQ?oIz8nnE+(*u#%W@N|YLt=Tle{Umj> z0x2YAN5YuYh9taV(fMcF9jL*)gaQbh@J90JzmF5%*lhor)m;ak{$N(Xo?tGHo9U$A zjV5q3Bu;p}z<7fbf}Qv* z1h@|ys5V6OZN?e|PcZ0--Da#o@C1Xa??*FR`;RFr--;bT^ z_pw%7JpU>G36e#B4y51e;4fwJ@6^HH{qSpbaBVOLQwKMUy%*1j}NLL=W2^Y;+M5F#ad-#3+B`kfnN!Je7NXB*px3F z{!#rwKf&TM?EVuEmDfRTBfU7g@?wKKKlUWOUbMNO~nA#7-M`fy*%C;>OBoZ_psGyzoL(pF;3*S%i=jA(g z;NXDO8Lej^uRRR6Nesf(FhlL;#tqK)?bt9D&+}XLdV}`x9A@MVT>Qq|&x_5&lgZDF znD^Gx!lj=S@yHdJY#>R;rxpjPx;b*bCEubx4O-!E#Mtf~ctHo}0OkM}N*L zPL{SGZkze=PV4b9Ezao^V-MXKl{p5VG$e^C4}bG(fX zj{gFdUH5~L*9kwPkrbjzNHO&{=SrsDH>SwEr>^@gIfq3-B${Rp8X)RZTPQZmF6)I!~;PB956 zrH?`nwL4JGSjw=e#2#!C4}zV=8?(Z2zpxgcq3FeMeSSGcf%#~E!DZ=-s`v&X8qN@^ zV{Sfk4ATWA z%L^N$_$+%`4)Od>M)wbk#qP*VXXJnvOQQIK(7sad`HSP=g7qS3o9fI5u;CY4H|6wI zMCARLTRnNv`1fC&4vpx25X-AC^QY*frg|Zgr>W=b-ID5T$lksuj;58Kn<@~88&Zen zKu(ePR!@+{wvJ5##h>f@4=KKjYNY--NfLslC;qrU^X%URx2)-~Cq&*U=c7qPVHuX{ z%TsUdY0OSEK5v((+|0BQ+LwP9+>S_u}+(#yj#FN3x>$lT=XMK-|!IQV=%ApngOO{j6@YT~cbN+>_ z){(3HqD7=$6qBV0RJ4irXzUv!)QR*WB@IZQ7WZIrg9Xya-WqPH@ntYN)Miwqg1v%NlxAV~K4Lx5nEE{-OIuM-JB$h{T8KEys;Zx;{w2yk_@Jkq~)T!hGf}Xf( z)b!%sj0A`XA*qIVt|$ZufWC=6?rnxHxXu z#jo|mbqMEHdg6My^@btyO%y^aQvQ{2!qKdX8YVA@-QTo!|hq zA@-QTw}}TrL+UYuJHdg_kQ4#96C4N)smBcN1P4Mx=rMDGJHdg_5W2*i;7;&=ga+tu zgFSCZJ!VdDCpbWD$mrXQH694}oDGZZdP(A@;naA4n?8-fDl1b2c1)aC}> z{03ATKna1>{x_Wd&rAQ!VE<=2)Sxf`sTEGpx8?@-Hug&B) z87$`wllb2Z78D}*J-6C9cv!hnu**7tCQxZB3ujBKzotxg4>v0_M>J&l@F*Pv=X~wI zGKR6=%IpVwg4DAo1fn%+2bfO8w3;3~g`Srtq-t0AY_iapdB;1$Qzu#AhamUD@MHIj zqqD>1K9k4$rY$YaVWi?G9X%%7G-AV2^ih;)!tRD*hQe=+c4;K`J9pipKb9m?o#sV+{Ibfd6#pH zEW1xI&Pb0k8BD9`vpfzr!(bgAM=x34*azoP9MYv!77s~Z(~F`^y&@nTevoz2Q(Z7^ zJSzEs?@`3%iRC@S?b=TJ5!LuKD(m!5UL{J0 zuwZmqKe02#tJtL1npV|{!3qj^=@ao_cj!6Y=68d^Gn8L1Q97T6wTau#;+MYJ zn7^lghuG!ufE|qMGJa`7`Ht^;$>)dUDa8mr<5nzX-Hm8FRwbn0{m3Lfs2Tj=*|C_1 zR&_Ww9C*MOMq2|1gVQzqmBAn(xzVt5%}X@<;ep{&KT--`{=i$G&8O4kLh3&-PJcGM z%P%(3D@&k!=Z`aQ+%51-oug+Uk%eDWwya+*QtgrIClP$o`o4$^GBL}E*H)x2<&?7q z-KtjVaEbf}&}2w!*A?wsiyt~M>#>3wp2C7>cU~N8$8->gR*6S-2i#|E&v4NEAS>=v zF4I@dQRDTAB@o;7#p7StaXXF521Egv(Ar6Rim904cM<~;562odHnE<;Zl2)qkrfWJ zX#9A1R^H0)w-(tQo}gao3~QoeX;v)YjoJ1~6_;FrITN(~31?(=$@~6fQck)aUV8&u zr3h4UylBO{AEv0;;E)@+>gQdu`tiNSZ6fV7J{D?+=DM{`&d%04c=ZabFG)DIEg>x& zGrn$3#zNKZO(s+vQ9yN48pVB=75ZlQgYbZ^qT}!&S@jE1-LB_!99{l!a&*WAlTT(a z;c18HH^V*FD)0E{kF2m3dj1^L&^OD=;=lJp!_w{iq#MUsNg`7r_+wWjC89}f9`k-9 z>k}BR;48_y3A`L{%t%HRD#c=>Lgc-(ps7*}=%eoYR$)=q=Q=$k9F-$m4cLj(gNp6( z)Ln*)I~2~u#YE}Xd+bTFRBQ)B4UfeZdMPr%1$(62CGjI96G=_>sKOLZJIpd%j3o+_ zC?QZuWlds%!qqlTVg3mjEujMv9B~W=W6CJ(Yx)4&D^hK-p&zT!D}2TQ%C))^XZ5Gqy9FeVbc{so@KSU3Gn;bEXpLr#>bHD0!Rmd?KQ+lEK zvmS>s>84ya-cOF2Y&z_2Qr4xj4?FT2$aauloD9lTmpx~yE$JrSDA34@bzC*KtKjK- zV)`VN04>btL%XDdYuu3O`{TFUruH=4(WXH`hn4v3#IG^Fw<^5e?4FNoi-;O(Vcqgr zj9y)aR&TI`M#OzHKpm8g#JKWAW)$tS8pi7#JIp=_N0;NY_X*Vu#h&4F}D|jH}1E zYD5I8L-*%&8Xb3N7g6s}hmemSJzj%Fb1qg1sYJ4}QDzQ<9sKk~l`keB?)=$As@Izm znJe;m2jk^Qu6Ke8D@Q}lj2kN&-mI&5MDkCuK0(W*meqePdG1SW_}Ci5Jjg2gsSqiB zzgO26R>A5*3BBvN=8IyQZ!=k}f5BrU6$j|x-SsItm zuQ(8#NWeeE{_>37?8Smiwld}gQ`{Krkbo{lY_=;>0mBIZ|s zhScpX7g9Z?7>Dy77K~8Klk~e%C5a{&WhaQ633c^%@;@0z`;>CF1fK0ucb5-~l27>) z4f~%3um0dIO;+*lW4F(m8J_~~t z($D-)Qu_~o<`7jpABfEU%e?Vhp#LKg&k2x|;Ji*={O_MOAB06gPJo;Q02*Yo0h|~B zauVQZ$TI^#Py!sz2Wou)7QYdzQKR_R%mDu5=D6N65u_0QM-*KDxUZ8IU_b5~35tLH zxOsVQ>HmJJ)!{VHf!czwFTT%!R%1Vx>_FaR#aulU@xJ~MLf?ZO2NeDb$mtvIcZ??x$K~a-TwJ>6eM&ZVrl00(0BQaTt z-LErMbam$p+jUBCTMk7W8qpGB{2aAxm{yp_nv zXd;cPv0j0=*qi)enPT(1fbkNGP!G(;IY%g(ba5vDkeMubDQBjt+zDNfGmv=MLrc(=$%G@~OU`211_`VKX=y(t@2I zyGl`GRQ5d5z3ZV?)AvyILvrx;(SRt|<_UYCsE~0?I6C#D2ToN-?KhM@>Q}unc>^`G zdv+P^`5{ZCGm%FfeoR4Yu;1b+E*W;^It4>!ybBzL?ig|-u-+9w(DbcRUM3yE*Cmi#k+E_%XPA7CcgBmUmO}9$~Jp{7sAYPBYE==XO>&^3jaS$ zEPpN{{q7EOUPpXxHL(B$asbc}x`Uh`U4OH40gmPcIW7Tb27o{gIGP8vMh%PxUyTGn zgN$;(Xz+dy02;InH82`{O`5Xb>QgCc>zwf|%_z|WfpbnGE8`p;J*Fq#|G zaRx@;W~_08R`vnWH_Y4+YJ>Vm!06kIHAo>SP5_@a_&tYkEFc#rfKM9$4Z$bD3E6)&^lj!fP6$pWPS8yKpJ(LX-x)&j+e~bH zkba`Pw;61F5EhF-8(iGt(jlX7GuU`RKV;wsew)Dt5q-mr4g4eH1!)Js+BcHKAo=?* zb`8#u|EGt}`M2V|X2^f9M*gvE_}h*0zlXx#J#>B^9?*Y$iyr#6&i@>}nOe^llDc-t z#Mdun-}F3+2i_2#(UbsMN*$j$T}y!}0&8VKIAv8PCgFRngqeh2#!FH6lVO%O9aT0l zd~NS955_lE_wMe_f2Br)BO!-twGif%-W`siMilYm3rXbgEO9*in!lQ*uySv4zC8Bo z!d0}_2-+K(^++;|+jgqL@1P;T^t>_(3fVcX6lFylZ`&btLyhzOw0Mnjw~?m&Cg4E+Xf?q=6q!Sd_}5S!&kqxQy}MhD+H! z!ui}RfzJHIw*D{tC)~oBc3&{1Fe$RhZ0YNcz01FXHtZXDbZ2e{Y9y30J#+6p{U|y{ zpupYmu`JTlPSA#Z)@6Adh(F!PQ=CwZHac_KmIysR11_y@APTeQ?2{k$^eNe;0N zg`az9I%f_*($MOD;TS#_H@lId)ECl*B{qf*-(;JzKOhtA%m2lm6x^E^D*yg^8?dh3@ zDtqCVWRwdQ8PLJGb9%~j4CCOk8j-B2GSZ7mrev6BvS+y~NF*vt@zr`4=UDtQ%^eTz z*nobtU_MglpuX0w7u4iy0%I23s5tH_vR$Q2zOH+qw?@5LZ3BgtVz8;5=EHXu$4n!B%jGa0&hZb!iGuCAh12Bti1 z-fj-3i|NDehxUdwK1bv>7| zM}A`({S#LwO=mf+M`ixv-w4LT&@s~+N<+s44x?xE<2O@-SpI?UdzJqxtM9Tpdg?;Z#P6t$YxSrg7ze(OUf@i5&UB*vzzgdFDdN#7PBf1wJK^q(Udow^ zJT`AyyJHZ_=1+0fu^-$|egeHP$a>!GT<3(XwJ1kdO7m4_kl(@hfL}Uit@@d`&Yeg6 z4gHOF-H1mn%j&jnXMvPK%1VirwDnrhl_lMdP8aRmg2N11ac+;kCK@YUqDI@PHu}gu z^F_{pd$J>&-Yl*XCGWhVFI!?d%drG)T6m5 ztaW$#*BEXIW+y!og*KDoqzIqz?sL?~BTi*azVdn$_Eq>kU)y6wwnT0x6O_(KVkf8a z!i{Kga;;(h-A)(Bfg>E#d*#FGpE8#^A3{g9pa>R=@AurJtn%(is9FCp6fj2wd*z=s z%sR|WS(Jaqk1Z~rZj9$f1=~Wxlaxs`D{Adj?(D1oYl}wVLhrmSHS6%ZMKj+;Q_c3q zkHug(1wT1-b(4m-hBSS0zfhs9K61)Hkn=a3`v3QGo?Z6;m-UAez|PP4mr>}Ccqs&C z0bu6`NArRV=zzTB#@_4KtOl$$FDM`fj0WIi;Alt!8^F#Fe&xUGLMZ+xf4` zMTEGb!1;Hd@tRUyCj!8ljyIhCe^V+BZo%78s;An@&hzr9EyVkQsb7clG(^wdo-|}A z$B8-wy$L4!Xr9~uRsRi3WAZ1S%j5fEF_ul7`ZQyY<4Fz=;=hV(AI)ve%j?yC9JcWx zT#eTsGamRgdO`-zZ_?sTWOW_u~6LbSNJZ4MgZ$2+7TVYD1%I8Lo}d%l7>xWfJj+ z27Z(`SF1!TeqxW_>co7++iNd>$Imy(N-Al;_`varp|zZ$z3zF}rZYPI!4gZCgB_M? zE>}d8ny30xJ~2OTjUI7Cee*1|wh^Wbx(`KbFf2 z*3T!r_(rd@bo0pSDkGVhl5KIf>mPb?bZES;r&ICxT<%j7qVh{IJX!P6mZOwsYz1+% zwdnWqjssZ*V?=%8kEs2vlMkP+_`;5NiuF*ySJAJ{may-aB%?iYfmU5)bJ$iY{SilT z$IWUWR4V!_9}l!T7T=y;qP*1ZaVa@$bdmb`!BuMoxz87<(Iuhnt`Fh8!I+*VuDmp{ zmomkT7?1kUDX{OA8<=#Cp6F!zoMCVsY_4!*3L3*u8^@}@P!2pi{N~C-x@2zAqFwmO zZo*ut>AaUJB!fXR;?1m#w35BzM{Z13EUYf04vIymyCkJ(hg0{YMSX1Qx$3@YHQ{5q zT6b;Q2pT}sM0{Utjj|1cS=^%+@~ww@yJ@;6^UUzoaz#FJ_k6iD?c$1hT>-My$h%l- zPQ}H2hvH)e$@@z}8hhO*NH7CRqsm9079Mg&A5`DFMr64@_pP&xVg!>Zol7nzT|thos9qa&amd>QE)2H-w^12>0;_%WSx7 zr$j=Ieo=__AiTC}J=xIXpk&5}z%w`QYh6hAMxA@L*r%#fH2bXcoIBmpE_NshFXGcK zV?`0PjzmKR>5!Hix<`CI8qA&fKMsu8xD3D8vZx7b@=vETbM*~y@co%Lao=vzHEu-N zA`<#hn%h?LXGPCnT^#+TNHbh~=KW^H&0{TurJ>{Rv&EF`-Zmd{9Pk+U29k#(6-taX z982@NBrvyo**qu0&5p>fwAV5rg+04mObq|_kQ&#Heb98~_>Qie&-vz&t}q9Qzsufy z!0Hsd27(Fg6yN$U83NxqxDk_2M=(csH4pY5*{X`{uoWg2N2^dXT(OX0w zcdHOpDhMR=J9XWrDU~)^;BO5WS_&m2RTK#vkL~=00M#U+f(GG@bR!M)-}goWhzxOF zhmda7ZU#TPfeQc)soe|^83IQ`I9m@?2cW+IcICVv%NpSO3?MQDP#aRa86YwQfQAr_ z``zsM-%9@aO$>hJ5Ta6?0Ffc^+K{4BoB)v_05pX7JSXS`wf}tO+@QV@;61;Y82Y`m z0rtJQL9Jb2G(ay491U730Y(G#vcS+FT$91TY$)mj#Z7 z#QFft=HU073li%CFq;FQK@D-hD+e%}1E4`mR>0`njJ4m{EMPQ1;}ra^fi|lKM&D+v zae|Tt!06kIHBLwiVE|@x@VmwdX=Va2n**RB@pJ&QIXL?FcLx08psl2DF+D(PH-k3H zxCNRQ!pj7-58`dmkX+X{62re0#$W2@-zkj0`?S9m25475Q2m<<0~7%K1mwhW4$vumVxSjZonE7dlhh%p&EI1+W#suCbsinjF=8L zmd+Sklh8X62`$f(#=Y9*)kBp65*eCYM z!0>1JBc19ZAJYioM;1*hXR4aq=0Ap`pH~gGy-8S1ywd{9r>PoAYDLNR{Ko!XxGJ4aM*7Q z=N!+ki=wW)*+3^Rd-Hg3Ec5+=oJ!(|hX!|)62I_<;dlQN&btw@V&|zPJfBi4iB0UN z69-8n32^AS-HGZN2FC0S_+iz@cj6kmL~4TLYXvuuJjp{3-6$6xYf^H_ICi|JI1m+w zk@e+B(AzSt`HqqcXF3o*$ za#zpimZ|fH+`G#3d1EILZ! zdnkwdL3(gHr}XnrYjSC6DP{;)u~D=?bhTMkGSJ*iuO>xP*lPyM<}t{@dz!TK4$53+@Xj)5stYgJAm@4{gUnOp7o z#0E1Zo1F~2RsgxvYFV54bh1)kr2~{RwCQI?5ieQ!WCU?_nu;TG z@dF>k2)X`{nMGameVv8QbE><_A8FLS;tn_>IpH6rM9NyfJOyEspa-W87vZvOTi%n9c6LzFwE3js+y zhM%0;2y~8m#nZPPI^!QrO|Ld5lSDP#p1f#$4K67 zbbP+yWE_6KULLbJwzDasxKe3?Ap%9BlrcSBK7QVMP^mNVK1?x=y0caBb2I!ZZL3@) zP1vUb`{mRD7SOv-$_HfB2SyR|_*J#Pj0$pFBrFcA<3&2csb(?f6u#hFyDv9TjX7|7 z%AXxlHE>$mS}H;=^De1a^GU=r$6~KnCM6LF`FxhxeG^LWaGz+&k)=wpX?;=X9(W!( z74Fxmi6s0@D%mFc=gZ2n(C%as9PKyphvP@bW77BdwWE@xOEW(&d2WO~`pB)QqBdFg z(2t^9(qDQS1m)CSvCz?+@2xON_9&*jF=+kWr#CyQZyscs7_y2seJ%mn>UI~Dm|#3U zINN!gto8)9{=Hyh%}?Kkh4ptq@EXhTIGOX+H5YPUO42TUqt29?YrZ7(ydbJqdHo}4 zkjf!R+;dyu9$o!r5o%c3Y0p4|uH&@i*4ylXM+9p1Y(^y#>l2icJ!uDX_9qTkk2;5B z-SGKhl{R!T&HFe8yOOr%Q9U%i?eTf?_myuS_DqgBP4aZ}#HFkbteg?V*Ytq0@b7gv zYgE5Ki+pd3$9=X#6IAxb{_do*c+h7*dBXB9j=}43F^(^<44jKpU>kq*HE-zTrwsG7 zDZW#~n#eZH+;SxMihm!KkXMA0|>| zHGc&v9PWZ_bB^>1{F*^CfiL}qWrinSH+GyL|RXiw0Cbi;bD3$)*UPw774_TkhL~+Yx=CM{KX6wCM z@M(I-qG4uE^DcD9Z`=DknbCCQR9MC0Rezt5#mXjM9U;GYWQXBu;oJzD+0eB5k)!&M z;{NPW{b}>TOugQ@s@!F2LA2(VDJf*W@$R5Q3AfPf>`Lz(bFYKQTpAkI#9~3sldtYA z&9jb9KPI6&kQF>VF6+hQP9)oGV5jyL=12@Qf-1RCjN}ZC7jw^DQtq1}PQnky)4R1Z zc9b>p5PK~*Up{PJA9cPzX3S5g7_Ajak60y1LwA3}`IvqCvpbRP!M0NJ={A%{1V}y1g~Jf?(d)>h~mK7*WW>d zJ3<3739!TAchF!hGBEmfNDOe@;Cl;~*-w!14@686T zrU0XF^Dls%gPS)3qkreDv4Q(&1EYWEtg(R=+`#DHIcsd-6A6g^r9c0hy#sZ*dzkSbH!8Iu0o&U~RgVf8N1whaaur|2GIPluPbJkcP^iyZKp<4$& zsn_cQFMh-2e9b%mm8JN1yz|du)-T@qOTv7McitEZ@CWbY0I~fZ?Mzet3YOE~2N$;Z z?wg>dg)*h2P*jzvhNSSjDX*ljHU{Wb7v%DPRKM$XRV!2%N=lKpnZcAa7gAgsBldNB z&}DmL0!K9M=Y>|z#Td?`3%&Sb(tCEe0pxwqgp6lAa?)Q|rA)tCX8oJt2sC95Ywf!ziF#gn!NMctYMz|;3Z*ixQH@k}$Nkq&|GgKEH z_SswIwlEHV4TjwI+`Y78J(ZrilFxXXC}!J*Q?FmQ=CXup^d}c*<*=)KW>z+fdak-n zv?_)~rNfECRmFrVM@rfhe{X?eq6M`((?Zx)^!temwFcu;fineR%Bc7Y+XBt0?08Ko z88+TgJ<=I$3@<;~d1W&T3Cf%^sdu2cVjb0I<$|hyl~`l@uAd}1xB@j6?b42F%G#aV zb>ll|Hc)A)vYPx(I{esBMmqQIGE`z@BQv0J(k0O^z5OyN5$t{MjD^AaeUl-=;XMXW zMR-aObA!W?uHZ49x*ai%6mfYYo7yANZ=R9$eNbwR7G1}p!LQu6yZXB=or5w*^?FN#cPF0A}ozxTvy%l@EiNdPOX%N+b@ zE#&M4i#-?etcm~mCFABDEoY;nx$hE>hTb)amML?}MHer8P+>ReUFcV||f^u7xxbfj}*~tr4vOc>T{1xMFA?F(^=l+*g7Y}rxM3WA6 zA%s9Ie}D7-!w?9f$LN0~7hnO<$Mnirz-SkFW=eT}_T>s|P z^j}%9U#}(*U`hE zxXpPmEk@s^PYytzou%fKScbp|coVz641KH3d&=V0zG1Sjq5X4eHT&n?(eigF zA0|w)>oa}?8}Gu4-2Bt6{bu);BxoU)V%tPYl0d|`x81!l$|W692YGKL)Xy{z2fw;% z!x2ZDr{S`?mM7{VG>pVz`426ZtZ}2U*Y~GVW!JB8f98^&$+|Pc-Ez>UlQ5|_tD~66 zeuzggNJrh!^@22nQ9QS%Y%jC)6cdJ{6h0u}#n=7ZW81ysSKBLI^iA7!v?JZrvtK7iWsYr1x#}xx2zxR(f;JPO?m+Pg-%o__fZZ5+^1tA6ffx|5{NK2Ur*+LZyg+V{PAYE{cQi2 zi;v~cNaNSD{byslziE_NZrC#Zc(&Poca*s2bD7{laM+=;_C7i_$k&XjFrGjcNBJA< z-Aa0bfssj1nL!$f@^AG>^ksHJA=NSnewW?m2Tue>A==@o`VP{M>SGZU2!rLQa zeoB)VE@+N{@RZQD04KTL$9*;-4hCPF8U_|&c%@QX<6FYjJ1e5p8dQonUD769>rUfp zNzq2VoK50Zc0Z<4a+R{|_H(^blo;pBk`t!l>wg?hi@g81kz^Y^kRf8Xi;{$7kGkb2 zYiWa;F@L=cuC?=G{`C39@ywusB&8yI@JkkK$+m?YMXoG-H`GrUMS-C_zLHKKNeffd zpUb7CJN#UHWcg;&Vk*BKWRTjc8P{17ph+Opk6EY~No&M-)*wT`K?3TQeVH5khTKGV zc$O2xXMupYreM6^LH=0qfJ|D(wOyz_cIEqgH)?#iD&MGuSdY`!_t1KXTLH5H3oABb_7koFP?gDAA}rY^x-C^C@|HK+@8HX2PXeiOX~!d+ke`!hk!KsO{AF zu(&62Sm3ta0%4A~yd1PCXBipnxnlb9RsvnyYxB>Pi0iEh>;@s;Pgopny`%hw`CCsz zwc`lqH(&ao9X~#yZ-7F|KA?i|rn%wn`QLiefSEiq`>&_=k7)ZJ8HQN^d_OF|oJ4>9 zmP0ZOvjF&h0MHN&!z=*49{@C@Bm}^GhJS+odtmkJJ$L)MA(YOq-9/J$)^L>?>v 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

(Cx26j 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

p7Y;5+mtN`jDOPX@!QN;Tvy>vp!8FHV20 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�TaC(+M+^GY4X}{(={~Pr0nbPm* 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 *Te?MHL(s zZ*sK|8?hiUM?;f4FCJ?s;wZ*nXg!pOnzDGTJ#mG`C#q@`#NO$WUnhTrr;7aglG;Xd zyjMHl(CNzYNBnm7e3PJ7J?E>c5MB6d=8stXlBK^G^3JUno7Yp}M;s`4XdC+4aRxSPko=JXz#(yzsO5OX71c<1f6n8%QmqK7{9d9Q|bi zKh@|j#)Go>i`0=@U$9y0SziJD#TZR3_$yGwV}K~Pz8dJS7=O`un~~4G6&Lmk_^T+5 zp%ofuK#Xdr1?5J!EVft*CHJo}3(Pmd2<0siur`K?ut4_0sb672NUsXdR79!@>SHLwqZdK>{3PgQ) z7q&K`#M>l+KyvF#WlIi!HHiAcQ;&s;IsDZm>XY*=5bDuP$*wP{gRFzAV_jo*eKZ9M zNC8$&sK@fi9R3QpCOk<|4_AkG2$Hibb4}<;THE=?V#@6LqMn+=U%202#vc#6q-e=p zI^hixzrHv_4fre2gbU*S*pWt*b*wMeK4#B1yq{eae-)`iXRtDp1geacl{u^ya1EW5 z>Rff2lAc?2bf8qnYG{th26O8xxNCUEq|Wt4#U*nW@-St<(#u?v!D^<&I>Bn1Fqm6) z0Wa~`N1dxqy~;VPR`Nos@j7oMhYe=e7h^M7UgC9*`qq~zSuFE9ZFOtFYQP`efOUNZ zcTEyVse_ja;*ZJOzg2lDSzkf?u^_@vzZlzcJ?ksDtCL`1O=cPWwG@8^ToaxVt80A~ zxmY>hN)=Hx`U_7PIIfP>C0Y6#3eJgt#~&^DQf{koHLzMWT!tpds_+Mwe@eZX^)b%q z^u_fh&*=rSs@ydIQyH6GUrmulqd&f$Fhg#A${&oY%D;bEUo_&g>noSoR?{VLZx*ai zZxzN>^}76JeHCjZ(jN}cT6G8@2-Uz8A4Z#@$BJ^!*k zy+0Udi>_mR1?8vo@vfOawEWbb@eCp->sH|>>*Nm_?IypLp}(XCtQPr4pI+tPSXZCr z-|(bVUHFR?0onD{oWswv6b0)m;E(R0h}3hwF{3lPzOvF=m4CyNO*#3@`4;d;cThR% zSYNCO%jhpWS6n{xD)$FN6H?8}zxeI!`6iWS^{h|t-`<{@ZDock|3>d&Zhh5lW%^4e zc5ODl3t(B7D$AGH%ptEz11Cz#rP`-diB;G^kS&eU$nHd_)A>I_294K>@1&eY+hHx`G#jp9skCdL~eb7 zPU~4;nyH)R-*V5p8qPOORm<{k%(c#~FXaE$v%YeoR5|B}cht%}Q%%0ma6OQ3ZhZy% zRd4nD$71^Ht60G0^9^s81x2x{d``kWdHyH}`qSpn>3vbFKYpJZSl7U_gf4oKCss6D=vzUw8v1!D-d?iLV;` z74SzAsCk(`3ePtNJF@pjjEK}gf3e$Q7JrdCviC<4l&NQZF~=gKKZkeXYr`LJ^NRe7 zf%e?`LRC&Z>#Kyo%jX*dAhqC6k^(8XD&P;^2&#I26rXSO=4A1ghPi85Us`yQJKqBS z2+!kGx!(%cR}d>9(2dd{x z^Eyl7E6K^{B#4oVfHJUV`4?X>$ewRZxy|wiZ$?z5zrywL+Ch}XW&VgwC2OF+@N}WO z-wGn|$@98Z=&yKvQ5(JKqBS z2v11Yg}(y--(cr>_*wqo!JYcn zm#MWX^G7VIs$qS+MyL2IxIdCGOC9*j#5yYLt0Vr?xKX$)A;`qHdnc%ibsXn|EdU-DB`{zZ>$27lzX z*1Nv6FgmxsicMUFKl-{-Q#pq}y+3#&z>cXN{HgzizA)u8ue!bh|4XdW%HglN|D~Az zl4_=${zBWEn&~fwPqO%nyUVVR7nkb8UwB(Bu{Fx{*Il#!h1W8aKcYm)t*?5Io4?>M zCedd2gU8j_Y%TJI2R@R^B8NY{KNwdve)*U6m7V4l{_Tzu>_z@9XLazfMdIY;LqZsR z;blB_$cIGO@FCH8`H(E14+$3dkbJ#?PnFX!_d5U;4+W+6OkDMP|J(M#I%>h3gA%7rOQJ*W{0^AiO`7 z>4wCB)qeF-b{ANgyh>WPfZY%T!ssK8>RDLUt;as*3^bgUNID1yZ_(KA7w^ zPMgsJNzIq@jgMcwY=u;)GQ9K*Wm7|w=$U2m?9n8Y?t&x_zGxD=9`vSKd{zkykJJBy z6zhqXOi!x4RhBQkZ@_+m5azMXI+q_cg3KKr-}R~)`>D@|il^i#`HW>TxsqIenI4=`5XJ}H)K`rwv(`OpfNpOlQ|m!GLtttMPz5o>OJ>3x`8 zAI5rBqAy-wMUa$8?d!`J>DP)Eg^T3LQY;i_%(*`y7|AYFD^QRznV0j3ip>XS<30ED?%(@2{BP3ht=Q(c$sU8v04csS57?^ z(baJ3DbwY!T0oVhV64=!zWDlQmMZ(BCS84f@e$GN`l9BX#b1B8x$9YR%X0)mtEmRN_N|RX#XJ!$2Bt%pO5OJ_n6O z%uIQiu#2}?@v4;xXCSt@dXaDfiNqIYbL&f7!a2eo2ufo;>#G>!mGxDO&KCqj<_JWW(X!m1OjX6~;@*acZ0y#HMh`|q%A-_ z_$yEr$}crmmsv4gElZx!z{!&5VD;8ieMugeY15f&ZBTR27+ACOwjc*BmbK+%>R=5j zcJcZmwPdcfm{?ZJ`DTKY@qCMNL_6Bk*}0_#3K3^2+=>R8yCqfWM)jOXS_BML8lv!Kqfy z`U-NChN6*Moqv-@mEHOZl>H=^uAcS9Sa9ZihboTvYPa`LdiiJ1H)c>~<;zg@9va2+ zCAJfXS1adR)Ag5}Z^8W*ohrHY)o{NR^2bmm(p_0!?ffxRz#s7!bL*> zbi*sV9jcr!Llb7roNp3{=NibYk7=p~eM(85U;h38Sg^jbFQ=OPW8Q-GDSt3cRh!{2 z>x=%<3jLM3!aJ}J$$HlpE2gsRt2qa^l;k$%iX0LOkei`{8e`W7q73J?T}d?uS+L0RK4G5XQ}5KU3FRfB@OWFz+Wa` zw0yoXF|@k=M+;7IrqXv_@mE9R{lDN(^?Mp}rW9TS{?r**?$D6KUv>TdFY8nNrPN)s z{!&VMcjVmG{85O%9(CrIdMYxpntX|UC35R4;EyEpsE+j&B!!eR zZ?jfgAN9V0S##?vxIcQU2SbX_x1dKrsrDWL3{BLZ?D|qr?tZJGN5Eg!SGg<7^w$?P z^y>W4m!^c|)>m+U^o47xj`K~r4+mYUyuM81<7(#{`yuDnSHK?#qWbuwpa!1^Vp--? zU!UG@(c_$zFG--I9{d&Pr?tNmOXRYE{tEb`hIe9%>93^OtxQ@w{|W2@ADPz~%k&pr<}b_VvUj-DpK4TmNJx(l$+7bxL1w8xz4iEzun!;N;Fz!j zD2`5#rPQD9pAYe$((RXGniwDA55;>AP#m4Q;!6E#h>#C)bgEhdiGx#LK&d}QmiQD$ zr_DHk#L=lwycFC2@*xgRqj9DF=xgLt+;-|d0}^qRdbmsdspo|cad0ZBfTWiSpVIkb zr{7WxjqxG<#rU`>uM8*T&4=_CV~DB&P#hi4C{f0_fyOPNxwgohBbI* zI$iZpGcD(opK8=R=$%;&>?HI6D1GiK`AA52ZNfL$YdqDB?KQ#+HWC+A2Q8twm%f zeL?MqQXKQ4{6i7hLlN1r@RbHA$r_Ch0%HuN$B<);MAGDRq{J2X?~KvkmC81lATkE9 zbg3`uNaZ_#F7*k~^C6K2d`Q;FhlH{DkjReyu2gpLAr6j80iZZ26&d}}N5hBsL#cT0 zk1ag;5GPBedILL1WFH@rNg_f4B!hDZO@2CyP{tWY)Pc}`l{Ecj3H~BN?ZEq!g4Vpz z7;V4IrB8brTXbc8m(RaXU$?&If1fT6@1IW}U-!My#t|M#c6Km1~M&T*Q4|D`>Y{2pF^y1ThKyghlUY$ko!Z0+?w?j{xw zHFPGssXW;fcT+b1)7``y30AS)^yGJwV5_{FbjJ*e*y$=KhbF&=@)53x9Ni6sqp@Gv z<(pq`Pfq{)^yD=M_g|OCr)!_5Ut2K{89(XC>^Gd=p4jLVlupl-zl{cVUw2NefBO1$ zurzaee0OsCx^r=7EB(07AE&qH&lmP{2?HB}Jv~339^N#(n*VsdfBxaL^WxW=U+15m zzm0XBwKc80JN|k(xN~xLTx#yU`Zd@zaNaSwc(A?jeSZ1#^vd4--P+i%k(u8uE3F$1 zuUZGD@9uv7Tpu3jZe3d5-&y_9`Qg*ipN`)PjrRk6_ov+(@18nlw%;}Hb#I)^Up$uj zI+lhG|MZU!4Bhr0tPb}zyjnS0T;JJPoSkhQoSkfW-+gob>;37*?ehDP_br>fAI@*u zXJ=2Jf4m!+zH9pP*z@%Ce)*uI{Y}U9=U)%~pJ!%T8eW|&+%3KtTsV9?yZLc)^UdDX z;LhC9egEw2=+N=)*mD2X=+fZo#O~XH#*>GZ?(weMvys;3k=5`0N8e{!+Kwmp8eR>x zpX|*{jUDfFt&X36U219?IX>z6HraeQ^5f(3?XSbpiOu$v&DnPo>u39yCtv!v)^;Ag ze16#9xf%WQ>9TQuqT$v0^Lgv&`DXiufN~5PS1QjydLQM(tNY| z=K5yl`(59Uk-?Gu&GD7i{jc4JYsak%-9P`FjyJqIpX+S>@cD4zuIb_Sba89uarNy; zX>YxCuj!$sZ}sC~>7adZWW9B4r*Uh2`rGFFxuv$gj}z1TAJ<0Dk5-n)-Zs4YcJp;% z^l*6ZZt%n9-M98PTmSF45m0*O6;g@;jXu=V42792{Wl8Rx;%lvh(mXNIlVl;cz%rr z3;X=OdtARiJU)f=$_Z`Lm(Nctr;jlB{oSp}A4XOPG`SaZ1lqGYu;1IXKd|t2W_)&K z_@TS$?)})!cj1y(%TOW zuihLsFE)?PUoU^$B~cYGTj z8J)Y?dcObKGxTQj@^p7(qiga0VDzTt`u={abN=(U-wm%O*B@HfAAUV={%D)rIXfMk zY@66N{?B_eYu^rc#y+3l^d6qwZ9eZdUXK568Nc~*2Aj0( zJZ%lkZG9YAIBDzMKHGj=SR84;d^(<6y?Y*6-2E^$(K$ab`rPyOb5Gy)+)c;E^v~s% z?U8Q>*OT8S)=K?H4X^rc)@Hu%{ODWye$lrz^Y!td@p1h4?Az+~*M+96Gjl&5_kQ-RziW8a^kJv@=6<^OqHDCdaenG|+aQ$zt-pGr&hPlFSeha|NJODFHG(ZpB=s3*?#^q*LU>!e!218 z-P)(c>CdMR!ws*-hlai`x3#w)^scmZ9(`GwnCm}lza3lJA83Ae_t?9$)Ny|F?xOd4 z`Es^%^YFO&a(82%e7x?ywvG>npGS9&8(!@!_w~HpKHQpbzW?~6?PkCIY_oM?{CInK zpzCSprsHz$$K%4Ak%5!RUr(3)n`=8iZ<{`!bv$mi%rEr*Sm+$SYk0NWH`seNx&3bC zY3ZWl-R!~mM$gAzzYdmWCNB)uRDQ}@x()a~KM?(ovXhn4$> zhF4cV7MkCD8(kf~dprGOdf{U3-E7HS}0OILHt z&+TvT?%$66>N`E!Txi+cKinDFT|~4$Y`1=IJ82qicy;z^`f>T=(pYKd`}vQ(KkK_K zEvKIsel}j5FK_+1oBQ56Uiv)KcsBoa_5Ik;{n~od*X#MY$IeeXn*;k@gL{|o$ore; z&-ATg*`!A!LH@BY~M|ZA2TwHu_ zJ^nCoGx2A5^=P%R;Z^UO=hc(m-Mh_>wT1mp*YkZ}29KLJM`xbils32eNs>i6XD*3C@rvo28+v^~N_R8%uMmt-ZUmb7O;VyPBRx`*t>#mOgg3Om}>m z=_`$1{yyzIz3pmVhTIPJ#%8y7R(?+Ry*ck4nI3Ds+!?)|dH8nGIepeK^JVJp@vLQS z_ikeR@^0(uc51u%=lRlygTArutF^_gH``MUuf~=-``g|xtPics9$YWK8*AJ+{x#8f zJkWF9{Ac)dW&WanqVHSR(Ann2yS6`nIWa?zolFnvd*;A0YI}`ZT5^YCkHk9^ZLO|5 zG*Qm~CkJ-B+dJ8Ed({4uXOTL;jz2xxfpu@KZhr2VTIxMo{4ntA=h)-TyUvgA`_`wX zF1HWw_iw+HK7PDwpL@6QVQF=9ZfgB^-_-ko(aYP3y9%7aenr3p1a`=Ra)S-EItjn0>RnH2ik|ao}gyUgPb0`*ip2!br#149vZL zH9hif;%n#0?DpMB-{;|u^Zo1QAA6(MEzQq+$IsjdeLq$gFE{V+zP65c+Et&Tl&kY=jZ!+HM;2buUb>O9DuyYa@^?spvI@753P z`_t{ypRXq_QqKGMXXm2v^!m2*H=MV4b1*!4)U~m+(er)pVD3v#|IF%B@5yEB!&vwH z*t@CUeFtCOx1+3l9N1s{4%?irU7;MT-S)m~YMQ#9ncQFgvfDb+*l}{vHvF~eW_^8h z>#X^9`R?ND)#zz^=i+t$_U_pC&ZdQ5yITueTfc6x8HT1ON>f{7$5YKcw-a4Es~1D_ zSHIqV*)F~PG2VDQa(`cXKRNl~YyKdQb|&`TjNIH`Uj8iIcMSdIAPsGSBXb9t?fvop zGe@TVN?tn1>#ME3jl3A3Q(2*?hRVoowCvad9})Z5Z+@0ZS=(}q`f3rB5F*Zpsfruye+zHJYd-ZUPRz8#N_Urv8s zo$gy%?mGE>)qB%Fb31>0cF;R9@TcX^%-&Sz=k{NHJI|j=$jG6A&Xcvi=gy|bqt2xahjZY5mT^wC?4fbE|{n$7?UfExmSR3d^ z4SW0UPgCco!N=*5lc|>e;dhID@4DaoxR`32>*?GZdw6P}>z-`Bni@L2+h4f-+1B>` zZ^m69I%5NzwHbL9!Vdo#d6qgoUt)ubaVMHYBG0gaM+V=%eLDUzJF<2^{w1)%(((1% zw?hM`w>J|#N0+}Yx(W@MHnk0%p5G5Vw$IGAENq+}tPiivu1p_oU*B{-@AOUo8eJc3Yj}0=t5f(@Lm7x)!M~d`{CvAJ zzxi&M%cObva=EGH?tGxBYpR2`C2I#gKc@~lu3AqQ+YSZ~j{3&m3{F2SzW*`xyz&0{ z=Dg{lZShP0#JijO$JyQKFF*0yTpx9BJ~Xy|{Qc0n^zPf)<>~f^g~o-_>HE8rucJFd z^Bo^9M*B|Y7rtyvuIydiUNo03cE{Em*G^Y|UT?IV?j1C|TAVx_Yw9^1-dH$aoWB3~ zxVN$QapZ38^v&0W*6z<|pIWz`er_F)jJ)an)A;Z>^8RAJdvEh?PuG{>sfqsfr~7H- z@$Tqq`@z$&$Jh7y1$=3I9mQbeA~T#^y6FiWqWJK z();I+LyZ%s^T*qNp~a}7+Pef9TKvyxsHy9`PC*b%ij0OjP!R-XQhfS(j3AgC%9<3= z;y((4-sA1L?WyOLgOZsPBZmiXwhl_Ge?f569IfaqgW&(1=9q@?{+AH^cN5^L{phOY zQ|HFp4!HGGf9H1p+rF!w)5-akp{1kd#i#4_zRA78KifCAgFnW9tTw#5yjkg-_}2Wn zf2e6~@?>Rt^k`#q^mOt5=SAmKTT4gN_1Nh5iPhgD=XYC6w^thn<4yBxrEiyg@24*| zM@w5DQG4zW&t`wT8(ml#>$<;N-ygU<*%=t09_)B~+;y`)y0^Og_~&8t^7GR7r-$>C z`=+6rvyp?X(V@B9wx!wQ&DL+Y2yUhxN7v3;H$VK|U%6Xq{5s#aIQ3@qFNa&!Cb>Dw zhntjl{YNButTwCnaGOhKC-ePg-yMAT`0l88_N;Ln&r8>7=lIU%=d&+Yzvh}cmxjB0 zz8$sv{PezOW3gp+yLWfI`A5&n)I!(YYWMQ*_4(70H@~~5el6mNaI zynlP*{ov}_>dxNxw*Dh2Y^{BPXt_Hb*zUU--X4$EIFv^Zq|R)6K=^AFab*yL)eD$M7unec%6KXFC7u^TF``aM#*EOUuuRt;V(6 zyXW1*yNB7^fj`%O+IQb}PCu_aA7AhM?)yE~ZVdZ%WO@0BtMzL9!^he0V?TO-Y~9=} z{FrL`v3PLbxZL$=ZTQX9_nS{2-t|m0-Yz|qj*o8_`o4GnYTG>;xZYfPYmfwcz3mMes$B@b#Qul*g7-W_As`;KDasDg%DV2xgQEM0Ego<95-{L2|ePnk8Y%ba1oj)$@WzPo>1-2C%p8=-slFx~NU_WpKdcC&G9_-N>E8u!c6 z(b4|q$;!y_m#zKd-&cq4zkXl))HT?)-tu+#`^Hw+;pEVpp93ey2=azk!^>w+->;_L z9{%M#qn2W?$7Rm*Kc=O`ve*AHPma&D4ElyfSzqCE~`S5$+%H!wt%c-OBi^I{K=fS3vhyC6EkGMD8QdHZv zM*r{D_B&h^3oNNb5fBwrtPl|uL=aH~3oKCI|4z-w%*b;xVwLBM|EsN*;hb|YMjyRM zgPjAzL`>=t22ivFDhswJK8G&?kTJM9>WbT5hGlAVAGtE*q*jYc%<3%0(nl9#zH}-eW!>VdF&Ow1C9Cr{s-$0#!#BEPWPi$g90KIPU*pp~yEa;27E(KKH^5Cr4+4Jh)_ou2FPO~e!$S;Uu3YWtZ7^=^$Oskrb^S$x@r1W!Cc6L|m z`tf=Srp0Y-8Sd)1b6U@`;|EvI(WBX;mP=Q=sxjEA&8f@uz?N6&Me?aO+#FH6Y%}jB zavz-QkDdfj|K6SJ*YzZCT+GkT^{=5m-8NYCzAf*-q`k(A&V)KBLfI`uAVuw6O%y`t zD+4W^i_W0rMpcmQY}=rUHi@8})#2)V;1G_! zV^?Znps-w`|3G9#@0|CvOU^Zck{_x)A)AGLXEXWW3Vv^+2*7xMcLl$$jd~N3e0Bvt zYm4LGwpiRTpujpZVWJf)1U>EZ3etPMdk)-Pw{~|H$%EtFJB9uDaDyKQ&nk3^?a3*U zl$WS1S2^Fv5412+xEHT^re+-hkkC64il8+pq;Rc@*tO2x0`DxzEW9DBQBON{Ng=+; zZyVmph3iJUf55FxaW#7Fj~h+&0Qfk&h@DEqdCN_nb_KOrS`J6C8XdrD;WRE)wPkeI z!#neRf2uaclcM`j5miR=_}u0W2foo8g5`%F<$FaTTJJ>qT)Zz5MC0-Bz{3ygFU7GouZFWaKc9{;zg|QJI zpq=X`3lEaeIR)+Kn9c2+2#OfhZgrUixt{ciH6wd~kCO%e#1A$J<<|*5y9AI-^8QYJ zT{HJ4p8xDl{iCvGLn!a_OftH*tW)7~41ln%I2=zQzK^9u@Vgo0U z^4LrQ2qaF2=1u32RRdlevfKLH%qCJX*gh-^V4?~JoEO2gY<$O|@y5h86_YY!{BfU- zg>9r4u3`}YfmHL{16n*R3t7{H3vHBVsk%QgukN{DloqF^Im_Q_>D*L7Q~u&Hn#h(q zTu$;qteD#9dNT{|)a{&H*%a30?aS2huNi-OxA$#CpuMXbgK}k3Lb4-fjjHv__C(bQ z_aZ?t``OkAYcP^8;zmOtl?r+&T;0|&h=3-OiNMv2(*c$f``QNqjTX!kbED_cL%!(%^SC^^y6%B$tJaUU-uP{$m`vbhD?*VBK!V9HI?5a=GTsyrC8j)UycbOoyC>;=d-BRR8BVtSxB&xN0 zNcU_e$fMXG6AA?=o4aDnchdQp{K2jI-un{2%rq~7$QM2Se}>1sH6CoghULs2Y5aWr z3RCZv67}ay180Ps-;sBlhA=*am&I(lcXrQp^8s~x>_dJ;GRr)V)XU5~vn{QwsS{W~ zn0uFL=rI~2VQWAKoOLggZaI+*V0Ya{rrS`wJNQai|3%^&>t$)yHIXi3R&(^$Gd;4G49=<8T{{6Q?V|;OP-D2+;Q^M4*JVsD;dA`qO7~3_jWU~*B54Y6-jx9 zG3oG3X9H9X3HV|r6h7K(ilfQCwmXm7`<{KJV~IHc%*RfZ2rv(2<$ia#!c&i8MVuR> zTPtM8(kc}@0gAHF+cI)#bLbwusdsE13!$_!qwSsIi6B8|w0802t{lyzqqnP}kl0{; z=CpW4c9(~-8H|%8m{9zC>Kq|_i#`iXU$t_^ZmD3LAB-;J#9|CKGgCFk#hLC!tm=bq zyJBZykB%Q58BltPp3qr>2}Kkpvf=LP75d_wed+-@F>49YLd>mhqSshy&x>b|7z~AG zKd{_rvMsyi1q4gGn1?POvmy9HM(vV=w*zn1tKKt%*acH%=rNy?m3(TatxE73%3Vk4 zjdTky?LsZ5UYh5XKc{#%2oZnXF#h`=htAaoJp;r0GK-QOhfa;o0~tyEbl18AKC}h)53=;4VW=Xw*_fP$4asXJ4N{KPf zd9}&O`0mkFm#LHmW`KeU7gPE?j$IBKPfBDh*mA?e%vaX>SzZTxawx3vMJK^3alcZD zZvESWbdJnwN5DpxGbFGEZR@o*K==!8X~J%1Q{13d@V=W_237`Du0tRrfCeq8zsum` z#%6KbZuqh)HEz?W-zgrLqXZUr)EydHT)!s|)FPV=SDnRCv`HP}@fYl5!oh#aSzX`G6WTi{ykgXP$6v{zeUOROfnPJSpoQstOM)TI!KwYyEY zY|W-}c_$|xkq9xi`(DF^DnnjzrxrHOHbL#V4l?-E$Tr9GY0C6Ye58-!S8UmBbR1_R z#8)mcar^yPe8`HqY}RppfBRl%{k&!b&&^xjYe!^yBU7M*ZkzX3>-6DFgmJ7x`lb^^?G z-O%s_T)(VJZd3ptQL39yJmG zYstX?BUsz{IG1kqEWA*8qFM zd%IaP?P6lYXRp!tbygDdoi&`8oi<0`?<#Ch6GK`z7oAq$>)!5u*C2{OL^-^ZgH@73 zp~qtfCRf! zf(M+=ZgPQ%5c1NzryEJyj1`(q;(o*%jIuuKdyA`|;)6*xI)FCwX!&Z8g@fM8B8-=o z0O;?M=Yp@DCeFS>*A0qLrUJ>Oat?Ia*vRhQpl6hnIwOLZjI-*Euv42-?(~>F%93cO zDtG!Y@;@jf-&<&4(*FKJeq9UwrpEs4LVj3CsvCMWtj=Nlo8ZG-({ozcGy%xZ>SCU% zA4ymrwC8N1tn5e4{Wwxd$GL=?C`W=68=aS_bZrHgSuV>(97Es`lfIq==lmG zRt18O+Ej7zZdj{hwao?ZLe6-s-J;s{mZ1ApPMcDee3nwNL>96N+-#nP?yTO3F>>ek z3Z44d&uqUJlEIycR?OL;)L{ZvP9HxwwC~N}GmG(E75Tbm@GZaTvqSrPRpcYg=;W=feRkYBX+drFPXyldD~}bHlpkF7s#u8D%;Y z)NCXp55Fqq+K1$oP^o^5t``YHJKnq3QWof_>8oUR;#`^JkwA89!@FS5_I#RU)8;YV zSZ~$Dkmw$c1!b`p<;wnX%lH- z*~Bm)3t3BT9BZ+~VX^*)~%I74_g6^AtSCbg&9Cm$6ey zKOC1k1l=X7w1$=Z{GQ9^2C_&UiW63S7`+c}-}lb<*WTl0e(^P(@0;bpXSeUelEGeV zeOMcF6;LvQushqCG~K$=fS3Xhx54HRBPtY+B8fu<9p%3%Qu+=W8{_)Yn&cNqXGou_ z>FsE$6(l~2O9T~32q81U`=D`nE@iNhiy}#QandCQKie=ibjz;S?~q#12~C#cQklzE zwkMP=UgW@H!rLAoXz5IUQf&jG5!*h5s!JLqsC)e$v9Ky`# zF`Qn8+*mPrCQXxL&iaTt@%pKrr-T7pjGv|By_w_xTRG8p%c0K>@6VQwIrlh#IWqB- zArrhbtraT`VqO(cvz$h|qdm1%iJ~W+7T4Nka4&K501C)?rm+B(drMJTdS+bL_?q==m)tJNik45X(jEFGZ)DWpg>zfW;gr$`tb6Qdd()lM(5oX`??3bhal}Fo?Gt0L|1m*Mp{SPnIHoJb#FI=2Oi(j{A7rJB}X!usu zr(wU}?#4{5YFz?-M3#cUn&r_*1o6tjEg0n1opBd1;iE(&W8n)reP5VxC4Z(KmDCs} zs(CTptxZEO&!7w1gB`OwDb!B2QTh&qAWKv$m-p#hf1Lr%I#}Ae=|V>pb565aBR2{8 zgpr5d+WL_A{KMh;Y3cdyqJ3TO`ex+ycQ4xCpn);5gD;k}vzX z*T)@rVEud$@9hWwAAj86Z0tTefIs_j|E3l0zU@Lk!zA_TrS%h&1am=Ya2gVAZN2E&5@xc!SY1tIb3kUy_%pvDt=Bhb;QGQ$taEsQvgO5QqoyW>cAXqIONp_$0DLnTcJFxPJgK-kaK}-n zm(04m9K{El<}8a*<%T$j0$B4<5Y(hX^5a2l*qIHm=7r_1*WUctiXCEI|J=F>M0U)j zB6vye>}B}u9zoUB0@W%JOGd8(-cRHh&1q*CJvZwa>cLI>`#hY{{QLoO5_bx5=1J1q zK&xHm_Y(DQevq#ZKCrucckR9ojC?aq{OsC&_Q3~rxUqQ-1W(flShi@z-GNrTx-4KN z;PSyBK$4d!tXV6yMjwpU1T3v|6o`ttdxXv{6?yKffqXBy@%pW`uM2XrwQ}uh2@pW{ zlxuizrV)V{EJ28SK8<5f^^64XrBXiU<{b-02ohE zwP|uPD>U1e287M*QZ79b4yeaCRtVr6Q`A;_MTuNYRuM8~OIe<;Cl%K}8Qp^x}Vbd%oj|IIszQR|~$bCwsF?{p|L9RtsLu|EGJ( z)ApRMptXDl;EBpu?c?=2KCrU2a%6OJDmNJ805~Ae|DjI*r&J;vnW%kAg~8D)DSkcp z{S@~4v%mEM?|D%#=jbnb#(&(5{l#bet`}%T;&XbpEB~t5k8PKJ$1dHwH{+$*SCB^2 z$@;jBgZ*R{ar-S1^a3tI!$}QGZ8%ZdF0+6Zcy_U&m~#Adz1RS*TR57G<-)G_VD;X3 z(R^qYVoWNd!?t@bKb;wYV@JQKoP2oJDo*yeYZH-zc(d1l6uG8Hv9#@E#vO^AgZ1Hc zRPq*KT^_L8ps~g3S9ZQGJ!Tph^yPVMBj}J?S$ng^r9d)WpibiWRwv=HsYQ~%UGg|` z)vdv(xxK_Hjl&9_XVk^{F!iV#H31(eFP zyG0elmAj~+ScI7*m)UVwhz%Q3uSBMM$^i`ejMVPrv+>vrA5=~s=%Ic@_Yi=(`ty;$ zj8?zqZoR_F{&u7Pn(&cZxqVu9GtlP#jve(h zl%sA*sCcb6M@o~`ynZ*kOySGJnEiFhYK(T97fQnAXDkbhaX4Q?_U zh-RsiJhwO_MQFv6R7L}U7N$(QZFQ54a~IRu^OiBs{loL!vvdhKadIFw(acRl-QA68 za+UQ5@!-g(sLXA~ee}tHo$vG66Yov_$}h|6FRBLrkSqDaQ^3iY$GVY>4rBnE4S`Ofn*7;$>W>c{r{kjI^!Z8Ho`=fezb= ztvJd9BVbWlZs>9il4fVQgzUCRkcu|4v{<*Q8uH*^J;S(8IXwI+lfUN*(RFJNakZ>8 zjga8o4+{6oyZL!07y$g=6^F0u&H%Umj}V%_R~$ZC91fSYAM}If`bsY6rEYHM#u&*1j`dpp!cV_=stb@dI)1Xtwx`m}H z#+V8FD?pqbwAYuX_5m}TeIa(qxg4@xNFC{Z7)JNW%c32NN6qbogVF>gc8jXK+*$4- zAR3bhPsCs&trd%UZHfZ=0W)phpw^g;2g~j%cOc|bjaWbyln5cv9CRn5YGNCq9*dvb zwO(uNgbW*J>f$aKgsJP{v@4xLA&u~ICIx5ZwCZ49gnj@11~zcah_ukl-aNSYa@ zaXzX`o(GnZjmYWP)?>{K1JAIDpwz$`E9we|Tz|YY_SLLz#kaLETwaQ7Apy-QiE>Bq z7tPs6SMEC~Nc?)`zHV3jmWc4#_vjA?f;j$LCUy3-D_g%Zsr9kk*HJH-D8;cNv(;Mt zBUDdyQTYyf1rxr?8+qbPv=*2JgUStMf#o9`ci`qlep-MI&xfHUx??Yj2ZP#9+MVws zgF~+P%2t70#k})qPYD*D-1v&(0C3>KkkVK^w{Mzu-6?#9oZQ^{2~{T+dh$#Q)dV9z zcLF*shAks$WZX0d5s_BmqEv+~-u*z~`})ORW#bnq%qvdjYbyMkDg9?>_-D%oSQ<`I zEC&I<7FKUJrAbPU?rPI`bG9T+=lYs;YF?vFq?Ymo+AJb7MIwm8 zJ~1>dyMATf$QCLnSl1oa>tL}>8pACp8xn3MiBeRPl2a%hw~1`P1(C_6ghLIKf*R4Y zt2Ynnut}_f((>RH*zBnbob-iDq;*}!nA$~4v|v*#XEV!NZZ|rYlI9tyAt}Y0wM%eB zvirH9Fg$h~Vz6pzGR>+>G8>1%Ts4g5>+!8kW~esQ(-OSV=#p~*-d>w)JN>cv;&r&s zdqw;r=>Y_#FY+!ezeT2ecHRECWaJBGBc0~+j{bw|ynGukmYu`)Ufjp(OXt9eqU>>% z?0_R8bU7kadI_$)T#kF02C$N1T8|1mJ4j2DXu zz?Y4;j?KGZ+WX!Os$TZHb@aH-?=8gfLilv_d{JOcKx;}}#}SgoBsOgJYfCa%H-uij zFI_D6I9PFO1X3U$c%%>18Xj%2`OXlosCL0_#}Fm>{Rr~R7P*5~iFn9vSoWUa%v)hU?FZmNzET`@Zfbp&6XWnsD8 zBsR<40BFwz-q`l0nwRfwNIRMB^e#!)R#S8=jZPp@L9UmGSXN_Hv3((+ZBSvRK;EFU zfm0)eQ12&!mGQ3Ef_7ZhswkxAMVIKbiKH^*u44eZK)RVJQ7tsP5a#1stQlOC{dZ8!9 z;_081-))JUSv%xzNVM2GcS@wryyJzTYf5gO75fB|2w zxuTd$Y|rYXQgUOh2-$Z4$$25IIiV%IH={o7J%+kT2|6Hp9}_AQs@%0|*?hgXj0x3|oH!!Ee^@ zd>)J%!&9;&F3uj3VLtFu_z}_bt6=4o$@4V_^1J+=593ijaM1lJ8TiE!yncL220&Gg z0|(tpc{f`%+r7(N_U}K5uRrzqEC1r4TYg0>e$kKr zRJeYQnEu&M;{VvpGy8=K@7GmkHnibH=@!opHVYMlSj5}FL0Z&uy(_nhoas$?d!d!H23H7 zuvK0uT-;l3TXth)SzUAsHY-A8h$ybtjo>nSf|in)Vl3ER z#MHiE9+zIKpD7d$b7$^KOk$YZ9rJn` z`rx|#kT3tzLBE1Lzv#OCaR>HU@qMGR*jxuE&roAvZfDc05Af#Rwd=T*?{ zZ2AP~B_(aP1zfkAyVAod1xY=pVVyEG&gG5~{l;uf8kn^nRIs_p-V%dGFHUznBI1Bp z0pQ`P82V|kb9*$YHd4pT#KA2Pb`^G$UB_hFSBqhKU@?EWNbPMx1b5|kxf|bD{fUQI z0v;D`ztFA<#0RFV*;#bB6we437!H~b#cLQ~N1hcF?so<6w z)mM+@H8QVyay=OzdeXtZ;*8vc4_YTYX3*VS$JWWgLbb6=$SF$zCU>3uhQR!6767~> zlPN}cXe=C#al2(iM*0}oW%MkSxu(|60HPs5=AdM|mQwk+#1@xKmjR+6`KDIpN&x^$ zy)Ml2m9U-Lnni6>=$E$I2X)~G7zc!C?{3=HfpKqPqW^5N#{aM`?30e$3XYYhao%Hf zhOGipdE_Q%t#6%_GUXVDs@=LVPUNc6qdEm#2=}@Vh9`Z!%MlT4C*+gI04~1vPgPlo)HPcU7vj+;>08|vT4XdDwEaeE!Zy&d z3<3hx>J8{LT+*C-)3u>vc`!R&0jFwpXw3)!XdaFmg}>+Vyj7hry$Uy8Ws=KcscF{A zQ4-$Sk7T8?Z2*jXWM+cFbyxS`18o3Cc6pHx5AoY>VinwY%sdb?NwLdiAIdgPiL(H# zx2wW6bHtiJxa+$L2J|_eB#$&7sG}1Dcj_+E`t@D`Bp>n`Vk4LxTM4Q;jUF5MKYEHz#kS>X9;uP>NdAr#K>7$#L-el%#2?o_*B^Pg^_1*Vm!AT zO=%0Nk7^Mu5?9bu47j{Z#&_iW`$zvHI)gyoFMYl)I-~s0qBDN-@e|#g$!dlF(F`1O z&&I!8TAu^?iQW#zjSGLfmRlJMSO?@IAVDU~Dn&mn@P#=>GLSW#fXD79~Aum?yZxFDB$#281@m-r-G+10Y_l+DoiAMfYJY|^RBk3$OwPTe1z z(D!x?`=u;@UB1Tm9PQ7_^51I!Mz`#vez<=&9XKv}?T}NM>{xoXAIzd}kDc{^cZXYy z45#3+YaP~@L#b*`9Qti272Uf0G-d7TQ;XX;1(3uw8DX=244WZ9Kd{({ay#gXjU}I&U7$;cs z$Eube9zn_34R2Dj2+JlhVDpJmZcBDyE!H!*&X5|li-S&Z$c0pE9;q)TZ1WbaapZE9 zu?InOcT@eu1FYpvzH7A|lBdV;Mw6Ka9-yA;>wt zvcR5Z0Vy!{F?D2FtRIn<^(+9-$c)zUISueiD>fDJB!|t)(Fj5_+04#JdUXlB=$2Hb zB0xH`?yZR_`095dp*GE4y9jG192#t7n%xn+IiI5DERqYFH>2yG@{Zrr=Oa)$FnXbAaW~X=9F|xWxGhj?MMO+rg#fO!y zmdVEqqnD@*0sSN>vbM!hoAzhu^=kl&OVAqxxxwheH!tgZU08)4WIaQ$XkFhJE zHA5)JuV9j&FEaX@ij?B7^dxIhKQjl z)8?#U(QoA zI>Tt5kz6nzXn4LI@~bYq*YHrtmx*>M{21BbcVme-4`4fa2K1dV6K z)=-U-i=ceEe_$x|?N@r0i}!{?6!K-g9fkbgVTajA4G}&Y9S%NyBAnD95sprK;gY-- z9_4w@wR0sOAidZ1kx}C@Qk^Z5q*6;DbIQeH(l zOZ1-DjVJXcysZqNHE1+S{IHl@GhV6ZGr(mqf1>2`5?w-*#i6)Zj3A6_U-5ftxq`!_ zx__`-+3IvaC24Sa1L~q8AbIW1NsZu|BjUWUE)v>4c0I^!sL^$pOy>(~qjfkJMc;g= zx?CY4-re0=c(|J9YXjt1tlKVNH}0#&LalmSPGWq)OW7Y*h3`Em0c>`EOb!(CWj!c` z{BaNZC-w+0MX%Yikl#TEEb&tI5u?gX8f}2boQSuRD7joe#8#4~!e{E{AQ$?mmA1XW zce2w10Ce{pXZ2M)<~aBxlgdCVW;>)+ALX~jPWbf7E_ICc^3Yz9p;>h8o~tbq%4r1O z56Myw=t=;Dv>n@P;}*THv;3aT*;Ep)n*XaRfH>%4XSnCEuEoM!qE%S_c6|8uLwzd@ z@AN;^*JY$oev#4OC0tSm@!imJs@A3g-7FtG>j;OkiW?f@-ta(9^c zLyFnAH}Z-1*yyHQD%P}l98RopBQSgt-Y@%*XVkm$88{`xU_tNb$H$9=W6(eViY+1m zcM29{u`11X`^-a;jAOF44$t>-FQ85_)hlEZ&3lErXSycm-uvJV zA~SmZ;bQUI8NS+t_rAy!`gPsuKg)XgIX?XG_V}OU!||R-P=`*HG|dbSy^Rlv}OmFhkJ)r|F^hPZ{V z&e362p$bp7Yd&Epucu!pqN|3AyH@RbYh8QYhj0apqD9FUHEp%t^iDHwfK_TyS0G%06&zzMoPvVw4W120)#(tPoMc+;zTP&n`u% zlj`CZ&WlpkCbi_}J~!)LibHZ2YIk!9wkLyy`Q*VVy^uPZ(IKoB@WB15@$}zGWO--q^FIr~H!RUwOw75gxoZE!Dlq>{If!LC z?aH-LQ^vihsDf04L*eL6YM-zzW?{v|LY=AsDCFCrIxG;06dI`{~J7po$fh0jG9}Le)tC zkYLt*f&?IU?^v6r$~pv+-cS!r_|)vML3{B|5+@?dvP7=hO~bu#d3}3?+aWLuMZi#S zuH?8V8J_nbB15)37WW}9zL9%c76L?-ZKZgOg0^ydYT5@W{+mTYN;wwXeY4o#;jECq z{k~%V3`luz7D|Ct&{tLLKM|1f*$nqLh`5y_Ob;aR`+jv;BK7*)U%lBc4fNLqi%{4< z!r9(Dvf!9%oO6qAD*02}qA>d@u*~}@hwGX1@(nzpzZ_rxhb&wJc9qj&uA=KY0mypr z2QT6K9u%eC@$7)&`RiW7{~cBae2Nagv&4W>%VSB!4&gHSlp@xm@p^lBtQ?gGFf-Kw zEZ&=LfHYpXC=(!!#~fwdDJ~n89WyZ65g>RSj}28zW9dy6=}-1tG?@}zehBh;gn~Sv z`1~Ul>u%#<{%N)qbQSk{kMv2keKFjIQ=y!ZF_9Ww$9(V5kDX2Nc+F0<%FQ0xT8xM6 zDQDFRbrXt*iM9nss8|UY+PLEQ;WOMJ37l;@e%Az1GNYzIQT6d<*gu`!?b$5KKx;yv zffBVA8T~ltq=~PlWUwRmpaI>0rI9-`cNroOt;aga*)!1n*Yn#!Op0%-meIb=!$kkU zR=}>HNV-b<8nS|@I|@+*Pb3(Wq0Rz^Rj2h z?hI8|Cz8;0sIqNY1i3VTW{H@qLBGpdA`fEH6U+j{%rI0S19z%_B!`%?0l;aMgnex% zW-FZdz^jmY{q^7K@cUZub@3h4|8abWkylUTp?EoFsCPCQ->mX>_jIdv$s`8J_|3?V zb&w49tOb<;J_j1Zag*EY8bNmRTZ>p^S-0Ep+(Tr&+&YzAWaq`z$%MND-}S2+JxkFd ztuGe-nYya|u`e$8IyjF+h4DmNJP-J0b4XMmBq!)&LmC0Aybatob}kM{olqJKm&p2hO>O}3V_E7EDW7xLvbtEQ zxm!5wM&i-Y)KBM^)qdfWJvS%VrB{vt4+vB$Hnw(R`AFQ)b~bPwk;8g;PV3W^c*EoU z%&}E36pryyiSho9xeqozF*ao{ge2PZx-5<=~IgnTr-=hiqgv20Z+Ml zY3m@5t{QK;yDYC#)6J3Fx8nm!;_q|v>6n);)g|wEu5C0;enhLiJYQxa%v{cr?i_n2 zzi=@gfq;Qd*@0yDCR1ANjM8RJoq=uJEg^{YbGS_^#`(`|;X5;B@0aX-YCfn!q4@hQ z;b%n0djlN`|2p*SPegS5%l$F~p;pi=6j&#^JU4pL$S{W65+9%ONP4HXn(hiJJ{d3e zf^ELJ8G1PVG%T3^1#=?-{qKK_d9-hTDqN#pfBv^p{T|K)*yfi#mOpOWJ~@!@wz6+i zC*J?XR@QACSAf38VNSfItUnnV=tFh?LhGN?(&_WOp9IiyUaxnP z+h{5^yHG#2N}0H?J&MB+PB*sbQ`*fZgLR86RVL>IuN0e7enS~$u3B8og~~j`_qWx{ zQM3vKNLiMikE5N}*f7zRQjJ}Xt7x$4q_g|rR)O7~W^jXWak-UG(l9r+Vkgck;isb| zP9i9uNS;B^2}uKhyIyO_x14AhipNceqlx4P*icWP?P#u3Qx?V%N;c z`tl<6x#aOW@X>WIvjfSa8*A8a%$wpezbcH~d^lxs4?7dxWJzcoZDx&i$OM03t;S!jvb?kJ1;U7i`c)C<4gBdQeN1v1 zQ>0hH$eP)7k_i?!%BQSo6)@FW%Q77()}YhDw_|mIDcm>(@{HCiA4UqaJ2sJamjPj}zydR`8Lufp-(RhIg?+zILxQ}C|} zU_Ww|-ObEVTYkW>-4APrN36|;69xqWjSg)74Sbnu$EkM=84RDa1dNmv7*|}|Tt-K~_?TwijgT9N7 zobr7T)j2`DZkw;9=kt?dn)%cm8xI=HNJ0J9wS-Bn>*2g?ZlmZNaZGP6fGu{Kt;E59 z3)+L=am=SZmn~cK2s+pI!ge`V?uRUW@~%nF3zEd7JZ69Y{C}iK;K1+U-ShvtHtgR? zk@(>o^&9HR@t$6@OhSH=*42SC6N>Aneaj>he%)4Th_-wml)XG>sS+pxxujZU3_aUt#<#ZSe;^GF&D3fC6q0xXfz=y@` z0f;^Ld6Y}{I@c?*V_QbCa*cIsGg02UJyNV#)zF!m$<>;S^^WA0zPh*ZtQX#q(?}Tt zO{+?P9n*0|_Bo&T8$fJ#%%t<@$F05$lb7iA@Mr}f0_L(_OsdRcx$!QYfbSm*Q-{=; zAWSxQQVXPh0P5MKe+CA!iL?*X$)RQJw3ejo_{-zGbeC86I?XXyF^9tlXm@h6^^ec|YtT+5uw$-W9ktZ$9zk+;_0H7x_` zE%yB%;^;@4jjKU#nmw=j#)gZfK7uZPq)MQ`yya&l{<>5N>i;rT;?D|E6Y*s12WeD z62T~72wdt_T}x7pxc`)qL*p@y!4C*$CTJN{2ic%xtrxFF%c5LM z9|@#}%1t3QgGhaqx@lKjYxI)&T*haBc@d$d1KI4I2oUr^Drn17PYpmouiPmf2-RKY zWQ;H#9u*cfkQuYu=a8T_w=-R3U0%0Vm}(f+(LB13pw$~W7L8cYYg%0&1FOA#3|ZX` z=P(Yva7#7e1upEV+bz!!Nx!^`?zVCjt$V-;5PZ=cR{^ObE7&4#1_&U`3(BPO`0szz z%Y|}_kh_ioHuHeG@)t697%Zt%C(mn@Ez(FLi^Fb^*d?iB;n>-oD|WQ&qI@OVivSL7 z4*==o1Ok^;jl8=BjI5jzjqM$?mXU!rkm2M9wc`8wmUyp{rix$JZ~hz65>L?l57;OE zEw!&{-RX069^s>yl6e9GdnVna3@jxhLc=(+0$8C{dcf3X0qFfB2-(G@k|Bh7=Qb%f z7+LHmy;v*dL)$AFjPKZG8*gV5K*qWn*kUr(o1G(tBorLi(NCynPcpj85H#y8;EZSx znRwxYqx#;R{o*rCeO>qj^@=R`ygU25qro3)SKmZzjm_2^%t(+TQR*|%b7^X?0Q_Tu z@Fi*5Ci(2DD->JV+}7D(h3ZB7J{lZ4vvX-T-G;~5z$M0ape1|IE7A21FkJKuARk+h zS(btkJD4>SczcdAx`@|nF}gMF3^3a%;Hwa~En$+`##$wo+Gc_6dPt(VH})FZN7nl8uV@bYW{6KpENbrZpHkaBfSu_A%fnvsDW zwn1I#*j9Q7Z18uJF09-;i_7NP)-G(vyFN#mX4Z^OLO?eYZ#oAv3FVJ@BBSSr z{{K(in|3LRZC$wE&lu-NsHh-CrO4T#vFAc|oB|L-<3voi9$8I^fXRo%Gv zYvdSdgd6srd#$YPCTq z5IG(ej@5Go9z#>SOCwPGt%4W~2KxT`>arPsnMGq{^%aby7g5N;opGiQ|9l_#4x<25 zzVBAx^W@z>2cr;wIn4Ss*g^}{jFO#Uwfs*~Y(Sm-I=g1B%4~@?(u-9_*bx@j1l4or zfGKiD*&y@*UhB`q(%hFtW+U9~a{a(=lCOQBWlGq>9gHHbE(B?8;%}63<_TQKnH{-} zY0Y^^_pANhFi&0q30mNV{Dm4FB#=#82Av7852%|2UvgEv#qFuirq*ny9%VRxwL;0X zcDRx<1Tb+rDy7kMGbuz#C@X+@^Om@CvkO4W?GZUpBDkEK0|0F!TSRbRxT3Jz^ll9j z)b_nG!&+h&D_9vwuz)-DQ1#9DkYfm~RoX7Vz*~WoMxaD63*}DDrv;Zuq+g&tnsMxCz$@*>twfpcB zyM!Hke=V%uh;EoRj~SO8l2qV0_3MU=+aX_lErP2 zNgMa$;GhK_Wf<~`lW-!}KfAc=?EG4}w@f{c$#oFOdL-2H-PHso zua*mb=cCc|?~sTeM$CVo%@~5 zO=A5$6E{x5NBi`5`~w&*c=z6ap6Yr73H-V0`X4X<|6SHK=obvAj0d7--A!!IfqAQ3 zfUNcWb_Bl#S8>z4nyOWk;cjm3h+)ocX{GAqu(o`m-g^QZ1TnTdQ@>MGQd790a$V;j?&oI)fJE)GLTcH7E z!?_J2FDGY_X>1vgbDKWmD4(aqL&y}|+A<5=-D_=D4h@4a~-k2p3l=QN(`&NKjjnVCJ_>W0B=+?V%=lfeXQcIaK*ddr=?@Y2b6bjHt1HP9aBY=dY`1l+e3OVUGdBAWoC*nbHT( zDrvRw#C9=G$>tK8ERzB8JSgYtz0z}*TYv2^7u6UF*S@}Ntm+aT^=ERX+8IUgxZK!X z>@}A+@;~1&{y=L`KoWl6>pu^z!4?0hz`WlN&mEl_MiLiW**R;MPmDNj@j!0qU2uo& zl$@ErsXwg}o6aVSAl|r<+pKo60PUactV7l2B>)xb-YCXD+-)iHJFqk4lSQSdfyzUv z6K;^CbU>&m^Pr{j;qsjNa4O%zq zysG}G{cJ1?YmkuN&u*9uH41W5Kj%wGQ`iNanZB%R!Hy{uW29JZqJ!D%mrbY*x`+W5x5Gg1YgZ&v0#?$8u{#|6Bw4BZX4 zQ#E!~f>R*F|5EKY5yZG4rG_yQE-7|byI>Ile=tS;wx(}J1u!}G?kW2`QTs-X`151w zw-m*P!8flEZO4hk^_v@c+^MxOy5COsit*X3k~TAW)GVO~93Qt@P@&c@d2T1p00)aZ z9_Zu?c`b4Y3#h=DbJB*2L2cg@g<&@bMR0T|trAh*7qO`D>0}+LmaTrSJ0@hNXI#RH#HazvVp^M^bJ7Fzxy2SI{T~!c=r7COp ziFqX$!;fKOOR!+6E~~SqW!jLNA$sib#0xhy=Es;hK0oTAv-L`50z4hYeqw-w;F^QR z`?i?LE{J|CA9gyy0|fJ_bZ^S!PLFJ-yG7boFBk5d!GY)uwDgld8q}I-pLWHj#z0lf zs+J1*Mf0{P#4P+YEcSL#1t^FeR*zl1haOHnYT7w92kT{LY0CZh)~Ob^{%U6Q7jm(a zIeY#_gIdWp(TjsX%xbY3a!X&HfE>?+p?Go@iLL0Gn=5{v zK>d3d8s+qdmZkr8Cm4(6_6iul-LXEc8x<}GU8zn{0|~ml78nxGXz|scs8o48Eo>Vk zob~hMT)P@QQWGheiz!1%MG9F`xqAvf0}S+yc7Qs{u`*x8@^I@A1d`n}mhA z8zNcW-*k_>E<&z2qt_K>-b`J1aD9i}6)9#4NKy8=#Qt92UbJBNn*pt{NQHw}t29!@W?kLZkk` zwyj)xW2=~*iRHU|IT6M(@X4Soy9bqj4D~8Y@L8O7#wCzZr(1+kMIB{&kr>_FQuyZuqdh^D%mE*iC!#j z$;A_ZDk(sE*v_GH@vmF`REDC&Mtqi&Oucit8Kyi(wX4KcTs1y0$T*t4y-nuFa} z7h}|8lKBLcsQcWm{*jCE?fZHgPx`^d_;~~l4n&mviqH3F^6q~K$q{2G{4m=7e;_31 z?QefujUPgCJ`Y&I{WW04*NI<{|7=~cWg)_UocQhZFrj&MXMC=9M>z%k5)p!FMy(1I+#yq^(E{-GB%iOKj*iNDaOC$|!_~^I;S)=jw)9ZjP{G3E6{| zO137i@*Q-#_HT2k-N}XLB?8=LLvt?xS7uTmO~< zSC@C^@#hJrHyFa7U!nd>U9MgJ{Vx+1?geFOb-f9B8j22AIkpEut5aQp2qY?#CcV$+!xN4&uwl#Fa-|7fB&l|8?%$qJvMl?oS`pN*o`;p_Mv~-#%qIa zHCyH$$xUu&xSQf)otdmxvKUdYvxd*Wz^t=Qn6&rhbXB3(Ne z4{CkG?X=hkn`k8ikI$KIVc5QCkKDXWf>b-FbX;jz8aVhBu1~^RuAE%>E>{os5z2;; zm(8~Khv!7GeL#{1Y`nvg^-JXTf_9&RzVx--UJgzX2*h53$PK3_px&_7%awMG5qZy* zLLN=Q4!gcwlB4Zq-Z{t%9B^#Gd8{g6=-E!4E2S-#$|Tc|e1F{pU*~0)P=gFR#EUM5 zO!<@wK%%RQM$tP2xd|VVF1YWci+2%-Eb(ci3-Hl@k#v#YxwkXu0eqPs&PMK$>wcLZ z#-=paIlt)9K)ehI@6`j4^!|C%f8*UEjq@Vce>&@p-s_F_vuTRsaRWU@g?0D21p&wq zw8Km@HF0qt-wh-!PbUBa6PI^+Me$Vau=0V_t}1S38^|3fR!L5UR>!=KvLW6U*7O4? z$O*B_#9BGfhWbfZ-J+7}J@H`H>;hvtqyN08`}GTY+xNk6(YGA}{P?r%g5ab7?o!?# z=>nj0xD*O+VfNeH9Vxm}xuXw=wS*u_Z(U`TT4|S_I8HF4qwW0Q-BwZR>4qri9A1D3 za`ok5Ys!hn7@6(jkZkAR27umi2QLVE^H4>{+HRA{RAhFMEMAfcy=3DGJ42zJ6Ipks{w3ES6*{{}oOMCLv=y4pB7^h=l=QcAY?cb@ zp%Xhez<36bT(G{z<_For!ePs}hD=dkU3=?`%AGfDDG=q*C`^38SW}&OfX=d=Jk5$> z3rQFA^c?~HOC&yTz#l#kudo00K+w#010PtG&#JnCkN#`2?2qxF$au>D2y~Dt{vR0t zoV6uViJq>-#b8Wvbb@AbXdcw)-Co-rZdt+M-p4SJ|e}V1TV#}<38kQmvGMQ+Xf%xt>Rurg+g1H4l!DZ z9<=_!`~6344I~(TUz|^)OR&U0NS6@z>B{w$1GL-Rae{cm(*lD9RtI?6*&SMGyTzN` zR|}V=^VfXo|AVKk%!tc6pAkxg6P4;Y6O3yLF{qUTAj{@TuGv*THYtHULCO_XQ(E9$ zEnpw*XEM(M2@DB|4X=WFHi;w)T)>^GwBlgf!u;MJ%B$>}fAmCiDSDDTn$TIrndVF~ zmm!bKblQq$Hn=CAI&>TN4f|4G)CG8q?;=q5&(s#(lJ{6z6>uzww3(lbCwk)ibOB+m z>O)I^9>L`f>szfVP>JnjG}F%QA^PS0wjV4U`|^Hk8<*eWRjV+*^_qMjc6a6UItY$~ z(NoHW@S~9WxmWD#s=XcXK(4=gjy_NE{VhC+FE@R=za#%6Z2PGmE_21Gn&KSiP`Yr_^5+(QxM52eXqDrOxbcu*E}gfEvMe}dt$2^=SJ}~yaZtCroPt2CfjK5 zwdcB3)n>H>NKoqqa_KUET>>+mC7xhGP|8TjNgg@_t_W>&lNQMvM=3-h8n8bJj7J#h zw4^Ggf(oUI=6~?!e-mERyJ!`#mY*lQ{z-Pke>c&u#(LR!+&_b;E(O%-GFALBH{;9t z1F2&75a46BS<~+{0J3RPA4$x)a}uVHSX)xO9eL9g8nchhMi&|l3OtmxAy6T^tYhAe z$+o>P7l%AAjkoFg5sn&iax%Fs9qQ^`^iJ%IjMfo(D$UyPRcxi!B2~$BnJpvR;NG^U zq!~Pw5`~+4PUKIEGL>PhEkD}>taKJ3uG>*!VU6zP!XW7^>z&Z1*CW5zIMm0(hCfd+ z;PzPFVw?Dq)mx4irb|OQ&p^a*m(gn1xXR^+J|VD#Bdja;c*i^n^F;?PjJo$z#G>Aj zUd$;l4V1VO2hQF!)5+Ear$A7_z0(5BqqJkW^FiO`D^#Mpa?8pH1yG6oer7hi)#B3(Bd%G0 z^uZ-f_L6&(91Yx4cUtD8UDZG@e0|b-Icv7YJSB#eG$2|_3y^^?6DwsoH^h|Tw2tT4 zpY_wvdlwZ4m#DZTNAXf(r2c$k_)d}lNr>Nf^G_p5fR*~Y%X8lYzm#8drQSrp-kVub zmU*l!WN|-YuGiYi8IFfs zoQj)E0lR5XAWVzxTd@G@0xzzVnUEJ?j(3>uEN*8jpV&UTSZ^@D47g038)pRc?8K$u2I>jsdXdhUrz>a2L{p-0iBl;SzqP2M|7c_GsP-1th=r5=q% zC3lDLORRD}?xKo*5J2WoE8dHxmXAUPDZR`Eii}=y7tAZvg;@Q;XJ#eIdTx9*;SQqw z&xiNFF74}Pz`TQ)fggXK{`_m8jBoZ_nQntQoC-1jkDI|43qQwUvj_QhGZ?h@kW9Da zzFv&?Mp=HlN)UiFN5%nbhTkDz0*?eS%xUnXSVC{^^r}KaW@1*|s|bdCI_JFmA{nv_ ztc*h;rqR8sDs3+bG6b-)-4gHKOUOy=588962h@jGQJXMG28vbYdCi6iIA|7?xtHC! zMl|eiThAhvB*#o9SvO!|@jy<%n7d8H$H!#gv)9l8>O*Q^ikS-!3l_w_^gq}^zUe`# z_`as|X#@`NJpJuu!5>pVw{+f_aKWfrH0q`JZQMz&hlp66MFi`23gptt7X@c^S5Lxh zBo$Pz1Ql4a0CYi47y9D3ye5%gI?q~UL}LY^HR?sy^`N1LJ!TLcIaUMa+jg&0EdiXu zvRT%*h+!=Xbqbn-=Ymf2*#<&wTTyf%N^F7;iVfdbTY#cnU+1=NC!Yo3lB7Hx+Qs6? zE@d!%4mh{iB^4d}$*KhePPL?^QCAjkSqnSgK`M0+FDuCQo;tNCG`+gjZ~GdQEMvLu$=WWo*e-uBbE;h2aO;om zpnpI!X!eK4<@1#2Uxj9T8RPjV12h1Gdy^KlEj4LEOdaT+A|Z+m_2FarX4EmV&RIdI~!~h>HDR^-G>R2R&(m_#Nph?He(*&1AEk#YB-G~vp@@6ghOa&6)O+(Vs*Zf^92cN z4ESLx0(pVJA@=WoRXU6~N~4hXTtgtt4o`(Y4FLYSnr{LCsJ!oL^V1j^;5YiU+Wd9> z|HIPY7XiR-V$*KyO#tYF+5tqtcUTOR21`4)l)eso>NvQnx!DGO8}M~Ot}1Xpw|krA zi^HH)Htr^rD(nVJzB8Ex~krEw>DWg`wm&Wann;crBxz*@tbZ7-RHLIxt*oDY33+^PV*_M z?YsoFso{Pjw0q1wbu#0}V4Sg@y=l4P#ZNNbUvL1nB~eyg$L6UqaY?KKFz_Sxiuf25 z8Y>Ir+8?^B(rq)rEBq}3vW8Zd2g6*fZKljm5q%CAmbt@qSogcJK#rC4Y>e!0!%PKS z*s>7t*m{ysvBxt~j45Qe6Ozd0N)wk0Pt_m(~UuSgd-dlGc6aw;~H{jxUD1q*~lD!Hi z1d+6K@{sPMx?C`8)+9uUOJ1WatpUOvu=O%dh}g27`}oKgU0G%{$2eUp)BO(M8m9C_6jSohcEz50JY3*1>uW?;c4{|27-_v5FpzRKuSM4c^ zZ5DZ0_C^-C3&Kp~o;d)I-px-1+AdUU#{5LBica~S*udRzc{J8PM?rjDtJjN6gTa;W z2m7aiJy_!J0ec7@%xBWRsgiV9E4`(1C8kr2k`r&y-CP=T@69ZSeIH*=_4m^2(_kH7g?=r){?s5Gkt5QlVgv*j5C)eDoa94EP(F* zbz(WKgxhGYb2oUZOi!=F@ap%NOtG7Yy8Vt>02$ikanw+>+v1d-Y$r`El4f{nHHn?- zuIUyJ(7HkBm+G_;Pup-x2WN(;+(yq%F(l zu)Ig?d9kbI`pA(X{6{~X$6M_fxTXi0%e>X>OpU5I84fWjGgZ-@87}HgMa_3o=yG;r zQsh#OQF~~V2$6D`WKz_D-z|=}c{zDrFMMj9qy74t5t#w5ys**oaoxF~;vwZVfk?c+kSXhVRsk-)d>MC$ zIwWVT;ri_75_2!#TstFI>o8gB*zU^-q1QZ`K6vE~qIHGBEsD19T!#nj%LJ_L(r24W zo55m<{G%)HPee(rjirgP<#Nw&Dy9Tx&A(&Nt5uiRShYK*P1WbRN&PNs5P+Y|M3 zu#;EdKQ-I7Z0AcG7zlgaot$_s(+(Cz18U~_vEC3Z;7T?_?y*pfX?$$qRS&B;Uam!A zpo&QI>~HtstyOAfc0Bijdt8%^Xj!}-0MG0`Bp2E#^mit!x;JYxkB0kPYmZf0JeaCe z7oZ8~YGB-8-@{BWKgTlL)f2dRTZ@%Z`MB5jwuWyS{@q{?c&a|Hp!Zj)9p7?!qWPPj zcO$gw0M_yY(@R_cKQF`?s@&j4^~AJ6=M$A~F?OA~VirAEh%-uHO03lOMO(B4kOzqY z)yDx_7c?64!2%j}k!s0vw%E?0PV|d=nXFvKyW&c}tOB>5l@iBY7B-gN_@U4>*^IYl z^#Y*IXzM~g`q>mcc<=AEp@A+=syBzMk0SiQ!u(O=dl%uy5}$_t03ZG98H)dZ3IU+f zOT~hz|3nBhl){8(SDS{=mLf`cj^L1$8t4dI{EkEFaz35-%G%5?9{>JV(dq1&>9m;W z&dEe>%Ojer~c*4fX+^reDj-4{z|_iGIK8^k;78j$5OkGSC6kbJPb-xOh$kJrtuq%!1r4 z$HL+C;~;Ka9pZu;4eZ#Wmb$dT4PGeIPZUOz%iJSz9`3V@pDTy$s`ijzJ00hX?2LdY zBkC^IUkU$GeBkf)&Ll|qEi)~d?yU23we}t80j~M)R_XK9+CK^OI4QN;TsRzx-1P{J zK1lNAWw1)7Hj~oH2@hZDX`Xy`L1&vg=HZ$tZle+t+n8p#M#T<*)X*s`E>BHXI zs;#~#6k1(HS&Z(^vc0af0SfIM4ovNOXk3szyYNdX9 z8=Ju7b-XzQ)6u?3*>SFzMvnNUe|Q$~3E$DH34r^l1zTm?YBgZriRpm!rS zGt#P4)*qy+i#!H_p#0<=^yrc~d7jEFPtP5y;+OCO+I+`>mcjP2oanSNr>B0a?F}wn zjw=UW&xI2wO3xp8#ZA&AJaPGVkvu+*=Q~}IZHd1SfAsa(#8j@VL1|y=o+q4G7*6X| zqeAU3Gw~2TebJF$oD>kf#hYg0toc{_*4pJ8>}ezhuwd@4ficK=*d%R33Ci~K6Fk$K z#LlpF>Ffgr%v6p(viywjp`2)9!zEo@D<5nEe|P}jB^rPg`aGfb4+1=X+1&e*ol$0w zj|}<(cy!t6z>f20M~Z_+{TNxHrg;KJxYST%Ulo9%mO1K}t4^_e(2tTeI|+MKK?+A* zOF_<5_m;V`l0NrI5y&}EB!q1=6VKE)5589G`vtgW$GXSre(32`k2r3UFd-!A(quiJ z+{L^V5L;(5=1)fg5s}G+jgjELC?#eHa_(1&)t>C?F?a`zL;CdE@Eg}5O1IL5r8G?l zc#4TpH|9KT+@=IpqC25bT}XVX;{nf-3FsY-bGNvD>>C4RdRxq8B$rX^rKlX8AZ$6- z-Q`Rc)h*XZM=`O2`wV|>xA=WY4p8s*>OzA}fX?3vcw4)M*b=T`UZ(p2!Vf%5-^3;J z4z$h^pN8iEAN^}_`5SWJ&q6x??=C=_Rx+M^Xy=gRe7$AJ^)@=H0Dwl%S+IT^fPN*OqKwk<$(FXC0sc1dTMP0KT$2e%8+@siL zrxZb1AXd)`2+h|z(>{AV{G==Zj~stY*x8vIGhB+O9O zcxMmk@tB61wr_%#Jv=0vSgJKEt|GBU9ofTkdr>y?J-x%Kw7Faa z!_C30-)4VIauJxr$}T~`SEmyjctr8GzV(;)23MICyAcmlyt7rug}k!# zNN*xy&}!gN7n@bnUhkf`hm)H<5Pp8fe5Z4O0q^fZv+#LB^RLo5z7+#b@T(XAB2ZZv zw9GOte>(f~2h4-|VfN?KU>;!G`E{%HAHMb% z-<|&diSPPS{~u?o$=B&Wu1^@&b#0DT+Syj@dC!pjdx1Yz}pXy0^vAV-jaZL!%}NkU85$hQe-^ zD8z{1CBGE$o#oUfeY>1fa=mFGzF6xZ#SSnArDYc+XOzfmztFgDphOxZ2Ku(or=F82 zbIEpl2mA)CJ@JUoW$WQk7$cz}=owLtraw}B2pb}jS^;QO1y4;+zAzSO>(^PXs*aJW|# z5BEnbQq4N3)>5@~m{^(4Qs&y=TKBjW+FEA3v5ytIvR_Gg8QK^E@Wc>TZiGUqhntNK z^gNMyK9+>yKnu~>RuO1P)=T6`@!F56zG}OpmB^l01s_m=(>;_hqYi;N;Zs{aS#bHv z#Mh%;I?b3u09s4W8yJe>~8!jt{{&56iv^i89iwj`v$X=aF z`!(;IoCS6Kl8X~eQ%i3%V)~@kMu*Tssm)g zBC+&W2#u7ADvO>q!5oUGAX)KBmUfTDY`PzExz?sKo))3ZqZGK0ieEs+&)k4R+UJ_DEHVEguFjm3{nTqM8H0y2#%TBKu zJMbRsF|iv93`oFil&70TmUVZHamBu}&h+A_W3gMy#{iiN1@6T>v95))K}}7?qCw7u z0*`oB9)t1-^`1D`Nk-k%23k}s;Ava{kNGLRK?WaH|G$GbeyIL`8hC>x{@(y^ter*L zYp=OmQXF@*&1s*G_A~ZT?>q;qd%Uf-V5I&6Z&Y!+(dhy3+ZxoCkG4?(#(r&ly;{}O ztx`%q(nGbXF^*ys=-jV>iIO923VY5tF!-2 z^Z)kyPo+uS-hG+sdAs_*v;Muv-D!N>>4tdvwDn+Cnx4GPfX|*XRy@7L5XHsf`R^ z!LMETLj8&Mg4~vHnxQa_9KT&-fN8)}i;YP>6E9reG(YgD8G@7RC)g%<)F9ZBW=!^3 zGHl2Y&A|B8B7>WBl2Kk||5_d7s?d~X5-bD*E4FaI8Z z#-9p=GUZGP#k{>#Ddz31R{?cdp}YMX2ZqNdOs7>^R;LKO%8Kh={0STYPhjN&vwRx@ zH2>%M;1(~d;!%srX{FJ-&g!@J(M;@Y+e?qE^Y6^^HD*!?bdRTx<|RmOjpffz{kN~; zt*ZayTmO0L?Vm$t{6hSHi|d;m(?048Dm?V-Ukty~^#=W8mangh#gfxWQo{?04tZNT z)GfN?O|Q9Yo0>d51DyI6#)MIKW~A4tYh!igopyA)gKC}VT#96`mVrfcpB&oAyo7Cl z_`goIM3N?Y9NX?B^h>KT+zk+x-$6De6rfr--<<1m%U{kx7*vQ4-6V+XYaZHpvD=gB zCBL@JyRpt-?v*N0ex+a)s6~wFGR zPcqYMvrSG4!^WY~B0)MI>nY1tarC?$dm=S254afQ$1`>cmwNFD2oS1+$d9WR!$60s zk&Blm;Ug^HQPsF|(J}=^(VflEl6^4GLS-h<*%ZU}G$T=3FToJ1Jo~^Z{I=|G)j`k( z_W#pJE!ouhxHNMOSjE~AtsXD1N5_2v?rT)?e*Z>Uf zl|fG+Nf+ZWz)1)%b{eGFZ)zuDuxI%6u^EcarUM>C5H*u3nZ~T-yn2GZgk7b(7teQ- zzh4{>`^M{DUBk|L_98l9YF#WXrATesgDm zSl*_eD&O>(DZ#hk$X1vYz*(dB-7eYPfUR4%8hX2jSf*M>#&eNwoh~UpM;$$8e_v%G zpumUP;a=RY4{*LG)acWa@S^!J)DTC*vu7|~w;)p_ny9+ZxH%*CI|5gW-PN$$FSR{u zpv}(Q^BTgXSbECH>!^{#JrP=0+xzpSCmx;hCIH6IAO)%gmJ_V*T`!k;X6ni`94kjZ zMjzZDxJe9}&{~=Nd31Y*nG4hsYSVekB7$xM%Jjx&26%xtBPAS_!eK?T5bE8%0YMdn15vbNN=f?ay1MRoVK-7l93iKxb(RQ?&if#H={WpWU3q8gEfzzSCC zDYvGGOPaeu+5Wwq_Y#MN-Ois=_^O3Y=&FAd5F~!I54cNq8u^Y0A_oaVrpE<8>#mSh z8|!~GkM^Cv0XB;7yT+&SH^2k>Yti~)PeIxVn|^sBERb~21z90;X~BcxUtsc(uB%b0 zyjiF*{S4K{>{L|ihuQjWf(JBp-Dk9Zj(yzSbQLm@Lw>5U=l5 zg0G% zP&szb^V+emAx-*_^~S}ba>rhAo|VSHl!^5WS-8PUG2kGcQs7%XopxkyjjXu>jyRBLiIHo2i=*>hV)IpImv{UA&xb zQuqE|w|d14TuJi$(HmiMHIdJ^wkFpGeyyq$+ugmy1$KQ8?m;(`b#pf4ZfI(dK@Y=O zCRL!PP^Zy7O_KF6rqBnUDA0K5jKfgwuS`%HG*}I*U%SP}yz50<3a`7BdJ2}3c2FkG z4`N^cpk~nTpA+))s2Sv6rDl9Hdz2m@9 z$^@rEt5z$<%a1aDM`%ZFk>k^BWW+Vr-g=R^d7gk@lI1gI&P?>z7SzA;aYepQRjO~N zwth}YrLYst939B3BENG@AN)wo*v{$B3|)HGmHvox$$t4_-d<@inES^oO@1CNgZ$fR z8SmowUQ3k=iTOEyIiXxKm(3KwQi%|4Y&#XYb9iLxWdIUuGM&DK>n7v#c#+`T#IOxC z^)1%6iC!c!Ls%fwfn0qKOO)Etw8hZjiq-6>rfu0wbF48Q;Zr=*=jc*Y|cr zH^D0{!gjKkq(a24HO5zrJ=|SJS(hJU{gP<57X6lrEwnxQ)H?YIi*RnGVC>jN5|8!H z=b71cRvhn2_z-QhbO<@Yhu+;}C0T zVYci$c_vc>9pM8HQULT2k_po4Jgu8_EzQkt$j`NyP#um{ezeNdPglPu3D9SA;}7b{)j`5} zs=9ZKLAhsdPwn2a#=6CDyX;nS)pM!7!oX!|I zzTtG%NUE6lcIFGkE(+0ekLR`+D7ns_@gy4t!QOmk=)*HB?D*#x+?Xeu!*D#U9h?2p zB<)2Kw)c`+=EC-qS0t*cu$ey%TUBT5w~*$*)>PuKSWVG%CoDhIBr>eFUg^s#vwuYM zgj@}&vzaGC#8LEBa-#(C9Nk(^)L|08#mQGp2R*9f+5QRP`Uo;l+Bc{C+yGaAx}g%L z?Tys-cAuowy~?F8)!V?aB(}Y&v=Y3Q%br@J0lo9t%c;2SUz^)-IQ5jtd=aj%1W@y1 zxC(~y=;7?P@70QR<~dHndZsT-TqWioeDn^-7n!@3zxf`Kt3rs-xjq}02JgpYoET>2 zKIl)UN4!7pGo$FRb@mAM4*~Z|^^dV|n+yeVWE3{~lt; z>;2DWh?Bt|!YnAhzFos#+Ceo_*+lIvp$BM(qwrok)KFW@)DD5(-8Y+{u_snY+nQHb za25r{S2>|(3^UfB*z^G(Dqt1dmAJtm%%cO)1|p}q@@i^1uBc$eb8h1wD+Ya2M>8%u zH%pYR0R;mr9bRCnB_xWL;sr@=_Jga!p{bFXOiAZ8I;`XSM_e^P_lH7hFum!e^Vtxd z9;a$yWe<8_ay?X1QdMkw@#lOF<7c|4?YT|fTT9JkJsP1PDn>EMYa$%Zqq1IJ?m*yY ze$cre4_u8*YFT6V?|;o0(pqFRRqI^E0!uNSw7lV{!!)@*sz_OD{*cD;(99B32a5&Io7Uas)b>P+>7!&d$|I=;dTC01A(<4C z*%iE=$Sv>+w-<0FgFzdHA}?TmJ~v)ITXVbWK!oaR*S~LW)8#ZC*96L{{M7cJR z#Z`OY<35%Xhk5B>?$1|fV;;`&mb7)-p!3)PX{GTkfpGKm!bt@jV2!i=@-f^>Cm7$3 zpT@C4LV9_8F5=mN6@N^lL^lk~CB-at?;#Oj&+It?Y!wm%X%AVq7^2pjrK-^1PUs_C zvHORD+yedw**>kRN=I3sX~VkIaKjwy>1?tQD}!w}U~&w;Pe9ng-H5SDb0`PfVdmoQ2&&1-RMN$zrjm_pw922(AU!1vi{07SXvW>TMCYVbprYBl`Y;+cyhA@Wfg#?o5W{8d>@4@7J}e&47t|0RZEfU z{f%WhJrIpj@$mo72l4HyrTg3CLp|J=G>5c*E@;0qP~J~LlAp&wA^$lB%8zZ)+4`%1 z>bGm%!lSlKNo->)CbWUwUE^}|l<<K0tRS#FZe{$_5@{` zxK!Q6Ha5-79ckuA4zTa>G)Y$N;x1-gNA{rT&-06BTDH-8bqNM6R^r10zs0#dC+{{= z3QAH-t(n!W*h;QiC%%4K6*3go7yQw=bR0{S))Glr#3ZK1%k(hi&rjr#VOKVAbr6Zc z^J&M(E_=(To>SW%rHZF(LGJbUE#kgBpe5s)xwNW!r>bZ6n{}qx?;xzTk)U!jRRP#2 zP@XtWs&v+;Np?Vhj?XGfHB5X1Jjdg#+1aS3y+1{>b*tvkRL7=QgK?O46d3`T-m+c* z31Ogsv;|_IXwS=HN|@zmh4^rFBzFG~b?>>PI?`>6{=X6D9X1GWH>-%QA*p!b`j{e^GDx|`21s7?8yaun=$m}wpo z-yKhjP8%u=AGT^Hp583a#$n&S>RF~s+5JVLB<-%=#<{2-Q*>D**I&LWJ}8=T`VgW! zgL`^t=y11<7SYWbFsTOl?6A6@qMTPkY6&IdTjdQ8StMfh$|^csu5w5-+BcS!BGoH4 zS4D7-o2%AM&4R63ZRHPCs5U%zF#oB)X0NwvGe6tMMs~kYT1q4lSdyX?z9=cSNS{s) zW2GIUm9xd;D37%VHkb;#nQEtYq&hWMq(6p`2XiI(z1?4fQ-6NU57*aC9*F%MhYj{` za@fo#_05ByuJr+8@#Xqvd=Q4(oLFyS>pix7LP1K26`{BqLlsEb&rcSi@D@NUg8S-n zGgkeAQbKjH8nM~ob}|{z;9cxhztgt2xSrDRE!`FtqmQWI#sK8s6)O@8f%kY zZ6VxUj)sNF`Z72Je3hRBLW%rQ+p?WegorsJNsP!;yc;X-()DzjJVgqP)4Wb*6Jzqo z_>e=FfLz#iuL`Y(it;8KIdG-X?%LbqZM@NIH0)hgGsMz{@^*W<@9=3pm*}x+2&hGU z`L936M1%bv6U|qiD~Yc&h!4(Xz@uqpC1XT)KknM(Z`0}0201Z6HlEf z3wO`tSV|U+0(r0JD5EmFKw+wuE#{ZaeqC7mO7Ye`LIzp~!IF++6C+YcnU7Yk_RUJz z{PvQwj1^#t%{oIR%T;Bg-a0|?`U9t~s&7+$Y(7hND*=S=s5`tcK7_dAr4;e$-kiiI zOGhYOI~^OLw>0v_?;P3;D7Q>cDq%KotNdEWzxZmPIKWAY7-{Pxr#lNUTnaT;?x zyHWMQWKauVv7ns{MU=j%=%GP+pWj0*D<5PysyKkCsEx3fjRmdbwsqFJtWIq=`C`Co zX7JD!4U5iQ($D3L(iUoSHn5wA&7D<*&U8mBZV5Dw1_Xbm z&2wwhXdX4jI%bnIQD{Ty!$_UCzHzF_9Fg>SC&&+K(#YVt>6?$aod zvb^drs$M71U4(WFqTleQz9DjhAl+bRCa>;*Y>eG+sGHQYmrVMqp#14>V;oV z3^qhvi=hKo)U(UOEpx!Fu@a=RJ7_6^y4Jvin}u-PN~W9J$atHrXdQfYn3Z{?S(y9E zcx)TIX=KRP_Ew=9tbOVta?UPu0rd(9An~<_D6pQ+q$P|sB ziIf+aYB(R4zft{PZA=7opt+9i&xNA@40FtrJ?d3QDrTSn1TcYDYc;^FwQWq;@~h}0 zH|k-P6tB_?XK?(aDg$f@?YEEZ(4nkaYq2~K*+yGBpMKpCh<&{8=aF@h#bG~34}<-C z^f2EgpHgwQr&NxvUnoHew<7_!ru!saTE$Nj}*lO-!-Uqp-DDj_X5 zLHFtYb&S;1#zLvfRYqWUy^K_M_9HJ793{U9lC4-~qf#l$gP zundW09%R3Z#JGJ=2K;zH5s_w^j~z2bg{I|6A{NJ2>#3zeS8MKY9;aVx`ZO`ZUB{#Y))EQNLh+g!+Ye z@;W}tLHG;gOk6gt4xw#uaEQZv)bK}@tZrW`wX^mWXliYmU{se_XLLc4 zFphPuT4Myfa)(|rd>fTS&n1`_D@zkU7uHmPM1vvawBbrUf(B^v)YnV3VgEyUj`Ho^>;4= z>gOn4uz!u>Ma;edK)!tElud{}e)962EBU;n4zp^g4t@_{`&T3b>P0_%XIVW!AqCMy zk8a=D+^6G9ZM-U+Z%|KJobZXNGY=e_i|i@4%A}lSWFPWFi1j2awi~KkLjwEVaTp+O z6S119g?+OLw&HZ5o7>;J9JSP?xjIV_DGWLCB>|tFV(rwqd+B!}Z$alKy{iQY7{WUH z`;&+|aSl@@SUEJj-ky)CfQ4}`s8T1D3bfh7?M4@6>g28NW}0mzXirs#02&vx@mz(# zv>wEcwVA)QOz5+oP>s9v9Q5C|#m9la zV4vfgXpz@S(BPqp>$x#WZhpNMFJ>1gD|j92pJR5x{y4LXs|?&arN_UBi@O}@f8O5V z#8*h{(aJT>X0qkb8A8eN=_bqJO_i;fI|q-K^LKm!NT|74wx#v3p^vMVVY6a1mWL>~5{-c+70EV206NcszY-8kgM)lsKo7`(;hsT9mbGN(z~SCz`bq?8-a zYBU~*;wq7Y9O+2&oeqi+DULNGpUryvc!uB6?UdFTkBxbzP}q)SyO(P$)saJ35f7b3 zF@LAB8O%c_#d-xupEP4^a!gk05N~M=ST=5cbN;^!E8N{Fhy5I_3-;$}UEa!@mfnkG zH9yLm>>eZ@gnMY$M>MIKBI^wuy6`LGfk;w*(rzOMyUhZU!WUnoH1XBO*~x4c4o?sh zP})2vytf`3kQd|6PFrbI^*md@Gl@jEX0aSlB#o&t?eNe0G%S%FK z%dHMp-Ny>+U=5hPkChHJ>mfld!V7#}VGwZ&ypYL=ojjegcrh|)^+G!ts!Ge*Ytb^j zYP)RiD$qNCBb~j^?uZ^ zp3eRH={k5EeI~r)Q#_d7gE|y(+gV70QCPSiS2Ij+a)zqIoOiGi0Gqu<5I2g(p#fxR z92=D(VPcC-WhX(Pd@>kS_I$5HNO~-?ip}tX-+yMiC#fxyOD`nGMf~mr6bTh7N{r~F zYW~ykn`STGCTiPIT@SZ%i7m4I=6rwIS~y@?zZCb+5w>9eCSl7?n4vH7hF9J@wAeE; zzPl`f55-+TfGmRq_!fl&Wc~hRc|9@)T#INeQI>DFZmZrk=WC*?=BlB%7t2}UOMocH zR<;x3ZG_i4L?Dn0*VptcfXk&sco#71F(Nty7%phkj`;6Vbc;@oR+iajc(YJB_jL8( z^&*ROx@9_%RIn)(8dINfiUv7miz?YYQdcYWai9huQcfnx&A7SloRsT)>bVHJfp5kR z`i%=l&RS4fl;NW?zKpj;dv4h6!2OmRl|p+3O;4i!B&BYkN(VjY%>V%a(`K==I_^Cg zt!9K#b$9IJfm2*h9sKjg!Qn1AFPQt5&WP3IG`rDP{t>#ss~c!r9A%-iy*FTiw=r$_ zXQK_XxX~(KnFV}ZDtJkCn-P*NC^_yD^t7i3TJfJ&{bNy%HZ4x`*G==ga@rT=iyKZ1 z`#H)N>~|<%zVI9-*!&>)Z(T`Z#uS!=>Ol8FM#&SkRH^qvSvotuVY>Mwc2oTzPLKBG3w{+y?>GO z8R~A9+61Mkyqg=AbsZayprC;6j$rU9~RrT@=b3OQ*YcL)X&P`*=05 zB2x}XPY$c?zF8-VIj>VNlG;7V30AAeuX_IWx|s*Y1n~Baq}cV}bEqIs6OB9-t)&*|TIz9_Hy=@1o|7bUaMXfi4J|z9HNP!Fs1KE@^O6rBw*(#TUL3 z6#jd-0$SsZk<XK9jDyp2@9TEUr_`zv3^b_Q5TiToyV$)XJEBoqM-y&M6!EY{<$Yvqlf9Y*nPE8}B z-+7sdP4zOKF{hVhYhW7$=1ePeAWM%ZqYNOY*cY|4~L{~%6BNPuB zP&$;@c)Cy`2AvR9#J%r)-PA7RnUt?1{61=gYfPm$fmkc?mrhA(VnxZE= zoAdTpH!9cOLUZ5Zvdo8LzAb~GO1`+?%>U<|LtT+zRvN31lD zR7;b6WO?EvjGf4%4=tQ-c!KmQ@4M;WoYF7jodJ``b-Djs&Ejv;<|KOg;XxhDhk^#C z8O5Z9 z&1D<7BkB2V1wQZUNCwny1WBJZ`8kgi^098;ICLjWPOiyFo)UWWikR^wE^)kdZ96RZ zfj$IiYmV<(zBLYv1G&aozcspHa@21>`ta+A zNvOG}&-z(4tL5`|%l8ba0$YY_`F_r_{ueoQ3V$|ooU%1#u0)Mg6o1}va0#4THWNSRir^Nu6} zfUV)bvui1}r);ZV&LG&Nq-Om+&NowX zg<`Zbo7Jq%ltS{pYIoS5^{?@)$z&t7@}vX272#Pd4(cs+x|DizFWsaxhus=_h+3RO ze52LL?IPuJ*61Yy+e(>5PGZp;*b(NcUPh9MA@m+En)NgIa=@u$mt$j*?zGBF`xp); zjM_=2D@#GnPysJg-mU!ue4!X)m1}LTryNSq^u|+7jM6h_GoPSI*oT92c2PrOOIfJ0 z-W!MZf-M68_a_z-3paZSBotC+gpQ9?Zyfl2OB{yo&ejfNn}>FjABUEZzZu%K!FkdK z^q$Br=GnxYd2)>Hi5}8ZTl9?Wlw)^f6U_90C3qj~Cd!9xWshBESgmCevCHWOLGGrV z$A?B>Iw|xH+{iP&wGjc2CB3T}ySA^;6TQ70Vh13P7uV(GZnQ(Coo%(QL5iye%5rE1 ze&}#;vHe?u4qeXCK#DDRwVAZvu7%2cU+`R5YMb&QQvCcoJv5M<}L%&Ly6JE zB}d{A4I9naIwqXjQ15K+CGISF>e_kDTyv{y2rn7bqD5vzP7h?^Jl8Ij?P6uaNv~Ej z^Q(X1?RzLlhoMr;8s|@Y$F5Z5=&4R)qilA!MGL#knibGXFxd|ddyYW2>()}^&zIy* z2@7rB@?5!1n}Rs`I$hjk6uYzC$D4;PkRf&Xp?%hd_pmqEt89;lVm+Yh3Xajx$VSWq z3yW>F%Z0C6beQZ<=x1>tEm9A0Oc}ZSGe7KgXMd{cF5QK&iej zdi=j~%n^AQYkxWBhzYz&9Q39b*c@YpfRK^P3N#DQ#7F>*C`@;q4h8*mi}pBQQZYosCadVphKlLZNiy3>LNtRqRdw_A;ps0F)un^ZIiA zyp9!b@@4TWnaYJps@zUJ#bG*i7>5EVS%YG91nnl_a!eqjOgUKa}H zi$tfJrTu0emnw;)oF3SDLdY?TKp!4bZeA*-iD?_WG(2Se0Q z<}!uYHsuekEhWQTI=DJPs&;{!mumb(TnySLd2lFEbpVX%q8;d;okTiieX(Ps-)yG` zzSv_sy-})TKgXSf{VDFGgZ4qBT&(SK(2M?c%Dt>%u~r*;2P5oXy@PV9OC)fQO_+6k zCK#d0k|=GE!cZJuOU(2d(&_Ok38&niU+)h}^+AF3Y>4!Ke9Fu5B_ME(Qt|VDbIQLg zbR2&>)(Wy;sFtIvMmh`RhxxOy*J)?D&iMO%CnJ@@c5~sh{q;Ugk(9BSLd0Z! zHVPq9C;ilTb{X|(Vu)#WxZ6gJV^Aw8>APCwMl)-bsEVZ-UTY*yQPYD~4n@1v_qCT} z@S|6xUSA_rMwnU>6y%^)|GhZxtule}3JJ$0zc{N;r?D`Aar)1*s#MhW<;Jw((c&qi zcF|``XoL1Tyut%7m&eqkAV5m^P7YD7lUV(_ zPxib0LGC7tfTMaTT4Kb`A6on%uqIbYlxvlHss!&FJJgc$Wfm}^opZ4z*$6|W(NbJNb1f#k&aw}9 zKMvzq%CpS2_c$0h88CO3!({JR;EEchjw~Ok1J*;pTS&3pus~6Pd?99xlHIK`OHE0` z@pMYUH>&B&&7lCy)n$PEoSXA!2%bJrV1jXcl3K5{&ye5arYp_CC5+z7+^*-1+mff8 zFOA}|L$r^Vh_4Kg+W;JtCW1JX3I4fse=^}K%pxcx5GvQJs*d-)Z`R_O4tPuV{~Uu8 z_CH{7`frf?CLa-l$zNTL3`Hgz{1v!R_%k-_E44(SL#*0SW--rRoKJ`-Jm}+>+p9kU zRXowIu+V&($Oan`=se1Jf4_S{BYk!P+@4tw?t3v5Eqw!x^dvpPQFnm#=SYvR-y=P8 zS>>b0eI1AF^A&pVzV2(V%B{e(`G7{@?LyF+%k_q)6N83acoeibIeVaslF*_w+46-4 z8LK=WQFh&c=npxMHd;fbv5hAHur|e%ut9B73z=6#=uUf1!h^<-LE5pHT~N6k4L)RgR4FJ7w0y^mQmCTN>)^3!rVTRiTw zg>)}EDI&aB^F;-!FPTALSjlXCt57j8nq}K}t-MbrYS5uT*VJ$%COXROaBVJ$!MU9( z`T(BRa-#97H<##_nyU_89F;a}fYq1ESfdrn6G1FrlegsXaPSUB0bkR9(U*f0K7efQ zOt3_?b(@^G7nUSWiTyovObmkU<%k}~2M|;Qj5#~Ph)B7#vTtR*yvqr*5)%-$-Kq}w zKAA&MBGf@_e;ecFg+Cu|ZkB{HStmo2vt1gC5at~Q;<`hRt(+RFMUH*sAS*r6*AqPH zd@ZJ;>RAbT3wQ$=R6AD&^3sSm81k^YVZf{Jfm%R;mXg)kkw@I*j#Pz03;OPpjRlnV zPtTa8wc^*_@tY#fC!-YgmizfRMk(x%GfMS?@OgX^Gt3kWehvjaPM(83-{DrG#O8#% zFF#pY%wkNJ8{uvs1FiX?X0b9Ud9;i_vc(P45a|;b02*nA^f6+x>yy)|g!9wI0Ewo` zE9)(%a|mDKFw?etcOY}7)UH?w8{Y7Mg0^a7w%QfT~88X2WzJVf_% zEI*1_)uQGZ^|MqVaUOWp{xVf+LdC++Rj4(BBDRyt-07Op+ATm$Zez-k(r-yt2f>rij_g%zoYgHOK zNa0AX_XqEi$|YhaF2bd)qt{7Jtz0dB)_{Q0?;Vtuwx_3NyLZuyC6~88*z1!;wQ0+9 zyRQe)RT^_P`Ll0v&EsQhfm(+cIvIHC^Q(8RGk{G;=!1y0uccz!w)mtX8doU%1vx{Gms972wW&^pG3B4NmmQOMcj zQAd`+gIoxk>QEK!f#j3#10eM|W!gu&uR6(O81E#powcK&8jAyngqw+MYUjdy(XLoj zds82F;!Uvv!KzbS<*K3PQOY9iPR?g^a+MrkuZs@9Ta0nK!a_+>8QT@7NI0V;1BZj8 z-bc{fzm_slQ;}t8=5mthV7rSA7RKaQt`70p;n%jplfjDtmiL$4_Hztg*dJl=N+f5+ zNTifljbBX{&D9R^3tl*`SxV31_k}Hr)lr8t^@xv&HyV#CY6q-*GSuN05MN<_>Q`Ck zHbXKijax(D2o6YK6xfrFPi#+mh0IECXLiAA)Z9mlk#cR7Q$7efGIJ(dm_oa4cixKl ziex5zS6b;we+tJn;#`5*p~MY_&}SCAr{u0Zv$>x}5}wokZ~+Y}>b{tu%SWk9b@?c zUUt1fwOXC-zu7upCO^Tt%LRXqGz|Omq+xGWW%?5|D+uLbr$KX`ViV{5t{-WROErIR zU}=O%G<)abB3oI+0`nNDL#I8Igm!BSdNa(EuUFZU3=LSOY5E761Hbl@SI zfZ9{7jM4BovgZN}k}28zv8|YBOg=<=c_yUA^AN$_g|maS+UDYxdGp55Qo)gl;gyT6 zzM=j4T$0biGB@1S&(VHie}?ueAB1f7EIUfR^oy7&G?_r*(bN?JYLEOx1G;rony3A3 zCJkX5UmfWk7l(KtY-d?_4QTX<*3;(+QdCEyB7cgKM1KeTRVD!?ibvI=cOjAT_* zB;k?c(Ak+^NC$svUB4$9_Oh>*=6rY5oYlx-r-)<(aOSg}nO~pf7XcXbdc3ZIpCbUn{xt%yZyP`U4jS5|vYp(1SO^`x7cK0Zmu0*=f+CD3 zPK@PcTGCq6mRNa7^|EblKA{5&rqzw=*>}RcLu58Pu%p6}Bc>A? zX3;pe>JoiqwN9o!StN$X;;1z%otIK9=QHao@-CFgChARfmpGZ}ZFW@8FFKOKNrw#@ zS*E~8@F$pKd5%|WM>+2yhnMkg15`C+KC-)9>Jxo480&ccI0;^TVbPe@vnMjvqZ-=5 zkIjulqHMu_gPxFkPzJX;*J{|4&T7q$_2||Jc zER0{yq9=t-3)^5T6Eb=^D-MiM$yI(q>us-`-yAokIi9k_>r9=kv*ZWE!_YH^)}S|C z(ArHegGN@zm=qJNd{h7b;sb-GX_pfCxj6Q}#s?-Cva!@8Lti^G@& z#-To!J#DYR^HZ^zZm9*>0LN%CcdG7X&#|$!d%kYU8(fceRRki))@3=4*C#U~z8Qz9 zV@;`P+92zzB6|DE-My2%x(C>Xq}KB0_JXjBQ~9vd*gF1VWfP@MZzN&kjQ9@v^Dgq!{fy_MWyh*wGUhu!fzy`+V7$!~|vF|on(smkD+ zn9s+nJ&Zi;4MOYZsKT&+kt(e4Kd3*iIE#_UT&s~?d{oKCVh1T^&^Huv)JN0Q^)53h zC+b2TdJEEl`sftvN=F!stKLcD&P>A)=O`pw z(eM^eYb7lbY^BF~eV^l(S~^ET@#G|BMk@`R+4&WmHKtgf)eh)oyALKp^hh zJ?O46L5V6-yL}6e0#n~N^r4^2_>u5-(}!X|NAZRI4#n52Bm5Ulq)k1ZzMql5f{E=x z#Hc!E>C<8e^1(FgaT0;FQi~;}Zf02Dr)S%EEPND$;6B(8G_o~CD))zN#`-@>coQpQ zUxrLZ0WzyZ*yB{bVO#rr@yAl&fQtPx4ghHJr=TEnw?#IZ2n{zR=5G$xj-4itDNMYV$#sHtV>7nJ} zc~LNOm_|OleIOF8dJpFtcigqEQ64H;&F+-P&e%PqpskFSCr*k}lLf+i>}SgfO3xIx z_ipOsjHz7Z%9_h^tsx zfw#X)qt4|Kci@my)#RC5*_9k%Sp8%L?=BEBHwuMnFi05Sd z{ZO)WI$hC~Uxh9uK6fdSPUq$fr8QDot|RF(9ZNUh{D%x(AR~O8ZXWjj@oZvuW1GSX zMHa*1ttms{a_81ath)W;&EUi=OMC-Q{$dP+ZXMU6{hZzO#~H)^q8FMKM0qc<{JReT zte+jq-=VK5-nST^=IMxUJK%6UBbUN{xu0T>F@g@S4YMG()aS+$`y3WpYsOs9BHc*BYLN-`bZXsc>HE z%{6ns+15%qi%uTey5TqK4g5~4=~UJ0$J3>8GvEtjT)Y;VI}l|mLM(yyl{Q7~xE>Fz z^(YjNNb7j9bT6{1q0rw`W5b? znVZ|XKF1oT(a37owSF$h)Uod3o5TH8WAMfphW{L6*aNWy{V(yqc>cfs*Y$QWmJXCJ z<9%jE_-0HCz)34Y>c6Wo`0H^06KXA;pdR%epJ_f$IcEo}U3PPnJ3e(zOe*tKbKI5! znfNxW33o3)`ptR|!${WVBeQ7FO1^r`^Xqus=gWRr+?*?3hyNT482)dufc^TIE_&S~ z;d8s{Q=ujj;#rSdwdS6%8q5}4^$-+$*VW%L0Bza1X)e5bW zP*{4JNBCkg$fns+`PLaGbM!g;AwnjUvV{2u|`QbJWa}x0Ph4p+S2->!w=% zZ^)ZJSL3li2&fEys&O3sF>4L~T~e-(yElx;lVfDw*r|Vo-BUF-ocubTWO79WGEu++}ax`P4rd z>7sMeiNiXU_H>y;KZsp+fU~mh&1%s&-UwGsxcP81ysm{!LTpxMn5Pzs*1CIcfyS*= zl8qZ98bxy4>Y|U7RB|P47)Fj}jm{*Q++GT&Rrnf@fsNerP0cZx15(zGVwZe!0m5H+ z_>4;Ff+LBQ%Bng_pBH2HHc~prvrPIS72|~;VWMUdO?x406J@%ii>m3(+Q2tRP3Pf# z_#{Qrz#j`0dXryXo}a7oaXQ^}n~x%~AM&N}KSG)HkJHI7l99#N>CAI%Br-|cVtfBwOd1RvZJx=N8`#x6S4e0FQ z+WyoE{CUEszo3PCDS3-}u75LgDYJ9%7PrFK8!tojHiOY?Qe*?0b&O@kg^1O!M>9C; z*+IK6GvyVbxxl-f!MG%3Tbm+Ri`e4D3eOi}Qn)Hbokd&wtW#-9>aKzc(Z{-s;iezTg6(JBr7>iRb%rzIf6ud4ZBo2;Zn0^#36iM3ZY?RvNr5V zBPAUiJ*jRRn?nx58!MY@Pv^uCYHG5H{{GNPhVtvdHeSCFxm2*n2=feH%KGV}KGwVl zzTd@T;z-60OuTiBW(L1L${)-2*hnOpzAu&kb97GlAE9%?soLZmpY_(*E58j{e^-R6 z)i}21ky~8aZI)4DQk`K;p}S0A=LQ`S_(H6d$n^V>%sRpGTyS*FJR(&80c&|+9GFm?B$K)Pn)u`Moj;GW3$GpjIm#ydU!!dL#c}r7O^HG*HC$*8uS~Ap0AiI&zQx$r z%x)j=X@^wwsCZLyqXMDdNs6Y0VfaE8LWf#K$yFTO?u|?ga@Ur*Eay*ZtA^fchfN+) z*tt)Qi4cHpUHAK1FHkd+IRHSx7c4_Qc&_u#aZsU{nROpPH|Sl<<#5b9$W^_`#Cj8& zK`Bbl#%kex2})7Cu~P`^)V(2N1EF6CPC-aG(C)F;DCCVpDN3H}Cp(^vN_$dqp|%!1 z)0OO*P(*M>RYj$G)>UkE9Wh(rS;jA`5cGir&OKH-HwI@bk`e*VCFa#cORZ?%l%jkt z$>*)>Dn)^Q&7afxk0jM^yR3Zfl#0))bM$dkp&&gSI;63$TQ_%wTyfi@crxS`(82xw zO(d?#zmpPrGOzVaHB-B4;IE8*)w!YV@o!Y*S1Rri&UdNEpR;!UHCCQqrj@}eZeG>D zLQ3saSO{k*r{~`-R(rCuWK%Kz5YW$i2~1k8QXQVgS@aO7HzolkUpVjUL2J=R$A$JX zz2D8-e!V4hD!HV5x_nDQf4YX(bBR^ievvvw7dl$l+&DXDY;C9 zdq>&$fbquwqNr&Xc5O>>yo z&L7KYVl|OBNYGhnMIDVcBag=MgLvH4^UXUtp~<*ZALVWKTl6vfV?91krhA9{90d>l zdlWo>MT&n_7}C*q2;|ds9%?T?3qx|bTj0|k4hOS9xAA9yf2p&lak65pCd{Ugk_*It zeKwzDIgk9#>uf?F<4@Va{{ym||1OO8|I=0>{K+`;)+&VKKNqn1J;s@jRv~nJhQuX; zT=h}qFFP{pxfUQ`!!)d~wuv_18r=ZPyd&dc$*){DtcPA`nWR9*AfB3v<(D_o&v^nz zl)YPh@FtYVV&Uzis&R)%P-Q-23)N1)+NApCJ|eG2=c^a(43GFOhxv;GLzPnIyd6(F zqT@SsTH})gdRCY&!zr&mlZrcm0vJapF9d9JpAslfyR(-U*Lu2EeKv$ILK+l+_(8K1`zXTwnTZZhi1EMlRS>Z7+*Qfu23Oe z&YF5{oM@`!P4eLN`=&niq}H7lv*AMFW;0k32gz=_lO`sYYV0`NkUTT!R6AO|n!aDg zjRLsKCgLZ$myRQajcG~UOt1Gmam12bxZ#=85oUBtA+x!lH7|i+7YX~)q6DOi>vXSF z-#3$-j{y4`xr`d~V$?Sm7YA-!8%usExY%DxMgKm;UD;CWE|I}Tk@yCF5C2%?51$ke zUR~Sn=M1jjp~2zv$m|0#>g>s;^Ph-O^ZL@SHL3_jcy_LMYXQYD8ab=-fR4pi8MWpeZ_7T9 zx6YT*Dj>5d_em_v(5DD#Sd+z^Z`YRROB?Ogl8qI#+Ta^QsfUTsOe&pGC&DFS*Wg*@dUhWdb*VQ{*v6FNOLn9k?e;p=ENmg8rP*STM7r zE)p=gpc4xwf=WCU=q|*j(I^~pTj!p#PW&mQX8Yb!Y&1>a+ul4ooiA<2QwS-;BZMeU zb4m)gn4{i3j6&%Q8uLf4g|fqmEug0_%0+Zd`uJ6IE-PnmgIFlxV@gg2_oz32uP@5U zJXB{nWVeXU32nD&&D-VR=tQh3057Sw>erxgo2rFiwtDnOX|-eFhib$SC-F2k^Vs`b z=-gc+HvpBhH-QBrO=|~zanf&c6>|c#*gqldv&i%D$+$O;OxcQHZb@^(Yv+8h6YgeB z>cd7RVs5P@fbJs#z&!9UcAyG0EDIbI(8H+gw{p3r=F|7a(VMbLig3mZ69tM`?vB8`AFH)^eF zJ*Qx2$L-j|IZB84N=3AKt`sQf&gHW+J2%|QR zjCV70LfAw!a86n`PgWn%$2nZ<`cb-=vFQ^gV85cl_t* zd+`4Oeb2vc=A&!>H69N8QFCO?u4SArX9F&8pNP7GNo)D>r^5Z}T{7Yt z+FB+vE(#C{fL&ct{!`vEA#mWTpbr~f<}EVPJ%=>IS2Xm7k-k~OlKVlf+pgr*mO)-rzOR>o`emJN zKq^(;IJ-zotWBIz*v&%TCdPkFP@!3 z`Z5dfP)jLD7R4KJq1ed=sirtRH81m>)rp?3ESbZG4OTzS>ndKCH2YdD6{UF1SF)RS z?jE3>v9ASSeT!@y_;RQ^G7n7FN2JiL6eg=m$ePzD6)%8GQ>o*eI^euP)SAR`aYthr z50F|Oi1~7db%Sf@UGn0hFRqG&{n)k3e=a`v zOKzM(u^O*ok>IP|F}Mu+paQ9=%;I({-`OZN>4q*fwFcP^ zW#58b-t;Q!Xb}N|?(wA|vbX*^lHJ#Bb6{lB3B6GrYO~H|G|JU!KX1&UZM}$L0&ob(mBQwB{4MlicDSC|5I^Wpc-# zXPnIlIj(&Q@K7Dpnq+V`olVzK)Iw1|DNLF12%D`E&amz$Mwi;4uJ#u9_QCcivQEOM z`_3z(zAtUCeS3O8ZZHVt#J!u`aX}4LFXJhbsVcJPQBPIwd$Yo|7gcJf)nHk#serEL zRTe~mVuJU%Krr4*c0BV93N~;khNk>w=E3Tnpyijf@=Qq^*p|fUK;3KVq+|xPm-k|(lg7jlYJq#HNaQIz&{O7`z ze~>0f&E0o!SJHq!&n?%{;kKk}il(Y(FB53blNsN>w(Zx|Q01Jr!6!aka~QTkYGaW& zSXhW&q~}aq%MRg-dY7O>kL19soc)X1P-V0!mrBbAE~lR#Q9amPHcpo-mT-ttg#gHFs_YpRD^F+v>i$eaAQs_U|m_ctD z2g@rvu9Xobf0A(eFz{xhGH451xiE5e-n_&j&IeT$o=X2AXzXBKnc{`x3F3>+3S?0}kXVf-J*x z6pKE*{HF-c_)GNBt@#u|3CK%CJaojDh=WyqiKs^_!&3w`Z7^xtEe-ALV&p zqcGI{eL3#YT>6rMy83z~gMN@Fy=1N>V^HF417o0WU*o7pnD#mD!Lk05F^@FAOZHk& z27Oy=3~xO~rXkE-{V?4vW~C4)T0OGZ2}U0gEP`vK|Do9ylP;0;~l2x#I@2_46GF*aNR|jQi-o5qoVU z28b8k<49o0dX6K|hvD^nCJEimFWE;=!Ba-T{(i}bx4BU6Z$?mWa{=66*EsrZE{_BM zdM5ie7uuyz7|^@!d4hg^HWvnJ&0jL=(V_5sKL&Q|OGZCntY0#? z4_-3%k>q^IT!)qc{p&iJfI#Ki*VIQ#`Ewi#C*b)^ig;jGzGSc?U$Tcu?2-ZG`b);R zl^@2s*NzOnTn!z=WerZ&Oe(XAz%)Pd7iMnKP7+q^b zGwyQ>y+E!#0XK~6OvA}>eHR9O&=`EZ1JtLu)(^J4ONZc?`~BeO-es%L^}8x*dwx4GbM-NVAv+~Xh~{(L4&yv+r7uLJw0KOwX3dIy$% zn+pLu`SncpZ7u}VSv_U&soirS+`q?RZ*w6a>H8W-xb+#tmtAYbQEq+qp}}6`Xt&;l z=$LB{a!|?Z`Yt3;!hMZnQMg##GM9c~(KkyAr(8PuVGFpdCY*BVL0F8x z$hWy*P?`FY(Qk9XT$U$GGH-Kv@bSFHaqjOzJV3{uG75W}3+~dNph4c|g1f&bm`m<= z$6dOBg)6`V%QZSTV2aD7iO72VII-0#P{?Oozczc6omm!MpFmu24e zEYyUFjP4zIPed9nQi+ zxW5bIvd`e`zpWAL@=96ueebfM!JhNv-uLd~#(T-$_b%%`f86`tW!>kGd*8c2SK)f* z``+c;cL(>rcR827=Fs=O`}p!-^W@OCy-T7ldk{Pe_je&t@UmXx-u5nu0=L3T_O^FP z)O8*>^lk5gf%Mw*K;hJ&JJKVB|yFykyh^_W8MANY{PDQOu(h;w5wWV;uNLZkbzO zbKoDn$zYd1e-HelH<>HC#evi64wq3bTZ*Hp2PNKfF0?C_#?cJi7A~19{=(7h1F`ru z&b_t_`lu#&$z1ml2O$=htxrN+<@FBmS>9w|!9U-Rq1`qnd}{YN#%*Jg;P1M|aj+v_ zb75R|2-sYYX4U6B8P^@hfzkIi7nhI6vE-W`WL@?($I@@QhlK{}=R2@(u`UvR!X@L} z_5=xT)=LHo&2?9iENG(VGdVy|b-e@Y*5z7EO?PS5iPGB_-+_k$ql^SgkIanFT%+!lX* z7mz)^#B*(_M?~oLSN_h5m$Jd3-+?vK}NsL z#T63(*<+<&^Tb|z0=y&mMYrs=4j_Avb7QZw39?6O;q}bNiF>{~{wX7UoDZJ)ws*ns zaF2W2yI{7u-U03omtLYc(6rCFfZOQ$JsN$*!y({EyE89f-Mik8dYtg*w+3_9^?Ni5 zx6@0;yb>Rec#=EjK{H?pkPm(s_~)=c=*Qjs9QoJZ2)9M>*WVuJ_V51=0`Y(U8w=sj zfBwxKmH2!fn5F-C9w_>MJP%A4*VpWSnl!8f14j%0e>I+2w1po;E(6Q-`qFh zUw>mEM)3YT3@pgM&kw`k;QsyJ!3lL~`_Jb=f#NUz24~`LzX2!eAJ2nr@Q<-@RodKIcp@?uhi~-$?AAa|T<}WtIN*?;dym-{wMsEBlYX zasSwV@JZcP(&zIaT=kFVQKZ{a{``0UZ(HZC8^;ku(J$D4V4|4Zoi{)*vJE)0VTXnT zQd$B61PdSp2mX4WnpsLc_Y5;#^-OnHSJ&fK?Jmw+bBtvNV=d#(Qr@1Oh)H7Hbg>Mk zOB;!9&rahJ*0Mm`IH)1bF<)8+>NbwBC)YAhZ4|MMBcqc(Kh*FuWH1%aZ8(>Y#8ZM>Kfk$(AJ8#apgzzePz>y6<5e3?YxLo`+!^0 zv)$QiCRIp#MOSef`ETokxzZf{uKITy2i1}5L!_Ex!0O~U=-SlX3qeVqFPP5vGLkmt z`^Mt5N>t4mVgDtUaq@X^6|}zT+-4!$ey3el_KsQhbA3N`Eu~q@yna_&V76;eq_S(5 zWyc=yjx(RvqC}W;5GHG0>e1;JAYNN9xxTN+*pxkLb%g0W@bRAGTsdTI_lFG7s^L#r>C8T6BLqe)BZ#2H(5aR@Aojjh8mNzG1%8u&ZrV`!>$85Ak_h(c8vN zo$gEr!I$;`tbT>O{(i`XxJkM}bxhBav`fxxS8^tm^0>Z@F4r}aueTBWJEpZj!6}9V zYuTag+4F<^M^B29Yw1ZNQV)uD%d;f3@EioRDL<&GBTT* z0VO1l+c6y5`UuhWEJca5?Syc$v0$?IB>g_idB+rQ^UgT9(A@!7D_I@n)5AeNJrI^? zzl(DwD*low=0$o%=BGFtOmQ}Ri|jL)>@&@mS|3=;eywtW{7_y7rr3h+1l?&c<=taP zq#bewQ?5G_NaUH1nCv_w%&uiXER}bLtVekxnDRzWTs{xXGJt8)928%)H+ZJhp%KBP zO=NY_H86245dDfbz;qWzs=KLwU_M{`Lf$ueZj{H5O?L(jmkem&(EUKubU$#Rk~4IKrV(26auxCp&b{p}nCvbenUKu}Q{FwZUCqJqYHwrpXYKVA zhFkV@hFeNoGUI0QF3k9V157dXJke&G^WrPgmr($f-Ke5y>LlrcI8ZRf=rdO}@4`&m zh-5(fi*$T}9F8@UvTGdJ!8kUjXQ#IFV!gju1D!dTY%yJf(p|br#PL9->CS*Dhs9kg zFM}adj1CK;Gg?SLQpcgLEth_)q4ecz!IZ~SF}M6EWJ`XO__Pli9VGjDVak5r z8CH5qVj%xpSo(nKL`^$XSlS^HY}kzbyoIHo0b7!LEi7XntoV@JTw&?E!H{as%L?O+ zppdJNZf7S8OFK!1jT6Xmy<$B)N_|Ep-bX!KYrzd_UJ^Y$JN9{Q9iAd{Sg_rvDYmmj z$0d7Ao#rLb(Y(<7TJtP_)IC5gNv3n3u`;y$`i17=mv3#_CaY(`{2_snwO6mNY0dI(;id{LEbHx49~%}44X}%Lvd_jY1<)R#E%!2 zJ{e4Y3ru+m6{YIk-OCD0cc0rUTLR{J*>1`TrdjucPNaeny94DVA5woGu?#>*HZsTXEOh#Lxe0g*FqnK zWJS!MIu5fW8w)0%jA_dFs=Lr>nRkKmrR74h=5f0Y+;4BspTAt+PLGeL`#(SbcfBK> zcsSkv`p@gvyRuDu)BoxIkFQ_9-BJH$59_~wf4lyBcc$O0LShF0^w;A&eB_p0K3yNK z^TW%>`Stm-ywbecUr{H@dryxqT+HkAdhM>y*8zhz4bRVTOP{7s50#p{JpFxodg52` Yp5MN$AGL?ioFQ^fA3ps2+b^g80VKzxs{jB1 literal 0 HcmV?d00001 diff --git a/SPECS-EXTENDED/ogdi/ogdi.signatures.json b/SPECS-EXTENDED/ogdi/ogdi.signatures.json new file mode 100644 index 00000000000..c39b219b34f --- /dev/null +++ b/SPECS-EXTENDED/ogdi/ogdi.signatures.json @@ -0,0 +1,6 @@ +{ + "Signatures": { + "ogdi-4.1.0.tar.gz": "e69ba86f32fa0c91564e128dd8352f8f4280fefd9b820c8e4db1a5b03bf22ef1", + "ogdi.pdf": "fbfcfaf7aebd713051c2a9ab500a273e9a11c882e0f1b4bf3ea8a5525cf7f2a9" + } +} \ No newline at end of file diff --git a/SPECS-EXTENDED/ogdi/ogdi.spec b/SPECS-EXTENDED/ogdi/ogdi.spec new file mode 100644 index 00000000000..6cd0f0fa6cb --- /dev/null +++ b/SPECS-EXTENDED/ogdi/ogdi.spec @@ -0,0 +1,199 @@ +Summary: Open Geographic Datastore Interface +Name: ogdi +Version: 4.1.0 +Release: 9%{?dist} +License: BSD +Vendor: Microsoft Corporation +Distribution: Mariner +URL: https://ogdi.sourceforge.net/ +# new project location is https://github.com/libogdi/ogdi +Source0: https://github.com/libogdi/ogdi/archive/%{name}_4_1_0.tar.gz#/%{name}-%{version}.tar.gz +Source1: https://ogdi.sourceforge.net/ogdi.pdf +# https://bugzilla.redhat.com/show_bug.cgi?id=1470896 +Patch0: ogdi-%{version}-sailer.patch +BuildRequires: expat-devel +BuildRequires: gcc +BuildRequires: libtirpc-devel +BuildRequires: make +BuildRequires: tcl-devel +BuildRequires: unixODBC-devel +BuildRequires: zlib-devel + +%description +OGDI is the Open Geographic Datastore Interface. OGDI is an +application programming interface (API) that uses a standardized +access methods to work in conjunction with GIS software packages (the +application) and various geospatial data products. OGDI uses a +client/server architecture to facilitate the dissemination of +geospatial data products over any TCP/IP network, and a +driver-oriented approach to facilitate access to several geospatial +data products/formats. + +%package devel +Summary: OGDI header files and documentation +Requires: %{name} = %{version}-%{release} +Requires: expat-devel +Requires: pkgconfig +Requires: zlib-devel + +%description devel +OGDI header files and developer's documentation. + +%package odbc +Summary: ODBC driver for OGDI +Requires: %{name} = %{version}-%{release} + +%description odbc +ODBC driver for OGDI. + +%package tcl +Summary: TCL wrapper for OGDI +Requires: %{name} = %{version}-%{release} + +%description tcl +TCL wrapper for OGDI. + +%prep +%autosetup -p1 -n %{name}-%{version} + +# include documentation +cp -p %{SOURCE1} . + + +%build +TOPDIR=`pwd`; TARGET=Linux; export TOPDIR TARGET +INST_LIB=%{_libdir}/;export INST_LIB +export CFG=debug # for -g + +# removal of -D_FORTIFY_SOURCE from preprocessor flags seems not needed any more +# ogdits-3.1 test suite produces same result with and without the flag +export CFLAGS="%{optflags} -DDONT_TD_VOID -DUSE_TERMIO" +%configure \ + --with-binconfigs \ + --with-expat \ + --with-zlib + +# WARNING !!! +# using %{?_smp_mflags} may break build +make + +# build tcl interface +make -C ogdi/tcl_interface \ + TCL_LINKLIB="-ltcl" + +# build contributions +make -C contrib/gdal + +# build odbc drivers +make -C ogdi/attr_driver/odbc \ + ODBC_LINKLIB="-lodbc" + +%install +# export env +TOPDIR=`pwd`; TARGET=Linux; export TOPDIR TARGET + +make install \ + INST_INCLUDE=%{buildroot}%{_includedir}/%{name} \ + INST_LIB=%{buildroot}%{_libdir} \ + INST_BIN=%{buildroot}%{_bindir} + +# install plugins olso +make install -C ogdi/tcl_interface \ + INST_LIB=%{buildroot}%{_libdir} +make install -C contrib/gdal \ + INST_LIB=%{buildroot}%{_libdir} +make install -C ogdi/attr_driver/odbc \ + INST_LIB=%{buildroot}%{_libdir} + +# remove example binary +rm %{buildroot}%{_bindir}/example? + +# we have multilib ogdi-config +%if "%{_lib}" == "lib" +%global cpuarch 32 +%else +%global cpuarch 64 +%endif + +# fix file(s) for multilib issue +touch -r ogdi-config.in ogdi-config + +# install pkgconfig file and ogdi-config +mkdir -p %{buildroot}%{_libdir}/pkgconfig +install -p -m 644 ogdi.pc %{buildroot}%{_libdir}/pkgconfig/ +install -p -m 755 ogdi-config %{buildroot}%{_bindir}/ogdi-config-%{cpuarch} +# ogdi-config wrapper for multiarch +cat > %{buildroot}%{_bindir}/%{name}-config < - 4.1.0-9 +- Initial CBL-Mariner import from Fedora 37 (license: MIT). +- License verified + +* Fri Jul 22 2022 Fedora Release Engineering - 4.1.0-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Thu Jan 20 2022 Fedora Release Engineering - 4.1.0-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Thu Jul 22 2021 Fedora Release Engineering - 4.1.0-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Tue Jan 26 2021 Fedora Release Engineering - 4.1.0-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Tue Jul 28 2020 Fedora Release Engineering - 4.1.0-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Wed Jan 29 2020 Fedora Release Engineering - 4.1.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Tue Sep 10 2019 Devrim Gündüz - 4.1.0-2 +- Remove PROJ dependency. The new OGDI does not use it. + +* Tue Sep 3 2019 Devrim Gündüz - 4.1.0-1 +- Initial packaging for EPEL 8 +- Update to 4.1.0 diff --git a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md index 766f53d29b9..c8b51aa4834 100644 --- a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md +++ b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md @@ -5,7 +5,7 @@ The CBL-Mariner SPEC files originated from a variety of sources with varying lic | CentOS | [MIT](https://www.centos.org/legal/#licensing-policy) | crash-ptdump-command
delve
fstrm
nodejs-nodemon
rhnlib
rt-setup
rt-tests
rtctl
tuned | | Ceph source | [LGPL2.1](https://github.com/ceph/ceph/blob/master/COPYING-LGPL2.1) | ceph | | Debian | [MIT](https://opensource.org/licenses/MIT) | prometheus-process-exporter | -| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cfitsio
cgdcbxd
chan
CharLS
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | +| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cfitsio
cgdcbxd
chan
CharLS
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
ogdi
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | | Fedora (Copyright Remi Collet) | [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/legalcode) | libmemcached-awesome
librabbitmq | | Fedora (ISC) | [ISC License](https://github.com/sarugaku/resolvelib/blob/main/LICENSE) | python-resolvelib | | Magnus Edenhill Open Source | [Magnus Edenhill Open Source BSD License](https://github.com/jemalloc/jemalloc/blob/dev/COPYING) | librdkafka | diff --git a/SPECS/LICENSES-AND-NOTICES/data/licenses.json b/SPECS/LICENSES-AND-NOTICES/data/licenses.json index 157dbaa92f5..adf3c2a978e 100644 --- a/SPECS/LICENSES-AND-NOTICES/data/licenses.json +++ b/SPECS/LICENSES-AND-NOTICES/data/licenses.json @@ -1010,6 +1010,7 @@ "ocaml-zarith", "ocl-icd", "oddjob", + "ogdi", "omping", "opa", "opal", diff --git a/cgmanifest.json b/cgmanifest.json index c0768fdd158..1b481c9de57 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -15119,6 +15119,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "ogdi", + "version": "4.1.0", + "downloadUrl": "https://github.com/libogdi/ogdi/archive/ogdi_4_1_0.tar.gz" + } + } + }, { "component": { "type": "other", From 41e5023e43f1647c4e6fcfe2f12b0fad836b6c7b Mon Sep 17 00:00:00 2001 From: Henry Li <69694695+henryli001@users.noreply.github.com> Date: Wed, 30 Aug 2023 17:21:32 -0400 Subject: [PATCH 39/64] Upgrade nvidia-container-toolkit, nvidia-container-runtime and libnvidia-container (#5898) * upgrade nvidia packages * update signature of source tar * save changes * add patch to build nvidia-container-toolkit v1.13.3 with golang 1.19 * upgrade nvidia-container-toolkit and libnvidia to 1.13.5 * Update SPECS/libnvidia-container/libnvidia-container.spec Co-authored-by: Henry Beberman * Update SPECS/nvidia-container-toolkit/nvidia-container-toolkit.spec Co-authored-by: Henry Beberman * resolve coments * remove patch and update vendor source tar * Enforce golang to be equal to or greater than v1.20.7 --------- Co-authored-by: Henry Li Co-authored-by: Henry Beberman --- .../libnvidia-container.signatures.json | 2 +- SPECS/libnvidia-container/libnvidia-container.spec | 7 +++++-- .../nvidia-container-runtime.signatures.json | 2 +- .../nvidia-container-runtime.spec | 8 ++++++-- .../nvidia-container-toolkit.signatures.json | 4 ++-- .../nvidia-container-toolkit.spec | 12 ++++++++---- cgmanifest.json | 12 ++++++------ 7 files changed, 29 insertions(+), 18 deletions(-) diff --git a/SPECS/libnvidia-container/libnvidia-container.signatures.json b/SPECS/libnvidia-container/libnvidia-container.signatures.json index 36ba0d39c9c..6fab87ed43c 100644 --- a/SPECS/libnvidia-container/libnvidia-container.signatures.json +++ b/SPECS/libnvidia-container/libnvidia-container.signatures.json @@ -1,6 +1,6 @@ { "Signatures": { - "libnvidia-container-1.11.0.tar.gz": "ff09fa96615d26b2484588bbd5a8e435fa9c2d931838c3de48c990892960d6b7", + "libnvidia-container-1.13.5.tar.gz": "431522239d71728d2840b2f048d0a0733c3e6ad7a209bdf21c7d17c0aa661657", "nvidia-modprobe-495.44.tar.gz": "ae6e9c7e6b43368945c28f6b8b6d0d7cc36ee7e1be8955a009a1cb189e46de92" } } \ No newline at end of file diff --git a/SPECS/libnvidia-container/libnvidia-container.spec b/SPECS/libnvidia-container/libnvidia-container.spec index 5513695b856..0dc64b45b6f 100644 --- a/SPECS/libnvidia-container/libnvidia-container.spec +++ b/SPECS/libnvidia-container/libnvidia-container.spec @@ -3,8 +3,8 @@ %define mod_probe_dir deps/src/nvidia-modprobe-%{modprobe_version} Summary: NVIDIA container runtime library Name: libnvidia-container -Version: 1.11.0 -Release: 11%{?dist} +Version: 1.13.5 +Release: 1%{?dist} License: BSD AND ASL2.0 AND GPLv3+ AND LGPLv3+ AND MIT AND GPLv2 Vendor: Microsoft Corporation Distribution: Mariner @@ -132,6 +132,9 @@ This package contains command-line tools that facilitate using the library. %{_bindir}/* %changelog +* Thu Aug 24 2023 Henry Li - 1.13.5-1 +- Upgrade to version 1.13.5 + * Mon Aug 07 2023 CBL-Mariner Servicing Account - 1.11.0-11 - Bump release to rebuild with go 1.19.12 diff --git a/SPECS/nvidia-container-runtime/nvidia-container-runtime.signatures.json b/SPECS/nvidia-container-runtime/nvidia-container-runtime.signatures.json index a2bc4064f2f..0fccb582ca8 100644 --- a/SPECS/nvidia-container-runtime/nvidia-container-runtime.signatures.json +++ b/SPECS/nvidia-container-runtime/nvidia-container-runtime.signatures.json @@ -1,5 +1,5 @@ { "Signatures": { - "nvidia-container-runtime-3.11.0.tar.gz": "e2e97d78ca6e41d58a0d668454aa828d1b6eef70c8adbc127fcfc83d76ebb99f" + "nvidia-container-runtime-3.13.0.tar.gz": "5a2516501eaf762fcb8bdeeeeab6e2597b3ccf52d9c5ed77d4c52c12f70cf3d1" } } \ No newline at end of file diff --git a/SPECS/nvidia-container-runtime/nvidia-container-runtime.spec b/SPECS/nvidia-container-runtime/nvidia-container-runtime.spec index fc5fb2cdd9e..bb110a612fe 100644 --- a/SPECS/nvidia-container-runtime/nvidia-container-runtime.spec +++ b/SPECS/nvidia-container-runtime/nvidia-container-runtime.spec @@ -1,7 +1,7 @@ %global debug_package %{nil} Summary: NVIDIA container runtime Name: nvidia-container-runtime -Version: 3.11.0 +Version: 3.13.0 Release: 1%{?dist} License: ASL 2.0 Vendor: Microsoft Corporation @@ -10,7 +10,7 @@ URL: https://github.com/NVIDIA/nvidia-container-runtime #Source0: https://github.com/NVIDIA/%%{name}/archive/v%%{version}.tar.gz Source0: %{name}-%{version}.tar.gz Obsoletes: nvidia-container-runtime < 2.0.0 -Requires: nvidia-container-toolkit >= 1.11.0, nvidia-container-toolkit < 2.0.0 +Requires: nvidia-container-toolkit >= 1.13.5, nvidia-container-toolkit < 2.0.0 Requires: libseccomp # NVIDIA now includes the runtime within the toolkit installs itself. # Previously there were independent installs of the runtime and the toolkit @@ -32,6 +32,10 @@ containers. %changelog +* Mon Jul 10 2023 Henry Li - 3.13.0-1 +- Upgrade to version 3.13.0 +- Add nvidia-container-toolkit minimum version 1.13.5 dependency + * Wed Sep 21 2022 Henry Li - 3.11.0-1 - Upgrade to version 3.11.0 - Add nvidia-container-toolkit minimum version 1.11.0 dependency diff --git a/SPECS/nvidia-container-toolkit/nvidia-container-toolkit.signatures.json b/SPECS/nvidia-container-toolkit/nvidia-container-toolkit.signatures.json index 8fcc567a2a0..feef863b361 100644 --- a/SPECS/nvidia-container-toolkit/nvidia-container-toolkit.signatures.json +++ b/SPECS/nvidia-container-toolkit/nvidia-container-toolkit.signatures.json @@ -1,6 +1,6 @@ { "Signatures": { - "nvidia-container-toolkit-1.11.0-vendor.tar.gz": "e4a81c97d3f306326c30065096d4535ba09d1f4d4de6d3bc7b28f6267ca3eb66", - "nvidia-container-toolkit-1.11.0.tar.gz": "016e20b3a1a59409da131817d84b9fc56eab72d3f69a9797bbf960f73c9e5262" + "nvidia-container-toolkit-1.13.5-vendor.tar.gz": "e2a72626fedaf53ad5e8a167509451eadd567e417fab4dec07cd9c19a84baae9", + "nvidia-container-toolkit-1.13.5.tar.gz": "2e95a89ca3ab95528df4bf32c5e0c8333e283e0465b9636458282c3d49a1b1da" } } \ No newline at end of file diff --git a/SPECS/nvidia-container-toolkit/nvidia-container-toolkit.spec b/SPECS/nvidia-container-toolkit/nvidia-container-toolkit.spec index 6a47afdc298..832393114e1 100644 --- a/SPECS/nvidia-container-toolkit/nvidia-container-toolkit.spec +++ b/SPECS/nvidia-container-toolkit/nvidia-container-toolkit.spec @@ -1,8 +1,8 @@ %global debug_package %{nil} Summary: NVIDIA container runtime hook Name: nvidia-container-toolkit -Version: 1.11.0 -Release: 11%{?dist} +Version: 1.13.5 +Release: 1%{?dist} License: ALS2.0 Vendor: Microsoft Corporation Distribution: Mariner @@ -28,11 +28,11 @@ Source0: %{name}-%{version}.tar.gz # See: https://reproducible-builds.org/docs/archives/ # - For the value of "--mtime" use the date "2021-04-26 00:00Z" to simplify future updates. Source1: %{name}-%{version}-vendor.tar.gz -BuildRequires: golang +BuildRequires: golang >= 1.20.7 Obsoletes: nvidia-container-runtime <= 3.5.0-1, nvidia-container-runtime-hook <= 1.4.0-2 Provides: nvidia-container-runtime Provides: nvidia-container-runtime-hook -Requires: libnvidia-container-tools >= 1.11.0, libnvidia-container-tools < 2.0.0 +Requires: libnvidia-container-tools >= 1.13.5, libnvidia-container-tools < 2.0.0 %description Provides a OCI hook to enable GPU support in containers. @@ -94,6 +94,10 @@ rm -f %{_bindir}/nvidia-container-toolkit %{_bindir}/nvidia-ctk %changelog +* Thu Aug 24 2023 Henry Li - 1.13.5-1 +- Upgrade to version 1.13.5 +- Enforce golang to be equal to or greater than v1.20.7 + * Mon Aug 07 2023 CBL-Mariner Servicing Account - 1.11.0-11 - Bump release to rebuild with go 1.19.12 diff --git a/cgmanifest.json b/cgmanifest.json index 1b481c9de57..28e3be3eb22 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -10301,8 +10301,8 @@ "type": "other", "other": { "name": "libnvidia-container", - "version": "1.11.0", - "downloadUrl": "https://github.com/NVIDIA/libnvidia-container/archive/v1.11.0.tar.gz" + "version": "1.13.5", + "downloadUrl": "https://github.com/NVIDIA/libnvidia-container/archive/v1.13.5.tar.gz" } } }, @@ -14463,8 +14463,8 @@ "type": "other", "other": { "name": "nvidia-container-runtime", - "version": "3.11.0", - "downloadUrl": "https://github.com/NVIDIA/nvidia-container-runtime/archive/v3.11.0.tar.gz" + "version": "3.13.0", + "downloadUrl": "https://github.com/NVIDIA/nvidia-container-runtime/archive/v3.13.0.tar.gz" } } }, @@ -14473,8 +14473,8 @@ "type": "other", "other": { "name": "nvidia-container-toolkit", - "version": "1.11.0", - "downloadUrl": "https://github.com/NVIDIA/nvidia-container-toolkit/archive/v1.11.0.tar.gz" + "version": "1.13.5", + "downloadUrl": "https://github.com/NVIDIA/nvidia-container-toolkit/archive/v1.13.5.tar.gz" } } }, From 5522b565511505d8833dc6af954efad6ef4bd871 Mon Sep 17 00:00:00 2001 From: CBL-Mariner-Bot <75509084+CBL-Mariner-Bot@users.noreply.github.com> Date: Wed, 30 Aug 2023 14:52:55 -0700 Subject: [PATCH 40/64] CVE-2022-0850 (#6073) --- SPECS/kernel/CVE-2022-0850.nopatch | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 SPECS/kernel/CVE-2022-0850.nopatch diff --git a/SPECS/kernel/CVE-2022-0850.nopatch b/SPECS/kernel/CVE-2022-0850.nopatch new file mode 100644 index 00000000000..7219967ae2c --- /dev/null +++ b/SPECS/kernel/CVE-2022-0850.nopatch @@ -0,0 +1,3 @@ +CVE-2022-0850 - patched in 5.15.126.1 - (generated by autopatch tool) +upstream ce3aba43599f0b50adbebff133df8d08a3d5fffe - stable ce3aba43599f0b50adbebff133df8d08a3d5fffe + From 4d812d01a986b57f0dfc69be1e8b939684027680 Mon Sep 17 00:00:00 2001 From: Pawel Winogrodzki Date: Wed, 30 Aug 2023 17:12:16 -0700 Subject: [PATCH 41/64] Disabled CCache for quick rebuilds. (#6112) --- toolkit/Makefile | 3 ++- toolkit/scripts/incremental_building.mk | 6 ++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/toolkit/Makefile b/toolkit/Makefile index f54b329f8c0..a6f4eabc14b 100644 --- a/toolkit/Makefile +++ b/toolkit/Makefile @@ -28,7 +28,7 @@ TEST_IGNORE_LIST ?= ######## SET INCREMENTAL BUILD FLAGS ######## # Logic to auto configure build options for optimized builds -# These will set the default values for: REBUILD_TOOLS, USE_CCACHE, MAX_CPU, REBUILD_TOOLCHAIN, DELTA_BUILD, INCREMENTAL_TOOLCHAIN, ALLOW_TOOLCHAIN_DOWNLOAD_FAIL, and CLEAN_TOOLCHAIN_CONTAINERS +# These will set the default values for: REBUILD_TOOLS, MAX_CPU, REBUILD_TOOLCHAIN, DELTA_BUILD, INCREMENTAL_TOOLCHAIN, ALLOW_TOOLCHAIN_DOWNLOAD_FAIL, and CLEAN_TOOLCHAIN_CONTAINERS include $(SCRIPTS_DIR)/incremental_building.mk ######## SET REMAINING FLAGS ######## @@ -63,6 +63,7 @@ HYDRATED_BUILD ?= n TARGET_ARCH ?= ALLOW_TOOLCHAIN_REBUILDS ?= n CACHED_PACKAGES_ARCHIVE ?= +USE_CCACHE ?= n # Tracing & Profiling support: https://go.dev/doc/diagnostics ENABLE_CPU_PROFILE ?= n diff --git a/toolkit/scripts/incremental_building.mk b/toolkit/scripts/incremental_building.mk index 437ded813f0..62724335d76 100644 --- a/toolkit/scripts/incremental_building.mk +++ b/toolkit/scripts/incremental_building.mk @@ -7,7 +7,7 @@ ######## QUICK_REBUILD AUTO CONFIGURE ######## # The QUICK_REBUILD* flags are special flags that will try to build the toolchain and packages as quickly as possible. They will -# automatically set REBUILD_TOOLS, USE_CCACHE, REBUILD_TOOLCHAIN, DELTA_BUILD, INCREMENTAL_TOOLCHAIN, and ALLOW_TOOLCHAIN_DOWNLOAD_FAIL to 'y'. +# automatically set REBUILD_TOOLS, REBUILD_TOOLCHAIN, DELTA_BUILD, INCREMENTAL_TOOLCHAIN, and ALLOW_TOOLCHAIN_DOWNLOAD_FAIL to 'y'. # It will also set CLEAN_TOOLCHAIN_CONTAINERS to 'n' QUICK_REBUILD ?= n QUICK_REBUILD_TOOLCHAIN ?= n @@ -57,9 +57,8 @@ endif DELTA_BUILD = y -# Don't care if USE_CCACHE or REBUILD_TOOLS are set or not, doesn't matter to the quickbuild. Just turn them +# Don't care if REBUILD_TOOLS is set or not, doesn't matter to the quickbuild. Just turn it # on to be friendly to the user unless they have explicitly set it to off. -USE_CCACHE ?= y REBUILD_TOOLS ?= y DELTA_FETCH ?= y PRECACHE ?= y @@ -72,7 +71,6 @@ endif REBUILD_TOOLCHAIN ?= n ALLOW_TOOLCHAIN_DOWNLOAD_FAIL ?= n REBUILD_TOOLS ?= n -USE_CCACHE ?= n DELTA_BUILD ?= n CLEAN_TOOLCHAIN_CONTAINERS ?= y MAX_CPU ?= From 7a62eec9eb87bb8ec85bd2b10d93e54988448841 Mon Sep 17 00:00:00 2001 From: Muhammad Falak R Wani Date: Thu, 31 Aug 2023 10:18:53 +0530 Subject: [PATCH 42/64] toolkit: containerized-build: honor $SPECS_DIR instead of hard-coding (#6043) This PR introduces the capability to override the source of the `specs`. Appending the option `SPECS_DIR=/path/to/specs` enables building packages that reside at locations other than the default `SPECS` Signed-off-by: Muhammad Falak R Wani --- toolkit/scripts/containerized-build.mk | 5 ++++- .../scripts/containerized-build/create_container_build.sh | 8 ++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/toolkit/scripts/containerized-build.mk b/toolkit/scripts/containerized-build.mk index 01bb2d1caba..4a7940e1910 100644 --- a/toolkit/scripts/containerized-build.mk +++ b/toolkit/scripts/containerized-build.mk @@ -30,8 +30,11 @@ ifeq ($(ENABLE_REPO),y) containerized_build_args += -r endif +# SPECS_DIR is always set +containerized_build_args += -s ${SPECS_DIR} + containerized-rpmbuild: $(SCRIPTS_DIR)/containerized-build/create_container_build.sh $(containerized_build_args) containerized-rpmbuild-help: - $(SCRIPTS_DIR)/containerized-build/create_container_build.sh -h \ No newline at end of file + $(SCRIPTS_DIR)/containerized-build/create_container_build.sh -h diff --git a/toolkit/scripts/containerized-build/create_container_build.sh b/toolkit/scripts/containerized-build/create_container_build.sh index 69feb286031..7b1d46b19f5 100755 --- a/toolkit/scripts/containerized-build/create_container_build.sh +++ b/toolkit/scripts/containerized-build/create_container_build.sh @@ -23,12 +23,14 @@ print_error() { help() { echo " Usage: -sudo make containerized-rpmbuild [REPO_PATH=/path/to/CBL-Mariner] [MODE=test|build] [VERSION=1.0|2.0] [MOUNTS= /src/path:/dst/path] [ENABLE_REPO=y] +sudo make containerized-rpmbuild [REPO_PATH=/path/to/CBL-Mariner] [MODE=test|build] [VERSION=1.0|2.0] [MOUNTS= /src/path:/dst/path] [ENABLE_REPO=y] [SPECS_DIR=/path/to/SPECS_DIR/to/use] Starts a docker container with the specified version of mariner. Optional arguments: REPO_PATH: path to the CBL-Mariner repo root directory. default: "current directory" + SPECS_DIR: The SPECS_DIR variable is reused from base Makefile. By Default it points to 'CBL-Mariner/SPECS' + We can override the SPECS_DIR to extended e.g by appeneding: SPECS_DIR=path/to/SPECS-EXTENDED MODE build or test. default:"build" In 'test' mode it will use a pre-built mariner chroot image. In 'build' mode it will use the latest published container. @@ -76,6 +78,7 @@ tmp_dir=${script_dir%'/toolkit'*}/build/containerized-rpmbuild/tmp mkdir -p ${tmp_dir} topdir=/usr/src/mariner enable_local_repo=false +specs_dir="" while (( "$#")); do case "$1" in @@ -84,6 +87,7 @@ while (( "$#")); do -p ) repo_path="$(realpath $2)"; shift 2 ;; -mo ) extra_mounts="$2"; shift 2 ;; -r ) enable_local_repo=true; shift ;; + -s ) specs_dir="$(realpath $2)"; shift 2;; -h ) help; exit 1 ;; ? ) echo -e "ERROR: INVALID OPTION.\n\n"; help; exit 1 ;; esac @@ -149,7 +153,7 @@ echo "Setting up mounts..." mounts="${mounts} ${repo_path}/out/RPMS:/mnt/RPMS ${tmp_dir}:/mariner_setup_dir" # Add extra 'build' mounts if [[ "${mode}" == "build" ]]; then - mounts="${mounts} ${repo_path}/build/INTERMEDIATE_SRPMS:/mnt/INTERMEDIATE_SRPMS ${repo_path}/SPECS:${topdir}/SPECS" + mounts="${mounts} ${repo_path}/build/INTERMEDIATE_SRPMS:/mnt/INTERMEDIATE_SRPMS $specs_dir:${topdir}/SPECS" fi # Replace comma with space as delimiter From 1151dd44f8f8aca0234d0f435017363cb1a618e7 Mon Sep 17 00:00:00 2001 From: Henry Beberman Date: Wed, 30 Aug 2023 21:51:17 -0700 Subject: [PATCH 43/64] Patch CVE-2022-47022 in hwloc (#6109) --- SPECS/hwloc/CVE-2022-47022.patch | 70 ++++++++++++++++++++++++++++++++ SPECS/hwloc/hwloc.spec | 6 ++- 2 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 SPECS/hwloc/CVE-2022-47022.patch diff --git a/SPECS/hwloc/CVE-2022-47022.patch b/SPECS/hwloc/CVE-2022-47022.patch new file mode 100644 index 00000000000..3898f3235c6 --- /dev/null +++ b/SPECS/hwloc/CVE-2022-47022.patch @@ -0,0 +1,70 @@ +From eec84f84d4c4a7af6ed2c57ba95a9256e56e73b4 Mon Sep 17 00:00:00 2001 +From: Brice Goglin +Date: Wed, 23 Aug 2023 19:52:47 +0200 +Subject: [PATCH] linux: handle glibc cpuset allocation failures + +Closes #544 +CVE-2022-47022 + +Signed-off-by: Brice Goglin +(cherry picked from commit ac1f8db9a0790d2bf153711ff4cbf6101f89aace) +--- + hwloc/topology-linux.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +diff --git a/hwloc/topology-linux.c b/hwloc/topology-linux.c +index bfc5dc23f..cae4f84d1 100644 +--- a/hwloc/topology-linux.c ++++ b/hwloc/topology-linux.c +@@ -877,6 +877,8 @@ hwloc_linux_set_tid_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, + + setsize = CPU_ALLOC_SIZE(last+1); + plinux_set = CPU_ALLOC(last+1); ++ if (!plinux_set) ++ return -1; + + CPU_ZERO_S(setsize, plinux_set); + hwloc_bitmap_foreach_begin(cpu, hwloc_set) +@@ -957,7 +959,10 @@ hwloc_linux_find_kernel_nr_cpus(hwloc_topology_t topology) + while (1) { + cpu_set_t *set = CPU_ALLOC(nr_cpus); + size_t setsize = CPU_ALLOC_SIZE(nr_cpus); +- int err = sched_getaffinity(0, setsize, set); /* always works, unless setsize is too small */ ++ int err; ++ if (!set) ++ return -1; /* caller will return an error, and we'll try again later */ ++ err = sched_getaffinity(0, setsize, set); /* always works, unless setsize is too small */ + CPU_FREE(set); + nr_cpus = setsize * 8; /* that's the value that was actually tested */ + if (!err) +@@ -985,8 +990,12 @@ hwloc_linux_get_tid_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, + + /* find the kernel nr_cpus so as to use a large enough cpu_set size */ + kernel_nr_cpus = hwloc_linux_find_kernel_nr_cpus(topology); ++ if (kernel_nr_cpus < 0) ++ return -1; + setsize = CPU_ALLOC_SIZE(kernel_nr_cpus); + plinux_set = CPU_ALLOC(kernel_nr_cpus); ++ if (!plinux_set) ++ return -1; + + err = sched_getaffinity(tid, setsize, plinux_set); + +@@ -1340,6 +1349,8 @@ hwloc_linux_set_thread_cpubind(hwloc_topology_t topology, pthread_t tid, hwloc_c + + setsize = CPU_ALLOC_SIZE(last+1); + plinux_set = CPU_ALLOC(last+1); ++ if (!plinux_set) ++ return -1; + + CPU_ZERO_S(setsize, plinux_set); + hwloc_bitmap_foreach_begin(cpu, hwloc_set) +@@ -1431,6 +1442,8 @@ hwloc_linux_get_thread_cpubind(hwloc_topology_t topology, pthread_t tid, hwloc_b + + setsize = CPU_ALLOC_SIZE(last+1); + plinux_set = CPU_ALLOC(last+1); ++ if (!plinux_set) ++ return -1; + + err = pthread_getaffinity_np(tid, setsize, plinux_set); + if (err) { diff --git a/SPECS/hwloc/hwloc.spec b/SPECS/hwloc/hwloc.spec index da85c84c4cc..3d8c74e2f8b 100644 --- a/SPECS/hwloc/hwloc.spec +++ b/SPECS/hwloc/hwloc.spec @@ -1,12 +1,13 @@ Summary: Portable Hardware Locality - portable abstraction of hierarchical architectures Name: hwloc Version: 2.5.0 -Release: 1%{?dist} +Release: 2%{?dist} License: BSD-2-Clause Vendor: Microsoft Corporation Distribution: Mariner URL: https://www.open-mpi.org/projects/hwloc/ Source0: http://www.open-mpi.org/software/hwloc/v2.5/downloads/%{name}-%{version}.tar.bz2 +Patch0: CVE-2022-47022.patch BuildRequires: gcc # C++ only for hwloc-hello-cpp test: BuildRequires: gcc-c++ @@ -167,6 +168,9 @@ LD_LIBRARY_PATH=$PWD/hwloc/.libs make check %{_libdir}/%{name}/hwloc* %changelog +* Wed Aug 30 2023 Henry Beberman - 2.5.0-2 +- Patch CVE-2022-47022 + * Thu Feb 02 2023 Riken Maharjan - 2.5.0-1 - Move from Extended to core - Update to 2.5.0 From 56b5f6cb275f2e5675027b2ceb413d9951aeed6f Mon Sep 17 00:00:00 2001 From: Archana Choudhary <36061892+arc9693@users.noreply.github.com> Date: Thu, 31 Aug 2023 18:27:15 +0530 Subject: [PATCH 44/64] Add libgta package to SPECS-EXTENDED (#6062) * Adds package libgta * Adds license info * Update cgmanifest * Move global vars to top --- SPECS-EXTENDED/libgta/libgta.signatures.json | 5 + SPECS-EXTENDED/libgta/libgta.spec | 178 ++++++++++++++++++ SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md | 2 +- SPECS/LICENSES-AND-NOTICES/data/licenses.json | 1 + cgmanifest.json | 10 + 5 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 SPECS-EXTENDED/libgta/libgta.signatures.json create mode 100644 SPECS-EXTENDED/libgta/libgta.spec diff --git a/SPECS-EXTENDED/libgta/libgta.signatures.json b/SPECS-EXTENDED/libgta/libgta.signatures.json new file mode 100644 index 00000000000..17c661b31c9 --- /dev/null +++ b/SPECS-EXTENDED/libgta/libgta.signatures.json @@ -0,0 +1,5 @@ +{ + "Signatures": { + "libgta-1.2.1.tar.xz": "d445667e145f755f0bc34ac89b63a6bfdce1eea943f87ee7a3f23dc0dcede8b1" + } +} \ No newline at end of file diff --git a/SPECS-EXTENDED/libgta/libgta.spec b/SPECS-EXTENDED/libgta/libgta.spec new file mode 100644 index 00000000000..2281428fcdf --- /dev/null +++ b/SPECS-EXTENDED/libgta/libgta.spec @@ -0,0 +1,178 @@ +%global so_version 1 + +Summary: Library that implements the Generic Tagged Arrays file format +Name: libgta +Version: 1.2.1 +Release: 9%{?dist} +License: LGPLv2+ +Vendor: Microsoft Corporation +Distribution: Mariner +URL: https://marlam.de/gta/ +Source0: https://marlam.de/gta/releases/%{name}-%{version}.tar.xz +BuildRequires: cmake +BuildRequires: doxygen +BuildRequires: gcc + +%description +Libgta is a portable library that implements the GTA (Generic Tagged Arrays) +file format. It provides interfaces for C and C++. + +%package devel +Summary: Development Libraries for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: pkgconfig + +%description devel +The %{name}-devel package contains libraries and header files for +developing applications that use %{name}. + +%package doc +Summary: API documentation for %{name} +Requires: %{name} = %{version}-%{release} +BuildArch: noarch + +%description doc +The %{name}-doc package contains HTML API documentation and +examples for %{name}. + +%prep +%setup -q + +%build +%cmake -D GTA_BUILD_STATIC_LIB:BOOL=FALSE +%cmake_build + +%install +%cmake_install + +# Remove documentation; will install it with doc macro +rm -rf %{buildroot}%{_docdir} + + +%check +%ctest + + +%ldconfig_scriptlets + + +%files +%license COPYING +%doc AUTHORS README +%{_libdir}/%{name}.so.%{so_version} +%{_libdir}/%{name}.so.%{so_version}.* + +%files devel +%{_libdir}/cmake/GTA-%{version} +%{_libdir}/pkgconfig/gta.pc +%{_includedir}/gta +%{_libdir}/%{name}.so + +%files doc +%doc doc/example* + +%changelog +* Wed Aug 09 2023 Archana Choudhary - 1.2.1-9 +- Initial CBL-Mariner import from Fedora 37 (license: MIT). +- License verified + +* Thu Jul 21 2022 Fedora Release Engineering - 1.2.1-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Thu Jan 20 2022 Fedora Release Engineering - 1.2.1-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Thu Jul 22 2021 Fedora Release Engineering - 1.2.1-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Wed May 26 2021 Benjamin A. Beasley - 1.2.1-5 +- Guard against unintentional so-version bumps + +* Fri May 21 2021 Sandro Mani - 1.2.1-4 +- Rebuild (gdal) + +* Wed May 19 2021 Jiri Kucera - 1.2.1-3 +- Fix FTBFS (bz1923686) + +* Tue Jan 26 2021 Fedora Release Engineering - 1.2.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Sat Aug 15 2020 Volker Fröhlich - 1.2.1-1 +- New upstream release +- Switch to the now-preferred cmake build system + +* Tue Jul 28 2020 Fedora Release Engineering - 1.0.9-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Wed Jan 29 2020 Fedora Release Engineering - 1.0.9-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Thu Jul 25 2019 Fedora Release Engineering - 1.0.9-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Fri Feb 01 2019 Fedora Release Engineering - 1.0.9-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Thu Aug 30 2018 Volker Fröhlich - 1.0.9-1 +- New upstream release +- New URL + +* Fri Jul 13 2018 Fedora Release Engineering - 1.0.7-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Wed Feb 07 2018 Fedora Release Engineering - 1.0.7-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Thu Aug 03 2017 Fedora Release Engineering - 1.0.7-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 1.0.7-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Fri Feb 10 2017 Fedora Release Engineering - 1.0.7-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Thu Feb 04 2016 Fedora Release Engineering - 1.0.7-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Wed Jun 17 2015 Fedora Release Engineering - 1.0.7-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Thu Dec 25 2014 Volker Fröhlich - 1.0.7-1 +- New upstream release +- Install the cmake find script + +* Wed Dec 17 2014 Volker Fröhlich - 1.0.6-1 +- New upstream release + +* Sun Aug 17 2014 Fedora Release Engineering - 1.0.4-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Sat Jun 07 2014 Fedora Release Engineering - 1.0.4-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Tue Apr 01 2014 Volker Fröhlich - 1.0.4-3 +- Rebuild for imagemagick ABI version 16 + +* Sat Aug 03 2013 Fedora Release Engineering - 1.0.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Sun Feb 3 2013 Volker Fröhlich 1.0.4-1 +- New upstream release + +* Sun Sep 2 2012 Volker Fröhlich 1.0.3-1 +- New upstream release +- Run checks + +* Thu Jul 19 2012 Fedora Release Engineering - 1.0.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Tue Feb 7 2012 Volker Fröhlich 1.0.2-2 +- Add a doc sub-package for API documentation + +* Sat Jan 28 2012 Volker Fröhlich 1.0.2-1 +- New upstream release +- Remove DESTDIR correction for install-exec-hook (now upstream) + +* Thu Jan 5 2012 Volker Fröhlich 1.0.1-1 +- Initial package for Fedora diff --git a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md index c8b51aa4834..9726d60704a 100644 --- a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md +++ b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md @@ -5,7 +5,7 @@ The CBL-Mariner SPEC files originated from a variety of sources with varying lic | CentOS | [MIT](https://www.centos.org/legal/#licensing-policy) | crash-ptdump-command
delve
fstrm
nodejs-nodemon
rhnlib
rt-setup
rt-tests
rtctl
tuned | | Ceph source | [LGPL2.1](https://github.com/ceph/ceph/blob/master/COPYING-LGPL2.1) | ceph | | Debian | [MIT](https://opensource.org/licenses/MIT) | prometheus-process-exporter | -| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cfitsio
cgdcbxd
chan
CharLS
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
ogdi
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | +| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cfitsio
cgdcbxd
chan
CharLS
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libgta
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
ogdi
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | | Fedora (Copyright Remi Collet) | [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/legalcode) | libmemcached-awesome
librabbitmq | | Fedora (ISC) | [ISC License](https://github.com/sarugaku/resolvelib/blob/main/LICENSE) | python-resolvelib | | Magnus Edenhill Open Source | [Magnus Edenhill Open Source BSD License](https://github.com/jemalloc/jemalloc/blob/dev/COPYING) | librdkafka | diff --git a/SPECS/LICENSES-AND-NOTICES/data/licenses.json b/SPECS/LICENSES-AND-NOTICES/data/licenses.json index adf3c2a978e..0eeef135799 100644 --- a/SPECS/LICENSES-AND-NOTICES/data/licenses.json +++ b/SPECS/LICENSES-AND-NOTICES/data/licenses.json @@ -634,6 +634,7 @@ "libgovirt", "libgphoto2", "libgsf", + "libgta", "libguestfs", "libgusb", "libgxim", diff --git a/cgmanifest.json b/cgmanifest.json index 28e3be3eb22..1f909c396a7 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -9516,6 +9516,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "libgta", + "version": "1.2.1", + "downloadUrl": "https://marlam.de/gta/releases/libgta-1.2.1.tar.xz" + } + } + }, { "component": { "type": "other", From a7349bfc89db4a5e63c86113dbae947c276453e4 Mon Sep 17 00:00:00 2001 From: Archana Choudhary <36061892+arc9693@users.noreply.github.com> Date: Thu, 31 Aug 2023 21:57:15 +0530 Subject: [PATCH 45/64] Add package liblerc to SPECS-EXTENDED (#6063) * Adds package liblerc * Adds license info * Update cgmanifest * Adds test execution command * remove patch related to win32 * Lint spec file --- .../liblerc/liblerc.signatures.json | 5 ++ SPECS-EXTENDED/liblerc/liblerc.spec | 80 +++++++++++++++++++ SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md | 2 +- SPECS/LICENSES-AND-NOTICES/data/licenses.json | 1 + cgmanifest.json | 10 +++ 5 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 SPECS-EXTENDED/liblerc/liblerc.signatures.json create mode 100644 SPECS-EXTENDED/liblerc/liblerc.spec diff --git a/SPECS-EXTENDED/liblerc/liblerc.signatures.json b/SPECS-EXTENDED/liblerc/liblerc.signatures.json new file mode 100644 index 00000000000..f284bd35731 --- /dev/null +++ b/SPECS-EXTENDED/liblerc/liblerc.signatures.json @@ -0,0 +1,5 @@ +{ + "Signatures": { + "liblerc-4.0.0.tar.gz": "91431c2b16d0e3de6cbaea188603359f87caed08259a645fd5a3805784ee30a0" + } +} \ No newline at end of file diff --git a/SPECS-EXTENDED/liblerc/liblerc.spec b/SPECS-EXTENDED/liblerc/liblerc.spec new file mode 100644 index 00000000000..178af4a6509 --- /dev/null +++ b/SPECS-EXTENDED/liblerc/liblerc.spec @@ -0,0 +1,80 @@ +Summary: Library for Limited Error Raster Compression +Name: liblerc +Version: 4.0.0 +Release: 3%{?dist} +License: ASL 2.0 +Vendor: Microsoft Corporation +Distribution: Mariner +URL: https://github.com/Esri/lerc +Source0: https://github.com/Esri/lerc/archive/v%{version}/lerc-%{version}.tar.gz#/%{name}-%{version}.tar.gz +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: python3-devel + +%description +LERC is an open-source image or raster format which supports rapid encoding and +decoding for any pixel type (not just RGB or Byte). Users set the maximum +compression error per pixel while encoding, so the precision of the original +input image is preserved (within user defined error bounds). + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +The %{name}-devel package contains libraries and header files for +developing applications that use %{name}. + +%prep +%autosetup -p1 -n lerc-%{version} + +# Fix line endings +sed -i 's/\r$//' NOTICE README.md doc/MORE.md + + +%build +# Native build +%cmake +%cmake_build + + +%install +%cmake_install + +%check +# Run your C++ program +g++ -o test src/LercTest/main.cpp -L. -lLerc +./test + +%files +%license LICENSE +%doc README.md CHANGELOG.md NOTICE +%{_libdir}/libLerc.so.4 + +%files devel +%doc doc/* +%{_includedir}/Lerc_c_api.h +%{_includedir}/Lerc_types.h +%{_libdir}/libLerc.so +%{_libdir}/pkgconfig/Lerc.pc + +%changelog +* Wed Aug 09 2023 Archana Choudhary - 4.0.0-3 +- Initial CBL-Mariner import from Fedora 37 (license: MIT) +- Remove mingw execution blocks +- License verified + +* Thu Jul 21 2022 Fedora Release Engineering - 4.0.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Thu Jul 21 2022 Sandro Mani - 4.0.0-1 +- Update to 4.0.0 + +* Mon Jul 11 2022 Sandro Mani - 3.1-0.3.gitb1de4cd +- Re-enable mingw32 on EL9 + +* Fri Jun 10 2022 Orion Poplawski - 3.1-0.2.gitb1de4cd +- Drop mingw for non-x86_64 on EL9 + +* Fri May 06 2022 Sandro Mani - 3.1-0.1.gitb1de4cd +- Initial package b1de4cd diff --git a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md index 9726d60704a..ea521222583 100644 --- a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md +++ b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md @@ -5,7 +5,7 @@ The CBL-Mariner SPEC files originated from a variety of sources with varying lic | CentOS | [MIT](https://www.centos.org/legal/#licensing-policy) | crash-ptdump-command
delve
fstrm
nodejs-nodemon
rhnlib
rt-setup
rt-tests
rtctl
tuned | | Ceph source | [LGPL2.1](https://github.com/ceph/ceph/blob/master/COPYING-LGPL2.1) | ceph | | Debian | [MIT](https://opensource.org/licenses/MIT) | prometheus-process-exporter | -| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cfitsio
cgdcbxd
chan
CharLS
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libgta
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
ogdi
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | +| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cfitsio
cgdcbxd
chan
CharLS
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libgta
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblerc
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
ogdi
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | | Fedora (Copyright Remi Collet) | [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/legalcode) | libmemcached-awesome
librabbitmq | | Fedora (ISC) | [ISC License](https://github.com/sarugaku/resolvelib/blob/main/LICENSE) | python-resolvelib | | Magnus Edenhill Open Source | [Magnus Edenhill Open Source BSD License](https://github.com/jemalloc/jemalloc/blob/dev/COPYING) | librdkafka | diff --git a/SPECS/LICENSES-AND-NOTICES/data/licenses.json b/SPECS/LICENSES-AND-NOTICES/data/licenses.json index 0eeef135799..02aae1a5176 100644 --- a/SPECS/LICENSES-AND-NOTICES/data/licenses.json +++ b/SPECS/LICENSES-AND-NOTICES/data/licenses.json @@ -667,6 +667,7 @@ "liblangtag", "libldb", "libldm", + "liblerc", "liblockfile", "liblognorm", "liblouis", diff --git a/cgmanifest.json b/cgmanifest.json index 1f909c396a7..5f43b675d52 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -9886,6 +9886,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "liblerc", + "version": "4.0.0", + "downloadUrl": "https://github.com/Esri/lerc/archive/v4.0.0/lerc-4.0.0.tar.gz" + } + } + }, { "component": { "type": "other", From a8275430dc4fb13838a5c573f37de2a7dde3c0e1 Mon Sep 17 00:00:00 2001 From: Archana Choudhary <36061892+arc9693@users.noreply.github.com> Date: Thu, 31 Aug 2023 23:09:33 +0530 Subject: [PATCH 46/64] Add package blosc to SPECS-EXTENDED (#6066) * Adds package blosc * Adds license info * Update cgmanifest * Remove comments --- SPECS-EXTENDED/blosc/blosc-gcc11.patch | 24 ++ SPECS-EXTENDED/blosc/blosc.signatures.json | 5 + SPECS-EXTENDED/blosc/blosc.spec | 265 ++++++++++++++++++ SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md | 2 +- SPECS/LICENSES-AND-NOTICES/data/licenses.json | 1 + cgmanifest.json | 10 + 6 files changed, 306 insertions(+), 1 deletion(-) create mode 100644 SPECS-EXTENDED/blosc/blosc-gcc11.patch create mode 100644 SPECS-EXTENDED/blosc/blosc.signatures.json create mode 100644 SPECS-EXTENDED/blosc/blosc.spec diff --git a/SPECS-EXTENDED/blosc/blosc-gcc11.patch b/SPECS-EXTENDED/blosc/blosc-gcc11.patch new file mode 100644 index 00000000000..a6469f1caae --- /dev/null +++ b/SPECS-EXTENDED/blosc/blosc-gcc11.patch @@ -0,0 +1,24 @@ +diff --git a/blosc/blosc.c b/blosc/blosc.c +index a04e161..ad800df 100644 +--- a/blosc/blosc.c ++++ b/blosc/blosc.c +@@ -240,6 +240,9 @@ static void my_free(void *block) + + + /* Copy 4 bytes from `*pa` to int32_t, changing endianness if necessary. */ ++/* This routine is not strict-aliasing safe, particularly if it is ++ inlined into its caller. So use attributes to prevent that. */ ++__attribute__ ((noinline,noclone,noipa)) + static int32_t sw32_(const uint8_t *pa) + { + int32_t idest; +@@ -266,6 +269,9 @@ static int32_t sw32_(const uint8_t *pa) + + + /* Copy 4 bytes from `*pa` to `*dest`, changing endianness if necessary. */ ++/* This routine is not strict-aliasing safe, particularly if it is ++ inlined into its caller. So use attributes to prevent that. */ ++__attribute__ ((noinline,noclone,noipa)) + static void _sw32(uint8_t* dest, int32_t a) + { + uint8_t *pa = (uint8_t *)&a; diff --git a/SPECS-EXTENDED/blosc/blosc.signatures.json b/SPECS-EXTENDED/blosc/blosc.signatures.json new file mode 100644 index 00000000000..579227d9adb --- /dev/null +++ b/SPECS-EXTENDED/blosc/blosc.signatures.json @@ -0,0 +1,5 @@ +{ + "Signatures": { + "blosc-1.21.4.tar.gz": "e72bd03827b8564bbb3dc3ea0d0e689b4863871ce3861d946f2efd7a186ecf3e" + } +} \ No newline at end of file diff --git a/SPECS-EXTENDED/blosc/blosc.spec b/SPECS-EXTENDED/blosc/blosc.spec new file mode 100644 index 00000000000..d5940ff5f3c --- /dev/null +++ b/SPECS-EXTENDED/blosc/blosc.spec @@ -0,0 +1,265 @@ +Summary: High performance compressor optimized for binary data +Name: blosc +Version: 1.21.4 +Release: 2%{?dist} +License: MIT +Vendor: Microsoft Corporation +Distribution: Mariner +URL: https://github.com/Blosc/c-blosc +Source: https://github.com/Blosc/c-blosc/archive/v%{version}/blosc-%{version}.tar.gz +Patch0: %{name}-gcc11.patch +BuildRequires: cmake +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: libzstd-devel +BuildRequires: lz4-devel +BuildRequires: snappy-devel +BuildRequires: zlib-devel + +%description +Blosc is a compression library designed to transmit data to the processor +cache faster than the traditional non-compressed memory fetch. +Compression ratios are not very high, but the decompression is very fast. +Blosc is meant not only to reduce the size of large datasets on-disk or +in-memory, but also to accelerate memory-bound computations. + +%package devel +Summary: Header files and libraries for Blosc development +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +The blosc-devel package contains the header files and libraries needed +to develop programs that use the blosc meta-compressor. + +%prep +%autosetup -n c-%{name}-%{version} -p1 +rm -r internal-complibs/lz4* internal-complibs/zstd* + +# Fix rpath issue +sed -i '1i set\(CMAKE_SKIP_RPATH true\)' bench/CMakeLists.txt + +# Fix cmake detection of pthreads +sed -i '1i set\(CMAKE_POSITION_INDEPENDENT_CODE TRUE\)' CMakeLists.txt + +# https://github.com/Blosc/c-blosc/issues/190 +sed -i 's|lib/pkgconfig|%{_lib}/pkgconfig|' CMakeLists.txt + +# Add python shebang and permission +sed -i '1i #!%{_bindir}/python3' bench/plot-speeds.py + +%build +# Use the proper library path and SSE2 instruction on 64bits systems +%cmake \ + -DBUILD_STATIC:BOOL=OFF \ + -DPREFER_EXTERNAL_LZ4:BOOL=ON \ + -DTEST_INCLUDE_BENCH_SUITE:BOOL=OFF \ + -DDEACTIVATE_SNAPPY:BOOL=OFF \ + -DPREFER_EXTERNAL_ZLIB:BOOL=ON \ + -DPREFER_EXTERNAL_ZSTD:BOOL=ON + +%cmake_build + +%check +export LD_LIBRARY_PATH=%{buildroot}%{_libdir} +%ctest + +%install +%cmake_install + +%files +%exclude %{_pkgdocdir}/bench/ +%license LICENSES/* +%doc README.md ANNOUNCE.rst RELEASE_NOTES.rst README*.rst +%{_libdir}/libblosc.so.1* + +%files devel +%{_libdir}/libblosc.so +%{_libdir}/pkgconfig/blosc.pc +%{_includedir}/blosc.h +%{_includedir}/blosc-export.h + +%changelog +* Thu Aug 10 2023 Archana Choudhary - 1.21.4-2 +- Initial CBL-Mariner import from Fedora 37 (license: MIT). +- License verified. +- Remove subpackage bench + +* Sat May 20 2023 Zbigniew Jędrzejewski-Szmek - 1.21.4-1 +- Version 1.21.4 (rhbz#2207738) + +* Mon Jan 02 2023 jonathanspw - 1.21.2-1 +- update to 1.21.2 rhbz#2152010 + +* Wed Jul 20 2022 Fedora Release Engineering - 1.21.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Wed Jan 19 2022 Fedora Release Engineering - 1.21.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Thu Oct 07 2021 Zbigniew Jędrzejewski-Szmek - 1.21.1-1 +- Version 1.21.1 (fixes rhbz#2011655) + +* Wed Jul 21 2021 Fedora Release Engineering - 1.21.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Sat Feb 13 2021 Zbigniew Jędrzejewski-Szmek - 1.21.0-1 +- Update to latest version (#1742237) + +* Tue Jan 26 2021 Fedora Release Engineering - 1.20.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Tue Dec 15 2020 Jeff Law - 1.20.1-2 +- Prevent inlining, cloning and ipa analysis of sw32_ and _sw32 functions + +* Wed Sep 9 20:41:44 MDT 2020 Orion Poplawski - 1.20.1-1 +- Update to 1.20.1 + +* Tue Aug 11 2020 Elliott Sales de Andrade - 1.19.0-4 +- Fix build for new CMake macros (#1863272) +- Re-enable Snappy support (#1867915) + +* Sat Aug 01 2020 Fedora Release Engineering - 1.19.0-3 +- Second attempt - Rebuilt for + https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Mon Jul 27 2020 Fedora Release Engineering - 1.19.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Wed Jun 24 2020 Zbigniew Jędrzejewski-Szmek - 1.19.0-1 +- Update to latest version (#1742237) + +* Sat May 23 2020 Zbigniew Jędrzejewski-Szmek - 1.18.1-1 +- Update to latest version (#1742237) + +* Tue Jan 28 2020 Fedora Release Engineering - 1.17.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Thu Oct 3 2019 Orion Poplawski - 1.17.0-1 +- Update to 1.17.0 + +* Wed Jul 24 2019 Fedora Release Engineering - 1.16.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Sat May 4 2019 Zbigniew Jędrzejewski-Szmek - 1.16.3-1 +- Update to latest version (#1671929) + +* Thu Jan 31 2019 Fedora Release Engineering - 1.14.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Mon Nov 12 2018 Zbigniew Jędrzejewski-Szmek - 1.14.4-1 +- Update to latest version (#1609768) + +* Thu Jul 19 2018 Zbigniew Jędrzejewski-Szmek - 1.14.3-1 +- Update to latest version (#1539013) +- Drop obsolete ldconfig invocations + +* Thu Jul 12 2018 Fedora Release Engineering - 1.13.3-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Wed Feb 07 2018 Fedora Release Engineering - 1.13.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Thu Jan 25 2018 Zbigniew Jędrzejewski-Szmek - 1.13.3-1 +- Update to latest version (#1536731) + +* Thu Jan 18 2018 Jan Beran - 1.13.1-1 + +* New version using Python 3 + +* Wed Aug 02 2017 Fedora Release Engineering - 1.11.3-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 1.11.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Sat Mar 11 2017 Zbigniew Jędrzejewski-Szmek - 1.11.3-1 +- Update to latest version +- Build against external zstd +- A pkgconfig file is now provided + +* Fri Feb 10 2017 Fedora Release Engineering - 1.11.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Mon Nov 07 2016 Than Ngo - 1.11.1-2 +- Fix the bigendian issue which causes build failure in PyTables (bz#1379123) + +* Sun Nov 6 2016 Orion Poplawski - 1.11.1-1 +- Update to 1.11.1 (#1361777) +- Run cmake in %%build + +* Mon Sep 26 2016 Dominik Mierzejewski - 1.10.1-2 +- rebuilt for matplotlib-2.0.0 + +* Thu Jul 28 2016 Zbigniew Jędrzejewski-Szmek - 1.10.1-1 +- Update to latest version (#1323008) + +* Thu Jul 14 2016 Thibault North - 1.9.3-1 +- Update to 1.9.3 (#1211599) +- Remove 32-bits test patch now integrated + +* Mon May 16 2016 Orion Poplawski - 1.9.0-1 +- Update to 1.9.0 (#1211599) +- Update URL +- Disable parallel build +- Run all tests +- Ship license files + +* Wed Feb 03 2016 Fedora Release Engineering - 1.6.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Wed Jun 17 2015 Fedora Release Engineering - 1.6.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Wed May 6 2015 Zbigniew Jędrzejewski-Szmek - 1.6.1-1 +- Update to 1.6.1 (#1211599) + +* Mon Apr 20 2015 Zbigniew Jędrzejewski-Szmek - 1.5.4-1 +- Update to 1.5.4 (#1211599) + +* Tue Jan 06 2015 Zbigniew Jędrzejewski-Szmek - 1.5.2-1 +- Update to 1.5.2 (#1115808) + +* Fri Aug 15 2014 Fedora Release Engineering - 1.3.5-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Sat Jun 07 2014 Fedora Release Engineering - 1.3.5-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Sat Mar 22 2014 Thibault North - 1.3.5-1 +- Update to 1.3.5 + +* Fri Mar 21 2014 Thibault North - 1.3.4-1 +- Update to 1.3.4 + +* Tue Jan 07 2014 Zbigniew Jędrzejewski-Szmek - 1.3.0-1.rc2 +- Attempt to package new version + +* Tue Oct 22 2013 Thibault North - 1.2.3-9 +- Fix flags and bench compilation + +* Mon Oct 21 2013 Thibault North - 1.2.3-8 +- Fix docdir for F<20 and remove sse flag + +* Mon Oct 21 2013 Thibault North - 1.2.3-7 +- Use install instead of cp, more fixes + +* Mon Oct 21 2013 Thibault North - 1.2.3-6 +- Fixes + +* Mon Oct 21 2013 Thibault North - 1.2.3-5 +- Use pkgdocdir, various fixes. + +* Mon Oct 21 2013 Thibault North - 1.2.3-4 +- Fix docdir, add blosc-bench subpackage + +* Fri Oct 18 2013 Thibault North - 1.2.3-3 +- Fixes (thanks Zbigniew Jędrzejewski-Szmek) + +* Wed Oct 16 2013 Thibault North - 1.2.3-2 +- Various fixes + +* Fri Sep 20 2013 Thibault North - 1.2.3-1 +- Sync upstream + +* Fri Mar 22 2013 Thibault North - 1.1.6-1 +- Initial package diff --git a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md index ea521222583..64688f11ec4 100644 --- a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md +++ b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md @@ -5,7 +5,7 @@ The CBL-Mariner SPEC files originated from a variety of sources with varying lic | CentOS | [MIT](https://www.centos.org/legal/#licensing-policy) | crash-ptdump-command
delve
fstrm
nodejs-nodemon
rhnlib
rt-setup
rt-tests
rtctl
tuned | | Ceph source | [LGPL2.1](https://github.com/ceph/ceph/blob/master/COPYING-LGPL2.1) | ceph | | Debian | [MIT](https://opensource.org/licenses/MIT) | prometheus-process-exporter | -| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cfitsio
cgdcbxd
chan
CharLS
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libgta
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblerc
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
ogdi
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | +| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
blosc
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cfitsio
cgdcbxd
chan
CharLS
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libgta
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblerc
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
ogdi
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | | Fedora (Copyright Remi Collet) | [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/legalcode) | libmemcached-awesome
librabbitmq | | Fedora (ISC) | [ISC License](https://github.com/sarugaku/resolvelib/blob/main/LICENSE) | python-resolvelib | | Magnus Edenhill Open Source | [Magnus Edenhill Open Source BSD License](https://github.com/jemalloc/jemalloc/blob/dev/COPYING) | librdkafka | diff --git a/SPECS/LICENSES-AND-NOTICES/data/licenses.json b/SPECS/LICENSES-AND-NOTICES/data/licenses.json index 02aae1a5176..2d5158f8721 100644 --- a/SPECS/LICENSES-AND-NOTICES/data/licenses.json +++ b/SPECS/LICENSES-AND-NOTICES/data/licenses.json @@ -81,6 +81,7 @@ "bats", "bcache-tools", "biosdevname", + "blosc", "bluez", "bmake", "bogofilter", diff --git a/cgmanifest.json b/cgmanifest.json index 5f43b675d52..da48f4ada22 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -1152,6 +1152,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "blosc", + "version": "1.21.4", + "downloadUrl": "https://github.com/Blosc/c-blosc/archive/v1.21.4/blosc-1.21.4.tar.gz" + } + } + }, { "component": { "type": "other", From a6bb77e6918c46707039b234fea34eaaddf51105 Mon Sep 17 00:00:00 2001 From: Archana Choudhary <36061892+arc9693@users.noreply.github.com> Date: Thu, 31 Aug 2023 23:26:34 +0530 Subject: [PATCH 47/64] Add package uriparser to SPECS-EXTENDED (#6067) * Adds package uriparser * Adds license info * Update cgmanifest --- .../uriparser/uriparser.signatures.json | 5 + SPECS-EXTENDED/uriparser/uriparser.spec | 260 ++++++++++++++++++ SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md | 2 +- SPECS/LICENSES-AND-NOTICES/data/licenses.json | 1 + cgmanifest.json | 10 + 5 files changed, 277 insertions(+), 1 deletion(-) create mode 100644 SPECS-EXTENDED/uriparser/uriparser.signatures.json create mode 100644 SPECS-EXTENDED/uriparser/uriparser.spec diff --git a/SPECS-EXTENDED/uriparser/uriparser.signatures.json b/SPECS-EXTENDED/uriparser/uriparser.signatures.json new file mode 100644 index 00000000000..6464fa32497 --- /dev/null +++ b/SPECS-EXTENDED/uriparser/uriparser.signatures.json @@ -0,0 +1,5 @@ +{ + "Signatures": { + "uriparser-0.9.7.tar.bz2": "d27dea0c8b6f6fb9798f07caedef1cd96a6e3fc5c6189596774e19afa7ddded7" + } +} \ No newline at end of file diff --git a/SPECS-EXTENDED/uriparser/uriparser.spec b/SPECS-EXTENDED/uriparser/uriparser.spec new file mode 100644 index 00000000000..08414601e35 --- /dev/null +++ b/SPECS-EXTENDED/uriparser/uriparser.spec @@ -0,0 +1,260 @@ +Summary: URI parsing library - RFC 3986 +Name: uriparser +Version: 0.9.7 +Release: 2%{?dist} +License: BSD +Vendor: Microsoft Corporation +Distribution: Mariner +URL: https://uriparser.github.io/ +Source0: https://github.com/%{name}/%{name}/releases/download/%{name}-%{version}/%{name}-%{version}.tar.bz2 +BuildRequires: cmake +BuildRequires: doxygen +BuildRequires: gcc-c++ +BuildRequires: gmock-devel +BuildRequires: graphviz +BuildRequires: gtest-devel +BuildRequires: make + +%description +Uriparser is a strictly RFC 3986 compliant URI parsing library written +in C. uriparser is cross-platform, fast, supports Unicode and is +licensed under the New BSD license. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +The %{name}-devel package contains libraries and header files for +developing applications that use %{name}. + +%package doc +Summary: HTML documentation for %{name} +BuildArch: noarch + +%description doc +The %{name}-doc package contains HTML documentation files for %{name}. + +%prep +%autosetup -p1 + +# Remove qhelpgenerator dependency by commenting Doxygen.in: +sed -i 's/GENERATE_QHP\ =\ yes/GENERATE_QHP\ =\ no/g' doc/Doxyfile.in + + +%build +# Native build +%cmake +%cmake_build + + +%install +%cmake_install + + +%check +%ctest + + +%files +%doc THANKS AUTHORS ChangeLog +%license COPYING +%{_bindir}/uriparse +%{_libdir}/lib%{name}.so.1* +%{_libdir}/cmake/%{name}-%{version}/ + +%files devel +%{_includedir}/%{name}/ +%{_libdir}/lib%{name}.so +%{_libdir}/pkgconfig/lib%{name}.pc + +%files doc +%license COPYING +%doc %{_docdir}/%{name}/html + +%changelog +* Wed Aug 16 2023 Archana Choudhary - 0.9.7-2 +- Initial CBL-Mariner import from Fedora 37 (license: MIT). +- License verified. + +* Fri Oct 07 2022 Sandro Mani - 0.9.7-1 +- Update to 0.9.7 + +* Sat Jul 23 2022 Fedora Release Engineering - 0.9.6-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Fri Mar 25 2022 Sandro Mani - 0.9.6-5 +- Rebuild with mingw-gcc-12 + +* Thu Feb 24 2022 Sandro Mani - 0.9.6-4 +- Make mingw subpackages noarch + +* Thu Feb 24 2022 Sandro Mani - 0.9.6-1 +- Add mingw subpackages + +* Sat Jan 22 2022 Fedora Release Engineering - 0.9.6-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Fri Jan 07 2022 Sandro Mani - 0.9.6-1 +- Update to 0.9.6 + +* Fri Jul 23 2021 Fedora Release Engineering - 0.9.5-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Wed Mar 24 2021 Sandro Mani - 0.9.5-1 +- Update to 0.9.5 + +* Wed Jan 27 2021 Fedora Release Engineering - 0.9.4-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Wed Jul 29 2020 Fedora Release Engineering - 0.9.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Sun May 31 2020 Sandro Mani - 0.9.4-1 +- Update to 0.9.4 + +* Fri Jan 31 2020 Fedora Release Engineering - 0.9.3-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Sat Jul 27 2019 Fedora Release Engineering - 0.9.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Mon Apr 29 2019 Sandro Mani - 0.9.3-1 +- Update to 0.9.3 + +* Tue Apr 23 2019 Sandro Mani - 0.9.2-1 +- Update to 0.9.2 + +* Sun Feb 03 2019 Fedora Release Engineering - 0.9.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Mon Jan 07 2019 Sandro Mani - 0.9.1-1 +- Update to 0.9.1 + +* Sat Oct 27 2018 Sandro Mani - 0.9.0-1 +- Update to 0.9.0 + +* Mon Aug 20 2018 Sandro Mani - 0.8.6-1 +- Update to 0.8.6 + +* Sat Jul 14 2018 Fedora Release Engineering - 0.8.5-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Wed Mar 07 2018 Sandro Mani - 0.8.5-2 +- BR: gcc-c++ + +* Wed Feb 07 2018 Sandro Mani - 0.8.5-1 +- Update to 0.8.5 + +* Thu Aug 03 2017 Fedora Release Engineering - 0.8.4-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Thu Jul 27 2017 Fedora Release Engineering - 0.8.4-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Sat Feb 11 2017 Fedora Release Engineering - 0.8.4-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Tue May 10 2016 Sandro Mani - 0.8.4-3 +- Drop unused requires on cpptest +- Modernize spec + +* Sun Mar 27 2016 François Cami - 0.8.4-2 +- Add -doc subpackage. + +* Wed Mar 02 2016 François Cami - 0.8.4-1 +- Update to latest upstream. + +* Fri Feb 05 2016 Fedora Release Engineering - 0.8.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Sun Jul 12 2015 François Cami - 0.8.2-1 +- Update to latest upstream. + +* Fri Jun 19 2015 Fedora Release Engineering - 0.8.1-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Thu Jan 29 2015 Peter Robinson 0.8.1-4 +- Modernise spec + +* Wed Jan 28 2015 Marcin Juszkiewicz - 0.8.1-3 +- Make uriCompareRangeA() return -1/0/1 like tests assume it does + so package will build on aarch64. + +* Fri Jan 09 2015 François Cami - 0.8.1-2 +- Use PIC. + +* Mon Jan 05 2015 François Cami - 0.8.1-1 +- Update to latest upstream. + +* Mon Aug 18 2014 Fedora Release Engineering - 0.8.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Sun Jun 08 2014 Fedora Release Engineering - 0.8.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Fri Sep 06 2013 François Cami - 0.8.0-1 +- Update to latest upstream. + +* Fri Sep 06 2013 François Cami - 0.7.9-1 +- Update to latest upstream. + +* Tue Aug 06 2013 François Cami - 0.7.8-2 +- Fix FTBS due to https://fedoraproject.org/wiki/Changes/UnversionedDocdirs + +* Tue Jul 30 2013 François Cami - 0.7.8-1 +- Update to 0.7.8 + +* Fri Feb 15 2013 Fedora Release Engineering - 0.7.5-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Sun Jul 22 2012 Fedora Release Engineering - 0.7.5-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Sat Jan 14 2012 Fedora Release Engineering - 0.7.5-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Mon Feb 07 2011 Fedora Release Engineering - 0.7.5-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Tue Sep 07 2010 Rakesh Pandit 0.7.5-3 +- Fixed FTBFS + +* Sun Jul 26 2009 Fedora Release Engineering - 0.7.5-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Fri Mar 06 2009 Rakesh Pandit 0.7.5-1 +- Upgrade to 0.7.5: +- Improved docs +- Test suite +- 0.7.4 +- Cleaned up code and fixed memory leaks +- 0.7.3 +- Builds for Cygwin, minor bug fix +- Changes in build system. +- Added: Qt Assistant documentation output +- 0.7.2 +- Improved and cleaned API + +* Wed Feb 25 2009 Fedora Release Engineering - 0.7.1-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Sat Sep 06 2008 Rakesh Pandit 0.7.1-6 +- changed document file handling in spec, used better method - %%doc + +* Fri Sep 05 2008 Rakesh Pandit 0.7.1-5 +- fixed group, removed redundant args for %%setup +- included ChangeLog, fixed html folder path in %%files +- fixed automated autotool calls + +* Sat Aug 23 2008 Rakesh Pandit 0.7.1-4 +- changed name according to naming guidelines + +* Sat Aug 23 2008 Rakesh Pandit 0.7.1-3 +- fixed buildrequires tag + +* Sun Aug 10 2008 Rakesh Pandit 0.7.1-2 +- added documentation + +* Sat Aug 9 2008 Rakesh Pandit 0.7.1-1 +- Initial build diff --git a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md index 64688f11ec4..2c55ed39480 100644 --- a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md +++ b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md @@ -5,7 +5,7 @@ The CBL-Mariner SPEC files originated from a variety of sources with varying lic | CentOS | [MIT](https://www.centos.org/legal/#licensing-policy) | crash-ptdump-command
delve
fstrm
nodejs-nodemon
rhnlib
rt-setup
rt-tests
rtctl
tuned | | Ceph source | [LGPL2.1](https://github.com/ceph/ceph/blob/master/COPYING-LGPL2.1) | ceph | | Debian | [MIT](https://opensource.org/licenses/MIT) | prometheus-process-exporter | -| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
blosc
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cfitsio
cgdcbxd
chan
CharLS
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libgta
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblerc
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
ogdi
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | +| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
blosc
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cfitsio
cgdcbxd
chan
CharLS
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libgta
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblerc
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
ogdi
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
uriparser
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | | Fedora (Copyright Remi Collet) | [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/legalcode) | libmemcached-awesome
librabbitmq | | Fedora (ISC) | [ISC License](https://github.com/sarugaku/resolvelib/blob/main/LICENSE) | python-resolvelib | | Magnus Edenhill Open Source | [Magnus Edenhill Open Source BSD License](https://github.com/jemalloc/jemalloc/blob/dev/COPYING) | librdkafka | diff --git a/SPECS/LICENSES-AND-NOTICES/data/licenses.json b/SPECS/LICENSES-AND-NOTICES/data/licenses.json index 2d5158f8721..d540df6b627 100644 --- a/SPECS/LICENSES-AND-NOTICES/data/licenses.json +++ b/SPECS/LICENSES-AND-NOTICES/data/licenses.json @@ -2006,6 +2006,7 @@ "unique3", "units", "upower", + "uriparser", "urlview", "usb_modeswitch", "usb_modeswitch-data", diff --git a/cgmanifest.json b/cgmanifest.json index da48f4ada22..9666428d3ab 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -29052,6 +29052,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "uriparser", + "version": "0.9.7", + "downloadUrl": "https://github.com/uriparser/uriparser/releases/download/uriparser-0.9.7/uriparser-0.9.7.tar.bz2" + } + } + }, { "component": { "type": "other", From 72f75c44f05aea7f8cdd58759475b26a5fe1a428 Mon Sep 17 00:00:00 2001 From: Trung Date: Thu, 31 Aug 2023 11:23:42 -0700 Subject: [PATCH 48/64] Add workflow to automatically cherry-pick commits to development branches (#6082) Co-authored-by: Pawel Winogrodzki --- .github/workflows/cherry-pick.yml | 129 ++++++++++++++++++++++++++++++ toolkit/scripts/cherry_pick.sh | 85 ++++++++++++++++++++ 2 files changed, 214 insertions(+) create mode 100644 .github/workflows/cherry-pick.yml create mode 100755 toolkit/scripts/cherry_pick.sh diff --git a/.github/workflows/cherry-pick.yml b/.github/workflows/cherry-pick.yml new file mode 100644 index 00000000000..374b0107908 --- /dev/null +++ b/.github/workflows/cherry-pick.yml @@ -0,0 +1,129 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# This action cherry-picks CVE fix commits from fast-track branches to corresponding +# development branches for each version of Mariner. By default, the workflow is run +# whenever a CVE fix PR to a fast-track branch is merged. Additional target branches +# for cherry-pick can be specified by adding a comment to the original PR with the +# following syntax: +# /cherry-pick +# Note the list of target branches is space-separated, and the commenter must be a +# member or owner of the repository for the action to work. +# After cherry-pick succeeds for a branch, a new PR will be created to merge the commit +# to that target branch, and a label will be added to the original PR to indicate that +# the commit has been cherry-picked to that branch. +name: Cherry pick commits from PR +on: + pull_request: + types: + - closed + branches: + - 'fasttrack/*' + +permissions: + contents: read + pull-requests: read +defaults: + run: + shell: bash + +env: + CHERRY_PICK_BRANCH_MAPPING: '{"fasttrack/2.0": "main"}' + +jobs: + # Scans the PR for cherry pick comments, in addition to the default cherry pick target + collect_target_branches: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + name: Collect target branches from Pull Request + outputs: + cherry_pick_target_branches: ${{ steps.target_branches.outputs.cherry_pick_target_branches }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + # Collect target branches in a list. The list includes: + # - default target branch + # - any branch specified in PR comments with the syntax + # /cherry-pick + # The final list will only contain unique branches. + # The jq filter does the following from a JSON list of comments + # [{"author": "a", "authorAssociation": "MEMBER", "body": "hello"}, + # {"author": "c", "authorAssociation": "CONTRIBUTOR", "body": "hi"}, + # {"author": "a", "authorAssociation": "MEMBER", "body": "/cherry-pick a b c"}, + # {"author": "b", "authorAssociation": "MEMBER", "body": "/cherry-pick a b"}] + # - Select only comments where the author is a member or owner of the repository + # - Collect all comments body to a list of string + # - Select only comments that starts with "/cherry-pick " + # - Remove the "/cherry-pick " prefix from each comment + # ["a b c", "a b"] + # - Split the remaining content of each comment by whitespace into a list + # [["a", "b", "c"], ["a", "b"]] + # - Flatten the list + # ["a", "b", "c", "a", "b"] + # - Add the default target branch to the list + # ["a", "b", "c", "a", "b", "default-target"] + # - Remove all duplicate values + # ["a", "b", "c", "default-target"] + - name: Create list of target branches + id: target_branches + run: | + cherry_pick_branches_json=$(gh pr view ${{ github.event.number }} \ + --repo ${{ github.repository }} \ + --json comments \ + --jq '.comments + | map(select(.authorAssociation == "MEMBER" or .authorAssociation == "OWNER") + | .body + | select(startswith("/cherry-pick ")) + | ltrimstr("/cherry-pick ") + | split(" ")) + | flatten + | . += ["${{ fromJSON(env.CHERRY_PICK_BRANCH_MAPPING)[github.base_ref] }}"] + | unique') + branches_list=$(echo $cherry_pick_branches_json | jq -r @sh | tr -d "'") + echo "cherry_pick_target_branches=$branches_list" >> $GITHUB_OUTPUT + + # Actual cherry-pick work for each target branch + cherry_pick_commit: + needs: collect_target_branches + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + name: Cherry pick + steps: + - name: Workflow trigger checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.base_ref }} + fetch-depth: 0 + + - name: Configure local git repo + run: | + git config --local user.email "cblmargh@microsoft.com" + git config --local user.name "CBL-Mariner Servicing Account" + + # Run cherry-pick for each target branch and create new PR for it. If cherry-pick fails, + # output conflicts to the action logs and notify in the original PR. We want to run the + # cherry-pick script for all target branch, even if one fails. This step will succeed if + # all cherry-picks succeed. + - name: Run cherry-pick action + run: | + cp toolkit/scripts/cherry_pick.sh ${{ runner.temp }}/cherry_pick.sh + + for target_branch in ${{ needs.collect_target_branches.outputs.cherry_pick_target_branches }}; do + if ! ${{ runner.temp }}/cherry_pick.sh \ + -r "${{ github.repository }}" \ + -p "${{ github.event.pull_request.number }}" \ + -t "$target_branch" \ + -w $RUN_URL; then + failed=1 + fi + echo "================================================================================" + done + if [[ $failed == 1 ]]; then + echo "Cherry-pick failed for at least 1 target branch" + exit 1 + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} diff --git a/toolkit/scripts/cherry_pick.sh b/toolkit/scripts/cherry_pick.sh new file mode 100755 index 00000000000..694cf7057eb --- /dev/null +++ b/toolkit/scripts/cherry_pick.sh @@ -0,0 +1,85 @@ +#!/bin/bash +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +set -e + +function help { + echo "Cherry-pick commit to a specific branch and create Github PR" + echo "Usage:" + echo "[MANDATORY] -r REPOSITORY -> name of the repository in the format /" + echo "[MANDATORY] -p PR_NUMBER -> number of the PR to cherry-pick commit from" + echo "[MANDATORY] -t TARGET_BRANCH -> target branch to cherry-pick commit to" + echo "[MANDATORY] -w WORKFLOW_RUN_URL -> URL of the workflow run that triggers this script" +} + +function cherry_pick_from_pull_request { + repo=$1 + pr_number=$2 + target_branch=$3 + workflow_run_url=$4 + + # Collect merge commit hash and title from the original PR + commit_hash=$(gh pr view $pr_number --repo $repo --json mergeCommit --jq '.mergeCommit.oid') + original_pr_title=$(gh pr view $pr_number --repo $repo --json title --jq '.title') + tmp_branch="cherry-pick-$target_branch-$commit_hash" + + echo "Cherry picking commit ($commit_hash) to target branch ($target_branch)" + + # reset the current working tree to clean state + git reset --hard + git clean -df + git checkout -- . + + # create a temporary branch from target branch to perform cherry pick + git fetch --all + git checkout -b "$tmp_branch" origin/"$target_branch" + + if ! git cherry-pick -x "$commit_hash"; then + echo "Cherry pick failed. Displaying conflicts below" + git diff --diff-filter=U + gh pr comment "$pr_number" \ + --repo "$repo" \ + --body "Cherry-pick failed for branch \`$target_branch\`. See run logs for more details: $workflow_run_url" + exit 1 + fi + + echo "Pushing to remote" + git push -u origin "$tmp_branch" + echo "Done pushing to remote" + new_pr=$(gh pr create \ + -B "$target_branch" \ + -H "$tmp_branch" \ + --repo "$repo" \ + --title "[AUTO-CHERRY-PICK] $original_pr_title - branch $target_branch" \ + --body "This is an auto-generated pull request to cherry pick commit $commit_hash to $target_branch. Original PR: #$pr_number") + gh pr comment "$pr_number" \ + --repo "$repo" \ + --body "Cherry-pick succeeded for branch \`$target_branch\`. See pull request #$new_pr" + gh pr edit "$pr_number" \ + --repo "$repo" \ + --add-label "cherry_pick-$target_branch" +} + +repo= +pr_number= +target_branch= +workflow_run_url= + +while getopts "r:p:t:w:" opt; do + case ${opt} in + r ) repo="$OPTARG" ;; + p ) pr_number="$OPTARG" ;; + t ) target_branch="$OPTARG" ;; + w ) workflow_run_url="${OPTARG,,}" ;; + ? ) echo -e "ERROR: Invalid option.\n\n"; help; exit 1 ;; + esac +done + +if [[ -z "$repo" ]] || [[ -z "$pr_number" ]] || [[ -z "$target_branch" ]] || [[ -z "$workflow_run_url" ]] ; then + echo "Error: missing required arguments" + help + exit 1 +fi + +cherry_pick_from_pull_request "$repo" "$pr_number" "$target_branch" "$workflow_run_url" From 6acc7fa856ed1449cffb8ce2ffe0d1ba62da8d40 Mon Sep 17 00:00:00 2001 From: Archana Choudhary <36061892+arc9693@users.noreply.github.com> Date: Fri, 1 Sep 2023 00:17:12 +0530 Subject: [PATCH 49/64] Add package qt5-qtserialport to SPECS-EXTENDED (#6065) * Adds package qt5-qtserialport * Adds license info-qtserialport * Update cgmanifest-qtserialport * Switch to autosetup and make_install --- .../qt5-qtserialport.signatures.json | 5 + .../qt5-qtserialport/qt5-qtserialport.spec | 360 ++++++++++++++++++ SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md | 2 +- SPECS/LICENSES-AND-NOTICES/data/licenses.json | 1 + cgmanifest.json | 10 + 5 files changed, 377 insertions(+), 1 deletion(-) create mode 100644 SPECS-EXTENDED/qt5-qtserialport/qt5-qtserialport.signatures.json create mode 100644 SPECS-EXTENDED/qt5-qtserialport/qt5-qtserialport.spec diff --git a/SPECS-EXTENDED/qt5-qtserialport/qt5-qtserialport.signatures.json b/SPECS-EXTENDED/qt5-qtserialport/qt5-qtserialport.signatures.json new file mode 100644 index 00000000000..5bdce1b56df --- /dev/null +++ b/SPECS-EXTENDED/qt5-qtserialport/qt5-qtserialport.signatures.json @@ -0,0 +1,5 @@ +{ + "Signatures": { + "qt5-qtserialport-5.15.9.tar.xz": "67d20803f08b33973d7eded2e5c75083704e43b005d4c3bc9c6e8a91755bc025" + } +} \ No newline at end of file diff --git a/SPECS-EXTENDED/qt5-qtserialport/qt5-qtserialport.spec b/SPECS-EXTENDED/qt5-qtserialport/qt5-qtserialport.spec new file mode 100644 index 00000000000..ea2612096b9 --- /dev/null +++ b/SPECS-EXTENDED/qt5-qtserialport/qt5-qtserialport.spec @@ -0,0 +1,360 @@ +%global qt_module qtserialport + +Summary: Qt5 - SerialPort component +Name: qt5-%{qt_module} +Version: 5.15.9 +Release: 2%{?dist} +# See LGPL_EXCEPTIONS.txt, LICENSE.GPL3, respectively, for exception details +License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +Vendor: Microsoft Corporation +Distribution: Mariner +URL: https://www.qt.io +Source0: https://download.qt.io/official_releases/qt/5.15/%{version}/submodules/%{qt_module}-everywhere-opensource-src-%{version}.tar.xz#/%{name}-%{version}.tar.xz +%{?_qt5:Requires: %{_qt5}%{?_isa} = %{_qt5_version}} +BuildRequires: make +BuildRequires: pkgconfig +BuildRequires: qt5-qtbase-devel >= %{version} +BuildRequires: qt5-qtbase-private-devel +BuildRequires: pkgconfig(libudev) + +%description +Qt Serial Port provides the basic functionality, which includes configuring, +I/O operations, getting and setting the control signals of the RS-232 pinouts. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: qt5-qtbase-devel%{?_isa} + +%description devel +%{summary}. + +%package examples +Summary: Programming examples for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description examples +%{summary}. + +%prep +%autosetup -n %{qt_module}-everywhere-src-%{version} + + +%build +rm -rf examples +%{qmake_qt5} \ + %{?_qt5_examplesdir:CONFIG+=qt_example_installs} + +%make_build + + +%install +%make_install INSTALL_ROOT=%{buildroot} + +## .prl/.la file love +# nuke .prl reference(s) to %%buildroot, excessive (.la-like) libs +pushd %{buildroot}%{_qt5_libdir} +for prl_file in libQt5*.prl ; do + sed -i -e "/^QMAKE_PRL_BUILD_DIR/d" ${prl_file} + if [ -f "$(basename ${prl_file} .prl).so" ]; then + rm -fv "$(basename ${prl_file} .prl).la" + sed -i -e "/^QMAKE_PRL_LIBS/d" ${prl_file} + fi +done +popd + + +%ldconfig_scriptlets + +%files +%license LICENSE.* +%{_qt5_libdir}/libQt5SerialPort.so.5* + +%files devel +%{_qt5_headerdir}/QtSerialPort/ +%{_qt5_libdir}/libQt5SerialPort.so +%{_qt5_libdir}/libQt5SerialPort.prl +%dir %{_qt5_libdir}/cmake/Qt5SerialPort/ +%{_qt5_libdir}/cmake/Qt5SerialPort/Qt5SerialPortConfig*.cmake +%{_qt5_libdir}/pkgconfig/Qt5SerialPort.pc +%{_qt5_archdatadir}/mkspecs/modules/qt_lib_serialport*.pri + +%if 0%{?docs} +%files doc +%license LICENSE.FDL +%{_qt5_docdir}/qtserialport.qch +%{_qt5_docdir}/qtserialport/ +%endif + + +%changelog +* Wed Aug 09 2023 Archana Choudhary - 5.15.9-2 +- Initial CBL-Mariner import from Fedora 38 (license: MIT) +- License verified + +* Tue Apr 11 2023 Jan Grulich - 5.15.9-1 +- 5.15.9 + +* Tue Jan 31 2023 Jan Grulich - 5.15.8-3 +- migrated to SPDX license + +* Fri Jan 20 2023 Fedora Release Engineering - 5.15.8-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Thu Jan 05 2023 Jan Grulich - 5.15.8-1 +- 5.15.8 + +* Mon Oct 31 2022 Jan Grulich - 5.15.7-1 +- 5.15.7 + +* Tue Sep 20 2022 Jan Grulich - 5.15.6-1 +- 5.15.6 + +* Sat Jul 23 2022 Fedora Release Engineering - 5.15.5-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Wed Jul 13 2022 Jan Grulich - 5.15.5-1 +- 5.15.5 + +* Mon May 16 2022 Jan Grulich - 5.15.4-1 +- 5.15.4 + +* Fri Mar 04 2022 Jan Grulich - 5.15.3-1 +- 5.15.3 + +* Fri Jan 21 2022 Fedora Release Engineering - 5.15.2-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Fri Jul 23 2021 Fedora Release Engineering - 5.15.2-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Wed Jan 27 2021 Fedora Release Engineering - 5.15.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Tue Nov 24 07:54:15 CET 2020 Jan Grulich - 5.15.2-2 +- Rebuild for qtbase with -no-reduce-relocations option + +* Fri Nov 20 09:30:47 CET 2020 Jan Grulich - 5.15.2-1 +- 5.15.2 + +* Thu Sep 10 2020 Jan Grulich - 5.15.1-1 +- 5.15.1 + +* Sat Aug 01 2020 Fedora Release Engineering - 5.14.2-3 +- Second attempt - Rebuilt for + https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Wed Jul 29 2020 Fedora Release Engineering - 5.14.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Sat Apr 04 2020 Rex Dieter - 5.14.2-1 +- 5.14.2 + +* Thu Jan 30 2020 Fedora Release Engineering - 5.13.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Mon Dec 09 2019 Jan Grulich - 5.13.2-1 +- 5.13.2 + +* Tue Sep 24 2019 Jan Grulich - 5.12.5-1 +- 5.12.5 + +* Fri Jul 26 2019 Fedora Release Engineering - 5.12.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Fri Jun 14 2019 Jan Grulich - 5.12.4-1 +- 5.12.4 + +* Tue Jun 04 2019 Jan Grulich - 5.12.3-1 +- 5.12.3 + +* Fri Feb 15 2019 Rex Dieter - 5.12.1-1 +- 5.12.1 + +* Sat Feb 02 2019 Fedora Release Engineering - 5.11.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Fri Dec 07 2018 Rex Dieter - 5.11.3-1 +- 5.11.3 + +* Fri Sep 21 2018 Jan Grulich - 5.11.2-1 +- 5.11.2 + +* Sat Jul 14 2018 Fedora Release Engineering - 5.11.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Tue Jun 19 2018 Rex Dieter - 5.11.1-1 +- 5.11.1 + +* Sun May 27 2018 Rex Dieter - 5.11.0-1 +- 5.11.0, use %%make_build %%ldconfig_scriptlets + +* Wed Feb 14 2018 Jan Grulich - 5.10.1-1 +- 5.10.1 + +* Fri Feb 09 2018 Fedora Release Engineering - 5.10.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Tue Dec 19 2017 Jan Grulich - 5.10.0-1 +- 5.10.0 + +* Thu Nov 23 2017 Jan Grulich - 5.9.3-1 +- 5.9.3 + +* Mon Oct 09 2017 Jan Grulich - 5.9.2-1 +- 5.9.2 + +* Thu Aug 03 2017 Fedora Release Engineering - 5.9.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Thu Jul 27 2017 Fedora Release Engineering - 5.9.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Wed Jul 19 2017 Rex Dieter - 5.9.1-1 +- 5.9.1 + +* Fri Jun 16 2017 Rex Dieter - 5.9.0-2 +- drop shadow/out-of-tree builds (#1456211,QTBUG-37417) + +* Wed May 31 2017 Helio Chissini de Castro - 5.9.0-1 +- Upstream official release + +* Fri May 26 2017 Helio Chissini de Castro - 5.9.0-0.1.rc +- Upstream Release Candidate retagged + +* Wed May 24 2017 Helio Chissini de Castro - 5.9.0-0.rc.1 +- Upstream Release Candidate 1 + +* Wed May 24 2017 Helio Chissini de Castro - 5.9.0-0.rc.1 +- Upstream Release Candidate 1 + +* Fri May 05 2017 Helio Chissini de Castro - 5.9.0-0.beta.3 +- New upstream beta 3 version + +* Sun Apr 16 2017 Helio Chissini de Castro - 5.9.0-0.beta.1 +- New upstream beta version + +* Mon Jan 30 2017 Helio Chissini de Castro - 5.8.0-1 +- New upstream version + +* Sat Dec 10 2016 Rex Dieter - 5.7.1-2 +- 5.7.1 dec5 snapshot +- drop BR: cmake (handled by qt5-rpm-macros now) +- BR: qt5-qtbase-private-devel + +* Wed Nov 09 2016 Helio Chissini de Castro - 5.7.1-1 +- New upstream version + +* Tue Jun 14 2016 Helio Chissini de Castro - 5.7.0-2 +- Compiled with gcc + +* Tue Jun 14 2016 Helio Chissini de Castro - 5.7.0-2 +- Compiled with gcc + +* Tue Jun 14 2016 Helio Chissini de Castro - 5.7.0-2 +- Compiled with gcc + +* Tue Jun 14 2016 Helio Chissini de Castro - 5.7.0-1 +- Qt 5.7.0 release + +* Thu Jun 09 2016 Jan Grulich - 5.6.1-1 +- Update to 5.6.1 + +* Sun Mar 20 2016 Rex Dieter - 5.6.0-3 +- rebuild + +* Fri Mar 18 2016 Rex Dieter - 5.6.0-2 +- rebuild + +* Mon Mar 14 2016 Helio Chissini de Castro - 5.6.0-1 +- 5.6.0 final release + +* Tue Feb 23 2016 Helio Chissini de Castro - 5.6.0-0.7.rc +- Update to final RC + +* Mon Feb 15 2016 Helio Chissini de Castro - 5.6.0-0.6 +- Update RC release + +* Thu Feb 04 2016 Fedora Release Engineering - 5.6.0-0.5.beta3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Mon Dec 28 2015 Rex Dieter 5.6.0-0.4.beta3 +- update source URL, use %%license, BR: cmake + +* Mon Dec 21 2015 Helio Chissini de Castro - 5.6.0-0.3 +- Update to final beta3 release + +* Thu Dec 10 2015 Helio Chissini de Castro - 5.6.0-0.2 +- Official beta3 release + +* Tue Nov 03 2015 Helio Chissini de Castro - 5.6.0-0.1 +- Start to implement 5.6.0 beta3 + +* Thu Oct 15 2015 Helio Chissini de Castro - 5.5.1-2 +- Update to final release 5.5.1 + +* Tue Sep 29 2015 Helio Chissini de Castro - 5.5.1-1 +- Update to Qt 5.5.1 RC1 + +* Wed Jul 29 2015 Rex Dieter 5.5.0-3 +- -docs: BuildRequires: qt5-qhelpgenerator, standardize bootstrapping + +* Thu Jul 16 2015 Rex Dieter 5.5.0-2 +- tighten qtbase dep (#1233829) + +* Wed Jul 1 2015 Helio Chissini de Castro 5.5.0-1 +- New final upstream release Qt 5.5.0 + +* Thu Jun 25 2015 Helio Chissini de Castro - 5.5.0-0.2.rc +- Update for official RC1 released packages + +* Wed Jun 17 2015 Daniel Vrátil - 5.5.0-0.1.rc +- Qt 5.5.0 RC1 + +* Wed Jun 03 2015 Jan Grulich 5.4.2-1 +- 5.4.2 + +* Thu Apr 30 2015 Rex Dieter 5.4.1-2 +- Add qt5-qtserialport-examples (#1190202) + +* Fri Feb 27 2015 Rex Dieter 5.4.1-1 +- 5.4.1 + +* Wed Dec 10 2014 Rex Dieter 5.4.0-1 +- 5.4.0 (final) + +* Fri Nov 28 2014 Rex Dieter 5.4.0-0.3.rc +- 5.4.0-rc + +* Mon Nov 03 2014 Rex Dieter 5.4.0-0.2.beta3 +- out-of-tree build, use %%qmake_qt5 + +* Sun Oct 19 2014 Rex Dieter 5.4.0-0.1.beta3 +- 5.4.0-beta3 + +* Wed Sep 17 2014 Rex Dieter - 5.3.2-1 +- 5.3.2 + +* Sun Aug 17 2014 Fedora Release Engineering - 5.3.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Thu Jul 24 2014 Rex Dieter 5.3.1-1 +- 5.3.1 + +* Sun Jun 08 2014 Fedora Release Engineering - 5.3.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Wed May 21 2014 Jan Grulich 5.3.0-1 +- 5.3.0 + +* Sat Apr 26 2014 Rex Dieter 5.2.1-2 +- clean .prl files (buildroot, excessive deps) (#1091630) + +* Thu Feb 06 2014 Rex Dieter 5.2.1-1 +- 5.2.1 + +* Mon Jan 27 2014 Rex Dieter 5.2.0-2 +- ready -examples subpkg + +* Thu Jan 02 2014 Rex Dieter 5.2.0-1 +- first try diff --git a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md index 2c55ed39480..49efcfacca4 100644 --- a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md +++ b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md @@ -5,7 +5,7 @@ The CBL-Mariner SPEC files originated from a variety of sources with varying lic | CentOS | [MIT](https://www.centos.org/legal/#licensing-policy) | crash-ptdump-command
delve
fstrm
nodejs-nodemon
rhnlib
rt-setup
rt-tests
rtctl
tuned | | Ceph source | [LGPL2.1](https://github.com/ceph/ceph/blob/master/COPYING-LGPL2.1) | ceph | | Debian | [MIT](https://opensource.org/licenses/MIT) | prometheus-process-exporter | -| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
blosc
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cfitsio
cgdcbxd
chan
CharLS
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libgta
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblerc
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
ogdi
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
uriparser
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | +| Fedora | [Fedora MIT License Declaration](https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#License_of_Fedora_SPEC_Files) | a52dec
abseil-cpp
accountsservice
acpica-tools
acpid
adcli
adobe-mappings-cmap
adobe-mappings-pdf
advancecomp
adwaita-icon-theme
afflib
aide
alsa-firmware
alsa-plugins
amtk
amtterm
annobin
ansible-freeipa
archivemount
argparse-manpage
arptables
arpwatch
asio
aspell
aspell-en
at
at-spi2-atk
at-spi2-core
atf
atk
atop
attr
audiofile
augeas
authbind
authd
authselect
autoconf213
avahi
babeltrace
babeltrace2
babl
baekmuk-ttf-fonts
bats
bcache-tools
biosdevname
blosc
bluez
bmake
bogofilter
bolt
boom-boot
booth
botan2
breezy
brotli
buildah
busybox
bwidget
byacc
ca-certificates
cachefilesd
cairomm
calamares
capstone
catatonit
catch
catch1
cdrdao
celt051
cereal
certmonger
cfitsio
cgdcbxd
chan
CharLS
checkpolicy
checksec
chrony
cim-schema
cjkuni-uming-fonts
cjose
cldr-emoji-annotation
clucene
clutter
clutter-gst3
clutter-gtk
cmocka
cogl
collectd
colm
color-filesystem
colord
colorize
compat-lua
compiler-rt
conda
conmon
conntrack-tools
console-setup
container-exception-logger
containernetworking-plugins
convmv
corosync
corosync-qdevice
cpp-hocon
cppcheck
cpprest
cpptest
cpuid
criu
crypto-policies
cryptsetup
cscope
ctags
CUnit
cups
custodia
Cython
dbus-c++
dbus-python
dbxtool
dconf
dcraw
debootstrap
deltarpm
desktop-file-utils
device-mapper-persistent-data
dietlibc
diffstat
ding-libs
discount
distribution-gpg-keys
dleyna-connector-dbus
dleyna-core
dmraid
dnf
dnf-plugins-core
docbook-dtds
docbook-simple
docbook-slides
docbook-style-dsssl
docbook-utils
docbook2X
docbook5-schemas
docbook5-style-xsl
dogtail
dos2unix
dotconf
dovecot
dpdk
dpkg
driverctl
dropwatch
drpm
dumpet
dvd+rw-tools
dwarves
dwz
dyninst
ebtables
edac-utils
edk2
efax
efi-rpm-macros
egl-wayland
eglexternalplatform
elinks
enca
enchant
enchant2
enscript
environment-modules
evemu
execstack
exempi
exiv2
extra-cmake-modules
fabtests
facter
fakechroot
fakeroot
fapolicyd
fdk-aac-free
fdupes
fence-virt
fetchmail
fftw
filebench
fio
fipscheck
firewalld
fish
flac
flatbuffers
flite
fltk
fmt
fontawesome-fonts
fontpackages
fonts-rpm-macros
foomatic-db
freeglut
freeipmi
freeradius
freetds
fribidi
fros
frr
fsverity-utils
fuse-overlayfs
fuse-sshfs
fuse-zip
fuse3
future
fxload
gavl
gconf-editor
GConf2
gcovr
gcr
gdisk
gdk-pixbuf2
generic-logos
genwqe-tools
geoclue2
GeoIP
GeoIP-GeoLite-data
geolite2
geos
gfs2-utils
ghc-srpm-macros
giflib
gl-manpages
glew
glm
glog
glusterfs
gnome-desktop-testing
gnome-doc-utils
gnome-icon-theme
gnome-keyring
gnu-efi
go-rpm-macros
gom
google-api-python-client
google-crosextra-caladea-fonts
google-crosextra-carlito-fonts
google-guice
google-noto-cjk-fonts
google-noto-emoji-fonts
google-roboto-slab-fonts
gphoto2
gpm
graphene
graphite2
graphviz
grubby
gsettings-desktop-schemas
gsl
gsm
gspell
gssdp
gssntlmssp
gstreamer1
gstreamer1-plugins-base
gtk-vnc
gtk2
gtk3
gtkspell
gupnp
gupnp-av
gupnp-dlna
gupnp-igd
hardening-check
hdf5
heimdal
help2man
hexedit
hicolor-icon-theme
hiera
highlight
hivex
hostname
hsakmt
htop
hunspell
hunspell-af
hunspell-ar
hunspell-as
hunspell-ast
hunspell-az
hunspell-be
hunspell-bg
hunspell-bn
hunspell-br
hunspell-ca
hunspell-cop
hunspell-csb
hunspell-cv
hunspell-cy
hunspell-da
hunspell-de
hunspell-dsb
hunspell-el
hunspell-en
hunspell-eo
hunspell-es
hunspell-et
hunspell-eu
hunspell-fa
hunspell-fj
hunspell-fo
hunspell-fr
hunspell-fur
hunspell-fy
hunspell-ga
hunspell-gd
hunspell-gl
hunspell-grc
hunspell-gu
hunspell-gv
hunspell-haw
hunspell-hi
hunspell-hil
hunspell-hr
hunspell-hsb
hunspell-ht
hunspell-hu
hunspell-hy
hunspell-ia
hunspell-id
hunspell-is
hunspell-it
hunspell-kk
hunspell-km
hunspell-kn
hunspell-ko
hunspell-ku
hunspell-ky
hunspell-la
hunspell-lb
hunspell-ln
hunspell-mai
hunspell-mg
hunspell-mi
hunspell-mk
hunspell-ml
hunspell-mn
hunspell-mos
hunspell-mr
hunspell-ms
hunspell-mt
hunspell-nds
hunspell-ne
hunspell-nl
hunspell-no
hunspell-nr
hunspell-nso
hunspell-ny
hunspell-om
hunspell-or
hunspell-pa
hunspell-pl
hunspell-pt
hunspell-quh
hunspell-ro
hunspell-ru
hunspell-rw
hunspell-se
hunspell-shs
hunspell-si
hunspell-sk
hunspell-sl
hunspell-smj
hunspell-so
hunspell-sq
hunspell-sr
hunspell-sv
hunspell-sw
hunspell-ta
hunspell-te
hunspell-tet
hunspell-th
hunspell-tk
hunspell-tl
hunspell-tn
hunspell-tpi
hunspell-ts
hunspell-uk
hunspell-uz
hunspell-ve
hunspell-vi
hunspell-wa
hunspell-xh
hunspell-yi
hwdata
hwloc
hyperscan
hyperv-daemons
hyphen
hyphen-as
hyphen-bg
hyphen-bn
hyphen-ca
hyphen-da
hyphen-de
hyphen-el
hyphen-es
hyphen-fa
hyphen-fo
hyphen-fr
hyphen-ga
hyphen-gl
hyphen-grc
hyphen-gu
hyphen-hi
hyphen-hsb
hyphen-hu
hyphen-ia
hyphen-id
hyphen-is
hyphen-it
hyphen-kn
hyphen-ku
hyphen-lt
hyphen-mi
hyphen-ml
hyphen-mn
hyphen-mr
hyphen-nl
hyphen-or
hyphen-pa
hyphen-pl
hyphen-pt
hyphen-ro
hyphen-ru
hyphen-sa
hyphen-sk
hyphen-sl
hyphen-sv
hyphen-ta
hyphen-te
hyphen-tk
hyphen-uk
ibus
ibus-chewing
ibus-hangul
ibus-kkc
ibus-libzhuyin
ibus-m17n
ibus-rawcode
ibus-sayura
ibus-table
ibus-table-chinese
icc-profiles-openicc
icon-naming-utils
icoutils
iftop
iio-sensor-proxy
ilmbase
im-chooser
imaptest
imsettings
indent
infinipath-psm
inih
iniparser
intel-cmt-cat
intel-ipsec-mb
ioping
IP2Location
ipa-pgothic-fonts
ipcalc
ipmitool
iprutils
iptraf-ng
iptstate
irssi
iscsi-initiator-utils
isns-utils
iso-codes
isomd5sum
iw
iwd
jabberpy
jasper
javapackages-bootstrap
javapackages-tools
jbigkit
jdom2
jemalloc
jfsutils
jimtcl
jose
js-jquery
jsoncpp
Judy
kata-containers
kde-filesystem
kde-settings
kexec-tools
keybinder3
keycloak-httpd-client-install
kf5
kf5-kconfig
kf5-kcoreaddons
kf5-ki18n
kf5-kwidgetsaddons
kpmcore
kronosnet
ksh
kyotocabinet
kyua
ladspa
lame
langtable
lapack
lasso
latencytop
lato-fonts
lcms2
lcov
ldns
leatherman
ledmon
lensfun
leveldb
lftp
libabw
libaec
libao
libappstream-glib
libart_lgpl
libasyncns
libatasmart
libavc1394
libblockdev
libbpf
libbsd
libburn
libbytesize
libcacard
libcanberra
libcdio
libcdio-paranoia
libcdr
libcgroup
libchewing
libcli
libcmis
libcmpiutil
libcomps
libcroco
libdaemon
libdap
libdatrie
libdazzle
libdbi
libdbi-drivers
libdbusmenu
libdc1394
libdeflate
libdmx
libdnf
libdrm
libdvdnav
libdvdread
libdwarf
libeasyfc
libecap
libecb
libell
libEMF
libeot
libepoxy
libepubgen
libesmtp
libetonyek
libev
libevdev
libewf
libexif
libexttextcat
libfabric
libfontenc
libfreehand
libftdi
libgadu
libgdither
libgee
libgee06
libgexiv2
libgit2
libgit2-glib
libglade2
libglvnd
libgovirt
libgphoto2
libgsf
libgta
libguestfs
libgusb
libgxim
libgxps
libhangul
libhugetlbfs
libibcommon
libical
libICE
libicns
libid3tag
libIDL
libidn2
libiec61883
libieee1284
libimobiledevice
libindicator
libinput
libiodbc
libipt
libiptcdata
libiscsi
libisoburn
libisofs
libjcat
libkcapi
libkeepalive
libkkc
libkkc-data
liblangtag
libldb
libldm
liblerc
liblockfile
liblognorm
liblouis
liblqr-1
liblzf
libmad
libmediaart
libmicrohttpd
libmikmod
libmodman
libmodplug
libmodulemd1
libmpcdec
libmspub
libmtp
libmusicbrainz5
libmwaw
libnbd
libnet
libnetfilter_log
libnfs
libnotify
libntlm
libnumbertext
liboauth
libodfgen
libofa
libogg
liboggz
liboil
libomxil-bellagio
libopenraw
liboping
libosinfo
libotf
libotr
libpagemaker
libpaper
libpciaccess
libpeas
libpfm
libpinyin
libplist
libpmemobj-cpp
libpng12
libpng15
libproxy
libpsm2
libpwquality
libqb
libqxp
libraqm
LibRaw
libraw1394
libreport
libreswan
librevenge
librsvg2
librx
libsamplerate
libsass
libsecret
libsemanage
libsigc++20
libsigsegv
libslirp
libSM
libsmbios
libsmi
libsndfile
libsodium
libspiro
libsrtp
libssh
libstaroffice
libstemmer
libstoragemgmt
libtdb
libteam
libtevent
libthai
libtnc
libtomcrypt
libtommath
libtraceevent
libtranslit
libucil
libunicap
libuninameslist
liburing
libusbmuxd
libuser
libutempter
libvarlink
libverto
libvirt-dbus
libvirt-glib
libvirt-java
libvirt-python
libvisio
libvisual
libvoikko
libvorbis
libvpx
libwacom
libwnck3
libwpd
libwpe
libwpg
libwps
libwvstreams
libX11
libXau
libXaw
libxcb
libXcomposite
libxcrypt
libXcursor
libXdamage
libXdmcp
libXext
libxfce4util
libXfixes
libXfont2
libXft
libXi
libXinerama
libxkbcommon
libxkbfile
libxklavier
libxmlb
libXmu
libXpm
libXrandr
libXrender
libXres
libXScrnSaver
libxshmfence
libXt
libXtst
libXv
libXxf86vm
libyami
libyang
libyubikey
libzip
libzmf
lilv
linuxconsoletools
linuxptp
lksctp-tools
lldpd
lockdev
logwatch
lpsolve
lrzsz
lua
lua-expat
lua-filesystem
lua-json
lua-lpeg
lua-lunit
lua-rpm-macros
lua-term
luajit
luksmeta
lutok
lv2
lzip
lzop
m17n-db
m17n-lib
mac-robber
mailcap
mailx
malaga
malaga-suomi-voikko
mallard-rng
man-pages-cs
man-pages-es
man-pages-it
man-pages-ja
man-pages-ko
man-pages-pl
man-pages-ru
man-pages-zh-CN
mariadb-connector-c
mariadb-connector-odbc
marisa
maven-compiler-plugin
maven-jar-plugin
maven-resolver
maven-resources-plugin
maven-surefire
maven-wagon
mcelog
mcpp
mcstrans
mdadm
mdds
meanwhile
mecab
mecab-ipadic
media-player-info
memcached
memkind
mesa
mesa-libGLU
metis
microcode_ctl
microdnf
minicom
minizip
mksh
mobile-broadband-provider-info
mock
mock-core-configs
mod_auth_gssapi
mod_auth_mellon
mod_auth_openidc
mod_authnz_pam
mod_fcgid
mod_http2
mod_intercept_form_submit
mod_lookup_identity
mod_md
mod_security
mod_security_crs
mod_wsgi
mokutil
mpage
mrtg
mstflint
mt-st
mtdev
mtools
mtr
mtx
multilib-rpm-config
munge
mutt
mythes
mythes-bg
mythes-ca
mythes-cs
mythes-da
mythes-de
mythes-el
mythes-en
mythes-eo
mythes-es
mythes-fr
mythes-ga
mythes-hu
mythes-mi
mythes-ne
mythes-nl
mythes-pl
mythes-pt
mythes-ro
mythes-ru
mythes-sk
mythes-sl
mythes-sv
mythes-uk
nbd
nbdkit
neon
netavark
netcf
netlabel_tools
netpbm
netsniff-ng
nfs4-acl-tools
nftables
nilfs-utils
nkf
nload
nlopt
nodejs-packaging
nss-pam-ldapd
nss_nis
nss_wrapper
ntfs-3g
ntfs-3g-system-compression
numad
numatop
numpy
nvmetcli
nvml
oath-toolkit
ocaml
ocaml-alcotest
ocaml-astring
ocaml-base
ocaml-bigarray-compat
ocaml-bisect-ppx
ocaml-calendar
ocaml-camlp5
ocaml-camomile
ocaml-cinaps
ocaml-cmdliner
ocaml-compiler-libs-janestreet
ocaml-cppo
ocaml-csexp
ocaml-csv
ocaml-ctypes
ocaml-curses
ocaml-dune
ocaml-extlib
ocaml-fileutils
ocaml-findlib
ocaml-fmt
ocaml-fpath
ocaml-gettext
ocaml-integers
ocaml-libvirt
ocaml-luv
ocaml-lwt
ocaml-markup
ocaml-migrate-parsetree
ocaml-mmap
ocaml-num
ocaml-ocamlbuild
ocaml-ocplib-endian
ocaml-ounit
ocaml-parsexp
ocaml-ppx-derivers
ocaml-ppxlib
ocaml-re
ocaml-react
ocaml-result
ocaml-seq
ocaml-sexplib
ocaml-sexplib0
ocaml-stdio
ocaml-topkg
ocaml-tyxml
ocaml-uuidm
ocaml-uutf
ocaml-xml-light
ocaml-zarith
ocl-icd
oddjob
ogdi
omping
opa
opal
open-vm-tools
openblas
opencc
opencl-filesystem
opencl-headers
opencryptoki
opencsd
opendnssec
OpenEXR
openjade
openjpeg2
openmpi
openobex
openoffice-lv
openrdate
opensc
openslp
opensm
opensp
openssl
openssl-ibmpkcs11
openssl-pkcs11
openwsman
optipng
opus
opusfile
orangefs
ORBit2
orc
os-prober
osinfo-db
osinfo-db-tools
overpass-fonts
p11-kit
p7zip
pacemaker
pacrunner
pakchois
pam_krb5
pam_wrapper
papi
paps
parallel
patchelf
patchutils
pbzip2
pcp
pcsc-lite
pcsc-lite-ccid
PEGTL
perl
perl-Algorithm-C3
perl-Algorithm-Diff
perl-Alien-Build
perl-Alien-pkgconf
perl-AnyEvent
perl-AnyEvent-AIO
perl-AnyEvent-BDB
perl-App-cpanminus
perl-App-FatPacker
perl-AppConfig
perl-Archive-Extract
perl-Archive-Zip
perl-Authen-SASL
perl-B-Debug
perl-B-Hooks-EndOfScope
perl-B-Hooks-OP-Check
perl-B-Keywords
perl-B-Lint
perl-bareword-filehandles
perl-BDB
perl-Bit-Vector
perl-boolean
perl-Browser-Open
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Bytes-Random-Secure
perl-Capture-Tiny
perl-Carp-Clan
perl-CBOR-XS
perl-Class-Accessor
perl-Class-C3
perl-Class-C3-XS
perl-Class-Data-Inheritable
perl-Class-Factory-Util
perl-Class-Inspector
perl-Class-ISA
perl-Class-Load
perl-Class-Load-XS
perl-Class-Method-Modifiers
perl-Class-Singleton
perl-Class-Tiny
perl-Class-XSAccessor
perl-Clone
perl-Color-ANSI-Util
perl-Color-RGB-Util
perl-ColorThemeBase-Static
perl-ColorThemeRole-ANSI
perl-ColorThemes-Standard
perl-ColorThemeUtil-ANSI
perl-Compress-Bzip2
perl-Compress-LZF
perl-Compress-Raw-Lzma
perl-Config-AutoConf
perl-Config-INI
perl-Config-INI-Reader-Multiline
perl-Config-IniFiles
perl-Config-Simple
perl-Config-Tiny
perl-Const-Fast
perl-Convert-ASN1
perl-Convert-Bencode
perl-Coro
perl-Coro-Multicore
perl-CPAN-Changes
perl-CPAN-DistnameInfo
perl-CPAN-Meta-Check
perl-Cpanel-JSON-XS
perl-Crypt-CBC
perl-Crypt-DES
perl-Crypt-IDEA
perl-Crypt-OpenSSL-Bignum
perl-Crypt-OpenSSL-Guess
perl-Crypt-OpenSSL-Random
perl-Crypt-OpenSSL-RSA
perl-Crypt-PasswdMD5
perl-Crypt-Random-Seed
perl-CSS-Tiny
perl-Data-Dump
perl-Data-Munge
perl-Data-OptList
perl-Data-Peek
perl-Data-Section
perl-Data-UUID
perl-Date-Calc
perl-Date-ISO8601
perl-Date-Manip
perl-DateTime
perl-DateTime-Format-Builder
perl-DateTime-Format-DateParse
perl-DateTime-Format-HTTP
perl-DateTime-Format-IBeat
perl-DateTime-Format-ISO8601
perl-DateTime-Format-Mail
perl-DateTime-Format-Strptime
perl-DateTime-Locale
perl-DateTime-TimeZone
perl-DateTime-TimeZone-SystemV
perl-DateTime-TimeZone-Tzfile
perl-DBD-MySQL
perl-Devel-CallChecker
perl-Devel-Caller
perl-Devel-CheckBin
perl-Devel-CheckLib
perl-Devel-Cycle
perl-Devel-EnforceEncapsulation
perl-Devel-GlobalDestruction
perl-Devel-GlobalDestruction-XS
perl-Devel-Hide
perl-Devel-Leak
perl-Devel-LexAlias
perl-Devel-Size
perl-Devel-StackTrace
perl-Devel-Symdump
perl-Digest-BubbleBabble
perl-Digest-CRC
perl-Digest-HMAC
perl-Digest-SHA1
perl-Dist-CheckConflicts
perl-DynaLoader-Functions
perl-Email-Address
perl-Email-Date-Format
perl-Encode-Detect
perl-Encode-EUCJPASCII
perl-Encode-IMAPUTF7
perl-Encode-Locale
perl-Env-ShellWords
perl-Error
perl-EV
perl-Eval-Closure
perl-Event
perl-Exception-Class
perl-Expect
perl-ExtUtils-Config
perl-ExtUtils-Depends
perl-ExtUtils-Helpers
perl-ExtUtils-InstallPaths
perl-ExtUtils-PkgConfig
perl-FCGI
perl-Fedora-VSP
perl-FFI-CheckLib
perl-File-BaseDir
perl-File-BOM
perl-File-chdir
perl-File-CheckTree
perl-File-Copy-Recursive
perl-File-DesktopEntry
perl-File-Find-Object
perl-File-Find-Object-Rule
perl-File-Find-Rule
perl-File-Find-Rule-Perl
perl-File-Inplace
perl-File-Listing
perl-File-MimeInfo
perl-File-pushd
perl-File-ReadBackwards
perl-File-Remove
perl-File-ShareDir
perl-File-ShareDir-Install
perl-File-Slurp
perl-File-Slurp-Tiny
perl-File-Slurper
perl-File-Type
perl-Font-TTF
perl-FreezeThaw
perl-GD
perl-GD-Barcode
perl-generators
perl-Getopt-ArgvFile
perl-gettext
perl-Graphics-ColorNamesLite-WWW
perl-GSSAPI
perl-Guard
perl-Hook-LexWrap
perl-HTML-Parser
perl-HTML-Tagset
perl-HTML-Tree
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-Image-Base
perl-Image-Info
perl-Image-Xbm
perl-Image-Xpm
perl-Import-Into
perl-Importer
perl-inc-latest
perl-indirect
perl-Inline-Files
perl-IO-AIO
perl-IO-All
perl-IO-CaptureOutput
perl-IO-Compress-Lzma
perl-IO-HTML
perl-IO-Multiplex
perl-IO-SessionData
perl-IO-Socket-INET6
perl-IO-String
perl-IO-stringy
perl-IO-Tty
perl-IPC-Run
perl-IPC-Run3
perl-IPC-System-Simple
perl-JSON
perl-JSON-Color
perl-JSON-MaybeXS
perl-LDAP
perl-libnet
perl-libwww-perl
perl-libxml-perl
perl-Lingua-EN-Inflect
perl-List-MoreUtils-XS
perl-local-lib
perl-Locale-Codes
perl-Locale-Maketext-Gettext
perl-Locale-Msgfmt
perl-Locale-PO
perl-Log-Message
perl-Log-Message-Simple
perl-LWP-MediaTypes
perl-LWP-Protocol-https
perl-Mail-AuthenticationResults
perl-Mail-DKIM
perl-Mail-IMAPTalk
perl-Mail-SPF
perl-MailTools
perl-Math-Int64
perl-Math-Random-ISAAC
perl-MIME-Charset
perl-MIME-Lite
perl-MIME-Types
perl-Mixin-Linewise
perl-MLDBM
perl-Mock-Config
perl-Module-Build-Tiny
perl-Module-CPANfile
perl-Module-Implementation
perl-Module-Install-AuthorRequires
perl-Module-Install-AuthorTests
perl-Module-Install-AutoLicense
perl-Module-Install-GithubMeta
perl-Module-Install-ManifestSkip
perl-Module-Install-ReadmeFromPod
perl-Module-Install-ReadmeMarkdownFromPod
perl-Module-Install-Repository
perl-Module-Install-TestBase
perl-Module-Load-Util
perl-Module-Manifest
perl-Module-Manifest-Skip
perl-Module-Package
perl-Module-Package-Au
perl-Module-Pluggable
perl-Module-Runtime
perl-Module-Signature
perl-Mojolicious
perl-Moo
perl-Mozilla-CA
perl-Mozilla-LDAP
perl-MRO-Compat
perl-multidimensional
perl-namespace-autoclean
perl-namespace-clean
perl-Net-CIDR-Lite
perl-Net-Daemon
perl-Net-DNS
perl-Net-DNS-Resolver-Mock
perl-Net-DNS-Resolver-Programmable
perl-Net-HTTP
perl-Net-IMAP-Simple
perl-Net-IMAP-Simple-SSL
perl-Net-LibIDN2
perl-Net-Patricia
perl-Net-SMTP-SSL
perl-Net-SNMP
perl-Net-Telnet
perl-Newt
perl-NNTPClient
perl-NTLM
perl-Number-Compare
perl-Object-Deadly
perl-Object-HashBase
perl-Package-Anon
perl-Package-Constants
perl-Package-DeprecationManager
perl-Package-Generator
perl-Package-Stash
perl-Package-Stash-XS
perl-PadWalker
perl-Paper-Specs
perl-PAR-Dist
perl-Parallel-Iterator
perl-Params-Classify
perl-Params-Util
perl-Params-Validate
perl-Params-ValidationCompiler
perl-Parse-PMFile
perl-Parse-RecDescent
perl-Parse-Yapp
perl-Path-Tiny
perl-Perl-Critic
perl-Perl-Critic-More
perl-Perl-Destruct-Level
perl-Perl-MinimumVersion
perl-Perl4-CoreLibs
perl-PerlIO-gzip
perl-PerlIO-utf8_strict
perl-PkgConfig-LibPkgConf
perl-Pod-Coverage
perl-Pod-Coverage-TrustPod
perl-Pod-Escapes
perl-Pod-Eventual
perl-Pod-LaTeX
perl-Pod-Markdown
perl-Pod-Parser
perl-Pod-Plainer
perl-Pod-POM
perl-Pod-Spell
perl-PPI
perl-PPI-HTML
perl-PPIx-QuoteLike
perl-PPIx-Regexp
perl-PPIx-Utilities
perl-prefork
perl-Probe-Perl
perl-Razor-Agent
perl-Readonly
perl-Readonly-XS
perl-Ref-Util
perl-Ref-Util-XS
perl-Regexp-Pattern-Perl
perl-Return-MultiLevel
perl-Role-Tiny
perl-Scope-Guard
perl-Scope-Upper
perl-SGMLSpm
perl-SNMP_Session
perl-Socket6
perl-Software-License
perl-Sort-Versions
perl-Specio
perl-Spiffy
perl-strictures
perl-String-CRC32
perl-String-Format
perl-String-ShellQuote
perl-String-Similarity
perl-Sub-Exporter
perl-Sub-Exporter-Progressive
perl-Sub-Identify
perl-Sub-Info
perl-Sub-Install
perl-Sub-Name
perl-Sub-Quote
perl-Sub-Uplevel
perl-SUPER
perl-Switch
perl-Syntax-Highlight-Engine-Kate
perl-Sys-CPU
perl-Sys-MemInfo
perl-Sys-Virt
perl-Taint-Runtime
perl-Task-Weaken
perl-Term-Size-Any
perl-Term-Size-Perl
perl-Term-Table
perl-Term-UI
perl-TermReadKey
perl-Test-Base
perl-Test-ClassAPI
perl-Test-CPAN-Meta
perl-Test-CPAN-Meta-JSON
perl-Test-Deep
perl-Test-Differences
perl-Test-DistManifest
perl-Test-Distribution
perl-Test-EOL
perl-Test-Exception
perl-Test-Exit
perl-Test-FailWarnings
perl-Test-Fatal
perl-Test-File
perl-Test-File-ShareDir
perl-Test-Harness
perl-Test-HasVersion
perl-Test-InDistDir
perl-Test-Inter
perl-Test-LeakTrace
perl-Test-LongString
perl-Test-Manifest
perl-Test-Memory-Cycle
perl-Test-MinimumVersion
perl-Test-MockObject
perl-Test-MockRandom
perl-Test-Needs
perl-Test-NoTabs
perl-Test-NoWarnings
perl-Test-Object
perl-Test-Output
perl-Test-Pod
perl-Test-Pod-Coverage
perl-Test-Portability-Files
perl-Test-Requires
perl-Test-RequiresInternet
perl-Test-Script
perl-Test-Simple
perl-Test-SubCalls
perl-Test-Synopsis
perl-Test-Taint
perl-Test-TrailingSpace
perl-Test-utf8
perl-Test-Vars
perl-Test-Warn
perl-Test-Without-Module
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Test2-Tools-Explain
perl-Text-CharWidth
perl-Text-CSV_XS
perl-Text-Diff
perl-Text-Glob
perl-Text-Iconv
perl-Text-Soundex
perl-Text-Unidecode
perl-Text-WrapI18N
perl-Tie-IxHash
perl-TimeDate
perl-Tree-DAG_Node
perl-Unicode-EastAsianWidth
perl-Unicode-LineBreak
perl-Unicode-Map8
perl-Unicode-String
perl-Unicode-UTF8
perl-UNIVERSAL-can
perl-UNIVERSAL-isa
perl-Unix-Syslog
perl-URI
perl-Variable-Magic
perl-Version-Requirements
perl-WWW-RobotRules
perl-XML-Catalog
perl-XML-DOM
perl-XML-Dumper
perl-XML-Filter-BufferText
perl-XML-Generator
perl-XML-Grove
perl-XML-Handler-YAWriter
perl-XML-LibXML
perl-XML-LibXSLT
perl-XML-NamespaceSupport
perl-XML-Parser-Lite
perl-XML-RegExp
perl-XML-SAX
perl-XML-SAX-Base
perl-XML-SAX-Writer
perl-XML-Simple
perl-XML-TokeParser
perl-XML-TreeBuilder
perl-XML-Twig
perl-XML-Writer
perl-XML-XPath
perl-XML-XPathEngine
perl-XString
perl-YAML-LibYAML
perl-YAML-PP
perl-YAML-Syck
perltidy
pesign
phodav
php
php-pear
php-pecl-zip
physfs
picosat
pinfo
pipewire
pixman
pkcs11-helper
pkgconf
plexus-cipher
plexus-containers
plexus-sec-dispatcher
plotutils
pmdk-convert
pmix
pngcrush
pngnq
po4a
podman
poetry
policycoreutils
polkit-pkla-compat
portreserve
postfix
potrace
powertop
ppp
pps-tools
pptp
priv_wrapper
procmail
prometheus
prometheus-node-exporter
ps_mem
psacct
psutils
ptlib
publicsuffix-list
pugixml
pulseaudio
puppet
pwgen
pyatspi
pybind11
pycairo
pyelftools
pyflakes
pygobject3
PyGreSQL
pykickstart
pylint
pyparted
pyproject-rpm-macros
pyserial
python-absl-py
python-aiodns
python-aiohttp
python-alsa
python-argcomplete
python-astroid
python-astunparse
python-async-generator
python-augeas
python-azure-sdk
python-beautifulsoup4
python-betamax
python-blinker
python-blivet
python-cached_property
python-charset-normalizer
python-cheetah
python-click
python-cmd2
python-colorama
python-CommonMark
python-conda-package-handling
python-configshell
python-cpuinfo
python-cups
python-curio
python-cytoolz
python-d2to1
python-dbus-client-gen
python-dbus-python-client-gen
python-dbus-signature-pyparsing
python-dbusmock
python-ddt
python-debtcollector
python-decorator
python-distlib
python-dmidecode
python-dns
python-dtopt
python-dulwich
python-enchant
python-entrypoints
python-ethtool
python-evdev
python-extras
python-faker
python-fasteners
python-fields
python-filelock
python-fixtures
python-flake8
python-flask
python-flit
python-flit-core
python-fluidity-sm
python-frozendict
python-funcsigs
python-gast
python-genshi
python-google-auth
python-google-auth-oauthlib
python-greenlet
python-gssapi
python-h5py
python-hs-dbus-signature
python-html5lib
python-httplib2
python-humanize
python-hwdata
python-importlib-metadata
python-inotify
python-into-dbus-python
python-IPy
python-iso8601
python-isodate
python-isort
python-itsdangerous
python-justbases
python-justbytes
python-jwcrypto
python-jwt
python-kdcproxy
python-kerberos
python-kmod
python-kubernetes
python-lazy-object-proxy
python-ldap
python-linux-procfs
python-lit
python-markdown
python-mccabe
python-memcached
python-mimeparse
python-mock
python-monotonic
python-more-itertools
python-mpmath
python-msal
python-msrestazure
python-mutagen
python-networkx
python-nose2
python-ntlm-auth
python-oauth2client
python-openpyxl
python-openstackdocstheme
python-oslo-i18n
python-oslo-sphinx
python-paramiko
python-pefile
python-pexpect
python-pkgconfig
python-platformdirs
python-pluggy
python-podman-api
python-process-tests
python-productmd
python-ptyprocess
python-pycares
python-pycosat
python-pydbus
python-pymongo
python-PyMySQL
python-pyperclip
python-pyroute2
python-pyrsistent
python-pysocks
python-pytest-benchmark
python-pytest-cov
python-pytest-expect
python-pytest-flake8
python-pytest-forked
python-pytest-mock
python-pytest-relaxed
python-pytest-runner
python-pytest-subtests
python-pytest-timeout
python-pytest-xdist
python-pytoml
python-pyudev
python-pywbem
python-qrcode
python-rdflib
python-recommonmark
python-redis
python-requests-file
python-requests-ftp
python-requests-kerberos
python-requests-mock
python-requests-oauthlib
python-requests-toolbelt
python-requests_ntlm
python-responses
python-retrying
python-rfc3986
python-rpm-generators
python-rpmfluff
python-rtslib
python-ruamel-yaml
python-ruamel-yaml-clib
python-s3transfer
python-schedutils
python-semantic_version
python-should_dsl
python-simpleline
python-slip
python-sniffio
python-soupsieve
python-sphinx
python-sphinx-epytext
python-sphinx-theme-py3doc-enhanced
python-sphinx_rtd_theme
python-sphinxcontrib-apidoc
python-sphinxcontrib-applehelp
python-sphinxcontrib-devhelp
python-sphinxcontrib-htmlhelp
python-sphinxcontrib-httpdomain
python-sphinxcontrib-jsmath
python-sphinxcontrib-qthelp
python-sphinxcontrib-serializinghtml
python-sqlalchemy
python-suds
python-systemd
python-tempita
python-templated-dictionary
python-termcolor
python-testpath
python-testresources
python-testscenarios
python-testtools
python-tidy
python-toml
python-tomli
python-toolz
python-tornado
python-tox
python-tox-current-env
python-tqdm
python-trio
python-typing-extensions
python-uamqp
python-unittest2
python-uritemplate
python-urwid
python-varlink
python-virt-firmware
python-voluptuous
python-waitress
python-webencodings
python-webtest
python-wheel
python-whoosh
python-winrm
python-wrapt
python-xmltodict
python-yubico
python-zipp
python-zmq
python3-mallard-ducktype
python3-pytest-asyncio
python3-typed_ast
pyusb
pywbem
pyxattr
qemu
qhull
qpdf
qperf
qr-code-generator
qt5-qtbase
qt5-qtconnectivity
qt5-qtdeclarative
qt5-qtsensors
qt5-qtserialport
qt5-qtsvg
qt5-qttools
qt5-rpm-macros
quagga
quota
radvd
ragel
raptor2
rarian
rasdaemon
rasqal
rcs
rdist
rdma-core
re2
re2c
realmd
rear
recode
redland
resource-agents
rest
rhash
rlwrap
rp-pppoe
rpm-mpi-hooks
rpmdevtools
rpmlint
rtkit
rtl-sdr
ruby-augeas
rubygem-bson
rubygem-coderay
rubygem-diff-lcs
rubygem-flexmock
rubygem-hpricot
rubygem-introspection
rubygem-liquid
rubygem-maruku
rubygem-metaclass
rubygem-mongo
rubygem-mustache
rubygem-mysql2
rubygem-pkg-config
rubygem-rake
rubygem-rake-compiler
rubygem-ronn
rubygem-rouge
rubygem-rspec
rubygem-rspec-expectations
rubygem-rspec-mocks
rubygem-rspec-support
rubygem-thread_order
rusers
samba
sanlock
sassist
satyr
sbc
sblim-cim-client2
sblim-cmpi-base
sblim-cmpi-devel
sblim-cmpi-fsvol
sblim-cmpi-network
sblim-cmpi-nfsv3
sblim-cmpi-nfsv4
sblim-cmpi-params
sblim-cmpi-sysfs
sblim-cmpi-syslog
sblim-indication_helper
sblim-sfcb
sblim-sfcc
sblim-sfcCommon
sblim-testsuite
sblim-wbemcli
scl-utils
scotch
screen
scrub
SDL
SDL2
SDL_sound
sdparm
seabios
secilc
selinux-policy
sendmail
serd
setools
setserial
setuptool
sgabios
sgml-common
sgpio
shared-mime-info
sharutils
sip
sisu
skkdic
sleuthkit
slirp4netns
smartmontools
smc-tools
socket_wrapper
softhsm
sombok
sord
sos
sound-theme-freedesktop
soundtouch
sox
soxr
sparsehash
spausedd
speex
speexdsp
spice-protocol
spice-vdagent
spirv-headers
spirv-tools
splix
squashfs-tools
squid
sratom
sscg
star
startup-notification
stunnel
subscription-manager
suitesparse
SuperLU
supermin
switcheroo-control
symlinks
sympy
sysfsutils
systemd-bootchart
t1lib
t1utils
taglib
tang
targetcli
tbb
tcl-pgtcl
tclx
teckit
telnet
tidy
time
tini
tinycdb
tix
tk
tlog
tmpwatch
tn5250
tofrodos
tokyocabinet
tpm-quote-tools
tpm-tools
tss2
ttembed
ttmkfdir
tuna
twolame
uchardet
uclibc-ng
ucpp
ucs-miscfixed-fonts
ucx
udftools
udica
udisks2
uglify-js
uid_wrapper
unicode-emoji
unicode-ucd
unique3
units
upower
uriparser
urlview
usb_modeswitch
usb_modeswitch-data
usbguard
usbip
usbmuxd
usbredir
usermode
ustr
uthash
uuid
uw-imap
v4l-utils
vhostmd
vino
virglrenderer
virt-p2v
virt-top
virt-what
virt-who
vitess
vmem
volume_key
vorbis-tools
vte291
vulkan-headers
vulkan-loader
watchdog
wavpack
wayland
wayland-protocols
web-assets
webrtc-audio-processing
websocketpp
whois
wireguard-tools
wireless-regdb
wireshark
woff2
wordnet
words
wpebackend-fdo
wsmancli
wvdial
x3270
xapian-core
Xaw3d
xcb-proto
xcb-util
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdelta
xdg-dbus-proxy
xdg-utils
xerces-c
xfconf
xfsdump
xhtml1-dtds
xkeyboard-config
xmlstarlet
xmltoman
xmvn
xorg-x11-apps
xorg-x11-drv-libinput
xorg-x11-font-utils
xorg-x11-fonts
xorg-x11-proto-devel
xorg-x11-server
xorg-x11-server-utils
xorg-x11-util-macros
xorg-x11-utils
xorg-x11-xauth
xorg-x11-xbitmaps
xorg-x11-xinit
xorg-x11-xkb-utils
xorg-x11-xtrans-devel
xrestop
xterm
xxhash
yajl
yaml-cpp
yasm
yelp-tools
yelp-xsl
ykclient
yp-tools
ypbind
ypserv
z3
zenity
zerofree
zfs-fuse
zipper
zopfli
zziplib | | Fedora (Copyright Remi Collet) | [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/legalcode) | libmemcached-awesome
librabbitmq | | Fedora (ISC) | [ISC License](https://github.com/sarugaku/resolvelib/blob/main/LICENSE) | python-resolvelib | | Magnus Edenhill Open Source | [Magnus Edenhill Open Source BSD License](https://github.com/jemalloc/jemalloc/blob/dev/COPYING) | librdkafka | diff --git a/SPECS/LICENSES-AND-NOTICES/data/licenses.json b/SPECS/LICENSES-AND-NOTICES/data/licenses.json index d540df6b627..81df8fab799 100644 --- a/SPECS/LICENSES-AND-NOTICES/data/licenses.json +++ b/SPECS/LICENSES-AND-NOTICES/data/licenses.json @@ -1826,6 +1826,7 @@ "qt5-qtconnectivity", "qt5-qtdeclarative", "qt5-qtsensors", + "qt5-qtserialport", "qt5-qtsvg", "qt5-qttools", "qt5-rpm-macros", diff --git a/cgmanifest.json b/cgmanifest.json index 9666428d3ab..8177c11003f 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -25199,6 +25199,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "qt5-qtserialport", + "version": "5.15.9", + "downloadUrl": "https://download.qt.io/official_releases/qt/5.15/5.15.9/submodules/qtserialport-everywhere-opensource-src-5.15.9.tar.xz" + } + } + }, { "component": { "type": "other", From b7edc212471aba0af4c9f5bdad8e3abcee08911c Mon Sep 17 00:00:00 2001 From: CBL-Mariner-Bot <75509084+CBL-Mariner-Bot@users.noreply.github.com> Date: Thu, 31 Aug 2023 12:07:34 -0700 Subject: [PATCH 50/64] [AUTOPATCHER-EXTENDED] Patched mod_auth_mellon to address CVE-2021-3639 (#6103) * Patch mod_auth_mellon to address CVE-2021-3639 * Lint spec file * Modify prep to use autosetup --------- Co-authored-by: Archana Choudhary --- .../mod_auth_mellon/CVE-2021-3639.patch | 44 +++++++++++++ .../mod_auth_mellon/mod_auth_mellon.spec | 63 +++++++++---------- 2 files changed, 73 insertions(+), 34 deletions(-) create mode 100644 SPECS-EXTENDED/mod_auth_mellon/CVE-2021-3639.patch diff --git a/SPECS-EXTENDED/mod_auth_mellon/CVE-2021-3639.patch b/SPECS-EXTENDED/mod_auth_mellon/CVE-2021-3639.patch new file mode 100644 index 00000000000..aa2c2ad5324 --- /dev/null +++ b/SPECS-EXTENDED/mod_auth_mellon/CVE-2021-3639.patch @@ -0,0 +1,44 @@ +From 42a11261b9dad2e48d70bdff7c53dd57a12db6f5 Mon Sep 17 00:00:00 2001 +From: AIMOTO Norihito +Date: Tue, 6 Jul 2021 22:57:24 +0200 +Subject: [PATCH] Prevent redirect to URLs that begin with '///' + +Visiting a logout URL like this: + https://rp.example.co.jp/mellon/logout?ReturnTo=///fishing-site.example.com/logout.html +would have redirected the user to fishing-site.example.com + +With the patch, this URL would be rejected. + +Fixes: CVE-2021-3639 +--- + auth_mellon_util.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/auth_mellon_util.c b/auth_mellon_util.c +index 2f8c9c3..6a686db 100644 +--- a/auth_mellon_util.c ++++ b/auth_mellon_util.c +@@ -927,6 +927,10 @@ int am_check_url(request_rec *r, const char *url) + { + const char *i; + ++ if (url == NULL) { ++ return HTTP_BAD_REQUEST; ++ } ++ + for (i = url; *i; i++) { + if (*i >= 0 && *i < ' ') { + /* Deny all control-characters. */ +@@ -943,6 +947,12 @@ int am_check_url(request_rec *r, const char *url) + } + } + ++ if (strstr(url, "///") == url) { ++ AM_LOG_RERROR(APLOG_MARK, APLOG_ERR, HTTP_BAD_REQUEST, r, ++ "URL starts with '///'"); ++ return HTTP_BAD_REQUEST; ++ } ++ + return OK; + } + diff --git a/SPECS-EXTENDED/mod_auth_mellon/mod_auth_mellon.spec b/SPECS-EXTENDED/mod_auth_mellon/mod_auth_mellon.spec index 79ff06ca938..011a49acaab 100644 --- a/SPECS-EXTENDED/mod_auth_mellon/mod_auth_mellon.spec +++ b/SPECS-EXTENDED/mod_auth_mellon/mod_auth_mellon.spec @@ -1,43 +1,40 @@ %bcond_with user_guide - +Summary: A SAML 2.0 authentication module for the Apache Httpd Server +Name: mod_auth_mellon +Version: 0.16.0 +Release: 4%{?dist} +License: GPLv2+ Vendor: Microsoft Corporation Distribution: Mariner -Summary: A SAML 2.0 authentication module for the Apache Httpd Server -Name: mod_auth_mellon -Version: 0.16.0 -Release: 3%{?dist} -Source0: https://github.com/latchset/mod_auth_mellon/releases/download/v0_16_0/mod_auth_mellon-0.16.0.tar.gz -Source1: auth_mellon.conf -Source2: 10-auth_mellon.conf -Source3: mod_auth_mellon.conf -Source4: mellon_create_metadata.sh -Source5: README.redhat.rst -License: GPLv2+ +URL: https://github.com/latchset/mod_auth_mellon +Source0: https://github.com/latchset/mod_auth_mellon/releases/download/v0_16_0/mod_auth_mellon-0.16.0.tar.gz +Source1: auth_mellon.conf +Source2: 10-auth_mellon.conf +Source3: mod_auth_mellon.conf +Source4: mellon_create_metadata.sh +Source5: README.redhat.rst +Patch0: CVE-2021-3639.patch +BuildRequires: curl-devel BuildRequires: gcc -BuildRequires: curl-devel -BuildRequires: glib2-devel -BuildRequires: httpd-devel -BuildRequires: lasso-devel >= 2.5.1-13 -BuildRequires: openssl-devel -BuildRequires: xmlsec1-devel -BuildRequires: systemd-rpm-macros - +BuildRequires: glib2-devel +BuildRequires: httpd-devel +BuildRequires: lasso-devel >= 2.5.1-13 +BuildRequires: openssl-devel +BuildRequires: systemd-rpm-macros +BuildRequires: xmlsec1-devel +Requires: httpd-mmn +Requires: lasso >= 2.5.1-13 %if %{with user_guide} -BuildRequires: rubygem-asciidoctor +BuildRequires: rubygem-asciidoctor %endif -Requires: httpd-mmn -Requires: lasso >= 2.5.1-13 -Url: https://github.com/latchset/mod_auth_mellon - - %description The mod_auth_mellon module is an authentication service that implements the SAML 2.0 federation protocol. It grants access based on the attributes received in assertions generated by a IdP server. %prep -%setup -q -n %{name}-%{version} +%autosetup -p1 %build export APXS=%{_httpd_apxs} @@ -88,8 +85,8 @@ cp -r doc/user_guide %{buildroot}/%{_pkgdocdir} %endif %package diagnostics -Summary: Build of mod_auth_mellon with diagnostic logging -Requires: %{name} = %{version}-%{release} +Summary: Build of mod_auth_mellon with diagnostic logging +Requires: %{name} = %{version}-%{release} %description diagnostics Build of mod_auth_mellon with diagnostic logging. See README.redhat.rst @@ -113,6 +110,9 @@ in the doc directory for instructions on using the diagnostics build. %dir /run/%{name}/ %changelog +* Wed Aug 30 2023 CBL-Mariner Servicing Account - 0.16.0-4 +- Add patch for CVE-2021-3639 + * Tue Mar 15 2022 Pawel Winogrodzki - 0.16.0-3 - Adding missing BR on 'systemd-rpm-macros'. - License verified. @@ -188,18 +188,13 @@ in the doc directory for instructions on using the diagnostics build. - Update to new upstream 0.12.0 - [CVE-2016-2145] Fix DOS attack (Apache worker process crash) due to incorrect error handling when reading POST data from client. - - [CVE-2016-2146] Fix DOS attack (Apache worker process crash / resource exhaustion) due to missing size checks when reading POST data. - In addition this release contains the following new features and fixes: - - Add MellonRedirectDomains option to limit the sites that mod_auth_mellon can redirect to. This option is enabled by default. - - Add support for ECP service options in PAOS requests. - - Fix AssertionConsumerService lookup for PAOS requests. * Thu Feb 04 2016 Fedora Release Engineering - 0.11.0-4 From 7288c7d438d6531a88c845a3856ed36535070896 Mon Sep 17 00:00:00 2001 From: Archana Choudhary <36061892+arc9693@users.noreply.github.com> Date: Fri, 1 Sep 2023 00:48:38 +0530 Subject: [PATCH 51/64] Add package shapelib to SPECS-EXTENDED (#6064) * Adds package shapelib * Adds license info * Update cgmanifest * Cleanup changes --- SPECS-EXTENDED/shapelib/CVE-2022-0699.patch | 22 ++ ...b9281a5b9452d92e1682bdfe6019a13ed819f.diff | 12 ++ SPECS-EXTENDED/shapelib/rpmlint-errors.patch | 81 ++++++++ .../shapelib/shapelib.signatures.json | 5 + SPECS-EXTENDED/shapelib/shapelib.spec | 194 ++++++++++++++++++ SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md | 2 +- SPECS/LICENSES-AND-NOTICES/data/licenses.json | 1 + cgmanifest.json | 10 + 8 files changed, 326 insertions(+), 1 deletion(-) create mode 100644 SPECS-EXTENDED/shapelib/CVE-2022-0699.patch create mode 100644 SPECS-EXTENDED/shapelib/c75b9281a5b9452d92e1682bdfe6019a13ed819f.diff create mode 100644 SPECS-EXTENDED/shapelib/rpmlint-errors.patch create mode 100644 SPECS-EXTENDED/shapelib/shapelib.signatures.json create mode 100644 SPECS-EXTENDED/shapelib/shapelib.spec diff --git a/SPECS-EXTENDED/shapelib/CVE-2022-0699.patch b/SPECS-EXTENDED/shapelib/CVE-2022-0699.patch new file mode 100644 index 00000000000..21e4c86d1fb --- /dev/null +++ b/SPECS-EXTENDED/shapelib/CVE-2022-0699.patch @@ -0,0 +1,22 @@ +From c75b9281a5b9452d92e1682bdfe6019a13ed819f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Albin=20Eldst=C3=A5l-Ahrens?= +Date: Mon, 3 Jan 2022 12:34:41 +0100 +Subject: [PATCH] Remove double free() in contrib/shpsrt, issue #39 + +This fixes issue #39 +--- + contrib/shpsort.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/contrib/shpsort.c b/contrib/shpsort.c +index e21e9e0..920cd8c 100644 +--- a/contrib/shpsort.c ++++ b/contrib/shpsort.c +@@ -113,7 +113,6 @@ static char ** split(const char *arg, const char *delim) { + free(result[--i]); + } + free(result); +- free(copy); + return NULL; + } + result = tmp; diff --git a/SPECS-EXTENDED/shapelib/c75b9281a5b9452d92e1682bdfe6019a13ed819f.diff b/SPECS-EXTENDED/shapelib/c75b9281a5b9452d92e1682bdfe6019a13ed819f.diff new file mode 100644 index 00000000000..30c89110ab9 --- /dev/null +++ b/SPECS-EXTENDED/shapelib/c75b9281a5b9452d92e1682bdfe6019a13ed819f.diff @@ -0,0 +1,12 @@ +diff --git a/contrib/shpsort.c b/contrib/shpsort.c +index e21e9e0..920cd8c 100644 +--- a/contrib/shpsort.c ++++ b/contrib/shpsort.c +@@ -113,7 +113,6 @@ static char ** split(const char *arg, const char *delim) { + free(result[--i]); + } + free(result); +- free(copy); + return NULL; + } + result = tmp; diff --git a/SPECS-EXTENDED/shapelib/rpmlint-errors.patch b/SPECS-EXTENDED/shapelib/rpmlint-errors.patch new file mode 100644 index 00000000000..2d3e1997165 --- /dev/null +++ b/SPECS-EXTENDED/shapelib/rpmlint-errors.patch @@ -0,0 +1,81 @@ +Index: shapelib-1.5.0/contrib/shpcentrd.c +=================================================================== +--- shapelib-1.5.0.orig/contrib/shpcentrd.c ++++ shapelib-1.5.0/contrib/shpcentrd.c +@@ -156,4 +156,6 @@ int main( int argc, char ** argv ) + DBFClose( old_DBF ); + DBFClose( new_DBF ); + printf ("\n"); ++ ++ return 0; + } +Index: shapelib-1.5.0/contrib/shpdata.c +=================================================================== +--- shapelib-1.5.0.orig/contrib/shpdata.c ++++ shapelib-1.5.0/contrib/shpdata.c +@@ -131,4 +131,6 @@ int main( int argc, char ** argv ) + DBFClose( old_DBF ); + + printf ("\n"); ++ ++ return 0; + } +Index: shapelib-1.5.0/contrib/shpdxf.c +=================================================================== +--- shapelib-1.5.0.orig/contrib/shpdxf.c ++++ shapelib-1.5.0/contrib/shpdxf.c +@@ -331,6 +331,8 @@ main (int argc, char **argv) + SHPClose (shp); + DBFClose (dbf); + fclose (dxf); ++ ++ return 0; + } + + +Index: shapelib-1.5.0/contrib/shpfix.c +=================================================================== +--- shapelib-1.5.0.orig/contrib/shpfix.c ++++ shapelib-1.5.0/contrib/shpfix.c +@@ -107,4 +107,6 @@ int main( int argc, char ** argv ) + + SHPClose ( hSHP ); + SHPClose ( cSHP ); ++ ++ return 0; + } +Index: shapelib-1.5.0/contrib/shpinfo.c +=================================================================== +--- shapelib-1.5.0.orig/contrib/shpinfo.c ++++ shapelib-1.5.0/contrib/shpinfo.c +@@ -115,4 +115,6 @@ int main( int argc, char ** argv ) + + + SHPClose( hSHP ); ++ ++ return 0; + } +Index: shapelib-1.5.0/contrib/shpwkb.c +=================================================================== +--- shapelib-1.5.0.orig/contrib/shpwkb.c ++++ shapelib-1.5.0/contrib/shpwkb.c +@@ -126,4 +126,6 @@ int main( int argc, char ** argv ) + if ( wkb_file ) fclose ( wkb_file ); + + printf ("\n"); ++ ++ return 0; + } +Index: shapelib-1.5.0/shputils.c +=================================================================== +--- shapelib-1.5.0.orig/shputils.c ++++ shapelib-1.5.0/shputils.c +@@ -902,6 +902,8 @@ int clip_boundary() + if (i2 == 0) return(0); /** SKIP RECORD **/ + else return(1); /** WRITE RECORD **/ + } /** End CUT **/ ++ ++ return 0; /** SKIP RECORD **/ + } + + diff --git a/SPECS-EXTENDED/shapelib/shapelib.signatures.json b/SPECS-EXTENDED/shapelib/shapelib.signatures.json new file mode 100644 index 00000000000..5bfca646a63 --- /dev/null +++ b/SPECS-EXTENDED/shapelib/shapelib.signatures.json @@ -0,0 +1,5 @@ +{ + "Signatures": { + "shapelib-1.5.0.tar.gz": "1fc0a480982caef9e7b9423070b47750ba34cd0ba82668f2e638fab1d07adae1" + } +} \ No newline at end of file diff --git a/SPECS-EXTENDED/shapelib/shapelib.spec b/SPECS-EXTENDED/shapelib/shapelib.spec new file mode 100644 index 00000000000..ff7e655e332 --- /dev/null +++ b/SPECS-EXTENDED/shapelib/shapelib.spec @@ -0,0 +1,194 @@ +%define so_ver 2 + +Summary: Library for ESRI Shapefile Handling +Name: shapelib +Version: 1.5.0 +Release: 3%{?dist} +License: GPL-2.0-or-later AND (LGPL-2.0-or-later OR MIT) AND SUSE-Public-Domain +Vendor: Microsoft Corporation +Distribution: Mariner +Group: Productivity/Graphics/Other +URL: https://shapelib.maptools.org/ +Source0: https://download.osgeo.org/shapelib/%{name}-%{version}.tar.gz +# PATCH-FIX-UPSTREAM rpmlint-errors.patch -- Fix some of the rpmlint errors +# to get package acceptable to Factory +Patch0: rpmlint-errors.patch +# PATCH-Fix-UPSTREAM double free, CVE-2022-0699, https://github.com/OSGeo/shapelib/issues/39 +Patch1: CVE-2022-0699.patch + +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: pkgconfig +# dbfdump is also in perl-DBD-XBase +Conflicts: perl-DBD-XBase + +%description +The Shapefile C Library provides the ability to write simple C programs for +reading, writing and updating (to a limited extent) ESRI Shapefiles, and the +associated attribute file (.dbf). + +This package contains the executable programs. + +%package -n libshp-devel +Summary: Development Environment for %{name} +Group: Development/Libraries/C and C++ +Requires: libshp%{so_ver} = %{version} +Provides: shapelib-devel = %{version} + +%description -n libshp-devel +The Shapefile C Library provides the ability to write simple C programs for +reading, writing and updating (to a limited extent) ESRI Shapefiles, and the +associated attribute file (.dbf). + +This package contains the development environment for shapelib project. + +%package -n libshp%{so_ver} +Summary: Library for ESRI Shapefile Handling +Group: System/Libraries + +%description -n libshp%{so_ver} +The Shapefile C Library provides the ability to write simple C programs for +reading, writing and updating (to a limited extent) ESRI Shapefiles, and the +associated attribute file (.dbf). + +This package contains the dynamic link library for shapelib project. + +%prep +%autosetup -p1 + +# Fix rpmlint warning "wrong-file-end-of-line-encoding" +sed -i 's/\r$//' contrib/doc/shpsort.txt + +%build +%configure \ + --disable-static \ + --disable-silent-rules +%make_build + +%install +%make_install + +# Remove libtool config files +find %{buildroot} -type f -name "*.la" -delete -print + +%check +# Contrib tests fail +%make_build check ||: + +%post -n libshp%{so_ver} -p /sbin/ldconfig +%postun -n libshp%{so_ver} -p /sbin/ldconfig + +%files +%license COPYING +%doc ChangeLog +%doc contrib/doc/ web/ +%{_bindir}/Shape_PointInPoly +%{_bindir}/dbfadd +%{_bindir}/dbfcat +%{_bindir}/dbfcreate +%{_bindir}/dbfdump +%{_bindir}/dbfinfo +%{_bindir}/shpadd +%{_bindir}/shpcat +%{_bindir}/shpcentrd +%{_bindir}/shpcreate +%{_bindir}/shpdata +%{_bindir}/shpdump +%{_bindir}/shpdxf +%{_bindir}/shpfix +%{_bindir}/shpinfo +%{_bindir}/shprewind +%{_bindir}/shpsort +%{_bindir}/shptreedump +%{_bindir}/shputils +%{_bindir}/shpwkb + +%files -n libshp-devel +%{_includedir}/* +%{_libdir}/pkgconfig/shapelib.pc +%{_libdir}/libshp.so + +%files -n libshp%{so_ver} +%{_libdir}/libshp.so.%{so_ver}* + +%changelog +* Sun Aug 20 2023 Archana Choudhary - 1.5.0-3 +- Update 'Release' tag format to '[number]%{?dist}' + +* Thu Aug 10 2023 Archana Choudhary - 1.5.0-2.7 +- Initial CBL-Mariner import from openSUSE Tumbleweed (license: same as "License" tag). +- License verified + +* Mon Feb 21 2022 Dirk Stoecker +- fix CVE-2022-0699, patch c75b9281a5b9452d92e1682bdfe6019a13ed819f.diff + +* Sat Mar 30 2019 Atri Bhattacharya +- Update to version 1.5.0: + * shpopen.c: resync with GDAL internal shapelib to avoid being + dependent on correctness of file size field in .shp. Fixes + https://lists.osgeo.org/pipermail/gdal-dev/2018-October/049218.html + * contrib/shpgeo.h/.c: Remove PROJ.4 dependency and + functionality, causing removal of SHPProject(), + SHPSetProjection() and SHPFreeProjection() + * contrib/shpproj.c: removed + shpopen.c, dbfopen.c, shptree.c, sbnsearch.c: resyc with GDAL + internal shapelib. Mostly to allow building those files as C++ + without warning. Also add FTDate entry in DBFFieldType (see + https://github.com/OSGeo/gdal/pull/308). And some other code + cleanups + * dbfopen.c: fix a bug where the end of file character was + written on top of the first character of the first field name + when deleting a field on a .dbf without records. Fixes + https://github.com/OSGeo/gdal/issues/863 + * safileio.c: remove duplicate test. Patch by Jaroslav Fojtik. + Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2744 +- Rebase rpmlint-errors.patch for current version. +- Drop proj4 Requires and BuildRequires: functionality dropped by + upstream. + +* Wed Jul 25 2018 mpluskal@suse.com +- Update to version 1.4.1: + * See ChangeLog for details +- Drop no longer needed patches: + * shapelib_autotools.patch + * shapelib_backports.patch +- Refresh rpmlint-errors.patch + +* Fri May 29 2015 tchvatal@suse.com +- Add patch to fix bunch of rpmlint errors: + * rpmlint-errors.patch +- Refresh autotools patch to actually pass the testsuite: + * shapelib_autotools.patch + +* Thu May 28 2015 dgutu@suse.com +- Re-enabled the post build check now everything fails because of + coding issues +- This needs to be fixed not hidden + +* Wed May 27 2015 dgutu@suse.com +- Called spec-cleaner against spec file + +* Wed May 28 2014 asterios.dramis@gmail.com +- Update to version 1.3.0: + * See ChangeLog for details. +- Corrected the Name: entry in the spec file from libshp1 to shapelib (same as + spec file name and package name). +- Changed License to "(LGPL-2.0+ or MIT) and GPL-2.0+ and SUSE-Public-Domain". +- Removed shapelib-endian-destdir-combined.diff and shapelib-fix-contrib.diff + patches (not needed anymore). +- Added two patches (taken from Fedora): + * shapelib_autotools.patch (Use autotools) + * shapelib_backports.patch (Backport some fixes from the gdal bundled + shapelib) +- Removed gcc and make build requirements (not needed). +- Added gcc-c++ and pkg-config build requirements. + +* Tue Apr 2 2013 opensuse@dstoecker.de +- fix license + +* Mon Jul 21 2008 Dirk Stöcker +- some BuildService and rpmlint fixes + Wed Jan 11 00:00:00 UTC 2006 Pascal Bleser +- added fixing of libshp.la file ("installed=no" -> "installed=yes") + Wed Jan 11 00:00:00 UTC 2006 Pascal Bleser +- new package diff --git a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md index 49efcfacca4..b42c2a06fc7 100644 --- a/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md +++ b/SPECS/LICENSES-AND-NOTICES/LICENSES-MAP.md @@ -15,7 +15,7 @@ The CBL-Mariner SPEC files originated from a variety of sources with varying lic | NVIDIA | [ASL 2.0 License and spec specific licenses](http://www.apache.org/licenses/LICENSE-2.0) | knem
libnvidia-container
mlnx-ofa_kernel
mlnx-tools
mlx-bootctl
nvidia-container-runtime
nvidia-container-toolkit
nvidia-docker2
ofed-scripts
perftest | | OpenEuler | [BSD-3 License](https://github.com/pytorch/pytorch/blob/master/LICENSE) | pytorch | | OpenMamba | [Openmamba GPLv2 License](https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt) | bash-completion | -| OpenSUSE | Following [openSUSE guidelines](https://en.opensuse.org/openSUSE:Specfile_guidelines#Specfile_Licensing) | ant
ant-junit
antlr
aopalliance
apache-commons-beanutils
apache-commons-cli
apache-commons-codec
apache-commons-collections
apache-commons-collections4
apache-commons-compress
apache-commons-daemon
apache-commons-dbcp
apache-commons-digester
apache-commons-httpclient
apache-commons-io
apache-commons-jexl
apache-commons-lang
apache-commons-lang3
apache-commons-logging
apache-commons-net
apache-commons-pool
apache-commons-pool2
apache-commons-validator
apache-commons-vfs2
apache-parent
args4j
atinject
base64coder
bazel-workspaces
bcel
bea-stax
beust-jcommander
bsf
byaccj
cal10n
cdparanoia
cglib
cni
containerized-data-importer
cpulimit
cri-o
ecj
fillup
flux
gd
geronimo-specs
glassfish-annotation-api
glassfish-servlet-api
gnu-getopt
gnu-regexp
golang-packaging
guava
guava20
hamcrest
hawtjni-runtime
httpcomponents-core
influx-cli
influxdb
isorelax
jakarta-taglibs-standard
jansi
jarjar
java-cup
java-cup-bootstrap
javacc
javacc-bootstrap
javassist
jboss-interceptors-1.2-api
jdepend
jflex
jflex-bootstrap
jlex
jline
jna
jsch
jsoup
jsr-305
jtidy
junit
junitperf
jzlib
kubevirt
kured
libcontainers-common
libtheora
libva
libvdpau
lynx
maven-parent
multus
objectweb-anttask
objectweb-asm
objenesis
oro
osgi-annotation
osgi-compendium
osgi-core
patterns-ceph-containers
plexus-classworlds
plexus-interpolation
plexus-pom
plexus-utils
proj
psl-make-dafsa
publicsuffix
qdox
regexp
relaxngDatatype
rhino
ripgrep
rook
servletapi4
servletapi5
slf4j
trilead-ssh2
xalan-j2
xbean
xcursor-themes
xerces-j2
xml-commons-apis
xml-commons-resolver
xmldb-api
xmlrpc-c
xmlunit
xpp2
xpp3
xz-java | +| OpenSUSE | Following [openSUSE guidelines](https://en.opensuse.org/openSUSE:Specfile_guidelines#Specfile_Licensing) | ant
ant-junit
antlr
aopalliance
apache-commons-beanutils
apache-commons-cli
apache-commons-codec
apache-commons-collections
apache-commons-collections4
apache-commons-compress
apache-commons-daemon
apache-commons-dbcp
apache-commons-digester
apache-commons-httpclient
apache-commons-io
apache-commons-jexl
apache-commons-lang
apache-commons-lang3
apache-commons-logging
apache-commons-net
apache-commons-pool
apache-commons-pool2
apache-commons-validator
apache-commons-vfs2
apache-parent
args4j
atinject
base64coder
bazel-workspaces
bcel
bea-stax
beust-jcommander
bsf
byaccj
cal10n
cdparanoia
cglib
cni
containerized-data-importer
cpulimit
cri-o
ecj
fillup
flux
gd
geronimo-specs
glassfish-annotation-api
glassfish-servlet-api
gnu-getopt
gnu-regexp
golang-packaging
guava
guava20
hamcrest
hawtjni-runtime
httpcomponents-core
influx-cli
influxdb
isorelax
jakarta-taglibs-standard
jansi
jarjar
java-cup
java-cup-bootstrap
javacc
javacc-bootstrap
javassist
jboss-interceptors-1.2-api
jdepend
jflex
jflex-bootstrap
jlex
jline
jna
jsch
jsoup
jsr-305
jtidy
junit
junitperf
jzlib
kubevirt
kured
libcontainers-common
libtheora
libva
libvdpau
lynx
maven-parent
multus
objectweb-anttask
objectweb-asm
objenesis
oro
osgi-annotation
osgi-compendium
osgi-core
patterns-ceph-containers
plexus-classworlds
plexus-interpolation
plexus-pom
plexus-utils
proj
psl-make-dafsa
publicsuffix
qdox
regexp
relaxngDatatype
rhino
ripgrep
rook
servletapi4
servletapi5
shapelib
slf4j
trilead-ssh2
xalan-j2
xbean
xcursor-themes
xerces-j2
xml-commons-apis
xml-commons-resolver
xmldb-api
xmlrpc-c
xmlunit
xpp2
xpp3
xz-java | | Photon | [Photon License](LICENSE-PHOTON.md) and [Photon Notice](NOTICE.APACHE2).
Also see [LICENSE-EXCEPTIONS.PHOTON](LICENSE-EXCEPTIONS.PHOTON). | acl
alsa-lib
alsa-utils
ansible
apparmor
apr
apr-util
asciidoc
atftp
audit
autoconf
autoconf-archive
autofs
autogen
automake
babel
bash
bc
bcc
bind
binutils
bison
blktrace
boost
bridge-utils
btrfs-progs
bubblewrap
build-essential
bzip2
c-ares
cairo
cassandra
cdrkit
check
chkconfig
chrpath
cifs-utils
clang
clang16
cloud-init
cloud-utils-growpart
cmake
cni-plugins
core-packages
coreutils
cpio
cppunit
cracklib
crash
crash-gcore-command
createrepo_c
cri-tools
cronie
curl
cyrus-sasl
cyrus-sasl-bootstrap
dbus
dbus-glib
dejagnu
device-mapper-multipath
dhcp
dialog
diffutils
dkms
dmidecode
dnsmasq
docbook-dtd-xml
docbook-style-xsl
dosfstools
dracut
dstat
e2fsprogs
ed
efibootmgr
efivar
elfutils
emacs
erlang
etcd-3.5.0
etcd-3.5.1
etcd-3.5.3
etcd-3.5.4
etcd-3.5.5
etcd-3.5.6
ethtool
expat
expect
fcgi
file
filesystem
findutils
finger
flex
fontconfig
fping
freetype
fuse
gawk
gc
gcc
gdb
gdbm
gettext
git
git-lfs
glib
glib-networking
glibc
glibmm
glide
gmp
gnome-common
gnupg2
gnuplot
gnutls
gobject-introspection
golang
golang-1.17
golang-1.18
gperf
gperftools
gpgme
gptfdisk
grep
groff
grub2
gtest
gtk-doc
guile
gzip
haproxy
harfbuzz
haveged
hdparm
http-parser
httpd
i2c-tools
iana-etc
icu
initramfs
initscripts
inotify-tools
intltool
iotop
iperf3
iproute
ipset
iptables
iputils
ipvsadm
ipxe
irqbalance
itstool
jansson
jq
json-c
json-glib
kbd
keepalived
kernel
kernel-azure
kernel-hci
kernel-headers
kernel-mshv
kernel-rt
kernel-uvm
keyutils
kmod
krb5
less
libaio
libarchive
libassuan
libatomic_ops
libcap
libcap-ng
libconfig
libdb
libdnet
libedit
libestr
libevent
libfastjson
libffi
libgcrypt
libgpg-error
libgssglue
libgsystem
libgudev
libjpeg-turbo
libksba
liblogging
libmbim
libmnl
libmodulemd
libmpc
libmspack
libndp
libnetfilter_conntrack
libnetfilter_cthelper
libnetfilter_cttimeout
libnetfilter_queue
libnfnetlink
libnftnl
libnl3
libnsl2
libpcap
libpipeline
libpng
libpsl
libqmi
librelp
librepo
librsync
libseccomp
libselinux
libsepol
libserf
libsigc++30
libsolv
libsoup
libssh2
libtalloc
libtar
libtasn1
libtiff
libtirpc
libtool
libunistring
libunwind
libusb
libvirt
libwebp
libxml2
libxslt
libyaml
linux-firmware
lldb
lldpad
llvm
llvm16
lm-sensors
lmdb
log4cpp
logrotate
lshw
lsof
lsscsi
ltrace
lttng-tools
lttng-ust
lvm2
lz4
lzo
m2crypto
m4
make
man-db
man-pages
mariadb
maven
mc
mercurial
meson
mlocate
ModemManager
mozjs
mpfr
msft-golang
msr-tools
mysql
nano
nasm
ncurses
ndctl
net-snmp
net-tools
nettle
newt
nfs-utils
nghttp2
nginx
ninja-build
nodejs
nodejs18
npth
nspr
nss
nss-altfiles
ntp
numactl
nvme-cli
oniguruma
OpenIPMI
openldap
openscap
openssh
openvswitch
ostree
pam
pango
parted
patch
pciutils
pcre
perl-Canary-Stability
perl-CGI
perl-common-sense
perl-Crypt-SSLeay
perl-DBD-SQLite
perl-DBI
perl-DBIx-Simple
perl-Exporter-Tiny
perl-File-HomeDir
perl-File-Which
perl-IO-Socket-SSL
perl-JSON-Any
perl-JSON-XS
perl-libintl-perl
perl-List-MoreUtils
perl-Module-Build
perl-Module-Install
perl-Module-ScanDeps
perl-Net-SSLeay
perl-NetAddr-IP
perl-Object-Accessor
perl-Path-Class
perl-Try-Tiny
perl-Types-Serialiser
perl-WWW-Curl
perl-XML-Parser
perl-YAML
perl-YAML-Tiny
pgbouncer
pinentry
polkit
popt
postgresql
procps-ng
protobuf
protobuf-c
psmisc
pth
pyasn1-modules
pyOpenSSL
PyPAM
pyparsing
pytest
python-appdirs
python-asn1crypto
python-atomicwrites
python-attrs
python-bcrypt
python-certifi
python-cffi
python-chardet
python-configobj
python-constantly
python-coverage
python-cryptography
python-daemon
python-dateutil
python-defusedxml
python-distro
python-docopt
python-docutils
python-ecdsa
python-gevent
python-hyperlink
python-hypothesis
python-idna
python-imagesize
python-incremental
python-iniparse
python-ipaddr
python-jinja2
python-jmespath
python-jsonpatch
python-jsonpointer
python-jsonschema
python-lockfile
python-lxml
python-m2r
python-mako
python-markupsafe
python-mistune
python-msgpack
python-netaddr
python-netifaces
python-ntplib
python-oauthlib
python-packaging
python-pam
python-pbr
python-ply
python-prettytable
python-psutil
python-psycopg2
python-py
python-pyasn1
python-pycodestyle
python-pycparser
python-pycurl
python-pygments
python-pynacl
python-requests
python-setuptools_scm
python-simplejson
python-six
python-snowballstemmer
python-sphinx-theme-alabaster
python-twisted
python-urllib3
python-vcversioner
python-virtualenv
python-wcwidth
python-webob
python-websocket-client
python-werkzeug
python-zope-interface
python3
pytz
PyYAML
rapidjson
readline
redis
rng-tools
rpcbind
rpcsvc-proto
rpm
rpm-ostree
rrdtool
rsync
rsyslog
ruby
rust
scons
sed
sg3_utils
shadow-utils
slang
snappy
socat
sqlite
sshpass
strace
strongswan
subversion
sudo
swig
syslinux
syslog-ng
sysstat
systemd
systemd-bootstrap
systemtap
tar
tboot
tcl
tcpdump
tcsh
tdnf
telegraf
texinfo
tmux
tpm2-abrmd
tpm2-tools
tpm2-tss
traceroute
tree
trousers
tzdata
unbound
unixODBC
unzip
usbutils
userspace-rcu
utf8proc
util-linux
valgrind
vim
vsftpd
WALinuxAgent
wget
which
wpa_supplicant
xfsprogs
xinetd
xmlsec1
xmlto
xz
zchunk
zeromq
zip
zlib
zsh | | RPM software management source | [GPLv2+ License](https://github.com/rpm-software-management/dnf5/blob/main/COPYING.md) | dnf5 | | Sysbench source | [GPLv2+ License](https://github.com/akopytov/sysbench/blob/master/COPYING) | sysbench | diff --git a/SPECS/LICENSES-AND-NOTICES/data/licenses.json b/SPECS/LICENSES-AND-NOTICES/data/licenses.json index 81df8fab799..028edb6aa63 100644 --- a/SPECS/LICENSES-AND-NOTICES/data/licenses.json +++ b/SPECS/LICENSES-AND-NOTICES/data/licenses.json @@ -2562,6 +2562,7 @@ "rook", "servletapi4", "servletapi5", + "shapelib", "slf4j", "trilead-ssh2", "xalan-j2", diff --git a/cgmanifest.json b/cgmanifest.json index 8177c11003f..6619ca95411 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -27612,6 +27612,16 @@ } } }, + { + "component": { + "type": "other", + "other": { + "name": "shapelib", + "version": "1.5.0", + "downloadUrl": "https://download.osgeo.org/shapelib/shapelib-1.5.0.tar.gz" + } + } + }, { "component": { "type": "other", From 7d7fe51664693d07acebc95aae746e7b8fb1e21e Mon Sep 17 00:00:00 2001 From: Daniel McIlvaney Date: Thu, 31 Aug 2023 18:27:47 -0700 Subject: [PATCH 52/64] Fix parsing of releases containing '_' (#6127) * Fix parsing of releases containing '_' --- .../tools/pkg/rpmssnapshot/rpmssnapshot.go | 4 +- .../pkg/rpmssnapshot/rpmssnapshot_test.go | 77 +++++++++++++++++++ 2 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 toolkit/tools/pkg/rpmssnapshot/rpmssnapshot_test.go diff --git a/toolkit/tools/pkg/rpmssnapshot/rpmssnapshot.go b/toolkit/tools/pkg/rpmssnapshot/rpmssnapshot.go index d4339b2cbeb..a875a4fd0f8 100644 --- a/toolkit/tools/pkg/rpmssnapshot/rpmssnapshot.go +++ b/toolkit/tools/pkg/rpmssnapshot/rpmssnapshot.go @@ -39,12 +39,12 @@ const ( // // ^(.*) <-- [index 1] package name // - <-- second-to-last hyphen separating the package name from its version -// ([^-]+-\d+) <-- [index 2] package version and package release number connected by the last hyphen +// ([^-]+-[^-]+) <-- [index 2] package version and package release number connected by the last hyphen // \. <-- second-to-last period separating the package release number from the distribution tag // ([^.]+) <-- [index 3] the distribution tag // \. <-- last period separating the distribution tag from the architecture string // ([^.]+)$ <-- [index 4] the architecture string -var rpmSpecBuiltRPMRegex = regexp.MustCompile(`^(.*)-([^-]+-\d+)\.([^.]+)\.([^.]+)$`) +var rpmSpecBuiltRPMRegex = regexp.MustCompile(`^(.*)-([^-]+-[^-]+)\.([^.]+)\.([^.]+)$`) const ( rpmSpecBuiltRPMRegexNameIndex = iota + 1 diff --git a/toolkit/tools/pkg/rpmssnapshot/rpmssnapshot_test.go b/toolkit/tools/pkg/rpmssnapshot/rpmssnapshot_test.go new file mode 100644 index 00000000000..bfacf565adf --- /dev/null +++ b/toolkit/tools/pkg/rpmssnapshot/rpmssnapshot_test.go @@ -0,0 +1,77 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +// A tool for generating snapshots of built RPMs from local specs. + +package rpmssnapshot + +import ( + "testing" + + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/packagerepo/repocloner" + "github.com/stretchr/testify/assert" +) + +func TestRegexBasic(t *testing.T) { + input := "pkg-1.2.3-1.cm2.x86_64" + expectedResults := []string{"pkg", "1.2.3-1", "cm2", "x86_64"} + expectedMatchNumber := 5 + + matches := rpmSpecBuiltRPMRegex.FindStringSubmatch(input) + assert.Equal(t, expectedMatchNumber, len(matches)) + + assert.Equal(t, expectedResults[0], matches[rpmSpecBuiltRPMRegexNameIndex]) + assert.Equal(t, expectedResults[1], matches[rpmSpecBuiltRPMRegexVersionIndex]) + assert.Equal(t, expectedResults[2], matches[rpmSpecBuiltRPMRegexDistributionIndex]) + assert.Equal(t, expectedResults[3], matches[rpmSpecBuiltRPMRegexArchitectureIndex]) +} + +func TestRegexUnderscore(t *testing.T) { + input := "pkg-1.2.3-1_2.3.cm2.x86_64" + expectedResults := []string{"pkg", "1.2.3-1_2.3", "cm2", "x86_64"} + expectedMatchNumber := 5 + + matches := rpmSpecBuiltRPMRegex.FindStringSubmatch(input) + assert.Equal(t, expectedMatchNumber, len(matches)) + + assert.Equal(t, expectedResults[0], matches[rpmSpecBuiltRPMRegexNameIndex]) + assert.Equal(t, expectedResults[1], matches[rpmSpecBuiltRPMRegexVersionIndex]) + assert.Equal(t, expectedResults[2], matches[rpmSpecBuiltRPMRegexDistributionIndex]) + assert.Equal(t, expectedResults[3], matches[rpmSpecBuiltRPMRegexArchitectureIndex]) +} + +func TestGenerateResults(t *testing.T) { + input := []string{ + "pkg-1.2.3-1_2.3.cm2.x86_64", + "other-pkg-1.2.3-1_2.3.cm2.x86_64", + } + expectedResults := repocloner.RepoContents{ + Repo: []*repocloner.RepoPackage{ + { + Name: "pkg", + Version: "1.2.3-1_2.3", + Distribution: "cm2", + Architecture: "x86_64", + }, + { + Name: "other-pkg", + Version: "1.2.3-1_2.3", + Distribution: "cm2", + Architecture: "x86_64", + }, + }, + } + emptySnapshotGenerator := SnapshotGenerator{} + generatedContents, err := emptySnapshotGenerator.convertResultsToRepoContents(input) + assert.NoError(t, err) + assert.Equal(t, expectedResults, generatedContents) +} + +func TestGenerateInvalidInput(t *testing.T) { + input := []string{ + "pkg-no-version", + } + emptySnapshotGenerator := SnapshotGenerator{} + _, err := emptySnapshotGenerator.convertResultsToRepoContents(input) + assert.EqualError(t, err, "RPM package name ("+input[0]+") doesn't match the regular expression ("+rpmSpecBuiltRPMRegex.String()+")") +} From ddfed35052d7c855eae15a616444ef11c637030b Mon Sep 17 00:00:00 2001 From: Christopher Co <35273088+christopherco@users.noreply.github.com> Date: Thu, 31 Aug 2023 20:57:51 -0700 Subject: [PATCH 53/64] feat: add Azure Marketplace Gen1 FIPS definition (#6120) This commit adds a new Azure VM Gen1 image with FIPS enabled by default. This image definition is identical to the current marketplace gen1 image definition, except for the following specific changes: 1. Include the fips-packages.json package list before the initramfs package in the overall package list 2. Set KernelCommandLine.EnableFIPS to true, to inform image generation tools to enable FIPS during image creation 3. Set basename for image as "cblmariner-gen1-fips" Signed-off-by: Chris Co --- .../imageconfigs/marketplace-gen1-fips.json | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 toolkit/imageconfigs/marketplace-gen1-fips.json diff --git a/toolkit/imageconfigs/marketplace-gen1-fips.json b/toolkit/imageconfigs/marketplace-gen1-fips.json new file mode 100644 index 00000000000..e2b48884455 --- /dev/null +++ b/toolkit/imageconfigs/marketplace-gen1-fips.json @@ -0,0 +1,80 @@ +{ + "Disks": [ + { + "PartitionTableType": "gpt", + "MaxSize": 5000, + "Artifacts": [ + { + "Name": "cblmariner-gen1-fips", + "Type": "vhd" + } + ], + "Partitions": [ + { + "ID": "reserved", + "Flags": [ + "grub" + ], + "Start": 1, + "End": 9, + "FsType": "fat32" + }, + { + "ID": "boot", + "Start": 9, + "End": 509, + "FsType": "ext4" + }, + { + "ID": "rootfs", + "Start": 509, + "End": 0, + "FsType": "ext4" + } + ] + } + ], + "SystemConfigs": [ + { + "Name": "Standard", + "BootType": "legacy", + "PartitionSettings": [ + { + "ID": "reserved", + "MountPoint": "" + }, + { + "ID": "boot", + "MountPoint": "/boot" + }, + { + "ID": "rootfs", + "MountPoint": "/" + } + ], + "PackageLists": [ + "packagelists/fips-packages.json", + "packagelists/core-packages-image.json", + "packagelists/marketplace-tools-packages.json", + "packagelists/azurevm-packages.json" + ], + "AdditionalFiles": { + "additionalconfigs/cloud-init.cfg": "/etc/cloud/cloud.cfg", + "additionalconfigs/chrony.cfg": "/etc/chrony.conf" + }, + "PostInstallScripts": [ + { + "Path": "additionalconfigs/configure-image.sh" + } + ], + "KernelOptions": { + "default": "kernel" + }, + "KernelCommandLine": { + "EnableFIPS": true, + "ExtraCommandLine": "console=ttyS0" + }, + "Hostname": "cbl-mariner" + } + ] +} From 89a738123c1ae478a268013d1033ac4f33b0b6d6 Mon Sep 17 00:00:00 2001 From: Christopher Co <35273088+christopherco@users.noreply.github.com> Date: Thu, 31 Aug 2023 21:29:26 -0700 Subject: [PATCH 54/64] feat: add Azure Marketplace Gen2 FIPS definition (#6102) This commit adds a new Azure VM Gen2 image with FIPS enabled by default. This image definition is identical to the current marketplace gen2 image definition, except for the following specific changes: 1. Include the fips-packages.json package list before the initramfs package in the overall package list 2. Set KernelCommandLine.EnableFIPS to true, to inform image generation tools to enable FIPS during image creation 3. Set basename for image as "cblmariner-gen2-fips" Signed-off-by: Chris Co --- .../imageconfigs/marketplace-gen2-fips.json | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 toolkit/imageconfigs/marketplace-gen2-fips.json diff --git a/toolkit/imageconfigs/marketplace-gen2-fips.json b/toolkit/imageconfigs/marketplace-gen2-fips.json new file mode 100644 index 00000000000..cd281ccba46 --- /dev/null +++ b/toolkit/imageconfigs/marketplace-gen2-fips.json @@ -0,0 +1,83 @@ +{ + "Disks": [ + { + "PartitionTableType": "gpt", + "MaxSize": 5000, + "Artifacts": [ + { + "Name": "cblmariner-gen2-fips", + "Type": "vhd" + } + ], + "Partitions": [ + { + "ID": "efi", + "Flags": [ + "esp", + "boot" + ], + "Start": 1, + "End": 65, + "FsType": "fat32" + }, + { + "ID": "boot", + "Start": 65, + "End": 565, + "FsType": "ext4" + }, + { + "ID": "rootfs", + "Name": "rootfs", + "Start": 565, + "End": 0, + "FsType": "ext4" + } + ] + } + ], + "SystemConfigs": [ + { + "Name": "Standard", + "BootType": "efi", + "PartitionSettings": [ + { + "ID": "efi", + "MountPoint": "/boot/efi", + "MountOptions" : "umask=0077" + }, + { + "ID": "boot", + "MountPoint": "/boot" + }, + { + "ID": "rootfs", + "MountPoint": "/" + } + ], + "PackageLists": [ + "packagelists/fips-packages.json", + "packagelists/core-packages-image.json", + "packagelists/marketplace-tools-packages.json", + "packagelists/azurevm-packages.json" + ], + "AdditionalFiles": { + "additionalconfigs/cloud-init.cfg": "/etc/cloud/cloud.cfg", + "additionalconfigs/chrony.cfg": "/etc/chrony.conf" + }, + "PostInstallScripts": [ + { + "Path": "additionalconfigs/configure-image.sh" + } + ], + "KernelOptions": { + "default": "kernel" + }, + "KernelCommandLine": { + "EnableFIPS": true, + "ExtraCommandLine": "console=ttyS0" + }, + "Hostname": "cbl-mariner" + } + ] +} From 5a25d347f7544d4069a755c223d5a68bada76fd0 Mon Sep 17 00:00:00 2001 From: Pawel Winogrodzki Date: Thu, 31 Aug 2023 22:41:28 -0700 Subject: [PATCH 55/64] Fixed tarball generations for incremental toolchain builds. (#6126) --- toolkit/scripts/toolchain/build_mariner_toolchain.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolkit/scripts/toolchain/build_mariner_toolchain.sh b/toolkit/scripts/toolchain/build_mariner_toolchain.sh index ff2bf178cea..e7fbc3cd1f8 100755 --- a/toolkit/scripts/toolchain/build_mariner_toolchain.sh +++ b/toolkit/scripts/toolchain/build_mariner_toolchain.sh @@ -72,7 +72,7 @@ if [ "$INCREMENTAL_TOOLCHAIN" = "y" ]; then tar -C "$MARINER_BUILD_DIR"/toolchain/built_rpms_all \ -T "$MARINER_BUILD_DIR"/logs/toolchain/built_rpms_list.txt \ - -cvf "$MARINER_BUILD_DIR"/toolchain/toolchain_built_rpms_delta.tar.gz + -czvf "$MARINER_BUILD_DIR"/toolchain/toolchain_built_rpms_delta.tar.gz fi echo Printing list of built toolchain RPMS: From c97ac8a4d98bc007b8f14469874555c345c38ce7 Mon Sep 17 00:00:00 2001 From: sindhu-karri <33163197+sindhu-karri@users.noreply.github.com> Date: Fri, 1 Sep 2023 11:34:24 +0530 Subject: [PATCH 56/64] Grapher resolves cyclic dependencies from remote repos (#5572) * add flag for grapher to resolve cycles by downloading RPM from repos in repolist add flag to clear version. replace run node with remote node in lookupTable for graphpkgfetcher send cloner object instead of multiple parameters * add info to show cycle resolution and use pre-allocated array instead of counted size * preallocate nodes instead of getting actual count and add info stmt * Avoid clearing version in original node * use a different directory for saving chroot * revert new NodeTypes * Revert "Avoid clearing version in original node" This reverts commit e1f17452dbd0df2c5e17109fb3c5b8085cee57d3. * graphpkgfetcher satisfy with fetched packages * clear version only if package cannot be found with version * add Info stmt to show how cycle is fixed * use rpmsprovidedbySRPM * Revert "use rpmsprovidedbySRPM" This reverts commit 571e5be0d7ddb6819ecf998f5397dc46eabf805c. * Revert "graphpkgfetcher satisfy with fetched packages" This reverts commit 162882f0d41691011ac9bec4c82fc30aac37097f. * Revert "Revert "Avoid clearing version in original node"" This reverts commit e36664cf5214aa7b180a369f42a0a9e05e41c13d. * introduce clonerErr to avoid it tamper the return error * sort is not deferred when adding remote node to lookup table Co-authored-by: Daniel McIlvaney * do not defer sort when adding remote node to lookup table Co-authored-by: Daniel McIlvaney * remove packageURLlist from grapher * add disableDefaultrepos flag to grapher * split MakeDAG * continue on clonerErr Co-authored-by: Pawel Winogrodzki * continue early if not buildToRunEdge * function and arg name changes in replaceCurrentRunNodeWithNewNode * return error from addRemoteToLookup if tried to add a nonRemote Node * use proper tmp dir for grapher worker_chroot Co-authored-by: Pawel Winogrodzki * drop extra debug print * Try to break cycle with prebuilt RPMs before ignoring version * Panic if AddRemoteToLookup is called with a non-remote node * Remove debug function - printLookupTable * Break inconsistancy in scheduler Call AddRunToLookup in scheduler.go to avoid inconsistency of the LookupTable * Update toolkit/tools/internal/pkggraph/pkggraph.go Co-authored-by: Pawel Winogrodzki * Update toolkit/tools/grapher/grapher.go Co-authored-by: Pawel Winogrodzki * Address review comments to * Functionalize the breaking cycle using upstream at a particular node * Update function namereplaceCurrentRunNodeWithNewNode to meaningful replaceSRPMBuildDependency * Update proper name in function call * Update toolkit/tools/internal/pkggraph/pkggraph.go Co-authored-by: Pawel Winogrodzki * Return proper error message from fixCyclesWithExistingRPMS * Remove Add*ToLookup APIs * Replace AllRunNodes with AllPreferredRunNodes and make AllRunNodes travers the entire graph * Elaborate comments for AllPreferredRunNodes * Adding suggestions. * Remove unnecessary assignment in pkggraph.go --------- Co-authored-by: Sindhu Karri Co-authored-by: Daniel McIlvaney Co-authored-by: Pawel Winogrodzki Co-authored-by: Bala Co-authored-by: Bala --- toolkit/Makefile | 60 +++--- toolkit/scripts/pkggen.mk | 29 ++- toolkit/tools/depsearch/depsearch.go | 4 +- toolkit/tools/grapher/grapher.go | 49 ++++- toolkit/tools/internal/pkggraph/pkggraph.go | 198 +++++++++++++++--- .../tools/internal/pkggraph/pkggraph_test.go | 2 +- toolkit/tools/scheduler/scheduler.go | 2 +- .../schedulerutils/implicitprovides.go | 4 +- 8 files changed, 271 insertions(+), 77 deletions(-) diff --git a/toolkit/Makefile b/toolkit/Makefile index a6f4eabc14b..4eeda0c35db 100644 --- a/toolkit/Makefile +++ b/toolkit/Makefile @@ -33,37 +33,39 @@ include $(SCRIPTS_DIR)/incremental_building.mk ######## SET REMAINING FLAGS ######## -UPDATE_TOOLCHAIN_LIST ?= n -REBUILD_PACKAGES ?= y -DOWNLOAD_SRPMS ?= n -ALLOW_SRPM_DOWNLOAD_FAIL ?= n -RUN_CHECK ?= n -USE_PREVIEW_REPO ?= n -DISABLE_UPSTREAM_REPOS ?= n -DISABLE_DEFAULT_REPOS ?= n -TOOLCHAIN_CONTAINER_ARCHIVE ?= -TOOLCHAIN_ARCHIVE ?= -TOOLCHAIN_SOURCES_ARCHIVE ?= -CACHE_DIR ?= -PACKAGE_CACHE_SUMMARY ?= -IMAGE_CACHE_SUMMARY ?= -INITRD_CACHE_SUMMARY ?= -PACKAGE_ARCHIVE ?= -PACKAGE_BUILD_RETRIES ?= 1 -CHECK_BUILD_RETRIES ?= 1 -REFRESH_WORKER_CHROOT ?= y +UPDATE_TOOLCHAIN_LIST ?= n +REBUILD_PACKAGES ?= y +DOWNLOAD_SRPMS ?= n +ALLOW_SRPM_DOWNLOAD_FAIL ?= n +RUN_CHECK ?= n +USE_PREVIEW_REPO ?= n +DISABLE_UPSTREAM_REPOS ?= n +DISABLE_DEFAULT_REPOS ?= n +TOOLCHAIN_CONTAINER_ARCHIVE ?= +TOOLCHAIN_ARCHIVE ?= +TOOLCHAIN_SOURCES_ARCHIVE ?= +CACHE_DIR ?= +PACKAGE_CACHE_SUMMARY ?= +IMAGE_CACHE_SUMMARY ?= +INITRD_CACHE_SUMMARY ?= +PACKAGE_ARCHIVE ?= +PACKAGE_BUILD_RETRIES ?= 1 +CHECK_BUILD_RETRIES ?= 1 +REFRESH_WORKER_CHROOT ?= y # Set to 0 to use the number of logical CPUs. -CONCURRENT_PACKAGE_BUILDS ?= 0 +CONCURRENT_PACKAGE_BUILDS ?= 0 # Set to 0 to print all available results. -NUM_OF_ANALYTICS_RESULTS ?= 10 -CLEANUP_PACKAGE_BUILDS ?= y -USE_PACKAGE_BUILD_CACHE ?= y -REBUILD_DEP_CHAINS ?= y -HYDRATED_BUILD ?= n -TARGET_ARCH ?= -ALLOW_TOOLCHAIN_REBUILDS ?= n -CACHED_PACKAGES_ARCHIVE ?= -USE_CCACHE ?= n +NUM_OF_ANALYTICS_RESULTS ?= 10 +CLEANUP_PACKAGE_BUILDS ?= y +USE_PACKAGE_BUILD_CACHE ?= y +REBUILD_DEP_CHAINS ?= y +HYDRATED_BUILD ?= n +TARGET_ARCH ?= +ALLOW_TOOLCHAIN_REBUILDS ?= n +RESOLVE_CYCLES_FROM_UPSTREAM ?= n +IGNORE_VERSION_TO_RESOLVE_SELFDEP ?= n +CACHED_PACKAGES_ARCHIVE ?= +USE_CCACHE ?= n # Tracing & Profiling support: https://go.dev/doc/diagnostics ENABLE_CPU_PROFILE ?= n diff --git a/toolkit/scripts/pkggen.mk b/toolkit/scripts/pkggen.mk index 194a3fe8a1d..8aef7095e2e 100644 --- a/toolkit/scripts/pkggen.mk +++ b/toolkit/scripts/pkggen.mk @@ -24,6 +24,7 @@ pkggen_rpms = $(call shell_real_build_only, find $(RPMS_DIR)/* 2>/dev/null # Pkggen workspace cache_working_dir = $(PKGBUILD_DIR)/tdnf_cache_worker +grapher_working_dir = $(PKGBUILD_DIR)/grapher_cache_worker parse_working_dir = $(BUILD_DIR)/spec_parsing rpmbuilding_logs_dir = $(LOGS_DIR)/pkggen/rpmbuilding remote_rpms_cache_dir = $(CACHED_RPMS_DIR)/cache @@ -42,13 +43,16 @@ logging_command = --log-file=$(LOGS_DIR)/pkggen/workplan/$(notdir $@).log --log- $(call create_folder,$(LOGS_DIR)/pkggen/workplan) $(call create_folder,$(rpmbuilding_logs_dir)) -.PHONY: clean-workplan clean-cache clean-cache-worker clean-spec-parse clean-ccache graph-cache analyze-built-graph workplan +.PHONY: clean-workplan clean-cache clean-cache-worker clean-grapher-cache-worker clean-spec-parse clean-ccache graph-cache analyze-built-graph workplan graph-cache: $(cached_file) workplan: $(graph_file) clean: clean-workplan clean-cache clean-spec-parse clean-workplan: clean-cache clean-spec-parse rm -rf $(PKGBUILD_DIR) rm -rf $(LOGS_DIR)/pkggen/workplan +clean-grapher-cache-worker: + $(SCRIPTS_DIR)/safeunmount.sh "$(grapher_working_dir)" && \ + rm -rf $(grapher_working_dir) clean-cache-worker: $(SCRIPTS_DIR)/safeunmount.sh "$(cache_working_dir)" && \ rm -rf $(cache_working_dir) @@ -103,9 +107,15 @@ $(specs_file): $(chroot_worker) $(SPECS_DIR) $(build_specs) $(build_spec_dirs) $ $(if $(TARGET_ARCH),--target-arch="$(TARGET_ARCH)") \ --output $@ +ifeq ($(RESOLVE_CYCLES_FROM_UPSTREAM),y) + ifeq ($(DISABLE_UPSTREAM_REPOS),y) + $(error RESOLVE_CYCLES_FROM_UPSTREAM requires upstream repos to be enabled. Please set DISABLE_UPSTREAM_REPOS=n) + endif +endif + # Convert the dependency information in the json file into a graph structure # We require all the toolchain RPMs to be available here to help resolve unfixable cyclic dependencies -$(graph_file): $(specs_file) $(go-grapher) $(toolchain_rpms) +$(graph_file): $(specs_file) $(go-grapher) $(toolchain_rpms) $(TOOLCHAIN_MANIFEST) $(pkggen_local_repo) $(graphpkgfetcher_cloned_repo) $(chroot_worker) $(depend_REPO_LIST) $(go-grapher) \ --input $(specs_file) \ $(logging_command) \ @@ -116,7 +126,20 @@ $(graph_file): $(specs_file) $(go-grapher) $(toolchain_rpms) $(if $(filter y,$(ENABLE_MEM_PROFILE)),--enable-mem-prof) \ $(if $(filter y,$(ENABLE_TRACE)),--enable-trace) \ --timestamp-file=$(TIMESTAMP_DIR)/grapher.jsonl \ - --output $@ + --output $@ \ + $(if $(filter y,$(RESOLVE_CYCLES_FROM_UPSTREAM)), --resolve-cycles-from-upstream) \ + $(if $(filter y,$(USE_PREVIEW_REPO)), --use-preview-repo) \ + $(if $(filter y,$(DISABLE_DEFAULT_REPOS)), --disable-default-repos) \ + $(if $(filter y,$(IGNORE_VERSION_TO_RESOLVE_SELFDEP)), --ignore-version-to-resolve-selfdep) \ + --output-dir=$(CACHED_RPMS_DIR)/cache \ + --rpm-dir=$(RPMS_DIR) \ + --toolchain-rpms-dir=$(TOOLCHAIN_RPMS_DIR) \ + --toolchain-manifest=$(TOOLCHAIN_MANIFEST) \ + --tls-cert=$(TLS_CERT) \ + --tls-key=$(TLS_KEY) \ + --tmp-dir=$(grapher_working_dir) \ + --tdnf-worker=$(chroot_worker) \ + $(foreach repo, $(pkggen_local_repo) $(graphpkgfetcher_cloned_repo) $(REPO_LIST), --repo-file=$(repo)) # We want to detect changes in the RPM cache, but we are not responsible for directly rebuilding any missing files. $(CACHED_RPMS_DIR)/%: ; diff --git a/toolkit/tools/depsearch/depsearch.go b/toolkit/tools/depsearch/depsearch.go index cf8dae504b6..eca984c0e3d 100644 --- a/toolkit/tools/depsearch/depsearch.go +++ b/toolkit/tools/depsearch/depsearch.go @@ -149,7 +149,7 @@ func searchForGoal(graph *pkggraph.PkgGraph, goals []string) (list []*pkggraph.P } func searchForPkg(graph *pkggraph.PkgGraph, packages []string) (list []*pkggraph.PkgNode) { - for _, n := range graph.AllRunNodes() { + for _, n := range graph.AllPreferredRunNodes() { nodeName := n.VersionedPkg.Name for _, searchName := range packages { if nodeName == searchName { @@ -161,7 +161,7 @@ func searchForPkg(graph *pkggraph.PkgGraph, packages []string) (list []*pkggraph } func searchForSpec(graph *pkggraph.PkgGraph, specs []string) (list []*pkggraph.PkgNode) { - for _, n := range graph.AllRunNodes() { + for _, n := range graph.AllPreferredRunNodes() { nodeSpec := n.SpecName() for _, searchSpec := range specs { if nodeSpec == searchSpec { diff --git a/toolkit/tools/grapher/grapher.go b/toolkit/tools/grapher/grapher.go index 045e70e6fbe..4a60d1491fe 100644 --- a/toolkit/tools/grapher/grapher.go +++ b/toolkit/tools/grapher/grapher.go @@ -9,6 +9,7 @@ import ( "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/exe" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/logger" + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/packagerepo/repocloner/rpmrepocloner" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/pkggraph" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/pkgjson" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/timestamp" @@ -22,12 +23,27 @@ var ( input = exe.InputFlag(app, "Input json listing all local SRPMs") output = exe.OutputFlag(app, "Output file to export the graph to") - logFile = exe.LogFileFlag(app) - logLevel = exe.LogLevelFlag(app) - profFlags = exe.SetupProfileFlags(app) - strictGoals = app.Flag("strict-goals", "Don't allow missing goal packages").Bool() - strictUnresolved = app.Flag("strict-unresolved", "Don't allow missing unresolved packages").Bool() - timestampFile = app.Flag("timestamp-file", "File that stores timestamps for this program.").String() + logFile = exe.LogFileFlag(app) + logLevel = exe.LogLevelFlag(app) + profFlags = exe.SetupProfileFlags(app) + strictGoals = app.Flag("strict-goals", "Don't allow missing goal packages").Bool() + strictUnresolved = app.Flag("strict-unresolved", "Don't allow missing unresolved packages").Bool() + timestampFile = app.Flag("timestamp-file", "File that stores timestamps for this program.").String() + usePMCtoResolveCycles = app.Flag("usePMCtoresolvecycles", "Cycles will be resolved by downloading rpm packages from PMC if locally unavailable").Bool() + tlsClientCert = app.Flag("tls-cert", "TLS client certificate to use when downloading files.").String() + tlsClientKey = app.Flag("tls-key", "TLS client key to use when downloading files.").String() + + resolveCyclesFromUpstream = app.Flag("resolve-cycles-from-upstream", "Let grapher resolve cycles by marking rpms available in repo as remote").Bool() + outDir = exe.OutputDirFlag(app, "Directory to download packages into.") + existingRpmsDir = app.Flag("rpm-dir", "Directory that contains already built RPMs. Should contain top level directories for architecture.").Required().ExistingDir() + existingToolchainRpmDir = app.Flag("toolchain-rpms-dir", "Directory that contains already built toolchain RPMs. Should contain top level directories for architecture.").Required().ExistingDir() + tmpDir = app.Flag("tmp-dir", "Directory to store temporary files while downloading.").String() + workerTar = app.Flag("tdnf-worker", "Full path to worker_chroot.tar.gz").Required().ExistingFile() + repoFiles = app.Flag("repo-file", "Full path to a repo file").Required().ExistingFiles() + usePreviewRepo = app.Flag("use-preview-repo", "Pull packages from the upstream preview repo").Bool() + disableDefaultRepos = app.Flag("disable-default-repos", "Disable pulling packages from PMC repos").Bool() + toolchainManifest = app.Flag("toolchain-manifest", "Path to a list of RPMs which are created by the toolchain. Will mark RPMs from this list as prebuilt.").ExistingFile() + ignoreVersionToResolveSelfDep = app.Flag("ignore-version-to-resolve-selfdep", "Ignore package version while downloading package from upstream when resolving cycle").Bool() depGraph = pkggraph.NewPkgGraph() ) @@ -66,8 +82,25 @@ func main() { logger.Log.Panic(err) } + var cloner *rpmrepocloner.RpmRepoCloner = nil + if *resolveCyclesFromUpstream { + cloner, err = rpmrepocloner.ConstructCloner(*outDir, *tmpDir, *workerTar, *existingRpmsDir, *existingToolchainRpmDir, *tlsClientCert, *tlsClientKey, *repoFiles) + if err != nil { + logger.Log.Panic(err) + } + enabledRepos := rpmrepocloner.RepoFlagAll + if !*usePreviewRepo { + enabledRepos = enabledRepos & ^rpmrepocloner.RepoFlagPreview + } + if *disableDefaultRepos { + enabledRepos = enabledRepos & ^rpmrepocloner.RepoFlagMarinerDefaults + } + cloner.SetEnabledRepos(enabledRepos) + + defer cloner.Close() + } logger.Log.Info("Running cycle resolution to fix any cycles in the dependency graph") - err = depGraph.MakeDAG() + err = depGraph.MakeDAGUsingUpstreamRepos(*resolveCyclesFromUpstream, *ignoreVersionToResolveSelfDep, cloner) if err != nil { logger.Log.Panic(err) } @@ -100,7 +133,7 @@ func addUnresolvedPackage(g *pkggraph.PkgGraph, pkgVer *pkgjson.PackageVer) (new } // Create a new node - newRunNode, err = g.AddPkgNode(pkgVer, pkggraph.StateUnresolved, pkggraph.TypeRemoteRun, pkggraph.NoSRPMPath, pkggraph.NoRPMPath, pkggraph.NoSpecPath, pkggraph.NoSourceDir, pkggraph.NoArchitecture, pkggraph.NoSourceRepo) + newRunNode, err = g.AddRemoteUnresolvedNode(pkgVer) if err != nil { return } diff --git a/toolkit/tools/internal/pkggraph/pkggraph.go b/toolkit/tools/internal/pkggraph/pkggraph.go index 9e3074c9c82..2a6d5f15270 100644 --- a/toolkit/tools/internal/pkggraph/pkggraph.go +++ b/toolkit/tools/internal/pkggraph/pkggraph.go @@ -17,6 +17,7 @@ import ( "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/file" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/logger" + "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/packagerepo/repocloner/rpmrepocloner" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/pkgjson" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/sliceutils" "github.com/microsoft/CBL-Mariner/toolkit/tools/internal/timestamp" @@ -297,9 +298,13 @@ func (g *PkgGraph) validateNodeForLookup(pkgNode *PkgNode) (valid bool, err erro switch pkgNode.Type { case TypeLocalBuild: haveDuplicateNode = existingLookup.BuildNode != nil - // For the purposes of lookup, a "Remote" node provides the same utility as a "Run" node - case TypeLocalRun, TypeRemoteRun: - haveDuplicateNode = existingLookup.RunNode != nil + case TypeLocalRun: + haveDuplicateNode = (existingLookup.RunNode != nil) && (existingLookup.RunNode.Type == TypeLocalRun) + case TypeRemoteRun: + // RemoteRun nodes may have duplicates. It is possible that: + // 1. LocalRun and RemoteRun co-exist in a graph + // 2. Multiple RemoteRun nodes can exist in a graph + // So, this is not considered as a duplicate node case TypeTest: haveDuplicateNode = existingLookup.TestNode != nil } @@ -368,9 +373,14 @@ func (g *PkgGraph) addToLookup(pkgNode *PkgNode, deferSort bool) (err error) { switch pkgNode.Type { case TypeLocalBuild: existingLookup.BuildNode = pkgNode.This - // For the purposes of lookup, a "Remote" node provides the same utility as a "Run" node - case TypeLocalRun, TypeRemoteRun: + case TypeLocalRun: + // Prefer LocalRun over RemoteRun existingLookup.RunNode = pkgNode.This + case TypeRemoteRun: + // Update only if RunNoe is nil + if existingLookup.RunNode == nil { + existingLookup.RunNode = pkgNode.This + } case TypeTest: existingLookup.TestNode = pkgNode.This } @@ -512,6 +522,11 @@ func (g *PkgGraph) AddPkgNode(versionedPkg *pkgjson.PackageVer, nodeState NodeSt return } +// AddRemoteUnresolvedNode adds a new node to the package graph representing an unresolved remote dependency. +func (g *PkgGraph) AddRemoteUnresolvedNode(versionedPkg *pkgjson.PackageVer) (newNode *PkgNode, err error) { + return g.AddPkgNode(versionedPkg, StateUnresolved, TypeRemoteRun, NoSRPMPath, NoRPMPath, NoSpecPath, NoSourceDir, NoArchitecture, NoSourceRepo) +} + // RemovePkgNode removes a node from the package graph and lookup tables. func (g *PkgGraph) RemovePkgNode(pkgNode *PkgNode) { g.RemoveNode(pkgNode.ID()) @@ -618,7 +633,26 @@ func (g *PkgGraph) AllNodesFrom(rootNode *PkgNode) []*PkgNode { } // AllRunNodes returns a list of all run nodes in the graph +// It traverses the graph and returns all nodes of type TypeLocalRun and +// TypeRemoteRun. func (g *PkgGraph) AllRunNodes() []*PkgNode { + nodes := make([]*PkgNode, 0, g.Nodes().Len()) + for _, n := range g.AllNodes() { + if n.Type == TypeLocalRun || n.Type == TypeRemoteRun { + nodes = append(nodes, n) + } + } + return nodes +} + +// AllPreferredRunNodes returns all RunNodes in the LookupTable +// Though a graph can contain both LocalRun and RemoteRun node for a single +// package-version, the LookupTable will have: +// 1. LocalRun Node if only LocalRun node is present in the graph +// 2. RemoteRun Node if only RemoteRun node is present in the graph +// 3. LocalRun Node if both LocalRun and RemoteRun nodes are present in the graph +// This function will return all RunNodes in the LookupTable. +func (g *PkgGraph) AllPreferredRunNodes() []*PkgNode { return g.allNodesOfType(func(n *LookupNode) *PkgNode { return n.RunNode }) @@ -1160,12 +1194,15 @@ func (g *PkgGraph) DeepCopy() (deepCopy *PkgGraph, err error) { return } -// MakeDAG ensures the graph is a directed acyclic graph (DAG). -// If the graph is not a DAG, this routine will attempt to resolve any cycles to make the graph a DAG. func (g *PkgGraph) MakeDAG() (err error) { + return g.MakeDAGUsingUpstreamRepos(false, false, nil) +} + +// MakeDAGUsingUpstreamRepos ensures the graph is a directed acyclic graph (DAG). +// If the graph is not a DAG, this routine will attempt to resolve any cycles using RPMs in the PMC to make the graph a DAG. +func (g *PkgGraph) MakeDAGUsingUpstreamRepos(resolveCyclesFromUpstream, ignoreVersionToResolveSelfDep bool, cloner *rpmrepocloner.RpmRepoCloner) (err error) { timestamp.StartEvent("convert to DAG", nil) defer timestamp.StopEvent(nil) - var cycle []*PkgNode for { @@ -1174,7 +1211,7 @@ func (g *PkgGraph) MakeDAG() (err error) { return } - err = g.fixCycle(cycle) + err = g.fixCycle(cycle, resolveCyclesFromUpstream, ignoreVersionToResolveSelfDep, cloner) if err != nil { return formatCycleErrorMessage(cycle, err) } @@ -1245,7 +1282,7 @@ func (g *PkgGraph) buildGoalSet(packageVers []*pkgjson.PackageVer, nodeType Node if nodeType == TypeTest { goalSet = pkgNodesListToPackageVerSet(g.AllTestNodes()) } else { - goalSet = pkgNodesListToPackageVerSet(g.AllRunNodes()) + goalSet = pkgNodesListToPackageVerSet(g.AllPreferredRunNodes()) } } @@ -1308,7 +1345,7 @@ func (g *PkgGraph) connectGoalEdges(goalNode *PkgNode, goalSet map[*pkgjson.Pack // fixCycle attempts to fix a cycle. Cycles may be acceptable if: // - all nodes are from the same spec file or // - at least one of the nodes of the cycle represents a pre-built SRPM. -func (g *PkgGraph) fixCycle(cycle []*PkgNode) (err error) { +func (g *PkgGraph) fixCycle(cycle []*PkgNode, resolveCyclesFromUpstream, ignoreVersionToResolveSelfDep bool, cloner *rpmrepocloner.RpmRepoCloner) (err error) { logger.Log.Debugf("Found cycle: %v", cycle) // Omit the first element of the cycle, since it is repeated as the last element @@ -1319,7 +1356,7 @@ func (g *PkgGraph) fixCycle(cycle []*PkgNode) (err error) { return } - return g.fixPrebuiltSRPMsCycle(trimmedCycle) + return g.fixCyclesWithExistingRPMS(trimmedCycle, resolveCyclesFromUpstream, ignoreVersionToResolveSelfDep, cloner) } // fixIntraSpecCycle attempts to fix a cycle if none of the cycle nodes are build nodes. @@ -1387,11 +1424,49 @@ func (g *PkgGraph) fixIntraSpecCycle(trimmedCycle []*PkgNode) (err error) { return } -// fixPrebuiltSRPMsCycle attempts to fix a cycle if at least one node is a pre-built SRPM. -// If a cycle can be fixed, edges representing the build dependencies of the pre-built SRPM will be removed. -func (g *PkgGraph) fixPrebuiltSRPMsCycle(trimmedCycle []*PkgNode) (err error) { +func (g *PkgGraph) replaceSRPMBuildDependency(replacedNode, newNode *PkgNode, dependencySRPMPath string) (err error) { + parentNodes := g.To(replacedNode.ID()) + for parentNodes.Next() { + parentNode := parentNodes.Node().(*PkgNode) + if parentNode.Type == TypeLocalBuild && parentNode.SrpmPath == dependencySRPMPath { + g.RemoveEdge(parentNode.ID(), replacedNode.ID()) + + err = g.AddEdge(parentNode, newNode) + if err != nil { + logger.Log.Errorf("Adding edge failed for %v -> %v.", parentNode, newNode) + return + } + } + } + + logger.Log.Infof("Successful. Updated dependency for nodes depending on '%s'.", replacedNode.FriendlyName()) + return +} + +func (g *PkgGraph) cloneAndReplaceRunToRemote(runNode *PkgNode, buildNodeToUpdate *PkgNode) (err error) { + // Mark node as unresolved remote to be fetched by the package fetcher + upstreamAvailableNode, err := g.AddRemoteUnresolvedNode(runNode.VersionedPkg) + if err != nil { + return fmt.Errorf("failed to add a remote node:\n%w", err) + } + + logger.Log.Debugf("Added a 'Remote' node '%s' with ID %d.", upstreamAvailableNode.FriendlyName(), upstreamAvailableNode.ID()) + return g.replaceSRPMBuildDependency(runNode, upstreamAvailableNode, buildNodeToUpdate.SrpmPath) +} + +// fixCyclesWithExistingRPMS attempts to fix a cycle if at least one node is a pre-built. It also searches upstream RPMS when the flag RESOLVE_CYCLES_FROM_UPSTREAM is enabled +// If a cycle can be fixed, edges representing the build dependencies of the pre-built/available-upstream node will be removed. +func (g *PkgGraph) fixCyclesWithExistingRPMS(trimmedCycle []*PkgNode, resolveCyclesFromUpstream, ignoreVersionToResolveSelfDep bool, cloner *rpmrepocloner.RpmRepoCloner) (err error) { logger.Log.Debug("Checking if cycle contains pre-built SRPMs.") + var cycleStringBuilder strings.Builder + + fmt.Fprintf(&cycleStringBuilder, "{%s}", trimmedCycle[0].FriendlyName()) + for _, node := range trimmedCycle[1:] { + fmt.Fprintf(&cycleStringBuilder, " --> {%s}", node.FriendlyName()) + } + logger.Log.Infof("Trying to fix circular dependency found:\t%s", cycleStringBuilder.String()) + currentNode := trimmedCycle[len(trimmedCycle)-1] for _, previousNode := range trimmedCycle { // Why we're targetting only "build node -> run node" edges: @@ -1400,7 +1475,11 @@ func (g *PkgGraph) fixPrebuiltSRPMsCycle(trimmedCycle []*PkgNode) (err error) { // 2. Every build cycle must contain at least one edge between a build node and a run node from different SRPMs. // These edges represent the 'BuildRequires' from the .spec file. If the cycle is breakable, the run node comes from a pre-built SRPM. buildToRunEdge := previousNode.Type == TypeLocalBuild && currentNode.Type == TypeLocalRun - if _, missingRPMs := FindRPMFiles(currentNode.SrpmPath, g, nil); buildToRunEdge && len(missingRPMs) == 0 { + if !buildToRunEdge { + currentNode = previousNode + continue + } + if _, missingRPMs := FindRPMFiles(currentNode.SrpmPath, g, nil); len(missingRPMs) == 0 { logger.Log.Debugf("Cycle contains pre-built SRPM '%s'. Replacing edges from build nodes associated with '%s' with an edge to a new 'PreBuilt' node.", currentNode.SrpmPath, previousNode.SrpmPath) @@ -1410,27 +1489,50 @@ func (g *PkgGraph) fixPrebuiltSRPMsCycle(trimmedCycle []*PkgNode) (err error) { logger.Log.Debugf("Adding a 'PreBuilt' node '%s' with id %d.", preBuiltNode.FriendlyName(), preBuiltNode.ID()) - parentNodes := g.To(currentNode.ID()) - for parentNodes.Next() { - parentNode := parentNodes.Node().(*PkgNode) - if parentNode.Type == TypeLocalBuild && parentNode.SrpmPath == previousNode.SrpmPath { - g.RemoveEdge(parentNode.ID(), currentNode.ID()) - - err = g.AddEdge(parentNode, preBuiltNode) - if err != nil { - logger.Log.Errorf("Adding edge failed for %v -> %v", parentNode, preBuiltNode) - return - } - } + err = g.replaceSRPMBuildDependency(currentNode, preBuiltNode, previousNode.SrpmPath) + if err != nil { + return fmt.Errorf("failed to replace a circular build dependency:\n%w", err) } return } + if resolveCyclesFromUpstream { + cycleResolved, err := g.tryReplaceLocalNodeWithUpstream(currentNode, previousNode, false, cloner) + if err != nil { + return fmt.Errorf("failed while trying to break a cycle with an upstream package:\n%w", err) + } + if cycleResolved { + return nil + } + } currentNode = previousNode } - return fmt.Errorf("cycle contains no pre-build SRPMs, unresolvable") + if ignoreVersionToResolveSelfDep && resolveCyclesFromUpstream { + logger.Log.Debug("Trying to resolve cycle by searching packages in PMC after ignoring package version.") + + currentNode = trimmedCycle[len(trimmedCycle)-1] + for _, previousNode := range trimmedCycle { + buildToRunEdge := previousNode.Type == TypeLocalBuild && currentNode.Type == TypeLocalRun + if !buildToRunEdge { + continue + } + + cycleResolved, err := g.tryReplaceLocalNodeWithUpstream(currentNode, previousNode, true, cloner) + if err != nil { + return fmt.Errorf("failed while trying to break a cycle with an upstream package:\n%w", err) + } + + if cycleResolved { + return nil + } + + currentNode = previousNode + } + } + + return fmt.Errorf("cycle can't be resolved with prebuilt/PMC RPMs. Unresolvable") } // removePkgNodeFromLookup removes a node from the lookup tables. @@ -1497,7 +1599,7 @@ func rpmsProvidedBySRPM(srpmPath string, pkgGraph *PkgGraph, graphMutex *sync.RW } rpmsMap := make(map[string]bool) - runNodes := pkgGraph.AllRunNodes() + runNodes := pkgGraph.AllPreferredRunNodes() for _, node := range runNodes { if node.SrpmPath != srpmPath { continue @@ -1517,7 +1619,7 @@ func rpmsProvidedBySRPM(srpmPath string, pkgGraph *PkgGraph, graphMutex *sync.RW // findMissingFiles returns a list of files missing on disk. // -// Also returns a list of all missing files +// Also returns a list of all missing files. func findMissingFiles(filePaths []string) (missingFiles []string) { for _, filePath := range filePaths { isFile, _ := file.IsFile(filePath) @@ -1530,3 +1632,37 @@ func findMissingFiles(filePaths []string) (missingFiles []string) { return } + +func (g *PkgGraph) tryReplaceLocalNodeWithUpstream(currentNode, previousNode *PkgNode, ignoreVersionToResolveSelfDep bool, cloner *rpmrepocloner.RpmRepoCloner) (isCycleBroken bool, err error) { + isAvailableUpstream := isPackageAvailableUpsream(currentNode.VersionedPkg, ignoreVersionToResolveSelfDep, cloner) + if !isAvailableUpstream { + return false, nil + } + + logger.Log.Debugf("Cycle contains a dependency '%s' that is available in upstream repo. Replacing edges from build nodes associated with '%s' with an edge to a new remote unresolved node.", currentNode.FriendlyName(), previousNode.SRPMFileName()) + + err = g.cloneAndReplaceRunToRemote(currentNode, previousNode) + if err != nil { + return false, err + } + + return true, nil +} + +// isPackageAvailableUpsream returns true if a package is found in the upstream repository. +// +// This is used to check if an RPM is available in the repository before starting a build. +func isPackageAvailableUpsream(packageVer *pkgjson.PackageVer, ignoreVersionToResolveSelfDep bool, cloner *rpmrepocloner.RpmRepoCloner) (isAvailableUpstream bool) { + if ignoreVersionToResolveSelfDep { + packageVer = &pkgjson.PackageVer{Name: packageVer.Name} + } + + // Cloner errors are not fatal - may return one when the RPM is not found. + foundPackages, err := cloner.WhatProvides(packageVer) + if err != nil { + logger.Log.Debugf("Error while checking if package (%v) is available upstream: %s", packageVer, err) + return + } + + return len(foundPackages) > 0 +} diff --git a/toolkit/tools/internal/pkggraph/pkggraph_test.go b/toolkit/tools/internal/pkggraph/pkggraph_test.go index 3808b46a467..f3c37b5ab92 100644 --- a/toolkit/tools/internal/pkggraph/pkggraph_test.go +++ b/toolkit/tools/internal/pkggraph/pkggraph_test.go @@ -400,7 +400,7 @@ func TestAddMultipleNodes(t *testing.T) { assert.NoError(t, err) assert.Equal(t, len(runNodes)+len(buildNodes), len(g.AllNodes())) - assert.Equal(t, len(runNodes), len(g.AllRunNodes())) + assert.Equal(t, len(runNodes), len(g.AllPreferredRunNodes())) assert.Equal(t, len(buildNodes), len(g.AllBuildNodes())) } diff --git a/toolkit/tools/scheduler/scheduler.go b/toolkit/tools/scheduler/scheduler.go index 3a46c9cd05a..ffbb70c7ffe 100644 --- a/toolkit/tools/scheduler/scheduler.go +++ b/toolkit/tools/scheduler/scheduler.go @@ -505,7 +505,7 @@ func setAssociatedDeltaPaths(res *schedulerutils.BuildResult, pkgGraph *pkggraph } // Now we can scan for all the run nodes that use the cached RPM path and update them to the actual RPM path. - for _, node := range pkgGraph.AllRunNodes() { + for _, node := range pkgGraph.AllPreferredRunNodes() { // Get base path of the .rpm for the node and find the built file in the map rpmBasePath := filepath.Base(node.RpmPath) builtFile, ok := builtFileMap[rpmBasePath] diff --git a/toolkit/tools/scheduler/schedulerutils/implicitprovides.go b/toolkit/tools/scheduler/schedulerutils/implicitprovides.go index a241524a502..89a885d3785 100644 --- a/toolkit/tools/scheduler/schedulerutils/implicitprovides.go +++ b/toolkit/tools/scheduler/schedulerutils/implicitprovides.go @@ -59,7 +59,7 @@ func replaceNodesWithProvides(res *BuildResult, pkgGraph *pkggraph.PkgGraph, pro // Find a local run node that is backed by the same rpm as the one providing the implicit provide. // Make this node the parent node for the new implicit provide node. // - By making a run node the parent node, it will inherit the identical runtime dependencies of the already setup node. - for _, node := range pkgGraph.AllRunNodes() { + for _, node := range pkgGraph.AllPreferredRunNodes() { // We need to filter out any non-local run nodes since cached remote nodes are not acceptable parent nodes for collapsed nodes. if node.Type == pkggraph.TypeLocalRun && rpmFileProviding == node.RpmPath { logger.Log.Debugf("Linked implicit provide (%s) to run node (%s) using file (%s)", provides, node.FriendlyName(), rpmFileProviding) @@ -101,7 +101,7 @@ func implicitPackagesToUnresolvedNodesInGraph(pkgGraph *pkggraph.PkgGraph, useCa // --> foo >= 3.0 -- create unresolved node // Unresolved nodes for foo: 3 - for _, n := range pkgGraph.AllRunNodes() { + for _, n := range pkgGraph.AllPreferredRunNodes() { if !n.Implicit { continue } From 4316572daa00bd5305c5990c38a835be745126c9 Mon Sep 17 00:00:00 2001 From: Muhammad Falak R Wani Date: Fri, 1 Sep 2023 17:00:47 +0530 Subject: [PATCH 57/64] Bump gopkg.in/yaml.v3 to 3.0.0 to address CVE-2022-28948 (#6118) Signed-off-by: Muhammad Falak R Wani --- toolkit/tools/go.mod | 2 +- toolkit/tools/go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/toolkit/tools/go.mod b/toolkit/tools/go.mod index 6aa69dfdf85..6284bd31e91 100644 --- a/toolkit/tools/go.mod +++ b/toolkit/tools/go.mod @@ -35,5 +35,5 @@ require ( golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3 // indirect golang.org/x/text v0.3.8 // indirect gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect - gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect + gopkg.in/yaml.v3 v3.0.0 // indirect ) diff --git a/toolkit/tools/go.sum b/toolkit/tools/go.sum index 40da3f9b42b..0ead06de291 100644 --- a/toolkit/tools/go.sum +++ b/toolkit/tools/go.sum @@ -97,5 +97,6 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 43ce7586b0a1080c2df7f771a7938db22af27b96 Mon Sep 17 00:00:00 2001 From: Bala Date: Fri, 1 Sep 2023 18:35:36 +0530 Subject: [PATCH 58/64] Don't pass toolchainManifest to grapher and clean-workplan depend on clean-grapher-cache-worker (#6132) --- toolkit/scripts/pkggen.mk | 3 +-- toolkit/tools/grapher/grapher.go | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/toolkit/scripts/pkggen.mk b/toolkit/scripts/pkggen.mk index 8aef7095e2e..5a7d5af7bce 100644 --- a/toolkit/scripts/pkggen.mk +++ b/toolkit/scripts/pkggen.mk @@ -47,7 +47,7 @@ $(call create_folder,$(rpmbuilding_logs_dir)) graph-cache: $(cached_file) workplan: $(graph_file) clean: clean-workplan clean-cache clean-spec-parse -clean-workplan: clean-cache clean-spec-parse +clean-workplan: clean-cache clean-spec-parse clean-grapher-cache-worker rm -rf $(PKGBUILD_DIR) rm -rf $(LOGS_DIR)/pkggen/workplan clean-grapher-cache-worker: @@ -134,7 +134,6 @@ $(graph_file): $(specs_file) $(go-grapher) $(toolchain_rpms) $(TOOLCHAIN_MANIFES --output-dir=$(CACHED_RPMS_DIR)/cache \ --rpm-dir=$(RPMS_DIR) \ --toolchain-rpms-dir=$(TOOLCHAIN_RPMS_DIR) \ - --toolchain-manifest=$(TOOLCHAIN_MANIFEST) \ --tls-cert=$(TLS_CERT) \ --tls-key=$(TLS_KEY) \ --tmp-dir=$(grapher_working_dir) \ diff --git a/toolkit/tools/grapher/grapher.go b/toolkit/tools/grapher/grapher.go index 4a60d1491fe..929824e3da3 100644 --- a/toolkit/tools/grapher/grapher.go +++ b/toolkit/tools/grapher/grapher.go @@ -42,7 +42,6 @@ var ( repoFiles = app.Flag("repo-file", "Full path to a repo file").Required().ExistingFiles() usePreviewRepo = app.Flag("use-preview-repo", "Pull packages from the upstream preview repo").Bool() disableDefaultRepos = app.Flag("disable-default-repos", "Disable pulling packages from PMC repos").Bool() - toolchainManifest = app.Flag("toolchain-manifest", "Path to a list of RPMs which are created by the toolchain. Will mark RPMs from this list as prebuilt.").ExistingFile() ignoreVersionToResolveSelfDep = app.Flag("ignore-version-to-resolve-selfdep", "Ignore package version while downloading package from upstream when resolving cycle").Bool() depGraph = pkggraph.NewPkgGraph() From 4244a7d1f156b34f21b012fa2cd6e10a6184aed9 Mon Sep 17 00:00:00 2001 From: Trung Date: Fri, 1 Sep 2023 10:15:39 -0700 Subject: [PATCH 59/64] Nopatch kernel for CVE-2023-4389, CVE-2023-32247 (#6131) --- SPECS/kernel/CVE-2023-32247.nopatch | 2 ++ SPECS/kernel/CVE-2023-4389.nopatch | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 SPECS/kernel/CVE-2023-32247.nopatch create mode 100644 SPECS/kernel/CVE-2023-4389.nopatch diff --git a/SPECS/kernel/CVE-2023-32247.nopatch b/SPECS/kernel/CVE-2023-32247.nopatch new file mode 100644 index 00000000000..de79792323a --- /dev/null +++ b/SPECS/kernel/CVE-2023-32247.nopatch @@ -0,0 +1,2 @@ +CVE-2023-32247 - Mariner does not enable ksmbd at this time (5.15.126.1-1) +Upstream commit: ea174a91893956450510945a0c5d1a10b5323656 diff --git a/SPECS/kernel/CVE-2023-4389.nopatch b/SPECS/kernel/CVE-2023-4389.nopatch new file mode 100644 index 00000000000..10ba773288d --- /dev/null +++ b/SPECS/kernel/CVE-2023-4389.nopatch @@ -0,0 +1,3 @@ +CVE-2023-4389 - patched in 5.15.35.1 +Upstream: 168a2f776b9762f4021421008512dd7ab7474df1 +Stable: 252db93fd0bd5ca07c9b933ed94e93a4a43e8901 From cb3e7ce876b3b087ca57af28e474821fa555d442 Mon Sep 17 00:00:00 2001 From: Pawel Winogrodzki Date: Fri, 1 Sep 2023 12:02:36 -0700 Subject: [PATCH 60/64] Disabled missing ptest dependencies for 7 extended specs. (#6129) --- SPECS-EXTENDED/PyGreSQL/PyGreSQL.spec | 16 ++++++------- SPECS-EXTENDED/ibus-table/ibus-table.spec | 23 +++++++++++-------- .../libpmemobj-cpp/libpmemobj-cpp.spec | 10 ++++++-- SPECS-EXTENDED/libuser/libuser.spec | 12 +++++++--- .../perl-Color-RGB-Util.spec | 9 ++++++-- SPECS-EXTENDED/pybind11/pybind11.spec | 10 ++++++-- .../python-msrestazure.spec | 9 ++++++-- cgmanifest.json | 2 +- 8 files changed, 62 insertions(+), 29 deletions(-) diff --git a/SPECS-EXTENDED/PyGreSQL/PyGreSQL.spec b/SPECS-EXTENDED/PyGreSQL/PyGreSQL.spec index a54df38fa25..8cb2a1c7829 100644 --- a/SPECS-EXTENDED/PyGreSQL/PyGreSQL.spec +++ b/SPECS-EXTENDED/PyGreSQL/PyGreSQL.spec @@ -4,16 +4,11 @@ Distribution: Mariner Name: %{srcname} Version: 5.2.2 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Python client library for PostgreSQL URL: http://www.pygresql.org/ -# Author states his intention is to dual license under PostgreSQL or Python -# licenses --- this is not too clear from the current tarball documentation, -# but hopefully will be clearer in future releases. -# The PostgreSQL license is very similar to other MIT licenses, but the OSI -# recognizes it as an independent license, so we do as well. -License: PostgreSQL or Python +License: PostgreSQL Source0: https://github.com/PyGreSQL/%{name}/archive/%{version}/%{name}-%{version}.tar.gz @@ -23,7 +18,8 @@ BuildRequires: python3-devel # For testsuite %if %{with_check} -BuildRequires: postgresql-test-rpm-macros +# Missing test dependencies: +# BuildRequires: postgresql-test-rpm-macros %endif %global _description\ @@ -83,6 +79,10 @@ EOF %changelog +* Thu Aug 31 2023 Pawel Winogrodzki - 5.2.2-3 +- Disabling missing test dependency. +- License verified. + * Sat Jul 24 2021 Pawel Winogrodzki - 5.2.2-2 - Initial CBL-Mariner import from Fedora 32 (license: MIT). - Disabling BR on 'postgresql-test-rpm-macros' for non-test builds. diff --git a/SPECS-EXTENDED/ibus-table/ibus-table.spec b/SPECS-EXTENDED/ibus-table/ibus-table.spec index 444a94e651a..0a5c2cb283b 100644 --- a/SPECS-EXTENDED/ibus-table/ibus-table.spec +++ b/SPECS-EXTENDED/ibus-table/ibus-table.spec @@ -6,12 +6,11 @@ Distribution: Mariner Name: ibus-table Version: 1.12.4 -Release: 2%{?dist} +Release: 3%{?dist} Summary: The Table engine for IBus platform License: LGPLv2+ URL: https://github.com/mike-fabian/ibus-table -# Source0: https://github.com/mike-fabian/ibus-table/archive/refs/tags/1.12.4.tar.gz -Source0: https://github.com/mike-fabian/ibus-table/archive/refs/tags/%{name}-%{version}.tar.gz +Source0: https://github.com/mike-fabian/ibus-table/archive/refs/tags/%{version}.tar.gz#/%{name}-%{version}.tar.gz Requires: ibus > 1.3.0 Requires: python(abi) >= 3.3 %{?__python3:Requires: %{__python3}} @@ -20,7 +19,6 @@ BuildRequires: ibus-devel > 1.3.0 BuildRequires: python3-devel # for the unit tests %if %{with_check} -BuildRequires: appstream BuildRequires: libappstream-glib BuildRequires: desktop-file-utils BuildRequires: python3-mock @@ -31,12 +29,15 @@ BuildRequires: xorg-x11-server-Xvfb BuildRequires: ibus-table-chinese-wubi-jidian BuildRequires: ibus-table-chinese-cangjie BuildRequires: ibus-table-chinese-stroke5 -BuildRequires: ibus-table-code -BuildRequires: ibus-table-latin -BuildRequires: ibus-table-translit -BuildRequires: ibus-table-tv + +# Missing test dependencies: +# BuildRequires: appstream +# BuildRequires: ibus-table-code +# BuildRequires: ibus-table-latin +# BuildRequires: ibus-table-translit +# BuildRequires: ibus-table-tv # A window manger is needed for the GUI test -BuildRequires: i3 +# BuildRequires: i3 %endif Obsoletes: ibus-table-additional < 1.2.0.20100111-5 @@ -154,6 +155,10 @@ fi %{_datadir}/installed-tests/%{name} %changelog +* Thu Aug 31 2023 Pawel Winogrodzki - 1.12.4-3 +- Disabling missing test dependency. +- License verified. + * Thu Jun 17 2021 Thomas Crain - 1.12.4-2 - Initial CBL-Mariner import from Fedora 32 (license: MIT). - Gate build-time check requirements behind the %%with_check macro diff --git a/SPECS-EXTENDED/libpmemobj-cpp/libpmemobj-cpp.spec b/SPECS-EXTENDED/libpmemobj-cpp/libpmemobj-cpp.spec index 273b2e63f6d..6e6ec5f110d 100644 --- a/SPECS-EXTENDED/libpmemobj-cpp/libpmemobj-cpp.spec +++ b/SPECS-EXTENDED/libpmemobj-cpp/libpmemobj-cpp.spec @@ -5,7 +5,7 @@ Distribution: Mariner Name: libpmemobj-cpp Version: 1.9 -Release: 2%{?dist} +Release: 3%{?dist} Summary: C++ bindings for libpmemobj # Note: tests/external/libcxx is dual licensed using University of Illinois "BSD-Like" license and the MIT license. It's used only during development/testing and is NOT part of the binary RPM. License: BSD @@ -28,7 +28,9 @@ BuildRequires: ncurses-devel BuildRequires: libunwind-devel BuildRequires: valgrind-devel BuildRequires: tbb-devel -BuildRequires: SFML-devel + +# Missing test dependencies: +# BuildRequires: SFML-devel %endif # There's nothing x86-64 specific in this package, but we have @@ -116,6 +118,10 @@ cd build ctest -V %{?_smp_mflags} -E concurrent_hash_map_rehash_0_helgrind -E concurrent_hash_map_insert_lookup_0_helgrind %changelog +* Thu Aug 31 2023 Pawel Winogrodzki - 1.9-3 +- Disabling missing test dependency. +- License verified. + * Wed Jun 23 2021 Thomas Crain - 1.9-2 - Initial CBL-Mariner import from Fedora 32 (license: MIT). - Conditionally require check dependencies at build time diff --git a/SPECS-EXTENDED/libuser/libuser.spec b/SPECS-EXTENDED/libuser/libuser.spec index 951c3a06ea3..4b498f3b437 100644 --- a/SPECS-EXTENDED/libuser/libuser.spec +++ b/SPECS-EXTENDED/libuser/libuser.spec @@ -2,8 +2,8 @@ Name: libuser Version: 0.63 -Release: 9%{?dist} -License: LGPLv2+ +Release: 10%{?dist} +License: GPLv2 Vendor: Microsoft Corporation Distribution: Mariner URL: https://pagure.io/libuser @@ -23,8 +23,10 @@ BuildRequires: gcc %if 0%{?with_check} #BuildRequires: fakeroot BuildRequires: openldap-clients -BuildRequires: openldap-servers BuildRequires: openssl + +# Missing test dependencies: +# BuildRequires: openldap-servers %endif BuildRequires: make BuildRequires: bison @@ -147,6 +149,10 @@ export PYTHONPATH %endif %changelog +* Thu Aug 31 2023 Pawel Winogrodzki - 0.63-10 +- Disabling missing test dependency. +- License verified. + * Mon Nov 01 2021 Muhammad Falak - 0.63-9 - Remove epoch diff --git a/SPECS-EXTENDED/perl-Color-RGB-Util/perl-Color-RGB-Util.spec b/SPECS-EXTENDED/perl-Color-RGB-Util/perl-Color-RGB-Util.spec index 41878a3538a..c0b673356a0 100644 --- a/SPECS-EXTENDED/perl-Color-RGB-Util/perl-Color-RGB-Util.spec +++ b/SPECS-EXTENDED/perl-Color-RGB-Util/perl-Color-RGB-Util.spec @@ -3,7 +3,7 @@ Summary: Utilities related to RGB colors Name: perl-Color-RGB-Util Version: 0.606 -Release: 2%{?dist} +Release: 3%{?dist} License: GPL+ OR Artistic Vendor: Microsoft Corporation Distribution: Mariner @@ -31,8 +31,10 @@ BuildRequires: perl(IO::Handle) BuildRequires: perl(IPC::Open3) BuildRequires: perl(Test::Exception) BuildRequires: perl(Test::More) >= 0.98 -BuildRequires: perl(Test::RandomResult) BuildRequires: perl(blib) + +# Missing test dependencies: +# BuildRequires: perl(Test::RandomResult) %endif Requires: perl(:MODULE_COMPAT_%(eval "`perl -V:version`"; echo $version)) @@ -93,6 +95,9 @@ make test %{_libexecdir}/%{name} %changelog +* Thu Aug 31 2023 Pawel Winogrodzki - 0.606-3 +- Disabling missing test dependency. + * Wed Jan 26 2022 Pawel Winogrodzki - 0.606-2 - Initial CBL-Mariner import from Fedora 36 (license: MIT). - License verified. diff --git a/SPECS-EXTENDED/pybind11/pybind11.spec b/SPECS-EXTENDED/pybind11/pybind11.spec index 971c0a0f6ad..4c8ccfacf5c 100644 --- a/SPECS-EXTENDED/pybind11/pybind11.spec +++ b/SPECS-EXTENDED/pybind11/pybind11.spec @@ -8,7 +8,7 @@ Distribution: Mariner Name: pybind11 Version: 2.6.2 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Seamless operability between C++11 and Python License: BSD URL: https://github.com/pybind/pybind11 @@ -26,7 +26,9 @@ BuildRequires: python3-setuptools %if %{with_check} BuildRequires: python3-pytest BuildRequires: python3-numpy -BuildRequires: python3-scipy + +# Missing test dependencies: +# BuildRequires: python3-scipy %endif BuildRequires: gcc-c++ @@ -98,6 +100,10 @@ PYBIND11_USE_CMAKE=true %py3_install "--install-purelib" "%{python3_sitearch}" %{python3_sitearch}/%{name}-%{version}-py%{python3_version}.egg-info %changelog +* Thu Aug 31 2023 Pawel Winogrodzki - 2.6.2-3 +- Disabling missing test dependency. +- License verified. + * Thu Sep 16 2021 Pawel Winogrodzki - 2.6.2-2 - Initial CBL-Mariner import from Fedora 34 (license: MIT). - Removing Python 2 build steps. Focusing on Python 3. diff --git a/SPECS-EXTENDED/python-msrestazure/python-msrestazure.spec b/SPECS-EXTENDED/python-msrestazure/python-msrestazure.spec index 9abf1ce8a73..d5c817d7258 100644 --- a/SPECS-EXTENDED/python-msrestazure/python-msrestazure.spec +++ b/SPECS-EXTENDED/python-msrestazure/python-msrestazure.spec @@ -8,7 +8,7 @@ Vendor: Microsoft Corporation Distribution: Mariner Version: 0.6.4 Name: python-%{srcname} -Release: 10%{?dist} +Release: 11%{?dist} License: MIT %global tag v%{version} @@ -26,8 +26,10 @@ BuildRequires: python3-wheel %if %{with_check} -BuildRequires: python3dist(httpretty) BuildRequires: python3dist(pytest) + +# Missing test dependencies: +# BuildRequires: python3dist(httpretty) %endif %global _description %{expand: @@ -70,6 +72,9 @@ Summary: %{summary} %changelog +* Thu Aug 31 2023 Pawel Winogrodzki - 0.6.4-11 +- Disabling missing test dependency. + * Wed Mar 15 2023 Muhammad Falak - 0.6.4-10 - Rename Source0 to `%{name}-%{version}.extension diff --git a/cgmanifest.json b/cgmanifest.json index 6619ca95411..8c605d8f632 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -7101,7 +7101,7 @@ "other": { "name": "ibus-table", "version": "1.12.4", - "downloadUrl": "https://github.com/mike-fabian/ibus-table/archive/refs/tags/ibus-table-1.12.4.tar.gz" + "downloadUrl": "https://github.com/mike-fabian/ibus-table/archive/refs/tags/1.12.4.tar.gz" } } }, From 3d8a0f72dd14e2ff8dfce179c23cdace9e505440 Mon Sep 17 00:00:00 2001 From: Pawel Winogrodzki Date: Fri, 1 Sep 2023 16:47:16 -0700 Subject: [PATCH 61/64] Limited running `setfacl` to package builds (#6133) --- toolkit/scripts/containerized-build.mk | 2 +- toolkit/scripts/pkggen.mk | 2 +- toolkit/scripts/utils.mk | 9 +++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/toolkit/scripts/containerized-build.mk b/toolkit/scripts/containerized-build.mk index 4a7940e1910..b1998a10953 100644 --- a/toolkit/scripts/containerized-build.mk +++ b/toolkit/scripts/containerized-build.mk @@ -33,7 +33,7 @@ endif # SPECS_DIR is always set containerized_build_args += -s ${SPECS_DIR} -containerized-rpmbuild: +containerized-rpmbuild: no_repo_acl $(SCRIPTS_DIR)/containerized-build/create_container_build.sh $(containerized_build_args) containerized-rpmbuild-help: diff --git a/toolkit/scripts/pkggen.mk b/toolkit/scripts/pkggen.mk index 5a7d5af7bce..8a2bcdeee52 100644 --- a/toolkit/scripts/pkggen.mk +++ b/toolkit/scripts/pkggen.mk @@ -257,7 +257,7 @@ $(RPMS_DIR): @touch $@ endif -$(STATUS_FLAGS_DIR)/build-rpms.flag: $(preprocessed_file) $(chroot_worker) $(go-scheduler) $(go-pkgworker) $(depend_STOP_ON_PKG_FAIL) $(CONFIG_FILE) $(depend_CONFIG_FILE) $(depend_PACKAGE_BUILD_LIST) $(depend_PACKAGE_REBUILD_LIST) $(depend_PACKAGE_IGNORE_LIST) $(depend_MAX_CASCADING_REBUILDS) $(depend_TEST_RUN_LIST) $(depend_TEST_RERUN_LIST) $(depend_TEST_IGNORE_LIST) $(pkggen_rpms) $(srpms) $(BUILD_SRPMS_DIR) +$(STATUS_FLAGS_DIR)/build-rpms.flag: no_repo_acl $(preprocessed_file) $(chroot_worker) $(go-scheduler) $(go-pkgworker) $(depend_STOP_ON_PKG_FAIL) $(CONFIG_FILE) $(depend_CONFIG_FILE) $(depend_PACKAGE_BUILD_LIST) $(depend_PACKAGE_REBUILD_LIST) $(depend_PACKAGE_IGNORE_LIST) $(depend_MAX_CASCADING_REBUILDS) $(depend_TEST_RUN_LIST) $(depend_TEST_RERUN_LIST) $(depend_TEST_IGNORE_LIST) $(pkggen_rpms) $(srpms) $(BUILD_SRPMS_DIR) $(go-scheduler) \ --input="$(preprocessed_file)" \ --output="$(built_file)" \ diff --git a/toolkit/scripts/utils.mk b/toolkit/scripts/utils.mk index 54ad44fb1d6..597956b39de 100644 --- a/toolkit/scripts/utils.mk +++ b/toolkit/scripts/utils.mk @@ -58,7 +58,7 @@ watch_vars=PACKAGE_BUILD_LIST PACKAGE_REBUILD_LIST PACKAGE_IGNORE_LIST REPO_LIST # $(depend_TOOLCHAIN_ARCHIVE) $(depend_REBUILD_TOOLCHAIN) $(depend_SRPM_PACK_LIST) $(depend_SPECS_DIR) $(depend_MAX_CASCADING_REBUILDS) $(depend_RUN_CHECK) $(depend_TEST_RUN_LIST) # $(depend_TEST_RERUN_LIST) $(depend_TEST_IGNORE_LIST) -.PHONY: variable_depends_on_phony clean-variable_depends_on_phony +.PHONY: variable_depends_on_phony clean-variable_depends_on_phony no_repo_acl clean: clean-variable_depends_on_phony $(call create_folder,$(STATUS_FLAGS_DIR)) @@ -91,6 +91,7 @@ endef # Invoke the above rule for each tracked variable $(foreach var,$(watch_vars),$(eval $(call depend_on_var,$(var)))) -# Host's extended ACLs influence the default permissions of the -# files inside the built RPMs. Disabling them for the build directory. -$(call shell_real_build_only, setfacl -bnR $(PROJECT_ROOT)) +# Host's ACLs influence the default permissions of the +# files inside the built RPMs. Disabling them for the repository. +no_repo_acl: + @setfacl -bnR $(PROJECT_ROOT) &>/dev/null From 8a2cc1076e9db66430ce4e12f26e31982cea3cff Mon Sep 17 00:00:00 2001 From: Pawel Winogrodzki Date: Sat, 2 Sep 2023 01:55:16 -0700 Subject: [PATCH 62/64] Mitigated build failures in SPECS-EXTENDED during tests. (#6142) --- SPECS-EXTENDED/ibus-table/ibus-table.spec | 126 +++++++++--------- .../libpmemobj-cpp/libpmemobj-cpp.spec | 20 +-- 2 files changed, 78 insertions(+), 68 deletions(-) diff --git a/SPECS-EXTENDED/ibus-table/ibus-table.spec b/SPECS-EXTENDED/ibus-table/ibus-table.spec index 0a5c2cb283b..c2a881f00cc 100644 --- a/SPECS-EXTENDED/ibus-table/ibus-table.spec +++ b/SPECS-EXTENDED/ibus-table/ibus-table.spec @@ -6,7 +6,7 @@ Distribution: Mariner Name: ibus-table Version: 1.12.4 -Release: 3%{?dist} +Release: 4%{?dist} Summary: The Table engine for IBus platform License: LGPLv2+ URL: https://github.com/mike-fabian/ibus-table @@ -17,18 +17,20 @@ Requires: python(abi) >= 3.3 BuildRequires: gcc BuildRequires: ibus-devel > 1.3.0 BuildRequires: python3-devel -# for the unit tests -%if %{with_check} -BuildRequires: libappstream-glib -BuildRequires: desktop-file-utils -BuildRequires: python3-mock -BuildRequires: python3-gobject -BuildRequires: python3-gobject-base -BuildRequires: dbus-x11 -BuildRequires: xorg-x11-server-Xvfb -BuildRequires: ibus-table-chinese-wubi-jidian -BuildRequires: ibus-table-chinese-cangjie -BuildRequires: ibus-table-chinese-stroke5 + +# Test dependencies break the package build. +# Disabling until fixed. +# %if %{with_check} +# BuildRequires: libappstream-glib +# BuildRequires: desktop-file-utils +# BuildRequires: python3-mock +# BuildRequires: python3-gobject +# BuildRequires: python3-gobject-base +# BuildRequires: dbus-x11 +# BuildRequires: xorg-x11-server-Xvfb +# BuildRequires: ibus-table-chinese-wubi-jidian +# BuildRequires: ibus-table-chinese-cangjie +# BuildRequires: ibus-table-chinese-stroke5 # Missing test dependencies: # BuildRequires: appstream @@ -38,7 +40,7 @@ BuildRequires: ibus-table-chinese-stroke5 # BuildRequires: ibus-table-tv # A window manger is needed for the GUI test # BuildRequires: i3 -%endif +# %endif Obsoletes: ibus-table-additional < 1.2.0.20100111-5 @@ -77,52 +79,53 @@ export PYTHON=%{__python3} %find_lang %{name} -%check -appstreamcli validate --pedantic --explain --no-net %{buildroot}/%{_datadir}/metainfo/*.appdata.xml -appstream-util validate-relax --nonet %{buildroot}/%{_datadir}/metainfo/*.appdata.xml -desktop-file-validate \ - $RPM_BUILD_ROOT%{_datadir}/applications/ibus-setup-table.desktop -pushd engine -# run doctests - python3 table.py - python3 it_util.py -popd -mkdir -p /tmp/glib-2.0/schemas/ -cp org.freedesktop.ibus.engine.table.gschema.xml \ - /tmp/glib-2.0/schemas/org.freedesktop.ibus.engine.table.gschema.xml -glib-compile-schemas /tmp/glib-2.0/schemas #&>/dev/null || : -export XDG_DATA_DIRS=/tmp -eval $(dbus-launch --sh-syntax) -dconf dump / -dconf write /org/freedesktop/ibus/engine/table/wubi-jidian/chinesemode 1 -dconf write /org/freedesktop/ibus/engine/table/wubi-jidian/spacekeybehavior false -dconf dump / -export DISPLAY=:1 -Xvfb $DISPLAY -screen 0 1024x768x16 & -# A window manager and and ibus-daemon are needed to run the GUI -# test tests/test_gtk.py, for example i3 can be used. -# -# To debug what is going on if there is a problem with the GUI test -# add BuildRequires: x11vnc and start a vnc server: -# -# x11vnc -display $DISPLAY -unixsock /tmp/mysock -bg -nopw -listen localhost -xkb -# -# Then one can view what is going on outside of the chroot with vncviewer: -# -# vncviewer /var/lib/mock/fedora-32-x86_64/root/tmp/mysock -# -# The GUI test will be skipped if XDG_SESSION_TYPE is not x11 or wayland. -# -#ibus-daemon -drx -#touch /tmp/i3config -#i3 -c /tmp/i3config & -#export XDG_SESSION_TYPE=x11 - -make check && rc=0 || rc=1 -cat tests/*.log -if [ $rc != 0 ] ; then - exit $rc -fi +# Check section disabled as it leaves an unmountable /dev file, which breaks the build environment. +# %check +# appstreamcli validate --pedantic --explain --no-net %{buildroot}/%{_datadir}/metainfo/*.appdata.xml +# appstream-util validate-relax --nonet %{buildroot}/%{_datadir}/metainfo/*.appdata.xml +# desktop-file-validate \ +# $RPM_BUILD_ROOT%{_datadir}/applications/ibus-setup-table.desktop +# pushd engine +# # run doctests +# python3 table.py +# python3 it_util.py +# popd +# mkdir -p /tmp/glib-2.0/schemas/ +# cp org.freedesktop.ibus.engine.table.gschema.xml \ +# /tmp/glib-2.0/schemas/org.freedesktop.ibus.engine.table.gschema.xml +# glib-compile-schemas /tmp/glib-2.0/schemas #&>/dev/null || : +# export XDG_DATA_DIRS=/tmp +# eval $(dbus-launch --sh-syntax) +# dconf dump / +# dconf write /org/freedesktop/ibus/engine/table/wubi-jidian/chinesemode 1 +# dconf write /org/freedesktop/ibus/engine/table/wubi-jidian/spacekeybehavior false +# dconf dump / +# export DISPLAY=:1 +# Xvfb $DISPLAY -screen 0 1024x768x16 & +# # A window manager and and ibus-daemon are needed to run the GUI +# # test tests/test_gtk.py, for example i3 can be used. +# # +# # To debug what is going on if there is a problem with the GUI test +# # add BuildRequires: x11vnc and start a vnc server: +# # +# # x11vnc -display $DISPLAY -unixsock /tmp/mysock -bg -nopw -listen localhost -xkb +# # +# # Then one can view what is going on outside of the chroot with vncviewer: +# # +# # vncviewer /var/lib/mock/fedora-32-x86_64/root/tmp/mysock +# # +# # The GUI test will be skipped if XDG_SESSION_TYPE is not x11 or wayland. +# # +# #ibus-daemon -drx +# #touch /tmp/i3config +# #i3 -c /tmp/i3config & +# #export XDG_SESSION_TYPE=x11 + +# make check && rc=0 || rc=1 +# cat tests/*.log +# if [ $rc != 0 ] ; then +# exit $rc +# fi %post [ -x %{_bindir}/ibus ] && \ @@ -155,6 +158,9 @@ fi %{_datadir}/installed-tests/%{name} %changelog +* Fri Sep 01 2023 Pawel Winogrodzki - 1.12.4-4 +- Disabling test dependencies due to build failures. + * Thu Aug 31 2023 Pawel Winogrodzki - 1.12.4-3 - Disabling missing test dependency. - License verified. diff --git a/SPECS-EXTENDED/libpmemobj-cpp/libpmemobj-cpp.spec b/SPECS-EXTENDED/libpmemobj-cpp/libpmemobj-cpp.spec index 6e6ec5f110d..feac36c2036 100644 --- a/SPECS-EXTENDED/libpmemobj-cpp/libpmemobj-cpp.spec +++ b/SPECS-EXTENDED/libpmemobj-cpp/libpmemobj-cpp.spec @@ -5,7 +5,7 @@ Distribution: Mariner Name: libpmemobj-cpp Version: 1.9 -Release: 3%{?dist} +Release: 4%{?dist} Summary: C++ bindings for libpmemobj # Note: tests/external/libcxx is dual licensed using University of Illinois "BSD-Like" license and the MIT license. It's used only during development/testing and is NOT part of the binary RPM. License: BSD @@ -22,16 +22,17 @@ BuildRequires: doxygen BuildRequires: perl-Encode BuildRequires: gdb -# optional dependencies, used only in tests -%if %{with_check} -BuildRequires: ncurses-devel -BuildRequires: libunwind-devel -BuildRequires: valgrind-devel -BuildRequires: tbb-devel +# Test dependencies break the package build. +# Disabling until fixed. +# %if %{with_check} +# BuildRequires: ncurses-devel +# BuildRequires: libunwind-devel +# BuildRequires: valgrind-devel +# BuildRequires: tbb-devel # Missing test dependencies: # BuildRequires: SFML-devel -%endif +# %endif # There's nothing x86-64 specific in this package, but we have # to duplicate what spec for pmdk/libpmemobj has at the moment. @@ -118,6 +119,9 @@ cd build ctest -V %{?_smp_mflags} -E concurrent_hash_map_rehash_0_helgrind -E concurrent_hash_map_insert_lookup_0_helgrind %changelog +* Fri Sep 01 2023 Pawel Winogrodzki - 1.9-4 +- Disabling test dependencies due to build failures. + * Thu Aug 31 2023 Pawel Winogrodzki - 1.9-3 - Disabling missing test dependency. - License verified. From 9a70db18f329b6a35640de6cb3cdb234085f3ba7 Mon Sep 17 00:00:00 2001 From: Pawel Winogrodzki Date: Mon, 4 Sep 2023 00:49:53 -0700 Subject: [PATCH 63/64] Enabled PR checks for the fast-track branches. (#6141) --- .github/workflows/check-clean-stage.yml | 4 ++-- .github/workflows/check-entangled-specs.yml | 4 ++-- .github/workflows/check-kernel-config.yml | 4 ++-- .github/workflows/check-license-map.yml | 4 ++-- .github/workflows/check-livepatches.yml | 4 ++-- .github/workflows/check-manifests.yml | 4 ++-- .github/workflows/check-package-cgmanifest.yml | 4 ++-- .github/workflows/check-spec.yml | 4 ++-- .github/workflows/check-static-glibc.yml | 4 ++-- .github/workflows/go-test-coverage.yml | 4 ++-- .github/workflows/lint-specs.yml | 4 ++-- 11 files changed, 22 insertions(+), 22 deletions(-) diff --git a/.github/workflows/check-clean-stage.yml b/.github/workflows/check-clean-stage.yml index 937892ab201..a62319a6d76 100644 --- a/.github/workflows/check-clean-stage.yml +++ b/.github/workflows/check-clean-stage.yml @@ -5,9 +5,9 @@ name: Spec %clean stage check on: push: - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] pull_request: - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] jobs: spec-clean-stage-check: diff --git a/.github/workflows/check-entangled-specs.yml b/.github/workflows/check-entangled-specs.yml index dae02c3ab5b..67a9b5452f2 100644 --- a/.github/workflows/check-entangled-specs.yml +++ b/.github/workflows/check-entangled-specs.yml @@ -8,9 +8,9 @@ name: Spec Entanglement Mismatch Check on: push: - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] pull_request: - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] jobs: check: diff --git a/.github/workflows/check-kernel-config.yml b/.github/workflows/check-kernel-config.yml index 51f7281a08a..24e40945334 100644 --- a/.github/workflows/check-kernel-config.yml +++ b/.github/workflows/check-kernel-config.yml @@ -8,11 +8,11 @@ name: Kernel Required Configs Check on: push: - branches: [main, 1.0*, 2.0*] + branches: [main, 1.0*, 2.0*, fasttrack/*] paths: - 'SPECS/kernel*/config*' pull_request: - branches: [main, 1.0*, 2.0*] + branches: [main, 1.0*, 2.0*, fasttrack/*] paths: - 'SPECS/kernel*/config*' diff --git a/.github/workflows/check-license-map.yml b/.github/workflows/check-license-map.yml index 04a95c5318b..f5c37525465 100644 --- a/.github/workflows/check-license-map.yml +++ b/.github/workflows/check-license-map.yml @@ -7,9 +7,9 @@ name: Spec License Map Check on: push: - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] pull_request: - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] jobs: check: diff --git a/.github/workflows/check-livepatches.yml b/.github/workflows/check-livepatches.yml index 99101d6f38a..98f7a78ae9d 100644 --- a/.github/workflows/check-livepatches.yml +++ b/.github/workflows/check-livepatches.yml @@ -5,9 +5,9 @@ name: Livepatch specs check on: push: - branches: [2.0] + branches: [2.0, fasttrack/*] pull_request: - branches: [2.0] + branches: [2.0, fasttrack/*] jobs: spec-check: diff --git a/.github/workflows/check-manifests.yml b/.github/workflows/check-manifests.yml index cf77aadc813..c4157186b37 100644 --- a/.github/workflows/check-manifests.yml +++ b/.github/workflows/check-manifests.yml @@ -5,9 +5,9 @@ name: Check Manifests on: push: - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] pull_request: - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] jobs: build: diff --git a/.github/workflows/check-package-cgmanifest.yml b/.github/workflows/check-package-cgmanifest.yml index 9661bf444ae..1dd245e1e79 100644 --- a/.github/workflows/check-package-cgmanifest.yml +++ b/.github/workflows/check-package-cgmanifest.yml @@ -5,9 +5,9 @@ name: Check Package CGManifests on: push: - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] pull_request: - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] jobs: diff --git a/.github/workflows/check-spec.yml b/.github/workflows/check-spec.yml index 9c40daddf74..f2bb3cf21ea 100644 --- a/.github/workflows/check-spec.yml +++ b/.github/workflows/check-spec.yml @@ -5,9 +5,9 @@ name: Spec files check on: push: - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] pull_request: - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] jobs: spec-check: diff --git a/.github/workflows/check-static-glibc.yml b/.github/workflows/check-static-glibc.yml index 4732bd63462..cccd41ce710 100644 --- a/.github/workflows/check-static-glibc.yml +++ b/.github/workflows/check-static-glibc.yml @@ -6,9 +6,9 @@ name: Static glibc version check on: push: - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] pull_request: - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] jobs: spec-check: diff --git a/.github/workflows/go-test-coverage.yml b/.github/workflows/go-test-coverage.yml index 892f2c3c9f2..11e6a7bf108 100644 --- a/.github/workflows/go-test-coverage.yml +++ b/.github/workflows/go-test-coverage.yml @@ -5,9 +5,9 @@ name: Go Test Coverage on: push: - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] pull_request: - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] jobs: diff --git a/.github/workflows/lint-specs.yml b/.github/workflows/lint-specs.yml index d8444be08f9..cedb9f290a0 100644 --- a/.github/workflows/lint-specs.yml +++ b/.github/workflows/lint-specs.yml @@ -7,11 +7,11 @@ on: push: paths: - '**.spec' - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] pull_request: paths: - '**.spec' - branches: [main, dev, 1.0*, 2.0*] + branches: [main, dev, 1.0*, 2.0*, fasttrack/*] jobs: spec-lint: From 8d373241add85dbc93aada8c6820618d0061065f Mon Sep 17 00:00:00 2001 From: CBL-Mariner-Bot <75509084+CBL-Mariner-Bot@users.noreply.github.com> Date: Mon, 4 Sep 2023 15:21:21 -0700 Subject: [PATCH 64/64] Prepare September 2023 Update (#6160) --- SPECS/mariner-release/mariner-release.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/SPECS/mariner-release/mariner-release.spec b/SPECS/mariner-release/mariner-release.spec index b6124099329..d43537390f9 100644 --- a/SPECS/mariner-release/mariner-release.spec +++ b/SPECS/mariner-release/mariner-release.spec @@ -1,7 +1,7 @@ Summary: CBL-Mariner release files Name: mariner-release Version: 2.0 -Release: 49%{?dist} +Release: 50%{?dist} License: MIT Vendor: Microsoft Corporation Distribution: Mariner @@ -62,6 +62,9 @@ EOF %config(noreplace) %{_sysconfdir}/issue.net %changelog +* Mon Sep 04 2023 CBL-Mariner Servicing Account - 2.0-50 +- Bump release for September 2023 Update + * Mon Aug 21 2023 CBL-Mariner Servicing Account - 2.0-49 - Bump release for August 2023 Release 3