pull/2005/merge
Justin Chadwell 2 years ago committed by GitHub
commit 906dcf5ca8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -6,7 +6,7 @@ ARG XX_VERSION=1.2.1
ARG DOCKER_VERSION=24.0.2
ARG GOTESTSUM_VERSION=v1.9.0
ARG REGISTRY_VERSION=2.8.0
ARG BUILDKIT_VERSION=v0.11.6
ARG BUILDKIT_VERSION=master
# xx is a helper for cross-compilation
FROM --platform=$BUILDPLATFORM tonistiigi/xx:${XX_VERSION} AS xx

@ -9,6 +9,7 @@ import (
"strings"
"github.com/docker/buildx/util/gitutil"
bkgitutil "github.com/moby/buildkit/util/gitutil"
specs "github.com/opencontainers/image-spec/specs-go/v1"
"github.com/pkg/errors"
)
@ -49,7 +50,7 @@ func getGitAttributes(ctx context.Context, contextPath string, dockerfilePath st
wd, _ = filepath.Abs(filepath.Join(cwd, contextPath))
}
gitc, err := gitutil.New(gitutil.WithContext(ctx), gitutil.WithWorkingDir(wd))
gitc, err := gitutil.New(bkgitutil.WithDir(wd))
if err != nil {
if st, err := os.Stat(path.Join(wd, ".git")); err == nil && st.IsDir() {
return res, errors.New("buildx: git was not found in the system. Current commit information was not captured by the build")
@ -57,14 +58,14 @@ func getGitAttributes(ctx context.Context, contextPath string, dockerfilePath st
return
}
if !gitc.IsInsideWorkTree() {
if !gitc.IsInsideWorkTree(ctx) {
if st, err := os.Stat(path.Join(wd, ".git")); err == nil && st.IsDir() {
return res, errors.New("buildx: failed to read current commit information with git rev-parse --is-inside-work-tree")
}
return res, nil
}
if sha, err := gitc.FullCommit(); err != nil && !gitutil.IsUnknownRevision(err) {
if sha, err := gitc.FullCommit(ctx); err != nil && !gitutil.IsUnknownRevision(err) {
return res, errors.Wrapf(err, "buildx: failed to get git commit")
} else if sha != "" {
checkDirty := false
@ -73,7 +74,7 @@ func getGitAttributes(ctx context.Context, contextPath string, dockerfilePath st
checkDirty = v
}
}
if checkDirty && gitc.IsDirty() {
if checkDirty && gitc.IsDirty(ctx) {
sha += "-dirty"
}
if setGitLabels {
@ -84,7 +85,7 @@ func getGitAttributes(ctx context.Context, contextPath string, dockerfilePath st
}
}
if rurl, err := gitc.RemoteURL(); err == nil && rurl != "" {
if rurl, err := gitc.RemoteURL(ctx); err == nil && rurl != "" {
if setGitLabels {
res["label:"+specs.AnnotationSource] = rurl
}
@ -94,7 +95,7 @@ func getGitAttributes(ctx context.Context, contextPath string, dockerfilePath st
}
if setGitLabels {
if root, err := gitc.RootDir(); err != nil {
if root, err := gitc.WorkTree(ctx); err != nil {
return res, errors.Wrapf(err, "buildx: failed to get git root dir")
} else if root != "" {
if dockerfilePath == "" {

@ -129,7 +129,7 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/opencontainers/runc v1.1.7 // indirect
github.com/opencontainers/runc v1.1.9 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_golang v1.14.0 // indirect
github.com/prometheus/client_model v0.3.0 // indirect
@ -179,3 +179,5 @@ require (
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
)
replace github.com/moby/buildkit => github.com/jedevc/buildkit v0.8.2-0.20230816145044-96097aa7c4f0

@ -322,6 +322,8 @@ github.com/in-toto/in-toto-golang v0.5.0 h1:hb8bgwr0M2hGdDsLjkJ3ZqJ8JFLL/tgYdAxF
github.com/in-toto/in-toto-golang v0.5.0/go.mod h1:/Rq0IZHLV7Ku5gielPT4wPHJfH1GdHMCq8+WPxw8/BE=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jedevc/buildkit v0.8.2-0.20230816145044-96097aa7c4f0 h1:3IbPFkidmZrZEiTzRNfsM72feiuc1tZA9OLDUwusL6k=
github.com/jedevc/buildkit v0.8.2-0.20230816145044-96097aa7c4f0/go.mod h1:BIvNtlrvok2xTC734ZNhQVGayvMB1Dz8bFuArWTLnnM=
github.com/jinzhu/gorm v1.9.2 h1:lCvgEaqe/HVE+tjAR2mt4HbbHAZsQOv3XAZiEZV37iw=
github.com/jinzhu/gorm v1.9.2/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo=
github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a h1:eeaG9XMUvRBYXJi4pg1ZKM7nxc5AfXfojeLLW7O5J3k=
@ -372,8 +374,6 @@ github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzC
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/moby/buildkit v0.12.1-0.20230804094609-b49a8873179b h1:LUpEbvxcyM0NuWk54WwNjDVZ5YujyCm1CudzZpqaohE=
github.com/moby/buildkit v0.12.1-0.20230804094609-b49a8873179b/go.mod h1:bs0LeDdh7AQpYXLiPNUt+hzDjRxMg+QeLq1a1r0awFM=
github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg=
github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=
github.com/moby/patternmatcher v0.5.0 h1:YCZgJOeULcxLw1Q+sVR636pmS7sPEn1Qo2iAN6M7DBo=
@ -407,8 +407,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.1.0-rc3 h1:fzg1mXZFj8YdPeNkRXMg+zb88BFV0Ys52cJydRwBkb8=
github.com/opencontainers/image-spec v1.1.0-rc3/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8=
github.com/opencontainers/runc v1.1.7 h1:y2EZDS8sNng4Ksf0GUYNhKbTShZJPJg1FiXJNH/uoCk=
github.com/opencontainers/runc v1.1.7/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50=
github.com/opencontainers/runc v1.1.9 h1:XR0VIHTGce5eWPkaPesqTBrhW2yAcaraWfsEalNwQLM=
github.com/opencontainers/runc v1.1.9/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50=
github.com/opencontainers/runtime-spec v1.1.0-rc.2 h1:ucBtEms2tamYYW/SvGpvq9yUN0NEVL6oyLEwDcTSrk8=
github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU=
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=

@ -6,6 +6,7 @@ import (
"github.com/containerd/continuity/fs/fstest"
"github.com/docker/buildx/util/gitutil"
bkgitutil "github.com/moby/buildkit/util/gitutil"
"github.com/moby/buildkit/util/testutil/integration"
"github.com/stretchr/testify/require"
)
@ -66,7 +67,7 @@ EOT
)
dirDest := t.TempDir()
git, err := gitutil.New(gitutil.WithWorkingDir(dir))
git, err := gitutil.New(bkgitutil.WithDir(dir))
require.NoError(t, err)
gitutil.GitInit(git, t)
@ -100,7 +101,7 @@ EOT
)
dirDest := t.TempDir()
git, err := gitutil.New(gitutil.WithWorkingDir(dirSpec))
git, err := gitutil.New(bkgitutil.WithDir(dirSpec))
require.NoError(t, err)
gitutil.GitInit(git, t)
@ -134,14 +135,14 @@ EOT
)
dirDest := t.TempDir()
gitSpec, err := gitutil.New(gitutil.WithWorkingDir(dirSpec))
gitSpec, err := gitutil.New(bkgitutil.WithDir(dirSpec))
require.NoError(t, err)
gitutil.GitInit(gitSpec, t)
gitutil.GitAdd(gitSpec, t, "docker-bake.hcl")
gitutil.GitCommit(gitSpec, t, "initial commit")
addrSpec := gitutil.GitServeHTTP(gitSpec, t)
gitSrc, err := gitutil.New(gitutil.WithWorkingDir(dirSrc))
gitSrc, err := gitutil.New(bkgitutil.WithDir(dirSrc))
require.NoError(t, err)
gitutil.GitInit(gitSrc, t)
gitutil.GitAdd(gitSrc, t, "foo")
@ -175,7 +176,7 @@ COPY super-cool.txt /
)
dirDest := t.TempDir()
git, err := gitutil.New(gitutil.WithWorkingDir(dir))
git, err := gitutil.New(bkgitutil.WithDir(dir))
require.NoError(t, err)
gitutil.GitInit(git, t)
gitutil.GitAdd(git, t, "docker-bake.hcl", "bar")
@ -215,7 +216,7 @@ EOT
)
dirDest := t.TempDir()
git, err := gitutil.New(gitutil.WithWorkingDir(dirSpec))
git, err := gitutil.New(bkgitutil.WithDir(dirSpec))
require.NoError(t, err)
gitutil.GitInit(git, t)
@ -262,7 +263,7 @@ EOT
)
dirDest := t.TempDir()
git, err := gitutil.New(gitutil.WithWorkingDir(dirSpec))
git, err := gitutil.New(bkgitutil.WithDir(dirSpec))
require.NoError(t, err)
gitutil.GitInit(git, t)

@ -1,111 +1,73 @@
package gitutil
import (
"bytes"
"context"
"net/url"
"os"
"os/exec"
"path/filepath"
"strings"
bkgitutil "github.com/moby/buildkit/util/gitutil"
"github.com/pkg/errors"
)
// Git represents an active git object
type Git struct {
ctx context.Context
wd string
gitpath string
}
// Option provides a variadic option for configuring the git client.
type Option func(b *Git)
// WithContext sets context.
func WithContext(ctx context.Context) Option {
return func(b *Git) {
b.ctx = ctx
}
}
// WithWorkingDir sets working directory.
func WithWorkingDir(wd string) Option {
return func(b *Git) {
b.wd = wd
}
// GitCLI represents an active git object
type GitCLI struct {
bkgitutil.GitCLI
}
// New initializes a new git client
func New(opts ...Option) (*Git, error) {
var err error
c := &Git{
ctx: context.Background(),
}
for _, opt := range opts {
opt(c)
func New(opts ...bkgitutil.Option) (*GitCLI, error) {
cli, err := bkgitutil.NewGitCLI(opts...)
if err != nil {
return nil, err
}
c.gitpath, err = gitPath(c.wd)
gitpath, err := gitPath(cli.Dir())
if err != nil {
return nil, errors.New("git not found in PATH")
}
return c, nil
cli = cli.New(bkgitutil.WithGitBinary(gitpath))
return &GitCLI{*cli}, nil
}
func (c *Git) IsInsideWorkTree() bool {
out, err := c.clean(c.run("rev-parse", "--is-inside-work-tree"))
func (cli *GitCLI) IsInsideWorkTree(ctx context.Context) bool {
out, err := cli.clean(cli.Run(ctx, "rev-parse", "--is-inside-work-tree"))
return out == "true" && err == nil
}
func (c *Git) IsDirty() bool {
out, err := c.run("status", "--porcelain", "--ignored")
return strings.TrimSpace(out) != "" || err != nil
}
func (c *Git) RootDir() (string, error) {
return c.clean(c.run("rev-parse", "--show-toplevel"))
func (cli *GitCLI) IsDirty(ctx context.Context) bool {
out, err := cli.Run(ctx, "status", "--porcelain", "--ignored")
return strings.TrimSpace(string(out)) != "" || err != nil
}
func (c *Git) GitDir() (string, error) {
dir, err := c.RootDir()
if err != nil {
return "", err
}
return filepath.Join(dir, ".git"), nil
}
func (c *Git) RemoteURL() (string, error) {
func (cli *GitCLI) RemoteURL(ctx context.Context) (string, error) {
// Try to get the remote URL from the origin remote first
if ru, err := c.clean(c.run("remote", "get-url", "origin")); err == nil && ru != "" {
if ru, err := cli.clean(cli.Run(ctx, "remote", "get-url", "origin")); err == nil && ru != "" {
return stripCredentials(ru), nil
}
// If that fails, try to get the remote URL from the upstream remote
if ru, err := c.clean(c.run("remote", "get-url", "upstream")); err == nil && ru != "" {
if ru, err := cli.clean(cli.Run(ctx, "remote", "get-url", "upstream")); err == nil && ru != "" {
return stripCredentials(ru), nil
}
return "", errors.New("no remote URL found for either origin or upstream")
}
func (c *Git) FullCommit() (string, error) {
return c.clean(c.run("show", "--format=%H", "HEAD", "--quiet", "--"))
func (cli *GitCLI) FullCommit(ctx context.Context) (string, error) {
return cli.clean(cli.Run(ctx, "show", "--format=%H", "HEAD", "--quiet", "--"))
}
func (c *Git) ShortCommit() (string, error) {
return c.clean(c.run("show", "--format=%h", "HEAD", "--quiet", "--"))
func (cli *GitCLI) ShortCommit(ctx context.Context) (string, error) {
return cli.clean(cli.Run(ctx, "show", "--format=%h", "HEAD", "--quiet", "--"))
}
func (c *Git) Tag() (string, error) {
func (cli *GitCLI) Tag(ctx context.Context) (string, error) {
var tag string
var err error
for _, fn := range []func() (string, error){
func() (string, error) {
return c.clean(c.run("tag", "--points-at", "HEAD", "--sort", "-version:creatordate"))
return cli.clean(cli.Run(ctx, "tag", "--points-at", "HEAD", "--sort", "-version:creatordate"))
},
func() (string, error) {
return c.clean(c.run("describe", "--tags", "--abbrev=0"))
return cli.clean(cli.Run(ctx, "describe", "--tags", "--abbrev=0"))
},
} {
tag, err = fn()
@ -116,32 +78,8 @@ func (c *Git) Tag() (string, error) {
return tag, err
}
func (c *Git) run(args ...string) (string, error) {
var extraArgs = []string{
"-c", "log.showSignature=false",
}
args = append(extraArgs, args...)
cmd := exec.CommandContext(c.ctx, c.gitpath, args...)
if c.wd != "" {
cmd.Dir = c.wd
}
// Override the locale to ensure consistent output
cmd.Env = append(os.Environ(), "LC_ALL=C")
stdout := bytes.Buffer{}
stderr := bytes.Buffer{}
cmd.Stdout = &stdout
cmd.Stderr = &stderr
if err := cmd.Run(); err != nil {
return "", errors.New(stderr.String())
}
return stdout.String(), nil
}
func (c *Git) clean(out string, err error) (string, error) {
func (cli *GitCLI) clean(dt []byte, err error) (string, error) {
out := string(dt)
out = strings.ReplaceAll(strings.Split(out, "\n")[0], "'", "")
if err != nil {
err = errors.New(strings.TrimSuffix(err.Error(), "\n"))

@ -1,26 +1,29 @@
package gitutil
import (
"context"
"testing"
"github.com/stretchr/testify/require"
)
func TestGit(t *testing.T) {
ctx := context.TODO()
c, err := New()
require.NoError(t, err)
out, err := c.run("status")
out, err := c.Run(ctx, "status")
require.NoError(t, err)
require.NotEmpty(t, out)
out, err = c.clean(c.run("not-exist"))
out2, err := c.clean(c.Run(ctx, "not-exist"))
require.Error(t, err)
require.Empty(t, out)
require.Equal(t, "git: 'not-exist' is not a git command. See 'git --help'.", err.Error())
require.Empty(t, out2)
require.Contains(t, err.Error(), "git: 'not-exist' is not a git command. See 'git --help'.")
}
func TestGitFullCommit(t *testing.T) {
ctx := context.TODO()
Mktmp(t)
c, err := New()
require.NoError(t, err)
@ -28,12 +31,13 @@ func TestGitFullCommit(t *testing.T) {
GitInit(c, t)
GitCommit(c, t, "bar")
out, err := c.FullCommit()
out, err := c.FullCommit(ctx)
require.NoError(t, err)
require.Equal(t, 40, len(out))
}
func TestGitShortCommit(t *testing.T) {
ctx := context.TODO()
Mktmp(t)
c, err := New()
require.NoError(t, err)
@ -41,38 +45,41 @@ func TestGitShortCommit(t *testing.T) {
GitInit(c, t)
GitCommit(c, t, "bar")
out, err := c.ShortCommit()
out, err := c.ShortCommit(ctx)
require.NoError(t, err)
require.Equal(t, 7, len(out))
}
func TestGitFullCommitErr(t *testing.T) {
ctx := context.TODO()
Mktmp(t)
c, err := New()
require.NoError(t, err)
GitInit(c, t)
_, err = c.FullCommit()
_, err = c.FullCommit(ctx)
require.Error(t, err)
require.True(t, IsUnknownRevision(err))
require.False(t, IsAmbiguousArgument(err))
}
func TestGitShortCommitErr(t *testing.T) {
ctx := context.TODO()
Mktmp(t)
c, err := New()
require.NoError(t, err)
GitInit(c, t)
_, err = c.ShortCommit()
_, err = c.ShortCommit(ctx)
require.Error(t, err)
require.True(t, IsUnknownRevision(err))
require.False(t, IsAmbiguousArgument(err))
}
func TestGitTagsPointsAt(t *testing.T) {
ctx := context.TODO()
Mktmp(t)
c, err := New()
require.NoError(t, err)
@ -83,12 +90,13 @@ func TestGitTagsPointsAt(t *testing.T) {
GitCommit(c, t, "foo")
GitTag(c, t, "v0.9.0")
out, err := c.clean(c.run("tag", "--points-at", "HEAD", "--sort", "-version:creatordate"))
out, err := c.clean(c.Run(ctx, "tag", "--points-at", "HEAD", "--sort", "-version:creatordate"))
require.NoError(t, err)
require.Equal(t, "v0.9.0", out)
}
func TestGitDescribeTags(t *testing.T) {
ctx := context.TODO()
Mktmp(t)
c, err := New()
require.NoError(t, err)
@ -99,12 +107,14 @@ func TestGitDescribeTags(t *testing.T) {
GitCommit(c, t, "foo")
GitTag(c, t, "v0.9.0")
out, err := c.clean(c.run("describe", "--tags", "--abbrev=0"))
out, err := c.clean(c.Run(ctx, "describe", "--tags", "--abbrev=0"))
require.NoError(t, err)
require.Equal(t, "v0.9.0", out)
}
func TestGitRemoteURL(t *testing.T) {
ctx := context.TODO()
type remote struct {
name string
url string
@ -179,7 +189,7 @@ func TestGitRemoteURL(t *testing.T) {
GitSetRemote(c, t, r.name, r.url)
}
ru, err := c.RemoteURL()
ru, err := c.RemoteURL(ctx)
if tt.fail {
require.Error(t, err)
return

@ -1,6 +1,7 @@
package gitutil
import (
"context"
"os"
"strings"
"testing"
@ -8,7 +9,7 @@ import (
"github.com/stretchr/testify/require"
)
func GitInit(c *Git, tb testing.TB) {
func GitInit(c *GitCLI, tb testing.TB) {
tb.Helper()
out, err := fakeGit(c, "init")
require.NoError(tb, err)
@ -18,35 +19,35 @@ func GitInit(c *Git, tb testing.TB) {
_, _ = fakeGit(c, "branch", "-D", "master")
}
func GitCommit(c *Git, tb testing.TB, msg string) {
func GitCommit(c *GitCLI, tb testing.TB, msg string) {
tb.Helper()
out, err := fakeGit(c, "commit", "--allow-empty", "-m", msg)
require.NoError(tb, err)
require.Contains(tb, out, "main", msg)
}
func GitTag(c *Git, tb testing.TB, tag string) {
func GitTag(c *GitCLI, tb testing.TB, tag string) {
tb.Helper()
out, err := fakeGit(c, "tag", tag)
require.NoError(tb, err)
require.Empty(tb, out)
}
func GitCheckoutBranch(c *Git, tb testing.TB, name string) {
func GitCheckoutBranch(c *GitCLI, tb testing.TB, name string) {
tb.Helper()
out, err := fakeGit(c, "checkout", "-b", name)
require.NoError(tb, err)
require.Empty(tb, out)
}
func GitAdd(c *Git, tb testing.TB, files ...string) {
func GitAdd(c *GitCLI, tb testing.TB, files ...string) {
tb.Helper()
args := append([]string{"add"}, files...)
_, err := fakeGit(c, args...)
require.NoError(tb, err)
}
func GitSetRemote(c *Git, tb testing.TB, name string, url string) {
func GitSetRemote(c *GitCLI, tb testing.TB, name string, url string) {
tb.Helper()
_, err := fakeGit(c, "remote", "add", name, url)
require.NoError(tb, err)
@ -64,7 +65,7 @@ func Mktmp(tb testing.TB) string {
return folder
}
func fakeGit(c *Git, args ...string) (string, error) {
func fakeGit(c *GitCLI, args ...string) (string, error) {
allArgs := []string{
"-c", "user.name=buildx",
"-c", "user.email=buildx@docker.com",
@ -73,7 +74,7 @@ func fakeGit(c *Git, args ...string) (string, error) {
"-c", "log.showSignature=false",
}
allArgs = append(allArgs, args...)
return c.clean(c.run(allArgs...))
return c.clean(c.Run(context.TODO(), allArgs...))
}
func IsAmbiguousArgument(err error) bool {

@ -10,7 +10,7 @@ import (
"github.com/stretchr/testify/require"
)
func GitServeHTTP(c *Git, t testing.TB) (url string) {
func GitServeHTTP(c *GitCLI, t testing.TB) (url string) {
t.Helper()
gitUpdateServerInfo(c, t)
ctx, cancel := context.WithCancel(context.TODO())
@ -19,7 +19,7 @@ func GitServeHTTP(c *Git, t testing.TB) (url string) {
done := make(chan struct{})
name := "test.git"
dir, err := c.GitDir()
dir, err := c.GitDir(context.TODO())
if err != nil {
cancel()
}
@ -55,7 +55,7 @@ func GitServeHTTP(c *Git, t testing.TB) (url string) {
return fmt.Sprintf("http://%s/%s", addr, name)
}
func gitUpdateServerInfo(c *Git, tb testing.TB) {
func gitUpdateServerInfo(c *GitCLI, tb testing.TB) {
tb.Helper()
_, err := fakeGit(c, "update-server-info")
require.NoError(tb, err)

@ -1986,7 +1986,7 @@ func init() {
func init() { proto.RegisterFile("control.proto", fileDescriptor_0c5120591600887d) }
var fileDescriptor_0c5120591600887d = []byte{
// 2261 bytes of a gzipped FileDescriptorProto
// 2260 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0xcd, 0x6e, 0x1b, 0xc9,
0x11, 0xde, 0x21, 0x25, 0xfe, 0x14, 0x29, 0x59, 0x6a, 0x7b, 0x8d, 0xc9, 0xc4, 0x2b, 0xc9, 0xb3,
0x76, 0x22, 0x38, 0xf6, 0x50, 0xcb, 0xac, 0x63, 0xaf, 0x9c, 0x38, 0x16, 0x45, 0x66, 0x2d, 0xc7,
@ -1995,140 +1995,140 @@ var fileDescriptor_0c5120591600887d = []byte{
0x13, 0x04, 0xf0, 0x31, 0xe7, 0x3d, 0x38, 0x81, 0x1f, 0x20, 0xc8, 0x31, 0xb9, 0x05, 0xfd, 0x33,
0xe4, 0x90, 0x33, 0x94, 0x28, 0xdb, 0x27, 0x76, 0x75, 0xd7, 0x57, 0x53, 0x55, 0x5d, 0x5d, 0x5d,
0xd5, 0x84, 0x85, 0x76, 0x18, 0x70, 0x1a, 0xfa, 0x4e, 0x44, 0x43, 0x1e, 0xa2, 0xa5, 0x5e, 0x78,
0x38, 0x70, 0x0e, 0xfb, 0x9e, 0xdf, 0x39, 0xf6, 0xb8, 0x73, 0xf2, 0x89, 0x75, 0xab, 0xeb, 0xf1,
0x17, 0xfd, 0x43, 0xa7, 0x1d, 0xf6, 0x6a, 0xdd, 0xb0, 0x1b, 0xd6, 0x24, 0xe3, 0x61, 0xff, 0x48,
0x52, 0x92, 0x90, 0x23, 0x25, 0xc0, 0x5a, 0xed, 0x86, 0x61, 0xd7, 0x27, 0x23, 0x2e, 0xee, 0xf5,
0x08, 0xe3, 0x6e, 0x2f, 0xd2, 0x0c, 0x37, 0x13, 0xf2, 0xc4, 0xc7, 0x6a, 0xf1, 0xc7, 0x6a, 0x2c,
0xf4, 0x4f, 0x08, 0xad, 0x45, 0x87, 0xb5, 0x30, 0x62, 0x9a, 0xbb, 0x36, 0x95, 0xdb, 0x8d, 0xbc,
0x1a, 0x1f, 0x44, 0x84, 0xd5, 0xbe, 0x0e, 0xe9, 0x31, 0xa1, 0x1a, 0x50, 0x9f, 0x54, 0x57, 0xe9,
0xe3, 0x46, 0x1e, 0xd3, 0xc3, 0x1a, 0x8d, 0xda, 0x35, 0xc6, 0x5d, 0xde, 0x8f, 0x3f, 0x72, 0xfb,
0x14, 0x95, 0xfa, 0xb4, 0x4d, 0xa2, 0xd0, 0xf7, 0xda, 0x03, 0xa1, 0x98, 0x1a, 0x29, 0x98, 0xfd,
0x5b, 0x03, 0xaa, 0x7b, 0xb4, 0x1f, 0x10, 0x4c, 0x7e, 0xd3, 0x27, 0x8c, 0xa3, 0xcb, 0x50, 0x38,
0xf2, 0x7c, 0x4e, 0xa8, 0x69, 0xac, 0xe5, 0xd7, 0xcb, 0x58, 0x53, 0x68, 0x09, 0xf2, 0xae, 0xef,
0x9b, 0xb9, 0x35, 0x63, 0xbd, 0x84, 0xc5, 0x10, 0xad, 0x43, 0xf5, 0x98, 0x90, 0xa8, 0xd9, 0xa7,
0x2e, 0xf7, 0xc2, 0xc0, 0xcc, 0xaf, 0x19, 0xeb, 0xf9, 0xc6, 0xdc, 0xab, 0xd7, 0xab, 0x06, 0x1e,
0x5b, 0x41, 0x36, 0x94, 0x05, 0xdd, 0x18, 0x70, 0xc2, 0xcc, 0xb9, 0x04, 0xdb, 0x68, 0xda, 0xbe,
0x01, 0x4b, 0x4d, 0x8f, 0x1d, 0x3f, 0x65, 0x6e, 0xf7, 0x2c, 0x5d, 0xec, 0x47, 0xb0, 0x9c, 0xe0,
0x65, 0x51, 0x18, 0x30, 0x82, 0x6e, 0x43, 0x81, 0x92, 0x76, 0x48, 0x3b, 0x92, 0xb9, 0x52, 0xff,
0xc8, 0x99, 0x0c, 0x03, 0x47, 0x03, 0x04, 0x13, 0xd6, 0xcc, 0xf6, 0x9f, 0xf2, 0x50, 0x49, 0xcc,
0xa3, 0x45, 0xc8, 0xed, 0x34, 0x4d, 0x63, 0xcd, 0x58, 0x2f, 0xe3, 0xdc, 0x4e, 0x13, 0x99, 0x50,
0xdc, 0xed, 0x73, 0xf7, 0xd0, 0x27, 0xda, 0xf6, 0x98, 0x44, 0x97, 0x60, 0x7e, 0x27, 0x78, 0xca,
0x88, 0x34, 0xbc, 0x84, 0x15, 0x81, 0x10, 0xcc, 0xed, 0x7b, 0xdf, 0x10, 0x65, 0x26, 0x96, 0x63,
0x64, 0x41, 0x61, 0xcf, 0xa5, 0x24, 0xe0, 0xe6, 0xbc, 0x90, 0xdb, 0xc8, 0x99, 0x06, 0xd6, 0x33,
0xa8, 0x01, 0xe5, 0x6d, 0x4a, 0x5c, 0x4e, 0x3a, 0x5b, 0xdc, 0x2c, 0xac, 0x19, 0xeb, 0x95, 0xba,
0xe5, 0xa8, 0x4d, 0x76, 0xe2, 0xf8, 0x73, 0x0e, 0xe2, 0xf8, 0x6b, 0x94, 0x5e, 0xbd, 0x5e, 0xfd,
0xe0, 0x0f, 0xff, 0x14, 0xbe, 0x1b, 0xc2, 0xd0, 0x03, 0x80, 0xc7, 0x2e, 0xe3, 0x4f, 0x99, 0x14,
0x52, 0x3c, 0x53, 0xc8, 0x9c, 0x14, 0x90, 0xc0, 0xa0, 0x15, 0x00, 0xe9, 0x84, 0xed, 0xb0, 0x1f,
0x70, 0xb3, 0x24, 0x75, 0x4f, 0xcc, 0xa0, 0x35, 0xa8, 0x34, 0x09, 0x6b, 0x53, 0x2f, 0x92, 0x5b,
0x5d, 0x96, 0xee, 0x49, 0x4e, 0x09, 0x09, 0xca, 0x83, 0x07, 0x83, 0x88, 0x98, 0x20, 0x19, 0x12,
0x33, 0x62, 0x2f, 0xf7, 0x5f, 0xb8, 0x94, 0x74, 0xcc, 0x8a, 0x74, 0x97, 0xa6, 0x84, 0x7f, 0x95,
0x27, 0x98, 0x59, 0x95, 0x9b, 0x1c, 0x93, 0xf6, 0xef, 0x8a, 0x50, 0xdd, 0x17, 0xc7, 0x29, 0x0e,
0x87, 0x25, 0xc8, 0x63, 0x72, 0xa4, 0xf7, 0x46, 0x0c, 0x91, 0x03, 0xd0, 0x24, 0x47, 0x5e, 0xe0,
0x49, 0xad, 0x72, 0xd2, 0xf0, 0x45, 0x27, 0x3a, 0x74, 0x46, 0xb3, 0x38, 0xc1, 0x81, 0x2c, 0x28,
0xb5, 0x5e, 0x46, 0x21, 0x15, 0x21, 0x95, 0x97, 0x62, 0x86, 0x34, 0x7a, 0x06, 0x0b, 0xf1, 0x78,
0x8b, 0x73, 0x2a, 0x02, 0x55, 0x84, 0xd1, 0x27, 0xe9, 0x30, 0x4a, 0x2a, 0xe5, 0x8c, 0x61, 0x5a,
0x01, 0xa7, 0x03, 0x3c, 0x2e, 0x47, 0x58, 0xb8, 0x4f, 0x18, 0x13, 0x1a, 0xca, 0xed, 0xc7, 0x31,
0x29, 0xd4, 0xf9, 0x05, 0x0d, 0x03, 0x4e, 0x82, 0x8e, 0xdc, 0xfa, 0x32, 0x1e, 0xd2, 0x42, 0x9d,
0x78, 0xac, 0xd4, 0x29, 0xce, 0xa4, 0xce, 0x18, 0x46, 0xab, 0x33, 0x36, 0x87, 0x36, 0x61, 0x7e,
0xdb, 0x6d, 0xbf, 0x20, 0x72, 0x97, 0x2b, 0xf5, 0x95, 0xb4, 0x40, 0xb9, 0xfc, 0x44, 0x6e, 0x2b,
0x93, 0x07, 0xf5, 0x03, 0xac, 0x20, 0xe8, 0x57, 0x50, 0x6d, 0x05, 0xdc, 0xe3, 0x3e, 0xe9, 0xc9,
0x1d, 0x2b, 0x8b, 0x1d, 0x6b, 0x6c, 0x7e, 0xf7, 0x7a, 0xf5, 0x27, 0x53, 0xd3, 0x4f, 0x9f, 0x7b,
0x7e, 0x8d, 0x24, 0x50, 0x4e, 0x42, 0x04, 0x1e, 0x93, 0x87, 0xbe, 0x82, 0xc5, 0x58, 0xd9, 0x9d,
0x20, 0xea, 0x73, 0x66, 0x82, 0xb4, 0xba, 0x3e, 0xa3, 0xd5, 0x0a, 0xa4, 0xcc, 0x9e, 0x90, 0x24,
0x9c, 0xbd, 0x13, 0x70, 0x42, 0x03, 0xd7, 0xd7, 0x21, 0x38, 0xa4, 0xd1, 0x8e, 0x88, 0x34, 0x91,
0x25, 0xf7, 0x64, 0x6e, 0x34, 0xab, 0xd2, 0x35, 0xd7, 0xd3, 0x5f, 0x4d, 0xe6, 0x52, 0x47, 0x31,
0xe3, 0x31, 0xa8, 0xf5, 0x00, 0x50, 0x3a, 0x24, 0x44, 0xe8, 0x1e, 0x93, 0x41, 0x1c, 0xba, 0xc7,
0x64, 0x20, 0xb2, 0xc7, 0x89, 0xeb, 0xf7, 0x55, 0x56, 0x29, 0x63, 0x45, 0x6c, 0xe6, 0xee, 0x1a,
0x42, 0x42, 0x7a, 0x17, 0xcf, 0x25, 0xe1, 0x0b, 0xb8, 0x98, 0xe1, 0x91, 0x0c, 0x11, 0xd7, 0x92,
0x22, 0xd2, 0x47, 0x67, 0x24, 0xd2, 0xfe, 0x6b, 0x1e, 0xaa, 0xc9, 0xb8, 0x40, 0x1b, 0x70, 0x51,
0xd9, 0x89, 0xc9, 0x51, 0x93, 0x44, 0x94, 0xb4, 0x45, 0x32, 0xd2, 0xc2, 0xb3, 0x96, 0x50, 0x1d,
0x2e, 0xed, 0xf4, 0xf4, 0x34, 0x4b, 0x40, 0x72, 0xf2, 0xd8, 0x67, 0xae, 0xa1, 0x10, 0x3e, 0x54,
0xa2, 0xa4, 0x27, 0x12, 0xa0, 0xbc, 0x8c, 0x8b, 0xcf, 0x4e, 0x0f, 0x5e, 0x27, 0x13, 0xab, 0xc2,
0x23, 0x5b, 0x2e, 0xfa, 0x19, 0x14, 0xd5, 0x42, 0x7c, 0xfe, 0x3f, 0x3e, 0xfd, 0x13, 0x4a, 0x58,
0x8c, 0x11, 0x70, 0x65, 0x07, 0x33, 0xe7, 0xcf, 0x01, 0xd7, 0x18, 0xeb, 0x21, 0x58, 0xd3, 0x55,
0x3e, 0x4f, 0x08, 0xd8, 0x7f, 0x31, 0x60, 0x39, 0xf5, 0x21, 0x71, 0x39, 0xc9, 0xf4, 0xac, 0x44,
0xc8, 0x31, 0x6a, 0xc2, 0xbc, 0x4a, 0x30, 0x39, 0xa9, 0xb0, 0x33, 0x83, 0xc2, 0x4e, 0x22, 0xbb,
0x28, 0xb0, 0x75, 0x17, 0xe0, 0xed, 0x82, 0xd5, 0xfe, 0x9b, 0x01, 0x0b, 0xfa, 0x30, 0xeb, 0x9b,
0xdc, 0x85, 0xa5, 0xf8, 0x08, 0xc5, 0x73, 0xfa, 0x4e, 0xbf, 0x3d, 0x35, 0x0f, 0x28, 0x36, 0x67,
0x12, 0xa7, 0x74, 0x4c, 0x89, 0xb3, 0xb6, 0xe3, 0xb8, 0x9a, 0x60, 0x3d, 0x97, 0xe6, 0x57, 0x61,
0x61, 0x5f, 0x96, 0x60, 0x53, 0x2f, 0x28, 0xfb, 0x3f, 0x06, 0x2c, 0xc6, 0x3c, 0xda, 0xba, 0x4f,
0xa1, 0x74, 0x42, 0x28, 0x27, 0x2f, 0x09, 0xd3, 0x56, 0x99, 0x69, 0xab, 0xbe, 0x94, 0x1c, 0x78,
0xc8, 0x89, 0x36, 0xa1, 0xa4, 0xca, 0x3d, 0x12, 0x6f, 0xd4, 0xca, 0x34, 0x94, 0xfe, 0xde, 0x90,
0x1f, 0xd5, 0x60, 0xce, 0x0f, 0xbb, 0x4c, 0x9f, 0x99, 0xef, 0x4f, 0xc3, 0x3d, 0x0e, 0xbb, 0x58,
0x32, 0xa2, 0x7b, 0x50, 0xfa, 0xda, 0xa5, 0x81, 0x17, 0x74, 0xe3, 0x53, 0xb0, 0x3a, 0x0d, 0xf4,
0x4c, 0xf1, 0xe1, 0x21, 0x40, 0x14, 0x54, 0x05, 0xb5, 0x86, 0x1e, 0x41, 0xa1, 0xe3, 0x75, 0x09,
0xe3, 0xca, 0x25, 0x8d, 0xba, 0xb8, 0x4b, 0xbe, 0x7b, 0xbd, 0x7a, 0x23, 0x71, 0x59, 0x84, 0x11,
0x09, 0x44, 0xf9, 0xee, 0x7a, 0x01, 0xa1, 0xa2, 0xbc, 0xbd, 0xa5, 0x20, 0x4e, 0x53, 0xfe, 0x60,
0x2d, 0x41, 0xc8, 0xf2, 0xd4, 0x95, 0x20, 0xf3, 0xc5, 0xdb, 0xc9, 0x52, 0x12, 0xc4, 0x31, 0x08,
0xdc, 0x1e, 0xd1, 0x25, 0x80, 0x1c, 0x8b, 0xfa, 0xa4, 0x2d, 0xe2, 0xbc, 0x23, 0x2b, 0xb7, 0x12,
0xd6, 0x14, 0xda, 0x84, 0x22, 0xe3, 0x2e, 0x15, 0x39, 0x67, 0x7e, 0xc6, 0xc2, 0x2a, 0x06, 0xa0,
0xfb, 0x50, 0x6e, 0x87, 0xbd, 0xc8, 0x27, 0x02, 0x5d, 0x98, 0x11, 0x3d, 0x82, 0x88, 0xd0, 0x23,
0x94, 0x86, 0x54, 0x96, 0x74, 0x65, 0xac, 0x08, 0x74, 0x07, 0x16, 0x22, 0x1a, 0x76, 0x29, 0x61,
0xec, 0x73, 0x1a, 0xf6, 0x23, 0x7d, 0x91, 0x2f, 0x8b, 0xe4, 0xbd, 0x97, 0x5c, 0xc0, 0xe3, 0x7c,
0xf6, 0xbf, 0x73, 0x50, 0x4d, 0x86, 0x48, 0xaa, 0xd6, 0x7d, 0x04, 0x05, 0x15, 0x70, 0x2a, 0xd6,
0xdf, 0xce, 0xc7, 0x4a, 0x42, 0xa6, 0x8f, 0x4d, 0x28, 0xb6, 0xfb, 0x54, 0x16, 0xc2, 0xaa, 0x3c,
0x8e, 0x49, 0x61, 0x29, 0x0f, 0xb9, 0xeb, 0x4b, 0x1f, 0xe7, 0xb1, 0x22, 0x44, 0x6d, 0x3c, 0xec,
0xbc, 0xce, 0x57, 0x1b, 0x0f, 0x61, 0xc9, 0xfd, 0x2b, 0xbe, 0xd3, 0xfe, 0x95, 0xce, 0xbd, 0x7f,
0xf6, 0xdf, 0x0d, 0x28, 0x0f, 0xcf, 0x56, 0xc2, 0xbb, 0xc6, 0x3b, 0x7b, 0x77, 0xcc, 0x33, 0xb9,
0xb7, 0xf3, 0xcc, 0x65, 0x28, 0x30, 0x4e, 0x89, 0xdb, 0x53, 0x9d, 0x1b, 0xd6, 0x94, 0xc8, 0x62,
0x3d, 0xd6, 0x95, 0x3b, 0x54, 0xc5, 0x62, 0x68, 0xff, 0xd7, 0x80, 0x85, 0xb1, 0xe3, 0xfe, 0x5e,
0x6d, 0xb9, 0x04, 0xf3, 0x3e, 0x39, 0x21, 0xaa, 0xb7, 0xcc, 0x63, 0x45, 0x88, 0x59, 0xf6, 0x22,
0xa4, 0x5c, 0x2a, 0x57, 0xc5, 0x8a, 0x10, 0x3a, 0x77, 0x08, 0x77, 0x3d, 0x5f, 0xe6, 0xa5, 0x2a,
0xd6, 0x94, 0xd0, 0xb9, 0x4f, 0x7d, 0x5d, 0x5f, 0x8b, 0x21, 0xb2, 0x61, 0xce, 0x0b, 0x8e, 0x42,
0x1d, 0x36, 0xb2, 0xb2, 0x51, 0x75, 0xda, 0x4e, 0x70, 0x14, 0x62, 0xb9, 0x86, 0xae, 0x42, 0x81,
0xba, 0x41, 0x97, 0xc4, 0xc5, 0x75, 0x59, 0x70, 0x61, 0x31, 0x83, 0xf5, 0x82, 0x6d, 0x43, 0x55,
0xf6, 0xa7, 0xbb, 0x84, 0x89, 0x6e, 0x48, 0x84, 0x75, 0xc7, 0xe5, 0xae, 0x34, 0xbb, 0x8a, 0xe5,
0xd8, 0xbe, 0x09, 0xe8, 0xb1, 0xc7, 0xf8, 0x33, 0xd9, 0xc2, 0xb3, 0xb3, 0x9a, 0xd7, 0x7d, 0xb8,
0x38, 0xc6, 0xad, 0xaf, 0x85, 0x9f, 0x4e, 0xb4, 0xaf, 0xd7, 0xd2, 0x19, 0x57, 0xbe, 0x14, 0x38,
0x0a, 0x38, 0xd1, 0xc5, 0x2e, 0x40, 0x45, 0xda, 0xa5, 0xbe, 0x6d, 0xbb, 0x50, 0x55, 0xa4, 0x16,
0xfe, 0x05, 0x5c, 0x88, 0x05, 0x7d, 0x49, 0xa8, 0x6c, 0x45, 0x0c, 0xe9, 0x97, 0x1f, 0x4e, 0xfb,
0x4a, 0x63, 0x9c, 0x1d, 0x4f, 0xe2, 0x6d, 0x02, 0x17, 0x25, 0xcf, 0x43, 0x8f, 0xf1, 0x90, 0x0e,
0x62, 0xab, 0x57, 0x00, 0xb6, 0xda, 0xdc, 0x3b, 0x21, 0x4f, 0x02, 0x5f, 0x5d, 0xa3, 0x25, 0x9c,
0x98, 0x89, 0xaf, 0xc8, 0xdc, 0xa8, 0x87, 0xbb, 0x02, 0xe5, 0x96, 0x4b, 0xfd, 0x41, 0xeb, 0xa5,
0xc7, 0x75, 0x2b, 0x3d, 0x9a, 0xb0, 0x7f, 0x6f, 0xc0, 0x72, 0xf2, 0x3b, 0xad, 0x13, 0x91, 0x2e,
0xee, 0xc1, 0x1c, 0x8f, 0xeb, 0x98, 0xc5, 0x2c, 0x23, 0x52, 0x10, 0x51, 0xea, 0x60, 0x09, 0x4a,
0x78, 0x5a, 0x1d, 0x9c, 0x6b, 0xa7, 0xc3, 0x27, 0x3c, 0xfd, 0xbf, 0x12, 0xa0, 0xf4, 0x72, 0x46,
0x6f, 0x9a, 0x6c, 0xee, 0x72, 0x13, 0xcd, 0xdd, 0xf3, 0xc9, 0xe6, 0x4e, 0x5d, 0xcd, 0x77, 0x66,
0xd1, 0x64, 0x86, 0x16, 0xef, 0x2e, 0x94, 0xe3, 0xea, 0x26, 0xbe, 0xc0, 0xad, 0xb4, 0xe8, 0x61,
0x01, 0x34, 0x62, 0x46, 0xeb, 0xf1, 0x8d, 0xa3, 0xee, 0x3a, 0x14, 0xe7, 0x14, 0x1a, 0xb5, 0x1d,
0x5d, 0x57, 0xe8, 0x5b, 0xe8, 0xfe, 0xf9, 0xde, 0x2d, 0xe6, 0x26, 0xdf, 0x2c, 0x1a, 0x50, 0xd9,
0x8e, 0x13, 0xe5, 0x39, 0x1e, 0x2d, 0x92, 0x20, 0xb4, 0xa1, 0x0b, 0x1b, 0x95, 0x9a, 0xaf, 0xa4,
0x4d, 0x8c, 0x1f, 0x28, 0x42, 0xaa, 0x2b, 0x9b, 0xa3, 0x8c, 0xd2, 0xb2, 0x2c, 0x1d, 0xb4, 0x39,
0x93, 0xef, 0x67, 0xac, 0x2f, 0xd1, 0x67, 0x50, 0xc0, 0x84, 0xf5, 0x7d, 0x2e, 0x5f, 0x42, 0x2a,
0xf5, 0xab, 0x53, 0xa4, 0x2b, 0x26, 0x79, 0x56, 0x35, 0x00, 0xfd, 0x12, 0x8a, 0x6a, 0xc4, 0xcc,
0xca, 0xb4, 0x96, 0x3f, 0x43, 0x33, 0x8d, 0xd1, 0x0d, 0x85, 0xa6, 0xc4, 0x71, 0xfc, 0x9c, 0x04,
0x44, 0xbf, 0xd0, 0x89, 0xb6, 0x76, 0x1e, 0x27, 0x66, 0x50, 0x1d, 0xe6, 0x39, 0x75, 0xdb, 0xc4,
0x5c, 0x98, 0xc1, 0x85, 0x8a, 0x55, 0x24, 0xb6, 0xc8, 0x0b, 0x02, 0xd2, 0x31, 0x17, 0x55, 0xa5,
0xa4, 0x28, 0xf4, 0x03, 0x58, 0x0c, 0xfa, 0x3d, 0xd9, 0x2c, 0x74, 0xf6, 0x39, 0x89, 0x98, 0x79,
0x41, 0x7e, 0x6f, 0x62, 0x16, 0x5d, 0x83, 0x85, 0xa0, 0xdf, 0x3b, 0x10, 0x37, 0xbc, 0x62, 0x5b,
0x92, 0x6c, 0xe3, 0x93, 0xe8, 0x26, 0x2c, 0x0b, 0x5c, 0xbc, 0xdb, 0x8a, 0x73, 0x59, 0x72, 0xa6,
0x17, 0xde, 0x43, 0xcf, 0xfc, 0x3e, 0x3a, 0x02, 0xeb, 0x39, 0x54, 0x93, 0xfb, 0x90, 0x81, 0xbd,
0x33, 0xde, 0x71, 0xcf, 0x10, 0x17, 0x89, 0x86, 0xe3, 0x39, 0x7c, 0xef, 0x69, 0xd4, 0x71, 0x39,
0xc9, 0xca, 0xbc, 0xe9, 0x0c, 0x74, 0x19, 0x0a, 0x7b, 0x6a, 0xa3, 0xd4, 0xcb, 0xa5, 0xa6, 0xc4,
0x7c, 0x93, 0x08, 0xe7, 0xe9, 0x74, 0xab, 0x29, 0xfb, 0x0a, 0x58, 0x59, 0xe2, 0x95, 0x33, 0xec,
0x3f, 0xe7, 0x00, 0x46, 0xc1, 0x80, 0x3e, 0x02, 0xe8, 0x91, 0x8e, 0xe7, 0xfe, 0x9a, 0x8f, 0x1a,
0xca, 0xb2, 0x9c, 0x91, 0x5d, 0xe5, 0xa8, 0xf4, 0xcf, 0xbd, 0x73, 0xe9, 0x8f, 0x60, 0x8e, 0x79,
0xdf, 0x10, 0x5d, 0xa6, 0xc8, 0x31, 0x7a, 0x02, 0x15, 0x37, 0x08, 0x42, 0x2e, 0xc3, 0x38, 0x6e,
0xb6, 0x6f, 0x9d, 0x16, 0xbe, 0xce, 0xd6, 0x88, 0x5f, 0x9d, 0x92, 0xa4, 0x04, 0xeb, 0x3e, 0x2c,
0x4d, 0x32, 0x9c, 0xab, 0x19, 0xfc, 0xd6, 0x80, 0x0b, 0x13, 0x5b, 0x87, 0x3e, 0x1d, 0x66, 0x01,
0x63, 0x86, 0xe3, 0x15, 0x27, 0x80, 0x07, 0x50, 0xdd, 0xe2, 0x5c, 0x64, 0x3d, 0x65, 0x9b, 0x6a,
0xf7, 0x4e, 0xc7, 0x8e, 0x21, 0xec, 0x3f, 0x1a, 0xa3, 0x77, 0xce, 0xcc, 0x9e, 0xff, 0xde, 0x78,
0xcf, 0x7f, 0x7d, 0xfa, 0xe5, 0xf0, 0x3e, 0x5b, 0xfd, 0x1b, 0x3f, 0x87, 0x0f, 0x33, 0x2f, 0x66,
0x54, 0x81, 0xe2, 0xfe, 0xc1, 0x16, 0x3e, 0x68, 0x35, 0x97, 0x3e, 0x40, 0x55, 0x28, 0x6d, 0x3f,
0xd9, 0xdd, 0x7b, 0xdc, 0x3a, 0x68, 0x2d, 0x19, 0x62, 0xa9, 0xd9, 0x12, 0xe3, 0xe6, 0x52, 0xae,
0xfe, 0x6d, 0x01, 0x8a, 0xdb, 0xea, 0xbf, 0x1e, 0x74, 0x00, 0xe5, 0xe1, 0x9f, 0x00, 0xc8, 0xce,
0xf0, 0xce, 0xc4, 0xbf, 0x09, 0xd6, 0xc7, 0xa7, 0xf2, 0xe8, 0xc4, 0xfd, 0x10, 0xe6, 0xe5, 0xdf,
0x21, 0x28, 0xa3, 0xbd, 0x4e, 0xfe, 0x4f, 0x62, 0x9d, 0xfe, 0xf7, 0xc2, 0x86, 0x21, 0x24, 0xc9,
0xb7, 0x89, 0x2c, 0x49, 0xc9, 0xc7, 0x4b, 0x6b, 0xf5, 0x8c, 0x47, 0x0d, 0xb4, 0x0b, 0x05, 0xdd,
0xb0, 0x65, 0xb1, 0x26, 0x5f, 0x20, 0xac, 0xb5, 0xe9, 0x0c, 0x4a, 0xd8, 0x86, 0x81, 0x76, 0x87,
0xef, 0xd1, 0x59, 0xaa, 0x25, 0xab, 0x5d, 0xeb, 0x8c, 0xf5, 0x75, 0x63, 0xc3, 0x40, 0x5f, 0x41,
0x25, 0x51, 0xcf, 0xa2, 0x8c, 0x6a, 0x2a, 0x5d, 0x1c, 0x5b, 0xd7, 0xcf, 0xe0, 0xd2, 0x96, 0xb7,
0x60, 0x4e, 0x1e, 0xa4, 0x0c, 0x67, 0x27, 0xca, 0xdd, 0x2c, 0x35, 0xc7, 0xca, 0xdf, 0x43, 0x55,
0xa0, 0x93, 0x20, 0x19, 0x7d, 0xe8, 0xfa, 0x59, 0xf7, 0xea, 0xd4, 0xb0, 0x49, 0x05, 0xf1, 0x86,
0x81, 0x42, 0x40, 0xe9, 0xe4, 0x89, 0x7e, 0x94, 0x11, 0x25, 0xd3, 0x32, 0xb8, 0x75, 0x73, 0x36,
0x66, 0x65, 0x54, 0xa3, 0xfa, 0xea, 0xcd, 0x8a, 0xf1, 0x8f, 0x37, 0x2b, 0xc6, 0xbf, 0xde, 0xac,
0x18, 0x87, 0x05, 0x59, 0x31, 0xfd, 0xf8, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x7c, 0xb8, 0xc3,
0x68, 0x0b, 0x1d, 0x00, 0x00,
0x38, 0x70, 0x0e, 0xfb, 0x9e, 0xdf, 0x39, 0xf6, 0xb8, 0x73, 0xf2, 0x89, 0x55, 0xef, 0x7a, 0xfc,
0x45, 0xff, 0xd0, 0x69, 0x87, 0xbd, 0x5a, 0x37, 0xec, 0x86, 0xb5, 0x6e, 0x18, 0x76, 0x7d, 0xe2,
0x46, 0x1e, 0xd3, 0xc3, 0x1a, 0x8d, 0xda, 0x35, 0xc6, 0x5d, 0xde, 0x67, 0x4a, 0x8a, 0x75, 0x6b,
0x12, 0x23, 0xa7, 0x0f, 0xfb, 0x47, 0x92, 0x92, 0x84, 0x1c, 0x69, 0xf6, 0x5a, 0x82, 0x5d, 0x7c,
0xbf, 0x16, 0x7f, 0xbf, 0xe6, 0x46, 0x5e, 0x8d, 0x0f, 0x22, 0xc2, 0x6a, 0x5f, 0x87, 0xf4, 0x98,
0x50, 0x0d, 0xb8, 0x39, 0x15, 0xc0, 0x42, 0xff, 0x84, 0xd0, 0x5a, 0x74, 0x58, 0x0b, 0xa3, 0x58,
0x9b, 0xdb, 0xa7, 0x70, 0xf7, 0x69, 0x9b, 0x44, 0xa1, 0xef, 0xb5, 0x07, 0x02, 0xa3, 0x46, 0x1a,
0xb6, 0xaa, 0xad, 0x1b, 0xea, 0xce, 0xbd, 0x1e, 0x61, 0xdc, 0xed, 0x45, 0x8a, 0xc1, 0xfe, 0xad,
0x01, 0xd5, 0x3d, 0xda, 0x0f, 0x08, 0x26, 0xbf, 0xe9, 0x13, 0xc6, 0xd1, 0x65, 0x28, 0x1c, 0x79,
0x3e, 0x27, 0xd4, 0x34, 0xd6, 0xf2, 0xeb, 0x65, 0xac, 0x29, 0xb4, 0x04, 0x79, 0xd7, 0xf7, 0xcd,
0xdc, 0x9a, 0xb1, 0x5e, 0xc2, 0x62, 0x88, 0xd6, 0xa1, 0x7a, 0x4c, 0x48, 0xd4, 0xec, 0x53, 0x97,
0x7b, 0x61, 0x60, 0xe6, 0xd7, 0x8c, 0xf5, 0x7c, 0x63, 0xee, 0xd5, 0xeb, 0x55, 0x03, 0x8f, 0xad,
0x20, 0x1b, 0xca, 0x82, 0x6e, 0x0c, 0x38, 0x61, 0xe6, 0x5c, 0x82, 0x6d, 0x34, 0x6d, 0xdf, 0x80,
0xa5, 0xa6, 0xc7, 0x8e, 0x9f, 0x32, 0xb7, 0x7b, 0x96, 0x2e, 0xf6, 0x23, 0x58, 0x4e, 0xf0, 0xb2,
0x28, 0x0c, 0x18, 0x41, 0xb7, 0xa1, 0x40, 0x49, 0x3b, 0xa4, 0x1d, 0xc9, 0x5c, 0xa9, 0x7f, 0xe4,
0x4c, 0x86, 0x81, 0xa3, 0x01, 0x82, 0x09, 0x6b, 0x66, 0xfb, 0x4f, 0x79, 0xa8, 0x24, 0xe6, 0xd1,
0x22, 0xe4, 0x76, 0x9a, 0xa6, 0xb1, 0x66, 0xac, 0x97, 0x71, 0x6e, 0xa7, 0x89, 0x4c, 0x28, 0xee,
0xf6, 0xb9, 0x7b, 0xe8, 0x13, 0x6d, 0x7b, 0x4c, 0xa2, 0x4b, 0x30, 0xbf, 0x13, 0x3c, 0x65, 0x44,
0x1a, 0x5e, 0xc2, 0x8a, 0x40, 0x08, 0xe6, 0xf6, 0xbd, 0x6f, 0x88, 0x32, 0x13, 0xcb, 0x31, 0xb2,
0xa0, 0xb0, 0xe7, 0x52, 0x12, 0x70, 0x73, 0x5e, 0xc8, 0x6d, 0xe4, 0x4c, 0x03, 0xeb, 0x19, 0xd4,
0x80, 0xf2, 0x36, 0x25, 0x2e, 0x27, 0x9d, 0x2d, 0x6e, 0x16, 0xd6, 0x8c, 0xf5, 0x4a, 0xdd, 0x72,
0xd4, 0xae, 0x39, 0xf1, 0xae, 0x39, 0x07, 0xf1, 0xae, 0x35, 0x4a, 0xaf, 0x5e, 0xaf, 0x7e, 0xf0,
0x87, 0x7f, 0x0a, 0xdf, 0x0d, 0x61, 0xe8, 0x01, 0xc0, 0x63, 0x97, 0xf1, 0xa7, 0x4c, 0x0a, 0x29,
0x9e, 0x29, 0x64, 0x4e, 0x0a, 0x48, 0x60, 0xd0, 0x0a, 0x80, 0x74, 0xc2, 0x76, 0xd8, 0x0f, 0xb8,
0x59, 0x92, 0xba, 0x27, 0x66, 0xd0, 0x1a, 0x54, 0x9a, 0x84, 0xb5, 0xa9, 0x17, 0xc9, 0xad, 0x2e,
0x4b, 0xf7, 0x24, 0xa7, 0x84, 0x04, 0xe5, 0xc1, 0x83, 0x41, 0x44, 0x4c, 0x90, 0x0c, 0x89, 0x19,
0xb1, 0x97, 0xfb, 0x2f, 0x5c, 0x4a, 0x3a, 0x66, 0x45, 0xba, 0x4b, 0x53, 0xc2, 0xbf, 0xca, 0x13,
0xcc, 0xac, 0xca, 0x4d, 0x8e, 0x49, 0xfb, 0x77, 0x45, 0xa8, 0xee, 0x8b, 0xa3, 0x10, 0x87, 0xc3,
0x12, 0xe4, 0x31, 0x39, 0xd2, 0x7b, 0x23, 0x86, 0xc8, 0x01, 0x68, 0x92, 0x23, 0x2f, 0xf0, 0xa4,
0x56, 0x39, 0x69, 0xf8, 0xa2, 0x13, 0x1d, 0x3a, 0xa3, 0x59, 0x9c, 0xe0, 0x40, 0x16, 0x94, 0x5a,
0x2f, 0xa3, 0x90, 0x8a, 0x90, 0xca, 0x4b, 0x31, 0x43, 0x1a, 0x3d, 0x83, 0x85, 0x78, 0xbc, 0xc5,
0x39, 0x15, 0x81, 0x2a, 0xc2, 0xe8, 0x93, 0x74, 0x18, 0x25, 0x95, 0x72, 0xc6, 0x30, 0xad, 0x80,
0xd3, 0x01, 0x1e, 0x97, 0x23, 0x2c, 0xdc, 0x27, 0x8c, 0x09, 0x0d, 0xe5, 0xf6, 0xe3, 0x98, 0x14,
0xea, 0xfc, 0x82, 0x86, 0x01, 0x27, 0x41, 0x47, 0x6e, 0x7d, 0x19, 0x0f, 0x69, 0xa1, 0x4e, 0x3c,
0x56, 0xea, 0x14, 0x67, 0x52, 0x67, 0x0c, 0xa3, 0xd5, 0x19, 0x9b, 0x43, 0x9b, 0x30, 0xbf, 0xed,
0xb6, 0x5f, 0x10, 0xb9, 0xcb, 0x95, 0xfa, 0x4a, 0x5a, 0xa0, 0x5c, 0x7e, 0x22, 0xb7, 0x95, 0xc9,
0x83, 0xfa, 0x01, 0x56, 0x10, 0xf4, 0x2b, 0xa8, 0xb6, 0x02, 0xee, 0x71, 0x9f, 0xf4, 0xe4, 0x8e,
0x95, 0xc5, 0x8e, 0x35, 0x36, 0xbf, 0x7b, 0xbd, 0xfa, 0x93, 0xa9, 0xf9, 0xa9, 0xcf, 0x3d, 0xbf,
0x46, 0x12, 0x28, 0x27, 0x21, 0x02, 0x8f, 0xc9, 0x43, 0x5f, 0xc1, 0x62, 0xac, 0xec, 0x4e, 0x10,
0xf5, 0x39, 0x33, 0x41, 0x5a, 0x5d, 0x9f, 0xd1, 0x6a, 0x05, 0x52, 0x66, 0x4f, 0x48, 0x12, 0xce,
0xde, 0x09, 0x38, 0xa1, 0x81, 0xeb, 0xeb, 0x10, 0x1c, 0xd2, 0x68, 0x47, 0x44, 0x9a, 0x48, 0xa3,
0x7b, 0x32, 0x79, 0x9a, 0x55, 0xe9, 0x9a, 0xeb, 0xe9, 0xaf, 0x26, 0x93, 0xad, 0xa3, 0x98, 0xf1,
0x18, 0xd4, 0x7a, 0x00, 0x28, 0x1d, 0x12, 0x22, 0x74, 0x8f, 0xc9, 0x20, 0x0e, 0xdd, 0x63, 0x32,
0x10, 0xd9, 0xe3, 0xc4, 0xf5, 0xfb, 0x2a, 0xab, 0x94, 0xb1, 0x22, 0x36, 0x73, 0x77, 0x0d, 0x21,
0x21, 0xbd, 0x8b, 0xe7, 0x92, 0xf0, 0x05, 0x5c, 0xcc, 0xf0, 0x48, 0x86, 0x88, 0x6b, 0x49, 0x11,
0xe9, 0xa3, 0x33, 0x12, 0x69, 0xff, 0x35, 0x0f, 0xd5, 0x64, 0x5c, 0xa0, 0x0d, 0xb8, 0xa8, 0xec,
0xc4, 0xe4, 0xa8, 0x49, 0x22, 0x4a, 0xda, 0x22, 0x19, 0x69, 0xe1, 0x59, 0x4b, 0xa8, 0x0e, 0x97,
0x76, 0x7a, 0x7a, 0x9a, 0x25, 0x20, 0x39, 0x79, 0xec, 0x33, 0xd7, 0x50, 0x08, 0x1f, 0x2a, 0x51,
0xd2, 0x13, 0x09, 0x50, 0x5e, 0xc6, 0xc5, 0x67, 0xa7, 0x07, 0xaf, 0x93, 0x89, 0x55, 0xe1, 0x91,
0x2d, 0x17, 0xfd, 0x0c, 0x8a, 0x6a, 0x21, 0x3e, 0xff, 0x1f, 0x9f, 0xfe, 0x09, 0x25, 0x2c, 0xc6,
0x08, 0xb8, 0xb2, 0x83, 0x99, 0xf3, 0xe7, 0x80, 0x6b, 0x8c, 0xf5, 0x10, 0xac, 0xe9, 0x2a, 0x9f,
0x27, 0x04, 0xec, 0xbf, 0x18, 0xb0, 0x9c, 0xfa, 0x90, 0xb8, 0x9c, 0x64, 0x7a, 0x56, 0x22, 0xe4,
0x18, 0x35, 0x61, 0x5e, 0x25, 0x98, 0x9c, 0x54, 0xd8, 0x99, 0x41, 0x61, 0x27, 0x91, 0x5d, 0x14,
0xd8, 0xba, 0x0b, 0xf0, 0x76, 0xc1, 0x6a, 0xff, 0xcd, 0x80, 0x05, 0x7d, 0x98, 0xf5, 0x4d, 0xee,
0xc2, 0x52, 0x7c, 0x84, 0xe2, 0x39, 0x7d, 0xa7, 0xdf, 0x9e, 0x9a, 0x07, 0x14, 0x9b, 0x33, 0x89,
0x53, 0x3a, 0xa6, 0xc4, 0x59, 0xdb, 0x71, 0x5c, 0x4d, 0xb0, 0x9e, 0x4b, 0xf3, 0xab, 0xb0, 0xb0,
0x2f, 0x2b, 0xc6, 0xa9, 0x17, 0x94, 0xfd, 0x1f, 0x03, 0x16, 0x63, 0x1e, 0x6d, 0xdd, 0xa7, 0x50,
0x3a, 0x21, 0x94, 0x93, 0x97, 0x84, 0x69, 0xab, 0xcc, 0xb4, 0x55, 0x5f, 0x4a, 0x0e, 0x3c, 0xe4,
0x44, 0x9b, 0x50, 0x52, 0xd5, 0x29, 0x89, 0x37, 0x6a, 0x65, 0x1a, 0x4a, 0x7f, 0x6f, 0xc8, 0x8f,
0x6a, 0x30, 0xe7, 0x87, 0x5d, 0xa6, 0xcf, 0xcc, 0xf7, 0xa7, 0xe1, 0x1e, 0x87, 0x5d, 0x2c, 0x19,
0xd1, 0x3d, 0x28, 0x7d, 0xed, 0xd2, 0xc0, 0x0b, 0xba, 0xf1, 0x29, 0x58, 0x9d, 0x06, 0x7a, 0xa6,
0xf8, 0xf0, 0x10, 0x20, 0x0a, 0xaa, 0x82, 0x5a, 0x43, 0x8f, 0xa0, 0xd0, 0xf1, 0xba, 0x84, 0x71,
0xe5, 0x92, 0x46, 0x5d, 0xdc, 0x25, 0xdf, 0xbd, 0x5e, 0xbd, 0x91, 0xb8, 0x2c, 0xc2, 0x88, 0x04,
0xa2, 0x7c, 0x77, 0xbd, 0x80, 0x50, 0x51, 0x8d, 0xdf, 0x52, 0x10, 0xa7, 0x29, 0x7f, 0xb0, 0x96,
0x20, 0x64, 0x79, 0xea, 0x4a, 0x90, 0xf9, 0xe2, 0xed, 0x64, 0x29, 0x09, 0xe2, 0x18, 0x04, 0x6e,
0x8f, 0xe8, 0x12, 0x40, 0x8e, 0x45, 0x7d, 0xd2, 0x16, 0x71, 0xde, 0x91, 0x95, 0x5b, 0x09, 0x6b,
0x0a, 0x6d, 0x42, 0x91, 0x71, 0x97, 0x8a, 0x9c, 0x33, 0x3f, 0x63, 0x61, 0x15, 0x03, 0xd0, 0x7d,
0x28, 0xb7, 0xc3, 0x5e, 0xe4, 0x13, 0x81, 0x2e, 0xcc, 0x88, 0x1e, 0x41, 0x44, 0xe8, 0x11, 0x4a,
0x43, 0x2a, 0x4b, 0xba, 0x32, 0x56, 0x04, 0xba, 0x03, 0x0b, 0x11, 0x0d, 0xbb, 0x94, 0x30, 0xf6,
0x39, 0x0d, 0xfb, 0x91, 0xbe, 0xc8, 0x97, 0x45, 0xf2, 0xde, 0x4b, 0x2e, 0xe0, 0x71, 0x3e, 0xfb,
0xdf, 0x39, 0xa8, 0x26, 0x43, 0x24, 0x55, 0xeb, 0x3e, 0x82, 0x82, 0x0a, 0x38, 0x15, 0xeb, 0x6f,
0xe7, 0x63, 0x25, 0x21, 0xd3, 0xc7, 0x26, 0x14, 0xdb, 0x7d, 0x2a, 0x0b, 0x61, 0x55, 0x1e, 0xc7,
0xa4, 0xb0, 0x94, 0x87, 0xdc, 0xf5, 0xa5, 0x8f, 0xf3, 0x58, 0x11, 0xa2, 0x36, 0x1e, 0xf6, 0x2b,
0xe7, 0xab, 0x8d, 0x87, 0xb0, 0xe4, 0xfe, 0x15, 0xdf, 0x69, 0xff, 0x4a, 0xe7, 0xde, 0x3f, 0xfb,
0xef, 0x06, 0x94, 0x87, 0x67, 0x2b, 0xe1, 0x5d, 0xe3, 0x9d, 0xbd, 0x3b, 0xe6, 0x99, 0xdc, 0xdb,
0x79, 0xe6, 0x32, 0x14, 0x18, 0xa7, 0xc4, 0xed, 0xa9, 0xce, 0x0d, 0x6b, 0x4a, 0x64, 0xb1, 0x1e,
0xeb, 0xca, 0x1d, 0xaa, 0x62, 0x31, 0xb4, 0xff, 0x6b, 0xc0, 0xc2, 0xd8, 0x71, 0x7f, 0xaf, 0xb6,
0x5c, 0x82, 0x79, 0x9f, 0x9c, 0x10, 0xd5, 0x5b, 0xe6, 0xb1, 0x22, 0xc4, 0x2c, 0x7b, 0x11, 0x52,
0x2e, 0x95, 0xab, 0x62, 0x45, 0x08, 0x9d, 0x3b, 0x84, 0xbb, 0x9e, 0x2f, 0xf3, 0x52, 0x15, 0x6b,
0x4a, 0xe8, 0xdc, 0xa7, 0xbe, 0xae, 0xaf, 0xc5, 0x10, 0xd9, 0x30, 0xe7, 0x05, 0x47, 0xa1, 0x0e,
0x1b, 0x59, 0xd9, 0xa8, 0x3a, 0x6d, 0x27, 0x38, 0x0a, 0xb1, 0x5c, 0x43, 0x57, 0xa1, 0x40, 0xdd,
0xa0, 0x4b, 0xe2, 0xe2, 0xba, 0x2c, 0xb8, 0xb0, 0x98, 0xc1, 0x7a, 0xc1, 0xb6, 0xa1, 0x2a, 0xfb,
0xd3, 0x5d, 0xc2, 0x44, 0x37, 0x24, 0xc2, 0xba, 0xe3, 0x72, 0x57, 0x9a, 0x5d, 0xc5, 0x72, 0x6c,
0xdf, 0x04, 0xf4, 0xd8, 0x63, 0xfc, 0x99, 0xec, 0xee, 0xd9, 0x59, 0xcd, 0xeb, 0x3e, 0x5c, 0x1c,
0xe3, 0xd6, 0xd7, 0xc2, 0x4f, 0x27, 0xda, 0xd7, 0x6b, 0xe9, 0x8c, 0x2b, 0x1f, 0x11, 0x1c, 0x05,
0x9c, 0xe8, 0x62, 0x17, 0xa0, 0x22, 0xed, 0x52, 0xdf, 0xb6, 0x5d, 0xa8, 0x2a, 0x52, 0x0b, 0xff,
0x02, 0x2e, 0xc4, 0x82, 0xbe, 0x24, 0x54, 0xb6, 0x22, 0x86, 0xf4, 0xcb, 0x0f, 0xa7, 0x7d, 0xa5,
0x31, 0xce, 0x8e, 0x27, 0xf1, 0x36, 0x81, 0x8b, 0x92, 0xe7, 0xa1, 0xc7, 0x78, 0x48, 0x07, 0xb1,
0xd5, 0x2b, 0x00, 0x5b, 0x6d, 0xee, 0x9d, 0x90, 0x27, 0x81, 0xaf, 0xae, 0xd1, 0x12, 0x4e, 0xcc,
0xc4, 0x57, 0x64, 0x6e, 0xd4, 0xc3, 0x5d, 0x81, 0x72, 0xcb, 0xa5, 0xfe, 0xa0, 0xf5, 0xd2, 0xe3,
0xba, 0x95, 0x1e, 0x4d, 0xd8, 0xbf, 0x37, 0x60, 0x39, 0xf9, 0x9d, 0xd6, 0x89, 0x48, 0x17, 0xf7,
0x60, 0x8e, 0xc7, 0x75, 0xcc, 0x62, 0x96, 0x11, 0x29, 0x88, 0x28, 0x75, 0xb0, 0x04, 0x25, 0x3c,
0xad, 0x0e, 0xce, 0xb5, 0xd3, 0xe1, 0x13, 0x9e, 0xfe, 0x5f, 0x09, 0x50, 0x7a, 0x39, 0xa3, 0x37,
0x4d, 0x36, 0x77, 0xb9, 0x89, 0xe6, 0xee, 0xf9, 0x64, 0x73, 0xa7, 0xae, 0xe6, 0x3b, 0xb3, 0x68,
0x32, 0x43, 0x8b, 0x77, 0x17, 0xca, 0x71, 0x75, 0x13, 0x5f, 0xe0, 0x56, 0x5a, 0xf4, 0xb0, 0x00,
0x1a, 0x31, 0xa3, 0xf5, 0xf8, 0xc6, 0x51, 0x77, 0x1d, 0x8a, 0x73, 0x0a, 0x8d, 0xda, 0x8e, 0xae,
0x2b, 0xf4, 0x2d, 0x74, 0xff, 0x7c, 0xef, 0x16, 0x73, 0x93, 0x6f, 0x16, 0x0d, 0xa8, 0x6c, 0xc7,
0x89, 0xf2, 0x1c, 0x8f, 0x16, 0x49, 0x10, 0xda, 0xd0, 0x85, 0x8d, 0x4a, 0xcd, 0x57, 0xd2, 0x26,
0xc6, 0x0f, 0x14, 0x21, 0xd5, 0x95, 0xcd, 0x51, 0x46, 0x69, 0x59, 0x96, 0x0e, 0xda, 0x9c, 0xc9,
0xf7, 0x33, 0xd6, 0x97, 0xe8, 0x33, 0x28, 0x60, 0xc2, 0xfa, 0x3e, 0x97, 0x2f, 0x21, 0x95, 0xfa,
0xd5, 0x29, 0xd2, 0x15, 0x93, 0x3c, 0xab, 0x1a, 0x80, 0x7e, 0x09, 0x45, 0x35, 0x62, 0x66, 0x65,
0x5a, 0xcb, 0x9f, 0xa1, 0x99, 0xc6, 0xe8, 0x86, 0x42, 0x53, 0xe2, 0x38, 0x7e, 0x4e, 0x02, 0xa2,
0x5f, 0xe8, 0x44, 0x5b, 0x3b, 0x8f, 0x13, 0x33, 0xa8, 0x0e, 0xf3, 0x9c, 0xba, 0x6d, 0x62, 0x2e,
0xcc, 0xe0, 0x42, 0xc5, 0x2a, 0x12, 0x5b, 0xe4, 0x05, 0x01, 0xe9, 0x98, 0x8b, 0xaa, 0x52, 0x52,
0x14, 0xfa, 0x01, 0x2c, 0x06, 0xfd, 0x9e, 0x6c, 0x16, 0x3a, 0xfb, 0x9c, 0x44, 0xcc, 0xbc, 0x20,
0xbf, 0x37, 0x31, 0x8b, 0xae, 0xc1, 0x42, 0xd0, 0xef, 0x1d, 0x88, 0x1b, 0x5e, 0xb1, 0x2d, 0x49,
0xb6, 0xf1, 0x49, 0x74, 0x13, 0x96, 0x05, 0x2e, 0xde, 0x6d, 0xc5, 0xb9, 0x2c, 0x39, 0xd3, 0x0b,
0xef, 0xa1, 0x67, 0x7e, 0x1f, 0x1d, 0x81, 0xf5, 0x1c, 0xaa, 0xc9, 0x7d, 0xc8, 0xc0, 0xde, 0x19,
0xef, 0xb8, 0x67, 0x88, 0x8b, 0x44, 0xc3, 0xf1, 0x1c, 0xbe, 0xf7, 0x34, 0xea, 0xb8, 0x9c, 0x64,
0x65, 0xde, 0x74, 0x06, 0xba, 0x0c, 0x85, 0x3d, 0xb5, 0x51, 0xea, 0xe5, 0x52, 0x53, 0x62, 0xbe,
0x49, 0x84, 0xf3, 0x74, 0xba, 0xd5, 0x94, 0x7d, 0x05, 0xac, 0x2c, 0xf1, 0xca, 0x19, 0xf6, 0x9f,
0x73, 0x00, 0xa3, 0x60, 0x40, 0x1f, 0x01, 0xf4, 0x48, 0xc7, 0x73, 0x7f, 0xcd, 0x47, 0x0d, 0x65,
0x59, 0xce, 0xc8, 0xae, 0x72, 0x54, 0xfa, 0xe7, 0xde, 0xb9, 0xf4, 0x47, 0x30, 0xc7, 0xbc, 0x6f,
0x88, 0x2e, 0x53, 0xe4, 0x18, 0x3d, 0x81, 0x8a, 0x1b, 0x04, 0x21, 0x97, 0x61, 0x1c, 0x37, 0xdb,
0xb7, 0x4e, 0x0b, 0x5f, 0x67, 0x6b, 0xc4, 0xaf, 0x4e, 0x49, 0x52, 0x82, 0x75, 0x1f, 0x96, 0x26,
0x19, 0xce, 0xd5, 0x0c, 0x7e, 0x6b, 0xc0, 0x85, 0x89, 0xad, 0x43, 0x9f, 0x0e, 0xb3, 0x80, 0x31,
0xc3, 0xf1, 0x8a, 0x13, 0xc0, 0x03, 0xa8, 0x6e, 0x71, 0x2e, 0xb2, 0x9e, 0xb2, 0x4d, 0xb5, 0x7b,
0xa7, 0x63, 0xc7, 0x10, 0xf6, 0x1f, 0x8d, 0xd1, 0x3b, 0x67, 0x66, 0xcf, 0x7f, 0x6f, 0xbc, 0xe7,
0xbf, 0x3e, 0xfd, 0x72, 0x78, 0x9f, 0xad, 0xfe, 0x8d, 0x9f, 0xc3, 0x87, 0x99, 0x17, 0x33, 0xaa,
0x40, 0x71, 0xff, 0x60, 0x0b, 0x1f, 0xb4, 0x9a, 0x4b, 0x1f, 0xa0, 0x2a, 0x94, 0xb6, 0x9f, 0xec,
0xee, 0x3d, 0x6e, 0x1d, 0xb4, 0x96, 0x0c, 0xb1, 0xd4, 0x6c, 0x89, 0x71, 0x73, 0x29, 0x57, 0xff,
0xb6, 0x00, 0xc5, 0x6d, 0xf5, 0x5f, 0x0f, 0x3a, 0x80, 0xf2, 0xf0, 0x4f, 0x00, 0x64, 0x67, 0x78,
0x67, 0xe2, 0xdf, 0x04, 0xeb, 0xe3, 0x53, 0x79, 0x74, 0xe2, 0x7e, 0x08, 0xf3, 0xf2, 0xef, 0x10,
0x94, 0xd1, 0x5e, 0x27, 0xff, 0x27, 0xb1, 0x4e, 0xff, 0x7b, 0x61, 0xc3, 0x10, 0x92, 0xe4, 0xdb,
0x44, 0x96, 0xa4, 0xe4, 0xe3, 0xa5, 0xb5, 0x7a, 0xc6, 0xa3, 0x06, 0xda, 0x85, 0x82, 0x6e, 0xd8,
0xb2, 0x58, 0x93, 0x2f, 0x10, 0xd6, 0xda, 0x74, 0x06, 0x25, 0x6c, 0xc3, 0x40, 0xbb, 0xc3, 0xf7,
0xe8, 0x2c, 0xd5, 0x92, 0xd5, 0xae, 0x75, 0xc6, 0xfa, 0xba, 0xb1, 0x61, 0xa0, 0xaf, 0xa0, 0x92,
0xa8, 0x67, 0x51, 0x46, 0x35, 0x95, 0x2e, 0x8e, 0xad, 0xeb, 0x67, 0x70, 0x69, 0xcb, 0x5b, 0x30,
0x27, 0x0f, 0x52, 0x86, 0xb3, 0x13, 0xe5, 0x6e, 0x96, 0x9a, 0x63, 0xe5, 0xef, 0xa1, 0x2a, 0xd0,
0x49, 0x90, 0x8c, 0x3e, 0x74, 0xfd, 0xac, 0x7b, 0x75, 0x6a, 0xd8, 0xa4, 0x82, 0x78, 0xc3, 0x40,
0x21, 0xa0, 0x74, 0xf2, 0x44, 0x3f, 0xca, 0x88, 0x92, 0x69, 0x19, 0xdc, 0xba, 0x39, 0x1b, 0xb3,
0x32, 0xaa, 0x51, 0x7d, 0xf5, 0x66, 0xc5, 0xf8, 0xc7, 0x9b, 0x15, 0xe3, 0x5f, 0x6f, 0x56, 0x8c,
0xc3, 0x82, 0xac, 0x98, 0x7e, 0xfc, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xf6, 0x99, 0xcf,
0x0b, 0x1d, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.

@ -2,13 +2,13 @@ syntax = "proto3";
package moby.buildkit.v1;
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
import "google/protobuf/timestamp.proto";
import "github.com/moby/buildkit/solver/pb/ops.proto";
import "github.com/moby/buildkit/api/types/worker.proto";
// import "github.com/containerd/containerd/api/types/descriptor.proto";
import "github.com/gogo/googleapis/google/rpc/status.proto";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
import "github.com/moby/buildkit/api/types/worker.proto";
import "github.com/moby/buildkit/solver/pb/ops.proto";
import "github.com/moby/buildkit/sourcepolicy/pb/policy.proto";
import "google/protobuf/timestamp.proto";
option (gogoproto.sizer_all) = true;
option (gogoproto.marshaler_all) = true;

@ -14,9 +14,15 @@ type Config struct {
// Entitlements e.g. security.insecure, network.host
Entitlements []string `toml:"insecure-entitlements"`
// LogFormat is the format of the logs. It can be "json" or "text".
Log LogConfig `toml:"log"`
// GRPC configuration settings
GRPC GRPCConfig `toml:"grpc"`
OTEL OTELConfig `toml:"otel"`
Workers struct {
OCI OCIConfig `toml:"oci"`
Containerd ContainerdConfig `toml:"containerd"`
@ -29,6 +35,10 @@ type Config struct {
History *HistoryConfig `toml:"history"`
}
type LogConfig struct {
Format string `toml:"format"`
}
type GRPCConfig struct {
Address []string `toml:"address"`
DebugAddress string `toml:"debugAddress"`
@ -46,6 +56,10 @@ type TLSConfig struct {
CA string `toml:"ca"`
}
type OTELConfig struct {
SocketPath string `toml:"socketPath"`
}
type GCConfig struct {
GC *bool `toml:"gc"`
GCKeepStorage DiskSpace `toml:"gckeepstorage"`

@ -2659,7 +2659,7 @@ func init() {
func init() { proto.RegisterFile("gateway.proto", fileDescriptor_f1a937782ebbded5) }
var fileDescriptor_f1a937782ebbded5 = []byte{
// 2497 bytes of a gzipped FileDescriptorProto
// 2496 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0xcf, 0x6f, 0x1b, 0xc7,
0xf5, 0xd7, 0x8a, 0x14, 0x45, 0x3e, 0xfe, 0x10, 0x3d, 0x71, 0xf2, 0xa5, 0x17, 0x81, 0x23, 0xaf,
0x63, 0x45, 0x96, 0x1d, 0xd2, 0x5f, 0xd9, 0x86, 0x5c, 0xbb, 0x75, 0x62, 0xfd, 0x82, 0x14, 0x4b,
@ -2669,154 +2669,153 @@ var fileDescriptor_f1a937782ebbded5 = []byte{
0x37, 0x33, 0x4b, 0x0e, 0x7f, 0x68, 0x45, 0xd6, 0x27, 0xce, 0xbc, 0x79, 0x3f, 0xe6, 0xbd, 0x37,
0xef, 0xcd, 0x67, 0x96, 0x50, 0xee, 0xd8, 0x9c, 0x9d, 0xda, 0x67, 0xf5, 0x30, 0x0a, 0x78, 0x40,
0xae, 0x1c, 0x07, 0x87, 0x67, 0xf5, 0xc3, 0xae, 0xeb, 0x39, 0xaf, 0x5c, 0x5e, 0x3f, 0xf9, 0xff,
0x7a, 0x3b, 0x0a, 0x7c, 0xce, 0x7c, 0xc7, 0xfc, 0xb8, 0xe3, 0xf2, 0xa3, 0xee, 0x61, 0xbd, 0x15,
0x1c, 0x37, 0x3a, 0x41, 0x27, 0x68, 0x08, 0x89, 0xc3, 0x6e, 0x5b, 0xcc, 0xc4, 0x44, 0x8c, 0xa4,
0x26, 0x73, 0x75, 0x98, 0xbd, 0x13, 0x04, 0x1d, 0x8f, 0xd9, 0xa1, 0x1b, 0xab, 0x61, 0x23, 0x0a,
0x5b, 0x8d, 0x98, 0xdb, 0xbc, 0x1b, 0x2b, 0x99, 0xdb, 0x9a, 0x0c, 0x6e, 0xa4, 0x91, 0x6c, 0xa4,
0x11, 0x07, 0xde, 0x09, 0x8b, 0x1a, 0xe1, 0x61, 0x23, 0x08, 0x13, 0xee, 0xc6, 0xb9, 0xdc, 0x76,
0xe8, 0x36, 0xf8, 0x59, 0xc8, 0xe2, 0xc6, 0x69, 0x10, 0xbd, 0x62, 0x91, 0x12, 0xb8, 0x7b, 0xae,
0x40, 0x97, 0xbb, 0x1e, 0x4a, 0xb5, 0xec, 0x30, 0x46, 0x23, 0xf8, 0xab, 0x84, 0x74, 0xb7, 0x79,
0xe0, 0xbb, 0x31, 0x77, 0xdd, 0x8e, 0xdb, 0x68, 0xc7, 0x42, 0x46, 0x5a, 0x41, 0x27, 0x14, 0xfb,
0xfd, 0x14, 0x17, 0xba, 0x51, 0x8b, 0x85, 0x81, 0xe7, 0xb6, 0xce, 0xd0, 0x86, 0x1c, 0x49, 0x31,
0xeb, 0x6f, 0x59, 0xc8, 0x51, 0x16, 0x77, 0x3d, 0x4e, 0x96, 0xa0, 0x1c, 0xb1, 0xf6, 0x26, 0x0b,
0x23, 0xd6, 0xb2, 0x39, 0x73, 0x6a, 0xc6, 0xa2, 0xb1, 0x5c, 0xd8, 0x99, 0xa1, 0x83, 0x64, 0xf2,
0x13, 0xa8, 0x44, 0xac, 0x1d, 0x6b, 0x8c, 0xb3, 0x8b, 0xc6, 0x72, 0x71, 0xf5, 0x56, 0xfd, 0xdc,
0x1c, 0xd6, 0x29, 0x6b, 0xef, 0xdb, 0x61, 0x5f, 0x64, 0x67, 0x86, 0x0e, 0x29, 0x21, 0xab, 0x90,
0x89, 0x58, 0xbb, 0x96, 0x11, 0xba, 0xae, 0xa6, 0xeb, 0xda, 0x99, 0xa1, 0xc8, 0x4c, 0xd6, 0x20,
0x8b, 0x5a, 0x6a, 0x59, 0x21, 0x74, 0xed, 0xc2, 0x0d, 0xec, 0xcc, 0x50, 0x21, 0x40, 0x9e, 0x42,
0xfe, 0x98, 0x71, 0xdb, 0xb1, 0xb9, 0x5d, 0x83, 0xc5, 0xcc, 0x72, 0x71, 0xb5, 0x91, 0x2a, 0x8c,
0x01, 0xaa, 0xef, 0x2b, 0x89, 0x2d, 0x9f, 0x47, 0x67, 0xb4, 0xa7, 0x80, 0xbc, 0x84, 0x92, 0xcd,
0x39, 0xc3, 0x64, 0xb8, 0x81, 0x1f, 0xd7, 0x4a, 0x42, 0xe1, 0xdd, 0x8b, 0x15, 0x3e, 0xd1, 0xa4,
0xa4, 0xd2, 0x01, 0x45, 0xe6, 0x23, 0x28, 0x0f, 0xd8, 0x24, 0x55, 0xc8, 0xbc, 0x62, 0x67, 0x32,
0x31, 0x14, 0x87, 0xe4, 0x32, 0xcc, 0x9d, 0xd8, 0x5e, 0x97, 0x89, 0x1c, 0x94, 0xa8, 0x9c, 0x3c,
0x9c, 0x7d, 0x60, 0x98, 0x47, 0x70, 0x69, 0x44, 0xff, 0x18, 0x05, 0x3f, 0xd2, 0x15, 0x14, 0x57,
0x3f, 0x4a, 0xd9, 0xb5, 0xae, 0x4e, 0xb3, 0xb4, 0x9e, 0x87, 0x5c, 0x24, 0x1c, 0xb2, 0x7e, 0x67,
0x40, 0x75, 0x38, 0xd5, 0x64, 0x57, 0x25, 0xc9, 0x10, 0x61, 0xb9, 0x3f, 0xc5, 0x29, 0x41, 0x82,
0x0a, 0x8c, 0x50, 0x61, 0xae, 0x41, 0xa1, 0x47, 0xba, 0x28, 0x18, 0x05, 0x6d, 0x8b, 0xd6, 0x1a,
0x64, 0x28, 0x6b, 0x93, 0x0a, 0xcc, 0xba, 0xea, 0x5c, 0xd3, 0x59, 0xd7, 0x21, 0x8b, 0x90, 0x71,
0x58, 0x5b, 0xb9, 0x5e, 0xa9, 0x87, 0x87, 0xf5, 0x4d, 0xd6, 0x76, 0x7d, 0x17, 0x5d, 0xa4, 0xb8,
0x64, 0xfd, 0xde, 0xc0, 0xfa, 0xc0, 0x6d, 0x91, 0x4f, 0x06, 0xfc, 0xb8, 0xf8, 0xb4, 0x8f, 0xec,
0xfe, 0x65, 0xfa, 0xee, 0xef, 0x0d, 0x66, 0xe2, 0x82, 0x12, 0xd0, 0xbd, 0xfb, 0x29, 0x94, 0xf4,
0xdc, 0x90, 0x1d, 0x28, 0x6a, 0xe7, 0x48, 0x6d, 0x78, 0x69, 0xb2, 0xcc, 0x52, 0x5d, 0xd4, 0xfa,
0x63, 0x06, 0x8a, 0xda, 0x22, 0x79, 0x0c, 0xd9, 0x57, 0xae, 0x2f, 0x43, 0x58, 0x59, 0x5d, 0x99,
0x4c, 0xe5, 0x53, 0xd7, 0x77, 0xa8, 0x90, 0x23, 0x4d, 0xad, 0xee, 0x66, 0xc5, 0xb6, 0xee, 0x4d,
0xa6, 0xe3, 0xdc, 0xe2, 0xbb, 0x33, 0x45, 0xdb, 0x90, 0x4d, 0x83, 0x40, 0x36, 0xb4, 0xf9, 0x91,
0x68, 0x1a, 0x05, 0x2a, 0xc6, 0xe4, 0x0e, 0xbc, 0xe3, 0xfa, 0x2f, 0x02, 0x1e, 0x34, 0x23, 0xe6,
0xb8, 0x78, 0xf8, 0x5e, 0x9c, 0x85, 0xac, 0x36, 0x27, 0x58, 0xc6, 0x2d, 0x91, 0x26, 0x54, 0x24,
0xf9, 0xa0, 0x7b, 0xf8, 0x0b, 0xd6, 0xe2, 0x71, 0x2d, 0x27, 0xfc, 0x59, 0x4e, 0xd9, 0xc2, 0xae,
0x2e, 0x40, 0x87, 0xe4, 0xdf, 0xaa, 0xda, 0xad, 0xbf, 0x18, 0x50, 0x1e, 0x50, 0x4f, 0x3e, 0x1d,
0x48, 0xd5, 0xed, 0x49, 0xb7, 0xa5, 0x25, 0xeb, 0x33, 0xc8, 0x39, 0x6e, 0x87, 0xc5, 0x5c, 0xa4,
0xaa, 0xb0, 0xbe, 0xfa, 0xdd, 0xf7, 0x1f, 0xcc, 0xfc, 0xf3, 0xfb, 0x0f, 0x56, 0xb4, 0xab, 0x26,
0x08, 0x99, 0xdf, 0x0a, 0x7c, 0x6e, 0xbb, 0x3e, 0x8b, 0xf0, 0x82, 0xfd, 0x58, 0x8a, 0xd4, 0x37,
0xc5, 0x0f, 0x55, 0x1a, 0x30, 0xe8, 0xbe, 0x7d, 0xcc, 0x44, 0x9e, 0x0a, 0x54, 0x8c, 0x2d, 0x0e,
0x65, 0xca, 0x78, 0x37, 0xf2, 0x29, 0xfb, 0x65, 0x17, 0x99, 0x7e, 0x90, 0x34, 0x12, 0xb1, 0xe9,
0x8b, 0x1a, 0x3a, 0x32, 0x52, 0x25, 0x40, 0x96, 0x61, 0x8e, 0x45, 0x51, 0x10, 0xa9, 0xe2, 0x21,
0x75, 0x79, 0xd5, 0xd7, 0xa3, 0xb0, 0x55, 0x3f, 0x10, 0x57, 0x3d, 0x95, 0x0c, 0x56, 0x15, 0x2a,
0x89, 0xd5, 0x38, 0x0c, 0xfc, 0x98, 0x59, 0x0b, 0x18, 0xba, 0xb0, 0xcb, 0x63, 0xb5, 0x0f, 0xeb,
0x5b, 0x03, 0x2a, 0x09, 0x45, 0xf2, 0x90, 0x2f, 0xa0, 0xd8, 0x6f, 0x0d, 0x49, 0x0f, 0x78, 0x98,
0x1a, 0x54, 0x5d, 0x5e, 0xeb, 0x2b, 0xaa, 0x25, 0xe8, 0xea, 0xcc, 0x67, 0x50, 0x1d, 0x66, 0x18,
0x93, 0xfd, 0x0f, 0x07, 0x1b, 0xc4, 0x70, 0xbf, 0xd2, 0x4e, 0xc3, 0xb7, 0xb3, 0x70, 0x85, 0x32,
0x81, 0x5d, 0x76, 0x8f, 0xed, 0x0e, 0xdb, 0x08, 0xfc, 0xb6, 0xdb, 0x49, 0xc2, 0x5c, 0x15, 0xcd,
0x30, 0xd1, 0x8c, 0x7d, 0x71, 0x19, 0xf2, 0x4d, 0xcf, 0xe6, 0xed, 0x20, 0x3a, 0x56, 0xca, 0x4b,
0xa8, 0x3c, 0xa1, 0xd1, 0xde, 0x2a, 0x59, 0x84, 0xa2, 0x52, 0xbc, 0x1f, 0x38, 0x49, 0x3a, 0x75,
0x12, 0xa9, 0xc1, 0xfc, 0x5e, 0xd0, 0x79, 0x86, 0xc9, 0x96, 0x15, 0x96, 0x4c, 0x89, 0x05, 0x25,
0xc5, 0x18, 0xf5, 0xaa, 0x6b, 0x8e, 0x0e, 0xd0, 0xc8, 0xfb, 0x50, 0x38, 0x60, 0x71, 0xec, 0x06,
0xfe, 0xee, 0x66, 0x2d, 0x27, 0xe4, 0xfb, 0x04, 0xd4, 0x7d, 0xc0, 0x83, 0x88, 0xed, 0x6e, 0xd6,
0xe6, 0xa5, 0x6e, 0x35, 0x25, 0xfb, 0x50, 0x39, 0x10, 0x38, 0xa7, 0x89, 0xe8, 0xc6, 0x65, 0x71,
0x2d, 0x2f, 0x52, 0x74, 0x63, 0x34, 0x45, 0x3a, 0x1e, 0xaa, 0x0b, 0xf6, 0x33, 0x3a, 0x24, 0x6c,
0xfd, 0xd6, 0x00, 0x73, 0x5c, 0x00, 0xd5, 0x69, 0xf8, 0x0c, 0x72, 0xf2, 0x7c, 0xcb, 0x20, 0xfe,
0x6f, 0x95, 0x21, 0x7f, 0xc9, 0x7b, 0x90, 0x93, 0xda, 0x55, 0x51, 0xab, 0x59, 0x92, 0xa5, 0x4c,
0x2f, 0x4b, 0xd6, 0xaf, 0x73, 0x50, 0x3a, 0xc0, 0x2d, 0x25, 0x89, 0xac, 0x03, 0xf4, 0xf3, 0xaf,
0x6a, 0x66, 0xf8, 0x54, 0x68, 0x1c, 0xc4, 0x84, 0xfc, 0xb6, 0x3a, 0x9f, 0xea, 0x8a, 0xec, 0xcd,
0xc9, 0xe7, 0x50, 0x4c, 0xc6, 0xcf, 0x43, 0x5e, 0xcb, 0x88, 0xe8, 0x3d, 0x48, 0x39, 0xe0, 0xfa,
0x4e, 0xea, 0x9a, 0xa8, 0x3a, 0xde, 0x1a, 0x85, 0xdc, 0x86, 0x4b, 0xb6, 0xe7, 0x05, 0xa7, 0xaa,
0x66, 0x45, 0xf5, 0x89, 0xec, 0xe7, 0xe9, 0xe8, 0x02, 0xf6, 0x62, 0x8d, 0xf8, 0x24, 0x8a, 0xec,
0x33, 0x0c, 0x44, 0x4e, 0xf0, 0x8f, 0x5b, 0xc2, 0xb6, 0xb8, 0xed, 0xfa, 0xb6, 0x57, 0x03, 0xc1,
0x23, 0x27, 0x78, 0xdc, 0xb6, 0x5e, 0x87, 0x41, 0xc4, 0x59, 0xf4, 0x84, 0xf3, 0xa8, 0x56, 0x14,
0xe1, 0x1d, 0xa0, 0x91, 0x26, 0x94, 0x36, 0xec, 0xd6, 0x11, 0xdb, 0x3d, 0x46, 0x62, 0x02, 0xdd,
0xd2, 0x9a, 0xa5, 0x60, 0x7f, 0x1e, 0xea, 0x98, 0x4d, 0xd7, 0x40, 0x5a, 0x50, 0x49, 0x5c, 0x97,
0x2d, 0xa0, 0x56, 0x16, 0x3a, 0x1f, 0x4d, 0x1b, 0x4a, 0x29, 0x2d, 0x4d, 0x0c, 0xa9, 0xc4, 0x44,
0x6e, 0x61, 0xb5, 0xdb, 0x9c, 0xd5, 0x2a, 0xc2, 0xe7, 0xde, 0x7c, 0x4c, 0x25, 0x2c, 0xbc, 0x45,
0x25, 0x98, 0x8f, 0xa1, 0x3a, 0x9c, 0xdc, 0x69, 0x90, 0x97, 0xf9, 0x63, 0x78, 0x67, 0x8c, 0x47,
0x6f, 0xd5, 0xdd, 0xfe, 0x6c, 0xc0, 0xa5, 0x91, 0x34, 0xe0, 0x0d, 0x23, 0xba, 0x8a, 0x54, 0x29,
0xc6, 0x64, 0x1f, 0xe6, 0x30, 0xcd, 0xb1, 0xc2, 0x1a, 0x6b, 0xd3, 0xe4, 0xb5, 0x2e, 0x24, 0x65,
0xfc, 0xa5, 0x16, 0xf3, 0x01, 0x40, 0x9f, 0x38, 0x15, 0xfe, 0xfc, 0x02, 0xca, 0x2a, 0xc9, 0xaa,
0x83, 0x54, 0x25, 0x6c, 0x51, 0xc2, 0x08, 0x4b, 0xfa, 0x97, 0x5f, 0x66, 0xca, 0xcb, 0xcf, 0xfa,
0x0a, 0x16, 0x28, 0xb3, 0x9d, 0x6d, 0xd7, 0x63, 0xe7, 0xf7, 0x78, 0x2c, 0x7e, 0xd7, 0x63, 0x4d,
0x84, 0x3e, 0x49, 0xf1, 0xab, 0x39, 0x79, 0x08, 0x73, 0xd4, 0xf6, 0x3b, 0x4c, 0x99, 0xfe, 0x30,
0xc5, 0xb4, 0x30, 0x82, 0xbc, 0x54, 0x8a, 0x58, 0x8f, 0xa0, 0xd0, 0xa3, 0x61, 0x33, 0x7b, 0xde,
0x6e, 0xc7, 0x4c, 0x36, 0xc6, 0x0c, 0x55, 0x33, 0xa4, 0xef, 0x31, 0xbf, 0xa3, 0x4c, 0x67, 0xa8,
0x9a, 0x59, 0x4b, 0xf8, 0x5e, 0x48, 0x76, 0xae, 0x42, 0x43, 0x20, 0xbb, 0x89, 0xf8, 0xd0, 0x10,
0xf5, 0x2a, 0xc6, 0x96, 0x83, 0x97, 0xb6, 0xed, 0x6c, 0xba, 0xd1, 0xf9, 0x0e, 0xd6, 0x60, 0x7e,
0xd3, 0x8d, 0x34, 0xff, 0x92, 0x29, 0x59, 0xc2, 0xeb, 0xbc, 0xe5, 0x75, 0x1d, 0xf4, 0x96, 0xb3,
0xc8, 0x57, 0x5d, 0x75, 0x88, 0x6a, 0x7d, 0x22, 0xe3, 0x28, 0xac, 0xa8, 0xcd, 0xdc, 0x86, 0x79,
0xe6, 0xf3, 0x08, 0xcb, 0x48, 0xde, 0xf9, 0xa4, 0x2e, 0x5f, 0xe0, 0x75, 0xf1, 0x02, 0x17, 0xd8,
0x82, 0x26, 0x2c, 0xd6, 0x1a, 0x2c, 0x20, 0x21, 0x3d, 0x11, 0x04, 0xb2, 0xda, 0x26, 0xc5, 0xd8,
0x7a, 0x08, 0xd5, 0xbe, 0xa0, 0x32, 0xbd, 0x04, 0x59, 0x04, 0xbf, 0xaa, 0xaf, 0x8f, 0xb3, 0x2b,
0xd6, 0xad, 0xeb, 0xb0, 0x90, 0x14, 0xff, 0xb9, 0x46, 0x2d, 0x02, 0xd5, 0x3e, 0x93, 0xc2, 0x3d,
0x65, 0x28, 0x36, 0x5d, 0x3f, 0x81, 0x05, 0xd6, 0x1b, 0x03, 0x4a, 0xcd, 0xc0, 0xef, 0xdf, 0x72,
0x4d, 0x58, 0x48, 0x4a, 0xf7, 0x49, 0x73, 0x77, 0xc3, 0x0e, 0x93, 0x18, 0x2c, 0x8e, 0x9e, 0x0f,
0xf5, 0x0d, 0xa3, 0x2e, 0x19, 0xd7, 0xb3, 0x78, 0x21, 0xd2, 0x61, 0x71, 0xf2, 0x29, 0xcc, 0xef,
0xed, 0xad, 0x0b, 0x4d, 0xb3, 0x53, 0x69, 0x4a, 0xc4, 0xc8, 0x63, 0x98, 0x7f, 0x29, 0x3e, 0xad,
0xc4, 0xea, 0x8a, 0x1a, 0x73, 0x56, 0x65, 0x84, 0x24, 0x1b, 0x65, 0xad, 0x20, 0x72, 0x68, 0x22,
0x64, 0xfd, 0xdb, 0x80, 0xe2, 0x4b, 0xbb, 0x0f, 0x39, 0xfb, 0x18, 0xf7, 0x2d, 0x6e, 0x72, 0x85,
0x71, 0x2f, 0xc3, 0x9c, 0xc7, 0x4e, 0x98, 0xa7, 0xce, 0xb8, 0x9c, 0x20, 0x35, 0x3e, 0x0a, 0x22,
0x59, 0xd6, 0x25, 0x2a, 0x27, 0x58, 0x10, 0x0e, 0xe3, 0xb6, 0xeb, 0xd5, 0xb2, 0x8b, 0x19, 0xbc,
0xf5, 0xe5, 0x0c, 0x33, 0xd7, 0x8d, 0x3c, 0xf5, 0xf0, 0xc0, 0x21, 0xb1, 0x20, 0xeb, 0xfa, 0xed,
0x40, 0xdc, 0x7f, 0xaa, 0x2d, 0xca, 0x16, 0xbd, 0xeb, 0xb7, 0x03, 0x2a, 0xd6, 0xc8, 0x35, 0xc8,
0x45, 0x58, 0x7f, 0x71, 0x6d, 0x5e, 0x04, 0xa5, 0x80, 0x5c, 0xb2, 0x4a, 0xd5, 0x82, 0x55, 0x81,
0x92, 0xf4, 0x5b, 0x25, 0xff, 0x4f, 0xb3, 0xf0, 0xce, 0x33, 0x76, 0xba, 0x91, 0xf8, 0x95, 0x04,
0x64, 0x11, 0x8a, 0x3d, 0xda, 0xee, 0xa6, 0x3a, 0x42, 0x3a, 0x09, 0x8d, 0xed, 0x07, 0x5d, 0x9f,
0x27, 0x39, 0x14, 0xc6, 0x04, 0x85, 0xaa, 0x05, 0x72, 0x03, 0xe6, 0x9f, 0x31, 0x7e, 0x1a, 0x44,
0xaf, 0x84, 0xd7, 0x95, 0xd5, 0x22, 0xf2, 0x3c, 0x63, 0x1c, 0x11, 0x22, 0x4d, 0xd6, 0x10, 0x76,
0x86, 0x09, 0xec, 0xcc, 0x8e, 0x83, 0x9d, 0xc9, 0x2a, 0x59, 0x83, 0x62, 0x2b, 0xf0, 0x63, 0x1e,
0xd9, 0x2e, 0x1a, 0x9e, 0x13, 0xcc, 0xef, 0x22, 0xb3, 0x4c, 0xec, 0x46, 0x7f, 0x91, 0xea, 0x9c,
0x64, 0x05, 0x80, 0xbd, 0xe6, 0x91, 0xbd, 0x13, 0xc4, 0xbd, 0x27, 0x1a, 0xa0, 0x1c, 0x12, 0x76,
0x9b, 0x54, 0x5b, 0xc5, 0x0e, 0x79, 0x14, 0xc4, 0x5c, 0xbc, 0x53, 0x24, 0xbc, 0xec, 0xcd, 0xad,
0xf7, 0xe0, 0xf2, 0x60, 0xb4, 0x54, 0x18, 0x1f, 0xc1, 0xff, 0x51, 0xe6, 0x31, 0x3b, 0x66, 0xd3,
0x47, 0xd2, 0x32, 0xa1, 0x36, 0x2a, 0xac, 0x14, 0xff, 0x27, 0x03, 0xc5, 0xad, 0xd7, 0xac, 0xb5,
0xcf, 0xe2, 0xd8, 0xee, 0x08, 0x60, 0xdc, 0x8c, 0x82, 0x16, 0x8b, 0xe3, 0x9e, 0xae, 0x3e, 0x81,
0xfc, 0x10, 0xb2, 0xbb, 0xbe, 0xcb, 0xd5, 0xdd, 0xb9, 0x94, 0xfa, 0x2e, 0x71, 0xb9, 0xd2, 0xb9,
0x33, 0x43, 0x85, 0x14, 0x79, 0x08, 0x59, 0xec, 0x3c, 0x93, 0x74, 0x7f, 0x47, 0x93, 0x45, 0x19,
0xb2, 0x2e, 0xbe, 0x1f, 0xba, 0x5f, 0x32, 0x95, 0xc1, 0xe5, 0xf4, 0x6b, 0xcb, 0xfd, 0x92, 0xf5,
0x35, 0x28, 0x49, 0xb2, 0x85, 0xb0, 0xde, 0x8e, 0x38, 0x73, 0x54, 0x66, 0x6f, 0xa6, 0x81, 0x25,
0xc9, 0xd9, 0xd7, 0x92, 0xc8, 0x62, 0x10, 0xb6, 0x5e, 0xbb, 0x5c, 0x55, 0x4a, 0x5a, 0x10, 0x90,
0x4d, 0x73, 0x04, 0xa7, 0x28, 0xbd, 0x19, 0xf8, 0x32, 0xf3, 0xe9, 0xd2, 0xc8, 0xa6, 0x49, 0xe3,
0x14, 0xc3, 0x70, 0xe0, 0x76, 0x10, 0x83, 0xe6, 0x2f, 0x0c, 0x83, 0x64, 0xd4, 0xc2, 0x20, 0x09,
0xeb, 0xf3, 0x30, 0x27, 0x20, 0x92, 0xf5, 0x77, 0x03, 0x8a, 0x5a, 0x9e, 0x26, 0xa8, 0xc9, 0xf7,
0x21, 0xbb, 0xcf, 0xc4, 0x37, 0x15, 0x34, 0x9e, 0x17, 0x15, 0xc9, 0xb8, 0x4d, 0x05, 0x15, 0x9b,
0xca, 0xb6, 0x23, 0x1b, 0x66, 0x99, 0xe2, 0x10, 0x29, 0x2f, 0xf8, 0x99, 0x48, 0x59, 0x9e, 0xe2,
0x90, 0xdc, 0x86, 0xfc, 0x01, 0x6b, 0x75, 0x23, 0x97, 0x9f, 0x89, 0x24, 0x54, 0x56, 0xab, 0xa2,
0xd5, 0x28, 0x9a, 0x28, 0xdc, 0x1e, 0x07, 0xb9, 0x05, 0x85, 0x98, 0xb5, 0x22, 0xc6, 0x99, 0x7f,
0xa2, 0xaa, 0xaa, 0xac, 0xd8, 0x23, 0xc6, 0xb7, 0xfc, 0x13, 0xda, 0x5f, 0xb7, 0x9e, 0xe2, 0x49,
0xee, 0x7b, 0x43, 0x20, 0xbb, 0x81, 0x6f, 0x47, 0x74, 0xa3, 0x4c, 0xc5, 0x18, 0x9f, 0xef, 0x5b,
0x17, 0x3d, 0xdf, 0xb7, 0x92, 0xe7, 0xfb, 0xe0, 0x09, 0xc0, 0x6b, 0x4c, 0xcb, 0x88, 0xf5, 0x04,
0x0a, 0xbd, 0x53, 0x4a, 0x2a, 0x30, 0xbb, 0xed, 0x28, 0x4b, 0xb3, 0xdb, 0x0e, 0xfa, 0xbd, 0xf5,
0x7c, 0x5b, 0x58, 0xc9, 0x53, 0x1c, 0xf6, 0xd0, 0x46, 0x46, 0x43, 0x1b, 0x6b, 0x50, 0x1e, 0x38,
0xaa, 0xc8, 0x44, 0x83, 0xd3, 0x38, 0xd9, 0x32, 0x8e, 0xa5, 0x1b, 0x5e, 0x2c, 0x74, 0x09, 0x37,
0xbc, 0xd8, 0xba, 0x0e, 0xe5, 0x81, 0xe4, 0x22, 0x93, 0x78, 0x09, 0x2b, 0x50, 0x8a, 0xe3, 0x15,
0x06, 0x0b, 0x43, 0x1f, 0xc7, 0xc8, 0x0d, 0xc8, 0xc9, 0x8f, 0x30, 0xd5, 0x19, 0xf3, 0xca, 0xd7,
0xdf, 0x2c, 0xbe, 0x3b, 0xc4, 0x20, 0x17, 0x91, 0x6d, 0xbd, 0xeb, 0x3b, 0x1e, 0xab, 0x1a, 0x63,
0xd9, 0xe4, 0xa2, 0x99, 0xfd, 0xcd, 0x1f, 0xae, 0xce, 0xac, 0xd8, 0x70, 0x69, 0xe4, 0xc3, 0x0e,
0xb9, 0x0e, 0xd9, 0x03, 0xe6, 0xb5, 0x13, 0x33, 0x23, 0x0c, 0xb8, 0x48, 0xae, 0x41, 0x86, 0xda,
0xa7, 0x55, 0xc3, 0xac, 0x7d, 0xfd, 0xcd, 0xe2, 0xe5, 0xd1, 0xaf, 0x43, 0xf6, 0xa9, 0x34, 0xb1,
0xfa, 0x57, 0x80, 0xc2, 0xde, 0xde, 0xfa, 0x7a, 0xe4, 0x3a, 0x1d, 0x46, 0x7e, 0x65, 0x00, 0x19,
0x7d, 0x33, 0x93, 0x7b, 0xe9, 0x0d, 0x61, 0xfc, 0x37, 0x0a, 0xf3, 0xfe, 0x94, 0x52, 0x0a, 0xb2,
0x7c, 0x0e, 0x73, 0x02, 0x67, 0x93, 0x8f, 0x26, 0x7c, 0x6e, 0x99, 0xcb, 0x17, 0x33, 0x2a, 0xdd,
0x2d, 0xc8, 0x27, 0x58, 0x95, 0xac, 0xa4, 0x6e, 0x6f, 0x00, 0x8a, 0x9b, 0xb7, 0x26, 0xe2, 0x55,
0x46, 0x7e, 0x0e, 0xf3, 0x0a, 0x82, 0x92, 0x9b, 0x17, 0xc8, 0xf5, 0xc1, 0xb0, 0xb9, 0x32, 0x09,
0x6b, 0xdf, 0x8d, 0x04, 0x6a, 0xa6, 0xba, 0x31, 0x04, 0x64, 0x53, 0xdd, 0x18, 0xc1, 0xae, 0xad,
0xfe, 0x03, 0x35, 0xd5, 0xc8, 0x10, 0x70, 0x4d, 0x35, 0x32, 0x8c, 0x5f, 0xc9, 0x4b, 0xc8, 0x22,
0x7e, 0x25, 0x69, 0xbd, 0x5a, 0x03, 0xb8, 0x66, 0xda, 0x99, 0x18, 0x00, 0xbe, 0x3f, 0xc3, 0x3b,
0x4d, 0x7c, 0x8b, 0x48, 0xbf, 0xcd, 0xb4, 0x6f, 0x97, 0xe6, 0xcd, 0x09, 0x38, 0xfb, 0xea, 0xd5,
0x3b, 0x7e, 0x79, 0x82, 0x0f, 0x88, 0x17, 0xab, 0x1f, 0xfa, 0x54, 0x19, 0x40, 0x49, 0x87, 0x2a,
0xa4, 0x9e, 0x22, 0x3a, 0x06, 0x01, 0x9a, 0x8d, 0x89, 0xf9, 0x95, 0xc1, 0xaf, 0xf0, 0x11, 0x37,
0x08, 0x63, 0xc8, 0x6a, 0x6a, 0x38, 0xc6, 0x02, 0x26, 0xf3, 0xee, 0x54, 0x32, 0xca, 0xb8, 0x2d,
0x61, 0x92, 0x82, 0x42, 0x24, 0xfd, 0xd6, 0xef, 0xc1, 0x29, 0x73, 0x42, 0xbe, 0x65, 0xe3, 0x8e,
0x81, 0xe7, 0x0c, 0xa1, 0x73, 0xaa, 0x6e, 0xed, 0x4d, 0x91, 0x7a, 0xce, 0x74, 0x0c, 0xbe, 0x5e,
0xfa, 0xee, 0xcd, 0x55, 0xe3, 0x1f, 0x6f, 0xae, 0x1a, 0xff, 0x7a, 0x73, 0xd5, 0x38, 0xcc, 0x89,
0x7f, 0x64, 0xef, 0xfe, 0x37, 0x00, 0x00, 0xff, 0xff, 0x20, 0x47, 0x7d, 0x27, 0x1a, 0x1f, 0x00,
0x00,
0x7a, 0x3b, 0x0a, 0x7c, 0xce, 0x7c, 0xc7, 0x5c, 0xed, 0xb8, 0xfc, 0xa8, 0x7b, 0x58, 0x6f, 0x05,
0xc7, 0x8d, 0x4e, 0xd0, 0x09, 0x1a, 0x9d, 0x20, 0xe8, 0x78, 0xcc, 0x0e, 0xdd, 0x58, 0x0d, 0x1b,
0x51, 0xd8, 0x6a, 0xc4, 0xdc, 0xe6, 0xdd, 0x58, 0xaa, 0x33, 0x3f, 0x1e, 0x96, 0x11, 0xe4, 0xc3,
0x6e, 0x5b, 0xcc, 0xc4, 0x44, 0x8c, 0x14, 0x7b, 0x43, 0x63, 0xc7, 0x8d, 0x34, 0x92, 0x8d, 0x34,
0xec, 0xd0, 0x6d, 0xf0, 0xb3, 0x90, 0xc5, 0x8d, 0xd3, 0x20, 0x7a, 0xc5, 0x22, 0x25, 0x70, 0xfb,
0x5c, 0x81, 0x38, 0xf0, 0x4e, 0x58, 0xd4, 0x08, 0x0f, 0x1b, 0x41, 0x98, 0xec, 0xe6, 0x7e, 0x0a,
0x77, 0x37, 0x6a, 0xb1, 0x30, 0xf0, 0xdc, 0xd6, 0x19, 0xca, 0xc8, 0x91, 0x12, 0xbb, 0x7b, 0xae,
0x58, 0x97, 0xbb, 0x1e, 0x6e, 0xad, 0x65, 0x87, 0x31, 0x8a, 0xe1, 0xef, 0x18, 0xcf, 0x79, 0xe0,
0xbb, 0x31, 0x77, 0xdd, 0x8e, 0xdb, 0x68, 0xc7, 0x42, 0x46, 0xba, 0x82, 0xa1, 0x92, 0xec, 0xd6,
0xdf, 0xb2, 0x90, 0xa3, 0x2c, 0xee, 0x7a, 0x9c, 0x2c, 0x41, 0x39, 0x62, 0xed, 0x4d, 0x16, 0x46,
0xac, 0x65, 0x73, 0xe6, 0xd4, 0x8c, 0x45, 0x63, 0xb9, 0xb0, 0x33, 0x43, 0x07, 0xc9, 0xe4, 0x27,
0x50, 0x89, 0x58, 0x3b, 0xd6, 0x18, 0x67, 0x17, 0x8d, 0xe5, 0xe2, 0xea, 0xad, 0xfa, 0xb9, 0x39,
0xac, 0x53, 0xd6, 0xde, 0xb7, 0xc3, 0xbe, 0xc8, 0xce, 0x0c, 0x1d, 0x52, 0x42, 0x56, 0x21, 0x13,
0xb1, 0x76, 0x2d, 0x23, 0x74, 0x5d, 0x4d, 0xd7, 0xb5, 0x33, 0x43, 0x91, 0x99, 0xac, 0x41, 0x16,
0xb5, 0xd4, 0xb2, 0x42, 0xe8, 0xda, 0x85, 0x1b, 0xd8, 0x99, 0xa1, 0x42, 0x80, 0x3c, 0x85, 0xfc,
0x31, 0xe3, 0xb6, 0x63, 0x73, 0xbb, 0x06, 0x8b, 0x99, 0xe5, 0xe2, 0x6a, 0x23, 0x55, 0x18, 0x03,
0x54, 0xdf, 0x57, 0x12, 0x5b, 0x3e, 0x8f, 0xce, 0x68, 0x4f, 0x01, 0x79, 0x09, 0x25, 0x9b, 0x73,
0x86, 0x51, 0x75, 0x03, 0x3f, 0xae, 0x95, 0x84, 0xc2, 0xbb, 0x17, 0x2b, 0x7c, 0xa2, 0x49, 0x49,
0xa5, 0x03, 0x8a, 0xcc, 0x47, 0x50, 0x1e, 0xb0, 0x49, 0xaa, 0x90, 0x79, 0xc5, 0xce, 0x64, 0x62,
0x28, 0x0e, 0xc9, 0x65, 0x98, 0x3b, 0xb1, 0xbd, 0x2e, 0x13, 0x39, 0x28, 0x51, 0x39, 0x79, 0x38,
0xfb, 0xc0, 0x30, 0x8f, 0xe0, 0xd2, 0x88, 0xfe, 0x31, 0x0a, 0x7e, 0xa4, 0x2b, 0x28, 0xae, 0x7e,
0x94, 0xb2, 0x6b, 0x5d, 0x9d, 0x66, 0x69, 0x3d, 0x0f, 0xb9, 0x48, 0x38, 0x64, 0xfd, 0xce, 0x80,
0xea, 0x70, 0xaa, 0xc9, 0xae, 0x4a, 0x92, 0x21, 0xc2, 0x72, 0x7f, 0x8a, 0x53, 0x82, 0x04, 0x15,
0x18, 0xa1, 0xc2, 0x5c, 0x83, 0x42, 0x8f, 0x74, 0x51, 0x30, 0x0a, 0xda, 0x16, 0xad, 0x35, 0xc8,
0x50, 0xd6, 0x26, 0x15, 0x98, 0x75, 0xd5, 0xb9, 0xa6, 0xb3, 0xae, 0x43, 0x16, 0x21, 0xe3, 0xb0,
0xb6, 0x72, 0xbd, 0x52, 0x0f, 0x0f, 0xeb, 0x9b, 0xac, 0xed, 0xfa, 0x2e, 0xba, 0x48, 0x71, 0xc9,
0xfa, 0xbd, 0x81, 0xf5, 0x81, 0xdb, 0x22, 0x9f, 0x0c, 0xf8, 0x71, 0xf1, 0x69, 0x1f, 0xd9, 0xfd,
0xcb, 0xf4, 0xdd, 0xdf, 0x1b, 0xcc, 0xc4, 0x05, 0x25, 0xa0, 0x7b, 0xf7, 0x53, 0x28, 0xe9, 0xb9,
0x21, 0x3b, 0x50, 0xd4, 0xce, 0x91, 0xda, 0xf0, 0xd2, 0x64, 0x99, 0xa5, 0xba, 0xa8, 0xf5, 0xc7,
0x0c, 0x14, 0xb5, 0x45, 0xf2, 0x18, 0xb2, 0xaf, 0x5c, 0x5f, 0x86, 0xb0, 0xb2, 0xba, 0x32, 0x99,
0xca, 0xa7, 0xae, 0xef, 0x50, 0x21, 0x47, 0x9a, 0x5a, 0xdd, 0xcd, 0x8a, 0x6d, 0xdd, 0x9b, 0x4c,
0xc7, 0xb9, 0xc5, 0x77, 0x67, 0x8a, 0xb6, 0x21, 0x9b, 0x06, 0x81, 0x6c, 0x68, 0xf3, 0x23, 0xd1,
0x34, 0x0a, 0x54, 0x8c, 0xc9, 0x1d, 0x78, 0xc7, 0xf5, 0x5f, 0x04, 0x3c, 0x68, 0x46, 0xcc, 0x71,
0xf1, 0xf0, 0xbd, 0x38, 0x0b, 0x59, 0x6d, 0x4e, 0xb0, 0x8c, 0x5b, 0x22, 0x4d, 0xa8, 0x48, 0xf2,
0x41, 0xf7, 0xf0, 0x17, 0xac, 0xc5, 0xe3, 0x5a, 0x4e, 0xf8, 0xb3, 0x9c, 0xb2, 0x85, 0x5d, 0x5d,
0x80, 0x0e, 0xc9, 0xbf, 0x55, 0xb5, 0x5b, 0x7f, 0x31, 0xa0, 0x3c, 0xa0, 0x9e, 0x7c, 0x3a, 0x90,
0xaa, 0xdb, 0x93, 0x6e, 0x4b, 0x4b, 0xd6, 0x67, 0x90, 0x73, 0xdc, 0x0e, 0x8b, 0xb9, 0x48, 0x55,
0x61, 0x7d, 0xf5, 0xbb, 0xef, 0x3f, 0x98, 0xf9, 0xe7, 0xf7, 0x1f, 0xac, 0x68, 0x57, 0x4c, 0x10,
0x32, 0xbf, 0x15, 0xf8, 0xdc, 0x76, 0x7d, 0x16, 0xe1, 0x7d, 0xfc, 0xb1, 0x14, 0xa9, 0x6f, 0x8a,
0x1f, 0xaa, 0x34, 0x60, 0xd0, 0x7d, 0xfb, 0x98, 0x89, 0x3c, 0x15, 0xa8, 0x18, 0x5b, 0x1c, 0xca,
0x94, 0xf1, 0x6e, 0xe4, 0x53, 0xf6, 0xcb, 0x2e, 0x32, 0xfd, 0x20, 0x69, 0x24, 0x62, 0xd3, 0x17,
0x35, 0x74, 0x64, 0xa4, 0x4a, 0x80, 0x2c, 0xc3, 0x1c, 0x8b, 0xa2, 0x20, 0x52, 0xc5, 0x43, 0xea,
0x12, 0x19, 0xd4, 0xa3, 0xb0, 0x55, 0x3f, 0x10, 0xc8, 0x80, 0x4a, 0x06, 0xab, 0x0a, 0x95, 0xc4,
0x6a, 0x1c, 0x06, 0x7e, 0xcc, 0xac, 0x05, 0x0c, 0x5d, 0xd8, 0xe5, 0xb1, 0xda, 0x87, 0xf5, 0xad,
0x01, 0x95, 0x84, 0x22, 0x79, 0xc8, 0x17, 0x50, 0xec, 0xb7, 0x86, 0xa4, 0x07, 0x3c, 0x4c, 0x0d,
0xaa, 0x2e, 0xaf, 0xf5, 0x15, 0xd5, 0x12, 0x74, 0x75, 0xe6, 0x33, 0xa8, 0x0e, 0x33, 0x8c, 0xc9,
0xfe, 0x87, 0x83, 0x0d, 0x62, 0xb8, 0x5f, 0x69, 0xa7, 0xe1, 0xdb, 0x59, 0xb8, 0x42, 0x99, 0x80,
0x22, 0xbb, 0xc7, 0x76, 0x87, 0x6d, 0x04, 0x7e, 0xdb, 0xed, 0x24, 0x61, 0xae, 0x8a, 0x66, 0x98,
0x68, 0xc6, 0xbe, 0xb8, 0x0c, 0xf9, 0xa6, 0x67, 0xf3, 0x76, 0x10, 0x1d, 0x2b, 0xe5, 0x25, 0x54,
0x9e, 0xd0, 0x68, 0x6f, 0x95, 0x2c, 0x42, 0x51, 0x29, 0xde, 0x0f, 0x9c, 0x24, 0x9d, 0x3a, 0x89,
0xd4, 0x60, 0x7e, 0x2f, 0xe8, 0x3c, 0xc3, 0x64, 0xcb, 0x0a, 0x4b, 0xa6, 0xc4, 0x82, 0x92, 0x62,
0x8c, 0x7a, 0xd5, 0x35, 0x47, 0x07, 0x68, 0xe4, 0x7d, 0x28, 0x1c, 0xb0, 0x38, 0x76, 0x03, 0x7f,
0x77, 0xb3, 0x96, 0x13, 0xf2, 0x7d, 0x02, 0xea, 0x3e, 0xe0, 0x41, 0xc4, 0x76, 0x37, 0x6b, 0xf3,
0x52, 0xb7, 0x9a, 0x92, 0x7d, 0xa8, 0x1c, 0x08, 0x2c, 0xd5, 0x44, 0x04, 0xe5, 0xb2, 0xb8, 0x96,
0x17, 0x29, 0xba, 0x31, 0x9a, 0x22, 0x1d, 0x73, 0xd5, 0x05, 0xfb, 0x19, 0x1d, 0x12, 0xb6, 0x7e,
0x6b, 0x80, 0x39, 0x2e, 0x80, 0xea, 0x34, 0x7c, 0x06, 0x39, 0x79, 0xbe, 0x65, 0x10, 0xff, 0xb7,
0xca, 0x90, 0xbf, 0xe4, 0x3d, 0xc8, 0x49, 0xed, 0xaa, 0xa8, 0xd5, 0x2c, 0xc9, 0x52, 0xa6, 0x97,
0x25, 0xeb, 0xd7, 0x39, 0x28, 0x1d, 0xe0, 0x96, 0x92, 0x44, 0xd6, 0x01, 0xfa, 0xf9, 0x57, 0x35,
0x33, 0x7c, 0x2a, 0x34, 0x0e, 0x62, 0x42, 0x7e, 0x5b, 0x9d, 0x4f, 0x75, 0x45, 0xf6, 0xe6, 0xe4,
0x73, 0x28, 0x26, 0xe3, 0xe7, 0x21, 0xaf, 0x65, 0x44, 0xf4, 0x1e, 0xa4, 0x1c, 0x70, 0x7d, 0x27,
0x75, 0x4d, 0x54, 0x1d, 0x6f, 0x8d, 0x42, 0x6e, 0xc3, 0x25, 0xdb, 0xf3, 0x82, 0x53, 0x55, 0xb3,
0xa2, 0xfa, 0x44, 0xf6, 0xf3, 0x74, 0x74, 0x01, 0x7b, 0xb1, 0x46, 0x7c, 0x12, 0x45, 0xf6, 0x19,
0x06, 0x22, 0x27, 0xf8, 0xc7, 0x2d, 0x61, 0x5b, 0xdc, 0x76, 0x7d, 0xdb, 0xab, 0x81, 0xe0, 0x91,
0x13, 0x3c, 0x6e, 0x5b, 0xaf, 0xc3, 0x20, 0xe2, 0x2c, 0x7a, 0xc2, 0x79, 0x54, 0x2b, 0x8a, 0xf0,
0x0e, 0xd0, 0x48, 0x13, 0x4a, 0x1b, 0x76, 0xeb, 0x88, 0xed, 0x1e, 0x23, 0x31, 0x81, 0x6e, 0x69,
0xcd, 0x52, 0xb0, 0x3f, 0x0f, 0x75, 0xcc, 0xa6, 0x6b, 0x20, 0x2d, 0xa8, 0x24, 0xae, 0xcb, 0x16,
0x50, 0x2b, 0x0b, 0x9d, 0x8f, 0xa6, 0x0d, 0xa5, 0x94, 0x96, 0x26, 0x86, 0x54, 0x62, 0x22, 0xb7,
0xb0, 0xda, 0x6d, 0xce, 0x6a, 0x15, 0xe1, 0x73, 0x6f, 0x3e, 0xa6, 0x12, 0x16, 0xde, 0xa2, 0x12,
0xcc, 0xc7, 0x50, 0x1d, 0x4e, 0xee, 0x34, 0xc8, 0xcb, 0xfc, 0x31, 0xbc, 0x33, 0xc6, 0xa3, 0xb7,
0xea, 0x6e, 0x7f, 0x36, 0xe0, 0xd2, 0x48, 0x1a, 0xf0, 0x86, 0x11, 0x5d, 0x45, 0xaa, 0x14, 0x63,
0xb2, 0x0f, 0x73, 0x98, 0xe6, 0x58, 0x61, 0x8d, 0xb5, 0x69, 0xf2, 0x5a, 0x17, 0x92, 0x32, 0xfe,
0x52, 0x8b, 0xf9, 0x00, 0xa0, 0x4f, 0x9c, 0x0a, 0x7f, 0x7e, 0x01, 0x65, 0x95, 0x64, 0xd5, 0x41,
0xaa, 0x12, 0xb6, 0x28, 0x61, 0x84, 0x25, 0xfd, 0xcb, 0x2f, 0x33, 0xe5, 0xe5, 0x67, 0x7d, 0x05,
0x0b, 0x94, 0xd9, 0xce, 0xb6, 0xeb, 0xb1, 0xf3, 0x7b, 0x3c, 0x16, 0xbf, 0xeb, 0xb1, 0x26, 0x42,
0x9f, 0xa4, 0xf8, 0xd5, 0x9c, 0x3c, 0x84, 0x39, 0x6a, 0xfb, 0x1d, 0xa6, 0x4c, 0x7f, 0x98, 0x62,
0x5a, 0x18, 0x41, 0x5e, 0x2a, 0x45, 0xac, 0x47, 0x50, 0xe8, 0xd1, 0xb0, 0x99, 0x3d, 0x6f, 0xb7,
0x63, 0x26, 0x1b, 0x63, 0x86, 0xaa, 0x19, 0xd2, 0xf7, 0x98, 0xdf, 0x51, 0xa6, 0x33, 0x54, 0xcd,
0xac, 0x25, 0x7c, 0x2f, 0x24, 0x3b, 0x57, 0xa1, 0x21, 0x90, 0xdd, 0x44, 0x7c, 0x68, 0x88, 0x7a,
0x15, 0x63, 0xcb, 0xc1, 0x4b, 0xdb, 0x76, 0x36, 0xdd, 0xe8, 0x7c, 0x07, 0x6b, 0x30, 0xbf, 0xe9,
0x46, 0x9a, 0x7f, 0xc9, 0x94, 0x2c, 0xe1, 0x75, 0xde, 0xf2, 0xba, 0x0e, 0x7a, 0xcb, 0x59, 0xe4,
0xab, 0xae, 0x3a, 0x44, 0xb5, 0x3e, 0x91, 0x71, 0x14, 0x56, 0xd4, 0x66, 0x6e, 0xc3, 0x3c, 0xf3,
0x79, 0x84, 0x65, 0x24, 0xef, 0x7c, 0x52, 0x97, 0x4f, 0xe9, 0xba, 0x78, 0x4a, 0x0b, 0x6c, 0x41,
0x13, 0x16, 0x6b, 0x0d, 0x16, 0x90, 0x90, 0x9e, 0x08, 0x02, 0x59, 0x6d, 0x93, 0x62, 0x6c, 0x3d,
0x84, 0x6a, 0x5f, 0x50, 0x99, 0x5e, 0x82, 0x2c, 0x82, 0x5f, 0xd5, 0xd7, 0xc7, 0xd9, 0x15, 0xeb,
0xd6, 0x75, 0x58, 0x48, 0x8a, 0xff, 0x5c, 0xa3, 0x16, 0x81, 0x6a, 0x9f, 0x49, 0xe1, 0x9e, 0x32,
0x14, 0x9b, 0xae, 0x9f, 0xc0, 0x02, 0xeb, 0x8d, 0x01, 0xa5, 0x66, 0xe0, 0xf7, 0x6f, 0xb9, 0x26,
0x2c, 0x24, 0xa5, 0xfb, 0xa4, 0xb9, 0xbb, 0x61, 0x87, 0x49, 0x0c, 0x16, 0x47, 0xcf, 0x87, 0xfa,
0x18, 0x51, 0x97, 0x8c, 0xeb, 0x59, 0xbc, 0x10, 0xe9, 0xb0, 0x38, 0xf9, 0x14, 0xe6, 0xf7, 0xf6,
0xd6, 0x85, 0xa6, 0xd9, 0xa9, 0x34, 0x25, 0x62, 0xe4, 0x31, 0xcc, 0xbf, 0x14, 0x1f, 0x62, 0x62,
0x75, 0x45, 0x8d, 0x39, 0xab, 0x32, 0x42, 0x92, 0x8d, 0xb2, 0x56, 0x10, 0x39, 0x34, 0x11, 0xb2,
0xfe, 0x6d, 0x40, 0xf1, 0xa5, 0xdd, 0x87, 0x9c, 0x7d, 0x8c, 0xfb, 0x16, 0x37, 0xb9, 0xc2, 0xb8,
0x97, 0x61, 0xce, 0x63, 0x27, 0xcc, 0x53, 0x67, 0x5c, 0x4e, 0x90, 0x1a, 0x1f, 0x05, 0x91, 0x2c,
0xeb, 0x12, 0x95, 0x13, 0x2c, 0x08, 0x87, 0x71, 0xdb, 0xf5, 0x6a, 0xd9, 0xc5, 0x0c, 0xde, 0xfa,
0x72, 0x86, 0x99, 0xeb, 0x46, 0x9e, 0x7a, 0x78, 0xe0, 0x90, 0x58, 0x90, 0x75, 0xfd, 0x76, 0x20,
0xee, 0x3f, 0xd5, 0x16, 0x65, 0x8b, 0xde, 0xf5, 0xdb, 0x01, 0x15, 0x6b, 0xe4, 0x1a, 0xe4, 0x22,
0xac, 0xbf, 0xb8, 0x36, 0x2f, 0x82, 0x52, 0x40, 0x2e, 0x59, 0xa5, 0x6a, 0xc1, 0xaa, 0x40, 0x49,
0xfa, 0xad, 0x92, 0xff, 0xa7, 0x59, 0x78, 0xe7, 0x19, 0x3b, 0xdd, 0x48, 0xfc, 0x4a, 0x02, 0xb2,
0x08, 0xc5, 0x1e, 0x6d, 0x77, 0x53, 0x1d, 0x21, 0x9d, 0x84, 0xc6, 0xf6, 0x83, 0xae, 0xcf, 0x93,
0x1c, 0x0a, 0x63, 0x82, 0x42, 0xd5, 0x02, 0xb9, 0x01, 0xf3, 0xcf, 0x18, 0x3f, 0x0d, 0xa2, 0x57,
0xc2, 0xeb, 0xca, 0x6a, 0x11, 0x79, 0x9e, 0x31, 0x8e, 0x08, 0x91, 0x26, 0x6b, 0x08, 0x3b, 0xc3,
0x04, 0x76, 0x66, 0xc7, 0xc1, 0xce, 0x64, 0x95, 0xac, 0x41, 0xb1, 0x15, 0xf8, 0x31, 0x8f, 0x6c,
0x17, 0x0d, 0xcf, 0x09, 0xe6, 0x77, 0x91, 0x59, 0x26, 0x76, 0xa3, 0xbf, 0x48, 0x75, 0x4e, 0xb2,
0x02, 0xc0, 0x5e, 0xf3, 0xc8, 0xde, 0x09, 0xe2, 0xde, 0x13, 0x0d, 0x50, 0x0e, 0x09, 0xbb, 0x4d,
0xaa, 0xad, 0x62, 0x87, 0x3c, 0x0a, 0x62, 0x2e, 0xde, 0x29, 0x12, 0x5e, 0xf6, 0xe6, 0xd6, 0x7b,
0x70, 0x79, 0x30, 0x5a, 0x2a, 0x8c, 0x8f, 0xe0, 0xff, 0x28, 0xf3, 0x98, 0x1d, 0xb3, 0xe9, 0x23,
0x69, 0x99, 0x50, 0x1b, 0x15, 0x56, 0x8a, 0xff, 0x93, 0x81, 0xe2, 0xd6, 0x6b, 0xd6, 0xda, 0x67,
0x71, 0x6c, 0x77, 0x04, 0x30, 0x6e, 0x46, 0x41, 0x8b, 0xc5, 0x71, 0x4f, 0x57, 0x9f, 0x40, 0x7e,
0x08, 0xd9, 0x5d, 0xdf, 0xe5, 0xea, 0xee, 0x5c, 0x4a, 0x7d, 0x97, 0xb8, 0x5c, 0xe9, 0xdc, 0x99,
0xa1, 0x42, 0x8a, 0x3c, 0x84, 0x2c, 0x76, 0x9e, 0x49, 0xba, 0xbf, 0xa3, 0xc9, 0xa2, 0x0c, 0x59,
0x17, 0xdf, 0x0f, 0xdd, 0x2f, 0x99, 0xca, 0xe0, 0x72, 0xfa, 0xb5, 0xe5, 0x7e, 0xc9, 0xfa, 0x1a,
0x94, 0x24, 0xd9, 0x42, 0x58, 0x6f, 0x47, 0x9c, 0x39, 0x2a, 0xb3, 0x37, 0xd3, 0xc0, 0x92, 0xe4,
0xec, 0x6b, 0x49, 0x64, 0x31, 0x08, 0x5b, 0xaf, 0x5d, 0xae, 0x2a, 0x25, 0x2d, 0x08, 0xc8, 0xa6,
0x39, 0x82, 0x53, 0x94, 0xde, 0x0c, 0x7c, 0x99, 0xf9, 0x74, 0x69, 0x64, 0xd3, 0xa4, 0x71, 0x8a,
0x61, 0x38, 0x70, 0x3b, 0x88, 0x41, 0xf3, 0x17, 0x86, 0x41, 0x32, 0x6a, 0x61, 0x90, 0x84, 0xf5,
0x79, 0x98, 0x13, 0x10, 0xc9, 0xfa, 0xbb, 0x01, 0x45, 0x2d, 0x4f, 0x13, 0xd4, 0xe4, 0xfb, 0x90,
0xdd, 0x67, 0xe2, 0x9b, 0x0a, 0x1a, 0xcf, 0x8b, 0x8a, 0x64, 0xdc, 0xa6, 0x82, 0x8a, 0x4d, 0x65,
0xdb, 0x91, 0x0d, 0xb3, 0x4c, 0x71, 0x88, 0x94, 0x17, 0xfc, 0x4c, 0xa4, 0x2c, 0x4f, 0x71, 0x48,
0x6e, 0x43, 0xfe, 0x80, 0xb5, 0xba, 0x91, 0xcb, 0xcf, 0x44, 0x12, 0x2a, 0xab, 0x55, 0xd1, 0x6a,
0x14, 0x4d, 0x14, 0x6e, 0x8f, 0x83, 0xdc, 0x82, 0x42, 0xcc, 0x5a, 0x11, 0xe3, 0xcc, 0x3f, 0x51,
0x55, 0x55, 0x56, 0xec, 0x11, 0xe3, 0x5b, 0xfe, 0x09, 0xed, 0xaf, 0x5b, 0x4f, 0xf1, 0x24, 0xf7,
0xbd, 0x21, 0x90, 0xdd, 0xc0, 0xb7, 0x23, 0xba, 0x51, 0xa6, 0x62, 0x8c, 0xcf, 0xf7, 0xad, 0x8b,
0x9e, 0xef, 0x5b, 0xc9, 0xf3, 0x7d, 0xf0, 0x04, 0xe0, 0x35, 0xa6, 0x65, 0xc4, 0x7a, 0x02, 0x85,
0xde, 0x29, 0x25, 0x15, 0x98, 0xdd, 0x76, 0x94, 0xa5, 0xd9, 0x6d, 0x07, 0xfd, 0xde, 0x7a, 0xbe,
0x2d, 0xac, 0xe4, 0x29, 0x0e, 0x7b, 0x68, 0x23, 0xa3, 0xa1, 0x8d, 0x35, 0x28, 0x0f, 0x1c, 0x55,
0x64, 0xa2, 0xc1, 0x69, 0x9c, 0x6c, 0x19, 0xc7, 0xd2, 0x0d, 0x2f, 0x16, 0xba, 0x84, 0x1b, 0x5e,
0x6c, 0x5d, 0x87, 0xf2, 0x40, 0x72, 0x91, 0x49, 0xbc, 0x84, 0x15, 0x28, 0xc5, 0xf1, 0x0a, 0x83,
0x85, 0xa1, 0x8f, 0x63, 0xe4, 0x06, 0xe4, 0xe4, 0x47, 0x98, 0xea, 0x8c, 0x79, 0xe5, 0xeb, 0x6f,
0x16, 0xdf, 0x1d, 0x62, 0x90, 0x8b, 0xc8, 0xb6, 0xde, 0xf5, 0x1d, 0x8f, 0x55, 0x8d, 0xb1, 0x6c,
0x72, 0xd1, 0xcc, 0xfe, 0xe6, 0x0f, 0x57, 0x67, 0x56, 0x6c, 0xb8, 0x34, 0xf2, 0x61, 0x87, 0x5c,
0x87, 0xec, 0x01, 0xf3, 0xda, 0x89, 0x99, 0x11, 0x06, 0x5c, 0x24, 0xd7, 0x20, 0x43, 0xed, 0xd3,
0xaa, 0x61, 0xd6, 0xbe, 0xfe, 0x66, 0xf1, 0xf2, 0xe8, 0xd7, 0x21, 0xfb, 0x54, 0x9a, 0x58, 0xfd,
0x2b, 0x40, 0x61, 0x6f, 0x6f, 0x7d, 0x3d, 0x72, 0x9d, 0x0e, 0x23, 0xbf, 0x32, 0x80, 0x8c, 0xbe,
0x99, 0xc9, 0xbd, 0xf4, 0x86, 0x30, 0xfe, 0x1b, 0x85, 0x79, 0x7f, 0x4a, 0x29, 0x05, 0x59, 0x3e,
0x87, 0x39, 0x81, 0xb3, 0xc9, 0x47, 0x13, 0x3e, 0xb7, 0xcc, 0xe5, 0x8b, 0x19, 0x95, 0xee, 0x16,
0xe4, 0x13, 0xac, 0x4a, 0x56, 0x52, 0xb7, 0x37, 0x00, 0xc5, 0xcd, 0x5b, 0x13, 0xf1, 0x2a, 0x23,
0x3f, 0x87, 0x79, 0x05, 0x41, 0xc9, 0xcd, 0x0b, 0xe4, 0xfa, 0x60, 0xd8, 0x5c, 0x99, 0x84, 0xb5,
0xef, 0x46, 0x02, 0x35, 0x53, 0xdd, 0x18, 0x02, 0xb2, 0xa9, 0x6e, 0x8c, 0x60, 0xd7, 0x56, 0xff,
0x81, 0x9a, 0x6a, 0x64, 0x08, 0xb8, 0xa6, 0x1a, 0x19, 0xc6, 0xaf, 0xe4, 0x25, 0x64, 0x11, 0xbf,
0x92, 0xb4, 0x5e, 0xad, 0x01, 0x5c, 0x33, 0xed, 0x4c, 0x0c, 0x00, 0xdf, 0x9f, 0xe1, 0x9d, 0x26,
0xbe, 0x45, 0xa4, 0xdf, 0x66, 0xda, 0xb7, 0x4b, 0xf3, 0xe6, 0x04, 0x9c, 0x7d, 0xf5, 0xea, 0x1d,
0xbf, 0x3c, 0xc1, 0x07, 0xc4, 0x8b, 0xd5, 0x0f, 0x7d, 0xaa, 0x0c, 0xa0, 0xa4, 0x43, 0x15, 0x52,
0x4f, 0x11, 0x1d, 0x83, 0x00, 0xcd, 0xc6, 0xc4, 0xfc, 0xca, 0xe0, 0x57, 0xf8, 0x88, 0x1b, 0x84,
0x31, 0x64, 0x35, 0x35, 0x1c, 0x63, 0x01, 0x93, 0x79, 0x77, 0x2a, 0x19, 0x65, 0xdc, 0x96, 0x30,
0x49, 0x41, 0x21, 0x92, 0x7e, 0xeb, 0xf7, 0xe0, 0x94, 0x39, 0x21, 0xdf, 0xb2, 0x71, 0xc7, 0xc0,
0x73, 0x86, 0xd0, 0x39, 0x55, 0xb7, 0xf6, 0xa6, 0x48, 0x3d, 0x67, 0x3a, 0x06, 0x5f, 0x2f, 0x7d,
0xf7, 0xe6, 0xaa, 0xf1, 0x8f, 0x37, 0x57, 0x8d, 0x7f, 0xbd, 0xb9, 0x6a, 0x1c, 0xe6, 0xc4, 0x3f,
0xb2, 0x77, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x83, 0xe1, 0x34, 0x1a, 0x1a, 0x1f, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.

@ -2,15 +2,13 @@ syntax = "proto3";
package moby.buildkit.v1.frontend;
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
import "github.com/gogo/googleapis/google/rpc/status.proto";
import "github.com/moby/buildkit/solver/pb/ops.proto";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
import "github.com/moby/buildkit/api/types/worker.proto";
import "github.com/moby/buildkit/solver/pb/ops.proto";
import "github.com/moby/buildkit/sourcepolicy/pb/policy.proto";
import "github.com/moby/buildkit/util/apicaps/pb/caps.proto";
import "github.com/tonistiigi/fsutil/types/stat.proto";
import "github.com/moby/buildkit/sourcepolicy/pb/policy.proto";
option (gogoproto.sizer_all) = true;
option (gogoproto.marshaler_all) = true;
@ -167,7 +165,7 @@ message SolveResponse {
// deprecated
string ref = 1; // can be used by readfile request
// deprecated
/* bytes ExporterAttr = 2;*/
// bytes ExporterAttr = 2;
// these fields are returned when allowMapReturn was set
Result result = 3;

@ -277,7 +277,7 @@ func (sp *fsSyncTarget) DiffCopy(stream FileSend_DiffCopyServer) (err error) {
}
defer func() {
err1 := wc.Close()
if err != nil {
if err == nil {
err = err1
}
}()
@ -351,13 +351,13 @@ func decodeOpts(opts map[string][]string) map[string][]string {
md := make(map[string][]string, len(opts))
for k, v := range opts {
out := make([]string, len(v))
var isDecoded bool
var isEncoded bool
if v, ok := opts[k+"-encoded"]; ok && len(v) > 0 {
if b, _ := strconv.ParseBool(v[0]); b {
isDecoded = true
isEncoded = true
}
}
if isDecoded {
if isEncoded {
for i, s := range v {
out[i], _ = url.QueryUnescape(s)
}
@ -373,13 +373,14 @@ func decodeOpts(opts map[string][]string) map[string][]string {
// is backwards compatible and avoids encoding ASCII characters.
func encodeStringForHeader(inputs []string) ([]string, bool) {
var encode bool
loop:
for _, input := range inputs {
for _, runeVal := range input {
// Only encode non-ASCII characters, and characters that have special
// meaning during decoding.
if runeVal > unicode.MaxASCII {
encode = true
break
break loop
}
}
}

@ -15,7 +15,6 @@ service FileSend{
rpc DiffCopy(stream BytesMessage) returns (stream BytesMessage);
}
// BytesMessage contains a chunk of byte data
message BytesMessage{
bytes data = 1;

@ -63,14 +63,13 @@ func GetLogger(ctx context.Context) (l *logrus.Entry) {
return l
}
// LazyStackTrace lets you include a stack trace as a field's value in a log but only
// call it when the log level is actually enabled.
type LazyStackTrace struct{}
func (LazyStackTrace) String() string {
// TraceLevelOnlyStack returns a stack trace for the current goroutine only if
// trace level logs are enabled; otherwise it returns an empty string. This ensure
// we only pay the cost of generating a stack trace when the log entry will actually
// be emitted.
func TraceLevelOnlyStack() string {
if logrus.GetLevel() == logrus.TraceLevel {
return string(debug.Stack())
}
func (LazyStackTrace) MarshalText() ([]byte, error) {
return debug.Stack(), nil
}
return ""
}

@ -0,0 +1,245 @@
package gitutil
import (
"bytes"
"context"
"io"
"os"
"os/exec"
"strings"
"github.com/pkg/errors"
)
// GitCLI carries config to pass to the git cli to make running multiple
// commands less repetitive.
type GitCLI struct {
git string
exec func(context.Context, *exec.Cmd) error
args []string
dir string
streams StreamFunc
workTree string
gitDir string
sshAuthSock string
sshKnownHosts string
}
// Option provides a variadic option for configuring the git client.
type Option func(b *GitCLI)
// WithGitBinary sets the git binary path.
func WithGitBinary(path string) Option {
return func(b *GitCLI) {
b.git = path
}
}
// WithExec sets the command exec function.
func WithExec(exec func(context.Context, *exec.Cmd) error) Option {
return func(b *GitCLI) {
b.exec = exec
}
}
// WithArgs sets extra args.
func WithArgs(args ...string) Option {
return func(b *GitCLI) {
b.args = append(b.args, args...)
}
}
// WithDir sets working directory.
//
// This should be a path to any directory within a standard git repository.
func WithDir(dir string) Option {
return func(b *GitCLI) {
b.dir = dir
}
}
// WithWorkTree sets the --work-tree arg.
//
// This should be the path to the top-level directory of the checkout. When
// setting this, you also likely need to set WithGitDir.
func WithWorkTree(workTree string) Option {
return func(b *GitCLI) {
b.workTree = workTree
}
}
// WithGitDir sets the --git-dir arg.
//
// This should be the path to the .git directory. When setting this, you may
// also need to set WithWorkTree, unless you are working with a bare
// repository.
func WithGitDir(gitDir string) Option {
return func(b *GitCLI) {
b.gitDir = gitDir
}
}
// WithSSHAuthSock sets the ssh auth sock.
func WithSSHAuthSock(sshAuthSock string) Option {
return func(b *GitCLI) {
b.sshAuthSock = sshAuthSock
}
}
// WithSSHKnownHosts sets the known hosts file.
func WithSSHKnownHosts(sshKnownHosts string) Option {
return func(b *GitCLI) {
b.sshKnownHosts = sshKnownHosts
}
}
type StreamFunc func(context.Context) (io.WriteCloser, io.WriteCloser, func())
// WithStreams configures a callback for getting the streams for a command. The
// stream callback will be called once for each command, and both writers will
// be closed after the command has finished.
func WithStreams(streams StreamFunc) Option {
return func(b *GitCLI) {
b.streams = streams
}
}
// New initializes a new git client
func NewGitCLI(opts ...Option) (*GitCLI, error) {
c := &GitCLI{}
for _, opt := range opts {
opt(c)
}
if c.git == "" {
var err error
c.git, err = exec.LookPath("git")
if err != nil {
return nil, errors.WithStack(err)
}
}
return c, nil
}
// New returns a new git client with the same config as the current one, but
// with the given options applied on top.
func (cli *GitCLI) New(opts ...Option) *GitCLI {
c := &GitCLI{
git: cli.git,
dir: cli.dir,
workTree: cli.workTree,
gitDir: cli.gitDir,
args: append([]string{}, cli.args...),
streams: cli.streams,
sshAuthSock: cli.sshAuthSock,
sshKnownHosts: cli.sshKnownHosts,
}
for _, opt := range opts {
opt(c)
}
return c
}
// Run executes a git command with the given args.
func (cli *GitCLI) Run(ctx context.Context, args ...string) (_ []byte, err error) {
for {
var cmd *exec.Cmd
if cli.exec == nil {
cmd = exec.CommandContext(ctx, cli.git) //nolint:gosec
} else {
cmd = exec.Command(cli.git) //nolint:gosec
}
cmd.Dir = cli.dir
if cmd.Dir == "" {
cmd.Dir = cli.workTree
}
// Block sneaky repositories from using repos from the filesystem as submodules.
cmd.Args = append(cmd.Args, "-c", "protocol.file.allow=user")
if cli.workTree != "" {
cmd.Args = append(cmd.Args, "--work-tree", cli.workTree)
}
if cli.gitDir != "" {
cmd.Args = append(cmd.Args, "--git-dir", cli.gitDir)
}
cmd.Args = append(cmd.Args, cli.args...)
cmd.Args = append(cmd.Args, args...)
buf := bytes.NewBuffer(nil)
errbuf := bytes.NewBuffer(nil)
cmd.Stdin = nil
cmd.Stdout = buf
cmd.Stderr = errbuf
if cli.streams != nil {
stdout, stderr, flush := cli.streams(ctx)
if stdout != nil {
cmd.Stdout = io.MultiWriter(stdout, cmd.Stdout)
}
if stderr != nil {
cmd.Stderr = io.MultiWriter(stderr, cmd.Stderr)
}
defer stdout.Close()
defer stderr.Close()
defer func() {
if err != nil {
flush()
}
}()
}
cmd.Env = []string{
"PATH=" + os.Getenv("PATH"),
"GIT_TERMINAL_PROMPT=0",
"GIT_SSH_COMMAND=" + getGitSSHCommand(cli.sshKnownHosts),
// "GIT_TRACE=1",
"GIT_CONFIG_NOSYSTEM=1", // Disable reading from system gitconfig.
"HOME=/dev/null", // Disable reading from user gitconfig.
"LC_ALL=C", // Ensure consistent output.
}
if cli.sshAuthSock != "" {
cmd.Env = append(cmd.Env, "SSH_AUTH_SOCK="+cli.sshAuthSock)
}
if cli.exec != nil {
// remote git commands spawn helper processes that inherit FDs and don't
// handle parent death signal so exec.CommandContext can't be used
err = cli.exec(ctx, cmd)
} else {
err = cmd.Run()
}
if err != nil {
if strings.Contains(errbuf.String(), "--depth") || strings.Contains(errbuf.String(), "shallow") {
if newArgs := argsNoDepth(args); len(args) > len(newArgs) {
args = newArgs
continue
}
}
return buf.Bytes(), errors.Errorf("git error: %s\nstderr:\n%s", err, errbuf.String())
}
return buf.Bytes(), nil
}
}
func getGitSSHCommand(knownHosts string) string {
gitSSHCommand := "ssh -F /dev/null"
if knownHosts != "" {
gitSSHCommand += " -o UserKnownHostsFile=" + knownHosts
} else {
gitSSHCommand += " -o StrictHostKeyChecking=no"
}
return gitSSHCommand
}
func argsNoDepth(args []string) []string {
out := make([]string, 0, len(args))
for _, a := range args {
if a != "--depth=1" {
out = append(out, a)
}
}
return out
}

@ -0,0 +1,44 @@
package gitutil
import (
"context"
"path/filepath"
"strings"
"github.com/pkg/errors"
)
func (cli *GitCLI) Dir() string {
if cli.dir != "" {
return cli.dir
}
return cli.workTree
}
func (cli *GitCLI) WorkTree(ctx context.Context) (string, error) {
if cli.workTree != "" {
return cli.workTree, nil
}
return cli.clean(cli.Run(ctx, "rev-parse", "--show-toplevel"))
}
func (cli *GitCLI) GitDir(ctx context.Context) (string, error) {
if cli.gitDir != "" {
return cli.gitDir, nil
}
dir, err := cli.WorkTree(ctx)
if err != nil {
return "", err
}
return filepath.Join(dir, ".git"), nil
}
func (cli *GitCLI) clean(dt []byte, err error) (string, error) {
out := string(dt)
out = strings.ReplaceAll(strings.Split(out, "\n")[0], "'", "")
if err != nil {
err = errors.New(strings.TrimSuffix(err.Error(), "\n"))
}
return out, err
}

@ -65,7 +65,7 @@ func (ps *MultiWriter) Write(id string, v interface{}) error {
Sys: v,
meta: ps.meta,
}
return ps.WriteRawProgress(p)
return ps.writeRawProgress(p)
}
func (ps *MultiWriter) WriteRawProgress(p *Progress) error {

@ -13,6 +13,7 @@ import (
"github.com/google/shlex"
"github.com/moby/buildkit/util/bklog"
"github.com/pkg/errors"
)
const buildkitdConfigFile = "buildkitd.toml"
@ -126,7 +127,7 @@ func newSandbox(ctx context.Context, w Worker, mirror string, mv matrixValue) (s
}
func RootlessSupported(uid int) bool {
cmd := exec.Command("sudo", "-E", "-u", fmt.Sprintf("#%d", uid), "-i", "--", "exec", "unshare", "-U", "true") //nolint:gosec // test utility
cmd := exec.Command("sudo", "-u", fmt.Sprintf("#%d", uid), "-i", "--", "exec", "unshare", "-U", "true") //nolint:gosec // test utility
b, err := cmd.CombinedOutput()
if err != nil {
bklog.L.Warnf("rootless mode is not supported on this host: %v (%s)", err, string(b))
@ -156,6 +157,13 @@ func FormatLogs(m map[string]*bytes.Buffer) string {
}
func CheckFeatureCompat(t *testing.T, sb Sandbox, features map[string]struct{}, reason ...string) {
t.Helper()
if err := HasFeatureCompat(t, sb, features, reason...); err != nil {
t.Skipf(err.Error())
}
}
func HasFeatureCompat(t *testing.T, sb Sandbox, features map[string]struct{}, reason ...string) error {
t.Helper()
if len(reason) == 0 {
t.Fatal("no reason provided")
@ -172,6 +180,7 @@ func CheckFeatureCompat(t *testing.T, sb Sandbox, features map[string]struct{},
}
}
if len(ereasons) > 0 {
t.Skipf("%s worker can not currently run this test due to missing features (%s)", sb.Name(), strings.Join(ereasons, ", "))
return errors.Errorf("%s worker can not currently run this test due to missing features (%s)", sb.Name(), strings.Join(ereasons, ", "))
}
return nil
}

@ -168,7 +168,7 @@ disabled_plugins = ["cri"]
containerdArgs := []string{c.Containerd, "--config", configFile}
rootlessKitState := filepath.Join(tmpdir, "rootlesskit-containerd")
if rootless {
containerdArgs = append(append([]string{"sudo", "-E", "-u", fmt.Sprintf("#%d", c.UID), "-i",
containerdArgs = append(append([]string{"sudo", "-u", fmt.Sprintf("#%d", c.UID), "-i",
fmt.Sprintf("CONTAINERD_ROOTLESS_ROOTLESSKIT_STATE_DIR=%s", rootlessKitState),
// Integration test requires the access to localhost of the host network namespace.
// TODO: remove these configurations
@ -211,7 +211,7 @@ disabled_plugins = ["cri"]
if err != nil {
return nil, nil, err
}
buildkitdArgs = append([]string{"sudo", "-E", "-u", fmt.Sprintf("#%d", c.UID), "-i", "--", "exec",
buildkitdArgs = append([]string{"sudo", "-u", fmt.Sprintf("#%d", c.UID), "-i", "--", "exec",
"nsenter", "-U", "--preserve-credentials", "-m", "-t", fmt.Sprintf("%d", pid)},
append(buildkitdArgs, "--containerd-worker-snapshotter=native")...)
}

@ -61,3 +61,7 @@ var features = map[string]struct{}{
func CheckFeatureCompat(t *testing.T, sb integration.Sandbox, reason ...string) {
integration.CheckFeatureCompat(t, sb, features, reason...)
}
func HasFeatureCompat(t *testing.T, sb integration.Sandbox, reason ...string) error {
return integration.HasFeatureCompat(t, sb, features, reason...)
}

@ -66,7 +66,7 @@ func (s *OCI) New(ctx context.Context, cfg *integration.BackendConfig) (integrat
return nil, nil, errors.Errorf("unsupported id pair: uid=%d, gid=%d", s.UID, s.GID)
}
// TODO: make sure the user exists and subuid/subgid are configured.
buildkitdArgs = append([]string{"sudo", "-E", "-u", fmt.Sprintf("#%d", s.UID), "-i", "--", "exec", "rootlesskit"}, buildkitdArgs...)
buildkitdArgs = append([]string{"sudo", "-u", fmt.Sprintf("#%d", s.UID), "-i", "--", "exec", "rootlesskit"}, buildkitdArgs...)
}
var extraEnv []string

@ -54,9 +54,9 @@ func runBuildkitd(ctx context.Context, conf *integration.BackendConfig, args []s
address = getBuildkitdAddr(tmpdir)
args = append(args, "--root", tmpdir, "--addr", address, "--debug")
args = append(args, "--root", tmpdir, "--addr", address, "--otel-socket-path", getTraceSocketPath(tmpdir), "--debug")
cmd := exec.Command(args[0], args[1:]...) //nolint:gosec // test utility
cmd.Env = append(os.Environ(), "BUILDKIT_DEBUG_EXEC_OUTPUT=1", "BUILDKIT_DEBUG_PANIC_ON_ERROR=1", "BUILDKIT_TRACE_SOCKET="+getTraceSocketPath(tmpdir), "TMPDIR="+filepath.Join(tmpdir, "tmp"))
cmd.Env = append(os.Environ(), "BUILDKIT_DEBUG_EXEC_OUTPUT=1", "BUILDKIT_DEBUG_PANIC_ON_ERROR=1", "TMPDIR="+filepath.Join(tmpdir, "tmp"))
cmd.Env = append(cmd.Env, extraEnv...)
cmd.SysProcAttr = getSysProcAttr()

@ -201,7 +201,7 @@ func ParseGroupFilter(r io.Reader, filter func(Group) bool) ([]Group, error) {
if err != nil {
// We should return no error if EOF is reached
// without a match.
if err == io.EOF { //nolint:errorlint // comparison with io.EOF is legit, https://github.com/polyfloyd/go-errorlint/pull/12
if err == io.EOF {
err = nil
}
return out, err

@ -501,7 +501,7 @@ github.com/mitchellh/go-wordwrap
# github.com/mitchellh/mapstructure v1.5.0
## explicit; go 1.14
github.com/mitchellh/mapstructure
# github.com/moby/buildkit v0.12.1-0.20230804094609-b49a8873179b
# github.com/moby/buildkit v0.12.1-0.20230804094609-b49a8873179b => github.com/jedevc/buildkit v0.8.2-0.20230816145044-96097aa7c4f0
## explicit; go 1.20
github.com/moby/buildkit/api/services/control
github.com/moby/buildkit/api/types
@ -619,7 +619,7 @@ github.com/opencontainers/go-digest
## explicit; go 1.18
github.com/opencontainers/image-spec/specs-go
github.com/opencontainers/image-spec/specs-go/v1
# github.com/opencontainers/runc v1.1.7
# github.com/opencontainers/runc v1.1.9
## explicit; go 1.17
github.com/opencontainers/runc/libcontainer/user
# github.com/pelletier/go-toml v1.9.5
@ -1265,3 +1265,4 @@ sigs.k8s.io/structured-merge-diff/v4/value
# sigs.k8s.io/yaml v1.3.0
## explicit; go 1.12
sigs.k8s.io/yaml
# github.com/moby/buildkit => github.com/jedevc/buildkit v0.8.2-0.20230816145044-96097aa7c4f0

Loading…
Cancel
Save