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

GO-1825 Merge main

This commit is contained in:
kirillston 2023-08-14 17:32:01 +02:00
commit c35ac9cc4d
No known key found for this signature in database
GPG key ID: 88218A7F1109754B
80 changed files with 5523 additions and 2024 deletions

View file

@ -1,61 +0,0 @@
name: Force Mirror Changes to any-block
on: workflow_dispatch
jobs:
force-mirror-anyblock:
runs-on: ubuntu-latest
steps:
- name: Checkout anytype-heart
uses: actions/checkout@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 2
path: anytype-heart
- name: Set variables
run: |
echo "any-block-files=pkg/lib/pb/model/protos/models.proto,pb/protos/changes.proto,pb/protos/events.proto" >> "$GITHUB_ENV"
- name: Update import paths
run: |
for file in $(echo "${{ env.any-block-files }}" | tr ',' ' '); do
sed -i -E '/google/! s/(import\s+")([^\/]+\/)*([^\/]+\.proto")/\1\3/g' "anytype-heart/$file"
done
- name: Clone any-block
uses: actions/checkout@v3
with:
repository: anyproto/any-block
token: ${{ secrets.GITHUB_TOKEN }}
path: any-block
- name: Copy changed files to any-block
run: |
for file in $(echo "${{ env.any-block-files }}" | tr ',' ' '); do
cp -f "anytype-heart/$file" any-block/
done
- name: Install Go
uses: actions/setup-go@v4
with:
go-version: 'stable'
- name: Generate documentation using proto-gen-doc
run: |
cd any-block
echo "Installing proto"
sudo apt-get update && sudo apt-get install -y protobuf-compiler
echo "Installing protoc-gen-doc"
go install github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc@latest
echo "Running protoc"
protoc --doc_out=. --doc_opt=html,index.html *.proto
- name: Commit and push changes to any-block
run: |
cd any-block
git config --global user.email "association@anytype.io"
git config --global user.name "Any Association"
git add .
git commit -m "Update proto files"
git push origin main

View file

@ -2,75 +2,51 @@ name: Mirror Changes to any-block
on:
push:
paths:
- 'pkg/lib/pb/model/protos/models.proto'
- 'pb/protos/changes.proto'
- 'pb/protos/events.proto'
- 'pb/protos/snapshot.proto'
branches:
- main
workflow_dispatch:
jobs:
mirror-anyblock:
if: ${{ github.repository_owner == 'anyproto' }}
runs-on: ubuntu-latest
steps:
- name: Checkout anytype-heart
uses: actions/checkout@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
token: ${{ secrets.ANY_CLA_TOKEN }}
fetch-depth: 2
path: anytype-heart
- name: Set variables
run: |
echo "any-block-files=pkg/lib/pb/model/protos/models.proto,pb/protos/changes.proto,pb/protos/events.proto" >> "$GITHUB_ENV"
- name: Find changed files
run: |
cd anytype-heart
files=$(comm -12 <(echo "${{ env.any-block-files }}" | tr ',' '\n' | sort) <(git diff --name-only HEAD HEAD~1 | sort))
if [ -z "$files" ]; then
echo "changed=false" >> "$GITHUB_ENV"
else
echo "changed=true" >> "$GITHUB_ENV"
fi
echo "any-block-files=pkg/lib/pb/model/protos/models.proto,pb/protos/changes.proto,pb/protos/events.proto,pb/protos/snapshot.proto" >> "$GITHUB_ENV"
- name: Update import paths
if: ${{ env.changed == 'true' }}
run: |
for file in $(echo "${{ env.any-block-files }}" | tr ',' ' '); do
sed -i -E '/google/! s/(import\s+")([^\/]+\/)*([^\/]+\.proto")/\1\3/g' "anytype-heart/$file"
done
- name: Clone any-block
if: ${{ env.changed == 'true' }}
uses: actions/checkout@v3
with:
repository: anyproto/any-block
token: ${{ secrets.GITHUB_TOKEN }}
token: ${{ secrets.ANY_CLA_TOKEN }}
path: any-block
- name: Copy changed files to any-block
if: ${{ env.changed == 'true' }}
run: |
for file in $(echo "${{ env.any-block-files }}" | tr ',' ' '); do
cp -f "anytype-heart/$file" any-block/
done
- name: Install Go
if: ${{ env.changed == 'true' }}
uses: actions/setup-go@v4
with:
go-version: 'stable'
- name: Generate documentation using proto-gen-doc
if: ${{ env.changed == 'true' }}
run: |
cd any-block
echo "Installing proto"
sudo apt-get update && sudo apt-get install -y protobuf-compiler
echo "Installing protoc-gen-doc"
go install github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc@latest
echo "Running protoc"
protoc --doc_out=. --doc_opt=html,index.html *.proto
- name: Commit and push changes to any-block
if: ${{ env.changed == 'true' }}
run: |
cd any-block
git config --global user.email "association@anytype.io"

View file

@ -58,6 +58,16 @@ jobs:
rm -rf ~/gotestsum-report
mkdir ~/gotestsum-report
CGO_CFLAGS="-Wno-deprecated-declarations -Wno-deprecated-non-prototype -Wno-xor-used-as-pow" gotestsum --junitfile ~/gotestsum-report/gotestsum-report.xml -- -tags "nogrpcserver nographviz" -p 1 $(echo $PACKAGE_NAMES) -race -coverprofile=coverage.out -covermode=atomic ./...
generated_pattern='^\/\/ Code generated .* DO NOT EDIT\.$'
files_list=$(grep -rl "$generated_pattern" . | grep '\.go$' | sed 's/^\.\///')
for file in $files_list; do
echo "Removing $file from coverage report"
grep -v "$file" coverage.out > temp_file
mv temp_file coverage.out
done
COVERAGE=$(go tool cover -func coverage.out | grep total | awk '{print substr($3, 1, length($3)-1)}')
echo "coverage_middleware $COVERAGE" | curl --data-binary @- --user "$prometheus_username:$prometheus_password" https://pushgateway.anytype.io/metrics/job/tech_quality
- name: Publish Test Report

View file

@ -10,3 +10,12 @@ packages:
github.com/anyproto/anytype-heart/core/wallet:
interfaces:
Wallet:
github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore:
interfaces:
ObjectStore:
github.com/anyproto/anytype-heart/core/event:
interfaces:
Sender:
github.com/anyproto/anytype-heart/core/block/restriction:
interfaces:
Service:

View file

@ -2,7 +2,7 @@
Middleware library for Anytype, distributed as part of the Anytype clients.
## Build from Source
1. Install Golang 1.19.x [from here](http://golang.org/dl/) or using preferred package manager
1. Install Golang 1.21.x [from here](http://golang.org/dl/) or using preferred package manager
2. Follow instructions below for the target systems

View file

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

View file

@ -10,10 +10,12 @@ import (
"os"
"path/filepath"
"strings"
"github.com/anyproto/anytype-heart/pb"
"github.com/gogo/protobuf/jsonpb"
"github.com/gogo/protobuf/proto"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/util/constant"
)
var (
@ -66,16 +68,19 @@ func processFile(file File, outputFile string) {
}
// assuming Snapshot is a protobuf message
snapshot := pb.SnapshotWithType{}
var snapshot proto.Message = &pb.SnapshotWithType{}
if strings.HasPrefix(file.Name, constant.ProfileFile) {
snapshot = &pb.Profile{}
}
if strings.HasSuffix(file.Name, ".json") {
if err := jsonpb.UnmarshalString(string(content), &snapshot); err != nil {
if err := jsonpb.UnmarshalString(string(content), snapshot); err != nil {
log.Fatalf("Failed to parse jsonpb message: %v", err)
}
// convert to pb and write to outputFile
pbData, err := proto.Marshal(&snapshot)
pbData, err := proto.Marshal(snapshot)
if err != nil {
log.Fatalf("Failed to marshal jsonpb message to protobuf: %v", err)
}
@ -88,12 +93,12 @@ func processFile(file File, outputFile string) {
} else {
if err := proto.Unmarshal(content, &snapshot); err != nil {
if err := proto.Unmarshal(content, snapshot); err != nil {
log.Fatalf("Failed to parse protobuf message: %v", err)
}
// convert to jsonpb and write to outputFile
jsonData, err := jsonM.MarshalToString(&snapshot)
jsonData, err := jsonM.MarshalToString(snapshot)
if err != nil {
log.Fatalf("Failed to marshal protobuf message to json: %v", err)
}
@ -193,8 +198,14 @@ func createZipFromDirectory(input, output string) {
return err
}
isProfile := strings.HasPrefix(info.Name(), constant.ProfileFile)
// assuming Snapshot is a protobuf message
snapshot := &pb.SnapshotWithType{}
var snapshot proto.Message = &pb.SnapshotWithType{}
if isProfile {
snapshot = &pb.Profile{}
}
err = jsonpb.UnmarshalString(string(data), snapshot)
if err != nil {
return err
@ -205,7 +216,11 @@ func createZipFromDirectory(input, output string) {
return err
}
fw, err := w.Create(strings.TrimSuffix(rel, ".json") + ".pb")
name := strings.TrimSuffix(rel, ".json") + ".pb"
if isProfile {
name = strings.TrimSuffix(name, ".pb")
}
fw, err := w.Create(name)
if err != nil {
return err
}

View file

@ -1,90 +0,0 @@
//go:build !nogrpcserver && !_test
// +build !nogrpcserver,!_test
package main
import (
"context"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
"github.com/anyproto/anytype-heart/core"
"github.com/anyproto/anytype-heart/core/event"
"github.com/anyproto/anytype-heart/pb"
_ "net/http/pprof"
)
func main() {
if len(os.Args) > 2 {
invite := os.Args[1]
path := os.Args[2]
var files []string
mw := core.New()
rootPath, _ := ioutil.TempDir(os.TempDir(), "anytype_*")
defer os.RemoveAll(rootPath)
mw.EventSender = event.NewCallbackSender(func(event *pb.Event) {
// nothing to do
})
ctx := context.Background()
_ = mw.WalletCreate(ctx, &pb.RpcWalletCreateRequest{RootPath: rootPath})
_ = mw.AccountCreate(ctx, &pb.RpcAccountCreateRequest{Name: "profile", AlphaInviteCode: invite})
var cids []string
err := filepath.Walk(path, func(path string, info os.FileInfo, err error) error {
files = append(files, path)
if info.IsDir() {
return nil
}
if strings.HasSuffix(strings.ToLower(path), "ds_store") {
return nil
}
resp := mw.FileUpload(ctx, &pb.RpcFileUploadRequest{LocalPath: path, DisableEncryption: true})
if int(resp.Error.Code) != 0 {
return fmt.Errorf(resp.Error.Description)
}
cids = append(cids, resp.Hash)
fmt.Println(path)
fmt.Println(resp.Hash)
return nil
})
if err != nil {
panic(err.Error())
}
// fs := mw.GetApp().MustComponent(pin.CName).(pin.FilePinService)
// for {
// r := fs.PinStatus(cids...)
// var pinned int
// var failed int
// var inprog int
// for k, f := range r {
// if f.Status == pb2.PinStatus_Done {
// pinned++
// }
// if f.Status == pb2.PinStatus_Failed {
// failed++
// }
// if f.Status == pb2.PinStatus_Queued {
// fmt.Printf("%s still in progress\n", k)
// inprog++
// }
// }
// fmt.Printf("%d pinned, %d in-progress, %d failed from %d\n", pinned, inprog, failed, len(r))
//
// if len(r) == len(cids) {
// fmt.Println("all pinned")
// os.Exit(0)
// }
// time.Sleep(time.Second * 10)
// }
}
}

27
core/DEVELOPMENT.md Normal file
View file

@ -0,0 +1,27 @@
# Development
## Services/components
### Bootstrapping
If you need your component to be visible to other components, you need to register it in Service Locator's registry.
To do it go to `Bootstrap` function in `core/anytype/bootstrap.go` and `Register` it
### Dependency injection
We use our own implementation of Service Locator pattern: `github.com/anyproto/any-sync/app`.
## Writing tests
### Structure of tests
Prefer structuring your tests in Act-Arrange-Assert style. Use comments for visual separation of those test parts, like:
```go
// Given
...
// When
...
// Then
```
### Fixtures for services under test
Define `fixture` structure to easily bootstrap service and its dependencies. You can find examples in our code.
### Mocking
Prefer using Mockery for new mocks. It's configured in `.mockery.yaml`

View file

@ -16,6 +16,7 @@ import (
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
"github.com/anyproto/any-sync/net/secureservice/handshake"
"github.com/anyproto/any-sync/util/crypto"
"github.com/anyproto/anytype-heart/space/localdiscovery"
cp "github.com/otiai10/copy"
"github.com/anyproto/anytype-heart/core/anytype"
@ -131,7 +132,11 @@ func (mw *Middleware) AccountCreate(cctx context.Context, req *pb.RpcAccountCrea
response(nil, pb.RpcAccountCreateResponseError_FAILED_TO_STOP_RUNNING_NODE, err)
}
cfg := anytype.BootstrapConfig(true, os.Getenv("ANYTYPE_STAGING") == "1", true)
cfg := anytype.BootstrapConfig(true, os.Getenv("ANYTYPE_STAGING") == "1")
if req.DisableLocalNetworkSync {
cfg.DontStartLocalNetworkSyncAutomatically = true
}
derivationResult, err := core.WalletAccountAt(mw.mnemonic, 0)
if err != nil {
@ -305,8 +310,13 @@ func (mw *Middleware) AccountSelect(cctx context.Context, req *pb.RpcAccountSele
}
}
cfg := anytype.BootstrapConfig(false, os.Getenv("ANYTYPE_STAGING") == "1")
if req.DisableLocalNetworkSync {
cfg.DontStartLocalNetworkSyncAutomatically = true
}
comps := []app.Component{
anytype.BootstrapConfig(false, os.Getenv("ANYTYPE_STAGING") == "1", false),
cfg,
anytype.BootstrapWallet(mw.rootPath, res),
mw.EventSender,
}
@ -533,6 +543,28 @@ func (mw *Middleware) AccountConfigUpdate(_ context.Context, req *pb.RpcAccountC
return response(pb.RpcAccountConfigUpdateResponseError_NULL, err)
}
func (mw *Middleware) AccountEnableLocalNetworkSync(_ context.Context, req *pb.RpcAccountEnableLocalNetworkSyncRequest) *pb.RpcAccountEnableLocalNetworkSyncResponse {
response := func(code pb.RpcAccountEnableLocalNetworkSyncResponseErrorCode, err error) *pb.RpcAccountEnableLocalNetworkSyncResponse {
m := &pb.RpcAccountEnableLocalNetworkSyncResponse{Error: &pb.RpcAccountEnableLocalNetworkSyncResponseError{Code: code}}
if err != nil {
m.Error.Description = err.Error()
}
return m
}
if mw.app == nil {
return response(pb.RpcAccountEnableLocalNetworkSyncResponseError_ACCOUNT_IS_NOT_RUNNING, fmt.Errorf("anytype node not set"))
}
ld := mw.app.MustComponent(localdiscovery.CName).(localdiscovery.LocalDiscovery)
err := ld.Start()
if err != nil {
return response(pb.RpcAccountEnableLocalNetworkSyncResponseError_UNKNOWN_ERROR, err)
}
return response(pb.RpcAccountEnableLocalNetworkSyncResponseError_NULL, err)
}
func (mw *Middleware) AccountRemoveLocalData() error {
conf := mw.app.MustComponent(config.CName).(*config.Config)
address := mw.app.MustComponent(walletComp.CName).(walletComp.Wallet).GetAccountPrivkey().GetPublic().Account()
@ -689,7 +721,7 @@ func (mw *Middleware) getBootstrapConfig(req *pb.RpcAccountRecoverFromLegacyExpo
return nil, fmt.Errorf("failed to extract config: %w", err)
}
cfg := anytype.BootstrapConfig(true, os.Getenv("ANYTYPE_STAGING") == "1", false)
cfg := anytype.BootstrapConfig(true, os.Getenv("ANYTYPE_STAGING") == "1")
cfg.LegacyFileStorePath = oldCfg.LegacyFileStorePath
return cfg, nil
}

View file

@ -40,7 +40,6 @@ import (
"github.com/anyproto/anytype-heart/core/block/source"
"github.com/anyproto/anytype-heart/core/configfetcher"
"github.com/anyproto/anytype-heart/core/debug"
"github.com/anyproto/anytype-heart/core/event"
"github.com/anyproto/anytype-heart/core/files"
"github.com/anyproto/anytype-heart/core/filestorage"
"github.com/anyproto/anytype-heart/core/filestorage/filesync"
@ -83,11 +82,10 @@ var (
WarningAfter = time.Second * 1
)
func BootstrapConfig(newAccount bool, isStaging bool, createBuiltinTemplates bool) *config.Config {
func BootstrapConfig(newAccount bool, isStaging bool) *config.Config {
return config.New(
config.WithDebugAddr(os.Getenv("ANYTYPE_DEBUG_ADDR")),
config.WithNewAccount(newAccount),
config.WithCreateBuiltinTemplates(createBuiltinTemplates),
)
}
@ -166,49 +164,18 @@ func Bootstrap(a *app.App, components ...app.Component) {
for _, c := range components {
a.Register(c)
}
walletService := a.Component(wallet.CName).(wallet.Wallet)
eventService := a.Component(event.CName).(event.Sender)
cfg := a.Component(config.CName).(*config.Config)
tempDirService := core.NewTempDirService(walletService)
spaceService := space.New()
sbtProvider := typeprovider.New(spaceService)
objectStore := objectstore.New(sbtProvider)
objectCreator := objectcreator.NewCreator(sbtProvider)
layoutConverter := converter.NewLayoutConverter(objectStore, sbtProvider)
blockService := block.New(tempDirService, sbtProvider, layoutConverter)
collectionService := collection.New(blockService, objectStore, objectCreator, blockService)
relationService := relation.New()
coreService := core.New()
graphRenderer := objectgraph.NewBuilder(sbtProvider, relationService, objectStore, coreService)
fileSyncService := filesync.New(eventService.Send)
fileStore := filestore.New()
datastoreProvider := clientds.New()
nodeConf := nodeconf.New()
const fileWatcherUpdateInterval = 5 * time.Second
syncStatusService := syncstatus.New(
sbtProvider,
datastoreProvider,
spaceService,
coreService,
fileSyncService,
nodeConf,
fileStore,
blockService,
cfg,
eventService.Send,
fileWatcherUpdateInterval,
)
fileSyncService.OnUpload(syncStatusService.OnFileUpload)
fileService := files.New(syncStatusService, objectStore)
indexerService := indexer.New(blockService, spaceService, fileService)
a.Register(datastoreProvider).
a.
// Data storages
Register(clientds.New()).
Register(ftsearch.New()).
Register(objectstore.New()).
// Services
Register(nodeconfsource.New()).
Register(nodeconfstore.New()).
Register(nodeConf).
Register(nodeconf.New()).
Register(peerstore.New()).
Register(syncstatusprovider.New()).
Register(storage.New()).
@ -225,45 +192,45 @@ func Bootstrap(a *app.App, components ...app.Component) {
Register(credentialprovider.New()).
Register(commonspace.New()).
Register(rpcstore.New()).
Register(spaceService).
Register(fileStore).
Register(space.New()).
Register(filestore.New()).
Register(fileservice.New()).
Register(filestorage.New(eventService.Send)).
Register(fileSyncService).
Register(filestorage.New()).
Register(filesync.New()).
Register(localdiscovery.New()).
Register(peermanager.New()).
Register(sbtProvider).
Register(relationService).
Register(ftsearch.New()).
Register(objectStore).
Register(typeprovider.New()).
Register(relation.New()).
Register(converter.NewLayoutConverter()).
Register(recordsbatcher.New()).
Register(fileService).
Register(files.New()).
Register(configfetcher.New()).
Register(process.New()).
Register(source.New()).
Register(coreService).
Register(core.New()).
Register(core.NewTempDirService()).
Register(builtintemplate.New()).
Register(blockService).
Register(indexerService).
Register(syncStatusService).
Register(block.New()).
Register(indexer.New()).
Register(syncstatus.New(fileWatcherUpdateInterval)).
Register(history.New()).
Register(gateway.New()).
Register(export.New(sbtProvider)).
Register(export.New()).
Register(linkpreview.New()).
Register(unsplash.New(tempDirService)).
Register(restriction.New(sbtProvider, objectStore)).
Register(unsplash.New()).
Register(restriction.New()).
Register(debug.New()).
Register(collectionService).
Register(subscription.New(collectionService, sbtProvider)).
Register(builtinobjects.New(tempDirService)).
Register(bookmark.New(tempDirService)).
Register(collection.New()).
Register(subscription.New()).
Register(builtinobjects.New()).
Register(bookmark.New()).
Register(session.New()).
Register(importer.New(tempDirService, sbtProvider)).
Register(importer.New()).
Register(decorator.New()).
Register(objectCreator).
Register(objectcreator.NewCreator()).
Register(kanban.New()).
Register(editor.NewObjectFactory(tempDirService, sbtProvider, layoutConverter)).
Register(graphRenderer)
Register(editor.NewObjectFactory()).
Register(objectgraph.NewBuilder())
}
func MiddlewareVersion() string {

View file

@ -44,10 +44,10 @@ type ConfigRequired struct {
}
type Config struct {
ConfigRequired `json:",inline"`
NewAccount bool `ignored:"true"` // set to true if a new account is creating. This option controls whether mw should wait for the existing data to arrive before creating the new log
Offline bool
DisableThreadsSyncEvents bool
ConfigRequired `json:",inline"`
NewAccount bool `ignored:"true"` // set to true if a new account is creating. This option controls whether mw should wait for the existing data to arrive before creating the new log
DisableThreadsSyncEvents bool
DontStartLocalNetworkSyncAutomatically bool
RepoPath string
AnalyticsId string
@ -55,10 +55,9 @@ type Config struct {
DebugAddr string
LocalServerAddr string
DS clientds.Config
FS FSConfig
DisableFileConfig bool `ignored:"true"` // set in order to skip reading/writing config from/to file
CreateBuiltinTemplates bool
DS clientds.Config
FS FSConfig
DisableFileConfig bool `ignored:"true"` // set in order to skip reading/writing config from/to file
}
type FSConfig struct {
@ -75,8 +74,6 @@ const (
)
var DefaultConfig = Config{
Offline: false,
LocalServerAddr: ":0",
DS: clientds.DefaultConfig,
}
@ -96,17 +93,15 @@ func WithDebugAddr(addr string) func(*Config) {
}
}
func WithLocalServer(addr string) func(*Config) {
func WithDisabledLocalNetworkSync() func(*Config) {
return func(c *Config) {
c.LocalServerAddr = addr
c.DontStartLocalNetworkSyncAutomatically = true
}
}
// WithCreateBuiltinTemplates flag had wrong meaning and is no longer used
// deprecated
func WithCreateBuiltinTemplates(createBuiltinTemplates bool) func(*Config) {
func WithLocalServer(addr string) func(*Config) {
return func(c *Config) {
c.CreateBuiltinTemplates = createBuiltinTemplates
c.LocalServerAddr = addr
}
}

View file

@ -3,105 +3,126 @@ nodes:
- peerId: 12D3KooWCywWYgfDZmamJxvWKAvMT5AYDdRG8MMhCpYLHjW8aX7K
addresses:
- prod-any-sync-node1.toolpad.org:443
- prod-any-sync-node1.toolpad.org:1443
types:
- tree
- peerId: 12D3KooWKtaDnWNAb6DHHZBCEyB3tEQjLTcRFUSpRsjeSRq34Sgp
addresses:
- prod-any-sync-node2.toolpad.org:443
- prod-any-sync-node2.toolpad.org:1443
types:
- tree
- peerId: 12D3KooWHBN58eZ9RAt3qhoSECtScJtwwugtQhumPC2KqfuuHFx2
addresses:
- prod-any-sync-node3.toolpad.org:443
- prod-any-sync-node3.toolpad.org:1443
types:
- tree
- peerId: 12D3KooWAxCweKe8aZV6UGXYYXo9Q6W1gF7h7zhpD4FVpEqYXxts
addresses:
- prod-any-sync-node4.toolpad.org:443
- prod-any-sync-node4.toolpad.org:1443
types:
- tree
- peerId: 12D3KooWSrpbLQcX9teCjc29FEZByFVgMufY3UetwEfLLGyZk9ta
addresses:
- prod-any-sync-node5.toolpad.org:443
- prod-any-sync-node5.toolpad.org:1443
types:
- tree
- peerId: 12D3KooWMs2Vom8ukyAU7NBMm49UVXQnA7oVwo9kUFhgqdCdwSYe
addresses:
- prod-any-sync-node6.toolpad.org:443
- prod-any-sync-node6.toolpad.org:1443
types:
- tree
- peerId: 12D3KooWNgyZ4yDBZfpoiT7ijbSQfsYHBVq3cZ6hKC1na4Ybq7QE
addresses:
- prod-any-sync-node7.toolpad.org:443
- prod-any-sync-node7.toolpad.org:1443
types:
- tree
- peerId: 12D3KooWQi2Avyc8NmZJBJXK62Ux9ZeTyXy86nxF5S25jfXfmfEo
addresses:
- prod-any-sync-node8.toolpad.org:443
- prod-any-sync-node8.toolpad.org:1443
types:
- tree
- peerId: 12D3KooWLNJbA9gUwccuhxyWvn2uyrNUt7AHYCaQV5FWTq6Ss7AR
addresses:
- prod-any-sync-node9.toolpad.org:443
- prod-any-sync-node9.toolpad.org:1443
types:
- tree
- peerId: 12D3KooWMdKkq7SjrBMAqHXprtrbg86JudGUyf1Nk9WQQzKsWonJ
addresses:
- prod-any-sync-node10.toolpad.org:443
- prod-any-sync-node10.toolpad.org:1443
types:
- tree
- peerId: 12D3KooWMRghjHoSh3biVythJuChAQ6PddYvXjd1dR2H46jUXMtU
addresses:
- prod-any-sync-node11.toolpad.org:443
- prod-any-sync-node11.toolpad.org:1443
types:
- tree
- peerId: 12D3KooWC69WV4sU31YesYLuFovP92PS8LZkqLbJAmxCEb28UyCo
addresses:
- prod-any-sync-node12.toolpad.org:443
- prod-any-sync-node12.toolpad.org:1443
types:
- tree
- peerId: 12D3KooWG7R2VEmeUoyh8vtHUNp6cmKdih7K31a6vDT8BHezgQ1b
addresses:
- prod-any-sync-node13.toolpad.org:443
- prod-any-sync-node13.toolpad.org:1443
types:
- tree
- peerId: 12D3KooWD27VZCngpb5QeGyHJFUCDoQpgePTbvnmEsZYZxknmrpK
addresses:
- prod-any-sync-node14.toolpad.org:443
- prod-any-sync-node14.toolpad.org:1443
types:
- tree
- peerId: 12D3KooWEGtP8w6CtqGFi597i5HToSm8XFTBiK51NJrjLAUAfdZx
addresses:
- prod-any-sync-node15.toolpad.org:443
- prod-any-sync-node15.toolpad.org:1443
types:
- tree
- peerId: 12D3KooWBk6PrHAVFLV4zbWFVUjX9MGomVhvcQdGg3UFWz24pBPY
addresses:
- prod-any-sync-filenode1.toolpad.org:443
- prod-any-sync-filenode1.toolpad.org:1443
types:
- file
- peerId: 12D3KooWLfWd1B7XmEGThYVMtBi3Vcy1Qsa6YckAivbdHSiwnV6b
addresses:
- prod-any-sync-filenode2.toolpad.org:443
- prod-any-sync-filenode2.toolpad.org:1443
types:
- file
- peerId: 12D3KooW9wrLnc3SeBt33LZDKsPeWRy82a5VqM23LxLqtrc4so45
addresses:
- prod-any-sync-filenode3.toolpad.org:443
- prod-any-sync-filenode3.toolpad.org:1443
types:
- file
- peerId: 12D3KooWKStBu7tNGumsNp2AnRWsm1XmcnWjZpcc6pKVrhG17sGc
addresses:
- prod-any-sync-coordinator1.toolpad.org:443
- prod-any-sync-coordinator1.toolpad.org:1443
types:
- coordinator
- peerId: 12D3KooWDWktnygiEzZHqWhjQXoaKqR2KVqJJwrn6AfXHy2BHJqd
addresses:
- prod-any-sync-coordinator2.toolpad.org:443
- prod-any-sync-coordinator2.toolpad.org:1443
types:
- coordinator
- peerId: 12D3KooWK6YnMBfMCQ442pTsW5WvFJDaEv4AzF2UTFWWUNEbENfL
addresses:
- prod-any-sync-coordinator3.toolpad.org:443
- prod-any-sync-coordinator3.toolpad.org:1443
types:
- coordinator
- coordinator

View file

@ -61,12 +61,12 @@ type service struct {
creator ObjectCreator
store objectstore.ObjectStore
linkPreview linkpreview.LinkPreview
tempDirService *core.TempDirService
tempDirService core.TempDirProvider
fileService files.Service
}
func New(tempDirService *core.TempDirService) Service {
return &service{tempDirService: tempDirService}
func New() Service {
return &service{}
}
func (s *service) Init(a *app.App) (err error) {
@ -75,6 +75,7 @@ func (s *service) Init(a *app.App) (err error) {
s.store = a.MustComponent(objectstore.CName).(objectstore.ObjectStore)
s.linkPreview = a.MustComponent(linkpreview.CName).(linkpreview.LinkPreview)
s.fileService = app.MustComponent[files.Service](a)
s.tempDirService = app.MustComponent[core.TempDirProvider](a)
return nil
}

View file

@ -29,37 +29,20 @@ type Service struct {
lock *sync.RWMutex
collections map[string]map[string]chan []string
picker block.Picker
objectStore objectstore.ObjectStore
objectCreator ObjectCreator
objectDeleter ObjectDeleter
picker block.Picker
objectStore objectstore.ObjectStore
}
type ObjectCreator interface {
CreateObject(req block.DetailsGetter, forcedType bundle.TypeKey) (id string, details *types.Struct, err error)
}
type ObjectDeleter interface {
DeleteObject(id string) (err error)
}
func New(
picker block.Picker,
store objectstore.ObjectStore,
objectCreator ObjectCreator,
objectDeleter ObjectDeleter,
) *Service {
func New() *Service {
return &Service{
picker: picker,
objectStore: store,
objectCreator: objectCreator,
objectDeleter: objectDeleter,
lock: &sync.RWMutex{},
collections: map[string]map[string]chan []string{},
lock: &sync.RWMutex{},
collections: map[string]map[string]chan []string{},
}
}
func (s *Service) Init(a *app.App) (err error) {
s.picker = app.MustComponent[block.Picker](a)
s.objectStore = app.MustComponent[objectstore.ObjectStore](a)
return nil
}
@ -220,7 +203,10 @@ func (s *Service) ObjectToCollection(id string) error {
return fmt.Errorf("invalid smartblock impmlementation: %T", b)
}
st := b.NewState()
commonOperations.SetLayoutInState(st, model.ObjectType_collection)
err := commonOperations.SetLayoutInStateAndIgnoreRestriction(st, model.ObjectType_collection)
if err != nil {
return fmt.Errorf("set layout: %w", err)
}
st.SetObjectType(bundle.TypeKeyCollection.URL())
flags := internalflag.NewFromState(st)
flags.Remove(model.InternalFlag_editorSelectType)

View file

@ -8,9 +8,11 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/anytype-heart/core/block/editor/smartblock"
"github.com/anyproto/anytype-heart/core/block/editor/smartblock/smarttest"
"github.com/anyproto/anytype-heart/core/block/editor/template"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore/mock_objectstore"
)
type testPicker struct {
@ -21,12 +23,35 @@ func (t *testPicker) PickBlock(ctx context.Context, id string) (sb smartblock.Sm
return t.sb, nil
}
func (t *testPicker) Init(a *app.App) error { return nil }
func (t *testPicker) Name() string { return "" }
type fixture struct {
picker *testPicker
*Service
}
func newFixture(t *testing.T) *fixture {
picker := &testPicker{}
a := &app.App{}
objectStore := mock_objectstore.NewMockObjectStore(t)
objectStore.EXPECT().Name().Return("objectStore")
a.Register(picker)
a.Register(objectStore)
s := New()
err := s.Init(a)
require.NoError(t, err)
return &fixture{picker: picker, Service: s}
}
func TestBroadcast(t *testing.T) {
const collectionID = "collectionID"
sb := smarttest.New(collectionID)
picker := &testPicker{sb: sb}
s := New(picker, nil, nil, nil)
s := newFixture(t)
s.picker.sb = sb
_, subCh1, err := s.SubscribeForCollection(collectionID, "sub1")
require.NoError(t, err)

View file

@ -158,7 +158,10 @@ func (s *Service) ObjectToSet(id string, source []string) error {
}
st := b.NewState()
st.SetDetail(bundle.RelationKeySetOf.String(), pbtypes.StringList(source))
commonOperations.SetLayoutInState(st, model.ObjectType_set)
err := commonOperations.SetLayoutInStateAndIgnoreRestriction(st, model.ObjectType_set)
if err != nil {
return fmt.Errorf("set layout: %w", err)
}
st.SetObjectType(bundle.TypeKeySet.URL())
flags := internalflag.NewFromState(st)
flags.Remove(model.InternalFlag_editorSelectType)

View file

@ -57,6 +57,7 @@ type CommonOperations interface {
SetObjectTypesInState(s *state.State, objectTypes []string) (err error)
SetLayout(ctx *session.Context, layout model.ObjectTypeLayout) (err error)
SetLayoutInState(s *state.State, layout model.ObjectTypeLayout) (err error)
SetLayoutInStateAndIgnoreRestriction(s *state.State, toLayout model.ObjectTypeLayout) (err error)
}
type DetailsSettable interface {

View file

@ -38,7 +38,7 @@ func TestBasic_Create(t *testing.T) {
t.Run("generic", func(t *testing.T) {
sb := smarttest.New("test")
sb.AddBlock(simple.New(&model.Block{Id: "test"}))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
st := sb.NewState()
id, err := b.CreateBlock(st, pb.RpcBlockCreateRequest{
Block: &model.Block{Content: &model.BlockContentOfText{Text: &model.BlockContentText{Text: "ll"}}},
@ -52,7 +52,7 @@ func TestBasic_Create(t *testing.T) {
sb := smarttest.New("test")
sb.AddBlock(simple.New(&model.Block{Id: "test"}))
require.NoError(t, smartblock.ObjectApplyTemplate(sb, sb.NewState(), template.WithTitle))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
s := sb.NewState()
id, err := b.CreateBlock(s, pb.RpcBlockCreateRequest{
TargetId: template.TitleBlockId,
@ -73,7 +73,7 @@ func TestBasic_Create(t *testing.T) {
}
sb.AddBlock(simple.New(&model.Block{Id: "test"}))
require.NoError(t, smartblock.ObjectApplyTemplate(sb, sb.NewState(), template.WithTitle))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
_, err := b.CreateBlock(sb.NewState(), pb.RpcBlockCreateRequest{})
assert.ErrorIs(t, err, restriction.ErrRestricted)
})
@ -86,7 +86,7 @@ func TestBasic_Duplicate(t *testing.T) {
AddBlock(simple.New(&model.Block{Id: "3"}))
st := sb.NewState()
newIds, err := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil)).Duplicate(st, st, "", 0, []string{"2"})
newIds, err := NewBasic(sb, nil, nil, converter.NewLayoutConverter()).Duplicate(st, st, "", 0, []string{"2"})
require.NoError(t, err)
err = sb.Apply(st)
@ -105,7 +105,7 @@ func TestBasic_Unlink(t *testing.T) {
AddBlock(simple.New(&model.Block{Id: "2", ChildrenIds: []string{"3"}})).
AddBlock(simple.New(&model.Block{Id: "3"}))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
err := b.Unlink(nil, "2")
require.NoError(t, err)
@ -119,7 +119,7 @@ func TestBasic_Unlink(t *testing.T) {
AddBlock(simple.New(&model.Block{Id: "2", ChildrenIds: []string{"3"}})).
AddBlock(simple.New(&model.Block{Id: "3"}))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
err := b.Unlink(nil, "2", "3")
require.NoError(t, err)
@ -136,7 +136,7 @@ func TestBasic_Move(t *testing.T) {
AddBlock(simple.New(&model.Block{Id: "3"})).
AddBlock(simple.New(&model.Block{Id: "4"}))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
st := sb.NewState()
err := b.Move(st, st, "4", model.Block_Inner, []string{"3"})
@ -150,7 +150,7 @@ func TestBasic_Move(t *testing.T) {
sb := smarttest.New("test")
sb.AddBlock(simple.New(&model.Block{Id: "test"}))
require.NoError(t, smartblock.ObjectApplyTemplate(sb, sb.NewState(), template.WithTitle))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
s := sb.NewState()
id1, err := b.CreateBlock(s, pb.RpcBlockCreateRequest{
TargetId: template.HeaderLayoutId,
@ -180,7 +180,7 @@ func TestBasic_Move(t *testing.T) {
AddBlock(newTextBlock("1", "", nil)).
AddBlock(newTextBlock("2", "one", nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
st := sb.NewState()
err := b.Move(st, st, "1", model.Block_InnerFirst, []string{"2"})
require.NoError(t, err)
@ -200,7 +200,7 @@ func TestBasic_Move(t *testing.T) {
AddBlock(firstBlock).
AddBlock(secondBlock)
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
st := sb.NewState()
err := b.Move(st, st, "1", model.Block_InnerFirst, []string{"2"})
require.NoError(t, err)
@ -214,7 +214,7 @@ func TestBasic_Move(t *testing.T) {
AddBlock(newTextBlock("1", "", nil)).
AddBlock(newTextBlock("2", "one", nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
st := sb.NewState()
err := b.Move(st, nil, "1", model.Block_Top, []string{"2"})
require.NoError(t, err)
@ -234,7 +234,7 @@ func TestBasic_MoveToAnotherObject(t *testing.T) {
sb2 := smarttest.New("test2")
sb2.AddBlock(simple.New(&model.Block{Id: "test2", ChildrenIds: []string{}}))
b := NewBasic(sb1, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb1, nil, nil, converter.NewLayoutConverter())
srcState := sb1.NewState()
destState := sb2.NewState()
@ -269,7 +269,7 @@ func TestBasic_Replace(t *testing.T) {
sb := smarttest.New("test")
sb.AddBlock(simple.New(&model.Block{Id: "test", ChildrenIds: []string{"2"}})).
AddBlock(simple.New(&model.Block{Id: "2"}))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
newId, err := b.Replace(nil, "2", &model.Block{Content: &model.BlockContentOfText{Text: &model.BlockContentText{Text: "l"}}})
require.NoError(t, err)
require.NotEmpty(t, newId)
@ -279,7 +279,7 @@ func TestBasic_SetFields(t *testing.T) {
sb := smarttest.New("test")
sb.AddBlock(simple.New(&model.Block{Id: "test", ChildrenIds: []string{"2"}})).
AddBlock(simple.New(&model.Block{Id: "2"}))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
fields := &types.Struct{
Fields: map[string]*types.Value{
@ -298,7 +298,7 @@ func TestBasic_Update(t *testing.T) {
sb := smarttest.New("test")
sb.AddBlock(simple.New(&model.Block{Id: "test", ChildrenIds: []string{"2"}})).
AddBlock(simple.New(&model.Block{Id: "2"}))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
err := b.Update(nil, func(b simple.Block) error {
b.Model().BackgroundColor = "test"
@ -312,7 +312,7 @@ func TestBasic_SetDivStyle(t *testing.T) {
sb := smarttest.New("test")
sb.AddBlock(simple.New(&model.Block{Id: "test", ChildrenIds: []string{"2"}})).
AddBlock(simple.New(&model.Block{Id: "2", Content: &model.BlockContentOfDiv{Div: &model.BlockContentDiv{}}}))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
err := b.SetDivStyle(nil, model.BlockContentDiv_Dots, "2")
require.NoError(t, err)
@ -323,7 +323,7 @@ func TestBasic_SetDivStyle(t *testing.T) {
func TestBasic_PasteBlocks(t *testing.T) {
sb := smarttest.New("test")
sb.AddBlock(simple.New(&model.Block{Id: "test"}))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
s := sb.NewState()
err := b.PasteBlocks(s, "", model.Block_Inner, []simple.Block{
simple.New(&model.Block{Id: "1", ChildrenIds: []string{"1.1"}}),
@ -350,7 +350,7 @@ func TestBasic_SetRelationKey(t *testing.T) {
t.Run("correct", func(t *testing.T) {
sb := smarttest.New("test")
fillSb(sb)
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
err := b.SetRelationKey(nil, pb.RpcBlockRelationSetKeyRequest{
BlockId: "2",
Key: "testRelKey",
@ -372,7 +372,7 @@ func TestBasic_SetRelationKey(t *testing.T) {
t.Run("not relation block", func(t *testing.T) {
sb := smarttest.New("test")
fillSb(sb)
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
require.Error(t, b.SetRelationKey(nil, pb.RpcBlockRelationSetKeyRequest{
BlockId: "1",
Key: "key",
@ -381,7 +381,7 @@ func TestBasic_SetRelationKey(t *testing.T) {
t.Run("relation not found", func(t *testing.T) {
sb := smarttest.New("test")
fillSb(sb)
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
require.Error(t, b.SetRelationKey(nil, pb.RpcBlockRelationSetKeyRequest{
BlockId: "2",
Key: "not exists",
@ -397,7 +397,7 @@ func TestBasic_FeaturedRelationAdd(t *testing.T) {
s.AddBundledRelations(bundle.RelationKeyDescription)
require.NoError(t, sb.Apply(s))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
newRel := []string{bundle.RelationKeyDescription.String(), bundle.RelationKeyName.String()}
require.NoError(t, b.FeaturedRelationAdd(nil, newRel...))
@ -413,7 +413,7 @@ func TestBasic_FeaturedRelationRemove(t *testing.T) {
template.WithDescription(s)
require.NoError(t, sb.Apply(s))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
require.NoError(t, b.FeaturedRelationRemove(nil, bundle.RelationKeyDescription.String()))
res := sb.NewState()
@ -450,7 +450,7 @@ func TestBasic_ReplaceLink(t *testing.T) {
}
require.NoError(t, sb.Apply(s))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter(nil, nil))
b := NewBasic(sb, nil, nil, converter.NewLayoutConverter())
require.NoError(t, b.ReplaceLink(oldId, newId))
res := sb.NewState()

View file

@ -218,6 +218,10 @@ func (bs *basic) SetLayoutInState(s *state.State, toLayout model.ObjectTypeLayou
return fmt.Errorf("layout change is restricted for object '%s': %v", bs.Id(), err)
}
return bs.SetLayoutInStateAndIgnoreRestriction(s, toLayout)
}
func (bs *basic) SetLayoutInStateAndIgnoreRestriction(s *state.State, toLayout model.ObjectTypeLayout) (err error) {
fromLayout, _ := s.Layout()
s.SetDetail(bundle.RelationKeyLayout.String(), pbtypes.Int64(int64(toLayout)))

View file

@ -190,7 +190,7 @@ func TestExtractObjects(t *testing.T) {
ObjectType: bundle.TypeKeyNote.URL(),
}
ctx := session.NewContext()
linkIds, err := NewBasic(sb, fixture.store, nil, converter.NewLayoutConverter(nil, nil)).ExtractBlocksToObjects(ctx, ts, req)
linkIds, err := NewBasic(sb, fixture.store, nil, converter.NewLayoutConverter()).ExtractBlocksToObjects(ctx, ts, req)
assert.NoError(t, err)
var gotBlockIds []string

View file

@ -6,6 +6,7 @@ import (
"golang.org/x/exp/slices"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/anytype-heart/core/block/editor/dataview"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/editor/template"
@ -22,19 +23,31 @@ import (
const DefaultSetSource = bundle.TypeKeyPage
type LayoutConverter struct {
type LayoutConverter interface {
Convert(st *state.State, fromLayout, toLayout model.ObjectTypeLayout) error
app.Component
}
type layoutConverter struct {
objectStore objectstore.ObjectStore
sbtProvider typeprovider.SmartBlockTypeProvider
}
func NewLayoutConverter(objectStore objectstore.ObjectStore, sbtProvider typeprovider.SmartBlockTypeProvider) LayoutConverter {
return LayoutConverter{
objectStore: objectStore,
sbtProvider: sbtProvider,
}
func NewLayoutConverter() LayoutConverter {
return &layoutConverter{}
}
func (c *LayoutConverter) Convert(st *state.State, fromLayout, toLayout model.ObjectTypeLayout) error {
func (c *layoutConverter) Init(a *app.App) error {
c.objectStore = app.MustComponent[objectstore.ObjectStore](a)
c.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
return nil
}
func (c *layoutConverter) Name() string {
return "layout-converter"
}
func (c *layoutConverter) Convert(st *state.State, fromLayout, toLayout model.ObjectTypeLayout) error {
if fromLayout == toLayout {
return nil
}
@ -78,7 +91,7 @@ func (c *LayoutConverter) Convert(st *state.State, fromLayout, toLayout model.Ob
return c.fromAnyToAny(st)
}
func (c *LayoutConverter) fromAnyToAny(st *state.State) error {
func (c *layoutConverter) fromAnyToAny(st *state.State) error {
template.InitTemplate(st,
template.WithTitle,
template.WithDescription,
@ -86,7 +99,7 @@ func (c *LayoutConverter) fromAnyToAny(st *state.State) error {
return nil
}
func (c *LayoutConverter) fromAnyToBookmark(st *state.State) error {
func (c *layoutConverter) fromAnyToBookmark(st *state.State) error {
template.InitTemplate(st,
template.WithTitle,
template.WithDescription,
@ -95,7 +108,7 @@ func (c *LayoutConverter) fromAnyToBookmark(st *state.State) error {
return nil
}
func (c *LayoutConverter) fromAnyToTodo(st *state.State) error {
func (c *layoutConverter) fromAnyToTodo(st *state.State) error {
if err := st.SetAlign(model.Block_AlignLeft); err != nil {
return err
}
@ -107,7 +120,7 @@ func (c *LayoutConverter) fromAnyToTodo(st *state.State) error {
return nil
}
func (c *LayoutConverter) fromNoteToSet(st *state.State) error {
func (c *layoutConverter) fromNoteToSet(st *state.State) error {
if err := c.fromNoteToAny(st); err != nil {
return err
}
@ -123,7 +136,7 @@ func (c *LayoutConverter) fromNoteToSet(st *state.State) error {
return nil
}
func (c *LayoutConverter) fromAnyToSet(st *state.State) error {
func (c *layoutConverter) fromAnyToSet(st *state.State) error {
source := pbtypes.GetStringList(st.Details(), bundle.RelationKeySetOf.String())
if len(source) == 0 {
source = []string{DefaultSetSource.URL()}
@ -147,7 +160,7 @@ func addFeaturedRelationSetOf(st *state.State) {
st.SetDetail(bundle.RelationKeyFeaturedRelations.String(), pbtypes.StringList(fr))
}
func (c *LayoutConverter) fromSetToCollection(st *state.State) error {
func (c *layoutConverter) fromSetToCollection(st *state.State) error {
dvBlock := st.Get(template.DataviewBlockId)
if dvBlock == nil {
return fmt.Errorf("dataview block is not found")
@ -167,7 +180,7 @@ func (c *LayoutConverter) fromSetToCollection(st *state.State) error {
return nil
}
func (c *LayoutConverter) listIDsFromSet(typesFromSet []string) ([]string, error) {
func (c *layoutConverter) listIDsFromSet(typesFromSet []string) ([]string, error) {
records, _, err := c.objectStore.Query(
nil,
database.Query{
@ -184,7 +197,7 @@ func (c *LayoutConverter) listIDsFromSet(typesFromSet []string) ([]string, error
return ids, nil
}
func (c *LayoutConverter) fromNoteToCollection(st *state.State) error {
func (c *layoutConverter) fromNoteToCollection(st *state.State) error {
if err := c.fromNoteToAny(st); err != nil {
return err
}
@ -197,13 +210,13 @@ func (c *LayoutConverter) fromNoteToCollection(st *state.State) error {
return c.fromAnyToCollection(st)
}
func (c *LayoutConverter) fromAnyToCollection(st *state.State) error {
func (c *layoutConverter) fromAnyToCollection(st *state.State) error {
blockContent := template.MakeCollectionDataviewContent()
template.InitTemplate(st, template.WithDataview(*blockContent, false))
return nil
}
func (c *LayoutConverter) fromNoteToAny(st *state.State) error {
func (c *layoutConverter) fromNoteToAny(st *state.State) error {
name, ok := st.Details().Fields[bundle.RelationKeyName.String()]
if !ok || name.GetStringValue() == "" {
@ -228,7 +241,7 @@ func (c *LayoutConverter) fromNoteToAny(st *state.State) error {
return nil
}
func (c *LayoutConverter) fromAnyToNote(st *state.State) error {
func (c *layoutConverter) fromAnyToNote(st *state.State) error {
template.InitTemplate(st,
template.WithNameToFirstBlock,
template.WithNoTitle,
@ -237,7 +250,7 @@ func (c *LayoutConverter) fromAnyToNote(st *state.State) error {
return nil
}
func (c *LayoutConverter) removeRelationSetOf(st *state.State) {
func (c *layoutConverter) removeRelationSetOf(st *state.State) {
st.RemoveDetail(bundle.RelationKeySetOf.String())
fr := pbtypes.GetStringList(st.Details(), bundle.RelationKeyFeaturedRelations.String())

View file

@ -46,16 +46,8 @@ type ObjectFactory struct {
subObjectFactory subObjectFactory
}
func NewObjectFactory(
tempDirProvider core.TempDirProvider,
sbtProvider typeprovider.SmartBlockTypeProvider,
layoutConverter converter.LayoutConverter,
) *ObjectFactory {
return &ObjectFactory{
tempDirProvider: tempDirProvider,
sbtProvider: sbtProvider,
layoutConverter: layoutConverter,
}
func NewObjectFactory() *ObjectFactory {
return &ObjectFactory{}
}
func (f *ObjectFactory) Init(a *app.App) (err error) {
@ -71,6 +63,9 @@ func (f *ObjectFactory) Init(a *app.App) (err error) {
f.templateCloner = app.MustComponent[templateCloner](a)
f.fileService = app.MustComponent[files.Service](a)
f.config = app.MustComponent[*config.Config](a)
f.tempDirProvider = app.MustComponent[core.TempDirProvider](a)
f.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
f.layoutConverter = app.MustComponent[converter.LayoutConverter](a)
f.subObjectFactory = subObjectFactory{
coreService: f.anytype,

View file

@ -9,9 +9,9 @@ import (
"testing"
"time"
"go.uber.org/mock/gomock"
"github.com/magiconair/properties/assert"
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
"github.com/anyproto/anytype-heart/core/block/editor/file"
"github.com/anyproto/anytype-heart/core/block/simple"
@ -165,7 +165,7 @@ func newFixture(t *testing.T) *uplFixture {
fx.fileService = testMock.NewMockFileService(fx.ctrl)
fx.blockService = NewMockBlockService(fx.ctrl)
fx.Uploader = file.NewUploader(fx.blockService, fx.fileService, core.NewTempDirService(nil))
fx.Uploader = file.NewUploader(fx.blockService, fx.fileService, core.NewTempDirService())
fx.file = testMock.NewMockFile(fx.ctrl)
fx.file.EXPECT().Hash().Return("123").AnyTimes()
return fx

View file

@ -4,12 +4,11 @@ import (
"context"
"testing"
"go.uber.org/mock/gomock"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/restriction"
"github.com/anyproto/anytype-heart/core/block/simple"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
@ -20,9 +19,12 @@ import (
"github.com/anyproto/anytype-heart/util/testMock/mockRelation"
"github.com/anyproto/anytype-heart/util/testMock/mockSource"
"github.com/anyproto/anytype-heart/core/block/restriction"
"github.com/anyproto/anytype-heart/core/block/restriction/mock_restriction"
_ "github.com/anyproto/anytype-heart/core/block/simple/base"
_ "github.com/anyproto/anytype-heart/core/block/simple/link"
_ "github.com/anyproto/anytype-heart/core/block/simple/text"
"github.com/stretchr/testify/mock"
)
func TestSmartBlock_Init(t *testing.T) {
@ -120,7 +122,8 @@ func newFixture(t *testing.T) *fixture {
indexer := NewMockIndexer(ctrl)
indexer.EXPECT().Name().Return("indexer").AnyTimes()
restrictionService := restriction.New(nil, objectStore)
restrictionService := mock_restriction.NewMockService(t)
restrictionService.EXPECT().GetRestrictions(mock.Anything).Return(restriction.Restrictions{})
relationService := mockRelation.NewMockService(ctrl)
fileService := testMock.NewMockFileService(ctrl)

View file

@ -53,24 +53,23 @@ type Export interface {
}
type export struct {
bs *block.Service
objectStore objectstore.ObjectStore
a core.Service
sbtProvider typeprovider.SmartBlockTypeProvider
fileService files.Service
blockService *block.Service
objectStore objectstore.ObjectStore
coreService core.Service
sbtProvider typeprovider.SmartBlockTypeProvider
fileService files.Service
}
func New(sbtProvider typeprovider.SmartBlockTypeProvider) Export {
return &export{
sbtProvider: sbtProvider,
}
func New() Export {
return &export{}
}
func (e *export) Init(a *app.App) (err error) {
e.bs = a.MustComponent(block.CName).(*block.Service)
e.a = a.MustComponent(core.CName).(core.Service)
e.blockService = a.MustComponent(block.CName).(*block.Service)
e.coreService = a.MustComponent(core.CName).(core.Service)
e.objectStore = a.MustComponent(objectstore.CName).(objectstore.ObjectStore)
e.fileService = app.MustComponent[files.Service](a)
e.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
return
}
@ -79,7 +78,7 @@ func (e *export) Name() (name string) {
}
func (e *export) Export(req pb.RpcObjectListExportRequest) (path string, succeed int, err error) {
queue := e.bs.Process().NewQueue(pb.ModelProcess{
queue := e.blockService.Process().NewQueue(pb.ModelProcess{
Id: bson.NewObjectId().Hex(),
Type: pb.ModelProcess_Export,
State: 0,
@ -278,7 +277,7 @@ func (e *export) writeMultiDoc(mw converter.MultiConverter, wr writer, docs map[
for did := range docs {
if err = queue.Wait(func() {
log.With("objectID", did).Debugf("write doc")
werr := e.bs.Do(did, func(b sb.SmartBlock) error {
werr := e.blockService.Do(did, func(b sb.SmartBlock) error {
if err = mw.Add(b.NewState().Copy()); err != nil {
return err
}
@ -312,14 +311,14 @@ func (e *export) writeMultiDoc(mw converter.MultiConverter, wr writer, docs map[
}
func (e *export) writeDoc(format pb.RpcObjectListExportFormat, wr writer, docInfo map[string]*types.Struct, queue process.Queue, docID string, exportFiles, isJSON bool) (err error) {
return e.bs.Do(docID, func(b sb.SmartBlock) error {
return e.blockService.Do(docID, func(b sb.SmartBlock) error {
if pbtypes.GetBool(b.CombinedDetails(), bundle.RelationKeyIsDeleted.String()) {
return nil
}
var conv converter.Converter
switch format {
case pb.RpcObjectListExport_Markdown:
conv = md.NewMDConverter(e.a, b.NewState(), wr.Namer())
conv = md.NewMDConverter(e.coreService, b.NewState(), wr.Namer())
case pb.RpcObjectListExport_Protobuf:
conv = pbc.NewConverter(b, isJSON)
case pb.RpcObjectListExport_JSON:
@ -336,7 +335,7 @@ func (e *export) writeDoc(format pb.RpcObjectListExportFormat, wr writer, docInf
}
filename = wr.Namer().Get("", docID, name, conv.Ext())
}
if docID == e.a.PredefinedBlocks().Home {
if docID == e.coreService.PredefinedBlocks().Home {
filename = "index" + conv.Ext()
}
if err = wr.WriteFile(filename, bytes.NewReader(result)); err != nil {
@ -390,18 +389,18 @@ func (e *export) saveFile(wr writer, hash string) (err error) {
func (e *export) createProfileFile(wr writer) error {
var spaceDashBoardID string
pr, err := e.a.LocalProfile()
pr, err := e.coreService.LocalProfile()
if err != nil {
return err
}
err = e.bs.Do(e.a.PredefinedBlocks().Account, func(b sb.SmartBlock) error {
err = e.blockService.Do(e.coreService.PredefinedBlocks().Account, func(b sb.SmartBlock) error {
spaceDashBoardID = pbtypes.GetString(b.CombinedDetails(), bundle.RelationKeySpaceDashboardId.String())
return nil
})
if err != nil {
return err
}
profileID := e.a.ProfileID()
profileID := e.coreService.ProfileID()
profile := &pb.Profile{
SpaceDashboardId: spaceDashBoardID,
Address: pr.AccountAddr,

View file

@ -93,6 +93,9 @@ func handleDataviewBlock(block simple.Block, oldIDtoNew map[string]string, st *s
updateRelationID(block.(dataview.Block), relation, view, newID)
}
}
if view.DefaultTemplateId != "" {
view.DefaultTemplateId = oldIDtoNew[view.DefaultTemplateId]
}
}
for _, group := range dataView.GetGroupOrders() {
for _, vg := range group.ViewGroups {

View file

@ -3,6 +3,7 @@ package importer
import (
"context"
"fmt"
"strings"
"time"
"github.com/anyproto/any-sync/app"
@ -31,6 +32,7 @@ import (
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/pkg/lib/core"
sb "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/addr"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/filestore"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore"
"github.com/anyproto/anytype-heart/pkg/lib/logging"
@ -53,14 +55,9 @@ type Import struct {
sbtProvider typeprovider.SmartBlockTypeProvider
}
func New(
tempDirProvider core.TempDirProvider,
sbtProvider typeprovider.SmartBlockTypeProvider,
) Importer {
func New() Importer {
return &Import{
tempDirProvider: tempDirProvider,
sbtProvider: sbtProvider,
converters: make(map[string]converter.Converter, 0),
converters: make(map[string]converter.Converter, 0),
}
}
@ -88,6 +85,8 @@ func (i *Import) Init(a *app.App) (err error) {
fileStore := app.MustComponent[filestore.FileStore](a)
relationSyncer := syncer.NewFileRelationSyncer(i.s, fileStore)
i.oc = NewCreator(i.s, objCreator, coreService, factory, store, relationSyncer, fileStore)
i.tempDirProvider = app.MustComponent[core.TempDirProvider](a)
i.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
return nil
}
@ -282,6 +281,7 @@ func (i *Import) getIDForAllObjects(ctx *session.Context, res *converter.Respons
}
}
for _, option := range relationOptions {
i.replaceRelationKeyWithNew(option, oldIDToNew)
err := i.getObjectID(ctx, option, createPayloads, oldIDToNew, req.UpdateExistingObjects)
if err != nil {
allErrors.Add(err)
@ -294,6 +294,18 @@ func (i *Import) getIDForAllObjects(ctx *session.Context, res *converter.Respons
return oldIDToNew, createPayloads, nil
}
func (i *Import) replaceRelationKeyWithNew(option *converter.Snapshot, oldIDToNew map[string]string) {
if option.Snapshot.Data.Details == nil || len(option.Snapshot.Data.Details.Fields) == 0 {
return
}
key := pbtypes.GetString(option.Snapshot.Data.Details, bundle.RelationKeyRelationKey.String())
relationID := addr.RelationKeyToIdPrefix + key
if newRelationID, ok := oldIDToNew[relationID]; ok {
key = strings.TrimPrefix(newRelationID, addr.RelationKeyToIdPrefix)
}
option.Snapshot.Data.Details.Fields[bundle.RelationKeyRelationKey.String()] = pbtypes.String(key)
}
func (i *Import) getObjectID(ctx *session.Context,
snapshot *converter.Snapshot,
createPayloads map[string]treestorage.TreeStorageCreatePayload,

View file

@ -4,18 +4,22 @@ import (
"fmt"
"testing"
"github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
"go.uber.org/mock/gomock"
"github.com/gogo/protobuf/types"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
"go.uber.org/mock/gomock"
"github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
cv "github.com/anyproto/anytype-heart/core/block/import/converter"
pbc "github.com/anyproto/anytype-heart/core/block/import/pb"
"github.com/anyproto/anytype-heart/core/block/import/web"
"github.com/anyproto/anytype-heart/core/block/import/web/parsers"
"github.com/anyproto/anytype-heart/core/session"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/pkg/lib/core/smartblock"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/util/pbtypes"
)
func Test_ImportSuccess(t *testing.T) {
@ -606,3 +610,72 @@ func Test_ImportErrLimitExceededIgnoreErrorMode(t *testing.T) {
assert.NotNil(t, res)
assert.True(t, errors.Is(res, cv.ErrLimitExceeded))
}
func TestImport_replaceRelationKeyWithNew(t *testing.T) {
t.Run("no matching relation id in oldIDToNew map", func(t *testing.T) {
// given
i := Import{}
option := &cv.Snapshot{
Snapshot: &pb.ChangeSnapshot{
Data: &model.SmartBlockSnapshotBase{
Details: &types.Struct{
Fields: map[string]*types.Value{
bundle.RelationKeyRelationKey.String(): pbtypes.String("key"),
},
},
},
},
SbType: smartblock.SmartBlockTypeSubObject,
}
oldIDToNew := make(map[string]string, 0)
//when
i.replaceRelationKeyWithNew(option, oldIDToNew)
// then
assert.Equal(t, "key", pbtypes.GetString(option.Snapshot.Data.Details, bundle.RelationKeyRelationKey.String()))
})
t.Run("oldIDToNew map have relation id", func(t *testing.T) {
// given
i := Import{}
option := &cv.Snapshot{
Snapshot: &pb.ChangeSnapshot{
Data: &model.SmartBlockSnapshotBase{
Details: &types.Struct{
Fields: map[string]*types.Value{
bundle.RelationKeyRelationKey.String(): pbtypes.String("key"),
},
},
},
},
SbType: smartblock.SmartBlockTypeSubObject,
}
oldIDToNew := map[string]string{"rel-key": "rel-newkey"}
//when
i.replaceRelationKeyWithNew(option, oldIDToNew)
// then
assert.Equal(t, "newkey", pbtypes.GetString(option.Snapshot.Data.Details, bundle.RelationKeyRelationKey.String()))
})
t.Run("no details", func(t *testing.T) {
// given
i := Import{}
option := &cv.Snapshot{
Snapshot: &pb.ChangeSnapshot{
Data: &model.SmartBlockSnapshotBase{
Details: nil,
},
},
SbType: smartblock.SmartBlockTypeSubObject,
}
oldIDToNew := map[string]string{"rel-key": "rel-newkey"}
//when
i.replaceRelationKeyWithNew(option, oldIDToNew)
// then
assert.Nil(t, option.Snapshot.Data.Details)
})
}

View file

@ -202,10 +202,6 @@ func (ou *ObjectIDGetter) getExistingRelation(snapshot *converter.Snapshot, ids
func (ou *ObjectIDGetter) getExistingRelationOption(snapshot *converter.Snapshot, ids []string, oldToNewIDs map[string]string) ([]string, error) {
name := pbtypes.GetString(snapshot.Snapshot.Data.Details, bundle.RelationKeyName.String())
key := pbtypes.GetString(snapshot.Snapshot.Data.Details, bundle.RelationKeyRelationKey.String())
relationID := addr.RelationKeyToIdPrefix + key
if newRelationID, ok := oldToNewIDs[relationID]; ok {
key = strings.TrimPrefix(newRelationID, addr.RelationKeyToIdPrefix)
}
ids, _, err := ou.objectStore.QueryObjectIDs(database.Query{
Filters: []*model.BlockContentDataviewFilter{
{

View file

@ -59,21 +59,18 @@ type Creator struct {
creator Service //nolint:unused
// TODO: remove it?
anytype core.Service
coreService core.Service
}
type CollectionService interface {
CreateCollection(details *types.Struct, flags []*model.InternalFlag) (coresb.SmartBlockType, *types.Struct, *state.State, error)
}
func NewCreator(sbtProvider typeprovider.SmartBlockTypeProvider) *Creator {
return &Creator{
sbtProvider: sbtProvider,
}
func NewCreator() *Creator {
return &Creator{}
}
func (c *Creator) Init(a *app.App) (err error) {
c.anytype = a.MustComponent(core.CName).(core.Service)
c.blockService = a.MustComponent(block.CName).(BlockService)
c.blockPicker = a.MustComponent(block.CName).(block.Picker)
c.objectStore = a.MustComponent(objectstore.CName).(objectstore.ObjectStore)
@ -81,7 +78,8 @@ func (c *Creator) Init(a *app.App) (err error) {
c.bookmark = a.MustComponent(bookmark.CName).(bookmark.Service)
c.objectFactory = app.MustComponent[*editor.ObjectFactory](a)
c.collectionService = app.MustComponent[CollectionService](a)
c.anytype = a.MustComponent(core.CName).(core.Service)
c.coreService = app.MustComponent[core.Service](a)
c.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
c.app = a
return nil
}
@ -154,14 +152,14 @@ func (c *Creator) CreateSmartBlockFromState(ctx context.Context, sbType coresb.S
// if we don't have anything in details then check the object store
if workspaceID == "" {
workspaceID = c.anytype.PredefinedBlocks().Account
workspaceID = c.coreService.PredefinedBlocks().Account
}
if workspaceID != "" {
createState.SetDetailAndBundledRelation(bundle.RelationKeyWorkspaceId, pbtypes.String(workspaceID))
}
createState.SetDetailAndBundledRelation(bundle.RelationKeyCreatedDate, pbtypes.Int64(time.Now().Unix()))
createState.SetDetailAndBundledRelation(bundle.RelationKeyCreator, pbtypes.String(c.anytype.ProfileID()))
createState.SetDetailAndBundledRelation(bundle.RelationKeyCreator, pbtypes.String(c.coreService.ProfileID()))
ev := &metrics.CreateObjectEvent{
SetDetailsMs: time.Since(startTime).Milliseconds(),
@ -194,7 +192,7 @@ func (c *Creator) CreateSmartBlockFromState(ctx context.Context, sbType coresb.S
}
func (c *Creator) InjectWorkspaceID(details *types.Struct, objectID string) {
workspaceID, err := c.anytype.GetWorkspaceIdForObject(objectID)
workspaceID, err := c.coreService.GetWorkspaceIdForObject(objectID)
if err != nil {
workspaceID = ""
}
@ -265,7 +263,7 @@ func (c *Creator) CreateSubObjectInWorkspace(details *types.Struct, workspaceID
// TODO: it must be in another component
func (c *Creator) CreateSubObjectsInWorkspace(details []*types.Struct) (ids []string, objects []*types.Struct, err error) {
// todo: rewrite to the current workspace id
err = block.Do(c.blockPicker, c.anytype.PredefinedBlocks().Account, func(b smartblock.SmartBlock) error {
err = block.Do(c.blockPicker, c.coreService.PredefinedBlocks().Account, func(b smartblock.SmartBlock) error {
workspace, ok := b.(*editor.Workspaces)
if !ok {
return fmt.Errorf("incorrect object with workspace id")
@ -343,15 +341,15 @@ func (c *Creator) CreateObject(req block.DetailsGetter, forcedType bundle.TypeKe
return c.CreateSmartBlockFromState(context.TODO(), sbType, details, st)
case bundle.TypeKeyObjectType.URL():
details.Fields[bundle.RelationKeyLayout.String()] = pbtypes.Float64(float64(model.ObjectType_objectType))
return c.CreateSubObjectInWorkspace(details, c.anytype.PredefinedBlocks().Account)
return c.CreateSubObjectInWorkspace(details, c.coreService.PredefinedBlocks().Account)
case bundle.TypeKeyRelation.URL():
details.Fields[bundle.RelationKeyLayout.String()] = pbtypes.Float64(float64(model.ObjectType_relation))
return c.CreateSubObjectInWorkspace(details, c.anytype.PredefinedBlocks().Account)
return c.CreateSubObjectInWorkspace(details, c.coreService.PredefinedBlocks().Account)
case bundle.TypeKeyRelationOption.URL():
details.Fields[bundle.RelationKeyLayout.String()] = pbtypes.Float64(float64(model.ObjectType_relationOption))
return c.CreateSubObjectInWorkspace(details, c.anytype.PredefinedBlocks().Account)
return c.CreateSubObjectInWorkspace(details, c.coreService.PredefinedBlocks().Account)
case bundle.TypeKeyTemplate.URL():
sbType = coresb.SmartBlockTypeTemplate

View file

@ -44,21 +44,15 @@ type Builder struct {
*app.App
}
func NewBuilder(
sbtProvider typeprovider.SmartBlockTypeProvider,
relationService relation.Service,
objectStore objectstore.ObjectStore,
coreService core.Service,
) *Builder {
return &Builder{
sbtProvider: sbtProvider,
relationService: relationService,
objectStore: objectStore,
coreService: coreService,
}
func NewBuilder() *Builder {
return &Builder{}
}
func (gr *Builder) Init(a *app.App) (err error) {
gr.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
gr.relationService = app.MustComponent[relation.Service](a)
gr.objectStore = app.MustComponent[objectstore.ObjectStore](a)
gr.coreService = app.MustComponent[core.Service](a)
return nil
}

View file

@ -8,7 +8,7 @@ import (
)
func TestService_DataviewRestrictions(t *testing.T) {
rest := New(nil, nil)
rest := New()
assert.True(t, rest.GetRestrictions(&restrictionHolder{
id: bundle.TypeKeyAudio.URL(),
tp: model.SmartBlockType_SubObject,

View file

@ -0,0 +1,222 @@
// Code generated by mockery v2.26.1. DO NOT EDIT.
package mock_restriction
import (
app "github.com/anyproto/any-sync/app"
mock "github.com/stretchr/testify/mock"
model "github.com/anyproto/anytype-heart/pkg/lib/pb/model"
restriction "github.com/anyproto/anytype-heart/core/block/restriction"
)
// MockService is an autogenerated mock type for the Service type
type MockService struct {
mock.Mock
}
type MockService_Expecter struct {
mock *mock.Mock
}
func (_m *MockService) EXPECT() *MockService_Expecter {
return &MockService_Expecter{mock: &_m.Mock}
}
// CheckRestrictions provides a mock function with given fields: id, cr
func (_m *MockService) CheckRestrictions(id string, cr ...model.RestrictionsObjectRestriction) error {
_va := make([]interface{}, len(cr))
for _i := range cr {
_va[_i] = cr[_i]
}
var _ca []interface{}
_ca = append(_ca, id)
_ca = append(_ca, _va...)
ret := _m.Called(_ca...)
var r0 error
if rf, ok := ret.Get(0).(func(string, ...model.RestrictionsObjectRestriction) error); ok {
r0 = rf(id, cr...)
} else {
r0 = ret.Error(0)
}
return r0
}
// MockService_CheckRestrictions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CheckRestrictions'
type MockService_CheckRestrictions_Call struct {
*mock.Call
}
// CheckRestrictions is a helper method to define mock.On call
// - id string
// - cr ...model.RestrictionsObjectRestriction
func (_e *MockService_Expecter) CheckRestrictions(id interface{}, cr ...interface{}) *MockService_CheckRestrictions_Call {
return &MockService_CheckRestrictions_Call{Call: _e.mock.On("CheckRestrictions",
append([]interface{}{id}, cr...)...)}
}
func (_c *MockService_CheckRestrictions_Call) Run(run func(id string, cr ...model.RestrictionsObjectRestriction)) *MockService_CheckRestrictions_Call {
_c.Call.Run(func(args mock.Arguments) {
variadicArgs := make([]model.RestrictionsObjectRestriction, len(args)-1)
for i, a := range args[1:] {
if a != nil {
variadicArgs[i] = a.(model.RestrictionsObjectRestriction)
}
}
run(args[0].(string), variadicArgs...)
})
return _c
}
func (_c *MockService_CheckRestrictions_Call) Return(_a0 error) *MockService_CheckRestrictions_Call {
_c.Call.Return(_a0)
return _c
}
func (_c *MockService_CheckRestrictions_Call) RunAndReturn(run func(string, ...model.RestrictionsObjectRestriction) error) *MockService_CheckRestrictions_Call {
_c.Call.Return(run)
return _c
}
// GetRestrictions provides a mock function with given fields: _a0
func (_m *MockService) GetRestrictions(_a0 restriction.RestrictionHolder) restriction.Restrictions {
ret := _m.Called(_a0)
var r0 restriction.Restrictions
if rf, ok := ret.Get(0).(func(restriction.RestrictionHolder) restriction.Restrictions); ok {
r0 = rf(_a0)
} else {
r0 = ret.Get(0).(restriction.Restrictions)
}
return r0
}
// MockService_GetRestrictions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRestrictions'
type MockService_GetRestrictions_Call struct {
*mock.Call
}
// GetRestrictions is a helper method to define mock.On call
// - _a0 restriction.RestrictionHolder
func (_e *MockService_Expecter) GetRestrictions(_a0 interface{}) *MockService_GetRestrictions_Call {
return &MockService_GetRestrictions_Call{Call: _e.mock.On("GetRestrictions", _a0)}
}
func (_c *MockService_GetRestrictions_Call) Run(run func(_a0 restriction.RestrictionHolder)) *MockService_GetRestrictions_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(restriction.RestrictionHolder))
})
return _c
}
func (_c *MockService_GetRestrictions_Call) Return(_a0 restriction.Restrictions) *MockService_GetRestrictions_Call {
_c.Call.Return(_a0)
return _c
}
func (_c *MockService_GetRestrictions_Call) RunAndReturn(run func(restriction.RestrictionHolder) restriction.Restrictions) *MockService_GetRestrictions_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)
var r0 error
if rf, ok := ret.Get(0).(func(*app.App) error); ok {
r0 = rf(a)
} else {
r0 = ret.Error(0)
}
return r0
}
// MockService_Init_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Init'
type MockService_Init_Call struct {
*mock.Call
}
// Init is a helper method to define mock.On call
// - a *app.App
func (_e *MockService_Expecter) Init(a interface{}) *MockService_Init_Call {
return &MockService_Init_Call{Call: _e.mock.On("Init", a)}
}
func (_c *MockService_Init_Call) Run(run func(a *app.App)) *MockService_Init_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(*app.App))
})
return _c
}
func (_c *MockService_Init_Call) Return(err error) *MockService_Init_Call {
_c.Call.Return(err)
return _c
}
func (_c *MockService_Init_Call) RunAndReturn(run func(*app.App) error) *MockService_Init_Call {
_c.Call.Return(run)
return _c
}
// Name provides a mock function with given fields:
func (_m *MockService) Name() string {
ret := _m.Called()
var r0 string
if rf, ok := ret.Get(0).(func() string); ok {
r0 = rf()
} else {
r0 = ret.Get(0).(string)
}
return r0
}
// MockService_Name_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Name'
type MockService_Name_Call struct {
*mock.Call
}
// Name is a helper method to define mock.On call
func (_e *MockService_Expecter) Name() *MockService_Name_Call {
return &MockService_Name_Call{Call: _e.mock.On("Name")}
}
func (_c *MockService_Name_Call) Run(run func()) *MockService_Name_Call {
_c.Call.Run(func(args mock.Arguments) {
run()
})
return _c
}
func (_c *MockService_Name_Call) Return(name string) *MockService_Name_Call {
_c.Call.Return(name)
return _c
}
func (_c *MockService_Name_Call) RunAndReturn(run func() string) *MockService_Name_Call {
_c.Call.Return(run)
return _c
}
type mockConstructorTestingTNewMockService interface {
mock.TestingT
Cleanup(func())
}
// NewMockService creates a new instance of MockService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
func NewMockService(t mockConstructorTestingTNewMockService) *MockService {
mock := &MockService{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}

View file

@ -216,7 +216,7 @@ func (s *service) getObjectRestrictions(rh RestrictionHolder) (r ObjectRestricti
}
if !errors.Is(r.Check(model.Restrictions_Template), ErrRestricted) {
if _, err := s.store.GetObjectType(rh.ObjectType()); err != nil {
if _, err := s.objectStore.GetObjectType(rh.ObjectType()); err != nil {
r = append(r, model.Restrictions_Template)
}
}

View file

@ -3,20 +3,44 @@ package restriction
import (
"testing"
"go.uber.org/mock/gomock"
"github.com/stretchr/testify/assert"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore/mock_objectstore"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/util/testMock"
"github.com/anyproto/anytype-heart/space/typeprovider/mock_typeprovider"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
)
type fixture struct {
Service
objectStoreMock *mock_objectstore.MockObjectStore
}
func newFixture(t *testing.T) *fixture {
objectStore := mock_objectstore.NewMockObjectStore(t)
objectStore.EXPECT().Name().Return("objectstore")
sbtProvider := mock_typeprovider.NewMockSmartBlockTypeProvider(t)
sbtProvider.EXPECT().Name().Return("sbtProvider")
a := &app.App{}
a.Register(objectStore)
a.Register(sbtProvider)
s := New()
err := s.Init(a)
require.NoError(t, err)
return &fixture{
Service: s,
objectStoreMock: objectStore,
}
}
func TestService_ObjectRestrictionsById(t *testing.T) {
ctrl := gomock.NewController(t)
store := testMock.NewMockObjectStore(ctrl)
store.EXPECT().GetObjectType(gomock.Any()).AnyTimes()
rest := New(nil, store)
rest := newFixture(t)
rest.objectStoreMock.EXPECT().GetObjectType(mock.Anything).Return(nil, nil)
assert.ErrorIs(t, rest.GetRestrictions(&restrictionHolder{
id: "",
@ -110,11 +134,9 @@ func TestService_ObjectRestrictionsById(t *testing.T) {
}
func TestTemplateRestriction(t *testing.T) {
ctrl := gomock.NewController(t)
store := testMock.NewMockObjectStore(ctrl)
store.EXPECT().GetObjectType(bundle.TypeKeyPage.URL()).Return(nil, objectstore.ErrObjectNotFound)
store.EXPECT().GetObjectType(bundle.TypeKeyContact.URL()).Return(&model.ObjectType{}, nil)
rs := New(nil, store)
rs := newFixture(t)
rs.objectStoreMock.EXPECT().GetObjectType(bundle.TypeKeyPage.URL()).Return(nil, objectstore.ErrObjectNotFound)
rs.objectStoreMock.EXPECT().GetObjectType(bundle.TypeKeyContact.URL()).Return(&model.ObjectType{}, nil)
assert.ErrorIs(t, rs.GetRestrictions(&restrictionHolder{
id: "cannot make template from Template smartblock type",

View file

@ -33,17 +33,16 @@ type Service interface {
type service struct {
sbtProvider typeprovider.SmartBlockTypeProvider
store objectstore.ObjectStore
objectStore objectstore.ObjectStore
}
func New(sbtProvider typeprovider.SmartBlockTypeProvider, objectStore objectstore.ObjectStore) Service {
return &service{
sbtProvider: sbtProvider,
store: objectStore,
}
func New() Service {
return &service{}
}
func (s *service) Init(*app.App) (err error) {
func (s *service) Init(a *app.App) (err error) {
s.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
s.objectStore = app.MustComponent[objectstore.ObjectStore](a)
return
}
@ -75,7 +74,7 @@ func (s *service) getRestrictionsById(id string) (r Restrictions, err error) {
return Restrictions{}, fmt.Errorf("get smartblock type: %w", err)
}
layout := model.ObjectTypeLayout(noLayout)
d, err := s.store.GetDetails(id)
d, err := s.objectStore.GetDetails(id)
var ot string
if err == nil {
if pbtypes.HasField(d.GetDetails(), bundle.RelationKeyLayout.String()) {

View file

@ -9,7 +9,7 @@ import (
)
func TestService_GetRestrictions(t *testing.T) {
s := New(nil, nil)
s := New()
res := s.GetRestrictions(&restrictionHolder{tp: model.SmartBlockType_BundledObjectType})
assert.NotEmpty(t, res.Object)
}

View file

@ -94,16 +94,9 @@ type SmartblockOpener interface {
Open(id string) (sb smartblock.SmartBlock, err error)
}
func New(
tempDirProvider *core.TempDirService,
sbtProvider typeprovider.SmartBlockTypeProvider,
layoutConverter converter.LayoutConverter,
) *Service {
func New() *Service {
return &Service{
tempDirProvider: tempDirProvider,
sbtProvider: sbtProvider,
layoutConverter: layoutConverter,
closing: make(chan struct{}),
closing: make(chan struct{}),
openedObjs: &openedObjects{
objects: make(map[string]bool),
lock: &sync.Mutex{},
@ -191,6 +184,11 @@ func (s *Service) Init(a *app.App) (err error) {
s.fileStore = app.MustComponent[filestore.FileStore](a)
s.fileSync = app.MustComponent[filesync.FileSync](a)
s.fileService = app.MustComponent[files.Service](a)
s.tempDirProvider = app.MustComponent[core.TempDirProvider](a)
s.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
s.layoutConverter = app.MustComponent[converter.LayoutConverter](a)
s.cache = s.createCache()
s.app = a
return

View file

@ -12,15 +12,15 @@ const (
<meta name="CocoaVersion" content="1894.1">
<style type="text/css">
.row > * { display: flex; }
.header1 { padding: 23px 0px 1px 0px; font-size: 28px; line-height: 32px; letter-spacing: -0.36px; font-weight: 600; }
.header2 { padding: 15px 0px 1px 0px; font-size: 22px; line-height: 28px; letter-spacing: -0.16px; font-weight: 600; }
.header3 { padding: 15px 0px 1px 0px; font-size: 17px; line-height: 24px; font-weight: 600; }
.quote { padding: 7px 0px 7px 0px; font-size: 18px; line-height: 26px; font-style: italic; }
.paragraph { font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word; }
.header1 {` + styleHeader1 + `}
.header2 {` + styleHeader2 + `}
.header3 {` + styleHeader3 + `}
.quote {` + styleQuote + `}
.paragraph {` + styleParagraph + `}
.callout-image { width: 20px; height: 20px; font-size: 16px; line-height: 20px; margin-right: 6px; display: inline-block; }
.callout-image img { width: 100%; object-fit: cover; }
a { cursor: pointer; }
kbd { display: inline; font-family: 'Mono'; line-height: 1.71; background: rgba(247,245,240,0.5); padding: 0px 4px; border-radius: 2px; }
kbd {` + styleKbd + `}
ul { margin: 0px; }
</style>
</head>
@ -74,7 +74,7 @@ var styleTags = map[model.BlockContentTextStyle]styleTag{
model.BlockContentText_Title: {OpenTag: `<h1 style="` + styleTitle + `">`, CloseTag: `</h1>`},
model.BlockContentText_Checkbox: {OpenTag: `<div style="` + styleCheckbox + `" class="check"><input type="checkbox"/>`, CloseTag: `</div>`},
model.BlockContentText_Toggle: {OpenTag: `<div style="` + styleToggle + `" class="toggle">`, CloseTag: `</div>`},
defaultStyle: {OpenTag: `<div style="` + styleParagraph + `" class="paragraph" style="` + styleParagraph + `">`, CloseTag: `</div>`},
defaultStyle: {OpenTag: `<div style="` + styleParagraph + `" class="paragraph">`, CloseTag: `</div>`},
}
func textColor(color string) string {

View file

@ -137,6 +137,9 @@ func (h *HTML) renderText(rs *renderState, b *model.Block) {
tags, ok := styleTags[text.Style]
if !ok {
tags = styleTags[defaultStyle]
if text.Text == "" {
tags = styleTag{OpenTag: "<p>", CloseTag: "</p>"}
}
}
rs.Close()
h.buf.WriteString(tags.OpenTag)

View file

@ -366,7 +366,7 @@ func givenTrimmedString(s string) string {
}
const markupExpectation = `
<div style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;" class="paragraph" style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;">
<div style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;" class="paragraph">
<b>0
<i>1</i>
</b>
@ -435,7 +435,7 @@ const intersectMarksExpectation = `
const columnsExpectation = `
<div class="row" style="display: flex">
<div class="column" >
<div style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;" class="paragraph" style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;">1</div></div><div class="column" ><div style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;" class="paragraph" style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;">
<div style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;" class="paragraph">1</div></div><div class="column" ><div style="font-size: 15px; line-height: 24px; letter-spacing: -0.08px; font-weight: 400; word-wrap: break-word;" class="paragraph">
2
</div>
</div>

View file

@ -0,0 +1,155 @@
// Code generated by mockery v2.26.1. DO NOT EDIT.
package mock_event
import (
app "github.com/anyproto/any-sync/app"
mock "github.com/stretchr/testify/mock"
pb "github.com/anyproto/anytype-heart/pb"
)
// MockSender is an autogenerated mock type for the Sender type
type MockSender struct {
mock.Mock
}
type MockSender_Expecter struct {
mock *mock.Mock
}
func (_m *MockSender) EXPECT() *MockSender_Expecter {
return &MockSender_Expecter{mock: &_m.Mock}
}
// Init provides a mock function with given fields: a
func (_m *MockSender) Init(a *app.App) error {
ret := _m.Called(a)
var r0 error
if rf, ok := ret.Get(0).(func(*app.App) error); ok {
r0 = rf(a)
} else {
r0 = ret.Error(0)
}
return r0
}
// MockSender_Init_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Init'
type MockSender_Init_Call struct {
*mock.Call
}
// Init is a helper method to define mock.On call
// - a *app.App
func (_e *MockSender_Expecter) Init(a interface{}) *MockSender_Init_Call {
return &MockSender_Init_Call{Call: _e.mock.On("Init", a)}
}
func (_c *MockSender_Init_Call) Run(run func(a *app.App)) *MockSender_Init_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(*app.App))
})
return _c
}
func (_c *MockSender_Init_Call) Return(err error) *MockSender_Init_Call {
_c.Call.Return(err)
return _c
}
func (_c *MockSender_Init_Call) RunAndReturn(run func(*app.App) error) *MockSender_Init_Call {
_c.Call.Return(run)
return _c
}
// Name provides a mock function with given fields:
func (_m *MockSender) Name() string {
ret := _m.Called()
var r0 string
if rf, ok := ret.Get(0).(func() string); ok {
r0 = rf()
} else {
r0 = ret.Get(0).(string)
}
return r0
}
// MockSender_Name_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Name'
type MockSender_Name_Call struct {
*mock.Call
}
// Name is a helper method to define mock.On call
func (_e *MockSender_Expecter) Name() *MockSender_Name_Call {
return &MockSender_Name_Call{Call: _e.mock.On("Name")}
}
func (_c *MockSender_Name_Call) Run(run func()) *MockSender_Name_Call {
_c.Call.Run(func(args mock.Arguments) {
run()
})
return _c
}
func (_c *MockSender_Name_Call) Return(name string) *MockSender_Name_Call {
_c.Call.Return(name)
return _c
}
func (_c *MockSender_Name_Call) RunAndReturn(run func() string) *MockSender_Name_Call {
_c.Call.Return(run)
return _c
}
// Send provides a mock function with given fields: _a0
func (_m *MockSender) Send(_a0 *pb.Event) {
_m.Called(_a0)
}
// MockSender_Send_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Send'
type MockSender_Send_Call struct {
*mock.Call
}
// Send is a helper method to define mock.On call
// - _a0 *pb.Event
func (_e *MockSender_Expecter) Send(_a0 interface{}) *MockSender_Send_Call {
return &MockSender_Send_Call{Call: _e.mock.On("Send", _a0)}
}
func (_c *MockSender_Send_Call) Run(run func(_a0 *pb.Event)) *MockSender_Send_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(*pb.Event))
})
return _c
}
func (_c *MockSender_Send_Call) Return() *MockSender_Send_Call {
_c.Call.Return()
return _c
}
func (_c *MockSender_Send_Call) RunAndReturn(run func(*pb.Event)) *MockSender_Send_Call {
_c.Call.Return(run)
return _c
}
type mockConstructorTestingTNewMockSender interface {
mock.TestingT
Cleanup(func())
}
// NewMockSender creates a new instance of MockSender. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
func NewMockSender(t mockConstructorTestingTNewMockSender) *MockSender {
mock := &MockSender{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}

View file

@ -81,11 +81,8 @@ type service struct {
objectStore objectstore.ObjectStore
}
func New(statusWatcher SyncStatusWatcher, objectStore objectstore.ObjectStore) Service {
return &service{
syncStatusWatcher: statusWatcher,
objectStore: objectStore,
}
func New() Service {
return &service{}
}
func (s *service) Init(a *app.App) (err error) {
@ -95,6 +92,8 @@ func (s *service) Init(a *app.App) (err error) {
s.spaceService = a.MustComponent(space.CName).(space.Service)
s.dagService = s.commonFile.DAGService()
s.fileStorage = app.MustComponent[filestorage.FileStorage](a)
s.objectStore = app.MustComponent[objectstore.ObjectStore](a)
s.syncStatusWatcher = app.MustComponent[SyncStatusWatcher](a)
return nil
}

View file

@ -19,6 +19,7 @@ import (
"go.uber.org/zap"
"github.com/anyproto/anytype-heart/core/anytype/config"
"github.com/anyproto/anytype-heart/core/event"
"github.com/anyproto/anytype-heart/core/filestorage/rpcstore"
"github.com/anyproto/anytype-heart/core/wallet"
"github.com/anyproto/anytype-heart/pb"
@ -32,10 +33,8 @@ const FlatfsDirName = "flatfs"
var log = logger.NewNamed(CName)
func New(sendEvent func(event *pb.Event)) FileStorage {
return &fileStorage{
sendEvent: sendEvent,
}
func New() FileStorage {
return &fileStorage{}
}
type FileStorage interface {
@ -73,6 +72,7 @@ func (f *fileStorage) Init(a *app.App) (err error) {
f.spaceStorage = a.MustComponent(spacestorage.CName).(storage.ClientStorage)
f.handler = &rpcHandler{spaceStorage: f.spaceStorage}
f.spaceService = a.MustComponent(space.CName).(space.Service)
f.sendEvent = app.MustComponent[event.Sender](a).Send
if fileCfg.IPFSStorageAddr == "" {
f.flatfsPath = filepath.Join(app.MustComponent[wallet.Wallet](a).RepoPath(), FlatfsDirName)
} else {

View file

@ -14,6 +14,7 @@ import (
ipld "github.com/ipfs/go-ipld-format"
"go.uber.org/zap"
"github.com/anyproto/anytype-heart/core/event"
"github.com/anyproto/anytype-heart/core/filestorage/rpcstore"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/pkg/lib/datastore"
@ -73,9 +74,8 @@ type fileSync struct {
spaceStats map[string]SpaceStat
}
func New(sendEvent func(event *pb.Event)) FileSync {
func New() FileSync {
return &fileSync{
sendEvent: sendEvent,
spaceStats: map[string]SpaceStat{},
}
}
@ -86,6 +86,7 @@ func (f *fileSync) Init(a *app.App) (err error) {
f.dagService = a.MustComponent(fileservice.CName).(fileservice.FileService).DAGService()
f.fileStore = app.MustComponent[filestore.FileStore](a)
f.spaceService = app.MustComponent[space.Service](a)
f.sendEvent = app.MustComponent[event.Sender](a).Send
f.removePingCh = make(chan struct{})
f.uploadPingCh = make(chan struct{})
return
@ -109,20 +110,7 @@ func (f *fileSync) Run(ctx context.Context) (err error) {
return
}
// TODO multi-spaces: init for each space: GO-1681
{
spaceID := f.spaceService.AccountId()
_, err = f.SpaceStat(ctx, spaceID)
if err != nil {
// Don't confuse users with 0B limit in case of error, so set default 1GB limit
f.setSpaceStats(spaceID, SpaceStat{
SpaceId: spaceID,
BytesLimit: 1024 * 1024 * 1024, // 1 GB
})
log.Error("can't init space stats", zap.String("spaceID", f.spaceService.AccountId()), zap.Error(err))
err = nil
}
}
go f.precacheSpaceStats()
f.loopCtx, f.loopCancel = context.WithCancel(context.Background())
go f.addLoop()
@ -130,6 +118,20 @@ func (f *fileSync) Run(ctx context.Context) (err error) {
return
}
func (f *fileSync) precacheSpaceStats() {
// TODO multi-spaces: init for each space: GO-1681
spaceID := f.spaceService.AccountId()
_, err := f.SpaceStat(context.Background(), spaceID)
if err != nil {
// Don't confuse users with 0B limit in case of error, so set default 1GB limit
f.setSpaceStats(spaceID, SpaceStat{
SpaceId: spaceID,
BytesLimit: 1024 * 1024 * 1024, // 1 GB
})
log.Error("can't init space stats", zap.String("spaceID", f.spaceService.AccountId()), zap.Error(err))
}
}
func (f *fileSync) Close(ctx context.Context) (err error) {
if f.loopCancel != nil {
f.loopCancel()

View file

@ -25,13 +25,14 @@ import (
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
"github.com/anyproto/anytype-heart/core/event/mock_event"
"github.com/anyproto/anytype-heart/core/filestorage/rpcstore"
"github.com/anyproto/anytype-heart/core/filestorage/rpcstore/mock_rpcstore"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/pkg/lib/datastore"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/filestore"
"github.com/anyproto/anytype-heart/pkg/lib/pb/storage"
"github.com/anyproto/anytype-heart/space/mock_space"
"github.com/stretchr/testify/mock"
)
var ctx = context.Background()
@ -83,9 +84,7 @@ func TestFileSync_RemoveFile(t *testing.T) {
func newFixture(t *testing.T) *fixture {
fx := &fixture{
FileSync: New(func(event *pb.Event) {
fmt.Println(event)
}),
FileSync: New(),
fileService: fileservice.New(),
ctrl: gomock.NewController(t),
a: new(app.App),
@ -119,13 +118,19 @@ func newFixture(t *testing.T) *fixture {
spaceService.EXPECT().AccountId().Return("space1").AnyTimes()
spaceService.EXPECT().Close(gomock.Any()).AnyTimes()
sender := mock_event.NewMockSender(t)
sender.EXPECT().Name().Return("event")
sender.EXPECT().Init(mock.Anything).Return(nil)
sender.EXPECT().Send(mock.Anything).Return().Maybe()
fx.a.Register(fx.fileService).
Register(&inMemBlockStore{data: map[string]blocks.Block{}}).
Register(bp).
Register(mockRpcStoreService).
Register(fx.FileSync).
Register(fileStoreMock).
Register(spaceService)
Register(spaceService).
Register(sender)
require.NoError(t, fx.a.Start(ctx))
return fx
}

View file

@ -66,15 +66,8 @@ var (
ftIndexForceMinInterval = time.Second * 10
)
func New(
picker block.Picker,
spaceService space.Service,
fileService files.Service,
) Indexer {
func New() Indexer {
return &indexer{
picker: picker,
spaceService: spaceService,
fileService: fileService,
indexedFiles: &sync.Map{},
}
}
@ -132,6 +125,9 @@ func (i *indexer) Init(a *app.App) (err error) {
i.ftsearch = app.MustComponent[ftsearch.FTSearch](a)
i.subObjectCreator = app.MustComponent[subObjectCreator](a)
i.syncStarter = app.MustComponent[syncStarter](a)
i.picker = app.MustComponent[block.Picker](a)
i.spaceService = app.MustComponent[space.Service](a)
i.fileService = app.MustComponent[files.Service](a)
i.quit = make(chan struct{})
i.forceFt = make(chan struct{})
return

View file

@ -21,8 +21,9 @@ import (
"github.com/anyproto/anytype-heart/pkg/lib/localstore/ftsearch"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/space/typeprovider"
"github.com/anyproto/anytype-heart/space/typeprovider/mock_typeprovider"
"github.com/anyproto/anytype-heart/util/pbtypes"
"github.com/stretchr/testify/mock"
)
func Test_GrouperTags(t *testing.T) {
@ -31,11 +32,14 @@ func Test_GrouperTags(t *testing.T) {
app := testapp.New()
defer app.Close(context.Background())
tp := typeprovider.New(nil)
tp.Init(nil)
ds := objectstore.New(tp)
tp := mock_typeprovider.NewMockSmartBlockTypeProvider(t)
tp.EXPECT().Name().Return("mock_typeprovider")
tp.EXPECT().Init(mock.Anything).Return(nil)
tp.EXPECT().Type("rel-tag").Return(smartblock2.SmartBlockTypeSubObject, nil)
ds := objectstore.New()
kanbanSrv := New()
err := app.With(&config.DefaultConfig).
With(tp).
With(wallet.NewWithRepoDirAndRandomKeys(tmpDir)).
With(clientds.New()).
With(ftsearch.New()).
@ -84,10 +88,6 @@ func Test_GrouperTags(t *testing.T) {
id2 := bson.NewObjectId().Hex()
id3 := bson.NewObjectId().Hex()
id4 := bson.NewObjectId().Hex()
tp.RegisterStaticType(id1, smartblock2.SmartBlockTypePage)
tp.RegisterStaticType(id2, smartblock2.SmartBlockTypePage)
tp.RegisterStaticType(id3, smartblock2.SmartBlockTypePage)
tp.RegisterStaticType(id4, smartblock2.SmartBlockTypePage)
require.NoError(t, ds.UpdateObjectDetails(id1, &types.Struct{
Fields: map[string]*types.Value{"name": pbtypes.String("one")},

View file

@ -39,7 +39,7 @@ func start(t *testing.T, eventSender event.Sender) (setId string, rootPath strin
respWalletCreate := mw.WalletCreate(context.Background(), &pb.RpcWalletCreateRequest{RootPath: rootPath})
require.Equal(t, 0, int(respWalletCreate.Error.Code), respWalletCreate.Error.Description)
respAccountCreate := mw.AccountCreate(context.Background(), &pb.RpcAccountCreateRequest{Name: "profile", AlphaInviteCode: "elbrus"})
respAccountCreate := mw.AccountCreate(context.Background(), &pb.RpcAccountCreateRequest{Name: "profile"})
require.Equal(t, 0, int(respAccountCreate.Error.Code), respAccountCreate.Error.Description)
resp := mw.ObjectCreateSet(context.Background(), &pb.RpcObjectCreateSetRequest{

View file

@ -35,11 +35,8 @@ var log = logging.Logger("anytype-mw-subscription")
var batchTime = 50 * time.Millisecond
func New(collectionService CollectionService, sbtProvider typeprovider.SmartBlockTypeProvider) Service {
return &service{
collectionService: collectionService,
sbtProvider: sbtProvider,
}
func New() Service {
return &service{}
}
type Service interface {
@ -92,6 +89,8 @@ func (s *service) Init(a *app.App) (err error) {
s.kanban = a.MustComponent(kanban.CName).(kanban.Service)
s.recBatch = mb.New(0)
s.sendEvent = a.MustComponent(event.CName).(event.Sender).Send
s.collectionService = app.MustComponent[CollectionService](a)
s.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
s.ctxBuf = &opCtx{c: s.cache}
return
}

View file

@ -5,18 +5,21 @@ import (
"testing"
"github.com/gogo/protobuf/types"
"go.uber.org/mock/gomock"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/anytype-heart/app/testapp"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/pkg/lib/database"
"github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/space/typeprovider/mock_typeprovider"
"github.com/anyproto/anytype-heart/util/pbtypes"
"github.com/anyproto/anytype-heart/util/testMock"
"github.com/stretchr/testify/mock"
)
func TestService_Search(t *testing.T) {
@ -313,13 +316,19 @@ func (c *collectionServiceMock) SubscribeForCollection(collectionID string, subs
func (c *collectionServiceMock) UnsubscribeFromCollection(collectionID string, subscriptionID string) {
}
func (c *collectionServiceMock) Name() string {
return "collectionService"
}
func (c *collectionServiceMock) Init(a *app.App) error { return nil }
func newFixture(t *testing.T) *fixture {
ctrl := gomock.NewController(t)
a := testapp.New()
testMock.RegisterMockObjectStore(ctrl, a)
testMock.RegisterMockKanban(ctrl, a)
fx := &fixture{
Service: New(&collectionServiceMock{}, nil),
Service: New(),
a: a,
ctrl: ctrl,
store: a.MustComponent(objectstore.CName).(*testMock.MockObjectStore),
@ -329,6 +338,13 @@ func newFixture(t *testing.T) *fixture {
}}
a.Register(fx.Service)
a.Register(fx.sender)
a.Register(&collectionServiceMock{updateCh: make(chan []string, 1)})
sbtProvider := mock_typeprovider.NewMockSmartBlockTypeProvider(t)
sbtProvider.EXPECT().Name().Return("sbtProvider")
sbtProvider.EXPECT().Init(mock.Anything).Return(nil)
a.Register(sbtProvider)
fx.store.EXPECT().SubscribeForAll(gomock.Any())
require.NoError(t, a.Start(context.Background()))

View file

@ -11,8 +11,8 @@ import (
"github.com/anyproto/anytype-heart/core/anytype/config"
"github.com/anyproto/anytype-heart/core/block/getblock"
"github.com/anyproto/anytype-heart/core/event"
"github.com/anyproto/anytype-heart/core/filestorage/filesync"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/pkg/lib/core"
"github.com/anyproto/anytype-heart/pkg/lib/core/smartblock"
"github.com/anyproto/anytype-heart/pkg/lib/datastore"
@ -36,8 +36,10 @@ type Service interface {
var _ Service = (*service)(nil)
type service struct {
typeProvider typeprovider.SmartBlockTypeProvider
spaceService space.Service
typeProvider typeprovider.SmartBlockTypeProvider
spaceService space.Service
fileSyncService filesync.FileSync
fileWatcherUpdateInterval time.Duration
coreService core.Service
@ -48,38 +50,35 @@ type service struct {
updateReceiver *updateReceiver
}
func New(
typeProvider typeprovider.SmartBlockTypeProvider,
dbProvider datastore.Datastore,
spaceService space.Service,
coreService core.Service,
fileSyncService filesync.FileSync,
nodeConfService nodeconf.Service,
fileStore filestore.FileStore,
picker getblock.Picker,
cfg *config.Config,
sendEvent func(event *pb.Event),
fileWatcherUpdateInterval time.Duration,
) Service {
fileStatusRegistry := newFileStatusRegistry(fileSyncService, fileStore, picker, fileWatcherUpdateInterval)
linkedFilesWatcher := newLinkedFilesWatcher(spaceService, fileStatusRegistry)
subObjectsWatcher := newSubObjectsWatcher()
updateReceiver := newUpdateReceiver(coreService, linkedFilesWatcher, subObjectsWatcher, nodeConfService, cfg, sendEvent)
fileWatcher := newFileWatcher(spaceService, dbProvider, fileStatusRegistry, updateReceiver, fileWatcherUpdateInterval)
objectWatcher := newObjectWatcher(spaceService, updateReceiver)
func New(fileWatcherUpdateInterval time.Duration) Service {
return &service{
spaceService: spaceService,
typeProvider: typeProvider,
coreService: coreService,
fileWatcher: fileWatcher,
objectWatcher: objectWatcher,
subObjectsWatcher: subObjectsWatcher,
linkedFilesWatcher: linkedFilesWatcher,
updateReceiver: updateReceiver,
fileWatcherUpdateInterval: fileWatcherUpdateInterval,
}
}
func (s *service) Init(a *app.App) (err error) {
s.spaceService = app.MustComponent[space.Service](a)
s.typeProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
s.coreService = app.MustComponent[core.Service](a)
s.fileSyncService = app.MustComponent[filesync.FileSync](a)
dbProvider := app.MustComponent[datastore.Datastore](a)
spaceService := app.MustComponent[space.Service](a)
coreService := app.MustComponent[core.Service](a)
nodeConfService := app.MustComponent[nodeconf.Service](a)
fileStore := app.MustComponent[filestore.FileStore](a)
picker := app.MustComponent[getblock.Picker](a)
cfg := app.MustComponent[*config.Config](a)
sendEvent := app.MustComponent[event.Sender](a).Send
fileStatusRegistry := newFileStatusRegistry(s.fileSyncService, fileStore, picker, s.fileWatcherUpdateInterval)
s.linkedFilesWatcher = newLinkedFilesWatcher(spaceService, fileStatusRegistry)
s.subObjectsWatcher = newSubObjectsWatcher()
s.updateReceiver = newUpdateReceiver(coreService, s.linkedFilesWatcher, s.subObjectsWatcher, nodeConfService, cfg, sendEvent)
s.fileWatcher = newFileWatcher(spaceService, dbProvider, fileStatusRegistry, s.updateReceiver, s.fileWatcherUpdateInterval)
s.objectWatcher = newObjectWatcher(spaceService, s.updateReceiver)
s.fileSyncService.OnUpload(s.OnFileUpload)
return s.fileWatcher.init()
}

View file

@ -1,4 +1,4 @@
// Code generated by mockery v2.30.16. DO NOT EDIT.
// Code generated by mockery v2.26.1. DO NOT EDIT.
package mock_wallet
@ -404,12 +404,13 @@ func (_c *MockWallet_RootPath_Call) RunAndReturn(run func() string) *MockWallet_
return _c
}
// NewMockWallet creates a new instance of MockWallet. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockWallet(t interface {
type mockConstructorTestingTNewMockWallet interface {
mock.TestingT
Cleanup(func())
}) *MockWallet {
}
// NewMockWallet creates a new instance of MockWallet. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
func NewMockWallet(t mockConstructorTestingTNewMockWallet) *MockWallet {
mock := &MockWallet{}
mock.Mock.Test(t)

1
deps/deps.go vendored
View file

@ -2,6 +2,7 @@ package deps
import (
_ "github.com/golang/mock/sample"
_ "github.com/pseudomuto/protoc-gen-doc/extensions/google_api_http"
_ "github.com/vektra/mockery/v2/cmd"
// _ "github.com/ahmetb/govvv" // import govvv so it can be installed with make setup-go
_ "golang.org/x/mobile/bind" // import gomobile so it will be installed with make setup-gomobile

View file

@ -53,6 +53,10 @@
- [Rpc.Account.Delete.Request](#anytype-Rpc-Account-Delete-Request)
- [Rpc.Account.Delete.Response](#anytype-Rpc-Account-Delete-Response)
- [Rpc.Account.Delete.Response.Error](#anytype-Rpc-Account-Delete-Response-Error)
- [Rpc.Account.EnableLocalNetworkSync](#anytype-Rpc-Account-EnableLocalNetworkSync)
- [Rpc.Account.EnableLocalNetworkSync.Request](#anytype-Rpc-Account-EnableLocalNetworkSync-Request)
- [Rpc.Account.EnableLocalNetworkSync.Response](#anytype-Rpc-Account-EnableLocalNetworkSync-Response)
- [Rpc.Account.EnableLocalNetworkSync.Response.Error](#anytype-Rpc-Account-EnableLocalNetworkSync-Response-Error)
- [Rpc.Account.GetConfig](#anytype-Rpc-Account-GetConfig)
- [Rpc.Account.GetConfig.Get](#anytype-Rpc-Account-GetConfig-Get)
- [Rpc.Account.GetConfig.Get.Request](#anytype-Rpc-Account-GetConfig-Get-Request)
@ -931,6 +935,7 @@
- [Rpc.Account.ConfigUpdate.Timezones](#anytype-Rpc-Account-ConfigUpdate-Timezones)
- [Rpc.Account.Create.Response.Error.Code](#anytype-Rpc-Account-Create-Response-Error-Code)
- [Rpc.Account.Delete.Response.Error.Code](#anytype-Rpc-Account-Delete-Response-Error-Code)
- [Rpc.Account.EnableLocalNetworkSync.Response.Error.Code](#anytype-Rpc-Account-EnableLocalNetworkSync-Response-Error-Code)
- [Rpc.Account.Move.Response.Error.Code](#anytype-Rpc-Account-Move-Response-Error-Code)
- [Rpc.Account.Recover.Response.Error.Code](#anytype-Rpc-Account-Recover-Response-Error-Code)
- [Rpc.Account.RecoverFromLegacyExport.Response.Error.Code](#anytype-Rpc-Account-RecoverFromLegacyExport-Response-Error-Code)
@ -1488,6 +1493,7 @@
| AccountCreate | [Rpc.Account.Create.Request](#anytype-Rpc-Account-Create-Request) | [Rpc.Account.Create.Response](#anytype-Rpc-Account-Create-Response) | |
| AccountDelete | [Rpc.Account.Delete.Request](#anytype-Rpc-Account-Delete-Request) | [Rpc.Account.Delete.Response](#anytype-Rpc-Account-Delete-Response) | |
| AccountSelect | [Rpc.Account.Select.Request](#anytype-Rpc-Account-Select-Request) | [Rpc.Account.Select.Response](#anytype-Rpc-Account-Select-Response) | |
| AccountEnableLocalNetworkSync | [Rpc.Account.EnableLocalNetworkSync.Request](#anytype-Rpc-Account-EnableLocalNetworkSync-Request) | [Rpc.Account.EnableLocalNetworkSync.Response](#anytype-Rpc-Account-EnableLocalNetworkSync-Response) | |
| AccountStop | [Rpc.Account.Stop.Request](#anytype-Rpc-Account-Stop-Request) | [Rpc.Account.Stop.Response](#anytype-Rpc-Account-Stop-Response) | |
| AccountMove | [Rpc.Account.Move.Request](#anytype-Rpc-Account-Move-Request) | [Rpc.Account.Move.Response](#anytype-Rpc-Account-Move-Response) | |
| AccountConfigUpdate | [Rpc.Account.ConfigUpdate.Request](#anytype-Rpc-Account-ConfigUpdate-Request) | [Rpc.Account.ConfigUpdate.Response](#anytype-Rpc-Account-ConfigUpdate-Response) | |
@ -2290,7 +2296,7 @@ Front end to middleware request-to-create-an account
| avatarLocalPath | [string](#string) | | Path to an image, that will be used as an avatar of this account |
| storePath | [string](#string) | | Path to local storage |
| icon | [int64](#int64) | | Option of pre-installed icon |
| alphaInviteCode | [string](#string) | | DEPRECATED |
| disableLocalNetworkSync | [bool](#bool) | | Disable local network discovery |
@ -2387,6 +2393,57 @@ Middleware-to-front-end response for an account creation request, that can conta
<a name="anytype-Rpc-Account-EnableLocalNetworkSync"></a>
### Rpc.Account.EnableLocalNetworkSync
<a name="anytype-Rpc-Account-EnableLocalNetworkSync-Request"></a>
### Rpc.Account.EnableLocalNetworkSync.Request
<a name="anytype-Rpc-Account-EnableLocalNetworkSync-Response"></a>
### Rpc.Account.EnableLocalNetworkSync.Response
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| error | [Rpc.Account.EnableLocalNetworkSync.Response.Error](#anytype-Rpc-Account-EnableLocalNetworkSync-Response-Error) | | |
<a name="anytype-Rpc-Account-EnableLocalNetworkSync-Response-Error"></a>
### Rpc.Account.EnableLocalNetworkSync.Response.Error
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| code | [Rpc.Account.EnableLocalNetworkSync.Response.Error.Code](#anytype-Rpc-Account-EnableLocalNetworkSync-Response-Error-Code) | | |
| description | [string](#string) | | |
<a name="anytype-Rpc-Account-GetConfig"></a>
### Rpc.Account.GetConfig
@ -2605,6 +2662,7 @@ User can select an account from those, that came with an AccountAdd events
| ----- | ---- | ----- | ----------- |
| id | [string](#string) | | Id of a selected account |
| rootPath | [string](#string) | | Root path is optional, set if this is a first request |
| disableLocalNetworkSync | [bool](#bool) | | Disable local network discovery |
@ -15141,6 +15199,20 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er
<a name="anytype-Rpc-Account-EnableLocalNetworkSync-Response-Error-Code"></a>
### Rpc.Account.EnableLocalNetworkSync.Response.Error.Code
| Name | Number | Description |
| ---- | ------ | ----------- |
| NULL | 0 | |
| UNKNOWN_ERROR | 1 | |
| BAD_INPUT | 2 | |
| ACCOUNT_IS_NOT_RUNNING | 4 | |
<a name="anytype-Rpc-Account-Move-Response-Error-Code"></a>
### Rpc.Account.Move.Response.Error.Code

24
go.mod
View file

@ -1,20 +1,20 @@
module github.com/anyproto/anytype-heart
go 1.19
go 1.21
require (
github.com/JohannesKaufmann/html-to-markdown v1.3.7
github.com/PuerkitoBio/goquery v1.8.1
github.com/VividCortex/ewma v1.2.0
github.com/adrium/goheif v0.0.0-20230113233934-ca402e77a786
github.com/anyproto/any-sync v0.2.15
github.com/anyproto/any-sync v0.2.19
github.com/anyproto/go-naturaldate/v2 v2.0.2-0.20230524105841-9829cfd13438
github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de
github.com/blevesearch/bleve/v2 v2.3.9
github.com/chai2010/webp v1.1.1
github.com/cheggaaa/mb v1.0.3
github.com/cheggaaa/mb/v3 v3.0.1
github.com/dave/jennifer v1.6.1
github.com/dave/jennifer v1.7.0
github.com/davecgh/go-spew v1.1.1
github.com/dgraph-io/badger/v3 v3.2103.5
github.com/dgraph-io/ristretto v0.1.1
@ -77,17 +77,17 @@ require (
github.com/stretchr/testify v1.8.4
github.com/textileio/go-ds-badger3 v0.1.0
github.com/uber/jaeger-client-go v2.30.0+incompatible
github.com/vektra/mockery/v2 v2.32.3
github.com/vektra/mockery/v2 v2.32.4
github.com/yuin/goldmark v1.5.5
go.uber.org/mock v0.2.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.25.0
golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1
golang.org/x/image v0.10.0
golang.org/x/image v0.11.0
golang.org/x/mobile v0.0.0-20230531173138-3c911d8e3eda
golang.org/x/net v0.13.0
golang.org/x/oauth2 v0.10.0
golang.org/x/text v0.11.0
golang.org/x/net v0.14.0
golang.org/x/oauth2 v0.11.0
golang.org/x/text v0.12.0
google.golang.org/grpc v1.57.0
gopkg.in/Graylog2/go-gelf.v2 v2.0.0-20180125164251-1832d8546a9f
gopkg.in/yaml.v3 v3.0.1
@ -236,13 +236,15 @@ require (
go.opentelemetry.io/otel v1.14.0 // indirect
go.opentelemetry.io/otel/trace v1.14.0 // indirect
go.uber.org/atomic v1.11.0 // indirect
golang.org/x/crypto v0.11.0 // indirect
golang.org/x/crypto v0.12.0 // indirect
golang.org/x/mod v0.12.0 // indirect
golang.org/x/sync v0.3.0 // indirect
golang.org/x/sys v0.10.0 // indirect
golang.org/x/term v0.10.0 // indirect
golang.org/x/sys v0.11.0 // indirect
golang.org/x/term v0.11.0 // indirect
golang.org/x/tools v0.11.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect
google.golang.org/protobuf v1.31.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect

85
go.sum
View file

@ -74,8 +74,8 @@ github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h
github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY=
github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
github.com/anyproto/any-sync v0.2.15 h1:eaa6duM6FnpTYLVT0NK/2lqKgw4Uns/Dj7lSwbEnHe0=
github.com/anyproto/any-sync v0.2.15/go.mod h1:2nJFL7ANRuGdcgddJqHrj85YrX1mFsIakNfolwk6/oM=
github.com/anyproto/any-sync v0.2.19 h1:OEMQW1LkI1Pr1Wzl2Vdrsw+jS3yKTjpxrO+8OgDW35w=
github.com/anyproto/any-sync v0.2.19/go.mod h1:2nJFL7ANRuGdcgddJqHrj85YrX1mFsIakNfolwk6/oM=
github.com/anyproto/go-chash v0.1.0 h1:I9meTPjXFRfXZHRJzjOHC/XF7Q5vzysKkiT/grsogXY=
github.com/anyproto/go-chash v0.1.0/go.mod h1:0UjNQi3PDazP0fINpFYu6VKhuna+W/V+1vpXHAfNgLY=
github.com/anyproto/go-ds-badger3 v0.3.1-0.20230524095230-434cf6346d9b h1:SMizb43hfILk2bpMgpTd30n6yQQdxW0ZbDti0wqfsBw=
@ -114,6 +114,7 @@ github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuP
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
@ -192,6 +193,7 @@ github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/corona10/goimagehash v1.0.2 h1:pUfB0LnsJASMPGEZLj7tGY251vF+qLGqOgEP4rUs6kA=
github.com/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI=
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
@ -201,14 +203,16 @@ github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0=
github.com/dave/jennifer v1.6.1 h1:T4T/67t6RAA5AIV6+NP8Uk/BIsXgDoqEowgycdQQLuk=
github.com/dave/jennifer v1.6.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc=
github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis=
github.com/dave/jennifer v1.7.0 h1:uRbSBH9UTS64yXbh4FrMHfgfY762RD+C7bUPKODpSJE=
github.com/dave/jennifer v1.7.0/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU=
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U=
github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y=
github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I=
@ -270,13 +274,16 @@ github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byA
github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ=
github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8=
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk=
github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY=
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
@ -325,6 +332,7 @@ github.com/go-shiori/go-readability v0.0.0-20220215145315-dd6828d2f09b/go.mod h1
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo=
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
@ -417,6 +425,7 @@ github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
@ -431,6 +440,7 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA=
github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@ -442,6 +452,7 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c h1:7lF+Vz0LqiRidnzC1Oq86fpX1q/iEv2KJdrCtttYjT4=
github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=
github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=
@ -451,6 +462,7 @@ github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gosimple/slug v1.13.1 h1:bQ+kpX9Qa6tHRaK+fZR0A0M2Kd7Pa5eHPPsb1JpHD+Q=
github.com/gosimple/slug v1.13.1/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ=
github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o=
@ -509,6 +521,7 @@ github.com/huandu/xstrings v1.0.0 h1:pO2K/gKgKaat5LdpAhxhluX2GPQMaI3W5FUz/I/UnWk
github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo=
github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
github.com/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY=
github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8=
github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=
github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
@ -540,9 +553,12 @@ github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46U
github.com/ipfs/go-ds-flatfs v0.5.1 h1:ZCIO/kQOS/PSh3vcF1H6a8fkRGS7pOfwfPdx4n/KJH4=
github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4=
github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ=
github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk=
github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ=
github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE=
github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4=
github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8=
github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ=
github.com/ipfs/go-ipld-format v0.5.0 h1:WyEle9K96MSrvr47zZHKKcDxJ/vlpET6PSiQsAFO+Ds=
@ -555,11 +571,13 @@ github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JP
github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg=
github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY=
github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg=
github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU=
github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6rOcc=
github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s=
github.com/ipld/go-ipld-prime v0.20.0 h1:Ud3VwE9ClxpO2LkCYP7vWPc0Fo+dYdYzgxUJZ3uRG4g=
github.com/ipld/go-ipld-prime v0.20.0/go.mod h1:PzqZ/ZR981eKbgdr3y2DJYeD/8bgMawdGVlJDE8kK+M=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jarcoal/httpmock v1.0.4 h1:jp+dy/+nonJE4g4xbVtl9QdrUNbn6/3hDT5R4nDIZnA=
github.com/jarcoal/httpmock v1.0.4/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik=
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
@ -607,11 +625,13 @@ github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZY
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0=
github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@ -621,15 +641,23 @@ github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgx
github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c=
github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic=
github.com/libp2p/go-libp2p v0.29.0 h1:QduJ2XQr/Crg4EnloueWDL0Jj86N3Ezhyyj7XH+XwHI=
github.com/libp2p/go-libp2p v0.29.0/go.mod h1:iNKL7mEnZ9wAss+03IjAwM9ZAQXfVUAPUUmOACQfQ/g=
github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s=
github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w=
github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0=
github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk=
github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg=
github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0=
github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM=
github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk=
github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk=
github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU=
github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ=
github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ=
github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4=
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8=
@ -706,6 +734,7 @@ github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a
github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A=
github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk=
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo=
github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
@ -735,6 +764,7 @@ github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi
github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 h1:BvoENQQU+fZ9uukda/RzCAL/191HHwJA5b13R6diVlY=
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
@ -744,6 +774,7 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU=
github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
@ -765,6 +796,7 @@ github.com/otiai10/marmoset v0.4.0/go.mod h1:t2q6dXWZ9YcFdRREDApX4bCmfQnL3isJ2dg
github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks=
github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM=
github.com/otiai10/opengraph/v2 v2.1.0 h1:rsrq/Krr4E6IPMPUdJ+pit4mc8ijzH9P7eyfEqvlUBI=
github.com/otiai10/opengraph/v2 v2.1.0/go.mod h1:gHYa6c2GENKqbB7O6Mkqpq2Ma0Nti31xIM/3QHNcD/M=
github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
@ -831,15 +863,21 @@ github.com/pseudomuto/protoc-gen-doc v1.5.1/go.mod h1:XpMKYg6zkcpgfpCfQ8GcWBDRtR
github.com/pseudomuto/protokit v0.2.0 h1:hlnBDcy3YEDXH7kc9gV+NLaN0cDzhDvD1s7Y6FZ8RpM=
github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q=
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U=
github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI=
github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E=
github.com/quic-go/qtls-go1-20 v0.2.2/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM=
github.com/quic-go/quic-go v0.36.2 h1:ZX/UNQ4gvpCv2RmwdbA6lrRjF6EBm5yZ7TMoT4NQVrA=
github.com/quic-go/quic-go v0.36.2/go.mod h1:zPetvwDlILVxt15n3hr3Gf/I3mDf7LpLKPhR4Ez0AZQ=
github.com/quic-go/webtransport-go v0.5.3 h1:5XMlzemqB4qmOlgIus5zB45AcZ2kCgCy2EptUrfOPWU=
github.com/quic-go/webtransport-go v0.5.3/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU=
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
@ -957,9 +995,10 @@ github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLY
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/vektra/mockery/v2 v2.32.3 h1:ugtC6b34me/NenXXNR0Pr8UOKTllYodxyeyq0B/ak98=
github.com/vektra/mockery/v2 v2.32.3/go.mod h1:9lREs4VEeQiUS3rizYQx1saxHu2JiIhThP0q9+fDegM=
github.com/vektra/mockery/v2 v2.32.4 h1:EHvss3EWCXf8BmKw8YZFBtXFSVVusq5n1TiAQg896bM=
github.com/vektra/mockery/v2 v2.32.4/go.mod h1:9lREs4VEeQiUS3rizYQx1saxHu2JiIhThP0q9+fDegM=
github.com/warpfork/go-testmark v0.11.0 h1:J6LnV8KpceDvo7spaNU4+DauH2n1x+6RaO2rJrmpQ9U=
github.com/warpfork/go-testmark v0.11.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0=
github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ=
github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E=
@ -979,6 +1018,7 @@ github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFi
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg=
github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ=
github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs=
@ -1015,6 +1055,7 @@ go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
go.uber.org/mock v0.2.0 h1:TaP3xedm7JaAgScZO7tlvlKrqT0p7I6OsdGB5YNSMDU=
go.uber.org/mock v0.2.0/go.mod h1:J0y0rp9L3xiff1+ZBfKxlC1fz2+aO16tw0tsDOixfuM=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
@ -1045,8 +1086,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@ -1067,8 +1108,8 @@ golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86h
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.10.0 h1:gXjUUtwtx5yOE0VKWq1CH4IJAClq4UGgUA3i+rpON9M=
golang.org/x/image v0.10.0/go.mod h1:jtrku+n79PfroUbvDdeUWMAI+heR786BofxrbiSF+J0=
golang.org/x/image v0.11.0 h1:ds2RoQvBvYTiJkwpSFDwCcDFNX7DqjL2WsUgTNk0Ooo=
golang.org/x/image v0.11.0/go.mod h1:bglhjqbqVuEb9e9+eNR45Jfu7D+T4Qan+NhQk8Ck2P8=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@ -1153,8 +1194,8 @@ golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfS
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.13.0 h1:Nvo8UFsZ8X3BhAC9699Z1j7XQ3rsZnUUm7jfBEk1ueY=
golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@ -1164,8 +1205,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8=
golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI=
golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU=
golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -1257,14 +1298,15 @@ golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c=
golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0=
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@ -1275,8 +1317,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@ -1421,6 +1463,10 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D
google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M=
google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk=
google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ=
google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig=
google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM=
google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA=
google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
@ -1468,6 +1514,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=

File diff suppressed because it is too large Load diff

View file

@ -257,8 +257,7 @@ message Rpc {
}
string storePath = 3; // Path to local storage
int64 icon = 4; // Option of pre-installed icon
string alphaInviteCode = 20; // DEPRECATED
bool disableLocalNetworkSync = 5; // Disable local network discovery
}
/**
@ -363,6 +362,7 @@ message Rpc {
option (no_auth) = true;
string id = 1; // Id of a selected account
string rootPath = 2; // Root path is optional, set if this is a first request
bool disableLocalNetworkSync = 3; // Disable local network discovery
}
/**
@ -548,6 +548,27 @@ message Rpc {
}
}
}
message EnableLocalNetworkSync {
message Request {
}
message Response {
Error error = 2;
message Error {
Code code = 1;
string description = 2;
enum Code {
NULL = 0;
UNKNOWN_ERROR = 1;
BAD_INPUT = 2;
ACCOUNT_IS_NOT_RUNNING = 4;
}
}
}
}
}
message Workspace {

View file

@ -35,6 +35,7 @@ service ClientCommands {
rpc AccountCreate (anytype.Rpc.Account.Create.Request) returns (anytype.Rpc.Account.Create.Response);
rpc AccountDelete (anytype.Rpc.Account.Delete.Request) returns (anytype.Rpc.Account.Delete.Response);
rpc AccountSelect (anytype.Rpc.Account.Select.Request) returns (anytype.Rpc.Account.Select.Response);
rpc AccountEnableLocalNetworkSync (anytype.Rpc.Account.EnableLocalNetworkSync.Request) returns (anytype.Rpc.Account.EnableLocalNetworkSync.Response);
rpc AccountStop (anytype.Rpc.Account.Stop.Request) returns (anytype.Rpc.Account.Stop.Response);
rpc AccountMove (anytype.Rpc.Account.Move.Request) returns (anytype.Rpc.Account.Move.Response);
rpc AccountConfigUpdate (anytype.Rpc.Account.ConfigUpdate.Request) returns (anytype.Rpc.Account.ConfigUpdate.Response);

View file

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

View file

@ -5,6 +5,7 @@ import (
"path/filepath"
"sync"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/anytype-heart/core/wallet"
)
@ -20,10 +21,17 @@ type TempDirService struct {
tempDir string
}
func NewTempDirService(wallet wallet.Wallet) *TempDirService {
return &TempDirService{
wallet: wallet,
}
func NewTempDirService() *TempDirService {
return &TempDirService{}
}
func (s *TempDirService) Init(a *app.App) error {
s.wallet = app.MustComponent[wallet.Wallet](a)
return nil
}
func (s *TempDirService) Name() string {
return "core.tmpdir"
}
func (s *TempDirService) TempDir() string {

File diff suppressed because it is too large Load diff

View file

@ -60,10 +60,8 @@ var (
_ ObjectStore = (*dsObjectStore)(nil)
)
func New(sbtProvider typeprovider.SmartBlockTypeProvider) ObjectStore {
return &dsObjectStore{
sbtProvider: sbtProvider,
}
func New() ObjectStore {
return &dsObjectStore{}
}
type SourceDetailsFromID interface {
@ -71,6 +69,7 @@ type SourceDetailsFromID interface {
}
func (s *dsObjectStore) Init(a *app.App) (err error) {
s.sbtProvider = app.MustComponent[typeprovider.SmartBlockTypeProvider](a)
src := a.Component("source")
if src != nil {
s.sourceService = a.MustComponent("source").(SourceDetailsFromID)

View file

@ -34,6 +34,7 @@ type Notifier interface {
type LocalDiscovery interface {
SetNotifier(Notifier)
Start() error // Start the local discovery. Used when automatic start is disabled.
app.ComponentRunnable
}

View file

@ -14,6 +14,7 @@ import (
"github.com/anyproto/any-sync/accountservice"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/util/periodicsync"
"github.com/anyproto/anytype-heart/core/anytype/config"
"github.com/libp2p/zeroconf/v2"
"go.uber.org/zap"
@ -35,10 +36,12 @@ type localDiscovery struct {
periodicCheck periodicsync.PeriodicSync
drpcServer clientserver.ClientServer
ipv4 []string
ipv6 []string
notifier Notifier
ipv4 []string
ipv6 []string
manualStart bool
started bool
notifier Notifier
m sync.Mutex
}
func New() LocalDiscovery {
@ -50,6 +53,7 @@ func (l *localDiscovery) SetNotifier(notifier Notifier) {
}
func (l *localDiscovery) Init(a *app.App) (err error) {
l.manualStart = a.MustComponent(config.CName).(*config.Config).DontStartLocalNetworkSyncAutomatically
l.peerId = a.MustComponent(accountservice.CName).(accountservice.Service).Account().PeerId
l.periodicCheck = periodicsync.NewPeriodicSync(30, 0, l.checkAddrs, log)
l.drpcServer = a.MustComponent(clientserver.CName).(clientserver.ClientServer)
@ -57,9 +61,25 @@ func (l *localDiscovery) Init(a *app.App) (err error) {
}
func (l *localDiscovery) Run(ctx context.Context) (err error) {
if l.manualStart {
// let's wait for the explicit command to enable local discovery
return
}
return l.Start()
}
func (l *localDiscovery) Start() (err error) {
if !l.drpcServer.ServerStarted() {
return
}
l.m.Lock()
defer l.m.Unlock()
if l.started {
return
}
l.started = true
l.port = l.drpcServer.Port()
l.periodicCheck.Run()
return
@ -73,6 +93,13 @@ func (l *localDiscovery) Close(ctx context.Context) (err error) {
if !l.drpcServer.ServerStarted() {
return
}
l.m.Lock()
if !l.started {
l.m.Unlock()
return
}
l.m.Unlock()
l.periodicCheck.Close()
l.cancel()
if l.server != nil {

View file

@ -10,6 +10,7 @@ import (
"github.com/anyproto/any-sync/app"
"go.uber.org/zap"
"github.com/anyproto/anytype-heart/core/anytype/config"
"github.com/anyproto/anytype-heart/net/addrs"
"github.com/anyproto/anytype-heart/space/clientserver"
)
@ -39,8 +40,10 @@ type localDiscovery struct {
peerId string
port int
notifier Notifier
drpcServer clientserver.ClientServer
notifier Notifier
drpcServer clientserver.ClientServer
manualStart bool
m sync.Mutex
}
func (l *localDiscovery) PeerDiscovered(peer DiscoveredPeer, own OwnAddresses) {
@ -79,10 +82,23 @@ func (l *localDiscovery) SetNotifier(notifier Notifier) {
func (l *localDiscovery) Init(a *app.App) (err error) {
l.peerId = a.MustComponent(accountservice.CName).(accountservice.Service).Account().PeerId
l.drpcServer = a.MustComponent(clientserver.CName).(clientserver.ClientServer)
l.manualStart = a.MustComponent(config.CName).(*config.Config).DontStartLocalNetworkSyncAutomatically
return
}
func (l *localDiscovery) Run(ctx context.Context) (err error) {
if l.manualStart {
// let's wait for the explicit command to enable local discovery
return
}
return l.Start()
}
func (l *localDiscovery) Start() (err error) {
l.m.Lock()
defer l.m.Unlock()
if !l.drpcServer.ServerStarted() {
return
}

View file

@ -11,14 +11,12 @@ import (
commonspace "github.com/anyproto/any-sync/commonspace"
headsync "github.com/anyproto/any-sync/commonspace/headsync"
list "github.com/anyproto/any-sync/commonspace/object/acl/list"
treechangeproto "github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
objectsync "github.com/anyproto/any-sync/commonspace/objectsync"
objecttreebuilder "github.com/anyproto/any-sync/commonspace/objecttreebuilder"
spacestorage "github.com/anyproto/any-sync/commonspace/spacestorage"
spacesyncproto "github.com/anyproto/any-sync/commonspace/spacesyncproto"
syncstatus "github.com/anyproto/any-sync/commonspace/syncstatus"
peer "github.com/anyproto/any-sync/net/peer"
gomock "go.uber.org/mock/gomock"
)
@ -45,20 +43,6 @@ func (m *MockSpace) EXPECT() *MockSpaceMockRecorder {
return m.recorder
}
// Acl mocks base method.
func (m *MockSpace) Acl() list.AclList {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Acl")
ret0, _ := ret[0].(list.AclList)
return ret0
}
// Acl indicates an expected call of Acl.
func (mr *MockSpaceMockRecorder) Acl() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Acl", reflect.TypeOf((*MockSpace)(nil).Acl))
}
// Close mocks base method.
func (m *MockSpace) Close() error {
m.ctrl.T.Helper()
@ -130,21 +114,6 @@ func (mr *MockSpaceMockRecorder) Description() *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Description", reflect.TypeOf((*MockSpace)(nil).Description))
}
// GetNodePeers mocks base method.
func (m *MockSpace) GetNodePeers(arg0 context.Context) ([]peer.Peer, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetNodePeers", arg0)
ret0, _ := ret[0].([]peer.Peer)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetNodePeers indicates an expected call of GetNodePeers.
func (mr *MockSpaceMockRecorder) GetNodePeers(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNodePeers", reflect.TypeOf((*MockSpace)(nil).GetNodePeers), arg0)
}
// HandleMessage mocks base method.
func (m *MockSpace) HandleMessage(arg0 context.Context, arg1 objectsync.HandleMessage) error {
m.ctrl.T.Helper()

View file

@ -16,16 +16,6 @@ type rpcHandler struct {
s *service
}
// nolint:revive
func (r *rpcHandler) AclAddRecord(_ context.Context, _ *spacesyncproto.AclAddRecordRequest) (*spacesyncproto.AclAddRecordResponse, error) {
return nil, fmt.Errorf("should not be called")
}
// nolint:revive
func (r *rpcHandler) AclGetRecords(_ context.Context, _ *spacesyncproto.AclGetRecordsRequest) (*spacesyncproto.AclGetRecordsResponse, error) {
return nil, fmt.Errorf("should not be called")
}
func (r *rpcHandler) ObjectSync(ctx context.Context, req *spacesyncproto.ObjectSyncMessage) (resp *spacesyncproto.ObjectSyncMessage, err error) {
sp, err := r.s.GetSpace(ctx, req.SpaceId)
if err != nil {

View file

@ -1,4 +1,4 @@
// Code generated by mockery v2.30.16. DO NOT EDIT.
// Code generated by mockery v2.26.1. DO NOT EDIT.
package mock_typeprovider
@ -191,12 +191,13 @@ func (_c *MockSmartBlockTypeProvider_Type_Call) RunAndReturn(run func(string) (s
return _c
}
// NewMockSmartBlockTypeProvider creates a new instance of MockSmartBlockTypeProvider. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockSmartBlockTypeProvider(t interface {
type mockConstructorTestingTNewMockSmartBlockTypeProvider interface {
mock.TestingT
Cleanup(func())
}) *MockSmartBlockTypeProvider {
}
// NewMockSmartBlockTypeProvider creates a new instance of MockSmartBlockTypeProvider. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
func NewMockSmartBlockTypeProvider(t mockConstructorTestingTNewMockSmartBlockTypeProvider) *MockSmartBlockTypeProvider {
mock := &MockSmartBlockTypeProvider{}
mock.Mock.Test(t)

View file

@ -41,14 +41,13 @@ type provider struct {
cache map[string]smartblock.SmartBlockType
}
func New(spaceService space.Service) SmartBlockTypeProvider {
return &provider{
spaceService: spaceService,
}
func New() SmartBlockTypeProvider {
return &provider{}
}
func (p *provider) Init(a *app.App) (err error) {
p.cache = map[string]smartblock.SmartBlockType{}
p.spaceService = app.MustComponent[space.Service](a)
return
}

View file

@ -159,9 +159,8 @@ func (s *testSession) accountCreate(t *testing.T) string {
cctx, events := s.openClientSession(t, mnemonic)
acc := call(cctx, s.AccountCreate, &pb.RpcAccountCreateRequest{
Name: "John Doe",
AlphaInviteCode: "elbrus",
StorePath: rootPath,
Name: "John Doe",
StorePath: rootPath,
})
require.NotNil(t, acc.Account)

View file

@ -74,11 +74,11 @@ type builtinObjects struct {
coreService core.Service
importer importer.Importer
store objectstore.ObjectStore
tempDirService *core.TempDirService
tempDirService core.TempDirProvider
}
func New(tempDirService *core.TempDirService) BuiltinObjects {
return &builtinObjects{tempDirService: tempDirService}
func New() BuiltinObjects {
return &builtinObjects{}
}
func (b *builtinObjects) Init(a *app.App) (err error) {
@ -86,6 +86,7 @@ func (b *builtinObjects) Init(a *app.App) (err error) {
b.coreService = a.MustComponent(core.CName).(core.Service)
b.importer = a.MustComponent(importer.CName).(importer.Importer)
b.store = app.MustComponent[objectstore.ObjectStore](a)
b.tempDirService = app.MustComponent[core.TempDirProvider](a)
return
}

Binary file not shown.

View file

@ -51,8 +51,13 @@ type unsplashService struct {
tempDirProvider core.TempDirProvider
}
func (l *unsplashService) Init(app *app.App) (err error) {
func New() Unsplash {
return &unsplashService{}
}
func (l *unsplashService) Init(a *app.App) (err error) {
l.cache = ocache.New(l.search, ocache.WithTTL(cacheTTL), ocache.WithGCPeriod(cacheGCPeriod))
l.tempDirProvider = app.MustComponent[core.TempDirProvider](a)
return
}
@ -60,10 +65,6 @@ func (l *unsplashService) Name() (name string) {
return CName
}
func New(tempDirProvider core.TempDirProvider) Unsplash {
return &unsplashService{tempDirProvider: tempDirProvider}
}
type Result struct {
ID string
Description string