enhance: [2.2] Add Garbage collection pause&resume API (#29166)

See also #29051
Add rest API for proxy for global usage
Add datacoord API for GcControl

---------

Signed-off-by: Congqi Xia <congqi.xia@zilliz.com>
pull/29374/head
congqixia 2023-12-18 21:18:42 +08:00 committed by GitHub
parent e143b8b428
commit e19efd42a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 1563 additions and 421 deletions

View File

@ -49,7 +49,7 @@ func msgSegmentNotFound(segID UniqueID) string {
}
func setNotServingStatus(status *commonpb.Status, stateCode commonpb.StateCode) {
reason := fmt.Sprintf("sate code: %s", stateCode.String())
reason := fmt.Sprintf("state code: %s", stateCode.String())
status.Reason = errorutil.NotServingReason(typeutil.DataCoordRole, Params.DataCoordCfg.GetNodeID(), reason)
status.ErrorCode = commonpb.ErrorCode_NotReadyServe
}

View File

@ -24,6 +24,7 @@ import (
"sync"
"time"
"github.com/cockroachdb/errors"
"github.com/milvus-io/milvus-proto/go-api/v2/commonpb"
"github.com/milvus-io/milvus/internal/log"
"github.com/milvus-io/milvus/internal/proto/datapb"
@ -32,6 +33,7 @@ import (
"github.com/milvus-io/milvus/internal/util/typeutil"
"github.com/minio/minio-go/v7"
"github.com/samber/lo"
"go.uber.org/atomic"
"go.uber.org/zap"
)
@ -63,7 +65,17 @@ type garbageCollector struct {
startOnce sync.Once
stopOnce sync.Once
wg sync.WaitGroup
closeCh chan struct{}
pauseUntil atomic.Time
closeCh chan struct{}
cmdCh chan gcCmd
}
type gcCmd struct {
cmdType datapb.GcCommand
duration time.Duration
done chan struct{}
}
// newGarbageCollector create garbage collector with meta and option
@ -77,6 +89,7 @@ func newGarbageCollector(meta *meta, handler Handler, segRefer *SegmentReference
indexCoord: indexCoord,
option: opt,
closeCh: make(chan struct{}),
cmdCh: make(chan gcCmd),
}
}
@ -101,8 +114,27 @@ func (gc *garbageCollector) work() {
for {
select {
case <-ticker:
if time.Now().Before(gc.pauseUntil.Load()) {
log.Info("garbage collector paused", zap.Time("until", gc.pauseUntil.Load()))
continue
}
gc.clearEtcd()
gc.scan()
case cmd := <-gc.cmdCh:
switch cmd.cmdType {
case datapb.GcCommand_Pause:
pauseUntil := time.Now().Add(cmd.duration)
if pauseUntil.After(gc.pauseUntil.Load()) {
log.Info("garbage collection paused", zap.Duration("duration", cmd.duration), zap.Time("pauseUntil", pauseUntil))
gc.pauseUntil.Store(pauseUntil)
} else {
log.Info("new pause until before current value", zap.Duration("duration", cmd.duration), zap.Time("pauseUntil", pauseUntil), zap.Time("oldPauseUntil", gc.pauseUntil.Load()))
}
case datapb.GcCommand_Resume:
// reset to zero value
gc.pauseUntil.Store(time.Time{})
}
close(cmd.done)
case <-gc.closeCh:
log.Warn("garbage collector quit")
return
@ -117,6 +149,43 @@ func (gc *garbageCollector) close() {
})
}
func (gc *garbageCollector) Pause(ctx context.Context, pauseDuration time.Duration) error {
if !gc.option.enabled {
log.Info("garbage collection not enabled")
return nil
}
done := make(chan struct{})
select {
case gc.cmdCh <- gcCmd{
cmdType: datapb.GcCommand_Pause,
duration: pauseDuration,
done: done,
}:
<-done
return nil
case <-ctx.Done():
return ctx.Err()
}
}
func (gc *garbageCollector) Resume(ctx context.Context) error {
if !gc.option.enabled {
log.Warn("garbage collection not enabled, cannot resume")
return errors.New("garbage collection not enabled, cannot resume")
}
done := make(chan struct{})
select {
case gc.cmdCh <- gcCmd{
cmdType: datapb.GcCommand_Resume,
done: done,
}:
<-done
return nil
case <-ctx.Done():
return ctx.Err()
}
}
// scan load meta file info and compares OSS keys
// if missing found, performs gc cleanup
func (gc *garbageCollector) scan() {

View File

@ -96,7 +96,125 @@ func Test_garbageCollector_basic(t *testing.T) {
gc.close()
})
})
}
func Test_garbageCollection_PauseResume(t *testing.T) {
bucketName := `datacoord-ut` + strings.ToLower(funcutil.RandomString(8))
rootPath := `gc` + funcutil.RandomString(8)
//TODO change to Params
cli, _, _, _, _, err := initUtOSSEnv(bucketName, rootPath, 0)
require.NoError(t, err)
meta, err := newMemoryMeta()
assert.Nil(t, err)
etcdCli, err := etcd.GetEtcdClient(
Params.EtcdCfg.UseEmbedEtcd,
Params.EtcdCfg.EtcdUseSSL,
Params.EtcdCfg.Endpoints,
Params.EtcdCfg.EtcdTLSCert,
Params.EtcdCfg.EtcdTLSKey,
Params.EtcdCfg.EtcdTLSCACert,
Params.EtcdCfg.EtcdTLSMinVersion)
assert.Nil(t, err)
etcdKV := etcdkv.NewEtcdKV(etcdCli, Params.EtcdCfg.MetaRootPath)
segRefer, err := NewSegmentReferenceManager(etcdKV, nil)
assert.NoError(t, err)
assert.NotNil(t, segRefer)
indexCoord := mocks.NewIndexCoord(t)
t.Run("not_enabled", func(t *testing.T) {
gc := newGarbageCollector(meta, newMockHandler(), segRefer, indexCoord, GcOption{
cli: cli,
enabled: false,
checkInterval: time.Millisecond * 10,
missingTolerance: time.Hour * 24,
dropTolerance: time.Hour * 24,
})
gc.start()
defer gc.close()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
err := gc.Pause(ctx, time.Second)
assert.NoError(t, err)
err = gc.Resume(ctx)
assert.Error(t, err)
})
t.Run("pause_then_resume", func(t *testing.T) {
gc := newGarbageCollector(meta, newMockHandler(), segRefer, indexCoord, GcOption{
cli: cli,
enabled: true,
checkInterval: time.Millisecond * 10,
missingTolerance: time.Hour * 24,
dropTolerance: time.Hour * 24,
})
gc.start()
defer gc.close()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
err := gc.Pause(ctx, time.Minute)
assert.NoError(t, err)
assert.NotZero(t, gc.pauseUntil.Load())
err = gc.Resume(ctx)
assert.NoError(t, err)
assert.Zero(t, gc.pauseUntil.Load())
})
t.Run("pause_before_until", func(t *testing.T) {
gc := newGarbageCollector(meta, newMockHandler(), segRefer, indexCoord, GcOption{
cli: cli,
enabled: true,
checkInterval: time.Millisecond * 10,
missingTolerance: time.Hour * 24,
dropTolerance: time.Hour * 24,
})
gc.start()
defer gc.close()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
err := gc.Pause(ctx, time.Minute)
assert.NoError(t, err)
until := gc.pauseUntil.Load()
assert.NotZero(t, until)
err = gc.Pause(ctx, time.Second)
assert.NoError(t, err)
second := gc.pauseUntil.Load()
assert.Equal(t, until, second)
})
t.Run("pause_resume_timeout", func(t *testing.T) {
gc := newGarbageCollector(meta, newMockHandler(), segRefer, indexCoord, GcOption{
cli: cli,
enabled: true,
checkInterval: time.Millisecond * 10,
missingTolerance: time.Hour * 24,
dropTolerance: time.Hour * 24,
})
ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
defer cancel()
err := gc.Pause(ctx, time.Minute)
assert.Error(t, err)
assert.Zero(t, gc.pauseUntil.Load())
err = gc.Resume(ctx)
assert.Error(t, err)
assert.Zero(t, gc.pauseUntil.Load())
})
}
func validateMinioPrefixElements(t *testing.T, cli *minio.Client, bucketName string, prefix string, elements []string) {

View File

@ -22,6 +22,7 @@ import (
"math/rand"
"strconv"
"sync"
"time"
"github.com/samber/lo"
"go.uber.org/zap"
@ -1823,3 +1824,47 @@ func (s *Server) GcConfirm(ctx context.Context, request *datapb.GcConfirmRequest
resp.Status.ErrorCode = commonpb.ErrorCode_Success
return resp, nil
}
func (s *Server) GcControl(ctx context.Context, request *datapb.GcControlRequest) (*commonpb.Status, error) {
status := &commonpb.Status{}
if s.isClosed() {
log.Warn("failed to execute gc control command, datacoord server closed")
setNotServingStatus(status, s.GetStateCode())
return status, nil
}
switch request.GetCommand() {
case datapb.GcCommand_Pause:
kv := lo.FindOrElse(request.GetParams(), nil, func(kv *commonpb.KeyValuePair) bool {
return kv.GetKey() == "duration"
})
if kv == nil {
status.ErrorCode = commonpb.ErrorCode_UnexpectedError
status.Reason = "pause duration param not found"
return status, nil
}
pauseSeconds, err := strconv.ParseInt(kv.GetValue(), 10, 64)
if err != nil {
status.ErrorCode = commonpb.ErrorCode_UnexpectedError
status.Reason = fmt.Sprintf("pause duration not valid, %s", err.Error())
return status, nil
}
if err := s.garbageCollector.Pause(ctx, time.Duration(pauseSeconds)*time.Second); err != nil {
status.ErrorCode = commonpb.ErrorCode_UnexpectedError
status.Reason = fmt.Sprintf("failed to pause gc, %s", err.Error())
return status, nil
}
case datapb.GcCommand_Resume:
if err := s.garbageCollector.Resume(ctx); err != nil {
status.ErrorCode = commonpb.ErrorCode_UnexpectedError
status.Reason = fmt.Sprintf("failed to pause gc, %s", err.Error())
return status, nil
}
default:
status.ErrorCode = commonpb.ErrorCode_UnexpectedError
status.Reason = fmt.Sprintf("unknown gc command: %d", request.GetCommand())
return status, nil
}
return status, nil
}

View File

@ -554,3 +554,83 @@ func TestReportDataNodeTtMsgs(t *testing.T) {
assert.Equal(t, commonpb.ErrorCode_NotReadyServe, resp.GetErrorCode())
})
}
func TestGcControl(t *testing.T) {
t.Run("with_closed_server", func(t *testing.T) {
svr := newTestServer(t, nil)
closeTestServer(t, svr)
resp, err := svr.GcControl(context.TODO(), &datapb.GcControlRequest{})
assert.Nil(t, err)
assert.Equal(t, commonpb.ErrorCode_NotReadyServe, resp.GetErrorCode())
})
t.Run("unknown_cmd", func(t *testing.T) {
svr := newTestServer(t, nil)
defer closeTestServer(t, svr)
resp, err := svr.GcControl(context.TODO(), &datapb.GcControlRequest{
Command: 0,
})
assert.Nil(t, err)
assert.Equal(t, commonpb.ErrorCode_UnexpectedError, resp.GetErrorCode())
})
t.Run("pause", func(t *testing.T) {
svr := newTestServer(t, nil)
defer closeTestServer(t, svr)
resp, err := svr.GcControl(context.TODO(), &datapb.GcControlRequest{
Command: datapb.GcCommand_Pause,
})
assert.Nil(t, err)
assert.Equal(t, commonpb.ErrorCode_UnexpectedError, resp.GetErrorCode())
resp, err = svr.GcControl(context.TODO(), &datapb.GcControlRequest{
Command: datapb.GcCommand_Pause,
Params: []*commonpb.KeyValuePair{
{Key: "duration", Value: "not_int"},
},
})
assert.Nil(t, err)
assert.Equal(t, commonpb.ErrorCode_UnexpectedError, resp.GetErrorCode())
resp, err = svr.GcControl(context.TODO(), &datapb.GcControlRequest{
Command: datapb.GcCommand_Pause,
Params: []*commonpb.KeyValuePair{
{Key: "duration", Value: "60"},
},
})
assert.Nil(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, resp.GetErrorCode())
})
t.Run("resume", func(t *testing.T) {
svr := newTestServer(t, nil)
defer closeTestServer(t, svr)
resp, err := svr.GcControl(context.TODO(), &datapb.GcControlRequest{
Command: datapb.GcCommand_Resume,
})
assert.Nil(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, resp.GetErrorCode())
})
t.Run("timeout", func(t *testing.T) {
svr := newTestServer(t, nil)
defer closeTestServer(t, svr)
svr.garbageCollector.close()
ctx, cancel := context.WithCancel(context.Background())
cancel()
resp, err := svr.GcControl(ctx, &datapb.GcControlRequest{
Command: datapb.GcCommand_Resume,
})
assert.Nil(t, err)
assert.Equal(t, commonpb.ErrorCode_UnexpectedError, resp.GetErrorCode())
resp, err = svr.GcControl(ctx, &datapb.GcControlRequest{
Command: datapb.GcCommand_Pause,
Params: []*commonpb.KeyValuePair{
{Key: "duration", Value: "60"},
},
})
assert.Nil(t, err)
assert.Equal(t, commonpb.ErrorCode_UnexpectedError, resp.GetErrorCode())
})
}

View File

@ -876,3 +876,16 @@ func (c *Client) ReportDataNodeTtMsgs(ctx context.Context, req *datapb.ReportDat
}
return ret.(*commonpb.Status), err
}
func (c *Client) GcControl(ctx context.Context, req *datapb.GcControlRequest) (*commonpb.Status, error) {
ret, err := c.grpcClient.ReCall(ctx, func(client datapb.DataCoordClient) (any, error) {
if !funcutil.CheckCtxValid(ctx) {
return nil, ctx.Err()
}
return client.GcControl(ctx, req)
})
if err != nil || ret == nil {
return nil, err
}
return ret.(*commonpb.Status), err
}

View File

@ -171,6 +171,9 @@ func Test_NewClient(t *testing.T) {
r33, err := client.GetRecoveryInfoV2(ctx, nil)
retCheck(retNotNil, r33, err)
gcCtrReq, err := client.GcControl(ctx, nil)
retCheck(retNotNil, gcCtrReq, err)
}
client.grpcClient = &mock.GRPCClientBase[datapb.DataCoordClient]{

View File

@ -460,3 +460,7 @@ func (s *Server) ListSegmentsInfo(ctx context.Context, req *datapb.ListSegmentsI
func (s *Server) ReportDataNodeTtMsgs(ctx context.Context, req *datapb.ReportDataNodeTtMsgsRequest) (*commonpb.Status, error) {
return s.dataCoord.ReportDataNodeTtMsgs(ctx, req)
}
func (s *Server) GcControl(ctx context.Context, req *datapb.GcControlRequest) (*commonpb.Status, error) {
return s.dataCoord.GcControl(ctx, req)
}

View File

@ -31,7 +31,7 @@ import (
clientv3 "go.etcd.io/etcd/client/v3"
)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
type MockDataCoord struct {
types.DataCoord
@ -73,6 +73,7 @@ type MockDataCoord struct {
markSegmentsDroppedResp *commonpb.Status
broadCastResp *commonpb.Status
listSegmentsInfoResp *datapb.ListSegmentsInfoResponse
gcControlResp *commonpb.Status
}
func (m *MockDataCoord) Init() error {
@ -247,7 +248,11 @@ func (m *MockDataCoord) ListSegmentsInfo(ctx context.Context, req *datapb.ListSe
return m.listSegmentsInfoResp, nil
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
func (m *MockDataCoord) GcControl(ctx context.Context, req *datapb.GcControlRequest) (*commonpb.Status, error) {
return m.gcControlResp, nil
}
// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
func Test_NewServer(t *testing.T) {
ctx := context.Background()
server := NewServer(ctx, nil)
@ -592,6 +597,15 @@ func Test_NewServer(t *testing.T) {
assert.Equal(t, true, ret.IsHealthy)
})
t.Run("GcControl", func(t *testing.T) {
server.dataCoord = &MockDataCoord{
gcControlResp: &commonpb.Status{},
}
ret, err := server.GcControl(ctx, nil)
assert.Nil(t, err)
assert.NotNil(t, ret)
})
err := server.Stop()
assert.Nil(t, err)
}

View File

@ -691,6 +691,10 @@ func (m *MockDataCoord) ReportDataNodeTtMsgs(ctx context.Context, req *datapb.Re
return nil, nil
}
func (m *MockDataCoord) GcControl(ctx context.Context, req *datapb.GcControlRequest) (*commonpb.Status, error) {
return &commonpb.Status{}, nil
}
// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
type MockProxy struct {
MockBase

File diff suppressed because it is too large Load Diff

View File

@ -76,6 +76,8 @@ service DataCoord {
rpc GcConfirm(GcConfirmRequest) returns (GcConfirmResponse) {}
rpc ReportDataNodeTtMsgs(ReportDataNodeTtMsgsRequest) returns (common.Status) {}
rpc GcControl(GcControlRequest) returns(common.Status){}
}
service DataNode {
@ -699,3 +701,15 @@ message ReportDataNodeTtMsgsRequest {
common.MsgBase base = 1;
repeated DataNodeTtMsg msgs = 2;
}
enum GcCommand {
_ = 0;
Pause = 1;
Resume = 2;
}
message GcControlRequest {
common.MsgBase base = 1;
GcCommand command = 2;
repeated common.KeyValuePair params = 3;
}

View File

@ -130,6 +130,34 @@ func (CompactionType) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_82cd95f524594f49, []int{2}
}
type GcCommand int32
const (
GcCommand__ GcCommand = 0
GcCommand_Pause GcCommand = 1
GcCommand_Resume GcCommand = 2
)
var GcCommand_name = map[int32]string{
0: "_",
1: "Pause",
2: "Resume",
}
var GcCommand_value = map[string]int32{
"_": 0,
"Pause": 1,
"Resume": 2,
}
func (x GcCommand) String() string {
return proto.EnumName(GcCommand_name, int32(x))
}
func (GcCommand) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_82cd95f524594f49, []int{3}
}
// TODO: import google/protobuf/empty.proto
type Empty struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
@ -5292,10 +5320,66 @@ func (m *ReportDataNodeTtMsgsRequest) GetMsgs() []*DataNodeTtMsg {
return nil
}
type GcControlRequest struct {
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
Command GcCommand `protobuf:"varint,2,opt,name=command,proto3,enum=milvus.proto.data.GcCommand" json:"command,omitempty"`
Params []*commonpb.KeyValuePair `protobuf:"bytes,3,rep,name=params,proto3" json:"params,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GcControlRequest) Reset() { *m = GcControlRequest{} }
func (m *GcControlRequest) String() string { return proto.CompactTextString(m) }
func (*GcControlRequest) ProtoMessage() {}
func (*GcControlRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_82cd95f524594f49, []int{83}
}
func (m *GcControlRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GcControlRequest.Unmarshal(m, b)
}
func (m *GcControlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GcControlRequest.Marshal(b, m, deterministic)
}
func (m *GcControlRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_GcControlRequest.Merge(m, src)
}
func (m *GcControlRequest) XXX_Size() int {
return xxx_messageInfo_GcControlRequest.Size(m)
}
func (m *GcControlRequest) XXX_DiscardUnknown() {
xxx_messageInfo_GcControlRequest.DiscardUnknown(m)
}
var xxx_messageInfo_GcControlRequest proto.InternalMessageInfo
func (m *GcControlRequest) GetBase() *commonpb.MsgBase {
if m != nil {
return m.Base
}
return nil
}
func (m *GcControlRequest) GetCommand() GcCommand {
if m != nil {
return m.Command
}
return GcCommand__
}
func (m *GcControlRequest) GetParams() []*commonpb.KeyValuePair {
if m != nil {
return m.Params
}
return nil
}
func init() {
proto.RegisterEnum("milvus.proto.data.SegmentType", SegmentType_name, SegmentType_value)
proto.RegisterEnum("milvus.proto.data.ChannelWatchState", ChannelWatchState_name, ChannelWatchState_value)
proto.RegisterEnum("milvus.proto.data.CompactionType", CompactionType_name, CompactionType_value)
proto.RegisterEnum("milvus.proto.data.GcCommand", GcCommand_name, GcCommand_value)
proto.RegisterType((*Empty)(nil), "milvus.proto.data.Empty")
proto.RegisterType((*FlushRequest)(nil), "milvus.proto.data.FlushRequest")
proto.RegisterType((*FlushResponse)(nil), "milvus.proto.data.FlushResponse")
@ -5380,311 +5464,317 @@ func init() {
proto.RegisterType((*GcConfirmRequest)(nil), "milvus.proto.data.GcConfirmRequest")
proto.RegisterType((*GcConfirmResponse)(nil), "milvus.proto.data.GcConfirmResponse")
proto.RegisterType((*ReportDataNodeTtMsgsRequest)(nil), "milvus.proto.data.ReportDataNodeTtMsgsRequest")
proto.RegisterType((*GcControlRequest)(nil), "milvus.proto.data.GcControlRequest")
}
func init() { proto.RegisterFile("data_coord.proto", fileDescriptor_82cd95f524594f49) }
var fileDescriptor_82cd95f524594f49 = []byte{
// 4772 bytes of a gzipped FileDescriptorProto
// 4863 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x3c, 0x5d, 0x6f, 0x24, 0x57,
0x56, 0x53, 0xfd, 0xe5, 0xee, 0xd3, 0xed, 0x76, 0xfb, 0xce, 0xc4, 0xee, 0xe9, 0xc9, 0x7c, 0xa4,
0x26, 0x93, 0x4c, 0x26, 0xc9, 0x4c, 0xe2, 0x6c, 0xb4, 0x21, 0xd9, 0x64, 0x19, 0xdb, 0xe3, 0x89,
0xc1, 0xf6, 0x7a, 0xcb, 0x9e, 0x19, 0x94, 0x45, 0x6a, 0xd5, 0x74, 0x5d, 0xb7, 0x6b, 0x5d, 0x5d,
0xd5, 0x53, 0x55, 0x6d, 0x8f, 0x97, 0x87, 0x0d, 0xa0, 0x45, 0x5a, 0x84, 0x58, 0x84, 0x40, 0x80,
0x04, 0x12, 0xe2, 0x69, 0x59, 0xb4, 0x08, 0x09, 0x78, 0x41, 0x48, 0xbc, 0x06, 0x78, 0x40, 0x08,
0x09, 0xf1, 0x04, 0x6f, 0x7c, 0x3c, 0xf3, 0x07, 0xd0, 0xfd, 0xa8, 0x5b, 0x5f, 0xb7, 0xba, 0xcb,
0xdd, 0x33, 0x99, 0x15, 0xfb, 0xd6, 0x75, 0xea, 0xdc, 0x7b, 0xcf, 0x3d, 0xf7, 0x7c, 0x9f, 0x5b,
0x0d, 0x2d, 0x43, 0xf7, 0xf5, 0x6e, 0xcf, 0x71, 0x5c, 0xe3, 0xf6, 0xd0, 0x75, 0x7c, 0x07, 0x2d,
0x0e, 0x4c, 0xeb, 0x78, 0xe4, 0xb1, 0xa7, 0xdb, 0xe4, 0x75, 0xa7, 0xd1, 0x73, 0x06, 0x03, 0xc7,
0x66, 0xa0, 0x4e, 0xd3, 0xb4, 0x7d, 0xec, 0xda, 0xba, 0xc5, 0x9f, 0x1b, 0xd1, 0x01, 0x9d, 0x86,
0xd7, 0x3b, 0xc4, 0x03, 0x9d, 0x3d, 0xa9, 0x73, 0x50, 0xbe, 0x37, 0x18, 0xfa, 0xa7, 0xea, 0x5f,
0x29, 0xd0, 0xd8, 0xb0, 0x46, 0xde, 0xa1, 0x86, 0x9f, 0x8c, 0xb0, 0xe7, 0xa3, 0x77, 0xa0, 0xf4,
0x58, 0xf7, 0x70, 0x5b, 0xb9, 0xa6, 0xdc, 0xac, 0xaf, 0xbc, 0x7c, 0x3b, 0xb6, 0x2a, 0x5f, 0x6f,
0xdb, 0xeb, 0xaf, 0xea, 0x1e, 0xd6, 0x28, 0x26, 0x42, 0x50, 0x32, 0x1e, 0x6f, 0xae, 0xb7, 0x0b,
0xd7, 0x94, 0x9b, 0x45, 0x8d, 0xfe, 0x46, 0x57, 0x00, 0x3c, 0xdc, 0x1f, 0x60, 0xdb, 0xdf, 0x5c,
0xf7, 0xda, 0xc5, 0x6b, 0xc5, 0x9b, 0x45, 0x2d, 0x02, 0x41, 0x2a, 0x34, 0x7a, 0x8e, 0x65, 0xe1,
0x9e, 0x6f, 0x3a, 0xf6, 0xe6, 0x7a, 0xbb, 0x44, 0xc7, 0xc6, 0x60, 0xa8, 0x03, 0x55, 0xd3, 0xdb,
0x1c, 0x0c, 0x1d, 0xd7, 0x6f, 0x97, 0xaf, 0x29, 0x37, 0xab, 0x9a, 0x78, 0x56, 0xff, 0x53, 0x81,
0x79, 0x4e, 0xb6, 0x37, 0x74, 0x6c, 0x0f, 0xa3, 0xf7, 0xa0, 0xe2, 0xf9, 0xba, 0x3f, 0xf2, 0x38,
0xe5, 0x97, 0xa4, 0x94, 0xef, 0x51, 0x14, 0x8d, 0xa3, 0x4a, 0x49, 0x4f, 0x92, 0x56, 0x94, 0x90,
0x16, 0xdf, 0x5e, 0x29, 0xb5, 0xbd, 0x9b, 0xb0, 0x70, 0x40, 0xa8, 0xdb, 0x0b, 0x91, 0xca, 0x14,
0x29, 0x09, 0x26, 0x33, 0xf9, 0xe6, 0x00, 0x7f, 0xe3, 0x60, 0x0f, 0xeb, 0x56, 0xbb, 0x42, 0xd7,
0x8a, 0x40, 0xd4, 0x7f, 0x56, 0xa0, 0x25, 0xd0, 0x83, 0x33, 0xba, 0x00, 0xe5, 0x9e, 0x33, 0xb2,
0x7d, 0xba, 0xd5, 0x79, 0x8d, 0x3d, 0xa0, 0x57, 0xa0, 0xd1, 0x3b, 0xd4, 0x6d, 0x1b, 0x5b, 0x5d,
0x5b, 0x1f, 0x60, 0xba, 0xa9, 0x9a, 0x56, 0xe7, 0xb0, 0x1d, 0x7d, 0x80, 0x73, 0xed, 0xed, 0x1a,
0xd4, 0x87, 0xba, 0xeb, 0x9b, 0xb1, 0x93, 0x89, 0x82, 0xc6, 0x1d, 0x0c, 0x59, 0xc1, 0xa4, 0xbf,
0xf6, 0x75, 0xef, 0x68, 0x73, 0x9d, 0xef, 0x28, 0x06, 0x53, 0xff, 0x58, 0x81, 0xa5, 0xbb, 0x9e,
0x67, 0xf6, 0xed, 0xd4, 0xce, 0x96, 0xa0, 0x62, 0x3b, 0x06, 0xde, 0x5c, 0xa7, 0x5b, 0x2b, 0x6a,
0xfc, 0x09, 0x5d, 0x82, 0xda, 0x10, 0x63, 0xb7, 0xeb, 0x3a, 0x56, 0xb0, 0xb1, 0x2a, 0x01, 0x68,
0x8e, 0x85, 0xd1, 0x37, 0x61, 0xd1, 0x4b, 0x4c, 0xc4, 0x64, 0xae, 0xbe, 0x72, 0xfd, 0x76, 0x4a,
0x6b, 0x6e, 0x27, 0x17, 0xd5, 0xd2, 0xa3, 0xd5, 0xcf, 0x0b, 0x70, 0x5e, 0xe0, 0x31, 0x5a, 0xc9,
0x6f, 0xc2, 0x79, 0x0f, 0xf7, 0x05, 0x79, 0xec, 0x21, 0x0f, 0xe7, 0xc5, 0x91, 0x15, 0xa3, 0x47,
0x96, 0x47, 0x0d, 0x12, 0xe7, 0x51, 0x4e, 0x9f, 0xc7, 0x55, 0xa8, 0xe3, 0xa7, 0x43, 0xd3, 0xc5,
0x5d, 0x22, 0x38, 0x94, 0xe5, 0x25, 0x0d, 0x18, 0x68, 0xdf, 0x1c, 0x44, 0x75, 0x63, 0x2e, 0xb7,
0x6e, 0xa8, 0x7f, 0xa2, 0xc0, 0x72, 0xea, 0x94, 0xb8, 0xb2, 0x69, 0xd0, 0xa2, 0x3b, 0x0f, 0x39,
0x43, 0xd4, 0x8e, 0x30, 0xfc, 0xb5, 0x71, 0x0c, 0x0f, 0xd1, 0xb5, 0xd4, 0xf8, 0x08, 0x91, 0x85,
0xfc, 0x44, 0x1e, 0xc1, 0xf2, 0x7d, 0xec, 0xf3, 0x05, 0xc8, 0x3b, 0xec, 0x4d, 0x6f, 0xc8, 0xe2,
0x5a, 0x5d, 0x48, 0x6a, 0xb5, 0xfa, 0x17, 0x05, 0xa1, 0x8b, 0x74, 0xa9, 0x4d, 0xfb, 0xc0, 0x41,
0x2f, 0x43, 0x4d, 0xa0, 0x70, 0xa9, 0x08, 0x01, 0xe8, 0xab, 0x50, 0x26, 0x94, 0x32, 0x91, 0x68,
0xae, 0xbc, 0x22, 0xdf, 0x53, 0x64, 0x4e, 0x8d, 0xe1, 0xa3, 0x4d, 0x68, 0x7a, 0xbe, 0xee, 0xfa,
0xdd, 0xa1, 0xe3, 0xd1, 0x73, 0xa6, 0x82, 0x53, 0x5f, 0x51, 0xe3, 0x33, 0x08, 0x93, 0xbf, 0xed,
0xf5, 0x77, 0x39, 0xa6, 0x36, 0x4f, 0x47, 0x06, 0x8f, 0xe8, 0x1e, 0x34, 0xb0, 0x6d, 0x84, 0x13,
0x95, 0x72, 0x4f, 0x54, 0xc7, 0xb6, 0x21, 0xa6, 0x09, 0xcf, 0xa7, 0x9c, 0xff, 0x7c, 0x7e, 0x43,
0x81, 0x76, 0xfa, 0x80, 0x66, 0x31, 0xd9, 0x1f, 0xb1, 0x41, 0x98, 0x1d, 0xd0, 0x58, 0x0d, 0x17,
0x87, 0xa4, 0xf1, 0x21, 0xea, 0xef, 0x2a, 0xf0, 0x52, 0x48, 0x0e, 0x7d, 0xf5, 0xbc, 0xa4, 0x05,
0xdd, 0x82, 0x96, 0x69, 0xf7, 0xac, 0x91, 0x81, 0x1f, 0xd8, 0x9f, 0x62, 0xdd, 0xf2, 0x0f, 0x4f,
0xe9, 0x19, 0x56, 0xb5, 0x14, 0x5c, 0xfd, 0xf7, 0x02, 0x2c, 0x25, 0xe9, 0x9a, 0x85, 0x49, 0x5f,
0x81, 0xb2, 0x69, 0x1f, 0x38, 0x01, 0x8f, 0xae, 0x8c, 0x51, 0x4a, 0xb2, 0x16, 0x43, 0x46, 0x0e,
0xa0, 0xc0, 0x8c, 0xf5, 0x0e, 0x71, 0xef, 0x68, 0xe8, 0x98, 0xd4, 0x60, 0x91, 0x29, 0x7e, 0x56,
0x32, 0x85, 0x9c, 0xe2, 0xdb, 0x6b, 0x6c, 0x8e, 0x35, 0x31, 0xc5, 0x3d, 0xdb, 0x77, 0x4f, 0xb5,
0xc5, 0x5e, 0x12, 0xde, 0x39, 0x84, 0x25, 0x39, 0x32, 0x6a, 0x41, 0xf1, 0x08, 0x9f, 0xd2, 0x2d,
0xd7, 0x34, 0xf2, 0x13, 0x7d, 0x00, 0xe5, 0x63, 0xdd, 0x1a, 0x61, 0x6e, 0x1d, 0xf2, 0x88, 0x2f,
0x1b, 0xf0, 0x61, 0xe1, 0x03, 0x45, 0xfd, 0x3d, 0x05, 0x96, 0xb7, 0x4c, 0x2f, 0xa0, 0xd7, 0xfb,
0xc9, 0x39, 0xfa, 0xef, 0x29, 0xd0, 0x4e, 0x53, 0xf6, 0xa5, 0x1f, 0xbe, 0x3a, 0x80, 0x4b, 0xf7,
0xb1, 0xbf, 0x69, 0x7b, 0xd8, 0xf5, 0x57, 0x4d, 0xdb, 0x72, 0xfa, 0xbb, 0xba, 0x7f, 0x38, 0x83,
0x35, 0x8d, 0x19, 0xc6, 0x42, 0xc2, 0x30, 0xaa, 0x3f, 0x54, 0xe0, 0x65, 0xf9, 0x7a, 0x7c, 0xeb,
0x1d, 0xa8, 0x1e, 0x98, 0xd8, 0x32, 0x08, 0x87, 0x15, 0xca, 0x61, 0xf1, 0x4c, 0xac, 0xea, 0x90,
0x20, 0xf3, 0x1d, 0xbe, 0x92, 0x21, 0x0b, 0x7b, 0xbe, 0x6b, 0xda, 0x7d, 0xc2, 0x5c, 0x8d, 0xe1,
0x47, 0xf8, 0x59, 0xcc, 0x6f, 0xc3, 0x7e, 0x5d, 0x81, 0x2b, 0xf7, 0xb1, 0xbf, 0x26, 0x9c, 0x32,
0x79, 0x6f, 0x7a, 0xbe, 0xd9, 0xf3, 0x9e, 0x6d, 0xd0, 0x9c, 0x23, 0x3a, 0x53, 0x7f, 0xa0, 0xc0,
0xd5, 0x4c, 0x62, 0x38, 0xeb, 0xb8, 0xd3, 0x09, 0x5c, 0xb2, 0xdc, 0xe9, 0xfc, 0x3c, 0x3e, 0x7d,
0x48, 0xd4, 0x63, 0x57, 0x37, 0x5d, 0xe6, 0x74, 0xa6, 0x74, 0xc1, 0x3f, 0x56, 0xe0, 0xf2, 0x7d,
0xec, 0xef, 0x06, 0x01, 0xc9, 0x0b, 0xe4, 0x0e, 0xc1, 0x89, 0x04, 0x46, 0x41, 0x64, 0x1e, 0x83,
0xa9, 0xbf, 0xc9, 0x8e, 0x53, 0x4a, 0xef, 0x0b, 0x61, 0xe0, 0x15, 0xaa, 0x09, 0x11, 0x95, 0xe4,
0x36, 0x91, 0xb3, 0x4f, 0xfd, 0x23, 0x05, 0x2e, 0xde, 0xed, 0x3d, 0x19, 0x99, 0x2e, 0xe6, 0x48,
0x5b, 0x4e, 0xef, 0x68, 0x7a, 0xe6, 0x86, 0x31, 0x76, 0x21, 0x16, 0x63, 0x4f, 0xca, 0xd9, 0x96,
0xa0, 0xe2, 0xb3, 0xa0, 0x9e, 0x85, 0xa9, 0xfc, 0x89, 0xd2, 0xa7, 0x61, 0x0b, 0xeb, 0xde, 0x4f,
0x26, 0x7d, 0x3f, 0x28, 0x41, 0xe3, 0x21, 0x77, 0x3e, 0x34, 0x64, 0x4b, 0x4a, 0x92, 0x22, 0x8f,
0xba, 0x23, 0xe1, 0xbb, 0x2c, 0xa2, 0xbf, 0x0f, 0xf3, 0x1e, 0xc6, 0x47, 0xd3, 0x04, 0x68, 0x0d,
0x32, 0x50, 0x04, 0x56, 0x5b, 0xb0, 0x38, 0xb2, 0x69, 0x5e, 0x88, 0x8d, 0xc0, 0x0b, 0x50, 0xc9,
0x9d, 0x6c, 0xbb, 0xd3, 0x03, 0xd1, 0xa7, 0x3c, 0xf5, 0x8c, 0xcc, 0x55, 0xce, 0x35, 0x57, 0x72,
0x18, 0xda, 0x84, 0x96, 0xe1, 0x3a, 0xc3, 0x21, 0x36, 0xba, 0x5e, 0x30, 0x55, 0x25, 0xdf, 0x54,
0x7c, 0x9c, 0x98, 0xea, 0x1d, 0x38, 0x9f, 0xa4, 0x74, 0xd3, 0x20, 0xd9, 0x08, 0x39, 0x43, 0xd9,
0x2b, 0xf4, 0x16, 0x2c, 0xa6, 0xf1, 0xab, 0x14, 0x3f, 0xfd, 0x02, 0xbd, 0x0d, 0x28, 0x41, 0x2a,
0x41, 0xaf, 0x31, 0xf4, 0x38, 0x31, 0x9b, 0x86, 0xa7, 0x7e, 0x5f, 0x81, 0xa5, 0x47, 0xba, 0xdf,
0x3b, 0x5c, 0x1f, 0x70, 0x5d, 0x9b, 0xc1, 0x56, 0x7d, 0x0c, 0xb5, 0x63, 0x2e, 0x17, 0x81, 0x43,
0xba, 0x2a, 0xe1, 0x4f, 0x54, 0x02, 0xb5, 0x70, 0x04, 0x49, 0x86, 0x2f, 0x6c, 0x44, 0x8a, 0x02,
0x2f, 0xc0, 0x6a, 0x4e, 0xa8, 0x66, 0xa8, 0x4f, 0x01, 0x38, 0x71, 0xdb, 0x5e, 0x7f, 0x0a, 0xba,
0x3e, 0x80, 0x39, 0x3e, 0x1b, 0x37, 0x8b, 0x93, 0xe4, 0x27, 0x40, 0x57, 0x7f, 0x54, 0x81, 0x7a,
0xe4, 0x05, 0x6a, 0x42, 0x41, 0xe8, 0x6b, 0x41, 0xb2, 0xbb, 0xc2, 0xe4, 0xfc, 0xb9, 0x98, 0xce,
0x9f, 0x6f, 0x40, 0xd3, 0xa4, 0x71, 0x48, 0x97, 0x9f, 0x0a, 0x35, 0x20, 0x35, 0x6d, 0x9e, 0x41,
0xb9, 0x88, 0xa0, 0x2b, 0x50, 0xb7, 0x47, 0x83, 0xae, 0x73, 0xd0, 0x75, 0x9d, 0x13, 0x8f, 0x27,
0xe2, 0x35, 0x7b, 0x34, 0xf8, 0xc6, 0x81, 0xe6, 0x9c, 0x78, 0x61, 0xae, 0x57, 0x39, 0x63, 0xae,
0x77, 0x05, 0xea, 0x03, 0xfd, 0x29, 0x99, 0xb5, 0x6b, 0x8f, 0x06, 0x34, 0x47, 0x2f, 0x6a, 0xb5,
0x81, 0xfe, 0x54, 0x73, 0x4e, 0x76, 0x46, 0x03, 0x74, 0x13, 0x5a, 0x96, 0xee, 0xf9, 0xdd, 0x68,
0x92, 0x5f, 0xa5, 0x49, 0x7e, 0x93, 0xc0, 0xef, 0x85, 0x89, 0x7e, 0x3a, 0x6b, 0xac, 0xcd, 0x90,
0x35, 0x1a, 0x03, 0x2b, 0x9c, 0x08, 0xf2, 0x67, 0x8d, 0xc6, 0xc0, 0x12, 0xd3, 0x7c, 0x00, 0x73,
0x8f, 0x69, 0x74, 0xe7, 0xb5, 0xeb, 0x99, 0xb6, 0x63, 0x83, 0x04, 0x76, 0x2c, 0x08, 0xd4, 0x02,
0x74, 0xf4, 0x35, 0xa8, 0x51, 0xa7, 0x4a, 0xc7, 0x36, 0x72, 0x8d, 0x0d, 0x07, 0x90, 0xd1, 0x06,
0xb6, 0x7c, 0x9d, 0x8e, 0x9e, 0xcf, 0x37, 0x5a, 0x0c, 0x20, 0xf6, 0xaa, 0xe7, 0x62, 0xdd, 0xc7,
0xc6, 0xea, 0xe9, 0x9a, 0x33, 0x18, 0xea, 0x54, 0x98, 0xda, 0x4d, 0x1a, 0xc3, 0xcb, 0x5e, 0xa1,
0xd7, 0xa0, 0xd9, 0x13, 0x4f, 0x1b, 0xae, 0x33, 0x68, 0x2f, 0x50, 0x3d, 0x4a, 0x40, 0xd1, 0x65,
0x80, 0xc0, 0x52, 0xe9, 0x7e, 0xbb, 0x45, 0x4f, 0xb1, 0xc6, 0x21, 0x77, 0x69, 0x0d, 0xcf, 0xf4,
0xba, 0xac, 0x5a, 0x66, 0xda, 0xfd, 0xf6, 0x22, 0x5d, 0xb1, 0x1e, 0x94, 0xd7, 0x4c, 0xbb, 0x8f,
0x96, 0x61, 0xce, 0xf4, 0xba, 0x07, 0xfa, 0x11, 0x6e, 0x23, 0xfa, 0xb6, 0x62, 0x7a, 0x1b, 0xfa,
0x11, 0x56, 0xbf, 0x0b, 0x17, 0x42, 0xe9, 0x8a, 0x9c, 0x64, 0x5a, 0x28, 0x94, 0x69, 0x85, 0x62,
0x7c, 0x4c, 0xff, 0x3f, 0x25, 0x58, 0xda, 0xd3, 0x8f, 0xf1, 0xf3, 0x4f, 0x1f, 0x72, 0x99, 0xb5,
0x2d, 0x58, 0xa4, 0x19, 0xc3, 0x4a, 0x84, 0x9e, 0x31, 0x7e, 0x35, 0x2a, 0x0a, 0xe9, 0x81, 0xe8,
0xeb, 0x24, 0x20, 0xc0, 0xbd, 0xa3, 0x5d, 0x92, 0xa4, 0x06, 0x3e, 0xf5, 0xb2, 0x64, 0x9e, 0x35,
0x81, 0xa5, 0x45, 0x47, 0xa0, 0x5d, 0x58, 0x88, 0x1f, 0x43, 0xe0, 0x4d, 0x5f, 0x1f, 0x5b, 0xc1,
0x08, 0xb9, 0xaf, 0x35, 0x63, 0x87, 0xe1, 0xa1, 0x36, 0xcc, 0x71, 0x57, 0x48, 0x6d, 0x46, 0x55,
0x0b, 0x1e, 0xd1, 0x2e, 0x9c, 0x67, 0x3b, 0xd8, 0xe3, 0x0a, 0xc1, 0x36, 0x5f, 0xcd, 0xb5, 0x79,
0xd9, 0xd0, 0xb8, 0x3e, 0xd5, 0xce, 0xaa, 0x4f, 0x6d, 0x98, 0xe3, 0x32, 0x4e, 0xed, 0x48, 0x55,
0x0b, 0x1e, 0xc9, 0x31, 0x87, 0xd2, 0x5e, 0xa7, 0xef, 0x42, 0x00, 0x19, 0x17, 0x98, 0xe4, 0x06,
0x35, 0xc9, 0xc1, 0x23, 0x49, 0xca, 0x20, 0xe4, 0xf4, 0x84, 0x2a, 0xdc, 0x27, 0x50, 0x15, 0xb2,
0x9f, 0xbf, 0x7c, 0x20, 0xc6, 0x24, 0x2d, 0x7f, 0x31, 0x61, 0xf9, 0xd5, 0x7f, 0x54, 0xa0, 0xb1,
0x4e, 0x36, 0xbb, 0xe5, 0xf4, 0xa9, 0x9f, 0xba, 0x01, 0x4d, 0x17, 0xf7, 0x1c, 0xd7, 0xe8, 0x62,
0xdb, 0x77, 0x4d, 0xcc, 0xf2, 0xf7, 0x92, 0x36, 0xcf, 0xa0, 0xf7, 0x18, 0x90, 0xa0, 0x11, 0x63,
0xee, 0xf9, 0xfa, 0x60, 0xd8, 0x3d, 0x20, 0x46, 0xa3, 0xc0, 0xd0, 0x04, 0x94, 0xda, 0x8c, 0x57,
0xa0, 0x11, 0xa2, 0xf9, 0x0e, 0x5d, 0xbf, 0xa4, 0xd5, 0x05, 0x6c, 0xdf, 0x41, 0xaf, 0x42, 0x93,
0x72, 0xbb, 0x6b, 0x39, 0xfd, 0x2e, 0xc9, 0x75, 0xb9, 0x0b, 0x6b, 0x18, 0x9c, 0x2c, 0x72, 0x8a,
0x71, 0x2c, 0xcf, 0xfc, 0x0e, 0xe6, 0x4e, 0x4c, 0x60, 0xed, 0x99, 0xdf, 0xc1, 0xea, 0x3f, 0x28,
0x30, 0xbf, 0xae, 0xfb, 0xfa, 0x8e, 0x63, 0xe0, 0xfd, 0x29, 0x5d, 0x7e, 0x8e, 0x8a, 0xf8, 0xcb,
0x50, 0x13, 0x3b, 0xe0, 0x5b, 0x0a, 0x01, 0x68, 0x03, 0x9a, 0x41, 0xd0, 0xd9, 0x65, 0xb9, 0x58,
0x29, 0x33, 0xb4, 0x8a, 0xf8, 0x54, 0x4f, 0x9b, 0x0f, 0x86, 0xd1, 0x47, 0x75, 0x03, 0x1a, 0xd1,
0xd7, 0x64, 0xd5, 0xbd, 0xa4, 0xa0, 0x08, 0x00, 0x91, 0xb7, 0x9d, 0xd1, 0x80, 0x9c, 0x29, 0x37,
0x39, 0xc1, 0xa3, 0xfa, 0xab, 0x0a, 0xcc, 0xf3, 0x40, 0x60, 0x4f, 0xf4, 0x8e, 0xe8, 0xd6, 0x58,
0x8d, 0x8a, 0xfe, 0x46, 0x1f, 0xc6, 0xcb, 0xbd, 0xaf, 0x4a, 0xcd, 0x03, 0x9d, 0x84, 0x86, 0x9f,
0xb1, 0x28, 0x20, 0x4f, 0xf6, 0xff, 0x39, 0x11, 0x34, 0x7e, 0x34, 0x54, 0xd0, 0xda, 0x30, 0xa7,
0x1b, 0x86, 0x8b, 0x3d, 0x8f, 0xd3, 0x11, 0x3c, 0x92, 0x37, 0xc7, 0xd8, 0xf5, 0x02, 0x91, 0x2f,
0x6a, 0xc1, 0x23, 0xfa, 0x1a, 0x54, 0x45, 0xbc, 0xca, 0x8a, 0x7b, 0xd7, 0xb2, 0xe9, 0xe4, 0xb9,
0xaa, 0x18, 0xa1, 0xfe, 0x75, 0x01, 0x9a, 0x9c, 0x61, 0xab, 0xdc, 0x53, 0x8f, 0x57, 0xbe, 0x55,
0x68, 0x1c, 0x84, 0x56, 0x61, 0x5c, 0x55, 0x2a, 0x6a, 0x3c, 0x62, 0x63, 0x26, 0x29, 0x60, 0x3c,
0x56, 0x28, 0xcd, 0x14, 0x2b, 0x94, 0xcf, 0x6a, 0xdb, 0xd2, 0xd1, 0x63, 0x45, 0x12, 0x3d, 0xaa,
0xbf, 0x08, 0xf5, 0xc8, 0x04, 0xd4, 0x76, 0xb3, 0x72, 0x16, 0xe7, 0x58, 0xf0, 0x88, 0xde, 0x0b,
0x23, 0x26, 0xc6, 0xaa, 0x8b, 0x12, 0x5a, 0x12, 0xc1, 0x92, 0xfa, 0x77, 0x0a, 0x54, 0xf8, 0xcc,
0x57, 0xa1, 0xce, 0x8d, 0x0e, 0x8d, 0x26, 0xd9, 0xec, 0xc0, 0x41, 0x24, 0x9c, 0x7c, 0x76, 0x56,
0xe7, 0x22, 0x54, 0x13, 0xf6, 0x66, 0x8e, 0x3b, 0x8c, 0xe0, 0x55, 0xc4, 0xc8, 0x90, 0x57, 0xc4,
0xbe, 0xa0, 0x0b, 0x50, 0xb6, 0x9c, 0xbe, 0xe8, 0x0d, 0xb2, 0x07, 0xf5, 0x0b, 0x85, 0xb6, 0x72,
0x34, 0xdc, 0x73, 0x8e, 0xb1, 0x7b, 0x3a, 0x7b, 0x19, 0xf4, 0xa3, 0x88, 0x98, 0xe7, 0x4c, 0xcb,
0xc4, 0x00, 0xf4, 0x51, 0x78, 0x08, 0x45, 0x59, 0x0d, 0x28, 0x6a, 0x77, 0xb8, 0x90, 0x86, 0x87,
0xf1, 0x5b, 0x0a, 0xad, 0xe6, 0xc7, 0xb7, 0x32, 0x6d, 0x1c, 0xf4, 0x4c, 0x52, 0x1c, 0xf5, 0xef,
0x15, 0xb8, 0x98, 0xc1, 0xdd, 0x87, 0x2b, 0x2f, 0x80, 0xbf, 0x1f, 0x42, 0x55, 0xd4, 0x14, 0x8a,
0xb9, 0x6a, 0x0a, 0x02, 0x5f, 0xfd, 0x1d, 0xd6, 0x53, 0x92, 0xb0, 0xf7, 0xe1, 0xca, 0x73, 0x62,
0x70, 0xb2, 0xae, 0x58, 0x94, 0xd4, 0x15, 0xff, 0x49, 0x81, 0x4e, 0x58, 0xc7, 0xf3, 0x56, 0x4f,
0x67, 0x6d, 0x47, 0x3e, 0x9b, 0xe4, 0xf6, 0x67, 0x44, 0xbf, 0x8c, 0xd8, 0xc5, 0x5c, 0x69, 0x69,
0xd0, 0x2d, 0xb3, 0x69, 0x4b, 0x20, 0xbd, 0xa1, 0x59, 0xb4, 0xb2, 0x13, 0x39, 0x78, 0xd6, 0x38,
0x09, 0x0f, 0xf6, 0x3f, 0x98, 0x90, 0x6e, 0xc4, 0xeb, 0x50, 0x2f, 0x9a, 0x81, 0xd1, 0x66, 0xce,
0x21, 0x6f, 0xe6, 0x94, 0x12, 0xcd, 0x1c, 0x0e, 0x0f, 0x6e, 0x73, 0xac, 0xe2, 0x03, 0xc7, 0x65,
0x76, 0xaf, 0xa4, 0x45, 0x20, 0xea, 0x80, 0x8a, 0x48, 0x6a, 0x83, 0xcf, 0x8b, 0xa1, 0xbf, 0xa6,
0x40, 0x9b, 0xaf, 0x42, 0xd7, 0x24, 0xf9, 0xaa, 0x85, 0x7d, 0x6c, 0x7c, 0xd9, 0x75, 0x9c, 0xdf,
0x2f, 0x40, 0x2b, 0x1a, 0xf8, 0xd0, 0xd8, 0xe5, 0x7d, 0x28, 0xd3, 0x32, 0x18, 0xa7, 0x60, 0xa2,
0xf5, 0x60, 0xd8, 0xc4, 0x73, 0xd2, 0x3c, 0x68, 0x5f, 0xc4, 0x68, 0xfc, 0x31, 0x8c, 0xbe, 0x8a,
0x67, 0x8f, 0xbe, 0x78, 0x34, 0xea, 0x8c, 0xc8, 0xbc, 0xac, 0x7e, 0x1c, 0x02, 0xd0, 0xc7, 0x50,
0x61, 0xd7, 0xa7, 0x78, 0xef, 0xfb, 0x46, 0x7c, 0x6a, 0x7e, 0xb5, 0x2a, 0xd2, 0x94, 0xa1, 0x00,
0x8d, 0x0f, 0x22, 0x67, 0x34, 0x74, 0x9d, 0x3e, 0x0d, 0xd3, 0x88, 0xd3, 0x2b, 0x6b, 0xe2, 0x59,
0xfd, 0x39, 0x58, 0x0a, 0xcb, 0x08, 0x8c, 0xa4, 0x69, 0x05, 0x5e, 0xfd, 0x57, 0x05, 0xce, 0xef,
0x9d, 0xda, 0xbd, 0xa4, 0xea, 0x2c, 0x41, 0x65, 0x68, 0xe9, 0x61, 0xa9, 0x9b, 0x3f, 0xd1, 0x28,
0x9d, 0xad, 0x8d, 0x0d, 0xe2, 0xe2, 0x19, 0x3f, 0xeb, 0x02, 0xb6, 0xef, 0x4c, 0x8c, 0xbc, 0x6e,
0x88, 0xba, 0x07, 0x36, 0x58, 0x30, 0xc1, 0xea, 0x87, 0xf3, 0x02, 0x4a, 0x83, 0x89, 0x8f, 0x01,
0x68, 0xbc, 0xd5, 0x3d, 0x4b, 0x8c, 0x45, 0x47, 0x6c, 0x11, 0x8f, 0xfa, 0x97, 0x05, 0x68, 0x47,
0xb8, 0xf4, 0x65, 0x87, 0x9f, 0x19, 0xe9, 0x74, 0xf1, 0x19, 0xa5, 0xd3, 0xa5, 0xd9, 0x43, 0xce,
0xb2, 0x2c, 0xe4, 0xfc, 0xe5, 0x22, 0x34, 0x43, 0xae, 0xed, 0x5a, 0xba, 0x9d, 0x29, 0x09, 0x7b,
0x22, 0xdd, 0x8a, 0xf3, 0xe9, 0x4d, 0x99, 0x0e, 0x65, 0x1c, 0x84, 0x96, 0x98, 0x02, 0x5d, 0xa6,
0x87, 0xee, 0xfa, 0xac, 0x62, 0xc9, 0x53, 0x3c, 0xa6, 0xac, 0xe6, 0x00, 0xa3, 0xb7, 0x00, 0x71,
0x0d, 0xeb, 0x9a, 0x76, 0xd7, 0xc3, 0x3d, 0xc7, 0x36, 0x98, 0xee, 0x95, 0xb5, 0x16, 0x7f, 0xb3,
0x69, 0xef, 0x31, 0x38, 0x7a, 0x1f, 0x4a, 0xfe, 0xe9, 0x90, 0x19, 0xd5, 0xa6, 0x34, 0x1c, 0x0b,
0xe9, 0xda, 0x3f, 0x1d, 0x62, 0x8d, 0xa2, 0x07, 0x16, 0xd9, 0x77, 0xf5, 0x63, 0x1e, 0x99, 0x73,
0x8b, 0xcc, 0x20, 0xd1, 0x0a, 0xc3, 0x5c, 0xac, 0xc2, 0xc0, 0x24, 0x3b, 0x50, 0xe8, 0xae, 0xef,
0x5b, 0xb4, 0xe6, 0x4a, 0x25, 0x3b, 0x80, 0xee, 0xfb, 0x16, 0xd9, 0xa4, 0xef, 0xf8, 0xba, 0xc5,
0xf4, 0xa3, 0xc6, 0x2d, 0x07, 0x81, 0xd0, 0xbc, 0xf1, 0x5f, 0x88, 0xe5, 0x13, 0x84, 0x69, 0xd8,
0x1b, 0x59, 0xd9, 0xfa, 0x38, 0xbe, 0xe6, 0x35, 0x49, 0x15, 0xbf, 0x0e, 0x75, 0x2e, 0x15, 0x67,
0x90, 0x2a, 0x60, 0x43, 0xb6, 0xc6, 0x88, 0x79, 0xf9, 0x19, 0x89, 0x79, 0x65, 0x8a, 0xaa, 0x91,
0xfc, 0x6c, 0xd4, 0x1f, 0x2a, 0xf0, 0x52, 0xca, 0x6a, 0x8e, 0x65, 0xed, 0xf8, 0xcc, 0x9c, 0x5b,
0xd3, 0xe4, 0x94, 0xdc, 0x37, 0x7c, 0x04, 0x15, 0x97, 0xce, 0xce, 0x5b, 0x7c, 0xd7, 0xc7, 0x0a,
0x1f, 0x23, 0x44, 0xe3, 0x43, 0xd4, 0xdf, 0x56, 0x60, 0x39, 0x4d, 0xea, 0x0c, 0x0e, 0x7f, 0x15,
0xe6, 0xd8, 0xd4, 0x81, 0x8e, 0xde, 0x1c, 0xaf, 0xa3, 0x21, 0x73, 0xb4, 0x60, 0xa0, 0xba, 0x07,
0x4b, 0x41, 0x5c, 0x10, 0xb2, 0x7e, 0x1b, 0xfb, 0xfa, 0x98, 0xbc, 0xf4, 0x2a, 0xd4, 0x59, 0x82,
0xc3, 0xf2, 0x3d, 0x56, 0xd1, 0x81, 0xc7, 0xa2, 0x44, 0xaa, 0xfe, 0xb7, 0x02, 0x17, 0xa8, 0x63,
0x4d, 0xf6, 0xd4, 0xf2, 0xf4, 0x5b, 0x55, 0x51, 0x30, 0xda, 0xd1, 0x07, 0xfc, 0x72, 0x57, 0x4d,
0x8b, 0xc1, 0xd0, 0x66, 0xba, 0x82, 0x2a, 0xad, 0x5f, 0x84, 0x0d, 0xfa, 0x75, 0xdd, 0xd7, 0x69,
0x7f, 0x3e, 0x59, 0x3a, 0x0d, 0x1d, 0x7a, 0x69, 0x0a, 0x87, 0xae, 0x6e, 0xc1, 0x4b, 0x89, 0x9d,
0xce, 0x70, 0xa2, 0xea, 0x9f, 0x2a, 0xe4, 0x38, 0x62, 0x97, 0xe4, 0xa6, 0x0f, 0x7a, 0x2f, 0x8b,
0x66, 0x5e, 0xd7, 0x34, 0x92, 0x46, 0xc4, 0x40, 0x9f, 0x40, 0xcd, 0xc6, 0x27, 0xdd, 0x68, 0x9c,
0x94, 0x23, 0x23, 0xa8, 0xda, 0xf8, 0x84, 0xfe, 0x52, 0x77, 0x60, 0x39, 0x45, 0xea, 0x2c, 0x7b,
0xff, 0x1b, 0x05, 0x2e, 0xae, 0xbb, 0xce, 0xf0, 0xa1, 0xe9, 0xfa, 0x23, 0xdd, 0x8a, 0x5f, 0x7d,
0x78, 0x3e, 0x85, 0xc7, 0x4f, 0x53, 0xb9, 0xe7, 0x5b, 0x12, 0x0d, 0x4a, 0x13, 0xc5, 0x37, 0x1d,
0x89, 0xaf, 0xff, 0xab, 0x28, 0x23, 0x9e, 0xe3, 0x4d, 0x88, 0x4b, 0xf2, 0x24, 0x27, 0xd2, 0x0e,
0x46, 0x71, 0xda, 0x0e, 0x46, 0x86, 0x79, 0x2f, 0x3d, 0x23, 0xf3, 0x7e, 0xe6, 0xc2, 0xd9, 0xa7,
0x10, 0xef, 0x2e, 0x51, 0xef, 0x3c, 0x55, 0x5b, 0x6a, 0x15, 0x20, 0xec, 0xb4, 0xf0, 0x3b, 0xce,
0x79, 0xa6, 0x89, 0x8c, 0x22, 0xa7, 0x25, 0x5c, 0x29, 0xf7, 0xf4, 0x91, 0x0a, 0xff, 0x37, 0xa1,
0x23, 0x93, 0xd2, 0x59, 0x24, 0xff, 0xdf, 0x0a, 0x00, 0x9b, 0xe2, 0x5a, 0xfc, 0x74, 0xbe, 0xe0,
0x3a, 0x44, 0xa2, 0x91, 0x50, 0xdf, 0xa3, 0x52, 0x64, 0x10, 0x95, 0x10, 0xf9, 0x2c, 0xc1, 0x49,
0xe5, 0xb8, 0x06, 0x9d, 0x27, 0xa2, 0x35, 0x4c, 0x28, 0x92, 0xe6, 0xf7, 0x12, 0xd4, 0x5c, 0xe7,
0xa4, 0x4b, 0xd4, 0xcc, 0x08, 0xee, 0xfd, 0xbb, 0xce, 0x09, 0x51, 0x3e, 0x03, 0x2d, 0xc3, 0x9c,
0xaf, 0x7b, 0x47, 0x64, 0xfe, 0x4a, 0xe4, 0xf6, 0x8d, 0x81, 0x2e, 0x40, 0xf9, 0xc0, 0xb4, 0x30,
0xbb, 0xec, 0x51, 0xd3, 0xd8, 0x03, 0xfa, 0x6a, 0x70, 0x47, 0xb1, 0x9a, 0xfb, 0x86, 0x15, 0xbb,
0xa3, 0x7a, 0x1d, 0xe6, 0x89, 0x4c, 0x11, 0x22, 0x98, 0x82, 0xb7, 0x78, 0x9f, 0x83, 0x03, 0x09,
0xa9, 0xea, 0x17, 0x0a, 0x2c, 0x84, 0xac, 0xa5, 0x56, 0x8a, 0x18, 0x3e, 0x6a, 0xf4, 0xd6, 0x1c,
0x83, 0xd9, 0x93, 0x66, 0x86, 0xdb, 0x60, 0x03, 0x99, 0x69, 0x0b, 0x87, 0x8c, 0xcb, 0xb3, 0xc9,
0xe6, 0x09, 0x67, 0x4c, 0x23, 0xa8, 0x0c, 0x55, 0x5c, 0xe7, 0x64, 0xd3, 0x10, 0x2c, 0x63, 0x37,
0xff, 0x59, 0x56, 0x49, 0x58, 0xb6, 0x46, 0x2f, 0xff, 0x5f, 0x87, 0x79, 0xec, 0xba, 0x8e, 0xdb,
0x1d, 0x60, 0xcf, 0xd3, 0xfb, 0x98, 0x07, 0xf1, 0x0d, 0x0a, 0xdc, 0x66, 0x30, 0xf5, 0x6f, 0x4b,
0xd0, 0x0c, 0xb7, 0x12, 0x5c, 0x82, 0x30, 0x8d, 0xe0, 0x12, 0x84, 0x49, 0xce, 0x17, 0x5c, 0x66,
0x2f, 0x85, 0x04, 0xac, 0x16, 0xda, 0x8a, 0x56, 0xe3, 0xd0, 0x4d, 0x83, 0xf8, 0x6e, 0xc2, 0x20,
0xdb, 0x31, 0x70, 0x28, 0x01, 0x10, 0x80, 0xb8, 0x00, 0xc4, 0x04, 0xa9, 0x94, 0x43, 0x90, 0xca,
0x39, 0x04, 0xa9, 0x22, 0x11, 0xa4, 0x25, 0xa8, 0x3c, 0x1e, 0xf5, 0x8e, 0xb0, 0xcf, 0xc3, 0x3a,
0xfe, 0x14, 0x17, 0xb0, 0x6a, 0x42, 0xc0, 0x84, 0x1c, 0xd5, 0xa2, 0x72, 0x74, 0x09, 0x6a, 0xac,
0x1b, 0xdf, 0xf5, 0x3d, 0xda, 0x5a, 0x2c, 0x6a, 0x55, 0x06, 0xd8, 0xf7, 0xd0, 0x07, 0x41, 0xcc,
0x57, 0x97, 0x59, 0x04, 0x6a, 0x9a, 0x12, 0x52, 0x12, 0x44, 0x7c, 0xaf, 0xc3, 0x42, 0x84, 0x1d,
0x54, 0xce, 0x58, 0xff, 0x31, 0x92, 0x12, 0x50, 0x5f, 0x72, 0x03, 0x9a, 0x21, 0x4b, 0x28, 0xde,
0x3c, 0xcb, 0xc4, 0x04, 0x94, 0xa2, 0x09, 0x71, 0x6f, 0x9e, 0x51, 0xdc, 0x2f, 0x42, 0x95, 0xa7,
0x50, 0x5e, 0x7b, 0x21, 0x5e, 0xed, 0xc8, 0xa5, 0x09, 0xdf, 0x06, 0x14, 0x6e, 0x71, 0xb6, 0xb8,
0x33, 0x21, 0x43, 0x85, 0xa4, 0x0c, 0xa9, 0x3f, 0x52, 0x60, 0x31, 0xba, 0xd8, 0xb4, 0x2e, 0xfc,
0x13, 0xa8, 0xb3, 0x0e, 0x70, 0x97, 0x98, 0x10, 0x5e, 0x6a, 0xba, 0x3c, 0xf6, 0xf0, 0x34, 0x08,
0x3f, 0x30, 0x22, 0x8c, 0x39, 0x71, 0xdc, 0x23, 0xd3, 0xee, 0x77, 0x09, 0x65, 0xa2, 0x5a, 0xcb,
0x81, 0x3b, 0x04, 0xa6, 0x7e, 0x5f, 0x81, 0x2b, 0x0f, 0x86, 0x86, 0xee, 0xe3, 0x48, 0x2c, 0x33,
0xeb, 0xb5, 0xd5, 0xf7, 0x83, 0x7b, 0xa3, 0x85, 0x7c, 0xbd, 0x4a, 0x86, 0xad, 0xfe, 0xb9, 0xa0,
0x25, 0x75, 0x1b, 0x7e, 0x7a, 0x5a, 0x3a, 0x50, 0x3d, 0xe6, 0xd3, 0x05, 0x1f, 0x4c, 0x05, 0xcf,
0xb1, 0x7e, 0x78, 0xf1, 0xec, 0xfd, 0x70, 0x75, 0x1b, 0x2e, 0x6a, 0xd8, 0xc3, 0xb6, 0x11, 0xdb,
0xcd, 0xd4, 0x65, 0xab, 0x21, 0x74, 0x64, 0xd3, 0xcd, 0x22, 0xac, 0x2c, 0x0a, 0xee, 0xba, 0x64,
0x5a, 0x9f, 0xdb, 0x6b, 0x12, 0x7c, 0xd1, 0x75, 0x7c, 0xf5, 0xcf, 0x0a, 0xb0, 0x7c, 0xd7, 0x30,
0xb8, 0xa9, 0xe7, 0x71, 0xdd, 0xf3, 0x0a, 0xb9, 0x93, 0x21, 0x69, 0x31, 0x1d, 0x92, 0x3e, 0x2b,
0xf3, 0xcb, 0x1d, 0x91, 0x3d, 0x1a, 0x04, 0x5e, 0xd8, 0x65, 0x57, 0xc8, 0x3e, 0xe2, 0x0d, 0xd2,
0xae, 0xe5, 0xf4, 0xa9, 0x27, 0x9e, 0x1c, 0xa9, 0x55, 0x83, 0xf2, 0x9b, 0x3a, 0x84, 0x76, 0x9a,
0x59, 0x33, 0x9a, 0x92, 0x80, 0x23, 0x43, 0x87, 0x95, 0x71, 0x1b, 0x24, 0x18, 0xa3, 0xa0, 0x5d,
0xc7, 0x53, 0xff, 0xb7, 0x00, 0xed, 0x3d, 0xfd, 0x18, 0xff, 0xf4, 0x1c, 0xd0, 0x67, 0x70, 0xc1,
0xd3, 0x8f, 0x71, 0x37, 0x92, 0x62, 0x77, 0x5d, 0xfc, 0x84, 0x07, 0xb3, 0x6f, 0xc8, 0x2c, 0x89,
0xf4, 0xa6, 0x95, 0xb6, 0xe8, 0xc5, 0xe0, 0x1a, 0x7e, 0x82, 0x5e, 0x83, 0x85, 0xe8, 0x55, 0x3e,
0x42, 0x5a, 0x95, 0xb2, 0x7c, 0x3e, 0x72, 0x53, 0x6f, 0xd3, 0x50, 0x9f, 0xc0, 0xcb, 0x0f, 0x6c,
0x0f, 0xfb, 0x9b, 0xe1, 0x6d, 0xb3, 0x19, 0x93, 0xd1, 0xab, 0x50, 0x0f, 0x19, 0x9f, 0xfa, 0x52,
0xc6, 0xf0, 0x54, 0x07, 0x3a, 0xdb, 0xba, 0x7b, 0x14, 0x14, 0xac, 0xd7, 0xd9, 0xad, 0xa0, 0xe7,
0xb8, 0xe0, 0x81, 0xb8, 0x24, 0xa7, 0xe1, 0x03, 0xec, 0x62, 0xbb, 0x87, 0xb7, 0x9c, 0xde, 0x51,
0xe4, 0xf2, 0xb8, 0x12, 0xbd, 0x3c, 0x3e, 0xed, 0x65, 0x74, 0xf5, 0xc7, 0x05, 0x58, 0xba, 0x6b,
0xf9, 0xd8, 0x0d, 0x6b, 0x08, 0x67, 0x29, 0x87, 0x84, 0xf5, 0x89, 0xc2, 0x34, 0x0d, 0x87, 0x1c,
0xfd, 0x4a, 0x59, 0x35, 0xa5, 0x34, 0x65, 0x35, 0xe5, 0x2e, 0xc0, 0xd0, 0x75, 0x86, 0xd8, 0xf5,
0x4d, 0x1c, 0x24, 0x82, 0x39, 0x62, 0x9c, 0xc8, 0x20, 0xf5, 0x33, 0x68, 0xdd, 0xef, 0xad, 0x39,
0xf6, 0x81, 0xe9, 0x0e, 0x02, 0x46, 0xa5, 0x94, 0x4e, 0xc9, 0xa1, 0x74, 0x85, 0x94, 0xd2, 0xa9,
0x26, 0x2c, 0x46, 0xe6, 0x9e, 0xd1, 0x70, 0xf5, 0x7b, 0xdd, 0x03, 0xd3, 0x36, 0xe9, 0xad, 0xbb,
0x02, 0x8d, 0x51, 0xa1, 0xdf, 0xdb, 0xe0, 0x10, 0xf5, 0x7b, 0x0a, 0x5c, 0xd2, 0x30, 0x51, 0x9e,
0xd8, 0x0d, 0xaa, 0x19, 0x62, 0x8a, 0xaf, 0x40, 0x69, 0xe0, 0x89, 0x7a, 0xbc, 0xec, 0xa6, 0x4e,
0x6c, 0x25, 0x8d, 0x62, 0xdf, 0xfa, 0x44, 0xdc, 0x9b, 0xde, 0x3f, 0x1d, 0x62, 0x34, 0x07, 0xc5,
0x1d, 0x7c, 0xd2, 0x3a, 0x87, 0x00, 0x2a, 0x3b, 0x8e, 0x3b, 0xd0, 0xad, 0x96, 0x82, 0xea, 0x30,
0xc7, 0x3b, 0x91, 0xad, 0x02, 0x9a, 0x87, 0xda, 0x5a, 0xd0, 0xb1, 0x69, 0x15, 0x6f, 0xfd, 0x81,
0x02, 0x8b, 0xa9, 0x5e, 0x19, 0x6a, 0x02, 0x3c, 0xb0, 0x7b, 0xbc, 0x89, 0xd8, 0x3a, 0x87, 0x1a,
0x50, 0x0d, 0x5a, 0x8a, 0x6c, 0xbe, 0x7d, 0x87, 0x62, 0xb7, 0x0a, 0xa8, 0x05, 0x0d, 0x36, 0x70,
0xd4, 0xeb, 0x61, 0xcf, 0x6b, 0x15, 0x05, 0x64, 0x43, 0x37, 0xad, 0x91, 0x8b, 0x5b, 0x25, 0xb2,
0xe6, 0xbe, 0xc3, 0xbf, 0x1c, 0x69, 0x95, 0x11, 0x82, 0x66, 0xf0, 0x19, 0x09, 0x1f, 0x54, 0x89,
0xc0, 0x82, 0x61, 0x73, 0xb7, 0x1e, 0x45, 0xbb, 0x1a, 0x74, 0x7b, 0xcb, 0x70, 0xfe, 0x81, 0x6d,
0xe0, 0x03, 0xd3, 0xc6, 0x46, 0xf8, 0xaa, 0x75, 0x0e, 0x9d, 0x87, 0x85, 0x6d, 0xec, 0xf6, 0x71,
0x04, 0x58, 0x40, 0x8b, 0x30, 0xbf, 0x6d, 0x3e, 0x8d, 0x80, 0x8a, 0x6a, 0xa9, 0xaa, 0xb4, 0x94,
0x95, 0x3f, 0x7c, 0x05, 0x6a, 0x84, 0x99, 0x6b, 0x8e, 0xe3, 0x1a, 0xc8, 0x02, 0x44, 0x3f, 0xb4,
0x1a, 0x0c, 0x1d, 0x5b, 0x7c, 0xbb, 0x8a, 0x6e, 0xc7, 0x0f, 0x80, 0x3f, 0xa4, 0x11, 0xf9, 0x81,
0x77, 0x5e, 0x95, 0xe2, 0x27, 0x90, 0xd5, 0x73, 0x68, 0x40, 0x57, 0xdb, 0x37, 0x07, 0x78, 0xdf,
0xec, 0x1d, 0x05, 0x81, 0xda, 0x3b, 0x19, 0x61, 0x59, 0x1a, 0x35, 0x58, 0xef, 0xba, 0x74, 0x3d,
0xf6, 0x25, 0x5c, 0x20, 0xfb, 0xea, 0x39, 0xf4, 0x04, 0x2e, 0xdc, 0xc7, 0x91, 0x98, 0x37, 0x58,
0x70, 0x25, 0x7b, 0xc1, 0x14, 0xf2, 0x19, 0x97, 0xdc, 0x82, 0x32, 0x15, 0x37, 0x24, 0x0b, 0x8b,
0xa3, 0x7f, 0x41, 0xd1, 0xb9, 0x96, 0x8d, 0x20, 0x66, 0xfb, 0x36, 0x2c, 0x24, 0x3e, 0x4e, 0x47,
0x32, 0x27, 0x29, 0xff, 0x9b, 0x81, 0xce, 0xad, 0x3c, 0xa8, 0x62, 0xad, 0x3e, 0x34, 0xe3, 0x1f,
0x68, 0xa1, 0x9b, 0x39, 0xbe, 0x86, 0x65, 0x2b, 0xbd, 0x91, 0xfb, 0xbb, 0x59, 0x2a, 0x04, 0xad,
0xe4, 0xc7, 0xd2, 0xe8, 0xd6, 0xd8, 0x09, 0xe2, 0xc2, 0xf6, 0x66, 0x2e, 0x5c, 0xb1, 0xdc, 0x29,
0x15, 0x82, 0xd4, 0x27, 0x98, 0x49, 0x19, 0x0f, 0xa6, 0xc9, 0xfa, 0x36, 0xb4, 0x73, 0x27, 0x37,
0x7e, 0x74, 0xa7, 0xc9, 0x8f, 0x5e, 0xa5, 0x3b, 0xcd, 0xf8, 0x66, 0x57, 0xba, 0xd3, 0xac, 0xaf,
0x68, 0xd5, 0x73, 0xe8, 0x57, 0xd8, 0xe5, 0x32, 0xd9, 0x57, 0x93, 0xe8, 0x5d, 0x39, 0xf5, 0x63,
0x3e, 0xf7, 0xec, 0xac, 0x9c, 0x65, 0x88, 0x20, 0xe2, 0xbb, 0xf4, 0x56, 0x98, 0xe4, 0xbb, 0xc3,
0xa4, 0x9a, 0x07, 0xf3, 0x65, 0x7f, 0x52, 0xd9, 0x79, 0xf7, 0x0c, 0x23, 0x04, 0x01, 0x4e, 0xf2,
0xe3, 0xf7, 0x40, 0xeb, 0xef, 0x4c, 0x14, 0xd2, 0xe9, 0x54, 0xfe, 0x5b, 0xb0, 0x90, 0x88, 0x52,
0x51, 0xfe, 0x48, 0xb6, 0x33, 0xce, 0x23, 0x33, 0x0b, 0x90, 0xb8, 0x05, 0x86, 0x32, 0x94, 0x4d,
0x72, 0x53, 0xac, 0x73, 0x2b, 0x0f, 0xaa, 0xd8, 0xc8, 0x10, 0x16, 0x13, 0x2f, 0x1f, 0xae, 0xa0,
0x37, 0x73, 0xaf, 0xf6, 0x70, 0xa5, 0xf3, 0x56, 0xfe, 0xf5, 0x1e, 0xae, 0xa8, 0xe7, 0x90, 0x47,
0xfd, 0x41, 0xe2, 0xa6, 0x10, 0xca, 0x98, 0x45, 0x7e, 0x63, 0xaa, 0xf3, 0x76, 0x4e, 0x6c, 0xb1,
0xcd, 0x63, 0x38, 0x2f, 0xb9, 0xf0, 0x85, 0xde, 0x1e, 0x2b, 0x1e, 0xc9, 0x9b, 0x6e, 0x9d, 0xdb,
0x79, 0xd1, 0x23, 0xde, 0xa8, 0x15, 0xd0, 0x75, 0xd7, 0xb2, 0x58, 0xac, 0xf1, 0x56, 0x96, 0xa3,
0x8d, 0xa1, 0x65, 0x6c, 0x35, 0x13, 0x5b, 0x2c, 0xf9, 0x4b, 0x80, 0xf6, 0x0e, 0x9d, 0x13, 0x1a,
0x15, 0xf6, 0x47, 0xae, 0xce, 0x02, 0xd9, 0x2c, 0x7f, 0x9b, 0x46, 0xcd, 0x50, 0xc4, 0xb1, 0x23,
0xc4, 0xe2, 0x5d, 0x80, 0xfb, 0xd8, 0xdf, 0xc6, 0xbe, 0x4b, 0xb4, 0xff, 0xb5, 0x2c, 0xda, 0x39,
0x42, 0xb0, 0xd4, 0xeb, 0x13, 0xf1, 0xa2, 0x0c, 0xdd, 0xd6, 0xed, 0x91, 0x6e, 0x45, 0xbe, 0x50,
0x92, 0x33, 0x34, 0x89, 0x36, 0x9e, 0xa1, 0x69, 0x6c, 0xb1, 0xe4, 0x89, 0x08, 0x97, 0x22, 0x7d,
0xe7, 0xf1, 0xe1, 0x52, 0xfa, 0xce, 0x53, 0xd2, 0x95, 0x8c, 0xc1, 0x17, 0x0b, 0x7f, 0xae, 0xd0,
0x6b, 0x8a, 0x09, 0x84, 0x47, 0xa6, 0x7f, 0xb8, 0x6b, 0xe9, 0xb6, 0x97, 0x87, 0x04, 0x8a, 0x78,
0x06, 0x12, 0x38, 0xbe, 0x20, 0xc1, 0x80, 0xf9, 0x58, 0x3b, 0x18, 0xc9, 0x3e, 0xe9, 0x91, 0xb5,
0xc6, 0x3b, 0x37, 0x27, 0x23, 0x8a, 0x55, 0x0e, 0x61, 0x3e, 0x10, 0x68, 0xc6, 0xdc, 0x37, 0xc6,
0x0a, 0x7d, 0x8c, 0xaf, 0xb7, 0xf2, 0xa0, 0x8a, 0x95, 0x3c, 0x40, 0xe9, 0x6e, 0x17, 0xca, 0xd7,
0x25, 0x1d, 0x67, 0x7c, 0xb2, 0x5b, 0x68, 0xcc, 0x9e, 0x27, 0x3a, 0xcb, 0x72, 0x67, 0x21, 0x6d,
0x94, 0x4b, 0xed, 0x79, 0x46, 0xa3, 0x5a, 0x3d, 0x87, 0x1e, 0x41, 0x85, 0xff, 0x5f, 0xd5, 0xab,
0xe3, 0xeb, 0xca, 0x7c, 0xf6, 0x1b, 0x13, 0xb0, 0xc4, 0xc4, 0x47, 0xb0, 0x9c, 0x51, 0x55, 0x96,
0xc6, 0x19, 0xe3, 0x2b, 0xd0, 0x93, 0x3c, 0xa0, 0x58, 0x2c, 0x55, 0x36, 0x1e, 0xb3, 0x58, 0x56,
0x89, 0x79, 0xd2, 0x62, 0x3a, 0xa0, 0xf4, 0x9f, 0x10, 0x48, 0x65, 0x22, 0xf3, 0xbf, 0x0a, 0x72,
0x2c, 0x91, 0xfe, 0x1f, 0x01, 0xe9, 0x12, 0x99, 0x7f, 0x37, 0x30, 0x69, 0x89, 0x2e, 0x2c, 0xa6,
0xea, 0x8a, 0x52, 0x47, 0x9e, 0x55, 0x7d, 0x9c, 0xb4, 0x40, 0x1f, 0x5e, 0x92, 0xd6, 0xd0, 0xa4,
0x31, 0xd6, 0xb8, 0x6a, 0xdb, 0xa4, 0x85, 0x7a, 0x70, 0x5e, 0x52, 0x39, 0x93, 0xfa, 0xea, 0xec,
0x0a, 0xdb, 0xa4, 0x45, 0x0e, 0xa0, 0xb3, 0xea, 0x3a, 0xba, 0xd1, 0xd3, 0x3d, 0x9f, 0x56, 0xb3,
0x48, 0x7e, 0x1d, 0x04, 0xb9, 0xf2, 0x84, 0x4b, 0x5a, 0xf3, 0x9a, 0xb4, 0xce, 0x63, 0xa8, 0x53,
0x81, 0x64, 0x7f, 0x8a, 0x83, 0xe4, 0x9e, 0x2e, 0x82, 0x91, 0x61, 0x3e, 0x65, 0x88, 0x42, 0x35,
0x7f, 0x01, 0x6a, 0xa2, 0x0a, 0x84, 0x64, 0x57, 0xb8, 0x92, 0xf5, 0xa7, 0xce, 0xab, 0xe3, 0x91,
0xc4, 0xcc, 0x18, 0x2e, 0xc8, 0x6a, 0x3e, 0xd2, 0x3c, 0x6a, 0x4c, 0x71, 0x68, 0x02, 0x93, 0x56,
0xbe, 0xa8, 0x41, 0x35, 0x18, 0xf8, 0x25, 0x57, 0x27, 0x5e, 0x40, 0xb9, 0xe0, 0x5b, 0xb0, 0x90,
0xf8, 0x8b, 0x06, 0xa9, 0xbc, 0xc9, 0xff, 0xc6, 0x61, 0x92, 0xbc, 0x3d, 0xe2, 0xff, 0x1e, 0x29,
0x02, 0xeb, 0xd7, 0xb3, 0x4a, 0x0e, 0xc9, 0x98, 0x7a, 0xc2, 0xc4, 0xff, 0xbf, 0xc3, 0xca, 0x1d,
0x80, 0x48, 0x40, 0x39, 0xfe, 0x0e, 0x2e, 0x89, 0x91, 0x26, 0x71, 0x6b, 0x20, 0x8d, 0x19, 0xdf,
0xc8, 0x73, 0x9f, 0x31, 0xdb, 0xeb, 0x67, 0x47, 0x8a, 0x0f, 0xa0, 0x11, 0xbd, 0x1d, 0x8f, 0xa4,
0xff, 0x55, 0x98, 0xbe, 0x3e, 0x3f, 0x69, 0x17, 0xdb, 0x67, 0x0c, 0x26, 0x26, 0x4c, 0xe7, 0x11,
0x2f, 0x98, 0xec, 0x86, 0x66, 0x78, 0xc1, 0x8c, 0x1e, 0xac, 0x34, 0xf8, 0xca, 0x6e, 0xb1, 0xb2,
0x7a, 0x4c, 0xb2, 0xc5, 0x27, 0xad, 0xc7, 0x64, 0x34, 0x4d, 0xa5, 0xf5, 0x98, 0xac, 0x9e, 0xa1,
0x7a, 0x6e, 0xf5, 0xbd, 0xcf, 0xde, 0xed, 0x9b, 0xfe, 0xe1, 0xe8, 0x31, 0xd9, 0xfd, 0x1d, 0x36,
0xf4, 0x6d, 0xd3, 0xe1, 0xbf, 0xee, 0x04, 0xe2, 0x7e, 0x87, 0xce, 0x76, 0x87, 0xcc, 0x36, 0x7c,
0xfc, 0xb8, 0x42, 0x9f, 0xde, 0xfb, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x15, 0xee, 0xcc, 0x56,
0x1b, 0x57, 0x00, 0x00,
0x56, 0x53, 0xfd, 0xe5, 0xee, 0xd3, 0xed, 0x76, 0xfb, 0xce, 0xc4, 0xee, 0xe9, 0xf9, 0x4c, 0x4d,
0x26, 0x99, 0x4c, 0x92, 0x99, 0xc4, 0xd9, 0xb0, 0xd9, 0x64, 0x93, 0x65, 0x6c, 0xc7, 0x13, 0x83,
0xed, 0x78, 0xcb, 0x9e, 0x09, 0xca, 0x22, 0xb5, 0x6a, 0xba, 0xae, 0xdb, 0xb5, 0xae, 0xae, 0xea,
0xa9, 0xaa, 0xb6, 0xc7, 0xcb, 0xc3, 0x06, 0xd0, 0x22, 0x2d, 0x42, 0x2c, 0x42, 0x20, 0xe0, 0x01,
0x09, 0xf1, 0xb4, 0x2c, 0x5a, 0x84, 0x04, 0x08, 0x09, 0x21, 0xf1, 0x1a, 0xe0, 0x01, 0x21, 0x24,
0xc4, 0x13, 0xbc, 0xf1, 0xf1, 0xc0, 0x13, 0x7f, 0x00, 0xdd, 0x8f, 0xba, 0xf5, 0x75, 0xab, 0xbb,
0xdc, 0x3d, 0x93, 0x59, 0xc1, 0x5b, 0xdf, 0x53, 0xe7, 0xde, 0x7b, 0xee, 0xb9, 0xe7, 0x9c, 0x7b,
0x3e, 0xee, 0x6d, 0x68, 0x19, 0xba, 0xaf, 0x77, 0x7b, 0x8e, 0xe3, 0x1a, 0x77, 0x86, 0xae, 0xe3,
0x3b, 0x68, 0x71, 0x60, 0x5a, 0xc7, 0x23, 0x8f, 0xb5, 0xee, 0x90, 0xcf, 0x9d, 0x46, 0xcf, 0x19,
0x0c, 0x1c, 0x9b, 0x81, 0x3a, 0x4d, 0xd3, 0xf6, 0xb1, 0x6b, 0xeb, 0x16, 0x6f, 0x37, 0xa2, 0x1d,
0x3a, 0x0d, 0xaf, 0x77, 0x88, 0x07, 0x3a, 0x6b, 0xa9, 0x73, 0x50, 0xfe, 0x68, 0x30, 0xf4, 0x4f,
0xd5, 0x3f, 0x57, 0xa0, 0xb1, 0x61, 0x8d, 0xbc, 0x43, 0x0d, 0x3f, 0x1e, 0x61, 0xcf, 0x47, 0x6f,
0x42, 0xe9, 0x91, 0xee, 0xe1, 0xb6, 0x72, 0x5d, 0xb9, 0x55, 0x5f, 0xb9, 0x7c, 0x27, 0x36, 0x2b,
0x9f, 0x6f, 0xdb, 0xeb, 0xaf, 0xea, 0x1e, 0xd6, 0x28, 0x26, 0x42, 0x50, 0x32, 0x1e, 0x6d, 0xae,
0xb7, 0x0b, 0xd7, 0x95, 0x5b, 0x45, 0x8d, 0xfe, 0x46, 0x57, 0x01, 0x3c, 0xdc, 0x1f, 0x60, 0xdb,
0xdf, 0x5c, 0xf7, 0xda, 0xc5, 0xeb, 0xc5, 0x5b, 0x45, 0x2d, 0x02, 0x41, 0x2a, 0x34, 0x7a, 0x8e,
0x65, 0xe1, 0x9e, 0x6f, 0x3a, 0xf6, 0xe6, 0x7a, 0xbb, 0x44, 0xfb, 0xc6, 0x60, 0xa8, 0x03, 0x55,
0xd3, 0xdb, 0x1c, 0x0c, 0x1d, 0xd7, 0x6f, 0x97, 0xaf, 0x2b, 0xb7, 0xaa, 0x9a, 0x68, 0xab, 0xff,
0xae, 0xc0, 0x3c, 0x27, 0xdb, 0x1b, 0x3a, 0xb6, 0x87, 0xd1, 0xdb, 0x50, 0xf1, 0x7c, 0xdd, 0x1f,
0x79, 0x9c, 0xf2, 0x4b, 0x52, 0xca, 0xf7, 0x28, 0x8a, 0xc6, 0x51, 0xa5, 0xa4, 0x27, 0x49, 0x2b,
0x4a, 0x48, 0x8b, 0x2f, 0xaf, 0x94, 0x5a, 0xde, 0x2d, 0x58, 0x38, 0x20, 0xd4, 0xed, 0x85, 0x48,
0x65, 0x8a, 0x94, 0x04, 0x93, 0x91, 0x7c, 0x73, 0x80, 0x3f, 0x39, 0xd8, 0xc3, 0xba, 0xd5, 0xae,
0xd0, 0xb9, 0x22, 0x10, 0xf5, 0x1f, 0x15, 0x68, 0x09, 0xf4, 0x60, 0x8f, 0x2e, 0x40, 0xb9, 0xe7,
0x8c, 0x6c, 0x9f, 0x2e, 0x75, 0x5e, 0x63, 0x0d, 0xf4, 0x22, 0x34, 0x7a, 0x87, 0xba, 0x6d, 0x63,
0xab, 0x6b, 0xeb, 0x03, 0x4c, 0x17, 0x55, 0xd3, 0xea, 0x1c, 0xb6, 0xa3, 0x0f, 0x70, 0xae, 0xb5,
0x5d, 0x87, 0xfa, 0x50, 0x77, 0x7d, 0x33, 0xb6, 0x33, 0x51, 0xd0, 0xb8, 0x8d, 0x21, 0x33, 0x98,
0xf4, 0xd7, 0xbe, 0xee, 0x1d, 0x6d, 0xae, 0xf3, 0x15, 0xc5, 0x60, 0xea, 0x1f, 0x28, 0xb0, 0x74,
0xcf, 0xf3, 0xcc, 0xbe, 0x9d, 0x5a, 0xd9, 0x12, 0x54, 0x6c, 0xc7, 0xc0, 0x9b, 0xeb, 0x74, 0x69,
0x45, 0x8d, 0xb7, 0xd0, 0x25, 0xa8, 0x0d, 0x31, 0x76, 0xbb, 0xae, 0x63, 0x05, 0x0b, 0xab, 0x12,
0x80, 0xe6, 0x58, 0x18, 0x7d, 0x13, 0x16, 0xbd, 0xc4, 0x40, 0x4c, 0xe6, 0xea, 0x2b, 0x37, 0xee,
0xa4, 0xb4, 0xe6, 0x4e, 0x72, 0x52, 0x2d, 0xdd, 0x5b, 0xfd, 0xbc, 0x00, 0xe7, 0x05, 0x1e, 0xa3,
0x95, 0xfc, 0x26, 0x9c, 0xf7, 0x70, 0x5f, 0x90, 0xc7, 0x1a, 0x79, 0x38, 0x2f, 0xb6, 0xac, 0x18,
0xdd, 0xb2, 0x3c, 0x6a, 0x90, 0xd8, 0x8f, 0x72, 0x7a, 0x3f, 0xae, 0x41, 0x1d, 0x3f, 0x19, 0x9a,
0x2e, 0xee, 0x12, 0xc1, 0xa1, 0x2c, 0x2f, 0x69, 0xc0, 0x40, 0xfb, 0xe6, 0x20, 0xaa, 0x1b, 0x73,
0xb9, 0x75, 0x43, 0xfd, 0x43, 0x05, 0x96, 0x53, 0xbb, 0xc4, 0x95, 0x4d, 0x83, 0x16, 0x5d, 0x79,
0xc8, 0x19, 0xa2, 0x76, 0x84, 0xe1, 0x2f, 0x8f, 0x63, 0x78, 0x88, 0xae, 0xa5, 0xfa, 0x47, 0x88,
0x2c, 0xe4, 0x27, 0xf2, 0x08, 0x96, 0xef, 0x63, 0x9f, 0x4f, 0x40, 0xbe, 0x61, 0x6f, 0x7a, 0x43,
0x16, 0xd7, 0xea, 0x42, 0x52, 0xab, 0xd5, 0x3f, 0x2d, 0x08, 0x5d, 0xa4, 0x53, 0x6d, 0xda, 0x07,
0x0e, 0xba, 0x0c, 0x35, 0x81, 0xc2, 0xa5, 0x22, 0x04, 0xa0, 0xaf, 0x42, 0x99, 0x50, 0xca, 0x44,
0xa2, 0xb9, 0xf2, 0xa2, 0x7c, 0x4d, 0x91, 0x31, 0x35, 0x86, 0x8f, 0x36, 0xa1, 0xe9, 0xf9, 0xba,
0xeb, 0x77, 0x87, 0x8e, 0x47, 0xf7, 0x99, 0x0a, 0x4e, 0x7d, 0x45, 0x8d, 0x8f, 0x20, 0x4c, 0xfe,
0xb6, 0xd7, 0xdf, 0xe5, 0x98, 0xda, 0x3c, 0xed, 0x19, 0x34, 0xd1, 0x47, 0xd0, 0xc0, 0xb6, 0x11,
0x0e, 0x54, 0xca, 0x3d, 0x50, 0x1d, 0xdb, 0x86, 0x18, 0x26, 0xdc, 0x9f, 0x72, 0xfe, 0xfd, 0xf9,
0x35, 0x05, 0xda, 0xe9, 0x0d, 0x9a, 0xc5, 0x64, 0xbf, 0xcf, 0x3a, 0x61, 0xb6, 0x41, 0x63, 0x35,
0x5c, 0x6c, 0x92, 0xc6, 0xbb, 0xa8, 0xbf, 0xad, 0xc0, 0x0b, 0x21, 0x39, 0xf4, 0xd3, 0xb3, 0x92,
0x16, 0x74, 0x1b, 0x5a, 0xa6, 0xdd, 0xb3, 0x46, 0x06, 0x7e, 0x60, 0x7f, 0x8c, 0x75, 0xcb, 0x3f,
0x3c, 0xa5, 0x7b, 0x58, 0xd5, 0x52, 0x70, 0xf5, 0x5f, 0x0b, 0xb0, 0x94, 0xa4, 0x6b, 0x16, 0x26,
0x7d, 0x05, 0xca, 0xa6, 0x7d, 0xe0, 0x04, 0x3c, 0xba, 0x3a, 0x46, 0x29, 0xc9, 0x5c, 0x0c, 0x19,
0x39, 0x80, 0x02, 0x33, 0xd6, 0x3b, 0xc4, 0xbd, 0xa3, 0xa1, 0x63, 0x52, 0x83, 0x45, 0x86, 0xf8,
0x69, 0xc9, 0x10, 0x72, 0x8a, 0xef, 0xac, 0xb1, 0x31, 0xd6, 0xc4, 0x10, 0x1f, 0xd9, 0xbe, 0x7b,
0xaa, 0x2d, 0xf6, 0x92, 0xf0, 0xce, 0x21, 0x2c, 0xc9, 0x91, 0x51, 0x0b, 0x8a, 0x47, 0xf8, 0x94,
0x2e, 0xb9, 0xa6, 0x91, 0x9f, 0xe8, 0x5d, 0x28, 0x1f, 0xeb, 0xd6, 0x08, 0x73, 0xeb, 0x90, 0x47,
0x7c, 0x59, 0x87, 0xf7, 0x0a, 0xef, 0x2a, 0xea, 0xef, 0x28, 0xb0, 0xbc, 0x65, 0x7a, 0x01, 0xbd,
0xde, 0x4f, 0xce, 0xd6, 0x7f, 0x4f, 0x81, 0x76, 0x9a, 0xb2, 0x2f, 0x7d, 0xf3, 0xd5, 0x01, 0x5c,
0xba, 0x8f, 0xfd, 0x4d, 0xdb, 0xc3, 0xae, 0xbf, 0x6a, 0xda, 0x96, 0xd3, 0xdf, 0xd5, 0xfd, 0xc3,
0x19, 0xac, 0x69, 0xcc, 0x30, 0x16, 0x12, 0x86, 0x51, 0xfd, 0xa1, 0x02, 0x97, 0xe5, 0xf3, 0xf1,
0xa5, 0x77, 0xa0, 0x7a, 0x60, 0x62, 0xcb, 0x20, 0x1c, 0x56, 0x28, 0x87, 0x45, 0x9b, 0x58, 0xd5,
0x21, 0x41, 0xe6, 0x2b, 0x7c, 0x31, 0x43, 0x16, 0xf6, 0x7c, 0xd7, 0xb4, 0xfb, 0x84, 0xb9, 0x1a,
0xc3, 0x8f, 0xf0, 0xb3, 0x98, 0xdf, 0x86, 0xfd, 0xaa, 0x02, 0x57, 0xef, 0x63, 0x7f, 0x4d, 0x1c,
0xca, 0xe4, 0xbb, 0xe9, 0xf9, 0x66, 0xcf, 0x7b, 0xba, 0x4e, 0x73, 0x0e, 0xef, 0x4c, 0xfd, 0x81,
0x02, 0xd7, 0x32, 0x89, 0xe1, 0xac, 0xe3, 0x87, 0x4e, 0x70, 0x24, 0xcb, 0x0f, 0x9d, 0x9f, 0xc5,
0xa7, 0x0f, 0x89, 0x7a, 0xec, 0xea, 0xa6, 0xcb, 0x0e, 0x9d, 0x29, 0x8f, 0xe0, 0x1f, 0x2b, 0x70,
0xe5, 0x3e, 0xf6, 0x77, 0x03, 0x87, 0xe4, 0x39, 0x72, 0x87, 0xe0, 0x44, 0x1c, 0xa3, 0xc0, 0x33,
0x8f, 0xc1, 0xd4, 0x5f, 0x67, 0xdb, 0x29, 0xa5, 0xf7, 0xb9, 0x30, 0xf0, 0x2a, 0xd5, 0x84, 0x88,
0x4a, 0x72, 0x9b, 0xc8, 0xd9, 0xa7, 0xfe, 0xbe, 0x02, 0x17, 0xef, 0xf5, 0x1e, 0x8f, 0x4c, 0x17,
0x73, 0xa4, 0x2d, 0xa7, 0x77, 0x34, 0x3d, 0x73, 0x43, 0x1f, 0xbb, 0x10, 0xf3, 0xb1, 0x27, 0xc5,
0x6c, 0x4b, 0x50, 0xf1, 0x99, 0x53, 0xcf, 0xdc, 0x54, 0xde, 0xa2, 0xf4, 0x69, 0xd8, 0xc2, 0xba,
0xf7, 0x93, 0x49, 0xdf, 0x0f, 0x4a, 0xd0, 0x78, 0xc8, 0x0f, 0x1f, 0xea, 0xb2, 0x25, 0x25, 0x49,
0x91, 0x7b, 0xdd, 0x11, 0xf7, 0x5d, 0xe6, 0xd1, 0xdf, 0x87, 0x79, 0x0f, 0xe3, 0xa3, 0x69, 0x1c,
0xb4, 0x06, 0xe9, 0x28, 0x1c, 0xab, 0x2d, 0x58, 0x1c, 0xd9, 0x34, 0x2e, 0xc4, 0x46, 0x70, 0x0a,
0x50, 0xc9, 0x9d, 0x6c, 0xbb, 0xd3, 0x1d, 0xd1, 0xc7, 0x3c, 0xf4, 0x8c, 0x8c, 0x55, 0xce, 0x35,
0x56, 0xb2, 0x1b, 0xda, 0x84, 0x96, 0xe1, 0x3a, 0xc3, 0x21, 0x36, 0xba, 0x5e, 0x30, 0x54, 0x25,
0xdf, 0x50, 0xbc, 0x9f, 0x18, 0xea, 0x4d, 0x38, 0x9f, 0xa4, 0x74, 0xd3, 0x20, 0xd1, 0x08, 0xd9,
0x43, 0xd9, 0x27, 0xf4, 0x3a, 0x2c, 0xa6, 0xf1, 0xab, 0x14, 0x3f, 0xfd, 0x01, 0xbd, 0x01, 0x28,
0x41, 0x2a, 0x41, 0xaf, 0x31, 0xf4, 0x38, 0x31, 0x9b, 0x86, 0xa7, 0x7e, 0x5f, 0x81, 0xa5, 0x4f,
0x75, 0xbf, 0x77, 0xb8, 0x3e, 0xe0, 0xba, 0x36, 0x83, 0xad, 0xfa, 0x00, 0x6a, 0xc7, 0x5c, 0x2e,
0x82, 0x03, 0xe9, 0x9a, 0x84, 0x3f, 0x51, 0x09, 0xd4, 0xc2, 0x1e, 0x24, 0x18, 0xbe, 0xb0, 0x11,
0x49, 0x0a, 0x3c, 0x07, 0xab, 0x39, 0x21, 0x9b, 0xa1, 0x3e, 0x01, 0xe0, 0xc4, 0x6d, 0x7b, 0xfd,
0x29, 0xe8, 0x7a, 0x17, 0xe6, 0xf8, 0x68, 0xdc, 0x2c, 0x4e, 0x92, 0x9f, 0x00, 0x5d, 0xfd, 0x51,
0x05, 0xea, 0x91, 0x0f, 0xa8, 0x09, 0x05, 0xa1, 0xaf, 0x05, 0xc9, 0xea, 0x0a, 0x93, 0xe3, 0xe7,
0x62, 0x3a, 0x7e, 0xbe, 0x09, 0x4d, 0x93, 0xfa, 0x21, 0x5d, 0xbe, 0x2b, 0xd4, 0x80, 0xd4, 0xb4,
0x79, 0x06, 0xe5, 0x22, 0x82, 0xae, 0x42, 0xdd, 0x1e, 0x0d, 0xba, 0xce, 0x41, 0xd7, 0x75, 0x4e,
0x3c, 0x1e, 0x88, 0xd7, 0xec, 0xd1, 0xe0, 0x93, 0x03, 0xcd, 0x39, 0xf1, 0xc2, 0x58, 0xaf, 0x72,
0xc6, 0x58, 0xef, 0x2a, 0xd4, 0x07, 0xfa, 0x13, 0x32, 0x6a, 0xd7, 0x1e, 0x0d, 0x68, 0x8c, 0x5e,
0xd4, 0x6a, 0x03, 0xfd, 0x89, 0xe6, 0x9c, 0xec, 0x8c, 0x06, 0xe8, 0x16, 0xb4, 0x2c, 0xdd, 0xf3,
0xbb, 0xd1, 0x20, 0xbf, 0x4a, 0x83, 0xfc, 0x26, 0x81, 0x7f, 0x14, 0x06, 0xfa, 0xe9, 0xa8, 0xb1,
0x36, 0x43, 0xd4, 0x68, 0x0c, 0xac, 0x70, 0x20, 0xc8, 0x1f, 0x35, 0x1a, 0x03, 0x4b, 0x0c, 0xf3,
0x2e, 0xcc, 0x3d, 0xa2, 0xde, 0x9d, 0xd7, 0xae, 0x67, 0xda, 0x8e, 0x0d, 0xe2, 0xd8, 0x31, 0x27,
0x50, 0x0b, 0xd0, 0xd1, 0xd7, 0xa1, 0x46, 0x0f, 0x55, 0xda, 0xb7, 0x91, 0xab, 0x6f, 0xd8, 0x81,
0xf4, 0x36, 0xb0, 0xe5, 0xeb, 0xb4, 0xf7, 0x7c, 0xbe, 0xde, 0xa2, 0x03, 0xb1, 0x57, 0x3d, 0x17,
0xeb, 0x3e, 0x36, 0x56, 0x4f, 0xd7, 0x9c, 0xc1, 0x50, 0xa7, 0xc2, 0xd4, 0x6e, 0x52, 0x1f, 0x5e,
0xf6, 0x09, 0xbd, 0x0c, 0xcd, 0x9e, 0x68, 0x6d, 0xb8, 0xce, 0xa0, 0xbd, 0x40, 0xf5, 0x28, 0x01,
0x45, 0x57, 0x00, 0x02, 0x4b, 0xa5, 0xfb, 0xed, 0x16, 0xdd, 0xc5, 0x1a, 0x87, 0xdc, 0xa3, 0x39,
0x3c, 0xd3, 0xeb, 0xb2, 0x6c, 0x99, 0x69, 0xf7, 0xdb, 0x8b, 0x74, 0xc6, 0x7a, 0x90, 0x5e, 0x33,
0xed, 0x3e, 0x5a, 0x86, 0x39, 0xd3, 0xeb, 0x1e, 0xe8, 0x47, 0xb8, 0x8d, 0xe8, 0xd7, 0x8a, 0xe9,
0x6d, 0xe8, 0x47, 0x58, 0xfd, 0x2e, 0x5c, 0x08, 0xa5, 0x2b, 0xb2, 0x93, 0x69, 0xa1, 0x50, 0xa6,
0x15, 0x8a, 0xf1, 0x3e, 0xfd, 0x7f, 0x95, 0x60, 0x69, 0x4f, 0x3f, 0xc6, 0xcf, 0x3e, 0x7c, 0xc8,
0x65, 0xd6, 0xb6, 0x60, 0x91, 0x46, 0x0c, 0x2b, 0x11, 0x7a, 0xc6, 0x9c, 0xab, 0x51, 0x51, 0x48,
0x77, 0x44, 0xdf, 0x20, 0x0e, 0x01, 0xee, 0x1d, 0xed, 0x92, 0x20, 0x35, 0x38, 0x53, 0xaf, 0x48,
0xc6, 0x59, 0x13, 0x58, 0x5a, 0xb4, 0x07, 0xda, 0x85, 0x85, 0xf8, 0x36, 0x04, 0xa7, 0xe9, 0x2b,
0x63, 0x33, 0x18, 0x21, 0xf7, 0xb5, 0x66, 0x6c, 0x33, 0x3c, 0xd4, 0x86, 0x39, 0x7e, 0x14, 0x52,
0x9b, 0x51, 0xd5, 0x82, 0x26, 0xda, 0x85, 0xf3, 0x6c, 0x05, 0x7b, 0x5c, 0x21, 0xd8, 0xe2, 0xab,
0xb9, 0x16, 0x2f, 0xeb, 0x1a, 0xd7, 0xa7, 0xda, 0x59, 0xf5, 0xa9, 0x0d, 0x73, 0x5c, 0xc6, 0xa9,
0x1d, 0xa9, 0x6a, 0x41, 0x93, 0x6c, 0x73, 0x28, 0xed, 0x75, 0xfa, 0x2d, 0x04, 0x90, 0x7e, 0x81,
0x49, 0x6e, 0x50, 0x93, 0x1c, 0x34, 0x49, 0x50, 0x06, 0x21, 0xa7, 0x27, 0x64, 0xe1, 0x3e, 0x84,
0xaa, 0x90, 0xfd, 0xfc, 0xe9, 0x03, 0xd1, 0x27, 0x69, 0xf9, 0x8b, 0x09, 0xcb, 0xaf, 0xfe, 0xbd,
0x02, 0x8d, 0x75, 0xb2, 0xd8, 0x2d, 0xa7, 0x4f, 0xcf, 0xa9, 0x9b, 0xd0, 0x74, 0x71, 0xcf, 0x71,
0x8d, 0x2e, 0xb6, 0x7d, 0xd7, 0xc4, 0x2c, 0x7e, 0x2f, 0x69, 0xf3, 0x0c, 0xfa, 0x11, 0x03, 0x12,
0x34, 0x62, 0xcc, 0x3d, 0x5f, 0x1f, 0x0c, 0xbb, 0x07, 0xc4, 0x68, 0x14, 0x18, 0x9a, 0x80, 0x52,
0x9b, 0xf1, 0x22, 0x34, 0x42, 0x34, 0xdf, 0xa1, 0xf3, 0x97, 0xb4, 0xba, 0x80, 0xed, 0x3b, 0xe8,
0x25, 0x68, 0x52, 0x6e, 0x77, 0x2d, 0xa7, 0xdf, 0x25, 0xb1, 0x2e, 0x3f, 0xc2, 0x1a, 0x06, 0x27,
0x8b, 0xec, 0x62, 0x1c, 0xcb, 0x33, 0xbf, 0x83, 0xf9, 0x21, 0x26, 0xb0, 0xf6, 0xcc, 0xef, 0x60,
0xf5, 0xef, 0x14, 0x98, 0x5f, 0xd7, 0x7d, 0x7d, 0xc7, 0x31, 0xf0, 0xfe, 0x94, 0x47, 0x7e, 0x8e,
0x8c, 0xf8, 0x65, 0xa8, 0x89, 0x15, 0xf0, 0x25, 0x85, 0x00, 0xb4, 0x01, 0xcd, 0xc0, 0xe9, 0xec,
0xb2, 0x58, 0xac, 0x94, 0xe9, 0x5a, 0x45, 0xce, 0x54, 0x4f, 0x9b, 0x0f, 0xba, 0xd1, 0xa6, 0xba,
0x01, 0x8d, 0xe8, 0x67, 0x32, 0xeb, 0x5e, 0x52, 0x50, 0x04, 0x80, 0xc8, 0xdb, 0xce, 0x68, 0x40,
0xf6, 0x94, 0x9b, 0x9c, 0xa0, 0xa9, 0xfe, 0xb2, 0x02, 0xf3, 0xdc, 0x11, 0xd8, 0x13, 0xb5, 0x23,
0xba, 0x34, 0x96, 0xa3, 0xa2, 0xbf, 0xd1, 0x7b, 0xf1, 0x74, 0xef, 0x4b, 0x52, 0xf3, 0x40, 0x07,
0xa1, 0xee, 0x67, 0xcc, 0x0b, 0xc8, 0x13, 0xfd, 0x7f, 0x4e, 0x04, 0x8d, 0x6f, 0x0d, 0x15, 0xb4,
0x36, 0xcc, 0xe9, 0x86, 0xe1, 0x62, 0xcf, 0xe3, 0x74, 0x04, 0x4d, 0xf2, 0xe5, 0x18, 0xbb, 0x5e,
0x20, 0xf2, 0x45, 0x2d, 0x68, 0xa2, 0xaf, 0x43, 0x55, 0xf8, 0xab, 0x2c, 0xb9, 0x77, 0x3d, 0x9b,
0x4e, 0x1e, 0xab, 0x8a, 0x1e, 0xea, 0x5f, 0x14, 0xa0, 0xc9, 0x19, 0xb6, 0xca, 0x4f, 0xea, 0xf1,
0xca, 0xb7, 0x0a, 0x8d, 0x83, 0xd0, 0x2a, 0x8c, 0xcb, 0x4a, 0x45, 0x8d, 0x47, 0xac, 0xcf, 0x24,
0x05, 0x8c, 0xfb, 0x0a, 0xa5, 0x99, 0x7c, 0x85, 0xf2, 0x59, 0x6d, 0x5b, 0xda, 0x7b, 0xac, 0x48,
0xbc, 0x47, 0xf5, 0xe7, 0xa1, 0x1e, 0x19, 0x80, 0xda, 0x6e, 0x96, 0xce, 0xe2, 0x1c, 0x0b, 0x9a,
0xe8, 0xed, 0xd0, 0x63, 0x62, 0xac, 0xba, 0x28, 0xa1, 0x25, 0xe1, 0x2c, 0xa9, 0x7f, 0xa3, 0x40,
0x85, 0x8f, 0x7c, 0x0d, 0xea, 0xdc, 0xe8, 0x50, 0x6f, 0x92, 0x8d, 0x0e, 0x1c, 0x44, 0xdc, 0xc9,
0xa7, 0x67, 0x75, 0x2e, 0x42, 0x35, 0x61, 0x6f, 0xe6, 0xf8, 0x81, 0x11, 0x7c, 0x8a, 0x18, 0x19,
0xf2, 0x89, 0xd8, 0x17, 0x74, 0x01, 0xca, 0x96, 0xd3, 0x17, 0xb5, 0x41, 0xd6, 0x50, 0xbf, 0x50,
0x68, 0x29, 0x47, 0xc3, 0x3d, 0xe7, 0x18, 0xbb, 0xa7, 0xb3, 0xa7, 0x41, 0xdf, 0x8f, 0x88, 0x79,
0xce, 0xb0, 0x4c, 0x74, 0x40, 0xef, 0x87, 0x9b, 0x50, 0x94, 0xe5, 0x80, 0xa2, 0x76, 0x87, 0x0b,
0x69, 0xb8, 0x19, 0xbf, 0xa1, 0xd0, 0x6c, 0x7e, 0x7c, 0x29, 0xd3, 0xfa, 0x41, 0x4f, 0x25, 0xc4,
0x51, 0xff, 0x56, 0x81, 0x8b, 0x19, 0xdc, 0x7d, 0xb8, 0xf2, 0x1c, 0xf8, 0xfb, 0x1e, 0x54, 0x45,
0x4e, 0xa1, 0x98, 0x2b, 0xa7, 0x20, 0xf0, 0xd5, 0xdf, 0x62, 0x35, 0x25, 0x09, 0x7b, 0x1f, 0xae,
0x3c, 0x23, 0x06, 0x27, 0xf3, 0x8a, 0x45, 0x49, 0x5e, 0xf1, 0x1f, 0x14, 0xe8, 0x84, 0x79, 0x3c,
0x6f, 0xf5, 0x74, 0xd6, 0x72, 0xe4, 0xd3, 0x09, 0x6e, 0xbf, 0x26, 0xea, 0x65, 0xc4, 0x2e, 0xe6,
0x0a, 0x4b, 0x83, 0x6a, 0x99, 0x4d, 0x4b, 0x02, 0xe9, 0x05, 0xcd, 0xa2, 0x95, 0x9d, 0xc8, 0xc6,
0xb3, 0xc2, 0x49, 0xb8, 0xb1, 0xff, 0xc6, 0x84, 0x74, 0x23, 0x9e, 0x87, 0x7a, 0xde, 0x0c, 0x8c,
0x16, 0x73, 0x0e, 0x79, 0x31, 0xa7, 0x94, 0x28, 0xe6, 0x70, 0x78, 0x70, 0x9b, 0x63, 0x15, 0x1f,
0x38, 0x2e, 0xb3, 0x7b, 0x25, 0x2d, 0x02, 0x51, 0x07, 0x54, 0x44, 0x52, 0x0b, 0x7c, 0x56, 0x0c,
0xfd, 0x15, 0x05, 0xda, 0x7c, 0x16, 0x3a, 0x27, 0x89, 0x57, 0x2d, 0xec, 0x63, 0xe3, 0xcb, 0xce,
0xe3, 0xfc, 0x6e, 0x01, 0x5a, 0x51, 0xc7, 0x87, 0xfa, 0x2e, 0xef, 0x40, 0x99, 0xa6, 0xc1, 0x38,
0x05, 0x13, 0xad, 0x07, 0xc3, 0x26, 0x27, 0x27, 0x8d, 0x83, 0xf6, 0x85, 0x8f, 0xc6, 0x9b, 0xa1,
0xf7, 0x55, 0x3c, 0xbb, 0xf7, 0xc5, 0xbd, 0x51, 0x67, 0x44, 0xc6, 0x65, 0xf9, 0xe3, 0x10, 0x80,
0x3e, 0x80, 0x0a, 0xbb, 0x3e, 0xc5, 0x6b, 0xdf, 0x37, 0xe3, 0x43, 0xf3, 0xab, 0x55, 0x91, 0xa2,
0x0c, 0x05, 0x68, 0xbc, 0x13, 0xd9, 0xa3, 0xa1, 0xeb, 0xf4, 0xa9, 0x9b, 0x46, 0x0e, 0xbd, 0xb2,
0x26, 0xda, 0xea, 0xcf, 0xc0, 0x52, 0x98, 0x46, 0x60, 0x24, 0x4d, 0x2b, 0xf0, 0xea, 0x3f, 0x2b,
0x70, 0x7e, 0xef, 0xd4, 0xee, 0x25, 0x55, 0x67, 0x09, 0x2a, 0x43, 0x4b, 0x0f, 0x53, 0xdd, 0xbc,
0x45, 0xbd, 0x74, 0x36, 0x37, 0x36, 0xc8, 0x11, 0xcf, 0xf8, 0x59, 0x17, 0xb0, 0x7d, 0x67, 0xa2,
0xe7, 0x75, 0x53, 0xe4, 0x3d, 0xb0, 0xc1, 0x9c, 0x09, 0x96, 0x3f, 0x9c, 0x17, 0x50, 0xea, 0x4c,
0x7c, 0x00, 0x40, 0xfd, 0xad, 0xee, 0x59, 0x7c, 0x2c, 0xda, 0x63, 0x8b, 0x9c, 0xa8, 0x7f, 0x56,
0x80, 0x76, 0x84, 0x4b, 0x5f, 0xb6, 0xfb, 0x99, 0x11, 0x4e, 0x17, 0x9f, 0x52, 0x38, 0x5d, 0x9a,
0xdd, 0xe5, 0x2c, 0xcb, 0x5c, 0xce, 0x5f, 0x2c, 0x42, 0x33, 0xe4, 0xda, 0xae, 0xa5, 0xdb, 0x99,
0x92, 0xb0, 0x27, 0xc2, 0xad, 0x38, 0x9f, 0x5e, 0x93, 0xe9, 0x50, 0xc6, 0x46, 0x68, 0x89, 0x21,
0xd0, 0x15, 0xba, 0xe9, 0xae, 0xcf, 0x32, 0x96, 0x3c, 0xc4, 0x63, 0xca, 0x6a, 0x0e, 0x30, 0x7a,
0x1d, 0x10, 0xd7, 0xb0, 0xae, 0x69, 0x77, 0x3d, 0xdc, 0x73, 0x6c, 0x83, 0xe9, 0x5e, 0x59, 0x6b,
0xf1, 0x2f, 0x9b, 0xf6, 0x1e, 0x83, 0xa3, 0x77, 0xa0, 0xe4, 0x9f, 0x0e, 0x99, 0x51, 0x6d, 0x4a,
0xdd, 0xb1, 0x90, 0xae, 0xfd, 0xd3, 0x21, 0xd6, 0x28, 0x7a, 0x60, 0x91, 0x7d, 0x57, 0x3f, 0xe6,
0x9e, 0x39, 0xb7, 0xc8, 0x0c, 0x12, 0xcd, 0x30, 0xcc, 0xc5, 0x32, 0x0c, 0x4c, 0xb2, 0x03, 0x85,
0xee, 0xfa, 0xbe, 0x45, 0x73, 0xae, 0x54, 0xb2, 0x03, 0xe8, 0xbe, 0x6f, 0x91, 0x45, 0xfa, 0x8e,
0xaf, 0x5b, 0x4c, 0x3f, 0x6a, 0xdc, 0x72, 0x10, 0x08, 0x8d, 0x1b, 0xff, 0x89, 0x58, 0x3e, 0x41,
0x98, 0x86, 0xbd, 0x91, 0x95, 0xad, 0x8f, 0xe3, 0x73, 0x5e, 0x93, 0x54, 0xf1, 0x1b, 0x50, 0xe7,
0x52, 0x71, 0x06, 0xa9, 0x02, 0xd6, 0x65, 0x6b, 0x8c, 0x98, 0x97, 0x9f, 0x92, 0x98, 0x57, 0xa6,
0xc8, 0x1a, 0xc9, 0xf7, 0x46, 0xfd, 0xa1, 0x02, 0x2f, 0xa4, 0xac, 0xe6, 0x58, 0xd6, 0x8e, 0x8f,
0xcc, 0xb9, 0x35, 0x4d, 0x0e, 0xc9, 0xcf, 0x86, 0xf7, 0xa1, 0xe2, 0xd2, 0xd1, 0x79, 0x89, 0xef,
0xc6, 0x58, 0xe1, 0x63, 0x84, 0x68, 0xbc, 0x8b, 0xfa, 0x9b, 0x0a, 0x2c, 0xa7, 0x49, 0x9d, 0xe1,
0xc0, 0x5f, 0x85, 0x39, 0x36, 0x74, 0xa0, 0xa3, 0xb7, 0xc6, 0xeb, 0x68, 0xc8, 0x1c, 0x2d, 0xe8,
0xa8, 0xee, 0xc1, 0x52, 0xe0, 0x17, 0x84, 0xac, 0xdf, 0xc6, 0xbe, 0x3e, 0x26, 0x2e, 0xbd, 0x06,
0x75, 0x16, 0xe0, 0xb0, 0x78, 0x8f, 0x65, 0x74, 0xe0, 0x91, 0x48, 0x91, 0xaa, 0xff, 0xa9, 0xc0,
0x05, 0x7a, 0xb0, 0x26, 0x6b, 0x6a, 0x79, 0xea, 0xad, 0xaa, 0x48, 0x18, 0xed, 0xe8, 0x03, 0x7e,
0xb9, 0xab, 0xa6, 0xc5, 0x60, 0x68, 0x33, 0x9d, 0x41, 0x95, 0xe6, 0x2f, 0xc2, 0x02, 0xfd, 0xba,
0xee, 0xeb, 0xb4, 0x3e, 0x9f, 0x4c, 0x9d, 0x86, 0x07, 0x7a, 0x69, 0x8a, 0x03, 0x5d, 0xdd, 0x82,
0x17, 0x12, 0x2b, 0x9d, 0x61, 0x47, 0xd5, 0x3f, 0x52, 0xc8, 0x76, 0xc4, 0x2e, 0xc9, 0x4d, 0xef,
0xf4, 0x5e, 0x11, 0xc5, 0xbc, 0xae, 0x69, 0x24, 0x8d, 0x88, 0x81, 0x3e, 0x84, 0x9a, 0x8d, 0x4f,
0xba, 0x51, 0x3f, 0x29, 0x47, 0x44, 0x50, 0xb5, 0xf1, 0x09, 0xfd, 0xa5, 0xee, 0xc0, 0x72, 0x8a,
0xd4, 0x59, 0xd6, 0xfe, 0x57, 0x0a, 0x5c, 0x5c, 0x77, 0x9d, 0xe1, 0x43, 0xd3, 0xf5, 0x47, 0xba,
0x15, 0xbf, 0xfa, 0xf0, 0x6c, 0x12, 0x8f, 0x1f, 0xa7, 0x62, 0xcf, 0xd7, 0x25, 0x1a, 0x94, 0x26,
0x8a, 0x2f, 0x3a, 0xe2, 0x5f, 0xff, 0x47, 0x51, 0x46, 0x3c, 0xc7, 0x9b, 0xe0, 0x97, 0xe4, 0x09,
0x4e, 0xa4, 0x15, 0x8c, 0xe2, 0xb4, 0x15, 0x8c, 0x0c, 0xf3, 0x5e, 0x7a, 0x4a, 0xe6, 0xfd, 0xcc,
0x89, 0xb3, 0x8f, 0x21, 0x5e, 0x5d, 0xa2, 0xa7, 0xf3, 0x54, 0x65, 0xa9, 0x55, 0x80, 0xb0, 0xd2,
0xc2, 0xef, 0x38, 0xe7, 0x19, 0x26, 0xd2, 0x8b, 0xec, 0x96, 0x38, 0x4a, 0xf9, 0x49, 0x1f, 0xc9,
0xf0, 0x7f, 0x13, 0x3a, 0x32, 0x29, 0x9d, 0x45, 0xf2, 0xff, 0xa5, 0x00, 0xb0, 0x29, 0xae, 0xc5,
0x4f, 0x77, 0x16, 0xdc, 0x80, 0x88, 0x37, 0x12, 0xea, 0x7b, 0x54, 0x8a, 0x0c, 0xa2, 0x12, 0x22,
0x9e, 0x25, 0x38, 0xa9, 0x18, 0xd7, 0xa0, 0xe3, 0x44, 0xb4, 0x86, 0x09, 0x45, 0xd2, 0xfc, 0x5e,
0x82, 0x9a, 0xeb, 0x9c, 0x74, 0x89, 0x9a, 0x19, 0xc1, 0xbd, 0x7f, 0xd7, 0x39, 0x21, 0xca, 0x67,
0xa0, 0x65, 0x98, 0xf3, 0x75, 0xef, 0x88, 0x8c, 0x5f, 0x89, 0xdc, 0xbe, 0x31, 0xd0, 0x05, 0x28,
0x1f, 0x98, 0x16, 0x66, 0x97, 0x3d, 0x6a, 0x1a, 0x6b, 0xa0, 0xaf, 0x06, 0x77, 0x14, 0xab, 0xb9,
0x6f, 0x58, 0xb1, 0x3b, 0xaa, 0x37, 0x60, 0x9e, 0xc8, 0x14, 0x21, 0x82, 0x29, 0x78, 0x8b, 0xd7,
0x39, 0x38, 0x90, 0x90, 0xaa, 0x7e, 0xa1, 0xc0, 0x42, 0xc8, 0x5a, 0x6a, 0xa5, 0x88, 0xe1, 0xa3,
0x46, 0x6f, 0xcd, 0x31, 0x98, 0x3d, 0x69, 0x66, 0x1c, 0x1b, 0xac, 0x23, 0x33, 0x6d, 0x61, 0x97,
0x71, 0x71, 0x36, 0x59, 0x3c, 0xe1, 0x8c, 0x69, 0x04, 0x99, 0xa1, 0x8a, 0xeb, 0x9c, 0x6c, 0x1a,
0x82, 0x65, 0xec, 0xe6, 0x3f, 0x8b, 0x2a, 0x09, 0xcb, 0xd6, 0xe8, 0xe5, 0xff, 0x1b, 0x30, 0x8f,
0x5d, 0xd7, 0x71, 0xbb, 0x03, 0xec, 0x79, 0x7a, 0x1f, 0x73, 0x27, 0xbe, 0x41, 0x81, 0xdb, 0x0c,
0xa6, 0xfe, 0x75, 0x09, 0x9a, 0xe1, 0x52, 0x82, 0x4b, 0x10, 0xa6, 0x11, 0x5c, 0x82, 0x30, 0xc9,
0xfe, 0x82, 0xcb, 0xec, 0xa5, 0x90, 0x80, 0xd5, 0x42, 0x5b, 0xd1, 0x6a, 0x1c, 0xba, 0x69, 0x90,
0xb3, 0x9b, 0x30, 0xc8, 0x76, 0x0c, 0x1c, 0x4a, 0x00, 0x04, 0x20, 0x2e, 0x00, 0x31, 0x41, 0x2a,
0xe5, 0x10, 0xa4, 0x72, 0x0e, 0x41, 0xaa, 0x48, 0x04, 0x69, 0x09, 0x2a, 0x8f, 0x46, 0xbd, 0x23,
0xec, 0x73, 0xb7, 0x8e, 0xb7, 0xe2, 0x02, 0x56, 0x4d, 0x08, 0x98, 0x90, 0xa3, 0x5a, 0x54, 0x8e,
0x2e, 0x41, 0x8d, 0x55, 0xe3, 0xbb, 0xbe, 0x47, 0x4b, 0x8b, 0x45, 0xad, 0xca, 0x00, 0xfb, 0x1e,
0x7a, 0x37, 0xf0, 0xf9, 0xea, 0x32, 0x8b, 0x40, 0x4d, 0x53, 0x42, 0x4a, 0x02, 0x8f, 0xef, 0x15,
0x58, 0x88, 0xb0, 0x83, 0xca, 0x19, 0xab, 0x3f, 0x46, 0x42, 0x02, 0x7a, 0x96, 0xdc, 0x84, 0x66,
0xc8, 0x12, 0x8a, 0x37, 0xcf, 0x22, 0x31, 0x01, 0xa5, 0x68, 0x42, 0xdc, 0x9b, 0x67, 0x14, 0xf7,
0x8b, 0x50, 0xe5, 0x21, 0x94, 0xd7, 0x5e, 0x88, 0x67, 0x3b, 0x72, 0x69, 0xc2, 0xb7, 0x01, 0x85,
0x4b, 0x9c, 0xcd, 0xef, 0x4c, 0xc8, 0x50, 0x21, 0x29, 0x43, 0xea, 0x8f, 0x14, 0x58, 0x8c, 0x4e,
0x36, 0xed, 0x11, 0xfe, 0x21, 0xd4, 0x59, 0x05, 0xb8, 0x4b, 0x4c, 0x08, 0x4f, 0x35, 0x5d, 0x19,
0xbb, 0x79, 0x1a, 0x84, 0x0f, 0x8c, 0x08, 0x63, 0x4e, 0x1c, 0xf7, 0xc8, 0xb4, 0xfb, 0x5d, 0x42,
0x99, 0xc8, 0xd6, 0x72, 0xe0, 0x0e, 0x81, 0xa9, 0xdf, 0x57, 0xe0, 0xea, 0x83, 0xa1, 0xa1, 0xfb,
0x38, 0xe2, 0xcb, 0xcc, 0x7a, 0x6d, 0xf5, 0x9d, 0xe0, 0xde, 0x68, 0x21, 0x5f, 0xad, 0x92, 0x61,
0xab, 0x7f, 0x22, 0x68, 0x49, 0xdd, 0x86, 0x9f, 0x9e, 0x96, 0x0e, 0x54, 0x8f, 0xf9, 0x70, 0xc1,
0x83, 0xa9, 0xa0, 0x1d, 0xab, 0x87, 0x17, 0xcf, 0x5e, 0x0f, 0x57, 0xb7, 0xe1, 0xa2, 0x86, 0x3d,
0x6c, 0x1b, 0xb1, 0xd5, 0x4c, 0x9d, 0xb6, 0x1a, 0x42, 0x47, 0x36, 0xdc, 0x2c, 0xc2, 0xca, 0xbc,
0xe0, 0xae, 0x4b, 0x86, 0xf5, 0xb9, 0xbd, 0x26, 0xce, 0x17, 0x9d, 0xc7, 0x57, 0xff, 0xb8, 0x00,
0xcb, 0xf7, 0x0c, 0x83, 0x9b, 0x7a, 0xee, 0xd7, 0x3d, 0x2b, 0x97, 0x3b, 0xe9, 0x92, 0x16, 0xd3,
0x2e, 0xe9, 0xd3, 0x32, 0xbf, 0xfc, 0x20, 0xb2, 0x47, 0x83, 0xe0, 0x14, 0x76, 0xd9, 0x15, 0xb2,
0xf7, 0x79, 0x81, 0xb4, 0x6b, 0x39, 0x7d, 0x7a, 0x12, 0x4f, 0xf6, 0xd4, 0xaa, 0x41, 0xfa, 0x4d,
0x1d, 0x42, 0x3b, 0xcd, 0xac, 0x19, 0x4d, 0x49, 0xc0, 0x91, 0xa1, 0xc3, 0xd2, 0xb8, 0x0d, 0xe2,
0x8c, 0x51, 0xd0, 0xae, 0xe3, 0xa9, 0xff, 0x53, 0x80, 0xf6, 0x9e, 0x7e, 0x8c, 0xff, 0xff, 0x6c,
0xd0, 0x67, 0x70, 0xc1, 0xd3, 0x8f, 0x71, 0x37, 0x12, 0x62, 0x77, 0x5d, 0xfc, 0x98, 0x3b, 0xb3,
0xaf, 0xca, 0x2c, 0x89, 0xf4, 0xa6, 0x95, 0xb6, 0xe8, 0xc5, 0xe0, 0x1a, 0x7e, 0x8c, 0x5e, 0x86,
0x85, 0xe8, 0x55, 0x3e, 0x42, 0x5a, 0x95, 0xb2, 0x7c, 0x3e, 0x72, 0x53, 0x6f, 0xd3, 0x50, 0x1f,
0xc3, 0xe5, 0x07, 0xb6, 0x87, 0xfd, 0xcd, 0xf0, 0xb6, 0xd9, 0x8c, 0xc1, 0xe8, 0x35, 0xa8, 0x87,
0x8c, 0x4f, 0xbd, 0x94, 0x31, 0x3c, 0xd5, 0x81, 0xce, 0xb6, 0xee, 0x1e, 0x05, 0x09, 0xeb, 0x75,
0x76, 0x2b, 0xe8, 0x19, 0x4e, 0x78, 0x20, 0x2e, 0xc9, 0x69, 0xf8, 0x00, 0xbb, 0xd8, 0xee, 0xe1,
0x2d, 0xa7, 0x77, 0x14, 0xb9, 0x3c, 0xae, 0x44, 0x2f, 0x8f, 0x4f, 0x7b, 0x19, 0x5d, 0xfd, 0x71,
0x01, 0x96, 0xee, 0x59, 0x3e, 0x76, 0xc3, 0x1c, 0xc2, 0x59, 0xd2, 0x21, 0x61, 0x7e, 0xa2, 0x30,
0x4d, 0xc1, 0x21, 0x47, 0xbd, 0x52, 0x96, 0x4d, 0x29, 0x4d, 0x99, 0x4d, 0xb9, 0x07, 0x30, 0x74,
0x9d, 0x21, 0x76, 0x7d, 0x13, 0x07, 0x81, 0x60, 0x0e, 0x1f, 0x27, 0xd2, 0x49, 0xfd, 0x0c, 0x5a,
0xf7, 0x7b, 0x6b, 0x8e, 0x7d, 0x60, 0xba, 0x83, 0x80, 0x51, 0x29, 0xa5, 0x53, 0x72, 0x28, 0x5d,
0x21, 0xa5, 0x74, 0xaa, 0x09, 0x8b, 0x91, 0xb1, 0x67, 0x34, 0x5c, 0xfd, 0x5e, 0xf7, 0xc0, 0xb4,
0x4d, 0x7a, 0xeb, 0xae, 0x40, 0x7d, 0x54, 0xe8, 0xf7, 0x36, 0x38, 0x44, 0xfd, 0x9e, 0x02, 0x97,
0x34, 0x4c, 0x94, 0x27, 0x76, 0x83, 0x6a, 0x06, 0x9f, 0xe2, 0x2b, 0x50, 0x1a, 0x78, 0x22, 0x1f,
0x2f, 0xbb, 0xa9, 0x13, 0x9b, 0x49, 0xa3, 0xd8, 0xea, 0x5f, 0x2a, 0x9c, 0x9f, 0xbe, 0xeb, 0xcc,
0x90, 0x4d, 0xf9, 0x29, 0x98, 0x23, 0x70, 0xdd, 0x36, 0x78, 0xde, 0xf4, 0xb2, 0xec, 0x19, 0x60,
0x6f, 0x8d, 0xe1, 0x68, 0x01, 0x32, 0xfa, 0x1a, 0x54, 0x86, 0xba, 0xab, 0x0f, 0x32, 0x6e, 0x4f,
0xc8, 0x84, 0x81, 0x77, 0xb8, 0xfd, 0xa1, 0xb8, 0xf1, 0xbd, 0x7f, 0x3a, 0xc4, 0x68, 0x0e, 0x8a,
0x3b, 0xf8, 0xa4, 0x75, 0x0e, 0x01, 0x54, 0x76, 0x1c, 0x77, 0xa0, 0x5b, 0x2d, 0x05, 0xd5, 0x61,
0x8e, 0xd7, 0x50, 0x5b, 0x05, 0x34, 0x0f, 0xb5, 0xb5, 0xa0, 0xd6, 0xd4, 0x2a, 0xde, 0xfe, 0x3d,
0x05, 0x16, 0x53, 0x55, 0x3e, 0xd4, 0x04, 0x78, 0x60, 0xf7, 0x78, 0xf9, 0xb3, 0x75, 0x0e, 0x35,
0xa0, 0x1a, 0x14, 0x43, 0xd9, 0x78, 0xfb, 0x0e, 0xc5, 0x6e, 0x15, 0x50, 0x0b, 0x1a, 0xac, 0xe3,
0xa8, 0xd7, 0xc3, 0x9e, 0xd7, 0x2a, 0x0a, 0xc8, 0x86, 0x6e, 0x5a, 0x23, 0x17, 0xb7, 0x4a, 0x64,
0xce, 0x7d, 0x87, 0xbf, 0x79, 0x69, 0x95, 0x11, 0x82, 0x66, 0xf0, 0x00, 0x86, 0x77, 0xaa, 0x44,
0x60, 0x41, 0xb7, 0xb9, 0xdb, 0x9f, 0x46, 0xeb, 0x31, 0x74, 0x79, 0xcb, 0x70, 0xfe, 0x81, 0x6d,
0xe0, 0x03, 0xd3, 0xc6, 0x46, 0xf8, 0xa9, 0x75, 0x0e, 0x9d, 0x87, 0x85, 0x6d, 0xec, 0xf6, 0x71,
0x04, 0x58, 0x40, 0x8b, 0x30, 0xbf, 0x6d, 0x3e, 0x89, 0x80, 0x8a, 0x6a, 0xa9, 0xaa, 0xb4, 0x94,
0xdb, 0xaf, 0x42, 0x4d, 0xec, 0x02, 0x2a, 0x83, 0xd2, 0x6d, 0x9d, 0x43, 0x35, 0x28, 0xef, 0xea,
0x23, 0x8f, 0xac, 0x0f, 0xa0, 0xa2, 0x61, 0x6f, 0x34, 0xc0, 0xad, 0xc2, 0xca, 0x7f, 0xbf, 0x08,
0x35, 0x22, 0x31, 0x6b, 0x8e, 0xe3, 0x1a, 0xc8, 0x02, 0x44, 0x5f, 0x93, 0x0d, 0x86, 0x8e, 0x2d,
0x1e, 0xe8, 0xa2, 0x3b, 0xf1, 0xed, 0xe2, 0x8d, 0x34, 0x22, 0x17, 0xac, 0xce, 0x4b, 0x52, 0xfc,
0x04, 0xb2, 0x7a, 0x0e, 0x0d, 0xe8, 0x6c, 0xfb, 0xe6, 0x00, 0xef, 0x9b, 0xbd, 0xa3, 0xc0, 0x1b,
0x7d, 0x33, 0xc3, 0xf7, 0x4c, 0xa3, 0x06, 0xf3, 0xdd, 0x90, 0xce, 0xc7, 0x9e, 0xfb, 0x05, 0x0a,
0xae, 0x9e, 0x43, 0x8f, 0xe1, 0xc2, 0x7d, 0x1c, 0x71, 0xec, 0x83, 0x09, 0x57, 0xb2, 0x27, 0x4c,
0x21, 0x9f, 0x71, 0xca, 0x2d, 0x28, 0x53, 0xc9, 0x44, 0x32, 0xdf, 0x3f, 0xfa, 0x3f, 0x1b, 0x9d,
0xeb, 0xd9, 0x08, 0x62, 0xb4, 0x6f, 0xc3, 0x42, 0xe2, 0x05, 0x3e, 0x92, 0x79, 0x02, 0xf2, 0xff,
0x52, 0xe8, 0xdc, 0xce, 0x83, 0x2a, 0xe6, 0xea, 0x43, 0x33, 0xfe, 0x0a, 0x0d, 0xdd, 0xca, 0xf1,
0xe4, 0x97, 0xcd, 0xf4, 0x6a, 0xee, 0xc7, 0xc1, 0x54, 0x08, 0x5a, 0xc9, 0x17, 0xe1, 0xe8, 0xf6,
0xd8, 0x01, 0xe2, 0xc2, 0xf6, 0x5a, 0x2e, 0x5c, 0x31, 0xdd, 0x29, 0x15, 0x82, 0xd4, 0x3b, 0xd3,
0xa4, 0x8c, 0x07, 0xc3, 0x64, 0x3d, 0x80, 0xed, 0xdc, 0xcd, 0x8d, 0x1f, 0x5d, 0x69, 0xf2, 0x65,
0xaf, 0x74, 0xa5, 0x19, 0x0f, 0x93, 0xa5, 0x2b, 0xcd, 0x7a, 0x2a, 0xac, 0x9e, 0x43, 0xbf, 0xc4,
0x6e, 0xd0, 0xc9, 0x9e, 0x86, 0xa2, 0xb7, 0xe4, 0xd4, 0x8f, 0x79, 0xd3, 0xda, 0x59, 0x39, 0x4b,
0x17, 0x41, 0xc4, 0x77, 0xe9, 0xd5, 0x37, 0xc9, 0xe3, 0xca, 0xa4, 0x9a, 0x07, 0xe3, 0x65, 0xbf,
0x1b, 0xed, 0xbc, 0x75, 0x86, 0x1e, 0x82, 0x00, 0x27, 0xf9, 0xc2, 0x3f, 0xd0, 0xfa, 0xbb, 0x13,
0x85, 0x74, 0x3a, 0x95, 0xff, 0x16, 0x2c, 0x24, 0x5c, 0x71, 0x94, 0xdf, 0x5d, 0xef, 0x8c, 0x73,
0x3b, 0x98, 0x05, 0x48, 0x5c, 0x75, 0x43, 0x19, 0xca, 0x26, 0xb9, 0x0e, 0xd7, 0xb9, 0x9d, 0x07,
0x55, 0x2c, 0x64, 0x08, 0x8b, 0x89, 0x8f, 0x0f, 0x57, 0xd0, 0x6b, 0xb9, 0x67, 0x7b, 0xb8, 0xd2,
0x79, 0x3d, 0xff, 0x7c, 0x0f, 0x57, 0xd4, 0x73, 0xc8, 0xa3, 0xe7, 0x41, 0xe2, 0x3a, 0x14, 0xca,
0x18, 0x45, 0x7e, 0x2d, 0xac, 0xf3, 0x46, 0x4e, 0x6c, 0xb1, 0xcc, 0x63, 0x38, 0x2f, 0xb9, 0xd5,
0x86, 0xde, 0x18, 0x2b, 0x1e, 0xc9, 0xeb, 0x7c, 0x9d, 0x3b, 0x79, 0xd1, 0x23, 0xa7, 0x51, 0x2b,
0xa0, 0xeb, 0x9e, 0x65, 0x31, 0xb7, 0xe4, 0xf5, 0xac, 0x83, 0x36, 0x86, 0x96, 0xb1, 0xd4, 0x4c,
0x6c, 0x31, 0xe5, 0x2f, 0x00, 0xda, 0x3b, 0x74, 0x4e, 0xa8, 0xeb, 0xdb, 0x1f, 0xb9, 0x3a, 0xf3,
0xd6, 0xb3, 0xce, 0xdb, 0x34, 0x6a, 0x86, 0x22, 0x8e, 0xed, 0x21, 0x26, 0xef, 0x02, 0xdc, 0xc7,
0xfe, 0x36, 0xf6, 0x5d, 0xa2, 0xfd, 0x2f, 0x67, 0xd1, 0xce, 0x11, 0x82, 0xa9, 0x5e, 0x99, 0x88,
0x17, 0x65, 0xe8, 0xb6, 0x6e, 0x8f, 0x74, 0x2b, 0xf2, 0x0c, 0x4b, 0xce, 0xd0, 0x24, 0xda, 0x78,
0x86, 0xa6, 0xb1, 0xc5, 0x94, 0x27, 0xc2, 0x5d, 0x8a, 0x14, 0xd7, 0xc7, 0xbb, 0x4b, 0xe9, 0x8b,
0x5d, 0xc9, 0xa3, 0x64, 0x0c, 0xbe, 0x98, 0xf8, 0x73, 0x85, 0xde, 0xc5, 0x4c, 0x20, 0x7c, 0x6a,
0xfa, 0x87, 0xbb, 0x96, 0x6e, 0x7b, 0x79, 0x48, 0xa0, 0x88, 0x67, 0x20, 0x81, 0xe3, 0x0b, 0x12,
0x0c, 0x98, 0x8f, 0xd5, 0xbc, 0x91, 0xec, 0xdd, 0x92, 0xac, 0xfe, 0xdf, 0xb9, 0x35, 0x19, 0x51,
0xcc, 0x72, 0x08, 0xf3, 0x81, 0x40, 0x33, 0xe6, 0xbe, 0x3a, 0x56, 0xe8, 0x63, 0x7c, 0xbd, 0x9d,
0x07, 0x55, 0xcc, 0xe4, 0x01, 0x4a, 0x97, 0xf4, 0x50, 0xbe, 0x52, 0xf0, 0x38, 0xe3, 0x93, 0x5d,
0x27, 0x64, 0xf6, 0x3c, 0x51, 0x3e, 0x97, 0x1f, 0x16, 0xd2, 0xdb, 0x00, 0x52, 0x7b, 0x9e, 0x51,
0x8d, 0x57, 0xcf, 0xa1, 0x4f, 0xa1, 0xc2, 0xff, 0x94, 0xeb, 0xa5, 0xf1, 0xc9, 0x73, 0x3e, 0xfa,
0xcd, 0x09, 0x58, 0x62, 0xe0, 0x23, 0x58, 0xce, 0x48, 0x9d, 0x4b, 0xfd, 0x8c, 0xf1, 0x69, 0xf6,
0x49, 0x27, 0xa0, 0x98, 0x2c, 0x95, 0x1b, 0x1f, 0x33, 0x59, 0x56, 0x1e, 0x7d, 0xd2, 0x64, 0x3a,
0xa0, 0xf4, 0x3f, 0x2d, 0x48, 0x65, 0x22, 0xf3, 0x0f, 0x19, 0x72, 0x4c, 0x91, 0xfe, 0xb3, 0x04,
0xe9, 0x14, 0x99, 0xff, 0xa9, 0x30, 0x69, 0x8a, 0x2e, 0x2c, 0xa6, 0x92, 0xa7, 0xd2, 0x83, 0x3c,
0x2b, 0xc5, 0x3a, 0x69, 0x82, 0x3e, 0xbc, 0x20, 0x4d, 0x14, 0x4a, 0x7d, 0xac, 0x71, 0x29, 0xc5,
0x49, 0x13, 0xf5, 0xe0, 0xbc, 0x24, 0x3d, 0x28, 0x3d, 0xab, 0xb3, 0xd3, 0x88, 0x93, 0x26, 0x39,
0x80, 0xce, 0xaa, 0xeb, 0xe8, 0x46, 0x4f, 0xf7, 0x7c, 0x9a, 0xb2, 0x23, 0xa1, 0x78, 0xe0, 0xe4,
0xca, 0x03, 0x2e, 0x69, 0x62, 0x6f, 0xd2, 0x3c, 0x8f, 0xa0, 0x4e, 0x05, 0x92, 0xfd, 0xf3, 0x0f,
0x92, 0x9f, 0x74, 0x11, 0x8c, 0x0c, 0xf3, 0x29, 0x43, 0x14, 0xaa, 0xf9, 0x73, 0x2c, 0x11, 0x40,
0x53, 0x5d, 0xe8, 0x46, 0x46, 0xb2, 0x26, 0x9a, 0x64, 0xeb, 0xbc, 0x34, 0x1e, 0x49, 0x8c, 0x8c,
0xe1, 0x82, 0x2c, 0xb1, 0x25, 0x8d, 0xa3, 0xc6, 0x64, 0xc0, 0x26, 0x31, 0xe9, 0x13, 0xbe, 0x00,
0xdf, 0x75, 0xac, 0xec, 0x05, 0x44, 0xb2, 0x5a, 0x13, 0x06, 0x5c, 0xf9, 0xa2, 0x06, 0xd5, 0x80,
0x92, 0x2f, 0x39, 0xdd, 0xf1, 0x1c, 0xf2, 0x0f, 0xdf, 0x82, 0x85, 0xc4, 0x1f, 0x5b, 0x48, 0x05,
0x58, 0xfe, 0xe7, 0x17, 0x93, 0xf6, 0xe6, 0x53, 0xfe, 0x9f, 0x9b, 0xc2, 0x53, 0x7f, 0x25, 0x2b,
0x87, 0x91, 0x74, 0xd2, 0x27, 0x0c, 0xfc, 0x7f, 0xdb, 0x4f, 0xdd, 0x01, 0x88, 0x78, 0xa8, 0xe3,
0x6f, 0x2e, 0x13, 0xa7, 0x6b, 0x12, 0xb7, 0x06, 0x52, 0x27, 0xf4, 0xd5, 0x3c, 0xb7, 0x40, 0xb3,
0xdd, 0x88, 0x6c, 0xd7, 0xf3, 0x01, 0x34, 0xa2, 0x6f, 0x0a, 0x90, 0xf4, 0x1f, 0x1e, 0xd3, 0x8f,
0x0e, 0x26, 0xad, 0x62, 0xfb, 0x8c, 0xde, 0xc9, 0x84, 0xe1, 0x3c, 0x72, 0xac, 0x26, 0x6b, 0xc8,
0x19, 0xc7, 0x6a, 0x46, 0xe5, 0x5a, 0xea, 0xcd, 0x65, 0x17, 0xa6, 0x59, 0x82, 0x27, 0x59, 0x18,
0x95, 0x26, 0x78, 0x32, 0x4a, 0xcd, 0xd2, 0x04, 0x4f, 0x56, 0xa5, 0x55, 0x3d, 0xb7, 0xfa, 0xf6,
0x67, 0x6f, 0xf5, 0x4d, 0xff, 0x70, 0xf4, 0x88, 0xac, 0xfe, 0x2e, 0xeb, 0xfa, 0x86, 0xe9, 0xf0,
0x5f, 0x77, 0x03, 0x71, 0xbf, 0x4b, 0x47, 0xbb, 0x4b, 0x46, 0x1b, 0x3e, 0x7a, 0x54, 0xa1, 0xad,
0xb7, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x0d, 0x55, 0xec, 0x90, 0x51, 0x58, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -5740,6 +5830,7 @@ type DataCoordClient interface {
CheckHealth(ctx context.Context, in *milvuspb.CheckHealthRequest, opts ...grpc.CallOption) (*milvuspb.CheckHealthResponse, error)
GcConfirm(ctx context.Context, in *GcConfirmRequest, opts ...grpc.CallOption) (*GcConfirmResponse, error)
ReportDataNodeTtMsgs(ctx context.Context, in *ReportDataNodeTtMsgsRequest, opts ...grpc.CallOption) (*commonpb.Status, error)
GcControl(ctx context.Context, in *GcControlRequest, opts ...grpc.CallOption) (*commonpb.Status, error)
}
type dataCoordClient struct {
@ -6101,6 +6192,15 @@ func (c *dataCoordClient) ReportDataNodeTtMsgs(ctx context.Context, in *ReportDa
return out, nil
}
func (c *dataCoordClient) GcControl(ctx context.Context, in *GcControlRequest, opts ...grpc.CallOption) (*commonpb.Status, error) {
out := new(commonpb.Status)
err := c.cc.Invoke(ctx, "/milvus.proto.data.DataCoord/GcControl", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// DataCoordServer is the server API for DataCoord service.
type DataCoordServer interface {
GetComponentStates(context.Context, *milvuspb.GetComponentStatesRequest) (*milvuspb.ComponentStates, error)
@ -6144,6 +6244,7 @@ type DataCoordServer interface {
CheckHealth(context.Context, *milvuspb.CheckHealthRequest) (*milvuspb.CheckHealthResponse, error)
GcConfirm(context.Context, *GcConfirmRequest) (*GcConfirmResponse, error)
ReportDataNodeTtMsgs(context.Context, *ReportDataNodeTtMsgsRequest) (*commonpb.Status, error)
GcControl(context.Context, *GcControlRequest) (*commonpb.Status, error)
}
// UnimplementedDataCoordServer can be embedded to have forward compatible implementations.
@ -6267,6 +6368,9 @@ func (*UnimplementedDataCoordServer) GcConfirm(ctx context.Context, req *GcConfi
func (*UnimplementedDataCoordServer) ReportDataNodeTtMsgs(ctx context.Context, req *ReportDataNodeTtMsgsRequest) (*commonpb.Status, error) {
return nil, status.Errorf(codes.Unimplemented, "method ReportDataNodeTtMsgs not implemented")
}
func (*UnimplementedDataCoordServer) GcControl(ctx context.Context, req *GcControlRequest) (*commonpb.Status, error) {
return nil, status.Errorf(codes.Unimplemented, "method GcControl not implemented")
}
func RegisterDataCoordServer(s *grpc.Server, srv DataCoordServer) {
s.RegisterService(&_DataCoord_serviceDesc, srv)
@ -6974,6 +7078,24 @@ func _DataCoord_ReportDataNodeTtMsgs_Handler(srv interface{}, ctx context.Contex
return interceptor(ctx, in, info, handler)
}
func _DataCoord_GcControl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GcControlRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(DataCoordServer).GcControl(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/milvus.proto.data.DataCoord/GcControl",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(DataCoordServer).GcControl(ctx, req.(*GcControlRequest))
}
return interceptor(ctx, in, info, handler)
}
var _DataCoord_serviceDesc = grpc.ServiceDesc{
ServiceName: "milvus.proto.data.DataCoord",
HandlerType: (*DataCoordServer)(nil),
@ -7134,6 +7256,10 @@ var _DataCoord_serviceDesc = grpc.ServiceDesc{
MethodName: "ReportDataNodeTtMsgs",
Handler: _DataCoord_ReportDataNodeTtMsgs_Handler,
},
{
MethodName: "GcControl",
Handler: _DataCoord_GcControl_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "data_coord.proto",

View File

@ -0,0 +1,97 @@
// Licensed to the LF AI & Data foundation under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package proxy
import (
"fmt"
"net/http"
"sync"
"github.com/milvus-io/milvus-proto/go-api/v2/commonpb"
"github.com/milvus-io/milvus/internal/management"
"github.com/milvus-io/milvus/internal/proto/datapb"
"github.com/milvus-io/milvus/internal/util/commonpbutil"
)
// this file contains proxy management restful API handler
const (
mgrRouteGcPause = `/management/datacoord/garbage_collection/pause`
mgrRouteGcResume = `/management/datacoord/garbage_collection/resume`
)
var (
mgrRouteRegisterOnce sync.Once
)
func RegisterMgrRoute(proxy *Proxy) {
mgrRouteRegisterOnce.Do(func() {
management.Register(&management.HTTPHandler{
Path: mgrRouteGcPause,
HandlerFunc: proxy.PauseDatacoordGC,
})
management.Register(&management.HTTPHandler{
Path: mgrRouteGcResume,
HandlerFunc: proxy.ResumeDatacoordGC,
})
})
}
func (node *Proxy) PauseDatacoordGC(w http.ResponseWriter, req *http.Request) {
pauseSeconds := req.URL.Query().Get("pause_seconds")
resp, err := node.dataCoord.GcControl(req.Context(), &datapb.GcControlRequest{
Base: commonpbutil.NewMsgBase(),
Command: datapb.GcCommand_Pause,
Params: []*commonpb.KeyValuePair{
{Key: "duration", Value: pauseSeconds},
},
})
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(fmt.Sprintf(`{"msg": "failed to pause garbage collection, %s"}`, err.Error())))
return
}
if resp.GetErrorCode() != commonpb.ErrorCode_Success {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(fmt.Sprintf(`{"msg": "failed to pause garbage collection, %s"}`, resp.GetReason())))
return
}
w.WriteHeader(http.StatusOK)
w.Write([]byte(`{"msg": "OK"}`))
}
func (node *Proxy) ResumeDatacoordGC(w http.ResponseWriter, req *http.Request) {
resp, err := node.dataCoord.GcControl(req.Context(), &datapb.GcControlRequest{
Base: commonpbutil.NewMsgBase(),
Command: datapb.GcCommand_Resume,
})
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(fmt.Sprintf(`{"msg": "failed to pause garbage collection, %s"}`, err.Error())))
return
}
if resp.GetErrorCode() != commonpb.ErrorCode_Success {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(fmt.Sprintf(`{"msg": "failed to pause garbage collection, %s"}`, resp.GetReason())))
return
}
w.WriteHeader(http.StatusOK)
w.Write([]byte(`{"msg": "OK"}`))
}

View File

@ -0,0 +1,161 @@
// Licensed to the LF AI & Data foundation under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package proxy
import (
"context"
"net/http"
"net/http/httptest"
"testing"
"github.com/cockroachdb/errors"
"github.com/milvus-io/milvus-proto/go-api/v2/commonpb"
"github.com/milvus-io/milvus/internal/mocks"
"github.com/milvus-io/milvus/internal/proto/datapb"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/suite"
)
type ProxyManagementSuite struct {
suite.Suite
datacoord *mocks.DataCoord
proxy *Proxy
}
func (s *ProxyManagementSuite) SetupTest() {
s.datacoord = mocks.NewDataCoord(s.T())
s.proxy = &Proxy{
dataCoord: s.datacoord,
}
}
func (s *ProxyManagementSuite) TearDownTest() {
s.datacoord.AssertExpectations(s.T())
}
func (s *ProxyManagementSuite) TestPauseDataCoordGC() {
s.Run("normal", func() {
s.SetupTest()
defer s.TearDownTest()
s.datacoord.EXPECT().GcControl(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, req *datapb.GcControlRequest) (*commonpb.Status, error) {
s.Equal(datapb.GcCommand_Pause, req.GetCommand())
return &commonpb.Status{}, nil
})
req, err := http.NewRequest(http.MethodGet, mgrRouteGcPause+"?pause_seconds=60", nil)
s.Require().NoError(err)
recorder := httptest.NewRecorder()
s.proxy.PauseDatacoordGC(recorder, req)
s.Equal(http.StatusOK, recorder.Code)
})
s.Run("return_error", func() {
s.SetupTest()
defer s.TearDownTest()
s.datacoord.EXPECT().GcControl(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, req *datapb.GcControlRequest) (*commonpb.Status, error) {
return &commonpb.Status{}, errors.New("mock")
})
req, err := http.NewRequest(http.MethodGet, mgrRouteGcPause+"?pause_seconds=60", nil)
s.Require().NoError(err)
recorder := httptest.NewRecorder()
s.proxy.PauseDatacoordGC(recorder, req)
s.Equal(http.StatusInternalServerError, recorder.Code)
})
s.Run("return_failure", func() {
s.SetupTest()
defer s.TearDownTest()
s.datacoord.EXPECT().GcControl(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, req *datapb.GcControlRequest) (*commonpb.Status, error) {
return &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: "mocked",
}, nil
})
req, err := http.NewRequest(http.MethodGet, mgrRouteGcPause+"?pause_seconds=60", nil)
s.Require().NoError(err)
recorder := httptest.NewRecorder()
s.proxy.PauseDatacoordGC(recorder, req)
s.Equal(http.StatusInternalServerError, recorder.Code)
})
}
func (s *ProxyManagementSuite) TestResumeDatacoordGC() {
s.Run("normal", func() {
s.SetupTest()
defer s.TearDownTest()
s.datacoord.EXPECT().GcControl(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, req *datapb.GcControlRequest) (*commonpb.Status, error) {
s.Equal(datapb.GcCommand_Resume, req.GetCommand())
return &commonpb.Status{}, nil
})
req, err := http.NewRequest(http.MethodGet, mgrRouteGcResume, nil)
s.Require().NoError(err)
recorder := httptest.NewRecorder()
s.proxy.ResumeDatacoordGC(recorder, req)
s.Equal(http.StatusOK, recorder.Code)
})
s.Run("return_error", func() {
s.SetupTest()
defer s.TearDownTest()
s.datacoord.EXPECT().GcControl(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, req *datapb.GcControlRequest) (*commonpb.Status, error) {
return &commonpb.Status{}, errors.New("mock")
})
req, err := http.NewRequest(http.MethodGet, mgrRouteGcResume, nil)
s.Require().NoError(err)
recorder := httptest.NewRecorder()
s.proxy.ResumeDatacoordGC(recorder, req)
s.Equal(http.StatusInternalServerError, recorder.Code)
})
s.Run("return_failure", func() {
s.SetupTest()
defer s.TearDownTest()
s.datacoord.EXPECT().GcControl(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, req *datapb.GcControlRequest) (*commonpb.Status, error) {
return &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: "mocked",
}, nil
})
req, err := http.NewRequest(http.MethodGet, mgrRouteGcResume, nil)
s.Require().NoError(err)
recorder := httptest.NewRecorder()
s.proxy.ResumeDatacoordGC(recorder, req)
s.Equal(http.StatusInternalServerError, recorder.Code)
})
}
func TestProxyManagement(t *testing.T) {
suite.Run(t, new(ProxyManagementSuite))
}

View File

@ -379,6 +379,8 @@ func (node *Proxy) Start() error {
node.sendChannelsTimeTickLoop()
RegisterMgrRoute(node)
// Start callbacks
for _, cb := range node.startCallbacks {
cb()

View File

@ -353,6 +353,8 @@ type DataCoord interface {
CheckHealth(ctx context.Context, req *milvuspb.CheckHealthRequest) (*milvuspb.CheckHealthResponse, error)
GcConfirm(ctx context.Context, request *datapb.GcConfirmRequest) (*datapb.GcConfirmResponse, error)
// GcControl is the API to pause or resume datcoord garbage collection.
GcControl(ctx context.Context, request *datapb.GcControlRequest) (*commonpb.Status, error)
}
// DataCoordComponent defines the interface of DataCoord component.

View File

@ -193,3 +193,7 @@ func (m *GrpcDataCoordClient) ListSegmentsInfo(ctx context.Context, req *datapb.
func (m *GrpcDataCoordClient) ReportDataNodeTtMsgs(ctx context.Context, in *datapb.ReportDataNodeTtMsgsRequest, opts ...grpc.CallOption) (*commonpb.Status, error) {
return &commonpb.Status{}, m.Err
}
func (m *GrpcDataCoordClient) GcControl(ctx context.Context, in *datapb.GcControlRequest, opts ...grpc.CallOption) (*commonpb.Status, error) {
return &commonpb.Status{}, m.Err
}