types

package
Version: v1.65.3 Latest Latest
Warning

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

Go to latest
Published: Oct 19, 2021 License: BSD-3-Clause Imports: 9 Imported by: 9

Documentation

Index

Constants

View Source
const (
	ActionEventPublish = iota + 1 //事件发布
	ActionResultPrePublish
	ActionResultPublish
	ActionEventAbort
	ActionResultAbort
)

oracle action type

View Source
const (
	NoEvent = iota
	EventPublished
	EventAborted
	ResultPrePublished
	ResultAborted
	ResultPublished
)

oracle status

View Source
const (
	TyLogEventPublish     = 810
	TyLogEventAbort       = 811
	TyLogResultPrePublish = 812
	TyLogResultAbort      = 813
	TyLogResultPublish    = 814
)

log type define

View Source
const (
	// FuncNameQueryOracleListByIDs 根据ids查询OracleStatus
	FuncNameQueryOracleListByIDs = "QueryOraclesByIDs"
	// FuncNameQueryEventIDByStatus 根据状态查询eventID
	FuncNameQueryEventIDByStatus = "QueryEventIDsByStatus"
	// FuncNameQueryEventIDByAddrAndStatus 根据创建者地址和状态查询eventID
	FuncNameQueryEventIDByAddrAndStatus = "QueryEventIDsByAddrAndStatus"
	// FuncNameQueryEventIDByTypeAndStatus 根据事件类型和状态查询eventID
	FuncNameQueryEventIDByTypeAndStatus = "QueryEventIDsByTypeAndStatus"
	// CreateEventPublishTx 创建发布事件交易
	CreateEventPublishTx = "EventPublish"
	// CreateAbortEventPublishTx 创建取消发布事件交易
	CreateAbortEventPublishTx = "EventAbort"
	// CreatePrePublishResultTx 创建预发布事件结果交易
	CreatePrePublishResultTx = "ResultPrePublish"
	// CreateAbortResultPrePublishTx 创建取消预发布的事件结果交易
	CreateAbortResultPrePublishTx = "ResultAbort"
	// CreateResultPublishTx 创建预发布事件结果交易
	CreateResultPublishTx = "ResultPublish"
)

executor action and function define

View Source
const (
	// ListDESC 降序
	ListDESC = int32(0)
	// DefaultCount 默认一次取多少条记录
	DefaultCount = int32(20)
)

query param define

Variables

View Source
var (
	ErrTimeMustBeFuture           = errors.New("ErrTimeMustBeFuture")
	ErrNoPrivilege                = errors.New("ErrNoPrivilege")
	ErrOracleRepeatHash           = errors.New("ErrOracleRepeatHash")
	ErrEventIDNotFound            = errors.New("ErrEventIDNotFound")
	ErrEventAbortNotAllowed       = errors.New("ErrEventAbortNotAllowed")
	ErrResultPrePublishNotAllowed = errors.New("ErrResultPrePublishNotAllowed")
	ErrPrePublishAbortNotAllowed  = errors.New("ErrPrePublishAbortNotAllowed")
	ErrResultPublishNotAllowed    = errors.New("ErrResultPublishNotAllowed")
	ErrParamNeedIDs               = errors.New("ErrParamNeedIDs")
	ErrParamStatusInvalid         = errors.New("ErrParamStatusInvalid")
	ErrParamAddressMustnotEmpty   = errors.New("ErrParamAddressMustnotEmpty")
	ErrParamTypeMustNotEmpty      = errors.New("ErrParamTypeMustNotEmpty")
)

Errors for oracle

View Source
var File_oracle_proto protoreflect.FileDescriptor
View Source
var (
	// OracleX oracle name
	OracleX = "oracle"
)

Functions

func InitExecutor

func InitExecutor(cfg *types.Chain33Config)

InitExecutor ...

func InitFork

func InitFork(cfg *types.Chain33Config)

InitFork ...

func NewTable

func NewTable(kvdb db.KV) *table.Table

NewTable 新建表

Types

type EventAbort

type EventAbort struct {
	EventID string `protobuf:"bytes,2,opt,name=eventID,proto3" json:"eventID,omitempty"` //发布事件的ID
	// contains filtered or unexported fields
}

func (*EventAbort) Descriptor deprecated

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

Deprecated: Use EventAbort.ProtoReflect.Descriptor instead.

func (*EventAbort) GetEventID

func (x *EventAbort) GetEventID() string

func (*EventAbort) ProtoMessage

func (*EventAbort) ProtoMessage()

func (*EventAbort) ProtoReflect added in v1.65.3

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

func (*EventAbort) Reset

func (x *EventAbort) Reset()

func (*EventAbort) String

func (x *EventAbort) String() string

type EventPublish

type EventPublish struct {
	Type         string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"`                 //游戏类别
	SubType      string `protobuf:"bytes,3,opt,name=subType,proto3" json:"subType,omitempty"`           //游戏子类别
	Time         int64  `protobuf:"varint,4,opt,name=time,proto3" json:"time,omitempty"`                //结果公布参考时间
	Content      string `protobuf:"bytes,5,opt,name=content,proto3" json:"content,omitempty"`           //事件内容
	Introduction string `protobuf:"bytes,6,opt,name=introduction,proto3" json:"introduction,omitempty"` //事件描述
	// contains filtered or unexported fields
}

func (*EventPublish) Descriptor deprecated

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

Deprecated: Use EventPublish.ProtoReflect.Descriptor instead.

func (*EventPublish) GetContent

func (x *EventPublish) GetContent() string

func (*EventPublish) GetIntroduction

func (x *EventPublish) GetIntroduction() string

func (*EventPublish) GetSubType

func (x *EventPublish) GetSubType() string

func (*EventPublish) GetTime

func (x *EventPublish) GetTime() int64

func (*EventPublish) GetType

func (x *EventPublish) GetType() string

func (*EventPublish) ProtoMessage

func (*EventPublish) ProtoMessage()

func (*EventPublish) ProtoReflect added in v1.65.3

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

func (*EventPublish) Reset

func (x *EventPublish) Reset()

func (*EventPublish) String

func (x *EventPublish) String() string

type EventRecord

type EventRecord struct {
	EventID string `protobuf:"bytes,1,opt,name=eventID,proto3" json:"eventID,omitempty"` //发布的事件的ID
	// contains filtered or unexported fields
}

localDB

func (*EventRecord) Descriptor deprecated

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

Deprecated: Use EventRecord.ProtoReflect.Descriptor instead.

func (*EventRecord) GetEventID

func (x *EventRecord) GetEventID() string

func (*EventRecord) ProtoMessage

func (*EventRecord) ProtoMessage()

func (*EventRecord) ProtoReflect added in v1.65.3

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

func (*EventRecord) Reset

func (x *EventRecord) Reset()

func (*EventRecord) String

func (x *EventRecord) String() string

type EventStatus

type EventStatus struct {
	OpAddr string `protobuf:"bytes,1,opt,name=opAddr,proto3" json:"opAddr,omitempty"`  //修改事件状态的地址
	Status int32  `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"` //事件状态
	// contains filtered or unexported fields
}

func (*EventStatus) Descriptor deprecated

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

Deprecated: Use EventStatus.ProtoReflect.Descriptor instead.

func (*EventStatus) GetOpAddr

func (x *EventStatus) GetOpAddr() string

func (*EventStatus) GetStatus

func (x *EventStatus) GetStatus() int32

func (*EventStatus) ProtoMessage

func (*EventStatus) ProtoMessage()

func (*EventStatus) ProtoReflect added in v1.65.3

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

func (*EventStatus) Reset

func (x *EventStatus) Reset()

func (*EventStatus) String

func (x *EventStatus) String() string

type OracleAction

type OracleAction struct {

	// Types that are assignable to Value:
	//	*OracleAction_EventPublish
	//	*OracleAction_EventAbort
	//	*OracleAction_ResultPrePublish
	//	*OracleAction_ResultPublish
	//	*OracleAction_ResultAbort
	Value isOracleAction_Value `protobuf_oneof:"value"`
	Ty    int32                `protobuf:"varint,7,opt,name=Ty,proto3" json:"Ty,omitempty"`
	// contains filtered or unexported fields
}

action

func (*OracleAction) Descriptor deprecated

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

Deprecated: Use OracleAction.ProtoReflect.Descriptor instead.

func (*OracleAction) GetEventAbort

func (x *OracleAction) GetEventAbort() *EventAbort

func (*OracleAction) GetEventPublish

func (x *OracleAction) GetEventPublish() *EventPublish

func (*OracleAction) GetResultAbort

func (x *OracleAction) GetResultAbort() *ResultAbort

func (*OracleAction) GetResultPrePublish

func (x *OracleAction) GetResultPrePublish() *ResultPrePublish

func (*OracleAction) GetResultPublish

func (x *OracleAction) GetResultPublish() *ResultPublish

func (*OracleAction) GetTy

func (x *OracleAction) GetTy() int32

func (*OracleAction) GetValue

func (m *OracleAction) GetValue() isOracleAction_Value

func (*OracleAction) ProtoMessage

func (*OracleAction) ProtoMessage()

func (*OracleAction) ProtoReflect added in v1.65.3

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

func (*OracleAction) Reset

func (x *OracleAction) Reset()

func (*OracleAction) String

func (x *OracleAction) String() string

type OracleAction_EventAbort

type OracleAction_EventAbort struct {
	EventAbort *EventAbort `protobuf:"bytes,2,opt,name=eventAbort,proto3,oneof"`
}

type OracleAction_EventPublish

type OracleAction_EventPublish struct {
	EventPublish *EventPublish `protobuf:"bytes,1,opt,name=eventPublish,proto3,oneof"`
}

type OracleAction_ResultAbort

type OracleAction_ResultAbort struct {
	ResultAbort *ResultAbort `protobuf:"bytes,5,opt,name=resultAbort,proto3,oneof"`
}

type OracleAction_ResultPrePublish

type OracleAction_ResultPrePublish struct {
	ResultPrePublish *ResultPrePublish `protobuf:"bytes,3,opt,name=resultPrePublish,proto3,oneof"`
}

type OracleAction_ResultPublish

type OracleAction_ResultPublish struct {
	ResultPublish *ResultPublish `protobuf:"bytes,4,opt,name=resultPublish,proto3,oneof"`
}

type OracleRow

type OracleRow struct {
	*ReceiptOracle
}

OracleRow table meta 结构

func NewOracleRow

func NewOracleRow() *OracleRow

NewOracleRow 新建一个meta 结构

func (*OracleRow) CreateRow

func (tx *OracleRow) CreateRow() *table.Row

CreateRow 新建数据行(注意index 数据一定也要保存到数据中,不能就保存eventid)

func (*OracleRow) Get

func (tx *OracleRow) Get(key string) ([]byte, error)

Get 按照indexName 查询 indexValue

func (*OracleRow) SetPayload

func (tx *OracleRow) SetPayload(data types.Message) error

SetPayload 设置数据

type OracleStatus

type OracleStatus struct {
	EventID      string       `protobuf:"bytes,1,opt,name=eventID,proto3" json:"eventID,omitempty"`           //事件ID
	Addr         string       `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"`                 //发布者地址
	Type         string       `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"`                 //游戏类别
	SubType      string       `protobuf:"bytes,4,opt,name=subType,proto3" json:"subType,omitempty"`           //游戏子类别
	Time         int64        `protobuf:"varint,5,opt,name=time,proto3" json:"time,omitempty"`                //结果公布参考时间
	Content      string       `protobuf:"bytes,6,opt,name=content,proto3" json:"content,omitempty"`           //事件内容
	Introduction string       `protobuf:"bytes,7,opt,name=introduction,proto3" json:"introduction,omitempty"` //事件描述
	Status       *EventStatus `protobuf:"bytes,8,opt,name=status,proto3" json:"status,omitempty"`             //操作状态
	Source       string       `protobuf:"bytes,9,opt,name=source,proto3" json:"source,omitempty"`             //数据来源
	Result       string       `protobuf:"bytes,10,opt,name=result,proto3" json:"result,omitempty"`            //事件结果
	PreStatus    *EventStatus `protobuf:"bytes,11,opt,name=preStatus,proto3" json:"preStatus,omitempty"`      //上次操作后状态及操作者地址
	// contains filtered or unexported fields
}

事件

func (*OracleStatus) Descriptor deprecated

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

Deprecated: Use OracleStatus.ProtoReflect.Descriptor instead.

func (*OracleStatus) GetAddr

func (x *OracleStatus) GetAddr() string

func (*OracleStatus) GetContent

func (x *OracleStatus) GetContent() string

func (*OracleStatus) GetEventID

func (x *OracleStatus) GetEventID() string

func (*OracleStatus) GetIntroduction

func (x *OracleStatus) GetIntroduction() string

func (*OracleStatus) GetPreStatus

func (x *OracleStatus) GetPreStatus() *EventStatus

func (*OracleStatus) GetResult

func (x *OracleStatus) GetResult() string

func (*OracleStatus) GetSource

func (x *OracleStatus) GetSource() string

func (*OracleStatus) GetStatus

func (x *OracleStatus) GetStatus() *EventStatus

func (*OracleStatus) GetSubType

func (x *OracleStatus) GetSubType() string

func (*OracleStatus) GetTime

func (x *OracleStatus) GetTime() int64

func (*OracleStatus) GetType

func (x *OracleStatus) GetType() string

func (*OracleStatus) ProtoMessage

func (*OracleStatus) ProtoMessage()

func (*OracleStatus) ProtoReflect added in v1.65.3

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

func (*OracleStatus) Reset

func (x *OracleStatus) Reset()

func (*OracleStatus) String

func (x *OracleStatus) String() string

type OracleType

type OracleType struct {
	types.ExecTypeBase
}

OracleType 预言机执行器类型

func NewType

func NewType(cfg *types.Chain33Config) *OracleType

NewType 创建执行器类型

func (*OracleType) GetLogMap

func (o *OracleType) GetLogMap() map[int64]*types.LogInfo

GetLogMap 获取日志map

func (*OracleType) GetName

func (o *OracleType) GetName() string

GetName 获取执行器名称

func (*OracleType) GetPayload

func (o *OracleType) GetPayload() types.Message

GetPayload 获取oracle action

func (*OracleType) GetTypeMap

func (o *OracleType) GetTypeMap() map[string]int32

GetTypeMap 获取类型map

type QueryEventID

type QueryEventID struct {
	Status  int32  `protobuf:"varint,1,opt,name=status,proto3" json:"status,omitempty"`  //事件状态
	Addr    string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"`       //事件发布者的地址
	Type    string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"`       //事件类型
	EventID string `protobuf:"bytes,4,opt,name=eventID,proto3" json:"eventID,omitempty"` //事件ID
	// contains filtered or unexported fields
}

func (*QueryEventID) Descriptor deprecated

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

Deprecated: Use QueryEventID.ProtoReflect.Descriptor instead.

func (*QueryEventID) GetAddr

func (x *QueryEventID) GetAddr() string

func (*QueryEventID) GetEventID

func (x *QueryEventID) GetEventID() string

func (*QueryEventID) GetStatus

func (x *QueryEventID) GetStatus() int32

func (*QueryEventID) GetType

func (x *QueryEventID) GetType() string

func (*QueryEventID) ProtoMessage

func (*QueryEventID) ProtoMessage()

func (*QueryEventID) ProtoReflect added in v1.65.3

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

func (*QueryEventID) Reset

func (x *QueryEventID) Reset()

func (*QueryEventID) String

func (x *QueryEventID) String() string

type QueryOracleInfos

type QueryOracleInfos struct {
	EventID []string `protobuf:"bytes,1,rep,name=eventID,proto3" json:"eventID,omitempty"` //发布的事件的ID
	// contains filtered or unexported fields
}

func (*QueryOracleInfos) Descriptor deprecated

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

Deprecated: Use QueryOracleInfos.ProtoReflect.Descriptor instead.

func (*QueryOracleInfos) GetEventID

func (x *QueryOracleInfos) GetEventID() []string

func (*QueryOracleInfos) ProtoMessage

func (*QueryOracleInfos) ProtoMessage()

func (*QueryOracleInfos) ProtoReflect added in v1.65.3

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

func (*QueryOracleInfos) Reset

func (x *QueryOracleInfos) Reset()

func (*QueryOracleInfos) String

func (x *QueryOracleInfos) String() string

type ReceiptOracle

type ReceiptOracle struct {
	EventID   string `protobuf:"bytes,1,opt,name=eventID,proto3" json:"eventID,omitempty"`      //发布事件ID
	Status    int32  `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"`       //事件状态
	Addr      string `protobuf:"bytes,3,opt,name=addr,proto3" json:"addr,omitempty"`            //事件发布者的地址
	Type      string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"`            //事件类型
	PreStatus int32  `protobuf:"varint,6,opt,name=preStatus,proto3" json:"preStatus,omitempty"` //事件的前一个状态
	// contains filtered or unexported fields
}

func (*ReceiptOracle) Descriptor deprecated

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

Deprecated: Use ReceiptOracle.ProtoReflect.Descriptor instead.

func (*ReceiptOracle) GetAddr

func (x *ReceiptOracle) GetAddr() string

func (*ReceiptOracle) GetEventID

func (x *ReceiptOracle) GetEventID() string

func (*ReceiptOracle) GetPreStatus

func (x *ReceiptOracle) GetPreStatus() int32

func (*ReceiptOracle) GetStatus

func (x *ReceiptOracle) GetStatus() int32

func (*ReceiptOracle) GetType

func (x *ReceiptOracle) GetType() string

func (*ReceiptOracle) ProtoMessage

func (*ReceiptOracle) ProtoMessage()

func (*ReceiptOracle) ProtoReflect added in v1.65.3

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

func (*ReceiptOracle) Reset

func (x *ReceiptOracle) Reset()

func (*ReceiptOracle) String

func (x *ReceiptOracle) String() string

type ReplyEventIDs

type ReplyEventIDs struct {
	EventID []string `protobuf:"bytes,1,rep,name=eventID,proto3" json:"eventID,omitempty"` //发布事件的ID
	// contains filtered or unexported fields
}

func (*ReplyEventIDs) Descriptor deprecated

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

Deprecated: Use ReplyEventIDs.ProtoReflect.Descriptor instead.

func (*ReplyEventIDs) GetEventID

func (x *ReplyEventIDs) GetEventID() []string

func (*ReplyEventIDs) ProtoMessage

func (*ReplyEventIDs) ProtoMessage()

func (*ReplyEventIDs) ProtoReflect added in v1.65.3

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

func (*ReplyEventIDs) Reset

func (x *ReplyEventIDs) Reset()

func (*ReplyEventIDs) String

func (x *ReplyEventIDs) String() string

type ReplyOracleStatusList

type ReplyOracleStatusList struct {
	Status []*OracleStatus `protobuf:"bytes,1,rep,name=status,proto3" json:"status,omitempty"` //状态集
	// contains filtered or unexported fields
}

func (*ReplyOracleStatusList) Descriptor deprecated

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

Deprecated: Use ReplyOracleStatusList.ProtoReflect.Descriptor instead.

func (*ReplyOracleStatusList) GetStatus

func (x *ReplyOracleStatusList) GetStatus() []*OracleStatus

func (*ReplyOracleStatusList) ProtoMessage

func (*ReplyOracleStatusList) ProtoMessage()

func (*ReplyOracleStatusList) ProtoReflect added in v1.65.3

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

func (*ReplyOracleStatusList) Reset

func (x *ReplyOracleStatusList) Reset()

func (*ReplyOracleStatusList) String

func (x *ReplyOracleStatusList) String() string

type ResultAbort

type ResultAbort struct {
	EventID string `protobuf:"bytes,2,opt,name=eventID,proto3" json:"eventID,omitempty"` //发布事件的ID
	// contains filtered or unexported fields
}

func (*ResultAbort) Descriptor deprecated

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

Deprecated: Use ResultAbort.ProtoReflect.Descriptor instead.

func (*ResultAbort) GetEventID

func (x *ResultAbort) GetEventID() string

func (*ResultAbort) ProtoMessage

func (*ResultAbort) ProtoMessage()

func (*ResultAbort) ProtoReflect added in v1.65.3

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

func (*ResultAbort) Reset

func (x *ResultAbort) Reset()

func (*ResultAbort) String

func (x *ResultAbort) String() string

type ResultPrePublish

type ResultPrePublish struct {
	EventID string `protobuf:"bytes,2,opt,name=eventID,proto3" json:"eventID,omitempty"` //发布事件的ID
	Source  string `protobuf:"bytes,3,opt,name=source,proto3" json:"source,omitempty"`   //数据来源
	Result  string `protobuf:"bytes,4,opt,name=result,proto3" json:"result,omitempty"`   //发布数据
	// contains filtered or unexported fields
}

func (*ResultPrePublish) Descriptor deprecated

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

Deprecated: Use ResultPrePublish.ProtoReflect.Descriptor instead.

func (*ResultPrePublish) GetEventID

func (x *ResultPrePublish) GetEventID() string

func (*ResultPrePublish) GetResult

func (x *ResultPrePublish) GetResult() string

func (*ResultPrePublish) GetSource

func (x *ResultPrePublish) GetSource() string

func (*ResultPrePublish) ProtoMessage

func (*ResultPrePublish) ProtoMessage()

func (*ResultPrePublish) ProtoReflect added in v1.65.3

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

func (*ResultPrePublish) Reset

func (x *ResultPrePublish) Reset()

func (*ResultPrePublish) String

func (x *ResultPrePublish) String() string

type ResultPublish

type ResultPublish struct {
	EventID string `protobuf:"bytes,2,opt,name=eventID,proto3" json:"eventID,omitempty"` //发布事件的ID
	Source  string `protobuf:"bytes,3,opt,name=source,proto3" json:"source,omitempty"`   //数据来源
	Result  string `protobuf:"bytes,4,opt,name=result,proto3" json:"result,omitempty"`   //发布数据
	// contains filtered or unexported fields
}

func (*ResultPublish) Descriptor deprecated

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

Deprecated: Use ResultPublish.ProtoReflect.Descriptor instead.

func (*ResultPublish) GetEventID

func (x *ResultPublish) GetEventID() string

func (*ResultPublish) GetResult

func (x *ResultPublish) GetResult() string

func (*ResultPublish) GetSource

func (x *ResultPublish) GetSource() string

func (*ResultPublish) ProtoMessage

func (*ResultPublish) ProtoMessage()

func (*ResultPublish) ProtoReflect added in v1.65.3

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

func (*ResultPublish) Reset

func (x *ResultPublish) Reset()

func (*ResultPublish) String

func (x *ResultPublish) String() string

Jump to

Keyboard shortcuts

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