diff --git a/internal/presenter/packages/spdx_helpers_test.go b/internal/presenter/packages/spdx_helpers_test.go index 8bca4b2b8..985e26fed 100644 --- a/internal/presenter/packages/spdx_helpers_test.go +++ b/internal/presenter/packages/spdx_helpers_test.go @@ -95,6 +95,15 @@ func Test_getSPDXLicense(t *testing.T) { }, expected: "GPL-3.0", }, + { + name: "debian to spdx conversion", + input: pkg.Package{ + Licenses: []string{ + "GPL-2", + }, + }, + expected: "GPL-2.0", + }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { diff --git a/internal/spdxlicense/generate/generate_license_list.go b/internal/spdxlicense/generate/generate_license_list.go new file mode 100644 index 000000000..881ce8d41 --- /dev/null +++ b/internal/spdxlicense/generate/generate_license_list.go @@ -0,0 +1,181 @@ +package main + +import ( + "encoding/json" + "log" + "net/http" + "os" + "regexp" + "sort" + "strings" + "text/template" + "time" + + "github.com/scylladb/go-set/strset" +) + +// This program generates license_list.go. +const ( + source = "license_list.go" + url = "https://spdx.org/licenses/licenses.json" +) + +var tmp = template.Must(template.New("").Parse(`// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots at {{ .Timestamp }} +// using data from {{ .URL }} +package spdxlicense + +const Version = {{ printf "%q" .Version }} + +var licenseIDs = map[string]string{ +{{- range $k, $v := .LicenseIDs }} + {{ printf "%q" $k }}: {{ printf "%q" $v }}, +{{- end }} +} +`)) + +var versionMatch = regexp.MustCompile(`-([0-9]+)\.?([0-9]+)?\.?([0-9]+)?\.?`) + +type LicenseList struct { + Version string `json:"licenseListVersion"` + Licenses []struct { + ID string `json:"licenseId"` + Name string `json:"name"` + Text string `json:"licenseText"` + Deprecated bool `json:"isDeprecatedLicenseId"` + OSIApproved bool `json:"isOsiApproved"` + SeeAlso []string `json:"seeAlso"` + } `json:"licenses"` +} + +func main() { + resp, err := http.Get(url) + if err != nil { + log.Fatalf("unable to get licenses list: %+v", err) + } + + var result LicenseList + if err = json.NewDecoder(resp.Body).Decode(&result); err != nil { + log.Fatalf("unable to decode license list: %+v", err) + } + defer func() { + if err := resp.Body.Close(); err != nil { + log.Fatalf("unable to close body: %+v", err) + } + }() + + f, err := os.Create(source) + if err != nil { + log.Fatalf("unable to create %q: %+v", source, err) + } + defer func() { + if err := f.Close(); err != nil { + log.Fatalf("unable to close %q: %+v", source, err) + } + }() + + licenseIDs := processSPDXLicense(result) + + err = tmp.Execute(f, struct { + Timestamp time.Time + URL string + Version string + LicenseIDs map[string]string + }{ + Timestamp: time.Now(), + URL: url, + Version: result.Version, + LicenseIDs: licenseIDs, + }) + + if err != nil { + log.Fatalf("unable to generate template: %+v", err) + } +} + +// Parsing the provided SPDX license list necessitates a two pass approach. +// The first pass is only related to what SPDX considers the truth. These K:V pairs will never be overwritten. +// The second pass attempts to generate known short/long version listings for each key. +// For info on some short name conventions see this document: +// https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/#license-short-name. +// The short long listing generation attempts to build all license permutations for a given key. +// The new keys are then also associated with their relative SPDX value. If a key has already been entered +// we know to ignore it since it came from the first pass which is considered the SPDX source of truth. +// We also sort the licenses for the second pass so that cases like `GPL-1` associate to `GPL-1.0` and not `GPL-1.1`. +func processSPDXLicense(result LicenseList) map[string]string { + // first pass build map + var licenseIDs = make(map[string]string) + for _, l := range result.Licenses { + cleanID := strings.ToLower(l.ID) + if _, exists := licenseIDs[cleanID]; exists { + log.Fatalf("duplicate license ID found: %q", cleanID) + } + licenseIDs[cleanID] = l.ID + } + + sort.Slice(result.Licenses, func(i, j int) bool { + return result.Licenses[i].ID < result.Licenses[j].ID + }) + + // second pass build exceptions + // do not overwrite if already exists + for _, l := range result.Licenses { + var multipleID []string + cleanID := strings.ToLower(l.ID) + multipleID = append(multipleID, buildLicensePermutations(cleanID)...) + for _, id := range multipleID { + if _, exists := licenseIDs[id]; !exists { + licenseIDs[id] = l.ID + } + } + } + + return licenseIDs +} + +func buildLicensePermutations(license string) (perms []string) { + lv := findLicenseVersion(license) + vp := versionPermutations(lv) + + version := strings.Join(lv, ".") + for _, p := range vp { + perms = append(perms, strings.Replace(license, version, p, 1)) + } + + return perms +} + +func findLicenseVersion(license string) (version []string) { + versionList := versionMatch.FindAllStringSubmatch(license, -1) + + if len(versionList) == 0 { + return version + } + + for i, v := range versionList[0] { + if v != "" && i != 0 { + version = append(version, v) + } + } + + return version +} + +func versionPermutations(version []string) []string { + ver := append([]string(nil), version...) + perms := strset.New() + for i := 1; i <= 3; i++ { + if len(ver) < i+1 { + ver = append(ver, "0") + } + + perm := strings.Join(ver[:i], ".") + badCount := strings.Count(perm, "0") + strings.Count(perm, ".") + + if badCount != len(perm) { + perms.Add(perm) + } + } + + return perms.List() +} diff --git a/internal/spdxlicense/generate/generate_license_list_test.go b/internal/spdxlicense/generate/generate_license_list_test.go new file mode 100644 index 000000000..b97b7b9df --- /dev/null +++ b/internal/spdxlicense/generate/generate_license_list_test.go @@ -0,0 +1,146 @@ +package main + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestLicensePermutations(t *testing.T) { + var tests = []struct { + shortName string + permutations []string + }{ + { + "GPL-1-only", + []string{ + "GPL-1-only", + "GPL-1.0-only", + "GPL-1.0.0-only", + }, + }, + { + "GPL-2", + []string{ + "GPL-2", + "GPL-2.0", + "GPL-2.0.0", + }, + }, + { + "GPL-2.0+", + []string{ + "GPL-2+", + "GPL-2.0+", + "GPL-2.0.0+", + }, + }, + { + "GPL-3.0.0-or-later", + []string{ + "GPL-3-or-later", + "GPL-3.0-or-later", + "GPL-3.0.0-or-later", + }, + }, + { + "oldap-2.0", + []string{ + "oldap-2", + "oldap-2.0", + "oldap-2.0.0", + }, + }, + } + + for _, test := range tests { + t.Run(test.shortName, func(t *testing.T) { + perms := buildLicensePermutations(test.shortName) + assert.ElementsMatch(t, test.permutations, perms) + }) + } +} + +func TestVersionPermutations(t *testing.T) { + var tests = []struct { + version []string + permutations []string + }{ + { + []string{"1", "0"}, + []string{"1", "1.0", "1.0.0"}, + }, + { + []string{"2"}, + []string{"2", "2.0", "2.0.0"}, + }, + { + []string{"2", "0"}, + []string{"2", "2.0", "2.0.0"}, + }, + + { + []string{"3", "0", "0"}, + []string{"3", "3.0", "3.0.0"}, + }, + { + []string{"0", "3"}, + []string{"0.3", "0.3.0"}, + }, + { + []string{"0", "0", "3"}, + []string{"0.0.3"}, + }, + } + + for _, test := range tests { + t.Run(strings.Join(test.version, "."), func(t *testing.T) { + got := versionPermutations(test.version) + assert.ElementsMatch(t, test.permutations, got) + }) + } +} + +func TestFindLicenseVersion(t *testing.T) { + var tests = []struct { + license string + version []string + }{ + { + "GPL-1.0-only", + []string{"1", "0"}, + }, + { + "GPL-2.0", + []string{"2", "0"}, + }, + { + "GPL-2.0.0", + []string{"2", "0", "0"}, + }, + { + "GPL-2", + []string{"2"}, + }, + { + "bzip2-1", + []string{"1"}, + }, + { + "php-3.01", + []string{"3", "01"}, + }, + { + "oldap-2.0", + []string{"2", "0"}, + }, + } + + for _, test := range tests { + t.Run(test.license, func(t *testing.T) { + got := findLicenseVersion(test.license) + assert.Equal(t, test.version, got) + }) + } +} diff --git a/internal/spdxlicense/generate_license_list.go b/internal/spdxlicense/generate_license_list.go deleted file mode 100644 index e061b686c..000000000 --- a/internal/spdxlicense/generate_license_list.go +++ /dev/null @@ -1,93 +0,0 @@ -//go:build ignore -// +build ignore - -package main - -import ( - "encoding/json" - "log" - "net/http" - "os" - "strings" - "text/template" - "time" -) - -// This program generates license_list.go. -const ( - source = "license_list.go" - url = "https://spdx.org/licenses/licenses.json" -) - -var tmp = template.Must(template.New("").Parse(`// Code generated by go generate; DO NOT EDIT. -// This file was generated by robots at {{ .Timestamp }} -// using data from {{ .URL }} -package spdxlicense - -const Version = {{ printf "%q" .Version }} - -var licenseIDs = map[string]string{ -{{- range $k, $v := .LicenseIDs }} - {{ printf "%q" $k }}: {{ printf "%q" $v }}, -{{- end }} -} -`)) - -type LicenseList struct { - Version string `json:"licenseListVersion"` - Licenses []struct { - ID string `json:"licenseId"` - Name string `json:"name"` - Text string `json:"licenseText"` - Deprecated bool `json:"isDeprecatedLicenseId"` - OSIApproved bool `json:"isOsiApproved"` - SeeAlso []string `json:"seeAlso"` - } `json:"licenses"` -} - -func main() { - resp, err := http.Get(url) - if err != nil { - log.Fatalf("unable to get licenses list: %+v", err) - } - - var result LicenseList - if err = json.NewDecoder(resp.Body).Decode(&result); err != nil { - log.Fatalf("unable to decode license list: %+v", err) - } - - f, err := os.Create(source) - if err != nil { - log.Fatalf("unable to create %q: %+v", source, err) - } - defer func() { - if err := f.Close(); err != nil { - log.Fatalf("unable to close %q: %+v", source, err) - } - }() - - var licenseIDs = make(map[string]string) - for _, l := range result.Licenses { - cleanID := strings.ToLower(l.ID) - if _, exists := licenseIDs[cleanID]; exists { - log.Fatalf("duplicate license ID found: %q", cleanID) - } - licenseIDs[cleanID] = l.ID - } - - err = tmp.Execute(f, struct { - Timestamp time.Time - URL string - Version string - LicenseIDs map[string]string - }{ - Timestamp: time.Now(), - URL: url, - Version: result.Version, - LicenseIDs: licenseIDs, - }) - - if err != nil { - log.Fatalf("unable to generate template: %+v", err) - } -} diff --git a/internal/spdxlicense/license.go b/internal/spdxlicense/license.go index bcbdc7c73..c0f7f9350 100644 --- a/internal/spdxlicense/license.go +++ b/internal/spdxlicense/license.go @@ -4,7 +4,15 @@ import ( "strings" ) -//go:generate go run generate_license_list.go +// https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/#license-short-name +// License generated in license_list.go uses a regular expression to help resolve cases where +// x.0.0 and x are supplied as version numbers. For SPDX compatibility, versions with trailing +// dot-zeroes are considered to be equivalent to versions without (e.g., “2.0.0” is considered equal to “2.0” and “2”). +// EX: gpl-2+ ---> GPL-2.0+ +// EX: gpl-2.0.0-only ---> GPL-2.0-only +// See the debian link for more details on the spdx license differences + +//go:generate go run generate/generate_license_list.go func ID(id string) (string, bool) { value, exists := licenseIDs[strings.ToLower(id)] diff --git a/internal/spdxlicense/license_list.go b/internal/spdxlicense/license_list.go index 0bd02cc63..5ce29fa22 100644 --- a/internal/spdxlicense/license_list.go +++ b/internal/spdxlicense/license_list.go @@ -1,483 +1,1034 @@ // Code generated by go generate; DO NOT EDIT. -// This file was generated by robots at 2021-08-09 15:08:22.639351 -0400 EDT m=+0.318960693 +// This file was generated by robots at 2021-09-29 23:42:29.616023 -0400 EDT m=+0.184689484 // using data from https://spdx.org/licenses/licenses.json package spdxlicense const Version = "3.14" var licenseIDs = map[string]string{ - "0bsd": "0BSD", - "aal": "AAL", - "abstyles": "Abstyles", - "adobe-2006": "Adobe-2006", - "adobe-glyph": "Adobe-Glyph", - "adsl": "ADSL", - "afl-1.1": "AFL-1.1", - "afl-1.2": "AFL-1.2", - "afl-2.0": "AFL-2.0", - "afl-2.1": "AFL-2.1", - "afl-3.0": "AFL-3.0", - "afmparse": "Afmparse", - "agpl-1.0": "AGPL-1.0", - "agpl-1.0-only": "AGPL-1.0-only", - "agpl-1.0-or-later": "AGPL-1.0-or-later", - "agpl-3.0": "AGPL-3.0", - "agpl-3.0-only": "AGPL-3.0-only", - "agpl-3.0-or-later": "AGPL-3.0-or-later", - "aladdin": "Aladdin", - "amdplpa": "AMDPLPA", - "aml": "AML", - "ampas": "AMPAS", - "antlr-pd": "ANTLR-PD", - "antlr-pd-fallback": "ANTLR-PD-fallback", - "apache-1.0": "Apache-1.0", - "apache-1.1": "Apache-1.1", - "apache-2.0": "Apache-2.0", - "apafml": "APAFML", - "apl-1.0": "APL-1.0", - "apsl-1.0": "APSL-1.0", - "apsl-1.1": "APSL-1.1", - "apsl-1.2": "APSL-1.2", - "apsl-2.0": "APSL-2.0", - "artistic-1.0": "Artistic-1.0", - "artistic-1.0-cl8": "Artistic-1.0-cl8", - "artistic-1.0-perl": "Artistic-1.0-Perl", - "artistic-2.0": "Artistic-2.0", - "bahyph": "Bahyph", - "barr": "Barr", - "beerware": "Beerware", - "bittorrent-1.0": "BitTorrent-1.0", - "bittorrent-1.1": "BitTorrent-1.1", - "blessing": "blessing", - "blueoak-1.0.0": "BlueOak-1.0.0", - "borceux": "Borceux", - "bsd-1-clause": "BSD-1-Clause", - "bsd-2-clause": "BSD-2-Clause", - "bsd-2-clause-freebsd": "BSD-2-Clause-FreeBSD", - "bsd-2-clause-netbsd": "BSD-2-Clause-NetBSD", - "bsd-2-clause-patent": "BSD-2-Clause-Patent", - "bsd-2-clause-views": "BSD-2-Clause-Views", - "bsd-3-clause": "BSD-3-Clause", - "bsd-3-clause-attribution": "BSD-3-Clause-Attribution", - "bsd-3-clause-clear": "BSD-3-Clause-Clear", - "bsd-3-clause-lbnl": "BSD-3-Clause-LBNL", - "bsd-3-clause-modification": "BSD-3-Clause-Modification", - "bsd-3-clause-no-military-license": "BSD-3-Clause-No-Military-License", - "bsd-3-clause-no-nuclear-license": "BSD-3-Clause-No-Nuclear-License", - "bsd-3-clause-no-nuclear-license-2014": "BSD-3-Clause-No-Nuclear-License-2014", - "bsd-3-clause-no-nuclear-warranty": "BSD-3-Clause-No-Nuclear-Warranty", - "bsd-3-clause-open-mpi": "BSD-3-Clause-Open-MPI", - "bsd-4-clause": "BSD-4-Clause", - "bsd-4-clause-shortened": "BSD-4-Clause-Shortened", - "bsd-4-clause-uc": "BSD-4-Clause-UC", - "bsd-protection": "BSD-Protection", - "bsd-source-code": "BSD-Source-Code", - "bsl-1.0": "BSL-1.0", - "busl-1.1": "BUSL-1.1", - "bzip2-1.0.5": "bzip2-1.0.5", - "bzip2-1.0.6": "bzip2-1.0.6", - "c-uda-1.0": "C-UDA-1.0", - "cal-1.0": "CAL-1.0", - "cal-1.0-combined-work-exception": "CAL-1.0-Combined-Work-Exception", - "caldera": "Caldera", - "catosl-1.1": "CATOSL-1.1", - "cc-by-1.0": "CC-BY-1.0", - "cc-by-2.0": "CC-BY-2.0", - "cc-by-2.5": "CC-BY-2.5", - "cc-by-2.5-au": "CC-BY-2.5-AU", - "cc-by-3.0": "CC-BY-3.0", - "cc-by-3.0-at": "CC-BY-3.0-AT", - "cc-by-3.0-de": "CC-BY-3.0-DE", - "cc-by-3.0-nl": "CC-BY-3.0-NL", - "cc-by-3.0-us": "CC-BY-3.0-US", - "cc-by-4.0": "CC-BY-4.0", - "cc-by-nc-1.0": "CC-BY-NC-1.0", - "cc-by-nc-2.0": "CC-BY-NC-2.0", - "cc-by-nc-2.5": "CC-BY-NC-2.5", - "cc-by-nc-3.0": "CC-BY-NC-3.0", - "cc-by-nc-3.0-de": "CC-BY-NC-3.0-DE", - "cc-by-nc-4.0": "CC-BY-NC-4.0", - "cc-by-nc-nd-1.0": "CC-BY-NC-ND-1.0", - "cc-by-nc-nd-2.0": "CC-BY-NC-ND-2.0", - "cc-by-nc-nd-2.5": "CC-BY-NC-ND-2.5", - "cc-by-nc-nd-3.0": "CC-BY-NC-ND-3.0", - "cc-by-nc-nd-3.0-de": "CC-BY-NC-ND-3.0-DE", - "cc-by-nc-nd-3.0-igo": "CC-BY-NC-ND-3.0-IGO", - "cc-by-nc-nd-4.0": "CC-BY-NC-ND-4.0", - "cc-by-nc-sa-1.0": "CC-BY-NC-SA-1.0", - "cc-by-nc-sa-2.0": "CC-BY-NC-SA-2.0", - "cc-by-nc-sa-2.0-fr": "CC-BY-NC-SA-2.0-FR", - "cc-by-nc-sa-2.0-uk": "CC-BY-NC-SA-2.0-UK", - "cc-by-nc-sa-2.5": "CC-BY-NC-SA-2.5", - "cc-by-nc-sa-3.0": "CC-BY-NC-SA-3.0", - "cc-by-nc-sa-3.0-de": "CC-BY-NC-SA-3.0-DE", - "cc-by-nc-sa-3.0-igo": "CC-BY-NC-SA-3.0-IGO", - "cc-by-nc-sa-4.0": "CC-BY-NC-SA-4.0", - "cc-by-nd-1.0": "CC-BY-ND-1.0", - "cc-by-nd-2.0": "CC-BY-ND-2.0", - "cc-by-nd-2.5": "CC-BY-ND-2.5", - "cc-by-nd-3.0": "CC-BY-ND-3.0", - "cc-by-nd-3.0-de": "CC-BY-ND-3.0-DE", - "cc-by-nd-4.0": "CC-BY-ND-4.0", - "cc-by-sa-1.0": "CC-BY-SA-1.0", - "cc-by-sa-2.0": "CC-BY-SA-2.0", - "cc-by-sa-2.0-uk": "CC-BY-SA-2.0-UK", - "cc-by-sa-2.1-jp": "CC-BY-SA-2.1-JP", - "cc-by-sa-2.5": "CC-BY-SA-2.5", - "cc-by-sa-3.0": "CC-BY-SA-3.0", - "cc-by-sa-3.0-at": "CC-BY-SA-3.0-AT", - "cc-by-sa-3.0-de": "CC-BY-SA-3.0-DE", - "cc-by-sa-4.0": "CC-BY-SA-4.0", - "cc-pddc": "CC-PDDC", - "cc0-1.0": "CC0-1.0", - "cddl-1.0": "CDDL-1.0", - "cddl-1.1": "CDDL-1.1", - "cdl-1.0": "CDL-1.0", - "cdla-permissive-1.0": "CDLA-Permissive-1.0", - "cdla-permissive-2.0": "CDLA-Permissive-2.0", - "cdla-sharing-1.0": "CDLA-Sharing-1.0", - "cecill-1.0": "CECILL-1.0", - "cecill-1.1": "CECILL-1.1", - "cecill-2.0": "CECILL-2.0", - "cecill-2.1": "CECILL-2.1", - "cecill-b": "CECILL-B", - "cecill-c": "CECILL-C", - "cern-ohl-1.1": "CERN-OHL-1.1", - "cern-ohl-1.2": "CERN-OHL-1.2", - "cern-ohl-p-2.0": "CERN-OHL-P-2.0", - "cern-ohl-s-2.0": "CERN-OHL-S-2.0", - "cern-ohl-w-2.0": "CERN-OHL-W-2.0", - "clartistic": "ClArtistic", - "cnri-jython": "CNRI-Jython", - "cnri-python": "CNRI-Python", - "cnri-python-gpl-compatible": "CNRI-Python-GPL-Compatible", - "condor-1.1": "Condor-1.1", - "copyleft-next-0.3.0": "copyleft-next-0.3.0", - "copyleft-next-0.3.1": "copyleft-next-0.3.1", - "cpal-1.0": "CPAL-1.0", - "cpl-1.0": "CPL-1.0", - "cpol-1.02": "CPOL-1.02", - "crossword": "Crossword", - "crystalstacker": "CrystalStacker", - "cua-opl-1.0": "CUA-OPL-1.0", - "cube": "Cube", - "curl": "curl", - "d-fsl-1.0": "D-FSL-1.0", - "diffmark": "diffmark", - "doc": "DOC", - "dotseqn": "Dotseqn", - "drl-1.0": "DRL-1.0", - "dsdp": "DSDP", - "dvipdfm": "dvipdfm", - "ecl-1.0": "ECL-1.0", - "ecl-2.0": "ECL-2.0", - "ecos-2.0": "eCos-2.0", - "efl-1.0": "EFL-1.0", - "efl-2.0": "EFL-2.0", - "egenix": "eGenix", - "entessa": "Entessa", - "epics": "EPICS", - "epl-1.0": "EPL-1.0", - "epl-2.0": "EPL-2.0", - "erlpl-1.1": "ErlPL-1.1", - "etalab-2.0": "etalab-2.0", - "eudatagrid": "EUDatagrid", - "eupl-1.0": "EUPL-1.0", - "eupl-1.1": "EUPL-1.1", - "eupl-1.2": "EUPL-1.2", - "eurosym": "Eurosym", - "fair": "Fair", - "frameworx-1.0": "Frameworx-1.0", - "freebsd-doc": "FreeBSD-DOC", - "freeimage": "FreeImage", - "fsfap": "FSFAP", - "fsful": "FSFUL", - "fsfullr": "FSFULLR", - "ftl": "FTL", - "gd": "GD", - "gfdl-1.1": "GFDL-1.1", - "gfdl-1.1-invariants-only": "GFDL-1.1-invariants-only", - "gfdl-1.1-invariants-or-later": "GFDL-1.1-invariants-or-later", - "gfdl-1.1-no-invariants-only": "GFDL-1.1-no-invariants-only", - "gfdl-1.1-no-invariants-or-later": "GFDL-1.1-no-invariants-or-later", - "gfdl-1.1-only": "GFDL-1.1-only", - "gfdl-1.1-or-later": "GFDL-1.1-or-later", - "gfdl-1.2": "GFDL-1.2", - "gfdl-1.2-invariants-only": "GFDL-1.2-invariants-only", - "gfdl-1.2-invariants-or-later": "GFDL-1.2-invariants-or-later", - "gfdl-1.2-no-invariants-only": "GFDL-1.2-no-invariants-only", - "gfdl-1.2-no-invariants-or-later": "GFDL-1.2-no-invariants-or-later", - "gfdl-1.2-only": "GFDL-1.2-only", - "gfdl-1.2-or-later": "GFDL-1.2-or-later", - "gfdl-1.3": "GFDL-1.3", - "gfdl-1.3-invariants-only": "GFDL-1.3-invariants-only", - "gfdl-1.3-invariants-or-later": "GFDL-1.3-invariants-or-later", - "gfdl-1.3-no-invariants-only": "GFDL-1.3-no-invariants-only", - "gfdl-1.3-no-invariants-or-later": "GFDL-1.3-no-invariants-or-later", - "gfdl-1.3-only": "GFDL-1.3-only", - "gfdl-1.3-or-later": "GFDL-1.3-or-later", - "giftware": "Giftware", - "gl2ps": "GL2PS", - "glide": "Glide", - "glulxe": "Glulxe", - "glwtpl": "GLWTPL", - "gnuplot": "gnuplot", - "gpl-1.0": "GPL-1.0", - "gpl-1.0+": "GPL-1.0+", - "gpl-1.0-only": "GPL-1.0-only", - "gpl-1.0-or-later": "GPL-1.0-or-later", - "gpl-2.0": "GPL-2.0", - "gpl-2.0+": "GPL-2.0+", - "gpl-2.0-only": "GPL-2.0-only", - "gpl-2.0-or-later": "GPL-2.0-or-later", - "gpl-2.0-with-autoconf-exception": "GPL-2.0-with-autoconf-exception", - "gpl-2.0-with-bison-exception": "GPL-2.0-with-bison-exception", - "gpl-2.0-with-classpath-exception": "GPL-2.0-with-classpath-exception", - "gpl-2.0-with-font-exception": "GPL-2.0-with-font-exception", - "gpl-2.0-with-gcc-exception": "GPL-2.0-with-GCC-exception", - "gpl-3.0": "GPL-3.0", - "gpl-3.0+": "GPL-3.0+", - "gpl-3.0-only": "GPL-3.0-only", - "gpl-3.0-or-later": "GPL-3.0-or-later", - "gpl-3.0-with-autoconf-exception": "GPL-3.0-with-autoconf-exception", - "gpl-3.0-with-gcc-exception": "GPL-3.0-with-GCC-exception", - "gsoap-1.3b": "gSOAP-1.3b", - "haskellreport": "HaskellReport", - "hippocratic-2.1": "Hippocratic-2.1", - "hpnd": "HPND", - "hpnd-sell-variant": "HPND-sell-variant", - "htmltidy": "HTMLTIDY", - "ibm-pibs": "IBM-pibs", - "icu": "ICU", - "ijg": "IJG", - "imagemagick": "ImageMagick", - "imatix": "iMatix", - "imlib2": "Imlib2", - "info-zip": "Info-ZIP", - "intel": "Intel", - "intel-acpi": "Intel-ACPI", - "interbase-1.0": "Interbase-1.0", - "ipa": "IPA", - "ipl-1.0": "IPL-1.0", - "isc": "ISC", - "jasper-2.0": "JasPer-2.0", - "jpnic": "JPNIC", - "json": "JSON", - "lal-1.2": "LAL-1.2", - "lal-1.3": "LAL-1.3", - "latex2e": "Latex2e", - "leptonica": "Leptonica", - "lgpl-2.0": "LGPL-2.0", - "lgpl-2.0+": "LGPL-2.0+", - "lgpl-2.0-only": "LGPL-2.0-only", - "lgpl-2.0-or-later": "LGPL-2.0-or-later", - "lgpl-2.1": "LGPL-2.1", - "lgpl-2.1+": "LGPL-2.1+", - "lgpl-2.1-only": "LGPL-2.1-only", - "lgpl-2.1-or-later": "LGPL-2.1-or-later", - "lgpl-3.0": "LGPL-3.0", - "lgpl-3.0+": "LGPL-3.0+", - "lgpl-3.0-only": "LGPL-3.0-only", - "lgpl-3.0-or-later": "LGPL-3.0-or-later", - "lgpllr": "LGPLLR", - "libpng": "Libpng", - "libpng-2.0": "libpng-2.0", - "libselinux-1.0": "libselinux-1.0", - "libtiff": "libtiff", - "liliq-p-1.1": "LiLiQ-P-1.1", - "liliq-r-1.1": "LiLiQ-R-1.1", - "liliq-rplus-1.1": "LiLiQ-Rplus-1.1", - "linux-openib": "Linux-OpenIB", - "lpl-1.0": "LPL-1.0", - "lpl-1.02": "LPL-1.02", - "lppl-1.0": "LPPL-1.0", - "lppl-1.1": "LPPL-1.1", - "lppl-1.2": "LPPL-1.2", - "lppl-1.3a": "LPPL-1.3a", - "lppl-1.3c": "LPPL-1.3c", - "makeindex": "MakeIndex", - "miros": "MirOS", - "mit": "MIT", - "mit-0": "MIT-0", - "mit-advertising": "MIT-advertising", - "mit-cmu": "MIT-CMU", - "mit-enna": "MIT-enna", - "mit-feh": "MIT-feh", - "mit-modern-variant": "MIT-Modern-Variant", - "mit-open-group": "MIT-open-group", - "mitnfa": "MITNFA", - "motosoto": "Motosoto", - "mpich2": "mpich2", - "mpl-1.0": "MPL-1.0", - "mpl-1.1": "MPL-1.1", - "mpl-2.0": "MPL-2.0", - "mpl-2.0-no-copyleft-exception": "MPL-2.0-no-copyleft-exception", - "ms-pl": "MS-PL", - "ms-rl": "MS-RL", - "mtll": "MTLL", - "mulanpsl-1.0": "MulanPSL-1.0", - "mulanpsl-2.0": "MulanPSL-2.0", - "multics": "Multics", - "mup": "Mup", - "naist-2003": "NAIST-2003", - "nasa-1.3": "NASA-1.3", - "naumen": "Naumen", - "nbpl-1.0": "NBPL-1.0", - "ncgl-uk-2.0": "NCGL-UK-2.0", - "ncsa": "NCSA", - "net-snmp": "Net-SNMP", - "netcdf": "NetCDF", - "newsletr": "Newsletr", - "ngpl": "NGPL", - "nist-pd": "NIST-PD", - "nist-pd-fallback": "NIST-PD-fallback", - "nlod-1.0": "NLOD-1.0", - "nlod-2.0": "NLOD-2.0", - "nlpl": "NLPL", - "nokia": "Nokia", - "nosl": "NOSL", - "noweb": "Noweb", - "npl-1.0": "NPL-1.0", - "npl-1.1": "NPL-1.1", - "nposl-3.0": "NPOSL-3.0", - "nrl": "NRL", - "ntp": "NTP", - "ntp-0": "NTP-0", - "nunit": "Nunit", - "o-uda-1.0": "O-UDA-1.0", - "occt-pl": "OCCT-PL", - "oclc-2.0": "OCLC-2.0", - "odbl-1.0": "ODbL-1.0", - "odc-by-1.0": "ODC-By-1.0", - "ofl-1.0": "OFL-1.0", - "ofl-1.0-no-rfn": "OFL-1.0-no-RFN", - "ofl-1.0-rfn": "OFL-1.0-RFN", - "ofl-1.1": "OFL-1.1", - "ofl-1.1-no-rfn": "OFL-1.1-no-RFN", - "ofl-1.1-rfn": "OFL-1.1-RFN", - "ogc-1.0": "OGC-1.0", - "ogdl-taiwan-1.0": "OGDL-Taiwan-1.0", - "ogl-canada-2.0": "OGL-Canada-2.0", - "ogl-uk-1.0": "OGL-UK-1.0", - "ogl-uk-2.0": "OGL-UK-2.0", - "ogl-uk-3.0": "OGL-UK-3.0", - "ogtsl": "OGTSL", - "oldap-1.1": "OLDAP-1.1", - "oldap-1.2": "OLDAP-1.2", - "oldap-1.3": "OLDAP-1.3", - "oldap-1.4": "OLDAP-1.4", - "oldap-2.0": "OLDAP-2.0", - "oldap-2.0.1": "OLDAP-2.0.1", - "oldap-2.1": "OLDAP-2.1", - "oldap-2.2": "OLDAP-2.2", - "oldap-2.2.1": "OLDAP-2.2.1", - "oldap-2.2.2": "OLDAP-2.2.2", - "oldap-2.3": "OLDAP-2.3", - "oldap-2.4": "OLDAP-2.4", - "oldap-2.5": "OLDAP-2.5", - "oldap-2.6": "OLDAP-2.6", - "oldap-2.7": "OLDAP-2.7", - "oldap-2.8": "OLDAP-2.8", - "oml": "OML", - "openssl": "OpenSSL", - "opl-1.0": "OPL-1.0", - "opubl-1.0": "OPUBL-1.0", - "oset-pl-2.1": "OSET-PL-2.1", - "osl-1.0": "OSL-1.0", - "osl-1.1": "OSL-1.1", - "osl-2.0": "OSL-2.0", - "osl-2.1": "OSL-2.1", - "osl-3.0": "OSL-3.0", - "parity-6.0.0": "Parity-6.0.0", - "parity-7.0.0": "Parity-7.0.0", - "pddl-1.0": "PDDL-1.0", - "php-3.0": "PHP-3.0", - "php-3.01": "PHP-3.01", - "plexus": "Plexus", - "polyform-noncommercial-1.0.0": "PolyForm-Noncommercial-1.0.0", - "polyform-small-business-1.0.0": "PolyForm-Small-Business-1.0.0", - "postgresql": "PostgreSQL", - "psf-2.0": "PSF-2.0", - "psfrag": "psfrag", - "psutils": "psutils", - "python-2.0": "Python-2.0", - "qhull": "Qhull", - "qpl-1.0": "QPL-1.0", - "rdisc": "Rdisc", - "rhecos-1.1": "RHeCos-1.1", - "rpl-1.1": "RPL-1.1", - "rpl-1.5": "RPL-1.5", - "rpsl-1.0": "RPSL-1.0", - "rsa-md": "RSA-MD", - "rscpl": "RSCPL", - "ruby": "Ruby", - "sax-pd": "SAX-PD", - "saxpath": "Saxpath", - "scea": "SCEA", - "sendmail": "Sendmail", - "sendmail-8.23": "Sendmail-8.23", - "sgi-b-1.0": "SGI-B-1.0", - "sgi-b-1.1": "SGI-B-1.1", - "sgi-b-2.0": "SGI-B-2.0", - "shl-0.5": "SHL-0.5", - "shl-0.51": "SHL-0.51", - "simpl-2.0": "SimPL-2.0", - "sissl": "SISSL", - "sissl-1.2": "SISSL-1.2", - "sleepycat": "Sleepycat", - "smlnj": "SMLNJ", - "smppl": "SMPPL", - "snia": "SNIA", - "spencer-86": "Spencer-86", - "spencer-94": "Spencer-94", - "spencer-99": "Spencer-99", - "spl-1.0": "SPL-1.0", - "ssh-openssh": "SSH-OpenSSH", - "ssh-short": "SSH-short", - "sspl-1.0": "SSPL-1.0", - "standardml-nj": "StandardML-NJ", - "sugarcrm-1.1.3": "SugarCRM-1.1.3", - "swl": "SWL", - "tapr-ohl-1.0": "TAPR-OHL-1.0", - "tcl": "TCL", - "tcp-wrappers": "TCP-wrappers", - "tmate": "TMate", - "torque-1.1": "TORQUE-1.1", - "tosl": "TOSL", - "tu-berlin-1.0": "TU-Berlin-1.0", - "tu-berlin-2.0": "TU-Berlin-2.0", - "ucl-1.0": "UCL-1.0", - "unicode-dfs-2015": "Unicode-DFS-2015", - "unicode-dfs-2016": "Unicode-DFS-2016", - "unicode-tou": "Unicode-TOU", - "unlicense": "Unlicense", - "upl-1.0": "UPL-1.0", - "vim": "Vim", - "vostrom": "VOSTROM", - "vsl-1.0": "VSL-1.0", - "w3c": "W3C", - "w3c-19980720": "W3C-19980720", - "w3c-20150513": "W3C-20150513", - "watcom-1.0": "Watcom-1.0", - "wsuipa": "Wsuipa", - "wtfpl": "WTFPL", - "wxwindows": "wxWindows", - "x11": "X11", - "xerox": "Xerox", - "xfree86-1.1": "XFree86-1.1", - "xinetd": "xinetd", - "xnet": "Xnet", - "xpp": "xpp", - "xskat": "XSkat", - "ypl-1.0": "YPL-1.0", - "ypl-1.1": "YPL-1.1", - "zed": "Zed", - "zend-2.0": "Zend-2.0", - "zimbra-1.3": "Zimbra-1.3", - "zimbra-1.4": "Zimbra-1.4", - "zlib": "Zlib", - "zlib-acknowledgement": "zlib-acknowledgement", - "zpl-1.1": "ZPL-1.1", - "zpl-2.0": "ZPL-2.0", - "zpl-2.1": "ZPL-2.1", + "0bsd": "0BSD", + "aal": "AAL", + "abstyles": "Abstyles", + "adobe-2006": "Adobe-2006", + "adobe-2006.0": "Adobe-2006", + "adobe-2006.0.0": "Adobe-2006", + "adobe-glyph": "Adobe-Glyph", + "adsl": "ADSL", + "afl-1": "AFL-1.1", + "afl-1.1": "AFL-1.1", + "afl-1.1.0": "AFL-1.1", + "afl-1.2": "AFL-1.2", + "afl-1.2.0": "AFL-1.2", + "afl-2": "AFL-2.0", + "afl-2.0": "AFL-2.0", + "afl-2.0.0": "AFL-2.0", + "afl-2.1": "AFL-2.1", + "afl-2.1.0": "AFL-2.1", + "afl-3": "AFL-3.0", + "afl-3.0": "AFL-3.0", + "afl-3.0.0": "AFL-3.0", + "afmparse": "Afmparse", + "agpl-1": "AGPL-1.0", + "agpl-1-only": "AGPL-1.0-only", + "agpl-1-or-later": "AGPL-1.0-or-later", + "agpl-1.0": "AGPL-1.0", + "agpl-1.0-only": "AGPL-1.0-only", + "agpl-1.0-or-later": "AGPL-1.0-or-later", + "agpl-1.0.0": "AGPL-1.0", + "agpl-1.0.0-only": "AGPL-1.0-only", + "agpl-1.0.0-or-later": "AGPL-1.0-or-later", + "agpl-3": "AGPL-3.0", + "agpl-3-only": "AGPL-3.0-only", + "agpl-3-or-later": "AGPL-3.0-or-later", + "agpl-3.0": "AGPL-3.0", + "agpl-3.0-only": "AGPL-3.0-only", + "agpl-3.0-or-later": "AGPL-3.0-or-later", + "agpl-3.0.0": "AGPL-3.0", + "agpl-3.0.0-only": "AGPL-3.0-only", + "agpl-3.0.0-or-later": "AGPL-3.0-or-later", + "aladdin": "Aladdin", + "amdplpa": "AMDPLPA", + "aml": "AML", + "ampas": "AMPAS", + "antlr-pd": "ANTLR-PD", + "antlr-pd-fallback": "ANTLR-PD-fallback", + "apache-1": "Apache-1.0", + "apache-1.0": "Apache-1.0", + "apache-1.0.0": "Apache-1.0", + "apache-1.1": "Apache-1.1", + "apache-1.1.0": "Apache-1.1", + "apache-2": "Apache-2.0", + "apache-2.0": "Apache-2.0", + "apache-2.0.0": "Apache-2.0", + "apafml": "APAFML", + "apl-1": "APL-1.0", + "apl-1.0": "APL-1.0", + "apl-1.0.0": "APL-1.0", + "apsl-1": "APSL-1.0", + "apsl-1.0": "APSL-1.0", + "apsl-1.0.0": "APSL-1.0", + "apsl-1.1": "APSL-1.1", + "apsl-1.1.0": "APSL-1.1", + "apsl-1.2": "APSL-1.2", + "apsl-1.2.0": "APSL-1.2", + "apsl-2": "APSL-2.0", + "apsl-2.0": "APSL-2.0", + "apsl-2.0.0": "APSL-2.0", + "artistic-1": "Artistic-1.0", + "artistic-1-cl8": "Artistic-1.0-cl8", + "artistic-1-perl": "Artistic-1.0-Perl", + "artistic-1.0": "Artistic-1.0", + "artistic-1.0-cl8": "Artistic-1.0-cl8", + "artistic-1.0-perl": "Artistic-1.0-Perl", + "artistic-1.0.0": "Artistic-1.0", + "artistic-1.0.0-cl8": "Artistic-1.0-cl8", + "artistic-1.0.0-perl": "Artistic-1.0-Perl", + "artistic-2": "Artistic-2.0", + "artistic-2.0": "Artistic-2.0", + "artistic-2.0.0": "Artistic-2.0", + "bahyph": "Bahyph", + "barr": "Barr", + "beerware": "Beerware", + "bittorrent-1": "BitTorrent-1.0", + "bittorrent-1.0": "BitTorrent-1.0", + "bittorrent-1.0.0": "BitTorrent-1.0", + "bittorrent-1.1": "BitTorrent-1.1", + "bittorrent-1.1.0": "BitTorrent-1.1", + "blessing": "blessing", + "blueoak-1": "BlueOak-1.0.0", + "blueoak-1.0": "BlueOak-1.0.0", + "blueoak-1.0.0": "BlueOak-1.0.0", + "borceux": "Borceux", + "bsd-1-clause": "BSD-1-Clause", + "bsd-1.0-clause": "BSD-1-Clause", + "bsd-1.0.0-clause": "BSD-1-Clause", + "bsd-2-clause": "BSD-2-Clause", + "bsd-2-clause-freebsd": "BSD-2-Clause-FreeBSD", + "bsd-2-clause-netbsd": "BSD-2-Clause-NetBSD", + "bsd-2-clause-patent": "BSD-2-Clause-Patent", + "bsd-2-clause-views": "BSD-2-Clause-Views", + "bsd-2.0-clause": "BSD-2-Clause", + "bsd-2.0-clause-freebsd": "BSD-2-Clause-FreeBSD", + "bsd-2.0-clause-netbsd": "BSD-2-Clause-NetBSD", + "bsd-2.0-clause-patent": "BSD-2-Clause-Patent", + "bsd-2.0-clause-views": "BSD-2-Clause-Views", + "bsd-2.0.0-clause": "BSD-2-Clause", + "bsd-2.0.0-clause-freebsd": "BSD-2-Clause-FreeBSD", + "bsd-2.0.0-clause-netbsd": "BSD-2-Clause-NetBSD", + "bsd-2.0.0-clause-patent": "BSD-2-Clause-Patent", + "bsd-2.0.0-clause-views": "BSD-2-Clause-Views", + "bsd-3-clause": "BSD-3-Clause", + "bsd-3-clause-attribution": "BSD-3-Clause-Attribution", + "bsd-3-clause-clear": "BSD-3-Clause-Clear", + "bsd-3-clause-lbnl": "BSD-3-Clause-LBNL", + "bsd-3-clause-modification": "BSD-3-Clause-Modification", + "bsd-3-clause-no-military-license": "BSD-3-Clause-No-Military-License", + "bsd-3-clause-no-nuclear-license": "BSD-3-Clause-No-Nuclear-License", + "bsd-3-clause-no-nuclear-license-2014": "BSD-3-Clause-No-Nuclear-License-2014", + "bsd-3-clause-no-nuclear-warranty": "BSD-3-Clause-No-Nuclear-Warranty", + "bsd-3-clause-open-mpi": "BSD-3-Clause-Open-MPI", + "bsd-3.0-clause": "BSD-3-Clause", + "bsd-3.0-clause-attribution": "BSD-3-Clause-Attribution", + "bsd-3.0-clause-clear": "BSD-3-Clause-Clear", + "bsd-3.0-clause-lbnl": "BSD-3-Clause-LBNL", + "bsd-3.0-clause-modification": "BSD-3-Clause-Modification", + "bsd-3.0-clause-no-military-license": "BSD-3-Clause-No-Military-License", + "bsd-3.0-clause-no-nuclear-license": "BSD-3-Clause-No-Nuclear-License", + "bsd-3.0-clause-no-nuclear-license-2014": "BSD-3-Clause-No-Nuclear-License-2014", + "bsd-3.0-clause-no-nuclear-warranty": "BSD-3-Clause-No-Nuclear-Warranty", + "bsd-3.0-clause-open-mpi": "BSD-3-Clause-Open-MPI", + "bsd-3.0.0-clause": "BSD-3-Clause", + "bsd-3.0.0-clause-attribution": "BSD-3-Clause-Attribution", + "bsd-3.0.0-clause-clear": "BSD-3-Clause-Clear", + "bsd-3.0.0-clause-lbnl": "BSD-3-Clause-LBNL", + "bsd-3.0.0-clause-modification": "BSD-3-Clause-Modification", + "bsd-3.0.0-clause-no-military-license": "BSD-3-Clause-No-Military-License", + "bsd-3.0.0-clause-no-nuclear-license": "BSD-3-Clause-No-Nuclear-License", + "bsd-3.0.0-clause-no-nuclear-license-2014": "BSD-3-Clause-No-Nuclear-License-2014", + "bsd-3.0.0-clause-no-nuclear-warranty": "BSD-3-Clause-No-Nuclear-Warranty", + "bsd-3.0.0-clause-open-mpi": "BSD-3-Clause-Open-MPI", + "bsd-4-clause": "BSD-4-Clause", + "bsd-4-clause-shortened": "BSD-4-Clause-Shortened", + "bsd-4-clause-uc": "BSD-4-Clause-UC", + "bsd-4.0-clause": "BSD-4-Clause", + "bsd-4.0-clause-shortened": "BSD-4-Clause-Shortened", + "bsd-4.0-clause-uc": "BSD-4-Clause-UC", + "bsd-4.0.0-clause": "BSD-4-Clause", + "bsd-4.0.0-clause-shortened": "BSD-4-Clause-Shortened", + "bsd-4.0.0-clause-uc": "BSD-4-Clause-UC", + "bsd-protection": "BSD-Protection", + "bsd-source-code": "BSD-Source-Code", + "bsl-1": "BSL-1.0", + "bsl-1.0": "BSL-1.0", + "bsl-1.0.0": "BSL-1.0", + "busl-1": "BUSL-1.1", + "busl-1.1": "BUSL-1.1", + "busl-1.1.0": "BUSL-1.1", + "bzip2-1": "bzip2-1.0.5", + "bzip2-1.0": "bzip2-1.0.5", + "bzip2-1.0.5": "bzip2-1.0.5", + "bzip2-1.0.6": "bzip2-1.0.6", + "c-uda-1": "C-UDA-1.0", + "c-uda-1.0": "C-UDA-1.0", + "c-uda-1.0.0": "C-UDA-1.0", + "cal-1": "CAL-1.0", + "cal-1-combined-work-exception": "CAL-1.0-Combined-Work-Exception", + "cal-1.0": "CAL-1.0", + "cal-1.0-combined-work-exception": "CAL-1.0-Combined-Work-Exception", + "cal-1.0.0": "CAL-1.0", + "cal-1.0.0-combined-work-exception": "CAL-1.0-Combined-Work-Exception", + "caldera": "Caldera", + "catosl-1": "CATOSL-1.1", + "catosl-1.1": "CATOSL-1.1", + "catosl-1.1.0": "CATOSL-1.1", + "cc-by-1": "CC-BY-1.0", + "cc-by-1.0": "CC-BY-1.0", + "cc-by-1.0.0": "CC-BY-1.0", + "cc-by-2": "CC-BY-2.0", + "cc-by-2-au": "CC-BY-2.5-AU", + "cc-by-2.0": "CC-BY-2.0", + "cc-by-2.0.0": "CC-BY-2.0", + "cc-by-2.5": "CC-BY-2.5", + "cc-by-2.5-au": "CC-BY-2.5-AU", + "cc-by-2.5.0": "CC-BY-2.5", + "cc-by-2.5.0-au": "CC-BY-2.5-AU", + "cc-by-3": "CC-BY-3.0", + "cc-by-3-at": "CC-BY-3.0-AT", + "cc-by-3-de": "CC-BY-3.0-DE", + "cc-by-3-nl": "CC-BY-3.0-NL", + "cc-by-3-us": "CC-BY-3.0-US", + "cc-by-3.0": "CC-BY-3.0", + "cc-by-3.0-at": "CC-BY-3.0-AT", + "cc-by-3.0-de": "CC-BY-3.0-DE", + "cc-by-3.0-nl": "CC-BY-3.0-NL", + "cc-by-3.0-us": "CC-BY-3.0-US", + "cc-by-3.0.0": "CC-BY-3.0", + "cc-by-3.0.0-at": "CC-BY-3.0-AT", + "cc-by-3.0.0-de": "CC-BY-3.0-DE", + "cc-by-3.0.0-nl": "CC-BY-3.0-NL", + "cc-by-3.0.0-us": "CC-BY-3.0-US", + "cc-by-4": "CC-BY-4.0", + "cc-by-4.0": "CC-BY-4.0", + "cc-by-4.0.0": "CC-BY-4.0", + "cc-by-nc-1": "CC-BY-NC-1.0", + "cc-by-nc-1.0": "CC-BY-NC-1.0", + "cc-by-nc-1.0.0": "CC-BY-NC-1.0", + "cc-by-nc-2": "CC-BY-NC-2.0", + "cc-by-nc-2.0": "CC-BY-NC-2.0", + "cc-by-nc-2.0.0": "CC-BY-NC-2.0", + "cc-by-nc-2.5": "CC-BY-NC-2.5", + "cc-by-nc-2.5.0": "CC-BY-NC-2.5", + "cc-by-nc-3": "CC-BY-NC-3.0", + "cc-by-nc-3-de": "CC-BY-NC-3.0-DE", + "cc-by-nc-3.0": "CC-BY-NC-3.0", + "cc-by-nc-3.0-de": "CC-BY-NC-3.0-DE", + "cc-by-nc-3.0.0": "CC-BY-NC-3.0", + "cc-by-nc-3.0.0-de": "CC-BY-NC-3.0-DE", + "cc-by-nc-4": "CC-BY-NC-4.0", + "cc-by-nc-4.0": "CC-BY-NC-4.0", + "cc-by-nc-4.0.0": "CC-BY-NC-4.0", + "cc-by-nc-nd-1": "CC-BY-NC-ND-1.0", + "cc-by-nc-nd-1.0": "CC-BY-NC-ND-1.0", + "cc-by-nc-nd-1.0.0": "CC-BY-NC-ND-1.0", + "cc-by-nc-nd-2": "CC-BY-NC-ND-2.0", + "cc-by-nc-nd-2.0": "CC-BY-NC-ND-2.0", + "cc-by-nc-nd-2.0.0": "CC-BY-NC-ND-2.0", + "cc-by-nc-nd-2.5": "CC-BY-NC-ND-2.5", + "cc-by-nc-nd-2.5.0": "CC-BY-NC-ND-2.5", + "cc-by-nc-nd-3": "CC-BY-NC-ND-3.0", + "cc-by-nc-nd-3-de": "CC-BY-NC-ND-3.0-DE", + "cc-by-nc-nd-3-igo": "CC-BY-NC-ND-3.0-IGO", + "cc-by-nc-nd-3.0": "CC-BY-NC-ND-3.0", + "cc-by-nc-nd-3.0-de": "CC-BY-NC-ND-3.0-DE", + "cc-by-nc-nd-3.0-igo": "CC-BY-NC-ND-3.0-IGO", + "cc-by-nc-nd-3.0.0": "CC-BY-NC-ND-3.0", + "cc-by-nc-nd-3.0.0-de": "CC-BY-NC-ND-3.0-DE", + "cc-by-nc-nd-3.0.0-igo": "CC-BY-NC-ND-3.0-IGO", + "cc-by-nc-nd-4": "CC-BY-NC-ND-4.0", + "cc-by-nc-nd-4.0": "CC-BY-NC-ND-4.0", + "cc-by-nc-nd-4.0.0": "CC-BY-NC-ND-4.0", + "cc-by-nc-sa-1": "CC-BY-NC-SA-1.0", + "cc-by-nc-sa-1.0": "CC-BY-NC-SA-1.0", + "cc-by-nc-sa-1.0.0": "CC-BY-NC-SA-1.0", + "cc-by-nc-sa-2": "CC-BY-NC-SA-2.0", + "cc-by-nc-sa-2-fr": "CC-BY-NC-SA-2.0-FR", + "cc-by-nc-sa-2-uk": "CC-BY-NC-SA-2.0-UK", + "cc-by-nc-sa-2.0": "CC-BY-NC-SA-2.0", + "cc-by-nc-sa-2.0-fr": "CC-BY-NC-SA-2.0-FR", + "cc-by-nc-sa-2.0-uk": "CC-BY-NC-SA-2.0-UK", + "cc-by-nc-sa-2.0.0": "CC-BY-NC-SA-2.0", + "cc-by-nc-sa-2.0.0-fr": "CC-BY-NC-SA-2.0-FR", + "cc-by-nc-sa-2.0.0-uk": "CC-BY-NC-SA-2.0-UK", + "cc-by-nc-sa-2.5": "CC-BY-NC-SA-2.5", + "cc-by-nc-sa-2.5.0": "CC-BY-NC-SA-2.5", + "cc-by-nc-sa-3": "CC-BY-NC-SA-3.0", + "cc-by-nc-sa-3-de": "CC-BY-NC-SA-3.0-DE", + "cc-by-nc-sa-3-igo": "CC-BY-NC-SA-3.0-IGO", + "cc-by-nc-sa-3.0": "CC-BY-NC-SA-3.0", + "cc-by-nc-sa-3.0-de": "CC-BY-NC-SA-3.0-DE", + "cc-by-nc-sa-3.0-igo": "CC-BY-NC-SA-3.0-IGO", + "cc-by-nc-sa-3.0.0": "CC-BY-NC-SA-3.0", + "cc-by-nc-sa-3.0.0-de": "CC-BY-NC-SA-3.0-DE", + "cc-by-nc-sa-3.0.0-igo": "CC-BY-NC-SA-3.0-IGO", + "cc-by-nc-sa-4": "CC-BY-NC-SA-4.0", + "cc-by-nc-sa-4.0": "CC-BY-NC-SA-4.0", + "cc-by-nc-sa-4.0.0": "CC-BY-NC-SA-4.0", + "cc-by-nd-1": "CC-BY-ND-1.0", + "cc-by-nd-1.0": "CC-BY-ND-1.0", + "cc-by-nd-1.0.0": "CC-BY-ND-1.0", + "cc-by-nd-2": "CC-BY-ND-2.0", + "cc-by-nd-2.0": "CC-BY-ND-2.0", + "cc-by-nd-2.0.0": "CC-BY-ND-2.0", + "cc-by-nd-2.5": "CC-BY-ND-2.5", + "cc-by-nd-2.5.0": "CC-BY-ND-2.5", + "cc-by-nd-3": "CC-BY-ND-3.0", + "cc-by-nd-3-de": "CC-BY-ND-3.0-DE", + "cc-by-nd-3.0": "CC-BY-ND-3.0", + "cc-by-nd-3.0-de": "CC-BY-ND-3.0-DE", + "cc-by-nd-3.0.0": "CC-BY-ND-3.0", + "cc-by-nd-3.0.0-de": "CC-BY-ND-3.0-DE", + "cc-by-nd-4": "CC-BY-ND-4.0", + "cc-by-nd-4.0": "CC-BY-ND-4.0", + "cc-by-nd-4.0.0": "CC-BY-ND-4.0", + "cc-by-sa-1": "CC-BY-SA-1.0", + "cc-by-sa-1.0": "CC-BY-SA-1.0", + "cc-by-sa-1.0.0": "CC-BY-SA-1.0", + "cc-by-sa-2": "CC-BY-SA-2.0", + "cc-by-sa-2-jp": "CC-BY-SA-2.1-JP", + "cc-by-sa-2-uk": "CC-BY-SA-2.0-UK", + "cc-by-sa-2.0": "CC-BY-SA-2.0", + "cc-by-sa-2.0-uk": "CC-BY-SA-2.0-UK", + "cc-by-sa-2.0.0": "CC-BY-SA-2.0", + "cc-by-sa-2.0.0-uk": "CC-BY-SA-2.0-UK", + "cc-by-sa-2.1-jp": "CC-BY-SA-2.1-JP", + "cc-by-sa-2.1.0-jp": "CC-BY-SA-2.1-JP", + "cc-by-sa-2.5": "CC-BY-SA-2.5", + "cc-by-sa-2.5.0": "CC-BY-SA-2.5", + "cc-by-sa-3": "CC-BY-SA-3.0", + "cc-by-sa-3-at": "CC-BY-SA-3.0-AT", + "cc-by-sa-3-de": "CC-BY-SA-3.0-DE", + "cc-by-sa-3.0": "CC-BY-SA-3.0", + "cc-by-sa-3.0-at": "CC-BY-SA-3.0-AT", + "cc-by-sa-3.0-de": "CC-BY-SA-3.0-DE", + "cc-by-sa-3.0.0": "CC-BY-SA-3.0", + "cc-by-sa-3.0.0-at": "CC-BY-SA-3.0-AT", + "cc-by-sa-3.0.0-de": "CC-BY-SA-3.0-DE", + "cc-by-sa-4": "CC-BY-SA-4.0", + "cc-by-sa-4.0": "CC-BY-SA-4.0", + "cc-by-sa-4.0.0": "CC-BY-SA-4.0", + "cc-pddc": "CC-PDDC", + "cc0-1": "CC0-1.0", + "cc0-1.0": "CC0-1.0", + "cc0-1.0.0": "CC0-1.0", + "cddl-1": "CDDL-1.0", + "cddl-1.0": "CDDL-1.0", + "cddl-1.0.0": "CDDL-1.0", + "cddl-1.1": "CDDL-1.1", + "cddl-1.1.0": "CDDL-1.1", + "cdl-1": "CDL-1.0", + "cdl-1.0": "CDL-1.0", + "cdl-1.0.0": "CDL-1.0", + "cdla-permissive-1": "CDLA-Permissive-1.0", + "cdla-permissive-1.0": "CDLA-Permissive-1.0", + "cdla-permissive-1.0.0": "CDLA-Permissive-1.0", + "cdla-permissive-2": "CDLA-Permissive-2.0", + "cdla-permissive-2.0": "CDLA-Permissive-2.0", + "cdla-permissive-2.0.0": "CDLA-Permissive-2.0", + "cdla-sharing-1": "CDLA-Sharing-1.0", + "cdla-sharing-1.0": "CDLA-Sharing-1.0", + "cdla-sharing-1.0.0": "CDLA-Sharing-1.0", + "cecill-1": "CECILL-1.0", + "cecill-1.0": "CECILL-1.0", + "cecill-1.0.0": "CECILL-1.0", + "cecill-1.1": "CECILL-1.1", + "cecill-1.1.0": "CECILL-1.1", + "cecill-2": "CECILL-2.0", + "cecill-2.0": "CECILL-2.0", + "cecill-2.0.0": "CECILL-2.0", + "cecill-2.1": "CECILL-2.1", + "cecill-2.1.0": "CECILL-2.1", + "cecill-b": "CECILL-B", + "cecill-c": "CECILL-C", + "cern-ohl-1": "CERN-OHL-1.1", + "cern-ohl-1.1": "CERN-OHL-1.1", + "cern-ohl-1.1.0": "CERN-OHL-1.1", + "cern-ohl-1.2": "CERN-OHL-1.2", + "cern-ohl-1.2.0": "CERN-OHL-1.2", + "cern-ohl-p-2": "CERN-OHL-P-2.0", + "cern-ohl-p-2.0": "CERN-OHL-P-2.0", + "cern-ohl-p-2.0.0": "CERN-OHL-P-2.0", + "cern-ohl-s-2": "CERN-OHL-S-2.0", + "cern-ohl-s-2.0": "CERN-OHL-S-2.0", + "cern-ohl-s-2.0.0": "CERN-OHL-S-2.0", + "cern-ohl-w-2": "CERN-OHL-W-2.0", + "cern-ohl-w-2.0": "CERN-OHL-W-2.0", + "cern-ohl-w-2.0.0": "CERN-OHL-W-2.0", + "clartistic": "ClArtistic", + "cnri-jython": "CNRI-Jython", + "cnri-python": "CNRI-Python", + "cnri-python-gpl-compatible": "CNRI-Python-GPL-Compatible", + "condor-1": "Condor-1.1", + "condor-1.1": "Condor-1.1", + "condor-1.1.0": "Condor-1.1", + "copyleft-next-0.3": "copyleft-next-0.3.0", + "copyleft-next-0.3.0": "copyleft-next-0.3.0", + "copyleft-next-0.3.1": "copyleft-next-0.3.1", + "cpal-1": "CPAL-1.0", + "cpal-1.0": "CPAL-1.0", + "cpal-1.0.0": "CPAL-1.0", + "cpl-1": "CPL-1.0", + "cpl-1.0": "CPL-1.0", + "cpl-1.0.0": "CPL-1.0", + "cpol-1": "CPOL-1.02", + "cpol-1.02": "CPOL-1.02", + "cpol-1.02.0": "CPOL-1.02", + "crossword": "Crossword", + "crystalstacker": "CrystalStacker", + "cua-opl-1": "CUA-OPL-1.0", + "cua-opl-1.0": "CUA-OPL-1.0", + "cua-opl-1.0.0": "CUA-OPL-1.0", + "cube": "Cube", + "curl": "curl", + "d-fsl-1": "D-FSL-1.0", + "d-fsl-1.0": "D-FSL-1.0", + "d-fsl-1.0.0": "D-FSL-1.0", + "diffmark": "diffmark", + "doc": "DOC", + "dotseqn": "Dotseqn", + "drl-1": "DRL-1.0", + "drl-1.0": "DRL-1.0", + "drl-1.0.0": "DRL-1.0", + "dsdp": "DSDP", + "dvipdfm": "dvipdfm", + "ecl-1": "ECL-1.0", + "ecl-1.0": "ECL-1.0", + "ecl-1.0.0": "ECL-1.0", + "ecl-2": "ECL-2.0", + "ecl-2.0": "ECL-2.0", + "ecl-2.0.0": "ECL-2.0", + "ecos-2": "eCos-2.0", + "ecos-2.0": "eCos-2.0", + "ecos-2.0.0": "eCos-2.0", + "efl-1": "EFL-1.0", + "efl-1.0": "EFL-1.0", + "efl-1.0.0": "EFL-1.0", + "efl-2": "EFL-2.0", + "efl-2.0": "EFL-2.0", + "efl-2.0.0": "EFL-2.0", + "egenix": "eGenix", + "entessa": "Entessa", + "epics": "EPICS", + "epl-1": "EPL-1.0", + "epl-1.0": "EPL-1.0", + "epl-1.0.0": "EPL-1.0", + "epl-2": "EPL-2.0", + "epl-2.0": "EPL-2.0", + "epl-2.0.0": "EPL-2.0", + "erlpl-1": "ErlPL-1.1", + "erlpl-1.1": "ErlPL-1.1", + "erlpl-1.1.0": "ErlPL-1.1", + "etalab-2": "etalab-2.0", + "etalab-2.0": "etalab-2.0", + "etalab-2.0.0": "etalab-2.0", + "eudatagrid": "EUDatagrid", + "eupl-1": "EUPL-1.0", + "eupl-1.0": "EUPL-1.0", + "eupl-1.0.0": "EUPL-1.0", + "eupl-1.1": "EUPL-1.1", + "eupl-1.1.0": "EUPL-1.1", + "eupl-1.2": "EUPL-1.2", + "eupl-1.2.0": "EUPL-1.2", + "eurosym": "Eurosym", + "fair": "Fair", + "frameworx-1": "Frameworx-1.0", + "frameworx-1.0": "Frameworx-1.0", + "frameworx-1.0.0": "Frameworx-1.0", + "freebsd-doc": "FreeBSD-DOC", + "freeimage": "FreeImage", + "fsfap": "FSFAP", + "fsful": "FSFUL", + "fsfullr": "FSFULLR", + "ftl": "FTL", + "gd": "GD", + "gfdl-1": "GFDL-1.1", + "gfdl-1-invariants-only": "GFDL-1.1-invariants-only", + "gfdl-1-invariants-or-later": "GFDL-1.1-invariants-or-later", + "gfdl-1-no-invariants-only": "GFDL-1.1-no-invariants-only", + "gfdl-1-no-invariants-or-later": "GFDL-1.1-no-invariants-or-later", + "gfdl-1-only": "GFDL-1.1-only", + "gfdl-1-or-later": "GFDL-1.1-or-later", + "gfdl-1.1": "GFDL-1.1", + "gfdl-1.1-invariants-only": "GFDL-1.1-invariants-only", + "gfdl-1.1-invariants-or-later": "GFDL-1.1-invariants-or-later", + "gfdl-1.1-no-invariants-only": "GFDL-1.1-no-invariants-only", + "gfdl-1.1-no-invariants-or-later": "GFDL-1.1-no-invariants-or-later", + "gfdl-1.1-only": "GFDL-1.1-only", + "gfdl-1.1-or-later": "GFDL-1.1-or-later", + "gfdl-1.1.0": "GFDL-1.1", + "gfdl-1.1.0-invariants-only": "GFDL-1.1-invariants-only", + "gfdl-1.1.0-invariants-or-later": "GFDL-1.1-invariants-or-later", + "gfdl-1.1.0-no-invariants-only": "GFDL-1.1-no-invariants-only", + "gfdl-1.1.0-no-invariants-or-later": "GFDL-1.1-no-invariants-or-later", + "gfdl-1.1.0-only": "GFDL-1.1-only", + "gfdl-1.1.0-or-later": "GFDL-1.1-or-later", + "gfdl-1.2": "GFDL-1.2", + "gfdl-1.2-invariants-only": "GFDL-1.2-invariants-only", + "gfdl-1.2-invariants-or-later": "GFDL-1.2-invariants-or-later", + "gfdl-1.2-no-invariants-only": "GFDL-1.2-no-invariants-only", + "gfdl-1.2-no-invariants-or-later": "GFDL-1.2-no-invariants-or-later", + "gfdl-1.2-only": "GFDL-1.2-only", + "gfdl-1.2-or-later": "GFDL-1.2-or-later", + "gfdl-1.2.0": "GFDL-1.2", + "gfdl-1.2.0-invariants-only": "GFDL-1.2-invariants-only", + "gfdl-1.2.0-invariants-or-later": "GFDL-1.2-invariants-or-later", + "gfdl-1.2.0-no-invariants-only": "GFDL-1.2-no-invariants-only", + "gfdl-1.2.0-no-invariants-or-later": "GFDL-1.2-no-invariants-or-later", + "gfdl-1.2.0-only": "GFDL-1.2-only", + "gfdl-1.2.0-or-later": "GFDL-1.2-or-later", + "gfdl-1.3": "GFDL-1.3", + "gfdl-1.3-invariants-only": "GFDL-1.3-invariants-only", + "gfdl-1.3-invariants-or-later": "GFDL-1.3-invariants-or-later", + "gfdl-1.3-no-invariants-only": "GFDL-1.3-no-invariants-only", + "gfdl-1.3-no-invariants-or-later": "GFDL-1.3-no-invariants-or-later", + "gfdl-1.3-only": "GFDL-1.3-only", + "gfdl-1.3-or-later": "GFDL-1.3-or-later", + "gfdl-1.3.0": "GFDL-1.3", + "gfdl-1.3.0-invariants-only": "GFDL-1.3-invariants-only", + "gfdl-1.3.0-invariants-or-later": "GFDL-1.3-invariants-or-later", + "gfdl-1.3.0-no-invariants-only": "GFDL-1.3-no-invariants-only", + "gfdl-1.3.0-no-invariants-or-later": "GFDL-1.3-no-invariants-or-later", + "gfdl-1.3.0-only": "GFDL-1.3-only", + "gfdl-1.3.0-or-later": "GFDL-1.3-or-later", + "giftware": "Giftware", + "gl2ps": "GL2PS", + "glide": "Glide", + "glulxe": "Glulxe", + "glwtpl": "GLWTPL", + "gnuplot": "gnuplot", + "gpl-1": "GPL-1.0", + "gpl-1+": "GPL-1.0+", + "gpl-1-only": "GPL-1.0-only", + "gpl-1-or-later": "GPL-1.0-or-later", + "gpl-1.0": "GPL-1.0", + "gpl-1.0+": "GPL-1.0+", + "gpl-1.0-only": "GPL-1.0-only", + "gpl-1.0-or-later": "GPL-1.0-or-later", + "gpl-1.0.0": "GPL-1.0", + "gpl-1.0.0+": "GPL-1.0+", + "gpl-1.0.0-only": "GPL-1.0-only", + "gpl-1.0.0-or-later": "GPL-1.0-or-later", + "gpl-2": "GPL-2.0", + "gpl-2+": "GPL-2.0+", + "gpl-2-only": "GPL-2.0-only", + "gpl-2-or-later": "GPL-2.0-or-later", + "gpl-2-with-autoconf-exception": "GPL-2.0-with-autoconf-exception", + "gpl-2-with-bison-exception": "GPL-2.0-with-bison-exception", + "gpl-2-with-classpath-exception": "GPL-2.0-with-classpath-exception", + "gpl-2-with-font-exception": "GPL-2.0-with-font-exception", + "gpl-2-with-gcc-exception": "GPL-2.0-with-GCC-exception", + "gpl-2.0": "GPL-2.0", + "gpl-2.0+": "GPL-2.0+", + "gpl-2.0-only": "GPL-2.0-only", + "gpl-2.0-or-later": "GPL-2.0-or-later", + "gpl-2.0-with-autoconf-exception": "GPL-2.0-with-autoconf-exception", + "gpl-2.0-with-bison-exception": "GPL-2.0-with-bison-exception", + "gpl-2.0-with-classpath-exception": "GPL-2.0-with-classpath-exception", + "gpl-2.0-with-font-exception": "GPL-2.0-with-font-exception", + "gpl-2.0-with-gcc-exception": "GPL-2.0-with-GCC-exception", + "gpl-2.0.0": "GPL-2.0", + "gpl-2.0.0+": "GPL-2.0+", + "gpl-2.0.0-only": "GPL-2.0-only", + "gpl-2.0.0-or-later": "GPL-2.0-or-later", + "gpl-2.0.0-with-autoconf-exception": "GPL-2.0-with-autoconf-exception", + "gpl-2.0.0-with-bison-exception": "GPL-2.0-with-bison-exception", + "gpl-2.0.0-with-classpath-exception": "GPL-2.0-with-classpath-exception", + "gpl-2.0.0-with-font-exception": "GPL-2.0-with-font-exception", + "gpl-2.0.0-with-gcc-exception": "GPL-2.0-with-GCC-exception", + "gpl-3": "GPL-3.0", + "gpl-3+": "GPL-3.0+", + "gpl-3-only": "GPL-3.0-only", + "gpl-3-or-later": "GPL-3.0-or-later", + "gpl-3-with-autoconf-exception": "GPL-3.0-with-autoconf-exception", + "gpl-3-with-gcc-exception": "GPL-3.0-with-GCC-exception", + "gpl-3.0": "GPL-3.0", + "gpl-3.0+": "GPL-3.0+", + "gpl-3.0-only": "GPL-3.0-only", + "gpl-3.0-or-later": "GPL-3.0-or-later", + "gpl-3.0-with-autoconf-exception": "GPL-3.0-with-autoconf-exception", + "gpl-3.0-with-gcc-exception": "GPL-3.0-with-GCC-exception", + "gpl-3.0.0": "GPL-3.0", + "gpl-3.0.0+": "GPL-3.0+", + "gpl-3.0.0-only": "GPL-3.0-only", + "gpl-3.0.0-or-later": "GPL-3.0-or-later", + "gpl-3.0.0-with-autoconf-exception": "GPL-3.0-with-autoconf-exception", + "gpl-3.0.0-with-gcc-exception": "GPL-3.0-with-GCC-exception", + "gsoap-1.3.0b": "gSOAP-1.3b", + "gsoap-1.3b": "gSOAP-1.3b", + "gsoap-1b": "gSOAP-1.3b", + "haskellreport": "HaskellReport", + "hippocratic-2": "Hippocratic-2.1", + "hippocratic-2.1": "Hippocratic-2.1", + "hippocratic-2.1.0": "Hippocratic-2.1", + "hpnd": "HPND", + "hpnd-sell-variant": "HPND-sell-variant", + "htmltidy": "HTMLTIDY", + "ibm-pibs": "IBM-pibs", + "icu": "ICU", + "ijg": "IJG", + "imagemagick": "ImageMagick", + "imatix": "iMatix", + "imlib2": "Imlib2", + "info-zip": "Info-ZIP", + "intel": "Intel", + "intel-acpi": "Intel-ACPI", + "interbase-1": "Interbase-1.0", + "interbase-1.0": "Interbase-1.0", + "interbase-1.0.0": "Interbase-1.0", + "ipa": "IPA", + "ipl-1": "IPL-1.0", + "ipl-1.0": "IPL-1.0", + "ipl-1.0.0": "IPL-1.0", + "isc": "ISC", + "jasper-2": "JasPer-2.0", + "jasper-2.0": "JasPer-2.0", + "jasper-2.0.0": "JasPer-2.0", + "jpnic": "JPNIC", + "json": "JSON", + "lal-1": "LAL-1.2", + "lal-1.2": "LAL-1.2", + "lal-1.2.0": "LAL-1.2", + "lal-1.3": "LAL-1.3", + "lal-1.3.0": "LAL-1.3", + "latex2e": "Latex2e", + "leptonica": "Leptonica", + "lgpl-2": "LGPL-2.0", + "lgpl-2+": "LGPL-2.0+", + "lgpl-2-only": "LGPL-2.0-only", + "lgpl-2-or-later": "LGPL-2.0-or-later", + "lgpl-2.0": "LGPL-2.0", + "lgpl-2.0+": "LGPL-2.0+", + "lgpl-2.0-only": "LGPL-2.0-only", + "lgpl-2.0-or-later": "LGPL-2.0-or-later", + "lgpl-2.0.0": "LGPL-2.0", + "lgpl-2.0.0+": "LGPL-2.0+", + "lgpl-2.0.0-only": "LGPL-2.0-only", + "lgpl-2.0.0-or-later": "LGPL-2.0-or-later", + "lgpl-2.1": "LGPL-2.1", + "lgpl-2.1+": "LGPL-2.1+", + "lgpl-2.1-only": "LGPL-2.1-only", + "lgpl-2.1-or-later": "LGPL-2.1-or-later", + "lgpl-2.1.0": "LGPL-2.1", + "lgpl-2.1.0+": "LGPL-2.1+", + "lgpl-2.1.0-only": "LGPL-2.1-only", + "lgpl-2.1.0-or-later": "LGPL-2.1-or-later", + "lgpl-3": "LGPL-3.0", + "lgpl-3+": "LGPL-3.0+", + "lgpl-3-only": "LGPL-3.0-only", + "lgpl-3-or-later": "LGPL-3.0-or-later", + "lgpl-3.0": "LGPL-3.0", + "lgpl-3.0+": "LGPL-3.0+", + "lgpl-3.0-only": "LGPL-3.0-only", + "lgpl-3.0-or-later": "LGPL-3.0-or-later", + "lgpl-3.0.0": "LGPL-3.0", + "lgpl-3.0.0+": "LGPL-3.0+", + "lgpl-3.0.0-only": "LGPL-3.0-only", + "lgpl-3.0.0-or-later": "LGPL-3.0-or-later", + "lgpllr": "LGPLLR", + "libpng": "Libpng", + "libpng-2": "libpng-2.0", + "libpng-2.0": "libpng-2.0", + "libpng-2.0.0": "libpng-2.0", + "libselinux-1": "libselinux-1.0", + "libselinux-1.0": "libselinux-1.0", + "libselinux-1.0.0": "libselinux-1.0", + "libtiff": "libtiff", + "liliq-p-1": "LiLiQ-P-1.1", + "liliq-p-1.1": "LiLiQ-P-1.1", + "liliq-p-1.1.0": "LiLiQ-P-1.1", + "liliq-r-1": "LiLiQ-R-1.1", + "liliq-r-1.1": "LiLiQ-R-1.1", + "liliq-r-1.1.0": "LiLiQ-R-1.1", + "liliq-rplus-1": "LiLiQ-Rplus-1.1", + "liliq-rplus-1.1": "LiLiQ-Rplus-1.1", + "liliq-rplus-1.1.0": "LiLiQ-Rplus-1.1", + "linux-openib": "Linux-OpenIB", + "lpl-1": "LPL-1.0", + "lpl-1.0": "LPL-1.0", + "lpl-1.0.0": "LPL-1.0", + "lpl-1.02": "LPL-1.02", + "lpl-1.02.0": "LPL-1.02", + "lppl-1": "LPPL-1.0", + "lppl-1.0": "LPPL-1.0", + "lppl-1.0.0": "LPPL-1.0", + "lppl-1.1": "LPPL-1.1", + "lppl-1.1.0": "LPPL-1.1", + "lppl-1.2": "LPPL-1.2", + "lppl-1.2.0": "LPPL-1.2", + "lppl-1.3.0a": "LPPL-1.3a", + "lppl-1.3.0c": "LPPL-1.3c", + "lppl-1.3a": "LPPL-1.3a", + "lppl-1.3c": "LPPL-1.3c", + "lppl-1a": "LPPL-1.3a", + "lppl-1c": "LPPL-1.3c", + "makeindex": "MakeIndex", + "miros": "MirOS", + "mit": "MIT", + "mit-0": "MIT-0", + "mit-advertising": "MIT-advertising", + "mit-cmu": "MIT-CMU", + "mit-enna": "MIT-enna", + "mit-feh": "MIT-feh", + "mit-modern-variant": "MIT-Modern-Variant", + "mit-open-group": "MIT-open-group", + "mitnfa": "MITNFA", + "motosoto": "Motosoto", + "mpich2": "mpich2", + "mpl-1": "MPL-1.0", + "mpl-1.0": "MPL-1.0", + "mpl-1.0.0": "MPL-1.0", + "mpl-1.1": "MPL-1.1", + "mpl-1.1.0": "MPL-1.1", + "mpl-2": "MPL-2.0", + "mpl-2-no-copyleft-exception": "MPL-2.0-no-copyleft-exception", + "mpl-2.0": "MPL-2.0", + "mpl-2.0-no-copyleft-exception": "MPL-2.0-no-copyleft-exception", + "mpl-2.0.0": "MPL-2.0", + "mpl-2.0.0-no-copyleft-exception": "MPL-2.0-no-copyleft-exception", + "ms-pl": "MS-PL", + "ms-rl": "MS-RL", + "mtll": "MTLL", + "mulanpsl-1": "MulanPSL-1.0", + "mulanpsl-1.0": "MulanPSL-1.0", + "mulanpsl-1.0.0": "MulanPSL-1.0", + "mulanpsl-2": "MulanPSL-2.0", + "mulanpsl-2.0": "MulanPSL-2.0", + "mulanpsl-2.0.0": "MulanPSL-2.0", + "multics": "Multics", + "mup": "Mup", + "naist-2003": "NAIST-2003", + "naist-2003.0": "NAIST-2003", + "naist-2003.0.0": "NAIST-2003", + "nasa-1": "NASA-1.3", + "nasa-1.3": "NASA-1.3", + "nasa-1.3.0": "NASA-1.3", + "naumen": "Naumen", + "nbpl-1": "NBPL-1.0", + "nbpl-1.0": "NBPL-1.0", + "nbpl-1.0.0": "NBPL-1.0", + "ncgl-uk-2": "NCGL-UK-2.0", + "ncgl-uk-2.0": "NCGL-UK-2.0", + "ncgl-uk-2.0.0": "NCGL-UK-2.0", + "ncsa": "NCSA", + "net-snmp": "Net-SNMP", + "netcdf": "NetCDF", + "newsletr": "Newsletr", + "ngpl": "NGPL", + "nist-pd": "NIST-PD", + "nist-pd-fallback": "NIST-PD-fallback", + "nlod-1": "NLOD-1.0", + "nlod-1.0": "NLOD-1.0", + "nlod-1.0.0": "NLOD-1.0", + "nlod-2": "NLOD-2.0", + "nlod-2.0": "NLOD-2.0", + "nlod-2.0.0": "NLOD-2.0", + "nlpl": "NLPL", + "nokia": "Nokia", + "nosl": "NOSL", + "noweb": "Noweb", + "npl-1": "NPL-1.0", + "npl-1.0": "NPL-1.0", + "npl-1.0.0": "NPL-1.0", + "npl-1.1": "NPL-1.1", + "npl-1.1.0": "NPL-1.1", + "nposl-3": "NPOSL-3.0", + "nposl-3.0": "NPOSL-3.0", + "nposl-3.0.0": "NPOSL-3.0", + "nrl": "NRL", + "ntp": "NTP", + "ntp-0": "NTP-0", + "nunit": "Nunit", + "o-uda-1": "O-UDA-1.0", + "o-uda-1.0": "O-UDA-1.0", + "o-uda-1.0.0": "O-UDA-1.0", + "occt-pl": "OCCT-PL", + "oclc-2": "OCLC-2.0", + "oclc-2.0": "OCLC-2.0", + "oclc-2.0.0": "OCLC-2.0", + "odbl-1": "ODbL-1.0", + "odbl-1.0": "ODbL-1.0", + "odbl-1.0.0": "ODbL-1.0", + "odc-by-1": "ODC-By-1.0", + "odc-by-1.0": "ODC-By-1.0", + "odc-by-1.0.0": "ODC-By-1.0", + "ofl-1": "OFL-1.0", + "ofl-1-no-rfn": "OFL-1.0-no-RFN", + "ofl-1-rfn": "OFL-1.0-RFN", + "ofl-1.0": "OFL-1.0", + "ofl-1.0-no-rfn": "OFL-1.0-no-RFN", + "ofl-1.0-rfn": "OFL-1.0-RFN", + "ofl-1.0.0": "OFL-1.0", + "ofl-1.0.0-no-rfn": "OFL-1.0-no-RFN", + "ofl-1.0.0-rfn": "OFL-1.0-RFN", + "ofl-1.1": "OFL-1.1", + "ofl-1.1-no-rfn": "OFL-1.1-no-RFN", + "ofl-1.1-rfn": "OFL-1.1-RFN", + "ofl-1.1.0": "OFL-1.1", + "ofl-1.1.0-no-rfn": "OFL-1.1-no-RFN", + "ofl-1.1.0-rfn": "OFL-1.1-RFN", + "ogc-1": "OGC-1.0", + "ogc-1.0": "OGC-1.0", + "ogc-1.0.0": "OGC-1.0", + "ogdl-taiwan-1": "OGDL-Taiwan-1.0", + "ogdl-taiwan-1.0": "OGDL-Taiwan-1.0", + "ogdl-taiwan-1.0.0": "OGDL-Taiwan-1.0", + "ogl-canada-2": "OGL-Canada-2.0", + "ogl-canada-2.0": "OGL-Canada-2.0", + "ogl-canada-2.0.0": "OGL-Canada-2.0", + "ogl-uk-1": "OGL-UK-1.0", + "ogl-uk-1.0": "OGL-UK-1.0", + "ogl-uk-1.0.0": "OGL-UK-1.0", + "ogl-uk-2": "OGL-UK-2.0", + "ogl-uk-2.0": "OGL-UK-2.0", + "ogl-uk-2.0.0": "OGL-UK-2.0", + "ogl-uk-3": "OGL-UK-3.0", + "ogl-uk-3.0": "OGL-UK-3.0", + "ogl-uk-3.0.0": "OGL-UK-3.0", + "ogtsl": "OGTSL", + "oldap-1": "OLDAP-1.1", + "oldap-1.1": "OLDAP-1.1", + "oldap-1.1.0": "OLDAP-1.1", + "oldap-1.2": "OLDAP-1.2", + "oldap-1.2.0": "OLDAP-1.2", + "oldap-1.3": "OLDAP-1.3", + "oldap-1.3.0": "OLDAP-1.3", + "oldap-1.4": "OLDAP-1.4", + "oldap-1.4.0": "OLDAP-1.4", + "oldap-2": "OLDAP-2.0", + "oldap-2.0": "OLDAP-2.0", + "oldap-2.0.0": "OLDAP-2.0", + "oldap-2.0.1": "OLDAP-2.0.1", + "oldap-2.1": "OLDAP-2.1", + "oldap-2.1.0": "OLDAP-2.1", + "oldap-2.2": "OLDAP-2.2", + "oldap-2.2.0": "OLDAP-2.2", + "oldap-2.2.1": "OLDAP-2.2.1", + "oldap-2.2.2": "OLDAP-2.2.2", + "oldap-2.3": "OLDAP-2.3", + "oldap-2.3.0": "OLDAP-2.3", + "oldap-2.4": "OLDAP-2.4", + "oldap-2.4.0": "OLDAP-2.4", + "oldap-2.5": "OLDAP-2.5", + "oldap-2.5.0": "OLDAP-2.5", + "oldap-2.6": "OLDAP-2.6", + "oldap-2.6.0": "OLDAP-2.6", + "oldap-2.7": "OLDAP-2.7", + "oldap-2.7.0": "OLDAP-2.7", + "oldap-2.8": "OLDAP-2.8", + "oldap-2.8.0": "OLDAP-2.8", + "oml": "OML", + "openssl": "OpenSSL", + "opl-1": "OPL-1.0", + "opl-1.0": "OPL-1.0", + "opl-1.0.0": "OPL-1.0", + "opubl-1": "OPUBL-1.0", + "opubl-1.0": "OPUBL-1.0", + "opubl-1.0.0": "OPUBL-1.0", + "oset-pl-2": "OSET-PL-2.1", + "oset-pl-2.1": "OSET-PL-2.1", + "oset-pl-2.1.0": "OSET-PL-2.1", + "osl-1": "OSL-1.0", + "osl-1.0": "OSL-1.0", + "osl-1.0.0": "OSL-1.0", + "osl-1.1": "OSL-1.1", + "osl-1.1.0": "OSL-1.1", + "osl-2": "OSL-2.0", + "osl-2.0": "OSL-2.0", + "osl-2.0.0": "OSL-2.0", + "osl-2.1": "OSL-2.1", + "osl-2.1.0": "OSL-2.1", + "osl-3": "OSL-3.0", + "osl-3.0": "OSL-3.0", + "osl-3.0.0": "OSL-3.0", + "parity-6": "Parity-6.0.0", + "parity-6.0": "Parity-6.0.0", + "parity-6.0.0": "Parity-6.0.0", + "parity-7": "Parity-7.0.0", + "parity-7.0": "Parity-7.0.0", + "parity-7.0.0": "Parity-7.0.0", + "pddl-1": "PDDL-1.0", + "pddl-1.0": "PDDL-1.0", + "pddl-1.0.0": "PDDL-1.0", + "php-3": "PHP-3.0", + "php-3.0": "PHP-3.0", + "php-3.0.0": "PHP-3.0", + "php-3.01": "PHP-3.01", + "php-3.01.0": "PHP-3.01", + "plexus": "Plexus", + "polyform-noncommercial-1": "PolyForm-Noncommercial-1.0.0", + "polyform-noncommercial-1.0": "PolyForm-Noncommercial-1.0.0", + "polyform-noncommercial-1.0.0": "PolyForm-Noncommercial-1.0.0", + "polyform-small-business-1": "PolyForm-Small-Business-1.0.0", + "polyform-small-business-1.0": "PolyForm-Small-Business-1.0.0", + "polyform-small-business-1.0.0": "PolyForm-Small-Business-1.0.0", + "postgresql": "PostgreSQL", + "psf-2": "PSF-2.0", + "psf-2.0": "PSF-2.0", + "psf-2.0.0": "PSF-2.0", + "psfrag": "psfrag", + "psutils": "psutils", + "python-2": "Python-2.0", + "python-2.0": "Python-2.0", + "python-2.0.0": "Python-2.0", + "qhull": "Qhull", + "qpl-1": "QPL-1.0", + "qpl-1.0": "QPL-1.0", + "qpl-1.0.0": "QPL-1.0", + "rdisc": "Rdisc", + "rhecos-1": "RHeCos-1.1", + "rhecos-1.1": "RHeCos-1.1", + "rhecos-1.1.0": "RHeCos-1.1", + "rpl-1": "RPL-1.1", + "rpl-1.1": "RPL-1.1", + "rpl-1.1.0": "RPL-1.1", + "rpl-1.5": "RPL-1.5", + "rpl-1.5.0": "RPL-1.5", + "rpsl-1": "RPSL-1.0", + "rpsl-1.0": "RPSL-1.0", + "rpsl-1.0.0": "RPSL-1.0", + "rsa-md": "RSA-MD", + "rscpl": "RSCPL", + "ruby": "Ruby", + "sax-pd": "SAX-PD", + "saxpath": "Saxpath", + "scea": "SCEA", + "sendmail": "Sendmail", + "sendmail-8": "Sendmail-8.23", + "sendmail-8.23": "Sendmail-8.23", + "sendmail-8.23.0": "Sendmail-8.23", + "sgi-b-1": "SGI-B-1.0", + "sgi-b-1.0": "SGI-B-1.0", + "sgi-b-1.0.0": "SGI-B-1.0", + "sgi-b-1.1": "SGI-B-1.1", + "sgi-b-1.1.0": "SGI-B-1.1", + "sgi-b-2": "SGI-B-2.0", + "sgi-b-2.0": "SGI-B-2.0", + "sgi-b-2.0.0": "SGI-B-2.0", + "shl-0.5": "SHL-0.5", + "shl-0.5.0": "SHL-0.5", + "shl-0.51": "SHL-0.51", + "shl-0.51.0": "SHL-0.51", + "simpl-2": "SimPL-2.0", + "simpl-2.0": "SimPL-2.0", + "simpl-2.0.0": "SimPL-2.0", + "sissl": "SISSL", + "sissl-1": "SISSL-1.2", + "sissl-1.2": "SISSL-1.2", + "sissl-1.2.0": "SISSL-1.2", + "sleepycat": "Sleepycat", + "smlnj": "SMLNJ", + "smppl": "SMPPL", + "snia": "SNIA", + "spencer-86": "Spencer-86", + "spencer-86.0": "Spencer-86", + "spencer-86.0.0": "Spencer-86", + "spencer-94": "Spencer-94", + "spencer-94.0": "Spencer-94", + "spencer-94.0.0": "Spencer-94", + "spencer-99": "Spencer-99", + "spencer-99.0": "Spencer-99", + "spencer-99.0.0": "Spencer-99", + "spl-1": "SPL-1.0", + "spl-1.0": "SPL-1.0", + "spl-1.0.0": "SPL-1.0", + "ssh-openssh": "SSH-OpenSSH", + "ssh-short": "SSH-short", + "sspl-1": "SSPL-1.0", + "sspl-1.0": "SSPL-1.0", + "sspl-1.0.0": "SSPL-1.0", + "standardml-nj": "StandardML-NJ", + "sugarcrm-1": "SugarCRM-1.1.3", + "sugarcrm-1.1": "SugarCRM-1.1.3", + "sugarcrm-1.1.3": "SugarCRM-1.1.3", + "swl": "SWL", + "tapr-ohl-1": "TAPR-OHL-1.0", + "tapr-ohl-1.0": "TAPR-OHL-1.0", + "tapr-ohl-1.0.0": "TAPR-OHL-1.0", + "tcl": "TCL", + "tcp-wrappers": "TCP-wrappers", + "tmate": "TMate", + "torque-1": "TORQUE-1.1", + "torque-1.1": "TORQUE-1.1", + "torque-1.1.0": "TORQUE-1.1", + "tosl": "TOSL", + "tu-berlin-1": "TU-Berlin-1.0", + "tu-berlin-1.0": "TU-Berlin-1.0", + "tu-berlin-1.0.0": "TU-Berlin-1.0", + "tu-berlin-2": "TU-Berlin-2.0", + "tu-berlin-2.0": "TU-Berlin-2.0", + "tu-berlin-2.0.0": "TU-Berlin-2.0", + "ucl-1": "UCL-1.0", + "ucl-1.0": "UCL-1.0", + "ucl-1.0.0": "UCL-1.0", + "unicode-dfs-2015": "Unicode-DFS-2015", + "unicode-dfs-2015.0": "Unicode-DFS-2015", + "unicode-dfs-2015.0.0": "Unicode-DFS-2015", + "unicode-dfs-2016": "Unicode-DFS-2016", + "unicode-dfs-2016.0": "Unicode-DFS-2016", + "unicode-dfs-2016.0.0": "Unicode-DFS-2016", + "unicode-tou": "Unicode-TOU", + "unlicense": "Unlicense", + "upl-1": "UPL-1.0", + "upl-1.0": "UPL-1.0", + "upl-1.0.0": "UPL-1.0", + "vim": "Vim", + "vostrom": "VOSTROM", + "vsl-1": "VSL-1.0", + "vsl-1.0": "VSL-1.0", + "vsl-1.0.0": "VSL-1.0", + "w3c": "W3C", + "w3c-19980720": "W3C-19980720", + "w3c-19980720.0": "W3C-19980720", + "w3c-19980720.0.0": "W3C-19980720", + "w3c-20150513": "W3C-20150513", + "w3c-20150513.0": "W3C-20150513", + "w3c-20150513.0.0": "W3C-20150513", + "watcom-1": "Watcom-1.0", + "watcom-1.0": "Watcom-1.0", + "watcom-1.0.0": "Watcom-1.0", + "wsuipa": "Wsuipa", + "wtfpl": "WTFPL", + "wxwindows": "wxWindows", + "x11": "X11", + "xerox": "Xerox", + "xfree86-1": "XFree86-1.1", + "xfree86-1.1": "XFree86-1.1", + "xfree86-1.1.0": "XFree86-1.1", + "xinetd": "xinetd", + "xnet": "Xnet", + "xpp": "xpp", + "xskat": "XSkat", + "ypl-1": "YPL-1.0", + "ypl-1.0": "YPL-1.0", + "ypl-1.0.0": "YPL-1.0", + "ypl-1.1": "YPL-1.1", + "ypl-1.1.0": "YPL-1.1", + "zed": "Zed", + "zend-2": "Zend-2.0", + "zend-2.0": "Zend-2.0", + "zend-2.0.0": "Zend-2.0", + "zimbra-1": "Zimbra-1.3", + "zimbra-1.3": "Zimbra-1.3", + "zimbra-1.3.0": "Zimbra-1.3", + "zimbra-1.4": "Zimbra-1.4", + "zimbra-1.4.0": "Zimbra-1.4", + "zlib": "Zlib", + "zlib-acknowledgement": "zlib-acknowledgement", + "zpl-1": "ZPL-1.1", + "zpl-1.1": "ZPL-1.1", + "zpl-1.1.0": "ZPL-1.1", + "zpl-2": "ZPL-2.0", + "zpl-2.0": "ZPL-2.0", + "zpl-2.0.0": "ZPL-2.0", + "zpl-2.1": "ZPL-2.1", + "zpl-2.1.0": "ZPL-2.1", } diff --git a/internal/spdxlicense/license_list_test.go b/internal/spdxlicense/license_list_test.go index 6dccd7bad..9b67902d2 100644 --- a/internal/spdxlicense/license_list_test.go +++ b/internal/spdxlicense/license_list_test.go @@ -10,5 +10,6 @@ func TestLicenceListIDs(t *testing.T) { // do a sanity check on the generated data assert.Equal(t, "0BSD", licenseIDs["0bsd"]) assert.Equal(t, "ZPL-2.1", licenseIDs["zpl-2.1"]) + assert.Equal(t, "GPL-2.0", licenseIDs["gpl-2"]) assert.NotEmpty(t, Version) } diff --git a/internal/spdxlicense/license_test.go b/internal/spdxlicense/license_test.go new file mode 100644 index 000000000..ff236c172 --- /dev/null +++ b/internal/spdxlicense/license_test.go @@ -0,0 +1,60 @@ +package spdxlicense + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestIDParse(t *testing.T) { + var tests = []struct { + shortName string + spdx string + }{ + { + "GPL-1-only", + "GPL-1.0-only", + }, + { + "GPL-2", + "GPL-2.0", + }, + { + "GPL-2+", + "GPL-2.0+", + }, + { + "GPL-3.0.0-or-later", + "GPL-3.0-or-later", + }, + { + "GPL-3-with-autoconf-exception", + "GPL-3.0-with-autoconf-exception", + }, + { + "CC-by-nc-3-de", + "CC-BY-NC-3.0-DE", + }, + // the below few cases are NOT expected, however, seem unavoidable given the current approach + { + "w3c-20150513.0.0", + "W3C-20150513", + }, + { + "spencer-86.0.0", + "Spencer-86", + }, + { + "unicode-dfs-2015.0.0", + "Unicode-DFS-2015", + }, + } + + for _, test := range tests { + t.Run(test.shortName, func(t *testing.T) { + got, exists := ID(test.shortName) + assert.True(t, exists) + assert.Equal(t, test.spdx, got) + }) + } +}