blob: 84ca506b4243083e64021d21f40da26bd16cc968 [file] [log] [blame]
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: cq.proto
package cq
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
duration "github.com/golang/protobuf/ptypes/duration"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
// This message describes a Commit Queue configuration.
//
// The config file commit-queue.cfg should be stored in the config directory of your
// project, alongside cr-buildbucket.cfg.
type Config struct {
// Optional. If present, the CQ will refrain from processing any CLs,
// on which CQ was triggered after the specified time.
//
// This is an UTC RFC3339 (stiptime(tm)) string representing the time.
// For example, "2017-12-23T15:47:58Z" and Z is required.
DrainingStartTime string `protobuf:"bytes,1,opt,name=draining_start_time,json=drainingStartTime,proto3" json:"draining_start_time,omitempty"`
// Optional and deprecated.
// URL of the CQ status app to push updates to.
CqStatusHost string `protobuf:"bytes,2,opt,name=cq_status_host,json=cqStatusHost,proto3" json:"cq_status_host,omitempty"`
// Optional options for how CLs should be submitted.
SubmitOptions *SubmitOptions `protobuf:"bytes,3,opt,name=submit_options,json=submitOptions,proto3" json:"submit_options,omitempty"`
// At least 1 ConfigGroup is required.
ConfigGroups []*ConfigGroup `protobuf:"bytes,4,rep,name=config_groups,json=configGroups,proto3" json:"config_groups,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Config) Reset() { *m = Config{} }
func (m *Config) String() string { return proto.CompactTextString(m) }
func (*Config) ProtoMessage() {}
func (*Config) Descriptor() ([]byte, []int) {
return fileDescriptor_dfc3c1383080898a, []int{0}
}
func (m *Config) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Config.Unmarshal(m, b)
}
func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Config.Marshal(b, m, deterministic)
}
func (m *Config) XXX_Merge(src proto.Message) {
xxx_messageInfo_Config.Merge(m, src)
}
func (m *Config) XXX_Size() int {
return xxx_messageInfo_Config.Size(m)
}
func (m *Config) XXX_DiscardUnknown() {
xxx_messageInfo_Config.DiscardUnknown(m)
}
var xxx_messageInfo_Config proto.InternalMessageInfo
func (m *Config) GetDrainingStartTime() string {
if m != nil {
return m.DrainingStartTime
}
return ""
}
func (m *Config) GetCqStatusHost() string {
if m != nil {
return m.CqStatusHost
}
return ""
}
func (m *Config) GetSubmitOptions() *SubmitOptions {
if m != nil {
return m.SubmitOptions
}
return nil
}
func (m *Config) GetConfigGroups() []*ConfigGroup {
if m != nil {
return m.ConfigGroups
}
return nil
}
// SubmitOptions control how CQ submits CLs.
type SubmitOptions struct {
// Optional. Maximum number of successful CQ attempts completed by submitting
// corresponding Gerrit CL(s) before waiting burst_delay.
//
// This feature today applies to all attempts processed by this CQ, across all
// config_groups.
//
// Must be >0 to take effect. Requires burst_delay to be set, too.
MaxBurst int32 `protobuf:"varint,1,opt,name=max_burst,json=maxBurst,proto3" json:"max_burst,omitempty"`
// Optional. Delay between bursts of submissions of CQ attempts.
// See max_burst for more info.
//
// Must be >0 to take effect. Requires max_burst to be set, too.
BurstDelay *duration.Duration `protobuf:"bytes,2,opt,name=burst_delay,json=burstDelay,proto3" json:"burst_delay,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *SubmitOptions) Reset() { *m = SubmitOptions{} }
func (m *SubmitOptions) String() string { return proto.CompactTextString(m) }
func (*SubmitOptions) ProtoMessage() {}
func (*SubmitOptions) Descriptor() ([]byte, []int) {
return fileDescriptor_dfc3c1383080898a, []int{1}
}
func (m *SubmitOptions) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SubmitOptions.Unmarshal(m, b)
}
func (m *SubmitOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_SubmitOptions.Marshal(b, m, deterministic)
}
func (m *SubmitOptions) XXX_Merge(src proto.Message) {
xxx_messageInfo_SubmitOptions.Merge(m, src)
}
func (m *SubmitOptions) XXX_Size() int {
return xxx_messageInfo_SubmitOptions.Size(m)
}
func (m *SubmitOptions) XXX_DiscardUnknown() {
xxx_messageInfo_SubmitOptions.DiscardUnknown(m)
}
var xxx_messageInfo_SubmitOptions proto.InternalMessageInfo
func (m *SubmitOptions) GetMaxBurst() int32 {
if m != nil {
return m.MaxBurst
}
return 0
}
func (m *SubmitOptions) GetBurstDelay() *duration.Duration {
if m != nil {
return m.BurstDelay
}
return nil
}
// ConfigGroup allows one to share single verifiers config across a set of
// Gerrit repositories, which may be in different Gerrit installations.
type ConfigGroup struct {
// At least 1 Gerrit instance with repositories to work with is required.
Gerrit []*ConfigGroup_Gerrit `protobuf:"bytes,1,rep,name=gerrit,proto3" json:"gerrit,omitempty"`
// Defines how to verify a CL before submitting it. Required.
Verifiers *Verifiers `protobuf:"bytes,2,opt,name=verifiers,proto3" json:"verifiers,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ConfigGroup) Reset() { *m = ConfigGroup{} }
func (m *ConfigGroup) String() string { return proto.CompactTextString(m) }
func (*ConfigGroup) ProtoMessage() {}
func (*ConfigGroup) Descriptor() ([]byte, []int) {
return fileDescriptor_dfc3c1383080898a, []int{2}
}
func (m *ConfigGroup) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ConfigGroup.Unmarshal(m, b)
}
func (m *ConfigGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ConfigGroup.Marshal(b, m, deterministic)
}
func (m *ConfigGroup) XXX_Merge(src proto.Message) {
xxx_messageInfo_ConfigGroup.Merge(m, src)
}
func (m *ConfigGroup) XXX_Size() int {
return xxx_messageInfo_ConfigGroup.Size(m)
}
func (m *ConfigGroup) XXX_DiscardUnknown() {
xxx_messageInfo_ConfigGroup.DiscardUnknown(m)
}
var xxx_messageInfo_ConfigGroup proto.InternalMessageInfo
func (m *ConfigGroup) GetGerrit() []*ConfigGroup_Gerrit {
if m != nil {
return m.Gerrit
}
return nil
}
func (m *ConfigGroup) GetVerifiers() *Verifiers {
if m != nil {
return m.Verifiers
}
return nil
}
// Enumerates repositories on a Gerrit instance for which CQ should work.
type ConfigGroup_Gerrit struct {
// Gerrit URL, e.g., https://chromium-review.googlesource.com.
// No trailing slashes allowed.
Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
// Gerrit projects of this Gerrit instance to work with.
//
// At least 1 required.
Projects []*ConfigGroup_Gerrit_Project `protobuf:"bytes,2,rep,name=projects,proto3" json:"projects,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ConfigGroup_Gerrit) Reset() { *m = ConfigGroup_Gerrit{} }
func (m *ConfigGroup_Gerrit) String() string { return proto.CompactTextString(m) }
func (*ConfigGroup_Gerrit) ProtoMessage() {}
func (*ConfigGroup_Gerrit) Descriptor() ([]byte, []int) {
return fileDescriptor_dfc3c1383080898a, []int{2, 0}
}
func (m *ConfigGroup_Gerrit) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ConfigGroup_Gerrit.Unmarshal(m, b)
}
func (m *ConfigGroup_Gerrit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ConfigGroup_Gerrit.Marshal(b, m, deterministic)
}
func (m *ConfigGroup_Gerrit) XXX_Merge(src proto.Message) {
xxx_messageInfo_ConfigGroup_Gerrit.Merge(m, src)
}
func (m *ConfigGroup_Gerrit) XXX_Size() int {
return xxx_messageInfo_ConfigGroup_Gerrit.Size(m)
}
func (m *ConfigGroup_Gerrit) XXX_DiscardUnknown() {
xxx_messageInfo_ConfigGroup_Gerrit.DiscardUnknown(m)
}
var xxx_messageInfo_ConfigGroup_Gerrit proto.InternalMessageInfo
func (m *ConfigGroup_Gerrit) GetUrl() string {
if m != nil {
return m.Url
}
return ""
}
func (m *ConfigGroup_Gerrit) GetProjects() []*ConfigGroup_Gerrit_Project {
if m != nil {
return m.Projects
}
return nil
}
type ConfigGroup_Gerrit_Project struct {
// Repository name inside Gerrit host. Required.
//
// No leading or trailing slashes allowed, no '.git' at the end.
// 'a/' prefix is also not allowed (it's used on *.googlesource.com for
// forcing authentication).
//
// Examples on https://chromium-review.googlesource.com:
// catapult
// chromium/src
// chromium/tools/depot_tools
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
// Limit CLs in this repo to only these refs. Required.
//
// If not specified, defaults to "refs/heads/master".
//
// NOTE: your Gerrit admin must configure Gerrit ACLs such that CQ has
// read access to these refs, otherwise your users will be waiting for CQ
// to act on their CLs forever.
//
// Regular expression is validated by https://github.com/google/re2 library.
//
// NOTE: Git globs aren't supported. Convert them to a regular expression,
// e.g., Git glob "refs/heads/*" should be "refs/heads/[^/]+".
// However, users typically expect "refs/heads/.+", since expectation is
// that every typical Git branch to be CQ-able, including
// "refs/heads/experimental/foobar".
RefRegexp []string `protobuf:"bytes,2,rep,name=ref_regexp,json=refRegexp,proto3" json:"ref_regexp,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ConfigGroup_Gerrit_Project) Reset() { *m = ConfigGroup_Gerrit_Project{} }
func (m *ConfigGroup_Gerrit_Project) String() string { return proto.CompactTextString(m) }
func (*ConfigGroup_Gerrit_Project) ProtoMessage() {}
func (*ConfigGroup_Gerrit_Project) Descriptor() ([]byte, []int) {
return fileDescriptor_dfc3c1383080898a, []int{2, 0, 0}
}
func (m *ConfigGroup_Gerrit_Project) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ConfigGroup_Gerrit_Project.Unmarshal(m, b)
}
func (m *ConfigGroup_Gerrit_Project) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ConfigGroup_Gerrit_Project.Marshal(b, m, deterministic)
}
func (m *ConfigGroup_Gerrit_Project) XXX_Merge(src proto.Message) {
xxx_messageInfo_ConfigGroup_Gerrit_Project.Merge(m, src)
}
func (m *ConfigGroup_Gerrit_Project) XXX_Size() int {
return xxx_messageInfo_ConfigGroup_Gerrit_Project.Size(m)
}
func (m *ConfigGroup_Gerrit_Project) XXX_DiscardUnknown() {
xxx_messageInfo_ConfigGroup_Gerrit_Project.DiscardUnknown(m)
}
var xxx_messageInfo_ConfigGroup_Gerrit_Project proto.InternalMessageInfo
func (m *ConfigGroup_Gerrit_Project) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *ConfigGroup_Gerrit_Project) GetRefRegexp() []string {
if m != nil {
return m.RefRegexp
}
return nil
}
// Verifiers are various types of checks that a Commit Queue performs on a CL.
// All verifiers must pass in order for a CL to be submitted. Configuration file
// describes types of verifiers that should be applied to each CL and their
// parameters.
type Verifiers struct {
// Required. GerritCQAbility ensures that a user who triggered
// this CQ attempt actually has rights to do so based on 3 factors:
// * membership of the user in committers & dryrunners group,
// * the state of CL/patchset on which CQ is triggered,
// * relationship of the user to the CL.
GerritCqAbility *Verifiers_GerritCQAbility `protobuf:"bytes,1,opt,name=gerrit_cq_ability,json=gerritCqAbility,proto3" json:"gerrit_cq_ability,omitempty"`
// This verifier is used to check tree status before committing a CL. If the
// tree is closed, then the verifier will wait until it is reopened.
TreeStatus *Verifiers_TreeStatus `protobuf:"bytes,2,opt,name=tree_status,json=treeStatus,proto3" json:"tree_status,omitempty"`
// This verifier triggers a set of builds through Buildbucket.
//
// CQ automatically retries failed tryjobs and only allows CL to land if each
// builder has succeeded in the latest retry.
// If a given tryjob result is too old (>1 day) it is ignored.
//
// Typically, builds from Buildbucket are executed on LUCI stack, however, CQ
// is agnostic to how and where builds are executed.
Tryjob *Verifiers_Tryjob `protobuf:"bytes,3,opt,name=tryjob,proto3" json:"tryjob,omitempty"`
// Deprecator is for internal CQ use only. DO NOT USE IN YOUR cq.cfg.
Deprecator *Verifiers_Deprecator `protobuf:"bytes,4,opt,name=deprecator,proto3" json:"deprecator,omitempty"`
// Fake is for internal CQ use only. DO NOT USE IN YOUR cq.cfg.
Fake *Verifiers_Fake `protobuf:"bytes,5,opt,name=fake,proto3" json:"fake,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Verifiers) Reset() { *m = Verifiers{} }
func (m *Verifiers) String() string { return proto.CompactTextString(m) }
func (*Verifiers) ProtoMessage() {}
func (*Verifiers) Descriptor() ([]byte, []int) {
return fileDescriptor_dfc3c1383080898a, []int{3}
}
func (m *Verifiers) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Verifiers.Unmarshal(m, b)
}
func (m *Verifiers) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Verifiers.Marshal(b, m, deterministic)
}
func (m *Verifiers) XXX_Merge(src proto.Message) {
xxx_messageInfo_Verifiers.Merge(m, src)
}
func (m *Verifiers) XXX_Size() int {
return xxx_messageInfo_Verifiers.Size(m)
}
func (m *Verifiers) XXX_DiscardUnknown() {
xxx_messageInfo_Verifiers.DiscardUnknown(m)
}
var xxx_messageInfo_Verifiers proto.InternalMessageInfo
func (m *Verifiers) GetGerritCqAbility() *Verifiers_GerritCQAbility {
if m != nil {
return m.GerritCqAbility
}
return nil
}
func (m *Verifiers) GetTreeStatus() *Verifiers_TreeStatus {
if m != nil {
return m.TreeStatus
}
return nil
}
func (m *Verifiers) GetTryjob() *Verifiers_Tryjob {
if m != nil {
return m.Tryjob
}
return nil
}
func (m *Verifiers) GetDeprecator() *Verifiers_Deprecator {
if m != nil {
return m.Deprecator
}
return nil
}
func (m *Verifiers) GetFake() *Verifiers_Fake {
if m != nil {
return m.Fake
}
return nil
}
type Verifiers_GerritCQAbility struct {
// Required. Name of the chrome-infra-auth group, which contains the list of
// identities authorized to trigger CQ runs on any CLs in projects specified
// in the config group.
//
// Typically, such groups are named "project-<name>-committers".
CommitterList string `protobuf:"bytes,1,opt,name=committer_list,json=committerList,proto3" json:"committer_list,omitempty"`
// Optional, but strongly recommended. Name of the chrome-infra-auth group,
// which contains the list of identities authorized to trigger CQ dry run
// on Gerrit CLs they own (not to be confused with OWNER files) even if CL
// hasn't been approved.
//
// Typically, such groups are named "project-<name>-tryjob-access".
DryRunAccessList string `protobuf:"bytes,2,opt,name=dry_run_access_list,json=dryRunAccessList,proto3" json:"dry_run_access_list,omitempty"`
// Optional. allow_submit_with_open_deps controls how CQ full run behaves
// when current Gerrit CL has open dependencies (not yet submitted CLs on
// which *this* CL depends).
//
// If set to false (default), CQ will abort full run attempt immediately if
// open dependencies are detected.
//
// If set to true, then CQ will not abort full run and upon passing all
// other verifiers, CQ will attempt to submit the CL regardless of open
// dependencies and whether CQ verified those open dependencies.
// In turn, if Gerrit project config allows this, Gerrit will execute submit
// of all dependent CLs first and then this CL.
AllowSubmitWithOpenDeps bool `protobuf:"varint,3,opt,name=allow_submit_with_open_deps,json=allowSubmitWithOpenDeps,proto3" json:"allow_submit_with_open_deps,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Verifiers_GerritCQAbility) Reset() { *m = Verifiers_GerritCQAbility{} }
func (m *Verifiers_GerritCQAbility) String() string { return proto.CompactTextString(m) }
func (*Verifiers_GerritCQAbility) ProtoMessage() {}
func (*Verifiers_GerritCQAbility) Descriptor() ([]byte, []int) {
return fileDescriptor_dfc3c1383080898a, []int{3, 0}
}
func (m *Verifiers_GerritCQAbility) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Verifiers_GerritCQAbility.Unmarshal(m, b)
}
func (m *Verifiers_GerritCQAbility) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Verifiers_GerritCQAbility.Marshal(b, m, deterministic)
}
func (m *Verifiers_GerritCQAbility) XXX_Merge(src proto.Message) {
xxx_messageInfo_Verifiers_GerritCQAbility.Merge(m, src)
}
func (m *Verifiers_GerritCQAbility) XXX_Size() int {
return xxx_messageInfo_Verifiers_GerritCQAbility.Size(m)
}
func (m *Verifiers_GerritCQAbility) XXX_DiscardUnknown() {
xxx_messageInfo_Verifiers_GerritCQAbility.DiscardUnknown(m)
}
var xxx_messageInfo_Verifiers_GerritCQAbility proto.InternalMessageInfo
func (m *Verifiers_GerritCQAbility) GetCommitterList() string {
if m != nil {
return m.CommitterList
}
return ""
}
func (m *Verifiers_GerritCQAbility) GetDryRunAccessList() string {
if m != nil {
return m.DryRunAccessList
}
return ""
}
func (m *Verifiers_GerritCQAbility) GetAllowSubmitWithOpenDeps() bool {
if m != nil {
return m.AllowSubmitWithOpenDeps
}
return false
}
type Verifiers_TreeStatus struct {
// Required. URL of the project tree status app.
Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Verifiers_TreeStatus) Reset() { *m = Verifiers_TreeStatus{} }
func (m *Verifiers_TreeStatus) String() string { return proto.CompactTextString(m) }
func (*Verifiers_TreeStatus) ProtoMessage() {}
func (*Verifiers_TreeStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_dfc3c1383080898a, []int{3, 1}
}
func (m *Verifiers_TreeStatus) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Verifiers_TreeStatus.Unmarshal(m, b)
}
func (m *Verifiers_TreeStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Verifiers_TreeStatus.Marshal(b, m, deterministic)
}
func (m *Verifiers_TreeStatus) XXX_Merge(src proto.Message) {
xxx_messageInfo_Verifiers_TreeStatus.Merge(m, src)
}
func (m *Verifiers_TreeStatus) XXX_Size() int {
return xxx_messageInfo_Verifiers_TreeStatus.Size(m)
}
func (m *Verifiers_TreeStatus) XXX_DiscardUnknown() {
xxx_messageInfo_Verifiers_TreeStatus.DiscardUnknown(m)
}
var xxx_messageInfo_Verifiers_TreeStatus proto.InternalMessageInfo
func (m *Verifiers_TreeStatus) GetUrl() string {
if m != nil {
return m.Url
}
return ""
}
type Verifiers_Tryjob struct {
// Builders on which tryjobs should be triggered.
Builders []*Verifiers_Tryjob_Builder `protobuf:"bytes,1,rep,name=builders,proto3" json:"builders,omitempty"`
// Optional, defaulting to no retries whatsoever.
RetryConfig *Verifiers_Tryjob_RetryConfig `protobuf:"bytes,2,opt,name=retry_config,json=retryConfig,proto3" json:"retry_config,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Verifiers_Tryjob) Reset() { *m = Verifiers_Tryjob{} }
func (m *Verifiers_Tryjob) String() string { return proto.CompactTextString(m) }
func (*Verifiers_Tryjob) ProtoMessage() {}
func (*Verifiers_Tryjob) Descriptor() ([]byte, []int) {
return fileDescriptor_dfc3c1383080898a, []int{3, 2}
}
func (m *Verifiers_Tryjob) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Verifiers_Tryjob.Unmarshal(m, b)
}
func (m *Verifiers_Tryjob) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Verifiers_Tryjob.Marshal(b, m, deterministic)
}
func (m *Verifiers_Tryjob) XXX_Merge(src proto.Message) {
xxx_messageInfo_Verifiers_Tryjob.Merge(m, src)
}
func (m *Verifiers_Tryjob) XXX_Size() int {
return xxx_messageInfo_Verifiers_Tryjob.Size(m)
}
func (m *Verifiers_Tryjob) XXX_DiscardUnknown() {
xxx_messageInfo_Verifiers_Tryjob.DiscardUnknown(m)
}
var xxx_messageInfo_Verifiers_Tryjob proto.InternalMessageInfo
func (m *Verifiers_Tryjob) GetBuilders() []*Verifiers_Tryjob_Builder {
if m != nil {
return m.Builders
}
return nil
}
func (m *Verifiers_Tryjob) GetRetryConfig() *Verifiers_Tryjob_RetryConfig {
if m != nil {
return m.RetryConfig
}
return nil
}
type Verifiers_Tryjob_Builder struct {
// Required. Name of the builder as <project>/<bucket>/<builder>
//
// Examples:
// "chromium/try/linux-tester"
// "other-project/try/shared-try-builder"
//
// For legacy buckets on buildbot, use * as project placeholder, e.g.,
// "*/master.tryserver.example/linux-tester"
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
// Optional. If true, a fresh build will be required for each CQ attempt.
//
// Default is false, meaning CQ may re-use a successful build
// triggered before current CQ attempt started.
//
// This option is typically used for builders which run depot_tools'
// PRESUBMIT scripts, which are supposed to be quick to run and provide
// additional OWNERS, lint, etc checks which are useful to run against
// the latest revision of the CL's target branch.
DisableReuse bool `protobuf:"varint,2,opt,name=disable_reuse,json=disableReuse,proto3" json:"disable_reuse,omitempty"`
// Optional name of a builder (aka parent) which will trigger this builder
// (aka child).
//
// If `triggered_by` is not specified (default), CQ will trigger this
// builder directly.
//
// Else, CQ will wait for `triggered_by` (parent) builder to trigger
// (possibly, indirectly) this (child) builder.
// Conditions:
// * `triggered_by` (parent) builder must set a special property
// `triggered_build_ids` upon successful completion with value set
// to a list of triggered Buildbucket build IDs,
// corresponding to each triggered build. One or more of the IDs must
// correspond to this (child) builder, which will then be waited for
// by CQ.
// * parent->child relationship graph must be a forest (set of a trees).
// However, grandparent->parent->child triggering structure isn't well
// tested. Please, talk to CQ maintainers to discuss your use case if you
// actually need it.
//
// Failure/Retry semantics:
// * If `triggered_by` (parent) builder succeeds, but doesn't set
// the right `triggered_build_ids` s.t. CQ can't find this (child)
// builder among triggered builds, then CQ will wait till
// TRYJOB_PENDING_TIMEOUT is reached, currently hardcoded at 2 hours.
// TODO(tandrii,sergiyb): improve this.
// * If this (child) builder fails and CQ still has retry budget,
// CQ will retry a parent builder.
//
// For example, given config:
// builder { name: "*/m/mac_compiler" }
// builder { name: "*/m/mac_tester_10.12"
// triggered_by: "*/m/mac_compiler" }
// builder { name: "*/m/mac_tester_10.13"
// triggered_by: "*/m/mac_compiler" }
// CQ will trigger and wait for "mac_compiler" to succeed. Then, it'll
// check its `triggered_build_ids` and find which ones correspond to
// "mac_tester_10.12" and "mac_tester_10.13" and wait for each to
// complete. If say "mac_tester_10.12" fails, CQ will retry
// "mac_compiler" and expect it to trigger new builds for
// "mac_tester_10.12" and "mac_tester_10.13".
TriggeredBy string `protobuf:"bytes,3,opt,name=triggered_by,json=triggeredBy,proto3" json:"triggered_by,omitempty"`
// Optional. When this field is present, it marks given builder as
// experimental. It is only triggered on a given percentage of the CLs and
// the outcome does not affect the decicion whether a CL can land or not.
// This is typically used to test new builders and estimate their capacity
// requirements.
ExperimentPercentage float32 `protobuf:"fixed32,4,opt,name=experiment_percentage,json=experimentPercentage,proto3" json:"experiment_percentage,omitempty"`
// Optionally specified alternative builder for CQ to choose instead.
// If provided, CQ will choose only one of the equivalent builders as
// required based purely on given CL and CL's owner and **regardless** of
// the possibly already completed try jobs.
//
// Note: none of the equivalent builders should be part of triggered_by
// chain, although CQ may eventually relax this requirement.
EquivalentTo *Verifiers_Tryjob_EquivalentBuilder `protobuf:"bytes,5,opt,name=equivalent_to,json=equivalentTo,proto3" json:"equivalent_to,omitempty"`
// Optional. Require this builder only if location_regexp matches a file in
// this CL.
//
// This means:
// * If specified and no file in a CL matches any of the location_regexp,
// then CQ will not care about this builder.
// * If a file in a CL matches any location_regexp_exclude, then this file
// won't be considered when matching location_regexp.
//
// If no location_regexp is not specified (default),
// builder will be used on all CLs, even those which are not modifying any
// file (just commit description changes).
// TODO(tandrii): CQ shouldn't process such CLs https://crbug.com/892462,
// which would allow to change default location_regexp to '.*', ie matching
// any file in any Gerrit project.
//
// The location_regexp is matches are done against the following string:
// <gerrit_url>/<gerrit_project_name>/+/<cl_file_path>
// File path must be relative to root of the repo, and it uses Unix /
// directory separators.
//
// The comparison is a full match; the pattern is implicitly anchored with
// "^" and "$", so there is no need add them.
//
// Touching a file means either adding, modifying or removing it.
//
// These options currently can not be combined with the following other options:
// * experiment_percentage
// * triggered_by
// * GerritCQAbility.allow_submit_with_open_deps
// If you need to combine them, please talk to CQ owners.
//
// Examples:
//
// location_regexp:
// "https://chromium-review.googlesource.com/chromium/src/[+]/third_party/WebKit/.+"
// will enable builder for all CLs touching any file in
// third_party/WebKit directory of the chromium/src repo, but not
// directory itself.
//
// location_regexp: "https://example.com/repo/[+]/.+"
// location_regexp_exclude: "https://example.com/repo/[+]/all/one.txt"
// will match a CL which touches at least one file other than
// 'one.txt' inside all/ directory of the Gerrit project "repo".
//
// location_regexp_exclude: "https://example.com/.+/[+]/one.txt"
// will match a CL which touches at least one file other than
// 'one.txt' in any repository OR belongs to any other Gerrit server.
// Note, in this case location_regexp defaults to ".*".
LocationRegexp []string `protobuf:"bytes,6,rep,name=location_regexp,json=locationRegexp,proto3" json:"location_regexp,omitempty"`
LocationRegexpExclude []string `protobuf:"bytes,7,rep,name=location_regexp_exclude,json=locationRegexpExclude,proto3" json:"location_regexp_exclude,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Verifiers_Tryjob_Builder) Reset() { *m = Verifiers_Tryjob_Builder{} }
func (m *Verifiers_Tryjob_Builder) String() string { return proto.CompactTextString(m) }
func (*Verifiers_Tryjob_Builder) ProtoMessage() {}
func (*Verifiers_Tryjob_Builder) Descriptor() ([]byte, []int) {
return fileDescriptor_dfc3c1383080898a, []int{3, 2, 0}
}
func (m *Verifiers_Tryjob_Builder) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Verifiers_Tryjob_Builder.Unmarshal(m, b)
}
func (m *Verifiers_Tryjob_Builder) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Verifiers_Tryjob_Builder.Marshal(b, m, deterministic)
}
func (m *Verifiers_Tryjob_Builder) XXX_Merge(src proto.Message) {
xxx_messageInfo_Verifiers_Tryjob_Builder.Merge(m, src)
}
func (m *Verifiers_Tryjob_Builder) XXX_Size() int {
return xxx_messageInfo_Verifiers_Tryjob_Builder.Size(m)
}
func (m *Verifiers_Tryjob_Builder) XXX_DiscardUnknown() {
xxx_messageInfo_Verifiers_Tryjob_Builder.DiscardUnknown(m)
}
var xxx_messageInfo_Verifiers_Tryjob_Builder proto.InternalMessageInfo
func (m *Verifiers_Tryjob_Builder) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *Verifiers_Tryjob_Builder) GetDisableReuse() bool {
if m != nil {
return m.DisableReuse
}
return false
}
func (m *Verifiers_Tryjob_Builder) GetTriggeredBy() string {
if m != nil {
return m.TriggeredBy
}
return ""
}
func (m *Verifiers_Tryjob_Builder) GetExperimentPercentage() float32 {
if m != nil {
return m.ExperimentPercentage
}
return 0
}
func (m *Verifiers_Tryjob_Builder) GetEquivalentTo() *Verifiers_Tryjob_EquivalentBuilder {
if m != nil {
return m.EquivalentTo
}
return nil
}
func (m *Verifiers_Tryjob_Builder) GetLocationRegexp() []string {
if m != nil {
return m.LocationRegexp
}
return nil
}
func (m *Verifiers_Tryjob_Builder) GetLocationRegexpExclude() []string {
if m != nil {
return m.LocationRegexpExclude
}
return nil
}
type Verifiers_Tryjob_EquivalentBuilder struct {
// Required. Name of this builder.
// Format is the same in the same format as Builder.name.
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
// Percentage expressing probability of CQ triggering this builder instead
// of the builder to which this builder is equilvanet to.
//
// A choice itself is made deterministicly based on CL alone, hereby
// all CQ attempts on all patchsets of a given CL will trigger the same
// builder, assuming CQ config doesn't change in the mean time.
//
// Note that if `owner_whitelist_group` is also specified, the choice over
// which of the two builders to trigger will be made only for CLs owned by
// whitelisted group.
//
// If not specified, defaults to 0, meaning this builder is never
// triggered by CQ, but an existing build of can be re-used by CQ.
//
// To illustrate, suppose percentage=10. Then,
// Without owner_whitelist_group,
// ~10% of all CQ attempts will trigger this builder.
// With owner_whitelist_group set and, suppose, 1/5 of CQ attempts are
// ran on CLs owned by this group, then only ~(1/10)*(1/5) or
// ~2% of all CQ attempts will trigger this builder.
Percentage float32 `protobuf:"fixed32,2,opt,name=percentage,proto3" json:"percentage,omitempty"`
// If specified, limits the builder to CL owners in this group.
OwnerWhitelistGroup string `protobuf:"bytes,3,opt,name=owner_whitelist_group,json=ownerWhitelistGroup,proto3" json:"owner_whitelist_group,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Verifiers_Tryjob_EquivalentBuilder) Reset() { *m = Verifiers_Tryjob_EquivalentBuilder{} }
func (m *Verifiers_Tryjob_EquivalentBuilder) String() string { return proto.CompactTextString(m) }
func (*Verifiers_Tryjob_EquivalentBuilder) ProtoMessage() {}
func (*Verifiers_Tryjob_EquivalentBuilder) Descriptor() ([]byte, []int) {
return fileDescriptor_dfc3c1383080898a, []int{3, 2, 1}
}
func (m *Verifiers_Tryjob_EquivalentBuilder) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Verifiers_Tryjob_EquivalentBuilder.Unmarshal(m, b)
}
func (m *Verifiers_Tryjob_EquivalentBuilder) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Verifiers_Tryjob_EquivalentBuilder.Marshal(b, m, deterministic)
}
func (m *Verifiers_Tryjob_EquivalentBuilder) XXX_Merge(src proto.Message) {
xxx_messageInfo_Verifiers_Tryjob_EquivalentBuilder.Merge(m, src)
}
func (m *Verifiers_Tryjob_EquivalentBuilder) XXX_Size() int {
return xxx_messageInfo_Verifiers_Tryjob_EquivalentBuilder.Size(m)
}
func (m *Verifiers_Tryjob_EquivalentBuilder) XXX_DiscardUnknown() {
xxx_messageInfo_Verifiers_Tryjob_EquivalentBuilder.DiscardUnknown(m)
}
var xxx_messageInfo_Verifiers_Tryjob_EquivalentBuilder proto.InternalMessageInfo
func (m *Verifiers_Tryjob_EquivalentBuilder) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *Verifiers_Tryjob_EquivalentBuilder) GetPercentage() float32 {
if m != nil {
return m.Percentage
}
return 0
}
func (m *Verifiers_Tryjob_EquivalentBuilder) GetOwnerWhitelistGroup() string {
if m != nil {
return m.OwnerWhitelistGroup
}
return ""
}
// Collection of parameters for deciding whether to retry a single build.
// If parameter is not specified, its value defaults to 0 (per proto3).
// Thus, omitting all parameters means no retries of any kind.
type Verifiers_Tryjob_RetryConfig struct {
// Retry quota for a single tryjob.
SingleQuota int32 `protobuf:"varint,1,opt,name=single_quota,json=singleQuota,proto3" json:"single_quota,omitempty"`
// Retry quota for all tryjobs in a CL.
GlobalQuota int32 `protobuf:"varint,2,opt,name=global_quota,json=globalQuota,proto3" json:"global_quota,omitempty"`
// The weight assigned to each tryjob failure.
FailureWeight int32 `protobuf:"varint,3,opt,name=failure_weight,json=failureWeight,proto3" json:"failure_weight,omitempty"`
// The weight assigned to each transient failure.
TransientFailureWeight int32 `protobuf:"varint,4,opt,name=transient_failure_weight,json=transientFailureWeight,proto3" json:"transient_failure_weight,omitempty"`
// The weight assigned to tryjob timeouts.
TimeoutWeight int32 `protobuf:"varint,5,opt,name=timeout_weight,json=timeoutWeight,proto3" json:"timeout_weight,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Verifiers_Tryjob_RetryConfig) Reset() { *m = Verifiers_Tryjob_RetryConfig{} }
func (m *Verifiers_Tryjob_RetryConfig) String() string { return proto.CompactTextString(m) }
func (*Verifiers_Tryjob_RetryConfig) ProtoMessage() {}
func (*Verifiers_Tryjob_RetryConfig) Descriptor() ([]byte, []int) {
return fileDescriptor_dfc3c1383080898a, []int{3, 2, 2}
}
func (m *Verifiers_Tryjob_RetryConfig) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Verifiers_Tryjob_RetryConfig.Unmarshal(m, b)
}
func (m *Verifiers_Tryjob_RetryConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Verifiers_Tryjob_RetryConfig.Marshal(b, m, deterministic)
}
func (m *Verifiers_Tryjob_RetryConfig) XXX_Merge(src proto.Message) {
xxx_messageInfo_Verifiers_Tryjob_RetryConfig.Merge(m, src)
}
func (m *Verifiers_Tryjob_RetryConfig) XXX_Size() int {
return xxx_messageInfo_Verifiers_Tryjob_RetryConfig.Size(m)
}
func (m *Verifiers_Tryjob_RetryConfig) XXX_DiscardUnknown() {
xxx_messageInfo_Verifiers_Tryjob_RetryConfig.DiscardUnknown(m)
}
var xxx_messageInfo_Verifiers_Tryjob_RetryConfig proto.InternalMessageInfo
func (m *Verifiers_Tryjob_RetryConfig) GetSingleQuota() int32 {
if m != nil {
return m.SingleQuota
}
return 0
}
func (m *Verifiers_Tryjob_RetryConfig) GetGlobalQuota() int32 {
if m != nil {
return m.GlobalQuota
}
return 0
}
func (m *Verifiers_Tryjob_RetryConfig) GetFailureWeight() int32 {
if m != nil {
return m.FailureWeight
}
return 0
}
func (m *Verifiers_Tryjob_RetryConfig) GetTransientFailureWeight() int32 {
if m != nil {
return m.TransientFailureWeight
}
return 0
}
func (m *Verifiers_Tryjob_RetryConfig) GetTimeoutWeight() int32 {
if m != nil {
return m.TimeoutWeight
}
return 0
}
// Deprecator is for internal use in CQ.
type Verifiers_Deprecator struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Verifiers_Deprecator) Reset() { *m = Verifiers_Deprecator{} }
func (m *Verifiers_Deprecator) String() string { return proto.CompactTextString(m) }
func (*Verifiers_Deprecator) ProtoMessage() {}
func (*Verifiers_Deprecator) Descriptor() ([]byte, []int) {
return fileDescriptor_dfc3c1383080898a, []int{3, 3}
}
func (m *Verifiers_Deprecator) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Verifiers_Deprecator.Unmarshal(m, b)
}
func (m *Verifiers_Deprecator) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Verifiers_Deprecator.Marshal(b, m, deterministic)
}
func (m *Verifiers_Deprecator) XXX_Merge(src proto.Message) {
xxx_messageInfo_Verifiers_Deprecator.Merge(m, src)
}
func (m *Verifiers_Deprecator) XXX_Size() int {
return xxx_messageInfo_Verifiers_Deprecator.Size(m)
}
func (m *Verifiers_Deprecator) XXX_DiscardUnknown() {
xxx_messageInfo_Verifiers_Deprecator.DiscardUnknown(m)
}
var xxx_messageInfo_Verifiers_Deprecator proto.InternalMessageInfo
// Fake is for internal use in CQ.
type Verifiers_Fake struct {
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
EventualState string `protobuf:"bytes,2,opt,name=eventual_state,json=eventualState,proto3" json:"eventual_state,omitempty"`
Delay int32 `protobuf:"varint,3,opt,name=delay,proto3" json:"delay,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Verifiers_Fake) Reset() { *m = Verifiers_Fake{} }
func (m *Verifiers_Fake) String() string { return proto.CompactTextString(m) }
func (*Verifiers_Fake) ProtoMessage() {}
func (*Verifiers_Fake) Descriptor() ([]byte, []int) {
return fileDescriptor_dfc3c1383080898a, []int{3, 4}
}
func (m *Verifiers_Fake) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Verifiers_Fake.Unmarshal(m, b)
}
func (m *Verifiers_Fake) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Verifiers_Fake.Marshal(b, m, deterministic)
}
func (m *Verifiers_Fake) XXX_Merge(src proto.Message) {
xxx_messageInfo_Verifiers_Fake.Merge(m, src)
}
func (m *Verifiers_Fake) XXX_Size() int {
return xxx_messageInfo_Verifiers_Fake.Size(m)
}
func (m *Verifiers_Fake) XXX_DiscardUnknown() {
xxx_messageInfo_Verifiers_Fake.DiscardUnknown(m)
}
var xxx_messageInfo_Verifiers_Fake proto.InternalMessageInfo
func (m *Verifiers_Fake) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *Verifiers_Fake) GetEventualState() string {
if m != nil {
return m.EventualState
}
return ""
}
func (m *Verifiers_Fake) GetDelay() int32 {
if m != nil {
return m.Delay
}
return 0
}
func init() {
proto.RegisterType((*Config)(nil), "cq.config.Config")
proto.RegisterType((*SubmitOptions)(nil), "cq.config.SubmitOptions")
proto.RegisterType((*ConfigGroup)(nil), "cq.config.ConfigGroup")
proto.RegisterType((*ConfigGroup_Gerrit)(nil), "cq.config.ConfigGroup.Gerrit")
proto.RegisterType((*ConfigGroup_Gerrit_Project)(nil), "cq.config.ConfigGroup.Gerrit.Project")
proto.RegisterType((*Verifiers)(nil), "cq.config.Verifiers")
proto.RegisterType((*Verifiers_GerritCQAbility)(nil), "cq.config.Verifiers.GerritCQAbility")
proto.RegisterType((*Verifiers_TreeStatus)(nil), "cq.config.Verifiers.TreeStatus")
proto.RegisterType((*Verifiers_Tryjob)(nil), "cq.config.Verifiers.Tryjob")
proto.RegisterType((*Verifiers_Tryjob_Builder)(nil), "cq.config.Verifiers.Tryjob.Builder")
proto.RegisterType((*Verifiers_Tryjob_EquivalentBuilder)(nil), "cq.config.Verifiers.Tryjob.EquivalentBuilder")
proto.RegisterType((*Verifiers_Tryjob_RetryConfig)(nil), "cq.config.Verifiers.Tryjob.RetryConfig")
proto.RegisterType((*Verifiers_Deprecator)(nil), "cq.config.Verifiers.Deprecator")
proto.RegisterType((*Verifiers_Fake)(nil), "cq.config.Verifiers.Fake")
}
func init() { proto.RegisterFile("cq.proto", fileDescriptor_dfc3c1383080898a) }
var fileDescriptor_dfc3c1383080898a = []byte{
// 1008 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x55, 0xdd, 0x6e, 0xdb, 0x46,
0x13, 0x85, 0x14, 0x59, 0x96, 0x86, 0x92, 0x1c, 0x6f, 0xec, 0x44, 0x1f, 0x8d, 0xf8, 0x73, 0x9d,
0x18, 0xf1, 0x8d, 0x19, 0x40, 0x46, 0x8b, 0xa2, 0x0d, 0x90, 0xfa, 0x27, 0x49, 0x51, 0x14, 0x88,
0xb3, 0x36, 0x6a, 0xa0, 0x37, 0x0b, 0x8a, 0x1a, 0x51, 0x9b, 0x50, 0x5c, 0x6a, 0xb9, 0xb4, 0x2d,
0xf4, 0x3d, 0x7a, 0xd3, 0xeb, 0xbe, 0x43, 0xaf, 0xfb, 0x02, 0x7d, 0x80, 0xf6, 0x61, 0x8a, 0xfd,
0x11, 0x25, 0x3b, 0xaa, 0xef, 0xb8, 0x67, 0xce, 0xd9, 0x9d, 0x39, 0x3b, 0xb3, 0x84, 0x46, 0x34,
0x09, 0x32, 0x29, 0x94, 0x20, 0xcd, 0x68, 0x12, 0x44, 0x22, 0x1d, 0xf2, 0xd8, 0xdf, 0x8e, 0x85,
0x88, 0x13, 0x7c, 0x69, 0x02, 0xfd, 0x62, 0xf8, 0x72, 0x50, 0xc8, 0x50, 0x71, 0x91, 0x5a, 0xea,
0xee, 0x3f, 0x15, 0xa8, 0x9f, 0x18, 0x2a, 0x09, 0xe0, 0xd1, 0x40, 0x86, 0x3c, 0xe5, 0x69, 0xcc,
0x72, 0x15, 0x4a, 0xc5, 0x14, 0x1f, 0x63, 0xb7, 0xb2, 0x53, 0xd9, 0x6f, 0xd2, 0xf5, 0x59, 0xe8,
0x5c, 0x47, 0x2e, 0xf8, 0x18, 0xc9, 0x73, 0xe8, 0x44, 0x13, 0xcd, 0x54, 0x45, 0xce, 0x46, 0x22,
0x57, 0xdd, 0xaa, 0xa1, 0xb6, 0xa2, 0xc9, 0xb9, 0x01, 0xbf, 0x17, 0xb9, 0x22, 0xaf, 0xa1, 0x93,
0x17, 0xfd, 0x31, 0x57, 0x4c, 0x64, 0xfa, 0xdc, 0xbc, 0xfb, 0x60, 0xa7, 0xb2, 0xef, 0xf5, 0xba,
0x41, 0x99, 0x64, 0x70, 0x6e, 0x08, 0xef, 0x6d, 0x9c, 0xb6, 0xf3, 0xc5, 0x25, 0xf9, 0x16, 0xda,
0x96, 0xc6, 0x62, 0x29, 0x8a, 0x2c, 0xef, 0xd6, 0x76, 0x1e, 0xec, 0x7b, 0xbd, 0xc7, 0x0b, 0x7a,
0x5b, 0xc0, 0x3b, 0x1d, 0xa6, 0xad, 0x68, 0xbe, 0xc8, 0x77, 0x47, 0xd0, 0xbe, 0xb5, 0x39, 0xd9,
0x82, 0xe6, 0x38, 0xbc, 0x61, 0xfd, 0x42, 0xe6, 0xca, 0x94, 0xb6, 0x42, 0x1b, 0xe3, 0xf0, 0xe6,
0x58, 0xaf, 0xc9, 0x37, 0xe0, 0x99, 0x00, 0x1b, 0x60, 0x12, 0x4e, 0x4d, 0x39, 0x5e, 0xef, 0x7f,
0x81, 0xb5, 0x30, 0x98, 0x59, 0x18, 0x9c, 0x3a, 0x0b, 0x29, 0x18, 0xf6, 0xa9, 0x26, 0xef, 0xfe,
0x5a, 0x05, 0x6f, 0x21, 0x0f, 0xf2, 0x25, 0xd4, 0x63, 0x94, 0x92, 0xeb, 0x53, 0x74, 0xbe, 0x4f,
0x97, 0xe7, 0x1b, 0xbc, 0x33, 0x24, 0xea, 0xc8, 0xa4, 0x07, 0xcd, 0x2b, 0x94, 0x7c, 0xc8, 0x51,
0xe6, 0x2e, 0x81, 0x8d, 0x05, 0xe5, 0x4f, 0xb3, 0x18, 0x9d, 0xd3, 0xfc, 0xdf, 0x2a, 0x50, 0xb7,
0xdb, 0x90, 0x87, 0xf0, 0xa0, 0x90, 0x89, 0xbb, 0x33, 0xfd, 0x49, 0x8e, 0xa0, 0x91, 0x49, 0xf1,
0x11, 0x23, 0xa5, 0xf7, 0xd3, 0x99, 0xec, 0xdd, 0x9b, 0x49, 0x70, 0x66, 0xd9, 0xb4, 0x94, 0xf9,
0xaf, 0x60, 0xd5, 0x81, 0x84, 0x40, 0x2d, 0x0d, 0xcb, 0xa6, 0x30, 0xdf, 0xe4, 0x29, 0x80, 0xc4,
0x21, 0x93, 0x18, 0xe3, 0x4d, 0x66, 0xce, 0x68, 0xd2, 0xa6, 0xc4, 0x21, 0x35, 0xc0, 0xee, 0x1f,
0x1e, 0x34, 0xcb, 0xb4, 0xc9, 0x19, 0xac, 0xdb, 0x4a, 0x59, 0x34, 0x61, 0x61, 0x9f, 0x27, 0x5c,
0x4d, 0xcd, 0x6e, 0x5e, 0xef, 0xf9, 0xb2, 0x3a, 0x5d, 0x56, 0x27, 0x1f, 0x8e, 0x2c, 0x97, 0xae,
0x59, 0xf9, 0xc9, 0xc4, 0x01, 0xe4, 0x3b, 0xf0, 0x94, 0x44, 0x74, 0x8d, 0xe8, 0x3c, 0xfb, 0xff,
0xd2, 0xbd, 0x2e, 0x24, 0xa2, 0x6d, 0x4d, 0x0a, 0xaa, 0xfc, 0x26, 0x87, 0x50, 0x57, 0x72, 0xfa,
0x51, 0xf4, 0x5d, 0x6b, 0x6e, 0xfd, 0x87, 0x58, 0x53, 0xa8, 0xa3, 0x92, 0xd7, 0x00, 0x03, 0xcc,
0x24, 0x46, 0xa1, 0x12, 0xb2, 0x5b, 0xbb, 0xe7, 0xd4, 0xd3, 0x92, 0x46, 0x17, 0x24, 0xe4, 0x00,
0x6a, 0xc3, 0xf0, 0x13, 0x76, 0x57, 0x5c, 0x97, 0x2d, 0x93, 0xbe, 0x0d, 0x3f, 0x21, 0x35, 0x34,
0xff, 0xf7, 0x0a, 0xac, 0xdd, 0xf1, 0x82, 0xec, 0x41, 0x27, 0x12, 0xe3, 0x31, 0x57, 0x0a, 0x25,
0x4b, 0xb8, 0xeb, 0xe8, 0x26, 0x6d, 0x97, 0xe8, 0x8f, 0x3c, 0x57, 0xe4, 0x40, 0x0f, 0xf6, 0x94,
0xc9, 0x22, 0x65, 0x61, 0x14, 0x61, 0x9e, 0x5b, 0xae, 0x9d, 0xd6, 0x87, 0x03, 0x39, 0xa5, 0x45,
0x7a, 0x64, 0x02, 0x86, 0xfe, 0x0a, 0xb6, 0xc2, 0x24, 0x11, 0xd7, 0xcc, 0xcd, 0xed, 0x35, 0x57,
0x23, 0x26, 0x32, 0x4c, 0xd9, 0x00, 0x33, 0x3b, 0xbe, 0x0d, 0xfa, 0xc4, 0x50, 0xec, 0x6c, 0x5d,
0x72, 0x35, 0x7a, 0x9f, 0x61, 0x7a, 0x8a, 0x59, 0xee, 0x6f, 0x03, 0xcc, 0x6d, 0xfe, 0xbc, 0x1f,
0xfd, 0x3f, 0xeb, 0x50, 0xbf, 0x98, 0x59, 0xd8, 0xe8, 0x17, 0x3c, 0x19, 0xe8, 0x56, 0xb7, 0x43,
0xf2, 0xec, 0x1e, 0xe7, 0x83, 0x63, 0xcb, 0xa5, 0xa5, 0x88, 0xfc, 0x00, 0x2d, 0x89, 0x4a, 0x4e,
0x99, 0x95, 0xb8, 0xbb, 0x7f, 0x71, 0xdf, 0x26, 0x54, 0xf3, 0x6d, 0xd7, 0x53, 0x4f, 0xce, 0x17,
0xfe, 0x5f, 0x55, 0x58, 0x75, 0x27, 0x2c, 0xed, 0xf2, 0x67, 0xd0, 0x1e, 0xf0, 0x3c, 0xec, 0x27,
0xc8, 0x24, 0x16, 0x39, 0x9a, 0xc3, 0x1a, 0xb4, 0xe5, 0x40, 0xaa, 0x31, 0xf2, 0x05, 0xb4, 0x94,
0xe4, 0x71, 0x8c, 0x12, 0x07, 0xac, 0x3f, 0x35, 0x5e, 0x35, 0xa9, 0x57, 0x62, 0xc7, 0x53, 0x72,
0x08, 0x9b, 0x78, 0x93, 0xa1, 0xe4, 0x63, 0x4c, 0x15, 0xcb, 0x50, 0x46, 0x98, 0xaa, 0x30, 0x46,
0xd3, 0x42, 0x55, 0xba, 0x31, 0x0f, 0x9e, 0x95, 0x31, 0x42, 0xa1, 0x8d, 0x93, 0x82, 0x5f, 0x85,
0x89, 0x16, 0x29, 0xe1, 0x9a, 0xe6, 0xe0, 0xbe, 0x4a, 0xdf, 0x94, 0x82, 0x99, 0x71, 0xad, 0xf9,
0x1e, 0x17, 0x82, 0xbc, 0x80, 0xb5, 0x44, 0x44, 0xe6, 0x21, 0x9b, 0xcd, 0x6e, 0xdd, 0xcc, 0x6e,
0x67, 0x06, 0xdb, 0x01, 0x26, 0x5f, 0xc1, 0x93, 0x3b, 0x44, 0x86, 0x37, 0x51, 0x52, 0x0c, 0xb0,
0xbb, 0x6a, 0x04, 0x9b, 0xb7, 0x05, 0x6f, 0x6c, 0xd0, 0xff, 0x05, 0xd6, 0x3f, 0xcb, 0x61, 0xa9,
0xb5, 0xdb, 0x00, 0x0b, 0x3e, 0x54, 0x8d, 0x0f, 0x0b, 0x08, 0xe9, 0xc1, 0xa6, 0xb8, 0x4e, 0x51,
0xb2, 0xeb, 0x11, 0x57, 0xa8, 0x7b, 0xd7, 0xfe, 0x0a, 0x9c, 0xbd, 0x8f, 0x4c, 0xf0, 0x72, 0x16,
0x33, 0x8f, 0x99, 0xff, 0x77, 0x05, 0xbc, 0x85, 0xbb, 0xd6, 0x37, 0x93, 0xf3, 0x34, 0x4e, 0x90,
0x4d, 0x0a, 0xa1, 0x42, 0xf7, 0xf4, 0x7b, 0x16, 0xfb, 0xa0, 0x21, 0x4d, 0x89, 0x13, 0xd1, 0x0f,
0x13, 0x47, 0xa9, 0x5a, 0x8a, 0xc5, 0x2c, 0x65, 0x0f, 0x3a, 0xc3, 0x90, 0x27, 0x85, 0x44, 0x76,
0x8d, 0x3c, 0x1e, 0x29, 0x93, 0xc2, 0x0a, 0x6d, 0x3b, 0xf4, 0xd2, 0x80, 0xe4, 0x6b, 0xe8, 0x2a,
0x19, 0xa6, 0x39, 0xd7, 0xb7, 0x75, 0x47, 0x50, 0x33, 0x82, 0xc7, 0x65, 0xfc, 0xed, 0x2d, 0xe5,
0x1e, 0x74, 0xf4, 0x4f, 0x57, 0x14, 0x6a, 0xc6, 0x5f, 0xb1, 0x07, 0x38, 0xd4, 0xd2, 0xfc, 0x16,
0xc0, 0xfc, 0x55, 0xf1, 0x2f, 0xa1, 0xa6, 0x1f, 0x8a, 0xa5, 0xde, 0xee, 0x41, 0x07, 0xaf, 0x30,
0x55, 0x45, 0x98, 0x98, 0x17, 0x12, 0xdd, 0xd8, 0xb7, 0x67, 0xa8, 0x1e, 0x54, 0x24, 0x1b, 0xb0,
0x62, 0xff, 0x79, 0xb6, 0x1e, 0xbb, 0x38, 0x6e, 0xfc, 0x5c, 0xb7, 0xdd, 0xd5, 0xaf, 0x9b, 0x9f,
0xdf, 0xe1, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xea, 0x0c, 0xab, 0xa5, 0x64, 0x08, 0x00, 0x00,
}