blob: 2ee567e06b3cba98533e54260a583d95112445e1 [file] [log] [blame]
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: go.chromium.org/luci/swarming/proto/config/pools.proto
package configpb
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
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
// Schema for pools.cfg service config file in luci-config.
//
// It defined a set of Pool objects, each one corresponding to a single Swarming
// pool dimension. Each Swarming task resided in some pool, and each Swarming
// bot belongs to at least one pool.
//
// Pools are used to isolate groups of tasks/bots from each other for security
// and capacity reasons. Two different pools should not interfere with each
// other at all (unless explicitly configured to share bots or accounts).
type PoolsCfg struct {
// List of all defined pools.
Pool []*Pool `protobuf:"bytes,1,rep,name=pool,proto3" json:"pool,omitempty"`
// Configures the default isolate and CIPD services to use for all pools on
// this server.
DefaultExternalServices *ExternalServices `protobuf:"bytes,6,opt,name=default_external_services,json=defaultExternalServices,proto3" json:"default_external_services,omitempty"`
// This is the "shared namespace" of task templates.
//
// Task templates allow pools to specify some property defaults (particularly
// around caches, CIPD packages and Environment variables) for tasks created
// within the pool. These templates can have 'include' statements, and those
// include statements draw from this namespace.
//
// Swarming will do a 2-pass parse of these so order doesn't matter (i.e. If
// A includes B, but is defined B-then-A, it's not an error).
TaskTemplate []*TaskTemplate `protobuf:"bytes,3,rep,name=task_template,json=taskTemplate,proto3" json:"task_template,omitempty"`
// This is the "shared namespace" of deployments.
//
// When pools specify a task_template_deployment, it draws from this
// namespace.
TaskTemplateDeployment []*TaskTemplateDeployment `protobuf:"bytes,4,rep,name=task_template_deployment,json=taskTemplateDeployment,proto3" json:"task_template_deployment,omitempty"`
// Defines about how to monitor bots in a pool. Each pool above may refer to
// one of the BotMonitoring message by name, which permits reusing
// BotMonitoring definitions.
BotMonitoring []*BotMonitoring `protobuf:"bytes,5,rep,name=bot_monitoring,json=botMonitoring,proto3" json:"bot_monitoring,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *PoolsCfg) Reset() { *m = PoolsCfg{} }
func (m *PoolsCfg) String() string { return proto.CompactTextString(m) }
func (*PoolsCfg) ProtoMessage() {}
func (*PoolsCfg) Descriptor() ([]byte, []int) {
return fileDescriptor_34aa853d71145463, []int{0}
}
func (m *PoolsCfg) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PoolsCfg.Unmarshal(m, b)
}
func (m *PoolsCfg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_PoolsCfg.Marshal(b, m, deterministic)
}
func (m *PoolsCfg) XXX_Merge(src proto.Message) {
xxx_messageInfo_PoolsCfg.Merge(m, src)
}
func (m *PoolsCfg) XXX_Size() int {
return xxx_messageInfo_PoolsCfg.Size(m)
}
func (m *PoolsCfg) XXX_DiscardUnknown() {
xxx_messageInfo_PoolsCfg.DiscardUnknown(m)
}
var xxx_messageInfo_PoolsCfg proto.InternalMessageInfo
func (m *PoolsCfg) GetPool() []*Pool {
if m != nil {
return m.Pool
}
return nil
}
func (m *PoolsCfg) GetDefaultExternalServices() *ExternalServices {
if m != nil {
return m.DefaultExternalServices
}
return nil
}
func (m *PoolsCfg) GetTaskTemplate() []*TaskTemplate {
if m != nil {
return m.TaskTemplate
}
return nil
}
func (m *PoolsCfg) GetTaskTemplateDeployment() []*TaskTemplateDeployment {
if m != nil {
return m.TaskTemplateDeployment
}
return nil
}
func (m *PoolsCfg) GetBotMonitoring() []*BotMonitoring {
if m != nil {
return m.BotMonitoring
}
return nil
}
// Properties of a single pool or a bunch of identically configured pools.
//
// In particular contains authorization configuration.
type Pool struct {
// Names of the pools this config applies to.
//
// Tasks target the pool by specifying its name as 'pool' dimension, thus
// names here should be valid dimension value.
Name []string `protobuf:"bytes,1,rep,name=name,proto3" json:"name,omitempty"`
// Contact information for people that own this pool.
//
// Not used in any ACLs, just informational field.
Owners []string `protobuf:"bytes,2,rep,name=owners,proto3" json:"owners,omitempty"`
// Defines who can schedule tasks in this pool.
//
// The checks here act as a second authorization layer, consulted after the
// first server-global one (defined based on groups set in settings.cfg, see
// AuthSettings in config.proto).
Schedulers *Schedulers `protobuf:"bytes,3,opt,name=schedulers,proto3" json:"schedulers,omitempty"`
// List of service account emails allowed to be used for tasks that target
// this pool. Tasks specify the service account via 'service_account' field
// in the tasks.New RPC.
//
// By associating accounts with pools in the config we make it more explicit
// that a bot belonging to a pool eventually can get access to service
// accounts of all tasks running in this pool (just by sitting there, grabbing
// tasks and sniffing service account tokens).
AllowedServiceAccount []string `protobuf:"bytes,4,rep,name=allowed_service_account,json=allowedServiceAccount,proto3" json:"allowed_service_account,omitempty"`
// Same as 'allowed_service_account', but the set of service accounts is
// specified through an auth group.
AllowedServiceAccountGroup []string `protobuf:"bytes,5,rep,name=allowed_service_account_group,json=allowedServiceAccountGroup,proto3" json:"allowed_service_account_group,omitempty"`
// Types that are valid to be assigned to TaskDeploymentScheme:
// *Pool_TaskTemplateDeployment
// *Pool_TaskTemplateDeploymentInline
TaskDeploymentScheme isPool_TaskDeploymentScheme `protobuf_oneof:"task_deployment_scheme"`
// Refer to one bot_monitoring at the file level by name.
BotMonitoring string `protobuf:"bytes,8,opt,name=bot_monitoring,json=botMonitoring,proto3" json:"bot_monitoring,omitempty"`
// If specified, this is the description of the external schedulers to be used
// for tasks and bots for this pool that match the dimension set of a scheduler.
// For a given task or bot, the first entry in this list that matches based on
// dimension eligibility will be used.
ExternalSchedulers []*ExternalSchedulerConfig `protobuf:"bytes,9,rep,name=external_schedulers,json=externalSchedulers,proto3" json:"external_schedulers,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Pool) Reset() { *m = Pool{} }
func (m *Pool) String() string { return proto.CompactTextString(m) }
func (*Pool) ProtoMessage() {}
func (*Pool) Descriptor() ([]byte, []int) {
return fileDescriptor_34aa853d71145463, []int{1}
}
func (m *Pool) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Pool.Unmarshal(m, b)
}
func (m *Pool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Pool.Marshal(b, m, deterministic)
}
func (m *Pool) XXX_Merge(src proto.Message) {
xxx_messageInfo_Pool.Merge(m, src)
}
func (m *Pool) XXX_Size() int {
return xxx_messageInfo_Pool.Size(m)
}
func (m *Pool) XXX_DiscardUnknown() {
xxx_messageInfo_Pool.DiscardUnknown(m)
}
var xxx_messageInfo_Pool proto.InternalMessageInfo
func (m *Pool) GetName() []string {
if m != nil {
return m.Name
}
return nil
}
func (m *Pool) GetOwners() []string {
if m != nil {
return m.Owners
}
return nil
}
func (m *Pool) GetSchedulers() *Schedulers {
if m != nil {
return m.Schedulers
}
return nil
}
func (m *Pool) GetAllowedServiceAccount() []string {
if m != nil {
return m.AllowedServiceAccount
}
return nil
}
func (m *Pool) GetAllowedServiceAccountGroup() []string {
if m != nil {
return m.AllowedServiceAccountGroup
}
return nil
}
type isPool_TaskDeploymentScheme interface {
isPool_TaskDeploymentScheme()
}
type Pool_TaskTemplateDeployment struct {
TaskTemplateDeployment string `protobuf:"bytes,6,opt,name=task_template_deployment,json=taskTemplateDeployment,proto3,oneof"`
}
type Pool_TaskTemplateDeploymentInline struct {
TaskTemplateDeploymentInline *TaskTemplateDeployment `protobuf:"bytes,7,opt,name=task_template_deployment_inline,json=taskTemplateDeploymentInline,proto3,oneof"`
}
func (*Pool_TaskTemplateDeployment) isPool_TaskDeploymentScheme() {}
func (*Pool_TaskTemplateDeploymentInline) isPool_TaskDeploymentScheme() {}
func (m *Pool) GetTaskDeploymentScheme() isPool_TaskDeploymentScheme {
if m != nil {
return m.TaskDeploymentScheme
}
return nil
}
func (m *Pool) GetTaskTemplateDeployment() string {
if x, ok := m.GetTaskDeploymentScheme().(*Pool_TaskTemplateDeployment); ok {
return x.TaskTemplateDeployment
}
return ""
}
func (m *Pool) GetTaskTemplateDeploymentInline() *TaskTemplateDeployment {
if x, ok := m.GetTaskDeploymentScheme().(*Pool_TaskTemplateDeploymentInline); ok {
return x.TaskTemplateDeploymentInline
}
return nil
}
func (m *Pool) GetBotMonitoring() string {
if m != nil {
return m.BotMonitoring
}
return ""
}
func (m *Pool) GetExternalSchedulers() []*ExternalSchedulerConfig {
if m != nil {
return m.ExternalSchedulers
}
return nil
}
// XXX_OneofWrappers is for the internal use of the proto package.
func (*Pool) XXX_OneofWrappers() []interface{} {
return []interface{}{
(*Pool_TaskTemplateDeployment)(nil),
(*Pool_TaskTemplateDeploymentInline)(nil),
}
}
// Defines who can schedule tasks in a pool.
type Schedulers struct {
// Emails of individual end-users.
//
// Useful to avoid creating one-person groups.
User []string `protobuf:"bytes,1,rep,name=user,proto3" json:"user,omitempty"`
// List of groups with end-users.
Group []string `protobuf:"bytes,2,rep,name=group,proto3" json:"group,omitempty"`
// See TrustedDelegation comment.
TrustedDelegation []*TrustedDelegation `protobuf:"bytes,3,rep,name=trusted_delegation,json=trustedDelegation,proto3" json:"trusted_delegation,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Schedulers) Reset() { *m = Schedulers{} }
func (m *Schedulers) String() string { return proto.CompactTextString(m) }
func (*Schedulers) ProtoMessage() {}
func (*Schedulers) Descriptor() ([]byte, []int) {
return fileDescriptor_34aa853d71145463, []int{2}
}
func (m *Schedulers) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Schedulers.Unmarshal(m, b)
}
func (m *Schedulers) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Schedulers.Marshal(b, m, deterministic)
}
func (m *Schedulers) XXX_Merge(src proto.Message) {
xxx_messageInfo_Schedulers.Merge(m, src)
}
func (m *Schedulers) XXX_Size() int {
return xxx_messageInfo_Schedulers.Size(m)
}
func (m *Schedulers) XXX_DiscardUnknown() {
xxx_messageInfo_Schedulers.DiscardUnknown(m)
}
var xxx_messageInfo_Schedulers proto.InternalMessageInfo
func (m *Schedulers) GetUser() []string {
if m != nil {
return m.User
}
return nil
}
func (m *Schedulers) GetGroup() []string {
if m != nil {
return m.Group
}
return nil
}
func (m *Schedulers) GetTrustedDelegation() []*TrustedDelegation {
if m != nil {
return m.TrustedDelegation
}
return nil
}
// Defines a delegatee trusted to make authorization decisions for who can use
// a pool.
//
// This is based on LUCI delegation protocol. Imagine an end user U calling
// Swarming through an intermediary service X. In this case U is a delegator and
// X is a delegatee. When X calls Swarming, it makes an RPC to the token server
// to make a delegation token that says "<X can call Swarming on behalf of U>".
//
// This token is then sent to the Swarming with the RPC. Swarming sees that
// the direct peer it's talking to is X, but the call should be performed under
// the authority of U.
//
// We extend this to also allow X make authorization decisions about whether U
// can use particular Swarming resource or not. The result of this decision is
// encoded in the delegation token as a set of "key:value" tags. Swarming then
// can treat presence of such tags as a signal that the particular call is
// allowed.
//
// In this scenario we totally trust X to make the correct decision.
type TrustedDelegation struct {
// Email of a trusted delegatee (the one who's minting the delegation token).
PeerId string `protobuf:"bytes,1,opt,name=peer_id,json=peerId,proto3" json:"peer_id,omitempty"`
// A list of tags to expected in the delegation token to allow the usage of
// a pool.
//
// Presence of any of the specified tags are enough. The format of these tags
// generally depends on what service is doing the delegation.
RequireAnyOf *TrustedDelegation_TagList `protobuf:"bytes,2,opt,name=require_any_of,json=requireAnyOf,proto3" json:"require_any_of,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *TrustedDelegation) Reset() { *m = TrustedDelegation{} }
func (m *TrustedDelegation) String() string { return proto.CompactTextString(m) }
func (*TrustedDelegation) ProtoMessage() {}
func (*TrustedDelegation) Descriptor() ([]byte, []int) {
return fileDescriptor_34aa853d71145463, []int{3}
}
func (m *TrustedDelegation) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TrustedDelegation.Unmarshal(m, b)
}
func (m *TrustedDelegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_TrustedDelegation.Marshal(b, m, deterministic)
}
func (m *TrustedDelegation) XXX_Merge(src proto.Message) {
xxx_messageInfo_TrustedDelegation.Merge(m, src)
}
func (m *TrustedDelegation) XXX_Size() int {
return xxx_messageInfo_TrustedDelegation.Size(m)
}
func (m *TrustedDelegation) XXX_DiscardUnknown() {
xxx_messageInfo_TrustedDelegation.DiscardUnknown(m)
}
var xxx_messageInfo_TrustedDelegation proto.InternalMessageInfo
func (m *TrustedDelegation) GetPeerId() string {
if m != nil {
return m.PeerId
}
return ""
}
func (m *TrustedDelegation) GetRequireAnyOf() *TrustedDelegation_TagList {
if m != nil {
return m.RequireAnyOf
}
return nil
}
type TrustedDelegation_TagList struct {
Tag []string `protobuf:"bytes,1,rep,name=tag,proto3" json:"tag,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *TrustedDelegation_TagList) Reset() { *m = TrustedDelegation_TagList{} }
func (m *TrustedDelegation_TagList) String() string { return proto.CompactTextString(m) }
func (*TrustedDelegation_TagList) ProtoMessage() {}
func (*TrustedDelegation_TagList) Descriptor() ([]byte, []int) {
return fileDescriptor_34aa853d71145463, []int{3, 0}
}
func (m *TrustedDelegation_TagList) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TrustedDelegation_TagList.Unmarshal(m, b)
}
func (m *TrustedDelegation_TagList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_TrustedDelegation_TagList.Marshal(b, m, deterministic)
}
func (m *TrustedDelegation_TagList) XXX_Merge(src proto.Message) {
xxx_messageInfo_TrustedDelegation_TagList.Merge(m, src)
}
func (m *TrustedDelegation_TagList) XXX_Size() int {
return xxx_messageInfo_TrustedDelegation_TagList.Size(m)
}
func (m *TrustedDelegation_TagList) XXX_DiscardUnknown() {
xxx_messageInfo_TrustedDelegation_TagList.DiscardUnknown(m)
}
var xxx_messageInfo_TrustedDelegation_TagList proto.InternalMessageInfo
func (m *TrustedDelegation_TagList) GetTag() []string {
if m != nil {
return m.Tag
}
return nil
}
// A TaskTemplate describes a set of properties (caches, CIPD packages and
// envvars) which apply to tasks created within a swarming pool.
//
// TaskTemplates may either be defined inline inside of
// a TaskTemplateDeployment, or in "shared namespace" of the
// PoolsCfg.task_template field.
//
// TaskTemplates may also include other TaskTemplates by name from the "shared
// namespace" in PoolsCfg. Swarming calculates the final value for a given
// TaskTemplate by applying all of its `include` fields depth-first, and then by
// applying the properties in the body of the TaskTemplate. Includes may never
// be repeated, including transitively. This means that "diamond shaped
// dependencies" are forbidden (i.e. A<-B<-D and A<-C<-D would be forbidden
// because `A` is included in `D` twice (via both C and B)).
type TaskTemplate struct {
// This gives the template a name for the 'include' field below. This only
// applies to templates defined within the PoolsCfg message (i.e. the
// top-level message), not to templates inlined into a TaskTemplateDeployment.
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
// Includes properties from the named other TaskTemplate. This can only
// include templates defined in the top-level PoolsCfg message.
Include []string `protobuf:"bytes,2,rep,name=include,proto3" json:"include,omitempty"`
// CacheEntries are keyed by `name`, and `path` is overridden wholesale.
//
// It is illegal to have any TaskTemplate with multiple cache entries mapping
// to the same path. It is illegal to have any cache paths overlap with cipd
// package paths.
Cache []*TaskTemplate_CacheEntry `protobuf:"bytes,3,rep,name=cache,proto3" json:"cache,omitempty"`
// CipdPackages are keyed by (path, name), and `version` is overridden
// wholesale.
//
// It is illegal to have any cipd paths overlap with cache entry paths.
CipdPackage []*TaskTemplate_CipdPackage `protobuf:"bytes,4,rep,name=cipd_package,json=cipdPackage,proto3" json:"cipd_package,omitempty"`
// Env vars are keyed by the `var` field,
//
// `value` fields overwrite included values.
// `soft` fields overwrite included values.
// `prefix` fields append to included values. For example, Doing:
//
// {name: "1" env { var: "PATH" prefix: "a" }}
// {name: "2" env { var: "PATH" prefix: "b" }}
// {name: "3" include: "1" include: "2" }
//
// Is equivalent to:
//
// {name: "3" env { var: "PATH" prefix: "a" prefix: "b" }}
//
//
// Full Example:
//
// env {
// var: "PATH"
// value: "/disable_system_path"
// prefix: "a"
// prefix: "b"
// prefix: "c"
// soft: true
// }
// env {
// var: "OTHER"
// value: "1"
// }
// env {
// var: "PYTHONPATH"
// prefix: "a"
// }
//
// Results in, essentially:
//
// $PATH=/path/to/a:/path/to/b:/path/to/c:/disable_system_path
// $OTHER=1
// $PYTHONPATH=/path/to/a:$PYTHONPATH
Env []*TaskTemplate_Env `protobuf:"bytes,5,rep,name=env,proto3" json:"env,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *TaskTemplate) Reset() { *m = TaskTemplate{} }
func (m *TaskTemplate) String() string { return proto.CompactTextString(m) }
func (*TaskTemplate) ProtoMessage() {}
func (*TaskTemplate) Descriptor() ([]byte, []int) {
return fileDescriptor_34aa853d71145463, []int{4}
}
func (m *TaskTemplate) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskTemplate.Unmarshal(m, b)
}
func (m *TaskTemplate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_TaskTemplate.Marshal(b, m, deterministic)
}
func (m *TaskTemplate) XXX_Merge(src proto.Message) {
xxx_messageInfo_TaskTemplate.Merge(m, src)
}
func (m *TaskTemplate) XXX_Size() int {
return xxx_messageInfo_TaskTemplate.Size(m)
}
func (m *TaskTemplate) XXX_DiscardUnknown() {
xxx_messageInfo_TaskTemplate.DiscardUnknown(m)
}
var xxx_messageInfo_TaskTemplate proto.InternalMessageInfo
func (m *TaskTemplate) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *TaskTemplate) GetInclude() []string {
if m != nil {
return m.Include
}
return nil
}
func (m *TaskTemplate) GetCache() []*TaskTemplate_CacheEntry {
if m != nil {
return m.Cache
}
return nil
}
func (m *TaskTemplate) GetCipdPackage() []*TaskTemplate_CipdPackage {
if m != nil {
return m.CipdPackage
}
return nil
}
func (m *TaskTemplate) GetEnv() []*TaskTemplate_Env {
if m != nil {
return m.Env
}
return nil
}
type TaskTemplate_CacheEntry struct {
// The name of the cache (required).
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
// The path relative to the task root to mount the cache (required).
Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *TaskTemplate_CacheEntry) Reset() { *m = TaskTemplate_CacheEntry{} }
func (m *TaskTemplate_CacheEntry) String() string { return proto.CompactTextString(m) }
func (*TaskTemplate_CacheEntry) ProtoMessage() {}
func (*TaskTemplate_CacheEntry) Descriptor() ([]byte, []int) {
return fileDescriptor_34aa853d71145463, []int{4, 0}
}
func (m *TaskTemplate_CacheEntry) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskTemplate_CacheEntry.Unmarshal(m, b)
}
func (m *TaskTemplate_CacheEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_TaskTemplate_CacheEntry.Marshal(b, m, deterministic)
}
func (m *TaskTemplate_CacheEntry) XXX_Merge(src proto.Message) {
xxx_messageInfo_TaskTemplate_CacheEntry.Merge(m, src)
}
func (m *TaskTemplate_CacheEntry) XXX_Size() int {
return xxx_messageInfo_TaskTemplate_CacheEntry.Size(m)
}
func (m *TaskTemplate_CacheEntry) XXX_DiscardUnknown() {
xxx_messageInfo_TaskTemplate_CacheEntry.DiscardUnknown(m)
}
var xxx_messageInfo_TaskTemplate_CacheEntry proto.InternalMessageInfo
func (m *TaskTemplate_CacheEntry) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *TaskTemplate_CacheEntry) GetPath() string {
if m != nil {
return m.Path
}
return ""
}
type TaskTemplate_CipdPackage struct {
// The relative to the task root to unpack the CIPD package. A blank value
// is permitted and means 'the root directory of the task'.
Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
// The CIPD package name template to use (required).
Pkg string `protobuf:"bytes,2,opt,name=pkg,proto3" json:"pkg,omitempty"`
// The version of the CIPD package to use (required).
Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *TaskTemplate_CipdPackage) Reset() { *m = TaskTemplate_CipdPackage{} }
func (m *TaskTemplate_CipdPackage) String() string { return proto.CompactTextString(m) }
func (*TaskTemplate_CipdPackage) ProtoMessage() {}
func (*TaskTemplate_CipdPackage) Descriptor() ([]byte, []int) {
return fileDescriptor_34aa853d71145463, []int{4, 1}
}
func (m *TaskTemplate_CipdPackage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskTemplate_CipdPackage.Unmarshal(m, b)
}
func (m *TaskTemplate_CipdPackage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_TaskTemplate_CipdPackage.Marshal(b, m, deterministic)
}
func (m *TaskTemplate_CipdPackage) XXX_Merge(src proto.Message) {
xxx_messageInfo_TaskTemplate_CipdPackage.Merge(m, src)
}
func (m *TaskTemplate_CipdPackage) XXX_Size() int {
return xxx_messageInfo_TaskTemplate_CipdPackage.Size(m)
}
func (m *TaskTemplate_CipdPackage) XXX_DiscardUnknown() {
xxx_messageInfo_TaskTemplate_CipdPackage.DiscardUnknown(m)
}
var xxx_messageInfo_TaskTemplate_CipdPackage proto.InternalMessageInfo
func (m *TaskTemplate_CipdPackage) GetPath() string {
if m != nil {
return m.Path
}
return ""
}
func (m *TaskTemplate_CipdPackage) GetPkg() string {
if m != nil {
return m.Pkg
}
return ""
}
func (m *TaskTemplate_CipdPackage) GetVersion() string {
if m != nil {
return m.Version
}
return ""
}
type TaskTemplate_Env struct {
// The envvar you want to set (required).
Var string `protobuf:"bytes,1,opt,name=var,proto3" json:"var,omitempty"`
// The envvar value you want to set. Any prefixes are prepended to this
// value. If the value is unset, prefixes will be prepended to the bot's
// current value of this envvar (see examples)
Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
// Paths relative to the task root to prepend to this envvar on the bot.
// These will be resolved to absolute paths on the bot.
Prefix []string `protobuf:"bytes,3,rep,name=prefix,proto3" json:"prefix,omitempty"`
// If true, tasks setting this EnvVar can overwrite the value and/or the
// prefix. Otherwise, tasks will not be permitted to to set any env var or
// env_prefix for this var.
//
// This should be True for envvars you expect tasks to extend, like $PATH.
// Note that this only affects envvar manipulation at the Swarming API
// level; once the task is running it can (of course) manipulate the env
// however it wants.
Soft bool `protobuf:"varint,4,opt,name=soft,proto3" json:"soft,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *TaskTemplate_Env) Reset() { *m = TaskTemplate_Env{} }
func (m *TaskTemplate_Env) String() string { return proto.CompactTextString(m) }
func (*TaskTemplate_Env) ProtoMessage() {}
func (*TaskTemplate_Env) Descriptor() ([]byte, []int) {
return fileDescriptor_34aa853d71145463, []int{4, 2}
}
func (m *TaskTemplate_Env) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskTemplate_Env.Unmarshal(m, b)
}
func (m *TaskTemplate_Env) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_TaskTemplate_Env.Marshal(b, m, deterministic)
}
func (m *TaskTemplate_Env) XXX_Merge(src proto.Message) {
xxx_messageInfo_TaskTemplate_Env.Merge(m, src)
}
func (m *TaskTemplate_Env) XXX_Size() int {
return xxx_messageInfo_TaskTemplate_Env.Size(m)
}
func (m *TaskTemplate_Env) XXX_DiscardUnknown() {
xxx_messageInfo_TaskTemplate_Env.DiscardUnknown(m)
}
var xxx_messageInfo_TaskTemplate_Env proto.InternalMessageInfo
func (m *TaskTemplate_Env) GetVar() string {
if m != nil {
return m.Var
}
return ""
}
func (m *TaskTemplate_Env) GetValue() string {
if m != nil {
return m.Value
}
return ""
}
func (m *TaskTemplate_Env) GetPrefix() []string {
if m != nil {
return m.Prefix
}
return nil
}
func (m *TaskTemplate_Env) GetSoft() bool {
if m != nil {
return m.Soft
}
return false
}
// This is a tuple of (prod template, canary template, canary_chance), so that it
// can be referenced from multiple pools simultaneously as a single unit.
type TaskTemplateDeployment struct {
// This gives the deployment a name for the 'task_template_deployment' field
// in PoolCfg.
//
// When this TaskTemplateDeployment is inlined into another message (e.g.
// `TaskTemplate.task_template_deployment_inline`), the name field must not be
// specified.
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
// Most Deployments will have a TaskTemplate with just a single include
// directive.
//
// However, pools which substantially differ from other ones could define an
// entire template inline without being forced to put it in the shared
// namespace.
//
// The name field in this template (and the canary template) must not be
// specified.
Prod *TaskTemplate `protobuf:"bytes,2,opt,name=prod,proto3" json:"prod,omitempty"`
// The canary template can be defined like the `prod` field above. If this is
// defined and `canary_chance` is greater than 0, then this template will be
// selected instead of `prod`.
Canary *TaskTemplate `protobuf:"bytes,3,opt,name=canary,proto3" json:"canary,omitempty"`
// range [0, 9999] where each tick corresponds to %0.01 chance of selecting
// the template. Exactly 0 means 'canary is disabled', meaning that tasks
// in this pool will always get the prod template.
//
// Examples:
// * 1 ".01% chance of picking canary"
// * 10 ".1% chance of picking canary"
// * 100 "1% chance of picking canary"
// * 1000 "10% chance of picking canary"
// * 5000 "50% chance of picking canary"
// * 7500 "75% chance of picking canary"
// * 9999 "99.99% chance of picking canary"
CanaryChance int32 `protobuf:"varint,4,opt,name=canary_chance,json=canaryChance,proto3" json:"canary_chance,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *TaskTemplateDeployment) Reset() { *m = TaskTemplateDeployment{} }
func (m *TaskTemplateDeployment) String() string { return proto.CompactTextString(m) }
func (*TaskTemplateDeployment) ProtoMessage() {}
func (*TaskTemplateDeployment) Descriptor() ([]byte, []int) {
return fileDescriptor_34aa853d71145463, []int{5}
}
func (m *TaskTemplateDeployment) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskTemplateDeployment.Unmarshal(m, b)
}
func (m *TaskTemplateDeployment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_TaskTemplateDeployment.Marshal(b, m, deterministic)
}
func (m *TaskTemplateDeployment) XXX_Merge(src proto.Message) {
xxx_messageInfo_TaskTemplateDeployment.Merge(m, src)
}
func (m *TaskTemplateDeployment) XXX_Size() int {
return xxx_messageInfo_TaskTemplateDeployment.Size(m)
}
func (m *TaskTemplateDeployment) XXX_DiscardUnknown() {
xxx_messageInfo_TaskTemplateDeployment.DiscardUnknown(m)
}
var xxx_messageInfo_TaskTemplateDeployment proto.InternalMessageInfo
func (m *TaskTemplateDeployment) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *TaskTemplateDeployment) GetProd() *TaskTemplate {
if m != nil {
return m.Prod
}
return nil
}
func (m *TaskTemplateDeployment) GetCanary() *TaskTemplate {
if m != nil {
return m.Canary
}
return nil
}
func (m *TaskTemplateDeployment) GetCanaryChance() int32 {
if m != nil {
return m.CanaryChance
}
return 0
}
// Defines about how to monitor bots.
type BotMonitoring struct {
// Name is used by Pool to describe how to monitor bots in this pool.
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
// Dimension keys to be used to bucket the bots.
//
// The algorithm for a key with multiple values is:
// def simplify(values):
// values = sorted(values)
// return '|'.join(
// v for i, v in enumerate(values)
// if not any(v.startswith(value) for v in values[i+1:]))
//
// For example, if 'os' is specified and a bot has the values
// ['Linux', 'Ubuntu', 'Ubuntu-16.04'], the bucket value used for this bot
// will be 'Linux|Ubuntu-16.04'.
//
// Then whole algorithm then works for each key:
// def bucket(keys, bot_dimensions):
// return ';'.join(
// '%s:%s' % (key, simplify(bot_dimensions.get(values, []))
// for key in keys)
//
// so the end result may look like: 'os:Linux|Ubuntu-16.04;pool:Testers'.
//
// More precisely, when this is used, the other bot dimensions are ignored.
// 'pool' is always implicit.
DimensionKey []string `protobuf:"bytes,2,rep,name=dimension_key,json=dimensionKey,proto3" json:"dimension_key,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *BotMonitoring) Reset() { *m = BotMonitoring{} }
func (m *BotMonitoring) String() string { return proto.CompactTextString(m) }
func (*BotMonitoring) ProtoMessage() {}
func (*BotMonitoring) Descriptor() ([]byte, []int) {
return fileDescriptor_34aa853d71145463, []int{6}
}
func (m *BotMonitoring) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BotMonitoring.Unmarshal(m, b)
}
func (m *BotMonitoring) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_BotMonitoring.Marshal(b, m, deterministic)
}
func (m *BotMonitoring) XXX_Merge(src proto.Message) {
xxx_messageInfo_BotMonitoring.Merge(m, src)
}
func (m *BotMonitoring) XXX_Size() int {
return xxx_messageInfo_BotMonitoring.Size(m)
}
func (m *BotMonitoring) XXX_DiscardUnknown() {
xxx_messageInfo_BotMonitoring.DiscardUnknown(m)
}
var xxx_messageInfo_BotMonitoring proto.InternalMessageInfo
func (m *BotMonitoring) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *BotMonitoring) GetDimensionKey() []string {
if m != nil {
return m.DimensionKey
}
return nil
}
// Describes an external scheduler used by a particular swarming pool and
// dimension set, via the external scheduler API.
type ExternalSchedulerConfig struct {
// Service address of external scheduler.
Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
// Scheduler id within the external scheduler service to use. This value
// is opaque to swarming.
Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
// Dimensions is a list of dimension strings in "key:value" format (e.g.
// ["os:foo", "featureX:bar"]) that determines eligibility for a bot or task
// to use this external scheduler. In particular:
// - a bot will be eligible if it contains all of these dimensions.
// - a task will be eligible if all its slices contain all these dimensions.
//
// Note of care: if this list is empty, that means all requests in the pool
// are eligible to be forwarded to it.
Dimensions []string `protobuf:"bytes,3,rep,name=dimensions,proto3" json:"dimensions,omitempty"`
// If not enabled, this external scheduler config will be ignored. This
// makes it safer to add new configs (the naive approach of adding a config
// with empty dimentions list would cause all requests to be routed to
// that config).
Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ExternalSchedulerConfig) Reset() { *m = ExternalSchedulerConfig{} }
func (m *ExternalSchedulerConfig) String() string { return proto.CompactTextString(m) }
func (*ExternalSchedulerConfig) ProtoMessage() {}
func (*ExternalSchedulerConfig) Descriptor() ([]byte, []int) {
return fileDescriptor_34aa853d71145463, []int{7}
}
func (m *ExternalSchedulerConfig) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExternalSchedulerConfig.Unmarshal(m, b)
}
func (m *ExternalSchedulerConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ExternalSchedulerConfig.Marshal(b, m, deterministic)
}
func (m *ExternalSchedulerConfig) XXX_Merge(src proto.Message) {
xxx_messageInfo_ExternalSchedulerConfig.Merge(m, src)
}
func (m *ExternalSchedulerConfig) XXX_Size() int {
return xxx_messageInfo_ExternalSchedulerConfig.Size(m)
}
func (m *ExternalSchedulerConfig) XXX_DiscardUnknown() {
xxx_messageInfo_ExternalSchedulerConfig.DiscardUnknown(m)
}
var xxx_messageInfo_ExternalSchedulerConfig proto.InternalMessageInfo
func (m *ExternalSchedulerConfig) GetAddress() string {
if m != nil {
return m.Address
}
return ""
}
func (m *ExternalSchedulerConfig) GetId() string {
if m != nil {
return m.Id
}
return ""
}
func (m *ExternalSchedulerConfig) GetDimensions() []string {
if m != nil {
return m.Dimensions
}
return nil
}
func (m *ExternalSchedulerConfig) GetEnabled() bool {
if m != nil {
return m.Enabled
}
return false
}
type ExternalServices struct {
Isolate *ExternalServices_Isolate `protobuf:"bytes,1,opt,name=isolate,proto3" json:"isolate,omitempty"`
Cipd *ExternalServices_CIPD `protobuf:"bytes,2,opt,name=cipd,proto3" json:"cipd,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ExternalServices) Reset() { *m = ExternalServices{} }
func (m *ExternalServices) String() string { return proto.CompactTextString(m) }
func (*ExternalServices) ProtoMessage() {}
func (*ExternalServices) Descriptor() ([]byte, []int) {
return fileDescriptor_34aa853d71145463, []int{8}
}
func (m *ExternalServices) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExternalServices.Unmarshal(m, b)
}
func (m *ExternalServices) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ExternalServices.Marshal(b, m, deterministic)
}
func (m *ExternalServices) XXX_Merge(src proto.Message) {
xxx_messageInfo_ExternalServices.Merge(m, src)
}
func (m *ExternalServices) XXX_Size() int {
return xxx_messageInfo_ExternalServices.Size(m)
}
func (m *ExternalServices) XXX_DiscardUnknown() {
xxx_messageInfo_ExternalServices.DiscardUnknown(m)
}
var xxx_messageInfo_ExternalServices proto.InternalMessageInfo
func (m *ExternalServices) GetIsolate() *ExternalServices_Isolate {
if m != nil {
return m.Isolate
}
return nil
}
func (m *ExternalServices) GetCipd() *ExternalServices_CIPD {
if m != nil {
return m.Cipd
}
return nil
}
type ExternalServices_Isolate struct {
// (required) URL of the default isolate server to use if it is not
// specified in the task.
//
// Must start with "https://" or "http://".
//
// e.g. "https://isolateserver.appspot.com"
Server string `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"`
// (required) Default namespace to use if it is not specified in a task,
// e.g. "default-gzip"
Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ExternalServices_Isolate) Reset() { *m = ExternalServices_Isolate{} }
func (m *ExternalServices_Isolate) String() string { return proto.CompactTextString(m) }
func (*ExternalServices_Isolate) ProtoMessage() {}
func (*ExternalServices_Isolate) Descriptor() ([]byte, []int) {
return fileDescriptor_34aa853d71145463, []int{8, 0}
}
func (m *ExternalServices_Isolate) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExternalServices_Isolate.Unmarshal(m, b)
}
func (m *ExternalServices_Isolate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ExternalServices_Isolate.Marshal(b, m, deterministic)
}
func (m *ExternalServices_Isolate) XXX_Merge(src proto.Message) {
xxx_messageInfo_ExternalServices_Isolate.Merge(m, src)
}
func (m *ExternalServices_Isolate) XXX_Size() int {
return xxx_messageInfo_ExternalServices_Isolate.Size(m)
}
func (m *ExternalServices_Isolate) XXX_DiscardUnknown() {
xxx_messageInfo_ExternalServices_Isolate.DiscardUnknown(m)
}
var xxx_messageInfo_ExternalServices_Isolate proto.InternalMessageInfo
func (m *ExternalServices_Isolate) GetServer() string {
if m != nil {
return m.Server
}
return ""
}
func (m *ExternalServices_Isolate) GetNamespace() string {
if m != nil {
return m.Namespace
}
return ""
}
type ExternalServices_CIPD struct {
// (required) URL of the default CIPD server to use, if it is not specified
// in the task.
//
// Must start with "https://" or "http://".
//
// e.g. "https://chrome-infra-packages.appspot.com"
Server string `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"`
// (required) The version of the cipd client to use. This is the
// 'infra/tools/cipd/${platform}' package, but because it's part of the
// bootstrap needs special logic to handle its installation.
ClientVersion string `protobuf:"bytes,2,opt,name=client_version,json=clientVersion,proto3" json:"client_version,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ExternalServices_CIPD) Reset() { *m = ExternalServices_CIPD{} }
func (m *ExternalServices_CIPD) String() string { return proto.CompactTextString(m) }
func (*ExternalServices_CIPD) ProtoMessage() {}
func (*ExternalServices_CIPD) Descriptor() ([]byte, []int) {
return fileDescriptor_34aa853d71145463, []int{8, 1}
}
func (m *ExternalServices_CIPD) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExternalServices_CIPD.Unmarshal(m, b)
}
func (m *ExternalServices_CIPD) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ExternalServices_CIPD.Marshal(b, m, deterministic)
}
func (m *ExternalServices_CIPD) XXX_Merge(src proto.Message) {
xxx_messageInfo_ExternalServices_CIPD.Merge(m, src)
}
func (m *ExternalServices_CIPD) XXX_Size() int {
return xxx_messageInfo_ExternalServices_CIPD.Size(m)
}
func (m *ExternalServices_CIPD) XXX_DiscardUnknown() {
xxx_messageInfo_ExternalServices_CIPD.DiscardUnknown(m)
}
var xxx_messageInfo_ExternalServices_CIPD proto.InternalMessageInfo
func (m *ExternalServices_CIPD) GetServer() string {
if m != nil {
return m.Server
}
return ""
}
func (m *ExternalServices_CIPD) GetClientVersion() string {
if m != nil {
return m.ClientVersion
}
return ""
}
func init() {
proto.RegisterType((*PoolsCfg)(nil), "swarming.PoolsCfg")
proto.RegisterType((*Pool)(nil), "swarming.Pool")
proto.RegisterType((*Schedulers)(nil), "swarming.Schedulers")
proto.RegisterType((*TrustedDelegation)(nil), "swarming.TrustedDelegation")
proto.RegisterType((*TrustedDelegation_TagList)(nil), "swarming.TrustedDelegation.TagList")
proto.RegisterType((*TaskTemplate)(nil), "swarming.TaskTemplate")
proto.RegisterType((*TaskTemplate_CacheEntry)(nil), "swarming.TaskTemplate.CacheEntry")
proto.RegisterType((*TaskTemplate_CipdPackage)(nil), "swarming.TaskTemplate.CipdPackage")
proto.RegisterType((*TaskTemplate_Env)(nil), "swarming.TaskTemplate.Env")
proto.RegisterType((*TaskTemplateDeployment)(nil), "swarming.TaskTemplateDeployment")
proto.RegisterType((*BotMonitoring)(nil), "swarming.BotMonitoring")
proto.RegisterType((*ExternalSchedulerConfig)(nil), "swarming.ExternalSchedulerConfig")
proto.RegisterType((*ExternalServices)(nil), "swarming.ExternalServices")
proto.RegisterType((*ExternalServices_Isolate)(nil), "swarming.ExternalServices.Isolate")
proto.RegisterType((*ExternalServices_CIPD)(nil), "swarming.ExternalServices.CIPD")
}
func init() {
proto.RegisterFile("go.chromium.org/luci/swarming/proto/config/pools.proto", fileDescriptor_34aa853d71145463)
}
var fileDescriptor_34aa853d71145463 = []byte{
// 1009 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x56, 0x5f, 0x6f, 0xdb, 0x36,
0x10, 0xaf, 0x6c, 0x25, 0x8e, 0x2f, 0x76, 0x90, 0x72, 0x5d, 0xa2, 0xb9, 0xdd, 0x9a, 0x2a, 0x28,
0x10, 0x0c, 0x83, 0x03, 0x34, 0x5d, 0x07, 0xac, 0xc3, 0x86, 0xfc, 0x31, 0x96, 0x74, 0x2b, 0x16,
0xb0, 0x41, 0x81, 0xf5, 0x45, 0x60, 0x24, 0x5a, 0x21, 0x2c, 0x93, 0x1a, 0x45, 0x39, 0xf5, 0xc3,
0x5e, 0xf6, 0xbe, 0xb7, 0xbd, 0xef, 0x13, 0xec, 0x8b, 0xec, 0x7b, 0xec, 0x7b, 0x0c, 0xa4, 0x28,
0xcb, 0x4d, 0xa4, 0x6c, 0x4f, 0xe6, 0xdd, 0xfd, 0xee, 0x44, 0xfe, 0xee, 0xc7, 0xa3, 0xe1, 0x45,
0x2c, 0x86, 0xe1, 0x95, 0x14, 0x53, 0x96, 0x4f, 0x87, 0x42, 0xc6, 0xfb, 0x49, 0x1e, 0xb2, 0xfd,
0xec, 0x9a, 0xc8, 0x29, 0xe3, 0xf1, 0x7e, 0x2a, 0x85, 0x12, 0xfb, 0xa1, 0xe0, 0x63, 0x16, 0xef,
0xa7, 0x42, 0x24, 0xd9, 0xd0, 0xb8, 0xd0, 0x5a, 0x09, 0xf1, 0xff, 0x69, 0xc1, 0xda, 0xb9, 0x8e,
0x1c, 0x8f, 0x63, 0xe4, 0x83, 0xab, 0x51, 0x9e, 0xb3, 0xd3, 0xde, 0x5b, 0x7f, 0xb6, 0x31, 0x2c,
0x51, 0x43, 0x8d, 0xc0, 0x26, 0x86, 0xde, 0xc2, 0x27, 0x11, 0x1d, 0x93, 0x3c, 0x51, 0x01, 0x7d,
0xaf, 0xa8, 0xe4, 0x24, 0x09, 0x32, 0x2a, 0x67, 0x2c, 0xa4, 0x99, 0xb7, 0xba, 0xe3, 0xec, 0xad,
0x3f, 0x1b, 0x54, 0x89, 0x23, 0x0b, 0x79, 0x63, 0x11, 0x78, 0xdb, 0x26, 0xdf, 0x0c, 0xa0, 0x97,
0xd0, 0x57, 0x24, 0x9b, 0x04, 0x8a, 0x4e, 0xd3, 0x84, 0x28, 0xea, 0xb5, 0xcd, 0x26, 0xb6, 0xaa,
0x5a, 0x17, 0x24, 0x9b, 0x5c, 0xd8, 0x28, 0xee, 0xa9, 0x25, 0x0b, 0xbd, 0x03, 0xef, 0x83, 0xe4,
0x20, 0xa2, 0x69, 0x22, 0xe6, 0x53, 0xca, 0x95, 0xe7, 0x9a, 0x3a, 0x3b, 0xf5, 0x75, 0x4e, 0x16,
0x38, 0xbc, 0xa5, 0x6a, 0xfd, 0xe8, 0x5b, 0xd8, 0xb8, 0x14, 0x2a, 0x98, 0x0a, 0xce, 0x94, 0x90,
0x8c, 0xc7, 0xde, 0x8a, 0xa9, 0xb8, 0x5d, 0x55, 0x3c, 0x12, 0xea, 0xf5, 0x22, 0x8c, 0xfb, 0x97,
0xcb, 0xe6, 0x2b, 0x77, 0xad, 0xb5, 0xd9, 0xf6, 0xff, 0x74, 0xc1, 0xd5, 0x2c, 0x22, 0x04, 0x2e,
0x27, 0x53, 0x6a, 0x38, 0xee, 0x62, 0xb3, 0x46, 0x5b, 0xb0, 0x2a, 0xae, 0x39, 0x95, 0x99, 0xd7,
0x32, 0x5e, 0x6b, 0xa1, 0xe7, 0x00, 0x59, 0x78, 0x45, 0xa3, 0x3c, 0xd1, 0xb1, 0xb6, 0x21, 0xf7,
0x41, 0xf5, 0xd9, 0x37, 0x8b, 0x18, 0x5e, 0xc2, 0xa1, 0x17, 0xb0, 0x4d, 0x92, 0x44, 0x5c, 0xd3,
0xa8, 0x6c, 0x4c, 0x40, 0xc2, 0x50, 0xe4, 0x96, 0x8b, 0x2e, 0xfe, 0xd8, 0x86, 0x2d, 0xf7, 0x87,
0x45, 0x10, 0x1d, 0xc2, 0xa7, 0x0d, 0x79, 0x41, 0x2c, 0x45, 0x9e, 0x9a, 0x73, 0x77, 0xf1, 0xa0,
0x36, 0xfb, 0x7b, 0x8d, 0x40, 0x5f, 0xdf, 0xd1, 0x07, 0xad, 0x8d, 0xee, 0xe9, 0xbd, 0x46, 0x9e,
0x19, 0x3c, 0x6e, 0xca, 0x0d, 0x18, 0x4f, 0x18, 0xa7, 0x5e, 0xc7, 0x30, 0xf0, 0x9f, 0xad, 0x3c,
0xbd, 0x87, 0x1f, 0xd5, 0x7f, 0xe4, 0xcc, 0xd4, 0x41, 0x4f, 0x6f, 0xb5, 0x74, 0x4d, 0x6f, 0xee,
0x46, 0xe7, 0x10, 0x86, 0x8f, 0x2a, 0x89, 0x57, 0x7d, 0xe8, 0x9a, 0xf6, 0x3f, 0xa9, 0x11, 0x79,
0x89, 0x39, 0x36, 0x37, 0x0e, 0x23, 0x7a, 0x33, 0x90, 0x1d, 0x79, 0x60, 0xce, 0xbf, 0x7c, 0x38,
0x5d, 0x7a, 0x4a, 0xfd, 0xdf, 0x1c, 0x80, 0x0a, 0xa8, 0x75, 0x92, 0x67, 0x54, 0x96, 0x3a, 0xd1,
0x6b, 0xf4, 0x00, 0x56, 0x8a, 0x4e, 0x14, 0x32, 0x29, 0x0c, 0xf4, 0x0a, 0x90, 0x92, 0x79, 0xa6,
0x68, 0x14, 0x44, 0x34, 0xa1, 0x31, 0x51, 0x4c, 0x70, 0x7b, 0x7d, 0x1e, 0x2e, 0x71, 0x55, 0x60,
0x4e, 0x16, 0x10, 0x7c, 0x5f, 0xdd, 0x74, 0xf9, 0x7f, 0x38, 0x70, 0xff, 0x16, 0x10, 0x6d, 0x43,
0x27, 0xa5, 0x54, 0x06, 0x2c, 0xf2, 0x1c, 0x43, 0xd4, 0xaa, 0x36, 0xcf, 0x22, 0x74, 0x06, 0x1b,
0x92, 0xfe, 0x92, 0x33, 0x49, 0x03, 0xc2, 0xe7, 0x81, 0x18, 0x7b, 0x2d, 0xd3, 0xa2, 0xdd, 0x3b,
0x3e, 0x3b, 0xbc, 0x20, 0xf1, 0x8f, 0x2c, 0x53, 0xb8, 0x67, 0x53, 0x0f, 0xf9, 0xfc, 0xa7, 0xf1,
0xe0, 0x21, 0x74, 0x6c, 0x00, 0x6d, 0x42, 0x5b, 0x91, 0xd8, 0x9e, 0x5c, 0x2f, 0xfd, 0xbf, 0xdb,
0xd0, 0x5b, 0xee, 0xf5, 0xd2, 0x2d, 0x72, 0x16, 0xb7, 0xc8, 0x83, 0x0e, 0xe3, 0x61, 0x92, 0x47,
0xd4, 0xf2, 0x53, 0x9a, 0xe8, 0x2b, 0x58, 0x09, 0x49, 0x78, 0x55, 0xce, 0x94, 0x27, 0xf5, 0x02,
0x1a, 0x1e, 0x6b, 0xcc, 0x88, 0x2b, 0x39, 0xc7, 0x05, 0x1e, 0x8d, 0xa0, 0x17, 0xb2, 0x34, 0x0a,
0x52, 0x12, 0x4e, 0x48, 0x4c, 0xed, 0x2c, 0xf1, 0x9b, 0xf2, 0x59, 0x1a, 0x9d, 0x17, 0x48, 0xbc,
0x1e, 0x56, 0x06, 0xfa, 0x02, 0xda, 0x94, 0xcf, 0xec, 0xdc, 0x18, 0x34, 0x64, 0x8f, 0xf8, 0x0c,
0x6b, 0xd8, 0xe0, 0x39, 0x40, 0xb5, 0x93, 0xda, 0x93, 0x22, 0x70, 0x53, 0xa2, 0xae, 0x0c, 0xd9,
0x5d, 0x6c, 0xd6, 0x83, 0xd7, 0xb0, 0xbe, 0xf4, 0xfd, 0x05, 0xc4, 0xa9, 0x20, 0x9a, 0xd7, 0x74,
0x12, 0xdb, 0x2c, 0xbd, 0xd4, 0x94, 0xcd, 0xa8, 0xcc, 0x0a, 0xbd, 0x68, 0x6f, 0x69, 0x0e, 0x7e,
0x86, 0xf6, 0x88, 0xcf, 0x74, 0xca, 0x8c, 0x48, 0x5b, 0x45, 0x2f, 0xb5, 0x06, 0x67, 0x24, 0xc9,
0xa9, 0x2d, 0x53, 0x18, 0x7a, 0x82, 0xa5, 0x92, 0x8e, 0xd9, 0x7b, 0x43, 0xb1, 0x16, 0x88, 0xb1,
0xf4, 0x36, 0x32, 0x31, 0xd6, 0x83, 0xc7, 0xd9, 0x5b, 0xc3, 0x66, 0xed, 0xff, 0xe5, 0xc0, 0x56,
0xfd, 0xc5, 0xad, 0x3d, 0xec, 0xe7, 0xe0, 0xa6, 0x52, 0x44, 0x56, 0x59, 0x4d, 0xef, 0x81, 0xc1,
0xa0, 0x21, 0xac, 0x86, 0x84, 0x13, 0x39, 0xb7, 0xc3, 0xb2, 0x09, 0x6d, 0x51, 0x68, 0x17, 0xfa,
0xc5, 0x2a, 0x08, 0xaf, 0x08, 0x0f, 0xa9, 0xd9, 0xe7, 0x0a, 0xee, 0x15, 0xce, 0x63, 0xe3, 0xf3,
0x4f, 0xa1, 0xff, 0xc1, 0x80, 0xaf, 0xdd, 0xe5, 0x2e, 0xf4, 0x23, 0x36, 0xa5, 0x5c, 0x93, 0x17,
0x4c, 0xe8, 0xdc, 0x4a, 0xb0, 0xb7, 0x70, 0xfe, 0x40, 0xe7, 0xfe, 0xaf, 0xb0, 0xdd, 0x30, 0x2b,
0x74, 0x27, 0x48, 0x14, 0x49, 0x9a, 0x65, 0xb6, 0x6c, 0x69, 0xa2, 0x0d, 0x68, 0xb1, 0xc8, 0xb2,
0xdd, 0x62, 0x11, 0xfa, 0x0c, 0x60, 0x51, 0x34, 0xb3, 0x74, 0x2f, 0x79, 0x74, 0x25, 0xca, 0xc9,
0x65, 0x42, 0x23, 0xcb, 0x7a, 0x69, 0xfa, 0xbf, 0xb7, 0x60, 0xf3, 0xd6, 0xbb, 0xfb, 0x0d, 0x74,
0x58, 0x26, 0xcc, 0x8b, 0xeb, 0x18, 0xce, 0xfc, 0xe6, 0xd7, 0x7b, 0x78, 0x56, 0x20, 0x71, 0x99,
0x82, 0x0e, 0xc0, 0xd5, 0x42, 0xb7, 0xcd, 0x79, 0x7c, 0x47, 0xea, 0xf1, 0xd9, 0xf9, 0x09, 0x36,
0xe0, 0xc1, 0x77, 0xd0, 0xb1, 0x85, 0xb4, 0x6e, 0xf4, 0x5b, 0x43, 0x4b, 0x89, 0x59, 0x0b, 0x3d,
0x82, 0xae, 0xa6, 0x35, 0x4b, 0x49, 0x58, 0x2a, 0xad, 0x72, 0x0c, 0x46, 0xe0, 0xea, 0x72, 0x8d,
0xd9, 0x4f, 0x61, 0x23, 0x4c, 0x98, 0x9e, 0xad, 0xa5, 0xba, 0x8b, 0x12, 0xfd, 0xc2, 0xfb, 0xb6,
0x70, 0x1e, 0x7d, 0xf9, 0xee, 0xe0, 0xff, 0xff, 0x7f, 0x7a, 0x59, 0xfc, 0xa4, 0x97, 0x97, 0xab,
0xc6, 0x7d, 0xf0, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x88, 0x60, 0xb7, 0x17, 0x7d, 0x09, 0x00,
0x00,
}