vulnerabilityv1

package
v0.0.0-...-1a28f28 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 22, 2026 License: MIT Imports: 8 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	SeverityLevel_name = map[int32]string{
		0: "SEVERITY_LEVEL_UNSPECIFIED",
		1: "SEVERITY_LEVEL_LOW",
		2: "SEVERITY_LEVEL_MEDIUM",
		3: "SEVERITY_LEVEL_HIGH",
		4: "SEVERITY_LEVEL_CRITICAL",
	}
	SeverityLevel_value = map[string]int32{
		"SEVERITY_LEVEL_UNSPECIFIED": 0,
		"SEVERITY_LEVEL_LOW":         1,
		"SEVERITY_LEVEL_MEDIUM":      2,
		"SEVERITY_LEVEL_HIGH":        3,
		"SEVERITY_LEVEL_CRITICAL":    4,
	}
)

Enum value maps for SeverityLevel.

View Source
var (
	SeverityType_name = map[int32]string{
		0: "SEVERITY_TYPE_UNSPECIFIED",
		1: "SEVERITY_TYPE_CVSS_V2",
		2: "SEVERITY_TYPE_CVSS_V3",
		3: "SEVERITY_TYPE_CVSS_V4",
		4: "SEVERITY_TYPE_GHSA",
		5: "SEVERITY_TYPE_CUSTOM",
	}
	SeverityType_value = map[string]int32{
		"SEVERITY_TYPE_UNSPECIFIED": 0,
		"SEVERITY_TYPE_CVSS_V2":     1,
		"SEVERITY_TYPE_CVSS_V3":     2,
		"SEVERITY_TYPE_CVSS_V4":     3,
		"SEVERITY_TYPE_GHSA":        4,
		"SEVERITY_TYPE_CUSTOM":      5,
	}
)

Enum value maps for SeverityType.

View Source
var File_deputy_vulnerability_v1_service_proto protoreflect.FileDescriptor
View Source
var File_deputy_vulnerability_v1_vulnerability_proto protoreflect.FileDescriptor

Functions

This section is empty.

Types

type Advisory

type Advisory struct {

	// Id is the primary vulnerability identifier (e.g., CVE-2021-44228, GHSA-xxx).
	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// Aliases are alternative identifiers for the same vulnerability.
	Aliases []string `protobuf:"bytes,2,rep,name=aliases,proto3" json:"aliases,omitempty"`
	// Summary is a brief description of the vulnerability.
	Summary string `protobuf:"bytes,3,opt,name=summary,proto3" json:"summary,omitempty"`
	// Details is the full vulnerability description.
	Details string `protobuf:"bytes,4,opt,name=details,proto3" json:"details,omitempty"`
	// Cve is the CVE identifier if available.
	Cve string `protobuf:"bytes,5,opt,name=cve,proto3" json:"cve,omitempty"`
	// Severity contains normalized severity information.
	Severity *Severity `protobuf:"bytes,6,opt,name=severity,proto3" json:"severity,omitempty"`
	// Published is when the advisory was first published.
	Published *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=published,proto3" json:"published,omitempty"`
	// Modified is when the advisory was last updated.
	Modified *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=modified,proto3" json:"modified,omitempty"`
	// References are URLs with additional information.
	References []string `protobuf:"bytes,9,rep,name=references,proto3" json:"references,omitempty"`
	// FixedVersions are versions containing a fix.
	FixedVersions []string `protobuf:"bytes,10,rep,name=fixed_versions,json=fixedVersions,proto3" json:"fixed_versions,omitempty"`
	// DatabaseSpecific contains source-specific metadata.
	DatabaseSpecific map[string]string `` /* 184-byte string literal not displayed */
	// Cwes contains Common Weakness Enumeration identifiers.
	Cwes []string `protobuf:"bytes,12,rep,name=cwes,proto3" json:"cwes,omitempty"`
	// contains filtered or unexported fields
}

Advisory describes a vulnerability as published by an upstream source.

func (*Advisory) Descriptor deprecated

func (*Advisory) Descriptor() ([]byte, []int)

Deprecated: Use Advisory.ProtoReflect.Descriptor instead.

func (*Advisory) GetAliases

func (x *Advisory) GetAliases() []string

func (*Advisory) GetCve

func (x *Advisory) GetCve() string

func (*Advisory) GetCwes

func (x *Advisory) GetCwes() []string

func (*Advisory) GetDatabaseSpecific

func (x *Advisory) GetDatabaseSpecific() map[string]string

func (*Advisory) GetDetails

func (x *Advisory) GetDetails() string

func (*Advisory) GetFixedVersions

func (x *Advisory) GetFixedVersions() []string

func (*Advisory) GetId

func (x *Advisory) GetId() string

func (*Advisory) GetModified

func (x *Advisory) GetModified() *timestamppb.Timestamp

func (*Advisory) GetPublished

func (x *Advisory) GetPublished() *timestamppb.Timestamp

func (*Advisory) GetReferences

func (x *Advisory) GetReferences() []string

func (*Advisory) GetSeverity

func (x *Advisory) GetSeverity() *Severity

func (*Advisory) GetSummary

func (x *Advisory) GetSummary() string

func (*Advisory) ProtoMessage

func (*Advisory) ProtoMessage()

func (*Advisory) ProtoReflect

func (x *Advisory) ProtoReflect() protoreflect.Message

func (*Advisory) Reset

func (x *Advisory) Reset()

func (*Advisory) String

func (x *Advisory) String() string

type AffectedImport

type AffectedImport struct {

	// Path is the import path.
	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	// Symbols are the affected symbols within the import.
	Symbols []string `protobuf:"bytes,2,rep,name=symbols,proto3" json:"symbols,omitempty"`
	// contains filtered or unexported fields
}

AffectedImport captures ecosystem-specific import path and symbol data.

func (*AffectedImport) Descriptor deprecated

func (*AffectedImport) Descriptor() ([]byte, []int)

Deprecated: Use AffectedImport.ProtoReflect.Descriptor instead.

func (*AffectedImport) GetPath

func (x *AffectedImport) GetPath() string

func (*AffectedImport) GetSymbols

func (x *AffectedImport) GetSymbols() []string

func (*AffectedImport) ProtoMessage

func (*AffectedImport) ProtoMessage()

func (*AffectedImport) ProtoReflect

func (x *AffectedImport) ProtoReflect() protoreflect.Message

func (*AffectedImport) Reset

func (x *AffectedImport) Reset()

func (*AffectedImport) String

func (x *AffectedImport) String() string

type Finding

type Finding struct {

	// AdvisoryId is the vulnerability identifier.
	AdvisoryId string `protobuf:"bytes,1,opt,name=advisory_id,json=advisoryId,proto3" json:"advisory_id,omitempty"`
	// Package contains the affected dependency information.
	Package *v1.Package `protobuf:"bytes,2,opt,name=package,proto3" json:"package,omitempty"`
	// Affected indicates whether the package is actually affected.
	Affected bool `protobuf:"varint,3,opt,name=affected,proto3" json:"affected,omitempty"`
	// AffectedImports captures import-level vulnerability details.
	AffectedImports []*AffectedImport `protobuf:"bytes,4,rep,name=affected_imports,json=affectedImports,proto3" json:"affected_imports,omitempty"`
	// Advisory contains the full advisory details.
	// This may be populated inline or referenced by advisory_id.
	Advisory *Advisory `protobuf:"bytes,5,opt,name=advisory,proto3" json:"advisory,omitempty"`
	// Epss is the EPSS score (0.0-1.0): probability of exploitation in next 30 days.
	Epss *float64 `protobuf:"fixed64,10,opt,name=epss,proto3,oneof" json:"epss,omitempty"`
	// EpssPercentile is the EPSS percentile (0.0-1.0).
	EpssPercentile *float64 `protobuf:"fixed64,11,opt,name=epss_percentile,json=epssPercentile,proto3,oneof" json:"epss_percentile,omitempty"`
	// InKev indicates whether this CVE is in CISA's Known Exploited Vulnerabilities catalog.
	InKev *bool `protobuf:"varint,12,opt,name=in_kev,json=inKev,proto3,oneof" json:"in_kev,omitempty"`
	// KevDateAdded is when the CVE was added to the KEV catalog.
	KevDateAdded *string `protobuf:"bytes,13,opt,name=kev_date_added,json=kevDateAdded,proto3,oneof" json:"kev_date_added,omitempty"`
	// KevDueDate is the federal agency compliance deadline.
	KevDueDate *string `protobuf:"bytes,14,opt,name=kev_due_date,json=kevDueDate,proto3,oneof" json:"kev_due_date,omitempty"`
	// KevRequiredAction is CISA's required remediation action.
	KevRequiredAction *string `protobuf:"bytes,15,opt,name=kev_required_action,json=kevRequiredAction,proto3,oneof" json:"kev_required_action,omitempty"`
	// KevKnownRansomwareCampaignUse indicates ransomware involvement.
	KevKnownRansomwareCampaignUse *string `` /* 161-byte string literal not displayed */
	// Path is the dependency chain from root to vulnerable package.
	Path []string `protobuf:"bytes,20,rep,name=path,proto3" json:"path,omitempty"`
	// Depth is the distance from root (0 = direct, 1+ = transitive).
	Depth *int32 `protobuf:"varint,21,opt,name=depth,proto3,oneof" json:"depth,omitempty"`
	// contains filtered or unexported fields
}

Finding represents a scan-time occurrence of an advisory in a dependency.

func (*Finding) Descriptor deprecated

func (*Finding) Descriptor() ([]byte, []int)

Deprecated: Use Finding.ProtoReflect.Descriptor instead.

func (*Finding) GetAdvisory

func (x *Finding) GetAdvisory() *Advisory

func (*Finding) GetAdvisoryId

func (x *Finding) GetAdvisoryId() string

func (*Finding) GetAffected

func (x *Finding) GetAffected() bool

func (*Finding) GetAffectedImports

func (x *Finding) GetAffectedImports() []*AffectedImport

func (*Finding) GetDepth

func (x *Finding) GetDepth() int32

func (*Finding) GetEpss

func (x *Finding) GetEpss() float64

func (*Finding) GetEpssPercentile

func (x *Finding) GetEpssPercentile() float64

func (*Finding) GetInKev

func (x *Finding) GetInKev() bool

func (*Finding) GetKevDateAdded

func (x *Finding) GetKevDateAdded() string

func (*Finding) GetKevDueDate

func (x *Finding) GetKevDueDate() string

func (*Finding) GetKevKnownRansomwareCampaignUse

func (x *Finding) GetKevKnownRansomwareCampaignUse() string

func (*Finding) GetKevRequiredAction

func (x *Finding) GetKevRequiredAction() string

func (*Finding) GetPackage

func (x *Finding) GetPackage() *v1.Package

func (*Finding) GetPath

func (x *Finding) GetPath() []string

func (*Finding) ProtoMessage

func (*Finding) ProtoMessage()

func (*Finding) ProtoReflect

func (x *Finding) ProtoReflect() protoreflect.Message

func (*Finding) Reset

func (x *Finding) Reset()

func (*Finding) String

func (x *Finding) String() string

type GetAdvisoriesRequest

type GetAdvisoriesRequest struct {

	// Ids are the vulnerability identifiers to look up.
	Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"`
	// contains filtered or unexported fields
}

GetAdvisoriesRequest specifies multiple vulnerabilities to look up.

func (*GetAdvisoriesRequest) Descriptor deprecated

func (*GetAdvisoriesRequest) Descriptor() ([]byte, []int)

Deprecated: Use GetAdvisoriesRequest.ProtoReflect.Descriptor instead.

func (*GetAdvisoriesRequest) GetIds

func (x *GetAdvisoriesRequest) GetIds() []string

func (*GetAdvisoriesRequest) ProtoMessage

func (*GetAdvisoriesRequest) ProtoMessage()

func (*GetAdvisoriesRequest) ProtoReflect

func (x *GetAdvisoriesRequest) ProtoReflect() protoreflect.Message

func (*GetAdvisoriesRequest) Reset

func (x *GetAdvisoriesRequest) Reset()

func (*GetAdvisoriesRequest) String

func (x *GetAdvisoriesRequest) String() string

type GetAdvisoriesResponse

type GetAdvisoriesResponse struct {

	// Advisories maps vulnerability IDs to their details.
	// Missing entries indicate the vulnerability was not found.
	Advisories map[string]*Advisory `` /* 147-byte string literal not displayed */
	// NotFound lists IDs that were not found in the database.
	NotFound []string `protobuf:"bytes,2,rep,name=not_found,json=notFound,proto3" json:"not_found,omitempty"`
	// Errors maps IDs to error messages for lookup failures.
	Errors map[string]string `` /* 139-byte string literal not displayed */
	// contains filtered or unexported fields
}

GetAdvisoriesResponse contains multiple advisory details.

func (*GetAdvisoriesResponse) Descriptor deprecated

func (*GetAdvisoriesResponse) Descriptor() ([]byte, []int)

Deprecated: Use GetAdvisoriesResponse.ProtoReflect.Descriptor instead.

func (*GetAdvisoriesResponse) GetAdvisories

func (x *GetAdvisoriesResponse) GetAdvisories() map[string]*Advisory

func (*GetAdvisoriesResponse) GetErrors

func (x *GetAdvisoriesResponse) GetErrors() map[string]string

func (*GetAdvisoriesResponse) GetNotFound

func (x *GetAdvisoriesResponse) GetNotFound() []string

func (*GetAdvisoriesResponse) ProtoMessage

func (*GetAdvisoriesResponse) ProtoMessage()

func (*GetAdvisoriesResponse) ProtoReflect

func (x *GetAdvisoriesResponse) ProtoReflect() protoreflect.Message

func (*GetAdvisoriesResponse) Reset

func (x *GetAdvisoriesResponse) Reset()

func (*GetAdvisoriesResponse) String

func (x *GetAdvisoriesResponse) String() string

type GetAdvisoryRequest

type GetAdvisoryRequest struct {

	// Id is the vulnerability identifier (CVE-2021-44228, GHSA-xxx, etc.).
	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// contains filtered or unexported fields
}

GetAdvisoryRequest specifies a vulnerability to look up.

func (*GetAdvisoryRequest) Descriptor deprecated

func (*GetAdvisoryRequest) Descriptor() ([]byte, []int)

Deprecated: Use GetAdvisoryRequest.ProtoReflect.Descriptor instead.

func (*GetAdvisoryRequest) GetId

func (x *GetAdvisoryRequest) GetId() string

func (*GetAdvisoryRequest) ProtoMessage

func (*GetAdvisoryRequest) ProtoMessage()

func (*GetAdvisoryRequest) ProtoReflect

func (x *GetAdvisoryRequest) ProtoReflect() protoreflect.Message

func (*GetAdvisoryRequest) Reset

func (x *GetAdvisoryRequest) Reset()

func (*GetAdvisoryRequest) String

func (x *GetAdvisoryRequest) String() string

type GetAdvisoryResponse

type GetAdvisoryResponse struct {

	// Advisory contains the full vulnerability details.
	// Nil if the vulnerability was not found.
	Advisory *Advisory `protobuf:"bytes,1,opt,name=advisory,proto3" json:"advisory,omitempty"`
	// Found indicates whether the advisory was found.
	Found bool `protobuf:"varint,2,opt,name=found,proto3" json:"found,omitempty"`
	// contains filtered or unexported fields
}

GetAdvisoryResponse contains the advisory details.

func (*GetAdvisoryResponse) Descriptor deprecated

func (*GetAdvisoryResponse) Descriptor() ([]byte, []int)

Deprecated: Use GetAdvisoryResponse.ProtoReflect.Descriptor instead.

func (*GetAdvisoryResponse) GetAdvisory

func (x *GetAdvisoryResponse) GetAdvisory() *Advisory

func (*GetAdvisoryResponse) GetFound

func (x *GetAdvisoryResponse) GetFound() bool

func (*GetAdvisoryResponse) ProtoMessage

func (*GetAdvisoryResponse) ProtoMessage()

func (*GetAdvisoryResponse) ProtoReflect

func (x *GetAdvisoryResponse) ProtoReflect() protoreflect.Message

func (*GetAdvisoryResponse) Reset

func (x *GetAdvisoryResponse) Reset()

func (*GetAdvisoryResponse) String

func (x *GetAdvisoryResponse) String() string

type Severity

type Severity struct {

	// Level is the normalized severity level.
	Level SeverityLevel `protobuf:"varint,1,opt,name=level,proto3,enum=deputy.vulnerability.v1.SeverityLevel" json:"level,omitempty"`
	// Type is the scoring methodology (CVSS v2/v3/v4, GHSA, etc.).
	Type SeverityType `protobuf:"varint,2,opt,name=type,proto3,enum=deputy.vulnerability.v1.SeverityType" json:"type,omitempty"`
	// Score is the numeric score if available (0-10 for CVSS), -1 if none.
	Score float64 `protobuf:"fixed64,3,opt,name=score,proto3" json:"score,omitempty"`
	// Raw is the original raw value preserved.
	Raw string `protobuf:"bytes,4,opt,name=raw,proto3" json:"raw,omitempty"`
	// RawType is the original type descriptor.
	RawType string `protobuf:"bytes,5,opt,name=raw_type,json=rawType,proto3" json:"raw_type,omitempty"`
	// contains filtered or unexported fields
}

Severity represents Deputy's normalized severity with provenance.

func (*Severity) Descriptor deprecated

func (*Severity) Descriptor() ([]byte, []int)

Deprecated: Use Severity.ProtoReflect.Descriptor instead.

func (*Severity) GetLevel

func (x *Severity) GetLevel() SeverityLevel

func (*Severity) GetRaw

func (x *Severity) GetRaw() string

func (*Severity) GetRawType

func (x *Severity) GetRawType() string

func (*Severity) GetScore

func (x *Severity) GetScore() float64

func (*Severity) GetType

func (x *Severity) GetType() SeverityType

func (*Severity) ProtoMessage

func (*Severity) ProtoMessage()

func (*Severity) ProtoReflect

func (x *Severity) ProtoReflect() protoreflect.Message

func (*Severity) Reset

func (x *Severity) Reset()

func (*Severity) String

func (x *Severity) String() string

type SeverityLevel

type SeverityLevel int32

SeverityLevel is Deputy's normalized severity classification.

const (
	// Unspecified or unknown severity.
	SeverityLevel_SEVERITY_LEVEL_UNSPECIFIED SeverityLevel = 0
	// Low severity (CVSS 0.1-3.9).
	SeverityLevel_SEVERITY_LEVEL_LOW SeverityLevel = 1
	// Medium severity (CVSS 4.0-6.9).
	SeverityLevel_SEVERITY_LEVEL_MEDIUM SeverityLevel = 2
	// High severity (CVSS 7.0-8.9).
	SeverityLevel_SEVERITY_LEVEL_HIGH SeverityLevel = 3
	// Critical severity (CVSS 9.0-10.0).
	SeverityLevel_SEVERITY_LEVEL_CRITICAL SeverityLevel = 4
)

func (SeverityLevel) Descriptor

func (SeverityLevel) Enum

func (x SeverityLevel) Enum() *SeverityLevel

func (SeverityLevel) EnumDescriptor deprecated

func (SeverityLevel) EnumDescriptor() ([]byte, []int)

Deprecated: Use SeverityLevel.Descriptor instead.

func (SeverityLevel) Number

func (SeverityLevel) String

func (x SeverityLevel) String() string

func (SeverityLevel) Type

type SeverityType

type SeverityType int32

SeverityType represents the scoring methodology used to express severity.

const (
	// Unspecified or unknown scoring type.
	SeverityType_SEVERITY_TYPE_UNSPECIFIED SeverityType = 0
	// CVSS version 2.
	SeverityType_SEVERITY_TYPE_CVSS_V2 SeverityType = 1
	// CVSS version 3.x.
	SeverityType_SEVERITY_TYPE_CVSS_V3 SeverityType = 2
	// CVSS version 4.x.
	SeverityType_SEVERITY_TYPE_CVSS_V4 SeverityType = 3
	// GitHub Advisory qualitative label.
	SeverityType_SEVERITY_TYPE_GHSA SeverityType = 4
	// Policy or user-defined override.
	SeverityType_SEVERITY_TYPE_CUSTOM SeverityType = 5
)

func (SeverityType) Descriptor

func (SeverityType) Enum

func (x SeverityType) Enum() *SeverityType

func (SeverityType) EnumDescriptor deprecated

func (SeverityType) EnumDescriptor() ([]byte, []int)

Deprecated: Use SeverityType.Descriptor instead.

func (SeverityType) Number

func (SeverityType) String

func (x SeverityType) String() string

func (SeverityType) Type

type Stats

type Stats struct {

	// Total is the total number of vulnerabilities (including duplicates).
	Total int32 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"`
	// Critical is the count of critical severity vulnerabilities.
	Critical int32 `protobuf:"varint,2,opt,name=critical,proto3" json:"critical,omitempty"`
	// High is the count of high severity vulnerabilities.
	High int32 `protobuf:"varint,3,opt,name=high,proto3" json:"high,omitempty"`
	// Medium is the count of medium severity vulnerabilities.
	Medium int32 `protobuf:"varint,4,opt,name=medium,proto3" json:"medium,omitempty"`
	// Low is the count of low severity vulnerabilities.
	Low int32 `protobuf:"varint,5,opt,name=low,proto3" json:"low,omitempty"`
	// Unknown is the count of vulnerabilities with unknown severity.
	Unknown int32 `protobuf:"varint,6,opt,name=unknown,proto3" json:"unknown,omitempty"`
	// Unique is the count of unique vulnerabilities (deduplicated by advisory ID).
	Unique int32 `protobuf:"varint,7,opt,name=unique,proto3" json:"unique,omitempty"`
	// CveCount is the count of CVE identifiers found.
	CveCount int32 `protobuf:"varint,8,opt,name=cve_count,json=cveCount,proto3" json:"cve_count,omitempty"`
	// DirectDeps is the count of vulnerabilities in direct dependencies.
	DirectDeps int32 `protobuf:"varint,9,opt,name=direct_deps,json=directDeps,proto3" json:"direct_deps,omitempty"`
	// IndirectDeps is the count of vulnerabilities in transitive dependencies.
	IndirectDeps int32 `protobuf:"varint,10,opt,name=indirect_deps,json=indirectDeps,proto3" json:"indirect_deps,omitempty"`
	// FixAvailable is the count of vulnerabilities with a known fix.
	FixAvailable int32 `protobuf:"varint,11,opt,name=fix_available,json=fixAvailable,proto3" json:"fix_available,omitempty"`
	// Duplicates is the count of duplicate vulnerability entries.
	Duplicates int32 `protobuf:"varint,12,opt,name=duplicates,proto3" json:"duplicates,omitempty"`
	// contains filtered or unexported fields
}

Stats summarizes vulnerability counts by severity and other metrics.

func (*Stats) Descriptor deprecated

func (*Stats) Descriptor() ([]byte, []int)

Deprecated: Use Stats.ProtoReflect.Descriptor instead.

func (*Stats) GetCritical

func (x *Stats) GetCritical() int32

func (*Stats) GetCveCount

func (x *Stats) GetCveCount() int32

func (*Stats) GetDirectDeps

func (x *Stats) GetDirectDeps() int32

func (*Stats) GetDuplicates

func (x *Stats) GetDuplicates() int32

func (*Stats) GetFixAvailable

func (x *Stats) GetFixAvailable() int32

func (*Stats) GetHigh

func (x *Stats) GetHigh() int32

func (*Stats) GetIndirectDeps

func (x *Stats) GetIndirectDeps() int32

func (*Stats) GetLow

func (x *Stats) GetLow() int32

func (*Stats) GetMedium

func (x *Stats) GetMedium() int32

func (*Stats) GetTotal

func (x *Stats) GetTotal() int32

func (*Stats) GetUnique

func (x *Stats) GetUnique() int32

func (*Stats) GetUnknown

func (x *Stats) GetUnknown() int32

func (*Stats) ProtoMessage

func (*Stats) ProtoMessage()

func (*Stats) ProtoReflect

func (x *Stats) ProtoReflect() protoreflect.Message

func (*Stats) Reset

func (x *Stats) Reset()

func (*Stats) String

func (x *Stats) String() string

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL