1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-09 09:35:00 +09:00

GO-4231 Merge main

This commit is contained in:
kirillston 2024-11-29 10:58:26 +01:00
commit f397e77509
No known key found for this signature in database
GPG key ID: 88218A7F1109754B
54 changed files with 3724 additions and 2392 deletions

View file

@ -109,12 +109,12 @@ jobs:
echo $FLAGS
mkdir -p .release
echo $SDKROOT
GOEXPERIMENT=rangefunc GOOS="darwin" CGO_CFLAGS="-mmacosx-version-min=11" MACOSX_DEPLOYMENT_TARGET=11.0 GOARCH="amd64" CGO_ENABLED="1" go build -tags="envproduction nographviz nowatchdog nosigar nomutexdeadlockdetector" -ldflags="$FLAGS" -o darwin-amd64 github.com/anyproto/anytype-heart/cmd/grpcserver
GOOS="darwin" CGO_CFLAGS="-mmacosx-version-min=11" MACOSX_DEPLOYMENT_TARGET=11.0 GOARCH="amd64" CGO_ENABLED="1" go build -tags="envproduction nographviz nowatchdog nosigar nomutexdeadlockdetector" -ldflags="$FLAGS" -o darwin-amd64 github.com/anyproto/anytype-heart/cmd/grpcserver
export SDKROOT=$(xcrun --sdk macosx --show-sdk-path)
echo $SDKROOT
GOEXPERIMENT=rangefunc GOOS="darwin" CGO_CFLAGS="-mmacosx-version-min=11" MACOSX_DEPLOYMENT_TARGET=11.0 GOARCH="arm64" CGO_ENABLED="1" go build -tags="envproduction nographviz nowatchdog nosigar nomutexdeadlockdetector" -ldflags="$FLAGS" -o darwin-arm64 github.com/anyproto/anytype-heart/cmd/grpcserver
GOEXPERIMENT=rangefunc GOOS="windows" GOARCH="amd64" CGO_ENABLED="1" CC="x86_64-w64-mingw32-gcc" CXX="x86_64-w64-mingw32-g++" go build -tags="envproduction nographviz nowatchdog nosigar nomutexdeadlockdetector noheic" -ldflags="$FLAGS -linkmode external -extldflags=-static" -o windows-amd64 github.com/anyproto/anytype-heart/cmd/grpcserver
GOEXPERIMENT=rangefunc GOOS="linux" GOARCH="amd64" CGO_ENABLED="1" CC="x86_64-linux-musl-gcc" go build -tags="envproduction nographviz nowatchdog nosigar nomutexdeadlockdetector noheic" -ldflags="$FLAGS -linkmode external -extldflags '-static -Wl,-z stack-size=1000000'" -o linux-amd64 github.com/anyproto/anytype-heart/cmd/grpcserver
GOOS="darwin" CGO_CFLAGS="-mmacosx-version-min=11" MACOSX_DEPLOYMENT_TARGET=11.0 GOARCH="arm64" CGO_ENABLED="1" go build -tags="envproduction nographviz nowatchdog nosigar nomutexdeadlockdetector" -ldflags="$FLAGS" -o darwin-arm64 github.com/anyproto/anytype-heart/cmd/grpcserver
GOOS="windows" GOARCH="amd64" CGO_ENABLED="1" CC="x86_64-w64-mingw32-gcc" CXX="x86_64-w64-mingw32-g++" go build -tags="envproduction nographviz nowatchdog nosigar nomutexdeadlockdetector noheic" -ldflags="$FLAGS -linkmode external -extldflags=-static" -o windows-amd64 github.com/anyproto/anytype-heart/cmd/grpcserver
GOOS="linux" GOARCH="amd64" CGO_ENABLED="1" CC="x86_64-linux-musl-gcc" go build -tags="envproduction nographviz nowatchdog nosigar nomutexdeadlockdetector noheic" -ldflags="$FLAGS -linkmode external -extldflags '-static -Wl,-z stack-size=1000000'" -o linux-amd64 github.com/anyproto/anytype-heart/cmd/grpcserver
ls -lha .
- name: run perf tests
run: |
@ -216,10 +216,10 @@ jobs:
cp pkg/lib/bundle/internalTypes.json ./json
- name: Compile ios lib
run: |
go install github.com/vektra/mockery/v2@v2.46.0
go install github.com/vektra/mockery/v2@v2.47.0
go install go.uber.org/mock/mockgen@v0.5.0
make test-deps
GOEXPERIMENT=rangefunc gomobile bind -tags "envproduction nogrpcserver gomobile nowatchdog nosigar nomutexdeadlockdetector timetzdata rasterizesvg" -ldflags "$FLAGS" -v -target=ios -o Lib.xcframework github.com/anyproto/anytype-heart/clientlibrary/service github.com/anyproto/anytype-heart/core || true
gomobile bind -tags "envproduction nogrpcserver gomobile nowatchdog nosigar nomutexdeadlockdetector timetzdata rasterizesvg" -ldflags "$FLAGS" -v -target=ios -o Lib.xcframework github.com/anyproto/anytype-heart/clientlibrary/service github.com/anyproto/anytype-heart/core || true
mkdir -p dist/ios/ && mv Lib.xcframework dist/ios/
go run cmd/iosrepack/main.go
mv dist/ios/Lib.xcframework .
@ -249,7 +249,7 @@ jobs:
cp pkg/lib/bundle/internalTypes.json ./json
- name: Compile android lib
run: |
GOEXPERIMENT=rangefunc gomobile bind -tags "envproduction nogrpcserver gomobile nowatchdog nosigar nomutexdeadlockdetector timetzdata rasterizesvg" -ldflags "$FLAGS" -v -target=android -androidapi 26 -o lib.aar github.com/anyproto/anytype-heart/clientlibrary/service github.com/anyproto/anytype-heart/core || true
gomobile bind -tags "envproduction nogrpcserver gomobile nowatchdog nosigar nomutexdeadlockdetector timetzdata rasterizesvg" -ldflags "$FLAGS" -v -target=android -androidapi 26 -o lib.aar github.com/anyproto/anytype-heart/clientlibrary/service github.com/anyproto/anytype-heart/core || true
gtar --exclude ".*" -czvf android_lib_${VERSION}.tar.gz lib.aar protobuf json
mv android_lib_${VERSION}.tar.gz .release/
- name: Publish android lib to maven

View file

@ -10,9 +10,8 @@
<env name="ANYTYPE_GRPC_ADDR" value="127.0.0.1:31007" />
<env name="ANYTYPE_GRPCWEB_ADDR" value="127.0.0.1:31008" />
<env name="CC" value="/usr/bin/cc" />
<env name="CGO_CFLAGS" value="-Wno-deprecated-declarations -Wno-deprecated-non-prototype -Wno-xor-used-as-pow" />
<env name="CXX" value="/usr/bin/c++" />
<env name="GOEXPERIMENT" value="rangefunc" />
<env name="CGO_CFLAGS" value="-Wno-deprecated-declarations -Wno-deprecated-non-prototype -Wno-xor-used-as-pow" />
</envs>
<EXTENSION ID="net.ashald.envfile">
<option name="IS_ENABLED" value="false" />

View file

@ -7,7 +7,6 @@ BUILD_FLAGS ?=
TANTIVY_VERSION := $(shell cat go.mod | grep github.com/anyproto/tantivy-go | cut -d' ' -f2)
export GOLANGCI_LINT_VERSION=1.58.1
export GOEXPERIMENT=rangefunc
export CGO_CFLAGS=-Wno-deprecated-non-prototype -Wno-unknown-warning-option -Wno-deprecated-declarations -Wno-xor-used-as-pow -Wno-single-bit-bitfield-constant-conversion
ifndef $(GOPATH)

View file

@ -25,338 +25,339 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) }
var fileDescriptor_93a29dc403579097 = []byte{
// 5285 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9d, 0x5f, 0x6f, 0x24, 0x49,
0x52, 0xc0, 0xaf, 0x5f, 0x58, 0xa8, 0xe3, 0x16, 0xe8, 0x85, 0x65, 0x6f, 0xb9, 0x9b, 0x99, 0x9d,
0x9d, 0xb1, 0x3d, 0x63, 0xbb, 0x3d, 0x3b, 0xb3, 0xff, 0xb8, 0x43, 0x02, 0x8f, 0x3d, 0xf6, 0x9a,
0xb3, 0x3d, 0xc6, 0x6d, 0xcf, 0x48, 0x2b, 0x21, 0x51, 0xee, 0x4a, 0xb7, 0x0b, 0x57, 0x57, 0xd6,
0x55, 0x65, 0xb7, 0xa7, 0x0f, 0x81, 0x38, 0x81, 0x40, 0x20, 0x10, 0x27, 0xfe, 0x89, 0x37, 0x24,
0x3e, 0x01, 0x1f, 0x83, 0xc7, 0x7b, 0xe4, 0x11, 0xed, 0xbe, 0xf1, 0x29, 0x50, 0x65, 0x66, 0xe5,
0x9f, 0xa8, 0x88, 0xac, 0xf2, 0xf2, 0x34, 0xa3, 0x8e, 0x5f, 0x44, 0x64, 0x56, 0x66, 0x46, 0x46,
0x66, 0x65, 0xa5, 0xa3, 0xbb, 0xc5, 0xc5, 0x56, 0x51, 0x72, 0xc1, 0xab, 0xad, 0x8a, 0x95, 0x8b,
0x74, 0xc2, 0x9a, 0x7f, 0x47, 0xf2, 0xe7, 0xe1, 0x5b, 0x71, 0xbe, 0x14, 0xcb, 0x82, 0xbd, 0xff,
0x9e, 0x25, 0x27, 0x7c, 0x36, 0x8b, 0xf3, 0xa4, 0x52, 0xc8, 0xfb, 0xef, 0x5a, 0x09, 0x5b, 0xb0,
0x5c, 0xe8, 0xdf, 0x9f, 0xfe, 0xf4, 0x7f, 0x07, 0xd1, 0xdb, 0x3b, 0x59, 0xca, 0x72, 0xb1, 0xa3,
0x35, 0x86, 0x5f, 0x46, 0xdf, 0xd9, 0x2e, 0x8a, 0x7d, 0x26, 0x5e, 0xb1, 0xb2, 0x4a, 0x79, 0x3e,
0xfc, 0x70, 0xa4, 0x1d, 0x8c, 0x4e, 0x8b, 0xc9, 0x68, 0xbb, 0x28, 0x46, 0x56, 0x38, 0x3a, 0x65,
0x3f, 0x9e, 0xb3, 0x4a, 0xbc, 0xff, 0x20, 0x0c, 0x55, 0x05, 0xcf, 0x2b, 0x36, 0xbc, 0x8c, 0x7e,
0x6d, 0xbb, 0x28, 0xc6, 0x4c, 0xec, 0xb2, 0xba, 0x02, 0x63, 0x11, 0x0b, 0x36, 0x5c, 0x6d, 0xa9,
0xfa, 0x80, 0xf1, 0xb1, 0xd6, 0x0d, 0x6a, 0x3f, 0x67, 0xd1, 0xb7, 0x6b, 0x3f, 0x57, 0x73, 0x91,
0xf0, 0x9b, 0x7c, 0xf8, 0x41, 0x5b, 0x51, 0x8b, 0x8c, 0xed, 0xfb, 0x21, 0x44, 0x5b, 0x7d, 0x1d,
0xfd, 0xf2, 0xeb, 0x38, 0xcb, 0x98, 0xd8, 0x29, 0x59, 0x5d, 0x70, 0x5f, 0x47, 0x89, 0x46, 0x4a,
0x66, 0xec, 0x7e, 0x18, 0x64, 0xb4, 0xe1, 0x2f, 0xa3, 0xef, 0x28, 0xc9, 0x29, 0x9b, 0xf0, 0x05,
0x2b, 0x87, 0xa8, 0x96, 0x16, 0x12, 0x8f, 0xbc, 0x05, 0x41, 0xdb, 0x3b, 0x3c, 0x5f, 0xb0, 0x52,
0xe0, 0xb6, 0xb5, 0x30, 0x6c, 0xdb, 0x42, 0xda, 0xf6, 0xdf, 0x0c, 0xa2, 0xef, 0x6d, 0x4f, 0x26,
0x7c, 0x9e, 0x8b, 0x43, 0x3e, 0x89, 0xb3, 0xc3, 0x34, 0xbf, 0x3e, 0x66, 0x37, 0x3b, 0x57, 0x35,
0x9f, 0x4f, 0xd9, 0xf0, 0x99, 0xff, 0x54, 0x15, 0x3a, 0x32, 0xec, 0xc8, 0x85, 0x8d, 0xef, 0x8f,
0x6f, 0xa7, 0xa4, 0xcb, 0xf2, 0x0f, 0x83, 0xe8, 0x0e, 0x2c, 0xcb, 0x98, 0x67, 0x0b, 0x66, 0x4b,
0xf3, 0x49, 0x87, 0x61, 0x1f, 0x37, 0xe5, 0xf9, 0xf4, 0xb6, 0x6a, 0xba, 0x44, 0x59, 0xf4, 0x8e,
0xdb, 0x5d, 0xc6, 0xac, 0x92, 0xc3, 0xe9, 0x11, 0xdd, 0x23, 0x34, 0x62, 0x3c, 0x3f, 0xee, 0x83,
0x6a, 0x6f, 0x69, 0x34, 0xd4, 0xde, 0x32, 0x5e, 0x19, 0x67, 0x6b, 0xa8, 0x05, 0x87, 0x30, 0xbe,
0x1e, 0xf5, 0x20, 0xb5, 0xab, 0x3f, 0x8a, 0x7e, 0xe5, 0x35, 0x2f, 0xaf, 0xab, 0x22, 0x9e, 0x30,
0x3d, 0x14, 0x1e, 0xfa, 0xda, 0x8d, 0x14, 0x8e, 0x86, 0x95, 0x2e, 0xcc, 0xe9, 0xb4, 0x8d, 0xf0,
0x65, 0xc1, 0x60, 0x0c, 0xb2, 0x8a, 0xb5, 0x90, 0xea, 0xb4, 0x10, 0xd2, 0xb6, 0xaf, 0xa3, 0xa1,
0xb5, 0x7d, 0xf1, 0xc7, 0x6c, 0x22, 0xb6, 0x93, 0x04, 0xb6, 0x8a, 0xd5, 0x95, 0xc4, 0x68, 0x3b,
0x49, 0xa8, 0x56, 0xc1, 0x51, 0xed, 0xec, 0x26, 0x7a, 0x17, 0x38, 0x3b, 0x4c, 0x2b, 0xe9, 0x70,
0x33, 0x6c, 0x45, 0x63, 0xc6, 0xe9, 0xa8, 0x2f, 0xae, 0x1d, 0xff, 0xf9, 0x20, 0xfa, 0x2e, 0xe2,
0xf9, 0x94, 0xcd, 0xf8, 0x82, 0x0d, 0x9f, 0x74, 0x5b, 0x53, 0xa4, 0xf1, 0xff, 0xd1, 0x2d, 0x34,
0x90, 0x6e, 0x32, 0x66, 0x19, 0x9b, 0x08, 0xb2, 0x9b, 0x28, 0x71, 0x67, 0x37, 0x31, 0x98, 0x33,
0xc2, 0x1a, 0xe1, 0x3e, 0x13, 0x3b, 0xf3, 0xb2, 0x64, 0xb9, 0x20, 0xdb, 0xd2, 0x22, 0x9d, 0x6d,
0xe9, 0xa1, 0x48, 0x7d, 0xf6, 0x99, 0xd8, 0xce, 0x32, 0xb2, 0x3e, 0x4a, 0xdc, 0x59, 0x1f, 0x83,
0x69, 0x0f, 0x93, 0xe8, 0x57, 0x9d, 0x27, 0x26, 0x0e, 0xf2, 0x4b, 0x3e, 0xa4, 0x9f, 0x85, 0x94,
0x1b, 0x1f, 0xab, 0x9d, 0x1c, 0x52, 0x8d, 0x17, 0x6f, 0x0a, 0x5e, 0xd2, 0xcd, 0xa2, 0xc4, 0x9d,
0xd5, 0x30, 0x98, 0xf6, 0xf0, 0x87, 0xd1, 0xdb, 0x3a, 0x4a, 0x36, 0xf3, 0xd9, 0x03, 0x34, 0x84,
0xc2, 0x09, 0xed, 0x61, 0x07, 0x65, 0x83, 0x83, 0x96, 0xe9, 0xe0, 0xf3, 0x21, 0xaa, 0x07, 0x42,
0xcf, 0x83, 0x30, 0xd4, 0xb2, 0xbd, 0xcb, 0x32, 0x46, 0xda, 0x56, 0xc2, 0x0e, 0xdb, 0x06, 0xd2,
0xb6, 0xcb, 0xe8, 0x37, 0xcc, 0x63, 0xa9, 0xe7, 0x51, 0x29, 0xaf, 0x83, 0xf4, 0x3a, 0x51, 0x6f,
0x17, 0x32, 0xbe, 0x36, 0xfa, 0xc1, 0xad, 0xfa, 0xe8, 0x11, 0x88, 0xd7, 0x07, 0x8c, 0xbf, 0x07,
0x61, 0x48, 0xdb, 0xfe, 0xdb, 0x41, 0xf4, 0x7d, 0x2d, 0x7b, 0x91, 0xc7, 0x17, 0x19, 0x93, 0x53,
0xe2, 0x31, 0x13, 0x37, 0xbc, 0xbc, 0x1e, 0x2f, 0xf3, 0x09, 0x31, 0xfd, 0xe3, 0x70, 0xc7, 0xf4,
0x4f, 0x2a, 0x39, 0x19, 0x9f, 0xae, 0xa8, 0xe0, 0x05, 0xcc, 0xf8, 0x9a, 0x1a, 0x08, 0x5e, 0x50,
0x19, 0x9f, 0x8f, 0xb4, 0xac, 0x1e, 0xd5, 0x61, 0x13, 0xb7, 0x7a, 0xe4, 0xc6, 0xc9, 0xfb, 0x21,
0xc4, 0x86, 0xad, 0xa6, 0x03, 0xf3, 0xfc, 0x32, 0x9d, 0x9e, 0x17, 0x49, 0xdd, 0x8d, 0x1f, 0xe1,
0x3d, 0xd4, 0x41, 0x88, 0xb0, 0x45, 0xa0, 0xda, 0xdb, 0xdf, 0xdb, 0xc4, 0x48, 0x0f, 0xa5, 0xbd,
0x92, 0xcf, 0x0e, 0xd9, 0x34, 0x9e, 0x2c, 0xf5, 0xf8, 0xff, 0x38, 0x34, 0xf0, 0x20, 0x6d, 0x0a,
0xf1, 0xc9, 0x2d, 0xb5, 0x74, 0x79, 0xfe, 0x7d, 0x10, 0x3d, 0x68, 0xaa, 0x7f, 0x15, 0xe7, 0x53,
0xa6, 0xdb, 0x53, 0x95, 0x7e, 0x3b, 0x4f, 0x4e, 0x59, 0x25, 0xe2, 0x52, 0x0c, 0x7f, 0x80, 0x57,
0x32, 0xa4, 0x63, 0xca, 0xf6, 0xc3, 0x6f, 0xa4, 0x6b, 0x5b, 0x7d, 0x5c, 0x07, 0x36, 0x1d, 0x02,
0xfc, 0x56, 0x97, 0x12, 0x18, 0x00, 0xee, 0x87, 0x10, 0xdb, 0xea, 0x52, 0x70, 0x90, 0x2f, 0x52,
0xc1, 0xf6, 0x59, 0xce, 0xca, 0x76, 0xab, 0x2b, 0x55, 0x1f, 0x21, 0x5a, 0x9d, 0x40, 0x6d, 0xb0,
0xf1, 0xbc, 0x99, 0xc9, 0x71, 0x3d, 0x60, 0xa4, 0x35, 0x3d, 0x6e, 0xf4, 0x83, 0xed, 0xea, 0xce,
0xf1, 0x79, 0xca, 0x16, 0xfc, 0x1a, 0xae, 0xee, 0x5c, 0x13, 0x0a, 0x20, 0x56, 0x77, 0x28, 0x68,
0x67, 0x30, 0xc7, 0xcf, 0xab, 0x94, 0xdd, 0x80, 0x19, 0xcc, 0x55, 0xae, 0xc5, 0xc4, 0x0c, 0x86,
0x60, 0xda, 0xc3, 0x71, 0xf4, 0x4b, 0x52, 0xf8, 0xfb, 0x3c, 0xcd, 0x87, 0x77, 0x11, 0xa5, 0x5a,
0x60, 0xac, 0xde, 0xa3, 0x01, 0x50, 0xe2, 0xfa, 0xd7, 0x9d, 0x38, 0x9f, 0xb0, 0x0c, 0x2d, 0xb1,
0x15, 0x07, 0x4b, 0xec, 0x61, 0x36, 0x75, 0x90, 0xc2, 0x3a, 0x7e, 0x8d, 0xaf, 0xe2, 0x32, 0xcd,
0xa7, 0x43, 0x4c, 0xd7, 0x91, 0x13, 0xa9, 0x03, 0xc6, 0x81, 0x2e, 0xac, 0x15, 0xb7, 0x8b, 0xa2,
0xac, 0xc3, 0x22, 0xd6, 0x85, 0x7d, 0x24, 0xd8, 0x85, 0x5b, 0x28, 0xee, 0x6d, 0x97, 0x4d, 0xb2,
0x34, 0x0f, 0x7a, 0xd3, 0x48, 0x1f, 0x6f, 0x16, 0x05, 0x9d, 0xf7, 0x90, 0xc5, 0x0b, 0xd6, 0xd4,
0x0c, 0x7b, 0x32, 0x2e, 0x10, 0xec, 0xbc, 0x00, 0xb4, 0xeb, 0x34, 0x29, 0x3e, 0x8a, 0xaf, 0x59,
0xfd, 0x80, 0x59, 0x3d, 0xaf, 0x0d, 0x31, 0x7d, 0x8f, 0x20, 0xd6, 0x69, 0x38, 0xa9, 0x5d, 0xcd,
0xa3, 0x77, 0xa5, 0xfc, 0x24, 0x2e, 0x45, 0x3a, 0x49, 0x8b, 0x38, 0x6f, 0xf2, 0x7f, 0x6c, 0x5c,
0xb7, 0x28, 0xe3, 0x72, 0xb3, 0x27, 0xad, 0xdd, 0xfe, 0xeb, 0x20, 0xfa, 0x00, 0xfa, 0x3d, 0x61,
0xe5, 0x2c, 0x95, 0xcb, 0xc8, 0x4a, 0x05, 0xe1, 0xe1, 0x67, 0x61, 0xa3, 0x2d, 0x05, 0x53, 0x9a,
0xcf, 0x6f, 0xaf, 0xa8, 0x0b, 0xf6, 0x07, 0x51, 0xa4, 0x96, 0x2b, 0x72, 0x49, 0xe9, 0x8f, 0x5a,
0xbd, 0x8e, 0xf1, 0xd6, 0x93, 0x1f, 0x04, 0x08, 0x3b, 0x55, 0xa8, 0xdf, 0xe5, 0x4a, 0x79, 0x88,
0x6a, 0x48, 0x11, 0x31, 0x55, 0x00, 0x04, 0x16, 0x74, 0x7c, 0xc5, 0x6f, 0xf0, 0x82, 0xd6, 0x92,
0x70, 0x41, 0x35, 0x61, 0xf7, 0xae, 0x74, 0x41, 0xb1, 0xbd, 0xab, 0xa6, 0x18, 0xa1, 0xbd, 0x2b,
0xc8, 0x68, 0xc3, 0x3c, 0xfa, 0x75, 0xd7, 0xf0, 0x73, 0xce, 0xaf, 0x67, 0x71, 0x79, 0x3d, 0x7c,
0x4c, 0x2b, 0x37, 0x8c, 0x71, 0xb4, 0xde, 0x8b, 0xb5, 0x61, 0xc1, 0x75, 0x58, 0x27, 0x1a, 0xe7,
0x65, 0x06, 0xc2, 0x82, 0x67, 0x43, 0x23, 0x44, 0x58, 0x20, 0x50, 0x1b, 0xb9, 0x5d, 0x6f, 0x63,
0x06, 0x57, 0x4b, 0x9e, 0xfa, 0x98, 0x51, 0xab, 0x25, 0x04, 0x83, 0x5d, 0x68, 0xbf, 0x8c, 0x8b,
0x2b, 0xbc, 0x0b, 0x49, 0x51, 0xb8, 0x0b, 0x35, 0x08, 0x6c, 0xef, 0x31, 0x8b, 0xcb, 0xc9, 0x15,
0xde, 0xde, 0x4a, 0x16, 0x6e, 0x6f, 0xc3, 0xc0, 0xf6, 0x56, 0x82, 0xd7, 0xa9, 0xb8, 0x3a, 0x62,
0x22, 0xc6, 0xdb, 0xdb, 0x67, 0xc2, 0xed, 0xdd, 0x62, 0x6d, 0x26, 0xe3, 0x3a, 0x1c, 0xcf, 0x2f,
0xaa, 0x49, 0x99, 0x5e, 0xb0, 0x61, 0xc0, 0x8a, 0x81, 0x88, 0x4c, 0x86, 0x84, 0xb5, 0xcf, 0x9f,
0x0d, 0xa2, 0xbb, 0x4d, 0xb3, 0xf3, 0xaa, 0x52, 0x33, 0x2b, 0x70, 0xff, 0x09, 0xde, 0xbe, 0x04,
0x4e, 0xec, 0x26, 0xf6, 0x50, 0x73, 0xa2, 0x2a, 0x5e, 0xa4, 0xf3, 0xbc, 0x32, 0x85, 0xfa, 0xac,
0x8f, 0x75, 0x47, 0x81, 0x88, 0xaa, 0xbd, 0x14, 0xed, 0x84, 0xa6, 0xdb, 0xa7, 0x91, 0x1d, 0x24,
0x15, 0x98, 0xd0, 0x9a, 0xe7, 0xed, 0x10, 0xc4, 0x84, 0x86, 0x93, 0xb0, 0x2b, 0xec, 0x97, 0x7c,
0x5e, 0x54, 0x1d, 0x5d, 0x01, 0x40, 0xe1, 0xae, 0xd0, 0x86, 0xb5, 0xcf, 0x37, 0xd1, 0x6f, 0xba,
0xdd, 0xcf, 0x7d, 0xd8, 0x9b, 0x74, 0x9f, 0xc2, 0x1e, 0xf1, 0xa8, 0x2f, 0x6e, 0x53, 0xba, 0xc6,
0xb3, 0xd8, 0x65, 0x22, 0x4e, 0xb3, 0x6a, 0xb8, 0x82, 0xdb, 0x68, 0xe4, 0x44, 0x4a, 0x87, 0x71,
0x30, 0xbe, 0xed, 0xce, 0x8b, 0x2c, 0x9d, 0xb4, 0xf7, 0x72, 0xb5, 0xae, 0x11, 0x87, 0xe3, 0x9b,
0x8b, 0xc1, 0x78, 0x3d, 0x66, 0x42, 0xfd, 0xe7, 0x6c, 0x59, 0x30, 0x3c, 0x5e, 0x7b, 0x48, 0x38,
0x5e, 0x43, 0x14, 0xd6, 0x67, 0xcc, 0xc4, 0x61, 0xbc, 0xe4, 0x73, 0x22, 0x5e, 0x1b, 0x71, 0xb8,
0x3e, 0x2e, 0x66, 0xb3, 0x2a, 0xe3, 0xe1, 0x20, 0x17, 0xac, 0xcc, 0xe3, 0x6c, 0x2f, 0x8b, 0xa7,
0xd5, 0x90, 0x88, 0x31, 0x3e, 0x45, 0x64, 0x55, 0x34, 0x8d, 0x3c, 0xc6, 0x83, 0x6a, 0x2f, 0x5e,
0xf0, 0x32, 0x15, 0xf4, 0x63, 0xb4, 0x48, 0xe7, 0x63, 0xf4, 0x50, 0xd4, 0xdb, 0x76, 0x39, 0xb9,
0x4a, 0x17, 0x2c, 0x09, 0x78, 0x6b, 0x90, 0x1e, 0xde, 0x1c, 0x14, 0x69, 0xb4, 0x31, 0x9f, 0x97,
0x13, 0x46, 0x36, 0x9a, 0x12, 0x77, 0x36, 0x9a, 0xc1, 0xb4, 0x87, 0xbf, 0x1c, 0x44, 0xbf, 0xa5,
0xa4, 0xee, 0x06, 0xeb, 0x6e, 0x5c, 0x5d, 0x5d, 0xf0, 0xb8, 0x4c, 0x86, 0x1f, 0x61, 0x76, 0x50,
0xd4, 0xb8, 0x7e, 0x7a, 0x1b, 0x15, 0xf8, 0x58, 0x0f, 0xd3, 0xca, 0x19, 0x71, 0xe8, 0x63, 0xf5,
0x90, 0xf0, 0x63, 0x85, 0x28, 0x0c, 0x20, 0x52, 0xae, 0x36, 0x33, 0x56, 0x48, 0x7d, 0x7f, 0x47,
0x63, 0xb5, 0x93, 0x83, 0xf1, 0xb1, 0x16, 0xfa, 0xbd, 0x65, 0x93, 0xb2, 0x81, 0xf7, 0x98, 0x51,
0x5f, 0x9c, 0xf4, 0x6c, 0x46, 0x45, 0xd8, 0x73, 0x6b, 0x64, 0x8c, 0xfa, 0xe2, 0x84, 0x67, 0x27,
0xac, 0x85, 0x3c, 0x23, 0xa1, 0x6d, 0xd4, 0x17, 0x87, 0xd9, 0x97, 0x66, 0x9a, 0x79, 0xe1, 0x71,
0xc0, 0x0e, 0x9c, 0x1b, 0xd6, 0x7b, 0xb1, 0xda, 0xe1, 0x5f, 0x0f, 0xa2, 0xef, 0x59, 0x8f, 0x47,
0x3c, 0x49, 0x2f, 0x97, 0x0a, 0x7a, 0x15, 0x67, 0x73, 0x56, 0x0d, 0x9f, 0x52, 0xd6, 0xda, 0xac,
0x29, 0xc1, 0xb3, 0x5b, 0xe9, 0xc0, 0xb1, 0xb3, 0x5d, 0x14, 0xd9, 0xf2, 0x8c, 0xcd, 0x8a, 0x8c,
0x1c, 0x3b, 0x1e, 0x12, 0x1e, 0x3b, 0x10, 0x85, 0x59, 0xf9, 0x19, 0xaf, 0x73, 0x7e, 0x34, 0x2b,
0x97, 0xa2, 0x70, 0x56, 0xde, 0x20, 0x30, 0x57, 0x3a, 0xe3, 0x3b, 0x3c, 0xcb, 0xd8, 0x44, 0xb4,
0x5f, 0xd2, 0x1a, 0x4d, 0x4b, 0x84, 0x73, 0x25, 0x40, 0xda, 0xfd, 0x8c, 0x66, 0x0d, 0x19, 0x97,
0xec, 0xf9, 0xf2, 0x30, 0xcd, 0xaf, 0x87, 0x78, 0x5a, 0x60, 0x01, 0x62, 0x3f, 0x03, 0x05, 0xe1,
0x5a, 0xf5, 0x3c, 0x4f, 0x38, 0xbe, 0x56, 0xad, 0x25, 0xe1, 0xb5, 0xaa, 0x26, 0xa0, 0xc9, 0x53,
0x46, 0x99, 0xac, 0x25, 0x61, 0x93, 0x9a, 0xc0, 0x42, 0xa1, 0xde, 0xf5, 0x26, 0x43, 0x21, 0xd8,
0xe7, 0x5e, 0xed, 0xe4, 0x60, 0x0f, 0x6d, 0x16, 0xad, 0x7b, 0x4c, 0x4c, 0xae, 0xf0, 0x1e, 0xea,
0x21, 0xe1, 0x1e, 0x0a, 0x51, 0x58, 0xa5, 0x33, 0x6e, 0x16, 0xdd, 0x2b, 0x78, 0xff, 0x68, 0x2d,
0xb8, 0x57, 0x3b, 0x39, 0xb8, 0x8c, 0x3c, 0x98, 0xc9, 0x67, 0x86, 0x76, 0x72, 0x25, 0x0b, 0x2f,
0x23, 0x0d, 0x03, 0x4b, 0xaf, 0x04, 0xf5, 0xe3, 0xc4, 0x4b, 0x6f, 0xe5, 0xe1, 0xd2, 0x7b, 0x9c,
0x76, 0xf2, 0xcf, 0x66, 0x19, 0xa7, 0xa4, 0xc7, 0xbc, 0x1e, 0x23, 0xaf, 0xe2, 0x2c, 0x4d, 0x62,
0xc1, 0xce, 0xf8, 0x35, 0xcb, 0xf1, 0x15, 0x93, 0x2e, 0xad, 0xe2, 0x47, 0x9e, 0x42, 0x78, 0xc5,
0x14, 0x56, 0x84, 0xfd, 0x44, 0xd1, 0xe7, 0x15, 0xdb, 0x89, 0x2b, 0x22, 0x92, 0x79, 0x48, 0xb8,
0x9f, 0x40, 0x14, 0xe6, 0xab, 0x4a, 0xfe, 0xe2, 0x4d, 0xc1, 0xca, 0x94, 0xe5, 0x13, 0x86, 0xe7,
0xab, 0x90, 0x0a, 0xe7, 0xab, 0x08, 0xdd, 0xda, 0xa6, 0x31, 0xc1, 0xa9, 0x7d, 0xce, 0x02, 0x12,
0x81, 0x73, 0x16, 0x04, 0x0a, 0x2b, 0x69, 0x01, 0x74, 0xab, 0xb3, 0x65, 0x25, 0xb8, 0xd5, 0x49,
0xd3, 0xad, 0xcd, 0x2f, 0xc3, 0x8c, 0xeb, 0x61, 0xd2, 0x51, 0xf4, 0xb1, 0x3b, 0x5c, 0xd6, 0x7b,
0xb1, 0xf8, 0x6e, 0xdb, 0x29, 0xcb, 0x62, 0x39, 0x85, 0x04, 0xb6, 0xb4, 0x1a, 0xa6, 0xcf, 0x6e,
0x9b, 0xc3, 0x6a, 0x87, 0x3f, 0x1d, 0x44, 0xef, 0x63, 0x1e, 0x5f, 0x16, 0xd2, 0xef, 0x93, 0x6e,
0x5b, 0x8a, 0x24, 0x0e, 0x92, 0x84, 0x35, 0x74, 0x19, 0xfe, 0x24, 0x7a, 0xaf, 0x11, 0xd9, 0x73,
0x26, 0xba, 0x00, 0x7e, 0x02, 0x65, 0xca, 0x0f, 0x39, 0xe3, 0x7e, 0xab, 0x37, 0x6f, 0xd7, 0x26,
0x7e, 0xb9, 0x2a, 0xb0, 0x36, 0x31, 0x36, 0xb4, 0x98, 0x58, 0x9b, 0x20, 0x98, 0xdd, 0xd5, 0x70,
0xab, 0xf7, 0x3a, 0x15, 0x57, 0x32, 0xf7, 0x01, 0xbb, 0x1a, 0x5e, 0x59, 0x0d, 0x44, 0xec, 0x6a,
0x90, 0x30, 0xcc, 0x0e, 0x1a, 0xb0, 0x1e, 0x9b, 0x58, 0x5c, 0x35, 0x86, 0xdc, 0x91, 0xb9, 0xd6,
0x0d, 0xc2, 0xfe, 0xda, 0x88, 0xf5, 0x32, 0xe4, 0x71, 0xc8, 0x02, 0x58, 0x8a, 0xac, 0xf7, 0x62,
0xb5, 0xc3, 0x3f, 0x8b, 0xbe, 0xdb, 0xaa, 0xd8, 0x1e, 0x8b, 0xc5, 0xbc, 0x64, 0xc9, 0x70, 0xab,
0xa3, 0xdc, 0x0d, 0x68, 0x5c, 0x3f, 0xe9, 0xaf, 0xd0, 0xca, 0x97, 0x1b, 0x4e, 0x75, 0x2b, 0x53,
0x86, 0xa7, 0x21, 0x93, 0x3e, 0x1b, 0xcc, 0x97, 0x69, 0x9d, 0xd6, 0x92, 0xd7, 0xed, 0x5d, 0xdb,
0x8b, 0x38, 0xcd, 0xe4, 0x2b, 0xa7, 0x8f, 0x42, 0x46, 0x3d, 0x34, 0xb8, 0xe4, 0x25, 0x55, 0x5a,
0x91, 0x59, 0x8e, 0x71, 0x67, 0xa9, 0xb4, 0x41, 0x47, 0x02, 0x64, 0xa5, 0xb4, 0xd9, 0x93, 0xd6,
0x6e, 0x45, 0xb3, 0x55, 0x58, 0xff, 0xec, 0x76, 0x72, 0xcc, 0xab, 0x56, 0x45, 0x7a, 0xfa, 0x66,
0x4f, 0x5a, 0x7b, 0xfd, 0xd3, 0xe8, 0xbd, 0xb6, 0x57, 0x3d, 0x11, 0x6d, 0x75, 0x9a, 0x02, 0x73,
0xd1, 0x93, 0xfe, 0x0a, 0xda, 0xfd, 0xbf, 0x99, 0x3d, 0x62, 0xe5, 0x7f, 0xc2, 0x67, 0x33, 0x96,
0x27, 0x2c, 0x69, 0x34, 0xaa, 0x7a, 0x2d, 0xf3, 0x39, 0x6d, 0xd7, 0x28, 0x8c, 0x5c, 0x0d, 0x53,
0xa2, 0xdf, 0xfe, 0x06, 0x9a, 0xba, 0x68, 0xff, 0x39, 0x88, 0x1e, 0xa1, 0x45, 0x6b, 0x3a, 0xae,
0x57, 0xc4, 0xdf, 0xeb, 0xe3, 0x08, 0xd3, 0x34, 0x45, 0xdd, 0xfe, 0x7f, 0x58, 0xb0, 0x8b, 0xb5,
0x2f, 0xd2, 0x4a, 0xf0, 0x72, 0x39, 0xbe, 0xe2, 0x37, 0xcd, 0x69, 0x78, 0x3f, 0xf6, 0x69, 0x60,
0xe4, 0x10, 0xc4, 0x62, 0x0d, 0x27, 0x5b, 0xae, 0xec, 0xa9, 0xf9, 0x8a, 0x70, 0xe5, 0x10, 0x1d,
0xae, 0x7c, 0xd2, 0x46, 0xfe, 0xa6, 0x56, 0xf6, 0x88, 0xff, 0x2a, 0x5e, 0xd4, 0xf6, 0x31, 0xff,
0xb5, 0x6e, 0xd0, 0xe6, 0x7f, 0x5a, 0xbc, 0x9b, 0x5e, 0x5e, 0x9a, 0x3a, 0xe1, 0x25, 0x75, 0x11,
0x22, 0xff, 0x23, 0x50, 0xbb, 0x9c, 0xd8, 0x4b, 0x33, 0x26, 0xdf, 0x55, 0xbc, 0xbc, 0xbc, 0xcc,
0x78, 0x9c, 0x80, 0xe5, 0x44, 0x2d, 0x1e, 0xb9, 0x72, 0x62, 0x39, 0x81, 0x71, 0xf6, 0x30, 0x5d,
0x2d, 0xad, 0x7b, 0x50, 0x3e, 0x49, 0x33, 0x78, 0x38, 0x50, 0x6a, 0x1a, 0x21, 0x71, 0x98, 0xae,
0x05, 0xd9, 0x34, 0xa3, 0x16, 0xd5, 0x41, 0xb4, 0x29, 0xff, 0xc3, 0xb6, 0xa2, 0x23, 0x26, 0xd2,
0x0c, 0x04, 0xb3, 0xab, 0xea, 0x5a, 0x78, 0x5e, 0x48, 0xe3, 0xf7, 0xda, 0x5a, 0x4a, 0x42, 0xac,
0xaa, 0x7d, 0xc2, 0xae, 0x0e, 0xeb, 0xdf, 0x77, 0xf9, 0x4d, 0x2e, 0x8d, 0xde, 0x6f, 0xab, 0x34,
0x32, 0x62, 0x75, 0x08, 0x19, 0x6d, 0xf8, 0x47, 0xd1, 0x2f, 0x4a, 0xc3, 0x25, 0x2f, 0x86, 0x77,
0x10, 0x85, 0xd2, 0x39, 0xc7, 0x77, 0x97, 0x94, 0xdb, 0xe3, 0xa8, 0xa6, 0x6f, 0x9c, 0x57, 0xf1,
0x94, 0x0d, 0x1f, 0x10, 0x2d, 0x2e, 0xa5, 0xc4, 0x71, 0xd4, 0x36, 0xe5, 0xf7, 0x8a, 0x63, 0x9e,
0x68, 0xeb, 0x48, 0x0d, 0x8d, 0x30, 0xd4, 0x2b, 0x5c, 0xc8, 0xa6, 0x86, 0xc7, 0xf1, 0x22, 0x9d,
0x9a, 0xe9, 0x5b, 0x05, 0xb2, 0x0a, 0xa4, 0x86, 0x96, 0x19, 0x39, 0x10, 0x91, 0x1a, 0x92, 0xb0,
0xf6, 0xf9, 0x4f, 0x83, 0xe8, 0x9e, 0x65, 0xf6, 0x9b, 0x7d, 0xc8, 0x83, 0xfc, 0x92, 0xd7, 0x89,
0xe4, 0x61, 0x9a, 0x5f, 0x57, 0xc3, 0x4f, 0x29, 0x93, 0x38, 0x6f, 0x8a, 0xf2, 0xd9, 0xad, 0xf5,
0xec, 0x1a, 0xa0, 0xd9, 0xa4, 0xb3, 0x6f, 0xea, 0x95, 0x06, 0x58, 0x03, 0x98, 0xbd, 0x3c, 0xc8,
0x11, 0x6b, 0x80, 0x10, 0x6f, 0x9b, 0xd8, 0x38, 0xcf, 0x78, 0x0e, 0x9b, 0xd8, 0x5a, 0xa8, 0x85,
0x44, 0x13, 0xb7, 0x20, 0x1b, 0x8f, 0x1b, 0x91, 0xda, 0x4f, 0xda, 0xce, 0x32, 0x10, 0x8f, 0x8d,
0xaa, 0x01, 0x88, 0x78, 0x8c, 0x82, 0xda, 0xcf, 0x69, 0xf4, 0xed, 0xfa, 0x91, 0x9e, 0x94, 0x6c,
0x91, 0x32, 0x78, 0xa8, 0xc4, 0x91, 0x10, 0xe3, 0xdf, 0x27, 0xec, 0xc8, 0x3a, 0xcf, 0xab, 0x22,
0x8b, 0xab, 0x2b, 0x7d, 0xcc, 0xc0, 0xaf, 0x73, 0x23, 0x84, 0x07, 0x0d, 0x1e, 0x76, 0x50, 0x36,
0xa8, 0x37, 0x32, 0x13, 0x62, 0x56, 0x70, 0xd5, 0x56, 0x98, 0x59, 0xed, 0xe4, 0xec, 0x5e, 0xfe,
0x7e, 0x9c, 0x65, 0xac, 0x5c, 0x36, 0xb2, 0xa3, 0x38, 0x4f, 0x2f, 0x59, 0x25, 0xc0, 0x5e, 0xbe,
0xa6, 0x46, 0x10, 0x23, 0xf6, 0xf2, 0x03, 0xb8, 0x5d, 0x1b, 0x01, 0xcf, 0x07, 0x79, 0xc2, 0xde,
0x80, 0xb5, 0x11, 0xb4, 0x23, 0x19, 0x62, 0x6d, 0x44, 0xb1, 0x76, 0x4f, 0xfb, 0x79, 0xc6, 0x27,
0xd7, 0x7a, 0x0a, 0xf0, 0x1b, 0x58, 0x4a, 0xe0, 0x1c, 0x70, 0x3f, 0x84, 0xd8, 0x49, 0x40, 0x0a,
0x4e, 0x59, 0x91, 0xc5, 0x13, 0x78, 0xb2, 0x48, 0xe9, 0x68, 0x19, 0x31, 0x09, 0x40, 0x06, 0x14,
0x57, 0x9f, 0x58, 0xc2, 0x8a, 0x0b, 0x0e, 0x2c, 0xdd, 0x0f, 0x21, 0x76, 0x1a, 0x94, 0x82, 0x71,
0x91, 0xa5, 0x02, 0x0c, 0x03, 0xa5, 0x21, 0x25, 0xc4, 0x30, 0xf0, 0x09, 0x60, 0xf2, 0x88, 0x95,
0x53, 0x86, 0x9a, 0x94, 0x92, 0xa0, 0xc9, 0x86, 0xb0, 0x07, 0x50, 0x55, 0xdd, 0x79, 0xb1, 0x04,
0x07, 0x50, 0x75, 0xb5, 0x78, 0xb1, 0x24, 0x0e, 0xa0, 0x7a, 0x00, 0x28, 0xe2, 0x49, 0x5c, 0x09,
0xbc, 0x88, 0x52, 0x12, 0x2c, 0x62, 0x43, 0xd8, 0x39, 0x5a, 0x15, 0x71, 0x2e, 0xc0, 0x1c, 0xad,
0x0b, 0xe0, 0xbc, 0x5b, 0xbf, 0x4b, 0xca, 0x6d, 0x24, 0x51, 0xad, 0xc2, 0xc4, 0x5e, 0xca, 0xb2,
0xa4, 0x02, 0x91, 0x44, 0x3f, 0xf7, 0x46, 0x4a, 0x44, 0x92, 0x36, 0x05, 0xba, 0x92, 0xde, 0xf9,
0xc7, 0x6a, 0x07, 0x36, 0xfd, 0xef, 0x87, 0x10, 0x1b, 0x9f, 0x9a, 0x42, 0xef, 0xc4, 0x65, 0x99,
0xd6, 0x93, 0xff, 0x0a, 0x5e, 0xa0, 0x46, 0x4e, 0xc4, 0x27, 0x8c, 0x03, 0xc3, 0xab, 0x09, 0xdc,
0x58, 0xc1, 0x60, 0xe8, 0xfe, 0x30, 0xc8, 0xd8, 0x8c, 0x53, 0x4a, 0x9c, 0x97, 0xc3, 0xd8, 0xd3,
0x44, 0xde, 0x0d, 0xaf, 0x74, 0x61, 0xce, 0x07, 0x22, 0xc6, 0xc5, 0x11, 0x5f, 0xb0, 0x33, 0xfe,
0xe2, 0x4d, 0x5a, 0x89, 0x34, 0x9f, 0xea, 0x99, 0xfb, 0x19, 0x61, 0x09, 0x83, 0x89, 0x0f, 0x44,
0x3a, 0x95, 0x6c, 0x02, 0x01, 0xca, 0x72, 0xcc, 0x6e, 0xd0, 0x04, 0x02, 0x5a, 0x34, 0x1c, 0x91,
0x40, 0x84, 0x78, 0xbb, 0x2b, 0x65, 0x9c, 0xeb, 0xaf, 0x68, 0xcf, 0x78, 0x93, 0xcb, 0x51, 0xd6,
0x20, 0x48, 0x6c, 0x0c, 0x04, 0x15, 0xec, 0xfa, 0xd2, 0xf8, 0xb7, 0x43, 0x6c, 0x8d, 0xb0, 0xd3,
0x1e, 0x66, 0x8f, 0x7a, 0x90, 0x88, 0x2b, 0x7b, 0xc2, 0x81, 0x72, 0xd5, 0x3e, 0xe0, 0xf0, 0xa8,
0x07, 0xe9, 0xec, 0x70, 0xb9, 0xd5, 0x7a, 0x1e, 0x4f, 0xae, 0xa7, 0x25, 0x9f, 0xe7, 0xc9, 0x0e,
0xcf, 0x78, 0x09, 0x76, 0xb8, 0xbc, 0x52, 0x03, 0x94, 0xd8, 0xe1, 0xea, 0x50, 0xb1, 0x19, 0x9c,
0x5b, 0x8a, 0xed, 0x2c, 0x9d, 0xc2, 0x15, 0xb5, 0x67, 0x48, 0x02, 0x44, 0x06, 0x87, 0x82, 0x48,
0x27, 0x52, 0x2b, 0x6e, 0x91, 0x4e, 0xe2, 0x4c, 0xf9, 0xdb, 0xa2, 0xcd, 0x78, 0x60, 0x67, 0x27,
0x42, 0x14, 0x90, 0x7a, 0x9e, 0xcd, 0xcb, 0xfc, 0x20, 0x17, 0x9c, 0xac, 0x67, 0x03, 0x74, 0xd6,
0xd3, 0x01, 0x41, 0x58, 0x3d, 0x63, 0x6f, 0xea, 0xd2, 0xd4, 0xff, 0x60, 0x61, 0xb5, 0xfe, 0x7d,
0xa4, 0xe5, 0xa1, 0xb0, 0x0a, 0x38, 0x50, 0x19, 0xed, 0x44, 0x75, 0x98, 0x80, 0xb6, 0xdf, 0x4d,
0xd6, 0xba, 0x41, 0xdc, 0xcf, 0x58, 0x2c, 0x33, 0x16, 0xf2, 0x23, 0x81, 0x3e, 0x7e, 0x1a, 0xd0,
0x6e, 0xb7, 0x78, 0xf5, 0xb9, 0x62, 0x93, 0xeb, 0xd6, 0x81, 0x2d, 0xbf, 0xa0, 0x0a, 0x21, 0xb6,
0x5b, 0x08, 0x14, 0x6f, 0xa2, 0x83, 0x09, 0xcf, 0x43, 0x4d, 0x54, 0xcb, 0xfb, 0x34, 0x91, 0xe6,
0xec, 0xe2, 0xd7, 0x48, 0x75, 0xcf, 0x54, 0xcd, 0xb4, 0x4e, 0x58, 0x70, 0x21, 0x62, 0xf1, 0x4b,
0xc2, 0x36, 0x27, 0x87, 0x3e, 0x8f, 0xda, 0xa7, 0xd9, 0x5b, 0x56, 0x8e, 0xe8, 0xd3, 0xec, 0x14,
0x4b, 0x57, 0x52, 0xf5, 0x91, 0x0e, 0x2b, 0x7e, 0x3f, 0xd9, 0xe8, 0x07, 0xdb, 0x25, 0x8f, 0xe7,
0x73, 0x27, 0x63, 0x71, 0xa9, 0xbc, 0x6e, 0x06, 0x0c, 0x59, 0x8c, 0x58, 0xf2, 0x04, 0x70, 0x10,
0xc2, 0x3c, 0xcf, 0x3b, 0x3c, 0x17, 0x2c, 0x17, 0x58, 0x08, 0xf3, 0x8d, 0x69, 0x30, 0x14, 0xc2,
0x28, 0x05, 0xd0, 0x6f, 0xe5, 0x7e, 0x10, 0x13, 0xc7, 0xf1, 0x0c, 0xcd, 0xd8, 0xd4, 0x5e, 0x8f,
0x92, 0x87, 0xfa, 0x2d, 0xe0, 0x9c, 0x57, 0xa6, 0xae, 0x97, 0xb3, 0xb8, 0x9c, 0x9a, 0xdd, 0x8d,
0x64, 0xf8, 0x84, 0xb6, 0xe3, 0x93, 0xc4, 0x2b, 0xd3, 0xb0, 0x06, 0x08, 0x3b, 0x07, 0xb3, 0x78,
0x6a, 0x6a, 0x8a, 0xd4, 0x40, 0xca, 0x5b, 0x55, 0x5d, 0xeb, 0x06, 0x81, 0x9f, 0x57, 0x69, 0xc2,
0x78, 0xc0, 0x8f, 0x94, 0xf7, 0xf1, 0x03, 0x41, 0x90, 0xbd, 0xd5, 0xf5, 0x56, 0x2b, 0xba, 0xed,
0x3c, 0xd1, 0xeb, 0xd8, 0x11, 0xf1, 0x78, 0x00, 0x17, 0xca, 0xde, 0x08, 0x1e, 0x8c, 0xd1, 0x66,
0x83, 0x36, 0x34, 0x46, 0xcd, 0xfe, 0x6b, 0x9f, 0x31, 0x8a, 0xc1, 0xda, 0xe7, 0x4f, 0xf4, 0x18,
0xdd, 0x8d, 0x45, 0x5c, 0xe7, 0xed, 0xaf, 0x52, 0x76, 0xa3, 0x17, 0xc2, 0x48, 0x7d, 0x1b, 0x6a,
0x24, 0x3f, 0x63, 0x04, 0xab, 0xe2, 0xad, 0xde, 0x7c, 0xc0, 0xb7, 0x5e, 0x21, 0x74, 0xfa, 0x06,
0x4b, 0x85, 0xad, 0xde, 0x7c, 0xc0, 0xb7, 0xfe, 0x3e, 0xba, 0xd3, 0x37, 0xf8, 0x48, 0x7a, 0xab,
0x37, 0xaf, 0x7d, 0xff, 0x45, 0x33, 0x70, 0x5d, 0xe7, 0x75, 0x1e, 0x36, 0x11, 0xe9, 0x82, 0x61,
0xe9, 0xa4, 0x6f, 0xcf, 0xa0, 0xa1, 0x74, 0x92, 0x56, 0x71, 0x2e, 0xd5, 0xc1, 0x4a, 0x71, 0xc2,
0xab, 0x54, 0x1e, 0x79, 0x78, 0xd6, 0xc3, 0x68, 0x03, 0x87, 0x16, 0x4d, 0x21, 0x25, 0xfb, 0xf2,
0xd6, 0x43, 0xed, 0xf9, 0xec, 0x8d, 0x80, 0xbd, 0xf6, 0x31, 0xed, 0xcd, 0x9e, 0xb4, 0x7d, 0x8d,
0xea, 0x31, 0xee, 0xfb, 0xdb, 0x50, 0xab, 0xa2, 0xaf, 0x70, 0x9f, 0xf4, 0x57, 0xd0, 0xee, 0xff,
0xaa, 0x59, 0x57, 0x40, 0xff, 0x7a, 0x10, 0x3c, 0xed, 0x63, 0x11, 0x0c, 0x84, 0x67, 0xb7, 0xd2,
0xd1, 0x05, 0xf9, 0xbb, 0x66, 0x01, 0xdd, 0xa0, 0xf2, 0x2b, 0x95, 0x97, 0x65, 0xc2, 0x4a, 0x3d,
0x26, 0x42, 0xcd, 0x6a, 0x61, 0x38, 0x32, 0x3e, 0xb9, 0xa5, 0x96, 0x73, 0xc5, 0x92, 0x07, 0xeb,
0xaf, 0x29, 0x9d, 0xf2, 0x84, 0x2c, 0x3b, 0x34, 0x2c, 0xd0, 0xa7, 0xb7, 0x55, 0xa3, 0xc6, 0x8a,
0x03, 0xcb, 0x1b, 0x1b, 0x9e, 0xf5, 0x34, 0xec, 0xdd, 0xe1, 0xf0, 0xf1, 0xed, 0x94, 0x74, 0x59,
0xfe, 0x63, 0x10, 0x3d, 0xf4, 0x58, 0xfb, 0x3e, 0x01, 0xec, 0x7a, 0xfc, 0x30, 0x60, 0x9f, 0x52,
0x32, 0x85, 0xfb, 0x9d, 0x6f, 0xa6, 0x6c, 0xef, 0x23, 0xf2, 0x54, 0xf6, 0xd2, 0x4c, 0xb0, 0xb2,
0x7d, 0x1f, 0x91, 0x6f, 0x57, 0x51, 0x23, 0xfa, 0x3e, 0xa2, 0x00, 0xee, 0xdc, 0x47, 0x84, 0x78,
0x46, 0xef, 0x23, 0x42, 0xad, 0x05, 0xef, 0x23, 0x0a, 0x6b, 0x50, 0xe1, 0xbd, 0x29, 0x82, 0xda,
0xb7, 0xee, 0x65, 0xd1, 0xdf, 0xc6, 0x7e, 0x7a, 0x1b, 0x15, 0x62, 0x82, 0x53, 0x9c, 0x3c, 0x35,
0xd8, 0xe3, 0x99, 0x7a, 0x27, 0x07, 0xb7, 0x7a, 0xf3, 0xda, 0xf7, 0x8f, 0xf5, 0xea, 0xc6, 0x84,
0x73, 0x5e, 0xca, 0xbb, 0xa8, 0xd6, 0x43, 0xe1, 0xb9, 0xb6, 0xe0, 0xb6, 0xfc, 0x46, 0x3f, 0x98,
0xa8, 0x6e, 0x4d, 0xe8, 0x46, 0x1f, 0x75, 0x19, 0x02, 0x4d, 0xbe, 0xd5, 0x9b, 0x27, 0xa6, 0x11,
0xe5, 0x5b, 0xb5, 0x76, 0x0f, 0x63, 0x7e, 0x5b, 0x3f, 0xe9, 0xaf, 0xa0, 0xdd, 0x2f, 0x74, 0xda,
0xe8, 0xba, 0x97, 0xed, 0xbc, 0xd9, 0x65, 0x6a, 0xec, 0x35, 0xf3, 0xa8, 0x2f, 0x1e, 0x4a, 0x20,
0xdc, 0x29, 0xb4, 0x2b, 0x81, 0x40, 0xa7, 0xd1, 0x8f, 0x6f, 0xa7, 0xa4, 0xcb, 0xf2, 0x8f, 0x83,
0xe8, 0x2e, 0x59, 0x16, 0xdd, 0x0f, 0x3e, 0xed, 0x6b, 0x19, 0xf4, 0x87, 0xcf, 0x6e, 0xad, 0xa7,
0x0b, 0xf5, 0x2f, 0x83, 0xe8, 0x5e, 0xa0, 0x50, 0xaa, 0x83, 0xdc, 0xc2, 0xba, 0xdf, 0x51, 0x3e,
0xbf, 0xbd, 0x22, 0x35, 0xdd, 0xbb, 0xf8, 0xb8, 0x7d, 0x51, 0x4f, 0xc0, 0xf6, 0x98, 0xbe, 0xa8,
0xa7, 0x5b, 0x0b, 0x6e, 0xf2, 0xc4, 0x17, 0xcd, 0xa2, 0x0b, 0xdd, 0xe4, 0x91, 0xe7, 0xfd, 0xc0,
0x9a, 0x63, 0xb5, 0x93, 0xc3, 0x9c, 0xbc, 0x78, 0x53, 0xc4, 0x79, 0x42, 0x3b, 0x51, 0xf2, 0x6e,
0x27, 0x86, 0x83, 0x9b, 0x63, 0xb5, 0xf4, 0x94, 0x37, 0x0b, 0xa9, 0x47, 0x94, 0xbe, 0x41, 0x82,
0x9b, 0x63, 0x2d, 0x94, 0xf0, 0xa6, 0xb3, 0xc6, 0x90, 0x37, 0x90, 0x2c, 0x3e, 0xee, 0x83, 0x82,
0x14, 0xdd, 0x78, 0x33, 0x7b, 0xee, 0x1b, 0x21, 0x2b, 0xad, 0x7d, 0xf7, 0xcd, 0x9e, 0x34, 0xe1,
0x76, 0xcc, 0xc4, 0x17, 0x2c, 0x4e, 0x58, 0x19, 0x74, 0x6b, 0xa8, 0x5e, 0x6e, 0x5d, 0x1a, 0x73,
0xbb, 0xc3, 0xb3, 0xf9, 0x2c, 0xd7, 0x8d, 0x49, 0xba, 0x75, 0xa9, 0x6e, 0xb7, 0x80, 0x86, 0xdb,
0x82, 0xd6, 0xad, 0x4c, 0x2f, 0x1f, 0x87, 0xcd, 0x78, 0x59, 0xe5, 0x7a, 0x2f, 0x96, 0xae, 0xa7,
0xee, 0x46, 0x1d, 0xf5, 0x04, 0x3d, 0x69, 0xb3, 0x27, 0x0d, 0xf7, 0xe7, 0x1c, 0xb7, 0xa6, 0x3f,
0x6d, 0x75, 0xd8, 0x6a, 0x75, 0xa9, 0x27, 0xfd, 0x15, 0xe0, 0x6e, 0xa8, 0xee, 0x55, 0x87, 0x69,
0x25, 0xf6, 0xd2, 0x2c, 0x1b, 0xae, 0x07, 0xba, 0x49, 0x03, 0x05, 0x77, 0x43, 0x11, 0x98, 0xe8,
0xc9, 0xcd, 0xee, 0x61, 0x3e, 0xec, 0xb2, 0x23, 0xa9, 0x5e, 0x3d, 0xd9, 0xa5, 0xc1, 0x8e, 0x96,
0xf3, 0xa8, 0x4d, 0x6d, 0x47, 0xe1, 0x07, 0xd7, 0xaa, 0xf0, 0x56, 0x6f, 0x1e, 0xbc, 0x6e, 0x97,
0x94, 0x9c, 0x59, 0x1e, 0x50, 0x26, 0xbc, 0x99, 0xe4, 0x61, 0x07, 0x05, 0x76, 0x05, 0xd5, 0x30,
0x7a, 0x9d, 0x26, 0x53, 0x26, 0xd0, 0x37, 0x45, 0x2e, 0x10, 0x7c, 0x53, 0x04, 0x40, 0xd0, 0x74,
0xea, 0x77, 0xb3, 0x1d, 0x7a, 0x90, 0x60, 0x4d, 0xa7, 0x95, 0x1d, 0x2a, 0xd4, 0x74, 0x28, 0x0d,
0xa2, 0x81, 0x71, 0xab, 0x2f, 0x1a, 0x78, 0x1c, 0x32, 0x03, 0x6e, 0x1b, 0x58, 0xef, 0xc5, 0x82,
0x19, 0xc5, 0x3a, 0x4c, 0x67, 0xa9, 0xc0, 0x66, 0x14, 0xc7, 0x46, 0x8d, 0x84, 0x66, 0x94, 0x36,
0x4a, 0x55, 0xaf, 0xce, 0x11, 0x0e, 0x92, 0x70, 0xf5, 0x14, 0xd3, 0xaf, 0x7a, 0x86, 0x6d, 0xbd,
0xd8, 0xcc, 0x4d, 0x97, 0x11, 0x57, 0x7a, 0xb1, 0x8c, 0xf4, 0x6d, 0xf9, 0x01, 0x2a, 0x04, 0x43,
0x51, 0x87, 0x52, 0x80, 0x1b, 0xf6, 0x35, 0xd7, 0xbc, 0x7b, 0x2d, 0x0a, 0x16, 0x97, 0x71, 0x3e,
0x41, 0x17, 0xa7, 0xd2, 0x60, 0x8b, 0x0c, 0x2d, 0x4e, 0x49, 0x0d, 0xf0, 0xda, 0xdc, 0xff, 0x74,
0x14, 0x19, 0x0a, 0xe6, 0x1b, 0x4d, 0xff, 0xcb, 0xd1, 0x47, 0x3d, 0x48, 0xf8, 0xda, 0xbc, 0x01,
0xcc, 0xc6, 0xb7, 0x72, 0xfa, 0x51, 0xc0, 0x94, 0x8f, 0x86, 0x16, 0xc2, 0xb4, 0x0a, 0xe8, 0xd4,
0x26, 0xc1, 0x65, 0xe2, 0x47, 0x6c, 0x89, 0x75, 0x6a, 0x9b, 0x9f, 0x4a, 0x24, 0xd4, 0xa9, 0xdb,
0x28, 0xc8, 0x33, 0xdd, 0x75, 0xd0, 0x4a, 0x40, 0xdf, 0x5d, 0xfa, 0xac, 0x76, 0x72, 0x60, 0xe4,
0xec, 0xa6, 0x0b, 0xef, 0x3d, 0x01, 0x52, 0xd0, 0xdd, 0x74, 0x81, 0xbf, 0x26, 0x58, 0xef, 0xc5,
0xc2, 0x57, 0xf2, 0xb1, 0x60, 0x6f, 0x9a, 0x77, 0xe5, 0x48, 0x71, 0xa5, 0xbc, 0xf5, 0xb2, 0x7c,
0xad, 0x1b, 0xb4, 0x07, 0x60, 0x4f, 0x4a, 0x3e, 0x61, 0x55, 0xa5, 0x6f, 0x2f, 0xf4, 0x4f, 0x18,
0x69, 0xd9, 0x08, 0xdc, 0x5d, 0xf8, 0x20, 0x0c, 0xd9, 0x96, 0xd1, 0x22, 0x7b, 0x9f, 0xcf, 0x0a,
0xaa, 0xd9, 0xbe, 0xca, 0x67, 0xb5, 0x93, 0xb3, 0xc3, 0x4b, 0x4b, 0xdd, 0x0b, 0x7c, 0xd6, 0x50,
0x75, 0xec, 0xee, 0x9e, 0x47, 0x3d, 0x48, 0xed, 0xea, 0x8b, 0xe8, 0xad, 0x43, 0x3e, 0x1d, 0xb3,
0x3c, 0x19, 0x7e, 0xdf, 0x3f, 0x42, 0xcb, 0xa7, 0xa3, 0xfa, 0x67, 0x63, 0xf4, 0x0e, 0x25, 0xb6,
0x87, 0x00, 0x77, 0xd9, 0xc5, 0x7c, 0x3a, 0x16, 0xb1, 0x00, 0x87, 0x00, 0xe5, 0xef, 0xa3, 0x5a,
0x40, 0x1c, 0x02, 0xf4, 0x00, 0x60, 0xef, 0xac, 0x64, 0x0c, 0xb5, 0x57, 0x0b, 0x82, 0xf6, 0x34,
0x60, 0xb3, 0x08, 0x63, 0xaf, 0x4e, 0xd4, 0xe1, 0xa1, 0x3d, 0xab, 0x23, 0xa5, 0x44, 0x16, 0xd1,
0xa6, 0x6c, 0xe7, 0x56, 0xd5, 0x97, 0xf7, 0xa9, 0xcc, 0x67, 0xb3, 0xb8, 0x5c, 0x82, 0xce, 0xad,
0x6b, 0xe9, 0x00, 0x44, 0xe7, 0x46, 0x41, 0x3b, 0x6a, 0x9b, 0xc7, 0x3c, 0xb9, 0xde, 0xe7, 0x25,
0x9f, 0x8b, 0x34, 0x67, 0xf0, 0x4e, 0x0d, 0xf3, 0x40, 0x5d, 0x86, 0x18, 0xb5, 0x14, 0x6b, 0xb3,
0x5c, 0x49, 0xa8, 0xf3, 0x84, 0xf2, 0x4e, 0xe3, 0x4a, 0xf0, 0x12, 0xbe, 0x4f, 0x54, 0x56, 0x20,
0x44, 0x64, 0xb9, 0x24, 0x0c, 0xda, 0xfe, 0x24, 0xcd, 0xa7, 0x68, 0xdb, 0x9f, 0xb8, 0x37, 0x82,
0xde, 0xa3, 0x01, 0x3b, 0xa0, 0xd4, 0x43, 0x53, 0x03, 0x40, 0x7f, 0x19, 0x8b, 0x3e, 0x74, 0x97,
0x20, 0x06, 0x14, 0x4e, 0x02, 0x57, 0x2f, 0x0b, 0x96, 0xb3, 0xa4, 0x39, 0x35, 0x87, 0xb9, 0xf2,
0x88, 0xa0, 0x2b, 0x48, 0xda, 0x58, 0x24, 0xe5, 0xa7, 0xf3, 0xfc, 0xa4, 0xe4, 0x97, 0x69, 0xc6,
0x4a, 0x10, 0x8b, 0x94, 0xba, 0x23, 0x27, 0x62, 0x11, 0xc6, 0xd9, 0xe3, 0x17, 0x52, 0xea, 0x5d,
0xcc, 0x7d, 0x56, 0xc6, 0x13, 0x78, 0xfc, 0x42, 0xd9, 0x68, 0x63, 0xc4, 0xce, 0x60, 0x00, 0x77,
0x12, 0x1d, 0xe5, 0x3a, 0x5f, 0xca, 0xfe, 0xa1, 0xbf, 0xcc, 0x94, 0xf7, 0x64, 0x56, 0x20, 0xd1,
0xd1, 0xe6, 0x30, 0x92, 0x48, 0x74, 0xc2, 0x1a, 0x76, 0x2a, 0x91, 0xdc, 0xb1, 0x3e, 0x56, 0x04,
0xa6, 0x12, 0x65, 0xa3, 0x11, 0x12, 0x53, 0x49, 0x0b, 0x02, 0x01, 0xa9, 0x19, 0x06, 0x53, 0x34,
0x20, 0x19, 0x69, 0x30, 0x20, 0xb9, 0x94, 0x0d, 0x14, 0x07, 0x79, 0x2a, 0xd2, 0x38, 0x1b, 0x33,
0x71, 0x12, 0x97, 0xf1, 0x8c, 0x09, 0x56, 0xc2, 0x40, 0xa1, 0x91, 0x91, 0xc7, 0x10, 0x81, 0x82,
0x62, 0xb5, 0xc3, 0xdf, 0x8d, 0xde, 0xa9, 0xe7, 0x7d, 0x96, 0xeb, 0x3f, 0xc1, 0xf1, 0x42, 0xfe,
0xed, 0x9e, 0xe1, 0xbb, 0xc6, 0xc6, 0x58, 0x94, 0x2c, 0x9e, 0x35, 0xb6, 0xdf, 0x36, 0xbf, 0x4b,
0xf0, 0xc9, 0xa0, 0xee, 0xcf, 0xc7, 0x5c, 0xa4, 0x97, 0xf5, 0x32, 0x5b, 0x7f, 0x41, 0x04, 0xfa,
0xb3, 0x2b, 0x1e, 0x05, 0x6e, 0xd9, 0xc0, 0x38, 0x1b, 0xa7, 0x5d, 0xe9, 0x29, 0x2b, 0x32, 0x18,
0xa7, 0x3d, 0x6d, 0x09, 0x10, 0x71, 0x1a, 0x05, 0xed, 0xe0, 0x74, 0xc5, 0x67, 0x2c, 0x5c, 0x99,
0x33, 0xd6, 0xaf, 0x32, 0x67, 0xde, 0x47, 0x19, 0x59, 0xf4, 0xce, 0x11, 0x9b, 0x5d, 0xb0, 0xb2,
0xba, 0x4a, 0x8b, 0xfd, 0x3a, 0xe1, 0x8a, 0xc5, 0x1c, 0x7e, 0xb6, 0x68, 0x89, 0x91, 0x41, 0x88,
0xac, 0x94, 0x40, 0xed, 0x4c, 0x60, 0x81, 0x83, 0xea, 0x38, 0x9e, 0x31, 0x79, 0x67, 0x08, 0x98,
0x09, 0x1c, 0x23, 0x0e, 0x44, 0xcc, 0x04, 0x24, 0xec, 0x7c, 0xdf, 0x65, 0x99, 0x53, 0x36, 0xad,
0x7b, 0x58, 0x79, 0x12, 0x2f, 0x67, 0x2c, 0x17, 0xda, 0x24, 0xd8, 0x93, 0x77, 0x4c, 0xe2, 0x3c,
0xb1, 0x27, 0xdf, 0x47, 0xcf, 0x09, 0x4d, 0xde, 0x83, 0x3f, 0xe1, 0xa5, 0x50, 0x7f, 0x60, 0xe7,
0xbc, 0xcc, 0x40, 0x68, 0xf2, 0x1f, 0xaa, 0x47, 0x12, 0xa1, 0x29, 0xac, 0xe1, 0xdc, 0x4c, 0xef,
0x95, 0xe1, 0x15, 0x2b, 0x4d, 0x3f, 0x79, 0x31, 0x8b, 0xd3, 0x4c, 0xf7, 0x86, 0x1f, 0x04, 0x6c,
0x13, 0x3a, 0xc4, 0xcd, 0xf4, 0x7d, 0x75, 0x9d, 0xbb, 0xfc, 0xc3, 0x25, 0x04, 0xaf, 0x08, 0x3a,
0xec, 0x13, 0xaf, 0x08, 0xba, 0xb5, 0xec, 0xca, 0xdd, 0xb2, 0x92, 0x5b, 0x4a, 0x62, 0x87, 0x27,
0x70, 0xbf, 0xd0, 0xb1, 0x09, 0x40, 0x62, 0xe5, 0x1e, 0x54, 0xb0, 0xa9, 0x81, 0xc5, 0xf6, 0xd2,
0x3c, 0xce, 0xd2, 0x9f, 0xc0, 0xb4, 0xde, 0xb1, 0xd3, 0x10, 0x44, 0x6a, 0x80, 0x93, 0x98, 0xab,
0x7d, 0x26, 0xce, 0xd2, 0x3a, 0xf4, 0xaf, 0x05, 0x9e, 0x9b, 0x24, 0xba, 0x5d, 0x39, 0xa4, 0x73,
0xfb, 0x2c, 0x7c, 0xac, 0xdb, 0x45, 0x31, 0xae, 0x67, 0xd5, 0x53, 0x36, 0x61, 0x69, 0x21, 0x86,
0x9f, 0x84, 0x9f, 0x15, 0xc0, 0x89, 0x83, 0x16, 0x3d, 0xd4, 0x9c, 0xd7, 0xf7, 0x75, 0x2c, 0x19,
0xab, 0xbf, 0x3c, 0x77, 0x5e, 0xb1, 0x52, 0x27, 0x1a, 0xfb, 0x4c, 0x80, 0xd1, 0xe9, 0x70, 0x23,
0x07, 0xac, 0x2b, 0x4a, 0x8c, 0xce, 0xb0, 0x86, 0xdd, 0xec, 0x73, 0xb8, 0x53, 0x56, 0xf1, 0x6c,
0xc1, 0xe4, 0x79, 0xc3, 0x0d, 0xd2, 0x98, 0x43, 0x11, 0x9b, 0x7d, 0x34, 0x6d, 0xb3, 0xb5, 0xb6,
0xdb, 0xed, 0x7c, 0x79, 0x00, 0x8f, 0x4c, 0x20, 0x96, 0x24, 0x46, 0x64, 0x6b, 0x01, 0xdc, 0xd9,
0x0c, 0x2f, 0x79, 0x9c, 0x4c, 0xe2, 0x4a, 0x9c, 0xc4, 0xcb, 0x8c, 0xc7, 0x89, 0x9c, 0xd7, 0xe1,
0x66, 0x78, 0xc3, 0x8c, 0x5c, 0x88, 0xda, 0x0c, 0xa7, 0x60, 0x37, 0x3b, 0x93, 0x7f, 0x50, 0x4f,
0x9f, 0xe5, 0x84, 0xd9, 0x99, 0x2c, 0x2f, 0x3c, 0xc7, 0xf9, 0x20, 0x0c, 0xd9, 0x6f, 0xd0, 0x94,
0x48, 0xa6, 0x21, 0xf7, 0x30, 0x1d, 0x2f, 0x01, 0xf9, 0x20, 0x40, 0xd8, 0x5b, 0x3e, 0xd4, 0xef,
0xcd, 0xdf, 0x84, 0x11, 0xfa, 0x8e, 0xee, 0x0d, 0x4c, 0xd7, 0x85, 0x46, 0xee, 0x65, 0x11, 0x9b,
0x3d, 0x69, 0x9b, 0x66, 0xee, 0x5c, 0xc5, 0x62, 0x3b, 0x49, 0x8e, 0x58, 0x85, 0x7c, 0x50, 0x5e,
0x0b, 0x47, 0x56, 0x4a, 0xa4, 0x99, 0x6d, 0xca, 0x76, 0xf4, 0x5a, 0xf6, 0x22, 0x49, 0x85, 0x96,
0x35, 0x27, 0xa4, 0x37, 0xda, 0x06, 0xda, 0x14, 0x51, 0x2b, 0x9a, 0xb6, 0xb1, 0xbc, 0x66, 0xce,
0xf8, 0x74, 0x9a, 0x31, 0x0d, 0x9d, 0xb2, 0x58, 0x5d, 0x51, 0xb8, 0xd5, 0xb6, 0x85, 0x82, 0x44,
0x2c, 0x0f, 0x2a, 0xd8, 0x34, 0xb2, 0xc6, 0xd4, 0x2b, 0xa9, 0xe6, 0xc1, 0xae, 0xb6, 0xcd, 0x78,
0x00, 0x91, 0x46, 0xa2, 0xa0, 0xfd, 0xee, 0xad, 0x16, 0xef, 0xb3, 0xe6, 0x49, 0xc0, 0x0b, 0x9d,
0xa4, 0xb2, 0x23, 0x26, 0xbe, 0x7b, 0x43, 0x30, 0xbb, 0x4e, 0x00, 0x1e, 0x9e, 0x2f, 0x0f, 0x12,
0xb8, 0x4e, 0x80, 0xfa, 0x92, 0x21, 0xd6, 0x09, 0x14, 0xeb, 0x37, 0x9d, 0xd9, 0xf7, 0x3a, 0x8c,
0x2b, 0x5b, 0x39, 0xa4, 0xe9, 0x50, 0x30, 0xd4, 0x74, 0x94, 0x82, 0xff, 0x48, 0xdd, 0xad, 0x35,
0xe4, 0x91, 0x62, 0xfb, 0x6a, 0x2b, 0x5d, 0x98, 0x8d, 0x4b, 0x66, 0x3d, 0x29, 0x8f, 0x2c, 0xe1,
0x7f, 0x9b, 0x40, 0x09, 0x89, 0xb8, 0xd4, 0x82, 0x94, 0xed, 0xe7, 0x1f, 0xfc, 0xd7, 0x57, 0x77,
0x06, 0x3f, 0xff, 0xea, 0xce, 0xe0, 0x7f, 0xbe, 0xba, 0x33, 0xf8, 0xd9, 0xd7, 0x77, 0xbe, 0xf5,
0xf3, 0xaf, 0xef, 0x7c, 0xeb, 0xbf, 0xbf, 0xbe, 0xf3, 0xad, 0x2f, 0xdf, 0xd2, 0x7f, 0x68, 0xf5,
0xe2, 0x17, 0xe4, 0x9f, 0x4b, 0x7d, 0xf6, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xab, 0xf4, 0x52,
0x6c, 0x8c, 0x75, 0x00, 0x00,
// 5307 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9d, 0xdd, 0x6f, 0x1d, 0x49,
0x56, 0xc0, 0xf7, 0xbe, 0x30, 0xd0, 0xcb, 0x0e, 0x70, 0x07, 0x86, 0xd9, 0x61, 0x37, 0xc9, 0x64,
0x92, 0x38, 0x89, 0xed, 0xeb, 0x4c, 0x32, 0x5f, 0xec, 0x22, 0x81, 0x63, 0xc7, 0x1e, 0xb3, 0xb6,
0x63, 0x7c, 0xaf, 0x13, 0x69, 0x24, 0x24, 0xda, 0xb7, 0xcb, 0xd7, 0x8d, 0xfb, 0x76, 0xf5, 0x76,
0xd7, 0xbd, 0xce, 0x5d, 0x04, 0x02, 0x81, 0x40, 0x20, 0x10, 0x2b, 0xbe, 0xc4, 0x1b, 0x12, 0x7f,
0x01, 0x7f, 0x06, 0x8f, 0xfb, 0xc8, 0x23, 0x9a, 0x79, 0xe3, 0x9d, 0x77, 0xd4, 0x55, 0xd5, 0xf5,
0x71, 0xfa, 0x9c, 0xea, 0xf6, 0xf0, 0x94, 0xe8, 0x9e, 0xdf, 0x39, 0xa7, 0x3e, 0x4f, 0x9d, 0xaa,
0xae, 0x6e, 0x47, 0xb7, 0x8b, 0xf3, 0xad, 0xa2, 0xe4, 0x82, 0x57, 0x5b, 0x15, 0x2b, 0x97, 0xe9,
0x94, 0x35, 0xff, 0x8e, 0xe4, 0xcf, 0xc3, 0xb7, 0xe2, 0x7c, 0x25, 0x56, 0x05, 0x7b, 0xff, 0x3d,
0x4b, 0x4e, 0xf9, 0x7c, 0x1e, 0xe7, 0x49, 0xa5, 0x90, 0xf7, 0xdf, 0xb5, 0x12, 0xb6, 0x64, 0xb9,
0xd0, 0xbf, 0x3f, 0xfd, 0xdf, 0xff, 0x19, 0x44, 0x6f, 0xef, 0x64, 0x29, 0xcb, 0xc5, 0x8e, 0xd6,
0x18, 0x7e, 0x19, 0x7d, 0x67, 0xbb, 0x28, 0xf6, 0x99, 0x78, 0xc5, 0xca, 0x2a, 0xe5, 0xf9, 0xf0,
0xc3, 0x91, 0x76, 0x30, 0x3a, 0x2d, 0xa6, 0xa3, 0xed, 0xa2, 0x18, 0x59, 0xe1, 0xe8, 0x94, 0xfd,
0x78, 0xc1, 0x2a, 0xf1, 0xfe, 0xbd, 0x30, 0x54, 0x15, 0x3c, 0xaf, 0xd8, 0xf0, 0x22, 0xfa, 0x95,
0xed, 0xa2, 0x18, 0x33, 0xb1, 0xcb, 0xea, 0x0a, 0x8c, 0x45, 0x2c, 0xd8, 0x70, 0xad, 0xa5, 0xea,
0x03, 0xc6, 0xc7, 0xc3, 0x6e, 0x50, 0xfb, 0x99, 0x44, 0xdf, 0xae, 0xfd, 0x5c, 0x2e, 0x44, 0xc2,
0xaf, 0xf3, 0xe1, 0x07, 0x6d, 0x45, 0x2d, 0x32, 0xb6, 0xef, 0x86, 0x10, 0x6d, 0xf5, 0x75, 0xf4,
0x8b, 0xaf, 0xe3, 0x2c, 0x63, 0x62, 0xa7, 0x64, 0x75, 0xc1, 0x7d, 0x1d, 0x25, 0x1a, 0x29, 0x99,
0xb1, 0xfb, 0x61, 0x90, 0xd1, 0x86, 0xbf, 0x8c, 0xbe, 0xa3, 0x24, 0xa7, 0x6c, 0xca, 0x97, 0xac,
0x1c, 0xa2, 0x5a, 0x5a, 0x48, 0x34, 0x79, 0x0b, 0x82, 0xb6, 0x77, 0x78, 0xbe, 0x64, 0xa5, 0xc0,
0x6d, 0x6b, 0x61, 0xd8, 0xb6, 0x85, 0xb4, 0xed, 0xbf, 0x1e, 0x44, 0xdf, 0xdb, 0x9e, 0x4e, 0xf9,
0x22, 0x17, 0x87, 0x7c, 0x1a, 0x67, 0x87, 0x69, 0x7e, 0x75, 0xcc, 0xae, 0x77, 0x2e, 0x6b, 0x3e,
0x9f, 0xb1, 0xe1, 0x33, 0xbf, 0x55, 0x15, 0x3a, 0x32, 0xec, 0xc8, 0x85, 0x8d, 0xef, 0x8f, 0x6f,
0xa6, 0xa4, 0xcb, 0xf2, 0xf7, 0x83, 0xe8, 0x16, 0x2c, 0xcb, 0x98, 0x67, 0x4b, 0x66, 0x4b, 0xf3,
0x49, 0x87, 0x61, 0x1f, 0x37, 0xe5, 0xf9, 0xf4, 0xa6, 0x6a, 0xba, 0x44, 0x59, 0xf4, 0x8e, 0x3b,
0x5c, 0xc6, 0xac, 0x92, 0xd3, 0xe9, 0x11, 0x3d, 0x22, 0x34, 0x62, 0x3c, 0x3f, 0xee, 0x83, 0x6a,
0x6f, 0x69, 0x34, 0xd4, 0xde, 0x32, 0x5e, 0x19, 0x67, 0x0f, 0x51, 0x0b, 0x0e, 0x61, 0x7c, 0x3d,
0xea, 0x41, 0x6a, 0x57, 0x7f, 0x10, 0xfd, 0xd2, 0x6b, 0x5e, 0x5e, 0x55, 0x45, 0x3c, 0x65, 0x7a,
0x2a, 0xdc, 0xf7, 0xb5, 0x1b, 0x29, 0x9c, 0x0d, 0x0f, 0xba, 0x30, 0x67, 0xd0, 0x36, 0xc2, 0x97,
0x05, 0x83, 0x31, 0xc8, 0x2a, 0xd6, 0x42, 0x6a, 0xd0, 0x42, 0x48, 0xdb, 0xbe, 0x8a, 0x86, 0xd6,
0xf6, 0xf9, 0x1f, 0xb2, 0xa9, 0xd8, 0x4e, 0x12, 0xd8, 0x2b, 0x56, 0x57, 0x12, 0xa3, 0xed, 0x24,
0xa1, 0x7a, 0x05, 0x47, 0xb5, 0xb3, 0xeb, 0xe8, 0x5d, 0xe0, 0xec, 0x30, 0xad, 0xa4, 0xc3, 0xcd,
0xb0, 0x15, 0x8d, 0x19, 0xa7, 0xa3, 0xbe, 0xb8, 0x76, 0xfc, 0xa7, 0x83, 0xe8, 0xbb, 0x88, 0xe7,
0x53, 0x36, 0xe7, 0x4b, 0x36, 0x7c, 0xd2, 0x6d, 0x4d, 0x91, 0xc6, 0xff, 0x47, 0x37, 0xd0, 0x40,
0x86, 0xc9, 0x98, 0x65, 0x6c, 0x2a, 0xc8, 0x61, 0xa2, 0xc4, 0x9d, 0xc3, 0xc4, 0x60, 0xce, 0x0c,
0x6b, 0x84, 0xfb, 0x4c, 0xec, 0x2c, 0xca, 0x92, 0xe5, 0x82, 0xec, 0x4b, 0x8b, 0x74, 0xf6, 0xa5,
0x87, 0x22, 0xf5, 0xd9, 0x67, 0x62, 0x3b, 0xcb, 0xc8, 0xfa, 0x28, 0x71, 0x67, 0x7d, 0x0c, 0xa6,
0x3d, 0x4c, 0xa3, 0x5f, 0x76, 0x5a, 0x4c, 0x1c, 0xe4, 0x17, 0x7c, 0x48, 0xb7, 0x85, 0x94, 0x1b,
0x1f, 0x6b, 0x9d, 0x1c, 0x52, 0x8d, 0x17, 0x6f, 0x0a, 0x5e, 0xd2, 0xdd, 0xa2, 0xc4, 0x9d, 0xd5,
0x30, 0x98, 0xf6, 0xf0, 0xfb, 0xd1, 0xdb, 0x3a, 0x4a, 0x36, 0xeb, 0xd9, 0x3d, 0x34, 0x84, 0xc2,
0x05, 0xed, 0x7e, 0x07, 0x65, 0x83, 0x83, 0x96, 0xe9, 0xe0, 0xf3, 0x21, 0xaa, 0x07, 0x42, 0xcf,
0xbd, 0x30, 0xd4, 0xb2, 0xbd, 0xcb, 0x32, 0x46, 0xda, 0x56, 0xc2, 0x0e, 0xdb, 0x06, 0xd2, 0xb6,
0xcb, 0xe8, 0xd7, 0x4c, 0xb3, 0xd4, 0xeb, 0xa8, 0x94, 0xd7, 0x41, 0x7a, 0x9d, 0xa8, 0xb7, 0x0b,
0x19, 0x5f, 0x1b, 0xfd, 0xe0, 0x56, 0x7d, 0xf4, 0x0c, 0xc4, 0xeb, 0x03, 0xe6, 0xdf, 0xbd, 0x30,
0xa4, 0x6d, 0xff, 0xcd, 0x20, 0xfa, 0xbe, 0x96, 0xbd, 0xc8, 0xe3, 0xf3, 0x8c, 0xc9, 0x25, 0xf1,
0x98, 0x89, 0x6b, 0x5e, 0x5e, 0x8d, 0x57, 0xf9, 0x94, 0x58, 0xfe, 0x71, 0xb8, 0x63, 0xf9, 0x27,
0x95, 0x9c, 0x8c, 0x4f, 0x57, 0x54, 0xf0, 0x02, 0x66, 0x7c, 0x4d, 0x0d, 0x04, 0x2f, 0xa8, 0x8c,
0xcf, 0x47, 0x5a, 0x56, 0x8f, 0xea, 0xb0, 0x89, 0x5b, 0x3d, 0x72, 0xe3, 0xe4, 0xdd, 0x10, 0x62,
0xc3, 0x56, 0x33, 0x80, 0x79, 0x7e, 0x91, 0xce, 0xce, 0x8a, 0xa4, 0x1e, 0xc6, 0x8f, 0xf0, 0x11,
0xea, 0x20, 0x44, 0xd8, 0x22, 0x50, 0xed, 0xed, 0xef, 0x6c, 0x62, 0xa4, 0xa7, 0xd2, 0x5e, 0xc9,
0xe7, 0x87, 0x6c, 0x16, 0x4f, 0x57, 0x7a, 0xfe, 0x7f, 0x1c, 0x9a, 0x78, 0x90, 0x36, 0x85, 0xf8,
0xe4, 0x86, 0x5a, 0xba, 0x3c, 0xff, 0x36, 0x88, 0xee, 0x35, 0xd5, 0xbf, 0x8c, 0xf3, 0x19, 0xd3,
0xfd, 0xa9, 0x4a, 0xbf, 0x9d, 0x27, 0xa7, 0xac, 0x12, 0x71, 0x29, 0x86, 0x3f, 0xc0, 0x2b, 0x19,
0xd2, 0x31, 0x65, 0xfb, 0xe1, 0x37, 0xd2, 0xb5, 0xbd, 0x3e, 0xae, 0x03, 0x9b, 0x0e, 0x01, 0x7e,
0xaf, 0x4b, 0x09, 0x0c, 0x00, 0x77, 0x43, 0x88, 0xed, 0x75, 0x29, 0x38, 0xc8, 0x97, 0xa9, 0x60,
0xfb, 0x2c, 0x67, 0x65, 0xbb, 0xd7, 0x95, 0xaa, 0x8f, 0x10, 0xbd, 0x4e, 0xa0, 0x36, 0xd8, 0x78,
0xde, 0xcc, 0xe2, 0xb8, 0x1e, 0x30, 0xd2, 0x5a, 0x1e, 0x37, 0xfa, 0xc1, 0x76, 0x77, 0xe7, 0xf8,
0x3c, 0x65, 0x4b, 0x7e, 0x05, 0x77, 0x77, 0xae, 0x09, 0x05, 0x10, 0xbb, 0x3b, 0x14, 0xb4, 0x2b,
0x98, 0xe3, 0xe7, 0x55, 0xca, 0xae, 0xc1, 0x0a, 0xe6, 0x2a, 0xd7, 0x62, 0x62, 0x05, 0x43, 0x30,
0xed, 0xe1, 0x38, 0xfa, 0x05, 0x29, 0xfc, 0x5d, 0x9e, 0xe6, 0xc3, 0xdb, 0x88, 0x52, 0x2d, 0x30,
0x56, 0xef, 0xd0, 0x00, 0x28, 0x71, 0xfd, 0xeb, 0x4e, 0x9c, 0x4f, 0x59, 0x86, 0x96, 0xd8, 0x8a,
0x83, 0x25, 0xf6, 0x30, 0x9b, 0x3a, 0x48, 0x61, 0x1d, 0xbf, 0xc6, 0x97, 0x71, 0x99, 0xe6, 0xb3,
0x21, 0xa6, 0xeb, 0xc8, 0x89, 0xd4, 0x01, 0xe3, 0xc0, 0x10, 0xd6, 0x8a, 0xdb, 0x45, 0x51, 0xd6,
0x61, 0x11, 0x1b, 0xc2, 0x3e, 0x12, 0x1c, 0xc2, 0x2d, 0x14, 0xf7, 0xb6, 0xcb, 0xa6, 0x59, 0x9a,
0x07, 0xbd, 0x69, 0xa4, 0x8f, 0x37, 0x8b, 0x82, 0xc1, 0x7b, 0xc8, 0xe2, 0x25, 0x6b, 0x6a, 0x86,
0xb5, 0x8c, 0x0b, 0x04, 0x07, 0x2f, 0x00, 0xed, 0x3e, 0x4d, 0x8a, 0x8f, 0xe2, 0x2b, 0x56, 0x37,
0x30, 0xab, 0xd7, 0xb5, 0x21, 0xa6, 0xef, 0x11, 0xc4, 0x3e, 0x0d, 0x27, 0xb5, 0xab, 0x45, 0xf4,
0xae, 0x94, 0x9f, 0xc4, 0xa5, 0x48, 0xa7, 0x69, 0x11, 0xe7, 0x4d, 0xfe, 0x8f, 0xcd, 0xeb, 0x16,
0x65, 0x5c, 0x6e, 0xf6, 0xa4, 0xb5, 0xdb, 0x7f, 0x19, 0x44, 0x1f, 0x40, 0xbf, 0x27, 0xac, 0x9c,
0xa7, 0x72, 0x1b, 0x59, 0xa9, 0x20, 0x3c, 0xfc, 0x2c, 0x6c, 0xb4, 0xa5, 0x60, 0x4a, 0xf3, 0xf9,
0xcd, 0x15, 0x75, 0xc1, 0x7e, 0x2f, 0x8a, 0xd4, 0x76, 0x45, 0x6e, 0x29, 0xfd, 0x59, 0xab, 0xf7,
0x31, 0xde, 0x7e, 0xf2, 0x83, 0x00, 0x61, 0x97, 0x0a, 0xf5, 0xbb, 0xdc, 0x29, 0x0f, 0x51, 0x0d,
0x29, 0x22, 0x96, 0x0a, 0x80, 0xc0, 0x82, 0x8e, 0x2f, 0xf9, 0x35, 0x5e, 0xd0, 0x5a, 0x12, 0x2e,
0xa8, 0x26, 0xec, 0xd9, 0x95, 0x2e, 0x28, 0x76, 0x76, 0xd5, 0x14, 0x23, 0x74, 0x76, 0x05, 0x19,
0x6d, 0x98, 0x47, 0xbf, 0xea, 0x1a, 0x7e, 0xce, 0xf9, 0xd5, 0x3c, 0x2e, 0xaf, 0x86, 0x8f, 0x69,
0xe5, 0x86, 0x31, 0x8e, 0xd6, 0x7b, 0xb1, 0x36, 0x2c, 0xb8, 0x0e, 0xeb, 0x44, 0xe3, 0xac, 0xcc,
0x40, 0x58, 0xf0, 0x6c, 0x68, 0x84, 0x08, 0x0b, 0x04, 0x6a, 0x23, 0xb7, 0xeb, 0x6d, 0xcc, 0xe0,
0x6e, 0xc9, 0x53, 0x1f, 0x33, 0x6a, 0xb7, 0x84, 0x60, 0x70, 0x08, 0xed, 0x97, 0x71, 0x71, 0x89,
0x0f, 0x21, 0x29, 0x0a, 0x0f, 0xa1, 0x06, 0x81, 0xfd, 0x3d, 0x66, 0x71, 0x39, 0xbd, 0xc4, 0xfb,
0x5b, 0xc9, 0xc2, 0xfd, 0x6d, 0x18, 0xd8, 0xdf, 0x4a, 0xf0, 0x3a, 0x15, 0x97, 0x47, 0x4c, 0xc4,
0x78, 0x7f, 0xfb, 0x4c, 0xb8, 0xbf, 0x5b, 0xac, 0xcd, 0x64, 0x5c, 0x87, 0xe3, 0xc5, 0x79, 0x35,
0x2d, 0xd3, 0x73, 0x36, 0x0c, 0x58, 0x31, 0x10, 0x91, 0xc9, 0x90, 0xb0, 0xf6, 0xf9, 0xd3, 0x41,
0x74, 0xbb, 0xe9, 0x76, 0x5e, 0x55, 0x6a, 0x65, 0x05, 0xee, 0x3f, 0xc1, 0xfb, 0x97, 0xc0, 0x89,
0xd3, 0xc4, 0x1e, 0x6a, 0x4e, 0x54, 0xc5, 0x8b, 0x74, 0x96, 0x57, 0xa6, 0x50, 0x9f, 0xf5, 0xb1,
0xee, 0x28, 0x10, 0x51, 0xb5, 0x97, 0xa2, 0x5d, 0xd0, 0x74, 0xff, 0x34, 0xb2, 0x83, 0xa4, 0x02,
0x0b, 0x5a, 0xd3, 0xde, 0x0e, 0x41, 0x2c, 0x68, 0x38, 0x09, 0x87, 0xc2, 0x7e, 0xc9, 0x17, 0x45,
0xd5, 0x31, 0x14, 0x00, 0x14, 0x1e, 0x0a, 0x6d, 0x58, 0xfb, 0x7c, 0x13, 0xfd, 0xba, 0x3b, 0xfc,
0xdc, 0xc6, 0xde, 0xa4, 0xc7, 0x14, 0xd6, 0xc4, 0xa3, 0xbe, 0xb8, 0x4d, 0xe9, 0x1a, 0xcf, 0x62,
0x97, 0x89, 0x38, 0xcd, 0xaa, 0xe1, 0x03, 0xdc, 0x46, 0x23, 0x27, 0x52, 0x3a, 0x8c, 0x83, 0xf1,
0x6d, 0x77, 0x51, 0x64, 0xe9, 0xb4, 0x7d, 0x96, 0xab, 0x75, 0x8d, 0x38, 0x1c, 0xdf, 0x5c, 0x0c,
0xc6, 0xeb, 0x31, 0x13, 0xea, 0x3f, 0x93, 0x55, 0xc1, 0xf0, 0x78, 0xed, 0x21, 0xe1, 0x78, 0x0d,
0x51, 0x58, 0x9f, 0x31, 0x13, 0x87, 0xf1, 0x8a, 0x2f, 0x88, 0x78, 0x6d, 0xc4, 0xe1, 0xfa, 0xb8,
0x98, 0xcd, 0xaa, 0x8c, 0x87, 0x83, 0x5c, 0xb0, 0x32, 0x8f, 0xb3, 0xbd, 0x2c, 0x9e, 0x55, 0x43,
0x22, 0xc6, 0xf8, 0x14, 0x91, 0x55, 0xd1, 0x34, 0xd2, 0x8c, 0x07, 0xd5, 0x5e, 0xbc, 0xe4, 0x65,
0x2a, 0xe8, 0x66, 0xb4, 0x48, 0x67, 0x33, 0x7a, 0x28, 0xea, 0x6d, 0xbb, 0x9c, 0x5e, 0xa6, 0x4b,
0x96, 0x04, 0xbc, 0x35, 0x48, 0x0f, 0x6f, 0x0e, 0x8a, 0x74, 0xda, 0x98, 0x2f, 0xca, 0x29, 0x23,
0x3b, 0x4d, 0x89, 0x3b, 0x3b, 0xcd, 0x60, 0xda, 0xc3, 0x5f, 0x0c, 0xa2, 0xdf, 0x50, 0x52, 0xf7,
0x80, 0x75, 0x37, 0xae, 0x2e, 0xcf, 0x79, 0x5c, 0x26, 0xc3, 0x8f, 0x30, 0x3b, 0x28, 0x6a, 0x5c,
0x3f, 0xbd, 0x89, 0x0a, 0x6c, 0xd6, 0xc3, 0xb4, 0x72, 0x66, 0x1c, 0xda, 0xac, 0x1e, 0x12, 0x6e,
0x56, 0x88, 0xc2, 0x00, 0x22, 0xe5, 0xea, 0x30, 0xe3, 0x01, 0xa9, 0xef, 0x9f, 0x68, 0xac, 0x75,
0x72, 0x30, 0x3e, 0xd6, 0x42, 0x7f, 0xb4, 0x6c, 0x52, 0x36, 0xf0, 0x11, 0x33, 0xea, 0x8b, 0x93,
0x9e, 0xcd, 0xac, 0x08, 0x7b, 0x6e, 0xcd, 0x8c, 0x51, 0x5f, 0x9c, 0xf0, 0xec, 0x84, 0xb5, 0x90,
0x67, 0x24, 0xb4, 0x8d, 0xfa, 0xe2, 0x30, 0xfb, 0xd2, 0x4c, 0xb3, 0x2e, 0x3c, 0x0e, 0xd8, 0x81,
0x6b, 0xc3, 0x7a, 0x2f, 0x56, 0x3b, 0xfc, 0xab, 0x41, 0xf4, 0x3d, 0xeb, 0xf1, 0x88, 0x27, 0xe9,
0xc5, 0x4a, 0x41, 0xaf, 0xe2, 0x6c, 0xc1, 0xaa, 0xe1, 0x53, 0xca, 0x5a, 0x9b, 0x35, 0x25, 0x78,
0x76, 0x23, 0x1d, 0x38, 0x77, 0xb6, 0x8b, 0x22, 0x5b, 0x4d, 0xd8, 0xbc, 0xc8, 0xc8, 0xb9, 0xe3,
0x21, 0xe1, 0xb9, 0x03, 0x51, 0x98, 0x95, 0x4f, 0x78, 0x9d, 0xf3, 0xa3, 0x59, 0xb9, 0x14, 0x85,
0xb3, 0xf2, 0x06, 0x81, 0xb9, 0xd2, 0x84, 0xef, 0xf0, 0x2c, 0x63, 0x53, 0xd1, 0x7e, 0x48, 0x6b,
0x34, 0x2d, 0x11, 0xce, 0x95, 0x00, 0x69, 0xcf, 0x33, 0x9a, 0x3d, 0x64, 0x5c, 0xb2, 0xe7, 0xab,
0xc3, 0x34, 0xbf, 0x1a, 0xe2, 0x69, 0x81, 0x05, 0x88, 0xf3, 0x0c, 0x14, 0x84, 0x7b, 0xd5, 0xb3,
0x3c, 0xe1, 0xf8, 0x5e, 0xb5, 0x96, 0x84, 0xf7, 0xaa, 0x9a, 0x80, 0x26, 0x4f, 0x19, 0x65, 0xb2,
0x96, 0x84, 0x4d, 0x6a, 0x02, 0x0b, 0x85, 0xfa, 0xd4, 0x9b, 0x0c, 0x85, 0xe0, 0x9c, 0x7b, 0xad,
0x93, 0x83, 0x23, 0xb4, 0xd9, 0xb4, 0xee, 0x31, 0x31, 0xbd, 0xc4, 0x47, 0xa8, 0x87, 0x84, 0x47,
0x28, 0x44, 0x61, 0x95, 0x26, 0xdc, 0x6c, 0xba, 0x1f, 0xe0, 0xe3, 0xa3, 0xb5, 0xe1, 0x5e, 0xeb,
0xe4, 0xe0, 0x36, 0xf2, 0x60, 0x2e, 0xdb, 0x0c, 0x1d, 0xe4, 0x4a, 0x16, 0xde, 0x46, 0x1a, 0x06,
0x96, 0x5e, 0x09, 0xea, 0xe6, 0xc4, 0x4b, 0x6f, 0xe5, 0xe1, 0xd2, 0x7b, 0x9c, 0x76, 0xf2, 0x4f,
0x66, 0x1b, 0xa7, 0xa4, 0xc7, 0xbc, 0x9e, 0x23, 0xaf, 0xe2, 0x2c, 0x4d, 0x62, 0xc1, 0x26, 0xfc,
0x8a, 0xe5, 0xf8, 0x8e, 0x49, 0x97, 0x56, 0xf1, 0x23, 0x4f, 0x21, 0xbc, 0x63, 0x0a, 0x2b, 0xc2,
0x71, 0xa2, 0xe8, 0xb3, 0x8a, 0xed, 0xc4, 0x15, 0x11, 0xc9, 0x3c, 0x24, 0x3c, 0x4e, 0x20, 0x0a,
0xf3, 0x55, 0x25, 0x7f, 0xf1, 0xa6, 0x60, 0x65, 0xca, 0xf2, 0x29, 0xc3, 0xf3, 0x55, 0x48, 0x85,
0xf3, 0x55, 0x84, 0x86, 0x7b, 0xb5, 0xdd, 0x58, 0xb0, 0xe7, 0xab, 0x49, 0x3a, 0x67, 0x95, 0x88,
0xe7, 0x05, 0xbe, 0x57, 0x03, 0x50, 0x78, 0xaf, 0xd6, 0x86, 0x5b, 0x47, 0x43, 0x26, 0x20, 0xb6,
0xef, 0x76, 0x40, 0x22, 0x70, 0xb7, 0x83, 0x40, 0x61, 0xc3, 0x5a, 0x00, 0x3d, 0x5e, 0x6d, 0x59,
0x09, 0x1e, 0xaf, 0xd2, 0x74, 0xeb, 0xc0, 0xcd, 0x30, 0xe3, 0x7a, 0x6a, 0x76, 0x14, 0x7d, 0xec,
0x4e, 0xd1, 0xf5, 0x5e, 0x2c, 0x7e, 0xc2, 0x77, 0xca, 0xb2, 0x58, 0x2e, 0x5b, 0x81, 0x63, 0xb4,
0x86, 0xe9, 0x73, 0xc2, 0xe7, 0xb0, 0xda, 0xe1, 0x9f, 0x0d, 0xa2, 0xf7, 0x31, 0x8f, 0x2f, 0x0b,
0xe9, 0xf7, 0x49, 0xb7, 0x2d, 0x45, 0x12, 0x97, 0x57, 0xc2, 0x1a, 0xba, 0x0c, 0x7f, 0x14, 0xbd,
0xd7, 0x88, 0xec, 0xdd, 0x16, 0x5d, 0x00, 0x3f, 0x69, 0x33, 0xe5, 0x87, 0x9c, 0x71, 0xbf, 0xd5,
0x9b, 0xb7, 0xfb, 0x21, 0xbf, 0x5c, 0x15, 0xd8, 0x0f, 0x19, 0x1b, 0x5a, 0x4c, 0xec, 0x87, 0x10,
0xcc, 0xce, 0x4e, 0xb7, 0x7a, 0xaf, 0x53, 0x71, 0x29, 0xf3, 0x2d, 0x30, 0x3b, 0xbd, 0xb2, 0x1a,
0x88, 0x98, 0x9d, 0x24, 0x0c, 0x33, 0x92, 0x06, 0xac, 0xe7, 0x26, 0x16, 0xcb, 0x8d, 0x21, 0x77,
0x66, 0x3e, 0xec, 0x06, 0xe1, 0x78, 0x6d, 0xc4, 0x7a, 0xeb, 0xf3, 0x38, 0x64, 0x01, 0x6c, 0x7f,
0xd6, 0x7b, 0xb1, 0xda, 0xe1, 0x9f, 0x44, 0xdf, 0x6d, 0x55, 0x6c, 0x8f, 0xc5, 0x62, 0x51, 0xb2,
0x64, 0xb8, 0xd5, 0x51, 0xee, 0x06, 0x34, 0xae, 0x9f, 0xf4, 0x57, 0x68, 0xe5, 0xe8, 0x0d, 0xa7,
0x86, 0x95, 0x29, 0xc3, 0xd3, 0x90, 0x49, 0x9f, 0x0d, 0xe6, 0xe8, 0xb4, 0x4e, 0x6b, 0x9b, 0xed,
0x8e, 0xae, 0xed, 0x65, 0x9c, 0x66, 0xf2, 0x31, 0xd7, 0x47, 0x21, 0xa3, 0x1e, 0x1a, 0xdc, 0x66,
0x93, 0x2a, 0xad, 0xc8, 0x2c, 0xe7, 0xb8, 0xb3, 0x3d, 0xdb, 0xa0, 0x23, 0x01, 0xb2, 0x3b, 0xdb,
0xec, 0x49, 0x6b, 0xb7, 0xa2, 0x59, 0xf2, 0xea, 0x9f, 0xdd, 0x41, 0x8e, 0x79, 0xd5, 0xaa, 0xc8,
0x48, 0xdf, 0xec, 0x49, 0x6b, 0xaf, 0x7f, 0x1c, 0xbd, 0xd7, 0xf6, 0xaa, 0x17, 0xa2, 0xad, 0x4e,
0x53, 0x60, 0x2d, 0x7a, 0xd2, 0x5f, 0x41, 0xbb, 0xff, 0x57, 0x73, 0x2e, 0xad, 0xfc, 0x4f, 0xf9,
0x7c, 0xce, 0xf2, 0x84, 0x25, 0x8d, 0x46, 0x55, 0xef, 0x9f, 0x3e, 0xa7, 0xed, 0x1a, 0x85, 0x91,
0xab, 0x61, 0x4a, 0xf4, 0x9b, 0xdf, 0x40, 0x53, 0x17, 0xed, 0x3f, 0x06, 0xd1, 0x23, 0xb4, 0x68,
0xcd, 0xc0, 0xf5, 0x8a, 0xf8, 0x3b, 0x7d, 0x1c, 0x61, 0x9a, 0xa6, 0xa8, 0xdb, 0xff, 0x0f, 0x0b,
0x76, 0x83, 0xf8, 0x45, 0x5a, 0x09, 0x5e, 0xae, 0xc6, 0x97, 0xfc, 0xba, 0xb9, 0x81, 0xef, 0xc7,
0x3e, 0x0d, 0x8c, 0x1c, 0x82, 0xd8, 0x20, 0xe2, 0x64, 0xcb, 0x95, 0xbd, 0xa9, 0x5f, 0x11, 0xae,
0x1c, 0xa2, 0xc3, 0x95, 0x4f, 0xda, 0xc8, 0xdf, 0xd4, 0xca, 0xbe, 0x56, 0xb0, 0x86, 0x17, 0xb5,
0xfd, 0x6a, 0xc1, 0xc3, 0x6e, 0xd0, 0xe6, 0x7f, 0x5a, 0xbc, 0x9b, 0x5e, 0x5c, 0x98, 0x3a, 0xe1,
0x25, 0x75, 0x11, 0x22, 0xff, 0x23, 0x50, 0xbb, 0x85, 0xd9, 0x4b, 0x33, 0x26, 0x9f, 0x8f, 0xbc,
0xbc, 0xb8, 0xc8, 0x78, 0x9c, 0x80, 0x2d, 0x4c, 0x2d, 0x1e, 0xb9, 0x72, 0x62, 0x0b, 0x83, 0x71,
0xf6, 0x02, 0x5f, 0x2d, 0xad, 0x47, 0x50, 0x3e, 0x4d, 0x33, 0x78, 0x21, 0x51, 0x6a, 0x1a, 0x21,
0x71, 0x81, 0xaf, 0x05, 0xd9, 0x34, 0xa3, 0x16, 0xd5, 0x41, 0xb4, 0x29, 0xff, 0xfd, 0xb6, 0xa2,
0x23, 0x26, 0xd2, 0x0c, 0x04, 0xb3, 0x3b, 0xf9, 0x5a, 0x78, 0x56, 0x48, 0xe3, 0x77, 0xda, 0x5a,
0x4a, 0x42, 0xec, 0xe4, 0x7d, 0xc2, 0xee, 0x48, 0xeb, 0xdf, 0x77, 0xf9, 0x75, 0x2e, 0x8d, 0xde,
0x6d, 0xab, 0x34, 0x32, 0x62, 0x47, 0x0a, 0x19, 0x6d, 0xf8, 0x47, 0xd1, 0xcf, 0x4b, 0xc3, 0x25,
0x2f, 0x86, 0xb7, 0x10, 0x85, 0xd2, 0xb9, 0x3b, 0x78, 0x9b, 0x94, 0xdb, 0x2b, 0xb0, 0x66, 0x6c,
0x9c, 0x55, 0xf1, 0x8c, 0x0d, 0xef, 0x11, 0x3d, 0x2e, 0xa5, 0xc4, 0x15, 0xd8, 0x36, 0xe5, 0x8f,
0x8a, 0x63, 0x9e, 0x68, 0xeb, 0x48, 0x0d, 0x8d, 0x30, 0x34, 0x2a, 0x5c, 0xc8, 0xa6, 0x86, 0xc7,
0xf1, 0x32, 0x9d, 0x99, 0xe5, 0x5b, 0x05, 0xb2, 0x0a, 0xa4, 0x86, 0x96, 0x19, 0x39, 0x10, 0x91,
0x1a, 0x92, 0xb0, 0xf6, 0xf9, 0x8f, 0x83, 0xe8, 0x8e, 0x65, 0xf6, 0x9b, 0xb3, 0xcf, 0x83, 0xfc,
0x82, 0xd7, 0x89, 0xe4, 0x61, 0x9a, 0x5f, 0x55, 0xc3, 0x4f, 0x29, 0x93, 0x38, 0x6f, 0x8a, 0xf2,
0xd9, 0x8d, 0xf5, 0xec, 0x1e, 0xa0, 0x39, 0x18, 0xb4, 0xb7, 0x03, 0x94, 0x06, 0xd8, 0x03, 0x98,
0xf3, 0x43, 0xc8, 0x11, 0x7b, 0x80, 0x10, 0x6f, 0xbb, 0xd8, 0x38, 0xcf, 0x78, 0x0e, 0xbb, 0xd8,
0x5a, 0xa8, 0x85, 0x44, 0x17, 0xb7, 0x20, 0x1b, 0x8f, 0x1b, 0x91, 0x3a, 0xc3, 0xda, 0xce, 0x32,
0x10, 0x8f, 0x8d, 0xaa, 0x01, 0x88, 0x78, 0x8c, 0x82, 0xda, 0xcf, 0x69, 0xf4, 0xed, 0xba, 0x49,
0x4f, 0x4a, 0xb6, 0x4c, 0x19, 0xbc, 0xc8, 0xe2, 0x48, 0x88, 0xf9, 0xef, 0x13, 0x76, 0x66, 0x9d,
0xe5, 0x55, 0x91, 0xc5, 0xd5, 0xa5, 0xbe, 0xda, 0xe0, 0xd7, 0xb9, 0x11, 0xc2, 0xcb, 0x0d, 0xf7,
0x3b, 0x28, 0x1b, 0xd4, 0x1b, 0x99, 0x09, 0x31, 0x0f, 0x70, 0xd5, 0x56, 0x98, 0x59, 0xeb, 0xe4,
0xec, 0xf3, 0x83, 0xfd, 0x38, 0xcb, 0x58, 0xb9, 0x6a, 0x64, 0x47, 0x71, 0x9e, 0x5e, 0xb0, 0x4a,
0x80, 0xe7, 0x07, 0x9a, 0x1a, 0x41, 0x8c, 0x78, 0x7e, 0x10, 0xc0, 0xed, 0xde, 0x08, 0x78, 0x3e,
0xc8, 0x13, 0xf6, 0x06, 0xec, 0x8d, 0xa0, 0x1d, 0xc9, 0x10, 0x7b, 0x23, 0x8a, 0xb5, 0xe7, 0xe8,
0xcf, 0x33, 0x3e, 0xbd, 0xd2, 0x4b, 0x80, 0xdf, 0xc1, 0x52, 0x02, 0xd7, 0x80, 0xbb, 0x21, 0xc4,
0x2e, 0x02, 0x52, 0x70, 0xca, 0x8a, 0x2c, 0x9e, 0xc2, 0xdb, 0x4c, 0x4a, 0x47, 0xcb, 0x88, 0x45,
0x00, 0x32, 0xa0, 0xb8, 0xfa, 0x96, 0x14, 0x56, 0x5c, 0x70, 0x49, 0xea, 0x6e, 0x08, 0xb1, 0xcb,
0xa0, 0x14, 0x8c, 0x8b, 0x2c, 0x15, 0x60, 0x1a, 0x28, 0x0d, 0x29, 0x21, 0xa6, 0x81, 0x4f, 0x00,
0x93, 0x47, 0xac, 0x9c, 0x31, 0xd4, 0xa4, 0x94, 0x04, 0x4d, 0x36, 0x84, 0xbd, 0xf4, 0xaa, 0xea,
0xce, 0x8b, 0x15, 0xb8, 0xf4, 0xaa, 0xab, 0xc5, 0x8b, 0x15, 0x71, 0xe9, 0xd5, 0x03, 0x40, 0x11,
0x4f, 0xe2, 0x4a, 0xe0, 0x45, 0x94, 0x92, 0x60, 0x11, 0x1b, 0xc2, 0xae, 0xd1, 0xaa, 0x88, 0x0b,
0x01, 0xd6, 0x68, 0x5d, 0x00, 0xe7, 0x79, 0xfe, 0x6d, 0x52, 0x6e, 0x23, 0x89, 0xea, 0x15, 0x26,
0xf6, 0x52, 0x96, 0x25, 0x15, 0x88, 0x24, 0xba, 0xdd, 0x1b, 0x29, 0x11, 0x49, 0xda, 0x14, 0x18,
0x4a, 0xfa, 0x69, 0x03, 0x56, 0x3b, 0xf0, 0xa0, 0xe1, 0x6e, 0x08, 0xb1, 0xf1, 0xa9, 0x29, 0xf4,
0x4e, 0x5c, 0x96, 0x69, 0xbd, 0xf8, 0x3f, 0xc0, 0x0b, 0xd4, 0xc8, 0x89, 0xf8, 0x84, 0x71, 0x60,
0x7a, 0x35, 0x81, 0x1b, 0x2b, 0x18, 0x0c, 0xdd, 0x1f, 0x06, 0x19, 0x9b, 0x71, 0x4a, 0x89, 0xf3,
0x40, 0x1a, 0x6b, 0x4d, 0xe4, 0x79, 0xf4, 0x83, 0x2e, 0xcc, 0x79, 0x29, 0xc5, 0xb8, 0x38, 0xe2,
0x4b, 0x36, 0xe1, 0x2f, 0xde, 0xa4, 0x95, 0x48, 0xf3, 0x99, 0x5e, 0xb9, 0x9f, 0x11, 0x96, 0x30,
0x98, 0x78, 0x29, 0xa5, 0x53, 0xc9, 0x26, 0x10, 0xa0, 0x2c, 0xc7, 0xec, 0x1a, 0x4d, 0x20, 0xa0,
0x45, 0xc3, 0x11, 0x09, 0x44, 0x88, 0xb7, 0xa7, 0x52, 0xc6, 0xb9, 0x7e, 0x73, 0x77, 0xc2, 0x9b,
0x5c, 0x8e, 0xb2, 0x06, 0x41, 0xe2, 0x60, 0x20, 0xa8, 0x60, 0xf7, 0x97, 0xc6, 0xbf, 0x9d, 0x62,
0x0f, 0x09, 0x3b, 0xed, 0x69, 0xf6, 0xa8, 0x07, 0x89, 0xb8, 0xb2, 0xb7, 0x2a, 0x28, 0x57, 0xed,
0x4b, 0x15, 0x8f, 0x7a, 0x90, 0xce, 0x09, 0x97, 0x5b, 0xad, 0xe7, 0xf1, 0xf4, 0x6a, 0x56, 0xf2,
0x45, 0x9e, 0xec, 0xf0, 0x8c, 0x97, 0xe0, 0x84, 0xcb, 0x2b, 0x35, 0x40, 0x89, 0x13, 0xae, 0x0e,
0x15, 0x9b, 0xc1, 0xb9, 0xa5, 0xd8, 0xce, 0xd2, 0x19, 0xdc, 0x51, 0x7b, 0x86, 0x24, 0x40, 0x64,
0x70, 0x28, 0x88, 0x0c, 0x22, 0xb5, 0xe3, 0x16, 0xe9, 0x34, 0xce, 0x94, 0xbf, 0x2d, 0xda, 0x8c,
0x07, 0x76, 0x0e, 0x22, 0x44, 0x01, 0xa9, 0xe7, 0x64, 0x51, 0xe6, 0x07, 0xb9, 0xe0, 0x64, 0x3d,
0x1b, 0xa0, 0xb3, 0x9e, 0x0e, 0x08, 0xc2, 0xea, 0x84, 0xbd, 0xa9, 0x4b, 0x53, 0xff, 0x83, 0x85,
0xd5, 0xfa, 0xf7, 0x91, 0x96, 0x87, 0xc2, 0x2a, 0xe0, 0x40, 0x65, 0xb4, 0x13, 0x35, 0x60, 0x02,
0xda, 0xfe, 0x30, 0x79, 0xd8, 0x0d, 0xe2, 0x7e, 0xc6, 0x62, 0x95, 0xb1, 0x90, 0x1f, 0x09, 0xf4,
0xf1, 0xd3, 0x80, 0xf6, 0xb8, 0xc5, 0xab, 0xcf, 0x25, 0x9b, 0x5e, 0xb5, 0x2e, 0x89, 0xf9, 0x05,
0x55, 0x08, 0x71, 0xdc, 0x42, 0xa0, 0x78, 0x17, 0x1d, 0x4c, 0x79, 0x1e, 0xea, 0xa2, 0x5a, 0xde,
0xa7, 0x8b, 0x34, 0x67, 0x37, 0xbf, 0x46, 0xaa, 0x47, 0xa6, 0xea, 0xa6, 0x75, 0xc2, 0x82, 0x0b,
0x11, 0x9b, 0x5f, 0x12, 0xb6, 0x39, 0x39, 0xf4, 0x79, 0xd4, 0xbe, 0x41, 0xdf, 0xb2, 0x72, 0x44,
0xdf, 0xa0, 0xa7, 0x58, 0xba, 0x92, 0x6a, 0x8c, 0x74, 0x58, 0xf1, 0xc7, 0xc9, 0x46, 0x3f, 0xd8,
0x6e, 0x79, 0x3c, 0x9f, 0x3b, 0x19, 0x8b, 0x4b, 0xe5, 0x75, 0x33, 0x60, 0xc8, 0x62, 0xc4, 0x96,
0x27, 0x80, 0x83, 0x10, 0xe6, 0x79, 0xde, 0xe1, 0xb9, 0x60, 0xb9, 0xc0, 0x42, 0x98, 0x6f, 0x4c,
0x83, 0xa1, 0x10, 0x46, 0x29, 0x80, 0x71, 0x2b, 0xcf, 0x83, 0x98, 0x38, 0x8e, 0xe7, 0x68, 0xc6,
0xa6, 0xce, 0x7a, 0x94, 0x3c, 0x34, 0x6e, 0x01, 0xe7, 0x3c, 0x32, 0x75, 0xbd, 0x4c, 0xe2, 0x72,
0x66, 0x4e, 0x37, 0x92, 0xe1, 0x13, 0xda, 0x8e, 0x4f, 0x12, 0x8f, 0x4c, 0xc3, 0x1a, 0x20, 0xec,
0x1c, 0xcc, 0xe3, 0x99, 0xa9, 0x29, 0x52, 0x03, 0x29, 0x6f, 0x55, 0xf5, 0x61, 0x37, 0x08, 0xfc,
0xbc, 0x4a, 0x13, 0xc6, 0x03, 0x7e, 0xa4, 0xbc, 0x8f, 0x1f, 0x08, 0x82, 0xec, 0xad, 0xae, 0xb7,
0xda, 0xd1, 0x6d, 0xe7, 0x89, 0xde, 0xc7, 0x8e, 0x88, 0xe6, 0x01, 0x5c, 0x28, 0x7b, 0x23, 0x78,
0x30, 0x47, 0x9b, 0x03, 0xda, 0xd0, 0x1c, 0x35, 0xe7, 0xaf, 0x7d, 0xe6, 0x28, 0x06, 0x6b, 0x9f,
0x3f, 0xd1, 0x73, 0x74, 0x37, 0x16, 0x71, 0x9d, 0xb7, 0xbf, 0x4a, 0xd9, 0xb5, 0xde, 0x08, 0x23,
0xf5, 0x6d, 0xa8, 0x91, 0x7c, 0x75, 0x12, 0xec, 0x8a, 0xb7, 0x7a, 0xf3, 0x01, 0xdf, 0x7a, 0x87,
0xd0, 0xe9, 0x1b, 0x6c, 0x15, 0xb6, 0x7a, 0xf3, 0x01, 0xdf, 0xfa, 0x9d, 0xec, 0x4e, 0xdf, 0xe0,
0xc5, 0xec, 0xad, 0xde, 0xbc, 0xf6, 0xfd, 0xe7, 0xcd, 0xc4, 0x75, 0x9d, 0xd7, 0x79, 0xd8, 0x54,
0xa4, 0x4b, 0x86, 0xa5, 0x93, 0xbe, 0x3d, 0x83, 0x86, 0xd2, 0x49, 0x5a, 0xc5, 0xf9, 0x90, 0x0f,
0x56, 0x8a, 0x13, 0x5e, 0xa5, 0xf2, 0xca, 0xc3, 0xb3, 0x1e, 0x46, 0x1b, 0x38, 0xb4, 0x69, 0x0a,
0x29, 0xd9, 0x87, 0xb7, 0x1e, 0x6a, 0xef, 0x84, 0x6f, 0x04, 0xec, 0xb5, 0xaf, 0x86, 0x6f, 0xf6,
0xa4, 0xed, 0x63, 0x54, 0x8f, 0x71, 0x9f, 0xdf, 0x86, 0x7a, 0x15, 0x7d, 0x84, 0xfb, 0xa4, 0xbf,
0x82, 0x76, 0xff, 0x97, 0xcd, 0xbe, 0x02, 0xfa, 0xd7, 0x93, 0xe0, 0x69, 0x1f, 0x8b, 0x60, 0x22,
0x3c, 0xbb, 0x91, 0x8e, 0x2e, 0xc8, 0xdf, 0x36, 0x1b, 0xe8, 0x06, 0x95, 0x6f, 0xc6, 0xbc, 0x2c,
0x13, 0x56, 0xea, 0x39, 0x11, 0xea, 0x56, 0x0b, 0xc3, 0x99, 0xf1, 0xc9, 0x0d, 0xb5, 0x9c, 0xcf,
0x3a, 0x79, 0xb0, 0x7e, 0x83, 0xd3, 0x29, 0x4f, 0xc8, 0xb2, 0x43, 0xc3, 0x02, 0x7d, 0x7a, 0x53,
0x35, 0x6a, 0xae, 0x38, 0xb0, 0xfc, 0x4a, 0xc4, 0xb3, 0x9e, 0x86, 0xbd, 0xef, 0x46, 0x7c, 0x7c,
0x33, 0x25, 0x5d, 0x96, 0x7f, 0x1f, 0x44, 0xf7, 0x3d, 0xd6, 0x3e, 0x4f, 0x00, 0xa7, 0x1e, 0x3f,
0x0c, 0xd8, 0xa7, 0x94, 0x4c, 0xe1, 0x7e, 0xeb, 0x9b, 0x29, 0xdb, 0x6f, 0x20, 0x79, 0x2a, 0x7b,
0x69, 0x26, 0x58, 0xd9, 0xfe, 0x06, 0x92, 0x6f, 0x57, 0x51, 0x23, 0xfa, 0x1b, 0x48, 0x01, 0xdc,
0xf9, 0x06, 0x12, 0xe2, 0x19, 0xfd, 0x06, 0x12, 0x6a, 0x2d, 0xf8, 0x0d, 0xa4, 0xb0, 0x06, 0x15,
0xde, 0x9b, 0x22, 0xa8, 0x73, 0xeb, 0x5e, 0x16, 0xfd, 0x63, 0xec, 0xa7, 0x37, 0x51, 0x21, 0x16,
0x38, 0xc5, 0xc9, 0x5b, 0x83, 0x3d, 0xda, 0xd4, 0xbb, 0x39, 0xb8, 0xd5, 0x9b, 0xd7, 0xbe, 0x7f,
0xac, 0x77, 0x37, 0x26, 0x9c, 0xf3, 0x52, 0x7e, 0xff, 0x6a, 0x3d, 0x14, 0x9e, 0x6b, 0x0b, 0x6e,
0xcf, 0x6f, 0xf4, 0x83, 0x89, 0xea, 0xd6, 0x84, 0xee, 0xf4, 0x51, 0x97, 0x21, 0xd0, 0xe5, 0x5b,
0xbd, 0x79, 0x62, 0x19, 0x51, 0xbe, 0x55, 0x6f, 0xf7, 0x30, 0xe6, 0xf7, 0xf5, 0x93, 0xfe, 0x0a,
0xda, 0xfd, 0x52, 0xa7, 0x8d, 0xae, 0x7b, 0xd9, 0xcf, 0x9b, 0x5d, 0xa6, 0xc6, 0x5e, 0x37, 0x8f,
0xfa, 0xe2, 0xa1, 0x04, 0xc2, 0x5d, 0x42, 0xbb, 0x12, 0x08, 0x74, 0x19, 0xfd, 0xf8, 0x66, 0x4a,
0xba, 0x2c, 0xff, 0x30, 0x88, 0x6e, 0x93, 0x65, 0xd1, 0xe3, 0xe0, 0xd3, 0xbe, 0x96, 0xc1, 0x78,
0xf8, 0xec, 0xc6, 0x7a, 0xba, 0x50, 0xff, 0x3c, 0x88, 0xee, 0x04, 0x0a, 0xa5, 0x06, 0xc8, 0x0d,
0xac, 0xfb, 0x03, 0xe5, 0xf3, 0x9b, 0x2b, 0x52, 0xcb, 0xbd, 0x8b, 0x8f, 0xdb, 0x1f, 0x07, 0x0a,
0xd8, 0x1e, 0xd3, 0x1f, 0x07, 0xea, 0xd6, 0x82, 0x87, 0x3c, 0xf1, 0x79, 0xb3, 0xe9, 0x42, 0x0f,
0x79, 0xe4, 0x7d, 0x3f, 0xb0, 0xe7, 0x58, 0xeb, 0xe4, 0x30, 0x27, 0x2f, 0xde, 0x14, 0x71, 0x9e,
0xd0, 0x4e, 0x94, 0xbc, 0xdb, 0x89, 0xe1, 0xe0, 0xe1, 0x58, 0x2d, 0x3d, 0xe5, 0xcd, 0x46, 0xea,
0x11, 0xa5, 0x6f, 0x90, 0xe0, 0xe1, 0x58, 0x0b, 0x25, 0xbc, 0xe9, 0xac, 0x31, 0xe4, 0x0d, 0x24,
0x8b, 0x8f, 0xfb, 0xa0, 0x20, 0x45, 0x37, 0xde, 0xcc, 0x99, 0xfb, 0x46, 0xc8, 0x4a, 0xeb, 0xdc,
0x7d, 0xb3, 0x27, 0x4d, 0xb8, 0x1d, 0x33, 0xf1, 0x05, 0x8b, 0x13, 0x56, 0x06, 0xdd, 0x1a, 0xaa,
0x97, 0x5b, 0x97, 0xc6, 0xdc, 0xee, 0xf0, 0x6c, 0x31, 0xcf, 0x75, 0x67, 0x92, 0x6e, 0x5d, 0xaa,
0xdb, 0x2d, 0xa0, 0xe1, 0xb1, 0xa0, 0x75, 0x2b, 0xd3, 0xcb, 0xc7, 0x61, 0x33, 0x5e, 0x56, 0xb9,
0xde, 0x8b, 0xa5, 0xeb, 0xa9, 0x87, 0x51, 0x47, 0x3d, 0xc1, 0x48, 0xda, 0xec, 0x49, 0xc3, 0xf3,
0x39, 0xc7, 0xad, 0x19, 0x4f, 0x5b, 0x1d, 0xb6, 0x5a, 0x43, 0xea, 0x49, 0x7f, 0x05, 0x78, 0x1a,
0xaa, 0x47, 0xd5, 0x61, 0x5a, 0x89, 0xbd, 0x34, 0xcb, 0x86, 0xeb, 0x81, 0x61, 0xd2, 0x40, 0xc1,
0xd3, 0x50, 0x04, 0x26, 0x46, 0x72, 0x73, 0x7a, 0x98, 0x0f, 0xbb, 0xec, 0x48, 0xaa, 0xd7, 0x48,
0x76, 0x69, 0x70, 0xa2, 0xe5, 0x34, 0xb5, 0xa9, 0xed, 0x28, 0xdc, 0x70, 0xad, 0x0a, 0x6f, 0xf5,
0xe6, 0xc1, 0xe3, 0x76, 0x49, 0xc9, 0x95, 0xe5, 0x1e, 0x65, 0xc2, 0x5b, 0x49, 0xee, 0x77, 0x50,
0xe0, 0x54, 0x50, 0x4d, 0xa3, 0xd7, 0x69, 0x32, 0x63, 0x02, 0x7d, 0x52, 0xe4, 0x02, 0xc1, 0x27,
0x45, 0x00, 0x04, 0x5d, 0xa7, 0x7e, 0x37, 0xc7, 0xa1, 0x07, 0x09, 0xd6, 0x75, 0x5a, 0xd9, 0xa1,
0x42, 0x5d, 0x87, 0xd2, 0x20, 0x1a, 0x18, 0xb7, 0xfa, 0xe3, 0x06, 0x8f, 0x43, 0x66, 0xc0, 0x17,
0x0e, 0xd6, 0x7b, 0xb1, 0x60, 0x45, 0xb1, 0x0e, 0xd3, 0x79, 0x2a, 0xb0, 0x15, 0xc5, 0xb1, 0x51,
0x23, 0xa1, 0x15, 0xa5, 0x8d, 0x52, 0xd5, 0xab, 0x73, 0x84, 0x83, 0x24, 0x5c, 0x3d, 0xc5, 0xf4,
0xab, 0x9e, 0x61, 0x5b, 0x0f, 0x36, 0x73, 0x33, 0x64, 0xc4, 0xa5, 0xde, 0x2c, 0x23, 0x63, 0x5b,
0xbe, 0xf4, 0x0a, 0xc1, 0x50, 0xd4, 0xa1, 0x14, 0xe0, 0x81, 0x7d, 0xcd, 0x35, 0xcf, 0x5e, 0x8b,
0x82, 0xc5, 0x65, 0x9c, 0x4f, 0xd1, 0xcd, 0xa9, 0x34, 0xd8, 0x22, 0x43, 0x9b, 0x53, 0x52, 0x03,
0x3c, 0x36, 0xf7, 0x5f, 0x57, 0x45, 0xa6, 0x82, 0x79, 0x2f, 0xd4, 0x7f, 0x5b, 0xf5, 0x51, 0x0f,
0x12, 0x3e, 0x36, 0x6f, 0x00, 0x73, 0xf0, 0xad, 0x9c, 0x7e, 0x14, 0x30, 0xe5, 0xa3, 0xa1, 0x8d,
0x30, 0xad, 0x02, 0x06, 0xb5, 0x49, 0x70, 0x99, 0xf8, 0x11, 0x5b, 0x61, 0x83, 0xda, 0xe6, 0xa7,
0x12, 0x09, 0x0d, 0xea, 0x36, 0x0a, 0xf2, 0x4c, 0x77, 0x1f, 0xf4, 0x20, 0xa0, 0xef, 0x6e, 0x7d,
0xd6, 0x3a, 0x39, 0x30, 0x73, 0x76, 0xd3, 0xa5, 0xf7, 0x9c, 0x00, 0x29, 0xe8, 0x6e, 0xba, 0xc4,
0x1f, 0x13, 0xac, 0xf7, 0x62, 0xe1, 0x23, 0xf9, 0x58, 0xb0, 0x37, 0xcd, 0xb3, 0x72, 0xa4, 0xb8,
0x52, 0xde, 0x7a, 0x58, 0xfe, 0xb0, 0x1b, 0xb4, 0x17, 0x60, 0x4f, 0x4a, 0x3e, 0x65, 0x55, 0xa5,
0xbf, 0x98, 0xe8, 0xdf, 0x30, 0xd2, 0xb2, 0x11, 0xf8, 0x5e, 0xe2, 0xbd, 0x30, 0x64, 0x7b, 0x46,
0x8b, 0xec, 0x37, 0x84, 0x1e, 0xa0, 0x9a, 0xed, 0xcf, 0x07, 0xad, 0x75, 0x72, 0x76, 0x7a, 0x69,
0xa9, 0xfb, 0xd1, 0xa0, 0x87, 0xa8, 0x3a, 0xf6, 0xbd, 0xa0, 0x47, 0x3d, 0x48, 0xed, 0xea, 0x8b,
0xe8, 0xad, 0x43, 0x3e, 0x1b, 0xb3, 0x3c, 0x19, 0x7e, 0xdf, 0xbf, 0x42, 0xcb, 0x67, 0xa3, 0xfa,
0x67, 0x63, 0xf4, 0x16, 0x25, 0xb6, 0x97, 0x00, 0x77, 0xd9, 0xf9, 0x62, 0x36, 0x16, 0xb1, 0x00,
0x97, 0x00, 0xe5, 0xef, 0xa3, 0x5a, 0x40, 0x5c, 0x02, 0xf4, 0x00, 0x60, 0x6f, 0x52, 0x32, 0x86,
0xda, 0xab, 0x05, 0x41, 0x7b, 0x1a, 0xb0, 0x59, 0x84, 0xb1, 0x57, 0x27, 0xea, 0xf0, 0xd2, 0x9e,
0xd5, 0x91, 0x52, 0x22, 0x8b, 0x68, 0x53, 0x76, 0x70, 0xab, 0xea, 0xcb, 0x6f, 0xb8, 0x2c, 0xe6,
0xf3, 0xb8, 0x5c, 0x81, 0xc1, 0xad, 0x6b, 0xe9, 0x00, 0xc4, 0xe0, 0x46, 0x41, 0x3b, 0x6b, 0x9b,
0x66, 0x9e, 0x5e, 0xed, 0xf3, 0x92, 0x2f, 0x44, 0x9a, 0x33, 0xf8, 0x1d, 0x0f, 0xd3, 0xa0, 0x2e,
0x43, 0xcc, 0x5a, 0x8a, 0xb5, 0x59, 0xae, 0x24, 0xd4, 0x7d, 0x42, 0xf9, 0x1d, 0xe5, 0x4a, 0xf0,
0x12, 0x3e, 0x4f, 0x54, 0x56, 0x20, 0x44, 0x64, 0xb9, 0x24, 0x0c, 0xfa, 0xfe, 0x24, 0xcd, 0x67,
0x68, 0xdf, 0x9f, 0xb8, 0x5f, 0x21, 0xbd, 0x43, 0x03, 0x76, 0x42, 0xa9, 0x46, 0x53, 0x13, 0x40,
0xbf, 0x19, 0x8b, 0x36, 0xba, 0x4b, 0x10, 0x13, 0x0a, 0x27, 0x81, 0xab, 0x97, 0x05, 0xcb, 0x59,
0xd2, 0xdc, 0x9a, 0xc3, 0x5c, 0x79, 0x44, 0xd0, 0x15, 0x24, 0x6d, 0x2c, 0x92, 0xf2, 0xd3, 0x45,
0x7e, 0x52, 0xf2, 0x8b, 0x34, 0x63, 0x25, 0x88, 0x45, 0x4a, 0xdd, 0x91, 0x13, 0xb1, 0x08, 0xe3,
0xec, 0xf5, 0x0b, 0x29, 0xf5, 0x3e, 0x06, 0x3e, 0x29, 0xe3, 0x29, 0xbc, 0x7e, 0xa1, 0x6c, 0xb4,
0x31, 0xe2, 0x64, 0x30, 0x80, 0x3b, 0x89, 0x8e, 0x72, 0x9d, 0xaf, 0xe4, 0xf8, 0xd0, 0x6f, 0x66,
0xca, 0x6f, 0x73, 0x56, 0x20, 0xd1, 0xd1, 0xe6, 0x30, 0x92, 0x48, 0x74, 0xc2, 0x1a, 0x76, 0x29,
0x91, 0xdc, 0xb1, 0xbe, 0x56, 0x04, 0x96, 0x12, 0x65, 0xa3, 0x11, 0x12, 0x4b, 0x49, 0x0b, 0x02,
0x01, 0xa9, 0x99, 0x06, 0x33, 0x34, 0x20, 0x19, 0x69, 0x30, 0x20, 0xb9, 0x94, 0x0d, 0x14, 0x07,
0x79, 0x2a, 0xd2, 0x38, 0x1b, 0x33, 0x71, 0x12, 0x97, 0xf1, 0x9c, 0x09, 0x56, 0xc2, 0x40, 0xa1,
0x91, 0x91, 0xc7, 0x10, 0x81, 0x82, 0x62, 0xb5, 0xc3, 0xdf, 0x8e, 0xde, 0xa9, 0xd7, 0x7d, 0x96,
0xeb, 0x3f, 0xfb, 0xf1, 0x42, 0xfe, 0xbd, 0xa0, 0xe1, 0xbb, 0xc6, 0xc6, 0x58, 0x94, 0x2c, 0x9e,
0x37, 0xb6, 0xdf, 0x36, 0xbf, 0x4b, 0xf0, 0xc9, 0xa0, 0x1e, 0xcf, 0xc7, 0x5c, 0xa4, 0x17, 0xf5,
0x36, 0x5b, 0xbf, 0x41, 0x04, 0xc6, 0xb3, 0x2b, 0x1e, 0x05, 0xbe, 0xec, 0x81, 0x71, 0x36, 0x4e,
0xbb, 0xd2, 0x53, 0x56, 0x64, 0x30, 0x4e, 0x7b, 0xda, 0x12, 0x20, 0xe2, 0x34, 0x0a, 0xda, 0xc9,
0xe9, 0x8a, 0x27, 0x2c, 0x5c, 0x99, 0x09, 0xeb, 0x57, 0x99, 0x89, 0xf7, 0x52, 0x46, 0x16, 0xbd,
0x73, 0xc4, 0xe6, 0xe7, 0xac, 0xac, 0x2e, 0xd3, 0x62, 0xbf, 0x4e, 0xb8, 0x62, 0xb1, 0x80, 0xaf,
0x2d, 0x5a, 0x62, 0x64, 0x10, 0x22, 0x2b, 0x25, 0x50, 0xbb, 0x12, 0x58, 0xe0, 0xa0, 0x3a, 0x8e,
0xe7, 0x4c, 0x7e, 0xa7, 0x04, 0xac, 0x04, 0x8e, 0x11, 0x07, 0x22, 0x56, 0x02, 0x12, 0x76, 0xde,
0xef, 0xb2, 0xcc, 0x29, 0x9b, 0xd5, 0x23, 0xac, 0x3c, 0x89, 0x57, 0x73, 0x96, 0x0b, 0x6d, 0x12,
0x9c, 0xc9, 0x3b, 0x26, 0x71, 0x9e, 0x38, 0x93, 0xef, 0xa3, 0xe7, 0x84, 0x26, 0xaf, 0xe1, 0x4f,
0x78, 0x29, 0xd4, 0x1f, 0xf5, 0x39, 0x2b, 0x33, 0x10, 0x9a, 0xfc, 0x46, 0xf5, 0x48, 0x22, 0x34,
0x85, 0x35, 0x9c, 0xaf, 0xe1, 0x7b, 0x65, 0x78, 0xc5, 0x4a, 0x33, 0x4e, 0x5e, 0xcc, 0xe3, 0x34,
0xd3, 0xa3, 0xe1, 0x07, 0x01, 0xdb, 0x84, 0x0e, 0xf1, 0x35, 0xfc, 0xbe, 0xba, 0xce, 0xdf, 0x0f,
0x08, 0x97, 0x10, 0x3c, 0x22, 0xe8, 0xb0, 0x4f, 0x3c, 0x22, 0xe8, 0xd6, 0xb2, 0x3b, 0x77, 0xcb,
0x4a, 0x6e, 0x25, 0x89, 0x1d, 0x9e, 0xc0, 0xf3, 0x42, 0xc7, 0x26, 0x00, 0x89, 0x9d, 0x7b, 0x50,
0xc1, 0xa6, 0x06, 0x16, 0xdb, 0x4b, 0xf3, 0x38, 0x4b, 0x7f, 0x02, 0xd3, 0x7a, 0xc7, 0x4e, 0x43,
0x10, 0xa9, 0x01, 0x4e, 0x62, 0xae, 0xf6, 0x99, 0x98, 0xa4, 0x75, 0xe8, 0x7f, 0x18, 0x68, 0x37,
0x49, 0x74, 0xbb, 0x72, 0x48, 0xe7, 0x8b, 0xb7, 0xb0, 0x59, 0xb7, 0x8b, 0x62, 0x5c, 0xaf, 0xaa,
0xa7, 0x6c, 0xca, 0xd2, 0x42, 0x0c, 0x3f, 0x09, 0xb7, 0x15, 0xc0, 0x89, 0x8b, 0x16, 0x3d, 0xd4,
0x9c, 0xc7, 0xf7, 0x75, 0x2c, 0x19, 0xab, 0xbf, 0x76, 0x77, 0x56, 0xb1, 0x52, 0x27, 0x1a, 0xfb,
0x4c, 0x80, 0xd9, 0xe9, 0x70, 0x23, 0x07, 0xac, 0x2b, 0x4a, 0xcc, 0xce, 0xb0, 0x86, 0x3d, 0xec,
0x73, 0xb8, 0x53, 0x56, 0xf1, 0x6c, 0xc9, 0xe4, 0x7d, 0xc3, 0x0d, 0xd2, 0x98, 0x43, 0x11, 0x87,
0x7d, 0x34, 0x6d, 0xb3, 0xb5, 0xb6, 0xdb, 0xed, 0x7c, 0x75, 0x00, 0xaf, 0x4c, 0x20, 0x96, 0x24,
0x46, 0x64, 0x6b, 0x01, 0xdc, 0x39, 0x0c, 0x2f, 0x79, 0x9c, 0x4c, 0xe3, 0x4a, 0x9c, 0xc4, 0xab,
0x8c, 0xc7, 0x89, 0x5c, 0xd7, 0xe1, 0x61, 0x78, 0xc3, 0x8c, 0x5c, 0x88, 0x3a, 0x0c, 0xa7, 0x60,
0x37, 0x3b, 0x93, 0x7f, 0xc4, 0x4f, 0xdf, 0xe5, 0x84, 0xd9, 0x99, 0x2c, 0x2f, 0xbc, 0xc7, 0x79,
0x2f, 0x0c, 0xd9, 0x77, 0xd0, 0x94, 0x48, 0xa6, 0x21, 0x77, 0x30, 0x1d, 0x2f, 0x01, 0xf9, 0x20,
0x40, 0xd8, 0xaf, 0x7c, 0xa8, 0xdf, 0x9b, 0xbf, 0x43, 0x23, 0xf4, 0x77, 0xc1, 0x37, 0x30, 0x5d,
0x17, 0x1a, 0xb9, 0x1f, 0x8b, 0xd8, 0xec, 0x49, 0xdb, 0x34, 0x73, 0xe7, 0x32, 0x16, 0xdb, 0x49,
0x72, 0xc4, 0x2a, 0xe4, 0x85, 0xf2, 0x5a, 0x38, 0xb2, 0x52, 0x22, 0xcd, 0x6c, 0x53, 0x76, 0xa0,
0xd7, 0xb2, 0x17, 0x49, 0x2a, 0xb4, 0xac, 0xb9, 0x21, 0xbd, 0xd1, 0x36, 0xd0, 0xa6, 0x88, 0x5a,
0xd1, 0xb4, 0x8d, 0xe5, 0x35, 0x33, 0xe1, 0xb3, 0x59, 0xc6, 0x34, 0x74, 0xca, 0x62, 0xf5, 0x59,
0xc4, 0xad, 0xb6, 0x2d, 0x14, 0x24, 0x62, 0x79, 0x50, 0xc1, 0xa6, 0x91, 0x35, 0xa6, 0x1e, 0x49,
0x35, 0x0d, 0xbb, 0xd6, 0x36, 0xe3, 0x01, 0x44, 0x1a, 0x89, 0x82, 0xf6, 0xbd, 0xb7, 0x5a, 0xbc,
0xcf, 0x9a, 0x96, 0x80, 0x1f, 0x74, 0x92, 0xca, 0x8e, 0x98, 0x78, 0xef, 0x0d, 0xc1, 0xec, 0x3e,
0x01, 0x78, 0x78, 0xbe, 0x3a, 0x48, 0xe0, 0x3e, 0x01, 0xea, 0x4b, 0x86, 0xd8, 0x27, 0x50, 0xac,
0xdf, 0x75, 0xe6, 0xdc, 0xeb, 0x30, 0xae, 0x6c, 0xe5, 0x90, 0xae, 0x43, 0xc1, 0x50, 0xd7, 0x51,
0x0a, 0x7e, 0x93, 0xba, 0x47, 0x6b, 0x48, 0x93, 0x62, 0xe7, 0x6a, 0x0f, 0xba, 0x30, 0x1b, 0x97,
0xcc, 0x7e, 0x52, 0x5e, 0x59, 0xc2, 0xff, 0x1e, 0x82, 0x12, 0x12, 0x71, 0xa9, 0x05, 0x29, 0xdb,
0xcf, 0x3f, 0xf8, 0xcf, 0xaf, 0x6e, 0x0d, 0x7e, 0xf6, 0xd5, 0xad, 0xc1, 0x7f, 0x7f, 0x75, 0x6b,
0xf0, 0xd3, 0xaf, 0x6f, 0x7d, 0xeb, 0x67, 0x5f, 0xdf, 0xfa, 0xd6, 0x7f, 0x7d, 0x7d, 0xeb, 0x5b,
0x5f, 0xbe, 0xa5, 0xff, 0xb8, 0xeb, 0xf9, 0xcf, 0xc9, 0x3f, 0xd1, 0xfa, 0xec, 0xff, 0x02, 0x00,
0x00, 0xff, 0xff, 0x4c, 0x64, 0x5e, 0x0f, 0x00, 0x76, 0x00, 0x00,
}
// This is a compile-time assertion to ensure that this generated file
@ -471,6 +472,7 @@ type ClientCommandsHandler interface {
ObjectImportNotionValidateToken(context.Context, *pb.RpcObjectImportNotionValidateTokenRequest) *pb.RpcObjectImportNotionValidateTokenResponse
ObjectImportUseCase(context.Context, *pb.RpcObjectImportUseCaseRequest) *pb.RpcObjectImportUseCaseResponse
ObjectImportExperience(context.Context, *pb.RpcObjectImportExperienceRequest) *pb.RpcObjectImportExperienceResponse
ObjectDateByTimestamp(context.Context, *pb.RpcObjectDateByTimestampRequest) *pb.RpcObjectDateByTimestampResponse
// Collections
// ***
ObjectCollectionAdd(context.Context, *pb.RpcObjectCollectionAddRequest) *pb.RpcObjectCollectionAddResponse
@ -2522,6 +2524,26 @@ func ObjectImportExperience(b []byte) (resp []byte) {
return resp
}
func ObjectDateByTimestamp(b []byte) (resp []byte) {
defer func() {
if PanicHandler != nil {
if r := recover(); r != nil {
resp, _ = (&pb.RpcObjectDateByTimestampResponse{Error: &pb.RpcObjectDateByTimestampResponseError{Code: pb.RpcObjectDateByTimestampResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal()
PanicHandler(r)
}
}
}()
in := new(pb.RpcObjectDateByTimestampRequest)
if err := in.Unmarshal(b); err != nil {
resp, _ = (&pb.RpcObjectDateByTimestampResponse{Error: &pb.RpcObjectDateByTimestampResponseError{Code: pb.RpcObjectDateByTimestampResponseError_BAD_INPUT, Description: err.Error()}}).Marshal()
return resp
}
resp, _ = clientCommandsHandler.ObjectDateByTimestamp(context.Background(), in).Marshal()
return resp
}
func ObjectCollectionAdd(b []byte) (resp []byte) {
defer func() {
if PanicHandler != nil {
@ -6250,6 +6272,8 @@ func CommandAsync(cmd string, data []byte, callback func(data []byte)) {
cd = ObjectImportUseCase(data)
case "ObjectImportExperience":
cd = ObjectImportExperience(data)
case "ObjectDateByTimestamp":
cd = ObjectDateByTimestamp(data)
case "ObjectCollectionAdd":
cd = ObjectCollectionAdd(data)
case "ObjectCollectionRemove":
@ -7900,6 +7924,20 @@ func (h *ClientCommandsHandlerProxy) ObjectImportExperience(ctx context.Context,
call, _ := actualCall(ctx, req)
return call.(*pb.RpcObjectImportExperienceResponse)
}
func (h *ClientCommandsHandlerProxy) ObjectDateByTimestamp(ctx context.Context, req *pb.RpcObjectDateByTimestampRequest) *pb.RpcObjectDateByTimestampResponse {
actualCall := func(ctx context.Context, req any) (any, error) {
return h.client.ObjectDateByTimestamp(ctx, req.(*pb.RpcObjectDateByTimestampRequest)), nil
}
for _, interceptor := range h.interceptors {
toCall := actualCall
currentInterceptor := interceptor
actualCall = func(ctx context.Context, req any) (any, error) {
return currentInterceptor(ctx, req, "ObjectDateByTimestamp", toCall)
}
}
call, _ := actualCall(ctx, req)
return call.(*pb.RpcObjectDateByTimestampResponse)
}
func (h *ClientCommandsHandlerProxy) ObjectCollectionAdd(ctx context.Context, req *pb.RpcObjectCollectionAddRequest) *pb.RpcObjectCollectionAddResponse {
actualCall := func(ctx context.Context, req any) (any, error) {
return h.client.ObjectCollectionAdd(ctx, req.(*pb.RpcObjectCollectionAddRequest)), nil

View file

@ -47,6 +47,7 @@ import (
"github.com/anyproto/anytype-heart/core/block/editor/lastused"
"github.com/anyproto/anytype-heart/core/block/export"
importer "github.com/anyproto/anytype-heart/core/block/import"
"github.com/anyproto/anytype-heart/core/block/object/idderiver/idderiverimpl"
"github.com/anyproto/anytype-heart/core/block/object/idresolver"
"github.com/anyproto/anytype-heart/core/block/object/objectcreator"
"github.com/anyproto/anytype-heart/core/block/object/objectgraph"
@ -259,6 +260,7 @@ func Bootstrap(a *app.App, components ...app.Component) {
Register(source.New()).
Register(spacefactory.New()).
Register(space.New()).
Register(idderiverimpl.New()).
Register(deletioncontroller.New()).
Register(invitestore.New()).
Register(filesync.New()).

View file

@ -4,6 +4,7 @@ import (
"context"
"fmt"
"slices"
"sort"
"strings"
"time"
@ -22,6 +23,7 @@ import (
"github.com/anyproto/anytype-heart/util/dateutil"
"github.com/anyproto/anytype-heart/util/pbtypes"
"github.com/anyproto/anytype-heart/util/slice"
timeutil "github.com/anyproto/anytype-heart/util/time"
)
var ErrBundledTypeIsReadonly = fmt.Errorf("can't modify bundled object type")
@ -92,8 +94,10 @@ func (s *service) objectTypeSetRelations(
}
func (s *service) ListRelationsWithValue(spaceId string, value *types.Value) ([]*pb.RpcRelationListWithValueResponseResponseItem, error) {
countersByKeys := make(map[string]int64)
detailHandlesValue := generateFilter(value)
var (
countersByKeys = make(map[string]int64)
detailHandlesValue = generateFilter(value)
)
err := s.store.SpaceIndex(spaceId).QueryIterate(database.Query{Filters: nil}, func(details *types.Struct) {
for key, valueToCheck := range details.Fields {
@ -112,9 +116,17 @@ func (s *service) ListRelationsWithValue(spaceId string, value *types.Value) ([]
}
keys := maps.Keys(countersByKeys)
slices.Sort(keys)
list := make([]*pb.RpcRelationListWithValueResponseResponseItem, len(keys))
sort.Slice(keys, func(i, j int) bool {
if keys[i] == bundle.RelationKeyMentions.String() {
return true
}
if keys[j] == bundle.RelationKeyMentions.String() {
return false
}
return keys[i] < keys[j]
})
list := make([]*pb.RpcRelationListWithValueResponseResponseItem, len(keys))
for i, key := range keys {
list[i] = &pb.RpcRelationListWithValueResponseResponseItem{
RelationKey: key,
@ -151,23 +163,26 @@ func generateFilter(value *types.Value) func(v *types.Value) bool {
return equalOrHasFilter
}
ts, err := dateutil.ParseDateId(stringValue)
// date object section
dateObject, err := dateutil.BuildDateObjectFromId(stringValue)
if err != nil {
log.Error("failed to parse Date object id", zap.Error(err))
return equalOrHasFilter
}
shortId := dateutil.TimeToDateId(ts)
start := ts.Truncate(24 * time.Hour)
start := timeutil.CutToDay(dateObject.Time())
end := start.Add(24 * time.Hour)
startTimestamp := start.Unix()
endTimestamp := end.Unix()
startDateObject := dateutil.NewDateObject(start, false)
shortId := startDateObject.Id()
// filter for date objects is able to find relations with values between the borders of queried day
// - for relations with number format it checks timestamp value is between timestamps of this day midnights
// - for relations carrying string list it checks if some of the strings has day prefix, e.g.
// if _date_2023-12-12-08-30-50 is queried, then all relations with prefix _date_2023-12-12 will be returned
// if _date_2023-12-12-08-30-50Z-0200 is queried, then all relations with prefix _date_2023-12-12 will be returned
return func(v *types.Value) bool {
numberValue := int64(v.GetNumberValue())
if numberValue >= startTimestamp && numberValue < endTimestamp {

View file

@ -54,12 +54,12 @@ func TestService_ListRelationsWithValue(t *testing.T) {
bundle.RelationKeyLastModifiedDate: pbtypes.Int64(now.Add(-1 * time.Minute).Unix()),
bundle.RelationKeyIsFavorite: pbtypes.Bool(true),
"daysTillSummer": pbtypes.Int64(300),
bundle.RelationKeyLinks: pbtypes.StringList([]string{"obj2", "obj3", dateutil.TimeToDateId(now.Add(-30 * time.Minute))}),
bundle.RelationKeyLinks: pbtypes.StringList([]string{"obj2", "obj3", dateutil.NewDateObject(now.Add(-30*time.Minute), true).Id()}),
},
{
bundle.RelationKeyId: pbtypes.String("obj2"),
bundle.RelationKeySpaceId: pbtypes.String(spaceId),
bundle.RelationKeyName: pbtypes.String(dateutil.TimeToDateId(now)),
bundle.RelationKeyName: pbtypes.String(dateutil.NewDateObject(now, true).Id()),
bundle.RelationKeyCreatedDate: pbtypes.Int64(now.Add(-24*time.Hour - 5*time.Minute).Unix()),
bundle.RelationKeyAddedDate: pbtypes.Int64(now.Add(-24*time.Hour - 3*time.Minute).Unix()),
bundle.RelationKeyLastModifiedDate: pbtypes.Int64(now.Add(-1 * time.Minute).Unix()),
@ -73,7 +73,7 @@ func TestService_ListRelationsWithValue(t *testing.T) {
bundle.RelationKeyLastModifiedDate: pbtypes.Int64(now.Unix()),
bundle.RelationKeyIsFavorite: pbtypes.Bool(true),
bundle.RelationKeyCoverX: pbtypes.Int64(300),
bundle.RelationKeyMentions: pbtypes.StringList([]string{dateutil.TimeToDateId(now), dateutil.TimeToDateId(now.Add(-24 * time.Hour))}),
bundle.RelationKeyMentions: pbtypes.StringList([]string{dateutil.NewDateObject(now, true).Id(), dateutil.NewDateObject(now.Add(-24*time.Hour), true).Id()}),
},
})
@ -86,23 +86,23 @@ func TestService_ListRelationsWithValue(t *testing.T) {
}{
{
"date object - today",
pbtypes.String(dateutil.TimeToDateId(now)),
pbtypes.String(dateutil.NewDateObject(now, true).Id()),
[]*pb.RpcRelationListWithValueResponseResponseItem{
{bundle.RelationKeyMentions.String(), 1},
{bundle.RelationKeyAddedDate.String(), 1},
{bundle.RelationKeyCreatedDate.String(), 2},
{bundle.RelationKeyLastModifiedDate.String(), 3},
{bundle.RelationKeyLinks.String(), 1},
{bundle.RelationKeyMentions.String(), 1},
{bundle.RelationKeyName.String(), 1},
},
},
{
"date object - yesterday",
pbtypes.String(dateutil.TimeToDateId(now.Add(-24 * time.Hour))),
pbtypes.String(dateutil.NewDateObject(now.Add(-24*time.Hour), true).Id()),
[]*pb.RpcRelationListWithValueResponseResponseItem{
{bundle.RelationKeyMentions.String(), 1},
{bundle.RelationKeyAddedDate.String(), 1},
{bundle.RelationKeyCreatedDate.String(), 1},
{bundle.RelationKeyMentions.String(), 1},
},
},
{
@ -123,7 +123,7 @@ func TestService_ListRelationsWithValue(t *testing.T) {
},
{
"string list",
pbtypes.StringList([]string{"obj2", "obj3", dateutil.TimeToDateId(now.Add(-30 * time.Minute))}),
pbtypes.StringList([]string{"obj2", "obj3", dateutil.NewDateObject(now.Add(-30*time.Minute), true).Id()}),
[]*pb.RpcRelationListWithValueResponseResponseItem{
{bundle.RelationKeyLinks.String(), 1},
},

View file

@ -32,6 +32,7 @@ func (sb *smartBlock) injectLinksDetails(s *state.State) {
NoSystemRelations: true,
NoHiddenBundledRelations: true,
NoImages: true,
RoundDateIdsToDay: true,
})
links = slice.RemoveMut(links, sb.Id())
s.SetLocalDetail(bundle.RelationKeyLinks.String(), pbtypes.StringList(links))

View file

@ -512,8 +512,8 @@ func (sb *smartBlock) fetchMeta() (details []*model.ObjectViewDetailsSet, err er
func (sb *smartBlock) partitionIdsBySpace(ids []string) map[string][]string {
perSpace := map[string][]string{}
for _, id := range ids {
if _, parseErr := dateutil.ParseDateId(id); parseErr == nil {
perSpace[sb.space.Id()] = append(perSpace[sb.space.Id()], id)
if dateObject, parseErr := dateutil.BuildDateObjectFromId(id); parseErr == nil {
perSpace[sb.space.Id()] = append(perSpace[sb.space.Id()], dateObject.Id())
continue
}

View file

@ -239,7 +239,7 @@ func (t *TextObject) handleDateMention(rt api.RichText,
if rt.Mention.Date.End != "" {
textDate = rt.Mention.Date.End
}
date, err := dateutil.ParseDateId(textDate)
dateObject, err := dateutil.BuildDateObjectFromId(textDate)
if err != nil {
return nil
}
@ -252,7 +252,7 @@ func (t *TextObject) handleDateMention(rt api.RichText,
To: int32(to),
},
Type: model.BlockContentTextMark_Mention,
Param: dateutil.TimeToDateId(date),
Param: dateObject.Id(),
},
}
}

View file

@ -0,0 +1,14 @@
package idderiver
import (
"context"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/anytype-heart/core/domain"
)
type Deriver interface {
app.Component
DeriveObjectId(ctx context.Context, spaceId string, key domain.UniqueKey) (id string, err error)
}

View file

@ -0,0 +1,39 @@
package idderiverimpl
import (
"context"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/anytype-heart/core/block/object/idderiver"
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/space"
)
const CName = "object-id-deriver"
type Deriver struct {
spaceService space.Service
}
func New() idderiver.Deriver {
return &Deriver{}
}
func (d *Deriver) Name() string {
return CName
}
func (d *Deriver) Init(a *app.App) error {
d.spaceService = app.MustComponent[space.Service](a)
return nil
}
func (d *Deriver) DeriveObjectId(ctx context.Context, spaceId string, key domain.UniqueKey) (id string, err error) {
spc, err := d.spaceService.Get(ctx, spaceId)
if err != nil {
return "", err
}
return spc.DeriveObjectID(ctx, key)
}

View file

@ -3,6 +3,7 @@ package objectcreator
import (
"context"
"fmt"
"time"
"github.com/anyproto/any-sync/app"
"github.com/gogo/protobuf/types"
@ -183,30 +184,20 @@ func (s *service) createObjectFromTemplate(
// buildDateObject does not create real date object. It just builds date object details
func buildDateObject(space clientspace.Space, details *types.Struct) (string, *types.Struct, error) {
name := pbtypes.GetString(details, bundle.RelationKeyName.String())
id, err := dateutil.DateNameToId(name)
if err != nil {
return "", nil, fmt.Errorf("failed to build date object, as its name is invalid: %w", err)
}
ts := pbtypes.GetInt64(details, bundle.RelationKeyTimestamp.String())
dateObject := dateutil.NewDateObject(time.Unix(ts, 0), false)
typeId, err := space.GetTypeIdByKey(context.Background(), bundle.TypeKeyDate)
if err != nil {
return "", nil, fmt.Errorf("failed to find Date type to build Date object: %w", err)
}
// TODO: GO-4494 - Remove links relation id fetch
linksRelationId, err := space.GetRelationIdByKey(context.Background(), bundle.RelationKeyLinks)
if err != nil {
return "", nil, fmt.Errorf("get links relation id: %w", err)
}
dateSource := source.NewDate(source.DateSourceParams{
Id: domain.FullID{
ObjectID: id,
ObjectID: dateObject.Id(),
SpaceID: space.Id(),
},
DateObjectTypeId: typeId,
LinksRelationId: linksRelationId,
})
detailsGetter, ok := dateSource.(source.SourceIdEndodedDetails)
@ -215,5 +206,5 @@ func buildDateObject(space clientspace.Space, details *types.Struct) (string, *t
}
details, err = detailsGetter.DetailsFromId()
return id, details, err
return dateObject.Id(), details, err
}

View file

@ -117,45 +117,21 @@ func TestService_CreateObject(t *testing.T) {
assert.Equal(t, bundle.TypeKeyDate, key)
return bundle.TypeKeyDate.URL(), nil
})
// TODO: GO-4494 - Remove links relation id fetch
f.spc.EXPECT().GetRelationIdByKey(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, key domain.RelationKey) (string, error) {
assert.Equal(t, bundle.RelationKeyLinks, key)
return bundle.RelationKeyLinks.URL(), nil
})
ts := time.Now()
name := dateutil.TimeToDateName(ts)
dateObject := dateutil.NewDateObject(ts, false)
// when
id, details, err := f.service.CreateObject(context.Background(), spaceId, CreateObjectRequest{
ObjectTypeKey: bundle.TypeKeyDate,
Details: &types.Struct{Fields: map[string]*types.Value{
bundle.RelationKeyName.String(): pbtypes.String(name),
bundle.RelationKeyTimestamp.String(): pbtypes.Int64(dateObject.Time().Unix()),
}},
})
// then
assert.NoError(t, err)
assert.True(t, strings.HasPrefix(id, dateutil.TimeToDateId(ts)))
assert.True(t, strings.HasPrefix(id, dateObject.Id()))
assert.Equal(t, spaceId, pbtypes.GetString(details, bundle.RelationKeySpaceId.String()))
assert.Equal(t, bundle.TypeKeyDate.URL(), pbtypes.GetString(details, bundle.RelationKeyType.String()))
})
t.Run("date object creation - invalid name", func(t *testing.T) {
// given
f := newFixture(t)
f.spaceService.EXPECT().Get(mock.Anything, mock.Anything).Return(f.spc, nil)
ts := time.Now()
name := ts.Format(time.RFC3339)
// when
_, _, err := f.service.CreateObject(context.Background(), spaceId, CreateObjectRequest{
ObjectTypeKey: bundle.TypeKeyDate,
Details: &types.Struct{Fields: map[string]*types.Value{
bundle.RelationKeyName.String(): pbtypes.String(name),
}},
})
// then
assert.Error(t, err)
})
}

View file

@ -128,7 +128,9 @@ func (gr *Builder) buildGraph(
outgoingRelationLink := make(map[string]struct{}, 10)
edges = gr.appendRelations(rec, relations, edges, existedNodes, sourceId, outgoingRelationLink)
edges = gr.appendLinks(req.SpaceId, rec, outgoingRelationLink, existedNodes, edges, sourceId)
var nodesToAdd []*types.Struct
nodesToAdd, edges = gr.appendLinks(req.SpaceId, rec, outgoingRelationLink, existedNodes, edges, sourceId)
nodes = append(nodes, pbtypes.MapN(nodesToAdd, req.Keys...)...)
}
return nodes, edges
}
@ -191,26 +193,45 @@ func (gr *Builder) appendLinks(
existedNodes map[string]struct{},
edges []*pb.RpcObjectGraphEdge,
id string,
) []*pb.RpcObjectGraphEdge {
) (nodes []*types.Struct, resultEdges []*pb.RpcObjectGraphEdge) {
links := pbtypes.GetStringList(rec, bundle.RelationKeyLinks.String())
for _, link := range links {
sbType, err := gr.sbtProvider.Type(spaceID, link)
if err != nil {
log.Error("get smartblock type", zap.String("objectId", link), zap.Error(err))
}
// ignore files because we index all file blocks as outgoing links
if sbType != smartblock.SmartBlockTypeFileObject {
if _, exists := outgoingRelationLink[link]; !exists {
if _, exists := existedNodes[link]; exists {
edges = append(edges, &pb.RpcObjectGraphEdge{
Source: id,
Target: link,
Name: "",
Type: pb.RpcObjectGraphEdge_Link,
})
switch sbType {
case smartblock.SmartBlockTypeFileObject:
// ignore files because we index all file blocks as outgoing links
continue
case smartblock.SmartBlockTypeDate:
if _, exists := existedNodes[link]; !exists {
details, err := gr.objectStore.SpaceIndex(spaceID).QueryByIds([]string{link})
if err == nil && len(details) != 1 {
err = fmt.Errorf("expected to get 1 date object, got %d", len(details))
}
if err != nil {
log.Error("get details of Date object", zap.String("objectId", link), zap.Error(err))
continue
}
existedNodes[link] = struct{}{}
nodes = append(nodes, details[0].Details)
}
}
if _, exists := outgoingRelationLink[link]; exists {
continue
}
if _, exists := existedNodes[link]; exists {
edges = append(edges, &pb.RpcObjectGraphEdge{
Source: id,
Target: link,
Name: "",
Type: pb.RpcObjectGraphEdge_Link,
})
}
}
return edges
return nodes, edges
}

View file

@ -2,10 +2,12 @@ package objectgraph
import (
"testing"
"time"
"github.com/gogo/protobuf/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
"github.com/anyproto/anytype-heart/core/relationutils"
"github.com/anyproto/anytype-heart/core/subscription"
@ -17,6 +19,7 @@ import (
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore/spaceindex"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/space/spacecore/typeprovider/mock_typeprovider"
"github.com/anyproto/anytype-heart/util/dateutil"
"github.com/anyproto/anytype-heart/util/pbtypes"
)
@ -86,13 +89,14 @@ func Test(t *testing.T) {
assert.NoError(t, err)
assert.Equal(t, "links", req.Keys[0])
assert.Equal(t, 4, len(req.Keys))
assert.True(t, len(graph) == 0)
assert.True(t, len(edges) == 0)
assert.Empty(t, graph)
assert.Empty(t, edges)
})
t.Run("graph", func(t *testing.T) {
fx := newFixture(t)
spaceId := "space1"
dateObject := dateutil.NewDateObject(time.Now(), false)
fx.objectStoreMock.AddObjects(t, spaceId, []spaceindex.TestObject{
{
bundle.RelationKeyId: pbtypes.String("rel1"),
@ -119,12 +123,18 @@ func Test(t *testing.T) {
bundle.RelationKeyRelationFormat: pbtypes.Int64(int64(model.RelationFormat_object)),
},
})
fx.objectStoreMock.AddVirtualDetails(dateObject.Id(), &types.Struct{Fields: map[string]*types.Value{
bundle.RelationKeyId.String(): pbtypes.String(dateObject.Id()),
bundle.RelationKeyLayout.String(): pbtypes.Int64(int64(model.ObjectType_date)),
bundle.RelationKeyName.String(): pbtypes.String(dateObject.Name()),
bundle.RelationKeyTimestamp.String(): pbtypes.Int64(dateObject.Time().Unix()),
}})
fx.subscriptionServiceMock.EXPECT().Search(mock.Anything).Return(&subscription.SubscribeResponse{
Records: []*types.Struct{
{Fields: map[string]*types.Value{
bundle.RelationKeyId.String(): pbtypes.String("id1"),
bundle.RelationKeyAssignee.String(): pbtypes.String("id2"),
bundle.RelationKeyLinks.String(): pbtypes.StringList([]string{"id2", "id3"}),
bundle.RelationKeyLinks.String(): pbtypes.StringList([]string{"id2", "id3", dateObject.Id()}),
}},
{Fields: map[string]*types.Value{
bundle.RelationKeyId.String(): pbtypes.String("id2"),
@ -135,19 +145,27 @@ func Test(t *testing.T) {
},
}, nil)
fx.subscriptionServiceMock.EXPECT().Unsubscribe(mock.Anything).Return(nil)
fx.sbtProviderMock.EXPECT().Type(mock.Anything, mock.Anything).Return(smartblock.SmartBlockTypePage, nil)
fx.sbtProviderMock.EXPECT().Type(mock.Anything, mock.Anything).RunAndReturn(func(spcId string, id string) (smartblock.SmartBlockType, error) {
require.Equal(t, spcId, spaceId)
if _, err := dateutil.BuildDateObjectFromId(id); err == nil {
return smartblock.SmartBlockTypeDate, err
}
return smartblock.SmartBlockTypePage, nil
})
req := &pb.RpcObjectGraphRequest{
SpaceId: spaceId,
}
graph, edges, err := fx.ObjectGraph(req)
assert.NoError(t, err)
assert.True(t, len(graph) == 3)
assert.True(t, len(edges) == 2)
require.Len(t, graph, 4)
require.Len(t, edges, 3)
assert.Equal(t, "id1", edges[0].Source)
assert.Equal(t, "id2", edges[0].Target)
assert.Equal(t, "id1", edges[1].Source)
assert.Equal(t, "id3", edges[1].Target)
assert.Equal(t, "id1", edges[2].Source)
assert.Equal(t, dateObject.Id(), edges[2].Target)
})
}

View file

@ -41,7 +41,8 @@ type Flags struct {
DataviewBlockOnlyTarget,
NoSystemRelations,
NoHiddenBundledRelations,
NoImages bool
NoImages,
RoundDateIdsToDay bool
}
func DependentObjectIDs(s *state.State, converter KeyToIDConverter, flags Flags) (ids []string) {
@ -79,6 +80,10 @@ func DependentObjectIDs(s *state.State, converter KeyToIDConverter, flags Flags)
ids = append(ids, s.GetStoreSlice(template.CollectionStoreKey)...)
}
if flags.RoundDateIdsToDay {
ids = roundDateIds(ids)
}
ids = lo.Uniq(ids)
return
}
@ -152,7 +157,7 @@ func collectIdsFromDetail(rel *model.RelationLink, det *types.Struct, flags Flag
if relInt > 0 {
t := time.Unix(relInt, 0)
t = t.In(time.Local)
ids = append(ids, dateutil.TimeToDateId(t))
ids = append(ids, dateutil.NewDateObject(t, false).Id())
}
return
}
@ -199,3 +204,16 @@ func collectIdsFromDetail(rel *model.RelationLink, det *types.Struct, flags Flag
return ids
}
// roundDateIds turns all date object ids into ids with no time included
func roundDateIds(ids []string) []string {
for i, id := range ids {
dateObject, err := dateutil.BuildDateObjectFromId(id)
if err != nil {
continue
}
ids[i] = dateutil.NewDateObject(dateObject.Time(), false).Id()
}
return ids
}

View file

@ -13,6 +13,7 @@ import (
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/util/dateutil"
"github.com/anyproto/anytype-heart/util/pbtypes"
)
@ -89,10 +90,12 @@ func TestState_DepSmartIdsLinks(t *testing.T) {
func TestState_DepSmartIdsLinksAndRelations(t *testing.T) {
// given
dateObject1 := dateutil.NewDateObject(time.Now(), true)
dateObject2 := dateutil.NewDateObject(time.Now(), false)
stateWithLinks := state.NewDoc("root", map[string]simple.Block{
"root": simple.New(&model.Block{
Id: "root",
ChildrenIds: []string{"childBlock", "childBlock2", "childBlock3", "dataview", "image", "song"},
ChildrenIds: []string{"childBlock", "childBlock2", "childBlock3", "dataview", "image", "song", "date1", "date2"},
}),
"childBlock": simple.New(&model.Block{Id: "childBlock",
Content: &model.BlockContentOfText{
@ -154,6 +157,18 @@ func TestState_DepSmartIdsLinksAndRelations(t *testing.T) {
Type: model.BlockContentFile_Audio,
},
}}),
"date1": simple.New(&model.Block{Id: "childBlock3",
Content: &model.BlockContentOfLink{
Link: &model.BlockContentLink{
TargetBlockId: dateObject1.Id(),
},
}}),
"date2": simple.New(&model.Block{Id: "childBlock3",
Content: &model.BlockContentOfLink{
Link: &model.BlockContentLink{
TargetBlockId: dateObject2.Id(),
},
}}),
}).(*state.State)
converter := &fakeConverter{}
@ -179,22 +194,27 @@ func TestState_DepSmartIdsLinksAndRelations(t *testing.T) {
t.Run("blocks option is turned on: get ids from blocks", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true})
assert.Len(t, objectIDs, 9)
assert.Len(t, objectIDs, 11)
})
t.Run("dataview only target option is turned on: get only target from blocks", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true, DataviewBlockOnlyTarget: true})
assert.Len(t, objectIDs, 7)
assert.Len(t, objectIDs, 9)
})
t.Run("no images option is turned on: get ids from blocks except images", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true, NoImages: true})
assert.Len(t, objectIDs, 8)
assert.Len(t, objectIDs, 10)
})
t.Run("blocks option and relations options are turned on: get ids from blocks and relations", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true, Relations: true})
assert.Len(t, objectIDs, 13) // 9 links + 4 relations
assert.Len(t, objectIDs, 15) // 11 links + 4 relations
})
t.Run("date object ids are rounded to day", func(t *testing.T) {
objectIDs := DependentObjectIDs(stateWithLinks, converter, Flags{Blocks: true, RoundDateIdsToDay: true})
assert.Len(t, objectIDs, 10)
})
}

View file

@ -46,7 +46,6 @@ import (
"github.com/anyproto/anytype-heart/pkg/lib/logging"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/space"
"github.com/anyproto/anytype-heart/util/dateutil"
"github.com/anyproto/anytype-heart/util/internalflag"
"github.com/anyproto/anytype-heart/util/mutex"
"github.com/anyproto/anytype-heart/util/pbtypes"
@ -223,8 +222,7 @@ func (s *Service) DoFullId(id domain.FullID, apply func(sb smartblock.SmartBlock
// resolveFullId resolves missing spaceId
func (s *Service) resolveFullId(id domain.FullID) domain.FullID {
// TODO: GO-4494 - Do not resolve spaceId in case of date object id. This logic should be reviewed
if _, parseErr := dateutil.ParseDateId(id.ObjectID); parseErr == nil && id.SpaceID != "" {
if id.SpaceID != "" {
return id
}
// First try to resolve space. It's necessary if client accidentally passes wrong spaceId

View file

@ -21,8 +21,6 @@ import (
type DateSourceParams struct {
Id domain.FullID
DateObjectTypeId string
// TODO: GO-4494 - Remove links relation id
LinksRelationId string
}
func NewDate(params DateSourceParams) (s Source) {
@ -30,14 +28,11 @@ func NewDate(params DateSourceParams) (s Source) {
id: params.Id.ObjectID,
spaceId: params.Id.SpaceID,
typeId: params.DateObjectTypeId,
linksId: params.LinksRelationId,
}
}
type date struct {
id, spaceId, typeId string
// TODO: GO-4494 - Remove links relation id
linksId string
}
func (d *date) ListIds() ([]string, error) {
@ -61,13 +56,13 @@ func (d *date) Type() smartblock.SmartBlockType {
}
func (d *date) getDetails() (*types.Struct, error) {
t, err := dateutil.ParseDateId(d.id)
dateObject, err := dateutil.BuildDateObjectFromId(d.id)
if err != nil {
return nil, fmt.Errorf("failed to parse date id: %w", err)
}
return &types.Struct{Fields: map[string]*types.Value{
bundle.RelationKeyName.String(): pbtypes.String(dateutil.TimeToDateName(t)),
bundle.RelationKeyName.String(): pbtypes.String(dateObject.Name()),
bundle.RelationKeyId.String(): pbtypes.String(d.id),
bundle.RelationKeyType.String(): pbtypes.String(d.typeId),
bundle.RelationKeyIsReadonly.String(): pbtypes.Bool(true),
@ -76,9 +71,7 @@ func (d *date) getDetails() (*types.Struct, error) {
bundle.RelationKeyLayout.String(): pbtypes.Float64(float64(model.ObjectType_date)),
bundle.RelationKeyIconEmoji.String(): pbtypes.String("📅"),
bundle.RelationKeySpaceId.String(): pbtypes.String(d.SpaceID()),
bundle.RelationKeyTimestamp.String(): pbtypes.Int64(t.Unix()),
// TODO: GO-4494 - Remove links relation id
bundle.RelationKeySetOf.String(): pbtypes.StringList([]string{d.linksId}),
bundle.RelationKeyTimestamp.String(): pbtypes.Int64(dateObject.Time().Unix()),
}}, nil
}
@ -92,57 +85,10 @@ func (d *date) ReadDoc(context.Context, ChangeReceiver, bool) (doc state.Doc, er
return
}
dataview := &model.BlockContentOfDataview{
Dataview: &model.BlockContentDataview{
RelationLinks: []*model.RelationLink{
{
Key: bundle.RelationKeyName.String(),
Format: model.RelationFormat_shorttext,
},
{
Key: bundle.RelationKeyLastModifiedDate.String(),
Format: model.RelationFormat_date,
},
},
Views: []*model.BlockContentDataviewView{
{
Id: "1",
Type: model.BlockContentDataviewView_Table,
Name: "Date backlinks",
Sorts: []*model.BlockContentDataviewSort{
{
RelationKey: bundle.RelationKeyLastModifiedDate.String(),
Type: model.BlockContentDataviewSort_Desc,
},
},
Filters: []*model.BlockContentDataviewFilter{
{
RelationKey: bundle.RelationKeyLinks.String(),
Condition: model.BlockContentDataviewFilter_In,
Value: pbtypes.String(d.id),
},
},
Relations: []*model.BlockContentDataviewRelation{
{
Key: bundle.RelationKeyName.String(),
IsVisible: true,
},
{
Key: bundle.RelationKeyLastModifiedDate.String(),
IsVisible: true,
},
},
},
},
},
}
s := state.NewDoc(d.id, nil).(*state.State)
template.InitTemplate(s,
template.WithTitle,
template.WithDefaultFeaturedRelations,
// TODO: GO-4494 - Remove dataview block insertion
template.WithDataview(dataview, true),
template.WithAllBlocksEditsRestricted,
)
s.SetDetails(details)

View file

@ -18,6 +18,7 @@ import (
"github.com/anyproto/any-sync/commonspace/spacestorage"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/object/idderiver"
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/core/files"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
@ -60,12 +61,6 @@ type Service interface {
app.Component
}
// TODO: GO-4494 - Remove this interface
type derivedObjectIdGetter interface {
GetRelationIdByKey(ctx context.Context, spaceId string, key domain.RelationKey) (id string, err error)
GetTypeIdByKey(ctx context.Context, spaceId string, key domain.TypeKey) (id string, err error)
}
type service struct {
sbtProvider typeprovider.SmartBlockTypeProvider
accountService accountService
@ -74,9 +69,7 @@ type service struct {
fileService files.Service
objectStore objectstore.ObjectStore
fileObjectMigrator fileObjectMigrator
// TODO: GO-4494 - Remove derivedObjectIdGetter
derivedObjectIdGetter derivedObjectIdGetter
idDeriver idderiver.Deriver
mu sync.Mutex
staticIds map[string]Source
@ -90,12 +83,10 @@ func (s *service) Init(a *app.App) (err error) {
s.accountKeysService = a.MustComponent(accountservice.CName).(accountservice.Service)
s.storageService = a.MustComponent(spacestorage.CName).(storage.ClientStorage)
s.objectStore = app.MustComponent[objectstore.ObjectStore](a)
s.idDeriver = app.MustComponent[idderiver.Deriver](a)
s.fileService = app.MustComponent[files.Service](a)
s.fileObjectMigrator = app.MustComponent[fileObjectMigrator](a)
// TODO: GO-4494 - Remove derivedObjectIdGetter
s.derivedObjectIdGetter = app.MustComponent[derivedObjectIdGetter](a)
return
}
@ -156,20 +147,12 @@ func (s *service) newSource(ctx context.Context, space Space, id string, buildOp
if err != nil {
return nil, fmt.Errorf("failed to find Date type to build Date object: %w", err)
}
// TODO: GO-4494 - Remove links relation id fetch
linksRelationId, err := space.GetRelationIdByKey(context.Background(), bundle.RelationKeyLinks)
if err != nil {
return nil, fmt.Errorf("get links relation id: %w", err)
}
return NewDate(DateSourceParams{
Id: domain.FullID{
ObjectID: id,
SpaceID: space.Id(),
},
DateObjectTypeId: typeId,
LinksRelationId: linksRelationId,
}), nil
case smartblock.SmartBlockTypeBundledObjectType:
return NewBundledObjectType(id), nil
@ -236,22 +219,15 @@ func (s *service) DetailsFromIdBasedSource(id domain.FullID) (*types.Struct, err
return nil, fmt.Errorf("unsupported id")
}
// TODO: GO-4494 - Remove date type id fetch
dateObjectId, err := s.derivedObjectIdGetter.GetTypeIdByKey(context.Background(), id.SpaceID, bundle.TypeKeyDate)
dateTypeId, err := s.idDeriver.DeriveObjectId(context.Background(), id.SpaceID,
domain.MustUniqueKey(smartblock.SmartBlockTypeObjectType, bundle.TypeKeyDate.String()))
if err != nil {
return nil, fmt.Errorf("failed to get id of Date type object: %w", err)
}
// TODO: GO-4494 - Remove links relation id fetch
linksId, err := s.derivedObjectIdGetter.GetRelationIdByKey(context.Background(), id.SpaceID, bundle.RelationKeyLinks)
if err != nil {
return nil, fmt.Errorf("failed to get id of Links relation object: %w", err)
return nil, fmt.Errorf("failed to derive id of Date type object: %w", err)
}
ss := NewDate(DateSourceParams{
Id: id,
DateObjectTypeId: dateObjectId,
LinksRelationId: linksId,
DateObjectTypeId: dateTypeId,
})
defer ss.Close()
if v, ok := ss.(SourceIdEndodedDetails); ok {

49
core/date/date_test.go Normal file
View file

@ -0,0 +1,49 @@
package date
import (
"strconv"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/space/clientspace/mock_clientspace"
"github.com/anyproto/anytype-heart/space/mock_space"
"github.com/anyproto/anytype-heart/util/dateutil"
"github.com/anyproto/anytype-heart/util/pbtypes"
)
const spaceId = "space1"
func TestBuildDetailsFromTimestamp(t *testing.T) {
spc := mock_clientspace.NewMockSpace(t)
spc.EXPECT().GetTypeIdByKey(mock.Anything, bundle.TypeKeyDate).Return(bundle.TypeKeyDate.URL(), nil)
spcService := mock_space.NewMockService(t)
spcService.EXPECT().Get(mock.Anything, mock.Anything).Return(spc, nil)
for _, ts := range []int64{0, 1720035620, 1731099336,
time.Date(2024, time.November, 30, 23, 55, 55, 0, time.UTC).Unix(),
time.Date(2024, time.November, 30, 23, 55, 55, 0, time.FixedZone("Berlin", +2*60*60)).Unix(),
} {
t.Run("date object details - "+strconv.FormatInt(ts, 10), func(t *testing.T) {
// when
details, err := BuildDetailsFromTimestamp(nil, spcService, spaceId, ts)
// then
assert.NoError(t, err)
assert.Equal(t, spaceId, pbtypes.GetString(details, bundle.RelationKeySpaceId.String()))
assert.Equal(t, bundle.TypeKeyDate.URL(), pbtypes.GetString(details, bundle.RelationKeyType.String()))
dateObject := dateutil.NewDateObject(time.Unix(ts, 0), false)
assert.Equal(t, dateObject.Id(), pbtypes.GetString(details, bundle.RelationKeyId.String()))
assert.Equal(t, dateObject.Name(), pbtypes.GetString(details, bundle.RelationKeyName.String()))
ts2 := pbtypes.GetInt64(details, bundle.RelationKeyTimestamp.String())
tt := time.Unix(ts2, 0)
assert.Zero(t, tt.Hour())
assert.Zero(t, tt.Minute())
assert.Zero(t, tt.Second())
})
}
}

43
core/date/details.go Normal file
View file

@ -0,0 +1,43 @@
package date
import (
"context"
"fmt"
"time"
"github.com/gogo/protobuf/types"
"github.com/anyproto/anytype-heart/core/block/source"
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/space"
"github.com/anyproto/anytype-heart/util/dateutil"
)
func BuildDetailsFromTimestamp(
ctx context.Context, spaceService space.Service, spaceId string, timestamp int64,
) (details *types.Struct, err error) {
spc, err := spaceService.Get(ctx, spaceId)
if err != nil {
return nil, fmt.Errorf("failed to get space service: %w", err)
}
dateTypeId, err := spc.GetTypeIdByKey(ctx, bundle.TypeKeyDate)
if err != nil {
return nil, fmt.Errorf("failed to get date type id: %w", err)
}
dateSource := source.NewDate(source.DateSourceParams{
Id: domain.FullID{
SpaceID: spaceId,
ObjectID: dateutil.NewDateObject(time.Unix(timestamp, 0), false).Id(),
},
DateObjectTypeId: dateTypeId,
})
detailsGetter, ok := dateSource.(source.SourceIdEndodedDetails)
if !ok {
return nil, fmt.Errorf("date object does not implement SourceIdEndodedDetails: %w", err)
}
return detailsGetter.DetailsFromId()
}

View file

@ -18,37 +18,18 @@ import (
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore"
"github.com/anyproto/anytype-heart/space"
"github.com/anyproto/anytype-heart/util/dateutil"
"github.com/anyproto/anytype-heart/util/pbtypes"
)
func EnrichRecordsWithDateSuggestion(
func EnrichRecordsWithDateSuggestions(
ctx context.Context,
records []database.Record,
req *pb.RpcObjectSearchRequest,
store objectstore.ObjectStore,
spaceService space.Service,
) ([]database.Record, error) {
dt := suggestDateForSearch(time.Now(), req.FullText)
if dt.IsZero() {
return records, nil
}
id := dateutil.TimeToDateId(dt)
// Don't duplicate search suggestions
var found bool
for _, r := range records {
if r.Details == nil || r.Details.Fields == nil {
continue
}
if v, ok := r.Details.Fields[bundle.RelationKeyId.String()]; ok {
if v.GetStringValue() == id {
found = true
break
}
}
}
if found {
ids := suggestDateObjectIds(req)
if len(ids) == 0 {
return records, nil
}
@ -57,18 +38,59 @@ func EnrichRecordsWithDateSuggestion(
return nil, fmt.Errorf("get space: %w", err)
}
rec, err := makeSuggestedDateRecord(spc, dt)
if err != nil {
return nil, fmt.Errorf("make date record: %w", err)
}
f, _ := database.MakeFilters(req.Filters, store.SpaceIndex(req.SpaceId)) //nolint:errcheck
if f.FilterObject(rec.Details) {
return append([]database.Record{rec}, records...), nil
for _, id := range ids {
if recordsHasId(records, id) {
continue
}
rec, err := makeSuggestedDateRecord(ctx, spc, id)
if err != nil {
return nil, fmt.Errorf("make date record: %w", err)
}
f, _ := database.MakeFilters(req.Filters, store.SpaceIndex(req.SpaceId)) //nolint:errcheck
if f.FilterObject(rec.Details) {
records = append([]database.Record{rec}, records...)
}
}
return records, nil
}
// suggestDateObjectIds suggests date object ids based on two fields:
// - fullText - if naturalDate successfully parses text into date, resulting date object id is returned
// - filter with key id
func suggestDateObjectIds(req *pb.RpcObjectSearchRequest) []string {
dt := suggestDateForSearch(time.Now(), req.FullText)
if !dt.IsZero() {
// TODO: GO-4097 Uncomment it when we will be able to support dates with seconds precision
// isDay := dt.Hour() == 0 && dt.Minute() == 0 && dt.Second() == 0
isDay := true
return []string{dateutil.NewDateObject(dt, !isDay).Id()}
}
for _, filter := range req.Filters {
if filter.RelationKey == bundle.RelationKeyId.String() {
list := pbtypes.GetStringListValue(filter.Value)
var dateObjectIds []string
for _, id := range list {
if _, err := dateutil.BuildDateObjectFromId(id); err == nil {
dateObjectIds = append(dateObjectIds, id)
}
}
return dateObjectIds
}
}
return nil
}
func suggestDateForSearch(now time.Time, raw string) time.Time {
// a hack to show calendar in case date is typed
if raw == "date" {
return time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
}
suggesters := []func() time.Time{
func() time.Time {
var exprType naturaldate.ExprType
@ -123,27 +145,33 @@ func suggestDateForSearch(now time.Time, raw string) time.Time {
return t
}
func makeSuggestedDateRecord(spc source.Space, t time.Time) (database.Record, error) {
id := dateutil.TimeToDateId(t)
func recordsHasId(records []database.Record, id string) bool {
for _, r := range records {
if r.Details == nil || r.Details.Fields == nil {
continue
}
if v, ok := r.Details.Fields[bundle.RelationKeyId.String()]; ok {
if v.GetStringValue() == id {
return true
}
}
typeId, err := spc.GetTypeIdByKey(context.Background(), bundle.TypeKeyDate)
}
return false
}
func makeSuggestedDateRecord(ctx context.Context, spc source.Space, id string) (database.Record, error) {
typeId, err := spc.GetTypeIdByKey(ctx, bundle.TypeKeyDate)
if err != nil {
return database.Record{}, fmt.Errorf("failed to find Date type to build Date object: %w", err)
}
// TODO: GO-4494 - Remove links relation id fetch
linksRelationId, err := spc.GetRelationIdByKey(context.Background(), bundle.RelationKeyLinks)
if err != nil {
return database.Record{}, fmt.Errorf("get links relation id: %w", err)
}
dateSource := source.NewDate(source.DateSourceParams{
Id: domain.FullID{
ObjectID: id,
SpaceID: spc.Id(),
},
DateObjectTypeId: typeId,
LinksRelationId: linksRelationId,
})
v, ok := dateSource.(source.SourceIdEndodedDetails)

View file

@ -5,6 +5,13 @@ import (
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/util/dateutil"
"github.com/anyproto/anytype-heart/util/pbtypes"
)
func Test_suggestDateForSearch(t *testing.T) {
@ -12,7 +19,6 @@ func Test_suggestDateForSearch(t *testing.T) {
now := time.Date(2022, 5, 18, 14, 56, 33, 0, loc)
tests := []struct {
now time.Time
raw string
want time.Time
}{
@ -20,6 +26,10 @@ func Test_suggestDateForSearch(t *testing.T) {
raw: "now",
want: time.Date(2022, 5, 18, 14, 56, 33, 0, loc),
},
{
raw: "date",
want: time.Date(2022, 5, 18, 0, 0, 0, 0, loc),
},
{
raw: "today",
want: time.Date(2022, 5, 18, 0, 0, 0, 0, loc),
@ -61,3 +71,24 @@ func Test_suggestDateForSearch(t *testing.T) {
})
}
}
func TestSuggestDateObjectIdsFromFilter(t *testing.T) {
// given
dateObject1 := dateutil.NewDateObject(time.Now(), false)
dateObject2 := dateutil.NewDateObject(time.Now().Add(2*time.Hour), true)
req := &pb.RpcObjectSearchRequest{
Filters: []*model.BlockContentDataviewFilter{{
RelationKey: bundle.RelationKeyId.String(),
Condition: model.BlockContentDataviewFilter_In,
Value: pbtypes.StringList([]string{dateObject1.Id(), "plainObj1", "planObj2", dateObject2.Id()}),
}},
}
// when
ids := suggestDateObjectIds(req)
// then
require.Len(t, ids, 2)
assert.Equal(t, dateObject1.Id(), ids[0])
assert.Equal(t, dateObject2.Id(), ids[1])
}

View file

@ -14,6 +14,7 @@ import (
"github.com/dgraph-io/badger/v4"
"github.com/gogo/protobuf/proto"
"github.com/gogo/protobuf/types"
"github.com/samber/lo"
"go.uber.org/zap"
"github.com/anyproto/anytype-heart/core/anytype/account"
@ -25,9 +26,11 @@ import (
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/space"
"github.com/anyproto/anytype-heart/util/badgerhelper"
"github.com/anyproto/anytype-heart/util/conc"
)
const CName = "identity"
const identityBatch = 100
var (
log = logging.Logger("anytype-identity").Desugar()
@ -206,17 +209,13 @@ const identityRepoDataKind = "profile"
func (s *service) observeIdentities(ctx context.Context) error {
identities := s.listRegisteredIdentities()
allIdentitiesData := s.getIdentityData(ctx, identities)
identitiesData, err := s.getIdentitiesDataFromRepo(ctx, identities)
if err != nil {
return fmt.Errorf("failed to pull identity: %w", err)
}
if err = s.fetchGlobalNames(identities); err != nil {
if err := s.fetchGlobalNames(identities); err != nil {
log.Error("error fetching global names of guest identities from Naming Service", zap.Error(err))
}
for _, identityData := range identitiesData {
for _, identityData := range allIdentitiesData {
err := s.broadcastIdentityProfile(identityData)
if err != nil {
log.Error("error handling identity data", zap.Error(err))
@ -225,6 +224,17 @@ func (s *service) observeIdentities(ctx context.Context) error {
return nil
}
func (s *service) getIdentityData(ctx context.Context, identities []string) []*identityrepoproto.DataWithIdentity {
batches := lo.Chunk(identities, identityBatch)
allIdentitiesData, err := conc.MapErr(batches, func(batch []string) ([]*identityrepoproto.DataWithIdentity, error) {
return s.getIdentitiesDataFromRepo(ctx, batch)
})
if err != nil {
log.Error("failed to pull identity", zap.Error(err))
}
return lo.Flatten(allIdentitiesData)
}
func (s *service) listRegisteredIdentities() []string {
s.lock.Lock()
defer s.lock.Unlock()
@ -243,18 +253,16 @@ func (s *service) listRegisteredIdentities() []string {
}
func (s *service) getIdentitiesDataFromRepo(ctx context.Context, identities []string) ([]*identityrepoproto.DataWithIdentity, error) {
if len(identities) == 0 {
return nil, nil
}
res, err := s.identityRepoClient.IdentityRepoGet(ctx, identities, []string{identityRepoDataKind})
if err == nil {
return res, nil
if err != nil {
return s.processFailedIdentities(res, identities)
}
log.Info("get identities data from remote repo", zap.Error(err))
return res, nil
}
res = make([]*identityrepoproto.DataWithIdentity, 0, len(identities))
err = s.db.View(func(txn *badger.Txn) error {
for _, identity := range identities {
func (s *service) processFailedIdentities(res []*identityrepoproto.DataWithIdentity, failedIdentities []string) ([]*identityrepoproto.DataWithIdentity, error) {
err := s.db.View(func(txn *badger.Txn) error {
for _, identity := range failedIdentities {
rawData, err := badgerhelper.GetValueTxn(txn, makeIdentityProfileKey(identity), badgerhelper.UnmarshalBytes)
if badgerhelper.IsNotFound(err) {
continue

View file

@ -3,6 +3,8 @@ package identity
import (
"context"
"fmt"
"math"
"slices"
"sync"
"sync/atomic"
"testing"
@ -35,6 +37,7 @@ type fixture struct {
coordinatorClient *inMemoryIdentityRepo
spaceService *mock_space.MockService
accountService *mock_account.MockService
nsClient *mock_nameserviceclient.MockAnyNsClientService
}
const (
@ -95,6 +98,7 @@ func newFixture(t *testing.T, testObserverPeriod time.Duration) *fixture {
spaceService: spaceService,
accountService: accountService,
coordinatorClient: identityRepoClient,
nsClient: nsClient,
}
go fx.observeIdentitiesLoop()
@ -249,7 +253,6 @@ func TestIdentityProfileCache(t *testing.T) {
time.Sleep(testObserverPeriod * 2)
assert.Equal(t, uint64(1), atomic.LoadUint64(&called))
})
}
func TestObservers(t *testing.T) {
@ -331,7 +334,6 @@ func TestObservers(t *testing.T) {
require.NoError(t, err)
wg.Wait()
})
}
func TestGetIdentitiesDataFromRepo(t *testing.T) {
@ -342,9 +344,181 @@ func TestGetIdentitiesDataFromRepo(t *testing.T) {
fx.coordinatorClient.setCallback(func(_ []string, _ []string, _ []*identityrepoproto.DataWithIdentity, _ error) {
called.Set(true)
})
list, err := fx.getIdentitiesDataFromRepo(context.Background(), nil)
err := fx.observeIdentities(context.Background())
require.NoError(t, err)
require.Empty(t, list)
require.False(t, called.Get())
})
t.Run("receive 100 identities", func(t *testing.T) {
// given
testObserverPeriod := time.Minute
fx := newFixture(t, testObserverPeriod)
nsServiceResult := make([]*nameserviceproto.NameByAddressResponse, 0, 100)
var (
wg sync.WaitGroup
allIdentities, processedIdentities []string
)
for i := 0; i < 100; i++ {
identity := fmt.Sprintf("identity%d", i)
allIdentities = append(allIdentities, identity)
profileSymKey, err := crypto.NewRandomAES()
require.NoError(t, err)
wantProfile := &model.IdentityProfile{
Identity: identity,
Name: "name1",
GlobalName: globalName,
}
wantData := marshalProfile(t, wantProfile, profileSymKey)
err = fx.identityRepoClient.IdentityRepoPut(context.Background(), identity, []*identityrepoproto.Data{
{
Kind: identityRepoDataKind,
Data: wantData,
},
})
require.NoError(t, err)
wg.Add(1)
fx.identityObservers[identity] = map[string]*observer{
"test": {
callback: func(identity string, profile *model.IdentityProfile) {
processedIdentities = append(processedIdentities, identity)
wg.Done()
},
},
}
fx.identityEncryptionKeys[identity] = profileSymKey
nsServiceResult = append(nsServiceResult, &nameserviceproto.NameByAddressResponse{
Found: false,
Name: "",
})
}
fx.nsClient.EXPECT().BatchGetNameByAnyId(gomock.Any(), gomock.Any()).Return(&nameserviceproto.BatchNameByAddressResponse{Results: nsServiceResult}, nil)
// when
fx.identityForceUpdate <- struct{}{}
// then
wg.Wait()
slices.Sort(allIdentities)
slices.Sort(processedIdentities)
assert.Equal(t, allIdentities, processedIdentities)
})
t.Run("receive more than 100 identities", func(t *testing.T) {
// given
testObserverPeriod := time.Duration(math.MaxInt) // make sure observing won't run by ticker
fx := newFixture(t, testObserverPeriod)
nsServiceResult := make([]*nameserviceproto.NameByAddressResponse, 0, 100)
var (
wg sync.WaitGroup
allIdentities, processedIdentities []string
)
for i := 0; i < 500; i++ {
identity := fmt.Sprintf("identity%d", i)
allIdentities = append(allIdentities, identity)
profileSymKey, err := crypto.NewRandomAES()
require.NoError(t, err)
wantProfile := &model.IdentityProfile{
Identity: identity,
Name: "name1",
GlobalName: globalName,
}
wantData := marshalProfile(t, wantProfile, profileSymKey)
err = fx.identityRepoClient.IdentityRepoPut(context.Background(), identity, []*identityrepoproto.Data{
{
Kind: identityRepoDataKind,
Data: wantData,
},
})
require.NoError(t, err)
wg.Add(1)
fx.identityObservers[identity] = map[string]*observer{
"test": {
callback: func(identity string, profile *model.IdentityProfile) {
processedIdentities = append(processedIdentities, identity)
wg.Done()
},
},
}
fx.identityEncryptionKeys[identity] = profileSymKey
nsServiceResult = append(nsServiceResult, &nameserviceproto.NameByAddressResponse{
Found: false,
Name: "",
})
}
fx.nsClient.EXPECT().BatchGetNameByAnyId(gomock.Any(), gomock.Any()).Return(&nameserviceproto.BatchNameByAddressResponse{Results: nsServiceResult}, nil)
// when
fx.identityForceUpdate <- struct{}{}
// then
wg.Wait()
slices.Sort(allIdentities)
slices.Sort(processedIdentities)
assert.Equal(t, allIdentities, processedIdentities)
})
t.Run("partly receive identity from coordinator, but it failed at some point - use cache for such identities", func(t *testing.T) {
// given
testObserverPeriod := time.Duration(math.MaxInt) // make sure observing won't run by ticker
fx := newFixture(t, testObserverPeriod)
nsServiceResult := make([]*nameserviceproto.NameByAddressResponse, 0, 100)
var (
wg sync.WaitGroup
allIdentities, processedIdentities []string
)
for i := 0; i < 500; i++ {
identity := fmt.Sprintf("identity%d", i)
allIdentities = append(allIdentities, identity)
profileSymKey, err := crypto.NewRandomAES()
require.NoError(t, err)
wantProfile := &model.IdentityProfile{
Identity: identity,
Name: "name1",
GlobalName: globalName,
}
wantData := marshalProfile(t, wantProfile, profileSymKey)
err = fx.identityRepoClient.IdentityRepoPut(context.Background(), identity, []*identityrepoproto.Data{
{
Kind: identityRepoDataKind,
Data: wantData,
},
})
wg.Add(1)
fx.identityObservers[identity] = map[string]*observer{
"test": {
callback: func(identity string, profile *model.IdentityProfile) {
processedIdentities = append(processedIdentities, identity)
wg.Done()
},
},
}
fx.identityEncryptionKeys[identity] = profileSymKey
nsServiceResult = append(nsServiceResult, &nameserviceproto.NameByAddressResponse{
Found: false,
Name: "",
})
err = badgerhelper.SetValue(fx.db, makeIdentityProfileKey(identity), wantData)
require.NoError(t, err)
err = badgerhelper.SetValue(fx.db, makeGlobalNameKey(identity), globalName)
require.NoError(t, err)
}
fx.nsClient.EXPECT().BatchGetNameByAnyId(gomock.Any(), gomock.Any()).Return(&nameserviceproto.BatchNameByAddressResponse{Results: nsServiceResult}, nil)
// when
var called bool // call identity repo once and then fail it to simulate failure between identities batching call
fx.coordinatorClient.setCallback(func(identities []string, kinds []string, res []*identityrepoproto.DataWithIdentity, resErr error) {
if called {
fx.coordinatorClient.isUnavailable = true
} else {
called = true
}
})
fx.identityForceUpdate <- struct{}{}
// then
wg.Wait()
slices.Sort(allIdentities)
slices.Sort(processedIdentities)
assert.Equal(t, allIdentities, processedIdentities)
})
}

View file

@ -102,7 +102,7 @@ func (mw *Middleware) ObjectSearch(cctx context.Context, req *pb.RpcObjectSearch
// Add dates only to the first page of search results
if req.Offset == 0 {
records, err = date.EnrichRecordsWithDateSuggestion(cctx, records, req, ds, getService[space.Service](mw))
records, err = date.EnrichRecordsWithDateSuggestions(cctx, records, req, ds, getService[space.Service](mw))
if err != nil {
return response(pb.RpcObjectSearchResponseError_UNKNOWN_ERROR, nil, err)
}
@ -719,3 +719,21 @@ func (mw *Middleware) ObjectImportExperience(ctx context.Context, req *pb.RpcObj
err := objCreator.CreateObjectsForExperience(ctx, req.SpaceId, req.Url, req.Title, req.IsNewSpace)
return response(common.GetGalleryResponseCode(err), err)
}
func (mw *Middleware) ObjectDateByTimestamp(ctx context.Context, req *pb.RpcObjectDateByTimestampRequest) *pb.RpcObjectDateByTimestampResponse {
spaceService := getService[space.Service](mw)
details, err := date.BuildDetailsFromTimestamp(ctx, spaceService, req.SpaceId, req.Timestamp)
if err != nil {
return &pb.RpcObjectDateByTimestampResponse{
Error: &pb.RpcObjectDateByTimestampResponseError{
Code: pb.RpcObjectDateByTimestampResponseError_UNKNOWN_ERROR,
Description: getErrorDescription(err),
},
}
}
return &pb.RpcObjectDateByTimestampResponse{
Details: details,
}
}

View file

@ -32,8 +32,8 @@ const CName = "payments"
var log = logging.Logger(CName).Desugar()
const (
refreshIntervalSecs = 10
timeout = 10 * time.Second
refreshIntervalSecs = 60
timeout = 30 * time.Second
cacheDisableMinutes = 30
)

View file

@ -855,6 +855,10 @@
- [Rpc.Object.CrossSpaceSearchUnsubscribe.Request](#anytype-Rpc-Object-CrossSpaceSearchUnsubscribe-Request)
- [Rpc.Object.CrossSpaceSearchUnsubscribe.Response](#anytype-Rpc-Object-CrossSpaceSearchUnsubscribe-Response)
- [Rpc.Object.CrossSpaceSearchUnsubscribe.Response.Error](#anytype-Rpc-Object-CrossSpaceSearchUnsubscribe-Response-Error)
- [Rpc.Object.DateByTimestamp](#anytype-Rpc-Object-DateByTimestamp)
- [Rpc.Object.DateByTimestamp.Request](#anytype-Rpc-Object-DateByTimestamp-Request)
- [Rpc.Object.DateByTimestamp.Response](#anytype-Rpc-Object-DateByTimestamp-Response)
- [Rpc.Object.DateByTimestamp.Response.Error](#anytype-Rpc-Object-DateByTimestamp-Response-Error)
- [Rpc.Object.Duplicate](#anytype-Rpc-Object-Duplicate)
- [Rpc.Object.Duplicate.Request](#anytype-Rpc-Object-Duplicate-Request)
- [Rpc.Object.Duplicate.Response](#anytype-Rpc-Object-Duplicate-Response)
@ -1444,6 +1448,7 @@
- [Rpc.Object.CreateSet.Response.Error.Code](#anytype-Rpc-Object-CreateSet-Response-Error-Code)
- [Rpc.Object.CrossSpaceSearchSubscribe.Response.Error.Code](#anytype-Rpc-Object-CrossSpaceSearchSubscribe-Response-Error-Code)
- [Rpc.Object.CrossSpaceSearchUnsubscribe.Response.Error.Code](#anytype-Rpc-Object-CrossSpaceSearchUnsubscribe-Response-Error-Code)
- [Rpc.Object.DateByTimestamp.Response.Error.Code](#anytype-Rpc-Object-DateByTimestamp-Response-Error-Code)
- [Rpc.Object.Duplicate.Response.Error.Code](#anytype-Rpc-Object-Duplicate-Response-Error-Code)
- [Rpc.Object.Graph.Edge.Type](#anytype-Rpc-Object-Graph-Edge-Type)
- [Rpc.Object.Graph.Response.Error.Code](#anytype-Rpc-Object-Graph-Response-Error-Code)
@ -2050,6 +2055,7 @@
| ObjectImportNotionValidateToken | [Rpc.Object.Import.Notion.ValidateToken.Request](#anytype-Rpc-Object-Import-Notion-ValidateToken-Request) | [Rpc.Object.Import.Notion.ValidateToken.Response](#anytype-Rpc-Object-Import-Notion-ValidateToken-Response) | |
| ObjectImportUseCase | [Rpc.Object.ImportUseCase.Request](#anytype-Rpc-Object-ImportUseCase-Request) | [Rpc.Object.ImportUseCase.Response](#anytype-Rpc-Object-ImportUseCase-Response) | |
| ObjectImportExperience | [Rpc.Object.ImportExperience.Request](#anytype-Rpc-Object-ImportExperience-Request) | [Rpc.Object.ImportExperience.Response](#anytype-Rpc-Object-ImportExperience-Response) | |
| ObjectDateByTimestamp | [Rpc.Object.DateByTimestamp.Request](#anytype-Rpc-Object-DateByTimestamp-Request) | [Rpc.Object.DateByTimestamp.Response](#anytype-Rpc-Object-DateByTimestamp-Response) | |
| ObjectCollectionAdd | [Rpc.ObjectCollection.Add.Request](#anytype-Rpc-ObjectCollection-Add-Request) | [Rpc.ObjectCollection.Add.Response](#anytype-Rpc-ObjectCollection-Add-Response) | Collections *** |
| ObjectCollectionRemove | [Rpc.ObjectCollection.Remove.Request](#anytype-Rpc-ObjectCollection-Remove-Request) | [Rpc.ObjectCollection.Remove.Response](#anytype-Rpc-ObjectCollection-Remove-Response) | |
| ObjectCollectionSort | [Rpc.ObjectCollection.Sort.Request](#anytype-Rpc-ObjectCollection-Sort-Request) | [Rpc.ObjectCollection.Sort.Response](#anytype-Rpc-ObjectCollection-Sort-Response) | |
@ -14587,6 +14593,64 @@ Get the info for page alongside with info for all inbound and outbound links fro
<a name="anytype-Rpc-Object-DateByTimestamp"></a>
### Rpc.Object.DateByTimestamp
<a name="anytype-Rpc-Object-DateByTimestamp-Request"></a>
### Rpc.Object.DateByTimestamp.Request
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| spaceId | [string](#string) | | |
| timestamp | [int64](#int64) | | |
<a name="anytype-Rpc-Object-DateByTimestamp-Response"></a>
### Rpc.Object.DateByTimestamp.Response
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| error | [Rpc.Object.DateByTimestamp.Response.Error](#anytype-Rpc-Object-DateByTimestamp-Response-Error) | | |
| details | [google.protobuf.Struct](#google-protobuf-Struct) | | |
<a name="anytype-Rpc-Object-DateByTimestamp-Response-Error"></a>
### Rpc.Object.DateByTimestamp.Response.Error
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| code | [Rpc.Object.DateByTimestamp.Response.Error.Code](#anytype-Rpc-Object-DateByTimestamp-Response-Error-Code) | | |
| description | [string](#string) | | |
<a name="anytype-Rpc-Object-Duplicate"></a>
### Rpc.Object.Duplicate
@ -22978,6 +23042,19 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er
<a name="anytype-Rpc-Object-DateByTimestamp-Response-Error-Code"></a>
### Rpc.Object.DateByTimestamp.Response.Error.Code
| Name | Number | Description |
| ---- | ------ | ----------- |
| NULL | 0 | |
| UNKNOWN_ERROR | 1 | |
| BAD_INPUT | 2 | |
<a name="anytype-Rpc-Object-Duplicate-Response-Error-Code"></a>
### Rpc.Object.Duplicate.Response.Error.Code
@ -23153,10 +23230,6 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er
| ---- | ------ | ----------- |
| NONE | 0 | |
| GET_STARTED | 1 | |
| PERSONAL_PROJECTS | 2 | |
| KNOWLEDGE_BASE | 3 | |
| NOTES_DIARY | 4 | |
| STRATEGIC_WRITING | 5 | |
| EMPTY | 6 | |

8
go.mod
View file

@ -1,13 +1,13 @@
module github.com/anyproto/anytype-heart
go 1.22.9
go 1.23.2
require (
github.com/JohannesKaufmann/html-to-markdown v1.4.0
github.com/PuerkitoBio/goquery v1.9.0
github.com/PuerkitoBio/goquery v1.10.0
github.com/VividCortex/ewma v1.2.0
github.com/adrium/goheif v0.0.0-20230113233934-ca402e77a786
github.com/anyproto/any-store v0.1.2
github.com/anyproto/any-store v0.1.3
github.com/anyproto/any-sync v0.5.18
github.com/anyproto/go-chash v0.1.0
github.com/anyproto/go-naturaldate/v2 v2.0.2-0.20230524105841-9829cfd13438
@ -90,7 +90,7 @@ require (
github.com/stretchr/testify v1.10.0
github.com/uber/jaeger-client-go v2.30.0+incompatible
github.com/valyala/fastjson v1.6.4
github.com/vektra/mockery/v2 v2.46.0
github.com/vektra/mockery/v2 v2.47.0
github.com/xeipuuv/gojsonschema v1.2.0
github.com/yuin/goldmark v1.7.8
github.com/zeebo/blake3 v0.2.4

12
go.sum
View file

@ -52,8 +52,8 @@ github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuN
github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ=
github.com/PuerkitoBio/goquery v1.9.0 h1:zgjKkdpRY9T97Q5DCtcXwfqkcylSFIVCocZmn2huTp8=
github.com/PuerkitoBio/goquery v1.9.0/go.mod h1:cW1n6TmIMDoORQU5IU/P1T3tGFunOeXEpGP2WHRwkbY=
github.com/PuerkitoBio/goquery v1.10.0 h1:6fiXdLuUvYs2OJSvNRqlNPoBm6YABE226xrbavY5Wv4=
github.com/PuerkitoBio/goquery v1.10.0/go.mod h1:TjZZl68Q3eGHNBA8CWaxAN7rOU1EbDz3CWuolcO5Yu4=
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow=
@ -76,8 +76,8 @@ github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
github.com/anyproto/any-store v0.1.2 h1:/WKsPOQxK1jOHS7efTIosnyJTvy0O3gYg/DSnt41DT0=
github.com/anyproto/any-store v0.1.2/go.mod h1:SDlN2AzysAfs8CDd28rrs6boUUtf5H/ydCvwmj+EbsE=
github.com/anyproto/any-store v0.1.3 h1:onWLP8tuWiUvYOyV3DoRODscTxAiGEjwQPm+NMxeq3M=
github.com/anyproto/any-store v0.1.3/go.mod h1:6/0OUKgSMWF/vYGoGYzQOl2CII5OdiuXbQlGDXYcNYc=
github.com/anyproto/any-sync v0.5.18 h1:isS9AXOs5b6kSM/fbANEvOxn8JJrSuaKKlrUWNLdTS4=
github.com/anyproto/any-sync v0.5.18/go.mod h1:K53/whh/9tmGbXrkPS59XyqWU3SaxhsX9g6VIYnBIlU=
github.com/anyproto/badger/v4 v4.2.1-0.20240110160636-80743fa3d580 h1:Ba80IlCCxkZ9H1GF+7vFu/TSpPvbpDCxXJ5ogc4euYc=
@ -995,8 +995,8 @@ github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX
github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
github.com/vektra/mockery/v2 v2.46.0 h1:DKIFj6hAPGwmOYiWfWzdsQtBgU8ozPXo3Bwbmf+Ku80=
github.com/vektra/mockery/v2 v2.46.0/go.mod h1:XNTE9RIu3deGAGQRVjP1VZxGpQNm0YedZx4oDs3prr8=
github.com/vektra/mockery/v2 v2.47.0 h1:/OgQNNsUxwKCC8rt6cRXxvfj7/f9mYrCbX4m/tcZpFQ=
github.com/vektra/mockery/v2 v2.47.0/go.mod h1:xO2DeYemEPC2tCzIZ+a1tifZ/7Laf/Chxg3vlc+oDsI=
github.com/warpfork/go-testmark v0.12.1 h1:rMgCpJfwy1sJ50x0M0NgyphxYYPMOODIJHhsXyEHU0s=
github.com/warpfork/go-testmark v0.12.1/go.mod h1:kHwy7wfvGSPh1rQJYKayD4AbtNaeyZdcGi9tNJTaa5Y=
github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ=

File diff suppressed because it is too large Load diff

View file

@ -2776,10 +2776,6 @@ message Rpc {
enum UseCase {
NONE = 0;
GET_STARTED = 1;
PERSONAL_PROJECTS = 2;
KNOWLEDGE_BASE = 3;
NOTES_DIARY = 4;
STRATEGIC_WRITING = 5;
EMPTY = 6;
}
}
@ -2826,6 +2822,29 @@ message Rpc {
}
}
}
message DateByTimestamp {
message Request {
string spaceId = 1;
int64 timestamp = 2;
}
message Response {
Error error = 1;
google.protobuf.Struct details = 2;
message Error {
Code code = 1;
string description = 2;
enum Code {
NULL = 0;
UNKNOWN_ERROR = 1;
BAD_INPUT = 2;
}
}
}
}
}
message ObjectCollection {

View file

@ -117,6 +117,7 @@ service ClientCommands {
rpc ObjectImportNotionValidateToken (anytype.Rpc.Object.Import.Notion.ValidateToken.Request) returns (anytype.Rpc.Object.Import.Notion.ValidateToken.Response);
rpc ObjectImportUseCase (anytype.Rpc.Object.ImportUseCase.Request) returns (anytype.Rpc.Object.ImportUseCase.Response);
rpc ObjectImportExperience (anytype.Rpc.Object.ImportExperience.Request) returns (anytype.Rpc.Object.ImportExperience.Response);
rpc ObjectDateByTimestamp (anytype.Rpc.Object.DateByTimestamp.Request) returns (anytype.Rpc.Object.DateByTimestamp.Response);
// Collections
// ***

View file

@ -26,338 +26,339 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) }
var fileDescriptor_93a29dc403579097 = []byte{
// 5285 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9d, 0x5f, 0x6f, 0x24, 0x49,
0x52, 0xc0, 0xaf, 0x5f, 0x58, 0xa8, 0xe3, 0x16, 0xe8, 0x85, 0x65, 0x6f, 0xb9, 0x9b, 0x99, 0x9d,
0x9d, 0xb1, 0x3d, 0x63, 0xbb, 0x3d, 0x3b, 0xb3, 0xff, 0xb8, 0x43, 0x02, 0x8f, 0x3d, 0xf6, 0x9a,
0xb3, 0x3d, 0xc6, 0x6d, 0xcf, 0x48, 0x2b, 0x21, 0x51, 0xee, 0x4a, 0xb7, 0x0b, 0x57, 0x57, 0xd6,
0x55, 0x65, 0xb7, 0xa7, 0x0f, 0x81, 0x38, 0x81, 0x40, 0x20, 0x10, 0x27, 0xfe, 0x89, 0x37, 0x24,
0x3e, 0x01, 0x1f, 0x83, 0xc7, 0x7b, 0xe4, 0x11, 0xed, 0xbe, 0xf1, 0x29, 0x50, 0x65, 0x66, 0xe5,
0x9f, 0xa8, 0x88, 0xac, 0xf2, 0xf2, 0x34, 0xa3, 0x8e, 0x5f, 0x44, 0x64, 0x56, 0x66, 0x46, 0x46,
0x66, 0x65, 0xa5, 0xa3, 0xbb, 0xc5, 0xc5, 0x56, 0x51, 0x72, 0xc1, 0xab, 0xad, 0x8a, 0x95, 0x8b,
0x74, 0xc2, 0x9a, 0x7f, 0x47, 0xf2, 0xe7, 0xe1, 0x5b, 0x71, 0xbe, 0x14, 0xcb, 0x82, 0xbd, 0xff,
0x9e, 0x25, 0x27, 0x7c, 0x36, 0x8b, 0xf3, 0xa4, 0x52, 0xc8, 0xfb, 0xef, 0x5a, 0x09, 0x5b, 0xb0,
0x5c, 0xe8, 0xdf, 0x9f, 0xfe, 0xf4, 0x7f, 0x07, 0xd1, 0xdb, 0x3b, 0x59, 0xca, 0x72, 0xb1, 0xa3,
0x35, 0x86, 0x5f, 0x46, 0xdf, 0xd9, 0x2e, 0x8a, 0x7d, 0x26, 0x5e, 0xb1, 0xb2, 0x4a, 0x79, 0x3e,
0xfc, 0x70, 0xa4, 0x1d, 0x8c, 0x4e, 0x8b, 0xc9, 0x68, 0xbb, 0x28, 0x46, 0x56, 0x38, 0x3a, 0x65,
0x3f, 0x9e, 0xb3, 0x4a, 0xbc, 0xff, 0x20, 0x0c, 0x55, 0x05, 0xcf, 0x2b, 0x36, 0xbc, 0x8c, 0x7e,
0x6d, 0xbb, 0x28, 0xc6, 0x4c, 0xec, 0xb2, 0xba, 0x02, 0x63, 0x11, 0x0b, 0x36, 0x5c, 0x6d, 0xa9,
0xfa, 0x80, 0xf1, 0xb1, 0xd6, 0x0d, 0x6a, 0x3f, 0x67, 0xd1, 0xb7, 0x6b, 0x3f, 0x57, 0x73, 0x91,
0xf0, 0x9b, 0x7c, 0xf8, 0x41, 0x5b, 0x51, 0x8b, 0x8c, 0xed, 0xfb, 0x21, 0x44, 0x5b, 0x7d, 0x1d,
0xfd, 0xf2, 0xeb, 0x38, 0xcb, 0x98, 0xd8, 0x29, 0x59, 0x5d, 0x70, 0x5f, 0x47, 0x89, 0x46, 0x4a,
0x66, 0xec, 0x7e, 0x18, 0x64, 0xb4, 0xe1, 0x2f, 0xa3, 0xef, 0x28, 0xc9, 0x29, 0x9b, 0xf0, 0x05,
0x2b, 0x87, 0xa8, 0x96, 0x16, 0x12, 0x8f, 0xbc, 0x05, 0x41, 0xdb, 0x3b, 0x3c, 0x5f, 0xb0, 0x52,
0xe0, 0xb6, 0xb5, 0x30, 0x6c, 0xdb, 0x42, 0xda, 0xf6, 0xdf, 0x0c, 0xa2, 0xef, 0x6d, 0x4f, 0x26,
0x7c, 0x9e, 0x8b, 0x43, 0x3e, 0x89, 0xb3, 0xc3, 0x34, 0xbf, 0x3e, 0x66, 0x37, 0x3b, 0x57, 0x35,
0x9f, 0x4f, 0xd9, 0xf0, 0x99, 0xff, 0x54, 0x15, 0x3a, 0x32, 0xec, 0xc8, 0x85, 0x8d, 0xef, 0x8f,
0x6f, 0xa7, 0xa4, 0xcb, 0xf2, 0x0f, 0x83, 0xe8, 0x0e, 0x2c, 0xcb, 0x98, 0x67, 0x0b, 0x66, 0x4b,
0xf3, 0x49, 0x87, 0x61, 0x1f, 0x37, 0xe5, 0xf9, 0xf4, 0xb6, 0x6a, 0xba, 0x44, 0x59, 0xf4, 0x8e,
0xdb, 0x5d, 0xc6, 0xac, 0x92, 0xc3, 0xe9, 0x11, 0xdd, 0x23, 0x34, 0x62, 0x3c, 0x3f, 0xee, 0x83,
0x6a, 0x6f, 0x69, 0x34, 0xd4, 0xde, 0x32, 0x5e, 0x19, 0x67, 0x6b, 0xa8, 0x05, 0x87, 0x30, 0xbe,
0x1e, 0xf5, 0x20, 0xb5, 0xab, 0x3f, 0x8a, 0x7e, 0xe5, 0x35, 0x2f, 0xaf, 0xab, 0x22, 0x9e, 0x30,
0x3d, 0x14, 0x1e, 0xfa, 0xda, 0x8d, 0x14, 0x8e, 0x86, 0x95, 0x2e, 0xcc, 0xe9, 0xb4, 0x8d, 0xf0,
0x65, 0xc1, 0x60, 0x0c, 0xb2, 0x8a, 0xb5, 0x90, 0xea, 0xb4, 0x10, 0xd2, 0xb6, 0xaf, 0xa3, 0xa1,
0xb5, 0x7d, 0xf1, 0xc7, 0x6c, 0x22, 0xb6, 0x93, 0x04, 0xb6, 0x8a, 0xd5, 0x95, 0xc4, 0x68, 0x3b,
0x49, 0xa8, 0x56, 0xc1, 0x51, 0xed, 0xec, 0x26, 0x7a, 0x17, 0x38, 0x3b, 0x4c, 0x2b, 0xe9, 0x70,
0x33, 0x6c, 0x45, 0x63, 0xc6, 0xe9, 0xa8, 0x2f, 0xae, 0x1d, 0xff, 0xf9, 0x20, 0xfa, 0x2e, 0xe2,
0xf9, 0x94, 0xcd, 0xf8, 0x82, 0x0d, 0x9f, 0x74, 0x5b, 0x53, 0xa4, 0xf1, 0xff, 0xd1, 0x2d, 0x34,
0x90, 0x6e, 0x32, 0x66, 0x19, 0x9b, 0x08, 0xb2, 0x9b, 0x28, 0x71, 0x67, 0x37, 0x31, 0x98, 0x33,
0xc2, 0x1a, 0xe1, 0x3e, 0x13, 0x3b, 0xf3, 0xb2, 0x64, 0xb9, 0x20, 0xdb, 0xd2, 0x22, 0x9d, 0x6d,
0xe9, 0xa1, 0x48, 0x7d, 0xf6, 0x99, 0xd8, 0xce, 0x32, 0xb2, 0x3e, 0x4a, 0xdc, 0x59, 0x1f, 0x83,
0x69, 0x0f, 0x93, 0xe8, 0x57, 0x9d, 0x27, 0x26, 0x0e, 0xf2, 0x4b, 0x3e, 0xa4, 0x9f, 0x85, 0x94,
0x1b, 0x1f, 0xab, 0x9d, 0x1c, 0x52, 0x8d, 0x17, 0x6f, 0x0a, 0x5e, 0xd2, 0xcd, 0xa2, 0xc4, 0x9d,
0xd5, 0x30, 0x98, 0xf6, 0xf0, 0x87, 0xd1, 0xdb, 0x3a, 0x4a, 0x36, 0xf3, 0xd9, 0x03, 0x34, 0x84,
0xc2, 0x09, 0xed, 0x61, 0x07, 0x65, 0x83, 0x83, 0x96, 0xe9, 0xe0, 0xf3, 0x21, 0xaa, 0x07, 0x42,
0xcf, 0x83, 0x30, 0xd4, 0xb2, 0xbd, 0xcb, 0x32, 0x46, 0xda, 0x56, 0xc2, 0x0e, 0xdb, 0x06, 0xd2,
0xb6, 0xcb, 0xe8, 0x37, 0xcc, 0x63, 0xa9, 0xe7, 0x51, 0x29, 0xaf, 0x83, 0xf4, 0x3a, 0x51, 0x6f,
0x17, 0x32, 0xbe, 0x36, 0xfa, 0xc1, 0xad, 0xfa, 0xe8, 0x11, 0x88, 0xd7, 0x07, 0x8c, 0xbf, 0x07,
0x61, 0x48, 0xdb, 0xfe, 0xdb, 0x41, 0xf4, 0x7d, 0x2d, 0x7b, 0x91, 0xc7, 0x17, 0x19, 0x93, 0x53,
0xe2, 0x31, 0x13, 0x37, 0xbc, 0xbc, 0x1e, 0x2f, 0xf3, 0x09, 0x31, 0xfd, 0xe3, 0x70, 0xc7, 0xf4,
0x4f, 0x2a, 0x39, 0x19, 0x9f, 0xae, 0xa8, 0xe0, 0x05, 0xcc, 0xf8, 0x9a, 0x1a, 0x08, 0x5e, 0x50,
0x19, 0x9f, 0x8f, 0xb4, 0xac, 0x1e, 0xd5, 0x61, 0x13, 0xb7, 0x7a, 0xe4, 0xc6, 0xc9, 0xfb, 0x21,
0xc4, 0x86, 0xad, 0xa6, 0x03, 0xf3, 0xfc, 0x32, 0x9d, 0x9e, 0x17, 0x49, 0xdd, 0x8d, 0x1f, 0xe1,
0x3d, 0xd4, 0x41, 0x88, 0xb0, 0x45, 0xa0, 0xda, 0xdb, 0xdf, 0xdb, 0xc4, 0x48, 0x0f, 0xa5, 0xbd,
0x92, 0xcf, 0x0e, 0xd9, 0x34, 0x9e, 0x2c, 0xf5, 0xf8, 0xff, 0x38, 0x34, 0xf0, 0x20, 0x6d, 0x0a,
0xf1, 0xc9, 0x2d, 0xb5, 0x74, 0x79, 0xfe, 0x7d, 0x10, 0x3d, 0x68, 0xaa, 0x7f, 0x15, 0xe7, 0x53,
0xa6, 0xdb, 0x53, 0x95, 0x7e, 0x3b, 0x4f, 0x4e, 0x59, 0x25, 0xe2, 0x52, 0x0c, 0x7f, 0x80, 0x57,
0x32, 0xa4, 0x63, 0xca, 0xf6, 0xc3, 0x6f, 0xa4, 0x6b, 0x5b, 0x7d, 0x5c, 0x07, 0x36, 0x1d, 0x02,
0xfc, 0x56, 0x97, 0x12, 0x18, 0x00, 0xee, 0x87, 0x10, 0xdb, 0xea, 0x52, 0x70, 0x90, 0x2f, 0x52,
0xc1, 0xf6, 0x59, 0xce, 0xca, 0x76, 0xab, 0x2b, 0x55, 0x1f, 0x21, 0x5a, 0x9d, 0x40, 0x6d, 0xb0,
0xf1, 0xbc, 0x99, 0xc9, 0x71, 0x3d, 0x60, 0xa4, 0x35, 0x3d, 0x6e, 0xf4, 0x83, 0xed, 0xea, 0xce,
0xf1, 0x79, 0xca, 0x16, 0xfc, 0x1a, 0xae, 0xee, 0x5c, 0x13, 0x0a, 0x20, 0x56, 0x77, 0x28, 0x68,
0x67, 0x30, 0xc7, 0xcf, 0xab, 0x94, 0xdd, 0x80, 0x19, 0xcc, 0x55, 0xae, 0xc5, 0xc4, 0x0c, 0x86,
0x60, 0xda, 0xc3, 0x71, 0xf4, 0x4b, 0x52, 0xf8, 0xfb, 0x3c, 0xcd, 0x87, 0x77, 0x11, 0xa5, 0x5a,
0x60, 0xac, 0xde, 0xa3, 0x01, 0x50, 0xe2, 0xfa, 0xd7, 0x9d, 0x38, 0x9f, 0xb0, 0x0c, 0x2d, 0xb1,
0x15, 0x07, 0x4b, 0xec, 0x61, 0x36, 0x75, 0x90, 0xc2, 0x3a, 0x7e, 0x8d, 0xaf, 0xe2, 0x32, 0xcd,
0xa7, 0x43, 0x4c, 0xd7, 0x91, 0x13, 0xa9, 0x03, 0xc6, 0x81, 0x2e, 0xac, 0x15, 0xb7, 0x8b, 0xa2,
0xac, 0xc3, 0x22, 0xd6, 0x85, 0x7d, 0x24, 0xd8, 0x85, 0x5b, 0x28, 0xee, 0x6d, 0x97, 0x4d, 0xb2,
0x34, 0x0f, 0x7a, 0xd3, 0x48, 0x1f, 0x6f, 0x16, 0x05, 0x9d, 0xf7, 0x90, 0xc5, 0x0b, 0xd6, 0xd4,
0x0c, 0x7b, 0x32, 0x2e, 0x10, 0xec, 0xbc, 0x00, 0xb4, 0xeb, 0x34, 0x29, 0x3e, 0x8a, 0xaf, 0x59,
0xfd, 0x80, 0x59, 0x3d, 0xaf, 0x0d, 0x31, 0x7d, 0x8f, 0x20, 0xd6, 0x69, 0x38, 0xa9, 0x5d, 0xcd,
0xa3, 0x77, 0xa5, 0xfc, 0x24, 0x2e, 0x45, 0x3a, 0x49, 0x8b, 0x38, 0x6f, 0xf2, 0x7f, 0x6c, 0x5c,
0xb7, 0x28, 0xe3, 0x72, 0xb3, 0x27, 0xad, 0xdd, 0xfe, 0xeb, 0x20, 0xfa, 0x00, 0xfa, 0x3d, 0x61,
0xe5, 0x2c, 0x95, 0xcb, 0xc8, 0x4a, 0x05, 0xe1, 0xe1, 0x67, 0x61, 0xa3, 0x2d, 0x05, 0x53, 0x9a,
0xcf, 0x6f, 0xaf, 0xa8, 0x0b, 0xf6, 0x07, 0x51, 0xa4, 0x96, 0x2b, 0x72, 0x49, 0xe9, 0x8f, 0x5a,
0xbd, 0x8e, 0xf1, 0xd6, 0x93, 0x1f, 0x04, 0x08, 0x3b, 0x55, 0xa8, 0xdf, 0xe5, 0x4a, 0x79, 0x88,
0x6a, 0x48, 0x11, 0x31, 0x55, 0x00, 0x04, 0x16, 0x74, 0x7c, 0xc5, 0x6f, 0xf0, 0x82, 0xd6, 0x92,
0x70, 0x41, 0x35, 0x61, 0xf7, 0xae, 0x74, 0x41, 0xb1, 0xbd, 0xab, 0xa6, 0x18, 0xa1, 0xbd, 0x2b,
0xc8, 0x68, 0xc3, 0x3c, 0xfa, 0x75, 0xd7, 0xf0, 0x73, 0xce, 0xaf, 0x67, 0x71, 0x79, 0x3d, 0x7c,
0x4c, 0x2b, 0x37, 0x8c, 0x71, 0xb4, 0xde, 0x8b, 0xb5, 0x61, 0xc1, 0x75, 0x58, 0x27, 0x1a, 0xe7,
0x65, 0x06, 0xc2, 0x82, 0x67, 0x43, 0x23, 0x44, 0x58, 0x20, 0x50, 0x1b, 0xb9, 0x5d, 0x6f, 0x63,
0x06, 0x57, 0x4b, 0x9e, 0xfa, 0x98, 0x51, 0xab, 0x25, 0x04, 0x83, 0x5d, 0x68, 0xbf, 0x8c, 0x8b,
0x2b, 0xbc, 0x0b, 0x49, 0x51, 0xb8, 0x0b, 0x35, 0x08, 0x6c, 0xef, 0x31, 0x8b, 0xcb, 0xc9, 0x15,
0xde, 0xde, 0x4a, 0x16, 0x6e, 0x6f, 0xc3, 0xc0, 0xf6, 0x56, 0x82, 0xd7, 0xa9, 0xb8, 0x3a, 0x62,
0x22, 0xc6, 0xdb, 0xdb, 0x67, 0xc2, 0xed, 0xdd, 0x62, 0x6d, 0x26, 0xe3, 0x3a, 0x1c, 0xcf, 0x2f,
0xaa, 0x49, 0x99, 0x5e, 0xb0, 0x61, 0xc0, 0x8a, 0x81, 0x88, 0x4c, 0x86, 0x84, 0xb5, 0xcf, 0x9f,
0x0d, 0xa2, 0xbb, 0x4d, 0xb3, 0xf3, 0xaa, 0x52, 0x33, 0x2b, 0x70, 0xff, 0x09, 0xde, 0xbe, 0x04,
0x4e, 0xec, 0x26, 0xf6, 0x50, 0x73, 0xa2, 0x2a, 0x5e, 0xa4, 0xf3, 0xbc, 0x32, 0x85, 0xfa, 0xac,
0x8f, 0x75, 0x47, 0x81, 0x88, 0xaa, 0xbd, 0x14, 0xed, 0x84, 0xa6, 0xdb, 0xa7, 0x91, 0x1d, 0x24,
0x15, 0x98, 0xd0, 0x9a, 0xe7, 0xed, 0x10, 0xc4, 0x84, 0x86, 0x93, 0xb0, 0x2b, 0xec, 0x97, 0x7c,
0x5e, 0x54, 0x1d, 0x5d, 0x01, 0x40, 0xe1, 0xae, 0xd0, 0x86, 0xb5, 0xcf, 0x37, 0xd1, 0x6f, 0xba,
0xdd, 0xcf, 0x7d, 0xd8, 0x9b, 0x74, 0x9f, 0xc2, 0x1e, 0xf1, 0xa8, 0x2f, 0x6e, 0x53, 0xba, 0xc6,
0xb3, 0xd8, 0x65, 0x22, 0x4e, 0xb3, 0x6a, 0xb8, 0x82, 0xdb, 0x68, 0xe4, 0x44, 0x4a, 0x87, 0x71,
0x30, 0xbe, 0xed, 0xce, 0x8b, 0x2c, 0x9d, 0xb4, 0xf7, 0x72, 0xb5, 0xae, 0x11, 0x87, 0xe3, 0x9b,
0x8b, 0xc1, 0x78, 0x3d, 0x66, 0x42, 0xfd, 0xe7, 0x6c, 0x59, 0x30, 0x3c, 0x5e, 0x7b, 0x48, 0x38,
0x5e, 0x43, 0x14, 0xd6, 0x67, 0xcc, 0xc4, 0x61, 0xbc, 0xe4, 0x73, 0x22, 0x5e, 0x1b, 0x71, 0xb8,
0x3e, 0x2e, 0x66, 0xb3, 0x2a, 0xe3, 0xe1, 0x20, 0x17, 0xac, 0xcc, 0xe3, 0x6c, 0x2f, 0x8b, 0xa7,
0xd5, 0x90, 0x88, 0x31, 0x3e, 0x45, 0x64, 0x55, 0x34, 0x8d, 0x3c, 0xc6, 0x83, 0x6a, 0x2f, 0x5e,
0xf0, 0x32, 0x15, 0xf4, 0x63, 0xb4, 0x48, 0xe7, 0x63, 0xf4, 0x50, 0xd4, 0xdb, 0x76, 0x39, 0xb9,
0x4a, 0x17, 0x2c, 0x09, 0x78, 0x6b, 0x90, 0x1e, 0xde, 0x1c, 0x14, 0x69, 0xb4, 0x31, 0x9f, 0x97,
0x13, 0x46, 0x36, 0x9a, 0x12, 0x77, 0x36, 0x9a, 0xc1, 0xb4, 0x87, 0xbf, 0x1c, 0x44, 0xbf, 0xa5,
0xa4, 0xee, 0x06, 0xeb, 0x6e, 0x5c, 0x5d, 0x5d, 0xf0, 0xb8, 0x4c, 0x86, 0x1f, 0x61, 0x76, 0x50,
0xd4, 0xb8, 0x7e, 0x7a, 0x1b, 0x15, 0xf8, 0x58, 0x0f, 0xd3, 0xca, 0x19, 0x71, 0xe8, 0x63, 0xf5,
0x90, 0xf0, 0x63, 0x85, 0x28, 0x0c, 0x20, 0x52, 0xae, 0x36, 0x33, 0x56, 0x48, 0x7d, 0x7f, 0x47,
0x63, 0xb5, 0x93, 0x83, 0xf1, 0xb1, 0x16, 0xfa, 0xbd, 0x65, 0x93, 0xb2, 0x81, 0xf7, 0x98, 0x51,
0x5f, 0x9c, 0xf4, 0x6c, 0x46, 0x45, 0xd8, 0x73, 0x6b, 0x64, 0x8c, 0xfa, 0xe2, 0x84, 0x67, 0x27,
0xac, 0x85, 0x3c, 0x23, 0xa1, 0x6d, 0xd4, 0x17, 0x87, 0xd9, 0x97, 0x66, 0x9a, 0x79, 0xe1, 0x71,
0xc0, 0x0e, 0x9c, 0x1b, 0xd6, 0x7b, 0xb1, 0xda, 0xe1, 0x5f, 0x0f, 0xa2, 0xef, 0x59, 0x8f, 0x47,
0x3c, 0x49, 0x2f, 0x97, 0x0a, 0x7a, 0x15, 0x67, 0x73, 0x56, 0x0d, 0x9f, 0x52, 0xd6, 0xda, 0xac,
0x29, 0xc1, 0xb3, 0x5b, 0xe9, 0xc0, 0xb1, 0xb3, 0x5d, 0x14, 0xd9, 0xf2, 0x8c, 0xcd, 0x8a, 0x8c,
0x1c, 0x3b, 0x1e, 0x12, 0x1e, 0x3b, 0x10, 0x85, 0x59, 0xf9, 0x19, 0xaf, 0x73, 0x7e, 0x34, 0x2b,
0x97, 0xa2, 0x70, 0x56, 0xde, 0x20, 0x30, 0x57, 0x3a, 0xe3, 0x3b, 0x3c, 0xcb, 0xd8, 0x44, 0xb4,
0x5f, 0xd2, 0x1a, 0x4d, 0x4b, 0x84, 0x73, 0x25, 0x40, 0xda, 0xfd, 0x8c, 0x66, 0x0d, 0x19, 0x97,
0xec, 0xf9, 0xf2, 0x30, 0xcd, 0xaf, 0x87, 0x78, 0x5a, 0x60, 0x01, 0x62, 0x3f, 0x03, 0x05, 0xe1,
0x5a, 0xf5, 0x3c, 0x4f, 0x38, 0xbe, 0x56, 0xad, 0x25, 0xe1, 0xb5, 0xaa, 0x26, 0xa0, 0xc9, 0x53,
0x46, 0x99, 0xac, 0x25, 0x61, 0x93, 0x9a, 0xc0, 0x42, 0xa1, 0xde, 0xf5, 0x26, 0x43, 0x21, 0xd8,
0xe7, 0x5e, 0xed, 0xe4, 0x60, 0x0f, 0x6d, 0x16, 0xad, 0x7b, 0x4c, 0x4c, 0xae, 0xf0, 0x1e, 0xea,
0x21, 0xe1, 0x1e, 0x0a, 0x51, 0x58, 0xa5, 0x33, 0x6e, 0x16, 0xdd, 0x2b, 0x78, 0xff, 0x68, 0x2d,
0xb8, 0x57, 0x3b, 0x39, 0xb8, 0x8c, 0x3c, 0x98, 0xc9, 0x67, 0x86, 0x76, 0x72, 0x25, 0x0b, 0x2f,
0x23, 0x0d, 0x03, 0x4b, 0xaf, 0x04, 0xf5, 0xe3, 0xc4, 0x4b, 0x6f, 0xe5, 0xe1, 0xd2, 0x7b, 0x9c,
0x76, 0xf2, 0xcf, 0x66, 0x19, 0xa7, 0xa4, 0xc7, 0xbc, 0x1e, 0x23, 0xaf, 0xe2, 0x2c, 0x4d, 0x62,
0xc1, 0xce, 0xf8, 0x35, 0xcb, 0xf1, 0x15, 0x93, 0x2e, 0xad, 0xe2, 0x47, 0x9e, 0x42, 0x78, 0xc5,
0x14, 0x56, 0x84, 0xfd, 0x44, 0xd1, 0xe7, 0x15, 0xdb, 0x89, 0x2b, 0x22, 0x92, 0x79, 0x48, 0xb8,
0x9f, 0x40, 0x14, 0xe6, 0xab, 0x4a, 0xfe, 0xe2, 0x4d, 0xc1, 0xca, 0x94, 0xe5, 0x13, 0x86, 0xe7,
0xab, 0x90, 0x0a, 0xe7, 0xab, 0x08, 0xdd, 0xda, 0xa6, 0x31, 0xc1, 0xa9, 0x7d, 0xce, 0x02, 0x12,
0x81, 0x73, 0x16, 0x04, 0x0a, 0x2b, 0x69, 0x01, 0x74, 0xab, 0xb3, 0x65, 0x25, 0xb8, 0xd5, 0x49,
0xd3, 0xad, 0xcd, 0x2f, 0xc3, 0x8c, 0xeb, 0x61, 0xd2, 0x51, 0xf4, 0xb1, 0x3b, 0x5c, 0xd6, 0x7b,
0xb1, 0xf8, 0x6e, 0xdb, 0x29, 0xcb, 0x62, 0x39, 0x85, 0x04, 0xb6, 0xb4, 0x1a, 0xa6, 0xcf, 0x6e,
0x9b, 0xc3, 0x6a, 0x87, 0x3f, 0x1d, 0x44, 0xef, 0x63, 0x1e, 0x5f, 0x16, 0xd2, 0xef, 0x93, 0x6e,
0x5b, 0x8a, 0x24, 0x0e, 0x92, 0x84, 0x35, 0x74, 0x19, 0xfe, 0x24, 0x7a, 0xaf, 0x11, 0xd9, 0x73,
0x26, 0xba, 0x00, 0x7e, 0x02, 0x65, 0xca, 0x0f, 0x39, 0xe3, 0x7e, 0xab, 0x37, 0x6f, 0xd7, 0x26,
0x7e, 0xb9, 0x2a, 0xb0, 0x36, 0x31, 0x36, 0xb4, 0x98, 0x58, 0x9b, 0x20, 0x98, 0xdd, 0xd5, 0x70,
0xab, 0xf7, 0x3a, 0x15, 0x57, 0x32, 0xf7, 0x01, 0xbb, 0x1a, 0x5e, 0x59, 0x0d, 0x44, 0xec, 0x6a,
0x90, 0x30, 0xcc, 0x0e, 0x1a, 0xb0, 0x1e, 0x9b, 0x58, 0x5c, 0x35, 0x86, 0xdc, 0x91, 0xb9, 0xd6,
0x0d, 0xc2, 0xfe, 0xda, 0x88, 0xf5, 0x32, 0xe4, 0x71, 0xc8, 0x02, 0x58, 0x8a, 0xac, 0xf7, 0x62,
0xb5, 0xc3, 0x3f, 0x8b, 0xbe, 0xdb, 0xaa, 0xd8, 0x1e, 0x8b, 0xc5, 0xbc, 0x64, 0xc9, 0x70, 0xab,
0xa3, 0xdc, 0x0d, 0x68, 0x5c, 0x3f, 0xe9, 0xaf, 0xd0, 0xca, 0x97, 0x1b, 0x4e, 0x75, 0x2b, 0x53,
0x86, 0xa7, 0x21, 0x93, 0x3e, 0x1b, 0xcc, 0x97, 0x69, 0x9d, 0xd6, 0x92, 0xd7, 0xed, 0x5d, 0xdb,
0x8b, 0x38, 0xcd, 0xe4, 0x2b, 0xa7, 0x8f, 0x42, 0x46, 0x3d, 0x34, 0xb8, 0xe4, 0x25, 0x55, 0x5a,
0x91, 0x59, 0x8e, 0x71, 0x67, 0xa9, 0xb4, 0x41, 0x47, 0x02, 0x64, 0xa5, 0xb4, 0xd9, 0x93, 0xd6,
0x6e, 0x45, 0xb3, 0x55, 0x58, 0xff, 0xec, 0x76, 0x72, 0xcc, 0xab, 0x56, 0x45, 0x7a, 0xfa, 0x66,
0x4f, 0x5a, 0x7b, 0xfd, 0xd3, 0xe8, 0xbd, 0xb6, 0x57, 0x3d, 0x11, 0x6d, 0x75, 0x9a, 0x02, 0x73,
0xd1, 0x93, 0xfe, 0x0a, 0xda, 0xfd, 0xbf, 0x99, 0x3d, 0x62, 0xe5, 0x7f, 0xc2, 0x67, 0x33, 0x96,
0x27, 0x2c, 0x69, 0x34, 0xaa, 0x7a, 0x2d, 0xf3, 0x39, 0x6d, 0xd7, 0x28, 0x8c, 0x5c, 0x0d, 0x53,
0xa2, 0xdf, 0xfe, 0x06, 0x9a, 0xba, 0x68, 0xff, 0x39, 0x88, 0x1e, 0xa1, 0x45, 0x6b, 0x3a, 0xae,
0x57, 0xc4, 0xdf, 0xeb, 0xe3, 0x08, 0xd3, 0x34, 0x45, 0xdd, 0xfe, 0x7f, 0x58, 0xb0, 0x8b, 0xb5,
0x2f, 0xd2, 0x4a, 0xf0, 0x72, 0x39, 0xbe, 0xe2, 0x37, 0xcd, 0x69, 0x78, 0x3f, 0xf6, 0x69, 0x60,
0xe4, 0x10, 0xc4, 0x62, 0x0d, 0x27, 0x5b, 0xae, 0xec, 0xa9, 0xf9, 0x8a, 0x70, 0xe5, 0x10, 0x1d,
0xae, 0x7c, 0xd2, 0x46, 0xfe, 0xa6, 0x56, 0xf6, 0x88, 0xff, 0x2a, 0x5e, 0xd4, 0xf6, 0x31, 0xff,
0xb5, 0x6e, 0xd0, 0xe6, 0x7f, 0x5a, 0xbc, 0x9b, 0x5e, 0x5e, 0x9a, 0x3a, 0xe1, 0x25, 0x75, 0x11,
0x22, 0xff, 0x23, 0x50, 0xbb, 0x9c, 0xd8, 0x4b, 0x33, 0x26, 0xdf, 0x55, 0xbc, 0xbc, 0xbc, 0xcc,
0x78, 0x9c, 0x80, 0xe5, 0x44, 0x2d, 0x1e, 0xb9, 0x72, 0x62, 0x39, 0x81, 0x71, 0xf6, 0x30, 0x5d,
0x2d, 0xad, 0x7b, 0x50, 0x3e, 0x49, 0x33, 0x78, 0x38, 0x50, 0x6a, 0x1a, 0x21, 0x71, 0x98, 0xae,
0x05, 0xd9, 0x34, 0xa3, 0x16, 0xd5, 0x41, 0xb4, 0x29, 0xff, 0xc3, 0xb6, 0xa2, 0x23, 0x26, 0xd2,
0x0c, 0x04, 0xb3, 0xab, 0xea, 0x5a, 0x78, 0x5e, 0x48, 0xe3, 0xf7, 0xda, 0x5a, 0x4a, 0x42, 0xac,
0xaa, 0x7d, 0xc2, 0xae, 0x0e, 0xeb, 0xdf, 0x77, 0xf9, 0x4d, 0x2e, 0x8d, 0xde, 0x6f, 0xab, 0x34,
0x32, 0x62, 0x75, 0x08, 0x19, 0x6d, 0xf8, 0x47, 0xd1, 0x2f, 0x4a, 0xc3, 0x25, 0x2f, 0x86, 0x77,
0x10, 0x85, 0xd2, 0x39, 0xc7, 0x77, 0x97, 0x94, 0xdb, 0xe3, 0xa8, 0xa6, 0x6f, 0x9c, 0x57, 0xf1,
0x94, 0x0d, 0x1f, 0x10, 0x2d, 0x2e, 0xa5, 0xc4, 0x71, 0xd4, 0x36, 0xe5, 0xf7, 0x8a, 0x63, 0x9e,
0x68, 0xeb, 0x48, 0x0d, 0x8d, 0x30, 0xd4, 0x2b, 0x5c, 0xc8, 0xa6, 0x86, 0xc7, 0xf1, 0x22, 0x9d,
0x9a, 0xe9, 0x5b, 0x05, 0xb2, 0x0a, 0xa4, 0x86, 0x96, 0x19, 0x39, 0x10, 0x91, 0x1a, 0x92, 0xb0,
0xf6, 0xf9, 0x4f, 0x83, 0xe8, 0x9e, 0x65, 0xf6, 0x9b, 0x7d, 0xc8, 0x83, 0xfc, 0x92, 0xd7, 0x89,
0xe4, 0x61, 0x9a, 0x5f, 0x57, 0xc3, 0x4f, 0x29, 0x93, 0x38, 0x6f, 0x8a, 0xf2, 0xd9, 0xad, 0xf5,
0xec, 0x1a, 0xa0, 0xd9, 0xa4, 0xb3, 0x6f, 0xea, 0x95, 0x06, 0x58, 0x03, 0x98, 0xbd, 0x3c, 0xc8,
0x11, 0x6b, 0x80, 0x10, 0x6f, 0x9b, 0xd8, 0x38, 0xcf, 0x78, 0x0e, 0x9b, 0xd8, 0x5a, 0xa8, 0x85,
0x44, 0x13, 0xb7, 0x20, 0x1b, 0x8f, 0x1b, 0x91, 0xda, 0x4f, 0xda, 0xce, 0x32, 0x10, 0x8f, 0x8d,
0xaa, 0x01, 0x88, 0x78, 0x8c, 0x82, 0xda, 0xcf, 0x69, 0xf4, 0xed, 0xfa, 0x91, 0x9e, 0x94, 0x6c,
0x91, 0x32, 0x78, 0xa8, 0xc4, 0x91, 0x10, 0xe3, 0xdf, 0x27, 0xec, 0xc8, 0x3a, 0xcf, 0xab, 0x22,
0x8b, 0xab, 0x2b, 0x7d, 0xcc, 0xc0, 0xaf, 0x73, 0x23, 0x84, 0x07, 0x0d, 0x1e, 0x76, 0x50, 0x36,
0xa8, 0x37, 0x32, 0x13, 0x62, 0x56, 0x70, 0xd5, 0x56, 0x98, 0x59, 0xed, 0xe4, 0xec, 0x5e, 0xfe,
0x7e, 0x9c, 0x65, 0xac, 0x5c, 0x36, 0xb2, 0xa3, 0x38, 0x4f, 0x2f, 0x59, 0x25, 0xc0, 0x5e, 0xbe,
0xa6, 0x46, 0x10, 0x23, 0xf6, 0xf2, 0x03, 0xb8, 0x5d, 0x1b, 0x01, 0xcf, 0x07, 0x79, 0xc2, 0xde,
0x80, 0xb5, 0x11, 0xb4, 0x23, 0x19, 0x62, 0x6d, 0x44, 0xb1, 0x76, 0x4f, 0xfb, 0x79, 0xc6, 0x27,
0xd7, 0x7a, 0x0a, 0xf0, 0x1b, 0x58, 0x4a, 0xe0, 0x1c, 0x70, 0x3f, 0x84, 0xd8, 0x49, 0x40, 0x0a,
0x4e, 0x59, 0x91, 0xc5, 0x13, 0x78, 0xb2, 0x48, 0xe9, 0x68, 0x19, 0x31, 0x09, 0x40, 0x06, 0x14,
0x57, 0x9f, 0x58, 0xc2, 0x8a, 0x0b, 0x0e, 0x2c, 0xdd, 0x0f, 0x21, 0x76, 0x1a, 0x94, 0x82, 0x71,
0x91, 0xa5, 0x02, 0x0c, 0x03, 0xa5, 0x21, 0x25, 0xc4, 0x30, 0xf0, 0x09, 0x60, 0xf2, 0x88, 0x95,
0x53, 0x86, 0x9a, 0x94, 0x92, 0xa0, 0xc9, 0x86, 0xb0, 0x07, 0x50, 0x55, 0xdd, 0x79, 0xb1, 0x04,
0x07, 0x50, 0x75, 0xb5, 0x78, 0xb1, 0x24, 0x0e, 0xa0, 0x7a, 0x00, 0x28, 0xe2, 0x49, 0x5c, 0x09,
0xbc, 0x88, 0x52, 0x12, 0x2c, 0x62, 0x43, 0xd8, 0x39, 0x5a, 0x15, 0x71, 0x2e, 0xc0, 0x1c, 0xad,
0x0b, 0xe0, 0xbc, 0x5b, 0xbf, 0x4b, 0xca, 0x6d, 0x24, 0x51, 0xad, 0xc2, 0xc4, 0x5e, 0xca, 0xb2,
0xa4, 0x02, 0x91, 0x44, 0x3f, 0xf7, 0x46, 0x4a, 0x44, 0x92, 0x36, 0x05, 0xba, 0x92, 0xde, 0xf9,
0xc7, 0x6a, 0x07, 0x36, 0xfd, 0xef, 0x87, 0x10, 0x1b, 0x9f, 0x9a, 0x42, 0xef, 0xc4, 0x65, 0x99,
0xd6, 0x93, 0xff, 0x0a, 0x5e, 0xa0, 0x46, 0x4e, 0xc4, 0x27, 0x8c, 0x03, 0xc3, 0xab, 0x09, 0xdc,
0x58, 0xc1, 0x60, 0xe8, 0xfe, 0x30, 0xc8, 0xd8, 0x8c, 0x53, 0x4a, 0x9c, 0x97, 0xc3, 0xd8, 0xd3,
0x44, 0xde, 0x0d, 0xaf, 0x74, 0x61, 0xce, 0x07, 0x22, 0xc6, 0xc5, 0x11, 0x5f, 0xb0, 0x33, 0xfe,
0xe2, 0x4d, 0x5a, 0x89, 0x34, 0x9f, 0xea, 0x99, 0xfb, 0x19, 0x61, 0x09, 0x83, 0x89, 0x0f, 0x44,
0x3a, 0x95, 0x6c, 0x02, 0x01, 0xca, 0x72, 0xcc, 0x6e, 0xd0, 0x04, 0x02, 0x5a, 0x34, 0x1c, 0x91,
0x40, 0x84, 0x78, 0xbb, 0x2b, 0x65, 0x9c, 0xeb, 0xaf, 0x68, 0xcf, 0x78, 0x93, 0xcb, 0x51, 0xd6,
0x20, 0x48, 0x6c, 0x0c, 0x04, 0x15, 0xec, 0xfa, 0xd2, 0xf8, 0xb7, 0x43, 0x6c, 0x8d, 0xb0, 0xd3,
0x1e, 0x66, 0x8f, 0x7a, 0x90, 0x88, 0x2b, 0x7b, 0xc2, 0x81, 0x72, 0xd5, 0x3e, 0xe0, 0xf0, 0xa8,
0x07, 0xe9, 0xec, 0x70, 0xb9, 0xd5, 0x7a, 0x1e, 0x4f, 0xae, 0xa7, 0x25, 0x9f, 0xe7, 0xc9, 0x0e,
0xcf, 0x78, 0x09, 0x76, 0xb8, 0xbc, 0x52, 0x03, 0x94, 0xd8, 0xe1, 0xea, 0x50, 0xb1, 0x19, 0x9c,
0x5b, 0x8a, 0xed, 0x2c, 0x9d, 0xc2, 0x15, 0xb5, 0x67, 0x48, 0x02, 0x44, 0x06, 0x87, 0x82, 0x48,
0x27, 0x52, 0x2b, 0x6e, 0x91, 0x4e, 0xe2, 0x4c, 0xf9, 0xdb, 0xa2, 0xcd, 0x78, 0x60, 0x67, 0x27,
0x42, 0x14, 0x90, 0x7a, 0x9e, 0xcd, 0xcb, 0xfc, 0x20, 0x17, 0x9c, 0xac, 0x67, 0x03, 0x74, 0xd6,
0xd3, 0x01, 0x41, 0x58, 0x3d, 0x63, 0x6f, 0xea, 0xd2, 0xd4, 0xff, 0x60, 0x61, 0xb5, 0xfe, 0x7d,
0xa4, 0xe5, 0xa1, 0xb0, 0x0a, 0x38, 0x50, 0x19, 0xed, 0x44, 0x75, 0x98, 0x80, 0xb6, 0xdf, 0x4d,
0xd6, 0xba, 0x41, 0xdc, 0xcf, 0x58, 0x2c, 0x33, 0x16, 0xf2, 0x23, 0x81, 0x3e, 0x7e, 0x1a, 0xd0,
0x6e, 0xb7, 0x78, 0xf5, 0xb9, 0x62, 0x93, 0xeb, 0xd6, 0x81, 0x2d, 0xbf, 0xa0, 0x0a, 0x21, 0xb6,
0x5b, 0x08, 0x14, 0x6f, 0xa2, 0x83, 0x09, 0xcf, 0x43, 0x4d, 0x54, 0xcb, 0xfb, 0x34, 0x91, 0xe6,
0xec, 0xe2, 0xd7, 0x48, 0x75, 0xcf, 0x54, 0xcd, 0xb4, 0x4e, 0x58, 0x70, 0x21, 0x62, 0xf1, 0x4b,
0xc2, 0x36, 0x27, 0x87, 0x3e, 0x8f, 0xda, 0xa7, 0xd9, 0x5b, 0x56, 0x8e, 0xe8, 0xd3, 0xec, 0x14,
0x4b, 0x57, 0x52, 0xf5, 0x91, 0x0e, 0x2b, 0x7e, 0x3f, 0xd9, 0xe8, 0x07, 0xdb, 0x25, 0x8f, 0xe7,
0x73, 0x27, 0x63, 0x71, 0xa9, 0xbc, 0x6e, 0x06, 0x0c, 0x59, 0x8c, 0x58, 0xf2, 0x04, 0x70, 0x10,
0xc2, 0x3c, 0xcf, 0x3b, 0x3c, 0x17, 0x2c, 0x17, 0x58, 0x08, 0xf3, 0x8d, 0x69, 0x30, 0x14, 0xc2,
0x28, 0x05, 0xd0, 0x6f, 0xe5, 0x7e, 0x10, 0x13, 0xc7, 0xf1, 0x0c, 0xcd, 0xd8, 0xd4, 0x5e, 0x8f,
0x92, 0x87, 0xfa, 0x2d, 0xe0, 0x9c, 0x57, 0xa6, 0xae, 0x97, 0xb3, 0xb8, 0x9c, 0x9a, 0xdd, 0x8d,
0x64, 0xf8, 0x84, 0xb6, 0xe3, 0x93, 0xc4, 0x2b, 0xd3, 0xb0, 0x06, 0x08, 0x3b, 0x07, 0xb3, 0x78,
0x6a, 0x6a, 0x8a, 0xd4, 0x40, 0xca, 0x5b, 0x55, 0x5d, 0xeb, 0x06, 0x81, 0x9f, 0x57, 0x69, 0xc2,
0x78, 0xc0, 0x8f, 0x94, 0xf7, 0xf1, 0x03, 0x41, 0x90, 0xbd, 0xd5, 0xf5, 0x56, 0x2b, 0xba, 0xed,
0x3c, 0xd1, 0xeb, 0xd8, 0x11, 0xf1, 0x78, 0x00, 0x17, 0xca, 0xde, 0x08, 0x1e, 0x8c, 0xd1, 0x66,
0x83, 0x36, 0x34, 0x46, 0xcd, 0xfe, 0x6b, 0x9f, 0x31, 0x8a, 0xc1, 0xda, 0xe7, 0x4f, 0xf4, 0x18,
0xdd, 0x8d, 0x45, 0x5c, 0xe7, 0xed, 0xaf, 0x52, 0x76, 0xa3, 0x17, 0xc2, 0x48, 0x7d, 0x1b, 0x6a,
0x24, 0x3f, 0x63, 0x04, 0xab, 0xe2, 0xad, 0xde, 0x7c, 0xc0, 0xb7, 0x5e, 0x21, 0x74, 0xfa, 0x06,
0x4b, 0x85, 0xad, 0xde, 0x7c, 0xc0, 0xb7, 0xfe, 0x3e, 0xba, 0xd3, 0x37, 0xf8, 0x48, 0x7a, 0xab,
0x37, 0xaf, 0x7d, 0xff, 0x45, 0x33, 0x70, 0x5d, 0xe7, 0x75, 0x1e, 0x36, 0x11, 0xe9, 0x82, 0x61,
0xe9, 0xa4, 0x6f, 0xcf, 0xa0, 0xa1, 0x74, 0x92, 0x56, 0x71, 0x2e, 0xd5, 0xc1, 0x4a, 0x71, 0xc2,
0xab, 0x54, 0x1e, 0x79, 0x78, 0xd6, 0xc3, 0x68, 0x03, 0x87, 0x16, 0x4d, 0x21, 0x25, 0xfb, 0xf2,
0xd6, 0x43, 0xed, 0xf9, 0xec, 0x8d, 0x80, 0xbd, 0xf6, 0x31, 0xed, 0xcd, 0x9e, 0xb4, 0x7d, 0x8d,
0xea, 0x31, 0xee, 0xfb, 0xdb, 0x50, 0xab, 0xa2, 0xaf, 0x70, 0x9f, 0xf4, 0x57, 0xd0, 0xee, 0xff,
0xaa, 0x59, 0x57, 0x40, 0xff, 0x7a, 0x10, 0x3c, 0xed, 0x63, 0x11, 0x0c, 0x84, 0x67, 0xb7, 0xd2,
0xd1, 0x05, 0xf9, 0xbb, 0x66, 0x01, 0xdd, 0xa0, 0xf2, 0x2b, 0x95, 0x97, 0x65, 0xc2, 0x4a, 0x3d,
0x26, 0x42, 0xcd, 0x6a, 0x61, 0x38, 0x32, 0x3e, 0xb9, 0xa5, 0x96, 0x73, 0xc5, 0x92, 0x07, 0xeb,
0xaf, 0x29, 0x9d, 0xf2, 0x84, 0x2c, 0x3b, 0x34, 0x2c, 0xd0, 0xa7, 0xb7, 0x55, 0xa3, 0xc6, 0x8a,
0x03, 0xcb, 0x1b, 0x1b, 0x9e, 0xf5, 0x34, 0xec, 0xdd, 0xe1, 0xf0, 0xf1, 0xed, 0x94, 0x74, 0x59,
0xfe, 0x63, 0x10, 0x3d, 0xf4, 0x58, 0xfb, 0x3e, 0x01, 0xec, 0x7a, 0xfc, 0x30, 0x60, 0x9f, 0x52,
0x32, 0x85, 0xfb, 0x9d, 0x6f, 0xa6, 0x6c, 0xef, 0x23, 0xf2, 0x54, 0xf6, 0xd2, 0x4c, 0xb0, 0xb2,
0x7d, 0x1f, 0x91, 0x6f, 0x57, 0x51, 0x23, 0xfa, 0x3e, 0xa2, 0x00, 0xee, 0xdc, 0x47, 0x84, 0x78,
0x46, 0xef, 0x23, 0x42, 0xad, 0x05, 0xef, 0x23, 0x0a, 0x6b, 0x50, 0xe1, 0xbd, 0x29, 0x82, 0xda,
0xb7, 0xee, 0x65, 0xd1, 0xdf, 0xc6, 0x7e, 0x7a, 0x1b, 0x15, 0x62, 0x82, 0x53, 0x9c, 0x3c, 0x35,
0xd8, 0xe3, 0x99, 0x7a, 0x27, 0x07, 0xb7, 0x7a, 0xf3, 0xda, 0xf7, 0x8f, 0xf5, 0xea, 0xc6, 0x84,
0x73, 0x5e, 0xca, 0xbb, 0xa8, 0xd6, 0x43, 0xe1, 0xb9, 0xb6, 0xe0, 0xb6, 0xfc, 0x46, 0x3f, 0x98,
0xa8, 0x6e, 0x4d, 0xe8, 0x46, 0x1f, 0x75, 0x19, 0x02, 0x4d, 0xbe, 0xd5, 0x9b, 0x27, 0xa6, 0x11,
0xe5, 0x5b, 0xb5, 0x76, 0x0f, 0x63, 0x7e, 0x5b, 0x3f, 0xe9, 0xaf, 0xa0, 0xdd, 0x2f, 0x74, 0xda,
0xe8, 0xba, 0x97, 0xed, 0xbc, 0xd9, 0x65, 0x6a, 0xec, 0x35, 0xf3, 0xa8, 0x2f, 0x1e, 0x4a, 0x20,
0xdc, 0x29, 0xb4, 0x2b, 0x81, 0x40, 0xa7, 0xd1, 0x8f, 0x6f, 0xa7, 0xa4, 0xcb, 0xf2, 0x8f, 0x83,
0xe8, 0x2e, 0x59, 0x16, 0xdd, 0x0f, 0x3e, 0xed, 0x6b, 0x19, 0xf4, 0x87, 0xcf, 0x6e, 0xad, 0xa7,
0x0b, 0xf5, 0x2f, 0x83, 0xe8, 0x5e, 0xa0, 0x50, 0xaa, 0x83, 0xdc, 0xc2, 0xba, 0xdf, 0x51, 0x3e,
0xbf, 0xbd, 0x22, 0x35, 0xdd, 0xbb, 0xf8, 0xb8, 0x7d, 0x51, 0x4f, 0xc0, 0xf6, 0x98, 0xbe, 0xa8,
0xa7, 0x5b, 0x0b, 0x6e, 0xf2, 0xc4, 0x17, 0xcd, 0xa2, 0x0b, 0xdd, 0xe4, 0x91, 0xe7, 0xfd, 0xc0,
0x9a, 0x63, 0xb5, 0x93, 0xc3, 0x9c, 0xbc, 0x78, 0x53, 0xc4, 0x79, 0x42, 0x3b, 0x51, 0xf2, 0x6e,
0x27, 0x86, 0x83, 0x9b, 0x63, 0xb5, 0xf4, 0x94, 0x37, 0x0b, 0xa9, 0x47, 0x94, 0xbe, 0x41, 0x82,
0x9b, 0x63, 0x2d, 0x94, 0xf0, 0xa6, 0xb3, 0xc6, 0x90, 0x37, 0x90, 0x2c, 0x3e, 0xee, 0x83, 0x82,
0x14, 0xdd, 0x78, 0x33, 0x7b, 0xee, 0x1b, 0x21, 0x2b, 0xad, 0x7d, 0xf7, 0xcd, 0x9e, 0x34, 0xe1,
0x76, 0xcc, 0xc4, 0x17, 0x2c, 0x4e, 0x58, 0x19, 0x74, 0x6b, 0xa8, 0x5e, 0x6e, 0x5d, 0x1a, 0x73,
0xbb, 0xc3, 0xb3, 0xf9, 0x2c, 0xd7, 0x8d, 0x49, 0xba, 0x75, 0xa9, 0x6e, 0xb7, 0x80, 0x86, 0xdb,
0x82, 0xd6, 0xad, 0x4c, 0x2f, 0x1f, 0x87, 0xcd, 0x78, 0x59, 0xe5, 0x7a, 0x2f, 0x96, 0xae, 0xa7,
0xee, 0x46, 0x1d, 0xf5, 0x04, 0x3d, 0x69, 0xb3, 0x27, 0x0d, 0xf7, 0xe7, 0x1c, 0xb7, 0xa6, 0x3f,
0x6d, 0x75, 0xd8, 0x6a, 0x75, 0xa9, 0x27, 0xfd, 0x15, 0xe0, 0x6e, 0xa8, 0xee, 0x55, 0x87, 0x69,
0x25, 0xf6, 0xd2, 0x2c, 0x1b, 0xae, 0x07, 0xba, 0x49, 0x03, 0x05, 0x77, 0x43, 0x11, 0x98, 0xe8,
0xc9, 0xcd, 0xee, 0x61, 0x3e, 0xec, 0xb2, 0x23, 0xa9, 0x5e, 0x3d, 0xd9, 0xa5, 0xc1, 0x8e, 0x96,
0xf3, 0xa8, 0x4d, 0x6d, 0x47, 0xe1, 0x07, 0xd7, 0xaa, 0xf0, 0x56, 0x6f, 0x1e, 0xbc, 0x6e, 0x97,
0x94, 0x9c, 0x59, 0x1e, 0x50, 0x26, 0xbc, 0x99, 0xe4, 0x61, 0x07, 0x05, 0x76, 0x05, 0xd5, 0x30,
0x7a, 0x9d, 0x26, 0x53, 0x26, 0xd0, 0x37, 0x45, 0x2e, 0x10, 0x7c, 0x53, 0x04, 0x40, 0xd0, 0x74,
0xea, 0x77, 0xb3, 0x1d, 0x7a, 0x90, 0x60, 0x4d, 0xa7, 0x95, 0x1d, 0x2a, 0xd4, 0x74, 0x28, 0x0d,
0xa2, 0x81, 0x71, 0xab, 0x2f, 0x1a, 0x78, 0x1c, 0x32, 0x03, 0x6e, 0x1b, 0x58, 0xef, 0xc5, 0x82,
0x19, 0xc5, 0x3a, 0x4c, 0x67, 0xa9, 0xc0, 0x66, 0x14, 0xc7, 0x46, 0x8d, 0x84, 0x66, 0x94, 0x36,
0x4a, 0x55, 0xaf, 0xce, 0x11, 0x0e, 0x92, 0x70, 0xf5, 0x14, 0xd3, 0xaf, 0x7a, 0x86, 0x6d, 0xbd,
0xd8, 0xcc, 0x4d, 0x97, 0x11, 0x57, 0x7a, 0xb1, 0x8c, 0xf4, 0x6d, 0xf9, 0x01, 0x2a, 0x04, 0x43,
0x51, 0x87, 0x52, 0x80, 0x1b, 0xf6, 0x35, 0xd7, 0xbc, 0x7b, 0x2d, 0x0a, 0x16, 0x97, 0x71, 0x3e,
0x41, 0x17, 0xa7, 0xd2, 0x60, 0x8b, 0x0c, 0x2d, 0x4e, 0x49, 0x0d, 0xf0, 0xda, 0xdc, 0xff, 0x74,
0x14, 0x19, 0x0a, 0xe6, 0x1b, 0x4d, 0xff, 0xcb, 0xd1, 0x47, 0x3d, 0x48, 0xf8, 0xda, 0xbc, 0x01,
0xcc, 0xc6, 0xb7, 0x72, 0xfa, 0x51, 0xc0, 0x94, 0x8f, 0x86, 0x16, 0xc2, 0xb4, 0x0a, 0xe8, 0xd4,
0x26, 0xc1, 0x65, 0xe2, 0x47, 0x6c, 0x89, 0x75, 0x6a, 0x9b, 0x9f, 0x4a, 0x24, 0xd4, 0xa9, 0xdb,
0x28, 0xc8, 0x33, 0xdd, 0x75, 0xd0, 0x4a, 0x40, 0xdf, 0x5d, 0xfa, 0xac, 0x76, 0x72, 0x60, 0xe4,
0xec, 0xa6, 0x0b, 0xef, 0x3d, 0x01, 0x52, 0xd0, 0xdd, 0x74, 0x81, 0xbf, 0x26, 0x58, 0xef, 0xc5,
0xc2, 0x57, 0xf2, 0xb1, 0x60, 0x6f, 0x9a, 0x77, 0xe5, 0x48, 0x71, 0xa5, 0xbc, 0xf5, 0xb2, 0x7c,
0xad, 0x1b, 0xb4, 0x07, 0x60, 0x4f, 0x4a, 0x3e, 0x61, 0x55, 0xa5, 0x6f, 0x2f, 0xf4, 0x4f, 0x18,
0x69, 0xd9, 0x08, 0xdc, 0x5d, 0xf8, 0x20, 0x0c, 0xd9, 0x96, 0xd1, 0x22, 0x7b, 0x9f, 0xcf, 0x0a,
0xaa, 0xd9, 0xbe, 0xca, 0x67, 0xb5, 0x93, 0xb3, 0xc3, 0x4b, 0x4b, 0xdd, 0x0b, 0x7c, 0xd6, 0x50,
0x75, 0xec, 0xee, 0x9e, 0x47, 0x3d, 0x48, 0xed, 0xea, 0x8b, 0xe8, 0xad, 0x43, 0x3e, 0x1d, 0xb3,
0x3c, 0x19, 0x7e, 0xdf, 0x3f, 0x42, 0xcb, 0xa7, 0xa3, 0xfa, 0x67, 0x63, 0xf4, 0x0e, 0x25, 0xb6,
0x87, 0x00, 0x77, 0xd9, 0xc5, 0x7c, 0x3a, 0x16, 0xb1, 0x00, 0x87, 0x00, 0xe5, 0xef, 0xa3, 0x5a,
0x40, 0x1c, 0x02, 0xf4, 0x00, 0x60, 0xef, 0xac, 0x64, 0x0c, 0xb5, 0x57, 0x0b, 0x82, 0xf6, 0x34,
0x60, 0xb3, 0x08, 0x63, 0xaf, 0x4e, 0xd4, 0xe1, 0xa1, 0x3d, 0xab, 0x23, 0xa5, 0x44, 0x16, 0xd1,
0xa6, 0x6c, 0xe7, 0x56, 0xd5, 0x97, 0xf7, 0xa9, 0xcc, 0x67, 0xb3, 0xb8, 0x5c, 0x82, 0xce, 0xad,
0x6b, 0xe9, 0x00, 0x44, 0xe7, 0x46, 0x41, 0x3b, 0x6a, 0x9b, 0xc7, 0x3c, 0xb9, 0xde, 0xe7, 0x25,
0x9f, 0x8b, 0x34, 0x67, 0xf0, 0x4e, 0x0d, 0xf3, 0x40, 0x5d, 0x86, 0x18, 0xb5, 0x14, 0x6b, 0xb3,
0x5c, 0x49, 0xa8, 0xf3, 0x84, 0xf2, 0x4e, 0xe3, 0x4a, 0xf0, 0x12, 0xbe, 0x4f, 0x54, 0x56, 0x20,
0x44, 0x64, 0xb9, 0x24, 0x0c, 0xda, 0xfe, 0x24, 0xcd, 0xa7, 0x68, 0xdb, 0x9f, 0xb8, 0x37, 0x82,
0xde, 0xa3, 0x01, 0x3b, 0xa0, 0xd4, 0x43, 0x53, 0x03, 0x40, 0x7f, 0x19, 0x8b, 0x3e, 0x74, 0x97,
0x20, 0x06, 0x14, 0x4e, 0x02, 0x57, 0x2f, 0x0b, 0x96, 0xb3, 0xa4, 0x39, 0x35, 0x87, 0xb9, 0xf2,
0x88, 0xa0, 0x2b, 0x48, 0xda, 0x58, 0x24, 0xe5, 0xa7, 0xf3, 0xfc, 0xa4, 0xe4, 0x97, 0x69, 0xc6,
0x4a, 0x10, 0x8b, 0x94, 0xba, 0x23, 0x27, 0x62, 0x11, 0xc6, 0xd9, 0xe3, 0x17, 0x52, 0xea, 0x5d,
0xcc, 0x7d, 0x56, 0xc6, 0x13, 0x78, 0xfc, 0x42, 0xd9, 0x68, 0x63, 0xc4, 0xce, 0x60, 0x00, 0x77,
0x12, 0x1d, 0xe5, 0x3a, 0x5f, 0xca, 0xfe, 0xa1, 0xbf, 0xcc, 0x94, 0xf7, 0x64, 0x56, 0x20, 0xd1,
0xd1, 0xe6, 0x30, 0x92, 0x48, 0x74, 0xc2, 0x1a, 0x76, 0x2a, 0x91, 0xdc, 0xb1, 0x3e, 0x56, 0x04,
0xa6, 0x12, 0x65, 0xa3, 0x11, 0x12, 0x53, 0x49, 0x0b, 0x02, 0x01, 0xa9, 0x19, 0x06, 0x53, 0x34,
0x20, 0x19, 0x69, 0x30, 0x20, 0xb9, 0x94, 0x0d, 0x14, 0x07, 0x79, 0x2a, 0xd2, 0x38, 0x1b, 0x33,
0x71, 0x12, 0x97, 0xf1, 0x8c, 0x09, 0x56, 0xc2, 0x40, 0xa1, 0x91, 0x91, 0xc7, 0x10, 0x81, 0x82,
0x62, 0xb5, 0xc3, 0xdf, 0x8d, 0xde, 0xa9, 0xe7, 0x7d, 0x96, 0xeb, 0x3f, 0xc1, 0xf1, 0x42, 0xfe,
0xed, 0x9e, 0xe1, 0xbb, 0xc6, 0xc6, 0x58, 0x94, 0x2c, 0x9e, 0x35, 0xb6, 0xdf, 0x36, 0xbf, 0x4b,
0xf0, 0xc9, 0xa0, 0xee, 0xcf, 0xc7, 0x5c, 0xa4, 0x97, 0xf5, 0x32, 0x5b, 0x7f, 0x41, 0x04, 0xfa,
0xb3, 0x2b, 0x1e, 0x05, 0x6e, 0xd9, 0xc0, 0x38, 0x1b, 0xa7, 0x5d, 0xe9, 0x29, 0x2b, 0x32, 0x18,
0xa7, 0x3d, 0x6d, 0x09, 0x10, 0x71, 0x1a, 0x05, 0xed, 0xe0, 0x74, 0xc5, 0x67, 0x2c, 0x5c, 0x99,
0x33, 0xd6, 0xaf, 0x32, 0x67, 0xde, 0x47, 0x19, 0x59, 0xf4, 0xce, 0x11, 0x9b, 0x5d, 0xb0, 0xb2,
0xba, 0x4a, 0x8b, 0xfd, 0x3a, 0xe1, 0x8a, 0xc5, 0x1c, 0x7e, 0xb6, 0x68, 0x89, 0x91, 0x41, 0x88,
0xac, 0x94, 0x40, 0xed, 0x4c, 0x60, 0x81, 0x83, 0xea, 0x38, 0x9e, 0x31, 0x79, 0x67, 0x08, 0x98,
0x09, 0x1c, 0x23, 0x0e, 0x44, 0xcc, 0x04, 0x24, 0xec, 0x7c, 0xdf, 0x65, 0x99, 0x53, 0x36, 0xad,
0x7b, 0x58, 0x79, 0x12, 0x2f, 0x67, 0x2c, 0x17, 0xda, 0x24, 0xd8, 0x93, 0x77, 0x4c, 0xe2, 0x3c,
0xb1, 0x27, 0xdf, 0x47, 0xcf, 0x09, 0x4d, 0xde, 0x83, 0x3f, 0xe1, 0xa5, 0x50, 0x7f, 0x60, 0xe7,
0xbc, 0xcc, 0x40, 0x68, 0xf2, 0x1f, 0xaa, 0x47, 0x12, 0xa1, 0x29, 0xac, 0xe1, 0xdc, 0x4c, 0xef,
0x95, 0xe1, 0x15, 0x2b, 0x4d, 0x3f, 0x79, 0x31, 0x8b, 0xd3, 0x4c, 0xf7, 0x86, 0x1f, 0x04, 0x6c,
0x13, 0x3a, 0xc4, 0xcd, 0xf4, 0x7d, 0x75, 0x9d, 0xbb, 0xfc, 0xc3, 0x25, 0x04, 0xaf, 0x08, 0x3a,
0xec, 0x13, 0xaf, 0x08, 0xba, 0xb5, 0xec, 0xca, 0xdd, 0xb2, 0x92, 0x5b, 0x4a, 0x62, 0x87, 0x27,
0x70, 0xbf, 0xd0, 0xb1, 0x09, 0x40, 0x62, 0xe5, 0x1e, 0x54, 0xb0, 0xa9, 0x81, 0xc5, 0xf6, 0xd2,
0x3c, 0xce, 0xd2, 0x9f, 0xc0, 0xb4, 0xde, 0xb1, 0xd3, 0x10, 0x44, 0x6a, 0x80, 0x93, 0x98, 0xab,
0x7d, 0x26, 0xce, 0xd2, 0x3a, 0xf4, 0xaf, 0x05, 0x9e, 0x9b, 0x24, 0xba, 0x5d, 0x39, 0xa4, 0x73,
0xfb, 0x2c, 0x7c, 0xac, 0xdb, 0x45, 0x31, 0xae, 0x67, 0xd5, 0x53, 0x36, 0x61, 0x69, 0x21, 0x86,
0x9f, 0x84, 0x9f, 0x15, 0xc0, 0x89, 0x83, 0x16, 0x3d, 0xd4, 0x9c, 0xd7, 0xf7, 0x75, 0x2c, 0x19,
0xab, 0xbf, 0x3c, 0x77, 0x5e, 0xb1, 0x52, 0x27, 0x1a, 0xfb, 0x4c, 0x80, 0xd1, 0xe9, 0x70, 0x23,
0x07, 0xac, 0x2b, 0x4a, 0x8c, 0xce, 0xb0, 0x86, 0xdd, 0xec, 0x73, 0xb8, 0x53, 0x56, 0xf1, 0x6c,
0xc1, 0xe4, 0x79, 0xc3, 0x0d, 0xd2, 0x98, 0x43, 0x11, 0x9b, 0x7d, 0x34, 0x6d, 0xb3, 0xb5, 0xb6,
0xdb, 0xed, 0x7c, 0x79, 0x00, 0x8f, 0x4c, 0x20, 0x96, 0x24, 0x46, 0x64, 0x6b, 0x01, 0xdc, 0xd9,
0x0c, 0x2f, 0x79, 0x9c, 0x4c, 0xe2, 0x4a, 0x9c, 0xc4, 0xcb, 0x8c, 0xc7, 0x89, 0x9c, 0xd7, 0xe1,
0x66, 0x78, 0xc3, 0x8c, 0x5c, 0x88, 0xda, 0x0c, 0xa7, 0x60, 0x37, 0x3b, 0x93, 0x7f, 0x50, 0x4f,
0x9f, 0xe5, 0x84, 0xd9, 0x99, 0x2c, 0x2f, 0x3c, 0xc7, 0xf9, 0x20, 0x0c, 0xd9, 0x6f, 0xd0, 0x94,
0x48, 0xa6, 0x21, 0xf7, 0x30, 0x1d, 0x2f, 0x01, 0xf9, 0x20, 0x40, 0xd8, 0x5b, 0x3e, 0xd4, 0xef,
0xcd, 0xdf, 0x84, 0x11, 0xfa, 0x8e, 0xee, 0x0d, 0x4c, 0xd7, 0x85, 0x46, 0xee, 0x65, 0x11, 0x9b,
0x3d, 0x69, 0x9b, 0x66, 0xee, 0x5c, 0xc5, 0x62, 0x3b, 0x49, 0x8e, 0x58, 0x85, 0x7c, 0x50, 0x5e,
0x0b, 0x47, 0x56, 0x4a, 0xa4, 0x99, 0x6d, 0xca, 0x76, 0xf4, 0x5a, 0xf6, 0x22, 0x49, 0x85, 0x96,
0x35, 0x27, 0xa4, 0x37, 0xda, 0x06, 0xda, 0x14, 0x51, 0x2b, 0x9a, 0xb6, 0xb1, 0xbc, 0x66, 0xce,
0xf8, 0x74, 0x9a, 0x31, 0x0d, 0x9d, 0xb2, 0x58, 0x5d, 0x51, 0xb8, 0xd5, 0xb6, 0x85, 0x82, 0x44,
0x2c, 0x0f, 0x2a, 0xd8, 0x34, 0xb2, 0xc6, 0xd4, 0x2b, 0xa9, 0xe6, 0xc1, 0xae, 0xb6, 0xcd, 0x78,
0x00, 0x91, 0x46, 0xa2, 0xa0, 0xfd, 0xee, 0xad, 0x16, 0xef, 0xb3, 0xe6, 0x49, 0xc0, 0x0b, 0x9d,
0xa4, 0xb2, 0x23, 0x26, 0xbe, 0x7b, 0x43, 0x30, 0xbb, 0x4e, 0x00, 0x1e, 0x9e, 0x2f, 0x0f, 0x12,
0xb8, 0x4e, 0x80, 0xfa, 0x92, 0x21, 0xd6, 0x09, 0x14, 0xeb, 0x37, 0x9d, 0xd9, 0xf7, 0x3a, 0x8c,
0x2b, 0x5b, 0x39, 0xa4, 0xe9, 0x50, 0x30, 0xd4, 0x74, 0x94, 0x82, 0xff, 0x48, 0xdd, 0xad, 0x35,
0xe4, 0x91, 0x62, 0xfb, 0x6a, 0x2b, 0x5d, 0x98, 0x8d, 0x4b, 0x66, 0x3d, 0x29, 0x8f, 0x2c, 0xe1,
0x7f, 0x9b, 0x40, 0x09, 0x89, 0xb8, 0xd4, 0x82, 0x94, 0xed, 0xe7, 0x1f, 0xfc, 0xd7, 0x57, 0x77,
0x06, 0x3f, 0xff, 0xea, 0xce, 0xe0, 0x7f, 0xbe, 0xba, 0x33, 0xf8, 0xd9, 0xd7, 0x77, 0xbe, 0xf5,
0xf3, 0xaf, 0xef, 0x7c, 0xeb, 0xbf, 0xbf, 0xbe, 0xf3, 0xad, 0x2f, 0xdf, 0xd2, 0x7f, 0x68, 0xf5,
0xe2, 0x17, 0xe4, 0x9f, 0x4b, 0x7d, 0xf6, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xab, 0xf4, 0x52,
0x6c, 0x8c, 0x75, 0x00, 0x00,
// 5307 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x9d, 0xdd, 0x6f, 0x1d, 0x49,
0x56, 0xc0, 0xf7, 0xbe, 0x30, 0xd0, 0xcb, 0x0e, 0x70, 0x07, 0x86, 0xd9, 0x61, 0x37, 0xc9, 0x64,
0x92, 0x38, 0x89, 0xed, 0xeb, 0x4c, 0x32, 0x5f, 0xec, 0x22, 0x81, 0x63, 0xc7, 0x1e, 0xb3, 0xb6,
0x63, 0x7c, 0xaf, 0x13, 0x69, 0x24, 0x24, 0xda, 0xb7, 0xcb, 0xd7, 0x8d, 0xfb, 0x76, 0xf5, 0x76,
0xd7, 0xbd, 0xce, 0x5d, 0x04, 0x02, 0x81, 0x40, 0x20, 0x10, 0x2b, 0xbe, 0xc4, 0x1b, 0x12, 0x7f,
0x01, 0x7f, 0x06, 0x8f, 0xfb, 0xc8, 0x23, 0x9a, 0x79, 0xe3, 0x9d, 0x77, 0xd4, 0x55, 0xd5, 0xf5,
0x71, 0xfa, 0x9c, 0xea, 0xf6, 0xf0, 0x94, 0xe8, 0x9e, 0xdf, 0x39, 0xa7, 0x3e, 0x4f, 0x9d, 0xaa,
0xae, 0x6e, 0x47, 0xb7, 0x8b, 0xf3, 0xad, 0xa2, 0xe4, 0x82, 0x57, 0x5b, 0x15, 0x2b, 0x97, 0xe9,
0x94, 0x35, 0xff, 0x8e, 0xe4, 0xcf, 0xc3, 0xb7, 0xe2, 0x7c, 0x25, 0x56, 0x05, 0x7b, 0xff, 0x3d,
0x4b, 0x4e, 0xf9, 0x7c, 0x1e, 0xe7, 0x49, 0xa5, 0x90, 0xf7, 0xdf, 0xb5, 0x12, 0xb6, 0x64, 0xb9,
0xd0, 0xbf, 0x3f, 0xfd, 0xdf, 0xff, 0x19, 0x44, 0x6f, 0xef, 0x64, 0x29, 0xcb, 0xc5, 0x8e, 0xd6,
0x18, 0x7e, 0x19, 0x7d, 0x67, 0xbb, 0x28, 0xf6, 0x99, 0x78, 0xc5, 0xca, 0x2a, 0xe5, 0xf9, 0xf0,
0xc3, 0x91, 0x76, 0x30, 0x3a, 0x2d, 0xa6, 0xa3, 0xed, 0xa2, 0x18, 0x59, 0xe1, 0xe8, 0x94, 0xfd,
0x78, 0xc1, 0x2a, 0xf1, 0xfe, 0xbd, 0x30, 0x54, 0x15, 0x3c, 0xaf, 0xd8, 0xf0, 0x22, 0xfa, 0x95,
0xed, 0xa2, 0x18, 0x33, 0xb1, 0xcb, 0xea, 0x0a, 0x8c, 0x45, 0x2c, 0xd8, 0x70, 0xad, 0xa5, 0xea,
0x03, 0xc6, 0xc7, 0xc3, 0x6e, 0x50, 0xfb, 0x99, 0x44, 0xdf, 0xae, 0xfd, 0x5c, 0x2e, 0x44, 0xc2,
0xaf, 0xf3, 0xe1, 0x07, 0x6d, 0x45, 0x2d, 0x32, 0xb6, 0xef, 0x86, 0x10, 0x6d, 0xf5, 0x75, 0xf4,
0x8b, 0xaf, 0xe3, 0x2c, 0x63, 0x62, 0xa7, 0x64, 0x75, 0xc1, 0x7d, 0x1d, 0x25, 0x1a, 0x29, 0x99,
0xb1, 0xfb, 0x61, 0x90, 0xd1, 0x86, 0xbf, 0x8c, 0xbe, 0xa3, 0x24, 0xa7, 0x6c, 0xca, 0x97, 0xac,
0x1c, 0xa2, 0x5a, 0x5a, 0x48, 0x34, 0x79, 0x0b, 0x82, 0xb6, 0x77, 0x78, 0xbe, 0x64, 0xa5, 0xc0,
0x6d, 0x6b, 0x61, 0xd8, 0xb6, 0x85, 0xb4, 0xed, 0xbf, 0x1e, 0x44, 0xdf, 0xdb, 0x9e, 0x4e, 0xf9,
0x22, 0x17, 0x87, 0x7c, 0x1a, 0x67, 0x87, 0x69, 0x7e, 0x75, 0xcc, 0xae, 0x77, 0x2e, 0x6b, 0x3e,
0x9f, 0xb1, 0xe1, 0x33, 0xbf, 0x55, 0x15, 0x3a, 0x32, 0xec, 0xc8, 0x85, 0x8d, 0xef, 0x8f, 0x6f,
0xa6, 0xa4, 0xcb, 0xf2, 0xf7, 0x83, 0xe8, 0x16, 0x2c, 0xcb, 0x98, 0x67, 0x4b, 0x66, 0x4b, 0xf3,
0x49, 0x87, 0x61, 0x1f, 0x37, 0xe5, 0xf9, 0xf4, 0xa6, 0x6a, 0xba, 0x44, 0x59, 0xf4, 0x8e, 0x3b,
0x5c, 0xc6, 0xac, 0x92, 0xd3, 0xe9, 0x11, 0x3d, 0x22, 0x34, 0x62, 0x3c, 0x3f, 0xee, 0x83, 0x6a,
0x6f, 0x69, 0x34, 0xd4, 0xde, 0x32, 0x5e, 0x19, 0x67, 0x0f, 0x51, 0x0b, 0x0e, 0x61, 0x7c, 0x3d,
0xea, 0x41, 0x6a, 0x57, 0x7f, 0x10, 0xfd, 0xd2, 0x6b, 0x5e, 0x5e, 0x55, 0x45, 0x3c, 0x65, 0x7a,
0x2a, 0xdc, 0xf7, 0xb5, 0x1b, 0x29, 0x9c, 0x0d, 0x0f, 0xba, 0x30, 0x67, 0xd0, 0x36, 0xc2, 0x97,
0x05, 0x83, 0x31, 0xc8, 0x2a, 0xd6, 0x42, 0x6a, 0xd0, 0x42, 0x48, 0xdb, 0xbe, 0x8a, 0x86, 0xd6,
0xf6, 0xf9, 0x1f, 0xb2, 0xa9, 0xd8, 0x4e, 0x12, 0xd8, 0x2b, 0x56, 0x57, 0x12, 0xa3, 0xed, 0x24,
0xa1, 0x7a, 0x05, 0x47, 0xb5, 0xb3, 0xeb, 0xe8, 0x5d, 0xe0, 0xec, 0x30, 0xad, 0xa4, 0xc3, 0xcd,
0xb0, 0x15, 0x8d, 0x19, 0xa7, 0xa3, 0xbe, 0xb8, 0x76, 0xfc, 0xa7, 0x83, 0xe8, 0xbb, 0x88, 0xe7,
0x53, 0x36, 0xe7, 0x4b, 0x36, 0x7c, 0xd2, 0x6d, 0x4d, 0x91, 0xc6, 0xff, 0x47, 0x37, 0xd0, 0x40,
0x86, 0xc9, 0x98, 0x65, 0x6c, 0x2a, 0xc8, 0x61, 0xa2, 0xc4, 0x9d, 0xc3, 0xc4, 0x60, 0xce, 0x0c,
0x6b, 0x84, 0xfb, 0x4c, 0xec, 0x2c, 0xca, 0x92, 0xe5, 0x82, 0xec, 0x4b, 0x8b, 0x74, 0xf6, 0xa5,
0x87, 0x22, 0xf5, 0xd9, 0x67, 0x62, 0x3b, 0xcb, 0xc8, 0xfa, 0x28, 0x71, 0x67, 0x7d, 0x0c, 0xa6,
0x3d, 0x4c, 0xa3, 0x5f, 0x76, 0x5a, 0x4c, 0x1c, 0xe4, 0x17, 0x7c, 0x48, 0xb7, 0x85, 0x94, 0x1b,
0x1f, 0x6b, 0x9d, 0x1c, 0x52, 0x8d, 0x17, 0x6f, 0x0a, 0x5e, 0xd2, 0xdd, 0xa2, 0xc4, 0x9d, 0xd5,
0x30, 0x98, 0xf6, 0xf0, 0xfb, 0xd1, 0xdb, 0x3a, 0x4a, 0x36, 0xeb, 0xd9, 0x3d, 0x34, 0x84, 0xc2,
0x05, 0xed, 0x7e, 0x07, 0x65, 0x83, 0x83, 0x96, 0xe9, 0xe0, 0xf3, 0x21, 0xaa, 0x07, 0x42, 0xcf,
0xbd, 0x30, 0xd4, 0xb2, 0xbd, 0xcb, 0x32, 0x46, 0xda, 0x56, 0xc2, 0x0e, 0xdb, 0x06, 0xd2, 0xb6,
0xcb, 0xe8, 0xd7, 0x4c, 0xb3, 0xd4, 0xeb, 0xa8, 0x94, 0xd7, 0x41, 0x7a, 0x9d, 0xa8, 0xb7, 0x0b,
0x19, 0x5f, 0x1b, 0xfd, 0xe0, 0x56, 0x7d, 0xf4, 0x0c, 0xc4, 0xeb, 0x03, 0xe6, 0xdf, 0xbd, 0x30,
0xa4, 0x6d, 0xff, 0xcd, 0x20, 0xfa, 0xbe, 0x96, 0xbd, 0xc8, 0xe3, 0xf3, 0x8c, 0xc9, 0x25, 0xf1,
0x98, 0x89, 0x6b, 0x5e, 0x5e, 0x8d, 0x57, 0xf9, 0x94, 0x58, 0xfe, 0x71, 0xb8, 0x63, 0xf9, 0x27,
0x95, 0x9c, 0x8c, 0x4f, 0x57, 0x54, 0xf0, 0x02, 0x66, 0x7c, 0x4d, 0x0d, 0x04, 0x2f, 0xa8, 0x8c,
0xcf, 0x47, 0x5a, 0x56, 0x8f, 0xea, 0xb0, 0x89, 0x5b, 0x3d, 0x72, 0xe3, 0xe4, 0xdd, 0x10, 0x62,
0xc3, 0x56, 0x33, 0x80, 0x79, 0x7e, 0x91, 0xce, 0xce, 0x8a, 0xa4, 0x1e, 0xc6, 0x8f, 0xf0, 0x11,
0xea, 0x20, 0x44, 0xd8, 0x22, 0x50, 0xed, 0xed, 0xef, 0x6c, 0x62, 0xa4, 0xa7, 0xd2, 0x5e, 0xc9,
0xe7, 0x87, 0x6c, 0x16, 0x4f, 0x57, 0x7a, 0xfe, 0x7f, 0x1c, 0x9a, 0x78, 0x90, 0x36, 0x85, 0xf8,
0xe4, 0x86, 0x5a, 0xba, 0x3c, 0xff, 0x36, 0x88, 0xee, 0x35, 0xd5, 0xbf, 0x8c, 0xf3, 0x19, 0xd3,
0xfd, 0xa9, 0x4a, 0xbf, 0x9d, 0x27, 0xa7, 0xac, 0x12, 0x71, 0x29, 0x86, 0x3f, 0xc0, 0x2b, 0x19,
0xd2, 0x31, 0x65, 0xfb, 0xe1, 0x37, 0xd2, 0xb5, 0xbd, 0x3e, 0xae, 0x03, 0x9b, 0x0e, 0x01, 0x7e,
0xaf, 0x4b, 0x09, 0x0c, 0x00, 0x77, 0x43, 0x88, 0xed, 0x75, 0x29, 0x38, 0xc8, 0x97, 0xa9, 0x60,
0xfb, 0x2c, 0x67, 0x65, 0xbb, 0xd7, 0x95, 0xaa, 0x8f, 0x10, 0xbd, 0x4e, 0xa0, 0x36, 0xd8, 0x78,
0xde, 0xcc, 0xe2, 0xb8, 0x1e, 0x30, 0xd2, 0x5a, 0x1e, 0x37, 0xfa, 0xc1, 0x76, 0x77, 0xe7, 0xf8,
0x3c, 0x65, 0x4b, 0x7e, 0x05, 0x77, 0x77, 0xae, 0x09, 0x05, 0x10, 0xbb, 0x3b, 0x14, 0xb4, 0x2b,
0x98, 0xe3, 0xe7, 0x55, 0xca, 0xae, 0xc1, 0x0a, 0xe6, 0x2a, 0xd7, 0x62, 0x62, 0x05, 0x43, 0x30,
0xed, 0xe1, 0x38, 0xfa, 0x05, 0x29, 0xfc, 0x5d, 0x9e, 0xe6, 0xc3, 0xdb, 0x88, 0x52, 0x2d, 0x30,
0x56, 0xef, 0xd0, 0x00, 0x28, 0x71, 0xfd, 0xeb, 0x4e, 0x9c, 0x4f, 0x59, 0x86, 0x96, 0xd8, 0x8a,
0x83, 0x25, 0xf6, 0x30, 0x9b, 0x3a, 0x48, 0x61, 0x1d, 0xbf, 0xc6, 0x97, 0x71, 0x99, 0xe6, 0xb3,
0x21, 0xa6, 0xeb, 0xc8, 0x89, 0xd4, 0x01, 0xe3, 0xc0, 0x10, 0xd6, 0x8a, 0xdb, 0x45, 0x51, 0xd6,
0x61, 0x11, 0x1b, 0xc2, 0x3e, 0x12, 0x1c, 0xc2, 0x2d, 0x14, 0xf7, 0xb6, 0xcb, 0xa6, 0x59, 0x9a,
0x07, 0xbd, 0x69, 0xa4, 0x8f, 0x37, 0x8b, 0x82, 0xc1, 0x7b, 0xc8, 0xe2, 0x25, 0x6b, 0x6a, 0x86,
0xb5, 0x8c, 0x0b, 0x04, 0x07, 0x2f, 0x00, 0xed, 0x3e, 0x4d, 0x8a, 0x8f, 0xe2, 0x2b, 0x56, 0x37,
0x30, 0xab, 0xd7, 0xb5, 0x21, 0xa6, 0xef, 0x11, 0xc4, 0x3e, 0x0d, 0x27, 0xb5, 0xab, 0x45, 0xf4,
0xae, 0x94, 0x9f, 0xc4, 0xa5, 0x48, 0xa7, 0x69, 0x11, 0xe7, 0x4d, 0xfe, 0x8f, 0xcd, 0xeb, 0x16,
0x65, 0x5c, 0x6e, 0xf6, 0xa4, 0xb5, 0xdb, 0x7f, 0x19, 0x44, 0x1f, 0x40, 0xbf, 0x27, 0xac, 0x9c,
0xa7, 0x72, 0x1b, 0x59, 0xa9, 0x20, 0x3c, 0xfc, 0x2c, 0x6c, 0xb4, 0xa5, 0x60, 0x4a, 0xf3, 0xf9,
0xcd, 0x15, 0x75, 0xc1, 0x7e, 0x2f, 0x8a, 0xd4, 0x76, 0x45, 0x6e, 0x29, 0xfd, 0x59, 0xab, 0xf7,
0x31, 0xde, 0x7e, 0xf2, 0x83, 0x00, 0x61, 0x97, 0x0a, 0xf5, 0xbb, 0xdc, 0x29, 0x0f, 0x51, 0x0d,
0x29, 0x22, 0x96, 0x0a, 0x80, 0xc0, 0x82, 0x8e, 0x2f, 0xf9, 0x35, 0x5e, 0xd0, 0x5a, 0x12, 0x2e,
0xa8, 0x26, 0xec, 0xd9, 0x95, 0x2e, 0x28, 0x76, 0x76, 0xd5, 0x14, 0x23, 0x74, 0x76, 0x05, 0x19,
0x6d, 0x98, 0x47, 0xbf, 0xea, 0x1a, 0x7e, 0xce, 0xf9, 0xd5, 0x3c, 0x2e, 0xaf, 0x86, 0x8f, 0x69,
0xe5, 0x86, 0x31, 0x8e, 0xd6, 0x7b, 0xb1, 0x36, 0x2c, 0xb8, 0x0e, 0xeb, 0x44, 0xe3, 0xac, 0xcc,
0x40, 0x58, 0xf0, 0x6c, 0x68, 0x84, 0x08, 0x0b, 0x04, 0x6a, 0x23, 0xb7, 0xeb, 0x6d, 0xcc, 0xe0,
0x6e, 0xc9, 0x53, 0x1f, 0x33, 0x6a, 0xb7, 0x84, 0x60, 0x70, 0x08, 0xed, 0x97, 0x71, 0x71, 0x89,
0x0f, 0x21, 0x29, 0x0a, 0x0f, 0xa1, 0x06, 0x81, 0xfd, 0x3d, 0x66, 0x71, 0x39, 0xbd, 0xc4, 0xfb,
0x5b, 0xc9, 0xc2, 0xfd, 0x6d, 0x18, 0xd8, 0xdf, 0x4a, 0xf0, 0x3a, 0x15, 0x97, 0x47, 0x4c, 0xc4,
0x78, 0x7f, 0xfb, 0x4c, 0xb8, 0xbf, 0x5b, 0xac, 0xcd, 0x64, 0x5c, 0x87, 0xe3, 0xc5, 0x79, 0x35,
0x2d, 0xd3, 0x73, 0x36, 0x0c, 0x58, 0x31, 0x10, 0x91, 0xc9, 0x90, 0xb0, 0xf6, 0xf9, 0xd3, 0x41,
0x74, 0xbb, 0xe9, 0x76, 0x5e, 0x55, 0x6a, 0x65, 0x05, 0xee, 0x3f, 0xc1, 0xfb, 0x97, 0xc0, 0x89,
0xd3, 0xc4, 0x1e, 0x6a, 0x4e, 0x54, 0xc5, 0x8b, 0x74, 0x96, 0x57, 0xa6, 0x50, 0x9f, 0xf5, 0xb1,
0xee, 0x28, 0x10, 0x51, 0xb5, 0x97, 0xa2, 0x5d, 0xd0, 0x74, 0xff, 0x34, 0xb2, 0x83, 0xa4, 0x02,
0x0b, 0x5a, 0xd3, 0xde, 0x0e, 0x41, 0x2c, 0x68, 0x38, 0x09, 0x87, 0xc2, 0x7e, 0xc9, 0x17, 0x45,
0xd5, 0x31, 0x14, 0x00, 0x14, 0x1e, 0x0a, 0x6d, 0x58, 0xfb, 0x7c, 0x13, 0xfd, 0xba, 0x3b, 0xfc,
0xdc, 0xc6, 0xde, 0xa4, 0xc7, 0x14, 0xd6, 0xc4, 0xa3, 0xbe, 0xb8, 0x4d, 0xe9, 0x1a, 0xcf, 0x62,
0x97, 0x89, 0x38, 0xcd, 0xaa, 0xe1, 0x03, 0xdc, 0x46, 0x23, 0x27, 0x52, 0x3a, 0x8c, 0x83, 0xf1,
0x6d, 0x77, 0x51, 0x64, 0xe9, 0xb4, 0x7d, 0x96, 0xab, 0x75, 0x8d, 0x38, 0x1c, 0xdf, 0x5c, 0x0c,
0xc6, 0xeb, 0x31, 0x13, 0xea, 0x3f, 0x93, 0x55, 0xc1, 0xf0, 0x78, 0xed, 0x21, 0xe1, 0x78, 0x0d,
0x51, 0x58, 0x9f, 0x31, 0x13, 0x87, 0xf1, 0x8a, 0x2f, 0x88, 0x78, 0x6d, 0xc4, 0xe1, 0xfa, 0xb8,
0x98, 0xcd, 0xaa, 0x8c, 0x87, 0x83, 0x5c, 0xb0, 0x32, 0x8f, 0xb3, 0xbd, 0x2c, 0x9e, 0x55, 0x43,
0x22, 0xc6, 0xf8, 0x14, 0x91, 0x55, 0xd1, 0x34, 0xd2, 0x8c, 0x07, 0xd5, 0x5e, 0xbc, 0xe4, 0x65,
0x2a, 0xe8, 0x66, 0xb4, 0x48, 0x67, 0x33, 0x7a, 0x28, 0xea, 0x6d, 0xbb, 0x9c, 0x5e, 0xa6, 0x4b,
0x96, 0x04, 0xbc, 0x35, 0x48, 0x0f, 0x6f, 0x0e, 0x8a, 0x74, 0xda, 0x98, 0x2f, 0xca, 0x29, 0x23,
0x3b, 0x4d, 0x89, 0x3b, 0x3b, 0xcd, 0x60, 0xda, 0xc3, 0x5f, 0x0c, 0xa2, 0xdf, 0x50, 0x52, 0xf7,
0x80, 0x75, 0x37, 0xae, 0x2e, 0xcf, 0x79, 0x5c, 0x26, 0xc3, 0x8f, 0x30, 0x3b, 0x28, 0x6a, 0x5c,
0x3f, 0xbd, 0x89, 0x0a, 0x6c, 0xd6, 0xc3, 0xb4, 0x72, 0x66, 0x1c, 0xda, 0xac, 0x1e, 0x12, 0x6e,
0x56, 0x88, 0xc2, 0x00, 0x22, 0xe5, 0xea, 0x30, 0xe3, 0x01, 0xa9, 0xef, 0x9f, 0x68, 0xac, 0x75,
0x72, 0x30, 0x3e, 0xd6, 0x42, 0x7f, 0xb4, 0x6c, 0x52, 0x36, 0xf0, 0x11, 0x33, 0xea, 0x8b, 0x93,
0x9e, 0xcd, 0xac, 0x08, 0x7b, 0x6e, 0xcd, 0x8c, 0x51, 0x5f, 0x9c, 0xf0, 0xec, 0x84, 0xb5, 0x90,
0x67, 0x24, 0xb4, 0x8d, 0xfa, 0xe2, 0x30, 0xfb, 0xd2, 0x4c, 0xb3, 0x2e, 0x3c, 0x0e, 0xd8, 0x81,
0x6b, 0xc3, 0x7a, 0x2f, 0x56, 0x3b, 0xfc, 0xab, 0x41, 0xf4, 0x3d, 0xeb, 0xf1, 0x88, 0x27, 0xe9,
0xc5, 0x4a, 0x41, 0xaf, 0xe2, 0x6c, 0xc1, 0xaa, 0xe1, 0x53, 0xca, 0x5a, 0x9b, 0x35, 0x25, 0x78,
0x76, 0x23, 0x1d, 0x38, 0x77, 0xb6, 0x8b, 0x22, 0x5b, 0x4d, 0xd8, 0xbc, 0xc8, 0xc8, 0xb9, 0xe3,
0x21, 0xe1, 0xb9, 0x03, 0x51, 0x98, 0x95, 0x4f, 0x78, 0x9d, 0xf3, 0xa3, 0x59, 0xb9, 0x14, 0x85,
0xb3, 0xf2, 0x06, 0x81, 0xb9, 0xd2, 0x84, 0xef, 0xf0, 0x2c, 0x63, 0x53, 0xd1, 0x7e, 0x48, 0x6b,
0x34, 0x2d, 0x11, 0xce, 0x95, 0x00, 0x69, 0xcf, 0x33, 0x9a, 0x3d, 0x64, 0x5c, 0xb2, 0xe7, 0xab,
0xc3, 0x34, 0xbf, 0x1a, 0xe2, 0x69, 0x81, 0x05, 0x88, 0xf3, 0x0c, 0x14, 0x84, 0x7b, 0xd5, 0xb3,
0x3c, 0xe1, 0xf8, 0x5e, 0xb5, 0x96, 0x84, 0xf7, 0xaa, 0x9a, 0x80, 0x26, 0x4f, 0x19, 0x65, 0xb2,
0x96, 0x84, 0x4d, 0x6a, 0x02, 0x0b, 0x85, 0xfa, 0xd4, 0x9b, 0x0c, 0x85, 0xe0, 0x9c, 0x7b, 0xad,
0x93, 0x83, 0x23, 0xb4, 0xd9, 0xb4, 0xee, 0x31, 0x31, 0xbd, 0xc4, 0x47, 0xa8, 0x87, 0x84, 0x47,
0x28, 0x44, 0x61, 0x95, 0x26, 0xdc, 0x6c, 0xba, 0x1f, 0xe0, 0xe3, 0xa3, 0xb5, 0xe1, 0x5e, 0xeb,
0xe4, 0xe0, 0x36, 0xf2, 0x60, 0x2e, 0xdb, 0x0c, 0x1d, 0xe4, 0x4a, 0x16, 0xde, 0x46, 0x1a, 0x06,
0x96, 0x5e, 0x09, 0xea, 0xe6, 0xc4, 0x4b, 0x6f, 0xe5, 0xe1, 0xd2, 0x7b, 0x9c, 0x76, 0xf2, 0x4f,
0x66, 0x1b, 0xa7, 0xa4, 0xc7, 0xbc, 0x9e, 0x23, 0xaf, 0xe2, 0x2c, 0x4d, 0x62, 0xc1, 0x26, 0xfc,
0x8a, 0xe5, 0xf8, 0x8e, 0x49, 0x97, 0x56, 0xf1, 0x23, 0x4f, 0x21, 0xbc, 0x63, 0x0a, 0x2b, 0xc2,
0x71, 0xa2, 0xe8, 0xb3, 0x8a, 0xed, 0xc4, 0x15, 0x11, 0xc9, 0x3c, 0x24, 0x3c, 0x4e, 0x20, 0x0a,
0xf3, 0x55, 0x25, 0x7f, 0xf1, 0xa6, 0x60, 0x65, 0xca, 0xf2, 0x29, 0xc3, 0xf3, 0x55, 0x48, 0x85,
0xf3, 0x55, 0x84, 0x86, 0x7b, 0xb5, 0xdd, 0x58, 0xb0, 0xe7, 0xab, 0x49, 0x3a, 0x67, 0x95, 0x88,
0xe7, 0x05, 0xbe, 0x57, 0x03, 0x50, 0x78, 0xaf, 0xd6, 0x86, 0x5b, 0x47, 0x43, 0x26, 0x20, 0xb6,
0xef, 0x76, 0x40, 0x22, 0x70, 0xb7, 0x83, 0x40, 0x61, 0xc3, 0x5a, 0x00, 0x3d, 0x5e, 0x6d, 0x59,
0x09, 0x1e, 0xaf, 0xd2, 0x74, 0xeb, 0xc0, 0xcd, 0x30, 0xe3, 0x7a, 0x6a, 0x76, 0x14, 0x7d, 0xec,
0x4e, 0xd1, 0xf5, 0x5e, 0x2c, 0x7e, 0xc2, 0x77, 0xca, 0xb2, 0x58, 0x2e, 0x5b, 0x81, 0x63, 0xb4,
0x86, 0xe9, 0x73, 0xc2, 0xe7, 0xb0, 0xda, 0xe1, 0x9f, 0x0d, 0xa2, 0xf7, 0x31, 0x8f, 0x2f, 0x0b,
0xe9, 0xf7, 0x49, 0xb7, 0x2d, 0x45, 0x12, 0x97, 0x57, 0xc2, 0x1a, 0xba, 0x0c, 0x7f, 0x14, 0xbd,
0xd7, 0x88, 0xec, 0xdd, 0x16, 0x5d, 0x00, 0x3f, 0x69, 0x33, 0xe5, 0x87, 0x9c, 0x71, 0xbf, 0xd5,
0x9b, 0xb7, 0xfb, 0x21, 0xbf, 0x5c, 0x15, 0xd8, 0x0f, 0x19, 0x1b, 0x5a, 0x4c, 0xec, 0x87, 0x10,
0xcc, 0xce, 0x4e, 0xb7, 0x7a, 0xaf, 0x53, 0x71, 0x29, 0xf3, 0x2d, 0x30, 0x3b, 0xbd, 0xb2, 0x1a,
0x88, 0x98, 0x9d, 0x24, 0x0c, 0x33, 0x92, 0x06, 0xac, 0xe7, 0x26, 0x16, 0xcb, 0x8d, 0x21, 0x77,
0x66, 0x3e, 0xec, 0x06, 0xe1, 0x78, 0x6d, 0xc4, 0x7a, 0xeb, 0xf3, 0x38, 0x64, 0x01, 0x6c, 0x7f,
0xd6, 0x7b, 0xb1, 0xda, 0xe1, 0x9f, 0x44, 0xdf, 0x6d, 0x55, 0x6c, 0x8f, 0xc5, 0x62, 0x51, 0xb2,
0x64, 0xb8, 0xd5, 0x51, 0xee, 0x06, 0x34, 0xae, 0x9f, 0xf4, 0x57, 0x68, 0xe5, 0xe8, 0x0d, 0xa7,
0x86, 0x95, 0x29, 0xc3, 0xd3, 0x90, 0x49, 0x9f, 0x0d, 0xe6, 0xe8, 0xb4, 0x4e, 0x6b, 0x9b, 0xed,
0x8e, 0xae, 0xed, 0x65, 0x9c, 0x66, 0xf2, 0x31, 0xd7, 0x47, 0x21, 0xa3, 0x1e, 0x1a, 0xdc, 0x66,
0x93, 0x2a, 0xad, 0xc8, 0x2c, 0xe7, 0xb8, 0xb3, 0x3d, 0xdb, 0xa0, 0x23, 0x01, 0xb2, 0x3b, 0xdb,
0xec, 0x49, 0x6b, 0xb7, 0xa2, 0x59, 0xf2, 0xea, 0x9f, 0xdd, 0x41, 0x8e, 0x79, 0xd5, 0xaa, 0xc8,
0x48, 0xdf, 0xec, 0x49, 0x6b, 0xaf, 0x7f, 0x1c, 0xbd, 0xd7, 0xf6, 0xaa, 0x17, 0xa2, 0xad, 0x4e,
0x53, 0x60, 0x2d, 0x7a, 0xd2, 0x5f, 0x41, 0xbb, 0xff, 0x57, 0x73, 0x2e, 0xad, 0xfc, 0x4f, 0xf9,
0x7c, 0xce, 0xf2, 0x84, 0x25, 0x8d, 0x46, 0x55, 0xef, 0x9f, 0x3e, 0xa7, 0xed, 0x1a, 0x85, 0x91,
0xab, 0x61, 0x4a, 0xf4, 0x9b, 0xdf, 0x40, 0x53, 0x17, 0xed, 0x3f, 0x06, 0xd1, 0x23, 0xb4, 0x68,
0xcd, 0xc0, 0xf5, 0x8a, 0xf8, 0x3b, 0x7d, 0x1c, 0x61, 0x9a, 0xa6, 0xa8, 0xdb, 0xff, 0x0f, 0x0b,
0x76, 0x83, 0xf8, 0x45, 0x5a, 0x09, 0x5e, 0xae, 0xc6, 0x97, 0xfc, 0xba, 0xb9, 0x81, 0xef, 0xc7,
0x3e, 0x0d, 0x8c, 0x1c, 0x82, 0xd8, 0x20, 0xe2, 0x64, 0xcb, 0x95, 0xbd, 0xa9, 0x5f, 0x11, 0xae,
0x1c, 0xa2, 0xc3, 0x95, 0x4f, 0xda, 0xc8, 0xdf, 0xd4, 0xca, 0xbe, 0x56, 0xb0, 0x86, 0x17, 0xb5,
0xfd, 0x6a, 0xc1, 0xc3, 0x6e, 0xd0, 0xe6, 0x7f, 0x5a, 0xbc, 0x9b, 0x5e, 0x5c, 0x98, 0x3a, 0xe1,
0x25, 0x75, 0x11, 0x22, 0xff, 0x23, 0x50, 0xbb, 0x85, 0xd9, 0x4b, 0x33, 0x26, 0x9f, 0x8f, 0xbc,
0xbc, 0xb8, 0xc8, 0x78, 0x9c, 0x80, 0x2d, 0x4c, 0x2d, 0x1e, 0xb9, 0x72, 0x62, 0x0b, 0x83, 0x71,
0xf6, 0x02, 0x5f, 0x2d, 0xad, 0x47, 0x50, 0x3e, 0x4d, 0x33, 0x78, 0x21, 0x51, 0x6a, 0x1a, 0x21,
0x71, 0x81, 0xaf, 0x05, 0xd9, 0x34, 0xa3, 0x16, 0xd5, 0x41, 0xb4, 0x29, 0xff, 0xfd, 0xb6, 0xa2,
0x23, 0x26, 0xd2, 0x0c, 0x04, 0xb3, 0x3b, 0xf9, 0x5a, 0x78, 0x56, 0x48, 0xe3, 0x77, 0xda, 0x5a,
0x4a, 0x42, 0xec, 0xe4, 0x7d, 0xc2, 0xee, 0x48, 0xeb, 0xdf, 0x77, 0xf9, 0x75, 0x2e, 0x8d, 0xde,
0x6d, 0xab, 0x34, 0x32, 0x62, 0x47, 0x0a, 0x19, 0x6d, 0xf8, 0x47, 0xd1, 0xcf, 0x4b, 0xc3, 0x25,
0x2f, 0x86, 0xb7, 0x10, 0x85, 0xd2, 0xb9, 0x3b, 0x78, 0x9b, 0x94, 0xdb, 0x2b, 0xb0, 0x66, 0x6c,
0x9c, 0x55, 0xf1, 0x8c, 0x0d, 0xef, 0x11, 0x3d, 0x2e, 0xa5, 0xc4, 0x15, 0xd8, 0x36, 0xe5, 0x8f,
0x8a, 0x63, 0x9e, 0x68, 0xeb, 0x48, 0x0d, 0x8d, 0x30, 0x34, 0x2a, 0x5c, 0xc8, 0xa6, 0x86, 0xc7,
0xf1, 0x32, 0x9d, 0x99, 0xe5, 0x5b, 0x05, 0xb2, 0x0a, 0xa4, 0x86, 0x96, 0x19, 0x39, 0x10, 0x91,
0x1a, 0x92, 0xb0, 0xf6, 0xf9, 0x8f, 0x83, 0xe8, 0x8e, 0x65, 0xf6, 0x9b, 0xb3, 0xcf, 0x83, 0xfc,
0x82, 0xd7, 0x89, 0xe4, 0x61, 0x9a, 0x5f, 0x55, 0xc3, 0x4f, 0x29, 0x93, 0x38, 0x6f, 0x8a, 0xf2,
0xd9, 0x8d, 0xf5, 0xec, 0x1e, 0xa0, 0x39, 0x18, 0xb4, 0xb7, 0x03, 0x94, 0x06, 0xd8, 0x03, 0x98,
0xf3, 0x43, 0xc8, 0x11, 0x7b, 0x80, 0x10, 0x6f, 0xbb, 0xd8, 0x38, 0xcf, 0x78, 0x0e, 0xbb, 0xd8,
0x5a, 0xa8, 0x85, 0x44, 0x17, 0xb7, 0x20, 0x1b, 0x8f, 0x1b, 0x91, 0x3a, 0xc3, 0xda, 0xce, 0x32,
0x10, 0x8f, 0x8d, 0xaa, 0x01, 0x88, 0x78, 0x8c, 0x82, 0xda, 0xcf, 0x69, 0xf4, 0xed, 0xba, 0x49,
0x4f, 0x4a, 0xb6, 0x4c, 0x19, 0xbc, 0xc8, 0xe2, 0x48, 0x88, 0xf9, 0xef, 0x13, 0x76, 0x66, 0x9d,
0xe5, 0x55, 0x91, 0xc5, 0xd5, 0xa5, 0xbe, 0xda, 0xe0, 0xd7, 0xb9, 0x11, 0xc2, 0xcb, 0x0d, 0xf7,
0x3b, 0x28, 0x1b, 0xd4, 0x1b, 0x99, 0x09, 0x31, 0x0f, 0x70, 0xd5, 0x56, 0x98, 0x59, 0xeb, 0xe4,
0xec, 0xf3, 0x83, 0xfd, 0x38, 0xcb, 0x58, 0xb9, 0x6a, 0x64, 0x47, 0x71, 0x9e, 0x5e, 0xb0, 0x4a,
0x80, 0xe7, 0x07, 0x9a, 0x1a, 0x41, 0x8c, 0x78, 0x7e, 0x10, 0xc0, 0xed, 0xde, 0x08, 0x78, 0x3e,
0xc8, 0x13, 0xf6, 0x06, 0xec, 0x8d, 0xa0, 0x1d, 0xc9, 0x10, 0x7b, 0x23, 0x8a, 0xb5, 0xe7, 0xe8,
0xcf, 0x33, 0x3e, 0xbd, 0xd2, 0x4b, 0x80, 0xdf, 0xc1, 0x52, 0x02, 0xd7, 0x80, 0xbb, 0x21, 0xc4,
0x2e, 0x02, 0x52, 0x70, 0xca, 0x8a, 0x2c, 0x9e, 0xc2, 0xdb, 0x4c, 0x4a, 0x47, 0xcb, 0x88, 0x45,
0x00, 0x32, 0xa0, 0xb8, 0xfa, 0x96, 0x14, 0x56, 0x5c, 0x70, 0x49, 0xea, 0x6e, 0x08, 0xb1, 0xcb,
0xa0, 0x14, 0x8c, 0x8b, 0x2c, 0x15, 0x60, 0x1a, 0x28, 0x0d, 0x29, 0x21, 0xa6, 0x81, 0x4f, 0x00,
0x93, 0x47, 0xac, 0x9c, 0x31, 0xd4, 0xa4, 0x94, 0x04, 0x4d, 0x36, 0x84, 0xbd, 0xf4, 0xaa, 0xea,
0xce, 0x8b, 0x15, 0xb8, 0xf4, 0xaa, 0xab, 0xc5, 0x8b, 0x15, 0x71, 0xe9, 0xd5, 0x03, 0x40, 0x11,
0x4f, 0xe2, 0x4a, 0xe0, 0x45, 0x94, 0x92, 0x60, 0x11, 0x1b, 0xc2, 0xae, 0xd1, 0xaa, 0x88, 0x0b,
0x01, 0xd6, 0x68, 0x5d, 0x00, 0xe7, 0x79, 0xfe, 0x6d, 0x52, 0x6e, 0x23, 0x89, 0xea, 0x15, 0x26,
0xf6, 0x52, 0x96, 0x25, 0x15, 0x88, 0x24, 0xba, 0xdd, 0x1b, 0x29, 0x11, 0x49, 0xda, 0x14, 0x18,
0x4a, 0xfa, 0x69, 0x03, 0x56, 0x3b, 0xf0, 0xa0, 0xe1, 0x6e, 0x08, 0xb1, 0xf1, 0xa9, 0x29, 0xf4,
0x4e, 0x5c, 0x96, 0x69, 0xbd, 0xf8, 0x3f, 0xc0, 0x0b, 0xd4, 0xc8, 0x89, 0xf8, 0x84, 0x71, 0x60,
0x7a, 0x35, 0x81, 0x1b, 0x2b, 0x18, 0x0c, 0xdd, 0x1f, 0x06, 0x19, 0x9b, 0x71, 0x4a, 0x89, 0xf3,
0x40, 0x1a, 0x6b, 0x4d, 0xe4, 0x79, 0xf4, 0x83, 0x2e, 0xcc, 0x79, 0x29, 0xc5, 0xb8, 0x38, 0xe2,
0x4b, 0x36, 0xe1, 0x2f, 0xde, 0xa4, 0x95, 0x48, 0xf3, 0x99, 0x5e, 0xb9, 0x9f, 0x11, 0x96, 0x30,
0x98, 0x78, 0x29, 0xa5, 0x53, 0xc9, 0x26, 0x10, 0xa0, 0x2c, 0xc7, 0xec, 0x1a, 0x4d, 0x20, 0xa0,
0x45, 0xc3, 0x11, 0x09, 0x44, 0x88, 0xb7, 0xa7, 0x52, 0xc6, 0xb9, 0x7e, 0x73, 0x77, 0xc2, 0x9b,
0x5c, 0x8e, 0xb2, 0x06, 0x41, 0xe2, 0x60, 0x20, 0xa8, 0x60, 0xf7, 0x97, 0xc6, 0xbf, 0x9d, 0x62,
0x0f, 0x09, 0x3b, 0xed, 0x69, 0xf6, 0xa8, 0x07, 0x89, 0xb8, 0xb2, 0xb7, 0x2a, 0x28, 0x57, 0xed,
0x4b, 0x15, 0x8f, 0x7a, 0x90, 0xce, 0x09, 0x97, 0x5b, 0xad, 0xe7, 0xf1, 0xf4, 0x6a, 0x56, 0xf2,
0x45, 0x9e, 0xec, 0xf0, 0x8c, 0x97, 0xe0, 0x84, 0xcb, 0x2b, 0x35, 0x40, 0x89, 0x13, 0xae, 0x0e,
0x15, 0x9b, 0xc1, 0xb9, 0xa5, 0xd8, 0xce, 0xd2, 0x19, 0xdc, 0x51, 0x7b, 0x86, 0x24, 0x40, 0x64,
0x70, 0x28, 0x88, 0x0c, 0x22, 0xb5, 0xe3, 0x16, 0xe9, 0x34, 0xce, 0x94, 0xbf, 0x2d, 0xda, 0x8c,
0x07, 0x76, 0x0e, 0x22, 0x44, 0x01, 0xa9, 0xe7, 0x64, 0x51, 0xe6, 0x07, 0xb9, 0xe0, 0x64, 0x3d,
0x1b, 0xa0, 0xb3, 0x9e, 0x0e, 0x08, 0xc2, 0xea, 0x84, 0xbd, 0xa9, 0x4b, 0x53, 0xff, 0x83, 0x85,
0xd5, 0xfa, 0xf7, 0x91, 0x96, 0x87, 0xc2, 0x2a, 0xe0, 0x40, 0x65, 0xb4, 0x13, 0x35, 0x60, 0x02,
0xda, 0xfe, 0x30, 0x79, 0xd8, 0x0d, 0xe2, 0x7e, 0xc6, 0x62, 0x95, 0xb1, 0x90, 0x1f, 0x09, 0xf4,
0xf1, 0xd3, 0x80, 0xf6, 0xb8, 0xc5, 0xab, 0xcf, 0x25, 0x9b, 0x5e, 0xb5, 0x2e, 0x89, 0xf9, 0x05,
0x55, 0x08, 0x71, 0xdc, 0x42, 0xa0, 0x78, 0x17, 0x1d, 0x4c, 0x79, 0x1e, 0xea, 0xa2, 0x5a, 0xde,
0xa7, 0x8b, 0x34, 0x67, 0x37, 0xbf, 0x46, 0xaa, 0x47, 0xa6, 0xea, 0xa6, 0x75, 0xc2, 0x82, 0x0b,
0x11, 0x9b, 0x5f, 0x12, 0xb6, 0x39, 0x39, 0xf4, 0x79, 0xd4, 0xbe, 0x41, 0xdf, 0xb2, 0x72, 0x44,
0xdf, 0xa0, 0xa7, 0x58, 0xba, 0x92, 0x6a, 0x8c, 0x74, 0x58, 0xf1, 0xc7, 0xc9, 0x46, 0x3f, 0xd8,
0x6e, 0x79, 0x3c, 0x9f, 0x3b, 0x19, 0x8b, 0x4b, 0xe5, 0x75, 0x33, 0x60, 0xc8, 0x62, 0xc4, 0x96,
0x27, 0x80, 0x83, 0x10, 0xe6, 0x79, 0xde, 0xe1, 0xb9, 0x60, 0xb9, 0xc0, 0x42, 0x98, 0x6f, 0x4c,
0x83, 0xa1, 0x10, 0x46, 0x29, 0x80, 0x71, 0x2b, 0xcf, 0x83, 0x98, 0x38, 0x8e, 0xe7, 0x68, 0xc6,
0xa6, 0xce, 0x7a, 0x94, 0x3c, 0x34, 0x6e, 0x01, 0xe7, 0x3c, 0x32, 0x75, 0xbd, 0x4c, 0xe2, 0x72,
0x66, 0x4e, 0x37, 0x92, 0xe1, 0x13, 0xda, 0x8e, 0x4f, 0x12, 0x8f, 0x4c, 0xc3, 0x1a, 0x20, 0xec,
0x1c, 0xcc, 0xe3, 0x99, 0xa9, 0x29, 0x52, 0x03, 0x29, 0x6f, 0x55, 0xf5, 0x61, 0x37, 0x08, 0xfc,
0xbc, 0x4a, 0x13, 0xc6, 0x03, 0x7e, 0xa4, 0xbc, 0x8f, 0x1f, 0x08, 0x82, 0xec, 0xad, 0xae, 0xb7,
0xda, 0xd1, 0x6d, 0xe7, 0x89, 0xde, 0xc7, 0x8e, 0x88, 0xe6, 0x01, 0x5c, 0x28, 0x7b, 0x23, 0x78,
0x30, 0x47, 0x9b, 0x03, 0xda, 0xd0, 0x1c, 0x35, 0xe7, 0xaf, 0x7d, 0xe6, 0x28, 0x06, 0x6b, 0x9f,
0x3f, 0xd1, 0x73, 0x74, 0x37, 0x16, 0x71, 0x9d, 0xb7, 0xbf, 0x4a, 0xd9, 0xb5, 0xde, 0x08, 0x23,
0xf5, 0x6d, 0xa8, 0x91, 0x7c, 0x75, 0x12, 0xec, 0x8a, 0xb7, 0x7a, 0xf3, 0x01, 0xdf, 0x7a, 0x87,
0xd0, 0xe9, 0x1b, 0x6c, 0x15, 0xb6, 0x7a, 0xf3, 0x01, 0xdf, 0xfa, 0x9d, 0xec, 0x4e, 0xdf, 0xe0,
0xc5, 0xec, 0xad, 0xde, 0xbc, 0xf6, 0xfd, 0xe7, 0xcd, 0xc4, 0x75, 0x9d, 0xd7, 0x79, 0xd8, 0x54,
0xa4, 0x4b, 0x86, 0xa5, 0x93, 0xbe, 0x3d, 0x83, 0x86, 0xd2, 0x49, 0x5a, 0xc5, 0xf9, 0x90, 0x0f,
0x56, 0x8a, 0x13, 0x5e, 0xa5, 0xf2, 0xca, 0xc3, 0xb3, 0x1e, 0x46, 0x1b, 0x38, 0xb4, 0x69, 0x0a,
0x29, 0xd9, 0x87, 0xb7, 0x1e, 0x6a, 0xef, 0x84, 0x6f, 0x04, 0xec, 0xb5, 0xaf, 0x86, 0x6f, 0xf6,
0xa4, 0xed, 0x63, 0x54, 0x8f, 0x71, 0x9f, 0xdf, 0x86, 0x7a, 0x15, 0x7d, 0x84, 0xfb, 0xa4, 0xbf,
0x82, 0x76, 0xff, 0x97, 0xcd, 0xbe, 0x02, 0xfa, 0xd7, 0x93, 0xe0, 0x69, 0x1f, 0x8b, 0x60, 0x22,
0x3c, 0xbb, 0x91, 0x8e, 0x2e, 0xc8, 0xdf, 0x36, 0x1b, 0xe8, 0x06, 0x95, 0x6f, 0xc6, 0xbc, 0x2c,
0x13, 0x56, 0xea, 0x39, 0x11, 0xea, 0x56, 0x0b, 0xc3, 0x99, 0xf1, 0xc9, 0x0d, 0xb5, 0x9c, 0xcf,
0x3a, 0x79, 0xb0, 0x7e, 0x83, 0xd3, 0x29, 0x4f, 0xc8, 0xb2, 0x43, 0xc3, 0x02, 0x7d, 0x7a, 0x53,
0x35, 0x6a, 0xae, 0x38, 0xb0, 0xfc, 0x4a, 0xc4, 0xb3, 0x9e, 0x86, 0xbd, 0xef, 0x46, 0x7c, 0x7c,
0x33, 0x25, 0x5d, 0x96, 0x7f, 0x1f, 0x44, 0xf7, 0x3d, 0xd6, 0x3e, 0x4f, 0x00, 0xa7, 0x1e, 0x3f,
0x0c, 0xd8, 0xa7, 0x94, 0x4c, 0xe1, 0x7e, 0xeb, 0x9b, 0x29, 0xdb, 0x6f, 0x20, 0x79, 0x2a, 0x7b,
0x69, 0x26, 0x58, 0xd9, 0xfe, 0x06, 0x92, 0x6f, 0x57, 0x51, 0x23, 0xfa, 0x1b, 0x48, 0x01, 0xdc,
0xf9, 0x06, 0x12, 0xe2, 0x19, 0xfd, 0x06, 0x12, 0x6a, 0x2d, 0xf8, 0x0d, 0xa4, 0xb0, 0x06, 0x15,
0xde, 0x9b, 0x22, 0xa8, 0x73, 0xeb, 0x5e, 0x16, 0xfd, 0x63, 0xec, 0xa7, 0x37, 0x51, 0x21, 0x16,
0x38, 0xc5, 0xc9, 0x5b, 0x83, 0x3d, 0xda, 0xd4, 0xbb, 0x39, 0xb8, 0xd5, 0x9b, 0xd7, 0xbe, 0x7f,
0xac, 0x77, 0x37, 0x26, 0x9c, 0xf3, 0x52, 0x7e, 0xff, 0x6a, 0x3d, 0x14, 0x9e, 0x6b, 0x0b, 0x6e,
0xcf, 0x6f, 0xf4, 0x83, 0x89, 0xea, 0xd6, 0x84, 0xee, 0xf4, 0x51, 0x97, 0x21, 0xd0, 0xe5, 0x5b,
0xbd, 0x79, 0x62, 0x19, 0x51, 0xbe, 0x55, 0x6f, 0xf7, 0x30, 0xe6, 0xf7, 0xf5, 0x93, 0xfe, 0x0a,
0xda, 0xfd, 0x52, 0xa7, 0x8d, 0xae, 0x7b, 0xd9, 0xcf, 0x9b, 0x5d, 0xa6, 0xc6, 0x5e, 0x37, 0x8f,
0xfa, 0xe2, 0xa1, 0x04, 0xc2, 0x5d, 0x42, 0xbb, 0x12, 0x08, 0x74, 0x19, 0xfd, 0xf8, 0x66, 0x4a,
0xba, 0x2c, 0xff, 0x30, 0x88, 0x6e, 0x93, 0x65, 0xd1, 0xe3, 0xe0, 0xd3, 0xbe, 0x96, 0xc1, 0x78,
0xf8, 0xec, 0xc6, 0x7a, 0xba, 0x50, 0xff, 0x3c, 0x88, 0xee, 0x04, 0x0a, 0xa5, 0x06, 0xc8, 0x0d,
0xac, 0xfb, 0x03, 0xe5, 0xf3, 0x9b, 0x2b, 0x52, 0xcb, 0xbd, 0x8b, 0x8f, 0xdb, 0x1f, 0x07, 0x0a,
0xd8, 0x1e, 0xd3, 0x1f, 0x07, 0xea, 0xd6, 0x82, 0x87, 0x3c, 0xf1, 0x79, 0xb3, 0xe9, 0x42, 0x0f,
0x79, 0xe4, 0x7d, 0x3f, 0xb0, 0xe7, 0x58, 0xeb, 0xe4, 0x30, 0x27, 0x2f, 0xde, 0x14, 0x71, 0x9e,
0xd0, 0x4e, 0x94, 0xbc, 0xdb, 0x89, 0xe1, 0xe0, 0xe1, 0x58, 0x2d, 0x3d, 0xe5, 0xcd, 0x46, 0xea,
0x11, 0xa5, 0x6f, 0x90, 0xe0, 0xe1, 0x58, 0x0b, 0x25, 0xbc, 0xe9, 0xac, 0x31, 0xe4, 0x0d, 0x24,
0x8b, 0x8f, 0xfb, 0xa0, 0x20, 0x45, 0x37, 0xde, 0xcc, 0x99, 0xfb, 0x46, 0xc8, 0x4a, 0xeb, 0xdc,
0x7d, 0xb3, 0x27, 0x4d, 0xb8, 0x1d, 0x33, 0xf1, 0x05, 0x8b, 0x13, 0x56, 0x06, 0xdd, 0x1a, 0xaa,
0x97, 0x5b, 0x97, 0xc6, 0xdc, 0xee, 0xf0, 0x6c, 0x31, 0xcf, 0x75, 0x67, 0x92, 0x6e, 0x5d, 0xaa,
0xdb, 0x2d, 0xa0, 0xe1, 0xb1, 0xa0, 0x75, 0x2b, 0xd3, 0xcb, 0xc7, 0x61, 0x33, 0x5e, 0x56, 0xb9,
0xde, 0x8b, 0xa5, 0xeb, 0xa9, 0x87, 0x51, 0x47, 0x3d, 0xc1, 0x48, 0xda, 0xec, 0x49, 0xc3, 0xf3,
0x39, 0xc7, 0xad, 0x19, 0x4f, 0x5b, 0x1d, 0xb6, 0x5a, 0x43, 0xea, 0x49, 0x7f, 0x05, 0x78, 0x1a,
0xaa, 0x47, 0xd5, 0x61, 0x5a, 0x89, 0xbd, 0x34, 0xcb, 0x86, 0xeb, 0x81, 0x61, 0xd2, 0x40, 0xc1,
0xd3, 0x50, 0x04, 0x26, 0x46, 0x72, 0x73, 0x7a, 0x98, 0x0f, 0xbb, 0xec, 0x48, 0xaa, 0xd7, 0x48,
0x76, 0x69, 0x70, 0xa2, 0xe5, 0x34, 0xb5, 0xa9, 0xed, 0x28, 0xdc, 0x70, 0xad, 0x0a, 0x6f, 0xf5,
0xe6, 0xc1, 0xe3, 0x76, 0x49, 0xc9, 0x95, 0xe5, 0x1e, 0x65, 0xc2, 0x5b, 0x49, 0xee, 0x77, 0x50,
0xe0, 0x54, 0x50, 0x4d, 0xa3, 0xd7, 0x69, 0x32, 0x63, 0x02, 0x7d, 0x52, 0xe4, 0x02, 0xc1, 0x27,
0x45, 0x00, 0x04, 0x5d, 0xa7, 0x7e, 0x37, 0xc7, 0xa1, 0x07, 0x09, 0xd6, 0x75, 0x5a, 0xd9, 0xa1,
0x42, 0x5d, 0x87, 0xd2, 0x20, 0x1a, 0x18, 0xb7, 0xfa, 0xe3, 0x06, 0x8f, 0x43, 0x66, 0xc0, 0x17,
0x0e, 0xd6, 0x7b, 0xb1, 0x60, 0x45, 0xb1, 0x0e, 0xd3, 0x79, 0x2a, 0xb0, 0x15, 0xc5, 0xb1, 0x51,
0x23, 0xa1, 0x15, 0xa5, 0x8d, 0x52, 0xd5, 0xab, 0x73, 0x84, 0x83, 0x24, 0x5c, 0x3d, 0xc5, 0xf4,
0xab, 0x9e, 0x61, 0x5b, 0x0f, 0x36, 0x73, 0x33, 0x64, 0xc4, 0xa5, 0xde, 0x2c, 0x23, 0x63, 0x5b,
0xbe, 0xf4, 0x0a, 0xc1, 0x50, 0xd4, 0xa1, 0x14, 0xe0, 0x81, 0x7d, 0xcd, 0x35, 0xcf, 0x5e, 0x8b,
0x82, 0xc5, 0x65, 0x9c, 0x4f, 0xd1, 0xcd, 0xa9, 0x34, 0xd8, 0x22, 0x43, 0x9b, 0x53, 0x52, 0x03,
0x3c, 0x36, 0xf7, 0x5f, 0x57, 0x45, 0xa6, 0x82, 0x79, 0x2f, 0xd4, 0x7f, 0x5b, 0xf5, 0x51, 0x0f,
0x12, 0x3e, 0x36, 0x6f, 0x00, 0x73, 0xf0, 0xad, 0x9c, 0x7e, 0x14, 0x30, 0xe5, 0xa3, 0xa1, 0x8d,
0x30, 0xad, 0x02, 0x06, 0xb5, 0x49, 0x70, 0x99, 0xf8, 0x11, 0x5b, 0x61, 0x83, 0xda, 0xe6, 0xa7,
0x12, 0x09, 0x0d, 0xea, 0x36, 0x0a, 0xf2, 0x4c, 0x77, 0x1f, 0xf4, 0x20, 0xa0, 0xef, 0x6e, 0x7d,
0xd6, 0x3a, 0x39, 0x30, 0x73, 0x76, 0xd3, 0xa5, 0xf7, 0x9c, 0x00, 0x29, 0xe8, 0x6e, 0xba, 0xc4,
0x1f, 0x13, 0xac, 0xf7, 0x62, 0xe1, 0x23, 0xf9, 0x58, 0xb0, 0x37, 0xcd, 0xb3, 0x72, 0xa4, 0xb8,
0x52, 0xde, 0x7a, 0x58, 0xfe, 0xb0, 0x1b, 0xb4, 0x17, 0x60, 0x4f, 0x4a, 0x3e, 0x65, 0x55, 0xa5,
0xbf, 0x98, 0xe8, 0xdf, 0x30, 0xd2, 0xb2, 0x11, 0xf8, 0x5e, 0xe2, 0xbd, 0x30, 0x64, 0x7b, 0x46,
0x8b, 0xec, 0x37, 0x84, 0x1e, 0xa0, 0x9a, 0xed, 0xcf, 0x07, 0xad, 0x75, 0x72, 0x76, 0x7a, 0x69,
0xa9, 0xfb, 0xd1, 0xa0, 0x87, 0xa8, 0x3a, 0xf6, 0xbd, 0xa0, 0x47, 0x3d, 0x48, 0xed, 0xea, 0x8b,
0xe8, 0xad, 0x43, 0x3e, 0x1b, 0xb3, 0x3c, 0x19, 0x7e, 0xdf, 0xbf, 0x42, 0xcb, 0x67, 0xa3, 0xfa,
0x67, 0x63, 0xf4, 0x16, 0x25, 0xb6, 0x97, 0x00, 0x77, 0xd9, 0xf9, 0x62, 0x36, 0x16, 0xb1, 0x00,
0x97, 0x00, 0xe5, 0xef, 0xa3, 0x5a, 0x40, 0x5c, 0x02, 0xf4, 0x00, 0x60, 0x6f, 0x52, 0x32, 0x86,
0xda, 0xab, 0x05, 0x41, 0x7b, 0x1a, 0xb0, 0x59, 0x84, 0xb1, 0x57, 0x27, 0xea, 0xf0, 0xd2, 0x9e,
0xd5, 0x91, 0x52, 0x22, 0x8b, 0x68, 0x53, 0x76, 0x70, 0xab, 0xea, 0xcb, 0x6f, 0xb8, 0x2c, 0xe6,
0xf3, 0xb8, 0x5c, 0x81, 0xc1, 0xad, 0x6b, 0xe9, 0x00, 0xc4, 0xe0, 0x46, 0x41, 0x3b, 0x6b, 0x9b,
0x66, 0x9e, 0x5e, 0xed, 0xf3, 0x92, 0x2f, 0x44, 0x9a, 0x33, 0xf8, 0x1d, 0x0f, 0xd3, 0xa0, 0x2e,
0x43, 0xcc, 0x5a, 0x8a, 0xb5, 0x59, 0xae, 0x24, 0xd4, 0x7d, 0x42, 0xf9, 0x1d, 0xe5, 0x4a, 0xf0,
0x12, 0x3e, 0x4f, 0x54, 0x56, 0x20, 0x44, 0x64, 0xb9, 0x24, 0x0c, 0xfa, 0xfe, 0x24, 0xcd, 0x67,
0x68, 0xdf, 0x9f, 0xb8, 0x5f, 0x21, 0xbd, 0x43, 0x03, 0x76, 0x42, 0xa9, 0x46, 0x53, 0x13, 0x40,
0xbf, 0x19, 0x8b, 0x36, 0xba, 0x4b, 0x10, 0x13, 0x0a, 0x27, 0x81, 0xab, 0x97, 0x05, 0xcb, 0x59,
0xd2, 0xdc, 0x9a, 0xc3, 0x5c, 0x79, 0x44, 0xd0, 0x15, 0x24, 0x6d, 0x2c, 0x92, 0xf2, 0xd3, 0x45,
0x7e, 0x52, 0xf2, 0x8b, 0x34, 0x63, 0x25, 0x88, 0x45, 0x4a, 0xdd, 0x91, 0x13, 0xb1, 0x08, 0xe3,
0xec, 0xf5, 0x0b, 0x29, 0xf5, 0x3e, 0x06, 0x3e, 0x29, 0xe3, 0x29, 0xbc, 0x7e, 0xa1, 0x6c, 0xb4,
0x31, 0xe2, 0x64, 0x30, 0x80, 0x3b, 0x89, 0x8e, 0x72, 0x9d, 0xaf, 0xe4, 0xf8, 0xd0, 0x6f, 0x66,
0xca, 0x6f, 0x73, 0x56, 0x20, 0xd1, 0xd1, 0xe6, 0x30, 0x92, 0x48, 0x74, 0xc2, 0x1a, 0x76, 0x29,
0x91, 0xdc, 0xb1, 0xbe, 0x56, 0x04, 0x96, 0x12, 0x65, 0xa3, 0x11, 0x12, 0x4b, 0x49, 0x0b, 0x02,
0x01, 0xa9, 0x99, 0x06, 0x33, 0x34, 0x20, 0x19, 0x69, 0x30, 0x20, 0xb9, 0x94, 0x0d, 0x14, 0x07,
0x79, 0x2a, 0xd2, 0x38, 0x1b, 0x33, 0x71, 0x12, 0x97, 0xf1, 0x9c, 0x09, 0x56, 0xc2, 0x40, 0xa1,
0x91, 0x91, 0xc7, 0x10, 0x81, 0x82, 0x62, 0xb5, 0xc3, 0xdf, 0x8e, 0xde, 0xa9, 0xd7, 0x7d, 0x96,
0xeb, 0x3f, 0xfb, 0xf1, 0x42, 0xfe, 0xbd, 0xa0, 0xe1, 0xbb, 0xc6, 0xc6, 0x58, 0x94, 0x2c, 0x9e,
0x37, 0xb6, 0xdf, 0x36, 0xbf, 0x4b, 0xf0, 0xc9, 0xa0, 0x1e, 0xcf, 0xc7, 0x5c, 0xa4, 0x17, 0xf5,
0x36, 0x5b, 0xbf, 0x41, 0x04, 0xc6, 0xb3, 0x2b, 0x1e, 0x05, 0xbe, 0xec, 0x81, 0x71, 0x36, 0x4e,
0xbb, 0xd2, 0x53, 0x56, 0x64, 0x30, 0x4e, 0x7b, 0xda, 0x12, 0x20, 0xe2, 0x34, 0x0a, 0xda, 0xc9,
0xe9, 0x8a, 0x27, 0x2c, 0x5c, 0x99, 0x09, 0xeb, 0x57, 0x99, 0x89, 0xf7, 0x52, 0x46, 0x16, 0xbd,
0x73, 0xc4, 0xe6, 0xe7, 0xac, 0xac, 0x2e, 0xd3, 0x62, 0xbf, 0x4e, 0xb8, 0x62, 0xb1, 0x80, 0xaf,
0x2d, 0x5a, 0x62, 0x64, 0x10, 0x22, 0x2b, 0x25, 0x50, 0xbb, 0x12, 0x58, 0xe0, 0xa0, 0x3a, 0x8e,
0xe7, 0x4c, 0x7e, 0xa7, 0x04, 0xac, 0x04, 0x8e, 0x11, 0x07, 0x22, 0x56, 0x02, 0x12, 0x76, 0xde,
0xef, 0xb2, 0xcc, 0x29, 0x9b, 0xd5, 0x23, 0xac, 0x3c, 0x89, 0x57, 0x73, 0x96, 0x0b, 0x6d, 0x12,
0x9c, 0xc9, 0x3b, 0x26, 0x71, 0x9e, 0x38, 0x93, 0xef, 0xa3, 0xe7, 0x84, 0x26, 0xaf, 0xe1, 0x4f,
0x78, 0x29, 0xd4, 0x1f, 0xf5, 0x39, 0x2b, 0x33, 0x10, 0x9a, 0xfc, 0x46, 0xf5, 0x48, 0x22, 0x34,
0x85, 0x35, 0x9c, 0xaf, 0xe1, 0x7b, 0x65, 0x78, 0xc5, 0x4a, 0x33, 0x4e, 0x5e, 0xcc, 0xe3, 0x34,
0xd3, 0xa3, 0xe1, 0x07, 0x01, 0xdb, 0x84, 0x0e, 0xf1, 0x35, 0xfc, 0xbe, 0xba, 0xce, 0xdf, 0x0f,
0x08, 0x97, 0x10, 0x3c, 0x22, 0xe8, 0xb0, 0x4f, 0x3c, 0x22, 0xe8, 0xd6, 0xb2, 0x3b, 0x77, 0xcb,
0x4a, 0x6e, 0x25, 0x89, 0x1d, 0x9e, 0xc0, 0xf3, 0x42, 0xc7, 0x26, 0x00, 0x89, 0x9d, 0x7b, 0x50,
0xc1, 0xa6, 0x06, 0x16, 0xdb, 0x4b, 0xf3, 0x38, 0x4b, 0x7f, 0x02, 0xd3, 0x7a, 0xc7, 0x4e, 0x43,
0x10, 0xa9, 0x01, 0x4e, 0x62, 0xae, 0xf6, 0x99, 0x98, 0xa4, 0x75, 0xe8, 0x7f, 0x18, 0x68, 0x37,
0x49, 0x74, 0xbb, 0x72, 0x48, 0xe7, 0x8b, 0xb7, 0xb0, 0x59, 0xb7, 0x8b, 0x62, 0x5c, 0xaf, 0xaa,
0xa7, 0x6c, 0xca, 0xd2, 0x42, 0x0c, 0x3f, 0x09, 0xb7, 0x15, 0xc0, 0x89, 0x8b, 0x16, 0x3d, 0xd4,
0x9c, 0xc7, 0xf7, 0x75, 0x2c, 0x19, 0xab, 0xbf, 0x76, 0x77, 0x56, 0xb1, 0x52, 0x27, 0x1a, 0xfb,
0x4c, 0x80, 0xd9, 0xe9, 0x70, 0x23, 0x07, 0xac, 0x2b, 0x4a, 0xcc, 0xce, 0xb0, 0x86, 0x3d, 0xec,
0x73, 0xb8, 0x53, 0x56, 0xf1, 0x6c, 0xc9, 0xe4, 0x7d, 0xc3, 0x0d, 0xd2, 0x98, 0x43, 0x11, 0x87,
0x7d, 0x34, 0x6d, 0xb3, 0xb5, 0xb6, 0xdb, 0xed, 0x7c, 0x75, 0x00, 0xaf, 0x4c, 0x20, 0x96, 0x24,
0x46, 0x64, 0x6b, 0x01, 0xdc, 0x39, 0x0c, 0x2f, 0x79, 0x9c, 0x4c, 0xe3, 0x4a, 0x9c, 0xc4, 0xab,
0x8c, 0xc7, 0x89, 0x5c, 0xd7, 0xe1, 0x61, 0x78, 0xc3, 0x8c, 0x5c, 0x88, 0x3a, 0x0c, 0xa7, 0x60,
0x37, 0x3b, 0x93, 0x7f, 0xc4, 0x4f, 0xdf, 0xe5, 0x84, 0xd9, 0x99, 0x2c, 0x2f, 0xbc, 0xc7, 0x79,
0x2f, 0x0c, 0xd9, 0x77, 0xd0, 0x94, 0x48, 0xa6, 0x21, 0x77, 0x30, 0x1d, 0x2f, 0x01, 0xf9, 0x20,
0x40, 0xd8, 0xaf, 0x7c, 0xa8, 0xdf, 0x9b, 0xbf, 0x43, 0x23, 0xf4, 0x77, 0xc1, 0x37, 0x30, 0x5d,
0x17, 0x1a, 0xb9, 0x1f, 0x8b, 0xd8, 0xec, 0x49, 0xdb, 0x34, 0x73, 0xe7, 0x32, 0x16, 0xdb, 0x49,
0x72, 0xc4, 0x2a, 0xe4, 0x85, 0xf2, 0x5a, 0x38, 0xb2, 0x52, 0x22, 0xcd, 0x6c, 0x53, 0x76, 0xa0,
0xd7, 0xb2, 0x17, 0x49, 0x2a, 0xb4, 0xac, 0xb9, 0x21, 0xbd, 0xd1, 0x36, 0xd0, 0xa6, 0x88, 0x5a,
0xd1, 0xb4, 0x8d, 0xe5, 0x35, 0x33, 0xe1, 0xb3, 0x59, 0xc6, 0x34, 0x74, 0xca, 0x62, 0xf5, 0x59,
0xc4, 0xad, 0xb6, 0x2d, 0x14, 0x24, 0x62, 0x79, 0x50, 0xc1, 0xa6, 0x91, 0x35, 0xa6, 0x1e, 0x49,
0x35, 0x0d, 0xbb, 0xd6, 0x36, 0xe3, 0x01, 0x44, 0x1a, 0x89, 0x82, 0xf6, 0xbd, 0xb7, 0x5a, 0xbc,
0xcf, 0x9a, 0x96, 0x80, 0x1f, 0x74, 0x92, 0xca, 0x8e, 0x98, 0x78, 0xef, 0x0d, 0xc1, 0xec, 0x3e,
0x01, 0x78, 0x78, 0xbe, 0x3a, 0x48, 0xe0, 0x3e, 0x01, 0xea, 0x4b, 0x86, 0xd8, 0x27, 0x50, 0xac,
0xdf, 0x75, 0xe6, 0xdc, 0xeb, 0x30, 0xae, 0x6c, 0xe5, 0x90, 0xae, 0x43, 0xc1, 0x50, 0xd7, 0x51,
0x0a, 0x7e, 0x93, 0xba, 0x47, 0x6b, 0x48, 0x93, 0x62, 0xe7, 0x6a, 0x0f, 0xba, 0x30, 0x1b, 0x97,
0xcc, 0x7e, 0x52, 0x5e, 0x59, 0xc2, 0xff, 0x1e, 0x82, 0x12, 0x12, 0x71, 0xa9, 0x05, 0x29, 0xdb,
0xcf, 0x3f, 0xf8, 0xcf, 0xaf, 0x6e, 0x0d, 0x7e, 0xf6, 0xd5, 0xad, 0xc1, 0x7f, 0x7f, 0x75, 0x6b,
0xf0, 0xd3, 0xaf, 0x6f, 0x7d, 0xeb, 0x67, 0x5f, 0xdf, 0xfa, 0xd6, 0x7f, 0x7d, 0x7d, 0xeb, 0x5b,
0x5f, 0xbe, 0xa5, 0xff, 0xb8, 0xeb, 0xf9, 0xcf, 0xc9, 0x3f, 0xd1, 0xfa, 0xec, 0xff, 0x02, 0x00,
0x00, 0xff, 0xff, 0x4c, 0x64, 0x5e, 0x0f, 0x00, 0x76, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -477,6 +478,7 @@ type ClientCommandsClient interface {
ObjectImportNotionValidateToken(ctx context.Context, in *pb.RpcObjectImportNotionValidateTokenRequest, opts ...grpc.CallOption) (*pb.RpcObjectImportNotionValidateTokenResponse, error)
ObjectImportUseCase(ctx context.Context, in *pb.RpcObjectImportUseCaseRequest, opts ...grpc.CallOption) (*pb.RpcObjectImportUseCaseResponse, error)
ObjectImportExperience(ctx context.Context, in *pb.RpcObjectImportExperienceRequest, opts ...grpc.CallOption) (*pb.RpcObjectImportExperienceResponse, error)
ObjectDateByTimestamp(ctx context.Context, in *pb.RpcObjectDateByTimestampRequest, opts ...grpc.CallOption) (*pb.RpcObjectDateByTimestampResponse, error)
// Collections
// ***
ObjectCollectionAdd(ctx context.Context, in *pb.RpcObjectCollectionAddRequest, opts ...grpc.CallOption) (*pb.RpcObjectCollectionAddResponse, error)
@ -1531,6 +1533,15 @@ func (c *clientCommandsClient) ObjectImportExperience(ctx context.Context, in *p
return out, nil
}
func (c *clientCommandsClient) ObjectDateByTimestamp(ctx context.Context, in *pb.RpcObjectDateByTimestampRequest, opts ...grpc.CallOption) (*pb.RpcObjectDateByTimestampResponse, error) {
out := new(pb.RpcObjectDateByTimestampResponse)
err := c.cc.Invoke(ctx, "/anytype.ClientCommands/ObjectDateByTimestamp", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *clientCommandsClient) ObjectCollectionAdd(ctx context.Context, in *pb.RpcObjectCollectionAddRequest, opts ...grpc.CallOption) (*pb.RpcObjectCollectionAddResponse, error) {
out := new(pb.RpcObjectCollectionAddResponse)
err := c.cc.Invoke(ctx, "/anytype.ClientCommands/ObjectCollectionAdd", in, out, opts...)
@ -3263,6 +3274,7 @@ type ClientCommandsServer interface {
ObjectImportNotionValidateToken(context.Context, *pb.RpcObjectImportNotionValidateTokenRequest) *pb.RpcObjectImportNotionValidateTokenResponse
ObjectImportUseCase(context.Context, *pb.RpcObjectImportUseCaseRequest) *pb.RpcObjectImportUseCaseResponse
ObjectImportExperience(context.Context, *pb.RpcObjectImportExperienceRequest) *pb.RpcObjectImportExperienceResponse
ObjectDateByTimestamp(context.Context, *pb.RpcObjectDateByTimestampRequest) *pb.RpcObjectDateByTimestampResponse
// Collections
// ***
ObjectCollectionAdd(context.Context, *pb.RpcObjectCollectionAddRequest) *pb.RpcObjectCollectionAddResponse
@ -3767,6 +3779,9 @@ func (*UnimplementedClientCommandsServer) ObjectImportUseCase(ctx context.Contex
func (*UnimplementedClientCommandsServer) ObjectImportExperience(ctx context.Context, req *pb.RpcObjectImportExperienceRequest) *pb.RpcObjectImportExperienceResponse {
return nil
}
func (*UnimplementedClientCommandsServer) ObjectDateByTimestamp(ctx context.Context, req *pb.RpcObjectDateByTimestampRequest) *pb.RpcObjectDateByTimestampResponse {
return nil
}
func (*UnimplementedClientCommandsServer) ObjectCollectionAdd(ctx context.Context, req *pb.RpcObjectCollectionAddRequest) *pb.RpcObjectCollectionAddResponse {
return nil
}
@ -5944,6 +5959,24 @@ func _ClientCommands_ObjectImportExperience_Handler(srv interface{}, ctx context
return interceptor(ctx, in, info, handler)
}
func _ClientCommands_ObjectDateByTimestamp_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(pb.RpcObjectDateByTimestampRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ClientCommandsServer).ObjectDateByTimestamp(ctx, in), nil
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/anytype.ClientCommands/ObjectDateByTimestamp",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ClientCommandsServer).ObjectDateByTimestamp(ctx, req.(*pb.RpcObjectDateByTimestampRequest)), nil
}
return interceptor(ctx, in, info, handler)
}
func _ClientCommands_ObjectCollectionAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(pb.RpcObjectCollectionAddRequest)
if err := dec(in); err != nil {
@ -9520,6 +9553,10 @@ var _ClientCommands_serviceDesc = grpc.ServiceDesc{
MethodName: "ObjectImportExperience",
Handler: _ClientCommands_ObjectImportExperience_Handler,
},
{
MethodName: "ObjectDateByTimestamp",
Handler: _ClientCommands_ObjectDateByTimestamp_Handler,
},
{
MethodName: "ObjectCollectionAdd",
Handler: _ClientCommands_ObjectCollectionAdd_Handler,

View file

@ -9,7 +9,7 @@ import (
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
)
const RelationChecksum = "ee87cfabadaa575c8e4c1a74a737cbbd8520d37dbe71668120e516db416947df"
const RelationChecksum = "40664f94553807e45b8ad3ab00ba848505de50bd499545f42673bad8175e135d"
const (
RelationKeyTag domain.RelationKey = "tag"
RelationKeyCamera domain.RelationKey = "camera"
@ -1015,9 +1015,10 @@ var (
Id: "_brlastUsedDate",
Key: "lastUsedDate",
MaxCount: 1,
Name: "Last Used date",
Name: "Last used date",
ReadOnly: true,
ReadOnlyRelation: true,
Revision: 1,
Scope: model.Relation_type,
},
RelationKeyLatestAclHeadId: {

View file

@ -1251,9 +1251,10 @@
"hidden": true,
"key": "lastUsedDate",
"maxCount": 1,
"name": "Last Used date",
"name": "Last used date",
"readonly": true,
"source": "local"
"source": "local",
"revision": 1
},
{
"description": "Revision of system object",

View file

@ -52,7 +52,7 @@ func (s dateOnlySort) AppendKey(tuple anyenc.Tuple, v *anyenc.Value) anyenc.Tupl
}
if s.reverse {
return tuple.Append(s.arena.NewNumberFloat64(float64(ts)))
return tuple.AppendInverted(s.arena.NewNumberFloat64(float64(ts)))
} else {
return tuple.Append(s.arena.NewNumberFloat64(float64(ts)))
}

View file

@ -149,12 +149,12 @@ func makeFilterByCondition(spaceID string, rawFilter *model.BlockContentDataview
Value: rawFilter.Value,
}}, nil
case model.BlockContentDataviewFilter_In:
// hack for queries for relations containing date objects ids with format _date_YYYY-MM-DD-hh-mm-ss
// hack for queries for relations containing date objects ids with format _date_YYYY-MM-DD-hh-mm-ssZ-zzzz
// to find all date object ids of the same day we search by prefix _date_YYYY-MM-DD
if ts, err := dateutil.ParseDateId(rawFilter.Value.GetStringValue()); err == nil {
if dateObject, err := dateutil.BuildDateObjectFromId(rawFilter.Value.GetStringValue()); err == nil {
return FilterHasPrefix{
Key: rawFilter.RelationKey,
Prefix: dateutil.TimeToDateId(ts),
Prefix: dateutil.NewDateObject(dateObject.Time(), false).Id(),
}, nil
}
list, err := pbtypes.ValueListWrapper(rawFilter.Value)

View file

@ -939,16 +939,16 @@ func TestFilterHasPrefix_FilterObject(t *testing.T) {
now := time.Now()
f := FilterHasPrefix{
Key: key,
Prefix: dateutil.TimeToDateId(now), // _date_YYYY-MM-DD
Prefix: dateutil.NewDateObject(now, false).Id(), // _date_YYYY-MM-DD
}
obj1 := &types.Struct{Fields: map[string]*types.Value{
key: pbtypes.StringList([]string{"obj2", dateutil.TimeToDateId(now.Add(30 * time.Minute)), "obj3"}), // _date_YYYY-MM-DD-hh-mm-ss
key: pbtypes.StringList([]string{"obj2", dateutil.NewDateObject(now.Add(30*time.Minute), true).Id(), "obj3"}), // _date_YYYY-MM-DD-hh-mm-ssZ-zzzz
}}
obj2 := &types.Struct{Fields: map[string]*types.Value{
key: pbtypes.StringList([]string{dateutil.TimeToDateId(now.Add(24 * time.Hour)), "obj1", "obj3"}), // same format, but next day
key: pbtypes.StringList([]string{dateutil.NewDateObject(now.Add(24*time.Hour), true).Id(), "obj1", "obj3"}), // same format, but next day
}}
obj3 := &types.Struct{Fields: map[string]*types.Value{
key: pbtypes.StringList([]string{"obj2", "obj3", dateutil.TimeToDateId(now.Add(30 * time.Minute))}), // _date_YYYY-MM-DD
key: pbtypes.StringList([]string{"obj2", "obj3", dateutil.NewDateObject(now.Add(30*time.Minute), true).Id()}), // _date_YYYY-MM-DD
}}
assertFilter(t, f, obj1, true)
assertFilter(t, f, obj2, false)

View file

@ -266,6 +266,19 @@ func TestKeyOrder_Compare(t *testing.T) {
assertCompare(t, asc, a, b, 1)
})
t.Run("desc_date", func(t *testing.T) {
a := &types.Struct{Fields: map[string]*types.Value{"k": pbtypes.Int64(date.Unix())}}
b := &types.Struct{Fields: map[string]*types.Value{"k": pbtypes.Int64(time.Now().Unix())}}
asc := &KeyOrder{arena: arena,
Key: "k",
Type: model.BlockContentDataviewSort_Desc,
EmptyPlacement: model.BlockContentDataviewSort_Start,
IncludeTime: false,
relationFormat: model.RelationFormat_date,
}
assertCompare(t, asc, a, b, 1)
})
t.Run("asc_nil_emptylast", func(t *testing.T) {
a := &types.Struct{Fields: map[string]*types.Value{"k": pbtypes.String("a")}}
b := &types.Struct{Fields: map[string]*types.Value{"k": nil}}

View file

@ -29,13 +29,28 @@ func (fx *StoreFixture) TechSpaceId() string {
return fx.techSpaceIdProvider.TechSpaceId()
}
type virtualDetailsHandler interface {
AddVirtualDetails(id string, det *types.Struct)
}
type detailsFromId struct {
details map[string]*types.Struct
}
func (d *detailsFromId) DetailsFromIdBasedSource(id domain.FullID) (*types.Struct, error) {
if det, found := d.details[id.ObjectID]; found {
return det, nil
}
return nil, fmt.Errorf("not found")
}
func (d *detailsFromId) AddVirtualDetails(id string, det *types.Struct) {
if d.details == nil {
d.details = map[string]*types.Struct{}
}
d.details[id] = det
}
type stubTechSpaceIdProvider struct{}
func (s *stubTechSpaceIdProvider) TechSpaceId() string {
@ -118,3 +133,9 @@ func makeDetails(fields spaceindex.TestObject) *types.Struct {
}
return &types.Struct{Fields: f}
}
func (fx *StoreFixture) AddVirtualDetails(id string, details *types.Struct) {
if handler := fx.sourceService.(virtualDetailsHandler); handler != nil {
handler.AddVirtualDetails(id, details)
}
}

View file

@ -10,8 +10,6 @@ import (
crypto "github.com/anyproto/any-sync/util/crypto"
domain "github.com/anyproto/anytype-heart/core/domain"
mock "github.com/stretchr/testify/mock"
)
@ -437,64 +435,6 @@ func (_c *MockService_GetPersonalSpace_Call) RunAndReturn(run func(context.Conte
return _c
}
// GetRelationIdByKey provides a mock function with given fields: ctx, spaceId, key
func (_m *MockService) GetRelationIdByKey(ctx context.Context, spaceId string, key domain.RelationKey) (string, error) {
ret := _m.Called(ctx, spaceId, key)
if len(ret) == 0 {
panic("no return value specified for GetRelationIdByKey")
}
var r0 string
var r1 error
if rf, ok := ret.Get(0).(func(context.Context, string, domain.RelationKey) (string, error)); ok {
return rf(ctx, spaceId, key)
}
if rf, ok := ret.Get(0).(func(context.Context, string, domain.RelationKey) string); ok {
r0 = rf(ctx, spaceId, key)
} else {
r0 = ret.Get(0).(string)
}
if rf, ok := ret.Get(1).(func(context.Context, string, domain.RelationKey) error); ok {
r1 = rf(ctx, spaceId, key)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// MockService_GetRelationIdByKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRelationIdByKey'
type MockService_GetRelationIdByKey_Call struct {
*mock.Call
}
// GetRelationIdByKey is a helper method to define mock.On call
// - ctx context.Context
// - spaceId string
// - key domain.RelationKey
func (_e *MockService_Expecter) GetRelationIdByKey(ctx interface{}, spaceId interface{}, key interface{}) *MockService_GetRelationIdByKey_Call {
return &MockService_GetRelationIdByKey_Call{Call: _e.mock.On("GetRelationIdByKey", ctx, spaceId, key)}
}
func (_c *MockService_GetRelationIdByKey_Call) Run(run func(ctx context.Context, spaceId string, key domain.RelationKey)) *MockService_GetRelationIdByKey_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(string), args[2].(domain.RelationKey))
})
return _c
}
func (_c *MockService_GetRelationIdByKey_Call) Return(id string, err error) *MockService_GetRelationIdByKey_Call {
_c.Call.Return(id, err)
return _c
}
func (_c *MockService_GetRelationIdByKey_Call) RunAndReturn(run func(context.Context, string, domain.RelationKey) (string, error)) *MockService_GetRelationIdByKey_Call {
_c.Call.Return(run)
return _c
}
// GetTechSpace provides a mock function with given fields: ctx
func (_m *MockService) GetTechSpace(ctx context.Context) (clientspace.Space, error) {
ret := _m.Called(ctx)
@ -553,64 +493,6 @@ func (_c *MockService_GetTechSpace_Call) RunAndReturn(run func(context.Context)
return _c
}
// GetTypeIdByKey provides a mock function with given fields: ctx, spaceId, key
func (_m *MockService) GetTypeIdByKey(ctx context.Context, spaceId string, key domain.TypeKey) (string, error) {
ret := _m.Called(ctx, spaceId, key)
if len(ret) == 0 {
panic("no return value specified for GetTypeIdByKey")
}
var r0 string
var r1 error
if rf, ok := ret.Get(0).(func(context.Context, string, domain.TypeKey) (string, error)); ok {
return rf(ctx, spaceId, key)
}
if rf, ok := ret.Get(0).(func(context.Context, string, domain.TypeKey) string); ok {
r0 = rf(ctx, spaceId, key)
} else {
r0 = ret.Get(0).(string)
}
if rf, ok := ret.Get(1).(func(context.Context, string, domain.TypeKey) error); ok {
r1 = rf(ctx, spaceId, key)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// MockService_GetTypeIdByKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTypeIdByKey'
type MockService_GetTypeIdByKey_Call struct {
*mock.Call
}
// GetTypeIdByKey is a helper method to define mock.On call
// - ctx context.Context
// - spaceId string
// - key domain.TypeKey
func (_e *MockService_Expecter) GetTypeIdByKey(ctx interface{}, spaceId interface{}, key interface{}) *MockService_GetTypeIdByKey_Call {
return &MockService_GetTypeIdByKey_Call{Call: _e.mock.On("GetTypeIdByKey", ctx, spaceId, key)}
}
func (_c *MockService_GetTypeIdByKey_Call) Run(run func(ctx context.Context, spaceId string, key domain.TypeKey)) *MockService_GetTypeIdByKey_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(string), args[2].(domain.TypeKey))
})
return _c
}
func (_c *MockService_GetTypeIdByKey_Call) Return(id string, err error) *MockService_GetTypeIdByKey_Call {
_c.Call.Return(id, err)
return _c
}
func (_c *MockService_GetTypeIdByKey_Call) RunAndReturn(run func(context.Context, string, domain.TypeKey) (string, error)) *MockService_GetTypeIdByKey_Call {
_c.Call.Return(run)
return _c
}
// Init provides a mock function with given fields: a
func (_m *MockService) Init(a *app.App) error {
ret := _m.Called(a)

View file

@ -19,7 +19,6 @@ import (
"go.uber.org/zap"
"github.com/anyproto/anytype-heart/core/anytype/config"
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/addr"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
@ -71,11 +70,6 @@ type Service interface {
AccountMetadataSymKey() crypto.SymKey
AccountMetadataPayload() []byte
WaitPersonalSpaceMigration(ctx context.Context) (err error)
// TODO: GO-4494 - Remove these temporary methods
GetRelationIdByKey(ctx context.Context, spaceId string, key domain.RelationKey) (id string, err error)
GetTypeIdByKey(ctx context.Context, spaceId string, key domain.TypeKey) (id string, err error)
app.ComponentRunnable
}
@ -495,23 +489,3 @@ func (s *service) getTechSpace(ctx context.Context) (*clientspace.TechSpace, err
return nil, ctx.Err()
}
}
// TODO: GO-4494 - Remove this temporary method
func (s *service) GetRelationIdByKey(ctx context.Context, spaceId string, key domain.RelationKey) (id string, err error) {
spc, err := s.Get(ctx, spaceId)
if err != nil {
return "", err
}
return spc.GetRelationIdByKey(ctx, key)
}
// TODO: GO-4494 - Remove this temporary method
func (s *service) GetTypeIdByKey(ctx context.Context, spaceId string, key domain.TypeKey) (id string, err error) {
spc, err := s.Get(ctx, spaceId)
if err != nil {
return "", err
}
return spc.GetTypeIdByKey(ctx, key)
}

View file

@ -64,21 +64,9 @@ type widgetParameters struct {
//go:embed data/get_started.zip
var getStartedZip []byte
//go:embed data/personal_projects.zip
var personalProjectsZip []byte
//go:embed data/knowledge_base.zip
var knowledgeBaseZip []byte
//go:embed data/notes_diary.zip
var notesDiaryZip []byte
//go:embed data/migration_dashboard.zip
var migrationDashboardZip []byte
//go:embed data/strategic_writing.zip
var strategicWritingZip []byte
//go:embed data/empty.zip
var emptyZip []byte
@ -86,12 +74,8 @@ var (
log = logging.Logger("anytype-mw-builtinobjects")
archives = map[pb.RpcObjectImportUseCaseRequestUseCase][]byte{
pb.RpcObjectImportUseCaseRequest_GET_STARTED: getStartedZip,
pb.RpcObjectImportUseCaseRequest_PERSONAL_PROJECTS: personalProjectsZip,
pb.RpcObjectImportUseCaseRequest_KNOWLEDGE_BASE: knowledgeBaseZip,
pb.RpcObjectImportUseCaseRequest_NOTES_DIARY: notesDiaryZip,
pb.RpcObjectImportUseCaseRequest_STRATEGIC_WRITING: strategicWritingZip,
pb.RpcObjectImportUseCaseRequest_EMPTY: emptyZip,
pb.RpcObjectImportUseCaseRequest_GET_STARTED: getStartedZip,
pb.RpcObjectImportUseCaseRequest_EMPTY: emptyZip,
}
// TODO: GO-2009 Now we need to create widgets by hands, widget import is not implemented yet
@ -104,32 +88,6 @@ var (
pb.RpcObjectImportUseCaseRequest_GET_STARTED: {
{model.BlockContentWidget_Link, "bafyreic75ulgm2yz426hjwdjkzqw3kafniknki7qkhufqgrspmxzdppixa", "", true},
},
pb.RpcObjectImportUseCaseRequest_PERSONAL_PROJECTS: {
{model.BlockContentWidget_CompactList, widget.DefaultWidgetFavorite, "", false},
{model.BlockContentWidget_CompactList, widget.DefaultWidgetSet, "", false},
{model.BlockContentWidget_CompactList, "bafyreibdfkwnnj6xndyzazkm2gersm5fk3yg2274d5hqr6drurncxiyeoi", "", true}, // Tasks
{model.BlockContentWidget_CompactList, widget.DefaultWidgetRecent, "", false},
},
pb.RpcObjectImportUseCaseRequest_KNOWLEDGE_BASE: {
{model.BlockContentWidget_Link, "bafyreiaszkibjyfls2og3ztgxfllqlom422y5ic64z7w3k3oio6f3pc2ia", "", true},
{model.BlockContentWidget_CompactList, widget.DefaultWidgetFavorite, "", false},
{model.BlockContentWidget_CompactList, widget.DefaultWidgetSet, "", false},
{model.BlockContentWidget_CompactList, widget.DefaultWidgetRecent, "", false},
},
pb.RpcObjectImportUseCaseRequest_NOTES_DIARY: {
{model.BlockContentWidget_Link, "bafyreiexkrata5ofvswxyisuumukmkyerdwv3xa34qkxpgx6jtl7waah34", "", true},
{model.BlockContentWidget_CompactList, widget.DefaultWidgetFavorite, "", false},
{model.BlockContentWidget_CompactList, widget.DefaultWidgetSet, "", false},
{model.BlockContentWidget_CompactList, widget.DefaultWidgetRecent, "", false},
},
pb.RpcObjectImportUseCaseRequest_STRATEGIC_WRITING: {
{model.BlockContentWidget_List, "bafyreido5lhh4vntmlxh2hwn4b3xfmz53yw5rrfmcl22cdb4phywhjlcdu", "f984ddde-eb13-497e-809a-2b9a96fd3503", true}, // Task tracker
{model.BlockContentWidget_List, widget.DefaultWidgetFavorite, "", false},
{model.BlockContentWidget_Tree, "bafyreicblsgojhhlfduz7ek4g4jh6ejy24fle2q5xjbue5kkcd7ifbc4ki", "", true}, // My Home
{model.BlockContentWidget_CompactList, widget.DefaultWidgetRecent, "", false},
{model.BlockContentWidget_Link, "bafyreiaoeaxv4dkw4xgdcgubetieyuqlf24q2kg5pdysz4prun6qg5v2ru", "", true}, // About Anytype
{model.BlockContentWidget_CompactList, widget.DefaultWidgetSet, "", false},
},
}
)

View file

@ -8,26 +8,57 @@ import (
)
const (
dateIdLayout = "2006-01-02"
dateNameLayout = "02 Jan 2006"
shortDateIdLayout = "2006-01-02"
dateIdLayout = "2006-01-02-15-04-05Z-0700"
shortDateNameLayout = "Mon, Jan 02, 2006"
dateNameLayout = "Mon, Jan 02, 2006 3:04 PM"
)
func TimeToDateId(t time.Time) string {
return addr.DatePrefix + t.Format(dateIdLayout)
type DateObject interface {
Id() string
Name() string
Time() time.Time
}
func ParseDateId(id string) (time.Time, error) {
return time.Parse(dateIdLayout, strings.TrimPrefix(id, addr.DatePrefix))
type dateObject struct {
t time.Time
includeTime bool
}
func TimeToDateName(t time.Time) string {
return t.Format(dateNameLayout)
func NewDateObject(t time.Time, includeTime bool) DateObject {
return dateObject{t, includeTime}
}
func DateNameToId(name string) (string, error) {
t, err := time.Parse(dateNameLayout, name)
if err != nil {
return "", err
func BuildDateObjectFromId(id string) (DateObject, error) {
formatted := strings.TrimPrefix(id, addr.DatePrefix)
formatted = strings.Replace(formatted, "_", "+", 1)
t, err := time.Parse(dateIdLayout, formatted)
if err == nil {
return dateObject{t, true}, nil
}
return TimeToDateId(t), nil
t, err = time.ParseInLocation(shortDateIdLayout, formatted, time.Local)
if err == nil {
return dateObject{t, false}, nil
}
return dateObject{}, err
}
func (do dateObject) Id() string {
if do.includeTime {
formatted := do.t.Format(dateIdLayout)
formatted = strings.Replace(formatted, "+", "_", 1)
return addr.DatePrefix + formatted
}
return addr.DatePrefix + do.t.Format(shortDateIdLayout)
}
func (do dateObject) Name() string {
if do.includeTime {
return do.t.Format(dateNameLayout)
}
return do.t.Format(shortDateNameLayout)
}
func (do dateObject) Time() time.Time {
return do.t
}

View file

@ -7,43 +7,116 @@ import (
"github.com/stretchr/testify/assert"
)
func TestTimeToDateId(t *testing.T) {
assert.Equal(t, "_date_2024-11-07", TimeToDateId(time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC)))
assert.Equal(t, "_date_1998-01-01", TimeToDateId(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.UTC)))
assert.Equal(t, "_date_2124-12-25", TimeToDateId(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC)))
func TestNewDateObject(t *testing.T) {
t.Run("include time", func(t *testing.T) {
for _, tc := range []struct {
ts time.Time
expectedId string
expectedName string
}{
{
ts: time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC),
expectedId: "_date_2024-11-07-12-25-59Z_0000",
expectedName: "Thu, Nov 07, 2024 12:25 PM",
},
{
ts: time.Date(1998, time.January, 1, 0, 1, 1, 0, time.UTC),
expectedId: "_date_1998-01-01-00-01-01Z_0000",
expectedName: "Thu, Jan 01, 1998 12:01 AM",
},
{
ts: time.Date(1998, time.January, 1, 0, 1, 1, 0, time.FixedZone("UTC", +4*60*60)),
expectedId: "_date_1998-01-01-00-01-01Z_0400",
expectedName: "Thu, Jan 01, 1998 12:01 AM",
},
{
ts: time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC),
expectedId: "_date_2124-12-25-23-34-00Z_0000",
expectedName: "Mon, Dec 25, 2124 11:34 PM",
},
{
ts: time.Date(2124, time.December, 25, 23, 34, 0, 0, time.FixedZone("UTC", -2*60*60)),
expectedId: "_date_2124-12-25-23-34-00Z-0200",
expectedName: "Mon, Dec 25, 2124 11:34 PM",
},
} {
do := NewDateObject(tc.ts, true)
assert.Equal(t, tc.expectedId, do.Id())
assert.Equal(t, tc.expectedName, do.Name())
assert.Equal(t, tc.ts, do.Time())
}
})
t.Run("do not include time", func(t *testing.T) {
for _, tc := range []struct {
ts time.Time
expectedId string
expectedName string
}{
{
ts: time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC),
expectedId: "_date_2024-11-07",
expectedName: "Thu, Nov 07, 2024",
},
{
ts: time.Date(1998, time.January, 1, 0, 1, 1, 0, time.UTC),
expectedId: "_date_1998-01-01",
expectedName: "Thu, Jan 01, 1998",
},
{
ts: time.Date(1998, time.January, 1, 0, 1, 1, 0, time.FixedZone("UTC", +4*60*60)),
expectedId: "_date_1998-01-01",
expectedName: "Thu, Jan 01, 1998",
},
{
ts: time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC),
expectedId: "_date_2124-12-25",
expectedName: "Mon, Dec 25, 2124",
},
{
ts: time.Date(2124, time.December, 25, 23, 34, 0, 0, time.FixedZone("UTC", -2*60*60)),
expectedId: "_date_2124-12-25",
expectedName: "Mon, Dec 25, 2124",
},
} {
do := NewDateObject(tc.ts, false)
assert.Equal(t, tc.expectedId, do.Id())
assert.Equal(t, tc.expectedName, do.Name())
assert.Equal(t, tc.ts, do.Time())
}
})
}
func TestTimeToDateName(t *testing.T) {
assert.Equal(t, "07 Nov 2024", TimeToDateName(time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC)))
assert.Equal(t, "01 Jan 1998", TimeToDateName(time.Date(1998, time.January, 1, 0, 1, 1, 0, time.UTC)))
assert.Equal(t, "25 Dec 2124", TimeToDateName(time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC)))
}
func TestParseDateId(t *testing.T) {
t.Run("date format", func(t *testing.T) {
func TestBuildDateObjectFromId(t *testing.T) {
t.Run("date object ids", func(t *testing.T) {
for _, ts := range []time.Time{
time.Date(2024, time.December, 7, 12, 25, 59, 0, time.UTC),
time.Date(2024, time.November, 7, 12, 25, 59, 0, time.UTC),
time.Date(1998, time.January, 1, 0, 1, 1, 0, time.UTC),
time.Date(1998, time.January, 1, 0, 1, 1, 0, time.FixedZone("UTC", +4*60*60)),
time.Date(2124, time.December, 25, 23, 34, 0, 0, time.UTC),
time.Date(2124, time.December, 25, 23, 34, 0, 0, time.FixedZone("UTC", -2*60*60)),
} {
dateId := TimeToDateId(ts)
ts2, err := ParseDateId(dateId)
withTime1 := NewDateObject(ts, true)
withTime2, err := BuildDateObjectFromId(withTime1.Id())
assert.NoError(t, err)
assert.Equal(t, ts.Year(), ts2.Year())
assert.Equal(t, ts.Month(), ts2.Month())
assert.Equal(t, ts.Day(), ts2.Day())
assert.Zero(t, ts2.Hour())
assert.Zero(t, ts2.Minute())
assert.Zero(t, ts2.Second())
assert.Equal(t, withTime2.Time().Unix(), withTime1.Time().Unix())
assert.Equal(t, withTime2.Id(), withTime1.Id())
withoutTime1 := NewDateObject(ts, true)
withoutTime2, err := BuildDateObjectFromId(withoutTime1.Id())
assert.NoError(t, err)
assert.Equal(t, withoutTime2.Time().Unix(), withoutTime1.Time().Unix())
assert.Equal(t, withoutTime2.Id(), withoutTime1.Id())
}
})
t.Run("wrong format", func(t *testing.T) {
_, err := ParseDateId("_date_2024")
_, err := BuildDateObjectFromId("_date_2024")
assert.Error(t, err)
_, err = ParseDateId("object1")
_, err = BuildDateObjectFromId("object1")
assert.Error(t, err)
})
}

View file

@ -530,6 +530,13 @@ func Map(s *types.Struct, keys ...string) *types.Struct {
return ns
}
func MapN(structs []*types.Struct, keys ...string) []*types.Struct {
for i, s := range structs {
structs[i] = Map(s, keys...)
}
return structs
}
func StructIterate(st *types.Struct, f func(path []string, v *types.Value)) {
var iterate func(s *types.Struct, f func(path []string, v *types.Value), path []string)
iterate = func(s *types.Struct, f func(path []string, v *types.Value), path []string) {

View file

@ -6,6 +6,8 @@ import (
"github.com/gogo/protobuf/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"golang.org/x/exp/maps"
)
func TestGet(t *testing.T) {
@ -177,3 +179,34 @@ func TestIsEmptyValueOrAbsent(t *testing.T) {
})
}
}
func TestMapN(t *testing.T) {
// given
structs := []*types.Struct{
{Fields: map[string]*types.Value{
"name": String("obj1"),
"id": String("obj1"),
"key": String("obj1"),
}},
{Fields: map[string]*types.Value{
"name": String("obj2"),
"id": String("obj2"),
"links": StringList([]string{"obj1", "obj3"}),
}},
{Fields: map[string]*types.Value{
"name": String("obj3"),
"id": String("obj3"),
"number": Int64(42),
}},
}
keys := []string{"name", "id"}
// when
mapped := MapN(structs, keys...)
// then
require.Len(t, mapped, 3)
assert.Len(t, maps.Keys(mapped[0].Fields), 2)
assert.Len(t, maps.Keys(mapped[1].Fields), 2)
assert.Len(t, maps.Keys(mapped[2].Fields), 2)
}